Quellcode durchsuchen

[공통][New] ActionBar 와 NavigationBar 를 통합

hyodong.min vor 7 Jahren
Ursprung
Commit
545be20410

+ 87 - 357
app/src/main/java/kr/co/zumo/app/lifeplus/manager/ActionBarManager.java

@@ -1,24 +1,19 @@
 package kr.co.zumo.app.lifeplus.manager;
 
 import android.app.Activity;
+import android.content.Context;
 import android.support.annotation.StringRes;
 import android.support.constraint.ConstraintLayout;
 import android.support.design.widget.AppBarLayout;
 import android.support.design.widget.CoordinatorLayout;
-import android.support.v4.graphics.drawable.DrawableCompat;
 import android.support.v7.app.ActionBar;
 import android.support.v7.widget.Toolbar;
 import android.util.Log;
-import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
-import android.widget.ImageView;
 import android.widget.ProgressBar;
 import android.widget.RadioButton;
 import android.widget.RadioGroup;
-import android.widget.TextView;
-
-import java.util.HashMap;
 
 import kr.co.zumo.app.R;
 import kr.co.zumo.app.lifeplus.util.ResourceUtil;
@@ -45,31 +40,17 @@ public class ActionBarManager {
     return ourInstance;
   }
 
+  private Context context;
   private ActionBar actionBar;
   private AppBarLayout appBarLayout;
   private ViewGroup container;
   private Toolbar toolbar;
-  private TextView actionBarTitle;
-  private ImageView imageBi;
-  private ImageView buttonBack;
-  private ImageView buttonSearch;
-  private ImageView buttonMenu;
   private ProgressBar progressBar;
   private ConstraintLayout layoutCategoryTab;
   private RadioGroup categoryMainTab;
 
-  private ImageView buttonArrow;
-  private ImageView buttonHome;
-  private ImageView buttonNotification;
-  private ImageView buttonSetting;
-  private ImageView buttonClose;
-  private TextView textButton;
-  private View viewUnderline;
-
   private Builder builder;
 
-  private HashMap<View, IActionBarListener.Click> clickListenerMap;
-
   private IActionBarListener.Scroll scrollListener;
 
   private ActionBarManager() {
@@ -94,62 +75,19 @@ public class ActionBarManager {
     this.actionBar = actionBar;
     this.appBarLayout = appBarLayout;
     this.container = container;
+    this.context = activity;
 
-    clickListenerMap = new HashMap<>();
-
-    LayoutInflater inflater = LayoutInflater.from(activity);
-    View view = inflater.inflate(R.layout.action_bar, null);
+    toolbar = appBarLayout.findViewById(R.id.toolbar);
+    toolbar.setPadding(0, 0, 0, 0);//for tab otherwise give space in tab
+    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);
 
-    actionBarTitle = view.findViewById(R.id.action_bar_title);
-    imageBi = view.findViewById(R.id.image_bi);
-    buttonSearch = view.findViewById(R.id.button_search);
-    buttonMenu = view.findViewById(R.id.button_menu);
-    buttonBack = view.findViewById(R.id.button_back);
-
-    buttonArrow = view.findViewById(R.id.button_open_arrow);
-    buttonHome = view.findViewById(R.id.button_home);
-    buttonNotification = view.findViewById(R.id.button_notification);
-    buttonSetting = view.findViewById(R.id.button_setting);
-    buttonClose = view.findViewById(R.id.button_close);
-    textButton = view.findViewById(R.id.text_sub);
-    viewUnderline = view.findViewById(R.id.view_underline);
-
-    setClickListener(buttonBack);
-    setClickListener(buttonSearch);
-    setClickListener(buttonMenu);
-    setClickListener(actionBarTitle);
-    setClickListener(buttonHome);
-    setClickListener(buttonNotification);
-    setClickListener(buttonSetting);
-    setClickListener(buttonClose);
-    setClickListener(textButton);
-
-    setCustomView(view);
-
-    toolbar = (Toolbar) view.getParent();
-    toolbar.setPadding(0, 0, 0, 0);//for tab otherwise give space in tab
-    toolbar.setContentInsetsAbsolute(0, 0);
-
     Log.i("APP# ActionBarManager | init", "|" + "progressBar: " + progressBar);
   }
 
-  private void setClickListener(View view) {
-    view.setOnClickListener(v -> {
-      IActionBarListener.Click listener = clickListenerMap.get(v);
-      if (null != listener) {
-        listener.onClick(actionBar);
-      }
-    });
-  }
-
-  private void mapClickListener(View view, IActionBarListener.Click listener) {
-    clickListenerMap.put(view, listener);
-  }
-
   /***********************************
    * public
    ***********************************/
@@ -182,23 +120,6 @@ public class ActionBarManager {
     }
   }
 
-  /**
-   * actionbar hide
-   */
-  private void hide() {
-    actionBar.hide();
-//      appBarLayout.setExpanded(false, false);
-  }
-
-  /**
-   * show
-   */
-  private void show() {
-    actionBar.show();
-
-    appBarLayout.setExpanded(true, true);
-  }
-
   /**
    * 설정 초기화
    *
@@ -281,105 +202,12 @@ public class ActionBarManager {
     }
   }
 
-  /**
-   * actionbar 제목 설정
-   *
-   * @param stringId
-   */
-  private void setTitle(@StringRes int stringId) {
-    actionBarTitle.setText(stringId);
-  }
-
-  /**
-   * 타이틀 보이기
-   * - setTitle() 해서 설정도 해줘야함.
-   *
-   * @param isVisible
-   */
-  private void setTitleVisible(boolean isVisible) {
-    setViewVisible(actionBarTitle, isVisible);
-  }
-
-  /**
-   * 백 버튼 보이기
-   *
-   * @param isVisible
-   */
-  private void setBackVisible(boolean isVisible) {
-    setViewVisible(buttonBack, isVisible);
-  }
-
-  /**
-   * BI(Lifeplus) 보이기
-   *
-   * @param isVisible
-   */
-  private void setBiVisible(boolean isVisible) {
-    setViewVisible(imageBi, isVisible);
-  }
-
-  /**
-   * 검색 버튼 보이기
-   *
-   * @param isVisible
-   */
-  private void setSearchVisible(boolean isVisible) {
-    setViewVisible(buttonSearch, isVisible);
-  }
-
-  private void setHomeVisible(boolean isVisible) {
-    setViewVisible(buttonHome, isVisible);
-  }
-
-  private void setNotificationVisible(boolean isVisible) {
-    setViewVisible(buttonNotification, isVisible);
-  }
-
-  private void setSettingVisible(boolean isVisible) {
-    setViewVisible(buttonSetting, isVisible);
-  }
-
-  private void setCloseVisible(boolean isVisible) {
-    setViewVisible(buttonClose, isVisible);
-  }
-
-  private void setTextButtonVisible(boolean isVisible) {
-    setViewVisible(textButton, isVisible);
-  }
-
-  private void setArrowVisible(boolean isVisible) {
-    setViewVisible(buttonArrow, isVisible, View.GONE);
-  }
-
-  private void setUnderlineVisible(boolean isVisible) {
-    setViewVisible(viewUnderline, isVisible, View.GONE);
-  }
-
-  /**
-   * 메뉴 버튼 보이기
-   *
-   * @param isVisible
-   */
-  private void setMenuVisible(boolean isVisible) {
-    setViewVisible(buttonMenu, isVisible);
-  }
-
-  private void setViewVisible(View view, boolean isVisible) {
-    if (null != view) {
-      setViewVisible(view, isVisible, View.GONE);
-    }
-  }
-
   private void setViewVisible(View view, boolean isVisible, int visibility) {
     if (null != view) {
       view.setVisibility(isVisible ? View.VISIBLE : visibility);
     }
   }
 
-  private void setBackgroundTransparent(boolean isTransparent) {
-    toolbar.setBackgroundResource(isTransparent ? android.R.color.transparent : R.color.C80FFFFFF);
-  }
-
   /**
    * progress bar 보이기/안보이기
    *
@@ -390,23 +218,22 @@ public class ActionBarManager {
   }
 
   private void set(Builder newBuilder) {
+
     if (null == builder) {
+
       builder = new Builder();
-      setTitleVisible(false);
-      setBackVisible(false);
-      setBiVisible(false);
-      setSearchVisible(false);
-      setMenuVisible(false);
       setProgressVisible(false);
-      setArrowVisible(false);
       setScrollable(false);
-      setBackgroundTransparent(false);
-      setHomeVisible(false);
-      setSettingVisible(false);
-      setNotificationVisible(false);
-      setCloseVisible(false);
-      setTextButtonVisible(false);
-      setUnderlineVisible(false);
+    }
+    // navigation bar setting
+    NavigationBar navigationBar = new NavigationBar.Builder(context).build(newBuilder.getNavigationBarBuilder());
+    View view = navigationBar.getView();
+    setCustomView(view);
+
+    if (newBuilder.isHidden) {
+      navigationBar.hide();
+
+      return;
     }
 
     if (builder.isScrollable != newBuilder.isScrollable) {
@@ -416,127 +243,50 @@ public class ActionBarManager {
       setProgressVisible(newBuilder.isVisibleProgress);
     }
 
-    //카테고리 이동시 탭 gone 처리, arrow icon default setting
+    //카테고리 이동시 탭 gone 처리
     layoutCategoryTab.setVisibility(View.GONE);
-    buttonArrow.setImageResource(R.drawable.icon_h_down);
 
     if (newBuilder.selectedCategoryIndex > -1) {
       ((RadioButton) categoryMainTab.getChildAt(newBuilder.selectedCategoryIndex)).setChecked(true);
     }
 
-    if (builder.isVisibleCategoryArrow != newBuilder.isVisibleCategoryArrow) {
-      setArrowVisible(newBuilder.isVisibleCategoryArrow);
+    if (newBuilder.isVisibleCategory) {
+      newBuilder.arrowListener = navigationBar1 -> {
+        if (navigationBar1.isArrowOpened()) {
+          layoutCategoryTab.setVisibility(View.VISIBLE);
+        }
+        else {
+          layoutCategoryTab.setVisibility(View.GONE);
+        }
+      };
 
-      buttonArrow.setOnClickListener(view1 -> {
-        layoutCategoryTab.setVisibility(layoutCategoryTab.getVisibility() == View.GONE ? View.VISIBLE : View.GONE);
-        buttonArrow.setImageResource(layoutCategoryTab.getVisibility() == View.GONE ? R.drawable.icon_h_down : R.drawable.icon_header_up);
-      });
+      newBuilder.titleListener = navigationBar12 -> {
+        if (navigationBar12.isArrowOpened()) {
+          layoutCategoryTab.setVisibility(View.VISIBLE);
+        }
+        else {
+          layoutCategoryTab.setVisibility(View.GONE);
+        }
+      };
 
-      if (newBuilder.isVisibleCategoryArrow) {
-        actionBarTitle.setOnClickListener(view1 -> {
-          layoutCategoryTab.setVisibility(layoutCategoryTab.getVisibility() == View.GONE ? View.VISIBLE : View.GONE);
-          buttonArrow.setImageResource(layoutCategoryTab.getVisibility() == View.GONE ? R.drawable.icon_h_down : R.drawable.icon_header_up);
-        });
-      }
-      else {
-        actionBarTitle.setOnClickListener(null);
-      }
       int len = categoryMainTab.getChildCount();
       for (int i = 0; i < len; ++i) {
         (categoryMainTab.getChildAt(i)).setOnClickListener(v -> {
           int selectIndex = categoryMainTab.indexOfChild(v);
-          if (null != newBuilder.categoryListener) {
+          // 다른 카테고리 선택했을 때만 이벤트 발송
+          if (newBuilder.selectedCategoryIndex != selectIndex && null != newBuilder.categoryListener) {
             newBuilder.categoryListener.onClick(actionBar, selectIndex);
           }
         });
       }
     }
 
-    if (builder.isVisibleMenu != newBuilder.isVisibleMenu || builder.menuListener != newBuilder.menuListener) {
-      setMenuVisible(newBuilder.isVisibleMenu);
-      mapClickListener(buttonMenu, newBuilder.menuListener);
-
-    }
-    if (builder.isVisibleSearch != newBuilder.isVisibleSearch || builder.searchListener != newBuilder.searchListener) {
-      setSearchVisible(newBuilder.isVisibleSearch);
-      mapClickListener(buttonSearch, newBuilder.searchListener);
-    }
-    if (builder.isVisibleBi != newBuilder.isVisibleBi) {
-      setBiVisible(newBuilder.isVisibleBi);
-    }
-    if (builder.isVisibleBack != newBuilder.isVisibleBack || builder.backListener != newBuilder.backListener) {
-      setBackVisible(newBuilder.isVisibleBack);
-      mapClickListener(buttonBack, newBuilder.backListener);
-    }
-    if (builder.isVisibleTitle != newBuilder.isVisibleTitle
-      || builder.titleListener != newBuilder.titleListener
-      || builder.title != newBuilder.title) {
-      setTitleVisible(newBuilder.isVisibleTitle);
-      setTitle(newBuilder.title);
-      mapClickListener(actionBarTitle, newBuilder.titleListener);
-    }
-    if (builder.isTransparentBackground != newBuilder.isTransparentBackground) {
-      setBackgroundTransparent(newBuilder.isTransparentBackground);
-    }
-    if (builder.isWhite != newBuilder.isWhite) {
-      setWhiteUi(newBuilder.isWhite);
-    }
-    if (builder.isVisibleHome != newBuilder.isVisibleHome || builder.homeListener != newBuilder.homeListener) {
-      setHomeVisible(newBuilder.isVisibleHome);
-      mapClickListener(buttonHome, newBuilder.homeListener);
-    }
-    if (builder.isVisibleNotification != newBuilder.isVisibleNotification || builder.notificationListener != newBuilder.notificationListener) {
-      setNotificationVisible(newBuilder.isVisibleNotification);
-      mapClickListener(buttonNotification, newBuilder.notificationListener);
-    }
-    if (builder.isVisibleSetting != newBuilder.isVisibleSetting || builder.settingListener != newBuilder.settingListener) {
-      setSettingVisible(newBuilder.isVisibleSetting);
-      mapClickListener(buttonSetting, newBuilder.settingListener);
-    }
-    if (builder.isVisibleClose != newBuilder.isVisibleClose || builder.closeListener != newBuilder.closeListener) {
-      setCloseVisible(newBuilder.isVisibleClose);
-      mapClickListener(buttonClose, newBuilder.closeListener);
-    }
-    if (builder.isVisibleTextButton != newBuilder.isVisibleTextButton
-      || builder.textButtonListener != newBuilder.textButtonListener
-      || builder.text != newBuilder.text) {
-      setTextButtonVisible(newBuilder.isVisibleTextButton);
-      textButton.setText(newBuilder.text);
-      mapClickListener(textButton, newBuilder.textButtonListener);
-    }
-
-    if (builder.isVisibleUnderline != newBuilder.isVisibleUnderline) {
-      setUnderlineVisible(newBuilder.isVisibleUnderline);
-    }
-
     builder = newBuilder;
 
     setContentsLayout(builder.isHidden, builder.isScrollable, builder.isTransparentBackground);
 
   }
 
-  private void setWhiteUi(boolean isWhite) {
-    int color;
-    if (isWhite) {
-      color = ResourceUtil.getColor(R.color.CFFFFFF);
-      actionBarTitle.setTextColor(color);
-      DrawableCompat.setTint(buttonBack.getDrawable(), color);
-      DrawableCompat.setTint(imageBi.getDrawable(), color);
-      DrawableCompat.setTint(buttonBack.getDrawable(), color);
-      DrawableCompat.setTint(buttonSearch.getDrawable(), color);
-      DrawableCompat.setTint(buttonMenu.getDrawable(), color);
-    }
-    else {
-      color = ResourceUtil.getColor(R.color.C000000);
-      actionBarTitle.setTextColor(color);
-      DrawableCompat.setTint(buttonBack.getDrawable(), color);
-      DrawableCompat.setTint(imageBi.getDrawable(), color);
-      DrawableCompat.setTint(buttonBack.getDrawable(), color);
-      DrawableCompat.setTint(buttonSearch.getDrawable(), color);
-      DrawableCompat.setTint(buttonMenu.getDrawable(), color);
-    }
-  }
-
   private void setCustomView(View view) {
 
     // Custom Actionbar 를 사용하기 위해 CustomEnabled 을 true 시키고 필요 없는 것은 false 시킨다
@@ -564,8 +314,6 @@ public class ActionBarManager {
 
     scrollListener = null;
 
-    clickListenerMap = null;
-
     actionBar = null;
     builder = null;
   }
@@ -575,46 +323,32 @@ public class ActionBarManager {
    ***********************************/
   public static class Builder {
 
-    private boolean isVisibleTitle = false;
-    private boolean isVisibleBack = false;
-    private boolean isVisibleBi = false;
-    private boolean isVisibleSearch = false;
-    private boolean isVisibleMenu = false;
     private boolean isVisibleProgress = false;
-    private boolean isVisibleCategoryArrow = false;
+    private boolean isVisibleCategory = false;
     private boolean isScrollable = false;
-    private int title = R.string.empty_string;
     private boolean isTransparentBackground = false;
     private boolean isHidden = false;
-    private boolean isWhite = false;
-
-    private boolean isVisibleHome = false;
-    private boolean isVisibleNotification = false;
-    private boolean isVisibleSetting = false;
-    private boolean isVisibleClose = false;
-    private boolean isVisibleTextButton = false;
-    private boolean isVisibleUnderline = false;
-    private int text = R.string.empty_string;
 
     private int selectedCategoryIndex = -1;
 
-    private IActionBarListener.Click backListener = null;
-    private IActionBarListener.Click bookmarkListener = null;
-    private IActionBarListener.Click likeListener = null;
-    private IActionBarListener.Click menuListener = null;
-    private IActionBarListener.Click searchListener = null;
-    private IActionBarListener.Click shareListener = null;
-    private IActionBarListener.Click titleListener = null;
-
-    private IActionBarListener.Click homeListener = null;
-    private IActionBarListener.Click notificationListener = null;
-    private IActionBarListener.Click settingListener = null;
-    private IActionBarListener.Click closeListener = null;
-    private IActionBarListener.Click textButtonListener = null;
     private IActionBarListener.CategoryClick categoryListener = null;
 
+    private NavigationBar.Builder navigationBarBuilder;
+
+    protected INavigationBarListener arrowListener = null;
+    protected INavigationBarListener titleListener = null;
 
     public Builder() {
+      navigationBarBuilder = new NavigationBar.Builder();
+    }
+
+    /**
+     * NavigationBar.Builder
+     *
+     * @return
+     */
+    public NavigationBar.Builder getNavigationBarBuilder() {
+      return navigationBarBuilder;
     }
 
     /**
@@ -623,15 +357,17 @@ public class ActionBarManager {
      * @param stringId @StringRes
      * @return Builder
      */
-    public Builder title(@StringRes int stringId, IActionBarListener.Click titleListener) {
-      this.title = stringId;
-      isVisibleTitle = true;
-      this.titleListener = titleListener;
+    public Builder title(@StringRes int stringId, INavigationBarListener titleListener) {
+      navigationBarBuilder.title(stringId, titleListener);
       return this;
     }
 
     public Builder title(@StringRes int stringId) {
-      return title(stringId, null);
+      return title(stringId, navigationBar -> {
+        if (null != titleListener) {
+          titleListener.onClick(navigationBar);
+        }
+      });
     }
 
     /**
@@ -639,9 +375,8 @@ public class ActionBarManager {
      *
      * @return Builder
      */
-    public Builder back(IActionBarListener.Click backListener) {
-      isVisibleBack = true;
-      this.backListener = backListener;
+    public Builder back(INavigationBarListener backListener) {
+      navigationBarBuilder.back(backListener);
       return this;
     }
 
@@ -651,7 +386,7 @@ public class ActionBarManager {
      * @return Builder
      */
     public Builder logo() {
-      isVisibleBi = true;
+      navigationBarBuilder.logo();
       return this;
     }
 
@@ -660,9 +395,8 @@ public class ActionBarManager {
      *
      * @return Builder
      */
-    public Builder search(IActionBarListener.Click searchListener) {
-      isVisibleSearch = true;
-      this.searchListener = searchListener;
+    public Builder search(INavigationBarListener searchListener) {
+      navigationBarBuilder.search(searchListener);
       return this;
     }
 
@@ -671,9 +405,8 @@ public class ActionBarManager {
      *
      * @return Builder
      */
-    public Builder menu(IActionBarListener.Click menuListener) {
-      isVisibleMenu = true;
-      this.menuListener = menuListener;
+    public Builder menu(INavigationBarListener menuListener) {
+      navigationBarBuilder.menu(menuListener);
       return this;
     }
 
@@ -693,9 +426,14 @@ public class ActionBarManager {
      * @return Builder
      */
     public Builder category(int index, IActionBarListener.CategoryClick categoryListener) {
-      isVisibleCategoryArrow = true;
+      isVisibleCategory = true;
       selectedCategoryIndex = index;
       this.categoryListener = categoryListener;
+      navigationBarBuilder.arrow(navigationBar -> {
+        if (null != arrowListener) {
+          arrowListener.onClick(navigationBar);
+        }
+      });
       return this;
     }
 
@@ -715,7 +453,7 @@ public class ActionBarManager {
      * @return Builder
      */
     public Builder transparent() {
-      isTransparentBackground = true;
+      navigationBarBuilder.transparent();
       return this;
     }
 
@@ -724,9 +462,8 @@ public class ActionBarManager {
      *
      * @return Builder
      */
-    public Builder home(IActionBarListener.Click homeListener) {
-      isVisibleHome = true;
-      this.homeListener = homeListener;
+    public Builder home(INavigationBarListener homeListener) {
+      navigationBarBuilder.home(homeListener);
       return this;
     }
 
@@ -735,9 +472,8 @@ public class ActionBarManager {
      *
      * @return Builder
      */
-    public Builder notification(IActionBarListener.Click notificationListener) {
-      isVisibleNotification = true;
-      this.notificationListener = notificationListener;
+    public Builder notification(INavigationBarListener notificationListener) {
+      navigationBarBuilder.notification(notificationListener);
       return this;
     }
 
@@ -746,9 +482,8 @@ public class ActionBarManager {
      *
      * @return Builder
      */
-    public Builder setting(IActionBarListener.Click settingListener) {
-      isVisibleSetting = true;
-      this.settingListener = settingListener;
+    public Builder setting(INavigationBarListener settingListener) {
+      navigationBarBuilder.setting(settingListener);
       return this;
     }
 
@@ -757,9 +492,8 @@ public class ActionBarManager {
      *
      * @return Builder
      */
-    public Builder close(IActionBarListener.Click closeListener) {
-      isVisibleClose = true;
-      this.closeListener = closeListener;
+    public Builder close(INavigationBarListener closeListener) {
+      navigationBarBuilder.close(closeListener);
       return this;
     }
 
@@ -768,10 +502,8 @@ public class ActionBarManager {
      *
      * @return Builder
      */
-    public Builder textButton(@StringRes int stringId, IActionBarListener.Click textButtonListener) {
-      text = stringId;
-      isVisibleTextButton = true;
-      this.textButtonListener = textButtonListener;
+    public Builder textButton(@StringRes int stringId, INavigationBarListener textButtonListener) {
+      navigationBarBuilder.textButton(stringId, textButtonListener);
       return this;
     }
 
@@ -781,7 +513,7 @@ public class ActionBarManager {
      * @return Builder
      */
     public Builder white() {
-      isWhite = true;
+      navigationBarBuilder.white();
       return this;
     }
 
@@ -790,8 +522,8 @@ public class ActionBarManager {
      *
      * @return
      */
-    public Builder unlderline() {
-      isVisibleUnderline = true;
+    public Builder underline() {
+      navigationBarBuilder.underline();
       return this;
     }
 
@@ -805,7 +537,6 @@ public class ActionBarManager {
     public void show() {
       isHidden = false;
       set();
-      ourInstance.show();
     }
 
     /**
@@ -814,7 +545,6 @@ public class ActionBarManager {
     public void hide() {
       isHidden = true;
       set();
-      ourInstance.hide();
     }
   }
 

+ 71 - 51
app/src/main/java/kr/co/zumo/app/lifeplus/manager/NavigationBar.java

@@ -59,19 +59,19 @@ public class NavigationBar {
   private void init() {
     clickListenerMap = new HashMap<>();
 
+    imageBi = view.findViewById(R.id.image_bi);
+    viewUnderline = view.findViewById(R.id.view_underline);
+
     actionBarTitle = view.findViewById(R.id.action_bar_title);
     buttonArrow = view.findViewById(R.id.button_open_arrow);
-    imageBi = view.findViewById(R.id.image_bi);
     buttonSearch = view.findViewById(R.id.button_search);
     buttonMenu = view.findViewById(R.id.button_menu);
     buttonBack = view.findViewById(R.id.button_back);
-
     buttonHome = view.findViewById(R.id.button_home);
     buttonNotification = view.findViewById(R.id.button_notification);
     buttonSetting = view.findViewById(R.id.button_setting);
     buttonClose = view.findViewById(R.id.button_close);
     textButton = view.findViewById(R.id.text_sub);
-    viewUnderline = view.findViewById(R.id.view_underline);
 
     setClickListener(buttonBack);
     setClickListener(buttonSearch);
@@ -82,6 +82,7 @@ public class NavigationBar {
     setClickListener(buttonSetting);
     setClickListener(buttonClose);
     setClickListener(textButton);
+    setClickListener(buttonArrow);
 
   }
 
@@ -212,7 +213,12 @@ public class NavigationBar {
 
     setTitleVisible(newBuilder.isVisibleTitle);
     setTitle(newBuilder.title);
-    mapClickListener(actionBarTitle, newBuilder.titleListener);
+    mapClickListener(actionBarTitle, v -> {
+      toggleArrow();
+      if (null != newBuilder.titleListener) {
+        newBuilder.titleListener.onClick(NavigationBar.this);
+      }
+    });
 
     setBackgroundTransparent(newBuilder.isTransparentBackground);
 
@@ -235,24 +241,28 @@ public class NavigationBar {
     mapClickListener(textButton, newBuilder.textButtonListener);
 
     setArrowVisible(newBuilder.isVisibleArrow);
-    if (null != newBuilder.arrowListener) {
-      buttonArrow.setOnClickListener(v -> {
-        if (isArrowOpened) {
-          // to close
-          buttonArrow.setImageResource(R.drawable.icon_h_down);
-        }
-        else {
-          // to open
-          buttonArrow.setImageResource(R.drawable.icon_header_up);
-        }
-        isArrowOpened = !isArrowOpened;
+    mapClickListener(buttonArrow, v -> {
+      toggleArrow();
+      if (null != newBuilder.arrowListener) {
         newBuilder.arrowListener.onClick(NavigationBar.this);
-      });
-    }
+      }
+    });
 
     setUnderlineVisible(newBuilder.isVisibleUnderline);
   }
 
+  private void toggleArrow() {
+    if (isArrowOpened) {
+      // to close
+      buttonArrow.setImageResource(R.drawable.icon_h_down);
+    }
+    else {
+      // to open
+      buttonArrow.setImageResource(R.drawable.icon_header_up);
+    }
+    isArrowOpened = !isArrowOpened;
+  }
+
   private void setWhiteUi(boolean isWhite) {
     int color;
     if (isWhite) {
@@ -315,44 +325,47 @@ public class NavigationBar {
    ***********************************/
   public static class Builder {
 
-    private final Context context;
-    private boolean isVisibleTitle = false;
-    private boolean isVisibleBack = false;
-    private boolean isVisibleBi = false;
-    private boolean isVisibleSearch = false;
-    private boolean isVisibleMenu = false;
-    private int title = R.string.empty_string;
-    private boolean isTransparentBackground = false;
-    private boolean isWhite = false;
-    private boolean isVisibleArrow = false;
-
-    private boolean isVisibleHome = false;
-    private boolean isVisibleNotification = false;
-    private boolean isVisibleSetting = false;
-    private boolean isVisibleClose = false;
-    private boolean isVisibleTextButton = false;
-    private boolean isVisibleUnderline;
-    private int text = R.string.empty_string;
-
-    private INavigationBarListener backListener = null;
-    private INavigationBarListener bookmarkListener = null;
-    private INavigationBarListener likeListener = null;
-    private INavigationBarListener menuListener = null;
-    private INavigationBarListener searchListener = null;
-    private INavigationBarListener shareListener = null;
-    private INavigationBarListener titleListener = null;
-
-    private INavigationBarListener homeListener = null;
-    private INavigationBarListener notificationListener = null;
-    private INavigationBarListener settingListener = null;
-    private INavigationBarListener closeListener = null;
-    private INavigationBarListener textButtonListener = null;
-    private INavigationBarListener arrowListener = null;
+    protected Context context;
+    protected boolean isVisibleTitle = false;
+    protected boolean isVisibleBack = false;
+    protected boolean isVisibleBi = false;
+    protected boolean isVisibleSearch = false;
+    protected boolean isVisibleMenu = false;
+    protected int title = R.string.empty_string;
+    protected boolean isTransparentBackground = false;
+    protected boolean isWhite = false;
+    protected boolean isVisibleArrow = false;
+
+    protected boolean isVisibleHome = false;
+    protected boolean isVisibleNotification = false;
+    protected boolean isVisibleSetting = false;
+    protected boolean isVisibleClose = false;
+    protected boolean isVisibleTextButton = false;
+    protected boolean isVisibleUnderline;
+    protected int text = R.string.empty_string;
+
+    protected INavigationBarListener backListener = null;
+    protected INavigationBarListener bookmarkListener = null;
+    protected INavigationBarListener likeListener = null;
+    protected INavigationBarListener menuListener = null;
+    protected INavigationBarListener searchListener = null;
+    protected INavigationBarListener shareListener = null;
+    protected INavigationBarListener titleListener = null;
+    protected INavigationBarListener homeListener = null;
+    protected INavigationBarListener notificationListener = null;
+    protected INavigationBarListener settingListener = null;
+    protected INavigationBarListener closeListener = null;
+    protected INavigationBarListener textButtonListener = null;
+    protected INavigationBarListener arrowListener = null;
 
     public Builder(Context context) {
       this.context = context;
     }
 
+    public Builder() {
+
+    }
+
     /**
      * 타이틀 표시
      *
@@ -505,7 +518,7 @@ public class NavigationBar {
      *
      * @return
      */
-    public Builder unlderline() {
+    public Builder underline() {
       isVisibleUnderline = true;
       return this;
     }
@@ -517,6 +530,13 @@ public class NavigationBar {
       return navigationBar;
     }
 
+    public NavigationBar build(Builder builder) {
+      NavigationBar navigationBar = new NavigationBar(context);
+      navigationBar.set(builder);
+      navigationBar.show();
+      return navigationBar;
+    }
+
   }
 }
 

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

@@ -66,7 +66,7 @@ public abstract class APIModule<T extends RequestBean, R extends LifeplusAPIBean
       }
     }
     else {
-      Log.i("APP# APIModule | accept", "| " + APIModule.this.getClass().getSimpleName() + " <- " + str);
+      Log.d("APP# APIModule | accept", "| " + APIModule.this.getClass().getSimpleName() + " <- " + str);
     }
 
     // http://stackoverflow.com/questions/8888654/android-set-max-length-of-logcat-messages

+ 52 - 42
app/src/main/java/kr/co/zumo/app/lifeplus/view/presenter/Presenter.java

@@ -11,6 +11,7 @@ import com.google.gson.Gson;
 
 import kr.co.zumo.app.lifeplus.ILifeCycle;
 import kr.co.zumo.app.lifeplus.helper.Helper;
+import kr.co.zumo.app.lifeplus.manager.NavigationBar;
 import kr.co.zumo.app.lifeplus.model.IModelResult;
 import kr.co.zumo.app.lifeplus.model.Model;
 import kr.co.zumo.app.lifeplus.network.INetworkReceiverListener;
@@ -204,16 +205,16 @@ public abstract class Presenter<M extends Model, V extends IView> implements ILi
     onCommand(new HomeCommand(ScreenID.MAIN, ScreenID.DIRECTION_BACK));
   }
 
-   /**
+  /**
    * 각종 Helper 객체를 반환한다.
    * - Activity 에 종속되는 객체로 그 안에서 싱글톤처럼 사용.
    *
    * @param helperClass DeliveryHelper.class
    * @return new DeliveryHelper() or exist object
    */
-   protected <H extends Helper> H getHelper(Class<H> helperClass) {
-     return view.getHelper(helperClass);
-   }
+  protected <H extends Helper> H getHelper(Class<H> helperClass) {
+    return view.getHelper(helperClass);
+  }
 
   /***********************************
    * listener
@@ -238,131 +239,140 @@ public abstract class Presenter<M extends Model, V extends IView> implements ILi
   @Override
   public abstract void onResult(Event event);
 
-  // IActionBarListener
+  /***********************************
+   * Action Bar Listener
+   ***********************************/
   /*
     기본으로 처리하고 필요한 Presenter 에서 Override 한다.
    */
 
+  private void throwRuntimeException() {
+    throw new RuntimeException(this.getClass().getSimpleName() + ": please, override this method!!!");
+  }
+
   /**
    * Back button
    *
-   * @param actionBar
+   * @param navigationBar
    */
-  public void onClickBack(ActionBar actionBar) {
+  public void onClickBack(NavigationBar navigationBar) {
     onBackPressed();
   }
 
   /**
    * 타이틀 클릭
    *
-   * @param actionBar
+   * @param navigationBar
    */
-  public final void onClickTitle(ActionBar actionBar) {
-
+  public final void onClickTitle(NavigationBar navigationBar) {
+    throwRuntimeException();
   }
 
   /**
    * 검색 클릭
    *
-   * @param actionBar
+   * @param navigationBar
    */
-  public void onClickSearch(ActionBar actionBar) {
-
+  public void onClickSearch(NavigationBar navigationBar) {
+    throwRuntimeException();
   }
 
   /**
    * 메뉴 클릭 (햄버거)
    *
-   * @param actionBar
+   * @param navigationBar
    */
-  public void onClickMenu(ActionBar actionBar) {
+  public void onClickMenu(NavigationBar navigationBar) {
     go(ScreenID.ALL_MENU);
   }
 
   /**
    * 좋아요 클릭
    *
-   * @param actionBar
+   * @param navigationBar
    */
-  public void onClickLike(ActionBar actionBar) {
-
+  public void onClickLike(NavigationBar navigationBar) {
+    throwRuntimeException();
   }
 
   /**
    * 북마크 클릭
    *
-   * @param actionBar
+   * @param navigationBar
    */
-  public void onClickBookmark(ActionBar actionBar) {
-
+  public void onClickBookmark(NavigationBar navigationBar) {
+    throwRuntimeException();
   }
 
   /**
    * 카테고리 탭 클릭
    *
-   * @param actionBar
+   * @param navigationBar
    */
-  public void onClickCategoryTab(ActionBar actionBar, int index) {
-
+  public void onClickCategoryTab(ActionBar navigationBar, int index) {
+    throwRuntimeException();
   }
 
 
   /**
    * 공유 클릭
    *
-   * @param actionBar
+   * @param navigationBar
    */
-  public void onClickShare(ActionBar actionBar) {
-
+  public void onClickShare(NavigationBar navigationBar) {
+    throwRuntimeException();
   }
 
   /**
    * 홈 클릭
    *
-   * @param actionBar
+   * @param navigationBar
    */
-  public void onClickHome(ActionBar actionBar) {
+  public void onClickHome(NavigationBar navigationBar) {
     home();
   }
 
   /**
    * 알람 클릭
    *
-   * @param actionBar
+   * @param navigationBar
    */
-  public void onClickNotification(ActionBar actionBar) {
-
+  public void onClickNotification(NavigationBar navigationBar) {
+    throwRuntimeException();
   }
 
   /**
    * 세팅 클릭
    *
-   * @param actionBar
+   * @param navigationBar
    */
-  public void onClickSetting(ActionBar actionBar) {
-
+  public void onClickSetting(NavigationBar navigationBar) {
+    throwRuntimeException();
   }
 
   /**
    * 닫기 클릭
    *
-   * @param actionBar
+   * @param navigationBar
    */
-  public void onClickClose(ActionBar actionBar) {
-
+  public void onClickClose(NavigationBar navigationBar) {
+    throwRuntimeException();
   }
 
   /**
    * 텍스트 버튼 클릭 (닫기 옆)
    *
-   * @param actionBar
+   * @param navigationBar
    */
-  public void onClickTextButton(ActionBar actionBar) {
-
+  public void onClickTextButton(NavigationBar navigationBar) {
+    throwRuntimeException();
   }
 
+  /***********************************
+   * Floating Action Button Listener
+   ***********************************/
   // 플로팅 액션 버튼 이벤트 처리
   public void onActionButtonClick() {
-
+    throwRuntimeException();
   }
 }

+ 1 - 1
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/faq/FAQWriteFragment.java

@@ -92,7 +92,7 @@ public class FAQWriteFragment extends FragmentBase<FAQWritePresenter> implements
   protected void defineActionBar() {
     ActionBarManager.getInstance().begin()
       .back(actionBar -> presenter.onClickBack(actionBar))
-      .unlderline()
+      .underline()
       .show();
   }
 

+ 1 - 1
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/faq/MyFAQFragment.java

@@ -71,7 +71,7 @@ public class MyFAQFragment extends FragmentBase<MyFAQPresenter> implements IMyFa
       .back(actionBar -> presenter.onClickBack(actionBar));
 
     if (hasUnderline) {
-      builder.unlderline();
+      builder.underline();
     }
 
     builder.show();

+ 1 - 1
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/main/category/CategoryMainPresenter.java

@@ -164,7 +164,7 @@ public abstract class CategoryMainPresenter<M extends CategoryMainModel, V exten
   protected abstract void onResultInternal(Event event);
 
   @Override
-  public final void onClickCategoryTab(ActionBar actionBar, int index) {
+  public final void onClickCategoryTab(ActionBar navigationBar, int index) {
     switch (index) {
       case 0:
         go(ScreenID.FIRST_CATEGORY);

+ 5 - 6
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/menu/AllMenuPresenter.java

@@ -1,7 +1,6 @@
 package kr.co.zumo.app.lifeplus.view.screen.menu;
 
-import android.support.v7.app.ActionBar;
-
+import kr.co.zumo.app.lifeplus.manager.NavigationBar;
 import kr.co.zumo.app.lifeplus.supervisor.ScreenID;
 import kr.co.zumo.app.lifeplus.view.Event;
 import kr.co.zumo.app.lifeplus.view.IView;
@@ -95,22 +94,22 @@ public class AllMenuPresenter extends Presenter<AllMenuModel, IView> {
   }
 
   @Override
-  public void onClickNotification(ActionBar actionBar) {
+  public void onClickNotification(NavigationBar navigationBar) {
     go(ScreenID.NOTIFICATION);
   }
 
   @Override
-  public void onClickSetting(ActionBar actionBar) {
+  public void onClickSetting(NavigationBar navigationBar) {
     go(ScreenID.SETTING);
   }
 
   @Override
-  public void onClickClose(ActionBar actionBar) {
+  public void onClickClose(NavigationBar navigationBar) {
     onBackPressed();
   }
 
   @Override
-  public void onClickTextButton(ActionBar actionBar) {
+  public void onClickTextButton(NavigationBar navigationBar) {
     go(ScreenID.SIGN_UP_START);
   }