From 6065c994ad5e5c4add4fd0177ce11adff5ceaad2 Mon Sep 17 00:00:00 2001 From: h4h13 Date: Sat, 18 Apr 2020 12:19:35 +0530 Subject: [PATCH] Fix crashing when changing theme --- app/build.gradle | 10 +++++++++ .../monkey/retromusic/adapter/GenreAdapter.kt | 22 +++++++++++++++++-- .../mainactivity/BannerHomeFragment.kt | 8 ++++++- .../settings/ThemeSettingsFragment.kt | 17 ++++---------- .../monkey/retromusic/util/AppExecutors.kt | 16 ++++++++++++++ .../main/res/layout/activity_user_info.xml | 3 ++- 6 files changed, 59 insertions(+), 17 deletions(-) create mode 100644 app/src/main/java/code/name/monkey/retromusic/util/AppExecutors.kt diff --git a/app/build.gradle b/app/build.gradle index 4d558ba8f..b1549caae 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -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' } \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/GenreAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/GenreAdapter.kt index 570912a30..9b27309ed 100644 --- a/app/src/main/java/code/name/monkey/retromusic/adapter/GenreAdapter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/adapter/GenreAdapter.kt @@ -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, private val mItemLayoutRes: Int -) : RecyclerView.Adapter() { +) : ListAdapter(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() { + override fun areItemsTheSame(oldItem: Genre, newItem: Genre): Boolean { + return oldItem.id == newItem.id + } + + override fun areContentsTheSame(oldItem: Genre, newItem: Genre): Boolean { + return oldItem == newItem + } +} \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/mainactivity/BannerHomeFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/mainactivity/BannerHomeFragment.kt index 33b02895c..fc87c4eaa 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/mainactivity/BannerHomeFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/mainactivity/BannerHomeFragment.kt @@ -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 { diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/ThemeSettingsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/ThemeSettingsFragment.kt index 3e72b7014..558558803 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/ThemeSettingsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/ThemeSettingsFragment.kt @@ -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 } diff --git a/app/src/main/java/code/name/monkey/retromusic/util/AppExecutors.kt b/app/src/main/java/code/name/monkey/retromusic/util/AppExecutors.kt new file mode 100644 index 000000000..aed5968bb --- /dev/null +++ b/app/src/main/java/code/name/monkey/retromusic/util/AppExecutors.kt @@ -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 +) \ No newline at end of file diff --git a/app/src/main/res/layout/activity_user_info.xml b/app/src/main/res/layout/activity_user_info.xml index a3b2a3f3a..bb92d2a4d 100644 --- a/app/src/main/res/layout/activity_user_info.xml +++ b/app/src/main/res/layout/activity_user_info.xml @@ -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" />