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 }