package pw.binom.rayneovm.glasses import android.app.Application import android.util.Log import pw.binom.rayneovm.glasses.protocol.ControllerProvider import pw.binom.rayneovm.glasses.protocol.VmGlassesController /** * Application-класс GlassesApp. * * Запускает [VmService] при создании (foreground-сервис держит WebSocket сервер + mDNS, * и продолжает работать после сворачивания Activity). * * Также стартует [ShizukuBootstrap] — он регистрирует binder listener, ждёт/запрашивает * permission и обновляет state. MainActivity потом подпишется на этот state. */ class GlassesVmApp : Application(), ControllerProvider { private val controller: VmGlassesController by lazy { VmGlassesController() } override fun onCreate() { super.onCreate() Log.i(TAG, "GlassesVmApp onCreate, uid=${android.os.Process.myUid()}") // 1. RayNeo Mercury SDK init (BLE-канал, если нужно) runCatching { com.ffalcon.mercury.android.sdk.MercurySDK.init(this) } .onSuccess { Log.i(TAG, "MercurySDK initialized") } .onFailure { Log.w(TAG, "MercurySDK init failed: ${it.message}") } controller.setAppContext(this) // 2. Регистрируем debug-receiver для тестирования через adb val filter = android.content.IntentFilter(pw.binom.rayneovm.glasses.protocol.DebugTestReceiver.ACTION) if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.TIRAMISU) { registerReceiver(pw.binom.rayneovm.glasses.protocol.DebugTestReceiver(), filter, android.content.Context.RECEIVER_EXPORTED) } else { @Suppress("UnspecifiedRegisterReceiverFlag") registerReceiver(pw.binom.rayneovm.glasses.protocol.DebugTestReceiver(), filter) } // 3. Shizuku bootstrap здесь не зовём — он вызывается из MainActivity.onCreate, // где есть Activity-контекст (для requestPermission flow). // 4. Запуск foreground-сервиса (WebSocket + mDNS publisher) VmService.start(this) } override fun onTerminate() { super.onTerminate() VmService.stop(this) } override fun provideController(): VmGlassesController = controller companion object { private const val TAG = "GlassesVmApp" } }