DesktopContext.kt 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. package org.mjdev.desktop.context
  2. import android.annotation.SuppressLint
  3. import androidx.compose.runtime.Composable
  4. import androidx.compose.runtime.remember
  5. import androidx.compose.runtime.rememberCoroutineScope
  6. import androidx.compose.ui.unit.DpSize
  7. import androidx.compose.ui.unit.dp
  8. import androidx.core.app.ComponentActivity
  9. import coil3.ImageLoader
  10. import coil3.PlatformContext
  11. import coil3.compose.LocalPlatformContext
  12. import kotlinx.coroutines.CoroutineScope
  13. import kotlinx.coroutines.Dispatchers
  14. import org.mjdev.desktop.data.Category
  15. import org.mjdev.desktop.data.User
  16. import org.mjdev.desktop.extensions.Compose.isDesign
  17. import org.mjdev.desktop.helpers.image.ImageLoader.asyncImageLoader
  18. import org.mjdev.desktop.interfaces.IApp
  19. import org.mjdev.desktop.interfaces.ILocale
  20. import org.mjdev.desktop.interfaces.ITheme
  21. import org.mjdev.desktop.interfaces.IUser
  22. import org.mjdev.desktop.log.Log
  23. import org.mjdev.desktop.managers.ai.AiManager
  24. import org.mjdev.desktop.managers.ai.IAiManager
  25. import org.mjdev.desktop.managers.ai.plugins.AiPluginGemini
  26. import org.mjdev.desktop.managers.ai.plugins.AiPluginOpenAi
  27. import org.mjdev.desktop.managers.ai.stt.STTPluginEmpty
  28. import org.mjdev.desktop.managers.ai.tts.TTSPluginAndroid
  29. import org.mjdev.desktop.managers.apps.AppsManager
  30. import org.mjdev.desktop.managers.apps.IAppsManager
  31. import org.mjdev.desktop.managers.base.IDelegate
  32. import org.mjdev.desktop.managers.connectivity.ConnectivityManager
  33. import org.mjdev.desktop.managers.connectivity.IConnectivityManager
  34. import org.mjdev.desktop.managers.keys.IKeyManager
  35. import org.mjdev.desktop.managers.keys.KeysManager
  36. import org.mjdev.desktop.managers.language.Translator
  37. import org.mjdev.desktop.managers.os.IOSManager
  38. import org.mjdev.desktop.managers.os.OsManager
  39. import org.mjdev.desktop.managers.palette.IPalette
  40. import org.mjdev.desktop.managers.palette.Palette
  41. import org.mjdev.desktop.managers.process.IProcessManager
  42. import org.mjdev.desktop.managers.processes.ProcessManager
  43. import org.mjdev.desktop.managers.theme.IThemeManager
  44. import org.mjdev.desktop.managers.theme.ThemeManager
  45. import org.mjdev.desktop.managers.translations.ITranslator
  46. import kotlin.reflect.KClass
  47. import kotlin.reflect.full.companionObject
  48. @Suppress("unused", "MemberVisibilityCanBePrivate")
  49. class DesktopContext(
  50. @SuppressLint("RestrictedApi")
  51. val context: ComponentActivity? = null,
  52. override val scope: CoroutineScope = CoroutineScope(Dispatchers.Default),
  53. override val imageLoader: ImageLoader? = null,
  54. val isInDesign: Boolean = false,
  55. override val platformContext: PlatformContext? = null,
  56. ) : IDesktopContext() {
  57. val androidContext
  58. get() = context
  59. // todo
  60. override var isFirstStart: Boolean = false
  61. override var isInstalled: Boolean = true
  62. // todo
  63. override val machineName: String = ""
  64. // todo
  65. override val appArgs: List<String> = emptyList()
  66. // todo
  67. override val currentUser: IUser = allUsers.firstOrNull { u -> u.isLoggedIn } ?: User.DEFAULT
  68. // todo
  69. override val currentLocale: ILocale = ILocale.DEFAULT
  70. override val theme: ITheme = ITheme.DEFAULT
  71. override val appCategories: List<Category>
  72. get() = appsManager.categories
  73. override val allApps: List<IApp>
  74. get() = appsManager.allApps
  75. override val favoriteApps: List<IApp>
  76. get() = appsManager.favoriteApps
  77. override val containerSize: DpSize =
  78. androidContext
  79. ?.resources
  80. ?.displayMetrics
  81. ?.let { dm ->
  82. DpSize(dm.widthPixels.dp, dm.heightPixels.dp)
  83. } ?: DpSize(1024.dp, 640.dp)
  84. val allUsers
  85. get() =
  86. runCatching {
  87. User.allUsers(this)
  88. }.getOrNull() ?: emptyList()
  89. override suspend fun logOut() {
  90. }
  91. override suspend fun restart() {
  92. }
  93. override suspend fun suspend() {
  94. }
  95. override suspend fun shutdown() {
  96. }
  97. override suspend fun open(what: Any?) {
  98. }
  99. override suspend fun login(
  100. uName: String,
  101. uPasswd: String,
  102. ): Boolean = false
  103. override suspend fun logout(): Boolean = false
  104. override fun dispose() {
  105. }
  106. override fun createManager(cls: KClass<*>): IDelegate =
  107. when (cls) {
  108. IOSManager::class -> OsManager(this)
  109. IPalette::class -> Palette(this)
  110. ITranslator::class -> Translator(this)
  111. IConnectivityManager::class -> ConnectivityManager(this)
  112. IAiManager::class ->
  113. AiManager(
  114. context = this,
  115. // todo user can configure
  116. pluginAI = AiPluginOpenAi(this@DesktopContext),
  117. pluginTTS = TTSPluginAndroid(this@DesktopContext),
  118. pluginSTT = STTPluginEmpty(this@DesktopContext),
  119. )
  120. IAppsManager::class -> AppsManager(this)
  121. IThemeManager::class -> ThemeManager(this)
  122. IProcessManager::class -> ProcessManager(this)
  123. IKeyManager::class -> KeysManager(this)
  124. else ->
  125. cls.companionObject
  126. ?.members
  127. ?.first {
  128. it.name == "EMPTY"
  129. }?.call() as IDelegate
  130. }
  131. companion object {
  132. @Composable
  133. fun rememberDesktopContext(
  134. @SuppressLint("RestrictedApi")
  135. context: ComponentActivity,
  136. imageLoader: ImageLoader = asyncImageLoader(),
  137. platformContext: PlatformContext = LocalPlatformContext.current,
  138. scope: CoroutineScope = rememberCoroutineScope(),
  139. isInDesign: Boolean = isDesign,
  140. ) = remember {
  141. Log.i("default initialized desktop provider created")
  142. DesktopContext(
  143. context = context,
  144. scope = scope,
  145. imageLoader = imageLoader,
  146. isInDesign = isInDesign,
  147. platformContext = platformContext,
  148. )
  149. }
  150. }
  151. }