diff options
25 files changed, 486 insertions, 351 deletions
diff --git a/core/java/android/app/AppCompatTaskInfo.java b/core/java/android/app/AppCompatTaskInfo.java new file mode 100644 index 000000000000..a998ff215304 --- /dev/null +++ b/core/java/android/app/AppCompatTaskInfo.java @@ -0,0 +1,302 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.app; + +import android.annotation.IntDef; +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.os.Parcel; +import android.os.Parcelable; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +/** + * Stores App Compat information about a particular Task. + * @hide + */ +public class AppCompatTaskInfo implements Parcelable { + + /** + * Camera compat control isn't shown because it's not requested by heuristics. + */ + public static final int CAMERA_COMPAT_CONTROL_HIDDEN = 0; + + /** + * Camera compat control is shown with the treatment suggested. + */ + public static final int CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED = 1; + + /** + * Camera compat control is shown to allow reverting the applied treatment. + */ + public static final int CAMERA_COMPAT_CONTROL_TREATMENT_APPLIED = 2; + + /** + * Camera compat control is dismissed by user. + */ + public static final int CAMERA_COMPAT_CONTROL_DISMISSED = 3; + + /** + * Enum for the Camera app compat control states. + */ + @Retention(RetentionPolicy.SOURCE) + @IntDef(prefix = { "CAMERA_COMPAT_CONTROL_" }, value = { + CAMERA_COMPAT_CONTROL_HIDDEN, + CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED, + CAMERA_COMPAT_CONTROL_TREATMENT_APPLIED, + CAMERA_COMPAT_CONTROL_DISMISSED, + }) + public @interface CameraCompatControlState {}; + + /** + * State of the Camera app compat control which is used to correct stretched viewfinder + * in apps that don't handle all possible configurations and changes between them correctly. + */ + @CameraCompatControlState + public int cameraCompatControlState = CAMERA_COMPAT_CONTROL_HIDDEN; + + /** + * Whether the direct top activity is eligible for letterbox education. + */ + public boolean topActivityEligibleForLetterboxEducation; + + /** + * Whether the direct top activity is in size compat mode on foreground. + */ + public boolean topActivityInSizeCompat; + + /** + * Whether the double tap is enabled. + */ + public boolean isLetterboxDoubleTapEnabled; + + /** + * Whether the user aspect ratio settings button is enabled. + */ + public boolean topActivityEligibleForUserAspectRatioButton; + + /** + * Whether the user has forced the activity to be fullscreen through the user aspect ratio + * settings. + */ + public boolean isUserFullscreenOverrideEnabled; + + /** + * Hint about the letterbox state of the top activity. + */ + public boolean topActivityBoundsLetterboxed; + + /** + * Whether the update comes from a letterbox double-tap action from the user or not. + */ + public boolean isFromLetterboxDoubleTap; + + /** + * If {@link isLetterboxDoubleTapEnabled} it contains the current letterbox vertical position or + * {@link TaskInfo.PROPERTY_VALUE_UNSET} otherwise. + */ + public int topActivityLetterboxVerticalPosition; + + /** + * If {@link isLetterboxDoubleTapEnabled} it contains the current letterbox vertical position or + * {@link TaskInfo.PROPERTY_VALUE_UNSET} otherwise. + */ + public int topActivityLetterboxHorizontalPosition; + + /** + * If {@link isLetterboxDoubleTapEnabled} it contains the current width of the letterboxed + * activity or {@link TaskInfo.PROPERTY_VALUE_UNSET} otherwise. + */ + public int topActivityLetterboxWidth; + + /** + * If {@link isLetterboxDoubleTapEnabled} it contains the current height of the letterboxed + * activity or {@link TaskInfo.PROPERTY_VALUE_UNSET} otherwise. + */ + public int topActivityLetterboxHeight; + + private AppCompatTaskInfo() { + // Do nothing + } + + @NonNull + static AppCompatTaskInfo create() { + return new AppCompatTaskInfo(); + } + + private AppCompatTaskInfo(Parcel source) { + readFromParcel(source); + } + + @Override + public int describeContents() { + return 0; + } + + public static final Creator<AppCompatTaskInfo> CREATOR = + new Creator<>() { + @Override + public AppCompatTaskInfo createFromParcel(Parcel in) { + return new AppCompatTaskInfo(in); + } + + @Override + public AppCompatTaskInfo[] newArray(int size) { + return new AppCompatTaskInfo[size]; + } + }; + + /** + * @return {@value true} if the task has camera compat controls. + */ + public boolean hasCameraCompatControl() { + return cameraCompatControlState != CAMERA_COMPAT_CONTROL_HIDDEN + && cameraCompatControlState != CAMERA_COMPAT_CONTROL_DISMISSED; + } + + /** + * @return {@value true} if the task has some compat ui. + */ + public boolean hasCompatUI() { + return hasCameraCompatControl() || topActivityInSizeCompat + || topActivityEligibleForLetterboxEducation + || isLetterboxDoubleTapEnabled + || topActivityEligibleForUserAspectRatioButton; + } + + /** + * @return {@value true} if top activity is pillarboxed. + */ + public boolean isTopActivityPillarboxed() { + return topActivityLetterboxWidth < topActivityLetterboxHeight; + } + + /** + * @return {@code true} if the app compat parameters that are important for task organizers + * are equal. + */ + public boolean equalsForTaskOrganizer(@Nullable AppCompatTaskInfo that) { + if (that == null) { + return false; + } + return isFromLetterboxDoubleTap == that.isFromLetterboxDoubleTap + && topActivityEligibleForUserAspectRatioButton + == that.topActivityEligibleForUserAspectRatioButton + && topActivityLetterboxVerticalPosition == that.topActivityLetterboxVerticalPosition + && topActivityLetterboxWidth == that.topActivityLetterboxWidth + && topActivityLetterboxHeight == that.topActivityLetterboxHeight + && topActivityLetterboxHorizontalPosition + == that.topActivityLetterboxHorizontalPosition + && isUserFullscreenOverrideEnabled == that.isUserFullscreenOverrideEnabled; + } + + /** + * @return {@code true} if parameters that are important for size compat have changed. + */ + public boolean equalsForCompatUi(@Nullable AppCompatTaskInfo that) { + if (that == null) { + return false; + } + return topActivityInSizeCompat == that.topActivityInSizeCompat + && isFromLetterboxDoubleTap == that.isFromLetterboxDoubleTap + && topActivityEligibleForUserAspectRatioButton + == that.topActivityEligibleForUserAspectRatioButton + && topActivityEligibleForLetterboxEducation + == that.topActivityEligibleForLetterboxEducation + && topActivityLetterboxVerticalPosition == that.topActivityLetterboxVerticalPosition + && topActivityLetterboxHorizontalPosition + == that.topActivityLetterboxHorizontalPosition + && topActivityLetterboxWidth == that.topActivityLetterboxWidth + && topActivityLetterboxHeight == that.topActivityLetterboxHeight + && cameraCompatControlState == that.cameraCompatControlState + && isUserFullscreenOverrideEnabled == that.isUserFullscreenOverrideEnabled; + } + + /** + * Reads the TaskInfo from a parcel. + */ + void readFromParcel(Parcel source) { + topActivityInSizeCompat = source.readBoolean(); + topActivityEligibleForLetterboxEducation = source.readBoolean(); + cameraCompatControlState = source.readInt(); + isLetterboxDoubleTapEnabled = source.readBoolean(); + topActivityEligibleForUserAspectRatioButton = source.readBoolean(); + topActivityBoundsLetterboxed = source.readBoolean(); + isFromLetterboxDoubleTap = source.readBoolean(); + topActivityLetterboxVerticalPosition = source.readInt(); + topActivityLetterboxHorizontalPosition = source.readInt(); + topActivityLetterboxWidth = source.readInt(); + topActivityLetterboxHeight = source.readInt(); + isUserFullscreenOverrideEnabled = source.readBoolean(); + } + + /** + * Writes the TaskInfo to a parcel. + */ + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeBoolean(topActivityInSizeCompat); + dest.writeBoolean(topActivityEligibleForLetterboxEducation); + dest.writeInt(cameraCompatControlState); + dest.writeBoolean(isLetterboxDoubleTapEnabled); + dest.writeBoolean(topActivityEligibleForUserAspectRatioButton); + dest.writeBoolean(topActivityBoundsLetterboxed); + dest.writeBoolean(isFromLetterboxDoubleTap); + dest.writeInt(topActivityLetterboxVerticalPosition); + dest.writeInt(topActivityLetterboxHorizontalPosition); + dest.writeInt(topActivityLetterboxWidth); + dest.writeInt(topActivityLetterboxHeight); + dest.writeBoolean(isUserFullscreenOverrideEnabled); + } + + @Override + public String toString() { + return "AppCompatTaskInfo { topActivityInSizeCompat=" + topActivityInSizeCompat + + " topActivityEligibleForLetterboxEducation= " + + topActivityEligibleForLetterboxEducation + + " isLetterboxDoubleTapEnabled= " + isLetterboxDoubleTapEnabled + + " topActivityEligibleForUserAspectRatioButton= " + + topActivityEligibleForUserAspectRatioButton + + " topActivityBoundsLetterboxed= " + topActivityBoundsLetterboxed + + " isFromLetterboxDoubleTap= " + isFromLetterboxDoubleTap + + " topActivityLetterboxVerticalPosition= " + topActivityLetterboxVerticalPosition + + " topActivityLetterboxHorizontalPosition= " + + topActivityLetterboxHorizontalPosition + + " topActivityLetterboxWidth=" + topActivityLetterboxWidth + + " topActivityLetterboxHeight=" + topActivityLetterboxHeight + + " isUserFullscreenOverrideEnabled=" + isUserFullscreenOverrideEnabled + + " cameraCompatControlState=" + + cameraCompatControlStateToString(cameraCompatControlState) + + "}"; + } + + /** Human readable version of the camera control state. */ + @NonNull + public static String cameraCompatControlStateToString( + @CameraCompatControlState int cameraCompatControlState) { + switch (cameraCompatControlState) { + case CAMERA_COMPAT_CONTROL_HIDDEN: return "hidden"; + case CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED: return "treatment-suggested"; + case CAMERA_COMPAT_CONTROL_TREATMENT_APPLIED: return "treatment-applied"; + case CAMERA_COMPAT_CONTROL_DISMISSED: return "dismissed"; + default: + throw new AssertionError( + "Unexpected camera compat control state: " + cameraCompatControlState); + } + } +} diff --git a/core/java/android/app/TaskInfo.java b/core/java/android/app/TaskInfo.java index 5f8b76508ef3..efd5a455af89 100644 --- a/core/java/android/app/TaskInfo.java +++ b/core/java/android/app/TaskInfo.java @@ -19,7 +19,6 @@ package android.app; import static android.app.ActivityTaskManager.INVALID_TASK_ID; import static android.window.DisplayAreaOrganizer.FEATURE_UNDEFINED; -import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.TestApi; @@ -37,8 +36,6 @@ import android.os.Parcel; import android.view.DisplayCutout; import android.window.WindowContainerToken; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.Objects; @@ -224,83 +221,6 @@ public class TaskInfo { public ActivityInfo topActivityInfo; /** - * Whether the direct top activity is in size compat mode on foreground. - * @hide - */ - public boolean topActivityInSizeCompat; - - /** - * Whether the direct top activity is eligible for letterbox education. - * @hide - */ - public boolean topActivityEligibleForLetterboxEducation; - - /** - * Whether the double tap is enabled - * @hide - */ - public boolean isLetterboxDoubleTapEnabled; - - /** - * Whether the user aspect ratio settings button is enabled - * @hide - */ - public boolean topActivityEligibleForUserAspectRatioButton; - - /** - * Whether the user has forced the activity to be fullscreen through the user aspect ratio - * settings. - * @hide - */ - public boolean isUserFullscreenOverrideEnabled; - - /** - * Whether the top activity fillsParent() is false - * @hide - */ - public boolean isTopActivityTransparent; - - /** - * Hint about the letterbox state of the top activity. - * @hide - */ - public boolean topActivityBoundsLetterboxed; - - /** - * Whether the update comes from a letterbox double-tap action from the user or not. - * @hide - */ - public boolean isFromLetterboxDoubleTap; - - /** - * If {@link isLetterboxDoubleTapEnabled} it contains the current letterbox vertical position or - * {@link TaskInfo.PROPERTY_VALUE_UNSET} otherwise. - * @hide - */ - public int topActivityLetterboxVerticalPosition; - - /** - * If {@link isLetterboxDoubleTapEnabled} it contains the current letterbox vertical position or - * {@link TaskInfo.PROPERTY_VALUE_UNSET} otherwise. - * @hide - */ - public int topActivityLetterboxHorizontalPosition; - - /** - * If {@link isLetterboxDoubleTapEnabled} it contains the current width of the letterboxed - * activity or {@link TaskInfo.PROPERTY_VALUE_UNSET} otherwise - * @hide - */ - public int topActivityLetterboxWidth; - - /** - * If {@link isLetterboxDoubleTapEnabled} it contains the current height of the letterboxed - * activity or {@link TaskInfo.PROPERTY_VALUE_UNSET} otherwise - * @hide - */ - public int topActivityLetterboxHeight; - - /** * Whether this task is resizable. Unlike {@link #resizeMode} (which is what the top activity * supports), this is what the system actually uses for resizability based on other policy and * developer options. @@ -371,49 +291,16 @@ public class TaskInfo { public boolean isSleeping; /** - * Camera compat control isn't shown because it's not requested by heuristics. - * @hide - */ - public static final int CAMERA_COMPAT_CONTROL_HIDDEN = 0; - - /** - * Camera compat control is shown with the treatment suggested. - * @hide - */ - public static final int CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED = 1; - - /** - * Camera compat control is shown to allow reverting the applied treatment. - * @hide - */ - public static final int CAMERA_COMPAT_CONTROL_TREATMENT_APPLIED = 2; - - /** - * Camera compat control is dismissed by user. - * @hide - */ - public static final int CAMERA_COMPAT_CONTROL_DISMISSED = 3; - - /** - * Enum for the Camera app compat control states. + * Whether the top activity fillsParent() is false * @hide */ - @Retention(RetentionPolicy.SOURCE) - @IntDef(prefix = { "CAMERA_COMPAT_CONTROL_" }, value = { - CAMERA_COMPAT_CONTROL_HIDDEN, - CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED, - CAMERA_COMPAT_CONTROL_TREATMENT_APPLIED, - CAMERA_COMPAT_CONTROL_DISMISSED, - }) - public @interface CameraCompatControlState {}; + public boolean isTopActivityTransparent; /** - * State of the Camera app compat control which is used to correct stretched viewfinder - * in apps that don't handle all possible configurations and changes between them correctly. + * Encapsulate specific App Compat information. * @hide */ - @CameraCompatControlState - public int cameraCompatControlState = CAMERA_COMPAT_CONTROL_HIDDEN; + public AppCompatTaskInfo appCompatTaskInfo = AppCompatTaskInfo.create(); TaskInfo() { // Do nothing @@ -475,20 +362,6 @@ public class TaskInfo { launchCookies.add(cookie); } - /** @hide */ - public boolean hasCameraCompatControl() { - return cameraCompatControlState != CAMERA_COMPAT_CONTROL_HIDDEN - && cameraCompatControlState != CAMERA_COMPAT_CONTROL_DISMISSED; - } - - /** @hide */ - public boolean hasCompatUI() { - return hasCameraCompatControl() || topActivityInSizeCompat - || topActivityEligibleForLetterboxEducation - || isLetterboxDoubleTapEnabled - || topActivityEligibleForUserAspectRatioButton; - } - /** * @return {@code true} if this task contains the launch cookie. * @hide @@ -535,14 +408,6 @@ public class TaskInfo { && isResizeable == that.isResizeable && supportsMultiWindow == that.supportsMultiWindow && displayAreaFeatureId == that.displayAreaFeatureId - && isFromLetterboxDoubleTap == that.isFromLetterboxDoubleTap - && topActivityEligibleForUserAspectRatioButton - == that.topActivityEligibleForUserAspectRatioButton - && topActivityLetterboxVerticalPosition == that.topActivityLetterboxVerticalPosition - && topActivityLetterboxWidth == that.topActivityLetterboxWidth - && topActivityLetterboxHeight == that.topActivityLetterboxHeight - && topActivityLetterboxHorizontalPosition - == that.topActivityLetterboxHorizontalPosition && Objects.equals(positionInParent, that.positionInParent) && Objects.equals(pictureInPictureParams, that.pictureInPictureParams) && Objects.equals(shouldDockBigOverlays, that.shouldDockBigOverlays) @@ -557,8 +422,8 @@ public class TaskInfo { && Objects.equals(mTopActivityLocusId, that.mTopActivityLocusId) && parentTaskId == that.parentTaskId && Objects.equals(topActivity, that.topActivity) - && isUserFullscreenOverrideEnabled == that.isUserFullscreenOverrideEnabled - && isTopActivityTransparent == that.isTopActivityTransparent; + && isTopActivityTransparent == that.isTopActivityTransparent + && appCompatTaskInfo.equalsForTaskOrganizer(that.appCompatTaskInfo); } /** @@ -569,30 +434,19 @@ public class TaskInfo { if (that == null) { return false; } + final boolean hasCompatUI = appCompatTaskInfo.hasCompatUI(); return displayId == that.displayId && taskId == that.taskId - && topActivityInSizeCompat == that.topActivityInSizeCompat - && isFromLetterboxDoubleTap == that.isFromLetterboxDoubleTap - && topActivityEligibleForUserAspectRatioButton - == that.topActivityEligibleForUserAspectRatioButton - && topActivityEligibleForLetterboxEducation - == that.topActivityEligibleForLetterboxEducation - && topActivityLetterboxVerticalPosition == that.topActivityLetterboxVerticalPosition - && topActivityLetterboxHorizontalPosition - == that.topActivityLetterboxHorizontalPosition - && topActivityLetterboxWidth == that.topActivityLetterboxWidth - && topActivityLetterboxHeight == that.topActivityLetterboxHeight - && cameraCompatControlState == that.cameraCompatControlState + && isFocused == that.isFocused + && isTopActivityTransparent == that.isTopActivityTransparent + && appCompatTaskInfo.equalsForCompatUi(that.appCompatTaskInfo) // Bounds are important if top activity has compat controls. - && (!hasCompatUI() || configuration.windowConfiguration.getBounds() + && (!hasCompatUI || configuration.windowConfiguration.getBounds() .equals(that.configuration.windowConfiguration.getBounds())) - && (!hasCompatUI() || configuration.getLayoutDirection() + && (!hasCompatUI || configuration.getLayoutDirection() == that.configuration.getLayoutDirection()) - && (!hasCompatUI() || configuration.uiMode == that.configuration.uiMode) - && (!hasCompatUI() || isVisible == that.isVisible) - && isFocused == that.isFocused - && isUserFullscreenOverrideEnabled == that.isUserFullscreenOverrideEnabled - && isTopActivityTransparent == that.isTopActivityTransparent; + && (!hasCompatUI || configuration.uiMode == that.configuration.uiMode) + && (!hasCompatUI || isVisible == that.isVisible); } /** @@ -635,21 +489,10 @@ public class TaskInfo { isVisible = source.readBoolean(); isVisibleRequested = source.readBoolean(); isSleeping = source.readBoolean(); - topActivityInSizeCompat = source.readBoolean(); - topActivityEligibleForLetterboxEducation = source.readBoolean(); mTopActivityLocusId = source.readTypedObject(LocusId.CREATOR); displayAreaFeatureId = source.readInt(); - cameraCompatControlState = source.readInt(); - isLetterboxDoubleTapEnabled = source.readBoolean(); - topActivityEligibleForUserAspectRatioButton = source.readBoolean(); - topActivityBoundsLetterboxed = source.readBoolean(); - isFromLetterboxDoubleTap = source.readBoolean(); - topActivityLetterboxVerticalPosition = source.readInt(); - topActivityLetterboxHorizontalPosition = source.readInt(); - topActivityLetterboxWidth = source.readInt(); - topActivityLetterboxHeight = source.readInt(); - isUserFullscreenOverrideEnabled = source.readBoolean(); isTopActivityTransparent = source.readBoolean(); + appCompatTaskInfo = source.readTypedObject(AppCompatTaskInfo.CREATOR); } /** @@ -693,21 +536,10 @@ public class TaskInfo { dest.writeBoolean(isVisible); dest.writeBoolean(isVisibleRequested); dest.writeBoolean(isSleeping); - dest.writeBoolean(topActivityInSizeCompat); - dest.writeBoolean(topActivityEligibleForLetterboxEducation); dest.writeTypedObject(mTopActivityLocusId, flags); dest.writeInt(displayAreaFeatureId); - dest.writeInt(cameraCompatControlState); - dest.writeBoolean(isLetterboxDoubleTapEnabled); - dest.writeBoolean(topActivityEligibleForUserAspectRatioButton); - dest.writeBoolean(topActivityBoundsLetterboxed); - dest.writeBoolean(isFromLetterboxDoubleTap); - dest.writeInt(topActivityLetterboxVerticalPosition); - dest.writeInt(topActivityLetterboxHorizontalPosition); - dest.writeInt(topActivityLetterboxWidth); - dest.writeInt(topActivityLetterboxHeight); - dest.writeBoolean(isUserFullscreenOverrideEnabled); dest.writeBoolean(isTopActivityTransparent); + dest.writeTypedObject(appCompatTaskInfo, flags); } @Override @@ -741,39 +573,10 @@ public class TaskInfo { + " isVisible=" + isVisible + " isVisibleRequested=" + isVisibleRequested + " isSleeping=" + isSleeping - + " topActivityInSizeCompat=" + topActivityInSizeCompat - + " topActivityEligibleForLetterboxEducation= " - + topActivityEligibleForLetterboxEducation - + " isLetterboxDoubleTapEnabled= " + isLetterboxDoubleTapEnabled - + " topActivityEligibleForUserAspectRatioButton= " - + topActivityEligibleForUserAspectRatioButton - + " topActivityBoundsLetterboxed= " + topActivityBoundsLetterboxed - + " isFromLetterboxDoubleTap= " + isFromLetterboxDoubleTap - + " topActivityLetterboxVerticalPosition= " + topActivityLetterboxVerticalPosition - + " topActivityLetterboxHorizontalPosition= " - + topActivityLetterboxHorizontalPosition - + " topActivityLetterboxWidth=" + topActivityLetterboxWidth - + " topActivityLetterboxHeight=" + topActivityLetterboxHeight - + " isUserFullscreenOverrideEnabled=" + isUserFullscreenOverrideEnabled - + " isTopActivityTransparent=" + isTopActivityTransparent + " locusId=" + mTopActivityLocusId + " displayAreaFeatureId=" + displayAreaFeatureId - + " cameraCompatControlState=" - + cameraCompatControlStateToString(cameraCompatControlState) + + " isTopActivityTransparent=" + isTopActivityTransparent + + " appCompatTaskInfo=" + appCompatTaskInfo + "}"; } - - /** @hide */ - public static String cameraCompatControlStateToString( - @CameraCompatControlState int cameraCompatControlState) { - switch (cameraCompatControlState) { - case CAMERA_COMPAT_CONTROL_HIDDEN: return "hidden"; - case CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED: return "treatment-suggested"; - case CAMERA_COMPAT_CONTROL_TREATMENT_APPLIED: return "treatment-applied"; - case CAMERA_COMPAT_CONTROL_DISMISSED: return "dismissed"; - default: - throw new AssertionError( - "Unexpected camera compat control state: " + cameraCompatControlState); - } - } } diff --git a/core/java/android/window/TaskOrganizer.java b/core/java/android/window/TaskOrganizer.java index 2913faf9d74d..cd1275c23ed6 100644 --- a/core/java/android/window/TaskOrganizer.java +++ b/core/java/android/window/TaskOrganizer.java @@ -24,7 +24,7 @@ import android.annotation.RequiresPermission; import android.annotation.SuppressLint; import android.annotation.TestApi; import android.app.ActivityManager; -import android.app.TaskInfo.CameraCompatControlState; +import android.app.AppCompatTaskInfo.CameraCompatControlState; import android.os.IBinder; import android.os.RemoteException; import android.view.SurfaceControl; diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java index 04795768aefc..b1b196d40357 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java @@ -29,6 +29,7 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.ActivityManager.RunningTaskInfo; +import android.app.AppCompatTaskInfo; import android.app.TaskInfo; import android.app.WindowConfiguration; import android.content.LocusId; @@ -700,7 +701,7 @@ public class ShellTaskOrganizer extends TaskOrganizer implements @Override public void onCameraControlStateUpdated( - int taskId, @TaskInfo.CameraCompatControlState int state) { + int taskId, @AppCompatTaskInfo.CameraCompatControlState int state) { final TaskAppearedInfo info; synchronized (mLock) { info = mTasks.get(taskId); @@ -754,7 +755,7 @@ public class ShellTaskOrganizer extends TaskOrganizer implements // The task is vanished or doesn't support compat UI, notify to remove compat UI // on this Task if there is any. if (taskListener == null || !taskListener.supportCompatUI() - || !taskInfo.hasCompatUI() || !taskInfo.isVisible) { + || !taskInfo.appCompatTaskInfo.hasCompatUI() || !taskInfo.isVisible) { mCompatUI.onCompatInfoChanged(taskInfo, null /* taskListener */); return; } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIController.java index 953efa78326c..86571cf9c622 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIController.java @@ -20,8 +20,8 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; import android.annotation.NonNull; import android.annotation.Nullable; +import android.app.AppCompatTaskInfo.CameraCompatControlState; import android.app.TaskInfo; -import android.app.TaskInfo.CameraCompatControlState; import android.content.ComponentName; import android.content.Context; import android.content.Intent; @@ -239,7 +239,7 @@ public class CompatUIController implements OnDisplaysChangedListener, */ public void onCompatInfoChanged(@NonNull TaskInfo taskInfo, @Nullable ShellTaskOrganizer.TaskListener taskListener) { - if (taskInfo != null && !taskInfo.topActivityInSizeCompat) { + if (taskInfo != null && !taskInfo.appCompatTaskInfo.topActivityInSizeCompat) { mSetOfTaskIdsShowingRestartDialog.remove(taskInfo.taskId); } @@ -267,7 +267,7 @@ public class CompatUIController implements OnDisplaysChangedListener, } return; } - if (!taskInfo.isFromLetterboxDoubleTap) { + if (!taskInfo.appCompatTaskInfo.isFromLetterboxDoubleTap) { createOrUpdateUserAspectRatioSettingsLayout(taskInfo, taskListener); } } @@ -348,7 +348,8 @@ public class CompatUIController implements OnDisplaysChangedListener, // as they are still relevant. Else, if the activity is visible and focused (the one the // user can see and is using), the user aspect ratio button can potentially be displayed so // start tracking the buttons visibility for this task. - if (mTopActivityTaskId != taskInfo.taskId && !taskInfo.isTopActivityTransparent + if (mTopActivityTaskId != taskInfo.taskId + && !taskInfo.isTopActivityTransparent && taskInfo.isVisible && taskInfo.isFocused) { mTopActivityTaskId = taskInfo.taskId; setHasShownUserAspectRatioSettingsButton(false); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUILayout.java b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUILayout.java index d44b4d8f63b6..a0986fa601f2 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUILayout.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUILayout.java @@ -16,9 +16,10 @@ package com.android.wm.shell.compatui; +import static android.app.AppCompatTaskInfo.CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED; + import android.annotation.IdRes; -import android.app.TaskInfo; -import android.app.TaskInfo.CameraCompatControlState; +import android.app.AppCompatTaskInfo.CameraCompatControlState; import android.content.Context; import android.util.AttributeSet; import android.view.View; @@ -57,10 +58,10 @@ class CompatUILayout extends LinearLayout { } void updateCameraTreatmentButton(@CameraCompatControlState int newState) { - int buttonBkgId = newState == TaskInfo.CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED + int buttonBkgId = newState == CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED ? R.drawable.camera_compat_treatment_suggested_ripple : R.drawable.camera_compat_treatment_applied_ripple; - int hintStringId = newState == TaskInfo.CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED + int hintStringId = newState == CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED ? R.string.camera_compat_treatment_suggested_button_description : R.string.camera_compat_treatment_applied_button_description; final ImageButton button = findViewById(R.id.camera_compat_treatment_button); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIWindowManager.java b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIWindowManager.java index ce3c5093fdd4..00e0cdb034b6 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIWindowManager.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIWindowManager.java @@ -16,15 +16,15 @@ package com.android.wm.shell.compatui; -import static android.app.TaskInfo.CAMERA_COMPAT_CONTROL_DISMISSED; -import static android.app.TaskInfo.CAMERA_COMPAT_CONTROL_HIDDEN; -import static android.app.TaskInfo.CAMERA_COMPAT_CONTROL_TREATMENT_APPLIED; -import static android.app.TaskInfo.CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED; +import static android.app.AppCompatTaskInfo.CAMERA_COMPAT_CONTROL_DISMISSED; +import static android.app.AppCompatTaskInfo.CAMERA_COMPAT_CONTROL_HIDDEN; +import static android.app.AppCompatTaskInfo.CAMERA_COMPAT_CONTROL_TREATMENT_APPLIED; +import static android.app.AppCompatTaskInfo.CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED; import static android.window.TaskConstants.TASK_CHILD_LAYER_COMPAT_UI; import android.annotation.Nullable; +import android.app.AppCompatTaskInfo.CameraCompatControlState; import android.app.TaskInfo; -import android.app.TaskInfo.CameraCompatControlState; import android.content.Context; import android.graphics.Rect; import android.util.Log; @@ -75,8 +75,8 @@ class CompatUIWindowManager extends CompatUIWindowManagerAbstract { Consumer<Pair<TaskInfo, ShellTaskOrganizer.TaskListener>> onRestartButtonClicked) { super(context, taskInfo, syncQueue, taskListener, displayLayout); mCallback = callback; - mHasSizeCompat = taskInfo.topActivityInSizeCompat; - mCameraCompatControlState = taskInfo.cameraCompatControlState; + mHasSizeCompat = taskInfo.appCompatTaskInfo.topActivityInSizeCompat; + mCameraCompatControlState = taskInfo.appCompatTaskInfo.cameraCompatControlState; mCompatUIHintsState = compatUIHintsState; mCompatUIConfiguration = compatUIConfiguration; mOnRestartButtonClicked = onRestartButtonClicked; @@ -127,8 +127,8 @@ class CompatUIWindowManager extends CompatUIWindowManagerAbstract { boolean canShow) { final boolean prevHasSizeCompat = mHasSizeCompat; final int prevCameraCompatControlState = mCameraCompatControlState; - mHasSizeCompat = taskInfo.topActivityInSizeCompat; - mCameraCompatControlState = taskInfo.cameraCompatControlState; + mHasSizeCompat = taskInfo.appCompatTaskInfo.topActivityInSizeCompat; + mCameraCompatControlState = taskInfo.appCompatTaskInfo.cameraCompatControlState; if (!super.updateCompatInfo(taskInfo, taskListener, canShow)) { return false; diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/LetterboxEduWindowManager.java b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/LetterboxEduWindowManager.java index fce1a39399d0..623feada0172 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/LetterboxEduWindowManager.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/LetterboxEduWindowManager.java @@ -103,7 +103,8 @@ class LetterboxEduWindowManager extends CompatUIWindowManagerAbstract { R.dimen.letterbox_education_dialog_margin); mDockStateReader = dockStateReader; mCompatUIConfiguration = compatUIConfiguration; - mEligibleForLetterboxEducation = taskInfo.topActivityEligibleForLetterboxEducation; + mEligibleForLetterboxEducation = + taskInfo.appCompatTaskInfo.topActivityEligibleForLetterboxEducation; } @Override @@ -204,7 +205,8 @@ class LetterboxEduWindowManager extends CompatUIWindowManagerAbstract { @Override public boolean updateCompatInfo(TaskInfo taskInfo, ShellTaskOrganizer.TaskListener taskListener, boolean canShow) { - mEligibleForLetterboxEducation = taskInfo.topActivityEligibleForLetterboxEducation; + mEligibleForLetterboxEducation = + taskInfo.appCompatTaskInfo.topActivityEligibleForLetterboxEducation; return super.updateCompatInfo(taskInfo, taskListener, canShow); } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/ReachabilityEduWindowManager.java b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/ReachabilityEduWindowManager.java index 5612bc8ef226..835f1af85c51 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/ReachabilityEduWindowManager.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/ReachabilityEduWindowManager.java @@ -21,6 +21,7 @@ import static android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE; import static android.window.TaskConstants.TASK_CHILD_LAYER_COMPAT_UI; import android.annotation.Nullable; +import android.app.AppCompatTaskInfo; import android.app.TaskInfo; import android.content.Context; import android.graphics.Rect; @@ -89,11 +90,12 @@ class ReachabilityEduWindowManager extends CompatUIWindowManagerAbstract { BiConsumer<TaskInfo, ShellTaskOrganizer.TaskListener> onDismissCallback, Function<Integer, Integer> disappearTimeSupplier) { super(context, taskInfo, syncQueue, taskListener, displayLayout); - mIsActivityLetterboxed = taskInfo.isLetterboxDoubleTapEnabled; - mLetterboxVerticalPosition = taskInfo.topActivityLetterboxVerticalPosition; - mLetterboxHorizontalPosition = taskInfo.topActivityLetterboxHorizontalPosition; - mTopActivityLetterboxWidth = taskInfo.topActivityLetterboxWidth; - mTopActivityLetterboxHeight = taskInfo.topActivityLetterboxHeight; + final AppCompatTaskInfo appCompatTaskInfo = taskInfo.appCompatTaskInfo; + mIsActivityLetterboxed = appCompatTaskInfo.isLetterboxDoubleTapEnabled; + mLetterboxVerticalPosition = appCompatTaskInfo.topActivityLetterboxVerticalPosition; + mLetterboxHorizontalPosition = appCompatTaskInfo.topActivityLetterboxHorizontalPosition; + mTopActivityLetterboxWidth = appCompatTaskInfo.topActivityLetterboxWidth; + mTopActivityLetterboxHeight = appCompatTaskInfo.topActivityLetterboxHeight; mCompatUIConfiguration = compatUIConfiguration; mMainExecutor = mainExecutor; mOnDismissCallback = onDismissCallback; @@ -145,12 +147,13 @@ class ReachabilityEduWindowManager extends CompatUIWindowManagerAbstract { final int prevLetterboxHorizontalPosition = mLetterboxHorizontalPosition; final int prevTopActivityLetterboxWidth = mTopActivityLetterboxWidth; final int prevTopActivityLetterboxHeight = mTopActivityLetterboxHeight; - mIsActivityLetterboxed = taskInfo.isLetterboxDoubleTapEnabled; - mLetterboxVerticalPosition = taskInfo.topActivityLetterboxVerticalPosition; - mLetterboxHorizontalPosition = taskInfo.topActivityLetterboxHorizontalPosition; - mTopActivityLetterboxWidth = taskInfo.topActivityLetterboxWidth; - mTopActivityLetterboxHeight = taskInfo.topActivityLetterboxHeight; - mHasUserDoubleTapped = taskInfo.isFromLetterboxDoubleTap; + final AppCompatTaskInfo appCompatTaskInfo = taskInfo.appCompatTaskInfo; + mIsActivityLetterboxed = appCompatTaskInfo.isLetterboxDoubleTapEnabled; + mLetterboxVerticalPosition = appCompatTaskInfo.topActivityLetterboxVerticalPosition; + mLetterboxHorizontalPosition = appCompatTaskInfo.topActivityLetterboxHorizontalPosition; + mTopActivityLetterboxWidth = appCompatTaskInfo.topActivityLetterboxWidth; + mTopActivityLetterboxHeight = appCompatTaskInfo.topActivityLetterboxHeight; + mHasUserDoubleTapped = appCompatTaskInfo.isFromLetterboxDoubleTap; if (!super.updateCompatInfo(taskInfo, taskListener, canShow)) { return false; diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/UserAspectRatioSettingsWindowManager.java b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/UserAspectRatioSettingsWindowManager.java index c2dec623416b..ef763ec45994 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/UserAspectRatioSettingsWindowManager.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/UserAspectRatioSettingsWindowManager.java @@ -227,9 +227,9 @@ class UserAspectRatioSettingsWindowManager extends CompatUIWindowManagerAbstract } private boolean getHasUserAspectRatioSettingsButton(@NonNull TaskInfo taskInfo) { - return taskInfo.topActivityEligibleForUserAspectRatioButton - && (taskInfo.topActivityBoundsLetterboxed - || taskInfo.isUserFullscreenOverrideEnabled) + return taskInfo.appCompatTaskInfo.topActivityEligibleForUserAspectRatioButton + && (taskInfo.appCompatTaskInfo.topActivityBoundsLetterboxed + || taskInfo.appCompatTaskInfo.isUserFullscreenOverrideEnabled) && (!mUserAspectRatioButtonShownChecker.get() || isShowingButton()); } diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/ShellTaskOrganizerTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/ShellTaskOrganizerTests.java index 081c8ae91bdb..9c1a88e1caa0 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/ShellTaskOrganizerTests.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/ShellTaskOrganizerTests.java @@ -16,6 +16,10 @@ package com.android.wm.shell; +import static android.app.AppCompatTaskInfo.CAMERA_COMPAT_CONTROL_DISMISSED; +import static android.app.AppCompatTaskInfo.CAMERA_COMPAT_CONTROL_HIDDEN; +import static android.app.AppCompatTaskInfo.CAMERA_COMPAT_CONTROL_TREATMENT_APPLIED; +import static android.app.AppCompatTaskInfo.CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED; import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW; import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED; @@ -40,7 +44,6 @@ import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import android.app.ActivityManager.RunningTaskInfo; -import android.app.TaskInfo; import android.content.LocusId; import android.content.pm.ParceledListSlice; import android.os.Binder; @@ -356,7 +359,7 @@ public class ShellTaskOrganizerTests extends ShellTestCase { public void testOnSizeCompatActivityChanged() { final RunningTaskInfo taskInfo1 = createTaskInfo(12, WINDOWING_MODE_FULLSCREEN); taskInfo1.displayId = DEFAULT_DISPLAY; - taskInfo1.topActivityInSizeCompat = false; + taskInfo1.appCompatTaskInfo.topActivityInSizeCompat = false; final TrackingTaskListener taskListener = new TrackingTaskListener(); mOrganizer.addListenerForType(taskListener, TASK_LISTENER_TYPE_FULLSCREEN); mOrganizer.onTaskAppeared(taskInfo1, null); @@ -369,7 +372,7 @@ public class ShellTaskOrganizerTests extends ShellTestCase { final RunningTaskInfo taskInfo2 = createTaskInfo(taskInfo1.taskId, taskInfo1.getWindowingMode()); taskInfo2.displayId = taskInfo1.displayId; - taskInfo2.topActivityInSizeCompat = true; + taskInfo2.appCompatTaskInfo.topActivityInSizeCompat = true; taskInfo2.isVisible = true; mOrganizer.onTaskInfoChanged(taskInfo2); verify(mCompatUI).onCompatInfoChanged(taskInfo2, taskListener); @@ -379,7 +382,7 @@ public class ShellTaskOrganizerTests extends ShellTestCase { final RunningTaskInfo taskInfo3 = createTaskInfo(taskInfo1.taskId, taskInfo1.getWindowingMode()); taskInfo3.displayId = taskInfo1.displayId; - taskInfo3.topActivityInSizeCompat = true; + taskInfo3.appCompatTaskInfo.topActivityInSizeCompat = true; taskInfo3.isVisible = false; mOrganizer.onTaskInfoChanged(taskInfo3); verify(mCompatUI).onCompatInfoChanged(taskInfo3, null /* taskListener */); @@ -393,7 +396,7 @@ public class ShellTaskOrganizerTests extends ShellTestCase { public void testOnEligibleForLetterboxEducationActivityChanged() { final RunningTaskInfo taskInfo1 = createTaskInfo(12, WINDOWING_MODE_FULLSCREEN); taskInfo1.displayId = DEFAULT_DISPLAY; - taskInfo1.topActivityEligibleForLetterboxEducation = false; + taskInfo1.appCompatTaskInfo.topActivityEligibleForLetterboxEducation = false; final TrackingTaskListener taskListener = new TrackingTaskListener(); mOrganizer.addListenerForType(taskListener, TASK_LISTENER_TYPE_FULLSCREEN); mOrganizer.onTaskAppeared(taskInfo1, null); @@ -408,7 +411,7 @@ public class ShellTaskOrganizerTests extends ShellTestCase { final RunningTaskInfo taskInfo2 = createTaskInfo(taskInfo1.taskId, WINDOWING_MODE_FULLSCREEN); taskInfo2.displayId = taskInfo1.displayId; - taskInfo2.topActivityEligibleForLetterboxEducation = true; + taskInfo2.appCompatTaskInfo.topActivityEligibleForLetterboxEducation = true; taskInfo2.isVisible = true; mOrganizer.onTaskInfoChanged(taskInfo2); verify(mCompatUI).onCompatInfoChanged(taskInfo2, taskListener); @@ -418,7 +421,7 @@ public class ShellTaskOrganizerTests extends ShellTestCase { final RunningTaskInfo taskInfo3 = createTaskInfo(taskInfo1.taskId, WINDOWING_MODE_FULLSCREEN); taskInfo3.displayId = taskInfo1.displayId; - taskInfo3.topActivityEligibleForLetterboxEducation = true; + taskInfo3.appCompatTaskInfo.topActivityEligibleForLetterboxEducation = true; taskInfo3.isVisible = false; mOrganizer.onTaskInfoChanged(taskInfo3); verify(mCompatUI).onCompatInfoChanged(taskInfo3, null /* taskListener */); @@ -432,7 +435,7 @@ public class ShellTaskOrganizerTests extends ShellTestCase { public void testOnCameraCompatActivityChanged() { final RunningTaskInfo taskInfo1 = createTaskInfo(1, WINDOWING_MODE_FULLSCREEN); taskInfo1.displayId = DEFAULT_DISPLAY; - taskInfo1.cameraCompatControlState = TaskInfo.CAMERA_COMPAT_CONTROL_HIDDEN; + taskInfo1.appCompatTaskInfo.cameraCompatControlState = CAMERA_COMPAT_CONTROL_HIDDEN; final TrackingTaskListener taskListener = new TrackingTaskListener(); mOrganizer.addListenerForType(taskListener, TASK_LISTENER_TYPE_FULLSCREEN); mOrganizer.onTaskAppeared(taskInfo1, null); @@ -446,7 +449,8 @@ public class ShellTaskOrganizerTests extends ShellTestCase { final RunningTaskInfo taskInfo2 = createTaskInfo(taskInfo1.taskId, taskInfo1.getWindowingMode()); taskInfo2.displayId = taskInfo1.displayId; - taskInfo2.cameraCompatControlState = TaskInfo.CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED; + taskInfo2.appCompatTaskInfo.cameraCompatControlState = + CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED; taskInfo2.isVisible = true; mOrganizer.onTaskInfoChanged(taskInfo2); verify(mCompatUI).onCompatInfoChanged(taskInfo2, taskListener); @@ -457,7 +461,8 @@ public class ShellTaskOrganizerTests extends ShellTestCase { final RunningTaskInfo taskInfo3 = createTaskInfo(taskInfo1.taskId, taskInfo1.getWindowingMode()); taskInfo3.displayId = taskInfo1.displayId; - taskInfo3.cameraCompatControlState = TaskInfo.CAMERA_COMPAT_CONTROL_TREATMENT_APPLIED; + taskInfo3.appCompatTaskInfo.cameraCompatControlState = + CAMERA_COMPAT_CONTROL_TREATMENT_APPLIED; taskInfo3.isVisible = true; mOrganizer.onTaskInfoChanged(taskInfo3); verify(mCompatUI).onCompatInfoChanged(taskInfo3, taskListener); @@ -468,8 +473,9 @@ public class ShellTaskOrganizerTests extends ShellTestCase { final RunningTaskInfo taskInfo4 = createTaskInfo(taskInfo1.taskId, taskInfo1.getWindowingMode()); taskInfo4.displayId = taskInfo1.displayId; - taskInfo4.topActivityInSizeCompat = true; - taskInfo4.cameraCompatControlState = TaskInfo.CAMERA_COMPAT_CONTROL_TREATMENT_APPLIED; + taskInfo4.appCompatTaskInfo.topActivityInSizeCompat = true; + taskInfo4.appCompatTaskInfo.cameraCompatControlState = + CAMERA_COMPAT_CONTROL_TREATMENT_APPLIED; taskInfo4.isVisible = true; mOrganizer.onTaskInfoChanged(taskInfo4); verify(mCompatUI).onCompatInfoChanged(taskInfo4, taskListener); @@ -479,7 +485,8 @@ public class ShellTaskOrganizerTests extends ShellTestCase { final RunningTaskInfo taskInfo5 = createTaskInfo(taskInfo1.taskId, taskInfo1.getWindowingMode()); taskInfo5.displayId = taskInfo1.displayId; - taskInfo5.cameraCompatControlState = TaskInfo.CAMERA_COMPAT_CONTROL_DISMISSED; + taskInfo5.appCompatTaskInfo.cameraCompatControlState = + CAMERA_COMPAT_CONTROL_DISMISSED; taskInfo5.isVisible = true; mOrganizer.onTaskInfoChanged(taskInfo5); verify(mCompatUI).onCompatInfoChanged(taskInfo5, null /* taskListener */); @@ -489,7 +496,8 @@ public class ShellTaskOrganizerTests extends ShellTestCase { final RunningTaskInfo taskInfo6 = createTaskInfo(taskInfo1.taskId, taskInfo1.getWindowingMode()); taskInfo6.displayId = taskInfo1.displayId; - taskInfo6.cameraCompatControlState = TaskInfo.CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED; + taskInfo6.appCompatTaskInfo.cameraCompatControlState = + CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED; taskInfo6.isVisible = false; mOrganizer.onTaskInfoChanged(taskInfo6); verify(mCompatUI).onCompatInfoChanged(taskInfo6, null /* taskListener */); diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/CompatUIControllerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/CompatUIControllerTest.java index f85d707d55f9..fef81af8946b 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/CompatUIControllerTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/CompatUIControllerTest.java @@ -16,8 +16,8 @@ package com.android.wm.shell.compatui; -import static android.app.TaskInfo.CAMERA_COMPAT_CONTROL_HIDDEN; -import static android.app.TaskInfo.CAMERA_COMPAT_CONTROL_TREATMENT_APPLIED; +import static android.app.AppCompatTaskInfo.CAMERA_COMPAT_CONTROL_HIDDEN; +import static android.app.AppCompatTaskInfo.CAMERA_COMPAT_CONTROL_TREATMENT_APPLIED; import static android.view.WindowInsets.Type.navigationBars; import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn; @@ -34,8 +34,8 @@ import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import android.app.ActivityManager.RunningTaskInfo; +import android.app.AppCompatTaskInfo.CameraCompatControlState; import android.app.TaskInfo; -import android.app.TaskInfo.CameraCompatControlState; import android.content.Context; import android.content.res.Configuration; import android.testing.AndroidTestingRunner; @@ -688,8 +688,8 @@ public class CompatUIControllerTest extends ShellTestCase { RunningTaskInfo taskInfo = new RunningTaskInfo(); taskInfo.taskId = taskId; taskInfo.displayId = displayId; - taskInfo.topActivityInSizeCompat = hasSizeCompat; - taskInfo.cameraCompatControlState = cameraCompatControlState; + taskInfo.appCompatTaskInfo.topActivityInSizeCompat = hasSizeCompat; + taskInfo.appCompatTaskInfo.cameraCompatControlState = cameraCompatControlState; taskInfo.isVisible = isVisible; taskInfo.isFocused = isFocused; taskInfo.isTopActivityTransparent = isTopActivityTransparent; diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/CompatUILayoutTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/CompatUILayoutTest.java index 3bce2b824e28..23a4e3956289 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/CompatUILayoutTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/CompatUILayoutTest.java @@ -16,10 +16,10 @@ package com.android.wm.shell.compatui; -import static android.app.TaskInfo.CAMERA_COMPAT_CONTROL_DISMISSED; -import static android.app.TaskInfo.CAMERA_COMPAT_CONTROL_HIDDEN; -import static android.app.TaskInfo.CAMERA_COMPAT_CONTROL_TREATMENT_APPLIED; -import static android.app.TaskInfo.CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED; +import static android.app.AppCompatTaskInfo.CAMERA_COMPAT_CONTROL_DISMISSED; +import static android.app.AppCompatTaskInfo.CAMERA_COMPAT_CONTROL_HIDDEN; +import static android.app.AppCompatTaskInfo.CAMERA_COMPAT_CONTROL_TREATMENT_APPLIED; +import static android.app.AppCompatTaskInfo.CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED; import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn; @@ -28,8 +28,8 @@ import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.verify; import android.app.ActivityManager; +import android.app.AppCompatTaskInfo.CameraCompatControlState; import android.app.TaskInfo; -import android.app.TaskInfo.CameraCompatControlState; import android.testing.AndroidTestingRunner; import android.util.Pair; import android.view.LayoutInflater; @@ -219,8 +219,8 @@ public class CompatUILayoutTest extends ShellTestCase { @CameraCompatControlState int cameraCompatControlState) { ActivityManager.RunningTaskInfo taskInfo = new ActivityManager.RunningTaskInfo(); taskInfo.taskId = TASK_ID; - taskInfo.topActivityInSizeCompat = hasSizeCompat; - taskInfo.cameraCompatControlState = cameraCompatControlState; + taskInfo.appCompatTaskInfo.topActivityInSizeCompat = hasSizeCompat; + taskInfo.appCompatTaskInfo.cameraCompatControlState = cameraCompatControlState; return taskInfo; } } diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/CompatUIWindowManagerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/CompatUIWindowManagerTest.java index 4c837e635939..d4b97ed55192 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/CompatUIWindowManagerTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/CompatUIWindowManagerTest.java @@ -16,10 +16,10 @@ package com.android.wm.shell.compatui; -import static android.app.TaskInfo.CAMERA_COMPAT_CONTROL_DISMISSED; -import static android.app.TaskInfo.CAMERA_COMPAT_CONTROL_HIDDEN; -import static android.app.TaskInfo.CAMERA_COMPAT_CONTROL_TREATMENT_APPLIED; -import static android.app.TaskInfo.CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED; +import static android.app.AppCompatTaskInfo.CAMERA_COMPAT_CONTROL_DISMISSED; +import static android.app.AppCompatTaskInfo.CAMERA_COMPAT_CONTROL_HIDDEN; +import static android.app.AppCompatTaskInfo.CAMERA_COMPAT_CONTROL_TREATMENT_APPLIED; +import static android.app.AppCompatTaskInfo.CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED; import static android.view.WindowInsets.Type.navigationBars; import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn; @@ -35,6 +35,7 @@ import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import android.app.ActivityManager; +import android.app.AppCompatTaskInfo; import android.app.TaskInfo; import android.content.res.Configuration; import android.graphics.Rect; @@ -464,11 +465,11 @@ public class CompatUIWindowManagerTest extends ShellTestCase { } private static TaskInfo createTaskInfo(boolean hasSizeCompat, - @TaskInfo.CameraCompatControlState int cameraCompatControlState) { + @AppCompatTaskInfo.CameraCompatControlState int cameraCompatControlState) { ActivityManager.RunningTaskInfo taskInfo = new ActivityManager.RunningTaskInfo(); taskInfo.taskId = TASK_ID; - taskInfo.topActivityInSizeCompat = hasSizeCompat; - taskInfo.cameraCompatControlState = cameraCompatControlState; + taskInfo.appCompatTaskInfo.topActivityInSizeCompat = hasSizeCompat; + taskInfo.appCompatTaskInfo.cameraCompatControlState = cameraCompatControlState; taskInfo.configuration.uiMode &= ~Configuration.UI_MODE_TYPE_DESK; return taskInfo; } diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/LetterboxEduWindowManagerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/LetterboxEduWindowManagerTest.java index 9200b3c90f0d..a60a1cbb435f 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/LetterboxEduWindowManagerTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/LetterboxEduWindowManagerTest.java @@ -477,7 +477,7 @@ public class LetterboxEduWindowManagerTest extends ShellTestCase { ActivityManager.RunningTaskInfo taskInfo = new ActivityManager.RunningTaskInfo(); taskInfo.userId = userId; taskInfo.taskId = TASK_ID; - taskInfo.topActivityEligibleForLetterboxEducation = eligible; + taskInfo.appCompatTaskInfo.topActivityEligibleForLetterboxEducation = eligible; taskInfo.configuration.windowConfiguration.setBounds(bounds); return taskInfo; } diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/UserAspectRatioSettingsLayoutTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/UserAspectRatioSettingsLayoutTest.java index f460d1b09e34..38d6ea1839c4 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/UserAspectRatioSettingsLayoutTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/UserAspectRatioSettingsLayoutTest.java @@ -16,7 +16,7 @@ package com.android.wm.shell.compatui; -import static android.app.TaskInfo.CAMERA_COMPAT_CONTROL_HIDDEN; +import static android.app.AppCompatTaskInfo.CAMERA_COMPAT_CONTROL_HIDDEN; import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn; @@ -25,8 +25,8 @@ import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.verify; import android.app.ActivityManager; +import android.app.AppCompatTaskInfo.CameraCompatControlState; import android.app.TaskInfo; -import android.app.TaskInfo.CameraCompatControlState; import android.content.ComponentName; import android.testing.AndroidTestingRunner; import android.util.Pair; @@ -147,8 +147,8 @@ public class UserAspectRatioSettingsLayoutTest extends ShellTestCase { @CameraCompatControlState int cameraCompatControlState) { ActivityManager.RunningTaskInfo taskInfo = new ActivityManager.RunningTaskInfo(); taskInfo.taskId = TASK_ID; - taskInfo.topActivityInSizeCompat = hasSizeCompat; - taskInfo.cameraCompatControlState = cameraCompatControlState; + taskInfo.appCompatTaskInfo.topActivityInSizeCompat = hasSizeCompat; + taskInfo.appCompatTaskInfo.cameraCompatControlState = cameraCompatControlState; taskInfo.realActivity = new ComponentName("com.mypackage.test", "TestActivity"); return taskInfo; } diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/UserAspectRatioSettingsWindowManagerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/UserAspectRatioSettingsWindowManagerTest.java index 5a4d6c812c17..065293960da7 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/UserAspectRatioSettingsWindowManagerTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/UserAspectRatioSettingsWindowManagerTest.java @@ -381,8 +381,9 @@ public class UserAspectRatioSettingsWindowManagerTest extends ShellTestCase { boolean topActivityBoundsLetterboxed) { ActivityManager.RunningTaskInfo taskInfo = new ActivityManager.RunningTaskInfo(); taskInfo.taskId = TASK_ID; - taskInfo.topActivityEligibleForUserAspectRatioButton = eligibleForUserAspectRatioButton; - taskInfo.topActivityBoundsLetterboxed = topActivityBoundsLetterboxed; + taskInfo.appCompatTaskInfo.topActivityEligibleForUserAspectRatioButton = + eligibleForUserAspectRatioButton; + taskInfo.appCompatTaskInfo.topActivityBoundsLetterboxed = topActivityBoundsLetterboxed; taskInfo.configuration.uiMode &= ~Configuration.UI_MODE_TYPE_DESK; taskInfo.realActivity = new ComponentName("com.mypackage.test", "TestActivity"); return taskInfo; diff --git a/services/core/java/com/android/server/wm/ActivityMetricsLogger.java b/services/core/java/com/android/server/wm/ActivityMetricsLogger.java index a6d5c19395b0..7b20529ce5e1 100644 --- a/services/core/java/com/android/server/wm/ActivityMetricsLogger.java +++ b/services/core/java/com/android/server/wm/ActivityMetricsLogger.java @@ -4,6 +4,10 @@ import static android.app.ActivityManager.PROCESS_STATE_NONEXISTENT; import static android.app.ActivityManager.START_SUCCESS; import static android.app.ActivityManager.START_TASK_TO_FRONT; import static android.app.ActivityManager.processStateAmToProto; +import static android.app.AppCompatTaskInfo.CAMERA_COMPAT_CONTROL_DISMISSED; +import static android.app.AppCompatTaskInfo.CAMERA_COMPAT_CONTROL_HIDDEN; +import static android.app.AppCompatTaskInfo.CAMERA_COMPAT_CONTROL_TREATMENT_APPLIED; +import static android.app.AppCompatTaskInfo.CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED; import static android.app.WaitResult.INVALID_DELAY; import static android.app.WaitResult.LAUNCH_STATE_COLD; import static android.app.WaitResult.LAUNCH_STATE_HOT; @@ -84,8 +88,7 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.app.ActivityOptions; import android.app.ActivityOptions.SourceInfo; -import android.app.TaskInfo; -import android.app.TaskInfo.CameraCompatControlState; +import android.app.AppCompatTaskInfo.CameraCompatControlState; import android.app.WaitResult; import android.app.WindowConfiguration.WindowingMode; import android.content.ComponentName; @@ -1602,17 +1605,17 @@ class ActivityMetricsLogger { void logCameraCompatControlAppearedEventReported(@CameraCompatControlState int state, int packageUid) { switch (state) { - case TaskInfo.CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED: + case CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED: logCameraCompatControlEventReported( CAMERA_COMPAT_CONTROL_EVENT_REPORTED__EVENT__APPEARED_APPLY_TREATMENT, packageUid); break; - case TaskInfo.CAMERA_COMPAT_CONTROL_TREATMENT_APPLIED: + case CAMERA_COMPAT_CONTROL_TREATMENT_APPLIED: logCameraCompatControlEventReported( CAMERA_COMPAT_CONTROL_EVENT_REPORTED__EVENT__APPEARED_REVERT_TREATMENT, packageUid); break; - case TaskInfo.CAMERA_COMPAT_CONTROL_HIDDEN: + case CAMERA_COMPAT_CONTROL_HIDDEN: // Nothing to log. break; default: @@ -1629,17 +1632,17 @@ class ActivityMetricsLogger { void logCameraCompatControlClickedEventReported(@CameraCompatControlState int state, int packageUid) { switch (state) { - case TaskInfo.CAMERA_COMPAT_CONTROL_TREATMENT_APPLIED: + case CAMERA_COMPAT_CONTROL_TREATMENT_APPLIED: logCameraCompatControlEventReported( CAMERA_COMPAT_CONTROL_EVENT_REPORTED__EVENT__CLICKED_APPLY_TREATMENT, packageUid); break; - case TaskInfo.CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED: + case CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED: logCameraCompatControlEventReported( CAMERA_COMPAT_CONTROL_EVENT_REPORTED__EVENT__CLICKED_REVERT_TREATMENT, packageUid); break; - case TaskInfo.CAMERA_COMPAT_CONTROL_DISMISSED: + case CAMERA_COMPAT_CONTROL_DISMISSED: logCameraCompatControlEventReported( CAMERA_COMPAT_CONTROL_EVENT_REPORTED__EVENT__CLICKED_DISMISS, packageUid); diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index d6637e18afd3..eeeca1018b0a 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -31,6 +31,10 @@ import static android.app.ActivityOptions.ANIM_THUMBNAIL_SCALE_DOWN; import static android.app.ActivityOptions.ANIM_THUMBNAIL_SCALE_UP; import static android.app.ActivityOptions.ANIM_UNDEFINED; import static android.app.ActivityTaskManager.INVALID_TASK_ID; +import static android.app.AppCompatTaskInfo.CAMERA_COMPAT_CONTROL_DISMISSED; +import static android.app.AppCompatTaskInfo.CAMERA_COMPAT_CONTROL_HIDDEN; +import static android.app.AppCompatTaskInfo.CAMERA_COMPAT_CONTROL_TREATMENT_APPLIED; +import static android.app.AppCompatTaskInfo.CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED; import static android.app.AppOpsManager.MODE_ALLOWED; import static android.app.AppOpsManager.OP_PICTURE_IN_PICTURE; import static android.app.WaitResult.INVALID_DELAY; @@ -258,13 +262,13 @@ import android.annotation.Size; import android.app.Activity; import android.app.ActivityManager.TaskDescription; import android.app.ActivityOptions; +import android.app.AppCompatTaskInfo; +import android.app.AppCompatTaskInfo.CameraCompatControlState; import android.app.ICompatCameraControlCallback; import android.app.IScreenCaptureObserver; import android.app.PendingIntent; import android.app.PictureInPictureParams; import android.app.ResultInfo; -import android.app.TaskInfo; -import android.app.TaskInfo.CameraCompatControlState; import android.app.WaitResult; import android.app.WindowConfiguration; import android.app.admin.DevicePolicyManager; @@ -810,7 +814,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // State of the Camera app compat control which is used to correct stretched viewfinder // in apps that don't handle all possible configurations and changes between them correctly. @CameraCompatControlState - private int mCameraCompatControlState = TaskInfo.CAMERA_COMPAT_CONTROL_HIDDEN; + private int mCameraCompatControlState = CAMERA_COMPAT_CONTROL_HIDDEN; // The callback that allows to ask the calling View to apply the treatment for stretched @@ -1323,7 +1327,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A mLetterboxUiController.dump(pw, prefix); pw.println(prefix + "mCameraCompatControlState=" - + TaskInfo.cameraCompatControlStateToString(mCameraCompatControlState)); + + AppCompatTaskInfo.cameraCompatControlStateToString(mCameraCompatControlState)); pw.println(prefix + "mCameraCompatControlEnabled=" + mCameraCompatControlEnabled); } @@ -1861,24 +1865,24 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A return; } if (mCameraCompatControlClickedByUser && (showControl - || mCameraCompatControlState == TaskInfo.CAMERA_COMPAT_CONTROL_DISMISSED)) { + || mCameraCompatControlState == CAMERA_COMPAT_CONTROL_DISMISSED)) { // The user already applied treatment on this activity or dismissed control. // Respecting their choice. return; } mCompatCameraControlCallback = callback; int newCameraCompatControlState = !showControl - ? TaskInfo.CAMERA_COMPAT_CONTROL_HIDDEN + ? CAMERA_COMPAT_CONTROL_HIDDEN : transformationApplied - ? TaskInfo.CAMERA_COMPAT_CONTROL_TREATMENT_APPLIED - : TaskInfo.CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED; + ? CAMERA_COMPAT_CONTROL_TREATMENT_APPLIED + : CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED; boolean changed = setCameraCompatControlState(newCameraCompatControlState); if (!changed) { return; } mTaskSupervisor.getActivityMetricsLogger().logCameraCompatControlAppearedEventReported( newCameraCompatControlState, info.applicationInfo.uid); - if (newCameraCompatControlState == TaskInfo.CAMERA_COMPAT_CONTROL_HIDDEN) { + if (newCameraCompatControlState == CAMERA_COMPAT_CONTROL_HIDDEN) { mCameraCompatControlClickedByUser = false; mCompatCameraControlCallback = null; } @@ -1896,7 +1900,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // Feature is disabled by config_isCameraCompatControlForStretchedIssuesEnabled. return; } - if (state == TaskInfo.CAMERA_COMPAT_CONTROL_HIDDEN) { + if (state == CAMERA_COMPAT_CONTROL_HIDDEN) { Slog.w(TAG, "Unexpected hidden state in updateCameraCompatState"); return; } @@ -1907,7 +1911,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A } mTaskSupervisor.getActivityMetricsLogger().logCameraCompatControlClickedEventReported( state, info.applicationInfo.uid); - if (state == TaskInfo.CAMERA_COMPAT_CONTROL_DISMISSED) { + if (state == CAMERA_COMPAT_CONTROL_DISMISSED) { mCompatCameraControlCallback = null; return; } @@ -1916,7 +1920,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A return; } try { - if (state == TaskInfo.CAMERA_COMPAT_CONTROL_TREATMENT_APPLIED) { + if (state == CAMERA_COMPAT_CONTROL_TREATMENT_APPLIED) { mCompatCameraControlCallback.applyCameraCompatTreatment(); } else { mCompatCameraControlCallback.revertCameraCompatTreatment(); diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 5c5a1e1d23dc..6f19425f0b46 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -137,6 +137,7 @@ import android.app.ActivityManager.RecentTaskInfo.PersistedTaskSnapshotData; import android.app.ActivityManager.TaskDescription; import android.app.ActivityOptions; import android.app.ActivityTaskManager; +import android.app.AppCompatTaskInfo; import android.app.AppGlobals; import android.app.IActivityController; import android.app.PictureInPictureParams; @@ -3462,20 +3463,21 @@ class Task extends TaskFragment { && top.getOrganizedTask() == this && top.isState(RESUMED); final boolean isTopActivityVisible = top != null && top.getOrganizedTask() == this && top.isVisible(); + final AppCompatTaskInfo appCompatTaskInfo = info.appCompatTaskInfo; // Whether the direct top activity is in size compat mode - info.topActivityInSizeCompat = isTopActivityVisible && top.inSizeCompatMode(); - if (info.topActivityInSizeCompat + appCompatTaskInfo.topActivityInSizeCompat = isTopActivityVisible && top.inSizeCompatMode(); + if (appCompatTaskInfo.topActivityInSizeCompat && mWmService.mLetterboxConfiguration.isTranslucentLetterboxingEnabled()) { // We hide the restart button in case of transparent activities. - info.topActivityInSizeCompat = top.fillsParent(); + appCompatTaskInfo.topActivityInSizeCompat = top.fillsParent(); } // Whether the direct top activity is eligible for letterbox education. - info.topActivityEligibleForLetterboxEducation = isTopActivityResumed + appCompatTaskInfo.topActivityEligibleForLetterboxEducation = isTopActivityResumed && top.isEligibleForLetterboxEducation(); // Whether the direct top activity requested showing camera compat control. - info.cameraCompatControlState = isTopActivityResumed + appCompatTaskInfo.cameraCompatControlState = isTopActivityResumed ? top.getCameraCompatControlState() - : TaskInfo.CAMERA_COMPAT_CONTROL_HIDDEN; + : AppCompatTaskInfo.CAMERA_COMPAT_CONTROL_HIDDEN; final Task parentTask = getParent() != null ? getParent().asTask() : null; info.parentTaskId = parentTask != null && parentTask.mCreatedByOrganizer @@ -3485,34 +3487,34 @@ class Task extends TaskFragment { info.isVisible = hasVisibleChildren(); info.isVisibleRequested = isVisibleRequested(); info.isSleeping = shouldSleepActivities(); - info.isLetterboxDoubleTapEnabled = top != null + info.isTopActivityTransparent = top != null && !top.fillsParent(); + appCompatTaskInfo.isLetterboxDoubleTapEnabled = top != null && top.mLetterboxUiController.isLetterboxDoubleTapEducationEnabled(); - info.topActivityLetterboxVerticalPosition = TaskInfo.PROPERTY_VALUE_UNSET; - info.topActivityLetterboxHorizontalPosition = TaskInfo.PROPERTY_VALUE_UNSET; - info.topActivityLetterboxWidth = TaskInfo.PROPERTY_VALUE_UNSET; - info.topActivityLetterboxHeight = TaskInfo.PROPERTY_VALUE_UNSET; - info.isUserFullscreenOverrideEnabled = top != null + appCompatTaskInfo.topActivityLetterboxVerticalPosition = TaskInfo.PROPERTY_VALUE_UNSET; + appCompatTaskInfo.topActivityLetterboxHorizontalPosition = TaskInfo.PROPERTY_VALUE_UNSET; + appCompatTaskInfo.topActivityLetterboxWidth = TaskInfo.PROPERTY_VALUE_UNSET; + appCompatTaskInfo.topActivityLetterboxHeight = TaskInfo.PROPERTY_VALUE_UNSET; + appCompatTaskInfo.isUserFullscreenOverrideEnabled = top != null && top.mLetterboxUiController.shouldApplyUserFullscreenOverride(); - info.isTopActivityTransparent = top != null && !top.fillsParent(); - info.isFromLetterboxDoubleTap = top != null && top.mLetterboxUiController.isFromDoubleTap(); - if (info.isLetterboxDoubleTapEnabled) { - info.topActivityLetterboxWidth = top.getBounds().width(); - info.topActivityLetterboxHeight = top.getBounds().height(); - if (info.topActivityLetterboxWidth < info.topActivityLetterboxHeight) { + appCompatTaskInfo.isFromLetterboxDoubleTap = top != null + && top.mLetterboxUiController.isFromDoubleTap(); + if (appCompatTaskInfo.isLetterboxDoubleTapEnabled) { + appCompatTaskInfo.topActivityLetterboxWidth = top.getBounds().width(); + appCompatTaskInfo.topActivityLetterboxHeight = top.getBounds().height(); + if (appCompatTaskInfo.isTopActivityPillarboxed()) { // Pillarboxed - info.topActivityLetterboxHorizontalPosition = + appCompatTaskInfo.topActivityLetterboxHorizontalPosition = top.mLetterboxUiController.getLetterboxPositionForHorizontalReachability(); } else { // Letterboxed - info.topActivityLetterboxVerticalPosition = + appCompatTaskInfo.topActivityLetterboxVerticalPosition = top.mLetterboxUiController.getLetterboxPositionForVerticalReachability(); } } - // User Aspect Ratio Settings is enabled if the app is not in SCM - info.topActivityEligibleForUserAspectRatioButton = top != null - && !info.topActivityInSizeCompat + appCompatTaskInfo.topActivityEligibleForUserAspectRatioButton = top != null + && !appCompatTaskInfo.topActivityInSizeCompat && top.mLetterboxUiController.shouldEnableUserAspectRatioSettings(); - info.topActivityBoundsLetterboxed = top != null && top.areBoundsLetterboxed(); + appCompatTaskInfo.topActivityBoundsLetterboxed = top != null && top.areBoundsLetterboxed(); } /** diff --git a/services/core/java/com/android/server/wm/TaskOrganizerController.java b/services/core/java/com/android/server/wm/TaskOrganizerController.java index 12392a63a467..f1481760a5e7 100644 --- a/services/core/java/com/android/server/wm/TaskOrganizerController.java +++ b/services/core/java/com/android/server/wm/TaskOrganizerController.java @@ -17,7 +17,7 @@ package com.android.server.wm; import static android.app.ActivityTaskManager.INVALID_TASK_ID; -import static android.app.TaskInfo.cameraCompatControlStateToString; +import static android.app.AppCompatTaskInfo.cameraCompatControlStateToString; import static android.window.StartingWindowRemovalInfo.DEFER_MODE_NONE; import static android.window.StartingWindowRemovalInfo.DEFER_MODE_NORMAL; import static android.window.StartingWindowRemovalInfo.DEFER_MODE_ROTATION; diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java index 17367ef4c072..0c996e0155fd 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java @@ -18,10 +18,10 @@ package com.android.server.wm; import static android.app.AppOpsManager.MODE_ALLOWED; import static android.app.AppOpsManager.OP_PICTURE_IN_PICTURE; -import static android.app.TaskInfo.CAMERA_COMPAT_CONTROL_DISMISSED; -import static android.app.TaskInfo.CAMERA_COMPAT_CONTROL_HIDDEN; -import static android.app.TaskInfo.CAMERA_COMPAT_CONTROL_TREATMENT_APPLIED; -import static android.app.TaskInfo.CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED; +import static android.app.AppCompatTaskInfo.CAMERA_COMPAT_CONTROL_DISMISSED; +import static android.app.AppCompatTaskInfo.CAMERA_COMPAT_CONTROL_HIDDEN; +import static android.app.AppCompatTaskInfo.CAMERA_COMPAT_CONTROL_TREATMENT_APPLIED; +import static android.app.AppCompatTaskInfo.CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED; import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD; import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM; import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; diff --git a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java index 1ceb1a8c7097..a7c14c38b832 100644 --- a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java @@ -1117,7 +1117,7 @@ public class SizeCompatTests extends WindowTestsBase { verify(mTask).onSizeCompatActivityChanged(); ActivityManager.RunningTaskInfo taskInfo = mTask.getTaskInfo(); - assertTrue(taskInfo.topActivityInSizeCompat); + assertTrue(taskInfo.appCompatTaskInfo.topActivityInSizeCompat); // Make the activity resizable again by restarting it clearInvocations(mTask); @@ -1132,7 +1132,7 @@ public class SizeCompatTests extends WindowTestsBase { verify(mTask).onSizeCompatActivityChanged(); taskInfo = mTask.getTaskInfo(); - assertFalse(taskInfo.topActivityInSizeCompat); + assertFalse(taskInfo.appCompatTaskInfo.topActivityInSizeCompat); } @Test @@ -1150,7 +1150,7 @@ public class SizeCompatTests extends WindowTestsBase { verify(mTask).onSizeCompatActivityChanged(); ActivityManager.RunningTaskInfo taskInfo = mTask.getTaskInfo(); - assertTrue(taskInfo.topActivityInSizeCompat); + assertTrue(taskInfo.appCompatTaskInfo.topActivityInSizeCompat); // Create another Task to hold another size compat activity. clearInvocations(mTask); @@ -1170,7 +1170,7 @@ public class SizeCompatTests extends WindowTestsBase { verify(mTask, never()).onSizeCompatActivityChanged(); taskInfo = secondTask.getTaskInfo(); - assertTrue(taskInfo.topActivityInSizeCompat); + assertTrue(taskInfo.appCompatTaskInfo.topActivityInSizeCompat); } @Test @@ -4565,7 +4565,7 @@ public class SizeCompatTests extends WindowTestsBase { assertTrue(mActivity.inSizeCompatMode()); assertEquals(mActivity.getState(), PAUSED); assertTrue(mActivity.isVisible()); - assertTrue(mTask.getTaskInfo().topActivityInSizeCompat); + assertTrue(mTask.getTaskInfo().appCompatTaskInfo.topActivityInSizeCompat); } /** diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskTests.java index 435a8357dabb..898b7514a6aa 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TaskTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/TaskTests.java @@ -580,18 +580,21 @@ public class TaskTests extends WindowTestsBase { doReturn(task).when(root).getOrganizedTask(); // The button should be eligible to be displayed - assertTrue(task.getTaskInfo().topActivityEligibleForUserAspectRatioButton); + assertTrue(task.getTaskInfo() + .appCompatTaskInfo.topActivityEligibleForUserAspectRatioButton); // When shouldApplyUserMinAspectRatioOverride is disable the button is not enabled doReturn(false).when(root.mLetterboxUiController) .shouldEnableUserAspectRatioSettings(); - assertFalse(task.getTaskInfo().topActivityEligibleForUserAspectRatioButton); + assertFalse(task.getTaskInfo() + .appCompatTaskInfo.topActivityEligibleForUserAspectRatioButton); doReturn(true).when(root.mLetterboxUiController) .shouldEnableUserAspectRatioSettings(); // When in size compat mode the button is not enabled doReturn(true).when(root).inSizeCompatMode(); - assertFalse(task.getTaskInfo().topActivityEligibleForUserAspectRatioButton); + assertFalse(task.getTaskInfo() + .appCompatTaskInfo.topActivityEligibleForUserAspectRatioButton); doReturn(false).when(root).inSizeCompatMode(); } diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java index 2c3917387aec..1494f94f2052 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowOrganizerTests.java @@ -1598,7 +1598,7 @@ public class WindowOrganizerTests extends WindowTestsBase { verify(organizer).onTaskInfoChanged(infoCaptor.capture()); RunningTaskInfo info = infoCaptor.getValue(); assertEquals(rootTask.mTaskId, info.taskId); - assertTrue(info.topActivityInSizeCompat); + assertTrue(info.appCompatTaskInfo.topActivityInSizeCompat); // Ensure task info show top activity that is not visible as not in size compat. clearInvocations(organizer); @@ -1608,7 +1608,7 @@ public class WindowOrganizerTests extends WindowTestsBase { verify(organizer).onTaskInfoChanged(infoCaptor.capture()); info = infoCaptor.getValue(); assertEquals(rootTask.mTaskId, info.taskId); - assertFalse(info.topActivityInSizeCompat); + assertFalse(info.appCompatTaskInfo.topActivityInSizeCompat); // Ensure task info show non size compat top activity as not in size compat. clearInvocations(organizer); @@ -1619,7 +1619,7 @@ public class WindowOrganizerTests extends WindowTestsBase { verify(organizer).onTaskInfoChanged(infoCaptor.capture()); info = infoCaptor.getValue(); assertEquals(rootTask.mTaskId, info.taskId); - assertFalse(info.topActivityInSizeCompat); + assertFalse(info.appCompatTaskInfo.topActivityInSizeCompat); } @Test |