From bba805ccd652ef716995d0f3f781c4ae8dffbc8a Mon Sep 17 00:00:00 2001 From: MM20 <15646950+MM2-0@users.noreply.github.com> Date: Wed, 20 Dec 2023 17:03:24 +0100 Subject: [PATCH] SDK: fix storing permission grants --- .../launcher2/sdk/permissions/DataStore.kt | 31 ++++++++++++++----- .../sdk/permissions/PermissionData.kt | 8 +++++ .../permissions/PluginPermissionManager.kt | 10 ++++-- 3 files changed, 38 insertions(+), 11 deletions(-) create mode 100644 plugins/sdk/src/main/java/de/mm20/launcher2/sdk/permissions/PermissionData.kt diff --git a/plugins/sdk/src/main/java/de/mm20/launcher2/sdk/permissions/DataStore.kt b/plugins/sdk/src/main/java/de/mm20/launcher2/sdk/permissions/DataStore.kt index a6c3533b..415a303c 100644 --- a/plugins/sdk/src/main/java/de/mm20/launcher2/sdk/permissions/DataStore.kt +++ b/plugins/sdk/src/main/java/de/mm20/launcher2/sdk/permissions/DataStore.kt @@ -1,25 +1,40 @@ package de.mm20.launcher2.sdk.permissions import android.content.Context +import androidx.datastore.core.CorruptionException import androidx.datastore.core.Serializer 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.OutputStream internal val Context.permissionsDataStore by dataStore( - fileName = "plugin_permissions", + fileName = "plugin_permissions.json", serializer = PermissionsSerializer, ) -internal object PermissionsSerializer : Serializer> { - override val defaultValue: Set - get() = emptySet() +internal object PermissionsSerializer : Serializer { - override suspend fun readFrom(input: InputStream): Set { - return input.bufferedReader().readLines().toSet() + override val defaultValue: PermissionData + 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, output: OutputStream) { - output.bufferedWriter().write(t.joinToString("\n")) + override suspend fun writeTo(t: PermissionData, output: OutputStream) { + Json.encodeToStream(t, output) } } \ No newline at end of file diff --git a/plugins/sdk/src/main/java/de/mm20/launcher2/sdk/permissions/PermissionData.kt b/plugins/sdk/src/main/java/de/mm20/launcher2/sdk/permissions/PermissionData.kt new file mode 100644 index 00000000..f566859f --- /dev/null +++ b/plugins/sdk/src/main/java/de/mm20/launcher2/sdk/permissions/PermissionData.kt @@ -0,0 +1,8 @@ +package de.mm20.launcher2.sdk.permissions + +import kotlinx.serialization.Serializable + +@Serializable +data class PermissionData( + val granted: Set = emptySet(), +) \ No newline at end of file diff --git a/plugins/sdk/src/main/java/de/mm20/launcher2/sdk/permissions/PluginPermissionManager.kt b/plugins/sdk/src/main/java/de/mm20/launcher2/sdk/permissions/PluginPermissionManager.kt index 845a0880..2fa83a27 100644 --- a/plugins/sdk/src/main/java/de/mm20/launcher2/sdk/permissions/PluginPermissionManager.kt +++ b/plugins/sdk/src/main/java/de/mm20/launcher2/sdk/permissions/PluginPermissionManager.kt @@ -11,13 +11,15 @@ class PluginPermissionManager( private val dataStore = context.applicationContext.permissionsDataStore fun hasPermission(pluginPackage: String): Flow { - return dataStore.data.map { it.contains(pluginPackage) } + return dataStore.data.map { it.granted.contains(pluginPackage) } } fun grantPermission(pluginPackage: String) { runBlocking { dataStore.updateData { - it + pluginPackage + it.copy( + granted = it.granted + pluginPackage + ) } } } @@ -25,7 +27,9 @@ class PluginPermissionManager( fun revokePermission(pluginPackage: String) { runBlocking { dataStore.updateData { - it - pluginPackage + it.copy( + granted = it.granted - pluginPackage + ) } } }