Don't show alert window notifications when in Vr mode.
Change-Id: I6ef60682197f6581fb101598290b2390ea676091
Fixes: 35854095
Test: manual
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index be5ff80..e1b6bd4 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -2385,16 +2385,19 @@
idleUids();
} break;
case VR_MODE_CHANGE_MSG: {
- if (mVrController.onVrModeChanged((ActivityRecord) msg.obj)) {
- synchronized (ActivityManagerService.this) {
- if (mVrController.shouldDisableNonVrUiLocked()) {
- // If we are in a VR mode where Picture-in-Picture mode is unsupported,
- // then remove the pinned stack.
- final PinnedActivityStack pinnedStack = mStackSupervisor.getStack(
- PINNED_STACK_ID);
- if (pinnedStack != null) {
- mStackSupervisor.removeStackLocked(PINNED_STACK_ID);
- }
+ if (!mVrController.onVrModeChanged((ActivityRecord) msg.obj)) {
+ return;
+ }
+ synchronized (ActivityManagerService.this) {
+ final boolean disableNonVrUi = mVrController.shouldDisableNonVrUiLocked();
+ mWindowManager.disableNonVrUi(disableNonVrUi);
+ if (disableNonVrUi) {
+ // If we are in a VR mode where Picture-in-Picture mode is unsupported,
+ // then remove the pinned stack.
+ final PinnedActivityStack pinnedStack = mStackSupervisor.getStack(
+ PINNED_STACK_ID);
+ if (pinnedStack != null) {
+ mStackSupervisor.removeStackLocked(PINNED_STACK_ID);
}
}
}
diff --git a/services/core/java/com/android/server/wm/AlertWindowNotification.java b/services/core/java/com/android/server/wm/AlertWindowNotification.java
index efc92cf..7ed3eac 100644
--- a/services/core/java/com/android/server/wm/AlertWindowNotification.java
+++ b/services/core/java/com/android/server/wm/AlertWindowNotification.java
@@ -50,7 +50,7 @@
private String mNotificationTag;
private final NotificationManager mNotificationManager;
private final String mPackageName;
- private boolean mCancelled;
+ private boolean mPosted;
private IconUtilities mIconUtilities;
AlertWindowNotification(WindowManagerService service, String packageName) {
@@ -61,7 +61,9 @@
mNotificationTag = CHANNEL_PREFIX + mPackageName;
mRequestCode = sNextRequestCode++;
mIconUtilities = new IconUtilities(mService.mContext);
+ }
+ void post() {
// We can't create/post the notification while the window manager lock is held since it will
// end up calling into activity manager. So, we post a message to do it later.
mService.mH.post(this::onPostNotification);
@@ -76,16 +78,21 @@
/** Don't call with the window manager lock held! */
private void onCancelNotification() {
+ if (!mPosted) {
+ // Notification isn't currently posted...
+ return;
+ }
+ mPosted = false;
mNotificationManager.cancel(mNotificationTag, NOTIFICATION_ID);
- mCancelled = true;
}
/** Don't call with the window manager lock held! */
private void onPostNotification() {
- if (mCancelled) {
- // Notification was cancelled, so nothing more to do...
+ if (mPosted) {
+ // Notification already posted...
return;
}
+ mPosted = true;
final Context context = mService.mContext;
final PackageManager pm = context.getPackageManager();
diff --git a/services/core/java/com/android/server/wm/Session.java b/services/core/java/com/android/server/wm/Session.java
index 30e0ded..6a7123c 100644
--- a/services/core/java/com/android/server/wm/Session.java
+++ b/services/core/java/com/android/server/wm/Session.java
@@ -81,6 +81,7 @@
private final Set<WindowSurfaceController> mAlertWindowSurfaces = new HashSet<>();
final boolean mCanAddInternalSystemWindow;
private AlertWindowNotification mAlertWindowNotification;
+ private boolean mShowingAlertWindowNotificationAllowed;
private boolean mClientDead = false;
private float mLastReportedAnimatorScale;
private String mPackageName;
@@ -95,6 +96,7 @@
mLastReportedAnimatorScale = service.getCurrentAnimatorScale();
mCanAddInternalSystemWindow = service.mContext.checkCallingOrSelfPermission(
INTERNAL_SYSTEM_WINDOW) == PERMISSION_GRANTED;
+ mShowingAlertWindowNotificationAllowed = mService.mShowAlertWindowNotifications;
StringBuilder sb = new StringBuilder();
sb.append("Session{");
sb.append(Integer.toHexString(System.identityHashCode(this)));
@@ -591,6 +593,9 @@
cancelAlertWindowNotification();
} else if (mAlertWindowNotification == null){
mAlertWindowNotification = new AlertWindowNotification(mService, mPackageName);
+ if (mShowingAlertWindowNotificationAllowed) {
+ mAlertWindowNotification.post();
+ }
}
}
}
@@ -612,6 +617,17 @@
}
}
+ void setShowingAlertWindowNotificationAllowed(boolean allowed) {
+ mShowingAlertWindowNotificationAllowed = allowed;
+ if (mAlertWindowNotification != null) {
+ if (allowed) {
+ mAlertWindowNotification.post();
+ } else {
+ mAlertWindowNotification.cancel();
+ }
+ }
+ }
+
private void killSessionLocked() {
if (mNumWindow > 0 || !mClientDead) {
return;
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 1be0512..843abdc 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -402,6 +402,9 @@
final DisplaySettings mDisplaySettings;
+ /** If the system should display notifications for apps displaying an alert window. */
+ boolean mShowAlertWindowNotifications = true;
+
/**
* All currently active sessions with clients.
*/
@@ -7370,4 +7373,21 @@
}
}
}
+
+ /** Called to inform window manager if non-Vr UI shoul be disabled or not. */
+ public void disableNonVrUi(boolean disable) {
+ synchronized (mWindowMap) {
+ // Allow alert window notifications to be shown if non-vr UI is enabled.
+ final boolean showAlertWindowNotifications = !disable;
+ if (showAlertWindowNotifications == mShowAlertWindowNotifications) {
+ return;
+ }
+ mShowAlertWindowNotifications = showAlertWindowNotifications;
+
+ for (int i = mSessions.size() - 1; i >= 0; --i) {
+ final Session s = mSessions.valueAt(i);
+ s.setShowingAlertWindowNotificationAllowed(mShowAlertWindowNotifications);
+ }
+ }
+ }
}