From d07b049de1adc991d49079c37ef7fd4f7ebab6e2 Mon Sep 17 00:00:00 2001 From: Hai Zhang Date: Mon, 7 Jan 2019 18:30:49 -0800 Subject: [PATCH] Add summary for role-based default apps preference. This change adds summary for role-based default apps preference, based on what we have now for default apps. Bug: 110557011 Test: atest RolesPreferenceControllerTest Change-Id: Ic3dd84dc7ca687ea1de63a856ac3fcf679e1bda9 --- .../RolesPreferenceController.java | 49 +++++- .../RolesPreferenceControllerTest.java | 165 ++++++++++++++++-- 2 files changed, 198 insertions(+), 16 deletions(-) diff --git a/src/com/android/settings/applications/defaultapps/RolesPreferenceController.java b/src/com/android/settings/applications/defaultapps/RolesPreferenceController.java index 59166ddc2b6..c7cab15f7b2 100644 --- a/src/com/android/settings/applications/defaultapps/RolesPreferenceController.java +++ b/src/com/android/settings/applications/defaultapps/RolesPreferenceController.java @@ -16,31 +16,44 @@ package com.android.settings.applications.defaultapps; +import android.app.role.RoleManager; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; +import android.icu.text.ListFormatter; import android.provider.Settings; import android.text.TextUtils; import androidx.preference.Preference; import com.android.settings.core.BasePreferenceController; +import com.android.settingslib.applications.AppUtils; + +import java.util.ArrayList; +import java.util.List; /** * STOPSHIP(b/110557011): Remove once the new UI is ready. */ public class RolesPreferenceController extends BasePreferenceController { - private Intent mIntent; + private final PackageManager mPackageManager; + private final RoleManager mRoleManager; + + private final Intent mIntent; public RolesPreferenceController(Context context, String preferenceKey) { super(context, preferenceKey); - PackageManager packageManager = context.getPackageManager(); - String packageName = packageManager.getPermissionControllerPackageName(); + mPackageManager = context.getPackageManager(); + mRoleManager = context.getSystemService(RoleManager.class); + + final String packageName = mPackageManager.getPermissionControllerPackageName(); if (packageName != null) { mIntent = new Intent(Settings.ACTION_MANAGE_DEFAULT_APPS_SETTINGS) .setPackage(packageName); + } else { + mIntent = null; } } @@ -59,4 +72,34 @@ public class RolesPreferenceController extends BasePreferenceController { } return false; } + + @Override + public CharSequence getSummary() { + final List defaultAppLabels = new ArrayList<>(); + final CharSequence defaultBrowserLabel = getDefaultAppLabel(RoleManager.ROLE_BROWSER); + if(!TextUtils.isEmpty(defaultBrowserLabel)) { + defaultAppLabels.add(defaultBrowserLabel); + } + final CharSequence defaultPhoneLabel = getDefaultAppLabel(RoleManager.ROLE_DIALER); + if(!TextUtils.isEmpty(defaultPhoneLabel)) { + defaultAppLabels.add(defaultPhoneLabel); + } + final CharSequence defaultSmsLabel = getDefaultAppLabel(RoleManager.ROLE_SMS); + if(!TextUtils.isEmpty(defaultSmsLabel)) { + defaultAppLabels.add(defaultSmsLabel); + } + if (defaultAppLabels.isEmpty()) { + return null; + } + return ListFormatter.getInstance().format(defaultAppLabels); + } + + private CharSequence getDefaultAppLabel(String roleName) { + final List packageNames = mRoleManager.getRoleHolders(roleName); + if (packageNames.isEmpty()) { + return null; + } + final String packageName = packageNames.get(0); + return AppUtils.getApplicationLabel(mPackageManager, packageName); + } } diff --git a/tests/robotests/src/com/android/settings/applications/defaultapps/RolesPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/defaultapps/RolesPreferenceControllerTest.java index 5bf2b7e40ad..92468a084f9 100644 --- a/tests/robotests/src/com/android/settings/applications/defaultapps/RolesPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/applications/defaultapps/RolesPreferenceControllerTest.java @@ -19,13 +19,17 @@ package com.android.settings.applications.defaultapps; import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.app.role.RoleManager; import android.content.Context; import android.content.Intent; +import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.provider.Settings; @@ -41,32 +45,59 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; +import java.util.Collections; + @RunWith(RobolectricTestRunner.class) public class RolesPreferenceControllerTest { private static final String PREFERENCE_KEY = "roles"; private static final String DIFFERENT_PREFERENCE_KEY = "different"; + private static final String PERMISSION_CONTROLLER_PACKAGE_NAME = "com.android.permissioncontroller"; + private static final String BROWSER_PACKAGE_NAME = "com.example.browser1"; + private static final String DIALER_PACKAGE_NAME = "com.example.dialer1"; + private static final String SMS_PACKAGE_NAME = "com.example.sms1"; + @Mock private Context mContext; @Mock private PackageManager mPackageManager; + @Mock + private RoleManager mRoleManager; + @Mock + private ApplicationInfo mBrowserApplicationInfo; + @Mock + private ApplicationInfo mDialerApplicationInfo; + @Mock + private ApplicationInfo mSmsApplicationInfo; @Before - public void setUp() { + public void setUp() throws PackageManager.NameNotFoundException { MockitoAnnotations.initMocks(this); + when(mContext.getPackageManager()).thenReturn(mPackageManager); + when(mContext.getSystemService(RoleManager.class)).thenReturn(mRoleManager); + + when(mBrowserApplicationInfo.loadLabel(mPackageManager)).thenReturn("Browser1"); + when(mPackageManager.getApplicationInfo(eq(BROWSER_PACKAGE_NAME), anyInt())).thenReturn( + mBrowserApplicationInfo); + when(mDialerApplicationInfo.loadLabel(mPackageManager)).thenReturn("Phone1"); + when(mPackageManager.getApplicationInfo(eq(DIALER_PACKAGE_NAME), anyInt())).thenReturn( + mDialerApplicationInfo); + when(mSmsApplicationInfo.loadLabel(mPackageManager)).thenReturn("Sms1"); + when(mPackageManager.getApplicationInfo(eq(SMS_PACKAGE_NAME), anyInt())).thenReturn( + mSmsApplicationInfo); } @Test public void getAvailabilityStatus_noPermissionController_shouldReturnUnsupportedOnDevice() { when(mPackageManager.getPermissionControllerPackageName()).thenReturn(null); - RolesPreferenceController controller = new RolesPreferenceController(mContext, + RolesPreferenceController preferenceController = new RolesPreferenceController(mContext, PREFERENCE_KEY); - assertThat(controller.getAvailabilityStatus()) + assertThat(preferenceController.getAvailabilityStatus()) .isEqualTo(BasePreferenceController.UNSUPPORTED_ON_DEVICE); } @@ -74,10 +105,10 @@ public class RolesPreferenceControllerTest { public void getAvailabilityStatus_hasPermissionController_shouldReturnAvailableUnsearchable() { when(mPackageManager.getPermissionControllerPackageName()) .thenReturn(PERMISSION_CONTROLLER_PACKAGE_NAME); - RolesPreferenceController controller = new RolesPreferenceController(mContext, + RolesPreferenceController preferenceController = new RolesPreferenceController(mContext, PREFERENCE_KEY); - assertThat(controller.getAvailabilityStatus()) + assertThat(preferenceController.getAvailabilityStatus()) .isEqualTo(BasePreferenceController.AVAILABLE_UNSEARCHABLE); } @@ -85,34 +116,34 @@ public class RolesPreferenceControllerTest { public void handlePreferenceTreeClick_differentKey_shouldReturnFalse() { when(mPackageManager.getPermissionControllerPackageName()) .thenReturn(PERMISSION_CONTROLLER_PACKAGE_NAME); - RolesPreferenceController controller = new RolesPreferenceController(mContext, + RolesPreferenceController preferenceController = new RolesPreferenceController(mContext, PREFERENCE_KEY); Preference preference = mock(Preference.class); when(preference.getKey()).thenReturn(DIFFERENT_PREFERENCE_KEY); - assertThat(controller.handlePreferenceTreeClick(preference)).isFalse(); + assertThat(preferenceController.handlePreferenceTreeClick(preference)).isFalse(); } @Test public void handlePreferenceTreeClick_sameKey_shouldReturnTrue() { when(mPackageManager.getPermissionControllerPackageName()) .thenReturn(PERMISSION_CONTROLLER_PACKAGE_NAME); - RolesPreferenceController controller = new RolesPreferenceController(mContext, + RolesPreferenceController preferenceController = new RolesPreferenceController(mContext, PREFERENCE_KEY); Preference preference = mock(Preference.class); when(preference.getKey()).thenReturn(PREFERENCE_KEY); - assertThat(controller.handlePreferenceTreeClick(preference)).isTrue(); + assertThat(preferenceController.handlePreferenceTreeClick(preference)).isTrue(); } @Test public void handlePreferenceTreeClick_noPermissionController_shouldNotStartActivity() { when(mPackageManager.getPermissionControllerPackageName()).thenReturn(null); - RolesPreferenceController controller = new RolesPreferenceController(mContext, + RolesPreferenceController preferenceController = new RolesPreferenceController(mContext, PREFERENCE_KEY); Preference preference = mock(Preference.class); when(preference.getKey()).thenReturn(PREFERENCE_KEY); - controller.handlePreferenceTreeClick(preference); + preferenceController.handlePreferenceTreeClick(preference); verify(mContext, never()).startActivity(any(Intent.class)); } @@ -121,11 +152,11 @@ public class RolesPreferenceControllerTest { public void handlePreferenceTreeClick_hasPermissionController_shouldStartActivityWithIntent() { when(mPackageManager.getPermissionControllerPackageName()) .thenReturn(PERMISSION_CONTROLLER_PACKAGE_NAME); - RolesPreferenceController controller = new RolesPreferenceController(mContext, + RolesPreferenceController preferenceController = new RolesPreferenceController(mContext, PREFERENCE_KEY); Preference preference = mock(Preference.class); when(preference.getKey()).thenReturn(PREFERENCE_KEY); - controller.handlePreferenceTreeClick(preference); + preferenceController.handlePreferenceTreeClick(preference); ArgumentCaptor intent = ArgumentCaptor.forClass(Intent.class); verify(mContext).startActivity(intent.capture()); @@ -133,4 +164,112 @@ public class RolesPreferenceControllerTest { .isEqualTo(Settings.ACTION_MANAGE_DEFAULT_APPS_SETTINGS); assertThat(intent.getValue().getPackage()).isEqualTo(PERMISSION_CONTROLLER_PACKAGE_NAME); } + + @Test + public void getSummary_allAvailable_shouldReturnAll() { + when(mRoleManager.getRoleHolders(RoleManager.ROLE_BROWSER)).thenReturn( + Collections.singletonList(BROWSER_PACKAGE_NAME)); + when(mRoleManager.getRoleHolders(RoleManager.ROLE_DIALER)).thenReturn( + Collections.singletonList(DIALER_PACKAGE_NAME)); + when(mRoleManager.getRoleHolders(RoleManager.ROLE_SMS)).thenReturn( + Collections.singletonList(SMS_PACKAGE_NAME)); + RolesPreferenceController preferenceController = new RolesPreferenceController(mContext, + PREFERENCE_KEY); + + assertThat(preferenceController.getSummary()).isEqualTo("Browser1, Phone1, and Sms1"); + } + + @Test + public void getSummary_browserAndDialerAvailable_shouldReturnBrowserAndDialer() { + when(mRoleManager.getRoleHolders(RoleManager.ROLE_BROWSER)).thenReturn( + Collections.singletonList(BROWSER_PACKAGE_NAME)); + when(mRoleManager.getRoleHolders(RoleManager.ROLE_DIALER)).thenReturn( + Collections.singletonList(DIALER_PACKAGE_NAME)); + when(mRoleManager.getRoleHolders(RoleManager.ROLE_SMS)).thenReturn(Collections.emptyList()); + RolesPreferenceController preferenceController = new RolesPreferenceController(mContext, + PREFERENCE_KEY); + + assertThat(preferenceController.getSummary()).isEqualTo("Browser1 and Phone1"); + } + + @Test + public void getSummary_browserAndSmsAvailable_shouldReturnBrowserAndSms() { + when(mRoleManager.getRoleHolders(RoleManager.ROLE_BROWSER)).thenReturn( + Collections.singletonList(BROWSER_PACKAGE_NAME)); + when(mRoleManager.getRoleHolders(RoleManager.ROLE_DIALER)).thenReturn( + Collections.emptyList()); + when(mRoleManager.getRoleHolders(RoleManager.ROLE_SMS)).thenReturn( + Collections.singletonList(SMS_PACKAGE_NAME)); + RolesPreferenceController preferenceController = new RolesPreferenceController(mContext, + PREFERENCE_KEY); + + assertThat(preferenceController.getSummary()).isEqualTo("Browser1 and Sms1"); + } + + @Test + public void getSummary_dialerAndSmsAvailable_shouldReturnDialerAndSms() { + when(mRoleManager.getRoleHolders(RoleManager.ROLE_BROWSER)).thenReturn( + Collections.emptyList()); + when(mRoleManager.getRoleHolders(RoleManager.ROLE_DIALER)).thenReturn( + Collections.singletonList(DIALER_PACKAGE_NAME)); + when(mRoleManager.getRoleHolders(RoleManager.ROLE_SMS)).thenReturn( + Collections.singletonList(SMS_PACKAGE_NAME)); + RolesPreferenceController preferenceController = new RolesPreferenceController(mContext, + PREFERENCE_KEY); + + assertThat(preferenceController.getSummary()).isEqualTo("Phone1 and Sms1"); + } + + @Test + public void getSummary_browserAvailable_shouldReturnBrowser() { + when(mRoleManager.getRoleHolders(RoleManager.ROLE_BROWSER)).thenReturn( + Collections.singletonList(BROWSER_PACKAGE_NAME)); + when(mRoleManager.getRoleHolders(RoleManager.ROLE_DIALER)).thenReturn( + Collections.emptyList()); + when(mRoleManager.getRoleHolders(RoleManager.ROLE_SMS)).thenReturn(Collections.emptyList()); + RolesPreferenceController preferenceController = new RolesPreferenceController(mContext, + PREFERENCE_KEY); + + assertThat(preferenceController.getSummary()).isEqualTo("Browser1"); + } + + @Test + public void getSummary_dialerAvailable_shouldReturnDialer() { + when(mRoleManager.getRoleHolders(RoleManager.ROLE_BROWSER)).thenReturn( + Collections.emptyList()); + when(mRoleManager.getRoleHolders(RoleManager.ROLE_DIALER)).thenReturn( + Collections.singletonList(DIALER_PACKAGE_NAME)); + when(mRoleManager.getRoleHolders(RoleManager.ROLE_SMS)).thenReturn(Collections.emptyList()); + RolesPreferenceController preferenceController = new RolesPreferenceController(mContext, + PREFERENCE_KEY); + + assertThat(preferenceController.getSummary()).isEqualTo("Phone1"); + } + + @Test + public void getSummary_smsAvailable_shouldReturnSms() { + when(mRoleManager.getRoleHolders(RoleManager.ROLE_BROWSER)).thenReturn( + Collections.emptyList()); + when(mRoleManager.getRoleHolders(RoleManager.ROLE_DIALER)).thenReturn( + Collections.emptyList()); + when(mRoleManager.getRoleHolders(RoleManager.ROLE_SMS)).thenReturn( + Collections.singletonList(SMS_PACKAGE_NAME)); + RolesPreferenceController preferenceController = new RolesPreferenceController(mContext, + PREFERENCE_KEY); + + assertThat(preferenceController.getSummary()).isEqualTo("Sms1"); + } + + @Test + public void getSummary_noneAvailable_shouldReturnNull() { + when(mRoleManager.getRoleHolders(RoleManager.ROLE_BROWSER)).thenReturn( + Collections.emptyList()); + when(mRoleManager.getRoleHolders(RoleManager.ROLE_DIALER)).thenReturn( + Collections.emptyList()); + when(mRoleManager.getRoleHolders(RoleManager.ROLE_SMS)).thenReturn(Collections.emptyList()); + RolesPreferenceController preferenceController = new RolesPreferenceController(mContext, + PREFERENCE_KEY); + + assertThat(preferenceController.getSummary()).isNull(); + } }