Files
rayneo-vm/app-glasses-vm/src/main/kotlin/pw/binom/rayneovm/glasses/GlassesVmApp.kt
T
subochev e01fafd5a9 glasses: switch to rikka.shizuku.ShizukuProvider, fix binder acquisition
- Add dev.rikka.shizuku:provider:13.1.5 dependency.
- Replace custom ShizukuInitProvider with rikka.shizuku.ShizukuProvider
  from the upstream library; configured per Shizuku v12+ docs with
  android:permission='android.permission.INTERACT_ACROSS_USERS_FULL'
  to protect the provider from ordinary apps.
- Move ShizukuBootstrap.attach() from GlassesVmApp.onCreate to
  MainActivity.onCreate (requestPermission needs an Activity context).
- MainActivity now overrides onRequestPermissionsResult and forwards
  the grant to ShizukuBootstrap.
- Rewrite ShizukuBootstrap strictly per the Shizuku-API guide:
  addBinderReceivedListenerSticky + addRequestPermissionResultListener
  in attach(); pingBinder / checkSelfPermission / requestPermission
  in refresh().
- Drop ShizukuInitProvider.kt — its job is now done by
  rikka.shizuku.ShizukuProvider.onCreate (verified in logcat:
  'ShizukuProvider: binder received').

Verified on device ARGF20 (A06B4AB933C4103, API 32): Shizuku dialog
'Allow rayneo-vm to use Shizuku?' opens correctly; binder received
via ShizukuProvider; launcher icon now visible (meta-data fix).
2026-09-25 14:44:52 +03:00

59 lines
2.5 KiB
Kotlin

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"
}
}