diff --git a/app/build.gradle b/app/build.gradle
index 5e1f7522a..7581b2571 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -14,8 +14,8 @@ android {
vectorDrawables.useSupportLibrary = true
applicationId "code.name.monkey.retromusic"
- versionCode 10567
- versionName '5.7.2'
+ versionCode 10569
+ versionName '5.7.3'
buildConfigField("String", "GOOGLE_PLAY_LICENSING_KEY", "\"${getProperty(getProperties('../public.properties'), 'GOOGLE_PLAY_LICENSE_KEY')}\"")
}
@@ -93,7 +93,7 @@ dependencies {
implementation "androidx.appcompat:appcompat:$appcompat_version"
implementation 'androidx.annotation:annotation:1.3.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
- implementation 'androidx.recyclerview:recyclerview:1.3.0-alpha01'
+ implementation 'androidx.recyclerview:recyclerview:1.2.1'
implementation "androidx.preference:preference-ktx:$preference_version"
implementation 'androidx.core:core-ktx:1.7.0'
implementation 'androidx.palette:palette-ktx:1.0.0'
@@ -126,7 +126,7 @@ dependencies {
def retrofit_version = '2.9.0'
implementation "com.squareup.retrofit2:retrofit:$retrofit_version"
implementation "com.squareup.retrofit2:converter-gson:$retrofit_version"
- implementation 'com.squareup.okhttp3:logging-interceptor:5.0.0-alpha.5'
+ implementation 'com.squareup.okhttp3:logging-interceptor:5.0.0-alpha.6'
def material_dialog_version = "3.3.0"
implementation "com.afollestad.material-dialogs:core:$material_dialog_version"
diff --git a/app/src/main/assets/retro-changelog.html b/app/src/main/assets/retro-changelog.html
index 44e64dec7..40bcf73be 100644
--- a/app/src/main/assets/retro-changelog.html
+++ b/app/src/main/assets/retro-changelog.html
@@ -62,6 +62,22 @@
+
+
March 13, 2022
+
v5.7.3
+
What's New
+
+ - Added adaptive color in Material now playing theme
+ - Added an option to share crash report
+ - Added options to clear, pause history
+
+
Fixed
+
+ - Adapt Wallpaper accent for better readability
+ - Optimized search
+ - Made sleep timer precise
+
+
February 13, 2022
v5.7.2Beta
diff --git a/app/src/main/java/code/name/monkey/retromusic/Constants.kt b/app/src/main/java/code/name/monkey/retromusic/Constants.kt
index 13574349a..93012f84e 100644
--- a/app/src/main/java/code/name/monkey/retromusic/Constants.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/Constants.kt
@@ -163,4 +163,5 @@ const val APPBAR_MODE = "appbar_mode"
const val WALLPAPER_ACCENT = "wallpaper_accent"
const val SCREEN_ON_LYRICS = "screen_on_lyrics"
const val CIRCLE_PLAY_BUTTON = "circle_play_button"
-const val SWIPE_ANYWHERE_NOW_PLAYING = "swipe_anywhere_now_playing"
\ No newline at end of file
+const val SWIPE_ANYWHERE_NOW_PLAYING = "swipe_anywhere_now_playing"
+const val PAUSE_HISTORY = "pause_history"
\ No newline at end of file
diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsMusicServiceActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsMusicServiceActivity.kt
index 4c70a87bd..1e05c367f 100644
--- a/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsMusicServiceActivity.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsMusicServiceActivity.kt
@@ -31,6 +31,7 @@ import code.name.monkey.retromusic.service.MusicService.Companion.PLAY_STATE_CHA
import code.name.monkey.retromusic.service.MusicService.Companion.QUEUE_CHANGED
import code.name.monkey.retromusic.service.MusicService.Companion.REPEAT_MODE_CHANGED
import code.name.monkey.retromusic.service.MusicService.Companion.SHUFFLE_MODE_CHANGED
+import code.name.monkey.retromusic.util.PreferenceUtil
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import org.koin.android.ext.android.inject
@@ -123,7 +124,10 @@ abstract class AbsMusicServiceActivity : AbsBaseActivity(), IMusicServiceEventLi
if (entity != null) {
repository.updateHistorySong(MusicPlayerRemote.currentSong)
} else {
- repository.addSongToHistory(MusicPlayerRemote.currentSong)
+ // Check whether pause history option is ON or OFF
+ if (!PreferenceUtil.pauseHistory) {
+ repository.addSongToHistory(MusicPlayerRemote.currentSong)
+ }
}
val songs = repository.checkSongExistInPlayCount(MusicPlayerRemote.currentSong.id)
if (songs.isNotEmpty()) {
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/LibraryViewModel.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/LibraryViewModel.kt
index b462da4aa..016e4bc0a 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/LibraryViewModel.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/LibraryViewModel.kt
@@ -35,7 +35,7 @@ import kotlinx.coroutines.withContext
import java.io.File
class LibraryViewModel(
- private val repository: RealRepository
+ private val repository: RealRepository,
) : ViewModel(), IMusicServiceEventListener {
private val _paletteColor = MutableLiveData
()
@@ -50,6 +50,7 @@ class LibraryViewModel(
private val searchResults = MutableLiveData>()
private val fabMargin = MutableLiveData(0)
private val songHistory = MutableLiveData>()
+ private var previousSongHistory = ArrayList()
val paletteColor: LiveData = _paletteColor
init {
@@ -143,12 +144,11 @@ class LibraryViewModel(
suggestions.postValue(repository.suggestions())
}
- fun search(query: String?, filter: Filter) {
+ fun search(query: String?, filter: Filter) =
viewModelScope.launch(IO) {
- val result = repository.search(query, filter)
+ val result =repository.search(query, filter)
searchResults.postValue(result)
}
- }
fun forceReload(reloadType: ReloadType) = viewModelScope.launch(IO) {
when (reloadType) {
@@ -342,11 +342,27 @@ class LibraryViewModel(
fun clearHistory() {
viewModelScope.launch(IO) {
+ previousSongHistory = repository.historySong() as ArrayList
+
repository.clearSongHistory()
}
songHistory.value = emptyList()
}
+
+ fun restoreHistory() {
+ viewModelScope.launch(IO) {
+ if (previousSongHistory.isNotEmpty()) {
+ val history = ArrayList()
+ for (song in previousSongHistory) {
+ repository.addSongToHistory(song.toSong())
+ history.add(song.toSong())
+ }
+ songHistory.postValue(history)
+ }
+ }
+ }
+
fun favorites() = repository.favorites()
fun clearSearchResult() {
@@ -363,6 +379,14 @@ class LibraryViewModel(
createPlaylist(PlaylistEntity(playlistName = playlistName))
insertSongs(songs.map { it.toSongEntity(playlistId) })
forceReload(Playlists)
+ withContext(Main) {
+ Toast.makeText(
+ App.getContext(),
+ App.getContext()
+ .getString(R.string.playlist_created_sucessfully, playlistName),
+ Toast.LENGTH_SHORT
+ ).show()
+ }
} else {
val playlist = playlists.firstOrNull()
if (playlist != null) {
@@ -370,21 +394,13 @@ class LibraryViewModel(
it.toSongEntity(playListId = playlist.playListId)
})
}
- withContext(Main) {
- Toast.makeText(
- App.getContext(),
- "Playlist already exists",
- Toast.LENGTH_SHORT
- ).show()
- if (songs.isNotEmpty()) {
- Toast.makeText(
- App.getContext(),
- "Adding songs to $playlistName",
- Toast.LENGTH_SHORT
- ).show()
- }
- }
-
+ }
+ withContext(Main) {
+ Toast.makeText(App.getContext(), App.getContext().getString(
+ R.string.added_song_count_to_playlist,
+ songs.size,
+ playlistName
+ ), Toast.LENGTH_SHORT).show()
}
}
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumDetailsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumDetailsFragment.kt
index 8698abc84..27d603d02 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumDetailsFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumDetailsFragment.kt
@@ -80,6 +80,7 @@ import kotlinx.coroutines.withContext
import org.koin.android.ext.android.get
import org.koin.androidx.viewmodel.ext.android.viewModel
import org.koin.core.parameter.parametersOf
+import java.text.Collator
class AlbumDetailsFragment : AbsMainActivityFragment(R.layout.fragment_album_details),
IAlbumClickListener, ICabHolder {
@@ -437,15 +438,13 @@ class AlbumDetailsFragment : AbsMainActivityFragment(R.layout.fragment_album_det
o2.trackNumber
)
}
- SONG_A_Z -> album.songs.sortedWith { o1, o2 ->
- o1.title.compareTo(
- o2.title
- )
+ SONG_A_Z -> {
+ val collator = Collator.getInstance()
+ album.songs.sortedWith { o1, o2 -> collator.compare(o1.title, o2.title) }
}
- SONG_Z_A -> album.songs.sortedWith { o1, o2 ->
- o2.title.compareTo(
- o1.title
- )
+ SONG_Z_A -> {
+ val collator = Collator.getInstance()
+ album.songs.sortedWith { o1, o2 -> collator.compare(o2.title, o1.title) }
}
SONG_DURATION -> album.songs.sortedWith { o1, o2 ->
o1.duration.compareTo(
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/home/HomeFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/home/HomeFragment.kt
index 9c5b04117..944a0ce9d 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/home/HomeFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/home/HomeFragment.kt
@@ -187,7 +187,7 @@ class HomeFragment :
}
GlideApp.with(requireActivity())
.load(RetroGlideExtension.getUserModel())
- .userProfileOptions(RetroGlideExtension.getUserModel())
+ .userProfileOptions(RetroGlideExtension.getUserModel(), requireContext())
.into(binding.userImage)
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/other/DetailListFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/other/DetailListFragment.kt
index 70cf65df7..61600960c 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/other/DetailListFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/other/DetailListFragment.kt
@@ -14,6 +14,7 @@
*/
package code.name.monkey.retromusic.fragments.other
+import android.graphics.Color
import android.os.Bundle
import android.view.Menu
import android.view.MenuInflater
@@ -22,6 +23,7 @@ import android.view.View
import androidx.activity.addCallback
import androidx.core.os.bundleOf
import androidx.core.view.doOnPreDraw
+import androidx.core.view.isVisible
import androidx.navigation.fragment.FragmentNavigatorExtras
import androidx.navigation.fragment.findNavController
import androidx.navigation.fragment.navArgs
@@ -51,8 +53,10 @@ import com.afollestad.materialcab.attached.destroy
import com.afollestad.materialcab.attached.isActive
import com.afollestad.materialcab.createCab
import com.google.android.material.shape.MaterialShapeDrawable
+import com.google.android.material.snackbar.Snackbar
import com.google.android.material.transition.MaterialSharedAxis
+
class DetailListFragment : AbsMainActivityFragment(R.layout.fragment_playlist_detail),
IArtistClickListener, IAlbumClickListener, ICabHolder {
private val args by navArgs()
@@ -162,9 +166,12 @@ class DetailListFragment : AbsMainActivityFragment(R.layout.fragment_playlist_de
adapter = songAdapter
layoutManager = linearLayoutManager()
}
+
libraryViewModel.observableHistorySongs().observe(viewLifecycleOwner) {
songAdapter.swapDataSet(it)
+ binding.empty.isVisible = it.isEmpty()
}
+
}
private fun loadFavorite() {
@@ -236,6 +243,7 @@ class DetailListFragment : AbsMainActivityFragment(R.layout.fragment_playlist_de
return if (RetroUtil.isLandscape()) 4 else 2
}
+
override fun onArtist(artistId: Long, view: View) {
findNavController().navigate(
R.id.artistDetailsFragment,
@@ -305,11 +313,24 @@ class DetailListFragment : AbsMainActivityFragment(R.layout.fragment_playlist_de
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
- R.id.action_clear_history -> libraryViewModel.clearHistory()
- /*
- TODO("Show a snackbar showing that history has been successfully
- cleared and that will have an undo button")
- */
+ R.id.action_clear_history -> {
+ if (binding.recyclerView.adapter?.itemCount!! > 0) {
+ libraryViewModel.clearHistory()
+
+ val snackBar =
+ Snackbar.make(binding.container,
+ getString(R.string.history_cleared),
+ Snackbar.LENGTH_LONG)
+ .setAction(getString(R.string.history_undo_button)) {
+ libraryViewModel.restoreHistory()
+ }
+ .setActionTextColor(Color.YELLOW)
+ val snackBarView = snackBar.view
+ snackBarView.translationY =
+ -(resources.getDimension(R.dimen.mini_player_height))
+ snackBar.show()
+ }
+ }
}
return false
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/other/UserInfoFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/other/UserInfoFragment.kt
index d92b8681e..14abd5910 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/other/UserInfoFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/other/UserInfoFragment.kt
@@ -167,7 +167,7 @@ class UserInfoFragment : Fragment() {
}
GlideApp.with(this)
.load(RetroGlideExtension.getUserModel())
- .userProfileOptions(RetroGlideExtension.getUserModel())
+ .userProfileOptions(RetroGlideExtension.getUserModel(), requireContext())
.into(binding.userImage)
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/material/MaterialFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/material/MaterialFragment.kt
index a7eac74f9..b57654fad 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/material/MaterialFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/material/MaterialFragment.kt
@@ -14,6 +14,9 @@
*/
package code.name.monkey.retromusic.fragments.player.material
+import android.animation.ArgbEvaluator
+import android.animation.ValueAnimator
+import android.graphics.drawable.GradientDrawable
import android.os.Bundle
import android.view.View
import androidx.appcompat.widget.Toolbar
@@ -22,12 +25,16 @@ import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.databinding.FragmentMaterialBinding
import code.name.monkey.retromusic.extensions.colorControlNormal
import code.name.monkey.retromusic.extensions.drawAboveSystemBars
+import code.name.monkey.retromusic.extensions.surfaceColor
import code.name.monkey.retromusic.fragments.base.AbsPlayerFragment
import code.name.monkey.retromusic.fragments.player.PlayerAlbumCoverFragment
import code.name.monkey.retromusic.fragments.player.normal.PlayerFragment
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.model.Song
+import code.name.monkey.retromusic.util.PreferenceUtil
+import code.name.monkey.retromusic.util.ViewUtil
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
+import code.name.monkey.retromusic.views.DrawableGradient
/**
* @author Hemanth S (h4h13).
@@ -48,6 +55,33 @@ class MaterialFragment : AbsPlayerFragment(R.layout.fragment_material) {
private var _binding: FragmentMaterialBinding? = null
private val binding get() = _binding!!
+ private var valueAnimator: ValueAnimator? = null
+
+ private fun colorize(i: Int) {
+ if (valueAnimator != null) {
+ valueAnimator?.cancel()
+ }
+
+ valueAnimator = ValueAnimator.ofObject(
+ ArgbEvaluator(),
+ surfaceColor(),
+ i
+ )
+ valueAnimator?.addUpdateListener { animation ->
+ if (isAdded) {
+ val drawable = DrawableGradient(
+ GradientDrawable.Orientation.TOP_BOTTOM,
+ intArrayOf(
+ animation.animatedValue as Int,
+ surfaceColor()
+ ), 0
+ )
+ binding.colorGradientBackground.background = drawable
+ }
+ }
+ valueAnimator?.setDuration(ViewUtil.RETRO_MUSIC_ANIM_TIME.toLong())?.start()
+ }
+
override fun onShow() {
playbackControlsFragment.show()
@@ -74,6 +108,10 @@ class MaterialFragment : AbsPlayerFragment(R.layout.fragment_material) {
colorControlNormal(),
requireActivity()
)
+
+ if (PreferenceUtil.isAdaptiveColor) {
+ colorize(color.backgroundColor)
+ }
}
override fun toggleFavorite(song: Song) {
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/search/SearchFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/search/SearchFragment.kt
index 618afee30..50c922662 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/search/SearchFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/search/SearchFragment.kt
@@ -46,6 +46,7 @@ import com.google.android.material.chip.ChipGroup
import com.google.android.material.shape.MaterialShapeDrawable
import com.google.android.material.textfield.TextInputEditText
import com.google.android.material.transition.MaterialFadeThrough
+import kotlinx.coroutines.Job
import net.yslibrary.android.keyboardvisibilityevent.KeyboardVisibilityEvent
import java.util.*
@@ -63,6 +64,8 @@ class SearchFragment : AbsMainActivityFragment(R.layout.fragment_search), TextWa
private lateinit var searchAdapter: SearchAdapter
private var query: String? = null
+ private var job: Job? = null
+
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
enterTransition = MaterialFadeThrough().addTarget(view)
@@ -184,7 +187,8 @@ class SearchFragment : AbsMainActivityFragment(R.layout.fragment_search), TextWa
binding.voiceSearch.isGone = query.isNotEmpty()
binding.clearText.isVisible = query.isNotEmpty()
val filter = getFilter()
- libraryViewModel.search(query, filter)
+ job?.cancel()
+ job = libraryViewModel.search(query, filter)
}
private fun getFilter(): Filter {
diff --git a/app/src/main/java/code/name/monkey/retromusic/glide/RetroGlideExtension.kt b/app/src/main/java/code/name/monkey/retromusic/glide/RetroGlideExtension.kt
index 127044e92..8602de58c 100644
--- a/app/src/main/java/code/name/monkey/retromusic/glide/RetroGlideExtension.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/glide/RetroGlideExtension.kt
@@ -1,5 +1,6 @@
package code.name.monkey.retromusic.glide
+import android.content.Context
import android.graphics.drawable.Drawable
import code.name.monkey.appthemehelper.ThemeStore.Companion.accentColor
import code.name.monkey.appthemehelper.util.TintHelper
@@ -150,10 +151,11 @@ object RetroGlideExtension {
@GlideOption
fun userProfileOptions(
baseRequestOptions: BaseRequestOptions<*>,
- file: File
+ file: File,
+ context: Context
): BaseRequestOptions<*> {
return baseRequestOptions.diskCacheStrategy(DEFAULT_DISK_CACHE_STRATEGY)
- .error(getErrorUserProfile())
+ .error(getErrorUserProfile(context))
.signature(createSignature(file))
}
@@ -201,11 +203,11 @@ object RetroGlideExtension {
return File(dir, USER_BANNER)
}
- private fun getErrorUserProfile(): Drawable {
+ private fun getErrorUserProfile(context: Context): Drawable {
return TintHelper.createTintedDrawable(
getContext(),
R.drawable.ic_account,
- accentColor(getContext())
+ accentColor(context)
)
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/helper/WallpaperAccentManager.kt b/app/src/main/java/code/name/monkey/retromusic/helper/WallpaperAccentManager.kt
index 62191bdd3..871904cef 100644
--- a/app/src/main/java/code/name/monkey/retromusic/helper/WallpaperAccentManager.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/helper/WallpaperAccentManager.kt
@@ -43,9 +43,7 @@ class WallpaperAccentManager(val context: Context) {
.getWallpaperColors(WallpaperManager.FLAG_SYSTEM)
if (colors != null) {
val primaryColor = colors.primaryColor.toArgb()
- if (primaryColor != ThemeStore.wallpaperColor(context)) {
- ThemeStore.editTheme(context).wallpaperColor(primaryColor).commit()
- }
+ ThemeStore.editTheme(context).wallpaperColor(context, primaryColor).commit()
}
}
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/model/Artist.kt b/app/src/main/java/code/name/monkey/retromusic/model/Artist.kt
index c9d7e42dc..e82aed2d8 100644
--- a/app/src/main/java/code/name/monkey/retromusic/model/Artist.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/model/Artist.kt
@@ -17,6 +17,7 @@ package code.name.monkey.retromusic.model
import code.name.monkey.retromusic.helper.SortOrder
import code.name.monkey.retromusic.util.MusicUtil
import code.name.monkey.retromusic.util.PreferenceUtil
+import java.text.Collator
data class Artist(
val id: Long,
@@ -60,37 +61,34 @@ data class Artist(
get() = albums.flatMap { it.songs }
val sortedSongs: List
- get() = songs.sortedWith(
- when (PreferenceUtil.artistDetailSongSortOrder) {
- SortOrder.ArtistSongSortOrder.SONG_A_Z -> { o1, o2 ->
- o1.title.compareTo(
- o2.title
- )
- }
- SortOrder.ArtistSongSortOrder.SONG_Z_A -> { o1, o2 ->
- o2.title.compareTo(
- o1.title
- )
- }
- SortOrder.ArtistSongSortOrder.SONG_ALBUM -> { o1, o2 ->
- o1.albumName.compareTo(
- o2.albumName
- )
- }
- SortOrder.ArtistSongSortOrder.SONG_YEAR -> { o1, o2 ->
- o2.year.compareTo(
- o1.year
- )
- }
- SortOrder.ArtistSongSortOrder.SONG_DURATION -> { o1, o2 ->
- o1.duration.compareTo(
- o2.duration
- )
- }
- else -> {
- throw IllegalArgumentException("invalid ${PreferenceUtil.artistDetailSongSortOrder}")
- }
- })
+ get() {
+ val collator = Collator.getInstance()
+ return songs.sortedWith(
+ when (PreferenceUtil.artistDetailSongSortOrder) {
+ SortOrder.ArtistSongSortOrder.SONG_A_Z -> { o1, o2 ->
+ collator.compare(o1.title, o2.title)
+ }
+ SortOrder.ArtistSongSortOrder.SONG_Z_A -> { o1, o2 ->
+ collator.compare(o2.title, o1.title)
+ }
+ SortOrder.ArtistSongSortOrder.SONG_ALBUM -> { o1, o2 ->
+ collator.compare(o1.albumName, o2.albumName)
+ }
+ SortOrder.ArtistSongSortOrder.SONG_YEAR -> { o1, o2 ->
+ o2.year.compareTo(
+ o1.year
+ )
+ }
+ SortOrder.ArtistSongSortOrder.SONG_DURATION -> { o1, o2 ->
+ o1.duration.compareTo(
+ o2.duration
+ )
+ }
+ else -> {
+ throw IllegalArgumentException("invalid ${PreferenceUtil.artistDetailSongSortOrder}")
+ }
+ })
+ }
fun safeGetFirstAlbum(): Album {
return albums.firstOrNull() ?: Album.empty
diff --git a/app/src/main/java/code/name/monkey/retromusic/repository/AlbumRepository.kt b/app/src/main/java/code/name/monkey/retromusic/repository/AlbumRepository.kt
index ce0232069..52e62db27 100644
--- a/app/src/main/java/code/name/monkey/retromusic/repository/AlbumRepository.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/repository/AlbumRepository.kt
@@ -19,6 +19,7 @@ import code.name.monkey.retromusic.helper.SortOrder
import code.name.monkey.retromusic.model.Album
import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.util.PreferenceUtil
+import java.text.Collator
/**
@@ -65,8 +66,7 @@ class RealAlbumRepository(private val songRepository: RealSongRepository) :
)
val songs = songRepository.songs(cursor)
val album = Album(albumId, songs)
- sortAlbumSongs(album)
- return album
+ return sortAlbumSongs(album)
}
// We don't need sorted list of songs (with sortAlbumSongs())
@@ -74,23 +74,36 @@ class RealAlbumRepository(private val songRepository: RealSongRepository) :
fun splitIntoAlbums(
songs: List
): List {
- return if (PreferenceUtil.albumSortOrder != SortOrder.AlbumSortOrder.ALBUM_NUMBER_OF_SONGS) songs.groupBy { it.albumId }
- .map { Album(it.key, it.value) }
- // We can't sort Album with the help of MediaStore so a hack
- else songs.groupBy { it.albumId }.map { Album(it.key, it.value) }
- .sortedByDescending { it.songCount }
+ val grouped = songs.groupBy { it.albumId }.map { Album(it.key, it.value) }
+ val collator = Collator.getInstance()
+ return when (PreferenceUtil.albumSortOrder) {
+ SortOrder.AlbumSortOrder.ALBUM_A_Z -> {
+ grouped.sortedWith { a1, a2 -> collator.compare(a1.title, a2.title) }
+ }
+ SortOrder.AlbumSortOrder.ALBUM_Z_A -> {
+ grouped.sortedWith { a1, a2 -> collator.compare(a2.title, a1.title) }
+ }
+ SortOrder.AlbumSortOrder.ALBUM_ARTIST -> {
+ grouped.sortedWith { a1, a2 -> collator.compare(a1.albumArtist, a2.albumArtist) }
+ }
+ SortOrder.AlbumSortOrder.ALBUM_NUMBER_OF_SONGS -> {
+ grouped.sortedByDescending { it.songCount }
+ }
+ else -> grouped
+ }
}
private fun sortAlbumSongs(album: Album): Album {
+ val collator = Collator.getInstance()
val songs = when (PreferenceUtil.albumDetailSongSortOrder) {
SortOrder.AlbumSongSortOrder.SONG_TRACK_LIST -> album.songs.sortedWith { o1, o2 ->
o1.trackNumber.compareTo(o2.trackNumber)
}
- SortOrder.AlbumSongSortOrder.SONG_A_Z -> album.songs.sortedWith { o1, o2 ->
- o1.title.compareTo(o2.title)
+ SortOrder.AlbumSongSortOrder.SONG_A_Z -> {
+ album.songs.sortedWith { o1, o2 -> collator.compare(o1.title, o2.title) }
}
- SortOrder.AlbumSongSortOrder.SONG_Z_A -> album.songs.sortedWith { o1, o2 ->
- o2.title.compareTo(o1.title)
+ SortOrder.AlbumSongSortOrder.SONG_Z_A -> {
+ album.songs.sortedWith { o1, o2 -> collator.compare(o2.title, o1.title) }
}
SortOrder.AlbumSongSortOrder.SONG_DURATION -> album.songs.sortedWith { o1, o2 ->
o1.duration.compareTo(o2.duration)
diff --git a/app/src/main/java/code/name/monkey/retromusic/repository/ArtistRepository.kt b/app/src/main/java/code/name/monkey/retromusic/repository/ArtistRepository.kt
index 9ac1d67b6..8b11976ff 100644
--- a/app/src/main/java/code/name/monkey/retromusic/repository/ArtistRepository.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/repository/ArtistRepository.kt
@@ -20,6 +20,7 @@ import code.name.monkey.retromusic.helper.SortOrder
import code.name.monkey.retromusic.model.Album
import code.name.monkey.retromusic.model.Artist
import code.name.monkey.retromusic.util.PreferenceUtil
+import java.text.Collator
interface ArtistRepository {
fun artists(): List
@@ -103,7 +104,8 @@ class RealArtistRepository(
getSongLoaderSortOrder()
)
)
- return splitIntoArtists(albumRepository.splitIntoAlbums(songs))
+ val artists = splitIntoArtists(albumRepository.splitIntoAlbums(songs))
+ return sortArtists(artists)
}
override fun albumArtists(): List {
@@ -115,7 +117,8 @@ class RealArtistRepository(
if (PreferenceUtil.artistSortOrder == SortOrder.ArtistSortOrder.ARTIST_A_Z) "" else " DESC"
)
)
- return splitIntoAlbumArtists(albumRepository.splitIntoAlbums(songs))
+ val artists = splitIntoAlbumArtists(albumRepository.splitIntoAlbums(songs))
+ return sortArtists(artists)
}
override fun albumArtists(query: String): List {
@@ -126,7 +129,8 @@ class RealArtistRepository(
getSongLoaderSortOrder()
)
)
- return splitIntoAlbumArtists(albumRepository.splitIntoAlbums(songs))
+ val artists = splitIntoAlbumArtists(albumRepository.splitIntoAlbums(songs))
+ return sortArtists(artists)
}
override fun artists(query: String): List {
@@ -137,7 +141,8 @@ class RealArtistRepository(
getSongLoaderSortOrder()
)
)
- return splitIntoArtists(albumRepository.splitIntoAlbums(songs))
+ val artists = splitIntoArtists(albumRepository.splitIntoAlbums(songs))
+ return sortArtists(artists)
}
@@ -165,4 +170,17 @@ class RealArtistRepository(
return albums.groupBy { it.artistId }
.map { Artist(it.key, it.value) }
}
+
+ private fun sortArtists(artists: List): List {
+ val collator = Collator.getInstance()
+ return when (PreferenceUtil.artistSortOrder) {
+ SortOrder.ArtistSortOrder.ARTIST_A_Z -> {
+ artists.sortedWith { a1, a2 -> collator.compare(a1.name, a2.name) }
+ }
+ SortOrder.ArtistSortOrder.ARTIST_Z_A -> {
+ artists.sortedWith { a1, a2 -> collator.compare(a2.name, a1.name) }
+ }
+ else -> artists
+ }
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/code/name/monkey/retromusic/repository/SongRepository.kt b/app/src/main/java/code/name/monkey/retromusic/repository/SongRepository.kt
index bfbfe62ab..540cb51fd 100644
--- a/app/src/main/java/code/name/monkey/retromusic/repository/SongRepository.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/repository/SongRepository.kt
@@ -28,9 +28,11 @@ import code.name.monkey.retromusic.extensions.getInt
import code.name.monkey.retromusic.extensions.getLong
import code.name.monkey.retromusic.extensions.getString
import code.name.monkey.retromusic.extensions.getStringOrNull
+import code.name.monkey.retromusic.helper.SortOrder
import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.providers.BlacklistStore
import code.name.monkey.retromusic.util.PreferenceUtil
+import java.text.Collator
/**
* Created by hemanths on 10/08/17.
@@ -66,7 +68,28 @@ class RealSongRepository(private val context: Context) : SongRepository {
} while (cursor.moveToNext())
}
cursor?.close()
- return songs
+ val collator = Collator.getInstance()
+ return when (PreferenceUtil.songSortOrder) {
+ SortOrder.SongSortOrder.SONG_A_Z -> {
+ songs.sortedWith{ s1, s2 -> collator.compare(s1.title, s2.title) }
+ }
+ SortOrder.SongSortOrder.SONG_Z_A -> {
+ songs.sortedWith{ s1, s2 -> collator.compare(s2.title, s1.title) }
+ }
+ SortOrder.SongSortOrder.SONG_ALBUM -> {
+ songs.sortedWith{ s1, s2 -> collator.compare(s1.albumName, s2.albumName) }
+ }
+ SortOrder.SongSortOrder.SONG_ALBUM_ARTIST -> {
+ songs.sortedWith{ s1, s2 -> collator.compare(s1.albumArtist, s2.albumArtist) }
+ }
+ SortOrder.SongSortOrder.SONG_ARTIST -> {
+ songs.sortedWith{ s1, s2 -> collator.compare(s1.artistName, s2.artistName) }
+ }
+ SortOrder.SongSortOrder.COMPOSER -> {
+ songs.sortedWith{ s1, s2 -> collator.compare(s1.composer, s2.composer) }
+ }
+ else -> songs
+ }
}
override fun song(cursor: Cursor?): Song {
diff --git a/app/src/main/java/code/name/monkey/retromusic/service/notification/PlayingNotificationImpl24.kt b/app/src/main/java/code/name/monkey/retromusic/service/notification/PlayingNotificationImpl24.kt
index 16d925a88..7a0ceba9f 100644
--- a/app/src/main/java/code/name/monkey/retromusic/service/notification/PlayingNotificationImpl24.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/service/notification/PlayingNotificationImpl24.kt
@@ -125,8 +125,14 @@ class PlayingNotificationImpl24(
}
override fun updateMetadata(song: Song, onUpdate: () -> Unit) {
- setContentTitle(song.title)
- setContentText(
+ setContentTitle(
+ HtmlCompat.fromHtml(
+ "" + song.title + "",
+ HtmlCompat.FROM_HTML_MODE_LEGACY
+ )
+ )
+ setContentText(song.artistName)
+ setSubText(
HtmlCompat.fromHtml(
"" + song.albumName + "",
HtmlCompat.FROM_HTML_MODE_LEGACY
@@ -169,10 +175,12 @@ class PlayingNotificationImpl24(
}
override fun onLoadCleared(placeholder: Drawable?) {
- setLargeIcon(BitmapFactory.decodeResource(
- context.resources,
- R.drawable.default_audio_art
- ))
+ setLargeIcon(
+ BitmapFactory.decodeResource(
+ context.resources,
+ R.drawable.default_audio_art
+ )
+ )
onUpdate()
}
})
diff --git a/app/src/main/java/code/name/monkey/retromusic/util/PreferenceUtil.kt b/app/src/main/java/code/name/monkey/retromusic/util/PreferenceUtil.kt
index 990f611e9..cb46ec2da 100644
--- a/app/src/main/java/code/name/monkey/retromusic/util/PreferenceUtil.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/util/PreferenceUtil.kt
@@ -637,6 +637,12 @@ object PreferenceUtil {
true
)
+ val pauseHistory: Boolean
+ get() = sharedPreferences.getBoolean(
+ PAUSE_HISTORY,
+ false
+ )
+
var audioFadeDuration
get() = sharedPreferences
.getInt(AUDIO_FADE_DURATION, 0)
diff --git a/app/src/main/java/code/name/monkey/retromusic/util/RetroUtil.java b/app/src/main/java/code/name/monkey/retromusic/util/RetroUtil.java
index b51c1343c..8005ab2b4 100644
--- a/app/src/main/java/code/name/monkey/retromusic/util/RetroUtil.java
+++ b/app/src/main/java/code/name/monkey/retromusic/util/RetroUtil.java
@@ -49,7 +49,6 @@ import java.util.Collections;
import java.util.List;
import code.name.monkey.appthemehelper.util.TintHelper;
-import code.name.monkey.appthemehelper.util.VersionUtils;
import code.name.monkey.retromusic.App;
public class RetroUtil {
diff --git a/app/src/main/java/code/name/monkey/retromusic/util/RingtoneManager.kt b/app/src/main/java/code/name/monkey/retromusic/util/RingtoneManager.kt
index fb58d4fa8..234bb035f 100644
--- a/app/src/main/java/code/name/monkey/retromusic/util/RingtoneManager.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/util/RingtoneManager.kt
@@ -17,12 +17,10 @@ package code.name.monkey.retromusic.util
import android.content.Context
import android.content.Intent
import android.net.Uri
-import android.os.Build
import android.provider.BaseColumns
import android.provider.MediaStore
import android.provider.Settings
import android.widget.Toast
-import androidx.annotation.RequiresApi
import code.name.monkey.appthemehelper.util.VersionUtils
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.model.Song
diff --git a/app/src/main/res/layout-land/fragment_material.xml b/app/src/main/res/layout-land/fragment_material.xml
index 454e14fb4..357ddd717 100644
--- a/app/src/main/res/layout-land/fragment_material.xml
+++ b/app/src/main/res/layout-land/fragment_material.xml
@@ -14,6 +14,15 @@
+
+
+
+
+
-
\ No newline at end of file
+
diff --git a/app/src/main/res/layout/list_item_color_view.xml b/app/src/main/res/layout/list_item_color_view.xml
index 7a5918260..44eb130fd 100644
--- a/app/src/main/res/layout/list_item_color_view.xml
+++ b/app/src/main/res/layout/list_item_color_view.xml
@@ -31,6 +31,8 @@
android:id="@android:id/icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
+ android:paddingStart="0dp"
+ android:paddingEnd="16dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:tint="?attr/colorControlNormal"
@@ -53,6 +55,8 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="2dp"
+ android:paddingStart="0dp"
+ android:paddingEnd="16dp"
android:textAppearance="@style/TextViewNormal"
android:textColor="?android:attr/textColorSecondary"
app:layout_constrainedWidth="true"
diff --git a/app/src/main/res/values-night-v27/styles.xml b/app/src/main/res/values-night-v27/styles.xml
index 1945d2ca8..66c2e3508 100644
--- a/app/src/main/res/values-night-v27/styles.xml
+++ b/app/src/main/res/values-night-v27/styles.xml
@@ -12,7 +12,7 @@
~ See the GNU General Public License for more details.
-->
-
+