diff options
| author | 2023-11-14 12:12:33 +0000 | |
|---|---|---|
| committer | 2023-11-14 12:12:33 +0000 | |
| commit | f283fec0154cffc8644caafdaa1a2acb28e8eb56 (patch) | |
| tree | f16f0709478f3eefe2211adb3e965a7e883bc627 | |
| parent | e59b0e4d1501eebeb717436f3638d7d9f32878f3 (diff) | |
| parent | 37a77dfdbf3158fcbc93417ce9a4a315e646477f (diff) | |
Merge "Synchronize window config updates (8/n)" into main
25 files changed, 199 insertions, 312 deletions
diff --git a/core/java/android/app/servertransaction/ActivityConfigurationChangeItem.java b/core/java/android/app/servertransaction/ActivityConfigurationChangeItem.java index dd332c850d5d..bc8fac5fa0ce 100644 --- a/core/java/android/app/servertransaction/ActivityConfigurationChangeItem.java +++ b/core/java/android/app/servertransaction/ActivityConfigurationChangeItem.java @@ -71,17 +71,13 @@ public class ActivityConfigurationChangeItem extends ActivityTransactionItem { @NonNull public static ActivityConfigurationChangeItem obtain(@NonNull IBinder activityToken, @NonNull Configuration config) { - if (config == null) { - throw new IllegalArgumentException("Config must not be null."); - } - ActivityConfigurationChangeItem instance = ObjectPool.obtain(ActivityConfigurationChangeItem.class); if (instance == null) { instance = new ActivityConfigurationChangeItem(); } instance.setActivityToken(activityToken); - instance.mConfiguration = config; + instance.mConfiguration = new Configuration(config); return instance; } @@ -89,7 +85,7 @@ public class ActivityConfigurationChangeItem extends ActivityTransactionItem { @Override public void recycle() { super.recycle(); - mConfiguration = Configuration.EMPTY; + mConfiguration = null; ObjectPool.recycle(this); } diff --git a/core/java/android/app/servertransaction/ActivityRelaunchItem.java b/core/java/android/app/servertransaction/ActivityRelaunchItem.java index a5dd115d78b3..3ce094ef7467 100644 --- a/core/java/android/app/servertransaction/ActivityRelaunchItem.java +++ b/core/java/android/app/servertransaction/ActivityRelaunchItem.java @@ -32,6 +32,7 @@ import android.util.Slog; import com.android.internal.content.ReferrerIntent; +import java.util.ArrayList; import java.util.List; import java.util.Objects; @@ -51,7 +52,7 @@ public class ActivityRelaunchItem extends ActivityTransactionItem { /** * A record that was properly configured for relaunch. Execution will be cancelled if not - * initialized after {@link #preExecute(ClientTransactionHandler, IBinder)}. + * initialized after {@link #preExecute(ClientTransactionHandler)}. */ private ActivityClientRecord mActivityClientRecord; @@ -99,10 +100,11 @@ public class ActivityRelaunchItem extends ActivityTransactionItem { instance = new ActivityRelaunchItem(); } instance.setActivityToken(activityToken); - instance.mPendingResults = pendingResults; - instance.mPendingNewIntents = pendingNewIntents; + instance.mPendingResults = pendingResults != null ? new ArrayList<>(pendingResults) : null; + instance.mPendingNewIntents = + pendingNewIntents != null ? new ArrayList<>(pendingNewIntents) : null; instance.mConfigChanges = configChanges; - instance.mConfig = config; + instance.mConfig = new MergedConfiguration(config); instance.mPreserveWindow = preserveWindow; return instance; diff --git a/core/java/android/app/servertransaction/ActivityResultItem.java b/core/java/android/app/servertransaction/ActivityResultItem.java index 24fced4981d6..51a09fb59236 100644 --- a/core/java/android/app/servertransaction/ActivityResultItem.java +++ b/core/java/android/app/servertransaction/ActivityResultItem.java @@ -35,6 +35,7 @@ import android.os.Parcel; import android.os.Parcelable; import android.os.Trace; +import java.util.ArrayList; import java.util.List; import java.util.Objects; @@ -82,7 +83,7 @@ public class ActivityResultItem extends ActivityTransactionItem { instance = new ActivityResultItem(); } instance.setActivityToken(activityToken); - instance.mResultInfoList = resultInfoList; + instance.mResultInfoList = new ArrayList<>(resultInfoList); return instance; } diff --git a/core/java/android/app/servertransaction/ActivityTransactionItem.java b/core/java/android/app/servertransaction/ActivityTransactionItem.java index 2a65b3528145..b4ff476f4702 100644 --- a/core/java/android/app/servertransaction/ActivityTransactionItem.java +++ b/core/java/android/app/servertransaction/ActivityTransactionItem.java @@ -20,6 +20,8 @@ import static android.app.servertransaction.TransactionExecutorHelper.getActivit import static com.android.internal.annotations.VisibleForTesting.Visibility.PACKAGE; +import static java.util.Objects.requireNonNull; + import android.annotation.CallSuper; import android.annotation.NonNull; import android.annotation.Nullable; @@ -93,7 +95,7 @@ public abstract class ActivityTransactionItem extends ClientTransactionItem { } void setActivityToken(@NonNull IBinder activityToken) { - mActivityToken = activityToken; + mActivityToken = requireNonNull(activityToken); } // To be overridden diff --git a/core/java/android/app/servertransaction/ClientTransaction.java b/core/java/android/app/servertransaction/ClientTransaction.java index 9c0cd39e8102..7c34cdefe95f 100644 --- a/core/java/android/app/servertransaction/ClientTransaction.java +++ b/core/java/android/app/servertransaction/ClientTransaction.java @@ -54,12 +54,14 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem { /** A list of individual callbacks to a client. */ @UnsupportedAppUsage + @Nullable private List<ClientTransactionItem> mActivityCallbacks; /** * Final lifecycle state in which the client activity should be after the transaction is * executed. */ + @Nullable private ActivityLifecycleItem mLifecycleStateRequest; /** Target client. */ @@ -123,6 +125,7 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem { @VisibleForTesting(visibility = PACKAGE) @UnsupportedAppUsage @Deprecated + @Nullable public ActivityLifecycleItem getLifecycleStateRequest() { return mLifecycleStateRequest; } @@ -207,7 +210,7 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem { for (int i = 0; i < size; i++) { mActivityCallbacks.get(i).recycle(); } - mActivityCallbacks.clear(); + mActivityCallbacks = null; } if (mLifecycleStateRequest != null) { mLifecycleStateRequest.recycle(); diff --git a/core/java/android/app/servertransaction/ConfigurationChangeItem.java b/core/java/android/app/servertransaction/ConfigurationChangeItem.java index 96961aced987..0e327a7627d1 100644 --- a/core/java/android/app/servertransaction/ConfigurationChangeItem.java +++ b/core/java/android/app/servertransaction/ConfigurationChangeItem.java @@ -64,7 +64,7 @@ public class ConfigurationChangeItem extends ClientTransactionItem { if (instance == null) { instance = new ConfigurationChangeItem(); } - instance.mConfiguration = config; + instance.mConfiguration = new Configuration(config); instance.mDeviceId = deviceId; return instance; diff --git a/core/java/android/app/servertransaction/LaunchActivityItem.java b/core/java/android/app/servertransaction/LaunchActivityItem.java index a64c744c70ba..d2ef65aec698 100644 --- a/core/java/android/app/servertransaction/LaunchActivityItem.java +++ b/core/java/android/app/servertransaction/LaunchActivityItem.java @@ -45,6 +45,7 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.internal.app.IVoiceInteractor; import com.android.internal.content.ReferrerIntent; +import java.util.ArrayList; import java.util.List; import java.util.Objects; @@ -135,10 +136,16 @@ public class LaunchActivityItem extends ClientTransactionItem { if (instance == null) { instance = new LaunchActivityItem(); } - setValues(instance, activityToken, intent, ident, info, curConfig, overrideConfig, deviceId, - referrer, voiceInteractor, procState, state, persistentState, pendingResults, - pendingNewIntents, activityOptions, isForward, profilerInfo, assistToken, - activityClientController, shareableActivityToken, + setValues(instance, activityToken, new Intent(intent), ident, new ActivityInfo(info), + new Configuration(curConfig), new Configuration(overrideConfig), deviceId, + referrer, voiceInteractor, procState, + state != null ? new Bundle(state) : null, + persistentState != null ? new PersistableBundle(persistentState) : null, + pendingResults != null ? new ArrayList<>(pendingResults) : null, + pendingNewIntents != null ? new ArrayList<>(pendingNewIntents) : null, + activityOptions, isForward, + profilerInfo != null ? new ProfilerInfo(profilerInfo) : null, + assistToken, activityClientController, shareableActivityToken, launchedFromBubble, taskFragmentToken); return instance; diff --git a/core/java/android/app/servertransaction/MoveToDisplayItem.java b/core/java/android/app/servertransaction/MoveToDisplayItem.java index e56d3f862b1b..961da19daeed 100644 --- a/core/java/android/app/servertransaction/MoveToDisplayItem.java +++ b/core/java/android/app/servertransaction/MoveToDisplayItem.java @@ -69,7 +69,7 @@ public class MoveToDisplayItem extends ActivityTransactionItem { } instance.setActivityToken(activityToken); instance.mTargetDisplayId = targetDisplayId; - instance.mConfiguration = configuration; + instance.mConfiguration = new Configuration(configuration); return instance; } @@ -78,7 +78,7 @@ public class MoveToDisplayItem extends ActivityTransactionItem { public void recycle() { super.recycle(); mTargetDisplayId = 0; - mConfiguration = Configuration.EMPTY; + mConfiguration = null; ObjectPool.recycle(this); } diff --git a/core/java/android/app/servertransaction/NewIntentItem.java b/core/java/android/app/servertransaction/NewIntentItem.java index 8e995aa05a48..acf2ea429e82 100644 --- a/core/java/android/app/servertransaction/NewIntentItem.java +++ b/core/java/android/app/servertransaction/NewIntentItem.java @@ -32,6 +32,7 @@ import android.os.Trace; import com.android.internal.content.ReferrerIntent; +import java.util.ArrayList; import java.util.List; import java.util.Objects; @@ -71,7 +72,7 @@ public class NewIntentItem extends ActivityTransactionItem { instance = new NewIntentItem(); } instance.setActivityToken(activityToken); - instance.mIntents = intents; + instance.mIntents = new ArrayList<>(intents); instance.mResume = resume; return instance; diff --git a/core/java/android/app/servertransaction/WindowContextInfoChangeItem.java b/core/java/android/app/servertransaction/WindowContextInfoChangeItem.java index 375d1bf57174..cbad92ff3f38 100644 --- a/core/java/android/app/servertransaction/WindowContextInfoChangeItem.java +++ b/core/java/android/app/servertransaction/WindowContextInfoChangeItem.java @@ -65,7 +65,7 @@ public class WindowContextInfoChangeItem extends ClientTransactionItem { instance = new WindowContextInfoChangeItem(); } instance.mClientToken = requireNonNull(clientToken); - instance.mInfo = new WindowContextInfo(config, displayId); + instance.mInfo = new WindowContextInfo(new Configuration(config), displayId); return instance; } diff --git a/core/java/android/app/servertransaction/WindowStateResizeItem.java b/core/java/android/app/servertransaction/WindowStateResizeItem.java index 98281338872b..7d3eb8783c04 100644 --- a/core/java/android/app/servertransaction/WindowStateResizeItem.java +++ b/core/java/android/app/servertransaction/WindowStateResizeItem.java @@ -77,10 +77,10 @@ public class WindowStateResizeItem extends ClientTransactionItem { instance = new WindowStateResizeItem(); } instance.mWindow = requireNonNull(window); - instance.mFrames = requireNonNull(frames); + instance.mFrames = new ClientWindowFrames(frames); instance.mReportDraw = reportDraw; - instance.mConfiguration = requireNonNull(configuration); - instance.mInsetsState = requireNonNull(insetsState); + instance.mConfiguration = new MergedConfiguration(configuration); + instance.mInsetsState = new InsetsState(insetsState); instance.mForceLayout = forceLayout; instance.mAlwaysConsumeSystemBars = alwaysConsumeSystemBars; instance.mDisplayId = displayId; diff --git a/core/java/android/window/ClientWindowFrames.java b/core/java/android/window/ClientWindowFrames.java index 0ce076b6eb96..1bd921b339f6 100644 --- a/core/java/android/window/ClientWindowFrames.java +++ b/core/java/android/window/ClientWindowFrames.java @@ -22,6 +22,8 @@ import android.graphics.Rect; import android.os.Parcel; import android.os.Parcelable; +import java.util.Objects; + /** * The window frame container class used by client side for layout. * @hide @@ -101,6 +103,29 @@ public class ClientWindowFrames implements Parcelable { } @Override + public boolean equals(@Nullable Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + final ClientWindowFrames other = (ClientWindowFrames) o; + return frame.equals(other.frame) + && displayFrame.equals(other.displayFrame) + && parentFrame.equals(other.parentFrame) + && Objects.equals(attachedFrame, other.attachedFrame) + && isParentFrameClippedByDisplayCutout == other.isParentFrameClippedByDisplayCutout + && compatScale == other.compatScale; + } + + @Override + public int hashCode() { + return Objects.hash(frame, displayFrame, parentFrame, attachedFrame, + isParentFrameClippedByDisplayCutout, compatScale); + } + + @Override public int describeContents() { return 0; } diff --git a/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java b/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java index 36e122301ba2..4b02257978d2 100644 --- a/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java +++ b/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java @@ -227,8 +227,7 @@ public class ActivityThreadTest { try { // Send process level config change. ClientTransaction transaction = newTransaction(activityThread); - transaction.addCallback(ConfigurationChangeItem.obtain( - new Configuration(newConfig), DEVICE_ID_INVALID)); + transaction.addCallback(ConfigurationChangeItem.obtain(newConfig, DEVICE_ID_INVALID)); appThread.scheduleTransaction(transaction); InstrumentationRegistry.getInstrumentation().waitForIdleSync(); @@ -245,7 +244,7 @@ public class ActivityThreadTest { newConfig.smallestScreenWidthDp++; transaction = newTransaction(activityThread); transaction.addCallback(ActivityConfigurationChangeItem.obtain( - activity.getActivityToken(), new Configuration(newConfig))); + activity.getActivityToken(), newConfig)); appThread.scheduleTransaction(transaction); InstrumentationRegistry.getInstrumentation().waitForIdleSync(); diff --git a/core/tests/coretests/src/android/app/servertransaction/ObjectPoolTests.java b/core/tests/coretests/src/android/app/servertransaction/ObjectPoolTests.java index 4bbde0cd6366..723c0812468c 100644 --- a/core/tests/coretests/src/android/app/servertransaction/ObjectPoolTests.java +++ b/core/tests/coretests/src/android/app/servertransaction/ObjectPoolTests.java @@ -26,6 +26,7 @@ import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotSame; import static org.junit.Assert.assertSame; +import android.annotation.NonNull; import android.app.ActivityOptions; import android.app.IApplicationThread; import android.app.servertransaction.TestUtils.LaunchActivityItemBuilder; @@ -80,74 +81,29 @@ public class ObjectPoolTests { @Test public void testRecycleActivityConfigurationChangeItem() { - ActivityConfigurationChangeItem emptyItem = ActivityConfigurationChangeItem.obtain( - null /* activityToken */, Configuration.EMPTY); - ActivityConfigurationChangeItem item = ActivityConfigurationChangeItem.obtain( - mActivityToken, config()); - assertNotSame(item, emptyItem); - assertNotEquals(item, emptyItem); - - item.recycle(); - assertEquals(item, emptyItem); - - ActivityConfigurationChangeItem item2 = ActivityConfigurationChangeItem.obtain( - mActivityToken, config()); - assertSame(item, item2); - assertNotEquals(item2, emptyItem); + testRecycle(() -> ActivityConfigurationChangeItem.obtain(mActivityToken, config())); } @Test public void testRecycleActivityResultItem() { - ActivityResultItem emptyItem = ActivityResultItem.obtain( - null /* activityToken */, null /* resultInfoList */); - ActivityResultItem item = ActivityResultItem.obtain(mActivityToken, resultInfoList()); - assertNotSame(item, emptyItem); - assertNotEquals(item, emptyItem); - - item.recycle(); - assertEquals(item, emptyItem); - - ActivityResultItem item2 = ActivityResultItem.obtain(mActivityToken, resultInfoList()); - assertSame(item, item2); - assertNotEquals(item2, emptyItem); + testRecycle(() -> ActivityResultItem.obtain(mActivityToken, resultInfoList())); } @Test public void testRecycleConfigurationChangeItem() { - ConfigurationChangeItem emptyItem = ConfigurationChangeItem.obtain(null, 0); - ConfigurationChangeItem item = ConfigurationChangeItem.obtain(config(), 1); - assertNotSame(item, emptyItem); - assertNotEquals(item, emptyItem); - - item.recycle(); - assertEquals(item, emptyItem); - - ConfigurationChangeItem item2 = ConfigurationChangeItem.obtain(config(), 1); - assertSame(item, item2); - assertNotEquals(item2, emptyItem); + testRecycle(() -> ConfigurationChangeItem.obtain(config(), 1)); } @Test public void testRecycleDestroyActivityItem() { - DestroyActivityItem emptyItem = DestroyActivityItem.obtain( - null /* activityToken */, false, 0); - DestroyActivityItem item = DestroyActivityItem.obtain(mActivityToken, true, 117); - assertNotSame(item, emptyItem); - assertNotEquals(item, emptyItem); - - item.recycle(); - assertEquals(item, emptyItem); - - DestroyActivityItem item2 = DestroyActivityItem.obtain(mActivityToken, true, 14); - assertSame(item, item2); - assertNotEquals(item2, emptyItem); + testRecycle(() -> DestroyActivityItem.obtain(mActivityToken, true, 117)); } @Test public void testRecycleLaunchActivityItem() { final IBinder activityToken = new Binder(); final Intent intent = new Intent("action"); - int ident = 57; + final int ident = 57; final ActivityInfo activityInfo = new ActivityInfo(); activityInfo.flags = 42; activityInfo.setMaxAspectRatio(2.4f); @@ -158,20 +114,19 @@ public class ObjectPoolTests { final Configuration overrideConfig = new Configuration(); overrideConfig.assetsSeq = 5; final String referrer = "referrer"; - int procState = 4; + final int procState = 4; final Bundle bundle = new Bundle(); bundle.putString("key", "value"); final PersistableBundle persistableBundle = new PersistableBundle(); persistableBundle.putInt("k", 4); final IBinder assistToken = new Binder(); final IBinder shareableActivityToken = new Binder(); - int deviceId = 3; + final int deviceId = 3; + final IBinder taskFragmentToken = new Binder(); - final Supplier<LaunchActivityItem> itemSupplier = () -> new LaunchActivityItemBuilder() - .setActivityToken(activityToken) - .setIntent(intent) + testRecycle(() -> new LaunchActivityItemBuilder( + activityToken, intent, activityInfo) .setIdent(ident) - .setInfo(activityInfo) .setCurConfig(config()) .setOverrideConfig(overrideConfig) .setReferrer(referrer) @@ -183,154 +138,74 @@ public class ObjectPoolTests { .setIsForward(true) .setAssistToken(assistToken) .setShareableActivityToken(shareableActivityToken) - .setTaskFragmentToken(new Binder()) + .setTaskFragmentToken(taskFragmentToken) .setDeviceId(deviceId) - .build(); - - LaunchActivityItem emptyItem = new LaunchActivityItemBuilder().build(); - LaunchActivityItem item = itemSupplier.get(); - assertNotSame(item, emptyItem); - assertNotEquals(item, emptyItem); - - item.recycle(); - assertEquals(item, emptyItem); - - LaunchActivityItem item2 = itemSupplier.get(); - assertSame(item, item2); - assertNotEquals(item2, emptyItem); + .build()); } @Test public void testRecycleActivityRelaunchItem() { - ActivityRelaunchItem emptyItem = ActivityRelaunchItem.obtain( - null /* activityToken */, null, null, 0, null, false); - Configuration overrideConfig = new Configuration(); - overrideConfig.assetsSeq = 5; - ActivityRelaunchItem item = ActivityRelaunchItem.obtain(mActivityToken, resultInfoList(), - referrerIntentList(), 42, mergedConfig(), true); - assertNotSame(item, emptyItem); - assertNotEquals(item, emptyItem); - - item.recycle(); - assertEquals(item, emptyItem); - - ActivityRelaunchItem item2 = ActivityRelaunchItem.obtain(mActivityToken, resultInfoList(), - referrerIntentList(), 42, mergedConfig(), true); - assertSame(item, item2); - assertNotEquals(item2, emptyItem); + testRecycle(() -> ActivityRelaunchItem.obtain(mActivityToken, + resultInfoList(), referrerIntentList(), 42, mergedConfig(), true)); } @Test public void testRecycleMoveToDisplayItem() { - MoveToDisplayItem emptyItem = MoveToDisplayItem.obtain( - null /* activityToken */, 0, Configuration.EMPTY); - MoveToDisplayItem item = MoveToDisplayItem.obtain(mActivityToken, 4, config()); - assertNotSame(item, emptyItem); - assertNotEquals(item, emptyItem); - - item.recycle(); - assertEquals(item, emptyItem); - - MoveToDisplayItem item2 = MoveToDisplayItem.obtain(mActivityToken, 3, config()); - assertSame(item, item2); - assertNotEquals(item2, emptyItem); + testRecycle(() -> MoveToDisplayItem.obtain(mActivityToken, 4, config())); } @Test public void testRecycleNewIntentItem() { - NewIntentItem emptyItem = NewIntentItem.obtain( - null /* activityToken */, null /* intents */, false /* resume */); - NewIntentItem item = NewIntentItem.obtain(mActivityToken, referrerIntentList(), false); - assertNotSame(item, emptyItem); - assertNotEquals(item, emptyItem); - - item.recycle(); - assertEquals(item, emptyItem); - - NewIntentItem item2 = NewIntentItem.obtain(mActivityToken, referrerIntentList(), false); - assertSame(item, item2); - assertNotEquals(item2, emptyItem); + testRecycle(() -> NewIntentItem.obtain(mActivityToken, referrerIntentList(), false)); } @Test public void testRecyclePauseActivityItemItem() { - PauseActivityItem emptyItem = PauseActivityItem.obtain( - null /* activityToken */, false, false, 0, false, false); - PauseActivityItem item = PauseActivityItem.obtain( - mActivityToken, true, true, 5, true, true); - assertNotSame(item, emptyItem); - assertNotEquals(item, emptyItem); - - item.recycle(); - assertEquals(item, emptyItem); - - PauseActivityItem item2 = PauseActivityItem.obtain( - mActivityToken, true, false, 5, true, true); - assertSame(item, item2); - assertNotEquals(item2, emptyItem); + testRecycle(() -> PauseActivityItem.obtain(mActivityToken, true, true, 5, true, true)); } @Test public void testRecycleResumeActivityItem() { - ResumeActivityItem emptyItem = ResumeActivityItem.obtain( - null /* activityToken */, false, false); - ResumeActivityItem item = ResumeActivityItem.obtain(mActivityToken, 3, true, false); - assertNotSame(item, emptyItem); - assertNotEquals(item, emptyItem); - - item.recycle(); - assertEquals(item, emptyItem); - - ResumeActivityItem item2 = ResumeActivityItem.obtain(mActivityToken, 2, true, false); - assertSame(item, item2); - assertNotEquals(item2, emptyItem); + testRecycle(() -> ResumeActivityItem.obtain(mActivityToken, 3, true, false)); } @Test public void testRecycleStartActivityItem() { - StartActivityItem emptyItem = StartActivityItem.obtain( - null /* activityToken */, null /* activityOptions */); - StartActivityItem item = StartActivityItem.obtain(mActivityToken, - ActivityOptions.makeBasic()); - assertNotSame(item, emptyItem); - assertNotEquals(item, emptyItem); - - item.recycle(); - assertEquals(item, emptyItem); - - StartActivityItem item2 = StartActivityItem.obtain(mActivityToken, - ActivityOptions.makeBasic().setLaunchDisplayId(10)); - assertSame(item, item2); - assertNotEquals(item2, emptyItem); + testRecycle(() -> StartActivityItem.obtain(mActivityToken, ActivityOptions.makeBasic())); } @Test public void testRecycleStopItem() { - StopActivityItem emptyItem = StopActivityItem.obtain(null /* activityToken */, 0); - StopActivityItem item = StopActivityItem.obtain(mActivityToken, 4); - assertNotSame(item, emptyItem); - assertNotEquals(item, emptyItem); - - item.recycle(); - assertEquals(item, emptyItem); - - StopActivityItem item2 = StopActivityItem.obtain(mActivityToken, 3); - assertSame(item, item2); - assertNotEquals(item2, emptyItem); + testRecycle(() -> StopActivityItem.obtain(mActivityToken, 4)); } @Test public void testRecycleClientTransaction() { - ClientTransaction emptyItem = ClientTransaction.obtain(null); - ClientTransaction item = ClientTransaction.obtain(mApplicationThread); - assertNotSame(item, emptyItem); - assertNotEquals(item, emptyItem); + testRecycle(() -> ClientTransaction.obtain(mApplicationThread)); + } + private void testRecycle(@NonNull Supplier<? extends ObjectPoolItem> obtain) { + // Reuse the same object after recycle. + final ObjectPoolItem item = obtain.get(); item.recycle(); - assertEquals(item, emptyItem); + final ObjectPoolItem item2 = obtain.get(); - ClientTransaction item2 = ClientTransaction.obtain(mApplicationThread); assertSame(item, item2); - assertNotEquals(item2, emptyItem); + + // Create new object when the pool is empty. + final ObjectPoolItem item3 = obtain.get(); + + assertNotSame(item, item3); + assertEquals(item, item3); + + // Reset fields after recycle. + item.recycle(); + + assertNotEquals(item, item3); + + // Recycled objects are equal. + item3.recycle(); + + assertEquals(item, item3); } } diff --git a/core/tests/coretests/src/android/app/servertransaction/TestUtils.java b/core/tests/coretests/src/android/app/servertransaction/TestUtils.java index 5a88bad37d5f..c0e2a4993e1c 100644 --- a/core/tests/coretests/src/android/app/servertransaction/TestUtils.java +++ b/core/tests/coretests/src/android/app/servertransaction/TestUtils.java @@ -18,6 +18,8 @@ package android.app.servertransaction; import static android.content.res.Configuration.ORIENTATION_LANDSCAPE; +import static java.util.Objects.requireNonNull; + import android.annotation.NonNull; import android.annotation.Nullable; import android.app.ActivityOptions; @@ -92,17 +94,18 @@ class TestUtils { } static class LaunchActivityItemBuilder { - @Nullable - private IBinder mActivityToken; - @Nullable - private Intent mIntent; + @NonNull + private final IBinder mActivityToken; + @NonNull + private final Intent mIntent; + @NonNull + private final ActivityInfo mInfo; + @NonNull + private final Configuration mCurConfig = new Configuration(); + @NonNull + private final Configuration mOverrideConfig = new Configuration(); + private int mIdent; - @Nullable - private ActivityInfo mInfo; - @Nullable - private Configuration mCurConfig; - @Nullable - private Configuration mOverrideConfig; private int mDeviceId; @Nullable private String mReferrer; @@ -130,16 +133,11 @@ class TestUtils { @Nullable private IBinder mTaskFragmentToken; - @NonNull - LaunchActivityItemBuilder setActivityToken(@Nullable IBinder activityToken) { - mActivityToken = activityToken; - return this; - } - - @NonNull - LaunchActivityItemBuilder setIntent(@Nullable Intent intent) { - mIntent = intent; - return this; + LaunchActivityItemBuilder(@NonNull IBinder activityToken, @NonNull Intent intent, + @NonNull ActivityInfo info) { + mActivityToken = requireNonNull(activityToken); + mIntent = requireNonNull(intent); + mInfo = requireNonNull(info); } @NonNull @@ -149,20 +147,14 @@ class TestUtils { } @NonNull - LaunchActivityItemBuilder setInfo(@Nullable ActivityInfo info) { - mInfo = info; - return this; - } - - @NonNull - LaunchActivityItemBuilder setCurConfig(@Nullable Configuration curConfig) { - mCurConfig = curConfig; + LaunchActivityItemBuilder setCurConfig(@NonNull Configuration curConfig) { + mCurConfig.setTo(curConfig); return this; } @NonNull - LaunchActivityItemBuilder setOverrideConfig(@Nullable Configuration overrideConfig) { - mOverrideConfig = overrideConfig; + LaunchActivityItemBuilder setOverrideConfig(@NonNull Configuration overrideConfig) { + mOverrideConfig.setTo(overrideConfig); return this; } diff --git a/core/tests/coretests/src/android/app/servertransaction/TransactionExecutorTests.java b/core/tests/coretests/src/android/app/servertransaction/TransactionExecutorTests.java index f2b0f2e622b8..443dcb4e51c5 100644 --- a/core/tests/coretests/src/android/app/servertransaction/TransactionExecutorTests.java +++ b/core/tests/coretests/src/android/app/servertransaction/TransactionExecutorTests.java @@ -44,6 +44,8 @@ import android.app.ActivityThread.ActivityClientRecord; import android.app.ClientTransactionHandler; import android.app.servertransaction.ActivityLifecycleItem.LifecycleState; import android.app.servertransaction.TestUtils.LaunchActivityItemBuilder; +import android.content.Intent; +import android.content.pm.ActivityInfo; import android.os.IBinder; import android.os.Parcel; import android.os.Parcelable; @@ -290,7 +292,7 @@ public class TransactionExecutorTests { // A previous queued launch transaction runs on main thread (execute). final ClientTransaction launchTransaction = ClientTransaction.obtain(null /* client */); final LaunchActivityItem launchItem = - spy(new LaunchActivityItemBuilder().setActivityToken(token).build()); + spy(new LaunchActivityItemBuilder(token, new Intent(), new ActivityInfo()).build()); launchTransaction.addCallback(launchItem); mExecutor.execute(launchTransaction); @@ -322,7 +324,7 @@ public class TransactionExecutorTests { // A previous queued launch transaction runs on main thread (execute). final ClientTransaction launchTransaction = ClientTransaction.obtain(null /* client */); final LaunchActivityItem launchItem = - spy(new LaunchActivityItemBuilder().setActivityToken(token).build()); + spy(new LaunchActivityItemBuilder(token, new Intent(), new ActivityInfo()).build()); launchTransaction.addTransactionItem(launchItem); mExecutor.execute(launchTransaction); diff --git a/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java b/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java index 4aa62c503a41..07921bfc34f5 100644 --- a/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java +++ b/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java @@ -173,11 +173,9 @@ public class TransactionParcelTests { final PersistableBundle persistableBundle = new PersistableBundle(); persistableBundle.putInt("k", 4); - final LaunchActivityItem item = new LaunchActivityItemBuilder() - .setActivityToken(activityToken) - .setIntent(intent) + final LaunchActivityItem item = new LaunchActivityItemBuilder( + activityToken, intent, activityInfo) .setIdent(ident) - .setInfo(activityInfo) .setCurConfig(config()) .setOverrideConfig(overrideConfig) .setReferrer(referrer) diff --git a/core/tests/coretests/src/android/app/servertransaction/WindowStateResizeItemTest.java b/core/tests/coretests/src/android/app/servertransaction/WindowStateResizeItemTest.java index c00eb91d752a..4d45daf3570c 100644 --- a/core/tests/coretests/src/android/app/servertransaction/WindowStateResizeItemTest.java +++ b/core/tests/coretests/src/android/app/servertransaction/WindowStateResizeItemTest.java @@ -52,16 +52,18 @@ public class WindowStateResizeItemTest { private PendingTransactionActions mPendingActions; @Mock private IWindow mWindow; - @Mock + + private InsetsState mInsetsState; private ClientWindowFrames mFrames; - @Mock private MergedConfiguration mConfiguration; - @Mock - private InsetsState mInsetsState; @Before public void setup() { MockitoAnnotations.initMocks(this); + + mInsetsState = new InsetsState(); + mFrames = new ClientWindowFrames(); + mConfiguration = new MergedConfiguration(); } @Test diff --git a/services/core/java/com/android/server/wm/ActivityClientController.java b/services/core/java/com/android/server/wm/ActivityClientController.java index 26f0d34a6261..7b399c837d32 100644 --- a/services/core/java/com/android/server/wm/ActivityClientController.java +++ b/services/core/java/com/android/server/wm/ActivityClientController.java @@ -1018,9 +1018,8 @@ class ActivityClientController extends IActivityClientController.Stub { } try { - final ClientTransaction transaction = ClientTransaction.obtain(r.app.getThread()); - transaction.addCallback(EnterPipRequestedItem.obtain(r.token)); - mService.getLifecycleManager().scheduleTransaction(transaction); + mService.getLifecycleManager().scheduleTransaction(r.app.getThread(), + EnterPipRequestedItem.obtain(r.token)); return true; } catch (Exception e) { Slog.w(TAG, "Failed to send enter pip requested item: " diff --git a/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java b/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java index 777b5cd4337b..e196d463db79 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java +++ b/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java @@ -936,7 +936,7 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks { final int deviceId = getDeviceIdForDisplayId(r.getDisplayId()); clientTransaction.addCallback(LaunchActivityItem.obtain(r.token, - new Intent(r.intent), System.identityHashCode(r), r.info, + r.intent, System.identityHashCode(r), r.info, // TODO: Have this take the merged configuration instead of separate global // and override configs. mergedConfiguration.getGlobalConfiguration(), 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 0c996e0155fd..1776ba556b72 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java @@ -195,6 +195,8 @@ public class ActivityRecordTests extends WindowTestsBase { setBooted(mAtm); // Because the booted state is set, avoid starting real home if there is no task. doReturn(false).when(mRootWindowContainer).resumeHomeActivity(any(), anyString(), any()); + // Do not execute the transaction, because we can't verify the parameter after it recycles. + doNothing().when(mClientLifecycleManager).scheduleTransaction(any()); } private TestStartingWindowOrganizer registerTestStartingWindowOrganizer() { @@ -262,7 +264,7 @@ public class ActivityRecordTests extends WindowTestsBase { pauseFound.value = true; } return null; - }).when(activity.app.getThread()).scheduleTransaction(any()); + }).when(mClientLifecycleManager).scheduleTransaction(any()); activity.setState(STOPPED, "testPausingWhenVisibleFromStopped"); @@ -477,7 +479,7 @@ public class ActivityRecordTests extends WindowTestsBase { .build(); final Task task = activity.getTask(); activity.setState(DESTROYED, "Testing"); - clearInvocations(mAtm.getLifecycleManager()); + clearInvocations(mClientLifecycleManager); final Configuration newConfig = new Configuration(task.getConfiguration()); newConfig.orientation = newConfig.orientation == ORIENTATION_PORTRAIT @@ -487,7 +489,7 @@ public class ActivityRecordTests extends WindowTestsBase { ensureActivityConfiguration(activity); - verify(mAtm.getLifecycleManager(), never()) + verify(mClientLifecycleManager, never()) .scheduleTransaction(any(), isA(ActivityConfigurationChangeItem.class)); } @@ -500,7 +502,7 @@ public class ActivityRecordTests extends WindowTestsBase { // test properly. activity.finishRelaunching(); // Clear out any calls to scheduleTransaction from launching the activity. - reset(mAtm.getLifecycleManager()); + reset(mClientLifecycleManager); final Task task = activity.getTask(); activity.setState(RESUMED, "Testing"); @@ -517,7 +519,7 @@ public class ActivityRecordTests extends WindowTestsBase { // The configuration change is still sent to the activity, even if it doesn't relaunch. final ActivityConfigurationChangeItem expected = ActivityConfigurationChangeItem.obtain(activity.token, newConfig); - verify(mAtm.getLifecycleManager()).scheduleTransaction( + verify(mClientLifecycleManager).scheduleTransaction( eq(activity.app.getThread()), eq(expected)); } @@ -558,19 +560,7 @@ public class ActivityRecordTests extends WindowTestsBase { activity.setLastReportedConfiguration(new MergedConfiguration(new Configuration(), activity.getConfiguration())); - clearInvocations(mAtm.getLifecycleManager()); - final Configuration newConfig = new Configuration(activity.getConfiguration()); - final int shortSide = Math.min(newConfig.screenWidthDp, newConfig.screenHeightDp); - final int longSide = Math.max(newConfig.screenWidthDp, newConfig.screenHeightDp); - if (newConfig.orientation == ORIENTATION_PORTRAIT) { - newConfig.orientation = ORIENTATION_LANDSCAPE; - newConfig.screenWidthDp = longSide; - newConfig.screenHeightDp = shortSide; - } else { - newConfig.orientation = ORIENTATION_PORTRAIT; - newConfig.screenWidthDp = shortSide; - newConfig.screenHeightDp = longSide; - } + clearInvocations(mClientLifecycleManager); // Mimic the behavior that display doesn't handle app's requested orientation. final DisplayContent dc = activity.getTask().getDisplayContent(); @@ -578,12 +568,15 @@ public class ActivityRecordTests extends WindowTestsBase { doReturn(false).when(dc).handlesOrientationChangeFromDescendant(anyInt()); final int requestedOrientation; - switch (newConfig.orientation) { - case ORIENTATION_LANDSCAPE: + final int expectedOrientation; + switch (activity.getConfiguration().orientation) { + case ORIENTATION_PORTRAIT: requestedOrientation = SCREEN_ORIENTATION_LANDSCAPE; + expectedOrientation = ORIENTATION_LANDSCAPE; break; - case ORIENTATION_PORTRAIT: + case ORIENTATION_LANDSCAPE: requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; + expectedOrientation = ORIENTATION_PORTRAIT; break; default: throw new IllegalStateException("Orientation in new config should be either" @@ -595,11 +588,11 @@ public class ActivityRecordTests extends WindowTestsBase { activity.setRequestedOrientation(requestedOrientation); + final Configuration currentConfig = activity.getConfiguration(); + assertEquals(expectedOrientation, currentConfig.orientation); final ActivityConfigurationChangeItem expected = - ActivityConfigurationChangeItem.obtain(activity.token, newConfig); - verify(mAtm.getLifecycleManager()).scheduleTransaction(eq(activity.app.getThread()), - eq(expected)); - + ActivityConfigurationChangeItem.obtain(activity.token, currentConfig); + verify(mClientLifecycleManager).scheduleTransaction(activity.app.getThread(), expected); verify(displayRotation).onSetRequestedOrientation(); } @@ -788,7 +781,7 @@ public class ActivityRecordTests extends WindowTestsBase { final Task stack = new TaskBuilder(mSupervisor).setCreateActivity(true).build(); try { - clearInvocations(mAtm.getLifecycleManager()); + clearInvocations(mClientLifecycleManager); doReturn(false).when(stack).isTranslucent(any()); assertTrue(task.shouldBeVisible(null /* starting */)); @@ -796,7 +789,10 @@ public class ActivityRecordTests extends WindowTestsBase { activity.getConfiguration())); final Configuration newConfig = new Configuration(activity.getConfiguration()); - final int shortSide = Math.min(newConfig.screenWidthDp, newConfig.screenHeightDp); + final int shortSide = newConfig.screenWidthDp == newConfig.screenHeightDp + // To avoid the case where it is always portrait because of width == height. + ? newConfig.screenWidthDp - 1 + : Math.min(newConfig.screenWidthDp, newConfig.screenHeightDp); final int longSide = Math.max(newConfig.screenWidthDp, newConfig.screenHeightDp); if (newConfig.orientation == ORIENTATION_PORTRAIT) { newConfig.orientation = ORIENTATION_LANDSCAPE; @@ -811,12 +807,12 @@ public class ActivityRecordTests extends WindowTestsBase { task.onConfigurationChanged(newConfig); activity.ensureActivityConfiguration(0 /* globalChanges */, - false /* preserveWindow */, true /* ignoreStopState */); + false /* preserveWindow */, true /* ignoreVisibility */); final ActivityConfigurationChangeItem expected = - ActivityConfigurationChangeItem.obtain(activity.token, newConfig); - verify(mAtm.getLifecycleManager()).scheduleTransaction( - eq(activity.app.getThread()), eq(expected)); + ActivityConfigurationChangeItem.obtain(activity.token, + activity.getConfiguration()); + verify(mClientLifecycleManager).scheduleTransaction(activity.app.getThread(), expected); } finally { stack.getDisplayArea().removeChild(stack); } @@ -1259,12 +1255,12 @@ public class ActivityRecordTests extends WindowTestsBase { targetActivity.resultTo = sourceActivity; targetActivity.setForceSendResultForMediaProjection(); - clearInvocations(mAtm.getLifecycleManager()); + clearInvocations(mClientLifecycleManager); targetActivity.finishIfPossible(0, new Intent(), null, "test", false /* oomAdj */); try { - verify(mAtm.getLifecycleManager(), atLeastOnce()).scheduleTransaction( + verify(mClientLifecycleManager, atLeastOnce()).scheduleTransaction( any(ClientTransaction.class)); } catch (RemoteException ignored) { } @@ -1283,7 +1279,7 @@ public class ActivityRecordTests extends WindowTestsBase { targetActivity.setState(RESUMED, "test"); targetActivity.resultTo = resultToActivity; - clearInvocations(mAtm.getLifecycleManager()); + clearInvocations(mClientLifecycleManager); targetActivity.finishIfPossible(0, new Intent(), null, "test", false /* oomAdj */); waitUntilHandlersIdle(); @@ -1786,10 +1782,10 @@ public class ActivityRecordTests extends WindowTestsBase { final ActivityRecord activity = createActivityWithTask(); final WindowProcessController wpc = activity.app; setup.accept(activity); - clearInvocations(mAtm.getLifecycleManager()); + clearInvocations(mClientLifecycleManager); activity.getTask().removeImmediately("test"); try { - verify(mAtm.getLifecycleManager()).scheduleTransaction(any(), + verify(mClientLifecycleManager).scheduleTransaction(any(), isA(DestroyActivityItem.class)); } catch (RemoteException ignored) { } diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java index e7ebd7db1023..3c027ffa5dac 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java @@ -39,9 +39,10 @@ import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.atLeast; +import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.doCallRealMethod; import static org.mockito.Mockito.never; @@ -51,7 +52,7 @@ import android.app.Activity; import android.app.ActivityManager; import android.app.IApplicationThread; import android.app.PictureInPictureParams; -import android.app.servertransaction.ClientTransaction; +import android.app.servertransaction.ClientTransactionItem; import android.app.servertransaction.EnterPipRequestedItem; import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; @@ -90,9 +91,6 @@ import java.util.function.Consumer; @RunWith(WindowTestRunner.class) public class ActivityTaskManagerServiceTests extends WindowTestsBase { - private final ArgumentCaptor<ClientTransaction> mClientTransactionCaptor = - ArgumentCaptor.forClass(ClientTransaction.class); - private static final String DEFAULT_PACKAGE_NAME = "my.application.package"; private static final int DEFAULT_USER_ID = 100; @@ -123,53 +121,42 @@ public class ActivityTaskManagerServiceTests extends WindowTestsBase { final ClientLifecycleManager mockLifecycleManager = mock(ClientLifecycleManager.class); doReturn(mockLifecycleManager).when(mAtm).getLifecycleManager(); doReturn(true).when(activity).checkEnterPictureInPictureState(anyString(), anyBoolean()); + clearInvocations(mClientLifecycleManager); mAtm.mActivityClientController.requestPictureInPictureMode(activity); - verify(mockLifecycleManager).scheduleTransaction(mClientTransactionCaptor.capture()); - final ClientTransaction transaction = mClientTransactionCaptor.getValue(); + final ArgumentCaptor<ClientTransactionItem> clientTransactionItemCaptor = + ArgumentCaptor.forClass(ClientTransactionItem.class); + verify(mockLifecycleManager).scheduleTransaction(any(), + clientTransactionItemCaptor.capture()); + final ClientTransactionItem transactionItem = clientTransactionItemCaptor.getValue(); // Check that only an enter pip request item callback was scheduled. - assertEquals(1, transaction.getCallbacks().size()); - assertTrue(transaction.getCallbacks().get(0) instanceof EnterPipRequestedItem); - // Check the activity lifecycle state remains unchanged. - assertNull(transaction.getLifecycleStateRequest()); + assertTrue(transactionItem instanceof EnterPipRequestedItem); } @Test public void testOnPictureInPictureRequested_cannotEnterPip() throws RemoteException { final Task stack = new TaskBuilder(mSupervisor).setCreateActivity(true).build(); final ActivityRecord activity = stack.getBottomMostTask().getTopNonFinishingActivity(); - ClientLifecycleManager lifecycleManager = mAtm.getLifecycleManager(); doReturn(false).when(activity).inPinnedWindowingMode(); doReturn(false).when(activity).checkEnterPictureInPictureState(anyString(), anyBoolean()); + clearInvocations(mClientLifecycleManager); mAtm.mActivityClientController.requestPictureInPictureMode(activity); - verify(lifecycleManager, atLeast(0)) - .scheduleTransaction(mClientTransactionCaptor.capture()); - final ClientTransaction transaction = mClientTransactionCaptor.getValue(); - // Check that none are enter pip request items. - transaction.getCallbacks().forEach(clientTransactionItem -> { - assertFalse(clientTransactionItem instanceof EnterPipRequestedItem); - }); + verify(mClientLifecycleManager, never()).scheduleTransaction(any(), any()); } @Test public void testOnPictureInPictureRequested_alreadyInPIPMode() throws RemoteException { final Task stack = new TaskBuilder(mSupervisor).setCreateActivity(true).build(); final ActivityRecord activity = stack.getBottomMostTask().getTopNonFinishingActivity(); - ClientLifecycleManager lifecycleManager = mAtm.getLifecycleManager(); doReturn(true).when(activity).inPinnedWindowingMode(); + clearInvocations(mClientLifecycleManager); mAtm.mActivityClientController.requestPictureInPictureMode(activity); - verify(lifecycleManager, atLeast(0)) - .scheduleTransaction(mClientTransactionCaptor.capture()); - final ClientTransaction transaction = mClientTransactionCaptor.getValue(); - // Check that none are enter pip request items. - transaction.getCallbacks().forEach(clientTransactionItem -> { - assertFalse(clientTransactionItem instanceof EnterPipRequestedItem); - }); + verify(mClientLifecycleManager, never()).scheduleTransaction(any(), any()); } @Test diff --git a/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationTest.java b/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationTest.java index 491d5b56c8e2..8de45b039f62 100644 --- a/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationTest.java @@ -202,8 +202,7 @@ public class RecentsAnimationTest extends WindowTestsBase { any() /* starting */, anyInt() /* configChanges */, anyBoolean() /* preserveWindows */, anyBoolean() /* notifyClients */); doReturn(app).when(mAtm).getProcessController(eq(recentActivity.processName), anyInt()); - ClientLifecycleManager lifecycleManager = mAtm.getLifecycleManager(); - doNothing().when(lifecycleManager).scheduleTransaction(any()); + doNothing().when(mClientLifecycleManager).scheduleTransaction(any()); startRecentsActivity(); diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowProcessControllerTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowProcessControllerTests.java index b89182d728ec..46cff8b82c6d 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowProcessControllerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowProcessControllerTests.java @@ -306,29 +306,28 @@ public class WindowProcessControllerTests extends WindowTestsBase { @Test public void testCachedStateConfigurationChange() throws RemoteException { - final ClientLifecycleManager clientManager = mAtm.getLifecycleManager(); - doNothing().when(clientManager).scheduleTransaction(any(), any()); + doNothing().when(mClientLifecycleManager).scheduleTransaction(any(), any()); final IApplicationThread thread = mWpc.getThread(); final Configuration newConfig = new Configuration(mWpc.getConfiguration()); newConfig.densityDpi += 100; // Non-cached state will send the change directly. mWpc.setReportedProcState(ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND); - clearInvocations(clientManager); + clearInvocations(mClientLifecycleManager); mWpc.onConfigurationChanged(newConfig); - verify(clientManager).scheduleTransaction(eq(thread), any()); + verify(mClientLifecycleManager).scheduleTransaction(eq(thread), any()); // Cached state won't send the change. - clearInvocations(clientManager); + clearInvocations(mClientLifecycleManager); mWpc.setReportedProcState(ActivityManager.PROCESS_STATE_CACHED_ACTIVITY); newConfig.densityDpi += 100; mWpc.onConfigurationChanged(newConfig); - verify(clientManager, never()).scheduleTransaction(eq(thread), any()); + verify(mClientLifecycleManager, never()).scheduleTransaction(eq(thread), any()); // Cached -> non-cached will send the previous deferred config immediately. mWpc.setReportedProcState(ActivityManager.PROCESS_STATE_RECEIVER); final ArgumentCaptor<ConfigurationChangeItem> captor = ArgumentCaptor.forClass(ConfigurationChangeItem.class); - verify(clientManager).scheduleTransaction(eq(thread), captor.capture()); + verify(mClientLifecycleManager).scheduleTransaction(eq(thread), captor.capture()); final ClientTransactionHandler client = mock(ClientTransactionHandler.class); captor.getValue().preExecute(client); final ArgumentCaptor<Configuration> configCaptor = diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java b/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java index e0ed642d3130..df4af112c087 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java @@ -152,6 +152,7 @@ class WindowTestsBase extends SystemServiceTestsBase { ActivityTaskManagerService mAtm; RootWindowContainer mRootWindowContainer; ActivityTaskSupervisor mSupervisor; + ClientLifecycleManager mClientLifecycleManager; WindowManagerService mWm; private final IWindow mIWindow = new TestIWindow(); private Session mTestSession; @@ -215,6 +216,7 @@ class WindowTestsBase extends SystemServiceTestsBase { mAtm = mSystemServicesTestRule.getActivityTaskManagerService(); mSupervisor = mAtm.mTaskSupervisor; mRootWindowContainer = mAtm.mRootWindowContainer; + mClientLifecycleManager = mAtm.getLifecycleManager(); mWm = mSystemServicesTestRule.getWindowManagerService(); mOriginalPerDisplayFocusEnabled = mWm.mPerDisplayFocusEnabled; SystemServicesTestRule.checkHoldsLock(mWm.mGlobalLock); |