Create dedicated app object

Create a dedicated app object to fix issues with settings initialization & image loading.
This commit is contained in:
OxygenCobalt 2021-01-14 07:42:56 -07:00
parent 60af5f8656
commit 1ae4d21b18
No known key found for this signature in database
GPG key ID: 37DBE3621FE9AD47
7 changed files with 35 additions and 47 deletions

View file

@ -22,4 +22,5 @@
-dontobfuscate -dontobfuscate
-keep class org.oxycblt.auxio.AuxioApp
-keep class org.oxycblt.auxio.settings.SettingsListFragment -keep class org.oxycblt.auxio.settings.SettingsListFragment

View file

@ -9,6 +9,7 @@
<queries /> <queries />
<application <application
android:name="org.oxycblt.auxio.AuxioApp"
android:allowBackup="true" android:allowBackup="true"
android:fullBackupContent="@xml/backup_descriptor" android:fullBackupContent="@xml/backup_descriptor"
android:icon="@mipmap/ic_launcher" android:icon="@mipmap/ic_launcher"

View file

@ -0,0 +1,29 @@
package org.oxycblt.auxio
import android.app.Application
import androidx.appcompat.app.AppCompatDelegate
import coil.ImageLoader
import coil.ImageLoaderFactory
import coil.request.CachePolicy
import org.oxycblt.auxio.settings.SettingsManager
@Suppress("UNUSED")
class AuxioApp : Application(), ImageLoaderFactory {
override fun onCreate() {
super.onCreate()
// Init SettingsManager here so that there aren't any race conditions
// [e,g Service starts/gets SettingsManager before activity can init SettingsManager]
val settingsManager = SettingsManager.init(applicationContext)
AppCompatDelegate.setDefaultNightMode(settingsManager.theme)
}
override fun newImageLoader(): ImageLoader {
return ImageLoader.Builder(applicationContext)
.diskCachePolicy(CachePolicy.DISABLED)
.crossfade(true)
.placeholder(android.R.color.transparent)
.build()
}
}

View file

@ -3,7 +3,7 @@ package org.oxycblt.auxio
import android.util.Log import android.util.Log
// Shortcut functions for logging. // Shortcut functions for logging.
// Yes, I know timber exists but it does too much. // Yes, I know timber exists but this does what I need.
/** /**
* Shortcut method for logging a debug statement, handles debug builds and anonymous objects * Shortcut method for logging a debug statement, handles debug builds and anonymous objects

View file

@ -6,10 +6,8 @@ import android.os.Bundle
import android.view.View import android.view.View
import android.view.WindowInsets import android.view.WindowInsets
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.app.AppCompatDelegate
import androidx.databinding.DataBindingUtil import androidx.databinding.DataBindingUtil
import coil.Coil import coil.Coil
import org.oxycblt.auxio.coil.createImageLoader
import org.oxycblt.auxio.databinding.ActivityMainBinding import org.oxycblt.auxio.databinding.ActivityMainBinding
import org.oxycblt.auxio.playback.PlaybackService import org.oxycblt.auxio.playback.PlaybackService
import org.oxycblt.auxio.settings.SettingsManager import org.oxycblt.auxio.settings.SettingsManager
@ -28,9 +26,7 @@ class MainActivity : AppCompatActivity() {
this, R.layout.activity_main this, R.layout.activity_main
) )
val settingsManager = SettingsManager.init(applicationContext) val settingsManager = SettingsManager.getInstance()
AppCompatDelegate.setDefaultNightMode(settingsManager.theme)
accent = settingsManager.accent accent = settingsManager.accent
@ -40,10 +36,6 @@ class MainActivity : AppCompatActivity() {
if (isEdgeOn()) { if (isEdgeOn()) {
doEdgeToEdgeSetup(binding) doEdgeToEdgeSetup(binding)
} }
createImageLoader(applicationContext)?.let {
Coil.setImageLoader(it)
}
} }
override fun onStart() { override fun onStart() {

View file

@ -93,13 +93,9 @@ class MainFragment : Fragment() {
if (it != null && navController != null) { if (it != null && navController != null) {
val curDest = navController.currentDestination?.id val curDest = navController.currentDestination?.id
var isOk = false // SongsFragment and SettingsFragment have no navigation pathways, so correct
// them to the library tab instead.
if (curDest == R.id.songs_fragment || curDest == R.id.settings_fragment) { if (curDest == R.id.songs_fragment || curDest == R.id.settings_fragment) {
isOk = true
}
if (isOk) {
binding.navBar.selectedItemId = R.id.library_fragment binding.navBar.selectedItemId = R.id.library_fragment
} }
} }

View file

@ -3,13 +3,10 @@ package org.oxycblt.auxio.coil
import android.content.Context import android.content.Context
import android.graphics.Bitmap import android.graphics.Bitmap
import android.net.Uri import android.net.Uri
import android.util.Log
import android.widget.ImageView import android.widget.ImageView
import androidx.core.graphics.drawable.toBitmap import androidx.core.graphics.drawable.toBitmap
import androidx.databinding.BindingAdapter import androidx.databinding.BindingAdapter
import coil.Coil import coil.Coil
import coil.ImageLoader
import coil.request.CachePolicy
import coil.request.ImageRequest import coil.request.ImageRequest
import org.oxycblt.auxio.R import org.oxycblt.auxio.R
import org.oxycblt.auxio.logE import org.oxycblt.auxio.logE
@ -25,34 +22,6 @@ val settingsManager: SettingsManager by lazy {
SettingsManager.getInstance() SettingsManager.getInstance()
} }
/**
* Create the custom [ImageLoader] used by Auxio. Primarily handles whether disk-caching should be done.
* @return A new [ImageLoader], null if the current loader already satisfies what is needed.
*/
fun createImageLoader(context: Context): ImageLoader? {
Log.d("createImageLoader", "Creating image loader.")
val builder = ImageLoader.Builder(context)
val currentLoader = Coil.imageLoader(context)
// Enable disk caching if quality covers are being used so that its more efficient.
// Don't bother if not however, as the covers are already cached on-disk.
if (settingsManager.useQualityCovers) {
if (currentLoader.defaults.diskCachePolicy != CachePolicy.ENABLED) {
builder.diskCachePolicy(CachePolicy.ENABLED)
return builder.build()
}
} else {
if (currentLoader.defaults.diskCachePolicy != CachePolicy.DISABLED) {
builder.diskCachePolicy(CachePolicy.DISABLED)
return builder.build()
}
}
return null
}
/** /**
* Get a bitmap for a song. onDone will be called when the bitmap is loaded. * Get a bitmap for a song. onDone will be called when the bitmap is loaded.
* **Do not use this on the UI elements, instead use the Binding Adapters.** * **Do not use this on the UI elements, instead use the Binding Adapters.**