Loading libs/WindowManager/Shell/src/com/android/wm/shell/appzoomout/AppZoomOutController.java +6 −2 Original line number Diff line number Diff line Loading @@ -27,6 +27,7 @@ import android.app.ActivityManager; import android.app.WindowConfiguration; import android.content.Context; import android.content.res.Configuration; import android.os.Handler; import android.util.Slog; import android.window.DisplayAreaInfo; import android.window.DisplayAreaOrganizer; Loading @@ -35,6 +36,7 @@ import android.window.WindowContainerTransaction; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; import com.android.internal.jank.InteractionJankMonitor; import com.android.wm.shell.ShellTaskOrganizer; import com.android.wm.shell.common.DisplayChangeController; import com.android.wm.shell.common.DisplayController; Loading Loading @@ -81,11 +83,13 @@ public class AppZoomOutController implements RemoteCallable<AppZoomOutController public static AppZoomOutController create(Context context, ShellInit shellInit, ShellTaskOrganizer shellTaskOrganizer, DisplayController displayController, DisplayLayout displayLayout, @ShellMainThread ShellExecutor mainExecutor) { DisplayLayout displayLayout, @ShellMainThread ShellExecutor mainExecutor, @ShellMainThread Handler mainHandler, InteractionJankMonitor interactionJankMonitor) { AppZoomOutDisplayAreaOrganizer appDisplayAreaOrganizer = new AppZoomOutDisplayAreaOrganizer( context, displayLayout, mainExecutor); TopLevelZoomOutDisplayAreaOrganizer topLevelDisplayAreaOrganizer = new TopLevelZoomOutDisplayAreaOrganizer(displayLayout, context, mainExecutor); new TopLevelZoomOutDisplayAreaOrganizer(displayLayout, context, mainExecutor, mainHandler, interactionJankMonitor); return new AppZoomOutController(context, shellInit, shellTaskOrganizer, displayController, appDisplayAreaOrganizer, topLevelDisplayAreaOrganizer, mainExecutor); } Loading libs/WindowManager/Shell/src/com/android/wm/shell/appzoomout/TopLevelZoomOutDisplayAreaOrganizer.kt +44 −1 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.wm.shell.appzoomout import android.content.Context import android.os.Handler import android.util.ArrayMap import android.view.Choreographer import android.view.Display Loading @@ -23,6 +24,8 @@ import android.view.SurfaceControl import android.window.DisplayAreaInfo import android.window.DisplayAreaOrganizer import android.window.WindowContainerToken import com.android.internal.jank.Cuj.CUJ_LPP_ASSIST_INVOCATION_EFFECT import com.android.internal.jank.InteractionJankMonitor import com.android.internal.policy.ScreenDecorationsUtils import com.android.wm.shell.common.DisplayLayout import java.util.concurrent.Executor Loading @@ -38,13 +41,16 @@ private const val SqueezeEffectOverlapShortEdgeThicknessDp = 4 class TopLevelZoomOutDisplayAreaOrganizer( displayLayout: DisplayLayout, private val context: Context, mainExecutor: Executor mainExecutor: Executor, private val mainHandler: Handler, private val interactionJankMonitor: InteractionJankMonitor, ) : DisplayAreaOrganizer(mainExecutor) { private val mDisplayAreaTokenMap: MutableMap<WindowContainerToken, SurfaceControl> = ArrayMap() private val mDisplayLayout = DisplayLayout() private var cornerRadius = 1f private var mProgress = 1f private var isCujOnSuccessPath = false init { setDisplayLayout(displayLayout) Loading Loading @@ -85,6 +91,7 @@ class TopLevelZoomOutDisplayAreaOrganizer( return } updateCuj(lastProgress = mProgress, progress = progress) mProgress = progress apply() } Loading Loading @@ -164,6 +171,42 @@ class TopLevelZoomOutDisplayAreaOrganizer( .setFrameTimelineVsync(Choreographer.getInstance().vsyncId) } private fun updateCuj(lastProgress: Float, progress: Float) { // TODO(b/418136893): Send clearer start/cancel/end signals from SysUI instead if (progress == 1f) { // If the animation reaches a progress of 1f, it means that assistant is being launched // for sure and the animation could not have been cancelled (and can no longer be // cancelled). isCujOnSuccessPath = true } if (lastProgress == 0f && progress > 0f) { // A new squeeze effect animation starts (progress starts moving away from 0f). Start // the CUJ mDisplayAreaTokenMap.values.firstOrNull()?.let { interactionJankMonitor.begin( it, context, mainHandler, CUJ_LPP_ASSIST_INVOCATION_EFFECT ) } } if (lastProgress > 0f && progress == 0f) { // The progress is back at 0f, which marks the end of the animation. if (isCujOnSuccessPath) { // In case the isCujOnSuccessPath flag is set, assistant must have been launched // and we can mark the end of the CUJ interactionJankMonitor.end(CUJ_LPP_ASSIST_INVOCATION_EFFECT) } else { // If the isCujOnSuccessPath flag is not set, it means that the animation must have // been cancelled. Mark the CUJ as cancelled. interactionJankMonitor.cancel(CUJ_LPP_ASSIST_INVOCATION_EFFECT) } // Reset the isCujOnSuccessPath flag isCujOnSuccessPath = false } } fun setDisplayLayout(displayLayout: DisplayLayout) { mDisplayLayout.set(displayLayout) cornerRadius = ScreenDecorationsUtils.getWindowCornerRadius(context) Loading libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java +5 −2 Original line number Diff line number Diff line Loading @@ -1739,9 +1739,12 @@ public abstract class WMShellModule { ShellTaskOrganizer shellTaskOrganizer, DisplayController displayController, DisplayLayout displayLayout, @ShellMainThread ShellExecutor mainExecutor) { @ShellMainThread ShellExecutor mainExecutor, @ShellMainThread Handler mainHandler, InteractionJankMonitor interactionJankMonitor) { return AppZoomOutController.create(context, shellInit, shellTaskOrganizer, displayController, displayLayout, mainExecutor); displayController, displayLayout, mainExecutor, mainHandler, interactionJankMonitor); } // Loading Loading
libs/WindowManager/Shell/src/com/android/wm/shell/appzoomout/AppZoomOutController.java +6 −2 Original line number Diff line number Diff line Loading @@ -27,6 +27,7 @@ import android.app.ActivityManager; import android.app.WindowConfiguration; import android.content.Context; import android.content.res.Configuration; import android.os.Handler; import android.util.Slog; import android.window.DisplayAreaInfo; import android.window.DisplayAreaOrganizer; Loading @@ -35,6 +36,7 @@ import android.window.WindowContainerTransaction; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; import com.android.internal.jank.InteractionJankMonitor; import com.android.wm.shell.ShellTaskOrganizer; import com.android.wm.shell.common.DisplayChangeController; import com.android.wm.shell.common.DisplayController; Loading Loading @@ -81,11 +83,13 @@ public class AppZoomOutController implements RemoteCallable<AppZoomOutController public static AppZoomOutController create(Context context, ShellInit shellInit, ShellTaskOrganizer shellTaskOrganizer, DisplayController displayController, DisplayLayout displayLayout, @ShellMainThread ShellExecutor mainExecutor) { DisplayLayout displayLayout, @ShellMainThread ShellExecutor mainExecutor, @ShellMainThread Handler mainHandler, InteractionJankMonitor interactionJankMonitor) { AppZoomOutDisplayAreaOrganizer appDisplayAreaOrganizer = new AppZoomOutDisplayAreaOrganizer( context, displayLayout, mainExecutor); TopLevelZoomOutDisplayAreaOrganizer topLevelDisplayAreaOrganizer = new TopLevelZoomOutDisplayAreaOrganizer(displayLayout, context, mainExecutor); new TopLevelZoomOutDisplayAreaOrganizer(displayLayout, context, mainExecutor, mainHandler, interactionJankMonitor); return new AppZoomOutController(context, shellInit, shellTaskOrganizer, displayController, appDisplayAreaOrganizer, topLevelDisplayAreaOrganizer, mainExecutor); } Loading
libs/WindowManager/Shell/src/com/android/wm/shell/appzoomout/TopLevelZoomOutDisplayAreaOrganizer.kt +44 −1 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.wm.shell.appzoomout import android.content.Context import android.os.Handler import android.util.ArrayMap import android.view.Choreographer import android.view.Display Loading @@ -23,6 +24,8 @@ import android.view.SurfaceControl import android.window.DisplayAreaInfo import android.window.DisplayAreaOrganizer import android.window.WindowContainerToken import com.android.internal.jank.Cuj.CUJ_LPP_ASSIST_INVOCATION_EFFECT import com.android.internal.jank.InteractionJankMonitor import com.android.internal.policy.ScreenDecorationsUtils import com.android.wm.shell.common.DisplayLayout import java.util.concurrent.Executor Loading @@ -38,13 +41,16 @@ private const val SqueezeEffectOverlapShortEdgeThicknessDp = 4 class TopLevelZoomOutDisplayAreaOrganizer( displayLayout: DisplayLayout, private val context: Context, mainExecutor: Executor mainExecutor: Executor, private val mainHandler: Handler, private val interactionJankMonitor: InteractionJankMonitor, ) : DisplayAreaOrganizer(mainExecutor) { private val mDisplayAreaTokenMap: MutableMap<WindowContainerToken, SurfaceControl> = ArrayMap() private val mDisplayLayout = DisplayLayout() private var cornerRadius = 1f private var mProgress = 1f private var isCujOnSuccessPath = false init { setDisplayLayout(displayLayout) Loading Loading @@ -85,6 +91,7 @@ class TopLevelZoomOutDisplayAreaOrganizer( return } updateCuj(lastProgress = mProgress, progress = progress) mProgress = progress apply() } Loading Loading @@ -164,6 +171,42 @@ class TopLevelZoomOutDisplayAreaOrganizer( .setFrameTimelineVsync(Choreographer.getInstance().vsyncId) } private fun updateCuj(lastProgress: Float, progress: Float) { // TODO(b/418136893): Send clearer start/cancel/end signals from SysUI instead if (progress == 1f) { // If the animation reaches a progress of 1f, it means that assistant is being launched // for sure and the animation could not have been cancelled (and can no longer be // cancelled). isCujOnSuccessPath = true } if (lastProgress == 0f && progress > 0f) { // A new squeeze effect animation starts (progress starts moving away from 0f). Start // the CUJ mDisplayAreaTokenMap.values.firstOrNull()?.let { interactionJankMonitor.begin( it, context, mainHandler, CUJ_LPP_ASSIST_INVOCATION_EFFECT ) } } if (lastProgress > 0f && progress == 0f) { // The progress is back at 0f, which marks the end of the animation. if (isCujOnSuccessPath) { // In case the isCujOnSuccessPath flag is set, assistant must have been launched // and we can mark the end of the CUJ interactionJankMonitor.end(CUJ_LPP_ASSIST_INVOCATION_EFFECT) } else { // If the isCujOnSuccessPath flag is not set, it means that the animation must have // been cancelled. Mark the CUJ as cancelled. interactionJankMonitor.cancel(CUJ_LPP_ASSIST_INVOCATION_EFFECT) } // Reset the isCujOnSuccessPath flag isCujOnSuccessPath = false } } fun setDisplayLayout(displayLayout: DisplayLayout) { mDisplayLayout.set(displayLayout) cornerRadius = ScreenDecorationsUtils.getWindowCornerRadius(context) Loading
libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java +5 −2 Original line number Diff line number Diff line Loading @@ -1739,9 +1739,12 @@ public abstract class WMShellModule { ShellTaskOrganizer shellTaskOrganizer, DisplayController displayController, DisplayLayout displayLayout, @ShellMainThread ShellExecutor mainExecutor) { @ShellMainThread ShellExecutor mainExecutor, @ShellMainThread Handler mainHandler, InteractionJankMonitor interactionJankMonitor) { return AppZoomOutController.create(context, shellInit, shellTaskOrganizer, displayController, displayLayout, mainExecutor); displayController, displayLayout, mainExecutor, mainHandler, interactionJankMonitor); } // Loading