diff --git a/app/build.gradle b/app/build.gradle index 47aa4f0c9..288fd8501 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -32,8 +32,8 @@ android { vectorDrawables.useSupportLibrary = true applicationId "code.name.monkey.retromusic" - versionCode 230 - versionName '3.1.250' + versionCode 305 + versionName '3.1.300' multiDexEnabled true diff --git a/app/src/main/assets/retro-changelog.html b/app/src/main/assets/retro-changelog.html index 91f09828a..adef1126b 100644 --- a/app/src/main/assets/retro-changelog.html +++ b/app/src/main/assets/retro-changelog.html @@ -1 +1 @@ -

v3.1.240

v3.1.200

v3.0.570

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

v3.1.240

v3.1.200

v3.0.570

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/CreatePlaylistDialog.kt b/app/src/main/java/code/name/monkey/retromusic/dialogs/CreatePlaylistDialog.kt index 53553fe16..9b59f6611 100644 --- a/app/src/main/java/code/name/monkey/retromusic/dialogs/CreatePlaylistDialog.kt +++ b/app/src/main/java/code/name/monkey/retromusic/dialogs/CreatePlaylistDialog.kt @@ -47,7 +47,7 @@ class CreatePlaylistDialog : RoundedBottomSheetDialogFragment() { MaterialUtil.setTint(actionCreate, true) MaterialUtil.setTint(actionCancel, false) - MaterialUtil.setTint(actionNewPlaylistContainer, true) + MaterialUtil.setTint(actionNewPlaylistContainer, false) actionNewPlaylist.setHintTextColor(ColorStateList.valueOf(accentColor)) actionNewPlaylist.setTextColor(ThemeStore.textColorPrimary(context!!)) 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 42b0ba2d9..6bef42fc5 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 @@ -32,7 +32,6 @@ import kotlinx.android.synthetic.main.dialog_remove_from_playlist.* class RemoveFromPlaylistDialog : RoundedBottomSheetDialogFragment() { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.dialog_remove_from_playlist, container, false) } @@ -53,8 +52,10 @@ 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)) } + bannerTitle.setTextColor(ThemeStore.textColorPrimary(context!!)) + bannerTitle.text = content; actionDelete.apply { - text = content + setText(title) setTextColor(ThemeStore.textColorSecondary(context)) setOnClickListener { val playlistSongs = ArrayList() @@ -64,10 +65,7 @@ class RemoveFromPlaylistDialog : RoundedBottomSheetDialogFragment() { } MaterialUtil.setTint(this) } - bannerTitle.apply { - setText(title) - setTextColor(ThemeStore.textColorPrimary(context)) - } + actionCancel.apply { setTextColor(ThemeStore.textColorSecondary(context)) diff --git a/app/src/main/java/code/name/monkey/retromusic/model/Home.kt b/app/src/main/java/code/name/monkey/retromusic/model/Home.kt index 48c12a947..3fb151c45 100644 --- a/app/src/main/java/code/name/monkey/retromusic/model/Home.kt +++ b/app/src/main/java/code/name/monkey/retromusic/model/Home.kt @@ -22,7 +22,8 @@ import code.name.monkey.retromusic.ui.adapter.HomeAdapter.Companion.HomeSection * Created by hemanths on 3/4/19 */ -class Home(@StringRes val title: Int, +class Home(val priority: Int, + @StringRes val title: Int, @StringRes val subTitle: Int, val arrayList: ArrayList<*>, @HomeSection 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 ede8d3980..a2c924eed 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 @@ -15,7 +15,7 @@ package code.name.monkey.retromusic.mvp.presenter import code.name.monkey.retromusic.R -import code.name.monkey.retromusic.model.* +import code.name.monkey.retromusic.model.Home import code.name.monkey.retromusic.mvp.Presenter import code.name.monkey.retromusic.mvp.contract.HomeContract import code.name.monkey.retromusic.ui.adapter.HomeAdapter.Companion.GENRES @@ -26,42 +26,25 @@ 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.android.schedulers.AndroidSchedulers import io.reactivex.disposables.CompositeDisposable import io.reactivex.disposables.Disposable -import io.reactivex.functions.Function7 operator fun CompositeDisposable.plusAssign(disposable: Disposable) { add(disposable) } class HomePresenter(private val view: HomeContract.HomeView) : Presenter(), HomeContract.HomePresenter { + private val hashSet: HashSet = HashSet() + override fun homeSections() { - disposable += Observable.combineLatest(repository.suggestionSongs, repository.recentAlbums, - repository.topAlbums, repository.recentArtists, repository.topArtists, - repository.allGenres, repository.favoritePlaylist, - Function7, ArrayList, ArrayList, ArrayList, - ArrayList, ArrayList, ArrayList, List> - { suggestions: ArrayList, recentAlbums: ArrayList, - topAlbums: ArrayList, recentArtists: ArrayList, - topArtists: ArrayList, genres: ArrayList, - favoritePlaylist: ArrayList -> - val homes: ArrayList = ArrayList() - if (suggestions.isNotEmpty()) homes.add(Home(R.string.suggestion_songs, 0, suggestions, SUGGESTIONS, R.drawable.ic_audiotrack_black_24dp)) - if (recentArtists.isNotEmpty()) homes.add(Home(R.string.recent_artists, 0, recentArtists, RECENT_ARTISTS, R.drawable.ic_artist_white_24dp)) - if (recentAlbums.isNotEmpty()) homes.add(Home(R.string.recent_albums, 0, recentAlbums, RECENT_ALBUMS, R.drawable.ic_album_white_24dp)) - if (topArtists.isNotEmpty()) homes.add(Home(R.string.top_artists, 0, topArtists, TOP_ARTISTS, R.drawable.ic_artist_white_24dp)) - if (topAlbums.isNotEmpty()) homes.add(Home(R.string.top_albums, 0, topAlbums, TOP_ALBUMS, R.drawable.ic_album_white_24dp)) - if (favoritePlaylist.isNotEmpty()) homes.add(Home(R.string.favorites, 0, favoritePlaylist, PLAYLISTS, R.drawable.ic_favorite_white_24dp)) - if (genres.isNotEmpty() && PreferenceUtil.getInstance().isGenreShown) homes.add(Home(R.string.genres, 0, genres, GENRES, R.drawable.ic_guitar_acoustic_white_24dp)) - homes - }).subscribe({ homes -> - if (homes.isNotEmpty()) { - view.showData(homes as ArrayList) - } - }, { - view.showEmpty() - }, { }) + loadSuggestions() + loadRecentArtists() + loadRecentAlbums() + loadTopArtists() + loadATopAlbums() + loadFavorite() + if (PreferenceUtil.getInstance().isGenreShown) loadGenre() } override fun subscribe() { @@ -71,4 +54,81 @@ class HomePresenter(private val view: HomeContract.HomeView) : Presenter(), Home override fun unsubscribe() { disposable.dispose() } + + private fun loadSuggestions() { + disposable += repository.suggestionSongs + .observeOn(AndroidSchedulers.mainThread()) + .subscribe({ + if (it.isNotEmpty()) hashSet.add(Home(5, R.string.suggestion_songs, 0, it, SUGGESTIONS, R.drawable.ic_audiotrack_black_24dp)) + view.showData(ArrayList(hashSet)) + }, { + view.showEmpty() + }) + } + + private fun loadRecentArtists() { + disposable += repository.recentArtists + .observeOn(AndroidSchedulers.mainThread()) + .subscribe({ + if (it.isNotEmpty()) hashSet.add(Home(0, R.string.recent_artists, 0, it, RECENT_ARTISTS, R.drawable.ic_artist_white_24dp)) + view.showData(ArrayList(hashSet)) + }, { + view.showEmpty() + }) + } + + private fun loadRecentAlbums() { + disposable += repository.recentAlbums + .observeOn(AndroidSchedulers.mainThread()) + .subscribe({ + if (it.isNotEmpty()) hashSet.add(Home(1, R.string.recent_albums, 0, it, RECENT_ALBUMS, R.drawable.ic_album_white_24dp)) + view.showData(ArrayList(hashSet)) + }, { + view.showEmpty() + }) + } + + private fun loadATopAlbums() { + disposable += repository.topAlbums + .observeOn(AndroidSchedulers.mainThread()) + .subscribe({ + if (it.isNotEmpty()) hashSet.add(Home(2, R.string.top_albums, 0, it, TOP_ALBUMS, R.drawable.ic_album_white_24dp)) + view.showData(ArrayList(hashSet)) + }, { + view.showEmpty() + }) + } + + private fun loadTopArtists() { + disposable += repository.topArtists + .observeOn(AndroidSchedulers.mainThread()) + .subscribe({ + if (it.isNotEmpty()) hashSet.add(Home(3, R.string.top_artists, 0, it, TOP_ARTISTS, R.drawable.ic_artist_white_24dp)) + view.showData(ArrayList(hashSet)) + }, { + view.showEmpty() + }) + } + + private fun loadFavorite() { + disposable += repository.favoritePlaylist + .observeOn(AndroidSchedulers.mainThread()) + .subscribe({ + if (it.isNotEmpty()) hashSet.add(Home(4, R.string.favorites, 0, it, PLAYLISTS, R.drawable.ic_favorite_white_24dp)) + view.showData(ArrayList(hashSet)) + }, { + view.showEmpty() + }) + } + + private fun loadGenre() { + disposable += repository.allGenres + .observeOn(AndroidSchedulers.mainThread()) + .subscribe({ + if (it.isNotEmpty()) hashSet.add(Home(6, R.string.genres, 0, it, GENRES, R.drawable.ic_guitar_acoustic_white_24dp)) + view.showData(ArrayList(hashSet)) + }, { + view.showEmpty() + }) + } } diff --git a/app/src/main/java/code/name/monkey/retromusic/transform/RoundStackTransformer.java b/app/src/main/java/code/name/monkey/retromusic/transform/RoundStackTransformer.java new file mode 100644 index 000000000..abeb39e16 --- /dev/null +++ b/app/src/main/java/code/name/monkey/retromusic/transform/RoundStackTransformer.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2019 Hemanth Savarala. + * + * Licensed under the GNU General Public License v3 + * + * This is free software: you can redistribute it and/or modify it under + * the terms of the GNU General Public License as published by + * the Free Software Foundation either version 3 of the License, or (at your option) any later version. + * + * This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + */ + +package code.name.monkey.retromusic.transform; + +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.viewpager.widget.ViewPager; + +/** + * Created by hemanths on 3/9/19 + */ +public class RoundStackTransformer implements ViewPager.PageTransformer { + @Override + public void transformPage(@NonNull View page, float position) { + + } +} diff --git a/app/src/main/java/code/name/monkey/retromusic/transform/StackPagerTransformer.kt b/app/src/main/java/code/name/monkey/retromusic/transform/StackPagerTransformer.kt index 8a80393a6..8215c423a 100644 --- a/app/src/main/java/code/name/monkey/retromusic/transform/StackPagerTransformer.kt +++ b/app/src/main/java/code/name/monkey/retromusic/transform/StackPagerTransformer.kt @@ -21,7 +21,12 @@ class StackPagerTransformer : ViewPager.PageTransformer { override fun transformPage(view: View, position: Float) { - if (position <= 0f) { + + if (position < -1f) { + view.translationX = view.width * position + } + + if (position < 0f) { view.translationX = 0f view.scaleX = 1f view.scaleY = 1f diff --git a/app/src/main/java/code/name/monkey/retromusic/transform/StackTransformer.kt b/app/src/main/java/code/name/monkey/retromusic/transform/VerticalStackTransformer.kt similarity index 94% rename from app/src/main/java/code/name/monkey/retromusic/transform/StackTransformer.kt rename to app/src/main/java/code/name/monkey/retromusic/transform/VerticalStackTransformer.kt index 6d374245c..b4b09f5be 100644 --- a/app/src/main/java/code/name/monkey/retromusic/transform/StackTransformer.kt +++ b/app/src/main/java/code/name/monkey/retromusic/transform/VerticalStackTransformer.kt @@ -17,7 +17,7 @@ package code.name.monkey.retromusic.transform import android.view.View import androidx.viewpager.widget.ViewPager -class StackTransformer : ViewPager.PageTransformer { +class VerticalStackTransformer : ViewPager.PageTransformer { override fun transformPage(page: View, position: Float) { if (position >= 0) { page.scaleX = (0.9f - 0.05f * position) 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 0309e9235..afc8f2d83 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 @@ -109,7 +109,7 @@ class AlbumDetailsActivity : AbsSlidingMusicPanelActivity(), AlbumDetailsContrac } private fun setupRecyclerView() { - simpleSongAdapter = SimpleSongAdapter(this, ArrayList(), R.layout.item_song) + simpleSongAdapter = SimpleSongAdapter(this, ArrayList(), R.layout.item_song,false) recyclerView.apply { layoutManager = LinearLayoutManager(this@AlbumDetailsActivity) itemAnimator = DefaultItemAnimator() 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 11e91bb69..a8c2a457a 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 @@ -166,7 +166,7 @@ class ArtistDetailActivity : AbsSlidingMusicPanelActivity(), ArtistDetailContrac layoutManager = GridLayoutManager(this.context, 1, GridLayoutManager.HORIZONTAL, false) adapter = albumAdapter } - songAdapter = SimpleSongAdapter(this, ArrayList(), R.layout.item_song) + songAdapter = SimpleSongAdapter(this, ArrayList(), R.layout.item_song, false) recyclerView.apply { itemAnimator = DefaultItemAnimator() layoutManager = LinearLayoutManager(this.context) diff --git a/app/src/main/java/code/name/monkey/retromusic/ui/activities/PlayingQueueActivity.kt b/app/src/main/java/code/name/monkey/retromusic/ui/activities/PlayingQueueActivity.kt index c4b66f962..7fbc75c72 100644 --- a/app/src/main/java/code/name/monkey/retromusic/ui/activities/PlayingQueueActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/ui/activities/PlayingQueueActivity.kt @@ -146,7 +146,7 @@ class PlayingQueueActivity : AbsMusicServiceActivity() { setSupportActionBar(toolbar) title = null toolbar.setNavigationOnClickListener { onBackPressed() } - ToolbarContentTintHelper.colorBackButton(toolbar, ThemeStore.accentColor(this)) + ToolbarContentTintHelper.colorBackButton(toolbar, ThemeStore.textColorSecondary(this)) clearQueue.setColor(ThemeStore.accentColor(this)) } } diff --git a/app/src/main/java/code/name/monkey/retromusic/ui/activities/WhatsNewActivity.java b/app/src/main/java/code/name/monkey/retromusic/ui/activities/WhatsNewActivity.java index 00ba10ad7..f7f2081a9 100644 --- a/app/src/main/java/code/name/monkey/retromusic/ui/activities/WhatsNewActivity.java +++ b/app/src/main/java/code/name/monkey/retromusic/ui/activities/WhatsNewActivity.java @@ -15,6 +15,8 @@ import java.io.InputStreamReader; import androidx.annotation.NonNull; import androidx.appcompat.widget.Toolbar; +import androidx.recyclerview.widget.LinearSmoothScroller; +import androidx.recyclerview.widget.RecyclerView; import code.name.monkey.appthemehelper.ThemeStore; import code.name.monkey.appthemehelper.util.ATHUtil; import code.name.monkey.appthemehelper.util.ColorUtil; @@ -52,7 +54,7 @@ public class WhatsNewActivity extends AbsBaseActivity { webView = findViewById(R.id.webView); title = findViewById(R.id.bannerTitle); toolbar = findViewById(R.id.toolbar); - appBarLayout= findViewById(R.id.appBarLayout); + appBarLayout = findViewById(R.id.appBarLayout); setStatusbarColorAuto(); @@ -65,7 +67,7 @@ public class WhatsNewActivity extends AbsBaseActivity { setTitle(null); toolbar.setNavigationOnClickListener(v -> onBackPressed()); title.setTextColor(ThemeStore.Companion.textColorPrimary(this)); -ToolbarContentTintHelper.colorBackButton(toolbar,ThemeStore.Companion.textColorSecondary(this)); + ToolbarContentTintHelper.colorBackButton(toolbar, ThemeStore.Companion.textColorSecondary(this)); try { // Load from phonograph-changelog.html in the assets folder @@ -84,7 +86,7 @@ ToolbarContentTintHelper.colorBackButton(toolbar,ThemeStore.Companion.textColorS .replace("{style-placeholder}", String.format("body { background-color: %s; color: %s; }", backgroundColor, contentColor)) .replace("{link-color}", colorToHex(ThemeStore.Companion.accentColor(this))) - .replace("{link-color-active}", colorToHex(ColorUtil.INSTANCE.lightenColor(ThemeStore.Companion.accentColor(this)))) + .replace("{link-color-active}", colorToHex(ColorUtil.INSTANCE.lightenColor(ThemeStore.Companion.accentColor(this)))) , "text/html", "UTF-8"); } catch (Throwable e) { webView.loadData("

Unable to load

" + e.getLocalizedMessage() + "

", "text/html", "UTF-8"); diff --git a/app/src/main/java/code/name/monkey/retromusic/ui/activities/base/AbsSlidingMusicPanelActivity.kt b/app/src/main/java/code/name/monkey/retromusic/ui/activities/base/AbsSlidingMusicPanelActivity.kt index 351ba9d31..c104c7422 100644 --- a/app/src/main/java/code/name/monkey/retromusic/ui/activities/base/AbsSlidingMusicPanelActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/ui/activities/base/AbsSlidingMusicPanelActivity.kt @@ -14,6 +14,7 @@ import code.name.monkey.retromusic.R import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.ui.fragments.MiniPlayerFragment import code.name.monkey.retromusic.ui.fragments.NowPlayingScreen +import code.name.monkey.retromusic.ui.fragments.NowPlayingScreen.* import code.name.monkey.retromusic.ui.fragments.base.AbsPlayerFragment import code.name.monkey.retromusic.ui.fragments.player.adaptive.AdaptiveFragment import code.name.monkey.retromusic.ui.fragments.player.blur.BlurPlayerFragment @@ -23,11 +24,12 @@ import code.name.monkey.retromusic.ui.fragments.player.color.ColorFragment import code.name.monkey.retromusic.ui.fragments.player.fit.FitFragment import code.name.monkey.retromusic.ui.fragments.player.flat.FlatPlayerFragment import code.name.monkey.retromusic.ui.fragments.player.full.FullPlayerFragment -import code.name.monkey.retromusic.ui.fragments.player.tiny.TinyPlayerFragment import code.name.monkey.retromusic.ui.fragments.player.material.MaterialFragment import code.name.monkey.retromusic.ui.fragments.player.normal.PlayerFragment import code.name.monkey.retromusic.ui.fragments.player.plain.PlainPlayerFragment import code.name.monkey.retromusic.ui.fragments.player.simple.SimplePlayerFragment +import code.name.monkey.retromusic.ui.fragments.player.slide.SlidePlayerFragment +import code.name.monkey.retromusic.ui.fragments.player.tiny.TinyPlayerFragment import code.name.monkey.retromusic.util.PreferenceUtil import code.name.monkey.retromusic.views.BottomNavigationBarTinted import com.sothree.slidinguppanel.SlidingUpPanelLayout @@ -83,7 +85,7 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity(), Sliding } fun setAntiDragView(antiDragView: View) { - slidingLayout.setAntiDragView(antiDragView); + slidingLayout.setAntiDragView(antiDragView) } private fun collapsePanel() { @@ -180,19 +182,20 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity(), Sliding currentNowPlayingScreen = PreferenceUtil.getInstance().nowPlayingScreen val fragment: Fragment = when (currentNowPlayingScreen) { - NowPlayingScreen.BLUR -> BlurPlayerFragment() - NowPlayingScreen.ADAPTIVE -> AdaptiveFragment() - NowPlayingScreen.NORMAL -> PlayerFragment() - NowPlayingScreen.CARD -> CardFragment() - NowPlayingScreen.BLUR_CARD -> CardBlurFragment() - NowPlayingScreen.FIT -> FitFragment() - NowPlayingScreen.FLAT -> FlatPlayerFragment() - NowPlayingScreen.FULL -> FullPlayerFragment() - NowPlayingScreen.PLAIN -> PlainPlayerFragment() - NowPlayingScreen.SIMPLE -> SimplePlayerFragment() - NowPlayingScreen.MATERIAL -> MaterialFragment() - NowPlayingScreen.COLOR -> ColorFragment() - NowPlayingScreen.TINY -> TinyPlayerFragment() + BLUR -> BlurPlayerFragment() + ADAPTIVE -> AdaptiveFragment() + NORMAL -> PlayerFragment() + CARD -> CardFragment() + BLUR_CARD -> CardBlurFragment() + FIT -> FitFragment() + FLAT -> FlatPlayerFragment() + FULL -> FullPlayerFragment() + PLAIN -> PlainPlayerFragment() + SIMPLE -> SimplePlayerFragment() + MATERIAL -> MaterialFragment() + COLOR -> ColorFragment() + TINY -> TinyPlayerFragment() + SLIDE -> SlidePlayerFragment() else -> PlayerFragment() } // must implement AbsPlayerFragment supportFragmentManager.beginTransaction().replace(R.id.playerFragmentContainer, fragment).commit() @@ -256,15 +259,15 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity(), Sliding val isColorLight = ColorUtil.isColorLight(paletteColor) if (PreferenceUtil.getInstance().adaptiveColor && - (currentNowPlayingScreen == NowPlayingScreen.NORMAL || currentNowPlayingScreen == NowPlayingScreen.FLAT)) { + (currentNowPlayingScreen == NORMAL || currentNowPlayingScreen == FLAT)) { super.setLightNavigationBar(true) super.setLightStatusbar(isColorLight) - } else if (currentNowPlayingScreen == NowPlayingScreen.FULL || currentNowPlayingScreen == NowPlayingScreen.CARD || - currentNowPlayingScreen == NowPlayingScreen.FIT || /*currentNowPlayingScreen == NowPlayingScreen.CLASSIC ||*/ - currentNowPlayingScreen == NowPlayingScreen.BLUR || currentNowPlayingScreen == NowPlayingScreen.BLUR_CARD) { + } else if (currentNowPlayingScreen == FULL || (currentNowPlayingScreen == SLIDE) || currentNowPlayingScreen == CARD || + currentNowPlayingScreen == FIT || /*currentNowPlayingScreen == NowPlayingScreen.CLASSIC ||*/ + currentNowPlayingScreen == BLUR || currentNowPlayingScreen == BLUR_CARD) { super.setLightStatusbar(false) super.setLightNavigationBar(true) - } else if (currentNowPlayingScreen == NowPlayingScreen.COLOR) { + } else if (currentNowPlayingScreen == COLOR) { super.setNavigationbarColor(paletteColor) super.setLightNavigationBar(isColorLight) super.setLightStatusbar(isColorLight) @@ -303,6 +306,7 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity(), Sliding super.setTaskDescriptionColor(color) } } + } /*import android.animation.ArgbEvaluator import android.animation.ValueAnimator 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 8ccbec9d4..951e6477e 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 @@ -31,7 +31,7 @@ import code.name.monkey.retromusic.views.MetalRecyclerViewPager import com.google.android.material.floatingactionbutton.FloatingActionButton -class HomeAdapter(private val activity: AppCompatActivity, private val homes: ArrayList, private val displayMetrics: DisplayMetrics) : RecyclerView.Adapter() { +class HomeAdapter(private val activity: AppCompatActivity, private val homes: List, private val displayMetrics: DisplayMetrics) : RecyclerView.Adapter() { override fun getItemViewType(position: Int): Int { diff --git a/app/src/main/java/code/name/monkey/retromusic/ui/adapter/song/SimpleSongAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/ui/adapter/song/SimpleSongAdapter.kt index 2d308ce65..7c2e680a6 100755 --- a/app/src/main/java/code/name/monkey/retromusic/ui/adapter/song/SimpleSongAdapter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/ui/adapter/song/SimpleSongAdapter.kt @@ -13,7 +13,8 @@ import java.util.* class SimpleSongAdapter(context: AppCompatActivity, songs: ArrayList, - @LayoutRes i: Int) : SongAdapter(context, songs, i, false, null) { + @LayoutRes i: Int, + val useNumbers: Boolean) : SongAdapter(context, songs, i, false, null) { private var textColor: Int = 0 @@ -36,7 +37,11 @@ class SimpleSongAdapter(context: AppCompatActivity, val fixedTrackNumber = MusicUtil.getFixedTrackNumber(dataSet[position].trackNumber) if (holder.imageText != null) { - holder.imageText!!.text = if (fixedTrackNumber > 0) fixedTrackNumber.toString() else "-" + if (useNumbers) { + holder.imageText!!.text = (position + 1).toString() + } else { + holder.imageText!!.text = if (fixedTrackNumber > 0) fixedTrackNumber.toString() else "-" + } holder.imageText!!.setTextColor(textColor) } diff --git a/app/src/main/java/code/name/monkey/retromusic/ui/adapter/song/SongAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/ui/adapter/song/SongAdapter.kt index 91dece637..6164bfd93 100644 --- a/app/src/main/java/code/name/monkey/retromusic/ui/adapter/song/SongAdapter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/ui/adapter/song/SongAdapter.kt @@ -38,7 +38,6 @@ open class SongAdapter @JvmOverloads constructor(protected val activity: AppComp @param:LayoutRes protected var itemLayoutRes: Int, usePalette: Boolean, cabHolder: CabHolder?, showSectionName: Boolean = true) : AbsMultiSelectAdapter(activity, cabHolder, R.menu.menu_media_selection), MaterialCab.Callback, FastScrollRecyclerView.SectionedAdapter { var dataSet: ArrayList - protected set protected var usePalette = false private var showSectionName = true diff --git a/app/src/main/java/code/name/monkey/retromusic/ui/fragments/NowPlayingScreen.kt b/app/src/main/java/code/name/monkey/retromusic/ui/fragments/NowPlayingScreen.kt index f11decc58..f9fe46d5d 100644 --- a/app/src/main/java/code/name/monkey/retromusic/ui/fragments/NowPlayingScreen.kt +++ b/app/src/main/java/code/name/monkey/retromusic/ui/fragments/NowPlayingScreen.kt @@ -21,6 +21,7 @@ enum class NowPlayingScreen constructor(@param:StringRes @field:StringRes NORMAL(R.string.normal, R.drawable.np_normal, 0), PLAIN(R.string.plain, R.drawable.np_plain, 3), TINY(R.string.tiny, R.drawable.np_tiny, 7), - SIMPLE(R.string.simple, R.drawable.np_simple, 8) + SIMPLE(R.string.simple, R.drawable.np_simple, 8), + SLIDE(R.string.slide, R.drawable.np_slide, 13) } 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 8583fc5d7..61a912c06 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 @@ -211,8 +211,9 @@ class BannerHomeFragment : AbsMainActivityFragment(), MainActivityFragmentCallba } override fun showData(list: ArrayList) { + val finalList = list.sortedWith(compareBy { it.priority }) recyclerView.apply { - val homeAdapter = HomeAdapter(mainActivity, list, displayMetrics) + val homeAdapter = HomeAdapter(mainActivity, finalList, displayMetrics) layoutManager = LinearLayoutManager(mainActivity) adapter = homeAdapter } diff --git a/app/src/main/java/code/name/monkey/retromusic/ui/fragments/player/card/CardPlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/ui/fragments/player/card/CardPlaybackControlsFragment.kt index 0f1b4a80c..144e2a4e4 100644 --- a/app/src/main/java/code/name/monkey/retromusic/ui/fragments/player/card/CardPlaybackControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/ui/fragments/player/card/CardPlaybackControlsFragment.kt @@ -111,7 +111,7 @@ class CardPlaybackControlsFragment : AbsPlayerControlsFragment() { } override fun setDark(color: Int) { - image!!.setColorFilter(color, PorterDuff.Mode.SRC_IN) + if (ColorUtil.isColorLight(ATHUtil.resolveColor(context, android.R.attr.windowBackground))) { lastPlaybackControlsColor = MaterialValueHelper.getSecondaryTextColor(activity, true) lastDisabledPlaybackControlsColor = MaterialValueHelper.getSecondaryDisabledTextColor(activity, true) @@ -132,7 +132,7 @@ class CardPlaybackControlsFragment : AbsPlayerControlsFragment() { } else { ThemeStore.accentColor(context!!) } - + image.setColorFilter(colorFinal, PorterDuff.Mode.SRC_IN) TintHelper.setTintAuto(playPauseButton, MaterialValueHelper.getPrimaryTextColor(context, ColorUtil.isColorLight(colorFinal)), false) TintHelper.setTintAuto(playPauseButton, colorFinal, true) diff --git a/app/src/main/java/code/name/monkey/retromusic/ui/fragments/player/color/ColorFragment.kt b/app/src/main/java/code/name/monkey/retromusic/ui/fragments/player/color/ColorFragment.kt index aeb9f5bc8..cebed5141 100644 --- a/app/src/main/java/code/name/monkey/retromusic/ui/fragments/player/color/ColorFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/ui/fragments/player/color/ColorFragment.kt @@ -305,12 +305,12 @@ class ColorFragment : AbsPlayerFragment() { } } -private fun Palette.getContrastColor(background: Int): Int { +fun Palette.getContrastColor(background: Int): Int { return 0 } -private fun Palette.getColor(): Int { +fun Palette.getColor(): Int { return when { darkMutedSwatch != null -> darkMutedSwatch!!.rgb mutedSwatch != null -> mutedSwatch!!.rgb diff --git a/app/src/main/java/code/name/monkey/retromusic/ui/fragments/player/slide/SlidePlayerFragment.kt b/app/src/main/java/code/name/monkey/retromusic/ui/fragments/player/slide/SlidePlayerFragment.kt new file mode 100644 index 000000000..0b1570bcf --- /dev/null +++ b/app/src/main/java/code/name/monkey/retromusic/ui/fragments/player/slide/SlidePlayerFragment.kt @@ -0,0 +1,336 @@ +/* + * Copyright (c) 2019 Hemanth Savarala. + * + * Licensed under the GNU General Public License v3 + * + * This is free software: you can redistribute it and/or modify it under + * the terms of the GNU General Public License as published by + * the Free Software Foundation either version 3 of the License, or (at your option) any later version. + * + * This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + */ + +package code.name.monkey.retromusic.ui.fragments.player.slide + +import android.animation.ObjectAnimator +import android.graphics.Color +import android.graphics.PorterDuff +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.view.animation.LinearInterpolator +import android.widget.SeekBar +import androidx.appcompat.app.AppCompatActivity +import androidx.appcompat.widget.Toolbar +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.LinearSmoothScroller +import androidx.recyclerview.widget.RecyclerView +import code.name.monkey.appthemehelper.ThemeStore +import code.name.monkey.appthemehelper.util.* +import code.name.monkey.retromusic.R +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.helper.MusicProgressViewUpdateHelper +import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler +import code.name.monkey.retromusic.misc.SimpleOnSeekbarChangeListener +import code.name.monkey.retromusic.model.Song +import code.name.monkey.retromusic.service.MusicService +import code.name.monkey.retromusic.ui.activities.base.AbsSlidingMusicPanelActivity +import code.name.monkey.retromusic.ui.adapter.song.SimpleSongAdapter +import code.name.monkey.retromusic.ui.fragments.VolumeFragment +import code.name.monkey.retromusic.ui.fragments.base.AbsPlayerControlsFragment +import code.name.monkey.retromusic.ui.fragments.base.AbsPlayerFragment +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_slide_player.* + +/** + * Created by hemanths on 3/15/19 + */ +class SlidePlayerFragment : AbsPlayerFragment(), MusicProgressViewUpdateHelper.Callback { + private var lastColor: Int = 0 + override val paletteColor: Int + get() = lastColor + + override fun playerToolbar(): Toolbar { + return playerToolbar + } + + override fun onShow() { + + } + + override fun onHide() { + + } + + override fun onBackPressed(): Boolean { + return false + } + + override fun toolbarIconColor(): Int { + return Color.WHITE + } + + override fun onColorChanged(color: Int) { + + } + + override fun onFavoriteToggled() { + toggleFavorite(MusicPlayerRemote.currentSong) + } + + override fun toggleFavorite(song: Song) { + super.toggleFavorite(song) + if (song.id == MusicPlayerRemote.currentSong.id) { + updateIsFavorite() + } + } + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + return inflater.inflate(R.layout.fragment_slide_player, container, false) + } + + override fun onResume() { + super.onResume() + progressViewUpdateHelper.start() + } + + override fun onPause() { + super.onPause() + progressViewUpdateHelper.stop() + } + + + override fun onPlayingMetaChanged() { + super.onPlayingMetaChanged() + updateSong() + updateIsFavorite() + } + + override fun onQueueChanged() { + super.onQueueChanged() + updateQueue() + } + + override fun onServiceConnected() { + updatePlayPauseDrawableState() + updateRepeatState() + updateShuffleState() + updateSong() + updateIsFavorite() + updateQueue() + } + + private fun updateQueue() { + songAdapter.swapDataSet(MusicPlayerRemote.playingQueue) + } + + private lateinit var volumeFragment: VolumeFragment + + + private fun updatePlayPauseDrawableState() { + if (MusicPlayerRemote.isPlaying) { + albumCoverContainer.cardElevation = 24.0f + playPauseButton.setImageResource(R.drawable.ic_pause_white_24dp) + } else { + albumCoverContainer.cardElevation = 0.0f + playPauseButton.setImageResource(R.drawable.ic_play_arrow_white_24dp) + } + } + + fun updateRepeatState() { + when (MusicPlayerRemote.repeatMode) { + MusicService.REPEAT_MODE_NONE -> { + repeatButton.setImageResource(R.drawable.ic_repeat_white_24dp) + repeatButton.setColorFilter(lastDisabledPlaybackControlsColor, PorterDuff.Mode.SRC_IN) + } + MusicService.REPEAT_MODE_ALL -> { + repeatButton.setImageResource(R.drawable.ic_repeat_white_24dp) + repeatButton.setColorFilter(lastPlaybackControlsColor, PorterDuff.Mode.SRC_IN) + } + MusicService.REPEAT_MODE_THIS -> { + repeatButton.setImageResource(R.drawable.ic_repeat_one_white_24dp) + repeatButton.setColorFilter(lastPlaybackControlsColor, PorterDuff.Mode.SRC_IN) + } + } + } + + fun updateShuffleState() { + when (MusicPlayerRemote.shuffleMode) { + MusicService.SHUFFLE_MODE_SHUFFLE -> shuffleButton.setColorFilter(lastPlaybackControlsColor, PorterDuff.Mode.SRC_IN) + else -> shuffleButton.setColorFilter(lastDisabledPlaybackControlsColor, PorterDuff.Mode.SRC_IN) + } + } + + + private fun updateSong() { + val song = MusicPlayerRemote.currentSong + title.text = song.title + text.text = song.artistName + + GlideApp.with(activity!!).asBitmapPalette() + .load(RetroGlideExtension.getSongModel(song)) + .songOptions(song) + .transition(RetroGlideExtension.getDefaultTransition()) + .into(object : RetroMusicColoredTarget(playerImage) { + override fun onColorReady(color: Int) { + setColor(color) + } + }) + } + + private fun setColor(color: Int) { + lastColor = color + val colorBg = ATHUtil.resolveColor(context!!, android.R.attr.colorBackground) + if (ColorUtil.isColorLight(colorBg)) { + lastPlaybackControlsColor = MaterialValueHelper.getSecondaryTextColor(context!!, true) + lastDisabledPlaybackControlsColor = MaterialValueHelper.getSecondaryDisabledTextColor(context!!, true) + } else { + lastPlaybackControlsColor = MaterialValueHelper.getPrimaryTextColor(context!!, false) + lastDisabledPlaybackControlsColor = MaterialValueHelper.getPrimaryDisabledTextColor(context!!, false) + } + + val colorFinal = if (PreferenceUtil.getInstance().adaptiveColor) { + color + } else { + ThemeStore.accentColor(context!!) + } + + + volumeFragment.setTintable(colorFinal) + text.setTextColor(colorFinal) + playerQueueSubHeader.setTextColor(colorFinal) + TintHelper.setTintAuto(playPauseButton, lastPlaybackControlsColor, false) + ViewUtil.setProgressDrawable(progressSlider, colorFinal) + + updateRepeatState() + updateShuffleState() + updatePrevNextColor() + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setUpMusicControllers() + setUpPlayerToolbar() + (activity as AbsSlidingMusicPanelActivity).setAntiDragView(recyclerView) + playerQueueSubHeader.setTextColor(ThemeStore.accentColor(context!!)) + } + + private fun setUpMusicControllers() { + setUpPlayPauseFab() + setUpPrevNext() + setUpRepeatButton() + setUpShuffleButton() + setUpProgressSlider() + setUpRecyclerView() + volumeFragment = childFragmentManager.findFragmentById(R.id.volumeFragment) as VolumeFragment + volumeFragmentToggle.visibility = if (PreferenceUtil.getInstance().volumeToggle) View.VISIBLE else View.GONE + } + + private lateinit var songAdapter: SimpleSongAdapter + + private fun setUpRecyclerView() { + songAdapter = SimpleSongAdapter(context = activity as AppCompatActivity, + songs = ArrayList(), i = R.layout.item_song, useNumbers = true) + recyclerView.apply { + adapter = songAdapter + layoutManager = LinearLayoutManager(context) + } + } + + private fun setUpProgressSlider() { + progressSlider.setOnSeekBarChangeListener(object : SimpleOnSeekbarChangeListener() { + override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) { + if (fromUser) { + MusicPlayerRemote.seekTo(progress) + onUpdateProgressViews(MusicPlayerRemote.songProgressMillis, MusicPlayerRemote.songDurationMillis) + } + } + }) + } + + override fun onUpdateProgressViews(progress: Int, total: Int) { + progressSlider.max = total + + val animator = ObjectAnimator.ofInt(progressSlider, "progress", progress) + animator.duration = AbsPlayerControlsFragment.SLIDER_ANIMATION_TIME + animator.interpolator = LinearInterpolator() + animator.start() + + songTotalTime.text = MusicUtil.getReadableDurationString(total.toLong()) + songCurrentProgress.text = MusicUtil.getReadableDurationString(progress.toLong()) + } + + private fun setUpPlayPauseFab() { + playPauseButton.setOnClickListener(PlayPauseButtonOnClickHandler()) + } + + private fun setUpRepeatButton() { + repeatButton.setOnClickListener { MusicPlayerRemote.cycleRepeatMode() } + } + + private fun setUpShuffleButton() { + shuffleButton.setOnClickListener { MusicPlayerRemote.toggleShuffleMode() } + } + + private fun setUpPrevNext() { + updatePrevNextColor() + nextButton.setOnClickListener { MusicPlayerRemote.playNextSong() } + previousButton.setOnClickListener { MusicPlayerRemote.back() } + } + + private fun updatePrevNextColor() { + nextButton.setColorFilter(lastPlaybackControlsColor, PorterDuff.Mode.SRC_IN) + previousButton.setColorFilter(lastPlaybackControlsColor, PorterDuff.Mode.SRC_IN) + } + + private var lastPlaybackControlsColor: Int = 0 + private var lastDisabledPlaybackControlsColor: Int = 0 + private lateinit var progressViewUpdateHelper: MusicProgressViewUpdateHelper + + override fun onPlayStateChanged() { + updatePlayPauseDrawableState() + } + + override fun onRepeatModeChanged() { + updateRepeatState() + } + + override fun onShuffleModeChanged() { + updateShuffleState() + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + progressViewUpdateHelper = MusicProgressViewUpdateHelper(this) + } + + private fun setUpPlayerToolbar() { + playerToolbar.inflateMenu(R.menu.menu_player) + playerToolbar.setNavigationOnClickListener { activity!!.onBackPressed() } + playerToolbar.setOnMenuItemClickListener(this) + + ToolbarContentTintHelper.colorizeToolbar(playerToolbar, Color.WHITE, activity) + } + + fun RecyclerView.smoothSnapToPosition(position: Int, snapMode: Int = LinearSmoothScroller.SNAP_TO_START) { + val smoothScroller = object : LinearSmoothScroller(this.context) { + override fun getVerticalSnapPreference(): Int { + return snapMode + } + + override fun getHorizontalSnapPreference(): Int { + return snapMode + } + } + smoothScroller.targetPosition = position + this.layoutManager?.startSmoothScroll(smoothScroller) + } +} diff --git a/app/src/main/java/code/name/monkey/retromusic/util/PreferenceUtil.java b/app/src/main/java/code/name/monkey/retromusic/util/PreferenceUtil.java index f4f780fdc..c5f0b05e9 100644 --- a/app/src/main/java/code/name/monkey/retromusic/util/PreferenceUtil.java +++ b/app/src/main/java/code/name/monkey/retromusic/util/PreferenceUtil.java @@ -38,7 +38,7 @@ import code.name.monkey.retromusic.transform.DepthTransformation; import code.name.monkey.retromusic.transform.HingeTransformation; import code.name.monkey.retromusic.transform.HorizontalFlipTransformation; import code.name.monkey.retromusic.transform.NormalPageTransformer; -import code.name.monkey.retromusic.transform.StackTransformer; +import code.name.monkey.retromusic.transform.VerticalStackTransformer; import code.name.monkey.retromusic.transform.VerticalFlipTransformation; import code.name.monkey.retromusic.ui.activities.MainActivity; import code.name.monkey.retromusic.ui.fragments.AlbumCoverStyle; @@ -727,7 +727,7 @@ public final class PreferenceUtil { case 5: return new HingeTransformation(); case 6: - return new StackTransformer(); + return new VerticalStackTransformer(); } } diff --git a/app/src/main/java/code/name/monkey/retromusic/views/WidthFitSquareCardView.kt b/app/src/main/java/code/name/monkey/retromusic/views/WidthFitSquareCardView.kt new file mode 100644 index 000000000..6aaabe734 --- /dev/null +++ b/app/src/main/java/code/name/monkey/retromusic/views/WidthFitSquareCardView.kt @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2019 Hemanth Savarala. + * + * Licensed under the GNU General Public License v3 + * + * This is free software: you can redistribute it and/or modify it under + * the terms of the GNU General Public License as published by + * the Free Software Foundation either version 3 of the License, or (at your option) any later version. + * + * This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + */ + +package code.name.monkey.retromusic.views + +import android.content.Context +import android.util.AttributeSet + +import com.google.android.material.card.MaterialCardView + +/** + * Created by hemanths on 3/18/19 + */ +class WidthFitSquareCardView : MaterialCardView { + constructor(context: Context) : super(context) {} + + constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {} + + constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {} + + fun forceSquare(z: Boolean) { + this.forceSquare = z + requestLayout() + } + + override fun onMeasure(i: Int, i2: Int) { + var i2 = i2 + if (this.forceSquare) { + i2 = i + } + super.onMeasure(i, i2) + } + + private var forceSquare = true +} diff --git a/app/src/main/res/color/text_field_background.xml b/app/src/main/res/color/text_field_background.xml new file mode 100644 index 000000000..9089c1a79 --- /dev/null +++ b/app/src/main/res/color/text_field_background.xml @@ -0,0 +1,19 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable-xxxhdpi/np_slide.webp b/app/src/main/res/drawable-xxxhdpi/np_slide.webp new file mode 100644 index 000000000..fd3170770 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/np_slide.webp differ diff --git a/app/src/main/res/drawable/ic_home_selected_white_24dp.xml b/app/src/main/res/drawable/ic_home_selected_white_24dp.xml index 1ce34292f..832b57887 100644 --- a/app/src/main/res/drawable/ic_home_selected_white_24dp.xml +++ b/app/src/main/res/drawable/ic_home_selected_white_24dp.xml @@ -7,6 +7,5 @@ - + android:pathData="M9 11.75c-0.69 0-1.25 0.56 -1.25 1.25s0.56 1.25 1.25 1.25 1.25-0.56 1.25-1.25-0.56-1.25-1.25-1.25zm6 0c-0.69 0-1.25 0.56 -1.25 1.25s0.56 1.25 1.25 1.25 1.25-0.56 1.25-1.25-0.56-1.25-1.25-1.25zM12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8 0-0.29 0.02 -0.58 0.05 -0.86 2.36-1.05 4.23-2.98 5.21-5.37C11.07 8.33 14.05 10 17.42 10c0.78 0 1.53-0.09 2.25-0.26 0.21 0.71 0.33 1.47 0.33 2.26 0 4.41-3.59 8-8 8z" /> \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_home_white_24dp.xml b/app/src/main/res/drawable/ic_home_white_24dp.xml index 75b433712..b78bab9d9 100644 --- a/app/src/main/res/drawable/ic_home_white_24dp.xml +++ b/app/src/main/res/drawable/ic_home_white_24dp.xml @@ -4,9 +4,7 @@ android:height="24dp" android:viewportWidth="24" android:viewportHeight="24"> - - + android:pathData="M10.25 13c0 0.69-0.56 1.25-1.25 1.25S7.75 13.69 7.75 13s0.56-1.25 1.25-1.25 1.25 0.56 1.25 1.25zM15 11.75c-0.69 0-1.25 0.56 -1.25 1.25s0.56 1.25 1.25 1.25 1.25-0.56 1.25-1.25-0.56-1.25-1.25-1.25zm7 0.25c0 5.52-4.48 10-10 10S2 17.52 2 12 6.48 2 12 2s10 4.48 10 10zM10.66 4.12C12.06 6.44 14.6 8 17.5 8c0.46 0 0.91-0.05 1.34-0.12C17.44 5.56 14.9 4 12 4c-0.46 0-0.91 0.05 -1.34 0.12 zM4.42 9.47c1.71-0.97 3.03-2.55 3.66-4.44C6.37 6 5.05 7.58 4.42 9.47zM20 12c0-0.78-0.12-1.53-0.33-2.24-0.7 0.15 -1.42 0.24 -2.17 0.24 -3.13 0-5.92-1.44-7.76-3.69C8.69 8.87 6.6 10.88 4 11.86c0.01 0.04 0 0.09 0 0.14 0 4.41 3.59 8 8 8s8-3.59 8-8z" /> \ No newline at end of file diff --git a/app/src/main/res/drawable/material_design_outline.xml b/app/src/main/res/drawable/material_design_outline.xml new file mode 100644 index 000000000..3eb8f3d77 --- /dev/null +++ b/app/src/main/res/drawable/material_design_outline.xml @@ -0,0 +1,21 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout-land/fragment_slide_player.xml b/app/src/main/res/layout-land/fragment_slide_player.xml new file mode 100644 index 000000000..16ab42d4e --- /dev/null +++ b/app/src/main/res/layout-land/fragment_slide_player.xml @@ -0,0 +1,349 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ 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 2a167bc48..8e64d5d6d 100644 --- a/app/src/main/res/layout/abs_playlists.xml +++ b/app/src/main/res/layout/abs_playlists.xml @@ -6,21 +6,28 @@ android:orientation="vertical"> + android:background="@drawable/material_design_outline" + android:backgroundTint="?dividerColor" + android:gravity="center_vertical" + android:paddingStart="12dp" + android:paddingTop="6dp" + android:paddingEnd="12dp" + android:paddingBottom="6dp" + android:visibility="gone"> @@ -29,7 +36,8 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_horizontal" - android:orientation="horizontal"> + android:orientation="horizontal" + android:paddingTop="12dp"> + android:padding="16dp" /> + android:padding="16dp" /> + android:padding="16dp" /> + android:padding="16dp" /> diff --git a/app/src/main/res/layout/activity_song_tag_editor.xml b/app/src/main/res/layout/activity_song_tag_editor.xml index 02d96da76..d94e22489 100755 --- a/app/src/main/res/layout/activity_song_tag_editor.xml +++ b/app/src/main/res/layout/activity_song_tag_editor.xml @@ -53,11 +53,6 @@ - - - + android:layout_height="wrap_content" + app:boxBackgroundMode="outline" + app:boxCollapsedPaddingTop="16dp" + app:boxCornerRadiusBottomEnd="8dp" + app:boxCornerRadiusBottomStart="8dp" + app:boxCornerRadiusTopEnd="8dp" + + app:boxCornerRadiusTopStart="8dp" + app:boxStrokeColor="?android:attr/textColorPrimary" + app:boxStrokeWidth="1dp" + app:hintEnabled="true"> - + android:padding="14dp" /> + android:layout_height="wrap_content" + android:layout_marginTop="8dp" + app:boxBackgroundMode="outline" + app:boxCollapsedPaddingTop="16dp" + app:boxCornerRadiusBottomEnd="8dp" + app:boxCornerRadiusBottomStart="8dp" + app:boxCornerRadiusTopEnd="8dp" + app:boxCornerRadiusTopStart="8dp" + app:boxStrokeColor="?android:attr/textColorPrimary" + app:boxStrokeWidth="1dp" + app:hintEnabled="true"> - + android:padding="16dp" /> - + android:layout_height="wrap_content" + android:layout_marginTop="8dp" + app:boxBackgroundMode="outline" + app:boxCollapsedPaddingTop="16dp" + app:boxCornerRadiusBottomEnd="8dp" + app:boxCornerRadiusBottomStart="8dp" + app:boxCornerRadiusTopEnd="8dp" + app:boxCornerRadiusTopStart="8dp" + app:boxStrokeColor="?android:attr/textColorPrimary" + app:boxStrokeWidth="1dp" + app:hintEnabled="true"> + android:padding="16dp" /> + android:layout_height="wrap_content" + android:layout_marginTop="8dp" + app:boxBackgroundMode="outline" + app:boxCollapsedPaddingTop="16dp" + app:boxCornerRadiusBottomEnd="8dp" + app:boxCornerRadiusBottomStart="8dp" + app:boxCornerRadiusTopEnd="8dp" + app:boxCornerRadiusTopStart="8dp" + app:boxStrokeColor="?android:attr/textColorPrimary" + app:boxStrokeWidth="1dp" + app:hintEnabled="true"> + + android:padding="16dp" /> + android:layout_height="wrap_content" + android:layout_marginTop="8dp" + app:boxBackgroundMode="outline" + app:boxCollapsedPaddingTop="16dp" + app:boxCornerRadiusBottomEnd="8dp" + app:boxCornerRadiusBottomStart="8dp" + app:boxCornerRadiusTopEnd="8dp" + app:boxCornerRadiusTopStart="8dp" + app:boxStrokeColor="?android:attr/textColorPrimary" + app:boxStrokeWidth="1dp" + app:hintEnabled="true"> + android:padding="16dp" /> @@ -169,7 +210,18 @@ + android:layout_marginTop="8dp" + android:layout_weight="1" + app:boxBackgroundMode="outline" + app:boxCollapsedPaddingTop="16dp" + app:boxCornerRadiusBottomEnd="8dp" + app:boxCornerRadiusBottomStart="8dp" + app:boxCornerRadiusTopEnd="8dp" + app:boxCornerRadiusTopStart="8dp" + app:boxStrokeColor="?android:attr/textColorPrimary" + app:boxStrokeWidth="1dp" + app:hintEnabled="true"> + + android:padding="16dp" /> @@ -188,7 +240,19 @@ + android:layout_marginStart="8dp" + android:layout_marginTop="8dp" + android:layout_weight="1" + app:boxBackgroundMode="outline" + app:boxCollapsedPaddingTop="16dp" + app:boxCornerRadiusBottomEnd="8dp" + app:boxCornerRadiusBottomStart="8dp" + app:boxCornerRadiusTopEnd="8dp" + app:boxCornerRadiusTopStart="8dp" + app:boxStrokeColor="?android:attr/textColorPrimary" + app:boxStrokeWidth="1dp" + app:hintEnabled="true"> + + android:padding="16dp" /> + android:layout_height="wrap_content" + android:layout_marginTop="8dp" + app:boxBackgroundMode="outline" + app:boxCollapsedPaddingTop="16dp" + app:boxCornerRadiusBottomEnd="8dp" + app:boxCornerRadiusBottomStart="8dp" + app:boxCornerRadiusTopEnd="8dp" + app:boxCornerRadiusTopStart="8dp" + app:boxStrokeColor="?android:attr/textColorPrimary" + app:boxStrokeWidth="1dp" + app:hintEnabled="true"> + + android:padding="16dp" /> + android:layout_height="wrap_content" + android:layout_marginTop="8dp" + android:layout_weight="1" + app:boxBackgroundMode="outline" + app:boxCollapsedPaddingTop="16dp" + app:boxCornerRadiusBottomEnd="8dp" + app:boxCornerRadiusBottomStart="8dp" + app:boxCornerRadiusTopEnd="8dp" + app:boxCornerRadiusTopStart="8dp" + app:boxStrokeColor="?android:attr/textColorPrimary" + app:boxStrokeWidth="1dp" + app:hintEnabled="true"> + + android:padding="16dp" /> @@ -247,7 +334,7 @@ android:id="@+id/saveFab" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_gravity="center_horizontal|bottom" + android:layout_gravity="end|bottom" app:setIcon="@drawable/ic_save_white_24dp" app:setText="Save" app:showTitle="true" diff --git a/app/src/main/res/layout/dialog_add_to_playlist.xml b/app/src/main/res/layout/dialog_add_to_playlist.xml index 85626eff3..0d1375d9d 100644 --- a/app/src/main/res/layout/dialog_add_to_playlist.xml +++ b/app/src/main/res/layout/dialog_add_to_playlist.xml @@ -3,6 +3,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" + android:paddingBottom="16dp" android:orientation="vertical"> - - - + android:paddingBottom="16dp"> + style="@style/TextAppearance.MaterialComponents.Headline6" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:padding="16dp" + android:text="@string/remove_song_from_playlist_title" /> + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_file_share.xml b/app/src/main/res/layout/dialog_file_share.xml index 8f1a08480..c074bf736 100644 --- a/app/src/main/res/layout/dialog_file_share.xml +++ b/app/src/main/res/layout/dialog_file_share.xml @@ -4,13 +4,15 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" - android:padding="8dp"> + android:paddingBottom="16dp"> + style="@style/TextAppearance.MaterialComponents.Headline6" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:padding="16dp" + android:text="@string/what_do_you_want_to_share" /> + android:orientation="vertical" + android:paddingBottom="16dp"> @@ -15,16 +18,15 @@ android:id="@+id/actionNewPlaylistContainer" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginStart="12dp" - android:layout_marginTop="8dp" - android:layout_marginEnd="12dp" + android:layout_marginStart="8dp" + android:layout_marginEnd="8dp" app:boxBackgroundMode="outline" app:boxCollapsedPaddingTop="16dp" app:boxCornerRadiusBottomEnd="8dp" app:boxCornerRadiusBottomStart="8dp" app:boxCornerRadiusTopEnd="8dp" app:boxCornerRadiusTopStart="8dp" - app:boxStrokeColor="@color/md_grey_700" + app:boxStrokeColor="?android:attr/textColorPrimary" app:boxStrokeWidth="1dp" app:hintEnabled="true"> @@ -35,8 +37,7 @@ android:background="@null" android:hint="@string/playlist_name_empty" android:inputType="textPersonName|textCapWords|text" - android:padding="16dp" - android:textAppearance="@style/TextAppearance.AppCompat.Subhead" /> + android:padding="16dp" /> + app:backgroundTint="@color/md_pink_A400" + app:icon="@drawable/ic_playlist_add_white_24dp" /> 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 3bb572a73..1c3b399a2 100644 --- a/app/src/main/res/layout/dialog_remove_from_playlist.xml +++ b/app/src/main/res/layout/dialog_remove_from_playlist.xml @@ -4,12 +4,14 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" - android:paddingTop="8dp"> + android:paddingBottom="16dp"> + android:textAllCaps="false" + app:icon="@drawable/ic_delete_white_24dp" /> \ 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 28f05aeea..b8ed7a097 100644 --- a/app/src/main/res/layout/dialog_sleep_timer.xml +++ b/app/src/main/res/layout/dialog_sleep_timer.xml @@ -4,7 +4,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" - android:background="@android:color/transparent"> + android:paddingBottom="16dp"> - - + android:layout_height="wrap_content" + android:padding="16dp" + android:text="@string/action_sleep_timer" /> - - - + app:cardUseCompatPadding="false" + sothree:cardCornerRadius="12dp"> + android:src="@drawable/promotional" + android:visibility="gone" /> @@ -132,30 +133,23 @@ android:text="@string/action_share" app:icon="@drawable/ic_share_white_24dp" /> + + + + - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_slide_player.xml b/app/src/main/res/layout/fragment_slide_player.xml new file mode 100644 index 000000000..dd6ba6a3e --- /dev/null +++ b/app/src/main/res/layout/fragment_slide_player.xml @@ -0,0 +1,327 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/metal_section_recycler_view.xml b/app/src/main/res/layout/metal_section_recycler_view.xml index a83957357..b74be8c61 100644 --- a/app/src/main/res/layout/metal_section_recycler_view.xml +++ b/app/src/main/res/layout/metal_section_recycler_view.xml @@ -6,25 +6,32 @@ android:orientation="vertical"> + android:layout_margin="12dp" + android:background="@drawable/material_design_outline" + android:backgroundTint="?dividerColor" + android:gravity="center_vertical" + android:paddingStart="12dp" + android:paddingTop="6dp" + android:paddingEnd="12dp" + android:paddingBottom="6dp"> + android:layout_marginEnd="12dp" + app:srcCompat="@drawable/ic_person_white_24dp" /> + style="@style/SubTitleTextAppearance" + android:padding="0dp" + android:text="@string/for_you" /> - + android:background="@drawable/material_design_outline" + android:backgroundTint="?dividerColor" + android:gravity="center_vertical" + android:paddingStart="12dp" + android:paddingTop="6dp" + android:layout_margin="12dp" + android:paddingEnd="12dp" + android:paddingBottom="6dp"> + app:srcCompat="@drawable/ic_person_white_24dp" /> + style="@style/SubTitleTextAppearance" + android:padding="0dp" + android:text="@string/for_you" /> diff --git a/app/src/main/res/layout/section_recycler_view.xml b/app/src/main/res/layout/section_recycler_view.xml index 138af94ed..9cdb344c4 100644 --- a/app/src/main/res/layout/section_recycler_view.xml +++ b/app/src/main/res/layout/section_recycler_view.xml @@ -8,21 +8,29 @@ android:orientation="vertical"> + android:layout_margin="12dp" + android:background="@drawable/material_design_outline" + android:backgroundTint="?dividerColor" + android:gravity="center_vertical" + android:paddingStart="12dp" + android:paddingTop="6dp" + android:paddingEnd="12dp" + android:paddingBottom="6dp"> + android:layout_marginEnd="12dp" + app:srcCompat="@drawable/ic_person_white_24dp" /> + style="@style/SubTitleTextAppearance" + android:padding="0dp" + android:text="@string/for_you" /> diff --git a/app/src/main/res/menu/bottom_navigation_main.xml b/app/src/main/res/menu/bottom_navigation_main.xml index b6b9b8476..e1b5e00be 100644 --- a/app/src/main/res/menu/bottom_navigation_main.xml +++ b/app/src/main/res/menu/bottom_navigation_main.xml @@ -5,7 +5,7 @@ android:id="@+id/action_home" android:enabled="true" android:icon="@drawable/toggle_home" - android:title="@string/home" /> + android:title="@string/for_you" /> Composer Next Song Last song + Slide diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 3f8cf6d75..914917ed4 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -133,8 +133,8 @@ ?iconColor ?iconColor center_vertical - 12dp - 12dp + 8dp + 8dp 12dp @@ -148,4 +148,12 @@ + + + + diff --git a/app/src/main/res/values/styles_parents.xml b/app/src/main/res/values/styles_parents.xml index 55193cd56..3233306ba 100644 --- a/app/src/main/res/values/styles_parents.xml +++ b/app/src/main/res/values/styles_parents.xml @@ -44,6 +44,7 @@ @transition/grid_exit @transition/grid_exit @font/circular + diff --git a/appthemehelper/src/main/java/code/name/monkey/appthemehelper/common/views/ATEEditText.kt b/appthemehelper/src/main/java/code/name/monkey/appthemehelper/common/views/ATEEditText.kt index cf86a399f..5a2f71577 100755 --- a/appthemehelper/src/main/java/code/name/monkey/appthemehelper/common/views/ATEEditText.kt +++ b/appthemehelper/src/main/java/code/name/monkey/appthemehelper/common/views/ATEEditText.kt @@ -1,17 +1,16 @@ package code.name.monkey.appthemehelper.common.views import android.content.Context -import androidx.appcompat.widget.AppCompatEditText import android.util.AttributeSet - import code.name.monkey.appthemehelper.ATH import code.name.monkey.appthemehelper.ThemeStore +import com.google.android.material.textfield.TextInputEditText /** * @author Aidan Follestad (afollestad) */ -class ATEEditText : AppCompatEditText { +class ATEEditText : TextInputEditText { constructor(context: Context) : super(context) { init(context) diff --git a/appthemehelper/src/main/java/code/name/monkey/appthemehelper/common/views/ATETextInputLayout.java b/appthemehelper/src/main/java/code/name/monkey/appthemehelper/common/views/ATETextInputLayout.java new file mode 100644 index 000000000..278050a34 --- /dev/null +++ b/appthemehelper/src/main/java/code/name/monkey/appthemehelper/common/views/ATETextInputLayout.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2019 Hemanth Savarala. + * + * Licensed under the GNU General Public License v3 + * + * This is free software: you can redistribute it and/or modify it under + * the terms of the GNU General Public License as published by + * the Free Software Foundation either version 3 of the License, or (at your option) any later version. + * + * This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + */ + +package code.name.monkey.appthemehelper.common.views; + +import android.content.Context; +import android.content.res.ColorStateList; +import android.util.AttributeSet; + +import com.google.android.material.textfield.TextInputLayout; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import code.name.monkey.appthemehelper.ThemeStore; + +/** + * Created by hemanths on 3/12/19 + */ +public class ATETextInputLayout extends TextInputLayout { + public ATETextInputLayout(@NonNull Context context) { + this(context, null); + } + + public ATETextInputLayout(@NonNull Context context, @Nullable AttributeSet attrs) { + this(context, attrs, -1); + } + + public ATETextInputLayout(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + + setBoxBackgroundMode(BOX_BACKGROUND_OUTLINE); + setBoxStrokeColor(ThemeStore.Companion.textColorSecondary(context)); + final float scale = context.getResources().getDisplayMetrics().density; + int border = (int) (8 * scale + 0.5f); + setBoxCornerRadii(border, border, border, border); + setHintAnimationEnabled(true); + setHintEnabled(true); + + } +} diff --git a/appthemehelper/src/main/java/code/name/monkey/appthemehelper/util/MaterialUtil.kt b/appthemehelper/src/main/java/code/name/monkey/appthemehelper/util/MaterialUtil.kt index ef2b02cf4..1ab73dddd 100644 --- a/appthemehelper/src/main/java/code/name/monkey/appthemehelper/util/MaterialUtil.kt +++ b/appthemehelper/src/main/java/code/name/monkey/appthemehelper/util/MaterialUtil.kt @@ -34,7 +34,7 @@ object MaterialUtil { val colorState = ColorStateList.valueOf(accentColor) if (background) { - textInputLayout.backgroundTintList = colorState + //textInputLayout.backgroundTintList = colorState textInputLayout.defaultHintTextColor = colorState } else { textInputLayout.boxStrokeColor = accentColor