Loading core/java/android/app/servertransaction/ActivityRelaunchItem.java +7 −0 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import android.annotation.Nullable; import android.app.ActivityThread.ActivityClientRecord; import android.app.ClientTransactionHandler; import android.app.ResultInfo; import android.content.Context; import android.content.res.CompatibilityInfo; import android.os.IBinder; import android.os.Parcel; Loading Loading @@ -85,6 +86,12 @@ public class ActivityRelaunchItem extends ActivityTransactionItem { client.reportRelaunch(r); } @Nullable @Override public Context getContextToUpdate(@NonNull ClientTransactionHandler client) { return client.getActivity(getActivityToken()); } // ObjectPoolItem implementation private ActivityRelaunchItem() {} Loading core/java/android/app/servertransaction/LaunchActivityItem.java +9 −0 Original line number Diff line number Diff line Loading @@ -24,12 +24,14 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.app.ActivityClient; import android.app.ActivityOptions; import android.app.ActivityThread; import android.app.ActivityThread.ActivityClientRecord; import android.app.ClientTransactionHandler; import android.app.IActivityClientController; import android.app.ProfilerInfo; import android.app.ResultInfo; import android.compat.annotation.UnsupportedAppUsage; import android.content.Context; import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.res.CompatibilityInfo; Loading Loading @@ -115,6 +117,13 @@ public class LaunchActivityItem extends ClientTransactionItem { client.countLaunchingActivities(-1); } @Nullable @Override public Context getContextToUpdate(@NonNull ClientTransactionHandler client) { // LaunchActivityItem may update the global config with #mCurConfig. return ActivityThread.currentApplication(); } // ObjectPoolItem implementation private LaunchActivityItem() {} Loading core/java/android/app/servertransaction/MoveToDisplayItem.java +7 −0 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.app.ActivityThread.ActivityClientRecord; import android.app.ClientTransactionHandler; import android.content.Context; import android.content.res.CompatibilityInfo; import android.content.res.Configuration; import android.os.IBinder; Loading Loading @@ -55,6 +56,12 @@ public class MoveToDisplayItem extends ActivityTransactionItem { Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER); } @Nullable @Override public Context getContextToUpdate(@NonNull ClientTransactionHandler client) { return client.getActivity(getActivityToken()); } // ObjectPoolItem implementation private MoveToDisplayItem() {} Loading core/java/android/app/servertransaction/TransactionExecutor.java +46 −25 Original line number Diff line number Diff line Loading @@ -41,6 +41,7 @@ import android.content.Context; import android.content.res.Configuration; import android.os.IBinder; import android.os.Process; import android.util.ArrayMap; import android.util.ArraySet; import android.util.IntArray; import android.util.Slog; Loading @@ -62,8 +63,11 @@ public class TransactionExecutor { private final PendingTransactionActions mPendingActions = new PendingTransactionActions(); private final TransactionExecutorHelper mHelper = new TransactionExecutorHelper(); /** Keeps track of display ids whose Configuration got updated within a transaction. */ private final ArraySet<Integer> mConfigUpdatedDisplayIds = new ArraySet<>(); /** * Keeps track of the Context whose Configuration got updated within a transaction, mapping to * the config before the transaction. */ private final ArrayMap<Context, Configuration> mContextToPreChangedConfigMap = new ArrayMap<>(); /** Initialize an instance with transaction handler, that will execute all requested actions. */ public TransactionExecutor(@NonNull ClientTransactionHandler clientTransactionHandler) { Loading Loading @@ -91,16 +95,35 @@ public class TransactionExecutor { executeLifecycleState(transaction); } if (!mConfigUpdatedDisplayIds.isEmpty()) { if (!mContextToPreChangedConfigMap.isEmpty()) { // Whether this transaction should trigger DisplayListener#onDisplayChanged. try { // Calculate display ids that have config changed. final ArraySet<Integer> configUpdatedDisplayIds = new ArraySet<>(); final int contextCount = mContextToPreChangedConfigMap.size(); for (int i = 0; i < contextCount; i++) { final Context context = mContextToPreChangedConfigMap.keyAt(i); final Configuration preTransactionConfig = mContextToPreChangedConfigMap.valueAt(i); final Configuration postTransactionConfig = context.getResources() .getConfiguration(); if (!areConfigurationsEqualForDisplay( postTransactionConfig, preTransactionConfig)) { configUpdatedDisplayIds.add(context.getDisplayId()); } } // Dispatch the display changed callbacks. final ClientTransactionListenerController controller = ClientTransactionListenerController.getInstance(); final int displayCount = mConfigUpdatedDisplayIds.size(); final int displayCount = configUpdatedDisplayIds.size(); for (int i = 0; i < displayCount; i++) { final int displayId = mConfigUpdatedDisplayIds.valueAt(i); final int displayId = configUpdatedDisplayIds.valueAt(i); controller.onDisplayChanged(displayId); } mConfigUpdatedDisplayIds.clear(); } finally { mContextToPreChangedConfigMap.clear(); } } mPendingActions.clear(); Loading Loading @@ -182,26 +205,24 @@ public class TransactionExecutor { } } final boolean shouldTrackConfigUpdatedContext = // No configuration change for local transaction. !mTransactionHandler.isExecutingLocalTransaction() // Can't read flag from isolated process. final boolean isBundleClientTransactionFlagEnabled = !Process.isIsolated() && !Process.isIsolated() && bundleClientTransactionFlag(); final Context configUpdatedContext = isBundleClientTransactionFlagEnabled final Context configUpdatedContext = shouldTrackConfigUpdatedContext ? item.getContextToUpdate(mTransactionHandler) : null; final Configuration preExecutedConfig = configUpdatedContext != null ? new Configuration(configUpdatedContext.getResources().getConfiguration()) : null; if (configUpdatedContext != null && !mContextToPreChangedConfigMap.containsKey(configUpdatedContext)) { // Keep track of the first pre-executed config of each changed Context. mContextToPreChangedConfigMap.put(configUpdatedContext, new Configuration(configUpdatedContext.getResources().getConfiguration())); } item.execute(mTransactionHandler, mPendingActions); if (configUpdatedContext != null) { final Configuration postExecutedConfig = configUpdatedContext.getResources() .getConfiguration(); if (!areConfigurationsEqualForDisplay(postExecutedConfig, preExecutedConfig)) { mConfigUpdatedDisplayIds.add(configUpdatedContext.getDisplayId()); } } item.postExecute(mTransactionHandler, mPendingActions); if (r == null) { // Launch activity request will create an activity record. Loading core/java/android/app/servertransaction/WindowStateResizeItem.java +9 −0 Original line number Diff line number Diff line Loading @@ -22,7 +22,9 @@ import static java.util.Objects.requireNonNull; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.ActivityThread; import android.app.ClientTransactionHandler; import android.content.Context; import android.os.Parcel; import android.os.RemoteException; import android.os.Trace; Loading Loading @@ -68,6 +70,13 @@ public class WindowStateResizeItem extends ClientTransactionItem { Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER); } @Nullable @Override public Context getContextToUpdate(@NonNull ClientTransactionHandler client) { // WindowStateResizeItem may update the global config with #mConfiguration. return ActivityThread.currentApplication(); } // ObjectPoolItem implementation private WindowStateResizeItem() {} Loading Loading
core/java/android/app/servertransaction/ActivityRelaunchItem.java +7 −0 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import android.annotation.Nullable; import android.app.ActivityThread.ActivityClientRecord; import android.app.ClientTransactionHandler; import android.app.ResultInfo; import android.content.Context; import android.content.res.CompatibilityInfo; import android.os.IBinder; import android.os.Parcel; Loading Loading @@ -85,6 +86,12 @@ public class ActivityRelaunchItem extends ActivityTransactionItem { client.reportRelaunch(r); } @Nullable @Override public Context getContextToUpdate(@NonNull ClientTransactionHandler client) { return client.getActivity(getActivityToken()); } // ObjectPoolItem implementation private ActivityRelaunchItem() {} Loading
core/java/android/app/servertransaction/LaunchActivityItem.java +9 −0 Original line number Diff line number Diff line Loading @@ -24,12 +24,14 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.app.ActivityClient; import android.app.ActivityOptions; import android.app.ActivityThread; import android.app.ActivityThread.ActivityClientRecord; import android.app.ClientTransactionHandler; import android.app.IActivityClientController; import android.app.ProfilerInfo; import android.app.ResultInfo; import android.compat.annotation.UnsupportedAppUsage; import android.content.Context; import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.res.CompatibilityInfo; Loading Loading @@ -115,6 +117,13 @@ public class LaunchActivityItem extends ClientTransactionItem { client.countLaunchingActivities(-1); } @Nullable @Override public Context getContextToUpdate(@NonNull ClientTransactionHandler client) { // LaunchActivityItem may update the global config with #mCurConfig. return ActivityThread.currentApplication(); } // ObjectPoolItem implementation private LaunchActivityItem() {} Loading
core/java/android/app/servertransaction/MoveToDisplayItem.java +7 −0 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.app.ActivityThread.ActivityClientRecord; import android.app.ClientTransactionHandler; import android.content.Context; import android.content.res.CompatibilityInfo; import android.content.res.Configuration; import android.os.IBinder; Loading Loading @@ -55,6 +56,12 @@ public class MoveToDisplayItem extends ActivityTransactionItem { Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER); } @Nullable @Override public Context getContextToUpdate(@NonNull ClientTransactionHandler client) { return client.getActivity(getActivityToken()); } // ObjectPoolItem implementation private MoveToDisplayItem() {} Loading
core/java/android/app/servertransaction/TransactionExecutor.java +46 −25 Original line number Diff line number Diff line Loading @@ -41,6 +41,7 @@ import android.content.Context; import android.content.res.Configuration; import android.os.IBinder; import android.os.Process; import android.util.ArrayMap; import android.util.ArraySet; import android.util.IntArray; import android.util.Slog; Loading @@ -62,8 +63,11 @@ public class TransactionExecutor { private final PendingTransactionActions mPendingActions = new PendingTransactionActions(); private final TransactionExecutorHelper mHelper = new TransactionExecutorHelper(); /** Keeps track of display ids whose Configuration got updated within a transaction. */ private final ArraySet<Integer> mConfigUpdatedDisplayIds = new ArraySet<>(); /** * Keeps track of the Context whose Configuration got updated within a transaction, mapping to * the config before the transaction. */ private final ArrayMap<Context, Configuration> mContextToPreChangedConfigMap = new ArrayMap<>(); /** Initialize an instance with transaction handler, that will execute all requested actions. */ public TransactionExecutor(@NonNull ClientTransactionHandler clientTransactionHandler) { Loading Loading @@ -91,16 +95,35 @@ public class TransactionExecutor { executeLifecycleState(transaction); } if (!mConfigUpdatedDisplayIds.isEmpty()) { if (!mContextToPreChangedConfigMap.isEmpty()) { // Whether this transaction should trigger DisplayListener#onDisplayChanged. try { // Calculate display ids that have config changed. final ArraySet<Integer> configUpdatedDisplayIds = new ArraySet<>(); final int contextCount = mContextToPreChangedConfigMap.size(); for (int i = 0; i < contextCount; i++) { final Context context = mContextToPreChangedConfigMap.keyAt(i); final Configuration preTransactionConfig = mContextToPreChangedConfigMap.valueAt(i); final Configuration postTransactionConfig = context.getResources() .getConfiguration(); if (!areConfigurationsEqualForDisplay( postTransactionConfig, preTransactionConfig)) { configUpdatedDisplayIds.add(context.getDisplayId()); } } // Dispatch the display changed callbacks. final ClientTransactionListenerController controller = ClientTransactionListenerController.getInstance(); final int displayCount = mConfigUpdatedDisplayIds.size(); final int displayCount = configUpdatedDisplayIds.size(); for (int i = 0; i < displayCount; i++) { final int displayId = mConfigUpdatedDisplayIds.valueAt(i); final int displayId = configUpdatedDisplayIds.valueAt(i); controller.onDisplayChanged(displayId); } mConfigUpdatedDisplayIds.clear(); } finally { mContextToPreChangedConfigMap.clear(); } } mPendingActions.clear(); Loading Loading @@ -182,26 +205,24 @@ public class TransactionExecutor { } } final boolean shouldTrackConfigUpdatedContext = // No configuration change for local transaction. !mTransactionHandler.isExecutingLocalTransaction() // Can't read flag from isolated process. final boolean isBundleClientTransactionFlagEnabled = !Process.isIsolated() && !Process.isIsolated() && bundleClientTransactionFlag(); final Context configUpdatedContext = isBundleClientTransactionFlagEnabled final Context configUpdatedContext = shouldTrackConfigUpdatedContext ? item.getContextToUpdate(mTransactionHandler) : null; final Configuration preExecutedConfig = configUpdatedContext != null ? new Configuration(configUpdatedContext.getResources().getConfiguration()) : null; if (configUpdatedContext != null && !mContextToPreChangedConfigMap.containsKey(configUpdatedContext)) { // Keep track of the first pre-executed config of each changed Context. mContextToPreChangedConfigMap.put(configUpdatedContext, new Configuration(configUpdatedContext.getResources().getConfiguration())); } item.execute(mTransactionHandler, mPendingActions); if (configUpdatedContext != null) { final Configuration postExecutedConfig = configUpdatedContext.getResources() .getConfiguration(); if (!areConfigurationsEqualForDisplay(postExecutedConfig, preExecutedConfig)) { mConfigUpdatedDisplayIds.add(configUpdatedContext.getDisplayId()); } } item.postExecute(mTransactionHandler, mPendingActions); if (r == null) { // Launch activity request will create an activity record. Loading
core/java/android/app/servertransaction/WindowStateResizeItem.java +9 −0 Original line number Diff line number Diff line Loading @@ -22,7 +22,9 @@ import static java.util.Objects.requireNonNull; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.ActivityThread; import android.app.ClientTransactionHandler; import android.content.Context; import android.os.Parcel; import android.os.RemoteException; import android.os.Trace; Loading Loading @@ -68,6 +70,13 @@ public class WindowStateResizeItem extends ClientTransactionItem { Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER); } @Nullable @Override public Context getContextToUpdate(@NonNull ClientTransactionHandler client) { // WindowStateResizeItem may update the global config with #mConfiguration. return ActivityThread.currentApplication(); } // ObjectPoolItem implementation private WindowStateResizeItem() {} Loading