| 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
|
| index 7d0ee947590a9ff0c58555fbb1ccfae8d3da801e..1060ef00dbbfaf99d2369f73855878f7686b11d1 100644
|
| --- a/base/android/java/src/org/chromium/base/ActivityStatus.java
|
| +++ b/base/android/java/src/org/chromium/base/ActivityStatus.java
|
| @@ -5,20 +5,24 @@
|
| package org.chromium.base;
|
|
|
| import android.app.Activity;
|
| +import android.os.Handler;
|
| import android.os.Looper;
|
|
|
| /**
|
| * Provides information about the parent activity's status.
|
| */
|
| +@JNINamespace("base::android")
|
| public class ActivityStatus {
|
|
|
| // Constants matching activity states reported to StateListener.onStateChange
|
| - public static final int CREATED = 1;
|
| - public static final int STARTED = 2;
|
| - public static final int RESUMED = 3;
|
| - public static final int PAUSED = 4;
|
| - public static final int STOPPED = 5;
|
| - public static final int DESTROYED = 6;
|
| + // 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;
|
|
|
| // Current main activity, or null if none.
|
| private static Activity sActivity;
|
| @@ -102,4 +106,39 @@ public class ActivityStatus {
|
| 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() {
|
| + Looper mainLooper = Looper.getMainLooper();
|
| + // If not on the main thread, post a Handler to perform the registration on it
|
| + // then return immediately. Note that registration will happen later.
|
| + if (Looper.myLooper() != mainLooper) {
|
| + new Handler(mainLooper).post(new Runnable() {
|
| + @Override
|
| + public void run() {
|
| + // Note that this native method has to be static
|
| + registerThreadSafeNativeStateListener();
|
| + }
|
| + });
|
| + return;
|
| + }
|
| +
|
| + // Otherwise 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);
|
| }
|
|
|