Browse Source

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

Hasemi 6 years ago
parent
commit
0412527731

+ 4 - 3
app/build.gradle

@@ -156,9 +156,10 @@ dependencies {
     implementation 'com.android.support:recyclerview-v7:27.1.1'
     implementation "android.arch.lifecycle:extensions:1.1.1"
     implementation "android.arch.lifecycle:viewmodel:1.1.1"
-    implementation 'com.google.firebase:firebase-messaging:17.4.0'
-    implementation 'com.google.firebase:firebase-dynamic-links:16.1.7'
-    implementation 'com.google.firebase:firebase-core:16.0.7'
+    implementation 'com.google.firebase:firebase-messaging:17.5.0'
+    implementation 'com.google.firebase:firebase-dynamic-links:16.1.8'
+    implementation 'com.google.firebase:firebase-core:16.0.8'
+    implementation 'com.google.firebase:firebase-config:16.4.1'
 
     /*********************************
      * External lib

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

@@ -267,7 +267,7 @@ public abstract class ActivityBase extends AppCompatActivity implements IHelperP
     if (allowCountActivity()) {
       App.getInstance().removeActivityCount();
       if (App.getInstance().isDisposable()) {
-        AppInitializer.dispose(this);
+        AppInitializer.dispose();
       }
     }
   }

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

@@ -53,10 +53,10 @@ public class AppInitializer {
   /**
    * 앱 종료 설정
    */
-  public static void dispose(Context context) {
+  public static void dispose() {
 
     // 캐쉬 제거
-//    new Thread(() -> Glide.get(context).clearDiskCache()).start();
+//    new Thread(() -> Glide.get(App.getInstance().getContext()).clearDiskCache()).start();
 
     SuperModel.getInstance().dispose();
 

+ 5 - 47
app/src/main/java/kr/co/zumo/app/lifeplus/activity/ScreenStarter.java

@@ -9,7 +9,6 @@ import android.util.Log;
 
 import io.reactivex.disposables.Disposable;
 import kr.co.zumo.app.R;
-import kr.co.zumo.app.lifeplus.bean.api.EmergencyBean;
 import kr.co.zumo.app.lifeplus.bean.api.LoginResultBean;
 import kr.co.zumo.app.lifeplus.bean.api.PopupInfoListBean;
 import kr.co.zumo.app.lifeplus.bean.api.PopupInfoResultBean;
@@ -20,12 +19,9 @@ import kr.co.zumo.app.lifeplus.model.module.APIError;
 import kr.co.zumo.app.lifeplus.model.module.APIGuestModule;
 import kr.co.zumo.app.lifeplus.model.module.APILoginStatusMapper;
 import kr.co.zumo.app.lifeplus.model.module.APIMemberSelectModule;
-import kr.co.zumo.app.lifeplus.model.module.APIModuleHelper;
 import kr.co.zumo.app.lifeplus.model.module.APIModuleListener;
 import kr.co.zumo.app.lifeplus.model.module.APIModuleSimpleListener;
 import kr.co.zumo.app.lifeplus.model.module.APIPopupLoadModule;
-import kr.co.zumo.app.lifeplus.model.module.IEmergency;
-import kr.co.zumo.app.lifeplus.model.module.IModuleEmergencyHandler;
 import kr.co.zumo.app.lifeplus.supervisor.ActivityDeliveryHelper;
 import kr.co.zumo.app.lifeplus.tool.ReviewCounter;
 import kr.co.zumo.app.lifeplus.util.ResourceUtil;
@@ -45,7 +41,7 @@ import kr.co.zumo.app.lifeplus.view.screen.main.SystemPopupManager;
  * @history 민효동   [2018-09-29]   [최초 작성]
  * @since 2018-09-29
  */
-public class ScreenStarter implements IModuleEmergencyHandler {
+public class ScreenStarter {
 
   public static final String SCREEN_ID = "screenId";
 
@@ -69,7 +65,6 @@ public class ScreenStarter implements IModuleEmergencyHandler {
     this.fragmentActivity = activity;
 
     loadingDriver = new LoadingDriver();
-    APIModuleHelper.setEmergencyHandler(this);
   }
 
   /**
@@ -245,51 +240,14 @@ public class ScreenStarter implements IModuleEmergencyHandler {
     }
   }
 
-  /***********************************
-   * IModuleEmergencyHandler
-   ***********************************/
-  @Override
-  public boolean onApiEmergency(IEmergency emergency) {
-    /*
-    멀티 디바이스 사용 등의 경우 api 호출 시 특정 값을 반환하므로 이를 처리한다.
-     */
-    if (emergency.getEmergencyCode() == EmergencyBean.CODE_MULTI_DEVICE) {
-      // 멀티 디바이스
-      showPopupMultiDevice();
-      return true;
-    }
-    else if (emergency.getEmergencyCode() == EmergencyBean.CODE_INVALID_APP) {
-      // 미인증 앱
-      showPopupInvalidApp();
-      return true;
-    }
-
-    return false;
-  }
-
   protected void exit() {
     fragmentActivity.finishAffinity();
-    AppInitializer.dispose(fragmentActivity);
-  }
-
-  private void showPopupMultiDevice() {
-    DialogProvider.of(fragmentActivity.getSupportFragmentManager()).showPopupMultiDevice(() -> {
-      // 잠금 화면으로 이동
-      gotoScreen(SCREEN_MULTI_DEVICE);
-    }, () -> {
-      // 앱 종료
-      exit();
-    });
-  }
-
-  private void showPopupInvalidApp() {
-    Log.d("APP# ScreenStarter | showPopupInvalidApp", "|" + " ---------- ");
-    DialogProvider.of(fragmentActivity.getSupportFragmentManager()).showErrorDialog(ResourceUtil.getString(R.string.emergency_invalid_app), () -> {
-      // 앱 종료
-      exit();
-    });
+    AppInitializer.dispose();
   }
 
+  /***********************************
+   * interface
+   ***********************************/
   public interface IListener {
     void onScreenSelected(Context context, int fragmentFlag);
   }

+ 57 - 1
app/src/main/java/kr/co/zumo/app/lifeplus/activity/SplashPresenter.java

@@ -16,16 +16,23 @@ import io.reactivex.disposables.CompositeDisposable;
 import io.reactivex.schedulers.Schedulers;
 import kr.co.zumo.app.R;
 import kr.co.zumo.app.lifeplus.application.App;
+import kr.co.zumo.app.lifeplus.bean.api.EmergencyBean;
 import kr.co.zumo.app.lifeplus.config.NetworkConfigProvider;
 import kr.co.zumo.app.lifeplus.helper.AppShieldHelper;
+import kr.co.zumo.app.lifeplus.helper.AppVersionHelper;
 import kr.co.zumo.app.lifeplus.helper.FirebaseHelper;
 import kr.co.zumo.app.lifeplus.model.SuperModel;
 import kr.co.zumo.app.lifeplus.model.SuperModelInit;
+import kr.co.zumo.app.lifeplus.model.module.APIModuleHelper;
+import kr.co.zumo.app.lifeplus.model.module.IEmergency;
+import kr.co.zumo.app.lifeplus.model.module.IModuleEmergencyHandler;
 import kr.co.zumo.app.lifeplus.network.NetworkWatcher;
+import kr.co.zumo.app.lifeplus.util.ResourceUtil;
 import kr.co.zumo.app.lifeplus.view.Event;
 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;
 
 /**
@@ -38,7 +45,7 @@ import kr.co.zumo.app.lifeplus.view.dialog.ICustomConfirmListener;
  * @history 민효동   [2019. 2. 20.]   [최초 작성]
  * @since 2019. 2. 20.
  */
-public class SplashPresenter implements ISplashContract.Presenter {
+public class SplashPresenter implements ISplashContract.Presenter, IModuleEmergencyHandler {
 
   private ISplashContract.Model model;
   private ISplashContract.View view;
@@ -51,6 +58,8 @@ public class SplashPresenter implements ISplashContract.Presenter {
   SplashPresenter(ISplashContract.Model model, ISplashContract.View view) {
     this.model = model;
     this.view = view;
+
+    APIModuleHelper.setEmergencyHandler(this);
   }
 
   private void launchLocationPermission(Runnable runnable) {
@@ -224,6 +233,7 @@ public class SplashPresenter implements ISplashContract.Presenter {
       starter = new ScreenStarter(view.getActivity());
 
       AppShieldHelper.getInstance().checkApp(context);
+      AppVersionHelper.getInstance().fetch(view.getActivity());
 
       // 네트워크 연결 체크
       disposable.add(
@@ -248,4 +258,50 @@ public class SplashPresenter implements ISplashContract.Presenter {
       );
     }
   }
+
+  private void showPopupMultiDevice() {
+    DialogProvider.of(view.getActivity().getSupportFragmentManager()).showPopupMultiDevice(() -> {
+      // 잠금 화면으로 이동
+      dispose();
+      view.linkActivity(ScreenStarter.SCREEN_MULTI_DEVICE);
+    }, () -> {
+      // 앱 종료
+      exit();
+    });
+  }
+
+  private void showPopupInvalidApp() {
+    Log.d("APP# ScreenStarter | showPopupInvalidApp", "|" + " ---------- ");
+    DialogProvider.of(view.getActivity().getSupportFragmentManager()).showErrorDialog(ResourceUtil.getString(R.string.emergency_invalid_app), () -> {
+      // 앱 종료
+      exit();
+    });
+  }
+
+  protected void exit() {
+    view.getActivity().finishAffinity();
+    AppInitializer.dispose();
+  }
+
+  /***********************************
+   * IModuleEmergencyHandler
+   ***********************************/
+  @Override
+  public boolean onApiEmergency(IEmergency emergency) {
+    /*
+    멀티 디바이스 사용 등의 경우 api 호출 시 특정 값을 반환하므로 이를 처리한다.
+     */
+    if (emergency.getEmergencyCode() == EmergencyBean.CODE_MULTI_DEVICE) {
+      // 멀티 디바이스
+      showPopupMultiDevice();
+      return true;
+    }
+    else if (emergency.getEmergencyCode() == EmergencyBean.CODE_INVALID_APP) {
+      // 미인증 앱
+      showPopupInvalidApp();
+      return true;
+    }
+
+    return false;
+  }
 }

+ 1 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/bean/api/EmergencyBean.java

@@ -21,6 +21,7 @@ public class EmergencyBean extends JsonBeanBase implements IEmergency {
   public static final int CODE_COMMON = -1111;
   public static final int CODE_MULTI_DEVICE = -2222;
   public static final int CODE_INVALID_APP = -3333;
+  public static final int CODE_FORCE_APP_UPDATE = -4444;
 
   private int code;
 

+ 110 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/helper/AppVersionHelper.java

@@ -0,0 +1,110 @@
+/*
+ * COPYRIGHT (c) 2018 All rights reserved by HANWHA LIFE.
+ */
+package kr.co.zumo.app.lifeplus.helper;
+
+import android.app.Activity;
+import android.util.Log;
+
+import com.google.firebase.remoteconfig.FirebaseRemoteConfig;
+
+import java.util.concurrent.TimeUnit;
+
+import io.reactivex.Completable;
+import io.reactivex.disposables.Disposable;
+import kr.co.zumo.app.lifeplus.bean.api.EmergencyBean;
+import kr.co.zumo.app.lifeplus.model.module.APIModuleHelper;
+import kr.co.zumo.app.lifeplus.util.AppUtil;
+import kr.co.zumo.app.lifeplus.util.StringUtil;
+
+/**
+ * AppVersionHelper
+ * <pre>
+ * </pre>
+ *
+ * @author 민효동
+ * @version 1.0
+ * @history 민효동   [2019-03-28]   [최초 작성]
+ * @since 2019-03-28
+ */
+public class AppVersionHelper {
+  private static AppVersionHelper ourInstance = new AppVersionHelper();
+
+  public static AppVersionHelper getInstance() {
+    return ourInstance;
+  }
+
+  private AppVersionHelper() {
+  }
+
+  private Disposable disposable;
+  private FirebaseRemoteConfig firebaseRemoteConfig;
+
+  private String VERSION_LATEST = "newerVersion";
+  private String VERSION_FORCE = "newerVersion";
+
+  /**
+   * dispose
+   */
+  public void dispose() {
+    if (null != disposable) {
+      disposable.dispose();
+      disposable = null;
+    }
+  }
+
+  public void fetch(Activity activity) {
+    firebaseRemoteConfig = FirebaseRemoteConfig.getInstance();
+    firebaseRemoteConfig.fetch(0)
+      .addOnCompleteListener(activity, task -> {
+        if (task.isSuccessful()) {
+          // After config data is successfully fetched, it must be activated before newly fetched
+          // values are returned.
+          firebaseRemoteConfig.activateFetched();
+
+          String currentVersion = getVersion("");
+
+          // 강제 업데이트 검사
+          if (StringUtil.hasNewVersion(currentVersion, getForceVersion())) {
+            dispatchInvalidAppEvent();
+          }
+        }
+        else {
+          // fail, ignored
+        }
+      });
+  }
+
+  /**
+   * 최신 버젼
+   *
+   * @return
+   */
+  public String getLatestVersion() {
+    String version = firebaseRemoteConfig.getString(VERSION_LATEST);
+    return getVersion(version);
+  }
+
+  /**
+   * 강제 업데이트 버젼
+   *
+   * @return
+   */
+  private String getForceVersion() {
+    String version = firebaseRemoteConfig.getString(VERSION_FORCE);
+    return getVersion(version);
+  }
+
+  private String getVersion(String version) {
+    return StringUtil.isFull(version) ? version : StringUtil.getPureVersionString(AppUtil.getVersionName(), 3);
+  }
+
+  private void dispatchInvalidAppEvent() {
+    boolean consumed = APIModuleHelper.dispatchEmergencyEvent(new EmergencyBean(EmergencyBean.CODE_FORCE_APP_UPDATE));
+    if (false == consumed) {
+      Log.d("APP# AppVersionHelper | dispatchInvalidAppEvent", "|" + "------------ again.......");
+      disposable = Completable.timer(500, TimeUnit.MILLISECONDS)
+        .subscribe(this::dispatchInvalidAppEvent);
+    }
+  }
+}

+ 1 - 1
app/src/main/java/kr/co/zumo/app/lifeplus/model/module/APIModule.java

@@ -167,7 +167,7 @@ public abstract class APIModule<T extends JsonBeanBase, B extends APIBean> imple
           code = EmergencyBean.CODE_MULTI_DEVICE;
         }
 
-        APIModuleHelper.dispatchEmergencyEvent(new EmergencyBean(code));
+        boolean consumed = APIModuleHelper.dispatchEmergencyEvent(new EmergencyBean(code));
 
         return;
       }

+ 19 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/util/StringUtil.java

@@ -274,6 +274,25 @@ public class StringUtil {
     return result;
   }
 
+  /**
+   * 버젼 비교
+   *
+   * @param currentVersionString
+   * @param newVersionString
+   * @return
+   */
+  public static boolean hasNewVersion(String currentVersionString, String newVersionString) {
+    if (isEmpty(currentVersionString)) {
+      currentVersionString = "0.0";
+    }
+    if (isEmpty(newVersionString)) {
+      newVersionString = "0.0";
+    }
+    Version currentVersion = new Version(currentVersionString);
+    Version newVersion = new Version(newVersionString);
+    return currentVersion.compareTo(newVersion) < 0;
+  }
+
   /**
    * 밑 줄 그어진 html 텍스트
    *

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

@@ -6,12 +6,13 @@ package kr.co.zumo.app.lifeplus.view.screen.setting;
 import android.util.Log;
 
 import io.reactivex.disposables.Disposable;
-import kr.co.zumo.app.lifeplus.bean.api.LifeplusAPIBean;
 import kr.co.zumo.app.lifeplus.bean.api.APIData;
+import kr.co.zumo.app.lifeplus.bean.api.LifeplusAPIBean;
 import kr.co.zumo.app.lifeplus.bean.api.MemberPushAgreeRequestBean;
 import kr.co.zumo.app.lifeplus.bean.api.RequestBean;
 import kr.co.zumo.app.lifeplus.bean.api.SettingMemberBean;
 import kr.co.zumo.app.lifeplus.bean.api.SettingMemberResultBean;
+import kr.co.zumo.app.lifeplus.helper.AppVersionHelper;
 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;
@@ -19,7 +20,6 @@ import kr.co.zumo.app.lifeplus.model.module.APIMemberPushUpdateModule;
 import kr.co.zumo.app.lifeplus.model.module.APIModuleListener;
 import kr.co.zumo.app.lifeplus.util.AppUtil;
 import kr.co.zumo.app.lifeplus.util.StringUtil;
-import kr.co.zumo.app.lifeplus.util.Version;
 import kr.co.zumo.app.lifeplus.view.Event;
 
 /**
@@ -149,10 +149,7 @@ public class SettingModel extends Model {
 
     Log.i("APP# SettingPresenter | setVersion", "|" + "current: " + currentVersionString + ", new: " + newVersionString);
 
-    Version currentVersion = new Version(currentVersionString);
-    Version newVersion = new Version(newVersionString);
-
-    return currentVersion.compareTo(newVersion) == -1;
+    return StringUtil.hasNewVersion(currentVersionString, newVersionString);
   }
 
   public String getCurrentVersion() {
@@ -160,8 +157,7 @@ public class SettingModel extends Model {
   }
 
   public String getNewVersion() {
-    // fixme 별도의 API 필요
-    String newVersionString = "";
+    String newVersionString = AppVersionHelper.getInstance().getLatestVersion();
     return StringUtil.isFull(newVersionString) ? StringUtil.getPureVersionString(newVersionString) : "0";
   }
 

+ 12 - 0
app/src/test/java/kr/co/zumo/app/lifeplus/util/StringUtilTest.java

@@ -95,5 +95,17 @@ public class StringUtilTest {
     assertEquals("4.0.0", StringUtil.getPureVersionString("v4.0.0.4-sandbox-debug", 3));
     assertEquals("4.0.0.4", StringUtil.getPureVersionString("v4.0.0.4-sandbox-debug", 4));
     assertEquals("4.0.0.4", StringUtil.getPureVersionString("v4.0.0.4-sandbox-debug", 5));
+    assertEquals("4.0.0", StringUtil.getPureVersionString("v4.0.0", 4));
+    assertEquals("4.0.0", StringUtil.getPureVersionString("v4.0.0", 5));
+  }
+
+  @Test
+  public void hasNewVersion() {
+    assertFalse(StringUtil.hasNewVersion(StringUtil.getPureVersionString("v4.0.0.4-sandbox-debug"), ""));
+    assertFalse(StringUtil.hasNewVersion(StringUtil.getPureVersionString("v4.0.0.4-sandbox-debug"), "4.0.0"));
+    assertFalse(StringUtil.hasNewVersion(StringUtil.getPureVersionString("v4.0.0.126"), "4.0.0"));
+    assertTrue(StringUtil.hasNewVersion(StringUtil.getPureVersionString("v4.0.0.126"), "4.0.0.127"));
+
+    assertTrue(StringUtil.hasNewVersion(StringUtil.getPureVersionString("v3.1110.11110.126"), "4.0.0"));
   }
 }