From 60da9918dad826f9d4f0de04941dd1e0761cfa0f Mon Sep 17 00:00:00 2001 From: Robert Berghegger Date: Tue, 4 Apr 2017 17:48:18 +0200 Subject: [PATCH 1/5] Restricts the TiFragment api by declaring some implemented methods from the DelegatedTiFragment interface as final so they cannot be overridden by subclasses. --- .../grandcentrix/thirtyinch/TiFragment.java | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/thirtyinch/src/main/java/net/grandcentrix/thirtyinch/TiFragment.java b/thirtyinch/src/main/java/net/grandcentrix/thirtyinch/TiFragment.java index e0f35665..34feeb12 100644 --- a/thirtyinch/src/main/java/net/grandcentrix/thirtyinch/TiFragment.java +++ b/thirtyinch/src/main/java/net/grandcentrix/thirtyinch/TiFragment.java @@ -53,19 +53,19 @@ public abstract class TiFragment

, V extends TiView> ext @NonNull @Override - public Removable addBindViewInterceptor(@NonNull final BindViewInterceptor interceptor) { + public final Removable addBindViewInterceptor(@NonNull final BindViewInterceptor interceptor) { return mDelegate.addBindViewInterceptor(interceptor); } @Nullable @Override - public V getInterceptedViewOf(@NonNull final BindViewInterceptor interceptor) { + public final V getInterceptedViewOf(@NonNull final BindViewInterceptor interceptor) { return mDelegate.getInterceptedViewOf(interceptor); } @NonNull @Override - public List getInterceptors( + public final List getInterceptors( @NonNull final Filter predicate) { return mDelegate.getInterceptors(predicate); } @@ -79,12 +79,12 @@ public String getLoggingTag() { * is {@code null} before {@link #onCreate(Bundle)} */ @Override - public P getPresenter() { + public final P getPresenter() { return mDelegate.getPresenter(); } @Override - public Executor getUiThreadExecutor() { + public final Executor getUiThreadExecutor() { return mUiThreadExecutor; } @@ -93,32 +93,32 @@ public Executor getUiThreadExecutor() { * through all the interceptors (again). */ @Override - public void invalidateView() { + public final void invalidateView() { mDelegate.invalidateView(); } @Override - public boolean isDontKeepActivitiesEnabled() { + public final boolean isDontKeepActivitiesEnabled() { return AndroidDeveloperOptions.isDontKeepActivitiesEnabled(getActivity()); } @Override - public boolean isFragmentAdded() { + public final boolean isFragmentAdded() { return isAdded(); } @Override - public boolean isFragmentDetached() { + public final boolean isFragmentDetached() { return isDetached(); } @Override - public boolean isHostingActivityChangingConfigurations() { + public final boolean isHostingActivityChangingConfigurations() { return getActivity().isChangingConfigurations(); } @Override - public boolean isHostingActivityFinishing() { + public final boolean isHostingActivityFinishing() { return getActivity().isFinishing(); } @@ -196,7 +196,7 @@ public V provideView() { } @Override - public void setFragmentRetainInstance(final boolean retain) { + public final void setFragmentRetainInstance(final boolean retain) { setRetainInstance(retain); } From 8039c9ce01fdbc1416318b2e33f8ed365c78a763 Mon Sep 17 00:00:00 2001 From: Robert Berghegger Date: Tue, 4 Apr 2017 17:54:46 +0200 Subject: [PATCH 2/5] Adds the CallSuper Annotation to all important lifecycle methods that requires calling the super implementation because TiFragment uses this lifecycle methods to manage the TiFragmentDelegate instance. --- .../main/java/net/grandcentrix/thirtyinch/TiFragment.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/thirtyinch/src/main/java/net/grandcentrix/thirtyinch/TiFragment.java b/thirtyinch/src/main/java/net/grandcentrix/thirtyinch/TiFragment.java index 34feeb12..8f5b9216 100644 --- a/thirtyinch/src/main/java/net/grandcentrix/thirtyinch/TiFragment.java +++ b/thirtyinch/src/main/java/net/grandcentrix/thirtyinch/TiFragment.java @@ -28,6 +28,7 @@ import net.grandcentrix.thirtyinch.util.AnnotationUtil; 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; @@ -122,12 +123,14 @@ public final boolean isHostingActivityFinishing() { return getActivity().isFinishing(); } + @CallSuper @Override public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); mDelegate.onCreate_afterSuper(savedInstanceState); } + @CallSuper @Nullable @Override public View onCreateView(final LayoutInflater inflater, @Nullable final ViewGroup container, @@ -136,30 +139,35 @@ public View onCreateView(final LayoutInflater inflater, @Nullable final ViewGrou return super.onCreateView(inflater, container, savedInstanceState); } + @CallSuper @Override public void onDestroy() { super.onDestroy(); mDelegate.onDestroy_afterSuper(); } + @CallSuper @Override public void onDestroyView() { mDelegate.onDestroyView_beforeSuper(); super.onDestroyView(); } + @CallSuper @Override public void onSaveInstanceState(final Bundle outState) { super.onSaveInstanceState(outState); mDelegate.onSaveInstanceState_afterSuper(outState); } + @CallSuper @Override public void onStart() { super.onStart(); mDelegate.onStart_afterSuper(); } + @CallSuper @Override public void onStop() { mDelegate.onStop_beforeSuper(); From 04cbae4320dfd4c786f707b57765747dbe14f84c Mon Sep 17 00:00:00 2001 From: Robert Berghegger Date: Tue, 4 Apr 2017 18:49:48 +0200 Subject: [PATCH 3/5] Restricts the TiActivity api. --- .../grandcentrix/thirtyinch/TiActivity.java | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/thirtyinch/src/main/java/net/grandcentrix/thirtyinch/TiActivity.java b/thirtyinch/src/main/java/net/grandcentrix/thirtyinch/TiActivity.java index 209870e7..0acf46a2 100644 --- a/thirtyinch/src/main/java/net/grandcentrix/thirtyinch/TiActivity.java +++ b/thirtyinch/src/main/java/net/grandcentrix/thirtyinch/TiActivity.java @@ -30,6 +30,7 @@ import android.content.res.Configuration; import android.os.Bundle; +import android.support.annotation.CallSuper; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; @@ -56,19 +57,19 @@ public abstract class TiActivity

, V extends TiView> @NonNull @Override - public Removable addBindViewInterceptor(@NonNull final BindViewInterceptor interceptor) { + public final Removable addBindViewInterceptor(@NonNull final BindViewInterceptor interceptor) { return mDelegate.addBindViewInterceptor(interceptor); } @Nullable @Override - public V getInterceptedViewOf(@NonNull final BindViewInterceptor interceptor) { + public final V getInterceptedViewOf(@NonNull final BindViewInterceptor interceptor) { return mDelegate.getInterceptedViewOf(interceptor); } @NonNull @Override - public List getInterceptors( + public final List getInterceptors( @NonNull final Filter predicate) { return mDelegate.getInterceptors(predicate); } @@ -82,14 +83,14 @@ public String getLoggingTag() { * is {@code null} before {@link #onCreate(Bundle)} */ @Override - public P getPresenter() { + public final P getPresenter() { return mDelegate.getPresenter(); } @SuppressWarnings("unchecked") @Nullable @Override - public P getRetainedPresenter() { + public final P getRetainedPresenter() { // try recover presenter via lastNonConfigurationInstance // this works most of the time final Object nci = getLastCustomNonConfigurationInstance(); @@ -101,7 +102,7 @@ public P getRetainedPresenter() { } @Override - public Executor getUiThreadExecutor() { + public final Executor getUiThreadExecutor() { return mUiThreadExecutor; } @@ -110,25 +111,26 @@ public Executor getUiThreadExecutor() { * through all the interceptors (again). */ @Override - public void invalidateView() { + public final void invalidateView() { mDelegate.invalidateView(); } @Override - public boolean isActivityChangingConfigurations() { + public final boolean isActivityChangingConfigurations() { return isChangingConfigurations(); } @Override - public boolean isActivityFinishing() { + public final boolean isActivityFinishing() { return isFinishing(); } @Override - public boolean isDontKeepActivitiesEnabled() { + public final boolean isDontKeepActivitiesEnabled() { return AndroidDeveloperOptions.isDontKeepActivitiesEnabled(this); } + @CallSuper @Override public void onConfigurationChanged(final Configuration newConfig) { super.onConfigurationChanged(newConfig); @@ -186,30 +188,35 @@ public String toString() { + "{presenter = " + presenter + "}"; } + @CallSuper @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); mDelegate.onCreate_afterSuper(savedInstanceState); } + @CallSuper @Override protected void onDestroy() { super.onDestroy(); mDelegate.onDestroy_afterSuper(); } + @CallSuper @Override protected void onSaveInstanceState(final Bundle outState) { super.onSaveInstanceState(outState); mDelegate.onSaveInstanceState_afterSuper(outState); } + @CallSuper @Override protected void onStart() { super.onStart(); mDelegate.onStart_afterSuper(); } + @CallSuper @Override protected void onStop() { mDelegate.onStop_beforeSuper(); From 243099498559ed19fbf0a091679802cec909e551 Mon Sep 17 00:00:00 2001 From: Robert Berghegger Date: Wed, 5 Apr 2017 10:40:15 +0200 Subject: [PATCH 4/5] Applies suggestions from the pull request and also restricts the TiActivityPlugin and the TiFragmentPlugin. --- .../thirtyinch/plugin/TiActivityPlugin.java | 28 ++++++++++------ .../thirtyinch/plugin/TiFragmentPlugin.java | 32 ++++++++++++------- .../grandcentrix/thirtyinch/TiActivity.java | 1 + 3 files changed, 39 insertions(+), 22 deletions(-) diff --git a/plugin/src/main/java/net/grandcentrix/thirtyinch/plugin/TiActivityPlugin.java b/plugin/src/main/java/net/grandcentrix/thirtyinch/plugin/TiActivityPlugin.java index 0717e339..142cdf29 100644 --- a/plugin/src/main/java/net/grandcentrix/thirtyinch/plugin/TiActivityPlugin.java +++ b/plugin/src/main/java/net/grandcentrix/thirtyinch/plugin/TiActivityPlugin.java @@ -38,6 +38,7 @@ import android.app.Activity; import android.content.res.Configuration; import android.os.Bundle; +import android.support.annotation.CallSuper; import android.support.annotation.NonNull; import android.support.annotation.Nullable; @@ -54,7 +55,7 @@ public class TiActivityPlugin

, V extends TiView> extend implements TiViewProvider, DelegatedTiActivity

, TiLoggingTagProvider, InterceptableViewBinder, PresenterAccessor { - public static final String NCI_KEY_PRESENTER = "presenter"; + private static final String NCI_KEY_PRESENTER = "presenter"; private String TAG = this.getClass().getSimpleName() + "@" + Integer.toHexString(this.hashCode()); @@ -81,7 +82,7 @@ public TiActivityPlugin(@NonNull final TiPresenterProvider

presenterProvider) @NonNull @Override - public Removable addBindViewInterceptor(@NonNull final BindViewInterceptor interceptor) { + public final Removable addBindViewInterceptor(@NonNull final BindViewInterceptor interceptor) { return mDelegate.addBindViewInterceptor(interceptor); } @@ -90,7 +91,7 @@ public Removable addBindViewInterceptor(@NonNull final BindViewInterceptor inter */ @Nullable @Override - public V getInterceptedViewOf(@NonNull final BindViewInterceptor interceptor) { + public final V getInterceptedViewOf(@NonNull final BindViewInterceptor interceptor) { return mDelegate.getInterceptedViewOf(interceptor); } @@ -100,7 +101,7 @@ public V getInterceptedViewOf(@NonNull final BindViewInterceptor interceptor) { */ @NonNull @Override - public List getInterceptors( + public final List getInterceptors( @NonNull final Filter predicate) { return mDelegate.getInterceptors(predicate); } @@ -111,14 +112,14 @@ public String getLoggingTag() { } @Override - public P getPresenter() { + public final P getPresenter() { return mDelegate.getPresenter(); } @SuppressWarnings("unchecked") @Nullable @Override - public P getRetainedPresenter() { + public final P getRetainedPresenter() { final Object nci = getLastNonConfigurationInstance(NCI_KEY_PRESENTER); if (nci != null) { return (P) nci; @@ -127,7 +128,7 @@ public P getRetainedPresenter() { } @Override - public Executor getUiThreadExecutor() { + public final Executor getUiThreadExecutor() { return mUiThreadExecutor; } @@ -136,7 +137,7 @@ public Executor getUiThreadExecutor() { * through all the interceptors (again). */ @Override - public void invalidateView() { + public final void invalidateView() { mDelegate.invalidateView(); } @@ -146,33 +147,37 @@ public boolean isActivityChangingConfigurations() { } @Override - public boolean isActivityFinishing() { + public final boolean isActivityFinishing() { return getActivity().isFinishing(); } @Override - public boolean isDontKeepActivitiesEnabled() { + public final boolean isDontKeepActivitiesEnabled() { return AndroidDeveloperOptions.isDontKeepActivitiesEnabled(getActivity()); } + @CallSuper @Override public void onConfigurationChanged(final Configuration newConfig) { super.onConfigurationChanged(newConfig); mDelegate.onConfigurationChanged_afterSuper(newConfig); } + @CallSuper @Override public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); mDelegate.onCreate_afterSuper(savedInstanceState); } + @CallSuper @Override public void onDestroy() { super.onDestroy(); mDelegate.onDestroy_afterSuper(); } + @CallSuper @Override @Nullable public CompositeNonConfigurationInstance onRetainNonConfigurationInstance() { @@ -188,18 +193,21 @@ public CompositeNonConfigurationInstance onRetainNonConfigurationInstance() { return null; } + @CallSuper @Override public void onSaveInstanceState(final Bundle outState) { super.onSaveInstanceState(outState); mDelegate.onSaveInstanceState_afterSuper(outState); } + @CallSuper @Override public void onStart() { super.onStart(); mDelegate.onStart_afterSuper(); } + @CallSuper @Override public void onStop() { mDelegate.onStop_beforeSuper(); diff --git a/plugin/src/main/java/net/grandcentrix/thirtyinch/plugin/TiFragmentPlugin.java b/plugin/src/main/java/net/grandcentrix/thirtyinch/plugin/TiFragmentPlugin.java index 4f8fbcd7..5deec439 100644 --- a/plugin/src/main/java/net/grandcentrix/thirtyinch/plugin/TiFragmentPlugin.java +++ b/plugin/src/main/java/net/grandcentrix/thirtyinch/plugin/TiFragmentPlugin.java @@ -36,6 +36,7 @@ import net.grandcentrix.thirtyinch.util.AnnotationUtil; 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; @@ -82,7 +83,7 @@ public TiFragmentPlugin(@NonNull final TiPresenterProvider

presenterProvider) @NonNull @Override - public Removable addBindViewInterceptor(@NonNull final BindViewInterceptor interceptor) { + public final Removable addBindViewInterceptor(@NonNull final BindViewInterceptor interceptor) { return mDelegate.addBindViewInterceptor(interceptor); } @@ -91,7 +92,7 @@ public Removable addBindViewInterceptor(@NonNull final BindViewInterceptor inter */ @Nullable @Override - public V getInterceptedViewOf(@NonNull final BindViewInterceptor interceptor) { + public final V getInterceptedViewOf(@NonNull final BindViewInterceptor interceptor) { return mDelegate.getInterceptedViewOf(interceptor); } @@ -101,7 +102,7 @@ public V getInterceptedViewOf(@NonNull final BindViewInterceptor interceptor) { */ @NonNull @Override - public List getInterceptors( + public final List getInterceptors( @NonNull final Filter predicate) { return mDelegate.getInterceptors(predicate); } @@ -112,12 +113,12 @@ public String getLoggingTag() { } @Override - public P getPresenter() { + public final P getPresenter() { return mDelegate.getPresenter(); } @Override - public Executor getUiThreadExecutor() { + public final Executor getUiThreadExecutor() { return mUiThreadExecutor; } @@ -126,41 +127,43 @@ public Executor getUiThreadExecutor() { * through all the interceptors (again). */ @Override - public void invalidateView() { + public final void invalidateView() { mDelegate.invalidateView(); } @Override - public boolean isDontKeepActivitiesEnabled() { + public final boolean isDontKeepActivitiesEnabled() { return AndroidDeveloperOptions.isDontKeepActivitiesEnabled(getFragment().getActivity()); } @Override - public boolean isFragmentAdded() { + public final boolean isFragmentAdded() { return getFragment().isAdded(); } @Override - public boolean isFragmentDetached() { + public final boolean isFragmentDetached() { return getFragment().isDetached(); } @Override - public boolean isHostingActivityChangingConfigurations() { + public final boolean isHostingActivityChangingConfigurations() { return getFragment().getActivity().isChangingConfigurations(); } @Override - public boolean isHostingActivityFinishing() { + public final boolean isHostingActivityFinishing() { return getFragment().getActivity().isFinishing(); } + @CallSuper @Override public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); mDelegate.onCreate_afterSuper(savedInstanceState); } + @CallSuper @Nullable @Override public View onCreateView(final LayoutInflater inflater, @Nullable final ViewGroup container, @@ -169,30 +172,35 @@ public View onCreateView(final LayoutInflater inflater, @Nullable final ViewGrou return super.onCreateView(inflater, container, savedInstanceState); } + @CallSuper @Override public void onDestroy() { super.onDestroy(); mDelegate.onDestroy_afterSuper(); } + @CallSuper @Override public void onDestroyView() { mDelegate.onDestroyView_beforeSuper(); super.onDestroyView(); } + @CallSuper @Override public void onSaveInstanceState(final Bundle outState) { super.onSaveInstanceState(outState); mDelegate.onSaveInstanceState_afterSuper(outState); } + @CallSuper @Override public void onStart() { super.onStart(); mDelegate.onStart_afterSuper(); } + @CallSuper @Override public void onStop() { mDelegate.onStop_beforeSuper(); @@ -229,7 +237,7 @@ public V provideView() { } @Override - public void setFragmentRetainInstance(final boolean retain) { + public final void setFragmentRetainInstance(final boolean retain) { getFragment().setRetainInstance(retain); } diff --git a/thirtyinch/src/main/java/net/grandcentrix/thirtyinch/TiActivity.java b/thirtyinch/src/main/java/net/grandcentrix/thirtyinch/TiActivity.java index 0acf46a2..2cbe5932 100644 --- a/thirtyinch/src/main/java/net/grandcentrix/thirtyinch/TiActivity.java +++ b/thirtyinch/src/main/java/net/grandcentrix/thirtyinch/TiActivity.java @@ -138,6 +138,7 @@ public void onConfigurationChanged(final Configuration newConfig) { } @Nullable + @CallSuper @Override public Object onRetainCustomNonConfigurationInstance() { final P presenter = mDelegate.getPresenter(); From 73cf99ffbe0f05706eb3c1654ddf45ef7f153e7f Mon Sep 17 00:00:00 2001 From: Robert Berghegger Date: Wed, 5 Apr 2017 12:08:44 +0200 Subject: [PATCH 5/5] Applies suggestions from PR and restricts the TiDialogFragment as well. --- .../thirtyinch/TiDialogFragment.java | 32 ++++++++++++------- 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/thirtyinch/src/main/java/net/grandcentrix/thirtyinch/TiDialogFragment.java b/thirtyinch/src/main/java/net/grandcentrix/thirtyinch/TiDialogFragment.java index 348b162c..d558d6ca 100644 --- a/thirtyinch/src/main/java/net/grandcentrix/thirtyinch/TiDialogFragment.java +++ b/thirtyinch/src/main/java/net/grandcentrix/thirtyinch/TiDialogFragment.java @@ -28,6 +28,7 @@ import net.grandcentrix.thirtyinch.util.AnnotationUtil; import android.os.Bundle; +import android.support.annotation.CallSuper; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatDialogFragment; @@ -52,19 +53,19 @@ public abstract class TiDialogFragment

, V extends TiVie @NonNull @Override - public Removable addBindViewInterceptor(@NonNull final BindViewInterceptor interceptor) { + public final Removable addBindViewInterceptor(@NonNull final BindViewInterceptor interceptor) { return mDelegate.addBindViewInterceptor(interceptor); } @Nullable @Override - public V getInterceptedViewOf(@NonNull final BindViewInterceptor interceptor) { + public final V getInterceptedViewOf(@NonNull final BindViewInterceptor interceptor) { return mDelegate.getInterceptedViewOf(interceptor); } @NonNull @Override - public List getInterceptors( + public final List getInterceptors( @NonNull final Filter predicate) { return mDelegate.getInterceptors(predicate); } @@ -75,12 +76,12 @@ public String getLoggingTag() { } @Override - public P getPresenter() { + public final P getPresenter() { return mDelegate.getPresenter(); } @Override - public Executor getUiThreadExecutor() { + public final Executor getUiThreadExecutor() { return new UiThreadExecutor(); } @@ -89,41 +90,43 @@ public Executor getUiThreadExecutor() { * through all the interceptors (again). */ @Override - public void invalidateView() { + public final void invalidateView() { mDelegate.invalidateView(); } @Override - public boolean isDontKeepActivitiesEnabled() { + public final boolean isDontKeepActivitiesEnabled() { return AndroidDeveloperOptions.isDontKeepActivitiesEnabled(getActivity()); } @Override - public boolean isFragmentAdded() { + public final boolean isFragmentAdded() { return isAdded(); } @Override - public boolean isFragmentDetached() { + public final boolean isFragmentDetached() { return isDetached(); } @Override - public boolean isHostingActivityChangingConfigurations() { + public final boolean isHostingActivityChangingConfigurations() { return getActivity().isChangingConfigurations(); } @Override - public boolean isHostingActivityFinishing() { + public final boolean isHostingActivityFinishing() { return getActivity().isFinishing(); } + @CallSuper @Override public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); mDelegate.onCreate_afterSuper(savedInstanceState); } + @CallSuper @Nullable @Override public View onCreateView(final LayoutInflater inflater, @Nullable final ViewGroup container, @@ -132,30 +135,35 @@ public View onCreateView(final LayoutInflater inflater, @Nullable final ViewGrou return super.onCreateView(inflater, container, savedInstanceState); } + @CallSuper @Override public void onDestroy() { super.onDestroy(); mDelegate.onDestroy_afterSuper(); } + @CallSuper @Override public void onDestroyView() { mDelegate.onDestroyView_beforeSuper(); super.onDestroyView(); } + @CallSuper @Override public void onSaveInstanceState(final Bundle outState) { super.onSaveInstanceState(outState); mDelegate.onSaveInstanceState_afterSuper(outState); } + @CallSuper @Override public void onStart() { super.onStart(); mDelegate.onStart_afterSuper(); } + @CallSuper @Override public void onStop() { mDelegate.onStop_beforeSuper(); @@ -192,7 +200,7 @@ public V provideView() { } @Override - public void setFragmentRetainInstance(final boolean retain) { + public final void setFragmentRetainInstance(final boolean retain) { setRetainInstance(retain); }