Loading core/java/android/app/servertransaction/ClientTransaction.java +103 −25 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import android.annotation.Nullable; import android.app.ClientTransactionHandler; import android.app.IApplicationThread; import android.compat.annotation.UnsupportedAppUsage; import android.os.IBinder; import android.os.Parcel; import android.os.Parcelable; import android.os.RemoteException; Loading Loading @@ -53,6 +54,7 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem { private List<ClientTransactionItem> mTransactionItems; /** A list of individual callbacks to a client. */ // TODO(b/324203798): cleanup after remove UnsupportedAppUsage @UnsupportedAppUsage @Nullable private List<ClientTransactionItem> mActivityCallbacks; Loading @@ -61,9 +63,15 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem { * Final lifecycle state in which the client activity should be after the transaction is * executed. */ // TODO(b/324203798): cleanup after remove UnsupportedAppUsage @Nullable private ActivityLifecycleItem mLifecycleStateRequest; /** Only kept for unsupportedAppUsage {@link #getActivityToken()}. Must not be used. */ // TODO(b/324203798): cleanup after remove UnsupportedAppUsage @Nullable private IBinder mActivityToken; /** Target client. */ private IApplicationThread mClient; Loading @@ -81,6 +89,13 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem { mTransactionItems = new ArrayList<>(); } mTransactionItems.add(item); // TODO(b/324203798): cleanup after remove UnsupportedAppUsage if (item.isActivityLifecycleItem()) { setLifecycleStateRequest((ActivityLifecycleItem) item); } else { addCallback(item); } } /** Loading @@ -97,18 +112,21 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem { * @param activityCallback A single message that can contain a lifecycle request/callback. * @deprecated use {@link #addTransactionItem(ClientTransactionItem)} instead. */ // TODO(b/324203798): cleanup after remove UnsupportedAppUsage @Deprecated public void addCallback(@NonNull ClientTransactionItem activityCallback) { if (mActivityCallbacks == null) { mActivityCallbacks = new ArrayList<>(); } mActivityCallbacks.add(activityCallback); setActivityTokenIfNotSet(activityCallback); } /** * Gets the list of callbacks. * @deprecated use {@link #getTransactionItems()} instead. */ // TODO(b/324203798): cleanup after remove UnsupportedAppUsage @Nullable @VisibleForTesting @UnsupportedAppUsage Loading @@ -117,10 +135,25 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem { return mActivityCallbacks; } /** * @deprecated a transaction can contain {@link ClientTransactionItem} of different activities, * this must not be used. For any unsupported app usages, please be aware that this is set to * the activity of the first item in {@link #getTransactionItems()}. */ // TODO(b/324203798): cleanup after remove UnsupportedAppUsage @VisibleForTesting @Nullable @UnsupportedAppUsage @Deprecated public IBinder getActivityToken() { return mActivityToken; } /** * Gets the target state lifecycle request. * @deprecated use {@link #getTransactionItems()} instead. */ // TODO(b/324203798): cleanup after remove UnsupportedAppUsage @VisibleForTesting(visibility = PACKAGE) @UnsupportedAppUsage @Deprecated Loading @@ -134,9 +167,21 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem { * @param stateRequest A lifecycle request initialized with right parameters. * @deprecated use {@link #addTransactionItem(ClientTransactionItem)} instead. */ // TODO(b/324203798): cleanup after remove UnsupportedAppUsage @Deprecated public void setLifecycleStateRequest(@NonNull ActivityLifecycleItem stateRequest) { if (mLifecycleStateRequest != null) { return; } mLifecycleStateRequest = stateRequest; setActivityTokenIfNotSet(stateRequest); } // TODO(b/324203798): cleanup after remove UnsupportedAppUsage private void setActivityTokenIfNotSet(@Nullable ClientTransactionItem item) { if (mActivityToken == null && item != null) { mActivityToken = item.getActivityToken(); } } /** Loading Loading @@ -203,7 +248,11 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem { mTransactionItems.get(i).recycle(); } mTransactionItems = null; } mActivityCallbacks = null; mLifecycleStateRequest = null; } else { // Only needed when mTransactionItems is null, otherwise these will have the same // reference as mTransactionItems to support UnsupportedAppUsage. if (mActivityCallbacks != null) { int size = mActivityCallbacks.size(); for (int i = 0; i < size; i++) { Loading @@ -215,7 +264,9 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem { mLifecycleStateRequest.recycle(); mLifecycleStateRequest = null; } } mClient = null; mActivityToken = null; ObjectPool.recycle(this); } Loading @@ -229,8 +280,10 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem { dest.writeBoolean(writeTransactionItems); if (writeTransactionItems) { dest.writeParcelableList(mTransactionItems, flags); } } else { // TODO(b/324203798): cleanup after remove UnsupportedAppUsage // Only write mLifecycleStateRequest and mActivityCallbacks when mTransactionItems is // null dest.writeParcelable(mLifecycleStateRequest, flags); final boolean writeActivityCallbacks = mActivityCallbacks != null; dest.writeBoolean(writeActivityCallbacks); Loading @@ -238,6 +291,7 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem { dest.writeParcelableList(mActivityCallbacks, flags); } } } /** Read from Parcel. */ private ClientTransaction(@NonNull Parcel in) { Loading @@ -246,15 +300,37 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem { mTransactionItems = new ArrayList<>(); in.readParcelableList(mTransactionItems, getClass().getClassLoader(), ClientTransactionItem.class); } // TODO(b/324203798): cleanup after remove UnsupportedAppUsage // Populate mLifecycleStateRequest and mActivityCallbacks from mTransactionItems so // that they have the same reference when there is UnsupportedAppUsage to those fields. final int size = mTransactionItems.size(); for (int i = 0; i < size; i++) { final ClientTransactionItem item = mTransactionItems.get(i); if (item.isActivityLifecycleItem()) { setLifecycleStateRequest((ActivityLifecycleItem) item); } else { addCallback(item); } } } else { // TODO(b/324203798): cleanup after remove UnsupportedAppUsage // Only read mLifecycleStateRequest and mActivityCallbacks when mTransactionItems is // null mLifecycleStateRequest = in.readParcelable(getClass().getClassLoader(), ActivityLifecycleItem.class); setActivityTokenIfNotSet(mLifecycleStateRequest); final boolean readActivityCallbacks = in.readBoolean(); if (readActivityCallbacks) { mActivityCallbacks = new ArrayList<>(); in.readParcelableList(mActivityCallbacks, getClass().getClassLoader(), ClientTransactionItem.class); final int size = mActivityCallbacks.size(); for (int i = 0; mActivityToken == null && i < size; i++) { final ClientTransactionItem item = mActivityCallbacks.get(i); setActivityTokenIfNotSet(item); } } } } Loading Loading @@ -285,7 +361,8 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem { return Objects.equals(mTransactionItems, other.mTransactionItems) && Objects.equals(mActivityCallbacks, other.mActivityCallbacks) && Objects.equals(mLifecycleStateRequest, other.mLifecycleStateRequest) && mClient == other.mClient; && mClient == other.mClient && Objects.equals(mActivityToken, other.mActivityToken); } @Override Loading @@ -295,6 +372,7 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem { result = 31 * result + Objects.hashCode(mActivityCallbacks); result = 31 * result + Objects.hashCode(mLifecycleStateRequest); result = 31 * result + Objects.hashCode(mClient); result = 31 * result + Objects.hashCode(mActivityToken); return result; } Loading core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java +3 −4 Original line number Diff line number Diff line Loading @@ -288,10 +288,6 @@ public class TransactionParcelTests { transaction.addTransactionItem(callback2); transaction.addTransactionItem(lifecycleRequest); transaction.addCallback(callback1); transaction.addCallback(callback2); transaction.setLifecycleStateRequest(lifecycleRequest); writeAndPrepareForReading(transaction); // Read from parcel and assert Loading @@ -299,6 +295,7 @@ public class TransactionParcelTests { assertEquals(transaction.hashCode(), result.hashCode()); assertEquals(transaction, result); assertEquals(mActivityToken, result.getActivityToken()); } @Test Loading @@ -319,6 +316,7 @@ public class TransactionParcelTests { assertEquals(transaction.hashCode(), result.hashCode()); assertEquals(transaction, result); assertEquals(mActivityToken, result.getActivityToken()); } @Test Loading @@ -337,6 +335,7 @@ public class TransactionParcelTests { assertEquals(transaction.hashCode(), result.hashCode()); assertEquals(transaction, result); assertEquals(mActivityToken, result.getActivityToken()); } /** Write to {@link #mParcel} and reset its position to prepare for reading from the start. */ Loading services/tests/wmtests/src/com/android/server/wm/ClientLifecycleManagerTests.java +11 −5 Original line number Diff line number Diff line Loading @@ -143,7 +143,9 @@ public class ClientLifecycleManagerTests extends SystemServiceTestsBase { mLifecycleManager.mPendingTransactions.get(mNonBinderClient); assertEquals(1, transaction.getTransactionItems().size()); assertEquals(mTransactionItem, transaction.getTransactionItems().get(0)); assertNull(transaction.getCallbacks()); // TODO(b/324203798): cleanup after remove UnsupportedAppUsage assertEquals(1, transaction.getCallbacks().size()); assertEquals(mTransactionItem, transaction.getCallbacks().get(0)); assertNull(transaction.getLifecycleStateRequest()); verify(mLifecycleManager, never()).scheduleTransaction(any()); Loading @@ -156,8 +158,10 @@ public class ClientLifecycleManagerTests extends SystemServiceTestsBase { assertEquals(2, transaction.getTransactionItems().size()); assertEquals(mTransactionItem, transaction.getTransactionItems().get(0)); assertEquals(mLifecycleItem, transaction.getTransactionItems().get(1)); assertNull(transaction.getCallbacks()); assertNull(transaction.getLifecycleStateRequest()); // TODO(b/324203798): cleanup after remove UnsupportedAppUsage assertEquals(1, transaction.getCallbacks().size()); assertEquals(mTransactionItem, transaction.getCallbacks().get(0)); assertEquals(mLifecycleItem, transaction.getLifecycleStateRequest()); verify(mLifecycleManager, never()).scheduleTransaction(any()); } Loading Loading @@ -202,8 +206,10 @@ public class ClientLifecycleManagerTests extends SystemServiceTestsBase { assertEquals(2, transaction.getTransactionItems().size()); assertEquals(mTransactionItem, transaction.getTransactionItems().get(0)); assertEquals(mLifecycleItem, transaction.getTransactionItems().get(1)); assertNull(transaction.getCallbacks()); assertNull(transaction.getLifecycleStateRequest()); // TODO(b/324203798): cleanup after remove UnsupportedAppUsage assertEquals(1, transaction.getCallbacks().size()); assertEquals(mTransactionItem, transaction.getCallbacks().get(0)); assertEquals(mLifecycleItem, transaction.getLifecycleStateRequest()); verify(mLifecycleManager, never()).scheduleTransaction(any()); } Loading Loading
core/java/android/app/servertransaction/ClientTransaction.java +103 −25 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import android.annotation.Nullable; import android.app.ClientTransactionHandler; import android.app.IApplicationThread; import android.compat.annotation.UnsupportedAppUsage; import android.os.IBinder; import android.os.Parcel; import android.os.Parcelable; import android.os.RemoteException; Loading Loading @@ -53,6 +54,7 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem { private List<ClientTransactionItem> mTransactionItems; /** A list of individual callbacks to a client. */ // TODO(b/324203798): cleanup after remove UnsupportedAppUsage @UnsupportedAppUsage @Nullable private List<ClientTransactionItem> mActivityCallbacks; Loading @@ -61,9 +63,15 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem { * Final lifecycle state in which the client activity should be after the transaction is * executed. */ // TODO(b/324203798): cleanup after remove UnsupportedAppUsage @Nullable private ActivityLifecycleItem mLifecycleStateRequest; /** Only kept for unsupportedAppUsage {@link #getActivityToken()}. Must not be used. */ // TODO(b/324203798): cleanup after remove UnsupportedAppUsage @Nullable private IBinder mActivityToken; /** Target client. */ private IApplicationThread mClient; Loading @@ -81,6 +89,13 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem { mTransactionItems = new ArrayList<>(); } mTransactionItems.add(item); // TODO(b/324203798): cleanup after remove UnsupportedAppUsage if (item.isActivityLifecycleItem()) { setLifecycleStateRequest((ActivityLifecycleItem) item); } else { addCallback(item); } } /** Loading @@ -97,18 +112,21 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem { * @param activityCallback A single message that can contain a lifecycle request/callback. * @deprecated use {@link #addTransactionItem(ClientTransactionItem)} instead. */ // TODO(b/324203798): cleanup after remove UnsupportedAppUsage @Deprecated public void addCallback(@NonNull ClientTransactionItem activityCallback) { if (mActivityCallbacks == null) { mActivityCallbacks = new ArrayList<>(); } mActivityCallbacks.add(activityCallback); setActivityTokenIfNotSet(activityCallback); } /** * Gets the list of callbacks. * @deprecated use {@link #getTransactionItems()} instead. */ // TODO(b/324203798): cleanup after remove UnsupportedAppUsage @Nullable @VisibleForTesting @UnsupportedAppUsage Loading @@ -117,10 +135,25 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem { return mActivityCallbacks; } /** * @deprecated a transaction can contain {@link ClientTransactionItem} of different activities, * this must not be used. For any unsupported app usages, please be aware that this is set to * the activity of the first item in {@link #getTransactionItems()}. */ // TODO(b/324203798): cleanup after remove UnsupportedAppUsage @VisibleForTesting @Nullable @UnsupportedAppUsage @Deprecated public IBinder getActivityToken() { return mActivityToken; } /** * Gets the target state lifecycle request. * @deprecated use {@link #getTransactionItems()} instead. */ // TODO(b/324203798): cleanup after remove UnsupportedAppUsage @VisibleForTesting(visibility = PACKAGE) @UnsupportedAppUsage @Deprecated Loading @@ -134,9 +167,21 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem { * @param stateRequest A lifecycle request initialized with right parameters. * @deprecated use {@link #addTransactionItem(ClientTransactionItem)} instead. */ // TODO(b/324203798): cleanup after remove UnsupportedAppUsage @Deprecated public void setLifecycleStateRequest(@NonNull ActivityLifecycleItem stateRequest) { if (mLifecycleStateRequest != null) { return; } mLifecycleStateRequest = stateRequest; setActivityTokenIfNotSet(stateRequest); } // TODO(b/324203798): cleanup after remove UnsupportedAppUsage private void setActivityTokenIfNotSet(@Nullable ClientTransactionItem item) { if (mActivityToken == null && item != null) { mActivityToken = item.getActivityToken(); } } /** Loading Loading @@ -203,7 +248,11 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem { mTransactionItems.get(i).recycle(); } mTransactionItems = null; } mActivityCallbacks = null; mLifecycleStateRequest = null; } else { // Only needed when mTransactionItems is null, otherwise these will have the same // reference as mTransactionItems to support UnsupportedAppUsage. if (mActivityCallbacks != null) { int size = mActivityCallbacks.size(); for (int i = 0; i < size; i++) { Loading @@ -215,7 +264,9 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem { mLifecycleStateRequest.recycle(); mLifecycleStateRequest = null; } } mClient = null; mActivityToken = null; ObjectPool.recycle(this); } Loading @@ -229,8 +280,10 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem { dest.writeBoolean(writeTransactionItems); if (writeTransactionItems) { dest.writeParcelableList(mTransactionItems, flags); } } else { // TODO(b/324203798): cleanup after remove UnsupportedAppUsage // Only write mLifecycleStateRequest and mActivityCallbacks when mTransactionItems is // null dest.writeParcelable(mLifecycleStateRequest, flags); final boolean writeActivityCallbacks = mActivityCallbacks != null; dest.writeBoolean(writeActivityCallbacks); Loading @@ -238,6 +291,7 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem { dest.writeParcelableList(mActivityCallbacks, flags); } } } /** Read from Parcel. */ private ClientTransaction(@NonNull Parcel in) { Loading @@ -246,15 +300,37 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem { mTransactionItems = new ArrayList<>(); in.readParcelableList(mTransactionItems, getClass().getClassLoader(), ClientTransactionItem.class); } // TODO(b/324203798): cleanup after remove UnsupportedAppUsage // Populate mLifecycleStateRequest and mActivityCallbacks from mTransactionItems so // that they have the same reference when there is UnsupportedAppUsage to those fields. final int size = mTransactionItems.size(); for (int i = 0; i < size; i++) { final ClientTransactionItem item = mTransactionItems.get(i); if (item.isActivityLifecycleItem()) { setLifecycleStateRequest((ActivityLifecycleItem) item); } else { addCallback(item); } } } else { // TODO(b/324203798): cleanup after remove UnsupportedAppUsage // Only read mLifecycleStateRequest and mActivityCallbacks when mTransactionItems is // null mLifecycleStateRequest = in.readParcelable(getClass().getClassLoader(), ActivityLifecycleItem.class); setActivityTokenIfNotSet(mLifecycleStateRequest); final boolean readActivityCallbacks = in.readBoolean(); if (readActivityCallbacks) { mActivityCallbacks = new ArrayList<>(); in.readParcelableList(mActivityCallbacks, getClass().getClassLoader(), ClientTransactionItem.class); final int size = mActivityCallbacks.size(); for (int i = 0; mActivityToken == null && i < size; i++) { final ClientTransactionItem item = mActivityCallbacks.get(i); setActivityTokenIfNotSet(item); } } } } Loading Loading @@ -285,7 +361,8 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem { return Objects.equals(mTransactionItems, other.mTransactionItems) && Objects.equals(mActivityCallbacks, other.mActivityCallbacks) && Objects.equals(mLifecycleStateRequest, other.mLifecycleStateRequest) && mClient == other.mClient; && mClient == other.mClient && Objects.equals(mActivityToken, other.mActivityToken); } @Override Loading @@ -295,6 +372,7 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem { result = 31 * result + Objects.hashCode(mActivityCallbacks); result = 31 * result + Objects.hashCode(mLifecycleStateRequest); result = 31 * result + Objects.hashCode(mClient); result = 31 * result + Objects.hashCode(mActivityToken); return result; } Loading
core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java +3 −4 Original line number Diff line number Diff line Loading @@ -288,10 +288,6 @@ public class TransactionParcelTests { transaction.addTransactionItem(callback2); transaction.addTransactionItem(lifecycleRequest); transaction.addCallback(callback1); transaction.addCallback(callback2); transaction.setLifecycleStateRequest(lifecycleRequest); writeAndPrepareForReading(transaction); // Read from parcel and assert Loading @@ -299,6 +295,7 @@ public class TransactionParcelTests { assertEquals(transaction.hashCode(), result.hashCode()); assertEquals(transaction, result); assertEquals(mActivityToken, result.getActivityToken()); } @Test Loading @@ -319,6 +316,7 @@ public class TransactionParcelTests { assertEquals(transaction.hashCode(), result.hashCode()); assertEquals(transaction, result); assertEquals(mActivityToken, result.getActivityToken()); } @Test Loading @@ -337,6 +335,7 @@ public class TransactionParcelTests { assertEquals(transaction.hashCode(), result.hashCode()); assertEquals(transaction, result); assertEquals(mActivityToken, result.getActivityToken()); } /** Write to {@link #mParcel} and reset its position to prepare for reading from the start. */ Loading
services/tests/wmtests/src/com/android/server/wm/ClientLifecycleManagerTests.java +11 −5 Original line number Diff line number Diff line Loading @@ -143,7 +143,9 @@ public class ClientLifecycleManagerTests extends SystemServiceTestsBase { mLifecycleManager.mPendingTransactions.get(mNonBinderClient); assertEquals(1, transaction.getTransactionItems().size()); assertEquals(mTransactionItem, transaction.getTransactionItems().get(0)); assertNull(transaction.getCallbacks()); // TODO(b/324203798): cleanup after remove UnsupportedAppUsage assertEquals(1, transaction.getCallbacks().size()); assertEquals(mTransactionItem, transaction.getCallbacks().get(0)); assertNull(transaction.getLifecycleStateRequest()); verify(mLifecycleManager, never()).scheduleTransaction(any()); Loading @@ -156,8 +158,10 @@ public class ClientLifecycleManagerTests extends SystemServiceTestsBase { assertEquals(2, transaction.getTransactionItems().size()); assertEquals(mTransactionItem, transaction.getTransactionItems().get(0)); assertEquals(mLifecycleItem, transaction.getTransactionItems().get(1)); assertNull(transaction.getCallbacks()); assertNull(transaction.getLifecycleStateRequest()); // TODO(b/324203798): cleanup after remove UnsupportedAppUsage assertEquals(1, transaction.getCallbacks().size()); assertEquals(mTransactionItem, transaction.getCallbacks().get(0)); assertEquals(mLifecycleItem, transaction.getLifecycleStateRequest()); verify(mLifecycleManager, never()).scheduleTransaction(any()); } Loading Loading @@ -202,8 +206,10 @@ public class ClientLifecycleManagerTests extends SystemServiceTestsBase { assertEquals(2, transaction.getTransactionItems().size()); assertEquals(mTransactionItem, transaction.getTransactionItems().get(0)); assertEquals(mLifecycleItem, transaction.getTransactionItems().get(1)); assertNull(transaction.getCallbacks()); assertNull(transaction.getLifecycleStateRequest()); // TODO(b/324203798): cleanup after remove UnsupportedAppUsage assertEquals(1, transaction.getCallbacks().size()); assertEquals(mTransactionItem, transaction.getCallbacks().get(0)); assertEquals(mLifecycleItem, transaction.getLifecycleStateRequest()); verify(mLifecycleManager, never()).scheduleTransaction(any()); } Loading