Merge "Block the disable option for WebView Default package" into main

This commit is contained in:
Treehugger Robot
2023-12-18 15:59:38 +00:00
committed by Android (Google) Code Review
4 changed files with 73 additions and 1 deletions

View File

@@ -16,6 +16,8 @@
package com.android.settings.applications; package com.android.settings.applications;
import static android.webkit.Flags.updateServiceV2;
import android.Manifest; import android.Manifest;
import android.app.admin.DevicePolicyManager; import android.app.admin.DevicePolicyManager;
import android.content.ComponentName; import android.content.ComponentName;
@@ -41,6 +43,7 @@ import androidx.annotation.VisibleForTesting;
import com.android.internal.telephony.SmsApplication; import com.android.internal.telephony.SmsApplication;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.webview.WebViewUpdateServiceWrapper;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@@ -54,6 +57,7 @@ public class ApplicationFeatureProviderImpl implements ApplicationFeatureProvide
private final IPackageManager mPms; private final IPackageManager mPms;
private final DevicePolicyManager mDpm; private final DevicePolicyManager mDpm;
private final UserManager mUm; private final UserManager mUm;
private final WebViewUpdateServiceWrapper mWebViewUpdateServiceWrapper;
/** Flags to use when querying PackageManager for Euicc component implementations. */ /** Flags to use when querying PackageManager for Euicc component implementations. */
private static final int EUICC_QUERY_FLAGS = private static final int EUICC_QUERY_FLAGS =
PackageManager.MATCH_SYSTEM_ONLY | PackageManager.MATCH_DEBUG_TRIAGED_MISSING PackageManager.MATCH_SYSTEM_ONLY | PackageManager.MATCH_DEBUG_TRIAGED_MISSING
@@ -61,11 +65,16 @@ public class ApplicationFeatureProviderImpl implements ApplicationFeatureProvide
public ApplicationFeatureProviderImpl(Context context, PackageManager pm, public ApplicationFeatureProviderImpl(Context context, PackageManager pm,
IPackageManager pms, DevicePolicyManager dpm) { 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(); mContext = context.getApplicationContext();
mPm = pm; mPm = pm;
mPms = pms; mPms = pms;
mDpm = dpm; mDpm = dpm;
mUm = UserManager.get(mContext); mUm = UserManager.get(mContext);
mWebViewUpdateServiceWrapper = wvusWrapper;
} }
@Override @Override
@@ -159,6 +168,14 @@ public class ApplicationFeatureProviderImpl implements ApplicationFeatureProvide
keepEnabledPackages.add(euicc.packageName); keepEnabledPackages.add(euicc.packageName);
} }
// Keep WebView default package enabled.
if (updateServiceV2()) {
String packageName = mWebViewUpdateServiceWrapper.getDefaultWebViewPackageName();
if (packageName != null) {
keepEnabledPackages.add(packageName);
}
}
keepEnabledPackages.addAll(getEnabledPackageAllowlist()); keepEnabledPackages.addAll(getEnabledPackageAllowlist());
final LocationManager locationManager = final LocationManager locationManager =

View File

@@ -22,11 +22,14 @@ import android.content.pm.PackageInfo;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.os.RemoteException; import android.os.RemoteException;
import android.util.Log; import android.util.Log;
import android.webkit.IWebViewUpdateService;
import android.webkit.UserPackage; import android.webkit.UserPackage;
import android.webkit.WebViewFactory; import android.webkit.WebViewFactory;
import android.webkit.WebViewProviderInfo; import android.webkit.WebViewProviderInfo;
import android.widget.Toast; import android.widget.Toast;
import androidx.annotation.Nullable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@@ -104,5 +107,24 @@ public class WebViewUpdateServiceWrapper {
toast.show(); 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; static final int PACKAGE_FLAGS = PackageManager.MATCH_ANY_USER;
} }

View File

@@ -57,6 +57,7 @@ android_robolectric_test {
"Settings_robolectric_meta_service_file", "Settings_robolectric_meta_service_file",
"SettingsLib-robo-testutils", "SettingsLib-robo-testutils",
"Settings-robo-testutils", "Settings-robo-testutils",
"android.webkit.flags-aconfig-java",
"androidx.test.core", "androidx.test.core",
"androidx.test.espresso.core", "androidx.test.espresso.core",
"androidx.test.ext.junit", "androidx.test.ext.junit",

View File

@@ -37,13 +37,20 @@ import android.location.LocationManager;
import android.os.Build; import android.os.Build;
import android.os.UserHandle; import android.os.UserHandle;
import android.os.UserManager; 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.testutils.ApplicationTestUtils;
import com.android.settings.webview.WebViewUpdateServiceWrapper;
import com.android.settingslib.testutils.shadow.ShadowDefaultDialerManager; import com.android.settingslib.testutils.shadow.ShadowDefaultDialerManager;
import com.android.settingslib.testutils.shadow.ShadowSmsApplication; import com.android.settingslib.testutils.shadow.ShadowSmsApplication;
import org.junit.Before; import org.junit.Before;
import org.junit.Ignore; import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.mockito.Mock; import org.mockito.Mock;
@@ -67,6 +74,9 @@ import java.util.Set;
@LooperMode(LooperMode.Mode.LEGACY) @LooperMode(LooperMode.Mode.LEGACY)
public final class ApplicationFeatureProviderImplTest { public final class ApplicationFeatureProviderImplTest {
@Rule
public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
private final int MAIN_USER_ID = 0; private final int MAIN_USER_ID = 0;
private final int MANAGED_PROFILE_ID = 10; private final int MANAGED_PROFILE_ID = 10;
@@ -91,6 +101,8 @@ public final class ApplicationFeatureProviderImplTest {
private DevicePolicyManager mDevicePolicyManager; private DevicePolicyManager mDevicePolicyManager;
@Mock @Mock
private LocationManager mLocationManager; private LocationManager mLocationManager;
@Mock
private WebViewUpdateServiceWrapper mWebViewUpdateServiceWrapper;
private ApplicationFeatureProvider mProvider; private ApplicationFeatureProvider mProvider;
@@ -106,7 +118,7 @@ public final class ApplicationFeatureProviderImplTest {
when(mContext.getSystemService(Context.LOCATION_SERVICE)).thenReturn(mLocationManager); when(mContext.getSystemService(Context.LOCATION_SERVICE)).thenReturn(mLocationManager);
mProvider = new ApplicationFeatureProviderImpl(mContext, mPackageManager, mProvider = new ApplicationFeatureProviderImpl(mContext, mPackageManager,
mPackageManagerService, mDevicePolicyManager); mPackageManagerService, mDevicePolicyManager, mWebViewUpdateServiceWrapper);
} }
private void verifyCalculateNumberOfPolicyInstalledApps(boolean async) { private void verifyCalculateNumberOfPolicyInstalledApps(boolean async) {
@@ -341,6 +353,26 @@ public final class ApplicationFeatureProviderImplTest {
assertThat(allowlist).contains("com.android.settings.intelligence"); 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 @Test
@Config(shadows = {ShadowSmsApplication.class, ShadowDefaultDialerManager.class}) @Config(shadows = {ShadowSmsApplication.class, ShadowDefaultDialerManager.class})
public void getKeepEnabledPackages_shouldContainPackageInstaller() { public void getKeepEnabledPackages_shouldContainPackageInstaller() {