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

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"/>