Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 59969540 authored by Yorke Lee's avatar Yorke Lee Committed by Android (Google) Code Review
Browse files

Merge "Allow default dialer to be changed via adb without user confirmation" into mnc-dev

parents 8b8515ed 7d3416de
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -261,6 +261,17 @@
            </intent-filter>
        </activity>

        <activity-alias android:name="ProtectedChangeDefaultDialerActivity"
                  android:targetActivity=".components.ChangeDefaultDialerDialog"
                  android:label="@string/change_default_dialer_dialog_title"
                  android:process=":ui"
                  android:permission="android.permission.MODIFY_PHONE_STATE">
            <intent-filter>
                <action android:name="android.telecom.action.CHANGE_DEFAULT_DIALER_PRIVILEGED" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity-alias>

        <receiver android:name=".components.PrimaryCallReceiver"
                android:exported="true"
                android:permission="android.permission.MODIFY_PHONE_STATE"
+41 −9
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.server.telecom.components;

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.AlertActivity;
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 @@ public class ChangeDefaultDialerDialog extends AlertActivity implements
    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 @@ public class ChangeDefaultDialerDialog extends AlertActivity implements
        }
    }

    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)) {