DesktopProvider.kt 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. package eu.mjdev.desktop.provider
  2. import androidx.compose.runtime.*
  3. import androidx.compose.ui.graphics.Color
  4. import androidx.compose.ui.unit.DpSize
  5. import androidx.compose.ui.unit.dp
  6. import coil3.ImageLoader
  7. import eu.mjdev.desktop.components.controlcenter.ControlCenterPage
  8. import eu.mjdev.desktop.components.controlcenter.pages.*
  9. import eu.mjdev.desktop.data.User
  10. import eu.mjdev.desktop.extensions.Compose.asyncImageLoader
  11. import eu.mjdev.desktop.helpers.adb.AdbDiscover.Companion.adbDevicesHandler
  12. import eu.mjdev.desktop.helpers.internal.Palette
  13. import eu.mjdev.desktop.helpers.managers.*
  14. import eu.mjdev.desktop.helpers.system.Command
  15. import eu.mjdev.desktop.helpers.system.OsRelease
  16. import eu.mjdev.desktop.helpers.system.UserDirs
  17. import eu.mjdev.desktop.provider.AIProvider.AiPluginGemini
  18. import kotlinx.coroutines.CoroutineScope
  19. import kotlinx.coroutines.Dispatchers
  20. import java.awt.GraphicsDevice
  21. import java.awt.GraphicsEnvironment
  22. import java.awt.Toolkit
  23. import java.io.File
  24. import kotlin.system.exitProcess
  25. @Suppress("unused", "MemberVisibilityCanBePrivate", "SameParameterValue")
  26. class DesktopProvider(
  27. val scope: CoroutineScope = CoroutineScope(Dispatchers.IO),
  28. val imageLoader: ImageLoader? = null,
  29. val connection: ConnectivityManager = ConnectivityManager(),
  30. // val scriptManager: ScriptEngineManager = ScriptEngineManager(),
  31. val kcefHelper: KCEFHelper = KCEFHelper(scope),
  32. val ai: AIProvider = AIProvider(scope, AiPluginGemini(scope)),
  33. val windows: WindowsManager = WindowsManager(),
  34. val gnome: GnomeManager = GnomeManager(),
  35. val currentUser: User = User.load() // todo manager
  36. ) {
  37. val homeDir
  38. get() = File("/home/${currentUser.name}")
  39. val userDirs = UserDirs(this)
  40. val osDetails = OsRelease(this)
  41. val palette: Palette = Palette(scope, currentUser.theme.backgroundColor)
  42. val controlCenterPagesState: MutableState<List<ControlCenterPage>> = mutableStateOf(CONTROL_CENTER_PAGES)
  43. val machineName
  44. get() = Command("hostname").execute()
  45. // private val engine: ScriptEngine by lazy {
  46. // scriptManager.getEngineByName("JavaScript").apply {
  47. // // todo
  48. // }
  49. // }
  50. val adbHandler = adbDevicesHandler(
  51. coroutineScope = scope
  52. ) { device ->
  53. println("Device discovered : $device")
  54. // when device connected
  55. }
  56. val containerSize: DpSize by lazy {
  57. Toolkit.getDefaultToolkit().screenSize.let {
  58. DpSize(
  59. it.width.dp,
  60. it.height.dp
  61. )
  62. }
  63. }
  64. val controlCenterPages get() = controlCenterPagesState.value
  65. val appsProvider = AppsProvider(this)
  66. val graphicsEnvironment: GraphicsEnvironment
  67. get() = GraphicsEnvironment.getLocalGraphicsEnvironment()
  68. val graphicsDevice: GraphicsDevice
  69. get() = graphicsEnvironment.defaultScreenDevice
  70. val isTransparencySupported
  71. get() = graphicsDevice.isWindowTranslucencySupported(GraphicsDevice.WindowTranslucency.TRANSLUCENT)
  72. val mounts = FileSystemWatcher(scope) {
  73. println("Mounted: ${this.targetDirectory}")
  74. }
  75. init {
  76. currentUser.theme.controlCenterExpandedWidth = containerSize.width.div(4)
  77. mounts.init()
  78. }
  79. fun dispose() {
  80. kcefHelper.dispose()
  81. mounts.dispose()
  82. windows.dispose()
  83. }
  84. // fun runScript(script: String): Any =
  85. // engine.eval(script)
  86. // fun runScript(file: File): Any =
  87. // engine.eval(FileReader(file))
  88. fun executeCmd(cmd: String) {
  89. ProcessBuilder().apply {
  90. command(cmd)
  91. }.start()
  92. }
  93. fun executeCmd(cmd: String, directory: File) {
  94. ProcessBuilder().apply {
  95. directory(directory)
  96. command(cmd)
  97. }.start()
  98. }
  99. @Suppress("UNUSED_PARAMETER")
  100. fun login(
  101. user: String,
  102. password: String
  103. ) {
  104. // todo
  105. }
  106. fun logOut() {
  107. // todo
  108. exitProcess(0)
  109. }
  110. fun shutdown() {
  111. // todo
  112. exitProcess(0)
  113. }
  114. fun restart() {
  115. // todo
  116. exitProcess(0)
  117. }
  118. // theme support
  119. class DesktopScope(
  120. val api: DesktopProvider
  121. ) {
  122. val scope
  123. get() = api.scope
  124. val backgroundColorState
  125. get() = api.palette.backgroundColorState
  126. val backgroundColor
  127. get() = api.palette.backgroundColor
  128. val iconsTintColorState
  129. get() = api.palette.iconsTintColor
  130. val iconsTintColor
  131. get() = api.palette.iconsTintColor
  132. val textColorState
  133. get() = api.palette.textColorState
  134. val textColor
  135. get() = textColorState.value
  136. val borderColor
  137. get() = api.palette.borderColor
  138. }
  139. companion object {
  140. private val CONTROL_CENTER_PAGES = listOf(
  141. MainSettingsPage(),
  142. EthSettingsPage(),
  143. WifiSettingsPage(),
  144. BluetoothSettingsPage(),
  145. DisplaySettingsPage(),
  146. SoundSettingsPage(),
  147. AIPage(),
  148. DevicesPage()
  149. )
  150. val LocalDesktop = compositionLocalOf {
  151. DesktopProvider()
  152. }
  153. @Composable
  154. fun rememberDesktopProvider(
  155. scope: CoroutineScope = rememberCoroutineScope(),
  156. imageLoader: ImageLoader = asyncImageLoader()
  157. ) = remember {
  158. DesktopProvider(scope, imageLoader)
  159. }
  160. @Composable
  161. fun withDesktopScope(
  162. api: DesktopProvider = LocalDesktop.current,
  163. block: @Composable DesktopScope.() -> Unit
  164. ) = DesktopScope(api).apply {
  165. block()
  166. }
  167. }
  168. }