diff options
60 files changed, 968 insertions, 922 deletions
diff --git a/core/api/system-current.txt b/core/api/system-current.txt index 16c70174d5c2..ae5542be7548 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -3405,12 +3405,12 @@ package android.companion.virtual { public final class VirtualDeviceManager { method @NonNull @RequiresPermission(android.Manifest.permission.CREATE_VIRTUAL_DEVICE) public android.companion.virtual.VirtualDeviceManager.VirtualDevice createVirtualDevice(int, @NonNull android.companion.virtual.VirtualDeviceParams); - method @FlaggedApi("android.companion.virtual.flags.persistent_device_id_api") @NonNull public java.util.Set<java.lang.String> getAllPersistentDeviceIds(); - method @FlaggedApi("android.companion.virtual.flags.persistent_device_id_api") @Nullable public CharSequence getDisplayNameForPersistentDeviceId(@NonNull String); + method @NonNull public java.util.Set<java.lang.String> getAllPersistentDeviceIds(); + method @Nullable public CharSequence getDisplayNameForPersistentDeviceId(@NonNull String); field public static final int LAUNCH_FAILURE_NO_ACTIVITY = 2; // 0x2 field public static final int LAUNCH_FAILURE_PENDING_INTENT_CANCELED = 1; // 0x1 field public static final int LAUNCH_SUCCESS = 0; // 0x0 - field @FlaggedApi("android.companion.virtual.flags.persistent_device_id_api") public static final String PERSISTENT_DEVICE_ID_DEFAULT = "default:0"; + field public static final String PERSISTENT_DEVICE_ID_DEFAULT = "default:0"; } public static interface VirtualDeviceManager.ActivityListener { @@ -3432,7 +3432,7 @@ package android.companion.virtual { public static class VirtualDeviceManager.VirtualDevice implements java.lang.AutoCloseable { method public void addActivityListener(@NonNull java.util.concurrent.Executor, @NonNull android.companion.virtual.VirtualDeviceManager.ActivityListener); - method @FlaggedApi("android.companion.virtual.flags.dynamic_policy") public void addActivityPolicyExemption(@NonNull android.content.ComponentName); + method public void addActivityPolicyExemption(@NonNull android.content.ComponentName); method @FlaggedApi("android.companion.virtualdevice.flags.activity_control_api") public void addActivityPolicyExemption(@NonNull android.companion.virtual.ActivityPolicyExemption); method public void addSoundEffectListener(@NonNull java.util.concurrent.Executor, @NonNull android.companion.virtual.VirtualDeviceManager.SoundEffectListener); method public void close(); @@ -3448,7 +3448,7 @@ package android.companion.virtual { method @Deprecated @NonNull public android.hardware.input.VirtualMouse createVirtualMouse(@NonNull android.hardware.display.VirtualDisplay, @NonNull String, int, int); method @NonNull public android.hardware.input.VirtualNavigationTouchpad createVirtualNavigationTouchpad(@NonNull android.hardware.input.VirtualNavigationTouchpadConfig); method @FlaggedApi("android.companion.virtualdevice.flags.virtual_rotary") @NonNull public android.hardware.input.VirtualRotaryEncoder createVirtualRotaryEncoder(@NonNull android.hardware.input.VirtualRotaryEncoderConfig); - method @FlaggedApi("android.companion.virtual.flags.virtual_stylus") @NonNull public android.hardware.input.VirtualStylus createVirtualStylus(@NonNull android.hardware.input.VirtualStylusConfig); + method @NonNull public android.hardware.input.VirtualStylus createVirtualStylus(@NonNull android.hardware.input.VirtualStylusConfig); method @NonNull public android.hardware.input.VirtualTouchscreen createVirtualTouchscreen(@NonNull android.hardware.input.VirtualTouchscreenConfig); method @Deprecated @NonNull public android.hardware.input.VirtualTouchscreen createVirtualTouchscreen(@NonNull android.hardware.display.VirtualDisplay, @NonNull String, int, int); method public int getDeviceId(); @@ -3458,10 +3458,10 @@ package android.companion.virtual { method public void launchPendingIntent(int, @NonNull android.app.PendingIntent, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.IntConsumer); method public void registerIntentInterceptor(@NonNull android.content.IntentFilter, @NonNull java.util.concurrent.Executor, @NonNull android.companion.virtual.VirtualDeviceManager.IntentInterceptorCallback); method public void removeActivityListener(@NonNull android.companion.virtual.VirtualDeviceManager.ActivityListener); - method @FlaggedApi("android.companion.virtual.flags.dynamic_policy") public void removeActivityPolicyExemption(@NonNull android.content.ComponentName); + method public void removeActivityPolicyExemption(@NonNull android.content.ComponentName); method @FlaggedApi("android.companion.virtualdevice.flags.activity_control_api") public void removeActivityPolicyExemption(@NonNull android.companion.virtual.ActivityPolicyExemption); method public void removeSoundEffectListener(@NonNull android.companion.virtual.VirtualDeviceManager.SoundEffectListener); - method @FlaggedApi("android.companion.virtual.flags.dynamic_policy") public void setDevicePolicy(int, int); + method public void setDevicePolicy(int, int); method @FlaggedApi("android.companion.virtualdevice.flags.activity_control_api") public void setDevicePolicy(int, int, int); method @FlaggedApi("android.companion.virtual.flags.vdm_custom_ime") public void setDisplayImePolicy(int, int); method public void setShowPointerIcon(boolean); @@ -3481,7 +3481,7 @@ package android.companion.virtual { method @Deprecated public int getDefaultNavigationPolicy(); method public int getDevicePolicy(int); method @FlaggedApi("android.companion.virtualdevice.flags.device_aware_display_power") @NonNull public java.time.Duration getDimDuration(); - method @FlaggedApi("android.companion.virtual.flags.vdm_custom_home") @Nullable public android.content.ComponentName getHomeComponent(); + method @Nullable public android.content.ComponentName getHomeComponent(); method @FlaggedApi("android.companion.virtual.flags.vdm_custom_ime") @Nullable public android.content.ComponentName getInputMethodComponent(); method public int getLockState(); method @Nullable public String getName(); @@ -3498,11 +3498,11 @@ package android.companion.virtual { field public static final int LOCK_STATE_DEFAULT = 0; // 0x0 field @Deprecated public static final int NAVIGATION_POLICY_DEFAULT_ALLOWED = 0; // 0x0 field @Deprecated public static final int NAVIGATION_POLICY_DEFAULT_BLOCKED = 1; // 0x1 - field @FlaggedApi("android.companion.virtual.flags.dynamic_policy") public static final int POLICY_TYPE_ACTIVITY = 3; // 0x3 + field public static final int POLICY_TYPE_ACTIVITY = 3; // 0x3 field public static final int POLICY_TYPE_AUDIO = 1; // 0x1 field @FlaggedApi("android.companion.virtualdevice.flags.activity_control_api") public static final int POLICY_TYPE_BLOCKED_ACTIVITY = 6; // 0x6 field @FlaggedApi("android.companion.virtual.flags.virtual_camera") public static final int POLICY_TYPE_CAMERA = 5; // 0x5 - field @FlaggedApi("android.companion.virtual.flags.cross_device_clipboard") public static final int POLICY_TYPE_CLIPBOARD = 4; // 0x4 + field public static final int POLICY_TYPE_CLIPBOARD = 4; // 0x4 field @FlaggedApi("android.companion.virtualdevice.flags.default_device_camera_access_policy") public static final int POLICY_TYPE_DEFAULT_DEVICE_CAMERA_ACCESS = 7; // 0x7 field public static final int POLICY_TYPE_RECENTS = 2; // 0x2 field public static final int POLICY_TYPE_SENSORS = 0; // 0x0 @@ -3520,7 +3520,7 @@ package android.companion.virtual { method @Deprecated @NonNull public android.companion.virtual.VirtualDeviceParams.Builder setBlockedCrossTaskNavigations(@NonNull java.util.Set<android.content.ComponentName>); method @NonNull public android.companion.virtual.VirtualDeviceParams.Builder setDevicePolicy(int, int); method @FlaggedApi("android.companion.virtualdevice.flags.device_aware_display_power") @NonNull public android.companion.virtual.VirtualDeviceParams.Builder setDimDuration(@NonNull java.time.Duration); - method @FlaggedApi("android.companion.virtual.flags.vdm_custom_home") @NonNull public android.companion.virtual.VirtualDeviceParams.Builder setHomeComponent(@Nullable android.content.ComponentName); + method @NonNull public android.companion.virtual.VirtualDeviceParams.Builder setHomeComponent(@Nullable android.content.ComponentName); method @FlaggedApi("android.companion.virtual.flags.vdm_custom_ime") @NonNull public android.companion.virtual.VirtualDeviceParams.Builder setInputMethodComponent(@Nullable android.content.ComponentName); method @NonNull @RequiresPermission(value=android.Manifest.permission.ADD_ALWAYS_UNLOCKED_DISPLAY, conditional=true) public android.companion.virtual.VirtualDeviceParams.Builder setLockState(int); method @NonNull public android.companion.virtual.VirtualDeviceParams.Builder setName(@NonNull String); @@ -5332,13 +5332,13 @@ package android.hardware.display { public final class VirtualDisplayConfig implements android.os.Parcelable { method @FlaggedApi("android.companion.virtualdevice.flags.virtual_display_insets") @Nullable public android.view.DisplayCutout getDisplayCutout(); - method @FlaggedApi("android.companion.virtual.flags.vdm_custom_home") public boolean isHomeSupported(); + method public boolean isHomeSupported(); method @FlaggedApi("com.android.window.flags.vdm_force_app_universal_resizable_api") public boolean isIgnoreActivitySizeRestrictions(); } public static final class VirtualDisplayConfig.Builder { method @FlaggedApi("android.companion.virtualdevice.flags.virtual_display_insets") @NonNull public android.hardware.display.VirtualDisplayConfig.Builder setDisplayCutout(@Nullable android.view.DisplayCutout); - method @FlaggedApi("android.companion.virtual.flags.vdm_custom_home") @NonNull public android.hardware.display.VirtualDisplayConfig.Builder setHomeSupported(boolean); + method @NonNull public android.hardware.display.VirtualDisplayConfig.Builder setHomeSupported(boolean); method @FlaggedApi("com.android.window.flags.vdm_force_app_universal_resizable_api") @NonNull public android.hardware.display.VirtualDisplayConfig.Builder setIgnoreActivitySizeRestrictions(boolean); } @@ -5970,13 +5970,13 @@ package android.hardware.input { method @NonNull public android.hardware.input.VirtualRotaryEncoderScrollEvent.Builder setScrollAmount(@FloatRange(from=-1.0F, to=1.0f) float); } - @FlaggedApi("android.companion.virtual.flags.virtual_stylus") public class VirtualStylus implements java.io.Closeable { + public class VirtualStylus implements java.io.Closeable { method public void close(); method public void sendButtonEvent(@NonNull android.hardware.input.VirtualStylusButtonEvent); method public void sendMotionEvent(@NonNull android.hardware.input.VirtualStylusMotionEvent); } - @FlaggedApi("android.companion.virtual.flags.virtual_stylus") public final class VirtualStylusButtonEvent implements android.os.Parcelable { + public final class VirtualStylusButtonEvent implements android.os.Parcelable { method public int describeContents(); method public int getAction(); method public int getButtonCode(); @@ -5989,7 +5989,7 @@ package android.hardware.input { field @NonNull public static final android.os.Parcelable.Creator<android.hardware.input.VirtualStylusButtonEvent> CREATOR; } - @FlaggedApi("android.companion.virtual.flags.virtual_stylus") public static final class VirtualStylusButtonEvent.Builder { + public static final class VirtualStylusButtonEvent.Builder { ctor public VirtualStylusButtonEvent.Builder(); method @NonNull public android.hardware.input.VirtualStylusButtonEvent build(); method @NonNull public android.hardware.input.VirtualStylusButtonEvent.Builder setAction(int); @@ -5997,7 +5997,7 @@ package android.hardware.input { method @NonNull public android.hardware.input.VirtualStylusButtonEvent.Builder setEventTimeNanos(long); } - @FlaggedApi("android.companion.virtual.flags.virtual_stylus") public final class VirtualStylusConfig extends android.hardware.input.VirtualInputDeviceConfig implements android.os.Parcelable { + public final class VirtualStylusConfig extends android.hardware.input.VirtualInputDeviceConfig implements android.os.Parcelable { method public int describeContents(); method public int getHeight(); method public int getWidth(); @@ -6005,12 +6005,12 @@ package android.hardware.input { field @NonNull public static final android.os.Parcelable.Creator<android.hardware.input.VirtualStylusConfig> CREATOR; } - @FlaggedApi("android.companion.virtual.flags.virtual_stylus") public static final class VirtualStylusConfig.Builder extends android.hardware.input.VirtualInputDeviceConfig.Builder<android.hardware.input.VirtualStylusConfig.Builder> { + public static final class VirtualStylusConfig.Builder extends android.hardware.input.VirtualInputDeviceConfig.Builder<android.hardware.input.VirtualStylusConfig.Builder> { ctor public VirtualStylusConfig.Builder(@IntRange(from=1) int, @IntRange(from=1) int); method @NonNull public android.hardware.input.VirtualStylusConfig build(); } - @FlaggedApi("android.companion.virtual.flags.virtual_stylus") public final class VirtualStylusMotionEvent implements android.os.Parcelable { + public final class VirtualStylusMotionEvent implements android.os.Parcelable { method public int describeContents(); method public int getAction(); method public long getEventTimeNanos(); @@ -6029,7 +6029,7 @@ package android.hardware.input { field public static final int TOOL_TYPE_STYLUS = 2; // 0x2 } - @FlaggedApi("android.companion.virtual.flags.virtual_stylus") public static final class VirtualStylusMotionEvent.Builder { + public static final class VirtualStylusMotionEvent.Builder { ctor public VirtualStylusMotionEvent.Builder(); method @NonNull public android.hardware.input.VirtualStylusMotionEvent build(); method @NonNull public android.hardware.input.VirtualStylusMotionEvent.Builder setAction(int); diff --git a/core/java/android/app/ActivityOptions.java b/core/java/android/app/ActivityOptions.java index af6978a6b70c..82c746a8ad4c 100644 --- a/core/java/android/app/ActivityOptions.java +++ b/core/java/android/app/ActivityOptions.java @@ -1846,6 +1846,7 @@ public class ActivityOptions extends ComponentOptions { } /** @hide */ + @WindowConfiguration.WindowingMode public int getLaunchWindowingMode() { return mLaunchWindowingMode; } @@ -1855,7 +1856,7 @@ public class ActivityOptions extends ComponentOptions { * @hide */ @TestApi - public void setLaunchWindowingMode(int windowingMode) { + public void setLaunchWindowingMode(@WindowConfiguration.WindowingMode int windowingMode) { mLaunchWindowingMode = windowingMode; } diff --git a/core/java/android/companion/virtual/VirtualDeviceInternal.java b/core/java/android/companion/virtual/VirtualDeviceInternal.java index 311e24ba6254..3ef78affb7a5 100644 --- a/core/java/android/companion/virtual/VirtualDeviceInternal.java +++ b/core/java/android/companion/virtual/VirtualDeviceInternal.java @@ -32,7 +32,6 @@ import android.companion.virtual.audio.VirtualAudioDevice; import android.companion.virtual.camera.VirtualCamera; import android.companion.virtual.camera.VirtualCameraConfig; import android.companion.virtual.sensor.VirtualSensor; -import android.companion.virtualdevice.flags.Flags; import android.content.ComponentName; import android.content.Context; import android.content.Intent; @@ -473,14 +472,12 @@ public class VirtualDeviceInternal { @Nullable VirtualAudioDevice.AudioConfigurationChangeCallback callback) { if (mVirtualAudioDevice == null) { try { - Context context = mContext; - if (Flags.deviceAwareRecordAudioPermission()) { - // When using a default policy for audio device-aware RECORD_AUDIO permission - // should not take effect, thus register policies with the default context. - if (mVirtualDevice.getDevicePolicy(POLICY_TYPE_AUDIO) == DEVICE_POLICY_CUSTOM) { - context = mContext.createDeviceContext(getDeviceId()); - } - } + // When using a default policy for audio, the device-aware RECORD_AUDIO permission + // should not take effect, thus register policies with the default context. + final Context context = + mVirtualDevice.getDevicePolicy(POLICY_TYPE_AUDIO) == DEVICE_POLICY_CUSTOM + ? mContext.createDeviceContext(getDeviceId()) + : mContext; mVirtualAudioDevice = new VirtualAudioDevice(context, mVirtualDevice, display, executor, callback, () -> mVirtualAudioDevice = null); } catch (RemoteException e) { diff --git a/core/java/android/companion/virtual/VirtualDeviceManager.java b/core/java/android/companion/virtual/VirtualDeviceManager.java index 73ea9f0462d5..91ea673ab6f9 100644 --- a/core/java/android/companion/virtual/VirtualDeviceManager.java +++ b/core/java/android/companion/virtual/VirtualDeviceManager.java @@ -170,7 +170,6 @@ public final class VirtualDeviceManager { * @hide */ @SystemApi - @FlaggedApi(Flags.FLAG_PERSISTENT_DEVICE_ID_API) public static final String PERSISTENT_DEVICE_ID_DEFAULT = "default:" + Context.DEVICE_ID_DEFAULT; @@ -393,7 +392,6 @@ public final class VirtualDeviceManager { * @hide */ // TODO(b/315481938): Link @see VirtualDevice#getPersistentDeviceId() - @FlaggedApi(Flags.FLAG_PERSISTENT_DEVICE_ID_API) @SystemApi @Nullable public CharSequence getDisplayNameForPersistentDeviceId(@NonNull String persistentDeviceId) { @@ -416,7 +414,6 @@ public final class VirtualDeviceManager { * @hide */ // TODO(b/315481938): Link @see VirtualDevice#getPersistentDeviceId() - @FlaggedApi(Flags.FLAG_PERSISTENT_DEVICE_ID_API) @SystemApi @NonNull public Set<String> getAllPersistentDeviceIds() { @@ -780,7 +777,6 @@ public final class VirtualDeviceManager { * @see VirtualDeviceParams#POLICY_TYPE_RECENTS * @see VirtualDeviceParams#POLICY_TYPE_ACTIVITY */ - @FlaggedApi(Flags.FLAG_DYNAMIC_POLICY) public void setDevicePolicy(@VirtualDeviceParams.DynamicPolicyType int policyType, @VirtualDeviceParams.DevicePolicy int devicePolicy) { mVirtualDeviceInternal.setDevicePolicy(policyType, devicePolicy); @@ -802,7 +798,6 @@ public final class VirtualDeviceManager { * @see #removeActivityPolicyExemption(ComponentName) * @see #setDevicePolicy */ - @FlaggedApi(Flags.FLAG_DYNAMIC_POLICY) public void addActivityPolicyExemption(@NonNull ComponentName componentName) { addActivityPolicyExemption(new ActivityPolicyExemption.Builder() .setComponentName(componentName) @@ -825,7 +820,6 @@ public final class VirtualDeviceManager { * @see #addActivityPolicyExemption(ComponentName) * @see #setDevicePolicy */ - @FlaggedApi(Flags.FLAG_DYNAMIC_POLICY) public void removeActivityPolicyExemption(@NonNull ComponentName componentName) { removeActivityPolicyExemption(new ActivityPolicyExemption.Builder() .setComponentName(componentName) @@ -1037,9 +1031,7 @@ public final class VirtualDeviceManager { * @param config the touchscreen configurations for the virtual stylus. */ @NonNull - @FlaggedApi(Flags.FLAG_VIRTUAL_STYLUS) - public VirtualStylus createVirtualStylus( - @NonNull VirtualStylusConfig config) { + public VirtualStylus createVirtualStylus(@NonNull VirtualStylusConfig config) { return mVirtualDeviceInternal.createVirtualStylus(config); } diff --git a/core/java/android/companion/virtual/VirtualDeviceParams.java b/core/java/android/companion/virtual/VirtualDeviceParams.java index 2be27dabcf90..761e75bd9076 100644 --- a/core/java/android/companion/virtual/VirtualDeviceParams.java +++ b/core/java/android/companion/virtual/VirtualDeviceParams.java @@ -248,7 +248,6 @@ public final class VirtualDeviceParams implements Parcelable { */ // TODO(b/333443509): Update the documentation of custom policy and link to the new policy // POLICY_TYPE_BLOCKED_ACTIVITY - @FlaggedApi(Flags.FLAG_DYNAMIC_POLICY) public static final int POLICY_TYPE_ACTIVITY = 3; /** @@ -264,7 +263,6 @@ public final class VirtualDeviceParams implements Parcelable { * * @see android.hardware.display.DisplayManager#VIRTUAL_DISPLAY_FLAG_TRUSTED */ - @FlaggedApi(Flags.FLAG_CROSS_DEVICE_CLIPBOARD) public static final int POLICY_TYPE_CLIPBOARD = 4; /** @@ -431,7 +429,6 @@ public final class VirtualDeviceParams implements Parcelable { * @see Builder#setHomeComponent * @see VirtualDisplayConfig#isHomeSupported() */ - @FlaggedApi(Flags.FLAG_VDM_CUSTOM_HOME) @Nullable public ComponentName getHomeComponent() { return mHomeComponent; @@ -926,7 +923,6 @@ public final class VirtualDeviceParams implements Parcelable { * * @see VirtualDisplayConfig#isHomeSupported() */ - @FlaggedApi(Flags.FLAG_VDM_CUSTOM_HOME) @NonNull public Builder setHomeComponent(@Nullable ComponentName homeComponent) { mHomeComponent = homeComponent; @@ -1282,33 +1278,31 @@ public final class VirtualDeviceParams implements Parcelable { mVirtualSensorDirectChannelCallback); } - if (Flags.dynamicPolicy()) { - switch (mDevicePolicies.get(POLICY_TYPE_ACTIVITY, -1)) { - case DEVICE_POLICY_DEFAULT: - if (mDefaultActivityPolicyConfigured - && mDefaultActivityPolicy == ACTIVITY_POLICY_DEFAULT_BLOCKED) { - throw new IllegalArgumentException( - "DEVICE_POLICY_DEFAULT is explicitly configured for " - + "POLICY_TYPE_ACTIVITY, which is exclusive with " - + "setAllowedActivities."); - } - break; - case DEVICE_POLICY_CUSTOM: - if (mDefaultActivityPolicyConfigured - && mDefaultActivityPolicy == ACTIVITY_POLICY_DEFAULT_ALLOWED) { - throw new IllegalArgumentException( - "DEVICE_POLICY_CUSTOM is explicitly configured for " - + "POLICY_TYPE_ACTIVITY, which is exclusive with " - + "setBlockedActivities."); - } - break; - default: - if (mDefaultActivityPolicyConfigured - && mDefaultActivityPolicy == ACTIVITY_POLICY_DEFAULT_BLOCKED) { - mDevicePolicies.put(POLICY_TYPE_ACTIVITY, DEVICE_POLICY_CUSTOM); - } - break; - } + switch (mDevicePolicies.get(POLICY_TYPE_ACTIVITY, -1)) { + case DEVICE_POLICY_DEFAULT: + if (mDefaultActivityPolicyConfigured + && mDefaultActivityPolicy == ACTIVITY_POLICY_DEFAULT_BLOCKED) { + throw new IllegalArgumentException( + "DEVICE_POLICY_DEFAULT is explicitly configured for " + + "POLICY_TYPE_ACTIVITY, which is exclusive with " + + "setAllowedActivities."); + } + break; + case DEVICE_POLICY_CUSTOM: + if (mDefaultActivityPolicyConfigured + && mDefaultActivityPolicy == ACTIVITY_POLICY_DEFAULT_ALLOWED) { + throw new IllegalArgumentException( + "DEVICE_POLICY_CUSTOM is explicitly configured for " + + "POLICY_TYPE_ACTIVITY, which is exclusive with " + + "setBlockedActivities."); + } + break; + default: + if (mDefaultActivityPolicyConfigured + && mDefaultActivityPolicy == ACTIVITY_POLICY_DEFAULT_BLOCKED) { + mDevicePolicies.put(POLICY_TYPE_ACTIVITY, DEVICE_POLICY_CUSTOM); + } + break; } if (mDimDuration.compareTo(mScreenOffTimeout) > 0) { @@ -1319,10 +1313,6 @@ public final class VirtualDeviceParams implements Parcelable { mScreenOffTimeout = INFINITE_TIMEOUT; } - if (!Flags.crossDeviceClipboard()) { - mDevicePolicies.delete(POLICY_TYPE_CLIPBOARD); - } - if (!Flags.virtualCamera()) { mDevicePolicies.delete(POLICY_TYPE_CAMERA); } diff --git a/core/java/android/companion/virtual/flags/flags.aconfig b/core/java/android/companion/virtual/flags/flags.aconfig index 84af84072f1b..6da2a073ec19 100644 --- a/core/java/android/companion/virtual/flags/flags.aconfig +++ b/core/java/android/companion/virtual/flags/flags.aconfig @@ -19,14 +19,6 @@ flag { flag { namespace: "virtual_devices" - name: "device_aware_record_audio_permission" - description: "Enable device-aware RECORD_AUDIO permission" - bug: "291737188" - is_fixed_read_only: true -} - -flag { - namespace: "virtual_devices" name: "media_projection_keyguard_restrictions" description: "Auto-stop MP when the device locks" bug: "348335290" diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java index 2aa5e021415b..885a2dbc471e 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -4215,6 +4215,17 @@ public class Intent implements Parcelable, Cloneable { public static final String ACTION_USER_INFO_CHANGED = "android.intent.action.USER_INFO_CHANGED"; + + /** + * Broadcast sent to the system when a user's information changes. Carries an extra + * {@link #EXTRA_USER_HANDLE} to indicate which user's information changed. + * This is only sent to permission protected manifest receivers. It is sent to all users. + * @hide + */ + @BroadcastBehavior(includeBackground = true) + public static final String ACTION_USER_INFO_CHANGED_BACKGROUND = + "android.intent.action.USER_INFO_CHANGED_BACKGROUND"; + /** * Broadcast sent to the primary user when an associated managed profile is added (the profile * was created and is ready to be used). Carries an extra {@link #EXTRA_USER} that specifies diff --git a/core/java/android/hardware/display/VirtualDisplayConfig.java b/core/java/android/hardware/display/VirtualDisplayConfig.java index 72570553f78a..2a9ee7f07934 100644 --- a/core/java/android/hardware/display/VirtualDisplayConfig.java +++ b/core/java/android/hardware/display/VirtualDisplayConfig.java @@ -237,10 +237,9 @@ public final class VirtualDisplayConfig implements Parcelable { * @see Builder#setHomeSupported * @hide */ - @FlaggedApi(android.companion.virtual.flags.Flags.FLAG_VDM_CUSTOM_HOME) @SystemApi public boolean isHomeSupported() { - return android.companion.virtual.flags.Flags.vdmCustomHome() && mIsHomeSupported; + return mIsHomeSupported; } /** @@ -605,7 +604,6 @@ public final class VirtualDisplayConfig implements Parcelable { * @see DisplayManager#VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY * @hide */ - @FlaggedApi(android.companion.virtual.flags.Flags.FLAG_VDM_CUSTOM_HOME) @SystemApi @NonNull public Builder setHomeSupported(boolean isHomeSupported) { diff --git a/core/java/android/hardware/input/VirtualStylus.java b/core/java/android/hardware/input/VirtualStylus.java index 4b79bc482c7b..32aac2efb3c1 100644 --- a/core/java/android/hardware/input/VirtualStylus.java +++ b/core/java/android/hardware/input/VirtualStylus.java @@ -16,11 +16,9 @@ package android.hardware.input; -import android.annotation.FlaggedApi; import android.annotation.NonNull; import android.annotation.SystemApi; import android.companion.virtual.IVirtualDevice; -import android.companion.virtual.flags.Flags; import android.os.IBinder; import android.os.RemoteException; import android.util.Log; @@ -34,7 +32,6 @@ import android.util.Log; * * @hide */ -@FlaggedApi(Flags.FLAG_VIRTUAL_STYLUS) @SystemApi public class VirtualStylus extends VirtualInputDevice { /** @hide */ diff --git a/core/java/android/hardware/input/VirtualStylusButtonEvent.java b/core/java/android/hardware/input/VirtualStylusButtonEvent.java index 8fcf561bedcd..9fe725a627b4 100644 --- a/core/java/android/hardware/input/VirtualStylusButtonEvent.java +++ b/core/java/android/hardware/input/VirtualStylusButtonEvent.java @@ -16,11 +16,9 @@ package android.hardware.input; -import android.annotation.FlaggedApi; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.companion.virtual.flags.Flags; import android.os.Parcel; import android.os.Parcelable; import android.os.SystemClock; @@ -35,7 +33,6 @@ import java.lang.annotation.RetentionPolicy; * * @hide */ -@FlaggedApi(Flags.FLAG_VIRTUAL_STYLUS) @SystemApi public final class VirtualStylusButtonEvent implements Parcelable { /** @hide */ @@ -128,7 +125,6 @@ public final class VirtualStylusButtonEvent implements Parcelable { /** * Builder for {@link VirtualStylusButtonEvent}. */ - @FlaggedApi(Flags.FLAG_VIRTUAL_STYLUS) public static final class Builder { @Action diff --git a/core/java/android/hardware/input/VirtualStylusConfig.java b/core/java/android/hardware/input/VirtualStylusConfig.java index 64cf1f56d8bc..3c56023fa6d3 100644 --- a/core/java/android/hardware/input/VirtualStylusConfig.java +++ b/core/java/android/hardware/input/VirtualStylusConfig.java @@ -16,11 +16,9 @@ package android.hardware.input; -import android.annotation.FlaggedApi; import android.annotation.IntRange; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.companion.virtual.flags.Flags; import android.os.Parcel; import android.os.Parcelable; @@ -29,7 +27,6 @@ import android.os.Parcelable; * * @hide */ -@FlaggedApi(Flags.FLAG_VIRTUAL_STYLUS) @SystemApi public final class VirtualStylusConfig extends VirtualTouchDeviceConfig implements Parcelable { @@ -68,7 +65,6 @@ public final class VirtualStylusConfig extends VirtualTouchDeviceConfig implemen /** * Builder for creating a {@link VirtualStylusConfig}. */ - @FlaggedApi(Flags.FLAG_VIRTUAL_STYLUS) public static final class Builder extends VirtualTouchDeviceConfig.Builder<Builder> { /** diff --git a/core/java/android/hardware/input/VirtualStylusMotionEvent.java b/core/java/android/hardware/input/VirtualStylusMotionEvent.java index 0ac6f3aa3e15..fa0ff4f7eeab 100644 --- a/core/java/android/hardware/input/VirtualStylusMotionEvent.java +++ b/core/java/android/hardware/input/VirtualStylusMotionEvent.java @@ -16,12 +16,10 @@ package android.hardware.input; -import android.annotation.FlaggedApi; import android.annotation.IntDef; import android.annotation.IntRange; import android.annotation.NonNull; import android.annotation.SystemApi; -import android.companion.virtual.flags.Flags; import android.os.Parcel; import android.os.Parcelable; import android.os.SystemClock; @@ -38,7 +36,6 @@ import java.lang.annotation.RetentionPolicy; * * @hide */ -@FlaggedApi(Flags.FLAG_VIRTUAL_STYLUS) @SystemApi public final class VirtualStylusMotionEvent implements Parcelable { private static final int TILT_MIN = -90; @@ -209,7 +206,6 @@ public final class VirtualStylusMotionEvent implements Parcelable { /** * Builder for {@link VirtualStylusMotionEvent}. */ - @FlaggedApi(Flags.FLAG_VIRTUAL_STYLUS) public static final class Builder { @ToolType diff --git a/core/java/android/view/InsetsAnimationControlImpl.java b/core/java/android/view/InsetsAnimationControlImpl.java index 4fead2ad5246..6decd6d3a603 100644 --- a/core/java/android/view/InsetsAnimationControlImpl.java +++ b/core/java/android/view/InsetsAnimationControlImpl.java @@ -112,6 +112,7 @@ public class InsetsAnimationControlImpl implements InternalInsetsAnimationContro private Insets mPendingInsets; private float mPendingFraction; private boolean mFinished; + private boolean mCancelling; private boolean mCancelled; private boolean mShownOnFinish; private float mCurrentAlpha = 1.0f; @@ -371,7 +372,7 @@ public class InsetsAnimationControlImpl implements InternalInsetsAnimationContro mPendingInsets = mLayoutInsetsDuringAnimation == LAYOUT_INSETS_DURING_ANIMATION_SHOWN ? mShownInsets : mHiddenInsets; mPendingAlpha = 1f; - mPendingFraction = 1f; + mCancelling = true; applyChangeInsets(null); mCancelled = true; mListener.onCancelled(mReadyDispatched ? this : null); @@ -488,15 +489,15 @@ public class InsetsAnimationControlImpl implements InternalInsetsAnimationContro return; } - final boolean visible = mPendingFraction == 0 - // The first frame of ANIMATION_TYPE_SHOW should be invisible since it is - // animated from the hidden state. - ? mAnimationType != ANIMATION_TYPE_SHOW - : mPendingFraction < 1f || (mFinished - ? mShownOnFinish - // If the animation is cancelled, mFinished and mShownOnFinish are not set. + final boolean visible = mFinished + ? mShownOnFinish + : (mCancelling + // If the animation is being cancelled, mShownOnFinish is not valid. // Here uses mLayoutInsetsDuringAnimation to decide if it should be visible. - : mLayoutInsetsDuringAnimation == LAYOUT_INSETS_DURING_ANIMATION_SHOWN); + ? mLayoutInsetsDuringAnimation == LAYOUT_INSETS_DURING_ANIMATION_SHOWN + // The first frame of ANIMATION_TYPE_SHOW should be invisible since it is + // animated from the hidden state. + : (mAnimationType != ANIMATION_TYPE_SHOW || mPendingFraction != 0)); // TODO: Implement behavior when inset spans over multiple types for (int i = controls.size() - 1; i >= 0; i--) { diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java index e665c08c63e4..d7cf3e827695 100644 --- a/core/java/android/view/SurfaceControl.java +++ b/core/java/android/view/SurfaceControl.java @@ -4865,7 +4865,7 @@ public final class SurfaceControl implements Parcelable { /** * @hide */ - public Transaction setDesintationFrame(SurfaceControl sc, @NonNull Rect destinationFrame) { + public Transaction setDestinationFrame(SurfaceControl sc, @NonNull Rect destinationFrame) { checkPreconditions(sc); nativeSetDestinationFrame(mNativeObject, sc.mNativeObject, destinationFrame.left, destinationFrame.top, destinationFrame.right, @@ -4876,7 +4876,7 @@ public final class SurfaceControl implements Parcelable { /** * @hide */ - public Transaction setDesintationFrame(SurfaceControl sc, int width, int height) { + public Transaction setDestinationFrame(SurfaceControl sc, int width, int height) { checkPreconditions(sc); nativeSetDestinationFrame(mNativeObject, sc.mNativeObject, 0, 0, width, height); return this; diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java index b0051cefb21b..780e76122e8a 100644 --- a/core/java/android/view/SurfaceView.java +++ b/core/java/android/view/SurfaceView.java @@ -1125,7 +1125,7 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall } } - surfaceUpdateTransaction.setDesintationFrame(mBlastSurfaceControl, mSurfaceWidth, + surfaceUpdateTransaction.setDestinationFrame(mBlastSurfaceControl, mSurfaceWidth, mSurfaceHeight); if (isHardwareAccelerated()) { diff --git a/data/etc/preinstalled-packages-platform.xml b/data/etc/preinstalled-packages-platform.xml index 782327713fdc..3403bbfa2384 100644 --- a/data/etc/preinstalled-packages-platform.xml +++ b/data/etc/preinstalled-packages-platform.xml @@ -134,4 +134,9 @@ to pre-existing users, but cannot uninstall pre-existing system packages from pr <install-in-user-type package="com.android.avatarpicker"> <install-in user-type="FULL" /> </install-in-user-type> + + <!-- Users Widget (Users widget)--> + <install-in-user-type package="com.android.multiuser"> + <install-in user-type="FULL" /> + </install-in-user-type> </config> diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/taskview/TaskViewTaskController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/taskview/TaskViewTaskController.java index 8dd14983e122..5c7dd078ee45 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/taskview/TaskViewTaskController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/taskview/TaskViewTaskController.java @@ -536,9 +536,12 @@ public class TaskViewTaskController implements ShellTaskOrganizer.TaskListener { } return; } + // Cache it to avoid NPE and make sure to remove it from recents history. + // mTaskToken can be cleared in onTaskVanished() when the task is removed. + final WindowContainerToken taskToken = mTaskToken; mShellExecutor.execute(() -> { WindowContainerTransaction wct = new WindowContainerTransaction(); - wct.removeTask(mTaskToken); + wct.removeTask(taskToken); mTaskViewTransitions.closeTaskView(wct, this); }); } diff --git a/libs/WindowManager/Shell/tests/e2e/desktopmode/scenarios/src/com/android/wm/shell/functional/EnterDesktopWithDragExistingWindowsTest.kt b/libs/WindowManager/Shell/tests/e2e/desktopmode/scenarios/src/com/android/wm/shell/functional/EnterDesktopWithDragExistingWindowsTest.kt new file mode 100644 index 000000000000..2b26bbfb68cb --- /dev/null +++ b/libs/WindowManager/Shell/tests/e2e/desktopmode/scenarios/src/com/android/wm/shell/functional/EnterDesktopWithDragExistingWindowsTest.kt @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2025 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 com.android.wm.shell.functional + +import android.platform.test.annotations.Postsubmit +import com.android.wm.shell.scenarios.EnterDesktopWithDragExistingWindows +import org.junit.runner.RunWith +import org.junit.runners.BlockJUnit4ClassRunner + +/* Functional test for [EnterDesktopWithDragExistingWindows]. */ +@RunWith(BlockJUnit4ClassRunner::class) +@Postsubmit +class EnterDesktopWithDragExistingWindowsTest : EnterDesktopWithDragExistingWindows() diff --git a/libs/WindowManager/Shell/tests/e2e/desktopmode/scenarios/src/com/android/wm/shell/scenarios/EnterDesktopWithAppHandleMenuExistingWindows.kt b/libs/WindowManager/Shell/tests/e2e/desktopmode/scenarios/src/com/android/wm/shell/scenarios/EnterDesktopWithAppHandleMenuExistingWindows.kt new file mode 100644 index 000000000000..2de0830dedb5 --- /dev/null +++ b/libs/WindowManager/Shell/tests/e2e/desktopmode/scenarios/src/com/android/wm/shell/scenarios/EnterDesktopWithAppHandleMenuExistingWindows.kt @@ -0,0 +1,70 @@ +/* + * Copyright (C) 2025 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 com.android.wm.shell.scenarios + +import android.platform.test.annotations.Postsubmit +import android.app.Instrumentation +import android.tools.traces.parsers.WindowManagerStateHelper +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.uiautomator.UiDevice +import com.android.launcher3.tapl.LauncherInstrumentation +import com.android.server.wm.flicker.helpers.DesktopModeAppHelper +import com.android.server.wm.flicker.helpers.SimpleAppHelper +import com.android.server.wm.flicker.helpers.ImeAppHelper +import com.android.server.wm.flicker.helpers.NewTasksAppHelper +import com.android.window.flags.Flags +import org.junit.After +import org.junit.Assume +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.junit.runners.BlockJUnit4ClassRunner + +@RunWith(BlockJUnit4ClassRunner::class) +@Postsubmit +open class EnterDesktopWithAppHandleMenuExistingWindows { + + private val instrumentation: Instrumentation = InstrumentationRegistry.getInstrumentation() + private val tapl = LauncherInstrumentation() + private val wmHelper = WindowManagerStateHelper(instrumentation) + private val device = UiDevice.getInstance(instrumentation) + private val imeApp = ImeAppHelper(instrumentation) + private val newTaskApp = NewTasksAppHelper(instrumentation) + private val testApp = DesktopModeAppHelper(SimpleAppHelper(instrumentation)) + + @Before + fun setup() { + Assume.assumeTrue(Flags.enableDesktopWindowingMode() && tapl.isTablet) + testApp.enterDesktopMode(wmHelper, device) + imeApp.launchViaIntent(wmHelper) + newTaskApp.launchViaIntent(wmHelper) + testApp.launchViaIntent(wmHelper) + testApp.exitDesktopWithDragToTopDragZone(wmHelper, device) + } + + @Test + open fun reenterDesktopWithAppHandleMenu() { + testApp.enterDesktopModeFromAppHandleMenu(wmHelper, device) + } + + @After + fun teardown() { + testApp.exit(wmHelper) + newTaskApp.exit(wmHelper) + imeApp.exit(wmHelper) + } +}
\ No newline at end of file diff --git a/libs/WindowManager/Shell/tests/e2e/desktopmode/scenarios/src/com/android/wm/shell/scenarios/EnterDesktopWithDragExistingWindows.kt b/libs/WindowManager/Shell/tests/e2e/desktopmode/scenarios/src/com/android/wm/shell/scenarios/EnterDesktopWithDragExistingWindows.kt new file mode 100644 index 000000000000..814478af67c1 --- /dev/null +++ b/libs/WindowManager/Shell/tests/e2e/desktopmode/scenarios/src/com/android/wm/shell/scenarios/EnterDesktopWithDragExistingWindows.kt @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2025 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 com.android.wm.shell.scenarios + +import android.tools.NavBar +import android.tools.Rotation +import android.tools.flicker.rules.ChangeDisplayOrientationRule +import com.android.server.wm.flicker.helpers.ImeAppHelper +import com.android.server.wm.flicker.helpers.NewTasksAppHelper +import com.android.window.flags.Flags +import com.android.wm.shell.Utils +import org.junit.After +import org.junit.Assume +import org.junit.Before +import org.junit.Ignore +import org.junit.Rule +import org.junit.Test + +@Ignore("Test Base Class") +abstract class EnterDesktopWithDragExistingWindows +constructor( + val rotation: Rotation = Rotation.ROTATION_0, + isResizeable: Boolean = true, + isLandscapeApp: Boolean = true, +) : DesktopScenarioCustomAppTestBase(isResizeable, isLandscapeApp) { + + @Rule + @JvmField + val testSetupRule = Utils.testSetupRule(NavBar.MODE_GESTURAL, rotation) + private val imeApp = ImeAppHelper(instrumentation) + private val newTaskApp = NewTasksAppHelper(instrumentation) + + @Before + fun setup() { + Assume.assumeTrue(Flags.enableDesktopWindowingMode() && tapl.isTablet) + tapl.setEnableRotation(true) + tapl.setExpectedRotation(rotation.value) + ChangeDisplayOrientationRule.setRotation(rotation) + tapl.enableTransientTaskbar(false) + + testApp.enterDesktopMode(wmHelper, device) + imeApp.launchViaIntent(wmHelper) + newTaskApp.launchViaIntent(wmHelper) + testApp.launchViaIntent(wmHelper) + testApp.exitDesktopWithDragToTopDragZone(wmHelper, device) + } + + @Test + open fun reenterDesktopWithDrag() { + // By default this method uses drag to desktop + testApp.enterDesktopMode(wmHelper, device) + } + + @After + fun teardown() { + testApp.exit(wmHelper) + newTaskApp.exit(wmHelper) + imeApp.exit(wmHelper) + } +}
\ No newline at end of file diff --git a/packages/CrashRecovery/services/module/java/com/android/server/RescueParty.java b/packages/CrashRecovery/services/module/java/com/android/server/RescueParty.java index 40bc5f78a9c6..846da194b3c3 100644 --- a/packages/CrashRecovery/services/module/java/com/android/server/RescueParty.java +++ b/packages/CrashRecovery/services/module/java/com/android/server/RescueParty.java @@ -29,18 +29,13 @@ import android.content.pm.PackageManager; import android.content.pm.VersionedPackage; import android.crashrecovery.flags.Flags; import android.os.Build; -import android.os.Environment; import android.os.PowerManager; import android.os.RecoverySystem; import android.os.SystemClock; import android.os.SystemProperties; -import android.os.UserHandle; -import android.provider.DeviceConfig; import android.provider.Settings; import android.sysprop.CrashRecoveryProperties; import android.text.TextUtils; -import android.util.ArraySet; -import android.util.ArrayUtils; import android.util.EventLog; import android.util.FileUtils; import android.util.Log; @@ -56,10 +51,7 @@ import com.android.server.crashrecovery.proto.CrashRecoveryStatsLog; import java.io.File; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; -import java.util.ArrayList; import java.util.HashMap; -import java.util.HashSet; -import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.TimeUnit; @@ -241,87 +233,11 @@ public class RescueParty { CrashRecoveryProperties.maxRescueLevelAttempted(level); } - private static Set<String> getPresetNamespacesForPackages(List<String> packageNames) { - Set<String> resultSet = new ArraySet<String>(); - if (!Flags.deprecateFlagsAndSettingsResets()) { - try { - String flagVal = DeviceConfig.getString(NAMESPACE_CONFIGURATION, - NAMESPACE_TO_PACKAGE_MAPPING_FLAG, ""); - String[] mappingEntries = flagVal.split(","); - for (int i = 0; i < mappingEntries.length; i++) { - if (TextUtils.isEmpty(mappingEntries[i])) { - continue; - } - String[] splitEntry = mappingEntries[i].split(":"); - if (splitEntry.length != 2) { - throw new RuntimeException("Invalid mapping entry: " + mappingEntries[i]); - } - String namespace = splitEntry[0]; - String packageName = splitEntry[1]; - - if (packageNames.contains(packageName)) { - resultSet.add(namespace); - } - } - } catch (Exception e) { - resultSet.clear(); - Slog.e(TAG, "Failed to read preset package to namespaces mapping.", e); - } finally { - return resultSet; - } - } else { - return resultSet; - } - } - @VisibleForTesting static long getElapsedRealtime() { return SystemClock.elapsedRealtime(); } - private static class RescuePartyMonitorCallback implements DeviceConfig.MonitorCallback { - Context mContext; - - RescuePartyMonitorCallback(Context context) { - this.mContext = context; - } - - public void onNamespaceUpdate(@NonNull String updatedNamespace) { - if (!Flags.deprecateFlagsAndSettingsResets()) { - startObservingPackages(mContext, updatedNamespace); - } - } - - public void onDeviceConfigAccess(@NonNull String callingPackage, - @NonNull String namespace) { - - if (!Flags.deprecateFlagsAndSettingsResets()) { - RescuePartyObserver.getInstance(mContext).recordDeviceConfigAccess( - callingPackage, - namespace); - } - } - } - - private static void startObservingPackages(Context context, @NonNull String updatedNamespace) { - if (!Flags.deprecateFlagsAndSettingsResets()) { - RescuePartyObserver rescuePartyObserver = RescuePartyObserver.getInstance(context); - Set<String> callingPackages = rescuePartyObserver.getCallingPackagesSet( - updatedNamespace); - if (callingPackages == null) { - return; - } - List<String> callingPackageList = new ArrayList<>(); - callingPackageList.addAll(callingPackages); - Slog.i(TAG, "Starting to observe: " + callingPackageList + ", updated namespace: " - + updatedNamespace); - PackageWatchdog.getInstance(context).startExplicitHealthCheck( - callingPackageList, - DEFAULT_OBSERVING_DURATION_MS, - rescuePartyObserver); - } - } - private static int getMaxRescueLevel(boolean mayPerformReboot) { if (Flags.recoverabilityDetection()) { if (!mayPerformReboot @@ -849,34 +765,6 @@ public class RescueParty { } } - private synchronized void recordDeviceConfigAccess(@NonNull String callingPackage, - @NonNull String namespace) { - if (!Flags.deprecateFlagsAndSettingsResets()) { - // Record it in calling packages to namespace map - Set<String> namespaceSet = mCallingPackageNamespaceSetMap.get(callingPackage); - if (namespaceSet == null) { - namespaceSet = new ArraySet<>(); - mCallingPackageNamespaceSetMap.put(callingPackage, namespaceSet); - } - namespaceSet.add(namespace); - // Record it in namespace to calling packages map - Set<String> callingPackageSet = mNamespaceCallingPackageSetMap.get(namespace); - if (callingPackageSet == null) { - callingPackageSet = new ArraySet<>(); - } - callingPackageSet.add(callingPackage); - mNamespaceCallingPackageSetMap.put(namespace, callingPackageSet); - } - } - - private synchronized Set<String> getAffectedNamespaceSet(String failedPackage) { - return mCallingPackageNamespaceSetMap.get(failedPackage); - } - - private synchronized Set<String> getAllAffectedNamespaceSet() { - return new HashSet<String>(mNamespaceCallingPackageSetMap.keySet()); - } - private synchronized Set<String> getCallingPackagesSet(String namespace) { return mNamespaceCallingPackageSetMap.get(namespace); } @@ -894,26 +782,6 @@ public class RescueParty { return now < lastResetTime + TimeUnit.MINUTES.toMillis(throttleDurationMin); } - private static int[] getAllUserIds() { - int systemUserId = UserHandle.SYSTEM.getIdentifier(); - int[] userIds = { systemUserId }; - try { - for (File file : FileUtils.listFilesOrEmpty( - Environment.getDataSystemDeviceProtectedDirectory())) { - try { - final int userId = Integer.parseInt(file.getName()); - if (userId != systemUserId) { - userIds = ArrayUtils.appendInt(userIds, userId); - } - } catch (NumberFormatException ignored) { - } - } - } catch (Throwable t) { - Slog.w(TAG, "Trouble discovering users", t); - } - return userIds; - } - /** * Hacky test to check if the device has an active USB connection, which is * a good proxy for someone doing local development work. diff --git a/packages/CrashRecovery/services/module/java/com/android/util/ArrayUtils.java b/packages/CrashRecovery/services/module/java/com/android/util/ArrayUtils.java index 0b7b98603419..29ff7cced897 100644 --- a/packages/CrashRecovery/services/module/java/com/android/util/ArrayUtils.java +++ b/packages/CrashRecovery/services/module/java/com/android/util/ArrayUtils.java @@ -16,13 +16,8 @@ package android.util; -import android.annotation.NonNull; import android.annotation.Nullable; -import java.io.File; -import java.util.List; -import java.util.Objects; - /** * Copied over from frameworks/base/core/java/com/android/internal/util/ArrayUtils.java * @@ -30,25 +25,6 @@ import java.util.Objects; */ public class ArrayUtils { private ArrayUtils() { /* cannot be instantiated */ } - public static final File[] EMPTY_FILE = new File[0]; - - - /** - * Return first index of {@code value} in {@code array}, or {@code -1} if - * not found. - */ - public static <T> int indexOf(@Nullable T[] array, T value) { - if (array == null) return -1; - for (int i = 0; i < array.length; i++) { - if (Objects.equals(array[i], value)) return i; - } - return -1; - } - - /** @hide */ - public static @NonNull File[] defeatNullable(@Nullable File[] val) { - return (val != null) ? val : EMPTY_FILE; - } /** * Checks if given array is null or has zero elements. @@ -63,53 +39,4 @@ public class ArrayUtils { public static boolean isEmpty(@Nullable byte[] array) { return array == null || array.length == 0; } - - /** - * Converts from List of bytes to byte array - * @param list - * @return byte[] - */ - public static byte[] toPrimitive(List<byte[]> list) { - if (list.size() == 0) { - return new byte[0]; - } - int byteLen = list.get(0).length; - byte[] array = new byte[list.size() * byteLen]; - for (int i = 0; i < list.size(); i++) { - for (int j = 0; j < list.get(i).length; j++) { - array[i * byteLen + j] = list.get(i)[j]; - } - } - return array; - } - - /** - * Adds value to given array if not already present, providing set-like - * behavior. - */ - public static @NonNull int[] appendInt(@Nullable int[] cur, int val) { - return appendInt(cur, val, false); - } - - /** - * Adds value to given array. - */ - public static @NonNull int[] appendInt(@Nullable int[] cur, int val, - boolean allowDuplicates) { - if (cur == null) { - return new int[] { val }; - } - final int n = cur.length; - if (!allowDuplicates) { - for (int i = 0; i < n; i++) { - if (cur[i] == val) { - return cur; - } - } - } - int[] ret = new int[n + 1]; - System.arraycopy(cur, 0, ret, 0, n); - ret[n] = val; - return ret; - } } diff --git a/packages/CrashRecovery/services/module/java/com/android/util/FileUtils.java b/packages/CrashRecovery/services/module/java/com/android/util/FileUtils.java index 9c73feeffb6c..d60a9b9847ca 100644 --- a/packages/CrashRecovery/services/module/java/com/android/util/FileUtils.java +++ b/packages/CrashRecovery/services/module/java/com/android/util/FileUtils.java @@ -16,7 +16,6 @@ package android.util; -import android.annotation.NonNull; import android.annotation.Nullable; import java.io.BufferedInputStream; @@ -115,14 +114,4 @@ public class FileUtils { } return false; } - - /** - * List the files in the directory or return empty file. - * - * @hide - */ - public static @NonNull File[] listFilesOrEmpty(@Nullable File dir) { - return (dir != null) ? ArrayUtils.defeatNullable(dir.listFiles()) - : ArrayUtils.EMPTY_FILE; - } } diff --git a/packages/CrashRecovery/services/module/java/com/android/util/XmlUtils.java b/packages/CrashRecovery/services/module/java/com/android/util/XmlUtils.java index 50823f5c9c34..488b531c2b8a 100644 --- a/packages/CrashRecovery/services/module/java/com/android/util/XmlUtils.java +++ b/packages/CrashRecovery/services/module/java/com/android/util/XmlUtils.java @@ -16,21 +16,10 @@ package android.util; -import android.annotation.NonNull; -import android.system.ErrnoException; -import android.system.Os; - -import com.android.modules.utils.TypedXmlPullParser; - -import libcore.util.XmlObjectFactory; - import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; -import java.io.BufferedInputStream; -import java.io.FileInputStream; import java.io.IOException; -import java.io.InputStream; /** * Bits and pieces copied from hidden API of @@ -40,8 +29,6 @@ import java.io.InputStream; */ public class XmlUtils { - private static final String STRING_ARRAY_SEPARATOR = ":"; - /** @hide */ public static final void beginDocument(XmlPullParser parser, String firstElementName) throws XmlPullParserException, IOException { @@ -76,44 +63,4 @@ public class XmlUtils { } } } - - private static XmlPullParser newPullParser() { - try { - XmlPullParser parser = XmlObjectFactory.newXmlPullParser(); - parser.setFeature(XmlPullParser.FEATURE_PROCESS_DOCDECL, true); - parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true); - return parser; - } catch (XmlPullParserException e) { - throw new AssertionError(); - } - } - - /** @hide */ - public static @NonNull TypedXmlPullParser resolvePullParser(@NonNull InputStream in) - throws IOException { - final byte[] magic = new byte[4]; - if (in instanceof FileInputStream) { - try { - Os.pread(((FileInputStream) in).getFD(), magic, 0, magic.length, 0); - } catch (ErrnoException e) { - throw e.rethrowAsIOException(); - } - } else { - if (!in.markSupported()) { - in = new BufferedInputStream(in); - } - in.mark(8); - in.read(magic); - in.reset(); - } - - final TypedXmlPullParser xml; - xml = (TypedXmlPullParser) newPullParser(); - try { - xml.setInput(in, "UTF_8"); - } catch (XmlPullParserException e) { - throw new IOException(e); - } - return xml; - } } diff --git a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/framework/common/BytesFormatter.kt b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/framework/common/BytesFormatter.kt index 5b7e2a86135a..e6cc8a80ee38 100644 --- a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/framework/common/BytesFormatter.kt +++ b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/framework/common/BytesFormatter.kt @@ -24,6 +24,7 @@ import android.icu.text.NumberFormat import android.icu.text.UnicodeSet import android.icu.text.UnicodeSetSpanner import android.icu.util.Measure +import android.text.BidiFormatter import android.text.format.Formatter import android.text.format.Formatter.RoundedBytesResult import java.math.BigDecimal @@ -40,11 +41,17 @@ class BytesFormatter(resources: Resources) { constructor(context: Context) : this(context.resources) private val locale = resources.configuration.locales[0] + private val bidiFormatter = BidiFormatter.getInstance(locale) fun format(bytes: Long, useCase: UseCase): String { val rounded = RoundedBytesResult.roundBytes(bytes, useCase.flag) val numberFormatter = getNumberFormatter(rounded.fractionDigits) - return numberFormatter.formatRoundedBytesResult(rounded) + val formattedString = numberFormatter.formatRoundedBytesResult(rounded) + return if (useCase == UseCase.FileSize) { + formattedString.bidiWrap() + } else { + formattedString + } } fun formatWithUnits(bytes: Long, useCase: UseCase): Result { @@ -74,6 +81,14 @@ class BytesFormatter(resources: Resources) { } } + /** Wraps the source string in bidi formatting characters in RTL locales. */ + private fun String.bidiWrap(): String = + if (bidiFormatter.isRtlContext) { + bidiFormatter.unicodeWrap(this) + } else { + this + } + private companion object { fun String.removeFirst(removed: String): String = SPACES_AND_CONTROLS.trim(replaceFirst(removed, "")).toString() diff --git a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/model/app/AppStorageRepository.kt b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/model/app/AppStorageRepository.kt new file mode 100644 index 000000000000..6fd470c1e7aa --- /dev/null +++ b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/model/app/AppStorageRepository.kt @@ -0,0 +1,92 @@ +/* + * Copyright (C) 2025 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 com.android.settingslib.spaprivileged.model.app + +import android.content.Context +import android.content.pm.ApplicationInfo +import android.util.Log +import com.android.settingslib.spaprivileged.framework.common.BytesFormatter +import com.android.settingslib.spaprivileged.framework.common.storageStatsManager + +/** A repository interface for accessing and formatting app storage information. */ +interface AppStorageRepository { + /** + * Formats the size of an application into a human-readable string. + * + * This function retrieves the total size of the application, including APK file and its + * associated data. + * + * This function takes an [ApplicationInfo] object as input and returns a formatted string + * representing the size of the application. The size is formatted in units like kB, MB, GB, + * etc. + * + * @param app The [ApplicationInfo] object representing the application. + * @return A formatted string representing the size of the application. + */ + fun formatSize(app: ApplicationInfo): String + + /** + * Formats the size about an application into a human-readable string. + * + * @param sizeBytes The size in bytes to format. + * @return A formatted string representing the size about application. + */ + fun formatSizeBytes(sizeBytes: Long): String + + /** + * Calculates the size of an application in bytes. + * + * This function retrieves the total size of the application, including APK file and its + * associated data. + * + * @param app The [ApplicationInfo] object representing the application. + * @return The total size of the application in bytes, or null if the size could not be + * determined. + */ + fun calculateSizeBytes(app: ApplicationInfo): Long? +} + +class AppStorageRepositoryImpl(context: Context) : AppStorageRepository { + private val storageStatsManager = context.storageStatsManager + private val bytesFormatter = BytesFormatter(context) + + override fun formatSize(app: ApplicationInfo): String { + val sizeBytes = calculateSizeBytes(app) + return if (sizeBytes != null) formatSizeBytes(sizeBytes) else "" + } + + override fun formatSizeBytes(sizeBytes: Long): String = + bytesFormatter.format(sizeBytes, BytesFormatter.UseCase.FileSize) + + override fun calculateSizeBytes(app: ApplicationInfo): Long? = + try { + val stats = + storageStatsManager.queryStatsForPackage( + app.storageUuid, + app.packageName, + app.userHandle, + ) + stats.codeBytes + stats.dataBytes + } catch (e: Exception) { + Log.w(TAG, "Failed to query stats", e) + null + } + + companion object { + private const val TAG = "AppStorageRepository" + } +} diff --git a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/AppStorageSize.kt b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/AppStorageSize.kt index 7a4f81cc1321..7c98e9cd813b 100644 --- a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/AppStorageSize.kt +++ b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/AppStorageSize.kt @@ -16,42 +16,30 @@ package com.android.settingslib.spaprivileged.template.app -import android.content.Context import android.content.pm.ApplicationInfo -import android.text.format.Formatter -import android.util.Log +import androidx.annotation.VisibleForTesting import androidx.compose.runtime.Composable import androidx.compose.runtime.State import androidx.compose.runtime.remember -import androidx.compose.ui.platform.LocalContext import androidx.lifecycle.compose.collectAsStateWithLifecycle -import com.android.settingslib.spaprivileged.framework.common.storageStatsManager +import com.android.settingslib.spa.framework.compose.rememberContext import com.android.settingslib.spaprivileged.framework.compose.placeholder -import com.android.settingslib.spaprivileged.model.app.userHandle +import com.android.settingslib.spaprivileged.model.app.AppStorageRepository +import com.android.settingslib.spaprivileged.model.app.AppStorageRepositoryImpl import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.flowOn -private const val TAG = "AppStorageSize" - @Composable -fun ApplicationInfo.getStorageSize(): State<String> { - val context = LocalContext.current - return remember(this) { - flow { - val sizeBytes = calculateSizeBytes(context) - this.emit(if (sizeBytes != null) Formatter.formatFileSize(context, sizeBytes) else "") - }.flowOn(Dispatchers.IO) - }.collectAsStateWithLifecycle(initialValue = placeholder()) -} +fun ApplicationInfo.getStorageSize(): State<String> = + getStorageSize(rememberContext(::AppStorageRepositoryImpl)) -fun ApplicationInfo.calculateSizeBytes(context: Context): Long? { - val storageStatsManager = context.storageStatsManager - return try { - val stats = storageStatsManager.queryStatsForPackage(storageUuid, packageName, userHandle) - stats.codeBytes + stats.dataBytes - } catch (e: Exception) { - Log.w(TAG, "Failed to query stats: $e") - null - } +@VisibleForTesting +@Composable +fun ApplicationInfo.getStorageSize(appStorageRepository: AppStorageRepository): State<String> { + val app = this + return remember(app) { + flow { emit(appStorageRepository.formatSize(app)) }.flowOn(Dispatchers.Default) + } + .collectAsStateWithLifecycle(initialValue = placeholder()) } diff --git a/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/model/app/AppStorageRepositoryTest.kt b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/model/app/AppStorageRepositoryTest.kt new file mode 100644 index 000000000000..e8ec974bb0b8 --- /dev/null +++ b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/model/app/AppStorageRepositoryTest.kt @@ -0,0 +1,94 @@ +/* + * Copyright (C) 2025 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 com.android.settingslib.spaprivileged.model.app + +import android.app.usage.StorageStats +import android.app.usage.StorageStatsManager +import android.content.Context +import android.content.pm.ApplicationInfo +import android.content.pm.PackageManager.NameNotFoundException +import androidx.test.core.app.ApplicationProvider +import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.android.settingslib.spaprivileged.framework.common.storageStatsManager +import com.google.common.truth.Truth.assertThat +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.kotlin.doReturn +import org.mockito.kotlin.doThrow +import org.mockito.kotlin.mock +import org.mockito.kotlin.spy +import org.mockito.kotlin.stub +import java.util.UUID + +@RunWith(AndroidJUnit4::class) +class AppStorageRepositoryTest { + private val app = ApplicationInfo().apply { storageUuid = UUID.randomUUID() } + + private val mockStorageStatsManager = + mock<StorageStatsManager> { + on { queryStatsForPackage(app.storageUuid, app.packageName, app.userHandle) } doReturn + STATS + } + + private val context: Context = + spy(ApplicationProvider.getApplicationContext()) { + on { storageStatsManager } doReturn mockStorageStatsManager + } + + private val repository = AppStorageRepositoryImpl(context) + + @Test + fun calculateSizeBytes() { + val sizeBytes = repository.calculateSizeBytes(app) + + assertThat(sizeBytes).isEqualTo(120) + } + + @Test + fun formatSize() { + val fileSize = repository.formatSize(app) + + assertThat(fileSize).isEqualTo("120 byte") + } + + @Test + fun formatSize_throwException() { + mockStorageStatsManager.stub { + on { queryStatsForPackage(app.storageUuid, app.packageName, app.userHandle) } doThrow + NameNotFoundException() + } + + val fileSize = repository.formatSize(app) + + assertThat(fileSize).isEqualTo("") + } + + @Test + fun formatSizeBytes() { + val fileSize = repository.formatSizeBytes(120) + + assertThat(fileSize).isEqualTo("120 byte") + } + + companion object { + private val STATS = + StorageStats().apply { + codeBytes = 100 + dataBytes = 20 + } + } +} diff --git a/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/template/app/AppStorageSizeTest.kt b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/template/app/AppStorageSizeTest.kt index 60f3d0ce1be3..4f42c8254c39 100644 --- a/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/template/app/AppStorageSizeTest.kt +++ b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/template/app/AppStorageSizeTest.kt @@ -16,98 +16,37 @@ package com.android.settingslib.spaprivileged.template.app -import android.app.usage.StorageStats -import android.app.usage.StorageStatsManager -import android.content.Context import android.content.pm.ApplicationInfo -import android.content.pm.PackageManager.NameNotFoundException -import androidx.compose.runtime.CompositionLocalProvider -import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.test.junit4.createComposeRule -import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 import com.android.settingslib.spa.framework.compose.stateOf -import com.android.settingslib.spaprivileged.framework.common.storageStatsManager -import com.android.settingslib.spaprivileged.model.app.userHandle -import java.util.UUID -import org.junit.Before +import com.android.settingslib.spaprivileged.model.app.AppStorageRepository import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith -import org.mockito.Mock -import org.mockito.Spy -import org.mockito.junit.MockitoJUnit -import org.mockito.junit.MockitoRule -import org.mockito.kotlin.whenever +import org.mockito.kotlin.doReturn +import org.mockito.kotlin.mock +import java.util.UUID @RunWith(AndroidJUnit4::class) class AppStorageSizeTest { - @get:Rule - val mockito: MockitoRule = MockitoJUnit.rule() - - @get:Rule - val composeTestRule = createComposeRule() + @get:Rule val composeTestRule = createComposeRule() - @Spy - private val context: Context = ApplicationProvider.getApplicationContext() - - @Mock - private lateinit var storageStatsManager: StorageStatsManager - - private val app = ApplicationInfo().apply { - storageUuid = UUID.randomUUID() - } + private val app = ApplicationInfo().apply { storageUuid = UUID.randomUUID() } - @Before - fun setUp() { - whenever(context.storageStatsManager).thenReturn(storageStatsManager) - whenever( - storageStatsManager.queryStatsForPackage( - app.storageUuid, - app.packageName, - app.userHandle, - ) - ).thenReturn(STATS) - } + private val mockAppStorageRepository = + mock<AppStorageRepository> { on { formatSize(app) } doReturn SIZE } @Test fun getStorageSize() { var storageSize = stateOf("") - composeTestRule.setContent { - CompositionLocalProvider(LocalContext provides context) { - storageSize = app.getStorageSize() - } - } - - composeTestRule.waitUntil { storageSize.value == "120 B" } - } - - @Test - fun getStorageSize_throwException() { - var storageSize = stateOf("Computing") - whenever( - storageStatsManager.queryStatsForPackage( - app.storageUuid, - app.packageName, - app.userHandle, - ) - ).thenThrow(NameNotFoundException()) - - composeTestRule.setContent { - CompositionLocalProvider(LocalContext provides context) { - storageSize = app.getStorageSize() - } - } + composeTestRule.setContent { storageSize = app.getStorageSize(mockAppStorageRepository) } - composeTestRule.waitUntil { storageSize.value == "" } + composeTestRule.waitUntil { storageSize.value == SIZE } } - companion object { - private val STATS = StorageStats().apply { - codeBytes = 100 - dataBytes = 20 - cacheBytes = 3 - } + private companion object { + const val SIZE = "120 kB" } } diff --git a/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java b/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java index 260ea75a1f4c..5edd9d7041ba 100644 --- a/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java +++ b/services/companion/java/com/android/server/companion/virtual/VirtualDeviceImpl.java @@ -21,7 +21,6 @@ import static android.Manifest.permission.ADD_TRUSTED_DISPLAY; import static android.app.admin.DevicePolicyManager.NEARBY_STREAMING_ENABLED; import static android.app.admin.DevicePolicyManager.NEARBY_STREAMING_NOT_CONTROLLED_BY_POLICY; import static android.app.admin.DevicePolicyManager.NEARBY_STREAMING_SAME_MANAGED_ACCOUNT_ONLY; -import static android.companion.virtual.VirtualDeviceParams.ACTIVITY_POLICY_DEFAULT_ALLOWED; import static android.companion.virtual.VirtualDeviceParams.DEVICE_POLICY_CUSTOM; import static android.companion.virtual.VirtualDeviceParams.DEVICE_POLICY_DEFAULT; import static android.companion.virtual.VirtualDeviceParams.NAVIGATION_POLICY_DEFAULT_ALLOWED; @@ -492,17 +491,10 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub this, getDeviceId(), getPersistentDeviceId(), mParams.getName()); } - if (Flags.dynamicPolicy()) { - mActivityPolicyExemptions = new ArraySet<>( - mParams.getDevicePolicy(POLICY_TYPE_ACTIVITY) == DEVICE_POLICY_DEFAULT - ? mParams.getBlockedActivities() - : mParams.getAllowedActivities()); - } else { - mActivityPolicyExemptions = - mParams.getDefaultActivityPolicy() == ACTIVITY_POLICY_DEFAULT_ALLOWED - ? mParams.getBlockedActivities() - : mParams.getAllowedActivities(); - } + mActivityPolicyExemptions = new ArraySet<>( + mParams.getDevicePolicy(POLICY_TYPE_ACTIVITY) == DEVICE_POLICY_DEFAULT + ? mParams.getBlockedActivities() + : mParams.getAllowedActivities()); if (Flags.vdmCustomIme() && mParams.getInputMethodComponent() != null) { final String imeId = mParams.getInputMethodComponent().flattenToShortString(); @@ -587,12 +579,8 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub @Override // Binder call public @VirtualDeviceParams.DevicePolicy int getDevicePolicy( @VirtualDeviceParams.PolicyType int policyType) { - if (Flags.dynamicPolicy()) { - synchronized (mVirtualDeviceLock) { - return mDevicePolicies.get(policyType, DEVICE_POLICY_DEFAULT); - } - } else { - return mParams.getDevicePolicy(policyType); + synchronized (mVirtualDeviceLock) { + return mDevicePolicies.get(policyType, DEVICE_POLICY_DEFAULT); } } @@ -891,9 +879,6 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub public void setDevicePolicy(@VirtualDeviceParams.DynamicPolicyType int policyType, @VirtualDeviceParams.DevicePolicy int devicePolicy) { checkCallerIsDeviceOwner(); - if (!Flags.dynamicPolicy()) { - return; - } switch (policyType) { case POLICY_TYPE_RECENTS: @@ -924,23 +909,21 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub } break; case POLICY_TYPE_CLIPBOARD: - if (Flags.crossDeviceClipboard()) { - if (devicePolicy == DEVICE_POLICY_CUSTOM + if (devicePolicy == DEVICE_POLICY_CUSTOM && mContext.checkCallingOrSelfPermission(ADD_TRUSTED_DISPLAY) != PackageManager.PERMISSION_GRANTED) { - throw new SecurityException("Requires ADD_TRUSTED_DISPLAY permission to " - + "set a custom clipboard policy."); - } - synchronized (mVirtualDeviceLock) { - for (int i = 0; i < mVirtualDisplays.size(); i++) { - VirtualDisplayWrapper wrapper = mVirtualDisplays.valueAt(i); - if (!wrapper.isTrusted() && !wrapper.isMirror()) { - throw new SecurityException("All displays must be trusted for " - + "devices with custom clipboard policy."); - } + throw new SecurityException("Requires ADD_TRUSTED_DISPLAY permission to " + + "set a custom clipboard policy."); + } + synchronized (mVirtualDeviceLock) { + for (int i = 0; i < mVirtualDisplays.size(); i++) { + VirtualDisplayWrapper wrapper = mVirtualDisplays.valueAt(i); + if (!wrapper.isTrusted() && !wrapper.isMirror()) { + throw new SecurityException("All displays must be trusted for " + + "devices with custom clipboard policy."); } - mDevicePolicies.put(policyType, devicePolicy); } + mDevicePolicies.put(policyType, devicePolicy); } break; case POLICY_TYPE_BLOCKED_ACTIVITY: @@ -1443,15 +1426,11 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub private GenericWindowPolicyController createWindowPolicyControllerLocked( @NonNull Set<String> displayCategories) { final boolean activityLaunchAllowedByDefault = - Flags.dynamicPolicy() - ? getDevicePolicy(POLICY_TYPE_ACTIVITY) == DEVICE_POLICY_DEFAULT - : mParams.getDefaultActivityPolicy() == ACTIVITY_POLICY_DEFAULT_ALLOWED; + getDevicePolicy(POLICY_TYPE_ACTIVITY) == DEVICE_POLICY_DEFAULT; final boolean crossTaskNavigationAllowedByDefault = mParams.getDefaultNavigationPolicy() == NAVIGATION_POLICY_DEFAULT_ALLOWED; final boolean showTasksInHostDeviceRecents = getDevicePolicy(POLICY_TYPE_RECENTS) == DEVICE_POLICY_DEFAULT; - final ComponentName homeComponent = - Flags.vdmCustomHome() ? mParams.getHomeComponent() : null; if (mActivityListenerAdapter == null) { mActivityListenerAdapter = new GwpcActivityListener(); @@ -1472,7 +1451,7 @@ final class VirtualDeviceImpl extends IVirtualDevice.Stub mActivityListenerAdapter, displayCategories, showTasksInHostDeviceRecents, - homeComponent); + mParams.getHomeComponent()); gwpc.registerRunningAppsChangedListener(/* listener= */ this); return gwpc; } diff --git a/services/companion/java/com/android/server/companion/virtual/VirtualDeviceManagerService.java b/services/companion/java/com/android/server/companion/virtual/VirtualDeviceManagerService.java index 40726b4331e2..a60fa693350c 100644 --- a/services/companion/java/com/android/server/companion/virtual/VirtualDeviceManagerService.java +++ b/services/companion/java/com/android/server/companion/virtual/VirtualDeviceManagerService.java @@ -216,17 +216,14 @@ public class VirtualDeviceManagerService extends SystemService { VIRTUAL_DEVICE_SERVICE_ORDERED_ID, mActivityInterceptorCallback); - if (Flags.persistentDeviceIdApi()) { - CompanionDeviceManager cdm = - getContext().getSystemService(CompanionDeviceManager.class); - if (cdm != null) { - onCdmAssociationsChanged(cdm.getAllAssociations(UserHandle.USER_ALL)); - cdm.addOnAssociationsChangedListener(getContext().getMainExecutor(), - this::onCdmAssociationsChanged, UserHandle.USER_ALL); - } else { - Slog.e(TAG, "Failed to find CompanionDeviceManager. No CDM association info " - + " will be available."); - } + CompanionDeviceManager cdm = getContext().getSystemService(CompanionDeviceManager.class); + if (cdm != null) { + onCdmAssociationsChanged(cdm.getAllAssociations(UserHandle.USER_ALL)); + cdm.addOnAssociationsChangedListener(getContext().getMainExecutor(), + this::onCdmAssociationsChanged, UserHandle.USER_ALL); + } else { + Slog.e(TAG, "Failed to find CompanionDeviceManager. No CDM association info " + + " will be available."); } if (android.companion.virtualdevice.flags.Flags.deviceAwareDisplayPower()) { mStrongAuthTracker = new StrongAuthTracker(getContext()); @@ -338,14 +335,6 @@ public class VirtualDeviceManagerService extends SystemService { final long identity = Binder.clearCallingIdentity(); try { getContext().sendBroadcastAsUser(i, UserHandle.ALL); - - if (!Flags.persistentDeviceIdApi()) { - synchronized (mVirtualDeviceManagerLock) { - if (mVirtualDevices.size() == 0) { - unregisterCdmAssociationListener(); - } - } - } } finally { Binder.restoreCallingIdentity(identity); } @@ -379,21 +368,6 @@ public class VirtualDeviceManagerService extends SystemService { } } - @RequiresPermission(android.Manifest.permission.MANAGE_COMPANION_DEVICES) - private void registerCdmAssociationListener() { - final CompanionDeviceManager cdm = getContext().getSystemService( - CompanionDeviceManager.class); - cdm.addOnAssociationsChangedListener(getContext().getMainExecutor(), - mCdmAssociationListener); - } - - @RequiresPermission(android.Manifest.permission.MANAGE_COMPANION_DEVICES) - private void unregisterCdmAssociationListener() { - final CompanionDeviceManager cdm = getContext().getSystemService( - CompanionDeviceManager.class); - cdm.removeOnAssociationsChangedListener(mCdmAssociationListener); - } - void onCdmAssociationsChanged(List<AssociationInfo> associations) { ArrayMap<String, AssociationInfo> vdmAssociations = new ArrayMap<>(); for (int i = 0; i < associations.size(); ++i) { @@ -479,9 +453,8 @@ public class VirtualDeviceManagerService extends SystemService { AssociationInfo associationInfo = getAssociationInfo(packageName, associationId); if (associationInfo == null) { throw new IllegalArgumentException("No association with ID " + associationId); - } else if (!VIRTUAL_DEVICE_COMPANION_DEVICE_PROFILES - .contains(associationInfo.getDeviceProfile()) - && Flags.persistentDeviceIdApi()) { + } else if (!VIRTUAL_DEVICE_COMPANION_DEVICE_PROFILES.contains( + associationInfo.getDeviceProfile())) { throw new IllegalArgumentException("Unsupported CDM Association device profile " + associationInfo.getDeviceProfile() + " for virtual device creation."); } @@ -522,14 +495,6 @@ public class VirtualDeviceManagerService extends SystemService { Counter.logIncrement("virtual_devices.value_virtual_devices_created_count"); synchronized (mVirtualDeviceManagerLock) { - if (!Flags.persistentDeviceIdApi() && mVirtualDevices.size() == 0) { - final long callingId = Binder.clearCallingIdentity(); - try { - registerCdmAssociationListener(); - } finally { - Binder.restoreCallingIdentity(callingId); - } - } mVirtualDevices.put(deviceId, virtualDevice); } diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java index 81956fbb55e6..f4d4c5be035e 100644 --- a/services/core/java/com/android/server/pm/UserManagerService.java +++ b/services/core/java/com/android/server/pm/UserManagerService.java @@ -3312,13 +3312,18 @@ public class UserManagerService extends IUserManager.Stub { } } - - private void sendUserInfoChangedBroadcast(@UserIdInt int userId) { Intent changedIntent = new Intent(Intent.ACTION_USER_INFO_CHANGED); changedIntent.putExtra(Intent.EXTRA_USER_HANDLE, userId); changedIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY); mContext.sendBroadcastAsUser(changedIntent, UserHandle.ALL); + + // This intent allow system UI apps to refresh the content even if process was freezed. + Intent bgIntent = new Intent(Intent.ACTION_USER_INFO_CHANGED_BACKGROUND); + bgIntent.putExtra(Intent.EXTRA_USER_HANDLE, userId); + bgIntent.addFlags(Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND); + mContext.sendBroadcastAsUser(bgIntent, UserHandle.ALL, + Manifest.permission.MANAGE_USERS); } @Override diff --git a/services/core/java/com/android/server/selinux/QuotaExceededException.java b/services/core/java/com/android/server/selinux/QuotaExceededException.java new file mode 100644 index 000000000000..26d4d827af6b --- /dev/null +++ b/services/core/java/com/android/server/selinux/QuotaExceededException.java @@ -0,0 +1,23 @@ +/* + * 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 com.android.server.selinux; + +/** An exception raised when the quota has been reached. + * + * This exception is raised in EventLogCollection.add(). See QuotaLimiter + * for the implementation details. + */ +class QuotaExceededException extends Exception {} diff --git a/services/core/java/com/android/server/selinux/SelinuxAuditLogsCollector.java b/services/core/java/com/android/server/selinux/SelinuxAuditLogsCollector.java index 0aa705892376..54365ff03db0 100644 --- a/services/core/java/com/android/server/selinux/SelinuxAuditLogsCollector.java +++ b/services/core/java/com/android/server/selinux/SelinuxAuditLogsCollector.java @@ -28,10 +28,8 @@ import com.android.server.utils.Slogf; import java.io.IOException; import java.time.Instant; -import java.util.ArrayDeque; -import java.util.ArrayList; -import java.util.List; -import java.util.Queue; +import java.util.AbstractCollection; +import java.util.Iterator; import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Supplier; import java.util.regex.Matcher; @@ -57,6 +55,7 @@ class SelinuxAuditLogsCollector { private final Supplier<String> mAuditDomainSupplier; private final RateLimiter mRateLimiter; private final QuotaLimiter mQuotaLimiter; + private EventLogCollection mEventCollection; @VisibleForTesting Instant mLastWrite = Instant.MIN; @@ -69,6 +68,7 @@ class SelinuxAuditLogsCollector { mAuditDomainSupplier = auditDomainSupplier; mRateLimiter = rateLimiter; mQuotaLimiter = quotaLimiter; + mEventCollection = new EventLogCollection(); } SelinuxAuditLogsCollector(RateLimiter rateLimiter, QuotaLimiter quotaLimiter) { @@ -86,75 +86,72 @@ class SelinuxAuditLogsCollector { mStopRequested.set(stopRequested); } - /** - * Collect and push SELinux audit logs for the provided {@code tagCode}. + /** A Collection to work around EventLog.readEvents() constraints. + * + * This collection only supports add(). Any other method inherited from + * Collection will throw an UnsupportedOperationException exception. * - * @return true if the job was completed. If the job was interrupted, return false. + * This collection ensures that we are processing one event at a time and + * avoid collecting all the event objects before processing (e.g., + * ArrayList), which could lead to an OOM situation. */ - boolean collect(int tagCode) { - Queue<Event> logLines = new ArrayDeque<>(); - Instant latestTimestamp = collectLogLines(tagCode, logLines); - - boolean quotaExceeded = writeAuditLogs(logLines); - if (quotaExceeded) { - Slog.w(TAG, "Too many SELinux logs in the queue, I am giving up."); - mLastWrite = latestTimestamp; // next run we will ignore all these logs. - logLines.clear(); + class EventLogCollection extends AbstractCollection<Event> { + + SelinuxAuditLogBuilder mAuditLogBuilder; + int mAuditsWritten = 0; + Instant mLatestTimestamp; + + void reset() { + mAuditsWritten = 0; + mLatestTimestamp = mLastWrite; + mAuditLogBuilder = new SelinuxAuditLogBuilder(mAuditDomainSupplier.get()); } - return logLines.isEmpty(); - } + int getAuditsWritten() { + return mAuditsWritten; + } - private Instant collectLogLines(int tagCode, Queue<Event> logLines) { - List<Event> events = new ArrayList<>(); - try { - EventLog.readEvents(new int[] {tagCode}, events); - } catch (IOException e) { - Slog.e(TAG, "Error reading event logs", e); + Instant getLatestTimestamp() { + return mLatestTimestamp; } - Instant latestTimestamp = mLastWrite; - for (Event event : events) { - Instant eventTime = Instant.ofEpochSecond(0, event.getTimeNanos()); - if (eventTime.isAfter(latestTimestamp)) { - latestTimestamp = eventTime; + @Override + public Iterator<Event> iterator() { + throw new UnsupportedOperationException(); + } + + @Override + public int size() { + throw new UnsupportedOperationException(); + } + + @Override + public boolean add(Event event) { + if (mStopRequested.get()) { + throw new IllegalStateException(new InterruptedException()); } + + Instant eventTime = Instant.ofEpochSecond(/* epochSecond= */ 0, event.getTimeNanos()); if (eventTime.compareTo(mLastWrite) <= 0) { - continue; + return true; } Object eventData = event.getData(); if (!(eventData instanceof String)) { - continue; + return true; } - logLines.add(event); - } - return latestTimestamp; - } - - private boolean writeAuditLogs(Queue<Event> logLines) { - final SelinuxAuditLogBuilder auditLogBuilder = - new SelinuxAuditLogBuilder(mAuditDomainSupplier.get()); - int auditsWritten = 0; - - while (!mStopRequested.get() && !logLines.isEmpty()) { - Event event = logLines.poll(); - String logLine = (String) event.getData(); - Instant logTime = Instant.ofEpochSecond(0, event.getTimeNanos()); + String logLine = (String) eventData; if (!SELINUX_MATCHER.reset(logLine).matches()) { - continue; + return true; } - auditLogBuilder.reset(SELINUX_MATCHER.group("denial")); - final SelinuxAuditLog auditLog = auditLogBuilder.build(); + mAuditLogBuilder.reset(SELINUX_MATCHER.group("denial")); + final SelinuxAuditLog auditLog = mAuditLogBuilder.build(); if (auditLog == null) { - continue; + return true; } if (!mQuotaLimiter.acquire()) { - if (DEBUG) { - Slogf.d(TAG, "Running out of quota after %d logs.", auditsWritten); - } - return true; + throw new IllegalStateException(new QuotaExceededException()); } mRateLimiter.acquire(); @@ -169,16 +166,50 @@ class SelinuxAuditLogsCollector { auditLog.mTClass, auditLog.mPath, auditLog.mPermissive); - auditsWritten++; - if (logTime.isAfter(mLastWrite)) { - mLastWrite = logTime; + mAuditsWritten++; + if (eventTime.isAfter(mLatestTimestamp)) { + mLatestTimestamp = eventTime; + } + + return true; + } + } + + /** + * Collect and push SELinux audit logs for the provided {@code tagCode}. + * + * @return true if the job was completed. If the job was interrupted or + * failed because of IOException, return false. + * @throws QuotaExceededException if it ran out of quota. + */ + boolean collect(int tagCode) throws QuotaExceededException { + mEventCollection.reset(); + try { + EventLog.readEvents(new int[] {tagCode}, mEventCollection); + } catch (IllegalStateException e) { + if (e.getCause() instanceof QuotaExceededException) { + if (DEBUG) { + Slogf.d(TAG, "Running out of quota after %d logs.", + mEventCollection.getAuditsWritten()); + } + // next run we will ignore all these logs. + mLastWrite = mEventCollection.getLatestTimestamp(); + throw (QuotaExceededException) e.getCause(); + } else if (e.getCause() instanceof InterruptedException) { + mLastWrite = mEventCollection.getLatestTimestamp(); + return false; } + throw e; + } catch (IOException e) { + Slog.e(TAG, "Error reading event logs", e); + return false; } + mLastWrite = mEventCollection.getLatestTimestamp(); if (DEBUG) { - Slogf.d(TAG, "Written %d logs", auditsWritten); + Slogf.d(TAG, "Written %d logs", mEventCollection.getAuditsWritten()); } - return false; + return true; } } diff --git a/services/core/java/com/android/server/selinux/SelinuxAuditLogsJob.java b/services/core/java/com/android/server/selinux/SelinuxAuditLogsJob.java index 0092c3797156..e55e5900f265 100644 --- a/services/core/java/com/android/server/selinux/SelinuxAuditLogsJob.java +++ b/services/core/java/com/android/server/selinux/SelinuxAuditLogsJob.java @@ -51,8 +51,12 @@ final class SelinuxAuditLogsJob { return; } mIsRunning.set(true); - boolean done = mAuditLogsCollector.collect(SelinuxAuditLogsService.AUDITD_TAG_CODE); - if (done) { + try { + boolean done = mAuditLogsCollector.collect(SelinuxAuditLogsService.AUDITD_TAG_CODE); + if (done) { + jobService.jobFinished(params, /* wantsReschedule= */ false); + } + } catch (QuotaExceededException e) { jobService.jobFinished(params, /* wantsReschedule= */ false); } mIsRunning.set(false); diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index d31aed2aee37..e52fbbfde49f 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -90,10 +90,6 @@ import static android.content.pm.ActivityInfo.RESIZE_MODE_RESIZEABLE_VIA_SDK_VER import static android.content.pm.ActivityInfo.RESIZE_MODE_UNRESIZEABLE; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_BEHIND; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSET; -import static android.content.pm.ActivityInfo.SIZE_CHANGES_SUPPORTED_METADATA; -import static android.content.pm.ActivityInfo.SIZE_CHANGES_SUPPORTED_OVERRIDE; -import static android.content.pm.ActivityInfo.SIZE_CHANGES_UNSUPPORTED_METADATA; -import static android.content.pm.ActivityInfo.SIZE_CHANGES_UNSUPPORTED_OVERRIDE; import static android.content.res.Configuration.ASSETS_SEQ_UNDEFINED; import static android.content.res.Configuration.EMPTY; import static android.content.res.Configuration.ORIENTATION_LANDSCAPE; @@ -1272,8 +1268,9 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A pw.println(prefix + "manifestMinAspectRatio=" + info.getManifestMinAspectRatio()); } - pw.println(prefix + "supportsSizeChanges=" - + ActivityInfo.sizeChangesSupportModeToString(supportsSizeChanges())); + pw.println( + prefix + "supportsSizeChanges=" + ActivityInfo.sizeChangesSupportModeToString( + mAppCompatController.getSizeCompatModePolicy().supportsSizeChanges())); if (info.configChanges != 0) { pw.println(prefix + "configChanges=0x" + Integer.toHexString(info.configChanges)); } @@ -6581,7 +6578,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A mTaskSupervisor.mStoppingActivities.remove(this); if (getDisplayArea().allResumedActivitiesComplete()) { // Construct the compat environment at a relatively stable state if needed. - mAppCompatController.getAppCompatSizeCompatModePolicy().updateAppCompatDisplayInsets(); + mAppCompatController.getSizeCompatModePolicy().updateAppCompatDisplayInsets(); mRootWindowContainer.executeAppTransitionForAllDisplay(); } @@ -8222,7 +8219,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A != getRequestedConfigurationOrientation(false /*forDisplay */)) { // Do not change the requested configuration now, because this will be done when setting // the orientation below with the new mAppCompatDisplayInsets - mAppCompatController.getAppCompatSizeCompatModePolicy().clearSizeCompatModeAttributes(); + mAppCompatController.getSizeCompatModePolicy().clearSizeCompatModeAttributes(); } ProtoLog.v(WM_DEBUG_ORIENTATION, "Setting requested orientation %s for %s", @@ -8366,7 +8363,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A @Nullable AppCompatDisplayInsets getAppCompatDisplayInsets() { - return mAppCompatController.getAppCompatSizeCompatModePolicy().getAppCompatDisplayInsets(); + return mAppCompatController.getSizeCompatModePolicy().getAppCompatDisplayInsets(); } /** @@ -8374,31 +8371,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A * density than its parent or its bounds don't fit in parent naturally. */ boolean inSizeCompatMode() { - final AppCompatSizeCompatModePolicy scmPolicy = mAppCompatController - .getAppCompatSizeCompatModePolicy(); - if (scmPolicy.isInSizeCompatModeForBounds()) { - return true; - } - if (getAppCompatDisplayInsets() == null || !shouldCreateAppCompatDisplayInsets() - // The orientation is different from parent when transforming. - || isFixedRotationTransforming()) { - return false; - } - final Rect appBounds = getConfiguration().windowConfiguration.getAppBounds(); - if (appBounds == null) { - // The app bounds hasn't been computed yet. - return false; - } - final WindowContainer parent = getParent(); - if (parent == null) { - // The parent of detached Activity can be null. - return false; - } - final Configuration parentConfig = parent.getConfiguration(); - // Although colorMode, screenLayout, smallestScreenWidthDp are also fixed, generally these - // fields should be changed with density and bounds, so here only compares the most - // significant field. - return parentConfig.densityDpi != getConfiguration().densityDpi; + return mAppCompatController.getSizeCompatModePolicy().inSizeCompatMode(); } /** @@ -8412,67 +8385,12 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A * aspect ratio. */ boolean shouldCreateAppCompatDisplayInsets() { - if (mAppCompatController.getAppCompatAspectRatioOverrides().hasFullscreenOverride()) { - // If the user has forced the applications aspect ratio to be fullscreen, don't use size - // compatibility mode in any situation. The user has been warned and therefore accepts - // the risk of the application misbehaving. - return false; - } - switch (supportsSizeChanges()) { - case SIZE_CHANGES_SUPPORTED_METADATA: - case SIZE_CHANGES_SUPPORTED_OVERRIDE: - return false; - case SIZE_CHANGES_UNSUPPORTED_OVERRIDE: - return true; - default: - // Fall through - } - // Use root activity's info for tasks in multi-window mode, or fullscreen tasks in freeform - // task display areas, to ensure visual consistency across activity launches and exits in - // the same task. - final TaskDisplayArea tda = getTaskDisplayArea(); - if (inMultiWindowMode() || (tda != null && tda.inFreeformWindowingMode())) { - final ActivityRecord root = task != null ? task.getRootActivity() : null; - if (root != null && root != this && !root.shouldCreateAppCompatDisplayInsets()) { - // If the root activity doesn't use size compatibility mode, the activities above - // are forced to be the same for consistent visual appearance. - return false; - } - } - return !isResizeable() && (info.isFixedOrientation() || hasFixedAspectRatio()) - // The configuration of non-standard type should be enforced by system. - // {@link WindowConfiguration#ACTIVITY_TYPE_STANDARD} is set when this activity is - // added to a task, but this function is called when resolving the launch params, at - // which point, the activity type is still undefined if it will be standard. - // For other non-standard types, the type is set in the constructor, so this should - // not be a problem. - && isActivityTypeStandardOrUndefined(); - } - - /** - * Returns whether the activity supports size changes. - */ - @ActivityInfo.SizeChangesSupportMode - private int supportsSizeChanges() { - final AppCompatResizeOverrides resizeOverrides = mAppCompatController.getResizeOverrides(); - if (resizeOverrides.shouldOverrideForceNonResizeApp()) { - return SIZE_CHANGES_UNSUPPORTED_OVERRIDE; - } - - if (info.supportsSizeChanges) { - return SIZE_CHANGES_SUPPORTED_METADATA; - } - - if (resizeOverrides.shouldOverrideForceResizeApp()) { - return SIZE_CHANGES_SUPPORTED_OVERRIDE; - } - - return SIZE_CHANGES_UNSUPPORTED_METADATA; + return mAppCompatController.getSizeCompatModePolicy().shouldCreateAppCompatDisplayInsets(); } @Override boolean hasSizeCompatBounds() { - return mAppCompatController.getAppCompatSizeCompatModePolicy().hasSizeCompatBounds(); + return mAppCompatController.getSizeCompatModePolicy().hasSizeCompatBounds(); } @Override @@ -8491,7 +8409,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A @Override float getCompatScale() { // We need to invoke {#getCompatScale()} only if the CompatScale is not available. - return mAppCompatController.getAppCompatSizeCompatModePolicy() + return mAppCompatController.getSizeCompatModePolicy() .getCompatScaleIfAvailable(ActivityRecord.super::getCompatScale); } @@ -8518,7 +8436,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A newParentConfiguration = mTmpConfig; } - mAppCompatController.getAppCompatAspectRatioPolicy().reset(); + mAppCompatController.getAspectRatioPolicy().reset(); mIsEligibleForFixedOrientationLetterbox = false; mResolveConfigHint.resolveTmpOverrides(mDisplayContent, newParentConfiguration, isFixedRotationTransforming()); @@ -8549,7 +8467,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // If activity in fullscreen mode is letterboxed because of fixed orientation then bounds // are already calculated in resolveFixedOrientationConfiguration. // Don't apply aspect ratio if app is overridden to fullscreen by device user/manufacturer. - if (!mAppCompatController.getAppCompatAspectRatioPolicy() + if (!mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio() && !mAppCompatController.getAppCompatAspectRatioOverrides() .hasFullscreenOverride()) { @@ -8557,7 +8475,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A } final AppCompatDisplayInsets appCompatDisplayInsets = getAppCompatDisplayInsets(); final AppCompatSizeCompatModePolicy scmPolicy = - mAppCompatController.getAppCompatSizeCompatModePolicy(); + mAppCompatController.getSizeCompatModePolicy(); if (appCompatDisplayInsets != null) { scmPolicy.resolveSizeCompatModeConfiguration(newParentConfiguration, appCompatDisplayInsets, mTmpBounds); @@ -8586,7 +8504,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // Fixed orientation letterboxing is possible on both large screen devices // with ignoreOrientationRequest enabled and on phones in split screen even with // ignoreOrientationRequest disabled. - && (mAppCompatController.getAppCompatAspectRatioPolicy() + && (mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio() // Limiting check for aspect ratio letterboxing to devices with enabled // ignoreOrientationRequest. This avoids affecting phones where apps may @@ -8595,7 +8513,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // accurate on phones shouldn't make the big difference and is expected // to be already well-tested by apps. || (isIgnoreOrientationRequest - && mAppCompatController.getAppCompatAspectRatioPolicy().isAspectRatioApplied()))) { + && mAppCompatController.getAspectRatioPolicy().isAspectRatioApplied()))) { // TODO(b/264034555): Use mDisplayContent to calculate smallestScreenWidthDp from all // rotations and only re-calculate if parent bounds have non-orientation size change. resolvedConfig.smallestScreenWidthDp = @@ -8707,7 +8625,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A return mAppCompatController.getTransparentPolicy().getInheritedAppCompatState(); } final AppCompatSizeCompatModePolicy scmPolicy = mAppCompatController - .getAppCompatSizeCompatModePolicy(); + .getSizeCompatModePolicy(); if (scmPolicy.isInSizeCompatModeForBounds()) { return APP_COMPAT_STATE_CHANGED__STATE__LETTERBOXED_FOR_SIZE_COMPAT_MODE; } @@ -8715,13 +8633,13 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // letterboxed for fixed orientation. Aspect ratio restrictions are also applied if // present. But this doesn't return true when the activity is letterboxed only because // of aspect ratio restrictions. - if (mAppCompatController.getAppCompatAspectRatioPolicy() - .isLetterboxedForFixedOrientationAndAspectRatio()) { + final AppCompatAspectRatioPolicy aspectRatioPolicy = + mAppCompatController.getAspectRatioPolicy(); + if (aspectRatioPolicy.isLetterboxedForFixedOrientationAndAspectRatio()) { return APP_COMPAT_STATE_CHANGED__STATE__LETTERBOXED_FOR_FIXED_ORIENTATION; } // Letterbox for limited aspect ratio. - if (mAppCompatController.getAppCompatAspectRatioPolicy() - .isLetterboxedForAspectRatioOnly()) { + if (aspectRatioPolicy.isLetterboxedForAspectRatioOnly()) { return APP_COMPAT_STATE_CHANGED__STATE__LETTERBOXED_FOR_ASPECT_RATIO; } @@ -8745,7 +8663,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A return; } final AppCompatSizeCompatModePolicy scmPolicy = - mAppCompatController.getAppCompatSizeCompatModePolicy(); + mAppCompatController.getSizeCompatModePolicy(); final Rect screenResolvedBounds = scmPolicy.replaceResolvedBoundsIfNeeded(resolvedBounds); final Rect parentAppBounds = mResolveConfigHint.mParentAppBoundsOverride; final Rect parentBounds = newParentConfiguration.windowConfiguration.getBounds(); @@ -8843,7 +8761,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A final Configuration resolvedConfig = getResolvedOverrideConfiguration(); final Rect resolvedBounds = resolvedConfig.windowConfiguration.getBounds(); final AppCompatSizeCompatModePolicy scmPolicy = - mAppCompatController.getAppCompatSizeCompatModePolicy(); + mAppCompatController.getSizeCompatModePolicy(); return scmPolicy.replaceResolvedBoundsIfNeeded(resolvedBounds); } @@ -8997,7 +8915,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A } final AppCompatDisplayInsets appCompatDisplayInsets = getAppCompatDisplayInsets(); final AppCompatSizeCompatModePolicy scmPolicy = - mAppCompatController.getAppCompatSizeCompatModePolicy(); + mAppCompatController.getSizeCompatModePolicy(); if (appCompatDisplayInsets != null && !appCompatDisplayInsets.mIsInFixedOrientationOrAspectRatioLetterbox) { @@ -9048,8 +8966,10 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A final Rect prevResolvedBounds = new Rect(resolvedBounds); resolvedBounds.set(containingBounds); - mAppCompatController.getAppCompatAspectRatioPolicy() - .applyDesiredAspectRatio(newParentConfig, parentBounds, resolvedBounds, + final AppCompatAspectRatioPolicy aspectRatioPolicy = mAppCompatController + .getAspectRatioPolicy(); + + aspectRatioPolicy.applyDesiredAspectRatio(newParentConfig, parentBounds, resolvedBounds, containingBoundsWithInsets, containingBounds); if (appCompatDisplayInsets != null) { @@ -9078,8 +8998,8 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // for comparison with size compat app bounds in {@link resolveSizeCompatModeConfiguration}. mResolveConfigHint.mTmpCompatInsets = appCompatDisplayInsets; computeConfigByResolveHint(getResolvedOverrideConfiguration(), newParentConfig); - mAppCompatController.getAppCompatAspectRatioPolicy() - .setLetterboxBoundsForFixedOrientationAndAspectRatio(new Rect(resolvedBounds)); + aspectRatioPolicy.setLetterboxBoundsForFixedOrientationAndAspectRatio( + new Rect(resolvedBounds)); } /** @@ -9096,8 +9016,9 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // Use tmp bounds to calculate aspect ratio so we can know whether the activity should use // restricted size (resolved bounds may be the requested override bounds). mTmpBounds.setEmpty(); - mAppCompatController.getAppCompatAspectRatioPolicy() - .applyAspectRatioForLetterbox(mTmpBounds, parentAppBounds, parentBounds); + final AppCompatAspectRatioPolicy aspectRatioPolicy = mAppCompatController + .getAspectRatioPolicy(); + aspectRatioPolicy.applyAspectRatioForLetterbox(mTmpBounds, parentAppBounds, parentBounds); // If the out bounds is not empty, it means the activity cannot fill parent's app bounds, // then they should be aligned later in #updateResolvedBoundsPosition() if (!mTmpBounds.isEmpty()) { @@ -9108,8 +9029,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // restrict, the bounds should be the requested override bounds. mResolveConfigHint.mTmpOverrideDisplayInfo = getFixedRotationTransformDisplayInfo(); computeConfigByResolveHint(resolvedConfig, newParentConfiguration); - mAppCompatController.getAppCompatAspectRatioPolicy() - .setLetterboxBoundsForAspectRatio(new Rect(resolvedBounds)); + aspectRatioPolicy.setLetterboxBoundsForAspectRatio(new Rect(resolvedBounds)); } } @@ -9118,7 +9038,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // TODO(b/268458693): Refactor configuration inheritance in case of translucent activities final Rect superBounds = super.getBounds(); final AppCompatSizeCompatModePolicy scmPolicy = - mAppCompatController.getAppCompatSizeCompatModePolicy(); + mAppCompatController.getSizeCompatModePolicy(); return mAppCompatController.getTransparentPolicy().findOpaqueNotFinishingActivityBelow() .map(ActivityRecord::getBounds) .orElseGet(() -> scmPolicy.getAppSizeCompatBoundsIfAvailable(superBounds)); @@ -9359,18 +9279,11 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A * Returns the min aspect ratio of this activity. */ float getMinAspectRatio() { - return mAppCompatController.getAppCompatAspectRatioPolicy().getMinAspectRatio(); + return mAppCompatController.getAspectRatioPolicy().getMinAspectRatio(); } float getMaxAspectRatio() { - return mAppCompatController.getAppCompatAspectRatioPolicy().getMaxAspectRatio(); - } - - /** - * Returns true if the activity has maximum or minimum aspect ratio. - */ - private boolean hasFixedAspectRatio() { - return getMaxAspectRatio() != 0 || getMinAspectRatio() != 0; + return mAppCompatController.getAspectRatioPolicy().getMaxAspectRatio(); } /** @@ -9452,7 +9365,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A if (mVisibleRequested) { // Calling from here rather than resolveOverrideConfiguration to ensure that this is // called after full config is updated in ConfigurationContainer#onConfigurationChanged. - mAppCompatController.getAppCompatSizeCompatModePolicy().updateAppCompatDisplayInsets(); + mAppCompatController.getSizeCompatModePolicy().updateAppCompatDisplayInsets(); } // Short circuit: if the two full configurations are equal (the common case), then there is @@ -9792,7 +9705,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // Reset the existing override configuration so it can be updated according to the latest // configuration. - mAppCompatController.getAppCompatSizeCompatModePolicy().clearSizeCompatMode(); + mAppCompatController.getSizeCompatModePolicy().clearSizeCompatMode(); if (!attachedToProcess()) { return; diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java index 0ab2ffe3e298..bdbd0d15d982 100644 --- a/services/core/java/com/android/server/wm/ActivityStarter.java +++ b/services/core/java/com/android/server/wm/ActivityStarter.java @@ -1964,7 +1964,6 @@ class ActivityStarter { if (mLastStartActivityRecord != null) { targetTaskTop.mLaunchSourceType = mLastStartActivityRecord.mLaunchSourceType; } - targetTaskTop.mTransitionController.collect(targetTaskTop); recordTransientLaunchIfNeeded(targetTaskTop); // Recycle the target task for this launch. startResult = diff --git a/services/core/java/com/android/server/wm/AppCompatAspectRatioPolicy.java b/services/core/java/com/android/server/wm/AppCompatAspectRatioPolicy.java index 6a0de98c0ffa..3e232ea6b612 100644 --- a/services/core/java/com/android/server/wm/AppCompatAspectRatioPolicy.java +++ b/services/core/java/com/android/server/wm/AppCompatAspectRatioPolicy.java @@ -215,6 +215,13 @@ class AppCompatAspectRatioPolicy { mAppCompatAspectRatioState.mLetterboxBoundsForAspectRatio = bounds; } + /** + * Returns true if the activity has maximum or minimum aspect ratio. + */ + boolean hasFixedAspectRatio() { + return getMaxAspectRatio() != 0 || getMinAspectRatio() != 0; + } + private boolean isParentFullscreenPortrait() { final WindowContainer<?> parent = mActivityRecord.getParent(); return parent != null diff --git a/services/core/java/com/android/server/wm/AppCompatController.java b/services/core/java/com/android/server/wm/AppCompatController.java index 6d0e8eacd438..fa510dbcafae 100644 --- a/services/core/java/com/android/server/wm/AppCompatController.java +++ b/services/core/java/com/android/server/wm/AppCompatController.java @@ -31,7 +31,7 @@ class AppCompatController { @NonNull private final AppCompatOrientationPolicy mOrientationPolicy; @NonNull - private final AppCompatAspectRatioPolicy mAppCompatAspectRatioPolicy; + private final AppCompatAspectRatioPolicy mAspectRatioPolicy; @NonNull private final AppCompatReachabilityPolicy mReachabilityPolicy; @NonNull @@ -43,7 +43,7 @@ class AppCompatController { @NonNull private final AppCompatLetterboxPolicy mAppCompatLetterboxPolicy; @NonNull - private final AppCompatSizeCompatModePolicy mAppCompatSizeCompatModePolicy; + private final AppCompatSizeCompatModePolicy mSizeCompatModePolicy; AppCompatController(@NonNull WindowManagerService wmService, @NonNull ActivityRecord activityRecord) { @@ -56,7 +56,7 @@ class AppCompatController { mAppCompatOverrides = new AppCompatOverrides(activityRecord, packageManager, wmService.mAppCompatConfiguration, optPropBuilder, mAppCompatDeviceStateQuery); mOrientationPolicy = new AppCompatOrientationPolicy(activityRecord, mAppCompatOverrides); - mAppCompatAspectRatioPolicy = new AppCompatAspectRatioPolicy(activityRecord, + mAspectRatioPolicy = new AppCompatAspectRatioPolicy(activityRecord, mTransparentPolicy, mAppCompatOverrides); mReachabilityPolicy = new AppCompatReachabilityPolicy(activityRecord, wmService.mAppCompatConfiguration); @@ -64,7 +64,7 @@ class AppCompatController { wmService.mAppCompatConfiguration); mDesktopAppCompatAspectRatioPolicy = new DesktopAppCompatAspectRatioPolicy(activityRecord, mAppCompatOverrides, mTransparentPolicy, wmService.mAppCompatConfiguration); - mAppCompatSizeCompatModePolicy = new AppCompatSizeCompatModePolicy(activityRecord, + mSizeCompatModePolicy = new AppCompatSizeCompatModePolicy(activityRecord, mAppCompatOverrides); } @@ -79,8 +79,8 @@ class AppCompatController { } @NonNull - AppCompatAspectRatioPolicy getAppCompatAspectRatioPolicy() { - return mAppCompatAspectRatioPolicy; + AppCompatAspectRatioPolicy getAspectRatioPolicy() { + return mAspectRatioPolicy; } @NonNull @@ -139,14 +139,14 @@ class AppCompatController { } @NonNull - AppCompatSizeCompatModePolicy getAppCompatSizeCompatModePolicy() { - return mAppCompatSizeCompatModePolicy; + AppCompatSizeCompatModePolicy getSizeCompatModePolicy() { + return mSizeCompatModePolicy; } void dump(@NonNull PrintWriter pw, @NonNull String prefix) { getTransparentPolicy().dump(pw, prefix); getAppCompatLetterboxPolicy().dump(pw, prefix); - getAppCompatSizeCompatModePolicy().dump(pw, prefix); + getSizeCompatModePolicy().dump(pw, prefix); } } diff --git a/services/core/java/com/android/server/wm/AppCompatOrientationOverrides.java b/services/core/java/com/android/server/wm/AppCompatOrientationOverrides.java index af83668f1188..a49bec0ba2f3 100644 --- a/services/core/java/com/android/server/wm/AppCompatOrientationOverrides.java +++ b/services/core/java/com/android/server/wm/AppCompatOrientationOverrides.java @@ -144,7 +144,7 @@ class AppCompatOrientationOverrides { mOrientationOverridesState.updateOrientationRequestLoopState(); return mOrientationOverridesState.shouldIgnoreRequestInLoop() - && !mActivityRecord.mAppCompatController.getAppCompatAspectRatioPolicy() + && !mActivityRecord.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio(); } diff --git a/services/core/java/com/android/server/wm/AppCompatSizeCompatModePolicy.java b/services/core/java/com/android/server/wm/AppCompatSizeCompatModePolicy.java index d278dc3d1be7..98bb8e79b51f 100644 --- a/services/core/java/com/android/server/wm/AppCompatSizeCompatModePolicy.java +++ b/services/core/java/com/android/server/wm/AppCompatSizeCompatModePolicy.java @@ -18,6 +18,10 @@ package com.android.server.wm; import static android.app.WindowConfiguration.ROTATION_UNDEFINED; import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM; +import static android.content.pm.ActivityInfo.SIZE_CHANGES_SUPPORTED_METADATA; +import static android.content.pm.ActivityInfo.SIZE_CHANGES_SUPPORTED_OVERRIDE; +import static android.content.pm.ActivityInfo.SIZE_CHANGES_UNSUPPORTED_METADATA; +import static android.content.pm.ActivityInfo.SIZE_CHANGES_UNSUPPORTED_OVERRIDE; import static android.content.res.Configuration.ORIENTATION_UNDEFINED; import static com.android.server.wm.DesktopModeHelper.canEnterDesktopMode; @@ -82,7 +86,8 @@ class AppCompatSizeCompatModePolicy { } /** - * @return The {@code true} if the current instance has {@link #mAppCompatDisplayInsets} without + * @return The {@code true} if the current instance has + * {@link AppCompatSizeCompatModePolicy#mAppCompatDisplayInsets} without * considering the inheritance implemented in {@link #getAppCompatDisplayInsets()} */ boolean hasAppCompatDisplayInsetsWithoutInheritance() { @@ -199,7 +204,7 @@ class AppCompatSizeCompatModePolicy { // activity will be displayed within them even if it is in size compat mode. They should be // saved here before resolved bounds are overridden below. final AppCompatAspectRatioPolicy aspectRatioPolicy = mActivityRecord.mAppCompatController - .getAppCompatAspectRatioPolicy(); + .getAspectRatioPolicy(); final boolean useResolvedBounds = aspectRatioPolicy.isAspectRatioApplied(); final Rect containerBounds = useResolvedBounds ? new Rect(resolvedBounds) @@ -244,8 +249,7 @@ class AppCompatSizeCompatModePolicy { resolvedBounds.set(containingBounds); // The size of floating task is fixed (only swap), so the aspect ratio is already correct. if (!appCompatDisplayInsets.mIsFloating) { - mActivityRecord.mAppCompatController.getAppCompatAspectRatioPolicy() - .applyAspectRatioForLetterbox(resolvedBounds, containingAppBounds, + aspectRatioPolicy.applyAspectRatioForLetterbox(resolvedBounds, containingAppBounds, containingBounds); } @@ -359,7 +363,7 @@ class AppCompatSizeCompatModePolicy { } final Rect letterboxedContainerBounds = mActivityRecord.mAppCompatController - .getAppCompatAspectRatioPolicy().getLetterboxedContainerBounds(); + .getAspectRatioPolicy().getLetterboxedContainerBounds(); // The role of AppCompatDisplayInsets is like the override bounds. mAppCompatDisplayInsets = @@ -368,6 +372,112 @@ class AppCompatSizeCompatModePolicy { .mUseOverrideInsetsForConfig); } + /** + * @return {@code true} if this activity is in size compatibility mode that uses the different + * density than its parent or its bounds don't fit in parent naturally. + */ + boolean inSizeCompatMode() { + if (isInSizeCompatModeForBounds()) { + return true; + } + if (getAppCompatDisplayInsets() == null || !shouldCreateAppCompatDisplayInsets() + // The orientation is different from parent when transforming. + || mActivityRecord.isFixedRotationTransforming()) { + return false; + } + final Rect appBounds = mActivityRecord.getConfiguration().windowConfiguration + .getAppBounds(); + if (appBounds == null) { + // The app bounds hasn't been computed yet. + return false; + } + final WindowContainer<?> parent = mActivityRecord.getParent(); + if (parent == null) { + // The parent of detached Activity can be null. + return false; + } + final Configuration parentConfig = parent.getConfiguration(); + // Although colorMode, screenLayout, smallestScreenWidthDp are also fixed, generally these + // fields should be changed with density and bounds, so here only compares the most + // significant field. + return parentConfig.densityDpi != mActivityRecord.getConfiguration().densityDpi; + } + + /** + * Indicates the activity will keep the bounds and screen configuration when it was first + * launched, no matter how its parent changes. + * + * <p>If {@true}, then {@link AppCompatDisplayInsets} will be created in {@link + * ActivityRecord#resolveOverrideConfiguration} to "freeze" activity bounds and insets. + * + * @return {@code true} if this activity is declared as non-resizable and fixed orientation or + * aspect ratio. + */ + boolean shouldCreateAppCompatDisplayInsets() { + if (mActivityRecord.mAppCompatController.getAppCompatAspectRatioOverrides() + .hasFullscreenOverride()) { + // If the user has forced the applications aspect ratio to be fullscreen, don't use size + // compatibility mode in any situation. The user has been warned and therefore accepts + // the risk of the application misbehaving. + return false; + } + switch (supportsSizeChanges()) { + case SIZE_CHANGES_SUPPORTED_METADATA: + case SIZE_CHANGES_SUPPORTED_OVERRIDE: + return false; + case SIZE_CHANGES_UNSUPPORTED_OVERRIDE: + return true; + default: + // Fall through + } + // Use root activity's info for tasks in multi-window mode, or fullscreen tasks in freeform + // task display areas, to ensure visual consistency across activity launches and exits in + // the same task. + final TaskDisplayArea tda = mActivityRecord.getTaskDisplayArea(); + if (mActivityRecord.inMultiWindowMode() || (tda != null && tda.inFreeformWindowingMode())) { + final Task task = mActivityRecord.getTask(); + final ActivityRecord root = task != null ? task.getRootActivity() : null; + if (root != null && root != mActivityRecord + && !root.shouldCreateAppCompatDisplayInsets()) { + // If the root activity doesn't use size compatibility mode, the activities above + // are forced to be the same for consistent visual appearance. + return false; + } + } + final AppCompatAspectRatioPolicy aspectRatioPolicy = mActivityRecord.mAppCompatController + .getAspectRatioPolicy(); + return !mActivityRecord.isResizeable() && (mActivityRecord.info.isFixedOrientation() + || aspectRatioPolicy.hasFixedAspectRatio()) + // The configuration of non-standard type should be enforced by system. + // {@link WindowConfiguration#ACTIVITY_TYPE_STANDARD} is set when this activity is + // added to a task, but this function is called when resolving the launch params, at + // which point, the activity type is still undefined if it will be standard. + // For other non-standard types, the type is set in the constructor, so this should + // not be a problem. + && mActivityRecord.isActivityTypeStandardOrUndefined(); + } + + /** + * Returns whether the activity supports size changes. + */ + @ActivityInfo.SizeChangesSupportMode + int supportsSizeChanges() { + final AppCompatResizeOverrides resizeOverrides = mAppCompatOverrides.getResizeOverrides(); + if (resizeOverrides.shouldOverrideForceNonResizeApp()) { + return SIZE_CHANGES_UNSUPPORTED_OVERRIDE; + } + + if (mActivityRecord.info.supportsSizeChanges) { + return SIZE_CHANGES_SUPPORTED_METADATA; + } + + if (resizeOverrides.shouldOverrideForceResizeApp()) { + return SIZE_CHANGES_SUPPORTED_OVERRIDE; + } + + return SIZE_CHANGES_UNSUPPORTED_METADATA; + } + private boolean isInSizeCompatModeForBounds(final @NonNull Rect appBounds, final @NonNull Rect containerBounds) { diff --git a/services/core/java/com/android/server/wm/AppCompatUtils.java b/services/core/java/com/android/server/wm/AppCompatUtils.java index e28dddc496e1..e54e93abfcf4 100644 --- a/services/core/java/com/android/server/wm/AppCompatUtils.java +++ b/services/core/java/com/android/server/wm/AppCompatUtils.java @@ -222,7 +222,7 @@ final class AppCompatUtils { return "SIZE_COMPAT_MODE"; } final AppCompatAspectRatioPolicy aspectRatioPolicy = activityRecord.mAppCompatController - .getAppCompatAspectRatioPolicy(); + .getAspectRatioPolicy(); if (aspectRatioPolicy.isLetterboxedForFixedOrientationAndAspectRatio()) { return "FIXED_ORIENTATION"; } diff --git a/services/core/java/com/android/server/wm/BackNavigationController.java b/services/core/java/com/android/server/wm/BackNavigationController.java index 37575f00363e..ab32e54b92dd 100644 --- a/services/core/java/com/android/server/wm/BackNavigationController.java +++ b/services/core/java/com/android/server/wm/BackNavigationController.java @@ -36,6 +36,7 @@ import static com.android.server.wm.BackNavigationProto.SHOW_WALLPAPER; import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_PREDICT_BACK; import static com.android.server.wm.WindowContainer.SYNC_STATE_NONE; +import android.annotation.BinderThread; import android.annotation.NonNull; import android.annotation.Nullable; import android.content.Context; @@ -44,6 +45,7 @@ import android.content.res.ResourceId; import android.graphics.Point; import android.graphics.Rect; import android.os.Bundle; +import android.os.IBinder; import android.os.RemoteCallback; import android.os.RemoteException; import android.os.SystemProperties; @@ -705,12 +707,34 @@ class BackNavigationController { private WindowState mNavigatingWindow; private RemoteCallback mObserver; + private final IBinder.DeathRecipient mListenerDeathRecipient = + new IBinder.DeathRecipient() { + @Override + @BinderThread + public void binderDied() { + synchronized (mWindowManagerService.mGlobalLock) { + stopMonitorForRemote(); + stopMonitorTransition(); + } + } + }; + void startMonitor(@NonNull WindowState window, @NonNull RemoteCallback observer) { mNavigatingWindow = window; mObserver = observer; + try { + mObserver.getInterface().asBinder().linkToDeath(mListenerDeathRecipient, + 0 /* flags */); + } catch (RemoteException r) { + Slog.e(TAG, "Failed to link to death"); + } } void stopMonitorForRemote() { + if (mObserver != null) { + mObserver.getInterface().asBinder().unlinkToDeath(mListenerDeathRecipient, + 0 /* flags */); + } mObserver = null; } diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java index 57fe0bb4937e..04f09d5fe627 100644 --- a/services/core/java/com/android/server/wm/RootWindowContainer.java +++ b/services/core/java/com/android/server/wm/RootWindowContainer.java @@ -152,7 +152,6 @@ import com.android.server.LocalServices; import com.android.server.am.ActivityManagerService; import com.android.server.am.AppTimeTracker; import com.android.server.am.UserState; -import com.android.server.display.feature.DisplayManagerFlags; import com.android.server.pm.UserManagerInternal; import com.android.server.policy.PermissionPolicyInternal; import com.android.server.policy.WindowManagerPolicy; @@ -1541,20 +1540,18 @@ class RootWindowContainer extends WindowContainer<DisplayContent> ActivityInfo aInfo = resolveHomeActivity(userId, homeIntent); boolean lookForSecondaryHomeActivityInPrimaryHomePackage = aInfo != null; - if (android.companion.virtual.flags.Flags.vdmCustomHome()) { - // Resolve the externally set home activity for this display, if any. If it is unset or - // we fail to resolve it, fallback to the default secondary home activity. - final ComponentName customHomeComponent = - taskDisplayArea.getDisplayContent() != null - ? taskDisplayArea.getDisplayContent().getCustomHomeComponent() - : null; - if (customHomeComponent != null) { - homeIntent.setComponent(customHomeComponent); - ActivityInfo customHomeActivityInfo = resolveHomeActivity(userId, homeIntent); - if (customHomeActivityInfo != null) { - aInfo = customHomeActivityInfo; - lookForSecondaryHomeActivityInPrimaryHomePackage = false; - } + // Resolve the externally set home activity for this display, if any. If it is unset or + // we fail to resolve it, fallback to the default secondary home activity. + final ComponentName customHomeComponent = + taskDisplayArea.getDisplayContent() != null + ? taskDisplayArea.getDisplayContent().getCustomHomeComponent() + : null; + if (customHomeComponent != null) { + homeIntent.setComponent(customHomeComponent); + ActivityInfo customHomeActivityInfo = resolveHomeActivity(userId, homeIntent); + if (customHomeActivityInfo != null) { + aInfo = customHomeActivityInfo; + lookForSecondaryHomeActivityInPrimaryHomePackage = false; } } diff --git a/services/core/java/com/android/server/wm/TransparentPolicy.java b/services/core/java/com/android/server/wm/TransparentPolicy.java index edd99243c3ef..88ea0730ab00 100644 --- a/services/core/java/com/android/server/wm/TransparentPolicy.java +++ b/services/core/java/com/android/server/wm/TransparentPolicy.java @@ -204,7 +204,7 @@ class TransparentPolicy { return true; } final AppCompatSizeCompatModePolicy scmPolicy = mActivityRecord.mAppCompatController - .getAppCompatSizeCompatModePolicy(); + .getSizeCompatModePolicy(); if (mActivityRecord.getTask() == null || mActivityRecord.fillsParent() || scmPolicy.hasAppCompatDisplayInsetsWithoutInheritance()) { return true; diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java index 0154d95d888d..d973fb014e35 100644 --- a/services/core/java/com/android/server/wm/WindowStateAnimator.java +++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java @@ -480,18 +480,6 @@ class WindowStateAnimator { if (mLastHidden) { showRobustly(t); mLastHidden = false; - final DisplayContent displayContent = w.getDisplayContent(); - if (!displayContent.getLastHasContent()) { - // This draw means the difference between unique content and mirroring. - // Run another pass through performLayout to set mHasContent in the - // LogicalDisplay. - displayContent.pendingLayoutChanges |= FINISH_LAYOUT_REDO_ANIM; - if (DEBUG_LAYOUT_REPEATS) { - mService.mWindowPlacerLocked.debugLayoutRepeats( - "showSurfaceRobustlyLocked " + w, - displayContent.pendingLayoutChanges); - } - } } } } diff --git a/services/tests/selinux/src/com/android/server/selinux/SelinuxAuditLogsCollectorTest.java b/services/tests/selinux/src/com/android/server/selinux/SelinuxAuditLogsCollectorTest.java index db58c74e8431..29f55ff53e6e 100644 --- a/services/tests/selinux/src/com/android/server/selinux/SelinuxAuditLogsCollectorTest.java +++ b/services/tests/selinux/src/com/android/server/selinux/SelinuxAuditLogsCollectorTest.java @@ -20,6 +20,7 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify; import static com.google.common.truth.Truth.assertThat; +import static org.junit.Assert.assertThrows; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; @@ -81,7 +82,7 @@ public class SelinuxAuditLogsCollectorTest { } @Test - public void testWriteAuditLogs() { + public void testWriteAuditLogs() throws Exception { writeTestLog("granted", "perm", TEST_DOMAIN, "ttype", "tclass"); writeTestLog("denied", "perm1", TEST_DOMAIN, "ttype1", "tclass1"); @@ -117,7 +118,7 @@ public class SelinuxAuditLogsCollectorTest { } @Test - public void testWriteAuditLogs_multiplePerms() { + public void testWriteAuditLogs_multiplePerms() throws Exception { writeTestLog("denied", "perm1 perm2", TEST_DOMAIN, "ttype", "tclass"); writeTestLog("denied", "perm3 perm4", TEST_DOMAIN, "ttype", "tclass"); @@ -153,7 +154,7 @@ public class SelinuxAuditLogsCollectorTest { } @Test - public void testWriteAuditLogs_withPaths() { + public void testWriteAuditLogs_withPaths() throws Exception { writeTestLog("denied", "perm", TEST_DOMAIN, "ttype", "tclass", "/good/path"); writeTestLog("denied", "perm", TEST_DOMAIN, "ttype", "tclass", "/very/long/path"); writeTestLog("denied", "perm", TEST_DOMAIN, "ttype", "tclass", "/short_path"); @@ -217,7 +218,7 @@ public class SelinuxAuditLogsCollectorTest { } @Test - public void testWriteAuditLogs_withCategories() { + public void testWriteAuditLogs_withCategories() throws Exception { writeTestLog("denied", "perm", TEST_DOMAIN, new int[] {123}, "ttype", null, "tclass"); writeTestLog("denied", "perm", TEST_DOMAIN, new int[] {123, 456}, "ttype", null, "tclass"); writeTestLog("denied", "perm", TEST_DOMAIN, null, "ttype", new int[] {666}, "tclass"); @@ -288,7 +289,7 @@ public class SelinuxAuditLogsCollectorTest { } @Test - public void testWriteAuditLogs_withPathAndCategories() { + public void testWriteAuditLogs_withPathAndCategories() throws Exception { writeTestLog( "denied", "perm", @@ -318,7 +319,7 @@ public class SelinuxAuditLogsCollectorTest { } @Test - public void testWriteAuditLogs_permissive() { + public void testWriteAuditLogs_permissive() throws Exception { writeTestLog("denied", "perm", TEST_DOMAIN, "ttype", "tclass"); writeTestLog("denied", "perm", TEST_DOMAIN, "ttype", "tclass", true); writeTestLog("denied", "perm", TEST_DOMAIN, "ttype", "tclass", false); @@ -356,7 +357,7 @@ public class SelinuxAuditLogsCollectorTest { } @Test - public void testNotWriteAuditLogs_notTestDomain() { + public void testNotWriteAuditLogs_notTestDomain() throws Exception { writeTestLog("denied", "perm", "stype", "ttype", "tclass"); boolean done = mSelinuxAutidLogsCollector.collect(ANSWER_TAG); @@ -379,7 +380,7 @@ public class SelinuxAuditLogsCollectorTest { } @Test - public void testWriteAuditLogs_upToQuota() { + public void testWriteAuditLogs_upToQuota() throws Exception { writeTestLog("denied", "perm", TEST_DOMAIN, "ttype", "tclass"); writeTestLog("denied", "perm", TEST_DOMAIN, "ttype", "tclass"); writeTestLog("denied", "perm", TEST_DOMAIN, "ttype", "tclass"); @@ -389,9 +390,9 @@ public class SelinuxAuditLogsCollectorTest { writeTestLog("denied", "perm", TEST_DOMAIN, "ttype", "tclass"); writeTestLog("denied", "perm", TEST_DOMAIN, "ttype", "tclass"); - boolean done = mSelinuxAutidLogsCollector.collect(ANSWER_TAG); + assertThrows(QuotaExceededException.class, () -> + mSelinuxAutidLogsCollector.collect(ANSWER_TAG)); - assertThat(done).isTrue(); verify( () -> FrameworkStatsLog.write( @@ -409,7 +410,7 @@ public class SelinuxAuditLogsCollectorTest { } @Test - public void testWriteAuditLogs_resetQuota() { + public void testWriteAuditLogs_resetQuota() throws Exception { writeTestLog("denied", "perm", TEST_DOMAIN, "ttype", "tclass"); writeTestLog("denied", "perm", TEST_DOMAIN, "ttype", "tclass"); writeTestLog("denied", "perm", TEST_DOMAIN, "ttype", "tclass"); @@ -418,8 +419,8 @@ public class SelinuxAuditLogsCollectorTest { writeTestLog("denied", "perm", TEST_DOMAIN, "ttype", "tclass"); writeTestLog("denied", "perm", TEST_DOMAIN, "ttype", "tclass"); - boolean done = mSelinuxAutidLogsCollector.collect(ANSWER_TAG); - assertThat(done).isTrue(); + assertThrows(QuotaExceededException.class, () -> + mSelinuxAutidLogsCollector.collect(ANSWER_TAG)); verify( () -> FrameworkStatsLog.write( @@ -442,8 +443,8 @@ public class SelinuxAuditLogsCollectorTest { writeTestLog("denied", "perm", TEST_DOMAIN, "ttype", "tclass"); // move the clock forward to reset the quota limiter. mClock.currentTimeMillis += Duration.ofHours(1).toMillis(); - done = mSelinuxAutidLogsCollector.collect(ANSWER_TAG); - assertThat(done).isTrue(); + assertThrows(QuotaExceededException.class, () -> + mSelinuxAutidLogsCollector.collect(ANSWER_TAG)); verify( () -> FrameworkStatsLog.write( @@ -461,14 +462,11 @@ public class SelinuxAuditLogsCollectorTest { } @Test - public void testNotWriteAuditLogs_stopRequested() { - writeTestLog("denied", "perm", TEST_DOMAIN, "ttype", "tclass"); + public void testNotWriteAuditLogs_stopRequested() throws Exception { writeTestLog("denied", "perm", TEST_DOMAIN, "ttype", "tclass"); writeTestLog("denied", "perm", TEST_DOMAIN, "ttype", "tclass"); writeTestLog("denied", "perm", TEST_DOMAIN, "ttype", "tclass"); writeTestLog("denied", "perm", TEST_DOMAIN, "ttype", "tclass"); - // These are not pushed. - writeTestLog("denied", "perm", TEST_DOMAIN, "ttype", "tclass"); writeTestLog("denied", "perm", TEST_DOMAIN, "ttype", "tclass"); mSelinuxAutidLogsCollector.setStopRequested(true); @@ -509,7 +507,7 @@ public class SelinuxAuditLogsCollectorTest { } @Test - public void testAuditLogs_resumeJobDoesNotExceedLimit() { + public void testAuditLogs_resumeJobDoesNotExceedLimit() throws Exception { writeTestLog("denied", "perm", TEST_DOMAIN, "ttype", "tclass"); mSelinuxAutidLogsCollector.setStopRequested(true); diff --git a/services/tests/selinux/src/com/android/server/selinux/SelinuxAuditLogsJobTest.java b/services/tests/selinux/src/com/android/server/selinux/SelinuxAuditLogsJobTest.java index 2aea8a033f87..344f3295f682 100644 --- a/services/tests/selinux/src/com/android/server/selinux/SelinuxAuditLogsJobTest.java +++ b/services/tests/selinux/src/com/android/server/selinux/SelinuxAuditLogsJobTest.java @@ -53,7 +53,7 @@ public class SelinuxAuditLogsJobTest { } @Test - public void testFinishSuccessfully() { + public void testFinishSuccessfully() throws Exception { when(mAuditLogsCollector.collect(anyInt())).thenReturn(true); mAuditLogsJob.start(mJobService, mParams); @@ -63,7 +63,7 @@ public class SelinuxAuditLogsJobTest { } @Test - public void testInterrupt() { + public void testInterrupt() throws Exception { when(mAuditLogsCollector.collect(anyInt())).thenReturn(false); mAuditLogsJob.start(mJobService, mParams); @@ -73,7 +73,7 @@ public class SelinuxAuditLogsJobTest { } @Test - public void testInterruptAndResume() { + public void testInterruptAndResume() throws Exception { when(mAuditLogsCollector.collect(anyInt())).thenReturn(false); mAuditLogsJob.start(mJobService, mParams); verify(mJobService, never()).jobFinished(any(), anyBoolean()); @@ -85,7 +85,7 @@ public class SelinuxAuditLogsJobTest { } @Test - public void testRequestStop() throws InterruptedException { + public void testRequestStop() throws Exception { Semaphore isRunning = new Semaphore(0); Semaphore stopRequested = new Semaphore(0); AtomicReference<Throwable> uncaughtException = new AtomicReference<>(); 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 6fad82b26808..c88d5153ed66 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java @@ -692,7 +692,7 @@ public class ActivityRecordTests extends WindowTestsBase { // Asserts fixed orientation request is not ignored, and the orientation is changed. assertNotEquals(activityCurOrientation, activity.getConfiguration().orientation); - assertTrue(activity.mAppCompatController.getAppCompatAspectRatioPolicy() + assertTrue(activity.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()); } @@ -721,13 +721,13 @@ public class ActivityRecordTests extends WindowTestsBase { assertEquals(ORIENTATION_PORTRAIT, activity.getConfiguration().orientation); // Clear size compat. - activity.mAppCompatController.getAppCompatSizeCompatModePolicy().clearSizeCompatMode(); + activity.mAppCompatController.getSizeCompatModePolicy().clearSizeCompatMode(); activity.ensureActivityConfiguration(); mDisplayContent.sendNewConfiguration(); // Relaunching the app should still respect the orientation request. assertEquals(ORIENTATION_PORTRAIT, activity.getConfiguration().orientation); - assertTrue(activity.mAppCompatController.getAppCompatAspectRatioPolicy() + assertTrue(activity.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()); } @@ -742,7 +742,7 @@ public class ActivityRecordTests extends WindowTestsBase { assertEquals(ORIENTATION_LANDSCAPE, activity.getTask().getConfiguration().orientation); // The app should be letterboxed. assertEquals(ORIENTATION_PORTRAIT, activity.getConfiguration().orientation); - assertTrue(activity.mAppCompatController.getAppCompatAspectRatioPolicy() + assertTrue(activity.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()); } @@ -755,7 +755,7 @@ public class ActivityRecordTests extends WindowTestsBase { assertEquals(ORIENTATION_LANDSCAPE, activity.getTask().getConfiguration().orientation); // Activity is not letterboxed. assertEquals(ORIENTATION_LANDSCAPE, activity.getConfiguration().orientation); - assertFalse(activity.mAppCompatController.getAppCompatAspectRatioPolicy() + assertFalse(activity.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()); } @@ -770,7 +770,7 @@ public class ActivityRecordTests extends WindowTestsBase { assertEquals(ORIENTATION_LANDSCAPE, activity.getTask().getConfiguration().orientation); // Activity is not letterboxed. assertEquals(ORIENTATION_LANDSCAPE, activity.getConfiguration().orientation); - assertFalse(activity.mAppCompatController.getAppCompatAspectRatioPolicy() + assertFalse(activity.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()); } @@ -785,7 +785,7 @@ public class ActivityRecordTests extends WindowTestsBase { assertEquals(ORIENTATION_LANDSCAPE, activity.getTask().getConfiguration().orientation); // Activity is not letterboxed. assertEquals(ORIENTATION_LANDSCAPE, activity.getConfiguration().orientation); - assertFalse(activity.mAppCompatController.getAppCompatAspectRatioPolicy() + assertFalse(activity.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()); } @@ -3800,7 +3800,7 @@ public class ActivityRecordTests extends WindowTestsBase { .setResizeMode(RESIZE_MODE_RESIZEABLE) .setScreenOrientation(SCREEN_ORIENTATION_PORTRAIT) .build(); - activity.mAppCompatController.getAppCompatSizeCompatModePolicy().clearSizeCompatMode(); + activity.mAppCompatController.getSizeCompatModePolicy().clearSizeCompatMode(); return activity; } diff --git a/services/tests/wmtests/src/com/android/server/wm/AppCompatActivityRobot.java b/services/tests/wmtests/src/com/android/server/wm/AppCompatActivityRobot.java index 00c9691835db..271364445c6a 100644 --- a/services/tests/wmtests/src/com/android/server/wm/AppCompatActivityRobot.java +++ b/services/tests/wmtests/src/com/android/server/wm/AppCompatActivityRobot.java @@ -180,7 +180,7 @@ class AppCompatActivityRobot { void setLetterboxedForFixedOrientationAndAspectRatio(boolean enabled) { doReturn(enabled).when(mActivityStack.top().mAppCompatController - .getAppCompatAspectRatioPolicy()).isLetterboxedForFixedOrientationAndAspectRatio(); + .getAspectRatioPolicy()).isLetterboxedForFixedOrientationAndAspectRatio(); } void enableFullscreenCameraCompatTreatmentForTopActivity(boolean enabled) { @@ -525,7 +525,7 @@ class AppCompatActivityRobot { activity.setRequestedOrientation(screenOrientation); } // Make sure to use the provided configuration to construct the size compat fields. - activity.mAppCompatController.getAppCompatSizeCompatModePolicy().clearSizeCompatMode(); + activity.mAppCompatController.getSizeCompatModePolicy().clearSizeCompatMode(); activity.ensureActivityConfiguration(); // Make sure the display configuration reflects the change of activity. if (activity.mDisplayContent.updateOrientation()) { diff --git a/services/tests/wmtests/src/com/android/server/wm/AppCompatLetterboxPolicyTest.java b/services/tests/wmtests/src/com/android/server/wm/AppCompatLetterboxPolicyTest.java index e046f7cc5845..b5ba111e4e72 100644 --- a/services/tests/wmtests/src/com/android/server/wm/AppCompatLetterboxPolicyTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/AppCompatLetterboxPolicyTest.java @@ -364,7 +364,7 @@ public class AppCompatLetterboxPolicyTest extends WindowTestsBase { @NonNull private AppCompatAspectRatioPolicy getAspectRatioPolicy() { - return activity().top().mAppCompatController.getAppCompatAspectRatioPolicy(); + return activity().top().mAppCompatController.getAspectRatioPolicy(); } @NonNull diff --git a/services/tests/wmtests/src/com/android/server/wm/AppCompatOrientationOverridesTest.java b/services/tests/wmtests/src/com/android/server/wm/AppCompatOrientationOverridesTest.java index a0727a7af87b..9e46c09f3ff6 100644 --- a/services/tests/wmtests/src/com/android/server/wm/AppCompatOrientationOverridesTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/AppCompatOrientationOverridesTest.java @@ -275,7 +275,7 @@ public class AppCompatOrientationOverridesTest extends WindowTestsBase { @Override void onPostActivityCreation(@NonNull ActivityRecord activity) { super.onPostActivityCreation(activity); - spyOn(activity.mAppCompatController.getAppCompatAspectRatioPolicy()); + spyOn(activity.mAppCompatController.getAspectRatioPolicy()); } // Useful to reduce timeout during tests diff --git a/services/tests/wmtests/src/com/android/server/wm/AppCompatOrientationPolicyTest.java b/services/tests/wmtests/src/com/android/server/wm/AppCompatOrientationPolicyTest.java index 4faa71451a4d..93fb73edb644 100644 --- a/services/tests/wmtests/src/com/android/server/wm/AppCompatOrientationPolicyTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/AppCompatOrientationPolicyTest.java @@ -556,7 +556,7 @@ public class AppCompatOrientationPolicyTest extends WindowTestsBase { void onPostActivityCreation(@NonNull ActivityRecord activity) { super.onPostActivityCreation(activity); spyOn(activity.mAppCompatController.getAppCompatAspectRatioOverrides()); - spyOn(activity.mAppCompatController.getAppCompatAspectRatioPolicy()); + spyOn(activity.mAppCompatController.getAspectRatioPolicy()); } @Override diff --git a/services/tests/wmtests/src/com/android/server/wm/AppCompatUtilsTest.java b/services/tests/wmtests/src/com/android/server/wm/AppCompatUtilsTest.java index a5b2cb39cfff..bfd533aa8f79 100644 --- a/services/tests/wmtests/src/com/android/server/wm/AppCompatUtilsTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/AppCompatUtilsTest.java @@ -252,7 +252,7 @@ public class AppCompatUtilsTest extends WindowTestsBase { @Override void onPostActivityCreation(@NonNull ActivityRecord activity) { super.onPostActivityCreation(activity); - spyOn(activity.mAppCompatController.getAppCompatAspectRatioPolicy()); + spyOn(activity.mAppCompatController.getAspectRatioPolicy()); } @Override @@ -272,13 +272,13 @@ public class AppCompatUtilsTest extends WindowTestsBase { void setIsLetterboxedForFixedOrientationAndAspectRatio( boolean forFixedOrientationAndAspectRatio) { - when(activity().top().mAppCompatController.getAppCompatAspectRatioPolicy() + when(activity().top().mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()) .thenReturn(forFixedOrientationAndAspectRatio); } void setIsLetterboxedForAspectRatioOnly(boolean forAspectRatio) { - when(activity().top().mAppCompatController.getAppCompatAspectRatioPolicy() + when(activity().top().mAppCompatController.getAspectRatioPolicy() .isLetterboxedForAspectRatioOnly()).thenReturn(forAspectRatio); } diff --git a/services/tests/wmtests/src/com/android/server/wm/CameraCompatFreeformPolicyTests.java b/services/tests/wmtests/src/com/android/server/wm/CameraCompatFreeformPolicyTests.java index b6f442460ec8..576d17af2e79 100644 --- a/services/tests/wmtests/src/com/android/server/wm/CameraCompatFreeformPolicyTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/CameraCompatFreeformPolicyTests.java @@ -606,7 +606,7 @@ public class CameraCompatFreeformPolicyTests extends WindowTestsBase { .setOnTop(true) .setTask(task) .build(); - mActivity.mAppCompatController.getAppCompatSizeCompatModePolicy().clearSizeCompatMode(); + mActivity.mAppCompatController.getSizeCompatModePolicy().clearSizeCompatMode(); spyOn(mActivity.mAppCompatController.getAppCompatCameraOverrides()); spyOn(mActivity.info); diff --git a/services/tests/wmtests/src/com/android/server/wm/DualDisplayAreaGroupPolicyTest.java b/services/tests/wmtests/src/com/android/server/wm/DualDisplayAreaGroupPolicyTest.java index 347d1bc1becc..a7e8ce915f07 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DualDisplayAreaGroupPolicyTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/DualDisplayAreaGroupPolicyTest.java @@ -216,7 +216,7 @@ public class DualDisplayAreaGroupPolicyTest extends WindowTestsBase { final Rect activityBounds = new Rect(mFirstActivity.getBounds()); // DAG is portrait (860x1200), so Task and Activity fill DAG. - assertThat(mFirstActivity.mAppCompatController.getAppCompatAspectRatioPolicy() + assertThat(mFirstActivity.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()).isFalse(); assertThat(mFirstActivity.inSizeCompatMode()).isFalse(); assertThat(taskBounds).isEqualTo(dagBounds); @@ -241,7 +241,7 @@ public class DualDisplayAreaGroupPolicyTest extends WindowTestsBase { new Rect(mFirstActivity.getConfiguration().windowConfiguration.getBounds()); // DAG is landscape (1200x860), no fixed orientation letterbox - assertThat(mFirstActivity.mAppCompatController.getAppCompatAspectRatioPolicy() + assertThat(mFirstActivity.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()).isFalse(); assertThat(mFirstActivity.inSizeCompatMode()).isTrue(); assertThat(newDagBounds.width()).isEqualTo(dagBounds.height()); @@ -266,12 +266,12 @@ public class DualDisplayAreaGroupPolicyTest extends WindowTestsBase { mDisplay.onLastFocusedTaskDisplayAreaChanged(mFirstTda); prepareUnresizable(mFirstActivity, SCREEN_ORIENTATION_NOSENSOR); - assertThat(mFirstActivity.mAppCompatController.getAppCompatAspectRatioPolicy() + assertThat(mFirstActivity.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()).isFalse(); assertThat(mFirstActivity.inSizeCompatMode()).isFalse(); rotateDisplay(mDisplay, ROTATION_90); - assertThat(mFirstActivity.mAppCompatController.getAppCompatAspectRatioPolicy() + assertThat(mFirstActivity.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()).isFalse(); assertThat(mFirstActivity.inSizeCompatMode()).isFalse(); } @@ -289,7 +289,7 @@ public class DualDisplayAreaGroupPolicyTest extends WindowTestsBase { // DAG is portrait (860x1200), and activity is letterboxed for fixed orientation // (860x[860x860/1200=616]). Task fills DAG. - assertThat(mFirstActivity.mAppCompatController.getAppCompatAspectRatioPolicy() + assertThat(mFirstActivity.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()).isTrue(); assertThat(mFirstActivity.inSizeCompatMode()).isFalse(); assertThat(taskBounds).isEqualTo(dagBounds); @@ -307,7 +307,7 @@ public class DualDisplayAreaGroupPolicyTest extends WindowTestsBase { mDisplay.onLastFocusedTaskDisplayAreaChanged(mFirstTda); prepareUnresizable(mFirstActivity, SCREEN_ORIENTATION_NOSENSOR); - assertThat(mFirstActivity.mAppCompatController.getAppCompatAspectRatioPolicy() + assertThat(mFirstActivity.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()).isFalse(); } @@ -318,7 +318,7 @@ public class DualDisplayAreaGroupPolicyTest extends WindowTestsBase { mDisplay.onLastFocusedTaskDisplayAreaChanged(mFirstTda); prepareUnresizable(mFirstActivity, SCREEN_ORIENTATION_LOCKED); - assertThat(mFirstActivity.mAppCompatController.getAppCompatAspectRatioPolicy() + assertThat(mFirstActivity.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()).isFalse(); } @@ -338,7 +338,7 @@ public class DualDisplayAreaGroupPolicyTest extends WindowTestsBase { final Rect newActivityBounds = new Rect(mFirstActivity.getBounds()); // DAG is landscape (1200x860), no fixed orientation letterbox - assertThat(mFirstActivity.mAppCompatController.getAppCompatAspectRatioPolicy() + assertThat(mFirstActivity.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()).isFalse(); assertThat(mFirstActivity.inSizeCompatMode()).isTrue(); assertThat(newDagBounds.width()).isEqualTo(dagBounds.height()); @@ -364,7 +364,7 @@ public class DualDisplayAreaGroupPolicyTest extends WindowTestsBase { rotateDisplay(mDisplay, ROTATION_90); - assertThat(mFirstActivity.mAppCompatController.getAppCompatAspectRatioPolicy() + assertThat(mFirstActivity.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()).isFalse(); assertThat(mFirstActivity.inSizeCompatMode()).isFalse(); } @@ -527,7 +527,7 @@ public class DualDisplayAreaGroupPolicyTest extends WindowTestsBase { assertThat(mDisplay.getLastOrientation()).isEqualTo(SCREEN_ORIENTATION_LANDSCAPE); assertThat(mFirstRoot.getConfiguration().orientation).isEqualTo(ORIENTATION_PORTRAIT); assertThat(mFirstActivity.getConfiguration().orientation).isEqualTo(ORIENTATION_PORTRAIT); - assertThat(mFirstActivity.mAppCompatController.getAppCompatAspectRatioPolicy() + assertThat(mFirstActivity.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()).isFalse(); assertThat(mFirstActivity.inSizeCompatMode()).isFalse(); @@ -540,14 +540,14 @@ public class DualDisplayAreaGroupPolicyTest extends WindowTestsBase { assertThat(mDisplay.getLastOrientation()).isEqualTo(SCREEN_ORIENTATION_PORTRAIT); assertThat(mSecondRoot.getConfiguration().orientation).isEqualTo(ORIENTATION_LANDSCAPE); assertThat(mSecondActivity.getConfiguration().orientation).isEqualTo(ORIENTATION_LANDSCAPE); - assertThat(mSecondActivity.mAppCompatController.getAppCompatAspectRatioPolicy() + assertThat(mSecondActivity.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()).isFalse(); assertThat(mSecondActivity.inSizeCompatMode()).isFalse(); // First activity is letterboxed in portrait as requested. assertThat(mFirstRoot.getConfiguration().orientation).isEqualTo(ORIENTATION_LANDSCAPE); assertThat(mFirstActivity.getConfiguration().orientation).isEqualTo(ORIENTATION_PORTRAIT); - assertThat(mFirstActivity.mAppCompatController.getAppCompatAspectRatioPolicy() + assertThat(mFirstActivity.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()).isTrue(); assertThat(mFirstActivity.inSizeCompatMode()).isFalse(); diff --git a/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java b/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java index 7e62b89d35bb..fc4f54a431d6 100644 --- a/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java @@ -535,7 +535,7 @@ public class RootWindowContainerTests extends WindowTestsBase { final Rect bounds = new Rect(task.getBounds()); bounds.scale(0.5f); task.setBounds(bounds); - assertFalse(activity.mAppCompatController.getAppCompatAspectRatioPolicy() + assertFalse(activity.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()); assertThat(task.autoRemoveRecents).isFalse(); } 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 07ee09a350d9..b19af0d0809e 100644 --- a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java @@ -673,7 +673,7 @@ public class SizeCompatTests extends WindowTestsBase { assertFalse(mActivity.mDisplayContent.shouldImeAttachedToApp()); // Recompute the natural configuration without resolving size compat configuration. - mActivity.mAppCompatController.getAppCompatSizeCompatModePolicy().clearSizeCompatMode(); + mActivity.mAppCompatController.getSizeCompatModePolicy().clearSizeCompatMode(); mActivity.onConfigurationChanged(mTask.getConfiguration()); // It should keep non-attachable because the resolved bounds will be computed according to // the aspect ratio that won't match its parent bounds. @@ -765,7 +765,7 @@ public class SizeCompatTests extends WindowTestsBase { / originalBounds.width())); // Recompute the natural configuration in the new display. - mActivity.mAppCompatController.getAppCompatSizeCompatModePolicy().clearSizeCompatMode(); + mActivity.mAppCompatController.getSizeCompatModePolicy().clearSizeCompatMode(); mActivity.ensureActivityConfiguration(); // Because the display cannot rotate, the portrait activity will fit the short side of // display with keeping portrait bounds [200, 0 - 700, 1000] in center. @@ -1187,7 +1187,7 @@ public class SizeCompatTests extends WindowTestsBase { prepareUnresizable(activity, /* maxAspect=*/ 1.5f, SCREEN_ORIENTATION_LANDSCAPE); // Activity max bounds should not be sandboxed, even though it is letterboxed. - assertTrue(activity.mAppCompatController.getAppCompatAspectRatioPolicy() + assertTrue(activity.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()); assertThat(activity.getConfiguration().windowConfiguration.getMaxBounds()) .isEqualTo(activity.getDisplayArea().getBounds()); @@ -1229,7 +1229,7 @@ public class SizeCompatTests extends WindowTestsBase { prepareUnresizable(activity, /* maxAspect=*/ 1.5f, SCREEN_ORIENTATION_LANDSCAPE); // Activity max bounds should not be sandboxed, even though it is letterboxed. - assertTrue(activity.mAppCompatController.getAppCompatAspectRatioPolicy() + assertTrue(activity.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()); assertThat(activity.getConfiguration().windowConfiguration.getMaxBounds()) .isEqualTo(activity.getDisplayArea().getBounds()); @@ -1253,7 +1253,7 @@ public class SizeCompatTests extends WindowTestsBase { prepareUnresizable(activity, /* maxAspect=*/ 1.5f, SCREEN_ORIENTATION_LANDSCAPE); // Activity max bounds should not be sandboxed, even though it is letterboxed. - assertTrue(activity.mAppCompatController.getAppCompatAspectRatioPolicy() + assertTrue(activity.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()); assertThat(activity.getConfiguration().windowConfiguration.getMaxBounds()) .isEqualTo(activity.getDisplayArea().getBounds()); @@ -1507,7 +1507,7 @@ public class SizeCompatTests extends WindowTestsBase { // After changing the orientation to portrait the override should be applied. activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); - activity.mAppCompatController.getAppCompatSizeCompatModePolicy().clearSizeCompatMode(); + activity.mAppCompatController.getSizeCompatModePolicy().clearSizeCompatMode(); // The per-package override forces the activity into a 3:2 aspect ratio assertEquals(1200, activity.getBounds().height()); @@ -1531,7 +1531,7 @@ public class SizeCompatTests extends WindowTestsBase { // After changing the orientation to portrait the override should be applied. activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); - activity.mAppCompatController.getAppCompatSizeCompatModePolicy().clearSizeCompatMode(); + activity.mAppCompatController.getSizeCompatModePolicy().clearSizeCompatMode(); // The per-package override forces the activity into a 3:2 aspect ratio assertEquals(1200, activity.getBounds().height()); @@ -1554,7 +1554,7 @@ public class SizeCompatTests extends WindowTestsBase { // After changing the orientation to landscape the override shouldn't be applied. activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); - activity.mAppCompatController.getAppCompatSizeCompatModePolicy().clearSizeCompatMode(); + activity.mAppCompatController.getSizeCompatModePolicy().clearSizeCompatMode(); // The per-package override should have no effect assertEquals(1200, activity.getBounds().height()); @@ -1754,7 +1754,7 @@ public class SizeCompatTests extends WindowTestsBase { addWindowToActivity(mActivity); // App should launch in fullscreen. - assertFalse(mActivity.mAppCompatController.getAppCompatAspectRatioPolicy() + assertFalse(mActivity.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()); assertFalse(mActivity.inSizeCompatMode()); @@ -1769,7 +1769,7 @@ public class SizeCompatTests extends WindowTestsBase { assertTrue(rotatedDisplayBounds.width() < rotatedDisplayBounds.height()); // App should be in size compat. - assertFalse(mActivity.mAppCompatController.getAppCompatAspectRatioPolicy() + assertFalse(mActivity.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()); assertDownScaled(); assertThat(mActivity.inSizeCompatMode()).isTrue(); @@ -1882,7 +1882,7 @@ public class SizeCompatTests extends WindowTestsBase { assertTrue(displayBounds.width() > displayBounds.height()); // App should launch in fixed orientation letterbox. - assertTrue(mActivity.mAppCompatController.getAppCompatAspectRatioPolicy() + assertTrue(mActivity.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()); assertFalse(mActivity.inSizeCompatMode()); assertActivityMaxBoundsSandboxed(); @@ -1913,7 +1913,7 @@ public class SizeCompatTests extends WindowTestsBase { assertTrue(displayBounds.width() > displayBounds.height()); // App should launch in fixed orientation letterbox. - assertTrue(mActivity.mAppCompatController.getAppCompatAspectRatioPolicy() + assertTrue(mActivity.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()); assertFalse(mActivity.inSizeCompatMode()); @@ -1943,7 +1943,7 @@ public class SizeCompatTests extends WindowTestsBase { assertTrue(displayBounds.width() > displayBounds.height()); // App should launch in fixed orientation letterbox. - assertTrue(mActivity.mAppCompatController.getAppCompatAspectRatioPolicy() + assertTrue(mActivity.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()); assertFalse(mActivity.inSizeCompatMode()); @@ -1973,7 +1973,7 @@ public class SizeCompatTests extends WindowTestsBase { assertTrue(displayBounds.width() > displayBounds.height()); // App should launch in fixed orientation letterbox. - assertTrue(mActivity.mAppCompatController.getAppCompatAspectRatioPolicy() + assertTrue(mActivity.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()); assertFalse(mActivity.inSizeCompatMode()); @@ -2070,7 +2070,7 @@ public class SizeCompatTests extends WindowTestsBase { assertTrue(displayBounds.width() > displayBounds.height()); // App should launch in fixed orientation letterbox. - assertTrue(mActivity.mAppCompatController.getAppCompatAspectRatioPolicy() + assertTrue(mActivity.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()); assertFalse(mActivity.inSizeCompatMode()); @@ -2094,7 +2094,7 @@ public class SizeCompatTests extends WindowTestsBase { // App should launch in fixed orientation letterbox. // Activity bounds should be 700x1400 with the ratio as the display. - assertTrue(mActivity.mAppCompatController.getAppCompatAspectRatioPolicy() + assertTrue(mActivity.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()); assertFitted(); assertEquals(originalScreenWidthDp, mActivity.getConfiguration().smallestScreenWidthDp); @@ -2134,7 +2134,7 @@ public class SizeCompatTests extends WindowTestsBase { // App should launch in fixed orientation letterbox. // Activity bounds should be 700x1400 with the ratio as the display. - assertTrue(mActivity.mAppCompatController.getAppCompatAspectRatioPolicy() + assertTrue(mActivity.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()); assertFitted(); assertEquals(originalScreenWidthDp, mActivity.getConfiguration().smallestScreenWidthDp); @@ -2169,7 +2169,7 @@ public class SizeCompatTests extends WindowTestsBase { final Rect activityBounds = new Rect(mActivity.getBounds()); // App should launch in fixed orientation letterbox. - assertTrue(mActivity.mAppCompatController.getAppCompatAspectRatioPolicy() + assertTrue(mActivity.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()); // Checking that there is no size compat mode. assertFitted(); @@ -2703,7 +2703,7 @@ public class SizeCompatTests extends WindowTestsBase { final Rect activityBounds = new Rect(mActivity.getBounds()); // App should launch in fixed orientation letterbox. - assertTrue(mActivity.mAppCompatController.getAppCompatAspectRatioPolicy() + assertTrue(mActivity.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()); // Checking that there is no size compat mode. assertFitted(); @@ -2747,7 +2747,7 @@ public class SizeCompatTests extends WindowTestsBase { assertEquals(WINDOWING_MODE_MULTI_WINDOW, mActivity.getWindowingMode()); // App should launch in fixed orientation letterbox. - assertTrue(mActivity.mAppCompatController.getAppCompatAspectRatioPolicy() + assertTrue(mActivity.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()); // Checking that there is no size compat mode. assertFitted(); @@ -2782,7 +2782,7 @@ public class SizeCompatTests extends WindowTestsBase { assertEquals(WINDOWING_MODE_MULTI_WINDOW, mActivity.getWindowingMode()); // App should launch in fixed orientation letterbox. - assertTrue(mActivity.mAppCompatController.getAppCompatAspectRatioPolicy() + assertTrue(mActivity.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()); // Checking that there is no size compat mode. assertFitted(); @@ -2808,7 +2808,7 @@ public class SizeCompatTests extends WindowTestsBase { prepareUnresizable(mActivity, SCREEN_ORIENTATION_LANDSCAPE); // App should launch in fixed orientation letterbox. - assertTrue(mActivity.mAppCompatController.getAppCompatAspectRatioPolicy() + assertTrue(mActivity.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()); // Checking that there is no size compat mode. assertFitted(); @@ -2834,7 +2834,7 @@ public class SizeCompatTests extends WindowTestsBase { prepareUnresizable(mActivity, SCREEN_ORIENTATION_PORTRAIT); // App should launch in fixed orientation letterbox. - assertTrue(mActivity.mAppCompatController.getAppCompatAspectRatioPolicy() + assertTrue(mActivity.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()); // Checking that there is no size compat mode. assertFitted(); @@ -2863,7 +2863,7 @@ public class SizeCompatTests extends WindowTestsBase { assertTrue(displayBounds.width() < displayBounds.height()); // App should be in size compat. - assertFalse(mActivity.mAppCompatController.getAppCompatAspectRatioPolicy() + assertFalse(mActivity.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()); assertThat(mActivity.inSizeCompatMode()).isTrue(); assertEquals(activityBounds.width(), newActivityBounds.width()); @@ -2880,7 +2880,7 @@ public class SizeCompatTests extends WindowTestsBase { prepareUnresizable(mActivity, 0, SCREEN_ORIENTATION_PORTRAIT); // App should launch in fullscreen. - assertFalse(mActivity.mAppCompatController.getAppCompatAspectRatioPolicy() + assertFalse(mActivity.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()); assertFalse(mActivity.inSizeCompatMode()); // Activity inherits max bounds from TaskDisplayArea. @@ -2894,7 +2894,7 @@ public class SizeCompatTests extends WindowTestsBase { assertTrue(rotatedDisplayBounds.width() > rotatedDisplayBounds.height()); // App should be in size compat. - assertFalse(mActivity.mAppCompatController.getAppCompatAspectRatioPolicy() + assertFalse(mActivity.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()); assertDownScaled(); assertThat(mActivity.inSizeCompatMode()).isTrue(); @@ -2915,7 +2915,7 @@ public class SizeCompatTests extends WindowTestsBase { // Portrait fixed app without max aspect. prepareUnresizable(mActivity, 0, SCREEN_ORIENTATION_PORTRAIT); - assertTrue(mActivity.mAppCompatController.getAppCompatAspectRatioPolicy() + assertTrue(mActivity.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()); assertFalse(mActivity.inSizeCompatMode()); @@ -2938,7 +2938,7 @@ public class SizeCompatTests extends WindowTestsBase { // Task and display bounds should be equal while activity should be letterboxed and // has 700x1400 bounds with the ratio as the display. - assertTrue(newActivity.mAppCompatController.getAppCompatAspectRatioPolicy() + assertTrue(newActivity.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()); assertFalse(newActivity.inSizeCompatMode()); // Activity max bounds are sandboxed due to size compat mode. @@ -2959,7 +2959,7 @@ public class SizeCompatTests extends WindowTestsBase { // Portrait fixed app without max aspect. prepareUnresizable(mActivity, 0, SCREEN_ORIENTATION_PORTRAIT); - assertTrue(mActivity.mAppCompatController.getAppCompatAspectRatioPolicy() + assertTrue(mActivity.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()); assertFalse(mActivity.inSizeCompatMode()); @@ -2980,7 +2980,7 @@ public class SizeCompatTests extends WindowTestsBase { // Portrait fixed app without max aspect. prepareUnresizable(mActivity, 0, SCREEN_ORIENTATION_PORTRAIT); - assertTrue(mActivity.mAppCompatController.getAppCompatAspectRatioPolicy() + assertTrue(mActivity.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()); assertFalse(mActivity.inSizeCompatMode()); @@ -3011,7 +3011,7 @@ public class SizeCompatTests extends WindowTestsBase { assertActivityMaxBoundsSandboxed(); // Activity bounds should be (1400 / 1.3 = 1076)x1400 with the app requested ratio. - assertTrue(mActivity.mAppCompatController.getAppCompatAspectRatioPolicy() + assertTrue(mActivity.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()); assertFalse(newActivity.inSizeCompatMode()); assertEquals(displayBounds.height(), newActivityBounds.height()); @@ -3030,7 +3030,7 @@ public class SizeCompatTests extends WindowTestsBase { prepareUnresizable(mActivity, 0, SCREEN_ORIENTATION_PORTRAIT); clearInvocations(mActivity); - assertTrue(mActivity.mAppCompatController.getAppCompatAspectRatioPolicy() + assertTrue(mActivity.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()); assertFalse(mActivity.inSizeCompatMode()); @@ -3038,7 +3038,7 @@ public class SizeCompatTests extends WindowTestsBase { rotateDisplay(mActivity.mDisplayContent, ROTATION_90); // App should be in size compat. - assertFalse(mActivity.mAppCompatController.getAppCompatAspectRatioPolicy() + assertFalse(mActivity.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()); assertThat(mActivity.inSizeCompatMode()).isTrue(); // Activity max bounds are sandboxed due to size compat mode. @@ -3050,10 +3050,10 @@ public class SizeCompatTests extends WindowTestsBase { // App still in size compat, and the bounds don't change. final AppCompatSizeCompatModePolicy scmPolicy = mActivity.mAppCompatController - .getAppCompatSizeCompatModePolicy(); + .getSizeCompatModePolicy(); spyOn(scmPolicy); verify(scmPolicy, never()).clearSizeCompatMode(); - assertFalse(mActivity.mAppCompatController.getAppCompatAspectRatioPolicy() + assertFalse(mActivity.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()); assertThat(mActivity.inSizeCompatMode()).isTrue(); assertEquals(activityBounds, mActivity.getBounds()); @@ -3071,7 +3071,7 @@ public class SizeCompatTests extends WindowTestsBase { prepareUnresizable(mActivity, 0, SCREEN_ORIENTATION_PORTRAIT); // In fixed orientation letterbox - assertTrue(mActivity.mAppCompatController.getAppCompatAspectRatioPolicy() + assertTrue(mActivity.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()); assertFalse(mActivity.inSizeCompatMode()); assertActivityMaxBoundsSandboxed(); @@ -3080,7 +3080,7 @@ public class SizeCompatTests extends WindowTestsBase { rotateDisplay(display, ROTATION_90); // App should be in size compat. - assertFalse(mActivity.mAppCompatController.getAppCompatAspectRatioPolicy() + assertFalse(mActivity.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()); assertThat(mActivity.inSizeCompatMode()).isTrue(); assertActivityMaxBoundsSandboxed(); @@ -3089,7 +3089,7 @@ public class SizeCompatTests extends WindowTestsBase { rotateDisplay(display, ROTATION_180); // In activity letterbox - assertTrue(mActivity.mAppCompatController.getAppCompatAspectRatioPolicy() + assertTrue(mActivity.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()); assertFalse(mActivity.inSizeCompatMode()); assertActivityMaxBoundsSandboxed(); @@ -3108,7 +3108,7 @@ public class SizeCompatTests extends WindowTestsBase { prepareUnresizable(mActivity, 0, SCREEN_ORIENTATION_LANDSCAPE); // In fixed orientation letterbox - assertTrue(mActivity.mAppCompatController.getAppCompatAspectRatioPolicy() + assertTrue(mActivity.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()); assertFalse(mActivity.inSizeCompatMode()); assertActivityMaxBoundsSandboxed(); @@ -3117,7 +3117,7 @@ public class SizeCompatTests extends WindowTestsBase { rotateDisplay(display, ROTATION_90); // App should be in size compat. - assertFalse(mActivity.mAppCompatController.getAppCompatAspectRatioPolicy() + assertFalse(mActivity.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()); assertDownScaled(); assertActivityMaxBoundsSandboxed(); @@ -3126,7 +3126,7 @@ public class SizeCompatTests extends WindowTestsBase { rotateDisplay(display, ROTATION_180); // In fixed orientation letterbox - assertTrue(mActivity.mAppCompatController.getAppCompatAspectRatioPolicy() + assertTrue(mActivity.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()); assertFalse(mActivity.inSizeCompatMode()); assertActivityMaxBoundsSandboxed(); @@ -3325,7 +3325,7 @@ public class SizeCompatTests extends WindowTestsBase { assertEquals(ORIENTATION_PORTRAIT, mTask.getConfiguration().orientation); assertEquals(ORIENTATION_LANDSCAPE, mActivity.getConfiguration().orientation); assertFitted(); - assertTrue(mActivity.mAppCompatController.getAppCompatAspectRatioPolicy() + assertTrue(mActivity.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()); assertActivityMaxBoundsSandboxed(); @@ -3352,7 +3352,7 @@ public class SizeCompatTests extends WindowTestsBase { // Resizable activity is not in size compat mode but in the letterbox for fixed orientation. assertFitted(); - assertTrue(mActivity.mAppCompatController.getAppCompatAspectRatioPolicy() + assertTrue(mActivity.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()); } @@ -3389,7 +3389,7 @@ public class SizeCompatTests extends WindowTestsBase { assertEquals(ORIENTATION_PORTRAIT, mTask.getConfiguration().orientation); assertEquals(ORIENTATION_PORTRAIT, mActivity.getConfiguration().orientation); assertFitted(); - assertFalse(mActivity.mAppCompatController.getAppCompatAspectRatioPolicy() + assertFalse(mActivity.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()); assertActivityMaxBoundsSandboxed(); @@ -3889,7 +3889,7 @@ public class SizeCompatTests extends WindowTestsBase { private void recomputeNaturalConfigurationOfUnresizableActivity() { // Recompute the natural configuration of the non-resizable activity and the split screen. - mActivity.mAppCompatController.getAppCompatSizeCompatModePolicy().clearSizeCompatMode(); + mActivity.mAppCompatController.getSizeCompatModePolicy().clearSizeCompatMode(); // Draw letterbox. mActivity.setVisible(false); @@ -4031,7 +4031,7 @@ public class SizeCompatTests extends WindowTestsBase { // orientation is not respected with insets as insets have been decoupled. final Rect appBounds = activity.getWindowConfiguration().getAppBounds(); final Rect displayBounds = display.getBounds(); - assertFalse(activity.mAppCompatController.getAppCompatAspectRatioPolicy() + assertFalse(activity.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()); assertNotNull(appBounds); assertEquals(displayBounds.width(), appBounds.width()); @@ -4063,7 +4063,7 @@ public class SizeCompatTests extends WindowTestsBase { final Rect bounds = activity.getBounds(); // Activity should be letterboxed and should have portrait app bounds - assertTrue(activity.mAppCompatController.getAppCompatAspectRatioPolicy() + assertTrue(activity.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()); assertTrue(bounds.height() > bounds.width()); } @@ -4098,7 +4098,7 @@ public class SizeCompatTests extends WindowTestsBase { assertNotNull(activity.getAppCompatDisplayInsets()); // Activity is not letterboxed for fixed orientation because orientation is respected // with insets, and should not be in size compat mode - assertFalse(activity.mAppCompatController.getAppCompatAspectRatioPolicy() + assertFalse(activity.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()); assertFalse(activity.inSizeCompatMode()); } @@ -4504,7 +4504,7 @@ public class SizeCompatTests extends WindowTestsBase { .getUserMinAspectRatioOverrideCode(); prepareLimitedBounds(mActivity, SCREEN_ORIENTATION_PORTRAIT, /* isUnresizable= */ false); - assertFalse(appCompatController.getAppCompatAspectRatioPolicy().isAspectRatioApplied()); + assertFalse(appCompatController.getAspectRatioPolicy().isAspectRatioApplied()); } @Test @@ -4527,7 +4527,7 @@ public class SizeCompatTests extends WindowTestsBase { .getUserMinAspectRatioOverrideCode(); prepareLimitedBounds(mActivity, SCREEN_ORIENTATION_PORTRAIT, /* isUnresizable= */ true); - assertTrue(appCompatController.getAppCompatAspectRatioPolicy().isAspectRatioApplied()); + assertTrue(appCompatController.getAspectRatioPolicy().isAspectRatioApplied()); } @Test @@ -4540,8 +4540,7 @@ public class SizeCompatTests extends WindowTestsBase { setUpDisplaySizeWithApp(2500, 1600, taskBuilder); prepareLimitedBounds(mActivity, SCREEN_ORIENTATION_PORTRAIT, /* isUnresizable= */ false); - assertFalse(mActivity.mAppCompatController.getAppCompatAspectRatioPolicy() - .isAspectRatioApplied()); + assertFalse(mActivity.mAppCompatController.getAspectRatioPolicy().isAspectRatioApplied()); } @Test @@ -4554,8 +4553,7 @@ public class SizeCompatTests extends WindowTestsBase { setUpDisplaySizeWithApp(2500, 1600, taskBuilder); prepareLimitedBounds(mActivity, SCREEN_ORIENTATION_PORTRAIT, /* isUnresizable= */ true); - assertTrue(mActivity.mAppCompatController.getAppCompatAspectRatioPolicy() - .isAspectRatioApplied()); + assertTrue(mActivity.mAppCompatController.getAspectRatioPolicy().isAspectRatioApplied()); } private void assertVerticalPositionForDifferentDisplayConfigsForLandscapeActivity( @@ -4604,7 +4602,7 @@ public class SizeCompatTests extends WindowTestsBase { verifyLogAppCompatState(mActivity, APP_COMPAT_STATE_CHANGED__STATE__NOT_LETTERBOXED); prepareUnresizable(mActivity, /* maxAspect= */ 2, SCREEN_ORIENTATION_PORTRAIT); - assertFalse(mActivity.mAppCompatController.getAppCompatAspectRatioPolicy() + assertFalse(mActivity.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()); assertFalse(mActivity.inSizeCompatMode()); assertTrue(mActivity.areBoundsLetterboxed()); @@ -4621,7 +4619,7 @@ public class SizeCompatTests extends WindowTestsBase { // ActivityRecord#resolveSizeCompatModeConfiguration because mCompatDisplayInsets aren't // null but activity doesn't enter size compat mode. Checking that areBoundsLetterboxed() // still returns true because of the aspect ratio restrictions. - assertFalse(mActivity.mAppCompatController.getAppCompatAspectRatioPolicy() + assertFalse(mActivity.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()); assertFalse(mActivity.inSizeCompatMode()); assertTrue(mActivity.areBoundsLetterboxed()); @@ -4649,7 +4647,7 @@ public class SizeCompatTests extends WindowTestsBase { prepareUnresizable(mActivity, SCREEN_ORIENTATION_PORTRAIT); - assertTrue(mActivity.mAppCompatController.getAppCompatAspectRatioPolicy() + assertTrue(mActivity.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()); assertFalse(mActivity.inSizeCompatMode()); assertTrue(mActivity.areBoundsLetterboxed()); @@ -4668,7 +4666,7 @@ public class SizeCompatTests extends WindowTestsBase { rotateDisplay(mActivity.mDisplayContent, ROTATION_90); - assertFalse(mActivity.mAppCompatController.getAppCompatAspectRatioPolicy() + assertFalse(mActivity.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()); assertTrue(mActivity.inSizeCompatMode()); assertTrue(mActivity.areBoundsLetterboxed()); @@ -4730,7 +4728,7 @@ public class SizeCompatTests extends WindowTestsBase { prepareUnresizable(mActivity, SCREEN_ORIENTATION_LANDSCAPE); assertFalse(mActivity.isEligibleForLetterboxEducation()); - assertTrue(mActivity.mAppCompatController.getAppCompatAspectRatioPolicy() + assertTrue(mActivity.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()); } @@ -4789,7 +4787,7 @@ public class SizeCompatTests extends WindowTestsBase { prepareUnresizable(mActivity, SCREEN_ORIENTATION_PORTRAIT); assertTrue(mActivity.isEligibleForLetterboxEducation()); - assertTrue(mActivity.mAppCompatController.getAppCompatAspectRatioPolicy() + assertTrue(mActivity.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()); } @@ -4804,7 +4802,7 @@ public class SizeCompatTests extends WindowTestsBase { rotateDisplay(mActivity.mDisplayContent, ROTATION_90); assertTrue(mActivity.isEligibleForLetterboxEducation()); - assertFalse(mActivity.mAppCompatController.getAppCompatAspectRatioPolicy() + assertFalse(mActivity.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()); assertTrue(mActivity.inSizeCompatMode()); } @@ -5007,7 +5005,7 @@ public class SizeCompatTests extends WindowTestsBase { assertEquals(SCREEN_ORIENTATION_UNSPECIFIED, mActivity.getOverrideOrientation()); assertEquals(mActivity.getTask().getBounds(), mActivity.getBounds()); final AppCompatAspectRatioPolicy aspectRatioPolicy = mActivity.mAppCompatController - .getAppCompatAspectRatioPolicy(); + .getAspectRatioPolicy(); assertEquals(0, aspectRatioPolicy.getMaxAspectRatio(), 0 /* delta */); assertEquals(0, aspectRatioPolicy.getMinAspectRatio(), 0 /* delta */); @@ -5090,7 +5088,7 @@ public class SizeCompatTests extends WindowTestsBase { assertEquals(origDensity, mActivity.getConfiguration().densityDpi); // Activity should exit size compat with new density. - mActivity.mAppCompatController.getAppCompatSizeCompatModePolicy().clearSizeCompatMode(); + mActivity.mAppCompatController.getSizeCompatModePolicy().clearSizeCompatMode(); assertFitted(); assertEquals(newDensity, mActivity.getConfiguration().densityDpi); @@ -5274,7 +5272,7 @@ public class SizeCompatTests extends WindowTestsBase { activity.setRequestedOrientation(screenOrientation); } // Make sure to use the provided configuration to construct the size compat fields. - activity.mAppCompatController.getAppCompatSizeCompatModePolicy().clearSizeCompatMode(); + activity.mAppCompatController.getSizeCompatModePolicy().clearSizeCompatMode(); activity.ensureActivityConfiguration(); // Make sure the display configuration reflects the change of activity. if (activity.mDisplayContent.updateOrientation()) { diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskFragmentTest.java b/services/tests/wmtests/src/com/android/server/wm/TaskFragmentTest.java index 299717393028..0d9772492e59 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TaskFragmentTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/TaskFragmentTest.java @@ -759,13 +759,13 @@ public class TaskFragmentTest extends WindowTestsBase { // Assert fixed orientation request is ignored for activity in ActivityEmbedding split. activity0.setRequestedOrientation(SCREEN_ORIENTATION_LANDSCAPE); - assertFalse(activity0.mAppCompatController.getAppCompatAspectRatioPolicy() + assertFalse(activity0.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()); assertEquals(SCREEN_ORIENTATION_UNSET, task.getOrientation()); activity1.setRequestedOrientation(SCREEN_ORIENTATION_PORTRAIT); - assertFalse(activity1.mAppCompatController.getAppCompatAspectRatioPolicy() + assertFalse(activity1.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()); assertEquals(SCREEN_ORIENTATION_UNSET, task.getOrientation()); @@ -773,9 +773,9 @@ public class TaskFragmentTest extends WindowTestsBase { mDisplayContent.setIgnoreOrientationRequest(true); task.onConfigurationChanged(task.getParent().getConfiguration()); - assertFalse(activity0.mAppCompatController.getAppCompatAspectRatioPolicy() + assertFalse(activity0.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()); - assertFalse(activity1.mAppCompatController.getAppCompatAspectRatioPolicy() + assertFalse(activity1.mAppCompatController.getAspectRatioPolicy() .isLetterboxedForFixedOrientationAndAspectRatio()); assertEquals(SCREEN_ORIENTATION_UNSET, task.getOrientation()); diff --git a/services/tests/wmtests/src/com/android/server/wm/TransparentPolicyTest.java b/services/tests/wmtests/src/com/android/server/wm/TransparentPolicyTest.java index f1180ff93edb..9cd302e71d3b 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TransparentPolicyTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/TransparentPolicyTest.java @@ -354,7 +354,7 @@ public class TransparentPolicyTest extends WindowTestsBase { ta.launchTransparentActivityInTask(); a.assertNotNullOnTopActivity(ActivityRecord::getAppCompatDisplayInsets); a.applyToTopActivity((top) -> { - top.mAppCompatController.getAppCompatSizeCompatModePolicy() + top.mAppCompatController.getSizeCompatModePolicy() .clearSizeCompatMode(); }); a.assertNullOnTopActivity(ActivityRecord::getAppCompatDisplayInsets); |