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

Commit c76d85ad authored by cketti's avatar cketti
Browse files

Use request permission rationale mechanism instead of showing toast

parent 4a796641
Loading
Loading
Loading
Loading
+40 −27
Original line number Diff line number Diff line
package com.fsck.k9.activity;


import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.support.annotation.StringRes;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.view.MotionEvent;
import android.widget.Toast;

import com.fsck.k9.activity.K9ActivityCommon.K9ActivityMagic;
import com.fsck.k9.activity.misc.SwipeGestureDetector.OnSwipeGestureListener;
import com.fsck.k9.ui.R;
import com.fsck.k9.ui.permissions.PermissionRationaleDialogFragment;
import timber.log.Timber;


public abstract class K9Activity extends AppCompatActivity implements K9ActivityMagic {
    public static final int PERMISSIONS_REQUEST_READ_CONTACTS  = 1;
    public static final int PERMISSIONS_REQUEST_WRITE_CONTACTS = 2;
    private static final String FRAGMENT_TAG_RATIONALE = "rationale";


    private K9ActivityCommon mBase;

    public static final int PERMISSIONS_REQUEST_READ_CONTACTS  = 1;
    public static final int PERMISSIONS_REQUEST_WRITE_CONTACTS = 2;

    @Override
    public void onCreate(Bundle savedInstanceState) {
@@ -39,26 +43,21 @@ public abstract class K9Activity extends AppCompatActivity implements K9Activity
        mBase.setupGestureDetector(listener);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode,
                                           String permissions[], int[] grantResults) {
        switch (requestCode) {
            case PERMISSIONS_REQUEST_READ_CONTACTS:
            case PERMISSIONS_REQUEST_WRITE_CONTACTS: {
                // If request is cancelled, the result arrays are empty.
                boolean permissionWasGranted = grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED;
                if (!permissionWasGranted) {
                    Toast.makeText(this, R.string.contact_permission_request_denied,
                            Toast.LENGTH_LONG).show();
                }
            }
        }
    }

    public boolean hasPermission(Permission permission) {
        return ContextCompat.checkSelfPermission(this, permission.permission) == PackageManager.PERMISSION_GRANTED;
    }

    public void requestPermissionOrShowRationale(Permission permission) {
        if (ActivityCompat.shouldShowRequestPermissionRationale(this, permission.permission)) {
            PermissionRationaleDialogFragment dialogFragment =
                    PermissionRationaleDialogFragment.newInstance(permission);

            dialogFragment.show(getSupportFragmentManager(), FRAGMENT_TAG_RATIONALE);
        } else {
            requestPermission(permission);
        }
    }

    public void requestPermission(Permission permission) {
        Timber.i("Requesting permission: " + permission.permission);
        ActivityCompat.requestPermissions(this, new String[] { permission.permission }, permission.requestCode);
@@ -66,16 +65,30 @@ public abstract class K9Activity extends AppCompatActivity implements K9Activity


    public enum Permission {
        READ_CONTACTS(Manifest.permission.READ_CONTACTS, PERMISSIONS_REQUEST_READ_CONTACTS),
        WRITE_CONTACTS(Manifest.permission.WRITE_CONTACTS, PERMISSIONS_REQUEST_WRITE_CONTACTS);


        final String permission;
        final int requestCode;

        Permission(String permission, int requestCode) {
        READ_CONTACTS(
                Manifest.permission.READ_CONTACTS,
                PERMISSIONS_REQUEST_READ_CONTACTS,
                R.string.permission_contacts_rationale_title,
                R.string.permission_contacts_rationale_message
        ),
        WRITE_CONTACTS(
                Manifest.permission.WRITE_CONTACTS,
                PERMISSIONS_REQUEST_WRITE_CONTACTS,
                R.string.permission_contacts_rationale_title,
                R.string.permission_contacts_rationale_message
        );


        public final String permission;
        public final int requestCode;
        public final int rationaleTitle;
        public final int rationaleMessage;

        Permission(String permission, int requestCode, @StringRes int rationaleTitle, @StringRes int rationaleMessage) {
            this.permission = permission;
            this.requestCode = requestCode;
            this.rationaleTitle = rationaleTitle;
            this.rationaleMessage = rationaleMessage;
        }
    }
}
+1 −1
Original line number Diff line number Diff line
@@ -645,7 +645,7 @@ public class MessageCompose extends K9Activity implements OnClickListener,

    private void checkAndRequestPermissions() {
        if (!hasPermission(Permission.READ_CONTACTS)) {
            requestPermission(Permission.READ_CONTACTS);
            requestPermissionOrShowRationale(Permission.READ_CONTACTS);
        }
    }

+1 −1
Original line number Diff line number Diff line
@@ -513,7 +513,7 @@ public class MessageList extends K9Activity implements MessageListFragmentListen

    private void checkAndRequestPermissions() {
        if (!hasPermission(Permission.READ_CONTACTS)) {
            requestPermission(Permission.READ_CONTACTS);
            requestPermissionOrShowRationale(Permission.READ_CONTACTS);
        }
    }

+48 −0
Original line number Diff line number Diff line
package com.fsck.k9.ui.permissions

import android.app.AlertDialog
import android.app.Dialog
import android.os.Bundle
import android.support.v4.app.DialogFragment
import androidx.core.os.bundleOf
import com.fsck.k9.activity.K9Activity
import com.fsck.k9.activity.K9Activity.Permission
import com.fsck.k9.ui.R

/**
 * A dialog displaying a message to explain why the app requests a certain permission.
 *
 * Closing the dialog triggers a permission request. For this to work the Activity needs to be a subclass of
 * [K9Activity].
 */
class PermissionRationaleDialogFragment : DialogFragment() {
    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        val args = arguments!!
        val permissionName = args.getString(ARG_PERMISSION)

        val permission = Permission.valueOf(permissionName)

        return AlertDialog.Builder(requireContext()).apply {
            setTitle(permission.rationaleTitle)
            setMessage(permission.rationaleMessage)
            setPositiveButton(R.string.okay_action) { _, _ ->
                val activity = requireActivity() as? K9Activity
                        ?: throw AssertionError("PermissionRationaleDialogFragment can only be used with K9Activity")

                activity.requestPermission(permission)
            }
        }.create()
    }


    companion object {
        private const val ARG_PERMISSION = "permission"

        @JvmStatic
        fun newInstance(permission: Permission): PermissionRationaleDialogFragment {
            return PermissionRationaleDialogFragment().apply {
                arguments = bundleOf(ARG_PERMISSION to permission.name)
            }
        }
    }
}
+2 −1
Original line number Diff line number Diff line
@@ -1353,5 +1353,6 @@ You can keep this message and use it as a backup for your secret key. If you wan


    <!-- permissions -->
    <string name="contact_permission_request_denied">K-9 can\'t show you contact suggestions without this permission.</string>
    <string name="permission_contacts_rationale_title">Allow access to contacts</string>
    <string name="permission_contacts_rationale_message">To be able to provide contact suggestions and to display contact names and photos, the app needs access to your contacts.</string>
</resources>