Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3718)

Unified Diff: base/android/java/src/org/chromium/base/ActivityStatus.java

Issue 159173002: Refactor ActivityStatus to not store current activity (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: base/android/java/src/org/chromium/base/ActivityStatus.java
diff --git a/base/android/java/src/org/chromium/base/ActivityStatus.java b/base/android/java/src/org/chromium/base/ActivityStatus.java
deleted file mode 100644
index df43dbebfbb9bf95df55fbb72607ecd9a1f85ff2..0000000000000000000000000000000000000000
--- a/base/android/java/src/org/chromium/base/ActivityStatus.java
+++ /dev/null
@@ -1,259 +0,0 @@
-// Copyright 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.base;
-
-import android.app.Activity;
-import android.app.Application;
-import android.app.Application.ActivityLifecycleCallbacks;
-import android.os.Bundle;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Provides information about the current activity's status, and a way
- * to register / unregister listeners for state changes.
- */
-@JNINamespace("base::android")
-public class ActivityStatus {
-
- // Constants matching activity states reported to StateListener.onStateChange
- // As an implementation detail, these are now defined in the auto-generated
- // ActivityState interface, to be shared with C++.
- public static final int CREATED = ActivityState.CREATED;
- public static final int STARTED = ActivityState.STARTED;
- public static final int RESUMED = ActivityState.RESUMED;
- public static final int PAUSED = ActivityState.PAUSED;
- public static final int STOPPED = ActivityState.STOPPED;
- public static final int DESTROYED = ActivityState.DESTROYED;
-
- // Last activity that was shown (or null if none or it was destroyed).
- private static Activity sActivity;
-
- private static final Map<Activity, Integer> sActivityStates =
- new HashMap<Activity, Integer>();
-
- private static final ObserverList<StateListener> sStateListeners =
- new ObserverList<StateListener>();
-
- /**
- * Interface to be implemented by listeners.
- */
- public interface StateListener {
- /**
- * Called when the activity's state changes.
- * @param newState New activity state.
- */
- public void onActivityStateChange(int newState);
- }
-
- private ActivityStatus() {}
-
- /**
- * Initializes the activity status for a specified application.
- *
- * @param application The application whose status you wish to monitor.
- */
- public static void initialize(Application application) {
- application.registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
- @Override
- public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
- onStateChange(activity, CREATED);
- }
-
- @Override
- public void onActivityDestroyed(Activity activity) {
- onStateChange(activity, DESTROYED);
- }
-
- @Override
- public void onActivityPaused(Activity activity) {
- onStateChange(activity, PAUSED);
- }
-
- @Override
- public void onActivityResumed(Activity activity) {
- onStateChange(activity, RESUMED);
- }
-
- @Override
- public void onActivitySaveInstanceState(Activity activity, Bundle outState) {}
-
- @Override
- public void onActivityStarted(Activity activity) {
- onStateChange(activity, STARTED);
- }
-
- @Override
- public void onActivityStopped(Activity activity) {
- onStateChange(activity, STOPPED);
- }
- });
- }
-
- /**
- * Must be called by the main activity when it changes state.
- *
- * @param activity Current activity.
- * @param newState New state value.
- */
- private static void onStateChange(Activity activity, int newState) {
- if (activity == null) throw new IllegalArgumentException("null activity is not supported");
-
- if (sActivity != activity) {
- // ActivityStatus is notified with the CREATED event very late during the main activity
- // creation to avoid making startup performance worse than it is by notifying observers
- // that could do some expensive work. This can lead to non-CREATED events being fired
- // before the CREATED event which is problematic.
- // TODO(pliard): fix http://crbug.com/176837.
- if (sActivity == null
- || newState == CREATED || newState == RESUMED || newState == STARTED) {
- sActivity = activity;
- }
- }
-
- if (newState != DESTROYED) {
- sActivityStates.put(activity, newState);
- } else {
- sActivityStates.remove(activity);
- }
-
- if (sActivity == activity) {
- for (StateListener listener : sStateListeners) {
- listener.onActivityStateChange(newState);
- }
- if (newState == DESTROYED) {
- sActivity = null;
- }
- }
- }
-
- /**
- * Testing method to update the state of the specified activity.
- */
- public static void onStateChangeForTesting(Activity activity, int newState) {
- onStateChange(activity, newState);
- }
-
- /**
- * @return The current activity.
- */
- public static Activity getActivity() {
- return sActivity;
- }
-
- /**
- * @return The current activity's state (if no activity is registered, then DESTROYED will
- * be returned).
- */
- public static int getState() {
- return getStateForActivity(sActivity);
- }
-
- /**
- * Query the state for a given activity. If the activity is not being tracked, this will
- * return {@link #DESTROYED}.
- *
- * <p>
- * When relying on this method, be familiar with the expected life cycle state
- * transitions:
- * <a href="http://developer.android.com/guide/components/activities.html#Lifecycle">
- * Activity Lifecycle
- * </a>
- *
- * <p>
- * During activity transitions (activity B launching in front of activity A), A will completely
- * paused before the creation of activity B begins.
- *
- * <p>
- * A basic flow for activity A starting, followed by activity B being opened and then closed:
- * <ul>
- * <li> -- Starting Activity A --
- * <li> Activity A - CREATED
- * <li> Activity A - STARTED
- * <li> Activity A - RESUMED
- * <li> -- Starting Activity B --
- * <li> Activity A - PAUSED
- * <li> Activity B - CREATED
- * <li> Activity B - STARTED
- * <li> Activity B - RESUMED
- * <li> Activity A - STOPPED
- * <li> -- Closing Activity B, Activity A regaining focus --
- * <li> Activity B - PAUSED
- * <li> Activity A - STARTED
- * <li> Activity A - RESUMED
- * <li> Activity B - STOPPED
- * <li> Activity B - DESTROYED
- * </ul>
- *
- * @param activity The activity whose state is to be returned.
- * @return The state of the specified activity.
- */
- public static int getStateForActivity(Activity activity) {
- Integer currentStatus = sActivityStates.get(activity);
- return currentStatus != null ? currentStatus.intValue() : DESTROYED;
- }
-
- /**
- * Registers the given listener to receive activity state changes.
- * @param listener Listener to receive state changes.
- */
- public static void registerStateListener(StateListener listener) {
- sStateListeners.addObserver(listener);
- }
-
- /**
- * Unregisters the given listener from receiving activity state changes.
- * @param listener Listener that doesn't want to receive state changes.
- */
- public static void unregisterStateListener(StateListener listener) {
- sStateListeners.removeObserver(listener);
- }
-
- /**
- * Registers the single thread-safe native activity status listener.
- * This handles the case where the caller is not on the main thread.
- * Note that this is used by a leaky singleton object from the native
- * side, hence lifecycle management is greatly simplified.
- */
- @CalledByNative
- private static void registerThreadSafeNativeStateListener() {
- ThreadUtils.runOnUiThread(new Runnable () {
- @Override
- public void run() {
- // Register a new listener that calls nativeOnActivityStateChange.
- sStateListeners.addObserver(new StateListener() {
- @Override
- public void onActivityStateChange(int newState) {
- nativeOnActivityStateChange(newState);
- }
- });
- }
- });
- }
-
- // Called to notify the native side of state changes.
- // IMPORTANT: This is always called on the main thread!
- private static native void nativeOnActivityStateChange(int newState);
-
- /**
- * Checks whether or not the Application's current Activity is visible to the user. Note that
- * this includes the PAUSED state, which can happen when the Activity is temporarily covered
- * by another Activity's Fragment (e.g.).
- * @return True if the Activity is visible, false otherwise.
- */
- public static boolean isApplicationVisible() {
- int state = getState();
- return state != STOPPED && state != DESTROYED;
- }
-
- /**
- * Checks to see if there are any active Activity instances being watched by ActivityStatus.
- * @return True if all Activities have been destroyed.
- */
- public static boolean isEveryActivityDestroyed() {
- return sActivityStates.isEmpty();
- }
-}

Powered by Google App Engine
This is Rietveld 408576698