summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Christopher Tate <ctate@google.com> 2012-03-22 13:39:21 -0700
committer Android (Google) Code Review <android-gerrit@google.com> 2012-03-22 13:39:21 -0700
commit96fecb7f6b74176c0fad7bfa2c7ae9b80e1770cc (patch)
treea4bd576f93681e90b5e6e20947b0b56c28c95d86
parent6becc5a811c74a20e72eb8e81fdc5d21361d2d7f (diff)
parent9ce685b934b36cc57631e10f7c1e3609e91e3f9c (diff)
Merge "Make immersive mode public & imply update locking" into ics-aah
-rw-r--r--api/current.txt3
-rw-r--r--core/java/android/app/Activity.java2
-rw-r--r--core/java/android/content/pm/ActivityInfo.java1
-rw-r--r--services/java/com/android/server/am/ActivityManagerService.java38
4 files changed, 40 insertions, 4 deletions
diff --git a/api/current.txt b/api/current.txt
index 3e88e1bd5b9e..e370e2b12d19 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -2557,6 +2557,7 @@ package android.app {
method public boolean isChangingConfigurations();
method public final boolean isChild();
method public boolean isFinishing();
+ method public boolean isImmersive();
method public boolean isTaskRoot();
method public final deprecated android.database.Cursor managedQuery(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String);
method public boolean moveTaskToBack(boolean);
@@ -2638,6 +2639,7 @@ package android.app {
method public final void setFeatureDrawableResource(int, int);
method public final void setFeatureDrawableUri(int, android.net.Uri);
method public void setFinishOnTouchOutside(boolean);
+ method public void setImmersive(boolean);
method public void setIntent(android.content.Intent);
method public final void setProgress(int);
method public final void setProgressBarIndeterminate(boolean);
@@ -5952,6 +5954,7 @@ package android.content.pm {
field public static final int FLAG_FINISH_ON_CLOSE_SYSTEM_DIALOGS = 256; // 0x100
field public static final int FLAG_FINISH_ON_TASK_LAUNCH = 2; // 0x2
field public static final int FLAG_HARDWARE_ACCELERATED = 512; // 0x200
+ field public static final int FLAG_IMMERSIVE = 1024; // 0x400
field public static final int FLAG_MULTIPROCESS = 1; // 0x1
field public static final int FLAG_NO_HISTORY = 128; // 0x80
field public static final int FLAG_STATE_NOT_NEEDED = 16; // 0x10
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java
index 8e8d37d645c9..d006a4807332 100644
--- a/core/java/android/app/Activity.java
+++ b/core/java/android/app/Activity.java
@@ -4318,7 +4318,6 @@ public class Activity extends ContextThemeWrapper
* {@link #setImmersive}.
*
* @see android.content.pm.ActivityInfo#FLAG_IMMERSIVE
- * @hide
*/
public boolean isImmersive() {
try {
@@ -4341,7 +4340,6 @@ public class Activity extends ContextThemeWrapper
*
* @see #isImmersive
* @see android.content.pm.ActivityInfo#FLAG_IMMERSIVE
- * @hide
*/
public void setImmersive(boolean i) {
try {
diff --git a/core/java/android/content/pm/ActivityInfo.java b/core/java/android/content/pm/ActivityInfo.java
index 0e6694deef2c..5506c7fd54a0 100644
--- a/core/java/android/content/pm/ActivityInfo.java
+++ b/core/java/android/content/pm/ActivityInfo.java
@@ -155,7 +155,6 @@ public class ActivityInfo extends ComponentInfo
*/
public static final int FLAG_HARDWARE_ACCELERATED = 0x0200;
/**
- * @hide
* Bit in {@link #flags} corresponding to an immersive activity
* that wishes not to be interrupted by notifications.
* Applications that hide the system notification bar with
diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java
index cd40cf1a7b96..c21ba965b9e1 100644
--- a/services/java/com/android/server/am/ActivityManagerService.java
+++ b/services/java/com/android/server/am/ActivityManagerService.java
@@ -104,6 +104,7 @@ import android.os.ServiceManager;
import android.os.StrictMode;
import android.os.SystemClock;
import android.os.SystemProperties;
+import android.os.UpdateLock;
import android.provider.Settings;
import android.text.format.Time;
import android.util.EventLog;
@@ -172,6 +173,7 @@ public final class ActivityManagerService extends ActivityManagerNative
static final boolean DEBUG_CONFIGURATION = localLOGV || false;
static final boolean DEBUG_POWER = localLOGV || false;
static final boolean DEBUG_POWER_QUICK = DEBUG_POWER || false;
+ static final boolean DEBUG_IMMERSIVE = localLOGV || true;
static final boolean VALIDATE_TOKENS = false;
static final boolean SHOW_ACTIVITY_START_TIME = true;
@@ -812,6 +814,12 @@ public final class ActivityManagerService extends ActivityManagerNative
long mLastWriteTime = 0;
/**
+ * Used to retain an update lock when the foreground activity is in
+ * immersive mode.
+ */
+ final UpdateLock mUpdateLock = new UpdateLock("immersive");
+
+ /**
* Set to true after the system has finished booting.
*/
boolean mBooted = false;
@@ -1710,6 +1718,21 @@ public final class ActivityManagerService extends ActivityManagerNative
if (r != null) {
mWindowManager.setFocusedApp(r.appToken, true);
}
+ applyUpdateLockStateLocked(r);
+ }
+ }
+
+ final void applyUpdateLockStateLocked(ActivityRecord r) {
+ final boolean nextState = r != null && r.immersive;
+ if (mUpdateLock.isHeld() != nextState) {
+ if (DEBUG_IMMERSIVE) {
+ Slog.d(TAG, "Applying new update lock state '" + nextState + "' for " + r);
+ }
+ if (nextState) {
+ mUpdateLock.acquire();
+ } else {
+ mUpdateLock.release();
+ }
}
}
@@ -6667,11 +6690,24 @@ public final class ActivityManagerService extends ActivityManagerNative
public void setImmersive(IBinder token, boolean immersive) {
synchronized(this) {
- ActivityRecord r = mMainStack.isInStackLocked(token);
+ final ActivityRecord r = mMainStack.isInStackLocked(token);
if (r == null) {
throw new IllegalArgumentException();
}
r.immersive = immersive;
+
+ // update associated state if we're frontmost
+ if (r == mMainStack.topRunningActivityLocked(null)) {
+ long oldId = Binder.clearCallingIdentity();
+ try {
+ if (DEBUG_IMMERSIVE) {
+ Slog.d(TAG, "Frontmost changed immersion: "+ r);
+ }
+ applyUpdateLockStateLocked(r);
+ } finally {
+ Binder.restoreCallingIdentity(oldId);
+ }
+ }
}
}