From 891f1bce349c2281204646f7791cd014552ea597 Mon Sep 17 00:00:00 2001 From: h4h13 Date: Mon, 4 May 2020 00:54:11 +0530 Subject: [PATCH] Fix queue changing --- app/build.gradle | 2 + .../main/assets/{index.html => oldindex.html} | 0 .../activities/LicenseActivity.java | 2 +- .../retromusic/activities/MainActivity.java | 11 +- .../activities/WhatsNewActivity.java | 14 +- .../base/AbsSlidingMusicPanelActivity.kt | 2 + .../adapter/CategoryInfoAdapter.java | 9 +- .../adapter/base/AbsMultiSelectAdapter.java | 2 +- .../monkey/retromusic/extensions/PaletteEX.kt | 73 ++++ .../retromusic/fragments/NowPlayingScreen.kt | 1 + .../mainactivity/FoldersFragment.java | 3 +- .../fragments/player/TestPlayerFragment.kt | 386 ++++++++++++++++++ .../fragments/player/color/ColorFragment.kt | 11 +- .../retromusic/glide/ArtistGlideRequest.java | 4 +- .../code/name/monkey/retromusic/model/Song.kt | 49 ++- .../model/lyrics/SynchronizedLyricsLRC.java | 6 +- .../room/MusicPlaybackQueueStoreDatabase.kt | 3 +- .../retromusic/room/MusicQueueRepository.kt | 25 +- .../monkey/retromusic/room/NowPlayingQueue.kt | 4 +- .../name/monkey/retromusic/room/QueueDao.kt | 15 +- .../name/monkey/retromusic/room/SongEntity.kt | 11 +- .../monkey/retromusic/room/SongQueueEntity.kt | 46 +++ .../retromusic/service/MultiPlayer.java | 2 +- .../retromusic/service/MusicService.java | 72 ++-- .../monkey/retromusic/util/CalendarUtil.java | 7 +- .../monkey/retromusic/util/MusicUtil.java | 4 +- .../retromusic/util/RetroColorUtil.java | 5 +- .../retromusic/views/PopupBackground.java | 19 +- .../main/res/layout/fragment_full_player.xml | 97 +++++ .../main/res/layout/fragment_layout_test.xml | 214 ++++++++++ .../fragment_player_playback_controls.xml | 5 + app/src/main/res/layout/item_list.xml | 3 +- .../dialogs/ATEPreferenceDialogFragment.java | 10 +- .../appthemehelper/util/TintHelper.java | 22 +- 34 files changed, 1007 insertions(+), 132 deletions(-) rename app/src/main/assets/{index.html => oldindex.html} (100%) create mode 100644 app/src/main/java/code/name/monkey/retromusic/extensions/PaletteEX.kt create mode 100644 app/src/main/java/code/name/monkey/retromusic/fragments/player/TestPlayerFragment.kt create mode 100644 app/src/main/java/code/name/monkey/retromusic/room/SongQueueEntity.kt create mode 100644 app/src/main/res/layout/fragment_full_player.xml create mode 100644 app/src/main/res/layout/fragment_layout_test.xml diff --git a/app/build.gradle b/app/build.gradle index e72fe87c..8201ae0d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -197,4 +197,6 @@ dependencies { kapt "androidx.lifecycle:lifecycle-compiler:$lifecycle_version" implementation 'com.google.android.play:core:1.7.2' + implementation 'me.jorgecastillo:androidcolorx:0.2.0' + debugImplementation 'com.amitshekhar.android:debug-db:1.0.4' } \ No newline at end of file diff --git a/app/src/main/assets/index.html b/app/src/main/assets/oldindex.html similarity index 100% rename from app/src/main/assets/index.html rename to app/src/main/assets/oldindex.html diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/LicenseActivity.java b/app/src/main/java/code/name/monkey/retromusic/activities/LicenseActivity.java index d2117129..eea9299c 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/LicenseActivity.java +++ b/app/src/main/java/code/name/monkey/retromusic/activities/LicenseActivity.java @@ -56,7 +56,7 @@ public class LicenseActivity extends AbsBaseActivity { WebView webView = findViewById(R.id.license); try { StringBuilder buf = new StringBuilder(); - InputStream json = getAssets().open("index.html"); + InputStream json = getAssets().open("oldindex.html"); BufferedReader in = new BufferedReader(new InputStreamReader(json, StandardCharsets.UTF_8)); String str; while ((str = in.readLine()) != null) { diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/MainActivity.java b/app/src/main/java/code/name/monkey/retromusic/activities/MainActivity.java index 7ef63a87..443b3ecf 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/MainActivity.java +++ b/app/src/main/java/code/name/monkey/retromusic/activities/MainActivity.java @@ -121,8 +121,7 @@ public class MainActivity extends AbsSlidingMusicPanelActivity } }; private final IntentFilter mIntentFilter = new IntentFilter(Intent.ACTION_SCREEN_OFF); - @Nullable - MainActivityFragmentCallbacks currentFragment; + private MainActivityFragmentCallbacks currentFragment; private boolean blockRequestPermissions = false; private MaterialCab cab; private AppBarLayout mAppBarLayout; @@ -231,11 +230,9 @@ public class MainActivity extends AbsSlidingMusicPanelActivity registerReceiver(mBroadcastReceiver, mIntentFilter); PreferenceUtil.getInstance(this).registerOnSharedPreferenceChangedListener(this); - if (getIntent().hasExtra(EXPAND_PANEL) && PreferenceUtil.getInstance(this).isExpandPanel()) { - if (getIntent().getBooleanExtra(EXPAND_PANEL, false)) { - expandPanel(); - getIntent().putExtra(EXPAND_PANEL, false); - } + if (getIntent().hasExtra(EXPAND_PANEL) && getIntent().getBooleanExtra(EXPAND_PANEL, false) && PreferenceUtil.getInstance(this).isExpandPanel()) { + expandPanel(); + getIntent().putExtra(EXPAND_PANEL, false); } appUpdateManager.getAppUpdateInfo() .addOnSuccessListener(appUpdateInfo -> { diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/WhatsNewActivity.java b/app/src/main/java/code/name/monkey/retromusic/activities/WhatsNewActivity.java index be500ca4..d01c2d40 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/WhatsNewActivity.java +++ b/app/src/main/java/code/name/monkey/retromusic/activities/WhatsNewActivity.java @@ -32,12 +32,6 @@ import code.name.monkey.retromusic.util.PreferenceUtil; public class WhatsNewActivity extends AbsBaseActivity { - AppBarLayout appBarLayout; - - Toolbar toolbar; - - WebView webView; - private static String colorToCSS(int color) { return String.format(Locale.getDefault(), "rgba(%d, %d, %d, %d)", Color.red(color), Color.green(color), Color.blue(color), Color.alpha(color)); // on API 29, WebView doesn't load with hex colors @@ -62,9 +56,9 @@ public class WhatsNewActivity extends AbsBaseActivity { setNavigationbarColorAuto(); setTaskDescriptionColorAuto(); - webView = findViewById(R.id.webView); - toolbar = findViewById(R.id.toolbar); - appBarLayout = findViewById(R.id.appBarLayout); + WebView webView = findViewById(R.id.webView); + Toolbar toolbar = findViewById(R.id.toolbar); + AppBarLayout appBarLayout = findViewById(R.id.appBarLayout); toolbar.setBackgroundColor(ATHUtil.INSTANCE.resolveColor(this, R.attr.colorSurface)); //setSupportActionBar(toolbar); @@ -92,7 +86,7 @@ public class WhatsNewActivity extends AbsBaseActivity { final String accentColorString = colorToCSS(ThemeStore.Companion.accentColor(this)); final String accentTextColor = colorToCSS(MaterialValueHelper.getPrimaryTextColor(this, ColorUtil.INSTANCE.isColorLight(accentColor))); final String changeLog = buf.toString() - .replace("{style-placeholder}", String.format("body { background-color: %s; color: %s; } li {color: %s;} .colorHeader {background-color: %s; color: %s;} .tag {color: %s;}", backgroundColor, contentColor, textColor, accentColorString, accentTextColor,accentColorString )) + .replace("{style-placeholder}", String.format("body { background-color: %s; color: %s; } li {color: %s;} .colorHeader {background-color: %s; color: %s;} .tag {color: %s;}", backgroundColor, contentColor, textColor, accentColorString, accentTextColor, accentColorString)) .replace("{link-color}", colorToCSS(ThemeStore.Companion.accentColor(this))) .replace("{link-color-active}", colorToCSS(ColorUtil.INSTANCE.lightenColor(ThemeStore.Companion.accentColor(this)))); webView.loadData(changeLog, "text/html", "UTF-8"); diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsSlidingMusicPanelActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsSlidingMusicPanelActivity.kt index 3a84f55b..dc03bca6 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsSlidingMusicPanelActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsSlidingMusicPanelActivity.kt @@ -18,6 +18,7 @@ import code.name.monkey.retromusic.fragments.MiniPlayerFragment import code.name.monkey.retromusic.fragments.NowPlayingScreen import code.name.monkey.retromusic.fragments.NowPlayingScreen.* import code.name.monkey.retromusic.fragments.base.AbsPlayerFragment +import code.name.monkey.retromusic.fragments.player.TestPlayerFragment import code.name.monkey.retromusic.fragments.player.adaptive.AdaptiveFragment import code.name.monkey.retromusic.fragments.player.blur.BlurPlayerFragment import code.name.monkey.retromusic.fragments.player.card.CardFragment @@ -241,6 +242,7 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity(), TINY -> TinyPlayerFragment() PEAK -> PeakPlayerFragment() CIRCLE -> CirclePlayerFragment() + EXAMPLE -> TestPlayerFragment() else -> PlayerFragment() } // must implement AbsPlayerFragment supportFragmentManager.beginTransaction().replace(R.id.playerFragmentContainer, fragment) diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/CategoryInfoAdapter.java b/app/src/main/java/code/name/monkey/retromusic/adapter/CategoryInfoAdapter.java index 426eafb1..8c169ef6 100644 --- a/app/src/main/java/code/name/monkey/retromusic/adapter/CategoryInfoAdapter.java +++ b/app/src/main/java/code/name/monkey/retromusic/adapter/CategoryInfoAdapter.java @@ -122,12 +122,9 @@ public class CategoryInfoAdapter extends RecyclerView.Adapter extends RecyclerView.Adapter +public abstract class AbsMultiSelectAdapter extends RecyclerView.Adapter implements MaterialCab.Callback { @Nullable diff --git a/app/src/main/java/code/name/monkey/retromusic/extensions/PaletteEX.kt b/app/src/main/java/code/name/monkey/retromusic/extensions/PaletteEX.kt new file mode 100644 index 00000000..bcc9b632 --- /dev/null +++ b/app/src/main/java/code/name/monkey/retromusic/extensions/PaletteEX.kt @@ -0,0 +1,73 @@ +package code.name.monkey.retromusic.extensions + +import androidx.annotation.ColorInt +import androidx.core.graphics.ColorUtils +import androidx.palette.graphics.Palette + + +fun getSuitableColorFor(palette: Palette, i: Int, i2: Int): Int { + val dominantSwatch = palette.dominantSwatch + if (dominantSwatch != null) { + if (hasEnoughContrast(i, dominantSwatch.rgb)) { + return dominantSwatch.rgb + } + } + val vibrantSwatch = palette.vibrantSwatch + if (vibrantSwatch != null) { + if (hasEnoughContrast(i, vibrantSwatch.rgb)) { + return vibrantSwatch.rgb + } + } + val darkVibrantSwatch = palette.darkVibrantSwatch + if (darkVibrantSwatch != null) { + if (hasEnoughContrast(i, darkVibrantSwatch.rgb)) { + return darkVibrantSwatch.rgb + } + } + val lightVibrantSwatch = palette.lightVibrantSwatch + if (lightVibrantSwatch != null) { + if (hasEnoughContrast(i, lightVibrantSwatch.rgb)) { + return lightVibrantSwatch.rgb + } + } + val darkMutedSwatch = palette.darkMutedSwatch + if (darkMutedSwatch != null) { + if (hasEnoughContrast(i, darkMutedSwatch.rgb)) { + return darkMutedSwatch.rgb + } + } + val lightMutedSwatch = palette.lightMutedSwatch + if (lightMutedSwatch != null) { + if (hasEnoughContrast(i, lightMutedSwatch.rgb)) { + return lightMutedSwatch.rgb + } + } + val mutedSwatch = palette.mutedSwatch + if (mutedSwatch != null) { + if (hasEnoughContrast(i, mutedSwatch.rgb)) { + return mutedSwatch.rgb + } + } + return i2 +} + +fun hasEnoughContrast(i: Int, i2: Int): Boolean { + return ColorUtils.calculateContrast(i2, i) >= 2.toDouble() +} + +fun hasEnoughLuminance(i: Int): Boolean { + return ColorUtils.calculateLuminance(i) >= 0.4f.toDouble() +} + +fun isBlack(fArr: FloatArray): Boolean { + return fArr[2] <= 0.035f +} + +fun isNearRedLine(fArr: FloatArray): Boolean { + val f = fArr[0] + return f >= 10.0f && f <= 37.0f && fArr[1] <= 0.82f +} + +fun isDark(@ColorInt i: Int): Boolean { + return ColorUtils.calculateLuminance(i) < 0.5 +} diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/NowPlayingScreen.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/NowPlayingScreen.kt index 2af15b23..71c86544 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/NowPlayingScreen.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/NowPlayingScreen.kt @@ -26,4 +26,5 @@ enum class NowPlayingScreen constructor( PLAIN(R.string.plain, R.drawable.np_plain, 3), SIMPLE(R.string.simple, R.drawable.np_simple, 8), TINY(R.string.tiny, R.drawable.np_tiny, 7), + EXAMPLE(R.string.tiny, R.drawable.np_tiny, 16), } diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/mainactivity/FoldersFragment.java b/app/src/main/java/code/name/monkey/retromusic/fragments/mainactivity/FoldersFragment.java index ab2daabc..7ca537fe 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/mainactivity/FoldersFragment.java +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/mainactivity/FoldersFragment.java @@ -92,7 +92,8 @@ public class FoldersFragment extends AbsMainActivityFragment implements private SongFileAdapter adapter; private BreadCrumbLayout breadCrumbs; private MaterialCab cab; - private View coordinatorLayout, empty; + private View coordinatorLayout; + private View empty; private TextView emojiText; private Comparator fileComparator = (lhs, rhs) -> { if (lhs.isDirectory() && !rhs.isDirectory()) { diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/TestPlayerFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/TestPlayerFragment.kt new file mode 100644 index 00000000..4867e81a --- /dev/null +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/TestPlayerFragment.kt @@ -0,0 +1,386 @@ +package code.name.monkey.retromusic.fragments.player + +import android.animation.ObjectAnimator +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.core.view.ViewCompat +import androidx.recyclerview.widget.LinearLayoutManager +import code.name.monkey.appthemehelper.ThemeStore +import code.name.monkey.appthemehelper.util.* +import code.name.monkey.retromusic.R +import code.name.monkey.retromusic.adapter.song.PlayingQueueAdapter +import code.name.monkey.retromusic.extensions.hide +import code.name.monkey.retromusic.extensions.ripAlpha +import code.name.monkey.retromusic.extensions.show +import code.name.monkey.retromusic.fragments.VolumeFragment +import code.name.monkey.retromusic.fragments.base.AbsPlayerControlsFragment +import code.name.monkey.retromusic.fragments.base.AbsPlayerFragment +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.util.MusicUtil +import code.name.monkey.retromusic.util.PreferenceUtil +import code.name.monkey.retromusic.util.ViewUtil +import com.google.android.material.bottomsheet.BottomSheetBehavior +import com.google.android.material.card.MaterialCardView +import kotlinx.android.synthetic.main.fragment_full_player.* +import kotlinx.android.synthetic.main.fragment_layout_test.* + +class TestPlayerFragment : AbsPlayerFragment(), View.OnLayoutChangeListener, + MusicProgressViewUpdateHelper.Callback { + + private var lastColor: Int = 0 + private var lastPlaybackControlsColor: Int = 0 + private var lastDisabledPlaybackControlsColor: Int = 0 + private lateinit var progressViewUpdateHelper: MusicProgressViewUpdateHelper + private lateinit var queueAdapter: PlayingQueueAdapter + private var volumeFragment: VolumeFragment? = null + + private val bottomSheetCallbackList = object : BottomSheetBehavior.BottomSheetCallback() { + override fun onSlide(bottomSheet: View, slideOffset: Float) { + handle.alpha = 1 - slideOffset + } + + override fun onStateChanged(bottomSheet: View, newState: Int) { + + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + progressViewUpdateHelper = MusicProgressViewUpdateHelper(this) + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + return inflater.inflate(R.layout.fragment_full_player, container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupPanel() + setUpMusicControllers() + setUpPlayerToolbar() + hideVolumeIfAvailable() + setUpQueue() + val coverFragment = + childFragmentManager.findFragmentById(R.id.playerAlbumCoverFragment) as PlayerAlbumCoverFragment + coverFragment.setCallbacks(this) + + getQueuePanel().addBottomSheetCallback(bottomSheetCallbackList) + } + + private fun hideVolumeIfAvailable() { + if (PreferenceUtil.getInstance(requireContext()).volumeToggle) { + childFragmentManager.beginTransaction() + .replace(R.id.volumeFragmentContainer, VolumeFragment.newInstance()) + .commit() + childFragmentManager.executePendingTransactions() + volumeFragment = + childFragmentManager.findFragmentById(R.id.volumeFragmentContainer) as VolumeFragment? + } + } + + private fun updateSong() { + val song = MusicPlayerRemote.currentSong + title.text = song.title + text.text = song.artistName + + if (PreferenceUtil.getInstance(requireContext()).isSongInfo) { + songInfo.text = getSongInfo(song) + songInfo.show() + } else { + songInfo.hide() + } + } + + override fun onResume() { + super.onResume() + progressViewUpdateHelper.start() + } + + override fun onPause() { + super.onPause() + progressViewUpdateHelper.stop() + } + + private fun getQueuePanel(): BottomSheetBehavior { + playerQueueSheet as MaterialCardView + return BottomSheetBehavior.from(playerQueueSheet) + } + + private fun setupPanel() { + if (!ViewCompat.isLaidOut(playerContainer) || playerContainer.isLayoutRequested) { + playerContainer.addOnLayoutChangeListener(this) + return + } + val height = playerContainer.height + val width = playerContainer.width + val finalHeight = height - (playerControlsContainer.height + width) + val panel = getQueuePanel() + panel.peekHeight = finalHeight + } + + private fun setUpPlayerToolbar() { + playerToolbar.inflateMenu(R.menu.menu_player) + playerToolbar.setNavigationOnClickListener { requireActivity().onBackPressed() } + playerToolbar.setOnMenuItemClickListener(this) + + ToolbarContentTintHelper.colorizeToolbar( + playerToolbar, + ATHUtil.resolveColor(requireContext(), R.attr.colorControlNormal), + requireActivity() + ) + } + + + private fun setUpQueue() { + queueAdapter = PlayingQueueAdapter( + requireActivity() as AppCompatActivity, mutableListOf(), + MusicPlayerRemote.position, + R.layout.item_queue + ) + playerQueueRecyclerView.apply { + adapter = queueAdapter + layoutManager = LinearLayoutManager(requireContext()) + } + } + + override fun onServiceConnected() { + super.onServiceConnected() + updateSong() + queueAdapter.swapDataSet(MusicPlayerRemote.playingQueue) + } + + override fun onPlayingMetaChanged() { + super.onPlayingMetaChanged() + updateSong() + } + + + override fun onQueueChanged() { + super.onQueueChanged() + queueAdapter.swapDataSet(MusicPlayerRemote.playingQueue) + } + + + override fun playerToolbar(): Toolbar? { + return playerToolbar + } + + override fun onShow() { + + } + + override fun onHide() { + + } + + override fun onBackPressed(): Boolean { + if (getQueuePanel().state == BottomSheetBehavior.STATE_EXPANDED) { + getQueuePanel().state = BottomSheetBehavior.STATE_COLLAPSED + } + return false + } + + override fun toolbarIconColor(): Int { + return ATHUtil.resolveColor(requireContext(), R.attr.colorControlNormal) + } + + override val paletteColor: Int + get() = lastColor + + override fun onColorChanged(color: Int) { + playerContainer.setBackgroundColor(color) + val colorBg = ATHUtil.resolveColor(requireContext(), color) + if (ColorUtil.isColorLight(colorBg)) { + lastPlaybackControlsColor = + MaterialValueHelper.getSecondaryTextColor(requireContext(), true) + lastDisabledPlaybackControlsColor = + MaterialValueHelper.getSecondaryDisabledTextColor(requireContext(), true) + } else { + lastPlaybackControlsColor = + MaterialValueHelper.getPrimaryTextColor(requireContext(), false) + lastDisabledPlaybackControlsColor = + MaterialValueHelper.getPrimaryDisabledTextColor(requireContext(), false) + } + + val colorFinal = if (PreferenceUtil.getInstance(requireContext()).adaptiveColor) { + color + } else { + ThemeStore.accentColor(requireContext()) + }.ripAlpha() + + TintHelper.setTintAuto( + playPauseButton, + MaterialValueHelper.getPrimaryTextColor( + requireContext(), + ColorUtil.isColorLight(colorFinal) + ), + false + ) + title.setTextColor(lastPlaybackControlsColor) + text.setTextColor(lastDisabledPlaybackControlsColor) + songInfo.setTextColor(lastDisabledPlaybackControlsColor) + songCurrentProgress.setTextColor(lastPlaybackControlsColor) + songTotalTime.setTextColor(lastPlaybackControlsColor) + volumeFragment?.setTintableColor(lastPlaybackControlsColor) + TintHelper.setTintAuto(playPauseButton, colorFinal, true) + ViewUtil.setProgressDrawable(progressSlider, colorFinal, true) + updateRepeatState() + updateShuffleState() + updatePrevNextColor() + } + + override fun toggleFavorite(song: Song) { + super.toggleFavorite(song) + if (song.id == MusicPlayerRemote.currentSong.id) { + updateIsFavorite() + } + } + + override fun onFavoriteToggled() { + toggleFavorite(MusicPlayerRemote.currentSong) + } + + 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()) + } + + override fun onPlayStateChanged() { + updatePlayPauseDrawableState() + } + + override fun onRepeatModeChanged() { + updateRepeatState() + } + + override fun onShuffleModeChanged() { + updateShuffleState() + } + + private fun setUpPlayPauseFab() { + playPauseButton.setOnClickListener(PlayPauseButtonOnClickHandler()) + } + + private fun updatePlayPauseDrawableState() { + if (MusicPlayerRemote.isPlaying) { + playPauseButton.setImageResource(R.drawable.ic_pause_white_24dp) + } else { + playPauseButton.setImageResource(R.drawable.ic_play_arrow_white_24dp) + } + } + + private fun setUpMusicControllers() { + setUpPlayPauseFab() + setUpPrevNext() + setUpRepeatButton() + setUpShuffleButton() + setUpProgressSlider() + } + + 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 + ) + } + } + }) + } + + 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 fun setUpShuffleButton() { + shuffleButton.setOnClickListener { MusicPlayerRemote.toggleShuffleMode() } + } + + 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 setUpRepeatButton() { + repeatButton.setOnClickListener { MusicPlayerRemote.cycleRepeatMode() } + } + + 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) + } + } + } + + override fun onLayoutChange( + v: View?, + left: Int, + top: Int, + right: Int, + bottom: Int, + oldLeft: Int, + oldTop: Int, + oldRight: Int, + oldBottom: Int + ) { + val height = playerContainer.height + val width = playerContainer.width + val finalHeight = height - (playerControlsContainer.height + width) + val panel = getQueuePanel() + panel.peekHeight = finalHeight + } +} \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/color/ColorFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/color/ColorFragment.kt index ec36604d..af489528 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/color/ColorFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/color/ColorFragment.kt @@ -1,6 +1,7 @@ package code.name.monkey.retromusic.fragments.player.color import android.animation.ValueAnimator +import android.graphics.Color import android.graphics.drawable.Drawable import android.os.Bundle import android.view.LayoutInflater @@ -12,6 +13,7 @@ import code.name.monkey.appthemehelper.util.ColorUtil import code.name.monkey.appthemehelper.util.MaterialValueHelper import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper import code.name.monkey.retromusic.R +import code.name.monkey.retromusic.extensions.getSuitableColorFor import code.name.monkey.retromusic.fragments.base.AbsPlayerFragment import code.name.monkey.retromusic.glide.RetroMusicColoredTarget import code.name.monkey.retromusic.glide.SongGlideRequest.Builder @@ -143,7 +145,14 @@ class ColorFragment : AbsPlayerFragment() { val swatch = RetroColorUtil.getSwatch(palette) val textColor = RetroColorUtil.getTextColor(palette) - val backgroundColor = swatch.rgb + val backgroundColor = getSuitableColorFor( + palette, + ATHUtil.resolveColor(requireContext(), R.attr.colorSurface), + Color.BLACK + ) + if (ATHUtil.isWindowBackgroundDark(requireContext())) { + ColorUtil.desaturateColor(backgroundColor, 0.5f) + } setColors(backgroundColor, textColor) } diff --git a/app/src/main/java/code/name/monkey/retromusic/glide/ArtistGlideRequest.java b/app/src/main/java/code/name/monkey/retromusic/glide/ArtistGlideRequest.java index e45bf46d..48082d1c 100644 --- a/app/src/main/java/code/name/monkey/retromusic/glide/ArtistGlideRequest.java +++ b/app/src/main/java/code/name/monkey/retromusic/glide/ArtistGlideRequest.java @@ -68,8 +68,8 @@ public class ArtistGlideRequest { final Artist artist; final RequestManager requestManager; - boolean forceDownload; - boolean noCustomImage; + private boolean forceDownload; + private boolean noCustomImage; private Builder(@NonNull RequestManager requestManager, Artist artist) { this.requestManager = requestManager; diff --git a/app/src/main/java/code/name/monkey/retromusic/model/Song.kt b/app/src/main/java/code/name/monkey/retromusic/model/Song.kt index be5f8ed8..0bd4c9a5 100644 --- a/app/src/main/java/code/name/monkey/retromusic/model/Song.kt +++ b/app/src/main/java/code/name/monkey/retromusic/model/Song.kt @@ -17,30 +17,49 @@ import android.os.Parcelable import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.PrimaryKey +import code.name.monkey.retromusic.BuildConfig import code.name.monkey.retromusic.room.SongEntity +import code.name.monkey.retromusic.room.SongQueueEntity import kotlinx.android.parcel.Parcelize @Parcelize -@Entity(tableName = "playing_queue") + open class Song( - @PrimaryKey val id: Int, - @ColumnInfo(name = "title") val title: String, - @ColumnInfo(name = "track_number") val trackNumber: Int, - @ColumnInfo(name = "year") val year: Int, - @ColumnInfo(name = "duration") val duration: Long, - @ColumnInfo(name = "data") val data: String, - @ColumnInfo(name = "date_modified") val dateModified: Long, - @ColumnInfo(name = "album_id") val albumId: Int, - @ColumnInfo(name = "album_name") val albumName: String, - @ColumnInfo(name = "artist_id") val artistId: Int, - @ColumnInfo(name = "artist_name") val artistName: String, - @ColumnInfo(name = "composer") val composer: String? + val id: Int, + val title: String, + val trackNumber: Int, + val year: Int, + val duration: Long, + val data: String, + val dateModified: Long, + val albumId: Int, + val albumName: String, + val artistId: Int, + val artistName: String, + val composer: String? ) : Parcelable { companion object { - fun toSongEntity(song: Song): SongEntity { - return SongEntity( + fun toSongEntity(song: Song): SongQueueEntity { + return SongQueueEntity( + song.id, + song.title, + song.trackNumber, + song.year, + song.duration, + song.data, + song.dateModified, + song.albumId, + song.albumName, + song.artistId, + song.artistName, + song.composer + ) + } + + fun toSongQueueEntity(song: Song): SongEntity { + return SongEntity( song.id, song.title, song.trackNumber, diff --git a/app/src/main/java/code/name/monkey/retromusic/model/lyrics/SynchronizedLyricsLRC.java b/app/src/main/java/code/name/monkey/retromusic/model/lyrics/SynchronizedLyricsLRC.java index 04000bb9..02b8d1c4 100644 --- a/app/src/main/java/code/name/monkey/retromusic/model/lyrics/SynchronizedLyricsLRC.java +++ b/app/src/main/java/code/name/monkey/retromusic/model/lyrics/SynchronizedLyricsLRC.java @@ -48,10 +48,8 @@ class SynchronizedLyricsLRC extends AbsSynchronizedLyrics { try { String attr = attrMatcher.group(1).toLowerCase().trim(); String value = attrMatcher.group(2).toLowerCase().trim(); - switch (attr) { - case "offset": - this.offset = Integer.parseInt(value); - break; + if ("offset".equals(attr)) { + this.offset = Integer.parseInt(value); } } catch (Exception ex) { ex.printStackTrace(); diff --git a/app/src/main/java/code/name/monkey/retromusic/room/MusicPlaybackQueueStoreDatabase.kt b/app/src/main/java/code/name/monkey/retromusic/room/MusicPlaybackQueueStoreDatabase.kt index 668e50c7..137933d4 100644 --- a/app/src/main/java/code/name/monkey/retromusic/room/MusicPlaybackQueueStoreDatabase.kt +++ b/app/src/main/java/code/name/monkey/retromusic/room/MusicPlaybackQueueStoreDatabase.kt @@ -4,9 +4,10 @@ import android.content.Context import androidx.room.Database import androidx.room.Room import androidx.room.RoomDatabase +import code.name.monkey.retromusic.BuildConfig import code.name.monkey.retromusic.model.Song -@Database(entities = [Song::class, SongEntity::class], version = 3, exportSchema = false) +@Database(entities = [SongQueueEntity::class, SongEntity::class], version = 8, exportSchema = false) abstract class MusicPlaybackQueueStoreDatabase : RoomDatabase() { abstract fun queueDao(): QueueDao diff --git a/app/src/main/java/code/name/monkey/retromusic/room/MusicQueueRepository.kt b/app/src/main/java/code/name/monkey/retromusic/room/MusicQueueRepository.kt index 25959c9d..cf2a9269 100644 --- a/app/src/main/java/code/name/monkey/retromusic/room/MusicQueueRepository.kt +++ b/app/src/main/java/code/name/monkey/retromusic/room/MusicQueueRepository.kt @@ -1,18 +1,33 @@ package code.name.monkey.retromusic.room +import androidx.room.Transaction import code.name.monkey.retromusic.model.Song class MusicQueueRepository(private val queueDao: QueueDao) { - fun getQueue(): List = queueDao.getQueue() + fun getQueue(): List = + queueDao.getQueue().map { SongQueueEntity.toSong(it) } - fun getOriginalQueue(): List = queueDao.getOriginalQueue() + fun getOriginalQueue(): List = + queueDao.getOriginalQueue().map { SongEntity.toSong(it) } suspend fun insertQueue(queue: List) { - queueDao.saveQueue(queue) + deleteAndSave(queue) } - suspend fun insertOriginalQueue(queue: List) { - queueDao.saveOriginalQueue(queue) + @Transaction + private suspend fun deleteAndSave(queue: List) { + queueDao.deleteQueue() + queueDao.saveQueue(queue.map { Song.toSongEntity(it) }) + } + + suspend fun insertOriginalQueue(queue: List) { + deleteAndSaveOriginalQueue(queue) + } + + @Transaction + private suspend fun deleteAndSaveOriginalQueue(queue: List) { + queueDao.deleteOriginalQueue() + queueDao.saveOriginalQueue(queue.map { Song.toSongQueueEntity(it) }) } } \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/room/NowPlayingQueue.kt b/app/src/main/java/code/name/monkey/retromusic/room/NowPlayingQueue.kt index b066a4dd..7d2f8747 100644 --- a/app/src/main/java/code/name/monkey/retromusic/room/NowPlayingQueue.kt +++ b/app/src/main/java/code/name/monkey/retromusic/room/NowPlayingQueue.kt @@ -17,7 +17,7 @@ class NowPlayingQueue(context: Context) { } fun saveOriginalQueue(songs: List) = GlobalScope.launch(Dispatchers.Default) { - musicQueueRepository.insertOriginalQueue(songs.map { Song.toSongEntity(it) }) + musicQueueRepository.insertOriginalQueue(songs) } fun getQueue(): List { @@ -25,6 +25,6 @@ class NowPlayingQueue(context: Context) { } fun getOriginalQueue(): List { - return musicQueueRepository.getOriginalQueue().map { SongEntity.toSong(it) } + return musicQueueRepository.getOriginalQueue() } } \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/room/QueueDao.kt b/app/src/main/java/code/name/monkey/retromusic/room/QueueDao.kt index 7e54de92..119300d7 100644 --- a/app/src/main/java/code/name/monkey/retromusic/room/QueueDao.kt +++ b/app/src/main/java/code/name/monkey/retromusic/room/QueueDao.kt @@ -4,6 +4,7 @@ import androidx.room.Dao import androidx.room.Insert import androidx.room.OnConflictStrategy import androidx.room.Query +import code.name.monkey.retromusic.BuildConfig import code.name.monkey.retromusic.model.Song /** @@ -13,15 +14,21 @@ import code.name.monkey.retromusic.model.Song interface QueueDao { @Insert(onConflict = OnConflictStrategy.REPLACE) - suspend fun saveQueue(playingQueue: List) + suspend fun saveQueue(playingQueue: List) @Insert(onConflict = OnConflictStrategy.REPLACE) suspend fun saveOriginalQueue(playingQueue: List) - @Query("SELECT * FROM playing_queue") - fun getQueue(): List + @Query("SELECT * FROM playing_queue_${BuildConfig.FLAVOR}") + fun getQueue(): List - @Query("SELECT * FROM original_playing_queue") + @Query("SELECT * FROM original_playing_queue_${BuildConfig.FLAVOR}") fun getOriginalQueue(): List + + @Query("DELETE FROM playing_queue_${BuildConfig.FLAVOR}") + suspend fun deleteQueue() + + @Query("DELETE FROM original_playing_queue_${BuildConfig.FLAVOR}") + suspend fun deleteOriginalQueue() } \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/room/SongEntity.kt b/app/src/main/java/code/name/monkey/retromusic/room/SongEntity.kt index 3d75c132..ff5f62c2 100644 --- a/app/src/main/java/code/name/monkey/retromusic/room/SongEntity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/room/SongEntity.kt @@ -3,11 +3,12 @@ package code.name.monkey.retromusic.room import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.PrimaryKey +import code.name.monkey.retromusic.BuildConfig import code.name.monkey.retromusic.model.Song -@Entity(tableName = "original_playing_queue") -class SongEntity( - @PrimaryKey val id: Int, +@Entity(tableName = "original_playing_queue_${BuildConfig.FLAVOR}") +data class SongEntity( + @ColumnInfo(name = "id") val id: Int, @ColumnInfo(name = "title") val title: String, @ColumnInfo(name = "track_number") val trackNumber: Int, @ColumnInfo(name = "year") val year: Int, @@ -20,6 +21,10 @@ class SongEntity( @ColumnInfo(name = "artist_name") val artistName: String, @ColumnInfo(name = "composer") val composer: String? ) { + @PrimaryKey(autoGenerate = true) + @ColumnInfo(name = "primary_id") + var primaryId: Int? = null + companion object { fun toSong(song: SongEntity): Song { return Song( diff --git a/app/src/main/java/code/name/monkey/retromusic/room/SongQueueEntity.kt b/app/src/main/java/code/name/monkey/retromusic/room/SongQueueEntity.kt new file mode 100644 index 00000000..0527f397 --- /dev/null +++ b/app/src/main/java/code/name/monkey/retromusic/room/SongQueueEntity.kt @@ -0,0 +1,46 @@ +package code.name.monkey.retromusic.room + +import androidx.room.ColumnInfo +import androidx.room.Entity +import androidx.room.PrimaryKey +import code.name.monkey.retromusic.BuildConfig +import code.name.monkey.retromusic.model.Song + +@Entity(tableName = "playing_queue_${BuildConfig.FLAVOR}") +data class SongQueueEntity( + @ColumnInfo(name = "id") var id: Int, + @ColumnInfo(name = "title") var title: String, + @ColumnInfo(name = "track_number") var trackNumber: Int, + @ColumnInfo(name = "year") var year: Int, + @ColumnInfo(name = "duration") var duration: Long, + @ColumnInfo(name = "data") var data: String, + @ColumnInfo(name = "date_modified") var dateModified: Long, + @ColumnInfo(name = "album_id") var albumId: Int, + @ColumnInfo(name = "album_name") var albumName: String, + @ColumnInfo(name = "artist_id") var artistId: Int, + @ColumnInfo(name = "artist_name") var artistName: String, + @ColumnInfo(name = "composer") var composer: String? +) { + @PrimaryKey(autoGenerate = true) + @ColumnInfo(name = "primary_id") + var primaryId: Int? = null + + companion object { + fun toSong(song: SongQueueEntity): Song { + return Song( + song.id, + song.title, + song.trackNumber, + song.year, + song.duration, + song.data, + song.dateModified, + song.albumId, + song.albumName, + song.artistId, + song.artistName, + song.composer + ) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/service/MultiPlayer.java b/app/src/main/java/code/name/monkey/retromusic/service/MultiPlayer.java index 9bc0078e..f25da25f 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/MultiPlayer.java +++ b/app/src/main/java/code/name/monkey/retromusic/service/MultiPlayer.java @@ -331,7 +331,7 @@ public class MultiPlayer implements Playback, MediaPlayer.OnErrorListener, Media */ @Override public void onCompletion(final MediaPlayer mp) { - if (mp == mCurrentMediaPlayer && mNextMediaPlayer != null) { + if (mp.equals(mCurrentMediaPlayer) && mNextMediaPlayer != null) { mIsInitialized = false; mCurrentMediaPlayer.release(); mCurrentMediaPlayer = mNextMediaPlayer; diff --git a/app/src/main/java/code/name/monkey/retromusic/service/MusicService.java b/app/src/main/java/code/name/monkey/retromusic/service/MusicService.java index 16f234e9..d5872c8a 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/MusicService.java +++ b/app/src/main/java/code/name/monkey/retromusic/service/MusicService.java @@ -752,45 +752,43 @@ public class MusicService extends Service implements @Override public int onStartCommand(@Nullable Intent intent, int flags, int startId) { - if (intent != null) { - if (intent.getAction() != null) { - restoreQueuesAndPositionIfNecessary(); - String action = intent.getAction(); - switch (action) { - case ACTION_TOGGLE_PAUSE: - if (isPlaying()) { - pause(); - } else { - play(); - } - break; - case ACTION_PAUSE: + if (intent != null && intent.getAction() != null) { + restoreQueuesAndPositionIfNecessary(); + String action = intent.getAction(); + switch (action) { + case ACTION_TOGGLE_PAUSE: + if (isPlaying()) { pause(); - break; - case ACTION_PLAY: + } else { play(); - break; - case ACTION_PLAY_PLAYLIST: - playFromPlaylist(intent); - break; - case ACTION_REWIND: - back(true); - break; - case ACTION_SKIP: - playNextSong(true); - break; - case ACTION_STOP: - case ACTION_QUIT: - pendingQuit = false; - quit(); - break; - case ACTION_PENDING_QUIT: - pendingQuit = true; - break; - case TOGGLE_FAVORITE: - MusicUtil.toggleFavorite(getApplicationContext(), getCurrentSong()); - break; - } + } + break; + case ACTION_PAUSE: + pause(); + break; + case ACTION_PLAY: + play(); + break; + case ACTION_PLAY_PLAYLIST: + playFromPlaylist(intent); + break; + case ACTION_REWIND: + back(true); + break; + case ACTION_SKIP: + playNextSong(true); + break; + case ACTION_STOP: + case ACTION_QUIT: + pendingQuit = false; + quit(); + break; + case ACTION_PENDING_QUIT: + pendingQuit = true; + break; + case TOGGLE_FAVORITE: + MusicUtil.toggleFavorite(getApplicationContext(), getCurrentSong()); + break; } } diff --git a/app/src/main/java/code/name/monkey/retromusic/util/CalendarUtil.java b/app/src/main/java/code/name/monkey/retromusic/util/CalendarUtil.java index 84287141..cfbc1ce4 100644 --- a/app/src/main/java/code/name/monkey/retromusic/util/CalendarUtil.java +++ b/app/src/main/java/code/name/monkey/retromusic/util/CalendarUtil.java @@ -91,7 +91,7 @@ public class CalendarUtil { year--; } - elapsed += getDaysInMonth(year, month) * MS_PER_DAY; + elapsed += getDaysInMonth(month) * MS_PER_DAY; } return elapsed; @@ -109,7 +109,7 @@ public class CalendarUtil { int month = calendar.get(Calendar.MONTH) - 1; int year = calendar.get(Calendar.YEAR); while (month > Calendar.JANUARY) { - elapsed += getDaysInMonth(year, month) * MS_PER_DAY; + elapsed += getDaysInMonth(month) * MS_PER_DAY; month--; } @@ -120,11 +120,10 @@ public class CalendarUtil { /** * Gets the number of days for the given month in the given year. * - * @param year The year. * @param month The month (1 - 12). * @return The days in that month/year. */ - private int getDaysInMonth(int year, int month) { + private int getDaysInMonth(int month) { final Calendar monthCal = new GregorianCalendar(calendar.get(Calendar.YEAR), month, 1); return monthCal.getActualMaximum(Calendar.DAY_OF_MONTH); } diff --git a/app/src/main/java/code/name/monkey/retromusic/util/MusicUtil.java b/app/src/main/java/code/name/monkey/retromusic/util/MusicUtil.java index adbd8d5c..c56c7c16 100644 --- a/app/src/main/java/code/name/monkey/retromusic/util/MusicUtil.java +++ b/app/src/main/java/code/name/monkey/retromusic/util/MusicUtil.java @@ -373,8 +373,8 @@ public class MusicUtil { if (artistName.equals(Artist.UNKNOWN_ARTIST_DISPLAY_NAME)) { return true; } - artistName = artistName.trim().toLowerCase(); - return artistName.equals("unknown") || artistName.equals(""); + String tempName = artistName.trim().toLowerCase(); + return tempName.equals("unknown") || tempName.equals(""); } public static boolean isFavorite(@NonNull final Context context, @NonNull final Song song) { diff --git a/app/src/main/java/code/name/monkey/retromusic/util/RetroColorUtil.java b/app/src/main/java/code/name/monkey/retromusic/util/RetroColorUtil.java index d41c69c6..310c76fa 100644 --- a/app/src/main/java/code/name/monkey/retromusic/util/RetroColorUtil.java +++ b/app/src/main/java/code/name/monkey/retromusic/util/RetroColorUtil.java @@ -194,10 +194,11 @@ public class RetroColorUtil { @ColorInt public static int shiftBackgroundColorForDarkText(@ColorInt int backgroundColor) { + int color = backgroundColor; while (!ColorUtil.INSTANCE.isColorLight(backgroundColor)) { - backgroundColor = ColorUtil.INSTANCE.lightenColor(backgroundColor); + color = ColorUtil.INSTANCE.lightenColor(backgroundColor); } - return backgroundColor; + return color; } private static class SwatchComparator implements Comparator { diff --git a/app/src/main/java/code/name/monkey/retromusic/views/PopupBackground.java b/app/src/main/java/code/name/monkey/retromusic/views/PopupBackground.java index 0d6c6737..36b6aac9 100644 --- a/app/src/main/java/code/name/monkey/retromusic/views/PopupBackground.java +++ b/app/src/main/java/code/name/monkey/retromusic/views/PopupBackground.java @@ -88,6 +88,16 @@ public class PopupBackground extends Drawable { outline.setConvexPath(mPath); } + @Override + public void setAlpha(int alpha) { + + } + + @Override + public void setColorFilter(@Nullable ColorFilter colorFilter) { + + } + @Override public boolean getPadding(@NonNull Rect padding) { if (needMirroring()) { @@ -108,14 +118,7 @@ public class PopupBackground extends Drawable { updatePath(); return true; } - - @Override - public void setAlpha(int alpha) { - } - - @Override - public void setColorFilter(@Nullable ColorFilter colorFilter) { - } + @Override protected void onBoundsChange(@NonNull Rect bounds) { diff --git a/app/src/main/res/layout/fragment_full_player.xml b/app/src/main/res/layout/fragment_full_player.xml new file mode 100644 index 00000000..54571fc8 --- /dev/null +++ b/app/src/main/res/layout/fragment_full_player.xml @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_layout_test.xml b/app/src/main/res/layout/fragment_layout_test.xml new file mode 100644 index 00000000..f25959b8 --- /dev/null +++ b/app/src/main/res/layout/fragment_layout_test.xml @@ -0,0 +1,214 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ 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 3d230b88..74944748 100755 --- a/app/src/main/res/layout/fragment_player_playback_controls.xml +++ b/app/src/main/res/layout/fragment_player_playback_controls.xml @@ -28,6 +28,7 @@ android:id="@+id/progressSlider" android:layout_width="0dp" android:layout_height="wrap_content" + app:haloRadius="0dp" app:labelBehavior="gone" app:layout_constraintEnd_toStartOf="@id/songTotalTime" app:layout_constraintStart_toEndOf="@id/songCurrentProgress" @@ -74,7 +75,9 @@ android:gravity="center" android:marqueeRepeatLimit="marquee_forever" android:paddingStart="16dp" + android:paddingTop="8dp" android:paddingEnd="16dp" + android:paddingBottom="8dp" android:scrollHorizontally="true" android:singleLine="true" android:textAppearance="@style/TextViewHeadline6" @@ -92,7 +95,9 @@ android:gravity="center" android:maxLines="1" android:paddingStart="16dp" + android:paddingTop="8dp" android:paddingEnd="16dp" + android:paddingBottom="8dp" android:textAppearance="@style/TextViewBody1" android:textColor="?android:attr/textColorSecondary" app:layout_constrainedWidth="true" diff --git a/app/src/main/res/layout/item_list.xml b/app/src/main/res/layout/item_list.xml index 5d15321f..3e5935da 100755 --- a/app/src/main/res/layout/item_list.xml +++ b/app/src/main/res/layout/item_list.xml @@ -22,8 +22,7 @@ android:visibility="gone" app:srcCompat="@drawable/ic_drag_vertical_white_24dp" app:tint="?attr/colorControlNormal" - tools:ignore="ContentDescription" - tools:visibility="visible" /> + tools:ignore="ContentDescription" />