Forráskód Böngészése

[설정][New] 비밀번호 변경 UI 완료
- API 연동 필요

hyodong.min 6 éve
szülő
commit
408ffc9c93

+ 4 - 2
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/setting/member/ISettingMemberPasswordView.java

@@ -25,7 +25,9 @@ interface ISettingMemberPasswordView extends IView {
 
   void setValidationPasswordNew(String str);
 
-  void setVisibleValidationPasswordNewAgain(boolean visible);
+  void setVisibleValidationPasswordAgain(boolean visible);
 
-  void setValidationPasswordNewAgain(String str);
+  void setValidationPasswordAgain(String str);
+
+  void setEnabledChangeButton(boolean enable);
 }

+ 21 - 7
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/setting/member/SettingMemberPasswordFragment.java

@@ -4,6 +4,7 @@
 package kr.co.zumo.app.lifeplus.view.screen.setting.member;
 
 import android.os.Bundle;
+import android.os.Handler;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 import android.text.InputFilter;
@@ -37,6 +38,7 @@ public class SettingMemberPasswordFragment extends FragmentBase<SettingMemberPas
   private TextView textValidationNew;
   private EditText editPasswordNewAgain;
   private TextView textValidationNewAgain;
+  private View buttonChange;
 
   @Override
   protected View onAfterCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
@@ -51,11 +53,20 @@ public class SettingMemberPasswordFragment extends FragmentBase<SettingMemberPas
     textValidationNew = findViewById(R.id.text_password_new_validation);
     editPasswordNewAgain = findViewById(R.id.edit_password_new_again);
     textValidationNewAgain = findViewById(R.id.text_password_new_again_validation);
+    buttonChange = findViewById(R.id.button_registering);
 
     editPasswordCurrent.setFilters(new InputFilter[]{(source, start, end, dest, dstart, dend) -> {
       return presenter.onFilterPasswordCurrent(source, start, end, dest, dstart, dend);
     }});
 
+    editPasswordNew.setFilters(new InputFilter[]{(source, start, end, dest, dstart, dend) -> {
+      return presenter.onFilterPasswordNew(source, start, end, dest, dstart, dend);
+    }});
+
+    editPasswordNewAgain.setFilters(new InputFilter[]{(source, start, end, dest, dstart, dend) -> {
+      return presenter.onFilterPasswordAgain(source, start, end, dest, dstart, dend);
+    }});
+
     editPasswordCurrent.addTextChangedListener(new SimpleTextWatcher() {
       @Override
       public void onTextChanged(CharSequence s, int start, int before, int count) {
@@ -71,13 +82,11 @@ public class SettingMemberPasswordFragment extends FragmentBase<SettingMemberPas
     editPasswordNewAgain.addTextChangedListener(new SimpleTextWatcher() {
       @Override
       public void onTextChanged(CharSequence s, int start, int before, int count) {
-        presenter.onInputPasswordNewAgain(s);
+        presenter.onInputPasswordAgain(s);
       }
     });
 
-    setVisibleValidationPasswordCurrent(false);
-    setVisibleValidationPasswordNew(false);
-    setVisibleValidationPasswordNewAgain(false);
+    buttonChange.setOnClickListener(v -> presenter.onClickChange());
   }
 
   @Override
@@ -102,7 +111,7 @@ public class SettingMemberPasswordFragment extends FragmentBase<SettingMemberPas
     super.onResume();
 
     editPasswordCurrent.requestFocus();
-    SoftKeyboardUtil.showKeyboard(getActivity());
+    new Handler().postDelayed(() -> SoftKeyboardUtil.showKeyboard(getActivity()), 300);
   }
 
   @Override
@@ -136,12 +145,17 @@ public class SettingMemberPasswordFragment extends FragmentBase<SettingMemberPas
   }
 
   @Override
-  public void setVisibleValidationPasswordNewAgain(boolean visible) {
+  public void setVisibleValidationPasswordAgain(boolean visible) {
     textValidationNewAgain.setVisibility(visible ? View.VISIBLE : View.GONE);
   }
 
   @Override
-  public void setValidationPasswordNewAgain(String str) {
+  public void setValidationPasswordAgain(String str) {
     textValidationNewAgain.setText(str);
   }
+
+  @Override
+  public void setEnabledChangeButton(boolean enable) {
+    buttonChange.setEnabled(enable);
+  }
 }

+ 169 - 6
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/setting/member/SettingMemberPasswordModel.java

@@ -5,7 +5,6 @@ package kr.co.zumo.app.lifeplus.view.screen.setting.member;
 
 import android.content.Context;
 import android.text.Spanned;
-import android.util.Log;
 
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -14,6 +13,7 @@ import kr.co.zumo.app.R;
 import kr.co.zumo.app.lifeplus.application.App;
 import kr.co.zumo.app.lifeplus.model.Model;
 import kr.co.zumo.app.lifeplus.util.StringUtil;
+import kr.co.zumo.app.lifeplus.view.Event;
 
 /**
  * SettingMemberPasswordModel
@@ -27,7 +27,9 @@ import kr.co.zumo.app.lifeplus.util.StringUtil;
  */
 public class SettingMemberPasswordModel extends Model {
 
-  private String passwordCurrent;
+  private String passwordCurrent = "";
+  private String passwordNew = "";
+  private String passwordAgain = "";
 
   @Override
   protected void createViewInternal() {
@@ -64,6 +66,18 @@ public class SettingMemberPasswordModel extends Model {
 
   }
 
+  public String getPasswordCurrent() {
+    return passwordCurrent;
+  }
+
+  public String getPasswordNew() {
+    return passwordNew;
+  }
+
+  public String getPasswordAgain() {
+    return passwordAgain;
+  }
+
   /**
    * 현재 패스워드 저장, 유효성 체크 후 저장함.
    *
@@ -77,7 +91,20 @@ public class SettingMemberPasswordModel extends Model {
   }
 
   /**
-   * 패스워드 전체로 검사
+   * 새 패스워드 저장
+   *
+   * @param password
+   */
+  public void setPasswordNew(String password) {
+    if (null == password) {
+      password = "";
+    }
+    this.passwordNew = password;
+
+  }
+
+  /**
+   * 현재 패스워드 전체로 검사
    *
    * @param password
    * @return
@@ -87,7 +114,7 @@ public class SettingMemberPasswordModel extends Model {
   }
 
   /**
-   * 입력 된 문자(열)로 검사
+   * 현재 패스워드 입력 된 문자(열)로 검사
    *
    * @param source
    * @param start
@@ -135,12 +162,128 @@ public class SettingMemberPasswordModel extends Model {
     return result;
   }
 
+  /**
+   * 새 패스워드 전체로 검사
+   *
+   * @param password
+   * @return
+   */
+  public int verifyPasswordNew(String password) {
+    return verifyPasswordNewInternal(password);
+  }
+
+  /**
+   * 새 패스워드 입력 된 문자(열)로 검사
+   *
+   * @param source
+   * @param start
+   * @param end
+   * @param dest
+   * @param dstart
+   * @param dend
+   * @return
+   */
+  public int verifyInputPasswordNew(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
+    if (checkEmoticon(source, start, end)) {
+      return VerifierPassword.FAIL_EMOTICON;
+    }
+
+    return VerifierPassword.OK;
+  }
+
+  private int verifyPasswordNewInternal(String password) {
+    int result;
+    int len = password.length();
+    if (len == 0) {
+      // 아무런 입력이 없음
+      result = VerifierPassword.READY;
+    }
+    else if (password.equals(getUserEmail())) {
+      // 이메일과 같은 암호
+      result = VerifierPassword.FAIL_MATCH_EMAIL;
+    }
+    else if (password.equals(passwordCurrent)) {
+      // 현재 입력된 비밀번호 같은 암호
+      result = VerifierPassword.FAIL_MISS_MATCH_CURRENT;
+    }
+    else if (isContinuous(App.getInstance().getContext(), password)) {
+      // 4자 연속, 1234, abcd
+      result = VerifierPassword.FAIL_4_STRAIGHT;
+    }
+    else if (false == StringUtil.isValidPassword(password)) {
+      // 영문자숫자특문 조합
+      result = VerifierPassword.FAIL_MIX;
+    }
+    else if (len < 10) {
+      // 10자 미만 입력
+      result = VerifierPassword.FAIL_LESS;
+    }
+    else {
+      // 통과
+      result = VerifierPassword.OK;
+    }
+    return result;
+  }
+
+  /**
+   * 확인 패스워드 저장
+   *
+   * @param password
+   */
+  public void setPasswordAgain(String password) {
+    if (null == password) {
+      password = "";
+    }
+    this.passwordAgain = password;
+  }
+
+  /**
+   * 확인 패스워드 전체로 검사
+   *
+   * @param password
+   * @return
+   */
+  public int verifyPasswordAgain(String password) {
+    return verifyPasswordAgainInternal(password);
+  }
+
+  /**
+   * 확인 패스워드 입력 된 문자(열)로 검사
+   *
+   * @param source
+   * @param start
+   * @param end
+   * @param dest
+   * @param dstart
+   * @param dend
+   * @return
+   */
+  public int verifyInputPasswordAgain(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
+    if (checkEmoticon(source, start, end)) {
+      return VerifierPassword.FAIL_EMOTICON;
+    }
+
+    return VerifierPassword.OK;
+  }
+
+  private int verifyPasswordAgainInternal(String password) {
+    // 입력 시 체크는 새 비번과 같음
+    return verifyPasswordNewInternal(password);
+  }
+
+  /**
+   * 이모티콘 문자 확인
+   *
+   * @param source
+   * @param start
+   * @param end
+   * @return
+   */
   private boolean checkEmoticon(CharSequence source, int start, int end) {
     // 이모티콘
-    for (int i = start; i < end; i++) {
+    for (int i = start; i < end; ++i) {
       Pattern unicodeOutliers = Pattern.compile("[\\uD83C-\\uDBFF\\uDC00-\\uDFFF]+");
       Matcher matcher = unicodeOutliers.matcher(source);
-      Log.d("APP# SettingMemberPasswordModel | verifyPasswordCurrent", "|" + matcher.matches());
       if (matcher.matches()) {
         return true;
       }
@@ -148,6 +291,14 @@ public class SettingMemberPasswordModel extends Model {
     return false;
   }
 
+  /**
+   * 연속된 4개의 문자/숫자열인지 확인
+   * - abcd, 1234, 5678 ...
+   *
+   * @param context
+   * @param str
+   * @return
+   */
   private boolean isContinuous(Context context, String str) {
     if (StringUtil.isEmpty(str)) {
       return true;
@@ -170,4 +321,16 @@ public class SettingMemberPasswordModel extends Model {
 
     return false;
   }
+
+  /**
+   * 입력된 새 비번이 서로 같은지 확인
+   */
+  public boolean isMatchNewPassword() {
+    return passwordNew.equals(passwordAgain);
+  }
+
+  public void updatePassword() {
+    // todo api update password
+    onResult(new Event.Builder(Event.RESULT).build());
+  }
 }

+ 164 - 9
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/setting/member/SettingMemberPasswordPresenter.java

@@ -4,7 +4,6 @@
 package kr.co.zumo.app.lifeplus.view.screen.setting.member;
 
 import android.text.Spanned;
-import android.util.Log;
 
 import kr.co.zumo.app.R;
 import kr.co.zumo.app.lifeplus.model.verify.Verifier;
@@ -75,28 +74,44 @@ public class SettingMemberPasswordPresenter extends Presenter<SettingMemberPassw
 
   @Override
   public void onScreenReady() {
-
+    view.setEnabledChangeButton(false);
+    view.setVisibleValidationPasswordCurrent(false);
+    view.setVisibleValidationPasswordNew(false);
+    view.setVisibleValidationPasswordAgain(false);
   }
 
   @Override
   public void onResult(Event event) {
+    switch (event.getEventId()) {
+      case Event.RESULT:
+        back();
+        break;
+      case Event.ERROR:
+        showErrorDialog(event.getString());
+        break;
+      default:
+        break;
+    }
+  }
 
+  private void setEnabledChangeButton(int currentValid, int newValid, int againValid) {
+    view.setEnabledChangeButton(Verifier.isOk(currentValid) && Verifier.isOk(newValid) && Verifier.isOk(againValid));
   }
 
   /**
    * 전체 패스워드
    *
-   * @param s
+   * @param sequence
    */
-  public void onInputPasswordCurrent(CharSequence s) {
-    Log.d("APP# SettingMemberPasswordPresenter | onInputPasswordCurrent", "| input => " + s.toString());
-    String password = s.toString();
+  public void onInputPasswordCurrent(CharSequence sequence) {
+    String password = sequence.toString();
     int result = verifyPasswordCurrent(password);
-    Log.d("APP# SettingMemberPasswordPresenter | onInputPasswordCurrent", "|" + " result: " + result);
 
     if (Verifier.isOk(result)) {
       model.setPasswordCurrent(password);
     }
+
+    setEnabledChangeButton(result, verifyPasswordNew(model.getPasswordNew()), verifyPasswordAgain(model.getPasswordAgain()));
   }
 
   /**
@@ -111,7 +126,6 @@ public class SettingMemberPasswordPresenter extends Presenter<SettingMemberPassw
    * @return
    */
   public CharSequence onFilterPasswordCurrent(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
-    Log.d("APP# SettingMemberPasswordPresenter | onFilterPasswordCurrent", "| filter: " + source.toString());
     int result = model.verifyInputPasswordCurrent(source, start, end, dest, dstart, dend);
     if (Verifier.isOk(result)) {
       return null;
@@ -163,10 +177,151 @@ public class SettingMemberPasswordPresenter extends Presenter<SettingMemberPassw
   }
 
   public void onInputPasswordNew(CharSequence sequence) {
+    String password = sequence.toString();
+    int result = verifyPasswordNew(password);
 
+    if (Verifier.isOk(result)) {
+      model.setPasswordNew(password);
+    }
+    setEnabledChangeButton(verifyPasswordCurrent(model.getPasswordCurrent()), result, verifyPasswordAgain(model.getPasswordAgain()));
+  }
+
+  public CharSequence onFilterPasswordNew(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
+    int result = model.verifyInputPasswordNew(source, start, end, dest, dstart, dend);
+    if (Verifier.isOk(result)) {
+      return null;
+    }
+    else {
+      if (result == VerifierPassword.FAIL_EMOTICON) {
+        // 이모티콘 사용 불가
+        view.setVisibleValidationPasswordNew(true);
+        view.setValidationPasswordNew(ResourceUtil.getString(R.string.setting_password_current_validation_emoticon));
+      }
+      return "";
+    }
   }
 
-  public void onInputPasswordNewAgain(CharSequence sequence) {
+  private int verifyPasswordNew(String password) {
+    int verifyResult = model.verifyPasswordNew(password);
+    if (verifyResult == VerifierPassword.READY) {
+      // 아무런 입력이 없음
+      view.setVisibleValidationPasswordNew(false);
+      view.setValidationPasswordNew(ResourceUtil.getString(R.string.empty_string));
+    }
+    else if (verifyResult == VerifierPassword.FAIL_LESS) {
+      // 10자 미만 입력
+      view.setVisibleValidationPasswordNew(true);
+      view.setValidationPasswordNew(ResourceUtil.getString(R.string.setting_password_new_validation_10_character));
+    }
+    else if (verifyResult == VerifierPassword.FAIL_MIX) {
+      // 문자 혼합
+      view.setVisibleValidationPasswordNew(true);
+      view.setValidationPasswordNew(ResourceUtil.getString(R.string.setting_password_new_validation_10_character));
+    }
+    else if (verifyResult == VerifierPassword.FAIL_MATCH_EMAIL) {
+      // 이메일과 같은 암호
+      view.setVisibleValidationPasswordNew(true);
+      view.setValidationPasswordNew(ResourceUtil.getString(R.string.setting_password_new_validation_email));
+    }
+    else if (verifyResult == VerifierPassword.FAIL_MISS_MATCH_CURRENT) {
+      // 현재 비밀번호와 같은 암호
+      view.setVisibleValidationPasswordNew(true);
+      view.setValidationPasswordNew(ResourceUtil.getString(R.string.setting_password_new_validation_match));
+    }
+    else if (verifyResult == VerifierPassword.FAIL_4_STRAIGHT) {
+      // 4자 연속
+      view.setVisibleValidationPasswordNew(true);
+      view.setValidationPasswordNew(ResourceUtil.getString(R.string.setting_password_new_validation_4_straight));
+    }
+    else {
+      // 통과
+      view.setVisibleValidationPasswordNew(false);
+      view.setValidationPasswordNew(ResourceUtil.getString(R.string.empty_string));
+    }
+
+    return verifyResult;
+  }
+
+  public void onInputPasswordAgain(CharSequence sequence) {
+    String password = sequence.toString();
+    int result = verifyPasswordAgain(password);
+    if (Verifier.isOk(result)) {
+      model.setPasswordAgain(password);
+    }
+    setEnabledChangeButton(verifyPasswordCurrent(model.getPasswordCurrent()), verifyPasswordNew(model.getPasswordNew()), result);
+  }
+
+
+  public CharSequence onFilterPasswordAgain(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
+    int result = model.verifyInputPasswordAgain(source, start, end, dest, dstart, dend);
+    if (Verifier.isOk(result)) {
+      return null;
+    }
+    else {
+      if (result == VerifierPassword.FAIL_EMOTICON) {
+        // 이모티콘 사용 불가
+        view.setVisibleValidationPasswordAgain(true);
+        view.setValidationPasswordAgain(ResourceUtil.getString(R.string.setting_password_current_validation_emoticon));
+      }
+      return "";
+    }
+  }
+
+  private int verifyPasswordAgain(String password) {
+    int verifyResult = model.verifyPasswordAgain(password);
+    if (verifyResult == VerifierPassword.READY) {
+      // 아무런 입력이 없음
+      view.setVisibleValidationPasswordAgain(false);
+      view.setValidationPasswordAgain(ResourceUtil.getString(R.string.empty_string));
+    }
+    else if (verifyResult == VerifierPassword.FAIL_LESS) {
+      // 10자 미만 입력
+      view.setVisibleValidationPasswordAgain(true);
+      view.setValidationPasswordAgain(ResourceUtil.getString(R.string.setting_password_new_again_validation_10_character));
+    }
+    else if (verifyResult == VerifierPassword.FAIL_MIX) {
+      // 문자 혼합
+      view.setVisibleValidationPasswordAgain(true);
+      view.setValidationPasswordAgain(ResourceUtil.getString(R.string.setting_password_new_again_validation_10_character));
+    }
+    else if (verifyResult == VerifierPassword.FAIL_MATCH_EMAIL) {
+      // 이메일과 같은 암호
+      view.setVisibleValidationPasswordAgain(true);
+      view.setValidationPasswordAgain(ResourceUtil.getString(R.string.setting_password_new_again_validation_email));
+    }
+    else if (verifyResult == VerifierPassword.FAIL_MISS_MATCH_CURRENT) {
+      // 현재 비밀번호와 같은 암호
+      view.setVisibleValidationPasswordAgain(true);
+      view.setValidationPasswordAgain(ResourceUtil.getString(R.string.setting_password_new_again_validation_match));
+    }
+    else if (verifyResult == VerifierPassword.FAIL_4_STRAIGHT) {
+      // 4자 연속
+      view.setVisibleValidationPasswordAgain(true);
+      view.setValidationPasswordAgain(ResourceUtil.getString(R.string.setting_password_new_again_validation_4_straight));
+    }
+    else {
+      // 통과
+      view.setVisibleValidationPasswordAgain(false);
+      view.setValidationPasswordAgain(ResourceUtil.getString(R.string.empty_string));
+    }
+
+    return verifyResult;
+  }
+
+  /**
+   * 변경 버튼 누름
+   */
+  public void onClickChange() {
+    // 새 비번 둘이 맞는지 확인
+    if (model.isMatchNewPassword()) {
+      model.updatePassword();
+    }
+    else {
+      view.setVisibleValidationPasswordAgain(true);
+      view.setValidationPasswordAgain(ResourceUtil.getString(R.string.setting_password_new_again_validation_miss_match));
+    }
+
+    // todo api 통신 후 패스워드 변경됐는지 확인
 
   }
 }