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

Unverified Commit 94825adf authored by cketti's avatar cketti Committed by GitHub
Browse files

Merge pull request #7342 from thunderbird/remove_permission_prompts

Remove permission prompts in `MessageList` and `MessageCompose`
parents dc1c8fd0 328d4c61
Loading
Loading
Loading
Loading
+1 −34
Original line number Diff line number Diff line
@@ -30,7 +30,6 @@ import androidx.annotation.StringRes;
import androidx.appcompat.app.ActionBar;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.util.TypedValue;
import android.view.ContextThemeWrapper;
import android.view.LayoutInflater;
import android.view.Menu;
@@ -114,11 +113,7 @@ import com.fsck.k9.ui.compose.QuotedMessageMvpView;
import com.fsck.k9.ui.compose.QuotedMessagePresenter;
import com.fsck.k9.ui.helper.SizeFormatter;
import com.fsck.k9.ui.messagelist.DefaultFolderProvider;
import com.fsck.k9.ui.permissions.K9PermissionUiHelper;
import com.fsck.k9.ui.permissions.Permission;
import com.fsck.k9.ui.permissions.PermissionUiHelper;

import org.jetbrains.annotations.NotNull;
import org.openintents.openpgp.OpenPgpApiManager;
import org.openintents.openpgp.util.OpenPgpApi;
import timber.log.Timber;
@@ -128,7 +123,7 @@ import timber.log.Timber;
public class MessageCompose extends K9Activity implements OnClickListener,
        CancelListener, AttachmentDownloadCancelListener, OnFocusChangeListener,
        OnOpenPgpInlineChangeListener, OnOpenPgpSignOnlyChangeListener, MessageBuilder.Callback,
        AttachmentPresenter.AttachmentsChangedListener, OnOpenPgpDisableListener, PermissionUiHelper {
        AttachmentPresenter.AttachmentsChangedListener, OnOpenPgpDisableListener {

    private static final int DIALOG_SAVE_OR_DISCARD_DRAFT_MESSAGE = 1;
    private static final int DIALOG_CONFIRM_DISCARD_ON_BACK = 2;
@@ -188,8 +183,6 @@ public class MessageCompose extends K9Activity implements OnClickListener,

    private final Contacts contacts = DI.get(Contacts.class);

    private final PermissionUiHelper permissionUiHelper = new K9PermissionUiHelper(this);

    private QuotedMessagePresenter quotedMessagePresenter;
    private MessageLoaderHelper messageLoaderHelper;
    private AttachmentPresenter attachmentPresenter;
@@ -479,10 +472,6 @@ public class MessageCompose extends K9Activity implements OnClickListener,
            setProgressBarIndeterminateVisibility(true);
            currentMessageBuilder.reattachCallback(this);
        }

        if (savedInstanceState == null) {
            checkAndRequestPermissions();
        }
    }

    /**
@@ -674,12 +663,6 @@ public class MessageCompose extends K9Activity implements OnClickListener,
        updateMessageFormat();
    }

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

    private void setTitle() {
        setTitle(action.getTitleResource());
    }
@@ -1950,20 +1933,4 @@ public class MessageCompose extends K9Activity implements OnClickListener,
            return titleResource;
        }
    }

    @Override
    public boolean hasPermission(@NotNull Permission permission) {
        return permissionUiHelper.hasPermission(permission);
    }

    @Override
    public void requestPermissionOrShowRationale(@NotNull Permission permission) {
        permissionUiHelper.requestPermissionOrShowRationale(permission);
    }

    @Override
    public void requestPermission(@NotNull Permission permission) {
        permissionUiHelper.requestPermission(permission);
    }

}
+1 −29
Original line number Diff line number Diff line
@@ -59,9 +59,6 @@ import com.fsck.k9.ui.messageview.MessageViewContainerFragment
import com.fsck.k9.ui.messageview.MessageViewContainerFragment.MessageViewContainerListener
import com.fsck.k9.ui.messageview.MessageViewFragment.MessageViewFragmentListener
import com.fsck.k9.ui.messageview.PlaceholderFragment
import com.fsck.k9.ui.permissions.K9PermissionUiHelper
import com.fsck.k9.ui.permissions.Permission
import com.fsck.k9.ui.permissions.PermissionUiHelper
import com.fsck.k9.view.ViewSwitcher
import com.fsck.k9.view.ViewSwitcher.OnSwitchCompleteListener
import com.mikepenz.materialdrawer.util.getOptimalDrawerWidth
@@ -81,8 +78,7 @@ open class MessageList :
    MessageViewFragmentListener,
    MessageViewContainerListener,
    FragmentManager.OnBackStackChangedListener,
    OnSwitchCompleteListener,
    PermissionUiHelper {
    OnSwitchCompleteListener {

    protected val searchStatusManager: SearchStatusManager by inject()
    private val preferences: Preferences by inject()
@@ -92,8 +88,6 @@ open class MessageList :
    private val messagingController: MessagingController by inject()
    private val contactRepository: ContactRepository by inject()

    private val permissionUiHelper: PermissionUiHelper = K9PermissionUiHelper(this)

    private lateinit var actionBar: ActionBar
    private var searchView: SearchView? = null
    private var initialSearchViewQuery: String? = null
@@ -206,10 +200,6 @@ open class MessageList :
        initializeLayout()
        initializeFragments()
        displayViews()

        if (savedInstanceState == null) {
            checkAndRequestPermissions()
        }
    }

    public override fun onNewIntent(intent: Intent) {
@@ -500,12 +490,6 @@ open class MessageList :
        }
    }

    private fun checkAndRequestPermissions() {
        if (!hasPermission(Permission.READ_CONTACTS)) {
            requestPermissionOrShowRationale(Permission.READ_CONTACTS)
        }
    }

    public override fun onResume() {
        super.onResume()

@@ -1357,18 +1341,6 @@ open class MessageList :
        }
    }

    override fun hasPermission(permission: Permission): Boolean {
        return permissionUiHelper.hasPermission(permission)
    }

    override fun requestPermissionOrShowRationale(permission: Permission) {
        permissionUiHelper.requestPermissionOrShowRationale(permission)
    }

    override fun requestPermission(permission: Permission) {
        permissionUiHelper.requestPermission(permission)
    }

    private enum class DisplayMode {
        MESSAGE_LIST, MESSAGE_VIEW, SPLIT_VIEW
    }
+0 −21
Original line number Diff line number Diff line
package com.fsck.k9.ui.permissions

import android.Manifest
import androidx.annotation.StringRes
import com.fsck.k9.ui.R

private const val PERMISSIONS_REQUEST_READ_CONTACTS = 1

enum class Permission(
    val permission: String,
    val requestCode: Int,
    @StringRes val rationaleTitle: Int,
    @StringRes val rationaleMessage: Int,
) {
    READ_CONTACTS(
        Manifest.permission.READ_CONTACTS,
        PERMISSIONS_REQUEST_READ_CONTACTS,
        R.string.permission_contacts_rationale_title,
        R.string.permission_contacts_rationale_message,
    ),
}
+0 −46
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 androidx.core.os.bundleOf
import androidx.fragment.app.DialogFragment
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 implement
 * [PermissionUiHelper].
 */
class PermissionRationaleDialogFragment : DialogFragment() {
    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        val args = arguments ?: error("Arguments missing")
        val permissionName = args.getString(ARG_PERMISSION) ?: error("Missing argument '$ARG_PERMISSION'")

        val permission = Permission.valueOf(permissionName)

        return AlertDialog.Builder(requireContext())
            .setTitle(permission.rationaleTitle)
            .setMessage(permission.rationaleMessage)
            .setPositiveButton(R.string.okay_action) { _, _ ->
                val permissionUiHelper = requireActivity() as? PermissionUiHelper
                    ?: throw AssertionError(
                        "Activities using PermissionRationaleDialogFragment need to " +
                            "implement PermissionUiHelper",
                    )

                permissionUiHelper.requestPermission(permission)
            }.create()
    }

    companion object {
        private const val ARG_PERMISSION = "permission"

        fun newInstance(permission: Permission): PermissionRationaleDialogFragment {
            return PermissionRationaleDialogFragment().apply {
                arguments = bundleOf(ARG_PERMISSION to permission.name)
            }
        }
    }
}
+0 −37
Original line number Diff line number Diff line
package com.fsck.k9.ui.permissions

import android.content.pm.PackageManager
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import timber.log.Timber

interface PermissionUiHelper {
    fun hasPermission(permission: Permission): Boolean
    fun requestPermissionOrShowRationale(permission: Permission)
    fun requestPermission(permission: Permission)
}

class K9PermissionUiHelper(private val activity: AppCompatActivity) : PermissionUiHelper {
    override fun hasPermission(permission: Permission): Boolean {
        return ContextCompat.checkSelfPermission(activity, permission.permission) == PackageManager.PERMISSION_GRANTED
    }

    override fun requestPermissionOrShowRationale(permission: Permission) {
        if (ActivityCompat.shouldShowRequestPermissionRationale(activity, permission.permission)) {
            val dialogFragment = PermissionRationaleDialogFragment.newInstance(permission)
            dialogFragment.show(activity.supportFragmentManager, FRAGMENT_TAG_RATIONALE)
        } else {
            requestPermission(permission)
        }
    }

    override fun requestPermission(permission: Permission) {
        Timber.i("Requesting permission: " + permission.permission)
        ActivityCompat.requestPermissions(activity, arrayOf(permission.permission), permission.requestCode)
    }

    companion object {
        private const val FRAGMENT_TAG_RATIONALE = "rationale"
    }
}
Loading