瀏覽代碼

[공통][New] 잠금해제 다이얼로그 추가

hyodong.min 7 年之前
父節點
當前提交
df243bf598

+ 2 - 1
app/src/main/java/kr/co/zumo/app/lifeplus/view/dialog/DialogID.java

@@ -29,9 +29,10 @@ public class DialogID {
   public static final int SHARE = 7;
   public static final int COIN_INFORMATION = 8;
   public static final int MAIN_FILTER = 9;
+  public final static int PIN_UNLOCK = 10;
 
   @Retention(RetentionPolicy.SOURCE)
-  @IntDef({NONE, CONFIRM, PIN_CONFIRM, WEB, ADD_REGISTRATION, ALERT, PROMOTION, SHARE, COIN_INFORMATION, MAIN_FILTER})
+  @IntDef({NONE, CONFIRM, PIN_CONFIRM, WEB, ADD_REGISTRATION, ALERT, PROMOTION, SHARE, COIN_INFORMATION, MAIN_FILTER, PIN_UNLOCK})
   public @interface ID {}
 
 }

+ 3 - 2
app/src/main/java/kr/co/zumo/app/lifeplus/view/dialog/PinConfirmDialog.java

@@ -75,7 +75,9 @@ public class PinConfirmDialog extends DialogBase {
 
       @Override
       public void onClickPinReset() {
-        // 리셋 버튼 보이지 않음.
+        if (null != getResultListener()) {
+          getResultListener().onDialogResult(PinConfirmDialog.this, new Event.Builder(Event.RESET).build());
+        }
       }
 
       @Override
@@ -83,7 +85,6 @@ public class PinConfirmDialog extends DialogBase {
         if (null != getResultListener()) {
           getResultListener().onDialogCanceled(PinConfirmDialog.this);
         }
-
       }
 
       @Override

+ 119 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/view/dialog/PinUnlockDialog.java

@@ -0,0 +1,119 @@
+/*
+ * COPYRIGHT (c) 2018 All rights reserved by HANWHA LIFE.
+ */
+package kr.co.zumo.app.lifeplus.view.dialog;
+
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import kr.co.zumo.app.R;
+import kr.co.zumo.app.lifeplus.view.Event;
+import kr.co.zumo.app.lifeplus.view.custom.pin.CustomPinUnlockPresenter;
+import kr.co.zumo.app.lifeplus.view.custom.pin.CustomPinView;
+import kr.co.zumo.app.lifeplus.view.custom.pin.IPinContract;
+
+/**
+ * PinUnlockDialog
+ * <pre>
+ *   핀 입력이 완료되면 onDialogResult(this, Event.string(pin)) 으로 입력 값이 전달된다.
+ * </pre>
+ *
+ * @author 민효동
+ * @version 1.0
+ * @history 민효동   [2018. 11. 1.]   [최초 작성]
+ * @since 2018. 11. 1.
+ */
+public class PinUnlockDialog extends DialogBase {
+
+  private CustomPinView customPinView;
+  private IPinContract.Presenter pinPresenter;
+
+  @Override
+  public void onCreate(Bundle savedInstanceState) {
+    super.onCreate(savedInstanceState);
+  }
+
+  @Override
+  public void onDestroyView() {
+    super.onDestroyView();
+
+    if (null != customPinView) {
+      customPinView.dispose();
+      customPinView = null;
+    }
+    if (null != pinPresenter) {
+      pinPresenter.dispose();
+      pinPresenter = null;
+    }
+  }
+
+
+  @Nullable
+  @Override
+  public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
+    return inflater.inflate(R.layout.view_container, container, false);
+  }
+
+  @Override
+  public void onActivityCreated(Bundle savedInstanceState) {
+    super.onActivityCreated(savedInstanceState);
+
+    getDialog().getWindow().getAttributes().windowAnimations = R.style.DialogAnimation;
+
+    customPinView = new CustomPinView(getContext());
+    pinPresenter = new CustomPinUnlockPresenter(customPinView, new IPinContract.Listener() {
+      @Override
+      public void onPinResult(String result) {
+        if (null != getResultListener()) {
+          getResultListener().onDialogResult(PinUnlockDialog.this, new Event.Builder(Event.CONFIRM).string(result).build());
+        }
+      }
+
+      @Override
+      public void onClickPinReset() {
+        if (null != getResultListener()) {
+          getResultListener().onDialogResult(PinUnlockDialog.this, new Event.Builder(Event.RESET).build());
+        }
+      }
+
+      @Override
+      public void onClickClose() {
+        if (null != getResultListener()) {
+          getResultListener().onDialogCanceled(PinUnlockDialog.this);
+        }
+      }
+
+      @Override
+      public void onPinFail() {
+        if (null != getResultListener()) {
+          getResultListener().onDialogResult(PinUnlockDialog.this, new Event.Builder(Event.FAIL).build());
+        }
+      }
+
+      @Override
+      public void onPinHelp() {
+        if (null != getResultListener()) {
+          getResultListener().onDialogResult(PinUnlockDialog.this, new Event.Builder(Event.HELP).build());
+        }
+      }
+    });
+
+    View parent = getView();
+    ViewGroup layout = parent.findViewById(R.id.container);
+    ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
+    layout.addView(customPinView, params);
+  }
+
+  /**
+   * 핀 입력 재시도
+   * - 5회 실패 시 onPinFail() 발생하여 Event.FAIL 이 전달된다.
+   */
+  public void retry() {
+    pinPresenter.retry();
+  }
+
+}

+ 4 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/view/dialog/factory/BasicDialogFactory.java

@@ -12,6 +12,7 @@ import kr.co.zumo.app.lifeplus.view.dialog.DialogBase;
 import kr.co.zumo.app.lifeplus.view.dialog.DialogID;
 import kr.co.zumo.app.lifeplus.view.dialog.CategoryMainFilterDialog;
 import kr.co.zumo.app.lifeplus.view.dialog.PinConfirmDialog;
+import kr.co.zumo.app.lifeplus.view.dialog.PinUnlockDialog;
 import kr.co.zumo.app.lifeplus.view.dialog.PromotionDialog;
 import kr.co.zumo.app.lifeplus.view.dialog.WebDialog;
 
@@ -55,6 +56,9 @@ public class BasicDialogFactory implements IDialogFactory {
       case DialogID.PIN_CONFIRM:
         dialog = new PinConfirmDialog();
         break;
+      case DialogID.PIN_UNLOCK:
+        dialog = new PinUnlockDialog();
+        break;
       case DialogID.MAIN_FILTER:
         dialog = new CategoryMainFilterDialog();
         break;

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

@@ -4,6 +4,7 @@
 package kr.co.zumo.app.lifeplus.view.screen.main;
 
 import kr.co.zumo.app.lifeplus.model.Model;
+import kr.co.zumo.app.lifeplus.model.module.PinModuleParser;
 
 /**
  * MainModel
@@ -21,6 +22,16 @@ public class MainModel extends Model {
   protected void destroyInternal() {
   }
 
+  /**
+   * 입력한 핀과 저장된 핀이 같은지 확인
+   *
+   * @param pin "0000"
+   * @return boolean
+   */
+  public boolean verifyPin(String pin) {
+    return new PinModuleParser().verify(pin);
+  }
+
   /**
    * 로드 중지
    */

+ 58 - 2
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/main/MainPresenter.java

@@ -3,10 +3,15 @@
  */
 package kr.co.zumo.app.lifeplus.view.screen.main;
 
+import kr.co.zumo.app.R;
 import kr.co.zumo.app.lifeplus.supervisor.ScreenID;
 import kr.co.zumo.app.lifeplus.view.Event;
 import kr.co.zumo.app.lifeplus.view.command.ExitCommand;
 import kr.co.zumo.app.lifeplus.view.dialog.DialogBase;
+import kr.co.zumo.app.lifeplus.view.dialog.DialogBuilder;
+import kr.co.zumo.app.lifeplus.view.dialog.DialogID;
+import kr.co.zumo.app.lifeplus.view.dialog.IDialogResultListener;
+import kr.co.zumo.app.lifeplus.view.dialog.PinUnlockDialog;
 import kr.co.zumo.app.lifeplus.view.presenter.Presenter;
 import kr.co.zumo.app.lifeplus.view.screen.factory.BasicFragmentFactory;
 import kr.co.zumo.app.lifeplus.view.screen.factory.SignUpZumoFragmentFactory;
@@ -119,10 +124,10 @@ public class MainPresenter extends Presenter<MainModel, IMainView> {
         go(ScreenID.FAQ);
         break;
       case Event.INPUT_PIN:
-        go(ScreenID.PIN, ScreenID.DIRECTION_NONE);
+        unlockPin();
         break;
       case Event.RESET:
-        go(ScreenID.PIN_RESET, ScreenID.DIRECTION_NONE);
+        resetPin();
         break;
       case Event.BUCKET:
         go(ScreenID.BUCKET);
@@ -132,4 +137,55 @@ public class MainPresenter extends Presenter<MainModel, IMainView> {
     }
   }
 
+  private void resetPin() {
+    // todo reset 은 인증-> 핀 설정 순서
+
+  }
+
+  private void unlockPin() {
+    DialogBuilder.create(DialogID.PIN_UNLOCK)
+      .listener(new IDialogResultListener<PinUnlockDialog>() {
+        @Override
+        public void onDialogResult(PinUnlockDialog dialog, Event event) {
+          switch (event.getEventId()) {
+            case Event.CONFIRM:
+              String inputPin = event.getString();
+              if (model.verifyPin(inputPin)) {
+                dialog.dispose();
+              }
+              else {
+                dialog.retry();
+              }
+
+              break;
+            case Event.RESET:
+              dialog.dispose();
+
+              resetPin();
+
+              break;
+            case Event.FAIL:
+              dialog.dispose();
+              // 핀 불일치
+              showErrorDialog(R.string.pin_miss_match_error);
+              break;
+            case Event.HELP:
+              dialog.dispose();
+              break;
+            default:
+              dialog.dispose();
+              break;
+          }
+        }
+
+        @Override
+        public void onDialogCanceled(PinUnlockDialog dialog) {
+          dialog.dispose();
+          // do nothing;
+
+        }
+      })
+      .show();
+  }
+
 }

+ 1 - 3
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/pin/PinConfirmFragment.java

@@ -85,9 +85,7 @@ public class PinConfirmFragment extends FragmentBase<PinConfirmPresenter> implem
 
   @Override
   protected void defineActionBar() {
-    ActionBarManager.getInstance().begin()
-      .back(actionBar -> presenter.onClickBack(actionBar))
-      .show();
+    ActionBarManager.getInstance().begin().hide();
   }
 
   @Override