summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Lockwood <lockwood@android.com>2009-11-18 15:37:10 -0500
committerandroid-build SharedAccount <android-build@sekiwake.mtv.corp.google.com>2009-11-18 18:32:33 -0800
commit155976aeed5fab65d6dff9406fc5e9d28c920b97 (patch)
tree03d22a8cecc65781acaf781c6048fce4c9ae8005
parent68042bff4ec52ebd44388e3ec126d7b4c1260339 (diff)
downloadbase-155976aeed5fab65d6dff9406fc5e9d28c920b97.tar.gz
Fixes for proximity sensor behavior:
Add optional flag to Wakelock.release() to specify whether we should wait for proximity sensor to go negative before turning on the screen. Clear the "waiting for proximity sensor to go negative" state when the power key is pressed. Part of the fix for b/2243198 (Black screen lockup after ending call) Change-Id: I813fdb7aa4192cd3384a25be9e59d7d4b90da53a Signed-off-by: Mike Lockwood <lockwood@android.com>
-rw-r--r--cmds/svc/src/com/android/commands/svc/PowerCommand.java2
-rw-r--r--core/java/android/os/IPowerManager.aidl2
-rw-r--r--core/java/android/os/PowerManager.java29
-rw-r--r--services/java/com/android/server/PowerManagerService.java18
4 files changed, 41 insertions, 10 deletions
diff --git a/cmds/svc/src/com/android/commands/svc/PowerCommand.java b/cmds/svc/src/com/android/commands/svc/PowerCommand.java
index e021012268c9..d3ec3d98b357 100644
--- a/cmds/svc/src/com/android/commands/svc/PowerCommand.java
+++ b/cmds/svc/src/com/android/commands/svc/PowerCommand.java
@@ -66,7 +66,7 @@ public class PowerCommand extends Svc.Command {
IBinder lock = new Binder();
pm.acquireWakeLock(PowerManager.FULL_WAKE_LOCK, lock, "svc power");
pm.setStayOnSetting(val);
- pm.releaseWakeLock(lock);
+ pm.releaseWakeLock(lock, 0);
}
catch (RemoteException e) {
System.err.println("Faild to set setting: " + e);
diff --git a/core/java/android/os/IPowerManager.aidl b/core/java/android/os/IPowerManager.aidl
index bcf769da339b..b9dc860a9e47 100644
--- a/core/java/android/os/IPowerManager.aidl
+++ b/core/java/android/os/IPowerManager.aidl
@@ -22,7 +22,7 @@ interface IPowerManager
{
void acquireWakeLock(int flags, IBinder lock, String tag);
void goToSleep(long time);
- void releaseWakeLock(IBinder lock);
+ void releaseWakeLock(IBinder lock, int flags);
void userActivity(long when, boolean noChangeLights);
void userActivityWithForce(long when, boolean noChangeLights, boolean force);
void setPokeLock(int pokey, IBinder lock, String tag);
diff --git a/core/java/android/os/PowerManager.java b/core/java/android/os/PowerManager.java
index 2efc23041038..4b3b6f6dc771 100644
--- a/core/java/android/os/PowerManager.java
+++ b/core/java/android/os/PowerManager.java
@@ -159,6 +159,15 @@ public class PowerManager
public static final int PROXIMITY_SCREEN_OFF_WAKE_LOCK = WAKE_BIT_PROXIMITY_SCREEN_OFF;
/**
+ * Flag for {@link WakeLock#release release(int)} to defer releasing a
+ * {@link #WAKE_BIT_PROXIMITY_SCREEN_OFF} wakelock until the proximity sensor returns
+ * a negative value.
+ *
+ * {@hide}
+ */
+ public static final int WAIT_FOR_PROXIMITY_NEGATIVE = 1;
+
+ /**
* Normally wake locks don't actually wake the device, they just cause
* it to remain on once it's already on. Think of the video player
* app as the normal behavior. Notifications that pop up and want
@@ -267,10 +276,26 @@ public class PowerManager
*/
public void release()
{
+ release(0);
+ }
+
+ /**
+ * Release your claim to the CPU or screen being on.
+ * @param flags Combination of flag values to modify the release behavior.
+ * Currently only {@link #WAIT_FOR_PROXIMITY_NEGATIVE} is supported.
+ *
+ * <p>
+ * It may turn off shortly after you release it, or it may not if there
+ * are other wake locks held.
+ *
+ * {@hide}
+ */
+ public void release(int flags)
+ {
synchronized (mToken) {
if (!mRefCounted || --mCount == 0) {
try {
- mService.releaseWakeLock(mToken);
+ mService.releaseWakeLock(mToken, flags);
} catch (RemoteException e) {
}
mHeld = false;
@@ -302,7 +327,7 @@ public class PowerManager
synchronized (mToken) {
if (mHeld) {
try {
- mService.releaseWakeLock(mToken);
+ mService.releaseWakeLock(mToken, 0);
} catch (RemoteException e) {
}
RuntimeInit.crash(TAG, new Exception(
diff --git a/services/java/com/android/server/PowerManagerService.java b/services/java/com/android/server/PowerManagerService.java
index 94cf6d4a617f..444c8de12748 100644
--- a/services/java/com/android/server/PowerManagerService.java
+++ b/services/java/com/android/server/PowerManagerService.java
@@ -309,7 +309,7 @@ class PowerManagerService extends IPowerManager.Stub
public void release() {
if (!mRefCounted || --mCount == 0) {
- PowerManagerService.this.releaseWakeLockLocked(mToken, false);
+ PowerManagerService.this.releaseWakeLockLocked(mToken, 0, false);
mHeld = false;
}
if (mCount < 0) {
@@ -556,7 +556,7 @@ class PowerManagerService extends IPowerManager.Stub
}
public void binderDied() {
synchronized (mLocks) {
- releaseWakeLockLocked(this.binder, true);
+ releaseWakeLockLocked(this.binder, 0, true);
}
}
final int flags;
@@ -701,18 +701,18 @@ class PowerManagerService extends IPowerManager.Stub
}
}
- public void releaseWakeLock(IBinder lock) {
+ public void releaseWakeLock(IBinder lock, int flags) {
int uid = Binder.getCallingUid();
if (uid != Process.myUid()) {
mContext.enforceCallingOrSelfPermission(android.Manifest.permission.WAKE_LOCK, null);
}
synchronized (mLocks) {
- releaseWakeLockLocked(lock, false);
+ releaseWakeLockLocked(lock, flags, false);
}
}
- private void releaseWakeLockLocked(IBinder lock, boolean death) {
+ private void releaseWakeLockLocked(IBinder lock, int flags, boolean death) {
int releaseUid;
String releaseName;
int releaseType;
@@ -744,7 +744,8 @@ class PowerManagerService extends IPowerManager.Stub
} else if ((wl.flags & LOCK_MASK) == PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK) {
mProximityWakeLockCount--;
if (mProximityWakeLockCount == 0) {
- if (mProximitySensorActive) {
+ if (mProximitySensorActive &&
+ ((flags & PowerManager.WAIT_FOR_PROXIMITY_NEGATIVE) != 0)) {
// wait for proximity sensor to go negative before disabling sensor
if (mDebugProximitySensor) {
Log.d(TAG, "waiting for proximity sensor to go negative");
@@ -1923,6 +1924,11 @@ class PowerManagerService extends IPowerManager.Stub
Log.d(TAG, "ignoring user activity while turning off screen");
return;
}
+ // Disable proximity sensor if if user presses power key while we are in the
+ // "waiting for proximity sensor to go negative" state.
+ if (mProximitySensorActive && mProximityWakeLockCount == 0) {
+ mProximitySensorActive = false;
+ }
if (mLastEventTime <= time || force) {
mLastEventTime = time;
if ((mUserActivityAllowed && !mProximitySensorActive) || force) {