Browse Source

[공통][New] 액티비티 뷰를 프래그먼트로 전환 준비 중

hyodong.min 7 years ago
parent
commit
ac7da5b601

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

@@ -4,7 +4,6 @@
 package kr.co.zumo.app.lifeplus.activity;
 
 import android.app.Activity;
-import android.arch.lifecycle.ViewModelProviders;
 import android.os.Bundle;
 import android.support.annotation.CallSuper;
 import android.support.v7.app.AppCompatActivity;
@@ -14,6 +13,7 @@ import android.view.MenuItem;
 import io.reactivex.disposables.CompositeDisposable;
 import kr.co.zumo.app.lifeplus.manager.ActionBarManager;
 import kr.co.zumo.app.lifeplus.model.Model;
+import kr.co.zumo.app.lifeplus.model.ModelProvider;
 import kr.co.zumo.app.lifeplus.network.NetworkReceiver;
 import kr.co.zumo.app.lifeplus.supervisor.DialogHelper;
 import kr.co.zumo.app.lifeplus.view.IView;
@@ -61,7 +61,7 @@ public abstract class ActivityBase<P extends Presenter> extends AppCompatActivit
   @CallSuper
   @Override
   protected void onDestroy() {
-    Log.w("APP# ActivityBase | onDestroy", "| >>>>>>>>>>>>>> " + this.getClass().getSimpleName());
+    Log.w("APP# ActivityBase | onDestroy", "| <<<<<<<<<<<<< " + this.getClass().getSimpleName());
 
     if (null != networkReceiver) {
       networkReceiver.dispose();
@@ -196,11 +196,21 @@ public abstract class ActivityBase<P extends Presenter> extends AppCompatActivit
    * - 사실 MVVM 사용되는 ViewModel 이지만 MVP 의 Model 로 사용한다.
    * - Activity 의 종속성을 이용하여 Model 을 참조하기 위함
    *
-   * @param className MainModel.class
+   * @param modelClass MainModel.class
    * @return new MainModel()
    */
-  protected <T extends Model> T getModel(Class<T> className) {
-    return ViewModelProviders.of(this).get(className);
+  protected <T extends Model> T getModel(Class<T> modelClass) {
+    return ModelProvider.getModel(this, modelClass);
+  }
+
+  /**
+   * 해당 모델 클리어.
+   * - Model.onCleared() 호출됨
+   *
+   * @param modelClass
+   */
+  protected void clearModel(Class modelClass) {
+    ModelProvider.clearModel(this, modelClass);
   }
 
   /***********************************

+ 1 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/model/Model.java

@@ -110,6 +110,7 @@ public abstract class Model extends ViewModel implements ILifeCycle {
    * @param presenter
    */
   public void setPresenter(Presenter presenter) {
+    Log.w("APP# Model | setPresenter", "|" + presenter.getClass().getSimpleName());
     this.presenter = presenter;
   }
 

+ 53 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/model/ModelProvider.java

@@ -0,0 +1,53 @@
+/*
+ * COPYRIGHT (c) 2018 All rights reserved by HANWHA LIFE.
+ */
+package kr.co.zumo.app.lifeplus.model;
+
+import android.arch.lifecycle.ViewModelProviders;
+import android.support.v4.app.FragmentActivity;
+import android.util.Log;
+
+/**
+ * ModelProvider
+ * <pre>
+ * </pre>
+ *
+ * @author 민효동
+ * @version 1.0
+ * @history 민효동   [2018-10-09]   [최초 작성]
+ * @since 2018-10-09
+ */
+public class ModelProvider {
+
+  /**
+   * Android life-cycle 에 귀속되는 모델을 반환한다.
+   * - 사실 MVVM 사용되는 ViewModel 이지만 MVP 의 Model 로 사용한다.
+   * - Activity 의 종속성을 이용하여 Model 을 참조하기 위함
+   * - key 를 지정하여 clear 가능하도록 준비한다.
+   *
+   * @param activity   FragmentActivity
+   * @param modelClass MainModel.class
+   * @return new MainModel()
+   */
+  public static <T extends Model> T getModel(FragmentActivity activity, Class<T> modelClass) {
+    Log.e("APP#  ModelProvider | getModel", "|" + modelClass.getCanonicalName());
+    return ViewModelProviders.of(activity).get(modelClass.getCanonicalName(), modelClass);
+  }
+
+  /**
+   * 저장된 모델을 clear
+   * - 실제로는 BlankModel 로 해당 key 에 덮어 쓰기한다.
+   * - 다음에 같은 key 로 요청(getModel())되면 새로운 모델이 생성된다.
+   *
+   * @param activity   FragmentActivity
+   * @param modelClass MainModel.class
+   */
+  public static void clearModel(FragmentActivity activity, Class<? extends Model> modelClass) {
+    Log.e("APP#  ModelProvider | clearModel", "|" + modelClass.getCanonicalName());
+    Model model = getModel(activity, modelClass);
+    model.onCleared();
+
+    // 다음 modelClass 를 요청하면 재생성되도록 빈 모델로 채워둔다.
+    ViewModelProviders.of(activity).get(modelClass.getCanonicalName(), BlankModel.class);
+  }
+}

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

@@ -6,7 +6,6 @@ package kr.co.zumo.app.lifeplus.supervisor;
 import android.content.Context;
 import android.graphics.Typeface;
 import android.support.v4.content.res.ResourcesCompat;
-import android.util.Log;
 
 import java.lang.reflect.Field;
 import java.util.HashMap;
@@ -94,7 +93,7 @@ public class TypefaceUtil {
       Map<String, Typeface> oldFonts = new HashMap<>();
 
       for (Map.Entry<?, ?> entry : tempMap.entrySet()) {
-        Log.w("APP# TypefaceUtil | overrideFonts", "|" + entry.getKey());
+//        Log.w("APP# TypefaceUtil | overrideFonts", "|" + entry.getKey());
         oldFonts.put((String) entry.getKey(), (Typeface) entry.getValue());
       }
 

+ 14 - 5
app/src/main/java/kr/co/zumo/app/lifeplus/view/fragment/FragmentBase.java

@@ -3,7 +3,6 @@
  */
 package kr.co.zumo.app.lifeplus.view.fragment;
 
-import android.arch.lifecycle.ViewModelProviders;
 import android.os.Bundle;
 import android.support.annotation.CallSuper;
 import android.support.annotation.NonNull;
@@ -16,6 +15,7 @@ import android.view.ViewGroup;
 
 import io.reactivex.disposables.CompositeDisposable;
 import kr.co.zumo.app.lifeplus.model.Model;
+import kr.co.zumo.app.lifeplus.model.ModelProvider;
 import kr.co.zumo.app.lifeplus.view.IView;
 import kr.co.zumo.app.lifeplus.view.presenter.Presenter;
 
@@ -79,7 +79,7 @@ public abstract class FragmentBase<P extends Presenter> extends Fragment impleme
   @CallSuper
   @Override
   public void onDestroyView() {
-    Log.w("APP# FragmentBase | onDestroyView", "| >>>>>>>>>>>>>> " + this.getClass().getSimpleName());
+    Log.w("APP# FragmentBase | onDestroyView", "| <<<<<<<<<<<<< " + this.getClass().getSimpleName());
 
     if (null != disposable) {
       disposable.dispose();
@@ -115,13 +115,22 @@ public abstract class FragmentBase<P extends Presenter> extends Fragment impleme
    * - 사실 MVVM 사용되는 ViewModel 이지만 MVP 의 Model 로 사용한다.
    * - Activity 의 종속성을 이용하여 Model 을 참조하기 위함
    *
-   * @param className MainModel.class
+   * @param modelClass MainModel.class
    * @return new MainModel()
    */
-  protected <T extends Model> T getModel(Class<T> className) {
-    return ViewModelProviders.of(getActivity()).get(className);
+  protected <T extends Model> T getModel(Class<T> modelClass) {
+    return ModelProvider.getModel(getActivity(), modelClass);
   }
 
+  /**
+   * 해당 모델 클리어.
+   * - Model.onCleared() 호출됨
+   *
+   * @param modelClass
+   */
+  protected void clearModel(Class modelClass) {
+    ModelProvider.clearModel(getActivity(), modelClass);
+  }
 
   /***********************************
    * IView

+ 2 - 1
app/src/main/java/kr/co/zumo/app/lifeplus/view/presenter/Presenter.java

@@ -34,6 +34,7 @@ public abstract class Presenter<M extends Model, V extends IView> implements ILi
   protected Command command;
 
   public Presenter(M model, V view) {
+    Log.i("APP# Presenter | constructor", "|" + "------------------------->> " + this.getClass().getSimpleName());
     this.model = model;
     this.view = view;
 
@@ -123,7 +124,7 @@ public abstract class Presenter<M extends Model, V extends IView> implements ILi
    ***********************************/
   protected void onCommand(Command command) {
     this.command = command;
-    Log.w("APP# Presenter | onCommand", "| command: " + command.getClass().getSimpleName() + ", " + new Gson().toJson(command));
+    Log.w("APP# Presenter | onCommand", "| " + this.getClass().getSimpleName() + ", command: " + command.getClass().getSimpleName() + ", " + new Gson().toJson(command));
     command.preExecute(model, view, this);
     command.execute(model, view, this);
     command.postExecute(model, view, this);

+ 32 - 0
app/src/main/res/font/font1.xml

@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<font-family xmlns:android="http://schemas.android.com/apk/res/android"
+             xmlns:app="http://schemas.android.com/apk/res-auto">
+
+  <!-- normal -->
+  <font
+    android:font="@font/droid_sans"
+    android:fontStyle="normal"
+    android:fontWeight="400"
+    app:font="@font/droid_sans"
+    app:fontStyle="normal"
+    app:fontWeight="400"/>
+
+  <!-- italic -->
+  <font
+    android:font="@font/droid_sans"
+    android:fontStyle="italic"
+    android:fontWeight="400"
+    app:font="@font/droid_sans"
+    app:fontStyle="italic"
+    app:fontWeight="400"/>
+
+  <!-- bold -->
+  <font
+    android:font="@font/droid_sans"
+    android:fontStyle="normal"
+    android:fontWeight="700"
+    app:font="@font/droid_sans"
+    app:fontStyle="normal"
+    app:fontWeight="700"/>
+
+</font-family>

+ 1 - 2
app/src/test/java/kr/co/zumo/app/lifeplus/activity/MainActivityTest.java

@@ -3,7 +3,6 @@ package kr.co.zumo.app.lifeplus.activity;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.robolectric.Robolectric;
 import org.robolectric.RobolectricTestRunner;
 
 @RunWith(RobolectricTestRunner.class)
@@ -16,7 +15,7 @@ public class MainActivityTest {
 
   @Test
   public void getAppSetting() {
-    MainActivity activity = Robolectric.setupActivity(MainActivity.class);
+//    MainActivity activity = Robolectric.setupActivity(MainActivity.class);
 
 //    IAppSetting appSetting = activity.getAppSetting();
 //

+ 69 - 0
app/src/test/java/kr/co/zumo/app/lifeplus/model/ModelProviderTest.java

@@ -0,0 +1,69 @@
+package kr.co.zumo.app.lifeplus.model;
+
+import android.support.v7.app.AppCompatActivity;
+
+import org.junit.Test;
+import org.robolectric.annotation.Config;
+
+import kr.co.zumo.app.BuildConfig;
+
+/**
+ * ModelProviderTest
+ * <pre>
+ * </pre>
+ *
+ * @author 민효동
+ * @version 1.0
+ * @history 민효동   [2018-10-09]   [최초 작성]
+ * @since 2018-10-09
+ */
+@Config(constants = BuildConfig.class, sdk = 19)
+//@RunWith(RobolectricTestRunner.class)
+public class ModelProviderTest {
+
+  @Test
+  public void getModel() {
+
+    /**
+     * todo android framework 에 의존도가 높아서 테스트 불가, 안드로이드 테스트로 실행 요망
+     */
+
+//    TestActivity activity = mock(TestActivity.class);
+//    when(activity.getApplication()).thenReturn(new Application());
+//
+//    TestModel testModel = ModelProvider.getModel(activity, TestModel.class);
+//
+//    assertTrue(testModel != null);
+  }
+
+  @Test
+  public void clearModel() {
+  }
+
+  public class TestActivity extends AppCompatActivity {
+
+  }
+
+  public class TestModel extends Model {
+
+    @Override
+    protected void destroyInternal() {
+    }
+
+    @Override
+    protected void startInternal() {
+    }
+
+    @Override
+    protected void stopInternal() {
+    }
+
+    @Override
+    protected void resumeInternal() {
+    }
+
+    @Override
+    protected void pauseInternal() {
+    }
+  }
+}