Migrate dialer to RoleManager

Test: ensure settings UI is ok, ensure stock dialer can still make a call
Change-Id: Iab835939fbb92af06d9440910fbde2725ca66f70
diff --git a/telecomm/java/android/telecom/DefaultDialerManager.java b/telecomm/java/android/telecom/DefaultDialerManager.java
index 2680af7..b2fa5d4 100644
--- a/telecomm/java/android/telecom/DefaultDialerManager.java
+++ b/telecomm/java/android/telecom/DefaultDialerManager.java
@@ -15,17 +15,22 @@
 package android.telecom;
 
 import android.app.ActivityManager;
+import android.app.role.RoleManager;
+import android.app.role.RoleManagerCallback;
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.ActivityInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
 import android.net.Uri;
+import android.os.AsyncTask;
+import android.os.Binder;
 import android.os.Process;
 import android.os.UserHandle;
-import android.provider.Settings;
 import android.text.TextUtils;
 
+import com.android.internal.util.CollectionUtils;
+
 import java.util.ArrayList;
 import java.util.List;
 
@@ -64,25 +69,24 @@
      * */
     public static boolean setDefaultDialerApplication(Context context, String packageName,
             int user) {
-        // Get old package name
-        String oldPackageName = Settings.Secure.getStringForUser(context.getContentResolver(),
-                Settings.Secure.DIALER_DEFAULT_APPLICATION, user);
+        long identity = Binder.clearCallingIdentity();
+        try {
+            context.getSystemService(RoleManager.class).addRoleHolderAsUser(
+                    RoleManager.ROLE_DIALER, packageName, UserHandle.of(user),
+                    AsyncTask.THREAD_POOL_EXECUTOR, new RoleManagerCallback() {
+                        @Override
+                        public void onSuccess() {}
 
-        if (packageName != null && oldPackageName != null && packageName.equals(oldPackageName)) {
-            // No change
-            return false;
-        }
-
-        // Only make the change if the new package belongs to a valid phone application
-        List<String> packageNames = getInstalledDialerApplications(context, user);
-
-        if (packageNames.contains(packageName)) {
-            // Update the secure setting.
-            Settings.Secure.putStringForUser(context.getContentResolver(),
-                    Settings.Secure.DIALER_DEFAULT_APPLICATION, packageName, user);
+                        @Override
+                        public void onFailure() {
+                            Log.w(TAG, "Failed to set default dialer to %s for user %s",
+                                    packageName, user);
+                        }
+                    });
             return true;
+        } finally {
+            Binder.restoreCallingIdentity(identity);
         }
-        return false;
     }
 
     /**
@@ -116,28 +120,12 @@
      * @hide
      * */
     public static String getDefaultDialerApplication(Context context, int user) {
-        String defaultPackageName = Settings.Secure.getStringForUser(context.getContentResolver(),
-                Settings.Secure.DIALER_DEFAULT_APPLICATION, user);
-
-        final List<String> packageNames = getInstalledDialerApplications(context, user);
-
-        // Verify that the default dialer has not been disabled or uninstalled.
-        if (packageNames.contains(defaultPackageName)) {
-            return defaultPackageName;
-        }
-
-        // No user-set dialer found, fallback to system dialer
-        String systemDialerPackageName = getTelecomManager(context).getSystemDialerPackage();
-
-        if (TextUtils.isEmpty(systemDialerPackageName)) {
-            // No system dialer configured at build time
-            return null;
-        }
-
-        if (packageNames.contains(systemDialerPackageName)) {
-            return systemDialerPackageName;
-        } else {
-            return null;
+        long identity = Binder.clearCallingIdentity();
+        try {
+            return CollectionUtils.firstOrNull(context.getSystemService(RoleManager.class)
+                    .getRoleHoldersAsUser(RoleManager.ROLE_DIALER, UserHandle.of(user)));
+        } finally {
+            Binder.restoreCallingIdentity(identity);
         }
     }