summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/app/servertransaction/ClientTransaction.java128
-rw-r--r--core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java7
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/ClientLifecycleManagerTests.java16
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());
}