From 111546bc4c4a361adf85016c36d2297419cad946 Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Tue, 21 Jun 2022 14:05:14 +0530 Subject: [PATCH 1/5] Fixed playback speed and pitch issues --- .../monkey/retromusic/auto/AutoMusicProvider.kt | 4 ++-- .../monkey/retromusic/service/LocalPlayback.kt | 14 ++++++++++---- .../name/monkey/retromusic/service/MultiPlayer.kt | 12 ++++++------ .../name/monkey/retromusic/service/MusicService.kt | 13 +++---------- .../monkey/retromusic/service/PlaybackManager.kt | 8 -------- 5 files changed, 21 insertions(+), 30 deletions(-) diff --git a/app/src/main/java/code/name/monkey/retromusic/auto/AutoMusicProvider.kt b/app/src/main/java/code/name/monkey/retromusic/auto/AutoMusicProvider.kt index 1b11510a0..b6e267ed2 100644 --- a/app/src/main/java/code/name/monkey/retromusic/auto/AutoMusicProvider.kt +++ b/app/src/main/java/code/name/monkey/retromusic/auto/AutoMusicProvider.kt @@ -31,7 +31,7 @@ import java.lang.ref.WeakReference * Created by Beesham Sarendranauth (Beesham) */ class AutoMusicProvider( - val mContext: Context, + private val mContext: Context, private val songsRepository: SongRepository, private val albumsRepository: AlbumRepository, private val artistsRepository: ArtistRepository, @@ -138,7 +138,7 @@ class AutoMusicProvider( topPlayedRepository.notRecentlyPlayedTracks().take(8) } else -> { - emptyList() + emptyList() } } songs.forEach { song -> 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..c066da44a 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 @@ -7,6 +7,7 @@ import android.content.IntentFilter import android.media.AudioAttributes import android.media.AudioManager import android.media.MediaPlayer +import android.media.PlaybackParams import androidx.annotation.CallSuper import androidx.core.content.getSystemService import androidx.core.net.toUri @@ -17,6 +18,8 @@ import code.name.monkey.retromusic.R import code.name.monkey.retromusic.extensions.showToast import code.name.monkey.retromusic.service.playback.Playback import code.name.monkey.retromusic.util.PreferenceUtil.isAudioFocusEnabled +import code.name.monkey.retromusic.util.PreferenceUtil.playbackPitch +import code.name.monkey.retromusic.util.PreferenceUtil.playbackSpeed abstract class LocalPlayback(val context: Context) : Playback, MediaPlayer.OnErrorListener, MediaPlayer.OnCompletionListener { @@ -121,11 +124,14 @@ abstract class LocalPlayback(val context: Context) : Playback, MediaPlayer.OnErr } else { player.setDataSource(path) } - player.setAudioAttributes(AudioAttributes.Builder() - .setUsage(AudioAttributes.USAGE_MEDIA) - .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) - .build() + player.setAudioAttributes( + AudioAttributes.Builder() + .setUsage(AudioAttributes.USAGE_MEDIA) + .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) + .build() ) + player.playbackParams = PlaybackParams().setSpeed(playbackSpeed).setPitch(playbackPitch) + player.setOnPreparedListener { player.setOnPreparedListener(null) completion(true) 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..6ad5c6bbc 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 @@ -23,6 +23,7 @@ import code.name.monkey.retromusic.extensions.uri import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.service.playback.Playback.PlaybackCallbacks import code.name.monkey.retromusic.util.PreferenceUtil.isGapLessPlayback +import code.name.monkey.retromusic.util.logE /** * @author Andrew Neal, Karim Abou Zeid (kabouzeid) @@ -141,9 +142,7 @@ class MultiPlayer(context: Context) : LocalPlayback(context) { override fun release() { stop() mCurrentMediaPlayer.release() - if (mNextMediaPlayer != null) { - mNextMediaPlayer?.release() - } + mNextMediaPlayer?.release() } /** @@ -249,7 +248,7 @@ class MultiPlayer(context: Context) : LocalPlayback(context) { mCurrentMediaPlayer = MediaPlayer() mCurrentMediaPlayer.setWakeMode(context, PowerManager.PARTIAL_WAKE_LOCK) context.showToast(R.string.unplayable_file) - Log.e(TAG, what.toString() + extra) + logE(what.toString() + extra) return false } @@ -260,9 +259,9 @@ class MultiPlayer(context: Context) : LocalPlayback(context) { mCurrentMediaPlayer = mNextMediaPlayer!! isInitialized = true mNextMediaPlayer = null - if (callbacks != null) callbacks?.onTrackWentToNext() + callbacks?.onTrackWentToNext() } else { - if (callbacks != null) callbacks?.onTrackEnded() + callbacks?.onTrackEnded() } } @@ -270,6 +269,7 @@ class MultiPlayer(context: Context) : LocalPlayback(context) { override fun setPlaybackSpeedPitch(speed: Float, pitch: Float) { mCurrentMediaPlayer.setPlaybackSpeedPitch(speed, pitch) + mNextMediaPlayer?.setPlaybackSpeedPitch(speed, pitch) } companion object { 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 087f16dd9..26d1fe7a9 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 @@ -591,16 +591,9 @@ class MusicService : MediaBrowserServiceCompat(), * By default return the browsable root. Treat the EXTRA_RECENT flag as a special case * and return the recent root instead. */ - var isRecentRequest = false - if (rootHints != null) { - isRecentRequest = - rootHints.getBoolean(BrowserRoot.EXTRA_RECENT) - } - val browserRootPath = if (isRecentRequest) { - AutoMediaIDHelper.RECENT_ROOT - } else { - AutoMediaIDHelper.MEDIA_ID_ROOT - } + val isRecentRequest = rootHints?.getBoolean(BrowserRoot.EXTRA_RECENT) ?: false + val browserRootPath = + if (isRecentRequest) AutoMediaIDHelper.RECENT_ROOT else AutoMediaIDHelper.MEDIA_ID_ROOT BrowserRoot(browserRootPath, null) } } 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 ed6335a99..9ea6107d7 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,8 +6,6 @@ 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 class PlaybackManager(val context: Context) { @@ -35,9 +33,6 @@ 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() } @@ -61,9 +56,6 @@ class PlaybackManager(val context: Context) { AudioFader.startFadeAnimator(playback!!, true) } } - if (shouldSetSpeed) { - playback?.setPlaybackSpeedPitch(playbackSpeed, playbackPitch) - } playback?.start() } } From ad4467af93fa489d57e59d2cab3c42da71ef8d44 Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Tue, 21 Jun 2022 14:28:44 +0530 Subject: [PATCH 2/5] Revert back to old logic for "Bluetooth playback" --- .../name/monkey/retromusic/service/MusicService.kt | 11 ++++++----- 1 file changed, 6 insertions(+), 5 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 26d1fe7a9..994b824f1 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 @@ -18,7 +18,6 @@ import android.app.NotificationManager import android.app.PendingIntent 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 @@ -224,14 +223,15 @@ class MusicService : MediaBrowserServiceCompat(), var shuffleMode = 0 private val songPlayCountHelper = SongPlayCountHelper() - private val bluetoothReceiver = object : BroadcastReceiver() { - @SuppressLint("MissingPermission") + private val bluetoothReceiver: BroadcastReceiver = object : BroadcastReceiver() { 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 (extra.type == BluetoothDevice.DEVICE_TYPE_CLASSIC) play() + @Suppress("Deprecation") + if (getSystemService()!!.isBluetoothA2dpOn) { + play() + } } } } @@ -967,6 +967,7 @@ class MusicService : MediaBrowserServiceCompat(), intent.putExtra("position", songProgressMillis.toLong()) intent.putExtra("playing", isPlaying) intent.putExtra("scrobbling_source", RETRO_MUSIC_PACKAGE_NAME) + @Suppress("Deprecation") sendStickyBroadcast(intent) } From 20ab3dad0d4e807fe66dc43a52b8511b0e0802c9 Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Tue, 21 Jun 2022 14:42:56 +0530 Subject: [PATCH 3/5] Added ability to share multiple songs --- .../retromusic/dialogs/SongShareDialog.kt | 3 +- .../retromusic/helper/menu/SongMenuHelper.kt | 2 +- .../retromusic/helper/menu/SongsMenuHelper.kt | 11 +++++ .../name/monkey/retromusic/util/MusicUtil.kt | 46 +++++++++++++++---- .../main/res/menu/menu_media_selection.xml | 6 +++ 5 files changed, 55 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/code/name/monkey/retromusic/dialogs/SongShareDialog.kt b/app/src/main/java/code/name/monkey/retromusic/dialogs/SongShareDialog.kt index ab50e3dc4..fcd07664a 100644 --- a/app/src/main/java/code/name/monkey/retromusic/dialogs/SongShareDialog.kt +++ b/app/src/main/java/code/name/monkey/retromusic/dialogs/SongShareDialog.kt @@ -60,8 +60,7 @@ class SongShareDialog : DialogFragment() { 0 -> { startActivity(Intent.createChooser(song?.let { MusicUtil.createShareSongFileIntent( - it, - requireContext() + requireContext(), it ) }, null)) } diff --git a/app/src/main/java/code/name/monkey/retromusic/helper/menu/SongMenuHelper.kt b/app/src/main/java/code/name/monkey/retromusic/helper/menu/SongMenuHelper.kt index 6fca4a3a0..801c2b209 100644 --- a/app/src/main/java/code/name/monkey/retromusic/helper/menu/SongMenuHelper.kt +++ b/app/src/main/java/code/name/monkey/retromusic/helper/menu/SongMenuHelper.kt @@ -64,7 +64,7 @@ object SongMenuHelper : KoinComponent { R.id.action_share -> { activity.startActivity( Intent.createChooser( - MusicUtil.createShareSongFileIntent(song, activity), + MusicUtil.createShareSongFileIntent(activity, song), null ) ) diff --git a/app/src/main/java/code/name/monkey/retromusic/helper/menu/SongsMenuHelper.kt b/app/src/main/java/code/name/monkey/retromusic/helper/menu/SongsMenuHelper.kt index 1d7383429..b5d236734 100644 --- a/app/src/main/java/code/name/monkey/retromusic/helper/menu/SongsMenuHelper.kt +++ b/app/src/main/java/code/name/monkey/retromusic/helper/menu/SongsMenuHelper.kt @@ -14,6 +14,7 @@ */ package code.name.monkey.retromusic.helper.menu +import android.content.Intent import androidx.fragment.app.FragmentActivity import code.name.monkey.retromusic.R import code.name.monkey.retromusic.dialogs.AddToPlaylistDialog @@ -21,6 +22,7 @@ import code.name.monkey.retromusic.dialogs.DeleteSongsDialog import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.repository.RealRepository +import code.name.monkey.retromusic.util.MusicUtil import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -53,6 +55,15 @@ object SongsMenuHelper : KoinComponent { } return true } + R.id.action_share -> { + activity.startActivity( + Intent.createChooser( + MusicUtil.createShareMultipleSongIntent(activity, songs), + null + ) + ) + return true + } R.id.action_delete_from_device -> { DeleteSongsDialog.create(songs) .show(activity.supportFragmentManager, "DELETE_SONGS") 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 6f9a723eb..a050ee383 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 @@ -41,23 +41,49 @@ import java.util.regex.Pattern object MusicUtil : KoinComponent { - fun createShareSongFileIntent(song: Song, context: Context): Intent { + fun createShareSongFileIntent(context: Context, song: Song): Intent { return Intent().apply { action = Intent.ACTION_SEND - putExtra(Intent.EXTRA_STREAM, try { - FileProvider.getUriForFile( - context, - context.applicationContext.packageName, - File(song.data) - ) - } catch (e: IllegalArgumentException) { - getSongFileUri(song.id) - }) + putExtra( + Intent.EXTRA_STREAM, try { + FileProvider.getUriForFile( + context, + context.applicationContext.packageName, + File(song.data) + ) + } catch (e: IllegalArgumentException) { + getSongFileUri(song.id) + } + ) addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) type = "audio/*" } } + fun createShareMultipleSongIntent(context: Context, songs: List): Intent { + return Intent().apply { + action = Intent.ACTION_SEND_MULTIPLE + type = "audio/*" + + val files = ArrayList() + + for (song in songs) { + files.add( + try { + FileProvider.getUriForFile( + context, + context.applicationContext.packageName, + File(song.data) + ) + } catch (e: IllegalArgumentException) { + getSongFileUri(song.id) + } + ) + } + putParcelableArrayListExtra(Intent.EXTRA_STREAM, files) + } + } + fun buildInfoString(string1: String?, string2: String?): String { if (string1.isNullOrEmpty()) { return if (string2.isNullOrEmpty()) "" else string2 diff --git a/app/src/main/res/menu/menu_media_selection.xml b/app/src/main/res/menu/menu_media_selection.xml index d914cf26f..a24f2a8a7 100644 --- a/app/src/main/res/menu/menu_media_selection.xml +++ b/app/src/main/res/menu/menu_media_selection.xml @@ -20,6 +20,12 @@ android:title="@string/action_add_to_playlist" app:showAsAction="ifRoom" /> + + Date: Tue, 21 Jun 2022 14:51:25 +0530 Subject: [PATCH 4/5] Removed date versionNameSuffix --- app/build.gradle | 5 ----- 1 file changed, 5 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 12cd27799..f177df829 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -30,7 +30,6 @@ android { } buildTypes { release { - versionNameSuffix "_" + getDate() shrinkResources true minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' @@ -88,10 +87,6 @@ static def getProperty(Properties properties, String name) { return properties.getProperty(name) ?: "$name missing" } -static def getDate() { - new Date().format('MMddyyyyss') -} - dependencies { implementation project(':appthemehelper') implementation "androidx.gridlayout:gridlayout:1.0.0" From e1221c4924bc86de7c8a2b253e31569be6e980b9 Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Tue, 21 Jun 2022 18:03:25 +0530 Subject: [PATCH 5/5] Added API version check when setting playback params --- .../code/name/monkey/retromusic/service/LocalPlayback.kt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) 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 c066da44a..2573e88b8 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 @@ -8,12 +8,14 @@ import android.media.AudioAttributes import android.media.AudioManager import android.media.MediaPlayer import android.media.PlaybackParams +import android.os.StrictMode import androidx.annotation.CallSuper import androidx.core.content.getSystemService import androidx.core.net.toUri import androidx.media.AudioAttributesCompat import androidx.media.AudioFocusRequestCompat import androidx.media.AudioManagerCompat +import code.name.monkey.appthemehelper.util.VersionUtils import code.name.monkey.retromusic.R import code.name.monkey.retromusic.extensions.showToast import code.name.monkey.retromusic.service.playback.Playback @@ -130,7 +132,9 @@ abstract class LocalPlayback(val context: Context) : Playback, MediaPlayer.OnErr .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) .build() ) - player.playbackParams = PlaybackParams().setSpeed(playbackSpeed).setPitch(playbackPitch) + if (VersionUtils.hasMarshmallow()) + player.playbackParams = + PlaybackParams().setSpeed(playbackSpeed).setPitch(playbackPitch) player.setOnPreparedListener { player.setOnPreparedListener(null)