Theming.kt (4961B) - raw
1 package me.rhunk.snapenhance.storage 2 3 import android.content.ContentValues 4 import kotlinx.coroutines.asCoroutineDispatcher 5 import kotlinx.coroutines.runBlocking 6 import me.rhunk.snapenhance.common.data.DatabaseTheme 7 import me.rhunk.snapenhance.common.data.DatabaseThemeContent 8 import me.rhunk.snapenhance.common.util.ktx.getIntOrNull 9 import me.rhunk.snapenhance.common.util.ktx.getStringOrNull 10 11 12 fun AppDatabase.getThemeList(): List<DatabaseTheme> { 13 return runBlocking(executor.asCoroutineDispatcher()) { 14 database.rawQuery("SELECT * FROM themes ORDER BY id DESC", null).use { cursor -> 15 val themes = mutableListOf<DatabaseTheme>() 16 while (cursor.moveToNext()) { 17 themes.add( 18 DatabaseTheme( 19 id = cursor.getIntOrNull("id") ?: continue, 20 enabled = cursor.getIntOrNull("enabled") == 1, 21 name = cursor.getStringOrNull("name") ?: continue, 22 description = cursor.getStringOrNull("description"), 23 version = cursor.getStringOrNull("version"), 24 author = cursor.getStringOrNull("author"), 25 updateUrl = cursor.getStringOrNull("updateUrl") 26 ) 27 ) 28 } 29 themes 30 } 31 } 32 } 33 34 fun AppDatabase.getThemeInfo(id: Int): DatabaseTheme? { 35 return runBlocking(executor.asCoroutineDispatcher()) { 36 database.rawQuery("SELECT * FROM themes WHERE id = ?", arrayOf(id.toString())).use { cursor -> 37 if (!cursor.moveToFirst()) return@use null 38 DatabaseTheme( 39 id = cursor.getIntOrNull("id") ?: return@use null, 40 enabled = cursor.getIntOrNull("enabled") == 1, 41 name = cursor.getStringOrNull("name") ?: return@use null, 42 description = cursor.getStringOrNull("description"), 43 version = cursor.getStringOrNull("version"), 44 author = cursor.getStringOrNull("author"), 45 updateUrl = cursor.getStringOrNull("updateUrl") 46 ) 47 } 48 } 49 } 50 51 fun AppDatabase.getThemeIdByUpdateUrl(updateUrl: String): Int? { 52 return runBlocking(executor.asCoroutineDispatcher()) { 53 database.rawQuery("SELECT id FROM themes WHERE updateUrl = ?", arrayOf(updateUrl)).use { cursor -> 54 if (!cursor.moveToFirst()) return@use null 55 cursor.getIntOrNull("id") 56 } 57 } 58 } 59 60 fun AppDatabase.addOrUpdateTheme(theme: DatabaseTheme, themeId: Int? = null): Int { 61 return runBlocking(executor.asCoroutineDispatcher()) { 62 val contentValues = ContentValues().apply { 63 put("enabled", if (theme.enabled) 1 else 0) 64 put("name", theme.name) 65 put("description", theme.description) 66 put("version", theme.version) 67 put("author", theme.author) 68 put("updateUrl", theme.updateUrl) 69 } 70 if (themeId != null) { 71 database.update("themes", contentValues, "id = ?", arrayOf(themeId.toString())) 72 return@runBlocking themeId 73 } 74 database.insert("themes", null, contentValues).toInt() 75 } 76 } 77 78 fun AppDatabase.setThemeState(id: Int, enabled: Boolean) { 79 runBlocking(executor.asCoroutineDispatcher()) { 80 database.update("themes", ContentValues().apply { 81 put("enabled", if (enabled) 1 else 0) 82 }, "id = ?", arrayOf(id.toString())) 83 } 84 } 85 86 fun AppDatabase.deleteTheme(id: Int) { 87 runBlocking(executor.asCoroutineDispatcher()) { 88 database.delete("themes", "id = ?", arrayOf(id.toString())) 89 } 90 } 91 92 93 fun AppDatabase.getThemeContent(id: Int): DatabaseThemeContent? { 94 return runBlocking(executor.asCoroutineDispatcher()) { 95 database.rawQuery("SELECT content FROM themes WHERE id = ?", arrayOf(id.toString())).use { cursor -> 96 if (!cursor.moveToFirst()) return@use null 97 runCatching { 98 context.gson.fromJson(cursor.getStringOrNull("content"), DatabaseThemeContent::class.java) 99 }.getOrNull() 100 } 101 } 102 } 103 104 105 fun AppDatabase.getEnabledThemesContent(): List<DatabaseThemeContent> { 106 return runBlocking(executor.asCoroutineDispatcher()) { 107 database.rawQuery("SELECT content FROM themes WHERE enabled = 1", null).use { cursor -> 108 val themes = mutableListOf<DatabaseThemeContent>() 109 while (cursor.moveToNext()) { 110 runCatching { 111 themes.add(context.gson.fromJson(cursor.getStringOrNull("content"), DatabaseThemeContent::class.java)) 112 } 113 } 114 themes 115 } 116 } 117 } 118 119 120 fun AppDatabase.setThemeContent(id: Int, content: DatabaseThemeContent) { 121 runBlocking(executor.asCoroutineDispatcher()) { 122 database.update("themes", ContentValues().apply { 123 put("content", context.gson.toJson(content)) 124 }, "id = ?", arrayOf(id.toString())) 125 } 126 }