Make Mainline Module update intent explicit

Change-Id: Iaacbebcb5328d50f0bdaa554782144315140e143
Test: Existing unit test
Test: on-device verified tapping UI element still navigates to Play's update screen (About phone > Android version > Google Play system update)
Bug: 278987474
diff --git a/aconfig/settings_flag_declarations.aconfig b/aconfig/settings_flag_declarations.aconfig
index c4c33b0..56c4b32 100644
--- a/aconfig/settings_flag_declarations.aconfig
+++ b/aconfig/settings_flag_declarations.aconfig
@@ -6,3 +6,10 @@
     description: "This flag controls whether to show a Cancel button when factory reset"
     bug: "300634367"
 }
+
+flag {
+    name: "mainline_module_explicit_intent"
+    namespace: "android_settings"
+    description: "Enabling will provide an explicit package name for Intent to update mainline modules"
+    bug: "278987474"
+}
diff --git a/res/values/config.xml b/res/values/config.xml
old mode 100755
new mode 100644
index 7af29c8..73ee108
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -782,4 +782,7 @@
         <item>@layout/screen_zoom_preview_1</item>
         <item>@layout/accessibility_text_reading_preview_mail_content</item>
     </array>
+
+    <!-- Package responsible for updating Mainline Modules -->
+    <string name="config_mainline_module_update_package" translatable="false">com.android.vending</string>
 </resources>
diff --git a/src/com/android/settings/deviceinfo/firmwareversion/MainlineModuleVersionPreferenceController.java b/src/com/android/settings/deviceinfo/firmwareversion/MainlineModuleVersionPreferenceController.java
index fb17eca..39b8290 100644
--- a/src/com/android/settings/deviceinfo/firmwareversion/MainlineModuleVersionPreferenceController.java
+++ b/src/com/android/settings/deviceinfo/firmwareversion/MainlineModuleVersionPreferenceController.java
@@ -28,6 +28,7 @@
 import androidx.preference.Preference;
 
 import com.android.settings.core.BasePreferenceController;
+import com.android.settings.flags.Flags;
 
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
@@ -43,14 +44,15 @@
     private static final String TAG = "MainlineModuleControl";
     private static final List<String> VERSION_NAME_DATE_PATTERNS = Arrays.asList("yyyy-MM-dd",
             "yyyy-MM");
-
     @VisibleForTesting
-    static final Intent MODULE_UPDATE_INTENT =
-            new Intent("android.settings.MODULE_UPDATE_SETTINGS");
+    static final String MODULE_UPDATE_INTENT_ACTION =
+        "android.settings.MODULE_UPDATE_SETTINGS";
     @VisibleForTesting
-    static final Intent MODULE_UPDATE_V2_INTENT =
-            new Intent("android.settings.MODULE_UPDATE_VERSIONS");
+    static final String MODULE_UPDATE_V2_INTENT_ACTION =
+        "android.settings.MODULE_UPDATE_VERSIONS";
 
+    private final Intent mModuleUpdateIntent;
+    private final Intent mModuleUpdateV2Intent;
     private final PackageManager mPackageManager;
 
     private String mModuleVersion;
@@ -58,6 +60,14 @@
     public MainlineModuleVersionPreferenceController(Context context, String key) {
         super(context, key);
         mPackageManager = mContext.getPackageManager();
+        mModuleUpdateIntent = new Intent(MODULE_UPDATE_INTENT_ACTION);
+        mModuleUpdateV2Intent = new Intent(MODULE_UPDATE_V2_INTENT_ACTION);
+        if (Flags.mainlineModuleExplicitIntent()) {
+          String packageName = mContext
+              .getString(com.android.settings.R.string.config_mainline_module_update_package);
+          mModuleUpdateIntent.setPackage(packageName);
+          mModuleUpdateV2Intent.setPackage(packageName);
+        }
         initModules();
     }
 
@@ -86,17 +96,17 @@
         super.updateState(preference);
 
         final ResolveInfo resolvedV2 =
-                mPackageManager.resolveActivity(MODULE_UPDATE_V2_INTENT, 0 /* flags */);
+                mPackageManager.resolveActivity(mModuleUpdateV2Intent, 0 /* flags */);
         if (resolvedV2 != null) {
-            preference.setIntent(MODULE_UPDATE_V2_INTENT);
+            preference.setIntent(mModuleUpdateV2Intent);
             preference.setSelectable(true);
             return;
         }
 
         final ResolveInfo resolved =
-                mPackageManager.resolveActivity(MODULE_UPDATE_INTENT, 0 /* flags */);
+                mPackageManager.resolveActivity(mModuleUpdateIntent, 0 /* flags */);
         if (resolved != null) {
-            preference.setIntent(MODULE_UPDATE_INTENT);
+            preference.setIntent(mModuleUpdateIntent);
             preference.setSelectable(true);
         } else {
             Log.d(TAG, "The ResolveInfo of the update intent is null.");
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/firmwareversion/MainlineModuleVersionPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/firmwareversion/MainlineModuleVersionPreferenceControllerTest.java
index 9129906..a326061 100644
--- a/tests/robotests/src/com/android/settings/deviceinfo/firmwareversion/MainlineModuleVersionPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/deviceinfo/firmwareversion/MainlineModuleVersionPreferenceControllerTest.java
@@ -18,8 +18,8 @@
 
 import static com.android.settings.core.BasePreferenceController.AVAILABLE;
 import static com.android.settings.core.BasePreferenceController.UNSUPPORTED_ON_DEVICE;
-import static com.android.settings.deviceinfo.firmwareversion.MainlineModuleVersionPreferenceController.MODULE_UPDATE_INTENT;
-import static com.android.settings.deviceinfo.firmwareversion.MainlineModuleVersionPreferenceController.MODULE_UPDATE_V2_INTENT;
+import static com.android.settings.deviceinfo.firmwareversion.MainlineModuleVersionPreferenceController.MODULE_UPDATE_INTENT_ACTION;
+import static com.android.settings.deviceinfo.firmwareversion.MainlineModuleVersionPreferenceController.MODULE_UPDATE_V2_INTENT_ACTION;
 
 import static com.google.common.truth.Truth.assertThat;
 
@@ -29,13 +29,18 @@
 import static org.mockito.Mockito.when;
 
 import android.content.Context;
+import android.content.Intent;
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
+import android.platform.test.annotations.RequiresFlagsEnabled;
+import android.platform.test.flag.junit.CheckFlagsRule;
+import android.platform.test.flag.junit.DeviceFlagsValueProvider;
 
 import androidx.preference.Preference;
 
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
@@ -46,6 +51,15 @@
 @RunWith(RobolectricTestRunner.class)
 public class MainlineModuleVersionPreferenceControllerTest {
 
+    private static final String MODULE_PACKAGE = "com.android.vending";
+    private static final Intent MODULE_UPDATE_V2_INTENT =
+        new Intent(MODULE_UPDATE_V2_INTENT_ACTION).setPackage(MODULE_PACKAGE);
+    private static final Intent MODULE_UPDATE_INTENT =
+        new Intent(MODULE_UPDATE_INTENT_ACTION).setPackage(MODULE_PACKAGE);
+
+    @Rule
+    public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
+
     @Mock
     private PackageManager mPackageManager;
 
@@ -58,6 +72,9 @@
         mContext = spy(RuntimeEnvironment.application);
         mPreference = new Preference(mContext);
         when(mContext.getPackageManager()).thenReturn(mPackageManager);
+        when(mContext
+                 .getString(com.android.settings.R.string.config_mainline_module_update_package))
+                .thenReturn(MODULE_PACKAGE);
     }
 
     @Test
@@ -123,6 +140,7 @@
         assertThat(mPreference.isSelectable()).isTrue();
     }
 
+    @RequiresFlagsEnabled(com.android.settings.flags.Flags.FLAG_MAINLINE_MODULE_EXPLICIT_INTENT)
     @Test
     public void updateState_canHandleIntent_setIntentToPreference() throws Exception {
         setupModulePackage("test version 123");
@@ -137,6 +155,7 @@
         assertThat(mPreference.getIntent()).isEqualTo(MODULE_UPDATE_INTENT);
     }
 
+    @RequiresFlagsEnabled(com.android.settings.flags.Flags.FLAG_MAINLINE_MODULE_EXPLICIT_INTENT)
     @Test
     public void updateState_canHandleIntent_preferenceShouldBeSelectable() throws Exception {
         setupModulePackage("test version 123");
@@ -151,6 +170,7 @@
         assertThat(mPreference.isSelectable()).isTrue();
     }
 
+    @RequiresFlagsEnabled(com.android.settings.flags.Flags.FLAG_MAINLINE_MODULE_EXPLICIT_INTENT)
     @Test
     public void updateState_cannotHandleIntent_setNullToPreference() throws Exception {
         setupModulePackage("test version 123");