Fix crashing when changing theme

This commit is contained in:
h4h13 2020-04-18 12:19:35 +05:30
parent d87c95b7b2
commit 6065c994ad
6 changed files with 59 additions and 17 deletions

View file

@ -99,6 +99,11 @@ android {
kapt {
generateStubs = true
}
kotlin {
experimental {
coroutines "enable"
}
}
}
@ -168,6 +173,9 @@ dependencies {
def kotlin_coroutines_version = "1.3.3"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$kotlin_coroutines_version"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$kotlin_coroutines_version"
def arch_version = '2.2.0'
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$arch_version"
implementation "androidx.lifecycle:lifecycle-runtime-ktx:$arch_version"
implementation 'org.eclipse.mylyn.github:org.eclipse.egit.github.core:3.4.0.201406110918-r'
@ -184,4 +192,6 @@ dependencies {
def dagger_version = "2.23.1"
implementation "com.google.dagger:dagger:$dagger_version"
kapt "com.google.dagger:dagger-compiler:$dagger_version"
implementation 'com.github.ologe:scroll-helper:1.1.5'
}

View file

@ -4,8 +4,10 @@ import android.app.Activity
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.ListAdapter
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.adapter.GenreAdapter.ViewHolder
import code.name.monkey.retromusic.adapter.base.MediaEntryViewHolder
import code.name.monkey.retromusic.model.Genre
import code.name.monkey.retromusic.util.NavigationUtil
@ -19,7 +21,7 @@ class GenreAdapter(
private val activity: Activity,
var dataSet: List<Genre>,
private val mItemLayoutRes: Int
) : RecyclerView.Adapter<GenreAdapter.ViewHolder>() {
) : ListAdapter<Genre, ViewHolder>(GenreDiffCallback()) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
@ -54,3 +56,19 @@ class GenreAdapter(
}
}
}
/**
* Callback for calculating the diff between two non-null items in a list.
*
* Used by ListAdapter to calculate the minimum number of changes between and old list and a new
* list that's been passed to `submitList`.
*/
class GenreDiffCallback : DiffUtil.ItemCallback<Genre>() {
override fun areItemsTheSame(oldItem: Genre, newItem: Genre): Boolean {
return oldItem.id == newItem.id
}
override fun areContentsTheSame(oldItem: Genre, newItem: Genre): Boolean {
return oldItem == newItem
}
}

View file

@ -20,6 +20,7 @@ import android.util.DisplayMetrics
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager
import code.name.monkey.retromusic.App
import code.name.monkey.retromusic.Constants
@ -44,6 +45,8 @@ import com.bumptech.glide.load.engine.DiskCacheStrategy
import kotlinx.android.synthetic.main.abs_playlists.*
import kotlinx.android.synthetic.main.fragment_banner_home.*
import kotlinx.android.synthetic.main.home_content.*
import kotlinx.coroutines.async
import kotlinx.coroutines.launch
import java.io.File
import java.util.*
import javax.inject.Inject
@ -119,7 +122,10 @@ class BannerHomeFragment : AbsMainActivityFragment(), MainActivityFragmentCallba
}
actionShuffle.setOnClickListener {
MusicPlayerRemote.openAndShuffleQueue(SongLoader.getAllSongs(requireActivity()), true)
lifecycleScope.launch {
val songs = async { SongLoader.getAllSongs(requireContext()) }
MusicPlayerRemote.openAndShuffleQueue(songs.await(), true)
}
}
history.setOnClickListener {

View file

@ -16,7 +16,6 @@ package code.name.monkey.retromusic.fragments.settings
import android.os.Build
import android.os.Bundle
import android.os.Handler
import androidx.preference.Preference
import androidx.preference.TwoStatePreference
import code.name.monkey.appthemehelper.ACCENT_COLORS
@ -54,9 +53,7 @@ class ThemeSettingsFragment : AbsSettingsFragment() {
requireActivity().setTheme(PreferenceUtil.getThemeResFromPrefValue(theme))
DynamicShortcutManager(requireContext()).updateDynamicShortcuts()
}
Handler().postDelayed({
requireActivity().recreate()
}, 400)
requireActivity().recreate()
true
}
}
@ -78,9 +75,7 @@ class ThemeSettingsFragment : AbsSettingsFragment() {
ThemeStore.editTheme(requireContext()).accentColor(color).commit()
if (VersionUtils.hasNougatMR())
DynamicShortcutManager(requireContext()).updateDynamicShortcuts()
Handler().postDelayed({
requireActivity().recreate()
}, 400)
requireActivity().recreate()
}
}
return@setOnPreferenceClickListener true
@ -96,9 +91,7 @@ class ThemeSettingsFragment : AbsSettingsFragment() {
requireActivity().setTheme(PreferenceUtil.getThemeResFromPrefValue("black"))
DynamicShortcutManager(requireContext()).updateDynamicShortcuts()
}
Handler().postDelayed({
requireActivity().recreate()
}, 400)
requireActivity().recreate()
true
}
@ -109,9 +102,7 @@ class ThemeSettingsFragment : AbsSettingsFragment() {
ThemeStore.prefs(requireContext()).edit().putBoolean("desaturated_color", desaturated)
.apply()
PreferenceUtil.getInstance(requireContext()).setDesaturatedColor(desaturated)
Handler().postDelayed({
requireActivity().recreate()
}, 400)
requireActivity().recreate()
true
}

View file

@ -0,0 +1,16 @@
package code.name.monkey.retromusic.util
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.Dispatchers
const val THREAD_COUNT = 3
/**
* Global executor pools for the whole application.
*
* Grouping tasks like this avoids the effects of task starvation (e.g. disk reads don't wait behind
* webservice requests).
*/
open class AppExecutors constructor(
val ioContext: CoroutineDispatcher = Dispatchers.IO
)

View file

@ -97,7 +97,8 @@
app:retroCornerSize="36dp"
app:srcCompat="@drawable/ic_person_flat"
app:strokeColor="?attr/colorSurface"
app:strokeWidth="2dp" />
app:strokeWidth="2dp"
tools:src="@tools:sample/avatars" />
<androidx.appcompat.widget.AppCompatImageView
android:layout_width="wrap_content"