ead28cf09a
ARIAs Antwort wird jetzt auch dann fertig vorgelesen wenn der User die App im Hintergrund schickt. Vorher hat Android den Prozess kurz nach dem Minimieren eingefroren — TTS verstummte mitten im Satz. Native: - AriaPlaybackService.kt: Service mit foregroundServiceType=mediaPlayback, zeigt persistente Notification "ARIA spricht — antippen oeffnet die App" (channel low-priority, ongoing, tap → MainActivity) - BackgroundAudioModule.kt: RN-Bridge mit start()/stop() - AndroidManifest: FOREGROUND_SERVICE + FOREGROUND_SERVICE_MEDIA_PLAYBACK + POST_NOTIFICATIONS Permissions, Service deklariert JS: - backgroundAudio.ts: idempotenter Wrapper (active-Flag verhindert doppelte start/stop calls) - ChatScreen onPlaybackStarted → startBackgroundAudio - ChatScreen onPlaybackFinished → stopBackgroundAudio - audio.ts stopPlayback ruft auch stopBackgroundAudio damit die Notification bei Cancel/Barge-In/Anruf nicht haengen bleibt Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
50 lines
1.8 KiB
Kotlin
50 lines
1.8 KiB
Kotlin
package com.ariacockpit
|
|
|
|
import android.app.Application
|
|
import com.facebook.react.PackageList
|
|
import com.facebook.react.ReactApplication
|
|
import com.facebook.react.ReactHost
|
|
import com.facebook.react.ReactNativeHost
|
|
import com.facebook.react.ReactPackage
|
|
import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.load
|
|
import com.facebook.react.defaults.DefaultReactHost.getDefaultReactHost
|
|
import com.facebook.react.defaults.DefaultReactNativeHost
|
|
import com.facebook.react.flipper.ReactNativeFlipper
|
|
import com.facebook.soloader.SoLoader
|
|
|
|
class MainApplication : Application(), ReactApplication {
|
|
|
|
override val reactNativeHost: ReactNativeHost =
|
|
object : DefaultReactNativeHost(this) {
|
|
override fun getPackages(): List<ReactPackage> =
|
|
PackageList(this).packages.apply {
|
|
add(ApkInstallerPackage())
|
|
add(AudioFocusPackage())
|
|
add(PcmStreamPlayerPackage())
|
|
add(OpenWakeWordPackage())
|
|
add(PhoneCallPackage())
|
|
add(BackgroundAudioPackage())
|
|
}
|
|
|
|
override fun getJSMainModuleName(): String = "index"
|
|
|
|
override fun getUseDeveloperSupport(): Boolean = BuildConfig.DEBUG
|
|
|
|
override val isNewArchEnabled: Boolean = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED
|
|
override val isHermesEnabled: Boolean = BuildConfig.IS_HERMES_ENABLED
|
|
}
|
|
|
|
override val reactHost: ReactHost
|
|
get() = getDefaultReactHost(this.applicationContext, reactNativeHost)
|
|
|
|
override fun onCreate() {
|
|
super.onCreate()
|
|
SoLoader.init(this, false)
|
|
if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) {
|
|
// If you opted-in for the New Architecture, we load the native entry point for this app.
|
|
load()
|
|
}
|
|
ReactNativeFlipper.initializeFlipper(this, reactNativeHost.reactInstanceManager)
|
|
}
|
|
}
|