Browse Source

Merge branch 'develop' of https://github.com/swict/LifeplusAndroid into develop

Hasemi 6 years ago
parent
commit
75a13e3b9d
18 changed files with 394 additions and 100 deletions
  1. 30 7
      app/src/main/java/kr/co/zumo/app/lifeplus/activity/ActivityBase.java
  2. 27 18
      app/src/main/java/kr/co/zumo/app/lifeplus/activity/AllMenuDriver.java
  3. 38 0
      app/src/main/java/kr/co/zumo/app/lifeplus/activity/IDrawEvent.java
  4. 3 15
      app/src/main/java/kr/co/zumo/app/lifeplus/bean/api/EventRecommendRequestBean.java
  5. 1 5
      app/src/main/java/kr/co/zumo/app/lifeplus/helper/ActionBarBuilder.java
  6. 1 0
      app/src/main/java/kr/co/zumo/app/lifeplus/helper/ActionBarHelper.java
  7. 6 13
      app/src/main/java/kr/co/zumo/app/lifeplus/helper/NavigationBar.java
  8. 2 2
      app/src/main/java/kr/co/zumo/app/lifeplus/supervisor/PushMessageManager.java
  9. 85 0
      app/src/main/java/kr/co/zumo/app/lifeplus/view/AnimationDrawableCallback.java
  10. 9 0
      app/src/main/java/kr/co/zumo/app/lifeplus/view/animation/NotiAnimation.java
  11. 63 3
      app/src/main/java/kr/co/zumo/app/lifeplus/view/presenter/Presenter.java
  12. 55 3
      app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/FragmentBase.java
  13. 2 2
      app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/event/recommend/EventRecommendBasicModel.java
  14. 3 1
      app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/event/select/EventDetailSelectPresenter.java
  15. 4 0
      app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/main/IMainView.java
  16. 10 1
      app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/main/MainFragment.java
  17. 11 0
      app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/main/MainPresenter.java
  18. 44 30
      app/src/main/res/layout/action_bar.xml

+ 30 - 7
app/src/main/java/kr/co/zumo/app/lifeplus/activity/ActivityBase.java

@@ -157,7 +157,7 @@ public abstract class ActivityBase extends AppCompatActivity implements IHelperP
       addDrawerLayoutAnimation();
 
       allMenuDriver = new AllMenuDriver(this, drawerView, event -> {
-        final FragmentBase fragment = (FragmentBase) getSupportFragmentManager().findFragmentById(R.id.container_main);
+        final FragmentBase fragment = getCurrentFragment();
         if (null != fragment) {
           fragment.onMenuEvent(event);
         }
@@ -330,9 +330,13 @@ public abstract class ActivityBase extends AppCompatActivity implements IHelperP
     }
   }
 
+  private FragmentBase getCurrentFragment() {
+    return (FragmentBase) getSupportFragmentManager().findFragmentById(R.id.container_main);
+  }
+
   private boolean exitToBack() {
     // fragment 가 있다면.
-    final FragmentBase fragment = (FragmentBase) getSupportFragmentManager().findFragmentById(R.id.container_main);
+    final FragmentBase fragment = getCurrentFragment();
     if (null != fragment) {
       return fragment.onBackPressed();
     }
@@ -382,10 +386,9 @@ public abstract class ActivityBase extends AppCompatActivity implements IHelperP
   public void openDrawer() {
     if (false == isDrawerOpen()) {
       drawerLayout.openDrawer(Gravity.END);
-      allMenuDriver.onOpen();
+      allMenuDriver.onDrawerOpenStart();
+      getCurrentFragment().onDrawerOpenStart();
     }
-
-
   }
 
   /**
@@ -394,7 +397,8 @@ public abstract class ActivityBase extends AppCompatActivity implements IHelperP
   public void closeDrawer() {
     if (isDrawerOpen()) {
       drawerLayout.closeDrawer(Gravity.END);
-      allMenuDriver.onClose();
+      allMenuDriver.onDrawerCloseStart();
+      getCurrentFragment().onDrawerCloseStart();
     }
   }
 
@@ -413,9 +417,10 @@ public abstract class ActivityBase extends AppCompatActivity implements IHelperP
    *
    * @param isVisible
    */
-  public void setVisibleTextButton(boolean isVisible){
+  public void setVisibleTextButton(boolean isVisible) {
     allMenuDriver.setVisibleTextButton(isVisible);
   }
+
   /**
    * drawer 애니메이션 적용
    */
@@ -423,13 +428,31 @@ public abstract class ActivityBase extends AppCompatActivity implements IHelperP
     drawerLayout.addDrawerListener(new DrawerLayout.SimpleDrawerListener() {
       @Override
       public void onDrawerSlide(View drawerView, float slideOffset) {
+        /*
+         * 메인 스크린 0 ~ -1/2W 이동
+         */
         int half = drawerView.getWidth() >> 1;
         float moveFactor = half * slideOffset;
         containerMain.setTranslationX(-moveFactor);
 
+        /*
+         * 메뉴 내부 -1/2W ~ 0 이동
+         */
         float menuOffset = -(half - moveFactor);
         allMenuDriver.getContainer().setTranslationX(menuOffset);
       }
+
+      @Override
+      public void onDrawerOpened(View drawerView) {
+        allMenuDriver.onDrawerOpenEnd();
+        getCurrentFragment().onDrawerOpenEnd();
+      }
+
+      @Override
+      public void onDrawerClosed(View drawerView) {
+        allMenuDriver.onDrawerCloseEnd();
+        getCurrentFragment().onDrawerCloseEnd();
+      }
     });
   }
 

+ 27 - 18
app/src/main/java/kr/co/zumo/app/lifeplus/activity/AllMenuDriver.java

@@ -4,7 +4,6 @@ import android.content.Context;
 import android.os.Handler;
 import android.os.Looper;
 import android.support.constraint.ConstraintLayout;
-import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.animation.DecelerateInterpolator;
@@ -31,7 +30,7 @@ import kr.co.zumo.app.lifeplus.view.IEventListener;
  * @history 하세미   [2019-03-06]   [최초 작성]
  * @since 2019-03-06
  */
-public class AllMenuDriver implements PushMessageBroker.IPushMessageListener {
+public class AllMenuDriver implements PushMessageBroker.IPushMessageListener, IDrawEvent {
 
   private PushMessageManager pushMessageManager;
 
@@ -149,25 +148,10 @@ public class AllMenuDriver implements PushMessageBroker.IPushMessageListener {
    *
    * @param isVisible
    */
-  public void setVisibleTextButton(boolean isVisible) {
+  void setVisibleTextButton(boolean isVisible) {
     navigationBar.setVisibleTextButton(isVisible);
   }
 
-  void onOpen() {
-    setDefaultAnimationSetting();
-    showMenuAnimation();
-
-    pushMessageManager = PushMessageManager.getStoredManager();
-    PushMessageBroker.getInstance().registerObserver(this);
-    dispatchMessage();
-  }
-
-
-  void onClose() {
-    PushMessageBroker.getInstance().unregisterObserver(this);
-    navigationBar.setNotiMarker(false, false);
-  }
-
   private void dispatchMessage() {
     if (hasMessages()) {
       navigationBar.setNotiMarker(true, true);
@@ -187,4 +171,29 @@ public class AllMenuDriver implements PushMessageBroker.IPushMessageListener {
     new Handler(Looper.getMainLooper()).post(this::dispatchMessage);
   }
 
+  /***********************************
+   * IDrawEvent
+   ***********************************/
+  @Override
+  public void onDrawerOpenStart() {
+    setDefaultAnimationSetting();
+    showMenuAnimation();
+  }
+
+  @Override
+  public void onDrawerOpenEnd() {
+    pushMessageManager = PushMessageManager.getStoredManager();
+    PushMessageBroker.getInstance().registerObserver(this);
+    new Handler(Looper.getMainLooper()).postDelayed(this::dispatchMessage, 400);
+  }
+
+  @Override
+  public void onDrawerCloseStart() {
+    PushMessageBroker.getInstance().unregisterObserver(this);
+  }
+
+  @Override
+  public void onDrawerCloseEnd() {
+    navigationBar.setNotiMarker(false, false);
+  }
 }

+ 38 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/activity/IDrawEvent.java

@@ -0,0 +1,38 @@
+/*
+ * COPYRIGHT (c) 2018 All rights reserved by HANWHA LIFE.
+ */
+package kr.co.zumo.app.lifeplus.activity;
+
+/**
+ * IDrawEvent
+ * <pre>
+ * </pre>
+ *
+ * @author 민효동
+ * @version 1.0
+ * @history 민효동   [2019. 3. 8.]   [최초 작성]
+ * @since 2019. 3. 8.
+ */
+public interface IDrawEvent {
+
+  /**
+   * Drawer 열림 시작
+   */
+  void onDrawerOpenStart();
+
+  /**
+   * Drawer 열림 끝
+   */
+  void onDrawerOpenEnd();
+
+  /**
+   * Drawer 닫힘 시작
+   */
+  void onDrawerCloseStart();
+
+  /**
+   * Drawer 닫힘 끝
+   */
+  void onDrawerCloseEnd();
+
+}

+ 3 - 15
app/src/main/java/kr/co/zumo/app/lifeplus/bean/api/EventRecommendRequestBean.java

@@ -3,8 +3,6 @@
  */
 package kr.co.zumo.app.lifeplus.bean.api;
 
-import com.google.gson.annotations.SerializedName;
-
 /**
  * EventRecommendRequestBean
  * <pre>
@@ -15,19 +13,9 @@ import com.google.gson.annotations.SerializedName;
  * @history 민효동   [2019-02-17]   [최초 작성]
  * @since 2019-02-17
  */
-public class EventRecommendRequestBean extends RequestBean {
-  @SerializedName("answNo")
-  private String answerItemNo;
-
-  public EventRecommendRequestBean(String answerItemNo) {
-    this.answerItemNo = answerItemNo;
-  }
-
-  public String getAnswerItemNo() {
-    return answerItemNo;
-  }
+public class EventRecommendRequestBean extends ItemNoRequestBean {
 
-  public void setAnswerItemNo(String answerItemNo) {
-    this.answerItemNo = answerItemNo;
+  public EventRecommendRequestBean(String itemNo) {
+    super(itemNo);
   }
 }

+ 1 - 5
app/src/main/java/kr/co/zumo/app/lifeplus/helper/ActionBarBuilder.java

@@ -129,11 +129,7 @@ public class ActionBarBuilder {
     isVisibleCategory = true;
     selectedCategoryIndex = index;
     this.categoryListener = categoryListener;
-    navigationBarBuilder.arrow(navigationBar -> {
-      if (null != arrowListener) {
-        arrowListener.onClick(navigationBar);
-      }
-    });
+    navigationBarBuilder.arrow();
     return this;
   }
 

+ 1 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/helper/ActionBarHelper.java

@@ -90,6 +90,7 @@ public class ActionBarHelper extends Helper {
     toolbar.setContentInsetsAbsolute(0, 0);
 
     progressBar = appBarLayout.findViewById(R.id.progress_bar);
+
     layoutCategoryTab = appBarLayout.findViewById(R.id.layout_category_main_tab);
     categoryMainTab = appBarLayout.findViewById(R.id.category_main_tab);
 

+ 6 - 13
app/src/main/java/kr/co/zumo/app/lifeplus/helper/NavigationBar.java

@@ -35,6 +35,7 @@ import kr.co.zumo.app.lifeplus.view.animation.NotiAnimation;
 public class NavigationBar {
   private View navigationView;
 
+  private View layoutTitleHitArea;
   private TextView actionBarTitle;
   private ImageView imageBi;
   private ImageView buttonBack;
@@ -82,6 +83,7 @@ public class NavigationBar {
     imageBi = navigationView.findViewById(R.id.image_bi);
     viewUnderline = navigationView.findViewById(R.id.view_underline);
 
+    layoutTitleHitArea = navigationView.findViewById(R.id.layout_title_hit_area);
     actionBarTitle = navigationView.findViewById(R.id.action_bar_title);
     buttonArrow = navigationView.findViewById(R.id.image_view_open_arrow);
     buttonSearch = navigationView.findViewById(R.id.image_view_search);
@@ -104,7 +106,7 @@ public class NavigationBar {
     setClickListener(buttonBack);
     setClickListener(buttonSearch);
     setClickListener(buttonMenu);
-    setClickListener(actionBarTitle);
+    setClickListener(layoutTitleHitArea);
     setClickListener(buttonHome);
     setClickListener(buttonNotification);
     setClickListener(buttonSetting);
@@ -160,7 +162,7 @@ public class NavigationBar {
   }
 
   private void setTitleVisible(boolean isVisible) {
-    setViewVisible(actionBarTitle, isVisible);
+    setViewVisible(layoutTitleHitArea, isVisible);
   }
 
   private void setBackVisible(boolean isVisible) {
@@ -299,7 +301,7 @@ public class NavigationBar {
 
     setTitleVisible(newBuilder.isVisibleTitle);
     setTitleString(newBuilder.title);
-    mapClickListener(actionBarTitle, v -> {
+    mapClickListener(layoutTitleHitArea, v -> {
       toggleArrow();
       if (null != newBuilder.titleListener) {
         newBuilder.titleListener.onClick(NavigationBar.this);
@@ -325,12 +327,6 @@ public class NavigationBar {
     mapClickListener(textButton, newBuilder.textButtonListener);
 
     setArrowVisible(newBuilder.isVisibleArrow);
-    mapClickListener(buttonArrow, v -> {
-      toggleArrowInternal();
-      if (null != newBuilder.arrowListener) {
-        newBuilder.arrowListener.onClick(NavigationBar.this);
-      }
-    });
 
     setUnderlineVisible(newBuilder.isVisibleUnderline);
 
@@ -695,7 +691,6 @@ public class NavigationBar {
     protected INavigationBarListener settingListener = null;
     protected INavigationBarListener closeListener = null;
     protected INavigationBarListener textButtonListener = null;
-    protected INavigationBarListener arrowListener = null;
     protected INavigationBarListener editListener = null;
     protected INavigationBarListener trashListener = null;
     protected INavigationBarListener confirmListener = null;
@@ -858,12 +853,10 @@ public class NavigationBar {
     /**
      * arrow (타이틀 옆)
      *
-     * @param arrowListener
      * @return Builder
      */
-    public Builder arrow(INavigationBarListener arrowListener) {
+    public Builder arrow() {
       isVisibleArrow = true;
-      this.arrowListener = arrowListener;
       return this;
     }
 

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

@@ -63,7 +63,7 @@ public class PushMessageManager {
    * @return
    */
   public PushMessageManager addPushBean(PushBean bean) {
-    if (APIData.isTrue(bean.getNeedSaving()) && isNewsSavigCode(bean.getScreenCode())) {
+    if (APIData.isTrue(bean.getNeedSaving()) && isNewsSavingCode(bean.getScreenCode())) {
       Log.d("APP# PushMessageManager | addPushBean", "|" + "add: " + bean.toJson());
       pushBeans.add(bean);
       isUnread = true;
@@ -214,7 +214,7 @@ public class PushMessageManager {
    * @param code
    * @return
    */
-  public static boolean isNewsSavigCode(String code) {
+  public static boolean isNewsSavingCode(String code) {
     String[] codes = new String[]{CODE_EVENT_WINNER, CODE_EXTINCTION, CODE_MY_COUPON};
     for (String s : codes) {
       if (s.equals(code)) {

+ 85 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/view/AnimationDrawableCallback.java

@@ -0,0 +1,85 @@
+/*
+ * COPYRIGHT (c) 2018 All rights reserved by HANWHA LIFE.
+ */
+package kr.co.zumo.app.lifeplus.view;
+
+import android.graphics.drawable.AnimationDrawable;
+import android.graphics.drawable.Drawable;
+import android.view.View;
+
+
+/**
+ * Provides a callback when a non-looping {@link AnimationDrawable} completes its animation sequence. More precisely,
+ * {@link #onAnimationComplete()} is triggered when {@link View#invalidateDrawable(Drawable)} has been called on the
+ * last frame.
+ *
+ * @author Benedict Lau
+ */
+public abstract class AnimationDrawableCallback implements Drawable.Callback {
+
+  /**
+   * The last frame of {@link Drawable} in the {@link AnimationDrawable}.
+   */
+  private Drawable mLastFrame;
+
+  /**
+   * The client's {@link Drawable.Callback} implementation. All calls are proxied to this wrapped {@link Drawable.Callback}
+   * implementation after intercepting the events we need.
+   */
+  private Drawable.Callback mWrappedCallback;
+
+  /**
+   * Flag to ensure that {@link #onAnimationComplete()} is called only once, since
+   * {@link #invalidateDrawable(Drawable)} may be called multiple times.
+   */
+  private boolean mIsCallbackTriggered = false;
+
+  /**
+   *
+   * @param animationDrawable
+   *            the {@link AnimationDrawable}.
+   * @param callback
+   *            the client's {@link Drawable.Callback} implementation. This is usually the {@link View} the has the
+   *            {@link AnimationDrawable} as background.
+   */
+  public AnimationDrawableCallback(AnimationDrawable animationDrawable, Drawable.Callback callback) {
+    mLastFrame = animationDrawable.getFrame(animationDrawable.getNumberOfFrames() - 1);
+    mWrappedCallback = callback;
+  }
+
+  @Override
+  public void invalidateDrawable(Drawable who) {
+    if (mWrappedCallback != null) {
+      mWrappedCallback.invalidateDrawable(who);
+    }
+
+    if (!mIsCallbackTriggered && mLastFrame != null && mLastFrame.equals(who.getCurrent())) {
+      mIsCallbackTriggered = true;
+      onAnimationComplete();
+    }
+  }
+
+  @Override
+  public void scheduleDrawable(Drawable who, Runnable what, long when) {
+    if (mWrappedCallback != null) {
+      mWrappedCallback.scheduleDrawable(who, what, when);
+    }
+  }
+
+  @Override
+  public void unscheduleDrawable(Drawable who, Runnable what) {
+    if (mWrappedCallback != null) {
+      mWrappedCallback.unscheduleDrawable(who, what);
+    }
+  }
+
+  //
+  // Public methods.
+  //
+
+  /**
+   * Callback triggered when {@link View#invalidateDrawable(Drawable)} has been called on the last frame, which marks
+   * the end of a non-looping animation sequence.
+   */
+  public abstract void onAnimationComplete();
+}

+ 9 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/view/animation/NotiAnimation.java

@@ -4,9 +4,11 @@
 package kr.co.zumo.app.lifeplus.view.animation;
 
 import android.graphics.drawable.AnimationDrawable;
+import android.view.View;
 import android.widget.ImageView;
 
 import kr.co.zumo.app.R;
+import kr.co.zumo.app.lifeplus.view.AnimationDrawableCallback;
 
 /**
  * NotiAnimation
@@ -23,8 +25,15 @@ public class NotiAnimation {
   private AnimationDrawable animationDrawable;
 
   public void show(ImageView target) {
+    target.setLayerType(View.LAYER_TYPE_HARDWARE, null);
     target.setImageResource(R.drawable.noti_animation);
     animationDrawable = (AnimationDrawable) target.getDrawable();
+    animationDrawable.setCallback(new AnimationDrawableCallback(animationDrawable, target) {
+      @Override
+      public void onAnimationComplete() {
+        target.setLayerType(View.LAYER_TYPE_NONE, null);
+      }
+    });
     animationDrawable.setOneShot(true);
     animationDrawable.start();
   }

+ 63 - 3
app/src/main/java/kr/co/zumo/app/lifeplus/view/presenter/Presenter.java

@@ -16,6 +16,7 @@ import kr.co.zumo.app.R;
 import kr.co.zumo.app.lifeplus.CommonException;
 import kr.co.zumo.app.lifeplus.ILifeCycle;
 import kr.co.zumo.app.lifeplus.activity.ActivityBase;
+import kr.co.zumo.app.lifeplus.activity.IDrawEvent;
 import kr.co.zumo.app.lifeplus.bean.BucketDeliveryBean;
 import kr.co.zumo.app.lifeplus.bean.ContentsDeliveryBean;
 import kr.co.zumo.app.lifeplus.bean.ContentsWebDeliveryBean;
@@ -74,7 +75,7 @@ import kr.co.zumo.app.lifeplus.view.screen.main.SystemPopupModelHelper;
  * @history 민효동   [2018. 9. 21.]   [최초 작성]
  * @since 2018. 9. 21.
  */
-public abstract class Presenter<M extends Model, V extends IView> implements ILifeCycle, INetworkReceiverListener, IModelResult, IEventListener, IHelperProvider, IWaiterCallable, IModuleEmergencyHandler {
+public abstract class Presenter<M extends Model, V extends IView> implements ILifeCycle, INetworkReceiverListener, IModelResult, IEventListener, IHelperProvider, IWaiterCallable, IModuleEmergencyHandler, IDrawEvent {
 
   protected M model;
   protected V view;
@@ -195,7 +196,12 @@ public abstract class Presenter<M extends Model, V extends IView> implements ILi
     }
   }
 
-  public void onMenuEvent(Event event) {
+  /**
+   * Drawer Event
+   *
+   * @param event
+   */
+  public final void onMenuEvent(Event event) {
 
     switch (event.getEventId()) {
       case Event.FIRST_CATEGORY:
@@ -257,7 +263,6 @@ public abstract class Presenter<M extends Model, V extends IView> implements ILi
       go(id);
     }
   }
-
   /**
    * 장치 back key 눌렸을 경우 처리한다.
    * - 이벤트를 처리했다면 true 를 반환한다.
@@ -1079,4 +1084,59 @@ public abstract class Presenter<M extends Model, V extends IView> implements ILi
   }
 
 
+  /***********************************
+   * IDrawEvent
+   ***********************************/
+
+  /**
+   * Drawer 열림 시작
+   */
+  public final void onDrawerOpenStart() {
+    onDrawerOpenStartInternal();
+  }
+
+  protected void onDrawerOpenStartInternal() {
+    {
+      // to override
+    }
+  }
+  /**
+   * Drawer 열림 끝
+   */
+  public final void onDrawerOpenEnd() {
+    onDrawerOpenEndInternal();
+  }
+
+  protected void onDrawerOpenEndInternal() {
+    {
+      // to override
+    }
+  }
+
+  /**
+   * Drawer 닫힘 시작
+   */
+  public final void onDrawerCloseStart() {
+    onDrawerCloseStartInternal();
+  }
+
+  protected void onDrawerCloseStartInternal() {
+    {
+      // to override
+    }
+  }
+
+  /**
+   * Drawer 닫힘 끝
+   */
+  public final void onDrawerCloseEnd() {
+    onDrawerCloseEndInternal();
+  }
+
+  protected void onDrawerCloseEndInternal() {
+    {
+      // to override
+    }
+  }
+
 }

+ 55 - 3
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/FragmentBase.java

@@ -19,6 +19,7 @@ import android.view.animation.Animation;
 import com.bumptech.glide.Glide;
 
 import io.reactivex.disposables.CompositeDisposable;
+import kr.co.zumo.app.lifeplus.activity.IDrawEvent;
 import kr.co.zumo.app.lifeplus.helper.ActionBarHelper;
 import kr.co.zumo.app.lifeplus.helper.ActionButtonHelper;
 import kr.co.zumo.app.lifeplus.helper.Helper;
@@ -39,7 +40,7 @@ import kr.co.zumo.app.lifeplus.view.presenter.Presenter;
  * @history 민효동   [2018. 9. 28.]   [최초 작성]
  * @since 2018. 9. 28.
  */
-public abstract class FragmentBase<P extends Presenter> extends Fragment implements IView {
+public abstract class FragmentBase<P extends Presenter> extends Fragment implements IView, IDrawEvent {
 
   protected CompositeDisposable disposable = new CompositeDisposable();
 
@@ -284,8 +285,15 @@ public abstract class FragmentBase<P extends Presenter> extends Fragment impleme
     return false;
   }
 
-  public void onMenuEvent(Event event){
-    presenter.onMenuEvent(event);
+  /**
+   * Drawer 메뉴 이벤트 처리
+   *
+   * @param event
+   */
+  public void onMenuEvent(Event event) {
+    if (null != presenter) {
+      presenter.onMenuEvent(event);
+    }
   }
 
   /**
@@ -331,4 +339,48 @@ public abstract class FragmentBase<P extends Presenter> extends Fragment impleme
   //Activity getActivity(); 이미 Fragment 에 구현되어있다.
 
 
+  /***********************************
+   * IDrawEvent
+   ***********************************/
+
+  /**
+   * Drawer 열림 시작
+   */
+  @Override
+  public void onDrawerOpenStart() {
+    if (null != presenter) {
+      presenter.onDrawerOpenStart();
+    }
+  }
+
+  /**
+   * Drawer 열림 끝
+   */
+  @Override
+  public void onDrawerOpenEnd() {
+    if (null != presenter) {
+      presenter.onDrawerOpenEnd();
+    }
+  }
+
+  /**
+   * Drawer 닫힘 시작
+   */
+  @Override
+  public void onDrawerCloseStart() {
+    if (null != presenter) {
+      presenter.onDrawerCloseStart();
+    }
+  }
+
+  /**
+   * Drawer 닫힘 끝
+   */
+  @Override
+  public void onDrawerCloseEnd() {
+    if (null != presenter) {
+      presenter.onDrawerCloseEnd();
+    }
+  }
+
 }

+ 2 - 2
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/event/recommend/EventRecommendBasicModel.java

@@ -105,9 +105,9 @@ public class EventRecommendBasicModel extends Model {
   public void loadRecommendContents() {
     stopLoading();
 
-    String answerNo = eventAnswerRecordBean.getSelectedAnswerNo();
+    String itemNo = deliveredEventDetailBean.getItemNo();
 
-    disposableRelatedContents = new APIEventRecommendModule().call(new EventRecommendRequestBean(answerNo), new APIModuleListener<EventRecommendResultBean>(waiterCaller) {
+    disposableRelatedContents = new APIEventRecommendModule().call(new EventRecommendRequestBean(itemNo), new APIModuleListener<EventRecommendResultBean>(waiterCaller) {
       @Override
       public void onApiSuccess(EventRecommendResultBean resultBean) {
         contentsBeans = resultBean.getData();

+ 3 - 1
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/event/select/EventDetailSelectPresenter.java

@@ -114,13 +114,13 @@ public class EventDetailSelectPresenter extends EventDetailPresenter<EventDetail
           view.detachEvent(index);  // 페이지 버튼 이벤트 중단
           model.answer(index, integer, bool); // 응답 저장
 
+          showContentsBarrier();
           // 마지막 페이지 확인
           if (model.isLastPage(index)) {
             // 이벤트 참여
             model.submit();
           }
           else {
-            showContentsBarrier();
             new Handler().postDelayed(() -> {
               scrollToPosition(index + 1);
             }, 150); // 약간 머물렀다 이동
@@ -252,6 +252,7 @@ public class EventDetailSelectPresenter extends EventDetailPresenter<EventDetail
   }
 
   private void onSubmitCompleted() {
+    hideContentsBarrier();
     // 이벤트 참여 후
     // 단일 질문 => 결과 페이지 표시 => 추천 콘텐츠(버튼) => tag or 기본 형 추천 컨텐츠 표시
     // 복수 질문 => tag 추천 컨텐츠 표시
@@ -260,6 +261,7 @@ public class EventDetailSelectPresenter extends EventDetailPresenter<EventDetail
     if (model.isSimpleQuestion()) {
       // 단일 질문
       // 참여 결과 노출 => 설정 된 추천 컨텐츠(tar or basic) 표시
+      finish();
       go(ScreenID.EVENT_RECORD);
     }
     else {

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

@@ -36,4 +36,8 @@ public interface IMainView extends IView {
   void setWeatherClickEnabled(boolean enabled);
 
   void setNewbieLayoutVisible(boolean visible);
+
+  void pause();
+
+  void resume();
 }

+ 10 - 1
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/main/MainFragment.java

@@ -59,7 +59,6 @@ import kr.co.zumo.app.lifeplus.supervisor.ScreenID;
 import kr.co.zumo.app.lifeplus.supervisor.screen.Screen;
 import kr.co.zumo.app.lifeplus.util.AppUtil;
 import kr.co.zumo.app.lifeplus.util.Formatter;
-import kr.co.zumo.app.lifeplus.util.ResourceUtil;
 import kr.co.zumo.app.lifeplus.util.StringUtil;
 import kr.co.zumo.app.lifeplus.util.ViewUtil;
 import kr.co.zumo.app.lifeplus.view.Event;
@@ -355,6 +354,16 @@ public class MainFragment extends FragmentBase<MainPresenter> implements IMainVi
     }
   }
 
+  @Override
+  public void pause() {
+    adapter.pause();
+  }
+
+  @Override
+  public void resume() {
+    adapter.resume();
+  }
+
   @Override
   public void requestLocationPermissions(@NonNull String[] permissions) {
     Log.i("APP# MainFragment | requestLocationPermissions", "|" + " permissions: " + Arrays.toString(permissions));

+ 11 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/main/MainPresenter.java

@@ -180,6 +180,17 @@ public class MainPresenter extends Presenter<MainModel, IMainView> {
   protected void destroyInternal() {
   }
 
+  @Override
+  protected void onDrawerOpenEndInternal() {
+    clearTimer();
+    view.pause();
+  }
+
+  @Override
+  protected void onDrawerCloseStartInternal() {
+    view.resume();
+  }
+
   @Override
   public void onScreenReady() {
     doubleChecker.checkFirst();

+ 44 - 30
app/src/main/res/layout/action_bar.xml

@@ -85,43 +85,57 @@
       app:layout_constraintTop_toTopOf="parent"
       app:srcCompat="@drawable/bi_header_black"/>
 
-    <TextView
-      android:id="@+id/action_bar_title"
+    <LinearLayout
+      android:id="@+id/layout_title_hit_area"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_marginStart="50dp"
-      android:background="?android:attr/selectableItemBackground"
-      android:gravity="center"
-      android:maxLines="1"
-      android:paddingTop="7dp"
-      android:paddingBottom="7dp"
-      android:textColor="@color/C000000"
-      android:textSize="16dp"
-      app:layout_constrainedWidth="true"
-      app:layout_constraintBottom_toBottomOf="parent"
-      app:layout_constraintEnd_toStartOf="@+id/image_view_open_arrow"
-      app:layout_constraintHorizontal_chainStyle="packed"
-      app:layout_constraintStart_toStartOf="parent"
-      app:layout_constraintTop_toTopOf="parent"
-      app:layout_goneMarginEnd="50dp"
-      tools:text="VVVVVVVVVVVVVVVVVVV"/>
-    <!-- 타이틀 옆에 아이콘 자리 -->
-    <ImageView
-      android:id="@+id/image_view_open_arrow"
-      android:layout_width="wrap_content"
-      android:layout_height="wrap_content"
       android:layout_marginEnd="50dp"
       android:background="?android:attr/selectableItemBackground"
-      android:paddingStart="3dp"
-      android:paddingTop="13dp"
-      android:paddingEnd="3dp"
-      android:paddingBottom="8dp"
+      android:orientation="horizontal"
+      android:paddingStart="9dp"
+      android:paddingEnd="7dp"
       app:layout_constraintBottom_toBottomOf="parent"
       app:layout_constraintEnd_toEndOf="parent"
-      app:layout_constraintStart_toEndOf="@+id/action_bar_title"
-      app:layout_constraintTop_toTopOf="parent"
-      app:srcCompat="@drawable/icon_h_down"
-      tools:visibility="visible"/>
+      app:layout_constraintStart_toStartOf="parent"
+      app:layout_constraintTop_toTopOf="parent">
+
+      <TextView
+        android:id="@+id/action_bar_title"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:clickable="false"
+        android:gravity="center"
+        android:maxLines="1"
+        android:paddingTop="7dp"
+        android:paddingBottom="7dp"
+        android:textColor="@color/C000000"
+        android:textSize="16dp"
+        app:layout_constrainedWidth="true"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toStartOf="@+id/image_view_open_arrow"
+        app:layout_constraintHorizontal_chainStyle="packed"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_goneMarginEnd="50dp"
+        tools:text="VVVVVVVVVVVVVVVVVVV"/>
+      <!-- 타이틀 옆에 아이콘 자리 -->
+      <ImageView
+        android:id="@+id/image_view_open_arrow"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:clickable="false"
+        android:paddingStart="3dp"
+        android:paddingTop="13dp"
+        android:paddingBottom="8dp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toEndOf="@+id/action_bar_title"
+        app:layout_constraintTop_toTopOf="parent"
+        app:srcCompat="@drawable/icon_h_down"
+        tools:visibility="visible"/>
+
+    </LinearLayout>
 
     <TextView
       android:id="@+id/text_sub"