瀏覽代碼

[컨텐츠][New] 전체 보기, 공유/좋아요/북마크 연동

hyodong.min 7 年之前
父節點
當前提交
93934192e6

+ 2 - 1
app/src/main/java/kr/co/zumo/app/lifeplus/view/Event.java

@@ -112,6 +112,7 @@ public class Event {
   public static final int LIKE = 84;
   public static final int FRAGMENT_STACK_EMPTY = 85;
   public static final int OVER_VIEW = 86;
+  public static final int SHARE = 87;
 
 
   @Retention(RetentionPolicy.SOURCE)
@@ -124,7 +125,7 @@ public class Event {
     ACTION_BAR_SEARCH, ACTION_BAR_MENU, ACTION_BAR_TITLE, FIRST_CATEGORY, SECOND_CATEGORY, THIRD_CATEGORY, FOURTH_CATEGORY, FIFTH_CATEGORY,
     SWITCH, BOOK_MARK_DEFAULT, BOOK_MARK_LIST, ADD, MY_COIN_MAIN, MY_PURCHASE_HISTORY, GUIDE, ADD_BUCKET, MY_MAIN_GUEST, COUPON_MALL, CATEGORY_CLICK,
     MY_FAQ, UPDATE, FILTER, CLOSE, HELP, CONTENTS, MORE, BANNER, RECOMMEND, KAKAO_TALK, FACE_BOOK, CODE_COPY, EVENT, TAG, BOOKMARK, ORDER, DEFAULT, COMPLETE_BUCKET,
-    LIKE, FRAGMENT_STACK_EMPTY, OVER_VIEW
+    LIKE, FRAGMENT_STACK_EMPTY, OVER_VIEW, SHARE
   })
   public @interface ID {}
 

+ 270 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/contents/ContentsBasePresenter.java

@@ -0,0 +1,270 @@
+/*
+ * COPYRIGHT (c) 2018 All rights reserved by HANWHA LIFE.
+ */
+package kr.co.zumo.app.lifeplus.view.screen.contents;
+
+import android.content.Context;
+import android.support.annotation.Nullable;
+import android.util.Log;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import kr.co.zumo.app.R;
+import kr.co.zumo.app.lifeplus.application.App;
+import kr.co.zumo.app.lifeplus.bean.ContentsDeliveryBean;
+import kr.co.zumo.app.lifeplus.helper.DeliveryHelper;
+import kr.co.zumo.app.lifeplus.helper.FacebookHelper;
+import kr.co.zumo.app.lifeplus.helper.NavigationBar;
+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.ShareFacebook;
+import kr.co.zumo.app.lifeplus.tool.ShareKakaoTalk;
+import kr.co.zumo.app.lifeplus.util.ResourceUtil;
+import kr.co.zumo.app.lifeplus.view.Event;
+import kr.co.zumo.app.lifeplus.view.command.EmailSendingCommand;
+import kr.co.zumo.app.lifeplus.view.dialog.DialogBase;
+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;
+
+/**
+ * ContentsPresenter
+ * <pre>
+ * </pre>
+ *
+ * @author 민효동
+ * @version 1.0
+ * @history 민효동   [2018. 11. 6.]   [최초 작성]
+ * @since 2018. 11. 6.
+ */
+public abstract class ContentsBasePresenter<M extends ContentsModel, V extends IContentsView> extends Presenter<M, V> {
+
+  private DialogBase reviewDialog;
+  private Share share;
+
+  public ContentsBasePresenter(M model, V view) {
+    super(model, view);
+
+    DeliveryHelper deliveryHelper = getHelper(DeliveryHelper.class);
+    ContentsDeliveryBean contentsDeliveryBean = deliveryHelper.getPackaging(ContentsDeliveryBean.class);
+
+    if (null != contentsDeliveryBean) {
+      Log.w("APP# ContentsBasePresenter | ContentsPresenter", "|" + contentsDeliveryBean.toPrettyJson());
+      this.model.setContentsBean(contentsDeliveryBean.getContentsBean());
+
+      deliveryHelper.clearPackaging();
+    }
+  }
+
+  @Override
+  protected void createViewInternal() {
+  }
+
+  @Override
+  protected void destroyInternal() {
+    if (null != reviewDialog) {
+      reviewDialog.dispose();
+      reviewDialog = null;
+    }
+
+    if (null != share) {
+      share.dispose();
+      share = null;
+    }
+  }
+
+  @Override
+  protected void destroyViewInternal() {
+  }
+
+  @Override
+  protected void startInternal() {
+
+  }
+
+  @Override
+  protected void stopInternal() {
+
+  }
+
+  @Override
+  protected void resumeInternal() {
+
+  }
+
+  @Override
+  protected void pauseInternal() {
+
+  }
+
+  @Override
+  public abstract boolean onBackPressed();
+
+  @Override
+  protected abstract void onEventInternal(Event event);
+
+  @Override
+  public final void onResult(Event event) {
+    final int subId = event.getInteger();
+    final boolean requestedChecked = event.getBool();
+    switch (event.getEventId()) {
+      case Event.SUCCESS:
+        if (subId == Event.CONTENTS_LIKE) {
+          view.setLiked(requestedChecked);
+        }
+        else if (subId == Event.CONTENTS_BOOKMARK) {
+          view.setBookmarked(requestedChecked);
+        }
+        break;
+      case Event.ERROR:
+        if (subId == Event.CONTENTS_LIKE) {
+        }
+        else if (subId == Event.CONTENTS_BOOKMARK) {
+        }
+        showErrorDialog(event.getString());
+        break;
+      default:
+        onContentsResultInternal(event);
+        break;
+    }
+  }
+
+  protected abstract void onContentsResultInternal(Event event);
+
+  @Override
+  public abstract void onScreenReady();
+
+  /**
+   * 공유 클릭
+   *
+   * @param navigationBar
+   */
+  public void onNavigationClickShare(NavigationBar navigationBar) {
+    showShareDialog();
+  }
+
+  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_CURRENT);
+      })
+      .show();
+  }
+
+  protected void sendKakaoLink() {
+    share = new ShareKakaoTalk(view.getActivity());
+    share.shareContents(model.getContentsBean().toJson(), new IShareListener() {
+      @Override
+      public void onSuccess(String result) {
+      }
+
+      @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() {
+    share = new ShareFacebook(view.getActivity(), getHelper(FacebookHelper.class).getCallbackManager());
+    share.shareContents(model.getContentsBean().getContentsUrlWithParamForShare(), new IShareListener() {
+      @Override
+      public void onSuccess(String result) {
+        showToast("", ResourceUtil.getString(R.string.share_completed_message), 1);
+      }
+
+      @Override
+      public void onFailure(int errorCode, String result) {
+        showErrorDialog(result);
+      }
+    });
+
+  }
+
+  protected void sendClipBoardCopy() {
+    share = new ShareClipBoard(view.getActivity());
+    share.shareContents(model.getContentsBean().getContentsUrlWithParamForShare(), new IShareListener() {
+      @Override
+      public void onSuccess(String result) {
+        showToast("", ResourceUtil.getString(R.string.url_copy_message), 1);
+      }
+
+      @Override
+      public void onFailure(int errorCode, String result) {
+        showErrorDialog(ResourceUtil.getString(R.string.share_error_message));
+      }
+    });
+  }
+
+
+  protected void sendEmail() {
+    String subject = ResourceUtil.getString(R.string.share_title, model.getContentsBean().getTitle());
+    String contents = ResourceUtil.getString(R.string.share_current_page_contents, model.getContentsBean().getTitle(), model.getContentsBean().getContentsUrl());
+    onCommand(new EmailSendingCommand("", subject, contents));
+  }
+
+  protected void showToast(String title, String detail, @Nullable int copyToastFlag) {
+
+    Context context = App.getInstance().getContext();
+    Toast toast = new Toast(context);
+    toast.setDuration(Toast.LENGTH_LONG);
+    toast.setGravity(Gravity.FILL, 0, 0);
+    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+    View view;
+    if (copyToastFlag != 0) {
+      view = inflater.inflate(R.layout.setting_toast_url_copy_pop_up, null);
+      ((TextView) view.findViewById(R.id.setting_toast_detail)).setText(detail);
+    }
+    else {
+      view = inflater.inflate(R.layout.setting_toast_pop_up, null);
+      ((TextView) view.findViewById(R.id.setting_toast_title)).setText(title);
+      ((TextView) view.findViewById(R.id.setting_toast_detail)).setText(detail);
+    }
+
+    toast.setView(view);
+    toast.show();
+  }
+
+}

+ 16 - 2
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/contents/ContentsModel.java

@@ -37,7 +37,7 @@ public class ContentsModel extends Model {
   private Disposable disposableLiked;
   private Disposable disposableBookmarked;
 
-  private LifeplusContentsBean contentsBean;
+  protected LifeplusContentsBean contentsBean;
 
   private GuestLikedManager guestLikedManager;
 
@@ -107,6 +107,14 @@ public class ContentsModel extends Model {
     return contentsBean;
   }
 
+  public boolean isLiked() {
+    return null != contentsBean && contentsBean.isLiked();
+  }
+
+  public boolean isBookmarked() {
+    return null != contentsBean && contentsBean.isBookmarked();
+  }
+
   /**
    * DeliveryHelper 로 전달된 데이터를 저장한다.
    *
@@ -169,7 +177,7 @@ public class ContentsModel extends Model {
     SuperModel.getInstance().setGuestLikedListBean(guestLikedManager.getGuestLikedListBean());
   }
 
-  public void stopLoading() {
+  public final void stopLoading() {
     if (null != disposableLiked) {
       disposableLiked.dispose();
       disposableLiked = null;
@@ -178,6 +186,12 @@ public class ContentsModel extends Model {
       disposableBookmarked.dispose();
       disposableBookmarked = null;
     }
+
+    stopLoadingInternal();
+  }
+
+  protected void stopLoadingInternal() {
+
   }
 
   private void updateLikedInternal() {

+ 71 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/contents/ContentsOverviewFragment.java

@@ -1,6 +1,9 @@
 package kr.co.zumo.app.lifeplus.view.screen.contents;
 
+import android.content.ActivityNotFoundException;
+import android.content.Intent;
 import android.graphics.Rect;
+import android.net.Uri;
 import android.os.Bundle;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
@@ -9,13 +12,16 @@ import android.support.v7.widget.RecyclerView;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
+import android.widget.ImageView;
 
 import java.util.List;
 
 import kr.co.zumo.app.R;
 import kr.co.zumo.app.lifeplus.bean.api.ContentsDetailBean;
 import kr.co.zumo.app.lifeplus.helper.ActionBarHelper;
+import kr.co.zumo.app.lifeplus.util.AppUtil;
 import kr.co.zumo.app.lifeplus.util.ResourceUtil;
+import kr.co.zumo.app.lifeplus.view.Event;
 import kr.co.zumo.app.lifeplus.view.screen.FragmentBase;
 
 /**
@@ -31,6 +37,12 @@ import kr.co.zumo.app.lifeplus.view.screen.FragmentBase;
 public class ContentsOverviewFragment extends FragmentBase<ContentsOverviewPresenter> implements IContentsOverviewView {
 
   private RecyclerView recyclerViewOverview;
+  private ImageView buttonShare;
+  private ImageView buttonLiked;
+  private ImageView buttonBookmark;
+  private ImageView imageShare;
+  private ImageView imageLiked;
+  private ImageView imagBookmark;
 
   @Override
   protected View onAfterCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
@@ -49,6 +61,24 @@ public class ContentsOverviewFragment extends FragmentBase<ContentsOverviewPrese
         outRect.right = ResourceUtil.dpToPx(4);
       }
     });
+    buttonShare = findViewById(R.id.circle1);
+    buttonLiked = findViewById(R.id.circle2);
+    buttonBookmark = findViewById(R.id.circle3);
+    imageShare = findViewById(R.id.icon_share);
+    imageLiked = findViewById(R.id.icon_like);
+    imagBookmark = findViewById(R.id.icon_bookmark);
+
+    buttonShare.setOnClickListener(v -> {
+      presenter.onEvent(new Event.Builder(Event.SHARE).build());
+    });
+
+    buttonLiked.setOnClickListener(v -> {
+      presenter.onEvent(new Event.Builder(Event.LIKE).build());
+    });
+
+    buttonBookmark.setOnClickListener(v -> {
+      presenter.onEvent(new Event.Builder(Event.BOOKMARK).build());
+    });
   }
 
   @Override
@@ -96,4 +126,45 @@ public class ContentsOverviewFragment extends FragmentBase<ContentsOverviewPrese
   public void setTitle(String title) {
     getHelper(ActionBarHelper.class).setTitle(title);
   }
+
+  @Override
+  public void goGooglePlay() {
+    String appPackageName = AppUtil.getPackageName();
+    try {
+      startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + appPackageName)));
+    } catch (ActivityNotFoundException e) {
+      startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + appPackageName)));
+    }
+  }
+
+  @Override
+  public void setLiked(boolean isChecked) {
+    if (isChecked) {
+      imageLiked.setImageResource(R.drawable.icon_header_like_wh_on);
+    }
+    else {
+      imageLiked.setImageResource(R.drawable.icon_header_like_off_over_view);
+    }
+  }
+
+  @Override
+  public void setBookmarked(boolean isChecked) {
+    if (isChecked) {
+      imagBookmark.setImageResource(R.drawable.icon_header_bookmark_wh_on);
+    }
+    else {
+      imagBookmark.setImageResource(R.drawable.icon_header_bookmark_off_over_view);
+    }
+
+  }
+
+  @Override
+  public void render(String url) {
+    // not use
+  }
+
+  @Override
+  public void setTooltip() {
+    // not use
+  }
 }

+ 2 - 59
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/contents/ContentsOverviewModel.java

@@ -5,9 +5,7 @@ import java.util.List;
 import io.reactivex.disposables.Disposable;
 import kr.co.zumo.app.lifeplus.bean.api.ContentsDetailBean;
 import kr.co.zumo.app.lifeplus.bean.api.ContentsDetailResultBean;
-import kr.co.zumo.app.lifeplus.bean.api.LifeplusContentsBean;
 import kr.co.zumo.app.lifeplus.bean.api.StringRequestBean;
-import kr.co.zumo.app.lifeplus.model.Model;
 import kr.co.zumo.app.lifeplus.model.module.APIContentsDetailModule;
 import kr.co.zumo.app.lifeplus.model.module.IAPIModuleListener;
 import kr.co.zumo.app.lifeplus.view.Event;
@@ -22,70 +20,15 @@ import kr.co.zumo.app.lifeplus.view.Event;
  * @history 하세미   [2018-11-22]   [최초 작성]
  * @since 2018-11-22
  */
-public class ContentsOverviewModel extends Model {
+public class ContentsOverviewModel extends ContentsModel {
   private Disposable disposable;
-  private LifeplusContentsBean contentsBean;
   private List<ContentsDetailBean> contentsDetailBeans;
 
-
-  @Override
-  protected void createViewInternal() {
-
-  }
-
-  @Override
-  protected void destroyInternal() {
-    stopLoading();
-  }
-
-  @Override
-  protected void destroyViewInternal() {
-
-  }
-
-  @Override
-  protected void startInternal() {
-
-  }
-
-  @Override
-  protected void stopInternal() {
-
-  }
-
-  @Override
-  protected void resumeInternal() {
-
-  }
-
-  @Override
-  protected void pauseInternal() {
-
-  }
-
   public List<ContentsDetailBean> getContentsDetailBeans() {
     return contentsDetailBeans;
   }
 
-  /**
-   * 컨텐츠 정보
-   *
-   * @return
-   */
-  public LifeplusContentsBean getContentsBean() {
-    return contentsBean;
-  }
-
-  /**
-   * DeliveryHelper 로 전달된 데이터를 저장한다.
-   *
-   * @param bean
-   */
-  public void setContentsBean(LifeplusContentsBean bean) {
-    this.contentsBean = bean;
-  }
-
-  public void stopLoading() {
+  protected void stopLoadingInternal() {
     if (null != disposable) {
       disposable.dispose();
       disposable = null;

+ 24 - 53
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/contents/ContentsOverviewPresenter.java

@@ -2,13 +2,10 @@ package kr.co.zumo.app.lifeplus.view.screen.contents;
 
 import android.util.Log;
 
-import kr.co.zumo.app.lifeplus.bean.ContentsDeliveryBean;
-import kr.co.zumo.app.lifeplus.helper.DeliveryHelper;
 import kr.co.zumo.app.lifeplus.helper.NavigationBar;
 import kr.co.zumo.app.lifeplus.supervisor.ScreenID;
 import kr.co.zumo.app.lifeplus.view.DoubleChecker;
 import kr.co.zumo.app.lifeplus.view.Event;
-import kr.co.zumo.app.lifeplus.view.presenter.Presenter;
 
 /**
  * ContentsOverviewPresenter
@@ -20,25 +17,16 @@ import kr.co.zumo.app.lifeplus.view.presenter.Presenter;
  * @history 하세미   [2018-11-22]   [최초 작성]
  * @since 2018-11-22
  */
-public class ContentsOverviewPresenter extends Presenter<ContentsOverviewModel, IContentsOverviewView> {
+public class ContentsOverviewPresenter extends ContentsBasePresenter<ContentsOverviewModel, IContentsOverviewView> {
 
   private DoubleChecker doubleChecker;
 
   public ContentsOverviewPresenter(ContentsOverviewModel model, IContentsOverviewView view) {
     super(model, view);
 
-    DeliveryHelper deliveryHelper = getHelper(DeliveryHelper.class);
-    ContentsDeliveryBean contentsDeliveryBean = deliveryHelper.getPackaging(ContentsDeliveryBean.class);
-
-    Log.w("APP# ContentsOverviewPresenter | ContentsOverviewPresenter", "|" + contentsDeliveryBean.toPrettyJson());
-
-    doubleChecker = new DoubleChecker(this::render);
-
-    if (null != contentsDeliveryBean) {
-      this.model.setContentsBean(contentsDeliveryBean.getContentsBean());
+    if (null != this.model.getContentsBean()) {
+      doubleChecker = new DoubleChecker(this::render);
       this.model.loadDetail();
-
-      deliveryHelper.clearPackaging();
     }
   }
 
@@ -46,41 +34,6 @@ public class ContentsOverviewPresenter extends Presenter<ContentsOverviewModel,
     view.render(model.getContentsDetailBeans());
   }
 
-  @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() {
-
-  }
-
   @Override
   public boolean onBackPressed() {
     back(ScreenID.CONTENTS);
@@ -89,18 +42,36 @@ public class ContentsOverviewPresenter extends Presenter<ContentsOverviewModel,
 
   @Override
   protected void onEventInternal(Event event) {
-    // todo 리스트 클릭 -> 해당 페이지로 이동;
-    Log.e("APP#  ContentsOverviewPresenter | onEventInternal", "|" + event.toString());
+    switch (event.getEventId()) {
+      case Event.CLICK:
+        // todo 리스트 클릭 -> 해당 페이지로 이동;
+        Log.e("APP#  ContentsOverviewPresenter | onEventInternal", "|" + event.toString());
+        break;
+      case Event.SHARE:
+        showShareDialog();
+        break;
+      case Event.LIKE:
+        model.updateLiked();
+        break;
+      case Event.BOOKMARK:
+        model.updateBookmarked();
+        break;
+      default:
+        break;
+    }
   }
 
   @Override
   public void onScreenReady() {
     view.setTitle(model.getContentsBean().getTitleWithTrim());
     doubleChecker.checkFirst();
+
+    view.setLiked(model.isLiked());
+    view.setBookmarked(model.isBookmarked());
   }
 
   @Override
-  public void onResult(Event event) {
+  protected void onContentsResultInternal(Event event) {
     switch (event.getEventId()) {
       case Event.RESULT:
         // detail loading

+ 15 - 207
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/contents/ContentsPresenter.java

@@ -3,39 +3,21 @@
  */
 package kr.co.zumo.app.lifeplus.view.screen.contents;
 
-import android.content.Context;
-import android.support.annotation.Nullable;
-import android.util.Log;
-import android.view.Gravity;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.widget.TextView;
-import android.widget.Toast;
-
 import kr.co.zumo.app.R;
-import kr.co.zumo.app.lifeplus.application.App;
 import kr.co.zumo.app.lifeplus.bean.ContentsDeliveryBean;
 import kr.co.zumo.app.lifeplus.helper.DeliveryHelper;
-import kr.co.zumo.app.lifeplus.helper.FacebookHelper;
 import kr.co.zumo.app.lifeplus.helper.NavigationBar;
 import kr.co.zumo.app.lifeplus.supervisor.ScreenID;
-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.ShareFacebook;
-import kr.co.zumo.app.lifeplus.tool.ShareKakaoTalk;
 import kr.co.zumo.app.lifeplus.util.ResourceUtil;
 import kr.co.zumo.app.lifeplus.view.Event;
-import kr.co.zumo.app.lifeplus.view.command.EmailSendingCommand;
 import kr.co.zumo.app.lifeplus.view.dialog.AppReviewDialog;
 import kr.co.zumo.app.lifeplus.view.dialog.ConfirmDialog;
 import kr.co.zumo.app.lifeplus.view.dialog.DialogBase;
 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.dialog.TooltipDialog;
-import kr.co.zumo.app.lifeplus.view.presenter.Presenter;
 
 /**
  * ContentsPresenter
@@ -47,64 +29,24 @@ import kr.co.zumo.app.lifeplus.view.presenter.Presenter;
  * @history 민효동   [2018. 11. 6.]   [최초 작성]
  * @since 2018. 11. 6.
  */
-public class ContentsPresenter extends Presenter<ContentsModel, IContentsView> {
+public class ContentsPresenter extends ContentsBasePresenter<ContentsModel, IContentsView> {
 
-  private DialogBase reviewDialog;
-  private Share share;
+  protected DialogBase reviewDialog;
+  protected Share share;
 
   public ContentsPresenter(ContentsModel model, IContentsView view) {
     super(model, view);
 
-    DeliveryHelper deliveryHelper = getHelper(DeliveryHelper.class);
-    ContentsDeliveryBean contentsDeliveryBean = deliveryHelper.getPackaging(ContentsDeliveryBean.class);
-
-    if (null != contentsDeliveryBean) {
-      Log.w("APP# ContentsPresenter | ContentsPresenter", "|" + contentsDeliveryBean.toPrettyJson());
-      this.model.setContentsBean(contentsDeliveryBean.getContentsBean());
-
-      deliveryHelper.clearPackaging();
-    }
-  }
-
-  @Override
-  protected void createViewInternal() {
-  }
-
-  @Override
-  protected void destroyInternal() {
-    if (null != reviewDialog) {
-      reviewDialog.dispose();
-      reviewDialog = null;
-    }
-
-    if (null != share) {
-      share.dispose();
-      share = null;
-    }
-  }
-
-  @Override
-  protected void destroyViewInternal() {
   }
 
   @Override
   protected void startInternal() {
+    super.startInternal();
 
-  }
-
-  @Override
-  protected void stopInternal() {
-
-  }
-
-  @Override
-  protected void resumeInternal() {
-
-  }
-
-  @Override
-  protected void pauseInternal() {
-
+    if (null != model.getContentsBean()) {
+      view.setLiked(model.isLiked());
+      view.setBookmarked(model.isBookmarked());
+    }
   }
 
   @Override
@@ -119,28 +61,8 @@ public class ContentsPresenter extends Presenter<ContentsModel, IContentsView> {
   }
 
   @Override
-  public void onResult(Event event) {
-    final int subId = event.getInteger();
-    final boolean requestedChecked = event.getBool();
-    switch (event.getEventId()) {
-      case Event.SUCCESS:
-        if (subId == Event.CONTENTS_LIKE) {
-          view.setLiked(requestedChecked);
-        }
-        else if (subId == Event.CONTENTS_BOOKMARK) {
-          view.setBookmarked(requestedChecked);
-        }
-        break;
-      case Event.ERROR:
-        if (subId == Event.CONTENTS_LIKE) {
-        }
-        else if (subId == Event.CONTENTS_BOOKMARK) {
-        }
-        showErrorDialog(event.getString());
-        break;
-      default:
-        break;
-    }
+  protected void onContentsResultInternal(Event event) {
+
   }
 
   @Override
@@ -182,8 +104,8 @@ public class ContentsPresenter extends Presenter<ContentsModel, IContentsView> {
       }
     }
 
-    view.setLiked(model.getContentsBean().isLiked());
-    view.setBookmarked(model.getContentsBean().isBookmarked());
+    view.setLiked(model.isLiked());
+    view.setBookmarked(model.isBookmarked());
   }
 
   /**
@@ -224,124 +146,10 @@ public class ContentsPresenter extends Presenter<ContentsModel, IContentsView> {
    * @param navigationBar
    */
   public void onNavigationClickShare(NavigationBar navigationBar) {
-    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_CURRENT);
-      })
-      .show();
-  }
-
-  private void sendKakaoLink() {
-    share = new ShareKakaoTalk(view.getActivity());
-    share.shareContents(model.getContentsBean().toJson(), new IShareListener() {
-      @Override
-      public void onSuccess(String result) {
-      }
-
-      @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);
-        }
-      }
-    });
-  }
-
-  private void sendFaceBook() {
-    share = new ShareFacebook(view.getActivity(), getHelper(FacebookHelper.class).getCallbackManager());
-    share.shareContents(model.getContentsBean().getContentsUrlWithParamForShare(), new IShareListener() {
-      @Override
-      public void onSuccess(String result) {
-        showToast("", ResourceUtil.getString(R.string.share_completed_message), 1);
-      }
-
-      @Override
-      public void onFailure(int errorCode, String result) {
-        showErrorDialog(result);
-      }
-    });
-
-  }
-
-  private void sendClipBoardCopy() {
-    share = new ShareClipBoard(view.getActivity());
-    share.shareContents(model.getContentsBean().getContentsUrlWithParamForShare(), new IShareListener() {
-      @Override
-      public void onSuccess(String result) {
-        showToast("", ResourceUtil.getString(R.string.url_copy_message), 1);
-      }
-
-      @Override
-      public void onFailure(int errorCode, String result) {
-        showErrorDialog(ResourceUtil.getString(R.string.share_error_message));
-      }
-    });
-  }
-
-
-  private void sendEmail() {
-    String subject = ResourceUtil.getString(R.string.share_title, model.getContentsBean().getTitle());
-    String contents = ResourceUtil.getString(R.string.share_current_page_contents, model.getContentsBean().getTitle(), model.getContentsBean().getContentsUrl());
-    onCommand(new EmailSendingCommand("", subject, contents));
-  }
-
-  private void showToast(String title, String detail, @Nullable int copyToastFlag) {
-
-    Context context = App.getInstance().getContext();
-    Toast toast = new Toast(context);
-    toast.setDuration(Toast.LENGTH_LONG);
-    toast.setGravity(Gravity.FILL, 0, 0);
-    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
-    View view;
-    if (copyToastFlag != 0) {
-      view = inflater.inflate(R.layout.setting_toast_url_copy_pop_up, null);
-      ((TextView) view.findViewById(R.id.setting_toast_detail)).setText(detail);
-    }
-    else {
-      view = inflater.inflate(R.layout.setting_toast_pop_up, null);
-      ((TextView) view.findViewById(R.id.setting_toast_title)).setText(title);
-      ((TextView) view.findViewById(R.id.setting_toast_detail)).setText(detail);
-    }
-
-    toast.setView(view);
-    toast.show();
+    showShareDialog();
   }
 
-  private void showPopupForGuest() {
+  protected void showPopupForGuest() {
     // 비회원 가입 유도
     new DialogBuilder<ConfirmDialog, ICustomDialogListener>(getFragmentManager(), DialogID.ALERT)
       .listener(new ICustomDialogListener<ConfirmDialog>() {
@@ -365,7 +173,7 @@ public class ContentsPresenter extends Presenter<ContentsModel, IContentsView> {
       .show();
   }
 
-  private void showTooltipDialog() {
+  protected void showTooltipDialog() {
     new DialogBuilder<TooltipDialog, ICustomDialogListener>(getFragmentManager(), DialogID.TOOL_TIP)
       .listener(new ICustomDialogListener<TooltipDialog>() {
 

+ 1 - 2
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/contents/IContentsOverviewView.java

@@ -6,7 +6,6 @@ package kr.co.zumo.app.lifeplus.view.screen.contents;
 import java.util.List;
 
 import kr.co.zumo.app.lifeplus.bean.api.ContentsDetailBean;
-import kr.co.zumo.app.lifeplus.view.IView;
 
 /**
  * IContentsView
@@ -18,7 +17,7 @@ import kr.co.zumo.app.lifeplus.view.IView;
  * @history 민효동   [2018. 11. 6.]   [최초 작성]
  * @since 2018. 11. 6.
  */
-public interface IContentsOverviewView extends IView {
+public interface IContentsOverviewView extends IContentsView {
 
   void render(List<ContentsDetailBean> contentsDetailList);
 

+ 12 - 5
app/src/main/res/drawable/icon_header_bookmark_off_over_view.xml

@@ -1,6 +1,13 @@
-<vector android:height="15dp" android:viewportHeight="61"
-    android:viewportWidth="61" android:width="15dp" xmlns:android="http://schemas.android.com/apk/res/android">
-    <path android:fillColor="#00000000" android:fillType="evenOdd"
-        android:pathData="M10,9h42v46L31,39.712 10,55z"
-        android:strokeColor="#000" android:strokeLineCap="square" android:strokeWidth="6"/>
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="15dp"
+        android:height="15dp"
+        android:viewportWidth="61"
+        android:viewportHeight="61">
+  <path
+    android:fillColor="#00000000"
+    android:fillType="evenOdd"
+    android:pathData="M10,9h42v46L31,39.712 10,55z"
+    android:strokeWidth="6"
+    android:strokeColor="#000"
+    android:strokeLineCap="square"/>
 </vector>

+ 12 - 5
app/src/main/res/drawable/icon_header_like_off_over_view.xml

@@ -1,6 +1,13 @@
-<vector android:height="15dp" android:viewportHeight="61"
-    android:viewportWidth="61" android:width="15dp" xmlns:android="http://schemas.android.com/apk/res/android">
-    <path android:fillColor="#00000000" android:fillType="evenOdd"
-        android:pathData="M30.5,54a2.944,2.944 0,0 1,-1.786 -0.607c-4.925,-3.75 -18.56,-14.473 -21.79,-20.649 -3.96,-7.57 -1.61,-17.254 5.25,-21.625C14.427,9.682 16.887,9 19.314,9c4.256,0 8.412,2.099 11.184,5.907C33.275,11.097 37.43,9 41.685,9c2.426,0 4.886,0.682 7.141,2.12 6.86,4.37 9.21,14.053 5.25,21.624 -3.23,6.176 -16.866,16.9 -21.792,20.65A2.942,2.942 0,0 1,30.5 54z"
-        android:strokeColor="#000" android:strokeLineCap="square" android:strokeWidth="6"/>
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="15dp"
+        android:height="15dp"
+        android:viewportWidth="61"
+        android:viewportHeight="61">
+  <path
+    android:fillColor="#00000000"
+    android:fillType="evenOdd"
+    android:pathData="M30.5,54a2.944,2.944 0,0 1,-1.786 -0.607c-4.925,-3.75 -18.56,-14.473 -21.79,-20.649 -3.96,-7.57 -1.61,-17.254 5.25,-21.625C14.427,9.682 16.887,9 19.314,9c4.256,0 8.412,2.099 11.184,5.907C33.275,11.097 37.43,9 41.685,9c2.426,0 4.886,0.682 7.141,2.12 6.86,4.37 9.21,14.053 5.25,21.624 -3.23,6.176 -16.866,16.9 -21.792,20.65A2.942,2.942 0,0 1,30.5 54z"
+    android:strokeWidth="6"
+    android:strokeColor="#000"
+    android:strokeLineCap="square"/>
 </vector>

+ 13 - 4
app/src/main/res/drawable/icon_header_share_over_view.xml

@@ -1,5 +1,14 @@
-<vector android:height="15dp" android:viewportHeight="61"
-    android:viewportWidth="61" android:width="15dp" xmlns:android="http://schemas.android.com/apk/res/android">
-    <path android:fillColor="#000" android:fillType="nonZero" android:pathData="M50.832,8L55,12.168 32.168,35 28,30.832z"/>
-    <path android:fillColor="#000" android:fillType="nonZero" android:pathData="M50,50V33.288h6V56H6V6h22.646v6H12v38zM50,12H38V6h18v18h-6z"/>
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="15dp"
+        android:height="15dp"
+        android:viewportWidth="61"
+        android:viewportHeight="61">
+  <path
+    android:fillColor="#000"
+    android:fillType="nonZero"
+    android:pathData="M50.832,8L55,12.168 32.168,35 28,30.832z"/>
+  <path
+    android:fillColor="#000"
+    android:fillType="nonZero"
+    android:pathData="M50,50V33.288h6V56H6V6h22.646v6H12v38zM50,12H38V6h18v18h-6z"/>
 </vector>