diff options
14 files changed, 78 insertions, 79 deletions
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 4952af353670..8696e0f9a601 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -4623,7 +4623,7 @@ public final class ActivityThread extends ClientTransactionHandler private void scheduleResume(ActivityClientRecord r) { final ClientTransaction transaction = new ClientTransaction(mAppThread); - final ResumeActivityItem resumeActivityItem = ResumeActivityItem.obtain(r.token, + final ResumeActivityItem resumeActivityItem = new ResumeActivityItem(r.token, /* isForward */ false, /* shouldSendCompatFakeFocus */ false); transaction.addTransactionItem(resumeActivityItem); executeTransaction(transaction); diff --git a/core/java/android/app/servertransaction/ResumeActivityItem.java b/core/java/android/app/servertransaction/ResumeActivityItem.java index 4a0ea98ccb89..a28791f6684e 100644 --- a/core/java/android/app/servertransaction/ResumeActivityItem.java +++ b/core/java/android/app/servertransaction/ResumeActivityItem.java @@ -22,6 +22,7 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.app.ActivityClient; import android.app.ActivityManager; +import android.app.ActivityManager.ProcessState; import android.app.ActivityThread.ActivityClientRecord; import android.app.ClientTransactionHandler; import android.os.IBinder; @@ -30,22 +31,37 @@ import android.os.Trace; /** * Request to move an activity to resumed state. + * * @hide */ public class ResumeActivityItem extends ActivityLifecycleItem { - private static final String TAG = "ResumeActivityItem"; + @ProcessState + private final int mProcState; + + private final boolean mIsForward; - private int mProcState; - private boolean mUpdateProcState; - private boolean mIsForward; // Whether we should send compat fake focus when the activity is resumed. This is needed // because some game engines wait to get focus before drawing the content of the app. - private boolean mShouldSendCompatFakeFocus; + private final boolean mShouldSendCompatFakeFocus; + + public ResumeActivityItem(@NonNull IBinder activityToken, boolean isForward, + boolean shouldSendCompatFakeFocus) { + this(activityToken, ActivityManager.PROCESS_STATE_UNKNOWN, isForward, + shouldSendCompatFakeFocus); + } + + public ResumeActivityItem(@NonNull IBinder activityToken, @ProcessState int procState, + boolean isForward, boolean shouldSendCompatFakeFocus) { + super(activityToken); + mProcState = procState; + mIsForward = isForward; + mShouldSendCompatFakeFocus = shouldSendCompatFakeFocus; + } @Override public void preExecute(@NonNull ClientTransactionHandler client) { - if (mUpdateProcState) { + if (mProcState != ActivityManager.PROCESS_STATE_UNKNOWN) { client.updateProcessState(mProcState, false); } } @@ -72,71 +88,21 @@ public class ResumeActivityItem extends ActivityLifecycleItem { return ON_RESUME; } - // ObjectPoolItem implementation - - private ResumeActivityItem() {} - - /** Obtain an instance initialized with provided params. */ - @NonNull - public static ResumeActivityItem obtain(@NonNull IBinder activityToken, int procState, - boolean isForward, boolean shouldSendCompatFakeFocus) { - ResumeActivityItem instance = ObjectPool.obtain(ResumeActivityItem.class); - if (instance == null) { - instance = new ResumeActivityItem(); - } - instance.setActivityToken(activityToken); - instance.mProcState = procState; - instance.mUpdateProcState = true; - instance.mIsForward = isForward; - instance.mShouldSendCompatFakeFocus = shouldSendCompatFakeFocus; - - return instance; - } - - /** Obtain an instance initialized with provided params. */ - @NonNull - public static ResumeActivityItem obtain(@NonNull IBinder activityToken, boolean isForward, - boolean shouldSendCompatFakeFocus) { - ResumeActivityItem instance = ObjectPool.obtain(ResumeActivityItem.class); - if (instance == null) { - instance = new ResumeActivityItem(); - } - instance.setActivityToken(activityToken); - instance.mProcState = ActivityManager.PROCESS_STATE_UNKNOWN; - instance.mUpdateProcState = false; - instance.mIsForward = isForward; - instance.mShouldSendCompatFakeFocus = shouldSendCompatFakeFocus; - - return instance; - } - - @Override - public void recycle() { - super.recycle(); - mProcState = ActivityManager.PROCESS_STATE_UNKNOWN; - mUpdateProcState = false; - mIsForward = false; - mShouldSendCompatFakeFocus = false; - ObjectPool.recycle(this); - } - // Parcelable implementation - /** Write to Parcel. */ + /** Writes to Parcel. */ @Override public void writeToParcel(@NonNull Parcel dest, int flags) { super.writeToParcel(dest, flags); dest.writeInt(mProcState); - dest.writeBoolean(mUpdateProcState); dest.writeBoolean(mIsForward); dest.writeBoolean(mShouldSendCompatFakeFocus); } - /** Read from Parcel. */ + /** Reads from Parcel. */ private ResumeActivityItem(@NonNull Parcel in) { super(in); mProcState = in.readInt(); - mUpdateProcState = in.readBoolean(); mIsForward = in.readBoolean(); mShouldSendCompatFakeFocus = in.readBoolean(); } @@ -160,7 +126,7 @@ public class ResumeActivityItem extends ActivityLifecycleItem { return false; } final ResumeActivityItem other = (ResumeActivityItem) o; - return mProcState == other.mProcState && mUpdateProcState == other.mUpdateProcState + return mProcState == other.mProcState && mIsForward == other.mIsForward && mShouldSendCompatFakeFocus == other.mShouldSendCompatFakeFocus; } @@ -170,7 +136,6 @@ public class ResumeActivityItem extends ActivityLifecycleItem { int result = 17; result = 31 * result + super.hashCode(); result = 31 * result + mProcState; - result = 31 * result + (mUpdateProcState ? 1 : 0); result = 31 * result + (mIsForward ? 1 : 0); result = 31 * result + (mShouldSendCompatFakeFocus ? 1 : 0); return result; @@ -180,7 +145,6 @@ public class ResumeActivityItem extends ActivityLifecycleItem { public String toString() { return "ResumeActivityItem{" + super.toString() + ",procState=" + mProcState - + ",updateProcState=" + mUpdateProcState + ",isForward=" + mIsForward + ",shouldSendCompatFakeFocus=" + mShouldSendCompatFakeFocus + "}"; } diff --git a/core/java/android/app/servertransaction/TransactionExecutorHelper.java b/core/java/android/app/servertransaction/TransactionExecutorHelper.java index 9f622e9e7dda..8ba90763fb16 100644 --- a/core/java/android/app/servertransaction/TransactionExecutorHelper.java +++ b/core/java/android/app/servertransaction/TransactionExecutorHelper.java @@ -42,6 +42,7 @@ import java.util.List; /** * Helper class for {@link TransactionExecutor} that contains utils for lifecycle path resolution. + * * @hide */ public class TransactionExecutorHelper { @@ -203,7 +204,7 @@ public class TransactionExecutorHelper { lifecycleItem = StopActivityItem.obtain(r.token); break; default: - lifecycleItem = ResumeActivityItem.obtain(r.token, false /* isForward */, + lifecycleItem = new ResumeActivityItem(r.token, false /* isForward */, false /* shouldSendCompatFakeFocus */); break; } diff --git a/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java b/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java index f5affd39b940..4f5107ac8d74 100644 --- a/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java +++ b/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java @@ -983,7 +983,7 @@ public class ActivityThreadTest { new MergedConfiguration(currentConfig, currentConfig), false /* preserveWindow */, activityWindowInfo); final ResumeActivityItem resumeStateRequest = - ResumeActivityItem.obtain(activity.getActivityToken(), true /* isForward */, + new ResumeActivityItem(activity.getActivityToken(), true /* isForward */, false /* shouldSendCompatFakeFocus*/); final ClientTransaction transaction = newTransaction(activity); @@ -996,7 +996,7 @@ public class ActivityThreadTest { @NonNull private static ClientTransaction newResumeTransaction(@NonNull Activity activity) { final ResumeActivityItem resumeStateRequest = - ResumeActivityItem.obtain(activity.getActivityToken(), true /* isForward */, + new ResumeActivityItem(activity.getActivityToken(), true /* isForward */, false /* shouldSendCompatFakeFocus */); final ClientTransaction transaction = newTransaction(activity); diff --git a/core/tests/coretests/src/android/app/servertransaction/ClientTransactionItemTest.java b/core/tests/coretests/src/android/app/servertransaction/ClientTransactionItemTest.java index ff30f190bb05..911b7596c714 100644 --- a/core/tests/coretests/src/android/app/servertransaction/ClientTransactionItemTest.java +++ b/core/tests/coretests/src/android/app/servertransaction/ClientTransactionItemTest.java @@ -21,13 +21,17 @@ import static android.view.Display.DEFAULT_DISPLAY; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyBoolean; +import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import android.app.Activity; +import android.app.ActivityManager; import android.app.ActivityThread; import android.app.ClientTransactionHandler; import android.content.res.Configuration; @@ -134,6 +138,41 @@ public class ClientTransactionItemTest { } @Test + public void testResumeActivityItem_preExecute_withProcState_updatesProcessState() { + final ResumeActivityItem item = new ResumeActivityItem(mActivityToken, + ActivityManager.PROCESS_STATE_TOP /* procState */, + true /* isForward */, + false /* shouldSendCompatFakeFocus*/); + + item.preExecute(mHandler); + + verify(mHandler).updateProcessState(ActivityManager.PROCESS_STATE_TOP, false); + } + + @Test + public void testResumeActivityItem_preExecute_withUnknownProcState_skipsProcessStateUpdate() { + final ResumeActivityItem item = new ResumeActivityItem(mActivityToken, + ActivityManager.PROCESS_STATE_UNKNOWN /* procState */, + true /* isForward */, + false /* shouldSendCompatFakeFocus*/); + + item.preExecute(mHandler); + + verify(mHandler, never()).updateProcessState(anyInt(), anyBoolean()); + } + + @Test + public void testResumeActivityItem_preExecute_withoutProcState_skipsProcessStateUpdate() { + final ResumeActivityItem item = new ResumeActivityItem(mActivityToken, + true /* isForward */, + false /* shouldSendCompatFakeFocus*/); + + item.preExecute(mHandler); + + verify(mHandler, never()).updateProcessState(anyInt(), anyBoolean()); + } + + @Test public void testWindowContextInfoChangeItem_execute() { final WindowContextInfoChangeItem item = WindowContextInfoChangeItem .obtain(mWindowClientToken, mConfiguration, DEFAULT_DISPLAY); diff --git a/core/tests/coretests/src/android/app/servertransaction/ObjectPoolTests.java b/core/tests/coretests/src/android/app/servertransaction/ObjectPoolTests.java index 40f6aa0b8f79..1817b875b201 100644 --- a/core/tests/coretests/src/android/app/servertransaction/ObjectPoolTests.java +++ b/core/tests/coretests/src/android/app/servertransaction/ObjectPoolTests.java @@ -161,11 +161,6 @@ public class ObjectPoolTests { } @Test - public void testRecycleResumeActivityItem() { - testRecycle(() -> ResumeActivityItem.obtain(mActivityToken, 3, true, false)); - } - - @Test public void testRecycleStartActivityItem() { testRecycle(() -> StartActivityItem.obtain(mActivityToken, new ActivityOptions.SceneTransitionInfo())); diff --git a/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java b/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java index dafcf288382a..dde6ab15e9e8 100644 --- a/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java +++ b/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java @@ -249,12 +249,12 @@ public class TransactionParcelTests { @Test public void testResume() { // Write to parcel - ResumeActivityItem item = ResumeActivityItem.obtain(mActivityToken, 27 /* procState */, + final ResumeActivityItem item = new ResumeActivityItem(mActivityToken, 27 /* procState */, true /* isForward */, false /* shouldSendCompatFakeFocus */); writeAndPrepareForReading(item); // Read from parcel and assert - ResumeActivityItem result = ResumeActivityItem.CREATOR.createFromParcel(mParcel); + final ResumeActivityItem result = ResumeActivityItem.CREATOR.createFromParcel(mParcel); assertEquals(item.hashCode(), result.hashCode()); assertEquals(item, result); diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index ee4deae21d4f..f31280e71c2e 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -9997,7 +9997,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A preserveWindow, getActivityWindowInfo()); final ActivityLifecycleItem lifecycleItem; if (andResume) { - lifecycleItem = ResumeActivityItem.obtain(token, isTransitionForward(), + lifecycleItem = new ResumeActivityItem(token, isTransitionForward(), shouldSendCompatFakeFocus()); } else { lifecycleItem = PauseActivityItem.obtain(token); diff --git a/services/core/java/com/android/server/wm/ActivityRefresher.java b/services/core/java/com/android/server/wm/ActivityRefresher.java index bc822718d45a..c02501f47af2 100644 --- a/services/core/java/com/android/server/wm/ActivityRefresher.java +++ b/services/core/java/com/android/server/wm/ActivityRefresher.java @@ -86,7 +86,7 @@ class ActivityRefresher { + "activityRecord=%s", activity); final RefreshCallbackItem refreshCallbackItem = RefreshCallbackItem.obtain( activity.token, cycleThroughStop ? ON_STOP : ON_PAUSE); - final ResumeActivityItem resumeActivityItem = ResumeActivityItem.obtain( + final ResumeActivityItem resumeActivityItem = new ResumeActivityItem( activity.token, /* isForward */ false, /* shouldSendCompatFakeFocus */ false); try { activity.mAtmService.getLifecycleManager().scheduleTransactionAndLifecycleItems( diff --git a/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java b/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java index e81b440f6d6d..021caafe061e 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java +++ b/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java @@ -942,7 +942,7 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks { // Set desired final state. final ActivityLifecycleItem lifecycleItem; if (andResume) { - lifecycleItem = ResumeActivityItem.obtain(r.token, isTransitionForward, + lifecycleItem = new ResumeActivityItem(r.token, isTransitionForward, r.shouldSendCompatFakeFocus()); } else if (r.isVisibleRequested()) { lifecycleItem = PauseActivityItem.obtain(r.token); diff --git a/services/core/java/com/android/server/wm/TaskFragment.java b/services/core/java/com/android/server/wm/TaskFragment.java index 9b2c022df963..5bdab2be7abd 100644 --- a/services/core/java/com/android/server/wm/TaskFragment.java +++ b/services/core/java/com/android/server/wm/TaskFragment.java @@ -1636,7 +1636,7 @@ class TaskFragment extends WindowContainer<WindowContainer> { final int topProcessState = mAtmService.mTopProcessState; next.app.setPendingUiCleanAndForceProcessStateUpTo(topProcessState); next.abortAndClearOptionsAnimation(); - final ResumeActivityItem resumeActivityItem = ResumeActivityItem.obtain( + final ResumeActivityItem resumeActivityItem = new ResumeActivityItem( next.token, topProcessState, dc.isNextTransitionForward(), next.shouldSendCompatFakeFocus()); mAtmService.getLifecycleManager().scheduleTransactionItem( diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityRefresherTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityRefresherTests.java index 6ad1044d2012..68ccb31805ff 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityRefresherTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityRefresherTests.java @@ -193,7 +193,7 @@ public class ActivityRefresherTests extends WindowTestsBase { final RefreshCallbackItem refreshCallbackItem = RefreshCallbackItem.obtain(mActivity.token, cycleThroughStop ? ON_STOP : ON_PAUSE); - final ResumeActivityItem resumeActivityItem = ResumeActivityItem.obtain(mActivity.token, + final ResumeActivityItem resumeActivityItem = new ResumeActivityItem(mActivity.token, /* isForward */ false, /* shouldSendCompatFakeFocus */ false); verify(mActivity.mAtmService.getLifecycleManager(), times(refreshRequested ? 1 : 0)) diff --git a/services/tests/wmtests/src/com/android/server/wm/CameraCompatFreeformPolicyTests.java b/services/tests/wmtests/src/com/android/server/wm/CameraCompatFreeformPolicyTests.java index eaa164127551..c43f414c4a62 100644 --- a/services/tests/wmtests/src/com/android/server/wm/CameraCompatFreeformPolicyTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/CameraCompatFreeformPolicyTests.java @@ -309,7 +309,7 @@ public class CameraCompatFreeformPolicyTests extends WindowTestsBase { final RefreshCallbackItem refreshCallbackItem = RefreshCallbackItem.obtain(mActivity.token, cycleThroughStop ? ON_STOP : ON_PAUSE); - final ResumeActivityItem resumeActivityItem = ResumeActivityItem.obtain(mActivity.token, + final ResumeActivityItem resumeActivityItem = new ResumeActivityItem(mActivity.token, /* isForward */ false, /* shouldSendCompatFakeFocus */ false); verify(mActivity.mAtmService.getLifecycleManager(), times(refreshRequested ? 1 : 0)) diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayRotationCompatPolicyTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayRotationCompatPolicyTests.java index e9fcc4048fbc..12bc3eda312d 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayRotationCompatPolicyTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayRotationCompatPolicyTests.java @@ -615,7 +615,7 @@ public final class DisplayRotationCompatPolicyTests extends WindowTestsBase { final RefreshCallbackItem refreshCallbackItem = RefreshCallbackItem.obtain(mActivity.token, cycleThroughStop ? ON_STOP : ON_PAUSE); - final ResumeActivityItem resumeActivityItem = ResumeActivityItem.obtain(mActivity.token, + final ResumeActivityItem resumeActivityItem = new ResumeActivityItem(mActivity.token, /* isForward */ false, /* shouldSendCompatFakeFocus */ false); verify(mActivity.mAtmService.getLifecycleManager(), times(refreshRequested ? 1 : 0)) |