milan jurkulák пре 2 година
родитељ
комит
f3c1ea8c82

+ 1 - 1
src/main/kotlin/eu/mjdev/desktop/components/appsmenu/AppsMenuApp.kt

@@ -35,7 +35,7 @@ fun AppsMenuApp(
     modifier = modifier.clickable { onClick(app) },
     modifier = modifier.clickable { onClick(app) },
     verticalAlignment = Alignment.CenterVertically,
     verticalAlignment = Alignment.CenterVertically,
 ) {
 ) {
-    val materialIcon = api.appsProvider.iconForApp(app?.name ?: icon) ?: "?".toInt()
+    val materialIcon = api.currentUser.theme.iconSet.iconForName(app?.name ?: icon) ?: "?".toInt()
     MaterialIcon(
     MaterialIcon(
         iconId = materialIcon,
         iconId = materialIcon,
         iconSize = iconSize,
         iconSize = iconSize,

+ 1 - 1
src/main/kotlin/eu/mjdev/desktop/components/appsmenu/AppsMenuCategory.kt

@@ -34,7 +34,7 @@ fun AppsMenuCategory(
     modifier = modifier.clickable { onClick(category) },
     modifier = modifier.clickable { onClick(category) },
     verticalAlignment = Alignment.CenterVertically
     verticalAlignment = Alignment.CenterVertically
 ) {
 ) {
-    val materialIcon = api.appsProvider.iconForApp(category.name) ?: "?".toInt()
+    val materialIcon = api.currentUser.theme.iconSet.iconForName(category.name) ?: "?".toInt()
     MaterialIcon(
     MaterialIcon(
         iconId = materialIcon,
         iconId = materialIcon,
         iconSize = iconSize,
         iconSize = iconSize,

+ 2 - 5
src/main/kotlin/eu/mjdev/desktop/components/desktoppanel/DesktopPanel.kt

@@ -10,10 +10,7 @@ import androidx.compose.foundation.layout.*
 import androidx.compose.foundation.lazy.LazyRow
 import androidx.compose.foundation.lazy.LazyRow
 import androidx.compose.foundation.lazy.items
 import androidx.compose.foundation.lazy.items
 import androidx.compose.material.Divider
 import androidx.compose.material.Divider
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.MutableState
-import androidx.compose.runtime.collectAsState
-import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.*
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Brush
 import androidx.compose.ui.graphics.Brush
@@ -78,7 +75,7 @@ fun DesktopPanel(
             state = panelState,
             state = panelState,
             onVisibilityChange = onVisibilityChange
             onVisibilityChange = onVisibilityChange
         ) { isVisible ->
         ) { isVisible ->
-            val favoriteApps = api.appsProvider.favoriteApps.collectAsState(emptyList())
+            val favoriteApps: State<List<App>> = api.appsProvider.favoriteApps.collectAsState(emptyList())
             val tooltipData: MutableState<Any?> = mutableStateOf(null)
             val tooltipData: MutableState<Any?> = mutableStateOf(null)
             val onToolTip: (item: Any?) -> Unit = { item -> tooltipData.value = item }
             val onToolTip: (item: Any?) -> Unit = { item -> tooltipData.value = item }
             if (!isVisible) {
             if (!isVisible) {

+ 1 - 1
src/main/kotlin/eu/mjdev/desktop/components/desktoppanel/DesktopPanelIcon.kt

@@ -43,7 +43,7 @@ fun DesktopPanelIcon(
     onToolTip: (item: Any?) -> Unit = {},
     onToolTip: (item: Any?) -> Unit = {},
     onClick: () -> Unit,
     onClick: () -> Unit,
 ) {
 ) {
-    val materialIcon = api.appsProvider.iconForApp(app?.name ?: icon) ?: "?".toInt()
+    val materialIcon = api.currentUser.theme.iconSet.iconForName(app?.name ?: icon) ?: "?".toInt()
     val background = remember(iconState.value) { if (iconState.value) iconBackgroundHover else Color.Transparent }
     val background = remember(iconState.value) { if (iconState.value) iconBackgroundHover else Color.Transparent }
     Box(
     Box(
         modifier = Modifier
         modifier = Modifier

+ 9 - 5
src/main/kotlin/eu/mjdev/desktop/components/fonticon/CodePointsFile.kt

@@ -5,8 +5,12 @@ import eu.mjdev.desktop.helpers.ResourceStream
 class CodePointsFile(
 class CodePointsFile(
     private val codepointsFileName: String,
     private val codepointsFileName: String,
     private val codepointsResourceResource: ResourceStream = ResourceStream(codepointsFileName),
     private val codepointsResourceResource: ResourceStream = ResourceStream(codepointsFileName),
-    val icons: Map<String, Int> = codepointsResourceResource.string.split("\n")
-        .map { it.split(" ") }
-        .mapNotNull { if (it.size == 2) Pair(it[0], it[1].toInt(radix = 16)) else null }
-        .toMap()
-)
+
+    ) {
+    val icons: Map<String, Int> by lazy {
+        codepointsResourceResource.string.split("\n")
+            .map { it.split(" ") }
+            .mapNotNull { if (it.size == 2) Pair(it[0], it[1].toInt(radix = 16)) else null }
+            .toMap()
+    }
+}

+ 1 - 1
src/main/kotlin/eu/mjdev/desktop/components/fonticon/MaterialIcon.kt

@@ -49,7 +49,7 @@ fun MaterialIcon(
                 min = 16.sp,
                 min = 16.sp,
                 max = (iconSize.height - (innerPadding.width + outerPadding.width)).sp,
                 max = (iconSize.height - (innerPadding.width + outerPadding.width)).sp,
             ),
             ),
-            fontFamily = iconicFont.fontFile.fontFamily,
+            fontFamily = iconicFont.fontFamily,
             textAlign = TextAlign.Center
             textAlign = TextAlign.Center
         )
         )
     },
     },

+ 19 - 3
src/main/kotlin/eu/mjdev/desktop/components/fonticon/MaterialIconFont.kt

@@ -2,12 +2,28 @@
 
 
 package eu.mjdev.desktop.components.fonticon
 package eu.mjdev.desktop.components.fonticon
 
 
+import androidx.compose.ui.text.font.FontFamily
+import me.xdrop.fuzzywuzzy.FuzzySearch
+
 class MaterialIconFont(
 class MaterialIconFont(
     private val ttfFileName: String,
     private val ttfFileName: String,
     private val codepointsFileName: String,
     private val codepointsFileName: String,
-    val fontFile: FontFile = FontFile(ttfFileName),
-    val codePointsFile: CodePointsFile = CodePointsFile(codepointsFileName)
-)
+    private val fontFile: FontFile = FontFile(ttfFileName),
+    private val codePointsFile: CodePointsFile = CodePointsFile(codepointsFileName)
+) {
+    val fontFamily: FontFamily
+        get() = fontFile.fontFamily
+
+    fun iconForName(
+        name: String?,
+    ): Int? = runCatching {
+        if (name != null) {
+            codePointsFile.icons.map { icon ->
+                Pair(FuzzySearch.ratio(name, icon.key), icon)
+            }.maxByOrNull { it.first }?.second?.value
+        } else null
+    }.getOrNull()
+}
 
 
 val MaterialSymbolsOutlined
 val MaterialSymbolsOutlined
     get() = MaterialIconFont(
     get() = MaterialIconFont(

+ 15 - 0
src/main/kotlin/eu/mjdev/desktop/extensions/Locale.kt

@@ -0,0 +1,15 @@
+package eu.mjdev.desktop.extensions
+
+import java.util.Locale
+
+object Locale {
+
+    fun String.toLocale(): Locale = this.split("_").let { lc ->
+        when (lc.size) {
+            2 -> Locale(lc[0], lc[1])
+            1 -> Locale(lc[0])
+            else -> java.util.Locale.ENGLISH
+        }
+    }
+
+}

+ 49 - 0
src/main/kotlin/eu/mjdev/desktop/helpers/Command.kt

@@ -0,0 +1,49 @@
+package eu.mjdev.desktop.helpers
+
+import com.google.gson.Gson
+import java.io.BufferedReader
+import java.io.InputStreamReader
+import java.util.*
+
+@Suppress("MemberVisibilityCanBePrivate", "unused")
+class Command(
+    val cmd: String,
+    vararg val args: String
+) {
+    private val _cmd
+        get() = mutableListOf<String>().apply {
+            add(cmd)
+            addAll(args)
+        }
+
+    var error: Throwable? = null
+    var result: String = ""
+
+    fun execute(): String? = runCatching {
+        StringJoiner(System.lineSeparator()).let { sj ->
+            val p = ProcessBuilder(_cmd).start()
+            BufferedReader(InputStreamReader(p.inputStream))
+                .lines()
+                .iterator()
+                .forEachRemaining { newElement: String? ->
+                    sj.add(newElement)
+                }
+            result = sj.toString()
+            p.waitFor()
+            p.destroy()
+            result
+        }
+    }.onFailure { e ->
+        error = e
+    }.getOrNull()
+
+    companion object {
+        inline fun <reified T> String.to(): T? = runCatching {
+            Gson().fromJson(this, T::class.java)
+        }.getOrNull()
+
+        inline fun <reified T> String.toList(): List<T>? = runCatching {
+            Gson().fromJson(this, List::class.java).mapNotNull { item -> item as? T }
+        }.getOrNull()
+    }
+}

+ 20 - 22
src/main/kotlin/eu/mjdev/desktop/provider/DesktopProvider.kt

@@ -9,13 +9,11 @@ import eu.mjdev.dadb.AdbDiscover.Companion.adbDevicesHandler
 import eu.mjdev.desktop.components.controlcenter.ControlCenterPage
 import eu.mjdev.desktop.components.controlcenter.ControlCenterPage
 import eu.mjdev.desktop.components.controlcenter.pages.*
 import eu.mjdev.desktop.components.controlcenter.pages.*
 import eu.mjdev.desktop.provider.data.User
 import eu.mjdev.desktop.provider.data.User
+import eu.mjdev.desktop.provider.providers.AppsProvider
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.CoroutineScope
 import java.awt.Toolkit
 import java.awt.Toolkit
-import java.io.BufferedReader
 import java.io.File
 import java.io.File
 import java.io.FileReader
 import java.io.FileReader
-import java.io.InputStreamReader
-import java.util.*
 import javax.script.ScriptEngine
 import javax.script.ScriptEngine
 import javax.script.ScriptEngineManager
 import javax.script.ScriptEngineManager
 
 
@@ -85,25 +83,25 @@ class DesktopProvider(
         }.start()
         }.start()
     }
     }
 
 
-    fun runCommandForOutput(vararg cmd: String): String? = runCatching {
-        val sj = StringJoiner(System.lineSeparator())
-        var result = ""
-        try {
-            val p = ProcessBuilder(*cmd).start()
-            BufferedReader(InputStreamReader(p.inputStream))
-                .lines()
-                .iterator()
-                .forEachRemaining { newElement: String? ->
-                    sj.add(newElement)
-                }
-            result = sj.toString()
-            p.waitFor()
-            p.destroy()
-        } catch (e: Exception) {
-            e.printStackTrace()
-        }
-        result
-    }.getOrNull()
+//    fun runCommandForOutput(vararg cmd: String): String? = runCatching {
+//        val sj = StringJoiner(System.lineSeparator())
+//        var result = ""
+//        try {
+//            val p = ProcessBuilder(*cmd).start()
+//            BufferedReader(InputStreamReader(p.inputStream))
+//                .lines()
+//                .iterator()
+//                .forEachRemaining { newElement: String? ->
+//                    sj.add(newElement)
+//                }
+//            result = sj.toString()
+//            p.waitFor()
+//            p.destroy()
+//        } catch (e: Exception) {
+//            e.printStackTrace()
+//        }
+//        result
+//    }.getOrNull()
 
 
     companion object {
     companion object {
         val LocalDesktop = compositionLocalOf {
         val LocalDesktop = compositionLocalOf {

+ 13 - 30
src/main/kotlin/eu/mjdev/desktop/provider/AppsProvider.kt → src/main/kotlin/eu/mjdev/desktop/provider/providers/AppsProvider.kt

@@ -1,9 +1,13 @@
-package eu.mjdev.desktop.provider
+package eu.mjdev.desktop.provider.providers
 
 
-import com.google.gson.Gson
+import eu.mjdev.desktop.extensions.Locale.toLocale
+import eu.mjdev.desktop.helpers.Command
+import eu.mjdev.desktop.helpers.Command.Companion.toList
+import eu.mjdev.desktop.provider.DesktopProvider
 import eu.mjdev.desktop.provider.data.App
 import eu.mjdev.desktop.provider.data.App
 import eu.mjdev.desktop.provider.data.Category
 import eu.mjdev.desktop.provider.data.Category
 import eu.mjdev.desktop.provider.data.DesktopFile
 import eu.mjdev.desktop.provider.data.DesktopFile
+import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.flow
 import kotlinx.coroutines.flow.flow
 import me.xdrop.fuzzywuzzy.FuzzySearch
 import me.xdrop.fuzzywuzzy.FuzzySearch
 import java.io.File
 import java.io.File
@@ -119,21 +123,18 @@ class AppsProvider(
         }
         }
 
 
     @Suppress("UNNECESSARY_SAFE_CALL")
     @Suppress("UNNECESSARY_SAFE_CALL")
-    val favoriteApps
+    val favoriteApps: Flow<List<App>>
         get() = flow {
         get() = flow {
-            val desktopFiles = allAppsDesktopFiles
-            desktopProvider.runCommandForOutput(
+            Command(
                 "gsettings",
                 "gsettings",
                 "get",
                 "get",
                 "org.gnome.shell",
                 "org.gnome.shell",
                 "favorite-apps"
                 "favorite-apps"
-            ).let { json ->
-                Gson().fromJson(json ?: "[]", List::class.java)
-            }.mapNotNull { appName ->
-                val deskFile = desktopFiles.filter { deskFile ->
-                    deskFile?.file?.name?.contains(appName.toString()) == true
+            ).execute()?.toList<String>()?.map { appName ->
+                val deskFile = allAppsDesktopFiles.filter { deskFile ->
+                    deskFile?.file?.name?.contains(appName) == true
                 }.map { deskFile ->
                 }.map { deskFile ->
-                    Pair(FuzzySearch.ratio(appName.toString(), deskFile.file.name), deskFile)
+                    Pair(FuzzySearch.ratio(appName, deskFile.file.name), deskFile)
                 }.maxByOrNull {
                 }.maxByOrNull {
                     it.first
                     it.first
                 }?.second
                 }?.second
@@ -144,26 +145,8 @@ class AppsProvider(
                     null
                     null
                 }
                 }
             }.also { list ->
             }.also { list ->
-                emit(list)
+                emit(list?.filterNotNull() ?: emptyList())
             }
             }
         }
         }
 
 
-    fun iconForApp(
-        name: String?,
-    ): Int? = runCatching {
-        if (name != null) {
-            desktopProvider.currentUser.theme.iconSet.codePointsFile.icons.map { icon ->
-                Pair(FuzzySearch.ratio(name, icon.key), icon)
-            }.maxByOrNull { it.first }?.second?.value
-        } else null
-    }.getOrNull()
-
-}
-
-private fun String.toLocale() = this.split("_").let { lc ->
-    when (lc.size) {
-        2 -> Locale(lc[0], lc[1])
-        1 -> Locale(lc[0])
-        else -> Locale.ENGLISH
-    }
 }
 }