|
package com.justbnutz.labs |
|
|
|
import android.content.pm.PackageManager |
|
import android.view.View |
|
import android.widget.Toast |
|
import androidx.appcompat.app.AppCompatActivity |
|
import com.google.android.material.snackbar.Snackbar |
|
import com.justbnutz.labs.models.PermissionRequestCode |
|
import com.justbnutz.labs.models.PermissionResponse |
|
import java.util.* |
|
|
|
/** |
|
* Common methods between all activities go here |
|
*/ |
|
abstract class BaseActivity : AppCompatActivity() { |
|
|
|
// A queue of actions to take after we get the permission response callback, indexed by the request code enum |
|
private val permissionResponseQueue: EnumMap<PermissionRequestCode, (PermissionResponse) -> Unit> by lazy { EnumMap(PermissionRequestCode::class.java) } |
|
|
|
fun permissionCheck(requestedPermission: String, requestCode: PermissionRequestCode, permissionResponse: (PermissionResponse) -> Unit) { |
|
if (checkSelfPermission(requestedPermission) == PackageManager.PERMISSION_GRANTED) { |
|
// We have permission, can immediately execute the response action |
|
permissionResponse(PermissionResponse.PERMISSION_GRANTED) |
|
} else { |
|
// Permission not (yet) granted, trigger a request and handle the rest of the flow in onRequestPermissionsResult() |
|
requestPermissions(arrayOf(requestedPermission), requestCode.ordinal) |
|
|
|
// Queue up the response action so we can pick it up again in onRequestPermissionsResult() callback |
|
permissionResponseQueue[requestCode] = permissionResponse |
|
} |
|
} |
|
|
|
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) { |
|
// Check if requestCode matches an ordinal key value in permissionResponseQueue |
|
permissionResponseQueue.entries.firstOrNull { it.key.ordinal == requestCode }?.also { (key, permissionResponse) -> |
|
// Note: Can only handle singular permission requests for now: TODO: Handle multi-permission requests |
|
permissions.firstOrNull()?.let { requestedPermission -> |
|
grantResults.firstOrNull()?.let { permissionResult -> |
|
when { |
|
(permissionResult == PackageManager.PERMISSION_GRANTED) -> { |
|
// Permission granted, do the action |
|
permissionResponse(PermissionResponse.PERMISSION_GRANTED) |
|
} |
|
shouldShowRequestPermissionRationale(requestedPermission) -> { |
|
// Permission previously denied, but "Don't Show Again" left unchecked; can prompt again |
|
permissionResponse(PermissionResponse.PERMISSION_DENIED) |
|
} |
|
else -> { |
|
// Permission previously denied and "Don't show again" was checked; need to provide link to App Info / Settings. |
|
permissionResponse(PermissionResponse.PERMISSION_DONT_SHOW_AGAIN) |
|
} |
|
} |
|
} |
|
} |
|
// Response handled; remove the action item from the queue |
|
permissionResponseQueue.remove(key) |
|
} ?: run { |
|
// Request code is not part of the queue, let system handle response |
|
super.onRequestPermissionsResult(requestCode, permissions, grantResults) |
|
} |
|
} |
|
|
|
|
|
fun showSnackbar(view: View, message: String) { |
|
Snackbar.make(view, message, Snackbar.LENGTH_SHORT).show() |
|
} |
|
|
|
fun showToast(message: String) { |
|
Toast.makeText(this, message, Toast.LENGTH_SHORT).show() |
|
} |
|
} |