Migrate emergency default app to role manager.

Bug: 123293861
Test: atest DefaultEmergencyPickerTest

Change-Id: I07f5e0b23a2fff91d724348a682ee3aab4ce51ec
diff --git a/src/com/android/phone/EmergencyAssistanceHelper.java b/src/com/android/phone/EmergencyAssistanceHelper.java
index 9e1ac21..a98d81d 100644
--- a/src/com/android/phone/EmergencyAssistanceHelper.java
+++ b/src/com/android/phone/EmergencyAssistanceHelper.java
@@ -16,6 +16,8 @@
 
 package com.android.phone;
 
+import android.app.role.RoleManager;
+import android.app.role.RoleManagerCallback;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
@@ -23,10 +25,15 @@
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
-import android.provider.Settings;
+import android.os.AsyncTask;
+import android.os.Binder;
+import android.os.Process;
 import android.telephony.TelephonyManager;
 import android.text.TextUtils;
 import android.util.FeatureFlagUtils;
+import android.util.Log;
+
+import com.android.internal.util.CollectionUtils;
 
 import java.util.List;
 
@@ -34,7 +41,7 @@
  * A helper to query activities of emergency assistance.
  */
 public class EmergencyAssistanceHelper {
-
+    private static final String TAG = EmergencyAssistanceHelper.class.getSimpleName();
     /**
      * Get intent action of target emergency app.
      *
@@ -61,8 +68,8 @@
      * or null if there is no installed system application of emergency assistance.
      */
     public static List<ResolveInfo> resolveAssistPackageAndQueryActivities(Context context) {
-        List<ResolveInfo> infos = queryAssistActivities(context);
-
+        final String assistPackage = getDefaultEmergencyPackage(context);
+        List<ResolveInfo> infos = queryAssistActivities(context, assistPackage);
         if (infos == null || infos.isEmpty()) {
             PackageManager packageManager = context.getPackageManager();
             Intent queryIntent = new Intent(getIntentAction(context));
@@ -86,9 +93,8 @@
             }
 
             if (bestMatch != null) {
-                Settings.Secure.putString(context.getContentResolver(),
-                        Settings.Secure.EMERGENCY_ASSISTANCE_APPLICATION, bestMatch.packageName);
-                return queryAssistActivities(context);
+                setDefaultEmergencyPackageAsync(context, bestMatch.packageName);
+                return queryAssistActivities(context, bestMatch.packageName);
             } else {
                 return null;
             }
@@ -106,9 +112,7 @@
                 resolveInfo.activityInfo.name);
     }
 
-    private static List<ResolveInfo> queryAssistActivities(Context context) {
-        final String assistPackage = Settings.Secure.getString(context.getContentResolver(),
-                Settings.Secure.EMERGENCY_ASSISTANCE_APPLICATION);
+    private static List<ResolveInfo> queryAssistActivities(Context context, String assistPackage) {
         List<ResolveInfo> infos = null;
 
         if (!TextUtils.isEmpty(assistPackage)) {
@@ -123,4 +127,34 @@
         return info.applicationInfo != null
                 && (info.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0;
     }
+
+    private static String getDefaultEmergencyPackage(Context context) {
+        long identity = Binder.clearCallingIdentity();
+        try {
+            return CollectionUtils.firstOrNull(context.getSystemService(RoleManager.class)
+                    .getRoleHolders(RoleManager.ROLE_EMERGENCY));
+        } finally {
+            Binder.restoreCallingIdentity(identity);
+        }
+    }
+
+    private static boolean setDefaultEmergencyPackageAsync(Context context, String pkgName) {
+        long identity = Binder.clearCallingIdentity();
+        try {
+            context.getSystemService(RoleManager.class).addRoleHolderAsUser(
+                    RoleManager.ROLE_EMERGENCY, pkgName, 0, Process.myUserHandle(),
+                    AsyncTask.THREAD_POOL_EXECUTOR, new RoleManagerCallback() {
+                        @Override
+                        public void onSuccess() {
+                        }
+                        @Override
+                        public void onFailure() {
+                            Log.e(TAG, "Failed to set emergency default app.");
+                        }
+                    });
+        } finally {
+            Binder.restoreCallingIdentity(identity);
+        }
+        return true;
+    }
 }