diff options
| author | 2024-02-09 06:58:13 +0000 | |
|---|---|---|
| committer | 2024-02-09 06:58:13 +0000 | |
| commit | 614ffa1694e2034a9116cc004a2d84a3e1687097 (patch) | |
| tree | 60ff0fb824eefac9a63dcda1e37d1a014e5ee375 | |
| parent | 7daf08d25c0d16716d143f606c068855a655a115 (diff) | |
| parent | 32d856272232dc2c3799d8c1a30bde52561c1f43 (diff) | |
Merge "Add back @UnsupportedAppUsage in ClientTransaction" into main
3 files changed, 117 insertions, 34 deletions
diff --git a/core/java/android/app/servertransaction/ClientTransaction.java b/core/java/android/app/servertransaction/ClientTransaction.java index 6357a20f592b..612d433adcd6 100644 --- a/core/java/android/app/servertransaction/ClientTransaction.java +++ b/core/java/android/app/servertransaction/ClientTransaction.java @@ -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; @@ -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; @@ -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; @@ -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); + } } /** @@ -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 @@ -118,9 +136,24 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem { } /** + * @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 @@ -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(); + } } /** @@ -203,19 +248,25 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem { mTransactionItems.get(i).recycle(); } mTransactionItems = null; - } - if (mActivityCallbacks != null) { - int size = mActivityCallbacks.size(); - for (int i = 0; i < size; i++) { - mActivityCallbacks.get(i).recycle(); - } mActivityCallbacks = null; - } - if (mLifecycleStateRequest != null) { - mLifecycleStateRequest.recycle(); 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++) { + mActivityCallbacks.get(i).recycle(); + } + mActivityCallbacks = null; + } + if (mLifecycleStateRequest != null) { + mLifecycleStateRequest.recycle(); + mLifecycleStateRequest = null; + } } mClient = null; + mActivityToken = null; ObjectPool.recycle(this); } @@ -229,13 +280,16 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem { dest.writeBoolean(writeTransactionItems); if (writeTransactionItems) { dest.writeParcelableList(mTransactionItems, flags); - } - - dest.writeParcelable(mLifecycleStateRequest, flags); - final boolean writeActivityCallbacks = mActivityCallbacks != null; - dest.writeBoolean(writeActivityCallbacks); - if (writeActivityCallbacks) { - dest.writeParcelableList(mActivityCallbacks, 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); + if (writeActivityCallbacks) { + dest.writeParcelableList(mActivityCallbacks, flags); + } } } @@ -246,15 +300,37 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem { mTransactionItems = new ArrayList<>(); in.readParcelableList(mTransactionItems, getClass().getClassLoader(), ClientTransactionItem.class); - } - mLifecycleStateRequest = in.readParcelable(getClass().getClassLoader(), - ActivityLifecycleItem.class); - final boolean readActivityCallbacks = in.readBoolean(); - if (readActivityCallbacks) { - mActivityCallbacks = new ArrayList<>(); - in.readParcelableList(mActivityCallbacks, 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); + } + } } } @@ -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 @@ -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; } diff --git a/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java b/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java index 508c6b2bcbce..c30d216208f9 100644 --- a/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java +++ b/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java @@ -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 @@ -299,6 +295,7 @@ public class TransactionParcelTests { assertEquals(transaction.hashCode(), result.hashCode()); assertEquals(transaction, result); + assertEquals(mActivityToken, result.getActivityToken()); } @Test @@ -319,6 +316,7 @@ public class TransactionParcelTests { assertEquals(transaction.hashCode(), result.hashCode()); assertEquals(transaction, result); + assertEquals(mActivityToken, result.getActivityToken()); } @Test @@ -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. */ diff --git a/services/tests/wmtests/src/com/android/server/wm/ClientLifecycleManagerTests.java b/services/tests/wmtests/src/com/android/server/wm/ClientLifecycleManagerTests.java index 5f18f848df75..b21eca70fdf9 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ClientLifecycleManagerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ClientLifecycleManagerTests.java @@ -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()); @@ -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()); } @@ -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()); } |