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).
This commit is contained in:
2026-09-25 14:44:52 +03:00
parent 987f9e5547
commit e01fafd5a9
5 changed files with 109 additions and 11 deletions
@@ -10,6 +10,9 @@ import pw.binom.rayneovm.glasses.protocol.VmGlassesController
*
* Запускает [VmService] при создании (foreground-сервис держит WebSocket сервер + mDNS,
* и продолжает работать после сворачивания Activity).
*
* Также стартует [ShizukuBootstrap] — он регистрирует binder listener, ждёт/запрашивает
* permission и обновляет state. MainActivity потом подпишется на этот state.
*/
class GlassesVmApp : Application(), ControllerProvider {
@@ -18,11 +21,15 @@ class GlassesVmApp : Application(), ControllerProvider {
override fun onCreate() {
super.onCreate()
Log.i(TAG, "GlassesVmApp onCreate, uid=${android.os.Process.myUid()}")
// Инициализация RayNeo Mercury SDK.
com.ffalcon.mercury.android.sdk.MercurySDK.init(this)
Log.i(TAG, "MercurySDK initialized")
// 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)
// Регистрируем debug-receiver для тестирования через adb.
// 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)
@@ -30,6 +37,11 @@ class GlassesVmApp : Application(), ControllerProvider {
@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)
}