Explorar o código

[로그인][New] 휴면 회원 처리: API 연동

hyodong.min %!s(int64=7) %!d(string=hai) anos
pai
achega
9e193d7509

+ 2 - 2
app/src/common/java/kr/co/zumo/app/lifeplus/network/NetworkWatcher.java

@@ -41,7 +41,7 @@ public class NetworkWatcher {
    * @param networkStatus NetworkStatus
    * @return rx Single with Boolean
    */
-  private static Single<Boolean> check(NetworkStatus networkStatus) {
+  public static Single<Boolean> check(NetworkStatus networkStatus) {
     Single<Boolean> single;
 
     boolean isConnected = networkStatus.isConnected();
@@ -83,7 +83,7 @@ public class NetworkWatcher {
    * @param internet
    * @return rx Observable with Boolean
    */
-  private static Observable<Boolean> watch(Observable<Boolean> network, Observable<Boolean> internet) {
+  public static Observable<Boolean> watch(Observable<Boolean> network, Observable<Boolean> internet) {
     /**
      * 두 객체의 결과를 조합하여 변화가 있을 때만 발행함.
      */

+ 12 - 0
app/src/common/java/kr/co/zumo/app/lifeplus/network/api/LifeplusAPIService.java

@@ -144,4 +144,16 @@ public class LifeplusAPIService extends RetrofitService implements LifeplusAPI {
     mapBasicParameter(bean);
     return api(AUTH_URL).selectMember(bean);
   }
+
+  /**
+   * 회원 잠금 해제
+   *
+   * @param bean
+   * @return
+   */
+  @Override
+  public Single<LifeplusAPIBean> activeMember(RequestBean bean) {
+    mapBasicParameter(bean);
+    return api(AUTH_URL).activeMember(bean);
+  }
 }

+ 11 - 4
app/src/main/java/kr/co/zumo/app/lifeplus/activity/ActivityStarter.java

@@ -97,12 +97,19 @@ public class ActivityStarter {
             else {
               if (loginBean.getBlockStatus().equals(LoginBean.LOCK_STATUS_BLOCK)) {
                 // 블럭 계정
-                SuperModel.getInstance().setBlockMember(SuperModel.MEMBER_STATUS_BLOCK);
-                gotoScreen(BlockMemberActivity.class);
+                SuperModel.getInstance().addMemberStatus(SuperModel.MEMBER_STATUS_BIT_BLOCK);
               }
-              else if (loginBean.getMemberStatus().equals(LoginBean.USER_STATUS_REST)) {
+
+              if (loginBean.getMemberStatus().equals(LoginBean.USER_STATUS_REST)) {
                 // 휴면 계정
-                SuperModel.getInstance().setBlockMember(SuperModel.MEMBER_STATUS_REST);
+                SuperModel.getInstance().addMemberStatus(SuperModel.MEMBER_STATUS_BIT_REST);
+              }
+
+              if (SuperModel.getInstance().isBlockMember()) {
+                gotoScreen(BlockMemberActivity.class);
+
+              }
+              else if (SuperModel.getInstance().isRestMember()) {
                 gotoScreen(RestMemberActivity.class);
               }
             }

+ 6 - 5
app/src/main/java/kr/co/zumo/app/lifeplus/activity/MainActivity.java

@@ -88,14 +88,15 @@ public class MainActivity extends ActivityBase<MainPresenter> implements IMainVi
     render();
 
     TextView textView = findViewById(R.id.text_member_status);
-    String memberStatus = null;
-    if (SuperModel.getInstance().getMemberStatus() == SuperModel.MEMBER_STATUS_BLOCK) {
+    String memberStatus = "";
+    if (SuperModel.getInstance().isBlockMember()) {
       memberStatus = "Blocked";
     }
-    else if (SuperModel.getInstance().getMemberStatus() == SuperModel.MEMBER_STATUS_REST) {
-      memberStatus = "Inactive";
+
+    if (SuperModel.getInstance().isRestMember()) {
+      memberStatus += "Inactive";
     }
-    if (null != memberStatus) {
+    if (StringUtil.isFull(memberStatus)) {
       textView.setText("Member status: " + memberStatus);
     }
   }

+ 2 - 2
app/src/main/java/kr/co/zumo/app/lifeplus/activity/RestMemberActivity.java

@@ -7,7 +7,7 @@ import android.os.Bundle;
 
 import kr.co.zumo.app.R;
 import kr.co.zumo.app.lifeplus.manager.ActionBarManager;
-import kr.co.zumo.app.lifeplus.model.BlankModel;
+import kr.co.zumo.app.lifeplus.model.RestMemberModel;
 import kr.co.zumo.app.lifeplus.view.Event;
 import kr.co.zumo.app.lifeplus.view.IView;
 import kr.co.zumo.app.lifeplus.view.presenter.RestMemberPresenter;
@@ -52,6 +52,6 @@ public class RestMemberActivity extends ActivityBase<RestMemberPresenter> implem
 
   @Override
   RestMemberPresenter definePresenter() {
-    return new RestMemberPresenter(getModel(BlankModel.class), this);
+    return new RestMemberPresenter(getModel(RestMemberModel.class), this);
   }
 }

+ 74 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/model/RestMemberModel.java

@@ -0,0 +1,74 @@
+/*
+ * COPYRIGHT (c) 2018 All rights reserved by HANWHA LIFE.
+ */
+package kr.co.zumo.app.lifeplus.model;
+
+import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.disposables.Disposable;
+import io.reactivex.schedulers.Schedulers;
+import kr.co.zumo.app.lifeplus.bean.api.RequestBean;
+import kr.co.zumo.app.lifeplus.network.api.LifeplusAPIService;
+import kr.co.zumo.app.lifeplus.view.Event;
+
+/**
+ * RestMemberModel
+ * <pre>
+ * </pre>
+ *
+ * @author 민효동
+ * @version 1.0
+ * @history 민효동   [2018. 10. 8.]   [최초 작성]
+ * @since 2018. 10. 8.
+ */
+public class RestMemberModel extends Model {
+
+  Disposable disposable;
+
+  @Override
+  protected void destroyInternal() {
+    if (null != disposable) {
+      disposable.dispose();
+      disposable = null;
+    }
+  }
+
+  @Override
+  protected void startInternal() {
+
+  }
+
+  @Override
+  protected void stopInternal() {
+
+  }
+
+  @Override
+  protected void resumeInternal() {
+
+  }
+
+  @Override
+  protected void pauseInternal() {
+
+  }
+
+  /**
+   * 회원 휴면 해제
+   */
+  public void activeMember() {
+    disposable = new LifeplusAPIService().activeMember(new RequestBean())
+      .subscribeOn(Schedulers.io())
+      .observeOn(AndroidSchedulers.mainThread())
+      .subscribe(resultBean -> {
+        if (resultBean.isSuccess()) {
+          SuperModel.getInstance().deleteMemberStatus(SuperModel.MEMBER_STATUS_BIT_BLOCK);
+          onResult(new Event.Builder(Event.SUCCESS).build());
+        }
+        else {
+          onResult(new Event.Builder(Event.ERROR).string(resultBean.getReturnMessage()).build());
+        }
+      }, e -> {
+        onResult(new Event.Builder(Event.ERROR).string(e.getLocalizedMessage()).build());
+      });
+  }
+}

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

@@ -19,9 +19,8 @@ import kr.co.zumo.app.lifeplus.util.StringUtil;
  */
 public final class SuperModel {
 
-  public static final int MEMBER_STATUS_NORMAL = 0;
-  public static final int MEMBER_STATUS_BLOCK = 999;
-  public static final int MEMBER_STATUS_REST = 200;
+  public static final int MEMBER_STATUS_BIT_BLOCK = 0;
+  public static final int MEMBER_STATUS_BIT_REST = 1;
 
   private static final SuperModel ourInstance = new SuperModel();
 
@@ -32,7 +31,7 @@ public final class SuperModel {
   private String deviceUuid;
   private String UserId;
   private String token;
-  private int memberStatus = MEMBER_STATUS_NORMAL;
+  private int memberStatus = 0;
   private LifeplusPreferences preferences;
 
   private SuperModel() {
@@ -121,13 +120,19 @@ public final class SuperModel {
   }
 
   /**
-   * 회원 상태 표시
+   * 회원 상태 추가
    * - 잠긴 회원|휴면 회원 등
    *
-   * @param memberStatus
+   * @param memberStatusBit
    */
-  public void setBlockMember(int memberStatus) {
-    this.memberStatus = memberStatus;
+  public void addMemberStatus(int memberStatusBit) {
+    // bit 연산
+    this.memberStatus = memberStatus | (1 << memberStatusBit);
+  }
+
+  public void deleteMemberStatus(int memberStatusBit) {
+    // bit 연산
+    this.memberStatus = memberStatus & ~(1 << memberStatusBit);
   }
 
   public int getMemberStatus() {
@@ -141,7 +146,25 @@ public final class SuperModel {
    * @return
    */
   public boolean isActiveMember() {
-    return StringUtil.isFull(getUserId()) && getMemberStatus() == MEMBER_STATUS_NORMAL;
+    return StringUtil.isFull(getUserId()) && memberStatus == 0;
+  }
+
+  /**
+   * 블럭 멥버 확인
+   *
+   * @return
+   */
+  public boolean isBlockMember() {
+    return ((memberStatus >> MEMBER_STATUS_BIT_BLOCK) & 0b01) == 1;
+  }
+
+  /**ㅣ
+   * 휴면 멤버 확인
+   *
+   * @return
+   */
+  public boolean isRestMember() {
+    return ((memberStatus >> MEMBER_STATUS_BIT_REST) & 0b01) == 1;
   }
 
   /**

+ 3 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/network/api/LifeplusAPI.java

@@ -53,4 +53,7 @@ public interface LifeplusAPI {
 
   @POST("api/v1/member/selectMember.plus")
   Single<LoginResultBean> selectMember(@Body UserNoBean bean);
+
+  @POST("api/v1/member/activeMember.plus")
+  Single<LifeplusAPIBean> activeMember(@Body RequestBean bean);
 }

+ 5 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/network/api/LifeplusAPIRepository.java

@@ -69,4 +69,9 @@ public class LifeplusAPIRepository implements LifeplusAPI {
     return new LifeplusAPIService().selectMember(bean);
   }
 
+  @Override
+  public Single<LifeplusAPIBean> activeMember(RequestBean bean) {
+    return new LifeplusAPIService().activeMember(bean);
+  }
+
 }

+ 48 - 5
app/src/main/java/kr/co/zumo/app/lifeplus/view/presenter/RestMemberPresenter.java

@@ -4,13 +4,19 @@
 package kr.co.zumo.app.lifeplus.view.presenter;
 
 import kr.co.zumo.app.R;
-import kr.co.zumo.app.lifeplus.model.BlankModel;
+import kr.co.zumo.app.lifeplus.model.RestMemberModel;
 import kr.co.zumo.app.lifeplus.supervisor.ScreenID;
 import kr.co.zumo.app.lifeplus.util.ResourceUtil;
 import kr.co.zumo.app.lifeplus.view.Event;
 import kr.co.zumo.app.lifeplus.view.IView;
 import kr.co.zumo.app.lifeplus.view.command.ActivityChangeCommand;
 import kr.co.zumo.app.lifeplus.view.command.EmailSendingCommand;
+import kr.co.zumo.app.lifeplus.view.dialog.AlertDialog;
+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.IAttribute;
+import kr.co.zumo.app.lifeplus.view.dialog.IDialogResultListener;
 
 /**
  * RestMemberPresenter
@@ -22,8 +28,11 @@ import kr.co.zumo.app.lifeplus.view.command.EmailSendingCommand;
  * @history 민효동   [2018. 10. 5.]   [최초 작성]
  * @since 2018. 10. 5.
  */
-public class RestMemberPresenter extends Presenter<BlankModel, IView> {
-  public RestMemberPresenter(BlankModel model, IView view) {
+public class RestMemberPresenter extends Presenter<RestMemberModel, IView> {
+
+  DialogBase alertDialog;
+
+  public RestMemberPresenter(RestMemberModel model, IView view) {
     super(model, view);
   }
 
@@ -35,7 +44,10 @@ public class RestMemberPresenter extends Presenter<BlankModel, IView> {
 
   @Override
   protected void destroyInternal() {
-
+    if (null != alertDialog) {
+      alertDialog.dispose();
+      alertDialog = null;
+    }
   }
 
   @Override
@@ -62,10 +74,11 @@ public class RestMemberPresenter extends Presenter<BlankModel, IView> {
   protected void onEventInternal(Event event) {
     switch (event.getEventId()) {
       case Event.EXIT:
-        onCommand(new ActivityChangeCommand(ScreenID.ACTIVITY_MAIN, ScreenID.DIRECTION_NEXT));
+        onCommand(new ActivityChangeCommand(ScreenID.ACTIVITY_MAIN, ScreenID.DIRECTION_BACK));
         break;
       case Event.CONFIRM:
         // 휴면 해제 api
+        model.activeMember();
         break;
       case Event.EMAIL_CLICK:
         onCommand(new EmailSendingCommand(ResourceUtil.getString(R.string.lifeplus_email)));
@@ -78,6 +91,36 @@ public class RestMemberPresenter extends Presenter<BlankModel, IView> {
 
   @Override
   public void onResult(Event event) {
+    switch (event.getEventId()) {
+      case Event.SUCCESS:
+        onCommand(new ActivityChangeCommand(ScreenID.ACTIVITY_MAIN, ScreenID.DIRECTION_NEXT));
+        break;
+      case Event.ERROR:
+        showErrorPopup(event.getString());
+        break;
+      default:
+        break;
+    }
+  }
 
+  private void showErrorPopup(String errorMessage) {
+    alertDialog = DialogBuilder.create(DialogID.ALERT)
+      .listener(new IDialogResultListener() {
+        @Override
+        public void onDialogResult(DialogBase dialog, Event event) {
+          if (event.getEventId() == Event.CONFIRM) {
+            dialog.dispose();
+          }
+        }
+
+        @Override
+        public void onDialogCanceled(DialogBase dialog) {
+          dialog.dispose();
+        }
+      })
+      .attribute((IAttribute<AlertDialog>) dialog -> {
+        dialog.setText(errorMessage);
+      })
+      .show();
   }
 }

+ 9 - 3
app/src/main/java/kr/co/zumo/app/lifeplus/view/presenter/signup/SignUpAgreePresenter.java

@@ -140,12 +140,18 @@ public class SignUpAgreePresenter extends Presenter<SignUpModel, ISignUpAgreeVie
           else {
             if (loginBean.getBlockStatus().equals(LoginBean.LOCK_STATUS_BLOCK)) {
               // 블럭 계정
-              SuperModel.getInstance().setBlockMember(SuperModel.MEMBER_STATUS_BLOCK);
-              onCommand(new ActivityChangeCommand(ScreenID.ACTIVITY_MEMBER_BLOCK, ScreenID.DIRECTION_NEXT));
+              SuperModel.getInstance().addMemberStatus(SuperModel.MEMBER_STATUS_BIT_BLOCK);
             }
             else if (loginBean.getMemberStatus().equals(LoginBean.USER_STATUS_REST)) {
               // 휴면 계정
-              SuperModel.getInstance().setBlockMember(SuperModel.MEMBER_STATUS_REST);
+              SuperModel.getInstance().addMemberStatus(SuperModel.MEMBER_STATUS_BIT_REST);
+            }
+
+            if (SuperModel.getInstance().isBlockMember()) {
+              onCommand(new ActivityChangeCommand(ScreenID.ACTIVITY_MEMBER_BLOCK, ScreenID.DIRECTION_NEXT));
+
+            }
+            else if (SuperModel.getInstance().isRestMember()) {
               onCommand(new ActivityChangeCommand(ScreenID.ACTIVITY_MEMBER_REST, ScreenID.DIRECTION_NEXT));
             }
           }

+ 23 - 0
app/src/sandbox/java/kr/co/zumo/app/lifeplus/network/NetworkWatcher.java

@@ -31,6 +31,17 @@ public class NetworkWatcher {
     return Single.fromCallable(() -> true);
   }
 
+  /**
+   * 네트워크 장치 연결과 인터넷 연결이 됐는지 감시한다.
+   * - 변경이 있을 때 발행한다.
+   *
+   * @param context
+   * @return rx Observable with Boolean
+   */
+  public static Single<Boolean> check(NetworkStatus networkStatus) {
+    return Single.fromCallable(() -> true);
+  }
+
   /**
    * 네트워크 장치 연결과 인터넷 연결이 됐는지 감시한다.
    * - 변경이 있을 때 발행한다.
@@ -41,4 +52,16 @@ public class NetworkWatcher {
   public static Observable<Boolean> watch(Context context) {
     return Observable.create(emitter -> emitter.onNext(true));
   }
+
+  /**
+   * 네트워크 장치 연결과 인터넷 연결이 됐는지 감시한다.
+   * - 변경이 있을 때 발행한다.
+   *
+   * @param network
+   * @param internet
+   * @return rx Observable with Boolean
+   */
+  public static Observable<Boolean> watch(Observable<Boolean> network, Observable<Boolean> internet) {
+    return Observable.create(emitter -> emitter.onNext(true));
+  }
 }

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

@@ -153,8 +153,8 @@ public class LifeplusAPIService implements LifeplusAPI {
         "  \"data\": [{\"user_no\": \"12345678900\",\n" +
         "            \"user_name\": \"나나나\",\n" +
         "            \"mail_id\": \"naananan@gmail.com\",\n" +
-        "            \"memr_stat_cd\": \"000\",\n" +
-        "            \"lock_stat_cd\": \"000\", \n" +
+        "            \"memr_stat_cd\": \"200\",\n" +                // 000: 정상, 200:휴면, 탈퇴:900
+        "            \"lock_stat_cd\": \"000\", \n" +               // 정상: 000, 잠김 회원: 999
         "            \"ci_value\":\"5555555555\"}],\n" +
         "    \"sp_rtn\": 0\n" +
         " }";
@@ -163,4 +163,9 @@ public class LifeplusAPIService implements LifeplusAPI {
     });
   }
 
+  @Override
+  public Single<LifeplusAPIBean> activeMember(RequestBean bean) {
+    return Single.fromCallable(() -> new LifeplusAPIBean(LifeplusAPIBean.RETURN_SUCCESS, ""));
+//    return Single.fromCallable(() -> new LifeplusAPIBean(LifeplusAPIBean.RETURN_PARAMETER_ERROR, "RETURN_PARAMETER_ERROR"));
+  }
 }

+ 1 - 1
app/src/test/java/kr/co/zumo/app/lifeplus/bean/api/PolicyResultBeanTest.java

@@ -20,7 +20,7 @@ public class PolicyResultBeanTest {
 
   @Test
   public void setData() {
-    PolicyResultBean bean = new PolicyResultBean();
+    PolicyResultBean bean = new PolicyResultBean(0, "", null);
 
     assertEquals(null, bean.getData());
 

+ 34 - 0
app/src/test/java/kr/co/zumo/app/lifeplus/model/SuperModelTest.java

@@ -22,4 +22,38 @@ public class SuperModelTest {
   public void getPreferences() {
     assertEquals(lifeplusPreferences, SuperModel.getInstance().getPreferences());
   }
+
+  @Test
+  public void memberStatus() {
+    SuperModel.getInstance().setUserId("dummy");
+
+    assertEquals(0b00, SuperModel.getInstance().getMemberStatus());
+    assertEquals(true, SuperModel.getInstance().isActiveMember());
+    assertEquals(false, SuperModel.getInstance().isBlockMember());
+    assertEquals(false, SuperModel.getInstance().isRestMember());
+
+    SuperModel.getInstance().addMemberStatus(SuperModel.MEMBER_STATUS_BIT_BLOCK);
+    assertEquals(0b01, SuperModel.getInstance().getMemberStatus());
+    assertEquals(false, SuperModel.getInstance().isActiveMember());
+    assertEquals(true, SuperModel.getInstance().isBlockMember());
+    assertEquals(false, SuperModel.getInstance().isRestMember());
+
+    SuperModel.getInstance().addMemberStatus(SuperModel.MEMBER_STATUS_BIT_REST);
+    assertEquals(0b11, SuperModel.getInstance().getMemberStatus());
+    assertEquals(false, SuperModel.getInstance().isActiveMember());
+    assertEquals(true, SuperModel.getInstance().isBlockMember());
+    assertEquals(true, SuperModel.getInstance().isRestMember());
+
+    SuperModel.getInstance().deleteMemberStatus(SuperModel.MEMBER_STATUS_BIT_BLOCK);
+    assertEquals(0b10, SuperModel.getInstance().getMemberStatus());
+    assertEquals(false, SuperModel.getInstance().isActiveMember());
+    assertEquals(false, SuperModel.getInstance().isBlockMember());
+    assertEquals(true, SuperModel.getInstance().isRestMember());
+
+    SuperModel.getInstance().deleteMemberStatus(SuperModel.MEMBER_STATUS_BIT_REST);
+    assertEquals(0b00, SuperModel.getInstance().getMemberStatus());
+    assertEquals(true, SuperModel.getInstance().isActiveMember());
+    assertEquals(false, SuperModel.getInstance().isBlockMember());
+    assertEquals(false, SuperModel.getInstance().isRestMember());
+  }
 }