Fix compat issues
Fix some issues on older versions.
This commit is contained in:
parent
a443ccd508
commit
d4d40c97ad
14 changed files with 48 additions and 32 deletions
|
@ -38,16 +38,17 @@ Its meant to be consistent and reliable, while still being customizable and exte
|
||||||
|
|
||||||
- Reliable, [ExoPlayer](https://exoplayer.dev/) based playback
|
- Reliable, [ExoPlayer](https://exoplayer.dev/) based playback
|
||||||
- Customizable UI & Behavior
|
- Customizable UI & Behavior
|
||||||
- Extensive Genres/Artists/Albums/Songs support
|
- Genres/Artists/Albums/Songs support
|
||||||
- Powerful queue system
|
- Extensive queue system
|
||||||
- Full playback persistence system
|
- Full playback persistence system
|
||||||
|
- Edge-to-edge (Oreo+ Only)
|
||||||
- Embedded covers support
|
- Embedded covers support
|
||||||
- Search Functionality
|
- Search Functionality
|
||||||
- Audio Focus / Headset Management
|
- Audio Focus / Headset Management
|
||||||
- No internet connectivity whatsoever
|
- No internet connectivity whatsoever
|
||||||
- Kotlin from the ground-up
|
- Kotlin from the ground-up
|
||||||
- Modular, feature-based architecture
|
- Modular, feature-based architecture
|
||||||
- No rounded corners (The way god intended)
|
- No rounded corners
|
||||||
|
|
||||||
## To Come in the future:
|
## To Come in the future:
|
||||||
|
|
||||||
|
|
|
@ -9,14 +9,14 @@
|
||||||
|
|
||||||
<queries />
|
<queries />
|
||||||
|
|
||||||
<!-- TODO: Backup -->
|
|
||||||
<application
|
<application
|
||||||
android:icon="@mipmap/ic_launcher"
|
android:icon="@mipmap/ic_launcher"
|
||||||
android:label="@string/app_name"
|
android:label="@string/app_name"
|
||||||
android:roundIcon="@mipmap/ic_launcher_round"
|
android:roundIcon="@mipmap/ic_launcher_round"
|
||||||
android:supportsRtl="true"
|
android:supportsRtl="true"
|
||||||
|
android:allowBackup="true"
|
||||||
android:theme="@style/Theme.Base"
|
android:theme="@style/Theme.Base"
|
||||||
tools:ignore="AllowBackup">
|
android:fullBackupContent="@xml/backup_descriptor">
|
||||||
<activity
|
<activity
|
||||||
android:name=".MainActivity"
|
android:name=".MainActivity"
|
||||||
android:launchMode="singleInstance"
|
android:launchMode="singleInstance"
|
||||||
|
|
|
@ -41,6 +41,7 @@ import org.oxycblt.auxio.ui.setupSongActions
|
||||||
* search functionality.
|
* search functionality.
|
||||||
* TODO: Move search to separate tab?
|
* TODO: Move search to separate tab?
|
||||||
* FIXME: Leak when navving from search
|
* FIXME: Leak when navving from search
|
||||||
|
* FIXME: Leak on older versions
|
||||||
*/
|
*/
|
||||||
class LibraryFragment : Fragment(), SearchView.OnQueryTextListener {
|
class LibraryFragment : Fragment(), SearchView.OnQueryTextListener {
|
||||||
|
|
||||||
|
|
|
@ -19,16 +19,15 @@ import org.oxycblt.auxio.music.Song
|
||||||
* **Do not use this on the UI elements, instead use the Binding Adapters.**
|
* **Do not use this on the UI elements, instead use the Binding Adapters.**
|
||||||
* @param context [Context] required
|
* @param context [Context] required
|
||||||
* @param song Song to load the cover for
|
* @param song Song to load the cover for
|
||||||
* @param onDone What to do with the bitmap when the loading is finished.
|
* @param onDone What to do with the bitmap when the loading is finished. Bitmap will be null if loading failed.
|
||||||
*/
|
*/
|
||||||
fun getBitmap(context: Context, song: Song, onDone: (Bitmap) -> Unit) {
|
fun getBitmap(context: Context, song: Song, onDone: (Bitmap?) -> Unit) {
|
||||||
Coil.enqueue(
|
val request = ImageRequest.Builder(context)
|
||||||
ImageRequest.Builder(context)
|
.data(song.album.coverUri)
|
||||||
.data(song.album.coverUri)
|
.target(onError = { onDone(null) }, onSuccess = { onDone(it.toBitmap()) })
|
||||||
.error(R.drawable.ic_song)
|
.build()
|
||||||
.target { onDone(it.toBitmap()) }
|
|
||||||
.build()
|
Coil.imageLoader(context).enqueue(request)
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// --- BINDING ADAPTERS ---
|
// --- BINDING ADAPTERS ---
|
||||||
|
|
|
@ -97,9 +97,9 @@ fun NotificationCompat.Builder.setMetadata(
|
||||||
song.album.artist.name,
|
song.album.artist.name,
|
||||||
)
|
)
|
||||||
|
|
||||||
// On older versions of android [API <26], show the song's album on the subtext instead of
|
// On older versions of android [API <24], show the song's album on the subtext instead of
|
||||||
// the current mode, as that makes more sense for the old style of media notifications.
|
// the current mode, as that makes more sense for the old style of media notifications.
|
||||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
|
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
|
||||||
setSubText(song.album.name)
|
setSubText(song.album.name)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -145,7 +145,7 @@ fun NotificationCompat.Builder.updateExtraAction(context: Context, useAltAction:
|
||||||
* @param context The context required to get the strings required to show certain modes
|
* @param context The context required to get the strings required to show certain modes
|
||||||
*/
|
*/
|
||||||
fun NotificationCompat.Builder.updateMode(context: Context) {
|
fun NotificationCompat.Builder.updateMode(context: Context) {
|
||||||
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.O) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
|
||||||
val playbackManager = PlaybackStateManager.getInstance()
|
val playbackManager = PlaybackStateManager.getInstance()
|
||||||
|
|
||||||
// If playing from all songs, set the subtext as that, otherwise the currently played parent.
|
// If playing from all songs, set the subtext as that, otherwise the currently played parent.
|
||||||
|
|
|
@ -237,7 +237,7 @@ class PlaybackService : Service(), Player.EventListener, PlaybackStateManager.Ca
|
||||||
|
|
||||||
uploadMetadataToSession(it)
|
uploadMetadataToSession(it)
|
||||||
|
|
||||||
notification.setMetadata(this, playbackManager.song!!, settingsManager.colorizeNotif) {
|
notification.setMetadata(this, it, settingsManager.colorizeNotif) {
|
||||||
startForegroundOrNotify("Song")
|
startForegroundOrNotify("Song")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -152,12 +152,7 @@ class NoLeakThumbView @JvmOverloads constructor(
|
||||||
) {
|
) {
|
||||||
val thumbTargetY = indicatorCenterY.toFloat() - (thumbView.measuredHeight / 2)
|
val thumbTargetY = indicatorCenterY.toFloat() - (thumbView.measuredHeight / 2)
|
||||||
|
|
||||||
// Don't animate if the view is invisible.
|
thumbAnimation.animateToFinalPosition(thumbTargetY)
|
||||||
if (!isActivated || !isVisible) {
|
|
||||||
y = thumbTargetY
|
|
||||||
} else {
|
|
||||||
thumbAnimation.animateToFinalPosition(thumbTargetY)
|
|
||||||
}
|
|
||||||
|
|
||||||
when (indicator) {
|
when (indicator) {
|
||||||
is FastScrollItemIndicator.Text -> {
|
is FastScrollItemIndicator.Text -> {
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
package org.oxycblt.auxio.songs
|
package org.oxycblt.auxio.songs
|
||||||
|
|
||||||
|
import android.content.res.ColorStateList
|
||||||
|
import android.os.Build
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.util.TypedValue
|
import android.util.TypedValue
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
|
@ -18,8 +20,10 @@ import org.oxycblt.auxio.logD
|
||||||
import org.oxycblt.auxio.music.MusicStore
|
import org.oxycblt.auxio.music.MusicStore
|
||||||
import org.oxycblt.auxio.playback.PlaybackViewModel
|
import org.oxycblt.auxio.playback.PlaybackViewModel
|
||||||
import org.oxycblt.auxio.settings.SettingsManager
|
import org.oxycblt.auxio.settings.SettingsManager
|
||||||
|
import org.oxycblt.auxio.ui.accent
|
||||||
import org.oxycblt.auxio.ui.isLandscape
|
import org.oxycblt.auxio.ui.isLandscape
|
||||||
import org.oxycblt.auxio.ui.setupSongActions
|
import org.oxycblt.auxio.ui.setupSongActions
|
||||||
|
import org.oxycblt.auxio.ui.toColor
|
||||||
import kotlin.math.ceil
|
import kotlin.math.ceil
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -105,6 +109,11 @@ class SongsFragment : Fragment() {
|
||||||
binding.songFastScroll.apply {
|
binding.songFastScroll.apply {
|
||||||
var concatInterval = -1
|
var concatInterval = -1
|
||||||
|
|
||||||
|
// API 22 and below don't support the state color, so just use the accent.
|
||||||
|
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.M) {
|
||||||
|
textColor = ColorStateList.valueOf(accent.first.toColor(requireContext()))
|
||||||
|
}
|
||||||
|
|
||||||
setupWithRecyclerView(
|
setupWithRecyclerView(
|
||||||
binding.songRecycler,
|
binding.songRecycler,
|
||||||
{ pos ->
|
{ pos ->
|
||||||
|
|
|
@ -2,10 +2,10 @@
|
||||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:width="24dp"
|
android:width="24dp"
|
||||||
android:height="24dp"
|
android:height="24dp"
|
||||||
android:tint="?attr/colorPrimary"
|
|
||||||
android:viewportWidth="24"
|
android:viewportWidth="24"
|
||||||
android:viewportHeight="24">
|
android:viewportHeight="24"
|
||||||
<path
|
android:tint="?attr/colorPrimary">
|
||||||
android:fillColor="@android:color/white"
|
<path
|
||||||
android:pathData="M6,19c0,1.1 0.9,2 2,2h8c1.1,0 2,-0.9 2,-2L18,7L6,7v12zM8,9h8v10L8,19L8,9zM15.5,4l-1,-1h-5l-1,1L5,4v2h14L19,4z" />
|
android:fillColor="@android:color/white"
|
||||||
|
android:pathData="M6,21h12L18,7L6,7v14zM8,9h8v10L8,19L8,9zM15.5,4l-1,-1h-5l-1,1L5,4v2h14L19,4h-3.5z"/>
|
||||||
</vector>
|
</vector>
|
5
app/src/main/res/values-v21/dimens.xml
Normal file
5
app/src/main/res/values-v21/dimens.xml
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<!-- FIXME: Use custom drawable for < API 23 -->
|
||||||
|
<dimen name="height_compact_progress">6dp</dimen>
|
||||||
|
</resources>
|
4
app/src/main/res/values-v23/dimens.xml
Normal file
4
app/src/main/res/values-v23/dimens.xml
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<dimen name="height_compact_progress">2dp</dimen>
|
||||||
|
</resources>
|
2
app/src/main/res/xml/backup_descriptor.xml
Normal file
2
app/src/main/res/xml/backup_descriptor.xml
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<full-backup-content/>
|
4
gradle/wrapper/gradle-wrapper.properties
vendored
4
gradle/wrapper/gradle-wrapper.properties
vendored
|
@ -1,6 +1,6 @@
|
||||||
#Mon Oct 12 13:43:13 MDT 2020
|
#Sat Dec 19 15:35:00 MST 2020
|
||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
zipStorePath=wrapper/dists
|
zipStorePath=wrapper/dists
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-all.zip
|
||||||
|
|
|
@ -8,7 +8,7 @@ All guidelines from the [Contribution Guidelines](../.github/CONTRIBUTING.md) st
|
||||||
|
|
||||||
## Bug Fixes, Optimizations, Library Updates, Formatting, etc.
|
## Bug Fixes, Optimizations, Library Updates, Formatting, etc.
|
||||||
|
|
||||||
These will likely be accepted/add as long as they do not cause too much harm to the app's architecture or UX.
|
These will likely be accepted/added as long as they do not cause too much harm to the app's architecture or UX.
|
||||||
|
|
||||||
## New Options/Customizations
|
## New Options/Customizations
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue