Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4ff357ad authored by Yi-Ling Chuang's avatar Yi-Ling Chuang
Browse files

Hide "Open by default" entirely for browser apps

Browsers are explicitly treated outside the web link infrastructure, so
we shouldn't offer "Open by default" section.

Fixes: 129162570
Test: robotests
Change-Id: Ie63d5fbfb32eaed4bba8a80158b6bb19bb45b380
parent 68cc44bb
Loading
Loading
Loading
Loading
+2 −31
Original line number Diff line number Diff line
@@ -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;
@@ -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 {
@@ -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;
@@ -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;

@@ -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:
+5 −1
Original line number Diff line number Diff line
@@ -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)
+11 −2
Original line number Diff line number Diff line
@@ -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;
@@ -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);
@@ -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);
@@ -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));
@@ -70,5 +80,4 @@ public class AppOpenByDefaultPreferenceController extends AppInfoPreferenceContr
    protected Class<? extends SettingsPreferenceFragment> getDetailFragmentClass() {
        return AppLaunchSettings.class;
    }

}
+46 −5
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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;
@@ -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 {

@@ -55,6 +64,8 @@ public class AppOpenByDefaultPreferenceControllerTest {
    private PreferenceScreen mScreen;
    @Mock
    private Preference mPreference;
    @Mock
    private PackageManager mPackageManager;

    private Context mContext;
    private AppOpenByDefaultPreferenceController mController;
@@ -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
@@ -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);