Explorar el Código

Added sqlite local storage

Vadik Sirekanyan hace 2 años
padre
commit
6c5468e51c

+ 11 - 0
app/build.gradle.kts

@@ -2,6 +2,7 @@ plugins {
     id("com.android.application")
     kotlin("android")
     kotlin("plugin.serialization")
+    id("com.squareup.sqldelight")
     id("org.sirekanyan.version-checker")
 }
 
@@ -59,4 +60,14 @@ dependencies {
     implementation("io.ktor:ktor-serialization-kotlinx-json:2.3.3")
     implementation("org.slf4j:slf4j-simple:2.0.7")
 
+    // sqldelight
+    implementation("com.squareup.sqldelight:android-driver:1.5.5")
+    implementation("com.squareup.sqldelight:coroutines-extensions:1.5.5")
+
+}
+
+sqldelight {
+    database("OutlineDatabase") {
+        packageName = "org.sirekanyan.outline.db"
+    }
 }

+ 1 - 1
app/src/main/java/org/sirekanyan/outline/MainState.kt

@@ -20,7 +20,7 @@ fun rememberMainState(): MainState {
 class MainState(val scope: CoroutineScope) {
 
     val drawer = DrawerState(DrawerValue.Closed)
-    var selected by mutableStateOf<Int?>(null)
+    var selected by mutableStateOf<String?>(null)
 
     fun closeDrawer() {
         scope.launch { drawer.close() }

+ 2 - 8
app/src/main/java/org/sirekanyan/outline/api/OutlineApi.kt

@@ -13,10 +13,6 @@ import org.sirekanyan.outline.api.model.Key
 import org.sirekanyan.outline.api.model.ServerNameResponse
 import org.sirekanyan.outline.api.model.TransferMetricsResponse
 
-val API_URLS: List<String> = listOf(
-    // TODO: add api urls
-)
-
 class OutlineApi {
 
     private val httpClient = HttpClient(CIO) {
@@ -29,8 +25,7 @@ class OutlineApi {
     suspend fun getServerName(apiUrl: String): String =
         httpClient.get("$apiUrl/server").body<ServerNameResponse>().name
 
-    suspend fun getKeys(index: Int): List<Key> {
-        val apiUrl = API_URLS.getOrNull(index) ?: return listOf()
+    suspend fun getKeys(apiUrl: String): List<Key> {
         val accessKeys = getAccessKeys(apiUrl).accessKeys
         val transferMetrics = getTransferMetrics(apiUrl).bytesTransferredByUserId
         return accessKeys.map { accessKey -> Key(accessKey, transferMetrics[accessKey.id]) }
@@ -42,8 +37,7 @@ class OutlineApi {
     private suspend fun getTransferMetrics(apiUrl: String): TransferMetricsResponse =
         httpClient.get("$apiUrl/metrics/transfer").body()
 
-    suspend fun createAccessKey(index: Int) {
-        val apiUrl = API_URLS.getOrNull(index) ?: return
+    suspend fun createAccessKey(apiUrl: String) {
         httpClient.post("$apiUrl/access-keys")
     }
 

+ 34 - 0
app/src/main/java/org/sirekanyan/outline/db/ApiUrlDao.kt

@@ -0,0 +1,34 @@
+package org.sirekanyan.outline.db
+
+import android.app.Application
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+import androidx.compose.ui.platform.LocalContext
+import com.squareup.sqldelight.android.AndroidSqliteDriver
+import com.squareup.sqldelight.runtime.coroutines.asFlow
+import com.squareup.sqldelight.runtime.coroutines.mapToList
+import kotlinx.coroutines.flow.Flow
+
+@Composable
+fun rememberApiUrlDao(): ApiUrlDao {
+    val app = LocalContext.current.applicationContext as Application
+    return remember { ApiUrlDao(app) }
+}
+
+class ApiUrlDao(app: Application) {
+
+    private val driver = AndroidSqliteDriver(OutlineDatabase.Schema, app, "outline.db")
+    private val queries = OutlineDatabase(driver).apiUrlQueries
+
+    fun observeUrls(): Flow<List<String>> =
+        queries.selectUrl().asFlow().mapToList()
+
+    fun insertUrl(id: String) {
+        queries.insertUrl(id)
+    }
+
+    fun deleteUrl(id: String) {
+        queries.deleteUrl(id)
+    }
+
+}

+ 8 - 4
app/src/main/java/org/sirekanyan/outline/ui/DrawerContent.kt

@@ -11,26 +11,30 @@ import androidx.compose.material3.ModalDrawerSheet
 import androidx.compose.material3.NavigationDrawerItem
 import androidx.compose.material3.Text
 import androidx.compose.runtime.Composable
+import androidx.compose.runtime.collectAsState
 import androidx.compose.runtime.getValue
 import androidx.compose.runtime.produceState
+import androidx.compose.runtime.remember
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.res.stringResource
 import androidx.compose.ui.unit.dp
 import org.sirekanyan.outline.MainState
 import org.sirekanyan.outline.R
-import org.sirekanyan.outline.api.API_URLS
 import org.sirekanyan.outline.api.OutlineApi
+import org.sirekanyan.outline.db.rememberApiUrlDao
 
 @Composable
 fun DrawerContent(api: OutlineApi, state: MainState) {
+    val dao = rememberApiUrlDao()
     ModalDrawerSheet {
         Text(
             text = stringResource(R.string.app_name),
             modifier = Modifier.padding(horizontal = 28.dp, vertical = 16.dp),
             style = MaterialTheme.typography.titleSmall,
         )
-        API_URLS.forEachIndexed { index, apiUrl ->
-            val selected = state.selected == index
+        val apiUrls by remember { dao.observeUrls() }.collectAsState(listOf())
+        apiUrls.forEach { apiUrl ->
+            val selected = state.selected == apiUrl
             val serverName by produceState(Uri.parse(apiUrl).host.orEmpty()) {
                 value = api.getServerName(apiUrl)
             }
@@ -40,7 +44,7 @@ fun DrawerContent(api: OutlineApi, state: MainState) {
                 modifier = Modifier.padding(horizontal = 12.dp),
                 selected = selected,
                 onClick = {
-                    state.selected = index
+                    state.selected = apiUrl
                     state.closeDrawer()
                 },
             )

+ 12 - 0
app/src/main/sqldelight/org/sirekanyan/outline/db/model/ApiUrl.sq

@@ -0,0 +1,12 @@
+CREATE TABLE IF NOT EXISTS ApiUrl (
+  id TEXT NOT NULL PRIMARY KEY
+);
+
+selectUrl:
+SELECT * FROM ApiUrl;
+
+insertUrl:
+INSERT INTO ApiUrl (id) VALUES (?);
+
+deleteUrl:
+DELETE FROM ApiUrl WHERE id = ?;

+ 1 - 0
build.gradle.kts

@@ -3,5 +3,6 @@ plugins {
     id("com.android.application") version "8.1.0" apply false
     kotlin("android") version kotlinVersion apply false
     kotlin("plugin.serialization") version kotlinVersion apply false
+    id("com.squareup.sqldelight") version "1.5.5" apply false
     id("org.sirekanyan.version-checker") version "1.0.7" apply false
 }