Browse Source

[콘텐츠][New] 콘텐츠 로그를 별도의 객체에서 처리하기

hyodong.min 6 years ago
parent
commit
8bb7eadf35

+ 2 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/activity/AppInitializer.java

@@ -7,6 +7,7 @@ import android.content.Context;
 import android.util.Log;
 
 import kr.co.zumo.app.lifeplus.helper.AppShieldHelper;
+import kr.co.zumo.app.lifeplus.helper.ContentsLogManager;
 import kr.co.zumo.app.lifeplus.helper.EventEntryHelper;
 import kr.co.zumo.app.lifeplus.helper.FirebaseHelper;
 import kr.co.zumo.app.lifeplus.model.SuperModel;
@@ -77,6 +78,7 @@ public class AppInitializer {
     SignUpModelHelper.getInstance().dispose();
     EventEntryHelper.getInstance().dispose();
     AppShieldHelper.getInstance().dispose();
+    ContentsLogManager.getInstance().dispose();
 
     ActivityDeliveryHelper.getInstance().dispose();
     ActivityDeliveryResultHelper.getInstance().dispose();

+ 96 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/helper/ContentsLogManager.java

@@ -0,0 +1,96 @@
+/*
+ * COPYRIGHT (c) 2018 All rights reserved by HANWHA LIFE.
+ */
+package kr.co.zumo.app.lifeplus.helper;
+
+import android.util.Log;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * ContentsLogManager
+ * <pre>
+ * </pre>
+ *
+ * @author 민효동
+ * @version 1.0
+ * @history 민효동   [2019-03-27]   [최초 작성]
+ * @since 2019-03-27
+ */
+public class ContentsLogManager {
+  private static ContentsLogManager ourInstance = new ContentsLogManager();
+
+  public static ContentsLogManager getInstance() {
+    return ourInstance;
+  }
+
+  private ContentsLogManager() {
+    init();
+  }
+
+  private Map<Object, ContentsLogger> loggerMap;
+
+  private void init() {
+    loggerMap = new HashMap<>();
+  }
+
+  /**
+   * reset, main 이 resume 되는 리셋 된다.
+   */
+  public void reset() {
+    clear();
+  }
+
+  /**
+   * dispose
+   */
+  public void dispose() {
+    clear();
+    loggerMap = null;
+  }
+
+  private void clear() {
+    Log.d("APP# ContentsLogManager | clear", "|" + "**********************");
+    if (null == loggerMap) {
+      return;
+    }
+
+    for (Object o : loggerMap.keySet()) {
+      ContentsLogger logger = loggerMap.get(o);
+      if (logger != null) {
+        logger.dispose();
+      }
+    }
+  }
+
+  /**
+   * 해당 객체의 로거 반환
+   *
+   * @param key
+   * @return
+   */
+  public ContentsLogger of(Object key) {
+    if (null == loggerMap) {
+      loggerMap = new HashMap<>();
+    }
+
+    ContentsLogger logger = loggerMap.get(key);
+    if (null == logger) {
+      logger = new ContentsLogger();
+      loggerMap.put(key, logger);
+      Log.d("APP# ContentsLogManager | of", "|" + "++++++++++++++++++++++++ adding --> " + loggerMap.size());
+    }
+    return logger;
+  }
+
+  /**
+   * @param key
+   */
+  public void remove(Object key) {
+    if (null != loggerMap && loggerMap.size() > 0) {
+      loggerMap.remove(key);
+      Log.d("APP# ContentsLogManager | remove", "|" + "####################### remain count: " + loggerMap.size());
+    }
+  }
+}

+ 123 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/helper/ContentsLogger.java

@@ -0,0 +1,123 @@
+/*
+ * COPYRIGHT (c) 2018 All rights reserved by HANWHA LIFE.
+ */
+package kr.co.zumo.app.lifeplus.helper;
+
+import android.util.Log;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import io.reactivex.disposables.Disposable;
+import kr.co.zumo.app.lifeplus.bean.api.APIContentsLogModule;
+import kr.co.zumo.app.lifeplus.bean.api.ContentsDetailListBean;
+import kr.co.zumo.app.lifeplus.bean.api.ContentsItemBean;
+import kr.co.zumo.app.lifeplus.bean.api.ContentsLogRequestBean;
+import kr.co.zumo.app.lifeplus.bean.api.ContentsLogResultBean;
+import kr.co.zumo.app.lifeplus.model.module.APIError;
+import kr.co.zumo.app.lifeplus.model.module.APIModuleListener;
+import kr.co.zumo.app.lifeplus.view.Event;
+import kr.co.zumo.app.lifeplus.view.IEventListener;
+
+/**
+ * ContentsLogger
+ * <pre>
+ * </pre>
+ *
+ * @author 민효동
+ * @version 1.0
+ * @history 민효동   [2019-03-27]   [최초 작성]
+ * @since 2019-03-27
+ */
+public class ContentsLogger {
+
+  private Disposable disposableLog;
+  private List<String> pageNos;
+  private boolean isLogFlushed;
+
+  public void dispose() {
+    Log.d("APP# ContentsLogger | dispose", "|" + "----------------------------- flushed: " + isLogFlushed);
+    if (null != disposableLog) {
+      disposableLog.dispose();
+      disposableLog = null;
+    }
+  }
+
+  /**
+   * 페이지 본 것으로 로그 추가
+   *
+   * @param contentsItemBean
+   */
+  public void log(ContentsItemBean contentsItemBean) {
+    if (isLogFlushed) {
+      return;
+    }
+
+    // 초기화 됐을 때만 로깅
+    if (null != pageNos) {
+      if (null != contentsItemBean) {
+        String pageNo = contentsItemBean.getListItemNo();
+        pageNos.add(pageNo);
+      }
+    }
+  }
+
+  /**
+   * 로깅 초기화
+   */
+  public void initLog() {
+    isLogFlushed = false;
+    pageNos = new ArrayList<>();
+  }
+
+  /**
+   * 로그 전송
+   *
+   * @param listener
+   */
+  public void flushLog(ContentsDetailListBean contentsDetailListBean, String contentNo, IEventListener listener) {
+    if (isLogFlushed) {
+      // 1회만 로깅하기. 성공으로 리턴.
+      listener.onEvent(new Event.Builder(Event.SUCCESS).build());
+      return;
+    }
+    if (null == pageNos || pageNos.size() == 0) {
+      // 로그 없음
+      listener.onEvent(new Event.Builder(Event.SUCCESS).build());
+      return;
+    }
+    // log 된 페이지 no 를 순서대로 정렬
+    List<String> logNos = new ArrayList<>();
+
+    List<ContentsItemBean> list = contentsDetailListBean.getItemDetailList();
+    if (null != list) {
+      int len = list.size();
+      for (int i = 0; i < len; ++i) {
+        String listItemNo = list.get(i).getListItemNo();
+        for (String pageNo : pageNos) {
+          if (pageNo.equals(listItemNo)) {
+            logNos.add(listItemNo);
+            break;
+          }
+        }
+      }
+    }
+
+    ContentsLogRequestBean requestBean = new ContentsLogRequestBean(contentNo);
+    requestBean.setItemNoBeans(logNos);
+
+    isLogFlushed = true;
+    disposableLog = new APIContentsLogModule().call(requestBean, new APIModuleListener<ContentsLogResultBean>() {
+      @Override
+      public void onApiSuccess(ContentsLogResultBean resultBean) {
+        listener.onEvent(new Event.Builder(Event.SUCCESS).build());
+      }
+
+      @Override
+      public void onApiError(String errorMessage, APIError error) {
+        listener.onEvent(new Event.Builder(Event.ERROR).build());
+
+      }
+    });
+  }
+}

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

@@ -3,11 +3,9 @@ package kr.co.zumo.app.lifeplus.view.screen.contents;
 import android.support.annotation.Nullable;
 import android.util.Log;
 
-import java.util.ArrayList;
 import java.util.List;
 
 import io.reactivex.disposables.Disposable;
-import kr.co.zumo.app.lifeplus.bean.api.APIContentsLogModule;
 import kr.co.zumo.app.lifeplus.bean.api.APIData;
 import kr.co.zumo.app.lifeplus.bean.api.BookmarkBean;
 import kr.co.zumo.app.lifeplus.bean.api.ContentsBookmarkRequestBean;
@@ -15,11 +13,10 @@ 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.ContentsItemBean;
 import kr.co.zumo.app.lifeplus.bean.api.ContentsLikeRequestBean;
-import kr.co.zumo.app.lifeplus.bean.api.ContentsLogRequestBean;
-import kr.co.zumo.app.lifeplus.bean.api.ContentsLogResultBean;
 import kr.co.zumo.app.lifeplus.bean.api.ItemNoRequestBean;
 import kr.co.zumo.app.lifeplus.bean.api.LifeplusAPIBean;
 import kr.co.zumo.app.lifeplus.bean.api.SeriesItemBean;
+import kr.co.zumo.app.lifeplus.helper.ContentsLogManager;
 import kr.co.zumo.app.lifeplus.model.SuperModel;
 import kr.co.zumo.app.lifeplus.model.module.APIContentsDetailModule;
 import kr.co.zumo.app.lifeplus.model.module.APIError;
@@ -28,7 +25,6 @@ import kr.co.zumo.app.lifeplus.supervisor.ContentsFlagHelper;
 import kr.co.zumo.app.lifeplus.tool.ReviewCounter;
 import kr.co.zumo.app.lifeplus.util.StringUtil;
 import kr.co.zumo.app.lifeplus.view.Event;
-import kr.co.zumo.app.lifeplus.view.IEventListener;
 import kr.co.zumo.app.lifeplus.view.dialog.ShareDialog;
 import kr.co.zumo.app.lifeplus.view.screen.my.bookmark.BookmarkManager;
 import kr.co.zumo.app.lifeplus.view.screen.setting.MemberInfoModelHelper;
@@ -48,7 +44,6 @@ public class ContentsModel extends ContentsBaseModel {
   private Disposable disposableDetail;
   private Disposable disposableSeriesLiked;
   private Disposable disposableSeriesBookmarked;
-  private Disposable disposableLog;
   private ContentsDetailListBean contentsDetailListBean;
   private SeriesItemBean selectedSeriesItemBean;
   private boolean canSeriesLogging = true;
@@ -62,6 +57,7 @@ public class ContentsModel extends ContentsBaseModel {
   @Override
   protected void destroyViewInternalModel() {
     ContentsFlagHelper.getInstance().unregisterChangedObserver(hashCode);
+    ContentsLogManager.getInstance().remove(this);
   }
 
   @Override
@@ -150,11 +146,6 @@ public class ContentsModel extends ContentsBaseModel {
       disposableSeriesLiked.dispose();
       disposableSeriesLiked = null;
     }
-
-    if (null != disposableLog) {
-      disposableLog.dispose();
-      disposableLog = null;
-    }
   }
 
   public ContentsDetailListBean getContentsDetailListBean() {
@@ -401,86 +392,30 @@ public class ContentsModel extends ContentsBaseModel {
     return MemberInfoModelHelper.getInstance().getSpecialCode();
   }
 
+  /**
+   * 로깅 초기화
+   */
+  public void initLog() {
+    ContentsLogManager.getInstance().of(this).initLog();
+  }
+
   /**
    * 페이지 본 것으로 로그 추가
    *
    * @param currentIndex
    */
   public void log(int currentIndex) {
-    if (isLogFlushed) {
-      return;
-    }
-
-    // 초기화 됐을 때만 로깅
-    if (null != pageNos) {
-      ContentsItemBean bean = getItem(currentIndex);
-      if (null != bean) {
-        String pageNo = bean.getListItemNo();
-        pageNos.add(pageNo);
-      }
+    ContentsItemBean bean = getItem(currentIndex);
+    if (null != bean) {
+      ContentsLogManager.getInstance().of(this).log(bean);
     }
   }
 
-  private List<String> pageNos;
-  private boolean isLogFlushed;
-
-  /**
-   * 로깅 초기화
-   */
-  public void initLog() {
-    isLogFlushed = false;
-    pageNos = new ArrayList<>();
-  }
-
   /**
    * 로그 전송
-   *
-   * @param listener
    */
-  public void flushLog(IEventListener listener) {
-    if (isLogFlushed) {
-      // 1회만 로깅하기. 성공으로 리턴.
-      listener.onEvent(new Event.Builder(Event.SUCCESS).build());
-      return;
-    }
-    if (null == pageNos || pageNos.size() == 0) {
-      // 로그 없음
-      listener.onEvent(new Event.Builder(Event.SUCCESS).build());
-      return;
-    }
-    // log 된 페이지 no 를 순서대로 정렬
-    List<String> logNos = new ArrayList<>();
-
-    List<ContentsItemBean> list = getContentsDetailListBean().getItemDetailList();
-    if (null != list) {
-      int len = list.size();
-      for (int i = 0; i < len; ++i) {
-        String listItemNo = list.get(i).getListItemNo();
-        for (String pageNo : pageNos) {
-          if (pageNo.equals(listItemNo)) {
-            logNos.add(listItemNo);
-            break;
-          }
-        }
-      }
-    }
-
-    ContentsLogRequestBean requestBean = new ContentsLogRequestBean(getContentsNo());
-    requestBean.setItemNoBeans(logNos);
-
-    isLogFlushed = true;
-    disposableLog = new APIContentsLogModule().call(requestBean, new APIModuleListener<ContentsLogResultBean>(waiterCaller) {
-      @Override
-      public void onApiSuccess(ContentsLogResultBean resultBean) {
-        listener.onEvent(new Event.Builder(Event.SUCCESS).build());
-      }
-
-      @Override
-      public void onApiError(String errorMessage, APIError error) {
-        listener.onEvent(new Event.Builder(Event.ERROR).build());
-
-      }
-    });
+  public void flushLog() {
+    ContentsLogManager.getInstance().of(this).flushLog(getContentsDetailListBean(), getContentsNo(), e -> {});
   }
 
 }

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

@@ -23,7 +23,6 @@ import kr.co.zumo.app.lifeplus.util.ResourceUtil;
 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.IEventListener;
 import kr.co.zumo.app.lifeplus.view.command.WebCommand;
 import kr.co.zumo.app.lifeplus.view.dialog.AlertDialog;
 import kr.co.zumo.app.lifeplus.view.dialog.ConfirmDialog;
@@ -208,9 +207,8 @@ public class ContentsPresenter extends ContentsBasePresenter<ContentsModel, ICon
   @Override
   protected boolean onBackPressedInternal() {
     if (false == view.dispatchBackPressed()) {
-      flushLogAndContinue(event -> {
-        back();
-      });
+      flushLog();
+      back();
     }
     return true;
   }
@@ -236,14 +234,14 @@ public class ContentsPresenter extends ContentsBasePresenter<ContentsModel, ICon
           bean.getTitleWithTrim()
         );
 
-        flushLogAndContinue(e -> {
+        flushLog();
+
+        // Series 는 itemNo 가 Series 를 가리키고 seriesItemNo 가 contents 의 itemNo 이므로
+        // 그대로 contentsView 에 전달하면 공유 등 문제가 있다.
+        // 이를 clone()하여 새로운 bean 으로 전달한다.
+        model.setDeliveryPackaging(new ContentsDeliveryBean.Builder(bean).build());
+        go(ScreenID.CONTENTS);
 
-          // Series 는 itemNo 가 Series 를 가리키고 seriesItemNo 가 contents 의 itemNo 이므로
-          // 그대로 contentsView 에 전달하면 공유 등 문제가 있다.
-          // 이를 clone()하여 새로운 bean 으로 전달한다.
-          model.setDeliveryPackaging(new ContentsDeliveryBean.Builder(bean).build());
-          go(ScreenID.CONTENTS);
-        });
         break;
       case Event.LIKE:
         // series like
@@ -275,39 +273,37 @@ public class ContentsPresenter extends ContentsBasePresenter<ContentsModel, ICon
         break;
       case Event.CLICK_HTML:
         // html 의 자바스크립트를 통해서 전달된 데이터
-        flushLogAndContinue(e -> {
-          HtmlBean htmlBean = event.fromJson(HtmlBean.class);
-          if (htmlBean.getType() == HtmlBean.TYPE_APP) {
-            shipToWeb(htmlBean.getUrl(), ScreenID.WEB_FROM_CONTENTS);
-            go(ScreenID.WEB_FROM_CONTENTS);
-          }
-          else if (htmlBean.getType() == HtmlBean.TYPE_LINK) {
-            onCommand(new WebCommand(htmlBean.getUrl()));
-          }
-        });
+        flushLog();
+
+        HtmlBean htmlBean = event.fromJson(HtmlBean.class);
+        if (htmlBean.getType() == HtmlBean.TYPE_APP) {
+          shipToWeb(htmlBean.getUrl(), ScreenID.WEB_FROM_CONTENTS);
+          go(ScreenID.WEB_FROM_CONTENTS);
+        }
+        else if (htmlBean.getType() == HtmlBean.TYPE_LINK) {
+          onCommand(new WebCommand(htmlBean.getUrl()));
+        }
         break;
       case Event.NEXT:
         view.setSmoothScrollToPosition(1);
         break;
       case Event.RECT:
         // 클릭 영역
-        flushLogAndContinue(e -> {
-          Log.e("APP#  ContentsPresenter | onEventInternal", "|" + event.getString());
-          shipToWeb(event.getString(), ScreenID.WEB_FROM_CONTENTS);
-          go(ScreenID.WEB_FROM_CONTENTS);
-        });
+        flushLog();
+        Log.e("APP#  ContentsPresenter | onEventInternal", "|" + event.getString());
+        shipToWeb(event.getString(), ScreenID.WEB_FROM_CONTENTS);
+        go(ScreenID.WEB_FROM_CONTENTS);
         break;
       case Event.POINT:
         // 구매/예약 점 클릭
         String url = event.getString();
         // fixme 로깅 관련 정보(컴퍼니/프로덕트)가 없어서 임시로 url
         firebaseAnalyticsHelper.logPurchase(ResourceUtil.getString(R.string.fa_screen_contents), url, url);
-        flushLogAndContinue(e -> {
-          // todo tool tip 표시 필요
-          Log.e("APP#  ContentsPresenter | onEventInternal", "|" + url);
-          shipToWeb(url, ScreenID.WEB_PURCHASE);
-          go(ScreenID.WEB_PURCHASE);
-        });
+        flushLog();
+        // todo tool tip 표시 필요
+        Log.e("APP#  ContentsPresenter | onEventInternal", "|" + url);
+        shipToWeb(url, ScreenID.WEB_PURCHASE);
+        go(ScreenID.WEB_PURCHASE);
         break;
       case Event.OVER_VIEW:
         model.setDeliveryPackaging(new ContentsOverviewDeliveryBean(model.getContentsBean(), model.getContentsDetailListBean()));
@@ -317,11 +313,10 @@ public class ContentsPresenter extends ContentsBasePresenter<ContentsModel, ICon
         WithShownItemBean withShownItemBean = model.getContentsDetailListBean().getWithItemList().get(event.getIndex());
         logContents(R.string.fa_page_with, event.getIndex(), withShownItemBean);
 
-        flushLogAndContinue(e -> {
-          // 함께 본 컨텐츠
-          model.setDeliveryPackaging(new ContentsDeliveryBean.Builder(withShownItemBean).build());
-          go(ScreenID.CONTENTS);
-        });
+        flushLog();
+        // 함께 본 컨텐츠
+        model.setDeliveryPackaging(new ContentsDeliveryBean.Builder(withShownItemBean).build());
+        go(ScreenID.CONTENTS);
         break;
       case Event.COVER:
         // 커버 로딩 완료
@@ -343,8 +338,8 @@ public class ContentsPresenter extends ContentsBasePresenter<ContentsModel, ICon
       bean.getTitleWithTrim());
   }
 
-  private void flushLogAndContinue(IEventListener listener) {
-    model.flushLog(listener);
+  private void flushLog() {
+    model.flushLog();
   }
 
   @Override
@@ -682,9 +677,8 @@ public class ContentsPresenter extends ContentsBasePresenter<ContentsModel, ICon
 
   @Override
   public void onNavigationClickHome(NavigationBar navigationBar) {
-    flushLogAndContinue(event -> {
-      super.onNavigationClickHome(navigationBar);
-    });
+    flushLog();
+    super.onNavigationClickHome(navigationBar);
   }
 
   private void showAccessRightDialog() {

+ 3 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/main/MainModel.java

@@ -40,6 +40,7 @@ import kr.co.zumo.app.lifeplus.bean.api.RequestBean;
 import kr.co.zumo.app.lifeplus.bean.api.WeatherBean;
 import kr.co.zumo.app.lifeplus.bean.api.WeatherRequestBean;
 import kr.co.zumo.app.lifeplus.bean.api.WeatherResultBean;
+import kr.co.zumo.app.lifeplus.helper.ContentsLogManager;
 import kr.co.zumo.app.lifeplus.model.Model;
 import kr.co.zumo.app.lifeplus.model.SuperModel;
 import kr.co.zumo.app.lifeplus.model.module.APIError;
@@ -103,6 +104,8 @@ public class MainModel extends Model {
     BucketListManager.getInstance().dispose();
     BookmarkManager.getInstance().dispose();
 
+    ContentsLogManager.getInstance().reset();
+
     watchLocation();
   }