Loading core/java/android/app/ClientTransactionHandler.java +15 −3 Original line number Diff line number Diff line Loading @@ -42,6 +42,8 @@ import java.util.Map; */ public abstract class ClientTransactionHandler { private boolean mIsExecutingLocalTransaction; // Schedule phase related logic and handlers. /** Prepare and schedule transaction for execution. */ Loading @@ -56,10 +58,20 @@ public abstract class ClientTransactionHandler { */ @VisibleForTesting public void executeTransaction(ClientTransaction transaction) { mIsExecutingLocalTransaction = true; try { transaction.preExecute(this); getTransactionExecutor().execute(transaction); } finally { mIsExecutingLocalTransaction = false; transaction.recycle(); } } /** Returns {@code true} if the current executing ClientTransaction is from local request. */ public boolean isExecutingLocalTransaction() { return mIsExecutingLocalTransaction; } /** * Get the {@link TransactionExecutor} that will be performing lifecycle transitions and Loading core/java/android/app/servertransaction/ActivityRelaunchItem.java +4 −1 Original line number Diff line number Diff line Loading @@ -57,7 +57,10 @@ public class ActivityRelaunchItem extends ActivityTransactionItem { @Override public void preExecute(ClientTransactionHandler client, IBinder token) { // The local config is already scaled so only apply if this item is from server side. if (!client.isExecutingLocalTransaction()) { CompatibilityInfo.applyOverrideScaleIfNeeded(mConfig); } mActivityClientRecord = client.prepareRelaunchActivity(token, mPendingResults, mPendingNewIntents, mConfigChanges, mConfig, mPreserveWindow); } Loading core/tests/coretests/src/android/app/activity/ActivityThreadTest.java +14 −0 Original line number Diff line number Diff line Loading @@ -228,6 +228,20 @@ public class ActivityThreadTest { InstrumentationRegistry.getInstrumentation().waitForIdleSync(); assertScreenScale(scale, activity, originalActivityConfig, originalActivityMetrics); // Execute a local relaunch item with current scaled config (e.g. simulate recreate), // the config should not be scaled again. final Configuration currentConfig = activity.getResources().getConfiguration(); final ClientTransaction localTransaction = newTransaction(activityThread, activity.getActivityToken()); localTransaction.addCallback(ActivityRelaunchItem.obtain( null /* pendingResults */, null /* pendingIntents */, 0 /* configChanges */, new MergedConfiguration(currentConfig, currentConfig), true /* preserveWindow */)); InstrumentationRegistry.getInstrumentation().runOnMainSync( () -> activityThread.executeTransaction(localTransaction)); assertScreenScale(scale, activity, originalActivityConfig, originalActivityMetrics); } finally { CompatibilityInfo.setOverrideInvertedScale(originalScale); InstrumentationRegistry.getInstrumentation().runOnMainSync( Loading Loading
core/java/android/app/ClientTransactionHandler.java +15 −3 Original line number Diff line number Diff line Loading @@ -42,6 +42,8 @@ import java.util.Map; */ public abstract class ClientTransactionHandler { private boolean mIsExecutingLocalTransaction; // Schedule phase related logic and handlers. /** Prepare and schedule transaction for execution. */ Loading @@ -56,10 +58,20 @@ public abstract class ClientTransactionHandler { */ @VisibleForTesting public void executeTransaction(ClientTransaction transaction) { mIsExecutingLocalTransaction = true; try { transaction.preExecute(this); getTransactionExecutor().execute(transaction); } finally { mIsExecutingLocalTransaction = false; transaction.recycle(); } } /** Returns {@code true} if the current executing ClientTransaction is from local request. */ public boolean isExecutingLocalTransaction() { return mIsExecutingLocalTransaction; } /** * Get the {@link TransactionExecutor} that will be performing lifecycle transitions and Loading
core/java/android/app/servertransaction/ActivityRelaunchItem.java +4 −1 Original line number Diff line number Diff line Loading @@ -57,7 +57,10 @@ public class ActivityRelaunchItem extends ActivityTransactionItem { @Override public void preExecute(ClientTransactionHandler client, IBinder token) { // The local config is already scaled so only apply if this item is from server side. if (!client.isExecutingLocalTransaction()) { CompatibilityInfo.applyOverrideScaleIfNeeded(mConfig); } mActivityClientRecord = client.prepareRelaunchActivity(token, mPendingResults, mPendingNewIntents, mConfigChanges, mConfig, mPreserveWindow); } Loading
core/tests/coretests/src/android/app/activity/ActivityThreadTest.java +14 −0 Original line number Diff line number Diff line Loading @@ -228,6 +228,20 @@ public class ActivityThreadTest { InstrumentationRegistry.getInstrumentation().waitForIdleSync(); assertScreenScale(scale, activity, originalActivityConfig, originalActivityMetrics); // Execute a local relaunch item with current scaled config (e.g. simulate recreate), // the config should not be scaled again. final Configuration currentConfig = activity.getResources().getConfiguration(); final ClientTransaction localTransaction = newTransaction(activityThread, activity.getActivityToken()); localTransaction.addCallback(ActivityRelaunchItem.obtain( null /* pendingResults */, null /* pendingIntents */, 0 /* configChanges */, new MergedConfiguration(currentConfig, currentConfig), true /* preserveWindow */)); InstrumentationRegistry.getInstrumentation().runOnMainSync( () -> activityThread.executeTransaction(localTransaction)); assertScreenScale(scale, activity, originalActivityConfig, originalActivityMetrics); } finally { CompatibilityInfo.setOverrideInvertedScale(originalScale); InstrumentationRegistry.getInstrumentation().runOnMainSync( Loading