Sfoglia il codice sorgente

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

Hasemi 7 anni fa
parent
commit
efed5cddff

+ 34 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/util/ViewUtil.java

@@ -0,0 +1,34 @@
+/*
+ * COPYRIGHT (c) 2018 All rights reserved by HANWHA LIFE.
+ */
+package kr.co.zumo.app.lifeplus.util;
+
+import android.support.v4.view.NestedScrollingParent2;
+import android.view.View;
+import android.view.ViewParent;
+
+/**
+ * ViewUtil
+ * <pre>
+ * </pre>
+ *
+ * @author 민효동
+ * @version 1.0
+ * @history 민효동   [2018. 12. 10.]   [최초 작성]
+ * @since 2018. 12. 10.
+ */
+public class ViewUtil {
+
+  public static ViewParent getCoodinatorLayoutParent(View view) {
+
+    ViewParent p = view.getParent();
+    while (p != null) {
+      if (p instanceof NestedScrollingParent2) {
+        return p;
+      }
+      p = p.getParent();
+    }
+
+    return null;
+  }
+}

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

@@ -24,4 +24,6 @@ public interface IMainView extends IView {
   void render();
 
   void scrollToPosition(int index);
+
+  void setIndicatorIndex(int index);
 }

+ 7 - 2
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/main/MainContentsWeatherHolder.java

@@ -59,12 +59,17 @@ public class MainContentsWeatherHolder extends MainContentsHolder /*implements V
       }
       weather.setY(ty);
     }
-
   }
 
   @Override
   public boolean isFocused() {
-    // 날씨 홀더를 포커스를 갖지 않음
+    // 두 번째 홀더부터는 화면에 cy = 0 ~ screenHeight
+    int cy = (int) (itemView.getY());
+    int height = itemView.getHeight();
+    if (0 >= cy && cy > -(height >> 2)) {
+      return true;
+    }
+
     return false;
   }
 

+ 130 - 111
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/main/MainFragment.java

@@ -7,7 +7,6 @@ import android.animation.ObjectAnimator;
 import android.os.Bundle;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
-import android.support.v4.view.NestedScrollingParent2;
 import android.support.v4.view.ViewCompat;
 import android.support.v4.view.ViewParentCompat;
 import android.support.v7.widget.LinearLayoutManager;
@@ -30,6 +29,7 @@ import kr.co.zumo.app.lifeplus.supervisor.ContentsFlagHelper;
 import kr.co.zumo.app.lifeplus.util.AppUtil;
 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;
 import kr.co.zumo.app.lifeplus.view.screen.FragmentBase;
 
@@ -49,27 +49,33 @@ public class MainFragment extends FragmentBase<MainPresenter> implements IMainVi
   private MainContentsAdapter adapter;
   private PageIndicator indicator;
   private MainContentsSnapper snapper;
+  private ViewParent layoutCoordinator;
 
   private RecyclerView.OnScrollListener scrollListener = new RecyclerView.OnScrollListener() {
     @Override
     public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
-      adapter.onScrolled(recyclerView, dx, dy);
-
-      /**
-       * 홀더에게 포커스 여부를 확인한다.
-       * 위쪽부터 순서대로 체크한다.
-       */
-      int itemCount = recyclerView.getAdapter().getItemCount() - 1; // 날씨는 제외;
-      int activePosition = 0;
-      for (int i = 0; i < itemCount; ++i) {
-        MainContentsHolder mainContentsHolder = (MainContentsHolder) recyclerView.findViewHolderForAdapterPosition(i + 1);
-        if (null != mainContentsHolder && mainContentsHolder.isFocused()) {
-          activePosition = i;
-          break;
+
+      if (dy != 0) {
+        adapter.onScrolled(recyclerView, dx, dy);
+
+        /**
+         * 홀더에게 포커스 여부를 확인한다.
+         * 위쪽부터 순서대로 체크한다.
+         */
+        int itemCount = recyclerView.getAdapter().getItemCount();
+        int activePosition = 0;
+        for (int i = 0; i < itemCount; ++i) {
+          MainContentsHolder mainContentsHolder = (MainContentsHolder) recyclerView.findViewHolderForAdapterPosition(i);
+          if (null != mainContentsHolder && mainContentsHolder.isFocused()) {
+            activePosition = i;
+            break;
+          }
         }
+
+        presenter.touch();
+        presenter.onScrolled(activePosition);
       }
 
-      indicator.onChangedIndex(itemCount, activePosition);
     }
   };
 
@@ -101,83 +107,8 @@ public class MainFragment extends FragmentBase<MainPresenter> implements IMainVi
       snapper.attachToRecyclerView(contentsRecyclerView);
     }
 
-    if (AppUtil.isDebug()) {
-
-      View button;
-
-      button = findViewById(R.id.button_clear);
-      button.setOnClickListener(v -> {
-        clearData();
-      });
-
-      button = findViewById(R.id.button_zumo);
-      button.setOnClickListener(v -> {
-        SuperModel.getInstance().getPreferences().setZumoUserNo("---------------test--zumo-user----------------");
-      });
-
-      button = findViewById(R.id.button_sign_up);
-      button.setOnClickListener(v -> {
-        presenter.onEvent(new Event.Builder(Event.SIGN_UP).build());
-      });
-
-      button = findViewById(R.id.button_0000);
-      button.setOnClickListener(v -> {
-        presenter.onEvent(new Event.Builder(Event.DEFAULT).build());
-        render();
-      });
-
-      button = findViewById(R.id.button_pin);
-      button.setOnClickListener(v -> {
-        presenter.onEvent(new Event.Builder(Event.INPUT_PIN).build());
-      });
-
-      button = findViewById(R.id.button_pin_reset);
-      button.setOnClickListener(v -> {
-        presenter.onEvent(new Event.Builder(Event.RESET).build());
-      });
-
-      View view = findViewById(R.id.layout_test);
-      view.setVisibility(View.GONE);
-
-      ImageView toggleButton = findViewById(R.id.image_toggle);
-      toggleButton.setOnClickListener(v -> {
-        view.setVisibility(view.getVisibility() == View.GONE ? View.VISIBLE : View.GONE);
-        if (view.getVisibility() == View.GONE) {
-          toggleButton.setImageResource(R.drawable.icon_arcordion_close_arrow);
-        }
-        else {
-          toggleButton.setImageResource(R.drawable.icon_arcordion_open_arrow);
-        }
-      });
-
-      button = findViewById(R.id.button_set_account);
-      button.setOnClickListener(v -> {
-        presenter.onEvent(new Event.Builder(Event.INIT).build());
-
-      });
-
-      render();
-
-      TextView textView = findViewById(R.id.text_member_status);
-      String memberStatus = "";
-      if (SuperModel.getInstance().isBlockMember()) {
-        memberStatus = "Blocked ";
-      }
-      if (SuperModel.getInstance().isRestMember()) {
-        memberStatus += "Inactive ";
-      }
-      if (SuperModel.getInstance().isOutMember()) {
-        memberStatus += "Seceded";
-      }
-      if (StringUtil.isFull(memberStatus)) {
-        textView.setText("Member status: " + memberStatus);
-      }
+    debug();
 
-      ((TextView) findViewById(R.id.text_version)).setText("앱 버젼: " + AppUtil.getVersionName());
-    }
-    else {
-      findViewById(R.id.layout_test_all).setVisibility(View.GONE);
-    }
   }
 
   @Override
@@ -231,19 +162,6 @@ public class MainFragment extends FragmentBase<MainPresenter> implements IMainVi
     actionBarHelper.animate();
   }
 
-  private void clearData() {
-    SuperModel.getInstance().getPreferences().setTutorialDone(false);
-    SuperModel.getInstance().getPreferences().setZumoUserNo("");
-    SuperModel.getInstance().getPreferences().setZumoUserUpdateCompleted(false);
-    SuperModel.getInstance().clearMemberData();
-
-    // helpers...
-    ContentsFlagHelper.getInstance().dispose();
-    SuperModel.getInstance().setGuestLikedListBean(null);
-
-    render();
-  }
-
   @Override
   public void render() {
     findViewById(R.id.button_sign_up).setEnabled(SuperModel.getInstance().isMember() == false);
@@ -251,6 +169,11 @@ public class MainFragment extends FragmentBase<MainPresenter> implements IMainVi
     findViewById(R.id.button_pin_reset).setEnabled(StringUtil.isEmpty(SuperModel.getInstance().getPreferences().getEncryptedPin()));
   }
 
+  @Override
+  public void setIndicatorIndex(int index) {
+    indicator.onChangedIndex(contentsRecyclerView.getAdapter().getItemCount() - 1, index - 1);
+  }
+
   @Override
   public void scrollToPosition(int index) {
     if (null != snapper) {
@@ -263,13 +186,8 @@ public class MainFragment extends FragmentBase<MainPresenter> implements IMainVi
 //      helper.dispatchNestedPreScroll(0, 300, new int[2], new int[2], ViewCompat.TYPE_NON_TOUCH);
 
       // appbar 를 스크롤 시키기위해서 가상 이벤트를 전송한다.
-      ViewParent p = contentsRecyclerView.getParent();
-      ViewParent layoutCoordinator = null;
-      while (p != null) {
-        if (p instanceof NestedScrollingParent2) {
-          layoutCoordinator = p;
-        }
-        p = p.getParent();
+      if (null == layoutCoordinator) {
+        layoutCoordinator = ViewUtil.getCoodinatorLayoutParent(contentsRecyclerView);
       }
 
       if (null != layoutCoordinator) {
@@ -303,4 +221,105 @@ public class MainFragment extends FragmentBase<MainPresenter> implements IMainVi
       adapter.update(data);
     }
   }
+
+
+
+  /***********************************
+   * debug
+   ***********************************/
+
+  private void debug() {
+
+    if (AppUtil.isDebug()) {
+
+      View button;
+
+      button = findViewById(R.id.button_clear);
+      button.setOnClickListener(v -> {
+        clearData();
+      });
+
+      button = findViewById(R.id.button_zumo);
+      button.setOnClickListener(v -> {
+        SuperModel.getInstance().getPreferences().setZumoUserNo("---------------test--zumo-user----------------");
+      });
+
+      button = findViewById(R.id.button_sign_up);
+      button.setOnClickListener(v -> {
+        presenter.onEvent(new Event.Builder(Event.SIGN_UP).build());
+      });
+
+      button = findViewById(R.id.button_0000);
+      button.setOnClickListener(v -> {
+        presenter.onEvent(new Event.Builder(Event.DEFAULT).build());
+        render();
+      });
+
+      button = findViewById(R.id.button_pin);
+      button.setOnClickListener(v -> {
+        presenter.onEvent(new Event.Builder(Event.INPUT_PIN).build());
+      });
+
+      button = findViewById(R.id.button_pin_reset);
+      button.setOnClickListener(v -> {
+        presenter.onEvent(new Event.Builder(Event.RESET).build());
+      });
+
+      View view = findViewById(R.id.layout_test);
+      view.setVisibility(View.GONE);
+
+      ImageView toggleButton = findViewById(R.id.image_toggle);
+      toggleButton.setOnClickListener(v -> {
+        view.setVisibility(view.getVisibility() == View.GONE ? View.VISIBLE : View.GONE);
+        if (view.getVisibility() == View.GONE) {
+          toggleButton.setImageResource(R.drawable.icon_arcordion_close_arrow);
+        }
+        else {
+          toggleButton.setImageResource(R.drawable.icon_arcordion_open_arrow);
+        }
+      });
+
+      button = findViewById(R.id.button_set_account);
+      button.setOnClickListener(v -> {
+        presenter.onEvent(new Event.Builder(Event.INIT).build());
+
+      });
+
+      render();
+
+      TextView textView = findViewById(R.id.text_member_status);
+      String memberStatus = "";
+      if (SuperModel.getInstance().isBlockMember()) {
+        memberStatus = "Blocked ";
+      }
+      if (SuperModel.getInstance().isRestMember()) {
+        memberStatus += "Inactive ";
+      }
+      if (SuperModel.getInstance().isOutMember()) {
+        memberStatus += "Seceded";
+      }
+      if (StringUtil.isFull(memberStatus)) {
+        textView.setText("Member status: " + memberStatus);
+      }
+
+      ((TextView) findViewById(R.id.text_version)).setText("앱 버젼: " + AppUtil.getVersionName());
+    }
+    else {
+      findViewById(R.id.layout_test_all).setVisibility(View.GONE);
+    }
+  }
+
+  private void clearData() {
+    SuperModel.getInstance().getPreferences().setTutorialDone(false);
+    SuperModel.getInstance().getPreferences().setZumoUserNo("");
+    SuperModel.getInstance().getPreferences().setZumoUserUpdateCompleted(false);
+    SuperModel.getInstance().clearMemberData();
+
+    // helpers...
+    ContentsFlagHelper.getInstance().dispose();
+    SuperModel.getInstance().setGuestLikedListBean(null);
+
+    render();
+  }
+
 }

+ 56 - 32
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/main/MainPresenter.java

@@ -46,6 +46,7 @@ public class MainPresenter extends Presenter<MainModel, IMainView> {
   private Disposable disposable;
   private DialogBase alertDialog;
   private DoubleChecker doubleChecker;
+  private int index = 0;
 
   public MainPresenter(MainModel model, IMainView view) {
     super(model, view);
@@ -167,18 +168,6 @@ public class MainPresenter extends Presenter<MainModel, IMainView> {
   @Override
   protected void onEventInternal(Event event) {
     switch (event.getEventId()) {
-      case Event.SIGN_UP:
-        go(ScreenID.SIGN_UP_START);
-        break;
-      case Event.INPUT_PIN:
-        unlockPin();
-        break;
-      case Event.RESET:
-        resetPin();
-        break;
-      case Event.DEFAULT:
-        model.setDefaultPin();
-        break;
       // TODO: 2차 오픈: 준비중, 얼랏 처리
       case Event.CLICK: //날씨영역 클릭
         showErrorDialog(R.string.ready_comment);
@@ -208,32 +197,52 @@ public class MainPresenter extends Presenter<MainModel, IMainView> {
         gotoCategoryMain(event.getString());
         break;
       case Event.SCROLL:
-        // 첫 번째 카테고리로 이동
-        view.scrollToPosition(1);
+        scrollToFront();
         break;
 
+      /***********************************
+       * debug
+       ***********************************/
       case Event.INIT:
         initUser();
         break;
+      case Event.SIGN_UP:
+        go(ScreenID.SIGN_UP_START);
+        break;
+      case Event.INPUT_PIN:
+        unlockPin();
+        break;
+      case Event.RESET:
+        resetPin();
+        break;
+      case Event.DEFAULT:
+        model.setDefaultPin();
+        break;
       default:
         break;
     }
   }
 
+  private void scrollToFront() {
+
+    if (this.index == 0) {
+      // 첫 번째 카테고리로 이동
+      view.scrollToPosition(1);
+    }
+  }
+
   private boolean isTouched = false;
 
   public void touch() {
     isTouched = true;
   }
 
-  private void initUser() {
-
-    // 가입하면 설정되는 값들
-    SuperModel.getInstance().setUserId("201812040000000003");
-    SuperModel.getInstance().setUserEmail("");
-    model.setDefaultPin(); // pin 0000
-
-    model.login();
+  public void onScrolled(int index) {
+    if (this.index != index) {
+      Log.i("APP# MainPresenter | onScrolled", "|" + "index: " + index);
+      this.index = index;
+      view.setIndicatorIndex(index);
+    }
   }
 
   private void setContentsHelper(String categoryNumber, int categoryIndex, int contentsIndex) {
@@ -289,6 +298,31 @@ public class MainPresenter extends Presenter<MainModel, IMainView> {
     go(screedId);
   }
 
+  @Override
+  public void onNavigationClickSearch(NavigationBar navigationBar) {
+    showErrorDialog(R.string.ready_comment);
+  }
+
+  @Override
+  public void onNavigationClickLogo(NavigationBar navigationBar) {
+    // reload
+    home();
+  }
+
+  /***********************************
+   * debug
+   ***********************************/
+
+  private void initUser() {
+
+    // 가입하면 설정되는 값들
+    SuperModel.getInstance().setUserId("201812040000000003");
+    SuperModel.getInstance().setUserEmail("");
+    model.setDefaultPin(); // pin 0000
+
+    model.login();
+  }
+
   private void resetPin() {
     go(ScreenID.PIN_RESET_AUTH);
   }
@@ -338,14 +372,4 @@ public class MainPresenter extends Presenter<MainModel, IMainView> {
       .show();
   }
 
-  @Override
-  public void onNavigationClickSearch(NavigationBar navigationBar) {
-    showErrorDialog(R.string.ready_comment);
-  }
-
-  @Override
-  public void onNavigationClickLogo(NavigationBar navigationBar) {
-    // reload
-    home();
-  }
 }

+ 26 - 23
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/main/PageIndicator.java

@@ -67,14 +67,27 @@ public class PageIndicator extends View {
     }
   }
 
-  private void drawInactiveIndicators(Canvas c, float indicatorStartX, float indicatorPosY, int itemCount, int activePosition) {
+  @Override
+  protected void onDraw(Canvas canvas) {
+
+    float indicatorStartX = marginStart;
+    float indicatorPosY = getHeight() - (itemCount * distanceBetweenItem) - (marginBottom - itemNormalDiameter) - distanceSelectedItem;
 
+
+    drawInactiveIndicators(canvas, indicatorStartX, indicatorPosY, itemCount, index);
+
+    drawHighlights(canvas, indicatorStartX, indicatorPosY, index);
+  }
+
+  private void drawInactiveIndicators(Canvas c, float indicatorStartX, float indicatorPosY, int itemCount, int activePosition) {
+    if (activePosition == RecyclerView.NO_POSITION) {
+      // nothing
+      indicatorPosY += distanceSelectedItem;
+    }
     float start = indicatorPosY;
     for (int i = 0; i < itemCount; ++i) {
-      if (activePosition == RecyclerView.NO_POSITION) {
-        // nothing
-      }
-      else if (activePosition == i) {
+
+      if (activePosition == i) {
         start += distanceSelectedItem;
       }
       else if (i == activePosition + 1) {
@@ -91,27 +104,17 @@ public class PageIndicator extends View {
     }
   }
 
-  @Override
-  protected void onDraw(Canvas canvas) {
-
-    float indicatorStartX = marginStart;
-    float indicatorPosY = getHeight() - (itemCount * distanceBetweenItem) - (marginBottom - itemNormalDiameter) - distanceSelectedItem;
-
-
-    drawInactiveIndicators(canvas, indicatorStartX, indicatorPosY, itemCount, index);
-
-    drawHighlights(canvas, indicatorStartX, indicatorPosY, index);
-  }
-
   private void drawHighlights(Canvas c, float indicatorStartX, float indicatorPosY, int highlightPosition) {
+    if (highlightPosition > -1) {
 
-    final float itemWidth = itemSelectedDiameter;
+      final float itemWidth = itemSelectedDiameter;
 
-    float start = indicatorStartX - offsetForCenter;
-    float end = indicatorPosY + distanceBetweenItem * highlightPosition - offsetForCenter + distanceSelectedItem;
+      float start = indicatorStartX - offsetForCenter;
+      float end = indicatorPosY + distanceBetweenItem * highlightPosition - offsetForCenter + distanceSelectedItem;
 
-    Drawable d = ContextCompat.getDrawable(context, R.drawable.ic_main_indecator_select);
-    d.setBounds((int) start, (int) end, (int) (start + (itemWidth)), (int) (end + itemWidth));
-    d.draw(c);
+      Drawable d = ContextCompat.getDrawable(context, R.drawable.ic_main_indecator_select);
+      d.setBounds((int) start, (int) end, (int) (start + (itemWidth)), (int) (end + itemWidth));
+      d.draw(c);
+    }
   }
 }