From 1e90fc38dbf92d4204a4bfc242d53e38ed9d4a4d Mon Sep 17 00:00:00 2001 From: rongliu Date: Wed, 4 Oct 2017 17:30:30 -0700 Subject: [PATCH] Add a flag to virtual display to indicates that content on this display need to be destroyed once the display is removed. Then apply this flag to VR virtual display. Change-Id: Icb5aa1280b6ebac5941afda1cc1b94b258ce44f4 Bug: 67420451 Test: Manually. "adb shell am stack list" does not show contents from virtual display anymore after it's released. --- core/java/android/hardware/display/DisplayManager.java | 9 +++++++++ .../com/android/server/display/DisplayDeviceInfo.java | 6 ++++++ .../java/com/android/server/display/LogicalDisplay.java | 3 +++ .../android/server/display/VirtualDisplayAdapter.java | 5 +++++ .../core/java/com/android/server/vr/Vr2dDisplay.java | 1 + 5 files changed, 24 insertions(+) diff --git a/core/java/android/hardware/display/DisplayManager.java b/core/java/android/hardware/display/DisplayManager.java index 6fbacaf32fd69..ae4f05a2ef94a 100644 --- a/core/java/android/hardware/display/DisplayManager.java +++ b/core/java/android/hardware/display/DisplayManager.java @@ -278,6 +278,15 @@ public final class DisplayManager { */ public static final int VIRTUAL_DISPLAY_FLAG_ROTATES_WITH_CONTENT = 1 << 7; + /** + * Virtual display flag: Indicates that the contents will be destroyed once + * the display is removed. + * + * @see #createVirtualDisplay + * @hide + */ + public static final int VIRTUAL_DISPLAY_FLAG_DESTROY_CONTENT_ON_REMOVAL = 1 << 8; + /** @hide */ public DisplayManager(Context context) { mContext = context; diff --git a/services/core/java/com/android/server/display/DisplayDeviceInfo.java b/services/core/java/com/android/server/display/DisplayDeviceInfo.java index ef6de4c1ee51f..fddb81ba2af7f 100644 --- a/services/core/java/com/android/server/display/DisplayDeviceInfo.java +++ b/services/core/java/com/android/server/display/DisplayDeviceInfo.java @@ -97,6 +97,12 @@ final class DisplayDeviceInfo { */ public static final int FLAG_CAN_SHOW_WITH_INSECURE_KEYGUARD = 1 << 9; + /** + * Flag: This display will destroy its content on removal. + * @hide + */ + public static final int FLAG_DESTROY_CONTENT_ON_REMOVAL = 1 << 10; + /** * Touch attachment: Display does not receive touch. */ diff --git a/services/core/java/com/android/server/display/LogicalDisplay.java b/services/core/java/com/android/server/display/LogicalDisplay.java index addad0b413a38..78a540790db64 100644 --- a/services/core/java/com/android/server/display/LogicalDisplay.java +++ b/services/core/java/com/android/server/display/LogicalDisplay.java @@ -238,6 +238,9 @@ final class LogicalDisplay { // For private displays by default content is destroyed on removal. mBaseDisplayInfo.removeMode = Display.REMOVE_MODE_DESTROY_CONTENT; } + if ((deviceInfo.flags & DisplayDeviceInfo.FLAG_DESTROY_CONTENT_ON_REMOVAL) != 0) { + mBaseDisplayInfo.removeMode = Display.REMOVE_MODE_DESTROY_CONTENT; + } if ((deviceInfo.flags & DisplayDeviceInfo.FLAG_PRESENTATION) != 0) { mBaseDisplayInfo.flags |= Display.FLAG_PRESENTATION; } diff --git a/services/core/java/com/android/server/display/VirtualDisplayAdapter.java b/services/core/java/com/android/server/display/VirtualDisplayAdapter.java index d6ab88813f4d2..f86d57634bff0 100644 --- a/services/core/java/com/android/server/display/VirtualDisplayAdapter.java +++ b/services/core/java/com/android/server/display/VirtualDisplayAdapter.java @@ -24,6 +24,8 @@ import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLI import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_SECURE; import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_SUPPORTS_TOUCH; import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_ROTATES_WITH_CONTENT; +import static android.hardware.display.DisplayManager + .VIRTUAL_DISPLAY_FLAG_DESTROY_CONTENT_ON_REMOVAL; import android.content.Context; import android.hardware.display.IVirtualDisplayCallback; @@ -363,6 +365,9 @@ public class VirtualDisplayAdapter extends DisplayAdapter { if ((mFlags & VIRTUAL_DISPLAY_FLAG_ROTATES_WITH_CONTENT) != 0) { mInfo.flags |= DisplayDeviceInfo.FLAG_ROTATES_WITH_CONTENT; } + if ((mFlags & VIRTUAL_DISPLAY_FLAG_DESTROY_CONTENT_ON_REMOVAL) != 0) { + mInfo.flags |= DisplayDeviceInfo.FLAG_DESTROY_CONTENT_ON_REMOVAL; + } mInfo.type = Display.TYPE_VIRTUAL; mInfo.touch = ((mFlags & VIRTUAL_DISPLAY_FLAG_SUPPORTS_TOUCH) == 0) ? diff --git a/services/core/java/com/android/server/vr/Vr2dDisplay.java b/services/core/java/com/android/server/vr/Vr2dDisplay.java index 5721415c55f57..95d03d4bda499 100644 --- a/services/core/java/com/android/server/vr/Vr2dDisplay.java +++ b/services/core/java/com/android/server/vr/Vr2dDisplay.java @@ -296,6 +296,7 @@ class Vr2dDisplay { flags |= DisplayManager.VIRTUAL_DISPLAY_FLAG_ROTATES_WITH_CONTENT; flags |= DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC; flags |= DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY; + flags |= DisplayManager.VIRTUAL_DISPLAY_FLAG_DESTROY_CONTENT_ON_REMOVAL; mVirtualDisplay = mDisplayManager.createVirtualDisplay(null /* projection */, DISPLAY_NAME, mVirtualDisplayWidth, mVirtualDisplayHeight, mVirtualDisplayDpi, null /* surface */, flags, null /* callback */, null /* handler */,