1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
| class PermissionActivity : AppCompatActivity() { companion object { const val REQUEST_CODE = 1001 val LOCATION_PERMISSIONS = arrayOf( Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION ) val CAMERA_PERMISSIONS = arrayOf( Manifest.permission.CAMERA ) val MEDIA_PERMISSIONS = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { arrayOf( Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.READ_MEDIA_VIDEO, Manifest.permission.READ_MEDIA_AUDIO ) } else { arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE) } } private var pendingPermissions: Array<String>? = null private var onGranted: (() -> Unit)? = null private var onDenied: ((List<String>) -> Unit)? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) pendingPermissions = intent.getStringArrayExtra("permissions") if (pendingPermissions.isNullOrEmpty()) { finish() return } if (PermissionHelper.hasPermissions(this, pendingPermissions!!)) { onGranted?.invoke() finish() return } requestPermissions(pendingPermissions!!, REQUEST_CODE) } @Deprecated("Deprecated in Java") override fun onRequestPermissionsResult( requestCode: Int, permissions: Array<out String>, grantResults: IntArray ) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) if (requestCode != REQUEST_CODE) return val deniedList = mutableListOf<String>() grantResults.forEachIndexed { index, result -> if (result != PackageManager.PERMISSION_GRANTED) { deniedList.add(permissions[index]) } } if (deniedList.isEmpty()) { onGranted?.invoke() } else { onDenied?.invoke(deniedList) } finish() } class Builder(private val activity: Activity) { private val permissions = mutableListOf<String>() private var onGranted: (() -> Unit)? = null private var onDenied: ((List<String>) -> Unit)? = null private var onAllDenied: (() -> Unit)? = null fun addPermissions(vararg permissions: String) = apply { this.permissions.addAll(permissions) } fun onGranted(action: () -> Unit) = apply { this.onGranted = action } fun onDenied(action: (List<String>) -> Unit) = apply { this.onDenied = action } fun onAllDenied(action: () -> Unit) = apply { this.onAllDenied = action } fun request() { if (permissions.isEmpty()) { onGranted?.invoke() return } val intent = Intent(activity, PermissionActivity::class.java).apply { putExtra("permissions", permissions.toTypedArray()) } activity.startActivityForResult(intent, REQUEST_CODE) } } }
|