diff --git a/app/build.gradle b/app/build.gradle index 9e1e21a76..8eea7ecc4 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -15,7 +15,7 @@ android { applicationId "code.name.monkey.retromusic" versionCode 10577 - versionName '5.8.3' + versionName '5.8.4' buildConfigField("String", "GOOGLE_PLAY_LICENSING_KEY", "\"${getProperty(getProperties('../public.properties'), 'GOOGLE_PLAY_LICENSE_KEY')}\"") } @@ -111,7 +111,7 @@ dependencies { implementation "androidx.room:room-ktx:$room_version" kapt "androidx.room:room-compiler:$room_version" - def lifecycle_version = "2.5.0-beta01" + def lifecycle_version = "2.5.0-rc01" implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version" implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version" implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version" @@ -139,11 +139,11 @@ dependencies { implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$kotlin_coroutines_version" implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$kotlin_coroutines_version" - def koin_version = '3.2.0-beta-1' + def koin_version = '3.2.0' implementation "io.insert-koin:koin-core:$koin_version" implementation "io.insert-koin:koin-android:$koin_version" - def glide_version = '4.13.1' + def glide_version = '4.13.2' implementation "com.github.bumptech.glide:glide:$glide_version" kapt "com.github.bumptech.glide:compiler:$glide_version" implementation "com.github.bumptech.glide:okhttp3-integration:$glide_version" diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 909d433e1..e5f246d68 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -3,13 +3,17 @@ xmlns:tools="http://schemas.android.com/tools" package="code.name.monkey.retromusic"> - + - + @@ -19,7 +23,7 @@ tools:ignore="ProtectedPermissions" /> - + +
+
May 13, 2022
+

v5.8.4

+

What's New

+
    +
  • Added a toggle to enable/disable swipe down to dismiss mini player
  • +
+

Fixed

+
    +
  • Fixed crash when adding folders to blacklist
  • +
  • Fix bugs in MD3 theme
  • +
+
May 07, 2022

v5.8.3

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 04f7a0e2f..59532ab49 100644 --- a/app/src/main/java/code/name/monkey/retromusic/Constants.kt +++ b/app/src/main/java/code/name/monkey/retromusic/Constants.kt @@ -167,4 +167,5 @@ const val SCREEN_ON_LYRICS = "screen_on_lyrics" const val CIRCLE_PLAY_BUTTON = "circle_play_button" const val SWIPE_ANYWHERE_NOW_PLAYING = "swipe_anywhere_now_playing" const val PAUSE_HISTORY = "pause_history" -const val MANAGE_AUDIO_FOCUS = "manage_audio_focus" \ No newline at end of file +const val MANAGE_AUDIO_FOCUS = "manage_audio_focus" +const val SWIPE_DOWN_DISMISS = "swipe_to_dismiss" \ No newline at end of file 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 74d173fc5..b338915ea 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 @@ -148,7 +148,7 @@ class MainActivity : AbsCastActivity(), OnSharedPreferenceChangeListener { } 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) { + 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() } } 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 3344f8e05..e9bd00667 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 @@ -27,10 +27,10 @@ import androidx.core.net.toUri import androidx.core.text.parseAsHtml import androidx.core.view.isVisible import code.name.monkey.appthemehelper.util.VersionUtils +import code.name.monkey.retromusic.R import code.name.monkey.retromusic.activities.base.AbsMusicServiceActivity import code.name.monkey.retromusic.databinding.ActivityPermissionBinding import code.name.monkey.retromusic.extensions.* -import code.name.monkey.retromusic.util.RingtoneManager class PermissionActivity : AbsMusicServiceActivity() { private lateinit var binding: ActivityPermissionBinding @@ -49,7 +49,7 @@ class PermissionActivity : AbsMusicServiceActivity() { if (VersionUtils.hasMarshmallow()) { binding.audioPermission.show() binding.audioPermission.setButtonClick { - if (RingtoneManager.requiresDialog(this@PermissionActivity)) { + if (hasAudioPermission()) { val intent = Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS) intent.data = ("package:" + applicationContext.packageName).toUri() startActivity(intent) @@ -75,7 +75,8 @@ class PermissionActivity : AbsMusicServiceActivity() { val color = accentColor() val hexColor = String.format("#%06X", 0xFFFFFF and color) val appName = - "Hello there!
Welcome to Retro Music" + getString(R.string.message_welcome, + "Retro Music") .parseAsHtml() binding.appNameText.text = appName } @@ -97,7 +98,8 @@ class PermissionActivity : AbsMusicServiceActivity() { } private fun hasStoragePermission(): Boolean { - return ActivityCompat.checkSelfPermission(this , Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED + return ActivityCompat.checkSelfPermission(this, + Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED } @RequiresApi(Build.VERSION_CODES.M) 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 ffd0eaadc..0a88ef350 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 @@ -60,7 +60,8 @@ abstract class AbsCastActivity : AbsSlidingMusicPanelActivity() { mCastSession = castSession webServer.start() mCastSession?.remoteMediaClient?.let { - loadCastQueue(it.mediaQueue.indexOfItemWithId(it.currentItem?.itemId ?: 0), it.approximateStreamPosition) + loadCastQueue(it.mediaQueue.indexOfItemWithId(it.currentItem?.itemId ?: 0), + it.approximateStreamPosition) } MusicPlayerRemote.isCasting = true @@ -126,7 +127,7 @@ abstract class AbsCastActivity : AbsSlidingMusicPanelActivity() { progress: Long = MusicPlayerRemote.songProgressMillis.toLong(), ) { mCastSession?.let { - if (!MusicPlayerRemote.playingQueue.isNullOrEmpty()) { + if (MusicPlayerRemote.playingQueue.isNotEmpty()) { CastHelper.castQueue( it, MusicPlayerRemote.playingQueue, 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 1e05c367f..20ffc192d 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 @@ -19,6 +19,7 @@ import android.content.* import android.os.Bundle import android.os.IBinder import androidx.lifecycle.lifecycleScope +import code.name.monkey.appthemehelper.util.VersionUtils import code.name.monkey.retromusic.R import code.name.monkey.retromusic.db.toPlayCount import code.name.monkey.retromusic.helper.MusicPlayerRemote @@ -188,11 +189,15 @@ abstract class AbsMusicServiceActivity : AbsBaseActivity(), IMusicServiceEventLi } override fun getPermissionsToRequest(): Array { - return arrayOf( + return mutableListOf( Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.WRITE_EXTERNAL_STORAGE, - Manifest.permission.BLUETOOTH - ) + if (VersionUtils.hasS()) Manifest.permission.BLUETOOTH_CONNECT + else Manifest.permission.BLUETOOTH + ).apply { + if (!VersionUtils.hasQ()) { + add(Manifest.permission.WRITE_EXTERNAL_STORAGE) + } + }.toTypedArray() } private class MusicStateReceiver(activity: AbsMusicServiceActivity) : BroadcastReceiver() { 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 d26e25015..917685cfd 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) - bottomSheetBehavior.isHideable = true + if (PreferenceUtil.swipeDownToDismiss) bottomSheetBehavior.isHideable = true setMiniPlayerAlphaProgress(0F) } @@ -298,7 +298,7 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() { navigationBarColor = surfaceColor() setTaskDescColor(paletteColor) val isColorLight = paletteColor.isColorLight - if (PreferenceUtil.isAdaptiveColor && (nowPlayingScreen == Normal || nowPlayingScreen == Flat || nowPlayingScreen == Material)) { + if (PreferenceUtil.isAdaptiveColor && (nowPlayingScreen == Normal || nowPlayingScreen == Flat || nowPlayingScreen == Material)) { setLightNavigationBar(true) setLightStatusBar(isColorLight) } else if (nowPlayingScreen == Card || nowPlayingScreen == Blur || nowPlayingScreen == BlurCard) { @@ -357,7 +357,7 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() { fun setBottomNavVisibility( visible: Boolean, animate: Boolean = false, - hideBottomSheet: Boolean = MusicPlayerRemote.playingQueue.isEmpty() + hideBottomSheet: Boolean = MusicPlayerRemote.playingQueue.isEmpty(), ) { if (isInOneTabMode) { hideBottomSheet( @@ -391,7 +391,7 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() { fun hideBottomSheet( hide: Boolean, animate: Boolean = false, - isBottomNavVisible: Boolean = bottomNavigationView.isVisible + isBottomNavVisible: Boolean = bottomNavigationView.isVisible, ) { val heightOfBar = windowInsets.safeGetBottomInsets() + 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 b2aba2318..5e7a8f8eb 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 @@ -31,6 +31,7 @@ import code.name.monkey.retromusic.extensions.* import code.name.monkey.retromusic.util.PreferenceUtil import code.name.monkey.retromusic.util.theme.getNightMode import code.name.monkey.retromusic.util.theme.getThemeResValue +import com.google.android.play.core.splitcompat.SplitCompat import java.util.* abstract class AbsThemeActivity : ATHToolbarActivity(), Runnable { @@ -122,5 +123,6 @@ abstract class AbsThemeActivity : ATHToolbarActivity(), Runnable { Locale.forLanguageTag(code) } super.attachBaseContext(LanguageContextWrapper.wrap(newBase, locale)) + SplitCompat.install(this) } } 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 8f30f8de3..8509c963e 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 @@ -154,7 +154,7 @@ class AlbumTagEditorActivity : AbsTagEditorActivity override fun onLoadFailed(errorDrawable: Drawable?) { super.onLoadFailed(errorDrawable) - showToast("Load Failed", Toast.LENGTH_LONG) + showToast(R.string.error_load_failed, Toast.LENGTH_LONG) } override fun setResource(resource: BitmapPaletteWrapper?) {} 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 05839216f..33ac06250 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 @@ -39,7 +39,7 @@ object CastHelper { val remoteMediaClient = castSession.remoteMediaClient remoteMediaClient?.queueLoad( songs.toMediaInfoList(), - position, + if (position != -1) position else 0, MediaStatus.REPEAT_MODE_REPEAT_OFF, progress, JSONObject() diff --git a/app/src/main/java/code/name/monkey/retromusic/dialogs/BlacklistFolderChooserDialog.kt b/app/src/main/java/code/name/monkey/retromusic/dialogs/BlacklistFolderChooserDialog.kt index 0b787608f..5701d858b 100644 --- a/app/src/main/java/code/name/monkey/retromusic/dialogs/BlacklistFolderChooserDialog.kt +++ b/app/src/main/java/code/name/monkey/retromusic/dialogs/BlacklistFolderChooserDialog.kt @@ -2,6 +2,7 @@ package code.name.monkey.retromusic.dialogs import android.Manifest import android.app.Dialog +import android.content.Context import android.content.pm.PackageManager import android.os.Bundle import androidx.core.app.ActivityCompat @@ -80,7 +81,7 @@ class BlacklistFolderChooserDialog : DialogFragment() { } .noAutoDismiss() .positiveButton(res = R.string.add_action) { - callback?.onFolderSelection(this@BlacklistFolderChooserDialog, parentFolder!!) + callback?.onFolderSelection(requireContext(), parentFolder!!) dismiss() } .negativeButton(res = android.R.string.cancel) { dismiss() } @@ -128,7 +129,7 @@ class BlacklistFolderChooserDialog : DialogFragment() { } interface FolderCallback { - fun onFolderSelection(dialog: BlacklistFolderChooserDialog, folder: File) + fun onFolderSelection(context: Context, folder: File) } companion object { 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 3565ac486..f51331c2a 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 @@ -1,6 +1,20 @@ package code.name.monkey.retromusic.extensions +import android.support.v4.media.MediaDescriptionCompat +import android.support.v4.media.session.MediaSessionCompat.QueueItem import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.util.MusicUtil -val Song.uri get() = MusicUtil.getSongFileUri(songId = id) \ No newline at end of file +val Song.uri get() = MusicUtil.getSongFileUri(songId = id) + + +fun ArrayList.toMediaSessionQueue(): List { + return map { + val mediaDescription = MediaDescriptionCompat.Builder() + .setMediaId(it.id.toString()) + .setTitle(it.title) + .setSubtitle(it.artistName) + .build() + QueueItem(mediaDescription, it.hashCode().toLong()) + } +} 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 27066c5b9..f5dc5b069 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 @@ -122,7 +122,7 @@ class BackupFragment : Fragment(R.layout.fragment_backup), BackupAdapter.BackupC try { file.delete() } catch (exception: SecurityException) { - showToast("Could not delete backup") + showToast(R.string.error_delete_backup) } backupViewModel.loadBackups() return true @@ -147,7 +147,7 @@ class BackupFragment : Fragment(R.layout.fragment_backup), BackupAdapter.BackupC file.renameTo(renamedFile) backupViewModel.loadBackups() } else { - showToast("File already exists") + showToast(R.string.file_already_exists) } } positiveButton(android.R.string.ok) 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 082f1ce4b..8a8069d2f 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 @@ -180,11 +180,14 @@ abstract class AbsPlayerFragment(@LayoutRes layout: Int) : AbsMusicServiceFragme return true } R.id.action_set_as_ringtone -> { - if (RingtoneManager.requiresDialog(requireActivity())) { - RingtoneManager.getDialog(requireActivity()) + requireContext().run { + if (RingtoneManager.requiresDialog(this)) { + RingtoneManager.showDialog(this) + } else { + RingtoneManager.setRingtone(this, song) + } } - val ringtoneManager = RingtoneManager(requireActivity()) - ringtoneManager.setRingtone(song) + return true } R.id.action_go_to_genre -> { @@ -265,7 +268,7 @@ abstract class AbsPlayerFragment(@LayoutRes layout: Int) : AbsMusicServiceFragme } else { if (isFavorite) R.drawable.ic_favorite else R.drawable.ic_favorite_border } - val drawable = requireContext().getTintedDrawable( + val drawable = requireContext().getTintedDrawable( icon, toolbarIconColor() ) @@ -379,9 +382,7 @@ fun goToArtist(activity: Activity) { findNavController(R.id.fragment_container).navigate( R.id.artistDetailsFragment, bundleOf(EXTRA_ARTIST_ID to song.artistId), - navOptions { - launchSingleTop = true - }, + null, null ) } @@ -402,9 +403,7 @@ fun goToAlbum(activity: Activity) { findNavController(R.id.fragment_container).navigate( R.id.albumDetailsFragment, bundleOf(EXTRA_ALBUM_ID to song.albumId), - navOptions { - launchSingleTop = true - }, + null, null ) } diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/other/LyricsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/other/LyricsFragment.kt index d1ce9c693..0083464b2 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/other/LyricsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/other/LyricsFragment.kt @@ -141,8 +141,8 @@ class LyricsFragment : AbsMainActivityFragment(R.layout.fragment_lyrics) { binding.lyricsPager.adapter = lyricsSectionsAdapter TabLayoutMediator(binding.tabLyrics, binding.lyricsPager) { tab, position -> tab.text = when (position) { - 0 -> "Synced Lyrics" - 1 -> "Normal Lyrics" + 0 -> getString(R.string.synced_lyrics) + 1 -> getString(R.string.normal_lyrics) else -> "" } }.attach() @@ -383,7 +383,7 @@ class LyricsFragment : AbsMainActivityFragment(R.layout.fragment_lyrics) { } fun loadLRCLyrics() { - binding.lyricsView.setLabel("Empty") + binding.lyricsView.setLabel(getString(R.string.empty)) LyricUtil.getSyncedLyricsFile(MusicPlayerRemote.currentSong)?.let { binding.lyricsView.loadLrc(it) } diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/other/UserInfoFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/other/UserInfoFragment.kt index 915e34116..7b4946506 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/other/UserInfoFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/other/UserInfoFragment.kt @@ -66,7 +66,7 @@ class UserInfoFragment : Fragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? + savedInstanceState: Bundle?, ): View { sharedElementEnterTransition = MaterialContainerTransform().apply { drawingViewId = R.id.fragment_container @@ -96,7 +96,7 @@ class UserInfoFragment : Fragment() { binding.next.setOnClickListener { val nameString = binding.name.text.toString().trim { it <= ' ' } if (nameString.isEmpty()) { - showToast("Your name can't be empty!") + showToast(R.string.error_empty_name) return@setOnClickListener } userName = nameString @@ -229,7 +229,7 @@ class UserInfoFragment : Fragment() { model: Any?, target: Target?, dataSource: DataSource?, - isFirstResource: Boolean + isFirstResource: Boolean, ): Boolean { resource?.let { saveImage(it, USER_BANNER) } return false @@ -239,7 +239,7 @@ class UserInfoFragment : Fragment() { e: GlideException?, model: Any?, target: Target?, - isFirstResource: Boolean + isFirstResource: Boolean, ): Boolean { return false } @@ -251,18 +251,14 @@ class UserInfoFragment : Fragment() { lifecycleScope.launch(Dispatchers.IO) { val appDir = requireContext().filesDir val file = File(appDir, fileName) - var successful = false - runCatching { - file.outputStream().buffered().use { - successful = ImageUtil.resizeBitmap(bitmap, 2048) - .compress(Bitmap.CompressFormat.WEBP, 100, it) - } - }.onFailure { - it.printStackTrace() + var successful: Boolean + file.outputStream().buffered().use { + successful = ImageUtil.resizeBitmap(bitmap, 2048) + .compress(Bitmap.CompressFormat.WEBP, 100, it) } if (successful) { withContext(Dispatchers.Main) { - showToast("Updated") + showToast(R.string.message_updated) } } } @@ -279,7 +275,7 @@ class UserInfoFragment : Fragment() { model: Any?, target: Target?, dataSource: DataSource?, - isFirstResource: Boolean + isFirstResource: Boolean, ): Boolean { resource?.let { saveImage(it, USER_PROFILE) } return false @@ -289,7 +285,7 @@ class UserInfoFragment : Fragment() { e: GlideException?, model: Any?, target: Target?, - isFirstResource: Boolean + isFirstResource: Boolean, ): Boolean { return false } 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 5775b4471..e99ad40cc 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 @@ -20,11 +20,13 @@ import android.content.SharedPreferences import android.graphics.Color import android.os.Bundle import android.view.View +import androidx.annotation.ColorInt import androidx.core.animation.doOnEnd import androidx.core.view.isVisible import androidx.lifecycle.lifecycleScope 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 @@ -195,15 +197,7 @@ class PlayerAlbumCoverFragment : AbsMusicServiceFragment(R.layout.fragment_playe } } - private fun setLRCViewColors(backgroundColor: Int) { - val primaryColor = MaterialValueHelper.getPrimaryTextColor( - requireContext(), - backgroundColor.isColorLight - ) - val secondaryColor = MaterialValueHelper.getSecondaryDisabledTextColor( - requireContext(), - backgroundColor.isColorLight - ) + private fun setLRCViewColors(@ColorInt primaryColor: Int, @ColorInt secondaryColor: Int) { lrcView.apply { setCurrentColor(primaryColor) setTimeTextColor(primaryColor) @@ -277,19 +271,25 @@ class PlayerAlbumCoverFragment : AbsMusicServiceFragment(R.layout.fragment_playe private fun notifyColorChange(color: MediaNotificationProcessor) { callbacks?.onColorChanged(color) - setLRCViewColors( - when (PreferenceUtil.nowPlayingScreen) { - Adaptive, Fit, Plain, Simple -> surfaceColor() - Flat, Normal, Material -> if (PreferenceUtil.isAdaptiveColor) { - color.backgroundColor - } else { - surfaceColor() - } - Color, Classic -> color.primaryTextColor - Blur -> Color.BLACK - else -> surfaceColor() - } + val primaryColor = MaterialValueHelper.getPrimaryTextColor( + requireContext(), + surfaceColor().isColorLight ) + val secondaryColor = MaterialValueHelper.getSecondaryDisabledTextColor( + requireContext(), + surfaceColor().isColorLight + ) + + when (PreferenceUtil.nowPlayingScreen) { + Flat, Normal, Material -> if (PreferenceUtil.isAdaptiveColor) { + setLRCViewColors(color.primaryTextColor, color.secondaryTextColor) + } else { + setLRCViewColors(primaryColor, secondaryColor) + } + Color, Classic -> setLRCViewColors(color.primaryTextColor, color.secondaryTextColor) + Blur -> setLRCViewColors(Color.WHITE, ColorUtil.withAlpha(Color.WHITE, 0.5f)) + else -> setLRCViewColors(primaryColor, secondaryColor) + } } fun setCallbacks(listener: Callbacks) { @@ -308,5 +308,5 @@ class PlayerAlbumCoverFragment : AbsMusicServiceFragment(R.layout.fragment_playe } private val lyricViewNpsList = - listOf(Blur, Classic, Color, Flat, Material, Normal, Plain, Simple) + listOf(Blur, Classic, Color, Flat, Material, MD3, Normal, Plain, Simple) } 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 17809656b..b02bfb861 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,12 +17,10 @@ package code.name.monkey.retromusic.fragments.player.md3 import android.animation.ObjectAnimator import android.os.Bundle import android.view.View -import android.view.animation.DecelerateInterpolator import android.view.animation.LinearInterpolator 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 @@ -108,11 +106,7 @@ class MD3PlaybackControlsFragment : MaterialValueHelper.getPrimaryDisabledTextColor(requireContext(), false) } - val colorFinal = if (PreferenceUtil.isAdaptiveColor) { - color.primaryTextColor - } else { - ThemeStore.accentColor(requireContext()) - }.ripAlpha() + val colorFinal = accentColor().ripAlpha() TintHelper.setTintAuto( binding.playPauseButton, @@ -198,22 +192,9 @@ class MD3PlaybackControlsFragment : setUpPlayPauseFab() } - public override fun show() { - binding.playPauseButton.animate() - .scaleX(1f) - .scaleY(1f) - .rotation(360f) - .setInterpolator(DecelerateInterpolator()) - .start() - } + public override fun show() {} - public override fun hide() { - binding.playPauseButton.apply { - scaleX = 0f - scaleY = 0f - rotation = 0f - } - } + public override fun hide() {} override fun onUpdateProgressViews(progress: Int, total: Int) { binding.progressSlider.max = total 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 8e09950f3..0b8632826 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,6 +24,7 @@ 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.activities.OnThemeChangedListener import code.name.monkey.retromusic.extensions.showToast import code.name.monkey.retromusic.preferences.* @@ -37,7 +38,7 @@ import dev.chrisbanes.insetter.applyInsetter abstract class AbsSettingsFragment : ATEPreferenceFragmentCompat() { internal fun showProToastAndNavigate(message: String) { - showToast("$message is Pro version feature.") + showToast(getString(R.string.message_pro_feature, message)) NavigationUtil.goToProVersion(requireActivity()) } 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 b0ada25df..3500d2627 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 @@ -139,9 +139,7 @@ class SongsFragment : AbsRecyclerViewCustomGridSizeFragment subMenu.findItem(R.id.action_layout_card).isChecked = true R.layout.item_grid -> subMenu.findItem(R.id.action_layout_normal).isChecked = true @@ -227,9 +223,7 @@ class SongsFragment : AbsRecyclerViewCustomGridSizeFragment gridSizeMenu.findItem(R.id.action_grid_size_1).isChecked = true 2 -> gridSizeMenu.findItem(R.id.action_grid_size_2).isChecked = true @@ -274,9 +268,7 @@ class SongsFragment : AbsRecyclerViewCustomGridSizeFragment SongSortOrder.SONG_A_Z R.id.action_song_sort_order_desc -> SongSortOrder.SONG_Z_A @@ -297,9 +289,7 @@ class SongsFragment : AbsRecyclerViewCustomGridSizeFragment R.layout.item_grid R.id.action_layout_card -> R.layout.item_card @@ -317,9 +307,7 @@ class SongsFragment : AbsRecyclerViewCustomGridSizeFragment 1 R.id.action_grid_size_2 -> 2 diff --git a/app/src/main/java/code/name/monkey/retromusic/helper/BackupHelper.kt b/app/src/main/java/code/name/monkey/retromusic/helper/BackupHelper.kt index ac970fe4c..50869e936 100644 --- a/app/src/main/java/code/name/monkey/retromusic/helper/BackupHelper.kt +++ b/app/src/main/java/code/name/monkey/retromusic/helper/BackupHelper.kt @@ -3,6 +3,7 @@ package code.name.monkey.retromusic.helper import android.content.Context import android.os.Environment import code.name.monkey.retromusic.BuildConfig +import code.name.monkey.retromusic.R import code.name.monkey.retromusic.db.PlaylistEntity import code.name.monkey.retromusic.db.toSongEntity import code.name.monkey.retromusic.extensions.showToast @@ -57,11 +58,11 @@ object BackupHelper : KoinComponent { } }.onFailure { withContext(Dispatchers.Main) { - context.showToast("Couldn't create backup") + context.showToast(R.string.error_create_backup) } }.onSuccess { withContext(Dispatchers.Main) { - context.showToast("Backup created successfully") + context.showToast(R.string.message_backup_create_success) } } } @@ -160,7 +161,7 @@ object BackupHelper : KoinComponent { } } withContext(Dispatchers.Main) { - context.showToast("Restore Completed Successfully") + context.showToast(R.string.message_restore_success) } } } 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 4c63a6f39..6fca4a3a0 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 @@ -55,10 +55,9 @@ object SongMenuHelper : KoinComponent { when (menuItemId) { R.id.action_set_as_ringtone -> { if (RingtoneManager.requiresDialog(activity)) { - RingtoneManager.getDialog(activity) + RingtoneManager.showDialog(activity) } else { - val ringtoneManager = RingtoneManager(activity) - ringtoneManager.setRingtone(song) + RingtoneManager.setRingtone(activity, song) } return true } diff --git a/app/src/main/java/code/name/monkey/retromusic/preferences/BlacklistPreferenceDialog.kt b/app/src/main/java/code/name/monkey/retromusic/preferences/BlacklistPreferenceDialog.kt index c3283be21..4723bc9de 100644 --- a/app/src/main/java/code/name/monkey/retromusic/preferences/BlacklistPreferenceDialog.kt +++ b/app/src/main/java/code/name/monkey/retromusic/preferences/BlacklistPreferenceDialog.kt @@ -38,7 +38,7 @@ class BlacklistPreference @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = -1, - defStyleRes: Int = -1 + defStyleRes: Int = -1, ) : ATEDialogPreference(context, attrs, defStyleAttr, defStyleRes) { init { @@ -123,8 +123,7 @@ class BlacklistPreferenceDialog : DialogFragment(), BlacklistFolderChooserDialog dialog?.setItems(paths.toTypedArray(), null) } - override fun onFolderSelection(dialog: BlacklistFolderChooserDialog, folder: File) { - BlacklistStore.getInstance(requireContext()).addPath(folder) - refreshBlacklistData() + override fun onFolderSelection(context: Context, folder: File) { + BlacklistStore.getInstance(context).addPath(folder) } } diff --git a/app/src/main/java/code/name/monkey/retromusic/preferences/LibraryPreference.kt b/app/src/main/java/code/name/monkey/retromusic/preferences/LibraryPreference.kt index 3fa4aad50..27a70ac67 100644 --- a/app/src/main/java/code/name/monkey/retromusic/preferences/LibraryPreference.kt +++ b/app/src/main/java/code/name/monkey/retromusic/preferences/LibraryPreference.kt @@ -76,7 +76,7 @@ class LibraryPreferenceDialog : DialogFragment() { private fun updateCategories(categories: List) { if (getSelected(categories) == 0) return if (getSelected(categories) > 5) { - showToast("Not more than 5 items") + showToast(R.string.message_limit_tabs) return } PreferenceUtil.libraryCategory = categories 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 72005339d..20796815c 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 @@ -56,6 +56,7 @@ import code.name.monkey.retromusic.appwidgets.* 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.glide.BlurTransformation import code.name.monkey.retromusic.glide.GlideApp import code.name.monkey.retromusic.glide.RetroGlideExtension.getDefaultTransition @@ -1225,6 +1226,8 @@ class MusicService : MediaBrowserServiceCompat(), songPlayCountHelper.notifySongChanged(currentSong) } QUEUE_CHANGED -> { + mediaSession?.setQueueTitle(getString(R.string.now_playing_queue)) + mediaSession?.setQueue(playingQueue.toMediaSessionQueue()) updateMediaSessionMetaData() // because playing queue size might have changed saveState() if (playingQueue.size > 0) { diff --git a/app/src/main/java/code/name/monkey/retromusic/util/CustomArtistImageUtil.kt b/app/src/main/java/code/name/monkey/retromusic/util/CustomArtistImageUtil.kt index 39994818f..a4a3ed27e 100644 --- a/app/src/main/java/code/name/monkey/retromusic/util/CustomArtistImageUtil.kt +++ b/app/src/main/java/code/name/monkey/retromusic/util/CustomArtistImageUtil.kt @@ -22,6 +22,7 @@ import android.provider.MediaStore import android.widget.Toast import androidx.core.content.edit import code.name.monkey.retromusic.App +import code.name.monkey.retromusic.R import code.name.monkey.retromusic.extensions.showToast import code.name.monkey.retromusic.glide.GlideApp import code.name.monkey.retromusic.model.Artist @@ -56,7 +57,7 @@ class CustomArtistImageUtil private constructor(context: Context) { saveImage(context, artist, it) } .onFailure { - context.showToast("Load Failed") + context.showToast(R.string.error_load_failed) } } } 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 c46a169fb..ffdee11b6 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 @@ -67,12 +67,12 @@ object PreferenceUtil { } fun registerOnSharedPreferenceChangedListener( - listener: OnSharedPreferenceChangeListener + listener: OnSharedPreferenceChangeListener, ) = sharedPreferences.registerOnSharedPreferenceChangeListener(listener) fun unregisterOnSharedPreferenceChangedListener( - changeListener: OnSharedPreferenceChangeListener + changeListener: OnSharedPreferenceChangeListener, ) = sharedPreferences.unregisterOnSharedPreferenceChangeListener(changeListener) @@ -394,7 +394,7 @@ object PreferenceUtil { val filterLength get() = sharedPreferences.getInt(FILTER_SONG, 20) var lastVersion - // This was stored as an integer before now it's a long, so avoid a ClassCastException + // This was stored as an integer before now it's a long, so avoid a ClassCastException get() = try { sharedPreferences.getLong(LAST_CHANGELOG_VERSION, 0) } catch (e: ClassCastException) { @@ -725,6 +725,9 @@ object PreferenceUtil { val swipeAnywhereToChangeSong get() = sharedPreferences.getBoolean(SWIPE_ANYWHERE_NOW_PLAYING, true) + + val swipeDownToDismiss + get() = sharedPreferences.getBoolean(SWIPE_DOWN_DISMISS, true) } enum class LyricsType { diff --git a/app/src/main/java/code/name/monkey/retromusic/util/RingtoneManager.kt b/app/src/main/java/code/name/monkey/retromusic/util/RingtoneManager.kt index 8071ce4fa..98be17699 100644 --- a/app/src/main/java/code/name/monkey/retromusic/util/RingtoneManager.kt +++ b/app/src/main/java/code/name/monkey/retromusic/util/RingtoneManager.kt @@ -27,10 +27,10 @@ import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.util.MusicUtil.getSongFileUri import com.google.android.material.dialog.MaterialAlertDialogBuilder -class RingtoneManager(val context: Context) { - fun setRingtone(song: Song) { - val resolver = context.contentResolver +object RingtoneManager { + fun setRingtone(context: Context, song: Song) { val uri = getSongFileUri(song.id) + val resolver = context.contentResolver try { val cursor = resolver.query( @@ -52,28 +52,25 @@ class RingtoneManager(val context: Context) { } } - companion object { - - fun requiresDialog(context: Context): Boolean { - if (VersionUtils.hasMarshmallow()) { - if (!Settings.System.canWrite(context)) { - return true - } + fun requiresDialog(context: Context): Boolean { + if (VersionUtils.hasMarshmallow()) { + if (!Settings.System.canWrite(context)) { + return true } - return false } + return false + } - fun getDialog(context: Context) { - return MaterialAlertDialogBuilder(context, R.style.MaterialAlertDialogTheme) - .setTitle(R.string.dialog_title_set_ringtone) - .setMessage(R.string.dialog_message_set_ringtone) - .setPositiveButton(android.R.string.ok) { _, _ -> - val intent = Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS) - intent.data = ("package:" + context.applicationContext.packageName).toUri() - context.startActivity(intent) - } - .setNegativeButton(android.R.string.cancel, null) - .create().show() - } + fun showDialog(context: Context) { + return MaterialAlertDialogBuilder(context, R.style.MaterialAlertDialogTheme) + .setTitle(R.string.dialog_title_set_ringtone) + .setMessage(R.string.dialog_message_set_ringtone) + .setPositiveButton(android.R.string.ok) { _, _ -> + val intent = Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS) + intent.data = ("package:" + context.applicationContext.packageName).toUri() + context.startActivity(intent) + } + .setNegativeButton(android.R.string.cancel, null) + .create().show() } } \ 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 index f3b77d360..49e7789ed 100644 --- a/app/src/main/res/layout/cast_mini_controller.xml +++ b/app/src/main/res/layout/cast_mini_controller.xml @@ -1,31 +1,40 @@ + android:layout_width="match_parent" + android:layout_height="@dimen/cast_mini_controller_height"> - + + + + + android:layout_toStartOf="@+id/button_1" /> + android:layout_toStartOf="@+id/button_2" /> + android:layout_marginEnd="8dp" /> @@ -97,11 +92,11 @@ - + \ 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 70513475e..473c5de51 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 @@ -53,51 +53,54 @@ tools:ignore="RtlHardcoded,RtlSymmetry" tools:text="@tools:sample/date/hhmmss" /> - + app:layout_constraintTop_toBottomOf="@+id/progressSlider"> - + + + + @@ -193,6 +199,7 @@ android:src="@drawable/ic_repeat" app:layout_constraintBottom_toTopOf="@+id/songInfo" app:layout_constraintEnd_toStartOf="@id/shuffleButton" + app:layout_constraintHorizontal_bias="0.5" app:layout_constraintHorizontal_chainStyle="spread_inside" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/playPauseCard" diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index c4b41ae8d..d4cfca694 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -72,4 +72,6 @@ 16dp 16dp + 64dp + 48dp diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 136218a79..38100d4f9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -86,7 +86,9 @@ Change the sound settings and adjust the equalizer controls Auto Backup and restore your settings, playlists - + + + Backups Biography Just Black @@ -171,9 +173,14 @@ Edit Synced Lyrics Empty Equalizer + Couldn\u2019t create backup + Couldn\u2019t delete backup + Your name can\'t be empty! + Load failed Expanded FAQ Favorites + File already exists Finish last song Fit Flat @@ -237,9 +244,15 @@ Lyrics Made with ❤️ in India Material + MD3 Error Permission error - MD3 + Backup created successfully. + Not more than 5 items + %s is a Pro feature. + Restore completed successfully. + Updated + Welcome to %s]]> Name Most played Never @@ -342,6 +355,7 @@ Can increase the album cover quality, but causes slower image loading times. Only enable this if you have problems with low resolution artworks Configure visibility and order of library categories. Use Retro Music\'s custom lockscreen controls + Always play audio in background regardless of anything else being played License details for open source software When enabled, newly played songs won\'t show in history Navigate to the last used tab on start @@ -354,7 +368,6 @@ If enough space is available, show volume controls in the now playing screen Extract accent color from wallpaper Only show music from /Music Folder - Always play audio in background regardless of anything else being played Show album cover Navigate by Album Artist Album cover theme @@ -387,6 +400,7 @@ Fullscreen controls Keep screen on when showing lyrics Lyrics type + Always play Now playing theme Open source licences Pause history @@ -402,7 +416,6 @@ Volume controls Wallpaper accent color Whitelist music - Always play Pro Black theme, Now playing themes, Carousel effect and more.. Profile @@ -540,4 +553,6 @@ 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 diff --git a/app/src/main/res/xml/pref_now_playing_screen.xml b/app/src/main/res/xml/pref_now_playing_screen.xml index 82db63d13..63f4e7403 100644 --- a/app/src/main/res/xml/pref_now_playing_screen.xml +++ b/app/src/main/res/xml/pref_now_playing_screen.xml @@ -80,6 +80,13 @@ android:layout="@layout/preference_category_title" android:title="@string/pref_header_controls"> + +