Keep "None" set for assistant upon device upgrade.

If the assistant role is added for the first time, the device is
upgrading, and legacy role resolution didn't set any holder, it
implies the user selected "None" for assistant, and we need to keep
that in our new implementation.

Fixes: 141255935
Test: manual
Test: Upgrade P => Q without this CL and "None" assistant is lost
Test: Upgrade P => Q with this CL and "None" assistant is kept
Test: Fresh Q with this CL gets the default assistant set
Change-Id: Ie2668d29c43751686dbe9523bcc298b73618fc91
(cherry picked from commit 2055184476e39e013219924616fc3d9b002ad494)
diff --git a/src/com/android/packageinstaller/role/model/AssistantRoleBehavior.java b/src/com/android/packageinstaller/role/model/AssistantRoleBehavior.java
index f79522e..bd08349 100644
--- a/src/com/android/packageinstaller/role/model/AssistantRoleBehavior.java
+++ b/src/com/android/packageinstaller/role/model/AssistantRoleBehavior.java
@@ -18,6 +18,7 @@
 
 import android.app.ActivityManager;
 import android.app.Application;
+import android.app.role.RoleManager;
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.PackageManager;
@@ -25,6 +26,7 @@
 import android.content.pm.ServiceInfo;
 import android.content.res.Resources;
 import android.content.res.XmlResourceParser;
+import android.os.Process;
 import android.os.UserHandle;
 import android.provider.Settings;
 import android.service.voice.VoiceInteractionService;
@@ -59,6 +61,20 @@
     private static final Intent ASSIST_ACTIVITY_PROBE = new Intent(Intent.ACTION_ASSIST);
 
     @Override
+    public void onRoleAdded(@NonNull Role role, @NonNull Context context) {
+        PackageManager packageManager = context.getPackageManager();
+        if (packageManager.isDeviceUpgrading()) {
+            RoleManager roleManager = context.getSystemService(RoleManager.class);
+            List<String> packageNames = roleManager.getRoleHolders(role.getName());
+            if (packageNames.isEmpty()) {
+                // If the device was upgraded, and there isn't any legacy role holders, it means
+                // user selected "None" in Settings and we need to keep that.
+                role.onNoneHolderSelectedAsUser(Process.myUserHandle(), context);
+            }
+        }
+    }
+
+    @Override
     public boolean isAvailableAsUser(@NonNull Role role, @NonNull UserHandle user,
             @NonNull Context context) {
         return !UserUtils.isWorkProfile(user, context);
diff --git a/src/com/android/packageinstaller/role/model/Role.java b/src/com/android/packageinstaller/role/model/Role.java
index e3332db..281e964 100644
--- a/src/com/android/packageinstaller/role/model/Role.java
+++ b/src/com/android/packageinstaller/role/model/Role.java
@@ -254,6 +254,17 @@
     }
 
     /**
+     * Callback when this role is added to the system for the first time.
+     *
+     * @param context the {@code Context} to retrieve system services
+     */
+    public void onRoleAdded(@NonNull Context context) {
+        if (mBehavior != null) {
+            mBehavior.onRoleAdded(this, context);
+        }
+    }
+
+    /**
      * Check whether this role is available.
      *
      * @param user the user to check for
diff --git a/src/com/android/packageinstaller/role/model/RoleBehavior.java b/src/com/android/packageinstaller/role/model/RoleBehavior.java
index 41ffb45..a43d7ad 100644
--- a/src/com/android/packageinstaller/role/model/RoleBehavior.java
+++ b/src/com/android/packageinstaller/role/model/RoleBehavior.java
@@ -36,6 +36,11 @@
 public interface RoleBehavior {
 
     /**
+     * @see Role#onRoleAdded(Context)
+     */
+    default void onRoleAdded(@NonNull Role role, @NonNull Context context) {}
+
+    /**
      * @see Role#isAvailableAsUser(UserHandle, Context)
      */
     default boolean isAvailableAsUser(@NonNull Role role, @NonNull UserHandle user,
diff --git a/src/com/android/packageinstaller/role/service/RoleControllerServiceImpl.java b/src/com/android/packageinstaller/role/service/RoleControllerServiceImpl.java
index bee4320..d45d6bb 100644
--- a/src/com/android/packageinstaller/role/service/RoleControllerServiceImpl.java
+++ b/src/com/android/packageinstaller/role/service/RoleControllerServiceImpl.java
@@ -89,6 +89,14 @@
         // Set the available role names in RoleManager.
         mRoleManager.setRoleNamesFromController(roleNames);
 
+        int addedRoleNamesSize = addedRoleNames.size();
+        for (int i = 0; i < addedRoleNamesSize; i++) {
+            String roleName = addedRoleNames.valueAt(i);
+
+            Role role = roleMap.get(roleName);
+            role.onRoleAdded(this);
+        }
+
         // Go through the holders of all roles.
         int rolesSize = roles.size();
         for (int rolesIndex = 0; rolesIndex < rolesSize; rolesIndex++) {