SDK: fix storing permission grants

This commit is contained in:
MM20 2023-12-20 17:03:24 +01:00
parent a4aa4120de
commit bba805ccd6
No known key found for this signature in database
GPG Key ID: 0B61A8F2DEAFA389
3 changed files with 38 additions and 11 deletions

View File

@ -1,25 +1,40 @@
package de.mm20.launcher2.sdk.permissions package de.mm20.launcher2.sdk.permissions
import android.content.Context import android.content.Context
import androidx.datastore.core.CorruptionException
import androidx.datastore.core.Serializer import androidx.datastore.core.Serializer
import androidx.datastore.dataStore import androidx.datastore.dataStore
import kotlinx.serialization.SerializationException
import kotlinx.serialization.json.Json
import kotlinx.serialization.json.decodeFromStream
import kotlinx.serialization.json.encodeToStream
import java.io.IOException
import java.io.InputStream import java.io.InputStream
import java.io.OutputStream import java.io.OutputStream
internal val Context.permissionsDataStore by dataStore( internal val Context.permissionsDataStore by dataStore(
fileName = "plugin_permissions", fileName = "plugin_permissions.json",
serializer = PermissionsSerializer, serializer = PermissionsSerializer,
) )
internal object PermissionsSerializer : Serializer<Set<String>> { internal object PermissionsSerializer : Serializer<PermissionData> {
override val defaultValue: Set<String>
get() = emptySet()
override suspend fun readFrom(input: InputStream): Set<String> { override val defaultValue: PermissionData
return input.bufferedReader().readLines().toSet() get() = PermissionData()
override suspend fun readFrom(input: InputStream): PermissionData {
try {
return Json.decodeFromStream(input)
} catch (e: IllegalArgumentException) {
throw (CorruptionException("Cannot read json.", e))
} catch (e: SerializationException) {
throw (CorruptionException("Cannot read json.", e))
} catch (e: IOException) {
throw (CorruptionException("Cannot read json.", e))
}
} }
override suspend fun writeTo(t: Set<String>, output: OutputStream) { override suspend fun writeTo(t: PermissionData, output: OutputStream) {
output.bufferedWriter().write(t.joinToString("\n")) Json.encodeToStream(t, output)
} }
} }

View File

@ -0,0 +1,8 @@
package de.mm20.launcher2.sdk.permissions
import kotlinx.serialization.Serializable
@Serializable
data class PermissionData(
val granted: Set<String> = emptySet(),
)

View File

@ -11,13 +11,15 @@ class PluginPermissionManager(
private val dataStore = context.applicationContext.permissionsDataStore private val dataStore = context.applicationContext.permissionsDataStore
fun hasPermission(pluginPackage: String): Flow<Boolean> { fun hasPermission(pluginPackage: String): Flow<Boolean> {
return dataStore.data.map { it.contains(pluginPackage) } return dataStore.data.map { it.granted.contains(pluginPackage) }
} }
fun grantPermission(pluginPackage: String) { fun grantPermission(pluginPackage: String) {
runBlocking { runBlocking {
dataStore.updateData { dataStore.updateData {
it + pluginPackage it.copy(
granted = it.granted + pluginPackage
)
} }
} }
} }
@ -25,7 +27,9 @@ class PluginPermissionManager(
fun revokePermission(pluginPackage: String) { fun revokePermission(pluginPackage: String) {
runBlocking { runBlocking {
dataStore.updateData { dataStore.updateData {
it - pluginPackage it.copy(
granted = it.granted - pluginPackage
)
} }
} }
} }