Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d478d792 authored by Pratyush More's avatar Pratyush More Committed by Android (Google) Code Review
Browse files

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

parents e6094a9e 0b74d6bc
Loading
Loading
Loading
Loading
+10 −6
Original line number Diff line number Diff line
@@ -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;
        for (int i = processes.size() - 1; i >= 0; i--) {
            final WindowProcessController wpc = processes.valueAt(i);
            if (!wpc.mInfo.packageName.equals(packageName)) continue;
        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)) {
                wpc.applyAppSpecificConfig(mNightMode, localesOverride);
            wpc.updateAppSpecificSettingsForAllActivities(mNightMode, localesOverride);
            }
            // Always inform individual activities about the update, since activities from other
            // packages may be sharing this process
            wpc.updateAppSpecificSettingsForAllActivitiesInPackage(packageName, mNightMode,
                    localesOverride);
        }
    }

+7 −2
Original line number Diff line number Diff line
@@ -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 */);
            }
        }
+13 −2
Original line number Diff line number Diff line
@@ -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());