Browse Source

code improvements

code improvements

code improvements
Milan Jurkulak 2 năm trước cách đây
mục cha
commit
0b10699694
48 tập tin đã thay đổi với 297 bổ sung và 181 xóa
  1. 7 4
      build.gradle.kts
  2. 2 2
      gradle/libs.versions.toml
  3. 0 6
      src/main/kotlin/eu/mjdev/dadb/helpers/AdbStreamClosed.kt
  4. 3 0
      src/main/kotlin/eu/mjdev/desktop/Main.kt
  5. 1 1
      src/main/kotlin/eu/mjdev/desktop/components/background/BackgroundImage.kt
  6. 2 2
      src/main/kotlin/eu/mjdev/desktop/components/charts/MemoryChart.kt
  7. 37 8
      src/main/kotlin/eu/mjdev/desktop/components/controlcenter/pages/MainSettingsPage.kt
  8. 1 1
      src/main/kotlin/eu/mjdev/desktop/components/fonticon/CodePointsFile.kt
  9. 1 1
      src/main/kotlin/eu/mjdev/desktop/components/fonticon/FontFile.kt
  10. 2 2
      src/main/kotlin/eu/mjdev/desktop/components/sliding/VisibilityState.kt
  11. 1 1
      src/main/kotlin/eu/mjdev/desktop/data/App.kt
  12. 5 0
      src/main/kotlin/eu/mjdev/desktop/extensions/Custom.kt
  13. 0 46
      src/main/kotlin/eu/mjdev/desktop/helpers/KCEFHelper.kt
  14. 14 13
      src/main/kotlin/eu/mjdev/desktop/helpers/adb/Adb.kt
  15. 5 5
      src/main/kotlin/eu/mjdev/desktop/helpers/adb/AdbDiscover.kt
  16. 1 1
      src/main/kotlin/eu/mjdev/desktop/helpers/adb/adbserver/AdbBinary.kt
  17. 7 7
      src/main/kotlin/eu/mjdev/desktop/helpers/adb/adbserver/AdbServer.kt
  18. 10 5
      src/main/kotlin/eu/mjdev/desktop/helpers/adb/forwarding/TcpForwarder.kt
  19. 2 1
      src/main/kotlin/eu/mjdev/desktop/helpers/adb/helpers/AdbConnection.kt
  20. 5 4
      src/main/kotlin/eu/mjdev/desktop/helpers/adb/helpers/AdbImpl.kt
  21. 1 1
      src/main/kotlin/eu/mjdev/desktop/helpers/adb/helpers/AdbKeyPair.kt
  22. 8 8
      src/main/kotlin/eu/mjdev/desktop/helpers/adb/helpers/AdbMessage.kt
  23. 1 1
      src/main/kotlin/eu/mjdev/desktop/helpers/adb/helpers/AdbMessageQueue.kt
  24. 1 1
      src/main/kotlin/eu/mjdev/desktop/helpers/adb/helpers/AdbReader.kt
  25. 3 2
      src/main/kotlin/eu/mjdev/desktop/helpers/adb/helpers/AdbShell.kt
  26. 6 3
      src/main/kotlin/eu/mjdev/desktop/helpers/adb/helpers/AdbStream.kt
  27. 7 0
      src/main/kotlin/eu/mjdev/desktop/helpers/adb/helpers/AdbStreamClosed.kt
  28. 1 1
      src/main/kotlin/eu/mjdev/desktop/helpers/adb/helpers/AdbSync.kt
  29. 2 1
      src/main/kotlin/eu/mjdev/desktop/helpers/adb/helpers/AdbWriter.kt
  30. 1 1
      src/main/kotlin/eu/mjdev/desktop/helpers/adb/helpers/Constants.kt
  31. 2 2
      src/main/kotlin/eu/mjdev/desktop/helpers/adb/helpers/Logging.kt
  32. 1 1
      src/main/kotlin/eu/mjdev/desktop/helpers/adb/helpers/MessageQueue.kt
  33. 1 1
      src/main/kotlin/eu/mjdev/desktop/helpers/adb/helpers/PKCS8.kt
  34. 5 3
      src/main/kotlin/eu/mjdev/desktop/helpers/coil/PdfDecoder.kt
  35. 1 1
      src/main/kotlin/eu/mjdev/desktop/helpers/exception/EmptyException.kt
  36. 1 1
      src/main/kotlin/eu/mjdev/desktop/helpers/internal/DpBounds.kt
  37. 1 1
      src/main/kotlin/eu/mjdev/desktop/helpers/internal/Palette.kt
  38. 1 1
      src/main/kotlin/eu/mjdev/desktop/helpers/internal/Queue.kt
  39. 1 1
      src/main/kotlin/eu/mjdev/desktop/helpers/managers/ConnectivityManager.kt
  40. 29 0
      src/main/kotlin/eu/mjdev/desktop/helpers/managers/FileSystemWatcher.kt
  41. 44 0
      src/main/kotlin/eu/mjdev/desktop/helpers/managers/KCEFHelper.kt
  42. 1 1
      src/main/kotlin/eu/mjdev/desktop/helpers/streams/ResourceStream.kt
  43. 1 1
      src/main/kotlin/eu/mjdev/desktop/helpers/system/Command.kt
  44. 1 1
      src/main/kotlin/eu/mjdev/desktop/helpers/system/MemInfo.kt
  45. 42 0
      src/main/kotlin/eu/mjdev/desktop/provider/AIProvider.kt
  46. 4 5
      src/main/kotlin/eu/mjdev/desktop/provider/AppsProvider.kt
  47. 21 29
      src/main/kotlin/eu/mjdev/desktop/provider/DesktopProvider.kt
  48. 3 3
      src/main/kotlin/eu/mjdev/desktop/windows/MainWindow.kt

+ 7 - 4
build.gradle.kts

@@ -65,6 +65,8 @@ allprojects {
         implementation(libs.fuzzywuzzy)
         // graphs
         implementation(libs.charts)
+        // gemini ai
+        implementation(libs.google.generativeai)
         // compose debugger
         implementation("io.github.theapache64:rebugger:1.0.0-rc03")
         // qr code
@@ -73,12 +75,14 @@ allprojects {
         implementation("dev.tmapps:konnection:1.4.1")
         // web
         implementation("io.github.kevinnzou:compose-webview-multiplatform:1.9.40-alpha01")
+        // bottom sheet flexible
+        implementation("com.github.skydoves:flexible-bottomsheet-material3:0.1.5")
+        // fs watcher
+        implementation("io.github.irgaly.kfswatch:kfswatch:1.3.0")
         // bar code
 //        implementation("io.github.alexzhirkevich:qrose-oned:1.0.1")
         // flow extensions
 //        implementation("io.github.hoc081098:FlowExt:1.0.0-RC")
-        // drag & drop
-//        implementation("com.mohamedrejeb.dnd:compose-dnd:0.2.0")
         // metadata
 //        implementation("com.ashampoo:kim:0.18.4")
         // html
@@ -96,8 +100,7 @@ allprojects {
         // implementation(libs.dbus.java.transport.native.unixsocket)
         // javascript
         // implementation(libs.mozilla.rhino)
-        // gemini ai
-        // implementation(libs.google.generativeai)
+
 //        implementation("com.github.SmartToolFactory:Compose-Extended-Colors:1.0.0-alpha06")
 //        implementation("com.github.SmartToolFactory:Compose-Extended-Gestures:2.0.0")
 //        implementation ("androidx.compose.ui:ui-text-google-fonts:1.6.8")

+ 2 - 2
gradle/libs.versions.toml

@@ -24,9 +24,9 @@ google-gson = "2.8.9"
 mozilla-rhino = "1.7.13"
 ini4j = "0.5.4"
 charts = "Beta-0.0.5"
+generativeai = "0.5.0-1.0.0-wasm"
 #korau = "4.0.10"
 #lanscapist = "2.3.8"
-#generativeai = "0.5.0-1.0.0-wasm"
 #compose-webview = "1.9.20"
 #decompose = "3.0.0-alpha07"
 
@@ -48,6 +48,7 @@ slf4j-nop = { module = "org.slf4j:slf4j-nop", version.ref = "slf4j-nop" }
 fuzzywuzzy = { module = "me.xdrop:fuzzywuzzy", version.ref = "fuzzywuzzy" }
 ffmpeg-platform = { module = "org.bytedeco:ffmpeg-platform", version.ref = "ffmpeg-platform" }
 charts = { module = "io.github.thechance101:chart", version.ref = "charts" }
+google-generativeai = { module = "dev.shreyaspatil.generativeai:generativeai-google-jvm", version.ref = "generativeai" }
 
 #coil-gif = { module = "io.coil-kt.coil3:coil-gif", version.ref = "coil3" }
 #korau = { module = "com.soywiz.korlibs.korau:korau", version.ref = "korau" }
@@ -62,7 +63,6 @@ charts = { module = "io.github.thechance101:chart", version.ref = "charts" }
 #compose-webview = { module = "io.github.kevinnzou:compose-webview-multiplatform", version.ref = "compose-webview" }
 #decompose = { module = "com.arkivanov.decompose:decompose", version.ref = "decompose" }
 #decompose-extensions-compose = { module = "com.arkivanov.decompose:extensions-compose", version.ref = "decompose" }
-#google-generativeai = { module = "dev.shreyaspatil.generativeai:generativeai-google-jvm", version.ref = "generativeai" }
 #// open ai
 #//        implementation("com.aallam.openai:openai-client:3.8.2")
 #// byte buffer

+ 0 - 6
src/main/kotlin/eu/mjdev/dadb/helpers/AdbStreamClosed.kt

@@ -1,6 +0,0 @@
-package eu.mjdev.dadb.helpers
-
-import java.io.IOException
-
-internal class AdbStreamClosed(localId: Int) :
-    IOException(String.format("ADB stream is closed for localId: %x", localId))

+ 3 - 0
src/main/kotlin/eu/mjdev/desktop/Main.kt

@@ -62,6 +62,9 @@ fun main() = application(
             ),
         ) {
             val api: DesktopProvider = LocalDesktop.current
+//            api.aiProvider.ask("weather in prague").let {
+//                println(it)
+//            }
             MainWindow(
                 panelState = panelState,
                 controlCenterState = controlCenterState,

+ 1 - 1
src/main/kotlin/eu/mjdev/desktop/components/background/BackgroundImage.kt

@@ -17,7 +17,7 @@ import androidx.compose.ui.layout.ContentScale
 import eu.mjdev.desktop.components.image.ImageAny
 import eu.mjdev.desktop.extensions.Compose.SuperDarkGray
 import eu.mjdev.desktop.extensions.Compose.launchedEffect
-import eu.mjdev.desktop.helpers.Queue.Companion.mutableQueue
+import eu.mjdev.desktop.helpers.internal.Queue.Companion.mutableQueue
 import kotlinx.coroutines.delay
 
 @Preview

+ 2 - 2
src/main/kotlin/eu/mjdev/desktop/components/charts/MemoryChart.kt

@@ -11,8 +11,8 @@ import androidx.compose.ui.graphics.Color
 import com.aay.compose.baseComponents.model.LegendPosition
 import eu.mjdev.desktop.components.draggable.DraggableView
 import eu.mjdev.desktop.extensions.Compose.DarkDarkGray
-import eu.mjdev.desktop.helpers.MemInfo
-import eu.mjdev.desktop.helpers.MemInfo.Companion.toReadable
+import eu.mjdev.desktop.helpers.system.MemInfo
+import eu.mjdev.desktop.helpers.system.MemInfo.Companion.toReadable
 import kotlinx.coroutines.delay
 import kotlinx.coroutines.isActive
 

+ 37 - 8
src/main/kotlin/eu/mjdev/desktop/components/controlcenter/pages/MainSettingsPage.kt

@@ -43,18 +43,47 @@ fun MainSettingsPage() = ControlCenterPage(
                 backgroundColor = backgroundColor
             )
         }
-        Column(
+        Box(
             modifier = Modifier
                 .fillMaxWidth()
                 .align(Alignment.BottomCenter)
         ) {
-            PowerBlock(
-                backgroundColor = backgroundColor,
-                onPowerButtonClick = {
-                    // todo : dialog
-                    api.shutdown()
-                }
-            )
+//            FlexibleBottomSheet(
+//                onDismissRequest = {},
+//                sheetState = rememberFlexibleBottomSheetState(
+//                    flexibleSheetSize = FlexibleSheetSize(
+//                        fullyExpanded = 0.9f,
+//                        intermediatelyExpanded = 0.5f,
+//                        slightlyExpanded = 0.15f,
+//                    ),
+//                    isModal = true,
+//                    skipSlightlyExpanded = true,
+//                ),
+//                containerColor = backgroundColor,
+//            ) {
+//                Text(
+//                    modifier = Modifier
+//                        .fillMaxWidth()
+//                        .padding(8.dp),
+//                    text = "This is Flexible Bottom Sheet",
+//                    textAlign = TextAlign.Center,
+//                    color = Color.White,
+//                )
+//            }
+            Column(
+                modifier = Modifier
+                    .fillMaxWidth()
+                    .wrapContentHeight()
+                    .align(Alignment.BottomCenter)
+            ) {
+                PowerBlock(
+                    backgroundColor = backgroundColor,
+                    onPowerButtonClick = {
+                        // todo : dialog
+                        api.shutdown()
+                    }
+                )
+            }
         }
     }
 }

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

@@ -1,6 +1,6 @@
 package eu.mjdev.desktop.components.fonticon
 
-import eu.mjdev.desktop.helpers.ResourceStream
+import eu.mjdev.desktop.helpers.streams.ResourceStream
 
 class CodePointsFile(
     private val codepointsFileName: String,

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

@@ -4,7 +4,7 @@ import androidx.compose.ui.text.font.Font
 import androidx.compose.ui.text.font.FontFamily
 import androidx.compose.ui.text.font.FontWeight
 import androidx.compose.ui.text.platform.Font
-import eu.mjdev.desktop.helpers.ResourceStream
+import eu.mjdev.desktop.helpers.streams.ResourceStream
 
 class FontFile(
     private val ttfFileName: String,

+ 2 - 2
src/main/kotlin/eu/mjdev/desktop/components/sliding/VisibilityState.kt

@@ -6,8 +6,8 @@ import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.remember
 import androidx.compose.ui.layout.LayoutCoordinates
 import androidx.compose.ui.unit.DpSize
-import eu.mjdev.desktop.helpers.DpBounds
-import eu.mjdev.desktop.helpers.DpBounds.Companion.toDpBounds
+import eu.mjdev.desktop.helpers.internal.DpBounds
+import eu.mjdev.desktop.helpers.internal.DpBounds.Companion.toDpBounds
 import eu.mjdev.desktop.provider.DesktopProvider
 import eu.mjdev.desktop.provider.DesktopProvider.Companion.LocalDesktop
 

+ 1 - 1
src/main/kotlin/eu/mjdev/desktop/data/App.kt

@@ -3,7 +3,7 @@ package eu.mjdev.desktop.data
 import androidx.compose.runtime.MutableState
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.ui.graphics.Color
-import eu.mjdev.desktop.helpers.EmptyException.Companion.EmptyException
+import eu.mjdev.desktop.helpers.exception.EmptyException.Companion.EmptyException
 import eu.mjdev.desktop.windows.WindowsTracker
 import java.io.File
 

+ 5 - 0
src/main/kotlin/eu/mjdev/desktop/extensions/Custom.kt

@@ -4,6 +4,7 @@ import androidx.compose.runtime.Composable
 import androidx.compose.runtime.collectAsState
 import androidx.compose.runtime.snapshots.SnapshotStateList
 import androidx.compose.ui.graphics.NativePaint
+import eu.mjdev.desktop.helpers.streams.ResourceStream
 import kotlinx.coroutines.delay
 import kotlinx.coroutines.flow.channelFlow
 import kotlinx.coroutines.launch
@@ -59,4 +60,8 @@ object Custom {
         addAll(it)
     }
 
+    fun loadKey(key: String): String = runCatching {
+        ResourceStream("keys/$key.key").string
+    }.getOrNull().orEmpty()
+
 }

+ 0 - 46
src/main/kotlin/eu/mjdev/desktop/helpers/KCEFHelper.kt

@@ -1,46 +0,0 @@
-package eu.mjdev.desktop.helpers
-
-import androidx.compose.runtime.MutableState
-import androidx.compose.runtime.mutableStateOf
-import dev.datlag.kcef.KCEF
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.launch
-import java.io.File
-import kotlin.math.max
-
-class KCEFHelper(
-    private val scope: CoroutineScope?,
-    val initialized: MutableState<Boolean> = mutableStateOf(false),
-    val restartRequired: MutableState<Boolean> = mutableStateOf(false),
-    val downloading: MutableState<Int> = mutableStateOf(0)
-) {
-    fun init() {
-        if (!initialized.value && !restartRequired.value) {
-            scope?.launch(Dispatchers.IO) {
-                KCEF.init(builder = {
-                    installDir(File("/tmp/kcef-bundle"))
-                    progress {
-                        onDownloading {
-                            downloading.value = max(it, 0F).toInt()
-                        }
-                        onInitialized {
-                            initialized.value = true
-                        }
-                    }
-                    settings {
-                        cachePath = File("cache").absolutePath
-                    }
-                }, onError = { err ->
-                    err?.printStackTrace()
-                }, onRestartRequired = {
-                    restartRequired.value = true
-                })
-            }
-        }
-    }
-
-    fun dispose() {
-        KCEF.disposeBlocking()
-    }
-}

+ 14 - 13
src/main/kotlin/eu/mjdev/dadb/Dadb.kt → src/main/kotlin/eu/mjdev/desktop/helpers/adb/Adb.kt

@@ -1,15 +1,16 @@
-package eu.mjdev.dadb
+package eu.mjdev.desktop.helpers.adb
 
-import eu.mjdev.dadb.*
-import eu.mjdev.dadb.adbserver.AdbServer
-import eu.mjdev.dadb.forwarding.TcpForwardDescriptor
-import eu.mjdev.dadb.forwarding.TcpForwarder
-import eu.mjdev.dadb.helpers.*
+import eu.mjdev.desktop.helpers.adb.*
+import eu.mjdev.desktop.helpers.adb.adbserver.AdbServer
+import eu.mjdev.desktop.helpers.adb.forwarding.TcpForwardDescriptor
+import eu.mjdev.desktop.helpers.adb.forwarding.TcpForwarder
+import eu.mjdev.desktop.helpers.adb.helpers.*
 import okio.*
 import java.io.File
 import java.nio.file.Files
 
-interface Dadb : AutoCloseable {
+@Suppress("unused")
+interface Adb : AutoCloseable {
     @Throws(IOException::class)
     fun open(destination: String): AdbStream
 
@@ -189,7 +190,7 @@ interface Dadb : AutoCloseable {
                 throw IOException("failed to finalize session: $finalResponse")
             }
             if (error != null) {
-                throw IOException("Install failed: $error");
+                throw IOException("Install failed: $error")
             }
         }
     }
@@ -262,20 +263,20 @@ interface Dadb : AutoCloseable {
             keyPair: AdbKeyPair? = AdbKeyPair.readDefault(),
             connectTimeout: Int = 0,
             socketTimeout: Int = 0
-        ): Dadb = DadbImpl(host, port, keyPair, connectTimeout, socketTimeout)
+        ): Adb = AdbImpl(host, port, keyPair, connectTimeout, socketTimeout)
 
         @JvmStatic
         @JvmOverloads
         fun discover(
             host: String = "localhost",
             keyPair: AdbKeyPair? = AdbKeyPair.readDefault()
-        ): List<Dadb> {
+        ): List<Adb> {
             return list(host, keyPair)
         }
 
         @JvmStatic
         @JvmOverloads
-        fun list(host: String = "localhost", keyPair: AdbKeyPair? = AdbKeyPair.readDefault()): List<Dadb> {
+        fun list(host: String = "localhost", keyPair: AdbKeyPair? = AdbKeyPair.readDefault()): List<Adb> {
             val dadbs = AdbServer.listDadbs(adbServerHost = host)
             if (dadbs.isNotEmpty()) return dadbs
 
@@ -294,7 +295,7 @@ interface Dadb : AutoCloseable {
             }
         }
 
-        private fun waitRootOrClose(dadb: Dadb, root: Boolean) {
+        private fun waitRootOrClose(dadb: Adb, root: Boolean) {
             while (true) {
                 try {
                     val response = dadb.shell("getprop service.adb.root")
@@ -306,7 +307,7 @@ interface Dadb : AutoCloseable {
             }
         }
 
-        private fun restartAdb(dadb: Dadb, destination: String): String {
+        private fun restartAdb(dadb: Adb, destination: String): String {
             dadb.open(destination).use { stream ->
                 return stream.source.readUntil('\n'.code.toByte()).readString(Charsets.UTF_8)
             }

+ 5 - 5
src/main/kotlin/eu/mjdev/dadb/DadbDiscover.kt → src/main/kotlin/eu/mjdev/desktop/helpers/adb/AdbDiscover.kt

@@ -1,4 +1,4 @@
-package eu.mjdev.dadb
+package eu.mjdev.desktop.helpers.adb
 
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.delay
@@ -8,15 +8,15 @@ import kotlinx.coroutines.launch
 class AdbDiscover(
     coroutineScope: CoroutineScope? = null,
     discoverDelay: Long = 1000L,
-    onAdded: suspend (Dadb) -> Unit,
+    onAdded: suspend (Adb) -> Unit,
 //    onRemoved: suspend (Dadb) -> Unit,
 ) {
-    val devices = mutableMapOf<String, Dadb>()
+    val devices = mutableMapOf<String, Adb>()
 
     init {
         coroutineScope?.launch {
             while (true) {
-                val newDevices = Dadb.discover()
+                val newDevices = Adb.discover()
                 if (newDevices.isNotEmpty()) {
                     newDevices.forEach { entry ->
                         if (!devices.containsKey(entry.toString())) {
@@ -34,7 +34,7 @@ class AdbDiscover(
         fun adbDevicesHandler(
             coroutineScope: CoroutineScope? = null,
 //            onRemoved: suspend (Dadb) -> Unit = {},
-            onAdded: suspend (Dadb) -> Unit = {},
+            onAdded: suspend (Adb) -> Unit = {},
         ) = AdbDiscover(
             coroutineScope = coroutineScope,
             onAdded = onAdded,

+ 1 - 1
src/main/kotlin/eu/mjdev/dadb/adbserver/AdbBinary.kt → src/main/kotlin/eu/mjdev/desktop/helpers/adb/adbserver/AdbBinary.kt

@@ -1,4 +1,4 @@
-package eu.mjdev.dadb.adbserver
+package eu.mjdev.desktop.helpers.adb.adbserver
 
 import java.io.File
 import java.io.IOException

+ 7 - 7
src/main/kotlin/eu/mjdev/dadb/adbserver/AdbServer.kt → src/main/kotlin/eu/mjdev/desktop/helpers/adb/adbserver/AdbServer.kt

@@ -1,7 +1,7 @@
-package eu.mjdev.dadb.adbserver
+package eu.mjdev.desktop.helpers.adb.adbserver
 
-import eu.mjdev.dadb.Dadb
-import eu.mjdev.dadb.helpers.AdbStream
+import eu.mjdev.desktop.helpers.adb.Adb
+import eu.mjdev.desktop.helpers.adb.helpers.AdbStream
 import okio.buffer
 import okio.sink
 import okio.source
@@ -46,7 +46,7 @@ object AdbServer {
         adbServerHost: String = "localhost",
         adbServerPort: Int = 5037,
         deviceQuery: String = "host:transport-any"
-    ): Dadb {
+    ): Adb {
         val name = deviceQuery
             .removePrefix("host:") // Use the device query without the host: prefix
             .removePrefix("transport:") // If it's a serial-number, just show that
@@ -61,7 +61,7 @@ object AdbServer {
     fun listDadbs(
         adbServerHost: String = "localhost",
         adbServerPort: Int = 5037,
-    ): List<Dadb> {
+    ): List<Adb> {
         if (!AdbBinary.tryStartServer(adbServerHost, adbServerPort)) {
             return emptyList()
         }
@@ -116,12 +116,12 @@ object AdbServer {
     }
 }
 
-private class AdbServerDadb constructor(
+private class AdbServerDadb(
     private val host: String,
     private val port: Int,
     private val deviceQuery: String,
     private val name: String,
-) : Dadb {
+) : Adb {
 
     private val supportedFeatures: Set<String>
 

+ 10 - 5
src/main/kotlin/eu/mjdev/dadb/forwarding/TcpForwarder.kt → src/main/kotlin/eu/mjdev/desktop/helpers/adb/forwarding/TcpForwarder.kt

@@ -1,7 +1,7 @@
-package eu.mjdev.dadb.forwarding
+package eu.mjdev.desktop.helpers.adb.forwarding
 
-import eu.mjdev.dadb.Dadb
-import eu.mjdev.dadb.helpers.log
+import eu.mjdev.desktop.helpers.adb.Adb
+import eu.mjdev.desktop.helpers.adb.helpers.log
 import okio.*
 import java.io.IOException
 import java.io.InterruptedIOException
@@ -19,8 +19,9 @@ data class TcpForwardDescriptor(private val resource: AutoCloseable, val localPo
     }
 }
 
+@Suppress("SameParameterValue")
 internal class TcpForwarder(
-    private val dadb: Dadb,
+    private val dadb: Adb,
     private val targetPort: Int,
     private val hostPort: Int? = null,
 ) : AutoCloseable {
@@ -146,7 +147,11 @@ internal class TcpForwarder(
         STOPPED
     }
 
-    private fun waitFor(intervalMs: Int, timeoutMs: Int, test: () -> Boolean) {
+    private fun waitFor(
+        intervalMs: Int,
+        timeoutMs: Int,
+        test: () -> Boolean
+    ) {
         val start = System.currentTimeMillis()
         var lastCheck = start
         while (!test()) {

+ 2 - 1
src/main/kotlin/eu/mjdev/dadb/helpers/AdbConnection.kt → src/main/kotlin/eu/mjdev/desktop/helpers/adb/helpers/AdbConnection.kt

@@ -1,4 +1,4 @@
-package eu.mjdev.dadb.helpers
+package eu.mjdev.desktop.helpers.adb.helpers
 
 import okio.Sink
 import okio.Source
@@ -10,6 +10,7 @@ import java.io.IOException
 import java.net.Socket
 import java.util.*
 
+@Suppress("unused")
 internal class AdbConnection internal constructor(
     adbReader: AdbReader,
     private val adbWriter: AdbWriter,

+ 5 - 4
src/main/kotlin/eu/mjdev/dadb/helpers/DadbImpl.kt → src/main/kotlin/eu/mjdev/desktop/helpers/adb/helpers/AdbImpl.kt

@@ -1,17 +1,18 @@
-package eu.mjdev.dadb.helpers
+package eu.mjdev.desktop.helpers.adb.helpers
 
-import eu.mjdev.dadb.Dadb
+import eu.mjdev.desktop.helpers.adb.Adb
 import org.jetbrains.annotations.TestOnly
 import java.net.InetSocketAddress
 import java.net.Socket
 
-internal class DadbImpl @Throws(IllegalArgumentException::class) constructor(
+@Suppress("unused")
+internal class AdbImpl @Throws(IllegalArgumentException::class) constructor(
     private val host: String,
     private val port: Int,
     private val keyPair: AdbKeyPair? = null,
     private val connectTimeout: Int = 0,
     private val socketTimeout: Int = 0
-) : Dadb {
+) : Adb {
     init {
         if (port < 0) {
             throw IllegalArgumentException("port must be >= 0")

+ 1 - 1
src/main/kotlin/eu/mjdev/dadb/helpers/AdbKeyPair.kt → src/main/kotlin/eu/mjdev/desktop/helpers/adb/helpers/AdbKeyPair.kt

@@ -1,4 +1,4 @@
-package eu.mjdev.dadb.helpers
+package eu.mjdev.desktop.helpers.adb.helpers
 
 import java.io.File
 import java.math.BigInteger

+ 8 - 8
src/main/kotlin/eu/mjdev/dadb/helpers/AdbMessage.kt → src/main/kotlin/eu/mjdev/desktop/helpers/adb/helpers/AdbMessage.kt

@@ -1,9 +1,10 @@
-package eu.mjdev.dadb.helpers
+package eu.mjdev.desktop.helpers.adb.helpers
 
 import okio.Buffer
 import okio.BufferedSource
 import java.nio.charset.StandardCharsets
 
+@Suppress("unused")
 internal class AdbMessage(
     val command: Int,
     val arg0: Int,
@@ -32,7 +33,6 @@ internal class AdbMessage(
         return "payload[$payloadLength]"
     }
 
-    @Suppress("UsePropertyAccessSyntax")
     private fun shellPayloadStr(): String? {
         val source: BufferedSource = getSource()
         if (source.buffer.size < 5) return null
@@ -61,12 +61,12 @@ internal class AdbMessage(
     private fun argStr(arg: Int) = String.format("%X", arg)
 
     private fun commandStr() = when (command) {
-        Constants.CMD_AUTH -> "AUTH";
-        Constants.CMD_CNXN -> "CNXN";
-        Constants.CMD_OPEN -> "OPEN";
-        Constants.CMD_OKAY -> "OKAY";
-        Constants.CMD_CLSE -> "CLSE";
-        Constants.CMD_WRTE -> "WRTE";
+        Constants.CMD_AUTH -> "AUTH"
+        Constants.CMD_CNXN -> "CNXN"
+        Constants.CMD_OPEN -> "OPEN"
+        Constants.CMD_OKAY -> "OKAY"
+        Constants.CMD_CLSE -> "CLSE"
+        Constants.CMD_WRTE -> "WRTE"
         else -> "????"
     }
 }

+ 1 - 1
src/main/kotlin/eu/mjdev/dadb/helpers/AdbMessageQueue.kt → src/main/kotlin/eu/mjdev/desktop/helpers/adb/helpers/AdbMessageQueue.kt

@@ -1,4 +1,4 @@
-package eu.mjdev.dadb.helpers
+package eu.mjdev.desktop.helpers.adb.helpers
 
 internal class AdbMessageQueue(private val adbReader: AdbReader) : AutoCloseable, MessageQueue<AdbMessage>() {
     override fun readMessage() = adbReader.readMessage()

+ 1 - 1
src/main/kotlin/eu/mjdev/dadb/helpers/AdbReader.kt → src/main/kotlin/eu/mjdev/desktop/helpers/adb/helpers/AdbReader.kt

@@ -1,4 +1,4 @@
-package eu.mjdev.dadb.helpers
+package eu.mjdev.desktop.helpers.adb.helpers
 
 import okio.Source
 import okio.buffer

+ 3 - 2
src/main/kotlin/eu/mjdev/dadb/helpers/AdbShell.kt → src/main/kotlin/eu/mjdev/desktop/helpers/adb/helpers/AdbShell.kt

@@ -1,8 +1,9 @@
 @file:JvmName("AdbShell")
+@file:Suppress("unused")
 
-package eu.mjdev.dadb.helpers
+package eu.mjdev.desktop.helpers.adb.helpers
 
-import eu.mjdev.dadb.helpers.AdbShellPacket.*
+import eu.mjdev.desktop.helpers.adb.helpers.AdbShellPacket.*
 import java.io.IOException
 
 const val ID_STDIN = 0

+ 6 - 3
src/main/kotlin/eu/mjdev/dadb/helpers/AdbStream.kt → src/main/kotlin/eu/mjdev/desktop/helpers/adb/helpers/AdbStream.kt

@@ -1,4 +1,4 @@
-package eu.mjdev.dadb.helpers
+package eu.mjdev.desktop.helpers.adb.helpers
 
 import okio.*
 import java.lang.Integer.min
@@ -28,7 +28,7 @@ internal class AdbStreamImpl internal constructor(
             val message = message() ?: return -1
 
             val bytesRemaining = message.payloadLength - bytesRead
-            val bytesToRead = Math.min(byteCount.toInt(), bytesRemaining)
+            val bytesToRead = min(byteCount.toInt(), bytesRemaining)
 
             sink.write(message.payload, bytesRead, bytesToRead)
 
@@ -89,7 +89,10 @@ internal class AdbStreamImpl internal constructor(
         override fun timeout() = Timeout.NONE
     }.buffer()
 
-    private fun nextMessage(command: Int): AdbMessage? {
+    @Suppress("SameParameterValue")
+    private fun nextMessage(
+        command: Int
+    ): AdbMessage? {
         return try {
             messageQueue.take(localId, command)
         } catch (e: IOException) {

+ 7 - 0
src/main/kotlin/eu/mjdev/desktop/helpers/adb/helpers/AdbStreamClosed.kt

@@ -0,0 +1,7 @@
+package eu.mjdev.desktop.helpers.adb.helpers
+
+import java.io.IOException
+
+internal class AdbStreamClosed(
+    localId: Int
+) : IOException(String.format("ADB stream is closed for localId: %x", localId))

+ 1 - 1
src/main/kotlin/eu/mjdev/dadb/helpers/AdbSync.kt → src/main/kotlin/eu/mjdev/desktop/helpers/adb/helpers/AdbSync.kt

@@ -1,4 +1,4 @@
-package eu.mjdev.dadb.helpers
+package eu.mjdev.desktop.helpers.adb.helpers
 
 import okio.Buffer
 import okio.Sink

+ 2 - 1
src/main/kotlin/eu/mjdev/dadb/helpers/AdbWriter.kt → src/main/kotlin/eu/mjdev/desktop/helpers/adb/helpers/AdbWriter.kt

@@ -1,9 +1,10 @@
-package eu.mjdev.dadb.helpers
+package eu.mjdev.desktop.helpers.adb.helpers
 
 import okio.Sink
 import okio.buffer
 import java.nio.ByteBuffer
 
+@Suppress("MemberVisibilityCanBePrivate")
 internal class AdbWriter(sink: Sink) : AutoCloseable {
     private val bufferedSink = sink.buffer()
 

+ 1 - 1
src/main/kotlin/eu/mjdev/dadb/helpers/Constants.kt → src/main/kotlin/eu/mjdev/desktop/helpers/adb/helpers/Constants.kt

@@ -1,4 +1,4 @@
-package eu.mjdev.dadb.helpers
+package eu.mjdev.desktop.helpers.adb.helpers
 
 internal object Constants {
     const val AUTH_TYPE_TOKEN = 1

+ 2 - 2
src/main/kotlin/eu/mjdev/dadb/helpers/Logging.kt → src/main/kotlin/eu/mjdev/desktop/helpers/adb/helpers/Logging.kt

@@ -1,7 +1,7 @@
-package eu.mjdev.dadb.helpers
+package eu.mjdev.desktop.helpers.adb.helpers
 
 // todo
-private val ENABLED = true
+private const val ENABLED = true
 
 internal fun log(block: () -> String) {
     if (ENABLED) {

+ 1 - 1
src/main/kotlin/eu/mjdev/dadb/helpers/MessageQueue.kt → src/main/kotlin/eu/mjdev/desktop/helpers/adb/helpers/MessageQueue.kt

@@ -1,4 +1,4 @@
-package eu.mjdev.dadb.helpers
+package eu.mjdev.desktop.helpers.adb.helpers
 
 import org.jetbrains.annotations.TestOnly
 import java.util.*

+ 1 - 1
src/main/kotlin/eu/mjdev/dadb/helpers/PKCS8.kt → src/main/kotlin/eu/mjdev/desktop/helpers/adb/helpers/PKCS8.kt

@@ -1,4 +1,4 @@
-package eu.mjdev.dadb.helpers
+package eu.mjdev.desktop.helpers.adb.helpers
 
 import java.security.KeyFactory
 import java.security.PrivateKey

+ 5 - 3
src/main/kotlin/eu/mjdev/desktop/helpers/PdfDecoder.kt → src/main/kotlin/eu/mjdev/desktop/helpers/coil/PdfDecoder.kt

@@ -1,4 +1,6 @@
-package eu.mjdev.desktop.helpers
+@file:Suppress("unused")
+
+package eu.mjdev.desktop.helpers.coil
 
 import coil3.DrawableImage
 import coil3.Image
@@ -26,7 +28,7 @@ import kotlin.math.roundToInt
 class PdfDecoder(
     private val source: ImageSource,
     private val options: Options,
-    val useViewBoundsAsIntrinsicSize: Boolean,
+    private val useViewBoundsAsIntrinsicSize: Boolean,
 ) : Decoder {
     @OptIn(ExperimentalCoilApi::class)
     override suspend fun decode(): DecodeResult {
@@ -90,7 +92,7 @@ class PdfDecoder(
     }
 
     class Factory(
-        val useViewBoundsAsIntrinsicSize: Boolean,
+        private val useViewBoundsAsIntrinsicSize: Boolean = true,
     ) : Decoder.Factory {
         override fun create(result: SourceFetchResult, options: Options, imageLoader: ImageLoader): Decoder? {
             if (!isApplicable(result)) return null

+ 1 - 1
src/main/kotlin/eu/mjdev/desktop/helpers/EmptyException.kt → src/main/kotlin/eu/mjdev/desktop/helpers/exception/EmptyException.kt

@@ -1,4 +1,4 @@
-package eu.mjdev.desktop.helpers
+package eu.mjdev.desktop.helpers.exception
 
 class EmptyException : Exception() {
     companion object {

+ 1 - 1
src/main/kotlin/eu/mjdev/desktop/helpers/DpBounds.kt → src/main/kotlin/eu/mjdev/desktop/helpers/internal/DpBounds.kt

@@ -1,4 +1,4 @@
-package eu.mjdev.desktop.helpers
+package eu.mjdev.desktop.helpers.internal
 
 import androidx.compose.ui.layout.LayoutCoordinates
 import androidx.compose.ui.layout.boundsInParent

+ 1 - 1
src/main/kotlin/eu/mjdev/desktop/helpers/Palette.kt → src/main/kotlin/eu/mjdev/desktop/helpers/internal/Palette.kt

@@ -1,4 +1,4 @@
-package eu.mjdev.desktop.helpers
+package eu.mjdev.desktop.helpers.internal
 
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.remember

+ 1 - 1
src/main/kotlin/eu/mjdev/desktop/helpers/Queue.kt → src/main/kotlin/eu/mjdev/desktop/helpers/internal/Queue.kt

@@ -1,4 +1,4 @@
-package eu.mjdev.desktop.helpers
+package eu.mjdev.desktop.helpers.internal
 
 @Suppress("unused")
 class Queue<E> : ArrayList<E>() {

+ 1 - 1
src/main/kotlin/eu/mjdev/desktop/helpers/ConnectivityManager.kt → src/main/kotlin/eu/mjdev/desktop/helpers/managers/ConnectivityManager.kt

@@ -1,4 +1,4 @@
-package eu.mjdev.desktop.helpers
+package eu.mjdev.desktop.helpers.managers
 
 import dev.tmapps.konnection.Konnection
 import dev.tmapps.konnection.NetworkConnection

+ 29 - 0
src/main/kotlin/eu/mjdev/desktop/helpers/managers/FileSystemWatcher.kt

@@ -0,0 +1,29 @@
+package eu.mjdev.desktop.helpers.managers
+
+import io.github.irgaly.kfswatch.KfsDirectoryWatcher
+import io.github.irgaly.kfswatch.KfsDirectoryWatcherEvent
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
+
+@Suppress("MemberVisibilityCanBePrivate")
+class FileSystemWatcher(
+    val scope: CoroutineScope = CoroutineScope(Dispatchers.IO),
+    val mountpoints: List<String> = listOf("/mnt", "/media"),
+    val watcher: KfsDirectoryWatcher = KfsDirectoryWatcher(scope),
+    val onEvent: KfsDirectoryWatcherEvent.() -> Unit = {}
+) {
+    fun init() = scope.launch(Dispatchers.IO) {
+        mountpoints.forEach {
+            watcher.add(it)
+        }
+        watcher.onEventFlow.collect { event ->
+            onEvent(event)
+        }
+    }
+
+    fun dispose() = scope.launch {
+        watcher.removeAll()
+        watcher.close()
+    }
+}

+ 44 - 0
src/main/kotlin/eu/mjdev/desktop/helpers/managers/KCEFHelper.kt

@@ -0,0 +1,44 @@
+package eu.mjdev.desktop.helpers.managers
+
+import androidx.compose.runtime.MutableState
+import androidx.compose.runtime.mutableStateOf
+import dev.datlag.kcef.KCEF
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
+import java.io.File
+import kotlin.math.max
+
+class KCEFHelper(
+    private val scope: CoroutineScope = CoroutineScope(Dispatchers.IO),
+    val initialized: MutableState<Boolean> = mutableStateOf(false),
+    val restartRequired: MutableState<Boolean> = mutableStateOf(false),
+    val downloading: MutableState<Int> = mutableStateOf(0)
+) {
+    fun init() = scope.launch(Dispatchers.IO) {
+        if (!initialized.value && !restartRequired.value) {
+            KCEF.init(builder = {
+                installDir(File("/tmp/kcef-bundle"))
+                progress {
+                    onDownloading {
+                        downloading.value = max(it, 0F).toInt()
+                    }
+                    onInitialized {
+                        initialized.value = true
+                    }
+                }
+                settings {
+                    cachePath = File("cache").absolutePath
+                }
+            }, onError = { err ->
+                err?.printStackTrace()
+            }, onRestartRequired = {
+                restartRequired.value = true
+            })
+        }
+    }
+
+    fun dispose() {
+        KCEF.disposeBlocking()
+    }
+}

+ 1 - 1
src/main/kotlin/eu/mjdev/desktop/helpers/ResourceStream.kt → src/main/kotlin/eu/mjdev/desktop/helpers/streams/ResourceStream.kt

@@ -1,4 +1,4 @@
-package eu.mjdev.desktop.helpers
+package eu.mjdev.desktop.helpers.streams
 
 import androidx.compose.ui.res.useResource
 

+ 1 - 1
src/main/kotlin/eu/mjdev/desktop/helpers/Command.kt → src/main/kotlin/eu/mjdev/desktop/helpers/system/Command.kt

@@ -1,4 +1,4 @@
-package eu.mjdev.desktop.helpers
+package eu.mjdev.desktop.helpers.system
 
 import com.google.gson.Gson
 import java.io.BufferedReader

+ 1 - 1
src/main/kotlin/eu/mjdev/desktop/helpers/MemInfo.kt → src/main/kotlin/eu/mjdev/desktop/helpers/system/MemInfo.kt

@@ -1,4 +1,4 @@
-package eu.mjdev.desktop.helpers
+package eu.mjdev.desktop.helpers.system
 
 import java.io.File
 import kotlin.math.roundToInt

+ 42 - 0
src/main/kotlin/eu/mjdev/desktop/provider/AIProvider.kt

@@ -0,0 +1,42 @@
+package eu.mjdev.desktop.provider
+
+import dev.shreyaspatil.ai.client.generativeai.GenerativeModel
+import dev.shreyaspatil.ai.client.generativeai.type.content
+import eu.mjdev.desktop.extensions.Custom.loadKey
+import kotlinx.coroutines.runBlocking
+
+@Suppress("MemberVisibilityCanBePrivate", "unused")
+class AIProvider(
+    var plugin: IAIPlugin = AiPluginNull()
+) {
+    fun ask(question: String): String = plugin.ask(question)
+
+    interface IAIPlugin {
+        fun ask(question: String): String
+    }
+
+    class AiPluginNull : IAIPlugin {
+        override fun ask(question: String): String = ""
+    }
+
+    class AiPluginGemini : IAIPlugin {
+        private val generativeModel: GenerativeModel by lazy {
+            GenerativeModel(
+                modelName = "gemini-1.5-pro-latest",
+                apiKey = loadKey("gemini")
+            )
+        }
+
+        override fun ask(question: String): String = runBlocking {
+            runCatching {
+                generativeModel.generateContent(content {
+                    text(question)
+                }).text
+            }.onFailure {
+                println(it)
+            }.getOrElse {
+                ""
+            }
+        }.orEmpty()
+    }
+}

+ 4 - 5
src/main/kotlin/eu/mjdev/desktop/provider/providers/AppsProvider.kt → src/main/kotlin/eu/mjdev/desktop/provider/AppsProvider.kt

@@ -1,4 +1,4 @@
-package eu.mjdev.desktop.provider.providers
+package eu.mjdev.desktop.provider
 
 import androidx.compose.runtime.mutableStateListOf
 import eu.mjdev.desktop.data.App
@@ -6,10 +6,9 @@ import eu.mjdev.desktop.data.Category
 import eu.mjdev.desktop.data.DesktopFile
 import eu.mjdev.desktop.extensions.Custom.invalidate
 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.helpers.EmptyException.Companion.EmptyException
-import eu.mjdev.desktop.provider.DesktopProvider
+import eu.mjdev.desktop.helpers.exception.EmptyException.Companion.EmptyException
+import eu.mjdev.desktop.helpers.system.Command
+import eu.mjdev.desktop.helpers.system.Command.Companion.toList
 import java.io.File
 import java.util.*
 

+ 21 - 29
src/main/kotlin/eu/mjdev/desktop/provider/DesktopProvider.kt

@@ -9,11 +9,13 @@ import coil3.ImageLoader
 import eu.mjdev.desktop.components.controlcenter.ControlCenterPage
 import eu.mjdev.desktop.components.controlcenter.pages.*
 import eu.mjdev.desktop.data.User
-import eu.mjdev.desktop.helpers.ConnectivityManager
-import eu.mjdev.desktop.helpers.KCEFHelper
-import eu.mjdev.desktop.helpers.ResourceStream
-import eu.mjdev.desktop.provider.providers.AppsProvider
+import eu.mjdev.desktop.helpers.adb.AdbDiscover.Companion.adbDevicesHandler
+import eu.mjdev.desktop.helpers.managers.ConnectivityManager
+import eu.mjdev.desktop.helpers.managers.FileSystemWatcher
+import eu.mjdev.desktop.helpers.managers.KCEFHelper
+import eu.mjdev.desktop.provider.AIProvider.AiPluginNull
 import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
 import java.awt.GraphicsDevice
 import java.awt.GraphicsEnvironment
 import java.awt.Toolkit
@@ -25,11 +27,12 @@ import kotlin.system.exitProcess
 
 @Suppress("unused", "MemberVisibilityCanBePrivate", "PrivatePropertyName", "SameParameterValue")
 class DesktopProvider(
-    val scope: CoroutineScope? = null,
+    val scope: CoroutineScope = CoroutineScope(Dispatchers.IO),
     val imageLoader: ImageLoader? = null,
     val connection: ConnectivityManager = ConnectivityManager(),
     val scriptManager: ScriptEngineManager = ScriptEngineManager(),
-    val kcefHelper: KCEFHelper = KCEFHelper(scope)
+    val kcefHelper: KCEFHelper = KCEFHelper(scope),
+    val aiProvider: AIProvider = AIProvider(AiPluginNull())
 ) {
     private val __currentUser: User by lazy { User.load() }
     private val _currentUser: MutableState<User> = mutableStateOf(__currentUser)
@@ -44,12 +47,12 @@ class DesktopProvider(
         }
     }
 
-//    val adbHandler = adbDevicesHandler(
-//        coroutineScope = scope
-//    ) { device ->
-//        println("Device discovered : $device")
-//        // when device connected
-//    }
+    val adbHandler = adbDevicesHandler(
+        coroutineScope = scope
+    ) { device ->
+        println("Device discovered : $device")
+        // when device connected
+    }
 
     val containerSize: DpSize by lazy {
         Toolkit.getDefaultToolkit().screenSize.let {
@@ -60,7 +63,7 @@ class DesktopProvider(
         }
     }
     val controlCenterPages get() = _controlCenterPages.value
-    val appsProvider by lazy { AppsProvider(this) }
+    val appsProvider = AppsProvider(this)
 
     val graphicsEnvironment: GraphicsEnvironment
         get() = GraphicsEnvironment.getLocalGraphicsEnvironment()
@@ -69,31 +72,20 @@ class DesktopProvider(
     val isTransparencySupported
         get() = graphicsDevice.isWindowTranslucencySupported(GraphicsDevice.WindowTranslucency.TRANSLUCENT)
 
-//    val generativeModel: GenerativeModel by lazy {
-//        GenerativeModel(
-//            modelName = "gemini-1.5-pro-latest",
-//            apiKey = loadKey("gemini")
-//        )
-//    }
+    val mounts = FileSystemWatcher(scope) {
+        println("Mounted: ${this.targetDirectory}")
+    }
 
     init {
         currentUser.theme.controlCenterExpandedWidth = containerSize.width.div(4)
+        mounts.init()
     }
 
     fun dispose() {
         kcefHelper.dispose()
+        mounts.dispose()
     }
 
-    private fun loadKey(key: String): String = runCatching {
-        ResourceStream("keys/$key.key").string
-    }.getOrNull().orEmpty()
-
-//    fun askGemini(question: String): String = runBlocking {
-//        generativeModel.generateContent(content {
-//            text(question)
-//        }).text
-//    }.orEmpty()
-
     fun runScript(script: String): Any =
         engine.eval(script)
 

+ 3 - 3
src/main/kotlin/eu/mjdev/desktop/windows/MainWindow.kt

@@ -10,14 +10,14 @@ import androidx.compose.foundation.mouseClickable
 import androidx.compose.runtime.Composable
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.input.pointer.isSecondaryPressed
-import eu.mjdev.dadb.helpers.log
 import eu.mjdev.desktop.components.background.BackgroundImage
 import eu.mjdev.desktop.components.menu.ContextMenu
 import eu.mjdev.desktop.components.menu.ContextMenuState
 import eu.mjdev.desktop.components.menu.ContextMenuState.Companion.rememberContextMenuState
 import eu.mjdev.desktop.components.sliding.VisibilityState
-import eu.mjdev.desktop.helpers.Palette
-import eu.mjdev.desktop.helpers.Palette.Companion.rememberPalette
+import eu.mjdev.desktop.helpers.adb.helpers.log
+import eu.mjdev.desktop.helpers.internal.Palette
+import eu.mjdev.desktop.helpers.internal.Palette.Companion.rememberPalette
 import eu.mjdev.desktop.provider.DesktopProvider
 import eu.mjdev.desktop.provider.DesktopProvider.Companion.LocalDesktop