diff --git a/res/values/strings.xml b/res/values/strings.xml index 79c1f0e0d33..18835ed289d 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -4048,12 +4048,6 @@ %1$s and %2$s %1$s, %2$s - - %1$s, and %2$s - - %1$s, %2$s - - %1$s, %2$s This app may charge you money: diff --git a/src/com/android/settings/accounts/AccountDashboardFragment.java b/src/com/android/settings/accounts/AccountDashboardFragment.java index 094390c2e0d..281b1bacdd4 100644 --- a/src/com/android/settings/accounts/AccountDashboardFragment.java +++ b/src/com/android/settings/accounts/AccountDashboardFragment.java @@ -19,6 +19,7 @@ import static android.provider.Settings.EXTRA_AUTHORITIES; import android.app.Activity; import android.content.Context; +import android.icu.text.ListFormatter; import android.os.UserHandle; import android.provider.SearchIndexableResource; import android.text.BidiFormatter; @@ -96,12 +97,11 @@ public class AccountDashboardFragment extends DashboardFragment { final AuthenticatorHelper authHelper = new AuthenticatorHelper(mContext, UserHandle.of(UserHandle.myUserId()), null /* OnAccountsUpdateListener */); final String[] types = authHelper.getEnabledAccountTypes(); - final BidiFormatter bidiFormatter = BidiFormatter.getInstance(); + final List summaries = new ArrayList<>(); - CharSequence summary = null; if (types == null || types.length == 0) { - summary = mContext.getString(R.string.account_dashboard_default_summary); + summaries.add(mContext.getString(R.string.account_dashboard_default_summary)); } else { // Show up to 3 account types, ignore any null value int accountToAdd = Math.min(3, types.length); @@ -111,16 +111,12 @@ public class AccountDashboardFragment extends DashboardFragment { if (TextUtils.isEmpty(label)) { continue; } - if (summary == null) { - summary = bidiFormatter.unicodeWrap(label); - } else { - summary = mContext.getString(R.string.join_many_items_middle, summary, - bidiFormatter.unicodeWrap(label)); - } + + summaries.add(bidiFormatter.unicodeWrap(label)); accountToAdd--; } } - mSummaryLoader.setSummary(this, summary); + mSummaryLoader.setSummary(this, ListFormatter.getInstance().format(summaries)); } } } diff --git a/src/com/android/settings/applications/AppPermissionsPreferenceController.java b/src/com/android/settings/applications/AppPermissionsPreferenceController.java index 206ef339122..38a56aff004 100644 --- a/src/com/android/settings/applications/AppPermissionsPreferenceController.java +++ b/src/com/android/settings/applications/AppPermissionsPreferenceController.java @@ -19,13 +19,14 @@ import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.PermissionGroupInfo; import android.content.pm.PermissionInfo; -import android.text.TextUtils; +import android.icu.text.ListFormatter; import android.util.ArraySet; import android.util.Log; import com.android.settings.R; import com.android.settings.core.BasePreferenceController; +import java.util.ArrayList; import java.util.List; import java.util.Set; @@ -33,7 +34,7 @@ public class AppPermissionsPreferenceController extends BasePreferenceController private static final String TAG = "AppPermissionPrefCtrl"; private static final String KEY_APP_PERMISSION_GROUPS = "manage_perms"; - private static final String[] PERMISSION_GROUPS = new String[] { + private static final String[] PERMISSION_GROUPS = new String[]{ "android.permission-group.LOCATION", "android.permission-group.MICROPHONE", "android.permission-group.CAMERA", @@ -64,18 +65,20 @@ public class AppPermissionsPreferenceController extends BasePreferenceController public CharSequence getSummary() { final Set permissions = getAllPermissionsInGroups(); Set grantedPermissionGroups = getGrantedPermissionGroups(permissions); - CharSequence summary = null; int count = 0; + final List summaries = new ArrayList<>(); + for (String group : PERMISSION_GROUPS) { if (!grantedPermissionGroups.contains(group)) { continue; } - summary = concatSummaryText(summary, group); + summaries.add(getPermissionGroupLabel(group).toString().toLowerCase()); if (++count >= NUM_PERMISSION_TO_USE) { break; } } - return count > 0 ? mContext.getString(R.string.app_permissions_summary, summary) : null; + return count > 0 ? mContext.getString(R.string.app_permissions_summary, + ListFormatter.getInstance().format(summaries)) : null; } private Set getGrantedPermissionGroups(Set permissions) { @@ -96,14 +99,6 @@ public class AppPermissionsPreferenceController extends BasePreferenceController return grantedPermissionGroups; } - private CharSequence concatSummaryText(CharSequence currentSummary, String permission) { - final String label = getPermissionGroupLabel(permission).toString().toLowerCase(); - if (TextUtils.isEmpty(currentSummary)) { - return label; - } - return mContext.getString(R.string.join_many_items_middle, currentSummary, label); - } - private CharSequence getPermissionGroupLabel(String group) { try { final PermissionGroupInfo groupInfo = mPackageManager.getPermissionGroupInfo(group, 0); diff --git a/src/com/android/settings/applications/DefaultAppSettings.java b/src/com/android/settings/applications/DefaultAppSettings.java index 8def0157386..3af5bc2882f 100644 --- a/src/com/android/settings/applications/DefaultAppSettings.java +++ b/src/com/android/settings/applications/DefaultAppSettings.java @@ -17,6 +17,7 @@ package com.android.settings.applications; import android.app.Activity; import android.content.Context; +import android.icu.text.ListFormatter; import android.provider.SearchIndexableResource; import android.text.TextUtils; @@ -138,25 +139,22 @@ public class DefaultAppSettings extends DashboardFragment { if (!listening) { return; } - CharSequence summary = concatSummaryText( - mDefaultBrowserPreferenceController.getDefaultAppLabel(), - mDefaultPhonePreferenceController.getDefaultAppLabel()); - summary = concatSummaryText(summary, - mDefaultSmsPreferenceController.getDefaultAppLabel()); + final List summaries = new ArrayList<>(); + if(!TextUtils.isEmpty(mDefaultBrowserPreferenceController.getDefaultAppLabel())) { + summaries.add(mDefaultBrowserPreferenceController.getDefaultAppLabel()); + } + if(!TextUtils.isEmpty(mDefaultPhonePreferenceController.getDefaultAppLabel())) { + summaries.add(mDefaultPhonePreferenceController.getDefaultAppLabel()); + } + if(!TextUtils.isEmpty(mDefaultSmsPreferenceController.getDefaultAppLabel())) { + summaries.add(mDefaultSmsPreferenceController.getDefaultAppLabel()); + } + + CharSequence summary = ListFormatter.getInstance().format(summaries); if (!TextUtils.isEmpty(summary)) { mSummaryLoader.setSummary(this, summary); } } - - private CharSequence concatSummaryText(CharSequence summary1, CharSequence summary2) { - if (TextUtils.isEmpty(summary1)) { - return summary2; - } - if (TextUtils.isEmpty(summary2)) { - return summary1; - } - return mContext.getString(R.string.join_many_items_middle, summary1, summary2); - } } public static final SummaryLoader.SummaryProviderFactory SUMMARY_PROVIDER_FACTORY = diff --git a/src/com/android/settings/inputmethod/PhysicalKeyboardPreferenceController.java b/src/com/android/settings/inputmethod/PhysicalKeyboardPreferenceController.java index 9532fbc3f4c..367ea80e07d 100644 --- a/src/com/android/settings/inputmethod/PhysicalKeyboardPreferenceController.java +++ b/src/com/android/settings/inputmethod/PhysicalKeyboardPreferenceController.java @@ -18,6 +18,9 @@ package com.android.settings.inputmethod; import android.content.Context; import android.hardware.input.InputManager; +import android.icu.text.ListFormatter; + +import androidx.preference.Preference; import com.android.settings.R; import com.android.settings.core.PreferenceControllerMixin; @@ -28,9 +31,9 @@ import com.android.settingslib.core.lifecycle.LifecycleObserver; import com.android.settingslib.core.lifecycle.events.OnPause; import com.android.settingslib.core.lifecycle.events.OnResume; +import java.util.ArrayList; import java.util.List; -import androidx.preference.Preference; public class PhysicalKeyboardPreferenceController extends AbstractPreferenceController implements PreferenceControllerMixin, LifecycleObserver, OnResume, OnPause, @@ -100,15 +103,10 @@ public class PhysicalKeyboardPreferenceController extends AbstractPreferenceCont mPreference.setSummary(R.string.keyboard_disconnected); return; } - String summary = null; + final List summaries = new ArrayList<>(); for (HardKeyboardDeviceInfo info : keyboards) { - if (summary == null) { - summary = info.mDeviceName; - } else { - summary = mContext.getString(R.string.join_many_items_middle, summary, - info.mDeviceName); - } + summaries.add(info.mDeviceName); } - mPreference.setSummary(summary); + mPreference.setSummary(ListFormatter.getInstance().format(summaries)); } } diff --git a/src/com/android/settings/inputmethod/VirtualKeyboardPreferenceController.java b/src/com/android/settings/inputmethod/VirtualKeyboardPreferenceController.java index 4a046469d9d..61e6a424641 100644 --- a/src/com/android/settings/inputmethod/VirtualKeyboardPreferenceController.java +++ b/src/com/android/settings/inputmethod/VirtualKeyboardPreferenceController.java @@ -19,11 +19,13 @@ package com.android.settings.inputmethod; import android.app.admin.DevicePolicyManager; import android.content.Context; import android.content.pm.PackageManager; -import androidx.preference.Preference; +import android.icu.text.ListFormatter; import android.text.BidiFormatter; import android.view.inputmethod.InputMethodInfo; import android.view.inputmethod.InputMethodManager; +import androidx.preference.Preference; + import com.android.settings.R; import com.android.settings.core.PreferenceControllerMixin; import com.android.settingslib.core.AbstractPreferenceController; @@ -81,15 +83,10 @@ public class VirtualKeyboardPreferenceController extends AbstractPreferenceContr final BidiFormatter bidiFormatter = BidiFormatter.getInstance(); - String summary = null; + final List summaries = new ArrayList<>(); for (String label : labels) { - if (summary == null) { - summary = bidiFormatter.unicodeWrap(label); - } else { - summary = mContext.getString(R.string.join_many_items_middle, summary, - bidiFormatter.unicodeWrap(label)); - } + summaries.add(bidiFormatter.unicodeWrap(label)); } - preference.setSummary(summary); + preference.setSummary(ListFormatter.getInstance().format(summaries)); } } diff --git a/src/com/android/settings/notification/ZenModeSettings.java b/src/com/android/settings/notification/ZenModeSettings.java index 706bc637502..ddbfcb64879 100644 --- a/src/com/android/settings/notification/ZenModeSettings.java +++ b/src/com/android/settings/notification/ZenModeSettings.java @@ -21,9 +21,11 @@ import android.app.FragmentManager; import android.app.NotificationManager; import android.app.NotificationManager.Policy; import android.content.Context; +import android.icu.text.ListFormatter; import android.provider.SearchIndexableResource; import android.provider.Settings; import android.service.notification.ZenModeConfig; + import androidx.annotation.VisibleForTesting; import androidx.preference.CheckBoxPreference; @@ -44,6 +46,7 @@ import java.util.Map.Entry; @SearchIndexable public class ZenModeSettings extends ZenModeSettingsBase { private static final String KEY_SOUND = "zen_effect_sound"; + @Override public void onResume() { super.onResume(); @@ -118,18 +121,21 @@ public class ZenModeSettings extends ZenModeSettingsBase { } else if (numCategories == 2) { return mContext.getString(R.string.join_two_items, enabledCategories.get(0), enabledCategories.get(1).toLowerCase()); - } else if (numCategories == 3){ - String secondaryText = mContext.getString(R.string.join_two_unrelated_items, - enabledCategories.get(0), enabledCategories.get(1).toLowerCase()); - return mContext.getString(R.string.join_many_items_last, secondaryText, - enabledCategories.get(2).toLowerCase()); + } else if (numCategories == 3) { + final List summaries = new ArrayList<>(); + summaries.add(enabledCategories.get(0)); + summaries.add(enabledCategories.get(1).toLowerCase()); + summaries.add(enabledCategories.get(2).toLowerCase()); + + return ListFormatter.getInstance().format(summaries); } else { - String secondaryText = mContext.getString(R.string.join_many_items_middle, - enabledCategories.get(0), enabledCategories.get(1).toLowerCase()); - secondaryText = mContext.getString(R.string.join_many_items_middle, secondaryText, - enabledCategories.get(2).toLowerCase()); - return mContext.getString(R.string.join_many_items_last, secondaryText, - mContext.getString(R.string.zen_mode_other_options)); + final List summaries = new ArrayList<>(); + summaries.add(enabledCategories.get(0)); + summaries.add(enabledCategories.get(1).toLowerCase()); + summaries.add(enabledCategories.get(2).toLowerCase()); + summaries.add(mContext.getString(R.string.zen_mode_other_options)); + + return ListFormatter.getInstance().format(summaries); } } @@ -175,15 +181,15 @@ public class ZenModeSettings extends ZenModeSettingsBase { String getAutomaticRulesSummary() { final int count = getEnabledAutomaticRulesCount(); return count == 0 ? mContext.getString(R.string.zen_mode_settings_summary_off) - : mContext.getResources().getQuantityString( - R.plurals.zen_mode_settings_summary_on, count, count); + : mContext.getResources().getQuantityString( + R.plurals.zen_mode_settings_summary_on, count, count); } @VisibleForTesting int getEnabledAutomaticRulesCount() { int count = 0; final Map ruleMap = - NotificationManager.from(mContext).getAutomaticZenRules(); + NotificationManager.from(mContext).getAutomaticZenRules(); if (ruleMap != null) { for (Entry ruleEntry : ruleMap.entrySet()) { final AutomaticZenRule rule = ruleEntry.getValue(); diff --git a/src/com/android/settings/widget/DonutView.java b/src/com/android/settings/widget/DonutView.java index 76e687e54da..261c85d2657 100644 --- a/src/com/android/settings/widget/DonutView.java +++ b/src/com/android/settings/widget/DonutView.java @@ -25,7 +25,6 @@ import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; import android.graphics.Typeface; import android.icu.text.DecimalFormatSymbols; -import androidx.annotation.ColorRes; import android.text.Layout; import android.text.Spannable; import android.text.SpannableString; @@ -37,6 +36,8 @@ import android.text.style.RelativeSizeSpan; import android.util.AttributeSet; import android.view.View; +import androidx.annotation.ColorRes; + import com.android.internal.annotations.VisibleForTesting; import com.android.settings.R; import com.android.settings.Utils; @@ -207,7 +208,7 @@ public class DonutView extends View { R.dimen.storage_donut_view_shrunken_label_text_size)); } setContentDescription(getContext().getString( - R.string.join_many_items_middle, mPercentString, mFullString)); + R.string.join_two_unrelated_items, mPercentString, mFullString)); invalidate(); } diff --git a/tests/robotests/src/com/android/settings/accounts/AccountDashboardFragmentTest.java b/tests/robotests/src/com/android/settings/accounts/AccountDashboardFragmentTest.java index ade7dc94ce5..8c74edbabc8 100644 --- a/tests/robotests/src/com/android/settings/accounts/AccountDashboardFragmentTest.java +++ b/tests/robotests/src/com/android/settings/accounts/AccountDashboardFragmentTest.java @@ -15,9 +15,13 @@ */ package com.android.settings.accounts; -import static com.android.settings.accounts.AccountDashboardFragmentTest.ShadowAuthenticationHelper.LABELS; -import static com.android.settings.accounts.AccountDashboardFragmentTest.ShadowAuthenticationHelper.TYPES; +import static com.android.settings.accounts.AccountDashboardFragmentTest + .ShadowAuthenticationHelper.LABELS; +import static com.android.settings.accounts.AccountDashboardFragmentTest + .ShadowAuthenticationHelper.TYPES; + import static com.google.common.truth.Truth.assertThat; + import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; @@ -49,116 +53,119 @@ import java.util.List; @RunWith(RobolectricTestRunner.class) public class AccountDashboardFragmentTest { - private AccountDashboardFragment mFragment; + private AccountDashboardFragment mFragment; - @Before - public void setUp() { - mFragment = new AccountDashboardFragment(); - } - - @After - public void tearDown() { - ShadowAuthenticationHelper.reset(); - } - - @Test - public void testCategory_isAccount() { - assertThat(mFragment.getCategoryKey()).isEqualTo(CategoryKey.CATEGORY_ACCOUNT); - } - - @Test - @Config(shadows = { - ShadowAuthenticationHelper.class - }) - public void updateSummary_hasAccount_shouldDisplayUpTo3AccountTypes() { - final SummaryLoader loader = mock(SummaryLoader.class); - final Activity activity = Robolectric.buildActivity(Activity.class).setup().get(); - - final SummaryLoader.SummaryProvider provider = - AccountDashboardFragment.SUMMARY_PROVIDER_FACTORY.createSummaryProvider(activity, loader); - provider.setListening(true); - - verify(loader).setSummary(provider, LABELS[0] + ", " + LABELS[1] + ", " + LABELS[2]); - } - - @Test - @Config(shadows = ShadowAuthenticationHelper.class) - public void updateSummary_noAccount_shouldDisplayDefaultSummary() { - ShadowAuthenticationHelper.setEnabledAccount(null); - final SummaryLoader loader = mock(SummaryLoader.class); - final Activity activity = Robolectric.buildActivity(Activity.class).setup().get(); - - final SummaryLoader.SummaryProvider provider = - AccountDashboardFragment.SUMMARY_PROVIDER_FACTORY.createSummaryProvider(activity, loader); - provider.setListening(true); - - verify(loader).setSummary(provider, - activity.getString(R.string.account_dashboard_default_summary)); - } - - @Test - @Config(shadows = ShadowAuthenticationHelper.class) - public void updateSummary_noAccountTypeLabel_shouldNotDisplayNullEntry() { - final SummaryLoader loader = mock(SummaryLoader.class); - final Activity activity = Robolectric.buildActivity(Activity.class).setup().get(); - final String[] enabledAccounts = {TYPES[0], "unlabeled_account_type", TYPES[1]}; - ShadowAuthenticationHelper.setEnabledAccount(enabledAccounts); - - final SummaryLoader.SummaryProvider provider = - AccountDashboardFragment.SUMMARY_PROVIDER_FACTORY.createSummaryProvider(activity, loader); - provider.setListening(true); - - // should only show the 2 accounts with labels - verify(loader).setSummary(provider, LABELS[0] + ", " + LABELS[1]); - } - - @Test - public void testSearchIndexProvider_shouldIndexResource() { - final List indexRes = - AccountDashboardFragment.SEARCH_INDEX_DATA_PROVIDER - .getXmlResourcesToIndex(RuntimeEnvironment.application, true /* enabled */); - - assertThat(indexRes).isNotNull(); - assertThat(indexRes.get(0).xmlResId).isEqualTo(mFragment.getPreferenceScreenResId()); - } - - @Implements(AuthenticatorHelper.class) - public static class ShadowAuthenticationHelper { - - static final String[] TYPES = {"type1", "type2", "type3", "type4"}; - static final String[] LABELS = {"LABEL1", "LABEL2", "LABEL3", "LABEL4"}; - private static String[] sEnabledAccount = TYPES; - - public void __constructor__(Context context, UserHandle userHandle, - AuthenticatorHelper.OnAccountsUpdateListener listener) { + @Before + public void setUp() { + mFragment = new AccountDashboardFragment(); } - private static void setEnabledAccount(String[] enabledAccount) { - sEnabledAccount = enabledAccount; + @After + public void tearDown() { + ShadowAuthenticationHelper.reset(); } - @Resetter - public static void reset() { - sEnabledAccount = TYPES; + @Test + public void testCategory_isAccount() { + assertThat(mFragment.getCategoryKey()).isEqualTo(CategoryKey.CATEGORY_ACCOUNT); } - @Implementation - public String[] getEnabledAccountTypes() { - return sEnabledAccount; + @Test + @Config(shadows = { + ShadowAuthenticationHelper.class + }) + public void updateSummary_hasAccount_shouldDisplayUpTo3AccountTypes() { + final SummaryLoader loader = mock(SummaryLoader.class); + final Activity activity = Robolectric.buildActivity(Activity.class).setup().get(); + + final SummaryLoader.SummaryProvider provider = + AccountDashboardFragment.SUMMARY_PROVIDER_FACTORY.createSummaryProvider(activity, + loader); + provider.setListening(true); + + verify(loader).setSummary(provider, LABELS[0] + ", " + LABELS[1] + ", and " + LABELS[2]); } - @Implementation - public CharSequence getLabelForType(Context context, final String accountType) { - if (TextUtils.equals(accountType, TYPES[0])) { - return LABELS[0]; - } else if (TextUtils.equals(accountType, TYPES[1])) { - return LABELS[1]; - } else if (TextUtils.equals(accountType, TYPES[2])) { - return LABELS[2]; - } else if (TextUtils.equals(accountType, TYPES[3])) { - return LABELS[3]; - } - return null; + @Test + @Config(shadows = ShadowAuthenticationHelper.class) + public void updateSummary_noAccount_shouldDisplayDefaultSummary() { + ShadowAuthenticationHelper.setEnabledAccount(null); + final SummaryLoader loader = mock(SummaryLoader.class); + final Activity activity = Robolectric.buildActivity(Activity.class).setup().get(); + + final SummaryLoader.SummaryProvider provider = + AccountDashboardFragment.SUMMARY_PROVIDER_FACTORY.createSummaryProvider(activity, + loader); + provider.setListening(true); + + verify(loader).setSummary(provider, + activity.getString(R.string.account_dashboard_default_summary)); + } + + @Test + @Config(shadows = ShadowAuthenticationHelper.class) + public void updateSummary_noAccountTypeLabel_shouldNotDisplayNullEntry() { + final SummaryLoader loader = mock(SummaryLoader.class); + final Activity activity = Robolectric.buildActivity(Activity.class).setup().get(); + final String[] enabledAccounts = {TYPES[0], "unlabeled_account_type", TYPES[1]}; + ShadowAuthenticationHelper.setEnabledAccount(enabledAccounts); + + final SummaryLoader.SummaryProvider provider = + AccountDashboardFragment.SUMMARY_PROVIDER_FACTORY.createSummaryProvider(activity, + loader); + provider.setListening(true); + + // should only show the 2 accounts with labels + verify(loader).setSummary(provider, LABELS[0] + " and " + LABELS[1]); + } + + @Test + public void testSearchIndexProvider_shouldIndexResource() { + final List indexRes = + AccountDashboardFragment.SEARCH_INDEX_DATA_PROVIDER + .getXmlResourcesToIndex(RuntimeEnvironment.application, true /* enabled */); + + assertThat(indexRes).isNotNull(); + assertThat(indexRes.get(0).xmlResId).isEqualTo(mFragment.getPreferenceScreenResId()); + } + + @Implements(AuthenticatorHelper.class) + public static class ShadowAuthenticationHelper { + + static final String[] TYPES = {"type1", "type2", "type3", "type4"}; + static final String[] LABELS = {"LABEL1", "LABEL2", "LABEL3", "LABEL4"}; + private static String[] sEnabledAccount = TYPES; + + public void __constructor__(Context context, UserHandle userHandle, + AuthenticatorHelper.OnAccountsUpdateListener listener) { + } + + private static void setEnabledAccount(String[] enabledAccount) { + sEnabledAccount = enabledAccount; + } + + @Resetter + public static void reset() { + sEnabledAccount = TYPES; + } + + @Implementation + public String[] getEnabledAccountTypes() { + return sEnabledAccount; + } + + @Implementation + public CharSequence getLabelForType(Context context, final String accountType) { + if (TextUtils.equals(accountType, TYPES[0])) { + return LABELS[0]; + } else if (TextUtils.equals(accountType, TYPES[1])) { + return LABELS[1]; + } else if (TextUtils.equals(accountType, TYPES[2])) { + return LABELS[2]; + } else if (TextUtils.equals(accountType, TYPES[3])) { + return LABELS[3]; + } + return null; + } } - } } diff --git a/tests/robotests/src/com/android/settings/applications/AppPermissionsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/AppPermissionsPreferenceControllerTest.java index 581b30015fd..cb3d3ad7e18 100644 --- a/tests/robotests/src/com/android/settings/applications/AppPermissionsPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/applications/AppPermissionsPreferenceControllerTest.java @@ -17,6 +17,7 @@ package com.android.settings.applications; import static com.google.common.truth.Truth.assertThat; + import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.anyString; import static org.mockito.Matchers.eq; @@ -31,6 +32,7 @@ import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.PermissionGroupInfo; import android.content.pm.PermissionInfo; + import androidx.preference.Preference; import com.android.settings.testutils.SettingsRobolectricTestRunner; @@ -95,21 +97,21 @@ public class AppPermissionsPreferenceControllerTest { // create permission groups when(mPackageManager.getPermissionGroupInfo(eq(PERM_LOCATION), anyInt())) - .thenReturn(mGroupLocation); + .thenReturn(mGroupLocation); when(mGroupLocation.loadLabel(mPackageManager)).thenReturn(LABEL_LOCATION); when(mPackageManager.getPermissionGroupInfo(eq(PERM_MICROPHONE), anyInt())) - .thenReturn(mGroupMic); + .thenReturn(mGroupMic); when(mGroupMic.loadLabel(mPackageManager)).thenReturn(LABEL_MICROPHONE); when(mPackageManager.getPermissionGroupInfo(eq(PERM_CAMERA), anyInt())) - .thenReturn(mGroupCamera); + .thenReturn(mGroupCamera); when(mGroupCamera.loadLabel(mPackageManager)).thenReturn(LABEL_CAMERA); when(mPackageManager.getPermissionGroupInfo(eq(PERM_SMS), anyInt())).thenReturn(mGroupSms); when(mGroupSms.loadLabel(mPackageManager)).thenReturn(LABEL_SMS); when(mPackageManager.getPermissionGroupInfo(eq(PERM_CONTACTS), anyInt())) - .thenReturn(mGroupContacts); + .thenReturn(mGroupContacts); when(mGroupContacts.loadLabel(mPackageManager)).thenReturn(LABEL_CONTACTS); when(mPackageManager.getPermissionGroupInfo(eq(PERM_PHONE), anyInt())) - .thenReturn(mGroupPhone); + .thenReturn(mGroupPhone); when(mGroupPhone.loadLabel(mPackageManager)).thenReturn(LABEL_PHONE); // create permissions @@ -139,7 +141,7 @@ public class AppPermissionsPreferenceControllerTest { permissions.add(mPermContacts); permissions.add(mPermPhone); when(mPackageManager.queryPermissionsByGroup(anyString(), anyInt())) - .thenReturn(permissions); + .thenReturn(permissions); mController = spy(new AppPermissionsPreferenceController(mContext)); } @@ -155,7 +157,7 @@ public class AppPermissionsPreferenceControllerTest { final PackageInfo info = new PackageInfo(); installedPackages.add(info); when(mPackageManager.getInstalledPackages(PackageManager.GET_PERMISSIONS)) - .thenReturn(installedPackages); + .thenReturn(installedPackages); mController.updateState(mPreference); @@ -168,7 +170,7 @@ public class AppPermissionsPreferenceControllerTest { final PackageInfo info = new PackageInfo(); installedPackages.add(info); when(mPackageManager.getInstalledPackages(PackageManager.GET_PERMISSIONS)) - .thenReturn(installedPackages); + .thenReturn(installedPackages); PermissionInfo[] permissions = new PermissionInfo[4]; info.permissions = permissions; @@ -177,33 +179,38 @@ public class AppPermissionsPreferenceControllerTest { permissions[2] = mPermCamera; permissions[3] = mPermSms; mController.updateState(mPreference); - verify(mPreference).setSummary("Apps using location, microphone, camera"); + + verify(mPreference).setSummary("Apps using location, microphone, and camera"); permissions[0] = mPermPhone; permissions[1] = mPermMic; permissions[2] = mPermCamera; permissions[3] = mPermSms; mController.updateState(mPreference); - verify(mPreference).setSummary("Apps using microphone, camera, sms"); + + verify(mPreference).setSummary("Apps using microphone, camera, and sms"); permissions[0] = mPermPhone; permissions[1] = mPermMic; permissions[2] = mPermContacts; permissions[3] = mPermSms; mController.updateState(mPreference); - verify(mPreference).setSummary("Apps using microphone, sms, contacts"); + + verify(mPreference).setSummary("Apps using microphone, sms, and contacts"); permissions = new PermissionInfo[2]; info.permissions = permissions; permissions[0] = mPermLocation; permissions[1] = mPermCamera; mController.updateState(mPreference); - verify(mPreference).setSummary("Apps using location, camera"); + + verify(mPreference).setSummary("Apps using location and camera"); permissions = new PermissionInfo[1]; info.permissions = permissions; permissions[0] = mPermCamera; mController.updateState(mPreference); + verify(mPreference).setSummary("Apps using camera"); } } diff --git a/tests/robotests/src/com/android/settings/applications/DefaultAppSettingsTest.java b/tests/robotests/src/com/android/settings/applications/DefaultAppSettingsTest.java index d17fc87156a..fef8eefee69 100644 --- a/tests/robotests/src/com/android/settings/applications/DefaultAppSettingsTest.java +++ b/tests/robotests/src/com/android/settings/applications/DefaultAppSettingsTest.java @@ -91,44 +91,51 @@ public class DefaultAppSettingsTest { when(defaultBrowser.getDefaultAppLabel()).thenReturn("Browser1"); when(defaultPhone.getDefaultAppLabel()).thenReturn("Phone1"); summaryProvider.setListening(true); - verify(summaryLoader).setSummary(summaryProvider, "Browser1, Phone1, Sms1"); + + verify(summaryLoader).setSummary(summaryProvider, "Browser1, Phone1, and Sms1"); // 2 available when(defaultSms.getDefaultAppLabel()).thenReturn(null); when(defaultBrowser.getDefaultAppLabel()).thenReturn("Browser1"); when(defaultPhone.getDefaultAppLabel()).thenReturn("Phone1"); summaryProvider.setListening(true); - verify(summaryLoader).setSummary(summaryProvider, "Browser1, Phone1"); + + verify(summaryLoader).setSummary(summaryProvider, "Browser1 and Phone1"); when(defaultSms.getDefaultAppLabel()).thenReturn("Sms1"); when(defaultBrowser.getDefaultAppLabel()).thenReturn(null); when(defaultPhone.getDefaultAppLabel()).thenReturn("Phone1"); summaryProvider.setListening(true); - verify(summaryLoader).setSummary(summaryProvider, "Phone1, Sms1"); + + verify(summaryLoader).setSummary(summaryProvider, "Phone1 and Sms1"); when(defaultSms.getDefaultAppLabel()).thenReturn("Sms1"); when(defaultBrowser.getDefaultAppLabel()).thenReturn("Browser1"); when(defaultPhone.getDefaultAppLabel()).thenReturn(null); summaryProvider.setListening(true); - verify(summaryLoader).setSummary(summaryProvider, "Phone1, Sms1"); + + verify(summaryLoader).setSummary(summaryProvider, "Browser1 and Sms1"); // 1 available when(defaultSms.getDefaultAppLabel()).thenReturn(null); when(defaultBrowser.getDefaultAppLabel()).thenReturn("Browser1"); when(defaultPhone.getDefaultAppLabel()).thenReturn(null); summaryProvider.setListening(true); + verify(summaryLoader).setSummary(summaryProvider, "Browser1"); when(defaultSms.getDefaultAppLabel()).thenReturn("Sms1"); when(defaultBrowser.getDefaultAppLabel()).thenReturn(null); when(defaultPhone.getDefaultAppLabel()).thenReturn(null); summaryProvider.setListening(true); + verify(summaryLoader).setSummary(summaryProvider, "Sms1"); when(defaultSms.getDefaultAppLabel()).thenReturn(null); when(defaultBrowser.getDefaultAppLabel()).thenReturn(null); when(defaultPhone.getDefaultAppLabel()).thenReturn("Phone1"); summaryProvider.setListening(true); + verify(summaryLoader).setSummary(summaryProvider, "Phone1"); // None available @@ -136,6 +143,7 @@ public class DefaultAppSettingsTest { when(defaultBrowser.getDefaultAppLabel()).thenReturn(null); when(defaultPhone.getDefaultAppLabel()).thenReturn(null); summaryProvider.setListening(true); + verify(summaryLoader, never()).setSummary(summaryProvider, eq(anyString())); } diff --git a/tests/robotests/src/com/android/settings/inputmethod/VirtualKeyboardPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/inputmethod/VirtualKeyboardPreferenceControllerTest.java index c1a963cc678..43e89ffe05c 100644 --- a/tests/robotests/src/com/android/settings/inputmethod/VirtualKeyboardPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/inputmethod/VirtualKeyboardPreferenceControllerTest.java @@ -17,8 +17,7 @@ package com.android.settings.inputmethod; import static com.google.common.truth.Truth.assertThat; -import static org.mockito.Matchers.anyString; -import static org.mockito.Matchers.eq; + import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; @@ -28,11 +27,12 @@ import android.app.admin.DevicePolicyManager; import android.content.ComponentName; import android.content.Context; import android.content.pm.PackageManager; -import androidx.core.text.BidiFormatter; -import androidx.preference.Preference; import android.view.inputmethod.InputMethodInfo; import android.view.inputmethod.InputMethodManager; +import androidx.core.text.BidiFormatter; +import androidx.preference.Preference; + import com.android.settings.R; import com.android.settings.testutils.SettingsRobolectricTestRunner; @@ -125,18 +125,9 @@ public class VirtualKeyboardPreferenceControllerTest { when(imis.get(0).loadLabel(mPm)).thenReturn(label1); when(imis.get(1).getPackageName()).thenReturn(componentName.getPackageName()); when(imis.get(1).loadLabel(mPm)).thenReturn(label2); - when(mContext.getString(eq(R.string.join_many_items_middle), anyString(), anyString())) - .thenAnswer(invocation -> { - final Object[] args = invocation.getArguments(); - final String str1 = (String) args[1]; - final String str2 = (String) args[2]; - return RuntimeEnvironment.application.getString(R.string.join_many_items_middle, - str1, str2); - }); mController.updateState(mPreference); - verify(mPreference).setSummary( - formatter.unicodeWrap(label1) + ", " + formatter.unicodeWrap(label2)); + verify(mPreference).setSummary(formatter.unicodeWrap(label1) + " and " + formatter.unicodeWrap(label2)); } }