feat: сетевая часть для app-phone (WS-сервер) и app-glasses (WS-клиент), PhoneState/PhoneActions → lib-core
lib-core: - core/phone/: PhoneState, PhoneActions, GlassesSender (интерфейс) — перенесены из app-host - core/net/: GlassesWsClient — KMP WS-клиент очков (реконнект, Hello, send GlassesToHost) - GlassesWsClientTest + PhoneActionsTest (перенесён) app-phone (Android): - GlassesServer: Ktor WS-сервер (CIO) 0.0.0.0:8080/ws/glasses, принимает очки, Welcome из стейта - PhoneApp (Application): клиенты, стейт, действия, сервер - PhoneConfig: креды Jellyfin/Mirror - MainActivity: статус сервера (порт, счётчик подключений) - GlassesServerTest: hello→welcome, gesture app-glasses (Android): - GlassesApp (Application), HostConnection: WS-клиент к телефону, Hello, реконнект, обработка HostToGlasses (PlayVideo/SetMode и т.д.), StateFlow для UI - MainActivity: статус подключения app-host: PhoneActions/PhoneState удалены (теперь lib-core), адаптирован под GlassesSender 171 тест, 0 провалов; app-host жив (catalog/watch/status работают через lib-core)
This commit is contained in:
@@ -0,0 +1,60 @@
|
||||
package pw.binom.viewmate.phone
|
||||
|
||||
import android.app.Application
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.SupervisorJob
|
||||
import kotlinx.coroutines.launch
|
||||
import pw.binom.viewmate.core.media.JellyfinClient
|
||||
import pw.binom.viewmate.core.media.MirrorClient
|
||||
import pw.binom.viewmate.core.phone.PhoneActions
|
||||
import pw.binom.viewmate.core.phone.PhoneState
|
||||
|
||||
/**
|
||||
* Application телефона: создаёт клиентов (Jellyfin/mirror), PhoneState,
|
||||
* WS-сервер (GlassesServer) и PhoneActions. Синглтон-доступ через companion.
|
||||
*/
|
||||
class PhoneApp : Application() {
|
||||
|
||||
lateinit var state: PhoneState
|
||||
private set
|
||||
lateinit var server: GlassesServer
|
||||
private set
|
||||
lateinit var actions: PhoneActions
|
||||
private set
|
||||
|
||||
private val scope = CoroutineScope(SupervisorJob() + Dispatchers.IO)
|
||||
|
||||
override fun onCreate() {
|
||||
super.onCreate()
|
||||
instance = this
|
||||
|
||||
state = PhoneState()
|
||||
server = GlassesServer(port = PhoneConfig.SERVER_PORT, state = state)
|
||||
|
||||
val jellyfin = JellyfinClient(PhoneConfig.JELLYFIN_URL, PhoneConfig.JELLYFIN_API_KEY)
|
||||
val mirror = MirrorClient(PhoneConfig.MIRROR_URL, PhoneConfig.MIRROR_API_KEY)
|
||||
|
||||
server.start()
|
||||
|
||||
// первый пользователь Jellyfin — один раз при старте
|
||||
scope.launch {
|
||||
val userId = runCatching { jellyfin.users().firstOrNull()?.Id }.getOrNull()
|
||||
?: ""
|
||||
if (userId.isBlank()) log("app", "не удалось получить пользователя Jellyfin")
|
||||
actions = PhoneActions(
|
||||
jellyfin = jellyfin,
|
||||
mirror = mirror,
|
||||
sender = server.sender,
|
||||
state = state,
|
||||
userId = userId,
|
||||
)
|
||||
log("app", "PhoneActions готов (userId=$userId)")
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
lateinit var instance: PhoneApp
|
||||
private set
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user