Browse Source

[회원가입][New] 핀 입력/재설정

hyodong.min 7 years ago
parent
commit
e8004bf0f0

+ 27 - 9
app/src/main/java/kr/co/zumo/app/lifeplus/activity/PinConfirmActivity.java

@@ -10,9 +10,10 @@ import kr.co.zumo.app.R;
 import kr.co.zumo.app.lifeplus.manager.ActionBarManager;
 import kr.co.zumo.app.lifeplus.model.PinModel;
 import kr.co.zumo.app.lifeplus.view.Event;
-import kr.co.zumo.app.lifeplus.view.IPinView;
+import kr.co.zumo.app.lifeplus.view.IPinConfirmView;
 import kr.co.zumo.app.lifeplus.view.custom.CustomPinConfirmPresenter;
 import kr.co.zumo.app.lifeplus.view.custom.CustomPinView;
+import kr.co.zumo.app.lifeplus.view.custom.IPinContract;
 import kr.co.zumo.app.lifeplus.view.presenter.PinConfirmPresenter;
 
 /**
@@ -26,10 +27,10 @@ import kr.co.zumo.app.lifeplus.view.presenter.PinConfirmPresenter;
  * @history 민효동   [2018-10-04]   [최초 작성]
  * @since 2018-10-04
  */
-public class PinConfirmActivity extends ActivityBase<PinConfirmPresenter> implements IPinView {
+public class PinConfirmActivity extends ActivityBase<PinConfirmPresenter> implements IPinConfirmView {
 
   private CustomPinView customPinView;
-  private CustomPinConfirmPresenter customPinConfirmPresenter;
+  private IPinContract.Presenter pinPresenter;
 
   @Override
   void onAfterCreate(Bundle savedInstanceState) {
@@ -45,9 +46,21 @@ public class PinConfirmActivity extends ActivityBase<PinConfirmPresenter> implem
      *
      */
     customPinView = new CustomPinView(this);
-    customPinConfirmPresenter = new CustomPinConfirmPresenter(customPinView, result ->
-    {
-      presenter.onEvent(new Event.Builder(Event.SUCCESS).string(result).build());
+    pinPresenter = new CustomPinConfirmPresenter(customPinView, new IPinContract.Listener() {
+      @Override
+      public void onPinResult(String result) {
+        presenter.onEvent(new Event.Builder(Event.RESULT).string(result).build());
+      }
+
+      @Override
+      public void onClickPinReset() {
+        presenter.onEvent(new Event.Builder(Event.RESET).build());
+      }
+
+      @Override
+      public void onPinFail() {
+        presenter.onEvent(new Event.Builder(Event.FAIL).build());
+      }
     });
 
     ViewGroup layout = findViewById(R.id.container);
@@ -69,9 +82,9 @@ public class PinConfirmActivity extends ActivityBase<PinConfirmPresenter> implem
   protected void onDestroy() {
     super.onDestroy();
 
-    if (null != customPinConfirmPresenter) {
-      customPinConfirmPresenter.dispose();
-      customPinConfirmPresenter = null;
+    if (null != pinPresenter) {
+      pinPresenter.dispose();
+      pinPresenter = null;
     }
 
     if (null != customPinView) {
@@ -79,4 +92,9 @@ public class PinConfirmActivity extends ActivityBase<PinConfirmPresenter> implem
       customPinView = null;
     }
   }
+
+  @Override
+  public void retry() {
+    pinPresenter.retry();
+  }
 }

+ 61 - 4
app/src/main/java/kr/co/zumo/app/lifeplus/activity/PinResetActivity.java

@@ -4,8 +4,17 @@
 package kr.co.zumo.app.lifeplus.activity;
 
 import android.os.Bundle;
+import android.view.ViewGroup;
 
-import kr.co.zumo.app.lifeplus.view.presenter.Presenter;
+import kr.co.zumo.app.R;
+import kr.co.zumo.app.lifeplus.manager.ActionBarManager;
+import kr.co.zumo.app.lifeplus.model.PinModel;
+import kr.co.zumo.app.lifeplus.view.Event;
+import kr.co.zumo.app.lifeplus.view.IPinView;
+import kr.co.zumo.app.lifeplus.view.custom.CustomPinResetPresenter;
+import kr.co.zumo.app.lifeplus.view.custom.CustomPinView;
+import kr.co.zumo.app.lifeplus.view.custom.IPinContract;
+import kr.co.zumo.app.lifeplus.view.presenter.PinResetPresenter;
 
 /**
  * PinResetActivity
@@ -17,19 +26,67 @@ import kr.co.zumo.app.lifeplus.view.presenter.Presenter;
  * @history 민효동   [2018-10-04]   [최초 작성]
  * @since 2018-10-04
  */
-public class PinResetActivity extends ActivityBase {
+public class PinResetActivity extends ActivityBase<PinResetPresenter> implements IPinView {
+  private CustomPinView customPinView;
+  private IPinContract.Presenter pinPresenter;
+
   @Override
   void onAfterCreate(Bundle savedInstanceState) {
 
+    setContentView(R.layout.view_container);
+
+    /**
+     * 핀 확인/등록/초기화(재등록)
+     *
+     * - 같은 뷰(CustomPinView)를 이용한다.
+     * - presenter 를 달리하여 각 단계를 컨트롤한다.
+     * - 결과는 IPinContract.Listener 로 전달한다.
+     *
+     */
+    customPinView = new CustomPinView(this);
+    pinPresenter = new CustomPinResetPresenter(customPinView, new IPinContract.Listener() {
+      @Override
+      public void onPinResult(String result) {
+        presenter.onEvent(new Event.Builder(Event.SUCCESS).string(result).build());
+      }
+
+      @Override
+      public void onClickPinReset() {
+      }
+
+      @Override
+      public void onPinFail() {
+        pinPresenter.onPinStart();
+      }
+    });
+
+    ViewGroup layout = findViewById(R.id.container);
+    ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
+    layout.addView(customPinView, params);
   }
 
   @Override
   void defineActionBar() {
+    ActionBarManager.getInstance().hide();
+  }
 
+  @Override
+  PinResetPresenter definePresenter() {
+    return new PinResetPresenter(getModel(PinModel.class), this);
   }
 
   @Override
-  Presenter definePresenter() {
-    return null;
+  protected void onDestroy() {
+    super.onDestroy();
+
+    if (null != pinPresenter) {
+      pinPresenter.dispose();
+      pinPresenter = null;
+    }
+
+    if (null != customPinView) {
+      customPinView.dispose();
+      customPinView = null;
+    }
   }
 }

+ 10 - 1
app/src/main/java/kr/co/zumo/app/lifeplus/model/PinModel.java

@@ -29,7 +29,7 @@ public class PinModel extends Model {
     String encryptedPin;
     try {
       encryptedPin = StringUtil.convertToSHA256(StringUtil.convertToMD5(pin));
-    } catch (NoSuchAlgorithmException e) {
+    } catch (Exception e) {
       e.printStackTrace();
       encryptedPin = "";
     }
@@ -38,6 +38,15 @@ public class PinModel extends Model {
     return StringUtil.isFull(encryptedPin) && StringUtil.isFull(savedPin) && savedPin.equals(encryptedPin);
   }
 
+  /**
+   * 핀 저장
+   *
+   * @param pin
+   */
+  public void savePin(String pin) {
+    SuperModel.getInstance().savePinWithEncryption(pin);
+  }
+
   @Override
   protected void destroyInternal() {
 

+ 3 - 9
app/src/main/java/kr/co/zumo/app/lifeplus/model/SignUpModel.java

@@ -23,7 +23,6 @@ import kr.co.zumo.app.lifeplus.bean.api.PolicyVersionBean;
 import kr.co.zumo.app.lifeplus.network.api.LifeplusAPIService;
 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.view.Event;
 
 /**
@@ -123,20 +122,15 @@ public class SignUpModel extends Model {
     SuperModel.getInstance().setUserId(userId);
   }
 
-
   /**
    * 핀 저장
    *
    * @param pin
    */
   public void savePin(String pin) {
-    try {
-      encryptedPin = StringUtil.convertToSHA256(StringUtil.convertToMD5(pin));
-      Log.i("APP# SignUpModel | savePin", "| pin: " + pin + ", encryptedPin: " + encryptedPin);
-      getPreferences().setEncryptedPin(encryptedPin);
-    } catch (Exception e) {
-      e.printStackTrace();
-    }
+    SuperModel.getInstance().savePinWithEncryption(pin);
+    encryptedPin = getPreferences().getEncryptedPin();
+    Log.i("APP# SignUpModel | savePinWithEncryption", "| pin: " + pin + ", encryptedPin: " + encryptedPin);
   }
 
   /**

+ 32 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/model/SuperModel.java

@@ -3,6 +3,8 @@
  */
 package kr.co.zumo.app.lifeplus.model;
 
+import android.util.Log;
+
 import kr.co.zumo.app.lifeplus.util.StringUtil;
 
 /**
@@ -24,6 +26,7 @@ public final class SuperModel {
 
   private String deviceUuid;
   private String UserId;
+  private String token;
   private LifeplusPreferences preferences;
 
   private SuperModel() {
@@ -89,5 +92,34 @@ public final class SuperModel {
   public void dispose() {
   }
 
+  /**
+   * 유저 토큰
+   *
+   * @return
+   */
+  public String getToken() {
+    if (null == token) {
+      token = "";
+    }
+    return token;
+  }
 
+  public void setToken(String token) {
+    this.token = token;
+  }
+
+  /**
+   * 핀 저장
+   *
+   * @param pin
+   */
+  public void savePinWithEncryption(String pin) {
+    try {
+      String encryptedPin = StringUtil.convertToSHA256(StringUtil.convertToMD5(pin));
+      Log.i("APP# SuperModel | savePinWithEncryption", "| pin: " + pin + ", encryptedPin: " + encryptedPin);
+      getPreferences().setEncryptedPin(encryptedPin);
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+  }
 }

+ 21 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/view/IPinConfirmView.java

@@ -0,0 +1,21 @@
+/*
+ * COPYRIGHT (c) 2018 All rights reserved by HANWHA LIFE.
+ */
+package kr.co.zumo.app.lifeplus.view;
+
+/**
+ * IPinView
+ * <pre>
+ * </pre>
+ *
+ * @author 민효동
+ * @version 1.0
+ * @history 민효동   [2018. 9. 21.]   [최초 작성]
+ * @since 2018. 9. 21.
+ */
+public interface IPinConfirmView extends IPinView {
+  /**
+   * 핀 입력 재시도
+   */
+  void retry();
+}

+ 51 - 2
app/src/main/java/kr/co/zumo/app/lifeplus/view/custom/CustomPinConfirmPresenter.java

@@ -3,6 +3,11 @@
  */
 package kr.co.zumo.app.lifeplus.view.custom;
 
+import java.util.concurrent.TimeUnit;
+
+import io.reactivex.Completable;
+import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.disposables.CompositeDisposable;
 import kr.co.zumo.app.R;
 import kr.co.zumo.app.lifeplus.util.ResourceUtil;
 
@@ -21,19 +26,25 @@ public class CustomPinConfirmPresenter implements IPinContract.Presenter {
   private IPinContract.View view;
   private IPinContract.Listener listener;
 
+  private String pin;
+  private int matchCount;
+  private CompositeDisposable disposable = new CompositeDisposable();
+
   public CustomPinConfirmPresenter(IPinContract.View view, IPinContract.Listener listener) {
     this.view = view;
     this.listener = listener;
 
+    this.view.setResetButtonVisible(true);
     this.view.setPresenter(this);
   }
 
   @Override
   public void onPinStart() {
-    view.setResetButtonVisible(false);
+    view.setResetButtonVisible(true);
     view.updateGuideTextColor(ResourceUtil.getColor(R.color.C999999));
     view.updateGuideText(R.string.login_input_pin);
     view.updateTitleText(R.string.login_input_pin_title);
+    view.restart();
   }
 
   @Override
@@ -43,7 +54,45 @@ public class CustomPinConfirmPresenter implements IPinContract.Presenter {
   }
 
   @Override
-  public void dispose() {
+  public void onClickPinReset() {
+    listener.onClickPinReset();
+  }
+
+  @Override
+  public void retry() {
+    // 일치 하지 않으면 5회 재시도 후
+    if (++matchCount < 5) {
+      view.updateGuideTextColor(ResourceUtil.getColor(R.color.CF12815));
+      view.updateGuideText(String.format(ResourceUtil.getString(R.string.pin_miss_match_error_repeat), matchCount));
+      view.restart();
+    }
+    else {
+          /*
+           5회 이상 불일치 시 ‘간편암호가 5회이상 일치하지 않아, 입력값이 초기화됩니다.’ 밸리데이션 문구 1초간 노출
+          - 입력값 초기화된 상태로 STEP1로 변경
+           */
+      view.updateGuideTextColor(ResourceUtil.getColor(R.color.CF12815));
+      view.updateGuideText(R.string.pin_miss_match_error);
+
+      view.setDisabled();
+      disposable.add(
+        Completable.timer(1000, TimeUnit.MILLISECONDS, AndroidSchedulers.mainThread())
+          .subscribe(() -> {
 
+            pin = null;
+            listener.onPinFail();
+
+          }, Throwable::printStackTrace)
+      );
+    }
+
+  }
+
+  @Override
+  public void dispose() {
+    if (null != disposable) {
+      disposable.dispose();
+      disposable = null;
+    }
   }
 }

+ 16 - 8
app/src/main/java/kr/co/zumo/app/lifeplus/view/custom/CustomPinRegisterPresenter.java

@@ -38,6 +38,7 @@ public class CustomPinRegisterPresenter implements IPinContract.Presenter {
     view.updateGuideTextColor(ResourceUtil.getColor(R.color.C999999));
     view.updateGuideText(R.string.sign_up_register_pin);
     view.updateTitleText(R.string.sign_up_register_pin_title);
+    view.restart();
   }
 
   private String pin;
@@ -59,7 +60,7 @@ public class CustomPinRegisterPresenter implements IPinContract.Presenter {
         // 일치 하지 않으면 5회 재시도 후
         if (++matchCount < 5) {
           view.updateGuideTextColor(ResourceUtil.getColor(R.color.CF12815));
-          view.updateGuideText(String.format(ResourceUtil.getString(R.string.sign_up_register_pin_error), matchCount));
+          view.updateGuideText(String.format(ResourceUtil.getString(R.string.pin_miss_match_error_repeat), matchCount));
           view.updateTitleText(R.string.sign_up_register_pin_title);
           view.restart();
         }
@@ -69,18 +70,15 @@ public class CustomPinRegisterPresenter implements IPinContract.Presenter {
           - 입력값 초기화된 상태로 STEP1로 변경
            */
           view.updateGuideTextColor(ResourceUtil.getColor(R.color.CF12815));
-          view.updateGuideText(R.string.sign_up_register_pin_init);
+          view.updateGuideText(R.string.pin_miss_match_init);
           view.updateTitleText(R.string.sign_up_register_pin_title);
 
           view.setDisabled();
           disposable.add(
             Completable.timer(1000, TimeUnit.MILLISECONDS, AndroidSchedulers.mainThread())
-              .subscribe(()-> {
-
+              .subscribe(() -> {
                 pin = null;
-
-                onPinStart();
-                view.restart();
+                listener.onPinFail();
 
               }, Throwable::printStackTrace)
           );
@@ -99,9 +97,19 @@ public class CustomPinRegisterPresenter implements IPinContract.Presenter {
     }
   }
 
+  @Override
+  public void onClickPinReset() {
+
+  }
+
+  @Override
+  public void retry() {
+
+  }
+
   @Override
   public void dispose() {
-    if(null != disposable) {
+    if (null != disposable) {
       disposable.dispose();
       disposable = null;
     }

+ 116 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/view/custom/CustomPinResetPresenter.java

@@ -0,0 +1,116 @@
+/*
+ * COPYRIGHT (c) 2018 All rights reserved by HANWHA LIFE.
+ */
+package kr.co.zumo.app.lifeplus.view.custom;
+
+import java.util.concurrent.TimeUnit;
+
+import io.reactivex.Completable;
+import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.disposables.CompositeDisposable;
+import kr.co.zumo.app.R;
+import kr.co.zumo.app.lifeplus.util.ResourceUtil;
+import kr.co.zumo.app.lifeplus.util.StringUtil;
+
+/**
+ * CustomPinConfirmPresenter
+ * <pre>
+ * </pre>
+ *
+ * @author 민효동
+ * @version 1.0
+ * @history 민효동   [2018-10-04]   [최초 작성]
+ * @since 2018-10-04
+ */
+public class CustomPinResetPresenter implements IPinContract.Presenter {
+
+  private IPinContract.View view;
+  private IPinContract.Listener listener;
+
+  private String pin;
+  private int matchCount;
+  private CompositeDisposable disposable = new CompositeDisposable();
+
+  public CustomPinResetPresenter(IPinContract.View view, IPinContract.Listener listener) {
+    this.view = view;
+    this.listener = listener;
+
+    this.view.setPresenter(this);
+  }
+
+  @Override
+  public void onPinStart() {
+    view.setResetButtonVisible(false);
+    view.updateGuideTextColor(ResourceUtil.getColor(R.color.C999999));
+    view.updateGuideText(R.string.pin_code_reset_message);
+    view.updateTitleText(R.string.pin_code_reset);
+    view.restart();
+  }
+
+  @Override
+  public void onPinResult(String result) {
+    if (StringUtil.isFull(pin)) {
+      // 두 번째 등록
+      view.setDisabled();
+      // 일치하는지 확인
+      if (pin.length() == 4 && pin.equals(result)) {
+        // 일치 결과 전달
+        listener.onPinResult(pin);
+      }
+      else {
+        // 일치 하지 않으면 5회 재시도 후
+        if (++matchCount < 5) {
+          view.updateGuideTextColor(ResourceUtil.getColor(R.color.CF12815));
+          view.updateGuideText(String.format(ResourceUtil.getString(R.string.pin_miss_match_error_repeat), matchCount));
+          view.restart();
+        }
+        else {
+          /*
+           5회 이상 불일치 시 ‘간편암호가 5회이상 일치하지 않아, 입력값이 초기화됩니다.’ 밸리데이션 문구 1초간 노출
+          - 입력값 초기화된 상태로 STEP1로 변경
+           */
+          view.updateGuideTextColor(ResourceUtil.getColor(R.color.CF12815));
+          view.updateGuideText(R.string.pin_miss_match_init);
+
+          view.setDisabled();
+          disposable.add(
+            Completable.timer(1000, TimeUnit.MILLISECONDS, AndroidSchedulers.mainThread())
+              .subscribe(() -> {
+
+                pin = null;
+                listener.onPinFail();
+
+              }, Throwable::printStackTrace)
+          );
+        }
+      }
+    }
+    else {
+      // 처음 입력;
+      matchCount = 0;
+      pin = result;
+      view.setDisabled();
+      view.updateGuideTextColor(ResourceUtil.getColor(R.color.C999999));
+      view.updateGuideText(R.string.pin_code_again_message);
+      view.restart();
+    }
+  }
+
+  @Override
+  public void onClickPinReset() {
+    listener.onClickPinReset();
+  }
+
+  @Override
+  public void retry() {
+
+  }
+
+  @Override
+  public void dispose() {
+    if (null != disposable) {
+      disposable.dispose();
+      disposable = null;
+    }
+  }
+}

+ 3 - 1
app/src/main/java/kr/co/zumo/app/lifeplus/view/custom/CustomPinView.java

@@ -103,12 +103,13 @@ public class CustomPinView extends ConstraintLayout implements IPinContract.View
 
     buttonDelete.setOnClickListener(v -> doSomeAfterClickDeleteButton());
 
+    textReset.setOnClickListener(v -> presenter.onClickPinReset());
+
     int size = buttonList.size();
     for (int i = 0; i < size; ++i) {
       buttonList.get(i).setOnClickListener(v -> doSomeAfterClickNumberButton(v));
     }
 
-    shuffleKeyboard();
   }
 
   /***********************************
@@ -260,6 +261,7 @@ public class CustomPinView extends ConstraintLayout implements IPinContract.View
   }
 
   private void setEnabledInternal(boolean enabled) {
+    textReset.setEnabled(enabled);
     buttonDelete.setEnabled(enabled);
     buttonShuffle.setEnabled(enabled);
     for (Button button : buttonList) {

+ 21 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/view/custom/IPinContract.java

@@ -89,6 +89,16 @@ public class IPinContract {
      */
     void onPinResult(String result);
 
+    /**
+     * 재설정 버튼 눌렀을 때
+     */
+    void onClickPinReset();
+
+    /**
+     * 핀 입력 재시도
+     */
+    void retry();
+
     void dispose();
   }
 
@@ -99,5 +109,16 @@ public class IPinContract {
      * @param result "1234"
      */
     void onPinResult(String result);
+
+    /**
+     * 재설정 버튼 눌렀을 때
+     */
+    void onClickPinReset();
+
+    /**
+     * 핀 입력 실패
+     * - 2회 자체 검증 실패 시
+     */
+    void onPinFail();
   }
 }

+ 12 - 5
app/src/main/java/kr/co/zumo/app/lifeplus/view/presenter/PinConfirmPresenter.java

@@ -9,7 +9,7 @@ import io.reactivex.disposables.Disposable;
 import kr.co.zumo.app.lifeplus.model.PinModel;
 import kr.co.zumo.app.lifeplus.supervisor.ScreenID;
 import kr.co.zumo.app.lifeplus.view.Event;
-import kr.co.zumo.app.lifeplus.view.IPinView;
+import kr.co.zumo.app.lifeplus.view.IPinConfirmView;
 import kr.co.zumo.app.lifeplus.view.command.ActivityChangeCommand;
 
 /**
@@ -22,11 +22,11 @@ import kr.co.zumo.app.lifeplus.view.command.ActivityChangeCommand;
  * @history 민효동   [2018. 9. 21.]   [최초 작성]
  * @since 2018. 9. 21.
  */
-public class PinConfirmPresenter extends Presenter<PinModel, IPinView> {
+public class PinConfirmPresenter extends Presenter<PinModel, IPinConfirmView> {
 
   private Disposable disposable;
 
-  public PinConfirmPresenter(PinModel model, IPinView view) {
+  public PinConfirmPresenter(PinModel model, IPinConfirmView view) {
     super(model, view);
   }
 
@@ -72,10 +72,16 @@ public class PinConfirmPresenter extends Presenter<PinModel, IPinView> {
   @Override
   protected void onEventInternal(Event event) {
     switch (event.getEventId()) {
-      case Event.SUCCESS:
+      case Event.RESULT:
         Log.i("APP# PinConfirmPresenter | onEventInternal", "|" + event.getString());
         verifyPin(event.getString());
         break;
+      case Event.FAIL:
+        onBackPressed();
+        break;
+      case Event.RESET:
+        onCommand(new ActivityChangeCommand(ScreenID.ACTIVITY_PIN_RESET, ScreenID.DIRECTION_NEXT));
+        break;
       default:
         break;
     }
@@ -96,7 +102,8 @@ public class PinConfirmPresenter extends Presenter<PinModel, IPinView> {
     }
     else {
       // 핀 번호 불 일치
-      onCommand(new ActivityChangeCommand(ScreenID.ACTIVITY_MAIN, ScreenID.DIRECTION_BACK));
+      // view 에 다시 요청함
+      view.retry();
     }
   }
 }

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

@@ -0,0 +1,85 @@
+/*
+ * COPYRIGHT (c) 2018 All rights reserved by HANWHA LIFE.
+ */
+package kr.co.zumo.app.lifeplus.view.presenter;
+
+import android.util.Log;
+
+import io.reactivex.disposables.Disposable;
+import kr.co.zumo.app.lifeplus.model.PinModel;
+import kr.co.zumo.app.lifeplus.supervisor.ScreenID;
+import kr.co.zumo.app.lifeplus.view.Event;
+import kr.co.zumo.app.lifeplus.view.IPinView;
+import kr.co.zumo.app.lifeplus.view.command.ActivityChangeCommand;
+
+/**
+ * PinResetPresenter
+ * <pre>
+ * </pre>
+ *
+ * @author 민효동
+ * @version 1.0
+ * @history 민효동   [2018. 9. 21.]   [최초 작성]
+ * @since 2018. 9. 21.
+ */
+public class PinResetPresenter extends Presenter<PinModel, IPinView> {
+
+  private Disposable disposable;
+
+  public PinResetPresenter(PinModel model, IPinView view) {
+    super(model, view);
+  }
+
+  @Override
+  protected void startInternal() {
+
+  }
+
+  @Override
+  protected void stopInternal() {
+
+  }
+
+  @Override
+  protected void resumeInternal() {
+
+  }
+
+  @Override
+  protected void pauseInternal() {
+
+  }
+
+  @Override
+  protected void destroyInternal() {
+    if (null != disposable) {
+      disposable.dispose();
+      disposable = null;
+    }
+  }
+
+  @Override
+  public void onResult(Event event) throws Throwable {
+
+  }
+
+  @Override
+  public boolean onBackPressed() {
+    onCommand(new ActivityChangeCommand(ScreenID.ACTIVITY_MAIN, ScreenID.DIRECTION_BACK));
+    return true;
+  }
+
+  @Override
+  protected void onEventInternal(Event event) {
+    switch (event.getEventId()) {
+      case Event.SUCCESS:
+        String pin = event.getString();
+        Log.i("APP# PinResetPresenter | onEventInternal", "|" + pin);
+        model.savePin(pin);
+        onCommand(new ActivityChangeCommand(ScreenID.ACTIVITY_MAIN, ScreenID.DIRECTION_NEXT));
+        break;
+      default:
+        break;
+    }
+  }
+}

+ 2 - 2
app/src/main/java/kr/co/zumo/app/lifeplus/view/presenter/signup/SignUpPinPresenter.java

@@ -109,7 +109,7 @@ public class SignUpPinPresenter extends Presenter<SignUpModel, ISignUpPinView> {
         // 일치 하지 않으면 5회 재시도 후
         if (++matchCount < 5) {
           view.updateGuideTextColor(ResourceUtil.getColor(R.color.CF12815));
-          view.updateGuideText(String.format(ResourceUtil.getString(R.string.sign_up_register_pin_error), matchCount));
+          view.updateGuideText(String.format(ResourceUtil.getString(R.string.pin_miss_match_error_repeat), matchCount));
           view.updateTitleText(R.string.sign_up_register_pin_title);
           view.restart();
         }
@@ -119,7 +119,7 @@ public class SignUpPinPresenter extends Presenter<SignUpModel, ISignUpPinView> {
           - 입력값 초기화된 상태로 STEP1로 변경
            */
           view.updateGuideTextColor(ResourceUtil.getColor(R.color.CF12815));
-          view.updateGuideText(R.string.sign_up_register_pin_init);
+          view.updateGuideText(R.string.pin_miss_match_init);
           view.updateTitleText(R.string.sign_up_register_pin_title);
 
           view.setDisabled();

+ 3 - 3
app/src/main/res/layout/fragment_pin.xml

@@ -107,10 +107,10 @@
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_gravity="right"
-      android:layout_marginRight="24dp"
-      android:gravity="end"
+      android:layout_marginEnd="18dp"
       android:lineSpacingExtra="3sp"
-      android:text="@string/sign_up_pin_code_reset"
+      android:padding="6dp"
+      android:text="@string/pin_code_reset_underline"
       android:textColor="@color/C666666"
       android:textSize="12sp"
       />

+ 1 - 1
app/src/main/res/layout/fragment_sign_up_current_user.xml

@@ -51,7 +51,7 @@
       android:layout_marginRight="7dp"
       android:background="@drawable/sign_up_button"
       android:lineSpacingExtra="3sp"
-      android:text="@string/sign_up_pin_code_reset"
+      android:text="@string/pin_code_reset_underline"
       android:textColor="#000000"
       android:textSize="12sp"
       />

+ 7 - 3
app/src/main/res/values/strings.xml

@@ -93,8 +93,6 @@
 
   <string name="sign_up_password">Lifeplus에 사용할 간편 암호를 등록해주세요.</string>
   <string name="sign_up_register_pin">등록하실 간편암호 4자리를 입력해주세요.</string>
-  <string name="sign_up_register_pin_error">간편암호가 일치하지 않습니다. 다시 입력해주세요.(%d/5)</string>
-  <string name="sign_up_register_pin_init">간편암호가 5회이상 일치하지 않아, 입력값이 초기화됩니다.</string>
   <string name="sign_up_register_pin_title">간편암호 등록</string>
   <string name="sign_up_register_pin_again">확인을 위해 간편암호 4자리를 재입력해주세요.</string>
   <string name="sign_up_register_pin_again_title">간편암호 재확인</string>
@@ -105,7 +103,12 @@
 
   <string name="login_input_pin">간편암호 4자리를 입력해주세요.</string>
   <string name="login_input_pin_title">간편암호 입력</string>
-  <string name="sign_up_pin_code_reset"><u>간편암호 재설정</u></string>
+  <string name="pin_code_reset_underline"><u>간편암호 재설정</u></string>
+  <string name="pin_code_reset">간편암호 재설정</string>
+  <string name="pin_code_reset_message">사용하실 간편암호 4자리를 입력해주세요.</string>
+  <string name="pin_code_again_message">확인을 위해 한번 더 입력해주세요.</string>
+  <string name="pin_miss_match_error_repeat">간편암호가 일치하지 않습니다. 다시 입력해주세요.(%d/5)</string>
+  <string name="pin_miss_match_init">간편암호가 5회이상 일치하지 않아, 입력값이 초기화됩니다.</string>
 
   <string name="sign_up_shuffle">재배열</string>
 
@@ -178,5 +181,6 @@
 
   <!-- 임의 추가 문자열 -->
   <string name="undefined_error">알 수 없는 에러</string>
+  <string name="pin_miss_match_error">간편암호가 일치하지 않습니다.</string>
 
 </resources>