Loading core/java/android/app/AppCompatTaskInfo.java +15 −77 Original line number Diff line number Diff line Loading @@ -16,60 +16,16 @@ 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. */ Loading Loading @@ -135,6 +91,11 @@ public class AppCompatTaskInfo implements Parcelable { */ public int topActivityLetterboxHeight; /** * Stores camera-related app compat information about a particular Task. */ public CameraCompatTaskInfo cameraCompatTaskInfo = CameraCompatTaskInfo.create(); private AppCompatTaskInfo() { // Do nothing } Loading Loading @@ -166,19 +127,11 @@ public class AppCompatTaskInfo implements Parcelable { } }; /** * @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 return cameraCompatTaskInfo.hasCameraCompatUI() || topActivityInSizeCompat || topActivityEligibleForLetterboxEducation || isLetterboxDoubleTapEnabled || topActivityEligibleForUserAspectRatioButton; Loading Loading @@ -208,7 +161,8 @@ public class AppCompatTaskInfo implements Parcelable { && topActivityLetterboxHorizontalPosition == that.topActivityLetterboxHorizontalPosition && isUserFullscreenOverrideEnabled == that.isUserFullscreenOverrideEnabled && isSystemFullscreenOverrideEnabled == that.isSystemFullscreenOverrideEnabled; && isSystemFullscreenOverrideEnabled == that.isSystemFullscreenOverrideEnabled && cameraCompatTaskInfo.equalsForTaskOrganizer(that.cameraCompatTaskInfo); } /** Loading @@ -229,18 +183,17 @@ public class AppCompatTaskInfo implements Parcelable { == that.topActivityLetterboxHorizontalPosition && topActivityLetterboxWidth == that.topActivityLetterboxWidth && topActivityLetterboxHeight == that.topActivityLetterboxHeight && cameraCompatControlState == that.cameraCompatControlState && isUserFullscreenOverrideEnabled == that.isUserFullscreenOverrideEnabled && isSystemFullscreenOverrideEnabled == that.isSystemFullscreenOverrideEnabled; && isSystemFullscreenOverrideEnabled == that.isSystemFullscreenOverrideEnabled && cameraCompatTaskInfo.equalsForCompatUi(that.cameraCompatTaskInfo); } /** * Reads the TaskInfo from a parcel. * Reads the AppCompatTaskInfo 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(); Loading @@ -251,16 +204,16 @@ public class AppCompatTaskInfo implements Parcelable { topActivityLetterboxHeight = source.readInt(); isUserFullscreenOverrideEnabled = source.readBoolean(); isSystemFullscreenOverrideEnabled = source.readBoolean(); cameraCompatTaskInfo = source.readTypedObject(CameraCompatTaskInfo.CREATOR); } /** * Writes the TaskInfo to a parcel. * Writes the AppCompatTaskInfo 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); Loading @@ -271,6 +224,7 @@ public class AppCompatTaskInfo implements Parcelable { dest.writeInt(topActivityLetterboxHeight); dest.writeBoolean(isUserFullscreenOverrideEnabled); dest.writeBoolean(isSystemFullscreenOverrideEnabled); dest.writeTypedObject(cameraCompatTaskInfo, flags); } @Override Loading @@ -290,23 +244,7 @@ public class AppCompatTaskInfo implements Parcelable { + " topActivityLetterboxHeight=" + topActivityLetterboxHeight + " isUserFullscreenOverrideEnabled=" + isUserFullscreenOverrideEnabled + " isSystemFullscreenOverrideEnabled=" + isSystemFullscreenOverrideEnabled + " cameraCompatControlState=" + cameraCompatControlStateToString(cameraCompatControlState) + " cameraCompatTaskInfo=" + cameraCompatTaskInfo.toString() + "}"; } /** 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); } } } core/java/android/app/CameraCompatTaskInfo.java 0 → 100644 +225 −0 Original line number Diff line number Diff line /* * Copyright (C) 2024 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 Camera Compat information about a particular Task. * @hide */ public class CameraCompatTaskInfo 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; /** * The value to use when no camera compat treatment should be applied to a windowed task. */ public static final int CAMERA_COMPAT_FREEFORM_NONE = 0; /** * The value to use when portrait camera compat treatment should be applied to a windowed task. */ public static final int CAMERA_COMPAT_FREEFORM_PORTRAIT = 1; /** * The value to use when landscape camera compat treatment should be applied to a windowed task. */ public static final int CAMERA_COMPAT_FREEFORM_LANDSCAPE = 2; @Retention(RetentionPolicy.SOURCE) @IntDef(prefix = { "CAMERA_COMPAT_FREEFORM_" }, value = { CAMERA_COMPAT_FREEFORM_NONE, CAMERA_COMPAT_FREEFORM_PORTRAIT, CAMERA_COMPAT_FREEFORM_LANDSCAPE, }) public @interface FreeformCameraCompatMode {} /** * Whether the camera activity is letterboxed in freeform windowing mode to emulate expected * aspect ratio for fixed-orientation apps. * * <p>This field is used by the WM and the camera framework, to coordinate camera compat mode * setup. */ @FreeformCameraCompatMode public int freeformCameraCompatMode; private CameraCompatTaskInfo() { // Do nothing } @NonNull static CameraCompatTaskInfo create() { return new CameraCompatTaskInfo(); } private CameraCompatTaskInfo(Parcel source) { readFromParcel(source); } @Override public int describeContents() { return 0; } public static final Creator<CameraCompatTaskInfo> CREATOR = new Creator<>() { @Override public CameraCompatTaskInfo createFromParcel(Parcel in) { return new CameraCompatTaskInfo(in); } @Override public CameraCompatTaskInfo[] newArray(int size) { return new CameraCompatTaskInfo[size]; } }; /** * Reads the CameraCompatTaskInfo from a parcel. */ void readFromParcel(Parcel source) { cameraCompatControlState = source.readInt(); freeformCameraCompatMode = source.readInt(); } /** * Writes the CameraCompatTaskInfo to a parcel. */ @Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(cameraCompatControlState); dest.writeInt(freeformCameraCompatMode); } /** * @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 hasCameraCompatUI() { return hasCameraCompatControl(); } /** * @return {@code true} if the camera compat parameters that are important for task organizers * are equal. */ public boolean equalsForTaskOrganizer(@Nullable CameraCompatTaskInfo that) { if (that == null) { return false; } return freeformCameraCompatMode == that.freeformCameraCompatMode; } /** * @return {@code true} if parameters that are important for size compat have changed. */ public boolean equalsForCompatUi(@Nullable CameraCompatTaskInfo that) { if (that == null) { return false; } return cameraCompatControlState == that.cameraCompatControlState && freeformCameraCompatMode == that.freeformCameraCompatMode; } @Override public String toString() { return "CameraCompatTaskInfo { cameraCompatControlState=" + cameraCompatControlStateToString(cameraCompatControlState) + " freeformCameraCompatMode=" + freeformCameraCompatModeToString(freeformCameraCompatMode) + "}"; } /** Human readable version of the camera control state. */ @NonNull public static String cameraCompatControlStateToString( @CameraCompatControlState int cameraCompatControlState) { return switch (cameraCompatControlState) { case CAMERA_COMPAT_CONTROL_HIDDEN -> "hidden"; case CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED -> "treatment-suggested"; case CAMERA_COMPAT_CONTROL_TREATMENT_APPLIED -> "treatment-applied"; case CAMERA_COMPAT_CONTROL_DISMISSED -> "dismissed"; default -> throw new AssertionError( "Unexpected camera compat control state: " + cameraCompatControlState); }; } /** Human readable version of the freeform camera compat mode. */ @NonNull public static String freeformCameraCompatModeToString( @FreeformCameraCompatMode int freeformCameraCompatMode) { return switch (freeformCameraCompatMode) { case CAMERA_COMPAT_FREEFORM_NONE -> "inactive"; case CAMERA_COMPAT_FREEFORM_PORTRAIT -> "portrait"; case CAMERA_COMPAT_FREEFORM_LANDSCAPE -> "landscape"; default -> throw new AssertionError( "Unexpected camera compat mode: " + freeformCameraCompatMode); }; } } core/java/android/window/TaskOrganizer.java +1 −1 Original line number Diff line number Diff line Loading @@ -24,7 +24,7 @@ import android.annotation.RequiresPermission; import android.annotation.SuppressLint; import android.annotation.TestApi; import android.app.ActivityManager; import android.app.AppCompatTaskInfo.CameraCompatControlState; import android.app.CameraCompatTaskInfo.CameraCompatControlState; import android.os.IBinder; import android.os.RemoteException; import android.view.SurfaceControl; Loading libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java +3 −3 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.wm.shell; import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME; import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM; import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; Loading @@ -30,7 +31,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.CameraCompatTaskInfo.CameraCompatControlState; import android.app.TaskInfo; import android.app.WindowConfiguration; import android.content.LocusId; Loading Loading @@ -718,8 +719,7 @@ public class ShellTaskOrganizer extends TaskOrganizer implements } @Override public void onCameraControlStateUpdated( int taskId, @AppCompatTaskInfo.CameraCompatControlState int state) { public void onCameraControlStateUpdated(int taskId, @CameraCompatControlState int state) { final TaskAppearedInfo info; synchronized (mLock) { info = mTasks.get(taskId); Loading libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIController.java +1 −1 Original line number Diff line number Diff line Loading @@ -20,7 +20,7 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.AppCompatTaskInfo.CameraCompatControlState; import android.app.CameraCompatTaskInfo.CameraCompatControlState; import android.app.TaskInfo; import android.content.ComponentName; import android.content.Context; Loading Loading
core/java/android/app/AppCompatTaskInfo.java +15 −77 Original line number Diff line number Diff line Loading @@ -16,60 +16,16 @@ 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. */ Loading Loading @@ -135,6 +91,11 @@ public class AppCompatTaskInfo implements Parcelable { */ public int topActivityLetterboxHeight; /** * Stores camera-related app compat information about a particular Task. */ public CameraCompatTaskInfo cameraCompatTaskInfo = CameraCompatTaskInfo.create(); private AppCompatTaskInfo() { // Do nothing } Loading Loading @@ -166,19 +127,11 @@ public class AppCompatTaskInfo implements Parcelable { } }; /** * @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 return cameraCompatTaskInfo.hasCameraCompatUI() || topActivityInSizeCompat || topActivityEligibleForLetterboxEducation || isLetterboxDoubleTapEnabled || topActivityEligibleForUserAspectRatioButton; Loading Loading @@ -208,7 +161,8 @@ public class AppCompatTaskInfo implements Parcelable { && topActivityLetterboxHorizontalPosition == that.topActivityLetterboxHorizontalPosition && isUserFullscreenOverrideEnabled == that.isUserFullscreenOverrideEnabled && isSystemFullscreenOverrideEnabled == that.isSystemFullscreenOverrideEnabled; && isSystemFullscreenOverrideEnabled == that.isSystemFullscreenOverrideEnabled && cameraCompatTaskInfo.equalsForTaskOrganizer(that.cameraCompatTaskInfo); } /** Loading @@ -229,18 +183,17 @@ public class AppCompatTaskInfo implements Parcelable { == that.topActivityLetterboxHorizontalPosition && topActivityLetterboxWidth == that.topActivityLetterboxWidth && topActivityLetterboxHeight == that.topActivityLetterboxHeight && cameraCompatControlState == that.cameraCompatControlState && isUserFullscreenOverrideEnabled == that.isUserFullscreenOverrideEnabled && isSystemFullscreenOverrideEnabled == that.isSystemFullscreenOverrideEnabled; && isSystemFullscreenOverrideEnabled == that.isSystemFullscreenOverrideEnabled && cameraCompatTaskInfo.equalsForCompatUi(that.cameraCompatTaskInfo); } /** * Reads the TaskInfo from a parcel. * Reads the AppCompatTaskInfo 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(); Loading @@ -251,16 +204,16 @@ public class AppCompatTaskInfo implements Parcelable { topActivityLetterboxHeight = source.readInt(); isUserFullscreenOverrideEnabled = source.readBoolean(); isSystemFullscreenOverrideEnabled = source.readBoolean(); cameraCompatTaskInfo = source.readTypedObject(CameraCompatTaskInfo.CREATOR); } /** * Writes the TaskInfo to a parcel. * Writes the AppCompatTaskInfo 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); Loading @@ -271,6 +224,7 @@ public class AppCompatTaskInfo implements Parcelable { dest.writeInt(topActivityLetterboxHeight); dest.writeBoolean(isUserFullscreenOverrideEnabled); dest.writeBoolean(isSystemFullscreenOverrideEnabled); dest.writeTypedObject(cameraCompatTaskInfo, flags); } @Override Loading @@ -290,23 +244,7 @@ public class AppCompatTaskInfo implements Parcelable { + " topActivityLetterboxHeight=" + topActivityLetterboxHeight + " isUserFullscreenOverrideEnabled=" + isUserFullscreenOverrideEnabled + " isSystemFullscreenOverrideEnabled=" + isSystemFullscreenOverrideEnabled + " cameraCompatControlState=" + cameraCompatControlStateToString(cameraCompatControlState) + " cameraCompatTaskInfo=" + cameraCompatTaskInfo.toString() + "}"; } /** 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); } } }
core/java/android/app/CameraCompatTaskInfo.java 0 → 100644 +225 −0 Original line number Diff line number Diff line /* * Copyright (C) 2024 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 Camera Compat information about a particular Task. * @hide */ public class CameraCompatTaskInfo 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; /** * The value to use when no camera compat treatment should be applied to a windowed task. */ public static final int CAMERA_COMPAT_FREEFORM_NONE = 0; /** * The value to use when portrait camera compat treatment should be applied to a windowed task. */ public static final int CAMERA_COMPAT_FREEFORM_PORTRAIT = 1; /** * The value to use when landscape camera compat treatment should be applied to a windowed task. */ public static final int CAMERA_COMPAT_FREEFORM_LANDSCAPE = 2; @Retention(RetentionPolicy.SOURCE) @IntDef(prefix = { "CAMERA_COMPAT_FREEFORM_" }, value = { CAMERA_COMPAT_FREEFORM_NONE, CAMERA_COMPAT_FREEFORM_PORTRAIT, CAMERA_COMPAT_FREEFORM_LANDSCAPE, }) public @interface FreeformCameraCompatMode {} /** * Whether the camera activity is letterboxed in freeform windowing mode to emulate expected * aspect ratio for fixed-orientation apps. * * <p>This field is used by the WM and the camera framework, to coordinate camera compat mode * setup. */ @FreeformCameraCompatMode public int freeformCameraCompatMode; private CameraCompatTaskInfo() { // Do nothing } @NonNull static CameraCompatTaskInfo create() { return new CameraCompatTaskInfo(); } private CameraCompatTaskInfo(Parcel source) { readFromParcel(source); } @Override public int describeContents() { return 0; } public static final Creator<CameraCompatTaskInfo> CREATOR = new Creator<>() { @Override public CameraCompatTaskInfo createFromParcel(Parcel in) { return new CameraCompatTaskInfo(in); } @Override public CameraCompatTaskInfo[] newArray(int size) { return new CameraCompatTaskInfo[size]; } }; /** * Reads the CameraCompatTaskInfo from a parcel. */ void readFromParcel(Parcel source) { cameraCompatControlState = source.readInt(); freeformCameraCompatMode = source.readInt(); } /** * Writes the CameraCompatTaskInfo to a parcel. */ @Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(cameraCompatControlState); dest.writeInt(freeformCameraCompatMode); } /** * @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 hasCameraCompatUI() { return hasCameraCompatControl(); } /** * @return {@code true} if the camera compat parameters that are important for task organizers * are equal. */ public boolean equalsForTaskOrganizer(@Nullable CameraCompatTaskInfo that) { if (that == null) { return false; } return freeformCameraCompatMode == that.freeformCameraCompatMode; } /** * @return {@code true} if parameters that are important for size compat have changed. */ public boolean equalsForCompatUi(@Nullable CameraCompatTaskInfo that) { if (that == null) { return false; } return cameraCompatControlState == that.cameraCompatControlState && freeformCameraCompatMode == that.freeformCameraCompatMode; } @Override public String toString() { return "CameraCompatTaskInfo { cameraCompatControlState=" + cameraCompatControlStateToString(cameraCompatControlState) + " freeformCameraCompatMode=" + freeformCameraCompatModeToString(freeformCameraCompatMode) + "}"; } /** Human readable version of the camera control state. */ @NonNull public static String cameraCompatControlStateToString( @CameraCompatControlState int cameraCompatControlState) { return switch (cameraCompatControlState) { case CAMERA_COMPAT_CONTROL_HIDDEN -> "hidden"; case CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED -> "treatment-suggested"; case CAMERA_COMPAT_CONTROL_TREATMENT_APPLIED -> "treatment-applied"; case CAMERA_COMPAT_CONTROL_DISMISSED -> "dismissed"; default -> throw new AssertionError( "Unexpected camera compat control state: " + cameraCompatControlState); }; } /** Human readable version of the freeform camera compat mode. */ @NonNull public static String freeformCameraCompatModeToString( @FreeformCameraCompatMode int freeformCameraCompatMode) { return switch (freeformCameraCompatMode) { case CAMERA_COMPAT_FREEFORM_NONE -> "inactive"; case CAMERA_COMPAT_FREEFORM_PORTRAIT -> "portrait"; case CAMERA_COMPAT_FREEFORM_LANDSCAPE -> "landscape"; default -> throw new AssertionError( "Unexpected camera compat mode: " + freeformCameraCompatMode); }; } }
core/java/android/window/TaskOrganizer.java +1 −1 Original line number Diff line number Diff line Loading @@ -24,7 +24,7 @@ import android.annotation.RequiresPermission; import android.annotation.SuppressLint; import android.annotation.TestApi; import android.app.ActivityManager; import android.app.AppCompatTaskInfo.CameraCompatControlState; import android.app.CameraCompatTaskInfo.CameraCompatControlState; import android.os.IBinder; import android.os.RemoteException; import android.view.SurfaceControl; Loading
libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java +3 −3 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.wm.shell; import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME; import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM; import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; Loading @@ -30,7 +31,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.CameraCompatTaskInfo.CameraCompatControlState; import android.app.TaskInfo; import android.app.WindowConfiguration; import android.content.LocusId; Loading Loading @@ -718,8 +719,7 @@ public class ShellTaskOrganizer extends TaskOrganizer implements } @Override public void onCameraControlStateUpdated( int taskId, @AppCompatTaskInfo.CameraCompatControlState int state) { public void onCameraControlStateUpdated(int taskId, @CameraCompatControlState int state) { final TaskAppearedInfo info; synchronized (mLock) { info = mTasks.get(taskId); Loading
libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIController.java +1 −1 Original line number Diff line number Diff line Loading @@ -20,7 +20,7 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.AppCompatTaskInfo.CameraCompatControlState; import android.app.CameraCompatTaskInfo.CameraCompatControlState; import android.app.TaskInfo; import android.content.ComponentName; import android.content.Context; Loading