Loading services/core/java/com/android/server/wm/ActivityMetricsLogger.java +52 −5 Original line number Diff line number Diff line Loading @@ -56,6 +56,10 @@ import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.TYPE_T import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.TYPE_TRANSITION_REPORTED_DRAWN_NO_BUNDLE; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.TYPE_TRANSITION_REPORTED_DRAWN_WITH_BUNDLE; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.TYPE_TRANSITION_WARM_LAUNCH; import static com.android.internal.util.FrameworkStatsLog.APP_COMPAT_STATE_CHANGED__LETTERBOX_POSITION__NOT_LETTERBOXED_POSITION; import static com.android.internal.util.FrameworkStatsLog.APP_COMPAT_STATE_CHANGED__STATE__LETTERBOXED_FOR_ASPECT_RATIO; import static com.android.internal.util.FrameworkStatsLog.APP_COMPAT_STATE_CHANGED__STATE__LETTERBOXED_FOR_FIXED_ORIENTATION; import static com.android.internal.util.FrameworkStatsLog.APP_COMPAT_STATE_CHANGED__STATE__LETTERBOXED_FOR_SIZE_COMPAT_MODE; import static com.android.internal.util.FrameworkStatsLog.APP_COMPAT_STATE_CHANGED__STATE__NOT_LETTERBOXED; import static com.android.internal.util.FrameworkStatsLog.APP_COMPAT_STATE_CHANGED__STATE__NOT_VISIBLE; import static com.android.internal.util.FrameworkStatsLog.CAMERA_COMPAT_CONTROL_EVENT_REPORTED__EVENT__APPEARED_APPLY_TREATMENT; Loading Loading @@ -1376,7 +1380,7 @@ class ActivityMetricsLogger { return; } logAppCompatStateInternal(activity, state, packageUid, compatStateInfo); logAppCompatStateInternal(activity, state, compatStateInfo); } /** Loading Loading @@ -1416,18 +1420,61 @@ class ActivityMetricsLogger { } } if (activityToLog != null && stateToLog != APP_COMPAT_STATE_CHANGED__STATE__NOT_VISIBLE) { logAppCompatStateInternal(activityToLog, stateToLog, packageUid, compatStateInfo); logAppCompatStateInternal(activityToLog, stateToLog, compatStateInfo); } } private static boolean isAppCompateStateChangedToLetterboxed(int state) { return state == APP_COMPAT_STATE_CHANGED__STATE__LETTERBOXED_FOR_ASPECT_RATIO || state == APP_COMPAT_STATE_CHANGED__STATE__LETTERBOXED_FOR_FIXED_ORIENTATION || state == APP_COMPAT_STATE_CHANGED__STATE__LETTERBOXED_FOR_SIZE_COMPAT_MODE; } private void logAppCompatStateInternal(@NonNull ActivityRecord activity, int state, int packageUid, PackageCompatStateInfo compatStateInfo) { PackageCompatStateInfo compatStateInfo) { compatStateInfo.mLastLoggedState = state; compatStateInfo.mLastLoggedActivity = activity; FrameworkStatsLog.write(FrameworkStatsLog.APP_COMPAT_STATE_CHANGED, packageUid, state); int packageUid = activity.info.applicationInfo.uid; int positionToLog = APP_COMPAT_STATE_CHANGED__LETTERBOX_POSITION__NOT_LETTERBOXED_POSITION; if (isAppCompateStateChangedToLetterboxed(state)) { positionToLog = activity.mLetterboxUiController.getLetterboxPositionForLogging(); } FrameworkStatsLog.write(FrameworkStatsLog.APP_COMPAT_STATE_CHANGED, packageUid, state, positionToLog); if (DEBUG_METRICS) { Slog.i(TAG, String.format("APP_COMPAT_STATE_CHANGED(%s, %s, %s)", packageUid, state, positionToLog)); } } /** * Logs the changing of the letterbox position along with its package UID */ void logLetterboxPositionChange(@NonNull ActivityRecord activity, int position) { int packageUid = activity.info.applicationInfo.uid; FrameworkStatsLog.write(FrameworkStatsLog.LETTERBOX_POSITION_CHANGED, packageUid, position); if (!mPackageUidToCompatStateInfo.contains(packageUid)) { // There is no last logged activity for this packageUid so we should not log the // position change as we can only log the position change for the current activity return; } final PackageCompatStateInfo compatStateInfo = mPackageUidToCompatStateInfo.get(packageUid); final ActivityRecord lastLoggedActivity = compatStateInfo.mLastLoggedActivity; if (activity != lastLoggedActivity) { // Only log the position change for the current activity to be consistent with // findAppCompatStateToLog and ensure that metrics for the state changes are computed // correctly return; } int state = activity.getAppCompatState(); logAppCompatStateInternal(activity, state, compatStateInfo); if (DEBUG_METRICS) { Slog.i(TAG, String.format("APP_COMPAT_STATE_CHANGED(%s, %s)", packageUid, state)); Slog.i(TAG, String.format("LETTERBOX_POSITION_CHANGED(%s, %s)", packageUid, position)); } } Loading services/core/java/com/android/server/wm/LetterboxConfiguration.java +18 −0 Original line number Diff line number Diff line Loading @@ -687,6 +687,24 @@ final class LetterboxConfiguration { } } /* * Gets the horizontal position of the letterboxed app window when horizontal reachability is * enabled. */ @LetterboxHorizontalReachabilityPosition int getLetterboxPositionForHorizontalReachability() { return mLetterboxPositionForHorizontalReachability; } /* * Gets the vertical position of the letterboxed app window when vertical reachability is * enabled. */ @LetterboxVerticalReachabilityPosition int getLetterboxPositionForVerticalReachability() { return mLetterboxPositionForVerticalReachability; } /** Returns a string representing the given {@link LetterboxHorizontalReachabilityPosition}. */ static String letterboxHorizontalReachabilityPositionToString( @LetterboxHorizontalReachabilityPosition int position) { Loading services/core/java/com/android/server/wm/LetterboxUiController.java +107 −1 Original line number Diff line number Diff line Loading @@ -21,6 +21,20 @@ import static android.content.res.Configuration.ORIENTATION_LANDSCAPE; import static android.content.res.Configuration.ORIENTATION_PORTRAIT; import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER; import static com.android.internal.util.FrameworkStatsLog.APP_COMPAT_STATE_CHANGED__LETTERBOX_POSITION__BOTTOM; import static com.android.internal.util.FrameworkStatsLog.APP_COMPAT_STATE_CHANGED__LETTERBOX_POSITION__CENTER; import static com.android.internal.util.FrameworkStatsLog.APP_COMPAT_STATE_CHANGED__LETTERBOX_POSITION__LEFT; import static com.android.internal.util.FrameworkStatsLog.APP_COMPAT_STATE_CHANGED__LETTERBOX_POSITION__RIGHT; import static com.android.internal.util.FrameworkStatsLog.APP_COMPAT_STATE_CHANGED__LETTERBOX_POSITION__TOP; import static com.android.internal.util.FrameworkStatsLog.APP_COMPAT_STATE_CHANGED__LETTERBOX_POSITION__UNKNOWN_POSITION; import static com.android.internal.util.FrameworkStatsLog.LETTERBOX_POSITION_CHANGED__POSITION_CHANGE__BOTTOM_TO_CENTER; import static com.android.internal.util.FrameworkStatsLog.LETTERBOX_POSITION_CHANGED__POSITION_CHANGE__CENTER_TO_BOTTOM; import static com.android.internal.util.FrameworkStatsLog.LETTERBOX_POSITION_CHANGED__POSITION_CHANGE__CENTER_TO_LEFT; import static com.android.internal.util.FrameworkStatsLog.LETTERBOX_POSITION_CHANGED__POSITION_CHANGE__CENTER_TO_RIGHT; import static com.android.internal.util.FrameworkStatsLog.LETTERBOX_POSITION_CHANGED__POSITION_CHANGE__CENTER_TO_TOP; import static com.android.internal.util.FrameworkStatsLog.LETTERBOX_POSITION_CHANGED__POSITION_CHANGE__LEFT_TO_CENTER; import static com.android.internal.util.FrameworkStatsLog.LETTERBOX_POSITION_CHANGED__POSITION_CHANGE__RIGHT_TO_CENTER; import static com.android.internal.util.FrameworkStatsLog.LETTERBOX_POSITION_CHANGED__POSITION_CHANGE__TOP_TO_CENTER; import static com.android.server.wm.ActivityRecord.computeAspectRatio; import static com.android.server.wm.ActivityTaskManagerDebugConfig.TAG_ATM; import static com.android.server.wm.ActivityTaskManagerDebugConfig.TAG_WITH_CLASS_NAME; Loading @@ -28,6 +42,12 @@ import static com.android.server.wm.LetterboxConfiguration.LETTERBOX_BACKGROUND_ import static com.android.server.wm.LetterboxConfiguration.LETTERBOX_BACKGROUND_APP_COLOR_BACKGROUND_FLOATING; import static com.android.server.wm.LetterboxConfiguration.LETTERBOX_BACKGROUND_SOLID_COLOR; import static com.android.server.wm.LetterboxConfiguration.LETTERBOX_BACKGROUND_WALLPAPER; import static com.android.server.wm.LetterboxConfiguration.LETTERBOX_HORIZONTAL_REACHABILITY_POSITION_CENTER; import static com.android.server.wm.LetterboxConfiguration.LETTERBOX_HORIZONTAL_REACHABILITY_POSITION_LEFT; import static com.android.server.wm.LetterboxConfiguration.LETTERBOX_HORIZONTAL_REACHABILITY_POSITION_RIGHT; import static com.android.server.wm.LetterboxConfiguration.LETTERBOX_VERTICAL_REACHABILITY_POSITION_BOTTOM; import static com.android.server.wm.LetterboxConfiguration.LETTERBOX_VERTICAL_REACHABILITY_POSITION_CENTER; import static com.android.server.wm.LetterboxConfiguration.LETTERBOX_VERTICAL_REACHABILITY_POSITION_TOP; import static com.android.server.wm.LetterboxConfiguration.MIN_FIXED_ORIENTATION_LETTERBOX_ASPECT_RATIO; import static com.android.server.wm.LetterboxConfiguration.letterboxBackgroundTypeToString; Loading Loading @@ -259,12 +279,26 @@ final class LetterboxUiController { return; } int letterboxPositionForHorizontalReachability = mLetterboxConfiguration .getLetterboxPositionForHorizontalReachability(); if (mLetterbox.getInnerFrame().left > x) { // Moving to the next stop on the left side of the app window: right > center > left. mLetterboxConfiguration.movePositionForHorizontalReachabilityToNextLeftStop(); int changeToLog = letterboxPositionForHorizontalReachability == LETTERBOX_HORIZONTAL_REACHABILITY_POSITION_CENTER ? LETTERBOX_POSITION_CHANGED__POSITION_CHANGE__CENTER_TO_LEFT : LETTERBOX_POSITION_CHANGED__POSITION_CHANGE__RIGHT_TO_CENTER; logLetterboxPositionChange(changeToLog); } else if (mLetterbox.getInnerFrame().right < x) { // Moving to the next stop on the right side of the app window: left > center > right. mLetterboxConfiguration.movePositionForHorizontalReachabilityToNextRightStop(); int changeToLog = letterboxPositionForHorizontalReachability == LETTERBOX_HORIZONTAL_REACHABILITY_POSITION_CENTER ? LETTERBOX_POSITION_CHANGED__POSITION_CHANGE__CENTER_TO_RIGHT : LETTERBOX_POSITION_CHANGED__POSITION_CHANGE__LEFT_TO_CENTER; logLetterboxPositionChange(changeToLog); } // TODO(197549949): Add animation for transition. Loading @@ -280,13 +314,26 @@ final class LetterboxUiController { // Only react to clicks at the top and bottom of the letterboxed app window. return; } int letterboxPositionForVerticalReachability = mLetterboxConfiguration .getLetterboxPositionForVerticalReachability(); if (mLetterbox.getInnerFrame().top > y) { // Moving to the next stop on the top side of the app window: bottom > center > top. mLetterboxConfiguration.movePositionForVerticalReachabilityToNextTopStop(); int changeToLog = letterboxPositionForVerticalReachability == LETTERBOX_VERTICAL_REACHABILITY_POSITION_CENTER ? LETTERBOX_POSITION_CHANGED__POSITION_CHANGE__CENTER_TO_TOP : LETTERBOX_POSITION_CHANGED__POSITION_CHANGE__BOTTOM_TO_CENTER; logLetterboxPositionChange(changeToLog); } else if (mLetterbox.getInnerFrame().bottom < y) { // Moving to the next stop on the bottom side of the app window: top > center > bottom. mLetterboxConfiguration.movePositionForVerticalReachabilityToNextBottomStop(); int changeToLog = letterboxPositionForVerticalReachability == LETTERBOX_VERTICAL_REACHABILITY_POSITION_CENTER ? LETTERBOX_POSITION_CHANGED__POSITION_CHANGE__CENTER_TO_BOTTOM : LETTERBOX_POSITION_CHANGED__POSITION_CHANGE__TOP_TO_CENTER; logLetterboxPositionChange(changeToLog); } // TODO(197549949): Add animation for transition. Loading Loading @@ -577,4 +624,63 @@ final class LetterboxUiController { return "UNKNOWN_REASON"; } private int letterboxHorizontalReachabilityPositionToLetterboxPosition( @LetterboxConfiguration.LetterboxHorizontalReachabilityPosition int position) { switch (position) { case LETTERBOX_HORIZONTAL_REACHABILITY_POSITION_LEFT: return APP_COMPAT_STATE_CHANGED__LETTERBOX_POSITION__LEFT; case LETTERBOX_HORIZONTAL_REACHABILITY_POSITION_CENTER: return APP_COMPAT_STATE_CHANGED__LETTERBOX_POSITION__CENTER; case LETTERBOX_HORIZONTAL_REACHABILITY_POSITION_RIGHT: return APP_COMPAT_STATE_CHANGED__LETTERBOX_POSITION__RIGHT; default: throw new AssertionError( "Unexpected letterbox horizontal reachability position type: " + position); } } private int letterboxVerticalReachabilityPositionToLetterboxPosition( @LetterboxConfiguration.LetterboxVerticalReachabilityPosition int position) { switch (position) { case LETTERBOX_VERTICAL_REACHABILITY_POSITION_TOP: return APP_COMPAT_STATE_CHANGED__LETTERBOX_POSITION__TOP; case LETTERBOX_VERTICAL_REACHABILITY_POSITION_CENTER: return APP_COMPAT_STATE_CHANGED__LETTERBOX_POSITION__CENTER; case LETTERBOX_VERTICAL_REACHABILITY_POSITION_BOTTOM: return APP_COMPAT_STATE_CHANGED__LETTERBOX_POSITION__BOTTOM; default: throw new AssertionError( "Unexpected letterbox vertical reachability position type: " + position); } } int getLetterboxPositionForLogging() { int positionToLog = APP_COMPAT_STATE_CHANGED__LETTERBOX_POSITION__UNKNOWN_POSITION; if (isHorizontalReachabilityEnabled()) { int letterboxPositionForHorizontalReachability = getLetterboxConfiguration() .getLetterboxPositionForHorizontalReachability(); positionToLog = letterboxHorizontalReachabilityPositionToLetterboxPosition( letterboxPositionForHorizontalReachability); } else if (isVerticalReachabilityEnabled()) { int letterboxPositionForVerticalReachability = getLetterboxConfiguration() .getLetterboxPositionForVerticalReachability(); positionToLog = letterboxVerticalReachabilityPositionToLetterboxPosition( letterboxPositionForVerticalReachability); } return positionToLog; } private LetterboxConfiguration getLetterboxConfiguration() { return mLetterboxConfiguration; } /** * Logs letterbox position changes via {@link ActivityMetricsLogger#logLetterboxPositionChange}. */ private void logLetterboxPositionChange(int letterboxPositionChange) { mActivityRecord.mTaskSupervisor.getActivityMetricsLogger() .logLetterboxPositionChange(mActivityRecord, letterboxPositionChange); } } Loading
services/core/java/com/android/server/wm/ActivityMetricsLogger.java +52 −5 Original line number Diff line number Diff line Loading @@ -56,6 +56,10 @@ import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.TYPE_T import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.TYPE_TRANSITION_REPORTED_DRAWN_NO_BUNDLE; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.TYPE_TRANSITION_REPORTED_DRAWN_WITH_BUNDLE; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.TYPE_TRANSITION_WARM_LAUNCH; import static com.android.internal.util.FrameworkStatsLog.APP_COMPAT_STATE_CHANGED__LETTERBOX_POSITION__NOT_LETTERBOXED_POSITION; import static com.android.internal.util.FrameworkStatsLog.APP_COMPAT_STATE_CHANGED__STATE__LETTERBOXED_FOR_ASPECT_RATIO; import static com.android.internal.util.FrameworkStatsLog.APP_COMPAT_STATE_CHANGED__STATE__LETTERBOXED_FOR_FIXED_ORIENTATION; import static com.android.internal.util.FrameworkStatsLog.APP_COMPAT_STATE_CHANGED__STATE__LETTERBOXED_FOR_SIZE_COMPAT_MODE; import static com.android.internal.util.FrameworkStatsLog.APP_COMPAT_STATE_CHANGED__STATE__NOT_LETTERBOXED; import static com.android.internal.util.FrameworkStatsLog.APP_COMPAT_STATE_CHANGED__STATE__NOT_VISIBLE; import static com.android.internal.util.FrameworkStatsLog.CAMERA_COMPAT_CONTROL_EVENT_REPORTED__EVENT__APPEARED_APPLY_TREATMENT; Loading Loading @@ -1376,7 +1380,7 @@ class ActivityMetricsLogger { return; } logAppCompatStateInternal(activity, state, packageUid, compatStateInfo); logAppCompatStateInternal(activity, state, compatStateInfo); } /** Loading Loading @@ -1416,18 +1420,61 @@ class ActivityMetricsLogger { } } if (activityToLog != null && stateToLog != APP_COMPAT_STATE_CHANGED__STATE__NOT_VISIBLE) { logAppCompatStateInternal(activityToLog, stateToLog, packageUid, compatStateInfo); logAppCompatStateInternal(activityToLog, stateToLog, compatStateInfo); } } private static boolean isAppCompateStateChangedToLetterboxed(int state) { return state == APP_COMPAT_STATE_CHANGED__STATE__LETTERBOXED_FOR_ASPECT_RATIO || state == APP_COMPAT_STATE_CHANGED__STATE__LETTERBOXED_FOR_FIXED_ORIENTATION || state == APP_COMPAT_STATE_CHANGED__STATE__LETTERBOXED_FOR_SIZE_COMPAT_MODE; } private void logAppCompatStateInternal(@NonNull ActivityRecord activity, int state, int packageUid, PackageCompatStateInfo compatStateInfo) { PackageCompatStateInfo compatStateInfo) { compatStateInfo.mLastLoggedState = state; compatStateInfo.mLastLoggedActivity = activity; FrameworkStatsLog.write(FrameworkStatsLog.APP_COMPAT_STATE_CHANGED, packageUid, state); int packageUid = activity.info.applicationInfo.uid; int positionToLog = APP_COMPAT_STATE_CHANGED__LETTERBOX_POSITION__NOT_LETTERBOXED_POSITION; if (isAppCompateStateChangedToLetterboxed(state)) { positionToLog = activity.mLetterboxUiController.getLetterboxPositionForLogging(); } FrameworkStatsLog.write(FrameworkStatsLog.APP_COMPAT_STATE_CHANGED, packageUid, state, positionToLog); if (DEBUG_METRICS) { Slog.i(TAG, String.format("APP_COMPAT_STATE_CHANGED(%s, %s, %s)", packageUid, state, positionToLog)); } } /** * Logs the changing of the letterbox position along with its package UID */ void logLetterboxPositionChange(@NonNull ActivityRecord activity, int position) { int packageUid = activity.info.applicationInfo.uid; FrameworkStatsLog.write(FrameworkStatsLog.LETTERBOX_POSITION_CHANGED, packageUid, position); if (!mPackageUidToCompatStateInfo.contains(packageUid)) { // There is no last logged activity for this packageUid so we should not log the // position change as we can only log the position change for the current activity return; } final PackageCompatStateInfo compatStateInfo = mPackageUidToCompatStateInfo.get(packageUid); final ActivityRecord lastLoggedActivity = compatStateInfo.mLastLoggedActivity; if (activity != lastLoggedActivity) { // Only log the position change for the current activity to be consistent with // findAppCompatStateToLog and ensure that metrics for the state changes are computed // correctly return; } int state = activity.getAppCompatState(); logAppCompatStateInternal(activity, state, compatStateInfo); if (DEBUG_METRICS) { Slog.i(TAG, String.format("APP_COMPAT_STATE_CHANGED(%s, %s)", packageUid, state)); Slog.i(TAG, String.format("LETTERBOX_POSITION_CHANGED(%s, %s)", packageUid, position)); } } Loading
services/core/java/com/android/server/wm/LetterboxConfiguration.java +18 −0 Original line number Diff line number Diff line Loading @@ -687,6 +687,24 @@ final class LetterboxConfiguration { } } /* * Gets the horizontal position of the letterboxed app window when horizontal reachability is * enabled. */ @LetterboxHorizontalReachabilityPosition int getLetterboxPositionForHorizontalReachability() { return mLetterboxPositionForHorizontalReachability; } /* * Gets the vertical position of the letterboxed app window when vertical reachability is * enabled. */ @LetterboxVerticalReachabilityPosition int getLetterboxPositionForVerticalReachability() { return mLetterboxPositionForVerticalReachability; } /** Returns a string representing the given {@link LetterboxHorizontalReachabilityPosition}. */ static String letterboxHorizontalReachabilityPositionToString( @LetterboxHorizontalReachabilityPosition int position) { Loading
services/core/java/com/android/server/wm/LetterboxUiController.java +107 −1 Original line number Diff line number Diff line Loading @@ -21,6 +21,20 @@ import static android.content.res.Configuration.ORIENTATION_LANDSCAPE; import static android.content.res.Configuration.ORIENTATION_PORTRAIT; import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER; import static com.android.internal.util.FrameworkStatsLog.APP_COMPAT_STATE_CHANGED__LETTERBOX_POSITION__BOTTOM; import static com.android.internal.util.FrameworkStatsLog.APP_COMPAT_STATE_CHANGED__LETTERBOX_POSITION__CENTER; import static com.android.internal.util.FrameworkStatsLog.APP_COMPAT_STATE_CHANGED__LETTERBOX_POSITION__LEFT; import static com.android.internal.util.FrameworkStatsLog.APP_COMPAT_STATE_CHANGED__LETTERBOX_POSITION__RIGHT; import static com.android.internal.util.FrameworkStatsLog.APP_COMPAT_STATE_CHANGED__LETTERBOX_POSITION__TOP; import static com.android.internal.util.FrameworkStatsLog.APP_COMPAT_STATE_CHANGED__LETTERBOX_POSITION__UNKNOWN_POSITION; import static com.android.internal.util.FrameworkStatsLog.LETTERBOX_POSITION_CHANGED__POSITION_CHANGE__BOTTOM_TO_CENTER; import static com.android.internal.util.FrameworkStatsLog.LETTERBOX_POSITION_CHANGED__POSITION_CHANGE__CENTER_TO_BOTTOM; import static com.android.internal.util.FrameworkStatsLog.LETTERBOX_POSITION_CHANGED__POSITION_CHANGE__CENTER_TO_LEFT; import static com.android.internal.util.FrameworkStatsLog.LETTERBOX_POSITION_CHANGED__POSITION_CHANGE__CENTER_TO_RIGHT; import static com.android.internal.util.FrameworkStatsLog.LETTERBOX_POSITION_CHANGED__POSITION_CHANGE__CENTER_TO_TOP; import static com.android.internal.util.FrameworkStatsLog.LETTERBOX_POSITION_CHANGED__POSITION_CHANGE__LEFT_TO_CENTER; import static com.android.internal.util.FrameworkStatsLog.LETTERBOX_POSITION_CHANGED__POSITION_CHANGE__RIGHT_TO_CENTER; import static com.android.internal.util.FrameworkStatsLog.LETTERBOX_POSITION_CHANGED__POSITION_CHANGE__TOP_TO_CENTER; import static com.android.server.wm.ActivityRecord.computeAspectRatio; import static com.android.server.wm.ActivityTaskManagerDebugConfig.TAG_ATM; import static com.android.server.wm.ActivityTaskManagerDebugConfig.TAG_WITH_CLASS_NAME; Loading @@ -28,6 +42,12 @@ import static com.android.server.wm.LetterboxConfiguration.LETTERBOX_BACKGROUND_ import static com.android.server.wm.LetterboxConfiguration.LETTERBOX_BACKGROUND_APP_COLOR_BACKGROUND_FLOATING; import static com.android.server.wm.LetterboxConfiguration.LETTERBOX_BACKGROUND_SOLID_COLOR; import static com.android.server.wm.LetterboxConfiguration.LETTERBOX_BACKGROUND_WALLPAPER; import static com.android.server.wm.LetterboxConfiguration.LETTERBOX_HORIZONTAL_REACHABILITY_POSITION_CENTER; import static com.android.server.wm.LetterboxConfiguration.LETTERBOX_HORIZONTAL_REACHABILITY_POSITION_LEFT; import static com.android.server.wm.LetterboxConfiguration.LETTERBOX_HORIZONTAL_REACHABILITY_POSITION_RIGHT; import static com.android.server.wm.LetterboxConfiguration.LETTERBOX_VERTICAL_REACHABILITY_POSITION_BOTTOM; import static com.android.server.wm.LetterboxConfiguration.LETTERBOX_VERTICAL_REACHABILITY_POSITION_CENTER; import static com.android.server.wm.LetterboxConfiguration.LETTERBOX_VERTICAL_REACHABILITY_POSITION_TOP; import static com.android.server.wm.LetterboxConfiguration.MIN_FIXED_ORIENTATION_LETTERBOX_ASPECT_RATIO; import static com.android.server.wm.LetterboxConfiguration.letterboxBackgroundTypeToString; Loading Loading @@ -259,12 +279,26 @@ final class LetterboxUiController { return; } int letterboxPositionForHorizontalReachability = mLetterboxConfiguration .getLetterboxPositionForHorizontalReachability(); if (mLetterbox.getInnerFrame().left > x) { // Moving to the next stop on the left side of the app window: right > center > left. mLetterboxConfiguration.movePositionForHorizontalReachabilityToNextLeftStop(); int changeToLog = letterboxPositionForHorizontalReachability == LETTERBOX_HORIZONTAL_REACHABILITY_POSITION_CENTER ? LETTERBOX_POSITION_CHANGED__POSITION_CHANGE__CENTER_TO_LEFT : LETTERBOX_POSITION_CHANGED__POSITION_CHANGE__RIGHT_TO_CENTER; logLetterboxPositionChange(changeToLog); } else if (mLetterbox.getInnerFrame().right < x) { // Moving to the next stop on the right side of the app window: left > center > right. mLetterboxConfiguration.movePositionForHorizontalReachabilityToNextRightStop(); int changeToLog = letterboxPositionForHorizontalReachability == LETTERBOX_HORIZONTAL_REACHABILITY_POSITION_CENTER ? LETTERBOX_POSITION_CHANGED__POSITION_CHANGE__CENTER_TO_RIGHT : LETTERBOX_POSITION_CHANGED__POSITION_CHANGE__LEFT_TO_CENTER; logLetterboxPositionChange(changeToLog); } // TODO(197549949): Add animation for transition. Loading @@ -280,13 +314,26 @@ final class LetterboxUiController { // Only react to clicks at the top and bottom of the letterboxed app window. return; } int letterboxPositionForVerticalReachability = mLetterboxConfiguration .getLetterboxPositionForVerticalReachability(); if (mLetterbox.getInnerFrame().top > y) { // Moving to the next stop on the top side of the app window: bottom > center > top. mLetterboxConfiguration.movePositionForVerticalReachabilityToNextTopStop(); int changeToLog = letterboxPositionForVerticalReachability == LETTERBOX_VERTICAL_REACHABILITY_POSITION_CENTER ? LETTERBOX_POSITION_CHANGED__POSITION_CHANGE__CENTER_TO_TOP : LETTERBOX_POSITION_CHANGED__POSITION_CHANGE__BOTTOM_TO_CENTER; logLetterboxPositionChange(changeToLog); } else if (mLetterbox.getInnerFrame().bottom < y) { // Moving to the next stop on the bottom side of the app window: top > center > bottom. mLetterboxConfiguration.movePositionForVerticalReachabilityToNextBottomStop(); int changeToLog = letterboxPositionForVerticalReachability == LETTERBOX_VERTICAL_REACHABILITY_POSITION_CENTER ? LETTERBOX_POSITION_CHANGED__POSITION_CHANGE__CENTER_TO_BOTTOM : LETTERBOX_POSITION_CHANGED__POSITION_CHANGE__TOP_TO_CENTER; logLetterboxPositionChange(changeToLog); } // TODO(197549949): Add animation for transition. Loading Loading @@ -577,4 +624,63 @@ final class LetterboxUiController { return "UNKNOWN_REASON"; } private int letterboxHorizontalReachabilityPositionToLetterboxPosition( @LetterboxConfiguration.LetterboxHorizontalReachabilityPosition int position) { switch (position) { case LETTERBOX_HORIZONTAL_REACHABILITY_POSITION_LEFT: return APP_COMPAT_STATE_CHANGED__LETTERBOX_POSITION__LEFT; case LETTERBOX_HORIZONTAL_REACHABILITY_POSITION_CENTER: return APP_COMPAT_STATE_CHANGED__LETTERBOX_POSITION__CENTER; case LETTERBOX_HORIZONTAL_REACHABILITY_POSITION_RIGHT: return APP_COMPAT_STATE_CHANGED__LETTERBOX_POSITION__RIGHT; default: throw new AssertionError( "Unexpected letterbox horizontal reachability position type: " + position); } } private int letterboxVerticalReachabilityPositionToLetterboxPosition( @LetterboxConfiguration.LetterboxVerticalReachabilityPosition int position) { switch (position) { case LETTERBOX_VERTICAL_REACHABILITY_POSITION_TOP: return APP_COMPAT_STATE_CHANGED__LETTERBOX_POSITION__TOP; case LETTERBOX_VERTICAL_REACHABILITY_POSITION_CENTER: return APP_COMPAT_STATE_CHANGED__LETTERBOX_POSITION__CENTER; case LETTERBOX_VERTICAL_REACHABILITY_POSITION_BOTTOM: return APP_COMPAT_STATE_CHANGED__LETTERBOX_POSITION__BOTTOM; default: throw new AssertionError( "Unexpected letterbox vertical reachability position type: " + position); } } int getLetterboxPositionForLogging() { int positionToLog = APP_COMPAT_STATE_CHANGED__LETTERBOX_POSITION__UNKNOWN_POSITION; if (isHorizontalReachabilityEnabled()) { int letterboxPositionForHorizontalReachability = getLetterboxConfiguration() .getLetterboxPositionForHorizontalReachability(); positionToLog = letterboxHorizontalReachabilityPositionToLetterboxPosition( letterboxPositionForHorizontalReachability); } else if (isVerticalReachabilityEnabled()) { int letterboxPositionForVerticalReachability = getLetterboxConfiguration() .getLetterboxPositionForVerticalReachability(); positionToLog = letterboxVerticalReachabilityPositionToLetterboxPosition( letterboxPositionForVerticalReachability); } return positionToLog; } private LetterboxConfiguration getLetterboxConfiguration() { return mLetterboxConfiguration; } /** * Logs letterbox position changes via {@link ActivityMetricsLogger#logLetterboxPositionChange}. */ private void logLetterboxPositionChange(int letterboxPositionChange) { mActivityRecord.mTaskSupervisor.getActivityMetricsLogger() .logLetterboxPositionChange(mActivityRecord, letterboxPositionChange); } }