Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 861dbd30 authored by Johannes Gallmann's avatar Johannes Gallmann Committed by Android (Google) Code Review
Browse files

Merge "[Floaty] Add CUJ markers to floaty animation" into main

parents 66698f67 be461a54
Loading
Loading
Loading
Loading
+6 −2
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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);
    }
+44 −1
Original line number Diff line number Diff line
@@ -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
@@ -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
@@ -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)
@@ -85,6 +91,7 @@ class TopLevelZoomOutDisplayAreaOrganizer(
            return
        }

        updateCuj(lastProgress = mProgress, progress = progress)
        mProgress = progress
        apply()
    }
@@ -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)
+5 −2
Original line number Diff line number Diff line
@@ -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);
    }

    //