Merge "Do not collapse shade auto when SysUI start activities" into sc-dev

This commit is contained in:
TreeHugger Robot
2021-03-09 14:18:04 +00:00
committed by Android (Google) Code Review
3 changed files with 12 additions and 7 deletions

View File

@@ -1573,7 +1573,7 @@ class ActivityStarter {
} }
} else { } else {
if (!mAvoidMoveToFront && mDoResume if (!mAvoidMoveToFront && mDoResume
&& mRootWindowContainer.hasVisibleWindowAboveNotificationShade( && mRootWindowContainer.hasVisibleWindowAboveButDoesNotOwnNotificationShade(
r.launchedFromUid)) { r.launchedFromUid)) {
// If the UID launching the activity has a visible window on top of the // If the UID launching the activity has a visible window on top of the
// notification shade and it's launching an activity that's going to be at the // notification shade and it's launching an activity that's going to be at the

View File

@@ -2962,7 +2962,9 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
// startActivity() for these apps. // startActivity() for these apps.
if (!CompatChanges.isChangeEnabled(LOCK_DOWN_CLOSE_SYSTEM_DIALOGS, uid)) { if (!CompatChanges.isChangeEnabled(LOCK_DOWN_CLOSE_SYSTEM_DIALOGS, uid)) {
synchronized (mGlobalLock) { synchronized (mGlobalLock) {
if (mRootWindowContainer.hasVisibleWindowAboveNotificationShade(uid)) { // It's ok that the owner of the shade is not allowed *per this rule* because it has
// BROADCAST_CLOSE_SYSTEM_DIALOGS (SystemUI), so it would fall into that rule.
if (mRootWindowContainer.hasVisibleWindowAboveButDoesNotOwnNotificationShade(uid)) {
return true; return true;
} }
} }

View File

@@ -3127,11 +3127,14 @@ class RootWindowContainer extends WindowContainer<DisplayContent>
} }
/** /**
* Returns {@code true} if {@code uid} has a visible window that's above a window of type {@link * Returns {@code true} if {@code uid} has a visible window that's above the window of type
* WindowManager.LayoutParams#TYPE_NOTIFICATION_SHADE}. If there is no window with type {@link * {@link WindowManager.LayoutParams#TYPE_NOTIFICATION_SHADE} and {@code uid} is not owner of
* WindowManager.LayoutParams#TYPE_NOTIFICATION_SHADE}, it returns {@code false}. * the window of type {@link WindowManager.LayoutParams#TYPE_NOTIFICATION_SHADE}.
*
* If there is no window with type {@link WindowManager.LayoutParams#TYPE_NOTIFICATION_SHADE},
* it returns {@code false}.
*/ */
boolean hasVisibleWindowAboveNotificationShade(int uid) { boolean hasVisibleWindowAboveButDoesNotOwnNotificationShade(int uid) {
boolean[] visibleWindowFound = {false}; boolean[] visibleWindowFound = {false};
// We only return true if we found the notification shade (ie. window of type // We only return true if we found the notification shade (ie. window of type
// TYPE_NOTIFICATION_SHADE). Usually, it should always be there, but if for some reason // TYPE_NOTIFICATION_SHADE). Usually, it should always be there, but if for some reason
@@ -3141,7 +3144,7 @@ class RootWindowContainer extends WindowContainer<DisplayContent>
visibleWindowFound[0] = true; visibleWindowFound[0] = true;
} }
if (w.mAttrs.type == TYPE_NOTIFICATION_SHADE) { if (w.mAttrs.type == TYPE_NOTIFICATION_SHADE) {
return visibleWindowFound[0]; return visibleWindowFound[0] && w.mOwnerUid != uid;
} }
return false; return false;
}, true /* traverseTopToBottom */); }, true /* traverseTopToBottom */);