瀏覽代碼

[설정][Bug] 코드 입력 유효성 검사 방식 수정. 추천인 코드 입력 후 재진입 시 반영. 오류 시 기입력 추천인 코드가 활성화되는 버그 수정

hyodong.min 6 年之前
父節點
當前提交
2475c0d41c

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

@@ -101,6 +101,17 @@ public class MemberInfoModelHelper {
     return disposableLoading;
   }
 
+  /**
+   * 추천인 코드 갱신
+   *
+   * @param code
+   */
+  public void setRecommendCode(String code) {
+    if(null != settingMemberBean) {
+      settingMemberBean.setRecommendCode(code);
+    }
+  }
+
 
   private void stopLoading() {
     if (null != disposableLoading) {

+ 0 - 54
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/setting/SettingModel.java

@@ -99,60 +99,6 @@ public class SettingModel extends Model {
     return holderIndex;
   }
 
-  /**
-   * 추천인 이름
-   * - 코드 등록 토스트에 사용
-   *
-   * @return
-   */
-  public String getRecommendName() {
-    return SettingModelHelper.getInstance().getRecommendName();
-  }
-
-  /**
-   * 추천인 이름 제거
-   * - 토스트 표시 후 제거해줌
-   */
-  public void clearRecommendName() {
-    SettingModelHelper.getInstance().setRecommendName("");
-  }
-
-  /**
-   * 스페셜 코드 타입
-   * - 코드 등록 토스트에 사용
-   *
-   * @return
-   */
-  public String getSpecialCodeType() {
-    return SettingModelHelper.getInstance().getSpecialCodeType();
-  }
-
-  /**
-   * 스페셜 코드 제거
-   * - 토스트 표시 후 제거해줌
-   */
-  public void clearSpecialCodeType() {
-    SettingModelHelper.getInstance().setSpecialCodeType("");
-  }
-
-  /**
-   * 지급된 코인
-   * - 코드 등록 토스트에 사용
-   *
-   * @return
-   */
-  public int getIncreasedCoin() {
-    return SettingModelHelper.getInstance().getIncreasedCoin();
-  }
-
-  /**
-   * 코인 제거
-   * - 토스트 표시 후 제거해줌
-   */
-  public void clearIncreasedCoin() {
-    SettingModelHelper.getInstance().setIncreasedCoin(0);
-  }
-
   /**
    * 설정 기본 정보 로딩
    */

+ 0 - 25
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/setting/SettingPresenter.java

@@ -105,32 +105,7 @@ public class SettingPresenter extends Presenter<SettingModel, ISettingView> {
 
   @Override
   protected void resumeInternal() {
-    /*
-      - 스페셜 코드가 있으면 팝업
-      - 추천인 이름이 있으면 팝업 (코인 표시)
-     */
-    if (StringUtil.isFull(model.getSpecialCodeType())) {
-      showCustomToast(
-        ResourceUtil.getString(R.string.special_code_confirm_success),
-        String.format(ResourceUtil.getString(R.string.special_code_confirm_success_detail), model.getSpecialCodeType()),
-        0,
-        Toast.LENGTH_LONG
-      );
-
-      model.clearSpecialCodeType();
-    }
-
-    if (StringUtil.isFull(model.getRecommendName())) {
-      showCustomToast(
-        ResourceUtil.getString(R.string.recommend_special_code_confirm_success),
-        String.format(ResourceUtil.getString(R.string.recommend_confirm_success_detail), model.getRecommendName(), model.getIncreasedCoin()),
-        0,
-        Toast.LENGTH_LONG
-      );
 
-      model.clearRecommendName();
-      model.clearIncreasedCoin();
-    }
   }
 
   @Override

+ 12 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/setting/code/ISettingCodeView.java

@@ -80,4 +80,16 @@ public interface ISettingCodeView extends IView {
    * @param string
    */
   void setRecommendString(String string);
+
+  /**
+   * text watcher 등록
+   * - setText() 를 실행하면 와쳐가 실행되서 오작동하므로 수시로 등록/해제를 할 수 있다.
+   */
+  void addTextWatcher();
+
+  /**
+   * text watcher 해제
+   * - setText() 를 실행하면 와쳐가 실행되서 오작동하므로 수시로 등록/해제를 할 수 있다.
+   */
+  void removeTextWatcher();
 }

+ 18 - 2
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/setting/code/SettingCodeFragment.java

@@ -6,6 +6,8 @@ package kr.co.zumo.app.lifeplus.view.screen.setting.code;
 import android.os.Bundle;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
+import android.text.TextWatcher;
+import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
@@ -38,6 +40,7 @@ public class SettingCodeFragment extends FragmentBase<SettingCodePresenter> impl
   private TextView textRecommendValidation;
   private TextView textSpecialLabel;
   private View buttonRegistering;
+  private TextWatcher editWatcher;
 
   @Override
   protected View onAfterCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
@@ -73,12 +76,13 @@ public class SettingCodeFragment extends FragmentBase<SettingCodePresenter> impl
         presenter.onInputSpecialCode(2, s);
       }
     });
-    editRecommend.addTextChangedListener(new SimpleTextWatcher() {
+    editWatcher = new SimpleTextWatcher() {
       @Override
       public void onTextChanged(CharSequence s, int start, int before, int count) {
         presenter.onInputRecommendCode(s);
       }
-    });
+    };
+    editRecommend.addTextChangedListener(editWatcher);
     buttonRegistering.setOnClickListener(v -> presenter.onClickRegisteringButton());
 
   }
@@ -117,6 +121,7 @@ public class SettingCodeFragment extends FragmentBase<SettingCodePresenter> impl
    ***********************************/
   @Override
   public void setValidationSpecialCode(String string) {
+    Log.d("APP# SettingCodeFragment | setValidationSpecialCode", "|" + "string : " + string);
     textSpecialValidation.setText(StringUtil.fromHtml(string));
   }
 
@@ -179,4 +184,15 @@ public class SettingCodeFragment extends FragmentBase<SettingCodePresenter> impl
   public void setRecommendString(String string) {
     editRecommend.setText(string);
   }
+
+  @Override
+  public void addTextWatcher() {
+    removeTextWatcher();
+    editRecommend.addTextChangedListener(editWatcher);
+  }
+
+  @Override
+  public void removeTextWatcher() {
+    editRecommend.removeTextChangedListener(editWatcher);
+  }
 }

+ 56 - 9
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/setting/code/SettingCodeModel.java

@@ -158,15 +158,6 @@ public class SettingCodeModel extends CoinModel {
     return loadedRecommendCode;
   }
 
-  /**
-   * 스페셜 코드 타입
-   *
-   * @return
-   */
-  public String getSpecialCodeType() {
-    return SettingModelHelper.getInstance().getSpecialCodeType();
-  }
-
   /**
    * 등록한 스페셜 코드가 있는지 확인
    *
@@ -278,6 +269,7 @@ public class SettingCodeModel extends CoinModel {
 
         if (Verifier.isOk(verifyRecommendCodeInternal(recommendCode))) {
           SettingModelHelper.getInstance().setRecommendCode(recommendCode);
+          MemberInfoModelHelper.getInstance().setRecommendCode(recommendCode);
           codeResult[CODE_RECOMMEND_RESULT_INDEX] = true;
         }
 
@@ -369,4 +361,59 @@ public class SettingCodeModel extends CoinModel {
   public boolean isRegistered() {
     return isRegistered;
   }
+
+  /**
+   * 추천인 이름
+   * - 코드 등록 토스트에 사용
+   *
+   * @return
+   */
+  public String getRecommendName() {
+    return SettingModelHelper.getInstance().getRecommendName();
+  }
+
+  /**
+   * 추천인 이름 제거
+   * - 토스트 표시 후 제거해줌
+   */
+  public void clearRecommendName() {
+    SettingModelHelper.getInstance().setRecommendName("");
+  }
+
+  /**
+   * 스페셜 코드 타입
+   * - 코드 등록 토스트에 사용
+   *
+   * @return
+   */
+  public String getSpecialCodeType() {
+    return SettingModelHelper.getInstance().getSpecialCodeType();
+  }
+
+  /**
+   * 스페셜 코드 제거
+   * - 토스트 표시 후 제거해줌
+   */
+  public void clearSpecialCodeType() {
+    SettingModelHelper.getInstance().setSpecialCodeType("");
+  }
+
+  /**
+   * 지급된 코인
+   * - 코드 등록 토스트에 사용
+   *
+   * @return
+   */
+  public int getIncreasedCoin() {
+    return SettingModelHelper.getInstance().getIncreasedCoin();
+  }
+
+  /**
+   * 코인 제거
+   * - 토스트 표시 후 제거해줌
+   */
+  public void clearIncreasedCoin() {
+    SettingModelHelper.getInstance().setIncreasedCoin(0);
+  }
+
 }

+ 72 - 22
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/setting/code/SettingCodePresenter.java

@@ -3,7 +3,9 @@
  */
 package kr.co.zumo.app.lifeplus.view.screen.setting.code;
 
+import android.support.annotation.Nullable;
 import android.util.Log;
+import android.widget.Toast;
 
 import java.util.Arrays;
 
@@ -13,6 +15,7 @@ import kr.co.zumo.app.lifeplus.util.ResourceUtil;
 import kr.co.zumo.app.lifeplus.util.StringUtil;
 import kr.co.zumo.app.lifeplus.view.DoubleChecker;
 import kr.co.zumo.app.lifeplus.view.Event;
+import kr.co.zumo.app.lifeplus.view.ToastProvider;
 import kr.co.zumo.app.lifeplus.view.presenter.Presenter;
 import kr.co.zumo.app.lifeplus.view.screen.common.CoinPopupDriver;
 
@@ -62,7 +65,6 @@ public class SettingCodePresenter extends Presenter<SettingCodeModel, ISettingCo
 
   @Override
   protected void startInternalOnce() {
-    doubleChecker.checkFirst();
   }
 
   @Override
@@ -103,6 +105,7 @@ public class SettingCodePresenter extends Presenter<SettingCodeModel, ISettingCo
             });
           }
           else {
+            showCodeToast();
             onBackPressed();
           }
         }
@@ -121,6 +124,39 @@ public class SettingCodePresenter extends Presenter<SettingCodeModel, ISettingCo
     }
   }
 
+  private void showCodeToast() {
+    /*
+      - 스페셜 코드가 있으면 팝업
+      - 추천인 이름이 있으면 팝업 (코인 표시)
+     */
+    if (StringUtil.isFull(model.getSpecialCodeType())) {
+      showCustomToast(
+        ResourceUtil.getString(R.string.special_code_confirm_success),
+        String.format(ResourceUtil.getString(R.string.special_code_confirm_success_detail), model.getSpecialCodeType()),
+        0,
+        Toast.LENGTH_LONG
+      );
+
+      model.clearSpecialCodeType();
+    }
+
+    if (StringUtil.isFull(model.getRecommendName())) {
+      showCustomToast(
+        ResourceUtil.getString(R.string.recommend_special_code_confirm_success),
+        String.format(ResourceUtil.getString(R.string.recommend_confirm_success_detail), model.getRecommendName(), model.getIncreasedCoin()),
+        0,
+        Toast.LENGTH_LONG
+      );
+
+      model.clearRecommendName();
+      model.clearIncreasedCoin();
+    }
+  }
+
+  private void showCustomToast(String title, String detail, @Nullable int copyToastFlag, int duration) {
+    ToastProvider.showCodeShare(title, detail, copyToastFlag, duration);
+  }
+
   private void showCoin() {
     boolean[] codeResult = model.getCodeResult();
     int prevCoin = model.getPrevCoin();
@@ -130,8 +166,7 @@ public class SettingCodePresenter extends Presenter<SettingCodeModel, ISettingCo
 
     // 스페셜 코드우선 표시
     if (codeResult[SettingCodeModel.CODE_SPECIAL_RESULT_INDEX]) {
-
-      new CoinPopupDriver(getFragmentManager(), () -> {
+      Runnable listener = () -> {
         // 완료 뒤 추천 코드 있으면 표시
         if (codeResult[SettingCodeModel.CODE_RECOMMEND_RESULT_INDEX]) {
           showRecommendCoin(prevCoin, givenCoin);
@@ -139,7 +174,10 @@ public class SettingCodePresenter extends Presenter<SettingCodeModel, ISettingCo
         else {
           onBackPressed();
         }
-      }, () -> {}).show(prevCoin, model.getGivenCoin(), R.string.coin_special_code_completed);
+      };
+
+      new CoinPopupDriver(getFragmentManager(), listener, listener)
+        .show(prevCoin, model.getGivenCoin(), R.string.coin_special_code_completed);
 
     }
     else if (codeResult[SettingCodeModel.CODE_RECOMMEND_RESULT_INDEX]) {
@@ -153,18 +191,34 @@ public class SettingCodePresenter extends Presenter<SettingCodeModel, ISettingCo
   private void showRecommendCoin(int prevCoin, int givenCoin) {
     new CoinPopupDriver(getFragmentManager(), () -> {
       onBackPressed();
-    }, () -> {}).show(prevCoin, givenCoin, R.string.coin_recommend_code_completed);
+    }, () -> {
+      onBackPressed();
+    }).show(prevCoin, givenCoin, R.string.coin_recommend_code_completed);
   }
 
   private void onInvalidCode(int resultIndex) {
+
     if (resultIndex == Event.CODE_INVALID_SPECIAL_CODE) {
       view.setValidationSpecialCode(ResourceUtil.getString(R.string.special_code_error));
     }
     else if (resultIndex == Event.CODE_INVALID_RECOMMEND_CODE) {
-      view.setValidationSpecialCode(ResourceUtil.getString(R.string.recommend_code_error));
+      view.setValidationRecommendCode(ResourceUtil.getString(R.string.recommend_code_error));
     }
 
     view.setEnabledAll(true);
+
+    // 추천인 코드가 있으면 추천인 입력창 비활성
+    if (model.hasRecommendCodeRegistered()) {
+      setLoadedRecommendCode();
+    }
+  }
+
+  private void setLoadedRecommendCode() {
+    view.removeTextWatcher();
+    view.setRecommendString(model.getLoadedRecommendCode());
+    view.setRecommendInputEnabled(false);
+    view.setValidationRecommendCode(ResourceUtil.getString(R.string.recommend_code_only_one_time));
+    view.addTextWatcher();
   }
 
   private void render() {
@@ -186,9 +240,7 @@ public class SettingCodePresenter extends Presenter<SettingCodeModel, ISettingCo
 
     // 추천인 코드가 있으면 추천인 입력창 비활성
     if (model.hasRecommendCodeRegistered()) {
-      view.setRecommendString(model.getLoadedRecommendCode());
-      view.setRecommendInputEnabled(false);
-      view.setValidationRecommendCode(ResourceUtil.getString(R.string.recommend_code_only_one_time));
+      setLoadedRecommendCode();
     }
     else {
       view.setRecommendInputEnabled(true);
@@ -242,11 +294,6 @@ public class SettingCodePresenter extends Presenter<SettingCodeModel, ISettingCo
       view.setRegisteringButtonEnabled(false);
     }
     else {
-      // 스페셜 코드 검증은 '등록' 버튼을 누를 때만 한다.
-      if (model.verifySpecialCode() != Verifier.READY) {
-        // 입력을 한 상태라면 등록 가능
-        hasSpecialCode = true;
-      }
       if (hasSpecialCode || hasRecommendCode) {
         view.setRegisteringButtonEnabled(true);
       }
@@ -263,10 +310,11 @@ public class SettingCodePresenter extends Presenter<SettingCodeModel, ISettingCo
       view.setValidationSpecialCode(ResourceUtil.getString(R.string.special_code_input));
     }
     else if (verifyResult == Verifier.FAIL_LESS || verifyResult == Verifier.FAIL_OVER) {
-      if (isDisplayFailMessage) {
-        view.setValidationSpecialCode(ResourceUtil.getString(R.string.special_code_input_need_12_characters));
-      }
-      else {
+//      if (isDisplayFailMessage) {
+//        view.setValidationSpecialCode(ResourceUtil.getString(R.string.special_code_input_need_12_characters));
+//      }
+//      else
+      {
         view.setValidationSpecialCode(ResourceUtil.getString(R.string.empty_string));
       }
     }
@@ -290,10 +338,11 @@ public class SettingCodePresenter extends Presenter<SettingCodeModel, ISettingCo
         view.setValidationRecommendCode(ResourceUtil.getString(R.string.recommend_code_input));
       }
       else if (verifyResult == Verifier.FAIL_LESS || verifyResult == Verifier.FAIL_OVER) {
-        if (isDisplayFailMessage) {
-          view.setValidationRecommendCode(ResourceUtil.getString(R.string.recommend_code_input_need_5_characters));
-        }
-        else {
+//        if (isDisplayFailMessage) {
+//          view.setValidationRecommendCode(ResourceUtil.getString(R.string.recommend_code_input_need_5_characters));
+//        }
+//        else
+        {
           view.setValidationRecommendCode(ResourceUtil.getString(R.string.empty_string));
         }
       }
@@ -346,5 +395,6 @@ public class SettingCodePresenter extends Presenter<SettingCodeModel, ISettingCo
 
   @Override
   public void onScreenReady() {
+    doubleChecker.checkFirst();
   }
 }

+ 1 - 1
app/src/sandbox/java/kr/co/zumo/app/lifeplus/network/api/LifeplusAPIService.java

@@ -662,7 +662,7 @@ public class LifeplusAPIService implements LifeplusAPI {
   @Override
   public Single<MemberCodeResultBean> setMemberCode(MemberCodeRequestBean bean) {
     return Single.fromCallable(() -> {
-      String result = "{\"data\":{\"coin\":3000},\"sp_rtn\":\"0\"}";
+      String result = "{\"data\":{\"coin\":3000},\"sp_rtn\":\"-500\"}";
 
       return new Gson().fromJson(result, MemberCodeResultBean.class);
     });