Merge changes from topic "cuj-sysui-launches" into sc-dev
* changes: Instrument SysUI app launches Add SysUI app launches CUJ to InteractionJankMonitor
This commit is contained in:
committed by
Android (Google) Code Review
commit
b538b60ea6
@@ -43,6 +43,10 @@ import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_IN
|
||||
import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__NOTIFICATION_SHADE_SWIPE;
|
||||
import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__SETTINGS_PAGE_SCROLL;
|
||||
import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__SHADE_APP_LAUNCH;
|
||||
import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__SHADE_APP_LAUNCH_FROM_HISTORY_BUTTON;
|
||||
import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__SHADE_APP_LAUNCH_FROM_MEDIA_PLAYER;
|
||||
import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__SHADE_APP_LAUNCH_FROM_QS_TILE;
|
||||
import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__SHADE_APP_LAUNCH_FROM_SETTINGS_BUTTON;
|
||||
import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__SHADE_EXPAND_COLLAPSE_LOCK;
|
||||
import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__SHADE_HEADS_UP_APPEAR;
|
||||
import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__SHADE_HEADS_UP_DISAPPEAR;
|
||||
@@ -53,6 +57,7 @@ import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_IN
|
||||
import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__SHADE_ROW_EXPAND;
|
||||
import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__SHADE_ROW_SWIPE;
|
||||
import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__SHADE_SCROLL_FLING;
|
||||
import static com.android.internal.util.FrameworkStatsLog.UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__STATUS_BAR_APP_LAUNCH_FROM_CALL_CHIP;
|
||||
|
||||
import android.annotation.IntDef;
|
||||
import android.annotation.NonNull;
|
||||
@@ -153,6 +158,11 @@ public class InteractionJankMonitor {
|
||||
public static final int CUJ_LAUNCHER_APP_LAUNCH_FROM_WIDGET = 27;
|
||||
public static final int CUJ_SETTINGS_PAGE_SCROLL = 28;
|
||||
public static final int CUJ_LOCKSCREEN_UNLOCK_ANIMATION = 29;
|
||||
public static final int CUJ_SHADE_APP_LAUNCH_FROM_HISTORY_BUTTON = 30;
|
||||
public static final int CUJ_SHADE_APP_LAUNCH_FROM_MEDIA_PLAYER = 31;
|
||||
public static final int CUJ_SHADE_APP_LAUNCH_FROM_QS_TILE = 32;
|
||||
public static final int CUJ_SHADE_APP_LAUNCH_FROM_SETTINGS_BUTTON = 33;
|
||||
public static final int CUJ_STATUS_BAR_APP_LAUNCH_FROM_CALL_CHIP = 34;
|
||||
|
||||
private static final int NO_STATSD_LOGGING = -1;
|
||||
|
||||
@@ -191,6 +201,11 @@ public class InteractionJankMonitor {
|
||||
UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__LAUNCHER_APP_LAUNCH_FROM_WIDGET,
|
||||
UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__SETTINGS_PAGE_SCROLL,
|
||||
UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__LOCKSCREEN_UNLOCK_ANIMATION,
|
||||
UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__SHADE_APP_LAUNCH_FROM_HISTORY_BUTTON,
|
||||
UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__SHADE_APP_LAUNCH_FROM_MEDIA_PLAYER,
|
||||
UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__SHADE_APP_LAUNCH_FROM_QS_TILE,
|
||||
UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__SHADE_APP_LAUNCH_FROM_SETTINGS_BUTTON,
|
||||
UIINTERACTION_FRAME_INFO_REPORTED__INTERACTION_TYPE__STATUS_BAR_APP_LAUNCH_FROM_CALL_CHIP,
|
||||
};
|
||||
|
||||
private static volatile InteractionJankMonitor sInstance;
|
||||
@@ -240,6 +255,11 @@ public class InteractionJankMonitor {
|
||||
CUJ_LAUNCHER_APP_LAUNCH_FROM_WIDGET,
|
||||
CUJ_SETTINGS_PAGE_SCROLL,
|
||||
CUJ_LOCKSCREEN_UNLOCK_ANIMATION,
|
||||
CUJ_SHADE_APP_LAUNCH_FROM_HISTORY_BUTTON,
|
||||
CUJ_SHADE_APP_LAUNCH_FROM_MEDIA_PLAYER,
|
||||
CUJ_SHADE_APP_LAUNCH_FROM_QS_TILE,
|
||||
CUJ_SHADE_APP_LAUNCH_FROM_SETTINGS_BUTTON,
|
||||
CUJ_STATUS_BAR_APP_LAUNCH_FROM_CALL_CHIP,
|
||||
})
|
||||
@Retention(RetentionPolicy.SOURCE)
|
||||
public @interface CujType {
|
||||
@@ -578,6 +598,16 @@ public class InteractionJankMonitor {
|
||||
return "SETTINGS_PAGE_SCROLL";
|
||||
case CUJ_LOCKSCREEN_UNLOCK_ANIMATION:
|
||||
return "LOCKSCREEN_UNLOCK_ANIMATION";
|
||||
case CUJ_SHADE_APP_LAUNCH_FROM_HISTORY_BUTTON:
|
||||
return "SHADE_APP_LAUNCH_FROM_HISTORY_BUTTON";
|
||||
case CUJ_SHADE_APP_LAUNCH_FROM_MEDIA_PLAYER:
|
||||
return "SHADE_APP_LAUNCH_FROM_MEDIA_PLAYER";
|
||||
case CUJ_SHADE_APP_LAUNCH_FROM_QS_TILE:
|
||||
return "SHADE_APP_LAUNCH_FROM_QS_TILE";
|
||||
case CUJ_SHADE_APP_LAUNCH_FROM_SETTINGS_BUTTON:
|
||||
return "SHADE_APP_LAUNCH_FROM_SETTINGS_BUTTON";
|
||||
case CUJ_STATUS_BAR_APP_LAUNCH_FROM_CALL_CHIP:
|
||||
return "STATUS_BAR_APP_LAUNCH_FROM_CALL_CHIP";
|
||||
}
|
||||
return "UNKNOWN";
|
||||
}
|
||||
|
||||
@@ -238,7 +238,9 @@ class ActivityLaunchAnimator(
|
||||
* during the animation.
|
||||
*/
|
||||
@JvmStatic
|
||||
fun fromView(view: View): Controller = GhostedViewLaunchAnimatorController(view)
|
||||
fun fromView(view: View, cujType: Int? = null): Controller {
|
||||
return GhostedViewLaunchAnimatorController(view, cujType)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -14,6 +14,7 @@ import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.view.ViewGroupOverlay
|
||||
import android.widget.FrameLayout
|
||||
import com.android.internal.jank.InteractionJankMonitor
|
||||
import kotlin.math.min
|
||||
|
||||
/**
|
||||
@@ -29,7 +30,10 @@ import kotlin.math.min
|
||||
*/
|
||||
open class GhostedViewLaunchAnimatorController(
|
||||
/** The view that will be ghosted and from which the background will be extracted. */
|
||||
private val ghostedView: View
|
||||
private val ghostedView: View,
|
||||
|
||||
/** The [InteractionJankMonitor.CujType] associated to this animation. */
|
||||
private val cujType: Int? = null
|
||||
) : ActivityLaunchAnimator.Controller {
|
||||
/** The container to which we will add the ghost view and expanding background. */
|
||||
override var launchContainer = ghostedView.rootView as ViewGroup
|
||||
@@ -125,6 +129,8 @@ open class GhostedViewLaunchAnimatorController(
|
||||
|
||||
val matrix = ghostView?.animationMatrix ?: Matrix.IDENTITY_MATRIX
|
||||
matrix.getValues(initialGhostViewMatrixValues)
|
||||
|
||||
cujType?.let { InteractionJankMonitor.getInstance().begin(ghostedView, it) }
|
||||
}
|
||||
|
||||
override fun onLaunchAnimationProgress(
|
||||
@@ -167,6 +173,8 @@ open class GhostedViewLaunchAnimatorController(
|
||||
}
|
||||
|
||||
override fun onLaunchAnimationEnd(isExpandingFullyAbove: Boolean) {
|
||||
cujType?.let { InteractionJankMonitor.getInstance().end(it) }
|
||||
|
||||
backgroundDrawable?.wrapped?.alpha = startBackgroundAlpha
|
||||
|
||||
GhostView.removeGhost(ghostedView)
|
||||
|
||||
@@ -46,6 +46,7 @@ import androidx.annotation.Nullable;
|
||||
import androidx.annotation.UiThread;
|
||||
import androidx.constraintlayout.widget.ConstraintSet;
|
||||
|
||||
import com.android.internal.jank.InteractionJankMonitor;
|
||||
import com.android.settingslib.widget.AdaptiveIcon;
|
||||
import com.android.systemui.R;
|
||||
import com.android.systemui.animation.ActivityLaunchAnimator;
|
||||
@@ -468,7 +469,8 @@ public class MediaControlPanel {
|
||||
TransitionLayout player) {
|
||||
// TODO(b/174236650): Make sure that the carousel indicator also fades out.
|
||||
// TODO(b/174236650): Instrument the animation to measure jank.
|
||||
return new GhostedViewLaunchAnimatorController(player) {
|
||||
return new GhostedViewLaunchAnimatorController(player,
|
||||
InteractionJankMonitor.CUJ_SHADE_APP_LAUNCH_FROM_MEDIA_PLAYER) {
|
||||
@Override
|
||||
protected float getCurrentTopCornerRadius() {
|
||||
return ((IlluminationDrawable) player.getBackground()).getCornerRadius();
|
||||
|
||||
@@ -28,6 +28,7 @@ import android.view.View;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.android.internal.jank.InteractionJankMonitor;
|
||||
import com.android.internal.logging.MetricsLogger;
|
||||
import com.android.internal.logging.UiEventLogger;
|
||||
import com.android.internal.logging.nano.MetricsProto;
|
||||
@@ -272,7 +273,8 @@ public class QSFooterViewController extends ViewController<QSFooterView> impleme
|
||||
private void startSettingsActivity() {
|
||||
ActivityLaunchAnimator.Controller animationController =
|
||||
mSettingsButtonContainer != null ? ActivityLaunchAnimator.Controller.fromView(
|
||||
mSettingsButtonContainer) : null;
|
||||
mSettingsButtonContainer,
|
||||
InteractionJankMonitor.CUJ_SHADE_APP_LAUNCH_FROM_SETTINGS_BUTTON) : null;
|
||||
mActivityStarter.startActivity(new Intent(android.provider.Settings.ACTION_SETTINGS),
|
||||
true /* dismissShade */, animationController);
|
||||
}
|
||||
|
||||
@@ -50,6 +50,7 @@ import androidx.lifecycle.LifecycleOwner;
|
||||
import androidx.lifecycle.LifecycleRegistry;
|
||||
|
||||
import com.android.internal.annotations.VisibleForTesting;
|
||||
import com.android.internal.jank.InteractionJankMonitor;
|
||||
import com.android.internal.logging.InstanceId;
|
||||
import com.android.internal.logging.MetricsLogger;
|
||||
import com.android.internal.logging.UiEventLogger;
|
||||
@@ -389,7 +390,8 @@ public abstract class QSTileImpl<TState extends State> implements QSTile, Lifecy
|
||||
*/
|
||||
protected void handleLongClick(@Nullable View view) {
|
||||
ActivityLaunchAnimator.Controller animationController =
|
||||
view != null ? ActivityLaunchAnimator.Controller.fromView(view) : null;
|
||||
view != null ? ActivityLaunchAnimator.Controller.fromView(view,
|
||||
InteractionJankMonitor.CUJ_SHADE_APP_LAUNCH_FROM_QS_TILE) : null;
|
||||
mActivityStarter.postStartActivityDismissingKeyguard(getLongClickIntent(), 0,
|
||||
animationController);
|
||||
}
|
||||
|
||||
@@ -11,6 +11,7 @@ import android.text.TextUtils
|
||||
import android.text.format.DateFormat
|
||||
import android.view.View
|
||||
import androidx.annotation.VisibleForTesting
|
||||
import com.android.internal.jank.InteractionJankMonitor
|
||||
import com.android.internal.logging.MetricsLogger
|
||||
import com.android.systemui.R
|
||||
import com.android.systemui.animation.ActivityLaunchAnimator
|
||||
@@ -70,7 +71,10 @@ class AlarmTile @Inject constructor(
|
||||
}
|
||||
|
||||
override fun handleClick(view: View?) {
|
||||
val animationController = view?.let { ActivityLaunchAnimator.Controller.fromView(it) }
|
||||
val animationController = view?.let {
|
||||
ActivityLaunchAnimator.Controller.fromView(
|
||||
it, InteractionJankMonitor.CUJ_SHADE_APP_LAUNCH_FROM_QS_TILE)
|
||||
}
|
||||
val pendingIntent = lastAlarmInfo?.showIntent
|
||||
if (pendingIntent != null) {
|
||||
mActivityStarter.postStartActivityDismissingKeyguard(pendingIntent, animationController)
|
||||
|
||||
@@ -22,6 +22,7 @@ import android.os.Handler
|
||||
import android.os.Looper
|
||||
import android.service.quicksettings.Tile
|
||||
import android.view.View
|
||||
import com.android.internal.jank.InteractionJankMonitor
|
||||
import com.android.internal.logging.MetricsLogger
|
||||
import com.android.systemui.R
|
||||
import com.android.systemui.animation.ActivityLaunchAnimator
|
||||
@@ -106,7 +107,8 @@ class DeviceControlsTile @Inject constructor(
|
||||
putExtra(ControlsUiController.EXTRA_ANIMATE, true)
|
||||
}
|
||||
val animationController = view?.let {
|
||||
ActivityLaunchAnimator.Controller.fromView(it)
|
||||
ActivityLaunchAnimator.Controller.fromView(
|
||||
it, InteractionJankMonitor.CUJ_SHADE_APP_LAUNCH_FROM_QS_TILE)
|
||||
}
|
||||
|
||||
mUiHandler.post {
|
||||
|
||||
@@ -37,6 +37,7 @@ import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import com.android.internal.annotations.VisibleForTesting;
|
||||
import com.android.internal.jank.InteractionJankMonitor;
|
||||
import com.android.internal.logging.MetricsLogger;
|
||||
import com.android.systemui.R;
|
||||
import com.android.systemui.animation.ActivityLaunchAnimator;
|
||||
@@ -120,7 +121,8 @@ public class QuickAccessWalletTile extends QSTileImpl<QSTile.State> {
|
||||
@Override
|
||||
protected void handleClick(@Nullable View view) {
|
||||
ActivityLaunchAnimator.Controller animationController =
|
||||
view == null ? null : ActivityLaunchAnimator.Controller.fromView(view);
|
||||
view == null ? null : ActivityLaunchAnimator.Controller.fromView(view,
|
||||
InteractionJankMonitor.CUJ_SHADE_APP_LAUNCH_FROM_QS_TILE);
|
||||
|
||||
mUiHandler.post(() -> {
|
||||
if (mSelectedCard != null) {
|
||||
|
||||
@@ -41,6 +41,7 @@ import android.text.TextUtils;
|
||||
import android.util.EventLog;
|
||||
import android.view.View;
|
||||
|
||||
import com.android.internal.jank.InteractionJankMonitor;
|
||||
import com.android.internal.logging.MetricsLogger;
|
||||
import com.android.internal.statusbar.NotificationVisibility;
|
||||
import com.android.internal.widget.LockPatternUtils;
|
||||
@@ -508,9 +509,12 @@ public class StatusBarNotificationActivityStarter implements NotificationActivit
|
||||
tsb.addNextIntent(intent);
|
||||
}
|
||||
|
||||
ActivityLaunchAnimator.Controller viewController =
|
||||
ActivityLaunchAnimator.Controller.fromView(view,
|
||||
InteractionJankMonitor.CUJ_SHADE_APP_LAUNCH_FROM_HISTORY_BUTTON
|
||||
);
|
||||
ActivityLaunchAnimator.Controller animationController =
|
||||
new StatusBarLaunchAnimatorController(
|
||||
ActivityLaunchAnimator.Controller.fromView(view), mStatusBar,
|
||||
new StatusBarLaunchAnimatorController(viewController, mStatusBar,
|
||||
true /* isActivityIntent */);
|
||||
|
||||
mActivityLaunchAnimator.startIntentWithAnimation(animationController, animate,
|
||||
|
||||
@@ -25,6 +25,7 @@ import android.content.Intent
|
||||
import android.util.Log
|
||||
import android.view.View
|
||||
import android.widget.Chronometer
|
||||
import com.android.internal.jank.InteractionJankMonitor
|
||||
import com.android.systemui.R
|
||||
import com.android.systemui.animation.ActivityLaunchAnimator
|
||||
import com.android.systemui.dagger.SysUISingleton
|
||||
@@ -179,7 +180,10 @@ class OngoingCallController @Inject constructor(
|
||||
logger.logChipClicked()
|
||||
activityStarter.postStartActivityDismissingKeyguard(
|
||||
currentCallNotificationInfo.intent, 0,
|
||||
ActivityLaunchAnimator.Controller.fromView(backgroundView))
|
||||
ActivityLaunchAnimator.Controller.fromView(
|
||||
backgroundView,
|
||||
InteractionJankMonitor.CUJ_STATUS_BAR_APP_LAUNCH_FROM_CALL_CHIP)
|
||||
)
|
||||
}
|
||||
|
||||
setUpUidObserver(currentCallNotificationInfo)
|
||||
|
||||
Reference in New Issue
Block a user