diff --git a/app/build.gradle b/app/build.gradle
index a536de93e..5f306e7b7 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -9,14 +9,14 @@ android {
defaultConfig {
minSdkVersion 21
- targetSdkVersion 31
+ targetSdkVersion 30
renderscriptTargetApi 29//must match target sdk and build tools
vectorDrawables.useSupportLibrary = true
applicationId "code.name.monkey.retromusic"
- versionCode 10543
- versionName '5.4.0 ' + "_" + getDate()
+ versionCode 10544
+ versionName '5.4.1 ' + "_" + getDate()
buildConfigField("String", "GOOGLE_PLAY_LICENSING_KEY", "\"${getProperty(getProperties('../public.properties'), 'GOOGLE_PLAY_LICENSE_KEY')}\"")
}
@@ -110,7 +110,7 @@ dependencies {
implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"
implementation "androidx.navigation:navigation-ui-ktx:$nav_version"
- def room_version = "2.3.0"
+ def room_version = '2.4.0-beta02'
implementation "androidx.room:room-runtime:$room_version"
implementation "androidx.room:room-ktx:$room_version"
kapt "androidx.room:room-compiler:$room_version"
@@ -154,7 +154,7 @@ dependencies {
implementation 'org.eclipse.mylyn.github:org.eclipse.egit.github.core:2.1.5'
implementation 'com.github.AdrienPoupa:jaudiotagger:2.2.3'
- implementation 'com.anjlab.android.iab.v3:library:2.0.1'
+ implementation 'com.anjlab.android.iab.v3:library:2.0.3'
implementation 'com.r0adkll:slidableactivity:2.1.0'
implementation 'com.heinrichreimersoftware:material-intro:2.0.0'
implementation 'com.github.dhaval2404:imagepicker:1.7.1'
diff --git a/app/src/main/assets/retro-changelog.html b/app/src/main/assets/retro-changelog.html
index 74e2f6e1e..c77c13f49 100644
--- a/app/src/main/assets/retro-changelog.html
+++ b/app/src/main/assets/retro-changelog.html
@@ -64,7 +64,7 @@
Date
-
v5.1.0Beta
+
v5.4.0Beta
What's New
- Material You
@@ -73,6 +73,7 @@
Improved
+ - Improved Animations
- Improved Crossfade
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 7b456a388..fea75a460 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
@@ -129,7 +129,6 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
if (RetroUtil.isLandscape()) {
binding.slidingPanel.drawAboveSystemBarsWithPadding(true)
}
- binding.fragmentContainer.addBottomInsets()
chooseFragmentForTheme()
setupSlidingUpPanel()
setupBottomSheet()
@@ -235,7 +234,9 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
super.onQueueChanged()
// Mini player should be hidden in Playing Queue
// it may pop up if hideBottomSheet is called
- if (currentFragment(R.id.fragment_container) !is PlayingQueueFragment) {
+ if (currentFragment(R.id.fragment_container) !is PlayingQueueFragment &&
+ bottomSheetBehavior.state != STATE_EXPANDED
+ ) {
hideBottomSheet(MusicPlayerRemote.playingQueue.isEmpty())
}
}
@@ -350,7 +351,7 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
binding.bottomNavigationView.translationY = 0F
}
binding.bottomNavigationView.bringToFront()
- libraryViewModel.setFabMargin(heightOfBarWithTabs - 2 * windowInsets.safeGetBottomInsets())
+ libraryViewModel.setFabMargin(dip(R.dimen.mini_player_height_expanded))
} else {
println("Details")
if (animate) {
@@ -367,7 +368,7 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
dip(R.dimen.bottom_nav_height).toFloat()
binding.slidingPanel.bringToFront()
}
- libraryViewModel.setFabMargin(heightOfBar - 2 * windowInsets.safeGetBottomInsets())
+ libraryViewModel.setFabMargin(dip(R.dimen.mini_player_height))
}
}
}
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 53acf6091..bd6bf459d 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
@@ -44,6 +44,7 @@ import code.name.monkey.retromusic.util.RetroColorUtil.getColor
import com.bumptech.glide.load.engine.DiskCacheStrategy
import com.bumptech.glide.request.target.ImageViewTarget
import com.bumptech.glide.request.transition.Transition
+import com.google.android.material.shape.MaterialShapeDrawable
import org.jaudiotagger.tag.FieldKey
import java.util.*
@@ -101,8 +102,9 @@ class AlbumTagEditorActivity : AbsTagEditorActivity
super.onCreate(savedInstanceState)
setUpViews()
setNoImageMode()
- binding.toolbar.setBackgroundColor(ATHUtil.resolveColor(this, R.attr.colorSurface))
setSupportActionBar(binding.toolbar)
+ binding.appBarLayout.statusBarForeground =
+ MaterialShapeDrawable.createWithElevationOverlay(this)
}
@SuppressLint("ClickableViewAccessibility")
diff --git a/app/src/main/java/code/name/monkey/retromusic/dialogs/DeleteSongsDialog.kt b/app/src/main/java/code/name/monkey/retromusic/dialogs/DeleteSongsDialog.kt
index dc6438494..ddc586b9e 100644
--- a/app/src/main/java/code/name/monkey/retromusic/dialogs/DeleteSongsDialog.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/dialogs/DeleteSongsDialog.kt
@@ -90,9 +90,9 @@ class DeleteSongsDialog : DialogFragment() {
if ((songs.size == 1) && MusicPlayerRemote.isPlaying(songs[0])) {
MusicPlayerRemote.playNextSong()
}
- if (VersionUtils.hasQ()) {
+ if (VersionUtils.hasR()) {
dismiss()
- MusicUtil.deleteTracksQ(requireActivity(), songs)
+ MusicUtil.deleteTracksR(requireActivity(), songs)
reloadTabs()
} else if (!SAFUtil.isSAFRequiredForSongs(songs)) {
CoroutineScope(Dispatchers.IO).launch {
diff --git a/app/src/main/java/code/name/monkey/retromusic/dialogs/SleepTimerDialog.kt b/app/src/main/java/code/name/monkey/retromusic/dialogs/SleepTimerDialog.kt
index e454d4a60..214bef24d 100755
--- a/app/src/main/java/code/name/monkey/retromusic/dialogs/SleepTimerDialog.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/dialogs/SleepTimerDialog.kt
@@ -138,7 +138,7 @@ class SleepTimerDialog : DialogFragment() {
}
private fun makeTimerPendingIntent(flag: Int): PendingIntent? {
- return PendingIntent.getService(requireActivity(), 0, makeTimerIntent(), flag)
+ return PendingIntent.getService(requireActivity(), 0, makeTimerIntent(), flag or PendingIntent.FLAG_IMMUTABLE)
}
private fun makeTimerIntent(): Intent {
diff --git a/app/src/main/java/code/name/monkey/retromusic/extensions/ViewExtensions.kt b/app/src/main/java/code/name/monkey/retromusic/extensions/ViewExtensions.kt
index 8571fe8b2..270db6588 100644
--- a/app/src/main/java/code/name/monkey/retromusic/extensions/ViewExtensions.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/extensions/ViewExtensions.kt
@@ -237,6 +237,6 @@ data class InitialPadding(
val right: Int, val bottom: Int
)
-private fun recordInitialPaddingForView(view: View) = InitialPadding(
+fun recordInitialPaddingForView(view: View) = InitialPadding(
view.paddingLeft, view.paddingTop, view.paddingRight, view.paddingBottom
)
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/LibraryViewModel.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/LibraryViewModel.kt
index 8a5aea2c5..a021fe70c 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/LibraryViewModel.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/LibraryViewModel.kt
@@ -14,6 +14,7 @@
*/
package code.name.monkey.retromusic.fragments
+import android.animation.ValueAnimator
import android.widget.Toast
import androidx.lifecycle.*
import code.name.monkey.retromusic.*
@@ -42,7 +43,7 @@ class LibraryViewModel(
private val legacyPlaylists = MutableLiveData>()
private val genres = MutableLiveData>()
private val searchResults = MutableLiveData>()
- private val fabMargin = MutableLiveData(0)
+ private val fabMargin = MutableLiveData(0)
val paletteColor: LiveData = _paletteColor
init {
@@ -337,11 +338,18 @@ class LibraryViewModel(
}
fun setFabMargin(bottomMargin: Int) {
- fabMargin.postValue(
- // Normal Margin
- DensityUtil.dip2px(App.getContext(), 16F) +
- bottomMargin
- )
+ val currentValue = DensityUtil.dip2px(App.getContext(), 16F) +
+ bottomMargin
+ if (currentValue != fabMargin.value) {
+ ValueAnimator.ofInt(fabMargin.value!!, currentValue).apply {
+ addUpdateListener {
+ fabMargin.postValue(
+ it.animatedValue as Int
+ )
+ }
+ start()
+ }
+ }
}
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/about/AboutFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/about/AboutFragment.kt
index 3bbe5e39c..dd022378d 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/about/AboutFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/about/AboutFragment.kt
@@ -49,7 +49,7 @@ class AboutFragment : Fragment(R.layout.fragment_about), View.OnClickListener {
// insets are not passed to child views
// https://github.com/material-components/material-components-android/issues/1310
if (!RetroUtil.isLandscape()) {
- binding.root.updatePadding(bottom = RetroUtil.getNavigationBarHeight())
+ binding.aboutContent.root.updatePadding(bottom = RetroUtil.getNavigationBarHeight())
}
}
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 2415f812e..11e8a7f00 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
@@ -1,10 +1,12 @@
package code.name.monkey.retromusic.fragments.backup
+import android.annotation.SuppressLint
import android.content.Intent
import android.os.Bundle
import android.view.MenuItem
import android.view.View
import android.widget.Toast
+import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AlertDialog
import androidx.core.view.isVisible
import androidx.fragment.app.Fragment
@@ -16,9 +18,11 @@ import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.adapter.backup.BackupAdapter
import code.name.monkey.retromusic.databinding.FragmentBackupBinding
import code.name.monkey.retromusic.helper.BackupHelper
+import code.name.monkey.retromusic.helper.sanitize
import code.name.monkey.retromusic.util.BackupUtil
import com.afollestad.materialdialogs.MaterialDialog
import com.afollestad.materialdialogs.input.input
+import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import java.io.File
@@ -42,25 +46,16 @@ class BackupFragment : Fragment(R.layout.fragment_backup), BackupAdapter.BackupC
backupAdapter?.swapDataset(listOf())
}
backupViewModel.loadBackups()
- setupButtons()
- }
-
- private fun setupButtons() {
- binding.createBackup.setOnClickListener {
- MaterialDialog(requireContext()).show {
- title(res = R.string.action_rename)
- input(prefill = System.currentTimeMillis().toString()) { _, text ->
- // Text submitted with the action button
- lifecycleScope.launch {
- BackupHelper.createBackup(requireContext(), text.toString())
- backupViewModel.loadBackups()
- }
- }
- positiveButton(android.R.string.ok)
- negativeButton(R.string.action_cancel)
- setTitle(R.string.title_new_backup)
+ val openFilePicker = registerForActivityResult(ActivityResultContracts.OpenDocument()) {
+ lifecycleScope.launch(Dispatchers.IO) {
+ backupViewModel.restoreBackup(requireActivity(), requireContext().contentResolver.openInputStream(it))
}
-
+ }
+ binding.createBackup.setOnClickListener {
+ showCreateBackupDialog()
+ }
+ binding.restoreBackup.setOnClickListener {
+ openFilePicker.launch(arrayOf("application/octet-stream"))
}
}
@@ -76,7 +71,6 @@ class BackupFragment : Fragment(R.layout.fragment_backup), BackupAdapter.BackupC
private fun checkIsEmpty() {
val isEmpty = backupAdapter!!.itemCount == 0
- binding.empty.isVisible = isEmpty
binding.backupTitle.isVisible = !isEmpty
binding.backupRecyclerview.isVisible = !isEmpty
}
@@ -88,13 +82,31 @@ class BackupFragment : Fragment(R.layout.fragment_backup), BackupAdapter.BackupC
}
}
+ @SuppressLint("CheckResult")
+ private fun showCreateBackupDialog() {
+ MaterialDialog(requireContext()).show {
+ cornerRadius(res = R.dimen.m3_card_corner_radius)
+ title(res = R.string.action_rename)
+ input(prefill = System.currentTimeMillis().toString()) { _, text ->
+ // Text submitted with the action button
+ lifecycleScope.launch {
+ BackupHelper.createBackup(requireContext(), text.sanitize())
+ backupViewModel.loadBackups()
+ }
+ }
+ positiveButton(android.R.string.ok)
+ negativeButton(R.string.action_cancel)
+ setTitle(R.string.title_new_backup)
+ }
+ }
+
override fun onBackupClicked(file: File) {
AlertDialog.Builder(requireContext())
.setTitle(R.string.restore)
.setMessage(R.string.restore_message)
.setPositiveButton(R.string.restore) { _, _ ->
lifecycleScope.launch {
- backupViewModel.restoreBackup(requireActivity(), file)
+ backupViewModel.restoreBackup(requireActivity(), file.inputStream())
}
}
.setNegativeButton(android.R.string.cancel, null)
@@ -102,6 +114,7 @@ class BackupFragment : Fragment(R.layout.fragment_backup), BackupAdapter.BackupC
.show()
}
+ @SuppressLint("CheckResult")
override fun onBackupMenuClicked(file: File, menuItem: MenuItem): Boolean {
when (menuItem.itemId) {
R.id.action_delete -> {
@@ -119,7 +132,11 @@ class BackupFragment : Fragment(R.layout.fragment_backup), BackupAdapter.BackupC
}
R.id.action_share -> {
activity?.startActivity(
- Intent.createChooser(BackupUtil.createShareFileIntent(file, requireContext()), null))
+ Intent.createChooser(
+ BackupUtil.createShareFileIntent(file, requireContext()),
+ null
+ )
+ )
return true
}
R.id.action_rename -> {
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/backup/BackupViewModel.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/backup/BackupViewModel.kt
index d2194749b..920e70c91 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/backup/BackupViewModel.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/backup/BackupViewModel.kt
@@ -9,6 +9,7 @@ import code.name.monkey.retromusic.helper.BackupHelper
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import java.io.File
+import java.io.InputStream
import kotlin.system.exitProcess
@@ -24,8 +25,8 @@ class BackupViewModel : ViewModel() {
}
}
- suspend fun restoreBackup(activity: Activity, file: File) {
- BackupHelper.restoreBackup(activity, file)
+ suspend fun restoreBackup(activity: Activity, inputStream: InputStream?) {
+ BackupHelper.restoreBackup(activity, inputStream)
withContext(Dispatchers.Main) {
val intent = Intent(
activity,
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsRecyclerViewFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsRecyclerViewFragment.kt
index c667b2fb1..51dfccdd9 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsRecyclerViewFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsRecyclerViewFragment.kt
@@ -22,7 +22,6 @@ import androidx.appcompat.widget.Toolbar
import androidx.core.view.doOnPreDraw
import androidx.core.view.isVisible
import androidx.core.view.updateLayoutParams
-import androidx.core.view.updatePadding
import androidx.navigation.fragment.findNavController
import androidx.recyclerview.widget.RecyclerView
import code.name.monkey.appthemehelper.common.ATHToolbarActivity
@@ -161,11 +160,9 @@ abstract class AbsRecyclerViewFragment, LM : Recycle
val itemCount: Int = adapter?.itemCount ?: 0
if (itemCount > 0 && MusicPlayerRemote.playingQueue.isNotEmpty()) {
- val height = dip(R.dimen.mini_player_height_expanded)
- binding.recyclerView.updatePadding(0, 0, 0, height)
+ binding.recyclerView.updatePadding(bottom = dip(R.dimen.mini_player_height_expanded))
} else {
- val height = dip(R.dimen.mini_player_height)
- binding.recyclerView.updatePadding(0, 0, 0, height)
+ binding.recyclerView.updatePadding(bottom = dip(R.dimen.mini_player_height))
}
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/other/DetailListFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/other/DetailListFragment.kt
index 49f226782..b28d903c0 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/other/DetailListFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/other/DetailListFragment.kt
@@ -89,7 +89,7 @@ class DetailListFragment : AbsMainActivityFragment(R.layout.fragment_playlist_de
override fun onChanged() {
super.onChanged()
val height = dipToPix(52f)
- binding.recyclerView.setPadding(0, 0, 0, height.toInt())
+ binding.recyclerView.updatePadding(bottom = height.toInt())
}
})
}
@@ -204,7 +204,7 @@ class DetailListFragment : AbsMainActivityFragment(R.layout.fragment_playlist_de
if (RetroUtil.isTablet()) {
return if (RetroUtil.isLandscape()) 6 else 4
}
- return 2
+ return if (RetroUtil.isLandscape()) 4 else 2
}
override fun onArtist(artistId: Long, view: View) {
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 4b43f4ead..e06a7672d 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
@@ -379,6 +379,7 @@ class LyricsFragment : AbsMusicServiceFragment(R.layout.fragment_lyrics) {
override fun onDestroyView() {
super.onDestroyView()
- (requireActivity() as MainActivity).expandPanel()
+ if (MusicPlayerRemote.playingQueue.isNotEmpty())
+ (requireActivity() as MainActivity).expandPanel()
}
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/queue/PlayingQueueFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/queue/PlayingQueueFragment.kt
index 8ec96e2e8..0bc6846de 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/queue/PlayingQueueFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/queue/PlayingQueueFragment.kt
@@ -23,7 +23,9 @@ import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import code.name.monkey.appthemehelper.util.ColorUtil
import code.name.monkey.appthemehelper.util.MaterialValueHelper
+import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper
import code.name.monkey.retromusic.R
+import code.name.monkey.retromusic.activities.MainActivity
import code.name.monkey.retromusic.adapter.song.PlayingQueueAdapter
import code.name.monkey.retromusic.databinding.FragmentPlayingQueueBinding
import code.name.monkey.retromusic.extensions.accentColor
@@ -172,6 +174,8 @@ class PlayingQueueFragment : AbsMusicServiceFragment(R.layout.fragment_playing_q
}
playingQueueAdapter = null
super.onDestroy()
+ if (MusicPlayerRemote.playingQueue.isNotEmpty())
+ (requireActivity() as MainActivity).expandPanel()
}
private fun setupToolbar() {
@@ -191,6 +195,7 @@ class PlayingQueueFragment : AbsMusicServiceFragment(R.layout.fragment_playing_q
findNavController().navigateUp()
}
setNavigationIcon(R.drawable.ic_keyboard_backspace_black)
+ ToolbarContentTintHelper.colorBackButton(this)
}
}
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/search/SearchFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/search/SearchFragment.kt
index e9b176fc1..4cd181288 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/search/SearchFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/search/SearchFragment.kt
@@ -40,6 +40,7 @@ import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.views.addAlpha
import com.google.android.material.chip.Chip
import com.google.android.material.chip.ChipGroup
+import com.google.android.material.shape.MaterialShapeDrawable
import com.google.android.material.textfield.TextInputEditText
import com.google.android.material.transition.MaterialSharedAxis
import java.util.*
@@ -96,6 +97,8 @@ class SearchFragment : AbsMainActivityFragment(R.layout.fragment_search), TextWa
bottomMargin = it
}
})
+ binding.appBarLayout.statusBarForeground =
+ MaterialShapeDrawable.createWithElevationOverlay(requireContext())
}
private fun setupChips() {
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 94775a273..1fd169bc3 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
@@ -66,7 +66,6 @@ abstract class AbsSettingsFragment : ATEPreferenceFragmentCompat() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setDivider(ColorDrawable(Color.TRANSPARENT))
- listView.overScrollMode = View.OVER_SCROLL_NEVER
// This is a workaround as CollapsingToolbarLayout consumes insets and
// insets are not passed to child views
// https://github.com/material-components/material-components-android/issues/1310
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/MainSettingsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/MainSettingsFragment.kt
index c507a259d..00935fdfd 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/MainSettingsFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/MainSettingsFragment.kt
@@ -19,15 +19,18 @@ import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
+import androidx.core.view.updatePadding
import androidx.fragment.app.Fragment
import androidx.navigation.fragment.findNavController
import code.name.monkey.appthemehelper.ThemeStore
import code.name.monkey.retromusic.App
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.databinding.FragmentMainSettingsBinding
+import code.name.monkey.retromusic.extensions.addBottomInsets
import code.name.monkey.retromusic.extensions.hide
import code.name.monkey.retromusic.extensions.show
import code.name.monkey.retromusic.util.NavigationUtil
+import code.name.monkey.retromusic.util.RetroUtil
class MainSettingsFragment : Fragment(), View.OnClickListener {
@@ -84,6 +87,9 @@ class MainSettingsFragment : Fragment(), View.OnClickListener {
binding.buyPremium.setTextColor(it)
binding.diamondIcon.imageTintList = ColorStateList.valueOf(it)
}
+ if (!RetroUtil.isLandscape()) {
+ binding.container.updatePadding(bottom = RetroUtil.getNavigationBarHeight())
+ }
}
override fun onDestroyView() {
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 02eff857f..e72dd9f15 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
@@ -15,7 +15,7 @@ import java.util.zip.ZipOutputStream
object BackupHelper {
suspend fun createBackup(context: Context, name: String) {
val backupFile =
- File(backupRootPath + name + APPEND_EXTENSION)
+ File(backupRootPath + File.separator + name + APPEND_EXTENSION)
if (backupFile.parentFile?.exists() != true) {
backupFile.parentFile?.mkdirs()
}
@@ -28,7 +28,7 @@ object BackupHelper {
}
}
- private fun zipAll(zipItems: List, backupFile: File) {
+ private suspend fun zipAll(zipItems: List, backupFile: File) {
try {
ZipOutputStream(BufferedOutputStream(FileOutputStream(backupFile))).use { out ->
for (zipItem in zipItems) {
@@ -36,13 +36,17 @@ object BackupHelper {
BufferedInputStream(fi).use { origin ->
val entry = ZipEntry(zipItem.zipPath)
out.putNextEntry(entry)
- origin.copyTo(out, 1024)
+ origin.copyTo(out)
}
}
}
}
} catch (exception: FileNotFoundException) {
- Toast.makeText(App.getContext(), "Couldn't create backup", Toast.LENGTH_SHORT).show()
+ exception.printStackTrace()
+ withContext(Dispatchers.Main) {
+ Toast.makeText(App.getContext(), "Couldn't create backup", Toast.LENGTH_SHORT)
+ .show()
+ }
}
}
@@ -72,9 +76,9 @@ object BackupHelper {
}
}
- suspend fun restoreBackup(context: Context, file: File) {
+ suspend fun restoreBackup(context: Context, inputStream: InputStream?) {
withContext(Dispatchers.IO) {
- ZipInputStream(FileInputStream(file)).use {
+ ZipInputStream(inputStream).use {
var entry = it.nextEntry
while (entry != null) {
if (entry.isDatabaseEntry()) restoreDatabase(context, it, entry)
@@ -156,4 +160,17 @@ object BackupHelper {
}
}
-data class ZipItem(val filePath: String, val zipPath: String)
\ No newline at end of file
+data class ZipItem(val filePath: String, val zipPath: String)
+
+fun CharSequence.sanitize(): String {
+ return toString().replace("/", "_")
+ .replace(":", "_")
+ .replace("*", "_")
+ .replace("?", "_")
+ .replace("\"", "_")
+ .replace("<", "_")
+ .replace(">", "_")
+ .replace("|", "_")
+ .replace("\\", "_")
+ .replace("&", "_")
+}
\ No newline at end of file
diff --git a/app/src/main/java/code/name/monkey/retromusic/repository/Repository.kt b/app/src/main/java/code/name/monkey/retromusic/repository/Repository.kt
index d8652bc32..8c1454b68 100644
--- a/app/src/main/java/code/name/monkey/retromusic/repository/Repository.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/repository/Repository.kt
@@ -72,6 +72,7 @@ interface Repository {
suspend fun genresHome(): Home
suspend fun playlists(): Home
suspend fun homeSections(): List
+ @ExperimentalCoroutinesApi
suspend fun homeSectionsFlow(): Flow>>
suspend fun playlist(playlistId: Long): Playlist
suspend fun fetchPlaylistWithSongs(): List
diff --git a/app/src/main/java/code/name/monkey/retromusic/util/MusicUtil.kt b/app/src/main/java/code/name/monkey/retromusic/util/MusicUtil.kt
index d9a66e21b..67198aae1 100644
--- a/app/src/main/java/code/name/monkey/retromusic/util/MusicUtil.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/util/MusicUtil.kt
@@ -525,7 +525,7 @@ object MusicUtil : KoinComponent {
}
@RequiresApi(Build.VERSION_CODES.R)
- fun deleteTracksQ(activity: Activity, songs: List) {
+ fun deleteTracksR(activity: Activity, songs: List) {
val pendingIntent = MediaStore.createDeleteRequest(activity.contentResolver, songs.map {
getSongFileUri(it.id)
})
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 8a8e30414..35dd5c411 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
@@ -7,6 +7,7 @@ import androidx.core.content.ContextCompat
import androidx.core.content.edit
import androidx.preference.PreferenceManager
import androidx.viewpager.widget.ViewPager
+import code.name.monkey.appthemehelper.util.VersionUtils
import code.name.monkey.retromusic.*
import code.name.monkey.retromusic.extensions.getIntRes
import code.name.monkey.retromusic.extensions.getStringOrDefault
@@ -615,5 +616,5 @@ object PreferenceUtil {
.getInt(CROSS_FADE_DURATION, 0)
val materialYou
- get() = sharedPreferences.getBoolean(MATERIAL_YOU, false)
+ get() = sharedPreferences.getBoolean(MATERIAL_YOU, VersionUtils.hasS())
}
diff --git a/app/src/main/java/code/name/monkey/retromusic/views/insets/InsetsConstraintLayout.kt b/app/src/main/java/code/name/monkey/retromusic/views/insets/InsetsConstraintLayout.kt
new file mode 100644
index 000000000..101624be6
--- /dev/null
+++ b/app/src/main/java/code/name/monkey/retromusic/views/insets/InsetsConstraintLayout.kt
@@ -0,0 +1,23 @@
+package code.name.monkey.retromusic.views.insets
+
+import android.content.Context
+import android.util.AttributeSet
+import android.view.WindowInsets
+import androidx.constraintlayout.widget.ConstraintLayout
+import androidx.core.view.WindowInsetsCompat
+import code.name.monkey.retromusic.extensions.drawAboveSystemBarsWithPadding
+import code.name.monkey.retromusic.extensions.recordInitialPaddingForView
+import code.name.monkey.retromusic.extensions.requestApplyInsetsWhenAttached
+import code.name.monkey.retromusic.util.RetroUtil
+import com.afollestad.materialdialogs.utils.MDUtil.updatePadding
+
+class InsetsConstraintLayout @JvmOverloads constructor(
+ context: Context,
+ attrs: AttributeSet? = null,
+ defStyleAttr: Int = 0
+) : ConstraintLayout(context, attrs, defStyleAttr) {
+ init {
+ if (!RetroUtil.isLandscape())
+ drawAboveSystemBarsWithPadding()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/code/name/monkey/retromusic/views/insets/InsetsRecyclerView.kt b/app/src/main/java/code/name/monkey/retromusic/views/insets/InsetsRecyclerView.kt
new file mode 100644
index 000000000..3f56b8f80
--- /dev/null
+++ b/app/src/main/java/code/name/monkey/retromusic/views/insets/InsetsRecyclerView.kt
@@ -0,0 +1,30 @@
+package code.name.monkey.retromusic.views.insets
+
+import android.content.Context
+import android.util.AttributeSet
+import androidx.annotation.Px
+import androidx.recyclerview.widget.RecyclerView
+import code.name.monkey.retromusic.extensions.drawAboveSystemBarsWithPadding
+import code.name.monkey.retromusic.util.RetroUtil
+
+class InsetsRecyclerView @JvmOverloads constructor(
+ context: Context,
+ attrs: AttributeSet? = null,
+ defStyleAttr: Int = 0
+) : RecyclerView(context, attrs, defStyleAttr) {
+ init {
+ if (!RetroUtil.isLandscape())
+ drawAboveSystemBarsWithPadding()
+ }
+
+ fun updatePadding(
+ @Px left: Int = paddingLeft,
+ @Px top: Int = paddingTop,
+ @Px right: Int = paddingRight,
+ @Px bottom: Int = paddingBottom
+ ) {
+ setPadding(left, top, right, bottom)
+ if (!RetroUtil.isLandscape())
+ drawAboveSystemBarsWithPadding()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/layout-land/fragment_banner_home.xml b/app/src/main/res/layout-land/fragment_banner_home.xml
index 521aab72d..6b8571a43 100644
--- a/app/src/main/res/layout-land/fragment_banner_home.xml
+++ b/app/src/main/res/layout-land/fragment_banner_home.xml
@@ -66,7 +66,7 @@
android:transitionGroup="true"
app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior">
-
-
+
\ No newline at end of file
diff --git a/app/src/main/res/layout-land/fragment_home.xml b/app/src/main/res/layout-land/fragment_home.xml
index f3fe8faba..2ab398e4c 100644
--- a/app/src/main/res/layout-land/fragment_home.xml
+++ b/app/src/main/res/layout-land/fragment_home.xml
@@ -59,14 +59,12 @@
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:layout_marginStart="@dimen/toolbar_margin_horizontal"
- android:layout_marginEnd="@dimen/toolbar_margin_horizontal"
android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true"
android:transitionGroup="true"
app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior">
-
-
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_album_tag_editor.xml b/app/src/main/res/layout/activity_album_tag_editor.xml
index e418b247a..5a40e8ee1 100755
--- a/app/src/main/res/layout/activity_album_tag_editor.xml
+++ b/app/src/main/res/layout/activity_album_tag_editor.xml
@@ -5,8 +5,7 @@
android:layout_height="match_parent"
android:background="?attr/colorSurface"
android:fitsSystemWindows="true"
- android:orientation="vertical"
- tools:ignore="UnusedAttribute">
+ android:orientation="vertical">
diff --git a/app/src/main/res/layout/activity_song_tag_editor.xml b/app/src/main/res/layout/activity_song_tag_editor.xml
index 2f9402a7e..d054429c5 100755
--- a/app/src/main/res/layout/activity_song_tag_editor.xml
+++ b/app/src/main/res/layout/activity_song_tag_editor.xml
@@ -1,9 +1,7 @@
@@ -20,8 +18,7 @@
style="@style/Toolbar"
app:navigationIcon="@drawable/ic_keyboard_backspace_black"
app:title="@string/action_tag_editor"
- app:titleTextAppearance="@style/ToolbarTextAppearanceNormal"
- tools:ignore="UnusedAttribute" />
+ app:titleTextAppearance="@style/ToolbarTextAppearanceNormal" />
-
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_artist_content.xml b/app/src/main/res/layout/fragment_artist_content.xml
index 9415be12f..ca171cdfc 100644
--- a/app/src/main/res/layout/fragment_artist_content.xml
+++ b/app/src/main/res/layout/fragment_artist_content.xml
@@ -1,5 +1,5 @@
-
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_backup.xml b/app/src/main/res/layout/fragment_backup.xml
index c24a3399c..fa22e3f2a 100644
--- a/app/src/main/res/layout/fragment_backup.xml
+++ b/app/src/main/res/layout/fragment_backup.xml
@@ -1,10 +1,8 @@
+ android:layout_height="match_parent">
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_banner_home.xml b/app/src/main/res/layout/fragment_banner_home.xml
index 270665598..67cf3c341 100644
--- a/app/src/main/res/layout/fragment_banner_home.xml
+++ b/app/src/main/res/layout/fragment_banner_home.xml
@@ -63,7 +63,7 @@
android:focusableInTouchMode="true"
app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior">
-
-
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_folder.xml b/app/src/main/res/layout/fragment_folder.xml
index 02d0b1336..56b086604 100644
--- a/app/src/main/res/layout/fragment_folder.xml
+++ b/app/src/main/res/layout/fragment_folder.xml
@@ -77,7 +77,7 @@
tools:visibility="visible" />
-
-
-
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_main_recycler.xml b/app/src/main/res/layout/fragment_main_recycler.xml
index cf7d98163..d3cb8564c 100644
--- a/app/src/main/res/layout/fragment_main_recycler.xml
+++ b/app/src/main/res/layout/fragment_main_recycler.xml
@@ -38,7 +38,7 @@
-
diff --git a/app/src/main/res/layout/fragment_playlist_detail.xml b/app/src/main/res/layout/fragment_playlist_detail.xml
index c3dca2851..c5b1e93ab 100644
--- a/app/src/main/res/layout/fragment_playlist_detail.xml
+++ b/app/src/main/res/layout/fragment_playlist_detail.xml
@@ -30,7 +30,7 @@
-
+ android:layout_height="wrap_content"
+ android:fitsSystemWindows="true">
@@ -30,7 +29,7 @@
-
-
-
-
+
-
-
-
-
+
-
-
+
Aucun morceau
Normal
Paroles normales
- %s N'est pas répertorié dans le stockage des médias.]]>
+ %s N\'est pas répertorié dans le stockage des médias.]]>
Non jouée récemment
Rien à scanner.
Rien à afficher
diff --git a/app/src/main/res/values-v31/styles.xml b/app/src/main/res/values-v31/styles.xml
index f8479c491..b5c3c71ce 100644
--- a/app/src/main/res/values-v31/styles.xml
+++ b/app/src/main/res/values-v31/styles.xml
@@ -8,6 +8,9 @@
- @color/transparent
- @color/transparent
- false
+ -
+ @style/Widget.MaterialComponents.FloatingActionButton
+
- @drawable/popup_background
diff --git a/appthemehelper/src/main/java/code/name/monkey/appthemehelper/ThemeStore.kt b/appthemehelper/src/main/java/code/name/monkey/appthemehelper/ThemeStore.kt
index 597744439..f64b15280 100644
--- a/appthemehelper/src/main/java/code/name/monkey/appthemehelper/ThemeStore.kt
+++ b/appthemehelper/src/main/java/code/name/monkey/appthemehelper/ThemeStore.kt
@@ -307,7 +307,7 @@ private constructor(private val mContext: Context) : ThemeStorePrefKeys, ThemeSt
}
private fun isMD3Enabled(context: Context): Boolean {
- return PreferenceManager.getDefaultSharedPreferences(context).getBoolean(ThemeStorePrefKeys.KEY_MATERIAL_YOU, false)
+ return PreferenceManager.getDefaultSharedPreferences(context).getBoolean(ThemeStorePrefKeys.KEY_MATERIAL_YOU, VersionUtils.hasS())
}
}
}
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
index b9557bed7..04b4fbcde 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,7 +1,7 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
- ext.kotlin_version = '1.5.31'
+ ext.kotlin_version = '1.6.0'
repositories {
mavenCentral()
google()