From 4c59089c298bccab47b7bb858042e70626556ab5 Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Sat, 14 May 2022 12:37:10 +0530 Subject: [PATCH 001/280] Fixed crash when only one bottom navigation tab is enabled --- .../retromusic/activities/base/AbsSlidingMusicPanelActivity.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 e9b7d6c33..ae8bab0fc 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 @@ -343,7 +343,7 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() { } if (binding.bottomNavigationView.menu.size() == 1) { isInOneTabMode = true - binding.bottomNavigationView.hide() + binding.bottomNavigationView.isVisible = false } } From 4a2ba10d45fae3219a8fb748ea5f1e3bc92e34de Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Fri, 13 May 2022 00:05:01 +0530 Subject: [PATCH 002/280] Added PlaybackManager --- .../retromusic/service/PlaybackManager.kt | 175 ++++++++++++++++++ 1 file changed, 175 insertions(+) create mode 100644 app/src/main/java/code/name/monkey/retromusic/service/PlaybackManager.kt diff --git a/app/src/main/java/code/name/monkey/retromusic/service/PlaybackManager.kt b/app/src/main/java/code/name/monkey/retromusic/service/PlaybackManager.kt new file mode 100644 index 000000000..9c06bc831 --- /dev/null +++ b/app/src/main/java/code/name/monkey/retromusic/service/PlaybackManager.kt @@ -0,0 +1,175 @@ +package code.name.monkey.retromusic.service + +import android.content.Context +import android.content.Intent +import android.media.audiofx.AudioEffect +import code.name.monkey.retromusic.model.Song +import code.name.monkey.retromusic.service.playback.Playback +import code.name.monkey.retromusic.util.PreferenceUtil +import com.google.android.gms.cast.framework.CastSession + + +class PlaybackManager(val context: Context) { + + var playback: Playback? = null + private var playbackLocation = PlaybackLocation.LOCAL + + val audioSessionId: Int + get() = if (playback != null) { + playback!!.audioSessionId + } else 0 + + val songDurationMillis: Int + get() = if (playback != null) { + playback!!.duration() + } else -1 + + val songProgressMillis: Int + get() = if (playback != null) { + playback!!.position() + } else -1 + + val isPlaying: Boolean + get() = playback != null && playback!!.isPlaying + + init { + playback = createLocalPlayback() + } + + fun setCallbacks(callbacks: Playback.PlaybackCallbacks) { + playback?.setCallbacks(callbacks) + } + + fun play(onNotInitialized: () -> Unit = {}, onPlay: () -> Unit = {}) { + if (playback != null && !playback!!.isPlaying) { + if (!playback!!.isInitialized) { + onNotInitialized() + } else { + openAudioEffectSession() + if (playbackLocation == PlaybackLocation.LOCAL) { + AudioFader.startFadeAnimator(playback!!, true) { + // Code when Animator Ends + onPlay() + } + } + playback?.start() + } + } + } + + fun pause(force: Boolean, onPause: () -> Unit) { + if (playback != null && playback!!.isPlaying) { + if (force) { + playback?.pause() + closeAudioEffectSession() + onPause() + } else { + AudioFader.startFadeAnimator(playback!!, false) { + //Code to run when Animator Ends + playback?.pause() + closeAudioEffectSession() + onPause() + } + } + } + } + + fun seek(millis: Int): Int = playback!!.seek(millis) + + fun setDataSource( + song: Song, + force: Boolean, + completion: (success: Boolean) -> Unit, + ) { + playback?.setDataSource(song, force, completion) + } + + fun setNextDataSource(trackUri: String) { + playback?.setNextDataSource(trackUri) + } + + fun setCrossFadeDuration(duration: Int) { + playback?.setCrossFadeDuration(duration) + } + + fun maybeSwitchToCrossFade(crossFadeDuration: Int) { + /* Switch to MultiPlayer if Crossfade duration is 0 and + Playback is not an instance of MultiPlayer */ + if (playback !is MultiPlayer && crossFadeDuration == 0) { + if (playback != null) { + playback?.release() + } + playback = null + playback = MultiPlayer(context) + } else if (playback !is CrossFadePlayer && crossFadeDuration > 0) { + if (playback != null) { + playback?.release() + } + playback = null + playback = CrossFadePlayer(context) + } + } + + fun release() { + if (playback != null) { + playback?.release() + } + playback = null + closeAudioEffectSession() + } + + fun openAudioEffectSession() { + val intent = Intent(AudioEffect.ACTION_OPEN_AUDIO_EFFECT_CONTROL_SESSION) + intent.putExtra(AudioEffect.EXTRA_AUDIO_SESSION, audioSessionId) + intent.putExtra(AudioEffect.EXTRA_PACKAGE_NAME, context.packageName) + intent.putExtra(AudioEffect.EXTRA_CONTENT_TYPE, AudioEffect.CONTENT_TYPE_MUSIC) + context.sendBroadcast(intent) + } + + fun closeAudioEffectSession() { + val audioEffectsIntent = Intent(AudioEffect.ACTION_CLOSE_AUDIO_EFFECT_CONTROL_SESSION) + if (playback != null) { + audioEffectsIntent.putExtra(AudioEffect.EXTRA_AUDIO_SESSION, + playback!!.audioSessionId) + } + audioEffectsIntent.putExtra(AudioEffect.EXTRA_PACKAGE_NAME, context.packageName) + context.sendBroadcast(audioEffectsIntent) + } + + fun switchToLocalPlayback(onChange: (wasPlaying: Boolean, progress: Int) -> Unit) { + playbackLocation = PlaybackLocation.LOCAL + switchToPlayback(createLocalPlayback(), onChange) + } + + fun switchToRemotePlayback(castSession: CastSession, onChange: (wasPlaying: Boolean, progress: Int) -> Unit) { + playbackLocation = PlaybackLocation.REMOTE + switchToPlayback(CastPlayer(castSession), onChange) + } + + private fun switchToPlayback(playback: Playback, onChange: (wasPlaying: Boolean, progress: Int) -> Unit) { + val oldPlayback = playback + val wasPlaying: Boolean = oldPlayback.isPlaying + val progress: Int = oldPlayback.position() + + this.playback = playback + + oldPlayback.stop() + + onChange(wasPlaying, progress) + } + + private fun createLocalPlayback(): Playback { + // Set MultiPlayer when crossfade duration is 0 i.e. off + return if (PreferenceUtil.crossFadeDuration == 0) { + MultiPlayer(context) + } else { + CrossFadePlayer(context) + } + } + +} + +enum class PlaybackLocation { + LOCAL, + REMOTE +} \ No newline at end of file From b58d97145780e23b057c18d92170559981c27d29 Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Fri, 13 May 2022 00:14:31 +0530 Subject: [PATCH 003/280] Rename .java to .kt --- .../service/{PlaybackHandler.java => PlaybackHandler.kt} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename app/src/main/java/code/name/monkey/retromusic/service/{PlaybackHandler.java => PlaybackHandler.kt} (100%) diff --git a/app/src/main/java/code/name/monkey/retromusic/service/PlaybackHandler.java b/app/src/main/java/code/name/monkey/retromusic/service/PlaybackHandler.kt similarity index 100% rename from app/src/main/java/code/name/monkey/retromusic/service/PlaybackHandler.java rename to app/src/main/java/code/name/monkey/retromusic/service/PlaybackHandler.kt From 70e323eb0ab509576a5ea644cd339048ba6755f4 Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Fri, 13 May 2022 00:14:34 +0530 Subject: [PATCH 004/280] Handle playback with PlaybackManager --- .../retromusic/service/CrossFadePlayer.kt | 44 +- .../retromusic/service/MultiPlayer.java | 368 ----------------- .../monkey/retromusic/service/MultiPlayer.kt | 379 ++++++++++++++++++ .../monkey/retromusic/service/MusicService.kt | 255 +++++------- .../retromusic/service/PlaybackHandler.kt | 261 +++++------- .../retromusic/service/playback/Playback.kt | 8 +- 6 files changed, 617 insertions(+), 698 deletions(-) delete mode 100644 app/src/main/java/code/name/monkey/retromusic/service/MultiPlayer.java create mode 100644 app/src/main/java/code/name/monkey/retromusic/service/MultiPlayer.kt diff --git a/app/src/main/java/code/name/monkey/retromusic/service/CrossFadePlayer.kt b/app/src/main/java/code/name/monkey/retromusic/service/CrossFadePlayer.kt index 13c2310b0..4a54231f7 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/CrossFadePlayer.kt +++ b/app/src/main/java/code/name/monkey/retromusic/service/CrossFadePlayer.kt @@ -14,7 +14,9 @@ import androidx.core.net.toUri import code.name.monkey.appthemehelper.util.VersionUtils.hasMarshmallow import code.name.monkey.retromusic.R import code.name.monkey.retromusic.extensions.showToast +import code.name.monkey.retromusic.extensions.uri import code.name.monkey.retromusic.helper.MusicPlayerRemote +import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.service.AudioFader.Companion.createFadeAnimator import code.name.monkey.retromusic.service.playback.Playback import code.name.monkey.retromusic.service.playback.Playback.PlaybackCallbacks @@ -124,18 +126,26 @@ class CrossFadePlayer(val context: Context) : Playback, MediaPlayer.OnCompletion override val isPlaying: Boolean get() = mIsInitialized && getCurrentPlayer()?.isPlaying == true - override fun setDataSource(path: String, force: Boolean): Boolean { + override fun setDataSource( + song: Song, + force: Boolean, + completion: (success: Boolean) -> Unit, + ) { cancelFade() if (force) hasDataSource = false mIsInitialized = false /* We've already set DataSource if initialized is true in setNextDataSource */ if (!hasDataSource) { - getCurrentPlayer()?.let { mIsInitialized = setDataSourceImpl(it, path) } + getCurrentPlayer()?.let { + setDataSourceImpl(it, song.uri.toString()) { success -> + mIsInitialized = success + completion(success) + } + } hasDataSource = true } else { mIsInitialized = true } - return mIsInitialized } override fun setNextDataSource(path: String?) {} @@ -148,9 +158,9 @@ class CrossFadePlayer(val context: Context) : Playback, MediaPlayer.OnCompletion private fun setDataSourceImpl( player: MediaPlayer, path: String, - ): Boolean { + completion: (success: Boolean) -> Unit, + ) { player.reset() - player.setOnPreparedListener(null) try { if (path.startsWith("content://")) { player.setDataSource(context, path.toUri()) @@ -160,20 +170,18 @@ class CrossFadePlayer(val context: Context) : Playback, MediaPlayer.OnCompletion player.setAudioAttributes( AudioAttributes.Builder().setLegacyStreamType(AudioManager.STREAM_MUSIC).build() ) - player.prepare() - player.setPlaybackSpeedPitch(playbackSpeed, playbackPitch) + player.setPlaybackSpeedPitch(PreferenceUtil.playbackSpeed, PreferenceUtil.playbackPitch) + player.setOnPreparedListener { + player.setOnPreparedListener(null) + completion(true) + } + player.prepareAsync() } catch (e: Exception) { + completion(false) e.printStackTrace() - return false } player.setOnCompletionListener(this) player.setOnErrorListener(this) - val intent = Intent(AudioEffect.ACTION_OPEN_AUDIO_EFFECT_CONTROL_SESSION) - intent.putExtra(AudioEffect.EXTRA_AUDIO_SESSION, audioSessionId) - intent.putExtra(AudioEffect.EXTRA_PACKAGE_NAME, context.packageName) - intent.putExtra(AudioEffect.EXTRA_CONTENT_TYPE, AudioEffect.CONTENT_TYPE_MUSIC) - context.sendBroadcast(intent) - return true } override fun setAudioSessionId(sessionId: Int): Boolean { @@ -321,9 +329,11 @@ class CrossFadePlayer(val context: Context) : Playback, MediaPlayer.OnCompletion getNextPlayer()?.let { player -> val nextSong = MusicPlayerRemote.nextSong if (nextSong != null) { - setDataSourceImpl(player, MusicUtil.getSongFileUri(nextSong.id).toString()) - // Switch to other player / Crossfade only if next song exists - switchPlayer() + setDataSourceImpl(player, + MusicUtil.getSongFileUri(nextSong.id).toString()) { success -> + // Switch to other player (Crossfade) only if next song exists + if (success) switchPlayer() + } } } } 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 deleted file mode 100644 index 66556bbe0..000000000 --- a/app/src/main/java/code/name/monkey/retromusic/service/MultiPlayer.java +++ /dev/null @@ -1,368 +0,0 @@ -/* - * 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.service; - -import android.content.Context; -import android.content.Intent; -import android.media.AudioManager; -import android.media.MediaPlayer; -import android.media.PlaybackParams; -import android.media.audiofx.AudioEffect; -import android.net.Uri; -import android.os.PowerManager; -import android.util.Log; -import android.widget.Toast; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -import org.jetbrains.annotations.NotNull; - -import code.name.monkey.appthemehelper.util.VersionUtils; -import code.name.monkey.retromusic.R; -import code.name.monkey.retromusic.service.playback.Playback; -import code.name.monkey.retromusic.util.PreferenceUtil; - -/** - * @author Andrew Neal, Karim Abou Zeid (kabouzeid) - */ -public class MultiPlayer - implements Playback, MediaPlayer.OnErrorListener, MediaPlayer.OnCompletionListener { - public static final String TAG = MultiPlayer.class.getSimpleName(); - - private MediaPlayer mCurrentMediaPlayer = new MediaPlayer(); - private MediaPlayer mNextMediaPlayer; - - private final Context context; - @Nullable - private Playback.PlaybackCallbacks callbacks; - - private boolean mIsInitialized = false; - - /** - * Constructor of MultiPlayer - */ - MultiPlayer(final Context context) { - this.context = context; - mCurrentMediaPlayer.setWakeMode(context, PowerManager.PARTIAL_WAKE_LOCK); - } - - /** - * @param path The path of the file, or the http/rtsp URL of the stream you want to play - * @return True if the player has been prepared and is ready to play, false otherwise - */ - @Override - public boolean setDataSource(@NotNull final String path, boolean force) { - mIsInitialized = false; - mIsInitialized = setDataSourceImpl(mCurrentMediaPlayer, path); - if (mIsInitialized) { - setNextDataSource(null); - } - return mIsInitialized; - } - - /** - * @param player The {@link MediaPlayer} to use - * @param path The path of the file, or the http/rtsp URL of the stream you want to play - * @return True if the player has been prepared and is ready to play, false otherwise - */ - private boolean setDataSourceImpl(@NonNull final MediaPlayer player, @NonNull final String path) { - if (context == null) { - return false; - } - try { - player.reset(); - player.setOnPreparedListener(null); - if (path.startsWith("content://")) { - player.setDataSource(context, Uri.parse(path)); - } else { - player.setDataSource(path); - } - setPlaybackSpeedPitch(PreferenceUtil.INSTANCE.getPlaybackSpeed(), PreferenceUtil.INSTANCE.getPlaybackPitch()); - player.setAudioStreamType(AudioManager.STREAM_MUSIC); - player.prepare(); - } catch (Exception e) { - return false; - } - player.setOnCompletionListener(this); - player.setOnErrorListener(this); - final Intent intent = new Intent(AudioEffect.ACTION_OPEN_AUDIO_EFFECT_CONTROL_SESSION); - intent.putExtra(AudioEffect.EXTRA_AUDIO_SESSION, getAudioSessionId()); - intent.putExtra(AudioEffect.EXTRA_PACKAGE_NAME, context.getPackageName()); - intent.putExtra(AudioEffect.EXTRA_CONTENT_TYPE, AudioEffect.CONTENT_TYPE_MUSIC); - context.sendBroadcast(intent); - return true; - } - - /** - * Set the MediaPlayer to start when this MediaPlayer finishes playback. - * - * @param path The path of the file, or the http/rtsp URL of the stream you want to play - */ - @Override - public void setNextDataSource(@Nullable final String path) { - if (context == null) { - return; - } - try { - mCurrentMediaPlayer.setNextMediaPlayer(null); - } catch (IllegalArgumentException e) { - Log.i(TAG, "Next media player is current one, continuing"); - } catch (IllegalStateException e) { - Log.e(TAG, "Media player not initialized!"); - return; - } - if (mNextMediaPlayer != null) { - mNextMediaPlayer.release(); - mNextMediaPlayer = null; - } - if (path == null) { - return; - } - if (PreferenceUtil.INSTANCE.isGapLessPlayback()) { - mNextMediaPlayer = new MediaPlayer(); - mNextMediaPlayer.setWakeMode(context, PowerManager.PARTIAL_WAKE_LOCK); - mNextMediaPlayer.setAudioSessionId(getAudioSessionId()); - if (setDataSourceImpl(mNextMediaPlayer, path)) { - try { - mCurrentMediaPlayer.setNextMediaPlayer(mNextMediaPlayer); - } catch (@NonNull IllegalArgumentException | IllegalStateException e) { - Log.e(TAG, "setNextDataSource: setNextMediaPlayer()", e); - if (mNextMediaPlayer != null) { - mNextMediaPlayer.release(); - mNextMediaPlayer = null; - } - } - } else { - if (mNextMediaPlayer != null) { - mNextMediaPlayer.release(); - mNextMediaPlayer = null; - } - } - } - } - - /** - * Sets the callbacks - * - * @param callbacks The callbacks to use - */ - @Override - public void setCallbacks(@Nullable final Playback.PlaybackCallbacks callbacks) { - this.callbacks = callbacks; - } - - /** - * @return True if the player is ready to go, false otherwise - */ - @Override - public boolean isInitialized() { - return mIsInitialized; - } - - /** - * Starts or resumes playback. - */ - @Override - public boolean start() { - try { - mCurrentMediaPlayer.start(); - return true; - } catch (IllegalStateException e) { - return false; - } - } - - /** - * Resets the MediaPlayer to its uninitialized state. - */ - @Override - public void stop() { - mCurrentMediaPlayer.reset(); - mIsInitialized = false; - } - - /** - * Releases resources associated with this MediaPlayer object. - */ - @Override - public void release() { - stop(); - mCurrentMediaPlayer.release(); - if (mNextMediaPlayer != null) { - mNextMediaPlayer.release(); - } - } - - /** - * Pauses playback. Call start() to resume. - */ - @Override - public boolean pause() { - try { - mCurrentMediaPlayer.pause(); - return true; - } catch (IllegalStateException e) { - return false; - } - } - - /** - * Checks whether the MultiPlayer is playing. - */ - @Override - public boolean isPlaying() { - return mIsInitialized && mCurrentMediaPlayer.isPlaying(); - } - - /** - * Gets the duration of the file. - * - * @return The duration in milliseconds - */ - @Override - public int duration() { - if (!mIsInitialized) { - return -1; - } - try { - return mCurrentMediaPlayer.getDuration(); - } catch (IllegalStateException e) { - return -1; - } - } - - /** - * Gets the current playback position. - * - * @return The current position in milliseconds - */ - @Override - public int position() { - if (!mIsInitialized) { - return -1; - } - try { - return mCurrentMediaPlayer.getCurrentPosition(); - } catch (IllegalStateException e) { - return -1; - } - } - - /** - * Gets the current playback position. - * - * @param whereto The offset in milliseconds from the start to seek to - * @return The offset in milliseconds from the start to seek to - */ - @Override - public int seek(final int whereto) { - try { - mCurrentMediaPlayer.seekTo(whereto); - return whereto; - } catch (IllegalStateException e) { - return -1; - } - } - - @Override - public boolean setVolume(final float vol) { - try { - mCurrentMediaPlayer.setVolume(vol, vol); - return true; - } catch (IllegalStateException e) { - return false; - } - } - - /** - * Sets the audio session ID. - * - * @param sessionId The audio session ID - */ - @Override - public boolean setAudioSessionId(final int sessionId) { - try { - mCurrentMediaPlayer.setAudioSessionId(sessionId); - return true; - } catch (@NonNull IllegalArgumentException | IllegalStateException e) { - return false; - } - } - - /** - * Returns the audio session ID. - * - * @return The current audio session ID. - */ - @Override - public int getAudioSessionId() { - return mCurrentMediaPlayer.getAudioSessionId(); - } - - /** - * {@inheritDoc} - */ - @Override - public boolean onError(final MediaPlayer mp, final int what, final int extra) { - mIsInitialized = false; - mCurrentMediaPlayer.release(); - mCurrentMediaPlayer = new MediaPlayer(); - mCurrentMediaPlayer.setWakeMode(context, PowerManager.PARTIAL_WAKE_LOCK); - if (context != null) { - Toast.makeText( - context, - context.getResources().getString(R.string.unplayable_file), - Toast.LENGTH_SHORT) - .show(); - Log.e(TAG, String.valueOf(what) + extra); - } - return false; - } - - /** - * {@inheritDoc} - */ - @Override - public void onCompletion(final MediaPlayer mp) { - if (mp.equals(mCurrentMediaPlayer) && mNextMediaPlayer != null) { - mIsInitialized = false; - mCurrentMediaPlayer.release(); - mCurrentMediaPlayer = mNextMediaPlayer; - mIsInitialized = true; - mNextMediaPlayer = null; - if (callbacks != null) callbacks.onTrackWentToNext(); - } else { - if (callbacks != null) callbacks.onTrackEnded(); - } - } - - @Override - public void setCrossFadeDuration(int duration) { - } - - @Override - public void setPlaybackSpeedPitch(float speed, float pitch) { - if (VersionUtils.INSTANCE.hasMarshmallow()) { - boolean wasPlaying = mCurrentMediaPlayer.isPlaying(); - mCurrentMediaPlayer.setPlaybackParams(new PlaybackParams() - .setSpeed(PreferenceUtil.INSTANCE.getPlaybackSpeed()) - .setPitch(PreferenceUtil.INSTANCE.getPlaybackPitch())); - if (!wasPlaying) { - if (mCurrentMediaPlayer.isPlaying()) mCurrentMediaPlayer.pause(); - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/service/MultiPlayer.kt b/app/src/main/java/code/name/monkey/retromusic/service/MultiPlayer.kt new file mode 100644 index 000000000..89dda0868 --- /dev/null +++ b/app/src/main/java/code/name/monkey/retromusic/service/MultiPlayer.kt @@ -0,0 +1,379 @@ +/* + * 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.service + +import android.content.Context +import android.content.Intent +import android.content.SharedPreferences +import android.content.SharedPreferences.OnSharedPreferenceChangeListener +import android.media.AudioAttributes +import android.media.MediaPlayer +import android.media.MediaPlayer.OnCompletionListener +import android.media.PlaybackParams +import android.media.audiofx.AudioEffect +import android.net.Uri +import android.os.PowerManager +import android.util.Log +import androidx.preference.PreferenceManager +import code.name.monkey.appthemehelper.util.VersionUtils.hasMarshmallow +import code.name.monkey.retromusic.PLAYBACK_PITCH +import code.name.monkey.retromusic.PLAYBACK_SPEED +import code.name.monkey.retromusic.R +import code.name.monkey.retromusic.extensions.showToast +import code.name.monkey.retromusic.extensions.uri +import code.name.monkey.retromusic.model.Song +import code.name.monkey.retromusic.service.playback.Playback +import code.name.monkey.retromusic.service.playback.Playback.PlaybackCallbacks +import code.name.monkey.retromusic.util.PreferenceUtil.isGapLessPlayback +import code.name.monkey.retromusic.util.PreferenceUtil.playbackPitch +import code.name.monkey.retromusic.util.PreferenceUtil.playbackSpeed + +/** + * @author Andrew Neal, Karim Abou Zeid (kabouzeid) + */ +class MultiPlayer internal constructor(private val context: Context) : Playback, + MediaPlayer.OnErrorListener, OnCompletionListener, OnSharedPreferenceChangeListener { + private var mCurrentMediaPlayer = MediaPlayer() + private var mNextMediaPlayer: MediaPlayer? = null + private var callbacks: PlaybackCallbacks? = null + + /** + * @return True if the player is ready to go, false otherwise + */ + override var isInitialized = false + private set + + /** + * @param path The path of the file, or the http/rtsp URL of the stream you want to play + * @return True if the `player` has been prepared and is ready to play, false otherwise + */ + override fun setDataSource( + song: Song, + force: Boolean, + completion: (success: Boolean) -> Unit, + ) { + isInitialized = false + setDataSourceImpl(mCurrentMediaPlayer, song.uri.toString()) { success -> + isInitialized = success + if (isInitialized) { + setNextDataSource(null) + } + completion(isInitialized) + } + } + + /** + * @param player The [MediaPlayer] to use + * @param path The path of the file, or the http/rtsp URL of the stream you want to play + * @return True if the `player` has been prepared and is ready to play, false otherwise + */ + private fun setDataSourceImpl( + player: MediaPlayer, + path: String, + completion: (success: Boolean) -> Unit, + ) { + try { + player.reset() + player.setOnPreparedListener(null) + if (path.startsWith("content://")) { + player.setDataSource(context, Uri.parse(path)) + } else { + player.setDataSource(path) + } + setPlaybackSpeedPitch(player) + player.setAudioAttributes(AudioAttributes.Builder() + .setUsage(AudioAttributes.USAGE_MEDIA) + .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) + .build() + ) + player.setOnPreparedListener { + player.setOnPreparedListener(null) + completion(true) + } + player.prepareAsync() + } catch (e: Exception) { + completion(false) + e.printStackTrace() + } + player.setOnCompletionListener(this) + player.setOnErrorListener(this) + } + + fun openEqualizerSession() { + val intent = Intent(AudioEffect.ACTION_OPEN_AUDIO_EFFECT_CONTROL_SESSION) + intent.putExtra(AudioEffect.EXTRA_AUDIO_SESSION, audioSessionId) + intent.putExtra(AudioEffect.EXTRA_PACKAGE_NAME, context.packageName) + intent.putExtra(AudioEffect.EXTRA_CONTENT_TYPE, AudioEffect.CONTENT_TYPE_MUSIC) + context.sendBroadcast(intent) + } + + fun closeEqualizerSession() { + val intent = Intent(AudioEffect.ACTION_CLOSE_AUDIO_EFFECT_CONTROL_SESSION) + intent.putExtra(AudioEffect.EXTRA_AUDIO_SESSION, audioSessionId) + intent.putExtra(AudioEffect.EXTRA_PACKAGE_NAME, context.packageName) + intent.putExtra(AudioEffect.EXTRA_CONTENT_TYPE, AudioEffect.CONTENT_TYPE_MUSIC) + context.sendBroadcast(intent) + } + + /** + * Set the MediaPlayer to start when this MediaPlayer finishes playback. + * + * @param path The path of the file, or the http/rtsp URL of the stream you want to play + */ + override fun setNextDataSource(path: String?) { + try { + mCurrentMediaPlayer.setNextMediaPlayer(null) + } catch (e: IllegalArgumentException) { + Log.i(TAG, "Next media player is current one, continuing") + } catch (e: IllegalStateException) { + Log.e(TAG, "Media player not initialized!") + return + } + if (mNextMediaPlayer != null) { + mNextMediaPlayer?.release() + mNextMediaPlayer = null + } + if (path == null) { + return + } + if (isGapLessPlayback) { + mNextMediaPlayer = MediaPlayer() + mNextMediaPlayer?.setWakeMode(context, PowerManager.PARTIAL_WAKE_LOCK) + mNextMediaPlayer?.audioSessionId = audioSessionId + setDataSourceImpl(mNextMediaPlayer!!, path) { success -> + if (success) { + try { + mCurrentMediaPlayer.setNextMediaPlayer(mNextMediaPlayer) + } catch (e: IllegalArgumentException) { + Log.e(TAG, "setNextDataSource: setNextMediaPlayer()", e) + if (mNextMediaPlayer != null) { + mNextMediaPlayer?.release() + mNextMediaPlayer = null + } + } catch (e: IllegalStateException) { + Log.e(TAG, "setNextDataSource: setNextMediaPlayer()", e) + if (mNextMediaPlayer != null) { + mNextMediaPlayer?.release() + mNextMediaPlayer = null + } + } + } else { + if (mNextMediaPlayer != null) { + mNextMediaPlayer?.release() + mNextMediaPlayer = null + } + } + } + } + } + + /** + * Sets the callbacks + * + * @param callbacks The callbacks to use + */ + override fun setCallbacks(callbacks: PlaybackCallbacks) { + this.callbacks = callbacks + } + + /** + * Starts or resumes playback. + */ + override fun start(): Boolean { + return try { + mCurrentMediaPlayer.start() + true + } catch (e: IllegalStateException) { + false + } + } + + /** + * Resets the MediaPlayer to its uninitialized state. + */ + override fun stop() { + mCurrentMediaPlayer.reset() + isInitialized = false + } + + /** + * Releases resources associated with this MediaPlayer object. + */ + override fun release() { + stop() + mCurrentMediaPlayer.release() + if (mNextMediaPlayer != null) { + mNextMediaPlayer?.release() + } + PreferenceManager.getDefaultSharedPreferences(context) + .unregisterOnSharedPreferenceChangeListener(this) + } + + /** + * Pauses playback. Call start() to resume. + */ + override fun pause(): Boolean { + return try { + mCurrentMediaPlayer.pause() + true + } catch (e: IllegalStateException) { + false + } + } + + /** + * Checks whether the MultiPlayer is playing. + */ + override val isPlaying: Boolean + get() = isInitialized && mCurrentMediaPlayer.isPlaying + + /** + * Gets the duration of the file. + * + * @return The duration in milliseconds + */ + override fun duration(): Int { + return if (!this.isInitialized) { + -1 + } else try { + mCurrentMediaPlayer.duration + } catch (e: IllegalStateException) { + -1 + } + } + + /** + * Gets the current playback position. + * + * @return The current position in milliseconds + */ + override fun position(): Int { + return if (!this.isInitialized) { + -1 + } else try { + mCurrentMediaPlayer.currentPosition + } catch (e: IllegalStateException) { + -1 + } + } + + /** + * Gets the current playback position. + * + * @param whereto The offset in milliseconds from the start to seek to + * @return The offset in milliseconds from the start to seek to + */ + override fun seek(whereto: Int): Int { + return try { + mCurrentMediaPlayer.seekTo(whereto) + whereto + } catch (e: IllegalStateException) { + -1 + } + } + + override fun setVolume(vol: Float): Boolean { + return try { + mCurrentMediaPlayer.setVolume(vol, vol) + true + } catch (e: IllegalStateException) { + false + } + } + + /** + * Sets the audio session ID. + * + * @param sessionId The audio session ID + */ + override fun setAudioSessionId(sessionId: Int): Boolean { + return try { + mCurrentMediaPlayer.audioSessionId = sessionId + true + } catch (e: IllegalArgumentException) { + false + } catch (e: IllegalStateException) { + false + } + } + + /** + * Returns the audio session ID. + * + * @return The current audio session ID. + */ + override val audioSessionId: Int + get() = mCurrentMediaPlayer.audioSessionId + + /** + * {@inheritDoc} + */ + override fun onError(mp: MediaPlayer, what: Int, extra: Int): Boolean { + isInitialized = false + mCurrentMediaPlayer.release() + mCurrentMediaPlayer = MediaPlayer() + mCurrentMediaPlayer.setWakeMode(context, PowerManager.PARTIAL_WAKE_LOCK) + context.showToast(R.string.unplayable_file) + Log.e(TAG, what.toString() + extra) + return false + } + + /** + * {@inheritDoc} + */ + override fun onCompletion(mp: MediaPlayer) { + if (mp == mCurrentMediaPlayer && mNextMediaPlayer != null) { + isInitialized = false + mCurrentMediaPlayer.release() + mCurrentMediaPlayer = mNextMediaPlayer!! + isInitialized = true + mNextMediaPlayer = null + if (callbacks != null) callbacks?.onTrackWentToNext() + } else { + if (callbacks != null) callbacks?.onTrackEnded() + } + } + + override fun setCrossFadeDuration(duration: Int) {} + override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) { + if (key == PLAYBACK_SPEED || key == PLAYBACK_PITCH) { + setPlaybackSpeedPitch(mCurrentMediaPlayer) + } + } + + private fun setPlaybackSpeedPitch(mp: MediaPlayer) { + if (hasMarshmallow()) { + val wasPlaying = mp.isPlaying + mp.playbackParams = PlaybackParams() + .setSpeed(playbackSpeed) + .setPitch(playbackPitch) + if (!wasPlaying) { + if (mp.isPlaying) mp.pause() + } + } + } + + companion object { + val TAG: String = MultiPlayer::class.java.simpleName + } + + /** + * Constructor of `MultiPlayer` + */ + init { + mCurrentMediaPlayer.setWakeMode(context, PowerManager.PARTIAL_WAKE_LOCK) + PreferenceManager.getDefaultSharedPreferences(context) + .registerOnSharedPreferenceChangeListener(this) + } +} \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt b/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt index 4274978e0..7dd58ef5a 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt +++ b/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt @@ -25,7 +25,6 @@ import android.graphics.Bitmap import android.graphics.drawable.Drawable import android.media.AudioManager import android.media.AudioManager.OnAudioFocusChangeListener -import android.media.audiofx.AudioEffect import android.os.* import android.os.Build.VERSION import android.os.Build.VERSION_CODES @@ -57,11 +56,11 @@ import code.name.monkey.retromusic.auto.AutoMediaIDHelper import code.name.monkey.retromusic.auto.AutoMusicProvider import code.name.monkey.retromusic.extensions.showToast import code.name.monkey.retromusic.extensions.toMediaSessionQueue +import code.name.monkey.retromusic.extensions.uri import code.name.monkey.retromusic.glide.BlurTransformation import code.name.monkey.retromusic.glide.GlideApp import code.name.monkey.retromusic.glide.RetroGlideExtension.getDefaultTransition import code.name.monkey.retromusic.glide.RetroGlideExtension.getSongModel -import code.name.monkey.retromusic.helper.MusicPlayerRemote.isCasting import code.name.monkey.retromusic.helper.ShuffleHelper.makeShuffleList import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.model.Song.Companion.emptySong @@ -69,14 +68,12 @@ import code.name.monkey.retromusic.model.smartplaylist.AbsSmartPlaylist import code.name.monkey.retromusic.providers.HistoryStore import code.name.monkey.retromusic.providers.MusicPlaybackQueueStore import code.name.monkey.retromusic.providers.SongPlayCountStore -import code.name.monkey.retromusic.service.AudioFader.Companion.startFadeAnimator import code.name.monkey.retromusic.service.notification.PlayingNotification import code.name.monkey.retromusic.service.notification.PlayingNotificationClassic import code.name.monkey.retromusic.service.notification.PlayingNotificationImpl24 import code.name.monkey.retromusic.service.playback.Playback import code.name.monkey.retromusic.service.playback.Playback.PlaybackCallbacks import code.name.monkey.retromusic.util.MusicUtil.getMediaStoreAlbumCoverUri -import code.name.monkey.retromusic.util.MusicUtil.getSongFileUri import code.name.monkey.retromusic.util.MusicUtil.toggleFavorite import code.name.monkey.retromusic.util.PackageValidator import code.name.monkey.retromusic.util.PreferenceUtil.crossFadeDuration @@ -96,6 +93,7 @@ import code.name.monkey.retromusic.volume.OnAudioVolumeChangedListener import com.bumptech.glide.request.target.CustomTarget import com.bumptech.glide.request.target.Target import com.bumptech.glide.request.transition.Transition +import com.google.android.gms.cast.framework.CastSession import org.koin.java.KoinJavaComponent.get import java.util.* @@ -112,8 +110,10 @@ class MusicService : MediaBrowserServiceCompat(), @JvmField var pendingQuit = false - @JvmField - var playback: Playback? = null + private lateinit var playbackManager: PlaybackManager + + val playback: Playback? get() = playbackManager.playback + private var mPackageValidator: PackageValidator? = null private val mMusicProvider = get(AutoMusicProvider::class.java) private var trackEndedByCrossfade = false @@ -288,15 +288,10 @@ class MusicService : MediaBrowserServiceCompat(), wakeLock?.setReferenceCounted(false) musicPlayerHandlerThread = HandlerThread("PlaybackHandler") musicPlayerHandlerThread?.start() - playerHandler = PlaybackHandler(this, musicPlayerHandlerThread!!.looper) + playerHandler = PlaybackHandler(this, mainLooper) - // Set MultiPlayer when crossfade duration is 0 i.e. off - playback = if (crossFadeDuration == 0) { - MultiPlayer(this) - } else { - CrossFadePlayer(this) - } - playback?.setCallbacks(this) + playbackManager = PlaybackManager(this) + playbackManager.setCallbacks(this) setupMediaSession() // queue saving needs to run on a separate thread so that it doesn't block the playback handler @@ -457,11 +452,11 @@ class MusicService : MediaBrowserServiceCompat(), } val audioSessionId: Int - get() = if (playback != null) { - playback!!.audioSessionId - } else -1 + get() = playbackManager.audioSessionId + val currentSong: Song get() = getSongAt(getPosition()) + val nextSong: Song? get() = if (isLastTrack && repeatMode == REPEAT_MODE_NONE) { null @@ -501,9 +496,11 @@ class MusicService : MediaBrowserServiceCompat(), } private fun setPosition(position: Int) { - // handle this on the handlers thread to avoid blocking the ui thread - playerHandler?.removeMessages(SET_POSITION) - playerHandler?.obtainMessage(SET_POSITION, position, 0)?.sendToTarget() + openTrackAndPrepareNextAt(position) { success -> + if (success) { + notifyChange(PLAY_STATE_CHANGED) + } + } } private fun getPreviousPosition(force: Boolean): Int { @@ -577,13 +574,10 @@ class MusicService : MediaBrowserServiceCompat(), } val songDurationMillis: Int - get() = if (playback != null) { - playback!!.duration() - } else -1 + get() = playbackManager.songDurationMillis + val songProgressMillis: Int - get() = if (playback != null) { - playback!!.position() - } else -1 + get() = playbackManager.songProgressMillis fun handleAndSendChangeInternal(what: String) { handleChangeInternal(what) @@ -602,8 +596,9 @@ class MusicService : MediaBrowserServiceCompat(), val isLastTrack: Boolean get() = getPosition() == playingQueue.size - 1 + val isPlaying: Boolean - get() = playback != null && playback!!.isPlaying + get() = playbackManager.isPlaying fun moveSong(from: Int, to: Int) { if (from == to) { @@ -702,38 +697,10 @@ class MusicService : MediaBrowserServiceCompat(), CROSS_FADE_DURATION -> { val progress = songProgressMillis val wasPlaying = isPlaying - /* Switch to MultiPlayer if Crossfade duration is 0 and - Playback is not an instance of MultiPlayer */ - if (playback !is MultiPlayer && crossFadeDuration == 0) { - if (playback != null) { - playback?.release() - } - playback = null - playback = MultiPlayer(this) - playback?.setCallbacks(this) - if (openTrackAndPrepareNextAt(position)) { - seek(progress) - if (wasPlaying) { - play() - } - } - } else if (playback !is CrossFadePlayer && crossFadeDuration > 0) { - if (playback != null) { - playback?.release() - } - playback = null - playback = CrossFadePlayer(this) - playback?.setCallbacks(this) - if (openTrackAndPrepareNextAt(position)) { - seek(progress) - if (wasPlaying) { - play() - } - } - } - if (playback != null) playback?.setCrossFadeDuration( - crossFadeDuration - ) + + playbackManager.maybeSwitchToCrossFade(crossFadeDuration) + restorePlaybackState(wasPlaying, progress) + } ALBUM_ART_ON_LOCK_SCREEN, BLURRED_ALBUM_ART -> updateMediaSessionMetaData() COLORED_NOTIFICATION -> { @@ -795,6 +762,10 @@ class MusicService : MediaBrowserServiceCompat(), playerHandler?.sendEmptyMessage(TRACK_WENT_TO_NEXT) } + override fun onPlayStateChanged() { + notifyChange(PLAY_STATE_CHANGED) + } + override fun onUnbind(intent: Intent): Boolean { if (!isPlaying) { stopSelf() @@ -828,34 +799,21 @@ class MusicService : MediaBrowserServiceCompat(), } @Synchronized - fun openTrackAndPrepareNextAt(position: Int): Boolean { + fun openTrackAndPrepareNextAt(position: Int, completion: (success: Boolean) -> Unit) { this.position = position - val prepared = openCurrent() - if (prepared) { - prepareNextImpl() - } - notifyChange(META_CHANGED) - notHandledMetaChangedForCurrentTrack = false - return prepared - } - - fun pause() { - Log.i(TAG, "Paused") - isPausedByTransientLossOfFocus = false - if (playback != null && playback!!.isPlaying) { - startFadeAnimator(playback!!, false) { - - //Code to run when Animator Ends - playback?.pause() - notifyChange(PLAY_STATE_CHANGED) + openCurrent { success -> + if (success) { + prepareNextImpl() } + notifyChange(META_CHANGED) + notHandledMetaChangedForCurrentTrack = false + completion(success) } } - fun forcePause() { + fun pause(force: Boolean = false) { isPausedByTransientLossOfFocus = false - if (playback != null && playback!!.isPlaying) { - playback?.pause() + playbackManager.pause(force) { notifyChange(PLAY_STATE_CHANGED) } } @@ -863,39 +821,26 @@ class MusicService : MediaBrowserServiceCompat(), @Synchronized fun play() { if (requestFocus()) { - if (playback != null && !playback!!.isPlaying) { - if (!playback!!.isInitialized) { - playSongAt(getPosition()) - } else { - //Don't Start playing when it's casting - if (isCasting) { - return - } - startFadeAnimator(playback!!, true) { + playbackManager.play(onNotInitialized = { playSongAt(getPosition()) }) { - // Code when Animator Ends - if (!becomingNoisyReceiverRegistered) { - registerReceiver( - becomingNoisyReceiver, - becomingNoisyReceiverIntentFilter - ) - becomingNoisyReceiverRegistered = true - } - if (notHandledMetaChangedForCurrentTrack) { - handleChangeInternal(META_CHANGED) - notHandledMetaChangedForCurrentTrack = false - } - - // fixes a bug where the volume would stay ducked because the - // AudioManager.AUDIOFOCUS_GAIN event is not sent - playerHandler?.removeMessages(DUCK) - playerHandler?.sendEmptyMessage(UNDUCK) - } - //Start Playback with Animator - playback?.start() - notifyChange(PLAY_STATE_CHANGED) + if (!becomingNoisyReceiverRegistered) { + registerReceiver( + becomingNoisyReceiver, + becomingNoisyReceiverIntentFilter + ) + becomingNoisyReceiverRegistered = true } + if (notHandledMetaChangedForCurrentTrack) { + handleChangeInternal(META_CHANGED) + notHandledMetaChangedForCurrentTrack = false + } + + // fixes a bug where the volume would stay ducked because the + // AudioManager.AUDIOFOCUS_GAIN event is not sent + playerHandler?.removeMessages(DUCK) + playerHandler?.sendEmptyMessage(UNDUCK) } + notifyChange(PLAY_STATE_CHANGED) } else { showToast(R.string.audio_focus_denied) } @@ -910,16 +855,12 @@ class MusicService : MediaBrowserServiceCompat(), } fun playSongAt(position: Int) { - // handle this on the handlers thread to avoid blocking the ui thread - playerHandler?.removeMessages(PLAY_SONG) - playerHandler?.obtainMessage(PLAY_SONG, position, 0)?.sendToTarget() - } - - fun playSongAtImpl(position: Int) { - if (openTrackAndPrepareNextAt(position)) { - play() - } else { - showToast(resources.getString(R.string.unplayable_file)) + openTrackAndPrepareNextAt(position) { success -> + if (success) { + play() + } else { + showToast(resources.getString(R.string.unplayable_file)) + } } } @@ -942,7 +883,7 @@ class MusicService : MediaBrowserServiceCompat(), fun prepareNextImpl() { try { val nextPosition = getNextPosition(false) - playback?.setNextDataSource(getTrackUri(getSongAt(nextPosition))) + playbackManager.setNextDataSource(getSongAt(nextPosition).uri.toString()) this.nextPosition = nextPosition } catch (ignored: Exception) { } @@ -952,7 +893,7 @@ class MusicService : MediaBrowserServiceCompat(), pause() stopForeground(true) notificationManager?.cancel(PlayingNotification.NOTIFICATION_ID) - closeAudioEffectSession() + playbackManager.closeAudioEffectSession() audioManager?.abandonAudioFocus(audioFocusListener) stopSelf() } @@ -1030,13 +971,15 @@ class MusicService : MediaBrowserServiceCompat(), originalPlayingQueue = ArrayList(restoredOriginalQueue) playingQueue = ArrayList(restoredQueue) position = restoredPosition - openCurrent() - prepareNext() - if (restoredPositionInTrack > 0) { - seek(restoredPositionInTrack) + openCurrent { + prepareNext() + if (restoredPositionInTrack > 0) { + seek(restoredPositionInTrack) + } + notHandledMetaChangedForCurrentTrack = true + sendChangeInternal(META_CHANGED) } - notHandledMetaChangedForCurrentTrack = true - sendChangeInternal(META_CHANGED) + sendChangeInternal(QUEUE_CHANGED) } } @@ -1067,9 +1010,7 @@ class MusicService : MediaBrowserServiceCompat(), fun seek(millis: Int): Int { return try { var newPosition = 0 - if (playback != null) { - newPosition = playback!!.seek(millis) - } + newPosition = playbackManager.seek(millis) throttledSeekHandler?.notifySeek() newPosition } catch (e: Exception) { @@ -1178,15 +1119,6 @@ class MusicService : MediaBrowserServiceCompat(), } } - private fun closeAudioEffectSession() { - val audioEffectsIntent = Intent(AudioEffect.ACTION_CLOSE_AUDIO_EFFECT_CONTROL_SESSION) - if (playback != null) { - audioEffectsIntent.putExtra(AudioEffect.EXTRA_AUDIO_SESSION, playback!!.audioSessionId) - } - audioEffectsIntent.putExtra(AudioEffect.EXTRA_PACKAGE_NAME, packageName) - sendBroadcast(audioEffectsIntent) - } - private fun handleChangeInternal(what: String) { when (what) { PLAY_STATE_CHANGED -> { @@ -1284,23 +1216,39 @@ class MusicService : MediaBrowserServiceCompat(), } @Synchronized - private fun openCurrent(): Boolean { + private fun openCurrent(completion: (success: Boolean) -> Unit) { val force = if (!trackEndedByCrossfade) { true } else { trackEndedByCrossfade = false false } - return try { - if (playback != null) { - return playback!!.setDataSource(getTrackUri(currentSong), force) - } else false - } catch (e: Exception) { - e.printStackTrace() - false + playbackManager.setDataSource(currentSong, force) { success -> + completion(success) } } + fun switchToLocalPlayback() { + playbackManager.switchToLocalPlayback(this::restorePlaybackState) + } + + fun switchToRemotePlayback(castSession: CastSession) { + playbackManager.switchToRemotePlayback(castSession, this::restorePlaybackState) + } + + private fun restorePlaybackState(wasPlaying: Boolean, progress: Int) { + playbackManager.setCallbacks(this) + openTrackAndPrepareNextAt(position) { success -> + if (success) { + seek(progress) + if (wasPlaying) { + play() + } + } + } + playbackManager.setCrossFadeDuration(crossFadeDuration) + } + private fun playFromPlaylist(intent: Intent) { val playlist: AbsSmartPlaylist? = intent.getParcelableExtra(INTENT_EXTRA_PLAYLIST) val shuffleMode = intent.getIntExtra(INTENT_EXTRA_SHUFFLE_MODE, getShuffleMode()) @@ -1347,10 +1295,7 @@ class MusicService : MediaBrowserServiceCompat(), musicPlayerHandlerThread?.quitSafely() queueSaveHandler?.removeCallbacksAndMessages(null) queueSaveHandlerThread?.quitSafely() - if (playback != null) { - playback?.release() - } - playback = null + playbackManager.release() mediaSession?.release() } @@ -1508,9 +1453,5 @@ class MusicService : MediaBrowserServiceCompat(), null } } - - private fun getTrackUri(song: Song): String { - return getSongFileUri(song.id).toString() - } } } \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/service/PlaybackHandler.kt b/app/src/main/java/code/name/monkey/retromusic/service/PlaybackHandler.kt index 8c92a8f5e..86fbb04ac 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/PlaybackHandler.kt +++ b/app/src/main/java/code/name/monkey/retromusic/service/PlaybackHandler.kt @@ -11,165 +11,116 @@ * 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.service -package code.name.monkey.retromusic.service; +import android.media.AudioManager +import android.os.Handler +import android.os.Looper +import android.os.Message +import code.name.monkey.retromusic.util.PreferenceUtil.isAudioDucking +import code.name.monkey.retromusic.util.PreferenceUtil.isAudioFocusEnabled +import java.lang.ref.WeakReference -import static code.name.monkey.retromusic.service.MusicService.DUCK; -import static code.name.monkey.retromusic.service.MusicService.META_CHANGED; -import static code.name.monkey.retromusic.service.MusicService.PLAY_STATE_CHANGED; -import static code.name.monkey.retromusic.service.MusicService.REPEAT_MODE_NONE; -import static code.name.monkey.retromusic.service.MusicService.TRACK_ENDED; -import static code.name.monkey.retromusic.service.MusicService.TRACK_WENT_TO_NEXT; +internal class PlaybackHandler(service: MusicService, looper: Looper) : Handler(looper) { + private val mService: WeakReference + private var currentDuckVolume = 1.0f -import android.media.AudioManager; -import android.os.Handler; -import android.os.Looper; -import android.os.Message; - -import androidx.annotation.NonNull; - -import java.lang.ref.WeakReference; - -import code.name.monkey.retromusic.util.PreferenceUtil; - -class PlaybackHandler extends Handler { - - @NonNull private final WeakReference mService; - private float currentDuckVolume = 1.0f; - - - PlaybackHandler(final MusicService service, @NonNull final Looper looper) { - super(looper); - mService = new WeakReference<>(service); - } - - @Override - public void handleMessage(@NonNull final Message msg) { - final MusicService service = mService.get(); - if (service == null) { - return; + override fun handleMessage(msg: Message) { + val service = mService.get() ?: return + when (msg.what) { + MusicService.DUCK -> { + if (isAudioDucking) { + currentDuckVolume -= .05f + if (currentDuckVolume > .2f) { + sendEmptyMessageDelayed(MusicService.DUCK, 10) + } else { + currentDuckVolume = .2f + } + } else { + currentDuckVolume = 1f + } + service.playback?.setVolume(currentDuckVolume) + } + MusicService.UNDUCK -> { + if (isAudioDucking) { + currentDuckVolume += .03f + if (currentDuckVolume < 1f) { + sendEmptyMessageDelayed(MusicService.UNDUCK, 10) + } else { + currentDuckVolume = 1f + } + } else { + currentDuckVolume = 1f + } + service.playback?.setVolume(currentDuckVolume) + } + MusicService.TRACK_WENT_TO_NEXT -> + if (service.pendingQuit || service.repeatMode == MusicService.REPEAT_MODE_NONE && service.isLastTrack) { + service.pause(false) + service.seek(0) + if (service.pendingQuit) { + service.pendingQuit = false + service.quit() + } + } else { + service.position = service.nextPosition + service.prepareNextImpl() + service.notifyChange(MusicService.META_CHANGED) + } + MusicService.TRACK_ENDED -> { + // if there is a timer finished, don't continue + if (service.pendingQuit + || service.repeatMode == MusicService.REPEAT_MODE_NONE && service.isLastTrack + ) { + service.notifyChange(MusicService.PLAY_STATE_CHANGED) + service.seek(0) + if (service.pendingQuit) { + service.pendingQuit = false + service.quit() + } + } else { + service.playNextSong(false) + } + sendEmptyMessage(MusicService.RELEASE_WAKELOCK) + } + MusicService.RELEASE_WAKELOCK -> service.releaseWakeLock() + MusicService.PREPARE_NEXT -> service.prepareNextImpl() + MusicService.RESTORE_QUEUES -> service.restoreQueuesAndPositionIfNecessary() + MusicService.FOCUS_CHANGE -> when (msg.arg1) { + AudioManager.AUDIOFOCUS_GAIN -> { + if (!service.isPlaying && service.isPausedByTransientLossOfFocus) { + service.play() + service.isPausedByTransientLossOfFocus = false + } + removeMessages(MusicService.DUCK) + sendEmptyMessage(MusicService.UNDUCK) + } + AudioManager.AUDIOFOCUS_LOSS -> { + // Lost focus for an unbounded amount of time: stop playback and release media playback + val isAudioFocusEnabled = isAudioFocusEnabled + if (!isAudioFocusEnabled) { + service.pause(true) + } + } + AudioManager.AUDIOFOCUS_LOSS_TRANSIENT -> { + // Lost focus for a short time, but we have to stop + // playback. We don't release the media playback because playback + // is likely to resume + val wasPlaying = service.isPlaying + service.pause(true) + service.isPausedByTransientLossOfFocus = wasPlaying + } + AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK -> { + // Lost focus for a short time, but it's ok to keep playing + // at an attenuated level + removeMessages(MusicService.UNDUCK) + sendEmptyMessage(MusicService.DUCK) + } + } + } } - switch (msg.what) { - case MusicService.DUCK: - if (PreferenceUtil.INSTANCE.isAudioDucking()) { - currentDuckVolume -= .05f; - if (currentDuckVolume > .2f) { - sendEmptyMessageDelayed(DUCK, 10); - } else { - currentDuckVolume = .2f; - } - } else { - currentDuckVolume = 1f; - } - service.playback.setVolume(currentDuckVolume); - break; - - case MusicService.UNDUCK: - if (PreferenceUtil.INSTANCE.isAudioDucking()) { - currentDuckVolume += .03f; - if (currentDuckVolume < 1f) { - sendEmptyMessageDelayed(MusicService.UNDUCK, 10); - } else { - currentDuckVolume = 1f; - } - } else { - currentDuckVolume = 1f; - } - service.playback.setVolume(currentDuckVolume); - break; - - case TRACK_WENT_TO_NEXT: - if (service.pendingQuit - || service.getRepeatMode() == REPEAT_MODE_NONE && service.isLastTrack()) { - service.pause(); - service.seek(0); - if (service.pendingQuit) { - service.pendingQuit = false; - service.quit(); - break; - } - } else { - service.position = service.nextPosition; - service.prepareNextImpl(); - service.notifyChange(META_CHANGED); - } - break; - - case TRACK_ENDED: - // if there is a timer finished, don't continue - if (service.pendingQuit - || service.getRepeatMode() == REPEAT_MODE_NONE && service.isLastTrack()) { - service.notifyChange(PLAY_STATE_CHANGED); - service.seek(0); - if (service.pendingQuit) { - service.pendingQuit = false; - service.quit(); - break; - } - } else { - service.playNextSong(false); - } - sendEmptyMessage(MusicService.RELEASE_WAKELOCK); - break; - - case MusicService.RELEASE_WAKELOCK: - service.releaseWakeLock(); - break; - - case MusicService.PLAY_SONG: - service.playSongAtImpl(msg.arg1); - break; - - case MusicService.SET_POSITION: - service.openTrackAndPrepareNextAt(msg.arg1); - service.notifyChange(PLAY_STATE_CHANGED); - break; - - case MusicService.PREPARE_NEXT: - service.prepareNextImpl(); - break; - - case MusicService.RESTORE_QUEUES: - service.restoreQueuesAndPositionIfNecessary(); - break; - - case MusicService.FOCUS_CHANGE: - switch (msg.arg1) { - case AudioManager.AUDIOFOCUS_GAIN: - if (!service.isPlaying() && service.isPausedByTransientLossOfFocus()) { - service.play(); - service.setPausedByTransientLossOfFocus(false); - } - removeMessages(DUCK); - sendEmptyMessage(MusicService.UNDUCK); - break; - - case AudioManager.AUDIOFOCUS_LOSS: - // Lost focus for an unbounded amount of time: stop playback and release media playback - boolean isAudioFocusEnabled = PreferenceUtil.INSTANCE.isAudioFocusEnabled(); - if (!isAudioFocusEnabled) { - service.forcePause(); - } - break; - - case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT: - // Lost focus for a short time, but we have to stop - // playback. We don't release the media playback because playback - // is likely to resume - boolean wasPlaying = service.isPlaying(); - service.forcePause(); - service.setPausedByTransientLossOfFocus(wasPlaying); - break; - - case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK: - // Lost focus for a short time, but it's ok to keep playing - // at an attenuated level - removeMessages(MusicService.UNDUCK); - sendEmptyMessage(DUCK); - break; - } - break; + init { + mService = WeakReference(service) } - } } \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/service/playback/Playback.kt b/app/src/main/java/code/name/monkey/retromusic/service/playback/Playback.kt index 4d98f3336..2330b179e 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/playback/Playback.kt +++ b/app/src/main/java/code/name/monkey/retromusic/service/playback/Playback.kt @@ -14,6 +14,8 @@ package code.name.monkey.retromusic.service.playback +import code.name.monkey.retromusic.model.Song + interface Playback { @@ -23,7 +25,9 @@ interface Playback { val audioSessionId: Int - fun setDataSource(path: String, force: Boolean): Boolean + fun setDataSource( + song: Song, force: Boolean, completion: (success: Boolean) -> Unit, + ) fun setNextDataSource(path: String?) @@ -57,5 +61,7 @@ interface Playback { fun onTrackEnded() fun onTrackEndedWithCrossfade() + + fun onPlayStateChanged() } } From 4b4aadcc5b2e7ee7ffb0014230e7cfdd44d48316 Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Fri, 13 May 2022 00:18:55 +0530 Subject: [PATCH 005/280] Better Cast Now there won't be any need of ugly cast mini player as cast will be able to respond to UI events of app like seek, changing song, pause --- .../activities/base/AbsCastActivity.kt | 53 +-------- .../base/AbsSlidingMusicPanelActivity.kt | 4 +- .../name/monkey/retromusic/cast/CastHelper.kt | 39 +------ .../retromusic/helper/MusicPlayerRemote.kt | 17 +-- .../monkey/retromusic/service/CastPlayer.kt | 109 ++++++++++++++++++ .../main/res/layout/cast_mini_controller.xml | 102 ---------------- .../res/layout/sliding_music_panel_layout.xml | 8 +- 7 files changed, 127 insertions(+), 205 deletions(-) create mode 100644 app/src/main/java/code/name/monkey/retromusic/service/CastPlayer.kt delete mode 100644 app/src/main/res/layout/cast_mini_controller.xml diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsCastActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsCastActivity.kt index 0a88ef350..e4939c49b 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsCastActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsCastActivity.kt @@ -1,7 +1,6 @@ package code.name.monkey.retromusic.activities.base import android.os.Bundle -import code.name.monkey.retromusic.cast.CastHelper import code.name.monkey.retromusic.cast.RetroSessionManagerListener import code.name.monkey.retromusic.cast.RetroWebServer import code.name.monkey.retromusic.helper.MusicPlayerRemote @@ -30,20 +29,7 @@ abstract class AbsCastActivity : AbsSlidingMusicPanelActivity() { override fun onSessionStarted(castSession: CastSession, p1: String) { invalidateOptionsMenu() mCastSession = castSession - loadCastQueue() - MusicPlayerRemote.isCasting = true - setAllowDragging(false) - collapsePanel() - } - - override fun onSessionEnding(castSession: CastSession) { - MusicPlayerRemote.isCasting = false - castSession.remoteMediaClient?.let { - val position = it.mediaQueue.indexOfItemWithId(it.currentItem?.itemId ?: 0) - val progress = it.approximateStreamPosition - MusicPlayerRemote.position = position - MusicPlayerRemote.seekTo(progress.toInt()) - } + MusicPlayerRemote.switchToRemotePlayback(castSession) } override fun onSessionEnded(castSession: CastSession, p1: Int) { @@ -51,7 +37,7 @@ abstract class AbsCastActivity : AbsSlidingMusicPanelActivity() { if (mCastSession == castSession) { mCastSession = null } - setAllowDragging(true) + MusicPlayerRemote.switchToLocalPlayback() webServer.stop() } @@ -59,14 +45,7 @@ abstract class AbsCastActivity : AbsSlidingMusicPanelActivity() { invalidateOptionsMenu() mCastSession = castSession webServer.start() - mCastSession?.remoteMediaClient?.let { - loadCastQueue(it.mediaQueue.indexOfItemWithId(it.currentItem?.itemId ?: 0), - it.approximateStreamPosition) - } - - MusicPlayerRemote.isCasting = true - setAllowDragging(false) - collapsePanel() + MusicPlayerRemote.switchToRemotePlayback(castSession) } override fun onSessionSuspended(castSession: CastSession, p1: Int) { @@ -74,8 +53,7 @@ abstract class AbsCastActivity : AbsSlidingMusicPanelActivity() { if (mCastSession == castSession) { mCastSession = null } - MusicPlayerRemote.isCasting = false - setAllowDragging(true) + MusicPlayerRemote.switchToLocalPlayback() webServer.stop() } } @@ -121,27 +99,4 @@ abstract class AbsCastActivity : AbsSlidingMusicPanelActivity() { mCastSession = null } } - - fun loadCastQueue( - position: Int = MusicPlayerRemote.position, - progress: Long = MusicPlayerRemote.songProgressMillis.toLong(), - ) { - mCastSession?.let { - if (MusicPlayerRemote.playingQueue.isNotEmpty()) { - CastHelper.castQueue( - it, - MusicPlayerRemote.playingQueue, - position, - progress - ) - } - } - } - - override fun onQueueChanged() { - super.onQueueChanged() - if (playServicesAvailable) { - loadCastQueue() - } - } } \ No newline at end of file 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 ae8bab0fc..7130f3901 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 @@ -393,9 +393,7 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() { animate: Boolean = false, isBottomNavVisible: Boolean = bottomNavigationView.isVisible, ) { - val heightOfBar = - windowInsets.safeGetBottomInsets() + - if (MusicPlayerRemote.isCasting) dip(R.dimen.cast_mini_player_height) else dip(R.dimen.mini_player_height) + val heightOfBar = windowInsets.safeGetBottomInsets() + dip(R.dimen.mini_player_height) val heightOfBarWithTabs = heightOfBar + dip(R.dimen.bottom_nav_height) if (hide) { bottomSheetBehavior.peekHeight = -windowInsets.safeGetBottomInsets() diff --git a/app/src/main/java/code/name/monkey/retromusic/cast/CastHelper.kt b/app/src/main/java/code/name/monkey/retromusic/cast/CastHelper.kt index 33ac06250..982d1fe18 100644 --- a/app/src/main/java/code/name/monkey/retromusic/cast/CastHelper.kt +++ b/app/src/main/java/code/name/monkey/retromusic/cast/CastHelper.kt @@ -6,12 +6,11 @@ import code.name.monkey.retromusic.cast.RetroWebServer.Companion.PART_COVER_ART import code.name.monkey.retromusic.cast.RetroWebServer.Companion.PART_SONG import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.util.RetroUtil -import com.google.android.gms.cast.* +import com.google.android.gms.cast.MediaInfo import com.google.android.gms.cast.MediaInfo.STREAM_TYPE_BUFFERED +import com.google.android.gms.cast.MediaMetadata import com.google.android.gms.cast.MediaMetadata.* -import com.google.android.gms.cast.framework.CastSession import com.google.android.gms.common.images.WebImage -import org.json.JSONObject import java.net.MalformedURLException import java.net.URL @@ -21,39 +20,7 @@ object CastHelper { private const val CAST_MUSIC_METADATA_ALBUM_ID = "metadata_album_id" private const val CAST_URL_PROTOCOL = "http" - fun castSong(castSession: CastSession, song: Song) { - try { - val remoteMediaClient = castSession.remoteMediaClient - val mediaLoadOptions = MediaLoadOptions.Builder().apply { - setPlayPosition(0) - setAutoplay(true) - }.build() - remoteMediaClient?.load(song.toMediaInfo()!!, mediaLoadOptions) - } catch (e: Exception) { - e.printStackTrace() - } - } - - fun castQueue(castSession: CastSession, songs: List, position: Int, progress: Long) { - try { - val remoteMediaClient = castSession.remoteMediaClient - remoteMediaClient?.queueLoad( - songs.toMediaInfoList(), - if (position != -1) position else 0, - MediaStatus.REPEAT_MODE_REPEAT_OFF, - progress, - JSONObject() - ) - } catch (e: Exception) { - e.printStackTrace() - } - } - - private fun List.toMediaInfoList(): Array { - return map { MediaQueueItem.Builder(it.toMediaInfo()!!).build() }.toTypedArray() - } - - private fun Song.toMediaInfo(): MediaInfo? { + fun Song.toMediaInfo(): MediaInfo? { val song = this val baseUrl: URL try { diff --git a/app/src/main/java/code/name/monkey/retromusic/helper/MusicPlayerRemote.kt b/app/src/main/java/code/name/monkey/retromusic/helper/MusicPlayerRemote.kt index fb03f95a6..5947f294e 100644 --- a/app/src/main/java/code/name/monkey/retromusic/helper/MusicPlayerRemote.kt +++ b/app/src/main/java/code/name/monkey/retromusic/helper/MusicPlayerRemote.kt @@ -30,6 +30,7 @@ import code.name.monkey.retromusic.repository.SongRepository import code.name.monkey.retromusic.service.MusicService import code.name.monkey.retromusic.util.PreferenceUtil import code.name.monkey.retromusic.util.getExternalStorageDirectory +import com.google.android.gms.cast.framework.CastSession import org.koin.core.component.KoinComponent import org.koin.core.component.inject import java.io.File @@ -43,14 +44,6 @@ object MusicPlayerRemote : KoinComponent { private val songRepository by inject() - var isCasting: Boolean = false - set(value) { - field = value - if (value) { - musicService?.quit() - } - } - @JvmStatic val isPlaying: Boolean get() = musicService != null && musicService!!.isPlaying @@ -472,6 +465,14 @@ object MusicPlayerRemote : KoinComponent { .dropLastWhile { it.isEmpty() }.toTypedArray()[1] } + fun switchToRemotePlayback(castSession: CastSession) { + musicService?.switchToRemotePlayback(castSession) + } + + fun switchToLocalPlayback() { + musicService?.switchToLocalPlayback() + } + class ServiceBinder internal constructor(private val mCallback: ServiceConnection?) : ServiceConnection { diff --git a/app/src/main/java/code/name/monkey/retromusic/service/CastPlayer.kt b/app/src/main/java/code/name/monkey/retromusic/service/CastPlayer.kt new file mode 100644 index 000000000..ad9891a1f --- /dev/null +++ b/app/src/main/java/code/name/monkey/retromusic/service/CastPlayer.kt @@ -0,0 +1,109 @@ +package code.name.monkey.retromusic.service + +import code.name.monkey.retromusic.cast.CastHelper.toMediaInfo +import code.name.monkey.retromusic.model.Song +import code.name.monkey.retromusic.service.playback.Playback +import com.google.android.gms.cast.MediaLoadOptions +import com.google.android.gms.cast.MediaSeekOptions +import com.google.android.gms.cast.MediaStatus +import com.google.android.gms.cast.framework.CastSession +import com.google.android.gms.cast.framework.media.RemoteMediaClient + +class CastPlayer(castSession: CastSession) : Playback, + RemoteMediaClient.Callback() { + + override val isInitialized: Boolean = true + + private val remoteMediaClient: RemoteMediaClient? = castSession.remoteMediaClient + + init { + remoteMediaClient?.registerCallback(this) + } + + private var isActuallyPlaying = false + + override val isPlaying: Boolean + get() { + return remoteMediaClient?.isPlaying == true || isActuallyPlaying + } + + override val audioSessionId: Int = 0 + + private var callbacks: Playback.PlaybackCallbacks? = null + + override fun setDataSource( + song: Song, + force: Boolean, + completion: (success: Boolean) -> Unit, + ) { + try { + val mediaLoadOptions = + MediaLoadOptions.Builder().setPlayPosition(0).setAutoplay(true).build() + remoteMediaClient?.load(song.toMediaInfo()!!, mediaLoadOptions) + completion(true) + } catch (e: Exception) { + e.printStackTrace() + completion(false) + } + } + + override fun setNextDataSource(path: String?) {} + + override fun setCallbacks(callbacks: Playback.PlaybackCallbacks) { + this.callbacks = callbacks + } + + override fun start(): Boolean { + isActuallyPlaying = true + remoteMediaClient?.play() + return true + } + + override fun stop() { + isActuallyPlaying = false + remoteMediaClient?.stop() + } + + override fun release() { + stop() + } + + override fun pause(): Boolean { + isActuallyPlaying = false + remoteMediaClient?.pause() + return true + } + + override fun duration(): Int { + return remoteMediaClient?.streamDuration?.toInt() ?: 0 + } + + override fun position(): Int { + return remoteMediaClient?.approximateStreamPosition?.toInt() ?: 0 + } + + override fun seek(whereto: Int): Int { + remoteMediaClient?.seek(MediaSeekOptions.Builder().setPosition(whereto.toLong()).build()) + return whereto + } + + override fun setVolume(vol: Float) = true + + override fun setAudioSessionId(sessionId: Int) = true + + override fun setCrossFadeDuration(duration: Int) {} + + override fun onStatusUpdated() { + when (remoteMediaClient?.playerState) { + MediaStatus.PLAYER_STATE_IDLE -> { + val idleReason = remoteMediaClient.idleReason + if (idleReason == MediaStatus.IDLE_REASON_FINISHED) { + callbacks?.onTrackEnded() + } + } + MediaStatus.PLAYER_STATE_PLAYING, MediaStatus.PLAYER_STATE_PAUSED -> { + callbacks?.onPlayStateChanged() + } + } + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/cast_mini_controller.xml b/app/src/main/res/layout/cast_mini_controller.xml deleted file mode 100644 index 49e7789ed..000000000 --- a/app/src/main/res/layout/cast_mini_controller.xml +++ /dev/null @@ -1,102 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/sliding_music_panel_layout.xml b/app/src/main/res/layout/sliding_music_panel_layout.xml index faf3cd16e..2c1838985 100644 --- a/app/src/main/res/layout/sliding_music_panel_layout.xml +++ b/app/src/main/res/layout/sliding_music_panel_layout.xml @@ -11,8 +11,8 @@ android:name="androidx.navigation.fragment.NavHostFragment" android:layout_width="match_parent" android:layout_height="match_parent" - app:defaultNavHost="true" android:background="?attr/colorSurface" + app:defaultNavHost="true" app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior" tools:layout="@layout/fragment_home" /> @@ -39,12 +39,6 @@ android:layout_height="@dimen/mini_player_height" tools:layout="@layout/fragment_mini_player" /> - - Date: Fri, 13 May 2022 09:41:26 +0530 Subject: [PATCH 006/280] Code Cleanup --- .../monkey/retromusic/service/MultiPlayer.kt | 20 +------------------ .../retromusic/service/PlaybackManager.kt | 2 +- 2 files changed, 2 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/code/name/monkey/retromusic/service/MultiPlayer.kt b/app/src/main/java/code/name/monkey/retromusic/service/MultiPlayer.kt index 89dda0868..602f2a8f2 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/MultiPlayer.kt +++ b/app/src/main/java/code/name/monkey/retromusic/service/MultiPlayer.kt @@ -14,14 +14,12 @@ package code.name.monkey.retromusic.service import android.content.Context -import android.content.Intent import android.content.SharedPreferences import android.content.SharedPreferences.OnSharedPreferenceChangeListener import android.media.AudioAttributes import android.media.MediaPlayer import android.media.MediaPlayer.OnCompletionListener import android.media.PlaybackParams -import android.media.audiofx.AudioEffect import android.net.Uri import android.os.PowerManager import android.util.Log @@ -55,7 +53,7 @@ class MultiPlayer internal constructor(private val context: Context) : Playback, private set /** - * @param path The path of the file, or the http/rtsp URL of the stream you want to play + * @param song The song object you want to play * @return True if the `player` has been prepared and is ready to play, false otherwise */ override fun setDataSource( @@ -110,22 +108,6 @@ class MultiPlayer internal constructor(private val context: Context) : Playback, player.setOnErrorListener(this) } - fun openEqualizerSession() { - val intent = Intent(AudioEffect.ACTION_OPEN_AUDIO_EFFECT_CONTROL_SESSION) - intent.putExtra(AudioEffect.EXTRA_AUDIO_SESSION, audioSessionId) - intent.putExtra(AudioEffect.EXTRA_PACKAGE_NAME, context.packageName) - intent.putExtra(AudioEffect.EXTRA_CONTENT_TYPE, AudioEffect.CONTENT_TYPE_MUSIC) - context.sendBroadcast(intent) - } - - fun closeEqualizerSession() { - val intent = Intent(AudioEffect.ACTION_CLOSE_AUDIO_EFFECT_CONTROL_SESSION) - intent.putExtra(AudioEffect.EXTRA_AUDIO_SESSION, audioSessionId) - intent.putExtra(AudioEffect.EXTRA_PACKAGE_NAME, context.packageName) - intent.putExtra(AudioEffect.EXTRA_CONTENT_TYPE, AudioEffect.CONTENT_TYPE_MUSIC) - context.sendBroadcast(intent) - } - /** * Set the MediaPlayer to start when this MediaPlayer finishes playback. * diff --git a/app/src/main/java/code/name/monkey/retromusic/service/PlaybackManager.kt b/app/src/main/java/code/name/monkey/retromusic/service/PlaybackManager.kt index 9c06bc831..b1e5dd081 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/PlaybackManager.kt +++ b/app/src/main/java/code/name/monkey/retromusic/service/PlaybackManager.kt @@ -118,7 +118,7 @@ class PlaybackManager(val context: Context) { closeAudioEffectSession() } - fun openAudioEffectSession() { + private fun openAudioEffectSession() { val intent = Intent(AudioEffect.ACTION_OPEN_AUDIO_EFFECT_CONTROL_SESSION) intent.putExtra(AudioEffect.EXTRA_AUDIO_SESSION, audioSessionId) intent.putExtra(AudioEffect.EXTRA_PACKAGE_NAME, context.packageName) From 165d180fe6036435d26a76db7f0adcb62d1fab74 Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Fri, 13 May 2022 15:08:33 +0530 Subject: [PATCH 007/280] Fixed a crash when casting --- .../name/monkey/retromusic/fragments/LibraryViewModel.kt | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/LibraryViewModel.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/LibraryViewModel.kt index 944b1db67..208c3e66e 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/LibraryViewModel.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/LibraryViewModel.kt @@ -179,10 +179,9 @@ class LibraryViewModel( fun shuffleSongs() = viewModelScope.launch(IO) { val songs = repository.allSongs() - MusicPlayerRemote.openAndShuffleQueue( - songs, - true - ) + withContext(Main) { + MusicPlayerRemote.openAndShuffleQueue(songs, true) + } } fun renameRoomPlaylist(playListId: Long, name: String) = viewModelScope.launch(IO) { From 10337113573066628fcc9143665b4472579683e0 Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Fri, 13 May 2022 15:24:52 +0530 Subject: [PATCH 008/280] Release PlaybackManager when quitting MusicService --- .../java/code/name/monkey/retromusic/service/MusicService.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt b/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt index 7dd58ef5a..a0672d5ec 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt +++ b/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt @@ -893,7 +893,7 @@ class MusicService : MediaBrowserServiceCompat(), pause() stopForeground(true) notificationManager?.cancel(PlayingNotification.NOTIFICATION_ID) - playbackManager.closeAudioEffectSession() + playbackManager.release() audioManager?.abandonAudioFocus(audioFocusListener) stopSelf() } From 0fd8ab0adedbb55bc5bea9200485d51f64999e0c Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Sat, 14 May 2022 12:13:55 +0530 Subject: [PATCH 009/280] Fix Playback speed and pitch for PlaybackManager --- .../monkey/retromusic/service/CastPlayer.kt | 6 +++ .../retromusic/service/CrossFadePlayer.kt | 32 ++++++------ .../monkey/retromusic/service/MultiPlayer.kt | 49 +++---------------- .../monkey/retromusic/service/MusicService.kt | 8 +-- .../retromusic/service/PlaybackHandler.kt | 1 - .../retromusic/service/PlaybackManager.kt | 26 ++++++++-- 6 files changed, 54 insertions(+), 68 deletions(-) diff --git a/app/src/main/java/code/name/monkey/retromusic/service/CastPlayer.kt b/app/src/main/java/code/name/monkey/retromusic/service/CastPlayer.kt index ad9891a1f..baec003e3 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/CastPlayer.kt +++ b/app/src/main/java/code/name/monkey/retromusic/service/CastPlayer.kt @@ -3,6 +3,7 @@ package code.name.monkey.retromusic.service import code.name.monkey.retromusic.cast.CastHelper.toMediaInfo import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.service.playback.Playback +import code.name.monkey.retromusic.util.PreferenceUtil.playbackSpeed import com.google.android.gms.cast.MediaLoadOptions import com.google.android.gms.cast.MediaSeekOptions import com.google.android.gms.cast.MediaStatus @@ -18,6 +19,7 @@ class CastPlayer(castSession: CastSession) : Playback, init { remoteMediaClient?.registerCallback(this) + remoteMediaClient?.setPlaybackRate(playbackSpeed.toDouble().coerceIn(0.5, 2.0)) } private var isActuallyPlaying = false @@ -93,6 +95,10 @@ class CastPlayer(castSession: CastSession) : Playback, override fun setCrossFadeDuration(duration: Int) {} + override fun setPlaybackSpeedPitch(speed: Float, pitch: Float) { + remoteMediaClient?.setPlaybackRate(speed.toDouble().coerceIn(0.5, 2.0)) + } + override fun onStatusUpdated() { when (remoteMediaClient?.playerState) { MediaStatus.PLAYER_STATE_IDLE -> { diff --git a/app/src/main/java/code/name/monkey/retromusic/service/CrossFadePlayer.kt b/app/src/main/java/code/name/monkey/retromusic/service/CrossFadePlayer.kt index 4a54231f7..451f545b8 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/CrossFadePlayer.kt +++ b/app/src/main/java/code/name/monkey/retromusic/service/CrossFadePlayer.kt @@ -2,12 +2,10 @@ package code.name.monkey.retromusic.service import android.animation.Animator import android.content.Context -import android.content.Intent import android.media.AudioAttributes import android.media.AudioManager import android.media.MediaPlayer import android.media.PlaybackParams -import android.media.audiofx.AudioEffect import android.os.PowerManager import android.util.Log import androidx.core.net.toUri @@ -20,7 +18,6 @@ import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.service.AudioFader.Companion.createFadeAnimator import code.name.monkey.retromusic.service.playback.Playback import code.name.monkey.retromusic.service.playback.Playback.PlaybackCallbacks -import code.name.monkey.retromusic.util.MusicUtil import code.name.monkey.retromusic.util.PreferenceUtil import code.name.monkey.retromusic.util.PreferenceUtil.playbackPitch import code.name.monkey.retromusic.util.PreferenceUtil.playbackSpeed @@ -144,6 +141,7 @@ class CrossFadePlayer(val context: Context) : Playback, MediaPlayer.OnCompletion } hasDataSource = true } else { + completion(true) mIsInitialized = true } } @@ -170,7 +168,7 @@ class CrossFadePlayer(val context: Context) : Playback, MediaPlayer.OnCompletion player.setAudioAttributes( AudioAttributes.Builder().setLegacyStreamType(AudioManager.STREAM_MUSIC).build() ) - player.setPlaybackSpeedPitch(PreferenceUtil.playbackSpeed, PreferenceUtil.playbackPitch) + player.setPlaybackSpeedPitch(playbackSpeed, playbackPitch) player.setOnPreparedListener { player.setOnPreparedListener(null) completion(true) @@ -329,8 +327,7 @@ class CrossFadePlayer(val context: Context) : Playback, MediaPlayer.OnCompletion getNextPlayer()?.let { player -> val nextSong = MusicPlayerRemote.nextSong if (nextSong != null) { - setDataSourceImpl(player, - MusicUtil.getSongFileUri(nextSong.id).toString()) { success -> + setDataSourceImpl(player, nextSong.uri.toString()) { success -> // Switch to other player (Crossfade) only if next song exists if (success) switchPlayer() } @@ -358,16 +355,7 @@ class CrossFadePlayer(val context: Context) : Playback, MediaPlayer.OnCompletion override fun setPlaybackSpeedPitch(speed: Float, pitch: Float) { getCurrentPlayer()?.setPlaybackSpeedPitch(speed, pitch) - } - - private fun MediaPlayer.setPlaybackSpeedPitch(speed: Float, pitch: Float) { - if (hasMarshmallow()) { - val wasPlaying: Boolean = isPlaying - playbackParams = PlaybackParams().setSpeed(speed).setPitch(pitch) - if (!wasPlaying) { - if (isPlaying) pause() - } - } + getNextPlayer()?.setPlaybackSpeedPitch(speed, pitch) } companion object { @@ -375,4 +363,14 @@ class CrossFadePlayer(val context: Context) : Playback, MediaPlayer.OnCompletion } } -internal fun crossFadeScope(): CoroutineScope = CoroutineScope(Job() + Dispatchers.Main) \ No newline at end of file +internal fun crossFadeScope(): CoroutineScope = CoroutineScope(Job() + Dispatchers.Main) + +fun MediaPlayer.setPlaybackSpeedPitch(speed: Float, pitch: Float) { + if (hasMarshmallow()) { + val wasPlaying: Boolean = isPlaying + playbackParams = PlaybackParams().setSpeed(speed).setPitch(pitch) + if (!wasPlaying) { + if (isPlaying) pause() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/service/MultiPlayer.kt b/app/src/main/java/code/name/monkey/retromusic/service/MultiPlayer.kt index 602f2a8f2..76b26edd1 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/MultiPlayer.kt +++ b/app/src/main/java/code/name/monkey/retromusic/service/MultiPlayer.kt @@ -14,19 +14,12 @@ package code.name.monkey.retromusic.service import android.content.Context -import android.content.SharedPreferences -import android.content.SharedPreferences.OnSharedPreferenceChangeListener import android.media.AudioAttributes import android.media.MediaPlayer import android.media.MediaPlayer.OnCompletionListener -import android.media.PlaybackParams import android.net.Uri import android.os.PowerManager import android.util.Log -import androidx.preference.PreferenceManager -import code.name.monkey.appthemehelper.util.VersionUtils.hasMarshmallow -import code.name.monkey.retromusic.PLAYBACK_PITCH -import code.name.monkey.retromusic.PLAYBACK_SPEED import code.name.monkey.retromusic.R import code.name.monkey.retromusic.extensions.showToast import code.name.monkey.retromusic.extensions.uri @@ -41,7 +34,7 @@ import code.name.monkey.retromusic.util.PreferenceUtil.playbackSpeed * @author Andrew Neal, Karim Abou Zeid (kabouzeid) */ class MultiPlayer internal constructor(private val context: Context) : Playback, - MediaPlayer.OnErrorListener, OnCompletionListener, OnSharedPreferenceChangeListener { + MediaPlayer.OnErrorListener, OnCompletionListener { private var mCurrentMediaPlayer = MediaPlayer() private var mNextMediaPlayer: MediaPlayer? = null private var callbacks: PlaybackCallbacks? = null @@ -52,6 +45,10 @@ class MultiPlayer internal constructor(private val context: Context) : Playback, override var isInitialized = false private set + init { + mCurrentMediaPlayer.setWakeMode(context, PowerManager.PARTIAL_WAKE_LOCK) + } + /** * @param song The song object you want to play * @return True if the `player` has been prepared and is ready to play, false otherwise @@ -89,12 +86,12 @@ class MultiPlayer internal constructor(private val context: Context) : Playback, } else { player.setDataSource(path) } - setPlaybackSpeedPitch(player) player.setAudioAttributes(AudioAttributes.Builder() .setUsage(AudioAttributes.USAGE_MEDIA) .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) .build() ) + player.setPlaybackSpeedPitch(playbackSpeed, playbackPitch) player.setOnPreparedListener { player.setOnPreparedListener(null) completion(true) @@ -198,8 +195,6 @@ class MultiPlayer internal constructor(private val context: Context) : Playback, if (mNextMediaPlayer != null) { mNextMediaPlayer?.release() } - PreferenceManager.getDefaultSharedPreferences(context) - .unregisterOnSharedPreferenceChangeListener(this) } /** @@ -298,9 +293,6 @@ class MultiPlayer internal constructor(private val context: Context) : Playback, override val audioSessionId: Int get() = mCurrentMediaPlayer.audioSessionId - /** - * {@inheritDoc} - */ override fun onError(mp: MediaPlayer, what: Int, extra: Int): Boolean { isInitialized = false mCurrentMediaPlayer.release() @@ -311,9 +303,6 @@ class MultiPlayer internal constructor(private val context: Context) : Playback, return false } - /** - * {@inheritDoc} - */ override fun onCompletion(mp: MediaPlayer) { if (mp == mCurrentMediaPlayer && mNextMediaPlayer != null) { isInitialized = false @@ -328,34 +317,12 @@ class MultiPlayer internal constructor(private val context: Context) : Playback, } override fun setCrossFadeDuration(duration: Int) {} - override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) { - if (key == PLAYBACK_SPEED || key == PLAYBACK_PITCH) { - setPlaybackSpeedPitch(mCurrentMediaPlayer) - } - } - private fun setPlaybackSpeedPitch(mp: MediaPlayer) { - if (hasMarshmallow()) { - val wasPlaying = mp.isPlaying - mp.playbackParams = PlaybackParams() - .setSpeed(playbackSpeed) - .setPitch(playbackPitch) - if (!wasPlaying) { - if (mp.isPlaying) mp.pause() - } - } + override fun setPlaybackSpeedPitch(speed: Float, pitch: Float) { + mCurrentMediaPlayer.setPlaybackSpeedPitch(speed, pitch) } companion object { val TAG: String = MultiPlayer::class.java.simpleName } - - /** - * Constructor of `MultiPlayer` - */ - init { - mCurrentMediaPlayer.setWakeMode(context, PowerManager.PARTIAL_WAKE_LOCK) - PreferenceManager.getDefaultSharedPreferences(context) - .registerOnSharedPreferenceChangeListener(this) - } } \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt b/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt index a0672d5ec..c6a825790 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt +++ b/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt @@ -692,15 +692,15 @@ class MusicService : MediaBrowserServiceCompat(), ) { when (key) { PLAYBACK_SPEED, PLAYBACK_PITCH -> { - playback?.setPlaybackSpeedPitch(playbackSpeed, playbackPitch) + playbackManager.setPlaybackSpeedPitch(playbackSpeed, playbackPitch) } CROSS_FADE_DURATION -> { val progress = songProgressMillis val wasPlaying = isPlaying - playbackManager.maybeSwitchToCrossFade(crossFadeDuration) - restorePlaybackState(wasPlaying, progress) - + if (playbackManager.maybeSwitchToCrossFade(crossFadeDuration)) { + restorePlaybackState(wasPlaying, progress) + } } ALBUM_ART_ON_LOCK_SCREEN, BLURRED_ALBUM_ART -> updateMediaSessionMetaData() COLORED_NOTIFICATION -> { diff --git a/app/src/main/java/code/name/monkey/retromusic/service/PlaybackHandler.kt b/app/src/main/java/code/name/monkey/retromusic/service/PlaybackHandler.kt index 86fbb04ac..1fa3c2ba3 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/PlaybackHandler.kt +++ b/app/src/main/java/code/name/monkey/retromusic/service/PlaybackHandler.kt @@ -97,7 +97,6 @@ internal class PlaybackHandler(service: MusicService, looper: Looper) : Handler( } AudioManager.AUDIOFOCUS_LOSS -> { // Lost focus for an unbounded amount of time: stop playback and release media playback - val isAudioFocusEnabled = isAudioFocusEnabled if (!isAudioFocusEnabled) { service.pause(true) } diff --git a/app/src/main/java/code/name/monkey/retromusic/service/PlaybackManager.kt b/app/src/main/java/code/name/monkey/retromusic/service/PlaybackManager.kt index b1e5dd081..1ee3f727a 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/PlaybackManager.kt +++ b/app/src/main/java/code/name/monkey/retromusic/service/PlaybackManager.kt @@ -92,8 +92,12 @@ class PlaybackManager(val context: Context) { playback?.setCrossFadeDuration(duration) } - fun maybeSwitchToCrossFade(crossFadeDuration: Int) { - /* Switch to MultiPlayer if Crossfade duration is 0 and + /** + * @param crossFadeDuration CrossFade duration + * @return Whether switched playback + */ + fun maybeSwitchToCrossFade(crossFadeDuration: Int): Boolean { + /* Switch to MultiPlayer if CrossFade duration is 0 and Playback is not an instance of MultiPlayer */ if (playback !is MultiPlayer && crossFadeDuration == 0) { if (playback != null) { @@ -101,13 +105,16 @@ class PlaybackManager(val context: Context) { } playback = null playback = MultiPlayer(context) + return true } else if (playback !is CrossFadePlayer && crossFadeDuration > 0) { if (playback != null) { playback?.release() } playback = null playback = CrossFadePlayer(context) + return true } + return false } fun release() { @@ -126,7 +133,7 @@ class PlaybackManager(val context: Context) { context.sendBroadcast(intent) } - fun closeAudioEffectSession() { + private fun closeAudioEffectSession() { val audioEffectsIntent = Intent(AudioEffect.ACTION_CLOSE_AUDIO_EFFECT_CONTROL_SESSION) if (playback != null) { audioEffectsIntent.putExtra(AudioEffect.EXTRA_AUDIO_SESSION, @@ -141,12 +148,18 @@ class PlaybackManager(val context: Context) { switchToPlayback(createLocalPlayback(), onChange) } - fun switchToRemotePlayback(castSession: CastSession, onChange: (wasPlaying: Boolean, progress: Int) -> Unit) { + fun switchToRemotePlayback( + castSession: CastSession, + onChange: (wasPlaying: Boolean, progress: Int) -> Unit, + ) { playbackLocation = PlaybackLocation.REMOTE switchToPlayback(CastPlayer(castSession), onChange) } - private fun switchToPlayback(playback: Playback, onChange: (wasPlaying: Boolean, progress: Int) -> Unit) { + private fun switchToPlayback( + playback: Playback, + onChange: (wasPlaying: Boolean, progress: Int) -> Unit, + ) { val oldPlayback = playback val wasPlaying: Boolean = oldPlayback.isPlaying val progress: Int = oldPlayback.position() @@ -167,6 +180,9 @@ class PlaybackManager(val context: Context) { } } + fun setPlaybackSpeedPitch(playbackSpeed: Float, playbackPitch: Float) { + playback?.setPlaybackSpeedPitch(playbackSpeed, playbackPitch) + } } enum class PlaybackLocation { From bd2d5068d7d52edeb8658c155d24785614b2979a Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Sat, 14 May 2022 13:55:58 +0530 Subject: [PATCH 010/280] Bump version --- app/build.gradle | 4 ++-- app/src/main/assets/retro-changelog.html | 8 ++++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 2ccf7085b..d355e7076 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -14,8 +14,8 @@ android { vectorDrawables.useSupportLibrary = true applicationId "code.name.monkey.retromusic" - versionCode 10579 - versionName '5.8.4' + versionCode 10580 + versionName '5.9.0' buildConfigField("String", "GOOGLE_PLAY_LICENSING_KEY", "\"${getProperty(getProperties('../public.properties'), 'GOOGLE_PLAY_LICENSE_KEY')}\"") } diff --git a/app/src/main/assets/retro-changelog.html b/app/src/main/assets/retro-changelog.html index 2ff0871b6..76b7edcf0 100644 --- a/app/src/main/assets/retro-changelog.html +++ b/app/src/main/assets/retro-changelog.html @@ -62,6 +62,14 @@ +
+
May 14, 2022
+

v5.9.0

+

What's New

+
    +
  • Better Cast
  • +
+
May 13, 2022

v5.8.4

From 3956d843104c953d6532602c29b1b5b1e2fd70fb Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Sun, 15 May 2022 17:37:44 +0530 Subject: [PATCH 011/280] [Cast] Removed ExpandedControlsActivity --- app/src/main/AndroidManifest.xml | 24 +++++++------------ .../retromusic/cast/CastOptionsProvider.kt | 5 ++-- .../cast/ExpandedControlsActivity.kt | 19 --------------- 3 files changed, 11 insertions(+), 37 deletions(-) delete mode 100644 app/src/main/java/code/name/monkey/retromusic/cast/ExpandedControlsActivity.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e5f246d68..f1449cd37 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -23,7 +23,10 @@ tools:ignore="ProtectedPermissions" /> - + - + - - - - - - - diff --git a/app/src/main/java/code/name/monkey/retromusic/cast/CastOptionsProvider.kt b/app/src/main/java/code/name/monkey/retromusic/cast/CastOptionsProvider.kt index 7bbc955be..35115dafb 100644 --- a/app/src/main/java/code/name/monkey/retromusic/cast/CastOptionsProvider.kt +++ b/app/src/main/java/code/name/monkey/retromusic/cast/CastOptionsProvider.kt @@ -3,6 +3,7 @@ package code.name.monkey.retromusic.cast import android.content.Context +import code.name.monkey.retromusic.activities.MainActivity import com.google.android.gms.cast.CastMediaControlIntent import com.google.android.gms.cast.framework.CastOptions import com.google.android.gms.cast.framework.OptionsProvider @@ -22,12 +23,12 @@ class CastOptionsProvider : OptionsProvider { val compatButtonActionsIndices = intArrayOf(1, 3) val notificationOptions = NotificationOptions.Builder() .setActions(buttonActions, compatButtonActionsIndices) - .setTargetActivityClassName(ExpandedControlsActivity::class.java.name) + .setTargetActivityClassName(MainActivity::class.java.name) .build() val mediaOptions = CastMediaOptions.Builder() .setNotificationOptions(notificationOptions) - .setExpandedControllerActivityClassName(ExpandedControlsActivity::class.java.name) + .setExpandedControllerActivityClassName(MainActivity::class.java.name) .build() return CastOptions.Builder() diff --git a/app/src/main/java/code/name/monkey/retromusic/cast/ExpandedControlsActivity.kt b/app/src/main/java/code/name/monkey/retromusic/cast/ExpandedControlsActivity.kt deleted file mode 100644 index 2fbb2a4ff..000000000 --- a/app/src/main/java/code/name/monkey/retromusic/cast/ExpandedControlsActivity.kt +++ /dev/null @@ -1,19 +0,0 @@ -package code.name.monkey.retromusic.cast - - -import android.view.Menu -import code.name.monkey.retromusic.R - -import com.google.android.gms.cast.framework.CastButtonFactory - -import com.google.android.gms.cast.framework.media.widget.ExpandedControllerActivity - - -class ExpandedControlsActivity : ExpandedControllerActivity() { - override fun onCreateOptionsMenu(menu: Menu): Boolean { - super.onCreateOptionsMenu(menu) - menuInflater.inflate(R.menu.menu_cast, menu) - CastButtonFactory.setUpMediaRouteButton(this, menu, R.id.action_cast) - return true - } -} \ No newline at end of file From 30dd58af93c02abdeb532e944e823a41a17dded8 Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Mon, 16 May 2022 10:47:29 +0530 Subject: [PATCH 012/280] Fixed a crash when setting playback speed for Crossfade --- .../code/name/monkey/retromusic/service/CrossFadePlayer.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/code/name/monkey/retromusic/service/CrossFadePlayer.kt b/app/src/main/java/code/name/monkey/retromusic/service/CrossFadePlayer.kt index 451f545b8..0949f4158 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/CrossFadePlayer.kt +++ b/app/src/main/java/code/name/monkey/retromusic/service/CrossFadePlayer.kt @@ -355,7 +355,9 @@ class CrossFadePlayer(val context: Context) : Playback, MediaPlayer.OnCompletion override fun setPlaybackSpeedPitch(speed: Float, pitch: Float) { getCurrentPlayer()?.setPlaybackSpeedPitch(speed, pitch) - getNextPlayer()?.setPlaybackSpeedPitch(speed, pitch) + if (getNextPlayer()?.isPlaying == true) { + getNextPlayer()?.setPlaybackSpeedPitch(speed, pitch) + } } companion object { From 32e6daf36db0be696a5b924d311c57a43bba1723 Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Mon, 16 May 2022 12:49:14 +0530 Subject: [PATCH 013/280] Fix Seekbar in MD3 theme --- .../player/md3/MD3PlaybackControlsFragment.kt | 33 ------------------- 1 file changed, 33 deletions(-) diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/md3/MD3PlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/md3/MD3PlaybackControlsFragment.kt index b02bfb861..8834ef119 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/md3/MD3PlaybackControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/md3/MD3PlaybackControlsFragment.kt @@ -14,10 +14,8 @@ */ package code.name.monkey.retromusic.fragments.player.md3 -import android.animation.ObjectAnimator import android.os.Bundle import android.view.View -import android.view.animation.LinearInterpolator import android.widget.ImageButton import android.widget.SeekBar import android.widget.TextView @@ -32,16 +30,13 @@ import code.name.monkey.retromusic.fragments.base.AbsPlayerControlsFragment import code.name.monkey.retromusic.fragments.base.goToAlbum import code.name.monkey.retromusic.fragments.base.goToArtist 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.util.MusicUtil import code.name.monkey.retromusic.util.PreferenceUtil import code.name.monkey.retromusic.util.color.MediaNotificationProcessor class MD3PlaybackControlsFragment : AbsPlayerControlsFragment(R.layout.fragment_md3_player_playback_controls) { - private lateinit var progressViewUpdateHelper: MusicProgressViewUpdateHelper private var _binding: FragmentMd3PlayerPlaybackControlsBinding? = null private val binding get() = _binding!! @@ -66,11 +61,6 @@ class MD3PlaybackControlsFragment : override val songCurrentProgress: TextView get() = binding.songCurrentProgress - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - progressViewUpdateHelper = MusicProgressViewUpdateHelper(this) - } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) _binding = FragmentMd3PlayerPlaybackControlsBinding.bind(view) @@ -139,16 +129,6 @@ class MD3PlaybackControlsFragment : } } - override fun onResume() { - super.onResume() - progressViewUpdateHelper.start() - } - - override fun onPause() { - super.onPause() - progressViewUpdateHelper.stop() - } - override fun onServiceConnected() { updatePlayPauseDrawableState() updateRepeatState() @@ -157,7 +137,6 @@ class MD3PlaybackControlsFragment : } override fun onPlayingMetaChanged() { - super.onPlayingMetaChanged() updateSong() } @@ -196,18 +175,6 @@ class MD3PlaybackControlsFragment : public override fun hide() {} - override fun onUpdateProgressViews(progress: Int, total: Int) { - binding.progressSlider.max = total - - val animator = ObjectAnimator.ofInt(binding.progressSlider, "progress", progress) - animator.duration = SLIDER_ANIMATION_TIME - animator.interpolator = LinearInterpolator() - animator.start() - - binding.songTotalTime.text = MusicUtil.getReadableDurationString(total.toLong()) - binding.songCurrentProgress.text = MusicUtil.getReadableDurationString(progress.toLong()) - } - override fun onDestroyView() { super.onDestroyView() _binding = null From 7e2881b5f0debe750c447c6dd4da28d2a45eb83e Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Mon, 16 May 2022 12:51:06 +0530 Subject: [PATCH 014/280] [MusicService] Code Cleanup --- .../monkey/retromusic/service/MusicService.kt | 174 +++++++++--------- .../retromusic/service/PlaybackHandler.kt | 2 - 2 files changed, 85 insertions(+), 91 deletions(-) diff --git a/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt b/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt index c6a825790..d9d1a701f 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt +++ b/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt @@ -17,6 +17,7 @@ import android.annotation.SuppressLint import android.app.NotificationManager import android.appwidget.AppWidgetManager import android.bluetooth.BluetoothDevice +import android.bluetooth.BluetoothDevice.EXTRA_DEVICE import android.content.* import android.content.SharedPreferences.OnSharedPreferenceChangeListener import android.content.pm.ServiceInfo @@ -35,8 +36,6 @@ import android.support.v4.media.MediaDescriptionCompat import android.support.v4.media.MediaMetadataCompat import android.support.v4.media.session.MediaSessionCompat import android.support.v4.media.session.PlaybackStateCompat -import android.telephony.PhoneStateListener -import android.telephony.TelephonyManager import android.util.Log import android.widget.Toast import androidx.core.content.edit @@ -94,6 +93,9 @@ import com.bumptech.glide.request.target.CustomTarget import com.bumptech.glide.request.target.Target import com.bumptech.glide.request.transition.Transition import com.google.android.gms.cast.framework.CastSession +import kotlinx.coroutines.* +import kotlinx.coroutines.Dispatchers.IO +import kotlinx.coroutines.Dispatchers.Main import org.koin.java.KoinJavaComponent.get import java.util.* @@ -117,6 +119,7 @@ class MusicService : MediaBrowserServiceCompat(), private var mPackageValidator: PackageValidator? = null private val mMusicProvider = get(AutoMusicProvider::class.java) private var trackEndedByCrossfade = false + private val serviceScope = CoroutineScope(Job() + Main) @JvmField var position = -1 @@ -127,7 +130,7 @@ class MusicService : MediaBrowserServiceCompat(), private val appWidgetText = AppWidgetText.instance private val appWidgetMd3 = AppWidgetMD3.instance private val appWidgetCircle = AppWidgetCircle.instance - private val widgetIntentReceiver: BroadcastReceiver = object : BroadcastReceiver() { + private val widgetIntentReceiver = object : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { val command = intent.getStringExtra(EXTRA_APP_WIDGET_NAME) val ids = intent.getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS) @@ -182,7 +185,7 @@ class MusicService : MediaBrowserServiceCompat(), @JvmField var playingQueue = ArrayList() var isPausedByTransientLossOfFocus = false - private val becomingNoisyReceiver: BroadcastReceiver = object : BroadcastReceiver() { + private val becomingNoisyReceiver = object : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { if (intent.action != null && intent.action == AudioManager.ACTION_AUDIO_BECOMING_NOISY @@ -197,13 +200,14 @@ class MusicService : MediaBrowserServiceCompat(), } private var playingNotification: PlayingNotification? = null - private val updateFavoriteReceiver: BroadcastReceiver = object : BroadcastReceiver() { + private val updateFavoriteReceiver = object : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { playingNotification?.updateFavorite(currentSong) { startForegroundOrNotify() } appWidgetCircle.notifyChange(this@MusicService, FAVORITE_STATE_CHANGED) } } - private val lockScreenReceiver: BroadcastReceiver = object : BroadcastReceiver() { + + private val lockScreenReceiver = object : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { if (isLockScreen && isPlaying) { val lockIntent = Intent(context, LockScreenActivity::class.java) @@ -234,32 +238,20 @@ class MusicService : MediaBrowserServiceCompat(), var shuffleMode = 0 private val songPlayCountHelper = SongPlayCountHelper() - private val bluetoothReceiver: BroadcastReceiver = object : BroadcastReceiver() { + private val bluetoothReceiver = object : BroadcastReceiver() { + @SuppressLint("MissingPermission") override fun onReceive(context: Context, intent: Intent) { val action = intent.action + val extra = intent.getParcelableExtra(EXTRA_DEVICE)!! if (action != null) { if (BluetoothDevice.ACTION_ACL_CONNECTED == action && isBluetoothSpeaker) { - if (audioManager!!.isBluetoothA2dpOn) { - play() - } + if (extra.type == BluetoothDevice.DEVICE_TYPE_CLASSIC) play() } } } } - private val phoneStateListener: PhoneStateListener = object : PhoneStateListener() { - override fun onCallStateChanged(state: Int, incomingNumber: String) { - when (state) { - TelephonyManager.CALL_STATE_IDLE -> // Not in call: Play music - play() - TelephonyManager.CALL_STATE_RINGING, TelephonyManager.CALL_STATE_OFFHOOK -> // A call is dialing, active or on hold - pause() - } - super.onCallStateChanged(state, incomingNumber) - } - } - - private val headsetReceiver: BroadcastReceiver = object : BroadcastReceiver() { + private val headsetReceiver = object : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { val action = intent.action if (action != null) { @@ -279,8 +271,6 @@ class MusicService : MediaBrowserServiceCompat(), private var isForeground = false override fun onCreate() { super.onCreate() - val telephonyManager = getSystemService() - telephonyManager?.listen(phoneStateListener, PhoneStateListener.LISTEN_NONE) val powerManager = getSystemService() if (powerManager != null) { wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, javaClass.name) @@ -353,7 +343,7 @@ class MusicService : MediaBrowserServiceCompat(), audioVolumeObserver.register(AudioManager.STREAM_MUSIC, this) registerOnSharedPreferenceChangedListener(this) restoreState() - sendBroadcast(Intent("code.name.monkey.retromusic.RETRO_MUSIC_SERVICE_CREATED")) + sendBroadcast(Intent("$RETRO_MUSIC_PACKAGE_NAME.RETRO_MUSIC_SERVICE_CREATED")) registerHeadsetEvents() registerBluetoothConnected() mPackageValidator = PackageValidator(this, R.xml.allowed_media_browser_callers) @@ -382,11 +372,11 @@ class MusicService : MediaBrowserServiceCompat(), contentResolver.unregisterContentObserver(mediaStoreObserver) unregisterOnSharedPreferenceChangedListener(this) wakeLock?.release() - sendBroadcast(Intent("code.name.monkey.retromusic.RETRO_MUSIC_SERVICE_DESTROYED")) + sendBroadcast(Intent("$RETRO_MUSIC_PACKAGE_NAME.RETRO_MUSIC_SERVICE_DESTROYED")) } - private fun acquireWakeLock(milli: Long) { - wakeLock?.acquire(milli) + private fun acquireWakeLock() { + wakeLock?.acquire(30000) } private var pausedByZeroVolume = false @@ -394,10 +384,8 @@ class MusicService : MediaBrowserServiceCompat(), if (isPauseOnZeroVolume) { if (isPlaying && currentVolume < 1) { pause() - println("Paused") pausedByZeroVolume = true } else if (pausedByZeroVolume && currentVolume >= 1) { - println("Played") play() pausedByZeroVolume = false } @@ -692,6 +680,7 @@ class MusicService : MediaBrowserServiceCompat(), ) { when (key) { PLAYBACK_SPEED, PLAYBACK_PITCH -> { + updateMediaSessionPlaybackState() playbackManager.setPlaybackSpeedPitch(playbackSpeed, playbackPitch) } CROSS_FADE_DURATION -> { @@ -716,7 +705,6 @@ class MusicService : MediaBrowserServiceCompat(), startForegroundOrNotify() } } - PLAYBACK_SPEED -> updateMediaSessionPlaybackState() TOGGLE_HEADSET -> registerHeadsetEvents() } } @@ -724,37 +712,39 @@ class MusicService : MediaBrowserServiceCompat(), override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { if (intent != null && intent.action != null) { handleIntent(mediaSession, intent) - restoreQueuesAndPositionIfNecessary() - when (intent.action) { - ACTION_TOGGLE_PAUSE -> if (isPlaying) { - pause() - } else { - play() + serviceScope.launch { + restoreQueuesAndPositionIfNecessary() + when (intent.action) { + ACTION_TOGGLE_PAUSE -> if (isPlaying) { + pause() + } else { + play() + } + ACTION_PAUSE -> pause() + ACTION_PLAY -> play() + ACTION_PLAY_PLAYLIST -> playFromPlaylist(intent) + ACTION_REWIND -> back(true) + ACTION_SKIP -> playNextSong(true) + ACTION_STOP, ACTION_QUIT -> { + pendingQuit = false + quit() + } + ACTION_PENDING_QUIT -> pendingQuit = true + TOGGLE_FAVORITE -> toggleFavorite(applicationContext, currentSong) } - ACTION_PAUSE -> pause() - ACTION_PLAY -> play() - ACTION_PLAY_PLAYLIST -> playFromPlaylist(intent) - ACTION_REWIND -> back(true) - ACTION_SKIP -> playNextSong(true) - ACTION_STOP, ACTION_QUIT -> { - pendingQuit = false - quit() - } - ACTION_PENDING_QUIT -> pendingQuit = true - TOGGLE_FAVORITE -> toggleFavorite(applicationContext, currentSong) } } return START_NOT_STICKY } override fun onTrackEnded() { - acquireWakeLock(30000) + acquireWakeLock() playerHandler?.sendEmptyMessage(TRACK_ENDED) } override fun onTrackEndedWithCrossfade() { trackEndedByCrossfade = true - acquireWakeLock(30000) + acquireWakeLock() playerHandler?.sendEmptyMessage(TRACK_ENDED) } @@ -894,7 +884,12 @@ class MusicService : MediaBrowserServiceCompat(), stopForeground(true) notificationManager?.cancel(PlayingNotification.NOTIFICATION_ID) playbackManager.release() - audioManager?.abandonAudioFocus(audioFocusListener) + AudioManagerCompat.abandonAudioFocusRequest(audioManager!!, + AudioFocusRequestCompat.Builder(AudioManagerCompat.AUDIOFOCUS_GAIN) + .setOnAudioFocusChangeListener(audioFocusListener) + .setAudioAttributes( + AudioAttributesCompat.Builder().setContentType(CONTENT_TYPE_MUSIC).build() + ).build()) stopSelf() } @@ -954,36 +949,42 @@ class MusicService : MediaBrowserServiceCompat(), } } - @Synchronized - fun restoreQueuesAndPositionIfNecessary() { + private suspend fun restoreQueuesAndPositionIfNecessary() { if (!queuesRestored && playingQueue.isEmpty()) { - val restoredQueue = MusicPlaybackQueueStore.getInstance(this).savedPlayingQueue - val restoredOriginalQueue = - MusicPlaybackQueueStore.getInstance(this).savedOriginalPlayingQueue - val restoredPosition = PreferenceManager.getDefaultSharedPreferences(this).getInt( - SAVED_POSITION, -1 - ) - val restoredPositionInTrack = - PreferenceManager.getDefaultSharedPreferences(this).getInt( - SAVED_POSITION_IN_TRACK, -1 - ) - if (restoredQueue.size > 0 && restoredQueue.size == restoredOriginalQueue.size && restoredPosition != -1) { - originalPlayingQueue = ArrayList(restoredOriginalQueue) - playingQueue = ArrayList(restoredQueue) - position = restoredPosition - openCurrent { - prepareNext() - if (restoredPositionInTrack > 0) { - seek(restoredPositionInTrack) + withContext(IO) { + val restoredQueue = + MusicPlaybackQueueStore.getInstance(this@MusicService).savedPlayingQueue + val restoredOriginalQueue = + MusicPlaybackQueueStore.getInstance(this@MusicService).savedOriginalPlayingQueue + val restoredPosition = + PreferenceManager.getDefaultSharedPreferences(this@MusicService).getInt( + SAVED_POSITION, -1 + ) + val restoredPositionInTrack = + PreferenceManager.getDefaultSharedPreferences(this@MusicService).getInt( + SAVED_POSITION_IN_TRACK, -1 + ) + if (restoredQueue.size > 0 && restoredQueue.size == restoredOriginalQueue.size && restoredPosition != -1) { + originalPlayingQueue = ArrayList(restoredOriginalQueue) + playingQueue = ArrayList(restoredQueue) + position = restoredPosition + withContext(Main) { + openCurrent { + prepareNext() + if (restoredPositionInTrack > 0) { + seek(restoredPositionInTrack) + } + notHandledMetaChangedForCurrentTrack = true + sendChangeInternal(META_CHANGED) + } } - notHandledMetaChangedForCurrentTrack = true - sendChangeInternal(META_CHANGED) + + sendChangeInternal(QUEUE_CHANGED) } - sendChangeInternal(QUEUE_CHANGED) } + queuesRestored = true } - queuesRestored = true } fun runOnUiThread(runnable: Runnable?) { @@ -1009,8 +1010,7 @@ class MusicService : MediaBrowserServiceCompat(), @Synchronized fun seek(millis: Int): Int { return try { - var newPosition = 0 - newPosition = playbackManager.seek(millis) + val newPosition = playbackManager.seek(millis) throttledSeekHandler?.notifySeek() newPosition } catch (e: Exception) { @@ -1271,8 +1271,7 @@ class MusicService : MediaBrowserServiceCompat(), } private fun prepareNext() { - playerHandler?.removeMessages(PREPARE_NEXT) - playerHandler?.obtainMessage(PREPARE_NEXT)?.sendToTarget() + prepareNextImpl() } private fun registerBluetoothConnected() { @@ -1319,8 +1318,9 @@ class MusicService : MediaBrowserServiceCompat(), ) handleAndSendChangeInternal(SHUFFLE_MODE_CHANGED) handleAndSendChangeInternal(REPEAT_MODE_CHANGED) - playerHandler?.removeMessages(RESTORE_QUEUES) - playerHandler?.sendEmptyMessage(RESTORE_QUEUES) + serviceScope.launch { + restoreQueuesAndPositionIfNecessary() + } } private fun savePosition() { @@ -1420,13 +1420,9 @@ class MusicService : MediaBrowserServiceCompat(), const val RELEASE_WAKELOCK = 0 const val TRACK_ENDED = 1 const val TRACK_WENT_TO_NEXT = 2 - const val PLAY_SONG = 3 - const val PREPARE_NEXT = 4 - const val SET_POSITION = 5 - const val FOCUS_CHANGE = 6 - const val DUCK = 7 - const val UNDUCK = 8 - const val RESTORE_QUEUES = 9 + const val FOCUS_CHANGE = 3 + const val DUCK = 4 + const val UNDUCK = 5 const val SHUFFLE_MODE_NONE = 0 const val SHUFFLE_MODE_SHUFFLE = 1 const val REPEAT_MODE_NONE = 0 diff --git a/app/src/main/java/code/name/monkey/retromusic/service/PlaybackHandler.kt b/app/src/main/java/code/name/monkey/retromusic/service/PlaybackHandler.kt index 1fa3c2ba3..834ccfe6c 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/PlaybackHandler.kt +++ b/app/src/main/java/code/name/monkey/retromusic/service/PlaybackHandler.kt @@ -84,8 +84,6 @@ internal class PlaybackHandler(service: MusicService, looper: Looper) : Handler( sendEmptyMessage(MusicService.RELEASE_WAKELOCK) } MusicService.RELEASE_WAKELOCK -> service.releaseWakeLock() - MusicService.PREPARE_NEXT -> service.prepareNextImpl() - MusicService.RESTORE_QUEUES -> service.restoreQueuesAndPositionIfNecessary() MusicService.FOCUS_CHANGE -> when (msg.arg1) { AudioManager.AUDIOFOCUS_GAIN -> { if (!service.isPlaying && service.isPausedByTransientLossOfFocus) { From dfcc5b6b928765092463702ee37d179ac6a3f6cc Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Mon, 16 May 2022 12:53:15 +0530 Subject: [PATCH 015/280] [MusicService] Removed unused methods and observers We don't use legacy playlists and also it's deprecated. --- .../monkey/retromusic/service/MusicService.kt | 27 ------------------- 1 file changed, 27 deletions(-) diff --git a/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt b/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt index d9d1a701f..3fc71329a 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt +++ b/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt @@ -315,10 +315,6 @@ class MusicService : MediaBrowserServiceCompat(), .registerContentObserver( MediaStore.Audio.Genres.EXTERNAL_CONTENT_URI, true, mediaStoreObserver ) - contentResolver - .registerContentObserver( - MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI, true, mediaStoreObserver - ) contentResolver .registerContentObserver( MediaStore.Audio.Media.INTERNAL_CONTENT_URI, true, mediaStoreObserver @@ -335,10 +331,6 @@ class MusicService : MediaBrowserServiceCompat(), .registerContentObserver( MediaStore.Audio.Genres.INTERNAL_CONTENT_URI, true, mediaStoreObserver ) - contentResolver - .registerContentObserver( - MediaStore.Audio.Playlists.INTERNAL_CONTENT_URI, true, mediaStoreObserver - ) val audioVolumeObserver = AudioVolumeObserver(this) audioVolumeObserver.register(AudioManager.STREAM_MUSIC, this) registerOnSharedPreferenceChangedListener(this) @@ -475,10 +467,6 @@ class MusicService : MediaBrowserServiceCompat(), return position } - private fun getPlayingQueue(): List { - return playingQueue - } - private fun getPosition(): Int { return position } @@ -854,21 +842,6 @@ class MusicService : MediaBrowserServiceCompat(), } } - fun playSongs(songs: ArrayList?, shuffleMode: Int) { - if (songs != null && songs.isNotEmpty()) { - if (shuffleMode == SHUFFLE_MODE_SHUFFLE) { - val startPosition = Random().nextInt(songs.size) - openQueue(songs, startPosition, false) - setShuffleMode(shuffleMode) - } else { - openQueue(songs, 0, false) - } - play() - } else { - showToast(R.string.playlist_is_empty) - } - } - @Synchronized fun prepareNextImpl() { try { From ebd35bf02692436495eb91e5571fa67b1e3fafea Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Mon, 16 May 2022 13:29:47 +0530 Subject: [PATCH 016/280] [Settings] Added kurmanji kurdish to the Language chooser list --- app/src/main/res/values/arrays.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 9de012247..efec8c09e 100755 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -150,6 +150,7 @@ Japanese Kannada Korean + Kurmanji Kurdish Malayalam Nepali Norwegian @@ -202,6 +203,7 @@ ja kn ko + kmr ml ne no From 28d83d94375a08a80660858c222dc5147c6a3cde Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Mon, 16 May 2022 13:37:32 +0530 Subject: [PATCH 017/280] Suppress deprecations --- .../fragments/player/circle/CirclePlayerFragment.kt | 4 ++-- .../retromusic/helper/MusicProgressViewUpdateHelper.kt | 9 +++++++-- .../code/name/monkey/retromusic/lyrics/CoverLrcView.kt | 1 + .../code/name/monkey/retromusic/util/PackageValidator.kt | 1 + .../code/name/monkey/retromusic/util/PreferenceUtil.kt | 1 + 5 files changed, 12 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/circle/CirclePlayerFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/circle/CirclePlayerFragment.kt index e9489f20f..186f29ec3 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/circle/CirclePlayerFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/circle/CirclePlayerFragment.kt @@ -275,7 +275,7 @@ class CirclePlayerFragment : AbsPlayerFragment(R.layout.fragment_circle_player), } - override fun onProgressChanged(seekBar: CircularSeekBar?, progress: Float, fromUser: Boolean) { + override fun onProgressChanged(circularSeekBar: CircularSeekBar?, progress: Float, fromUser: Boolean) { val audioManager = audioManager audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, progress.toInt(), 0) } @@ -286,7 +286,7 @@ class CirclePlayerFragment : AbsPlayerFragment(R.layout.fragment_circle_player), override fun onStopTrackingTouch(seekBar: CircularSeekBar?) { } - fun setUpProgressSlider() { + private fun setUpProgressSlider() { binding.progressSlider.applyColor(accentColor()) binding.progressSlider.setOnSeekBarChangeListener(object : SimpleOnSeekbarChangeListener() { override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) { diff --git a/app/src/main/java/code/name/monkey/retromusic/helper/MusicProgressViewUpdateHelper.kt b/app/src/main/java/code/name/monkey/retromusic/helper/MusicProgressViewUpdateHelper.kt index 2e6aefefb..3562ef914 100644 --- a/app/src/main/java/code/name/monkey/retromusic/helper/MusicProgressViewUpdateHelper.kt +++ b/app/src/main/java/code/name/monkey/retromusic/helper/MusicProgressViewUpdateHelper.kt @@ -15,6 +15,7 @@ package code.name.monkey.retromusic.helper import android.os.Handler +import android.os.Looper import android.os.Message import kotlin.math.max @@ -32,13 +33,17 @@ class MusicProgressViewUpdateHelper : Handler { removeMessages(CMD_REFRESH_PROGRESS_VIEWS) } - constructor(callback: Callback) { + constructor(callback: Callback) : super(Looper.getMainLooper()) { this.callback = callback this.intervalPlaying = UPDATE_INTERVAL_PLAYING this.intervalPaused = UPDATE_INTERVAL_PAUSED } - constructor(callback: Callback, intervalPlaying: Int, intervalPaused: Int) { + constructor( + callback: Callback, + intervalPlaying: Int, + intervalPaused: Int, + ) : super(Looper.getMainLooper()) { this.callback = callback this.intervalPlaying = intervalPlaying this.intervalPaused = intervalPaused diff --git a/app/src/main/java/code/name/monkey/retromusic/lyrics/CoverLrcView.kt b/app/src/main/java/code/name/monkey/retromusic/lyrics/CoverLrcView.kt index bd421250a..0f2d28d91 100644 --- a/app/src/main/java/code/name/monkey/retromusic/lyrics/CoverLrcView.kt +++ b/app/src/main/java/code/name/monkey/retromusic/lyrics/CoverLrcView.kt @@ -42,6 +42,7 @@ import kotlin.math.abs * 歌词 Created by wcy on 2015/11/9. */ @SuppressLint("StaticFieldLeak") +@Suppress("deprecation") class CoverLrcView @JvmOverloads constructor( context: Context?, attrs: AttributeSet? = null, diff --git a/app/src/main/java/code/name/monkey/retromusic/util/PackageValidator.kt b/app/src/main/java/code/name/monkey/retromusic/util/PackageValidator.kt index cc4124a90..012dfc85a 100644 --- a/app/src/main/java/code/name/monkey/retromusic/util/PackageValidator.kt +++ b/app/src/main/java/code/name/monkey/retromusic/util/PackageValidator.kt @@ -205,6 +205,7 @@ class PackageValidator( * If the app is not found, or if the app does not have exactly one signature, this method * returns `null` as the signature. */ + @Suppress("deprecation") private fun getSignature(packageInfo: PackageInfo): String? { // Security best practices dictate that an app should be signed with exactly one (1) // signature. Because of this, if there are multiple signatures, reject it. diff --git a/app/src/main/java/code/name/monkey/retromusic/util/PreferenceUtil.kt b/app/src/main/java/code/name/monkey/retromusic/util/PreferenceUtil.kt index dcdbae20d..c2fe85c2b 100644 --- a/app/src/main/java/code/name/monkey/retromusic/util/PreferenceUtil.kt +++ b/app/src/main/java/code/name/monkey/retromusic/util/PreferenceUtil.kt @@ -336,6 +336,7 @@ object PreferenceUtil { val isLockScreen get() = sharedPreferences.getBoolean(LOCK_SCREEN, false) + @Suppress("deprecation") fun isAllowedToDownloadMetadata(context: Context): Boolean { return when (autoDownloadImagesPolicy) { "always" -> true From 08df1b29589009b8e207d25f83ca086c7f945546 Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Mon, 16 May 2022 14:35:09 +0530 Subject: [PATCH 018/280] Removed some uses of GlobalScope --- .../retromusic/helper/MusicPlayerRemote.kt | 1 + .../monkey/retromusic/lyrics/CoverLrcView.kt | 36 ---------------- .../service/MediaSessionCallback.kt | 2 +- .../monkey/retromusic/service/MusicService.kt | 42 +++++++++++++++---- .../notification/PlayingNotification.kt | 2 +- .../PlayingNotificationClassic.kt | 4 +- .../notification/PlayingNotificationImpl24.kt | 24 +++-------- .../name/monkey/retromusic/util/MusicUtil.kt | 19 +++++---- 8 files changed, 53 insertions(+), 77 deletions(-) diff --git a/app/src/main/java/code/name/monkey/retromusic/helper/MusicPlayerRemote.kt b/app/src/main/java/code/name/monkey/retromusic/helper/MusicPlayerRemote.kt index 5947f294e..725104596 100644 --- a/app/src/main/java/code/name/monkey/retromusic/helper/MusicPlayerRemote.kt +++ b/app/src/main/java/code/name/monkey/retromusic/helper/MusicPlayerRemote.kt @@ -35,6 +35,7 @@ import org.koin.core.component.KoinComponent import org.koin.core.component.inject import java.io.File import java.util.* +import kotlin.collections.set object MusicPlayerRemote : KoinComponent { diff --git a/app/src/main/java/code/name/monkey/retromusic/lyrics/CoverLrcView.kt b/app/src/main/java/code/name/monkey/retromusic/lyrics/CoverLrcView.kt index 0f2d28d91..a10808726 100644 --- a/app/src/main/java/code/name/monkey/retromusic/lyrics/CoverLrcView.kt +++ b/app/src/main/java/code/name/monkey/retromusic/lyrics/CoverLrcView.kt @@ -257,16 +257,6 @@ class CoverLrcView @JvmOverloads constructor( postInvalidate() } - /** 普通歌词文本字体大小 */ - fun setNormalTextSize(size: Float) { - mNormalTextSize = size - } - - /** 当前歌词文本字体大小 */ - fun setCurrentTextSize(size: Float) { - mCurrentTextSize = size - } - /** 设置当前行歌词的字体颜色 */ fun setCurrentColor(currentColor: Int) { mCurrentTextColor = currentColor @@ -404,28 +394,6 @@ class CoverLrcView @JvmOverloads constructor( } } - /** - * 加载在线歌词,默认使用 utf-8 编码 - * - * @param lrcUrl 歌词文件的网络地址 - */ - @JvmOverloads - fun loadLrcByUrl(lrcUrl: String, charset: String? = "utf-8") { - val flag = "url://$lrcUrl" - this.flag = flag - object : AsyncTask() { - override fun doInBackground(vararg params: String?): String? { - return LrcUtils.getContentFromNetwork(params[0], params[1]) - } - - override fun onPostExecute(lrcText: String) { - if (flag == flag) { - loadLrc(lrcText) - } - } - }.execute(lrcUrl, charset) - } - /** * 歌词是否有效 * @@ -712,10 +680,6 @@ class CoverLrcView @JvmOverloads constructor( fun onPlayClick(time: Long): Boolean } - fun interface OnFlingXListener { - fun onFlingX(velocityX: Float): Boolean - } - companion object { private const val ADJUST_DURATION: Long = 100 private const val TIMELINE_KEEP_TIME = 4 * DateUtils.SECOND_IN_MILLIS diff --git a/app/src/main/java/code/name/monkey/retromusic/service/MediaSessionCallback.kt b/app/src/main/java/code/name/monkey/retromusic/service/MediaSessionCallback.kt index e2a29931f..d2b604231 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/MediaSessionCallback.kt +++ b/app/src/main/java/code/name/monkey/retromusic/service/MediaSessionCallback.kt @@ -190,7 +190,7 @@ class MediaSessionCallback( musicService.updateMediaSessionPlaybackState() } TOGGLE_FAVORITE -> { - MusicUtil.toggleFavorite(context, MusicPlayerRemote.currentSong) + musicService.toggleFavorite() musicService.updateMediaSessionPlaybackState() } else -> { diff --git a/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt b/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt index 3fc71329a..0990961b0 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt +++ b/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt @@ -72,6 +72,7 @@ import code.name.monkey.retromusic.service.notification.PlayingNotificationClass import code.name.monkey.retromusic.service.notification.PlayingNotificationImpl24 import code.name.monkey.retromusic.service.playback.Playback import code.name.monkey.retromusic.service.playback.Playback.PlaybackCallbacks +import code.name.monkey.retromusic.util.MusicUtil import code.name.monkey.retromusic.util.MusicUtil.getMediaStoreAlbumCoverUri import code.name.monkey.retromusic.util.MusicUtil.toggleFavorite import code.name.monkey.retromusic.util.PackageValidator @@ -202,8 +203,11 @@ class MusicService : MediaBrowserServiceCompat(), private val updateFavoriteReceiver = object : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { - playingNotification?.updateFavorite(currentSong) { startForegroundOrNotify() } - appWidgetCircle.notifyChange(this@MusicService, FAVORITE_STATE_CHANGED) + isCurrentFavorite { isFavorite -> + playingNotification?.updateFavorite(isFavorite) + startForegroundOrNotify() + appWidgetCircle.notifyChange(this@MusicService, FAVORITE_STATE_CHANGED) + } } } @@ -718,7 +722,7 @@ class MusicService : MediaBrowserServiceCompat(), quit() } ACTION_PENDING_QUIT -> pendingQuit = true - TOGGLE_FAVORITE -> toggleFavorite(applicationContext, currentSong) + TOGGLE_FAVORITE -> toggleFavorite() } } } @@ -852,6 +856,21 @@ class MusicService : MediaBrowserServiceCompat(), } } + fun toggleFavorite() { + serviceScope.launch { + toggleFavorite(this@MusicService, currentSong) + } + } + + fun isCurrentFavorite(completion: (isFavorite: Boolean) -> Unit) { + serviceScope.launch(IO) { + val isFavorite = MusicUtil.isFavorite(currentSong) + withContext(Main) { + completion(isFavorite) + } + } + } + fun quit() { pause() stopForeground(true) @@ -859,10 +878,10 @@ class MusicService : MediaBrowserServiceCompat(), playbackManager.release() AudioManagerCompat.abandonAudioFocusRequest(audioManager!!, AudioFocusRequestCompat.Builder(AudioManagerCompat.AUDIOFOCUS_GAIN) - .setOnAudioFocusChangeListener(audioFocusListener) - .setAudioAttributes( - AudioAttributesCompat.Builder().setContentType(CONTENT_TYPE_MUSIC).build() - ).build()) + .setOnAudioFocusChangeListener(audioFocusListener) + .setAudioAttributes( + AudioAttributesCompat.Builder().setContentType(CONTENT_TYPE_MUSIC).build() + ).build()) stopSelf() } @@ -1105,7 +1124,8 @@ class MusicService : MediaBrowserServiceCompat(), startForegroundOrNotify() } FAVORITE_STATE_CHANGED -> { - playingNotification?.updateFavorite(currentSong) { + isCurrentFavorite { isFavorite -> + playingNotification?.updateFavorite(isFavorite) startForegroundOrNotify() } @@ -1122,7 +1142,11 @@ class MusicService : MediaBrowserServiceCompat(), } META_CHANGED -> { playingNotification?.updateMetadata(currentSong) { startForegroundOrNotify() } - playingNotification?.updateFavorite(currentSong) { startForegroundOrNotify() } + isCurrentFavorite { isFavorite -> + playingNotification?.updateFavorite(isFavorite) + startForegroundOrNotify() + } + updateMediaSessionMetaData() updateMediaSessionPlaybackState() savePosition() diff --git a/app/src/main/java/code/name/monkey/retromusic/service/notification/PlayingNotification.kt b/app/src/main/java/code/name/monkey/retromusic/service/notification/PlayingNotification.kt index 162775f06..110677115 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/notification/PlayingNotification.kt +++ b/app/src/main/java/code/name/monkey/retromusic/service/notification/PlayingNotification.kt @@ -31,7 +31,7 @@ abstract class PlayingNotification(context: Context) : abstract fun setPlaying(isPlaying: Boolean) - abstract fun updateFavorite(song: Song, onUpdate: () -> Unit) + abstract fun updateFavorite(isFavorite: Boolean) companion object { const val NOTIFICATION_CONTROLS_SIZE_MULTIPLIER = 1.0f diff --git a/app/src/main/java/code/name/monkey/retromusic/service/notification/PlayingNotificationClassic.kt b/app/src/main/java/code/name/monkey/retromusic/service/notification/PlayingNotificationClassic.kt index 7acb1d21c..271a33bc2 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/notification/PlayingNotificationClassic.kt +++ b/app/src/main/java/code/name/monkey/retromusic/service/notification/PlayingNotificationClassic.kt @@ -47,7 +47,6 @@ import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_REWIND import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_SKIP import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_TOGGLE_PAUSE import code.name.monkey.retromusic.util.PreferenceUtil -import code.name.monkey.retromusic.util.RetroUtil import code.name.monkey.retromusic.util.color.MediaNotificationProcessor import com.bumptech.glide.request.target.CustomTarget import com.bumptech.glide.request.transition.Transition @@ -252,8 +251,7 @@ class PlayingNotificationClassic( } } - override fun updateFavorite(song: Song, onUpdate: () -> Unit) { - } + override fun updateFavorite(isFavorite: Boolean) {} private fun buildPendingIntent( context: Context, action: String, diff --git a/app/src/main/java/code/name/monkey/retromusic/service/notification/PlayingNotificationImpl24.kt b/app/src/main/java/code/name/monkey/retromusic/service/notification/PlayingNotificationImpl24.kt index 887209ab3..e3752aa16 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/notification/PlayingNotificationImpl24.kt +++ b/app/src/main/java/code/name/monkey/retromusic/service/notification/PlayingNotificationImpl24.kt @@ -18,7 +18,6 @@ import android.annotation.SuppressLint import android.app.NotificationManager import android.app.PendingIntent import android.content.ComponentName -import android.content.Context import android.content.Intent import android.graphics.Bitmap import android.graphics.BitmapFactory @@ -39,19 +38,14 @@ import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_REWIND import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_SKIP import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_TOGGLE_PAUSE import code.name.monkey.retromusic.service.MusicService.Companion.TOGGLE_FAVORITE -import code.name.monkey.retromusic.util.MusicUtil import code.name.monkey.retromusic.util.PreferenceUtil import com.bumptech.glide.request.target.CustomTarget import com.bumptech.glide.request.transition.Transition -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.GlobalScope -import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext @SuppressLint("RestrictedApi") class PlayingNotificationImpl24( - val context: Context, - mediaSessionToken: MediaSessionCompat.Token + val context: MusicService, + mediaSessionToken: MediaSessionCompat.Token, ) : PlayingNotification(context) { init { @@ -184,14 +178,8 @@ class PlayingNotificationImpl24( mActions[2] = buildPlayAction(isPlaying) } - override fun updateFavorite(song: Song, onUpdate: () -> Unit) { - GlobalScope.launch(Dispatchers.IO) { - val isFavorite = MusicUtil.repository.isSongFavorite(song.id) - withContext(Dispatchers.Main) { - mActions[0] = buildFavoriteAction(isFavorite) - onUpdate() - } - } + override fun updateFavorite(isFavorite: Boolean) { + mActions[0] = buildFavoriteAction(isFavorite) } private fun retrievePlaybackAction(action: String): PendingIntent { @@ -208,9 +196,9 @@ class PlayingNotificationImpl24( companion object { fun from( - context: Context, + context: MusicService, notificationManager: NotificationManager, - mediaSession: MediaSessionCompat + mediaSession: MediaSessionCompat, ): PlayingNotification { if (VersionUtils.hasOreo()) { createNotificationChannel(context, notificationManager) diff --git a/app/src/main/java/code/name/monkey/retromusic/util/MusicUtil.kt b/app/src/main/java/code/name/monkey/retromusic/util/MusicUtil.kt index 3262157ff..43a7cbb0a 100644 --- a/app/src/main/java/code/name/monkey/retromusic/util/MusicUtil.kt +++ b/app/src/main/java/code/name/monkey/retromusic/util/MusicUtil.kt @@ -28,8 +28,7 @@ import code.name.monkey.retromusic.repository.Repository import code.name.monkey.retromusic.repository.SongRepository import code.name.monkey.retromusic.service.MusicService import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.GlobalScope -import kotlinx.coroutines.launch +import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.withContext import org.jaudiotagger.audio.AudioFileIO import org.jaudiotagger.tag.FieldKey @@ -100,7 +99,7 @@ object MusicUtil : KoinComponent { fun getArtistInfoString( context: Context, - artist: Artist + artist: Artist, ): String { val albumCount = artist.albumCount val songCount = artist.songCount @@ -190,7 +189,7 @@ object MusicUtil : KoinComponent { fun getPlaylistInfoString( context: Context, - songs: List + songs: List, ): String { val duration = getTotalDuration(songs) return buildInfoString( @@ -201,7 +200,7 @@ object MusicUtil : KoinComponent { fun playlistInfoString( context: Context, - songs: List + songs: List, ): String { return getSongCountString(context, songs.size) } @@ -299,7 +298,7 @@ object MusicUtil : KoinComponent { fun insertAlbumArt( context: Context, albumId: Long, - path: String? + path: String?, ) { val contentResolver = context.contentResolver val artworkUri = "content://media/external/audio/albumart".toUri() @@ -334,8 +333,8 @@ object MusicUtil : KoinComponent { } val repository = get() - fun toggleFavorite(context: Context, song: Song) { - GlobalScope.launch { + suspend fun toggleFavorite(context: Context, song: Song) { + withContext(IO) { val playlist: PlaylistEntity = repository.favoritePlaylist() val songEntity = song.toSongEntity(playlist.playListId) val isFavorite = repository.isFavoriteSong(songEntity).isNotEmpty() @@ -348,11 +347,13 @@ object MusicUtil : KoinComponent { } } + suspend fun isFavorite(song: Song) = repository.isSongFavorite(song.id) + fun deleteTracks( activity: FragmentActivity, songs: List, safUris: List?, - callback: Runnable? + callback: Runnable?, ) { val songRepository: SongRepository = get() val projection = arrayOf( From aa96993584e6c278c7a062e2c7f7b9ef3ce5790a Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Mon, 16 May 2022 15:19:20 +0530 Subject: [PATCH 019/280] Removed Blacklist and Lyrics Room tables --- .../code/name/monkey/retromusic/MainModule.kt | 27 +------------------ .../monkey/retromusic/db/RetroDatabase.kt | 6 ++--- .../retromusic/repository/Repository.kt | 4 --- .../retromusic/repository/RoomRepository.kt | 27 +------------------ 4 files changed, 4 insertions(+), 60 deletions(-) diff --git a/app/src/main/java/code/name/monkey/retromusic/MainModule.kt b/app/src/main/java/code/name/monkey/retromusic/MainModule.kt index c1c58f3de..abad95853 100644 --- a/app/src/main/java/code/name/monkey/retromusic/MainModule.kt +++ b/app/src/main/java/code/name/monkey/retromusic/MainModule.kt @@ -1,12 +1,8 @@ package code.name.monkey.retromusic import androidx.room.Room -import androidx.room.RoomDatabase -import androidx.sqlite.db.SupportSQLiteDatabase import code.name.monkey.retromusic.auto.AutoMusicProvider import code.name.monkey.retromusic.cast.RetroWebServer -import code.name.monkey.retromusic.db.BlackListStoreDao -import code.name.monkey.retromusic.db.BlackListStoreEntity import code.name.monkey.retromusic.db.PlaylistWithSongs import code.name.monkey.retromusic.db.RetroDatabase import code.name.monkey.retromusic.fragments.LibraryViewModel @@ -20,10 +16,6 @@ import code.name.monkey.retromusic.network.provideLastFmRest import code.name.monkey.retromusic.network.provideLastFmRetrofit import code.name.monkey.retromusic.network.provideOkHttp import code.name.monkey.retromusic.repository.* -import code.name.monkey.retromusic.util.FilePathUtil -import kotlinx.coroutines.Dispatchers.IO -import kotlinx.coroutines.GlobalScope -import kotlinx.coroutines.launch import org.koin.android.ext.koin.androidContext import org.koin.androidx.viewmodel.dsl.viewModel import org.koin.dsl.bind @@ -50,31 +42,14 @@ private val roomModule = module { single { Room.databaseBuilder(androidContext(), RetroDatabase::class.java, "playlist.db") .allowMainThreadQueries() - .addCallback(object : RoomDatabase.Callback() { - override fun onOpen(db: SupportSQLiteDatabase) { - super.onOpen(db) - GlobalScope.launch(IO) { - FilePathUtil.blacklistFilePaths().map { - get().insertBlacklistPath(BlackListStoreEntity(it)) - } - } - } - }) .fallbackToDestructiveMigration() .build() } - factory { - get().lyricsDao() - } factory { get().playlistDao() } - factory { - get().blackListStore() - } - factory { get().playCountDao() } @@ -84,7 +59,7 @@ private val roomModule = module { } single { - RealRoomRepository(get(), get(), get(), get(), get()) + RealRoomRepository(get(), get(), get()) } bind RoomRepository::class } private val autoModule = module { diff --git a/app/src/main/java/code/name/monkey/retromusic/db/RetroDatabase.kt b/app/src/main/java/code/name/monkey/retromusic/db/RetroDatabase.kt index 804342126..6401766aa 100644 --- a/app/src/main/java/code/name/monkey/retromusic/db/RetroDatabase.kt +++ b/app/src/main/java/code/name/monkey/retromusic/db/RetroDatabase.kt @@ -18,14 +18,12 @@ import androidx.room.Database import androidx.room.RoomDatabase @Database( - entities = [PlaylistEntity::class, SongEntity::class, HistoryEntity::class, PlayCountEntity::class, BlackListStoreEntity::class, LyricsEntity::class], - version = 23, + entities = [PlaylistEntity::class, SongEntity::class, HistoryEntity::class, PlayCountEntity::class], + version = 24, exportSchema = false ) abstract class RetroDatabase : RoomDatabase() { abstract fun playlistDao(): PlaylistDao - abstract fun blackListStore(): BlackListStoreDao abstract fun playCountDao(): PlayCountDao abstract fun historyDao(): HistoryDao - abstract fun lyricsDao(): LyricsDao } diff --git a/app/src/main/java/code/name/monkey/retromusic/repository/Repository.kt b/app/src/main/java/code/name/monkey/retromusic/repository/Repository.kt index c2e67e584..fdbcb48e9 100644 --- a/app/src/main/java/code/name/monkey/retromusic/repository/Repository.kt +++ b/app/src/main/java/code/name/monkey/retromusic/repository/Repository.kt @@ -103,7 +103,6 @@ interface Repository { suspend fun clearSongHistory() suspend fun checkSongExistInPlayCount(songId: Long): List suspend fun playCountSongs(): List - suspend fun blackListPaths(): List suspend fun deleteSongs(songs: List) suspend fun contributor(): List suspend fun searchArtists(query: String): List @@ -345,9 +344,6 @@ class RealRepository( override suspend fun playCountSongs(): List = roomRepository.playCountSongs() - override suspend fun blackListPaths(): List = - roomRepository.blackListPaths() - override fun observableHistorySongs(): LiveData> = Transformations.map(roomRepository.observableHistorySongs()) { it.fromHistoryToSongs() diff --git a/app/src/main/java/code/name/monkey/retromusic/repository/RoomRepository.kt b/app/src/main/java/code/name/monkey/retromusic/repository/RoomRepository.kt index 2d6277322..e8b703497 100644 --- a/app/src/main/java/code/name/monkey/retromusic/repository/RoomRepository.kt +++ b/app/src/main/java/code/name/monkey/retromusic/repository/RoomRepository.kt @@ -16,7 +16,6 @@ import code.name.monkey.retromusic.util.PreferenceUtil interface RoomRepository { fun historySongs(): List fun favoritePlaylistLiveData(favorite: String): LiveData> - fun insertBlacklistPath(blackListStoreEntity: BlackListStoreEntity) fun observableHistorySongs(): LiveData> fun getSongs(playListId: Long): LiveData> suspend fun createPlaylist(playlistEntity: PlaylistEntity): Long @@ -42,11 +41,6 @@ interface RoomRepository { suspend fun clearSongHistory() suspend fun checkSongExistInPlayCount(songId: Long): List suspend fun playCountSongs(): List - suspend fun insertBlacklistPath(blackListStoreEntities: List) - suspend fun deleteBlacklistPath(blackListStoreEntity: BlackListStoreEntity) - suspend fun clearBlacklist() - suspend fun insertBlacklistPathAsync(blackListStoreEntity: BlackListStoreEntity) - suspend fun blackListPaths(): List suspend fun deleteSongs(songs: List) suspend fun isSongFavorite(context: Context, songId: Long): Boolean fun checkPlaylistExists(playListId: Long): LiveData @@ -54,10 +48,8 @@ interface RoomRepository { class RealRoomRepository( private val playlistDao: PlaylistDao, - private val blackListStoreDao: BlackListStoreDao, private val playCountDao: PlayCountDao, - private val historyDao: HistoryDao, - private val lyricsDao: LyricsDao + private val historyDao: HistoryDao ) : RoomRepository { @WorkerThread override suspend fun createPlaylist(playlistEntity: PlaylistEntity): Long = @@ -185,27 +177,10 @@ class RealRoomRepository( override suspend fun playCountSongs(): List = playCountDao.playCountSongs() - override fun insertBlacklistPath(blackListStoreEntity: BlackListStoreEntity) = - blackListStoreDao.insertBlacklistPath(blackListStoreEntity) - - override suspend fun insertBlacklistPath(blackListStoreEntities: List) = - blackListStoreDao.insertBlacklistPath(blackListStoreEntities) - - override suspend fun insertBlacklistPathAsync(blackListStoreEntity: BlackListStoreEntity) = - blackListStoreDao.insertBlacklistPath(blackListStoreEntity) - - override suspend fun blackListPaths(): List = - blackListStoreDao.blackListPaths() - override suspend fun deleteSongs(songs: List) = songs.forEach { playCountDao.deleteSong(it.id) } - override suspend fun deleteBlacklistPath(blackListStoreEntity: BlackListStoreEntity) = - blackListStoreDao.deleteBlacklistPath(blackListStoreEntity) - - override suspend fun clearBlacklist() = blackListStoreDao.clearBlacklist() - override suspend fun isSongFavorite(context: Context, songId: Long): Boolean { return playlistDao.isSongExistsInPlaylist( playlistDao.playlist(context.getString(R.string.favorites)).firstOrNull()?.playListId From d65f8f8a4f1d0829b4c2dc81dfee6757a183e19b Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Tue, 17 May 2022 00:41:32 +0530 Subject: [PATCH 020/280] [Settings] Mini player in Settings (Converted Settings activity to fragment) --- app/build.gradle | 4 +- app/src/main/AndroidManifest.xml | 1 - .../code/name/monkey/retromusic/Constants.kt | 6 -- .../retromusic/activities/MainActivity.kt | 27 +++--- .../base/AbsSlidingMusicPanelActivity.kt | 77 +++++++++++++---- .../activities/base/AbsThemeActivity.kt | 5 +- .../extensions/ActivityThemeExtensions.kt | 2 +- .../retromusic/extensions/InsetsExtensions.kt | 2 +- .../retromusic/extensions/ViewExtensions.kt | 9 +- .../fragments/base/AbsPlayerFragment.kt | 16 +++- .../fragments/base/AbsRecyclerViewFragment.kt | 2 +- .../fragments/folder/FoldersFragment.kt | 2 +- .../retromusic/fragments/home/HomeFragment.kt | 5 +- .../fragments/library/LibraryFragment.kt | 2 +- .../fragments/other/MiniPlayerFragment.kt | 3 + .../player/PlayerAlbumCoverFragment.kt | 51 ++++++----- .../player/gradient/GradientPlayerFragment.kt | 2 +- .../fragments/queue/PlayingQueueFragment.kt | 6 +- .../fragments/settings/AbsSettingsFragment.kt | 1 - .../settings/PersonalizeSettingsFragment.kt | 10 +-- .../settings/SettingsFragment.kt} | 84 ++++++++----------- .../settings/ThemeSettingsFragment.kt | 7 ++ .../retromusic/repository/Repository.kt | 1 - .../retromusic/views/HomeImageLayout.kt | 2 +- app/src/main/res/layout/fragment_folder.xml | 21 ++--- ...ity_settings.xml => fragment_settings.xml} | 0 app/src/main/res/navigation/main_graph.xml | 7 +- app/src/main/res/values/dimens.xml | 3 - app/src/main/res/values/styles.xml | 6 ++ 29 files changed, 206 insertions(+), 158 deletions(-) rename app/src/main/java/code/name/monkey/retromusic/{activities/SettingsActivity.kt => fragments/settings/SettingsFragment.kt} (60%) rename app/src/main/res/layout/{activity_settings.xml => fragment_settings.xml} (100%) diff --git a/app/build.gradle b/app/build.gradle index d355e7076..b2d7efc15 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -165,6 +165,6 @@ dependencies { implementation 'com.github.dhaval2404:imagepicker:2.1' implementation 'me.zhanghai.android.fastscroll:library:1.1.8' implementation 'cat.ereza:customactivityoncrash:2.3.0' - implementation 'me.tankery.lib:circularSeekBar:1.3.2' - debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.9.1' + implementation 'me.tankery.lib:circularSeekBar:1.4.0' + //debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.9.1' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f1449cd37..3c45688e8 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -116,7 +116,6 @@ - diff --git a/app/src/main/java/code/name/monkey/retromusic/Constants.kt b/app/src/main/java/code/name/monkey/retromusic/Constants.kt index 59532ab49..3818186d3 100644 --- a/app/src/main/java/code/name/monkey/retromusic/Constants.kt +++ b/app/src/main/java/code/name/monkey/retromusic/Constants.kt @@ -88,12 +88,7 @@ const val CIRCULAR_ALBUM_ART = "circular_album_art" const val USER_NAME = "user_name" const val TOGGLE_FULL_SCREEN = "toggle_full_screen" const val TOGGLE_VOLUME = "toggle_volume" -const val ROUND_CORNERS = "corner_window" -const val TOGGLE_GENRE = "toggle_genre" -const val PROFILE_IMAGE_PATH = "profile_image_path" -const val BANNER_IMAGE_PATH = "banner_image_path" const val ADAPTIVE_COLOR_APP = "adaptive_color_app" -const val TOGGLE_SEPARATE_LINE = "toggle_separate_line" const val HOME_ARTIST_GRID_STYLE = "home_artist_grid_style" const val HOME_ALBUM_GRID_STYLE = "home_album_grid_style" const val TOGGLE_ADD_CONTROLS = "toggle_add_controls" @@ -108,7 +103,6 @@ const val SAF_SDCARD_URI = "saf_sdcard_uri" const val SONG_SORT_ORDER = "song_sort_order" const val SONG_GRID_SIZE = "song_grid_size" const val GENRE_SORT_ORDER = "genre_sort_order" -const val LAST_PAGE = "last_start_page" const val BLUETOOTH_PLAYBACK = "bluetooth_playback" const val INITIALIZED_BLACKLIST = "initialized_blacklist" const val ARTIST_SORT_ORDER = "artist_sort_order" diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/MainActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/MainActivity.kt index b338915ea..4a147b5f0 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/MainActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/MainActivity.kt @@ -15,18 +15,17 @@ package code.name.monkey.retromusic.activities import android.content.Intent -import android.content.SharedPreferences -import android.content.SharedPreferences.OnSharedPreferenceChangeListener import android.net.Uri import android.os.Bundle import android.provider.MediaStore import androidx.lifecycle.lifecycleScope import androidx.navigation.contains import androidx.navigation.ui.setupWithNavController -import code.name.monkey.retromusic.* +import code.name.monkey.retromusic.R import code.name.monkey.retromusic.activities.base.AbsCastActivity import code.name.monkey.retromusic.databinding.SlidingMusicPanelLayoutBinding import code.name.monkey.retromusic.extensions.* +import code.name.monkey.retromusic.fragments.settings.OnThemeChangedListener import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.helper.SearchQueryHelper.getSongs import code.name.monkey.retromusic.interfaces.IScrollHelper @@ -40,7 +39,7 @@ import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.launch import org.koin.android.ext.android.get -class MainActivity : AbsCastActivity(), OnSharedPreferenceChangeListener { +class MainActivity : AbsCastActivity(), OnThemeChangedListener { companion object { const val TAG = "MainActivity" const val EXPAND_PANEL = "expand_panel" @@ -137,20 +136,18 @@ class MainActivity : AbsCastActivity(), OnSharedPreferenceChangeListener { } } - override fun onResume() { - super.onResume() - PreferenceUtil.registerOnSharedPreferenceChangedListener(this) + override fun onThemeValuesChanged() { + restart() } - override fun onDestroy() { - super.onDestroy() - PreferenceUtil.unregisterOnSharedPreferenceChangedListener(this) - } - - override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) { - if (key == GENERAL_THEME || key == MATERIAL_YOU || key == WALLPAPER_ACCENT || key == BLACK_THEME || key == ADAPTIVE_COLOR_APP || key == USER_NAME || key == TOGGLE_FULL_SCREEN || key == TOGGLE_VOLUME || key == ROUND_CORNERS || key == CAROUSEL_EFFECT || key == NOW_PLAYING_SCREEN_ID || key == TOGGLE_GENRE || key == BANNER_IMAGE_PATH || key == PROFILE_IMAGE_PATH || key == CIRCULAR_ALBUM_ART || key == KEEP_SCREEN_ON || key == TOGGLE_SEPARATE_LINE || key == TOGGLE_HOME_BANNER || key == TOGGLE_ADD_CONTROLS || key == ALBUM_COVER_STYLE || key == HOME_ARTIST_GRID_STYLE || key == ALBUM_COVER_TRANSFORM || key == DESATURATED_COLOR || key == EXTRA_SONG_INFO || key == TAB_TEXT_MODE || key == LANGUAGE_NAME || key == LIBRARY_CATEGORIES || key == CUSTOM_FONT || key == APPBAR_MODE || key == CIRCLE_PLAY_BUTTON || key == SWIPE_DOWN_DISMISS) { - postRecreate() + private fun restart() { + val savedInstanceState = Bundle().apply { + onSaveInstanceState(this) } + finish() + val intent = Intent(this, this::class.java).putExtra(TAG, savedInstanceState) + startActivity(intent) + overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out) } override fun onServiceConnected() { 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 7130f3901..c6a0e2106 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 @@ -16,6 +16,7 @@ package code.name.monkey.retromusic.activities.base import android.animation.ArgbEvaluator import android.animation.ValueAnimator +import android.content.SharedPreferences import android.content.res.ColorStateList import android.graphics.Color import android.os.Bundle @@ -29,7 +30,7 @@ import androidx.core.view.* import androidx.fragment.app.Fragment import androidx.fragment.app.commit import code.name.monkey.appthemehelper.util.VersionUtils -import code.name.monkey.retromusic.R +import code.name.monkey.retromusic.* import code.name.monkey.retromusic.databinding.SlidingMusicPanelLayoutBinding import code.name.monkey.retromusic.extensions.* import code.name.monkey.retromusic.fragments.LibraryViewModel @@ -65,7 +66,8 @@ import com.google.android.material.bottomsheet.BottomSheetBehavior.* import org.koin.androidx.viewmodel.ext.android.viewModel -abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() { +abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity(), + SharedPreferences.OnSharedPreferenceChangeListener { companion object { val TAG: String = AbsSlidingMusicPanelActivity::class.java.simpleName } @@ -166,6 +168,7 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() { override fun onResume() { super.onResume() + PreferenceUtil.registerOnSharedPreferenceChangedListener(this) if (nowPlayingScreen != PreferenceUtil.nowPlayingScreen) { postRecreate() } @@ -177,6 +180,46 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() { override fun onDestroy() { super.onDestroy() bottomSheetBehavior.removeBottomSheetCallback(bottomSheetCallbackList) + PreferenceUtil.unregisterOnSharedPreferenceChangedListener(this) + } + + override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) { + when (key) { + SWIPE_DOWN_DISMISS -> { + bottomSheetBehavior.isHideable = PreferenceUtil.swipeDownToDismiss + } + TOGGLE_ADD_CONTROLS -> { + miniPlayerFragment?.setUpButtons() + } + NOW_PLAYING_SCREEN_ID, ALBUM_COVER_TRANSFORM, CAROUSEL_EFFECT, + ALBUM_COVER_STYLE, TOGGLE_VOLUME, EXTRA_SONG_INFO, CIRCLE_PLAY_BUTTON, + -> { + chooseFragmentForTheme() + onServiceConnected() + } + ADAPTIVE_COLOR_APP -> { + if (PreferenceUtil.nowPlayingScreen in listOf(Normal, Material, Flat)) { + chooseFragmentForTheme() + onServiceConnected() + } + } + LIBRARY_CATEGORIES -> { + updateTabs() + } + TAB_TEXT_MODE -> { + bottomNavigationView.labelVisibilityMode = PreferenceUtil.tabTitleMode + } + TOGGLE_FULL_SCREEN -> { + if (!PreferenceUtil.isFullScreenMode) exitFullscreen() + setEdgeToEdgeOrImmersive() + } + SCREEN_ON_LYRICS -> { + keepScreenOn(bottomSheetBehavior.state == STATE_EXPANDED && PreferenceUtil.lyricsScreenOn && PreferenceUtil.showLyrics || PreferenceUtil.isScreenOnEnabled) + } + KEEP_SCREEN_ON -> { + maybeSetScreenOn() + } + } } protected fun wrapSlidingMusicPanel(): SlidingMusicPanelLayoutBinding { @@ -367,18 +410,20 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() { ) return } - val mAnimate = animate && bottomSheetBehavior.state == STATE_COLLAPSED - if (mAnimate) { - if (visible) { - binding.bottomNavigationView.bringToFront() - binding.bottomNavigationView.show() + if (visible xor bottomNavigationView.isVisible) { + val mAnimate = animate && bottomSheetBehavior.state == STATE_COLLAPSED + if (mAnimate) { + if (visible) { + binding.bottomNavigationView.bringToFront() + binding.bottomNavigationView.show() + } else { + binding.bottomNavigationView.hide() + } } else { - binding.bottomNavigationView.hide() - } - } else { - binding.bottomNavigationView.isVisible = false - if (visible && bottomSheetBehavior.state != STATE_EXPANDED) { - binding.bottomNavigationView.bringToFront() + binding.bottomNavigationView.isVisible = false + if (visible && bottomSheetBehavior.state != STATE_EXPANDED) { + binding.bottomNavigationView.bringToFront() + } } } hideBottomSheet( @@ -393,10 +438,10 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() { animate: Boolean = false, isBottomNavVisible: Boolean = bottomNavigationView.isVisible, ) { - val heightOfBar = windowInsets.safeGetBottomInsets() + dip(R.dimen.mini_player_height) + val heightOfBar = windowInsets.getBottomInsets() + dip(R.dimen.mini_player_height) val heightOfBarWithTabs = heightOfBar + dip(R.dimen.bottom_nav_height) if (hide) { - bottomSheetBehavior.peekHeight = -windowInsets.safeGetBottomInsets() + bottomSheetBehavior.peekHeight = -windowInsets.getBottomInsets() bottomSheetBehavior.state = STATE_COLLAPSED libraryViewModel.setFabMargin( this, @@ -458,7 +503,7 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() { Classic -> ClassicPlayerFragment() MD3 -> MD3PlayerFragment() else -> PlayerFragment() - } // must implement AbsPlayerFragment + } // must extend AbsPlayerFragment supportFragmentManager.commit { replace(R.id.playerFragmentContainer, fragment) } diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsThemeActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsThemeActivity.kt index 5e7a8f8eb..20e499e94 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsThemeActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsThemeActivity.kt @@ -44,7 +44,7 @@ abstract class AbsThemeActivity : ATHToolbarActivity(), Runnable { super.onCreate(savedInstanceState) setEdgeToEdgeOrImmersive() registerSystemUiVisibility() - toggleScreenOn() + maybeSetScreenOn() setLightNavigationBarAuto() setLightStatusBarAuto(surfaceColor()) if (VersionUtils.hasQ()) { @@ -61,9 +61,6 @@ abstract class AbsThemeActivity : ATHToolbarActivity(), Runnable { if (PreferenceUtil.isCustomFont) { setTheme(R.style.FontThemeOverlay) } - if (PreferenceUtil.circlePlayButton) { - setTheme(R.style.CircleFABOverlay) - } } override fun onWindowFocusChanged(hasFocus: Boolean) { diff --git a/app/src/main/java/code/name/monkey/retromusic/extensions/ActivityThemeExtensions.kt b/app/src/main/java/code/name/monkey/retromusic/extensions/ActivityThemeExtensions.kt index c4a5c7ee8..d6c5a559d 100644 --- a/app/src/main/java/code/name/monkey/retromusic/extensions/ActivityThemeExtensions.kt +++ b/app/src/main/java/code/name/monkey/retromusic/extensions/ActivityThemeExtensions.kt @@ -16,7 +16,7 @@ import code.name.monkey.appthemehelper.util.VersionUtils import code.name.monkey.retromusic.R import code.name.monkey.retromusic.util.PreferenceUtil -fun AppCompatActivity.toggleScreenOn() { +fun AppCompatActivity.maybeSetScreenOn() { if (PreferenceUtil.isScreenOnEnabled) { window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) } else { diff --git a/app/src/main/java/code/name/monkey/retromusic/extensions/InsetsExtensions.kt b/app/src/main/java/code/name/monkey/retromusic/extensions/InsetsExtensions.kt index bc2f1bde9..70c8a10f4 100644 --- a/app/src/main/java/code/name/monkey/retromusic/extensions/InsetsExtensions.kt +++ b/app/src/main/java/code/name/monkey/retromusic/extensions/InsetsExtensions.kt @@ -4,7 +4,7 @@ import androidx.core.view.WindowInsetsCompat import code.name.monkey.retromusic.util.PreferenceUtil import code.name.monkey.retromusic.util.RetroUtil -fun WindowInsetsCompat?.safeGetBottomInsets(): Int { +fun WindowInsetsCompat?.getBottomInsets(): Int { return if (PreferenceUtil.isFullScreenMode) { return 0 } else { diff --git a/app/src/main/java/code/name/monkey/retromusic/extensions/ViewExtensions.kt b/app/src/main/java/code/name/monkey/retromusic/extensions/ViewExtensions.kt index 0147255a0..fba21e4ce 100644 --- a/app/src/main/java/code/name/monkey/retromusic/extensions/ViewExtensions.kt +++ b/app/src/main/java/code/name/monkey/retromusic/extensions/ViewExtensions.kt @@ -119,6 +119,11 @@ fun BottomNavigationView.show() { fun BottomNavigationView.hide() { if (isGone) return + if (!isLaidOut) { + isGone = true + return + } + val drawable = BitmapDrawable(context.resources, drawToBitmap()) val parent = parent as ViewGroup drawable.setBounds(left, top, right, bottom) @@ -255,7 +260,7 @@ fun View.updateMargin( @Px left: Int = marginLeft, @Px top: Int = marginTop, @Px right: Int = marginRight, - @Px bottom: Int = marginBottom + @Px bottom: Int = marginBottom, ) { (layoutParams as ViewGroup.MarginLayoutParams).updateMargins(left, top, right, bottom) } @@ -296,7 +301,7 @@ fun View.requestApplyInsetsWhenAttached() { data class InitialPadding( val left: Int, val top: Int, - val right: Int, val bottom: Int + val right: Int, val bottom: Int, ) fun recordInitialPaddingForView(view: View) = InitialPadding( diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsPlayerFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsPlayerFragment.kt index 8a8069d2f..20e1ccceb 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsPlayerFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsPlayerFragment.kt @@ -163,8 +163,10 @@ abstract class AbsPlayerFragment(@LayoutRes layout: Int) : AbsMusicServiceFragme R.id.now_playing -> { requireActivity().findNavController(R.id.fragment_container).navigate( R.id.playing_queue_fragment, - null + null, + navOptions { launchSingleTop = true } ) + mainActivity.collapsePanel() return true } R.id.action_show_lyrics -> { @@ -289,6 +291,15 @@ abstract class AbsPlayerFragment(@LayoutRes layout: Int) : AbsMusicServiceFragme } } + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + if (PreferenceUtil.circlePlayButton) { + requireContext().theme.applyStyle(R.style.CircleFABOverlay, true) + } else { + requireContext().theme.applyStyle(R.style.RoundedFABOverlay, true) + } + } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) if (PreferenceUtil.isFullScreenMode && @@ -421,8 +432,7 @@ fun goToLyrics(activity: Activity) { findNavController(R.id.fragment_container).navigate( R.id.lyrics_fragment, null, - navOptions { launchSingleTop = true }, - null + navOptions { launchSingleTop = true } ) } } \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsRecyclerViewFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsRecyclerViewFragment.kt index a3004be8b..e96379512 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsRecyclerViewFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsRecyclerViewFragment.kt @@ -216,7 +216,7 @@ abstract class AbsRecyclerViewFragment, LM : Recycle override fun onMenuItemSelected(item: MenuItem): Boolean { when (item.itemId) { R.id.action_settings -> findNavController().navigate( - R.id.settingsActivity, + R.id.settings_fragment, null, navOptions ) diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/folder/FoldersFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/folder/FoldersFragment.kt index d1a70aeb3..48b89c66e 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/folder/FoldersFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/folder/FoldersFragment.kt @@ -374,7 +374,7 @@ class FoldersFragment : AbsMainActivityFragment(R.layout.fragment_folder), } R.id.action_settings -> { findNavController().navigate( - R.id.settingsActivity, + R.id.settings_fragment, null, navOptions ) diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/home/HomeFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/home/HomeFragment.kt index 0992eb06a..b160361bc 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/home/HomeFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/home/HomeFragment.kt @@ -47,6 +47,7 @@ import code.name.monkey.retromusic.glide.RetroGlideExtension import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.interfaces.IScrollHelper import code.name.monkey.retromusic.model.Song +import code.name.monkey.retromusic.util.PreferenceUtil import code.name.monkey.retromusic.util.PreferenceUtil.userName import com.google.android.gms.cast.framework.CastButtonFactory import com.google.android.material.shape.MaterialShapeDrawable @@ -221,7 +222,7 @@ class HomeFragment : } private fun loadSuggestions(songs: List) { - if (songs.isEmpty()) { + if (!PreferenceUtil.homeSuggestions || songs.isEmpty()) { binding.suggestions.root.isVisible = false return } @@ -277,7 +278,7 @@ class HomeFragment : override fun onMenuItemSelected(item: MenuItem): Boolean { when (item.itemId) { R.id.action_settings -> findNavController().navigate( - R.id.settingsActivity, + R.id.settings_fragment, null, navOptions ) diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/library/LibraryFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/library/LibraryFragment.kt index 41f465fd1..e70047a3e 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/library/LibraryFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/library/LibraryFragment.kt @@ -105,7 +105,7 @@ class LibraryFragment : AbsMainActivityFragment(R.layout.fragment_library) { override fun onMenuItemSelected(item: MenuItem): Boolean { when (item.itemId) { R.id.action_settings -> findNavController().navigate( - R.id.settingsActivity, + R.id.settings_fragment, null, navOptions ) diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/other/MiniPlayerFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/other/MiniPlayerFragment.kt index d4eebd6d2..fe3180e64 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/other/MiniPlayerFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/other/MiniPlayerFragment.kt @@ -66,7 +66,10 @@ open class MiniPlayerFragment : AbsMusicServiceFragment(R.layout.fragment_mini_p _binding = FragmentMiniPlayerBinding.bind(view) view.setOnTouchListener(FlingPlayBackController(requireContext())) setUpMiniPlayer() + setUpButtons() + } + fun setUpButtons() { if (RetroUtil.isTablet) { binding.actionNext.show() binding.actionPrevious.show() diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/PlayerAlbumCoverFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/PlayerAlbumCoverFragment.kt index e99ad40cc..ace1d8873 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/PlayerAlbumCoverFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/PlayerAlbumCoverFragment.kt @@ -28,9 +28,7 @@ import androidx.preference.PreferenceManager import androidx.viewpager.widget.ViewPager import code.name.monkey.appthemehelper.util.ColorUtil import code.name.monkey.appthemehelper.util.MaterialValueHelper -import code.name.monkey.retromusic.LYRICS_TYPE -import code.name.monkey.retromusic.R -import code.name.monkey.retromusic.SHOW_LYRICS +import code.name.monkey.retromusic.* import code.name.monkey.retromusic.adapter.album.AlbumCoverPagerAdapter import code.name.monkey.retromusic.adapter.album.AlbumCoverPagerAdapter.AlbumCoverFragment import code.name.monkey.retromusic.databinding.FragmentPlayerAlbumCoverBinding @@ -115,6 +113,22 @@ class PlayerAlbumCoverFragment : AbsMusicServiceFragment(R.layout.fragment_playe override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) _binding = FragmentPlayerAlbumCoverBinding.bind(view) + setupViewPager() + progressViewUpdateHelper = MusicProgressViewUpdateHelper(this, 500, 1000) + maybeInitLyrics() + lrcView.apply { + setDraggable(true) { time -> + MusicPlayerRemote.seekTo(time.toInt()) + MusicPlayerRemote.resumePlaying() + true + } + setOnClickListener { + goToLyrics(requireActivity()) + } + } + } + + private fun setupViewPager() { binding.viewPager.addOnPageChangeListener(this) val nps = PreferenceUtil.nowPlayingScreen @@ -140,18 +154,6 @@ class PlayerAlbumCoverFragment : AbsMusicServiceFragment(R.layout.fragment_playe PreferenceUtil.albumCoverTransform ) } - progressViewUpdateHelper = MusicProgressViewUpdateHelper(this, 500, 1000) - maybeInitLyrics() - lrcView.apply { - setDraggable(true) { time -> - MusicPlayerRemote.seekTo(time.toInt()) - MusicPlayerRemote.resumePlaying() - true - } - setOnClickListener { - goToLyrics(requireActivity()) - } - } } override fun onResume() { @@ -185,15 +187,18 @@ class PlayerAlbumCoverFragment : AbsMusicServiceFragment(R.layout.fragment_playe } override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String?) { - if (key == SHOW_LYRICS) { - if (sharedPreferences.getBoolean(key, false)) { - maybeInitLyrics() - } else { - showLyrics(false) - progressViewUpdateHelper?.stop() + when (key) { + SHOW_LYRICS -> { + if (PreferenceUtil.showLyrics) { + maybeInitLyrics() + } else { + showLyrics(false) + progressViewUpdateHelper?.stop() + } + } + LYRICS_TYPE -> { + maybeInitLyrics() } - } else if (key == LYRICS_TYPE) { - maybeInitLyrics() } } diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/gradient/GradientPlayerFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/gradient/GradientPlayerFragment.kt index 541010167..15a3ccc66 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/gradient/GradientPlayerFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/gradient/GradientPlayerFragment.kt @@ -161,7 +161,7 @@ class GradientPlayerFragment : AbsPlayerFragment(R.layout.fragment_gradient_play ViewCompat.setOnApplyWindowInsetsListener( (binding.container) ) { v: View, insets: WindowInsetsCompat -> - navBarHeight = insets.safeGetBottomInsets() + navBarHeight = insets.getBottomInsets() v.updatePadding(bottom = navBarHeight) insets } diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/queue/PlayingQueueFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/queue/PlayingQueueFragment.kt index fba9d5c4a..4a29ca229 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/queue/PlayingQueueFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/queue/PlayingQueueFragment.kt @@ -50,6 +50,9 @@ class PlayingQueueFragment : AbsMusicServiceFragment(R.layout.fragment_playing_q private var playingQueueAdapter: PlayingQueueAdapter? = null private lateinit var linearLayoutManager: LinearLayoutManager + val mainActivity: MainActivity + get() = activity as MainActivity + private fun getUpNextAndQueueTime(): String { val duration = MusicPlayerRemote.getQueueDurationMillis(MusicPlayerRemote.position) return MusicUtil.buildInfoString( @@ -69,6 +72,7 @@ class PlayingQueueFragment : AbsMusicServiceFragment(R.layout.fragment_playing_q MusicPlayerRemote.clearQueue() } checkForPadding() + mainActivity.collapsePanel() } private fun setUpRecyclerView() { @@ -175,7 +179,7 @@ class PlayingQueueFragment : AbsMusicServiceFragment(R.layout.fragment_playing_q playingQueueAdapter = null super.onDestroy() if (MusicPlayerRemote.playingQueue.isNotEmpty()) - (requireActivity() as MainActivity).expandPanel() + mainActivity.expandPanel() } private fun setupToolbar() { diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/AbsSettingsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/AbsSettingsFragment.kt index 0b8632826..2441d1e9b 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/AbsSettingsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/AbsSettingsFragment.kt @@ -25,7 +25,6 @@ import androidx.preference.PreferenceManager import code.name.monkey.appthemehelper.common.prefs.supportv7.ATEPreferenceFragmentCompat import code.name.monkey.appthemehelper.util.VersionUtils import code.name.monkey.retromusic.R -import code.name.monkey.retromusic.activities.OnThemeChangedListener import code.name.monkey.retromusic.extensions.showToast import code.name.monkey.retromusic.preferences.* import code.name.monkey.retromusic.util.NavigationUtil diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/PersonalizeSettingsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/PersonalizeSettingsFragment.kt index 3ebd069cd..3de0fafc3 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/PersonalizeSettingsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/PersonalizeSettingsFragment.kt @@ -22,18 +22,12 @@ import code.name.monkey.retromusic.* class PersonalizeSettingsFragment : AbsSettingsFragment() { - override fun invalidateSettings() { - val toggleFullScreen: TwoStatePreference? = findPreference(TOGGLE_FULL_SCREEN) - toggleFullScreen?.setOnPreferenceChangeListener { _, _ -> - restartActivity() - true - } - } - override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { addPreferencesFromResource(R.xml.pref_ui) } + override fun invalidateSettings() {} + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) val homeArtistStyle: ATEListPreference? = findPreference(HOME_ARTIST_GRID_STYLE) diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/SettingsActivity.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/SettingsFragment.kt similarity index 60% rename from app/src/main/java/code/name/monkey/retromusic/activities/SettingsActivity.kt rename to app/src/main/java/code/name/monkey/retromusic/fragments/settings/SettingsFragment.kt index fd273b40c..1f728fe9b 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/SettingsActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/SettingsFragment.kt @@ -12,42 +12,44 @@ * See the GNU General Public License for more details. * */ -package code.name.monkey.retromusic.activities +package code.name.monkey.retromusic.fragments.settings -import android.Manifest.permission.BLUETOOTH_CONNECT -import android.content.Intent import android.os.Bundle -import android.view.MenuItem +import android.view.View +import androidx.core.view.updatePadding import androidx.navigation.NavController import androidx.navigation.NavDestination import code.name.monkey.appthemehelper.ThemeStore import code.name.monkey.appthemehelper.util.VersionUtils import code.name.monkey.retromusic.R -import code.name.monkey.retromusic.activities.base.AbsBaseActivity import code.name.monkey.retromusic.appshortcuts.DynamicShortcutManager -import code.name.monkey.retromusic.databinding.ActivitySettingsBinding +import code.name.monkey.retromusic.databinding.FragmentSettingsBinding import code.name.monkey.retromusic.extensions.* +import code.name.monkey.retromusic.fragments.base.AbsMusicServiceFragment +import code.name.monkey.retromusic.helper.MusicPlayerRemote import com.afollestad.materialdialogs.MaterialDialog import com.afollestad.materialdialogs.color.ColorCallback -class SettingsActivity : AbsBaseActivity(), ColorCallback, OnThemeChangedListener { - private lateinit var binding: ActivitySettingsBinding +class SettingsFragment : AbsMusicServiceFragment(R.layout.fragment_settings), ColorCallback { + private var _binding: FragmentSettingsBinding? = null + private val binding get() = _binding!! + override fun onCreate(savedInstanceState: Bundle?) { val mSavedInstanceState = extra(TAG).value ?: savedInstanceState super.onCreate(mSavedInstanceState) - binding = ActivitySettingsBinding.inflate(layoutInflater) - setContentView(binding.root) - setupToolbar() - setPermissionDeniedMessage(getString(R.string.permission_bluetooth_denied)) } - override fun onResume() { - super.onResume() - setNavigationBarColorPreOreo(surfaceColor()) + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + _binding = FragmentSettingsBinding.bind(view) + setupToolbar() + updateBottomPadding() } private fun setupToolbar() { applyToolbar(binding.toolbar) + binding.toolbar.setNavigationOnClickListener { + requireActivity().onBackPressed() + } val navController: NavController = findNavController(R.id.contentFrame) navController.addOnDestinationChangedListener { _, _, _ -> binding.collapsingToolbarLayout.title = @@ -72,48 +74,32 @@ class SettingsActivity : AbsBaseActivity(), ColorCallback, OnThemeChangedListene return getString(idRes) } - override fun onSupportNavigateUp(): Boolean { - return findNavController(R.id.contentFrame).navigateUp() || super.onSupportNavigateUp() - } - - override fun onOptionsItemSelected(item: MenuItem): Boolean { - if (item.itemId == android.R.id.home) { - onBackPressed() - } - return super.onOptionsItemSelected(item) - } - - override fun getPermissionsToRequest(): Array { - return if (VersionUtils.hasS()) { - arrayOf(BLUETOOTH_CONNECT) - } else { - arrayOf() - } - } - override fun invoke(dialog: MaterialDialog, color: Int) { - ThemeStore.editTheme(this).accentColor(color).commit() + ThemeStore.editTheme(requireContext()).accentColor(color).commit() if (VersionUtils.hasNougatMR()) - DynamicShortcutManager(this).updateDynamicShortcuts() - restart() + DynamicShortcutManager(requireContext()).updateDynamicShortcuts() + restartActivity() } - override fun onThemeValuesChanged() { - restart() - } - - private fun restart() { - val savedInstanceState = Bundle().apply { - onSaveInstanceState(this) + fun restartActivity() { + if (activity is OnThemeChangedListener && !VersionUtils.hasS()) { + (activity as OnThemeChangedListener).onThemeValuesChanged() + } else { + activity?.recreate() } - finish() - val intent = Intent(this, this::class.java).putExtra(TAG, savedInstanceState) - startActivity(intent) - overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out) + } + + override fun onQueueChanged() { + updateBottomPadding() + } + + private fun updateBottomPadding() { + binding.root.updatePadding( + bottom = if (MusicPlayerRemote.playingQueue.isEmpty()) 0 else dip(R.dimen.mini_player_height)) } companion object { - val TAG: String = SettingsActivity::class.java.simpleName + val TAG: String = SettingsFragment::class.java.simpleName } } diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/ThemeSettingsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/ThemeSettingsFragment.kt index 6d339be7c..f0be5ae6b 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/ThemeSettingsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/ThemeSettingsFragment.kt @@ -29,6 +29,9 @@ import code.name.monkey.appthemehelper.util.VersionUtils import code.name.monkey.retromusic.* import code.name.monkey.retromusic.appshortcuts.DynamicShortcutManager import code.name.monkey.retromusic.extensions.materialDialog +import code.name.monkey.retromusic.fragments.NowPlayingScreen.Normal +import code.name.monkey.retromusic.fragments.NowPlayingScreen.Material +import code.name.monkey.retromusic.fragments.NowPlayingScreen.Flat import code.name.monkey.retromusic.util.PreferenceUtil import com.afollestad.materialdialogs.color.colorChooser import com.google.android.material.color.DynamicColors @@ -130,6 +133,10 @@ class ThemeSettingsFragment : AbsSettingsFragment() { restartActivity() true } + + val adaptiveColor: ATESwitchPreference? = findPreference(ADAPTIVE_COLOR_APP) + adaptiveColor?.isEnabled = + PreferenceUtil.nowPlayingScreen in listOf(Normal, Material, Flat) } override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { diff --git a/app/src/main/java/code/name/monkey/retromusic/repository/Repository.kt b/app/src/main/java/code/name/monkey/retromusic/repository/Repository.kt index fdbcb48e9..a49f5ccef 100644 --- a/app/src/main/java/code/name/monkey/retromusic/repository/Repository.kt +++ b/app/src/main/java/code/name/monkey/retromusic/repository/Repository.kt @@ -377,7 +377,6 @@ class RealRepository( } override suspend fun suggestions(): List { - if (!PreferenceUtil.homeSuggestions) return listOf() return NotPlayedPlaylist().songs().shuffled().takeIf { it.size > 9 } ?: emptyList() diff --git a/app/src/main/java/code/name/monkey/retromusic/views/HomeImageLayout.kt b/app/src/main/java/code/name/monkey/retromusic/views/HomeImageLayout.kt index 1a84dc8e5..015bf3951 100644 --- a/app/src/main/java/code/name/monkey/retromusic/views/HomeImageLayout.kt +++ b/app/src/main/java/code/name/monkey/retromusic/views/HomeImageLayout.kt @@ -20,7 +20,7 @@ class HomeImageLayout @JvmOverloads constructor( private var bannerImageBinding: BannerImageLayoutBinding? = null init { - if (PreferenceUtil.isHomeBanner) { + if (isInEditMode || PreferenceUtil.isHomeBanner) { bannerImageBinding = BannerImageLayoutBinding.inflate(LayoutInflater.from(context), this, true) } else { userImageBinding = UserImageLayoutBinding.inflate(LayoutInflater.from(context), this, true) diff --git a/app/src/main/res/layout/fragment_folder.xml b/app/src/main/res/layout/fragment_folder.xml index 6521a4a0a..2fae59bce 100644 --- a/app/src/main/res/layout/fragment_folder.xml +++ b/app/src/main/res/layout/fragment_folder.xml @@ -7,7 +7,16 @@ android:fitsSystemWindows="true" android:transitionGroup="true"> - + + - + - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/fragment_settings.xml similarity index 100% rename from app/src/main/res/layout/activity_settings.xml rename to app/src/main/res/layout/fragment_settings.xml diff --git a/app/src/main/res/navigation/main_graph.xml b/app/src/main/res/navigation/main_graph.xml index 63ecf9dc7..b6c840c52 100644 --- a/app/src/main/res/navigation/main_graph.xml +++ b/app/src/main/res/navigation/main_graph.xml @@ -75,10 +75,9 @@ android:label="SearchFragment" tools:layout="@layout/fragment_search" /> - + 20dp - 48dp 112dp @@ -13,10 +12,8 @@ 8dp 56dp - 64dp 128dp - 136dp 72dp diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 9452f0649..6e466ba72 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -247,5 +247,11 @@ + + From f6a44672be762eba7d1b0e95e3f73ac0c84c6cc3 Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Fri, 20 May 2022 15:50:19 +0530 Subject: [PATCH 038/280] Removed GenericFileProvider --- app/src/main/AndroidManifest.xml | 10 ---------- .../retromusic/misc/GenericFileProvider.java | 19 ------------------- 2 files changed, 29 deletions(-) delete mode 100644 app/src/main/java/code/name/monkey/retromusic/misc/GenericFileProvider.java diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3c45688e8..66b48f9c4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -183,16 +183,6 @@ - - - - Date: Fri, 20 May 2022 15:53:08 +0530 Subject: [PATCH 039/280] [Share] Cleanup Sharing of bug report and backup --- .../retromusic/activities/ErrorActivity.kt | 2 +- .../fragments/backup/BackupFragment.kt | 9 ++---- .../name/monkey/retromusic/util/BackupUtil.kt | 28 ------------------- .../name/monkey/retromusic/util/MusicUtil.kt | 18 ++++++------ .../code/name/monkey/retromusic/util/Share.kt | 20 ++++++------- 5 files changed, 21 insertions(+), 56 deletions(-) delete mode 100644 app/src/main/java/code/name/monkey/retromusic/util/BackupUtil.kt diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/ErrorActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/ErrorActivity.kt index 1673cb84d..99bff34cb 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/ErrorActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/ErrorActivity.kt @@ -64,7 +64,7 @@ class ErrorActivity : AppCompatActivity() { intent ), ".txt" ) - shareFile(this, bugReport) + shareFile(this, bugReport, "text/*") } .show() } diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/backup/BackupFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/backup/BackupFragment.kt index f5dc5b069..304a02ec7 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/backup/BackupFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/backup/BackupFragment.kt @@ -22,7 +22,7 @@ import code.name.monkey.retromusic.extensions.materialDialog import code.name.monkey.retromusic.extensions.showToast import code.name.monkey.retromusic.helper.BackupHelper import code.name.monkey.retromusic.helper.sanitize -import code.name.monkey.retromusic.util.BackupUtil +import code.name.monkey.retromusic.util.Share import com.afollestad.materialdialogs.input.input import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -128,12 +128,7 @@ class BackupFragment : Fragment(R.layout.fragment_backup), BackupAdapter.BackupC return true } R.id.action_share -> { - activity?.startActivity( - Intent.createChooser( - BackupUtil.createShareFileIntent(file, requireContext()), - null - ) - ) + Share.shareFile(requireContext(), file, "*/*") return true } R.id.action_rename -> { diff --git a/app/src/main/java/code/name/monkey/retromusic/util/BackupUtil.kt b/app/src/main/java/code/name/monkey/retromusic/util/BackupUtil.kt deleted file mode 100644 index e7a6f430a..000000000 --- a/app/src/main/java/code/name/monkey/retromusic/util/BackupUtil.kt +++ /dev/null @@ -1,28 +0,0 @@ -package code.name.monkey.retromusic.util - -import android.content.Context -import android.content.Intent -import androidx.core.content.FileProvider -import code.name.monkey.retromusic.extensions.showToast -import java.io.File - -object BackupUtil { - fun createShareFileIntent(file: File, context: Context): Intent? { - return try { - Intent().setAction(Intent.ACTION_SEND).putExtra( - Intent.EXTRA_STREAM, - FileProvider.getUriForFile( - context, - context.applicationContext.packageName, - file - ) - ).addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION).setType("*/*") - } catch (e: IllegalArgumentException) { - e.printStackTrace() - context.showToast( - "Could not share this file." - ) - Intent() - } - } -} \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/util/MusicUtil.kt b/app/src/main/java/code/name/monkey/retromusic/util/MusicUtil.kt index feeb5c37b..4fa2d4f60 100644 --- a/app/src/main/java/code/name/monkey/retromusic/util/MusicUtil.kt +++ b/app/src/main/java/code/name/monkey/retromusic/util/MusicUtil.kt @@ -26,7 +26,6 @@ import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.model.lyrics.AbsSynchronizedLyrics import code.name.monkey.retromusic.repository.Repository import code.name.monkey.retromusic.repository.SongRepository -import code.name.monkey.retromusic.service.MusicService import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.withContext @@ -42,21 +41,20 @@ import java.util.regex.Pattern object MusicUtil : KoinComponent { - fun createShareSongFileIntent(song: Song, context: Context): Intent? { - return try { - Intent().setAction(Intent.ACTION_SEND).putExtra( - Intent.EXTRA_STREAM, + fun createShareSongFileIntent(song: Song, context: Context): Intent { + return Intent().apply { + action = Intent.ACTION_SEND + putExtra(Intent.EXTRA_STREAM, try { FileProvider.getUriForFile( context, context.applicationContext.packageName, File(song.data) ) - ).addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION).setType("audio/*") - } catch (e: IllegalArgumentException) { - Intent().setAction(Intent.ACTION_SEND).putExtra( - Intent.EXTRA_STREAM, + } catch (e: IllegalArgumentException) { getSongFileUri(song.id) - ).addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION).setType("audio/*") + }) + addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) + type = "audio/*" } } diff --git a/app/src/main/java/code/name/monkey/retromusic/util/Share.kt b/app/src/main/java/code/name/monkey/retromusic/util/Share.kt index b33559cea..5994419bf 100644 --- a/app/src/main/java/code/name/monkey/retromusic/util/Share.kt +++ b/app/src/main/java/code/name/monkey/retromusic/util/Share.kt @@ -32,15 +32,15 @@ object Share { context.startActivity(feedIntent, null) } - fun shareFile(context: Context, file: File) { - val attachmentUri = FileProvider.getUriForFile( - context, - context.applicationContext.packageName, - file - ) - val sharingIntent = Intent(Intent.ACTION_SEND) - sharingIntent.type = "text/*" - sharingIntent.putExtra(Intent.EXTRA_STREAM, attachmentUri) - context.startActivity(Intent.createChooser(sharingIntent, "send bug report")) + fun shareFile(context: Context, file: File, mimeType: String) { + Intent(Intent.ACTION_SEND).apply { + type = mimeType + putExtra(Intent.EXTRA_STREAM, FileProvider.getUriForFile( + context, + context.applicationContext.packageName, + file + )) + context.startActivity(Intent.createChooser(this, null)) + } } } \ No newline at end of file From 4f1895bc507c00ab56c9c0cef304426da392d7fc Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Fri, 20 May 2022 16:25:28 +0530 Subject: [PATCH 040/280] Cleanup layouts --- .../fragment_main_activity_recycler_view.xml | 48 ------ .../main/res/layout/fragment_mini_player.xml | 159 +++++++++--------- app/src/main/res/navigation/library_graph.xml | 10 +- app/src/main/res/navigation/main_graph.xml | 10 +- 4 files changed, 86 insertions(+), 141 deletions(-) delete mode 100644 app/src/main/res/layout/fragment_main_activity_recycler_view.xml diff --git a/app/src/main/res/layout/fragment_main_activity_recycler_view.xml b/app/src/main/res/layout/fragment_main_activity_recycler_view.xml deleted file mode 100644 index 54bcdccb5..000000000 --- a/app/src/main/res/layout/fragment_main_activity_recycler_view.xml +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - diff --git a/app/src/main/res/layout/fragment_mini_player.xml b/app/src/main/res/layout/fragment_mini_player.xml index a52709afd..9962b68e0 100644 --- a/app/src/main/res/layout/fragment_mini_player.xml +++ b/app/src/main/res/layout/fragment_mini_player.xml @@ -1,105 +1,98 @@ - + android:orientation="horizontal" + android:paddingStart="8dp" + android:paddingEnd="0dp"> - - - - - - - - + + android:gravity="center_vertical" + android:scaleType="centerCrop" + tools:srcCompat="@tools:sample/backgrounds/scenic" + tools:visibility="visible" /> + - + + + + + + - - - - - + android:layout_gravity="center" + app:trackCornerRadius="16dp" + tools:progress="10" /> - + android:scaleType="center" + app:srcCompat="@drawable/ic_pause" + app:tint="?attr/colorControlNormal" + tools:ignore="ContentDescription" /> + - \ No newline at end of file + + \ No newline at end of file diff --git a/app/src/main/res/navigation/library_graph.xml b/app/src/main/res/navigation/library_graph.xml index b592676a5..f58195129 100644 --- a/app/src/main/res/navigation/library_graph.xml +++ b/app/src/main/res/navigation/library_graph.xml @@ -7,27 +7,27 @@ + tools:layout="@layout/fragment_main_recycler" /> + tools:layout="@layout/fragment_main_recycler" /> + tools:layout="@layout/fragment_main_recycler" /> + tools:layout="@layout/fragment_main_recycler" /> + tools:layout="@layout/fragment_main_recycler" /> + tools:layout="@layout/fragment_main_recycler" /> + tools:layout="@layout/fragment_main_recycler" /> + tools:layout="@layout/fragment_main_recycler" /> + tools:layout="@layout/fragment_main_recycler" /> + tools:layout="@layout/fragment_main_recycler" /> Date: Fri, 20 May 2022 16:43:09 +0530 Subject: [PATCH 041/280] Enabled abortOnError to better identify bugs which can lead to crashes --- app/build.gradle | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 761e03a56..1e6fccc93 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -51,8 +51,7 @@ android { } } lint { - abortOnError false - disable 'MissingTranslation', 'InvalidPackage' + disable 'MissingTranslation', 'ImpliedQuantity' } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 From 01f7a4874da10ce4170c35dea91f86c2bbc8844a Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Fri, 20 May 2022 16:43:42 +0530 Subject: [PATCH 042/280] Fix string formatting issues which lead to crashes --- app/src/main/res/values-fa-rIR/strings.xml | 2 +- app/src/main/res/values-fr-rFR/strings.xml | 4 ++-- app/src/main/res/values-te-rIN/strings.xml | 2 +- app/src/main/res/values-th-rTH/strings.xml | 2 +- app/src/main/res/values/strings.xml | 1 + 5 files changed, 6 insertions(+), 5 deletions(-) diff --git a/app/src/main/res/values-fa-rIR/strings.xml b/app/src/main/res/values-fa-rIR/strings.xml index e614462f3..8c405de3e 100644 --- a/app/src/main/res/values-fa-rIR/strings.xml +++ b/app/src/main/res/values-fa-rIR/strings.xml @@ -56,7 +56,7 @@ اضافه کردن متون دارای زمان Added %1$d song(s) to %2$s "یک‌ مورد به لیست پخش اهنگ ها اضافه شد." - مورد خاص به لیست پخش اهنگ اضافه شد. + %1$d آهنگ به لیست پخش اضافه شد. آلبوم آهنگ ها diff --git a/app/src/main/res/values-fr-rFR/strings.xml b/app/src/main/res/values-fr-rFR/strings.xml index 0eea7a30c..5f1e3d362 100644 --- a/app/src/main/res/values-fr-rFR/strings.xml +++ b/app/src/main/res/values-fr-rFR/strings.xml @@ -60,13 +60,13 @@ Album Morceau - Morceaux + Morceaux Artiste de l\'album Albums Album - Albums + Albums Toujours Hey, jetez un coup d\'œil à ce super lecteur de musique : https://play.google.com/store/apps/details?id=%s diff --git a/app/src/main/res/values-te-rIN/strings.xml b/app/src/main/res/values-te-rIN/strings.xml index 267e00c22..129bf9039 100644 --- a/app/src/main/res/values-te-rIN/strings.xml +++ b/app/src/main/res/values-te-rIN/strings.xml @@ -114,7 +114,7 @@ సృష్టించు ప్లేజాబితా%1$sసృష్టించబడింది. సభ్యులు మరియు సహాయకులు - ప్రస్తుతం %2$s ద్వారా %1$d వింటున్నారు. + ప్రస్తుతం %2$s ద్వారా %1$s వింటున్నారు. కైండా డార్క్ ప్లేజాబితాను తొలగించండి %1$s ప్లేజాబితాను తొలగించాలా?]]> diff --git a/app/src/main/res/values-th-rTH/strings.xml b/app/src/main/res/values-th-rTH/strings.xml index ee386ec56..d44b29dd6 100644 --- a/app/src/main/res/values-th-rTH/strings.xml +++ b/app/src/main/res/values-th-rTH/strings.xml @@ -411,7 +411,7 @@ ลบเพลงออกจากเพลย์ลิสต์ %1$s ออกจากเพลย์ลิสต์?]]> ลบเพลงออกจากเพลย์ลิสต์ - %1$s ออกจากเพลย์ลิสต์?]]> + %1$d ออกจากเพลย์ลิสต์?]]> เปลี่ยนขื่อเพลย์ลิสต์ Replace Cover รายการปัญหา diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 109040f4e..95b81e240 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -178,6 +178,7 @@ Couldn\u2019t delete backup Your name can\'t be empty! Load failed + Couldn\'t share file Expanded FAQ Favorites From 51f298be8fefc51a0b8d81eb84b5c02a284d7d91 Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Fri, 20 May 2022 16:44:56 +0530 Subject: [PATCH 043/280] Fix crashes due to SharedPreferences listener --- .../monkey/retromusic/LanguageContextWrapper.kt | 6 ++---- .../base/AbsSlidingMusicPanelActivity.kt | 15 ++++----------- .../fragments/base/AbsPlayerFragment.kt | 10 +++++++++- 3 files changed, 15 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/code/name/monkey/retromusic/LanguageContextWrapper.kt b/app/src/main/java/code/name/monkey/retromusic/LanguageContextWrapper.kt index a14c8fdd5..d6bb6f1c4 100644 --- a/app/src/main/java/code/name/monkey/retromusic/LanguageContextWrapper.kt +++ b/app/src/main/java/code/name/monkey/retromusic/LanguageContextWrapper.kt @@ -3,17 +3,15 @@ package code.name.monkey.retromusic import android.content.Context import android.content.ContextWrapper import android.os.LocaleList -import code.name.monkey.appthemehelper.util.VersionUtils.hasNougatMR -import com.google.android.gms.common.annotation.KeepName +import code.name.monkey.appthemehelper.util.VersionUtils.hasNougat import java.util.* class LanguageContextWrapper(base: Context?) : ContextWrapper(base) { companion object { - @KeepName fun wrap(context: Context?, newLocale: Locale?): LanguageContextWrapper { if (context == null) return LanguageContextWrapper(context) val configuration = context.resources.configuration - if (hasNougatMR()) { + if (hasNougat()) { configuration.setLocale(newLocale) val localeList = LocaleList(newLocale) LocaleList.setDefault(localeList) 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 9bff94d81..1207dadf9 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 @@ -206,7 +206,7 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity(), onServiceConnected() } SWIPE_ANYWHERE_NOW_PLAYING -> { - playerFragment.onResume() + playerFragment.addSwipeDetector() } ADAPTIVE_COLOR_APP -> { if (PreferenceUtil.nowPlayingScreen in listOf(Normal, Material, Flat)) { @@ -310,15 +310,7 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity(), override fun onServiceConnected() { super.onServiceConnected() - if (MusicPlayerRemote.playingQueue.isNotEmpty()) { - binding.slidingPanel.viewTreeObserver.addOnGlobalLayoutListener(object : - ViewTreeObserver.OnGlobalLayoutListener { - override fun onGlobalLayout() { - binding.slidingPanel.viewTreeObserver.removeOnGlobalLayoutListener(this) - hideBottomSheet(false) - } - }) - } // don't call hideBottomSheet(true) here as it causes a bug with the SlidingUpPanelLayout + hideBottomSheet(false) } override fun onQueueChanged() { @@ -514,7 +506,8 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity(), supportFragmentManager.commit { replace(R.id.playerFragmentContainer, fragment) } - playerFragment = fragment + supportFragmentManager.executePendingTransactions() + playerFragment = whichFragment(R.id.playerFragmentContainer) miniPlayerFragment = whichFragment(R.id.miniPlayerFragment) miniPlayerFragment?.view?.setOnClickListener { expandPanel() } } diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsPlayerFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsPlayerFragment.kt index 20e1ccceb..4cae40e66 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsPlayerFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsPlayerFragment.kt @@ -327,7 +327,15 @@ abstract class AbsPlayerFragment(@LayoutRes layout: Int) : AbsMusicServiceFragme showLyricsIcon(this) } } - requireView().setOnTouchListener( + } + + override fun onStart() { + super.onStart() + addSwipeDetector() + } + + fun addSwipeDetector() { + view?.setOnTouchListener( if (PreferenceUtil.swipeAnywhereToChangeSong) { SwipeDetector( requireContext(), From 1b544d62c3534ae22ff925557cb5f19feadf04bb Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Fri, 20 May 2022 16:46:00 +0530 Subject: [PATCH 044/280] Code Cleanup --- .../retromusic/extensions/ViewExtensions.kt | 12 ++++--- .../full/FullPlaybackControlsFragment.kt | 7 ++-- .../retromusic/helper/MusicPlayerRemote.kt | 3 -- .../monkey/retromusic/lyrics/CoverLrcView.kt | 7 ++-- .../monkey/retromusic/lyrics/LrcUtils.java | 10 ------ .../monkey/retromusic/lyrics/LrcView.java | 1 - .../monkey/retromusic/service/AudioFader.kt | 8 ++--- .../name/monkey/retromusic/util/AppRater.kt | 34 +++++++++---------- .../name/monkey/retromusic/util/FileUtil.java | 5 +-- .../name/monkey/retromusic/util/SAFUtil.java | 8 ----- .../util/color/NotificationColorUtil.java | 3 +- .../appthemehelper/util/VersionUtils.kt | 10 ++++++ 12 files changed, 49 insertions(+), 59 deletions(-) diff --git a/app/src/main/java/code/name/monkey/retromusic/extensions/ViewExtensions.kt b/app/src/main/java/code/name/monkey/retromusic/extensions/ViewExtensions.kt index fba21e4ce..9f53714fd 100644 --- a/app/src/main/java/code/name/monkey/retromusic/extensions/ViewExtensions.kt +++ b/app/src/main/java/code/name/monkey/retromusic/extensions/ViewExtensions.kt @@ -40,6 +40,8 @@ import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.card.MaterialCardView import dev.chrisbanes.insetter.applyInsetter +const val ANIM_DURATION = 300L + @Suppress("UNCHECKED_CAST") fun ViewGroup.inflate(@LayoutRes layout: Int): T { return LayoutInflater.from(context).inflate(layout, this, false) as T @@ -90,10 +92,10 @@ fun BottomNavigationView.show() { drawable.setBounds(left, parent.height, right, parent.height + height) parent.overlay.add(drawable) ValueAnimator.ofInt(parent.height, top).apply { - duration = 300 + duration = ANIM_DURATION interpolator = AnimationUtils.loadInterpolator( context, - android.R.interpolator.linear_out_slow_in + android.R.interpolator.accelerate_decelerate ) addUpdateListener { val newTop = it.animatedValue as Int @@ -130,10 +132,10 @@ fun BottomNavigationView.hide() { parent.overlay.add(drawable) isGone = true ValueAnimator.ofInt(top, parent.height).apply { - duration = 300L + duration = ANIM_DURATION interpolator = AnimationUtils.loadInterpolator( context, - android.R.interpolator.fast_out_linear_in + android.R.interpolator.accelerate_decelerate ) addUpdateListener { val newTop = it.animatedValue as Int @@ -164,7 +166,7 @@ fun View.translateYAnimate(value: Float): Animator { fun BottomSheetBehavior<*>.peekHeightAnimate(value: Int): Animator { return ObjectAnimator.ofInt(this, "peekHeight", value) .apply { - duration = 300 + duration = ANIM_DURATION start() } } diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/full/FullPlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/full/FullPlaybackControlsFragment.kt index 08831b0c6..a06c753ca 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/full/FullPlaybackControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/full/FullPlaybackControlsFragment.kt @@ -177,10 +177,9 @@ class FullPlaybackControlsFragment : private fun setUpPlayPauseFab() { binding.playPauseButton.setOnClickListener(PlayPauseButtonOnClickHandler()) - binding.playPauseButton.post { - binding.playPauseButton.pivotX = (binding.playPauseButton.width / 2).toFloat() - binding.playPauseButton.pivotY = (binding.playPauseButton.height / 2).toFloat() - } + + binding.playPauseButton.pivotX = (binding.playPauseButton.width / 2).toFloat() + binding.playPauseButton.pivotY = (binding.playPauseButton.height / 2).toFloat() } private fun setUpMusicControllers() { diff --git a/app/src/main/java/code/name/monkey/retromusic/helper/MusicPlayerRemote.kt b/app/src/main/java/code/name/monkey/retromusic/helper/MusicPlayerRemote.kt index 81ab6a947..f85e1e89d 100644 --- a/app/src/main/java/code/name/monkey/retromusic/helper/MusicPlayerRemote.kt +++ b/app/src/main/java/code/name/monkey/retromusic/helper/MusicPlayerRemote.kt @@ -65,9 +65,6 @@ object MusicPlayerRemote : KoinComponent { musicService?.nextSong } else Song.emptySong - /** - * Async - */ var position: Int get() = if (musicService != null) { musicService!!.position diff --git a/app/src/main/java/code/name/monkey/retromusic/lyrics/CoverLrcView.kt b/app/src/main/java/code/name/monkey/retromusic/lyrics/CoverLrcView.kt index a10808726..c74c5bbdc 100644 --- a/app/src/main/java/code/name/monkey/retromusic/lyrics/CoverLrcView.kt +++ b/app/src/main/java/code/name/monkey/retromusic/lyrics/CoverLrcView.kt @@ -46,7 +46,7 @@ import kotlin.math.abs class CoverLrcView @JvmOverloads constructor( context: Context?, attrs: AttributeSet? = null, - defStyleAttr: Int = 0 + defStyleAttr: Int = 0, ) : View(context, attrs, defStyleAttr) { private val mLrcEntryList: MutableList = ArrayList() private val mLrcPaint = TextPaint() @@ -109,7 +109,7 @@ class CoverLrcView @JvmOverloads constructor( e1: MotionEvent, e2: MotionEvent, distanceX: Float, - distanceY: Float + distanceY: Float, ): Boolean { if (mOffset == getOffset(0) && distanceY < 0F) { return super.onScroll(e1, e2, distanceX, distanceY) @@ -129,7 +129,7 @@ class CoverLrcView @JvmOverloads constructor( e1: MotionEvent, e2: MotionEvent, velocityX: Float, - velocityY: Float + velocityY: Float, ): Boolean { if (hasLrc()) { mScroller!!.fling( @@ -598,7 +598,6 @@ class CoverLrcView @JvmOverloads constructor( mOffset = animation.animatedValue as Float invalidate() } - LrcUtils.resetDurationScale() start() } } diff --git a/app/src/main/java/code/name/monkey/retromusic/lyrics/LrcUtils.java b/app/src/main/java/code/name/monkey/retromusic/lyrics/LrcUtils.java index b81fc782a..5152bc4f8 100644 --- a/app/src/main/java/code/name/monkey/retromusic/lyrics/LrcUtils.java +++ b/app/src/main/java/code/name/monkey/retromusic/lyrics/LrcUtils.java @@ -208,14 +208,4 @@ class LrcUtils { String ss = String.format(Locale.getDefault(), "%02d", s); return mm + ":" + ss; } - - static void resetDurationScale() { - try { - Field mField = ValueAnimator.class.getDeclaredField("sDurationScale"); - mField.setAccessible(true); - mField.setFloat(null, 1); - } catch (Exception e) { - e.printStackTrace(); - } - } } diff --git a/app/src/main/java/code/name/monkey/retromusic/lyrics/LrcView.java b/app/src/main/java/code/name/monkey/retromusic/lyrics/LrcView.java index 60f904bdb..ca450b621 100644 --- a/app/src/main/java/code/name/monkey/retromusic/lyrics/LrcView.java +++ b/app/src/main/java/code/name/monkey/retromusic/lyrics/LrcView.java @@ -684,7 +684,6 @@ public class LrcView extends View { mOffset = (float) animation.getAnimatedValue(); invalidate(); }); - LrcUtils.resetDurationScale(); mAnimator.start(); } diff --git a/app/src/main/java/code/name/monkey/retromusic/service/AudioFader.kt b/app/src/main/java/code/name/monkey/retromusic/service/AudioFader.kt index 8979327c4..f2e351357 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/AudioFader.kt +++ b/app/src/main/java/code/name/monkey/retromusic/service/AudioFader.kt @@ -12,9 +12,9 @@ class AudioFader { @JvmStatic inline fun createFadeAnimator( - fadeIn: Boolean /* fadeIn -> true fadeOut -> false*/, + fadeIn: Boolean, /* fadeIn -> true fadeOut -> false*/ mediaPlayer: MediaPlayer, - crossinline endAction: (animator: Animator) -> Unit /* Code to run when Animator Ends*/ + crossinline endAction: (animator: Animator) -> Unit, /* Code to run when Animator Ends*/ ): Animator? { val duration = PreferenceUtil.crossFadeDuration * 1000 if (duration == 0) { @@ -40,8 +40,8 @@ class AudioFader { @JvmStatic fun startFadeAnimator( playback: Playback, - fadeIn: Boolean /* fadeIn -> true fadeOut -> false*/, - callback: Runnable /* Code to run when Animator Ends*/ + fadeIn: Boolean, /* fadeIn -> true fadeOut -> false*/ + callback: Runnable, /* Code to run when Animator Ends*/ ) { val duration = PreferenceUtil.audioFadeDuration.toLong() if (duration == 0L) { diff --git a/app/src/main/java/code/name/monkey/retromusic/util/AppRater.kt b/app/src/main/java/code/name/monkey/retromusic/util/AppRater.kt index 2e74530a0..d6d47270e 100644 --- a/app/src/main/java/code/name/monkey/retromusic/util/AppRater.kt +++ b/app/src/main/java/code/name/monkey/retromusic/util/AppRater.kt @@ -16,6 +16,7 @@ package code.name.monkey.retromusic.util import android.app.Activity import android.content.SharedPreferences +import androidx.core.content.edit import com.google.android.play.core.review.ReviewManagerFactory object AppRater { @@ -34,28 +35,27 @@ object AppRater { return } - val editor = prefs.edit() + prefs.edit { - // Increment launch counter - val launchCount = prefs.getLong(LAUNCH_COUNT, 0) + 1 - editor.putLong(LAUNCH_COUNT, launchCount) + // Increment launch counter + val launchCount = prefs.getLong(LAUNCH_COUNT, 0) + 1 + putLong(LAUNCH_COUNT, launchCount) - // Get date of first launch - var dateFirstLaunch = prefs.getLong(DATE_FIRST_LAUNCH, 0) - if (dateFirstLaunch == 0L) { - dateFirstLaunch = System.currentTimeMillis() - editor.putLong(DATE_FIRST_LAUNCH, dateFirstLaunch) - } + // Get date of first launch + var dateFirstLaunch = prefs.getLong(DATE_FIRST_LAUNCH, 0) + if (dateFirstLaunch == 0L) { + dateFirstLaunch = System.currentTimeMillis() + putLong(DATE_FIRST_LAUNCH, dateFirstLaunch) + } - // Wait at least n days before opening - if (launchCount >= LAUNCHES_UNTIL_PROMPT) { - if (System.currentTimeMillis() >= dateFirstLaunch + DAYS_UNTIL_PROMPT * 24 * 60 * 60 * 1000) { - //showRateDialog(context, editor) - showPlayStoreReviewDialog(context, editor) + // Wait at least n days before opening + if (launchCount >= LAUNCHES_UNTIL_PROMPT) { + if (System.currentTimeMillis() >= dateFirstLaunch + DAYS_UNTIL_PROMPT * 24 * 60 * 60 * 1000) { + //showRateDialog(context, editor) + showPlayStoreReviewDialog(context, this) + } } } - - editor.apply() } private fun showPlayStoreReviewDialog(context: Activity, editor: SharedPreferences.Editor) { diff --git a/app/src/main/java/code/name/monkey/retromusic/util/FileUtil.java b/app/src/main/java/code/name/monkey/retromusic/util/FileUtil.java index 903df0aab..6fa658bb4 100644 --- a/app/src/main/java/code/name/monkey/retromusic/util/FileUtil.java +++ b/app/src/main/java/code/name/monkey/retromusic/util/FileUtil.java @@ -39,6 +39,7 @@ import java.util.Collections; import java.util.HashSet; import java.util.LinkedList; import java.util.List; +import java.util.Locale; import java.util.StringTokenizer; import code.name.monkey.retromusic.Constants; @@ -178,7 +179,7 @@ public final class FileUtil { if (dotPos == -1) { return false; } - String fileExtension = filename.substring(dotPos + 1).toLowerCase(); + String fileExtension = filename.substring(dotPos + 1).toLowerCase(Locale.ROOT); String fileType = mimeTypeMap.getMimeTypeFromExtension(fileExtension); if (fileType == null) { return false; @@ -304,7 +305,7 @@ public final class FileUtil { paths.add(path); try { Storage item = new Storage(); - if (path.toLowerCase().contains("sd")) { + if (path.toLowerCase(Locale.ROOT).contains("sd")) { item.title = "SD Card"; } else { item.title = "External Storage"; diff --git a/app/src/main/java/code/name/monkey/retromusic/util/SAFUtil.java b/app/src/main/java/code/name/monkey/retromusic/util/SAFUtil.java index 71506e19c..10939c9fd 100644 --- a/app/src/main/java/code/name/monkey/retromusic/util/SAFUtil.java +++ b/app/src/main/java/code/name/monkey/retromusic/util/SAFUtil.java @@ -83,7 +83,6 @@ public class SAFUtil { return false; } - @TargetApi(Build.VERSION_CODES.KITKAT) public static void openFilePicker(Activity activity) { Intent i = new Intent(Intent.ACTION_CREATE_DOCUMENT); i.addCategory(Intent.CATEGORY_OPENABLE); @@ -92,7 +91,6 @@ public class SAFUtil { activity.startActivityForResult(i, SAFUtil.REQUEST_SAF_PICK_FILE); } - @TargetApi(Build.VERSION_CODES.KITKAT) public static void openFilePicker(Fragment fragment) { Intent i = new Intent(Intent.ACTION_CREATE_DOCUMENT); i.addCategory(Intent.CATEGORY_OPENABLE); @@ -101,21 +99,18 @@ public class SAFUtil { fragment.startActivityForResult(i, SAFUtil.REQUEST_SAF_PICK_FILE); } - @TargetApi(Build.VERSION_CODES.LOLLIPOP) public static void openTreePicker(Activity activity) { Intent i = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE); i.putExtra("android.content.extra.SHOW_ADVANCED", true); activity.startActivityForResult(i, SAFUtil.REQUEST_SAF_PICK_TREE); } - @TargetApi(Build.VERSION_CODES.LOLLIPOP) public static void openTreePicker(Fragment fragment) { Intent i = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE); i.putExtra("android.content.extra.SHOW_ADVANCED", true); fragment.startActivityForResult(i, SAFUtil.REQUEST_SAF_PICK_TREE); } - @TargetApi(Build.VERSION_CODES.KITKAT) public static void saveTreeUri(Context context, Intent data) { Uri uri = data.getData(); context @@ -125,12 +120,10 @@ public class SAFUtil { PreferenceUtil.INSTANCE.setSafSdCardUri(uri.toString()); } - @TargetApi(Build.VERSION_CODES.LOLLIPOP) public static boolean isTreeUriSaved(Context context) { return !TextUtils.isEmpty(PreferenceUtil.INSTANCE.getSafSdCardUri()); } - @TargetApi(Build.VERSION_CODES.LOLLIPOP) public static boolean isSDCardAccessGranted(Context context) { if (!isTreeUriSaved(context)) return false; @@ -267,7 +260,6 @@ public class SAFUtil { new File(path).delete(); } - @TargetApi(Build.VERSION_CODES.KITKAT) public static void deleteSAF(Context context, String path, Uri safUri) { Uri uri = null; diff --git a/app/src/main/java/code/name/monkey/retromusic/util/color/NotificationColorUtil.java b/app/src/main/java/code/name/monkey/retromusic/util/color/NotificationColorUtil.java index 83d2a8f74..6aa903fe4 100644 --- a/app/src/main/java/code/name/monkey/retromusic/util/color/NotificationColorUtil.java +++ b/app/src/main/java/code/name/monkey/retromusic/util/color/NotificationColorUtil.java @@ -35,6 +35,7 @@ import androidx.annotation.IntRange; import androidx.annotation.NonNull; import androidx.core.content.ContextCompat; +import java.util.Locale; import java.util.WeakHashMap; import code.name.monkey.retromusic.R; @@ -329,7 +330,7 @@ public class NotificationColorUtil { } private static String contrastChange(int colorOld, int colorNew, int bg) { - return String.format( + return String.format(Locale.ROOT, "from %.2f:1 to %.2f:1", ColorUtilsFromCompat.calculateContrast(colorOld, bg), ColorUtilsFromCompat.calculateContrast(colorNew, bg)); diff --git a/appthemehelper/src/main/java/code/name/monkey/appthemehelper/util/VersionUtils.kt b/appthemehelper/src/main/java/code/name/monkey/appthemehelper/util/VersionUtils.kt index dabc64eca..ac8db0c5d 100644 --- a/appthemehelper/src/main/java/code/name/monkey/appthemehelper/util/VersionUtils.kt +++ b/appthemehelper/src/main/java/code/name/monkey/appthemehelper/util/VersionUtils.kt @@ -1,6 +1,7 @@ package code.name.monkey.appthemehelper.util import android.os.Build +import androidx.annotation.ChecksSdkIntAtLeast /** * @author Hemanth S (h4h13). @@ -10,6 +11,7 @@ object VersionUtils { /** * @return true if device is running API >= 23 */ + @ChecksSdkIntAtLeast(api = Build.VERSION_CODES.M) fun hasMarshmallow(): Boolean { return Build.VERSION.SDK_INT >= Build.VERSION_CODES.M } @@ -17,6 +19,7 @@ object VersionUtils { /** * @return true if device is running API >= 24 */ + @ChecksSdkIntAtLeast(api = Build.VERSION_CODES.N) fun hasNougat(): Boolean { return Build.VERSION.SDK_INT >= Build.VERSION_CODES.N } @@ -24,6 +27,7 @@ object VersionUtils { /** * @return true if device is running API >= 25 */ + @ChecksSdkIntAtLeast(api = Build.VERSION_CODES.N_MR1) fun hasNougatMR(): Boolean { return Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1 } @@ -31,6 +35,7 @@ object VersionUtils { /** * @return true if device is running API >= 26 */ + @ChecksSdkIntAtLeast(api = Build.VERSION_CODES.O) fun hasOreo(): Boolean { return Build.VERSION.SDK_INT >= Build.VERSION_CODES.O } @@ -38,6 +43,7 @@ object VersionUtils { /** * @return true if device is running API >= 27 */ + @ChecksSdkIntAtLeast(api = Build.VERSION_CODES.O_MR1) fun hasOreoMR1(): Boolean { return Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1 } @@ -45,6 +51,7 @@ object VersionUtils { /** * @return true if device is running API >= 28 */ + @ChecksSdkIntAtLeast(api = Build.VERSION_CODES.P) fun hasP(): Boolean { return Build.VERSION.SDK_INT >= Build.VERSION_CODES.P } @@ -52,6 +59,7 @@ object VersionUtils { /** * @return true if device is running API >= 29 */ + @ChecksSdkIntAtLeast(api = Build.VERSION_CODES.Q) @JvmStatic fun hasQ(): Boolean { return Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q @@ -60,6 +68,7 @@ object VersionUtils { /** * @return true if device is running API >= 30 */ + @ChecksSdkIntAtLeast(api = Build.VERSION_CODES.R) @JvmStatic fun hasR(): Boolean { return Build.VERSION.SDK_INT >= Build.VERSION_CODES.R @@ -68,6 +77,7 @@ object VersionUtils { /** * @return true if device is running API >= 31 */ + @ChecksSdkIntAtLeast(api = Build.VERSION_CODES.S) @JvmStatic fun hasS(): Boolean { return Build.VERSION.SDK_INT >= Build.VERSION_CODES.S From bc04472b6fe6e6faf1a857439d50013a4aefac86 Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Fri, 20 May 2022 16:59:56 +0530 Subject: [PATCH 045/280] Added LogUtil --- .../retromusic/activities/MainActivity.kt | 3 ++- .../activities/base/AbsBaseActivity.kt | 3 ++- .../base/AbsMusicServiceActivity.kt | 3 ++- .../base/AbsSlidingMusicPanelActivity.kt | 7 +++--- .../tageditor/AbsTagEditorActivity.kt | 5 ++-- .../tageditor/AlbumTagEditorActivity.kt | 3 ++- .../tageditor/SongTagEditorActivity.kt | 3 ++- .../retromusic/fragments/LibraryViewModel.kt | 19 ++++++++------- .../fragments/albums/AlbumDetailsFragment.kt | 9 +++---- .../fragments/albums/AlbumsFragment.kt | 1 - .../artists/AbsArtistDetailsFragment.kt | 4 ++-- .../AbsRecyclerViewCustomGridSizeFragment.kt | 3 ++- .../fragments/other/DetailListFragment.kt | 1 - .../player/PlayerAlbumCoverFragment.kt | 4 ++++ .../playlists/PlaylistDetailsFragment.kt | 1 - .../settings/OtherSettingsFragment.kt | 1 - .../fragments/songs/SongsFragment.kt | 1 - .../retromusic/helper/MusicPlayerRemote.kt | 3 ++- .../retromusic/repository/Repository.kt | 8 ++++--- .../retromusic/repository/RoomRepository.kt | 1 - .../service/MediaSessionCallback.kt | 6 +++-- .../monkey/retromusic/service/MusicService.kt | 4 ++-- .../name/monkey/retromusic/util/LogUtil.kt | 24 +++++++++++++++++++ 23 files changed, 75 insertions(+), 42 deletions(-) create mode 100644 app/src/main/java/code/name/monkey/retromusic/util/LogUtil.kt diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/MainActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/MainActivity.kt index 4c6d80670..78bf7d45d 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/MainActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/MainActivity.kt @@ -34,6 +34,7 @@ import code.name.monkey.retromusic.repository.PlaylistSongsLoader import code.name.monkey.retromusic.service.MusicService import code.name.monkey.retromusic.util.AppRater import code.name.monkey.retromusic.util.PreferenceUtil +import code.name.monkey.retromusic.util.logE import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.launch import org.koin.android.ext.android.get @@ -219,7 +220,7 @@ class MainActivity : AbsCastActivity(), OnThemeChangedListener { try { id = idString.toLong() } catch (e: NumberFormatException) { - println(e.message) + logE(e) } } } diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsBaseActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsBaseActivity.kt index 303cc5434..1e0c110d5 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsBaseActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsBaseActivity.kt @@ -33,6 +33,7 @@ import code.name.monkey.appthemehelper.util.VersionUtils import code.name.monkey.retromusic.R import code.name.monkey.retromusic.extensions.accentColor import code.name.monkey.retromusic.extensions.rootView +import code.name.monkey.retromusic.util.logD import com.google.android.material.snackbar.Snackbar abstract class AbsBaseActivity : AbsThemeActivity() { @@ -76,7 +77,7 @@ abstract class AbsBaseActivity : AbsThemeActivity() { protected open fun onHasPermissionsChanged(hasPermissions: Boolean) { // implemented by sub classes - println(hasPermissions) + logD(hasPermissions) } override fun dispatchKeyEvent(event: KeyEvent): Boolean { diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsMusicServiceActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsMusicServiceActivity.kt index efcd62edd..59c6320d8 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsMusicServiceActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsMusicServiceActivity.kt @@ -33,6 +33,7 @@ import code.name.monkey.retromusic.service.MusicService.Companion.QUEUE_CHANGED import code.name.monkey.retromusic.service.MusicService.Companion.REPEAT_MODE_CHANGED import code.name.monkey.retromusic.service.MusicService.Companion.SHUFFLE_MODE_CHANGED import code.name.monkey.retromusic.util.PreferenceUtil +import code.name.monkey.retromusic.util.logD import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import org.koin.android.ext.android.inject @@ -185,7 +186,7 @@ abstract class AbsMusicServiceActivity : AbsBaseActivity(), IMusicServiceEventLi true ) // just in case we need to know this at some point sendBroadcast(intent) - println("sendBroadcast $hasPermissions") + logD("sendBroadcast $hasPermissions") } override fun getPermissionsToRequest(): Array { 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 1207dadf9..203b9ca6d 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 @@ -65,6 +65,7 @@ import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.model.CategoryInfo import code.name.monkey.retromusic.util.PreferenceUtil import code.name.monkey.retromusic.util.ViewUtil +import code.name.monkey.retromusic.util.logD import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetBehavior.* import org.koin.androidx.viewmodel.ext.android.viewModel @@ -134,7 +135,7 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity(), MusicPlayerRemote.clearQueue() } else -> { - println("Do a flip") + logD("Do a flip") } } } @@ -451,7 +452,7 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity(), binding.slidingPanel.elevation = 0F binding.bottomNavigationView.elevation = 5F if (isBottomNavVisible) { - println("List") + logD("List") if (animate) { bottomSheetBehavior.peekHeightAnimate(heightOfBarWithTabs) } else { @@ -459,7 +460,7 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity(), } libraryViewModel.setFabMargin(this, dip(R.dimen.mini_player_height_expanded)) } else { - println("Details") + logD("Details") if (animate) { bottomSheetBehavior.peekHeightAnimate(heightOfBar).doOnEnd { binding.slidingPanel.bringToFront() diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/tageditor/AbsTagEditorActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/tageditor/AbsTagEditorActivity.kt index 4185287f3..2006ad249 100755 --- a/app/src/main/java/code/name/monkey/retromusic/activities/tageditor/AbsTagEditorActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/tageditor/AbsTagEditorActivity.kt @@ -48,6 +48,7 @@ import code.name.monkey.retromusic.model.ArtworkInfo import code.name.monkey.retromusic.model.AudioTagInfo import code.name.monkey.retromusic.repository.Repository import code.name.monkey.retromusic.util.SAFUtil +import code.name.monkey.retromusic.util.logD import com.google.android.material.button.MaterialButton import com.google.android.material.dialog.MaterialAlertDialogBuilder import kotlinx.coroutines.GlobalScope @@ -223,7 +224,7 @@ abstract class AbsTagEditorActivity : AbsBaseActivity() { getIntentExtras() songPaths = getSongPaths() - println(songPaths?.size) + logD(songPaths?.size) if (songPaths!!.isEmpty()) { finish() } @@ -352,7 +353,7 @@ abstract class AbsTagEditorActivity : AbsBaseActivity() { hideSoftKeyboard() hideFab() - println(fieldKeyValueMap) + logD(fieldKeyValueMap) GlobalScope.launch { if (VersionUtils.hasR()) { cacheFiles = TagWriter.writeTagsToFilesR( diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/tageditor/AlbumTagEditorActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/tageditor/AlbumTagEditorActivity.kt index 8509c963e..1e669d851 100755 --- a/app/src/main/java/code/name/monkey/retromusic/activities/tageditor/AlbumTagEditorActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/tageditor/AlbumTagEditorActivity.kt @@ -39,6 +39,7 @@ import code.name.monkey.retromusic.util.ImageUtil import code.name.monkey.retromusic.util.MusicUtil import code.name.monkey.retromusic.util.RetroColorUtil.generatePalette import code.name.monkey.retromusic.util.RetroColorUtil.getColor +import code.name.monkey.retromusic.util.logD import com.bumptech.glide.load.engine.DiskCacheStrategy import com.bumptech.glide.request.target.ImageViewTarget import com.bumptech.glide.request.transition.Transition @@ -98,7 +99,7 @@ class AlbumTagEditorActivity : AbsTagEditorActivity binding.discNumberText.setText(discNumber) binding.lyricsText.setText(lyrics) binding.songComposerText.setText(composer) - println(songTitle + songYear) + logD(songTitle + songYear) } override fun loadCurrentImage() { diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/LibraryViewModel.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/LibraryViewModel.kt index 3e200f4ee..ec7ab57b1 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/LibraryViewModel.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/LibraryViewModel.kt @@ -29,6 +29,7 @@ import code.name.monkey.retromusic.model.* import code.name.monkey.retromusic.repository.RealRepository import code.name.monkey.retromusic.util.DensityUtil import code.name.monkey.retromusic.util.PreferenceUtil +import code.name.monkey.retromusic.util.logD import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.Dispatchers.Main import kotlinx.coroutines.launch @@ -140,40 +141,40 @@ class LibraryViewModel( } override fun onMediaStoreChanged() { - println("onMediaStoreChanged") + logD("onMediaStoreChanged") loadLibraryContent() } override fun onServiceConnected() { - println("onServiceConnected") + logD("onServiceConnected") } override fun onServiceDisconnected() { - println("onServiceDisconnected") + logD("onServiceDisconnected") } override fun onQueueChanged() { - println("onQueueChanged") + logD("onQueueChanged") } override fun onPlayingMetaChanged() { - println("onPlayingMetaChanged") + logD("onPlayingMetaChanged") } override fun onPlayStateChanged() { - println("onPlayStateChanged") + logD("onPlayStateChanged") } override fun onRepeatModeChanged() { - println("onRepeatModeChanged") + logD("onRepeatModeChanged") } override fun onShuffleModeChanged() { - println("onShuffleModeChanged") + logD("onShuffleModeChanged") } override fun onFavoriteStateChanged() { - println("onFavoriteStateChanged") + logD("onFavoriteStateChanged") } fun shuffleSongs() = viewModelScope.launch(IO) { diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumDetailsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumDetailsFragment.kt index 34476eabb..be98c873b 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumDetailsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumDetailsFragment.kt @@ -62,10 +62,7 @@ import code.name.monkey.retromusic.model.Artist import code.name.monkey.retromusic.network.Result import code.name.monkey.retromusic.network.model.LastFmAlbum import code.name.monkey.retromusic.repository.RealRepository -import code.name.monkey.retromusic.util.MusicUtil -import code.name.monkey.retromusic.util.PreferenceUtil -import code.name.monkey.retromusic.util.RetroColorUtil -import code.name.monkey.retromusic.util.RetroUtil +import code.name.monkey.retromusic.util.* import com.afollestad.materialcab.attached.AttachedCab import com.afollestad.materialcab.attached.destroy import com.afollestad.materialcab.attached.isActive @@ -245,10 +242,10 @@ class AlbumDetailsFragment : AbsMainActivityFragment(R.layout.fragment_album_det detailsViewModel.getAlbumInfo(album).observe(viewLifecycleOwner) { result -> when (result) { is Result.Loading -> { - println("Loading") + logD("Loading") } is Result.Error -> { - println("Error") + logE("Error") } is Result.Success -> { aboutAlbum(result.data) diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumsFragment.kt index 5bb4af92b..55a8bb88d 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/albums/AlbumsFragment.kt @@ -367,7 +367,6 @@ class AlbumsFragment : AbsRecyclerViewCustomGridSizeFragment when (result) { - is Result.Loading -> println("Loading") - is Result.Error -> println("Error") + is Result.Loading -> logD("Loading") + is Result.Error -> logE("Error") is Result.Success -> artistInfo(result.data) } } diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsRecyclerViewCustomGridSizeFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsRecyclerViewCustomGridSizeFragment.kt index aa6d39d08..86fd7296f 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsRecyclerViewCustomGridSizeFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsRecyclerViewCustomGridSizeFragment.kt @@ -19,6 +19,7 @@ import androidx.recyclerview.widget.RecyclerView import androidx.transition.TransitionManager import code.name.monkey.retromusic.R import code.name.monkey.retromusic.util.RetroUtil +import code.name.monkey.retromusic.util.logD import com.google.android.material.transition.MaterialFade abstract class AbsRecyclerViewCustomGridSizeFragment, LM : RecyclerView.LayoutManager> : @@ -73,7 +74,7 @@ abstract class AbsRecyclerViewCustomGridSizeFragment fun setAndSaveSortOrder(sortOrder: String) { this.sortOrder = sortOrder - println(sortOrder) + logD(sortOrder) saveSortOrder(sortOrder) setSortOrder(sortOrder) } diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/other/DetailListFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/other/DetailListFragment.kt index dda396c94..ec13d29f4 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/other/DetailListFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/other/DetailListFragment.kt @@ -282,7 +282,6 @@ class DetailListFragment : AbsMainActivityFragment(R.layout.fragment_playlist_de override fun openCab(menuRes: Int, callback: ICabCallback): AttachedCab { cab?.let { - println("Cab") if (it.isActive()) { it.destroy() } diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/PlayerAlbumCoverFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/PlayerAlbumCoverFragment.kt index ace1d8873..cb6d12e7c 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/PlayerAlbumCoverFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/PlayerAlbumCoverFragment.kt @@ -47,6 +47,7 @@ import code.name.monkey.retromusic.util.LyricUtil import code.name.monkey.retromusic.util.LyricsType import code.name.monkey.retromusic.util.PreferenceUtil import code.name.monkey.retromusic.util.color.MediaNotificationProcessor +import code.name.monkey.retromusic.util.logD import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -173,16 +174,19 @@ class PlayerAlbumCoverFragment : AbsMusicServiceFragment(R.layout.fragment_playe } override fun onServiceConnected() { + logD("Service Connected") updatePlayingQueue() updateLyrics() } override fun onPlayingMetaChanged() { + logD("Playing Meta Changed") binding.viewPager.currentItem = MusicPlayerRemote.position updateLyrics() } override fun onQueueChanged() { + logD("Queue Changed") updatePlayingQueue() } diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistDetailsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistDetailsFragment.kt index aa7f71bc1..8df53a756 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistDetailsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/playlists/PlaylistDetailsFragment.kt @@ -177,7 +177,6 @@ class PlaylistDetailsFragment : AbsMainActivityFragment(R.layout.fragment_playli override fun openCab(menuRes: Int, callback: ICabCallback): AttachedCab { cab?.let { - println("Cab") if (it.isActive()) { it.destroy() } diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/OtherSettingsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/OtherSettingsFragment.kt index da9088db6..9164b3156 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/OtherSettingsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/OtherSettingsFragment.kt @@ -38,7 +38,6 @@ class OtherSettingsFragment : AbsSettingsFragment() { override fun invalidateSettings() { val languagePreference: ATEListPreference? = findPreference(LANGUAGE_NAME) languagePreference?.setOnPreferenceChangeListener { _, _ -> - println("Invalidated") restartActivity() return@setOnPreferenceChangeListener true } diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/songs/SongsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/songs/SongsFragment.kt index 3500d2627..73a7f5e28 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/songs/SongsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/songs/SongsFragment.kt @@ -363,7 +363,6 @@ class SongsFragment : AbsRecyclerViewCustomGridSizeFragment ${section.arrayList.size}") + logD("${section.homeSection} -> ${section.arrayList.size}") homeSections.add(section) } } diff --git a/app/src/main/java/code/name/monkey/retromusic/repository/RoomRepository.kt b/app/src/main/java/code/name/monkey/retromusic/repository/RoomRepository.kt index e8b703497..31b3dfc5c 100644 --- a/app/src/main/java/code/name/monkey/retromusic/repository/RoomRepository.kt +++ b/app/src/main/java/code/name/monkey/retromusic/repository/RoomRepository.kt @@ -115,7 +115,6 @@ class RealRoomRepository( return if (playlist != null) { playlist } else { - println("Playlist Created") createPlaylist(PlaylistEntity(playlistName = favorite)) playlistDao.playlist(favorite).first() } diff --git a/app/src/main/java/code/name/monkey/retromusic/service/MediaSessionCallback.kt b/app/src/main/java/code/name/monkey/retromusic/service/MediaSessionCallback.kt index abefd4491..685d533cc 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/MediaSessionCallback.kt +++ b/app/src/main/java/code/name/monkey/retromusic/service/MediaSessionCallback.kt @@ -31,6 +31,8 @@ import code.name.monkey.retromusic.service.MusicService.Companion.CYCLE_REPEAT import code.name.monkey.retromusic.service.MusicService.Companion.TOGGLE_FAVORITE import code.name.monkey.retromusic.service.MusicService.Companion.TOGGLE_SHUFFLE import code.name.monkey.retromusic.util.MusicUtil +import code.name.monkey.retromusic.util.logD +import code.name.monkey.retromusic.util.logE import org.koin.core.component.KoinComponent import org.koin.core.component.inject @@ -52,7 +54,7 @@ class MediaSessionCallback( override fun onPlayFromMediaId(mediaId: String?, extras: Bundle?) { super.onPlayFromMediaId(mediaId, extras) val musicId = AutoMediaIDHelper.extractMusicID(mediaId!!) - println(musicId) + logD(musicId) val itemId = musicId?.toLong() ?: -1 val songs: ArrayList = ArrayList() when (val category = AutoMediaIDHelper.extractCategory(mediaId)) { @@ -192,7 +194,7 @@ class MediaSessionCallback( musicService.toggleFavorite() } else -> { - println("Unsupported action: $action") + logE("Unsupported action: $action") } } } diff --git a/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt b/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt index c3055e8c7..86dd51f76 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt +++ b/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt @@ -1339,8 +1339,8 @@ class MusicService : MediaBrowserServiceCompat(), this, "RetroMusicPlayer" ) - val mediasessionCallback = MediaSessionCallback(this) - mediaSession?.setCallback(mediasessionCallback) + val mediaSessionCallback = MediaSessionCallback(this) + mediaSession?.setCallback(mediaSessionCallback) mediaSession?.isActive = true } diff --git a/app/src/main/java/code/name/monkey/retromusic/util/LogUtil.kt b/app/src/main/java/code/name/monkey/retromusic/util/LogUtil.kt new file mode 100644 index 000000000..9abd7ac93 --- /dev/null +++ b/app/src/main/java/code/name/monkey/retromusic/util/LogUtil.kt @@ -0,0 +1,24 @@ +package code.name.monkey.retromusic.util + +import android.util.Log +import code.name.monkey.retromusic.BuildConfig + +fun Any.logD(message: Any?) { + logD(message.toString()) +} + +fun Any.logD(message: String) { + if (BuildConfig.DEBUG) { + Log.d(name, message) + } +} + +fun Any.logE(message: String) { + Log.e(name, message) +} + +fun Any.logE(e: Exception) { + Log.e(name, e.message ?: "Error") +} + +val Any.name: String get() = this::class.java.simpleName \ No newline at end of file From b971dbbe4badef34a2aa494b4dc9c422a7e26514 Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Fri, 20 May 2022 23:11:31 +0530 Subject: [PATCH 046/280] Fix player not working after quitting from notification --- .../player/gradient/GradientPlayerFragment.kt | 16 +++++++++------- .../monkey/retromusic/service/MusicService.kt | 1 - .../monkey/retromusic/service/PlaybackManager.kt | 4 +--- .../retromusic/service/ThrottledSeekHandler.kt | 1 - 4 files changed, 10 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/gradient/GradientPlayerFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/gradient/GradientPlayerFragment.kt index 15a3ccc66..6a1dddedf 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/gradient/GradientPlayerFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/gradient/GradientPlayerFragment.kt @@ -99,7 +99,8 @@ class GradientPlayerFragment : AbsPlayerFragment(R.layout.fragment_gradient_play override fun onStateChanged(bottomSheet: View, newState: Int) { when (newState) { STATE_EXPANDED, - STATE_DRAGGING -> { + STATE_DRAGGING, + -> { mainActivity.getBottomSheetBehavior().isDraggable = false } STATE_COLLAPSED -> { @@ -312,7 +313,6 @@ class GradientPlayerFragment : AbsPlayerFragment(R.layout.fragment_gradient_play super.onServiceConnected() updateSong() updatePlayPauseDrawableState() - updatePlayPauseDrawableState() updateQueue() updateIsFavoriteIcon() } @@ -379,15 +379,17 @@ class GradientPlayerFragment : AbsPlayerFragment(R.layout.fragment_gradient_play private fun setUpPlayPauseFab() { binding.playbackControlsFragment.playPauseButton.setOnClickListener( - PlayPauseButtonOnClickHandler() - ) + PlayPauseButtonOnClickHandler()) } @SuppressLint("ClickableViewAccessibility") private fun setUpPrevNext() { updatePrevNextColor() - binding.playbackControlsFragment.nextButton.setOnTouchListener(MusicSeekSkipTouchListener(requireActivity(), true)) - binding.playbackControlsFragment.previousButton.setOnTouchListener(MusicSeekSkipTouchListener(requireActivity(), false)) + binding.playbackControlsFragment.nextButton.setOnTouchListener(MusicSeekSkipTouchListener( + requireActivity(), + true)) + binding.playbackControlsFragment.previousButton.setOnTouchListener( + MusicSeekSkipTouchListener(requireActivity(), false)) } private fun updatePrevNextColor() { @@ -469,7 +471,7 @@ class GradientPlayerFragment : AbsPlayerFragment(R.layout.fragment_gradient_play oldLeft: Int, oldTop: Int, oldRight: Int, - oldBottom: Int + oldBottom: Int, ) { val panel = getQueuePanel() if (panel.state == STATE_COLLAPSED) { diff --git a/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt b/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt index 86dd51f76..481e4c027 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt +++ b/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt @@ -851,7 +851,6 @@ class MusicService : MediaBrowserServiceCompat(), stopForeground(true) isForeground = false notificationManager?.cancel(PlayingNotification.NOTIFICATION_ID) - playbackManager.release() AudioManagerCompat.abandonAudioFocusRequest(audioManager!!, AudioFocusRequestCompat.Builder(AudioManagerCompat.AUDIOFOCUS_GAIN) .setOnAudioFocusChangeListener(audioFocusListener) diff --git a/app/src/main/java/code/name/monkey/retromusic/service/PlaybackManager.kt b/app/src/main/java/code/name/monkey/retromusic/service/PlaybackManager.kt index 1ee3f727a..8abc43328 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/PlaybackManager.kt +++ b/app/src/main/java/code/name/monkey/retromusic/service/PlaybackManager.kt @@ -118,9 +118,7 @@ class PlaybackManager(val context: Context) { } fun release() { - if (playback != null) { - playback?.release() - } + playback?.release() playback = null closeAudioEffectSession() } diff --git a/app/src/main/java/code/name/monkey/retromusic/service/ThrottledSeekHandler.kt b/app/src/main/java/code/name/monkey/retromusic/service/ThrottledSeekHandler.kt index 28b4bb8fd..9fcda73cb 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/ThrottledSeekHandler.kt +++ b/app/src/main/java/code/name/monkey/retromusic/service/ThrottledSeekHandler.kt @@ -25,7 +25,6 @@ class ThrottledSeekHandler( fun notifySeek() { musicService.updateMediaSessionPlaybackState() - musicService.updateMediaSessionMetaData() handler.removeCallbacks(this) handler.postDelayed(this, THROTTLE) } From fb7f29bdf44cb27f8063d0928085473fcdf44072 Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Fri, 20 May 2022 23:15:54 +0530 Subject: [PATCH 047/280] Also broadcast albumArt uri for queue items --- .../monkey/retromusic/extensions/SongExtensions.kt | 12 +++++++----- .../name/monkey/retromusic/service/MusicService.kt | 2 ++ 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/code/name/monkey/retromusic/extensions/SongExtensions.kt b/app/src/main/java/code/name/monkey/retromusic/extensions/SongExtensions.kt index f51331c2a..f28f05624 100644 --- a/app/src/main/java/code/name/monkey/retromusic/extensions/SongExtensions.kt +++ b/app/src/main/java/code/name/monkey/retromusic/extensions/SongExtensions.kt @@ -7,14 +7,16 @@ import code.name.monkey.retromusic.util.MusicUtil val Song.uri get() = MusicUtil.getSongFileUri(songId = id) +val Song.albumArtUri get() = MusicUtil.getMediaStoreAlbumCoverUri(albumId) fun ArrayList.toMediaSessionQueue(): List { - return map { + return map { song -> val mediaDescription = MediaDescriptionCompat.Builder() - .setMediaId(it.id.toString()) - .setTitle(it.title) - .setSubtitle(it.artistName) + .setMediaId(song.id.toString()) + .setTitle(song.title) + .setSubtitle(song.artistName) + .setIconUri(song.albumArtUri) .build() - QueueItem(mediaDescription, it.hashCode().toLong()) + QueueItem(mediaDescription, song.hashCode().toLong()) } } diff --git a/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt b/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt index 481e4c027..25d37752f 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt +++ b/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt @@ -947,6 +947,8 @@ class MusicService : MediaBrowserServiceCompat(), } sendChangeInternal(QUEUE_CHANGED) + mediaSession?.setQueueTitle(getString(R.string.now_playing_queue)) + mediaSession?.setQueue(playingQueue.toMediaSessionQueue()) } } From d6c4d5e13380360606bbd28a4d5fd510474876f0 Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Sat, 21 May 2022 00:15:14 +0530 Subject: [PATCH 048/280] Show sleep timer icon always in the player screen --- app/src/main/res/drawable/ic_sleep_timer.xml | 9 ++++++++ app/src/main/res/menu/menu_player.xml | 22 ++++++++++---------- app/src/main/res/values-v23/bools.xml | 4 ++++ app/src/main/res/values/bools.xml | 1 + 4 files changed, 25 insertions(+), 11 deletions(-) create mode 100644 app/src/main/res/drawable/ic_sleep_timer.xml create mode 100644 app/src/main/res/values-v23/bools.xml diff --git a/app/src/main/res/drawable/ic_sleep_timer.xml b/app/src/main/res/drawable/ic_sleep_timer.xml new file mode 100644 index 000000000..e5ff2f862 --- /dev/null +++ b/app/src/main/res/drawable/ic_sleep_timer.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/menu/menu_player.xml b/app/src/main/res/menu/menu_player.xml index 34bef5148..0123400d1 100755 --- a/app/src/main/res/menu/menu_player.xml +++ b/app/src/main/res/menu/menu_player.xml @@ -1,13 +1,12 @@ + xmlns:app="http://schemas.android.com/apk/res-auto"> + android:title="@string/action_sleep_timer" + app:showAsAction="always" /> + - + + true + \ No newline at end of file diff --git a/app/src/main/res/values/bools.xml b/app/src/main/res/values/bools.xml index 3084d216b..654eeffa5 100644 --- a/app/src/main/res/values/bools.xml +++ b/app/src/main/res/values/bools.xml @@ -9,4 +9,5 @@ false true + false \ No newline at end of file From b9f0adc9c23888a027c49d5afee5c2eda56065df Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Sat, 21 May 2022 02:00:26 +0530 Subject: [PATCH 049/280] Correctly set playback speed and pitch --- .../name/monkey/retromusic/service/CrossFadePlayer.kt | 8 -------- .../code/name/monkey/retromusic/service/MultiPlayer.kt | 3 --- .../name/monkey/retromusic/service/PlaybackManager.kt | 8 ++++++++ 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/code/name/monkey/retromusic/service/CrossFadePlayer.kt b/app/src/main/java/code/name/monkey/retromusic/service/CrossFadePlayer.kt index 0949f4158..a3201d2c5 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/CrossFadePlayer.kt +++ b/app/src/main/java/code/name/monkey/retromusic/service/CrossFadePlayer.kt @@ -19,8 +19,6 @@ import code.name.monkey.retromusic.service.AudioFader.Companion.createFadeAnimat import code.name.monkey.retromusic.service.playback.Playback import code.name.monkey.retromusic.service.playback.Playback.PlaybackCallbacks import code.name.monkey.retromusic.util.PreferenceUtil -import code.name.monkey.retromusic.util.PreferenceUtil.playbackPitch -import code.name.monkey.retromusic.util.PreferenceUtil.playbackSpeed import kotlinx.coroutines.* /** @author Prathamesh M */ @@ -168,7 +166,6 @@ class CrossFadePlayer(val context: Context) : Playback, MediaPlayer.OnCompletion player.setAudioAttributes( AudioAttributes.Builder().setLegacyStreamType(AudioManager.STREAM_MUSIC).build() ) - player.setPlaybackSpeedPitch(playbackSpeed, playbackPitch) player.setOnPreparedListener { player.setOnPreparedListener(null) completion(true) @@ -321,7 +318,6 @@ class CrossFadePlayer(val context: Context) : Playback, MediaPlayer.OnCompletion } } - fun onDurationUpdated(progress: Int, total: Int) { if (total > 0 && (total - progress).div(1000) == crossFadeDuration) { getNextPlayer()?.let { player -> @@ -369,10 +365,6 @@ internal fun crossFadeScope(): CoroutineScope = CoroutineScope(Job() + Dispatche fun MediaPlayer.setPlaybackSpeedPitch(speed: Float, pitch: Float) { if (hasMarshmallow()) { - val wasPlaying: Boolean = isPlaying playbackParams = PlaybackParams().setSpeed(speed).setPitch(pitch) - if (!wasPlaying) { - if (isPlaying) pause() - } } } \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/service/MultiPlayer.kt b/app/src/main/java/code/name/monkey/retromusic/service/MultiPlayer.kt index 76b26edd1..bd14fb778 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/MultiPlayer.kt +++ b/app/src/main/java/code/name/monkey/retromusic/service/MultiPlayer.kt @@ -27,8 +27,6 @@ import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.service.playback.Playback import code.name.monkey.retromusic.service.playback.Playback.PlaybackCallbacks import code.name.monkey.retromusic.util.PreferenceUtil.isGapLessPlayback -import code.name.monkey.retromusic.util.PreferenceUtil.playbackPitch -import code.name.monkey.retromusic.util.PreferenceUtil.playbackSpeed /** * @author Andrew Neal, Karim Abou Zeid (kabouzeid) @@ -91,7 +89,6 @@ class MultiPlayer internal constructor(private val context: Context) : Playback, .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) .build() ) - player.setPlaybackSpeedPitch(playbackSpeed, playbackPitch) player.setOnPreparedListener { player.setOnPreparedListener(null) completion(true) diff --git a/app/src/main/java/code/name/monkey/retromusic/service/PlaybackManager.kt b/app/src/main/java/code/name/monkey/retromusic/service/PlaybackManager.kt index 8abc43328..512910831 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/PlaybackManager.kt +++ b/app/src/main/java/code/name/monkey/retromusic/service/PlaybackManager.kt @@ -6,6 +6,8 @@ import android.media.audiofx.AudioEffect import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.service.playback.Playback import code.name.monkey.retromusic.util.PreferenceUtil +import code.name.monkey.retromusic.util.PreferenceUtil.playbackPitch +import code.name.monkey.retromusic.util.PreferenceUtil.playbackSpeed import com.google.android.gms.cast.framework.CastSession @@ -32,6 +34,9 @@ class PlaybackManager(val context: Context) { val isPlaying: Boolean get() = playback != null && playback!!.isPlaying + private val shouldSetSpeed: Boolean + get() = !(playbackSpeed == 1f && playbackPitch == 1f) + init { playback = createLocalPlayback() } @@ -52,6 +57,9 @@ class PlaybackManager(val context: Context) { onPlay() } } + if (shouldSetSpeed) { + playback?.setPlaybackSpeedPitch(playbackSpeed, playbackPitch) + } playback?.start() } } From 2786d8abedd81d841e066769b6bfa2af64378ddd Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Mon, 23 May 2022 20:18:40 +0530 Subject: [PATCH 050/280] Changed Seekbar with Sliders --- .../activities/DriveModeActivity.kt | 25 +++--- .../retromusic/extensions/ColorExtensions.kt | 17 ++++- .../base/AbsPlayerControlsFragment.kt | 43 +++++------ .../fragments/other/VolumeFragment.kt | 32 ++++---- .../AdaptivePlaybackControlsFragment.kt | 4 +- .../blur/BlurPlaybackControlsFragment.kt | 4 +- .../card/CardPlaybackControlsFragment.kt | 12 +-- .../CardBlurPlaybackControlsFragment.kt | 4 +- .../player/circle/CirclePlayerFragment.kt | 65 ++++++++++------ .../player/classic/ClassicPlayerFragment.kt | 76 +++++++++++-------- .../color/ColorPlaybackControlsFragment.kt | 4 +- .../player/fit/FitPlaybackControlsFragment.kt | 17 ++++- .../flat/FlatPlaybackControlsFragment.kt | 4 +- .../full/FullPlaybackControlsFragment.kt | 4 +- .../player/gradient/GradientPlayerFragment.kt | 57 +++++++++----- .../lockscreen/LockScreenControlsFragment.kt | 4 +- .../material/MaterialControlsFragment.kt | 4 +- .../player/md3/MD3PlaybackControlsFragment.kt | 4 +- .../normal/PlayerPlaybackControlsFragment.kt | 4 +- .../player/peek/PeekPlayerControlFragment.kt | 4 +- .../plain/PlainPlaybackControlsFragment.kt | 4 +- .../fragments/search/SearchFragment.kt | 9 +-- .../service/MediaSessionCallback.kt | 2 +- .../monkey/retromusic/service/MusicService.kt | 11 ++- .../views/BottomNavigationBarTinted.kt | 7 +- app/src/main/res/drawable/ic_sleep_timer.xml | 2 +- .../res/layout-land/activity_drive_mode.xml | 8 +- .../layout-land/fragment_circle_player.xml | 6 +- .../main/res/layout/activity_drive_mode.xml | 11 +-- ...ment_adaptive_player_playback_controls.xml | 10 +-- ...fragment_blur_player_playback_controls.xml | 6 +- ...ent_card_blur_player_playback_controls.xml | 4 +- ...fragment_card_player_playback_controls.xml | 13 ++-- .../res/layout/fragment_circle_player.xml | 6 +- .../res/layout/fragment_classic_controls.xml | 11 ++- ...ragment_color_player_playback_controls.xml | 6 +- .../layout/fragment_fit_playback_controls.xml | 21 ++--- ...fragment_flat_player_playback_controls.xml | 9 +-- .../layout/fragment_full_player_controls.xml | 6 +- .../res/layout/fragment_gradient_controls.xml | 6 +- ...fragment_lock_screen_playback_controls.xml | 6 +- .../fragment_material_playback_controls.xml | 6 +- .../fragment_md3_player_playback_controls.xml | 4 +- .../layout/fragment_peek_control_player.xml | 6 +- .../fragment_plain_controls_fragment.xml | 6 +- app/src/main/res/layout/fragment_player.xml | 5 +- .../fragment_player_playback_controls.xml | 7 +- app/src/main/res/layout/fragment_volume.xml | 4 +- app/src/main/res/values/styles.xml | 6 ++ 49 files changed, 314 insertions(+), 282 deletions(-) diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/DriveModeActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/DriveModeActivity.kt index 81f880ace..1fb04f469 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/DriveModeActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/DriveModeActivity.kt @@ -20,7 +20,6 @@ import android.graphics.Color import android.graphics.PorterDuff import android.os.Bundle import android.view.animation.LinearInterpolator -import android.widget.SeekBar import androidx.lifecycle.lifecycleScope import code.name.monkey.retromusic.R import code.name.monkey.retromusic.activities.base.AbsMusicServiceActivity @@ -36,11 +35,11 @@ import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.helper.MusicProgressViewUpdateHelper import code.name.monkey.retromusic.helper.MusicProgressViewUpdateHelper.Callback 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.repository.RealRepository import code.name.monkey.retromusic.service.MusicService import code.name.monkey.retromusic.util.MusicUtil +import com.google.android.material.slider.Slider import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -113,17 +112,15 @@ class DriveModeActivity : AbsMusicServiceActivity(), Callback { } private fun setUpProgressSlider() { - binding.progressSlider.setOnSeekBarChangeListener(object : SimpleOnSeekbarChangeListener() { - override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) { - if (fromUser) { - MusicPlayerRemote.seekTo(progress) - onUpdateProgressViews( - MusicPlayerRemote.songProgressMillis, - MusicPlayerRemote.songDurationMillis - ) - } + binding.progressSlider.addOnChangeListener { _: Slider, progress: Float, fromUser: Boolean -> + if (fromUser) { + MusicPlayerRemote.seekTo(progress.toInt()) + onUpdateProgressViews( + MusicPlayerRemote.songProgressMillis, + MusicPlayerRemote.songDurationMillis + ) } - }) + } } override fun onPause() { @@ -249,9 +246,9 @@ class DriveModeActivity : AbsMusicServiceActivity(), Callback { } override fun onUpdateProgressViews(progress: Int, total: Int) { - binding.progressSlider.max = total + binding.progressSlider.valueTo = total.toFloat() - val animator = ObjectAnimator.ofInt(binding.progressSlider, "progress", progress) + val animator = ObjectAnimator.ofFloat(binding.progressSlider, "value", progress.toFloat()) animator.duration = AbsPlayerControlsFragment.SLIDER_ANIMATION_TIME animator.interpolator = LinearInterpolator() animator.start() diff --git a/app/src/main/java/code/name/monkey/retromusic/extensions/ColorExtensions.kt b/app/src/main/java/code/name/monkey/retromusic/extensions/ColorExtensions.kt index cfd09a642..9d27c12bc 100644 --- a/app/src/main/java/code/name/monkey/retromusic/extensions/ColorExtensions.kt +++ b/app/src/main/java/code/name/monkey/retromusic/extensions/ColorExtensions.kt @@ -163,6 +163,15 @@ fun SeekBar.applyColor(@ColorInt color: Int) { progressBackgroundTintList = ColorStateList.valueOf(color) } +fun Slider.applyColor(@ColorInt color: Int) { + ColorStateList.valueOf(color).run { + thumbTintList = this + trackActiveTintList = this + trackInactiveTintList = ColorStateList.valueOf(color.addAlpha(0.1f)) + haloTintList = this + } +} + fun ExtendedFloatingActionButton.accentColor() { if (materialYou) return val color = ThemeStore.accentColor(context) @@ -301,5 +310,9 @@ inline val @receiver:ColorInt Int.lighterColor inline val @receiver:ColorInt Int.darkerColor get() = ColorUtil.darkenColor(this) -inline val Int.colorStateList : ColorStateList - get() = ColorStateList.valueOf(this) \ No newline at end of file +inline val Int.colorStateList: ColorStateList + get() = ColorStateList.valueOf(this) + +fun @receiver:ColorInt Int.addAlpha(alpha: Float): Int { + return ColorUtil.withAlpha(this, alpha) +} \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsPlayerControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsPlayerControlsFragment.kt index 4d3a63875..7228bf4b6 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsPlayerControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsPlayerControlsFragment.kt @@ -23,7 +23,6 @@ import android.view.animation.AccelerateInterpolator import android.view.animation.DecelerateInterpolator import android.view.animation.LinearInterpolator import android.widget.ImageButton -import android.widget.SeekBar import android.widget.TextView import androidx.annotation.LayoutRes import androidx.core.view.isVisible @@ -35,11 +34,11 @@ import code.name.monkey.retromusic.fragments.MusicSeekSkipTouchListener import code.name.monkey.retromusic.fragments.other.VolumeFragment import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.helper.MusicProgressViewUpdateHelper -import code.name.monkey.retromusic.misc.SimpleOnSeekbarChangeListener 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.color.MediaNotificationProcessor +import com.google.android.material.slider.Slider /** * Created by hemanths on 24/09/17. @@ -61,7 +60,7 @@ abstract class AbsPlayerControlsFragment(@LayoutRes layout: Int) : AbsMusicServi var isSeeking = false private set - open val progressSlider: SeekBar? = null + open val progressSlider: Slider? = null abstract val shuffleButton: ImageButton @@ -78,16 +77,17 @@ abstract class AbsPlayerControlsFragment(@LayoutRes layout: Int) : AbsMusicServi private var progressAnimator: ObjectAnimator? = null override fun onUpdateProgressViews(progress: Int, total: Int) { - progressSlider?.max = total + progressSlider?.valueTo = total.toFloat() if (isSeeking) { - progressSlider?.progress = progress + progressSlider?.value = progress.toFloat() } else { - progressAnimator = ObjectAnimator.ofInt(progressSlider, "progress", progress).apply { - duration = SLIDER_ANIMATION_TIME - interpolator = LinearInterpolator() - start() - } + progressAnimator = + ObjectAnimator.ofFloat(progressSlider, "value", progress.toFloat()).apply { + duration = SLIDER_ANIMATION_TIME + interpolator = LinearInterpolator() + start() + } } songTotalTime?.text = MusicUtil.getReadableDurationString(total.toLong()) @@ -95,25 +95,24 @@ abstract class AbsPlayerControlsFragment(@LayoutRes layout: Int) : AbsMusicServi } private fun setUpProgressSlider() { - progressSlider?.setOnSeekBarChangeListener(object : SimpleOnSeekbarChangeListener() { - override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) { - if (fromUser) { - onUpdateProgressViews( - progress, - MusicPlayerRemote.songDurationMillis - ) - } + progressSlider?.addOnChangeListener(Slider.OnChangeListener { _, value, fromUser -> + if (fromUser) { + onUpdateProgressViews( + value.toInt(), + MusicPlayerRemote.songDurationMillis + ) } - - override fun onStartTrackingTouch(seekBar: SeekBar) { + }) + progressSlider?.addOnSliderTouchListener(object : Slider.OnSliderTouchListener { + override fun onStartTrackingTouch(slider: Slider) { isSeeking = true progressViewUpdateHelper.stop() progressAnimator?.cancel() } - override fun onStopTrackingTouch(seekBar: SeekBar) { + override fun onStopTrackingTouch(slider: Slider) { isSeeking = false - MusicPlayerRemote.seekTo(seekBar.progress) + MusicPlayerRemote.seekTo(slider.value.toInt()) progressViewUpdateHelper.start() } }) diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/other/VolumeFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/other/VolumeFragment.kt index 291ce2ebd..a8b10d297 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/other/VolumeFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/other/VolumeFragment.kt @@ -21,7 +21,6 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.widget.SeekBar import androidx.core.content.getSystemService import androidx.fragment.app.Fragment import code.name.monkey.appthemehelper.ThemeStore @@ -32,8 +31,9 @@ import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.util.PreferenceUtil import code.name.monkey.retromusic.volume.AudioVolumeObserver import code.name.monkey.retromusic.volume.OnAudioVolumeChangedListener +import com.google.android.material.slider.Slider -class VolumeFragment : Fragment(), SeekBar.OnSeekBarChangeListener, OnAudioVolumeChangedListener, +class VolumeFragment : Fragment(), Slider.OnChangeListener, OnAudioVolumeChangedListener, View.OnClickListener { private var _binding: FragmentVolumeBinding? = null @@ -47,7 +47,7 @@ class VolumeFragment : Fragment(), SeekBar.OnSeekBarChangeListener, OnAudioVolum override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? + savedInstanceState: Bundle?, ): View { _binding = FragmentVolumeBinding.inflate(inflater, container, false) return binding.root @@ -68,15 +68,17 @@ class VolumeFragment : Fragment(), SeekBar.OnSeekBarChangeListener, OnAudioVolum audioVolumeObserver?.register(AudioManager.STREAM_MUSIC, this) val audioManager = audioManager - binding.volumeSeekBar.max = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC) - binding.volumeSeekBar.progress = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC) - binding.volumeSeekBar.setOnSeekBarChangeListener(this) + binding.volumeSeekBar.valueTo = + audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC).toFloat() + binding.volumeSeekBar.value = + audioManager.getStreamVolume(AudioManager.STREAM_MUSIC).toFloat() + binding.volumeSeekBar.addOnChangeListener(this) } override fun onAudioVolumeChanged(currentVolume: Int, maxVolume: Int) { if (_binding != null) { - binding.volumeSeekBar.max = maxVolume - binding.volumeSeekBar.progress = currentVolume + binding.volumeSeekBar.valueTo = maxVolume.toFloat() + binding.volumeSeekBar.value = currentVolume.toFloat() binding.volumeDown.setImageResource(if (currentVolume == 0) R.drawable.ic_volume_off else R.drawable.ic_volume_down) } } @@ -87,17 +89,11 @@ class VolumeFragment : Fragment(), SeekBar.OnSeekBarChangeListener, OnAudioVolum _binding = null } - override fun onProgressChanged(seekBar: SeekBar, i: Int, b: Boolean) { + override fun onValueChange(slider: Slider, value: Float, fromUser: Boolean) { val audioManager = audioManager - audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, i, 0) - setPauseWhenZeroVolume(i < 1) - binding.volumeDown.setImageResource(if (i == 0) R.drawable.ic_volume_off else R.drawable.ic_volume_down) - } - - override fun onStartTrackingTouch(seekBar: SeekBar) { - } - - override fun onStopTrackingTouch(seekBar: SeekBar) { + audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, value.toInt(), 0) + setPauseWhenZeroVolume(value < 1f) + binding.volumeDown.setImageResource(if (value == 0f) R.drawable.ic_volume_off else R.drawable.ic_volume_down) } override fun onClick(view: View) { diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/adaptive/AdaptivePlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/adaptive/AdaptivePlaybackControlsFragment.kt index d811b8e3a..a6d0bd5e6 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/adaptive/AdaptivePlaybackControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/adaptive/AdaptivePlaybackControlsFragment.kt @@ -17,7 +17,7 @@ package code.name.monkey.retromusic.fragments.player.adaptive import android.os.Bundle import android.view.View import android.widget.ImageButton -import android.widget.SeekBar +import com.google.android.material.slider.Slider import android.widget.TextView import code.name.monkey.appthemehelper.ThemeStore import code.name.monkey.appthemehelper.util.ATHUtil @@ -38,7 +38,7 @@ class AdaptivePlaybackControlsFragment : private var _binding: FragmentAdaptivePlayerPlaybackControlsBinding? = null private val binding get() = _binding!! - override val progressSlider: SeekBar + override val progressSlider: Slider get() = binding.progressSlider override val shuffleButton: ImageButton diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/blur/BlurPlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/blur/BlurPlaybackControlsFragment.kt index 3ade61087..5ad8ea9f1 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/blur/BlurPlaybackControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/blur/BlurPlaybackControlsFragment.kt @@ -19,7 +19,7 @@ import android.os.Bundle import android.view.View import android.view.animation.DecelerateInterpolator import android.widget.ImageButton -import android.widget.SeekBar +import com.google.android.material.slider.Slider import android.widget.TextView import androidx.core.content.ContextCompat import code.name.monkey.appthemehelper.util.ColorUtil @@ -43,7 +43,7 @@ class BlurPlaybackControlsFragment : private var _binding: FragmentBlurPlayerPlaybackControlsBinding? = null private val binding get() = _binding!! - override val progressSlider: SeekBar + override val progressSlider: Slider get() = binding.progressSlider override val shuffleButton: ImageButton diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/card/CardPlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/card/CardPlaybackControlsFragment.kt index 830a7c6f3..7095fcbfe 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/card/CardPlaybackControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/card/CardPlaybackControlsFragment.kt @@ -18,7 +18,7 @@ import android.graphics.PorterDuff import android.os.Bundle import android.view.View import android.widget.ImageButton -import android.widget.SeekBar +import com.google.android.material.slider.Slider import android.widget.TextView import code.name.monkey.appthemehelper.ThemeStore import code.name.monkey.appthemehelper.util.ATHUtil @@ -27,10 +27,7 @@ import code.name.monkey.appthemehelper.util.MaterialValueHelper import code.name.monkey.appthemehelper.util.TintHelper import code.name.monkey.retromusic.R import code.name.monkey.retromusic.databinding.FragmentCardPlayerPlaybackControlsBinding -import code.name.monkey.retromusic.extensions.getSongInfo -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.extensions.* import code.name.monkey.retromusic.fragments.base.AbsPlayerControlsFragment import code.name.monkey.retromusic.fragments.base.goToAlbum import code.name.monkey.retromusic.fragments.base.goToArtist @@ -45,7 +42,7 @@ class CardPlaybackControlsFragment : private var _binding: FragmentCardPlayerPlaybackControlsBinding? = null private val binding get() = _binding!! - override val progressSlider: SeekBar + override val progressSlider: Slider get() = binding.progressSlider override val shuffleButton: ImageButton @@ -78,6 +75,9 @@ class CardPlaybackControlsFragment : binding.text.setOnClickListener { goToArtist(requireActivity()) } + binding.progressSlider.apply { + setCustomThumbDrawable(R.drawable.switch_square) + } } private fun updateSong() { diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/cardblur/CardBlurPlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/cardblur/CardBlurPlaybackControlsFragment.kt index 614bdc443..163d94864 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/cardblur/CardBlurPlaybackControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/cardblur/CardBlurPlaybackControlsFragment.kt @@ -19,7 +19,7 @@ import android.os.Bundle import android.view.View import android.view.animation.DecelerateInterpolator import android.widget.ImageButton -import android.widget.SeekBar +import com.google.android.material.slider.Slider import android.widget.TextView import code.name.monkey.appthemehelper.util.ColorUtil import code.name.monkey.appthemehelper.util.TintHelper @@ -41,7 +41,7 @@ class CardBlurPlaybackControlsFragment : private var _binding: FragmentCardBlurPlayerPlaybackControlsBinding? = null private val binding get() = _binding!! - override val progressSlider: SeekBar + override val progressSlider: Slider get() = binding.progressSlider override val shuffleButton: ImageButton diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/circle/CirclePlayerFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/circle/CirclePlayerFragment.kt index 186f29ec3..ac61c3b22 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/circle/CirclePlayerFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/circle/CirclePlayerFragment.kt @@ -25,7 +25,6 @@ import android.os.Bundle import android.view.View import android.view.animation.Animation import android.view.animation.LinearInterpolator -import android.widget.SeekBar import androidx.appcompat.widget.Toolbar import androidx.core.content.getSystemService import code.name.monkey.appthemehelper.ThemeStore @@ -49,13 +48,13 @@ import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.helper.MusicProgressViewUpdateHelper import code.name.monkey.retromusic.helper.MusicProgressViewUpdateHelper.Callback import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler -import code.name.monkey.retromusic.misc.SimpleOnSeekbarChangeListener import code.name.monkey.retromusic.util.MusicUtil import code.name.monkey.retromusic.util.PreferenceUtil import code.name.monkey.retromusic.util.ViewUtil import code.name.monkey.retromusic.util.color.MediaNotificationProcessor import code.name.monkey.retromusic.volume.AudioVolumeObserver import code.name.monkey.retromusic.volume.OnAudioVolumeChangedListener +import com.google.android.material.slider.Slider import me.tankery.lib.circularseekbar.CircularSeekBar /** @@ -78,6 +77,9 @@ class CirclePlayerFragment : AbsPlayerFragment(R.layout.fragment_circle_player), private var rotateAnimator: ObjectAnimator? = null private var lastRequest: GlideRequest? = null + private var progressAnimator: ObjectAnimator? = null + var isSeeking = false + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) progressViewUpdateHelper = MusicProgressViewUpdateHelper(this) @@ -113,11 +115,6 @@ class CirclePlayerFragment : AbsPlayerFragment(R.layout.fragment_circle_player), private fun setupViews() { setUpProgressSlider() - ViewUtil.setProgressDrawable( - binding.progressSlider, - ThemeStore.accentColor(requireContext()), - false - ) binding.volumeSeekBar.circleProgressColor = accentColor() binding.volumeSeekBar.circleColor = ColorUtil.withAlpha(accentColor(), 0.25f) setUpPlayPauseFab() @@ -135,7 +132,8 @@ class CirclePlayerFragment : AbsPlayerFragment(R.layout.fragment_circle_player), private fun setUpPrevNext() { updatePrevNextColor() binding.nextButton.setOnTouchListener(MusicSeekSkipTouchListener(requireActivity(), true)) - binding.previousButton.setOnTouchListener(MusicSeekSkipTouchListener(requireActivity(), false)) + binding.previousButton.setOnTouchListener(MusicSeekSkipTouchListener(requireActivity(), + false)) } private fun updatePrevNextColor() { @@ -275,7 +273,11 @@ class CirclePlayerFragment : AbsPlayerFragment(R.layout.fragment_circle_player), } - override fun onProgressChanged(circularSeekBar: CircularSeekBar?, progress: Float, fromUser: Boolean) { + override fun onProgressChanged( + circularSeekBar: CircularSeekBar?, + progress: Float, + fromUser: Boolean, + ) { val audioManager = audioManager audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, progress.toInt(), 0) } @@ -288,26 +290,43 @@ class CirclePlayerFragment : AbsPlayerFragment(R.layout.fragment_circle_player), private fun setUpProgressSlider() { binding.progressSlider.applyColor(accentColor()) - binding.progressSlider.setOnSeekBarChangeListener(object : SimpleOnSeekbarChangeListener() { - override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) { - if (fromUser) { - MusicPlayerRemote.seekTo(progress) - onUpdateProgressViews( - MusicPlayerRemote.songProgressMillis, - MusicPlayerRemote.songDurationMillis - ) - } + val progressSlider = binding.progressSlider + progressSlider.addOnChangeListener(Slider.OnChangeListener { _, value, fromUser -> + if (fromUser) { + onUpdateProgressViews( + value.toInt(), + MusicPlayerRemote.songDurationMillis + ) + } + }) + progressSlider.addOnSliderTouchListener(object : Slider.OnSliderTouchListener { + override fun onStartTrackingTouch(slider: Slider) { + isSeeking = true + progressViewUpdateHelper.stop() + } + + override fun onStopTrackingTouch(slider: Slider) { + isSeeking = false + MusicPlayerRemote.seekTo(slider.value.toInt()) + progressViewUpdateHelper.start() } }) } override fun onUpdateProgressViews(progress: Int, total: Int) { - binding.progressSlider.max = total + val progressSlider = binding.progressSlider + progressSlider.valueTo = total.toFloat() - val animator = ObjectAnimator.ofInt(binding.progressSlider, "progress", progress) - animator.duration = AbsPlayerControlsFragment.SLIDER_ANIMATION_TIME - animator.interpolator = LinearInterpolator() - animator.start() + if (isSeeking) { + progressSlider.value = progress.toFloat() + } else { + progressAnimator = + ObjectAnimator.ofFloat(progressSlider, "value", progress.toFloat()).apply { + duration = AbsPlayerControlsFragment.SLIDER_ANIMATION_TIME + interpolator = LinearInterpolator() + start() + } + } binding.songTotalTime.text = MusicUtil.getReadableDurationString(total.toLong()) binding.songCurrentProgress.text = MusicUtil.getReadableDurationString(progress.toLong()) diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/classic/ClassicPlayerFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/classic/ClassicPlayerFragment.kt index 99d7aad61..01bc4dd2e 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/classic/ClassicPlayerFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/classic/ClassicPlayerFragment.kt @@ -22,7 +22,6 @@ import android.graphics.PorterDuff import android.os.Bundle import android.view.View import android.view.animation.LinearInterpolator -import android.widget.SeekBar import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.widget.Toolbar import androidx.fragment.app.commit @@ -45,18 +44,17 @@ import code.name.monkey.retromusic.fragments.player.PlayerAlbumCoverFragment 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 code.name.monkey.retromusic.util.color.MediaNotificationProcessor import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetBehavior.from import com.google.android.material.card.MaterialCardView import com.google.android.material.shape.MaterialShapeDrawable import com.google.android.material.shape.ShapeAppearanceModel +import com.google.android.material.slider.Slider import com.h6ah4i.android.widget.advrecyclerview.animator.DraggableItemAnimator import com.h6ah4i.android.widget.advrecyclerview.draggable.RecyclerViewDragDropManager import com.h6ah4i.android.widget.advrecyclerview.swipeable.RecyclerViewSwipeManager @@ -83,9 +81,12 @@ class ClassicPlayerFragment : AbsPlayerFragment(R.layout.fragment_classic_player private var playingQueueAdapter: PlayingQueueAdapter? = null private lateinit var linearLayoutManager: LinearLayoutManager + private var progressAnimator: ObjectAnimator? = null + var isSeeking = false + private val bottomSheetCallbackList = object : BottomSheetBehavior.BottomSheetCallback() { override fun onSlide(bottomSheet: View, slideOffset: Float) { - mainActivity.getBottomSheetBehavior().isDraggable = false + mainActivity.getBottomSheetBehavior().isDraggable = false binding.playerQueueSheet.setContentPadding( binding.playerQueueSheet.contentPaddingLeft, (slideOffset * binding.statusBar.height).toInt(), @@ -99,7 +100,8 @@ class ClassicPlayerFragment : AbsPlayerFragment(R.layout.fragment_classic_player override fun onStateChanged(bottomSheet: View, newState: Int) { when (newState) { BottomSheetBehavior.STATE_EXPANDED, - BottomSheetBehavior.STATE_DRAGGING -> { + BottomSheetBehavior.STATE_DRAGGING, + -> { mainActivity.getBottomSheetBehavior().isDraggable = false } BottomSheetBehavior.STATE_COLLAPSED -> { @@ -161,6 +163,10 @@ class ClassicPlayerFragment : AbsPlayerFragment(R.layout.fragment_classic_player binding.text.setOnClickListener { goToArtist(requireActivity()) } + + binding.playerControlsContainer.progressSlider.apply { + setCustomThumbDrawable(R.drawable.switch_square) + } } private fun hideVolumeIfAvailable() { @@ -286,11 +292,8 @@ class ClassicPlayerFragment : AbsPlayerFragment(R.layout.fragment_classic_player binding.playerControlsContainer.songCurrentProgress.setTextColor(lastPlaybackControlsColor) binding.playerControlsContainer.songTotalTime.setTextColor(lastPlaybackControlsColor) - ViewUtil.setProgressDrawable( - binding.playerControlsContainer.progressSlider, - color.primaryTextColor, - true - ) + binding.playerControlsContainer.progressSlider.applyColor(color.primaryTextColor) + volumeFragment?.setTintableColor(color.primaryTextColor) TintHelper.setTintAuto( @@ -327,16 +330,20 @@ class ClassicPlayerFragment : AbsPlayerFragment(R.layout.fragment_classic_player } override fun onUpdateProgressViews(progress: Int, total: Int) { - binding.playerControlsContainer.progressSlider.max = total + val progressSlider = binding.playerControlsContainer.progressSlider + progressSlider.valueTo = total.toFloat() - val animator = ObjectAnimator.ofInt( - binding.playerControlsContainer.progressSlider, - "progress", - progress - ) - animator.duration = AbsPlayerControlsFragment.SLIDER_ANIMATION_TIME - animator.interpolator = LinearInterpolator() - animator.start() + if (isSeeking) { + progressSlider.value = progress.toFloat() + } else { + progressAnimator = + ObjectAnimator.ofFloat(progressSlider, "value", progress.toFloat()).apply { + duration = AbsPlayerControlsFragment.SLIDER_ANIMATION_TIME + interpolator = LinearInterpolator() + start() + } + + } binding.playerControlsContainer.songTotalTime.text = MusicUtil.getReadableDurationString(total.toLong()) @@ -416,16 +423,25 @@ class ClassicPlayerFragment : AbsPlayerFragment(R.layout.fragment_classic_player } private fun setUpProgressSlider() { - binding.playerControlsContainer.progressSlider.setOnSeekBarChangeListener(object : - SimpleOnSeekbarChangeListener() { - override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) { - if (fromUser) { - MusicPlayerRemote.seekTo(progress) - onUpdateProgressViews( - MusicPlayerRemote.songProgressMillis, - MusicPlayerRemote.songDurationMillis - ) - } + val progressSlider = binding.playerControlsContainer.progressSlider + progressSlider.addOnChangeListener(Slider.OnChangeListener { _, value, fromUser -> + if (fromUser) { + onUpdateProgressViews( + value.toInt(), + MusicPlayerRemote.songDurationMillis + ) + } + }) + progressSlider.addOnSliderTouchListener(object : Slider.OnSliderTouchListener { + override fun onStartTrackingTouch(slider: Slider) { + isSeeking = true + progressViewUpdateHelper.stop() + } + + override fun onStopTrackingTouch(slider: Slider) { + isSeeking = false + MusicPlayerRemote.seekTo(slider.value.toInt()) + progressViewUpdateHelper.start() } }) } @@ -537,7 +553,7 @@ class ClassicPlayerFragment : AbsPlayerFragment(R.layout.fragment_classic_player oldLeft: Int, oldTop: Int, oldRight: Int, - oldBottom: Int + oldBottom: Int, ) { val height = binding.playerContainer.height val width = binding.playerContainer.width diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/color/ColorPlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/color/ColorPlaybackControlsFragment.kt index 60c7d0a85..6a129366e 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/color/ColorPlaybackControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/color/ColorPlaybackControlsFragment.kt @@ -22,7 +22,7 @@ import android.view.ViewAnimationUtils import android.view.animation.AccelerateInterpolator import android.view.animation.DecelerateInterpolator import android.widget.ImageButton -import android.widget.SeekBar +import com.google.android.material.slider.Slider import android.widget.TextView import code.name.monkey.appthemehelper.util.ColorUtil import code.name.monkey.appthemehelper.util.TintHelper @@ -46,7 +46,7 @@ class ColorPlaybackControlsFragment : private var _binding: FragmentColorPlayerPlaybackControlsBinding? = null private val binding get() = _binding!! - override val progressSlider: SeekBar + override val progressSlider: Slider get() = binding.progressSlider override val shuffleButton: ImageButton diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/fit/FitPlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/fit/FitPlaybackControlsFragment.kt index f1256ddcb..006138c3c 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/fit/FitPlaybackControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/fit/FitPlaybackControlsFragment.kt @@ -18,7 +18,6 @@ import android.os.Bundle import android.view.View import android.view.animation.DecelerateInterpolator import android.widget.ImageButton -import android.widget.SeekBar import android.widget.TextView import code.name.monkey.appthemehelper.ThemeStore import code.name.monkey.appthemehelper.util.ColorUtil @@ -33,6 +32,8 @@ import code.name.monkey.retromusic.fragments.base.goToArtist import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.util.PreferenceUtil import code.name.monkey.retromusic.util.color.MediaNotificationProcessor +import com.google.android.material.slider.Slider +import java.lang.reflect.Field class FitPlaybackControlsFragment : AbsPlayerControlsFragment(R.layout.fragment_fit_playback_controls) { @@ -40,7 +41,7 @@ class FitPlaybackControlsFragment : private var _binding: FragmentFitPlaybackControlsBinding? = null private val binding get() = _binding!! - override val progressSlider: SeekBar + override val progressSlider: Slider get() = binding.progressSlider override val shuffleButton: ImageButton @@ -75,6 +76,18 @@ class FitPlaybackControlsFragment : binding.text.setOnClickListener { goToArtist(requireActivity()) } + binding.progressSlider.apply { + setCustomThumbDrawable(R.drawable.switch_square) + } + val field: Field = Slider::class.java.superclass.getDeclaredField("trackSidePadding") + + field.isAccessible = true + + field.set(binding.progressSlider, 0) + + binding.progressSlider.invalidate() + + } private fun updateSong() { diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/flat/FlatPlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/flat/FlatPlaybackControlsFragment.kt index 845df16f8..5b21f5f07 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/flat/FlatPlaybackControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/flat/FlatPlaybackControlsFragment.kt @@ -18,7 +18,7 @@ import android.os.Bundle import android.view.View import android.view.animation.DecelerateInterpolator import android.widget.ImageButton -import android.widget.SeekBar +import com.google.android.material.slider.Slider import android.widget.TextView import code.name.monkey.appthemehelper.ThemeStore import code.name.monkey.appthemehelper.util.ATHUtil @@ -43,7 +43,7 @@ class FlatPlaybackControlsFragment : private var _binding: FragmentFlatPlayerPlaybackControlsBinding? = null private val binding get() = _binding!! - override val progressSlider: SeekBar + override val progressSlider: Slider get() = binding.progressSlider override val shuffleButton: ImageButton diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/full/FullPlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/full/FullPlaybackControlsFragment.kt index a06c753ca..9bbe3bf7f 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/full/FullPlaybackControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/full/FullPlaybackControlsFragment.kt @@ -23,7 +23,7 @@ import android.view.MenuItem import android.view.View import android.view.animation.DecelerateInterpolator import android.widget.ImageButton -import android.widget.SeekBar +import com.google.android.material.slider.Slider import android.widget.TextView import androidx.appcompat.widget.PopupMenu import androidx.lifecycle.lifecycleScope @@ -62,7 +62,7 @@ class FullPlaybackControlsFragment : private var _binding: FragmentFullPlayerControlsBinding? = null private val binding get() = _binding!! - override val progressSlider: SeekBar + override val progressSlider: Slider get() = binding.progressSlider override val shuffleButton: ImageButton diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/gradient/GradientPlayerFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/gradient/GradientPlayerFragment.kt index 6a1dddedf..048751906 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/gradient/GradientPlayerFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/gradient/GradientPlayerFragment.kt @@ -23,7 +23,6 @@ import android.graphics.drawable.AnimatedVectorDrawable import android.os.Bundle import android.view.View import android.view.animation.LinearInterpolator -import android.widget.SeekBar import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.widget.PopupMenu import androidx.appcompat.widget.Toolbar @@ -50,13 +49,13 @@ import code.name.monkey.retromusic.fragments.other.VolumeFragment 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.service.MusicService import code.name.monkey.retromusic.util.MusicUtil import code.name.monkey.retromusic.util.PreferenceUtil import code.name.monkey.retromusic.util.color.MediaNotificationProcessor import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetBehavior.* +import com.google.android.material.slider.Slider import com.h6ah4i.android.widget.advrecyclerview.animator.DraggableItemAnimator import com.h6ah4i.android.widget.advrecyclerview.draggable.RecyclerViewDragDropManager import com.h6ah4i.android.widget.advrecyclerview.swipeable.RecyclerViewSwipeManager @@ -85,6 +84,9 @@ class GradientPlayerFragment : AbsPlayerFragment(R.layout.fragment_gradient_play private var _binding: FragmentGradientPlayerBinding? = null private val binding get() = _binding!! + private var progressAnimator: ObjectAnimator? = null + var isSeeking = false + private val bottomSheetCallbackList = object : BottomSheetCallback() { override fun onSlide(bottomSheet: View, slideOffset: Float) { mainActivity.getBottomSheetBehavior().isDraggable = false @@ -544,30 +546,43 @@ class GradientPlayerFragment : AbsPlayerFragment(R.layout.fragment_gradient_play } private fun setUpProgressSlider() { - binding.playbackControlsFragment.progressSlider.setOnSeekBarChangeListener(object : - SimpleOnSeekbarChangeListener() { - override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) { - if (fromUser) { - MusicPlayerRemote.seekTo(progress) - onUpdateProgressViews( - MusicPlayerRemote.songProgressMillis, - MusicPlayerRemote.songDurationMillis - ) - } + val progressSlider = binding.playbackControlsFragment.progressSlider + progressSlider.addOnChangeListener(Slider.OnChangeListener { _, value, fromUser -> + if (fromUser) { + onUpdateProgressViews( + value.toInt(), + MusicPlayerRemote.songDurationMillis + ) + } + }) + progressSlider.addOnSliderTouchListener(object : Slider.OnSliderTouchListener { + override fun onStartTrackingTouch(slider: Slider) { + isSeeking = true + progressViewUpdateHelper.stop() + } + + override fun onStopTrackingTouch(slider: Slider) { + isSeeking = false + MusicPlayerRemote.seekTo(slider.value.toInt()) + progressViewUpdateHelper.start() } }) } override fun onUpdateProgressViews(progress: Int, total: Int) { - binding.playbackControlsFragment.progressSlider.max = total - val animator = ObjectAnimator.ofInt( - binding.playbackControlsFragment.progressSlider, - "progress", - progress - ) - animator.duration = AbsPlayerControlsFragment.SLIDER_ANIMATION_TIME - animator.interpolator = LinearInterpolator() - animator.start() + val progressSlider = binding.playbackControlsFragment.progressSlider + progressSlider.valueTo = total.toFloat() + + if (isSeeking) { + progressSlider.value = progress.toFloat() + } else { + progressAnimator = + ObjectAnimator.ofFloat(progressSlider, "value", progress.toFloat()).apply { + duration = AbsPlayerControlsFragment.SLIDER_ANIMATION_TIME + interpolator = LinearInterpolator() + start() + } + } binding.playbackControlsFragment.songTotalTime.text = MusicUtil.getReadableDurationString(total.toLong()) binding.playbackControlsFragment.songCurrentProgress.text = diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/lockscreen/LockScreenControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/lockscreen/LockScreenControlsFragment.kt index d970908b5..75a188c2c 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/lockscreen/LockScreenControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/lockscreen/LockScreenControlsFragment.kt @@ -18,7 +18,7 @@ import android.os.Bundle import android.view.View import android.view.animation.DecelerateInterpolator import android.widget.ImageButton -import android.widget.SeekBar +import com.google.android.material.slider.Slider import android.widget.TextView import code.name.monkey.appthemehelper.util.ATHUtil import code.name.monkey.appthemehelper.util.ColorUtil @@ -44,7 +44,7 @@ class LockScreenControlsFragment : private var _binding: FragmentLockScreenPlaybackControlsBinding? = null private val binding get() = _binding!! - override val progressSlider: SeekBar + override val progressSlider: Slider get() = binding.progressSlider override val shuffleButton: ImageButton diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/material/MaterialControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/material/MaterialControlsFragment.kt index dd19448b9..11c9d6275 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/material/MaterialControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/material/MaterialControlsFragment.kt @@ -18,7 +18,7 @@ import android.graphics.PorterDuff import android.os.Bundle import android.view.View import android.widget.ImageButton -import android.widget.SeekBar +import com.google.android.material.slider.Slider import android.widget.TextView import androidx.core.content.ContextCompat import code.name.monkey.appthemehelper.util.ATHUtil @@ -44,7 +44,7 @@ class MaterialControlsFragment : private var _binding: FragmentMaterialPlaybackControlsBinding? = null private val binding get() = _binding!! - override val progressSlider: SeekBar + override val progressSlider: Slider get() = binding.progressSlider override val shuffleButton: ImageButton diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/md3/MD3PlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/md3/MD3PlaybackControlsFragment.kt index 8834ef119..cbb03e026 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/md3/MD3PlaybackControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/md3/MD3PlaybackControlsFragment.kt @@ -17,7 +17,7 @@ package code.name.monkey.retromusic.fragments.player.md3 import android.os.Bundle import android.view.View import android.widget.ImageButton -import android.widget.SeekBar +import com.google.android.material.slider.Slider import android.widget.TextView import code.name.monkey.appthemehelper.util.ATHUtil import code.name.monkey.appthemehelper.util.ColorUtil @@ -40,7 +40,7 @@ class MD3PlaybackControlsFragment : private var _binding: FragmentMd3PlayerPlaybackControlsBinding? = null private val binding get() = _binding!! - override val progressSlider: SeekBar + override val progressSlider: Slider get() = binding.progressSlider override val shuffleButton: ImageButton diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/normal/PlayerPlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/normal/PlayerPlaybackControlsFragment.kt index 513160eea..1032f21db 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/normal/PlayerPlaybackControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/normal/PlayerPlaybackControlsFragment.kt @@ -18,7 +18,7 @@ import android.os.Bundle import android.view.View import android.view.animation.DecelerateInterpolator import android.widget.ImageButton -import android.widget.SeekBar +import com.google.android.material.slider.Slider import android.widget.TextView import code.name.monkey.appthemehelper.ThemeStore import code.name.monkey.appthemehelper.util.ATHUtil @@ -41,7 +41,7 @@ class PlayerPlaybackControlsFragment : private var _binding: FragmentPlayerPlaybackControlsBinding? = null private val binding get() = _binding!! - override val progressSlider: SeekBar + override val progressSlider: Slider get() = binding.progressSlider override val shuffleButton: ImageButton diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/peek/PeekPlayerControlFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/peek/PeekPlayerControlFragment.kt index dd02d92ac..ffe19799d 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/peek/PeekPlayerControlFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/peek/PeekPlayerControlFragment.kt @@ -19,7 +19,7 @@ import android.graphics.PorterDuff import android.os.Bundle import android.view.View import android.widget.ImageButton -import android.widget.SeekBar +import com.google.android.material.slider.Slider import android.widget.TextView import code.name.monkey.appthemehelper.ThemeStore import code.name.monkey.appthemehelper.util.ATHUtil @@ -43,7 +43,7 @@ class PeekPlayerControlFragment : AbsPlayerControlsFragment(R.layout.fragment_pe private var _binding: FragmentPeekControlPlayerBinding? = null private val binding get() = _binding!! - override val progressSlider: SeekBar + override val progressSlider: Slider get() = binding.progressSlider override val shuffleButton: ImageButton diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/plain/PlainPlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/plain/PlainPlaybackControlsFragment.kt index d76958040..b1643ca5d 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/plain/PlainPlaybackControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/plain/PlainPlaybackControlsFragment.kt @@ -18,7 +18,6 @@ import android.os.Bundle import android.view.View import android.view.animation.DecelerateInterpolator import android.widget.ImageButton -import android.widget.SeekBar import android.widget.TextView import code.name.monkey.appthemehelper.ThemeStore import code.name.monkey.appthemehelper.util.ATHUtil @@ -35,6 +34,7 @@ import code.name.monkey.retromusic.fragments.base.AbsPlayerControlsFragment import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.util.PreferenceUtil import code.name.monkey.retromusic.util.color.MediaNotificationProcessor +import com.google.android.material.slider.Slider /** * @author Hemanth S (h4h13). @@ -46,7 +46,7 @@ class PlainPlaybackControlsFragment : private var _binding: FragmentPlainControlsFragmentBinding? = null private val binding get() = _binding!! - override val progressSlider: SeekBar + override val progressSlider: Slider get() = binding.progressSlider override val shuffleButton: ImageButton diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/search/SearchFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/search/SearchFragment.kt index eced42489..7a684f252 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/search/SearchFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/search/SearchFragment.kt @@ -29,17 +29,12 @@ import androidx.core.widget.doAfterTextChanged import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import androidx.transition.TransitionManager -import code.name.monkey.appthemehelper.ThemeStore import code.name.monkey.retromusic.R import code.name.monkey.retromusic.adapter.SearchAdapter import code.name.monkey.retromusic.databinding.FragmentSearchBinding -import code.name.monkey.retromusic.extensions.accentColor -import code.name.monkey.retromusic.extensions.dipToPix -import code.name.monkey.retromusic.extensions.focusAndShowKeyboard -import code.name.monkey.retromusic.extensions.showToast +import code.name.monkey.retromusic.extensions.* import code.name.monkey.retromusic.fragments.base.AbsMainActivityFragment import code.name.monkey.retromusic.util.PreferenceUtil -import code.name.monkey.retromusic.views.addAlpha import com.google.android.material.chip.Chip import com.google.android.material.chip.ChipGroup import com.google.android.material.shape.MaterialShapeDrawable @@ -133,7 +128,7 @@ class SearchFragment : AbsMainActivityFragment(R.layout.fragment_search), val colors = intArrayOf( android.R.color.transparent, - ThemeStore.accentColor(requireContext()).addAlpha(0.5F) + accentColor().addAlpha(0.5F) ) chips.forEach { diff --git a/app/src/main/java/code/name/monkey/retromusic/service/MediaSessionCallback.kt b/app/src/main/java/code/name/monkey/retromusic/service/MediaSessionCallback.kt index 685d533cc..609bbf937 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/MediaSessionCallback.kt +++ b/app/src/main/java/code/name/monkey/retromusic/service/MediaSessionCallback.kt @@ -166,7 +166,7 @@ class MediaSessionCallback( override fun onSkipToPrevious() { super.onSkipToPrevious() - musicService.back(true) + musicService.playPreviousSong(true) } override fun onStop() { diff --git a/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt b/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt index 25d37752f..54c5f35b0 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt +++ b/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt @@ -204,8 +204,14 @@ class MusicService : MediaBrowserServiceCompat(), private val updateFavoriteReceiver = object : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { isCurrentFavorite { isFavorite -> - playingNotification?.updateFavorite(isFavorite) - startForegroundOrNotify() + if (!isForeground) { + playingNotification?.updateMetadata(currentSong) { + playingNotification?.setPlaying(isPlaying) + playingNotification?.updateFavorite(isFavorite) + startForegroundOrNotify() + } + } + appWidgetCircle.notifyChange(this@MusicService, FAVORITE_STATE_CHANGED) } } @@ -676,6 +682,7 @@ class MusicService : MediaBrowserServiceCompat(), } override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { + startForegroundOrNotify() if (intent != null && intent.action != null) { handleIntent(mediaSession, intent) serviceScope.launch { diff --git a/app/src/main/java/code/name/monkey/retromusic/views/BottomNavigationBarTinted.kt b/app/src/main/java/code/name/monkey/retromusic/views/BottomNavigationBarTinted.kt index ada01196a..0e5ddb455 100644 --- a/app/src/main/java/code/name/monkey/retromusic/views/BottomNavigationBarTinted.kt +++ b/app/src/main/java/code/name/monkey/retromusic/views/BottomNavigationBarTinted.kt @@ -21,6 +21,7 @@ import code.name.monkey.appthemehelper.ThemeStore import code.name.monkey.appthemehelper.util.ATHUtil import code.name.monkey.appthemehelper.util.ColorUtil import code.name.monkey.appthemehelper.util.NavigationViewUtil +import code.name.monkey.retromusic.extensions.addAlpha import code.name.monkey.retromusic.util.PreferenceUtil import com.google.android.material.bottomnavigation.BottomNavigationView import dev.chrisbanes.insetter.applyInsetter @@ -69,8 +70,4 @@ class BottomNavigationBarTinted @JvmOverloads constructor( } } } -} - -fun Int.addAlpha(alpha: Float): Int { - return ColorUtil.withAlpha(this, alpha) -} +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_sleep_timer.xml b/app/src/main/res/drawable/ic_sleep_timer.xml index e5ff2f862..62c546fc2 100644 --- a/app/src/main/res/drawable/ic_sleep_timer.xml +++ b/app/src/main/res/drawable/ic_sleep_timer.xml @@ -4,6 +4,6 @@ android:viewportWidth="24" android:viewportHeight="24"> diff --git a/app/src/main/res/layout-land/activity_drive_mode.xml b/app/src/main/res/layout-land/activity_drive_mode.xml index decfc02b6..90f895cef 100644 --- a/app/src/main/res/layout-land/activity_drive_mode.xml +++ b/app/src/main/res/layout-land/activity_drive_mode.xml @@ -172,14 +172,12 @@ - \ No newline at end of file diff --git a/app/src/main/res/layout-land/fragment_circle_player.xml b/app/src/main/res/layout-land/fragment_circle_player.xml index f0b8e8151..ef1ceb2b9 100644 --- a/app/src/main/res/layout-land/fragment_circle_player.xml +++ b/app/src/main/res/layout-land/fragment_circle_player.xml @@ -178,11 +178,11 @@ app:layout_constraintTop_toBottomOf="@+id/titleContainer" tools:text="@tools:sample/lorem/random" /> - diff --git a/app/src/main/res/layout/activity_drive_mode.xml b/app/src/main/res/layout/activity_drive_mode.xml index 23849de05..0ef554144 100644 --- a/app/src/main/res/layout/activity_drive_mode.xml +++ b/app/src/main/res/layout/activity_drive_mode.xml @@ -177,17 +177,12 @@ tools:text="@tools:sample/lorem/random" /> - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_adaptive_player_playback_controls.xml b/app/src/main/res/layout/fragment_adaptive_player_playback_controls.xml index c1bfa3b20..d758dbdca 100644 --- a/app/src/main/res/layout/fragment_adaptive_player_playback_controls.xml +++ b/app/src/main/res/layout/fragment_adaptive_player_playback_controls.xml @@ -4,8 +4,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - android:orientation="vertical" - tools:ignore="MissingPrefix"> + android:orientation="vertical"> - @@ -45,7 +42,6 @@ app:layout_constraintBottom_toBottomOf="@+id/progressSlider" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="@id/progressSlider" - tools:ignore="RtlHardcoded,RtlSymmetry" tools:text="@tools:sample/date/hhmmss" /> - - - + app:haloRadius="0dp" + app:trackHeight="20dp" + android:layout_weight="1"/> diff --git a/app/src/main/res/layout/fragment_circle_player.xml b/app/src/main/res/layout/fragment_circle_player.xml index 06561900a..702b26ca3 100644 --- a/app/src/main/res/layout/fragment_circle_player.xml +++ b/app/src/main/res/layout/fragment_circle_player.xml @@ -169,11 +169,11 @@ app:layout_constraintTop_toBottomOf="@+id/volumeSeekBar" /> - - + android:layout_toStartOf="@id/songTotalTime" + android:layout_toEndOf="@id/songCurrentProgress" /> diff --git a/app/src/main/res/layout/fragment_color_player_playback_controls.xml b/app/src/main/res/layout/fragment_color_player_playback_controls.xml index 207b52bf6..6118d2b6f 100644 --- a/app/src/main/res/layout/fragment_color_player_playback_controls.xml +++ b/app/src/main/res/layout/fragment_color_player_playback_controls.xml @@ -19,16 +19,15 @@ app:layout_constraintBottom_toBottomOf="@+id/progressSlider" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="@id/progressSlider" - tools:ignore="RtlHardcoded,RtlSymmetry" tools:text="@tools:sample/date/hhmmss" /> - - + app:layout_constraintTop_toTopOf="parent" + app:trackHeight="@dimen/progress_container_height" /> @@ -165,7 +167,6 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="8dp" - android:background="?attr/roundSelector" app:layout_constraintBottom_toTopOf="@+id/volumeFragmentContainer" app:layout_constraintEnd_toStartOf="@+id/nextButton" app:layout_constraintHorizontal_bias="0.5" diff --git a/app/src/main/res/layout/fragment_flat_player_playback_controls.xml b/app/src/main/res/layout/fragment_flat_player_playback_controls.xml index d75ebdf95..4066ba1da 100644 --- a/app/src/main/res/layout/fragment_flat_player_playback_controls.xml +++ b/app/src/main/res/layout/fragment_flat_player_playback_controls.xml @@ -19,16 +19,14 @@ app:layout_constraintBottom_toBottomOf="@+id/progressSlider" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="@id/progressSlider" - tools:ignore="RtlHardcoded,RtlSymmetry" tools:text="@tools:sample/date/hhmmss" /> - diff --git a/app/src/main/res/layout/fragment_full_player_controls.xml b/app/src/main/res/layout/fragment_full_player_controls.xml index 7e3828311..f5b4f017e 100644 --- a/app/src/main/res/layout/fragment_full_player_controls.xml +++ b/app/src/main/res/layout/fragment_full_player_controls.xml @@ -90,16 +90,15 @@ app:layout_constraintBottom_toBottomOf="@+id/progressSlider" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="@id/progressSlider" - tools:ignore="RtlHardcoded,RtlSymmetry" tools:text="@tools:sample/date/hhmmss" /> - diff --git a/app/src/main/res/layout/fragment_gradient_controls.xml b/app/src/main/res/layout/fragment_gradient_controls.xml index 59f4ff77e..422b93e38 100644 --- a/app/src/main/res/layout/fragment_gradient_controls.xml +++ b/app/src/main/res/layout/fragment_gradient_controls.xml @@ -93,15 +93,14 @@ app:layout_constraintBottom_toBottomOf="@+id/progressSlider" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="@id/progressSlider" - tools:ignore="RtlHardcoded,RtlSymmetry" tools:text="@tools:sample/date/hhmmss" /> - diff --git a/app/src/main/res/layout/fragment_lock_screen_playback_controls.xml b/app/src/main/res/layout/fragment_lock_screen_playback_controls.xml index f4808a1b2..377c55700 100644 --- a/app/src/main/res/layout/fragment_lock_screen_playback_controls.xml +++ b/app/src/main/res/layout/fragment_lock_screen_playback_controls.xml @@ -21,16 +21,15 @@ app:layout_constraintBottom_toBottomOf="@+id/progressSlider" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="@id/progressSlider" - tools:ignore="RtlHardcoded,RtlSymmetry" tools:text="@tools:sample/date/hhmmss" /> - - diff --git a/app/src/main/res/layout/fragment_md3_player_playback_controls.xml b/app/src/main/res/layout/fragment_md3_player_playback_controls.xml index a1ac4c979..8785702fb 100644 --- a/app/src/main/res/layout/fragment_md3_player_playback_controls.xml +++ b/app/src/main/res/layout/fragment_md3_player_playback_controls.xml @@ -21,10 +21,9 @@ app:layout_constraintBottom_toBottomOf="@+id/progressSlider" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="@id/progressSlider" - tools:ignore="RtlHardcoded,RtlSymmetry" tools:text="@tools:sample/date/hhmmss" /> - - - + app:layout_constraintTop_toBottomOf="@id/playbackControlsFragment" /> \ 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 e06479a26..13194a9ab 100755 --- a/app/src/main/res/layout/fragment_player_playback_controls.xml +++ b/app/src/main/res/layout/fragment_player_playback_controls.xml @@ -19,16 +19,14 @@ app:layout_constraintBottom_toBottomOf="@+id/progressSlider" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="@id/progressSlider" - tools:ignore="RtlHardcoded,RtlSymmetry" tools:text="@tools:sample/date/hhmmss" /> - - 50% + + From f916a826b575cc98b7c0a803cc9dc987e6d9b38a Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Tue, 24 May 2022 12:14:42 +0530 Subject: [PATCH 051/280] Fixed UserInfo fragment for Landscape --- app/build.gradle | 2 +- .../res/layout-land/fragment_user_info.xml | 99 +++++++++++++++++++ .../main/res/layout/fragment_user_info.xml | 16 ++- 3 files changed, 107 insertions(+), 10 deletions(-) create mode 100644 app/src/main/res/layout-land/fragment_user_info.xml diff --git a/app/build.gradle b/app/build.gradle index 1e6fccc93..5a8e5a29c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -14,7 +14,7 @@ android { vectorDrawables.useSupportLibrary = true applicationId "code.name.monkey.retromusic" - versionCode 10582 + versionCode 10583 versionName '5.9.0' buildConfigField("String", "GOOGLE_PLAY_LICENSING_KEY", "\"${getProperty(getProperties('../public.properties'), 'GOOGLE_PLAY_LICENSE_KEY')}\"") diff --git a/app/src/main/res/layout-land/fragment_user_info.xml b/app/src/main/res/layout-land/fragment_user_info.xml new file mode 100644 index 000000000..05d9a3ef8 --- /dev/null +++ b/app/src/main/res/layout-land/fragment_user_info.xml @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_user_info.xml b/app/src/main/res/layout/fragment_user_info.xml index f355c0bd8..ac0193df6 100644 --- a/app/src/main/res/layout/fragment_user_info.xml +++ b/app/src/main/res/layout/fragment_user_info.xml @@ -35,11 +35,11 @@ android:layout_height="0dp" android:layout_margin="16dp" android:scaleType="centerCrop" + android:transitionName="banner_image" app:layout_constraintDimensionRatio="21:10" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" - android:transitionName="banner_image" app:shapeAppearanceOverlay="@style/circleImageView" app:srcCompat="@drawable/material_design_default" /> @@ -86,15 +86,13 @@ - + android:src="@drawable/ic_save" + android:text="@string/save" /> \ No newline at end of file From ca39b928bbd5eb9e59f5f614160acb38a6b2c8e1 Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Tue, 24 May 2022 18:18:03 +0530 Subject: [PATCH 052/280] Reverted to SeekBars for Card, Classic, Fit and Flat now playing theme --- .../tageditor/AbsTagEditorActivity.kt | 1 - .../base/AbsPlayerControlsFragment.kt | 87 ++++++++++++++----- .../AdaptivePlaybackControlsFragment.kt | 2 +- .../card/CardPlaybackControlsFragment.kt | 9 +- .../player/circle/CirclePlayerFragment.kt | 4 +- .../player/classic/ClassicPlayerFragment.kt | 74 +++++++--------- .../player/fit/FitPlaybackControlsFragment.kt | 19 +--- .../flat/FlatPlaybackControlsFragment.kt | 7 +- .../normal/PlayerPlaybackControlsFragment.kt | 2 +- .../player/peek/PeekPlayerControlFragment.kt | 3 +- .../plain/PlainPlaybackControlsFragment.kt | 8 +- .../simple/SimplePlaybackControlsFragment.kt | 4 +- ...fragment_card_player_playback_controls.xml | 12 ++- .../res/layout/fragment_classic_controls.xml | 11 +-- .../layout/fragment_fit_playback_controls.xml | 16 ++-- ...fragment_flat_player_playback_controls.xml | 11 ++- .../fragment_md3_player_playback_controls.xml | 3 +- 17 files changed, 136 insertions(+), 137 deletions(-) diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/tageditor/AbsTagEditorActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/tageditor/AbsTagEditorActivity.kt index 2006ad249..561eaaf73 100755 --- a/app/src/main/java/code/name/monkey/retromusic/activities/tageditor/AbsTagEditorActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/tageditor/AbsTagEditorActivity.kt @@ -277,7 +277,6 @@ abstract class AbsTagEditorActivity : AbsBaseActivity() { scaleY = 0f isEnabled = false setOnClickListener { save() } - TintHelper.setTintAuto(this, ThemeStore.accentColor(this@AbsTagEditorActivity), true) } } diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsPlayerControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsPlayerControlsFragment.kt index 7228bf4b6..677b38b5b 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsPlayerControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsPlayerControlsFragment.kt @@ -23,6 +23,7 @@ import android.view.animation.AccelerateInterpolator import android.view.animation.DecelerateInterpolator import android.view.animation.LinearInterpolator import android.widget.ImageButton +import android.widget.SeekBar import android.widget.TextView import androidx.annotation.LayoutRes import androidx.core.view.isVisible @@ -57,11 +58,12 @@ abstract class AbsPlayerControlsFragment(@LayoutRes layout: Int) : AbsMusicServi var lastDisabledPlaybackControlsColor: Int = 0 - var isSeeking = false - private set + private var isSeeking = false open val progressSlider: Slider? = null + open val seekBar: SeekBar? = null + abstract val shuffleButton: ImageButton abstract val repeatButton: ImageButton @@ -77,18 +79,34 @@ abstract class AbsPlayerControlsFragment(@LayoutRes layout: Int) : AbsMusicServi private var progressAnimator: ObjectAnimator? = null override fun onUpdateProgressViews(progress: Int, total: Int) { - progressSlider?.valueTo = total.toFloat() + if (seekBar == null) { + progressSlider?.valueTo = total.toFloat() - if (isSeeking) { - progressSlider?.value = progress.toFloat() + if (isSeeking) { + progressSlider?.value = progress.toFloat() + } else { + progressAnimator = + ObjectAnimator.ofFloat(progressSlider, "value", progress.toFloat()).apply { + duration = SLIDER_ANIMATION_TIME + interpolator = LinearInterpolator() + start() + } + + } } else { - progressAnimator = - ObjectAnimator.ofFloat(progressSlider, "value", progress.toFloat()).apply { - duration = SLIDER_ANIMATION_TIME - interpolator = LinearInterpolator() - start() - } + seekBar?.max = total + if (isSeeking) { + seekBar?.progress = progress + } else { + progressAnimator = + ObjectAnimator.ofInt(seekBar, "progress", progress).apply { + duration = SLIDER_ANIMATION_TIME + interpolator = LinearInterpolator() + start() + } + + } } songTotalTime?.text = MusicUtil.getReadableDurationString(total.toLong()) songCurrentProgress?.text = MusicUtil.getReadableDurationString(progress.toLong()) @@ -96,26 +114,49 @@ abstract class AbsPlayerControlsFragment(@LayoutRes layout: Int) : AbsMusicServi private fun setUpProgressSlider() { progressSlider?.addOnChangeListener(Slider.OnChangeListener { _, value, fromUser -> - if (fromUser) { - onUpdateProgressViews( - value.toInt(), - MusicPlayerRemote.songDurationMillis - ) - } + onProgressChange(value.toInt(), fromUser) }) progressSlider?.addOnSliderTouchListener(object : Slider.OnSliderTouchListener { override fun onStartTrackingTouch(slider: Slider) { - isSeeking = true - progressViewUpdateHelper.stop() - progressAnimator?.cancel() + onStartTrackingTouch() } override fun onStopTrackingTouch(slider: Slider) { - isSeeking = false - MusicPlayerRemote.seekTo(slider.value.toInt()) - progressViewUpdateHelper.start() + onStopTrackingTouch(slider.value.toInt()) } }) + + seekBar?.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener { + override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { + onProgressChange(progress, fromUser) + } + + override fun onStartTrackingTouch(seekBar: SeekBar?) { + onStartTrackingTouch() + } + + override fun onStopTrackingTouch(seekBar: SeekBar?) { + onStopTrackingTouch(seekBar?.progress ?: 0) + } + }) + } + + private fun onProgressChange(value: Int, fromUser: Boolean) { + if (fromUser) { + onUpdateProgressViews(value, MusicPlayerRemote.songDurationMillis) + } + } + + private fun onStartTrackingTouch() { + isSeeking = true + progressViewUpdateHelper.stop() + progressAnimator?.cancel() + } + + private fun onStopTrackingTouch(value: Int) { + isSeeking = false + MusicPlayerRemote.seekTo(value) + progressViewUpdateHelper.start() } private lateinit var progressViewUpdateHelper: MusicProgressViewUpdateHelper diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/adaptive/AdaptivePlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/adaptive/AdaptivePlaybackControlsFragment.kt index a6d0bd5e6..0d2da763f 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/adaptive/AdaptivePlaybackControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/adaptive/AdaptivePlaybackControlsFragment.kt @@ -124,7 +124,7 @@ class AdaptivePlaybackControlsFragment : val colorFinal = if (PreferenceUtil.isAdaptiveColor) { color.primaryTextColor } else { - ThemeStore.accentColor(requireContext()) + accentColor() }.ripAlpha() TintHelper.setTintAuto( diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/card/CardPlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/card/CardPlaybackControlsFragment.kt index 7095fcbfe..11ad94139 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/card/CardPlaybackControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/card/CardPlaybackControlsFragment.kt @@ -18,7 +18,7 @@ import android.graphics.PorterDuff import android.os.Bundle import android.view.View import android.widget.ImageButton -import com.google.android.material.slider.Slider +import android.widget.SeekBar import android.widget.TextView import code.name.monkey.appthemehelper.ThemeStore import code.name.monkey.appthemehelper.util.ATHUtil @@ -42,7 +42,7 @@ class CardPlaybackControlsFragment : private var _binding: FragmentCardPlayerPlaybackControlsBinding? = null private val binding get() = _binding!! - override val progressSlider: Slider + override val seekBar: SeekBar get() = binding.progressSlider override val shuffleButton: ImageButton @@ -75,9 +75,6 @@ class CardPlaybackControlsFragment : binding.text.setOnClickListener { goToArtist(requireActivity()) } - binding.progressSlider.apply { - setCustomThumbDrawable(R.drawable.switch_square) - } } private fun updateSong() { @@ -138,7 +135,7 @@ class CardPlaybackControlsFragment : val colorFinal = if (PreferenceUtil.isAdaptiveColor) { color.primaryTextColor } else { - ThemeStore.accentColor(requireContext()).ripAlpha() + accentColor().ripAlpha() } binding.image.setColorFilter(colorFinal, PorterDuff.Mode.SRC_IN) TintHelper.setTintAuto( diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/circle/CirclePlayerFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/circle/CirclePlayerFragment.kt index ac61c3b22..02e4d8a77 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/circle/CirclePlayerFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/circle/CirclePlayerFragment.kt @@ -137,7 +137,7 @@ class CirclePlayerFragment : AbsPlayerFragment(R.layout.fragment_circle_player), } private fun updatePrevNextColor() { - val accentColor = ThemeStore.accentColor(requireContext()) + val accentColor = accentColor() binding.nextButton.setColorFilter(accentColor, PorterDuff.Mode.SRC_IN) binding.previousButton.setColorFilter(accentColor, PorterDuff.Mode.SRC_IN) } @@ -145,7 +145,7 @@ class CirclePlayerFragment : AbsPlayerFragment(R.layout.fragment_circle_player), private fun setUpPlayPauseFab() { TintHelper.setTintAuto( binding.playPauseButton, - ThemeStore.accentColor(requireContext()), + accentColor(), false ) binding.playPauseButton.setOnClickListener(PlayPauseButtonOnClickHandler()) diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/classic/ClassicPlayerFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/classic/ClassicPlayerFragment.kt index 01bc4dd2e..2dbff8be2 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/classic/ClassicPlayerFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/classic/ClassicPlayerFragment.kt @@ -22,6 +22,7 @@ import android.graphics.PorterDuff import android.os.Bundle import android.view.View import android.view.animation.LinearInterpolator +import android.widget.SeekBar import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.widget.Toolbar import androidx.fragment.app.commit @@ -44,17 +45,18 @@ import code.name.monkey.retromusic.fragments.player.PlayerAlbumCoverFragment 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 code.name.monkey.retromusic.util.color.MediaNotificationProcessor import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetBehavior.from import com.google.android.material.card.MaterialCardView import com.google.android.material.shape.MaterialShapeDrawable import com.google.android.material.shape.ShapeAppearanceModel -import com.google.android.material.slider.Slider import com.h6ah4i.android.widget.advrecyclerview.animator.DraggableItemAnimator import com.h6ah4i.android.widget.advrecyclerview.draggable.RecyclerViewDragDropManager import com.h6ah4i.android.widget.advrecyclerview.swipeable.RecyclerViewSwipeManager @@ -81,9 +83,6 @@ class ClassicPlayerFragment : AbsPlayerFragment(R.layout.fragment_classic_player private var playingQueueAdapter: PlayingQueueAdapter? = null private lateinit var linearLayoutManager: LinearLayoutManager - private var progressAnimator: ObjectAnimator? = null - var isSeeking = false - private val bottomSheetCallbackList = object : BottomSheetBehavior.BottomSheetCallback() { override fun onSlide(bottomSheet: View, slideOffset: Float) { mainActivity.getBottomSheetBehavior().isDraggable = false @@ -100,8 +99,7 @@ class ClassicPlayerFragment : AbsPlayerFragment(R.layout.fragment_classic_player override fun onStateChanged(bottomSheet: View, newState: Int) { when (newState) { BottomSheetBehavior.STATE_EXPANDED, - BottomSheetBehavior.STATE_DRAGGING, - -> { + BottomSheetBehavior.STATE_DRAGGING -> { mainActivity.getBottomSheetBehavior().isDraggable = false } BottomSheetBehavior.STATE_COLLAPSED -> { @@ -163,10 +161,6 @@ class ClassicPlayerFragment : AbsPlayerFragment(R.layout.fragment_classic_player binding.text.setOnClickListener { goToArtist(requireActivity()) } - - binding.playerControlsContainer.progressSlider.apply { - setCustomThumbDrawable(R.drawable.switch_square) - } } private fun hideVolumeIfAvailable() { @@ -292,8 +286,11 @@ class ClassicPlayerFragment : AbsPlayerFragment(R.layout.fragment_classic_player binding.playerControlsContainer.songCurrentProgress.setTextColor(lastPlaybackControlsColor) binding.playerControlsContainer.songTotalTime.setTextColor(lastPlaybackControlsColor) - binding.playerControlsContainer.progressSlider.applyColor(color.primaryTextColor) - + ViewUtil.setProgressDrawable( + binding.playerControlsContainer.progressSlider, + color.primaryTextColor, + true + ) volumeFragment?.setTintableColor(color.primaryTextColor) TintHelper.setTintAuto( @@ -330,20 +327,16 @@ class ClassicPlayerFragment : AbsPlayerFragment(R.layout.fragment_classic_player } override fun onUpdateProgressViews(progress: Int, total: Int) { - val progressSlider = binding.playerControlsContainer.progressSlider - progressSlider.valueTo = total.toFloat() + binding.playerControlsContainer.progressSlider.max = total - if (isSeeking) { - progressSlider.value = progress.toFloat() - } else { - progressAnimator = - ObjectAnimator.ofFloat(progressSlider, "value", progress.toFloat()).apply { - duration = AbsPlayerControlsFragment.SLIDER_ANIMATION_TIME - interpolator = LinearInterpolator() - start() - } - - } + val animator = ObjectAnimator.ofInt( + binding.playerControlsContainer.progressSlider, + "progress", + progress + ) + animator.duration = AbsPlayerControlsFragment.SLIDER_ANIMATION_TIME + animator.interpolator = LinearInterpolator() + animator.start() binding.playerControlsContainer.songTotalTime.text = MusicUtil.getReadableDurationString(total.toLong()) @@ -423,25 +416,16 @@ class ClassicPlayerFragment : AbsPlayerFragment(R.layout.fragment_classic_player } private fun setUpProgressSlider() { - val progressSlider = binding.playerControlsContainer.progressSlider - progressSlider.addOnChangeListener(Slider.OnChangeListener { _, value, fromUser -> - if (fromUser) { - onUpdateProgressViews( - value.toInt(), - MusicPlayerRemote.songDurationMillis - ) - } - }) - progressSlider.addOnSliderTouchListener(object : Slider.OnSliderTouchListener { - override fun onStartTrackingTouch(slider: Slider) { - isSeeking = true - progressViewUpdateHelper.stop() - } - - override fun onStopTrackingTouch(slider: Slider) { - isSeeking = false - MusicPlayerRemote.seekTo(slider.value.toInt()) - progressViewUpdateHelper.start() + binding.playerControlsContainer.progressSlider.setOnSeekBarChangeListener(object : + SimpleOnSeekbarChangeListener() { + override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) { + if (fromUser) { + MusicPlayerRemote.seekTo(progress) + onUpdateProgressViews( + MusicPlayerRemote.songProgressMillis, + MusicPlayerRemote.songDurationMillis + ) + } } }) } @@ -553,7 +537,7 @@ class ClassicPlayerFragment : AbsPlayerFragment(R.layout.fragment_classic_player oldLeft: Int, oldTop: Int, oldRight: Int, - oldBottom: Int, + oldBottom: Int ) { val height = binding.playerContainer.height val width = binding.playerContainer.width diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/fit/FitPlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/fit/FitPlaybackControlsFragment.kt index 006138c3c..1ac1db510 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/fit/FitPlaybackControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/fit/FitPlaybackControlsFragment.kt @@ -18,6 +18,7 @@ import android.os.Bundle import android.view.View import android.view.animation.DecelerateInterpolator import android.widget.ImageButton +import android.widget.SeekBar import android.widget.TextView import code.name.monkey.appthemehelper.ThemeStore import code.name.monkey.appthemehelper.util.ColorUtil @@ -32,8 +33,6 @@ import code.name.monkey.retromusic.fragments.base.goToArtist import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.util.PreferenceUtil import code.name.monkey.retromusic.util.color.MediaNotificationProcessor -import com.google.android.material.slider.Slider -import java.lang.reflect.Field class FitPlaybackControlsFragment : AbsPlayerControlsFragment(R.layout.fragment_fit_playback_controls) { @@ -41,7 +40,7 @@ class FitPlaybackControlsFragment : private var _binding: FragmentFitPlaybackControlsBinding? = null private val binding get() = _binding!! - override val progressSlider: Slider + override val seekBar: SeekBar get() = binding.progressSlider override val shuffleButton: ImageButton @@ -76,18 +75,6 @@ class FitPlaybackControlsFragment : binding.text.setOnClickListener { goToArtist(requireActivity()) } - binding.progressSlider.apply { - setCustomThumbDrawable(R.drawable.switch_square) - } - val field: Field = Slider::class.java.superclass.getDeclaredField("trackSidePadding") - - field.isAccessible = true - - field.set(binding.progressSlider, 0) - - binding.progressSlider.invalidate() - - } private fun updateSong() { @@ -141,7 +128,7 @@ class FitPlaybackControlsFragment : val colorFinal = if (PreferenceUtil.isAdaptiveColor) { color.primaryTextColor } else { - ThemeStore.accentColor(requireContext()).ripAlpha() + accentColor().ripAlpha() } volumeFragment?.setTintable(colorFinal) diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/flat/FlatPlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/flat/FlatPlaybackControlsFragment.kt index 5b21f5f07..8cbaf2973 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/flat/FlatPlaybackControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/flat/FlatPlaybackControlsFragment.kt @@ -18,9 +18,8 @@ import android.os.Bundle import android.view.View import android.view.animation.DecelerateInterpolator import android.widget.ImageButton -import com.google.android.material.slider.Slider +import android.widget.SeekBar import android.widget.TextView -import code.name.monkey.appthemehelper.ThemeStore import code.name.monkey.appthemehelper.util.ATHUtil import code.name.monkey.appthemehelper.util.ColorUtil import code.name.monkey.appthemehelper.util.MaterialValueHelper @@ -43,7 +42,7 @@ class FlatPlaybackControlsFragment : private var _binding: FragmentFlatPlayerPlaybackControlsBinding? = null private val binding get() = _binding!! - override val progressSlider: Slider + override val seekBar: SeekBar get() = binding.progressSlider override val shuffleButton: ImageButton @@ -110,7 +109,7 @@ class FlatPlaybackControlsFragment : val colorFinal = if (PreferenceUtil.isAdaptiveColor) { color.primaryTextColor } else { - ThemeStore.accentColor(requireContext()).ripAlpha() + accentColor().ripAlpha() } updateTextColors(colorFinal) diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/normal/PlayerPlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/normal/PlayerPlaybackControlsFragment.kt index 1032f21db..d9dc15126 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/normal/PlayerPlaybackControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/normal/PlayerPlaybackControlsFragment.kt @@ -94,7 +94,7 @@ class PlayerPlaybackControlsFragment : val colorFinal = if (PreferenceUtil.isAdaptiveColor) { color.primaryTextColor } else { - ThemeStore.accentColor(requireContext()) + accentColor() }.ripAlpha() TintHelper.setTintAuto( diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/peek/PeekPlayerControlFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/peek/PeekPlayerControlFragment.kt index ffe19799d..9a86f010f 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/peek/PeekPlayerControlFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/peek/PeekPlayerControlFragment.kt @@ -27,6 +27,7 @@ import code.name.monkey.appthemehelper.util.MaterialValueHelper import code.name.monkey.appthemehelper.util.TintHelper import code.name.monkey.retromusic.R import code.name.monkey.retromusic.databinding.FragmentPeekControlPlayerBinding +import code.name.monkey.retromusic.extensions.accentColor import code.name.monkey.retromusic.extensions.applyColor import code.name.monkey.retromusic.fragments.base.AbsPlayerControlsFragment import code.name.monkey.retromusic.helper.MusicPlayerRemote @@ -82,7 +83,7 @@ class PeekPlayerControlFragment : AbsPlayerControlsFragment(R.layout.fragment_pe if (PreferenceUtil.isAdaptiveColor) { color.primaryTextColor } else { - ThemeStore.accentColor(requireContext()) + accentColor() } binding.progressSlider.applyColor(controlsColor) volumeFragment?.setTintableColor(controlsColor) diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/plain/PlainPlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/plain/PlainPlaybackControlsFragment.kt index b1643ca5d..c5c7869ed 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/plain/PlainPlaybackControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/plain/PlainPlaybackControlsFragment.kt @@ -19,17 +19,13 @@ import android.view.View import android.view.animation.DecelerateInterpolator import android.widget.ImageButton import android.widget.TextView -import code.name.monkey.appthemehelper.ThemeStore import code.name.monkey.appthemehelper.util.ATHUtil import code.name.monkey.appthemehelper.util.ColorUtil import code.name.monkey.appthemehelper.util.MaterialValueHelper import code.name.monkey.appthemehelper.util.TintHelper import code.name.monkey.retromusic.R import code.name.monkey.retromusic.databinding.FragmentPlainControlsFragmentBinding -import code.name.monkey.retromusic.extensions.applyColor -import code.name.monkey.retromusic.extensions.getSongInfo -import code.name.monkey.retromusic.extensions.hide -import code.name.monkey.retromusic.extensions.show +import code.name.monkey.retromusic.extensions.* import code.name.monkey.retromusic.fragments.base.AbsPlayerControlsFragment import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.util.PreferenceUtil @@ -134,7 +130,7 @@ class PlainPlaybackControlsFragment : val colorFinal = if (PreferenceUtil.isAdaptiveColor) { color.primaryTextColor } else { - ThemeStore.accentColor(requireContext()) + accentColor() } volumeFragment?.setTintable(colorFinal) binding.progressSlider.applyColor(colorFinal) diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/simple/SimplePlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/simple/SimplePlaybackControlsFragment.kt index bcc6e4c9d..1d487ddb8 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/simple/SimplePlaybackControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/simple/SimplePlaybackControlsFragment.kt @@ -18,13 +18,13 @@ import android.os.Bundle import android.view.View import android.view.animation.DecelerateInterpolator import android.widget.ImageButton -import code.name.monkey.appthemehelper.ThemeStore import code.name.monkey.appthemehelper.util.ATHUtil import code.name.monkey.appthemehelper.util.ColorUtil import code.name.monkey.appthemehelper.util.MaterialValueHelper import code.name.monkey.appthemehelper.util.TintHelper import code.name.monkey.retromusic.R import code.name.monkey.retromusic.databinding.FragmentSimpleControlsFragmentBinding +import code.name.monkey.retromusic.extensions.accentColor import code.name.monkey.retromusic.extensions.getSongInfo import code.name.monkey.retromusic.extensions.hide import code.name.monkey.retromusic.extensions.show @@ -154,7 +154,7 @@ class SimplePlaybackControlsFragment : val colorFinal = if (PreferenceUtil.isAdaptiveColor) { color.primaryTextColor } else { - ThemeStore.accentColor(requireContext()) + accentColor() } volumeFragment?.setTintable(colorFinal) diff --git a/app/src/main/res/layout/fragment_card_player_playback_controls.xml b/app/src/main/res/layout/fragment_card_player_playback_controls.xml index ce4534e8e..71c28a3be 100644 --- a/app/src/main/res/layout/fragment_card_player_playback_controls.xml +++ b/app/src/main/res/layout/fragment_card_player_playback_controls.xml @@ -26,25 +26,23 @@ android:textSize="12sp" tools:text="@tools:sample/date/hhmmss" /> - + android:layout_weight="1" /> diff --git a/app/src/main/res/layout/fragment_classic_controls.xml b/app/src/main/res/layout/fragment_classic_controls.xml index 77ee86df6..149092d5c 100644 --- a/app/src/main/res/layout/fragment_classic_controls.xml +++ b/app/src/main/res/layout/fragment_classic_controls.xml @@ -44,13 +44,14 @@ tools:ignore="RtlHardcoded,RtlSymmetry" tools:text="@tools:sample/date/hhmmss" /> - + android:layout_toLeftOf="@id/songTotalTime" + android:layout_toRightOf="@id/songCurrentProgress" + android:paddingVertical="@dimen/seekbar_padding" + tools:ignore="RtlHardcoded,UnusedAttribute" /> diff --git a/app/src/main/res/layout/fragment_fit_playback_controls.xml b/app/src/main/res/layout/fragment_fit_playback_controls.xml index b3d193e66..6359d8c53 100644 --- a/app/src/main/res/layout/fragment_fit_playback_controls.xml +++ b/app/src/main/res/layout/fragment_fit_playback_controls.xml @@ -31,19 +31,13 @@ app:layout_constraintTop_toTopOf="parent" tools:text="@tools:sample/date/hhmmss" /> - + app:layout_constraintStart_toEndOf="@id/songCurrentProgress" /> - + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_flat_player_playback_controls.xml b/app/src/main/res/layout/fragment_flat_player_playback_controls.xml index 4066ba1da..977cc3f5a 100644 --- a/app/src/main/res/layout/fragment_flat_player_playback_controls.xml +++ b/app/src/main/res/layout/fragment_flat_player_playback_controls.xml @@ -21,12 +21,15 @@ app:layout_constraintTop_toTopOf="@id/progressSlider" tools:text="@tools:sample/date/hhmmss" /> - - + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_md3_player_playback_controls.xml b/app/src/main/res/layout/fragment_md3_player_playback_controls.xml index 8785702fb..bf669d816 100644 --- a/app/src/main/res/layout/fragment_md3_player_playback_controls.xml +++ b/app/src/main/res/layout/fragment_md3_player_playback_controls.xml @@ -29,11 +29,10 @@ android:layout_height="wrap_content" android:layout_marginTop="8dp" android:maxHeight="2dp" - android:progressDrawable="@drawable/color_progress_seek" + style="@style/Widget.Retro.Slider" app:layout_constraintEnd_toStartOf="@id/songTotalTime" app:layout_constraintStart_toEndOf="@id/songCurrentProgress" app:layout_constraintTop_toTopOf="parent" - tools:ignore="RtlHardcoded,UnusedAttribute" tools:progress="20" /> Date: Tue, 24 May 2022 18:22:06 +0530 Subject: [PATCH 053/280] Optimized imports --- app/src/main/java/code/name/monkey/retromusic/App.kt | 1 - .../name/monkey/retromusic/activities/PurchaseActivity.kt | 1 - .../retromusic/activities/tageditor/AbsTagEditorActivity.kt | 2 -- .../monkey/retromusic/fragments/folder/FoldersFragment.kt | 1 - .../retromusic/fragments/player/PlayerAlbumCoverFragment.kt | 4 +++- .../player/adaptive/AdaptivePlaybackControlsFragment.kt | 3 +-- .../fragments/player/blur/BlurPlaybackControlsFragment.kt | 2 +- .../fragments/player/card/CardPlaybackControlsFragment.kt | 1 - .../player/cardblur/CardBlurPlaybackControlsFragment.kt | 2 +- .../fragments/player/circle/CirclePlayerFragment.kt | 2 -- .../fragments/player/color/ColorPlaybackControlsFragment.kt | 2 +- .../fragments/player/fit/FitPlaybackControlsFragment.kt | 1 - .../fragments/player/full/FullPlaybackControlsFragment.kt | 2 +- .../player/lockscreen/LockScreenControlsFragment.kt | 2 +- .../fragments/player/material/MaterialControlsFragment.kt | 2 +- .../fragments/player/md3/MD3PlaybackControlsFragment.kt | 2 +- .../player/normal/PlayerPlaybackControlsFragment.kt | 3 +-- .../fragments/player/peek/PeekPlayerControlFragment.kt | 3 +-- .../fragments/settings/PersonalizeSettingsFragment.kt | 6 ++++-- .../retromusic/fragments/settings/SettingsFragment.kt | 5 ++++- .../retromusic/fragments/settings/ThemeSettingsFragment.kt | 4 +--- .../java/code/name/monkey/retromusic/lyrics/LrcUtils.java | 2 -- .../name/monkey/retromusic/service/MediaSessionCallback.kt | 1 - .../service/notification/PlayingNotificationClassic.kt | 1 - .../main/java/code/name/monkey/retromusic/util/SAFUtil.java | 2 -- 25 files changed, 22 insertions(+), 35 deletions(-) diff --git a/app/src/main/java/code/name/monkey/retromusic/App.kt b/app/src/main/java/code/name/monkey/retromusic/App.kt index 9e8a4d49f..84eadfb8f 100644 --- a/app/src/main/java/code/name/monkey/retromusic/App.kt +++ b/app/src/main/java/code/name/monkey/retromusic/App.kt @@ -16,7 +16,6 @@ package code.name.monkey.retromusic import android.app.Application import cat.ereza.customactivityoncrash.config.CaocConfig -import cat.ereza.customactivityoncrash.config.CaocConfig.BACKGROUND_MODE_SHOW_CUSTOM import code.name.monkey.appthemehelper.ThemeStore import code.name.monkey.appthemehelper.util.VersionUtils import code.name.monkey.retromusic.Constants.PRO_VERSION_PRODUCT_ID diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/PurchaseActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/PurchaseActivity.kt index 2c795466d..accf2f880 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/PurchaseActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/PurchaseActivity.kt @@ -24,7 +24,6 @@ import code.name.monkey.retromusic.App import code.name.monkey.retromusic.BuildConfig import code.name.monkey.retromusic.Constants.PRO_VERSION_PRODUCT_ID import code.name.monkey.retromusic.R -import code.name.monkey.retromusic.activities.base.AbsBaseActivity import code.name.monkey.retromusic.activities.base.AbsThemeActivity import code.name.monkey.retromusic.databinding.ActivityProVersionBinding import code.name.monkey.retromusic.extensions.accentColor diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/tageditor/AbsTagEditorActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/tageditor/AbsTagEditorActivity.kt index 561eaaf73..16d21e003 100755 --- a/app/src/main/java/code/name/monkey/retromusic/activities/tageditor/AbsTagEditorActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/tageditor/AbsTagEditorActivity.kt @@ -33,8 +33,6 @@ import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AlertDialog import androidx.lifecycle.lifecycleScope import androidx.viewbinding.ViewBinding -import code.name.monkey.appthemehelper.ThemeStore -import code.name.monkey.appthemehelper.util.TintHelper import code.name.monkey.appthemehelper.util.VersionUtils import code.name.monkey.retromusic.R import code.name.monkey.retromusic.R.drawable diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/folder/FoldersFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/folder/FoldersFragment.kt index 7bb5ea599..e850eba71 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/folder/FoldersFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/folder/FoldersFragment.kt @@ -67,7 +67,6 @@ import com.afollestad.materialcab.attached.AttachedCab import com.afollestad.materialcab.attached.destroy import com.afollestad.materialcab.attached.isActive import com.afollestad.materialcab.createCab -import com.google.android.material.shape.MaterialShapeDrawable import com.google.android.material.snackbar.Snackbar import com.google.android.material.transition.MaterialFadeThrough import kotlinx.coroutines.Dispatchers diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/PlayerAlbumCoverFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/PlayerAlbumCoverFragment.kt index cb6d12e7c..b818e374d 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/PlayerAlbumCoverFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/PlayerAlbumCoverFragment.kt @@ -28,7 +28,9 @@ import androidx.preference.PreferenceManager import androidx.viewpager.widget.ViewPager import code.name.monkey.appthemehelper.util.ColorUtil import code.name.monkey.appthemehelper.util.MaterialValueHelper -import code.name.monkey.retromusic.* +import code.name.monkey.retromusic.LYRICS_TYPE +import code.name.monkey.retromusic.R +import code.name.monkey.retromusic.SHOW_LYRICS import code.name.monkey.retromusic.adapter.album.AlbumCoverPagerAdapter import code.name.monkey.retromusic.adapter.album.AlbumCoverPagerAdapter.AlbumCoverFragment import code.name.monkey.retromusic.databinding.FragmentPlayerAlbumCoverBinding diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/adaptive/AdaptivePlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/adaptive/AdaptivePlaybackControlsFragment.kt index 0d2da763f..31c1dec9e 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/adaptive/AdaptivePlaybackControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/adaptive/AdaptivePlaybackControlsFragment.kt @@ -17,9 +17,7 @@ package code.name.monkey.retromusic.fragments.player.adaptive import android.os.Bundle import android.view.View import android.widget.ImageButton -import com.google.android.material.slider.Slider import android.widget.TextView -import code.name.monkey.appthemehelper.ThemeStore import code.name.monkey.appthemehelper.util.ATHUtil import code.name.monkey.appthemehelper.util.ColorUtil import code.name.monkey.appthemehelper.util.MaterialValueHelper @@ -31,6 +29,7 @@ import code.name.monkey.retromusic.fragments.base.AbsPlayerControlsFragment import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.util.PreferenceUtil import code.name.monkey.retromusic.util.color.MediaNotificationProcessor +import com.google.android.material.slider.Slider class AdaptivePlaybackControlsFragment : AbsPlayerControlsFragment(R.layout.fragment_adaptive_player_playback_controls) { diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/blur/BlurPlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/blur/BlurPlaybackControlsFragment.kt index 5ad8ea9f1..f7294eda4 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/blur/BlurPlaybackControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/blur/BlurPlaybackControlsFragment.kt @@ -19,7 +19,6 @@ import android.os.Bundle import android.view.View import android.view.animation.DecelerateInterpolator import android.widget.ImageButton -import com.google.android.material.slider.Slider import android.widget.TextView import androidx.core.content.ContextCompat import code.name.monkey.appthemehelper.util.ColorUtil @@ -37,6 +36,7 @@ import code.name.monkey.retromusic.fragments.base.goToArtist import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.util.PreferenceUtil import code.name.monkey.retromusic.util.color.MediaNotificationProcessor +import com.google.android.material.slider.Slider class BlurPlaybackControlsFragment : AbsPlayerControlsFragment(R.layout.fragment_blur_player_playback_controls) { diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/card/CardPlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/card/CardPlaybackControlsFragment.kt index 11ad94139..306412da4 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/card/CardPlaybackControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/card/CardPlaybackControlsFragment.kt @@ -20,7 +20,6 @@ import android.view.View import android.widget.ImageButton import android.widget.SeekBar import android.widget.TextView -import code.name.monkey.appthemehelper.ThemeStore import code.name.monkey.appthemehelper.util.ATHUtil import code.name.monkey.appthemehelper.util.ColorUtil import code.name.monkey.appthemehelper.util.MaterialValueHelper diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/cardblur/CardBlurPlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/cardblur/CardBlurPlaybackControlsFragment.kt index 163d94864..8ada49c95 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/cardblur/CardBlurPlaybackControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/cardblur/CardBlurPlaybackControlsFragment.kt @@ -19,7 +19,6 @@ import android.os.Bundle import android.view.View import android.view.animation.DecelerateInterpolator import android.widget.ImageButton -import com.google.android.material.slider.Slider import android.widget.TextView import code.name.monkey.appthemehelper.util.ColorUtil import code.name.monkey.appthemehelper.util.TintHelper @@ -34,6 +33,7 @@ import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler import code.name.monkey.retromusic.util.PreferenceUtil import code.name.monkey.retromusic.util.color.MediaNotificationProcessor +import com.google.android.material.slider.Slider class CardBlurPlaybackControlsFragment : AbsPlayerControlsFragment(R.layout.fragment_card_blur_player_playback_controls) { diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/circle/CirclePlayerFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/circle/CirclePlayerFragment.kt index 02e4d8a77..e3ed6830e 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/circle/CirclePlayerFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/circle/CirclePlayerFragment.kt @@ -27,7 +27,6 @@ import android.view.animation.Animation import android.view.animation.LinearInterpolator import androidx.appcompat.widget.Toolbar import androidx.core.content.getSystemService -import code.name.monkey.appthemehelper.ThemeStore import code.name.monkey.appthemehelper.util.ColorUtil import code.name.monkey.appthemehelper.util.MaterialValueHelper import code.name.monkey.appthemehelper.util.TintHelper @@ -50,7 +49,6 @@ import code.name.monkey.retromusic.helper.MusicProgressViewUpdateHelper.Callback import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler import code.name.monkey.retromusic.util.MusicUtil import code.name.monkey.retromusic.util.PreferenceUtil -import code.name.monkey.retromusic.util.ViewUtil import code.name.monkey.retromusic.util.color.MediaNotificationProcessor import code.name.monkey.retromusic.volume.AudioVolumeObserver import code.name.monkey.retromusic.volume.OnAudioVolumeChangedListener diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/color/ColorPlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/color/ColorPlaybackControlsFragment.kt index 6a129366e..084d2aaf3 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/color/ColorPlaybackControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/color/ColorPlaybackControlsFragment.kt @@ -22,7 +22,6 @@ import android.view.ViewAnimationUtils import android.view.animation.AccelerateInterpolator import android.view.animation.DecelerateInterpolator import android.widget.ImageButton -import com.google.android.material.slider.Slider import android.widget.TextView import code.name.monkey.appthemehelper.util.ColorUtil import code.name.monkey.appthemehelper.util.TintHelper @@ -38,6 +37,7 @@ import code.name.monkey.retromusic.fragments.base.goToArtist import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.util.PreferenceUtil import code.name.monkey.retromusic.util.color.MediaNotificationProcessor +import com.google.android.material.slider.Slider import kotlin.math.sqrt class ColorPlaybackControlsFragment : diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/fit/FitPlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/fit/FitPlaybackControlsFragment.kt index 1ac1db510..8f4737666 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/fit/FitPlaybackControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/fit/FitPlaybackControlsFragment.kt @@ -20,7 +20,6 @@ import android.view.animation.DecelerateInterpolator import android.widget.ImageButton import android.widget.SeekBar import android.widget.TextView -import code.name.monkey.appthemehelper.ThemeStore import code.name.monkey.appthemehelper.util.ColorUtil import code.name.monkey.appthemehelper.util.MaterialValueHelper import code.name.monkey.appthemehelper.util.TintHelper diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/full/FullPlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/full/FullPlaybackControlsFragment.kt index 9bbe3bf7f..256be3987 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/full/FullPlaybackControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/full/FullPlaybackControlsFragment.kt @@ -23,7 +23,6 @@ import android.view.MenuItem import android.view.View import android.view.animation.DecelerateInterpolator import android.widget.ImageButton -import com.google.android.material.slider.Slider import android.widget.TextView import androidx.appcompat.widget.PopupMenu import androidx.lifecycle.lifecycleScope @@ -45,6 +44,7 @@ import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.service.MusicService import code.name.monkey.retromusic.util.PreferenceUtil import code.name.monkey.retromusic.util.color.MediaNotificationProcessor +import com.google.android.material.slider.Slider import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/lockscreen/LockScreenControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/lockscreen/LockScreenControlsFragment.kt index 75a188c2c..f9d3df1bc 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/lockscreen/LockScreenControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/lockscreen/LockScreenControlsFragment.kt @@ -18,7 +18,6 @@ import android.os.Bundle import android.view.View import android.view.animation.DecelerateInterpolator import android.widget.ImageButton -import com.google.android.material.slider.Slider import android.widget.TextView import code.name.monkey.appthemehelper.util.ATHUtil import code.name.monkey.appthemehelper.util.ColorUtil @@ -34,6 +33,7 @@ import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler import code.name.monkey.retromusic.util.PreferenceUtil import code.name.monkey.retromusic.util.color.MediaNotificationProcessor +import com.google.android.material.slider.Slider /** * @author Hemanth S (h4h13). diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/material/MaterialControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/material/MaterialControlsFragment.kt index 11c9d6275..5ff928d16 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/material/MaterialControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/material/MaterialControlsFragment.kt @@ -18,7 +18,6 @@ import android.graphics.PorterDuff import android.os.Bundle import android.view.View import android.widget.ImageButton -import com.google.android.material.slider.Slider import android.widget.TextView import androidx.core.content.ContextCompat import code.name.monkey.appthemehelper.util.ATHUtil @@ -33,6 +32,7 @@ import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler import code.name.monkey.retromusic.util.PreferenceUtil import code.name.monkey.retromusic.util.color.MediaNotificationProcessor +import com.google.android.material.slider.Slider /** * @author Hemanth S (h4h13). diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/md3/MD3PlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/md3/MD3PlaybackControlsFragment.kt index cbb03e026..491d80f06 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/md3/MD3PlaybackControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/md3/MD3PlaybackControlsFragment.kt @@ -17,7 +17,6 @@ package code.name.monkey.retromusic.fragments.player.md3 import android.os.Bundle import android.view.View import android.widget.ImageButton -import com.google.android.material.slider.Slider import android.widget.TextView import code.name.monkey.appthemehelper.util.ATHUtil import code.name.monkey.appthemehelper.util.ColorUtil @@ -33,6 +32,7 @@ import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler import code.name.monkey.retromusic.util.PreferenceUtil import code.name.monkey.retromusic.util.color.MediaNotificationProcessor +import com.google.android.material.slider.Slider class MD3PlaybackControlsFragment : AbsPlayerControlsFragment(R.layout.fragment_md3_player_playback_controls) { diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/normal/PlayerPlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/normal/PlayerPlaybackControlsFragment.kt index d9dc15126..398cbe6b6 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/normal/PlayerPlaybackControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/normal/PlayerPlaybackControlsFragment.kt @@ -18,9 +18,7 @@ import android.os.Bundle import android.view.View import android.view.animation.DecelerateInterpolator import android.widget.ImageButton -import com.google.android.material.slider.Slider import android.widget.TextView -import code.name.monkey.appthemehelper.ThemeStore import code.name.monkey.appthemehelper.util.ATHUtil import code.name.monkey.appthemehelper.util.ColorUtil import code.name.monkey.appthemehelper.util.MaterialValueHelper @@ -34,6 +32,7 @@ import code.name.monkey.retromusic.fragments.base.goToArtist import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.util.PreferenceUtil import code.name.monkey.retromusic.util.color.MediaNotificationProcessor +import com.google.android.material.slider.Slider class PlayerPlaybackControlsFragment : AbsPlayerControlsFragment(R.layout.fragment_player_playback_controls) { diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/peek/PeekPlayerControlFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/peek/PeekPlayerControlFragment.kt index 9a86f010f..36150ad80 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/peek/PeekPlayerControlFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/peek/PeekPlayerControlFragment.kt @@ -19,9 +19,7 @@ import android.graphics.PorterDuff import android.os.Bundle import android.view.View import android.widget.ImageButton -import com.google.android.material.slider.Slider import android.widget.TextView -import code.name.monkey.appthemehelper.ThemeStore import code.name.monkey.appthemehelper.util.ATHUtil import code.name.monkey.appthemehelper.util.MaterialValueHelper import code.name.monkey.appthemehelper.util.TintHelper @@ -34,6 +32,7 @@ import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler import code.name.monkey.retromusic.util.PreferenceUtil import code.name.monkey.retromusic.util.color.MediaNotificationProcessor +import com.google.android.material.slider.Slider /** * Created by hemanths on 2019-10-04. diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/PersonalizeSettingsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/PersonalizeSettingsFragment.kt index 3de0fafc3..5b8508379 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/PersonalizeSettingsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/PersonalizeSettingsFragment.kt @@ -16,9 +16,11 @@ package code.name.monkey.retromusic.fragments.settings import android.os.Bundle import android.view.View -import androidx.preference.TwoStatePreference import code.name.monkey.appthemehelper.common.prefs.supportv7.ATEListPreference -import code.name.monkey.retromusic.* +import code.name.monkey.retromusic.HOME_ALBUM_GRID_STYLE +import code.name.monkey.retromusic.HOME_ARTIST_GRID_STYLE +import code.name.monkey.retromusic.R +import code.name.monkey.retromusic.TAB_TEXT_MODE class PersonalizeSettingsFragment : AbsSettingsFragment() { diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/SettingsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/SettingsFragment.kt index 1f728fe9b..88a48f29c 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/SettingsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/SettingsFragment.kt @@ -24,7 +24,10 @@ import code.name.monkey.appthemehelper.util.VersionUtils import code.name.monkey.retromusic.R import code.name.monkey.retromusic.appshortcuts.DynamicShortcutManager import code.name.monkey.retromusic.databinding.FragmentSettingsBinding -import code.name.monkey.retromusic.extensions.* +import code.name.monkey.retromusic.extensions.applyToolbar +import code.name.monkey.retromusic.extensions.dip +import code.name.monkey.retromusic.extensions.extra +import code.name.monkey.retromusic.extensions.findNavController import code.name.monkey.retromusic.fragments.base.AbsMusicServiceFragment import code.name.monkey.retromusic.helper.MusicPlayerRemote import com.afollestad.materialdialogs.MaterialDialog diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/ThemeSettingsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/ThemeSettingsFragment.kt index f0be5ae6b..f7fbc122b 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/ThemeSettingsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/ThemeSettingsFragment.kt @@ -29,9 +29,7 @@ import code.name.monkey.appthemehelper.util.VersionUtils import code.name.monkey.retromusic.* import code.name.monkey.retromusic.appshortcuts.DynamicShortcutManager import code.name.monkey.retromusic.extensions.materialDialog -import code.name.monkey.retromusic.fragments.NowPlayingScreen.Normal -import code.name.monkey.retromusic.fragments.NowPlayingScreen.Material -import code.name.monkey.retromusic.fragments.NowPlayingScreen.Flat +import code.name.monkey.retromusic.fragments.NowPlayingScreen.* import code.name.monkey.retromusic.util.PreferenceUtil import com.afollestad.materialdialogs.color.colorChooser import com.google.android.material.color.DynamicColors diff --git a/app/src/main/java/code/name/monkey/retromusic/lyrics/LrcUtils.java b/app/src/main/java/code/name/monkey/retromusic/lyrics/LrcUtils.java index 5152bc4f8..7b7eba15e 100644 --- a/app/src/main/java/code/name/monkey/retromusic/lyrics/LrcUtils.java +++ b/app/src/main/java/code/name/monkey/retromusic/lyrics/LrcUtils.java @@ -14,7 +14,6 @@ package code.name.monkey.retromusic.lyrics; -import android.animation.ValueAnimator; import android.text.TextUtils; import android.text.format.DateUtils; @@ -25,7 +24,6 @@ import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; -import java.lang.reflect.Field; import java.net.HttpURLConnection; import java.net.URL; import java.nio.charset.StandardCharsets; diff --git a/app/src/main/java/code/name/monkey/retromusic/service/MediaSessionCallback.kt b/app/src/main/java/code/name/monkey/retromusic/service/MediaSessionCallback.kt index 609bbf937..ba382a678 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/MediaSessionCallback.kt +++ b/app/src/main/java/code/name/monkey/retromusic/service/MediaSessionCallback.kt @@ -14,7 +14,6 @@ package code.name.monkey.retromusic.service -import android.content.Context import android.os.Bundle import android.provider.MediaStore import android.support.v4.media.session.MediaSessionCompat diff --git a/app/src/main/java/code/name/monkey/retromusic/service/notification/PlayingNotificationClassic.kt b/app/src/main/java/code/name/monkey/retromusic/service/notification/PlayingNotificationClassic.kt index f5ae60d3c..915e64d04 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/notification/PlayingNotificationClassic.kt +++ b/app/src/main/java/code/name/monkey/retromusic/service/notification/PlayingNotificationClassic.kt @@ -26,7 +26,6 @@ import android.graphics.drawable.Drawable import android.widget.RemoteViews import androidx.core.app.NotificationCompat import androidx.core.graphics.drawable.toBitmap -import androidx.media.app.NotificationCompat.DecoratedMediaCustomViewStyle import code.name.monkey.appthemehelper.util.ATHUtil.resolveColor import code.name.monkey.appthemehelper.util.ColorUtil import code.name.monkey.appthemehelper.util.MaterialValueHelper diff --git a/app/src/main/java/code/name/monkey/retromusic/util/SAFUtil.java b/app/src/main/java/code/name/monkey/retromusic/util/SAFUtil.java index 10939c9fd..9d7bdb79a 100644 --- a/app/src/main/java/code/name/monkey/retromusic/util/SAFUtil.java +++ b/app/src/main/java/code/name/monkey/retromusic/util/SAFUtil.java @@ -14,13 +14,11 @@ package code.name.monkey.retromusic.util; -import android.annotation.TargetApi; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.UriPermission; import android.net.Uri; -import android.os.Build; import android.os.ParcelFileDescriptor; import android.provider.DocumentsContract; import android.text.TextUtils; From cee51eb2cce6add412e1556038b4e4d6396b3ec8 Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Tue, 24 May 2022 19:15:43 +0530 Subject: [PATCH 054/280] Add PlagiarismUtil --- .../activities/base/AbsThemeActivity.kt | 20 ++-------- .../fragments/base/AbsMusicServiceFragment.kt | 2 + .../monkey/retromusic/util/PlagiarismUtil.kt | 39 +++++++++++++++++++ 3 files changed, 44 insertions(+), 17 deletions(-) create mode 100644 app/src/main/java/code/name/monkey/retromusic/util/PlagiarismUtil.kt diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsThemeActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsThemeActivity.kt index 20e499e94..55d1dbd4a 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsThemeActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsThemeActivity.kt @@ -20,7 +20,6 @@ import android.os.Bundle import android.os.Handler import android.os.Looper import android.view.KeyEvent -import android.view.View import androidx.appcompat.app.AppCompatDelegate.setDefaultNightMode import androidx.core.os.ConfigurationCompat import code.name.monkey.appthemehelper.common.ATHToolbarActivity @@ -29,6 +28,7 @@ import code.name.monkey.retromusic.LanguageContextWrapper import code.name.monkey.retromusic.R import code.name.monkey.retromusic.extensions.* import code.name.monkey.retromusic.util.PreferenceUtil +import code.name.monkey.retromusic.util.maybeShowAnnoyingToasts import code.name.monkey.retromusic.util.theme.getNightMode import code.name.monkey.retromusic.util.theme.getThemeResValue import com.google.android.play.core.splitcompat.SplitCompat @@ -42,14 +42,15 @@ abstract class AbsThemeActivity : ATHToolbarActivity(), Runnable { updateTheme() hideStatusBar() super.onCreate(savedInstanceState) + println("OnCreate") setEdgeToEdgeOrImmersive() - registerSystemUiVisibility() maybeSetScreenOn() setLightNavigationBarAuto() setLightStatusBarAuto(surfaceColor()) if (VersionUtils.hasQ()) { window.decorView.isForceDarkAllowed = false } + maybeShowAnnoyingToasts() } private fun updateTheme() { @@ -74,20 +75,6 @@ abstract class AbsThemeActivity : ATHToolbarActivity(), Runnable { } } - private fun registerSystemUiVisibility() { - val decorView = window.decorView - decorView.setOnSystemUiVisibilityChangeListener { visibility -> - if (visibility and View.SYSTEM_UI_FLAG_FULLSCREEN == 0) { - setImmersiveFullscreen() - } - } - } - - private fun unregisterSystemUiVisibility() { - val decorView = window.decorView - decorView.setOnSystemUiVisibilityChangeListener(null) - } - override fun run() { setImmersiveFullscreen() } @@ -99,7 +86,6 @@ abstract class AbsThemeActivity : ATHToolbarActivity(), Runnable { public override fun onDestroy() { super.onDestroy() - unregisterSystemUiVisibility() exitFullscreen() } diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsMusicServiceFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsMusicServiceFragment.kt index 536c46e1f..aed641d07 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsMusicServiceFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsMusicServiceFragment.kt @@ -23,6 +23,7 @@ import androidx.navigation.navOptions import code.name.monkey.retromusic.R import code.name.monkey.retromusic.activities.base.AbsMusicServiceActivity import code.name.monkey.retromusic.interfaces.IMusicServiceEventListener +import code.name.monkey.retromusic.util.maybeShowAnnoyingToasts /** * Created by hemanths on 18/08/17. @@ -63,6 +64,7 @@ open class AbsMusicServiceFragment(@LayoutRes layout: Int) : Fragment(layout), override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) serviceActivity?.addMusicServiceEventListener(this) + maybeShowAnnoyingToasts() } override fun onDestroyView() { diff --git a/app/src/main/java/code/name/monkey/retromusic/util/PlagiarismUtil.kt b/app/src/main/java/code/name/monkey/retromusic/util/PlagiarismUtil.kt new file mode 100644 index 000000000..b5401a5fe --- /dev/null +++ b/app/src/main/java/code/name/monkey/retromusic/util/PlagiarismUtil.kt @@ -0,0 +1,39 @@ +package code.name.monkey.retromusic.util + +import android.app.Activity +import android.content.ActivityNotFoundException +import android.content.Intent +import android.net.Uri +import android.util.Log +import android.widget.Toast +import androidx.fragment.app.Fragment +import code.name.monkey.retromusic.BuildConfig +import code.name.monkey.retromusic.extensions.showToast + +fun Activity.maybeShowAnnoyingToasts() { + if (BuildConfig.APPLICATION_ID != "code.name.monkey.retromusic" && + BuildConfig.APPLICATION_ID != "code.name.monkey.retromusic.debug" + ) { + if (BuildConfig.DEBUG) { + // Log these things to console, if the plagiarizer even cares to check it + Log.d("Retro Music", "What are you doing with your life?") + Log.d("Retro Music", "Stop copying apps and make use of your brain.") + Log.d("Retro Music", "Stop doing this or you will end up straight to hell.") + Log.d("Retro Music", "To the boiler room of hell. All the way down.") + } else { + showToast("Warning! This is a copy of Retro Music Player", Toast.LENGTH_LONG) + showToast("Instead of using this copy by a dumb person who didn't even bother to remove this code.", Toast.LENGTH_LONG) + showToast("Support us by downloading the original version from Play Store.", Toast.LENGTH_LONG) + val packageName = "code.name.monkey.retromusic" + try { + startActivity(Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=$packageName"))) + } catch (e: ActivityNotFoundException) { + startActivity(Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=$packageName"))) + } + } + } +} + +fun Fragment.maybeShowAnnoyingToasts() { + requireActivity().maybeShowAnnoyingToasts() +} \ No newline at end of file From f04bf4c3aa075eaba856baf74a6cc78d7ca51ee9 Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Thu, 26 May 2022 14:52:31 +0530 Subject: [PATCH 055/280] Fixed Material Slider crashes --- .../fragments/base/AbsPlayerControlsFragment.kt | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsPlayerControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsPlayerControlsFragment.kt index 677b38b5b..0a12de582 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsPlayerControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsPlayerControlsFragment.kt @@ -82,17 +82,9 @@ abstract class AbsPlayerControlsFragment(@LayoutRes layout: Int) : AbsMusicServi if (seekBar == null) { progressSlider?.valueTo = total.toFloat() - if (isSeeking) { - progressSlider?.value = progress.toFloat() - } else { - progressAnimator = - ObjectAnimator.ofFloat(progressSlider, "value", progress.toFloat()).apply { - duration = SLIDER_ANIMATION_TIME - interpolator = LinearInterpolator() - start() - } + if (progress > total) return + progressSlider?.value = progress.toFloat() - } } else { seekBar?.max = total From 87f11724814162b73faaa7d779519fdfb51979d4 Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Thu, 26 May 2022 15:06:50 +0530 Subject: [PATCH 056/280] Update MDC --- .../monkey/retromusic/fragments/player/CoverLyricsFragment.kt | 2 -- app/src/main/res/values/styles.xml | 1 + build.gradle | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/CoverLyricsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/CoverLyricsFragment.kt index d522877c1..7a8b8aaf6 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/CoverLyricsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/CoverLyricsFragment.kt @@ -102,8 +102,6 @@ class CoverLyricsFragment : AbsMusicServiceFragment(R.layout.fragment_cover_lyri null } } - - } override fun onUpdateProgressViews(progress: Int, total: Int) { diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index b857f7996..60e2b5662 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -174,6 +174,7 @@ - diff --git a/build.gradle b/build.gradle index e37ddd4ef..d1d3d8338 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ buildscript { navigation_version = '2.5.0-rc01' mdc_version = '1.7.0-alpha02' preference_version = '1.2.0' - appcompat_version = '1.4.1' + appcompat_version = '1.4.2' } repositories { From 7efbbc3f110935f8e5ee8bc9f6f35f6bb562d6ae Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Sun, 5 Jun 2022 23:19:25 +0530 Subject: [PATCH 082/280] [Playback] Code Cleanup --- .../monkey/retromusic/service/CastPlayer.kt | 12 +-- .../retromusic/service/CrossFadePlayer.kt | 22 ++---- .../retromusic/service/LocalPlayback.kt | 18 ++--- .../monkey/retromusic/service/MultiPlayer.kt | 50 +++++------- .../monkey/retromusic/service/MusicService.kt | 76 +++++++++---------- .../retromusic/service/PlaybackManager.kt | 10 +-- .../retromusic/service/playback/Playback.kt | 4 +- 7 files changed, 78 insertions(+), 114 deletions(-) diff --git a/app/src/main/java/code/name/monkey/retromusic/service/CastPlayer.kt b/app/src/main/java/code/name/monkey/retromusic/service/CastPlayer.kt index 2a67051d6..e3404f24a 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/CastPlayer.kt +++ b/app/src/main/java/code/name/monkey/retromusic/service/CastPlayer.kt @@ -33,19 +33,15 @@ class CastPlayer(castSession: CastSession) : Playback, override var callbacks: Playback.PlaybackCallbacks? = null - override fun setDataSource( - song: Song, - force: Boolean, - completion: (success: Boolean) -> Unit, - ) { - try { + override fun setDataSource(song: Song, force: Boolean): Boolean { + return try { val mediaLoadOptions = MediaLoadOptions.Builder().setPlayPosition(0).setAutoplay(true).build() remoteMediaClient?.load(song.toMediaInfo()!!, mediaLoadOptions) - completion(true) + true } catch (e: Exception) { e.printStackTrace() - completion(false) + false } } diff --git a/app/src/main/java/code/name/monkey/retromusic/service/CrossFadePlayer.kt b/app/src/main/java/code/name/monkey/retromusic/service/CrossFadePlayer.kt index da27e6b36..af9661feb 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/CrossFadePlayer.kt +++ b/app/src/main/java/code/name/monkey/retromusic/service/CrossFadePlayer.kt @@ -120,25 +120,17 @@ class CrossFadePlayer(context: Context) : LocalPlayback(context) { override val isPlaying: Boolean get() = mIsInitialized && getCurrentPlayer()?.isPlaying == true - override fun setDataSource( - song: Song, - force: Boolean, - completion: (success: Boolean) -> Unit, - ) { + override fun setDataSource(song: Song, force: Boolean): Boolean { if (force) hasDataSource = false mIsInitialized = false /* We've already set DataSource if initialized is true in setNextDataSource */ - if (!hasDataSource) { - getCurrentPlayer()?.let { - setDataSourceImpl(it, song.uri.toString()) { success -> - mIsInitialized = success - completion(success) - } - } + return if (!hasDataSource) { + mIsInitialized = setDataSourceImpl(getCurrentPlayer()!!, song.uri.toString()) hasDataSource = true + mIsInitialized } else { - completion(true) mIsInitialized = true + true } } @@ -293,8 +285,8 @@ class CrossFadePlayer(context: Context) : LocalPlayback(context) { val nextSong = MusicPlayerRemote.nextSong // Switch to other player (Crossfade) only if next song exists if (nextSong != null) { - setDataSourceImpl(player, nextSong.uri.toString()) { success -> - if (success) switchPlayer() + if (setDataSourceImpl(player, nextSong.uri.toString())) { + switchPlayer() } } } diff --git a/app/src/main/java/code/name/monkey/retromusic/service/LocalPlayback.kt b/app/src/main/java/code/name/monkey/retromusic/service/LocalPlayback.kt index fafbae0ec..ee039f42c 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/LocalPlayback.kt +++ b/app/src/main/java/code/name/monkey/retromusic/service/LocalPlayback.kt @@ -109,13 +109,10 @@ abstract class LocalPlayback(val context: Context) : Playback, MediaPlayer.OnErr * @param path The path of the file, or the http/rtsp URL of the stream you want to play * @return True if the player has been prepared and is ready to play, false otherwise */ - fun setDataSourceImpl( - player: MediaPlayer, - path: String, - completion: (success: Boolean) -> Unit, - ) { - player.reset() + fun setDataSourceImpl(player: MediaPlayer, path: String): Boolean { try { + player.reset() + player.setOnPreparedListener(null) if (path.startsWith("content://")) { player.setDataSource(context, path.toUri()) } else { @@ -126,17 +123,14 @@ abstract class LocalPlayback(val context: Context) : Playback, MediaPlayer.OnErr .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) .build() ) - player.setOnPreparedListener { - player.setOnPreparedListener(null) - completion(true) - } - player.prepareAsync() + player.prepare() } catch (e: Exception) { - completion(false) e.printStackTrace() + return false } player.setOnCompletionListener(this) player.setOnErrorListener(this) + return true } private fun unregisterBecomingNoisyReceiver() { diff --git a/app/src/main/java/code/name/monkey/retromusic/service/MultiPlayer.kt b/app/src/main/java/code/name/monkey/retromusic/service/MultiPlayer.kt index 8421b60f1..d0e766b3f 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/MultiPlayer.kt +++ b/app/src/main/java/code/name/monkey/retromusic/service/MultiPlayer.kt @@ -46,19 +46,13 @@ class MultiPlayer(context: Context) : LocalPlayback(context) { * @param song The song object you want to play * @return True if the `player` has been prepared and is ready to play, false otherwise */ - override fun setDataSource( - song: Song, - force: Boolean, - completion: (success: Boolean) -> Unit, - ) { + override fun setDataSource(song: Song, force: Boolean): Boolean { isInitialized = false - setDataSourceImpl(mCurrentMediaPlayer, song.uri.toString()) { success -> - isInitialized = success - if (isInitialized) { - setNextDataSource(null) - } - completion(isInitialized) + isInitialized = setDataSourceImpl(mCurrentMediaPlayer, song.uri.toString()) + if (isInitialized) { + setNextDataSource(null) } + return isInitialized } /** @@ -86,28 +80,26 @@ class MultiPlayer(context: Context) : LocalPlayback(context) { mNextMediaPlayer = MediaPlayer() mNextMediaPlayer?.setWakeMode(context, PowerManager.PARTIAL_WAKE_LOCK) mNextMediaPlayer?.audioSessionId = audioSessionId - setDataSourceImpl(mNextMediaPlayer!!, path) { success -> - if (success) { - try { - mCurrentMediaPlayer.setNextMediaPlayer(mNextMediaPlayer) - } catch (e: IllegalArgumentException) { - Log.e(TAG, "setNextDataSource: setNextMediaPlayer()", e) - if (mNextMediaPlayer != null) { - mNextMediaPlayer?.release() - mNextMediaPlayer = null - } - } catch (e: IllegalStateException) { - Log.e(TAG, "setNextDataSource: setNextMediaPlayer()", e) - if (mNextMediaPlayer != null) { - mNextMediaPlayer?.release() - mNextMediaPlayer = null - } - } - } else { + if (setDataSourceImpl(mNextMediaPlayer!!, path)) { + try { + mCurrentMediaPlayer.setNextMediaPlayer(mNextMediaPlayer) + } catch (e: IllegalArgumentException) { + Log.e(TAG, "setNextDataSource: setNextMediaPlayer()", e) if (mNextMediaPlayer != null) { mNextMediaPlayer?.release() mNextMediaPlayer = null } + } catch (e: IllegalStateException) { + Log.e(TAG, "setNextDataSource: setNextMediaPlayer()", e) + if (mNextMediaPlayer != null) { + mNextMediaPlayer?.release() + mNextMediaPlayer = null + } + } + } else { + if (mNextMediaPlayer != null) { + mNextMediaPlayer?.release() + mNextMediaPlayer = null } } } diff --git a/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt b/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt index 512cd3839..cee0a47ed 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt +++ b/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt @@ -117,6 +117,11 @@ class MusicService : MediaBrowserServiceCompat(), private var trackEndedByCrossfade = false private val serviceScope = CoroutineScope(Job() + Main) + // Every chromecast method needs to run on main thread or you are greeted with IllegalStateException + // So it will use Main dispatcher + // And by using Default dispatcher for local playback we are reducing the burden from main thread + private val playerDispatcher get() = if (playbackManager.isLocalPlayback) Default else Main + @JvmField var position = -1 private val appWidgetBig = AppWidgetBig.instance @@ -436,11 +441,8 @@ class MusicService : MediaBrowserServiceCompat(), } private fun setPosition(position: Int) { - openTrackAndPrepareNextAt(position) { success -> - if (success) { - notifyChange(PLAY_STATE_CHANGED) - } - } + openTrackAndPrepareNextAt(position) + notifyChange(PLAY_STATE_CHANGED) } private fun getPreviousPosition(force: Boolean): Int { @@ -755,16 +757,15 @@ class MusicService : MediaBrowserServiceCompat(), } @Synchronized - fun openTrackAndPrepareNextAt(position: Int, completion: (success: Boolean) -> Unit) { + fun openTrackAndPrepareNextAt(position: Int): Boolean { this.position = position - openCurrent { success -> - completion(success) - notifyChange(META_CHANGED) - notHandledMetaChangedForCurrentTrack = false - if (success) { - prepareNextImpl() - } + val prepared = openCurrent() + if (prepared) { + prepareNextImpl() } + notifyChange(META_CHANGED) + notHandledMetaChangedForCurrentTrack = false + return prepared } fun pause(force: Boolean = false) { @@ -793,16 +794,11 @@ class MusicService : MediaBrowserServiceCompat(), } fun playSongAt(position: Int) { - // Every chromecast method needs to run on main thread or you are greeted with IllegalStateException - // So it will use Main dispatcher - // And by using Default dispatcher for local playback we are reduce the burden of main thread - serviceScope.launch(if(playbackManager.isLocalPlayback) Default else Main) { - openTrackAndPrepareNextAt(position) { success -> - if (success) { - play() - } else { - showToast(resources.getString(R.string.unplayable_file)) - } + serviceScope.launch(playerDispatcher) { + if (openTrackAndPrepareNextAt(position)) { + play() + } else { + showToast(R.string.unplayable_file) } } } @@ -917,15 +913,14 @@ class MusicService : MediaBrowserServiceCompat(), originalPlayingQueue = ArrayList(restoredOriginalQueue) playingQueue = ArrayList(restoredQueue) position = restoredPosition - withContext(Main) { - openCurrent { - prepareNext() - if (restoredPositionInTrack > 0) { - seek(restoredPositionInTrack) - } - notHandledMetaChangedForCurrentTrack = true - sendChangeInternal(META_CHANGED) + withContext(playerDispatcher) { + openCurrent() + prepareNext() + if (restoredPositionInTrack > 0) { + seek(restoredPositionInTrack) } + notHandledMetaChangedForCurrentTrack = true + sendChangeInternal(META_CHANGED) if (receivedHeadsetConnected) { play() receivedHeadsetConnected = false @@ -1169,15 +1164,18 @@ class MusicService : MediaBrowserServiceCompat(), } @Synchronized - private fun openCurrent(completion: (success: Boolean) -> Unit) { + private fun openCurrent(): Boolean { val force = if (!trackEndedByCrossfade) { true } else { trackEndedByCrossfade = false false } - playbackManager.setDataSource(currentSong, force) { success -> - completion(success) + return try { + playbackManager.setDataSource(currentSong, force) + } catch (e: Exception) { + e.printStackTrace() + false } } @@ -1191,12 +1189,10 @@ class MusicService : MediaBrowserServiceCompat(), private fun restorePlaybackState(wasPlaying: Boolean, progress: Int) { playbackManager.setCallbacks(this) - openTrackAndPrepareNextAt(position) { success -> - if (success) { - seek(progress) - if (wasPlaying) { - play() - } + if (openTrackAndPrepareNextAt(position)) { + seek(progress) + if (wasPlaying) { + play() } } playbackManager.setCrossFadeDuration(crossFadeDuration) diff --git a/app/src/main/java/code/name/monkey/retromusic/service/PlaybackManager.kt b/app/src/main/java/code/name/monkey/retromusic/service/PlaybackManager.kt index 9186bd534..f64b7d600 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/PlaybackManager.kt +++ b/app/src/main/java/code/name/monkey/retromusic/service/PlaybackManager.kt @@ -16,7 +16,7 @@ class PlaybackManager(val context: Context) { var playback: Playback? = null private var playbackLocation = PlaybackLocation.LOCAL - val isLocalPlayback get() = playbackLocation== PlaybackLocation.LOCAL + val isLocalPlayback get() = playbackLocation == PlaybackLocation.LOCAL val audioSessionId: Int get() = if (playback != null) { @@ -86,12 +86,8 @@ class PlaybackManager(val context: Context) { fun seek(millis: Int): Int = playback!!.seek(millis) - fun setDataSource( - song: Song, - force: Boolean, - completion: (success: Boolean) -> Unit, - ) { - playback?.setDataSource(song, force, completion) + fun setDataSource(song: Song, force: Boolean): Boolean { + return playback?.setDataSource(song, force) == true } fun setNextDataSource(trackUri: String) { diff --git a/app/src/main/java/code/name/monkey/retromusic/service/playback/Playback.kt b/app/src/main/java/code/name/monkey/retromusic/service/playback/Playback.kt index 3795e7634..f3521ab96 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/playback/Playback.kt +++ b/app/src/main/java/code/name/monkey/retromusic/service/playback/Playback.kt @@ -25,9 +25,7 @@ interface Playback { val audioSessionId: Int - fun setDataSource( - song: Song, force: Boolean, completion: (success: Boolean) -> Unit, - ) + fun setDataSource(song: Song, force: Boolean):Boolean fun setNextDataSource(path: String?) From d2a758886126e7253d05f9e15a132afc64f017cf Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Sun, 5 Jun 2022 23:48:37 +0530 Subject: [PATCH 083/280] Added NavigationRailView for Landscape --- .../retromusic/activities/MainActivity.kt | 4 +- .../base/AbsSlidingMusicPanelActivity.kt | 43 ++++++++------ .../retromusic/extensions/ViewExtensions.kt | 8 ++- .../fragments/base/AbsRecyclerViewFragment.kt | 2 +- .../fragments/folder/FoldersFragment.kt | 2 +- .../retromusic/fragments/home/HomeFragment.kt | 2 +- .../fragments/library/LibraryFragment.kt | 2 +- .../fragments/search/SearchFragment.kt | 2 +- .../sliding_music_panel_layout.xml | 58 +++++++++++++++++++ .../res/layout/sliding_music_panel_layout.xml | 7 +-- app/src/main/res/values/dimens.xml | 4 +- 11 files changed, 100 insertions(+), 34 deletions(-) create mode 100644 app/src/main/res/layout-land/sliding_music_panel_layout.xml diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/MainActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/MainActivity.kt index 766031351..a337487fc 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/MainActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/MainActivity.kt @@ -78,9 +78,9 @@ class MainActivity : AbsCastActivity() { ) } navController.graph = navGraph - bottomNavigationView.setupWithNavController(navController) + navigationView.setupWithNavController(navController) // Scroll Fragment to top - bottomNavigationView.setOnItemReselectedListener { + navigationView.setOnItemReselectedListener { currentFragment(R.id.fragment_container).apply { if (this is IScrollHelper) { scrollToTop() 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 3dea6fa4a..7819bb125 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 @@ -66,6 +66,7 @@ import code.name.monkey.retromusic.model.CategoryInfo import code.name.monkey.retromusic.util.PreferenceUtil import code.name.monkey.retromusic.util.ViewUtil import code.name.monkey.retromusic.util.logD +import com.google.android.material.bottomnavigation.BottomNavigationView import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetBehavior.* import org.koin.androidx.viewmodel.ext.android.viewModel @@ -127,7 +128,7 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity(), } STATE_SETTLING, STATE_DRAGGING -> { if (fromNotification) { - binding.bottomNavigationView.bringToFront() + binding.navigationView.bringToFront() fromNotification = false } } @@ -162,7 +163,7 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity(), updateColor() if (!PreferenceUtil.materialYou) { binding.slidingPanel.backgroundTintList = ColorStateList.valueOf(darkAccentColor()) - bottomNavigationView.backgroundTintList = ColorStateList.valueOf(darkAccentColor()) + navigationView.backgroundTintList = ColorStateList.valueOf(darkAccentColor()) } navigationBarColor = surfaceColor() @@ -230,7 +231,7 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity(), updateTabs() } TAB_TEXT_MODE -> { - bottomNavigationView.labelVisibilityMode = PreferenceUtil.tabTitleMode + navigationView.labelVisibilityMode = PreferenceUtil.tabTitleMode } TOGGLE_FULL_SCREEN -> { if (!PreferenceUtil.isFullScreenMode) exitFullscreen() @@ -258,8 +259,10 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity(), val alpha = 1 - progress miniPlayerFragment?.view?.alpha = 1 - (progress / 0.2F) miniPlayerFragment?.view?.isGone = alpha == 0f - binding.bottomNavigationView.translationY = progress * 500 - binding.bottomNavigationView.alpha = alpha + if (!isLandscape) { + binding.navigationView.translationY = progress * 500 + binding.navigationView.alpha = alpha + } binding.playerFragmentContainer.alpha = (progress - 0.2F) / 0.2F } @@ -316,10 +319,12 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity(), }) } - val bottomNavigationView get() = binding.bottomNavigationView + val navigationView get() = binding.navigationView val slidingPanel get() = binding.slidingPanel + val isBottomNavVisible get() = navigationView.isVisible && navigationView is BottomNavigationView + override fun onServiceConnected() { super.onServiceConnected() hideBottomSheet(false) @@ -386,18 +391,18 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity(), } fun updateTabs() { - binding.bottomNavigationView.menu.clear() + binding.navigationView.menu.clear() val currentTabs: List = PreferenceUtil.libraryCategory for (tab in currentTabs) { if (tab.visible) { val menu = tab.category - binding.bottomNavigationView.menu.add(0, menu.id, 0, menu.stringRes) + binding.navigationView.menu.add(0, menu.id, 0, menu.stringRes) .setIcon(menu.icon) } } - if (binding.bottomNavigationView.menu.size() == 1) { + if (binding.navigationView.menu.size() == 1) { isInOneTabMode = true - binding.bottomNavigationView.isVisible = false + binding.navigationView.isVisible = false } else { isInOneTabMode = false } @@ -423,33 +428,33 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity(), ) return } - if (visible xor bottomNavigationView.isVisible) { + if (visible xor navigationView.isVisible) { val mAnimate = animate && bottomSheetBehavior.state == STATE_COLLAPSED if (mAnimate) { if (visible) { - binding.bottomNavigationView.bringToFront() - binding.bottomNavigationView.show() + binding.navigationView.bringToFront() + binding.navigationView.show() } else { - binding.bottomNavigationView.hide() + binding.navigationView.hide() } } else { - binding.bottomNavigationView.isVisible = false + binding.navigationView.isVisible = visible if (visible && bottomSheetBehavior.state != STATE_EXPANDED) { - binding.bottomNavigationView.bringToFront() + binding.navigationView.bringToFront() } } } hideBottomSheet( hide = hideBottomSheet, animate = animate, - isBottomNavVisible = visible + isBottomNavVisible = visible && navigationView is BottomNavigationView ) } fun hideBottomSheet( hide: Boolean, animate: Boolean = false, - isBottomNavVisible: Boolean = bottomNavigationView.isVisible, + isBottomNavVisible: Boolean = navigationView.isVisible && navigationView is BottomNavigationView, ) { val heightOfBar = windowInsets.getBottomInsets() + dip(R.dimen.mini_player_height) val heightOfBarWithTabs = heightOfBar + dip(R.dimen.bottom_nav_height) @@ -463,7 +468,7 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity(), } else { if (MusicPlayerRemote.playingQueue.isNotEmpty()) { binding.slidingPanel.elevation = 0F - binding.bottomNavigationView.elevation = 5F + binding.navigationView.elevation = 5F if (isBottomNavVisible) { logD("List") if (animate) { diff --git a/app/src/main/java/code/name/monkey/retromusic/extensions/ViewExtensions.kt b/app/src/main/java/code/name/monkey/retromusic/extensions/ViewExtensions.kt index 9f53714fd..d9ce08d9c 100644 --- a/app/src/main/java/code/name/monkey/retromusic/extensions/ViewExtensions.kt +++ b/app/src/main/java/code/name/monkey/retromusic/extensions/ViewExtensions.kt @@ -38,6 +38,8 @@ import code.name.monkey.retromusic.util.RetroUtil import com.google.android.material.bottomnavigation.BottomNavigationView import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.card.MaterialCardView +import com.google.android.material.navigation.NavigationBarView +import com.google.android.material.navigationrail.NavigationRailView import dev.chrisbanes.insetter.applyInsetter const val ANIM_DURATION = 300L @@ -74,7 +76,8 @@ fun EditText.appHandleColor(): EditText { * Instead, take a snapshot of the view, and animate this in, only changing the visibility (and * thus layout) when the animation completes. */ -fun BottomNavigationView.show() { +fun NavigationBarView.show() { + if (this is NavigationRailView) return if (isVisible) return val parent = parent as ViewGroup @@ -118,7 +121,8 @@ fun BottomNavigationView.show() { * Instead, take a snapshot, instantly hide the view (so content lays out to fill), then animate * out the snapshot. */ -fun BottomNavigationView.hide() { +fun NavigationBarView.hide() { + if (this is NavigationRailView) return if (isGone) return if (!isLaidOut) { diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsRecyclerViewFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsRecyclerViewFragment.kt index 48adf7eb1..eafdfee8f 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsRecyclerViewFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsRecyclerViewFragment.kt @@ -147,7 +147,7 @@ abstract class AbsRecyclerViewFragment, LM : Recycle } private fun checkForMargins() { - if (mainActivity.bottomNavigationView.isVisible) { + if (mainActivity.isBottomNavVisible) { binding.recyclerView.updateLayoutParams { bottomMargin = dip(R.dimen.bottom_nav_height) } diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/folder/FoldersFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/folder/FoldersFragment.kt index a20ee89fc..ce8955057 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/folder/FoldersFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/folder/FoldersFragment.kt @@ -407,7 +407,7 @@ class FoldersFragment : AbsMainActivityFragment(R.layout.fragment_folder), } private fun checkForMargins() { - if (mainActivity.bottomNavigationView.isVisible) { + if (mainActivity.isBottomNavVisible) { binding.recyclerView.updateLayoutParams { bottomMargin = dip(R.dimen.bottom_nav_height) } diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/home/HomeFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/home/HomeFragment.kt index 5aecc5427..6d42e2801 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/home/HomeFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/home/HomeFragment.kt @@ -192,7 +192,7 @@ class HomeFragment : } private fun checkForMargins() { - if (mainActivity.bottomNavigationView.isVisible) { + if (mainActivity.isBottomNavVisible) { binding.recyclerView.updateLayoutParams { bottomMargin = dip(R.dimen.bottom_nav_height) } diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/library/LibraryFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/library/LibraryFragment.kt index e70047a3e..eb66ca5b6 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/library/LibraryFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/library/LibraryFragment.kt @@ -80,7 +80,7 @@ class LibraryFragment : AbsMainActivityFragment(R.layout.fragment_library) { navGraph.setStartDestination(categoryInfo.category.id) } navController.graph = navGraph - NavigationUI.setupWithNavController(mainActivity.bottomNavigationView, navController) + NavigationUI.setupWithNavController(mainActivity.navigationView, navController) navController.addOnDestinationChangedListener { _, _, _ -> binding.appBarLayout.setExpanded(true, true) } diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/search/SearchFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/search/SearchFragment.kt index 2e9488277..808aa6732 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/search/SearchFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/search/SearchFragment.kt @@ -147,7 +147,7 @@ class SearchFragment : AbsMainActivityFragment(R.layout.fragment_search), } private fun checkForMargins() { - if (mainActivity.bottomNavigationView.isVisible) { + if (mainActivity.isBottomNavVisible) { binding.recyclerView.updateLayoutParams { bottomMargin = dip(R.dimen.bottom_nav_height) } diff --git a/app/src/main/res/layout-land/sliding_music_panel_layout.xml b/app/src/main/res/layout-land/sliding_music_panel_layout.xml new file mode 100644 index 000000000..c314081d8 --- /dev/null +++ b/app/src/main/res/layout-land/sliding_music_panel_layout.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/sliding_music_panel_layout.xml b/app/src/main/res/layout/sliding_music_panel_layout.xml index fc67d2327..e8ce8ffc8 100644 --- a/app/src/main/res/layout/sliding_music_panel_layout.xml +++ b/app/src/main/res/layout/sliding_music_panel_layout.xml @@ -43,14 +43,13 @@ + app:menu="@menu/bottom_navigation_main" + tools:viewBindingType="com.google.android.material.navigation.NavigationBarView"/> \ No newline at end of file diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index fedd0d28f..1f442a00e 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -12,8 +12,8 @@ 8dp 56dp - 72dp - 128dp + 80dp + 136dp 96dp 96dp From 7b5e7ecef88ef64014778870060c94ca10ae960a Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Mon, 6 Jun 2022 00:08:03 +0530 Subject: [PATCH 084/280] Show remaining time in Sleep timer dialog --- .../retromusic/dialogs/SleepTimerDialog.kt | 124 ++++++++++-------- .../player/blur/BlurPlayerFragment.kt | 6 +- .../player/cardblur/CardBlurFragment.kt | 5 + .../player/circle/CirclePlayerFragment.kt | 2 +- 4 files changed, 81 insertions(+), 56 deletions(-) diff --git a/app/src/main/java/code/name/monkey/retromusic/dialogs/SleepTimerDialog.kt b/app/src/main/java/code/name/monkey/retromusic/dialogs/SleepTimerDialog.kt index 9ee506958..6a44e4638 100755 --- a/app/src/main/java/code/name/monkey/retromusic/dialogs/SleepTimerDialog.kt +++ b/app/src/main/java/code/name/monkey/retromusic/dialogs/SleepTimerDialog.kt @@ -17,6 +17,7 @@ package code.name.monkey.retromusic.dialogs import android.app.AlarmManager import android.app.Dialog import android.app.PendingIntent +import android.content.DialogInterface import android.content.Intent import android.os.Bundle import android.os.CountDownTimer @@ -25,43 +26,45 @@ import android.widget.CheckBox import android.widget.SeekBar import android.widget.TextView import android.widget.Toast +import androidx.appcompat.app.AlertDialog import androidx.core.content.getSystemService +import androidx.core.view.isVisible import androidx.fragment.app.DialogFragment import code.name.monkey.appthemehelper.util.VersionUtils import code.name.monkey.retromusic.R import code.name.monkey.retromusic.databinding.DialogSleepTimerBinding import code.name.monkey.retromusic.extensions.addAccentColor -import code.name.monkey.retromusic.extensions.colorButtons import code.name.monkey.retromusic.extensions.materialDialog import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.service.MusicService import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_PENDING_QUIT import code.name.monkey.retromusic.service.MusicService.Companion.ACTION_QUIT +import code.name.monkey.retromusic.util.MusicUtil import code.name.monkey.retromusic.util.PreferenceUtil -import com.afollestad.materialdialogs.MaterialDialog -import com.afollestad.materialdialogs.WhichButton -import com.afollestad.materialdialogs.actions.getActionButton class SleepTimerDialog : DialogFragment() { private var seekArcProgress: Int = 0 private lateinit var timerUpdater: TimerUpdater - private lateinit var dialog: MaterialDialog - private lateinit var shouldFinishLastSong: CheckBox - private lateinit var timerDisplay: TextView + private lateinit var dialog: AlertDialog + + private var _binding: DialogSleepTimerBinding? = null + private val binding get() = _binding!! + + private val shouldFinishLastSong: CheckBox get() = binding.shouldFinishLastSong + private val seekBar: SeekBar get() = binding.seekBar + private val timerDisplay: TextView get() = binding.timerDisplay override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { timerUpdater = TimerUpdater() - val binding = DialogSleepTimerBinding.inflate(layoutInflater) - shouldFinishLastSong = binding.shouldFinishLastSong - timerDisplay = binding.timerDisplay + _binding = DialogSleepTimerBinding.inflate(layoutInflater) val finishMusic = PreferenceUtil.isSleepTimerFinishMusic shouldFinishLastSong.apply { addAccentColor() isChecked = finishMusic } - binding.seekBar.apply { + seekBar.apply { addAccentColor() seekArcProgress = PreferenceUtil.lastSleepTimerValue updateTimeDisplayTime() @@ -85,47 +88,65 @@ class SleepTimerDialog : DialogFragment() { PreferenceUtil.lastSleepTimerValue = seekArcProgress } }) - return materialDialog(R.string.action_sleep_timer) - .setView(binding.root) - .setPositiveButton(R.string.action_set) { _, _ -> - PreferenceUtil.isSleepTimerFinishMusic = shouldFinishLastSong.isChecked - val minutes = seekArcProgress - val pi = makeTimerPendingIntent(PendingIntent.FLAG_CANCEL_CURRENT) - val nextSleepTimerElapsedTime = SystemClock.elapsedRealtime() + minutes * 60 * 1000 - PreferenceUtil.nextSleepTimerElapsedRealTime = nextSleepTimerElapsedTime.toInt() - val am = requireContext().getSystemService() - am?.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP, nextSleepTimerElapsedTime, pi) - Toast.makeText( - requireContext(), - requireContext().resources.getString(R.string.sleep_timer_set, minutes), - Toast.LENGTH_SHORT - ).show() - } - .setNegativeButton(android.R.string.cancel) { _, _ -> - val previous = makeTimerPendingIntent(PendingIntent.FLAG_NO_CREATE) - if (previous != null) { - val am = requireContext().getSystemService() - am?.cancel(previous) - previous.cancel() - Toast.makeText( - requireContext(), - requireContext().resources.getString(R.string.sleep_timer_canceled), - Toast.LENGTH_SHORT - ).show() - val musicService = MusicPlayerRemote.musicService - if (musicService != null && musicService.pendingQuit) { - musicService.pendingQuit = false + materialDialog(R.string.action_sleep_timer).apply { + if (PreferenceUtil.nextSleepTimerElapsedRealTime > System.currentTimeMillis()) { + seekBar.isVisible = false + shouldFinishLastSong.isVisible = false + timerUpdater.start() + setPositiveButton(android.R.string.ok, null) + setNegativeButton(R.string.cast_stop) { _, _ -> + timerUpdater.cancel() + val previous = makeTimerPendingIntent(PendingIntent.FLAG_NO_CREATE) + if (previous != null) { + val am = requireContext().getSystemService() + am?.cancel(previous) + previous.cancel() Toast.makeText( requireContext(), requireContext().resources.getString(R.string.sleep_timer_canceled), Toast.LENGTH_SHORT ).show() + val musicService = MusicPlayerRemote.musicService + if (musicService != null && musicService.pendingQuit) { + musicService.pendingQuit = false + Toast.makeText( + requireContext(), + requireContext().resources.getString(R.string.sleep_timer_canceled), + Toast.LENGTH_SHORT + ).show() + } } } + } else { + seekBar.isVisible = true + shouldFinishLastSong.isVisible = true + setPositiveButton(R.string.action_set) { _, _ -> + PreferenceUtil.isSleepTimerFinishMusic = shouldFinishLastSong.isChecked + val minutes = seekArcProgress + val pi = makeTimerPendingIntent(PendingIntent.FLAG_CANCEL_CURRENT) + val nextSleepTimerElapsedTime = + SystemClock.elapsedRealtime() + minutes * 60 * 1000 + PreferenceUtil.nextSleepTimerElapsedRealTime = nextSleepTimerElapsedTime.toInt() + val am = requireContext().getSystemService() + am?.setExact( + AlarmManager.ELAPSED_REALTIME_WAKEUP, + nextSleepTimerElapsedTime, + pi + ) + + Toast.makeText( + requireContext(), + requireContext().resources.getString(R.string.sleep_timer_set, minutes), + Toast.LENGTH_SHORT + ).show() + } } - .create() - .colorButtons() + setView(binding.root) + dialog = create() + + } + return dialog } private fun updateTimeDisplayTime() { @@ -147,14 +168,10 @@ class SleepTimerDialog : DialogFragment() { } else intent.setAction(ACTION_QUIT) } - private fun updateCancelButton() { - val musicService = MusicPlayerRemote.musicService - if (musicService != null && musicService.pendingQuit) { - dialog.getActionButton(WhichButton.NEUTRAL).text = - dialog.context.getString(R.string.cancel_current_timer) - } else { - dialog.getActionButton(WhichButton.NEUTRAL).text = null - } + override fun onDismiss(dialog: DialogInterface) { + super.onDismiss(dialog) + timerUpdater.cancel() + _binding = null } private inner class TimerUpdater : @@ -164,10 +181,9 @@ class SleepTimerDialog : DialogFragment() { ) { override fun onTick(millisUntilFinished: Long) { + timerDisplay.text = MusicUtil.getReadableDurationString(millisUntilFinished) } - override fun onFinish() { - updateCancelButton() - } + override fun onFinish() {} } } diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/blur/BlurPlayerFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/blur/BlurPlayerFragment.kt index 459dc8c43..8c631bb01 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/blur/BlurPlayerFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/blur/BlurPlayerFragment.kt @@ -139,9 +139,13 @@ class BlurPlayerFragment : AbsPlayerFragment(R.layout.fragment_blur), updateBlur() } + override fun onPause() { + super.onPause() + lastRequest = null + } + override fun onResume() { super.onResume() - lastRequest = null PreferenceManager.getDefaultSharedPreferences(requireContext()) .registerOnSharedPreferenceChangeListener(this) } diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/cardblur/CardBlurFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/cardblur/CardBlurFragment.kt index bd6f7b64e..10db4df81 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/cardblur/CardBlurFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/cardblur/CardBlurFragment.kt @@ -152,6 +152,11 @@ class CardBlurFragment : AbsPlayerFragment(R.layout.fragment_card_blur_player), } } + override fun onPause() { + super.onPause() + lastRequest = null + } + override fun onResume() { super.onResume() lastRequest = null diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/circle/CirclePlayerFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/circle/CirclePlayerFragment.kt index e3ed6830e..4186bad55 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/circle/CirclePlayerFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/circle/CirclePlayerFragment.kt @@ -162,7 +162,6 @@ class CirclePlayerFragment : AbsPlayerFragment(R.layout.fragment_circle_player), override fun onResume() { super.onResume() - lastRequest = null progressViewUpdateHelper.start() if (audioVolumeObserver == null) { audioVolumeObserver = AudioVolumeObserver(requireActivity()) @@ -179,6 +178,7 @@ class CirclePlayerFragment : AbsPlayerFragment(R.layout.fragment_circle_player), override fun onPause() { super.onPause() + lastRequest = null progressViewUpdateHelper.stop() } From ce5a8292e2cc9e8349eb7944ced0ab12b81a72c5 Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Mon, 6 Jun 2022 00:12:37 +0530 Subject: [PATCH 085/280] Disable wallpaper accent by default --- .../src/main/java/code/name/monkey/appthemehelper/ThemeStore.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appthemehelper/src/main/java/code/name/monkey/appthemehelper/ThemeStore.kt b/appthemehelper/src/main/java/code/name/monkey/appthemehelper/ThemeStore.kt index 6b8406b8d..74800b49e 100644 --- a/appthemehelper/src/main/java/code/name/monkey/appthemehelper/ThemeStore.kt +++ b/appthemehelper/src/main/java/code/name/monkey/appthemehelper/ThemeStore.kt @@ -350,7 +350,7 @@ private constructor(private val mContext: Context) : ThemeStorePrefKeys, ThemeSt private fun isWallpaperAccentEnabled(context: Context): Boolean { return PreferenceManager.getDefaultSharedPreferences(context) - .getBoolean("wallpaper_accent", VersionUtils.hasOreoMR1() && !VersionUtils.hasS()) + .getBoolean("wallpaper_accent", false) } } } \ No newline at end of file From 52fa8ebf423296e53314e94f5f12a7be83037f07 Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Mon, 6 Jun 2022 10:27:39 +0530 Subject: [PATCH 086/280] Added default sort order for MediaStore's default sort order --- .../monkey/retromusic/adapter/song/SongAdapter.kt | 1 + .../retromusic/fragments/songs/SongsFragment.kt | 8 ++++++++ .../code/name/monkey/retromusic/helper/SortOrder.kt | 4 +++- .../code/name/monkey/retromusic/util/MusicUtil.kt | 13 ++++++++----- app/src/main/res/values/ids.xml | 1 + app/src/main/res/values/strings.xml | 1 + 6 files changed, 22 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/song/SongAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/song/SongAdapter.kt index a7c6b634d..5023f7ba1 100644 --- a/app/src/main/java/code/name/monkey/retromusic/adapter/song/SongAdapter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/adapter/song/SongAdapter.kt @@ -159,6 +159,7 @@ open class SongAdapter( override fun getPopupText(position: Int): String { val sectionName: String? = when (PreferenceUtil.songSortOrder) { + SortOrder.SongSortOrder.SONG_DEFAULT -> return MusicUtil.getSectionName(dataSet[position].title, true) SortOrder.SongSortOrder.SONG_A_Z, SortOrder.SongSortOrder.SONG_Z_A -> dataSet[position].title SortOrder.SongSortOrder.SONG_ALBUM -> dataSet[position].albumName SortOrder.SongSortOrder.SONG_ARTIST -> dataSet[position].artistName diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/songs/SongsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/songs/SongsFragment.kt index 73a7f5e28..a728e2828 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/songs/SongsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/songs/SongsFragment.kt @@ -142,6 +142,13 @@ class SongsFragment : AbsRecyclerViewCustomGridSizeFragment SongSortOrder.SONG_DEFAULT R.id.action_song_sort_order_asc -> SongSortOrder.SONG_A_Z R.id.action_song_sort_order_desc -> SongSortOrder.SONG_Z_A R.id.action_song_sort_order_artist -> SongSortOrder.SONG_ARTIST diff --git a/app/src/main/java/code/name/monkey/retromusic/helper/SortOrder.kt b/app/src/main/java/code/name/monkey/retromusic/helper/SortOrder.kt index b77e39d09..ee3e2a018 100644 --- a/app/src/main/java/code/name/monkey/retromusic/helper/SortOrder.kt +++ b/app/src/main/java/code/name/monkey/retromusic/helper/SortOrder.kt @@ -72,8 +72,10 @@ class SortOrder { companion object { + const val SONG_DEFAULT = MediaStore.Audio.Media.DEFAULT_SORT_ORDER + /* Song sort order A-Z */ - const val SONG_A_Z = MediaStore.Audio.Media.DEFAULT_SORT_ORDER + const val SONG_A_Z = MediaStore.Audio.Media.TITLE /* Song sort order Z-A */ const val SONG_Z_A = "$SONG_A_Z DESC" diff --git a/app/src/main/java/code/name/monkey/retromusic/util/MusicUtil.kt b/app/src/main/java/code/name/monkey/retromusic/util/MusicUtil.kt index 4fa2d4f60..6f9a723eb 100644 --- a/app/src/main/java/code/name/monkey/retromusic/util/MusicUtil.kt +++ b/app/src/main/java/code/name/monkey/retromusic/util/MusicUtil.kt @@ -226,18 +226,21 @@ object MusicUtil : KoinComponent { } } - fun getSectionName(mediaTitle: String?): String { + fun getSectionName(mediaTitle: String?, stripPrefix: Boolean = false): String { var musicMediaTitle = mediaTitle return try { if (musicMediaTitle.isNullOrEmpty()) { return "-" } musicMediaTitle = musicMediaTitle.trim { it <= ' ' }.lowercase() - if (musicMediaTitle.startsWith("the ")) { - musicMediaTitle = musicMediaTitle.substring(4) - } else if (musicMediaTitle.startsWith("a ")) { - musicMediaTitle = musicMediaTitle.substring(2) + if (stripPrefix) { + if (musicMediaTitle.startsWith("the ")) { + musicMediaTitle = musicMediaTitle.substring(4) + } else if (musicMediaTitle.startsWith("a ")) { + musicMediaTitle = musicMediaTitle.substring(2) + } } + if (musicMediaTitle.isEmpty()) { "" } else musicMediaTitle.substring(0, 1).uppercase() diff --git a/app/src/main/res/values/ids.xml b/app/src/main/res/values/ids.xml index f831393ed..1ebc829d9 100644 --- a/app/src/main/res/values/ids.xml +++ b/app/src/main/res/values/ids.xml @@ -12,6 +12,7 @@ + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 95b81e240..d56dbaa73 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -501,6 +501,7 @@ Composer Date added Date modified + Default Song count Song count desc Year From c25eff4c0d79742f5a4696f341b5d6098e7e2c34 Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Mon, 6 Jun 2022 16:36:07 +0530 Subject: [PATCH 087/280] Bump version and update changelog --- app/build.gradle | 4 ++-- app/src/main/assets/retro-changelog.html | 9 +++++++-- app/src/main/java/code/name/monkey/retromusic/App.kt | 5 +++++ 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index b0ae9c498..49b56f546 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -14,8 +14,8 @@ android { vectorDrawables.useSupportLibrary = true applicationId "code.name.monkey.retromusic" - versionCode 10587 - versionName '5.9.0' + versionCode 10588 + versionName '6.0.0' buildConfigField("String", "GOOGLE_PLAY_LICENSING_KEY", "\"${getProperty(getProperties('../public.properties'), 'GOOGLE_PLAY_LICENSE_KEY')}\"") } diff --git a/app/src/main/assets/retro-changelog.html b/app/src/main/assets/retro-changelog.html index 83444d24c..c5ac655e6 100644 --- a/app/src/main/assets/retro-changelog.html +++ b/app/src/main/assets/retro-changelog.html @@ -63,16 +63,21 @@
-
May 14, 2022
-

v5.9.0

+
June 7, 2022
+

v6.0.0

What's New

  • Better Cast
  • Mini player in settings screen
  • +
  • Changed Seekbar with Sliders
  • +
  • Added NavigationRailView for Landscape
  • +
  • Show remaining time in Sleep timer dialog

Fixed

  • Fixed Top/Recent Artists/Albums not updating (Wrong sort order)
  • +
  • Fixed all Blacklist related crashes
  • +
  • Fix restart button not working in crash activity
diff --git a/app/src/main/java/code/name/monkey/retromusic/App.kt b/app/src/main/java/code/name/monkey/retromusic/App.kt index 2c90a8c59..f92442df4 100644 --- a/app/src/main/java/code/name/monkey/retromusic/App.kt +++ b/app/src/main/java/code/name/monkey/retromusic/App.kt @@ -15,6 +15,7 @@ package code.name.monkey.retromusic import android.app.Application +import androidx.preference.PreferenceManager import cat.ereza.customactivityoncrash.config.CaocConfig import code.name.monkey.appthemehelper.ThemeStore import code.name.monkey.appthemehelper.util.VersionUtils @@ -72,6 +73,10 @@ class App : Application() { // setting Error activity CaocConfig.Builder.create().errorActivity(ErrorActivity::class.java) .restartActivity(MainActivity::class.java).apply() + + // Set Default values for now playing preferences + // This will reduce start time for now playing settings fragment as Preference listener of AbsSlidingMusicPanelActivity won't be called + PreferenceManager.setDefaultValues(this, R.xml.pref_now_playing_screen, false) } override fun onTerminate() { From 46f713e6884be08e00541e4fa0646cb2f6cb5a12 Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Mon, 6 Jun 2022 17:27:22 +0530 Subject: [PATCH 088/280] Start audio fade animator on Main thread --- .../java/code/name/monkey/retromusic/service/AudioFader.kt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/code/name/monkey/retromusic/service/AudioFader.kt b/app/src/main/java/code/name/monkey/retromusic/service/AudioFader.kt index 009b0c40d..d79df4e43 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/AudioFader.kt +++ b/app/src/main/java/code/name/monkey/retromusic/service/AudioFader.kt @@ -3,6 +3,8 @@ package code.name.monkey.retromusic.service import android.animation.Animator import android.animation.ValueAnimator import android.media.MediaPlayer +import android.os.Handler +import android.os.Looper import androidx.core.animation.doOnEnd import code.name.monkey.retromusic.service.playback.Playback import code.name.monkey.retromusic.util.PreferenceUtil @@ -57,7 +59,9 @@ class AudioFader { animator.doOnEnd { callback.run() } - animator.start() + Handler(Looper.getMainLooper()).post { + animator.start() + } } } } \ No newline at end of file From 2ef5a5903d0b254e1b1e0fa94eb489b7cd033726 Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Mon, 6 Jun 2022 17:30:54 +0530 Subject: [PATCH 089/280] Fixed BottomSheet height when Peek now playing theme is selected or was selected before changing to other theme --- .../retromusic/activities/base/AbsSlidingMusicPanelActivity.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 7819bb125..2ac89e7e8 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 @@ -202,13 +202,13 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity(), miniPlayerFragment?.setUpButtons() } NOW_PLAYING_SCREEN_ID -> { + chooseFragmentForTheme() binding.slidingPanel.updateLayoutParams { height = if (nowPlayingScreen != Peek) { ViewGroup.LayoutParams.MATCH_PARENT } else { ViewGroup.LayoutParams.WRAP_CONTENT } - chooseFragmentForTheme() onServiceConnected() } } From 33a0d113b87ac2064a6bd716295422ba10bced2f Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Mon, 6 Jun 2022 20:39:41 +0530 Subject: [PATCH 090/280] Fixed Splash screen issues --- app/src/main/AndroidManifest.xml | 1 + .../monkey/retromusic/fragments/playlists/PlaylistsFragment.kt | 2 +- app/src/main/res/layout/fragment_main_settings.xml | 3 ++- app/src/main/res/values-v31/styles.xml | 1 - app/src/main/res/values/styles.xml | 2 +- 5 files changed, 5 insertions(+), 4 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 89cf058f6..dabe48036 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -39,6 +39,7 @@ android:supportsRtl="true" android:theme="@style/Theme.RetroMusic.FollowSystem" android:usesCleartextTraffic="true" + android:requestLegacyExternalStorage="true" tools:targetApi="m"> gridSizeMenu.findItem(R.id.action_grid_size_7).isChecked = true 8 -> gridSizeMenu.findItem(R.id.action_grid_size_8).isChecked = true } - val gridSize = if (RetroUtil.isLandscape) 4 else 2 + val gridSize = if (RetroUtil.isLandscape) 4 else 3 if (gridSize < 8) { gridSizeMenu.findItem(R.id.action_grid_size_8).isVisible = false } diff --git a/app/src/main/res/layout/fragment_main_settings.xml b/app/src/main/res/layout/fragment_main_settings.xml index 0168bf92f..31398ac1e 100644 --- a/app/src/main/res/layout/fragment_main_settings.xml +++ b/app/src/main/res/layout/fragment_main_settings.xml @@ -11,7 +11,8 @@ android:id="@+id/container" android:layout_width="match_parent" android:layout_height="wrap_content" - android:orientation="vertical"> + android:orientation="vertical" + android:paddingBottom="@dimen/mini_player_height"> @drawable/avd_splash 1000 - @style/Theme.RetroMusic.FollowSystem diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index f56973e14..4126bcea4 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -123,7 +123,7 @@ 0dp - From b28d5678bc7b803ecea2134e848b5a92aea83b7f Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Mon, 6 Jun 2022 21:35:58 +0530 Subject: [PATCH 091/280] Added MD3 switch --- app/build.gradle | 2 +- .../retromusic/extensions/ColorExtensions.kt | 4 +- .../main/res/layout/list_item_view_switch.xml | 3 +- .../layout/list_item_view_switch_no_title.xml | 3 +- .../name/monkey/appthemehelper/ThemeStore.kt | 2 +- .../common/views/ATEAccentTextView.kt | 5 +- .../appthemehelper/common/views/ATESwitch.kt | 30 ++++-------- .../appthemehelper/util/TintHelper.java | 46 +++++++++++-------- .../layout/ate_preference_switch_support.xml | 1 + 9 files changed, 46 insertions(+), 50 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 49b56f546..b5f0c4863 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -14,7 +14,7 @@ android { vectorDrawables.useSupportLibrary = true applicationId "code.name.monkey.retromusic" - versionCode 10588 + versionCode 10590 versionName '6.0.0' buildConfigField("String", "GOOGLE_PLAY_LICENSING_KEY", "\"${getProperty(getProperties('../public.properties'), 'GOOGLE_PLAY_LICENSE_KEY')}\"") diff --git a/app/src/main/java/code/name/monkey/retromusic/extensions/ColorExtensions.kt b/app/src/main/java/code/name/monkey/retromusic/extensions/ColorExtensions.kt index 9d27c12bc..b0a1759f3 100644 --- a/app/src/main/java/code/name/monkey/retromusic/extensions/ColorExtensions.kt +++ b/app/src/main/java/code/name/monkey/retromusic/extensions/ColorExtensions.kt @@ -135,7 +135,9 @@ fun Button.accentTextColor() { fun MaterialButton.accentBackgroundColor() { if (materialYou) return - backgroundTintList = ColorStateList.valueOf(context.accentColor()) + backgroundTintList = ColorStateList( + arrayOf(intArrayOf(android.R.attr.state_enabled), intArrayOf()), + intArrayOf(context.accentColor(), context.accentColor().addAlpha(0.12f))) } fun MaterialButton.accentOutlineColor() { diff --git a/app/src/main/res/layout/list_item_view_switch.xml b/app/src/main/res/layout/list_item_view_switch.xml index a536b1fa6..255bb87b2 100644 --- a/app/src/main/res/layout/list_item_view_switch.xml +++ b/app/src/main/res/layout/list_item_view_switch.xml @@ -79,8 +79,7 @@ app:showText="false" android:clickable="false" android:focusable="false" - app:track="@drawable/switch_track" - android:thumb="@drawable/switch_thumb" + style="@style/Widget.Material3.CompoundButton.MaterialSwitch" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" /> diff --git a/app/src/main/res/layout/list_item_view_switch_no_title.xml b/app/src/main/res/layout/list_item_view_switch_no_title.xml index 4f65d0a6e..e23e42a1b 100644 --- a/app/src/main/res/layout/list_item_view_switch_no_title.xml +++ b/app/src/main/res/layout/list_item_view_switch_no_title.xml @@ -65,8 +65,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" app:showText="false" - app:track="@drawable/switch_track" - android:thumb="@drawable/switch_thumb" + style="@style/Widget.Material3.CompoundButton.MaterialSwitch" android:clickable="false" android:focusable="false" app:layout_constraintBottom_toBottomOf="parent" diff --git a/appthemehelper/src/main/java/code/name/monkey/appthemehelper/ThemeStore.kt b/appthemehelper/src/main/java/code/name/monkey/appthemehelper/ThemeStore.kt index 74800b49e..c1dca0f66 100644 --- a/appthemehelper/src/main/java/code/name/monkey/appthemehelper/ThemeStore.kt +++ b/appthemehelper/src/main/java/code/name/monkey/appthemehelper/ThemeStore.kt @@ -343,7 +343,7 @@ private constructor(private val mContext: Context) : ThemeStorePrefKeys, ThemeSt return true } - private fun isMD3Enabled(context: Context): Boolean { + fun isMD3Enabled(context: Context): Boolean { return PreferenceManager.getDefaultSharedPreferences(context) .getBoolean(ThemeStorePrefKeys.KEY_MATERIAL_YOU, VersionUtils.hasS()) } diff --git a/appthemehelper/src/main/java/code/name/monkey/appthemehelper/common/views/ATEAccentTextView.kt b/appthemehelper/src/main/java/code/name/monkey/appthemehelper/common/views/ATEAccentTextView.kt index 9f88e54ec..13359781b 100644 --- a/appthemehelper/src/main/java/code/name/monkey/appthemehelper/common/views/ATEAccentTextView.kt +++ b/appthemehelper/src/main/java/code/name/monkey/appthemehelper/common/views/ATEAccentTextView.kt @@ -26,9 +26,6 @@ class ATEAccentTextView @JvmOverloads constructor( ) : AppCompatTextView(context, attrs, defStyleAttr) { init { - setTextColor( - // Set MD3 accent if MD3 is enabled or in-app accent otherwise - ThemeStore.accentColor(context) - ) + setTextColor(ThemeStore.accentColor(context)) } } diff --git a/appthemehelper/src/main/java/code/name/monkey/appthemehelper/common/views/ATESwitch.kt b/appthemehelper/src/main/java/code/name/monkey/appthemehelper/common/views/ATESwitch.kt index c4dc3c77c..869f5db83 100644 --- a/appthemehelper/src/main/java/code/name/monkey/appthemehelper/common/views/ATESwitch.kt +++ b/appthemehelper/src/main/java/code/name/monkey/appthemehelper/common/views/ATESwitch.kt @@ -2,34 +2,24 @@ package code.name.monkey.appthemehelper.common.views import android.content.Context import android.util.AttributeSet -import androidx.appcompat.widget.SwitchCompat import androidx.core.view.isVisible import code.name.monkey.appthemehelper.ATH import code.name.monkey.appthemehelper.ThemeStore +import com.google.android.material.materialswitch.MaterialSwitch /** * @author Aidan Follestad (afollestad) */ -class ATESwitch : SwitchCompat { +class ATESwitch @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = -1, +) : MaterialSwitch(context, attrs, defStyleAttr) { - constructor(context: Context) : super(context) { - init(context) - } - - constructor(context: Context, attrs: AttributeSet) : super(context, attrs) { - init(context) - } - - constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super( - context, - attrs, - defStyleAttr - ) { - init(context) - } - - private fun init(context: Context) { - ATH.setTint(this, ThemeStore.accentColor(context)) + init { + if (!isInEditMode && !ThemeStore.isMD3Enabled(context)) { + ATH.setTint(this, ThemeStore.accentColor(context)) + } } override fun isShown(): Boolean { diff --git a/appthemehelper/src/main/java/code/name/monkey/appthemehelper/util/TintHelper.java b/appthemehelper/src/main/java/code/name/monkey/appthemehelper/util/TintHelper.java index 001b51dd7..6f985b0da 100755 --- a/appthemehelper/src/main/java/code/name/monkey/appthemehelper/util/TintHelper.java +++ b/appthemehelper/src/main/java/code/name/monkey/appthemehelper/util/TintHelper.java @@ -3,6 +3,7 @@ package code.name.monkey.appthemehelper.util; import android.annotation.SuppressLint; import android.content.Context; import android.content.res.ColorStateList; +import android.graphics.Color; import android.graphics.PorterDuff; import android.graphics.drawable.Drawable; import android.graphics.drawable.RippleDrawable; @@ -14,7 +15,6 @@ import android.widget.ImageView; import android.widget.ProgressBar; import android.widget.RadioButton; import android.widget.SeekBar; -import android.widget.Switch; import android.widget.TextView; import androidx.annotation.CheckResult; @@ -28,6 +28,7 @@ import androidx.core.content.ContextCompat; import androidx.core.graphics.drawable.DrawableCompat; import com.google.android.material.floatingactionbutton.FloatingActionButton; +import com.google.android.material.materialswitch.MaterialSwitch; import java.lang.reflect.Field; @@ -210,17 +211,6 @@ public final class TintHelper { image.setColorFilter(color, PorterDuff.Mode.SRC_ATOP); } - public static void setTint(@NonNull Switch switchView, @ColorInt int color, boolean useDarker) { - if (switchView.getTrackDrawable() != null) { - switchView.setTrackDrawable(modifySwitchDrawable(switchView.getContext(), - switchView.getTrackDrawable(), color, false, false, useDarker)); - } - if (switchView.getThumbDrawable() != null) { - switchView.setThumbDrawable(modifySwitchDrawable(switchView.getContext(), - switchView.getThumbDrawable(), color, true, false, useDarker)); - } - } - public static void setTint(@NonNull SwitchCompat switchView, @ColorInt int color, boolean useDarker) { if (switchView.getTrackDrawable() != null) { switchView.setTrackDrawable(modifySwitchDrawable(switchView.getContext(), @@ -232,6 +222,15 @@ public final class TintHelper { } } + public static void setTint(@NonNull MaterialSwitch switchView, @ColorInt int color, boolean useDarker) { + if (switchView.getTrackDrawable() != null) { + switchView.setTrackTintList(createSwitchDrawableTintList(switchView.getContext(), color, false, true, useDarker)); + } + if (switchView.getThumbDrawable() != null) { + switchView.setThumbTintList(createSwitchDrawableTintList(switchView.getContext(), color, true, true, useDarker)); + } + } + public static void setTintAuto(final @NonNull View view, final @ColorInt int color, boolean background) { setTintAuto(view, color, background, ATHUtil.INSTANCE.isWindowBackgroundDark(view.getContext())); @@ -254,8 +253,8 @@ public final class TintHelper { setTint((CheckBox) view, color, isDark); } else if (view instanceof ImageView) { setTint((ImageView) view, color); - } else if (view instanceof Switch) { - setTint((Switch) view, color, isDark); + } else if (view instanceof MaterialSwitch) { + setTint((MaterialSwitch) view, color, isDark); } else if (view instanceof SwitchCompat) { setTint((SwitchCompat) view, color, isDark); } else { @@ -388,12 +387,15 @@ public final class TintHelper { }); } - private static Drawable modifySwitchDrawable(@NonNull Context context, @NonNull Drawable from, @ColorInt int tint, - boolean thumb, boolean compatSwitch, boolean useDarker) { + private static ColorStateList createSwitchDrawableTintList(@NonNull Context context, @ColorInt int tint, + boolean thumb, boolean compatSwitch, boolean useDarker) { + int lighterTint = ColorUtil.INSTANCE.blendColors(tint, Color.WHITE, 0.4f); + int darkerTint = ColorUtil.INSTANCE.shiftColor(tint, 0.8f); if (useDarker) { - tint = ColorUtil.INSTANCE.shiftColor(tint, 1.1f); + tint = (compatSwitch && !thumb) ? lighterTint : darkerTint; + } else { + tint = (compatSwitch && !thumb) ? darkerTint : Color.WHITE; } - tint = ColorUtil.INSTANCE.adjustAlpha(tint, (compatSwitch && !thumb) ? 0.5f : 1.0f); int disabled; int normal; if (thumb) { @@ -413,7 +415,7 @@ public final class TintHelper { normal = ColorUtil.INSTANCE.stripAlpha(normal); } - final ColorStateList sl = new ColorStateList( + return new ColorStateList( new int[][]{ new int[]{-android.R.attr.state_enabled}, new int[]{android.R.attr.state_enabled, -android.R.attr.state_activated, @@ -428,6 +430,12 @@ public final class TintHelper { tint } ); + } + + private static Drawable modifySwitchDrawable(@NonNull Context context, @NonNull Drawable from, @ColorInt int tint, + boolean thumb, boolean compatSwitch, boolean useDarker) { + + ColorStateList sl = createSwitchDrawableTintList(context, tint, thumb, compatSwitch, useDarker); return createTintedDrawable(from, sl); } diff --git a/appthemehelper/src/main/res/layout/ate_preference_switch_support.xml b/appthemehelper/src/main/res/layout/ate_preference_switch_support.xml index 50d68fcec..96e84ab06 100755 --- a/appthemehelper/src/main/res/layout/ate_preference_switch_support.xml +++ b/appthemehelper/src/main/res/layout/ate_preference_switch_support.xml @@ -1,6 +1,7 @@ Date: Mon, 6 Jun 2022 23:45:17 +0530 Subject: [PATCH 092/280] Disabled Jetifier --- .../main/java/code/name/monkey/retromusic/db/PlaylistDao.kt | 1 + .../retromusic/fragments/settings/AbsSettingsFragment.kt | 1 - .../fragments/settings/PersonalizeSettingsFragment.kt | 5 ++++- .../monkey/retromusic/views/insets/InsetsConstraintLayout.kt | 2 -- gradle.properties | 2 +- 5 files changed, 6 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/code/name/monkey/retromusic/db/PlaylistDao.kt b/app/src/main/java/code/name/monkey/retromusic/db/PlaylistDao.kt index 860d0652c..5e3564346 100644 --- a/app/src/main/java/code/name/monkey/retromusic/db/PlaylistDao.kt +++ b/app/src/main/java/code/name/monkey/retromusic/db/PlaylistDao.kt @@ -59,6 +59,7 @@ interface PlaylistDao { @Delete suspend fun deletePlaylistSongs(songs: List) + @RewriteQueriesToDropUnusedColumns @Query("SELECT * FROM SongEntity ,(SELECT playlist_id FROM PlaylistEntity WHERE playlist_name= :playlistName LIMIT 1) AS playlist WHERE playlist_creator_id= playlist.playlist_id") fun favoritesSongsLiveData(playlistName: String): LiveData> diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/AbsSettingsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/AbsSettingsFragment.kt index fece22696..af3e4a74b 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/AbsSettingsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/AbsSettingsFragment.kt @@ -24,7 +24,6 @@ import androidx.preference.ListPreference import androidx.preference.Preference import androidx.preference.PreferenceManager import code.name.monkey.appthemehelper.common.prefs.supportv7.ATEPreferenceFragmentCompat -import code.name.monkey.appthemehelper.util.VersionUtils import code.name.monkey.retromusic.R import code.name.monkey.retromusic.extensions.dip import code.name.monkey.retromusic.extensions.showToast diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/PersonalizeSettingsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/PersonalizeSettingsFragment.kt index 4c83c96c2..5b8508379 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/PersonalizeSettingsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/PersonalizeSettingsFragment.kt @@ -17,7 +17,10 @@ package code.name.monkey.retromusic.fragments.settings import android.os.Bundle import android.view.View import code.name.monkey.appthemehelper.common.prefs.supportv7.ATEListPreference -import code.name.monkey.retromusic.* +import code.name.monkey.retromusic.HOME_ALBUM_GRID_STYLE +import code.name.monkey.retromusic.HOME_ARTIST_GRID_STYLE +import code.name.monkey.retromusic.R +import code.name.monkey.retromusic.TAB_TEXT_MODE class PersonalizeSettingsFragment : AbsSettingsFragment() { diff --git a/app/src/main/java/code/name/monkey/retromusic/views/insets/InsetsConstraintLayout.kt b/app/src/main/java/code/name/monkey/retromusic/views/insets/InsetsConstraintLayout.kt index bfe6567d8..772145485 100644 --- a/app/src/main/java/code/name/monkey/retromusic/views/insets/InsetsConstraintLayout.kt +++ b/app/src/main/java/code/name/monkey/retromusic/views/insets/InsetsConstraintLayout.kt @@ -3,9 +3,7 @@ package code.name.monkey.retromusic.views.insets import android.content.Context import android.util.AttributeSet import androidx.constraintlayout.widget.ConstraintLayout -import code.name.monkey.retromusic.extensions.drawAboveSystemBarsWithPadding import code.name.monkey.retromusic.util.PreferenceUtil -import code.name.monkey.retromusic.util.RetroUtil import dev.chrisbanes.insetter.applyInsetter class InsetsConstraintLayout @JvmOverloads constructor( diff --git a/gradle.properties b/gradle.properties index 0bc9d912a..bc6ce417f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -16,6 +16,6 @@ org.gradle.parallel=true # https://developer.android.com/topic/libraries/support-library/androidx-rn android.useAndroidX=true # Automatically convert third-party libraries to use AndroidX -android.enableJetifier=true +android.enableJetifier=false # Kotlin code style for this project: "official" or "obsolete": kotlin.code.style=official \ No newline at end of file From e17aeecf77fd750c3842baeedac7f7f0c61c1e85 Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Mon, 6 Jun 2022 23:45:17 +0530 Subject: [PATCH 093/280] Update changelog --- app/build.gradle | 2 +- app/src/main/assets/retro-changelog.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index b5f0c4863..e203f7ea1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -15,7 +15,7 @@ android { applicationId "code.name.monkey.retromusic" versionCode 10590 - versionName '6.0.0' + versionName '6.0.0-beta' buildConfigField("String", "GOOGLE_PLAY_LICENSING_KEY", "\"${getProperty(getProperties('../public.properties'), 'GOOGLE_PLAY_LICENSE_KEY')}\"") } diff --git a/app/src/main/assets/retro-changelog.html b/app/src/main/assets/retro-changelog.html index c5ac655e6..9c9ea8418 100644 --- a/app/src/main/assets/retro-changelog.html +++ b/app/src/main/assets/retro-changelog.html @@ -64,7 +64,7 @@
June 7, 2022
-

v6.0.0

+

v6.0.0Beta

What's New