浏览代码

[메뉴][New] 새 알림 추가 시 노티 마커 표시

hyodong.min 6 年之前
父节点
当前提交
af60e4ac4d

+ 26 - 7
app/src/main/java/kr/co/zumo/app/lifeplus/activity/AllMenuDriver.java

@@ -10,10 +10,13 @@ import android.widget.TextView;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.concurrent.TimeUnit;
 
+import io.reactivex.Completable;
+import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.disposables.Disposable;
 import kr.co.zumo.app.R;
 import kr.co.zumo.app.lifeplus.helper.NavigationBar;
-import kr.co.zumo.app.lifeplus.model.SuperModel;
 import kr.co.zumo.app.lifeplus.push.PushMessageBroker;
 import kr.co.zumo.app.lifeplus.supervisor.PushMessageManager;
 import kr.co.zumo.app.lifeplus.util.ResourceUtil;
@@ -33,6 +36,7 @@ import kr.co.zumo.app.lifeplus.view.IEventListener;
 public class AllMenuDriver implements PushMessageBroker.IPushMessageListener, IDrawerEvent {
 
   private PushMessageManager pushMessageManager;
+  private Disposable disposable;
 
   private Context context;
   private ConstraintLayout drawerView;
@@ -131,21 +135,35 @@ public class AllMenuDriver implements PushMessageBroker.IPushMessageListener, ID
   }
 
   private void dispatchMessage() {
-    if (canDisplayMarker()) {
+    if (hasUnreadMessage()) {
       navigationBar.setNotiMarker(true, true);
     }
   }
 
-  private boolean canDisplayMarker() {
-    return (null != pushMessageManager && pushMessageManager.hasMessages() && pushMessageManager.isUnread()) || (SuperModel.getInstance().getPreferences().isAppFirstOpened());
+  private void disposeMessageInternal() {
+    if (null != disposable) {
+      disposable.dispose();
+      disposable = null;
+    }
+  }
+
+  private void dispatchMessageInternal() {
+    disposable = Completable.timer(400, TimeUnit.MILLISECONDS, AndroidSchedulers.mainThread())
+      .subscribe(this::dispatchMessage);
+  }
+
+  private boolean hasUnreadMessage() {
+    return (null != pushMessageManager && pushMessageManager.hasMessages() && pushMessageManager.isUnread());
   }
 
   /***********************************
    * public
    ***********************************/
   @Deprecated
-  public void updateNoti() {
-    dispatchMessage();
+  public void updateNotiMarker(boolean hasNewNoti) {
+    if (hasNewNoti) {
+      navigationBar.setNotiMarker(true, true);
+    }
   }
 
   /***********************************
@@ -170,12 +188,13 @@ public class AllMenuDriver implements PushMessageBroker.IPushMessageListener, ID
   public void onDrawerOpenEnd() {
     pushMessageManager = PushMessageManager.getStoredManager();
     PushMessageBroker.getInstance().registerObserver(this);
-    new Handler(Looper.getMainLooper()).postDelayed(this::dispatchMessage, 400);
+    dispatchMessageInternal();
   }
 
   @Override
   public void onDrawerCloseStart() {
     PushMessageBroker.getInstance().unregisterObserver(this);
+    disposeMessageInternal();
   }
 
   @Override

+ 7 - 7
app/src/main/java/kr/co/zumo/app/lifeplus/helper/AllMenuHelper.java

@@ -101,6 +101,13 @@ public class AllMenuHelper extends Helper implements IDrawerMenu, IDrawerEvent {
     drawerListener = null;
   }
 
+  @Deprecated
+  public void updateNotiMarker(boolean hasNewNoti) {
+    if (null != allMenuDriver) {
+      allMenuDriver.updateNotiMarker(hasNewNoti);
+    }
+  }
+
   /***********************************
    * IDrawerMenu
    ***********************************/
@@ -162,11 +169,4 @@ public class AllMenuHelper extends Helper implements IDrawerMenu, IDrawerEvent {
     drawerListener.onDrawerCloseEnd();
     allMenuDriver.onDrawerCloseEnd();
   }
-
-  @Deprecated
-  public void updateNoti() {
-    if (null != allMenuDriver) {
-      allMenuDriver.updateNoti();
-    }
-  }
 }

+ 8 - 8
app/src/main/java/kr/co/zumo/app/lifeplus/model/LifeplusPreferences.java

@@ -39,7 +39,7 @@ public class LifeplusPreferences {
   private final static String FIRST_PERMISSION = "first_permission";
   private final static String FIRST_DIALOG = "first_dialog";
   private final static String EMAIL = "email";
-  private final static String APP_FIRST_OPENED = "app_first_open";
+  private final static String NOTI_LATEST_TIME = "noti_latest_time";
 
 
   /**
@@ -322,16 +322,16 @@ public class LifeplusPreferences {
   }
 
   /**
-   * 앱 최초 설치 유무 저장
+   * 알림 최근 시간
    *
-   * @param isFirstOpened
+   * @param time
    */
-  public void setAppFirstOpened(boolean isFirstOpened) {
-    preferences.put(APP_FIRST_OPENED, isFirstOpened);
+  public void setNotiLatestTime(String time) {
+    preferences.put(NOTI_LATEST_TIME, time);
   }
 
-  public boolean isAppFirstOpened() {
-    return preferences.get(APP_FIRST_OPENED, true);
+  public String getNotiLatestTime() {
+    return preferences.get(NOTI_LATEST_TIME, "");
   }
 
   /**
@@ -351,7 +351,7 @@ public class LifeplusPreferences {
     setTagLatestList("");
     setUserNo("");
     setUserEmail("");
-    setAppFirstOpened(true);
+    setNotiLatestTime("");
   }
 
   /**

+ 44 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/model/Model.java

@@ -6,6 +6,7 @@ package kr.co.zumo.app.lifeplus.model;
 import android.arch.lifecycle.ViewModel;
 import android.util.Log;
 
+import java.util.List;
 import java.util.concurrent.TimeUnit;
 
 import io.reactivex.android.schedulers.AndroidSchedulers;
@@ -17,7 +18,10 @@ import kr.co.zumo.app.lifeplus.application.App;
 import kr.co.zumo.app.lifeplus.bean.api.BookmarkListResultBean;
 import kr.co.zumo.app.lifeplus.bean.api.BucketListRequestBean;
 import kr.co.zumo.app.lifeplus.bean.api.BucketListResultBean;
+import kr.co.zumo.app.lifeplus.bean.api.NoticeBean;
+import kr.co.zumo.app.lifeplus.bean.api.NoticeResultBean;
 import kr.co.zumo.app.lifeplus.bean.api.PageRequestBean;
+import kr.co.zumo.app.lifeplus.bean.api.RequestBean;
 import kr.co.zumo.app.lifeplus.helper.DeliveryHelper;
 import kr.co.zumo.app.lifeplus.helper.DeliveryResultHelper;
 import kr.co.zumo.app.lifeplus.helper.Helper;
@@ -25,6 +29,7 @@ import kr.co.zumo.app.lifeplus.helper.IHelperProvider;
 import kr.co.zumo.app.lifeplus.helper.ScreenIDDeliveryHelper;
 import kr.co.zumo.app.lifeplus.model.module.APIError;
 import kr.co.zumo.app.lifeplus.model.module.APIModuleListener;
+import kr.co.zumo.app.lifeplus.model.module.APINoticeModule;
 import kr.co.zumo.app.lifeplus.network.INetworkReceiverListener;
 import kr.co.zumo.app.lifeplus.network.NetworkWatcher;
 import kr.co.zumo.app.lifeplus.util.StringUtil;
@@ -55,6 +60,7 @@ public abstract class Model extends ViewModel implements ILifeCycle, IHelperProv
   protected IWaiterCallable waiterCaller;
   private Disposable disposableBucket;
   private Disposable disposableBookMarkList;
+  private Disposable disposableNoti;
   private int screenId;
   private int prevScreenId;
 
@@ -341,6 +347,44 @@ public abstract class Model extends ViewModel implements ILifeCycle, IHelperProv
     });
   }
 
+  /**
+   * 최신 알림이 있는지 파악
+   *
+   * @param listener
+   */
+  public void loadNotiLatest(IEventListener listener) {
+    disposableNoti =
+      new APINoticeModule().call(new RequestBean(), new APIModuleListener<NoticeResultBean>(waiterCaller) {
+          @Override
+          public void onApiSuccess(NoticeResultBean resultBean) {
+            List<NoticeBean> noticeBeans = resultBean.getData();
+
+            if (null != noticeBeans && noticeBeans.size() > 0) {
+              // 마지막 시간과 비교해서 다르면 뉴 표시
+
+              Log.d("APP# Model | onApiSuccess, 369", "|" + noticeBeans.get(0).getOpeningDate());
+              if (SuperModel.getInstance().getPreferences().getNotiLatestTime().equals(noticeBeans.get(0).getOpeningDate())) {
+                // 새 알림 없음.
+                listener.onEvent(new Event.Builder(Event.SUCCESS).bool(false).build());
+              }
+              else {
+                // 새 알림 있음.
+                listener.onEvent(new Event.Builder(Event.SUCCESS).bool(true).build());
+              }
+            }
+            else {
+              onApiError("", new APIError(APIError.ERROR_REASON));
+            }
+          }
+
+          @Override
+          public void onApiError(String errorMessage, APIError error) {
+            listener.onEvent(new Event.Builder(Event.ERROR).bool(false).build());
+          }
+        }
+      );
+  }
+
   /**
    * 현 Screen ID 저장
    *

+ 12 - 1
app/src/main/java/kr/co/zumo/app/lifeplus/model/module/APINoticeModule.java

@@ -3,7 +3,11 @@
  */
 package kr.co.zumo.app.lifeplus.model.module;
 
+import java.util.Collections;
+import java.util.List;
+
 import io.reactivex.Single;
+import kr.co.zumo.app.lifeplus.bean.api.NoticeBean;
 import kr.co.zumo.app.lifeplus.bean.api.NoticeResultBean;
 import kr.co.zumo.app.lifeplus.bean.api.RequestBean;
 import kr.co.zumo.app.lifeplus.network.api.LifeplusAPIRepository;
@@ -22,6 +26,13 @@ public class APINoticeModule extends LifeplusAPIModule<RequestBean, NoticeResult
 
   @Override
   protected Single<NoticeResultBean> getAPI(RequestBean requestBean) {
-    return new LifeplusAPIRepository().getNotice(requestBean);
+    return new LifeplusAPIRepository().getNotice(requestBean).map(noticeResultBean -> {
+      List<NoticeBean> noticeBeans = noticeResultBean.getData();
+      if (null != noticeBeans && noticeBeans.size() > 0) {
+        // 내림차순
+        Collections.sort(noticeBeans, (noticeBean, t1) -> t1.getOpeningDate().compareTo(noticeBean.getOpeningDate()));
+      }
+      return noticeResultBean;
+    });
   }
 }

+ 6 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/view/presenter/Presenter.java

@@ -775,6 +775,12 @@ public abstract class Presenter<M extends Model, V extends IView> implements ILi
   public void onNavigationClickMenu(NavigationBar navigationBar) {
     firebaseAnalyticsHelper.click(getAnalyticsScreenName(), R.string.fa_button_all_menu);
     allMenuHelper.openDrawer();
+
+    model.loadNotiLatest(e -> {
+      if (e.getBool()) {
+        allMenuHelper.updateNotiMarker(true);
+      }
+    });
   }
 
   /**

+ 13 - 3
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/notification/NotiModel.java

@@ -17,6 +17,7 @@ import kr.co.zumo.app.lifeplus.bean.api.NoticeBean;
 import kr.co.zumo.app.lifeplus.bean.api.NoticeResultBean;
 import kr.co.zumo.app.lifeplus.bean.api.RequestBean;
 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;
 import kr.co.zumo.app.lifeplus.model.module.APIModuleListener;
 import kr.co.zumo.app.lifeplus.model.module.APINoticeModule;
@@ -102,15 +103,14 @@ public class NotiModel extends Model implements PushMessageBroker.IPushMessageLi
     displayedList.addAll(parsePushBeans());
     displayedList.addAll(noticeBeans);
 
+    // 내림차순
     Collections.sort(displayedList, new Comparator<NoticeBean>() {
       @Override
       public int compare(NoticeBean noticeBean, NoticeBean t1) {
-        return noticeBean.getOpeningDate().compareTo(t1.getOpeningDate());
+        return t1.getOpeningDate().compareTo(noticeBean.getOpeningDate());
       }
     });
 
-    Collections.reverse(displayedList);
-
     return displayedList;
   }
 
@@ -149,6 +149,12 @@ public class NotiModel extends Model implements PushMessageBroker.IPushMessageLi
             if (null == noticeBeans) {
               noticeBeans = new ArrayList<>();
             }
+            else {
+              if (noticeBeans.size() > 0) {
+                // 최근 알림의 시간 저장
+                setNotiLatestTime(noticeBeans.get(0).getOpeningDate());
+              }
+            }
 
             onResult(new Event.Builder(Event.RESULT).build());
           }
@@ -161,6 +167,10 @@ public class NotiModel extends Model implements PushMessageBroker.IPushMessageLi
       );
   }
 
+  private void setNotiLatestTime(String time) {
+    SuperModel.getInstance().getPreferences().setNotiLatestTime(time);
+  }
+
   private List<NoticeBean> parsePushBeans() {
     // push beans 를 noticeBean 으로 변환
     List<NoticeBean> noticeBeans = new ArrayList<>();

+ 0 - 2
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/notification/NotiPresenter.java

@@ -3,7 +3,6 @@ package kr.co.zumo.app.lifeplus.view.screen.notification;
 import kr.co.zumo.app.R;
 import kr.co.zumo.app.lifeplus.bean.PushBean;
 import kr.co.zumo.app.lifeplus.bean.api.NoticeBean;
-import kr.co.zumo.app.lifeplus.model.SuperModel;
 import kr.co.zumo.app.lifeplus.supervisor.PushMessageLink;
 import kr.co.zumo.app.lifeplus.supervisor.PushMessageManager;
 import kr.co.zumo.app.lifeplus.util.ResourceUtil;
@@ -58,7 +57,6 @@ public class NotiPresenter extends Presenter<NotiModel, INotiView> {
 
   @Override
   protected void startInternalOnce() {
-    SuperModel.getInstance().getPreferences().setAppFirstOpened(false);
     model.loadNotification();
   }