diff --git a/src/com/android/settings/applications/defaultapps/DefaultBrowserPicker.java b/src/com/android/settings/applications/defaultapps/DefaultBrowserPicker.java index c243970bad0..1cb7985c4c1 100644 --- a/src/com/android/settings/applications/defaultapps/DefaultBrowserPicker.java +++ b/src/com/android/settings/applications/defaultapps/DefaultBrowserPicker.java @@ -17,11 +17,9 @@ package com.android.settings.applications.defaultapps; import android.content.Context; -import android.content.pm.ComponentInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; -import android.util.ArraySet; import com.android.internal.logging.nano.MetricsProto; import com.android.settings.R; @@ -29,7 +27,6 @@ import com.android.settingslib.applications.DefaultAppInfo; import java.util.ArrayList; import java.util.List; -import java.util.Set; /** * Fragment for choosing default browser. @@ -61,24 +58,13 @@ public class DefaultBrowserPicker extends DefaultAppPickerFragment { final List candidates = new ArrayList<>(); final Context context = getContext(); // Resolve that intent and check that the handleAllWebDataURI boolean is set - final List list = mPm.queryIntentActivitiesAsUser( - DefaultBrowserPreferenceController.BROWSE_PROBE, PackageManager.MATCH_ALL, mUserId); + final List list = + DefaultBrowserPreferenceController.getCandidates(mPm, mUserId); - final int count = list.size(); - final Set addedPackages = new ArraySet<>(); - for (int i = 0; i < count; i++) { - ResolveInfo info = list.get(i); - if (info.activityInfo == null || !info.handleAllWebDataURI) { - continue; - } - final String packageName = info.activityInfo.packageName; - if (addedPackages.contains(packageName)) { - continue; - } + for (ResolveInfo info : list) { try { candidates.add(new DefaultAppInfo(context, mPm, - mPm.getApplicationInfoAsUser(packageName, 0, mUserId))); - addedPackages.add(packageName); + mPm.getApplicationInfoAsUser(info.activityInfo.packageName, 0, mUserId))); } catch (PackageManager.NameNotFoundException e) { // Skip unknown packages. } diff --git a/src/com/android/settings/applications/defaultapps/DefaultBrowserPreferenceController.java b/src/com/android/settings/applications/defaultapps/DefaultBrowserPreferenceController.java index 5395be9919c..d4e86ff16fe 100644 --- a/src/com/android/settings/applications/defaultapps/DefaultBrowserPreferenceController.java +++ b/src/com/android/settings/applications/defaultapps/DefaultBrowserPreferenceController.java @@ -26,12 +26,15 @@ import android.graphics.drawable.Drawable; import android.net.Uri; import androidx.preference.Preference; import android.text.TextUtils; +import android.util.ArraySet; import android.util.IconDrawableFactory; import android.util.Log; import com.android.settingslib.applications.DefaultAppInfo; +import java.util.ArrayList; import java.util.List; +import java.util.Set; public class DefaultBrowserPreferenceController extends DefaultAppPreferenceController { @@ -48,7 +51,7 @@ public class DefaultBrowserPreferenceController extends DefaultAppPreferenceCont @Override public boolean isAvailable() { - final List candidates = getCandidates(); + final List candidates = getCandidates(mPackageManager, mUserId); return candidates != null && !candidates.isEmpty(); } @@ -103,14 +106,31 @@ public class DefaultBrowserPreferenceController extends DefaultAppPreferenceCont return getOnlyAppIcon(); } - private List getCandidates() { - return mPackageManager.queryIntentActivitiesAsUser(BROWSE_PROBE, PackageManager.MATCH_ALL, - mUserId); + static List getCandidates(PackageManager packageManager, int userId) { + final List candidates = new ArrayList<>(); + // Resolve that intent and check that the handleAllWebDataURI boolean is set + final List list = packageManager.queryIntentActivitiesAsUser( + BROWSE_PROBE, PackageManager.MATCH_ALL, userId); + if (list != null) { + final Set addedPackages = new ArraySet<>(); + for (ResolveInfo info : list) { + if (info.activityInfo == null || !info.handleAllWebDataURI) { + continue; + } + final String packageName = info.activityInfo.packageName; + if (addedPackages.contains(packageName)) { + continue; + } + candidates.add(info); + addedPackages.add(packageName); + } + } + return candidates; } private String getOnlyAppLabel() { // Resolve that intent and check that the handleAllWebDataURI boolean is set - final List list = getCandidates(); + final List list = getCandidates(mPackageManager, mUserId); if (list != null && list.size() == 1) { final ResolveInfo info = list.get(0); final String label = info.loadLabel(mPackageManager).toString(); @@ -123,7 +143,7 @@ public class DefaultBrowserPreferenceController extends DefaultAppPreferenceCont } private Drawable getOnlyAppIcon() { - final List list = getCandidates(); + final List list = getCandidates(mPackageManager, mUserId); if (list != null && list.size() == 1) { final ResolveInfo info = list.get(0); final ComponentInfo cn = info.getComponentInfo(); diff --git a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultBrowserPickerTest.java b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultBrowserPickerTest.java index bdf249d1f5e..3aa83a8ca1e 100644 --- a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultBrowserPickerTest.java +++ b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultBrowserPickerTest.java @@ -16,8 +16,6 @@ package com.android.settings.applications.defaultapps; -import static com.google.common.truth.Truth.assertThat; -import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.verify; @@ -25,20 +23,11 @@ import static org.mockito.Mockito.when; import android.app.Activity; import android.content.Context; -import android.content.Intent; -import android.content.pm.ActivityInfo; -import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; -import android.content.pm.PackageManager.NameNotFoundException; -import android.content.pm.ResolveInfo; import android.os.UserManager; import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.SettingsRobolectricTestRunner; -import com.android.settingslib.applications.DefaultAppInfo; - -import java.util.ArrayList; -import java.util.List; import org.junit.Before; import org.junit.Test; @@ -85,39 +74,4 @@ public class DefaultBrowserPickerTest { mPicker.getDefaultKey(); verify(mPackageManager).getDefaultBrowserPackageNameAsUser(anyInt()); } - - @Test - public void getCandidates_shouldNotIncludeDuplicatePackageName() throws NameNotFoundException { - final List resolveInfos = new ArrayList<>(); - final String PACKAGE_ONE = "com.first.package"; - final String PACKAGE_TWO = "com.second.package"; - resolveInfos.add(createResolveInfo(PACKAGE_ONE)); - resolveInfos.add(createResolveInfo(PACKAGE_TWO)); - resolveInfos.add(createResolveInfo(PACKAGE_ONE)); - resolveInfos.add(createResolveInfo(PACKAGE_TWO)); - when(mPackageManager.queryIntentActivitiesAsUser(any(Intent.class), anyInt(), anyInt())) - .thenReturn(resolveInfos); - when(mPackageManager.getApplicationInfoAsUser(eq(PACKAGE_ONE), anyInt(), anyInt())) - .thenReturn(createApplicationInfo(PACKAGE_ONE)); - when(mPackageManager.getApplicationInfoAsUser(eq(PACKAGE_TWO), anyInt(), anyInt())) - .thenReturn(createApplicationInfo(PACKAGE_TWO)); - - final List defaultBrowserInfo = mPicker.getCandidates(); - - assertThat(defaultBrowserInfo.size()).isEqualTo(2); - } - - private ResolveInfo createResolveInfo(String packageName) { - final ResolveInfo info = new ResolveInfo(); - info.handleAllWebDataURI = true; - info.activityInfo = new ActivityInfo(); - info.activityInfo.packageName = packageName; - return info; - } - - private ApplicationInfo createApplicationInfo(String packageName) { - final ApplicationInfo info = new ApplicationInfo(); - info.packageName = packageName; - return info; - } } diff --git a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultBrowserPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultBrowserPreferenceControllerTest.java index 6bf6ac4189e..d4c4115b6a4 100644 --- a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultBrowserPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultBrowserPreferenceControllerTest.java @@ -17,15 +17,21 @@ package com.android.settings.applications.defaultapps; import static com.google.common.truth.Truth.assertThat; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyInt; +import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.content.Context; import android.content.Intent; +import android.content.pm.ActivityInfo; +import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.ResolveInfo; import android.os.UserManager; import androidx.preference.Preference; @@ -33,6 +39,8 @@ import androidx.preference.Preference; import com.android.settings.R; import com.android.settings.testutils.SettingsRobolectricTestRunner; +import java.util.ArrayList; +import java.util.List; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -73,8 +81,11 @@ public class DefaultBrowserPreferenceControllerTest { @Test public void isAvailable_hasBrowser_shouldReturnTrue() { + final ResolveInfo info = new ResolveInfo(); + info.activityInfo = new ActivityInfo(); + info.handleAllWebDataURI = true; when(mPackageManager.queryIntentActivitiesAsUser(any(Intent.class), anyInt(), anyInt())) - .thenReturn(Collections.singletonList(new ResolveInfo())); + .thenReturn(Collections.singletonList(info)); assertThat(mController.isAvailable()).isTrue(); } @@ -88,6 +99,28 @@ public class DefaultBrowserPreferenceControllerTest { verify(pref).setSummary(R.string.app_list_preference_none); } + @Test + public void getDefaultAppLabel_hasAppWithMultipleResolvedInfo_shouldReturnLabel() + throws NameNotFoundException { + DefaultBrowserPreferenceController spyController = spy(mController); + doReturn(null).when(spyController).getDefaultAppIcon(); + final List resolveInfos = new ArrayList<>(); + final CharSequence PACKAGE_NAME = "com.test.package"; + final ResolveInfo info1 = spy(createResolveInfo(PACKAGE_NAME.toString())); + when(info1.loadLabel(mPackageManager)).thenReturn(PACKAGE_NAME); + resolveInfos.add(info1); + resolveInfos.add(createResolveInfo(PACKAGE_NAME.toString())); + when(mPackageManager.getDefaultBrowserPackageNameAsUser(anyInt())).thenReturn(null); + when(mPackageManager.queryIntentActivitiesAsUser(any(Intent.class), anyInt(), anyInt())) + .thenReturn(resolveInfos); + when(mPackageManager.getApplicationInfoAsUser( + eq(PACKAGE_NAME.toString()), anyInt(), anyInt())) + .thenReturn(createApplicationInfo(PACKAGE_NAME.toString())); + final Preference pref = mock(Preference.class); + + assertThat(spyController.getDefaultAppLabel()).isEqualTo(PACKAGE_NAME); + } + @Test public void getDefaultApp_shouldGetDefaultBrowserPackage() { mController.getDefaultAppInfo(); @@ -103,4 +136,40 @@ public class DefaultBrowserPreferenceControllerTest { assertThat(mController.isBrowserDefault("pkg", 0)).isTrue(); } + + @Test + public void getCandidates_shouldNotIncludeDuplicatePackageName() throws NameNotFoundException { + final List resolveInfos = new ArrayList<>(); + final String PACKAGE_ONE = "com.first.package"; + final String PACKAGE_TWO = "com.second.package"; + resolveInfos.add(createResolveInfo(PACKAGE_ONE)); + resolveInfos.add(createResolveInfo(PACKAGE_TWO)); + resolveInfos.add(createResolveInfo(PACKAGE_ONE)); + resolveInfos.add(createResolveInfo(PACKAGE_TWO)); + when(mPackageManager.queryIntentActivitiesAsUser(any(Intent.class), anyInt(), anyInt())) + .thenReturn(resolveInfos); + when(mPackageManager.getApplicationInfoAsUser(eq(PACKAGE_ONE), anyInt(), anyInt())) + .thenReturn(createApplicationInfo(PACKAGE_ONE)); + when(mPackageManager.getApplicationInfoAsUser(eq(PACKAGE_TWO), anyInt(), anyInt())) + .thenReturn(createApplicationInfo(PACKAGE_TWO)); + + final List defaultBrowserInfo = + mController.getCandidates(mPackageManager, 0 /* userId */); + + assertThat(defaultBrowserInfo.size()).isEqualTo(2); + } + + private ResolveInfo createResolveInfo(String packageName) { + final ResolveInfo info = new ResolveInfo(); + info.handleAllWebDataURI = true; + info.activityInfo = new ActivityInfo(); + info.activityInfo.packageName = packageName; + return info; + } + + private ApplicationInfo createApplicationInfo(String packageName) { + final ApplicationInfo info = new ApplicationInfo(); + info.packageName = packageName; + return info; + } }