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

Commit e41e5444 authored by Ziad Youssef's avatar Ziad Youssef
Browse files

Block the disable option for WebView Default package

Test: atest ApplicationFeatureProviderImplTest

Bug: 308907090

Change-Id: I21785975b965b04895849d2df71fa2f2b4cb4b2d
parent 11df0d4c
Loading
Loading
Loading
Loading
+17 −0
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package com.android.settings.applications;

import static android.webkit.Flags.updateServiceV2;

import android.Manifest;
import android.app.admin.DevicePolicyManager;
import android.content.ComponentName;
@@ -41,6 +43,7 @@ import androidx.annotation.VisibleForTesting;

import com.android.internal.telephony.SmsApplication;
import com.android.settings.R;
import com.android.settings.webview.WebViewUpdateServiceWrapper;

import java.util.ArrayList;
import java.util.List;
@@ -54,6 +57,7 @@ public class ApplicationFeatureProviderImpl implements ApplicationFeatureProvide
    private final IPackageManager mPms;
    private final DevicePolicyManager mDpm;
    private final UserManager mUm;
    private final WebViewUpdateServiceWrapper mWebViewUpdateServiceWrapper;
    /** Flags to use when querying PackageManager for Euicc component implementations. */
    private static final int EUICC_QUERY_FLAGS =
            PackageManager.MATCH_SYSTEM_ONLY | PackageManager.MATCH_DEBUG_TRIAGED_MISSING
@@ -61,11 +65,16 @@ public class ApplicationFeatureProviderImpl implements ApplicationFeatureProvide

    public ApplicationFeatureProviderImpl(Context context, PackageManager pm,
            IPackageManager pms, DevicePolicyManager dpm) {
        this(context, pm, pms, dpm, new WebViewUpdateServiceWrapper());
    }
    public ApplicationFeatureProviderImpl(Context context, PackageManager pm,
            IPackageManager pms, DevicePolicyManager dpm, WebViewUpdateServiceWrapper wvusWrapper) {
        mContext = context.getApplicationContext();
        mPm = pm;
        mPms = pms;
        mDpm = dpm;
        mUm = UserManager.get(mContext);
        mWebViewUpdateServiceWrapper = wvusWrapper;
    }

    @Override
@@ -159,6 +168,14 @@ public class ApplicationFeatureProviderImpl implements ApplicationFeatureProvide
            keepEnabledPackages.add(euicc.packageName);
        }

        // Keep WebView default package enabled.
        if (updateServiceV2()) {
            String packageName = mWebViewUpdateServiceWrapper.getDefaultWebViewPackageName();
            if (packageName != null) {
                keepEnabledPackages.add(packageName);
            }
        }

        keepEnabledPackages.addAll(getEnabledPackageAllowlist());

        final LocationManager locationManager =
+22 −0
Original line number Diff line number Diff line
@@ -22,11 +22,14 @@ import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.RemoteException;
import android.util.Log;
import android.webkit.IWebViewUpdateService;
import android.webkit.UserPackage;
import android.webkit.WebViewFactory;
import android.webkit.WebViewProviderInfo;
import android.widget.Toast;

import androidx.annotation.Nullable;

import java.util.ArrayList;
import java.util.List;

@@ -104,5 +107,24 @@ public class WebViewUpdateServiceWrapper {
        toast.show();
    }

    /**
     * Fetch the package name of the default WebView provider.
     */
    @Nullable
    public String getDefaultWebViewPackageName() {
        try {
            IWebViewUpdateService service = WebViewFactory.getUpdateService();
            if (service != null) {
                WebViewProviderInfo provider = service.getDefaultWebViewPackage();
                if (provider != null) {
                    return provider.packageName;
                }
            }
        } catch (RemoteException e) {
            Log.e(TAG, "RemoteException when trying to fetch default WebView package Name", e);
        }
        return null;
    }

    static final int PACKAGE_FLAGS = PackageManager.MATCH_ANY_USER;
}
+1 −0
Original line number Diff line number Diff line
@@ -57,6 +57,7 @@ android_robolectric_test {
        "Settings_robolectric_meta_service_file",
        "SettingsLib-robo-testutils",
        "Settings-robo-testutils",
        "android.webkit.flags-aconfig-java",
        "androidx.test.core",
        "androidx.test.espresso.core",
        "androidx.test.ext.junit",
+33 −1
Original line number Diff line number Diff line
@@ -37,13 +37,20 @@ import android.location.LocationManager;
import android.os.Build;
import android.os.UserHandle;
import android.os.UserManager;
import android.platform.test.annotations.RequiresFlagsDisabled;
import android.platform.test.annotations.RequiresFlagsEnabled;
import android.platform.test.flag.junit.CheckFlagsRule;
import android.platform.test.flag.junit.DeviceFlagsValueProvider;
import android.webkit.Flags;

import com.android.settings.testutils.ApplicationTestUtils;
import com.android.settings.webview.WebViewUpdateServiceWrapper;
import com.android.settingslib.testutils.shadow.ShadowDefaultDialerManager;
import com.android.settingslib.testutils.shadow.ShadowSmsApplication;

import org.junit.Before;
import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -67,6 +74,9 @@ import java.util.Set;
@LooperMode(LooperMode.Mode.LEGACY)
public final class ApplicationFeatureProviderImplTest {

    @Rule
    public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();

    private final int MAIN_USER_ID = 0;
    private final int MANAGED_PROFILE_ID = 10;

@@ -91,6 +101,8 @@ public final class ApplicationFeatureProviderImplTest {
    private DevicePolicyManager mDevicePolicyManager;
    @Mock
    private LocationManager mLocationManager;
    @Mock
    private WebViewUpdateServiceWrapper mWebViewUpdateServiceWrapper;

    private ApplicationFeatureProvider mProvider;

@@ -106,7 +118,7 @@ public final class ApplicationFeatureProviderImplTest {
        when(mContext.getSystemService(Context.LOCATION_SERVICE)).thenReturn(mLocationManager);

        mProvider = new ApplicationFeatureProviderImpl(mContext, mPackageManager,
                mPackageManagerService, mDevicePolicyManager);
                mPackageManagerService, mDevicePolicyManager, mWebViewUpdateServiceWrapper);
    }

    private void verifyCalculateNumberOfPolicyInstalledApps(boolean async) {
@@ -341,6 +353,26 @@ public final class ApplicationFeatureProviderImplTest {
        assertThat(allowlist).contains("com.android.settings.intelligence");
    }

    @Test
    @RequiresFlagsEnabled(Flags.FLAG_UPDATE_SERVICE_V2)
    public void getKeepEnabledPackages_shouldContainWebViewPackage() {
        final String testWebViewPackageName = "com.android.webview";
        when(mWebViewUpdateServiceWrapper.getDefaultWebViewPackageName())
                .thenReturn(testWebViewPackageName);
        final Set<String> allowlist = mProvider.getKeepEnabledPackages();
        assertThat(allowlist).contains(testWebViewPackageName);
    }

    @Test
    @RequiresFlagsDisabled(Flags.FLAG_UPDATE_SERVICE_V2)
    public void getKeepEnabledPackages_shouldNotContainWebViewPackageIfFlagDisabled() {
        final String testWebViewPackageName = "com.android.webview";
        when(mWebViewUpdateServiceWrapper.getDefaultWebViewPackageName())
                .thenReturn(testWebViewPackageName);
        final Set<String> allowlist = mProvider.getKeepEnabledPackages();
        assertThat(allowlist).doesNotContain(testWebViewPackageName);
    }

    @Test
    @Config(shadows = {ShadowSmsApplication.class, ShadowDefaultDialerManager.class})
    public void getKeepEnabledPackages_shouldContainPackageInstaller() {