Merge "Replace deprecated AndroidJUnit4." into main
diff --git a/packages/SystemUI/aconfig/accessibility.aconfig b/packages/SystemUI/aconfig/accessibility.aconfig
index 0861454..8860452 100644
--- a/packages/SystemUI/aconfig/accessibility.aconfig
+++ b/packages/SystemUI/aconfig/accessibility.aconfig
@@ -90,6 +90,16 @@
}
flag {
+ name: "update_corner_radius_on_display_changed"
+ namespace: "accessibility"
+ description: "Updates the corner radius to the magnification fullscreen border when the display changes."
+ bug: "335113174"
+ metadata {
+ purpose: PURPOSE_BUGFIX
+ }
+}
+
+flag {
name: "hearing_devices_dialog_related_tools"
namespace: "accessibility"
description: "Shows the related tools for hearing devices dialog."
diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/FullscreenMagnificationController.java b/packages/SystemUI/src/com/android/systemui/accessibility/FullscreenMagnificationController.java
index 3c0ac9a..394f8dd 100644
--- a/packages/SystemUI/src/com/android/systemui/accessibility/FullscreenMagnificationController.java
+++ b/packages/SystemUI/src/com/android/systemui/accessibility/FullscreenMagnificationController.java
@@ -30,6 +30,8 @@
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.graphics.Region;
+import android.graphics.drawable.GradientDrawable;
+import android.hardware.display.DisplayManager;
import android.os.Handler;
import android.util.Log;
import android.view.AttachedSurfaceControl;
@@ -49,6 +51,8 @@
import androidx.annotation.UiThread;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.policy.ScreenDecorationsUtils;
+import com.android.systemui.Flags;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.res.R;
import com.android.systemui.util.leak.RotationUtils;
@@ -70,6 +74,7 @@
private SurfaceControl.Transaction mTransaction;
private View mFullscreenBorder = null;
private int mBorderOffset;
+ private int mBorderStoke;
private final int mDisplayId;
private static final Region sEmptyRegion = new Region();
private ValueAnimator mShowHideBorderAnimator;
@@ -86,16 +91,20 @@
}
};
private final long mLongAnimationTimeMs;
+ private final DisplayManager mDisplayManager;
+ private final DisplayManager.DisplayListener mDisplayListener;
+ private String mCurrentDisplayUniqueId;
public FullscreenMagnificationController(
@UiContext Context context,
@Main Handler handler,
@Main Executor executor,
+ DisplayManager displayManager,
AccessibilityManager accessibilityManager,
WindowManager windowManager,
IWindowManager iWindowManager,
Supplier<SurfaceControlViewHost> scvhSupplier) {
- this(context, handler, executor, accessibilityManager,
+ this(context, handler, executor, displayManager, accessibilityManager,
windowManager, iWindowManager, scvhSupplier,
new SurfaceControl.Transaction(), null);
}
@@ -105,6 +114,7 @@
@UiContext Context context,
@Main Handler handler,
@Main Executor executor,
+ DisplayManager displayManager,
AccessibilityManager accessibilityManager,
WindowManager windowManager,
IWindowManager iWindowManager,
@@ -120,10 +130,7 @@
mWindowBounds = mWindowManager.getCurrentWindowMetrics().getBounds();
mTransaction = transaction;
mScvhSupplier = scvhSupplier;
- mBorderOffset = mContext.getResources().getDimensionPixelSize(
- R.dimen.magnifier_border_width_fullscreen_with_offset)
- - mContext.getResources().getDimensionPixelSize(
- R.dimen.magnifier_border_width_fullscreen);
+ updateDimensions();
mDisplayId = mContext.getDisplayId();
mConfiguration = new Configuration(context.getResources().getConfiguration());
mLongAnimationTimeMs = mContext.getResources().getInteger(
@@ -140,6 +147,31 @@
}
}
});
+ mCurrentDisplayUniqueId = mContext.getDisplayNoVerify().getUniqueId();
+ mDisplayManager = displayManager;
+ mDisplayListener = new DisplayManager.DisplayListener() {
+ @Override
+ public void onDisplayAdded(int displayId) {
+ // Do nothing
+ }
+
+ @Override
+ public void onDisplayRemoved(int displayId) {
+ // Do nothing
+ }
+
+ @Override
+ public void onDisplayChanged(int displayId) {
+ final String uniqueId = mContext.getDisplayNoVerify().getUniqueId();
+ if (uniqueId.equals(mCurrentDisplayUniqueId)) {
+ // Same unique ID means the physical display doesn't change. Early return.
+ return;
+ }
+
+ mCurrentDisplayUniqueId = uniqueId;
+ applyCornerRadiusToBorder();
+ }
+ };
}
private ValueAnimator createNullTargetObjectAnimator() {
@@ -180,10 +212,15 @@
}
mContext.unregisterComponentCallbacks(this);
+
mShowHideBorderAnimator.reverse();
}
private void cleanUpBorder() {
+ if (Flags.updateCornerRadiusOnDisplayChanged()) {
+ mDisplayManager.unregisterDisplayListener(mDisplayListener);
+ }
+
if (mSurfaceControlViewHost != null) {
mSurfaceControlViewHost.release();
mSurfaceControlViewHost = null;
@@ -226,6 +263,9 @@
} catch (Exception e) {
Log.w(TAG, "Failed to register rotation watcher", e);
}
+ if (Flags.updateCornerRadiusOnDisplayChanged()) {
+ mHandler.post(this::applyCornerRadiusToBorder);
+ }
}
mTransaction
@@ -247,6 +287,9 @@
mAccessibilityManager.attachAccessibilityOverlayToDisplay(
mDisplayId, mBorderSurfaceControl);
+ if (Flags.updateCornerRadiusOnDisplayChanged()) {
+ mDisplayManager.registerDisplayListener(mDisplayListener, mHandler);
+ }
applyTouchableRegion();
}
@@ -304,6 +347,11 @@
final int newWidth = mWindowBounds.width() + 2 * mBorderOffset;
final int newHeight = mWindowBounds.height() + 2 * mBorderOffset;
mSurfaceControlViewHost.relayout(newWidth, newHeight);
+ if (Flags.updateCornerRadiusOnDisplayChanged()) {
+ // Recenter the border
+ mTransaction.setPosition(
+ mBorderSurfaceControl, -mBorderOffset, -mBorderOffset).apply();
+ }
}
// Rotating from Landscape to ReverseLandscape will not trigger the config changes in
@@ -352,6 +400,22 @@
R.dimen.magnifier_border_width_fullscreen_with_offset)
- mContext.getResources().getDimensionPixelSize(
R.dimen.magnifier_border_width_fullscreen);
+ mBorderStoke = mContext.getResources().getDimensionPixelSize(
+ R.dimen.magnifier_border_width_fullscreen_with_offset);
+ }
+
+ private void applyCornerRadiusToBorder() {
+ if (!isActivated()) {
+ return;
+ }
+
+ float cornerRadius = ScreenDecorationsUtils.getWindowCornerRadius(mContext);
+ GradientDrawable backgroundDrawable = (GradientDrawable) mFullscreenBorder.getBackground();
+ backgroundDrawable.setStroke(
+ mBorderStoke,
+ mContext.getResources().getColor(
+ R.color.magnification_border_color, mContext.getTheme()));
+ backgroundDrawable.setCornerRadius(cornerRadius);
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/MagnificationImpl.java b/packages/SystemUI/src/com/android/systemui/accessibility/MagnificationImpl.java
index e9c9bc7..93c4630 100644
--- a/packages/SystemUI/src/com/android/systemui/accessibility/MagnificationImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/accessibility/MagnificationImpl.java
@@ -149,6 +149,7 @@
private final Context mContext;
private final Handler mHandler;
private final Executor mExecutor;
+ private final DisplayManager mDisplayManager;
private final IWindowManager mIWindowManager;
FullscreenMagnificationControllerSupplier(Context context,
@@ -159,6 +160,7 @@
mContext = context;
mHandler = handler;
mExecutor = executor;
+ mDisplayManager = displayManager;
mIWindowManager = iWindowManager;
}
@@ -173,6 +175,7 @@
windowContext,
mHandler,
mExecutor,
+ mDisplayManager,
windowContext.getSystemService(AccessibilityManager.class),
windowContext.getSystemService(WindowManager.class),
mIWindowManager,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/FullscreenMagnificationControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/FullscreenMagnificationControllerTest.java
index cbd535b..530ae15 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/FullscreenMagnificationControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/FullscreenMagnificationControllerTest.java
@@ -25,6 +25,7 @@
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -36,7 +37,10 @@
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.graphics.Rect;
+import android.graphics.drawable.GradientDrawable;
+import android.hardware.display.DisplayManager;
import android.os.RemoteException;
+import android.platform.test.annotations.EnableFlags;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.view.Display;
@@ -54,6 +58,7 @@
import androidx.annotation.NonNull;
import androidx.test.filters.SmallTest;
+import com.android.systemui.Flags;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.res.R;
@@ -61,6 +66,7 @@
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
@@ -76,6 +82,12 @@
private static final long WAIT_TIMEOUT_S = 5L * HW_TIMEOUT_MULTIPLIER;
private static final long ANIMATION_TIMEOUT_MS =
5L * ANIMATION_DURATION_MS * HW_TIMEOUT_MULTIPLIER;
+
+ private static final String UNIQUE_DISPLAY_ID_PRIMARY = "000";
+ private static final String UNIQUE_DISPLAY_ID_SECONDARY = "111";
+ private static final int CORNER_RADIUS_PRIMARY = 10;
+ private static final int CORNER_RADIUS_SECONDARY = 20;
+
private FullscreenMagnificationController mFullscreenMagnificationController;
private SurfaceControlViewHost mSurfaceControlViewHost;
private ValueAnimator mShowHideBorderAnimator;
@@ -83,10 +95,35 @@
private TestableWindowManager mWindowManager;
@Mock
private IWindowManager mIWindowManager;
+ @Mock
+ private DisplayManager mDisplayManager;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
+ mContext = spy(mContext);
+ Display display = mock(Display.class);
+ when(display.getUniqueId()).thenReturn(UNIQUE_DISPLAY_ID_PRIMARY);
+ when(mContext.getDisplayNoVerify()).thenReturn(display);
+
+ // Override the resources to Display Primary
+ mContext.getOrCreateTestableResources()
+ .addOverride(
+ com.android.internal.R.dimen.rounded_corner_radius,
+ CORNER_RADIUS_PRIMARY);
+ mContext.getOrCreateTestableResources()
+ .addOverride(com.android.internal.R.dimen.rounded_corner_radius_adjustment, 0);
+ mContext.getOrCreateTestableResources()
+ .addOverride(com.android.internal.R.dimen.rounded_corner_radius_top, 0);
+ mContext.getOrCreateTestableResources()
+ .addOverride(
+ com.android.internal.R.dimen.rounded_corner_radius_top_adjustment, 0);
+ mContext.getOrCreateTestableResources()
+ .addOverride(com.android.internal.R.dimen.rounded_corner_radius_bottom, 0);
+ mContext.getOrCreateTestableResources()
+ .addOverride(
+ com.android.internal.R.dimen.rounded_corner_radius_bottom_adjustment, 0);
+
getInstrumentation().runOnMainSync(() -> mSurfaceControlViewHost =
spy(new SurfaceControlViewHost(mContext, mContext.getDisplay(),
new InputTransferToken(), "FullscreenMagnification")));
@@ -101,6 +138,7 @@
mContext,
mContext.getMainThreadHandler(),
mContext.getMainExecutor(),
+ mDisplayManager,
mContext.getSystemService(AccessibilityManager.class),
mContext.getSystemService(WindowManager.class),
mIWindowManager,
@@ -259,6 +297,87 @@
verify(mSurfaceControlViewHost).relayout(newWidth, newHeight);
}
+ @EnableFlags(Flags.FLAG_UPDATE_CORNER_RADIUS_ON_DISPLAY_CHANGED)
+ @Test
+ public void enableFullscreenMagnification_applyPrimaryCornerRadius()
+ throws InterruptedException {
+ CountDownLatch transactionCommittedLatch = new CountDownLatch(1);
+ CountDownLatch animationEndLatch = new CountDownLatch(1);
+ mTransaction.addTransactionCommittedListener(
+ Runnable::run, transactionCommittedLatch::countDown);
+ mShowHideBorderAnimator.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ animationEndLatch.countDown();
+ }
+ });
+
+ getInstrumentation().runOnMainSync(() ->
+ //Enable fullscreen magnification
+ mFullscreenMagnificationController
+ .onFullscreenMagnificationActivationChanged(true));
+ assertWithMessage("Failed to wait for transaction committed")
+ .that(transactionCommittedLatch.await(WAIT_TIMEOUT_S, TimeUnit.SECONDS))
+ .isTrue();
+ assertWithMessage("Failed to wait for animation to be finished")
+ .that(animationEndLatch.await(ANIMATION_TIMEOUT_MS, TimeUnit.MILLISECONDS))
+ .isTrue();
+
+ // Verify the initial corner radius is applied
+ GradientDrawable backgroundDrawable =
+ (GradientDrawable) mSurfaceControlViewHost.getView().getBackground();
+ assertThat(backgroundDrawable.getCornerRadius()).isEqualTo(CORNER_RADIUS_PRIMARY);
+ }
+
+ @EnableFlags(Flags.FLAG_UPDATE_CORNER_RADIUS_ON_DISPLAY_CHANGED)
+ @Test
+ public void onDisplayChanged_updateCornerRadiusToSecondary() throws InterruptedException {
+ CountDownLatch transactionCommittedLatch = new CountDownLatch(1);
+ CountDownLatch animationEndLatch = new CountDownLatch(1);
+ mTransaction.addTransactionCommittedListener(
+ Runnable::run, transactionCommittedLatch::countDown);
+ mShowHideBorderAnimator.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ animationEndLatch.countDown();
+ }
+ });
+
+ getInstrumentation().runOnMainSync(() ->
+ //Enable fullscreen magnification
+ mFullscreenMagnificationController
+ .onFullscreenMagnificationActivationChanged(true));
+ assertWithMessage("Failed to wait for transaction committed")
+ .that(transactionCommittedLatch.await(WAIT_TIMEOUT_S, TimeUnit.SECONDS))
+ .isTrue();
+ assertWithMessage("Failed to wait for animation to be finished")
+ .that(animationEndLatch.await(ANIMATION_TIMEOUT_MS, TimeUnit.MILLISECONDS))
+ .isTrue();
+
+ ArgumentCaptor<DisplayManager.DisplayListener> displayListenerCaptor =
+ ArgumentCaptor.forClass(DisplayManager.DisplayListener.class);
+ verify(mDisplayManager).registerDisplayListener(displayListenerCaptor.capture(), any());
+
+ Display newDisplay = mock(Display.class);
+ when(newDisplay.getUniqueId()).thenReturn(UNIQUE_DISPLAY_ID_SECONDARY);
+ when(mContext.getDisplayNoVerify()).thenReturn(newDisplay);
+ // Override the resources to Display Secondary
+ mContext.getOrCreateTestableResources()
+ .removeOverride(com.android.internal.R.dimen.rounded_corner_radius);
+ mContext.getOrCreateTestableResources()
+ .addOverride(
+ com.android.internal.R.dimen.rounded_corner_radius,
+ CORNER_RADIUS_SECONDARY);
+ getInstrumentation().runOnMainSync(() ->
+ displayListenerCaptor.getValue().onDisplayChanged(Display.DEFAULT_DISPLAY));
+ waitForIdleSync();
+ // Verify the corner radius is updated
+ GradientDrawable backgroundDrawable2 =
+ (GradientDrawable) mSurfaceControlViewHost.getView().getBackground();
+ assertThat(backgroundDrawable2.getCornerRadius()).isEqualTo(CORNER_RADIUS_SECONDARY);
+ }
+
+
private ValueAnimator newNullTargetObjectAnimator() {
final ValueAnimator animator =
ObjectAnimator.ofFloat(/* target= */ null, View.ALPHA, 0f, 1f);
diff --git a/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java b/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java
index a1dffc6..9757582 100644
--- a/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java
+++ b/services/core/java/com/android/server/pm/PackageManagerServiceUtils.java
@@ -1452,6 +1452,13 @@
}
if (!ArrayUtils.isEmpty(after.splitNames)) {
+ if (beforeSplitNames.length != beforeSplitRevisionCodes.length) {
+ throw new PackageManagerException(INSTALL_FAILED_VERSION_DOWNGRADE,
+ "Current split names and the split revision codes are not 1:1 mapping."
+ + "This indicates that the package info data has been"
+ + " corrupted.");
+ }
+
for (int i = 0; i < after.splitNames.length; i++) {
final String splitName = after.splitNames[i];
final int j = ArrayUtils.indexOf(beforeSplitNames, splitName);
diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java
index 9177e2b..b7dfd8d 100644
--- a/services/core/java/com/android/server/pm/Settings.java
+++ b/services/core/java/com/android/server/pm/Settings.java
@@ -4489,10 +4489,24 @@
String splitName = parser.getAttributeValue(null, ATTR_NAME);
int splitRevision = parser.getAttributeInt(null, ATTR_VERSION, -1);
if (splitName != null && splitRevision >= 0) {
+ final int beforeSplitNamesLength = outPs.getSplitNames().length;
+ // If the split name already exists in the outPs#getSplitNames, don't add it
+ // into the array and update its revision code below
outPs.setSplitNames(ArrayUtils.appendElement(String.class,
outPs.getSplitNames(), splitName));
- outPs.setSplitRevisionCodes(ArrayUtils.appendInt(
- outPs.getSplitRevisionCodes(), splitRevision));
+
+ // If the same split name has already been added before, update the latest
+ // revision code
+ final int afterSplitNamesLength = outPs.getSplitNames().length;
+ if (beforeSplitNamesLength == afterSplitNamesLength) {
+ final int index = ArrayUtils.indexOf(outPs.getSplitNames(), splitName);
+ final int[] splitRevisionCodes = outPs.getSplitRevisionCodes();
+ splitRevisionCodes[index] = splitRevision;
+ outPs.setSplitRevisionCodes(splitRevisionCodes);
+ } else {
+ outPs.setSplitRevisionCodes(ArrayUtils.appendInt(
+ outPs.getSplitRevisionCodes(), splitRevision, /* allowDuplicates= */ true));
+ }
}
XmlUtils.skipCurrentTag(parser);
diff --git a/services/core/java/com/android/server/wm/LetterboxUiController.java b/services/core/java/com/android/server/wm/LetterboxUiController.java
index 444097a..291eab1 100644
--- a/services/core/java/com/android/server/wm/LetterboxUiController.java
+++ b/services/core/java/com/android/server/wm/LetterboxUiController.java
@@ -325,11 +325,6 @@
: mAppCompatConfiguration.getLetterboxVerticalPositionMultiplier(tabletopMode);
}
- float getFixedOrientationLetterboxAspectRatio(@NonNull Configuration parentConfiguration) {
- return mActivityRecord.mAppCompatController.getAppCompatAspectRatioOverrides()
- .getFixedOrientationLetterboxAspectRatio(parentConfiguration);
- }
-
boolean isLetterboxEducationEnabled() {
return mAppCompatConfiguration.getIsEducationEnabled();
}
diff --git a/services/tests/InputMethodSystemServerTests/src/com/android/server/inputmethod/DefaultImeVisibilityApplierTest.java b/services/tests/InputMethodSystemServerTests/src/com/android/server/inputmethod/DefaultImeVisibilityApplierTest.java
index 9e46f2f..efcc23f 100644
--- a/services/tests/InputMethodSystemServerTests/src/com/android/server/inputmethod/DefaultImeVisibilityApplierTest.java
+++ b/services/tests/InputMethodSystemServerTests/src/com/android/server/inputmethod/DefaultImeVisibilityApplierTest.java
@@ -70,14 +70,11 @@
public class DefaultImeVisibilityApplierTest extends InputMethodManagerServiceTestBase {
private DefaultImeVisibilityApplier mVisibilityApplier;
- private int mUserId = 0;
-
@Before
public void setUp() throws RemoteException {
super.setUp();
synchronized (ImfLock.class) {
mVisibilityApplier = mInputMethodManagerService.getVisibilityApplierLocked();
- mUserId = mInputMethodManagerService.getCurrentImeUserIdLocked();
mInputMethodManagerService.setAttachedClientForTesting(requireNonNull(
mInputMethodManagerService.getClientStateLocked(mMockInputMethodClient)));
}
@@ -248,7 +245,7 @@
mMockRemoteInputConnection /* inputConnection */,
mMockRemoteAccessibilityInputConnection /* remoteAccessibilityInputConnection */,
mTargetSdkVersion /* unverifiedTargetSdkVersion */,
- mCallingUserId /* userId */,
+ mUserId /* userId */,
mMockImeOnBackInvokedDispatcher /* imeDispatcher */);
}
}
diff --git a/services/tests/InputMethodSystemServerTests/src/com/android/server/inputmethod/InputMethodBindingControllerTest.java b/services/tests/InputMethodSystemServerTests/src/com/android/server/inputmethod/InputMethodBindingControllerTest.java
index 4d28b3c..1e3b7e9 100644
--- a/services/tests/InputMethodSystemServerTests/src/com/android/server/inputmethod/InputMethodBindingControllerTest.java
+++ b/services/tests/InputMethodSystemServerTests/src/com/android/server/inputmethod/InputMethodBindingControllerTest.java
@@ -140,8 +140,7 @@
final InputMethodInfo info;
synchronized (ImfLock.class) {
mBindingController.setSelectedMethodId(TEST_IME_ID);
- info = InputMethodSettingsRepository.get(mCallingUserId).getMethodMap()
- .get(TEST_IME_ID);
+ info = InputMethodSettingsRepository.get(mUserId).getMethodMap().get(TEST_IME_ID);
}
assertThat(info).isNotNull();
assertThat(info.getId()).isEqualTo(TEST_IME_ID);
diff --git a/services/tests/InputMethodSystemServerTests/src/com/android/server/inputmethod/InputMethodManagerServiceTestBase.java b/services/tests/InputMethodSystemServerTests/src/com/android/server/inputmethod/InputMethodManagerServiceTestBase.java
index 1dc5126..461697c 100644
--- a/services/tests/InputMethodSystemServerTests/src/com/android/server/inputmethod/InputMethodManagerServiceTestBase.java
+++ b/services/tests/InputMethodSystemServerTests/src/com/android/server/inputmethod/InputMethodManagerServiceTestBase.java
@@ -50,7 +50,6 @@
import android.os.Process;
import android.os.RemoteException;
import android.os.ServiceManager;
-import android.os.UserHandle;
import android.util.ArraySet;
import android.view.InputChannel;
import android.view.inputmethod.EditorInfo;
@@ -128,7 +127,7 @@
protected Context mContext;
protected MockitoSession mMockingSession;
protected int mTargetSdkVersion;
- protected int mCallingUserId;
+ protected int mUserId;
protected EditorInfo mEditorInfo;
protected IInputMethodInvoker mMockInputMethodInvoker;
protected InputMethodManagerService mInputMethodManagerService;
@@ -165,12 +164,12 @@
.spyStatic(AdditionalSubtypeUtils.class)
.startMocking();
- mContext = spy(InstrumentationRegistry.getInstrumentation().getContext());
+ mContext = spy(InstrumentationRegistry.getInstrumentation().getTargetContext());
mTargetSdkVersion = mContext.getApplicationInfo().targetSdkVersion;
mIsLargeScreen = mContext.getResources().getConfiguration()
.isLayoutSizeAtLeast(Configuration.SCREENLAYOUT_SIZE_LARGE);
- mCallingUserId = UserHandle.getCallingUserId();
+ mUserId = mContext.getUserId();
mEditorInfo = new EditorInfo();
mEditorInfo.packageName = TEST_EDITOR_PKG_NAME;
@@ -202,7 +201,7 @@
// Injecting and mocked InputMethodBindingController and InputMethod.
mMockInputMethodInvoker = IInputMethodInvoker.create(mMockInputMethod);
mInputManagerGlobalSession = InputManagerGlobal.createTestSession(mMockIInputManager);
- when(mMockInputMethodBindingController.getUserId()).thenReturn(mCallingUserId);
+ when(mMockInputMethodBindingController.getUserId()).thenReturn(mUserId);
synchronized (ImfLock.class) {
when(mMockInputMethodBindingController.getCurMethod())
.thenReturn(mMockInputMethodInvoker);
@@ -222,7 +221,7 @@
.thenReturn(new int[] {0});
when(mMockUserManagerInternal.getUserIds()).thenReturn(new int[] {0});
when(mMockActivityManagerInternal.isSystemReady()).thenReturn(true);
- when(mMockActivityManagerInternal.getCurrentUserId()).thenReturn(mCallingUserId);
+ when(mMockActivityManagerInternal.getCurrentUserId()).thenReturn(mUserId);
when(mMockPackageManagerInternal.getPackageUid(anyString(), anyLong(), anyInt()))
.thenReturn(Binder.getCallingUid());
when(mMockPackageManagerInternal.isSameApp(anyString(), anyLong(), anyInt(), anyInt()))
@@ -272,14 +271,13 @@
// Certain tests rely on TEST_IME_ID that is installed with AndroidTest.xml.
// TODO(b/352615651): Consider just synthesizing test InputMethodInfo then injecting it.
- AdditionalSubtypeMapRepository.initializeIfNecessary(mCallingUserId);
+ AdditionalSubtypeMapRepository.initializeIfNecessary(mUserId);
final var settings = InputMethodManagerService.queryInputMethodServicesInternal(mContext,
- mCallingUserId, AdditionalSubtypeMapRepository.get(mCallingUserId),
- DirectBootAwareness.AUTO);
- InputMethodSettingsRepository.put(mCallingUserId, settings);
+ mUserId, AdditionalSubtypeMapRepository.get(mUserId), DirectBootAwareness.AUTO);
+ InputMethodSettingsRepository.put(mUserId, settings);
// Emulate that the user initialization is done.
- mInputMethodManagerService.getUserData(mCallingUserId).mBackgroundLoadLatch.countDown();
+ mInputMethodManagerService.getUserData(mUserId).mBackgroundLoadLatch.countDown();
// After this boot phase, services can broadcast Intents.
lifecycle.onBootPhase(SystemService.PHASE_ACTIVITY_MANAGER_READY);
@@ -291,7 +289,7 @@
@After
public void tearDown() {
- InputMethodSettingsRepository.remove(mCallingUserId);
+ InputMethodSettingsRepository.remove(mUserId);
if (mInputMethodManagerService != null) {
mInputMethodManagerService.mInputMethodDeviceConfigs.destroy();
@@ -347,8 +345,8 @@
synchronized (ImfLock.class) {
ClientState cs = mInputMethodManagerService.getClientStateLocked(client);
cs.mCurSession = new InputMethodManagerService.SessionState(cs,
- mMockInputMethodInvoker, mMockInputMethodSession, mock(
- InputChannel.class), mCallingUserId);
+ mMockInputMethodInvoker, mMockInputMethodSession, mock(InputChannel.class),
+ mUserId);
}
}
}
diff --git a/services/tests/InputMethodSystemServerTests/src/com/android/server/inputmethod/InputMethodManagerServiceWindowGainedFocusTest.java b/services/tests/InputMethodSystemServerTests/src/com/android/server/inputmethod/InputMethodManagerServiceWindowGainedFocusTest.java
index ffc4df8..c5b5668 100644
--- a/services/tests/InputMethodSystemServerTests/src/com/android/server/inputmethod/InputMethodManagerServiceWindowGainedFocusTest.java
+++ b/services/tests/InputMethodSystemServerTests/src/com/android/server/inputmethod/InputMethodManagerServiceWindowGainedFocusTest.java
@@ -263,7 +263,7 @@
mMockRemoteInputConnection /* inputConnection */,
mMockRemoteAccessibilityInputConnection /* remoteAccessibilityInputConnection */,
mTargetSdkVersion /* unverifiedTargetSdkVersion */,
- mCallingUserId /* userId */,
+ mUserId /* userId */,
mMockImeOnBackInvokedDispatcher /* imeDispatcher */);
}
diff --git a/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/PackageManagerServiceUtilsTest.java b/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/PackageManagerServiceUtilsTest.java
new file mode 100644
index 0000000..4a2396d
--- /dev/null
+++ b/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/PackageManagerServiceUtilsTest.java
@@ -0,0 +1,341 @@
+/*
+ * 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.pm;
+
+import static org.testng.Assert.assertThrows;
+
+import android.content.pm.PackageInfoLite;
+import android.platform.test.annotations.Presubmit;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SmallTest;
+import androidx.test.platform.app.InstrumentationRegistry;
+
+import com.android.internal.pm.parsing.pkg.PackageImpl;
+import com.android.server.pm.pkg.AndroidPackage;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.io.File;
+import java.util.UUID;
+
+@Presubmit
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class PackageManagerServiceUtilsTest {
+
+ private static final String PACKAGE_NAME = "com.android.app";
+ private static final File CODE_PATH =
+ InstrumentationRegistry.getInstrumentation().getContext().getFilesDir();
+
+ @Test
+ public void testCheckDowngrade_packageSetting_versionCodeSmaller_throwException()
+ throws Exception {
+ final PackageSetting before = createPackageSetting();
+ before.setLongVersionCode(2);
+ final PackageInfoLite after = new PackageInfoLite();
+ after.versionCode = 1;
+
+ assertThrows(PackageManagerException.class,
+ () -> PackageManagerServiceUtils.checkDowngrade(before, after));
+ }
+
+ @Test
+ public void testCheckDowngrade_packageSetting_baseRevisionCodeSmaller_throwException()
+ throws Exception {
+ final PackageSetting before = createPackageSetting();
+ before.setLongVersionCode(1);
+ before.setBaseRevisionCode(2);
+ final PackageInfoLite after = new PackageInfoLite();
+ after.versionCode = 1;
+ after.baseRevisionCode = 1;
+
+ assertThrows(PackageManagerException.class,
+ () -> PackageManagerServiceUtils.checkDowngrade(before, after));
+ }
+
+ @Test
+ public void testCheckDowngrade_packageSetting_splitArraySizeIsDifferent_throwException()
+ throws Exception {
+ final String splitOne = "one";
+ final String splitTwo = "two";
+ final int revisionOne = 311;
+ final int revisionTwo = 330;
+ final String[] splitNames = new String[] { splitOne, splitTwo };
+ final int[] beforeSplitRevisionCodes = new int[] { revisionOne };
+ final int[] afterSplitRevisionCodes = new int[] { revisionOne, revisionTwo };
+
+ final PackageSetting before = createPackageSetting();
+ before.setLongVersionCode(1);
+ before.setSplitNames(splitNames);
+ before.setSplitRevisionCodes(beforeSplitRevisionCodes);
+ final PackageInfoLite after = new PackageInfoLite();
+ after.versionCode = 1;
+ after.splitNames = splitNames;
+ after.splitRevisionCodes = afterSplitRevisionCodes;
+
+ assertThrows(PackageManagerException.class,
+ () -> PackageManagerServiceUtils.checkDowngrade(before, after));
+ }
+
+ @Test
+ public void testCheckDowngrade_packageSetting_splitRevisionCodeSmaller_throwException()
+ throws Exception {
+ final String splitOne = "one";
+ final String splitTwo = "two";
+ final int revisionOne = 311;
+ final int revisionTwo = 330;
+ final int revisionThree = 360;
+ final String[] splitNames = new String[] { splitOne, splitTwo };
+ final int[] beforeSplitRevisionCodes = new int[] { revisionTwo, revisionThree};
+ final int[] afterSplitRevisionCodes = new int[] { revisionOne, revisionTwo };
+
+ final PackageSetting before = createPackageSetting();
+ before.setLongVersionCode(1);
+ before.setSplitNames(splitNames);
+ before.setSplitRevisionCodes(beforeSplitRevisionCodes);
+ final PackageInfoLite after = new PackageInfoLite();
+ after.versionCode = 1;
+ after.splitNames = splitNames;
+ after.splitRevisionCodes = afterSplitRevisionCodes;
+
+ assertThrows(PackageManagerException.class,
+ () -> PackageManagerServiceUtils.checkDowngrade(before, after));
+ }
+
+ @Test
+ public void testCheckDowngrade_packageSetting_sameSplitNameRevisionsBigger()
+ throws Exception {
+ final String splitOne = "one";
+ final String splitTwo = "two";
+ final int revisionOne = 311;
+ final int revisionTwo = 330;
+ final int revisionThree = 360;
+ final String[] splitNames = new String[] { splitOne, splitTwo };
+ final int[] beforeSplitRevisionCodes = new int[] { revisionOne, revisionTwo};
+ final int[] afterSplitRevisionCodes = new int[] { revisionOne, revisionThree };
+
+ final PackageSetting before = createPackageSetting();
+ before.setLongVersionCode(1);
+ before.setSplitNames(splitNames);
+ before.setSplitRevisionCodes(beforeSplitRevisionCodes);
+ final PackageInfoLite after = new PackageInfoLite();
+ after.versionCode = 1;
+ after.splitNames = splitNames;
+ after.splitRevisionCodes = afterSplitRevisionCodes;
+
+ PackageManagerServiceUtils.checkDowngrade(before, after);
+ }
+
+ @Test
+ public void testCheckDowngrade_packageSetting_hasDifferentSplitNames() throws Exception {
+ final String splitOne = "one";
+ final String splitTwo = "two";
+ final int revisionOne = 311;
+ final int revisionTwo = 330;
+ final int revisionThree = 360;
+ final String[] beforeSplitNames = new String[] { splitOne, splitTwo };
+ final String[] afterSplitNames = new String[] { splitTwo };
+ final int[] beforeSplitRevisionCodes = new int[] { revisionOne, revisionTwo};
+ final int[] afterSplitRevisionCodes = new int[] { revisionThree };
+
+ final PackageSetting before = createPackageSetting();
+ before.setLongVersionCode(1);
+ before.setSplitNames(beforeSplitNames);
+ before.setSplitRevisionCodes(beforeSplitRevisionCodes);
+ final PackageInfoLite after = new PackageInfoLite();
+ after.versionCode = 1;
+ after.splitNames = afterSplitNames;
+ after.splitRevisionCodes = afterSplitRevisionCodes;
+
+ PackageManagerServiceUtils.checkDowngrade(before, after);
+ }
+
+ @Test
+ public void testCheckDowngrade_packageSetting_newSplitName() throws Exception {
+ final String splitOne = "one";
+ final String splitTwo = "two";
+ final int revisionOne = 311;
+ final int revisionTwo = 330;
+ final String[] beforeSplitNames = new String[] { splitOne };
+ final String[] afterSplitNames = new String[] { splitTwo };
+ final int[] beforeSplitRevisionCodes = new int[] { revisionTwo };
+ final int[] afterSplitRevisionCodes = new int[] { revisionOne };
+
+ final PackageSetting before = createPackageSetting();
+ before.setLongVersionCode(1);
+ before.setSplitNames(beforeSplitNames);
+ before.setSplitRevisionCodes(beforeSplitRevisionCodes);
+ final PackageInfoLite after = new PackageInfoLite();
+ after.versionCode = 1;
+ after.splitNames = afterSplitNames;
+ after.splitRevisionCodes = afterSplitRevisionCodes;
+
+ PackageManagerServiceUtils.checkDowngrade(before, after);
+ }
+
+ @Test
+ public void testCheckDowngrade_androidPackage_versionCodeSmaller_throwException()
+ throws Exception {
+ final AndroidPackage before = PackageImpl.forTesting(PACKAGE_NAME).hideAsParsed()
+ .setVersionCode(2).hideAsFinal();
+ final PackageInfoLite after = new PackageInfoLite();
+ after.versionCode = 1;
+
+ assertThrows(PackageManagerException.class,
+ () -> PackageManagerServiceUtils.checkDowngrade(before, after));
+ }
+
+ @Test
+ public void testCheckDowngrade_androidPackage_baseRevisionCodeSmaller_throwException()
+ throws Exception {
+ final AndroidPackage before = PackageImpl.forTesting(PACKAGE_NAME).setBaseRevisionCode(2)
+ .hideAsParsed().setVersionCode(1).hideAsFinal();
+ final PackageInfoLite after = new PackageInfoLite();
+ after.versionCode = 1;
+ after.baseRevisionCode = 1;
+
+ assertThrows(PackageManagerException.class,
+ () -> PackageManagerServiceUtils.checkDowngrade(before, after));
+ }
+
+ @Test
+ public void testCheckDowngrade_androidPackage_splitArraySizeIsDifferent_throwException()
+ throws Exception {
+ final String splitOne = "one";
+ final String splitTwo = "two";
+ final int revisionOne = 311;
+ final int revisionTwo = 330;
+ final String[] splitNames = new String[] { splitOne, splitTwo };
+ final int[] beforeSplitRevisionCodes = new int[] { revisionOne };
+ final int[] afterSplitRevisionCodes = new int[] { revisionOne, revisionTwo };
+
+ final AndroidPackage before = PackageImpl.forTesting(PACKAGE_NAME)
+ .asSplit(splitNames, /* splitCodePaths= */ null,
+ beforeSplitRevisionCodes, /* splitDependencies= */ null)
+ .hideAsParsed().setVersionCode(1).hideAsFinal();
+ final PackageInfoLite after = new PackageInfoLite();
+ after.versionCode = 1;
+ after.splitNames = splitNames;
+ after.splitRevisionCodes = afterSplitRevisionCodes;
+
+ assertThrows(PackageManagerException.class,
+ () -> PackageManagerServiceUtils.checkDowngrade(before, after));
+ }
+
+ @Test
+ public void testCheckDowngrade_androidPackage_splitRevisionCodeSmaller_throwException()
+ throws Exception {
+ final String splitOne = "one";
+ final String splitTwo = "two";
+ final int revisionOne = 311;
+ final int revisionTwo = 330;
+ final int revisionThree = 360;
+ final String[] splitNames = new String[] { splitOne, splitTwo };
+ final int[] beforeSplitRevisionCodes = new int[] { revisionTwo, revisionThree};
+ final int[] afterSplitRevisionCodes = new int[] { revisionOne, revisionTwo };
+
+ final AndroidPackage before = PackageImpl.forTesting(PACKAGE_NAME)
+ .asSplit(splitNames, /* splitCodePaths= */ null,
+ beforeSplitRevisionCodes, /* splitDependencies= */ null)
+ .hideAsParsed().setVersionCode(1).hideAsFinal();
+ final PackageInfoLite after = new PackageInfoLite();
+ after.versionCode = 1;
+ after.splitNames = splitNames;
+ after.splitRevisionCodes = afterSplitRevisionCodes;
+
+ assertThrows(PackageManagerException.class,
+ () -> PackageManagerServiceUtils.checkDowngrade(before, after));
+ }
+
+ @Test
+ public void testCheckDowngrade_androidPackage_sameSplitNameRevisionsBigger()
+ throws Exception {
+ final String splitOne = "one";
+ final String splitTwo = "two";
+ final int revisionOne = 311;
+ final int revisionTwo = 330;
+ final int revisionThree = 360;
+ final String[] splitNames = new String[] { splitOne, splitTwo };
+ final int[] beforeSplitRevisionCodes = new int[] { revisionOne, revisionTwo};
+ final int[] afterSplitRevisionCodes = new int[] { revisionOne, revisionThree };
+
+ final AndroidPackage before = PackageImpl.forTesting(PACKAGE_NAME)
+ .asSplit(splitNames, /* splitCodePaths= */ null,
+ beforeSplitRevisionCodes, /* splitDependencies= */ null)
+ .hideAsParsed().setVersionCode(1).hideAsFinal();
+ final PackageInfoLite after = new PackageInfoLite();
+ after.versionCode = 1;
+ after.splitNames = splitNames;
+ after.splitRevisionCodes = afterSplitRevisionCodes;
+
+ PackageManagerServiceUtils.checkDowngrade(before, after);
+ }
+
+ @Test
+ public void testCheckDowngrade_androidPackage_hasDifferentSplitNames() throws Exception {
+ final String splitOne = "one";
+ final String splitTwo = "two";
+ final int revisionOne = 311;
+ final int revisionTwo = 330;
+ final int revisionThree = 360;
+ final String[] beforeSplitNames = new String[] { splitOne, splitTwo };
+ final String[] afterSplitNames = new String[] { splitTwo };
+ final int[] beforeSplitRevisionCodes = new int[] { revisionOne, revisionTwo};
+ final int[] afterSplitRevisionCodes = new int[] { revisionThree };
+
+ final AndroidPackage before = PackageImpl.forTesting(PACKAGE_NAME)
+ .asSplit(beforeSplitNames, /* splitCodePaths= */ null,
+ beforeSplitRevisionCodes, /* splitDependencies= */ null)
+ .hideAsParsed().setVersionCode(1).hideAsFinal();
+ final PackageInfoLite after = new PackageInfoLite();
+ after.versionCode = 1;
+ after.splitNames = afterSplitNames;
+ after.splitRevisionCodes = afterSplitRevisionCodes;
+
+ PackageManagerServiceUtils.checkDowngrade(before, after);
+ }
+
+ @Test
+ public void testCheckDowngrade_androidPackage_newSplitName() throws Exception {
+ final String splitOne = "one";
+ final String splitTwo = "two";
+ final int revisionOne = 311;
+ final int revisionTwo = 330;
+ final String[] beforeSplitNames = new String[] { splitOne };
+ final String[] afterSplitNames = new String[] { splitTwo };
+ final int[] beforeSplitRevisionCodes = new int[] { revisionTwo };
+ final int[] afterSplitRevisionCodes = new int[] { revisionOne };
+
+ final AndroidPackage before = PackageImpl.forTesting(PACKAGE_NAME)
+ .asSplit(beforeSplitNames, /* splitCodePaths= */ null,
+ beforeSplitRevisionCodes, /* splitDependencies= */ null)
+ .hideAsParsed().setVersionCode(1).hideAsFinal();
+ final PackageInfoLite after = new PackageInfoLite();
+ after.versionCode = 1;
+ after.splitNames = afterSplitNames;
+ after.splitRevisionCodes = afterSplitRevisionCodes;
+
+ PackageManagerServiceUtils.checkDowngrade(before, after);
+ }
+
+ private PackageSetting createPackageSetting() {
+ return new PackageSetting(PACKAGE_NAME, PACKAGE_NAME, CODE_PATH, /* pkgFlags= */ 0,
+ /* privateFlags= */ 0 , UUID.randomUUID());
+ }
+}
diff --git a/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/PackageManagerSettingsTests.java b/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/PackageManagerSettingsTests.java
index dec4634..d7af443 100644
--- a/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/PackageManagerSettingsTests.java
+++ b/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/PackageManagerSettingsTests.java
@@ -1092,7 +1092,7 @@
}
@Test
- public void testNoPkg_writeReadSplitVersions() {
+ public void testNoPkgDifferentRevisions_writeReadSplitVersions() {
Settings settings = makeSettings();
PackageSetting packageSetting = createPackageSetting(PACKAGE_NAME_1);
packageSetting.setAppId(Process.FIRST_APPLICATION_UID);
@@ -1117,6 +1117,54 @@
}
@Test
+ public void testNoPkgSameRevisions_writeReadSplitVersions() {
+ Settings settings = makeSettings();
+ PackageSetting packageSetting = createPackageSetting(PACKAGE_NAME_1);
+ packageSetting.setAppId(Process.FIRST_APPLICATION_UID);
+
+ final String splitOne = "one";
+ final String splitTwo = "two";
+ final int revisionOne = 311;
+ packageSetting.setSplitNames(new String[] { splitOne, splitTwo});
+ packageSetting.setSplitRevisionCodes(new int[] { revisionOne, revisionOne});
+ settings.mPackages.put(PACKAGE_NAME_1, packageSetting);
+
+ settings.writeLPr(computer, /* sync= */ true);
+ settings.mPackages.clear();
+
+ assertThat(settings.readLPw(computer, createFakeUsers()), is(true));
+ PackageSetting resultSetting = settings.getPackageLPr(PACKAGE_NAME_1);
+ assertThat(resultSetting.getSplitNames()[0], is(splitOne));
+ assertThat(resultSetting.getSplitNames()[1], is(splitTwo));
+ assertThat(resultSetting.getSplitRevisionCodes()[0], is(revisionOne));
+ assertThat(resultSetting.getSplitRevisionCodes()[1], is(revisionOne));
+ }
+
+ @Test
+ public void testNoPkgSameSplitNames_writeReadSplitVersions() {
+ Settings settings = makeSettings();
+ PackageSetting packageSetting = createPackageSetting(PACKAGE_NAME_1);
+ packageSetting.setAppId(Process.FIRST_APPLICATION_UID);
+
+ final String splitOne = "one";
+ final int revisionOne = 311;
+ final int revisionTwo = 330;
+ packageSetting.setSplitNames(new String[] { splitOne, splitOne});
+ packageSetting.setSplitRevisionCodes(new int[] { revisionOne, revisionTwo});
+ settings.mPackages.put(PACKAGE_NAME_1, packageSetting);
+
+ settings.writeLPr(computer, /* sync= */ true);
+ settings.mPackages.clear();
+
+ assertThat(settings.readLPw(computer, createFakeUsers()), is(true));
+ PackageSetting resultSetting = settings.getPackageLPr(PACKAGE_NAME_1);
+ assertThat(resultSetting.getSplitNames().length, is(1));
+ assertThat(resultSetting.getSplitRevisionCodes().length, is(1));
+ assertThat(resultSetting.getSplitNames()[0], is(splitOne));
+ assertThat(resultSetting.getSplitRevisionCodes()[0], is(revisionTwo));
+ }
+
+ @Test
public void testWriteReadArchiveState() {
Settings settings = makeSettings();
PackageSetting packageSetting = createPackageSetting(PACKAGE_NAME_1);
diff --git a/services/tests/wmtests/src/com/android/server/wm/AppCompatAspectRatioOverridesTest.java b/services/tests/wmtests/src/com/android/server/wm/AppCompatAspectRatioOverridesTest.java
index ddd6d56..a6fd112 100644
--- a/services/tests/wmtests/src/com/android/server/wm/AppCompatAspectRatioOverridesTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/AppCompatAspectRatioOverridesTest.java
@@ -26,6 +26,7 @@
import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
import android.compat.testing.PlatformCompatChangeRule;
import android.platform.test.annotations.Presubmit;
@@ -246,7 +247,6 @@
});
}
-
@Test
@EnableCompatChanges({OVERRIDE_MIN_ASPECT_RATIO})
public void testshouldOverrideMinAspectRatio_propertyFalse_overrideEnabled_returnsFalse() {
@@ -269,6 +269,24 @@
});
}
+ @Test
+ public void testGetFixedOrientationLetterboxAspectRatio_splitScreenAspectEnabled() {
+ runTestScenario((robot)-> {
+ robot.applyOnConf((c) -> {
+ c.enableCameraCompatTreatment(/* enabled */ true);
+ c.enableCameraCompatTreatmentAtBuildTime(/* enabled */ true);
+ c.enableCameraCompatSplitScreenAspectRatio(/* enabled */ true);
+ c.enableDisplayAspectRatioEnabledForFixedOrientationLetterbox(/* enabled */ false);
+ c.setFixedOrientationLetterboxAspectRatio(/* aspectRatio */ 1.5f);
+ });
+ robot.activity().createActivityWithComponentInNewTaskAndDisplay();
+ robot.checkFixedOrientationLetterboxAspectRatioForTopParent(/* expected */ 1.5f);
+
+ robot.activity().enableTreatmentForTopActivity(/* enabled */ true);
+ robot.checkAspectRatioForTopParentIsSplitScreenRatio(/* expected */ true);
+ });
+ }
+
/**
* Runs a test scenario providing a Robot.
*/
@@ -308,6 +326,28 @@
}
@NonNull
+ void checkFixedOrientationLetterboxAspectRatioForTopParent(float expected) {
+ assertEquals(expected,
+ getTopActivityAppCompatAspectRatioOverrides()
+ .getFixedOrientationLetterboxAspectRatio(
+ activity().top().getParent().getConfiguration()),
+ FLOAT_TOLLERANCE);
+ }
+
+ void checkAspectRatioForTopParentIsSplitScreenRatio(boolean expected) {
+ final AppCompatAspectRatioOverrides aspectRatioOverrides =
+ getTopActivityAppCompatAspectRatioOverrides();
+ if (expected) {
+ assertEquals(aspectRatioOverrides.getSplitScreenAspectRatio(),
+ aspectRatioOverrides.getFixedOrientationLetterboxAspectRatio(
+ activity().top().getParent().getConfiguration()), FLOAT_TOLLERANCE);
+ } else {
+ assertNotEquals(aspectRatioOverrides.getSplitScreenAspectRatio(),
+ aspectRatioOverrides.getFixedOrientationLetterboxAspectRatio(
+ activity().top().getParent().getConfiguration()), FLOAT_TOLLERANCE);
+ }
+ }
+
private AppCompatAspectRatioOverrides getTopActivityAppCompatAspectRatioOverrides() {
return activity().top().mAppCompatController.getAppCompatAspectRatioOverrides();
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/AppCompatConfigurationRobot.java b/services/tests/wmtests/src/com/android/server/wm/AppCompatConfigurationRobot.java
index 00a8771..6592f26 100644
--- a/services/tests/wmtests/src/com/android/server/wm/AppCompatConfigurationRobot.java
+++ b/services/tests/wmtests/src/com/android/server/wm/AppCompatConfigurationRobot.java
@@ -70,4 +70,14 @@
void enableCompatFakeFocus(boolean enabled) {
doReturn(enabled).when(mAppCompatConfiguration).isCompatFakeFocusEnabled();
}
+
+ void enableDisplayAspectRatioEnabledForFixedOrientationLetterbox(boolean enabled) {
+ doReturn(enabled).when(mAppCompatConfiguration)
+ .getIsDisplayAspectRatioEnabledForFixedOrientationLetterbox();
+ }
+
+ void setFixedOrientationLetterboxAspectRatio(float aspectRatio) {
+ doReturn(aspectRatio).when(mAppCompatConfiguration)
+ .getFixedOrientationLetterboxAspectRatio();
+ }
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/AppCompatRobotBase.java b/services/tests/wmtests/src/com/android/server/wm/AppCompatRobotBase.java
index 92f246b..6939f97 100644
--- a/services/tests/wmtests/src/com/android/server/wm/AppCompatRobotBase.java
+++ b/services/tests/wmtests/src/com/android/server/wm/AppCompatRobotBase.java
@@ -28,6 +28,8 @@
private static final int DEFAULT_DISPLAY_WIDTH = 1000;
private static final int DEFAULT_DISPLAY_HEIGHT = 2000;
+ static final float FLOAT_TOLLERANCE = 0.01f;
+
@NonNull
private final AppCompatActivityRobot mActivityRobot;
@NonNull
diff --git a/services/tests/wmtests/src/com/android/server/wm/LetterboxUiControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/LetterboxUiControllerTest.java
index e2c0f6c2..61a6f31 100644
--- a/services/tests/wmtests/src/com/android/server/wm/LetterboxUiControllerTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/LetterboxUiControllerTest.java
@@ -19,7 +19,6 @@
import static android.view.InsetsSource.FLAG_INSETS_ROUNDED_CORNER;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.eq;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
@@ -297,37 +296,6 @@
}
@Test
- public void testgetFixedOrientationLetterboxAspectRatio_splitScreenAspectEnabled() {
- doReturn(true).when(mActivity.mWmService.mAppCompatConfiguration)
- .isCameraCompatTreatmentEnabled();
- doReturn(true).when(mActivity.mWmService.mAppCompatConfiguration)
- .isCameraCompatTreatmentEnabledAtBuildTime();
- doReturn(true).when(mActivity.mWmService.mAppCompatConfiguration)
- .isCameraCompatSplitScreenAspectRatioEnabled();
- doReturn(false).when(mActivity.mWmService.mAppCompatConfiguration)
- .getIsDisplayAspectRatioEnabledForFixedOrientationLetterbox();
- doReturn(1.5f).when(mActivity.mWmService.mAppCompatConfiguration)
- .getFixedOrientationLetterboxAspectRatio();
-
- // Recreate DisplayContent with DisplayRotationCompatPolicy
- mActivity = setUpActivityWithComponent();
- mController = new LetterboxUiController(mWm, mActivity);
-
- assertEquals(1.5f, mController.getFixedOrientationLetterboxAspectRatio(
- mActivity.getParent().getConfiguration()), /* delta */ 0.01);
-
- spyOn(mDisplayContent.mAppCompatCameraPolicy);
- doReturn(true).when(mDisplayContent.mAppCompatCameraPolicy)
- .isTreatmentEnabledForActivity(eq(mActivity));
-
- final AppCompatAspectRatioOverrides aspectRatioOverrides =
- mActivity.mAppCompatController.getAppCompatAspectRatioOverrides();
- assertEquals(aspectRatioOverrides.getSplitScreenAspectRatio(),
- aspectRatioOverrides.getFixedOrientationLetterboxAspectRatio(
- mActivity.getParent().getConfiguration()), /* delta */ 0.01);
- }
-
- @Test
public void testIsVerticalThinLetterboxed() {
// Vertical thin letterbox disabled
doReturn(-1).when(mActivity.mWmService.mAppCompatConfiguration)