From 1e571e165cd6f6cfa87f721fd1a5bcc0998b45ea Mon Sep 17 00:00:00 2001 From: tzugen Date: Mon, 6 Jun 2022 22:12:16 +0200 Subject: [PATCH] Don't ecit the process, and reinit Koin on resume --- .../ultrasonic/activity/NavigationActivity.kt | 20 +++++++++++++--- .../kotlin/org/moire/ultrasonic/app/UApp.kt | 24 +++++++++++++++---- .../moire/ultrasonic/service/Downloader.kt | 1 + .../service/MediaPlayerController.kt | 17 +++++++++++-- 4 files changed, 52 insertions(+), 10 deletions(-) diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/activity/NavigationActivity.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/activity/NavigationActivity.kt index e243e704..d0499aa5 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/activity/NavigationActivity.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/activity/NavigationActivity.kt @@ -42,10 +42,10 @@ import androidx.preference.PreferenceManager import com.google.android.material.button.MaterialButton import com.google.android.material.navigation.NavigationView import io.reactivex.rxjava3.disposables.CompositeDisposable -import kotlin.system.exitProcess import org.koin.android.ext.android.inject import org.koin.androidx.viewmodel.ext.android.viewModel import org.moire.ultrasonic.R +import org.moire.ultrasonic.app.UApp import org.moire.ultrasonic.data.ActiveServerProvider import org.moire.ultrasonic.data.ServerSettingDao import org.moire.ultrasonic.fragment.OnBackPressedHandler @@ -99,6 +99,17 @@ class NavigationActivity : AppCompatActivity() { private var cachedServerCount: Int = 0 override fun onCreate(savedInstanceState: Bundle?) { + Timber.d("onCreate called") + + // First check if Koin has been started + + if (UApp.instance != null && !UApp.instance!!.initiated) { + Timber.d("Starting Koin") + UApp.instance!!.startKoin() + } else { + Timber.d("No need to start Koin") + } + setUncaughtExceptionHandler() Util.applyTheme(this) @@ -226,6 +237,7 @@ class NavigationActivity : AppCompatActivity() { } override fun onResume() { + Timber.d("onResume called") super.onResume() Storage.reset() @@ -239,9 +251,11 @@ class NavigationActivity : AppCompatActivity() { } override fun onDestroy() { - super.onDestroy() + Timber.d("onDestroy called") rxBusSubscription.dispose() imageLoaderProvider.clearImageLoader() + UApp.instance!!.shutdownKoin() + super.onDestroy() } override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { @@ -366,9 +380,9 @@ class NavigationActivity : AppCompatActivity() { } private fun exit() { + Timber.d("User choose to exit the app") lifecycleSupport.onDestroy() finishAndRemoveTask() - exitProcess(0) } private fun showWelcomeDialog() { diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/app/UApp.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/app/UApp.kt index d5d31b6b..6d642063 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/app/UApp.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/app/UApp.kt @@ -1,13 +1,13 @@ package org.moire.ultrasonic.app import android.content.Context -import android.os.StrictMode import androidx.multidex.MultiDexApplication import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import org.koin.android.ext.koin.androidContext import org.koin.core.context.startKoin +import org.koin.core.context.stopKoin import org.koin.core.logger.Level import org.moire.ultrasonic.BuildConfig import org.moire.ultrasonic.di.appPermanentStorage @@ -31,17 +31,22 @@ class UApp : MultiDexApplication() { init { instance = this - if (BuildConfig.DEBUG) - StrictMode.enableDefaults() +// if (BuildConfig.DEBUG) +// StrictMode.enableDefaults() } + var initiated = false + override fun onCreate() { + initiated = true super.onCreate() if (BuildConfig.DEBUG) { Timber.plant(DebugTree()) } + Timber.d("onCreate called") + // In general we should not access the settings from the main thread to avoid blocking... ioScope.launch { if (Settings.debugLogToFile) { @@ -49,8 +54,12 @@ class UApp : MultiDexApplication() { } } + startKoin() + } + + internal fun startKoin() { startKoin { - // TODO Currently there is a bug in Koin which makes necessary to set the loglevel to ERROR + // TODO Currently there is a bug in Koin which makes necessary to set the log level to ERROR logger(TimberKoinLogger(Level.ERROR)) // logger(TimberKoinLogger(Level.INFO)) @@ -67,8 +76,13 @@ class UApp : MultiDexApplication() { } } + internal fun shutdownKoin() { + stopKoin() + initiated = false + } + companion object { - private var instance: UApp? = null + var instance: UApp? = null fun applicationContext(): Context { return instance!!.applicationContext diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/Downloader.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/Downloader.kt index d36854a6..100a8fdd 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/Downloader.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/Downloader.kt @@ -66,6 +66,7 @@ class Downloader( private val rxBusSubscription: CompositeDisposable = CompositeDisposable() init { + Timber.i("Init called") // Check downloads if the playlist changed rxBusSubscription += RxBus.playlistObservable.subscribe { Timber.v("Playlist has changed, checking Downloads...") diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/MediaPlayerController.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/MediaPlayerController.kt index ede9d503..45a070ed 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/MediaPlayerController.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/MediaPlayerController.kt @@ -76,6 +76,8 @@ class MediaPlayerController( var controller: MediaController? = null + private lateinit var listeners: Player.Listener + fun onCreate(onCreated: () -> Unit) { if (created) return externalStorageMonitor.onCreate { reset() } @@ -86,7 +88,7 @@ class MediaPlayerController( Timber.i("MediaController Instance received") - controller?.addListener(object : Player.Listener { + listeners = object : Player.Listener { /* * Log all events @@ -134,7 +136,9 @@ class MediaPlayerController( playerStateChangedHandler() publishPlaybackState() } - }) + } + + controller?.addListener(listeners) onCreated() @@ -224,6 +228,12 @@ class MediaPlayerController( fun onDestroy() { if (!created) return + + // First stop listening to events + rxBusSubscription.dispose() + controller?.removeListener(listeners) + + // Shutdown the rest val context = UApp.applicationContext() externalStorageMonitor.onDestroy() context.stopService(Intent(context, DownloadService::class.java)) @@ -457,6 +467,9 @@ class MediaPlayerController( @Synchronized private fun serializeCurrentSession() { + // Don't serialize invalid sessions + if (currentMediaItemIndex == -1) return + playbackStateSerializer.serialize( legacyPlaylistManager.playlist, currentMediaItemIndex,