From 99732940809058fae558618399323c36b8a0e856 Mon Sep 17 00:00:00 2001 From: Wale Ogunwale Date: Fri, 6 May 2016 10:13:14 -0700 Subject: [PATCH] Dismiss docked stack if an activity is shown on top of the lock screen It is risky/complicated to try to put the activity showing on-top of the lock screen in the right fullscreen configuration with the current architecture. So, we just dismiss for now. Bug: 28195260 Change-Id: I29a0350993ce8fe548d4a465b06d877cde151c78 --- core/java/android/app/ActivityManagerNative.java | 9 ++++++--- core/java/android/app/IActivityManager.java | 2 +- .../systemui/keyguard/KeyguardViewMediator.java | 2 +- .../android/server/am/ActivityManagerService.java | 15 ++++++++++++--- 4 files changed, 20 insertions(+), 8 deletions(-) diff --git a/core/java/android/app/ActivityManagerNative.java b/core/java/android/app/ActivityManagerNative.java index 1a7c7467633fc..216783edace1d 100644 --- a/core/java/android/app/ActivityManagerNative.java +++ b/core/java/android/app/ActivityManagerNative.java @@ -1527,7 +1527,9 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM case SET_LOCK_SCREEN_SHOWN_TRANSACTION: { data.enforceInterface(IActivityManager.descriptor); - setLockScreenShown(data.readInt() != 0); + final boolean showing = data.readInt() != 0; + final boolean occluded = data.readInt() != 0; + setLockScreenShown(showing, occluded); reply.writeNoException(); return true; } @@ -4922,12 +4924,13 @@ class ActivityManagerProxy implements IActivityManager reply.recycle(); return pfd; } - public void setLockScreenShown(boolean shown) throws RemoteException + public void setLockScreenShown(boolean showing, boolean occluded) throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); data.writeInterfaceToken(IActivityManager.descriptor); - data.writeInt(shown ? 1 : 0); + data.writeInt(showing ? 1 : 0); + data.writeInt(occluded ? 1 : 0); mRemote.transact(SET_LOCK_SCREEN_SHOWN_TRANSACTION, data, reply, 0); reply.readException(); data.recycle(); diff --git a/core/java/android/app/IActivityManager.java b/core/java/android/app/IActivityManager.java index 55ce6c2a9804b..26c6fc49a26d4 100644 --- a/core/java/android/app/IActivityManager.java +++ b/core/java/android/app/IActivityManager.java @@ -331,7 +331,7 @@ public interface IActivityManager extends IInterface { public void forceStopPackage(final String packageName, int userId) throws RemoteException; // Note: probably don't want to allow applications access to these. - public void setLockScreenShown(boolean shown) throws RemoteException; + public void setLockScreenShown(boolean showing, boolean occluded) throws RemoteException; public void unhandledBack() throws RemoteException; public ParcelFileDescriptor openContentUri(Uri uri) throws RemoteException; diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java index 55fa10bc238dd..cad7f647e031f 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java @@ -1542,7 +1542,7 @@ public class KeyguardViewMediator extends SystemUI { private void updateActivityLockScreenState() { try { - ActivityManagerNative.getDefault().setLockScreenShown(mShowing && !mOccluded); + ActivityManagerNative.getDefault().setLockScreenShown(mShowing, mOccluded); } catch (RemoteException e) { } } diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 94118e62b495b..3a2b3889c6bd2 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -11476,7 +11476,7 @@ public final class ActivityManagerService extends ActivityManagerNative mWindowManager.setEventDispatching(mBooted && !mShuttingDown); } - public void setLockScreenShown(boolean shown) { + public void setLockScreenShown(boolean showing, boolean occluded) { if (checkCallingPermission(android.Manifest.permission.DEVICE_POWER) != PackageManager.PERMISSION_GRANTED) { throw new SecurityException("Requires permission " @@ -11486,8 +11486,17 @@ public final class ActivityManagerService extends ActivityManagerNative synchronized(this) { long ident = Binder.clearCallingIdentity(); try { - if (DEBUG_LOCKSCREEN) logLockScreen(" shown=" + shown); - mLockScreenShown = shown ? LOCK_SCREEN_SHOWN : LOCK_SCREEN_HIDDEN; + if (DEBUG_LOCKSCREEN) logLockScreen(" showing=" + showing + " occluded=" + occluded); + mLockScreenShown = (showing && !occluded) ? LOCK_SCREEN_SHOWN : LOCK_SCREEN_HIDDEN; + if (showing && occluded) { + // The lock screen is currently showing, but is occluded by a window that can + // show on top of the lock screen. In this can we want to dismiss the docked + // stack since it will be complicated/risky to try to put the activity on top + // of the lock screen in the right fullscreen configuration. + mStackSupervisor.moveTasksToFullscreenStackLocked(DOCKED_STACK_ID, + mStackSupervisor.mFocusedStack.getStackId() == DOCKED_STACK_ID); + } + updateSleepIfNeededLocked(); } finally { Binder.restoreCallingIdentity(ident);