Loading src/com/android/settings/applications/ApplicationFeatureProviderImpl.java +17 −0 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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 Loading @@ -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 Loading Loading @@ -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 = Loading src/com/android/settings/webview/WebViewUpdateServiceWrapper.java +22 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; } tests/robotests/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -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", Loading tests/robotests/src/com/android/settings/applications/ApplicationFeatureProviderImplTest.java +33 −1 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -91,6 +101,8 @@ public final class ApplicationFeatureProviderImplTest { private DevicePolicyManager mDevicePolicyManager; @Mock private LocationManager mLocationManager; @Mock private WebViewUpdateServiceWrapper mWebViewUpdateServiceWrapper; private ApplicationFeatureProvider mProvider; Loading @@ -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) { Loading Loading @@ -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() { Loading Loading
src/com/android/settings/applications/ApplicationFeatureProviderImpl.java +17 −0 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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 Loading @@ -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 Loading Loading @@ -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 = Loading
src/com/android/settings/webview/WebViewUpdateServiceWrapper.java +22 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; }
tests/robotests/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -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", Loading
tests/robotests/src/com/android/settings/applications/ApplicationFeatureProviderImplTest.java +33 −1 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -91,6 +101,8 @@ public final class ApplicationFeatureProviderImplTest { private DevicePolicyManager mDevicePolicyManager; @Mock private LocationManager mLocationManager; @Mock private WebViewUpdateServiceWrapper mWebViewUpdateServiceWrapper; private ApplicationFeatureProvider mProvider; Loading @@ -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) { Loading Loading @@ -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() { Loading