Loading src/com/android/settings/applications/AppLaunchSettings.java +2 −31 Original line number Diff line number Diff line Loading @@ -20,11 +20,8 @@ import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATIO import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_NEVER; import android.app.settings.SettingsEnums; import android.content.Intent; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.net.Uri; import android.os.Bundle; import android.os.UserHandle; import android.util.ArraySet; Loading @@ -37,8 +34,7 @@ import androidx.preference.Preference; import com.android.settings.R; import com.android.settings.Utils; import com.android.settings.core.SubSettingLauncher; import java.util.List; import com.android.settingslib.applications.AppUtils; public class AppLaunchSettings extends AppInfoWithHeader implements OnClickListener, Preference.OnPreferenceChangeListener { Loading @@ -49,15 +45,6 @@ public class AppLaunchSettings extends AppInfoWithHeader implements OnClickListe private static final String FRAGMENT_OPEN_SUPPORTED_LINKS = "com.android.settings.applications.OpenSupportedLinks"; private static final Intent sBrowserIntent; static { sBrowserIntent = new Intent() .setAction(Intent.ACTION_VIEW) .addCategory(Intent.CATEGORY_BROWSABLE) .setData(Uri.parse("http:")); } private PackageManager mPm; private boolean mIsBrowser; Loading Loading @@ -90,7 +77,7 @@ public class AppLaunchSettings extends AppInfoWithHeader implements OnClickListe mPm = getActivity().getPackageManager(); mIsBrowser = isBrowserApp(mPackageName); mIsBrowser = AppUtils.isBrowserApp(this.getContext(), mPackageName, UserHandle.myUserId()); mHasDomainUrls = (mAppEntry.info.privateFlags & ApplicationInfo.PRIVATE_FLAG_HAS_DOMAIN_URLS) != 0; Loading @@ -108,22 +95,6 @@ public class AppLaunchSettings extends AppInfoWithHeader implements OnClickListe } } // An app is a "browser" if it has an activity resolution that wound up // marked with the 'handleAllWebDataURI' flag. private boolean isBrowserApp(String packageName) { sBrowserIntent.setPackage(packageName); List<ResolveInfo> list = mPm.queryIntentActivitiesAsUser(sBrowserIntent, PackageManager.MATCH_ALL, UserHandle.myUserId()); final int count = list.size(); for (int i = 0; i < count; i++) { ResolveInfo info = list.get(i); if (info.activityInfo != null && info.handleAllWebDataURI) { return true; } } return false; } private int linkStateToResourceId(int state) { switch (state) { case INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS: Loading src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java +5 −1 Original line number Diff line number Diff line Loading @@ -150,7 +150,11 @@ public class AppInfoDashboardFragment extends DashboardFragment installer.setParentFragment(this); use(AppInstallerPreferenceCategoryController.class).setChildren(Arrays.asList(installer)); use(AppNotificationPreferenceController.class).setParentFragment(this); use(AppOpenByDefaultPreferenceController.class).setParentFragment(this); use(AppOpenByDefaultPreferenceController.class) .setPackageName(packageName) .setParentFragment(this); use(AppPermissionPreferenceController.class).setParentFragment(this); use(AppPermissionPreferenceController.class).setPackageName(packageName); use(AppSettingPreferenceController.class) Loading src/com/android/settings/applications/appinfo/AppOpenByDefaultPreferenceController.java +11 −2 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.hardware.usb.IUsbManager; import android.os.ServiceManager; import android.os.UserHandle; import androidx.preference.Preference; import androidx.preference.PreferenceScreen; Loading @@ -35,6 +36,7 @@ public class AppOpenByDefaultPreferenceController extends AppInfoPreferenceContr private IUsbManager mUsbManager; private PackageManager mPackageManager; private String mPackageName; public AppOpenByDefaultPreferenceController(Context context, String key) { super(context, key); Loading @@ -42,6 +44,12 @@ public class AppOpenByDefaultPreferenceController extends AppInfoPreferenceContr mPackageManager = context.getPackageManager(); } /** Set a package name for this controller. */ public AppOpenByDefaultPreferenceController setPackageName(String packageName) { mPackageName = packageName; return this; } @Override public void displayPreference(PreferenceScreen screen) { super.displayPreference(screen); Loading @@ -57,7 +65,9 @@ public class AppOpenByDefaultPreferenceController extends AppInfoPreferenceContr @Override public void updateState(Preference preference) { final PackageInfo packageInfo = mParent.getPackageInfo(); if (packageInfo != null && !AppUtils.isInstant(packageInfo.applicationInfo)) { if (packageInfo != null && !AppUtils.isInstant(packageInfo.applicationInfo) && !AppUtils.isBrowserApp(mContext, packageInfo.packageName, UserHandle.myUserId())) { preference.setVisible(true); preference.setSummary(AppUtils.getLaunchByDefaultSummary(mParent.getAppEntry(), mUsbManager, mPackageManager, mContext)); Loading @@ -70,5 +80,4 @@ public class AppOpenByDefaultPreferenceController extends AppInfoPreferenceContr protected Class<? extends SettingsPreferenceFragment> getDetailFragmentClass() { return AppLaunchSettings.class; } } tests/robotests/src/com/android/settings/applications/appinfo/AppOpenByDefaultPreferenceControllerTest.java +46 −5 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.settings.applications.appinfo; import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; Loading @@ -26,8 +27,12 @@ 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.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import androidx.preference.Preference; import androidx.preference.PreferenceScreen; Loading @@ -37,6 +42,8 @@ import com.android.settingslib.applications.AppUtils; import com.android.settingslib.applications.ApplicationsState.AppEntry; import com.android.settingslib.applications.instantapps.InstantAppDataProvider; import com.google.common.collect.ImmutableList; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; Loading @@ -46,6 +53,8 @@ import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.util.ReflectionHelpers; import java.util.List; @RunWith(RobolectricTestRunner.class) public class AppOpenByDefaultPreferenceControllerTest { Loading @@ -55,6 +64,8 @@ public class AppOpenByDefaultPreferenceControllerTest { private PreferenceScreen mScreen; @Mock private Preference mPreference; @Mock private PackageManager mPackageManager; private Context mContext; private AppOpenByDefaultPreferenceController mController; Loading @@ -62,10 +73,11 @@ public class AppOpenByDefaultPreferenceControllerTest { @Before public void setUp() { MockitoAnnotations.initMocks(this); mContext = RuntimeEnvironment.application.getApplicationContext(); mContext = spy(RuntimeEnvironment.application.getApplicationContext()); mController = spy(new AppOpenByDefaultPreferenceController(mContext, "preferred_app")); mController.setParentFragment(mFragment); when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference); when(mContext.getPackageManager()).thenReturn(mPackageManager); } @Test Loading Loading @@ -146,13 +158,42 @@ public class AppOpenByDefaultPreferenceControllerTest { } @Test public void updateState_notInstantApp_shouldShowPreferenceAndSetSummary() { when(mFragment.getPackageInfo()).thenReturn(new PackageInfo()); public void updateState_isBrowserApp_shouldNotShowPreference() { final PackageInfo packageInfo = new PackageInfo(); packageInfo.packageName = "com.package.test.browser"; when(mFragment.getPackageInfo()).thenReturn(packageInfo); ReflectionHelpers.setStaticField(AppUtils.class, "sInstantAppDataProvider", (InstantAppDataProvider) (i -> false)); final ResolveInfo resolveInfo = new ResolveInfo(); resolveInfo.activityInfo = new ActivityInfo(); resolveInfo.handleAllWebDataURI = true; final List<ResolveInfo> resolveInfos = ImmutableList.of(resolveInfo); when(mPackageManager .queryIntentActivitiesAsUser(any(Intent.class), anyInt(), anyInt())) .thenReturn(resolveInfos); mController.updateState(mPreference); verify(mPreference).setVisible(false); } @Test public void updateState_notBrowserApp_notInstantApp_shouldShowPreferenceAndSetSummary() { final PackageInfo packageInfo = new PackageInfo(); packageInfo.packageName = "com.package.test.browser"; when(mFragment.getPackageInfo()).thenReturn(packageInfo); ReflectionHelpers.setStaticField(AppUtils.class, "sInstantAppDataProvider", (InstantAppDataProvider) (i -> false)); final ResolveInfo resolveInfo = new ResolveInfo(); resolveInfo.activityInfo = new ActivityInfo(); resolveInfo.handleAllWebDataURI = false; final List<ResolveInfo> resolveInfos = ImmutableList.of(resolveInfo); when(mPackageManager .queryIntentActivitiesAsUser(any(Intent.class), anyInt(), anyInt())) .thenReturn(resolveInfos); final AppEntry appEntry = mock(AppEntry.class); appEntry.info = new ApplicationInfo(); when(mFragment.getAppEntry()).thenReturn(appEntry); ReflectionHelpers.setStaticField(AppUtils.class, "sInstantAppDataProvider", (InstantAppDataProvider) (i -> false)); mController.updateState(mPreference); Loading Loading
src/com/android/settings/applications/AppLaunchSettings.java +2 −31 Original line number Diff line number Diff line Loading @@ -20,11 +20,8 @@ import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATIO import static android.content.pm.PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_NEVER; import android.app.settings.SettingsEnums; import android.content.Intent; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.net.Uri; import android.os.Bundle; import android.os.UserHandle; import android.util.ArraySet; Loading @@ -37,8 +34,7 @@ import androidx.preference.Preference; import com.android.settings.R; import com.android.settings.Utils; import com.android.settings.core.SubSettingLauncher; import java.util.List; import com.android.settingslib.applications.AppUtils; public class AppLaunchSettings extends AppInfoWithHeader implements OnClickListener, Preference.OnPreferenceChangeListener { Loading @@ -49,15 +45,6 @@ public class AppLaunchSettings extends AppInfoWithHeader implements OnClickListe private static final String FRAGMENT_OPEN_SUPPORTED_LINKS = "com.android.settings.applications.OpenSupportedLinks"; private static final Intent sBrowserIntent; static { sBrowserIntent = new Intent() .setAction(Intent.ACTION_VIEW) .addCategory(Intent.CATEGORY_BROWSABLE) .setData(Uri.parse("http:")); } private PackageManager mPm; private boolean mIsBrowser; Loading Loading @@ -90,7 +77,7 @@ public class AppLaunchSettings extends AppInfoWithHeader implements OnClickListe mPm = getActivity().getPackageManager(); mIsBrowser = isBrowserApp(mPackageName); mIsBrowser = AppUtils.isBrowserApp(this.getContext(), mPackageName, UserHandle.myUserId()); mHasDomainUrls = (mAppEntry.info.privateFlags & ApplicationInfo.PRIVATE_FLAG_HAS_DOMAIN_URLS) != 0; Loading @@ -108,22 +95,6 @@ public class AppLaunchSettings extends AppInfoWithHeader implements OnClickListe } } // An app is a "browser" if it has an activity resolution that wound up // marked with the 'handleAllWebDataURI' flag. private boolean isBrowserApp(String packageName) { sBrowserIntent.setPackage(packageName); List<ResolveInfo> list = mPm.queryIntentActivitiesAsUser(sBrowserIntent, PackageManager.MATCH_ALL, UserHandle.myUserId()); final int count = list.size(); for (int i = 0; i < count; i++) { ResolveInfo info = list.get(i); if (info.activityInfo != null && info.handleAllWebDataURI) { return true; } } return false; } private int linkStateToResourceId(int state) { switch (state) { case INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS: Loading
src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java +5 −1 Original line number Diff line number Diff line Loading @@ -150,7 +150,11 @@ public class AppInfoDashboardFragment extends DashboardFragment installer.setParentFragment(this); use(AppInstallerPreferenceCategoryController.class).setChildren(Arrays.asList(installer)); use(AppNotificationPreferenceController.class).setParentFragment(this); use(AppOpenByDefaultPreferenceController.class).setParentFragment(this); use(AppOpenByDefaultPreferenceController.class) .setPackageName(packageName) .setParentFragment(this); use(AppPermissionPreferenceController.class).setParentFragment(this); use(AppPermissionPreferenceController.class).setPackageName(packageName); use(AppSettingPreferenceController.class) Loading
src/com/android/settings/applications/appinfo/AppOpenByDefaultPreferenceController.java +11 −2 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.hardware.usb.IUsbManager; import android.os.ServiceManager; import android.os.UserHandle; import androidx.preference.Preference; import androidx.preference.PreferenceScreen; Loading @@ -35,6 +36,7 @@ public class AppOpenByDefaultPreferenceController extends AppInfoPreferenceContr private IUsbManager mUsbManager; private PackageManager mPackageManager; private String mPackageName; public AppOpenByDefaultPreferenceController(Context context, String key) { super(context, key); Loading @@ -42,6 +44,12 @@ public class AppOpenByDefaultPreferenceController extends AppInfoPreferenceContr mPackageManager = context.getPackageManager(); } /** Set a package name for this controller. */ public AppOpenByDefaultPreferenceController setPackageName(String packageName) { mPackageName = packageName; return this; } @Override public void displayPreference(PreferenceScreen screen) { super.displayPreference(screen); Loading @@ -57,7 +65,9 @@ public class AppOpenByDefaultPreferenceController extends AppInfoPreferenceContr @Override public void updateState(Preference preference) { final PackageInfo packageInfo = mParent.getPackageInfo(); if (packageInfo != null && !AppUtils.isInstant(packageInfo.applicationInfo)) { if (packageInfo != null && !AppUtils.isInstant(packageInfo.applicationInfo) && !AppUtils.isBrowserApp(mContext, packageInfo.packageName, UserHandle.myUserId())) { preference.setVisible(true); preference.setSummary(AppUtils.getLaunchByDefaultSummary(mParent.getAppEntry(), mUsbManager, mPackageManager, mContext)); Loading @@ -70,5 +80,4 @@ public class AppOpenByDefaultPreferenceController extends AppInfoPreferenceContr protected Class<? extends SettingsPreferenceFragment> getDetailFragmentClass() { return AppLaunchSettings.class; } }
tests/robotests/src/com/android/settings/applications/appinfo/AppOpenByDefaultPreferenceControllerTest.java +46 −5 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.settings.applications.appinfo; import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; Loading @@ -26,8 +27,12 @@ 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.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import androidx.preference.Preference; import androidx.preference.PreferenceScreen; Loading @@ -37,6 +42,8 @@ import com.android.settingslib.applications.AppUtils; import com.android.settingslib.applications.ApplicationsState.AppEntry; import com.android.settingslib.applications.instantapps.InstantAppDataProvider; import com.google.common.collect.ImmutableList; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; Loading @@ -46,6 +53,8 @@ import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.util.ReflectionHelpers; import java.util.List; @RunWith(RobolectricTestRunner.class) public class AppOpenByDefaultPreferenceControllerTest { Loading @@ -55,6 +64,8 @@ public class AppOpenByDefaultPreferenceControllerTest { private PreferenceScreen mScreen; @Mock private Preference mPreference; @Mock private PackageManager mPackageManager; private Context mContext; private AppOpenByDefaultPreferenceController mController; Loading @@ -62,10 +73,11 @@ public class AppOpenByDefaultPreferenceControllerTest { @Before public void setUp() { MockitoAnnotations.initMocks(this); mContext = RuntimeEnvironment.application.getApplicationContext(); mContext = spy(RuntimeEnvironment.application.getApplicationContext()); mController = spy(new AppOpenByDefaultPreferenceController(mContext, "preferred_app")); mController.setParentFragment(mFragment); when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference); when(mContext.getPackageManager()).thenReturn(mPackageManager); } @Test Loading Loading @@ -146,13 +158,42 @@ public class AppOpenByDefaultPreferenceControllerTest { } @Test public void updateState_notInstantApp_shouldShowPreferenceAndSetSummary() { when(mFragment.getPackageInfo()).thenReturn(new PackageInfo()); public void updateState_isBrowserApp_shouldNotShowPreference() { final PackageInfo packageInfo = new PackageInfo(); packageInfo.packageName = "com.package.test.browser"; when(mFragment.getPackageInfo()).thenReturn(packageInfo); ReflectionHelpers.setStaticField(AppUtils.class, "sInstantAppDataProvider", (InstantAppDataProvider) (i -> false)); final ResolveInfo resolveInfo = new ResolveInfo(); resolveInfo.activityInfo = new ActivityInfo(); resolveInfo.handleAllWebDataURI = true; final List<ResolveInfo> resolveInfos = ImmutableList.of(resolveInfo); when(mPackageManager .queryIntentActivitiesAsUser(any(Intent.class), anyInt(), anyInt())) .thenReturn(resolveInfos); mController.updateState(mPreference); verify(mPreference).setVisible(false); } @Test public void updateState_notBrowserApp_notInstantApp_shouldShowPreferenceAndSetSummary() { final PackageInfo packageInfo = new PackageInfo(); packageInfo.packageName = "com.package.test.browser"; when(mFragment.getPackageInfo()).thenReturn(packageInfo); ReflectionHelpers.setStaticField(AppUtils.class, "sInstantAppDataProvider", (InstantAppDataProvider) (i -> false)); final ResolveInfo resolveInfo = new ResolveInfo(); resolveInfo.activityInfo = new ActivityInfo(); resolveInfo.handleAllWebDataURI = false; final List<ResolveInfo> resolveInfos = ImmutableList.of(resolveInfo); when(mPackageManager .queryIntentActivitiesAsUser(any(Intent.class), anyInt(), anyInt())) .thenReturn(resolveInfos); final AppEntry appEntry = mock(AppEntry.class); appEntry.info = new ApplicationInfo(); when(mFragment.getAppEntry()).thenReturn(appEntry); ReflectionHelpers.setStaticField(AppUtils.class, "sInstantAppDataProvider", (InstantAppDataProvider) (i -> false)); mController.updateState(mPreference); Loading