From e41e5444e96ac88a1e735b801be3b55b78fcf1d5 Mon Sep 17 00:00:00 2001 From: Ziad Youssef Date: Tue, 12 Dec 2023 14:57:26 +0000 Subject: [PATCH] Block the disable option for WebView Default package Test: atest ApplicationFeatureProviderImplTest Bug: 308907090 Change-Id: I21785975b965b04895849d2df71fa2f2b4cb4b2d --- .../ApplicationFeatureProviderImpl.java | 17 ++++++++++ .../webview/WebViewUpdateServiceWrapper.java | 22 ++++++++++++ tests/robotests/Android.bp | 1 + .../ApplicationFeatureProviderImplTest.java | 34 ++++++++++++++++++- 4 files changed, 73 insertions(+), 1 deletion(-) diff --git a/src/com/android/settings/applications/ApplicationFeatureProviderImpl.java b/src/com/android/settings/applications/ApplicationFeatureProviderImpl.java index 80d39475931..081d99a77e8 100644 --- a/src/com/android/settings/applications/ApplicationFeatureProviderImpl.java +++ b/src/com/android/settings/applications/ApplicationFeatureProviderImpl.java @@ -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 = diff --git a/src/com/android/settings/webview/WebViewUpdateServiceWrapper.java b/src/com/android/settings/webview/WebViewUpdateServiceWrapper.java index ff4ae41a603..05855e4f348 100644 --- a/src/com/android/settings/webview/WebViewUpdateServiceWrapper.java +++ b/src/com/android/settings/webview/WebViewUpdateServiceWrapper.java @@ -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; } diff --git a/tests/robotests/Android.bp b/tests/robotests/Android.bp index 95a78c75ab2..d313878b2fa 100644 --- a/tests/robotests/Android.bp +++ b/tests/robotests/Android.bp @@ -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", diff --git a/tests/robotests/src/com/android/settings/applications/ApplicationFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/applications/ApplicationFeatureProviderImplTest.java index 6bed1bc42cc..bac0de9f5ff 100644 --- a/tests/robotests/src/com/android/settings/applications/ApplicationFeatureProviderImplTest.java +++ b/tests/robotests/src/com/android/settings/applications/ApplicationFeatureProviderImplTest.java @@ -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 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 allowlist = mProvider.getKeepEnabledPackages(); + assertThat(allowlist).doesNotContain(testWebViewPackageName); + } + @Test @Config(shadows = {ShadowSmsApplication.class, ShadowDefaultDialerManager.class}) public void getKeepEnabledPackages_shouldContainPackageInstaller() {