Refactor permissions manager

This commit is contained in:
MM20
2022-01-03 21:41:44 +01:00
parent 5c0d142fd9
commit b5005ee4ea
15 changed files with 183 additions and 84 deletions
@@ -4,11 +4,12 @@ import android.content.Context
import android.graphics.drawable.ColorDrawable
import androidx.core.content.ContextCompat
import de.mm20.launcher2.icons.LauncherIcon
import de.mm20.launcher2.permissions.PermissionGroup
import de.mm20.launcher2.permissions.R
class MissingPermission(override val label: String, val permissionGroup: Int): Searchable() {
class MissingPermission(override val label: String, val permissionGroup: PermissionGroup): Searchable() {
override val key: String
get() = "permission://${permissionGroup}"
get() = "permission://${permissionGroup.ordinal}"
override fun getPlaceholderIcon(context: Context): LauncherIcon {
return LauncherIcon(
@@ -0,0 +1,8 @@
package de.mm20.launcher2.permissions
import org.koin.android.ext.koin.androidContext
import org.koin.dsl.module
val permissionsModule = module {
single<PermissionsManager> { PermissionsManagerImpl(androidContext()) }
}
@@ -1,55 +1,75 @@
package de.mm20.launcher2.permissions
import android.Manifest
import android.app.Activity
import android.content.Context
import android.content.Intent
import android.net.Uri
import android.os.Build
import android.os.Environment
import android.provider.Settings
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityCompat
import de.mm20.launcher2.ktx.checkPermission
import de.mm20.launcher2.ktx.isAtLeastApiLevel
object PermissionsManager {
interface PermissionsManager {
fun requestPermission(context: AppCompatActivity, permissionGroup: PermissionGroup)
fun requestPermission(context: Activity, permissionGroup: Int) {
fun checkPermission(permissionGroup: PermissionGroup): Boolean
}
enum class PermissionGroup {
Calendar,
Location,
Contacts,
ExternalStorage
}
class PermissionsManagerImpl(
private val context: Context
): PermissionsManager {
override fun requestPermission(activity: AppCompatActivity, permissionGroup: PermissionGroup) {
when (permissionGroup) {
CALENDAR -> {
ActivityCompat.requestPermissions(context, calendarPermissions, permissionGroup)
PermissionGroup.Calendar -> {
ActivityCompat.requestPermissions(activity, calendarPermissions, permissionGroup.ordinal)
}
LOCATION -> {
ActivityCompat.requestPermissions(context, locationPermissions, permissionGroup)
PermissionGroup.Location -> {
ActivityCompat.requestPermissions(activity, locationPermissions, permissionGroup.ordinal)
}
CONTACTS -> {
ActivityCompat.requestPermissions(context, contactPermissions, permissionGroup)
PermissionGroup.Contacts -> {
ActivityCompat.requestPermissions(activity, contactPermissions, permissionGroup.ordinal)
}
EXTERNAL_STORAGE -> {
PermissionGroup.ExternalStorage -> {
if (isAtLeastApiLevel(Build.VERSION_CODES.R)) {
val intent = Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION).also {
it.data = Uri.parse("package:${context.packageName}")
}
context.startActivity(intent)
val intent =
Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION).also {
it.data = Uri.parse("package:${activity.packageName}")
}
activity.startActivity(intent)
} else {
ActivityCompat.requestPermissions(context, externalStoragePermissions, permissionGroup)
ActivityCompat.requestPermissions(
activity,
externalStoragePermissions,
permissionGroup.ordinal
)
}
}
}
}
fun checkPermission(context: Context, permissionGroup: Int): Boolean {
override fun checkPermission(permissionGroup: PermissionGroup): Boolean {
return when (permissionGroup) {
CALENDAR -> {
PermissionGroup.Calendar -> {
calendarPermissions.all { context.checkPermission(it) }
}
LOCATION -> {
PermissionGroup.Location -> {
locationPermissions.all { context.checkPermission(it) }
}
CONTACTS -> {
PermissionGroup.Contacts -> {
contactPermissions.all { context.checkPermission(it) }
}
EXTERNAL_STORAGE -> {
PermissionGroup.ExternalStorage -> {
if (isAtLeastApiLevel(Build.VERSION_CODES.R)) {
Environment.isExternalStorageManager()
} else {
@@ -60,15 +80,14 @@ object PermissionsManager {
}
}
const val CALENDAR = 0x1
private val calendarPermissions = arrayOf(Manifest.permission.READ_CALENDAR)
const val LOCATION = 0x2
private val locationPermissions = arrayOf(Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION)
const val CONTACTS = 0x4
private val locationPermissions = arrayOf(
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION
)
private val contactPermissions = arrayOf(Manifest.permission.READ_CONTACTS)
const val EXTERNAL_STORAGE = 0x8
private val externalStoragePermissions = arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE)
const val NOTIFICATIONS = 0x10
const val ALL = 0x12
private val externalStoragePermissions = arrayOf(
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
)
}