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

Commit 2a33f21d authored by Riya Ghai's avatar Riya Ghai Committed by Android (Google) Code Review
Browse files

Merge "Rectify updateFromImpl to handle edge cases better."

parents c273e395 6e8fc0f9
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -154,10 +154,10 @@ public class LocaleManagerService extends SystemService {
        final ActivityTaskManagerInternal.PackageConfigurationUpdater updater =
                mActivityTaskManagerInternal.createPackageConfigurationUpdater(appPackageName,
                        userId);
        boolean isSuccess = updater.setLocales(locales).commit();
        boolean isConfigChanged = updater.setLocales(locales).commit();

        //We want to send the broadcasts only if config was actually updated on commit.
        if (isSuccess) {
        if (isConfigChanged) {
            notifyAppWhoseLocaleChanged(appPackageName, userId, locales);
            notifyInstallerOfAppWhoseLocaleChanged(appPackageName, userId, locales);
            notifyRegisteredReceivers(appPackageName, userId, locales);
+29 −14
Original line number Diff line number Diff line
@@ -169,21 +169,35 @@ public class PackageConfigPersister {
        }
    }

    /**
     * Returns true when the app specific configuration is successfully stored or removed based on
     * the current requested configuration. It will return false when the requested
     * configuration is same as the pre-existing app-specific configuration.
     */
    @GuardedBy("mLock")
    boolean updateFromImpl(String packageName, int userId,
            PackageConfigurationUpdaterImpl impl) {
        synchronized (mLock) {
            PackageConfigRecord record = findRecordOrCreate(mModified, packageName, userId);
            if (impl.getNightMode() != null) {
                record.mNightMode = impl.getNightMode();
            }
            if (impl.getLocales() != null) {
                record.mLocales = impl.getLocales();
            boolean isRecordPresent = false;
            PackageConfigRecord record = findRecord(mModified, packageName, userId);
            if (record != null) {
                isRecordPresent = true;
            } else {
                record = findRecordOrCreate(mModified, packageName, userId);
            }
            boolean isNightModeChanged = updateNightMode(impl.getNightMode(), record);
            boolean isLocalesChanged = updateLocales(impl.getLocales(), record);

            if ((record.mNightMode == null || record.isResetNightMode())
                    && (record.mLocales == null || record.mLocales.isEmpty())) {
                // if all values default to system settings, we can remove the package.
                removePackage(packageName, userId);
                // if there was a pre-existing record for the package that was deleted,
                // we return true (since it was successfully deleted), else false (since there was
                // no change to the previous state).
                return isRecordPresent;
            } else if (!isNightModeChanged && !isLocalesChanged) {
                return false;
            } else {
                final PackageConfigRecord pendingRecord =
                        findRecord(mPendingWrite, record.mName, record.mUserId);
@@ -195,7 +209,8 @@ public class PackageConfigPersister {
                    writeRecord = pendingRecord;
                }

                if (!updateNightMode(record, writeRecord) && !updateLocales(record, writeRecord)) {
                if (!updateNightMode(record.mNightMode, writeRecord)
                        && !updateLocales(record.mLocales, writeRecord)) {
                    return false;
                }

@@ -203,24 +218,24 @@ public class PackageConfigPersister {
                    Slog.d(TAG, "PackageConfigUpdater save config " + writeRecord);
                }
                mPersisterQueue.addItem(new WriteProcessItem(writeRecord), false /* flush */);
            }
                return true;
            }
        }
    }

    private boolean updateNightMode(PackageConfigRecord record, PackageConfigRecord writeRecord) {
        if (record.mNightMode == null || record.mNightMode.equals(writeRecord.mNightMode)) {
    private boolean updateNightMode(Integer requestedNightMode, PackageConfigRecord record) {
        if (requestedNightMode == null || requestedNightMode.equals(record.mNightMode)) {
            return false;
        }
        writeRecord.mNightMode = record.mNightMode;
        record.mNightMode = requestedNightMode;
        return true;
    }

    private boolean updateLocales(PackageConfigRecord record, PackageConfigRecord writeRecord) {
        if (record.mLocales == null || record.mLocales.equals(writeRecord.mLocales)) {
    private boolean updateLocales(LocaleList requestedLocaleList, PackageConfigRecord record) {
        if (requestedLocaleList == null || requestedLocaleList.equals(record.mLocales)) {
            return false;
        }
        writeRecord.mLocales = record.mLocales;
        record.mLocales = requestedLocaleList;
        return true;
    }

+7 −0
Original line number Diff line number Diff line
@@ -854,12 +854,19 @@ public class ActivityTaskManagerServiceTests extends WindowTestsBase {
        ActivityTaskManagerInternal.PackageConfigurationUpdater packageConfigUpdater =
                mAtm.mInternal.createPackageConfigurationUpdater(DEFAULT_PACKAGE_NAME,
                        DEFAULT_USER_ID);

        // committing empty locales, when no config is set should return false.
        assertFalse(packageConfigUpdater.setLocales(LocaleList.getEmptyLocaleList()).commit());

        // committing new configuration returns true;
        assertTrue(packageConfigUpdater.setLocales(LocaleList.forLanguageTags("en-XA,ar-XB"))
                .commit());
        // applying the same configuration returns false.
        assertFalse(packageConfigUpdater.setLocales(LocaleList.forLanguageTags("en-XA,ar-XB"))
                .commit());

        // committing empty locales and undefined nightMode should return true (deletes the
        // pre-existing record) if some config was previously set.
        assertTrue(packageConfigUpdater.setLocales(LocaleList.getEmptyLocaleList())
                .setNightMode(Configuration.UI_MODE_NIGHT_UNDEFINED).commit());
    }