mirror of
https://github.com/d4rken-org/capod.git
synced 2026-09-15 02:36:12 -04:00
Handle permissions on < Android 12
This commit is contained in:
@@ -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 }
|
||||
}
|
||||
}
|
||||
@@ -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>
|
||||
Reference in New Issue
Block a user