Loading core/java/android/app/ActivityThread.java +1 −1 Original line number Diff line number Diff line Loading @@ -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); Loading core/java/android/app/servertransaction/ResumeActivityItem.java +25 −61 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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); } } Loading @@ -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(); } Loading @@ -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; } Loading @@ -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; Loading @@ -180,7 +145,6 @@ public class ResumeActivityItem extends ActivityLifecycleItem { public String toString() { return "ResumeActivityItem{" + super.toString() + ",procState=" + mProcState + ",updateProcState=" + mUpdateProcState + ",isForward=" + mIsForward + ",shouldSendCompatFakeFocus=" + mShouldSendCompatFakeFocus + "}"; } Loading core/java/android/app/servertransaction/TransactionExecutorHelper.java +2 −1 Original line number Diff line number Diff line Loading @@ -42,6 +42,7 @@ import java.util.List; /** * Helper class for {@link TransactionExecutor} that contains utils for lifecycle path resolution. * * @hide */ public class TransactionExecutorHelper { Loading Loading @@ -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; } Loading core/tests/coretests/src/android/app/activity/ActivityThreadTest.java +2 −2 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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); Loading core/tests/coretests/src/android/app/servertransaction/ClientTransactionItemTest.java +39 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -133,6 +137,41 @@ public class ClientTransactionItemTest { eq(false) /* getNonConfigInstance */, any()); } @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 Loading Loading
core/java/android/app/ActivityThread.java +1 −1 Original line number Diff line number Diff line Loading @@ -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); Loading
core/java/android/app/servertransaction/ResumeActivityItem.java +25 −61 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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); } } Loading @@ -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(); } Loading @@ -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; } Loading @@ -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; Loading @@ -180,7 +145,6 @@ public class ResumeActivityItem extends ActivityLifecycleItem { public String toString() { return "ResumeActivityItem{" + super.toString() + ",procState=" + mProcState + ",updateProcState=" + mUpdateProcState + ",isForward=" + mIsForward + ",shouldSendCompatFakeFocus=" + mShouldSendCompatFakeFocus + "}"; } Loading
core/java/android/app/servertransaction/TransactionExecutorHelper.java +2 −1 Original line number Diff line number Diff line Loading @@ -42,6 +42,7 @@ import java.util.List; /** * Helper class for {@link TransactionExecutor} that contains utils for lifecycle path resolution. * * @hide */ public class TransactionExecutorHelper { Loading Loading @@ -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; } Loading
core/tests/coretests/src/android/app/activity/ActivityThreadTest.java +2 −2 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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); Loading
core/tests/coretests/src/android/app/servertransaction/ClientTransactionItemTest.java +39 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -133,6 +137,41 @@ public class ClientTransactionItemTest { eq(false) /* getNonConfigInstance */, any()); } @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 Loading