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

+ +

Fixed

+ +
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. --> - +