DesktopContext.kt 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  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.managers.apps.IAppsManager
  20. import org.mjdev.desktop.managers.connectivity.IConnectivityManager
  21. import org.mjdev.desktop.interfaces.IDesktopContext
  22. import org.mjdev.desktop.interfaces.ILocale
  23. import org.mjdev.desktop.interfaces.IPalette
  24. import org.mjdev.desktop.managers.process.IProcessManager
  25. import org.mjdev.desktop.interfaces.ITheme
  26. import org.mjdev.desktop.interfaces.IUser
  27. import org.mjdev.desktop.managers.language.Translator
  28. import org.mjdev.desktop.log.Log
  29. import org.mjdev.desktop.managers.ai.AiManager
  30. import org.mjdev.desktop.managers.ai.base.IAiManager
  31. import org.mjdev.desktop.managers.os.IOSManager
  32. import org.mjdev.desktop.managers.theme.IThemeManager
  33. import org.mjdev.desktop.managers.translations.ITranslator
  34. import org.mjdev.desktop.managers.ai.plugins.AiPluginGemini
  35. import org.mjdev.desktop.managers.ai.stt.STTPluginEmpty
  36. import org.mjdev.desktop.managers.ai.tts.TTSPluginAndroid
  37. import org.mjdev.desktop.managers.base.IDelegate
  38. import org.mjdev.desktop.managers.connectivity.ConnectivityManager
  39. import org.mjdev.desktop.managers.os.OsManager
  40. import org.mjdev.desktop.managers.processes.ProcessManager
  41. import kotlin.reflect.KClass
  42. import org.mjdev.desktop.managers.apps.AppsManager
  43. import org.mjdev.desktop.managers.keys.IKeyManager
  44. import org.mjdev.desktop.managers.keys.KeysManager
  45. import org.mjdev.desktop.managers.palette.Palette
  46. import org.mjdev.desktop.managers.theme.ThemeManager
  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. override var isFirstStart: Boolean = false
  60. override var isInstalled: Boolean = false
  61. override val machineName: String = ""
  62. override val appArgs: List<String> = emptyList()
  63. override val currentUser: IUser = allUsers.firstOrNull { u -> u.isLoggedIn } ?: User.DEFAULT
  64. override val currentLocale: ILocale = ILocale.DEFAULT
  65. override val theme: ITheme = ITheme.DEFAULT
  66. override val appCategories: List<Category> = emptyList()
  67. override val allApps: List<IApp> = emptyList()
  68. override val favoriteApps: List<IApp> = emptyList()
  69. override val isLandscapeMode: Boolean = true
  70. override val containerSize: DpSize = androidContext?.resources
  71. ?.displayMetrics
  72. ?.let { dm ->
  73. DpSize(dm.widthPixels.dp, dm.heightPixels.dp)
  74. } ?: DpSize(1024.dp, 640.dp)
  75. val allUsers
  76. get() = runCatching {
  77. User.allUsers(this)
  78. }.getOrNull() ?: emptyList()
  79. override suspend fun logOut() {
  80. }
  81. override suspend fun restart() {
  82. }
  83. override suspend fun suspend() {
  84. }
  85. override suspend fun shutdown() {
  86. }
  87. override suspend fun open(what: Any?) {
  88. }
  89. override suspend fun login(uName: String, uPasswd: String): Boolean {
  90. return false
  91. }
  92. override suspend fun logout(): Boolean {
  93. return false
  94. }
  95. override fun dispose() {
  96. }
  97. override fun createManager(cls: KClass<*>): IDelegate = when (cls) {
  98. IOSManager::class -> OsManager(this)
  99. IPalette::class -> Palette(this)
  100. ITranslator::class -> Translator(this)
  101. IConnectivityManager::class -> ConnectivityManager(this)
  102. IAiManager::class -> AiManager(
  103. context = this,
  104. // todo user can configure
  105. pluginAI = AiPluginGemini(this@DesktopContext),
  106. pluginTTS = TTSPluginAndroid(this@DesktopContext),
  107. pluginSTT = STTPluginEmpty(this@DesktopContext)
  108. )
  109. IAppsManager::class -> AppsManager(this)
  110. IThemeManager::class -> ThemeManager(this)
  111. IProcessManager::class -> ProcessManager(this)
  112. IKeyManager::class -> KeysManager(this)
  113. else -> cls.companionObject?.members?.first {
  114. it.name == "EMPTY"
  115. }?.call() as IDelegate
  116. }
  117. companion object {
  118. @Composable
  119. fun rememberDesktopContext(
  120. @SuppressLint("RestrictedApi")
  121. context: ComponentActivity,
  122. imageLoader: ImageLoader = asyncImageLoader(),
  123. platformContext: PlatformContext = LocalPlatformContext.current,
  124. scope: CoroutineScope = rememberCoroutineScope(),
  125. isInDesign: Boolean = isDesign,
  126. ) = remember {
  127. Log.i("default initialized desktop provider created")
  128. DesktopContext(
  129. context = context,
  130. scope = scope,
  131. imageLoader = imageLoader,
  132. isInDesign = isInDesign,
  133. platformContext = platformContext
  134. )
  135. }
  136. }
  137. }