e01fafd5a9
- 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).
59 lines
2.5 KiB
Kotlin
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"
|
|
}
|
|
}
|