From d50d2f0b1e4157a9dc81b7a0d13fb77d3480d4dd Mon Sep 17 00:00:00 2001 From: OxygenCobalt Date: Sun, 1 Aug 2021 17:59:12 -0600 Subject: [PATCH] ui: fix binding issues Use viewLifecycleOwner for all fragments that rely on databinding. This should solve some possible memory leaks, as viewLifecycleOwner is tied to the lifecycle of the fragment views instead of the fragments them selves. --- app/src/main/AndroidManifest.xml | 2 +- app/src/main/java/org/oxycblt/auxio/MainFragment.kt | 2 +- .../java/org/oxycblt/auxio/detail/AlbumDetailFragment.kt | 2 +- .../java/org/oxycblt/auxio/detail/ArtistDetailFragment.kt | 2 +- .../java/org/oxycblt/auxio/detail/GenreDetailFragment.kt | 2 +- .../java/org/oxycblt/auxio/library/LibraryFragment.kt | 2 ++ .../java/org/oxycblt/auxio/loading/LoadingFragment.kt | 1 + .../org/oxycblt/auxio/playback/queue/QueueFragment.kt | 2 ++ .../org/oxycblt/auxio/playback/system/PlaybackService.kt | 4 ++-- .../main/java/org/oxycblt/auxio/search/SearchFragment.kt | 2 ++ .../org/oxycblt/auxio/{widget => widgets}/BaseWidget.kt | 5 ++--- .../auxio/{widget => widgets}/MinimalWidgetProvider.kt | 8 ++++---- 12 files changed, 20 insertions(+), 14 deletions(-) rename app/src/main/java/org/oxycblt/auxio/{widget => widgets}/BaseWidget.kt (97%) rename app/src/main/java/org/oxycblt/auxio/{widget => widgets}/MinimalWidgetProvider.kt (94%) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 13dc201eb..55ad8f890 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -57,7 +57,7 @@ android:roundIcon="@mipmap/ic_launcher_round" /> diff --git a/app/src/main/java/org/oxycblt/auxio/MainFragment.kt b/app/src/main/java/org/oxycblt/auxio/MainFragment.kt index f7b4d4f1b..4322f6057 100644 --- a/app/src/main/java/org/oxycblt/auxio/MainFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/MainFragment.kt @@ -57,7 +57,7 @@ class MainFragment : Fragment() { // --- UI SETUP --- - binding.lifecycleOwner = this + binding.lifecycleOwner = viewLifecycleOwner // Speed up the slide-in effect on the controls view, solely to improve the UX // and maybe hide the problem where the main view will snap-shrink before the compact diff --git a/app/src/main/java/org/oxycblt/auxio/detail/AlbumDetailFragment.kt b/app/src/main/java/org/oxycblt/auxio/detail/AlbumDetailFragment.kt index d51887ab8..c65d0c087 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/AlbumDetailFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/AlbumDetailFragment.kt @@ -53,7 +53,7 @@ class AlbumDetailFragment : DetailFragment() { // --- UI SETUP --- - binding.lifecycleOwner = this + binding.lifecycleOwner = viewLifecycleOwner setupToolbar(R.menu.menu_album_detail) { itemId -> if (itemId == R.id.action_queue_add) { diff --git a/app/src/main/java/org/oxycblt/auxio/detail/ArtistDetailFragment.kt b/app/src/main/java/org/oxycblt/auxio/detail/ArtistDetailFragment.kt index 339d30a3f..5b7b9e2aa 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/ArtistDetailFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/ArtistDetailFragment.kt @@ -65,7 +65,7 @@ class ArtistDetailFragment : DetailFragment() { // --- UI SETUP --- - binding.lifecycleOwner = this + binding.lifecycleOwner = viewLifecycleOwner setupToolbar() setupRecycler(detailAdapter) { pos -> diff --git a/app/src/main/java/org/oxycblt/auxio/detail/GenreDetailFragment.kt b/app/src/main/java/org/oxycblt/auxio/detail/GenreDetailFragment.kt index cf1ee9355..bd73c721c 100644 --- a/app/src/main/java/org/oxycblt/auxio/detail/GenreDetailFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/detail/GenreDetailFragment.kt @@ -53,7 +53,7 @@ class GenreDetailFragment : DetailFragment() { // --- UI SETUP --- - binding.lifecycleOwner = this + binding.lifecycleOwner = viewLifecycleOwner setupToolbar() setupRecycler(detailAdapter) { pos -> diff --git a/app/src/main/java/org/oxycblt/auxio/library/LibraryFragment.kt b/app/src/main/java/org/oxycblt/auxio/library/LibraryFragment.kt index 2f0795b8d..7dfe6e7f3 100644 --- a/app/src/main/java/org/oxycblt/auxio/library/LibraryFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/library/LibraryFragment.kt @@ -43,6 +43,8 @@ class LibraryFragment : Fragment() { // --- UI SETUP --- + binding.lifecycleOwner = viewLifecycleOwner + binding.libraryToolbar.apply { menu.findItem(libraryModel.sortMode.toMenuId()).isChecked = true diff --git a/app/src/main/java/org/oxycblt/auxio/loading/LoadingFragment.kt b/app/src/main/java/org/oxycblt/auxio/loading/LoadingFragment.kt index 55566655f..ff2e47bc4 100644 --- a/app/src/main/java/org/oxycblt/auxio/loading/LoadingFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/loading/LoadingFragment.kt @@ -37,6 +37,7 @@ class LoadingFragment : Fragment() { // --- UI SETUP --- + binding.lifecycleOwner = viewLifecycleOwner binding.loadingModel = loadingModel // --- VIEWMODEL SETUP --- diff --git a/app/src/main/java/org/oxycblt/auxio/playback/queue/QueueFragment.kt b/app/src/main/java/org/oxycblt/auxio/playback/queue/QueueFragment.kt index f8bd096d4..e2c2f612a 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/queue/QueueFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/queue/QueueFragment.kt @@ -44,6 +44,8 @@ class QueueFragment : Fragment() { // --- UI SETUP --- + binding.lifecycleOwner = viewLifecycleOwner + binding.queueToolbar.setNavigationOnClickListener { findNavController().navigateUp() } 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 280aa00c2..f2578cd19 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 @@ -42,8 +42,8 @@ import org.oxycblt.auxio.playback.state.LoopMode import org.oxycblt.auxio.playback.state.PlaybackStateManager import org.oxycblt.auxio.settings.SettingsManager import org.oxycblt.auxio.ui.getSystemServiceSafe -import org.oxycblt.auxio.widget.BaseWidget -import org.oxycblt.auxio.widget.MinimalWidgetProvider +import org.oxycblt.auxio.widgets.BaseWidget +import org.oxycblt.auxio.widgets.MinimalWidgetProvider /** * A service that manages the system-side aspects of playback, such as: diff --git a/app/src/main/java/org/oxycblt/auxio/search/SearchFragment.kt b/app/src/main/java/org/oxycblt/auxio/search/SearchFragment.kt index dcb60d736..73df3fc72 100644 --- a/app/src/main/java/org/oxycblt/auxio/search/SearchFragment.kt +++ b/app/src/main/java/org/oxycblt/auxio/search/SearchFragment.kt @@ -51,6 +51,8 @@ class SearchFragment : Fragment() { // --- UI SETUP -- + binding.lifecycleOwner = viewLifecycleOwner + binding.searchToolbar.apply { menu.findItem(searchModel.filterMode.toId()).isChecked = true diff --git a/app/src/main/java/org/oxycblt/auxio/widget/BaseWidget.kt b/app/src/main/java/org/oxycblt/auxio/widgets/BaseWidget.kt similarity index 97% rename from app/src/main/java/org/oxycblt/auxio/widget/BaseWidget.kt rename to app/src/main/java/org/oxycblt/auxio/widgets/BaseWidget.kt index c9f935331..fcef93b56 100644 --- a/app/src/main/java/org/oxycblt/auxio/widget/BaseWidget.kt +++ b/app/src/main/java/org/oxycblt/auxio/widgets/BaseWidget.kt @@ -1,4 +1,4 @@ -package org.oxycblt.auxio.widget +package org.oxycblt.auxio.widgets import android.app.PendingIntent import android.appwidget.AppWidgetManager @@ -11,7 +11,6 @@ import android.widget.RemoteViews import androidx.annotation.LayoutRes import org.oxycblt.auxio.BuildConfig import org.oxycblt.auxio.MainActivity -import org.oxycblt.auxio.R import org.oxycblt.auxio.logD import org.oxycblt.auxio.playback.state.PlaybackStateManager @@ -96,7 +95,7 @@ abstract class BaseWidget : AppWidgetProvider() { val ids = getAppWidgetIds(ComponentName(context, this::class.java)) if (ids.isNotEmpty()) { - // Existing widgets found, update thoughs + // Existing widgets found, update those ids.forEach { id -> updateAppWidget(id, views) } diff --git a/app/src/main/java/org/oxycblt/auxio/widget/MinimalWidgetProvider.kt b/app/src/main/java/org/oxycblt/auxio/widgets/MinimalWidgetProvider.kt similarity index 94% rename from app/src/main/java/org/oxycblt/auxio/widget/MinimalWidgetProvider.kt rename to app/src/main/java/org/oxycblt/auxio/widgets/MinimalWidgetProvider.kt index 967f1d36a..30c010eee 100644 --- a/app/src/main/java/org/oxycblt/auxio/widget/MinimalWidgetProvider.kt +++ b/app/src/main/java/org/oxycblt/auxio/widgets/MinimalWidgetProvider.kt @@ -1,4 +1,4 @@ -package org.oxycblt.auxio.widget +package org.oxycblt.auxio.widgets import android.content.Context import android.os.Build @@ -9,9 +9,6 @@ import org.oxycblt.auxio.coil.loadBitmap import org.oxycblt.auxio.logD import org.oxycblt.auxio.playback.state.PlaybackStateManager -// Workaround to make studio shut up about perfectly valid layouts somehow -// being invalid for remote views. - /** * The minimal widget. This widget only shows the album, song name, and artist without any * controls. Because you know. Minimalism. @@ -67,6 +64,9 @@ class MinimalWidgetProvider : BaseWidget() { companion object { const val TYPE = 0xA0D0 + + // Workaround to make studio shut up about perfectly valid layouts somehow + // being invalid for remote views. const val LAYOUT = R.layout.widget_minimal fun new(): MinimalWidgetProvider? {