Loading services/core/java/com/android/server/locales/LocaleManagerService.java +2 −2 Original line number Diff line number Diff line Loading @@ -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); Loading services/core/java/com/android/server/wm/PackageConfigPersister.java +29 −14 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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; } Loading @@ -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; } Loading services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java +7 −0 Original line number Diff line number Diff line Loading @@ -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()); } Loading Loading
services/core/java/com/android/server/locales/LocaleManagerService.java +2 −2 Original line number Diff line number Diff line Loading @@ -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); Loading
services/core/java/com/android/server/wm/PackageConfigPersister.java +29 −14 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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; } Loading @@ -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; } Loading
services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java +7 −0 Original line number Diff line number Diff line Loading @@ -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()); } Loading