From a81536ab9a39dfe63fc48f8b56ea6bd038b0380a Mon Sep 17 00:00:00 2001 From: h4h13 Date: Mon, 28 Jan 2019 16:15:51 +0530 Subject: [PATCH] Refactor --- .gitignore | 4 +- app/build.gradle | 6 +- app/src/main/assets/retro-changelog.html | 2 +- .../dialogs/DeletePlaylistDialog.kt | 31 ++-- .../retromusic/dialogs/DeleteSongsDialog.kt | 30 +-- .../dialogs/OptionsSheetDialogFragment.kt | 16 +- .../dialogs/RemoveFromPlaylistDialog.kt | 28 +-- .../dialogs/RenamePlaylistDialog.kt | 25 ++- .../retromusic/dialogs/SleepTimerDialog.kt | 46 +++-- .../retromusic/dialogs/SongShareDialog.kt | 43 +++-- .../monkey/retromusic/loaders/ArtistLoader.kt | 10 +- .../retromusic/loaders/PlaylistLoader.kt | 14 +- .../retromusic/loaders/PlaylistSongsLoader.kt | 1 - .../monkey/retromusic/loaders/SongLoader.kt | 28 +-- .../retromusic/model/AbsCustomPlaylist.java | 1 - .../name/monkey/retromusic/model/Album.kt | 10 +- .../name/monkey/retromusic/model/Artist.kt | 4 +- .../monkey/retromusic/model/Playlist.java | 2 +- .../monkey/retromusic/model/PlaylistSong.java | 2 - .../retromusic/model/lyrics/Lyrics.java | 4 +- .../model/smartplaylist/AbsSmartPlaylist.java | 2 +- .../model/smartplaylist/HistoryPlaylist.java | 3 +- .../smartplaylist/LastAddedPlaylist.java | 2 +- .../smartplaylist/MyTopTracksPlaylist.java | 2 +- .../smartplaylist/ShuffleAllPlaylist.java | 2 +- .../retromusic/mvp/contract/HomeContract.kt | 34 +--- .../retromusic/mvp/presenter/HomePresenter.kt | 108 +---------- .../retromusic/providers/BlacklistStore.java | 54 +----- .../retromusic/providers/RepositoryImpl.kt | 4 +- .../providers/interfaces/Repository.kt | 2 + .../ui/activities/AlbumDetailsActivity.kt | 2 +- .../ui/activities/ArtistDetailActivity.kt | 13 +- .../retromusic/ui/activities/MainActivity.kt | 4 +- .../ui/activities/PurchaseActivity.kt | 1 - .../ui/activities/base/AbsThemeActivity.kt | 3 +- .../retromusic/ui/adapter/HomeAdapter.kt | 24 +++ .../adapter/album/AlbumCoverPagerAdapter.kt | 1 - .../adapter/album/HorizontalAlbumAdapter.kt | 6 +- .../ui/adapter/playlist/PlaylistAdapter.kt | 63 ++++--- .../song/OrderablePlaylistSongAdapter.kt | 2 +- .../ui/adapter/song/PlayingQueueAdapter.kt | 2 +- .../ui/fragments/MiniPlayerFragment.kt | 2 +- .../AbsLibraryPagerRecyclerViewFragment.kt | 2 +- .../mainactivity/folders/FoldersFragment.java | 2 +- .../mainactivity/home/BannerHomeFragment.kt | 81 +-------- .../player/PlayerAlbumCoverFragment.kt | 4 +- .../player/adaptive/AdaptiveFragment.kt | 6 +- .../blur/BlurPlaybackControlsFragment.kt | 18 +- .../color/ColorPlaybackControlsFragment.kt | 3 +- .../flat/FlatPlaybackControlsFragment.kt | 3 +- .../full/FullPlaybackControlsFragment.kt | 7 +- .../normal/PlayerPlaybackControlsFragment.kt | 9 +- .../plain/PlainPlaybackControlsFragment.kt | 7 +- .../retromusic/util/NavigationUtil.java | 5 +- .../monkey/retromusic/util/RetroUtil.java | 20 -- .../name/monkey/retromusic/util/ViewUtil.kt | 25 +-- .../views/MetalRecyclerViewPager.kt | 13 +- .../main/res/drawable/color_progress_seek.xml | 21 +-- .../drawable/ic_text_fields_black_24dp.xml | 2 +- .../res/drawable/ic_time_lapse_white_24dp.xml | 12 +- app/src/main/res/drawable/promotional.webp | Bin 5664 -> 28738 bytes .../res/layout-land/fragment_banner_home.xml | 9 +- .../main/res/layout-land/fragment_home.xml | 6 +- app/src/main/res/layout-land/pager_item.xml | 2 +- .../fragment_banner_home.xml | 9 +- .../res/layout-xlarge-land/fragment_home.xml | 6 +- .../main/res/layout-xlarge/abs_playlists.xml | 5 +- .../layout-xlarge/activity_artist_content.xml | 25 +-- .../layout-xlarge/fragment_banner_home.xml | 9 +- .../main/res/layout-xlarge/fragment_home.xml | 6 +- .../layout-xlarge/fragment_mini_player.xml | 6 +- app/src/main/res/layout/abs_playlists.xml | 1 + .../res/layout/activity_artist_content.xml | 11 +- .../main/res/layout/activity_pro_version.xml | 171 ++++++++++++++++-- app/src/main/res/layout/dialog_delete.xml | 21 ++- app/src/main/res/layout/dialog_playlist.xml | 45 +++-- .../layout/dialog_remove_from_playlist.xml | 34 ++-- .../main/res/layout/dialog_sleep_timer.xml | 48 ++--- .../res/layout/fragment_adaptive_player.xml | 9 +- .../main/res/layout/fragment_album_cover.xml | 2 +- .../layout/fragment_album_material_cover.xml | 4 +- .../main/res/layout/fragment_banner_home.xml | 5 +- .../main/res/layout/fragment_main_options.xml | 53 +++++- .../main/res/layout/fragment_mini_player.xml | 6 +- .../fragment_player_playback_controls.xml | 1 - app/src/main/res/layout/image.xml | 2 +- app/src/main/res/layout/item_list.xml | 5 +- app/src/main/res/layout/item_song.xml | 28 ++- app/src/main/res/values/styles.xml | 2 + .../code/name/monkey/appthemehelper/ATH.kt | 6 +- .../appthemehelper/util/MaterialUtil.kt | 21 +-- build.gradle | 2 +- gradle.properties | 3 +- gradle/wrapper/gradle-wrapper.properties | 2 +- models/src/main/AndroidManifest.xml | 3 +- settings.gradle | 2 +- 96 files changed, 729 insertions(+), 724 deletions(-) diff --git a/.gitignore b/.gitignore index 1932b252..a9135c63 100644 --- a/.gitignore +++ b/.gitignore @@ -35,4 +35,6 @@ build/ #NDK obj/ -captures \ No newline at end of file +captures +app/normal/release/ +/models/ diff --git a/app/build.gradle b/app/build.gradle index 75e60e61..00485c9c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -32,8 +32,8 @@ android { vectorDrawables.useSupportLibrary = true applicationId "code.name.monkey.retromusic" - versionCode 281 - versionName '3.0.540' + versionCode 283 + versionName '3.0.550' multiDexEnabled true @@ -132,7 +132,7 @@ dependencies { implementation "com.squareup.retrofit2:retrofit:2.5.0" implementation "com.squareup.retrofit2:converter-gson:2.4.0" - implementation "com.squareup.retrofit2:adapter-rxjava2:2.4.0" + implementation "com.squareup.retrofit2:adapter-rxjava2:2.5.0" implementation "com.afollestad.material-dialogs:core:$materialDialog" implementation "com.afollestad.material-dialogs:commons:$materialDialog" diff --git a/app/src/main/assets/retro-changelog.html b/app/src/main/assets/retro-changelog.html index 3647f65b..e3161cb7 100644 --- a/app/src/main/assets/retro-changelog.html +++ b/app/src/main/assets/retro-changelog.html @@ -1 +1 @@ -

v3.0.540

Highlights

Changelog

If you see entire app white or dark or black select same theme in settings to fix

FAQ's

*If you face any UI related issues you clear app data and cache, if its not working try to uninstall and install again.

\ No newline at end of file +

v3.0.550

Highlights

Changelog

If you see entire app white or dark or black select same theme in settings to fix

FAQ's

*If you face any UI related issues you clear app data and cache, if its not working try to uninstall and install again.

\ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/dialogs/DeletePlaylistDialog.kt b/app/src/main/java/code/name/monkey/retromusic/dialogs/DeletePlaylistDialog.kt index b6dcdc40..2f9c4a32 100644 --- a/app/src/main/java/code/name/monkey/retromusic/dialogs/DeletePlaylistDialog.kt +++ b/app/src/main/java/code/name/monkey/retromusic/dialogs/DeletePlaylistDialog.kt @@ -5,12 +5,14 @@ import android.text.Html import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.core.content.ContextCompat import code.name.monkey.appthemehelper.ThemeStore +import code.name.monkey.appthemehelper.util.MaterialUtil import code.name.monkey.retromusic.R import code.name.monkey.retromusic.model.Playlist import code.name.monkey.retromusic.util.PlaylistsUtil import code.name.monkey.retromusic.views.RoundedBottomSheetDialogFragment -import kotlinx.android.synthetic.main.dialog_remove_from_playlist.* +import kotlinx.android.synthetic.main.dialog_delete.* import java.util.* @@ -18,7 +20,7 @@ class DeletePlaylistDialog : RoundedBottomSheetDialogFragment() { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.dialog_remove_from_playlist, container, false) + return inflater.inflate(R.layout.dialog_delete, container, false) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -32,17 +34,22 @@ class DeletePlaylistDialog : RoundedBottomSheetDialogFragment() { } else { Html.fromHtml(getString(R.string.delete_playlist_x, playlists[0].name)) } - bannerTitle.text = content - bannerTitle.setTextColor(ThemeStore.textColorPrimary(context!!)) + dialogTitle.text = content + dialogTitle.setTextColor(ThemeStore.textColorPrimary(context!!)) - actionRemove.setText(R.string.action_delete) - actionRemove.setTextColor(ThemeStore.textColorSecondary(context!!)) - actionCancel.setTextColor(ThemeStore.textColorSecondary(context!!)) - - actionCancel.setOnClickListener { dismiss() } - actionRemove.setOnClickListener { - PlaylistsUtil.deletePlaylists(activity!!, playlists) - dismiss() + actionDelete.apply { + setText(R.string.action_delete) + setOnClickListener { + PlaylistsUtil.deletePlaylists(context, playlists) + dismiss() + } + MaterialUtil.setTint(this) + icon = ContextCompat.getDrawable(context, R.drawable.ic_delete_white_24dp) + } + actionCancel.apply { + MaterialUtil.setTint(this, false) + setOnClickListener { dismiss() } + icon = ContextCompat.getDrawable(context, R.drawable.ic_close_white_24dp) } } diff --git a/app/src/main/java/code/name/monkey/retromusic/dialogs/DeleteSongsDialog.kt b/app/src/main/java/code/name/monkey/retromusic/dialogs/DeleteSongsDialog.kt index b8ac3b63..2c892747 100644 --- a/app/src/main/java/code/name/monkey/retromusic/dialogs/DeleteSongsDialog.kt +++ b/app/src/main/java/code/name/monkey/retromusic/dialogs/DeleteSongsDialog.kt @@ -5,6 +5,7 @@ import android.text.Html import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.core.content.ContextCompat import code.name.monkey.appthemehelper.ThemeStore import code.name.monkey.appthemehelper.util.MaterialUtil import code.name.monkey.retromusic.R @@ -19,28 +20,33 @@ class DeleteSongsDialog : RoundedBottomSheetDialogFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - title.setTextColor(ThemeStore.textColorPrimary(context!!)) - MaterialUtil.setTint(actionDelete) - MaterialUtil.setTint(actionCancel) - + dialogTitle.setTextColor(ThemeStore.textColorPrimary(context!!)) //noinspection unchecked,ConstantConditions val songs = arguments!!.getParcelableArrayList("songs") val content: CharSequence if (songs != null) { content = if (songs.size > 1) { - Html.fromHtml(getString(R.string.delete_x_songs, songs.size)) + getString(R.string.delete_x_songs, songs.size) } else { - Html.fromHtml(getString(R.string.delete_song_x, songs[0].title)) + getString(R.string.delete_song_x, songs[0].title) } - this.title.text = content + dialogTitle.text = content } - actionDelete.setOnClickListener { - if (songs != null) { - MusicUtil.deleteTracks(activity!!, songs) + actionDelete.apply { + setOnClickListener { + if (songs != null) { + MusicUtil.deleteTracks(activity!!, songs) + } + dismiss() } - dismiss() + MaterialUtil.setTint(this) + icon = ContextCompat.getDrawable(context, R.drawable.ic_delete_white_24dp) + } + actionCancel.apply { + MaterialUtil.setTint(this, false) + setOnClickListener { dismiss() } + icon = ContextCompat.getDrawable(context, R.drawable.ic_close_white_24dp) } - actionCancel.setOnClickListener { dismiss() } } diff --git a/app/src/main/java/code/name/monkey/retromusic/dialogs/OptionsSheetDialogFragment.kt b/app/src/main/java/code/name/monkey/retromusic/dialogs/OptionsSheetDialogFragment.kt index 22907334..2f9e4410 100644 --- a/app/src/main/java/code/name/monkey/retromusic/dialogs/OptionsSheetDialogFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/dialogs/OptionsSheetDialogFragment.kt @@ -58,11 +58,7 @@ class OptionsSheetDialogFragment : RoundedBottomSheetDialogFragment(), View.OnCl override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - actionBuyPro.let { - it.visibility = if (!App.isProVersion) View.VISIBLE else View.GONE - it.iconTint = ColorStateList.valueOf(ThemeStore.accentColor(it.context)) - it.setTextColor(ColorStateList.valueOf(ThemeStore.accentColor(it.context))) - } + text!!.setTextColor(ThemeStore.textColorSecondary(context!!)) titleWelcome!!.setTextColor(ThemeStore.textColorPrimary(context!!)) titleWelcome!!.text = String.format("%s %s!", timeOfTheDay, PreferenceUtil.getInstance().userName) @@ -76,8 +72,14 @@ class OptionsSheetDialogFragment : RoundedBottomSheetDialogFragment(), View.OnCl actionFolders.setOnClickListener(this) actionRate.setOnClickListener(this) actionShare.setOnClickListener(this) - actionBuyPro.setOnClickListener(this) actionBugReport.setOnClickListener(this) + buyProContainer.apply { + setCardBackgroundColor(ThemeStore.accentColor(context!!)) + visibility = if (!App.isProVersion) View.VISIBLE else View.GONE + setOnClickListener { + NavigationUtil.goToProVersion(context) + } + } } @@ -97,7 +99,7 @@ class OptionsSheetDialogFragment : RoundedBottomSheetDialogFragment(), View.OnCl R.id.actionShare -> shareApp() R.id.actionBugReport -> prepareBugReport() R.id.actionEqualizer -> NavigationUtil.openEqualizer(mainActivity) - R.id.actionBuyPro -> NavigationUtil.goToProVersion(mainActivity) + } dismiss() } diff --git a/app/src/main/java/code/name/monkey/retromusic/dialogs/RemoveFromPlaylistDialog.kt b/app/src/main/java/code/name/monkey/retromusic/dialogs/RemoveFromPlaylistDialog.kt index eeb3645a..6ed76a96 100644 --- a/app/src/main/java/code/name/monkey/retromusic/dialogs/RemoveFromPlaylistDialog.kt +++ b/app/src/main/java/code/name/monkey/retromusic/dialogs/RemoveFromPlaylistDialog.kt @@ -9,7 +9,6 @@ import android.view.ViewGroup import code.name.monkey.appthemehelper.ThemeStore import code.name.monkey.retromusic.R import code.name.monkey.retromusic.model.PlaylistSong -import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.util.PlaylistsUtil import code.name.monkey.retromusic.views.RoundedBottomSheetDialogFragment import kotlinx.android.synthetic.main.dialog_remove_from_playlist.* @@ -40,18 +39,23 @@ class RemoveFromPlaylistDialog : RoundedBottomSheetDialogFragment() { title = R.string.remove_song_from_playlist_title content = Html.fromHtml(getString(R.string.remove_song_x_from_playlist, songs[0].title)) } - actionRemove.text = content - bannerTitle.setText(title) - - bannerTitle.setTextColor(ThemeStore.textColorPrimary(context!!)) - actionRemove.setTextColor(ThemeStore.textColorSecondary(context!!)) - actionCancel.setTextColor(ThemeStore.textColorSecondary(context!!)) - - actionRemove.setOnClickListener { - PlaylistsUtil.removeFromPlaylist(activity!!, songs) - dismiss() + actionDelete.apply { + text = content + setTextColor(ThemeStore.textColorSecondary(context)) + setOnClickListener { + PlaylistsUtil.removeFromPlaylist(activity!!, songs) + dismiss() + } + } + bannerTitle.apply { + setText(title) + setTextColor(ThemeStore.textColorPrimary(context)) + } + + actionCancel.apply { + setTextColor(ThemeStore.textColorSecondary(context)) + setOnClickListener { dismiss() } } - actionCancel.setOnClickListener { dismiss() } } companion object { diff --git a/app/src/main/java/code/name/monkey/retromusic/dialogs/RenamePlaylistDialog.kt b/app/src/main/java/code/name/monkey/retromusic/dialogs/RenamePlaylistDialog.kt index 4f9c7183..36903859 100644 --- a/app/src/main/java/code/name/monkey/retromusic/dialogs/RenamePlaylistDialog.kt +++ b/app/src/main/java/code/name/monkey/retromusic/dialogs/RenamePlaylistDialog.kt @@ -5,6 +5,7 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.core.content.ContextCompat import code.name.monkey.appthemehelper.ThemeStore import code.name.monkey.appthemehelper.util.MaterialUtil import code.name.monkey.retromusic.R @@ -23,10 +24,8 @@ class RenamePlaylistDialog : RoundedBottomSheetDialogFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) val accentColor = ThemeStore.accentColor(context!!) - actionCreate.setText(R.string.action_rename) - MaterialUtil.setTint(actionCreate, true) - MaterialUtil.setTint(actionCancel, false) + MaterialUtil.setTint(actionNewPlaylistContainer, false) actionNewPlaylist.apply { @@ -41,12 +40,22 @@ class RenamePlaylistDialog : RoundedBottomSheetDialogFragment() { bannerTitle.setTextColor(ThemeStore.textColorPrimary(context!!)) bannerTitle.setText(R.string.rename_playlist_title) - actionCancel.setOnClickListener { dismiss() } - actionCreate.setOnClickListener { - if (actionNewPlaylist.toString().trim { it <= ' ' } != "") { - val playlistId = arguments!!.getLong("playlist_id") - PlaylistsUtil.renamePlaylist(context!!, playlistId, actionNewPlaylist.text!!.toString()) + actionCancel.apply { + MaterialUtil.setTint(actionCancel, false) + setOnClickListener { dismiss() } + icon = ContextCompat.getDrawable(context, R.drawable.ic_close_white_24dp) + } + + actionCreate.apply { + setText(R.string.action_rename) + setOnClickListener { + if (actionNewPlaylist.toString().trim { it <= ' ' } != "") { + val playlistId = arguments!!.getLong("playlist_id") + PlaylistsUtil.renamePlaylist(context!!, playlistId, actionNewPlaylist.text!!.toString()) + } } + MaterialUtil.setTint(this) + icon = ContextCompat.getDrawable(context, R.drawable.ic_edit_white_24dp) } } diff --git a/app/src/main/java/code/name/monkey/retromusic/dialogs/SleepTimerDialog.kt b/app/src/main/java/code/name/monkey/retromusic/dialogs/SleepTimerDialog.kt index 41bf91ff..266d6f0d 100755 --- a/app/src/main/java/code/name/monkey/retromusic/dialogs/SleepTimerDialog.kt +++ b/app/src/main/java/code/name/monkey/retromusic/dialogs/SleepTimerDialog.kt @@ -16,6 +16,7 @@ import android.view.View import android.view.ViewGroup import android.widget.SeekBar import android.widget.Toast +import androidx.core.content.ContextCompat import code.name.monkey.appthemehelper.ThemeStore import code.name.monkey.appthemehelper.util.MaterialUtil import code.name.monkey.retromusic.Constants.ACTION_QUIT @@ -45,7 +46,6 @@ class SleepTimerDialog : RoundedBottomSheetDialogFragment() { } override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.dialog_sleep_timer, container, false) } @@ -57,7 +57,7 @@ class SleepTimerDialog : RoundedBottomSheetDialogFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - MaterialUtil.setTint(actionSet, true) + MaterialUtil.setTint(actionCancel, false) title.setTextColor(ThemeStore.textColorPrimary(context!!)) @@ -88,26 +88,32 @@ class SleepTimerDialog : RoundedBottomSheetDialogFragment() { } }) - actionCancel.setOnClickListener { - - val previous = makeTimerPendingIntent(PendingIntent.FLAG_NO_CREATE) - if (previous != null) { - val am = activity!!.getSystemService(Context.ALARM_SERVICE) as AlarmManager - am.cancel(previous) - previous.cancel() - Toast.makeText(activity, activity!!.resources.getString(R.string.sleep_timer_canceled), Toast.LENGTH_SHORT).show() + actionCancel.apply { + icon = ContextCompat.getDrawable(context, R.drawable.ic_close_white_24dp) + setOnClickListener { + val previous = makeTimerPendingIntent(PendingIntent.FLAG_NO_CREATE) + if (previous != null) { + val am = activity!!.getSystemService(Context.ALARM_SERVICE) as AlarmManager + am.cancel(previous) + previous.cancel() + Toast.makeText(activity, activity!!.resources.getString(R.string.sleep_timer_canceled), Toast.LENGTH_SHORT).show() + } + dismiss() } - dismiss() } - actionSet.setOnClickListener { - val minutes = seekArcProgress - val pi = makeTimerPendingIntent(PendingIntent.FLAG_CANCEL_CURRENT) - val nextSleepTimerElapsedTime = SystemClock.elapsedRealtime() + minutes * 60 * 1000 - PreferenceUtil.getInstance().setNextSleepTimerElapsedRealtime(nextSleepTimerElapsedTime) - val am = activity!!.getSystemService(Context.ALARM_SERVICE) as AlarmManager - am.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, nextSleepTimerElapsedTime, pi) - Toast.makeText(activity, activity!!.resources.getString(R.string.sleep_timer_set, minutes), Toast.LENGTH_SHORT).show() - dismiss() + actionSet.apply { + icon = ContextCompat.getDrawable(context, R.drawable.ic_time_lapse_white_24dp) + MaterialUtil.setTint(actionSet) + setOnClickListener { + val minutes = seekArcProgress + val pi = makeTimerPendingIntent(PendingIntent.FLAG_CANCEL_CURRENT) + val nextSleepTimerElapsedTime = SystemClock.elapsedRealtime() + minutes * 60 * 1000 + PreferenceUtil.getInstance().setNextSleepTimerElapsedRealtime(nextSleepTimerElapsedTime) + val am = activity!!.getSystemService(Context.ALARM_SERVICE) as AlarmManager + am.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, nextSleepTimerElapsedTime, pi) + Toast.makeText(activity, activity!!.resources.getString(R.string.sleep_timer_set, minutes), Toast.LENGTH_SHORT).show() + dismiss() + } } } diff --git a/app/src/main/java/code/name/monkey/retromusic/dialogs/SongShareDialog.kt b/app/src/main/java/code/name/monkey/retromusic/dialogs/SongShareDialog.kt index 12107ec3..a4679a59 100644 --- a/app/src/main/java/code/name/monkey/retromusic/dialogs/SongShareDialog.kt +++ b/app/src/main/java/code/name/monkey/retromusic/dialogs/SongShareDialog.kt @@ -6,41 +6,50 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.core.content.ContextCompat import code.name.monkey.appthemehelper.ThemeStore +import code.name.monkey.appthemehelper.util.MaterialUtil import code.name.monkey.retromusic.R import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.util.MusicUtil import code.name.monkey.retromusic.views.RoundedBottomSheetDialogFragment -import kotlinx.android.synthetic.main.dialog_file_share.* +import kotlinx.android.synthetic.main.dialog_delete.* class SongShareDialog : RoundedBottomSheetDialogFragment() { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.dialog_file_share, container, false) + return inflater.inflate(R.layout.dialog_delete, container, false) } @SuppressLint("StringFormatInvalid") override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) val song = arguments!!.getParcelable("song")!! + dialogTitle.setTextColor(ThemeStore.textColorPrimary(context!!)) - audioText.text = getString(R.string.currently_listening_to_x_by_x, song.title, song.artistName) - audioFile.setTextColor(ThemeStore.textColorSecondary(context!!)) - audioText.setTextColor(ThemeStore.textColorSecondary(context!!)) - title.setTextColor(ThemeStore.textColorPrimary(context!!)) - - audioFile.setOnClickListener { - MusicUtil.createShareSongFileIntent(song, context) - dismiss() - } - audioText.setOnClickListener { - val currentlyListening = getString(R.string.currently_listening_to_x_by_x, song.title, song.artistName) - activity!!.startActivity(Intent.createChooser(Intent().setAction(Intent.ACTION_SEND) - .putExtra(Intent.EXTRA_TEXT, currentlyListening) - .setType("text/plain"), null)) - dismiss() + actionDelete.apply { + text = getString(R.string.currently_listening_to_x_by_x, song.title, song.artistName) + setTextColor(ThemeStore.textColorSecondary(context!!)) + setOnClickListener { + val currentlyListening = getString(R.string.currently_listening_to_x_by_x, song.title, song.artistName) + activity!!.startActivity(Intent.createChooser(Intent().setAction(Intent.ACTION_SEND) + .putExtra(Intent.EXTRA_TEXT, currentlyListening) + .setType("text/plain"), null)) + dismiss() + } + icon = ContextCompat.getDrawable(context, R.drawable.ic_text_fields_black_24dp) + MaterialUtil.setTint(this) } + actionCancel.apply { + setTextColor(ThemeStore.textColorSecondary(context!!)) + setOnClickListener { + MusicUtil.createShareSongFileIntent(song, context) + dismiss() + } + icon = ContextCompat.getDrawable(context, R.drawable.ic_share_white_24dp) + MaterialUtil.setTint(this, false) + } } companion object { diff --git a/app/src/main/java/code/name/monkey/retromusic/loaders/ArtistLoader.kt b/app/src/main/java/code/name/monkey/retromusic/loaders/ArtistLoader.kt index 96f778fe..70e479d0 100644 --- a/app/src/main/java/code/name/monkey/retromusic/loaders/ArtistLoader.kt +++ b/app/src/main/java/code/name/monkey/retromusic/loaders/ArtistLoader.kt @@ -2,13 +2,13 @@ package code.name.monkey.retromusic.loaders import android.content.Context import android.provider.MediaStore.Audio.AudioColumns - -import java.util.ArrayList - import code.name.monkey.retromusic.model.Album import code.name.monkey.retromusic.model.Artist +import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.util.PreferenceUtil import io.reactivex.Observable +import java.util.* +import kotlin.collections.ArrayList object ArtistLoader { private fun getSongLoaderSortOrder(): String { @@ -20,9 +20,7 @@ object ArtistLoader { fun getArtist(context: Context, artistId: Int): Observable { return Observable.create { e -> - SongLoader.getSongs(SongLoader.makeSongCursor( - context, - AudioColumns.ARTIST_ID + "=?", + SongLoader.getSongs(SongLoader.makeSongCursor(context, AudioColumns.ARTIST_ID + "=?", arrayOf(artistId.toString()), getSongLoaderSortOrder())) .subscribe { songs -> diff --git a/app/src/main/java/code/name/monkey/retromusic/loaders/PlaylistLoader.kt b/app/src/main/java/code/name/monkey/retromusic/loaders/PlaylistLoader.kt index 4602708f..6d7371e5 100644 --- a/app/src/main/java/code/name/monkey/retromusic/loaders/PlaylistLoader.kt +++ b/app/src/main/java/code/name/monkey/retromusic/loaders/PlaylistLoader.kt @@ -2,16 +2,13 @@ package code.name.monkey.retromusic.loaders import android.content.Context import android.database.Cursor -import android.net.Uri import android.provider.BaseColumns import android.provider.MediaStore import android.provider.MediaStore.Audio.PlaylistsColumns - +import code.name.monkey.retromusic.R import code.name.monkey.retromusic.model.Playlist - -import java.util.ArrayList - import io.reactivex.Observable +import java.util.* /** * Created by hemanths on 16/08/17. @@ -92,6 +89,13 @@ object PlaylistLoader { return getAllPlaylists(makePlaylistCursor(context, null, null)) } + fun getFavoritePlaylist(context: Context): Observable> { + return getAllPlaylists(makePlaylistCursor( + context, + PlaylistsColumns.NAME + "=?", + arrayOf(context.getString(R.string.favorites)))) + } + fun deletePlaylists(context: Context, playlistId: Long) { val localUri = MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI val localStringBuilder = StringBuilder() diff --git a/app/src/main/java/code/name/monkey/retromusic/loaders/PlaylistSongsLoader.kt b/app/src/main/java/code/name/monkey/retromusic/loaders/PlaylistSongsLoader.kt index 41aadb2c..9c69ffeb 100644 --- a/app/src/main/java/code/name/monkey/retromusic/loaders/PlaylistSongsLoader.kt +++ b/app/src/main/java/code/name/monkey/retromusic/loaders/PlaylistSongsLoader.kt @@ -81,6 +81,5 @@ object PlaylistSongsLoader { } catch (e: SecurityException) { return null } - } } diff --git a/app/src/main/java/code/name/monkey/retromusic/loaders/SongLoader.kt b/app/src/main/java/code/name/monkey/retromusic/loaders/SongLoader.kt index a96fcba9..26a4c9c5 100644 --- a/app/src/main/java/code/name/monkey/retromusic/loaders/SongLoader.kt +++ b/app/src/main/java/code/name/monkey/retromusic/loaders/SongLoader.kt @@ -58,7 +58,8 @@ object SongLoader { val artistId = cursor.getInt(9) val artistName = cursor.getString(10) - return Song(id, title, trackNumber, year, duration, data, dateModified, albumId, albumName?:"", + return Song(id, title, trackNumber, year, duration, data, dateModified, albumId, albumName + ?: "", artistId, artistName) } @@ -138,31 +139,10 @@ object SongLoader { .flatMap { val list = ArrayList() ShuffleHelper.makeShuffleList(it, -1) - if (it.size > 9) { - list.addAll(it.subList(0, 9)) + if (it.size >= 7) { + list.addAll(it.subList(0, 7)) } return@flatMap Observable.just(list) } - /*.flatMap({ songs -> - val list = ArrayList() - ShuffleHelper.makeShuffleList(songs, -1) - if (songs.size > 9) { - list.addAll(songs.subList(0, 9)) - } - Observable.just(list) - } as Function, ObservableSource>>)*/ - /*.subscribe(songs -> { - ArrayList list = new ArrayList<>(); - if (songs.isEmpty()) { - return; - } - ShuffleHelper.makeShuffleList(songs, -1); - if (songs.size() > 10) { - list.addAll(songs.subList(0, 10)); - } else { - list.addAll(songs); - } - return; - });*/ } } diff --git a/app/src/main/java/code/name/monkey/retromusic/model/AbsCustomPlaylist.java b/app/src/main/java/code/name/monkey/retromusic/model/AbsCustomPlaylist.java index 29ca0357..1d572768 100644 --- a/app/src/main/java/code/name/monkey/retromusic/model/AbsCustomPlaylist.java +++ b/app/src/main/java/code/name/monkey/retromusic/model/AbsCustomPlaylist.java @@ -6,7 +6,6 @@ import android.os.Parcel; import java.util.ArrayList; import androidx.annotation.NonNull; -import code.name.monkey.models.Song; import io.reactivex.Observable; diff --git a/app/src/main/java/code/name/monkey/retromusic/model/Album.kt b/app/src/main/java/code/name/monkey/retromusic/model/Album.kt index fb64107b..27405c44 100644 --- a/app/src/main/java/code/name/monkey/retromusic/model/Album.kt +++ b/app/src/main/java/code/name/monkey/retromusic/model/Album.kt @@ -1,10 +1,10 @@ -package code.name.monkey.models +package code.name.monkey.retromusic.model import java.util.* class Album { - val songs: ArrayList? + val songs: ArrayList? val id: Int get() = safeGetFirstSong().albumId @@ -27,7 +27,7 @@ class Album { val songCount: Int get() = songs!!.size - constructor(songs: ArrayList) { + constructor(songs: ArrayList) { this.songs = songs } @@ -35,7 +35,7 @@ class Album { this.songs = ArrayList() } - fun safeGetFirstSong(): code.name.monkey.models.Song { - return if (songs!!.isEmpty()) code.name.monkey.models.Song.EMPTY_SONG else songs[0] + fun safeGetFirstSong(): Song { + return if (songs!!.isEmpty()) Song.EMPTY_SONG else songs[0] } } 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 449d0c77..0f5a5c35 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 @@ -30,9 +30,9 @@ class Artist { val albumCount: Int get() = albums!!.size - val songs: ArrayList + val songs: ArrayList get() { - val songs = ArrayList() + val songs = ArrayList() for (album in albums!!) { songs.addAll(album.songs!!) } diff --git a/app/src/main/java/code/name/monkey/retromusic/model/Playlist.java b/app/src/main/java/code/name/monkey/retromusic/model/Playlist.java index ba4b7657..a04f3126 100644 --- a/app/src/main/java/code/name/monkey/retromusic/model/Playlist.java +++ b/app/src/main/java/code/name/monkey/retromusic/model/Playlist.java @@ -1,4 +1,4 @@ -package code.name.monkey.models; +package code.name.monkey.retromusic.model; import android.os.Parcel; import android.os.Parcelable; diff --git a/app/src/main/java/code/name/monkey/retromusic/model/PlaylistSong.java b/app/src/main/java/code/name/monkey/retromusic/model/PlaylistSong.java index ae7af07d..c44f1f6a 100644 --- a/app/src/main/java/code/name/monkey/retromusic/model/PlaylistSong.java +++ b/app/src/main/java/code/name/monkey/retromusic/model/PlaylistSong.java @@ -2,8 +2,6 @@ package code.name.monkey.retromusic.model; import android.os.Parcel; -import code.name.monkey.models.Song; - public class PlaylistSong extends Song { public static PlaylistSong EMPTY_PLAYLIST_SONG = new PlaylistSong(-1, "", -1, -1, -1, "", -1, -1, "", -1, "", -1, -1); diff --git a/app/src/main/java/code/name/monkey/retromusic/model/lyrics/Lyrics.java b/app/src/main/java/code/name/monkey/retromusic/model/lyrics/Lyrics.java index 32a346e0..f80e5395 100644 --- a/app/src/main/java/code/name/monkey/retromusic/model/lyrics/Lyrics.java +++ b/app/src/main/java/code/name/monkey/retromusic/model/lyrics/Lyrics.java @@ -1,7 +1,7 @@ -package code.name.monkey.models.lyrics; +package code.name.monkey.retromusic.model.lyrics; -import code.name.monkey.models.Song; +import code.name.monkey.retromusic.model.Song; import java.util.ArrayList; diff --git a/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/AbsSmartPlaylist.java b/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/AbsSmartPlaylist.java index dad72616..9e3291ba 100644 --- a/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/AbsSmartPlaylist.java +++ b/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/AbsSmartPlaylist.java @@ -1,4 +1,4 @@ -package code.name.monkey.models.smartplaylist; +package code.name.monkey.retromusic.model.smartplaylist; import android.content.Context; import android.os.Parcel; diff --git a/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/HistoryPlaylist.java b/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/HistoryPlaylist.java index 08856050..1ab5e0d7 100644 --- a/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/HistoryPlaylist.java +++ b/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/HistoryPlaylist.java @@ -7,10 +7,9 @@ import androidx.annotation.NonNull; import java.util.ArrayList; -import code.name.monkey.models.Song; import code.name.monkey.retromusic.R; import code.name.monkey.retromusic.loaders.TopAndRecentlyPlayedTracksLoader; - +import code.name.monkey.retromusic.model.Song; import code.name.monkey.retromusic.providers.HistoryStore; import io.reactivex.Observable; diff --git a/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/LastAddedPlaylist.java b/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/LastAddedPlaylist.java index d2395c34..d4dd4c7c 100644 --- a/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/LastAddedPlaylist.java +++ b/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/LastAddedPlaylist.java @@ -8,7 +8,7 @@ import androidx.annotation.NonNull; import code.name.monkey.retromusic.R; import code.name.monkey.retromusic.loaders.LastAddedSongsLoader; -import code.name.monkey.models.Song; +import code.name.monkey.retromusic.model.Song; import java.util.ArrayList; diff --git a/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/MyTopTracksPlaylist.java b/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/MyTopTracksPlaylist.java index b62a4dd3..18515d20 100644 --- a/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/MyTopTracksPlaylist.java +++ b/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/MyTopTracksPlaylist.java @@ -8,7 +8,7 @@ import androidx.annotation.NonNull; import code.name.monkey.retromusic.R; import code.name.monkey.retromusic.loaders.TopAndRecentlyPlayedTracksLoader; -import code.name.monkey.models.Song; +import code.name.monkey.retromusic.model.Song; import code.name.monkey.retromusic.providers.SongPlayCountStore; import java.util.ArrayList; diff --git a/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/ShuffleAllPlaylist.java b/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/ShuffleAllPlaylist.java index 169a4a60..e4b752f0 100644 --- a/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/ShuffleAllPlaylist.java +++ b/app/src/main/java/code/name/monkey/retromusic/model/smartplaylist/ShuffleAllPlaylist.java @@ -8,7 +8,7 @@ import androidx.annotation.NonNull; import code.name.monkey.retromusic.R; import code.name.monkey.retromusic.loaders.SongLoader; -import code.name.monkey.models.Song; +import code.name.monkey.retromusic.model.Song; import java.util.ArrayList; diff --git a/app/src/main/java/code/name/monkey/retromusic/mvp/contract/HomeContract.kt b/app/src/main/java/code/name/monkey/retromusic/mvp/contract/HomeContract.kt index 84c89191..9fbccfee 100644 --- a/app/src/main/java/code/name/monkey/retromusic/mvp/contract/HomeContract.kt +++ b/app/src/main/java/code/name/monkey/retromusic/mvp/contract/HomeContract.kt @@ -1,43 +1,15 @@ package code.name.monkey.retromusic.mvp.contract -import code.name.monkey.retromusic.model.* +import code.name.monkey.retromusic.model.Home import code.name.monkey.retromusic.mvp.BasePresenter import code.name.monkey.retromusic.mvp.BaseView interface HomeContract { - interface HomeView : BaseView> { - - /*fun recentArtist(artists: ArrayList) - - fun recentAlbum(albums: ArrayList) - - fun topArtists(artists: ArrayList) - - fun topAlbums(albums: ArrayList) - - fun suggestions(songs: ArrayList) - - fun playlists(playlists: ArrayList) - - fun geners(songs: ArrayList)*/ - - fun loadHomes(homes: ArrayList) - } + interface HomeView : BaseView> interface HomePresenter : BasePresenter { - /*fun loadRecentAlbums() - - fun loadTopAlbums() - - fun loadRecentArtists() - - fun loadTopArtists() - - fun loadSuggestions() - - fun loadGenres()*/ - fun loadAll(); + fun homeSections(); } } \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/mvp/presenter/HomePresenter.kt b/app/src/main/java/code/name/monkey/retromusic/mvp/presenter/HomePresenter.kt index 4557a47c..65141292 100644 --- a/app/src/main/java/code/name/monkey/retromusic/mvp/presenter/HomePresenter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/mvp/presenter/HomePresenter.kt @@ -11,6 +11,7 @@ import code.name.monkey.retromusic.ui.adapter.HomeAdapter.Companion.RECENT_ARTIS import code.name.monkey.retromusic.ui.adapter.HomeAdapter.Companion.SUGGESTIONS import code.name.monkey.retromusic.ui.adapter.HomeAdapter.Companion.TOP_ALBUMS import code.name.monkey.retromusic.ui.adapter.HomeAdapter.Companion.TOP_ARTISTS +import code.name.monkey.retromusic.util.PreferenceUtil import io.reactivex.Observable import io.reactivex.disposables.CompositeDisposable import io.reactivex.disposables.Disposable @@ -21,128 +22,37 @@ operator fun CompositeDisposable.plusAssign(disposable: Disposable) { } class HomePresenter(private val view: HomeContract.HomeView) : Presenter(), HomeContract.HomePresenter { - override fun loadAll() { + override fun homeSections() { disposable += Observable.combineLatest(repository.suggestionSongs, repository.recentAlbums, repository.topAlbums, repository.recentArtists, repository.topArtists, - repository.allGenres, repository.allPlaylists, + repository.allGenres, repository.favoritePlaylist, Function7, ArrayList, ArrayList, ArrayList, ArrayList, ArrayList, ArrayList, List> { suggestions: ArrayList, recentAlbums: ArrayList, topAlbums: ArrayList, recentArtists: ArrayList, topArtists: ArrayList, genres: ArrayList, - playlists: ArrayList -> + favoritePlaylist: ArrayList -> val homes: ArrayList = ArrayList() if (suggestions.isNotEmpty()) homes.add(Home(R.string.suggestion_songs, 0, suggestions, SUGGESTIONS)) if (recentArtists.isNotEmpty()) homes.add(Home(R.string.recent_artists, 0, recentArtists, RECENT_ARTISTS)) if (recentAlbums.isNotEmpty()) homes.add(Home(R.string.recent_albums, 0, recentAlbums, RECENT_ALBUMS)) if (topArtists.isNotEmpty()) homes.add(Home(R.string.top_artists, 0, topArtists, TOP_ARTISTS)) if (topAlbums.isNotEmpty()) homes.add(Home(R.string.top_albums, 0, topAlbums, TOP_ALBUMS)) - if (genres.isNotEmpty()) homes.add(Home(R.string.genres, 0, genres, GENRES)) - if (playlists.isNotEmpty()) homes.add(Home(R.string.playlists, 0, playlists, PLAYLISTS)) + if (favoritePlaylist.isNotEmpty()) homes.add(Home(R.string.favorites, 0, favoritePlaylist, PLAYLISTS)) + if (genres.isNotEmpty() && PreferenceUtil.getInstance().isGenreShown) homes.add(Home(R.string.genres, 0, genres, GENRES)) homes }).subscribe { homes -> if (homes.isNotEmpty()) { - view.loadHomes(homes as ArrayList) + view.showData(homes as ArrayList) } } } override fun subscribe() { - loadAll() - /*loadRecentAlbums() - loadRecentArtists() - loadTopAlbums() - loadTopArtists() - loadSuggestions()*/ - - /*if (PreferenceUtil.getInstance().isGenreShown) loadGenres()*/ - + homeSections() } override fun unsubscribe() { - if (true) { - disposable.dispose() - } + disposable.dispose() } - - /*fun loadPlaylists() { - disposable += repository.allPlaylists - .observeOn(schedulerProvider.ui()) - .subscribeOn(schedulerProvider.io()) - .subscribe({ playlist -> - if (!playlist.isEmpty()) { - view.playlists(playlist) - } - }, { view.showEmptyView() }, { view.completed() }) - } - - override fun loadRecentAlbums() { - disposable += repository.recentAlbums - .observeOn(schedulerProvider.ui()) - .subscribeOn(schedulerProvider.io()) - .doOnSubscribe { view.loading() } - .subscribe({ artists -> - if (!artists.isEmpty()) { - view.recentAlbum(artists) - } - }, { view.showEmptyView() }, { view.completed() }) - } - - override fun loadTopAlbums() { - disposable += repository.topAlbums - .observeOn(schedulerProvider.ui()) - .subscribeOn(schedulerProvider.io()) - .doOnSubscribe { view.loading() } - .subscribe({ artists -> - if (!artists.isEmpty()) { - view.topAlbums(artists) - } - }, { view.showEmptyView() }, { view.completed() }) - } - - override fun loadRecentArtists() { - disposable += repository.recentArtists - .observeOn(schedulerProvider.ui()) - .subscribeOn(schedulerProvider.io()) - .doOnSubscribe { view.loading() } - .subscribe({ artists -> - if (!artists.isEmpty()) { - view.recentArtist(artists) - } - }, { view.showEmptyView() }, { view.completed() }) - } - - override fun loadTopArtists() { - disposable += repository.topArtists - .observeOn(schedulerProvider.ui()) - .subscribeOn(schedulerProvider.io()) - .doOnSubscribe { view.loading() } - .subscribe({ artists -> - if (!artists.isEmpty()) { - view.topArtists(artists) - } - }, { view.showEmptyView() }, { view.completed() }) - - } - - override fun loadSuggestions() { - disposable += repository.suggestionSongs - .observeOn(schedulerProvider.ui()) - .subscribeOn(schedulerProvider.io()) - .doOnSubscribe { view.loading() } - .subscribe({ songs -> view.suggestions(songs) }, - { view.showEmptyView() }, { view.completed() }) - } - - override fun loadGenres() { - disposable += repository.allGenres - .observeOn(schedulerProvider.ui()) - .subscribeOn(schedulerProvider.io()) - .doOnSubscribe { view.loading() } - .subscribe({ genres -> - if (!genres.isEmpty()) { - view.geners(genres) - } - }, { view.showEmptyView() }, { view.completed() }) - }*/ } diff --git a/app/src/main/java/code/name/monkey/retromusic/providers/BlacklistStore.java b/app/src/main/java/code/name/monkey/retromusic/providers/BlacklistStore.java index f77da536..e75ee372 100644 --- a/app/src/main/java/code/name/monkey/retromusic/providers/BlacklistStore.java +++ b/app/src/main/java/code/name/monkey/retromusic/providers/BlacklistStore.java @@ -8,27 +8,14 @@ import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.os.Environment; -import androidx.annotation.NonNull; - import java.io.File; import java.util.ArrayList; -import java.util.List; -import code.name.monkey.retromusic.App; -import code.name.monkey.retromusic.model.Album; -import code.name.monkey.retromusic.model.Artist; -import code.name.monkey.retromusic.model.Genre; -import code.name.monkey.retromusic.model.Home; -import code.name.monkey.retromusic.model.Playlist; -import code.name.monkey.retromusic.model.Song; +import androidx.annotation.NonNull; import code.name.monkey.retromusic.util.FileUtil; import code.name.monkey.retromusic.util.PreferenceUtil; -import io.reactivex.Observable; -import io.reactivex.functions.Function7; import static code.name.monkey.retromusic.Constants.MEDIA_STORE_CHANGED; -import static code.name.monkey.retromusic.ui.adapter.HomeAdapter.RECENT_ALBUMS; -import static code.name.monkey.retromusic.ui.adapter.HomeAdapter.SUGGESTIONS; public class BlacklistStore extends SQLiteOpenHelper { public static final String DATABASE_NAME = "blacklist.db"; @@ -160,45 +147,6 @@ public class BlacklistStore extends SQLiteOpenHelper { return paths; } - private void hmm() { - RepositoryImpl repository = new RepositoryImpl(App.Companion.getContext()); - - - Observable.combineLatest(repository.getSuggestionSongs(), repository.getRecentAlbums(), - repository.getTopAlbums(), repository.getRecentArtists(), repository.getTopArtists(), - repository.getAllGenres(), repository.getAllPlaylists(), new Function7, ArrayList, ArrayList, ArrayList, ArrayList, ArrayList, ArrayList, List>() { - @Override - public List apply(ArrayList songs, ArrayList albums, ArrayList albums2, ArrayList artists, ArrayList artists2, ArrayList genres, ArrayList playlists) throws Exception { - List homes = new ArrayList<>(); - homes.add(new Home(0, 0, songs, SUGGESTIONS)); - homes.add(new Home(0, 0, albums, RECENT_ALBUMS)); - return homes; - - } - }).subscribe(homes -> { - if (homes.isEmpty()) { - - } - }); - - - Observable.combineLatest( - repository.getSuggestionSongs(), - repository.getRecentAlbums(), - repository.getTopAlbums(), - repository.getRecentArtists(), - repository.getTopArtists(), - repository.getAllGenres(), - repository.getAllPlaylists(), - (ArrayList suggestions, ArrayList recentAlbums, ArrayList topAlbums, - ArrayList recentArtists, ArrayList topArtists, - ArrayList genres, ArrayList playlists) -> { - List homes = new ArrayList<>(); - - return homes; - }).subscribe(); - } - public interface BlacklistStoreColumns { String NAME = "blacklist"; diff --git a/app/src/main/java/code/name/monkey/retromusic/providers/RepositoryImpl.kt b/app/src/main/java/code/name/monkey/retromusic/providers/RepositoryImpl.kt index e9037ec8..f4dd5a60 100644 --- a/app/src/main/java/code/name/monkey/retromusic/providers/RepositoryImpl.kt +++ b/app/src/main/java/code/name/monkey/retromusic/providers/RepositoryImpl.kt @@ -7,9 +7,11 @@ import code.name.monkey.retromusic.model.* import code.name.monkey.retromusic.model.smartplaylist.AbsSmartPlaylist import code.name.monkey.retromusic.providers.interfaces.Repository import io.reactivex.Observable -import java.util.* class RepositoryImpl(private val context: Context) : Repository { + override val favoritePlaylist: Observable> + get() = PlaylistLoader.getFavoritePlaylist(context) + override val allSongs: Observable> get() = SongLoader.getAllSongs(context) diff --git a/app/src/main/java/code/name/monkey/retromusic/providers/interfaces/Repository.kt b/app/src/main/java/code/name/monkey/retromusic/providers/interfaces/Repository.kt index 58c5f026..af2bc1e8 100644 --- a/app/src/main/java/code/name/monkey/retromusic/providers/interfaces/Repository.kt +++ b/app/src/main/java/code/name/monkey/retromusic/providers/interfaces/Repository.kt @@ -4,6 +4,7 @@ import code.name.monkey.retromusic.model.* import code.name.monkey.retromusic.model.smartplaylist.AbsSmartPlaylist import io.reactivex.Observable import java.util.* +import kotlin.collections.ArrayList /** * Created by hemanths on 11/08/17. @@ -47,5 +48,6 @@ interface Repository { fun getGenre(genreId: Int): Observable> + val favoritePlaylist: Observable> } \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/ui/activities/AlbumDetailsActivity.kt b/app/src/main/java/code/name/monkey/retromusic/ui/activities/AlbumDetailsActivity.kt index 75b56b31..0309e923 100644 --- a/app/src/main/java/code/name/monkey/retromusic/ui/activities/AlbumDetailsActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/ui/activities/AlbumDetailsActivity.kt @@ -132,7 +132,6 @@ class AlbumDetailsActivity : AbsSlidingMusicPanelActivity(), AlbumDetailsContrac } } - toolbar.setNavigationIcon(R.drawable.ic_keyboard_backspace_black_24dp) if (toolbar != null && !PreferenceUtil.getInstance().fullScreenMode) { @@ -218,6 +217,7 @@ class AlbumDetailsActivity : AbsSlidingMusicPanelActivity(), AlbumDetailsContrac }) return@map it.albums!! } + .subscribe { it.remove(album) diff --git a/app/src/main/java/code/name/monkey/retromusic/ui/activities/ArtistDetailActivity.kt b/app/src/main/java/code/name/monkey/retromusic/ui/activities/ArtistDetailActivity.kt index b0b66741..056a2e6f 100755 --- a/app/src/main/java/code/name/monkey/retromusic/ui/activities/ArtistDetailActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/ui/activities/ArtistDetailActivity.kt @@ -27,7 +27,9 @@ import code.name.monkey.retromusic.glide.RetroGlideExtension import code.name.monkey.retromusic.glide.RetroMusicColoredTarget import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.misc.AppBarStateChangeListener +import code.name.monkey.retromusic.model.Album import code.name.monkey.retromusic.model.Artist +import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.mvp.contract.ArtistDetailContract import code.name.monkey.retromusic.mvp.presenter.ArtistDetailsPresenter import code.name.monkey.retromusic.rest.LastFMRestClient @@ -44,6 +46,7 @@ import retrofit2.Call import retrofit2.Callback import retrofit2.Response import java.util.* +import kotlin.collections.ArrayList class ArtistDetailActivity : AbsSlidingMusicPanelActivity(), ArtistDetailContract.ArtistsDetailsView { @@ -51,8 +54,8 @@ class ArtistDetailActivity : AbsSlidingMusicPanelActivity(), ArtistDetailContrac private var artist: Artist? = null private var lastFMRestClient: LastFMRestClient? = null private var artistDetailsPresenter: ArtistDetailsPresenter? = null - private var songAdapter: SimpleSongAdapter? = null - private var albumAdapter: AlbumAdapter? = null + private lateinit var songAdapter: SimpleSongAdapter + private lateinit var albumAdapter: AlbumAdapter private var forceDownload: Boolean = false private fun setupWindowTransitions() { @@ -225,9 +228,11 @@ class ArtistDetailActivity : AbsSlidingMusicPanelActivity(), ArtistDetailContrac artistTitle.text = artist.name text.text = String.format("%s • %s", MusicUtil.getArtistInfoString(this, artist), MusicUtil .getReadableDurationString(MusicUtil.getTotalDuration(this, artist.songs))) + //val songs = artist.songs.sortedWith(compareBy { it.title }) as ArrayList + songAdapter.swapDataSet(artist.songs) - songAdapter!!.swapDataSet(artist.songs) - albumAdapter!!.swapDataSet(artist.albums!!) + //val albums = artist.albums?.sortedWith(compareBy { it.artistName }) as ArrayList + albumAdapter.swapDataSet(artist.albums!!) } private fun loadBiography(lang: String? = Locale.getDefault().language) { diff --git a/app/src/main/java/code/name/monkey/retromusic/ui/activities/MainActivity.kt b/app/src/main/java/code/name/monkey/retromusic/ui/activities/MainActivity.kt index d72c50c4..5bad4115 100644 --- a/app/src/main/java/code/name/monkey/retromusic/ui/activities/MainActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/ui/activities/MainActivity.kt @@ -79,9 +79,9 @@ class MainActivity : AbsSlidingMusicPanelActivity(), SharedPreferences.OnSharedP checkShowChangelog() - if (!App.isProVersion && !PreferenceManager.getDefaultSharedPreferences(this).getBoolean("shown", false)) { + /*if (!App.isProVersion && !PreferenceManager.getDefaultSharedPreferences(this).getBoolean("shown", false)) { showPromotionalOffer() - } + }*/ } private fun checkShowChangelog() { diff --git a/app/src/main/java/code/name/monkey/retromusic/ui/activities/PurchaseActivity.kt b/app/src/main/java/code/name/monkey/retromusic/ui/activities/PurchaseActivity.kt index 58784fab..19344893 100644 --- a/app/src/main/java/code/name/monkey/retromusic/ui/activities/PurchaseActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/ui/activities/PurchaseActivity.kt @@ -16,7 +16,6 @@ import code.name.monkey.retromusic.ui.activities.base.AbsBaseActivity import com.anjlab.android.iab.v3.BillingProcessor import com.anjlab.android.iab.v3.TransactionDetails import kotlinx.android.synthetic.main.activity_pro_version.* -import kotlinx.android.synthetic.main.activity_pro_version_content.* import java.lang.ref.WeakReference diff --git a/app/src/main/java/code/name/monkey/retromusic/ui/activities/base/AbsThemeActivity.kt b/app/src/main/java/code/name/monkey/retromusic/ui/activities/base/AbsThemeActivity.kt index 89910457..c8e57945 100644 --- a/app/src/main/java/code/name/monkey/retromusic/ui/activities/base/AbsThemeActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/ui/activities/base/AbsThemeActivity.kt @@ -10,7 +10,6 @@ import android.view.WindowManager import androidx.annotation.ColorInt import androidx.core.content.ContextCompat import code.name.monkey.appthemehelper.ATH -import code.name.monkey.appthemehelper.ATHActivity import code.name.monkey.appthemehelper.ThemeStore import code.name.monkey.appthemehelper.util.* import code.name.monkey.retromusic.R @@ -144,7 +143,7 @@ abstract class AbsThemeActivity : AbsCrashCollector(), Runnable { } open fun setLightNavigationBar(enabled: Boolean) { - if (!ATHUtil.isWindowBackgroundDark(this) && ThemeStore.coloredNavigationBar(this)) { + if (!ATHUtil.isWindowBackgroundDark(this) and ThemeStore.coloredNavigationBar(this)) { ATH.setLightNavigationbar(this, enabled) } } diff --git a/app/src/main/java/code/name/monkey/retromusic/ui/adapter/HomeAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/ui/adapter/HomeAdapter.kt index 908d0ba5..70a876ae 100644 --- a/app/src/main/java/code/name/monkey/retromusic/ui/adapter/HomeAdapter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/ui/adapter/HomeAdapter.kt @@ -20,9 +20,11 @@ import code.name.monkey.retromusic.glide.GlideApp import code.name.monkey.retromusic.glide.RetroGlideExtension import code.name.monkey.retromusic.glide.RetroMusicColoredTarget import code.name.monkey.retromusic.helper.MusicPlayerRemote +import code.name.monkey.retromusic.loaders.PlaylistSongsLoader import code.name.monkey.retromusic.model.* import code.name.monkey.retromusic.ui.adapter.album.AlbumFullWidthAdapter import code.name.monkey.retromusic.ui.adapter.artist.ArtistAdapter +import code.name.monkey.retromusic.ui.adapter.song.SongAdapter import code.name.monkey.retromusic.util.PreferenceUtil import code.name.monkey.retromusic.views.MetalRecyclerViewPager import com.google.android.material.floatingactionbutton.FloatingActionButton @@ -41,6 +43,7 @@ class HomeAdapter(private val activity: AppCompatActivity, private val homes: Ar SUGGESTIONS -> SuggestionViewHolder(LayoutInflater.from(activity).inflate(R.layout.section_item_collage, parent, false)) RECENT_ARTISTS, TOP_ARTISTS -> ArtistViewHolder(layout) GENRES -> GenreViewHolder(layout) + PLAYLISTS -> PlaylistViewHolder(layout) else -> { AlbumViewHolder(LayoutInflater.from(activity).inflate(R.layout.metal_section_recycler_view, parent, false)) } @@ -66,6 +69,10 @@ class HomeAdapter(private val activity: AppCompatActivity, private val homes: Ar val viewHolder = holder as GenreViewHolder viewHolder.bindView(home) } + PLAYLISTS -> { + val viewHolder = holder as PlaylistViewHolder + viewHolder.bindView(home) + } } } @@ -174,4 +181,21 @@ class HomeAdapter(private val activity: AppCompatActivity, private val homes: Ar val title: TextView = view.findViewById(R.id.sectionTitle) } + + private inner class PlaylistViewHolder(view: View) : RecyclerView.ViewHolder(view) { + fun bindView(home: Home) { + val songs = PlaylistSongsLoader.getPlaylistSongList(activity, home.arrayList[0] as Playlist).blockingFirst() + recyclerView.apply { + val songAdapter = SongAdapter(activity, songs, R.layout.item_album_card, false, null) + layoutManager = GridLayoutManager(activity, 1, GridLayoutManager.HORIZONTAL, false) + adapter = songAdapter + + } + title.text = activity.getString(home.title) + } + + val recyclerView: RecyclerView = view.findViewById(R.id.recyclerView) + val title: TextView = view.findViewById(R.id.sectionTitle) + + } } \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/ui/adapter/album/AlbumCoverPagerAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/ui/adapter/album/AlbumCoverPagerAdapter.kt index 4cb289c2..ea3f837c 100644 --- a/app/src/main/java/code/name/monkey/retromusic/ui/adapter/album/AlbumCoverPagerAdapter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/ui/adapter/album/AlbumCoverPagerAdapter.kt @@ -146,7 +146,6 @@ class AlbumCoverPagerAdapter(fm: FragmentManager, private val dataSet: ArrayList } interface ColorReceiver { - fun onColorReady(color: Int, request: Int) } diff --git a/app/src/main/java/code/name/monkey/retromusic/ui/adapter/album/HorizontalAlbumAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/ui/adapter/album/HorizontalAlbumAdapter.kt index 72dc020e..d3b63896 100644 --- a/app/src/main/java/code/name/monkey/retromusic/ui/adapter/album/HorizontalAlbumAdapter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/ui/adapter/album/HorizontalAlbumAdapter.kt @@ -66,11 +66,7 @@ class HorizontalAlbumAdapter(activity: AppCompatActivity, dataSet: ArrayList dataSet.size - dataSet.size >= 5 -> 5 - else -> super.getItemCount() - } + return dataSet.size } companion object { diff --git a/app/src/main/java/code/name/monkey/retromusic/ui/adapter/playlist/PlaylistAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/ui/adapter/playlist/PlaylistAdapter.kt index 4fac4696..fdecd389 100755 --- a/app/src/main/java/code/name/monkey/retromusic/ui/adapter/playlist/PlaylistAdapter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/ui/adapter/playlist/PlaylistAdapter.kt @@ -120,8 +120,7 @@ class PlaylistAdapter(protected val activity: AppCompatActivity, dataSet: ArrayL return playlist.name } - override fun onMultipleItemAction(menuItem: MenuItem, - selection: ArrayList) { + override fun onMultipleItemAction(menuItem: MenuItem, selection: ArrayList) { when (menuItem.itemId) { R.id.action_delete_playlist -> { var i = 0 @@ -172,39 +171,39 @@ class PlaylistAdapter(protected val activity: AppCompatActivity, dataSet: ArrayL inner class ViewHolder(itemView: View) : MediaEntryViewHolder(itemView) { init { - if (image != null) { - val iconPadding = activity.resources - .getDimensionPixelSize(R.dimen.list_item_image_icon_padding) - image!!.setPadding(iconPadding, iconPadding, iconPadding, iconPadding) - image!!.setColorFilter(ATHUtil.resolveColor(activity, R.attr.iconColor), - PorterDuff.Mode.SRC_IN) + + image?.apply { + val iconPadding = activity.resources.getDimensionPixelSize(R.dimen.list_item_image_icon_padding) + setPadding(iconPadding, iconPadding, iconPadding, iconPadding) + setColorFilter(ATHUtil.resolveColor(activity, R.attr.iconColor), PorterDuff.Mode.SRC_IN) } - if (menu != null) { - menu!!.setOnClickListener { view -> - val playlist = dataSet[adapterPosition] - val popupMenu = PopupMenu(activity, view) - popupMenu.inflate(if (getItemViewType() == SMART_PLAYLIST) - R.menu.menu_item_smart_playlist - else - R.menu.menu_item_playlist) - if (playlist is LastAddedPlaylist) { - popupMenu.menu.findItem(R.id.action_clear_playlist).isVisible = false - } - popupMenu.setOnMenuItemClickListener { item -> - if (item.itemId == R.id.action_clear_playlist) { - if (playlist is AbsSmartPlaylist) { - ClearSmartPlaylistDialog.create(playlist) - .show(activity.supportFragmentManager, - "CLEAR_SMART_PLAYLIST_" + playlist.name) - return@setOnMenuItemClickListener true - } - } - PlaylistMenuHelper.handleMenuClick( - activity, dataSet[adapterPosition], item) - } - popupMenu.show() + + menu?.setOnClickListener { view -> + val playlist = dataSet[adapterPosition] + val popupMenu = PopupMenu(activity, view) + popupMenu.inflate(if (itemViewType == SMART_PLAYLIST) + R.menu.menu_item_smart_playlist + else + R.menu.menu_item_playlist) + if (playlist is LastAddedPlaylist) { + popupMenu.menu.findItem(R.id.action_clear_playlist).isVisible = false } + popupMenu.setOnMenuItemClickListener { item -> + if (item.itemId == R.id.action_clear_playlist) { + if (playlist is AbsSmartPlaylist) { + ClearSmartPlaylistDialog.create(playlist) + .show(activity.supportFragmentManager, + "CLEAR_SMART_PLAYLIST_" + playlist.name) + return@setOnMenuItemClickListener true + } + } + PlaylistMenuHelper.handleMenuClick( + activity, dataSet[adapterPosition], item) + } + popupMenu.show() } + + imageTextContainer?.cardElevation = 0f } override fun onClick(v: View?) { diff --git a/app/src/main/java/code/name/monkey/retromusic/ui/adapter/song/OrderablePlaylistSongAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/ui/adapter/song/OrderablePlaylistSongAdapter.kt index 55ff8499..87b68f15 100644 --- a/app/src/main/java/code/name/monkey/retromusic/ui/adapter/song/OrderablePlaylistSongAdapter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/ui/adapter/song/OrderablePlaylistSongAdapter.kt @@ -58,7 +58,7 @@ class OrderablePlaylistSongAdapter(activity: AppCompatActivity, override fun onCheckCanStartDrag(holder: ViewHolder, position: Int, x: Int, y: Int): Boolean { return onMoveItemListener != null && position > 0 && - (ViewUtil.hitTest(holder.dragView, x, y) || ViewUtil.hitTest(holder.image, x, y)) + (ViewUtil.hitTest(holder.dragView!!, x, y) || ViewUtil.hitTest(holder.image!!, x, y)) } override fun onGetItemDraggableRange(holder: ViewHolder, position: Int): ItemDraggableRange { diff --git a/app/src/main/java/code/name/monkey/retromusic/ui/adapter/song/PlayingQueueAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/ui/adapter/song/PlayingQueueAdapter.kt index ee92dcc8..9ba99efc 100644 --- a/app/src/main/java/code/name/monkey/retromusic/ui/adapter/song/PlayingQueueAdapter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/ui/adapter/song/PlayingQueueAdapter.kt @@ -127,7 +127,7 @@ class PlayingQueueAdapter : SongAdapter, DraggableItemAdapter, private fun setUpRecyclerView() { if (recyclerView is FastScrollRecyclerView) { - ViewUtil.setUpFastScrollRecyclerViewColor(activity, recyclerView as FastScrollRecyclerView, ThemeStore.accentColor(activity!!)) + ViewUtil.setUpFastScrollRecyclerViewColor(activity!!, recyclerView as FastScrollRecyclerView, ThemeStore.accentColor(activity!!)) } recyclerView.layoutManager = layoutManager recyclerView.adapter = adapter diff --git a/app/src/main/java/code/name/monkey/retromusic/ui/fragments/mainactivity/folders/FoldersFragment.java b/app/src/main/java/code/name/monkey/retromusic/ui/fragments/mainactivity/folders/FoldersFragment.java index 77e711f5..01f25f74 100644 --- a/app/src/main/java/code/name/monkey/retromusic/ui/fragments/mainactivity/folders/FoldersFragment.java +++ b/app/src/main/java/code/name/monkey/retromusic/ui/fragments/mainactivity/folders/FoldersFragment.java @@ -253,7 +253,7 @@ public class FoldersFragment extends AbsMainActivityFragment implements private void setUpRecyclerView() { //noinspection ConstantConditions - ViewUtil.setUpFastScrollRecyclerViewColor(getActivity(), recyclerView, + ViewUtil.INSTANCE.setUpFastScrollRecyclerViewColor(getActivity(), recyclerView, ThemeStore.Companion.accentColor(getActivity())); recyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); appBarLayout.addOnOffsetChangedListener(this); diff --git a/app/src/main/java/code/name/monkey/retromusic/ui/fragments/mainactivity/home/BannerHomeFragment.kt b/app/src/main/java/code/name/monkey/retromusic/ui/fragments/mainactivity/home/BannerHomeFragment.kt index 8b5333e6..cb2ed355 100644 --- a/app/src/main/java/code/name/monkey/retromusic/ui/fragments/mainactivity/home/BannerHomeFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/ui/fragments/mainactivity/home/BannerHomeFragment.kt @@ -40,13 +40,6 @@ import java.io.File import java.util.* class BannerHomeFragment : AbsMainActivityFragment(), MainActivityFragmentCallbacks, HomeContract.HomeView { - override fun loadHomes(homes: ArrayList) { - recyclerView.apply { - val homeAdapter = HomeAdapter(mainActivity, homes, displayMetrics) - layoutManager = LinearLayoutManager(mainActivity) - adapter = homeAdapter - } - } val disposable: CompositeDisposable = CompositeDisposable() private lateinit var homePresenter: HomePresenter @@ -62,7 +55,6 @@ class BannerHomeFragment : AbsMainActivityFragment(), MainActivityFragmentCallba return inflater.inflate(if (PreferenceUtil.getInstance().isHomeBanner) R.layout.fragment_banner_home else R.layout.fragment_home, viewGroup, false) } - private val displayMetrics: DisplayMetrics get() { val display = mainActivity.windowManager.defaultDisplay @@ -205,77 +197,14 @@ class BannerHomeFragment : AbsMainActivityFragment(), MainActivityFragmentCallba } - override fun showData(list: ArrayList) { - //homeAdapter.swapDataSet(homes); - } - - /*override fun recentArtist(artists: ArrayList) { - *//* recentArtistContainer.visibility = View.VISIBLE - recentArtist.apply { - val artistAdapter = ArtistAdapter(mainActivity, artists, PreferenceUtil.getInstance().getHomeGridStyle(context!!), false, null) - layoutManager = GridLayoutManager(mainActivity, 1, GridLayoutManager.HORIZONTAL, false) - adapter = artistAdapter - }*//* - } - - override fun recentAlbum(albums: ArrayList) { - recentAlbumsContainer.visibility = View.VISIBLE - val artistAdapter = AlbumFullWidthAdapter(mainActivity, albums, displayMetrics) - recentAlbum.adapter = artistAdapter - } - - override fun topArtists(artists: ArrayList) { - topArtistContainer.visibility = View.VISIBLE - topArtist.apply { - layoutManager = GridLayoutManager(mainActivity, 1, GridLayoutManager.HORIZONTAL, false) - val artistAdapter = ArtistAdapter(mainActivity, artists, PreferenceUtil.getInstance().getHomeGridStyle(context!!), false, null) - adapter = artistAdapter - } - - } - - override fun topAlbums(albums: ArrayList) { - topAlbumsContainer.visibility = View.VISIBLE - val artistAdapter = AlbumFullWidthAdapter(mainActivity, albums, displayMetrics) - topAlbum.adapter = artistAdapter - } - - override fun suggestions(songs: ArrayList) { - if (!songs.isEmpty()) { - suggestionContainer.visibility = View.VISIBLE - val artistAdapter = SpanSongsAdapter(mainActivity, songs, R.layout.image, false, null) - val manager = GridLayoutManager(mainActivity, 2, GridLayoutManager.HORIZONTAL, false) - manager.spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() { - override fun getSpanSize(position: Int): Int { - return when (position) { - 0 -> 2 - else -> { - 1 - } - } - } - } - suggestionSongs.apply { - layoutManager = if (RetroUtil.isTablet()) GridLayoutManager(mainActivity, 2) else manager - adapter = artistAdapter - } + override fun showData(list: ArrayList) { + recyclerView.apply { + val homeAdapter = HomeAdapter(mainActivity, list, displayMetrics) + layoutManager = LinearLayoutManager(mainActivity) + adapter = homeAdapter } } - override fun playlists(playlists: ArrayList) { - - } - - override fun geners(songs: ArrayList) { - genreContainer.visibility = View.VISIBLE - genresRecyclerView.apply { - val genreAdapter = GenreAdapter(activity!!, songs, R.layout.item_list) - layoutManager = LinearLayoutManager(context) - adapter = genreAdapter - } - } -*/ - companion object { const val TAG: String = "BannerHomeFragment" diff --git a/app/src/main/java/code/name/monkey/retromusic/ui/fragments/player/PlayerAlbumCoverFragment.kt b/app/src/main/java/code/name/monkey/retromusic/ui/fragments/player/PlayerAlbumCoverFragment.kt index 38f424f2..482cabb5 100644 --- a/app/src/main/java/code/name/monkey/retromusic/ui/fragments/player/PlayerAlbumCoverFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/ui/fragments/player/PlayerAlbumCoverFragment.kt @@ -44,8 +44,8 @@ class PlayerAlbumCoverFragment : AbsMusicServiceFragment(), ViewPager.OnPageChan viewPager.addOnPageChangeListener(this) //noinspection ConstantConditions if (PreferenceUtil.getInstance().carouselEffect() && - !((PreferenceUtil.getInstance().nowPlayingScreen == NowPlayingScreen.FULL) - || (PreferenceUtil.getInstance().nowPlayingScreen == NowPlayingScreen.ADAPTIVE) + !((PreferenceUtil.getInstance().nowPlayingScreen == NowPlayingScreen.FULL) || + (PreferenceUtil.getInstance().nowPlayingScreen == NowPlayingScreen.ADAPTIVE) || (PreferenceUtil.getInstance().nowPlayingScreen == NowPlayingScreen.FIT))) { viewPager.clipToPadding = false viewPager.setPadding(96, 0, 96, 0) diff --git a/app/src/main/java/code/name/monkey/retromusic/ui/fragments/player/adaptive/AdaptiveFragment.kt b/app/src/main/java/code/name/monkey/retromusic/ui/fragments/player/adaptive/AdaptiveFragment.kt index ef8f8926..b741f228 100644 --- a/app/src/main/java/code/name/monkey/retromusic/ui/fragments/player/adaptive/AdaptiveFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/ui/fragments/player/adaptive/AdaptiveFragment.kt @@ -38,7 +38,8 @@ class AdaptiveFragment : AbsPlayerFragment(), PlayerAlbumCoverFragment.Callbacks val playerAlbumCoverFragment = childFragmentManager.findFragmentById(R.id.playerAlbumCoverFragment) as PlayerAlbumCoverFragment playerAlbumCoverFragment.apply { removeSlideEffect() - }.setCallbacks(this) + setCallbacks(this@AdaptiveFragment) + } } private fun setUpPlayerToolbar() { @@ -50,7 +51,8 @@ class AdaptiveFragment : AbsPlayerFragment(), PlayerAlbumCoverFragment.Callbacks ToolbarContentTintHelper.colorizeToolbar(this, primaryColor, activity) setTitleTextColor(primaryColor) setSubtitleTextColor(ThemeStore.textColorSecondary(context!!)) - }.setOnMenuItemClickListener(this) + setOnMenuItemClickListener(this@AdaptiveFragment) + } } override fun onServiceConnected() { diff --git a/app/src/main/java/code/name/monkey/retromusic/ui/fragments/player/blur/BlurPlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/ui/fragments/player/blur/BlurPlaybackControlsFragment.kt index 1bbeb328..0716809e 100644 --- a/app/src/main/java/code/name/monkey/retromusic/ui/fragments/player/blur/BlurPlaybackControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/ui/fragments/player/blur/BlurPlaybackControlsFragment.kt @@ -3,8 +3,6 @@ package code.name.monkey.retromusic.ui.fragments.player.blur import android.animation.ObjectAnimator import android.graphics.Color import android.graphics.PorterDuff -import android.graphics.drawable.ClipDrawable -import android.graphics.drawable.LayerDrawable import android.os.Bundle import android.view.LayoutInflater import android.view.View @@ -14,7 +12,6 @@ import android.view.animation.DecelerateInterpolator import android.view.animation.LinearInterpolator import android.widget.SeekBar import androidx.core.content.ContextCompat -import code.name.monkey.appthemehelper.ThemeStore import code.name.monkey.appthemehelper.util.ColorUtil import code.name.monkey.appthemehelper.util.MaterialValueHelper import code.name.monkey.appthemehelper.util.TintHelper @@ -24,14 +21,13 @@ import code.name.monkey.retromusic.helper.MusicProgressViewUpdateHelper import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler import code.name.monkey.retromusic.misc.SimpleOnSeekbarChangeListener import code.name.monkey.retromusic.service.MusicService +import code.name.monkey.retromusic.ui.fragments.VolumeFragment import code.name.monkey.retromusic.ui.fragments.base.AbsPlayerControlsFragment import code.name.monkey.retromusic.util.MusicUtil +import code.name.monkey.retromusic.util.ViewUtil import kotlinx.android.synthetic.main.fragment_player_playback_controls.* import kotlinx.android.synthetic.main.media_button.* import kotlinx.android.synthetic.main.player_time.* -import code.name.monkey.retromusic.ui.fragments.VolumeFragment - - class BlurPlaybackControlsFragment : AbsPlayerControlsFragment() { @@ -108,7 +104,7 @@ class BlurPlaybackControlsFragment : AbsPlayerControlsFragment() { override fun setDark(color: Int) { lastPlaybackControlsColor = Color.WHITE - lastDisabledPlaybackControlsColor = ContextCompat.getColor(context!!, R.color.md_grey_500) + lastDisabledPlaybackControlsColor = ContextCompat.getColor(context!!, R.color.md_grey_200) title.setTextColor(lastPlaybackControlsColor) text.setTextColor(lastDisabledPlaybackControlsColor) @@ -129,13 +125,7 @@ class BlurPlaybackControlsFragment : AbsPlayerControlsFragment() { } private fun setProgressBarColor(newColor: Int) { - val ld = progressSlider.progressDrawable as LayerDrawable - val clipDrawableProgress = ld.findDrawableByLayerId(android.R.id.progress) as ClipDrawable - clipDrawableProgress.setColorFilter(newColor, PorterDuff.Mode.SRC_IN) - - val clipDrawableBackground = ld.findDrawableByLayerId(android.R.id.background) - clipDrawableBackground.setColorFilter(MaterialValueHelper.getPrimaryDisabledTextColor(context!!, ColorUtil.isColorLight(ThemeStore.primaryColor(context!!))), PorterDuff.Mode.SRC_IN) - + ViewUtil.setProgressDrawable(progressSlider, newColor) } private fun setUpPlayPauseFab() { diff --git a/app/src/main/java/code/name/monkey/retromusic/ui/fragments/player/color/ColorPlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/ui/fragments/player/color/ColorPlaybackControlsFragment.kt index b3dfc159..f2f43302 100644 --- a/app/src/main/java/code/name/monkey/retromusic/ui/fragments/player/color/ColorPlaybackControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/ui/fragments/player/color/ColorPlaybackControlsFragment.kt @@ -4,7 +4,6 @@ import android.animation.ObjectAnimator import android.content.res.ColorStateList import android.graphics.Color import android.graphics.PorterDuff -import android.graphics.drawable.ClipDrawable import android.graphics.drawable.LayerDrawable import android.os.Bundle import android.view.LayoutInflater @@ -121,7 +120,7 @@ class ColorPlaybackControlsFragment : AbsPlayerControlsFragment() { progressSlider.thumbTintList = ColorStateList.valueOf(c1) val ld = progressSlider.progressDrawable as LayerDrawable - val clipDrawableProgress = ld.findDrawableByLayerId(android.R.id.progress) as ClipDrawable + val clipDrawableProgress = ld.findDrawableByLayerId(android.R.id.progress) clipDrawableProgress.setColorFilter(c1, PorterDuff.Mode.SRC_IN) val clipDrawableBackground = ld.findDrawableByLayerId(android.R.id.background) diff --git a/app/src/main/java/code/name/monkey/retromusic/ui/fragments/player/flat/FlatPlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/ui/fragments/player/flat/FlatPlaybackControlsFragment.kt index cb4e9c8c..e692ed68 100644 --- a/app/src/main/java/code/name/monkey/retromusic/ui/fragments/player/flat/FlatPlaybackControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/ui/fragments/player/flat/FlatPlaybackControlsFragment.kt @@ -24,6 +24,7 @@ import code.name.monkey.retromusic.service.MusicService import code.name.monkey.retromusic.ui.fragments.base.AbsPlayerControlsFragment import code.name.monkey.retromusic.util.MusicUtil import code.name.monkey.retromusic.util.PreferenceUtil +import code.name.monkey.retromusic.util.ViewUtil import kotlinx.android.synthetic.main.fragment_flat_player_playback_controls.* import kotlinx.android.synthetic.main.player_time.* import kotlinx.android.synthetic.main.volume_controls.* @@ -114,7 +115,7 @@ class FlatPlaybackControlsFragment : AbsPlayerControlsFragment(), Callback { } private fun setProgressBarColor(dark: Int) { - TintHelper.setTintAuto(progressSlider!!, dark, false) + ViewUtil.setProgressDrawable(progressSlider, dark) } private fun updateTextColors(color: Int) { diff --git a/app/src/main/java/code/name/monkey/retromusic/ui/fragments/player/full/FullPlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/ui/fragments/player/full/FullPlaybackControlsFragment.kt index 1d2f9ac9..aa69ccd6 100644 --- a/app/src/main/java/code/name/monkey/retromusic/ui/fragments/player/full/FullPlaybackControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/ui/fragments/player/full/FullPlaybackControlsFragment.kt @@ -3,8 +3,6 @@ package code.name.monkey.retromusic.ui.fragments.player.full import android.animation.ObjectAnimator import android.graphics.Color import android.graphics.PorterDuff -import android.graphics.drawable.ClipDrawable -import android.graphics.drawable.LayerDrawable import android.os.Bundle import android.view.LayoutInflater import android.view.View @@ -24,6 +22,7 @@ import code.name.monkey.retromusic.ui.fragments.VolumeFragment import code.name.monkey.retromusic.ui.fragments.base.AbsPlayerControlsFragment import code.name.monkey.retromusic.util.MusicUtil import code.name.monkey.retromusic.util.PreferenceUtil +import code.name.monkey.retromusic.util.ViewUtil import kotlinx.android.synthetic.main.fragment_full_player_controls.* import kotlinx.android.synthetic.main.player_time.* @@ -117,9 +116,7 @@ class FullPlaybackControlsFragment : AbsPlayerControlsFragment() { } private fun setProgressBarColor(dark: Int) { - val ld = progressSlider!!.progressDrawable as LayerDrawable - val clipDrawable = ld.findDrawableByLayerId(android.R.id.progress) as ClipDrawable - clipDrawable.setColorFilter(dark, PorterDuff.Mode.SRC_IN) + ViewUtil.setProgressDrawable(progressSlider, dark) } override fun onServiceConnected() { diff --git a/app/src/main/java/code/name/monkey/retromusic/ui/fragments/player/normal/PlayerPlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/ui/fragments/player/normal/PlayerPlaybackControlsFragment.kt index d9073eef..24c7b96f 100644 --- a/app/src/main/java/code/name/monkey/retromusic/ui/fragments/player/normal/PlayerPlaybackControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/ui/fragments/player/normal/PlayerPlaybackControlsFragment.kt @@ -25,6 +25,7 @@ import code.name.monkey.retromusic.service.MusicService import code.name.monkey.retromusic.ui.fragments.base.AbsPlayerControlsFragment import code.name.monkey.retromusic.util.MusicUtil import code.name.monkey.retromusic.util.PreferenceUtil +import code.name.monkey.retromusic.util.ViewUtil import kotlinx.android.synthetic.main.fragment_player_playback_controls.* import kotlinx.android.synthetic.main.media_button.* import kotlinx.android.synthetic.main.player_time.* @@ -128,13 +129,7 @@ class PlayerPlaybackControlsFragment : AbsPlayerControlsFragment() { private fun setProgressBarColor(newColor: Int) { - val ld = progressSlider.progressDrawable as LayerDrawable - - val clipDrawableProgress = ld.findDrawableByLayerId(android.R.id.progress) as ClipDrawable - clipDrawableProgress.setColorFilter(newColor, PorterDuff.Mode.SRC_IN) - - val clipDrawableBackground = ld.findDrawableByLayerId(android.R.id.background) - clipDrawableBackground.setColorFilter(MaterialValueHelper.getPrimaryDisabledTextColor(context!!, ColorUtil.isColorLight(ThemeStore.primaryColor(context!!))), PorterDuff.Mode.SRC_IN) + ViewUtil.setProgressDrawable(progressSlider, newColor) } private fun setUpPlayPauseFab() { diff --git a/app/src/main/java/code/name/monkey/retromusic/ui/fragments/player/plain/PlainPlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/ui/fragments/player/plain/PlainPlaybackControlsFragment.kt index 5fb4bf61..9c158546 100644 --- a/app/src/main/java/code/name/monkey/retromusic/ui/fragments/player/plain/PlainPlaybackControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/ui/fragments/player/plain/PlainPlaybackControlsFragment.kt @@ -3,8 +3,6 @@ package code.name.monkey.retromusic.ui.fragments.player.plain import android.animation.ObjectAnimator import android.content.res.ColorStateList import android.graphics.PorterDuff -import android.graphics.drawable.ClipDrawable -import android.graphics.drawable.LayerDrawable import android.os.Bundle import android.view.LayoutInflater import android.view.View @@ -26,6 +24,7 @@ import code.name.monkey.retromusic.service.MusicService import code.name.monkey.retromusic.ui.fragments.base.AbsPlayerControlsFragment import code.name.monkey.retromusic.util.MusicUtil import code.name.monkey.retromusic.util.PreferenceUtil +import code.name.monkey.retromusic.util.ViewUtil import kotlinx.android.synthetic.main.fragment_plain_controls_fragment.* import kotlinx.android.synthetic.main.media_button.* import kotlinx.android.synthetic.main.player_time.* @@ -139,9 +138,7 @@ class PlainPlaybackControlsFragment : AbsPlayerControlsFragment() { private fun setProgressBarColor(newColor: Int) { progressSlider.thumbTintList = ColorStateList.valueOf(newColor) - val ld = progressSlider.progressDrawable as LayerDrawable - val clipDrawable = ld.findDrawableByLayerId(android.R.id.progress) as ClipDrawable - clipDrawable.setColorFilter(newColor, PorterDuff.Mode.SRC_IN) + ViewUtil.setProgressDrawable(progressSlider, newColor) } private fun setUpShuffleButton() { diff --git a/app/src/main/java/code/name/monkey/retromusic/util/NavigationUtil.java b/app/src/main/java/code/name/monkey/retromusic/util/NavigationUtil.java index 5c1f5177..74736484 100755 --- a/app/src/main/java/code/name/monkey/retromusic/util/NavigationUtil.java +++ b/app/src/main/java/code/name/monkey/retromusic/util/NavigationUtil.java @@ -2,6 +2,7 @@ package code.name.monkey.retromusic.util; import android.app.Activity; import android.content.ActivityNotFoundException; +import android.content.Context; import android.content.Intent; import android.media.audiofx.AudioEffect; import android.widget.Toast; @@ -104,8 +105,8 @@ public class NavigationUtil { ActivityCompat.startActivity(activity, intent, null); } - public static void goToProVersion(@NonNull Activity activity) { - ActivityCompat.startActivity(activity, new Intent(activity, PurchaseActivity.class), null); + public static void goToProVersion(@NonNull Context context) { + ActivityCompat.startActivity(context, new Intent(context, PurchaseActivity.class), null); } public static void goToSettings(@NonNull Activity activity) { 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 2e86a72b..cc3c464f 100755 --- a/app/src/main/java/code/name/monkey/retromusic/util/RetroUtil.java +++ b/app/src/main/java/code/name/monkey/retromusic/util/RetroUtil.java @@ -63,26 +63,6 @@ public class RetroUtil { return ContentUris.withAppendedId(Uri.parse("content://media/external/audio/albumart"), paramInt); } - public static String EncodeString(String string) { - return string.replace("%", "%25") - .replace(".", "%2E") - .replace("#", "%23") - .replace("$", "%24") - .replace("/", "%2F") - .replace("[", "%5B") - .replace("]", "%5D"); - } - - public static String DecodeString(String string) { - return string.replace("%25", "%") - .replace("%2E", ".") - .replace("%23", "#") - .replace("%24", "$") - .replace("%2F", "/") - .replace("%5B", "[") - .replace("%5D", "]"); - } - public static boolean isTablet() { return App.Companion.getContext().getResources().getConfiguration().smallestScreenWidthDp >= 600; } diff --git a/app/src/main/java/code/name/monkey/retromusic/util/ViewUtil.kt b/app/src/main/java/code/name/monkey/retromusic/util/ViewUtil.kt index 002f50ad..b34ecdf6 100644 --- a/app/src/main/java/code/name/monkey/retromusic/util/ViewUtil.kt +++ b/app/src/main/java/code/name/monkey/retromusic/util/ViewUtil.kt @@ -7,31 +7,38 @@ import android.content.Context import android.content.res.Resources import android.graphics.Color import android.graphics.PorterDuff +import android.graphics.drawable.LayerDrawable import android.os.Build -import android.util.DisplayMetrics import android.view.View -import android.view.ViewGroup import android.view.animation.PathInterpolator import android.widget.SeekBar import android.widget.TextView - -import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView - import androidx.annotation.ColorInt import androidx.core.view.ViewCompat import code.name.monkey.appthemehelper.ThemeStore import code.name.monkey.appthemehelper.util.ColorUtil import code.name.monkey.appthemehelper.util.MaterialValueHelper +import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView object ViewUtil { - val RETRO_MUSIC_ANIM_TIME = 1000 + const val RETRO_MUSIC_ANIM_TIME = 1000 fun createTextColorTransition(v: TextView, @ColorInt startColor: Int, @ColorInt endColor: Int): Animator { return createColorAnimator(v, "textColor", startColor, endColor) } - fun setProgressDrawable(progressSlider: SeekBar, newColor: Int) {} + fun setProgressDrawable(progressSlider: SeekBar, newColor: Int) { + val ld = progressSlider.progressDrawable as LayerDrawable + + val clipDrawableProgress = ld.findDrawableByLayerId(android.R.id.progress) + clipDrawableProgress.setColorFilter(newColor, PorterDuff.Mode.SRC_IN) + + val clipDrawableBackground = ld.findDrawableByLayerId(android.R.id.background) + clipDrawableBackground.setColorFilter(MaterialValueHelper.getPrimaryDisabledTextColor(progressSlider.context, ColorUtil.isColorLight(ThemeStore.primaryColor(progressSlider.context))), PorterDuff.Mode.SRC_IN) + + + } private fun createColorAnimator(target: Any, propertyName: String, @ColorInt startColor: Int, @ColorInt endColor: Int): Animator { val animator: ObjectAnimator @@ -89,8 +96,4 @@ object ViewUtil { val metrics = resources.displayMetrics return dp * metrics.density } - - fun createBackgroundColorTransition(colorGradientBackground: View?, lastColor: Int, newColor: Int): Animator { - return null - } } \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/views/MetalRecyclerViewPager.kt b/app/src/main/java/code/name/monkey/retromusic/views/MetalRecyclerViewPager.kt index 958637a1..0acfa535 100644 --- a/app/src/main/java/code/name/monkey/retromusic/views/MetalRecyclerViewPager.kt +++ b/app/src/main/java/code/name/monkey/retromusic/views/MetalRecyclerViewPager.kt @@ -59,20 +59,21 @@ class MetalRecyclerViewPager : RecyclerView { fun updateDisplayMetrics() { itemWidth = if (RetroUtil.isTablet()) { displayMetrics.widthPixels / 2 - itemMargin * 3 + } else if (RetroUtil.isLandscape()) { + ((displayMetrics.widthPixels / 1.5f) - itemMargin).toInt() } else { displayMetrics.widthPixels - itemMargin } } override fun onBindViewHolder(holder: VH, position: Int) { - var currentItemWidth = itemWidth - + val currentItemWidth = itemWidth if (position == 0) { - currentItemWidth += itemMargin - holder.rootLayout.setPadding(0, 0, 0, 0) + //currentItemWidth += itemMargin; + holder.rootLayout.setPadding(0, 0, 0, 0); } else if (position == itemCount - 1) { - currentItemWidth += itemMargin - holder.rootLayout.setPadding(0, 0, 0, 0) + //currentItemWidth += itemMargin; + holder.rootLayout.setPadding(0, 0, 0, 0); } val height = holder.rootLayout.layoutParams.height diff --git a/app/src/main/res/drawable/color_progress_seek.xml b/app/src/main/res/drawable/color_progress_seek.xml index 5ad5b9a6..b3c8c52c 100755 --- a/app/src/main/res/drawable/color_progress_seek.xml +++ b/app/src/main/res/drawable/color_progress_seek.xml @@ -1,26 +1,17 @@ - + - + - - - - - - - - - - - - + + + - + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_text_fields_black_24dp.xml b/app/src/main/res/drawable/ic_text_fields_black_24dp.xml index dd81ddfd..51bf61f1 100644 --- a/app/src/main/res/drawable/ic_text_fields_black_24dp.xml +++ b/app/src/main/res/drawable/ic_text_fields_black_24dp.xml @@ -4,6 +4,6 @@ android:viewportWidth="24.0" android:viewportHeight="24.0"> diff --git a/app/src/main/res/drawable/ic_time_lapse_white_24dp.xml b/app/src/main/res/drawable/ic_time_lapse_white_24dp.xml index a8b409b1..33025b21 100644 --- a/app/src/main/res/drawable/ic_time_lapse_white_24dp.xml +++ b/app/src/main/res/drawable/ic_time_lapse_white_24dp.xml @@ -1,4 +1,12 @@ - + - \ No newline at end of file + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/promotional.webp b/app/src/main/res/drawable/promotional.webp index 82b5022358c70b827d6750347945a4fda888377d..321f68d96e709465e400055c3b92fa997d57c6e7 100644 GIT binary patch literal 28738 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 xd-gtXh?*MnT>vn8_Eh(|t_+OoX8ov@z?IH$ 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 - + diff --git a/app/src/main/res/layout-land/fragment_home.xml b/app/src/main/res/layout-land/fragment_home.xml index c6851914..8fa9ba3d 100644 --- a/app/src/main/res/layout-land/fragment_home.xml +++ b/app/src/main/res/layout-land/fragment_home.xml @@ -68,7 +68,11 @@ - + diff --git a/app/src/main/res/layout-land/pager_item.xml b/app/src/main/res/layout-land/pager_item.xml index c2782744..920de1e1 100644 --- a/app/src/main/res/layout-land/pager_item.xml +++ b/app/src/main/res/layout-land/pager_item.xml @@ -10,7 +10,7 @@ diff --git a/app/src/main/res/layout-xlarge-land/fragment_banner_home.xml b/app/src/main/res/layout-xlarge-land/fragment_banner_home.xml index cd7ccfb7..9b2e3c53 100644 --- a/app/src/main/res/layout-xlarge-land/fragment_banner_home.xml +++ b/app/src/main/res/layout-xlarge-land/fragment_banner_home.xml @@ -69,7 +69,10 @@ - + diff --git a/app/src/main/res/layout-xlarge-land/fragment_home.xml b/app/src/main/res/layout-xlarge-land/fragment_home.xml index 6c216571..7afa5ed2 100644 --- a/app/src/main/res/layout-xlarge-land/fragment_home.xml +++ b/app/src/main/res/layout-xlarge-land/fragment_home.xml @@ -70,7 +70,11 @@ - + diff --git a/app/src/main/res/layout-xlarge/abs_playlists.xml b/app/src/main/res/layout-xlarge/abs_playlists.xml index 5ec995ee..d70df97d 100644 --- a/app/src/main/res/layout-xlarge/abs_playlists.xml +++ b/app/src/main/res/layout-xlarge/abs_playlists.xml @@ -5,9 +5,10 @@ android:layout_height="wrap_content" android:orientation="vertical"> - + android:text="@string/for_you" + android:textStyle="bold" /> - - + android:visibility="gone" + tools:visibility="visible" /> - + android:textColor="?android:attr/textColorPrimary" + android:textStyle="bold" /> - - + diff --git a/app/src/main/res/layout-xlarge/fragment_home.xml b/app/src/main/res/layout-xlarge/fragment_home.xml index efde06ca..5510cc12 100644 --- a/app/src/main/res/layout-xlarge/fragment_home.xml +++ b/app/src/main/res/layout-xlarge/fragment_home.xml @@ -72,7 +72,11 @@ - + diff --git a/app/src/main/res/layout-xlarge/fragment_mini_player.xml b/app/src/main/res/layout-xlarge/fragment_mini_player.xml index e6ea67e6..2330dc62 100644 --- a/app/src/main/res/layout-xlarge/fragment_mini_player.xml +++ b/app/src/main/res/layout-xlarge/fragment_mini_player.xml @@ -80,14 +80,12 @@ - + android:progressDrawable="@drawable/color_progress_seek" /> \ No newline at end of file diff --git a/app/src/main/res/layout/abs_playlists.xml b/app/src/main/res/layout/abs_playlists.xml index 18c49bbd..0188a6d1 100644 --- a/app/src/main/res/layout/abs_playlists.xml +++ b/app/src/main/res/layout/abs_playlists.xml @@ -7,6 +7,7 @@ - - - @@ -40,7 +41,7 @@ android:layout_height="wrap_content" android:nestedScrollingEnabled="false" /> - diff --git a/app/src/main/res/layout/activity_pro_version.xml b/app/src/main/res/layout/activity_pro_version.xml index c1780638..33ff9fc7 100644 --- a/app/src/main/res/layout/activity_pro_version.xml +++ b/app/src/main/res/layout/activity_pro_version.xml @@ -55,21 +55,168 @@ android:background="?dividerColor" /> - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_delete.xml b/app/src/main/res/layout/dialog_delete.xml index 1cb0d9ee..0366b40d 100644 --- a/app/src/main/res/layout/dialog_delete.xml +++ b/app/src/main/res/layout/dialog_delete.xml @@ -1,35 +1,42 @@ + android:orientation="vertical" + android:paddingTop="8dp"> + android:text="@string/remove_song_from_playlist_title" + android:textStyle="bold" /> + android:textAllCaps="false" + app:strokeWidth="2dp" /> \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_playlist.xml b/app/src/main/res/layout/dialog_playlist.xml index 42d4c194..982a0175 100644 --- a/app/src/main/res/layout/dialog_playlist.xml +++ b/app/src/main/res/layout/dialog_playlist.xml @@ -39,28 +39,33 @@ android:textAppearance="@style/TextAppearance.AppCompat.Subhead" /> - + android:layout_marginStart="12dp" + android:layout_marginTop="8dp" + android:layout_marginEnd="12dp" + android:gravity="center_vertical" + android:paddingTop="12dp" + android:paddingBottom="12dp" + android:text="@string/create_action" + app:backgroundTint="@color/md_pink_A400" /> + + - - - \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_remove_from_playlist.xml b/app/src/main/res/layout/dialog_remove_from_playlist.xml index 8b916c5e..52f00e3d 100644 --- a/app/src/main/res/layout/dialog_remove_from_playlist.xml +++ b/app/src/main/res/layout/dialog_remove_from_playlist.xml @@ -1,9 +1,10 @@ + android:orientation="vertical" + android:paddingTop="8dp"> - + android:layout_marginStart="8dp" + android:layout_marginEnd="8dp" + android:gravity="start|center_vertical" + android:paddingTop="16dp" + android:paddingBottom="16dp" + android:text="@string/remove_action" + android:textAllCaps="false" /> - + android:layout_marginStart="8dp" + android:layout_marginEnd="8dp" + android:gravity="start|center_vertical" + android:paddingTop="16dp" + android:paddingBottom="16dp" + android:text="@android:string/cancel" + android:textAllCaps="false" + app:strokeWidth="2dp" /> \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_sleep_timer.xml b/app/src/main/res/layout/dialog_sleep_timer.xml index e093f6b2..8c97801e 100644 --- a/app/src/main/res/layout/dialog_sleep_timer.xml +++ b/app/src/main/res/layout/dialog_sleep_timer.xml @@ -41,34 +41,34 @@ android:thumb="@drawable/switch_thumb_material" tools:progress="20" /> - - + android:layout_marginStart="12dp" + android:layout_marginEnd="12dp" + android:gravity="center_vertical" + android:paddingTop="12dp" + android:paddingBottom="12dp" + android:text="@string/action_set" + android:textColor="@color/md_white_1000" + app:backgroundTint="@color/md_pink_A400" /> - - + + - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_adaptive_player.xml b/app/src/main/res/layout/fragment_adaptive_player.xml index 1150691a..20b8aff3 100644 --- a/app/src/main/res/layout/fragment_adaptive_player.xml +++ b/app/src/main/res/layout/fragment_adaptive_player.xml @@ -47,13 +47,10 @@ - + android:layout_weight="1"> - + + android:layout_height="match_parent" + android:layout_gravity="center"> diff --git a/app/src/main/res/layout/fragment_banner_home.xml b/app/src/main/res/layout/fragment_banner_home.xml index 01032148..8378ba66 100644 --- a/app/src/main/res/layout/fragment_banner_home.xml +++ b/app/src/main/res/layout/fragment_banner_home.xml @@ -60,10 +60,13 @@ app:layout_scrollFlags="scroll|enterAlways" tools:ignore="UnusedAttribute"> - + + + + + + + + + + + + + + + - + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_mini_player.xml b/app/src/main/res/layout/fragment_mini_player.xml index f697c263..549e399f 100644 --- a/app/src/main/res/layout/fragment_mini_player.xml +++ b/app/src/main/res/layout/fragment_mini_player.xml @@ -83,13 +83,11 @@ - + android:progressDrawable="@drawable/color_progress_seek" /> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_player_playback_controls.xml b/app/src/main/res/layout/fragment_player_playback_controls.xml index 27ac1567..2109843f 100755 --- a/app/src/main/res/layout/fragment_player_playback_controls.xml +++ b/app/src/main/res/layout/fragment_player_playback_controls.xml @@ -1,6 +1,5 @@ diff --git a/app/src/main/res/layout/item_list.xml b/app/src/main/res/layout/item_list.xml index b57c43f9..9f292d0d 100755 --- a/app/src/main/res/layout/item_list.xml +++ b/app/src/main/res/layout/item_list.xml @@ -38,8 +38,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" - app:cardCornerRadius="6dp" - app:cardElevation="0dp"> + app:cardCornerRadius="6dp"> + android:textSize="16sp" /> + android:paddingLeft="16dp" + android:paddingEnd="0dp"> - + android:minHeight="40dp" /> @@ -33,37 +33,35 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" - android:layout_marginBottom="12dp" - android:layout_marginTop="12dp" android:layout_weight="1.0" android:orientation="vertical" - android:paddingEnd="16dp" - android:paddingStart="16dp"> + android:paddingStart="16dp" + android:paddingEnd="0dp"> + android:paddingStart="6dp" + android:paddingEnd="0dp"> - - diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index da1f8f28..1c115df2 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -129,6 +129,8 @@ ?iconColor ?iconColor center_vertical + 12dp + 12dp