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

Commit 33308f19 authored by Walter Jang's avatar Walter Jang Committed by Android (Google) Code Review
Browse files

Merge "Added optional uses-feature telephony to enable tablet installs (2/3)"

parents 8be7701c bf6fcf92
Loading
Loading
Loading
Loading
+24 −14
Original line number Diff line number Diff line
@@ -19,8 +19,12 @@ package com.android.contacts.common.activity;
import android.Manifest.permission;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;

import java.util.ArrayList;
import java.util.List;

/**
 * Requests permissions that are not absolutely required by the calling Activity;
 * if permissions are denied, the calling Activity is still restarted.
@@ -32,21 +36,11 @@ import android.os.Bundle;
 */
public class RequestDesiredPermissionsActivity extends RequestPermissionsActivityBase {

    public static final String[] DESIRED_PERMISSIONS = new String[] {
            // Calendar group
            permission.READ_CALENDAR,
            // SMS group
            permission.READ_SMS,
    };
    private static String[] sDesiredPermissions;

    @Override
    protected String[] getRequiredPermissions() {
        return DESIRED_PERMISSIONS;
    }

    @Override
    protected String[] getDesiredPermissions() {
        return DESIRED_PERMISSIONS;
    protected String[] getPermissions() {
        return getPermissions(getPackageManager());
    }

    /**
@@ -61,10 +55,26 @@ public class RequestDesiredPermissionsActivity extends RequestPermissionsActivit
        if (extras != null && extras.getBoolean(EXTRA_STARTED_PERMISSIONS_ACTIVITY, false)) {
            return false;
        }
        return startPermissionActivity(activity, DESIRED_PERMISSIONS,
        return startPermissionActivity(activity,
                getPermissions(activity.getPackageManager()),
                RequestDesiredPermissionsActivity.class);
    }

    private static String[] getPermissions(PackageManager packageManager) {
        if (sDesiredPermissions == null) {
            final List<String> permissions = new ArrayList<>();
            // Calendar group
            permissions.add(permission.READ_CALENDAR);

            if (packageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
                // SMS group
                permissions.add(permission.READ_SMS);
            }
            sDesiredPermissions = permissions.toArray(new String[0]);
        }
        return sDesiredPermissions;
    }

    @Override
    public void onRequestPermissionsResult(
            int requestCode, String permissions[], int[] grantResults) {
+1 −8
Original line number Diff line number Diff line
@@ -34,14 +34,7 @@ public class RequestImportVCardPermissionsActivity extends RequestPermissionsAct
    };

    @Override
    protected String[] getRequiredPermissions() {
        return REQUIRED_PERMISSIONS;
    }

    @Override
    protected String[] getDesiredPermissions() {
        // Since this is used as an ostensible part of Dialer, lets be less pushy about asking for
        // unnecessary permissions here.
    protected String[] getPermissions() {
        return REQUIRED_PERMISSIONS;
    }

+31 −33
Original line number Diff line number Diff line
@@ -21,52 +21,50 @@ import com.android.contacts.common.R;
import android.Manifest.permission;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;

/**
 * Activity that requests permissions needed for activities exported from Contacts.
 */
public class RequestPermissionsActivity extends RequestPermissionsActivityBase {

    private static final String[] REQUIRED_PERMISSIONS = new String[]{
            // "Contacts" group. Without this permission, the Contacts app is useless.
            permission.GET_ACCOUNTS,
            permission.READ_CONTACTS,
            permission.WRITE_CONTACTS,
            // "Phone" group. This is only used in a few places such as QuickContactActivity and
            // ImportExportDialogFragment. We could work around missing this permission with a bit
            // of work.
            permission.CALL_PHONE,
            permission.READ_CALL_LOG,
            permission.READ_PHONE_STATE,
    };
    private static String[] sRequiredPermissions;

    @Override
    protected String[] getRequiredPermissions() {
        return REQUIRED_PERMISSIONS;
    protected String[] getPermissions() {
        return getPermissions(getPackageManager());
    }

    @Override
    protected String[] getDesiredPermissions() {
        return new String[]{
    public static boolean startPermissionActivity(Activity activity) {
        return startPermissionActivity(activity,
                getPermissions(activity.getPackageManager()),
                RequestPermissionsActivity.class);
    }

    private static String[] getPermissions(PackageManager packageManager) {
        if (sRequiredPermissions == null) {
            final List<String> permissions = new ArrayList<>();
            // Contacts group
                permission.GET_ACCOUNTS,
                permission.READ_CONTACTS,
                permission.WRITE_CONTACTS,
            permissions.add(permission.GET_ACCOUNTS);
            permissions.add(permission.READ_CONTACTS);
            permissions.add(permission.WRITE_CONTACTS);

            if (packageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {
                // Phone group
                permission.CALL_PHONE,
                permission.READ_CALL_LOG,
                permission.READ_PHONE_STATE,
                // Calendar group
                permission.READ_CALENDAR,
                // SMS group
                permission.READ_SMS,
        };
                // These are only used in a few places such as QuickContactActivity and
                // ImportExportDialogFragment.  We work around missing this permission when
                // telephony is not available on the device (i.e. on tablets).
                permissions.add(permission.CALL_PHONE);
                permissions.add(permission.READ_CALL_LOG);
                permissions.add(permission.READ_PHONE_STATE);
            }

    public static boolean startPermissionActivity(Activity activity) {
        return startPermissionActivity(activity, REQUIRED_PERMISSIONS,
                RequestPermissionsActivity.class);
            sRequiredPermissions = permissions.toArray(new String[0]);
        }
        return sRequiredPermissions;
    }

    @Override
+6 −14
Original line number Diff line number Diff line
@@ -16,7 +16,6 @@

package com.android.contacts.common.activity;

import com.android.contacts.common.R;
import com.android.contacts.common.model.AccountTypeManager;
import com.android.contacts.common.util.PermissionsUtil;

@@ -32,8 +31,7 @@ import java.util.ArrayList;
import java.util.Arrays;

/**
 * Activity that asks the user for all {@link #getDesiredPermissions} if any of
 * {@link #getRequiredPermissions} are missing.
 * Activity that asks the user for all {@link #getPermissions} if any are missing.
 *
 * NOTE: As a result of b/22095159, this can behave oddly in the case where the final permission
 * you are requesting causes an application restart.
@@ -50,16 +48,10 @@ public abstract class RequestPermissionsActivityBase extends Activity
    private static final int PERMISSIONS_REQUEST_ALL_PERMISSIONS = 1;

    /**
     * @return list of permissions that are needed in order for {@link #PREVIOUS_ACTIVITY_INTENT} to
     * operate. You only need to return a single permission per permission group you care about.
     * @return list of permissions that are needed in order for {@link #PREVIOUS_ACTIVITY_INTENT}
     * to operate. You only need to return a single permission per permission group you care about.
     */
    protected abstract String[] getRequiredPermissions();

    /**
     * @return list of permissions that would be useful for {@link #PREVIOUS_ACTIVITY_INTENT} to
     * operate. You only need to return a single permission per permission group you care about.
     */
    protected abstract String[] getDesiredPermissions();
    protected abstract String[] getPermissions();

    protected Intent mPreviousActivityIntent;

@@ -113,7 +105,7 @@ public abstract class RequestPermissionsActivityBase extends Activity
    }

    private boolean isPermissionRequired(String p) {
        return Arrays.asList(getRequiredPermissions()).contains(p);
        return Arrays.asList(getPermissions()).contains(p);
    }

    private void requestPermissions() {
@@ -121,7 +113,7 @@ public abstract class RequestPermissionsActivityBase extends Activity
        try {
            // Construct a list of missing permissions
            final ArrayList<String> unsatisfiedPermissions = new ArrayList<>();
            for (String permission : getDesiredPermissions()) {
            for (String permission : getPermissions()) {
                if (!PermissionsUtil.hasPermission(this, permission)) {
                    unsatisfiedPermissions.add(permission);
                }