From e5b5b8eaa9517cc701257a8faa4bccdc9588ceda Mon Sep 17 00:00:00 2001 From: Daniel Date: Mon, 21 Aug 2017 11:22:11 +0200 Subject: [PATCH 01/10] Update dependencies --- build.gradle | 5 ++++- library/build.gradle | 9 +++++---- sample/build.gradle | 9 +++++---- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/build.gradle b/build.gradle index 9b4bc30..72ff9fb 100644 --- a/build.gradle +++ b/build.gradle @@ -3,13 +3,16 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:2.3.1' + classpath 'com.android.tools.build:gradle:2.3.3' } } allprojects { repositories { jcenter() + maven { + url "https://maven.google.com" + } } group = 'eu.inloop' diff --git a/library/build.gradle b/library/build.gradle index 9fc4421..d0710b5 100644 --- a/library/build.gradle +++ b/library/build.gradle @@ -2,12 +2,12 @@ apply plugin: 'com.android.library' apply plugin: 'maven' android { - compileSdkVersion 25 - buildToolsVersion '25.0.2' + compileSdkVersion 26 + buildToolsVersion '25.0.3' defaultConfig { minSdkVersion 15 - targetSdkVersion 25 + targetSdkVersion 26 versionCode 1 versionName VERSION_NAME consumerProguardFiles 'proguard-rules.pro' @@ -25,7 +25,8 @@ android { } dependencies { - compile 'com.android.support:appcompat-v7:25.3.1' + compile 'com.android.support:support-fragment:26.0.1' + compile 'com.android.support:appcompat-v7:26.0.1' } task androidJavadocs(type: Javadoc) { diff --git a/sample/build.gradle b/sample/build.gradle index 75382a5..912c8c0 100644 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -1,13 +1,13 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 25 - buildToolsVersion '25.0.2' + compileSdkVersion 26 + buildToolsVersion '25.0.3' defaultConfig { applicationId 'eu.inloop.viewmodel.sample' minSdkVersion 15 - targetSdkVersion 25 + targetSdkVersion 26 versionCode 1 versionName '1.0' } @@ -30,7 +30,8 @@ android { } dependencies { - compile 'com.android.support:appcompat-v7:25.3.1' + compile 'com.android.support:support-fragment:26.0.1' + compile 'com.android.support:appcompat-v7:26.0.1' debugCompile 'com.squareup.leakcanary:leakcanary-android:1.4' releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.4' compile 'com.jakewharton:butterknife:5.1.2' From 605bf233946a50ed9cb0f3b16ba579f5d38ff715 Mon Sep 17 00:00:00 2001 From: Daniel Date: Mon, 21 Aug 2017 11:23:42 +0200 Subject: [PATCH 02/10] Updated dependencies --- CHANGELOG.md | 4 ++++ README.md | 2 +- gradle.properties | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d95d9f1..f10c09e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.3.2(2017-21-8) + +- Updated dependencies (Support library, build tools, gradle) + ## 1.3.1(2017-20-2) - Critical issue fixed that was introduced two days ago in 1.3.0 - please update to 1.3.1 (issue is related to the new getViewOptional() method). diff --git a/README.md b/README.md index 35ef404..002d579 100644 --- a/README.md +++ b/README.md @@ -112,7 +112,7 @@ Download -------- ```groovy -compile 'eu.inloop:androidviewmodel:1.3.1' +compile 'eu.inloop:androidviewmodel:1.3.2' ``` ## Android Studio Template diff --git a/gradle.properties b/gradle.properties index 1ae26a3..49a58fb 100644 --- a/gradle.properties +++ b/gradle.properties @@ -17,4 +17,4 @@ # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # org.gradle.parallel=true -VERSION_NAME=1.3.1 \ No newline at end of file +VERSION_NAME=1.3.2 \ No newline at end of file From f67a536ac033f0499caa54f582db78971d3064a0 Mon Sep 17 00:00:00 2001 From: Daniel Date: Mon, 21 Aug 2017 12:19:51 +0200 Subject: [PATCH 03/10] Fix generic viewmodel issue --- library/src/main/java/eu/inloop/viewmodel/ProxyViewHelper.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/library/src/main/java/eu/inloop/viewmodel/ProxyViewHelper.java b/library/src/main/java/eu/inloop/viewmodel/ProxyViewHelper.java index ffa6b66..51708af 100644 --- a/library/src/main/java/eu/inloop/viewmodel/ProxyViewHelper.java +++ b/library/src/main/java/eu/inloop/viewmodel/ProxyViewHelper.java @@ -34,6 +34,9 @@ public static Class getGenericType(@NonNull Class in, @NonNull Class wh if (genericSuperclass instanceof ParameterizedType) { final Type[] typeArgs = ((ParameterizedType) genericSuperclass).getActualTypeArguments(); for (Type arg : typeArgs) { + if (arg instanceof ParameterizedType) { + arg = ((ParameterizedType) arg).getRawType(); + } if (arg instanceof Class) { final Class argClass = (Class) arg; if (whichExtends.isAssignableFrom(argClass)) { From 3f4a94536b1bd9fd826812e081eba3b52573c187 Mon Sep 17 00:00:00 2001 From: Daniel Date: Mon, 21 Aug 2017 12:21:23 +0200 Subject: [PATCH 04/10] Bump version to 1.3.3 --- CHANGELOG.md | 4 ++++ README.md | 2 +- gradle.properties | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f10c09e..fb6611c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.3.3(2017-21-8) + +- Fix issue where viewmodels with generic types would not work correctly. + ## 1.3.2(2017-21-8) - Updated dependencies (Support library, build tools, gradle) diff --git a/README.md b/README.md index 002d579..9ecd3b8 100644 --- a/README.md +++ b/README.md @@ -112,7 +112,7 @@ Download -------- ```groovy -compile 'eu.inloop:androidviewmodel:1.3.2' +compile 'eu.inloop:androidviewmodel:1.3.3' ``` ## Android Studio Template diff --git a/gradle.properties b/gradle.properties index 49a58fb..5dc4dd7 100644 --- a/gradle.properties +++ b/gradle.properties @@ -17,4 +17,4 @@ # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # org.gradle.parallel=true -VERSION_NAME=1.3.2 \ No newline at end of file +VERSION_NAME=1.3.3 \ No newline at end of file From a53e967bf4d7d01fae0f3e549075f00fd16ebac8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juraj=20Nov=C3=A1k?= Date: Wed, 18 Oct 2017 09:36:15 +0200 Subject: [PATCH 05/10] Add basic instrumented test --- library/build.gradle | 13 +- library/src/androidTest/AndroidManifest.xml | 8 + .../viewmodel/ViewModelActivityTest.java | 157 ++++++++++++++++++ .../fixture/activity/IVMTestActivityView.java | 9 + .../fixture/activity/VMTestActivity.java | 72 ++++++++ .../activity/VMTestActivityViewModel.java | 39 +++++ .../fixture/fragment/IVMTestFragmentView.java | 9 + .../fixture/fragment/VMTestFragment.java | 33 ++++ .../fragment/VMTestFragmentViewModel.java | 42 +++++ .../eu/viewmodelsample/ApplicationTest.java | 13 -- .../inloop/viewmodel/ViewModelProvider.java | 9 + sample/build.gradle | 12 +- 12 files changed, 393 insertions(+), 23 deletions(-) create mode 100644 library/src/androidTest/AndroidManifest.xml create mode 100644 library/src/androidTest/java/eu/inloop/viewmodel/ViewModelActivityTest.java create mode 100644 library/src/androidTest/java/eu/inloop/viewmodel/fixture/activity/IVMTestActivityView.java create mode 100644 library/src/androidTest/java/eu/inloop/viewmodel/fixture/activity/VMTestActivity.java create mode 100644 library/src/androidTest/java/eu/inloop/viewmodel/fixture/activity/VMTestActivityViewModel.java create mode 100644 library/src/androidTest/java/eu/inloop/viewmodel/fixture/fragment/IVMTestFragmentView.java create mode 100644 library/src/androidTest/java/eu/inloop/viewmodel/fixture/fragment/VMTestFragment.java create mode 100644 library/src/androidTest/java/eu/inloop/viewmodel/fixture/fragment/VMTestFragmentViewModel.java delete mode 100644 library/src/androidTest/java/sample/viewmodel/inloop/eu/viewmodelsample/ApplicationTest.java diff --git a/library/build.gradle b/library/build.gradle index d0710b5..ef5bdd7 100644 --- a/library/build.gradle +++ b/library/build.gradle @@ -3,7 +3,7 @@ apply plugin: 'maven' android { compileSdkVersion 26 - buildToolsVersion '25.0.3' + buildToolsVersion '26.0.2' defaultConfig { minSdkVersion 15 @@ -11,6 +11,7 @@ android { versionCode 1 versionName VERSION_NAME consumerProguardFiles 'proguard-rules.pro' + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } compileOptions { sourceCompatibility JavaVersion.VERSION_1_7 @@ -20,13 +21,17 @@ android { } dataBinding { - enabled = true; + enabled = true } } dependencies { - compile 'com.android.support:support-fragment:26.0.1' - compile 'com.android.support:appcompat-v7:26.0.1' + compile 'com.android.support:support-fragment:26.1.0' + compile 'com.android.support:appcompat-v7:26.1.0' + + androidTestCompile 'junit:junit:4.12' + androidTestCompile 'com.android.support.test:runner:1.0.1' + androidTestCompile 'com.android.support.test:rules:1.0.1' } task androidJavadocs(type: Javadoc) { diff --git a/library/src/androidTest/AndroidManifest.xml b/library/src/androidTest/AndroidManifest.xml new file mode 100644 index 0000000..2e06fd1 --- /dev/null +++ b/library/src/androidTest/AndroidManifest.xml @@ -0,0 +1,8 @@ + + + + + + + diff --git a/library/src/androidTest/java/eu/inloop/viewmodel/ViewModelActivityTest.java b/library/src/androidTest/java/eu/inloop/viewmodel/ViewModelActivityTest.java new file mode 100644 index 0000000..60dc5fb --- /dev/null +++ b/library/src/androidTest/java/eu/inloop/viewmodel/ViewModelActivityTest.java @@ -0,0 +1,157 @@ +package eu.inloop.viewmodel; + + +import android.content.pm.ActivityInfo; +import android.support.test.InstrumentationRegistry; +import android.support.test.filters.MediumTest; +import android.support.test.filters.SmallTest; +import android.support.test.rule.ActivityTestRule; +import android.support.test.runner.AndroidJUnit4; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.util.Map; + +import eu.inloop.viewmodel.fixture.activity.VMTestActivity; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.CoreMatchers.nullValue; +import static org.hamcrest.MatcherAssert.assertThat; + + +@RunWith(AndroidJUnit4.class) +public final class ViewModelActivityTest { + + @Rule + public final ActivityTestRule mActivityTestRule = + new ActivityTestRule<>(VMTestActivity.class, false, false); + + @SmallTest + @Test + public void viewModelActivity_onBindView_test() { + mActivityTestRule.launchActivity(VMTestActivity.makeIntent(InstrumentationRegistry.getContext(), true)); + + assertThat(mActivityTestRule.getActivityResult().getResultCode(), is(VMTestActivity.RESULT_CODE_OK)); + } + + @SmallTest + @Test + public void viewModelActivity_getViewModel_getView_test() { + mActivityTestRule.launchActivity(VMTestActivity.makeIntent(InstrumentationRegistry.getContext(), false)); + mActivityTestRule.getActivity().getViewModel().loadData(); + + assertThat(mActivityTestRule.getActivityResult().getResultCode(), is(VMTestActivity.RESULT_CODE_OK)); + } + + @SmallTest + @Test + public void viewModelActivity_getViewModel_getViewOptional_test() { + mActivityTestRule.launchActivity(VMTestActivity.makeIntent(InstrumentationRegistry.getContext(), false)); + mActivityTestRule.getActivity().getViewModel().loadDataOptional(); + + assertThat(mActivityTestRule.getActivityResult().getResultCode(), is(VMTestActivity.RESULT_CODE_OK)); + } + + @SmallTest + @Test + public void viewModelActivity_clearView_test() { + mActivityTestRule.launchActivity(VMTestActivity.makeIntent(InstrumentationRegistry.getContext(), false)); + mActivityTestRule.getActivity().getViewModel().clearView(); + + assertThat(mActivityTestRule.getActivity().getViewModel().getView(), is(nullValue())); + } + + @SmallTest + @Test + public void viewModelActivity_uniqueIdentifier_test() { + mActivityTestRule.launchActivity(VMTestActivity.makeIntent(InstrumentationRegistry.getContext(), false)); + String uniqueIdentifier = mActivityTestRule.getActivity().getViewModel().getUniqueIdentifier(); + + assertThat(uniqueIdentifier, is(notNullValue())); + } + + @SmallTest + @Test + public void viewModelActivity_fragment_getView_test() { + mActivityTestRule.launchActivity(VMTestActivity.makeIntent(InstrumentationRegistry.getContext(), false)); + + mActivityTestRule.getActivity().getTestFragment().getViewModel().loadData(); + + assertThat(mActivityTestRule.getActivityResult().getResultCode(), is(VMTestActivity.RESULT_CODE_OK)); + } + + @SmallTest + @Test + public void viewModelActivity_fragment_remove_test() { + mActivityTestRule.launchActivity(VMTestActivity.makeIntent(InstrumentationRegistry.getContext(), false)); + + String uniqueIdentifierActivity = mActivityTestRule.getActivity().getViewModel().getUniqueIdentifier(); + String uniqueIdentifierFragment = mActivityTestRule.getActivity().getTestFragment().getViewModel().getUniqueIdentifier(); + + Map> viewModels = + mActivityTestRule.getActivity().getViewModelProvider().getViewModels(); + + assertThat(viewModels.containsKey(uniqueIdentifierActivity), is(true)); + assertThat(viewModels.containsKey(uniqueIdentifierFragment), is(true)); + + InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() { + @Override + public void run() { + mActivityTestRule.getActivity().removeTestFragment(); + } + }); + + //Check If ViewModel is removed after removing fragment + viewModels = mActivityTestRule.getActivity().getViewModelProvider().getViewModels(); + + assertThat(viewModels.containsKey(uniqueIdentifierActivity), is(true)); + assertThat(viewModels.containsKey(uniqueIdentifierFragment), is(false)); + } + + @SmallTest + @Test + public void viewModelActivity_fragment_model_state_test() { + mActivityTestRule.launchActivity(VMTestActivity.makeIntent(InstrumentationRegistry.getContext(), false)); + + final int stateValue = 1; + mActivityTestRule.getActivity().getTestFragment().getViewModel().setStateValue(stateValue); + + rotateScreen(1); + + int actualStateValue = mActivityTestRule.getActivity().getTestFragment().getViewModel().getStateValue(); + + assertThat(stateValue, is(actualStateValue)); + } + + @MediumTest + @Test + public void viewModelActivity_instance_count_test() { + mActivityTestRule.launchActivity(VMTestActivity.makeIntent(InstrumentationRegistry.getContext(), false)); + + String uniqueIdentifierActivity = mActivityTestRule.getActivity().getViewModel().getUniqueIdentifier(); + String uniqueIdentifierFragment = mActivityTestRule.getActivity().getTestFragment().getViewModel().getUniqueIdentifier(); + + rotateScreen(5); + + Map> viewModels = + mActivityTestRule.getActivity().getViewModelProvider().getViewModels(); + + assertThat(viewModels.size(), is(2)); //activity + fragment + + assertThat(viewModels.containsKey(uniqueIdentifierActivity), is(true)); + assertThat(viewModels.containsKey(uniqueIdentifierFragment), is(true)); + } + + private void rotateScreen(int numOfTimes) { + for (int i = 0; i < numOfTimes; i++) { + mActivityTestRule.getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); + InstrumentationRegistry.getInstrumentation().waitForIdleSync(); + mActivityTestRule.getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); + InstrumentationRegistry.getInstrumentation().waitForIdleSync(); + } + } + +} diff --git a/library/src/androidTest/java/eu/inloop/viewmodel/fixture/activity/IVMTestActivityView.java b/library/src/androidTest/java/eu/inloop/viewmodel/fixture/activity/IVMTestActivityView.java new file mode 100644 index 0000000..0d8b0d9 --- /dev/null +++ b/library/src/androidTest/java/eu/inloop/viewmodel/fixture/activity/IVMTestActivityView.java @@ -0,0 +1,9 @@ +package eu.inloop.viewmodel.fixture.activity; + +import eu.inloop.viewmodel.IView; + +public interface IVMTestActivityView extends IView { + + void onLoadData(boolean loaded); + +} diff --git a/library/src/androidTest/java/eu/inloop/viewmodel/fixture/activity/VMTestActivity.java b/library/src/androidTest/java/eu/inloop/viewmodel/fixture/activity/VMTestActivity.java new file mode 100644 index 0000000..0b47177 --- /dev/null +++ b/library/src/androidTest/java/eu/inloop/viewmodel/fixture/activity/VMTestActivity.java @@ -0,0 +1,72 @@ +package eu.inloop.viewmodel.fixture.activity; + +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.widget.LinearLayout; + +import eu.inloop.viewmodel.base.ViewModelBaseActivity; +import eu.inloop.viewmodel.fixture.fragment.VMTestFragment; + +public class VMTestActivity extends ViewModelBaseActivity implements IVMTestActivityView { + + public static final int RESULT_CODE_OK = 1; + public static final String EXTRA_CALL_ON_BIND = "EXTRA_CALL_ON_BIND"; + + @NonNull + public static Intent makeIntent(@NonNull Context context, boolean callOnBindModel) { + Intent intent = new Intent(context, VMTestActivity.class); + intent.putExtra(EXTRA_CALL_ON_BIND, callOnBindModel); + + return intent; + } + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + LinearLayout view = new LinearLayout(this); + view.setId(android.R.id.content); + setContentView(view); + + if (savedInstanceState == null) { + addTestFragment(); + } + + setModelView(this); + } + + public void addTestFragment() { + getSupportFragmentManager() + .beginTransaction() + .add(android.R.id.content, new VMTestFragment()) + .commitNow(); + } + + public void removeTestFragment() { + getSupportFragmentManager() + .beginTransaction() + .remove(getTestFragment()) + .commitNow(); + } + + @NonNull + public VMTestFragment getTestFragment() { + for (Fragment fragment : getSupportFragmentManager().getFragments()) { + if (fragment instanceof VMTestFragment) { + return (VMTestFragment) fragment; + } + } + throw new AssertionError("Fragment not found"); + } + + @Override + public void onLoadData(boolean loaded) { + setResult(RESULT_CODE_OK); + finish(); + } + +} diff --git a/library/src/androidTest/java/eu/inloop/viewmodel/fixture/activity/VMTestActivityViewModel.java b/library/src/androidTest/java/eu/inloop/viewmodel/fixture/activity/VMTestActivityViewModel.java new file mode 100644 index 0000000..1ec855b --- /dev/null +++ b/library/src/androidTest/java/eu/inloop/viewmodel/fixture/activity/VMTestActivityViewModel.java @@ -0,0 +1,39 @@ +package eu.inloop.viewmodel.fixture.activity; + +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; + +import eu.inloop.viewmodel.AbstractViewModel; + +public class VMTestActivityViewModel extends AbstractViewModel { + + private boolean mCallOnBind; + + @Override + public void onCreate(@Nullable Bundle arguments, @Nullable Bundle savedInstanceState) { + super.onCreate(arguments, savedInstanceState); + if (arguments == null) { + throw new AssertionError("Arguments must be set for this ViewModel"); + } + mCallOnBind = arguments.getBoolean(VMTestActivity.EXTRA_CALL_ON_BIND); + } + + @Override + public void onBindView(@NonNull IVMTestActivityView view) { + super.onBindView(view); + + if (mCallOnBind) { + loadData(); + } + } + + public void loadData() { + getView().onLoadData(true); + } + + public void loadDataOptional() { + getViewOptional().onLoadData(true); + } + +} diff --git a/library/src/androidTest/java/eu/inloop/viewmodel/fixture/fragment/IVMTestFragmentView.java b/library/src/androidTest/java/eu/inloop/viewmodel/fixture/fragment/IVMTestFragmentView.java new file mode 100644 index 0000000..f8844d4 --- /dev/null +++ b/library/src/androidTest/java/eu/inloop/viewmodel/fixture/fragment/IVMTestFragmentView.java @@ -0,0 +1,9 @@ +package eu.inloop.viewmodel.fixture.fragment; + +import eu.inloop.viewmodel.IView; + +public interface IVMTestFragmentView extends IView { + + void onLoadData(boolean loaded); + +} diff --git a/library/src/androidTest/java/eu/inloop/viewmodel/fixture/fragment/VMTestFragment.java b/library/src/androidTest/java/eu/inloop/viewmodel/fixture/fragment/VMTestFragment.java new file mode 100644 index 0000000..dd03c29 --- /dev/null +++ b/library/src/androidTest/java/eu/inloop/viewmodel/fixture/fragment/VMTestFragment.java @@ -0,0 +1,33 @@ +package eu.inloop.viewmodel.fixture.fragment; + +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.LinearLayout; + +import eu.inloop.viewmodel.base.ViewModelBaseFragment; +import eu.inloop.viewmodel.fixture.activity.VMTestActivity; + +public class VMTestFragment extends ViewModelBaseFragment + implements IVMTestFragmentView { + + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + return new LinearLayout(getContext()); + } + + @Override + public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + setModelView(this); + } + + @Override + public void onLoadData(boolean loaded) { + getActivity().setResult(VMTestActivity.RESULT_CODE_OK); + getActivity().finish(); + } +} diff --git a/library/src/androidTest/java/eu/inloop/viewmodel/fixture/fragment/VMTestFragmentViewModel.java b/library/src/androidTest/java/eu/inloop/viewmodel/fixture/fragment/VMTestFragmentViewModel.java new file mode 100644 index 0000000..6a1e300 --- /dev/null +++ b/library/src/androidTest/java/eu/inloop/viewmodel/fixture/fragment/VMTestFragmentViewModel.java @@ -0,0 +1,42 @@ +package eu.inloop.viewmodel.fixture.fragment; + +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; + +import eu.inloop.viewmodel.AbstractViewModel; + +public class VMTestFragmentViewModel extends AbstractViewModel { + + private static final String STATE_INT = "STATE_INT"; + + private int mStateValue; + + @Override + public void onCreate(@Nullable Bundle arguments, @Nullable Bundle savedInstanceState) { + super.onCreate(arguments, savedInstanceState); + + if (savedInstanceState != null) { + mStateValue = savedInstanceState.getInt(STATE_INT); + } + } + + @Override + public void onSaveInstanceState(@NonNull Bundle bundle) { + super.onSaveInstanceState(bundle); + bundle.putInt(STATE_INT, mStateValue); + } + + public void setStateValue(int value) { + mStateValue = value; + } + + public int getStateValue() { + return mStateValue; + } + + public void loadData() { + getView().onLoadData(true); + } + +} diff --git a/library/src/androidTest/java/sample/viewmodel/inloop/eu/viewmodelsample/ApplicationTest.java b/library/src/androidTest/java/sample/viewmodel/inloop/eu/viewmodelsample/ApplicationTest.java deleted file mode 100644 index 3844758..0000000 --- a/library/src/androidTest/java/sample/viewmodel/inloop/eu/viewmodelsample/ApplicationTest.java +++ /dev/null @@ -1,13 +0,0 @@ -package sample.viewmodel.inloop.eu.viewmodelsample; - -import android.app.Application; -import android.test.ApplicationTestCase; - -/** - * Testing Fundamentals - */ -public class ApplicationTest extends ApplicationTestCase { - public ApplicationTest() { - super(Application.class); - } -} \ No newline at end of file diff --git a/library/src/main/java/eu/inloop/viewmodel/ViewModelProvider.java b/library/src/main/java/eu/inloop/viewmodel/ViewModelProvider.java index c541de4..c484f72 100644 --- a/library/src/main/java/eu/inloop/viewmodel/ViewModelProvider.java +++ b/library/src/main/java/eu/inloop/viewmodel/ViewModelProvider.java @@ -2,9 +2,12 @@ import android.app.Activity; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import android.support.annotation.VisibleForTesting; import android.support.v4.app.FragmentActivity; +import java.util.Collections; import java.util.HashMap; +import java.util.Map; /** * Create and keep this class inside your Activity. Store it @@ -49,6 +52,12 @@ public synchronized void removeAllViewModels() { mViewModelCache.clear(); } + @VisibleForTesting + @NonNull + Map> getViewModels() { + return Collections.unmodifiableMap(mViewModelCache); + } + @SuppressWarnings("unchecked") @NonNull public synchronized ViewModelWrapper getViewModel(@NonNull final String modelIdentifier, diff --git a/sample/build.gradle b/sample/build.gradle index 912c8c0..d7bd9f5 100644 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -2,7 +2,7 @@ apply plugin: 'com.android.application' android { compileSdkVersion 26 - buildToolsVersion '25.0.3' + buildToolsVersion '26.0.2' defaultConfig { applicationId 'eu.inloop.viewmodel.sample' @@ -25,15 +25,15 @@ android { } dataBinding { - enabled = true; + enabled = true } } dependencies { - compile 'com.android.support:support-fragment:26.0.1' - compile 'com.android.support:appcompat-v7:26.0.1' - debugCompile 'com.squareup.leakcanary:leakcanary-android:1.4' - releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.4' + compile 'com.android.support:support-fragment:26.1.0' + compile 'com.android.support:appcompat-v7:26.1.0' + debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5.1' + releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.1' compile 'com.jakewharton:butterknife:5.1.2' compile project(':library') } From e2e4f24ba50ca51055f3e96c77a9461001889964 Mon Sep 17 00:00:00 2001 From: Daniel Date: Thu, 2 Nov 2017 08:13:04 +0100 Subject: [PATCH 06/10] Update Gradle, fix annotation --- build.gradle | 7 +++---- gradle/wrapper/gradle-wrapper.properties | 4 ++-- library/build.gradle | 10 +++++----- .../binding/ViewModelBaseBindingFragment.java | 2 +- sample/build.gradle | 13 +++++++------ .../viewmodel/sample/activity/MainActivity.java | 2 +- .../sample/activity/SampleBindingActivity.java | 2 +- .../sample/fragment/SampleBundleFragment.java | 2 +- .../viewmodel/sample/fragment/UserListFragment.java | 12 ++++++------ 9 files changed, 27 insertions(+), 27 deletions(-) diff --git a/build.gradle b/build.gradle index 72ff9fb..e38ee82 100644 --- a/build.gradle +++ b/build.gradle @@ -1,18 +1,17 @@ buildscript { repositories { jcenter() + google() } dependencies { - classpath 'com.android.tools.build:gradle:2.3.3' + classpath 'com.android.tools.build:gradle:3.0.0' } } allprojects { repositories { jcenter() - maven { - url "https://maven.google.com" - } + google() } group = 'eu.inloop' diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 7379b41..1e1ed4f 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Mon Mar 13 13:06:15 CET 2017 +#Thu Nov 02 07:53:43 CET 2017 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-3.4-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip diff --git a/library/build.gradle b/library/build.gradle index ef5bdd7..211e9a6 100644 --- a/library/build.gradle +++ b/library/build.gradle @@ -26,12 +26,12 @@ android { } dependencies { - compile 'com.android.support:support-fragment:26.1.0' - compile 'com.android.support:appcompat-v7:26.1.0' + implementation 'com.android.support:support-fragment:26.1.0' + implementation 'com.android.support:appcompat-v7:26.1.0' - androidTestCompile 'junit:junit:4.12' - androidTestCompile 'com.android.support.test:runner:1.0.1' - androidTestCompile 'com.android.support.test:rules:1.0.1' + androidTestImplementation 'junit:junit:4.12' + androidTestImplementation 'com.android.support.test:runner:1.0.1' + androidTestImplementation 'com.android.support.test:rules:1.0.1' } task androidJavadocs(type: Javadoc) { diff --git a/library/src/main/java/eu/inloop/viewmodel/binding/ViewModelBaseBindingFragment.java b/library/src/main/java/eu/inloop/viewmodel/binding/ViewModelBaseBindingFragment.java index 4e2c4fd..cf153e0 100644 --- a/library/src/main/java/eu/inloop/viewmodel/binding/ViewModelBaseBindingFragment.java +++ b/library/src/main/java/eu/inloop/viewmodel/binding/ViewModelBaseBindingFragment.java @@ -36,7 +36,7 @@ public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, } @SuppressWarnings("unused") - @NonNull + @Nullable public B getBinding() { try { return (B) getViewModelHelper().getBinding(); diff --git a/sample/build.gradle b/sample/build.gradle index d7bd9f5..5f90db3 100644 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -30,10 +30,11 @@ android { } dependencies { - compile 'com.android.support:support-fragment:26.1.0' - compile 'com.android.support:appcompat-v7:26.1.0' - debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5.1' - releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.1' - compile 'com.jakewharton:butterknife:5.1.2' - compile project(':library') + implementation 'com.android.support:support-fragment:26.1.0' + implementation 'com.android.support:appcompat-v7:26.1.0' + debugImplementation 'com.squareup.leakcanary:leakcanary-android:1.5.1' + releaseImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.1' + implementation 'com.jakewharton:butterknife:8.8.1' + annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1' + implementation project(':library') } diff --git a/sample/src/main/java/eu/inloop/viewmodel/sample/activity/MainActivity.java b/sample/src/main/java/eu/inloop/viewmodel/sample/activity/MainActivity.java index 60cf1b5..5d4ed8a 100644 --- a/sample/src/main/java/eu/inloop/viewmodel/sample/activity/MainActivity.java +++ b/sample/src/main/java/eu/inloop/viewmodel/sample/activity/MainActivity.java @@ -14,7 +14,7 @@ public class MainActivity extends ViewModelBaseEmptyActivity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); - ButterKnife.inject(this); + ButterKnife.bind(this); if (savedInstanceState == null) { getSupportFragmentManager().beginTransaction().replace(R.id.root_content, new UserListFragment(), "user-list-fragment").commit(); diff --git a/sample/src/main/java/eu/inloop/viewmodel/sample/activity/SampleBindingActivity.java b/sample/src/main/java/eu/inloop/viewmodel/sample/activity/SampleBindingActivity.java index 02226be..2967890 100644 --- a/sample/src/main/java/eu/inloop/viewmodel/sample/activity/SampleBindingActivity.java +++ b/sample/src/main/java/eu/inloop/viewmodel/sample/activity/SampleBindingActivity.java @@ -19,7 +19,7 @@ public static Intent newIntent(Context context) { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); - ButterKnife.inject(this); + ButterKnife.bind(this); if (savedInstanceState == null) { getSupportFragmentManager().beginTransaction().replace(R.id.root_content, new SampleBindingFragment(), "sample-binding-fragment").commit(); diff --git a/sample/src/main/java/eu/inloop/viewmodel/sample/fragment/SampleBundleFragment.java b/sample/src/main/java/eu/inloop/viewmodel/sample/fragment/SampleBundleFragment.java index 055026a..474a039 100644 --- a/sample/src/main/java/eu/inloop/viewmodel/sample/fragment/SampleBundleFragment.java +++ b/sample/src/main/java/eu/inloop/viewmodel/sample/fragment/SampleBundleFragment.java @@ -33,7 +33,7 @@ public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); - ButterKnife.inject(this, view); + ButterKnife.bind(this, view); setModelView(this); } } diff --git a/sample/src/main/java/eu/inloop/viewmodel/sample/fragment/UserListFragment.java b/sample/src/main/java/eu/inloop/viewmodel/sample/fragment/UserListFragment.java index 39a6055..c0bf3b9 100644 --- a/sample/src/main/java/eu/inloop/viewmodel/sample/fragment/UserListFragment.java +++ b/sample/src/main/java/eu/inloop/viewmodel/sample/fragment/UserListFragment.java @@ -17,8 +17,8 @@ import java.util.ArrayList; import java.util.List; +import butterknife.BindView; import butterknife.ButterKnife; -import butterknife.InjectView; import eu.inloop.viewmodel.base.ViewModelBaseFragment; import eu.inloop.viewmodel.binding.ViewModelBindingConfig; import eu.inloop.viewmodel.sample.R; @@ -30,13 +30,13 @@ public class UserListFragment extends ViewModelBaseFragment implements IUserListView { - @InjectView(android.R.id.progress) + @BindView(android.R.id.progress) View mProgressView; - @InjectView(R.id.progress_text) + @BindView(R.id.progress_text) TextView mProgressText; - @InjectView(android.R.id.list) + @BindView(android.R.id.list) ListView mListview; - @InjectView(R.id.open_binding_fragment) + @BindView(R.id.open_binding_fragment) Button mOpenBindingFragment; private ArrayAdapter mAdapter; @@ -50,7 +50,7 @@ public void onCreate(Bundle savedInstanceState) { @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { final View view = inflater.inflate(R.layout.fragment_userlist, container, false); - ButterKnife.inject(this, view); + ButterKnife.bind(this, view); final View headerView = inflater.inflate(R.layout.view_header_info, null, false); headerView.findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() { From bfa5bd039e99bf895b139676608e3f6c28cb7f34 Mon Sep 17 00:00:00 2001 From: Daniel Date: Thu, 2 Nov 2017 08:46:39 +0100 Subject: [PATCH 07/10] Bump version to 1.3.4 --- CHANGELOG.md | 16 ++++++++++------ README.md | 2 +- gradle.properties | 2 +- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fb6611c..79af7df 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,25 +1,29 @@ -## 1.3.3(2017-21-8) +## 1.3.3(2017-11-02) + +- Update Gradle plugin. Fix Nullable annotation in getBinding(). + +## 1.3.3(2017-08-21) - Fix issue where viewmodels with generic types would not work correctly. -## 1.3.2(2017-21-8) +## 1.3.2(2017-08-21) - Updated dependencies (Support library, build tools, gradle) -## 1.3.1(2017-20-2) +## 1.3.1(2017-02-20) - Critical issue fixed that was introduced two days ago in 1.3.0 - please update to 1.3.1 (issue is related to the new getViewOptional() method). -## 1.3.0(2017-18-2) +## 1.3.0(2017-02-18) - Added ``getViewOptional()`` method which is guaranteed to be non-null. It will return a dummy implemenation in case the View is not null. - Removed the need to override ```getViewModelClass```, the ViewModel class is now automatically extracted from the ViewModel class definition. -## 1.2.3(2017-4-1) +## 1.2.3(2017-01-4) - Fix ProGuard settings. -## 1.2.2(2017-2-1) +## 1.2.2(2017-01-02) - Remove wrong jetbrains annotations import. diff --git a/README.md b/README.md index 9ecd3b8..38294d9 100644 --- a/README.md +++ b/README.md @@ -112,7 +112,7 @@ Download -------- ```groovy -compile 'eu.inloop:androidviewmodel:1.3.3' +compile 'eu.inloop:androidviewmodel:1.3.4' ``` ## Android Studio Template diff --git a/gradle.properties b/gradle.properties index 5dc4dd7..635e98a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -17,4 +17,4 @@ # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # org.gradle.parallel=true -VERSION_NAME=1.3.3 \ No newline at end of file +VERSION_NAME=1.3.4 \ No newline at end of file From f84504ad8a238d272f9e71e01e9f78de01124e99 Mon Sep 17 00:00:00 2001 From: Peter Kalata Date: Wed, 7 Mar 2018 14:48:19 +0100 Subject: [PATCH 08/10] Update dependecies, deprecate --- CHANGELOG.md | 6 +++++- README.md | 10 ++++++++-- build.gradle | 2 +- gradle.properties | 2 +- library/build.gradle | 15 ++++++++------- .../fixture/fragment/VMTestFragment.java | 9 +++++---- .../eu/inloop/viewmodel/ProxyViewHelper.java | 7 +------ .../eu/inloop/viewmodel/ViewModelHelper.java | 6 +++--- .../viewmodel/base/ViewModelBaseFragment.java | 4 ++-- .../binding/ViewModelBaseBindingFragment.java | 2 +- sample/build.gradle | 15 ++++++++------- .../sample/activity/ViewPagerActivity.java | 10 +++++++--- .../sample/fragment/PagerFragment.java | 7 ++++--- .../fragment/SampleBindingFragment.java | 5 +++-- .../sample/fragment/UserListFragment.java | 19 ++++++++++--------- .../sample/viewmodel/UserListViewModel.java | 3 +++ 16 files changed, 70 insertions(+), 52 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 79af7df..cd9ac1c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,8 @@ -## 1.3.3(2017-11-02) +## 1.3.5(2018-03-07) + +- Updated dependencies (Support library, build tools, Gradle). + +## 1.3.4(2017-11-02) - Update Gradle plugin. Fix Nullable annotation in getBinding(). diff --git a/README.md b/README.md index 38294d9..46031ce 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,12 @@ AndroidViewModel ================ +Important notice: Deprecated +-------- +This library served it's purpose for over 3 years. We believe that Google's Android [Architecture Components](https://developer.android.com/topic/libraries/architecture/index.html) are the preferred setup now for new projects. +[INLOOPX](http://www.inloopx.com) is dedicated to continue maintaining this library (no deadline on support end). So rest assured that your existing projects don't need be migrated from AndroidViewModel because of this deprecation. We are only stopping new feature development and don't recommend using it for new projects. + + Separating data and state handling from Fragments or Activities without lots of boilerplate-code. Reducing them to simple dumb views. Basic idea behind this library. @@ -87,7 +93,7 @@ Data binding is supported - extend [ViewModelBaseBindingFragment.java](library/s ``` java @Override public ViewModelBindingConfig getViewModelBindingConfig() { - return new ViewModelBindingConfig(R.layout.fragment_sample_binding, getActivity()); + return new ViewModelBindingConfig(R.layout.fragment_sample_binding, requireActivity()); } ``` @@ -112,7 +118,7 @@ Download -------- ```groovy -compile 'eu.inloop:androidviewmodel:1.3.4' +compile 'eu.inloop:androidviewmodel:1.3.5' ``` ## Android Studio Template diff --git a/build.gradle b/build.gradle index e38ee82..4916934 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,7 @@ buildscript { google() } dependencies { - classpath 'com.android.tools.build:gradle:3.0.0' + classpath 'com.android.tools.build:gradle:3.0.1' } } diff --git a/gradle.properties b/gradle.properties index 635e98a..35b39c4 100644 --- a/gradle.properties +++ b/gradle.properties @@ -17,4 +17,4 @@ # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # org.gradle.parallel=true -VERSION_NAME=1.3.4 \ No newline at end of file +VERSION_NAME=1.3.5 \ No newline at end of file diff --git a/library/build.gradle b/library/build.gradle index 211e9a6..0d8d9a6 100644 --- a/library/build.gradle +++ b/library/build.gradle @@ -2,20 +2,20 @@ apply plugin: 'com.android.library' apply plugin: 'maven' android { - compileSdkVersion 26 - buildToolsVersion '26.0.2' + compileSdkVersion 27 + buildToolsVersion '27.0.3' defaultConfig { minSdkVersion 15 - targetSdkVersion 26 + targetSdkVersion 27 versionCode 1 versionName VERSION_NAME consumerProguardFiles 'proguard-rules.pro' testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } compileOptions { - sourceCompatibility JavaVersion.VERSION_1_7 - targetCompatibility JavaVersion.VERSION_1_7 + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 } buildTypes { } @@ -26,8 +26,9 @@ android { } dependencies { - implementation 'com.android.support:support-fragment:26.1.0' - implementation 'com.android.support:appcompat-v7:26.1.0' + implementation 'com.android.support:support-fragment:27.1.0' + implementation 'com.android.support:appcompat-v7:27.1.0' + implementation 'com.android.support:support-v4:27.1.0' androidTestImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.1' diff --git a/library/src/androidTest/java/eu/inloop/viewmodel/fixture/fragment/VMTestFragment.java b/library/src/androidTest/java/eu/inloop/viewmodel/fixture/fragment/VMTestFragment.java index dd03c29..782467d 100644 --- a/library/src/androidTest/java/eu/inloop/viewmodel/fixture/fragment/VMTestFragment.java +++ b/library/src/androidTest/java/eu/inloop/viewmodel/fixture/fragment/VMTestFragment.java @@ -1,6 +1,7 @@ package eu.inloop.viewmodel.fixture.fragment; import android.os.Bundle; +import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.view.LayoutInflater; import android.view.View; @@ -15,19 +16,19 @@ public class VMTestFragment extends ViewModelBaseFragment getGenericType(@NonNull Class in, @NonNull Class wh return null; } - private static final InvocationHandler sInvocationHandler = new InvocationHandler() { - @Override - public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { - return null; - } - }; + private static final InvocationHandler sInvocationHandler = (proxy, method, args) -> null; } diff --git a/library/src/main/java/eu/inloop/viewmodel/ViewModelHelper.java b/library/src/main/java/eu/inloop/viewmodel/ViewModelHelper.java index 48b9844..b94b7f5 100644 --- a/library/src/main/java/eu/inloop/viewmodel/ViewModelHelper.java +++ b/library/src/main/java/eu/inloop/viewmodel/ViewModelHelper.java @@ -162,15 +162,15 @@ public void onDestroy(@NonNull final Fragment fragment) { //no viewmodel for this fragment return; } - if (fragment.getActivity().isFinishing()) { - removeViewModel(fragment.getActivity()); + if (fragment.requireActivity().isFinishing()) { + removeViewModel(fragment.requireActivity()); } else if (fragment.isRemoving() && !mOnSaveInstanceCalled) { // The fragment can be still in backstack even if isRemoving() is true. // We check mOnSaveInstanceCalled - if this was not called then the fragment is totally removed. if (BuildConfig.DEBUG) { Log.d("mode", "Removing viewmodel - fragment replaced"); //NON-NLS } - removeViewModel(fragment.getActivity()); + removeViewModel(fragment.requireActivity()); } mBinding = null; } diff --git a/library/src/main/java/eu/inloop/viewmodel/base/ViewModelBaseFragment.java b/library/src/main/java/eu/inloop/viewmodel/base/ViewModelBaseFragment.java index d198615..35851f1 100644 --- a/library/src/main/java/eu/inloop/viewmodel/base/ViewModelBaseFragment.java +++ b/library/src/main/java/eu/inloop/viewmodel/base/ViewModelBaseFragment.java @@ -29,7 +29,7 @@ public void onCreate(@Nullable final Bundle savedInstanceState) { //noinspection unchecked viewModelClass = (Class>) ProxyViewHelper.getGenericType(getClass(), AbstractViewModel.class); } - getViewModelHelper().onCreate(getActivity(), savedInstanceState, viewModelClass, getArguments()); + getViewModelHelper().onCreate(requireActivity(), savedInstanceState, viewModelClass, getArguments()); } @CallSuper @@ -94,7 +94,7 @@ public ViewModelHelper getViewModelHelper() { @Override public void removeViewModel() { - mViewModelHelper.removeViewModel(getActivity()); + mViewModelHelper.removeViewModel(requireActivity()); } /** diff --git a/library/src/main/java/eu/inloop/viewmodel/binding/ViewModelBaseBindingFragment.java b/library/src/main/java/eu/inloop/viewmodel/binding/ViewModelBaseBindingFragment.java index cf153e0..abc4485 100644 --- a/library/src/main/java/eu/inloop/viewmodel/binding/ViewModelBaseBindingFragment.java +++ b/library/src/main/java/eu/inloop/viewmodel/binding/ViewModelBaseBindingFragment.java @@ -25,7 +25,7 @@ public void onCreate(@Nullable Bundle savedInstanceState) { @Nullable @Override - public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { getViewModelHelper().performBinding(this); final ViewDataBinding binding = getViewModelHelper().getBinding(); if (binding != null) { diff --git a/sample/build.gradle b/sample/build.gradle index 5f90db3..62412e8 100644 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -1,21 +1,21 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 26 - buildToolsVersion '26.0.2' + compileSdkVersion 27 + buildToolsVersion '27.0.3' defaultConfig { applicationId 'eu.inloop.viewmodel.sample' minSdkVersion 15 - targetSdkVersion 26 + targetSdkVersion 27 versionCode 1 versionName '1.0' } compileOptions { encoding "UTF-8" - sourceCompatibility JavaVersion.VERSION_1_7 - targetCompatibility JavaVersion.VERSION_1_7 + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 } buildTypes { release { @@ -30,8 +30,9 @@ android { } dependencies { - implementation 'com.android.support:support-fragment:26.1.0' - implementation 'com.android.support:appcompat-v7:26.1.0' + implementation 'com.android.support:support-fragment:27.1.0' + implementation 'com.android.support:appcompat-v7:27.1.0' + implementation 'com.android.support:support-v4:27.1.0' debugImplementation 'com.squareup.leakcanary:leakcanary-android:1.5.1' releaseImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.1' implementation 'com.jakewharton:butterknife:8.8.1' diff --git a/sample/src/main/java/eu/inloop/viewmodel/sample/activity/ViewPagerActivity.java b/sample/src/main/java/eu/inloop/viewmodel/sample/activity/ViewPagerActivity.java index 3027c8e..7d7ec34 100644 --- a/sample/src/main/java/eu/inloop/viewmodel/sample/activity/ViewPagerActivity.java +++ b/sample/src/main/java/eu/inloop/viewmodel/sample/activity/ViewPagerActivity.java @@ -5,6 +5,8 @@ import android.support.v4.app.FragmentManager; import android.support.v4.view.ViewPager; +import butterknife.BindView; +import butterknife.ButterKnife; import eu.inloop.viewmodel.base.ViewModelBaseEmptyActivity; import eu.inloop.viewmodel.sample.R; import eu.inloop.viewmodel.sample.fragment.PagerFragment; @@ -12,13 +14,15 @@ public class ViewPagerActivity extends ViewModelBaseEmptyActivity { + @BindView(R.id.pager) + ViewPager mViewPager; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_pager); - - final ViewPager viewPager = (ViewPager) findViewById(R.id.pager); - viewPager.setAdapter(new TestPagerAdapter(getSupportFragmentManager())); + ButterKnife.bind(this); + mViewPager.setAdapter(new TestPagerAdapter(getSupportFragmentManager())); } private final static class TestPagerAdapter extends ViewModelStatePagerAdapter { diff --git a/sample/src/main/java/eu/inloop/viewmodel/sample/fragment/PagerFragment.java b/sample/src/main/java/eu/inloop/viewmodel/sample/fragment/PagerFragment.java index 8eedea9..d90717f 100644 --- a/sample/src/main/java/eu/inloop/viewmodel/sample/fragment/PagerFragment.java +++ b/sample/src/main/java/eu/inloop/viewmodel/sample/fragment/PagerFragment.java @@ -1,6 +1,7 @@ package eu.inloop.viewmodel.sample.fragment; import android.os.Bundle; +import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.view.LayoutInflater; import android.view.View; @@ -28,12 +29,12 @@ public static PagerFragment newInstance(int position) { @Nullable @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_pager, container, false); } @Override - public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); ((TextView)view.findViewById(R.id.text)).setText(Integer.toString(getArguments().getInt("position"))); setModelView(this); @@ -44,7 +45,7 @@ public void onDestroy() { super.onDestroy(); // watch for memory leaks - RefWatcher refWatcher = SampleApplication.getRefWatcher(getActivity()); + RefWatcher refWatcher = SampleApplication.getRefWatcher(requireActivity()); refWatcher.watch(this); } } diff --git a/sample/src/main/java/eu/inloop/viewmodel/sample/fragment/SampleBindingFragment.java b/sample/src/main/java/eu/inloop/viewmodel/sample/fragment/SampleBindingFragment.java index 6aad23b..7fa2e9f 100644 --- a/sample/src/main/java/eu/inloop/viewmodel/sample/fragment/SampleBindingFragment.java +++ b/sample/src/main/java/eu/inloop/viewmodel/sample/fragment/SampleBindingFragment.java @@ -1,6 +1,7 @@ package eu.inloop.viewmodel.sample.fragment; import android.os.Bundle; +import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.view.View; @@ -24,13 +25,13 @@ public SampleBindingFragment() { } @Override - public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); setModelView(this); } @Override public ViewModelBindingConfig getViewModelBindingConfig() { - return new ViewModelBindingConfig(R.layout.fragment_sample_binding, getActivity()); + return new ViewModelBindingConfig(R.layout.fragment_sample_binding, requireActivity()); } } diff --git a/sample/src/main/java/eu/inloop/viewmodel/sample/fragment/UserListFragment.java b/sample/src/main/java/eu/inloop/viewmodel/sample/fragment/UserListFragment.java index c0bf3b9..92c8814 100644 --- a/sample/src/main/java/eu/inloop/viewmodel/sample/fragment/UserListFragment.java +++ b/sample/src/main/java/eu/inloop/viewmodel/sample/fragment/UserListFragment.java @@ -2,6 +2,7 @@ import android.content.Intent; import android.os.Bundle; +import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.view.LayoutInflater; import android.view.View; @@ -44,11 +45,11 @@ public class UserListFragment extends ViewModelBaseFragment(getActivity(), android.R.layout.simple_list_item_1, android.R.id.text1, new ArrayList()); + mAdapter = new ArrayAdapter<>(requireActivity(), android.R.layout.simple_list_item_1, android.R.id.text1, new ArrayList()); } @Override - public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { final View view = inflater.inflate(R.layout.fragment_userlist, container, false); ButterKnife.bind(this, view); @@ -56,34 +57,34 @@ public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, headerView.findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - getFragmentManager().beginTransaction().replace(R.id.root_content, SampleBundleFragment.newInstance(1234), "empty-fragment").addToBackStack(null).commit(); + requireFragmentManager().beginTransaction().replace(R.id.root_content, SampleBundleFragment.newInstance(1234), "empty-fragment").addToBackStack(null).commit(); } }); headerView.findViewById(R.id.button2).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - getActivity().finish(); - getActivity().startActivity(getActivity().getIntent()); + requireActivity().finish(); + requireActivity().startActivity(requireActivity().getIntent()); } }); headerView.findViewById(R.id.button3).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - startActivity(new Intent(getContext(), ViewPagerActivity.class)); + startActivity(new Intent(requireContext(), ViewPagerActivity.class)); } }); mListview.addHeaderView(headerView, null, false); mOpenBindingFragment.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - startActivity(SampleBindingActivity.newIntent(getActivity())); + startActivity(SampleBindingActivity.newIntent(requireActivity())); } }); return view; } @Override - public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); mListview.setAdapter(mAdapter); mListview.setOnItemClickListener(new AdapterView.OnItemClickListener() { @@ -120,7 +121,7 @@ public void onDestroy() { super.onDestroy(); // watch for memory leaks - RefWatcher refWatcher = SampleApplication.getRefWatcher(getActivity()); + RefWatcher refWatcher = SampleApplication.getRefWatcher(requireActivity()); refWatcher.watch(this); } } diff --git a/sample/src/main/java/eu/inloop/viewmodel/sample/viewmodel/UserListViewModel.java b/sample/src/main/java/eu/inloop/viewmodel/sample/viewmodel/UserListViewModel.java index 3c000bf..607cd43 100644 --- a/sample/src/main/java/eu/inloop/viewmodel/sample/viewmodel/UserListViewModel.java +++ b/sample/src/main/java/eu/inloop/viewmodel/sample/viewmodel/UserListViewModel.java @@ -1,5 +1,6 @@ package eu.inloop.viewmodel.sample.viewmodel; +import android.annotation.SuppressLint; import android.os.AsyncTask; import android.os.Bundle; import android.support.annotation.NonNull; @@ -45,6 +46,7 @@ public void onBindView(@NonNull IUserListView view) { } } + @SuppressLint("StaticFieldLeak") private void loadUsers() { mLoadingUsers = true; mCurrentLoadingProgress = 0; @@ -86,6 +88,7 @@ protected void onPostExecute(List s) { }.execute(); } + @SuppressLint("StaticFieldLeak") public void deleteUser(final int position) { if (position > mLoadedUsers.size() - 1) { return; From fd4a0487e92bc1e7b363e2420636d49bc744cd4f Mon Sep 17 00:00:00 2001 From: Daniel Novak Date: Wed, 13 Feb 2019 18:05:12 +0100 Subject: [PATCH 09/10] Migrate to AndroidX --- build.gradle | 2 +- gradle.properties | 2 ++ gradle/wrapper/gradle-wrapper.properties | 4 +-- library/build.gradle | 16 +++++------ .../viewmodel/ViewModelActivityTest.java | 10 +++---- .../fixture/activity/VMTestActivity.java | 6 ++-- .../activity/VMTestActivityViewModel.java | 4 +-- .../fixture/fragment/VMTestFragment.java | 4 +-- .../fragment/VMTestFragmentViewModel.java | 4 +-- .../inloop/viewmodel/AbstractViewModel.java | 10 +++---- .../main/java/eu/inloop/viewmodel/IView.java | 2 +- .../inloop/viewmodel/IViewModelProvider.java | 2 +- .../eu/inloop/viewmodel/ProxyViewHelper.java | 5 ++-- .../eu/inloop/viewmodel/ViewModelHelper.java | 28 +++++++++---------- .../inloop/viewmodel/ViewModelProvider.java | 12 ++++---- .../viewmodel/base/ViewModelBaseActivity.java | 6 ++-- .../base/ViewModelBaseEmptyActivity.java | 6 ++-- .../viewmodel/base/ViewModelBaseFragment.java | 8 +++--- .../binding/ViewModelBaseBindingFragment.java | 6 ++-- .../binding/ViewModelBindingConfig.java | 4 +-- .../support/ViewModelStatePagerAdapter.java | 8 +++--- sample/build.gradle | 15 +++++----- .../sample/activity/ViewPagerActivity.java | 7 +++-- .../sample/fragment/PagerFragment.java | 5 ++-- .../fragment/SampleBindingFragment.java | 6 ++-- .../sample/fragment/SampleBundleFragment.java | 3 +- .../sample/fragment/UserListFragment.java | 5 ++-- .../viewmodel/sample/viewmodel/PageModel.java | 2 +- .../viewmodel/SampleArgumentViewModel.java | 2 +- .../viewmodel/SampleBindingViewModel.java | 4 +-- .../sample/viewmodel/UserListViewModel.java | 4 +-- sample/src/main/res/layout/activity_pager.xml | 2 +- 32 files changed, 100 insertions(+), 104 deletions(-) diff --git a/build.gradle b/build.gradle index 4916934..51a9613 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,7 @@ buildscript { google() } dependencies { - classpath 'com.android.tools.build:gradle:3.0.1' + classpath 'com.android.tools.build:gradle:3.3.1' } } diff --git a/gradle.properties b/gradle.properties index 35b39c4..24dbcda 100644 --- a/gradle.properties +++ b/gradle.properties @@ -17,4 +17,6 @@ # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # org.gradle.parallel=true +android.enableJetifier=true +android.useAndroidX=true VERSION_NAME=1.3.5 \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 1e1ed4f..ab096e7 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Thu Nov 02 07:53:43 CET 2017 +#Wed Feb 13 17:35:05 CET 2019 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.1-all.zip diff --git a/library/build.gradle b/library/build.gradle index 0d8d9a6..87a4ceb 100644 --- a/library/build.gradle +++ b/library/build.gradle @@ -2,16 +2,15 @@ apply plugin: 'com.android.library' apply plugin: 'maven' android { - compileSdkVersion 27 - buildToolsVersion '27.0.3' + compileSdkVersion 28 defaultConfig { minSdkVersion 15 - targetSdkVersion 27 + targetSdkVersion 28 versionCode 1 versionName VERSION_NAME consumerProguardFiles 'proguard-rules.pro' - testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 @@ -26,13 +25,12 @@ android { } dependencies { - implementation 'com.android.support:support-fragment:27.1.0' - implementation 'com.android.support:appcompat-v7:27.1.0' - implementation 'com.android.support:support-v4:27.1.0' + implementation 'androidx.fragment:fragment:1.0.0' + implementation 'androidx.appcompat:appcompat:1.0.2' androidTestImplementation 'junit:junit:4.12' - androidTestImplementation 'com.android.support.test:runner:1.0.1' - androidTestImplementation 'com.android.support.test:rules:1.0.1' + androidTestImplementation 'androidx.test:runner:1.1.2-alpha01' + androidTestImplementation 'androidx.test:rules:1.1.2-alpha01' } task androidJavadocs(type: Javadoc) { diff --git a/library/src/androidTest/java/eu/inloop/viewmodel/ViewModelActivityTest.java b/library/src/androidTest/java/eu/inloop/viewmodel/ViewModelActivityTest.java index 60dc5fb..15eb73f 100644 --- a/library/src/androidTest/java/eu/inloop/viewmodel/ViewModelActivityTest.java +++ b/library/src/androidTest/java/eu/inloop/viewmodel/ViewModelActivityTest.java @@ -2,11 +2,11 @@ import android.content.pm.ActivityInfo; -import android.support.test.InstrumentationRegistry; -import android.support.test.filters.MediumTest; -import android.support.test.filters.SmallTest; -import android.support.test.rule.ActivityTestRule; -import android.support.test.runner.AndroidJUnit4; +import androidx.test.InstrumentationRegistry; +import androidx.test.filters.MediumTest; +import androidx.test.filters.SmallTest; +import androidx.test.rule.ActivityTestRule; +import androidx.test.runner.AndroidJUnit4; import org.junit.Rule; import org.junit.Test; diff --git a/library/src/androidTest/java/eu/inloop/viewmodel/fixture/activity/VMTestActivity.java b/library/src/androidTest/java/eu/inloop/viewmodel/fixture/activity/VMTestActivity.java index 0b47177..5e828f3 100644 --- a/library/src/androidTest/java/eu/inloop/viewmodel/fixture/activity/VMTestActivity.java +++ b/library/src/androidTest/java/eu/inloop/viewmodel/fixture/activity/VMTestActivity.java @@ -3,9 +3,9 @@ import android.content.Context; import android.content.Intent; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; import android.widget.LinearLayout; import eu.inloop.viewmodel.base.ViewModelBaseActivity; diff --git a/library/src/androidTest/java/eu/inloop/viewmodel/fixture/activity/VMTestActivityViewModel.java b/library/src/androidTest/java/eu/inloop/viewmodel/fixture/activity/VMTestActivityViewModel.java index 1ec855b..129d230 100644 --- a/library/src/androidTest/java/eu/inloop/viewmodel/fixture/activity/VMTestActivityViewModel.java +++ b/library/src/androidTest/java/eu/inloop/viewmodel/fixture/activity/VMTestActivityViewModel.java @@ -1,8 +1,8 @@ package eu.inloop.viewmodel.fixture.activity; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import eu.inloop.viewmodel.AbstractViewModel; diff --git a/library/src/androidTest/java/eu/inloop/viewmodel/fixture/fragment/VMTestFragment.java b/library/src/androidTest/java/eu/inloop/viewmodel/fixture/fragment/VMTestFragment.java index 782467d..ca603af 100644 --- a/library/src/androidTest/java/eu/inloop/viewmodel/fixture/fragment/VMTestFragment.java +++ b/library/src/androidTest/java/eu/inloop/viewmodel/fixture/fragment/VMTestFragment.java @@ -1,8 +1,8 @@ package eu.inloop.viewmodel.fixture.fragment; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; diff --git a/library/src/androidTest/java/eu/inloop/viewmodel/fixture/fragment/VMTestFragmentViewModel.java b/library/src/androidTest/java/eu/inloop/viewmodel/fixture/fragment/VMTestFragmentViewModel.java index 6a1e300..e8710d7 100644 --- a/library/src/androidTest/java/eu/inloop/viewmodel/fixture/fragment/VMTestFragmentViewModel.java +++ b/library/src/androidTest/java/eu/inloop/viewmodel/fixture/fragment/VMTestFragmentViewModel.java @@ -1,8 +1,8 @@ package eu.inloop.viewmodel.fixture.fragment; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import eu.inloop.viewmodel.AbstractViewModel; diff --git a/library/src/main/java/eu/inloop/viewmodel/AbstractViewModel.java b/library/src/main/java/eu/inloop/viewmodel/AbstractViewModel.java index aada88b..560b4c3 100644 --- a/library/src/main/java/eu/inloop/viewmodel/AbstractViewModel.java +++ b/library/src/main/java/eu/inloop/viewmodel/AbstractViewModel.java @@ -3,11 +3,11 @@ import android.app.Activity; import android.content.Intent; import android.os.Bundle; -import android.support.annotation.CallSuper; -import android.support.annotation.CheckResult; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; +import androidx.annotation.CallSuper; +import androidx.annotation.CheckResult; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; import android.util.Log; import android.view.View; diff --git a/library/src/main/java/eu/inloop/viewmodel/IView.java b/library/src/main/java/eu/inloop/viewmodel/IView.java index dee387c..7bd2054 100644 --- a/library/src/main/java/eu/inloop/viewmodel/IView.java +++ b/library/src/main/java/eu/inloop/viewmodel/IView.java @@ -1,7 +1,7 @@ package eu.inloop.viewmodel; import android.app.Activity; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; import eu.inloop.viewmodel.base.ViewModelBaseActivity; import eu.inloop.viewmodel.base.ViewModelBaseFragment; diff --git a/library/src/main/java/eu/inloop/viewmodel/IViewModelProvider.java b/library/src/main/java/eu/inloop/viewmodel/IViewModelProvider.java index 70e4555..76db555 100644 --- a/library/src/main/java/eu/inloop/viewmodel/IViewModelProvider.java +++ b/library/src/main/java/eu/inloop/viewmodel/IViewModelProvider.java @@ -1,6 +1,6 @@ package eu.inloop.viewmodel; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; /** * Your {@link android.app.Activity} must implement this interface if diff --git a/library/src/main/java/eu/inloop/viewmodel/ProxyViewHelper.java b/library/src/main/java/eu/inloop/viewmodel/ProxyViewHelper.java index f5a0b19..94d8ec4 100644 --- a/library/src/main/java/eu/inloop/viewmodel/ProxyViewHelper.java +++ b/library/src/main/java/eu/inloop/viewmodel/ProxyViewHelper.java @@ -1,11 +1,10 @@ package eu.inloop.viewmodel; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import java.lang.reflect.InvocationHandler; -import java.lang.reflect.Method; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Proxy; import java.lang.reflect.Type; diff --git a/library/src/main/java/eu/inloop/viewmodel/ViewModelHelper.java b/library/src/main/java/eu/inloop/viewmodel/ViewModelHelper.java index b94b7f5..b00234d 100644 --- a/library/src/main/java/eu/inloop/viewmodel/ViewModelHelper.java +++ b/library/src/main/java/eu/inloop/viewmodel/ViewModelHelper.java @@ -2,12 +2,12 @@ import android.app.Activity; import android.content.Intent; -import android.databinding.DataBindingUtil; -import android.databinding.ViewDataBinding; +import androidx.databinding.DataBindingUtil; +import androidx.databinding.ViewDataBinding; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; import android.util.Log; import android.view.LayoutInflater; @@ -34,7 +34,7 @@ public class ViewModelHelper> { /** * Call from {@link android.app.Activity#onCreate(android.os.Bundle)} or - * {@link android.support.v4.app.Fragment#onCreate(android.os.Bundle)} + * {@link androidx.core.app.Fragment#onCreate(android.os.Bundle)} * * @param activity parent activity * @param savedInstanceState savedInstance state from {@link Activity#onCreate(Bundle)} or @@ -86,7 +86,7 @@ public void onCreate(@NonNull Activity activity, } /** - * Call from {@link android.support.v4.app.Fragment#onViewCreated(android.view.View, android.os.Bundle)} + * Call from {@link androidx.core.app.Fragment#onViewCreated(android.view.View, android.os.Bundle)} * or {@link android.app.Activity#onCreate(android.os.Bundle)} * * @param view view @@ -133,8 +133,8 @@ public void performBinding(@NonNull final IView bindingView) { } /** - * Use in case this model is associated with an {@link android.support.v4.app.Fragment} - * Call from {@link android.support.v4.app.Fragment#onDestroyView()}. Use in case model is associated + * Use in case this model is associated with an {@link androidx.core.app.Fragment} + * Call from {@link androidx.core.app.Fragment#onDestroyView()}. Use in case model is associated * with Fragment * * @param fragment fragment @@ -152,8 +152,8 @@ public void onDestroyView(@NonNull Fragment fragment) { } /** - * Use in case this model is associated with an {@link android.support.v4.app.Fragment} - * Call from {@link android.support.v4.app.Fragment#onDestroy()} + * Use in case this model is associated with an {@link androidx.core.app.Fragment} + * Call from {@link androidx.core.app.Fragment#onDestroy()} * * @param fragment fragment */ @@ -194,7 +194,7 @@ public void onDestroy(@NonNull final Activity activity) { } /** - * Call from {@link android.app.Activity#onStop()} or {@link android.support.v4.app.Fragment#onStop()} + * Call from {@link android.app.Activity#onStop()} or {@link androidx.core.app.Fragment#onStop()} */ public void onStop() { if (mViewModel == null) { @@ -205,7 +205,7 @@ public void onStop() { } /** - * Call from {@link android.app.Activity#onStart()} ()} or {@link android.support.v4.app.Fragment#onStart()} ()} + * Call from {@link android.app.Activity#onStart()} ()} or {@link androidx.core.app.Fragment#onStart()} ()} */ public void onStart() { if (mViewModel == null) { @@ -234,7 +234,7 @@ public R getViewModel() { /** * Call from {@link android.app.Activity#onSaveInstanceState(android.os.Bundle)} - * or {@link android.support.v4.app.Fragment#onSaveInstanceState(android.os.Bundle)}. + * or {@link androidx.core.app.Fragment#onSaveInstanceState(android.os.Bundle)}. * This allows the model to save its state. * * @param bundle bundle diff --git a/library/src/main/java/eu/inloop/viewmodel/ViewModelProvider.java b/library/src/main/java/eu/inloop/viewmodel/ViewModelProvider.java index c484f72..ab07ecb 100644 --- a/library/src/main/java/eu/inloop/viewmodel/ViewModelProvider.java +++ b/library/src/main/java/eu/inloop/viewmodel/ViewModelProvider.java @@ -1,9 +1,9 @@ package eu.inloop.viewmodel; import android.app.Activity; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.annotation.VisibleForTesting; -import android.support.v4.app.FragmentActivity; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.VisibleForTesting; +import androidx.fragment.app.FragmentActivity; import java.util.Collections; import java.util.HashMap; @@ -11,8 +11,8 @@ /** * Create and keep this class inside your Activity. Store it - * in {@link android.support.v4.app.FragmentActivity#onRetainCustomNonConfigurationInstance() - * and restore in {@link android.support.v4.app.FragmentActivity#onCreate(android.os.Bundle)} before + * in {@link androidx.core.app.FragmentActivity#onRetainCustomNonConfigurationInstance() + * and restore in {@link androidx.core.app.FragmentActivity#onCreate(android.os.Bundle)} before * calling the super implemenentation. */ public class ViewModelProvider { diff --git a/library/src/main/java/eu/inloop/viewmodel/base/ViewModelBaseActivity.java b/library/src/main/java/eu/inloop/viewmodel/base/ViewModelBaseActivity.java index 2a7dc47..f7b895a 100644 --- a/library/src/main/java/eu/inloop/viewmodel/base/ViewModelBaseActivity.java +++ b/library/src/main/java/eu/inloop/viewmodel/base/ViewModelBaseActivity.java @@ -1,9 +1,9 @@ package eu.inloop.viewmodel.base; import android.os.Bundle; -import android.support.annotation.CallSuper; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.CallSuper; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import eu.inloop.viewmodel.AbstractViewModel; import eu.inloop.viewmodel.IView; diff --git a/library/src/main/java/eu/inloop/viewmodel/base/ViewModelBaseEmptyActivity.java b/library/src/main/java/eu/inloop/viewmodel/base/ViewModelBaseEmptyActivity.java index 35ebd20..f98db59 100644 --- a/library/src/main/java/eu/inloop/viewmodel/base/ViewModelBaseEmptyActivity.java +++ b/library/src/main/java/eu/inloop/viewmodel/base/ViewModelBaseEmptyActivity.java @@ -1,9 +1,9 @@ package eu.inloop.viewmodel.base; import android.os.Bundle; -import android.support.annotation.CallSuper; -import android.support.annotation.Nullable; -import android.support.v7.app.AppCompatActivity; +import androidx.annotation.CallSuper; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; import eu.inloop.viewmodel.IViewModelProvider; import eu.inloop.viewmodel.ViewModelProvider; diff --git a/library/src/main/java/eu/inloop/viewmodel/base/ViewModelBaseFragment.java b/library/src/main/java/eu/inloop/viewmodel/base/ViewModelBaseFragment.java index 35851f1..19d57b9 100644 --- a/library/src/main/java/eu/inloop/viewmodel/base/ViewModelBaseFragment.java +++ b/library/src/main/java/eu/inloop/viewmodel/base/ViewModelBaseFragment.java @@ -1,10 +1,10 @@ package eu.inloop.viewmodel.base; import android.os.Bundle; -import android.support.annotation.CallSuper; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; +import androidx.annotation.CallSuper; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; import android.view.View; import eu.inloop.viewmodel.AbstractViewModel; diff --git a/library/src/main/java/eu/inloop/viewmodel/binding/ViewModelBaseBindingFragment.java b/library/src/main/java/eu/inloop/viewmodel/binding/ViewModelBaseBindingFragment.java index abc4485..4fabe9e 100644 --- a/library/src/main/java/eu/inloop/viewmodel/binding/ViewModelBaseBindingFragment.java +++ b/library/src/main/java/eu/inloop/viewmodel/binding/ViewModelBaseBindingFragment.java @@ -1,13 +1,13 @@ package eu.inloop.viewmodel.binding; -import android.databinding.ViewDataBinding; +import androidx.databinding.ViewDataBinding; import android.os.Bundle; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import eu.inloop.viewmodel.AbstractViewModel; import eu.inloop.viewmodel.IView; diff --git a/library/src/main/java/eu/inloop/viewmodel/binding/ViewModelBindingConfig.java b/library/src/main/java/eu/inloop/viewmodel/binding/ViewModelBindingConfig.java index d008c47..4cb750c 100644 --- a/library/src/main/java/eu/inloop/viewmodel/binding/ViewModelBindingConfig.java +++ b/library/src/main/java/eu/inloop/viewmodel/binding/ViewModelBindingConfig.java @@ -1,8 +1,8 @@ package eu.inloop.viewmodel.binding; import android.content.Context; -import android.support.annotation.LayoutRes; -import android.support.annotation.NonNull; +import androidx.annotation.LayoutRes; +import androidx.annotation.NonNull; import eu.inloop.viewmodel.BR; diff --git a/library/src/main/java/eu/inloop/viewmodel/support/ViewModelStatePagerAdapter.java b/library/src/main/java/eu/inloop/viewmodel/support/ViewModelStatePagerAdapter.java index 4254e7a..c632fac 100644 --- a/library/src/main/java/eu/inloop/viewmodel/support/ViewModelStatePagerAdapter.java +++ b/library/src/main/java/eu/inloop/viewmodel/support/ViewModelStatePagerAdapter.java @@ -1,9 +1,9 @@ package eu.inloop.viewmodel.support; -import android.support.annotation.NonNull; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentManager; -import android.support.v4.app.FragmentStatePagerAdapter; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentStatePagerAdapter; import android.util.Log; import android.view.ViewGroup; diff --git a/sample/build.gradle b/sample/build.gradle index 62412e8..228c3a8 100644 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -1,13 +1,12 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 27 - buildToolsVersion '27.0.3' + compileSdkVersion 28 defaultConfig { applicationId 'eu.inloop.viewmodel.sample' minSdkVersion 15 - targetSdkVersion 27 + targetSdkVersion 28 versionCode 1 versionName '1.0' } @@ -30,12 +29,12 @@ android { } dependencies { - implementation 'com.android.support:support-fragment:27.1.0' - implementation 'com.android.support:appcompat-v7:27.1.0' - implementation 'com.android.support:support-v4:27.1.0' + implementation 'androidx.fragment:fragment:1.0.0' + implementation 'androidx.appcompat:appcompat:1.0.2' + debugImplementation 'com.squareup.leakcanary:leakcanary-android:1.5.1' releaseImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.1' - implementation 'com.jakewharton:butterknife:8.8.1' - annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1' + implementation 'com.jakewharton:butterknife:10.0.0' + annotationProcessor 'com.jakewharton:butterknife-compiler:10.0.0' implementation project(':library') } diff --git a/sample/src/main/java/eu/inloop/viewmodel/sample/activity/ViewPagerActivity.java b/sample/src/main/java/eu/inloop/viewmodel/sample/activity/ViewPagerActivity.java index 7d7ec34..2e56405 100644 --- a/sample/src/main/java/eu/inloop/viewmodel/sample/activity/ViewPagerActivity.java +++ b/sample/src/main/java/eu/inloop/viewmodel/sample/activity/ViewPagerActivity.java @@ -1,10 +1,11 @@ package eu.inloop.viewmodel.sample.activity; import android.os.Bundle; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentManager; -import android.support.v4.view.ViewPager; + +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.viewpager.widget.ViewPager; import butterknife.BindView; import butterknife.ButterKnife; import eu.inloop.viewmodel.base.ViewModelBaseEmptyActivity; diff --git a/sample/src/main/java/eu/inloop/viewmodel/sample/fragment/PagerFragment.java b/sample/src/main/java/eu/inloop/viewmodel/sample/fragment/PagerFragment.java index d90717f..daf7d60 100644 --- a/sample/src/main/java/eu/inloop/viewmodel/sample/fragment/PagerFragment.java +++ b/sample/src/main/java/eu/inloop/viewmodel/sample/fragment/PagerFragment.java @@ -1,8 +1,8 @@ package eu.inloop.viewmodel.sample.fragment; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -11,7 +11,6 @@ import com.squareup.leakcanary.RefWatcher; import eu.inloop.viewmodel.base.ViewModelBaseFragment; -import eu.inloop.viewmodel.binding.ViewModelBindingConfig; import eu.inloop.viewmodel.sample.R; import eu.inloop.viewmodel.sample.SampleApplication; import eu.inloop.viewmodel.sample.viewmodel.PageModel; diff --git a/sample/src/main/java/eu/inloop/viewmodel/sample/fragment/SampleBindingFragment.java b/sample/src/main/java/eu/inloop/viewmodel/sample/fragment/SampleBindingFragment.java index 7fa2e9f..934666f 100644 --- a/sample/src/main/java/eu/inloop/viewmodel/sample/fragment/SampleBindingFragment.java +++ b/sample/src/main/java/eu/inloop/viewmodel/sample/fragment/SampleBindingFragment.java @@ -1,11 +1,11 @@ package eu.inloop.viewmodel.sample.fragment; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import android.view.View; +import androidx.fragment.app.Fragment; import eu.inloop.viewmodel.binding.ViewModelBaseBindingFragment; import eu.inloop.viewmodel.binding.ViewModelBindingConfig; import eu.inloop.viewmodel.sample.R; diff --git a/sample/src/main/java/eu/inloop/viewmodel/sample/fragment/SampleBundleFragment.java b/sample/src/main/java/eu/inloop/viewmodel/sample/fragment/SampleBundleFragment.java index 474a039..031a285 100644 --- a/sample/src/main/java/eu/inloop/viewmodel/sample/fragment/SampleBundleFragment.java +++ b/sample/src/main/java/eu/inloop/viewmodel/sample/fragment/SampleBundleFragment.java @@ -1,7 +1,7 @@ package eu.inloop.viewmodel.sample.fragment; import android.os.Bundle; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -9,7 +9,6 @@ import butterknife.ButterKnife; import eu.inloop.viewmodel.IView; import eu.inloop.viewmodel.base.ViewModelBaseFragment; -import eu.inloop.viewmodel.binding.ViewModelBindingConfig; import eu.inloop.viewmodel.sample.R; import eu.inloop.viewmodel.sample.viewmodel.SampleArgumentViewModel; diff --git a/sample/src/main/java/eu/inloop/viewmodel/sample/fragment/UserListFragment.java b/sample/src/main/java/eu/inloop/viewmodel/sample/fragment/UserListFragment.java index 92c8814..d415492 100644 --- a/sample/src/main/java/eu/inloop/viewmodel/sample/fragment/UserListFragment.java +++ b/sample/src/main/java/eu/inloop/viewmodel/sample/fragment/UserListFragment.java @@ -2,8 +2,8 @@ import android.content.Intent; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -21,7 +21,6 @@ import butterknife.BindView; import butterknife.ButterKnife; import eu.inloop.viewmodel.base.ViewModelBaseFragment; -import eu.inloop.viewmodel.binding.ViewModelBindingConfig; import eu.inloop.viewmodel.sample.R; import eu.inloop.viewmodel.sample.SampleApplication; import eu.inloop.viewmodel.sample.activity.SampleBindingActivity; diff --git a/sample/src/main/java/eu/inloop/viewmodel/sample/viewmodel/PageModel.java b/sample/src/main/java/eu/inloop/viewmodel/sample/viewmodel/PageModel.java index 69d4a9e..a238f1e 100644 --- a/sample/src/main/java/eu/inloop/viewmodel/sample/viewmodel/PageModel.java +++ b/sample/src/main/java/eu/inloop/viewmodel/sample/viewmodel/PageModel.java @@ -1,7 +1,7 @@ package eu.inloop.viewmodel.sample.viewmodel; import android.os.Bundle; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; import eu.inloop.viewmodel.AbstractViewModel; import eu.inloop.viewmodel.sample.viewmodel.view.IPageView; diff --git a/sample/src/main/java/eu/inloop/viewmodel/sample/viewmodel/SampleArgumentViewModel.java b/sample/src/main/java/eu/inloop/viewmodel/sample/viewmodel/SampleArgumentViewModel.java index a8275a5..c31e0d3 100644 --- a/sample/src/main/java/eu/inloop/viewmodel/sample/viewmodel/SampleArgumentViewModel.java +++ b/sample/src/main/java/eu/inloop/viewmodel/sample/viewmodel/SampleArgumentViewModel.java @@ -1,7 +1,7 @@ package eu.inloop.viewmodel.sample.viewmodel; import android.os.Bundle; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; import android.util.Log; import eu.inloop.viewmodel.AbstractViewModel; diff --git a/sample/src/main/java/eu/inloop/viewmodel/sample/viewmodel/SampleBindingViewModel.java b/sample/src/main/java/eu/inloop/viewmodel/sample/viewmodel/SampleBindingViewModel.java index 40a74e5..21f832f 100644 --- a/sample/src/main/java/eu/inloop/viewmodel/sample/viewmodel/SampleBindingViewModel.java +++ b/sample/src/main/java/eu/inloop/viewmodel/sample/viewmodel/SampleBindingViewModel.java @@ -1,8 +1,8 @@ package eu.inloop.viewmodel.sample.viewmodel; -import android.databinding.ObservableField; +import androidx.databinding.ObservableField; import android.os.Bundle; -import android.support.annotation.Nullable; +import androidx.annotation.Nullable; import eu.inloop.viewmodel.AbstractViewModel; import eu.inloop.viewmodel.sample.viewmodel.view.ISampleBindingView; diff --git a/sample/src/main/java/eu/inloop/viewmodel/sample/viewmodel/UserListViewModel.java b/sample/src/main/java/eu/inloop/viewmodel/sample/viewmodel/UserListViewModel.java index 607cd43..58e5a0c 100644 --- a/sample/src/main/java/eu/inloop/viewmodel/sample/viewmodel/UserListViewModel.java +++ b/sample/src/main/java/eu/inloop/viewmodel/sample/viewmodel/UserListViewModel.java @@ -3,8 +3,8 @@ import android.annotation.SuppressLint; import android.os.AsyncTask; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import java.util.ArrayList; import java.util.List; diff --git a/sample/src/main/res/layout/activity_pager.xml b/sample/src/main/res/layout/activity_pager.xml index 0c61343..e6e6d08 100644 --- a/sample/src/main/res/layout/activity_pager.xml +++ b/sample/src/main/res/layout/activity_pager.xml @@ -3,7 +3,7 @@ android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> - From 378bc311fef169cca5b26369043d9e04163751cf Mon Sep 17 00:00:00 2001 From: Daniel Novak Date: Wed, 13 Feb 2019 18:29:27 +0100 Subject: [PATCH 10/10] Bump version to 1.4.0 --- CHANGELOG.md | 4 ++++ README.md | 4 ++-- gradle.properties | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cd9ac1c..e30c163 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.4.0(2019-02-13) + +- Migrate to AndroidX + ## 1.3.5(2018-03-07) - Updated dependencies (Support library, build tools, Gradle). diff --git a/README.md b/README.md index 46031ce..d7dee4a 100644 --- a/README.md +++ b/README.md @@ -118,7 +118,7 @@ Download -------- ```groovy -compile 'eu.inloop:androidviewmodel:1.3.5' +compile 'eu.inloop:androidviewmodel:1.4.0' ``` ## Android Studio Template @@ -140,4 +140,4 @@ curl -o androidviewmodel.zip -Lk https://github.com/inloop/AndroidViewModel/arch In the Android Studio right click inside the Projet window and select `File > New > AndroidViewModel Inloop > AVM Fragment` -![Android Studio New Template](/template/create-new-template-preview.png) \ No newline at end of file +![Android Studio New Template](/template/create-new-template-preview.png) diff --git a/gradle.properties b/gradle.properties index 24dbcda..f9ed904 100644 --- a/gradle.properties +++ b/gradle.properties @@ -19,4 +19,4 @@ android.enableJetifier=true android.useAndroidX=true -VERSION_NAME=1.3.5 \ No newline at end of file +VERSION_NAME=1.4.0