diff --git a/src/com/android/settings/localepicker/AppLocalePickerActivity.java b/src/com/android/settings/localepicker/AppLocalePickerActivity.java index c0f3adcc7ed..b284c8d7c40 100644 --- a/src/com/android/settings/localepicker/AppLocalePickerActivity.java +++ b/src/com/android/settings/localepicker/AppLocalePickerActivity.java @@ -158,13 +158,14 @@ public class AppLocalePickerActivity extends SettingsBaseActivity private void broadcastAppLocaleChange(LocaleStore.LocaleInfo localeInfo) { if (!localeNotificationEnabled()) { + Log.w(TAG, "Locale notification is not enabled"); return; } - String localeTag = localeInfo.getLocale().toLanguageTag(); - if (LocaleUtils.isInSystemLocale(localeTag) || localeInfo.isAppCurrentLocale()) { + if (localeInfo.isAppCurrentLocale()) { return; } try { + String localeTag = localeInfo.getLocale().toLanguageTag(); int uid = getPackageManager().getApplicationInfo(mPackageName, PackageManager.GET_META_DATA).uid; boolean launchNotification = mNotificationController.shouldTriggerNotification( diff --git a/src/com/android/settings/localepicker/LocaleDragAndDropAdapter.java b/src/com/android/settings/localepicker/LocaleDragAndDropAdapter.java index 1b3a4f20af5..24d992756ee 100644 --- a/src/com/android/settings/localepicker/LocaleDragAndDropAdapter.java +++ b/src/com/android/settings/localepicker/LocaleDragAndDropAdapter.java @@ -270,12 +270,14 @@ class LocaleDragAndDropAdapter void removeChecked() { int itemCount = mFeedItemList.size(); LocaleStore.LocaleInfo localeInfo; + NotificationController controller = NotificationController.getInstance(mContext); for (int i = itemCount - 1; i >= 0; i--) { localeInfo = mFeedItemList.get(i); if (localeInfo.getChecked()) { FeatureFactory.getFeatureFactory().getMetricsFeatureProvider() .action(mContext, SettingsEnums.ACTION_REMOVE_LANGUAGE); mFeedItemList.remove(i); + controller.removeNotificationInfo(localeInfo.getLocale().toLanguageTag()); } } notifyDataSetChanged(); diff --git a/src/com/android/settings/localepicker/LocaleNotificationDataManager.java b/src/com/android/settings/localepicker/LocaleNotificationDataManager.java index 4d948f15ced..0e89366fbcc 100644 --- a/src/com/android/settings/localepicker/LocaleNotificationDataManager.java +++ b/src/com/android/settings/localepicker/LocaleNotificationDataManager.java @@ -62,6 +62,17 @@ public class LocaleNotificationDataManager { editor.apply(); } + /** + * Removes one entry with the corresponding locale from the {@link SharedPreferences}. + * + * @param locale A locale which the application sets to + */ + public void removeNotificationInfo(String locale) { + SharedPreferences.Editor editor = getSharedPreferences(mContext).edit(); + editor.remove(locale); + editor.apply(); + } + /** * Gets the {@link NotificationInfo} with the associated locale from the * {@link SharedPreferences}. diff --git a/src/com/android/settings/localepicker/NotificationController.java b/src/com/android/settings/localepicker/NotificationController.java index 2d36189132a..40967059452 100644 --- a/src/com/android/settings/localepicker/NotificationController.java +++ b/src/com/android/settings/localepicker/NotificationController.java @@ -110,6 +110,15 @@ public class NotificationController { return (info != null) ? info.getNotificationId() : -1; } + /** + * Remove the {@link NotificationInfo} with the corresponding locale + * + * @param locale The locale which the application sets to + */ + public void removeNotificationInfo(@NonNull String locale) { + mDataManager.removeNotificationInfo(locale); + } + private boolean updateLocaleNotificationInfo(int uid, String locale) { NotificationInfo info = mDataManager.getNotificationInfo(locale); if (info == null) { @@ -135,20 +144,20 @@ public class NotificationController { int notificationCount = info.getNotificationCount(); long lastNotificationTime = info.getLastNotificationTimeMs(); int notificationId = info.getNotificationId(); - - // Add the uid into the locale's uid list - uidSet.add(uid); if (dismissCount < DISMISS_COUNT_THRESHOLD - && notificationCount < NOTIFICATION_COUNT_THRESHOLD - // Notification should fire on multiples of 2 apps using the locale. - && uidSet.size() % MULTIPLE_BASE == 0 - && !isNotificationFrequent(lastNotificationTime)) { - // Increment the count because the notification can be triggered. - notificationCount = info.getNotificationCount() + 1; - lastNotificationTime = Calendar.getInstance().getTimeInMillis(); - Log.i(TAG, "notificationCount:" + notificationCount); - if (notificationCount == 1) { - notificationId = (int) SystemClock.uptimeMillis(); + && notificationCount < NOTIFICATION_COUNT_THRESHOLD) { + // Add the uid into the locale's uid list + uidSet.add(uid); + // Notification should fire on multiples of 2 apps using the locale. + if (uidSet.size() % MULTIPLE_BASE == 0 + && !isNotificationFrequent(lastNotificationTime)) { + // Increment the count because the notification can be triggered. + notificationCount = info.getNotificationCount() + 1; + lastNotificationTime = Calendar.getInstance().getTimeInMillis(); + Log.i(TAG, "notificationCount:" + notificationCount); + if (notificationCount == 1) { + notificationId = (int) SystemClock.uptimeMillis(); + } } } return new NotificationInfo(uidSet, notificationCount, dismissCount, lastNotificationTime, diff --git a/tests/robotests/src/com/android/settings/localepicker/AppLocalePickerActivityTest.java b/tests/robotests/src/com/android/settings/localepicker/AppLocalePickerActivityTest.java index e91c3886cc9..2989324701f 100644 --- a/tests/robotests/src/com/android/settings/localepicker/AppLocalePickerActivityTest.java +++ b/tests/robotests/src/com/android/settings/localepicker/AppLocalePickerActivityTest.java @@ -369,7 +369,7 @@ public class AppLocalePickerActivityTest { // In the proto file, en-US's uid list contains 103, the notificationCount equals 1, and // LastNotificationTime > 0. NotificationInfo info = mDataManager.getNotificationInfo(EN_US); - assertThat(info.getUidCollection().contains(sUid)).isTrue(); + assertThat(info.getUidCollection()).contains(sUid); assertThat(info.getNotificationCount()).isEqualTo(1); assertThat(info.getDismissCount()).isEqualTo(0); assertThat(info.getLastNotificationTimeMs()).isNotEqualTo(0); @@ -440,7 +440,7 @@ public class AppLocalePickerActivityTest { @Test @RequiresFlagsEnabled(Flags.FLAG_LOCALE_NOTIFICATION_ENABLED) - public void testEvaluateLocaleNotification_localeUpdateReachThreshold_uidAddedNoNotification() + public void testEvaluateLocaleNotification_localeUpdateReachThreshold_noUidNorNotification() throws Exception { // App with uid 106 changed its locale from System to en-US. sUid = 106; @@ -460,7 +460,7 @@ public class AppLocalePickerActivityTest { // In the proto file, en-US's uid list contains 106, the notificationCount equals 2, and // LastNotificationTime > 0. NotificationInfo info = mDataManager.getNotificationInfo(EN_US); - assertThat(info.getUidCollection()).contains(sUid); + assertThat(info.getUidCollection().contains(sUid)).isFalse(); assertThat(info.getNotificationCount()).isEqualTo(2); assertThat(info.getDismissCount()).isEqualTo(0); assertThat(info.getLastNotificationTimeMs()).isEqualTo(lastNotificationTime); diff --git a/tests/robotests/src/com/android/settings/localepicker/LocaleNotificationDataManagerTest.java b/tests/robotests/src/com/android/settings/localepicker/LocaleNotificationDataManagerTest.java index 99541b695f3..443c26d5a9b 100644 --- a/tests/robotests/src/com/android/settings/localepicker/LocaleNotificationDataManagerTest.java +++ b/tests/robotests/src/com/android/settings/localepicker/LocaleNotificationDataManagerTest.java @@ -68,6 +68,18 @@ public class LocaleNotificationDataManagerTest { info.getLastNotificationTimeMs()); } + @Test + public void testRemoveNotificationInfo() { + String locale = "en-US"; + Set uidSet = Set.of(101); + NotificationInfo info = new NotificationInfo(uidSet, 1, 1, 100L, 1000); + + mDataManager.putNotificationInfo(locale, info); + assertThat(mDataManager.getNotificationInfo(locale)).isEqualTo(info); + mDataManager.removeNotificationInfo(locale); + assertThat(mDataManager.getNotificationInfo(locale)).isNull(); + } + @Test public void testGetNotificationMap() { String enUS = "en-US"; diff --git a/tests/robotests/src/com/android/settings/localepicker/NotificationControllerTest.java b/tests/robotests/src/com/android/settings/localepicker/NotificationControllerTest.java index 3e31c0c7967..1e37f9b2f74 100644 --- a/tests/robotests/src/com/android/settings/localepicker/NotificationControllerTest.java +++ b/tests/robotests/src/com/android/settings/localepicker/NotificationControllerTest.java @@ -71,6 +71,19 @@ public class NotificationControllerTest { assertThat(result.getNotificationId()).isEqualTo(id); } + @Test + public void testRemoveNotificationInfo_removed() throws Exception { + String enUS = "en-US"; + Set uidSet = Set.of(100, 101); + long lastNotificationTime = Calendar.getInstance().getTimeInMillis(); + int id = (int) SystemClock.uptimeMillis(); + initSharedPreference(enUS, uidSet, 0, 1, lastNotificationTime, id); + + mNotificationController.removeNotificationInfo(enUS); + + assertThat(mDataManager.getNotificationInfo(enUS)).isNull(); + } + @Test public void testShouldTriggerNotification_inSystemLocale_returnFalse() throws Exception { int uid = 102;