Allow default dialer to be changed via adb without user confirmation

Required to automate CTS tests.

Change-Id: I696804ed6cdb65aed9f4914300fc228a0dcff6aa
diff --git a/src/com/android/server/telecom/components/ChangeDefaultDialerDialog.java b/src/com/android/server/telecom/components/ChangeDefaultDialerDialog.java
index 253d0ab..c4ca7da 100644
--- a/src/com/android/server/telecom/components/ChangeDefaultDialerDialog.java
+++ b/src/com/android/server/telecom/components/ChangeDefaultDialerDialog.java
@@ -18,6 +18,7 @@
 
 import android.content.Context;
 import android.content.DialogInterface;
+import android.content.Intent;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManager.NameNotFoundException;
@@ -32,6 +33,13 @@
 import com.android.internal.app.AlertController;
 import com.android.server.telecom.R;
 
+/**
+ * Activity that shows a dialog for the user to confirm whether or not the default dialer should
+ * be changed.
+ *
+ * This dialog can be skipped directly for CTS tests using the adb command:
+ * adb shell am start -a android.telecom.action.CHANGE_DEFAULT_DIALER_PRIVILEGED -e android.telecom.extra.CHANGE_DEFAULT_DIALER_PACKAGE_NAME <packageName>
+ */
 public class ChangeDefaultDialerDialog extends AlertActivity implements
         DialogInterface.OnClickListener{
     private static final String TAG = ChangeDefaultDialerDialog.class.getSimpleName();
@@ -41,13 +49,18 @@
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
-        final String packageName = getIntent().getStringExtra(
+        final String oldPackage = DefaultDialerManager.getDefaultDialerApplication(this);
+        mNewPackage = getIntent().getStringExtra(
                 TelecomManager.EXTRA_CHANGE_DEFAULT_DIALER_PACKAGE_NAME);
-
-        if (!buildDialog(packageName)) {
+        if (!canChangeToProvidedPackage(oldPackage, mNewPackage)) {
             setResult(RESULT_CANCELED);
             finish();
         }
+
+        if (!maybeHandlePrivilegedOperation(getIntent(), mNewPackage)) {
+            // Show dialog to require user confirmation.
+            buildDialog(oldPackage, mNewPackage);
+        }
     }
 
     @Override
@@ -64,29 +77,48 @@
         }
     }
 
-    private boolean buildDialog(String newPackage) {
-        mNewPackage = newPackage;
+    private boolean maybeHandlePrivilegedOperation(Intent intent, String newPackage) {
+        // Verify that both the launched activity aliases and the intent action are the privileged
+        // versions that can only be launched with the MODIFY_PHONE_STATE permission.
+        if (getClass().getName().equals(intent.getComponent().getClassName())) {
+            // Activity was not launched as privileged activity-alias.
+            return false;
+        }
+        if (!TelecomManager.ACTION_CHANGE_DEFAULT_DIALER_PRIVILEGED.equals(intent.getAction())) {
+            return false;
+        }
+
+        DefaultDialerManager.setDefaultDialerApplication(ChangeDefaultDialerDialog.this,
+                newPackage);
+        setResult(RESULT_OK);
+        finish();
+        return true;
+    }
+
+    private boolean canChangeToProvidedPackage(String oldPackage, String newPackage) {
         final TelephonyManager tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
         if (!tm.isVoiceCapable()) {
             Log.w(TAG, "Dialog launched but device is not voice capable.");
             return false;
         }
 
-        if (!DefaultDialerManager.getInstalledDialerApplications(this).contains(mNewPackage)) {
+        if (!DefaultDialerManager.getInstalledDialerApplications(this).contains(newPackage)) {
             Log.w(TAG, "Provided package name does not correspond to an installed Dialer "
                     + "application.");
             return false;
         }
 
-        final String oldPackage = DefaultDialerManager.getDefaultDialerApplication(this);
-        if (!TextUtils.isEmpty(oldPackage) && TextUtils.equals(oldPackage, mNewPackage)) {
+        if (!TextUtils.isEmpty(oldPackage) && TextUtils.equals(oldPackage, newPackage)) {
             Log.w(TAG, "Provided package name is already the current default Dialer application.");
             return false;
         }
+        return true;
+    }
 
+    private boolean buildDialog(String oldPackage, String newPackage) {
         final PackageManager pm = getPackageManager();
         final String newPackageLabel =
-                getApplicationLabelForPackageName(pm, mNewPackage);
+                getApplicationLabelForPackageName(pm, newPackage);
         final AlertController.AlertParams p = mAlertParams;
         p.mTitle = getString(R.string.change_default_dialer_dialog_title);
         if (!TextUtils.isEmpty(oldPackage)) {