Подход к сокращению написания того же скучного кода при работе с разрешениями - PullRequest
1 голос
/ 05 июля 2019

В настоящее время я пишу приложение для чата для Android. Начиная с 23 SDK и выше, ему нужны некоторые разрешения, которые пользователь должен разрешить, такие как крайне важные (в моем чате будет использоваться место создания конкретного чата) и только небольшие функции, такие как загрузка изображений в хранилище Firebase (для этого нужны доступ к памяти телефона, поэтому для этого требуется соответствующее разрешение).

У меня есть следующий интерфейс для обратных вызовов.

object PermissionUtils {

 interface PermissionAskListener {


        fun onPermissionGranted()
        /*
            User has already granted this permission
            The app must had been launched earlier and the user must had "allowed" that permission
         */


        fun onPermissionRequest()
        /*
            The app is launched FIRST TIME..
            We don't need to show additional dialog, we just request for the permission..

         */


        fun onPermissionPreviouslyDenied()
        /*
            The app was launched earlier and the user simply "denied" the permission..
            The user had NOT clicked "DO NOT SHOW AGAIN"
            We need to show additional dialog in this case explaining how "allowing this permission" would be useful to the user
         */


        fun onPermissionDisabled()
        /*
            The app had launched earlier and the user "denied" the permission..
            AND ALSO had clicked "DO NOT ASK AGAIN"
            We need to show Toask/alertdialog/.. to indicate that the user had denied the permission by checking do not disturb too...
            So, you might want to take the user to setting>app>permission page where the user can allow the permission..


         */

    }

fun checkForPermission(activity: Activity, permission: String, permissionAskListener: PermissionAskListener) {
//code omitted, here's the logic of calls listener members 
 }
}

И я использую его в таком коде:

//calling from onCreate()
checkForPermission(
            this, android.Manifest.permission.READ_EXTERNAL_STORAGE,
            object : PermissionAskListener {
                override fun onPermissionGranted() {
                    showToast(getString(R.string.msg_permissions_granted), Toast.LENGTH_LONG)
                    uplodAnImageToFirebase()

                }

                override fun onPermissionRequest() {
                    ActivityCompat.requestPermissions(
                        this@MainActivity, arrayOf(android.Manifest.permission.READ_EXTERNAL_STORAGE), readStorage
                    )
                }

                override fun onPermissionPreviouslyDenied() {
                    AlertDialog.Builder(this@MainActivity)
                        .setTitle(getString(R.string.title_permission_required))
                        .setMessage(getString(R.string.msg_permission_required))
                        .setCancelable(false)
                        .setPositiveButton(getString(R.string.action_allow)) { _, _ ->
                            ActivityCompat.requestPermissions(
                                this@MainActivity,
                                arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE),
                                readStorage
                            )
                        }
                        .setNegativeButton(getString(R.string.action_cancel)) { dialog, _ ->
                            dialog.cancel()
                            showToast(getString(R.string.msg_we_cant_give_functionality), Toast.LENGTH_LONG)
                        }
                        .show()
                }

                override fun onPermissionDisabled() {
                    AlertDialog.Builder(this@MainActivity)
                        .setTitle(getString(R.string.title_permission_disabled))
                        .setMessage(getString(R.string.msg_please_enable_permission))
                        .setCancelable(false)
                        .setPositiveButton(
                            getString(R.string.action_go_to_settings)
                        ) { _, _ -> startActivity(Intent(Settings.ACTION_SETTINGS)) }
                        .setNegativeButton(getString(R.string.action_cancel)) { dialog, _ ->
                            dialog.cancel()
                            showToast(getString(R.string.msg_we_cant_give_functionality), Toast.LENGTH_LONG)
                        }
                        .show()
                }
            }
        )

Как вы можете видеть из кода, только onPermissionGranted () делает что-то конкретное, а onPermissionPreviouslyDenied () и onPermissionDisabled () просто говорят пользователю скучные и обычные вещи, которые я хочу включить в некоторый класс, который создаст диалоги для дополнительные важные вещи (например, местоположение; если отказано в разрешении, я бы хотел закрыть все приложение), или просто загрузить, что просто заблокирует функциональность.

Я знаю, как делать такие запросы на разрешение и тому подобное. Я не знаю, как создавать эти классы с помощью диалогов - создавать перечисление, которое я передаю всякий раз, когда я вызываю метод onDisabled / onPreviouslyDenied из действия, или создавать для него Builder, или создавать Factory ... если вы используете TL; DR, то просто ответ: «Как уменьшить тот же код в моем случае?»

Ответы [ 3 ]

1 голос
/ 06 июля 2019

Альтернативным решением было бы создание класса BaseActivity и другие ваши действия в подклассе приложения BaseActivity.

Что-то вроде ..

class BaseActivity: AppCompatActivity {
    override fun onCreate() {
        super.onCreate()
        checkForPermissions() // do your permission check code 
    }
}

class MainActivity: BaseActivity {
    override fun onCreate() {
        super.onCreate() // calls BaseAcivitiy's onCreate, which triggers the checkForPermissions
    }
}
0 голосов
/ 06 июля 2019

Я предлагаю использовать следующую библиотеку: https://github.com/Karumi/Dexter

С другой стороны, чтобы избежать дублирования кода, вы можете переместить в отдельный класс код, связанный с помощником диалога.

Например,: https://github.com/jpgpuyo/MVPvsMVVM/blob/one_dialog/app/src/main/java/upday/mvpvsmvvm/dialoghelper/DialogHelper.java

0 голосов
/ 05 июля 2019

Как отмечается в комментариях CommonsWare, есть (здесь библиотек, чтобы попытаться уменьшить некоторые из этих шаблонов ) множество хороших библиотек. Я выбрал библиотеку NoPermission . Может быть, это похоже на рекламу, но я уверен, что это не самая плохая библиотека. Хорошего дня !!!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...