Loading core/java/android/app/ActivityThread.java +4 −4 Original line number Diff line number Diff line Loading @@ -62,7 +62,7 @@ import android.app.servertransaction.ActivityLifecycleItem.LifecycleState; import android.app.servertransaction.ActivityRelaunchItem; import android.app.servertransaction.ActivityResultItem; import android.app.servertransaction.ClientTransaction; import android.app.servertransaction.ClientTransactionItem; import android.app.servertransaction.DestroyActivityItem; import android.app.servertransaction.PauseActivityItem; import android.app.servertransaction.PendingTransactionActions; import android.app.servertransaction.PendingTransactionActions.StopInfo; Loading Loading @@ -375,8 +375,8 @@ public final class ActivityThread extends ClientTransactionHandler @GuardedBy("mPendingOverrideConfigs") private final ArrayMap<IBinder, Configuration> mPendingOverrideConfigs = new ArrayMap<>(); /** The activities to be truly destroyed (not include relaunch). */ final Map<IBinder, ClientTransactionItem> mActivitiesToBeDestroyed = Collections.synchronizedMap(new ArrayMap<IBinder, ClientTransactionItem>()); final Map<IBinder, DestroyActivityItem> mActivitiesToBeDestroyed = Collections.synchronizedMap(new ArrayMap<>()); // List of new activities that should be reported when next we idle. final ArrayList<ActivityClientRecord> mNewActivities = new ArrayList<>(); // Number of activities that are currently visible on-screen. Loading Loading @@ -5799,7 +5799,7 @@ public final class ActivityThread extends ClientTransactionHandler } @Override public Map<IBinder, ClientTransactionItem> getActivitiesToBeDestroyed() { public Map<IBinder, DestroyActivityItem> getActivitiesToBeDestroyed() { return mActivitiesToBeDestroyed; } Loading core/java/android/app/ClientTransactionHandler.java +2 −2 Original line number Diff line number Diff line Loading @@ -19,7 +19,7 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.app.ActivityThread.ActivityClientRecord; import android.app.servertransaction.ClientTransaction; import android.app.servertransaction.ClientTransactionItem; import android.app.servertransaction.DestroyActivityItem; import android.app.servertransaction.PendingTransactionActions; import android.app.servertransaction.TransactionExecutor; import android.content.Context; Loading Loading @@ -108,7 +108,7 @@ public abstract class ClientTransactionHandler { // and deliver callbacks. /** Get activity and its corresponding transaction item which are going to destroy. */ public abstract Map<IBinder, ClientTransactionItem> getActivitiesToBeDestroyed(); public abstract Map<IBinder, DestroyActivityItem> getActivitiesToBeDestroyed(); /** Destroy the activity. */ public abstract void handleDestroyActivity(@NonNull ActivityClientRecord r, boolean finishing, Loading core/java/android/app/servertransaction/ClientTransaction.java +0 −18 Original line number Diff line number Diff line Loading @@ -23,7 +23,6 @@ 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 @@ -83,23 +82,6 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem { return mActivityCallbacks; } /** Get the target activity. */ @Nullable @UnsupportedAppUsage public IBinder getActivityToken() { // TODO(b/260873529): remove after we allow multiple activity items in one transaction. if (mLifecycleStateRequest != null) { return mLifecycleStateRequest.getActivityToken(); } for (int i = mActivityCallbacks.size() - 1; i >= 0; i--) { final IBinder token = mActivityCallbacks.get(i).getActivityToken(); if (token != null) { return token; } } return null; } /** Get the target state lifecycle request. */ @VisibleForTesting(visibility = PACKAGE) @UnsupportedAppUsage Loading core/java/android/app/servertransaction/DestroyActivityItem.java +7 −0 Original line number Diff line number Diff line Loading @@ -49,6 +49,13 @@ public class DestroyActivityItem extends ActivityLifecycleItem { Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER); } @Override public void postExecute(@NonNull ClientTransactionHandler client, @NonNull PendingTransactionActions pendingActions) { // Cleanup after execution. client.getActivitiesToBeDestroyed().remove(getActivityToken()); } @Override public int getTargetState() { return ON_DESTROY; Loading core/java/android/app/servertransaction/TransactionExecutor.java +16 −25 Original line number Diff line number Diff line Loading @@ -47,7 +47,6 @@ import android.util.Slog; import com.android.internal.annotations.VisibleForTesting; import java.util.List; import java.util.Map; /** * Class that manages transaction execution in the correct order. Loading Loading @@ -75,34 +74,14 @@ public class TransactionExecutor { * either remain in the initial state, or last state needed by a callback. */ public void execute(@NonNull ClientTransaction transaction) { if (DEBUG_RESOLVER) Slog.d(TAG, tId(transaction) + "Start resolving transaction"); final IBinder token = transaction.getActivityToken(); if (token != null) { final Map<IBinder, ClientTransactionItem> activitiesToBeDestroyed = mTransactionHandler.getActivitiesToBeDestroyed(); final ClientTransactionItem destroyItem = activitiesToBeDestroyed.get(token); if (destroyItem != null) { if (transaction.getLifecycleStateRequest() == destroyItem) { // It is going to execute the transaction that will destroy activity with the // token, so the corresponding to-be-destroyed record can be removed. activitiesToBeDestroyed.remove(token); } if (mTransactionHandler.getActivityClient(token) == null) { // The activity has not been created but has been requested to destroy, so all // transactions for the token are just like being cancelled. Slog.w(TAG, tId(transaction) + "Skip pre-destroyed transaction:\n" + transactionToString(transaction, mTransactionHandler)); return; } } if (DEBUG_RESOLVER) { Slog.d(TAG, tId(transaction) + "Start resolving transaction"); Slog.d(TAG, transactionToString(transaction, mTransactionHandler)); } if (DEBUG_RESOLVER) Slog.d(TAG, transactionToString(transaction, mTransactionHandler)); executeCallbacks(transaction); executeLifecycleState(transaction); mPendingActions.clear(); if (DEBUG_RESOLVER) Slog.d(TAG, tId(transaction) + "End resolving transaction"); } Loading Loading @@ -135,6 +114,14 @@ public class TransactionExecutor { final IBinder token = item.getActivityToken(); ActivityClientRecord r = mTransactionHandler.getActivityClient(token); if (token != null && r == null && mTransactionHandler.getActivitiesToBeDestroyed().containsKey(token)) { // The activity has not been created but has been requested to destroy, so all // transactions for the token are just like being cancelled. Slog.w(TAG, "Skip pre-destroyed transaction item:\n" + item); continue; } if (DEBUG_RESOLVER) Slog.d(TAG, tId(transaction) + "Resolving callback: " + item); final int postExecutionState = item.getPostExecutionState(); Loading Loading @@ -211,6 +198,10 @@ public class TransactionExecutor { } if (r == null) { if (mTransactionHandler.getActivitiesToBeDestroyed().get(token) == lifecycleItem) { // Always cleanup for destroy item. lifecycleItem.postExecute(mTransactionHandler, mPendingActions); } // Ignore requests for non-existent client records for now. return; } Loading Loading
core/java/android/app/ActivityThread.java +4 −4 Original line number Diff line number Diff line Loading @@ -62,7 +62,7 @@ import android.app.servertransaction.ActivityLifecycleItem.LifecycleState; import android.app.servertransaction.ActivityRelaunchItem; import android.app.servertransaction.ActivityResultItem; import android.app.servertransaction.ClientTransaction; import android.app.servertransaction.ClientTransactionItem; import android.app.servertransaction.DestroyActivityItem; import android.app.servertransaction.PauseActivityItem; import android.app.servertransaction.PendingTransactionActions; import android.app.servertransaction.PendingTransactionActions.StopInfo; Loading Loading @@ -375,8 +375,8 @@ public final class ActivityThread extends ClientTransactionHandler @GuardedBy("mPendingOverrideConfigs") private final ArrayMap<IBinder, Configuration> mPendingOverrideConfigs = new ArrayMap<>(); /** The activities to be truly destroyed (not include relaunch). */ final Map<IBinder, ClientTransactionItem> mActivitiesToBeDestroyed = Collections.synchronizedMap(new ArrayMap<IBinder, ClientTransactionItem>()); final Map<IBinder, DestroyActivityItem> mActivitiesToBeDestroyed = Collections.synchronizedMap(new ArrayMap<>()); // List of new activities that should be reported when next we idle. final ArrayList<ActivityClientRecord> mNewActivities = new ArrayList<>(); // Number of activities that are currently visible on-screen. Loading Loading @@ -5799,7 +5799,7 @@ public final class ActivityThread extends ClientTransactionHandler } @Override public Map<IBinder, ClientTransactionItem> getActivitiesToBeDestroyed() { public Map<IBinder, DestroyActivityItem> getActivitiesToBeDestroyed() { return mActivitiesToBeDestroyed; } Loading
core/java/android/app/ClientTransactionHandler.java +2 −2 Original line number Diff line number Diff line Loading @@ -19,7 +19,7 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.app.ActivityThread.ActivityClientRecord; import android.app.servertransaction.ClientTransaction; import android.app.servertransaction.ClientTransactionItem; import android.app.servertransaction.DestroyActivityItem; import android.app.servertransaction.PendingTransactionActions; import android.app.servertransaction.TransactionExecutor; import android.content.Context; Loading Loading @@ -108,7 +108,7 @@ public abstract class ClientTransactionHandler { // and deliver callbacks. /** Get activity and its corresponding transaction item which are going to destroy. */ public abstract Map<IBinder, ClientTransactionItem> getActivitiesToBeDestroyed(); public abstract Map<IBinder, DestroyActivityItem> getActivitiesToBeDestroyed(); /** Destroy the activity. */ public abstract void handleDestroyActivity(@NonNull ActivityClientRecord r, boolean finishing, Loading
core/java/android/app/servertransaction/ClientTransaction.java +0 −18 Original line number Diff line number Diff line Loading @@ -23,7 +23,6 @@ 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 @@ -83,23 +82,6 @@ public class ClientTransaction implements Parcelable, ObjectPoolItem { return mActivityCallbacks; } /** Get the target activity. */ @Nullable @UnsupportedAppUsage public IBinder getActivityToken() { // TODO(b/260873529): remove after we allow multiple activity items in one transaction. if (mLifecycleStateRequest != null) { return mLifecycleStateRequest.getActivityToken(); } for (int i = mActivityCallbacks.size() - 1; i >= 0; i--) { final IBinder token = mActivityCallbacks.get(i).getActivityToken(); if (token != null) { return token; } } return null; } /** Get the target state lifecycle request. */ @VisibleForTesting(visibility = PACKAGE) @UnsupportedAppUsage Loading
core/java/android/app/servertransaction/DestroyActivityItem.java +7 −0 Original line number Diff line number Diff line Loading @@ -49,6 +49,13 @@ public class DestroyActivityItem extends ActivityLifecycleItem { Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER); } @Override public void postExecute(@NonNull ClientTransactionHandler client, @NonNull PendingTransactionActions pendingActions) { // Cleanup after execution. client.getActivitiesToBeDestroyed().remove(getActivityToken()); } @Override public int getTargetState() { return ON_DESTROY; Loading
core/java/android/app/servertransaction/TransactionExecutor.java +16 −25 Original line number Diff line number Diff line Loading @@ -47,7 +47,6 @@ import android.util.Slog; import com.android.internal.annotations.VisibleForTesting; import java.util.List; import java.util.Map; /** * Class that manages transaction execution in the correct order. Loading Loading @@ -75,34 +74,14 @@ public class TransactionExecutor { * either remain in the initial state, or last state needed by a callback. */ public void execute(@NonNull ClientTransaction transaction) { if (DEBUG_RESOLVER) Slog.d(TAG, tId(transaction) + "Start resolving transaction"); final IBinder token = transaction.getActivityToken(); if (token != null) { final Map<IBinder, ClientTransactionItem> activitiesToBeDestroyed = mTransactionHandler.getActivitiesToBeDestroyed(); final ClientTransactionItem destroyItem = activitiesToBeDestroyed.get(token); if (destroyItem != null) { if (transaction.getLifecycleStateRequest() == destroyItem) { // It is going to execute the transaction that will destroy activity with the // token, so the corresponding to-be-destroyed record can be removed. activitiesToBeDestroyed.remove(token); } if (mTransactionHandler.getActivityClient(token) == null) { // The activity has not been created but has been requested to destroy, so all // transactions for the token are just like being cancelled. Slog.w(TAG, tId(transaction) + "Skip pre-destroyed transaction:\n" + transactionToString(transaction, mTransactionHandler)); return; } } if (DEBUG_RESOLVER) { Slog.d(TAG, tId(transaction) + "Start resolving transaction"); Slog.d(TAG, transactionToString(transaction, mTransactionHandler)); } if (DEBUG_RESOLVER) Slog.d(TAG, transactionToString(transaction, mTransactionHandler)); executeCallbacks(transaction); executeLifecycleState(transaction); mPendingActions.clear(); if (DEBUG_RESOLVER) Slog.d(TAG, tId(transaction) + "End resolving transaction"); } Loading Loading @@ -135,6 +114,14 @@ public class TransactionExecutor { final IBinder token = item.getActivityToken(); ActivityClientRecord r = mTransactionHandler.getActivityClient(token); if (token != null && r == null && mTransactionHandler.getActivitiesToBeDestroyed().containsKey(token)) { // The activity has not been created but has been requested to destroy, so all // transactions for the token are just like being cancelled. Slog.w(TAG, "Skip pre-destroyed transaction item:\n" + item); continue; } if (DEBUG_RESOLVER) Slog.d(TAG, tId(transaction) + "Resolving callback: " + item); final int postExecutionState = item.getPostExecutionState(); Loading Loading @@ -211,6 +198,10 @@ public class TransactionExecutor { } if (r == null) { if (mTransactionHandler.getActivitiesToBeDestroyed().get(token) == lifecycleItem) { // Always cleanup for destroy item. lifecycleItem.postExecute(mTransactionHandler, mPendingActions); } // Ignore requests for non-existent client records for now. return; } Loading