Browse Source

[이벤트][New] 제휴 이벤트 링크 이동 및 공유하기

hyodong.min 6 years ago
parent
commit
a6c3ade927

+ 5 - 0
app/src/main/AndroidManifest.xml

@@ -136,6 +136,11 @@
       android:screenOrientation="portrait"
       android:windowSoftInputMode="adjustResize">
     </activity>
+    <activity
+      android:name=".lifeplus.activity.WebFromEventActivity"
+      android:screenOrientation="portrait"
+      android:windowSoftInputMode="adjustResize">
+    </activity>
     <activity
       android:name=".lifeplus.activity.BucketListActivity"
       android:screenOrientation="portrait"

+ 1 - 1
app/src/main/java/kr/co/zumo/app/lifeplus/activity/WebFromContentsActivity.java

@@ -8,7 +8,7 @@ import kr.co.zumo.app.lifeplus.supervisor.ActivityDeliveryHelper;
 import kr.co.zumo.app.lifeplus.supervisor.ScreenID;
 
 /**
- * FAQActivity
+ * WebFromContentsActivity
  * <pre>
  * </pre>
  *

+ 41 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/activity/WebFromEventActivity.java

@@ -0,0 +1,41 @@
+package kr.co.zumo.app.lifeplus.activity;
+
+import android.content.Intent;
+
+import kr.co.zumo.app.lifeplus.helper.DeliveryHelper;
+import kr.co.zumo.app.lifeplus.supervisor.ActivityDeliveryHelper;
+import kr.co.zumo.app.lifeplus.supervisor.ScreenID;
+
+/**
+ * WebFromEventActivity
+ * <pre>
+ * </pre>
+ *
+ * @author 하세미
+ * @version 1.0
+ * @history 하세미   [2018-12-10]   [최초 작성]
+ * @since 2018-12-10
+ */
+public class WebFromEventActivity extends ActivityBaseScreen {
+
+  @Override
+  protected void render() {
+    ActivityDeliveryHelper.getInstance().shipTo(getHelper(DeliveryHelper.class));
+    launchScreen(ScreenID.WEB_FROM_EVENT);
+  }
+
+  @Override
+  protected void onAfterDestroy() {
+
+  }
+
+  @Override
+  protected void onBeforeDestroy() {
+
+  }
+
+  @Override
+  protected void onAfterNewIntent(Intent intent) {
+
+  }
+}

+ 35 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/bean/EventWebDeliveryBean.java

@@ -0,0 +1,35 @@
+/*
+ * COPYRIGHT (c) 2018 All rights reserved by HANWHA LIFE.
+ */
+package kr.co.zumo.app.lifeplus.bean;
+
+import kr.co.zumo.app.lifeplus.bean.api.EventDetailBean;
+
+/**
+ * EventWebDeliveryBean
+ * <pre>
+ * </pre>
+ *
+ * @author 민효동
+ * @version 1.0
+ * @history 민효동   [2018. 12. 21.]   [최초 작성]
+ * @since 2018. 12. 21.
+ */
+public class EventWebDeliveryBean extends JsonBeanBase {
+
+  private final EventDetailBean eventDetailBean;
+  private final String webUrl;
+
+  public EventWebDeliveryBean(EventDetailBean eventDetailBean, String webUrl) {
+    this.eventDetailBean = eventDetailBean;
+    this.webUrl = webUrl;
+  }
+
+  public String getWebUrl() {
+    return webUrl;
+  }
+
+  public EventDetailBean getEventDetailBean() {
+    return eventDetailBean;
+  }
+}

+ 1 - 1
app/src/main/java/kr/co/zumo/app/lifeplus/bean/api/EventDetailBean.java

@@ -33,7 +33,7 @@ public class EventDetailBean extends EventBean {
   @SerializedName("btnNm")
   private String buttonName;
   @SerializedName("btnLinkDvcd")
-  private String buttonLinkType;  // 버튼 링크 구분 01:URL입력, 02:설문생성
+  private String buttonLinkType;  // 버튼 링크 구분 01:URL입력(제휴이벤트), 02:설문생성
   @SerializedName("btnLinkUrl")
   private String buttonLinkUrl;  // 버튼 링크 url
   @SerializedName("ptcpPossYn")

+ 2 - 1
app/src/main/java/kr/co/zumo/app/lifeplus/supervisor/ScreenID.java

@@ -116,6 +116,7 @@ public class ScreenID {
   public static final int EVENT_RECOMMEND_TAG = 1095;
   public static final int EVENT_RECORD = 96;
   public static final int WEB_PURCHASE = 97;
+  public static final int WEB_FROM_EVENT = 98;
 
   @Retention(RetentionPolicy.SOURCE)
   @IntDef({BACK, MAIN, SETTING, FAQ, NETWORK_ERROR, PIN, PIN_RESET, SIGN_UP_START_FROM_ZUMO, ON_BOARDING, PERMISSION_INFO,
@@ -129,7 +130,7 @@ public class ScreenID {
     NETWORK_ERROR_STARTING, OVER_VIEW, ACTIVITY, SERIES, SIGN_UP_START_FROM_ZUMO_ON_BOARDING, WEB_FROM_CONTENTS, BUCKET_ACTIVITY, MAP, MY_EVENT, EVENT_WINNER,
     EVENT_DETAIL, SEARCH, EVENT_QUESTION, SYSTEM_CHECK, UTILITY_ACTIVITY, SEARCH_RESULT, MY_COIN_DETAIL_GUEST, PIN_RESET_AUTH_FROM_MULTI_DEVICE, PIN_RESET_INPUT_FROM_MULTI_DEVICE,
     PIN_RESET_AUTH_FROM_MEMBER_BLOCK, /*PIN_RESET_INPUT_FROM_MEMBER_BLOCK,*/ MEMBER_UNLOCK, EVENT_DETAIL_ENTRY, EVENT_DETAIL_SELECT, EVENT_RECOMMEND, EVENT_RECOMMEND_BASIC, EVENT_RECOMMEND_TAG,
-    EVENT_RECORD, WEB_PURCHASE
+    EVENT_RECORD, WEB_PURCHASE, WEB_FROM_EVENT
   })
   public @interface ID {}
 

+ 9 - 3
app/src/main/java/kr/co/zumo/app/lifeplus/supervisor/screen/ActivityScreen.java

@@ -7,15 +7,17 @@ import android.content.Intent;
 import android.util.Log;
 
 import kr.co.zumo.app.lifeplus.activity.ActivityBase;
+import kr.co.zumo.app.lifeplus.activity.AuthResetActivity;
 import kr.co.zumo.app.lifeplus.activity.BucketListActivity;
 import kr.co.zumo.app.lifeplus.activity.CategoryActivity;
 import kr.co.zumo.app.lifeplus.activity.ContentsActivity;
 import kr.co.zumo.app.lifeplus.activity.ContentsOverviewActivity;
 import kr.co.zumo.app.lifeplus.activity.CoopActivity;
-import kr.co.zumo.app.lifeplus.activity.EventListActivity;
 import kr.co.zumo.app.lifeplus.activity.EventDetailActivity;
+import kr.co.zumo.app.lifeplus.activity.EventListActivity;
 import kr.co.zumo.app.lifeplus.activity.EventParticipationActivity;
 import kr.co.zumo.app.lifeplus.activity.EventRecommendActivity;
+import kr.co.zumo.app.lifeplus.activity.EventWinnerActivity;
 import kr.co.zumo.app.lifeplus.activity.FAQActivity;
 import kr.co.zumo.app.lifeplus.activity.IntroductionActivity;
 import kr.co.zumo.app.lifeplus.activity.MapActivity;
@@ -24,7 +26,6 @@ import kr.co.zumo.app.lifeplus.activity.MyCoinActivity;
 import kr.co.zumo.app.lifeplus.activity.MyEventActivity;
 import kr.co.zumo.app.lifeplus.activity.MyMainActivity;
 import kr.co.zumo.app.lifeplus.activity.NotiActivity;
-import kr.co.zumo.app.lifeplus.activity.AuthResetActivity;
 import kr.co.zumo.app.lifeplus.activity.SearchActivity;
 import kr.co.zumo.app.lifeplus.activity.SearchResultActivity;
 import kr.co.zumo.app.lifeplus.activity.SeriesActivity;
@@ -32,7 +33,7 @@ import kr.co.zumo.app.lifeplus.activity.SignUpActivity;
 import kr.co.zumo.app.lifeplus.activity.SystemCheckActivity;
 import kr.co.zumo.app.lifeplus.activity.UtilityActivity;
 import kr.co.zumo.app.lifeplus.activity.WebFromContentsActivity;
-import kr.co.zumo.app.lifeplus.activity.EventWinnerActivity;
+import kr.co.zumo.app.lifeplus.activity.WebFromEventActivity;
 import kr.co.zumo.app.lifeplus.bean.CategoryDeliveryBean;
 import kr.co.zumo.app.lifeplus.helper.DeliveryHelper;
 import kr.co.zumo.app.lifeplus.helper.ScreenManagerHelper;
@@ -159,6 +160,11 @@ public class ActivityScreen extends Screen {
         shipToActivity();
         break;
 
+      case ScreenID.WEB_FROM_EVENT:
+        intent = new Intent(activity, WebFromEventActivity.class);
+        shipToActivity();
+        break;
+
       case ScreenID.SIGN_UP_START:
         intent = new Intent(activity, SignUpActivity.class);
         if (helper.getModel().isUpdateUser()) {

+ 3 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/supervisor/screen/ScreenManager.java

@@ -58,6 +58,9 @@ public class ScreenManager implements IScreen {
         case ScreenID.WEB_FROM_CONTENTS:
           screen = new ActivityScreen(helper, id, direction, method);
           break;
+        case ScreenID.WEB_FROM_EVENT:
+          screen = new ActivityScreen(helper, id, direction, method);
+          break;
         case ScreenID.MAP:
           screen = new ActivityScreen(helper, id, direction, method);
           break;

+ 9 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/event/entry/EventDetailEntryModel.java

@@ -3,6 +3,7 @@ package kr.co.zumo.app.lifeplus.view.screen.event.entry;
 import java.util.ArrayList;
 import java.util.List;
 
+import kr.co.zumo.app.lifeplus.bean.api.EventDetailBean;
 import kr.co.zumo.app.lifeplus.bean.api.EventImageBean;
 import kr.co.zumo.app.lifeplus.bean.api.EventPageBean;
 import kr.co.zumo.app.lifeplus.view.screen.event.EventDetailModel;
@@ -79,4 +80,12 @@ public class EventDetailEntryModel extends EventDetailModel {
     }
   }
 
+  /**
+   * 링크 타입의 버튼인지 확인 (제휴 이벤트)
+   *
+   * @return
+   */
+  public boolean isLinkButton() {
+    return EventDetailBean.BUTTON_LINK_URL.equals(eventDetailBean.getButtonLinkType());
+  }
 }

+ 18 - 9
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/event/entry/EventDetailEntryPresenter.java

@@ -4,6 +4,7 @@ import android.util.Log;
 
 import kr.co.zumo.app.R;
 import kr.co.zumo.app.lifeplus.bean.EventDeliveryBean;
+import kr.co.zumo.app.lifeplus.bean.EventWebDeliveryBean;
 import kr.co.zumo.app.lifeplus.bean.api.EventDetailBean;
 import kr.co.zumo.app.lifeplus.helper.NavigationBar;
 import kr.co.zumo.app.lifeplus.supervisor.ScreenID;
@@ -110,19 +111,27 @@ public class EventDetailEntryPresenter extends EventDetailPresenter<EventDetailE
       //참여하기 클릭
       case Event.ENTRY:
         if (model.isActiveMember()) {
-          if (model.isAvailableParticipation()) {
-            model.setDeliveryPackaging(model.getEventDetailBean());
-            go(ScreenID.EVENT_QUESTION);
+          // 제휴이벤트
+          if (model.isLinkButton()) {
+            EventWebDeliveryBean eventWebDeliveryBean = new EventWebDeliveryBean(model.getEventDetailBean(), model.getEventDetailBean().getButtonLinkUrl());
+            model.setDeliveryPackaging(eventWebDeliveryBean);
+            go(ScreenID.WEB_FROM_EVENT);
           }
           else {
-            String limit = model.getEventDetailBean().getEventLimit();
-            if (EventDetailBean.LIMIT_ONE_A_DAY.equals(limit)) {
-              // 하루 제한
-              showErrorDialog(R.string.event_limit_a_day);
+            if (model.isAvailableParticipation()) {
+              model.setDeliveryPackaging(model.getEventDetailBean());
+              go(ScreenID.EVENT_QUESTION);
             }
             else {
-              // 1회 제한
-              showErrorDialog(R.string.event_limit_a_time);
+              String limit = model.getEventDetailBean().getEventLimit();
+              if (EventDetailBean.LIMIT_ONE_A_DAY.equals(limit)) {
+                // 하루 제한
+                showErrorDialog(R.string.event_limit_a_day);
+              }
+              else {
+                // 1회 제한
+                showErrorDialog(R.string.event_limit_a_time);
+              }
             }
           }
         }

+ 4 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/factory/BasicFragmentFactory.java

@@ -88,6 +88,7 @@ import kr.co.zumo.app.lifeplus.view.screen.signup.SignUpStartZumoFragment;
 import kr.co.zumo.app.lifeplus.view.screen.signup.SignUpStartZumoOnBoardingFragment;
 import kr.co.zumo.app.lifeplus.view.screen.signup.SignUpUnder14YearsFragment;
 import kr.co.zumo.app.lifeplus.view.screen.web.WebFromContentsFragment;
+import kr.co.zumo.app.lifeplus.view.screen.web.WebFromEventFragment;
 import kr.co.zumo.app.lifeplus.view.screen.web.WebPurchaseFragment;
 
 /**
@@ -330,6 +331,9 @@ public class BasicFragmentFactory extends FragmentFactory {
       case ScreenID.WEB_PURCHASE:
         fragment = new WebPurchaseFragment();
         break;
+      case ScreenID.WEB_FROM_EVENT:
+        fragment = new WebFromEventFragment();
+        break;
 
       // event
       case ScreenID.EVENT_LIST:

+ 183 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/web/WebFromEventFragment.java

@@ -0,0 +1,183 @@
+/*
+ * COPYRIGHT (c) 2018 All rights reserved by HANWHA LIFE.
+ */
+package kr.co.zumo.app.lifeplus.view.screen.web;
+
+import android.annotation.SuppressLint;
+import android.net.http.SslError;
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.webkit.SslErrorHandler;
+import android.webkit.WebChromeClient;
+import android.webkit.WebSettings;
+import android.webkit.WebView;
+import android.webkit.WebViewClient;
+import android.widget.ImageView;
+
+import kr.co.zumo.app.R;
+import kr.co.zumo.app.lifeplus.helper.ActionBarHelper;
+import kr.co.zumo.app.lifeplus.util.StringUtil;
+import kr.co.zumo.app.lifeplus.view.Event;
+import kr.co.zumo.app.lifeplus.view.WebConstant;
+import kr.co.zumo.app.lifeplus.view.screen.FragmentBase;
+
+/**
+ * WebFromEventFragment
+ * <pre>
+ * </pre>
+ *
+ * @author 민효동
+ * @version 1.0
+ * @history 민효동   [2018. 12. 14.]   [최초 작성]
+ * @since 2018. 12. 14.
+ */
+public class WebFromEventFragment extends FragmentBase<WebFromEventPresenter> implements IWebFromContentsView {
+
+  private WebView webView;
+  private ImageView imageViewPrev;
+  private ImageView imageViewNext;
+  private View shareView;
+
+  @Override
+  protected View onAfterCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+    return inflater.inflate(R.layout.fragment_web, container, false);
+  }
+
+  @SuppressLint("JavascriptInterface")
+  @Override
+  protected void onAfterActivityCreated(Bundle savedInstanceState) {
+    webView = findViewById(R.id.web_view);
+    webView.setWebViewClient(new WebViewClient() {
+      @Override
+      public boolean shouldOverrideUrlLoading(WebView view, String url) {
+        view.loadUrl(url);
+        return true;
+      }
+
+      @Override
+      public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
+        Log.w("APP# CouponMallFragment | onReceivedSslError", "|" + "message: " + error.toString());
+        handler.proceed();
+      }
+
+      @Override
+      public void onPageFinished(WebView view, String url) {
+        if (null != presenter) {
+          presenter.onEvent(new Event.Builder(Event.COMPLETED).build());
+        }
+
+      }
+
+      @Override
+      public void onLoadResource(WebView view, String url) {
+        imageViewPrev.setImageResource(webView.canGoBack() ? R.drawable.icon_bottom_prev : R.drawable.icon_bottom_prev_off);
+        imageViewNext.setImageResource(webView.canGoForward() ? R.drawable.icon_bottom_next : R.drawable.icon_bottom_next_off);
+      }
+    });
+
+    webView.setWebChromeClient(new WebChromeClient());
+
+    init(webView);
+
+    webView.addJavascriptInterface(this, WebConstant.OBJECT_ID);
+
+    imageViewPrev = findViewById(R.id.image_view_prev);
+    imageViewNext = findViewById(R.id.image_view_next);
+
+    findViewById(R.id.image_view_prev).setOnClickListener(view -> {presenter.onEvent(new Event.Builder(Event.PREV).build());});
+    imageViewNext.setOnClickListener(view -> {presenter.onEvent(new Event.Builder(Event.NEXT).build());});
+    findViewById(R.id.image_view_refresh).setOnClickListener(view -> {presenter.onEvent(new Event.Builder(Event.REFRESH).build());});
+    shareView = findViewById(R.id.image_view_share);
+    shareView.setOnClickListener(view -> {presenter.onEvent(new Event.Builder(Event.SHARE).build());});
+  }
+
+  private void init(WebView webView) {
+    WebSettings settings = webView.getSettings();
+    // Javascript 사용하기
+    settings.setJavaScriptEnabled(true);
+    // WebView 내장 줌 사용여부
+    settings.setBuiltInZoomControls(false);
+    // 화면에 맞게 WebView 사이즈를 정의
+    settings.setLoadWithOverviewMode(true);
+    // ViewPort meta tag를 활성화 여부
+    settings.setUseWideViewPort(true);
+    // 줌 컨트롤 사용 여부
+    settings.setDisplayZoomControls(false);
+    // 사용자 제스처를 통한 줌 기능 활성화 여부
+    settings.setSupportZoom(false);
+    // TextEncoding 이름 정의
+    settings.setDefaultTextEncodingName("UTF-8");
+
+    // Setting Local Storage
+    settings.setDatabaseEnabled(true);
+    settings.setDomStorageEnabled(true);
+
+    // 캐쉬 사용 방법을 정의
+    settings.setCacheMode(WebSettings.LOAD_NO_CACHE);
+  }
+
+  @Override
+  protected void defineActionBar(ActionBarHelper actionBarHelper) {
+    actionBarHelper.begin()
+      .title(R.string.lifeplus_app)
+      .close(navigationBar -> presenter.onNavigationClickClose(navigationBar))
+      .show();
+
+  }
+
+  @Override
+  protected WebFromEventPresenter definePresenter() {
+    return new WebFromEventPresenter(getModel(WebFromEventModel.class), this);
+  }
+
+  @Override
+  protected void onAfterDestroyView() {
+    webView.stopLoading();
+  }
+
+  @Override
+  protected void onAfterDestroy() {
+
+  }
+
+  @Override
+  protected boolean isSkipScreenWhenBack() {
+    return false;
+  }
+
+  @Override
+  public void loadUrl(String url) {
+    if (null != webView && StringUtil.isFull(url)) {
+      webView.loadUrl(url);
+    }
+  }
+
+  @Override
+  public void onClickRefresh() {
+    webView.reload();
+  }
+
+  @Override
+  public void onClickPrev() {
+    if (webView.canGoBack()) {
+      webView.goBack();
+    }
+  }
+
+  @Override
+  public void onClickNext() {
+    if (webView.canGoForward()) {
+      webView.goForward();
+    }
+  }
+
+  @Override
+  public void setVisibleShare(boolean isVisible) {
+    shareView.setVisibility(isVisible ? View.VISIBLE : View.GONE);
+  }
+}

+ 109 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/web/WebFromEventModel.java

@@ -0,0 +1,109 @@
+/*
+ * COPYRIGHT (c) 2018 All rights reserved by HANWHA LIFE.
+ */
+package kr.co.zumo.app.lifeplus.view.screen.web;
+
+import android.util.Log;
+
+import io.reactivex.disposables.Disposable;
+import kr.co.zumo.app.lifeplus.bean.api.EventDetailBean;
+import kr.co.zumo.app.lifeplus.bean.api.ShareCoinRequestBean;
+import kr.co.zumo.app.lifeplus.bean.api.ShareCoinResultBean;
+import kr.co.zumo.app.lifeplus.model.CoinModel;
+import kr.co.zumo.app.lifeplus.model.module.APIError;
+import kr.co.zumo.app.lifeplus.model.module.APIModuleListener;
+import kr.co.zumo.app.lifeplus.model.module.APIShareCoinModule;
+import kr.co.zumo.app.lifeplus.model.module.IAPIModuleListener;
+import kr.co.zumo.app.lifeplus.tool.Share;
+
+/**
+ * WebFromEventModel
+ * <pre>
+ * </pre>
+ *
+ * @author 민효동
+ * @version 1.0
+ * @history 민효동   [2018. 12. 14.]   [최초 작성]
+ * @since 2018. 12. 14.
+ */
+public class WebFromEventModel extends CoinModel {
+
+  private String url;
+
+  private EventDetailBean deliveredEventDetailBean;
+  private Disposable disposableGivenCoin;
+
+  @Override
+  protected void createViewInternal() {
+
+  }
+
+  @Override
+  protected void destroyInternal() {
+
+  }
+
+  @Override
+  protected void destroyViewInternal() {
+
+  }
+
+  @Override
+  protected void startInternal() {
+
+  }
+
+  @Override
+  protected void stopInternal() {
+
+  }
+
+  @Override
+  protected void resumeInternal() {
+
+  }
+
+  @Override
+  protected void pauseInternal() {
+
+  }
+
+  public void setUrl(String url) {
+    this.url = url;
+  }
+
+  public String getUrl() {
+    return url;
+  }
+
+  public EventDetailBean getDeliveredEventDetailBean() {
+    return deliveredEventDetailBean;
+  }
+
+  public void setDeliveredEventDetailBean(EventDetailBean deliveredEventDetailBean) {
+    this.deliveredEventDetailBean = deliveredEventDetailBean;
+  }
+
+  public void loadShareCoin(@Share.Type String type, IAPIModuleListener<ShareCoinResultBean> listener) {
+    ShareCoinRequestBean requestBean = new ShareCoinRequestBean();
+    requestBean.setItemNo(getDeliveredEventDetailBean().getItemNo());
+    requestBean.setListItemNo(getDeliveredEventDetailBean().getItemNo());
+    requestBean.setShareType(type);
+    disposableGivenCoin = new APIShareCoinModule().call(requestBean, new APIModuleListener<ShareCoinResultBean>() {
+      @Override
+      public void onApiSuccess(ShareCoinResultBean resultBean) {
+        if (null != resultBean.getData() && resultBean.getData().getIntCoin() > 0) {
+          setGivenCoin(resultBean.getData().getIntCoin());
+          Log.i("APP# WebFromEventModel | onApiSuccess", "|" + " givenCoin: " + getGivenCoin());
+          listener.onApiSuccess(resultBean);
+        }
+      }
+
+      @Override
+      public void onApiError(String errorMessage, APIError error) {
+        listener.onApiError(errorMessage, error);
+      }
+    });
+  }
+
+}

+ 318 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/web/WebFromEventPresenter.java

@@ -0,0 +1,318 @@
+/*
+ * COPYRIGHT (c) 2018 All rights reserved by HANWHA LIFE.
+ */
+package kr.co.zumo.app.lifeplus.view.screen.web;
+
+import android.support.annotation.Nullable;
+import android.util.Log;
+
+import kr.co.zumo.app.R;
+import kr.co.zumo.app.lifeplus.bean.EventWebDeliveryBean;
+import kr.co.zumo.app.lifeplus.bean.api.ShareCoinResultBean;
+import kr.co.zumo.app.lifeplus.helper.FacebookHelper;
+import kr.co.zumo.app.lifeplus.helper.NavigationBar;
+import kr.co.zumo.app.lifeplus.model.module.APIError;
+import kr.co.zumo.app.lifeplus.model.module.APIModuleListener;
+import kr.co.zumo.app.lifeplus.tool.IShareListener;
+import kr.co.zumo.app.lifeplus.tool.Share;
+import kr.co.zumo.app.lifeplus.tool.ShareClipBoard;
+import kr.co.zumo.app.lifeplus.tool.ShareEmail;
+import kr.co.zumo.app.lifeplus.tool.ShareFacebook;
+import kr.co.zumo.app.lifeplus.tool.ShareKakaoTalk;
+import kr.co.zumo.app.lifeplus.util.ResourceUtil;
+import kr.co.zumo.app.lifeplus.view.DoubleChecker;
+import kr.co.zumo.app.lifeplus.view.Event;
+import kr.co.zumo.app.lifeplus.view.ToastProvider;
+import kr.co.zumo.app.lifeplus.view.command.EmailSendingCommand;
+import kr.co.zumo.app.lifeplus.view.dialog.DialogBuilder;
+import kr.co.zumo.app.lifeplus.view.dialog.DialogID;
+import kr.co.zumo.app.lifeplus.view.dialog.ICustomDialogListener;
+import kr.co.zumo.app.lifeplus.view.dialog.ShareDialog;
+import kr.co.zumo.app.lifeplus.view.presenter.Presenter;
+import kr.co.zumo.app.lifeplus.view.screen.common.CoinPopupDriver;
+
+/**
+ * WebFromContentsPresenter
+ * <pre>
+ * </pre>
+ *
+ * @author 민효동
+ * @version 1.0
+ * @history 민효동   [2018. 12. 14.]   [최초 작성]
+ * @since 2018. 12. 14.
+ */
+public class WebFromEventPresenter extends Presenter<WebFromEventModel, IWebFromContentsView> {
+
+  public WebFromEventPresenter(WebFromEventModel model, IWebFromContentsView view) {
+    super(model, view);
+
+    EventWebDeliveryBean targetUrl = model.getDeliveryPackaging(EventWebDeliveryBean.class);
+    model.setUrl(targetUrl.getWebUrl());
+    model.setDeliveredEventDetailBean(targetUrl.getEventDetailBean());
+  }
+
+  @Override
+  protected void createViewInternal() {
+
+  }
+
+  @Override
+  protected void destroyInternal() {
+
+  }
+
+  @Override
+  protected void destroyViewInternal() {
+
+  }
+
+  @Override
+  protected void startInternal() {
+
+  }
+
+  @Override
+  protected void startInternalOnce() {
+
+  }
+
+  @Override
+  protected void stopInternal() {
+
+  }
+
+  @Override
+  protected void resumeInternal() {
+    // 코인 표시가 필요할 경우
+    if (null != coinChecker) {
+      coinChecker.checkSecond();
+    }
+  }
+
+  @Override
+  protected void pauseInternal() {
+
+  }
+
+  @Override
+  protected void onEventInternal(Event event) {
+    switch (event.getEventId()) {
+      case Event.PREV:
+        view.onClickPrev();
+        break;
+      case Event.NEXT:
+        view.onClickNext();
+        break;
+      case Event.REFRESH:
+        view.onClickRefresh();
+        break;
+      case Event.SHARE:
+        showShareDialog();
+        break;
+      case Event.COMPLETED:
+        hideWaiter();
+        break;
+      default:
+        break;
+    }
+
+  }
+
+  @Override
+  public void onScreenReady() {
+
+    showWaiter();
+
+    view.loadUrl(model.getUrl());
+  }
+
+  @Override
+  public void onResult(Event event) {
+    if (event.getInteger() == Event.COIN) {
+      coinChecker.checkFirst();
+    }
+  }
+
+  /**
+   * 닫기 클릭
+   *
+   * @param navigationBar
+   */
+
+
+  public void onNavigationClickClose(NavigationBar navigationBar) {
+    onBackPressed();
+  }
+
+
+  /***********************************
+   * Share
+   ***********************************/
+
+  protected void showShareDialog() {
+    new DialogBuilder<ShareDialog, ICustomDialogListener>(getFragmentManager(), DialogID.SHARE)
+      .listener(new ICustomDialogListener<ShareDialog>() {
+        @Override
+        public void onDialogResult(ShareDialog dialog, Event event) {
+          dialog.dispose();
+          switch (event.getEventId()) {
+            case Event.CLOSE:
+              break;
+            case Event.KAKAO_TALK:
+              sendKakaoLink();
+              break;
+            case Event.FACE_BOOK:
+              sendFaceBook();
+              break;
+            case Event.CODE_COPY:
+              sendClipBoardCopy();
+              break;
+            case Event.EMAIL_CLICK:
+              sendEmail();
+              break;
+            default:
+              break;
+          }
+        }
+
+        @Override
+        public void onDialogCanceled(ShareDialog dialog) {
+          dialog.dispose();
+        }
+      })
+      .attribute(dialog -> {
+        dialog.setDialogType(ShareDialog.TYPE_PAGE_TOTAL);
+      })
+      .show();
+  }
+
+  protected void sendKakaoLink() {
+    share = new ShareKakaoTalk(view.getActivity());
+    share.shareEvent(model.getDeliveredEventDetailBean(), new IShareListener() {
+      @Override
+      public void onSuccess(String result) {
+        loadShareCoin(Share.TYPE_KAKAO);
+      }
+
+      @Override
+      public void onFailure(int errorCode, String result) {
+        if (ShareKakaoTalk.CLIENT_ERROR_CODE == errorCode) {
+          showErrorDialog(ResourceUtil.getString(R.string.please_install_kakaotalk));
+        }
+        else {
+          showErrorDialog(result);
+        }
+      }
+    });
+  }
+
+  protected void sendFaceBook() {
+    // deep link 생성하는 시간동안 웨이터 표시
+    showWaiter();
+    share = new ShareFacebook(view.getActivity(), getHelper(FacebookHelper.class).getCallbackManager());
+    share.shareEvent(model.getDeliveredEventDetailBean(), new IShareListener() {
+      @Override
+      public void onSuccess(String result) {
+        loadShareCoin(Share.TYPE_FACEBOOK);
+        showShareToast("", ResourceUtil.getString(R.string.share_completed_message), 1);
+        hideWaiter();
+      }
+
+      @Override
+      public void onCancel() {
+        loadShareCoin(Share.TYPE_FACEBOOK);
+        hideWaiter();
+      }
+
+      @Override
+      public void onFailure(int errorCode, String result) {
+        showErrorDialog(result);
+        hideWaiter();
+      }
+    });
+
+  }
+
+  protected void sendClipBoardCopy() {
+    // deep link 생성하는 시간동안 웨이터 표시
+    showWaiter();
+    share = new ShareClipBoard(view.getActivity());
+    share.shareEvent(model.getDeliveredEventDetailBean(), new IShareListener() {
+      @Override
+      public void onSuccess(String result) {
+        hideWaiter();
+        loadShareCoin(Share.TYPE_URL);
+        // clipboard 는 resume 이 없으므로 바로 실행
+        resumeInternal();
+
+        showShareToast("", ResourceUtil.getString(R.string.url_copy_message), 1);
+      }
+
+      @Override
+      public void onFailure(int errorCode, String result) {
+        hideWaiter();
+        showErrorDialog(ResourceUtil.getString(R.string.share_error_message));
+      }
+    });
+  }
+
+  protected void sendEmail() {
+    // deep link 생성하는 시간동안 웨이터 표시
+    showWaiter();
+    share = new ShareEmail(view.getActivity());
+    share.shareEvent(model.getDeliveredEventDetailBean(), new IShareListener() {
+      @Override
+      public void onSuccess(String result) {
+        hideWaiter();
+        loadShareCoin(Share.TYPE_EMAIL);
+        String subject;
+        subject = ResourceUtil.getString(R.string.share_title, model.getDeliveredEventDetailBean().getTitle());
+        String url = result;
+        String contents = ResourceUtil.getString(R.string.share_event_contents, subject, url);
+        Log.d("APP# EventDetailEntryPresenter | onSuccess", "|" + contents);
+        onCommand(new EmailSendingCommand("", subject, contents));
+      }
+
+      @Override
+      public void onFailure(int errorCode, String result) {
+        hideWaiter();
+        showErrorDialog(ResourceUtil.getString(R.string.share_error_message));
+      }
+    });
+  }
+
+  protected Share share;
+  protected DoubleChecker coinChecker = null;
+
+  protected void loadShareCoin(@Share.Type String type) {
+    // 더블 체커 세팅
+    coinChecker = new DoubleChecker(() -> {
+      coinChecker = null;
+
+      // 보유 코인 우선 로딩 -> 코인 적립을 먼저하면 이전 값과 더한 값의 차이가 있을 수 있다.
+      model.getCoinAsync(e -> {
+        Log.i("APP# ContentsBasePresenter | onResult", "|" + " current coin: " + e.getInteger());
+        new CoinPopupDriver(getFragmentManager(), () -> {}, () -> {})
+          .show(model.getPrevCoin(), model.getGivenCoin(), R.string.coin_share_event);
+
+        model.mergeCoin();
+      });
+    });
+
+    model.loadShareCoin(type, new APIModuleListener<ShareCoinResultBean>(this) {
+      @Override
+      public void onApiSuccess(ShareCoinResultBean resultBean) {
+        coinChecker.checkFirst();
+      }
+
+      @Override
+      public void onApiError(String errorMessage, APIError error) {
+        Log.e("APP#  EventDetailEntryPresenter | onApiError", "|" + errorMessage);
+      }
+    });
+  }
+
+  protected void showShareToast(String title, String detail, @Nullable int copyToastFlag) {
+    ToastProvider.showShare(title, detail, copyToastFlag);
+  }
+}