Przeglądaj źródła

[스플래시][Common] 스플래시, 네트워크 에러 모델/프리젠터 리팩토링

hyodong.min 6 lat temu
rodzic
commit
644066081f

+ 4 - 45
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/error/NetworkErrorModel.java

@@ -3,14 +3,7 @@
  */
 package kr.co.zumo.app.lifeplus.view.screen.error;
 
-import io.reactivex.disposables.Disposable;
-import kr.co.zumo.app.lifeplus.bean.api.LifeplusAPIBean;
-import kr.co.zumo.app.lifeplus.model.Model;
-import kr.co.zumo.app.lifeplus.model.module.APIError;
-import kr.co.zumo.app.lifeplus.model.module.APIModuleListener;
-import kr.co.zumo.app.lifeplus.model.module.IAPIModuleListener;
-import kr.co.zumo.app.lifeplus.zumo.bean.api.DmcyUserCnclRequestBean;
-import kr.co.zumo.app.lifeplus.zumo.model.module.APIDmcyUserCnclModule;
+import kr.co.zumo.app.lifeplus.view.screen.splash.ScreenStarterModel;
 
 /**
  * NetworkErrorModel
@@ -22,9 +15,8 @@ import kr.co.zumo.app.lifeplus.zumo.model.module.APIDmcyUserCnclModule;
  * @history 민효동   [2019-04-02]   [최초 작성]
  * @since 2019-04-02
  */
-class NetworkErrorModel extends Model {
+class NetworkErrorModel extends ScreenStarterModel {
 
-  private Disposable disposableCheck;
 
   @Override
   protected void createViewInternal() {
@@ -32,8 +24,8 @@ class NetworkErrorModel extends Model {
   }
 
   @Override
-  protected void destroyInternal() {
-    stopActivate();
+  protected void destroyInternal2() {
+
   }
 
   @Override
@@ -60,37 +52,4 @@ class NetworkErrorModel extends Model {
   protected void pauseInternal() {
 
   }
-
-  private void stopActivate() {
-    if (null != disposableCheck) {
-      disposableCheck.dispose();
-      disposableCheck = null;
-    }
-  }
-
-  public void activateMember(IAPIModuleListener<LifeplusAPIBean> listener) {
-    stopActivate();
-
-    disposableCheck = new APIDmcyUserCnclModule().call(new DmcyUserCnclRequestBean(), new APIModuleListener<LifeplusAPIBean>() {
-      @Override
-      public void onApiStart() {
-        listener.onApiStart();
-      }
-
-      @Override
-      public void onApiEnd() {
-        listener.onApiEnd();
-      }
-
-      @Override
-      public void onApiSuccess(LifeplusAPIBean resultBean) {
-        listener.onApiSuccess(resultBean);
-      }
-
-      @Override
-      public void onApiError(String errorMessage, APIError error) {
-        listener.onApiError(errorMessage, error);
-      }
-    });
-  }
 }

+ 12 - 122
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/error/NetworkErrorPresenter.java

@@ -3,21 +3,11 @@
  */
 package kr.co.zumo.app.lifeplus.view.screen.error;
 
-import io.reactivex.disposables.Disposable;
 import kr.co.zumo.app.lifeplus.activity.ScreenStarter;
 import kr.co.zumo.app.lifeplus.activity.ScreenStarterIDMapper;
-import kr.co.zumo.app.lifeplus.application.App;
-import kr.co.zumo.app.lifeplus.bean.api.LifeplusAPIBean;
-import kr.co.zumo.app.lifeplus.helper.AppShieldHelper;
-import kr.co.zumo.app.lifeplus.helper.AppVersionHelper;
-import kr.co.zumo.app.lifeplus.model.module.APIError;
-import kr.co.zumo.app.lifeplus.model.module.IAPIModuleListener;
-import kr.co.zumo.app.lifeplus.util.AppUtil;
 import kr.co.zumo.app.lifeplus.view.Event;
-import kr.co.zumo.app.lifeplus.view.command.AppUpdateCommand;
 import kr.co.zumo.app.lifeplus.view.command.ExitCommand;
-import kr.co.zumo.app.lifeplus.view.dialog.DialogProvider;
-import kr.co.zumo.app.lifeplus.view.presenter.Presenter;
+import kr.co.zumo.app.lifeplus.view.screen.splash.ScreenStarterPresenter;
 import kr.co.zumo.app.lifeplus.zumo.bean.api.MemberInfoBean;
 
 /**
@@ -30,10 +20,7 @@ import kr.co.zumo.app.lifeplus.zumo.bean.api.MemberInfoBean;
  * @history 민효동   [2018. 9. 21.]   [최초 작성]
  * @since 2018. 9. 21.
  */
-public class NetworkErrorPresenter extends Presenter<NetworkErrorModel, INetworkErrorView> {
-
-  protected ScreenStarter starter;
-  protected Disposable disposable;
+public class NetworkErrorPresenter extends ScreenStarterPresenter<NetworkErrorModel, INetworkErrorView> {
 
   public NetworkErrorPresenter(NetworkErrorModel model, INetworkErrorView view) {
     super(model, view);
@@ -44,20 +31,12 @@ public class NetworkErrorPresenter extends Presenter<NetworkErrorModel, INetwork
   }
 
   @Override
-  protected void destroyInternal() {
+  protected void startInternal() {
 
-    if (null != disposable) {
-      disposable.dispose();
-      disposable = null;
-    }
-    if (null != starter) {
-      starter.dispose();
-      starter = null;
-    }
   }
 
   @Override
-  protected void startInternal() {
+  protected void destroyInternal2() {
 
   }
 
@@ -103,37 +82,9 @@ public class NetworkErrorPresenter extends Presenter<NetworkErrorModel, INetwork
     }
   }
 
-
-  protected void next() {
-    /**
-     * 진입 지점이 다를 경우 화면 이동 처리
-     */
-
-    // fixme splash 와 동일한 코드 리팩토링 필요.
-    AppShieldHelper.getInstance().checkApp(App.getInstance().getContext());
-    AppVersionHelper.getInstance().fetch(view.getActivity(), flag -> {
-        switch (flag) {
-          case AppVersionHelper.IAppVersionListener.FLAG_FORCE:
-            // 강제 업데이트
-            showPopupAppUpdate();
-            break;
-          case AppVersionHelper.IAppVersionListener.FLAG_LATEST:
-            // 선택 업데이트
-            showPopupAppUpdateLatest();
-            break;
-          case AppVersionHelper.IAppVersionListener.FLAG_UNABLE:
-            /* falls through */
-          default:
-            launchStarter(true);
-            break;
-        }
-      }
-    );
-  }
-
-  private void launchStarter(boolean isConnected) {
-    starter = new ScreenStarter(view.getActivity());
-    starter.launch(isConnected, (context, fragmentFlag, memberStatus) -> {
+  @Override
+  protected ScreenStarter.IListener onScreenStarterResult() {
+    return (context, fragmentFlag, memberStatus) -> {
       if (MemberInfoBean.isInActiveAccount(memberStatus)) {
         // 휴면 회원
         showRestPopup();
@@ -142,73 +93,12 @@ public class NetworkErrorPresenter extends Presenter<NetworkErrorModel, INetwork
         int screenId = new ScreenStarterIDMapper().getScreenId(fragmentFlag);
         go(screenId);
       }
-    });
-  }
-
-  // fixme splash 와 동일한 코드 리팩토링 필요.
-  private void showRestPopup() {
-    DialogProvider.of(view.getActivity().getSupportFragmentManager()).showRestDialog(() -> {
-      activateMember();
-    }, () -> {
-      // 앱 종료
-      onCommand(new ExitCommand());
-    });
-  }
-
-  private void activateMember() {
-    // 휴면 해제
-    model.activateMember(new IAPIModuleListener<LifeplusAPIBean>() {
-      @Override
-      public void onApiSuccess(LifeplusAPIBean resultBean) {
-        home();
-      }
-
-      @Override
-      public void onApiError(String errorMessage, APIError error) {
-        DialogProvider.of(view.getActivity().getSupportFragmentManager()).showErrorDialog(errorMessage, () -> {
-          // 앱 종료
-          onCommand(new ExitCommand());
-        });
-      }
-
-      @Override
-      public void onApiStart() {
-
-      }
-
-      @Override
-      public void onApiEnd() {
-
-      }
-    });
-  }
-
-
-  private void showPopupAppUpdate() {
-    DialogProvider.of(view.getActivity().getSupportFragmentManager()).showPopupAppUpdate(() -> {
-      gotoPlayStore();
-    }, () -> {
-      // 앱 종료
-      exit();
-    });
-  }
-
-  private void showPopupAppUpdateLatest() {
-    DialogProvider.of(view.getActivity().getSupportFragmentManager()).showPopupAppUpdateLatest(() -> {
-      gotoPlayStore();
-    }, () -> {
-      // 다음 진행
-      launchStarter(true);
-    });
+    };
   }
 
-  private void gotoPlayStore() {
-    // 플레이 스토어 이동
-    onCommand(new AppUpdateCommand(AppUtil.getPackageName()));
-  }
-
-  protected void exit() {
-    onCommand(new ExitCommand());
+  @Override
+  protected void onActivateSuccess() {
+    home();
   }
 
   /***********************************
@@ -230,7 +120,7 @@ public class NetworkErrorPresenter extends Presenter<NetworkErrorModel, INetwork
     super.onChangedConnection(isConnected, type);
 
     if (isConnected) {
-      next();
+      checkAppStatus();
     }
   }
 }

+ 88 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/splash/ScreenStarterModel.java

@@ -0,0 +1,88 @@
+/*
+ * COPYRIGHT (c) 2018 All rights reserved by HANWHA LIFE.
+ */
+package kr.co.zumo.app.lifeplus.view.screen.splash;
+
+import io.reactivex.disposables.Disposable;
+import kr.co.zumo.app.lifeplus.bean.api.LifeplusAPIBean;
+import kr.co.zumo.app.lifeplus.model.Model;
+import kr.co.zumo.app.lifeplus.model.module.APIError;
+import kr.co.zumo.app.lifeplus.model.module.APIModuleListener;
+import kr.co.zumo.app.lifeplus.model.module.IAPIModuleListener;
+import kr.co.zumo.app.lifeplus.zumo.bean.api.DmcyUserCnclRequestBean;
+import kr.co.zumo.app.lifeplus.zumo.model.module.APIDmcyUserCnclModule;
+
+/**
+ * ScreenStarterModel
+ * <pre>
+ * </pre>
+ *
+ * @author 민효동
+ * @version 1.0
+ * @history 민효동   [2019-04-03]   [최초 작성]
+ * @since 2019-04-03
+ */
+public abstract class ScreenStarterModel extends Model {
+  @Override
+  protected void createViewInternal() {
+
+  }
+
+  @Override
+  protected final void destroyInternal() {
+    stopActivate();
+    destroyInternal2();
+  }
+
+  protected abstract void destroyInternal2();
+
+  @Override
+  protected void destroyViewInternal() {
+
+  }
+
+  @Override
+  protected void startInternal() {
+
+  }
+
+  @Override
+  protected void stopInternal() {
+
+  }
+
+  @Override
+  protected void resumeInternal() {
+
+  }
+
+  @Override
+  protected void pauseInternal() {
+
+  }
+
+  private Disposable disposableCheck;
+
+  private void stopActivate() {
+    if(null != disposableCheck) {
+      disposableCheck.dispose();
+      disposableCheck = null;
+    }
+  }
+
+  public void activateMember(IAPIModuleListener<LifeplusAPIBean> listener) {
+    stopActivate();
+
+    disposableCheck = new APIDmcyUserCnclModule().call(new DmcyUserCnclRequestBean(), new APIModuleListener<LifeplusAPIBean>(waiterCaller) {
+      @Override
+      public void onApiSuccess(LifeplusAPIBean resultBean) {
+        listener.onApiSuccess(resultBean);
+      }
+
+      @Override
+      public void onApiError(String errorMessage, APIError error) {
+        listener.onApiError(errorMessage, error);
+      }
+    });
+  }
+}

+ 171 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/splash/ScreenStarterPresenter.java

@@ -0,0 +1,171 @@
+/*
+ * COPYRIGHT (c) 2018 All rights reserved by HANWHA LIFE.
+ */
+package kr.co.zumo.app.lifeplus.view.screen.splash;
+
+import android.content.Context;
+
+import kr.co.zumo.app.lifeplus.activity.ScreenStarter;
+import kr.co.zumo.app.lifeplus.application.App;
+import kr.co.zumo.app.lifeplus.bean.api.LifeplusAPIBean;
+import kr.co.zumo.app.lifeplus.helper.AppShieldHelper;
+import kr.co.zumo.app.lifeplus.helper.AppVersionHelper;
+import kr.co.zumo.app.lifeplus.model.module.APIError;
+import kr.co.zumo.app.lifeplus.model.module.APIModuleListener;
+import kr.co.zumo.app.lifeplus.util.AppUtil;
+import kr.co.zumo.app.lifeplus.view.Event;
+import kr.co.zumo.app.lifeplus.view.IView;
+import kr.co.zumo.app.lifeplus.view.command.AppUpdateCommand;
+import kr.co.zumo.app.lifeplus.view.command.ExitCommand;
+import kr.co.zumo.app.lifeplus.view.dialog.DialogProvider;
+import kr.co.zumo.app.lifeplus.view.presenter.Presenter;
+
+/**
+ * ScreenStarterPresenter
+ * <pre>
+ * </pre>
+ *
+ * @author 민효동
+ * @version 1.0
+ * @history 민효동   [2019-04-03]   [최초 작성]
+ * @since 2019-04-03
+ */
+public abstract class ScreenStarterPresenter<M extends ScreenStarterModel, V extends IView> extends Presenter<M, V> {
+
+  protected ScreenStarter starter;
+
+  public ScreenStarterPresenter(M model, V view) {
+    super(model, view);
+  }
+
+  @Override
+  protected void createViewInternal() {
+  }
+
+  @Override
+  protected final void destroyInternal() {
+    if (null != starter) {
+      starter.dispose();
+      starter = null;
+    }
+    destroyInternal2();
+  }
+
+  protected abstract void destroyInternal2();
+
+  @Override
+  protected void destroyViewInternal() {
+  }
+
+  @Override
+  protected void startInternal() {
+  }
+
+  @Override
+  protected void startInternalOnce() {
+  }
+
+  @Override
+  protected void stopInternal() {
+  }
+
+  @Override
+  protected void resumeInternal() {
+  }
+
+  @Override
+  protected void pauseInternal() {
+  }
+
+  @Override
+  protected void onEventInternal(Event event) {
+  }
+
+  @Override
+  public void onScreenReady() {
+  }
+
+  @Override
+  public void onResult(Event event) {
+  }
+
+  protected void checkAppStatus() {
+    Context context = App.getInstance().getContext();
+
+    AppShieldHelper.getInstance().checkApp(context);
+    AppVersionHelper.getInstance().fetch(view.getActivity(), flag -> {
+        switch (flag) {
+          case AppVersionHelper.IAppVersionListener.FLAG_FORCE:
+            // 강제 업데이트
+            showPopupAppUpdate();
+            break;
+          case AppVersionHelper.IAppVersionListener.FLAG_LATEST:
+            // 선택 업데이트
+            showPopupAppUpdateLatest();
+            break;
+          case AppVersionHelper.IAppVersionListener.FLAG_UNABLE:
+            /* falls through */
+          default:
+            launchStarter(true);
+            break;
+        }
+      }
+    );
+  }
+
+  protected void launchStarter(boolean isConnected) {
+    starter = new ScreenStarter(view.getActivity());
+    starter.launch(isConnected, onScreenStarterResult());
+  }
+
+  protected abstract ScreenStarter.IListener onScreenStarterResult();
+
+  protected abstract void onActivateSuccess();
+
+  private void activateMember() {
+    // 휴면 해제
+    model.activateMember(new APIModuleListener<LifeplusAPIBean>() {
+      @Override
+      public void onApiSuccess(LifeplusAPIBean resultBean) {
+        onActivateSuccess();
+      }
+
+      @Override
+      public void onApiError(String errorMessage, APIError error) {
+        DialogProvider.of(view.getActivity().getSupportFragmentManager()).showErrorDialog(errorMessage, () -> {
+          // 앱 종료
+          exit();
+        });
+      }
+    });
+  }
+
+  protected void showRestPopup() {
+    DialogProvider.of(view.getActivity().getSupportFragmentManager())
+      .showRestDialog(this::activateMember, this::exit);
+  }
+
+  private void showPopupAppUpdate() {
+    // 앱 종료
+    DialogProvider.of(view.getActivity().getSupportFragmentManager())
+      .showPopupAppUpdate(this::gotoPlayStore, this::exit);
+  }
+
+  private void showPopupAppUpdateLatest() {
+    DialogProvider.of(view.getActivity().getSupportFragmentManager())
+      .showPopupAppUpdateLatest(this::gotoPlayStore, () -> {
+        // 다음 진행
+        launchStarter(true);
+      });
+  }
+
+  private void gotoPlayStore() {
+    // 플레이 스토어 이동
+    onCommand(new AppUpdateCommand(AppUtil.getPackageName()));
+  }
+
+  protected void exit() {
+    onCommand(new ExitCommand());
+  }
+
+}

+ 24 - 33
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/splash/SplashModel.java

@@ -9,15 +9,12 @@ import android.content.pm.PackageManager;
 import android.location.LocationManager;
 import android.support.v4.app.ActivityCompat;
 
+import io.reactivex.android.schedulers.AndroidSchedulers;
 import io.reactivex.disposables.Disposable;
-import kr.co.zumo.app.lifeplus.bean.api.LifeplusAPIBean;
-import kr.co.zumo.app.lifeplus.model.Model;
+import io.reactivex.functions.Consumer;
+import io.reactivex.schedulers.Schedulers;
 import kr.co.zumo.app.lifeplus.model.SuperModel;
-import kr.co.zumo.app.lifeplus.model.module.APIError;
-import kr.co.zumo.app.lifeplus.model.module.APIModuleListener;
-import kr.co.zumo.app.lifeplus.model.module.IAPIModuleListener;
-import kr.co.zumo.app.lifeplus.zumo.bean.api.DmcyUserCnclRequestBean;
-import kr.co.zumo.app.lifeplus.zumo.model.module.APIDmcyUserCnclModule;
+import kr.co.zumo.app.lifeplus.network.NetworkWatcher;
 
 /**
  * SplashModel
@@ -29,15 +26,21 @@ import kr.co.zumo.app.lifeplus.zumo.model.module.APIDmcyUserCnclModule;
  * @history 민효동   [2019-04-02]   [최초 작성]
  * @since 2019-04-02
  */
-public class SplashModel extends Model {
+public class SplashModel extends ScreenStarterModel {
+
+  private Disposable disposable;
+
   @Override
   protected void createViewInternal() {
 
   }
 
   @Override
-  protected void destroyInternal() {
-
+  protected void destroyInternal2() {
+    if (null != disposable) {
+      disposable.dispose();
+      disposable = null;
+    }
   }
 
   @Override
@@ -65,8 +68,6 @@ public class SplashModel extends Model {
 
   }
 
-  private Disposable disposableCheck;
-
   /**
    * 푸쉬 알림 설정
    *
@@ -114,26 +115,16 @@ public class SplashModel extends Model {
     return Manifest.permission.ACCESS_FINE_LOCATION;
   }
 
-  private void stopActivate() {
-    if(null != disposableCheck) {
-      disposableCheck.dispose();
-      disposableCheck = null;
-    }
-  }
-
-  public void activateMember(IAPIModuleListener<LifeplusAPIBean> listener) {
-    stopActivate();
-
-    disposableCheck = new APIDmcyUserCnclModule().call(new DmcyUserCnclRequestBean(), new APIModuleListener<LifeplusAPIBean>(waiterCaller) {
-      @Override
-      public void onApiSuccess(LifeplusAPIBean resultBean) {
-        listener.onApiSuccess(resultBean);
-      }
-
-      @Override
-      public void onApiError(String errorMessage, APIError error) {
-        listener.onApiError(errorMessage, error);
-      }
-    });
+  public void checkNetwork(Context context, Consumer<Boolean> consumer, Consumer<Throwable> throwableConsumer) {
+    // 네트워크 연결 체크
+    disposable = new NetworkWatcher().check(context)
+      .subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
+      .subscribe(aBoolean -> {
+        disposable = null;
+        consumer.accept(aBoolean);
+      }, e -> {
+        disposable = null;
+        throwableConsumer.accept(e);
+      });
   }
 }

+ 26 - 157
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/splash/SplashPresenter.java

@@ -12,9 +12,6 @@ import android.util.Log;
 
 import java.util.Arrays;
 
-import io.reactivex.android.schedulers.AndroidSchedulers;
-import io.reactivex.disposables.CompositeDisposable;
-import io.reactivex.schedulers.Schedulers;
 import kr.co.zumo.app.R;
 import kr.co.zumo.app.lifeplus.activity.ActivityBase;
 import kr.co.zumo.app.lifeplus.activity.AppInitializer;
@@ -22,27 +19,16 @@ import kr.co.zumo.app.lifeplus.activity.DynamicLinkLauncher;
 import kr.co.zumo.app.lifeplus.activity.MainActivity;
 import kr.co.zumo.app.lifeplus.activity.ScreenStarter;
 import kr.co.zumo.app.lifeplus.application.App;
-import kr.co.zumo.app.lifeplus.bean.api.LifeplusAPIBean;
-import kr.co.zumo.app.lifeplus.helper.AppShieldHelper;
-import kr.co.zumo.app.lifeplus.helper.AppVersionHelper;
 import kr.co.zumo.app.lifeplus.helper.FirebaseMessagingHelper;
 import kr.co.zumo.app.lifeplus.model.SuperModel;
 import kr.co.zumo.app.lifeplus.model.SuperModelInit;
-import kr.co.zumo.app.lifeplus.model.module.APIError;
 import kr.co.zumo.app.lifeplus.model.module.APIModuleHelper;
-import kr.co.zumo.app.lifeplus.model.module.APIModuleListener;
-import kr.co.zumo.app.lifeplus.network.NetworkWatcher;
 import kr.co.zumo.app.lifeplus.supervisor.ScreenID;
-import kr.co.zumo.app.lifeplus.util.AppUtil;
 import kr.co.zumo.app.lifeplus.view.Event;
-import kr.co.zumo.app.lifeplus.view.command.AppUpdateCommand;
-import kr.co.zumo.app.lifeplus.view.command.ExitCommand;
 import kr.co.zumo.app.lifeplus.view.dialog.ConfirmDialog;
 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.DialogProvider;
 import kr.co.zumo.app.lifeplus.view.dialog.ICustomConfirmListener;
-import kr.co.zumo.app.lifeplus.view.presenter.Presenter;
 import kr.co.zumo.app.lifeplus.view.screen.setting.MemberInfoModelHelper;
 import kr.co.zumo.app.lifeplus.zumo.bean.api.MemberInfoBean;
 
@@ -56,13 +42,10 @@ import kr.co.zumo.app.lifeplus.zumo.bean.api.MemberInfoBean;
  * @history 민효동   [2019-04-02]   [최초 작성]
  * @since 2019-04-02
  */
-public class SplashPresenter extends Presenter<SplashModel, ISplashView> {
+public class SplashPresenter extends ScreenStarterPresenter<SplashModel, ISplashView> {
 
   private final static int REQUEST_CODE = 9909;
 
-  private CompositeDisposable disposable = new CompositeDisposable();
-  private ScreenStarter starter;
-
   private boolean isRequestingLocationService = false;
 
   public SplashPresenter(SplashModel model, ISplashView view) {
@@ -75,17 +58,7 @@ public class SplashPresenter extends Presenter<SplashModel, ISplashView> {
   }
 
   @Override
-  protected void destroyInternal() {
-
-    if (null != disposable) {
-      disposable.dispose();
-      disposable = null;
-    }
-    if (null != starter) {
-      starter.dispose();
-      starter = null;
-    }
-    view = null;
+  protected void destroyInternal2() {
   }
 
   @Override
@@ -113,10 +86,7 @@ public class SplashPresenter extends Presenter<SplashModel, ISplashView> {
 
       launchPushPermission(() -> {
         launchDeviceLocationPermission(() -> {
-          launchLocationPermission(() -> {
-            // 권한 처리 종료
-            onPermissionCompleted();
-          });
+          launchLocationPermission(/* 권한 처리 종료 */this::onPermissionCompleted);
         });
       });
     }
@@ -132,10 +102,7 @@ public class SplashPresenter extends Presenter<SplashModel, ISplashView> {
     if (isRequestingLocationService) {
       isRequestingLocationService = false;
 
-      launchLocationPermission(() -> {
-        // 권한 처리 종료
-        onPermissionCompleted();
-      });
+      launchLocationPermission(/* 권한 처리 종료 */this::onPermissionCompleted);
     }
   }
 
@@ -258,6 +225,7 @@ public class SplashPresenter extends Presenter<SplashModel, ISplashView> {
   }
 
   private void launchInternal(Runnable runnableConfirm, Runnable runnableNext, int titleId, int contentsId, int negativeId, int positiveId) {
+    // todo dialogProvider 로 이동
     new DialogBuilder<ConfirmDialog, ICustomConfirmListener>(view.getActivity().getSupportFragmentManager(), DialogID.CONFIRM)
       .listener(new ICustomConfirmListener<ConfirmDialog>() {
         @Override
@@ -288,33 +256,14 @@ public class SplashPresenter extends Presenter<SplashModel, ISplashView> {
       .show();
   }
 
-  public void onRequestPermissionsResult(String[] permissions, int[] grantResults) {
-    Log.i("APP# SplashPresenter | onRequestPermissionsResult", "|" + " grantResults: " + Arrays.toString(grantResults));
-    // If request is cancelled, the result arrays are empty.
-    if (grantResults.length > 0) {
-      // permission was granted
-      boolean granted = true;
-      for (int grantResult : grantResults) {
-        if (grantResult != PackageManager.PERMISSION_GRANTED) {
-          granted = false;
-          break;
-        }
-      }
-
-      if (granted) {
-        // 모두 허용
-        model.setLocationServiceEnabled(true);
-      }
-    }
-
-    // 권한 처리 종료
-    onPermissionCompleted();
-  }
-
   private void onPermissionCompleted() {
     setupInternal();
   }
 
+  private void doOnLink() {
+    DynamicLinkLauncher.launch(view.getActivity());
+  }
+
   private void setupInternal() {
 
     Context context = App.getInstance().getContext();
@@ -332,55 +281,25 @@ public class SplashPresenter extends Presenter<SplashModel, ISplashView> {
 
       SuperModelInit.instant(context);
 
-      starter = new ScreenStarter(view.getActivity());
-
-      // 네트워크 연결 체크
-      disposable.add(
-        new NetworkWatcher().check(context)
-          .subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
-          .subscribe(isConnected -> {
-            disposable.dispose();
-
-            if (isConnected) {
-              AppShieldHelper.getInstance().checkApp(context);
-              AppVersionHelper.getInstance().fetch(view.getActivity(), flag -> {
-                  switch (flag) {
-                    case AppVersionHelper.IAppVersionListener.FLAG_FORCE:
-                      // 강제 업데이트
-                      showPopupAppUpdate();
-                      break;
-                    case AppVersionHelper.IAppVersionListener.FLAG_LATEST:
-                      // 선택 업데이트
-                      showPopupAppUpdateLatest();
-                      break;
-                    case AppVersionHelper.IAppVersionListener.FLAG_UNABLE:
-                      /* falls through */
-                    default:
-                      launchStarter(true);
-                      break;
-                  }
-                }
-              );
-            }
-            else {
-              launchStarter(isConnected);
-            }
-          }, Throwable::printStackTrace)
-      );
-    }
-  }
+      model.checkNetwork(context, isConnected -> {
+        if (isConnected) {
+          checkAppStatus();
+        }
+        else {
+          launchStarter(isConnected);
+        }
+      }, Throwable::printStackTrace);
 
-  private void doOnLink() {
-    DynamicLinkLauncher.launch(view.getActivity());
+    }
   }
 
-  private void launchStarter(boolean isConnected) {
-    Context context = App.getInstance().getContext();
-    starter.launch(isConnected, (context1, fragmentFlag, memberStatus) -> {
+  @Override
+  protected ScreenStarter.IListener onScreenStarterResult() {
+    return (context, fragmentFlag, memberStatus) -> {
       /**
        * App init
        */
-      AppInitializer.init(context);
+      AppInitializer.init(App.getInstance().getContext());
 
       // topic 가입
       FirebaseMessagingHelper.getInstance().subscribeToTopic();
@@ -393,62 +312,12 @@ public class SplashPresenter extends Presenter<SplashModel, ISplashView> {
         linkActivity(fragmentFlag);
       }
 
-    });
-  }
-
-
-  private void showRestPopup() {
-    DialogProvider.of(view.getActivity().getSupportFragmentManager()).showRestDialog(() -> {
-      activateMember();
-    }, () -> {
-      // 앱 종료
-      exit();
-    });
+    };
   }
 
-  private void activateMember() {
-    // 휴면 해제
-    model.activateMember(new APIModuleListener<LifeplusAPIBean>() {
-      @Override
-      public void onApiSuccess(LifeplusAPIBean resultBean) {
-        linkActivity(ScreenStarter.SCREEN_MAIN);
-      }
-
-      @Override
-      public void onApiError(String errorMessage, APIError error) {
-        DialogProvider.of(view.getActivity().getSupportFragmentManager()).showErrorDialog(errorMessage, () -> {
-          // 앱 종료
-          exit();
-        });
-      }
-    });
-  }
-
-  private void showPopupAppUpdate() {
-    DialogProvider.of(view.getActivity().getSupportFragmentManager()).showPopupAppUpdate(() -> {
-      gotoPlayStore();
-    }, () -> {
-      // 앱 종료
-      exit();
-    });
-  }
-
-  private void showPopupAppUpdateLatest() {
-    DialogProvider.of(view.getActivity().getSupportFragmentManager()).showPopupAppUpdateLatest(() -> {
-      gotoPlayStore();
-    }, () -> {
-      // 다음 진행
-      launchStarter(true);
-    });
-  }
-
-  private void gotoPlayStore() {
-    // 플레이 스토어 이동
-    onCommand(new AppUpdateCommand(AppUtil.getPackageName()));
-  }
-
-  protected void exit() {
-    onCommand(new ExitCommand());
+  @Override
+  protected void onActivateSuccess() {
+    linkActivity(ScreenStarter.SCREEN_MAIN);
   }
 
 }