diff --git a/app/build.gradle b/app/build.gradle index 12034dc60..0223d497a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -94,7 +94,7 @@ dependencies { // --- THIRD PARTY --- // ExoPlayer - implementation "com.google.android.exoplayer:exoplayer-core:2.15.1" + implementation "com.google.android.exoplayer:exoplayer-core:2.16.0" // Image loading implementation 'io.coil-kt:coil:1.4.0' @@ -105,7 +105,7 @@ dependencies { // --- DEBUG --- // Lint - ktlint 'com.pinterest:ktlint:0.42.1' + ktlint 'com.pinterest:ktlint:0.43.0' } task ktlint(type: JavaExec, group: "verification") { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index becb161fe..c250ca448 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -20,7 +20,7 @@ android:fullBackupContent="@xml/backup_descriptor" android:icon="@mipmap/ic_launcher" android:label="@string/info_app_name" - android:roundIcon="@mipmap/ic_launcher_round" + android:roundIcon="@mipmap/ic_launcher" android:supportsRtl="true" android:theme="@style/Theme.Auxio.App"> @@ -29,7 +29,7 @@ android:exported="true" android:icon="@mipmap/ic_launcher" android:launchMode="singleTask" - android:roundIcon="@mipmap/ic_launcher_round" + android:roundIcon="@mipmap/ic_launcher" android:windowSoftInputMode="adjustPan"> @@ -54,7 +54,7 @@ android:name=".playback.system.PlaybackService" android:foregroundServiceType="mediaPlayback" android:icon="@mipmap/ic_launcher" - android:roundIcon="@mipmap/ic_launcher_round" /> + android:roundIcon="@mipmap/ic_launcher" /> { if (tracks == null || tracks.isEmpty) { // Unrecognized format. This is expected, as ExoPlayer only supports a - // subset of formats. + // subset of formats. return null } diff --git a/app/src/main/java/org/oxycblt/auxio/coil/MosaicFetcher.kt b/app/src/main/java/org/oxycblt/auxio/coil/MosaicFetcher.kt index aad2264ff..da27f041b 100644 --- a/app/src/main/java/org/oxycblt/auxio/coil/MosaicFetcher.kt +++ b/app/src/main/java/org/oxycblt/auxio/coil/MosaicFetcher.kt @@ -36,7 +36,6 @@ import org.oxycblt.auxio.music.Album import org.oxycblt.auxio.music.Artist import org.oxycblt.auxio.music.Genre import org.oxycblt.auxio.music.MusicParent -import java.io.Closeable import java.lang.Exception /** @@ -139,13 +138,6 @@ class MosaicFetcher(private val context: Context) : Fetcher { return mosaicBitmap } - /** - * Iterate through a list of [Closeable]s, running [block] on each and closing it when done. - */ - private fun List.useForEach(block: (T) -> Unit) { - forEach { it.use(block) } - } - override fun key(data: MusicParent): String = data.hashCode().toString() override fun handles(data: MusicParent) = data !is Album // Albums are not used here diff --git a/app/src/main/java/org/oxycblt/auxio/detail/DetailFragment.kt b/app/src/main/java/org/oxycblt/auxio/detail/DetailFragment.kt index 070c95eae..2c7bef056 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/DetailFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/DetailFragment.kt @@ -76,12 +76,12 @@ abstract class DetailFragment : Fragment() { * @param onMenuClick (Optional) a click listener for that menu */ protected fun setupToolbar( - data: Music, + music: Music, @MenuRes menu: Int = -1, onMenuClick: ((itemId: Int) -> Boolean)? = null ) { binding.detailToolbar.apply { - title = data.name + title = music.name if (menu != -1) { inflateMenu(menu) diff --git a/app/src/main/java/org/oxycblt/auxio/home/fastscroll/FastScrollRecyclerView.kt b/app/src/main/java/org/oxycblt/auxio/home/fastscroll/FastScrollRecyclerView.kt index e4d89e5d2..467f0798d 100644 --- a/app/src/main/java/org/oxycblt/auxio/home/fastscroll/FastScrollRecyclerView.kt +++ b/app/src/main/java/org/oxycblt/auxio/home/fastscroll/FastScrollRecyclerView.kt @@ -47,7 +47,7 @@ import kotlin.math.abs /** * A [RecyclerView] that enables better fast-scrolling. This is fundamentally a implementation of - * Zhanghi's AndroidFastScroll but slimmed down for Auxio and with a couple of enhancements. + * Hai Zhang's AndroidFastScroll but slimmed down for Auxio and with a couple of enhancements. * * Attributions as per the Apache 2.0 license: * ORIGINAL AUTHOR: Hai Zhang [https://github.com/zhanghai] diff --git a/app/src/main/java/org/oxycblt/auxio/music/MusicStore.kt b/app/src/main/java/org/oxycblt/auxio/music/MusicStore.kt index f1e5c6680..8f417035f 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/MusicStore.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/MusicStore.kt @@ -33,7 +33,9 @@ import org.oxycblt.auxio.util.logE import java.lang.Exception /** - * The main storage for music items. Use [MusicStore.getInstance] to get the single instance of it. + * The main storage for music items. + * Getting an instance of this object is more complicated as it loads asynchronously. + * See the companion object for more. * @author OxygenCobalt */ class MusicStore private constructor() { @@ -194,7 +196,8 @@ class MusicStore private constructor() { } /** - * Maybe get a MusicStore instance. + * Maybe get a MusicStore instance. This is useful if you are running code while the + * loading process may still be going on. * * @return null if the music store instance is still loading or if the loading process has * encountered an error. An instance is returned otherwise. diff --git a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackBarLayout.kt b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackBarLayout.kt index 599d721ed..1ce4bb516 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackBarLayout.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackBarLayout.kt @@ -246,7 +246,7 @@ class PlaybackBarLayout @JvmOverloads constructor( } /** - * Update the playback positon on this layout. This will be reflected in the compact view + * Update the playback position on this layout. This will be reflected in the compact view * at the bottom of the screen. */ fun setPosition(position: Long) { diff --git a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackFragment.kt b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackFragment.kt index d0d2696ee..9c72bd6ed 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackFragment.kt @@ -60,7 +60,7 @@ class PlaybackFragment : Fragment() { binding.playbackModel = playbackModel binding.detailModel = detailModel - binding.root.setOnApplyWindowInsetsListener { v, insets -> + binding.root.setOnApplyWindowInsetsListener { _, insets -> val bars = insets.systemBarsCompat binding.root.updatePadding( diff --git a/app/src/main/java/org/oxycblt/auxio/playback/system/AudioReactor.kt b/app/src/main/java/org/oxycblt/auxio/playback/system/AudioReactor.kt index 24d0d9fda..2832afae1 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/system/AudioReactor.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/system/AudioReactor.kt @@ -22,7 +22,7 @@ import android.content.Context import android.media.AudioManager import androidx.media.AudioFocusRequestCompat import androidx.media.AudioManagerCompat -import com.google.android.exoplayer2.SimpleExoPlayer +import com.google.android.exoplayer2.ExoPlayer import org.oxycblt.auxio.playback.state.PlaybackStateManager import org.oxycblt.auxio.settings.SettingsManager import org.oxycblt.auxio.util.getSystemServiceSafe @@ -35,7 +35,7 @@ import org.oxycblt.auxio.util.logD */ class AudioReactor( context: Context, - private val player: SimpleExoPlayer + private val player: ExoPlayer ) : AudioManager.OnAudioFocusChangeListener { private val playbackManager = PlaybackStateManager.maybeGetInstance() private val settingsManager = SettingsManager.getInstance() diff --git a/app/src/main/java/org/oxycblt/auxio/playback/system/PlaybackService.kt b/app/src/main/java/org/oxycblt/auxio/playback/system/PlaybackService.kt index cf096494b..02e23b509 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/system/PlaybackService.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/system/PlaybackService.kt @@ -32,11 +32,11 @@ import android.os.IBinder import android.os.PowerManager import android.support.v4.media.session.MediaSessionCompat import com.google.android.exoplayer2.C +import com.google.android.exoplayer2.ExoPlayer import com.google.android.exoplayer2.MediaItem import com.google.android.exoplayer2.PlaybackException import com.google.android.exoplayer2.Player import com.google.android.exoplayer2.RenderersFactory -import com.google.android.exoplayer2.SimpleExoPlayer import com.google.android.exoplayer2.audio.AudioAttributes import com.google.android.exoplayer2.audio.MediaCodecAudioRenderer import com.google.android.exoplayer2.extractor.DefaultExtractorsFactory @@ -65,7 +65,7 @@ import org.oxycblt.auxio.widgets.WidgetProvider /** * A service that manages the system-side aspects of playback, such as: - * - The single [SimpleExoPlayer] instance. + * - The single [ExoPlayer] instance. * - The Media Notification * - Headset management * - Widgets @@ -77,7 +77,7 @@ import org.oxycblt.auxio.widgets.WidgetProvider class PlaybackService : Service(), Player.Listener, PlaybackStateManager.Callback, SettingsManager.Callback { // Player components - private lateinit var player: SimpleExoPlayer + private lateinit var player: ExoPlayer private lateinit var mediaSession: MediaSessionCompat private lateinit var connector: PlaybackSessionConnector @@ -341,9 +341,9 @@ class PlaybackService : Service(), Player.Listener, PlaybackStateManager.Callbac // --- OTHER FUNCTIONS --- /** - * Create the [SimpleExoPlayer] instance. + * Create the [ExoPlayer] instance. */ - private fun newPlayer(): SimpleExoPlayer { + private fun newPlayer(): ExoPlayer { // Since Auxio is a music player, only specify an audio renderer to save // battery/apk size/cache size val audioRenderer = RenderersFactory { handler, _, audioListener, _, _ -> @@ -355,7 +355,7 @@ class PlaybackService : Service(), Player.Listener, PlaybackStateManager.Callbac // Enable constant bitrate seeking so that certain MP3s/AACs are seekable val extractorsFactory = DefaultExtractorsFactory().setConstantBitrateSeekingEnabled(true) - return SimpleExoPlayer.Builder(this, audioRenderer) + return ExoPlayer.Builder(this, audioRenderer) .setMediaSourceFactory(DefaultMediaSourceFactory(this, extractorsFactory)) .build() } diff --git a/app/src/main/java/org/oxycblt/auxio/settings/AboutFragment.kt b/app/src/main/java/org/oxycblt/auxio/settings/AboutFragment.kt index a1223473f..c0dab74a1 100644 --- a/app/src/main/java/org/oxycblt/auxio/settings/AboutFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/settings/AboutFragment.kt @@ -54,7 +54,7 @@ class AboutFragment : Fragment() { ): View { val binding = FragmentAboutBinding.inflate(layoutInflater) - binding.aboutContents.setOnApplyWindowInsetsListener { v, insets -> + binding.aboutContents.setOnApplyWindowInsetsListener { _, insets -> binding.aboutContents.updatePadding(bottom = insets.systemBarsCompat.bottom) insets } diff --git a/app/src/main/java/org/oxycblt/auxio/settings/SettingsListFragment.kt b/app/src/main/java/org/oxycblt/auxio/settings/SettingsListFragment.kt index 3c1574da5..6eedf6157 100644 --- a/app/src/main/java/org/oxycblt/auxio/settings/SettingsListFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/settings/SettingsListFragment.kt @@ -65,7 +65,7 @@ class SettingsListFragment : PreferenceFragmentCompat() { view.findViewById(androidx.preference.R.id.recycler_view).apply { clipToPadding = false - setOnApplyWindowInsetsListener { v, insets -> + setOnApplyWindowInsetsListener { _, insets -> updatePadding(bottom = insets.systemBarsCompat.bottom) insets diff --git a/app/src/main/java/org/oxycblt/auxio/ui/ActionMenu.kt b/app/src/main/java/org/oxycblt/auxio/ui/ActionMenu.kt index d132f1414..b7251abb8 100644 --- a/app/src/main/java/org/oxycblt/auxio/ui/ActionMenu.kt +++ b/app/src/main/java/org/oxycblt/auxio/ui/ActionMenu.kt @@ -65,11 +65,11 @@ class ActionMenu( // Get viewmodels using the activity as the store owner private val detailModel: DetailViewModel by lazy { - ViewModelProvider(activity).get(DetailViewModel::class.java) + ViewModelProvider(activity)[DetailViewModel::class.java] } private val playbackModel: PlaybackViewModel by lazy { - ViewModelProvider(activity).get(PlaybackViewModel::class.java) + ViewModelProvider(activity)[PlaybackViewModel::class.java] } init { diff --git a/app/src/main/java/org/oxycblt/auxio/ui/MemberBinder.kt b/app/src/main/java/org/oxycblt/auxio/ui/MemberBinder.kt index e7b2e0ffe..b460b7290 100644 --- a/app/src/main/java/org/oxycblt/auxio/ui/MemberBinder.kt +++ b/app/src/main/java/org/oxycblt/auxio/ui/MemberBinder.kt @@ -23,9 +23,9 @@ import androidx.databinding.ViewDataBinding import androidx.fragment.app.Fragment import androidx.lifecycle.DefaultLifecycleObserver import androidx.lifecycle.Lifecycle +import androidx.lifecycle.LifecycleEventObserver import androidx.lifecycle.LifecycleObserver import androidx.lifecycle.LifecycleOwner -import androidx.lifecycle.OnLifecycleEvent import org.oxycblt.auxio.util.assertMainThread import org.oxycblt.auxio.util.inflater import kotlin.properties.ReadOnlyProperty @@ -51,7 +51,7 @@ class MemberBinder( private val fragment: Fragment, private val inflate: (LayoutInflater) -> T, private val onDestroy: T.() -> Unit -) : ReadOnlyProperty, LifecycleObserver { +) : ReadOnlyProperty, LifecycleObserver, LifecycleEventObserver { private var fragmentBinding: T? = null init { @@ -82,6 +82,13 @@ class MemberBinder( } } + override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) { + if (event == Lifecycle.Event.ON_DESTROY) { + fragmentBinding?.onDestroy() + fragmentBinding = null + } + } + private inline fun Fragment.observeOwnerThroughCreation( crossinline viewOwner: LifecycleOwner.() -> Unit ) { @@ -95,11 +102,4 @@ class MemberBinder( } }) } - - @Suppress("UNUSED") - @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY) - fun destroy() { - fragmentBinding?.onDestroy() - fragmentBinding = null - } } diff --git a/app/src/main/java/org/oxycblt/auxio/util/ViewUtil.kt b/app/src/main/java/org/oxycblt/auxio/util/ViewUtil.kt index 134f19ed1..c8c6fd171 100644 --- a/app/src/main/java/org/oxycblt/auxio/util/ViewUtil.kt +++ b/app/src/main/java/org/oxycblt/auxio/util/ViewUtil.kt @@ -35,7 +35,6 @@ import androidx.core.content.ContextCompat import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.RecyclerView import com.google.android.material.shape.MaterialShapeDrawable -import org.oxycblt.auxio.R /** * Apply a [MaterialShapeDrawable] to this view, automatically initializing the elevation overlay 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 8f65f143f..e68ae2d37 100644 --- a/app/src/main/java/org/oxycblt/auxio/widgets/WidgetProvider.kt +++ b/app/src/main/java/org/oxycblt/auxio/widgets/WidgetProvider.kt @@ -152,8 +152,6 @@ class WidgetProvider : AppWidgetProvider() { // We can't resize the widget until we can generate the views, so request an update // from PlaybackService. requestUpdate(context) - } else { - logD(newOptions?.getParcelableArrayList(AppWidgetManager.OPTION_APPWIDGET_SIZES) ?: "nothing") } } diff --git a/app/src/main/res/drawable/ui_circle_ripple.xml b/app/src/main/res/drawable/ui_accent_circle.xml similarity index 89% rename from app/src/main/res/drawable/ui_circle_ripple.xml rename to app/src/main/res/drawable/ui_accent_circle.xml index 0d814703a..a00dfee1d 100644 --- a/app/src/main/res/drawable/ui_circle_ripple.xml +++ b/app/src/main/res/drawable/ui_accent_circle.xml @@ -1,6 +1,6 @@ + android:color="?attr/colorSurface"> - - - - - - - - - - - diff --git a/app/src/main/res/drawable/ui_header_dividers.xml b/app/src/main/res/drawable/ui_header_dividers.xml deleted file mode 100644 index 0ce36b4d7..000000000 --- a/app/src/main/res/drawable/ui_header_dividers.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - diff --git a/app/src/main/res/drawable/ui_play_pause_circle.xml b/app/src/main/res/drawable/ui_play_pause_circle.xml new file mode 100644 index 000000000..023794af1 --- /dev/null +++ b/app/src/main/res/drawable/ui_play_pause_circle.xml @@ -0,0 +1,12 @@ + + + + + + + + + diff --git a/app/src/main/res/drawable/ui_scroll_track.xml b/app/src/main/res/drawable/ui_scroll_track.xml deleted file mode 100644 index 529f04b02..000000000 --- a/app/src/main/res/drawable/ui_scroll_track.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/item_accent.xml b/app/src/main/res/layout/item_accent.xml index c703cbe06..71d8c1db4 100644 --- a/app/src/main/res/layout/item_accent.xml +++ b/app/src/main/res/layout/item_accent.xml @@ -15,7 +15,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" - android:background="@drawable/ui_circle_ripple" + android:background="@drawable/ui_accent_circle" android:padding="@dimen/spacing_medium" android:scaleType="fitCenter" android:src="@drawable/ic_check" diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml deleted file mode 100644 index bbd3e0212..000000000 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png deleted file mode 100644 index ac6e8b931..000000000 Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png and /dev/null differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png deleted file mode 100644 index 98241685f..000000000 Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png deleted file mode 100644 index e5636ef85..000000000 Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png deleted file mode 100644 index 8a9b23ca6..000000000 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png and /dev/null differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png deleted file mode 100644 index 59c807ec7..000000000 Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png and /dev/null differ diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 2c1236f86..0f3f1d450 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -1,5 +1,5 @@ - + Musikwiedergabe @@ -79,7 +79,7 @@ Wenn ein Lied ausgewählt wird Zufällig-Einstellung merken Zufällig anlassen, wenn ein neues Lied abgespielt wird - Zurückspulen bevor zurück gegangen wird + Zurückspulen bevor zurück gegangen wird Zurückspulen bevor zum vorheriger Lied gegangen wird Inhalt diff --git a/app/src/main/res/values-night/colors.xml b/app/src/main/res/values-night/colors.xml index 0119bf1c2..28ab22489 100644 --- a/app/src/main/res/values-night/colors.xml +++ b/app/src/main/res/values-night/colors.xml @@ -2,7 +2,6 @@ @color/surface_night @color/surface_day - #ffffff #01151515 #fafafa @color/surface_night - #202020 #01fafafa #fafafa diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index fec2eef1b..701e863b1 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -10,7 +10,6 @@ 48dp - 56dp 64dp 48dp @@ -18,7 +17,6 @@ 128dp 256dp - 1dp 2dp 20dp diff --git a/app/src/main/res/values/styles_ui.xml b/app/src/main/res/values/styles_ui.xml index ca99d2f11..b157bdeb1 100644 --- a/app/src/main/res/values/styles_ui.xml +++ b/app/src/main/res/values/styles_ui.xml @@ -165,7 +165,7 @@ - - - - -