diff options
7 files changed, 40 insertions, 23 deletions
diff --git a/core/java/android/app/servertransaction/ActivityConfigurationChangeItem.java b/core/java/android/app/servertransaction/ActivityConfigurationChangeItem.java index 48ea846e8d50..631772556879 100644 --- a/core/java/android/app/servertransaction/ActivityConfigurationChangeItem.java +++ b/core/java/android/app/servertransaction/ActivityConfigurationChangeItem.java @@ -40,6 +40,7 @@ import java.util.Objects; public class ActivityConfigurationChangeItem extends ActivityTransactionItem { private Configuration mConfiguration; + private ActivityWindowInfo mActivityWindowInfo; @Override public void preExecute(@NonNull ClientTransactionHandler client) { @@ -55,8 +56,7 @@ public class ActivityConfigurationChangeItem extends ActivityTransactionItem { // TODO(lifecycler): detect if PIP or multi-window mode changed and report it here. Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "activityConfigChanged"); client.handleActivityConfigurationChanged(r, mConfiguration, INVALID_DISPLAY, - // TODO(b/287582673): add ActivityWindowInfo - new ActivityWindowInfo()); + mActivityWindowInfo); Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER); } @@ -73,7 +73,7 @@ public class ActivityConfigurationChangeItem extends ActivityTransactionItem { /** Obtain an instance initialized with provided params. */ @NonNull public static ActivityConfigurationChangeItem obtain(@NonNull IBinder activityToken, - @NonNull Configuration config) { + @NonNull Configuration config, @NonNull ActivityWindowInfo activityWindowInfo) { ActivityConfigurationChangeItem instance = ObjectPool.obtain(ActivityConfigurationChangeItem.class); if (instance == null) { @@ -81,6 +81,7 @@ public class ActivityConfigurationChangeItem extends ActivityTransactionItem { } instance.setActivityToken(activityToken); instance.mConfiguration = new Configuration(config); + instance.mActivityWindowInfo = new ActivityWindowInfo(activityWindowInfo); return instance; } @@ -89,6 +90,7 @@ public class ActivityConfigurationChangeItem extends ActivityTransactionItem { public void recycle() { super.recycle(); mConfiguration = null; + mActivityWindowInfo = null; ObjectPool.recycle(this); } @@ -100,12 +102,14 @@ public class ActivityConfigurationChangeItem extends ActivityTransactionItem { public void writeToParcel(@NonNull Parcel dest, int flags) { super.writeToParcel(dest, flags); dest.writeTypedObject(mConfiguration, flags); + dest.writeTypedObject(mActivityWindowInfo, flags); } /** Read from Parcel. */ private ActivityConfigurationChangeItem(@NonNull Parcel in) { super(in); mConfiguration = in.readTypedObject(Configuration.CREATOR); + mActivityWindowInfo = in.readTypedObject(ActivityWindowInfo.CREATOR); } public static final @NonNull Creator<ActivityConfigurationChangeItem> CREATOR = @@ -128,7 +132,8 @@ public class ActivityConfigurationChangeItem extends ActivityTransactionItem { return false; } final ActivityConfigurationChangeItem other = (ActivityConfigurationChangeItem) o; - return Objects.equals(mConfiguration, other.mConfiguration); + return Objects.equals(mConfiguration, other.mConfiguration) + && Objects.equals(mActivityWindowInfo, other.mActivityWindowInfo); } @Override @@ -136,12 +141,14 @@ public class ActivityConfigurationChangeItem extends ActivityTransactionItem { int result = 17; result = 31 * result + super.hashCode(); result = 31 * result + Objects.hashCode(mConfiguration); + result = 31 * result + Objects.hashCode(mActivityWindowInfo); return result; } @Override public String toString() { return "ActivityConfigurationChange{" + super.toString() - + ",config=" + mConfiguration + "}"; + + ",config=" + mConfiguration + + ",activityWindowInfo=" + mActivityWindowInfo + "}"; } } diff --git a/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java b/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java index 64c17bdfa731..d115bf306b45 100644 --- a/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java +++ b/core/tests/coretests/src/android/app/activity/ActivityThreadTest.java @@ -247,7 +247,7 @@ public class ActivityThreadTest { newConfig.smallestScreenWidthDp++; transaction = newTransaction(activityThread); transaction.addTransactionItem(ActivityConfigurationChangeItem.obtain( - activity.getActivityToken(), newConfig)); + activity.getActivityToken(), newConfig, new ActivityWindowInfo())); appThread.scheduleTransaction(transaction); InstrumentationRegistry.getInstrumentation().waitForIdleSync(); @@ -455,11 +455,11 @@ public class ActivityThreadTest { transaction = newTransaction(activityThread); transaction.addTransactionItem(ActivityConfigurationChangeItem.obtain( - activity.getActivityToken(), activityConfigLandscape)); + activity.getActivityToken(), activityConfigLandscape, new ActivityWindowInfo())); transaction.addTransactionItem(ConfigurationChangeItem.obtain( processConfigPortrait, DEVICE_ID_INVALID)); transaction.addTransactionItem(ActivityConfigurationChangeItem.obtain( - activity.getActivityToken(), activityConfigPortrait)); + activity.getActivityToken(), activityConfigPortrait, new ActivityWindowInfo())); appThread.scheduleTransaction(transaction); activity.mTestLatch.await(TIMEOUT_SEC, TimeUnit.SECONDS); @@ -883,7 +883,7 @@ public class ActivityThreadTest { private static ClientTransaction newActivityConfigTransaction(@NonNull Activity activity, @NonNull Configuration config) { final ActivityConfigurationChangeItem item = ActivityConfigurationChangeItem.obtain( - activity.getActivityToken(), config); + activity.getActivityToken(), config, new ActivityWindowInfo()); final ClientTransaction transaction = newTransaction(activity); transaction.addTransactionItem(item); diff --git a/core/tests/coretests/src/android/app/servertransaction/ClientTransactionItemTest.java b/core/tests/coretests/src/android/app/servertransaction/ClientTransactionItemTest.java index 85a1b4ee3ebd..4db5d1bf4f67 100644 --- a/core/tests/coretests/src/android/app/servertransaction/ClientTransactionItemTest.java +++ b/core/tests/coretests/src/android/app/servertransaction/ClientTransactionItemTest.java @@ -107,7 +107,7 @@ public class ClientTransactionItemTest { @Test public void testActivityConfigurationChangeItem_getContextToUpdate() { final ActivityConfigurationChangeItem item = ActivityConfigurationChangeItem - .obtain(mActivityToken, mConfiguration); + .obtain(mActivityToken, mConfiguration, new ActivityWindowInfo()); final Context context = item.getContextToUpdate(mHandler); assertEquals(mActivity, context); diff --git a/core/tests/coretests/src/android/app/servertransaction/ObjectPoolTests.java b/core/tests/coretests/src/android/app/servertransaction/ObjectPoolTests.java index 906558f7603b..31ea6759c710 100644 --- a/core/tests/coretests/src/android/app/servertransaction/ObjectPoolTests.java +++ b/core/tests/coretests/src/android/app/servertransaction/ObjectPoolTests.java @@ -82,7 +82,8 @@ public class ObjectPoolTests { @Test public void testRecycleActivityConfigurationChangeItem() { - testRecycle(() -> ActivityConfigurationChangeItem.obtain(mActivityToken, config())); + testRecycle(() -> ActivityConfigurationChangeItem.obtain(mActivityToken, config(), + new ActivityWindowInfo())); } @Test diff --git a/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java b/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java index dbb090fe795b..75347bf2c8de 100644 --- a/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java +++ b/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java @@ -95,8 +95,11 @@ public class TransactionParcelTests { @Test public void testActivityConfigChange() { // Write to parcel + final ActivityWindowInfo activityWindowInfo = new ActivityWindowInfo(); + activityWindowInfo.set(true /* isEmbedded */, new Rect(0, 0, 500, 1000), + new Rect(0, 0, 500, 500)); ActivityConfigurationChangeItem item = ActivityConfigurationChangeItem.obtain( - mActivityToken, config()); + mActivityToken, config(), activityWindowInfo); writeAndPrepareForReading(item); // Read from parcel and assert @@ -300,7 +303,7 @@ public class TransactionParcelTests { // Write to parcel NewIntentItem callback1 = NewIntentItem.obtain(mActivityToken, new ArrayList<>(), true); ActivityConfigurationChangeItem callback2 = ActivityConfigurationChangeItem.obtain( - mActivityToken, config()); + mActivityToken, config(), new ActivityWindowInfo()); StopActivityItem lifecycleRequest = StopActivityItem.obtain(mActivityToken, 78 /* configChanges */); @@ -327,7 +330,7 @@ public class TransactionParcelTests { // Write to parcel NewIntentItem callback1 = NewIntentItem.obtain(mActivityToken, new ArrayList<>(), true); ActivityConfigurationChangeItem callback2 = ActivityConfigurationChangeItem.obtain( - mActivityToken, config()); + mActivityToken, config(), new ActivityWindowInfo()); ClientTransaction transaction = ClientTransaction.obtain(null /* client */); transaction.addTransactionItem(callback1); diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index 90cff3950047..92fde18233a9 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -1476,7 +1476,8 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A } } - private void scheduleConfigurationChanged(Configuration config) { + private void scheduleConfigurationChanged(@NonNull Configuration config, + @NonNull ActivityWindowInfo activityWindowInfo) { if (!attachedToProcess()) { ProtoLog.w(WM_DEBUG_CONFIGURATION, "Can't report activity configuration " + "update - client not running, activityRecord=%s", this); @@ -1487,7 +1488,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A + "config: %s", this, config); mAtmService.getLifecycleManager().scheduleTransactionItem(app.getThread(), - ActivityConfigurationChangeItem.obtain(token, config)); + ActivityConfigurationChangeItem.obtain(token, config, activityWindowInfo)); } catch (RemoteException e) { // If process died, whatever. } @@ -9785,7 +9786,11 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // configurations because there are cases (like moving a task to the root pinned task) where // the combine configurations are equal, but would otherwise differ in the override config mTmpConfig.setTo(mLastReportedConfiguration.getMergedConfiguration()); - if (getConfiguration().equals(mTmpConfig) && !displayChanged) { + final ActivityWindowInfo newActivityWindowInfo = getActivityWindowInfo(); + final boolean isActivityWindowInfoChanged = Flags.activityWindowInfoFlag() + && !mLastReportedActivityWindowInfo.equals(newActivityWindowInfo); + if (!displayChanged && !isActivityWindowInfoChanged + && getConfiguration().equals(mTmpConfig)) { ProtoLog.v(WM_DEBUG_CONFIGURATION, "Configuration & display " + "unchanged in %s", this); return true; @@ -9800,7 +9805,6 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // Update last reported values. final Configuration newMergedOverrideConfig = getMergedOverrideConfiguration(); - final ActivityWindowInfo newActivityWindowInfo = getActivityWindowInfo(); setLastReportedConfiguration(getProcessGlobalConfiguration(), newMergedOverrideConfig); setLastReportedActivityWindowInfo(newActivityWindowInfo); @@ -9823,7 +9827,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A scheduleActivityMovedToDisplay(newDisplayId, newMergedOverrideConfig, newActivityWindowInfo); } else { - scheduleConfigurationChanged(newMergedOverrideConfig); + scheduleConfigurationChanged(newMergedOverrideConfig, newActivityWindowInfo); } notifyDisplayCompatPolicyAboutConfigurationChange( mLastReportedConfiguration.getMergedConfiguration(), mTmpConfig); @@ -9891,7 +9895,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A scheduleActivityMovedToDisplay(newDisplayId, newMergedOverrideConfig, newActivityWindowInfo); } else { - scheduleConfigurationChanged(newMergedOverrideConfig); + scheduleConfigurationChanged(newMergedOverrideConfig, newActivityWindowInfo); } notifyDisplayCompatPolicyAboutConfigurationChange( mLastReportedConfiguration.getMergedConfiguration(), mTmpConfig); diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java index 67c528cf40ae..09e7b9141e04 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java @@ -527,7 +527,8 @@ public class ActivityRecordTests extends WindowTestsBase { // The configuration change is still sent to the activity, even if it doesn't relaunch. final ActivityConfigurationChangeItem expected = - ActivityConfigurationChangeItem.obtain(activity.token, newConfig); + ActivityConfigurationChangeItem.obtain(activity.token, newConfig, + activity.getActivityWindowInfo()); verify(mClientLifecycleManager).scheduleTransactionItem( eq(activity.app.getThread()), eq(expected)); } @@ -599,7 +600,8 @@ public class ActivityRecordTests extends WindowTestsBase { final Configuration currentConfig = activity.getConfiguration(); assertEquals(expectedOrientation, currentConfig.orientation); final ActivityConfigurationChangeItem expected = - ActivityConfigurationChangeItem.obtain(activity.token, currentConfig); + ActivityConfigurationChangeItem.obtain(activity.token, currentConfig, + activity.getActivityWindowInfo()); verify(mClientLifecycleManager).scheduleTransactionItem(activity.app.getThread(), expected); verify(displayRotation).onSetRequestedOrientation(); } @@ -818,7 +820,7 @@ public class ActivityRecordTests extends WindowTestsBase { final ActivityConfigurationChangeItem expected = ActivityConfigurationChangeItem.obtain(activity.token, - activity.getConfiguration()); + activity.getConfiguration(), activity.getActivityWindowInfo()); verify(mClientLifecycleManager).scheduleTransactionItem( activity.app.getThread(), expected); } finally { |