Block TYPE_PRESENTATION windows on default display
... and any other display that isn't considered a public presentation display, as per Display.isPublicPresentation() Bug: 141745510 Test: atest CtsWindowManagerDeviceTestCases:PresentationTest Change-Id: I2aaab1903dee54190338f7b6e49888aa51437108
This commit is contained in:
@@ -116,7 +116,9 @@ import android.view.WindowManagerImpl;
|
||||
* The display manager keeps track of all displays in the system. However, not all
|
||||
* displays are appropriate for showing presentations. For example, if an activity
|
||||
* attempted to show a presentation on the main display it might obscure its own content
|
||||
* (it's like opening a dialog on top of your activity).
|
||||
* (it's like opening a dialog on top of your activity). Creating a presentation on the main
|
||||
* display will result in {@link android.view.WindowManager.InvalidDisplayException} being thrown
|
||||
* when invoking {@link #show()}.
|
||||
* </p><p>
|
||||
* Here's how to identify suitable displays for showing presentations using
|
||||
* {@link DisplayManager#getDisplays(String)} and the
|
||||
@@ -243,7 +245,7 @@ public class Presentation extends Dialog {
|
||||
/**
|
||||
* Inherited from {@link Dialog#show}. Will throw
|
||||
* {@link android.view.WindowManager.InvalidDisplayException} if the specified secondary
|
||||
* {@link Display} can't be found.
|
||||
* {@link Display} can't be found or if it does not have {@link Display#FLAG_PRESENTATION} set.
|
||||
*/
|
||||
@Override
|
||||
public void show() {
|
||||
|
||||
@@ -223,6 +223,12 @@
|
||||
"group": "WM_DEBUG_ADD_REMOVE",
|
||||
"at": "com\/android\/server\/wm\/ActivityRecord.java"
|
||||
},
|
||||
"-1670695197": {
|
||||
"message": "Attempted to add presentation window to a non-suitable display. Aborting.",
|
||||
"level": "WARN",
|
||||
"group": "WM_ERROR",
|
||||
"at": "com\/android\/server\/wm\/WindowManagerService.java"
|
||||
},
|
||||
"-1661704580": {
|
||||
"message": "Attempted to set replacing window on non-existing app token %s",
|
||||
"level": "WARN",
|
||||
|
||||
@@ -65,6 +65,7 @@ import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD;
|
||||
import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD_DIALOG;
|
||||
import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR;
|
||||
import static android.view.WindowManager.LayoutParams.TYPE_NOTIFICATION_SHADE;
|
||||
import static android.view.WindowManager.LayoutParams.TYPE_PRESENTATION;
|
||||
import static android.view.WindowManager.LayoutParams.TYPE_PRIVATE_PRESENTATION;
|
||||
import static android.view.WindowManager.LayoutParams.TYPE_QS_DIALOG;
|
||||
import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR;
|
||||
@@ -1396,6 +1397,13 @@ public class WindowManagerService extends IWindowManager.Stub
|
||||
return WindowManagerGlobal.ADD_PERMISSION_DENIED;
|
||||
}
|
||||
|
||||
if (type == TYPE_PRESENTATION && !displayContent.getDisplay().isPublicPresentation()) {
|
||||
ProtoLog.w(WM_ERROR,
|
||||
"Attempted to add presentation window to a non-suitable display. "
|
||||
+ "Aborting.");
|
||||
return WindowManagerGlobal.ADD_INVALID_DISPLAY;
|
||||
}
|
||||
|
||||
ActivityRecord activity = null;
|
||||
final boolean hasParent = parentWindow != null;
|
||||
// Use existing parent window token for child windows since they go in the same token
|
||||
|
||||
Reference in New Issue
Block a user