Handle permissions on < Android 12

This commit is contained in:
darken
2022-01-05 12:14:34 +01:00
parent 462c464de2
commit 4405faa907
5 changed files with 34 additions and 14 deletions
+3 -4
View File
@@ -21,8 +21,7 @@
<uses-permission
android:name="android.permission.ACCESS_FINE_LOCATION"
android:maxSdkVersion="30" />
<!-- <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />-->
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
<uses-feature
android:name="android.hardware.bluetooth_le"
@@ -40,8 +39,8 @@
<activity
android:name=".main.ui.MainActivity"
android:exported="true"
android:launchMode="singleTop"
android:label="@string/app_name">
android:label="@string/app_name"
android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
@@ -35,15 +35,22 @@ enum class Permission(
permissionId = "android.permission.BLUETOOTH_SCAN",
),
ACCESS_FINE_LOCATION(
minApiLevel = Build.VERSION_CODES.S,
minApiLevel = Build.VERSION_CODES.BASE,
maxApiLevel = Build.VERSION_CODES.R,
labelRes = R.string.permission_access_fine_location_label,
descriptionRes = R.string.permission_access_fine_location_description,
permissionId = "android.permission.ACCESS_FINE_LOCATION",
),
ACCESS_BACKGROUND_LOCATION(
minApiLevel = Build.VERSION_CODES.Q,
maxApiLevel = Build.VERSION_CODES.R,
labelRes = R.string.permission_background_location_label,
descriptionRes = R.string.permission_background_location_description,
permissionId = "android.permission.ACCESS_BACKGROUND_LOCATION",
)
}
fun Permission.isGrantedOrNotRequired(context: Context): Boolean = when {
!withinApiLevel(minApiLevel, maxApiLevel) -> true
else -> ContextCompat.checkSelfPermission(context, permissionId) == PackageManager.PERMISSION_GRANTED
fun Permission.isRequired(context: Context): Boolean = when {
!withinApiLevel(minApiLevel, maxApiLevel) -> false
else -> ContextCompat.checkSelfPermission(context, permissionId) != PackageManager.PERMISSION_GRANTED
}
@@ -7,13 +7,15 @@ import dagger.hilt.android.lifecycle.HiltViewModel
import dagger.hilt.android.qualifiers.ApplicationContext
import eu.darken.capod.common.coroutine.DispatcherProvider
import eu.darken.capod.common.debug.autoreport.DebugSettings
import eu.darken.capod.common.debug.logging.log
import eu.darken.capod.common.debug.recording.core.RecorderModule
import eu.darken.capod.common.livedata.SingleLiveEvent
import eu.darken.capod.common.navigation.navVia
import eu.darken.capod.common.permissions.Permission
import eu.darken.capod.common.permissions.isGrantedOrNotRequired
import eu.darken.capod.common.permissions.isRequired
import eu.darken.capod.common.uix.ViewModel3
import eu.darken.capod.main.core.GeneralSettings
import eu.darken.capod.main.core.MonitorMode
import eu.darken.capod.main.ui.overview.cards.PermissionCardVH
import eu.darken.capod.main.ui.overview.cards.pods.BasicSingleApplePodsCardVH
import eu.darken.capod.main.ui.overview.cards.pods.DualApplePodsCardVH
@@ -54,10 +56,12 @@ class OverviewFragmentVM @Inject constructor(
private val permissionCheckTrigger = MutableStateFlow(UUID.randomUUID())
private val requiredPermissions: Flow<List<Permission>> = permissionCheckTrigger
.map {
Permission.values().filter { !it.isGrantedOrNotRequired(context) }
Permission.values().filter { it.isRequired(context) }
}
.onEach {
if (it.isEmpty()) {
log(TAG) { "Missing permissions: $it" }
if (it.isEmpty() && generalSettings.monitorMode.value != MonitorMode.MANUAL) {
log(TAG) { "All permissions granted, starting monitor." }
monitorControl.startMonitor()
}
}
@@ -84,6 +88,7 @@ class OverviewFragmentVM @Inject constructor(
}
}
}
.catch { errorEvents.postValue(it) }
val listItems: LiveData<List<OverviewAdapter.Item>> = combine(
updateTicker,
@@ -114,7 +119,9 @@ class OverviewFragmentVM @Inject constructor(
.run { items.addAll(this) }
items
}.asLiveData2()
}
.catch { errorEvents.postValue(it) }
.asLiveData2()
fun onPermissionResult(granted: Boolean) {
if (granted) permissionCheckTrigger.value = UUID.randomUUID()
@@ -2,6 +2,8 @@ package eu.darken.capod.main.ui.overview.cards
import android.view.ViewGroup
import eu.darken.capod.R
import eu.darken.capod.common.lists.binding
import eu.darken.capod.common.lists.differ.DifferItem
import eu.darken.capod.common.permissions.Permission
import eu.darken.capod.databinding.MainPermissionItemBinding
import eu.darken.capod.main.ui.overview.OverviewAdapter
@@ -19,7 +21,7 @@ class PermissionCardVH(parent: ViewGroup) :
override val onBindData: MainPermissionItemBinding.(
item: Item,
payloads: List<Any>
) -> Unit = { item, _ ->
) -> Unit = binding(payload = true) { item ->
permissionLabel.setText(item.permission.labelRes)
permissionDescription.setText(item.permission.descriptionRes)
grantAction.setOnClickListener { item.onRequest(item.permission) }
@@ -29,6 +31,9 @@ class PermissionCardVH(parent: ViewGroup) :
val permission: Permission,
val onRequest: (Permission) -> Unit
) : OverviewAdapter.Item {
override val stableId: Long = this.javaClass.hashCode().toLong()
override val stableId: Long = permission.hashCode().toLong()
override val payloadProvider: ((DifferItem, DifferItem) -> DifferItem?)
get() = { old, new -> if (new::class.isInstance(old)) new else null }
}
}
+2
View File
@@ -101,4 +101,6 @@
<string name="settings_autoplay_description">Start music playback music when wearing the device (if supported).</string>
<string name="pods_dual_case_status_short">L %1$s | C %2$s | R %3$s</string>
<string name="pods_single_basic_status_short">Headphones: %1$s</string>
<string name="permission_background_location_label">ACCESS_BACKGROUND_LOCATION</string>
<string name="permission_background_location_description">Allows an app to access location in the background.</string>
</resources>