Loading core/java/com/android/internal/util/LatencyTracker.java +11 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ import static android.content.pm.PackageManager.PERMISSION_GRANTED; import static android.os.Trace.TRACE_TAG_APP; import static android.provider.DeviceConfig.NAMESPACE_LATENCY_TRACKER; import static com.android.internal.util.FrameworkStatsLog.UIACTION_LATENCY_REPORTED__ACTION__ACTION_BACK_SYSTEM_ANIMATION; import static com.android.internal.util.FrameworkStatsLog.UIACTION_LATENCY_REPORTED__ACTION__ACTION_CHECK_CREDENTIAL; import static com.android.internal.util.FrameworkStatsLog.UIACTION_LATENCY_REPORTED__ACTION__ACTION_CHECK_CREDENTIAL_UNLOCKED; import static com.android.internal.util.FrameworkStatsLog.UIACTION_LATENCY_REPORTED__ACTION__ACTION_EXPAND_PANEL; Loading Loading @@ -228,6 +229,11 @@ public class LatencyTracker { */ public static final int ACTION_KEYGUARD_FPS_UNLOCK_TO_HOME = 24; /** * Time it takes to start back preview surface animation after a back gesture starts. */ public static final int ACTION_BACK_SYSTEM_ANIMATION = 25; private static final int[] ACTIONS_ALL = { ACTION_EXPAND_PANEL, ACTION_TOGGLE_RECENTS, Loading @@ -254,6 +260,7 @@ public class LatencyTracker { ACTION_SMARTSPACE_DOORBELL, ACTION_NOTIFICATION_BIG_PICTURE_LOADED, ACTION_KEYGUARD_FPS_UNLOCK_TO_HOME, ACTION_BACK_SYSTEM_ANIMATION, }; /** @hide */ Loading Loading @@ -283,6 +290,7 @@ public class LatencyTracker { ACTION_SMARTSPACE_DOORBELL, ACTION_NOTIFICATION_BIG_PICTURE_LOADED, ACTION_KEYGUARD_FPS_UNLOCK_TO_HOME, ACTION_BACK_SYSTEM_ANIMATION, }) @Retention(RetentionPolicy.SOURCE) public @interface Action { Loading Loading @@ -315,6 +323,7 @@ public class LatencyTracker { UIACTION_LATENCY_REPORTED__ACTION__ACTION_SMARTSPACE_DOORBELL, UIACTION_LATENCY_REPORTED__ACTION__ACTION_NOTIFICATION_BIG_PICTURE_LOADED, UIACTION_LATENCY_REPORTED__ACTION__ACTION_KEYGUARD_FPS_UNLOCK_TO_HOME, UIACTION_LATENCY_REPORTED__ACTION__ACTION_BACK_SYSTEM_ANIMATION, }; private final Object mLock = new Object(); Loading Loading @@ -503,6 +512,8 @@ public class LatencyTracker { return "ACTION_NOTIFICATION_BIG_PICTURE_LOADED"; case UIACTION_LATENCY_REPORTED__ACTION__ACTION_KEYGUARD_FPS_UNLOCK_TO_HOME: return "ACTION_KEYGUARD_FPS_UNLOCK_TO_HOME"; case UIACTION_LATENCY_REPORTED__ACTION__ACTION_BACK_SYSTEM_ANIMATION: return "ACTION_BACK_SYSTEM_ANIMATION"; default: throw new IllegalArgumentException("Invalid action"); } Loading libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationController.java +33 −0 Original line number Diff line number Diff line Loading @@ -61,6 +61,7 @@ import android.window.IOnBackInvokedCallback; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.protolog.common.ProtoLog; import com.android.internal.util.LatencyTracker; import com.android.internal.view.AppearanceRegion; import com.android.wm.shell.animation.FlingAnimationUtils; import com.android.wm.shell.common.ExternalInterfaceBinder; Loading Loading @@ -99,6 +100,7 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont * Max duration to wait for an animation to finish before triggering the real back. */ private static final long MAX_ANIMATION_DURATION = 2000; private final LatencyTracker mLatencyTracker; /** True when a back gesture is ongoing */ private boolean mBackGestureStarted = false; Loading Loading @@ -167,6 +169,7 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont private final BackAnimationBackground mAnimationBackground; private StatusBarCustomizer mCustomizer; private boolean mTrackingLatency; public BackAnimationController( @NonNull ShellInit shellInit, Loading Loading @@ -213,6 +216,7 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont .setSpeedUpFactor(FLING_SPEED_UP_FACTOR) .build(); mShellBackAnimationRegistry = shellBackAnimationRegistry; mLatencyTracker = LatencyTracker.getInstance(mContext); } private void onInit() { Loading Loading @@ -438,6 +442,7 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont private void startBackNavigation(@NonNull TouchTracker touchTracker) { try { startLatencyTracking(); mBackNavigationInfo = mActivityTaskManager.startBackNavigation( mNavigationObserver, mEnableAnimations.get() ? mBackAnimationAdapter : null); onBackNavigationInfoReceived(mBackNavigationInfo, touchTracker); Loading @@ -452,6 +457,7 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont ProtoLog.d(WM_SHELL_BACK_PREVIEW, "Received backNavigationInfo:%s", backNavigationInfo); if (backNavigationInfo == null) { ProtoLog.e(WM_SHELL_BACK_PREVIEW, "Received BackNavigationInfo is null."); cancelLatencyTracking(); return; } final int backType = backNavigationInfo.getType(); Loading @@ -462,6 +468,8 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont } } else { mActiveCallback = mBackNavigationInfo.getOnBackInvokedCallback(); // App is handling back animation. Cancel system animation latency tracking. cancelLatencyTracking(); dispatchOnBackStarted(mActiveCallback, touchTracker.createStartEvent(null)); } } Loading Loading @@ -808,12 +816,36 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont ProtoLog.d(WM_SHELL_BACK_PREVIEW, "BackAnimationController: finishBackNavigation()"); mActiveCallback = null; mShellBackAnimationRegistry.resetDefaultCrossActivity(); cancelLatencyTracking(); if (mBackNavigationInfo != null) { mBackNavigationInfo.onBackNavigationFinished(triggerBack); mBackNavigationInfo = null; } } private void startLatencyTracking() { if (mTrackingLatency) { cancelLatencyTracking(); } mLatencyTracker.onActionStart(LatencyTracker.ACTION_BACK_SYSTEM_ANIMATION); mTrackingLatency = true; } private void cancelLatencyTracking() { if (!mTrackingLatency) { return; } mLatencyTracker.onActionCancel(LatencyTracker.ACTION_BACK_SYSTEM_ANIMATION); mTrackingLatency = false; } private void endLatencyTracking() { if (!mTrackingLatency) { return; } mLatencyTracker.onActionEnd(LatencyTracker.ACTION_BACK_SYSTEM_ANIMATION); mTrackingLatency = false; } private void createAdapter() { IBackAnimationRunner runner = Loading @@ -826,6 +858,7 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont IBackAnimationFinishedCallback finishedCallback) { mShellExecutor.execute( () -> { endLatencyTracking(); if (mBackNavigationInfo == null) { ProtoLog.e(WM_SHELL_BACK_PREVIEW, "Lack of navigation info to start animation."); Loading Loading
core/java/com/android/internal/util/LatencyTracker.java +11 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ import static android.content.pm.PackageManager.PERMISSION_GRANTED; import static android.os.Trace.TRACE_TAG_APP; import static android.provider.DeviceConfig.NAMESPACE_LATENCY_TRACKER; import static com.android.internal.util.FrameworkStatsLog.UIACTION_LATENCY_REPORTED__ACTION__ACTION_BACK_SYSTEM_ANIMATION; import static com.android.internal.util.FrameworkStatsLog.UIACTION_LATENCY_REPORTED__ACTION__ACTION_CHECK_CREDENTIAL; import static com.android.internal.util.FrameworkStatsLog.UIACTION_LATENCY_REPORTED__ACTION__ACTION_CHECK_CREDENTIAL_UNLOCKED; import static com.android.internal.util.FrameworkStatsLog.UIACTION_LATENCY_REPORTED__ACTION__ACTION_EXPAND_PANEL; Loading Loading @@ -228,6 +229,11 @@ public class LatencyTracker { */ public static final int ACTION_KEYGUARD_FPS_UNLOCK_TO_HOME = 24; /** * Time it takes to start back preview surface animation after a back gesture starts. */ public static final int ACTION_BACK_SYSTEM_ANIMATION = 25; private static final int[] ACTIONS_ALL = { ACTION_EXPAND_PANEL, ACTION_TOGGLE_RECENTS, Loading @@ -254,6 +260,7 @@ public class LatencyTracker { ACTION_SMARTSPACE_DOORBELL, ACTION_NOTIFICATION_BIG_PICTURE_LOADED, ACTION_KEYGUARD_FPS_UNLOCK_TO_HOME, ACTION_BACK_SYSTEM_ANIMATION, }; /** @hide */ Loading Loading @@ -283,6 +290,7 @@ public class LatencyTracker { ACTION_SMARTSPACE_DOORBELL, ACTION_NOTIFICATION_BIG_PICTURE_LOADED, ACTION_KEYGUARD_FPS_UNLOCK_TO_HOME, ACTION_BACK_SYSTEM_ANIMATION, }) @Retention(RetentionPolicy.SOURCE) public @interface Action { Loading Loading @@ -315,6 +323,7 @@ public class LatencyTracker { UIACTION_LATENCY_REPORTED__ACTION__ACTION_SMARTSPACE_DOORBELL, UIACTION_LATENCY_REPORTED__ACTION__ACTION_NOTIFICATION_BIG_PICTURE_LOADED, UIACTION_LATENCY_REPORTED__ACTION__ACTION_KEYGUARD_FPS_UNLOCK_TO_HOME, UIACTION_LATENCY_REPORTED__ACTION__ACTION_BACK_SYSTEM_ANIMATION, }; private final Object mLock = new Object(); Loading Loading @@ -503,6 +512,8 @@ public class LatencyTracker { return "ACTION_NOTIFICATION_BIG_PICTURE_LOADED"; case UIACTION_LATENCY_REPORTED__ACTION__ACTION_KEYGUARD_FPS_UNLOCK_TO_HOME: return "ACTION_KEYGUARD_FPS_UNLOCK_TO_HOME"; case UIACTION_LATENCY_REPORTED__ACTION__ACTION_BACK_SYSTEM_ANIMATION: return "ACTION_BACK_SYSTEM_ANIMATION"; default: throw new IllegalArgumentException("Invalid action"); } Loading
libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationController.java +33 −0 Original line number Diff line number Diff line Loading @@ -61,6 +61,7 @@ import android.window.IOnBackInvokedCallback; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.protolog.common.ProtoLog; import com.android.internal.util.LatencyTracker; import com.android.internal.view.AppearanceRegion; import com.android.wm.shell.animation.FlingAnimationUtils; import com.android.wm.shell.common.ExternalInterfaceBinder; Loading Loading @@ -99,6 +100,7 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont * Max duration to wait for an animation to finish before triggering the real back. */ private static final long MAX_ANIMATION_DURATION = 2000; private final LatencyTracker mLatencyTracker; /** True when a back gesture is ongoing */ private boolean mBackGestureStarted = false; Loading Loading @@ -167,6 +169,7 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont private final BackAnimationBackground mAnimationBackground; private StatusBarCustomizer mCustomizer; private boolean mTrackingLatency; public BackAnimationController( @NonNull ShellInit shellInit, Loading Loading @@ -213,6 +216,7 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont .setSpeedUpFactor(FLING_SPEED_UP_FACTOR) .build(); mShellBackAnimationRegistry = shellBackAnimationRegistry; mLatencyTracker = LatencyTracker.getInstance(mContext); } private void onInit() { Loading Loading @@ -438,6 +442,7 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont private void startBackNavigation(@NonNull TouchTracker touchTracker) { try { startLatencyTracking(); mBackNavigationInfo = mActivityTaskManager.startBackNavigation( mNavigationObserver, mEnableAnimations.get() ? mBackAnimationAdapter : null); onBackNavigationInfoReceived(mBackNavigationInfo, touchTracker); Loading @@ -452,6 +457,7 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont ProtoLog.d(WM_SHELL_BACK_PREVIEW, "Received backNavigationInfo:%s", backNavigationInfo); if (backNavigationInfo == null) { ProtoLog.e(WM_SHELL_BACK_PREVIEW, "Received BackNavigationInfo is null."); cancelLatencyTracking(); return; } final int backType = backNavigationInfo.getType(); Loading @@ -462,6 +468,8 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont } } else { mActiveCallback = mBackNavigationInfo.getOnBackInvokedCallback(); // App is handling back animation. Cancel system animation latency tracking. cancelLatencyTracking(); dispatchOnBackStarted(mActiveCallback, touchTracker.createStartEvent(null)); } } Loading Loading @@ -808,12 +816,36 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont ProtoLog.d(WM_SHELL_BACK_PREVIEW, "BackAnimationController: finishBackNavigation()"); mActiveCallback = null; mShellBackAnimationRegistry.resetDefaultCrossActivity(); cancelLatencyTracking(); if (mBackNavigationInfo != null) { mBackNavigationInfo.onBackNavigationFinished(triggerBack); mBackNavigationInfo = null; } } private void startLatencyTracking() { if (mTrackingLatency) { cancelLatencyTracking(); } mLatencyTracker.onActionStart(LatencyTracker.ACTION_BACK_SYSTEM_ANIMATION); mTrackingLatency = true; } private void cancelLatencyTracking() { if (!mTrackingLatency) { return; } mLatencyTracker.onActionCancel(LatencyTracker.ACTION_BACK_SYSTEM_ANIMATION); mTrackingLatency = false; } private void endLatencyTracking() { if (!mTrackingLatency) { return; } mLatencyTracker.onActionEnd(LatencyTracker.ACTION_BACK_SYSTEM_ANIMATION); mTrackingLatency = false; } private void createAdapter() { IBackAnimationRunner runner = Loading @@ -826,6 +858,7 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont IBackAnimationFinishedCallback finishedCallback) { mShellExecutor.execute( () -> { endLatencyTracking(); if (mBackNavigationInfo == null) { ProtoLog.e(WM_SHELL_BACK_PREVIEW, "Lack of navigation info to start animation."); Loading