From 4ccaa7c4bb4a25fc4d74aaed6b715dda5b4b0608 Mon Sep 17 00:00:00 2001 From: OxygenCobalt Date: Wed, 24 Nov 2021 20:22:30 -0700 Subject: [PATCH] all: cleanup code Clean up code and fits a bunch of miscellaneous issues. --- app/build.gradle | 6 +- .../main/java/org/oxycblt/auxio/AuxioApp.kt | 4 +- .../java/org/oxycblt/auxio/MainFragment.kt | 2 + .../org/oxycblt/auxio/coil/AuxioFetcher.kt | 145 ++++++++++-------- .../oxycblt/auxio/coil/CrossfadeTransition.kt | 88 ----------- .../auxio/coil/ErrorCrossfadeFactory.kt | 25 +++ .../java/org/oxycblt/auxio/coil/Fetchers.kt | 19 ++- .../java/org/oxycblt/auxio/coil/MusicKeyer.kt | 9 +- .../auxio/detail/DetailAppBarLayout.kt | 1 + .../oxycblt/auxio/excluded/ExcludedDialog.kt | 2 +- .../auxio/excluded/ExcludedEntryAdapter.kt | 2 +- .../oxycblt/auxio/playback/PlaybackBarView.kt | 6 +- .../oxycblt/auxio/playback/PlaybackLayout.kt | 20 ++- .../oxycblt/auxio/widgets/WidgetProvider.kt | 1 - .../res/drawable-nodpi/ui_widget_preview.png | Bin 14859 -> 13564 bytes app/src/main/res/drawable/ic_song.xml | 10 -- app/src/main/res/drawable/ui_shape_ripple.xml | 13 -- .../res/layout-land/fragment_playback.xml | 2 +- .../layout-sw600dp-land/fragment_playback.xml | 28 ++-- .../res/layout-sw600dp/fragment_playback.xml | 18 +-- .../main/res/layout-sw840dp/item_detail.xml | 3 - ...act_playback.xml => view_playback_bar.xml} | 0 app/src/main/res/layout/fragment_main.xml | 1 - app/src/main/res/layout/fragment_playback.xml | 2 +- app/src/main/res/layout/fragment_queue.xml | 1 - ...act_playback.xml => view_playback_bar.xml} | 0 app/src/main/res/values-cs/strings.xml | 4 +- app/src/main/res/values-de/strings.xml | 4 +- app/src/main/res/values-el/strings.xml | 2 +- app/src/main/res/values-es/strings.xml | 3 +- app/src/main/res/values-fr/strings.xml | 3 +- app/src/main/res/values-hu/strings.xml | 3 +- app/src/main/res/values-in/strings.xml | 3 +- app/src/main/res/values-it/strings.xml | 3 +- app/src/main/res/values-ko/strings.xml | 3 +- app/src/main/res/values-nl/strings.xml | 3 +- app/src/main/res/values-pl/strings.xml | 3 +- app/src/main/res/values-pt-rBR/strings.xml | 3 +- app/src/main/res/values-pt-rPT/strings.xml | 3 +- app/src/main/res/values-ro/strings.xml | 3 +- app/src/main/res/values-ru/strings.xml | 3 +- app/src/main/res/values-tr/strings.xml | 3 +- app/src/main/res/values-uk/strings.xml | 2 +- .../main/res/values-v31/styles_android.xml | 1 - app/src/main/res/values-zh-rCN/strings.xml | 3 +- app/src/main/res/values-zh-rTW/strings.xml | 3 +- app/src/main/res/values/dimens.xml | 2 - app/src/main/res/values/donottranslate.xml | 1 - app/src/main/res/values/strings.xml | 2 - app/src/main/res/values/styles_ui.xml | 3 +- app/src/main/res/values/themes.xml | 7 - 51 files changed, 192 insertions(+), 289 deletions(-) delete mode 100644 app/src/main/java/org/oxycblt/auxio/coil/CrossfadeTransition.kt create mode 100644 app/src/main/java/org/oxycblt/auxio/coil/ErrorCrossfadeFactory.kt delete mode 100644 app/src/main/res/drawable/ic_song.xml delete mode 100644 app/src/main/res/drawable/ui_shape_ripple.xml rename app/src/main/res/layout-w600dp/{view_compact_playback.xml => view_playback_bar.xml} (100%) rename app/src/main/res/layout/{view_compact_playback.xml => view_playback_bar.xml} (100%) diff --git a/app/build.gradle b/app/build.gradle index 0bd164b57..3b05dd9fb 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -66,11 +66,11 @@ dependencies { // General implementation "androidx.core:core-ktx:1.7.0" implementation "androidx.activity:activity-ktx:1.4.0" - implementation 'androidx.fragment:fragment-ktx:1.3.6' + implementation 'androidx.fragment:fragment-ktx:1.4.0' // UI implementation "androidx.recyclerview:recyclerview:1.2.1" - implementation "androidx.constraintlayout:constraintlayout:2.1.1" + implementation "androidx.constraintlayout:constraintlayout:2.1.2" implementation "androidx.dynamicanimation:dynamicanimation:1.0.0" implementation "androidx.viewpager2:viewpager2:1.1.0-beta01" @@ -95,7 +95,7 @@ dependencies { // --- THIRD PARTY --- // ExoPlayer - implementation "com.google.android.exoplayer:exoplayer-core:2.16.0" + implementation "com.google.android.exoplayer:exoplayer-core:2.16.1" // Image loading implementation 'io.coil-kt:coil:2.0.0-alpha03' diff --git a/app/src/main/java/org/oxycblt/auxio/AuxioApp.kt b/app/src/main/java/org/oxycblt/auxio/AuxioApp.kt index adb86e355..9de446848 100644 --- a/app/src/main/java/org/oxycblt/auxio/AuxioApp.kt +++ b/app/src/main/java/org/oxycblt/auxio/AuxioApp.kt @@ -24,7 +24,7 @@ import coil.ImageLoaderFactory import coil.request.CachePolicy import org.oxycblt.auxio.coil.AlbumArtFetcher import org.oxycblt.auxio.coil.ArtistImageFetcher -import org.oxycblt.auxio.coil.CrossfadeTransition +import org.oxycblt.auxio.coil.ErrorCrossfadeFactory import org.oxycblt.auxio.coil.GenreImageFetcher import org.oxycblt.auxio.coil.MusicKeyer import org.oxycblt.auxio.settings.SettingsManager @@ -48,7 +48,7 @@ class AuxioApp : Application(), ImageLoaderFactory { add(GenreImageFetcher.Factory()) add(MusicKeyer()) } - .transitionFactory(CrossfadeTransition.Factory()) + .transitionFactory(ErrorCrossfadeFactory()) .diskCachePolicy(CachePolicy.DISABLED) // Not downloading anything, so no disk-caching .build() } diff --git a/app/src/main/java/org/oxycblt/auxio/MainFragment.kt b/app/src/main/java/org/oxycblt/auxio/MainFragment.kt index fb86cbe95..0fda51788 100644 --- a/app/src/main/java/org/oxycblt/auxio/MainFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/MainFragment.kt @@ -40,6 +40,8 @@ import org.oxycblt.auxio.util.logD /** * A wrapper around the home fragment that shows the playback fragment and controls * the more high-level navigation features. + * @author OxygenCobalt + * TODO: Handle backnav with playback view */ class MainFragment : Fragment(), PlaybackLayout.ActionCallback { private val playbackModel: PlaybackViewModel by activityViewModels() diff --git a/app/src/main/java/org/oxycblt/auxio/coil/AuxioFetcher.kt b/app/src/main/java/org/oxycblt/auxio/coil/AuxioFetcher.kt index dedd9fb7b..76e016148 100644 --- a/app/src/main/java/org/oxycblt/auxio/coil/AuxioFetcher.kt +++ b/app/src/main/java/org/oxycblt/auxio/coil/AuxioFetcher.kt @@ -29,9 +29,18 @@ import org.oxycblt.auxio.util.logD import java.io.ByteArrayInputStream import java.io.InputStream +/** + * The base implementation for all image fetchers in Auxio. + * @author OxygenCobalt + */ abstract class AuxioFetcher : Fetcher { private val settingsManager = SettingsManager.getInstance() + /** + * Fetch the artwork of an [album]. + * This call respects user configuration and has proper redundancy in the case that + * an API fails to load. + */ protected suspend fun fetchArt(context: Context, album: Album): InputStream? { if (!settingsManager.showCovers) { return null @@ -44,62 +53,14 @@ abstract class AuxioFetcher : Fetcher { } } - /** - * Create a mosaic image from multiple streams of image data, Code adapted from Phonograph - * https://github.com/kabouzeid/Phonograph - */ - protected fun createMosaic(context: Context, streams: List): FetchResult? { - if (streams.size < 4) { - return streams.getOrNull(0)?.let { stream -> - return SourceResult( - source = ImageSource(stream.source().buffer(), context), - mimeType = null, - dataSource = DataSource.DISK - ) - } + @Suppress("BlockingMethodInNonBlockingContext") + private suspend fun fetchMediaStoreCovers(context: Context, data: Album): InputStream? { + val uri = data.id.toAlbumArtURI() + + // Eliminate any chance that this blocking call might mess up the cancellation process + return withContext(Dispatchers.IO) { + context.contentResolver.openInputStream(uri) } - - // Use a fixed 512x512 canvas for the mosaics. Preferably we would adapt this mosaic to - // target ImageView size, but Coil seems to start image loading before we can even get - // a width/height for the view, making that impractical. - val mosaicBitmap = Bitmap.createBitmap( - MOSAIC_BITMAP_SIZE, MOSAIC_BITMAP_SIZE, Bitmap.Config.ARGB_8888 - ) - - val canvas = Canvas(mosaicBitmap) - - var x = 0 - var y = 0 - - // For each stream, create a bitmap scaled to 1/4th of the mosaics combined size - // and place it on a corner of the canvas. - for (stream in streams) { - if (y == MOSAIC_BITMAP_SIZE) { - break - } - - val bitmap = Bitmap.createScaledBitmap( - BitmapFactory.decodeStream(stream), - MOSAIC_BITMAP_INCREMENT, - MOSAIC_BITMAP_INCREMENT, - true - ) - - canvas.drawBitmap(bitmap, x.toFloat(), y.toFloat(), null) - - x += MOSAIC_BITMAP_INCREMENT - - if (x == MOSAIC_BITMAP_SIZE) { - x = 0 - y += MOSAIC_BITMAP_INCREMENT - } - } - - return DrawableResult( - drawable = mosaicBitmap.toDrawable(context.resources), - isSampled = false, - dataSource = DataSource.DISK - ) } private suspend fun fetchQualityCovers(context: Context, album: Album): InputStream? { @@ -139,22 +100,12 @@ abstract class AuxioFetcher : Fetcher { return null } - @Suppress("BlockingMethodInNonBlockingContext") - private suspend fun fetchMediaStoreCovers(context: Context, data: Album): InputStream? { - val uri = data.id.toAlbumArtURI() - - // Eliminate any chance that this blocking call might mess up the cancellation process - return withContext(Dispatchers.IO) { - context.contentResolver.openInputStream(uri) - } - } - - private suspend fun fetchAospMetadataCovers(context: Context, album: Album): InputStream? { + private fun fetchAospMetadataCovers(context: Context, album: Album): InputStream? { val extractor = MediaMetadataRetriever() extractor.use { ext -> - // To be safe, just make sure that this blocking call is wrapped so it doesn't - // cause problems + // This call is time-consuming but it also doesn't seem to hold up the main thread, + // so it's probably fine not to wrap it. ext.setDataSource(context, album.songs[0].id.toURI()) // Get the embedded picture from MediaMetadataRetriever, which will return a full @@ -244,6 +195,64 @@ abstract class AuxioFetcher : Fetcher { return stream } + /** + * Create a mosaic image from multiple streams of image data, Code adapted from Phonograph + * https://github.com/kabouzeid/Phonograph + */ + protected fun createMosaic(context: Context, streams: List): FetchResult? { + if (streams.size < 4) { + return streams.getOrNull(0)?.let { stream -> + return SourceResult( + source = ImageSource(stream.source().buffer(), context), + mimeType = null, + dataSource = DataSource.DISK + ) + } + } + + // Use a fixed 512x512 canvas for the mosaics. Preferably we would adapt this mosaic to + // target ImageView size, but Coil seems to start image loading before we can even get + // a width/height for the view, making that impractical. + val mosaicBitmap = Bitmap.createBitmap( + MOSAIC_BITMAP_SIZE, MOSAIC_BITMAP_SIZE, Bitmap.Config.ARGB_8888 + ) + + val canvas = Canvas(mosaicBitmap) + + var x = 0 + var y = 0 + + // For each stream, create a bitmap scaled to 1/4th of the mosaics combined size + // and place it on a corner of the canvas. + for (stream in streams) { + if (y == MOSAIC_BITMAP_SIZE) { + break + } + + val bitmap = Bitmap.createScaledBitmap( + BitmapFactory.decodeStream(stream), + MOSAIC_BITMAP_INCREMENT, + MOSAIC_BITMAP_INCREMENT, + true + ) + + canvas.drawBitmap(bitmap, x.toFloat(), y.toFloat(), null) + + x += MOSAIC_BITMAP_INCREMENT + + if (x == MOSAIC_BITMAP_SIZE) { + x = 0 + y += MOSAIC_BITMAP_INCREMENT + } + } + + return DrawableResult( + drawable = mosaicBitmap.toDrawable(context.resources), + isSampled = false, + dataSource = DataSource.DISK + ) + } + companion object { private const val MOSAIC_BITMAP_SIZE = 512 private const val MOSAIC_BITMAP_INCREMENT = 256 diff --git a/app/src/main/java/org/oxycblt/auxio/coil/CrossfadeTransition.kt b/app/src/main/java/org/oxycblt/auxio/coil/CrossfadeTransition.kt deleted file mode 100644 index 940bb1ea4..000000000 --- a/app/src/main/java/org/oxycblt/auxio/coil/CrossfadeTransition.kt +++ /dev/null @@ -1,88 +0,0 @@ -package org.oxycblt.auxio.coil - -import android.widget.ImageView -import coil.decode.DataSource -import coil.drawable.CrossfadeDrawable -import coil.request.ErrorResult -import coil.request.ImageResult -import coil.request.SuccessResult -import coil.size.Scale -import coil.transition.Transition -import coil.transition.TransitionTarget - -/** - * A modified variant of coil's CrossfadeTransition that actually animates error results. - * You know. Like it used to. - * - * @author Coil Team - */ -class CrossfadeTransition @JvmOverloads constructor( - private val target: TransitionTarget, - private val result: ImageResult, - private val durationMillis: Int = CrossfadeDrawable.DEFAULT_DURATION, - private val preferExactIntrinsicSize: Boolean = false -) : Transition { - - init { - require(durationMillis > 0) { "durationMillis must be > 0." } - } - - override fun transition() { - val drawable = CrossfadeDrawable( - start = target.drawable, - end = result.drawable, - scale = (target.view as? ImageView)?.scale ?: Scale.FIT, - durationMillis = durationMillis, - fadeStart = !(result is SuccessResult && result.isPlaceholderCached), - preferExactIntrinsicSize = preferExactIntrinsicSize - ) - - when (result) { - is SuccessResult -> target.onSuccess(drawable) - is ErrorResult -> target.onError(drawable) - } - } - - val ImageView.scale: Scale - get() = when (scaleType) { - ImageView.ScaleType.FIT_START, ImageView.ScaleType.FIT_CENTER, - ImageView.ScaleType.FIT_END, ImageView.ScaleType.CENTER_INSIDE -> Scale.FIT - else -> Scale.FILL - } - - class Factory @JvmOverloads constructor( - val durationMillis: Int = CrossfadeDrawable.DEFAULT_DURATION, - val preferExactIntrinsicSize: Boolean = false - ) : Transition.Factory { - - init { - require(durationMillis > 0) { "durationMillis must be > 0." } - } - - override fun create(target: TransitionTarget, result: ImageResult): Transition { - // !!!!!!!!!!!!!! MODIFICATION !!!!!!!!!!!!!! - // Remove the error check for this transition. Usually when something errors in - // Auxio it will stay erroring, so not crossfading on an error looks weird. - - // Don't animate if the request was fulfilled by the memory cache. - if (result is SuccessResult && result.dataSource == DataSource.MEMORY_CACHE) { - return Transition.Factory.NONE.create(target, result) - } - - return CrossfadeTransition(target, result, durationMillis, preferExactIntrinsicSize) - } - - override fun equals(other: Any?): Boolean { - if (this === other) return true - return other is Factory && - durationMillis == other.durationMillis && - preferExactIntrinsicSize == other.preferExactIntrinsicSize - } - - override fun hashCode(): Int { - var result = durationMillis - result = 31 * result + preferExactIntrinsicSize.hashCode() - return result - } - } -} diff --git a/app/src/main/java/org/oxycblt/auxio/coil/ErrorCrossfadeFactory.kt b/app/src/main/java/org/oxycblt/auxio/coil/ErrorCrossfadeFactory.kt new file mode 100644 index 000000000..8cc0184d5 --- /dev/null +++ b/app/src/main/java/org/oxycblt/auxio/coil/ErrorCrossfadeFactory.kt @@ -0,0 +1,25 @@ +package org.oxycblt.auxio.coil + +import coil.decode.DataSource +import coil.drawable.CrossfadeDrawable +import coil.request.ImageResult +import coil.request.SuccessResult +import coil.transition.CrossfadeTransition +import coil.transition.Transition +import coil.transition.TransitionTarget + +/** + * A copy of [CrossfadeTransition.Factory] that applies a transition to error results. + * You know. Like they used to. + * @author Coil Team + */ +class ErrorCrossfadeFactory : Transition.Factory { + override fun create(target: TransitionTarget, result: ImageResult): Transition { + // Don't animate if the request was fulfilled by the memory cache. + if (result is SuccessResult && result.dataSource == DataSource.MEMORY_CACHE) { + return Transition.Factory.NONE.create(target, result) + } + + return CrossfadeTransition(target, result, CrossfadeDrawable.DEFAULT_DURATION, false) + } +} diff --git a/app/src/main/java/org/oxycblt/auxio/coil/Fetchers.kt b/app/src/main/java/org/oxycblt/auxio/coil/Fetchers.kt index 21bd13060..41dbfe685 100644 --- a/app/src/main/java/org/oxycblt/auxio/coil/Fetchers.kt +++ b/app/src/main/java/org/oxycblt/auxio/coil/Fetchers.kt @@ -35,8 +35,7 @@ import org.oxycblt.auxio.music.Song import kotlin.math.min /** - * Fetcher that returns the album art for a given [Album]. Handles settings on whether to use - * quality covers or not. + * Fetcher that returns the album art for a given [Album] or [Song], depending on the factory used. * @author OxygenCobalt */ class AlbumArtFetcher private constructor( @@ -54,18 +53,22 @@ class AlbumArtFetcher private constructor( } class SongFactory : Fetcher.Factory { - override fun create(data: Song, options: Options, imageLoader: ImageLoader): Fetcher? { + override fun create(data: Song, options: Options, imageLoader: ImageLoader): Fetcher { return AlbumArtFetcher(options.context, data.album) } } class AlbumFactory : Fetcher.Factory { - override fun create(data: Album, options: Options, imageLoader: ImageLoader): Fetcher? { + override fun create(data: Album, options: Options, imageLoader: ImageLoader): Fetcher { return AlbumArtFetcher(options.context, data) } } } +/** + * Fetcher that fetches the image for an [Artist] + * @author OxygenCobalt + */ class ArtistImageFetcher private constructor( private val context: Context, private val artist: Artist @@ -79,12 +82,16 @@ class ArtistImageFetcher private constructor( } class Factory : Fetcher.Factory { - override fun create(data: Artist, options: Options, imageLoader: ImageLoader): Fetcher? { + override fun create(data: Artist, options: Options, imageLoader: ImageLoader): Fetcher { return ArtistImageFetcher(options.context, data) } } } +/** + * Fetcher that fetches the image for a [Genre] + * @author OxygenCobalt + */ class GenreImageFetcher private constructor( private val context: Context, private val genre: Genre @@ -99,7 +106,7 @@ class GenreImageFetcher private constructor( } class Factory : Fetcher.Factory { - override fun create(data: Genre, options: Options, imageLoader: ImageLoader): Fetcher? { + override fun create(data: Genre, options: Options, imageLoader: ImageLoader): Fetcher { return GenreImageFetcher(options.context, data) } } diff --git a/app/src/main/java/org/oxycblt/auxio/coil/MusicKeyer.kt b/app/src/main/java/org/oxycblt/auxio/coil/MusicKeyer.kt index ba3ab2b0f..a4aece706 100644 --- a/app/src/main/java/org/oxycblt/auxio/coil/MusicKeyer.kt +++ b/app/src/main/java/org/oxycblt/auxio/coil/MusicKeyer.kt @@ -3,12 +3,17 @@ package org.oxycblt.auxio.coil import coil.key.Keyer import coil.request.Options import org.oxycblt.auxio.music.Music +import org.oxycblt.auxio.music.Song /** * A basic keyer for music data. */ class MusicKeyer : Keyer { - override fun key(data: Music, options: Options): String? { - return "${data::class.simpleName}: ${data.id}" + override fun key(data: Music, options: Options): String { + return if (data is Song) { + key(data.album, options) + } else { + "${data::class.simpleName}: ${data.id}" + } } } diff --git a/app/src/main/java/org/oxycblt/auxio/detail/DetailAppBarLayout.kt b/app/src/main/java/org/oxycblt/auxio/detail/DetailAppBarLayout.kt index 267a96735..6d9d779ff 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/DetailAppBarLayout.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/DetailAppBarLayout.kt @@ -20,6 +20,7 @@ import org.oxycblt.auxio.ui.EdgeAppBarLayout * recyclerview is scrolled beyond it's first item (a.k.a the header). This is used instead of * CollapsingToolbarLayout since that thing is a mess with crippling bugs and state issues. * This just works. + * @author OxygenCobalt */ class DetailAppBarLayout @JvmOverloads constructor( context: Context, diff --git a/app/src/main/java/org/oxycblt/auxio/excluded/ExcludedDialog.kt b/app/src/main/java/org/oxycblt/auxio/excluded/ExcludedDialog.kt index 223f7def6..2e913ec6f 100644 --- a/app/src/main/java/org/oxycblt/auxio/excluded/ExcludedDialog.kt +++ b/app/src/main/java/org/oxycblt/auxio/excluded/ExcludedDialog.kt @@ -72,7 +72,7 @@ class ExcludedDialog : LifecycleDialog() { binding.excludedRecycler.adapter = adapter // Now that the dialog exists, we get the view manually when the dialog is shown - // and override its click-listener so that the dialog does not auto-dismiss when we + // and override its click listener so that the dialog does not auto-dismiss when we // click the "Add"/"Save" buttons. This prevents the dialog from disappearing in the former // and the app from crashing in the latter. val dialog = requireDialog() as AlertDialog diff --git a/app/src/main/java/org/oxycblt/auxio/excluded/ExcludedEntryAdapter.kt b/app/src/main/java/org/oxycblt/auxio/excluded/ExcludedEntryAdapter.kt index b91ad98cc..b8a3b1f7d 100644 --- a/app/src/main/java/org/oxycblt/auxio/excluded/ExcludedEntryAdapter.kt +++ b/app/src/main/java/org/oxycblt/auxio/excluded/ExcludedEntryAdapter.kt @@ -46,7 +46,7 @@ class ExcludedEntryAdapter( @SuppressLint("NotifyDataSetChanged") fun submitList(newPaths: MutableList) { paths = newPaths - notifyDataSetChanged() // TODO: Consider using remove/addition + notifyDataSetChanged() } inner class ViewHolder( diff --git a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackBarView.kt b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackBarView.kt index d3899ebca..56136aeb7 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackBarView.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackBarView.kt @@ -26,7 +26,7 @@ import androidx.core.view.postDelayed import androidx.core.view.updatePadding import com.google.android.material.color.MaterialColors import org.oxycblt.auxio.R -import org.oxycblt.auxio.databinding.ViewCompactPlaybackBinding +import org.oxycblt.auxio.databinding.ViewPlaybackBarBinding import org.oxycblt.auxio.music.Song import org.oxycblt.auxio.util.inflater import org.oxycblt.auxio.util.resolveAttr @@ -34,14 +34,14 @@ import org.oxycblt.auxio.util.systemBarsCompat /** * A view displaying the playback state in a compact manner. This is only meant to be used - * by [PlaybackBarLayout]. + * by [PlaybackLayout]. */ class PlaybackBarView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = -1 ) : ConstraintLayout(context, attrs, defStyleAttr) { - private val binding = ViewCompactPlaybackBinding.inflate(context.inflater, this, true) + private val binding = ViewPlaybackBarBinding.inflate(context.inflater, this, true) private var mCallback: PlaybackLayout.ActionCallback? = null init { diff --git a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackLayout.kt b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackLayout.kt index 837d98088..507479467 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackLayout.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackLayout.kt @@ -389,6 +389,11 @@ class PlaybackLayout @JvmOverloads constructor( } } + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + playbackBarView.clearCallback() + } + override fun onSaveInstanceState(): Parcelable = Bundle().apply { putParcelable("superState", super.onSaveInstanceState()) putSerializable( @@ -525,15 +530,21 @@ class PlaybackLayout @JvmOverloads constructor( * Update the view transitions done when the panel slides up. */ private fun updatePanelTransition() { - contentView.alpha = min(1 - panelOffset, 1f) + val outAlpha = min(1 - panelOffset, 1f) + val inAlpha = max(panelOffset, 0f) + + contentView.apply { + alpha = outAlpha + isInvisible = alpha == 0f + } // Slowly reduce the elevation as we slide up, eventually resulting in a neutral color // instead of an elevated one when fully expanded. - (playbackContainerView.background as MaterialShapeDrawable).alpha = (min(1 - panelOffset, 1f) * 255).toInt() + (playbackContainerView.background as MaterialShapeDrawable).alpha = (outAlpha * 255).toInt() // Fade out our bar view as we slide up playbackBarView.apply { - alpha = min(1 - panelOffset, 1f) + alpha = outAlpha isInvisible = alpha == 0f // When edge-to-edge is enabled, the playback bar will not fade out into the @@ -546,7 +557,6 @@ class PlaybackLayout @JvmOverloads constructor( // of the playback view. This seems to be the least obtrusive way to do this. lastInsets?.systemBarsCompat?.let { bars -> val params = layoutParams as FrameLayout.LayoutParams - val oldTopMargin = params.topMargin params.setMargins( @@ -565,7 +575,7 @@ class PlaybackLayout @JvmOverloads constructor( // Fade in our panel as we slide up playbackPanelView.apply { - alpha = max(panelOffset, 0f) + alpha = inAlpha isInvisible = alpha == 0f } } diff --git a/app/src/main/java/org/oxycblt/auxio/widgets/WidgetProvider.kt b/app/src/main/java/org/oxycblt/auxio/widgets/WidgetProvider.kt index 45abec297..5e490b398 100644 --- a/app/src/main/java/org/oxycblt/auxio/widgets/WidgetProvider.kt +++ b/app/src/main/java/org/oxycblt/auxio/widgets/WidgetProvider.kt @@ -34,7 +34,6 @@ import coil.imageLoader import coil.request.ImageRequest import coil.transform.RoundedCornersTransformation import org.oxycblt.auxio.BuildConfig -import org.oxycblt.auxio.R import org.oxycblt.auxio.music.Song import org.oxycblt.auxio.playback.state.PlaybackStateManager import org.oxycblt.auxio.util.isLandscape diff --git a/app/src/main/res/drawable-nodpi/ui_widget_preview.png b/app/src/main/res/drawable-nodpi/ui_widget_preview.png index f11fca24af6df669aebeb12f5a18b9d7c1484933..76b505c6fc48080f1137f680673e24ccd74e9641 100644 GIT binary patch literal 13564 zcmbVzby!u=w(mwt8VP9-X%JB9?v_S6Bm^WxVAClmASx{&-AH%4L1_dj326|74M+)_ zjyD(Q+;`8t_q_MM@BP8|E!LcC=7`_;jj`WoX($okQscs4Fai~2c^w$+hA8+`yNLzf zYzvC#!C?FyD)KUV-qTxi;YsA<&Afm183M4}64-B$Ftf=>$KAZidFSTc2xc@im3IA* z6?V=zKHNBFCgmss0?O^Cg{Grfv7PeYf|V>DM;qpjk0t!x*}daC)W<3;nLoPlc>G=D zYFR3BN$P5WR1+H(9C93OdJ_E>6Lu3UBZLrk2MHd6vzU?=b^9}wUPG;wK?~V0j?Z$Jj`wtz!gZy>YV3H!)F>*#N(}zCYkCDClnxdY zu1pSwF5g{W!z5WF}hX%e2$8cLGm__S@UT_aGY~aoArU$+-Dy@ z!)kAZjjM1*xdno`<|BOd6n>%)oCfY?GQ+pvcgi;=oQZu=8#Jtsl4)=An8x|4x~=T) zy;wdiD z>^4%#3mfyFRRLa&zP}Z%+8&NyY2x-<-wd#PB;_@(lT{5;lfED+Aqo+dL+ptYzoCr9W8mmtu8` z&PmjJczCQ>Tp%2}fH(Ft<#L9fy_-JhBqVbsRfKC^KH%kd8j~lu3p7#$ zsg*#p@~37Lbr>dI;wuxO9m=TA(Qz)J_S$uZnRsY&Mit|F2b$J%w{#ihoO{N#{9{3_ zvGkAyAvP$R`AjMJ{HGN%)^MbJu0N>^cSy*-lnpXHH-(88zSKCatG#0g}#H9%*gNG zbA-CAns~pz8H`#(hwv~T{_(HnEH-IJU5QT^DcO(iP;gp=n&L*PL(uo^DgkGRTN>%& z)|4_hKihV+?0?iF=0m}vwPsTUT*zCe5RMmI%w z8#DZi;gk}qp<^Tlp%~Q*C+Niypm&&o?_oVJA@jhV zbzwU&WScKGPPpy+GYWz#^+t{iC=#!)-_+G!HBnTLZ8KOz&9hml<0tBm(J) z2}EVOkZEK}mWqHunyUGC3R*gQLgfS$FDUyh@ zXT{R`r+Wh@!&%wZOh6C9WjBs|uf`m(fe`6a@S5Vhx3Dj;!vjmiX0ElNOyC(+zea76b$a&XjCIP!v8W2&bL!ZLbb|tXM~TW9B-Q-VjKXfd0^zh#g?x}sTM6!SV_N%UD5)M$a(MA}q{Q;6_;1*a&pC^}rf4Lx9m1kM8L(;o$8)I`!aZzU=2hk|=3Ony%)#UAc@r44^!T6~{M||!o!>(1M&V9dr zQ{zh~Mnug$NX4KVU8!qzvA+j1TKSvrm~D(QwoS;A)0QwPG;eghNbJ55^R(V&=BWmb zD47C0YZg)}vfz6Hp0gPHs>9ipk|__(n9zEyMpSfAG1p&k z=w7E-kh_gJ64Zlfl7%l}D-limx05YG2%{Y*N;L%tgK2*>dx-Hp8eY=Q@j{pzp{-;v zg+~|Oj!k|VLP%uv)C0MAivazOQh=~)qz@}{_l|XU)FeC1&7WNVVvXkGvk=0g8Oq&> z?_$)L(or*Yj?qn^(@qYZpuo*wZ_0=8#wqZBOT#>M&I4FyFR;9W?IiFBy>cCH(TnkKM3eP?7j@N=(doEbQ3T!b%*AYIfG$9cMz z2$(+Vjj$`JfA;~RSNxrmfsSd zwW7W@h(cC^XT%!*TCIMn#w%zebg9{chPhtQ!hZCg|M6173*@5q5ylj1`uNwlRxw-z zvR4FtY0nhuodkjot&#<|mbDtp<=VLC*$(_q`@|Xe;{~vY=sAH!nBq0&EP2vbYv1QJ zlo5cD(sR(Airz6ux6tU-`^nzj2pY=QvDFatiAeQn=r|v`?c=M9@jayuzeK+b$Lsmk zpNzXqIa@T4op)3~SImxkGxs<*+S%Qb!@JyjyXn;O^8EESuj*`lnHca%Y<}O<`7E+^ ztbi{jFVIN0tf{inLnv;I=~e@m(X__?0Kh9?<$)Oh3Ocda2_i=sbTrh4t9gv;K`FWgP`k*R$1uAjoPSB4>68UaM3I2W{*8 zGO)C%fkL;*iaB^ioacyTGjtCE^-fdS_f=YeUY!gJV~+*aKi`0R9o<`>Xjn*vI{4H% zNEO~uIn&>j5bx^a(3E^E`dP~DkpnN&(fxIj3leT{>QofmJC9@X`d8IwWXJ6sZW4(U z%Y=3>o$W+7C8?w$-(*AfegN`A01#-uBQr9e-`d^YJ$m(;GJ?=HO<+@3ZA9g55yN)~ zuNEf6&k)iJlTh>f%P2>D)JSg$1L&-&ha(PejTZ;(YSqcG&4^Kld89iC#Eca9R>i90 z8jbDYf-hQe1VPs@C!%G?|y?KI{I~nnzifk*XIf|WtU?? znD*?2?x&rriE^`wFz-*`+yS=K*fXkG<$B#Mr=BJ}HC!+Z!dXG5xn?=;JuP0u7z7a` ztwrp~F}pj4%1+@Kmg=zzG^*Pto|!4XUak&Vu!9Ax9|1KarzEO9-RC8EHtJ1j|NaFq z6LnnyX3g-&V1!YZ-;qP)lt*>eJ=^w@Rjd*$l_MOIF-AAh&jRbW43v+a>eIsYo#% zs5zC0O+(x8+*$5RRC+UIXF>!3nUB5B%di#R+CVDB-FjhL(cXUY*yi9$Y|{l&wB`F1Fg zB)@%M${)K-g3Am8&@d9ZAb&#PCDzTv(ZD+r$PqN%odZ?`#y2lQAk_0`slC!`Zg z@2Lg!8E-wG`%LN}WilDeQi4w-C>ucX*JX|XQW9WR+E0GHt;2nD-*-$n^h4o9jj#Km0#;uJm~E1hZE9iiyscWOxx{@&u<49dHi_@0yRMl_U_{k9E+|n zj^|+yUiPD@zgX-d`MNzk8$w@KdsZH|Wa-K_du$fHAaUAV%*J99dA7g0LVb_}|y26o|;j zGkyE;qH1sk`!Bc*%Czs{xPu@<3rJ8$tRa=4)2maBtlQi(Kt~5V=tTTYtC$BskcY2m z<%6XU$BLuYoF?pZ0n#-Xs<2?sp0M(4s=Dl}@;%5Wy=NOJHOd6)3)-U3$yBRpMZG(v znd<>ZkUvOj+n-1W&H7{{+a8z2C})QfU;fvhFKFQbtbO@!4Zy9geYG7*$<-oRv7O&C zboxk0#CMSHHSX80SD|eJ1cElAr^52&?>H7?l|hl404n2tx~Lb3PSelCeEz<>s}f`H zt{fV}Y}n!%nxYxgus{!8M-WB2VVQK?@^qcJ7-Kx8%jXBub8Nk1MSRei2HKg98{EP9 zJ7xD4Uz#M>^hA~MYQn58lNdxQ(7^>wRxS7Ac8WPglmR@dbB43`eH#JxVExP|Zmuzq z3spS2%cO!uKwW%E3RkWI7kvJGrB9b!S+?}T0r6Go*I4mI+NoyD=+ke|i6Ihs%!-6b z?oJzYE;79V20RCwS-wM&7dmT%=k~dx>(57cR?e#fQ@+x&@U6p0FyQQF58oQO(hXXv z%g~ofRvuf^atzAf;y1H9z=8G9i>lOmk32+=?u?8QAHj~Z1i=q<#)ZBp8jg3bD8-NI z(4*zWyuWyfssO5z8VL7^?u;iLnW8Me{m;%yE=D?0IPS7!GUY_Y0$I6f>t%!EtqU(; zad4Nr)$zAxy#DfWF}kk>7EmyMN#quT4o!39qY^IDC69Td(=d4rU@%^hb4l`!q5Aq; z=n}cjsLY)fMuw^>5!=EM@_;OgfllSw;+F<;#T&qjPGxbiZi&HhTRa0&>mBPnHV22R zADc+cSP@H%j}iUa8CZ9}-T_n|ou_a=*F|;rR&tRa?nB0ip9DpJp!l8PO&Vj#j;?0@V9^23K5?yE`1D4LT?N~tq`qgJO688NWB%rc0@XoDNNd8YPRDw=`(&SySx$8x(K4KvgDyY>^c`K>Xq3RD0TKnJ=nowF$1 za^GL&xxW~hWtscOIF5Gfjb53r`eZ>2r(S6eFSGPP{~K_$h7KQzbCsg`79*eRWCR#_ zsT-6Z&(?8-0K$HQ;DJzJJ2RLWa11$`JAq*)mKH_?G_i<Uai%u4et$_x&blK_~r+ zONa*+A8}p9BO=)&^~Ua$BY5HEiq@;K~|IZ&@dL;I*>*;6G+FZ?dfH`po0$w6K*zen1&v z8}%}xg+U`7V!@z^x=|)zqQjxSd`Eu(CnmWI7*gX)3#Wk4$}z4iG&@$34+GfucZ_HC zTVly4sm|H5R4+(vgc|mPbjTi1U>bLnJ;`DH$TfLnJMTO>!0U6KYF`gIMb!fbIqgn} zBEWCB!Eox$VpqQNdS8FSCr6Ifd@;Qp-|$%kV*dfZn}=|#QAz(!O* zWQ@@Kx_m#VumE;@MY2_s!~UymgHHeqb$Yr0dPgdTt0fY!W>1+WvE`5bCuU znqW?VJVD14No)N<(}lkHf@WJxy+Vxua8rQwg=mj9k-$F*IT1}*1Qz#aaXnVT7+w zGo58l)a})l--jYZmxv~_mR86GEXc2|ut$2+oXp#IaEJ8|9Q~PEqb46su3AQgCC^lQ zKuLph+vNghaDE_Wde%s;(>8f#x8<=lR`u3VPr1f6pcw4o6b1Mfa90)qO&Z#rv&A1A z@f+^`tarAXF#7>QB`@d5MYRCl!->)p2tNhZ0LBZbsb4E9GM9a0!ZG==QoiYDZx+20 z^B+J5cZldlXsn)t=nXPysZ@NnT#-LrUI%u);L1UUZaXz5dhMK(m~R|cJL<@f$b14S zW-%4S4_N^Jgd}DFqJ$Q$cFlUkIusjkE9m7GEHlI{UL5rRe-ZUGQDqb;gB%aR>fpsa z>&X{mXVzw+{1KjU6QoWhj7Vm7TCc5~hoJp@0QF*{4{?!5MD;{ubKB z*^;L^u%IBI?}|~YK~|1cOg?9?cdWM`8P!54a!YOUzx5m#C;e4nexZ21>kR?_HKzp`m-s-;%5+&RSfca;q@m~ z@T_pG2(=ex4&Z@!`Jm?BYT*lCnTIRCE;x{6xge26rg-CEdwjBz3+?GQePz0#`>wxM z#%^&Pl~jO0BH#0QK+sC^aIuG&lu*edm9>Ht3Z8369K~=YV+;QFXRlI87k)w{Qjx?K2!#kn>DKXkya!^Qgqzi=lNyGmBVORCWqiUR46opIsj4VX)|g`GQ2qKMxw(BHF;0Bkom^L0h(raw+0K$F45pKCcH7 z3PFzy3N<7Y;_iE3{FQ5Ex}3iAL01*>N(e!1g~y8RGXGf7$so}Rjom>&B?^%13(a)Vp>ZL~Hy@H(;06mg2dA4C(5Fivyvs5qvENQR31h0N zcI~)bmkyaR2rv>E0IbjzH(X=+?L&o)GzlI6A9>}Z>{khDA(o3fkVLqAbzn}M9Kh%y9CHk2ho>__pZHTwB4`H zzDU+=#VA^5!?+)--%YX-NgX;Pv>_Gn25DjS5oT|6nT3s*62Q)rK3}`aOC&9R+FuW~ zAGf@jZ@Q>ySNZh7x`!rZC9mskV$ss8Z~gtzT|7I0xSnpi^6QG%O5!mmAm`M7Al%0R zQc>D%IQ7n(gNCy`pht>h_=itM_%{5g78{EHHUAj^n2Qjql4`_5`=dRrUN4S(8C)Nt9CauyN@ zbgHMc*7jNEkHVumR|9XuRez=kSa9UL67xN<@ov^LLjO>zhx$mp1W&-c z?z3>W+ze%yY|$|`w>yp_he&c61qiWklO@$%+cHt9?ijdS@~>VP%eqY03zNtR;UDeGuKR?cf4fSLIq0~N*e*~a8`z# z!9oA{Yxt9^uAh&q#oOE55KDSM{oq$XS69H+Jfg?PFwYD{UDpB9E8~<$DB}eoAlGb& z4XFiX*FEVHsjJZ!tj?T|eY+hr>5JVyK$bZ^a3R1;>*bzwjor|LJdWyzPy55o#M&O~ ziVrt?q+0o1;fYcS`W|3Mz6+-Y9F?Vdwgd|P5oA7Z*LBJvrmncbF;%HO{J4J@V;Lrh zc?d<_Yb9-Za^iZIWi8nt_5zdW`itwVx(;@3%p9qAq~0*9wJ$nd8d*Ruzq~u)aR+Jh z(knb#&q;hVeMTxgu;NJQi_bm0+xN7E#1lb!4#H4-zQDSrdhPwx^u!{hb&A;^c5wsw z#$0pnKkBNveo+2Ca&Gne3^`r2^KrxxfyZ{s@+qK#$8SbMS(vH{JQ+4Me0qMp5$#Gj zX*My81gXcL3`Lx#s^y%u?wBxl9K>u$524q$ z5gU(G5jRDRY=Kxs#@ywWx0K~!{Ewcs!Han-6jm+98 z&?kG++|TSmoM2|qwg|hKc^b+gltj@-D&mr>f<3jtzx8Iw%akV1ur>5RT z%l#p8gl`UosH7})Hf){&7T4|1&%Vy_xUBem+rhLlc9j-QsdNeenAw$W&gO+t)UObJ zhb?w0ElA>LKyLc3Dn2lIBL^~)JhRZV%5z9t2Quf-m>#*6xJw|hg8PBQ z& zUz^&)eYb#x)vLAXlN2v(|5-(dfvxpY7DD2=wy4L&{btxc4?g9!Fs1yg}sZbGS1OBXXsdH=soB9nHbZi*Q}+C`Bcmck}{0_*AFQ zy@6j``jCOpUFep#lT+wngYp)iO!KE1Jhby2-j9`cfV7Kp`rv%NWAvEJM;8Rjlk?I0 zvnN&?rWK&e1Hda>tYch$Q1@|*?!WhilpK|b}H4fwEe=m^AIF#YP5&nB!Oz9JkP?% zi?BY=-+xgM(E+{A1Tw|x7W|4vqWhzMh{mJG720C6wL93-Rtie737lqwk3edY%a^z0 zCt6$)sCu!@&LVZuj*G6JGT4Rn{RK4FYF1V}{)PEY1rm*fdD@D38fO-t3{GMV(tVK( zcNlNqGjuw{5$zMBmfb_|TzJ3PAp4{yxlf3|^t=xK>3N zv8Gho=>w>kj8Ah|rF?Ih?HLyA0m@-W(l$NIy6FT&{sI`m$y1H4Z$;RE-Y;aw7r=;_ z0G%WEK4mDyHH5J3Z6dt`A#CryRp*&)YF3BE<5E2Vh)E8G^|}J@G;B%=Z_J!LZOvAJ ztyDtw6JhUDl0h<>s2YI8?>9icn*V9D5lB7X7jPU`3Fs`agsmjTvuTDGs(ldX2Sp() zrxEHuV7=U1=Kg*7q;PLjklvjXhPl0x1DQA6Pv#e4jJ!i!_kx|gP7kKEK)Fhd+HiK( ze4t-4>y4PM?b%C_TKlQ)0TMWSDTs@PAHk~i;O5yzEJ&@+_ZUMNh^%aw%}1BE6CUwB z8;%-~uK$$7d$KcsqF{~IOOnKEq2`QjrHCV%*O$QYgP$V!-bkGzQH{zlV|s>f^P`P( zG6JkSHLKq(?0IlRdGuXB>4K7gz^wvB^cY5^=nQ-)U<6z-MM>kq*4mq1V~eby>DbhnLy9L6_5b_y^B|C;74oZ#qmU$ z7^u78PZf185P`^psVo2?mS(5kQjoKT6ri-mK?|k;znsn20*KJ| zEi`T_8akGv4oo4&i%AOPTSgy2B)5}*#|Hj)+$`dp$EAdu5MZR;J=x$D;10e)4Z?mt zdB_&Y)K-mWNSyKW1o!Z}WRUg&bjVhyS7a=aChlX5j_&o5 zPRdoty8E6wk#Yj^-WL#`2wfNYa7doml&@klw?jn<(exD?7to^k_t$vGFkTwAfLhSu z5-$sh>$)L_zPR5hjKpdqjOmb~PO?cL&oi$G(O`F?Fz8^?!)P#KI1C0JVKUhN``>?g z{Fj!0dHk1e{^jw%jrQ+b{#&R2`1jvW2@Ub@TmEm0xwE8^A-uH)>aL~5$IIr}AD!9j zAET14*4NO$tIy&FC6=mZ_30g#JA|hnLFG1aTh@Nd2vbkE*ooB16tJ^#;a@E-j;=1- zsIJZ~PWOYtw0GXSmnrun=5n63RJzXHmSU)GuViHE81f4GzF|a+xZzm_sX#KVgxkYf z=kW(9FV`~VHN=JfRrb>9xVRMC!@y`y`!hFT_@c7@XfJZRmIim&Th1k z`_4&AlYU-}s}i-;!rglo&7xcxroZUZkJe=Yw#m*5)nLW?0x}>SC39z-{E^@i%MGFf zm&W?|0&Q*1=>zf|GhdvBLq1W?G;}cKu|~FHHIYg)6(TbX0p3ko!jNIE59ecGFbZL-$zEs;oFJ4a0LIuC4z?Ql_vaV}Ke)faz z!eDrBgY*61r8gsdW4KIOuBR?1FElD2Y4bzEc$R^4vkj74tdYzH@2`Kg+6M73=>^Nl zKjMle=ESQX*}HPfO@gIVlt;4fCDN`kVn-#aR>h7MXJ<%p4|KU&CjIiw*2C7h6+ z+4T4Hj`YCQsp~mMgI&vd!>$+X7Olv@xih_21~weiXJF8FelDd`Vleu^)Re251$oXh z-Mjz}CLp@Nk*fK+HW8C7U3YxjVoeW6wDSSdFjAv_Hg{c^SM7=%PGV&L`ec9GOXEY9 zT-xWojs$*} zm*4(YB5xI0`oLW7Ymw`bG19TU)2`de;Az)WVxDLjfhj@a%6s;@ff71fn(dJuv#|0j zT+zdklefsUVh#ok-jSC}#<6c@dWw)X{Sv32_Nx!B*K?(leElIkJTR!4Z}kEPoNAR{ ztzE+;{c(0R*sHe(idQ=p9$3_p70PHeMCbMg$dQ^0kT-4nXm@v|igMNU8pBJBZROE zY}4zYw{N)qv64*qPi#81?!E&F>aq8|&&51hGz3D8k5w>W?C%C{0tE3dvq<|| zVi`_R^mmXkKV;U9Se64@ZT`{+)a;lnIiyJWLLw`}Mvx=rGGf;+dm#!kcPo0sZxY|} znpAV1?_8mR&Yk*@64U`NOld3Bfarh|$+cg%mLbCODC@oMY0;LlW~ZvSGt$mO16A9~ zu%XMa=?w2zn{ug&A`KrxA{i}O2+_;E?Z9;PNbvU8-AzBLXIWm69eyJz45**fcUNYn zT+oVhdPG2T4s%G9Zg*c|7AZFk?{=XuI7{H*cQ5Za>IaZhkGqr)v+reD_X$stz;WGy zfCF`5l41Ls1x*^cc@}QpcU%;2cRtX245{uvF9TDC&8-dUF-iwdd#E8em#ZN1k7ZSX zWwm7_{Wgvr>~;pD0zF)KO*b1PT(a3!2NE*rRtIN3M&;z|jSbvXY^nHf2aB5b)h4d2 z7L9R4r3uAHs%&V9;lV$FS?WfU!H)P{!u5{_mcn=F;Ab`e@zWUayO)3b^yd0kHqhh0 zwEWBCzqb6>PXE#J&yoJkH~+o``r*$1Z232z|Fh%&q2<3V=GpEQY+$UCP0qsMH~3W( OOhrLMzFhW6$o~Rx_^WUL literal 14859 zcmdsec{p2p*J#J1)#CK1sxeB@8mp$(*h#g<7Lg)2+M;Hn=BX2kqNti_tEG~P8Y3c{ z8e@#1F_R)<7IP3u?v9@C{qDK%d%pMi?jQHL_deNAp1t?)x7Kg{*1Xo><6EA*P7 zvCWF|3RHjJu$4!U8`iD7XFkII1W%*2r|pT66Fi3wCFoq;G~Cn?dGfO4NXhdB5fPUs zFI-=|CgoGa3MQ2g~9iWY%<~v_dS8`2M!U) zzMltzQ7$0k~m z|4(h}zsZ#U77PB|=6^6V;$JbaK^X!$-sYiQAVONjKY8>Y z>-=TXzk#`e{I3{|IMzad{Wo{rDrz7C*qjLDij4PE~e}$!IFwM63F(s{7pmitIe6=gHjx&jUC``RBjCi^5>-<7pJ~=1U z>-LIOn|?&0Tv|=J>o#O+I1WNeF(dzuY(IVj`HsMoRRAq!F3@b>XsJ-vIVO$h&Yq#4 z>r`_os*^z>ae1T3kwwCVXp-vWt}5drbH!6rbJZx`+O}$`Yp^6*3Q(YDzer!UDu2|U zw!bZgl6Kd#v1|9^Mdigy=|=`)CylW?UfmO;j?u01=d6Kk=`5*-{B;_O= z@nCG($1S#N;sCu3eVda!Vf+Cf%HM7&0_O2-Czg0;C*&K;0o+G?D5=u5N$`UM+7!K| zW??z#e*dWvOJ`O#z~9hBjyB$-EOykG3!P(bUnykS_?Y7|9LjJpnQb|Ip*M|K3U0fM=#6yY_p3Wv4X@27X;@UW}DUh-$m7NJPH+* z@8}$^$3rYN5N$F_1~Wn{@dw%fDiq8uz;2p*h?Z>V18Vau4p(;!IY_-@q49`}kqT4! zV;yi503aNW@Zb+?McVEy=4YPl-}ZA|YspS}m*g`RUsGKao7$f2Vd1cywEszB+(|Iw zW9{J2+nOpxT}w85C<=9@gU<~dy#dgU*-UEx%3|4sTlW$y(wv3i3)mdY9M{Z0lCXDw zB;sOHKWmM92so0l`0LL})g8lkm%8@oz+_0K{(6ojlHpT1<*N#I0Jb7pUGFAk4_lTd zWGeU@>vSZfa_ZIXQ+uc7Igb+eSmv=Uo~-TpXiuagK`wgO-}X?A0=70(%HmbA@66** z@m4HF@p3e@VzK1d<23W%Q7o-(u+*_9)NZcL{=O#^^99r)jJW$%;q{@L-zL6p&Db&VsPzIfh_VKYp_qHqeEtXaw#Qc z&tIJg!cXxGX0UeVMXj3<)%^*(VL8{hC$-J7-S0aUEPM+b_m*a)sJfLYn%@(oONM`d zVaYVHkv8Eu9M7QJz}#;j?#^w6;8@;+z~~5@%ajzgdB*3{&*8cz6Ljmgf|F@lq#8`e zHv?7w8w#y`YC(p2M;D26m!_t)fji@s+3`KN|hH~enC2T~o< zGvR>z!umJ$ljX+I2tbQP*Wr>u@}m?FdgxVafFm+Pc}fV5Dg1oxqA# z=q6N1dnV}1hn@$5Xi*4ML57&EDcP)?YjEra5_g8H{o>^ds?EJ?#%(-+pFCaDu6w%KX?Nw5Y&9>GaqZ;rBLqfDl0!E7F+%W8{VmKz8S6pHG{V%PI~Y z>XT1np$RUVyk+@$HO)rq9!Fq0MmxQ?^h>8ZXD-aXfgDJXhM6*_#5Y$jD>k{E z+jxBwi8G`b1!!LIvpFhru5{}+fQ+3sHp#_#@83rlc2D;p24CZ`!l}m|G^LOai9$$a z+@F%QzgFwKjnCm~mq)z?XziT8SonvqHbOVPTC|8YrzRZJy0}sr=&DH$eud-VeY#w| z>t_^}T%L=Kw>krXYBYV3FD2r8R#viMT)&f|V{~-vH)=UxPm)6>3i3eQEzpzhQ zy@}YA2?M;B*9!k)W~{|UbKy(#1)Y-6De>_uJx*jeyaed(f8>c>4n9 zBwI*)p*rcKxd`N=FUI1T!s!rg>CKBGIG))|slw{I76B`t$C<%!6T}td=l+UG9_>vD z^Lea2_@4RfRY0US9o*F?4ZpkvX$yI3Xh4>i528QpAA_3jVzqR|KQ=Z|X@XW|!{@JE zK|Xp1hr{K14KR<;3a&m;vq1i@baQqP?xLG>GV#=D;|^_EFmP+Epr=(k*6a&eh}t1@ zf#+9J^s!`HliAFB9RYF()9EsRb_uVtd&TMYBbwMNZ~(7fa}3^E`C4&0Y(x?JBh&ca zQ)oBI=#3d;>LBHTa>tAsqRZt8fH@`UQ?i@nB|I)X4x%NODD_%8y?@XfJnF!!XEfPV zyRNAc;GKqt0MNhHja4vVE;dU3P_+wTgEg?i1LzMrQ;Tx751*6|D+)0+cN=Ohz$dZ!sGXqp`zD2%ZL4(lqZ1!gDl(-)24gwArE=R66)87=b@8*axSpH5;@CBl{fTe zOtW_lSV%HwD6kz7CIWd_y6O#np!$aHdn*(fF}L>I(Ffq_$mJgP?j1u;A*WG=^54tv z0LYW1q!1DwQZ&l=V8};;z2!G@uFcLtv}k`80&c?q2T;RxQtSzDsDKCstKp>i-sEdQ zf~0eHVZHud6}4UQSahhug__Zw`OirQAtx!CK1QFeAiE0Z;;ESdzINTU9MSryp;y~^ zCT#3N`ar5_hSH+JtEWGFVDfdd=L}Xo{9|P^i5*BDFMl=>fxNau>2;bHYTeUvww^Uz zGe+@+lw96&gp8I^Hw88^}k=zH4NVkN=)kkSK<+DK^b7390^1HLtOjZ09pqBQyb);;s2%+@elleGcE#A*$*K5 zXMF!|y?;0UH|za-dj4hG=O6U_U)wn;&nzh^+1=%4+XP*DJmYC+XQ!hRuFiD@d4GJq zh$|MPJwE7I#T;)%Fo;ZgXkqtzx-5Ncj@i; zdDA9p8g#{+?7TSS!==$x?*2iv84RHZEDWrSFSm^jei;kSH70F(5Rnha#Q_sh`JzP) z-kdA{5QrSEU?1p5^0(1ig7^Z~hOX!s-?!CdXXiGn-q?)KQak5qQkhw9Mmxw`SwQ|y)J zU>m`B-uc3At{P@;pgeav#L{vO={61xFWy-rzz&oAkrf`qY-h=>oLcn6^MqXAr2z{l z6bc4|ZEQlfmdC@7t*ZIXyqU9#;0hyJ53i!D7*zuGSTV>IxoPJgfB1<~@2igbudO_2 z7OVaA;lo6^O_6SBKM!PgtYPLY9(+1iH#R|9B*mLhW8I9y4j{8IJ;9JiCXt({8=;d! zwC9o;D zg`%Tz<^`vohL%#tj%|P^d`3QP0Ko*LHAdT_%5`U*&r~8T6?MU5IxcIvGs|V9d~vYU zZ?MGJu`^ZKzV&-`wT@MVtJ~7SRs$GM(}Q@;?qIZ(jLdQ48+CaZDsF+5r4IP)(uE{@ zHZH;A!xcxvda*&&2n5Hl%I-_F_q5wk<@t`7OuN#s?Wv0GHC{kmQyH|0-BC*mi-0q# zKN_OA5!$vw!ja>@7-Xrrb$@6aM`?xZlnI@J5nAg&!6dnbgh&vA8pI{MtF{`%#u+S` zlvT$jrb{pE*eKYnX0bE1`@u1G_Bky4PD~Xs6hBHO1eceUDebUotb>JO?TV39}m{2+k-!e$ZI;;0aZcQDFwssitJD;`6ZP+n zE5V?!YNaH++4nc^HO`>yLhWr* zZ!GQj>YAplfzKfIjcS=EKD6>fen#nAQooK)i%(DG-1xkYN% zDuJ;43iltv`4%}Y2K2l+HVE!WQ$$@wJ9llNY@w(4$X}-oeb)IRp>AWa?H^=Mew z4+hd_K05&E(4HD_rgq^=T4~04NbHPWdgM}`VTPi{ofwVB`e8RXVFa16AdeeZiouI4 z>#@4(n;_T4QH&~K+~}50yfB_iKy4S$*X+=_LH*D`CwSwEDDk0Q4#LyTSaZAm$2UsE zeAp5?o5^Ui{ZvIt6bJQVR|iX{KMqQaR%vNG>iXeXTEA!@A5q+rb)3?xbs;;|gm=(z`fN**WRg7e z-o33Ev3OmZOJ?~?F8AF`+h5KPyzhNVXG@e9RJm0d0XR&1dwbFf5rnLU&pf^>1}g^? z85a`{>ksjvGHAlDsy#;`V!fofZ)_NX+Ar+Hu_cO7Pjyh4|4JgMzBw^5F_iwx4Vx_j z#5QK+BPjHeGGQK3uBCfI__Z}g>*Qsw&kl0uaNrnrd_jHb_jcRkM~(le4M;KCUPD zlY)gyj(hXeh|7E2EnETOc!H|T!iZRrq9EpBDx%6xUxQ!F5fOR4#VpBv%%9$YGv@t{ zC8aCdKJ-77#(4C_5zo7TdyO#X=CmCXzHoscaI0Xa z2*6$c#E%+*S&{PjO{}$6xjn{TRxgPY!@_Qm#Kq!8xQmQ$3Of!b01j&bmmqeKDEwyo z&=QC_FJ9`XqpirHPQ~#Oov~(M2(gAP+As5YgH&|_9StR*`g)hYro``V1Z~V^kyTLU z$Y<5z0ke)~Dz}k!OKCga_+`7ybrQyt?H0V!ICO@>8M2tGxI$one1>&R4wuxa@ zU4)6h@ti8S33vuwn}9+-RS`&`%)+VWSb-de@yZ4T^U-7vU&9 zs=#%or3j=z3IkY)KN(IwjPL}6H!zPSKDvQyZEd|7&(Do^#Lq#)pBLT?8-ZW-NO%S< z&+EuQRj*I9IWdNE0JmM}aa%b+=Ai@~KUC&rx}Ij}yXgKD3Zx9GtIoYeF9)j7>=B%N zZ|4p+a)X zn74zs&JU&{dU|?r?T;6_&J*$n=g3lm3Q)#8v-)+Gf2Oz3L_?HBJAv2sOS$}Y6k+Irzg4tjNecrCTL-n+H5BIyh#(V#+Tc+PL= zd(cYo3Ld;gZHLGeB_oWo++(0YqJ;d85(P*?zTABGWI&MkODCk1w6qxU!xo*wc-_L+ z5D&t~Yq`|774=m;Bu%>wqvlh|t=DBmiO&Ooz)&tXXn=+rt;~`UjIDee_rnG$2!Z2r ztSJnsr>DoiQ}Eoi9ZcyTdkGz^=#z@M0)_EtY|cz_j7FW6p*^%9QTsGq`BmitPvjL^ z)f)Ir6-Ye#P9HE`n{o!+jcCzjLi7#7bpN5K+sM|oHd8D*RRS{3F0jLCs6v+7?ZWAE zf;Mfi)W&ShpxT`|X_`C<{;4B_dY43WyYz=%DW*tEn;=SXp7QCZYxpnEELybf;f6HcP|{dUw-SdC3Ls7TNeDWPsyZWt*_cIgD@Rsw1v@gSP@%8Lig3_ zZE{8k1x>4|VoMk&E3bd?5P|SI{}_IrPEtIVV(lAH$faXnqKbZP3Rm?*n#eZvcXeB$ z+4Bt2hTcI9({{(hnKeGs#!a#i!gR``+Z!jP>JGe@BonXDni|N0T&Gg=h%WuT>2v~2A4%P-MIv4$jcZcv0hLJaVsP(ePrx3wzGwkYAif`BsGtmCb(o^vTx-2VMZu`Gvt!Dv*U| zD0^=<98Hoi%+zq~9QhhHShdlXx0B1!?2UjFwX|8CjQb#Aka{|_t2G(HpYq4s6Pz1$ zNh`*0=(7q}Hte^5kFB0>yqcI@KR6Cf6O zM#|aNOytIsBZ+>kBrc#ZMfomPRe`pEK3mME^azv(QA>ag=v9uk^Og1$TIDbhmKZ{J?c z{6o%q$)qd z!)MD6L_C3ZSDR!tpRMmE56#Dc@F>3h=nnx|>V8X~cx~OG2*z%{3nxg+Rp0m7;hXqkkOT#>37m)3wR{XAnIDVhv6H$P>f1Z3}+ zrK;&@=}^$b`eYcE)XHQ`0>vp7s8tjl+lOkyY6}km4~I-FEYd=^t@oi1{5-B8_W{Ri z=|2w=`@WyY-uTbKKgSWSk4d=hkf2&Mzokq=;4P);de5zy5I;WzUy@|#>BtPF(1njG z5aQ{kq3--a1?+Vn-d}qW(M@RQz zHQyWeTL*bhNQBfl8v;--ypp(4DzD`GzO*e1m^4pbPft>Zde?wv@?|+OT9^wa>XYm{sug_ho3LB!kh_! z2s9z&v17s7OWVRlXG6OHV=%E^Ncxmh;Sw~z;pQId*Yy?XwD(~ZI6A1GOe{)I8<$yXrB}Ob|5Ge?GuD0hAxeu>9#_j`6O#Y=*!<*Ok-Bxz7kMW zc;#jr>MgFz2{ME(v@};qhBg3w8*ZkJjZJoNhi+UjRW?mf3~7P&9g0+Je#NityZ(Z& z*P)1hKg8><7b#r8>jD281S5n^g43ivY+<0Lv;YRAKxjXFP4(dzNyDuRFFYr<&IcSz z2`={t!>SemnaK(w+zq@IKR%1g9u2BrOI~>(86K!*RN z8MCcQsuVy$qmD(sjg$y)^P3H}Z8(KG=^Z65(@W~^7)d%l&|`qj_g4|f z?2G)}s1Ule{HD<^En-7}8G0F_AMe-jUH3QnC=mRBKOM0w zpP}k@dsqL`$Oy*K7N|v9Q~bYGkYBHC*o5R8q^o#0W!@EQ)>{8D*M(eU2H zU+uTJ*LC|JUD7D@(Hx&`lhoHX)X;FRokG@ltcOvv#_hO$mLB^R&YmsMDmrDE9DIjR zKo=V4tF-CYMifa6NVO5Dr|nY_L7- zIEeZ_l>9<+HcF`DeG!*^Hsa39XV0FkYol(%eC9|64O&&h^!S^bG9!u0ue7`>e+{Sy za-GIT@s?&$)BN^FkC1x$`W{ut>m3kEo)h(7&Mpi8-DFhEJe6M~r*8)$^)Mr8XDoQpF%X zfXxx;s+ta>V%mkiv*;bzd_@DK`BnPsIlZR1?AMj|{MCp+C%on!RwaP;LKx^1Vtkis zR;o6Y#dhTiLIW?oH3Y?zpqe8aQA(h@x3nBM{I0@d!aXH~wYkQqw?=g#6O9AQ1T)I# z@C+}a^{9!a;{no~z<65dP9txX=JJ5{828+OIK82oV&fT9ZY-f)bsJXh-HdF2&}zE1 z3CV)$fxBy97w4NKH6b8bduN;TG)i8RzU5sWnj*110)DBx`U1O-o}-bUC_#9#v%UxY zYA&Wwd_l0TZ>Oi7&-*t>BFgi2x^$ZI1NUQJjvsyKf~+eY3c@@#tZq2D4OI__=jJ?d zv4xO1}lX0BVH|?b_SDn>%qWz3hOc0i~|cuwR5U^bP9a(n35r z6V%dtjyE0gak$idF+wRNcxxCMo`0;o=CMm;m;nL($$A=i8spRicxG(KVOX-sYO_11 z;HA{L`|`mU>Dro(j_||bUTuJjA6&y@p?+Rtx}ZSk_RmKJR9!nsN)56}h<8*($Zxze zgY-`gC)^@f={3&kYbC8${(Cz6UB9wGWSwClRqTGkWJf=3(DVsZTw9arJ{s-LrQs`4 zP8zf=x2cQ1j)dcl;hfE=y=*Uri3&jAS(m?Aeh*pK@rbxtK^g0|_PDN!UzA-?TrKj!AbX{zwruR}C;6-f+ zq8-CqvT49`XgKNe5oPJ9k9ct9?I@jB*La*m?yJ5(pKl5EM9yIqo|CFyjtWZ=nPhu`RV8h-vsvj`4-QaSAHl-{WyQltWla zX@wxB8|R>p%nq5`Zb(*oyrFXiSz~ehLh&mrOokf4&G;kWjU{|F$6G=LVZfuPjjreM zepqJr1se)MwFAF%zoUv|KR@vr;W?Q^CAY|1_H__gn-5m*5TtvyJxE5haBCYtTRt8I z?aIHgVpy67~MAr$$&X!zvWMY1;hjB=H^D?4Q3Nn7>g2K3#;G5~39J9pMmC5axHLZ&H zedwJ|fg)`30Jq!Vu05HU8tfZoDeb5#3TaUl>rfk+^-iun{d>Cd!N?lg=ru%}w$oc^faj(9&hqJNclK{R~B(iRR4C(?m*t#|jCwHlGP zmAWN{Kg;;EWT%H9NgY9vo(6%8!q~zkuVDNZi&^5oIUsa4r?28f|LfiT?@&9{A!pF+ zKr8AO4u4c%ad%#<72qDz1ui&zf6;u2y<HZ>IUh$6k>wb@?-&>|d!|97!v3!KB`om0M;wy>0T8?EdVRT8wm{b6wP)<|f;PwAFAj~VdGENQ z6A^+$N9DzMRuu`gAqGG9ApdzJx4O!%MsB)YV8me?!VgOC}n_MfuSYN-t z{|dV5lDB^+ArVhPmV7U?Xz?;M2J8~J56o8b58`AztE^8beOt*dtPRGK8|jZVl@;aP_XZ*8pVxD?K7GkzXIHG={uesH7hjT8$AKq+ zJo^CI)K3LY@5x362i`fnZ%S`ZVo-v5$0$HRisks)=GQ7eSh5SyNPOH<;;ZVDh=`GdkP93s zLg}IKDnL^Nt+!&Hwg9EuHtE6W)ZBd>L2NX81pOeTBQ@4D)B@W<=ZZA%;Z?B74+UEp(x>FeMf}=gZ6m zB8*cWh~*k8$Z)k%`(NCcGOgfd-z?tg5Lb-76VR{*BnL|#)qRwX0^UIE5!H-XPKg=01G_ zHfWFhDQrEY=yz*}uFZHifxPznv;P4gfgxr9 diff --git a/app/src/main/res/drawable/ic_song.xml b/app/src/main/res/drawable/ic_song.xml deleted file mode 100644 index d233714bb..000000000 --- a/app/src/main/res/drawable/ic_song.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ui_shape_ripple.xml b/app/src/main/res/drawable/ui_shape_ripple.xml deleted file mode 100644 index 59706db25..000000000 --- a/app/src/main/res/drawable/ui_shape_ripple.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - diff --git a/app/src/main/res/layout-land/fragment_playback.xml b/app/src/main/res/layout-land/fragment_playback.xml index ccf5848bf..04d7ea9a6 100644 --- a/app/src/main/res/layout-land/fragment_playback.xml +++ b/app/src/main/res/layout-land/fragment_playback.xml @@ -185,4 +185,4 @@ app:tint="@color/sel_accented" /> - \ No newline at end of file + diff --git a/app/src/main/res/layout-sw600dp-land/fragment_playback.xml b/app/src/main/res/layout-sw600dp-land/fragment_playback.xml index acef47faa..8a87b7053 100644 --- a/app/src/main/res/layout-sw600dp-land/fragment_playback.xml +++ b/app/src/main/res/layout-sw600dp-land/fragment_playback.xml @@ -37,11 +37,11 @@ android:id="@+id/playback_cover" style="@style/Widget.Auxio.Image.Full" android:layout_margin="@dimen/spacing_mid_large" - android:layout_marginEnd="8dp" android:contentDescription="@{@string/desc_album_cover(song.name)}" app:albumArt="@{song}" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toStartOf="@+id/playback_song_container" + app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/playback_toolbar" tools:src="@drawable/ic_album" /> @@ -76,14 +76,12 @@ style="@style/Widget.Auxio.TextView.Secondary" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_marginStart="@dimen/spacing_mid_large" - android:layout_marginEnd="@dimen/spacing_mid_large" android:onClick="@{() -> detailModel.navToItem(playbackModel.song.album.artist)}" android:text="@{song.album.artist.resolvedName}" app:layout_constraintBottom_toTopOf="@+id/playback_album" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintHorizontal_bias="0.5" - app:layout_constraintStart_toEndOf="@+id/playback_cover" + app:layout_constraintStart_toStartOf="@+id/playback_song_container" + app:layout_constraintEnd_toEndOf="@+id/playback_song_container" + app:layout_constraintHorizontal_bias="0.0" app:layout_constraintTop_toBottomOf="@+id/playback_song_container" tools:text="Artist Name" /> @@ -92,14 +90,12 @@ style="@style/Widget.Auxio.TextView.Secondary" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_marginStart="@dimen/spacing_mid_large" - android:layout_marginEnd="@dimen/spacing_mid_large" android:onClick="@{() -> detailModel.navToItem(playbackModel.song.album)}" android:text="@{song.album.name}" app:layout_constraintBottom_toTopOf="@+id/playback_seek_bar" - app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.5" - app:layout_constraintStart_toEndOf="@+id/playback_cover" + app:layout_constraintStart_toStartOf="@+id/playback_song_container" + app:layout_constraintEnd_toEndOf="@+id/playback_song_container" app:layout_constraintTop_toBottomOf="@+id/playback_artist" tools:text="Album Name" /> @@ -107,12 +103,12 @@ android:id="@+id/playback_seek_bar" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_marginStart="@dimen/spacing_small" - android:layout_marginEnd="@dimen/spacing_small" + android:layout_marginStart="-8dp" + android:layout_marginEnd="-8dp" app:layout_constraintBottom_toTopOf="@+id/playback_play_pause" - app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.5" - app:layout_constraintStart_toEndOf="@+id/playback_cover" + app:layout_constraintStart_toStartOf="@+id/playback_song_container" + app:layout_constraintEnd_toEndOf="@+id/playback_song_container" app:layout_constraintTop_toBottomOf="@+id/playback_album" /> @@ -184,6 +179,5 @@ app:layout_constraintTop_toTopOf="@+id/playback_skip_next" app:tint="@color/sel_accented" /> - \ No newline at end of file diff --git a/app/src/main/res/layout-sw600dp/fragment_playback.xml b/app/src/main/res/layout-sw600dp/fragment_playback.xml index dc94272b9..d5b2b63c2 100644 --- a/app/src/main/res/layout-sw600dp/fragment_playback.xml +++ b/app/src/main/res/layout-sw600dp/fragment_playback.xml @@ -36,7 +36,7 @@ diff --git a/app/src/main/res/layout-sw840dp/item_detail.xml b/app/src/main/res/layout-sw840dp/item_detail.xml index 9c6ba6280..af1ea1dd7 100644 --- a/app/src/main/res/layout-sw840dp/item_detail.xml +++ b/app/src/main/res/layout-sw840dp/item_detail.xml @@ -19,7 +19,6 @@ diff --git a/app/src/main/res/layout/view_compact_playback.xml b/app/src/main/res/layout/view_playback_bar.xml similarity index 100% rename from app/src/main/res/layout/view_compact_playback.xml rename to app/src/main/res/layout/view_playback_bar.xml diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 20f24d591..37b100ffc 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -4,7 +4,6 @@ "Jednoduchý, rozumný hudební přehrávač pro Android." "Přehrávání hudby" - "Nyní hraje" "Zobrazit a ovládat hrající hudbu" @@ -20,7 +19,6 @@ "Vše" "Řadit" "Vzestupně" - "Sestupně" "Umělec" "Album" "Rok" @@ -30,7 +28,7 @@ "Přehrát z alba" "Přehrát od umělce" "Přehrát z žánru" - "Nyní hraje" + "Nyní hraje" "Fronta" "Přidat do fronty" "Přidáno do fronty" diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 43bd880cd..5891ac8be 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -19,7 +19,6 @@ Sortierung Aufsteigend - Absteigend Abspielen Zufällig @@ -27,7 +26,7 @@ Von Album abspielen Von Künstler abspielen Von Genre abspielen - Aktuelle Wiedergabe + Aktuelle Wiedergabe Warteschlange Zur Warteschlange hinzufügen @@ -150,7 +149,6 @@ %d Alben Ein einfacher, rationaler Musikplayer für Android. - Aktuell Wiedergabe Spielende Musik anzeigen und kontrollieren Künstler Album diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 6a0f370b1..865d76611 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -18,7 +18,7 @@ Αναπαραγωγή Τυχαία - Παίζει τώρα + Παίζει τώρα Ουρά αναπαραγωγής Προσθήκη στην ουρά αναπ/γής diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 3fe8f5633..f8078b962 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -20,7 +20,6 @@ Ordenar Ascendente - Descendente Reproducir Aleatorio @@ -28,7 +27,7 @@ Reproducir por álbum Reproducir por artista Reproducir por género - Reproducción actual + Reproducción actual Cola Agregar a la cola diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index e3caa417f..b658fe0da 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -16,11 +16,10 @@ Tri Ascendant - Descendant Lecture Aléatoire - Lecture en cours + Lecture en cours File d\'attente Ajouter à la file d\'attente diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 8189b846f..86a3a8545 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -16,11 +16,10 @@ Összes Növekvő - Csökkenő Lejátszás Keverés - Most Játszott + Most Játszott Lejátszási sor Lejátszás sorhoz adás diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index 76b906667..3e2ffa052 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -16,11 +16,10 @@ Urutan Naik - Turun Putar Acak - Sedang Diputar + Sedang Diputar Antrean Tambahkan ke antrean diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 5c4a4fd76..32b16d036 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -16,11 +16,10 @@ Ordine Ascendente - Discendente Riproduci Casuale - Schermata di riproduzione + Schermata di riproduzione Coda Aggiungi alla coda diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 1ad94bff5..c739fe689 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -16,11 +16,10 @@ 분류 오름차순 - 내림차순 재생 모든 곡 랜덤 재생 - 지금 재생 중 + 지금 재생 중 대기열 대기열에 추가 diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 2fe855230..eef81e196 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -20,7 +20,6 @@ Sorteren Oplopend - Aflopend Afspelen Shuffle @@ -28,7 +27,7 @@ Speel af van album Speel van artiest Speel vanuit genre - Afspeelscherm + Afspeelscherm Wachtrij Toevoegen aan wachtrij diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 3456eaa56..118e2d61a 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -16,11 +16,10 @@ Sortowanie Rosnąco - Malejąco Graj Losowo - Obecnie Grane + Obecnie Grane Kolejka Dodaj do kolejki diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 93b418117..7e83d7ae0 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -15,11 +15,10 @@ Tudo Classificação - Descendente Reproduzir Embaralhar - Tocando agora + Tocando agora Fila Adicionar à fila diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index d98252350..bac862fb3 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -16,11 +16,10 @@ Classificação Ascendente - Descendente Reproduzir Embaralhar - A reproduzir + A reproduzir Fila Adicionar à fila diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 1333a4430..e14fe5fef 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -16,11 +16,10 @@ Sortare Crescător - Descrescător Redă Amestecare - Redare Acum + Redare Acum Fila de așteptare Adăugați la lista de așteptare diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index dbc0879b1..942f19440 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -16,11 +16,10 @@ Сортировка По возрастанию - По убыванию Воспроизвести Перемешать - Сейчас воспроизводится + Сейчас воспроизводится Очередь Добавить в очередь diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 0e7f22b8b..fad522926 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -16,11 +16,10 @@ Sıralama Artan - Azalan Başlat Karıştır - Şuan çalınan + Şuan çalınan Kuyruk Kuyruğa ekle diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 320dc0e94..d5e24a450 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -18,7 +18,7 @@ Відтворити Перемішати - Відтворюється + Відтворюється Черга Додати в чергу diff --git a/app/src/main/res/values-v31/styles_android.xml b/app/src/main/res/values-v31/styles_android.xml index 719042091..8619e88be 100644 --- a/app/src/main/res/values-v31/styles_android.xml +++ b/app/src/main/res/values-v31/styles_android.xml @@ -1,6 +1,5 @@ - diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index f0ee15af0..055c4ede4 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -16,11 +16,10 @@ 排序方式 按首字符(正序) - 按首字符(倒序) 播放 随机播放 - 正在播放界面 + 正在播放界面 播放队列 加入播放队列 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index c57b93f4e..6678a6034 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -16,11 +16,10 @@ 排序 升序排列 - 降序排列 播放 隨機播放 - 播放面板 + 播放面板 隊列 添加到隊列 diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 23771903e..86f2ace36 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -5,8 +5,6 @@ 16dp 24dp 32dp - 48dp - 128dp 48dp diff --git a/app/src/main/res/values/donottranslate.xml b/app/src/main/res/values/donottranslate.xml index a7f87b4e6..315b91419 100644 --- a/app/src/main/res/values/donottranslate.xml +++ b/app/src/main/res/values/donottranslate.xml @@ -7,5 +7,4 @@ %1$s • %2$s %1$s • %2$s • %3$s %1$s, %2$s - <b>%1$s</b>: %2$s \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a17994a2b..55cab817e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -24,7 +24,6 @@ Sort Name Ascending - Descending Artist Album Year @@ -35,7 +34,6 @@ Play from album Play from artist Play from genre - Now Playing Queue Add to queue diff --git a/app/src/main/res/values/styles_ui.xml b/app/src/main/res/values/styles_ui.xml index 0295e4b14..938a941ed 100644 --- a/app/src/main/res/values/styles_ui.xml +++ b/app/src/main/res/values/styles_ui.xml @@ -161,7 +161,7 @@ @style/TextAppearance.Auxio.LabelLarger - diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index 80e4080fa..ddaf67bcd 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -483,11 +483,4 @@ @color/grey_on_surface_variant - \ No newline at end of file