package com.goka.rssts.compat; import android.annotation.TargetApi; import android.app.Activity; import android.app.Application; import android.os.Bundle; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * Created by katsuyagoto on 2015/04/26. */ public class LifecycleCallbacksSupportApplication extends Application { public static interface ActivityLifecycleCallbacksCompat { void onActivityCreated(Activity activity, Bundle savedInstanceState); void onActivityStarted(Activity activity); void onActivityResumed(Activity activity); void onActivityPaused(Activity activity); void onActivityStopped(Activity activity); void onActivitySaveInstanceState(Activity activity, Bundle outState); void onActivityDestroyed(Activity activity); } static interface ActivityLifecycleCallbacksRegistry { void registerActivityLifecycleCallbacks(ActivityLifecycleCallbacksCompat callback); void unregisterActivityLifecycleCallbacks(ActivityLifecycleCallbacksCompat callback); void dispatchActivityCreated(Activity activity, Bundle savedInstanceState); void dispatchActivityStarted(Activity activity); void dispatchActivityResumed(Activity activity); void dispatchActivityPaused(Activity activity); void dispatchActivityStopped(Activity activity); void dispatchActivitySaveInstanceState(Activity activity, Bundle outState); void dispatchActivityDestroyed(Activity activity); } /** * {@link ActivityLifecycleCallbacksRegistry}のICS以前の実装 */ private static final class LegacyActivityLifecycleCallbacksRegistry implements ActivityLifecycleCallbacksRegistry { private WeakReference<Application> mApplication; private List<ActivityLifecycleCallbacksCompat> mActivityLifecycleCallbacks; public LegacyActivityLifecycleCallbacksRegistry(Application application) { mApplication = new WeakReference<Application>(application); mActivityLifecycleCallbacks = new ArrayList<LifecycleCallbacksSupportApplication.ActivityLifecycleCallbacksCompat>(); } @Override public void registerActivityLifecycleCallbacks(ActivityLifecycleCallbacksCompat callback) { final Application application = mApplication.get(); if (application == null) { return; } synchronized (mActivityLifecycleCallbacks) { mActivityLifecycleCallbacks.add(callback); } } @Override public void unregisterActivityLifecycleCallbacks(ActivityLifecycleCallbacksCompat callback) { final Application application = mApplication.get(); if (application == null) { return; } synchronized (mActivityLifecycleCallbacks) { mActivityLifecycleCallbacks.remove(callback); } } @Override public void dispatchActivityCreated(Activity activity, Bundle savedInstanceState) { Object[] callbacks = collectActivityLifecycleCallbacks(); if (callbacks != null) { for (int i = 0; i < callbacks.length; i++) { ((ActivityLifecycleCallbacksCompat) callbacks[i]).onActivityCreated(activity, savedInstanceState); } } } @Override public void dispatchActivityStarted(Activity activity) { Object[] callbacks = collectActivityLifecycleCallbacks(); if (callbacks != null) { for (int i = 0; i < callbacks.length; i++) { ((ActivityLifecycleCallbacksCompat) callbacks[i]).onActivityStarted(activity); } } } @Override public void dispatchActivityResumed(Activity activity) { Object[] callbacks = collectActivityLifecycleCallbacks(); if (callbacks != null) { for (int i = 0; i < callbacks.length; i++) { ((ActivityLifecycleCallbacksCompat) callbacks[i]).onActivityResumed(activity); } } } @Override public void dispatchActivityPaused(Activity activity) { Object[] callbacks = collectActivityLifecycleCallbacks(); if (callbacks != null) { for (int i = 0; i < callbacks.length; i++) { ((ActivityLifecycleCallbacksCompat) callbacks[i]).onActivityPaused(activity); } } } @Override public void dispatchActivityStopped(Activity activity) { Object[] callbacks = collectActivityLifecycleCallbacks(); if (callbacks != null) { for (int i = 0; i < callbacks.length; i++) { ((ActivityLifecycleCallbacksCompat) callbacks[i]).onActivityStopped(activity); } } } @Override public void dispatchActivitySaveInstanceState(Activity activity, Bundle outState) { Object[] callbacks = collectActivityLifecycleCallbacks(); if (callbacks != null) { for (int i = 0; i < callbacks.length; i++) { ((ActivityLifecycleCallbacksCompat) callbacks[i]).onActivitySaveInstanceState(activity, outState); } } } @Override public void dispatchActivityDestroyed(Activity activity) { Object[] callbacks = collectActivityLifecycleCallbacks(); if (callbacks != null) { for (int i = 0; i < callbacks.length; i++) { ((ActivityLifecycleCallbacksCompat) callbacks[i]).onActivityDestroyed(activity); } } } private Object[] collectActivityLifecycleCallbacks() { Object[] callbacks = null; synchronized (mActivityLifecycleCallbacks) { if (mActivityLifecycleCallbacks.size() > 0) { callbacks = mActivityLifecycleCallbacks.toArray(); } } return callbacks; } } /** * {@link ActivityLifecycleCallbacksRegistry}のICS以降の実装 */ @TargetApi(14) private static final class IceCreamSandwichActivityLifecycleCallbacksRegistry implements ActivityLifecycleCallbacksRegistry { private static final class DelegatingActivityLifecycleCallbacks implements android.app.Application.ActivityLifecycleCallbacks { private ActivityLifecycleCallbacksCompat mCompat; public DelegatingActivityLifecycleCallbacks(ActivityLifecycleCallbacksCompat compat) { mCompat = compat; } @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) { mCompat.onActivityCreated(activity, savedInstanceState); } @Override public void onActivityStarted(Activity activity) { mCompat.onActivityStarted(activity); } @Override public void onActivityResumed(Activity activity) { mCompat.onActivityResumed(activity); } @Override public void onActivityPaused(Activity activity) { mCompat.onActivityPaused(activity); } @Override public void onActivityStopped(Activity activity) { mCompat.onActivityStopped(activity); } @Override public void onActivitySaveInstanceState(Activity activity, Bundle outState) { mCompat.onActivitySaveInstanceState(activity, outState); } @Override public void onActivityDestroyed(Activity activity) { mCompat.onActivityDestroyed(activity); } } private WeakReference<Application> mApplication; private Map<ActivityLifecycleCallbacksCompat, android.app.Application.ActivityLifecycleCallbacks> mDelegates; public IceCreamSandwichActivityLifecycleCallbacksRegistry(Application application) { mApplication = new WeakReference<Application>(application); mDelegates = new HashMap<LifecycleCallbacksSupportApplication.ActivityLifecycleCallbacksCompat, Application.ActivityLifecycleCallbacks>(); } @Override public void registerActivityLifecycleCallbacks(ActivityLifecycleCallbacksCompat callback) { final Application application = mApplication.get(); if (application == null) { return; } final android.app.Application.ActivityLifecycleCallbacks delegate = delegateOf(callback); application.registerActivityLifecycleCallbacks(delegate); } @Override public void unregisterActivityLifecycleCallbacks(ActivityLifecycleCallbacksCompat callback) { final Application application = mApplication.get(); if (application == null) { return; } final android.app.Application.ActivityLifecycleCallbacks delegate = delegateOf(callback); application.unregisterActivityLifecycleCallbacks(delegate); } private android.app.Application.ActivityLifecycleCallbacks delegateOf(ActivityLifecycleCallbacksCompat compat) { synchronized (mDelegates) { if (mDelegates.containsKey(compat)) { return mDelegates.get(compat); } android.app.Application.ActivityLifecycleCallbacks delegate = new DelegatingActivityLifecycleCallbacks(compat); mDelegates.put(compat, delegate); return delegate; } } @Override public void dispatchActivityCreated(Activity activity, Bundle savedInstanceState) { // ICS以降のApplicationのオリジナルのメソッドが実行されるので何もしない } @Override public void dispatchActivityStarted(Activity activity) { // ICS以降のApplicationのオリジナルのメソッドが実行されるので何もしない } @Override public void dispatchActivityResumed(Activity activity) { // ICS以降のApplicationのオリジナルのメソッドが実行されるので何もしない } @Override public void dispatchActivityPaused(Activity activity) { // ICS以降のApplicationのオリジナルのメソッドが実行されるので何もしない } @Override public void dispatchActivityStopped(Activity activity) { // ICS以降のApplicationのオリジナルのメソッドが実行されるので何もしない } @Override public void dispatchActivitySaveInstanceState(Activity activity, Bundle outState) { // ICS以降のApplicationのオリジナルのメソッドが実行されるので何もしない } @Override public void dispatchActivityDestroyed(Activity activity) { // ICS以降のApplicationのオリジナルのメソッドが実行されるので何もしない } } private ActivityLifecycleCallbacksRegistry mActivityLifecycleCallbacksRegistry; public LifecycleCallbacksSupportApplication() { setupActivityLifecycleCallbacksRegistry(); } private void setupActivityLifecycleCallbacksRegistry() { if (introducedActivityLifecycleCallbacks()) { setupDelegatingActivityLifecycleCallbacks(); } else { setupCompatActivityLifecycleCallbacks(); } } private boolean introducedActivityLifecycleCallbacks() { try { Class.forName("android.app.Application$ActivityLifecycleCallbacks"); return true; } catch (ClassNotFoundException e) { } return false; } private void setupCompatActivityLifecycleCallbacks() { mActivityLifecycleCallbacksRegistry = new LegacyActivityLifecycleCallbacksRegistry(this); } private void setupDelegatingActivityLifecycleCallbacks() { mActivityLifecycleCallbacksRegistry = new IceCreamSandwichActivityLifecycleCallbacksRegistry(this); } public void registerSupportActivityLifecycleCallbacks(ActivityLifecycleCallbacksCompat callback) { mActivityLifecycleCallbacksRegistry.registerActivityLifecycleCallbacks(callback); } public void unregisterSupportActivityLifecycleCallbacksCompat(ActivityLifecycleCallbacksCompat callback) { mActivityLifecycleCallbacksRegistry.unregisterActivityLifecycleCallbacks(callback); } void dispatchActivityCreatedCompat(Activity activity, Bundle savedInstanceState) { mActivityLifecycleCallbacksRegistry.dispatchActivityCreated(activity, savedInstanceState); } void dispatchActivityStartedCompat(Activity activity) { mActivityLifecycleCallbacksRegistry.dispatchActivityStarted(activity); } void dispatchActivityResumedCompat(Activity activity) { mActivityLifecycleCallbacksRegistry.dispatchActivityResumed(activity); } void dispatchActivityPausedCompat(Activity activity) { mActivityLifecycleCallbacksRegistry.dispatchActivityPaused(activity); } void dispatchActivityStoppedCompat(Activity activity) { mActivityLifecycleCallbacksRegistry.dispatchActivityStopped(activity); } void dispatchActivitySaveInstanceStateCompat(Activity activity, Bundle outState) { mActivityLifecycleCallbacksRegistry.dispatchActivitySaveInstanceState(activity, outState); } void dispatchActivityDestroyedCompat(Activity activity) { mActivityLifecycleCallbacksRegistry.dispatchActivityDestroyed(activity); } }