Add CUJ instrumentation for KQS

Flag: NONE LEGACY ENABLE_KEYBOARD_QUICK_SWITCH ENABLED
Bug: 339585624
Test: manually checked that CUJ calls were reached
Change-Id: Ifd2b92451c5ed2ebc35834c1d2f495275db3d49a
This commit is contained in:
Schneider Victor-tulias
2024-07-04 10:44:26 -04:00
parent 25eaff395e
commit acddb58539
4 changed files with 68 additions and 7 deletions
@@ -46,6 +46,7 @@ import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.core.content.res.ResourcesCompat;
import com.android.app.animation.Interpolators;
import com.android.internal.jank.Cuj;
import com.android.launcher3.R;
import com.android.launcher3.Utilities;
import com.android.launcher3.anim.AnimatedFloat;
@@ -53,6 +54,7 @@ import com.android.launcher3.testing.TestLogging;
import com.android.launcher3.testing.shared.TestProtocol;
import com.android.quickstep.util.DesktopTask;
import com.android.quickstep.util.GroupTask;
import com.android.systemui.shared.system.InteractionJankMonitorWrapper;
import java.util.HashMap;
import java.util.List;
@@ -331,6 +333,8 @@ public class KeyboardQuickSwitchView extends ConstraintLayout {
@Override
public void onAnimationStart(Animator animation) {
super.onAnimationStart(animation);
InteractionJankMonitorWrapper.begin(
KeyboardQuickSwitchView.this, Cuj.CUJ_LAUNCHER_KEYBOARD_QUICK_SWITCH_OPEN);
setClipToPadding(false);
setOutlineProvider(new ViewOutlineProvider() {
@Override
@@ -365,6 +369,12 @@ public class KeyboardQuickSwitchView extends ConstraintLayout {
requestFocus();
}
@Override
public void onAnimationCancel(Animator animation) {
super.onAnimationCancel(animation);
InteractionJankMonitorWrapper.cancel(Cuj.CUJ_LAUNCHER_KEYBOARD_QUICK_SWITCH_OPEN);
}
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
@@ -372,6 +382,7 @@ public class KeyboardQuickSwitchView extends ConstraintLayout {
setOutlineProvider(outlineProvider);
invalidateOutline();
mOpenAnimation = null;
InteractionJankMonitorWrapper.end(Cuj.CUJ_LAUNCHER_KEYBOARD_QUICK_SWITCH_OPEN);
}
});
@@ -16,6 +16,7 @@
package com.android.launcher3.taskbar;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.view.KeyEvent;
import android.view.animation.AnimationUtils;
import android.window.RemoteTransition;
@@ -23,6 +24,7 @@ import android.window.RemoteTransition;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.android.internal.jank.Cuj;
import com.android.launcher3.Utilities;
import com.android.launcher3.anim.AnimatorListeners;
import com.android.launcher3.taskbar.overlay.TaskbarOverlayContext;
@@ -30,6 +32,7 @@ import com.android.quickstep.util.GroupTask;
import com.android.quickstep.util.SlideInRemoteTransition;
import com.android.systemui.shared.recents.model.Task;
import com.android.systemui.shared.recents.model.ThumbnailData;
import com.android.systemui.shared.system.InteractionJankMonitorWrapper;
import com.android.systemui.shared.system.QuickStepContract;
import java.io.PrintWriter;
@@ -93,18 +96,28 @@ public class KeyboardQuickSwitchViewController {
protected void closeQuickSwitchView(boolean animate) {
if (isCloseAnimationRunning()) {
// Let currently-running animation finish.
if (!animate) {
mCloseAnimation.end();
}
// Let currently-running animation finish.
return;
}
if (!animate) {
InteractionJankMonitorWrapper.begin(
mKeyboardQuickSwitchView, Cuj.CUJ_LAUNCHER_KEYBOARD_QUICK_SWITCH_CLOSE);
onCloseComplete();
return;
}
mCloseAnimation = mKeyboardQuickSwitchView.getCloseAnimation();
mCloseAnimation.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationStart(Animator animation) {
super.onAnimationStart(animation);
InteractionJankMonitorWrapper.begin(
mKeyboardQuickSwitchView, Cuj.CUJ_LAUNCHER_KEYBOARD_QUICK_SWITCH_CLOSE);
}
});
mCloseAnimation.addListener(AnimatorListeners.forEndCallback(this::onCloseComplete));
mCloseAnimation.start();
}
@@ -142,16 +155,26 @@ public class KeyboardQuickSwitchViewController {
return -1;
}
Runnable onStartCallback = () -> InteractionJankMonitorWrapper.begin(
mKeyboardQuickSwitchView, Cuj.CUJ_LAUNCHER_KEYBOARD_QUICK_SWITCH_APP_LAUNCH);
Runnable onFinishCallback = () -> InteractionJankMonitorWrapper.end(
Cuj.CUJ_LAUNCHER_KEYBOARD_QUICK_SWITCH_APP_LAUNCH);
TaskbarActivityContext context = mControllers.taskbarActivityContext;
RemoteTransition remoteTransition = new RemoteTransition(new SlideInRemoteTransition(
Utilities.isRtl(mControllers.taskbarActivityContext.getResources()),
context.getDeviceProfile().overviewPageSpacing,
QuickStepContract.getWindowCornerRadius(context),
AnimationUtils.loadInterpolator(
context, android.R.interpolator.fast_out_extra_slow_in)),
context, android.R.interpolator.fast_out_extra_slow_in),
onStartCallback,
onFinishCallback),
"SlideInTransition");
mControllers.taskbarActivityContext.handleGroupTaskLaunch(
task, remoteTransition, mOnDesktop);
task,
remoteTransition,
mOnDesktop,
onStartCallback,
onFinishCallback);
return -1;
}
@@ -159,6 +182,7 @@ public class KeyboardQuickSwitchViewController {
mCloseAnimation = null;
mOverlayContext.getDragLayer().removeView(mKeyboardQuickSwitchView);
mControllerCallbacks.onCloseComplete();
InteractionJankMonitorWrapper.end(Cuj.CUJ_LAUNCHER_KEYBOARD_QUICK_SWITCH_CLOSE);
}
protected void onDestroy() {
@@ -1213,22 +1213,44 @@ public class TaskbarActivityContext extends BaseTaskbarContext {
}
}
public void handleGroupTaskLaunch(
GroupTask task,
@Nullable RemoteTransition remoteTransition,
boolean onDesktop) {
handleGroupTaskLaunch(task, remoteTransition, onDesktop, null, null);
}
/**
* Launches the given GroupTask with the following behavior:
* - If the GroupTask is a DesktopTask, launch the tasks in that Desktop.
* - If {@code onDesktop}, bring the given GroupTask to the front.
* - If the GroupTask is a single task, launch it via startActivityFromRecents.
* - Otherwise, we assume the GroupTask is a Split pair and launch them together.
* <p>
* Given start and/or finish callbacks, they will be run before an after the app launch
* respectively in cases where we can't use the remote transition, otherwise we will assume that
* these callbacks are included in the remote transition.
*/
public void handleGroupTaskLaunch(GroupTask task, @Nullable RemoteTransition remoteTransition,
boolean onDesktop) {
public void handleGroupTaskLaunch(
GroupTask task,
@Nullable RemoteTransition remoteTransition,
boolean onDesktop,
@Nullable Runnable onStartCallback,
@Nullable Runnable onFinishCallback) {
if (task instanceof DesktopTask) {
UI_HELPER_EXECUTOR.execute(() ->
SystemUiProxy.INSTANCE.get(this).showDesktopApps(getDisplay().getDisplayId(),
remoteTransition));
} else if (onDesktop) {
UI_HELPER_EXECUTOR.execute(() ->
SystemUiProxy.INSTANCE.get(this).showDesktopApp(task.task1.key.id));
UI_HELPER_EXECUTOR.execute(() -> {
if (onStartCallback != null) {
onStartCallback.run();
}
SystemUiProxy.INSTANCE.get(this).showDesktopApp(task.task1.key.id);
if (onFinishCallback != null) {
onFinishCallback.run();
}
});
} else if (task.task2 == null) {
UI_HELPER_EXECUTOR.execute(() -> {
ActivityOptions activityOptions =
@@ -36,6 +36,8 @@ class SlideInRemoteTransition(
private val pageSpacing: Int,
private val cornerRadius: Float,
private val interpolator: TimeInterpolator,
private val onStartCallback: Runnable,
private val onFinishCallback: Runnable,
) : RemoteTransitionStub() {
private val animationDurationMs = 500L
@@ -68,6 +70,7 @@ class SlideInRemoteTransition(
startT.setCrop(leash, chg.endAbsBounds).setCornerRadius(leash, cornerRadius)
}
}
onStartCallback.run()
startT.apply()
anim.addUpdateListener {
@@ -97,6 +100,7 @@ class SlideInRemoteTransition(
val t = Transaction()
try {
finishCB.onTransitionFinished(null, t)
onFinishCallback.run()
} catch (e: RemoteException) {
// Ignore
}