summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/webkit/WebViewFactoryProvider.java33
-rw-r--r--core/java/android/webkit/flags.aconfig8
-rw-r--r--services/tests/servicestests/src/com/android/server/webkit/WebViewUpdateServiceTest.java52
3 files changed, 89 insertions, 4 deletions
diff --git a/core/java/android/webkit/WebViewFactoryProvider.java b/core/java/android/webkit/WebViewFactoryProvider.java
index e1e2e8cd35d7..4a2f9ba696a5 100644
--- a/core/java/android/webkit/WebViewFactoryProvider.java
+++ b/core/java/android/webkit/WebViewFactoryProvider.java
@@ -36,16 +36,31 @@ import java.util.List;
*/
@SystemApi
public interface WebViewFactoryProvider {
- /** @hide */
+ /**
+ * Used as the requirement when Flags.useBEntryPoint() is false.
+ * @hide
+ */
int MINIMUM_SUPPORTED_TARGET_SDK = Build.VERSION_CODES.TIRAMISU;
/**
+ * Used as the requirement when Flags.useBEntryPoint() is true.
+ * TODO: set to the actual minimum required version code - this is just the
+ * version shipped in V.
+ * @hide
+ */
+ long MINIMUM_SUPPORTED_VERSION_CODE = 661308800L;
+
+ /**
* Returns whether the WebView implementation represented by {@code packageInfo}
* is compatible with this version of Android.
* @hide
*/
static boolean isCompatibleImplementationPackage(@NonNull PackageInfo packageInfo) {
- return packageInfo.applicationInfo.targetSdkVersion >= MINIMUM_SUPPORTED_TARGET_SDK;
+ if (Flags.useBEntryPoint()) {
+ return packageInfo.versionCode >= MINIMUM_SUPPORTED_VERSION_CODE;
+ } else {
+ return packageInfo.applicationInfo.targetSdkVersion >= MINIMUM_SUPPORTED_TARGET_SDK;
+ }
}
/**
@@ -54,7 +69,13 @@ public interface WebViewFactoryProvider {
* @hide
*/
static @NonNull String describeCompatibleImplementationPackage() {
- return TextUtils.formatSimple("Minimum targetSdkVersion: %d", MINIMUM_SUPPORTED_TARGET_SDK);
+ if (Flags.useBEntryPoint()) {
+ return TextUtils.formatSimple("Minimum versionCode for OS support: %d",
+ MINIMUM_SUPPORTED_VERSION_CODE);
+ } else {
+ return TextUtils.formatSimple("Minimum targetSdkVersion: %d",
+ MINIMUM_SUPPORTED_TARGET_SDK);
+ }
}
/**
@@ -63,7 +84,11 @@ public interface WebViewFactoryProvider {
* @hide
*/
static @NonNull String getWebViewFactoryClassName() {
- return "com.android.webview.chromium.WebViewChromiumFactoryProviderForT";
+ if (Flags.useBEntryPoint()) {
+ return "com.android.webview.chromium.WebViewChromiumFactoryProviderForB";
+ } else {
+ return "com.android.webview.chromium.WebViewChromiumFactoryProviderForT";
+ }
}
/**
diff --git a/core/java/android/webkit/flags.aconfig b/core/java/android/webkit/flags.aconfig
index c9e94d2f57f6..c5176a2f1f15 100644
--- a/core/java/android/webkit/flags.aconfig
+++ b/core/java/android/webkit/flags.aconfig
@@ -42,3 +42,11 @@ flag {
description: "New APIs required by File System Access"
bug: "40101963"
}
+
+flag {
+ name: "use_b_entry_point"
+ namespace: "webview"
+ description: "Use B-specific entry point to WebView APK"
+ bug: "373617389"
+ is_fixed_read_only: true
+}
diff --git a/services/tests/servicestests/src/com/android/server/webkit/WebViewUpdateServiceTest.java b/services/tests/servicestests/src/com/android/server/webkit/WebViewUpdateServiceTest.java
index 0b1b54804b5e..bf99b6af2345 100644
--- a/services/tests/servicestests/src/com/android/server/webkit/WebViewUpdateServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/webkit/WebViewUpdateServiceTest.java
@@ -25,9 +25,12 @@ import android.content.pm.PackageInfo;
import android.content.pm.Signature;
import android.os.Build;
import android.os.Bundle;
+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.util.Base64;
+import android.webkit.Flags;
import android.webkit.WebViewFactory;
import android.webkit.WebViewProviderInfo;
import android.webkit.WebViewProviderResponse;
@@ -1239,6 +1242,7 @@ public class WebViewUpdateServiceTest {
* that packages targeting an older version are not valid.
*/
@Test
+ @RequiresFlagsDisabled(Flags.FLAG_USE_B_ENTRY_POINT)
public void testTargetSdkVersionValidity() {
PackageInfo newSdkPackage = createPackageInfo("newTargetSdkPackage",
true /* enabled */, true /* valid */, true /* installed */);
@@ -1280,6 +1284,54 @@ public class WebViewUpdateServiceTest {
1 /* first preparation phase */);
}
+ /**
+ * Ensure that packages with a versionCode new enough for the current platform are valid, and
+ * that older packages are not valid.
+ */
+ @Test
+ @RequiresFlagsEnabled(Flags.FLAG_USE_B_ENTRY_POINT)
+ public void testVersionCodeOSCompatValidity() {
+ PackageInfo newVersionPackage = createPackageInfo("newVersionPackage",
+ true /* enabled */, true /* valid */, true /* installed */);
+ newVersionPackage.setLongVersionCode(200L);
+ PackageInfo currentVersionPackage = createPackageInfo("currentVersionPackage",
+ true /* enabled */, true /* valid */, true /* installed */);
+ currentVersionPackage.setLongVersionCode(100L);
+ PackageInfo oldVersionPackage = createPackageInfo("oldVersionPackage",
+ true /* enabled */, true /* valid */, true /* installed */);
+ oldVersionPackage.setLongVersionCode(50L);
+
+ WebViewProviderInfo newVersionProviderInfo =
+ new WebViewProviderInfo(newVersionPackage.packageName, "", true, false, null);
+ WebViewProviderInfo currentVersionProviderInfo =
+ new WebViewProviderInfo(currentVersionPackage.packageName, "", true, false, null);
+ WebViewProviderInfo[] packages =
+ new WebViewProviderInfo[] {
+ currentVersionProviderInfo,
+ new WebViewProviderInfo(oldVersionPackage.packageName, "", true, false, null),
+ newVersionProviderInfo
+ };
+ setupWithPackages(packages);
+ // Mock the compatibility predicate as requiring 100 as versionCode.
+ mTestSystemImpl.setCompatibilityPredicate(
+ pi -> pi.getLongVersionCode() >= 100L);
+ // Start with the setting pointing to the invalid package
+ mTestSystemImpl.updateUserSetting(oldVersionPackage.packageName);
+
+ mTestSystemImpl.setPackageInfo(newVersionPackage);
+ mTestSystemImpl.setPackageInfo(currentVersionPackage);
+ mTestSystemImpl.setPackageInfo(oldVersionPackage);
+
+ assertArrayEquals(
+ new WebViewProviderInfo[] { currentVersionProviderInfo, newVersionProviderInfo },
+ mWebViewUpdateServiceImpl.getValidWebViewPackages());
+
+ runWebViewBootPreparationOnMainSync();
+
+ checkPreparationPhasesForPackage(currentVersionPackage.packageName,
+ 1 /* first preparation phase */);
+ }
+
@Test
public void testDefaultWebViewPackageIsTheFirstAvailableByDefault() {
String nonDefaultPackage = "nonDefaultPackage";