Fix per-app locale updates for apps with shared processes.

Test: atest WmTests:ActivityTaskManagerServiceTests
Test: atest WmTests:WindowProcessControllerTests
Bug: 216615115
Change-Id: I7f93b8f20bf0d44dac0615efc05a0509c17e84da
This commit is contained in:
Pratyush More
2022-02-01 17:54:35 +00:00
parent 63cae6de60
commit 0b74d6bce3
3 changed files with 30 additions and 10 deletions

View File

@@ -106,14 +106,18 @@ final class PackageConfigurationUpdaterImpl implements
private void updateConfig(int uid, String packageName) {
final ArraySet<WindowProcessController> processes = mAtm.mProcessMap.getProcesses(uid);
if (processes == null) return;
if (processes == null || processes.isEmpty()) return;
LocaleList localesOverride = LocaleOverlayHelper.combineLocalesIfOverlayExists(
mLocales, mAtm.getGlobalConfiguration().getLocales());
for (int i = processes.size() - 1; i >= 0; i--) {
final WindowProcessController wpc = processes.valueAt(i);
if (!wpc.mInfo.packageName.equals(packageName)) continue;
LocaleList localesOverride = LocaleOverlayHelper.combineLocalesIfOverlayExists(
mLocales, mAtm.getGlobalConfiguration().getLocales());
wpc.applyAppSpecificConfig(mNightMode, localesOverride);
wpc.updateAppSpecificSettingsForAllActivities(mNightMode, localesOverride);
if (wpc.mInfo.packageName.equals(packageName)) {
wpc.applyAppSpecificConfig(mNightMode, localesOverride);
}
// Always inform individual activities about the update, since activities from other
// packages may be sharing this process
wpc.updateAppSpecificSettingsForAllActivitiesInPackage(packageName, mNightMode,
localesOverride);
}
}

View File

@@ -821,10 +821,15 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio
// TODO(b/199277065): Re-assess how app-specific locales are applied based on UXR
// TODO(b/199277729): Consider whether we need to add special casing for edge cases like
// activity-embeddings etc.
void updateAppSpecificSettingsForAllActivities(Integer nightMode, LocaleList localesOverride) {
void updateAppSpecificSettingsForAllActivitiesInPackage(String packageName, Integer nightMode,
LocaleList localesOverride) {
for (int i = mActivities.size() - 1; i >= 0; --i) {
final ActivityRecord r = mActivities.get(i);
if (r.applyAppSpecificConfig(nightMode, localesOverride) && r.mVisibleRequested) {
// Activities from other packages could be sharing this process. Only propagate updates
// to those activities that are part of the package whose app-specific settings changed
if (packageName.equals(r.packageName)
&& r.applyAppSpecificConfig(nightMode, localesOverride)
&& r.mVisibleRequested) {
r.ensureActivityConfiguration(0 /* globalChanges */, true /* preserveWindow */);
}
}

View File

@@ -21,6 +21,7 @@ import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED;
import static android.content.res.Configuration.ORIENTATION_LANDSCAPE;
import static android.content.res.Configuration.ORIENTATION_PORTRAIT;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.never;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;
import static com.android.server.wm.ActivityRecord.State.PAUSED;
@@ -374,11 +375,21 @@ public class WindowProcessControllerTests extends WindowTestsBase {
final ActivityRecord activity = createActivityRecord(mWpc);
activity.mVisibleRequested = true;
doReturn(true).when(activity).applyAppSpecificConfig(anyInt(), any());
mWpc.updateAppSpecificSettingsForAllActivities(Configuration.UI_MODE_NIGHT_YES,
LocaleList.forLanguageTags("en-XA"));
mWpc.updateAppSpecificSettingsForAllActivitiesInPackage(DEFAULT_COMPONENT_PACKAGE_NAME,
Configuration.UI_MODE_NIGHT_YES, LocaleList.forLanguageTags("en-XA"));
verify(activity).ensureActivityConfiguration(anyInt(), anyBoolean());
}
@Test
public void testTopActivityUiModeChangeForDifferentPackage_noScheduledConfigChange() {
final ActivityRecord activity = createActivityRecord(mWpc);
activity.mVisibleRequested = true;
mWpc.updateAppSpecificSettingsForAllActivitiesInPackage("com.different.package",
Configuration.UI_MODE_NIGHT_YES, LocaleList.forLanguageTags("en-XA"));
verify(activity, never()).applyAppSpecificConfig(anyInt(), any());
verify(activity, never()).ensureActivityConfiguration(anyInt(), anyBoolean());
}
@Test
public void testTopActivityDisplayAreaMatchesTopMostActivity_noActivities() {
assertNull(mWpc.getTopActivityDisplayArea());