Skip to content

Commit 74ba8ee

Browse files
author
Daniel Novak
committed
Add annotations and cleanup code
1 parent 956b8a0 commit 74ba8ee

File tree

11 files changed

+82
-27
lines changed

11 files changed

+82
-27
lines changed

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ buildscript {
33
jcenter()
44
}
55
dependencies {
6-
classpath 'com.android.tools.build:gradle:2.1.3'
6+
classpath 'com.android.tools.build:gradle:2.2.0'
77
}
88
}
99

library/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ android {
2424
}
2525

2626
dependencies {
27-
compile 'com.android.support:appcompat-v7:24.2.0'
27+
compile 'com.android.support:appcompat-v7:24.2.1'
2828
}
2929

3030
task androidJavadocs(type: Javadoc) {

library/src/main/java/eu/inloop/viewmodel/AbstractViewModel.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import android.app.Activity;
44
import android.content.Intent;
55
import android.os.Bundle;
6+
import android.support.annotation.CallSuper;
67
import android.support.annotation.NonNull;
78
import android.support.annotation.Nullable;
89
import android.support.v4.app.Fragment;
@@ -42,16 +43,17 @@ public String getUniqueIdentifier() {
4243
* only in case the system is killed due to low memory
4344
* and restored (and {@link #onSaveInstanceState(Bundle)} returned a non-null bundle.
4445
*/
45-
@SuppressWarnings("EmptyMethod")
46+
@SuppressWarnings({"EmptyMethod", "UnusedParameters"})
4647
public void onCreate(@Nullable Bundle arguments, @Nullable Bundle savedInstanceState) {
4748

4849
}
4950

5051
/**
5152
* This method is an equivalent of {@link Fragment#onViewCreated(View, Bundle)} or {@link Activity#onCreate(Bundle)}.
5253
* At this point, the View is ready and you can initialise it.
53-
* @param view
54+
* @param view - View assigned to this ViewModel
5455
*/
56+
@CallSuper
5557
public void onBindView(@NonNull T view) {
5658
mBindViewWasCalled = true;
5759
mView = view;
@@ -62,21 +64,22 @@ public T getView() {
6264
return mView;
6365
}
6466

67+
@CallSuper
6568
public void clearView() {
6669
mView = null;
6770
}
6871

69-
@SuppressWarnings("EmptyMethod")
72+
@SuppressWarnings({"EmptyMethod", "UnusedParameters"})
7073
public void onSaveInstanceState(@NonNull final Bundle bundle) {
7174

7275
}
7376

74-
@SuppressWarnings("EmptyMethod")
77+
@SuppressWarnings({"EmptyMethod", "WeakerAccess"})
7578
public void onStop() {
7679

7780
}
7881

79-
@SuppressWarnings("EmptyMethod")
82+
@SuppressWarnings({"EmptyMethod", "WeakerAccess"})
8083
public void onStart() {
8184
if (mView == null && !mBindViewWasCalled) {
8285
Log.e("AndroidViewModel", this.getClass().getSimpleName() + " - no view associated. You probably did not call setModelView() in your Fragment or Activity");

library/src/main/java/eu/inloop/viewmodel/IViewModelProvider.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package eu.inloop.viewmodel;
22

3+
import android.support.annotation.Nullable;
4+
35
/**
46
* Your {@link android.app.Activity} must implement this interface if
57
* any of the contained Fragments the {@link eu.inloop.viewmodel.ViewModelHelper}
@@ -10,5 +12,6 @@ public interface IViewModelProvider {
1012
* See {@link eu.inloop.viewmodel.base.ViewModelBaseActivity} on how to implement.
1113
* @return the {@link ViewModelProvider}.
1214
*/
15+
@Nullable
1316
ViewModelProvider getViewModelProvider();
1417
}

library/src/main/java/eu/inloop/viewmodel/ViewModelHelper.java

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,15 @@
1212

1313
public class ViewModelHelper<T extends IView, R extends AbstractViewModel<T>> {
1414

15+
@NonNull
16+
private static final String STATE_STRING_SCREEN_IDENTIFIER = ViewModelHelper.class + ".state.string.identifier"; //NON-NLS
17+
1518
@Nullable
1619
private String mScreenId;
20+
1721
@Nullable
1822
private R mViewModel;
23+
1924
private boolean mModelRemoved;
2025
private boolean mOnSaveInstanceCalled;
2126

@@ -43,19 +48,29 @@ public void onCreate(@NonNull Activity activity,
4348
if (savedInstanceState == null) {
4449
mScreenId = UUID.randomUUID().toString();
4550
} else {
46-
mScreenId = savedInstanceState.getString("identifier");
51+
mScreenId = savedInstanceState.getString(STATE_STRING_SCREEN_IDENTIFIER);
52+
if (null == mScreenId) {
53+
throw new IllegalStateException("Bundle from onSaveInstanceState() didn't contain screen identifier. " + //NON-NLS
54+
"Did you call ViewModelHelper.onSaveInstanceState?"); //NON-NLS
55+
}
56+
4757
mOnSaveInstanceCalled = false;
4858
}
4959

5060
// get model instance for this screen
51-
final ViewModelProvider.ViewModelWrapper<T> viewModelWrapper = getViewModelProvider(activity).getViewModelProvider().getViewModel(mScreenId, viewModelClass);
61+
final ViewModelProvider viewModelProvider = getViewModelProvider(activity).getViewModelProvider();
62+
if (null == viewModelProvider) {
63+
throw new IllegalStateException("ViewModelProvider for activity " + activity + " was null."); //NON-NLS
64+
}
65+
66+
final ViewModelProvider.ViewModelWrapper<T> viewModelWrapper = viewModelProvider.getViewModel(mScreenId, viewModelClass);
5267
//noinspection unchecked
5368
mViewModel = (R) viewModelWrapper.viewModel;
5469

5570
if (viewModelWrapper.wasCreated) {
5671
// detect that the system has killed the app - saved instance is not null, but the model was recreated
5772
if (BuildConfig.DEBUG && savedInstanceState != null) {
58-
Log.d("model", "Fragment recreated by system - restoring viewmodel");
73+
Log.d("model", "Fragment recreated by system - restoring viewmodel"); //NON-NLS
5974
}
6075
mViewModel.onCreate(arguments, savedInstanceState);
6176
}
@@ -174,7 +189,7 @@ public R getViewModel() {
174189
* @param bundle bundle
175190
*/
176191
public void onSaveInstanceState(@NonNull Bundle bundle) {
177-
bundle.putString("identifier", mScreenId);
192+
bundle.putString(STATE_STRING_SCREEN_IDENTIFIER, mScreenId);
178193
if (mViewModel != null) {
179194
mViewModel.onSaveInstanceState(bundle);
180195
mOnSaveInstanceCalled = true;
@@ -183,12 +198,17 @@ public void onSaveInstanceState(@NonNull Bundle bundle) {
183198

184199
private void removeViewModel(@NonNull final Activity activity) {
185200
if (mViewModel != null && !mModelRemoved) {
186-
getViewModelProvider(activity).getViewModelProvider().remove(mScreenId);
201+
final ViewModelProvider viewModelProvider = getViewModelProvider(activity).getViewModelProvider();
202+
if (null == viewModelProvider) {
203+
throw new IllegalStateException("ViewModelProvider for activity " + activity + " was null."); //NON-NLS
204+
}
205+
viewModelProvider.remove(mScreenId);
187206
mViewModel.onDestroy();
188207
mModelRemoved = true;
189208
}
190209
}
191210

211+
@NonNull
192212
private IViewModelProvider getViewModelProvider(@NonNull Activity activity) {
193213
if (!(activity instanceof IViewModelProvider)) {
194214
throw new IllegalStateException("Your activity must implement IViewModelProvider"); //NON-NLS

library/src/main/java/eu/inloop/viewmodel/ViewModelProvider.java

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package eu.inloop.viewmodel;
22
import android.app.Activity;
33
import android.support.annotation.NonNull;
4+
import android.support.annotation.Nullable;
45
import android.support.v4.app.FragmentActivity;
56

67
import java.util.HashMap;
@@ -13,31 +14,34 @@
1314
*/
1415
public class ViewModelProvider {
1516

17+
@NonNull
1618
private final HashMap<String, AbstractViewModel<? extends IView>> mViewModelCache;
1719

20+
@NonNull
1821
public static ViewModelProvider newInstance(@NonNull final FragmentActivity activity) {
1922
if (activity.getLastCustomNonConfigurationInstance() == null) {
2023
return new ViewModelProvider();
2124
} else {
22-
return (ViewModelProvider) activity.getLastCustomNonConfigurationInstance();
25+
return (ViewModelProvider) activity.getLastCustomNonConfigurationInstance();
2326
}
2427
}
2528

2629
@SuppressWarnings({"deprecation", "unused"})
30+
@NonNull
2731
@Deprecated
2832
public static ViewModelProvider newInstance(@NonNull final Activity activity) {
2933
if (activity.getLastNonConfigurationInstance() == null) {
3034
return new ViewModelProvider();
3135
} else {
32-
return (ViewModelProvider) activity.getLastNonConfigurationInstance();
36+
return (ViewModelProvider) activity.getLastNonConfigurationInstance();
3337
}
3438
}
3539

3640
private ViewModelProvider() {
3741
mViewModelCache = new HashMap<>();
3842
}
3943

40-
public synchronized void remove(String modeIdentifier) {
44+
public synchronized void remove(@Nullable String modeIdentifier) {
4145
mViewModelCache.remove(modeIdentifier);
4246
}
4347

@@ -47,29 +51,29 @@ public synchronized void removeAllViewModels() {
4751

4852
@SuppressWarnings("unchecked")
4953
@NonNull
50-
public synchronized <T extends IView> ViewModelWrapper<T> getViewModel(final String modelIdentifier,
51-
final @NonNull Class<? extends AbstractViewModel<T>> viewModelClass) {
54+
public synchronized <T extends IView> ViewModelWrapper<T> getViewModel(@NonNull final String modelIdentifier,
55+
@NonNull final Class<? extends AbstractViewModel<T>> viewModelClass) {
5256
AbstractViewModel<T> instance = (AbstractViewModel<T>) mViewModelCache.get(modelIdentifier);
5357
if (instance != null) {
5458
return new ViewModelWrapper<>(instance, false);
5559
}
5660

5761
try {
5862
instance = viewModelClass.newInstance();
59-
instance.setUniqueIdentifier(modelIdentifier);
60-
mViewModelCache.put(modelIdentifier, instance);
61-
return new ViewModelWrapper<>(instance, true);
62-
} catch (Exception ex) {
63+
} catch (final Exception ex) {
6364
throw new RuntimeException(ex);
6465
}
66+
instance.setUniqueIdentifier(modelIdentifier);
67+
mViewModelCache.put(modelIdentifier, instance);
68+
return new ViewModelWrapper<>(instance, true);
6569
}
6670

67-
public static class ViewModelWrapper<T extends IView> {
71+
final static class ViewModelWrapper<T extends IView> {
6872
@NonNull
69-
public final AbstractViewModel<T> viewModel;
70-
public final boolean wasCreated;
73+
final AbstractViewModel<T> viewModel;
74+
final boolean wasCreated;
7175

72-
private ViewModelWrapper(@NonNull AbstractViewModel<T> mViewModel, boolean mWasCreated) {
76+
private ViewModelWrapper(@NonNull AbstractViewModel<T> mViewModel, final boolean mWasCreated) {
7377
this.viewModel = mViewModel;
7478
this.wasCreated = mWasCreated;
7579
}

library/src/main/java/eu/inloop/viewmodel/base/ViewModelBaseActivity.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package eu.inloop.viewmodel.base;
22

33
import android.os.Bundle;
4+
import android.support.annotation.CallSuper;
45
import android.support.annotation.NonNull;
56
import android.support.annotation.Nullable;
67

@@ -10,8 +11,10 @@
1011

1112
public abstract class ViewModelBaseActivity<T extends IView, R extends AbstractViewModel<T>> extends ViewModelBaseEmptyActivity implements IView {
1213

14+
@NonNull
1315
private final ViewModelHelper<T, R> mViewModeHelper = new ViewModelHelper<>();
1416

17+
@CallSuper
1518
@Override
1619
protected void onCreate(@Nullable final Bundle savedInstanceState) {
1720
super.onCreate(savedInstanceState);
@@ -27,26 +30,31 @@ public void setModelView(@NonNull final T view) {
2730
mViewModeHelper.setView(view);
2831
}
2932

33+
@Nullable
3034
public abstract Class<R> getViewModelClass();
3135

36+
@CallSuper
3237
@Override
3338
public void onSaveInstanceState(@NonNull final Bundle outState) {
3439
super.onSaveInstanceState(outState);
3540
mViewModeHelper.onSaveInstanceState(outState);
3641
}
3742

43+
@CallSuper
3844
@Override
3945
public void onStart() {
4046
super.onStart();
4147
mViewModeHelper.onStart();
4248
}
4349

50+
@CallSuper
4451
@Override
4552
public void onStop() {
4653
super.onStop();
4754
mViewModeHelper.onStop();
4855
}
4956

57+
@CallSuper
5058
@Override
5159
public void onDestroy() {
5260
mViewModeHelper.onDestroy(this);

library/src/main/java/eu/inloop/viewmodel/base/ViewModelBaseEmptyActivity.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package eu.inloop.viewmodel.base;
22

33
import android.os.Bundle;
4+
import android.support.annotation.CallSuper;
45
import android.support.annotation.Nullable;
56
import android.support.v7.app.AppCompatActivity;
67

@@ -14,8 +15,10 @@
1415
*/
1516
public abstract class ViewModelBaseEmptyActivity extends AppCompatActivity implements IViewModelProvider {
1617

18+
@Nullable
1719
private ViewModelProvider mViewModelProvider;
1820

21+
@CallSuper
1922
@Override
2023
protected void onCreate(@Nullable final Bundle savedInstanceState) {
2124
//This code must be execute prior to super.onCreate()
@@ -29,14 +32,19 @@ public Object onRetainCustomNonConfigurationInstance() {
2932
return mViewModelProvider;
3033
}
3134

35+
@CallSuper
3236
@Override
3337
public void onStop() {
3438
super.onStop();
3539
if (isFinishing()) {
40+
if (null == mViewModelProvider) {
41+
throw new IllegalStateException("ViewModelProvider for activity " + this + " was null."); //NON-NLS
42+
}
3643
mViewModelProvider.removeAllViewModels();
3744
}
3845
}
3946

47+
@Nullable
4048
@Override
4149
public ViewModelProvider getViewModelProvider() {
4250
return mViewModelProvider;

library/src/main/java/eu/inloop/viewmodel/base/ViewModelBaseFragment.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package eu.inloop.viewmodel.base;
22

33
import android.os.Bundle;
4+
import android.support.annotation.CallSuper;
45
import android.support.annotation.NonNull;
56
import android.support.annotation.Nullable;
67
import android.support.v4.app.Fragment;
@@ -12,8 +13,10 @@
1213

1314
public abstract class ViewModelBaseFragment<T extends IView, R extends AbstractViewModel<T>> extends Fragment implements IView {
1415

16+
@NonNull
1517
private final ViewModelHelper<T, R> mViewModeHelper = new ViewModelHelper<>();
1618

19+
@CallSuper
1720
@Override
1821
public void onCreate(@Nullable final Bundle savedInstanceState) {
1922
super.onCreate(savedInstanceState);
@@ -31,30 +34,35 @@ protected void setModelView(@NonNull final T view) {
3134
mViewModeHelper.setView(view);
3235
}
3336

37+
@CallSuper
3438
@Override
3539
public void onSaveInstanceState(@NonNull final Bundle outState) {
3640
super.onSaveInstanceState(outState);
3741
mViewModeHelper.onSaveInstanceState(outState);
3842
}
3943

44+
@CallSuper
4045
@Override
4146
public void onStart() {
4247
super.onStart();
4348
mViewModeHelper.onStart();
4449
}
4550

51+
@CallSuper
4652
@Override
4753
public void onStop() {
4854
super.onStop();
4955
mViewModeHelper.onStop();
5056
}
5157

58+
@CallSuper
5259
@Override
5360
public void onDestroyView() {
5461
mViewModeHelper.onDestroyView(this);
5562
super.onDestroyView();
5663
}
5764

65+
@CallSuper
5866
@Override
5967
public void onDestroy() {
6068
mViewModeHelper.onDestroy(this);

0 commit comments

Comments
 (0)