Browse Source

Merge branch 'develop' of https://github.com/swict/LifeplusAndroid into develop

Hasemi 6 years ago
parent
commit
2255caf2a4

+ 1 - 33
app/src/main/java/kr/co/zumo/app/lifeplus/activity/ActivityBaseSetup.java

@@ -3,14 +3,6 @@
  */
 package kr.co.zumo.app.lifeplus.activity;
 
-import android.content.Intent;
-import android.util.Log;
-
-import kr.co.zumo.app.lifeplus.bean.PushBean;
-import kr.co.zumo.app.lifeplus.model.SuperModel;
-import kr.co.zumo.app.lifeplus.supervisor.ActivityDeliveryHelper;
-import kr.co.zumo.app.lifeplus.supervisor.PushMessageLink;
-
 /**
  * ActivitySetup
  * - 화면 표시 없이 작동하는 액티비티
@@ -32,32 +24,8 @@ public abstract class ActivityBaseSetup extends ActivityBase {
   protected abstract void setup();
 
   protected void doOnLink() {
-    /**
-     * 여기에서 api 호출 후 진행하면 완료 시점에서 activity 가 finish 된 후이다.
-     * deliveryHelper 등 모든 헬퍼가 초기화 되므로 데이터 연계가 되지 않으므로 주의
-     */
-    if (SuperModel.getInstance().hasContentsLink()) {
-      SuperModel.getInstance().setContentsLink(false);
-      Intent intent = new Intent(this, ContentsActivity.class);
-      startActivity(intent);
-    }
-    else if (SuperModel.getInstance().hasEventLink()) {
-      SuperModel.getInstance().setEventLink(false);
-      Intent intent = new Intent(this, EventDetailActivity.class);
-      startActivity(intent);
-    }
-    else if (SuperModel.getInstance().hasPushLink()) {
-      SuperModel.getInstance().setPushLink(false);
-      PushBean pushBean = ActivityDeliveryHelper.getInstance().getPackaging(PushBean.class);
-      PushMessageLink.link(this, pushBean);
-    }
-    else {
-      Log.d("APP#  ActivityBaseSetup | doOnLink", "|" + " no extra link.");
-    }
-
+    DynamicLinkLauncher.launch(this);
   }
-
-
 }
 
 

+ 57 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/activity/DynamicLinkLauncher.java

@@ -0,0 +1,57 @@
+/*
+ * COPYRIGHT (c) 2018 All rights reserved by HANWHA LIFE.
+ */
+package kr.co.zumo.app.lifeplus.activity;
+
+import android.content.Intent;
+import android.support.v4.app.FragmentActivity;
+import android.util.Log;
+
+import kr.co.zumo.app.lifeplus.bean.PushBean;
+import kr.co.zumo.app.lifeplus.model.SuperModel;
+import kr.co.zumo.app.lifeplus.supervisor.ActivityDeliveryHelper;
+import kr.co.zumo.app.lifeplus.supervisor.PushMessageLink;
+
+/**
+ * DynamicLinkLauncher
+ * <pre>
+ * </pre>
+ *
+ * @author 민효동
+ * @version 1.0
+ * @history 민효동   [2019-04-02]   [최초 작성]
+ * @since 2019-04-02
+ */
+public class DynamicLinkLauncher {
+
+  /**
+   * 외부 링크들을 처리
+   *
+   * @param activity
+   */
+  public static void launch(FragmentActivity activity) {
+
+    /**
+     * 여기에서 api 호출 후 진행하면 완료 시점에서 activity 가 finish 된 후이다.
+     * deliveryHelper 등 모든 헬퍼가 초기화 되므로 데이터 연계가 되지 않으므로 주의
+     */
+    if (SuperModel.getInstance().hasContentsLink()) {
+      SuperModel.getInstance().setContentsLink(false);
+      Intent intent = new Intent(activity, ContentsActivity.class);
+      activity.startActivity(intent);
+    }
+    else if (SuperModel.getInstance().hasEventLink()) {
+      SuperModel.getInstance().setEventLink(false);
+      Intent intent = new Intent(activity, EventDetailActivity.class);
+      activity.startActivity(intent);
+    }
+    else if (SuperModel.getInstance().hasPushLink()) {
+      SuperModel.getInstance().setPushLink(false);
+      PushBean pushBean = ActivityDeliveryHelper.getInstance().getPackaging(PushBean.class);
+      PushMessageLink.link(activity, pushBean);
+    }
+    else {
+      Log.d("APP#  ActivityBaseSetup | doOnLink", "|" + " no extra link.");
+    }
+  }
+}

+ 0 - 137
app/src/main/java/kr/co/zumo/app/lifeplus/activity/ISplashContract.java

@@ -1,137 +0,0 @@
-/*
- * COPYRIGHT (c) 2018 All rights reserved by HANWHA LIFE.
- */
-package kr.co.zumo.app.lifeplus.activity;
-
-import android.content.Context;
-import android.support.annotation.NonNull;
-import android.support.v4.app.FragmentActivity;
-
-import kr.co.zumo.app.lifeplus.bean.api.LifeplusAPIBean;
-import kr.co.zumo.app.lifeplus.model.module.IAPIModuleListener;
-
-/**
- * ISplashContract
- * <pre>
- * </pre>
- *
- * @author 민효동
- * @version 1.0
- * @history 민효동   [2019. 2. 20.]   [최초 작성]
- * @since 2019. 2. 20.
- */
-public interface ISplashContract {
-
-  interface View {
-    FragmentActivity getActivity();
-
-    /**
-     * 위치 앱 권환 요청
-     *
-     * @param permissions
-     */
-    void requestLocationPermissions(@NonNull String[] permissions);
-
-    /**
-     * 액티비티 종료
-     */
-    void finish();
-
-    /**
-     * 외부 유입 링크 처리
-     */
-    void onLink();
-
-    /**
-     * 다음 액티비티로 전환
-     *
-     * @param screenId
-     */
-    void linkActivity(int screenId);
-  }
-
-  interface Presenter {
-
-    /**
-     * start
-     */
-    void start();
-
-    /**
-     * 디바이스 위치 서비스 설정 후 재시작
-     */
-    void onResume();
-
-    /**
-     * 권한 확인 결과
-     *
-     * @param permissions
-     * @param grantResults
-     */
-    void onRequestPermissionsResult(String[] permissions, int[] grantResults);
-
-    void dispose();
-  }
-
-  interface Model {
-    /**
-     * 푸쉬 알림 설정
-     *
-     * @return
-     */
-//    void setPushContentsAndService(boolean isEnabled);
-
-    /**
-     * 푸쉬 마케팅 알림 설정
-     *
-     * @return
-     */
-    void setPushEventEnabled(boolean isEnabled);
-
-    /**
-     * 위치 서비스 설정
-     *
-     * @return
-     */
-    void setLocationServiceEnabled(boolean isEnabled);
-
-    /**
-     * 퍼미션 확인 완료
-     */
-    boolean getFirstPermissionCompleted();
-
-    void setFirstPermissionCompleted();
-
-    /**
-     * 장치 위치 서비스 사용 가능
-     *
-     * @return
-     */
-    boolean canAccessDeviceLocating(Context context);
-
-    /**
-     * 위치 서비스 앱 권한 확인
-     *
-     * @return
-     */
-    boolean hasLocationPermissions(Context context);
-
-    /**
-     * 위치 서비스 앱 권한
-     *
-     * @return
-     */
-    String getPermissionsString();
-
-    /**
-     * 휴면 해제
-     *
-     */
-    void activateMember(IAPIModuleListener<LifeplusAPIBean> listener);
-
-    /**
-     * dispose
-     */
-    void dispose();
-  }
-}

+ 16 - 88
app/src/main/java/kr/co/zumo/app/lifeplus/activity/SplashActivity.java

@@ -1,22 +1,15 @@
 package kr.co.zumo.app.lifeplus.activity;
 
 import android.content.Intent;
-import android.support.annotation.NonNull;
-import android.support.v4.app.ActivityCompat;
-import android.support.v4.app.FragmentActivity;
-import android.util.Log;
-import android.view.View;
 
 import com.buzzvil.buzzad.analytics.BATracker;
 
-import java.util.Arrays;
-
 import kr.co.zumo.app.R;
 import kr.co.zumo.app.lifeplus.application.App;
+import kr.co.zumo.app.lifeplus.helper.ScreenChangerHelper;
 import kr.co.zumo.app.lifeplus.model.SuperModelInit;
-import kr.co.zumo.app.lifeplus.model.module.APIModuleHelper;
+import kr.co.zumo.app.lifeplus.supervisor.ScreenID;
 import kr.co.zumo.app.lifeplus.view.custom.FullScreenWithKeyBoardLayout;
-import kr.co.zumo.app.lifeplus.zumo.activity.SignInActivity;
 
 /**
  * Splash 화면
@@ -28,16 +21,14 @@ import kr.co.zumo.app.lifeplus.zumo.activity.SignInActivity;
  * @version 1.0
  * @history 하세미   [2018-09-07]   [최초 작성]
  */
-public class SplashActivity extends ActivityBaseSetup implements ISplashContract.View {
-
-  ISplashContract.Presenter presenter;
-
-  private final static int REQUEST_CODE = 9909;
+public class SplashActivity extends ActivityBase {
 
   @Override
-  protected void setup() {
-    // for visible loading...
-    rootView.setVisibility(View.VISIBLE);
+  protected final void renderScreen() {
+    /**
+     * ActivityBaseScreen 에서 SplashActivity 로 되돌리는 코드가 있어,
+     * SplashActivity 는 직접 구현한다.
+     */
 
     setContentView(R.layout.activity_splash);
 
@@ -45,97 +36,34 @@ public class SplashActivity extends ActivityBaseSetup implements ISplashContract
 
     SuperModelInit.instant(App.getInstance().getContext());
 
-    Log.d("APP# SplashActivity | setup", "|" + "========== setup..............");
-
-    presenter = new SplashPresenter(new SplashModel(), this);
-    presenter.start();
-
     //Buzz Ad: CPE
     BATracker.actionCompleted(this);
-  }
 
-  @Override
-  protected void onResumeInternal() {
-    presenter.onResume();
+    // screen changer
+    ScreenChangerHelper helper = getHelper(ScreenChangerHelper.class);
+    helper.setFragmentActivity(this);
+    helper.setContainerId(R.id.container_main);
+
+    launchScreen(ScreenID.SPLASH);
   }
 
-  @Override
   protected boolean hasLayout() {
     return false;
   }
 
   @Override
   protected void onAfterDestroy() {
-    if (null != presenter) {
-      presenter.dispose();
-      presenter = null;
-    }
-  }
-
-  @Override
-  protected void onBeforeDestroy() {
-  }
 
-  @Override
-  protected void onAfterNewIntent(Intent intent) {
   }
 
-  /***********************************
-   * ISplashContract.View
-   ***********************************/
   @Override
-  public FragmentActivity getActivity() {
-    return this;
-  }
-
-  @Override
-  public void requestLocationPermissions(@NonNull String[] permissions) {
-    Log.i("APP# SplashActivity | requestLocationPermissions", "|" + " permissions: " + Arrays.toString(permissions));
-    ActivityCompat.requestPermissions(this, permissions, REQUEST_CODE);
-  }
+  protected void onBeforeDestroy() {
 
-  @Override
-  public void onLink() {
-    doOnLink();
   }
 
   @Override
-  public void linkActivity(int screenId) {
-    Intent intent;
-    // 로그인/가입 같은 액티비티에서 처리됨
-    if (screenId == ScreenStarter.SCREEN_SIGN_IN || screenId == ScreenStarter.SCREEN_SIGN_UP) {
-      intent = new Intent(this, SignInActivity.class);
-
-      if (false == APIModuleHelper.isDispatched()) {
-        startActivity(intent);
-        this.finish();
-      }
-    }
-    else {
-      intent = new Intent(this, MainActivity.class);
-      intent.putExtra(ScreenStarter.SCREEN_ID, screenId);
-      intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-
-      if (false == APIModuleHelper.isDispatched()) {
-        this.finish();
-        startActivity(intent, SLIDE_TYPE_HOME);
-
-        doOnLink();
-      }
-    }
-  }
-
+  protected void onAfterNewIntent(Intent intent) {
 
-  @Override
-  public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
-    switch (requestCode) {
-      case REQUEST_CODE: {
-        presenter.onRequestPermissionsResult(permissions, grantResults);
-        break;
-      }
-      default:
-        break;
-    }
   }
 }
 

+ 2 - 1
app/src/main/java/kr/co/zumo/app/lifeplus/supervisor/ScreenID.java

@@ -77,6 +77,7 @@ public class ScreenID {
   public static final int LOGIN = 99;
   public static final int SETTING_MEMBER_PASSWORD = 100;
   public static final int SIGN_IN = 101;
+  public static final int SPLASH = 102;
 
   @Retention(RetentionPolicy.SOURCE)
   @IntDef({BACK, MAIN, SETTING, NETWORK_ERROR, PIN, PIN_RESET, ON_BOARDING, PERMISSION_INFO,
@@ -87,7 +88,7 @@ public class ScreenID {
     OVER_VIEW, ACTIVITY, SERIES, WEB_FROM_CONTENTS, BUCKET_ACTIVITY, MAP, MY_EVENT, EVENT_WINNER,
     EVENT_DETAIL, SEARCH, EVENT_QUESTION, SYSTEM_CHECK, UTILITY_ACTIVITY, SEARCH_RESULT,
     EVENT_DETAIL_ENTRY, EVENT_DETAIL_SELECT, EVENT_RECOMMEND, EVENT_RECOMMEND_BASIC, EVENT_RECOMMEND_TAG,
-    EVENT_RECORD, WEB_PURCHASE, WEB_FROM_EVENT, LOGIN, SETTING_MEMBER_PASSWORD, SIGN_IN
+    EVENT_RECORD, WEB_PURCHASE, WEB_FROM_EVENT, LOGIN, SETTING_MEMBER_PASSWORD, SIGN_IN, SPLASH
   })
   public @interface ID {}
 

+ 6 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/factory/BasicFragmentFactory.java

@@ -49,6 +49,7 @@ import kr.co.zumo.app.lifeplus.view.screen.setting.member.SettingMemberInfoFragm
 import kr.co.zumo.app.lifeplus.view.screen.setting.member.SettingMemberPasswordFragment;
 import kr.co.zumo.app.lifeplus.view.screen.setting.member.SettingMemberQuitFinishFragment;
 import kr.co.zumo.app.lifeplus.view.screen.setting.member.SettingMemberQuitRequestFragment;
+import kr.co.zumo.app.lifeplus.view.screen.splash.SplashFragment;
 import kr.co.zumo.app.lifeplus.view.screen.web.WebFromContentsFragment;
 import kr.co.zumo.app.lifeplus.view.screen.web.WebFromEventFragment;
 import kr.co.zumo.app.lifeplus.view.screen.web.WebPurchaseFragment;
@@ -71,6 +72,11 @@ public class BasicFragmentFactory extends FragmentFactory {
     FragmentBase fragment = null;
     switch (id) {
 
+      // splash
+      case ScreenID.SPLASH:
+        fragment = new SplashFragment();
+        break;
+
       // login
       case ScreenID.LOGIN:
         fragment = new LoginFragment();

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

@@ -0,0 +1,22 @@
+/*
+ * COPYRIGHT (c) 2018 All rights reserved by HANWHA LIFE.
+ */
+package kr.co.zumo.app.lifeplus.view.screen.splash;
+
+import android.support.annotation.NonNull;
+
+import kr.co.zumo.app.lifeplus.view.IView;
+
+/**
+ * ISplashView
+ * <pre>
+ * </pre>
+ *
+ * @author 민효동
+ * @version 1.0
+ * @history 민효동   [2019-04-02]   [최초 작성]
+ * @since 2019-04-02
+ */
+interface ISplashView extends IView {
+  void requestLocationPermissions(int requestCode, @NonNull String[] permissions);
+}

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

@@ -0,0 +1,74 @@
+/*
+ * COPYRIGHT (c) 2018 All rights reserved by HANWHA LIFE.
+ */
+package kr.co.zumo.app.lifeplus.view.screen.splash;
+
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import java.util.Arrays;
+
+import kr.co.zumo.app.lifeplus.helper.ActionBarHelper;
+import kr.co.zumo.app.lifeplus.view.screen.FragmentBase;
+
+/**
+ * SplashFragment
+ * <pre>
+ * </pre>
+ *
+ * @author 민효동
+ * @version 1.0
+ * @history 민효동   [2019-04-02]   [최초 작성]
+ * @since 2019-04-02
+ */
+public class SplashFragment extends FragmentBase<SplashPresenter> implements ISplashView {
+  @Override
+  protected View onAfterCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+    return null;
+  }
+
+  @Override
+  protected void onAfterActivityCreated(Bundle savedInstanceState) {
+  }
+
+  @Override
+  protected void defineActionBar(ActionBarHelper actionBarHelper) {
+    actionBarHelper.begin().hide();
+  }
+
+  @Override
+  protected SplashPresenter definePresenter() {
+    return new SplashPresenter(getModel(SplashModel.class), this);
+  }
+
+  @Override
+  protected void onAfterDestroyView() {
+
+  }
+
+  @Override
+  protected void onAfterDestroy() {
+
+  }
+
+  @Override
+  protected boolean isSkipScreenWhenBack() {
+    return false;
+  }
+
+  @Override
+  public void requestLocationPermissions(int requestCode, @NonNull String[] permissions) {
+    Log.i("APP# SplashFragment | requestLocationPermissions", "|" + " permissions: " + Arrays.toString(permissions));
+    requestPermissions(permissions, requestCode);
+  }
+
+  @Override
+  public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
+    presenter.onRequestPermissionsResult(requestCode, permissions, grantResults);
+  }
+}

+ 39 - 30
app/src/main/java/kr/co/zumo/app/lifeplus/activity/SplashModel.java

@@ -1,7 +1,7 @@
 /*
  * COPYRIGHT (c) 2018 All rights reserved by HANWHA LIFE.
  */
-package kr.co.zumo.app.lifeplus.activity;
+package kr.co.zumo.app.lifeplus.view.screen.splash;
 
 import android.Manifest;
 import android.content.Context;
@@ -11,6 +11,7 @@ import android.support.v4.app.ActivityCompat;
 
 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.SuperModel;
 import kr.co.zumo.app.lifeplus.model.module.APIError;
 import kr.co.zumo.app.lifeplus.model.module.APIModuleListener;
@@ -25,16 +26,47 @@ import kr.co.zumo.app.lifeplus.zumo.model.module.APIDmcyUserCnclModule;
  *
  * @author 민효동
  * @version 1.0
- * @history 민효동   [2019. 2. 20.]   [최초 작성]
- * @since 2019. 2. 20.
+ * @history 민효동   [2019-04-02]   [최초 작성]
+ * @since 2019-04-02
  */
-class SplashModel implements ISplashContract.Model {
+public class SplashModel extends Model {
+  @Override
+  protected void createViewInternal() {
 
-  private Disposable disposableCheck;
+  }
+
+  @Override
+  protected void destroyInternal() {
+
+  }
+
+  @Override
+  protected void destroyViewInternal() {
+
+  }
+
+  @Override
+  protected void startInternal() {
+
+  }
+
+  @Override
+  protected void stopInternal() {
+
+  }
+
+  @Override
+  protected void resumeInternal() {
+
+  }
+
+  @Override
+  protected void pauseInternal() {
 
-  SplashModel() {
   }
 
+  private Disposable disposableCheck;
+
   /**
    * 푸쉬 알림 설정
    *
@@ -47,7 +79,6 @@ class SplashModel implements ISplashContract.Model {
   /**
    * 푸쉬 마케팅 알림 설정
    */
-  @Override
   public void setPushEventEnabled(boolean isEnabled) {
     SuperModel.getInstance().getPreferences().setPushEventEnabled(isEnabled);
   }
@@ -55,22 +86,18 @@ class SplashModel implements ISplashContract.Model {
   /**
    * 위치 서비스 설정
    */
-  @Override
   public void setLocationServiceEnabled(boolean isEnabled) {
     SuperModel.getInstance().getPreferences().setLocationServiceEnabled(isEnabled);
   }
 
-  @Override
   public boolean getFirstPermissionCompleted() {
     return SuperModel.getInstance().getPreferences().getFirstPermissionCompleted();
   }
 
-  @Override
   public void setFirstPermissionCompleted() {
     SuperModel.getInstance().getPreferences().setFirstPermissionCompleted();
   }
 
-  @Override
   public boolean canAccessDeviceLocating(Context context) {
     LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
     if (locationManager != null) {
@@ -79,12 +106,10 @@ class SplashModel implements ISplashContract.Model {
     return false;
   }
 
-  @Override
   public boolean hasLocationPermissions(Context context) {
     return ActivityCompat.checkSelfPermission(context, getPermissionsString()) == PackageManager.PERMISSION_GRANTED;
   }
 
-  @Override
   public String getPermissionsString() {
     return Manifest.permission.ACCESS_FINE_LOCATION;
   }
@@ -96,21 +121,10 @@ class SplashModel implements ISplashContract.Model {
     }
   }
 
-  @Override
   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();
-      }
-
+    disposableCheck = new APIDmcyUserCnclModule().call(new DmcyUserCnclRequestBean(), new APIModuleListener<LifeplusAPIBean>(waiterCaller) {
       @Override
       public void onApiSuccess(LifeplusAPIBean resultBean) {
         listener.onApiSuccess(resultBean);
@@ -122,9 +136,4 @@ class SplashModel implements ISplashContract.Model {
       }
     });
   }
-
-  @Override
-  public void dispose() {
-    //
-  }
 }

+ 178 - 123
app/src/main/java/kr/co/zumo/app/lifeplus/activity/SplashPresenter.java

@@ -1,13 +1,13 @@
 /*
  * COPYRIGHT (c) 2018 All rights reserved by HANWHA LIFE.
  */
-package kr.co.zumo.app.lifeplus.activity;
+package kr.co.zumo.app.lifeplus.view.screen.splash;
 
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.provider.Settings;
-import android.support.v4.app.FragmentActivity;
+import android.support.annotation.NonNull;
 import android.util.Log;
 
 import java.util.Arrays;
@@ -16,31 +16,33 @@ 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;
+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.EmergencyBean;
 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.helper.Helper;
 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.IAPIModuleListener;
-import kr.co.zumo.app.lifeplus.model.module.IEmergency;
-import kr.co.zumo.app.lifeplus.model.module.IModuleEmergencyHandler;
+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.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.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;
 
@@ -51,33 +53,178 @@ import kr.co.zumo.app.lifeplus.zumo.bean.api.MemberInfoBean;
  *
  * @author 민효동
  * @version 1.0
- * @history 민효동   [2019. 2. 20.]   [최초 작성]
- * @since 2019. 2. 20.
+ * @history 민효동   [2019-04-02]   [최초 작성]
+ * @since 2019-04-02
  */
-public class SplashPresenter implements ISplashContract.Presenter, IModuleEmergencyHandler {
+public class SplashPresenter extends Presenter<SplashModel, ISplashView> {
 
-  private ISplashContract.Model model;
-  private ISplashContract.View view;
+  private final static int REQUEST_CODE = 9909;
 
   private CompositeDisposable disposable = new CompositeDisposable();
   private ScreenStarter starter;
 
   private boolean isRequestingLocationService = false;
 
-  SplashPresenter(ISplashContract.Model model, ISplashContract.View view) {
-    this.model = model;
-    this.view = view;
+  public SplashPresenter(SplashModel model, ISplashView view) {
+    super(model, view);
+  }
+
+  @Override
+  protected void createViewInternal() {
+
+  }
+
+  @Override
+  protected void destroyInternal() {
+
+    if (null != disposable) {
+      disposable.dispose();
+      disposable = null;
+    }
+    if (null != starter) {
+      starter.dispose();
+      starter = null;
+    }
+    view = null;
+  }
+
+  @Override
+  protected void destroyViewInternal() {
+
+  }
+
+  @Override
+  protected void startInternal() {
+
+  }
+
+  @Override
+  protected void startInternalOnce() {
+
+    // 전체 퍼미션 확인
+
+    // 앱 첫 실행시에만 실행한다.
+    if (model.getFirstPermissionCompleted()) {
+      // 이미 처리 완료했음.
+      onPermissionCompleted();
+    }
+    else {
+      model.setFirstPermissionCompleted();
+
+      launchPushPermission(() -> {
+        launchDeviceLocationPermission(() -> {
+          launchLocationPermission(() -> {
+            // 권한 처리 종료
+            onPermissionCompleted();
+          });
+        });
+      });
+    }
+  }
+
+  @Override
+  protected void stopInternal() {
+
+  }
+
+  @Override
+  protected void resumeInternal() {
+    if (isRequestingLocationService) {
+      isRequestingLocationService = false;
+
+      launchLocationPermission(() -> {
+        // 권한 처리 종료
+        onPermissionCompleted();
+      });
+    }
+  }
+
+  @Override
+  protected void pauseInternal() {
 
-    APIModuleHelper.setEmergencyHandler(this);
   }
 
+  @Override
+  protected void onEventInternal(Event event) {
+
+  }
+
+  @Override
+  public void onScreenReady() {
+
+  }
+
+  @Override
+  public void onResult(Event event) {
+
+  }
+
+  public void requestLocationPermissions(@NonNull String[] permissions) {
+    Log.i("APP# SplashPresenter | requestLocationPermissions", "|" + " permissions: " + Arrays.toString(permissions));
+    view.requestLocationPermissions(REQUEST_CODE, permissions);
+  }
+
+  public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
+    switch (requestCode) {
+      case REQUEST_CODE: {
+        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();
+        break;
+      }
+      default:
+        break;
+    }
+  }
+
+  public void linkActivity(int screenId) {
+    // 로그인/가입 같은 액티비티에서 처리됨
+    if (screenId == ScreenStarter.SCREEN_SIGN_IN || screenId == ScreenStarter.SCREEN_SIGN_UP) {
+      if (false == APIModuleHelper.isDispatched()) {
+        go(ScreenID.SIGN_IN);
+      }
+    }
+    else {
+      if (false == APIModuleHelper.isDispatched()) {
+        Intent intent = new Intent(view.getActivity(), MainActivity.class);
+        intent.putExtra(ScreenStarter.SCREEN_ID, screenId);
+        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+
+        if (false == APIModuleHelper.isDispatched()) {
+          finish();
+          ((ActivityBase) view.getActivity()).startActivity(intent, ActivityBase.SLIDE_TYPE_HOME);
+
+          doOnLink();
+        }
+      }
+    }
+  }
+
+
   private void launchLocationPermission(Runnable runnable) {
     if (model.hasLocationPermissions(view.getActivity())) {
       // 위치 앱 권한
       runnable.run();
     }
     else {
-      view.requestLocationPermissions(new String[]{model.getPermissionsString()});
+      requestLocationPermissions(new String[]{model.getPermissionsString()});
     }
   }
 
@@ -141,43 +288,6 @@ public class SplashPresenter implements ISplashContract.Presenter, IModuleEmerge
       .show();
   }
 
-  @Override
-  public void start() {
-
-    // 전체 퍼미션 확인
-
-    // 앱 첫 실행시에만 실행한다.
-    if (model.getFirstPermissionCompleted()) {
-      // 이미 처리 완료했음.
-      onPermissionCompleted();
-    }
-    else {
-      model.setFirstPermissionCompleted();
-
-      launchPushPermission(() -> {
-        launchDeviceLocationPermission(() -> {
-          launchLocationPermission(() -> {
-            // 권한 처리 종료
-            onPermissionCompleted();
-          });
-        });
-      });
-    }
-  }
-
-  @Override
-  public void onResume() {
-    if (isRequestingLocationService) {
-      isRequestingLocationService = false;
-
-      launchLocationPermission(() -> {
-        // 권한 처리 종료
-        onPermissionCompleted();
-      });
-    }
-  }
-
-  @Override
   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.
@@ -201,23 +311,6 @@ public class SplashPresenter implements ISplashContract.Presenter, IModuleEmerge
     onPermissionCompleted();
   }
 
-  @Override
-  public void dispose() {
-    if (null != disposable) {
-      disposable.dispose();
-      disposable = null;
-    }
-    if (null != model) {
-      model.dispose();
-      model = null;
-    }
-    if (null != starter) {
-      starter.dispose();
-      starter = null;
-    }
-    view = null;
-  }
-
   private void onPermissionCompleted() {
     setupInternal();
   }
@@ -230,8 +323,9 @@ public class SplashPresenter implements ISplashContract.Presenter, IModuleEmerge
     if (SuperModel.getInstance().isAppInitialized() && App.getInstance().isDisposable() == false) {
       Log.e("APP#  SplashPresenter | setupInternal", "|" + " restart from call...........");
 
-      view.finish();
-      view.onLink();
+      finish();
+
+      doOnLink();
     }
     else {
       Log.e("APP#  SplashPresenter | setupInternal", "|" + " first ...........................");
@@ -276,6 +370,10 @@ public class SplashPresenter implements ISplashContract.Presenter, IModuleEmerge
     }
   }
 
+  private void doOnLink() {
+    DynamicLinkLauncher.launch(view.getActivity());
+  }
+
   private void launchStarter(boolean isConnected) {
     Context context = App.getInstance().getContext();
     starter.launch(isConnected, (context1, fragmentFlag, memberStatus) -> {
@@ -292,7 +390,7 @@ public class SplashPresenter implements ISplashContract.Presenter, IModuleEmerge
         showRestPopup();
       }
       else {
-        view.linkActivity(fragmentFlag);
+        linkActivity(fragmentFlag);
       }
 
     });
@@ -310,10 +408,10 @@ public class SplashPresenter implements ISplashContract.Presenter, IModuleEmerge
 
   private void activateMember() {
     // 휴면 해제
-    model.activateMember(new IAPIModuleListener<LifeplusAPIBean>() {
+    model.activateMember(new APIModuleListener<LifeplusAPIBean>() {
       @Override
       public void onApiSuccess(LifeplusAPIBean resultBean) {
-        view.linkActivity(ScreenStarter.SCREEN_MAIN);
+        linkActivity(ScreenStarter.SCREEN_MAIN);
       }
 
       @Override
@@ -323,16 +421,6 @@ public class SplashPresenter implements ISplashContract.Presenter, IModuleEmerge
           exit();
         });
       }
-
-      @Override
-      public void onApiStart() {
-
-      }
-
-      @Override
-      public void onApiEnd() {
-
-      }
     });
   }
 
@@ -356,44 +444,11 @@ public class SplashPresenter implements ISplashContract.Presenter, IModuleEmerge
 
   private void gotoPlayStore() {
     // 플레이 스토어 이동
-    new AppUpdateCommand(AppUtil.getPackageName()).execute(null, new IView() {
-      @Override
-      public FragmentActivity getActivity() {
-        return view.getActivity();
-      }
-
-      @Override
-      public int getScreenId() { return 0; }
-
-      @Override
-      public <H extends Helper> H getHelper(Class<H> helperClass) { return null; }
-    }, null);
-  }
-
-  private void showPopupInvalidApp() {
-    Log.d("APP# ScreenStarter | showPopupInvalidApp", "|" + " ---------- ");
-    DialogProvider.of(view.getActivity().getSupportFragmentManager()).showErrorDialog(ResourceUtil.getString(R.string.emergency_invalid_app), () -> {
-      // 앱 종료
-      exit();
-    });
+    onCommand(new AppUpdateCommand(AppUtil.getPackageName()));
   }
 
   protected void exit() {
-    view.getActivity().finishAffinity();
-    AppInitializer.dispose();
+    onCommand(new ExitCommand());
   }
 
-  /***********************************
-   * IModuleEmergencyHandler
-   ***********************************/
-  @Override
-  public boolean onApiEmergency(IEmergency emergency) {
-    if (emergency.getEmergencyCode() == EmergencyBean.CODE_INVALID_APP) {
-      // 미인증 앱
-      showPopupInvalidApp();
-      return true;
-    }
-
-    return false;
-  }
 }

+ 8 - 6
app/src/main/res/layout/activity_splash.xml

@@ -7,12 +7,14 @@
   android:layout_height="match_parent"
   >
 
-  <!--<ImageView-->
-    <!--android:layout_width="wrap_content"-->
-    <!--android:layout_height="wrap_content"-->
-    <!--android:layout_gravity="center"-->
-    <!--app:srcCompat="@drawable/splash_zumo_logo"-->
-    <!--/>-->
+
+  <android.support.constraint.ConstraintLayout
+    android:id="@+id/container_main"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="@android:color/transparent"
+    android:orientation="vertical"
+    />
 
   <ImageView
     android:layout_width="wrap_content"