Merge "Fix per-app locale updates for apps with shared processes."
This commit is contained in:
committed by
Android (Google) Code Review
commit
d478d792e0
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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 */);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
|
||||
Reference in New Issue
Block a user