Browse Source

[컨텐츠][New] 좋아요/북마크 페이지별로 처리

hyodong.min 7 years ago
parent
commit
fb50611f1b

+ 188 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/bean/api/ContentsItemAdapterBean.java

@@ -0,0 +1,188 @@
+/*
+ * COPYRIGHT (c) 2018 All rights reserved by HANWHA LIFE.
+ */
+package kr.co.zumo.app.lifeplus.bean.api;
+
+import kr.co.zumo.app.lifeplus.supervisor.IFlags;
+
+/**
+ * ContentsItemBean
+ * - Object linking 을 위해서 ContentsItemBean 과 LifeplusContentsBean 을 합성
+ * <pre>
+ * </pre>
+ *
+ * @author 민효동
+ * @version 1.0
+ * @history 민효동   [2018. 11. 22.]   [최초 작성]
+ * @since 2018. 11. 22.
+ */
+public class ContentsItemAdapterBean extends ContentsItemBean {
+
+  private LifeplusContentsBean lifeplusContentsBean;
+
+  public ContentsItemAdapterBean(LifeplusContentsBean lifeplusContentsBean) {
+    this.lifeplusContentsBean = lifeplusContentsBean;
+  }
+
+  @Override
+  public String getItemNo() {
+    return lifeplusContentsBean.getContentsNo();
+  }
+
+  @Override
+  public void setItemNo(String itemNo) {
+    lifeplusContentsBean.setContentsNo(itemNo);
+  }
+
+  /**
+   * 좋아요 등 업데이트
+   */
+  @Override
+  public void updateLike(IFlags flags) {
+    lifeplusContentsBean.updateLike(flags);
+  }
+
+  /**
+   * 북마크 등 업데이트
+   */
+  @Override
+  public void updateBookmark(IFlags flags) {
+    lifeplusContentsBean.updateBookmark(flags);
+  }
+
+  /**
+   * 이미지 리스트 중에서 첫 번째 것을 가져온다.
+   *
+   * @return
+   */
+  @Override
+  public String getImageUrl() {
+    return lifeplusContentsBean.getImageUrl();
+  }
+
+  /**
+   * 전체보기 용 이미지를 반환
+   * - 없을 경우 기본 이미지를 반환한다.
+   *
+   * @return
+   */
+  public String getOverviewImageUrl() {
+    return getImageUrl();
+  }
+
+  public String getContentsNo() {
+    return lifeplusContentsBean.getContentsNo();
+  }
+
+  public void setContentsNo(String contentsNo) {
+    lifeplusContentsBean.setContentsNo(contentsNo);
+  }
+
+  public String getTitle() {
+    return lifeplusContentsBean.getTitle();
+  }
+
+  public void setTitle(String title) {
+    lifeplusContentsBean.setTitle(title);
+  }
+
+  public String getSubTitle() {
+    return lifeplusContentsBean.getSubTitle();
+  }
+
+  public void setSubTitle(String subTitle) {
+    lifeplusContentsBean.setSubTitle(subTitle);
+  }
+
+  public String getImageName() {
+    return lifeplusContentsBean.getImageName();
+  }
+
+  public void setImageName(String imageName) {
+    lifeplusContentsBean.setImageName(imageName);
+  }
+
+  public String getContentsUrl() {
+    return lifeplusContentsBean.getContentsUrl();
+  }
+
+  public void setContentsUrl(String contentsUrl) {
+    lifeplusContentsBean.setContentsUrl(contentsUrl);
+  }
+
+  public boolean isLiked() {
+    return lifeplusContentsBean.isLiked();
+  }
+
+  public void setLiked(boolean liked) {
+    lifeplusContentsBean.setLiked(liked);
+  }
+
+  public boolean isBookmarked() {
+    return lifeplusContentsBean.isBookmarked();
+  }
+
+  public void setBookmarked(boolean bookmarked) {
+    lifeplusContentsBean.setBookmarked(bookmarked);
+  }
+
+  public int getPageIndex() {
+    return lifeplusContentsBean.getPageIndex();
+  }
+
+  public void setPageIndex(int pageIndex) {
+    lifeplusContentsBean.setPageIndex(pageIndex);
+  }
+
+  /**
+   * Web View 에서 표시할 url
+   *
+   * @return
+   */
+  public String getContentsUrlWithParam() {
+    return lifeplusContentsBean.getContentsUrlWithParam();
+  }
+
+  /**
+   * 공유 형식에 맞게 변형된 contents url
+   *
+   * @param pageIndex
+   * @return
+   */
+  public String getContentsUrlWithParamForShare(int pageIndex) {
+    return lifeplusContentsBean.getContentsUrlWithParamForShare(pageIndex);
+  }
+
+  /**
+   * 좌우 공백 및 개행 문자, 이중 공백 등 제거된 title
+   *
+   * @return
+   */
+  public String getTitleWithTrim() {
+    return lifeplusContentsBean.getTitleWithTrim();
+  }
+
+  /**
+   * 좌우 공백 및 개행 문자, 이중 공백 등 제거된 sub title
+   *
+   * @return
+   */
+  public String getSubTitleWithTrim() {
+    return lifeplusContentsBean.getSubTitleWithTrim();
+  }
+
+//  public String getSubTitleForWordWrap() {
+  // 워드랩을 방해하는 특수 문자
+//    return subTitle.replace("\u00A0", " ");
+//  }
+
+  /**
+   * 2줄로 개행한 타이틀
+   *
+   * @return
+   */
+  public String getTwoLineTitle() {
+    return lifeplusContentsBean.getTwoLineTitle();
+  }
+
+}

+ 2 - 11
app/src/main/java/kr/co/zumo/app/lifeplus/bean/api/ContentsItemBean.java

@@ -82,7 +82,7 @@ public class ContentsItemBean extends LifeplusContentsBean {
    */
   @Override
   public void updateBookmark(IFlags flags) {
-    setBookmarked(flags.isBookmarked(getContentsNo()));
+    setBookmarked(flags.isBookmarked(getItemNo()));
   }
 
   /**
@@ -233,15 +233,6 @@ public class ContentsItemBean extends LifeplusContentsBean {
   }
 
   public static ContentsItemBean toBean(LifeplusContentsBean lifeplusContentsBean) {
-    ContentsItemBean bean = new ContentsItemBean();
-    if (null != lifeplusContentsBean) {
-      bean.setContentsNo(lifeplusContentsBean.getContentsNo());
-      bean.setTitle(lifeplusContentsBean.getTitle());
-      bean.setSubTitle(lifeplusContentsBean.getSubTitle());
-      bean.setContentsUrl(lifeplusContentsBean.getContentsUrl());
-      bean.setImageUrl(lifeplusContentsBean.getImageUrl());
-      bean.setImageName(lifeplusContentsBean.getImageName());
-    }
-    return bean;
+    return new ContentsItemAdapterBean(lifeplusContentsBean);
   }
 }

+ 61 - 26
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/contents/ContentsBaseModel.java

@@ -42,7 +42,7 @@ public abstract class ContentsBaseModel extends Model {
 
   protected LifeplusContentsBean contentsBean;
 
-  private GuestLikedManager guestLikedManager;
+  protected GuestLikedManager guestLikedManager;
 
   protected int currentPageIndex = 0;
 
@@ -120,6 +120,30 @@ public abstract class ContentsBaseModel extends Model {
    */
   public abstract ContentsItemBean getShareContents();
 
+  /**
+   * 좋아요/북마크를 처리하기 위한 페이지 인덱스
+   *
+   * @return
+   */
+  public abstract int getItemIndex();
+
+  /**
+   * 좋아요/북마크를 처리하기 위한 page(item) 데이터
+   *
+   * @return
+   */
+  public abstract ContentsItemBean getCurrentItem();
+
+  /**
+   * DeliveryHelper 로 전달된 데이터를 저장한다.
+   *
+   * @param bean
+   */
+  public void setContentsBean(LifeplusContentsBean bean) {
+    this.contentsBean = bean;
+    currentPageIndex = bean.getPageIndex();
+  }
+
   /**
    * 컨텐츠 정보
    *
@@ -129,6 +153,10 @@ public abstract class ContentsBaseModel extends Model {
     return contentsBean;
   }
 
+  public String getContentsNo() {
+    return contentsBean.getContentsNo();
+  }
+
   public boolean isLiked() {
     return null != contentsBean && contentsBean.isLiked();
   }
@@ -137,46 +165,50 @@ public abstract class ContentsBaseModel extends Model {
     return null != contentsBean && contentsBean.isBookmarked();
   }
 
-  /**
-   * DeliveryHelper 로 전달된 데이터를 저장한다.
-   *
-   * @param bean
-   */
-  public void setContentsBean(LifeplusContentsBean bean) {
-    this.contentsBean = bean;
-    currentPageIndex = bean.getPageIndex();
+  public boolean isItemLiked() {
+    return getCurrentItem().isLiked();
+  }
 
-    if (isMember()) {
-      contentsBean.updateFlags(ContentsFlagHelper.getInstance());
+  public boolean isItemBookmarked() {
+    return getCurrentItem().isBookmarked();
+  }
+
+  protected void updateItemLiked(boolean isChecked) {
+    if (currentPageIndex == 0) {
+      contentsBean.setLiked(isChecked);
     }
-    else {
-      defineGuestLikeBean();
-      contentsBean.setLiked(guestLikedManager.isLiked(contentsBean.getContentsNo()));
+    getCurrentItem().setLiked(isChecked);
+  }
+
+  protected void updateItemBookmarked(boolean isChecked) {
+    if (currentPageIndex == 0) {
+      contentsBean.setBookmarked(isChecked);
     }
+    getCurrentItem().setBookmarked(isChecked);
   }
 
   /**
    * 비회원의 경우 좋아요 정보를 로컬에 저장해둔다.
    * - 가입 시 서버로 전송
    */
-  protected void updateGuestLiked(LifeplusContentsBean bean) {
+  protected void updateGuestLiked(ContentsItemBean bean) {
     defineGuestLikeBean();
 
     // toggle
     boolean toChecked = !bean.isLiked();
     bean.setLiked(toChecked);
     if (toChecked) {
-      guestLikedManager.addLiked(bean.getContentsNo());
+      guestLikedManager.addLiked(bean.getItemNo());
     }
     else {
-      guestLikedManager.removeLiked(bean.getContentsNo());
+      guestLikedManager.removeLiked(bean.getItemNo());
     }
 
     // for UI
     onResult(new Event.Builder(Event.SUCCESS).integer(Event.CONTENTS_LIKE).bool(toChecked).build());
   }
 
-  private void defineGuestLikeBean() {
+  protected void defineGuestLikeBean() {
     List<String> list = guestLikedManager.getLikedList();
     if (null == list) {
       GuestLikedListBean bean = getGuestLikedList();
@@ -217,18 +249,19 @@ public abstract class ContentsBaseModel extends Model {
   }
 
   private void updateLikedInternal() {
-    boolean toChecked = !contentsBean.isLiked();
-    disposableLiked = ContentsFlagHelper.getInstance().updateLiked(new ContentsFlagRequestBean(getUserName(), contentsBean.getContentsNo(), LifeplusData.valueOf(toChecked)), new APIModuleSimpleListener<LifeplusAPIBean>() {
+    ContentsItemBean bean = getCurrentItem();
+    boolean toChecked = !bean.isLiked();
+    Log.i("APP# ContentsBaseModel | updateLikedInternal", "|" + "bean.getItemNo(): " + bean.getItemNo());
+    disposableLiked = ContentsFlagHelper.getInstance().updateLiked(new ContentsFlagRequestBean(getUserName(), bean.getItemNo(), LifeplusData.valueOf(toChecked)), new APIModuleSimpleListener<LifeplusAPIBean>() {
       @Override
       public void onApiSuccess(LifeplusAPIBean resultBean) {
-        contentsBean.setLiked(toChecked);
+        updateItemLiked(toChecked);
         onResult(new Event.Builder(Event.SUCCESS).integer(Event.CONTENTS_LIKE).bool(toChecked).build());
       }
 
       @Override
       public void onApiError(String errorMessage, APIError error) {
         onResult(new Event.Builder(Event.ERROR).integer(Event.CONTENTS_LIKE).bool(toChecked).string(errorMessage).build());
-
       }
     });
 
@@ -242,16 +275,18 @@ public abstract class ContentsBaseModel extends Model {
     }
     else {
       // 비회원 좋아요
-      updateGuestLiked(contentsBean);
+      updateGuestLiked(getCurrentItem());
     }
   }
 
   public void updateBookmarked() {
-    boolean toChecked = !contentsBean.isBookmarked();
-    disposableBookmarked = ContentsFlagHelper.getInstance().updateBookmarked(new ContentsFlagRequestBean(getUserName(), contentsBean.getContentsNo(), LifeplusData.valueOf(toChecked)), new APIModuleSimpleListener<LifeplusAPIBean>() {
+    ContentsItemBean bean = getCurrentItem();
+    boolean toChecked = !bean.isBookmarked();
+    Log.i("APP# ContentsBaseModel | updateBookmarked", "|" + "bean.getItemNo(): " + bean.getItemNo());
+    disposableBookmarked = ContentsFlagHelper.getInstance().updateBookmarked(new ContentsFlagRequestBean(getUserName(), bean.getItemNo(), LifeplusData.valueOf(toChecked)), new APIModuleSimpleListener<LifeplusAPIBean>() {
       @Override
       public void onApiSuccess(LifeplusAPIBean resultBean) {
-        contentsBean.setBookmarked(toChecked);
+        updateItemBookmarked(toChecked);
         if (toChecked) {
           BookmarkModelHelper.getInstance().addBookmark(new BookmarkBean(contentsBean));
         }

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

@@ -82,7 +82,7 @@ public class ContentsModel extends ContentsBaseModel {
     /**
      * 카드 형은 항상 전체 공유, 그외는 페이지 분기
      */
-    if (ContentsItemBean.TYPE_CARD.equals(getContentsType())) {
+    if (isCardContents()) {
       return 0;
     }
     else {
@@ -99,6 +99,28 @@ public class ContentsModel extends ContentsBaseModel {
     return ContentsItemBean.toBean(contentsBean);
   }
 
+  @Override
+  public int getItemIndex() {
+    /**
+     * 카드 형은 항상 전체 공유, 그외는 페이지 분기
+     */
+    if (isCardContents()) {
+      return 0;
+    }
+    else {
+      return currentPageIndex;
+    }
+  }
+
+  @Override
+  public ContentsItemBean getCurrentItem() {
+    if (null != getFirstItem()) {
+      List<ContentsItemBean> list = contentsDetailListBean.getItemDetailList();
+      return list.get(getItemIndex());
+    }
+    return ContentsItemBean.toBean(contentsBean);
+  }
+
   @Override
   protected void stopLoadingInternal() {
 
@@ -131,9 +153,9 @@ public class ContentsModel extends ContentsBaseModel {
   }
 
   public void loadDetail() {
-    String itemNumber = contentsBean.getContentsNo();
+    String contentsNo = contentsBean.getContentsNo();
 
-    disposableDetail = new APIContentsDetailModule().call(new StringRequestBean(itemNumber), new APIModuleSimpleListener<ContentsDetailResultBean>(waiterCaller) {
+    disposableDetail = new APIContentsDetailModule().call(new StringRequestBean(contentsNo), new APIModuleSimpleListener<ContentsDetailResultBean>(waiterCaller) {
       @Override
       public void onApiSuccess(ContentsDetailResultBean resultBean) {
         contentsDetailListBean = resultBean.getData();
@@ -147,6 +169,23 @@ public class ContentsModel extends ContentsBaseModel {
           contentsBean.setImageUrl(contentsItemBean.getImageUrl());
         }
 
+        // 각 페이지(item) 별로
+        List<ContentsItemBean> list = contentsDetailListBean.getItemDetailList();
+        if (null != list) {
+          if (isMember()) {
+            for (ContentsItemBean itemBean : list) {
+              itemBean.updateLike(ContentsFlagHelper.getInstance());
+              itemBean.updateBookmark(ContentsFlagHelper.getInstance());
+            }
+          }
+          else {
+            defineGuestLikeBean();
+            for (ContentsItemBean itemBean : list) {
+              itemBean.setLiked(guestLikedManager.isLiked(contentsBean.getContentsNo()));
+            }
+          }
+        }
+
         Log.w("APP# ContentsModel | onApiSuccess", "|\n" + contentsDetailListBean.toPrettyJson());
 
         onResult(new Event.Builder(Event.SUCCESS).index(Event.LOADED_DETAIL).build());
@@ -179,7 +218,7 @@ public class ContentsModel extends ContentsBaseModel {
     }
     else {
       // 비회원 좋아요
-      updateGuestLiked(selectedSeriesItemBean);
+      updateGuestLiked(ContentsItemBean.toBean(selectedSeriesItemBean));
     }
   }
 

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

@@ -71,6 +71,22 @@ public class ContentsOverviewModel extends ContentsBaseModel {
     return ContentsItemBean.toBean(contentsBean);
   }
 
+  @Override
+  public int getItemIndex() {
+    return 0;
+  }
+
+  @Override
+  public ContentsItemBean getCurrentItem() {
+    if (null != contentsItemBeans) {
+      List<ContentsItemBean> list = contentsItemBeans;
+      if (list.size() > 0) {
+        return list.get(getItemIndex());
+      }
+    }
+    return ContentsItemBean.toBean(contentsBean);
+  }
+
   protected void stopLoadingInternal() {
     if (null != disposable) {
       disposable.dispose();

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

@@ -58,11 +58,16 @@ public class ContentsPresenter extends ContentsBasePresenter<ContentsModel, ICon
       String itemType = contentsItemBean.getItemType();
       if (StringUtil.isFull(itemType) && ContentsItemBean.ITEM_TYPE_LISTICLE.equalsIgnoreCase(itemType)) {
         String listType = contentsItemBean.getListType();
-        view.draw(model.getContentsBean().getContentsNo(), listType, model.getContentsDetailListBean());
+        view.draw(model.getContentsNo(), listType, model.getContentsDetailListBean());
 
         if (model.getCurrentPageIndex() > 0) {
           view.setScrollToPosition(model.getCurrentPageIndex());
         }
+        else {
+          view.setLiked(model.isItemLiked());
+          view.setBookmarked(model.isItemBookmarked());
+        }
+
       }
       else {
         Log.w("APP# ContentsPresenter | render", "|" + "invalid itemType -> " + itemType);
@@ -96,11 +101,6 @@ public class ContentsPresenter extends ContentsBasePresenter<ContentsModel, ICon
   protected void startInternal() {
     super.startInternal();
 
-    if (null != model.getContentsBean()) {
-      view.setLiked(model.isLiked());
-      view.setBookmarked(model.isBookmarked());
-    }
-
     // contents 화면에서 시리즈의 좋아요/북마크 변경했다면 view 업데이트
     if (model.hasFlagChanged()) {
       view.updateSeriesContents();
@@ -214,9 +214,6 @@ public class ContentsPresenter extends ContentsBasePresenter<ContentsModel, ICon
 
     doubleChecker.checkFirst();
 
-    view.setLiked(model.isLiked());
-    view.setBookmarked(model.isBookmarked());
-
     // -> 공유/북마크(페이지 단위)로 진입
     view.setVisibleDotDotDot(false);
 
@@ -390,6 +387,9 @@ public class ContentsPresenter extends ContentsBasePresenter<ContentsModel, ICon
           // 0 보다 크면 전체보기 버튼 노출
           view.setVisibleDotDotDot(currentIndex > 0);
         }
+
+        view.setLiked(model.isItemLiked());
+        view.setBookmarked(model.isItemBookmarked());
       });
     }
 

+ 10 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/contents/series/ContentsSeriesModel.java

@@ -63,6 +63,16 @@ public class ContentsSeriesModel extends ContentsBaseModel {
     return ContentsItemBean.toBean(seriesInfo);
   }
 
+  @Override
+  public int getItemIndex() {
+    return 0;
+  }
+
+  @Override
+  public ContentsItemBean getCurrentItem() {
+    return ContentsItemBean.toBean(seriesInfo);
+  }
+
   public void setContentsDetailListBean(ContentsDetailListBean contentsDetailListBean) {
     this.contentsDetailListBean = contentsDetailListBean;
     // 첫 번째 아이템은 시리즈에 대한 정보