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

Improved

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()