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

Commit f420d0f3 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Hide "Open by default" entirely for browser apps" into rvc-dev

parents 74755ac9 4ff357ad
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);