Loading core/java/android/window/DesktopExperienceFlags.java +2 −0 Original line number Original line Diff line number Diff line Loading @@ -84,6 +84,8 @@ public enum DesktopExperienceFlags { ENABLE_CAMERA_COMPAT_EXTERNAL_DISPLAY_ROTATION_BUGFIX( ENABLE_CAMERA_COMPAT_EXTERNAL_DISPLAY_ROTATION_BUGFIX( Flags::enableCameraCompatExternalDisplayRotationBugfix, false, Flags::enableCameraCompatExternalDisplayRotationBugfix, false, Flags.FLAG_ENABLE_CAMERA_COMPAT_EXTERNAL_DISPLAY_ROTATION_BUGFIX), Flags.FLAG_ENABLE_CAMERA_COMPAT_EXTERNAL_DISPLAY_ROTATION_BUGFIX), ENABLE_CLEAR_REUSABLE_SCVH_ON_RELEASE(Flags::clearReusableScvhOnRelease, false, Flags.FLAG_CLEAR_REUSABLE_SCVH_ON_RELEASE), ENABLE_CONNECTED_DISPLAYS_DND(Flags::enableConnectedDisplaysDnd, true, ENABLE_CONNECTED_DISPLAYS_DND(Flags::enableConnectedDisplaysDnd, true, Flags.FLAG_ENABLE_CONNECTED_DISPLAYS_DND), Flags.FLAG_ENABLE_CONNECTED_DISPLAYS_DND), ENABLE_CONNECTED_DISPLAYS_PIP(Flags::enableConnectedDisplaysPip, true, ENABLE_CONNECTED_DISPLAYS_PIP(Flags::enableConnectedDisplaysPip, true, Loading core/java/android/window/flags/lse_desktop_experience.aconfig +10 −0 Original line number Original line Diff line number Diff line Loading @@ -12,6 +12,16 @@ flag { } } } } flag { name: "clear_reusable_scvh_on_release" namespace: "lse_desktop_experience" description: "Resets the views of reusable SCVHs when released" bug: "432324168" metadata { purpose: PURPOSE_BUGFIX } } flag { flag { name: "close_task_keyboard_shortcut" name: "close_task_keyboard_shortcut" namespace: "lse_desktop_experience" namespace: "lse_desktop_experience" Loading libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/caption/CaptionController.kt +19 −3 Original line number Original line Diff line number Diff line Loading @@ -42,6 +42,7 @@ import com.android.wm.shell.windowdecor.WindowDecoration2.SurfaceControlViewHost import com.android.wm.shell.windowdecor.WindowDecorationInsets import com.android.wm.shell.windowdecor.WindowDecorationInsets import com.android.wm.shell.windowdecor.common.viewhost.WindowDecorViewHost import com.android.wm.shell.windowdecor.common.viewhost.WindowDecorViewHost import com.android.wm.shell.windowdecor.common.viewhost.WindowDecorViewHostSupplier import com.android.wm.shell.windowdecor.common.viewhost.WindowDecorViewHostSupplier import com.android.wm.shell.windowdecor.extension.identityHashCode import com.android.wm.shell.windowdecor.extension.isRtl import com.android.wm.shell.windowdecor.extension.isRtl import com.android.wm.shell.windowdecor.extension.isTransparentCaptionBarAppearance import com.android.wm.shell.windowdecor.extension.isTransparentCaptionBarAppearance import com.android.wm.shell.windowdecor.viewholder.WindowDecorationViewHolder import com.android.wm.shell.windowdecor.viewholder.WindowDecorationViewHolder Loading Loading @@ -213,6 +214,7 @@ abstract class CaptionController<T>( protected open fun getCaptionTopPadding(): Int = 0 protected open fun getCaptionTopPadding(): Int = 0 /** Updates the caption's view hierarchy. */ /** Updates the caption's view hierarchy. */ @OptIn(ExperimentalStdlibApi::class) private fun updateViewHierarchy( private fun updateViewHierarchy( params: RelayoutParams, params: RelayoutParams, viewHost: WindowDecorViewHost, viewHost: WindowDecorViewHost, Loading @@ -228,11 +230,15 @@ abstract class CaptionController<T>( ) { ) { val taskId = taskInfo.taskId val taskId = taskInfo.taskId logD( logD( "updateViewHierarchy of taskId=%d size=%dx%d touchableRegion=%s", "updateViewHierarchy of taskId=%d size=%dx%d touchableRegion=%s " + "view=%s viewParent=%s viewHost=%s", taskId, taskId, captionWidth, captionWidth, captionHeight, captionHeight, touchableRegion, touchableRegion, view.identityHashCode.toHexString(), view.parent.identityHashCode.toHexString(), viewHost, ) ) val lp = val lp = WindowManager.LayoutParams( WindowManager.LayoutParams( Loading Loading @@ -480,7 +486,12 @@ abstract class CaptionController<T>( * view holder. * view holder. */ */ private fun getOrCreateViewHolder(): WindowDecorationViewHolder<*> { private fun getOrCreateViewHolder(): WindowDecorationViewHolder<*> { val viewHolder = windowDecorationViewHolder ?: createCaptionView() val currentViewHolder = windowDecorationViewHolder if (currentViewHolder != null) { return currentViewHolder } val viewHolder = createCaptionView() logD("getOrCreateViewHolder() created new caption view: %s", viewHolder) windowDecorationViewHolder = viewHolder windowDecorationViewHolder = viewHolder return viewHolder return viewHolder } } Loading @@ -501,7 +512,12 @@ abstract class CaptionController<T>( traceTag = Trace.TRACE_TAG_WINDOW_MANAGER, traceTag = Trace.TRACE_TAG_WINDOW_MANAGER, name = "CaptionController#getOrCreateViewHost", name = "CaptionController#getOrCreateViewHost", ) { ) { val viewHost = captionViewHost ?: windowDecorViewHostSupplier.acquire(context, display) val currentViewHost = captionViewHost if (currentViewHost != null) { return currentViewHost } val viewHost = windowDecorViewHostSupplier.acquire(context, display) logD("getOrCreateViewHost() acquired viewHost: %s", viewHost) captionViewHost = viewHost captionViewHost = viewHost return viewHost return viewHost } } Loading libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/common/viewhost/DefaultWindowDecorViewHost.kt +4 −0 Original line number Original line Diff line number Diff line Loading @@ -82,6 +82,10 @@ class DefaultWindowDecorViewHost( Trace.endSection() Trace.endSection() } } override fun reset() { // No-op. } override fun release(t: SurfaceControl.Transaction) { override fun release(t: SurfaceControl.Transaction) { clearCurrentUpdateJob() clearCurrentUpdateJob() viewHostAdapter.release(t) viewHostAdapter.release(t) Loading libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/common/viewhost/PooledWindowDecorViewHostSupplier.kt +4 −0 Original line number Original line Diff line number Diff line Loading @@ -20,6 +20,7 @@ import android.os.Trace import android.util.Pools import android.util.Pools import android.view.Display import android.view.Display import android.view.SurfaceControl import android.view.SurfaceControl import android.window.DesktopExperienceFlags import com.android.wm.shell.shared.annotations.ShellMainThread import com.android.wm.shell.shared.annotations.ShellMainThread import com.android.wm.shell.sysui.ShellInit import com.android.wm.shell.sysui.ShellInit import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope Loading Loading @@ -84,6 +85,9 @@ class PooledWindowDecorViewHostSupplier( } } override fun release(viewHost: WindowDecorViewHost, t: SurfaceControl.Transaction) { override fun release(viewHost: WindowDecorViewHost, t: SurfaceControl.Transaction) { if (DesktopExperienceFlags.ENABLE_CLEAR_REUSABLE_SCVH_ON_RELEASE.isTrue) { viewHost.reset() } val pooled = pool.release(viewHost) val pooled = pool.release(viewHost) if (!pooled) { if (!pooled) { viewHost.release(t) viewHost.release(t) Loading Loading
core/java/android/window/DesktopExperienceFlags.java +2 −0 Original line number Original line Diff line number Diff line Loading @@ -84,6 +84,8 @@ public enum DesktopExperienceFlags { ENABLE_CAMERA_COMPAT_EXTERNAL_DISPLAY_ROTATION_BUGFIX( ENABLE_CAMERA_COMPAT_EXTERNAL_DISPLAY_ROTATION_BUGFIX( Flags::enableCameraCompatExternalDisplayRotationBugfix, false, Flags::enableCameraCompatExternalDisplayRotationBugfix, false, Flags.FLAG_ENABLE_CAMERA_COMPAT_EXTERNAL_DISPLAY_ROTATION_BUGFIX), Flags.FLAG_ENABLE_CAMERA_COMPAT_EXTERNAL_DISPLAY_ROTATION_BUGFIX), ENABLE_CLEAR_REUSABLE_SCVH_ON_RELEASE(Flags::clearReusableScvhOnRelease, false, Flags.FLAG_CLEAR_REUSABLE_SCVH_ON_RELEASE), ENABLE_CONNECTED_DISPLAYS_DND(Flags::enableConnectedDisplaysDnd, true, ENABLE_CONNECTED_DISPLAYS_DND(Flags::enableConnectedDisplaysDnd, true, Flags.FLAG_ENABLE_CONNECTED_DISPLAYS_DND), Flags.FLAG_ENABLE_CONNECTED_DISPLAYS_DND), ENABLE_CONNECTED_DISPLAYS_PIP(Flags::enableConnectedDisplaysPip, true, ENABLE_CONNECTED_DISPLAYS_PIP(Flags::enableConnectedDisplaysPip, true, Loading
core/java/android/window/flags/lse_desktop_experience.aconfig +10 −0 Original line number Original line Diff line number Diff line Loading @@ -12,6 +12,16 @@ flag { } } } } flag { name: "clear_reusable_scvh_on_release" namespace: "lse_desktop_experience" description: "Resets the views of reusable SCVHs when released" bug: "432324168" metadata { purpose: PURPOSE_BUGFIX } } flag { flag { name: "close_task_keyboard_shortcut" name: "close_task_keyboard_shortcut" namespace: "lse_desktop_experience" namespace: "lse_desktop_experience" Loading
libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/caption/CaptionController.kt +19 −3 Original line number Original line Diff line number Diff line Loading @@ -42,6 +42,7 @@ import com.android.wm.shell.windowdecor.WindowDecoration2.SurfaceControlViewHost import com.android.wm.shell.windowdecor.WindowDecorationInsets import com.android.wm.shell.windowdecor.WindowDecorationInsets import com.android.wm.shell.windowdecor.common.viewhost.WindowDecorViewHost import com.android.wm.shell.windowdecor.common.viewhost.WindowDecorViewHost import com.android.wm.shell.windowdecor.common.viewhost.WindowDecorViewHostSupplier import com.android.wm.shell.windowdecor.common.viewhost.WindowDecorViewHostSupplier import com.android.wm.shell.windowdecor.extension.identityHashCode import com.android.wm.shell.windowdecor.extension.isRtl import com.android.wm.shell.windowdecor.extension.isRtl import com.android.wm.shell.windowdecor.extension.isTransparentCaptionBarAppearance import com.android.wm.shell.windowdecor.extension.isTransparentCaptionBarAppearance import com.android.wm.shell.windowdecor.viewholder.WindowDecorationViewHolder import com.android.wm.shell.windowdecor.viewholder.WindowDecorationViewHolder Loading Loading @@ -213,6 +214,7 @@ abstract class CaptionController<T>( protected open fun getCaptionTopPadding(): Int = 0 protected open fun getCaptionTopPadding(): Int = 0 /** Updates the caption's view hierarchy. */ /** Updates the caption's view hierarchy. */ @OptIn(ExperimentalStdlibApi::class) private fun updateViewHierarchy( private fun updateViewHierarchy( params: RelayoutParams, params: RelayoutParams, viewHost: WindowDecorViewHost, viewHost: WindowDecorViewHost, Loading @@ -228,11 +230,15 @@ abstract class CaptionController<T>( ) { ) { val taskId = taskInfo.taskId val taskId = taskInfo.taskId logD( logD( "updateViewHierarchy of taskId=%d size=%dx%d touchableRegion=%s", "updateViewHierarchy of taskId=%d size=%dx%d touchableRegion=%s " + "view=%s viewParent=%s viewHost=%s", taskId, taskId, captionWidth, captionWidth, captionHeight, captionHeight, touchableRegion, touchableRegion, view.identityHashCode.toHexString(), view.parent.identityHashCode.toHexString(), viewHost, ) ) val lp = val lp = WindowManager.LayoutParams( WindowManager.LayoutParams( Loading Loading @@ -480,7 +486,12 @@ abstract class CaptionController<T>( * view holder. * view holder. */ */ private fun getOrCreateViewHolder(): WindowDecorationViewHolder<*> { private fun getOrCreateViewHolder(): WindowDecorationViewHolder<*> { val viewHolder = windowDecorationViewHolder ?: createCaptionView() val currentViewHolder = windowDecorationViewHolder if (currentViewHolder != null) { return currentViewHolder } val viewHolder = createCaptionView() logD("getOrCreateViewHolder() created new caption view: %s", viewHolder) windowDecorationViewHolder = viewHolder windowDecorationViewHolder = viewHolder return viewHolder return viewHolder } } Loading @@ -501,7 +512,12 @@ abstract class CaptionController<T>( traceTag = Trace.TRACE_TAG_WINDOW_MANAGER, traceTag = Trace.TRACE_TAG_WINDOW_MANAGER, name = "CaptionController#getOrCreateViewHost", name = "CaptionController#getOrCreateViewHost", ) { ) { val viewHost = captionViewHost ?: windowDecorViewHostSupplier.acquire(context, display) val currentViewHost = captionViewHost if (currentViewHost != null) { return currentViewHost } val viewHost = windowDecorViewHostSupplier.acquire(context, display) logD("getOrCreateViewHost() acquired viewHost: %s", viewHost) captionViewHost = viewHost captionViewHost = viewHost return viewHost return viewHost } } Loading
libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/common/viewhost/DefaultWindowDecorViewHost.kt +4 −0 Original line number Original line Diff line number Diff line Loading @@ -82,6 +82,10 @@ class DefaultWindowDecorViewHost( Trace.endSection() Trace.endSection() } } override fun reset() { // No-op. } override fun release(t: SurfaceControl.Transaction) { override fun release(t: SurfaceControl.Transaction) { clearCurrentUpdateJob() clearCurrentUpdateJob() viewHostAdapter.release(t) viewHostAdapter.release(t) Loading
libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/common/viewhost/PooledWindowDecorViewHostSupplier.kt +4 −0 Original line number Original line Diff line number Diff line Loading @@ -20,6 +20,7 @@ import android.os.Trace import android.util.Pools import android.util.Pools import android.view.Display import android.view.Display import android.view.SurfaceControl import android.view.SurfaceControl import android.window.DesktopExperienceFlags import com.android.wm.shell.shared.annotations.ShellMainThread import com.android.wm.shell.shared.annotations.ShellMainThread import com.android.wm.shell.sysui.ShellInit import com.android.wm.shell.sysui.ShellInit import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope Loading Loading @@ -84,6 +85,9 @@ class PooledWindowDecorViewHostSupplier( } } override fun release(viewHost: WindowDecorViewHost, t: SurfaceControl.Transaction) { override fun release(viewHost: WindowDecorViewHost, t: SurfaceControl.Transaction) { if (DesktopExperienceFlags.ENABLE_CLEAR_REUSABLE_SCVH_ON_RELEASE.isTrue) { viewHost.reset() } val pooled = pool.release(viewHost) val pooled = pool.release(viewHost) if (!pooled) { if (!pooled) { viewHost.release(t) viewHost.release(t) Loading