From ff5b158f69bf453cf1fdedd175a09482c65f2bf2 Mon Sep 17 00:00:00 2001 From: Dianne Hackborn Date: Thu, 12 Apr 2012 17:24:07 -0700 Subject: [PATCH] Keep activities stopped while the lock screen is up. Tell the activity manager when the lock screen is shown, so it can keep itself (mostly) in sleep mode during this time, having the foreground actvities remain in their stopped state. Change-Id: I71c86d3298f23a98014d7ae36fd540c9df9a64e6 --- .../android/app/ActivityManagerNative.java | 20 ++++- core/java/android/app/IActivityManager.java | 4 +- .../policy/impl/KeyguardViewMediator.java | 12 +++ .../server/am/ActivityManagerService.java | 75 ++++++++++++++++--- 4 files changed, 98 insertions(+), 13 deletions(-) diff --git a/core/java/android/app/ActivityManagerNative.java b/core/java/android/app/ActivityManagerNative.java index a3fdf3e81a34e..7e1589f6c9f73 100644 --- a/core/java/android/app/ActivityManagerNative.java +++ b/core/java/android/app/ActivityManagerNative.java @@ -1000,7 +1000,7 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM } return true; } - + case GOING_TO_SLEEP_TRANSACTION: { data.enforceInterface(IActivityManager.descriptor); goingToSleep(); @@ -1015,6 +1015,13 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM return true; } + case SET_LOCK_SCREEN_SHOWN_TRANSACTION: { + data.enforceInterface(IActivityManager.descriptor); + setLockScreenShown(data.readInt() != 0); + reply.writeNoException(); + return true; + } + case SET_DEBUG_APP_TRANSACTION: { data.enforceInterface(IActivityManager.descriptor); String pn = data.readString(); @@ -2912,6 +2919,17 @@ class ActivityManagerProxy implements IActivityManager data.recycle(); reply.recycle(); } + public void setLockScreenShown(boolean shown) throws RemoteException + { + Parcel data = Parcel.obtain(); + Parcel reply = Parcel.obtain(); + data.writeInterfaceToken(IActivityManager.descriptor); + data.writeInt(shown ? 1 : 0); + mRemote.transact(SET_LOCK_SCREEN_SHOWN_TRANSACTION, data, reply, 0); + reply.readException(); + data.recycle(); + reply.recycle(); + } public void setDebugApp( String packageName, boolean waitForDebugger, boolean persistent) throws RemoteException diff --git a/core/java/android/app/IActivityManager.java b/core/java/android/app/IActivityManager.java index c71b186189bb4..3fc228076791e 100644 --- a/core/java/android/app/IActivityManager.java +++ b/core/java/android/app/IActivityManager.java @@ -205,7 +205,8 @@ public interface IActivityManager extends IInterface { // Note: probably don't want to allow applications access to these. public void goingToSleep() throws RemoteException; public void wakingUp() throws RemoteException; - + public void setLockScreenShown(boolean shown) throws RemoteException; + public void unhandledBack() throws RemoteException; public ParcelFileDescriptor openContentUri(Uri uri) throws RemoteException; public void setDebugApp( @@ -588,4 +589,5 @@ public interface IActivityManager extends IInterface { int GET_CURRENT_USER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+144; int TARGET_TASK_AFFINITY_MATCHES_ACTIVITY_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+145; int NAVIGATE_UP_TO_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+146; + int SET_LOCK_SCREEN_SHOWN_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+147; } diff --git a/policy/src/com/android/internal/policy/impl/KeyguardViewMediator.java b/policy/src/com/android/internal/policy/impl/KeyguardViewMediator.java index 52fb875ba89ee..5b9160d06a30d 100644 --- a/policy/src/com/android/internal/policy/impl/KeyguardViewMediator.java +++ b/policy/src/com/android/internal/policy/impl/KeyguardViewMediator.java @@ -567,6 +567,7 @@ public class KeyguardViewMediator implements KeyguardViewCallback, synchronized (KeyguardViewMediator.this) { if (mHidden != isHidden) { mHidden = isHidden; + updateActivityLockScreenState(); adjustUserActivityLocked(); adjustStatusBarLocked(); } @@ -1162,6 +1163,14 @@ public class KeyguardViewMediator implements KeyguardViewCallback, } } + private void updateActivityLockScreenState() { + try { + ActivityManagerNative.getDefault().setLockScreenShown( + mShowing && !mHidden); + } catch (RemoteException e) { + } + } + /** * Handle message sent by {@link #showLocked}. * @see #SHOW @@ -1173,6 +1182,7 @@ public class KeyguardViewMediator implements KeyguardViewCallback, mKeyguardViewManager.show(); mShowing = true; + updateActivityLockScreenState(); adjustUserActivityLocked(); adjustStatusBarLocked(); try { @@ -1207,6 +1217,7 @@ public class KeyguardViewMediator implements KeyguardViewCallback, mKeyguardViewManager.hide(); mShowing = false; + updateActivityLockScreenState(); adjustUserActivityLocked(); adjustStatusBarLocked(); } @@ -1324,6 +1335,7 @@ public class KeyguardViewMediator implements KeyguardViewCallback, if (DEBUG) Log.d(TAG, "handleVerifyUnlock"); mKeyguardViewManager.verifyUnlock(); mShowing = true; + updateActivityLockScreenState(); } } diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java index 0c2e6acd7ee09..e37adc7ab2c38 100644 --- a/services/java/com/android/server/am/ActivityManagerService.java +++ b/services/java/com/android/server/am/ActivityManagerService.java @@ -696,6 +696,16 @@ public final class ActivityManagerService extends ActivityManagerNative */ boolean mSleeping = false; + /** + * State of external calls telling us if the device is asleep. + */ + boolean mWentToSleep = false; + + /** + * State of external call telling us if the lock screen is shown. + */ + boolean mLockScreenShown = false; + /** * Set if we are shutting down the system, similar to sleeping. */ @@ -6656,17 +6666,26 @@ public final class ActivityManagerService extends ActivityManagerNative } public void goingToSleep() { + if (checkCallingPermission(android.Manifest.permission.DEVICE_POWER) + != PackageManager.PERMISSION_GRANTED) { + throw new SecurityException("Requires permission " + + android.Manifest.permission.DEVICE_POWER); + } + synchronized(this) { - mSleeping = true; + mWentToSleep = true; mWindowManager.setEventDispatching(false); - mMainStack.stopIfSleepingLocked(); + if (!mSleeping) { + mSleeping = true; + mMainStack.stopIfSleepingLocked(); - // Initialize the wake times of all processes. - checkExcessivePowerUsageLocked(false); - mHandler.removeMessages(CHECK_EXCESSIVE_WAKE_LOCKS_MSG); - Message nmsg = mHandler.obtainMessage(CHECK_EXCESSIVE_WAKE_LOCKS_MSG); - mHandler.sendMessageDelayed(nmsg, POWER_CHECK_DELAY); + // Initialize the wake times of all processes. + checkExcessivePowerUsageLocked(false); + mHandler.removeMessages(CHECK_EXCESSIVE_WAKE_LOCKS_MSG); + Message nmsg = mHandler.obtainMessage(CHECK_EXCESSIVE_WAKE_LOCKS_MSG); + mHandler.sendMessageDelayed(nmsg, POWER_CHECK_DELAY); + } } } @@ -6726,12 +6745,40 @@ public final class ActivityManagerService extends ActivityManagerNative Binder.restoreCallingIdentity(origId); } + private void comeOutOfSleepIfNeededLocked() { + if (!mWentToSleep && !mLockScreenShown) { + if (mSleeping) { + mSleeping = false; + mMainStack.awakeFromSleepingLocked(); + mMainStack.resumeTopActivityLocked(null); + } + } + } + public void wakingUp() { + if (checkCallingPermission(android.Manifest.permission.DEVICE_POWER) + != PackageManager.PERMISSION_GRANTED) { + throw new SecurityException("Requires permission " + + android.Manifest.permission.DEVICE_POWER); + } + synchronized(this) { + mWentToSleep = false; mWindowManager.setEventDispatching(true); - mSleeping = false; - mMainStack.awakeFromSleepingLocked(); - mMainStack.resumeTopActivityLocked(null); + comeOutOfSleepIfNeededLocked(); + } + } + + public void setLockScreenShown(boolean shown) { + if (checkCallingPermission(android.Manifest.permission.DEVICE_POWER) + != PackageManager.PERMISSION_GRANTED) { + throw new SecurityException("Requires permission " + + android.Manifest.permission.DEVICE_POWER); + } + + synchronized(this) { + mLockScreenShown = shown; + comeOutOfSleepIfNeededLocked(); } } @@ -8815,7 +8862,13 @@ public final class ActivityManagerService extends ActivityManagerNative } } } - pw.println(" mSleeping=" + mSleeping + " mShuttingDown=" + mShuttingDown); + if (mSleeping || mWentToSleep || mLockScreenShown) { + pw.println(" mSleeping=" + mSleeping + " mWentToSleep=" + mWentToSleep + + " mLockScreenShown " + mLockScreenShown); + } + if (mShuttingDown) { + pw.println(" mShuttingDown=" + mShuttingDown); + } if (mDebugApp != null || mOrigDebugApp != null || mDebugTransient || mOrigWaitForDebugger) { pw.println(" mDebugApp=" + mDebugApp + "/orig=" + mOrigDebugApp