diff --git a/app/build.gradle b/app/build.gradle
index 8eea7ecc4..2ccf7085b 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -14,7 +14,7 @@ android {
vectorDrawables.useSupportLibrary = true
applicationId "code.name.monkey.retromusic"
- versionCode 10577
+ versionCode 10579
versionName '5.8.4'
buildConfigField("String", "GOOGLE_PLAY_LICENSING_KEY", "\"${getProperty(getProperties('../public.properties'), 'GOOGLE_PLAY_LICENSE_KEY')}\"")
diff --git a/app/src/debug/res/values/bools.xml b/app/src/debug/res/values/bools.xml
new file mode 100644
index 000000000..7d3f0ee62
--- /dev/null
+++ b/app/src/debug/res/values/bools.xml
@@ -0,0 +1,5 @@
+
+
+ true
+ false
+
\ No newline at end of file
diff --git a/app/src/debug/res/values/donottranslate.xml b/app/src/debug/res/values/donottranslate.xml
index a67ed0a23..d9798fa6f 100644
--- a/app/src/debug/res/values/donottranslate.xml
+++ b/app/src/debug/res/values/donottranslate.xml
@@ -1,7 +1,4 @@
Retro Music-Debug
-
- true
- false
\ No newline at end of file
diff --git a/app/src/main/assets/retro-changelog.html b/app/src/main/assets/retro-changelog.html
index 12be2af8e..2ff0871b6 100644
--- a/app/src/main/assets/retro-changelog.html
+++ b/app/src/main/assets/retro-changelog.html
@@ -71,6 +71,7 @@
Fixed
+ - Fixed Playback speed and pitch not working when CrossFade is enabled
- Fixed crash when adding folders to blacklist
- Fix bugs in MD3 theme
diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/PermissionActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/PermissionActivity.kt
index e9bd00667..5e44d6f92 100644
--- a/app/src/main/java/code/name/monkey/retromusic/activities/PermissionActivity.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/activities/PermissionActivity.kt
@@ -15,6 +15,7 @@
package code.name.monkey.retromusic.activities
import android.Manifest
+import android.Manifest.permission.BLUETOOTH_CONNECT
import android.content.Intent
import android.content.pm.PackageManager
import android.content.res.ColorStateList
@@ -49,7 +50,7 @@ class PermissionActivity : AbsMusicServiceActivity() {
if (VersionUtils.hasMarshmallow()) {
binding.audioPermission.show()
binding.audioPermission.setButtonClick {
- if (hasAudioPermission()) {
+ if (!hasAudioPermission()) {
val intent = Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS)
intent.data = ("package:" + applicationContext.packageName).toUri()
startActivity(intent)
@@ -57,6 +58,15 @@ class PermissionActivity : AbsMusicServiceActivity() {
}
}
+ if (VersionUtils.hasS()) {
+ binding.bluetoothPermission.show()
+ binding.bluetoothPermission.setButtonClick {
+ ActivityCompat.requestPermissions(this,
+ arrayOf(BLUETOOTH_CONNECT),
+ PERMISSION_REQUEST)
+ }
+ }
+
binding.finish.accentBackgroundColor()
binding.finish.setOnClickListener {
if (hasPermissions()) {
@@ -83,6 +93,7 @@ class PermissionActivity : AbsMusicServiceActivity() {
override fun onResume() {
super.onResume()
+ binding.finish.isEnabled = hasStoragePermission()
if (hasStoragePermission()) {
binding.storagePermission.checkImage.isVisible = true
binding.storagePermission.checkImage.imageTintList =
@@ -95,6 +106,13 @@ class PermissionActivity : AbsMusicServiceActivity() {
ColorStateList.valueOf(accentColor())
}
}
+ if (VersionUtils.hasS()) {
+ if (hasBluetoothPermission()) {
+ binding.bluetoothPermission.checkImage.isVisible = true
+ binding.bluetoothPermission.checkImage.imageTintList =
+ ColorStateList.valueOf(accentColor())
+ }
+ }
}
private fun hasStoragePermission(): Boolean {
@@ -102,6 +120,12 @@ class PermissionActivity : AbsMusicServiceActivity() {
Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED
}
+ @RequiresApi(Build.VERSION_CODES.S)
+ private fun hasBluetoothPermission(): Boolean {
+ return ActivityCompat.checkSelfPermission(this,
+ BLUETOOTH_CONNECT) == PackageManager.PERMISSION_GRANTED
+ }
+
@RequiresApi(Build.VERSION_CODES.M)
private fun hasAudioPermission(): Boolean {
return Settings.System.canWrite(this)
diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/SettingsActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/SettingsActivity.kt
index cfe0815c4..fd273b40c 100644
--- a/app/src/main/java/code/name/monkey/retromusic/activities/SettingsActivity.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/activities/SettingsActivity.kt
@@ -14,6 +14,7 @@
*/
package code.name.monkey.retromusic.activities
+import android.Manifest.permission.BLUETOOTH_CONNECT
import android.content.Intent
import android.os.Bundle
import android.view.MenuItem
@@ -22,14 +23,14 @@ 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.AbsThemeActivity
+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.extensions.*
import com.afollestad.materialdialogs.MaterialDialog
import com.afollestad.materialdialogs.color.ColorCallback
-class SettingsActivity : AbsThemeActivity(), ColorCallback, OnThemeChangedListener {
+class SettingsActivity : AbsBaseActivity(), ColorCallback, OnThemeChangedListener {
private lateinit var binding: ActivitySettingsBinding
override fun onCreate(savedInstanceState: Bundle?) {
val mSavedInstanceState = extra(TAG).value ?: savedInstanceState
@@ -37,6 +38,7 @@ class SettingsActivity : AbsThemeActivity(), ColorCallback, OnThemeChangedListen
binding = ActivitySettingsBinding.inflate(layoutInflater)
setContentView(binding.root)
setupToolbar()
+ setPermissionDeniedMessage(getString(R.string.permission_bluetooth_denied))
}
override fun onResume() {
@@ -81,6 +83,14 @@ class SettingsActivity : AbsThemeActivity(), ColorCallback, OnThemeChangedListen
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()
if (VersionUtils.hasNougatMR())
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 386bd560d..20bc42fb9 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
@@ -95,7 +95,9 @@ abstract class AbsBaseActivity : AbsThemeActivity() {
protected fun hasPermissions(): Boolean {
for (permission in permissions) {
- if (ActivityCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
+ if (ActivityCompat.checkSelfPermission(this,
+ permission) != PackageManager.PERMISSION_GRANTED
+ ) {
return false
}
}
@@ -105,7 +107,7 @@ abstract class AbsBaseActivity : AbsThemeActivity() {
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array,
- grantResults: IntArray
+ grantResults: IntArray,
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
if (requestCode == PERMISSION_REQUEST) {
@@ -123,6 +125,22 @@ abstract class AbsBaseActivity : AbsThemeActivity() {
)
.setAction(R.string.action_grant) { requestPermissions() }
.setActionTextColor(accentColor()).show()
+ } else if (ActivityCompat.shouldShowRequestPermissionRationale(
+ this@AbsBaseActivity, Manifest.permission.BLUETOOTH_CONNECT
+ )
+ ) {
+ // User has deny from permission dialog
+ Snackbar.make(
+ snackBarContainer,
+ R.string.permission_bluetooth_denied,
+ Snackbar.LENGTH_INDEFINITE
+ )
+ .setAction(R.string.action_grant) {
+ ActivityCompat.requestPermissions(this,
+ arrayOf(Manifest.permission.BLUETOOTH_CONNECT),
+ PERMISSION_REQUEST)
+ }
+ .setActionTextColor(accentColor()).show()
} else {
// User has deny permission and checked never show permission dialog so you can redirect to Application settings page
Snackbar.make(
@@ -154,7 +172,7 @@ abstract class AbsBaseActivity : AbsThemeActivity() {
const val PERMISSION_REQUEST = 100
}
- // this lets keyboard close when clicked in backgroud
+ // this lets keyboard close when clicked in background
override fun dispatchTouchEvent(event: MotionEvent): Boolean {
if (event.action == MotionEvent.ACTION_DOWN) {
val v = currentFocus
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 20ffc192d..efcd62edd 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
@@ -189,11 +189,7 @@ abstract class AbsMusicServiceActivity : AbsBaseActivity(), IMusicServiceEventLi
}
override fun getPermissionsToRequest(): Array {
- return mutableListOf(
- Manifest.permission.READ_EXTERNAL_STORAGE,
- if (VersionUtils.hasS()) Manifest.permission.BLUETOOTH_CONNECT
- else Manifest.permission.BLUETOOTH
- ).apply {
+ return mutableListOf(Manifest.permission.READ_EXTERNAL_STORAGE).apply {
if (!VersionUtils.hasQ()) {
add(Manifest.permission.WRITE_EXTERNAL_STORAGE)
}
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 917685cfd..e9b7d6c33 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
@@ -160,7 +160,7 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
private fun setupBottomSheet() {
bottomSheetBehavior = from(binding.slidingPanel)
bottomSheetBehavior.addBottomSheetCallback(bottomSheetCallbackList)
- if (PreferenceUtil.swipeDownToDismiss) bottomSheetBehavior.isHideable = true
+ bottomSheetBehavior.isHideable = PreferenceUtil.swipeDownToDismiss
setMiniPlayerAlphaProgress(0F)
}
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 44db2f4d4..541010167 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
@@ -54,7 +54,6 @@ 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.ViewUtil
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.google.android.material.bottomsheet.BottomSheetBehavior.*
@@ -264,11 +263,8 @@ class GradientPlayerFragment : AbsPlayerFragment(R.layout.fragment_gradient_play
binding.playbackControlsFragment.songInfo.setTextColor(lastDisabledPlaybackControlsColor)
volumeFragment?.setTintableColor(lastPlaybackControlsColor.ripAlpha())
- ViewUtil.setProgressDrawable(
- binding.playbackControlsFragment.progressSlider,
- lastPlaybackControlsColor.ripAlpha(),
- true
- )
+
+ binding.playbackControlsFragment.progressSlider.applyColor(lastPlaybackControlsColor.ripAlpha())
updateRepeatState()
updateShuffleState()
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/AudioSettings.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/AudioSettings.kt
index 5d2f23a87..1dffcc857 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/AudioSettings.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/AudioSettings.kt
@@ -14,10 +14,15 @@
*/
package code.name.monkey.retromusic.fragments.settings
+import android.Manifest.permission.BLUETOOTH_CONNECT
import android.content.Intent
+import android.content.pm.PackageManager.PERMISSION_GRANTED
import android.media.audiofx.AudioEffect
import android.os.Bundle
+import androidx.core.app.ActivityCompat
import androidx.preference.Preference
+import code.name.monkey.appthemehelper.util.VersionUtils
+import code.name.monkey.retromusic.BLUETOOTH_PLAYBACK
import code.name.monkey.retromusic.EQUALIZER
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.util.NavigationUtil
@@ -28,17 +33,31 @@ import code.name.monkey.retromusic.util.NavigationUtil
class AudioSettings : AbsSettingsFragment() {
override fun invalidateSettings() {
- val findPreference: Preference? = findPreference(EQUALIZER)
+ val eqPreference: Preference? = findPreference(EQUALIZER)
if (!hasEqualizer()) {
- findPreference?.isEnabled = false
- findPreference?.summary = resources.getString(R.string.no_equalizer)
+ eqPreference?.isEnabled = false
+ eqPreference?.summary = resources.getString(R.string.no_equalizer)
} else {
- findPreference?.isEnabled = true
+ eqPreference?.isEnabled = true
}
- findPreference?.setOnPreferenceClickListener {
+ eqPreference?.setOnPreferenceClickListener {
NavigationUtil.openEqualizer(requireActivity())
true
}
+ val bluetoothPreference: Preference? = findPreference(BLUETOOTH_PLAYBACK)
+ if (VersionUtils.hasS()) {
+ bluetoothPreference?.setOnPreferenceChangeListener { _, newValue ->
+ if (newValue as Boolean) {
+ if (ActivityCompat.checkSelfPermission(requireContext(),
+ BLUETOOTH_CONNECT) != PERMISSION_GRANTED
+ ) {
+ ActivityCompat.requestPermissions(requireActivity(), arrayOf(
+ BLUETOOTH_CONNECT), 100)
+ }
+ }
+ return@setOnPreferenceChangeListener true
+ }
+ }
}
private fun hasEqualizer(): Boolean {
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 4f5e791ad..13c2310b0 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
@@ -6,10 +6,12 @@ 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
+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.helper.MusicPlayerRemote
@@ -18,6 +20,8 @@ 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
import kotlinx.coroutines.*
/** @author Prathamesh M */
@@ -138,7 +142,7 @@ class CrossFadePlayer(val context: Context) : Playback, MediaPlayer.OnCompletion
/**
* @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
+ * @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(
@@ -157,6 +161,7 @@ class CrossFadePlayer(val context: Context) : Playback, MediaPlayer.OnCompletion
AudioAttributes.Builder().setLegacyStreamType(AudioManager.STREAM_MUSIC).build()
)
player.prepare()
+ player.setPlaybackSpeedPitch(playbackSpeed, playbackPitch)
} catch (e: Exception) {
e.printStackTrace()
return false
@@ -341,6 +346,20 @@ class CrossFadePlayer(val context: Context) : Playback, MediaPlayer.OnCompletion
crossFadeDuration = duration
}
+ 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()
+ }
+ }
+ }
+
companion object {
val TAG: String = CrossFadePlayer::class.java.simpleName
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/service/MultiPlayer.java b/app/src/main/java/code/name/monkey/retromusic/service/MultiPlayer.java
index f5c8756bb..66556bbe0 100644
--- a/app/src/main/java/code/name/monkey/retromusic/service/MultiPlayer.java
+++ b/app/src/main/java/code/name/monkey/retromusic/service/MultiPlayer.java
@@ -16,7 +16,6 @@ package code.name.monkey.retromusic.service;
import android.content.Context;
import android.content.Intent;
-import android.content.SharedPreferences;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.PlaybackParams;
@@ -28,12 +27,10 @@ import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
-import androidx.preference.PreferenceManager;
import org.jetbrains.annotations.NotNull;
import code.name.monkey.appthemehelper.util.VersionUtils;
-import code.name.monkey.retromusic.ConstantsKt;
import code.name.monkey.retromusic.R;
import code.name.monkey.retromusic.service.playback.Playback;
import code.name.monkey.retromusic.util.PreferenceUtil;
@@ -42,7 +39,7 @@ import code.name.monkey.retromusic.util.PreferenceUtil;
* @author Andrew Neal, Karim Abou Zeid (kabouzeid)
*/
public class MultiPlayer
- implements Playback, MediaPlayer.OnErrorListener, MediaPlayer.OnCompletionListener, SharedPreferences.OnSharedPreferenceChangeListener {
+ implements Playback, MediaPlayer.OnErrorListener, MediaPlayer.OnCompletionListener {
public static final String TAG = MultiPlayer.class.getSimpleName();
private MediaPlayer mCurrentMediaPlayer = new MediaPlayer();
@@ -60,7 +57,6 @@ public class MultiPlayer
MultiPlayer(final Context context) {
this.context = context;
mCurrentMediaPlayer.setWakeMode(context, PowerManager.PARTIAL_WAKE_LOCK);
- PreferenceManager.getDefaultSharedPreferences(context).registerOnSharedPreferenceChangeListener(this);
}
/**
@@ -94,7 +90,7 @@ public class MultiPlayer
} else {
player.setDataSource(path);
}
- setPlaybackSpeedPitch(player);
+ setPlaybackSpeedPitch(PreferenceUtil.INSTANCE.getPlaybackSpeed(), PreferenceUtil.INSTANCE.getPlaybackPitch());
player.setAudioStreamType(AudioManager.STREAM_MUSIC);
player.prepare();
} catch (Exception e) {
@@ -208,7 +204,6 @@ public class MultiPlayer
if (mNextMediaPlayer != null) {
mNextMediaPlayer.release();
}
- PreferenceManager.getDefaultSharedPreferences(context).unregisterOnSharedPreferenceChangeListener(this);
}
/**
@@ -359,20 +354,14 @@ public class MultiPlayer
}
@Override
- public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
- if (key.equals(ConstantsKt.PLAYBACK_SPEED) || key.equals(ConstantsKt.PLAYBACK_PITCH)) {
- setPlaybackSpeedPitch(mCurrentMediaPlayer);
- }
- }
-
- public void setPlaybackSpeedPitch(MediaPlayer mp) {
+ public void setPlaybackSpeedPitch(float speed, float pitch) {
if (VersionUtils.INSTANCE.hasMarshmallow()) {
- boolean wasPlaying = mp.isPlaying();
- mp.setPlaybackParams(new PlaybackParams()
+ boolean wasPlaying = mCurrentMediaPlayer.isPlaying();
+ mCurrentMediaPlayer.setPlaybackParams(new PlaybackParams()
.setSpeed(PreferenceUtil.INSTANCE.getPlaybackSpeed())
.setPitch(PreferenceUtil.INSTANCE.getPlaybackPitch()));
if (!wasPlaying) {
- if (mp.isPlaying()) mp.pause();
+ if (mCurrentMediaPlayer.isPlaying()) mCurrentMediaPlayer.pause();
}
}
}
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 20796815c..4274978e0 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
@@ -87,6 +87,7 @@ import code.name.monkey.retromusic.util.PreferenceUtil.isClassicNotification
import code.name.monkey.retromusic.util.PreferenceUtil.isHeadsetPlugged
import code.name.monkey.retromusic.util.PreferenceUtil.isLockScreen
import code.name.monkey.retromusic.util.PreferenceUtil.isPauseOnZeroVolume
+import code.name.monkey.retromusic.util.PreferenceUtil.playbackPitch
import code.name.monkey.retromusic.util.PreferenceUtil.playbackSpeed
import code.name.monkey.retromusic.util.PreferenceUtil.registerOnSharedPreferenceChangedListener
import code.name.monkey.retromusic.util.PreferenceUtil.unregisterOnSharedPreferenceChangedListener
@@ -695,6 +696,9 @@ class MusicService : MediaBrowserServiceCompat(),
sharedPreferences: SharedPreferences, key: String,
) {
when (key) {
+ PLAYBACK_SPEED, PLAYBACK_PITCH -> {
+ playback?.setPlaybackSpeedPitch(playbackSpeed, playbackPitch)
+ }
CROSS_FADE_DURATION -> {
val progress = songProgressMillis
val wasPlaying = isPlaying
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 9a0ef73a7..4d98f3336 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
@@ -49,6 +49,8 @@ interface Playback {
fun setCrossFadeDuration(duration: Int)
+ fun setPlaybackSpeedPitch(speed: Float, pitch: Float)
+
interface PlaybackCallbacks {
fun onTrackWentToNext()
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 ffdee11b6..dcdbae20d 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
@@ -3,6 +3,7 @@ package code.name.monkey.retromusic.util
import android.content.Context
import android.content.SharedPreferences.OnSharedPreferenceChangeListener
import android.net.ConnectivityManager
+import android.net.NetworkCapabilities
import androidx.core.content.edit
import androidx.core.content.getSystemService
import androidx.core.content.res.use
@@ -340,8 +341,14 @@ object PreferenceUtil {
"always" -> true
"only_wifi" -> {
val connectivityManager = context.getSystemService()
- val netInfo = connectivityManager?.activeNetworkInfo
- netInfo != null && netInfo.type == ConnectivityManager.TYPE_WIFI && netInfo.isConnectedOrConnecting
+ if (VersionUtils.hasMarshmallow()) {
+ val network = connectivityManager?.activeNetwork
+ val capabilities = connectivityManager?.getNetworkCapabilities(network)
+ capabilities != null && capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)
+ } else {
+ val netInfo = connectivityManager?.activeNetworkInfo
+ netInfo != null && netInfo.type == ConnectivityManager.TYPE_WIFI && netInfo.isConnectedOrConnecting
+ }
}
"never" -> false
else -> false
@@ -678,6 +685,8 @@ object PreferenceUtil {
get() = sharedPreferences
.getInt(CROSS_FADE_DURATION, 0)
+ val isCrossfadeEnabled get() = crossFadeDuration > 0
+
val materialYou
get() = sharedPreferences.getBoolean(MATERIAL_YOU, VersionUtils.hasS())
diff --git a/app/src/main/java/code/name/monkey/retromusic/views/PermissionItem.kt b/app/src/main/java/code/name/monkey/retromusic/views/PermissionItem.kt
index 21df2fa0f..00dacb1d7 100644
--- a/app/src/main/java/code/name/monkey/retromusic/views/PermissionItem.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/views/PermissionItem.kt
@@ -39,7 +39,7 @@ class PermissionItem @JvmOverloads constructor(
binding.number.backgroundTintList =
ColorStateList.valueOf(ColorUtil.withAlpha(color, 0.22f))
- binding.button.accentOutlineColor()
+ if (!isInEditMode) binding.button.accentOutlineColor()
}
}
diff --git a/app/src/main/res/drawable/ic_bluetooth_connect.xml b/app/src/main/res/drawable/ic_bluetooth_connect.xml
new file mode 100644
index 000000000..7c1a6e322
--- /dev/null
+++ b/app/src/main/res/drawable/ic_bluetooth_connect.xml
@@ -0,0 +1,5 @@
+
+
+
diff --git a/app/src/main/res/layout/activity_permission.xml b/app/src/main/res/layout/activity_permission.xml
index 9a25d7d37..d25afeb41 100644
--- a/app/src/main/res/layout/activity_permission.xml
+++ b/app/src/main/res/layout/activity_permission.xml
@@ -43,26 +43,39 @@
android:orientation="@integer/permission_orientation">
+
+
@@ -76,7 +89,7 @@
android:layout_height="wrap_content"
android:layout_margin="16dp"
android:paddingVertical="12dp"
- android:text="Let's go"
+ android:text="@string/lets_go"
android:textAppearance="@style/TextViewButton"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
diff --git a/app/src/main/res/layout/fragment_md3_player.xml b/app/src/main/res/layout/fragment_md3_player.xml
index d42cd56b1..060a79e04 100644
--- a/app/src/main/res/layout/fragment_md3_player.xml
+++ b/app/src/main/res/layout/fragment_md3_player.xml
@@ -7,7 +7,6 @@
android:background="?attr/colorSurface"
android:clickable="true"
android:focusable="true">
-
-
-
@@ -166,7 +163,7 @@
android:padding="16dp"
android:scaleType="fitCenter"
app:layout_constraintBottom_toBottomOf="@+id/playPauseCard"
- app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintEnd_toStartOf="@+id/shuffleButton"
app:layout_constraintStart_toEndOf="@+id/playPauseCard"
app:layout_constraintTop_toTopOf="@+id/playPauseCard"
app:srcCompat="@drawable/ic_skip_next_outline"
@@ -176,33 +173,35 @@
diff --git a/app/src/main/res/values-v26/bools.xml b/app/src/main/res/values-v26/bools.xml
new file mode 100644
index 000000000..e557d81d8
--- /dev/null
+++ b/app/src/main/res/values-v26/bools.xml
@@ -0,0 +1,4 @@
+
+
+ false
+
\ No newline at end of file
diff --git a/app/src/main/res/values-v27/donottranslate.xml b/app/src/main/res/values-v27/bools.xml
similarity index 100%
rename from app/src/main/res/values-v27/donottranslate.xml
rename to app/src/main/res/values-v27/bools.xml
diff --git a/app/src/main/res/values-v31/donottranslate.xml b/app/src/main/res/values-v31/bools.xml
similarity index 81%
rename from app/src/main/res/values-v31/donottranslate.xml
rename to app/src/main/res/values-v31/bools.xml
index 9bc7e67f2..51349c34e 100644
--- a/app/src/main/res/values-v31/donottranslate.xml
+++ b/app/src/main/res/values-v31/bools.xml
@@ -3,6 +3,5 @@
true
true
- 0
false
\ No newline at end of file
diff --git a/app/src/main/res/values-v31/integers.xml b/app/src/main/res/values-v31/integers.xml
new file mode 100644
index 000000000..308656262
--- /dev/null
+++ b/app/src/main/res/values-v31/integers.xml
@@ -0,0 +1,4 @@
+
+
+ 0
+
\ No newline at end of file
diff --git a/app/src/main/res/values/bools.xml b/app/src/main/res/values/bools.xml
new file mode 100644
index 000000000..3084d216b
--- /dev/null
+++ b/app/src/main/res/values/bools.xml
@@ -0,0 +1,12 @@
+
+
+ false
+ false
+
+ true
+
+ false
+ false
+
+ true
+
\ No newline at end of file
diff --git a/app/src/main/res/values/donottranslate.xml b/app/src/main/res/values/donottranslate.xml
index 6477d10a4..afb7e7929 100755
--- a/app/src/main/res/values/donottranslate.xml
+++ b/app/src/main/res/values/donottranslate.xml
@@ -24,15 +24,9 @@
Material You
- false
- false
-
- 2
- true
-
- false
- false
@string/album_artist
@string/circle
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/integers.xml b/app/src/main/res/values/integers.xml
index f038ad856..7f46eabf7 100644
--- a/app/src/main/res/values/integers.xml
+++ b/app/src/main/res/values/integers.xml
@@ -12,4 +12,6 @@
200
1
0
+
+ 2
\ No newline at end of file
diff --git a/app/src/main/res/values/permission_item.xml b/app/src/main/res/values/permission_item.xml
index 8bf73d450..3147cd4e6 100644
--- a/app/src/main/res/values/permission_item.xml
+++ b/app/src/main/res/values/permission_item.xml
@@ -1,10 +1,10 @@
-
-
+
+
-
-
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 38100d4f9..109040f4e 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -93,6 +93,7 @@
Biography
Just Black
Blacklist
+ The app needs nearby devices permission to check for bluetooth devices
Blur
Blur Card
Unable to send report
@@ -196,6 +197,7 @@
Genres
Fork the project on GitHub
Gradient
+ Grant access
1
2
3
@@ -234,6 +236,7 @@
Labeled
Last added
Last song
+ Let\'s go
Library categories
Licenses
Clearly White
@@ -293,6 +296,7 @@
Paste Lyrics Here
Paste timeframe lyrics here
Peek
+ Nearby devices permission denied.
Permission to access external storage denied.
The app needs permission to access your device storage for playing music
Storage Access
@@ -362,6 +366,7 @@
Display synced lyrics over album cover
Show New Music Mix on homescreen
Enables changing song by swiping anywhere on the now playing screen
+ Swipe down to dismiss mini player
Immersive mode
Start playing immediately after headphones are connected
Shuffle mode will turn off when playing a new list of songs
@@ -408,6 +413,7 @@
Show lyrics
Show suggestions
Swipe anywhere to change song
+ Dismiss with swipe down
Tab titles mode
Carousel effect
Fullscreen app
@@ -553,6 +559,5 @@
You have to select at least one category.
You will be forwarded to the issue tracker website.
Your account data is only used for authentication.
- Swipe down to dismiss mini player
- Dismiss with swipe down
+ Nearby devices
diff --git a/app/src/main/res/xml/pref_audio.xml b/app/src/main/res/xml/pref_audio.xml
index 60d29dd4a..d25ba2063 100755
--- a/app/src/main/res/xml/pref_audio.xml
+++ b/app/src/main/res/xml/pref_audio.xml
@@ -8,7 +8,8 @@
android:layout="@layout/list_item_view_switch"
android:summary="@string/pref_summary_audio_ducking"
android:title="@string/pref_title_audio_ducking"
- app:icon="@drawable/ic_volume_down" />
+ app:icon="@drawable/ic_volume_down"
+ app:isPreferenceVisible="@bool/isNotOreo"/>