diff --git a/core/java/com/android/internal/util/LatencyTracker.java b/core/java/com/android/internal/util/LatencyTracker.java index 61a5014177a38..358e6ef874297 100644 --- a/core/java/com/android/internal/util/LatencyTracker.java +++ b/core/java/com/android/internal/util/LatencyTracker.java @@ -100,6 +100,11 @@ public class LatencyTracker { */ public static final int ACTION_ROTATE_SCREEN_SENSOR = 9; + /** + * Time it takes to for the camera based algorithm to rotate the screen. + */ + public static final int ACTION_ROTATE_SCREEN_CAMERA_CHECK = 10; + private static final int[] ACTIONS_ALL = { ACTION_EXPAND_PANEL, ACTION_TOGGLE_RECENTS, @@ -110,7 +115,8 @@ public class LatencyTracker { ACTION_ROTATE_SCREEN, ACTION_FACE_WAKE_AND_UNLOCK, ACTION_START_RECENTS_ANIMATION, - ACTION_ROTATE_SCREEN_SENSOR + ACTION_ROTATE_SCREEN_SENSOR, + ACTION_ROTATE_SCREEN_CAMERA_CHECK }; /** @hide */ @@ -124,7 +130,8 @@ public class LatencyTracker { ACTION_ROTATE_SCREEN, ACTION_FACE_WAKE_AND_UNLOCK, ACTION_START_RECENTS_ANIMATION, - ACTION_ROTATE_SCREEN_SENSOR + ACTION_ROTATE_SCREEN_SENSOR, + ACTION_ROTATE_SCREEN_CAMERA_CHECK }) @Retention(RetentionPolicy.SOURCE) public @interface Action { @@ -140,7 +147,8 @@ public class LatencyTracker { FrameworkStatsLog.UIACTION_LATENCY_REPORTED__ACTION__ACTION_ROTATE_SCREEN, FrameworkStatsLog.UIACTION_LATENCY_REPORTED__ACTION__ACTION_FACE_WAKE_AND_UNLOCK, FrameworkStatsLog.UIACTION_LATENCY_REPORTED__ACTION__ACTION_START_RECENTS_ANIMATION, - FrameworkStatsLog.UIACTION_LATENCY_REPORTED__ACTION__ACTION_ROTATE_SCREEN_SENSOR + FrameworkStatsLog.UIACTION_LATENCY_REPORTED__ACTION__ACTION_ROTATE_SCREEN_SENSOR, + FrameworkStatsLog.UIACTION_LATENCY_REPORTED__ACTION__ACTION_ROTATE_SCREEN_CAMERA_CHECK }; private static LatencyTracker sLatencyTracker; @@ -217,6 +225,8 @@ public class LatencyTracker { return "ACTION_FACE_WAKE_AND_UNLOCK"; case 9: return "ACTION_START_RECENTS_ANIMATION"; + case 10: + return "ACTION_ROTATE_SCREEN_CAMERA_CHECK"; case 11: return "ACTION_ROTATE_SCREEN_SENSOR"; default: diff --git a/services/core/java/com/android/server/rotationresolver/RotationResolverManagerPerUserService.java b/services/core/java/com/android/server/rotationresolver/RotationResolverManagerPerUserService.java index 81bf29b196045..ccf096ee55292 100644 --- a/services/core/java/com/android/server/rotationresolver/RotationResolverManagerPerUserService.java +++ b/services/core/java/com/android/server/rotationresolver/RotationResolverManagerPerUserService.java @@ -18,6 +18,7 @@ package com.android.server.rotationresolver; import static android.service.rotationresolver.RotationResolverService.ROTATION_RESULT_FAILURE_CANCELLED; +import static com.android.internal.util.LatencyTracker.ACTION_ROTATE_SCREEN_CAMERA_CHECK; import static com.android.server.rotationresolver.RotationResolverManagerService.RESOLUTION_UNAVAILABLE; import static com.android.server.rotationresolver.RotationResolverManagerService.logRotationStats; @@ -38,6 +39,7 @@ import android.util.Slog; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; +import com.android.internal.util.LatencyTracker; import com.android.server.infra.AbstractPerUserSystemService; /** @@ -62,10 +64,13 @@ final class RotationResolverManagerPerUserService extends RemoteRotationResolverService mRemoteService; private ComponentName mComponentName; + @GuardedBy("mLock") + private LatencyTracker mLatencyTracker; RotationResolverManagerPerUserService(@NonNull RotationResolverManagerService main, @NonNull Object lock, @UserIdInt int userId) { super(main, lock, userId); + mLatencyTracker = LatencyTracker.getInstance(getContext()); } @GuardedBy("mLock") @@ -108,7 +113,33 @@ final class RotationResolverManagerPerUserService extends cancelLocked(); } - mCurrentRequest = new RemoteRotationResolverService.RotationRequest(callbackInternal, + synchronized (mLock) { + mLatencyTracker.onActionStart(ACTION_ROTATE_SCREEN_CAMERA_CHECK); + } + /** Need to wrap RotationResolverCallbackInternal since there was no other way to hook + into the success/failure callback **/ + final RotationResolverInternal.RotationResolverCallbackInternal wrapper = + new RotationResolverInternal.RotationResolverCallbackInternal() { + + @Override + public void onSuccess(int result) { + synchronized (mLock) { + mLatencyTracker + .onActionEnd(ACTION_ROTATE_SCREEN_CAMERA_CHECK); + } + callbackInternal.onSuccess(result); + } + + @Override + public void onFailure(int error) { + synchronized (mLock) { + mLatencyTracker + .onActionEnd(ACTION_ROTATE_SCREEN_CAMERA_CHECK); + } + callbackInternal.onFailure(error); + } + }; + mCurrentRequest = new RemoteRotationResolverService.RotationRequest(wrapper, request, cancellationSignalInternal); cancellationSignalInternal.setOnCancelListener(() -> {