瀏覽代碼

[공지][New] 소식 삭제, 실시간 소식 추가

hyodong.min 6 年之前
父節點
當前提交
0d8d9b9189

+ 1 - 1
app/src/main/java/kr/co/zumo/app/lifeplus/supervisor/PushMessageManager.java

@@ -62,7 +62,7 @@ public class PushMessageManager {
 
   /**
    * 메세지 모두 삭제
-   * - RAM에서만 제거(저장 되는 것은 아님)
+   * - RAM 에서만 제거(저장 되는 것은 아님)
    */
   public void clear() {
     pushBeans.clear();

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

@@ -20,4 +20,6 @@ import kr.co.zumo.app.lifeplus.view.IView;
  */
 public interface INotiView extends IView {
   void drawList(List<NoticeBean> beans);
+
+  void setActionButtonVisible(boolean isVisible);
 }

+ 44 - 18
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/notification/NotiFragment.java

@@ -15,6 +15,8 @@ import java.util.List;
 import kr.co.zumo.app.R;
 import kr.co.zumo.app.lifeplus.bean.api.NoticeBean;
 import kr.co.zumo.app.lifeplus.helper.ActionBarHelper;
+import kr.co.zumo.app.lifeplus.helper.ActionButtonHelper;
+import kr.co.zumo.app.lifeplus.util.ResourceUtil;
 import kr.co.zumo.app.lifeplus.view.screen.FragmentBase;
 
 /**
@@ -29,15 +31,16 @@ import kr.co.zumo.app.lifeplus.view.screen.FragmentBase;
  */
 public class NotiFragment extends FragmentBase<NotiPresenter> implements INotiView {
 
-  public static final String CATEGORY_ALL = "전체";
-  public static final String CATEGORY_NEWS = "소식";
-  public static final String CATEGORY_NOTICE = "공지";
+  public static final String CATEGORY_ALL = ResourceUtil.getString(R.string.notice_category_all);
+  public static final String CATEGORY_NEWS = ResourceUtil.getString(R.string.notice_category_news);
+  public static final String CATEGORY_NOTICE = ResourceUtil.getString(R.string.notice_category_notice);
   public static final int CATEGORY_KEY_ALL = 0;
   public static final int CATEGORY_KEY_MEMBER = 1;
   public static final int CATEGORY_KEY_BENEFIT = 2;
   private TabLayout tabLayoutAlarm;
   private TabLayout tabBarLayoutAlarm;
   private ViewPager viewPagerAlarm;
+  private ActionButtonHelper actionButtonHelper;
 
   @Override
   protected View onAfterCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
@@ -50,6 +53,15 @@ public class NotiFragment extends FragmentBase<NotiPresenter> implements INotiVi
     viewPagerAlarm = findViewById(R.id.alarm_view_pager);
     tabLayoutAlarm.setTabGravity(TabLayout.GRAVITY_FILL);
     tabBarLayoutAlarm = findViewById(R.id.noti_tab_bar);
+    tabLayoutAlarm.setupWithViewPager(viewPagerAlarm, true);
+    tabBarLayoutAlarm.setupWithViewPager(viewPagerAlarm, true);
+
+    viewPagerAlarm.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
+      @Override
+      public void onPageSelected(int position) {
+        presenter.onPageChanged(position);
+      }
+    });
   }
 
   @Override
@@ -61,12 +73,13 @@ public class NotiFragment extends FragmentBase<NotiPresenter> implements INotiVi
       .show();
   }
 
-//  @Override
-//  protected void defineActionButton(ActionButtonHelper actionButtonHelper) {
-//    actionButtonHelper.begin().trash(floatingActionButton -> {
-//      presenter.onActionButtonClick();
-//    }).show();
-//  }
+  @Override
+  protected void defineActionButton(ActionButtonHelper actionButtonHelper) {
+    this.actionButtonHelper = actionButtonHelper;
+    actionButtonHelper.begin().trash(floatingActionButton -> {
+      presenter.onActionButtonClick();
+    }).hide();
+  }
 
   @Override
   protected NotiPresenter definePresenter() {
@@ -75,7 +88,7 @@ public class NotiFragment extends FragmentBase<NotiPresenter> implements INotiVi
 
   @Override
   protected void onAfterDestroyView() {
-
+    notiPagerAdapter = null;
   }
 
   @Override
@@ -88,16 +101,29 @@ public class NotiFragment extends FragmentBase<NotiPresenter> implements INotiVi
     return false;
   }
 
+  NotiPagerAdapter notiPagerAdapter;
+
   @Override
   public void drawList(List<NoticeBean> beans) {
+    Log.i("APP# NotiFragment | drawList", "|" + "draw size: " + beans.size());
+    if (null == notiPagerAdapter) {
+      String[] tab = {CATEGORY_ALL, CATEGORY_NEWS, CATEGORY_NOTICE};
+      notiPagerAdapter = new NotiPagerAdapter(getChildFragmentManager(), tab, beans);
+      viewPagerAlarm.setAdapter(notiPagerAdapter);
+    }
+    else {
+      notiPagerAdapter.update(beans);
+    }
+  }
 
-    Log.i("APP# NotiFragment | drawList", "|" + beans.toString());
-
-    String[] tab = {CATEGORY_ALL, CATEGORY_NEWS, CATEGORY_NOTICE};
-    NotiPagerAdapter notiPagerAdapter = new NotiPagerAdapter(getChildFragmentManager(), tab, beans);
-    tabLayoutAlarm.setupWithViewPager(viewPagerAlarm, true);
-    tabBarLayoutAlarm.setupWithViewPager(viewPagerAlarm, true);
-    viewPagerAlarm.setAdapter(notiPagerAdapter);
-    notiPagerAdapter.notifyDataSetChanged();
+  @Override
+  public void setActionButtonVisible(boolean isVisible) {
+    if (isVisible) {
+      actionButtonHelper.show();
+    }
+    else {
+      actionButtonHelper.hide();
+    }
   }
+
 }

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

@@ -35,6 +35,7 @@ public class NotiListFragment extends Fragment {
   private int index;
   private List<NoticeBean> noticeBeans;
   private INotiListFragmentListener listener;
+  private View layoutNothing;
 
   public void setListener(NotiListFragment.INotiListFragmentListener listener) {
     this.listener = listener;
@@ -75,6 +76,7 @@ public class NotiListFragment extends Fragment {
         outRect.bottom = ResourceUtil.dpToPx(12);
       }
     });
+    layoutNothing = getView().findViewById(R.id.layout_nothing);
   }
 
   @Override
@@ -104,9 +106,15 @@ public class NotiListFragment extends Fragment {
    */
   public void init(List<NoticeBean> beans) {
     noticeBeans = beans;
+    if (null == noticeBeans || noticeBeans.size() == 0) {
+      layoutNothing.setVisibility(View.VISIBLE);
+    }
+    else {
+      layoutNothing.setVisibility(View.GONE);
+      NotiListAdapter notiListAdapter = new NotiListAdapter(noticeBeans);
+      recyclerViewAlarmList.setAdapter(notiListAdapter);
 
-    NotiListAdapter notiListAdapter = new NotiListAdapter(noticeBeans);
-    recyclerViewAlarmList.setAdapter(notiListAdapter);
+    }
   }
 
   interface INotiListFragmentListener {

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

@@ -3,6 +3,9 @@
  */
 package kr.co.zumo.app.lifeplus.view.screen.notification;
 
+import android.os.Handler;
+import android.os.Looper;
+
 import java.util.ArrayList;
 import java.util.List;
 
@@ -15,6 +18,7 @@ import kr.co.zumo.app.lifeplus.model.Model;
 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.push.PushMessageBroker;
 import kr.co.zumo.app.lifeplus.supervisor.PushMessageManager;
 import kr.co.zumo.app.lifeplus.util.Formatter;
 import kr.co.zumo.app.lifeplus.view.Event;
@@ -29,7 +33,7 @@ import kr.co.zumo.app.lifeplus.view.Event;
  * @history 민효동   [2018. 11. 2.]   [최초 작성]
  * @since 2018. 11. 2.
  */
-public class NotiModel extends Model {
+public class NotiModel extends Model implements PushMessageBroker.IPushMessageListener {
   private Disposable disposable;
   private List<NoticeBean> noticeBeans;
 
@@ -37,6 +41,7 @@ public class NotiModel extends Model {
 
   public NotiModel() {
     pushMessageManager = new PushMessageManager(PushMessageManager.getPushMessages());
+    PushMessageBroker.getInstance().registerObserver(this);
   }
 
   @Override
@@ -45,6 +50,7 @@ public class NotiModel extends Model {
 
   @Override
   protected void destroyInternal() {
+    PushMessageBroker.getInstance().unregisterObserver(this);
     disposeLoading();
     noticeBeans = null;
   }
@@ -81,11 +87,14 @@ public class NotiModel extends Model {
   }
 
   public List<NoticeBean> getNoticeBeans() {
-    return noticeBeans;
+    List<NoticeBean> list = new ArrayList<>();
+    list.addAll(parsePushBeans());
+    list.addAll(noticeBeans);
+    return list;
   }
 
   /**
-   * FAQ 불러오기;
+   * 공지 불러오기;
    */
   public void loadNotification() {
     disposable =
@@ -98,8 +107,6 @@ public class NotiModel extends Model {
               noticeBeans = new ArrayList<>();
             }
 
-            parsePushBeans();
-
             onResult(new Event.Builder(Event.RESULT).build());
           }
 
@@ -111,26 +118,30 @@ public class NotiModel extends Model {
       );
   }
 
-  private void parsePushBeans() {
+  private List<NoticeBean> parsePushBeans() {
     // push beans 를 noticeBean 으로 변환
-
+    List<NoticeBean> noticeBeans = new ArrayList<>();
     List<PushBean> list = pushMessageManager.getPushBeans();
     int len = list.size();
     PushBean bean;
-    NoticeBean noticeBean;
     for (int i = 0; i < len; ++i) {
       bean = list.get(i);
-      noticeBean = new NoticeBean();
-      noticeBean.setCategory(NoticeBean.CATEGORY_NEWS);
-      noticeBean.setContents(bean.getContents());
-      noticeBean.setDate(Formatter.format(bean.getDateTime(), PushBean.DATE_FORMAT, NoticeBean.DATE_FORMAT));
-      noticeBean.setEventId(bean.getItemNo());
-      noticeBean.setNoticeNo("");
-      noticeBean.setFlag(getNoticeFlagFromPush(bean.getPushType()));
-      noticeBean.setViewType(NoticeBean.VIEW_TYPE_TEXT_LINK);
-
-      noticeBeans.add(0, noticeBean);
+      noticeBeans.add(0, pushToNotice(bean));
     }
+
+    return noticeBeans;
+  }
+
+  private NoticeBean pushToNotice(PushBean bean) {
+    NoticeBean noticeBean = new NoticeBean();
+    noticeBean.setCategory(NoticeBean.CATEGORY_NEWS);
+    noticeBean.setContents(bean.getContents());
+    noticeBean.setDate(Formatter.format(bean.getDateTime(), PushBean.DATE_FORMAT, NoticeBean.DATE_FORMAT));
+    noticeBean.setEventId(bean.getItemNo());
+    noticeBean.setNoticeNo("");
+    noticeBean.setFlag(getNoticeFlagFromPush(bean.getPushType()));
+    noticeBean.setViewType(NoticeBean.VIEW_TYPE_TEXT_LINK);
+    return noticeBean;
   }
 
   private static String getNoticeFlagFromPush(String pushType) {
@@ -153,4 +164,25 @@ public class NotiModel extends Model {
   public void stopLoading() {
     disposeLoading();
   }
+
+  public void clearPushMessages() {
+    if (pushMessageManager.hasMessages()) {
+      pushMessageManager.clear();
+      PushMessageManager.savePushMessages(pushMessageManager);
+      dispatchMessage();
+    }
+  }
+
+  private void dispatchMessage() {
+    onResult(new Event.Builder(Event.PUSH).build());
+  }
+
+  /***********************************
+   * PushMessageBroker.IPushMessageListener
+   ***********************************/
+  @Override
+  public void onMessageReceived(PushBean bean) {
+    pushMessageManager.addPushBean(bean);
+    new Handler(Looper.getMainLooper()).post(this::dispatchMessage);
+  }
 }

+ 18 - 5
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/notification/NotiPagerAdapter.java

@@ -5,6 +5,7 @@ import android.support.annotation.Nullable;
 import android.support.v4.app.Fragment;
 import android.support.v4.app.FragmentManager;
 import android.support.v4.app.FragmentStatePagerAdapter;
+import android.util.Log;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -26,18 +27,19 @@ public class NotiPagerAdapter extends FragmentStatePagerAdapter implements NotiL
 
   private static final int PAGE_COUNT = 3;
   private String[] tabs;
-  private List<NoticeBean> beans;
+  private List<NoticeBean> noticeBeans;
 
-  public NotiPagerAdapter(FragmentManager fm, String[] tabs, List<NoticeBean> beans) {
+  public NotiPagerAdapter(FragmentManager fm, String[] tabs, List<NoticeBean> noticeBeans) {
     super(fm);
     this.tabs = tabs;
-    this.beans = beans;
+    this.noticeBeans = noticeBeans;
   }
 
   @Override
   public Fragment getItem(int position) {
     NotiListFragment notiFragment = NotiListFragment.newInstance(position);
     notiFragment.setListener(this);
+    Log.w("APP# NotiPagerAdapter | getItem", "|" + " --------> " + position);
     return notiFragment;
   }
 
@@ -66,18 +68,29 @@ public class NotiPagerAdapter extends FragmentStatePagerAdapter implements NotiL
 
     List<NoticeBean> beans = new ArrayList<>();
     if (category == NotiFragment.CATEGORY_KEY_ALL) {
-      beans = this.beans;
+      beans = this.noticeBeans;
     }
     else {
       String categoryName = categories[category];
 
-      for (NoticeBean bean : this.beans) {
+      int len = this.noticeBeans.size();
+      NoticeBean bean;
+      for (int i = 0; i < len; ++i) {
+        bean = noticeBeans.get(i);
         if (bean.getCategory().equals(categoryName)) {
           beans.add(bean);
         }
       }
     }
 
+    Log.w("APP# NotiPagerAdapter | onInit", "|" + "cate: " + category + ", size: " + beans.size());
+
     notiListFragment.init(beans);
   }
+
+  public void update(List<NoticeBean> noticeBeans) {
+    this.noticeBeans = noticeBeans;
+
+    notifyDataSetChanged();
+  }
 }

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

@@ -23,13 +23,12 @@ public class NotiPresenter extends Presenter<NotiModel, INotiView> {
     super(model, view);
 
     doubleChecker = new DoubleChecker(this::render);
-
-    this.model.loadNotification();
   }
 
   @Override
   protected void createViewInternal() {
   }
+
   @Override
   protected void destroyInternal() {
     if (null != doubleChecker) {
@@ -49,7 +48,7 @@ public class NotiPresenter extends Presenter<NotiModel, INotiView> {
 
   @Override
   protected void startInternalOnce() {
-
+    this.model.loadNotification();
   }
 
   @Override
@@ -87,6 +86,9 @@ public class NotiPresenter extends Presenter<NotiModel, INotiView> {
       case Event.RESULT:
         doubleChecker.checkSecond();
         break;
+      case Event.PUSH:
+        render();
+        break;
       default:
         break;
     }
@@ -99,10 +101,15 @@ public class NotiPresenter extends Presenter<NotiModel, INotiView> {
 
   @Override
   public void onActionButtonClick() {
-    // // FIXME: 알림 전체보기 삭제됨
+    model.clearPushMessages();
   }
 
   private void render() {
     view.drawList(model.getNoticeBeans());
   }
+
+  public void onPageChanged(int index) {
+    // 소식 탭일 경우
+    view.setActionButtonVisible(index == 1);
+  }
 }

+ 7 - 3
app/src/main/res/layout/fragment_noti.xml

@@ -61,7 +61,7 @@
 
   </android.support.design.widget.AppBarLayout>
 
-  <LinearLayout
+  <android.support.constraint.ConstraintLayout
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     app:layout_behavior="@string/appbar_scrolling_view_behavior"
@@ -70,9 +70,13 @@
     <android.support.v4.view.ViewPager
       android:id="@+id/alarm_view_pager"
       android:layout_width="match_parent"
-      android:layout_height="match_parent"/>
+      android:layout_height="match_parent"
+      app:layout_constraintBottom_toBottomOf="parent"
+      app:layout_constraintEnd_toEndOf="parent"
+      app:layout_constraintStart_toStartOf="parent"
+      app:layout_constraintTop_toTopOf="parent"/>
 
-  </LinearLayout>
+  </android.support.constraint.ConstraintLayout>
 
 
 </android.support.design.widget.CoordinatorLayout>

+ 57 - 11
app/src/main/res/layout/fragment_noti_list.xml

@@ -1,26 +1,72 @@
 <?xml version="1.0" encoding="utf-8"?>
-<RelativeLayout
+<android.support.constraint.ConstraintLayout
   xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
-  android:background="@color/CFFFFFF"
-  android:orientation="vertical">
+  android:background="@color/CFFFFFF">
 
   <android.support.v7.widget.RecyclerView
     android:id="@+id/recycler_view_alarm_list"
-    android:clipToPadding="false"
     android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:layout_marginBottom="10dp"
-    android:layout_marginStart="25dp"
-    android:layout_marginEnd="25dp"
-    android:paddingTop="20dp"
+    android:layout_height="0dp"
+    android:clipToPadding="false"
     android:divider="@color/CFFFFFF"
-    android:dividerHeight="26dp">
+    android:dividerHeight="26dp"
+    android:paddingStart="25dp"
+    android:paddingTop="20dp"
+    android:paddingEnd="25dp"
+    android:paddingBottom="35dp"
+    app:layout_constrainedHeight="true"
+    app:layout_constraintBottom_toBottomOf="parent"
+    app:layout_constraintEnd_toEndOf="parent"
+    app:layout_constraintStart_toStartOf="parent"
+    app:layout_constraintTop_toTopOf="parent"
+    app:layout_constraintVertical_bias="0">
 
   </android.support.v7.widget.RecyclerView>
 
+  <android.support.constraint.ConstraintLayout
+    android:id="@+id/layout_nothing"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <ImageView
+      android:id="@+id/imageView8"
+      android:layout_width="wrap_content"
+      android:layout_height="wrap_content"
+      android:layout_marginStart="8dp"
+      android:layout_marginTop="8dp"
+      android:layout_marginEnd="8dp"
+      android:layout_marginBottom="8dp"
+      app:layout_constraintBottom_toTopOf="@+id/textView8"
+      app:layout_constraintEnd_toEndOf="parent"
+      app:layout_constraintHorizontal_bias="0.5"
+      app:layout_constraintStart_toStartOf="parent"
+      app:layout_constraintTop_toTopOf="parent"
+      app:layout_constraintVertical_bias=".3"
+      app:layout_constraintVertical_chainStyle="packed"
+      app:srcCompat="@drawable/ic_icon_search_none"/>
+
+    <TextView
+      android:id="@+id/textView8"
+      android:layout_width="wrap_content"
+      android:layout_height="wrap_content"
+      android:layout_marginStart="8dp"
+      android:layout_marginEnd="8dp"
+      android:layout_marginBottom="8dp"
+      android:gravity="center_horizontal"
+      android:lineSpacingExtra="5.5sp"
+      android:text="@string/notice_nothing"
+      android:textColor="@color/CC5C5C5"
+      android:textSize="14sp"
+      app:layout_constraintBottom_toBottomOf="parent"
+      app:layout_constraintEnd_toEndOf="parent"
+      app:layout_constraintHorizontal_bias="0.5"
+      app:layout_constraintStart_toStartOf="parent"
+      app:layout_constraintTop_toBottomOf="@+id/imageView8"/>
+
+  </android.support.constraint.ConstraintLayout>
 
-</RelativeLayout>
+</android.support.constraint.ConstraintLayout>

+ 6 - 0
app/src/main/res/values/strings.xml

@@ -518,6 +518,12 @@
   <string name="user_quit_fail_message3">Lifeplus 정책상 마이너스 코인이\n발생한 경우 회원탈퇴가 불가능합니다.\n최소 0코인 이후부터 회원탈퇴가 가능하므로\n추후 다시 시도해주시기 바랍니다. </string>
   <string name="select_coin_possible_message">최근 1년 이내로 조회 가능합니다.</string>
 
+  <!-- 알림 -->
+  <string name="notice_nothing">최근소식이 없습니다.\n나와 관련된 알림을 한번에 모아서\n확인할 수 있습니다.</string>
+  <string name="notice_category_all">전체</string>
+  <string name="notice_category_news">소식</string>
+  <string name="notice_category_notice">공지</string>
+
   <!--메인의 날씨-->
   <string name="weather_area">"지금 %s"</string>
   <string name="weather_sunny">맑음입니다</string>