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

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

Issue 14373019: Add base/android/activity_status.cc (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Address Marcus' nits + formatting Created 7 years, 8 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
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() {
joth 2013/04/26 20:29:10 simpler to just use ThreadUtils.runOnUiThread(new
digit1 2013/04/29 12:22:10 Good idea, I've changed the code to use that inste
+ @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);
}

Powered by Google App Engine
This is Rietveld 408576698