浏览代码

[컨텐츠][New] Native API 적용 중

hyodong.min 7 年之前
父节点
当前提交
b9a881934e
共有 16 个文件被更改,包括 414 次插入88 次删除
  1. 5 0
      app/src/main/java/kr/co/zumo/app/lifeplus/bean/api/ContentsDetailBean.java
  2. 4 0
      app/src/main/java/kr/co/zumo/app/lifeplus/view/Event.java
  3. 8 9
      app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/category/CategoryMainModel.java
  4. 15 9
      app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/category/CategoryMainPresenter.java
  5. 8 2
      app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/contents/ContentsBasePresenter.java
  6. 63 17
      app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/contents/ContentsDetailAdapter.java
  7. 48 9
      app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/contents/ContentsDetailFragment.java
  8. 5 3
      app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/contents/ContentsDetailListicleCoverViewHolder.java
  9. 3 4
      app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/contents/ContentsDetailListicleDetailViewHolder.java
  10. 34 23
      app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/contents/ContentsDetailModel.java
  11. 179 4
      app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/contents/ContentsDetailPresenter.java
  12. 13 1
      app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/contents/ContentsDetailSeriesViewHolder.java
  13. 17 3
      app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/contents/ContentsDetailView.java
  14. 8 1
      app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/contents/ContentsDetailWithShownViewHolder.java
  15. 3 2
      app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/contents/IContentsDetailView.java
  16. 1 1
      app/src/sandbox/java/kr/co/zumo/app/lifeplus/network/api/LifeplusAPIService.java

+ 5 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/bean/api/ContentsDetailBean.java

@@ -18,6 +18,11 @@ import java.util.List;
  * @since 2018. 11. 22.
  */
 public class ContentsDetailBean extends LifeplusContentsBean {
+
+  public final static String TYPE_LISTICLE = "01";
+  public final static String TYPE_CARD_LISTICLE = "02";
+  public final static String TYPE_CARD = "03";
+
   @SerializedName("listType")
   private String listType;
   @SerializedName("listAttrType")

+ 4 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/view/Event.java

@@ -153,6 +153,10 @@ public class Event {
   public static final int CONTENTS_LIKE = 1020;
   public static final int CONTENTS_BOOKMARK = 1021;
   public static final int POLICY_DETAIL = 1022;
+  public static final int LOADED_RECOMMEND = 1023;
+  public static final int LOADED_BANNER = 1024;
+  public static final int LOADED_CONTENTS = 1025;
+  public static final int LOADED_DETAIL = 1026;
 
   // boolean
   public static final String TRUE = "TRUE";

+ 8 - 9
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/category/CategoryMainModel.java

@@ -40,11 +40,6 @@ import kr.co.zumo.app.lifeplus.view.Event;
  */
 public abstract class CategoryMainModel extends Model {
 
-  public static final int LOADED_RECOMMEND = 0;
-  public static final int LOADED_BANNER = 1;
-  public static final int LOADED_CONTENTS = 2;
-  public static final int LOADED_DETAIL = 3;
-
   private Disposable disposableBanner;
   private Disposable disposableContents;
   private Disposable disposableRecommend;
@@ -107,6 +102,10 @@ public abstract class CategoryMainModel extends Model {
       disposableContents.dispose();
       disposableContents = null;
     }
+    if (null != disposableDetail) {
+      disposableDetail.dispose();
+      disposableDetail = null;
+    }
   }
 
   /**
@@ -135,7 +134,7 @@ public abstract class CategoryMainModel extends Model {
       public void onApiSuccess(CategoryRecommendResultBean resultBean) {
         recommendBeans = resultBean.getData();
 
-        onResult(new Event.Builder(Event.SUCCESS).index(LOADED_RECOMMEND).build());
+        onResult(new Event.Builder(Event.SUCCESS).index(Event.LOADED_RECOMMEND).build());
       }
 
       @Override
@@ -163,7 +162,7 @@ public abstract class CategoryMainModel extends Model {
       public void onApiSuccess(CategoryBannerResultBean resultBean) {
         bannerBeans = resultBean.getData();
 
-        onResult(new Event.Builder(Event.SUCCESS).index(LOADED_BANNER).build());
+        onResult(new Event.Builder(Event.SUCCESS).index(Event.LOADED_BANNER).build());
       }
 
       @Override
@@ -193,7 +192,7 @@ public abstract class CategoryMainModel extends Model {
         contentsBeans = resultBean.getData();
         modifyContents(contentsBeans);
 
-        onResult(new Event.Builder(Event.SUCCESS).index(LOADED_CONTENTS).build());
+        onResult(new Event.Builder(Event.SUCCESS).index(Event.LOADED_CONTENTS).build());
       }
 
       @Override
@@ -221,7 +220,7 @@ public abstract class CategoryMainModel extends Model {
       public void onApiSuccess(ContentsDetailResultBean resultBean) {
         contentsDetailListBean = resultBean.getData();
 
-        onResult(new Event.Builder(Event.SUCCESS).index(LOADED_DETAIL).build());
+        onResult(new Event.Builder(Event.SUCCESS).index(Event.LOADED_DETAIL).build());
       }
 
       @Override

+ 15 - 9
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/category/CategoryMainPresenter.java

@@ -10,6 +10,8 @@ import kr.co.zumo.app.lifeplus.helper.ActionBarHelper;
 import kr.co.zumo.app.lifeplus.helper.DeliveryHelper;
 import kr.co.zumo.app.lifeplus.model.module.APICategoryContentsLoadModule;
 import kr.co.zumo.app.lifeplus.supervisor.ScreenID;
+import kr.co.zumo.app.lifeplus.util.AppUtil;
+import kr.co.zumo.app.lifeplus.util.StringUtil;
 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;
@@ -183,17 +185,16 @@ public abstract class CategoryMainPresenter<M extends CategoryMainModel, V exten
 
     switch (event.getEventId()) {
       case Event.SUCCESS:
-        if (event.getIndex() == CategoryMainModel.LOADED_RECOMMEND) {
+        if (event.getIndex() == Event.LOADED_RECOMMEND) {
           doubleChecker.checkSecond();
         }
-        else if (event.getIndex() == CategoryMainModel.LOADED_BANNER) {
+        else if (event.getIndex() == Event.LOADED_BANNER) {
           doubleCheckerBanner.checkSecond();
         }
-        else if (event.getIndex() == CategoryMainModel.LOADED_CONTENTS) {
+        else if (event.getIndex() == Event.LOADED_CONTENTS) {
           doubleCheckerContents.checkSecond();
         }
-        else if (event.getIndex() == CategoryMainModel.LOADED_DETAIL) {
-          // fixme 시리즈 뷰 테스트.
+        else if (event.getIndex() == Event.LOADED_DETAIL) {
           if (null != model.getContentsDetailListBean()
             && null != model.getContentsDetailListBean().getSeriesItemList()
             && model.getContentsDetailListBean().getSeriesItemList().size() > 0) {
@@ -208,20 +209,25 @@ public abstract class CategoryMainPresenter<M extends CategoryMainModel, V exten
             Log.w("APP# CategoryMainPresenter | onResult", "|" + " contents             --> ");
 
             setContentsHelper(model.getSelectedRecommendBean());
-            go(ScreenID.CONTENTS);
+            if (StringUtil.getPureVersionString(AppUtil.getVersionName()).equals("4.0.0.19")) {
+              go(ScreenID.CONTENTS_NATIVE);
+            }
+            else {
+              go(ScreenID.CONTENTS);
+            }
           }
         }
 
         break;
       case Event.ERROR:
-        if (event.getIndex() == CategoryMainModel.LOADED_RECOMMEND) {
+        if (event.getIndex() == Event.LOADED_RECOMMEND) {
           doubleChecker.checkSecond();
           view.hideRecommendArea();
         }
-        else if (event.getIndex() == CategoryMainModel.LOADED_BANNER) {
+        else if (event.getIndex() == Event.LOADED_BANNER) {
           doubleCheckerBanner.checkSecond();
         }
-        else if (event.getIndex() == CategoryMainModel.LOADED_CONTENTS) {
+        else if (event.getIndex() == Event.LOADED_CONTENTS) {
           doubleCheckerContents.checkSecond();
         }
         showErrorDialog(event.getString());

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

@@ -45,8 +45,8 @@ import kr.co.zumo.app.lifeplus.view.presenter.Presenter;
  */
 public abstract class ContentsBasePresenter<M extends ContentsModel, V extends IContentsView> extends Presenter<M, V> {
 
-  private DialogBase reviewDialog;
-  private Share share;
+  protected DialogBase reviewDialog;
+  protected Share share;
 
   public ContentsBasePresenter(M model, V view) {
     super(model, view);
@@ -121,12 +121,18 @@ public abstract class ContentsBasePresenter<M extends ContentsModel, V extends I
         else if (subId == Event.CONTENTS_BOOKMARK) {
           view.setBookmarked(requestedChecked);
         }
+        else {
+          onContentsResultInternal(event);
+        }
         break;
       case Event.ERROR:
         if (subId == Event.CONTENTS_LIKE) {
         }
         else if (subId == Event.CONTENTS_BOOKMARK) {
         }
+        else {
+          onContentsResultInternal(event);
+        }
         showErrorDialog(event.getString());
         break;
       default:

+ 63 - 17
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/contents/ContentsDetailAdapter.java

@@ -7,7 +7,11 @@ import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 
+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.bean.api.SeriesItemBean;
 import kr.co.zumo.app.lifeplus.view.IEventListener;
 
 /**
@@ -25,21 +29,29 @@ public class ContentsDetailAdapter extends RecyclerView.Adapter<ContentsDetailVi
   private Context context;
   private LayoutInflater inflater;
   private IEventListener listener;
+  private List<ContentsDetailBean> contentsDetailBeans;
+  private List<SeriesItemBean> seriesItemBeans;
+  private String listType = ContentsDetailBean.TYPE_CARD;
 
   private static final int LISTICLE_COVER = 0;
   private static final int LISTICLE_DETAIL = 1;
   private static final int SERIES = 2;
   private static final int WITH_SHOWN_CONTENTS = 3;
-  private static final int CARD_LISTILCE_COVER= 4;
+  private static final int CARD_LISTICLE_COVER = 4;
   private static final int CARD_DETAIL = 5;
-  private static final int CARD_LISTICLE_DETAIL= 5;
+  private static final int CARD_LISTICLE_DETAIL = 5;
 
 
-  public ContentsDetailAdapter(Context context, IEventListener listener) {
+  public ContentsDetailAdapter(Context context, List<ContentsDetailBean> contentsDetailBeans, List<SeriesItemBean> seriesItemBeans, IEventListener listener) {
     this.context = context;
     this.listener = listener;
     this.inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+    this.contentsDetailBeans = contentsDetailBeans;
+    this.seriesItemBeans = seriesItemBeans;
 
+    if (null != contentsDetailBeans && null != contentsDetailBeans.get(0)) {
+      listType = contentsDetailBeans.get(0).getListType();
+    }
   }
 
   @NonNull
@@ -67,30 +79,64 @@ public class ContentsDetailAdapter extends RecyclerView.Adapter<ContentsDetailVi
 
   @Override
   public void onBindViewHolder(@NonNull ContentsDetailView holder, int position) {
-    holder.bind();
+    ContentsDetailBean bean = contentsDetailBeans.get(position);
+    holder.bind(position, bean, event -> {
+      listener.onEvent(event);
+    });
   }
 
   @Override
   public int getItemCount() {
-    return 4;
+    if (null == contentsDetailBeans) {
+      return 0;
+    }
+    return contentsDetailBeans.size() + (hasSeries() ? 1 : 0);
+  }
+
+  protected boolean hasSeries() {
+    return (null != seriesItemBeans) && seriesItemBeans.size() > 0;
   }
 
   @Override
   public int getItemViewType(int position) {
-    switch (position) {
-      case 0:
-        return LISTICLE_COVER;
-      case 1:
-        return LISTICLE_DETAIL;
-      case 2:
-        return SERIES;
-      case 3:
-        return WITH_SHOWN_CONTENTS;
-      default:
-        break;
+    int type = CARD_LISTICLE_COVER;
 
+    if (hasSeries() && getItemCount() == position) {
+      // 시리즈 페이지
+      type = SERIES;
+    }
+    else if (position == 0) {
+      // cover
+      switch (listType) {
+        case ContentsDetailBean.TYPE_LISTICLE:
+          type = LISTICLE_COVER;
+          break;
+        case ContentsDetailBean.TYPE_CARD_LISTICLE:
+          /* falls through */
+        case ContentsDetailBean.TYPE_CARD:
+          type = CARD_LISTICLE_COVER;
+          break;
+        default:
+          break;
+      }
+    }
+    else {
+      // contents
+      switch (listType) {
+        case ContentsDetailBean.TYPE_LISTICLE:
+          type = LISTICLE_DETAIL;
+          break;
+        case ContentsDetailBean.TYPE_CARD_LISTICLE:
+          type = CARD_LISTICLE_DETAIL;
+          break;
+        case ContentsDetailBean.TYPE_CARD:
+          type = CARD_DETAIL;
+          break;
+        default:
+          break;
+      }
     }
-    return 0;
+    return type;
   }
 
   @Override

+ 48 - 9
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/contents/ContentsDetailFragment.java

@@ -9,7 +9,12 @@ import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 
+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.bean.api.ContentsDetailListBean;
+import kr.co.zumo.app.lifeplus.bean.api.SeriesItemBean;
 import kr.co.zumo.app.lifeplus.helper.ActionBarHelper;
 import kr.co.zumo.app.lifeplus.view.Event;
 import kr.co.zumo.app.lifeplus.view.IEventListener;
@@ -38,16 +43,8 @@ public class ContentsDetailFragment extends FragmentBase<ContentsDetailPresenter
   @Override
   protected void onAfterActivityCreated(Bundle savedInstanceState) {
     recyclerViewContentsDetail = findViewById(R.id.recycler_view_contents_detail);
-    ContentsDetailAdapter adapter = new ContentsDetailAdapter(getActivity(), new IEventListener() {
-      @Override
-      public void onEvent(Event event) {
-
-      }
-    });
-    Snapper snapper = new Snapper(recyclerViewContentsDetail, 400);
+    Snapper snapper = new Snapper(recyclerViewContentsDetail, 800);
     snapper.attachToRecyclerView(recyclerViewContentsDetail);
-    recyclerViewContentsDetail.setLayoutManager(new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL, false));
-    recyclerViewContentsDetail.setAdapter(adapter);
   }
 
   @Override
@@ -83,4 +80,46 @@ public class ContentsDetailFragment extends FragmentBase<ContentsDetailPresenter
   protected boolean isSkipScreenWhenBack() {
     return false;
   }
+
+  @Override
+  public void goGooglePlay() {
+
+  }
+
+  @Override
+  public void render(String url) {
+
+  }
+
+  @Override
+  public void setLiked(boolean isChecked) {
+
+  }
+
+  @Override
+  public void setBookmarked(boolean isChecked) {
+
+  }
+
+  @Override
+  public void setTooltip() {
+
+  }
+
+  @Override
+  public void draw(ContentsDetailListBean contentsDetailListBean) {
+    List<ContentsDetailBean> contentsDetailBeans = contentsDetailListBean.getItemDetailList();
+    List<SeriesItemBean> seriesItemBeans = contentsDetailListBean.getSeriesItemList();
+
+    ContentsDetailAdapter adapter = new ContentsDetailAdapter(getActivity(), contentsDetailBeans, seriesItemBeans, new IEventListener() {
+      @Override
+      public void onEvent(Event event) {
+
+      }
+    });
+
+
+    recyclerViewContentsDetail.setLayoutManager(new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL, false));
+    recyclerViewContentsDetail.setAdapter(adapter);
+  }
 }

+ 5 - 3
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/contents/ContentsDetailListicleCoverViewHolder.java

@@ -5,6 +5,7 @@ import android.widget.ImageView;
 import android.widget.TextView;
 
 import kr.co.zumo.app.R;
+import kr.co.zumo.app.lifeplus.bean.api.ContentsDetailBean;
 
 /**
  * ContentsDetailListicleCoverViewHolder
@@ -16,7 +17,7 @@ import kr.co.zumo.app.R;
  * @history 하세미   [2018-11-27]   [최초 작성]
  * @since 2018-11-27
  */
-public class ContentsDetailListicleCoverViewHolder extends ContentsDetailView {
+public class ContentsDetailListicleCoverViewHolder extends ContentsDetailView<ContentsDetailBean> {
 
   private ImageView imageViewBackground;
   private TextView textViewCategory1;
@@ -39,7 +40,8 @@ public class ContentsDetailListicleCoverViewHolder extends ContentsDetailView {
   }
 
   @Override
-  public void bind() {
+  protected void bindInternal() {
+
     imageViewBackground.setImageDrawable(itemView.getResources().getDrawable(R.drawable.banner_bg_1));
     textViewCategory1.setText("시리즈");
     textViewCategory2.setText("이색적인 카페 탐방기");
@@ -50,8 +52,8 @@ public class ContentsDetailListicleCoverViewHolder extends ContentsDetailView {
     textViewTag2.setText("#인생샷");
   }
 
+
   @Override
   public void dispose() {
-    super.dispose();
   }
 }

+ 3 - 4
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/contents/ContentsDetailListicleDetailViewHolder.java

@@ -8,6 +8,7 @@ import java.util.List;
 
 import kr.co.zumo.app.R;
 import kr.co.zumo.app.lifeplus.bean.TextImageBean;
+import kr.co.zumo.app.lifeplus.bean.api.ContentsDetailBean;
 import kr.co.zumo.app.lifeplus.view.Event;
 import kr.co.zumo.app.lifeplus.view.IEventListener;
 import kr.co.zumo.app.lifeplus.view.custom.contents.CustomListicleImageView;
@@ -23,12 +24,11 @@ import kr.co.zumo.app.lifeplus.view.custom.contents.CustomListicleInformationVie
  * @history 하세미   [2018-11-27]   [최초 작성]
  * @since 2018-11-27
  */
-public class ContentsDetailListicleDetailViewHolder extends ContentsDetailView {
+public class ContentsDetailListicleDetailViewHolder extends ContentsDetailView<ContentsDetailBean> {
 
   private CustomListicleImageView customListicleImageView;
   private LinearLayout layoutContainer;
 
-
   public ContentsDetailListicleDetailViewHolder(View itemView) {
     super(itemView);
     customListicleImageView = itemView.findViewById(R.id.custom_listicle_image_view);
@@ -37,7 +37,7 @@ public class ContentsDetailListicleDetailViewHolder extends ContentsDetailView {
   }
 
   @Override
-  public void bind() {
+  protected void bindInternal() {
 
     List<TextImageBean> textImageBeans = new ArrayList<>();
     textImageBeans.add(new TextImageBean(R.drawable.img_bestbucket_banner_1, R.string.life_plus));
@@ -61,6 +61,5 @@ public class ContentsDetailListicleDetailViewHolder extends ContentsDetailView {
 
   @Override
   public void dispose() {
-    super.dispose();
   }
 }

+ 34 - 23
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/contents/ContentsDetailModel.java

@@ -1,6 +1,12 @@
 package kr.co.zumo.app.lifeplus.view.screen.contents;
 
-import kr.co.zumo.app.lifeplus.model.Model;
+import io.reactivex.disposables.Disposable;
+import kr.co.zumo.app.lifeplus.bean.api.ContentsDetailListBean;
+import kr.co.zumo.app.lifeplus.bean.api.ContentsDetailResultBean;
+import kr.co.zumo.app.lifeplus.bean.api.StringRequestBean;
+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;
 
 /**
  * ContentsDetailModel
@@ -12,39 +18,44 @@ import kr.co.zumo.app.lifeplus.model.Model;
  * @history 하세미   [2018-11-27]   [최초 작성]
  * @since 2018-11-27
  */
-public class ContentsDetailModel extends Model {
-  @Override
-  protected void createViewInternal() {
+public class ContentsDetailModel extends ContentsModel {
 
-  }
+  private Disposable disposableDetail;
+  private ContentsDetailListBean contentsDetailListBean;
 
   @Override
-  protected void destroyInternal() {
+  protected void stopLoadingInternal() {
 
+    if (null != disposableDetail) {
+      disposableDetail.dispose();
+      disposableDetail = null;
+    }
   }
 
-  @Override
-  protected void destroyViewInternal() {
-
-  }
-
-  @Override
-  protected void startInternal() {
-
+  public ContentsDetailListBean getContentsDetailListBean() {
+    return contentsDetailListBean;
   }
 
-  @Override
-  protected void stopInternal() {
+  public void loadDetail() {
+    String itemNumber = contentsBean.getItemNumber();
 
-  }
+    disposableDetail = new APIContentsDetailModule().call(new StringRequestBean(itemNumber), new IAPIModuleListener<ContentsDetailResultBean>() {
+      @Override
+      public void onApiSuccess(ContentsDetailResultBean resultBean) {
+        contentsDetailListBean = resultBean.getData();
 
-  @Override
-  protected void resumeInternal() {
+        onResult(new Event.Builder(Event.SUCCESS).index(Event.LOADED_DETAIL).build());
+      }
 
-  }
-
-  @Override
-  protected void pauseInternal() {
+      @Override
+      public void onApiReason(ContentsDetailResultBean resultBean) {
+        onResult(new Event.Builder(Event.ERROR).index(Event.LOADED_DETAIL).string(resultBean.getReturnMessage()).build());
+      }
 
+      @Override
+      public void onApiError(String errorMessage) {
+        onResult(new Event.Builder(Event.ERROR).index(Event.LOADED_DETAIL).string(errorMessage).build());
+      }
+    });
   }
 }

+ 179 - 4
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/contents/ContentsDetailPresenter.java

@@ -1,7 +1,20 @@
 package kr.co.zumo.app.lifeplus.view.screen.contents;
 
+import kr.co.zumo.app.R;
+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.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.presenter.Presenter;
+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.DialogBuilder;
+import kr.co.zumo.app.lifeplus.view.dialog.DialogID;
+import kr.co.zumo.app.lifeplus.view.dialog.ICustomConfirmListener;
+import kr.co.zumo.app.lifeplus.view.dialog.ICustomDialogListener;
+import kr.co.zumo.app.lifeplus.view.dialog.TooltipDialog;
 
 /**
  * ContentsDetailPresenter
@@ -13,11 +26,20 @@ import kr.co.zumo.app.lifeplus.view.presenter.Presenter;
  * @history 하세미   [2018-11-27]   [최초 작성]
  * @since 2018-11-27
  */
-public class ContentsDetailPresenter extends Presenter<ContentsDetailModel, IContentsDetailView> {
+public class ContentsDetailPresenter extends ContentsBasePresenter<ContentsDetailModel, IContentsDetailView> {
 
+  private DoubleChecker doubleChecker;
 
   public ContentsDetailPresenter(ContentsDetailModel model, IContentsDetailView view) {
     super(model, view);
+
+    doubleChecker = new DoubleChecker(this::render);
+
+    this.model.loadDetail();
+  }
+
+  private void render() {
+    view.draw(model.getContentsDetailListBean());
   }
 
   @Override
@@ -37,6 +59,12 @@ public class ContentsDetailPresenter extends Presenter<ContentsDetailModel, ICon
 
   @Override
   protected void startInternal() {
+    super.startInternal();
+
+    if (null != model.getContentsBean()) {
+      view.setLiked(model.isLiked());
+      view.setBookmarked(model.isBookmarked());
+    }
 
   }
 
@@ -57,7 +85,8 @@ public class ContentsDetailPresenter extends Presenter<ContentsDetailModel, ICon
 
   @Override
   public boolean onBackPressed() {
-    return false;
+    back(ScreenID.MAIN);
+    return true;
   }
 
   @Override
@@ -68,10 +97,156 @@ public class ContentsDetailPresenter extends Presenter<ContentsDetailModel, ICon
   @Override
   public void onScreenReady() {
 
+    doubleChecker.checkFirst();
+
+    view.setLiked(model.isLiked());
+    view.setBookmarked(model.isBookmarked());
+
+    /**
+     * fixme 조건 변경 -> 5회 이상 진입 + 마지막 페이지 일 경우.
+     */
+    int count = model.getCountForReview();
+    if (count < 100) {
+      ++count;
+      model.setCountForReview(count);
+      if (count == 3) {
+        model.setCountForReview(100);
+        reviewDialog = new DialogBuilder<AppReviewDialog, ICustomDialogListener>(getFragmentManager(), DialogID.APP_REVIEW)
+          .listener(new ICustomDialogListener<AppReviewDialog>() {
+            @Override
+            public void onDialogResult(AppReviewDialog dialog, Event event) {
+              switch (event.getEventId()) {
+                case Event.ADD:
+                  view.goGooglePlay();
+                  break;
+                default:
+                  break;
+              }
+            }
+
+            @Override
+            public void onDialogCanceled(AppReviewDialog dialog) {
+              dialog.dispose();
+            }
+          })
+          .show();
+      }
+    }
+
   }
 
   @Override
-  public void onResult(Event event) {
+  protected void onContentsResultInternal(Event event) {
+    switch (event.getEventId()) {
+      case Event.SUCCESS:
+        if (event.getIndex() == Event.LOADED_DETAIL) {
+          doubleChecker.checkSecond();
+        }
+        break;
+      case Event.ERROR:
+        if (event.getIndex() == Event.LOADED_DETAIL) {
+          // 다이얼로그는 parent 에서 보여줌.
+        }
+        break;
+      default:
+        break;
+    }
+  }
+
+  /**
+   * 닷닷닷 메뉴
+   *
+   * @param actionBar
+   */
+  public void onNavigationClickDotDotDot(NavigationBar actionBar) {
+    showTooltipDialog();
+  }
 
+  /**
+   * 좋아요 클릭
+   *
+   * @param navigationBar
+   */
+  public void onNavigationClickLike(NavigationBar navigationBar) {
+    model.updateLiked();
   }
+
+  /**
+   * 북마크 클릭
+   *
+   * @param navigationBar
+   */
+  public void onNavigationClickBookmark(NavigationBar navigationBar) {
+    if (model.isMember()) {
+      model.updateBookmarked();
+    }
+    else {
+      showPopupForGuest();
+    }
+  }
+
+  /**
+   * 공유 클릭
+   *
+   * @param navigationBar
+   */
+  public void onNavigationClickShare(NavigationBar navigationBar) {
+    showShareDialog();
+  }
+
+  protected void showPopupForGuest() {
+    // 비회원 가입 유도
+    new DialogBuilder<ConfirmDialog, ICustomConfirmListener>(getFragmentManager(), DialogID.CONFIRM)
+      .listener(new ICustomConfirmListener<ConfirmDialog>() {
+        @Override
+        public void onPositiveResult(ConfirmDialog dialog, Event event) {
+          dialog.dispose();
+          go(ScreenID.SIGN_UP_START);
+        }
+
+        @Override
+        public void onNegativeResult(ConfirmDialog dialog, Event event) {
+          dialog.dispose();
+
+        }
+
+        @Override
+        public void onDialogCanceled(ConfirmDialog dialog) {
+          dialog.dispose();
+
+        }
+      })
+      .attribute(dialog -> {
+        dialog.setText(ResourceUtil.getString(R.string.best_bucket_guest_guide));
+        dialog.setPositiveButtonLabelId(R.string.member_confirm);
+      })
+      .show();
+  }
+
+  protected void showTooltipDialog() {
+    new DialogBuilder<TooltipDialog, ICustomDialogListener>(getFragmentManager(), DialogID.TOOL_TIP)
+      .listener(new ICustomDialogListener<TooltipDialog>() {
+
+        @Override
+        public void onDialogResult(TooltipDialog dialog, Event event) {
+          if (event.getEventId() == Event.OVER_VIEW) {
+            dialog.dispose();
+
+            DeliveryHelper deliveryHelper = getHelper(DeliveryHelper.class);
+            deliveryHelper.setPackaging(new ContentsDeliveryBean.Builder(model.getContentsBean()).build());
+
+            go(ScreenID.OVER_VIEW);
+          }
+        }
+
+        @Override
+        public void onDialogCanceled(TooltipDialog dialog) {
+
+        }
+      })
+      .attribute(dialog -> {
+      })
+      .show();
+  }
+
 }

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

@@ -2,6 +2,8 @@ package kr.co.zumo.app.lifeplus.view.screen.contents;
 
 import android.view.View;
 
+import kr.co.zumo.app.lifeplus.bean.api.SeriesItemBean;
+
 /**
  * ContentsDetailSeriesViewHolder
  * <pre>
@@ -12,8 +14,18 @@ import android.view.View;
  * @history 하세미   [2018-11-28]   [최초 작성]
  * @since 2018-11-28
  */
-public class ContentsDetailSeriesViewHolder extends ContentsDetailView {
+public class ContentsDetailSeriesViewHolder extends ContentsDetailView<SeriesItemBean> {
   public ContentsDetailSeriesViewHolder(View itemView) {
     super(itemView);
   }
+
+  @Override
+  protected void bindInternal() {
+
+  }
+
+  @Override
+  public void dispose() {
+
+  }
 }

+ 17 - 3
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/contents/ContentsDetailView.java

@@ -3,6 +3,9 @@ package kr.co.zumo.app.lifeplus.view.screen.contents;
 import android.support.v7.widget.RecyclerView;
 import android.view.View;
 
+import kr.co.zumo.app.lifeplus.bean.api.LifeplusContentsBean;
+import kr.co.zumo.app.lifeplus.view.IEventListener;
+
 /**
  * ContentsDetailView
  * <pre>
@@ -13,13 +16,24 @@ import android.view.View;
  * @history 하세미   [2018-11-27]   [최초 작성]
  * @since 2018-11-27
  */
-public class ContentsDetailView extends RecyclerView.ViewHolder {
+public abstract class ContentsDetailView<T extends LifeplusContentsBean> extends RecyclerView.ViewHolder {
+
+  protected T bean;
+  protected int index;
+  protected IEventListener listener;
 
   public ContentsDetailView(View itemView) {
     super(itemView);
   }
 
-  public void bind(){}
+  public final void bind(int index, T bean, IEventListener listener) {
+    this.index = index;
+    this.bean = bean;
+    this.listener = listener;
+
+    bindInternal();
+  }
+  protected abstract void bindInternal();
 
-  public void dispose(){}
+  public abstract void dispose();
 }

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

@@ -7,6 +7,7 @@ import android.view.MotionEvent;
 import android.view.View;
 
 import kr.co.zumo.app.R;
+import kr.co.zumo.app.lifeplus.bean.api.LifeplusContentsBean;
 import kr.co.zumo.app.lifeplus.util.ResourceUtil;
 import kr.co.zumo.app.lifeplus.view.Event;
 import kr.co.zumo.app.lifeplus.view.IEventListener;
@@ -35,7 +36,8 @@ public class ContentsDetailWithShownViewHolder extends ContentsDetailView {
   }
 
   @Override
-  public void bind() {
+  public void bindInternal() {
+
     ShownWithContentsAdapter shownWithContentsAdapter = new ShownWithContentsAdapter(itemView.getContext(), new IEventListener() {
       @Override
       public void onEvent(Event event) {
@@ -84,4 +86,9 @@ public class ContentsDetailWithShownViewHolder extends ContentsDetailView {
     });
     recyclerViewWithShownContents.addItemDecoration(new MainBannerViewItemDotIndicator(itemView.getContext(), R.color.C19000000, R.color.C000000, ResourceUtil.dpToPx(74)));
   }
+
+  @Override
+  public void dispose() {
+
+  }
 }

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

@@ -1,6 +1,6 @@
 package kr.co.zumo.app.lifeplus.view.screen.contents;
 
-import kr.co.zumo.app.lifeplus.view.IView;
+import kr.co.zumo.app.lifeplus.bean.api.ContentsDetailListBean;
 
 /**
  * IContentsDetailView
@@ -12,5 +12,6 @@ import kr.co.zumo.app.lifeplus.view.IView;
  * @history 하세미   [2018-11-27]   [최초 작성]
  * @since 2018-11-27
  */
-public interface IContentsDetailView extends IView {
+public interface IContentsDetailView extends IContentsView {
+  void draw(ContentsDetailListBean contentsDetailListBean);
 }

文件差异内容过多而无法显示
+ 1 - 1
app/src/sandbox/java/kr/co/zumo/app/lifeplus/network/api/LifeplusAPIService.java