From a13c498d00c5af17a8d749eedf5dbc3be3883423 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Thu, 2 Mar 2023 18:42:36 +0200 Subject: [PATCH] Fix ThemeChooserPreference memory leak --- .../kotatsu/settings/utils/ThemeChooserPreference.kt | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/utils/ThemeChooserPreference.kt b/app/src/main/java/org/koitharu/kotatsu/settings/utils/ThemeChooserPreference.kt index 2775014b0..d2ef58f50 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/utils/ThemeChooserPreference.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/utils/ThemeChooserPreference.kt @@ -19,6 +19,7 @@ import androidx.preference.PreferenceViewHolder import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.prefs.ColorScheme import org.koitharu.kotatsu.databinding.ItemColorSchemeBinding +import java.lang.ref.WeakReference class ThemeChooserPreference @JvmOverloads constructor( context: Context, @@ -68,7 +69,7 @@ class ThemeChooserPreference @JvmOverloads constructor( } scrollView.viewTreeObserver.run { scrollPersistListener?.let { removeOnScrollChangedListener(it) } - scrollPersistListener = ScrollPersistListener(scrollView, lastScrollPosition) + scrollPersistListener = ScrollPersistListener(WeakReference(scrollView), lastScrollPosition) addOnScrollChangedListener(scrollPersistListener) } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { @@ -106,7 +107,6 @@ class ThemeChooserPreference @JvmOverloads constructor( } super.onRestoreInstanceState(state.superState) lastScrollPosition[0] = state.scrollPosition - // notifyChanged() } private fun setValueInternal(enumName: String, notifyChanged: Boolean) { @@ -152,11 +152,12 @@ class ThemeChooserPreference @JvmOverloads constructor( } private class ScrollPersistListener( - private val scrollView: HorizontalScrollView, + private val scrollViewRef: WeakReference, private val lastScrollPosition: IntArray, ) : ViewTreeObserver.OnScrollChangedListener { override fun onScrollChanged() { + val scrollView = scrollViewRef.get() ?: return lastScrollPosition[0] = scrollView.scrollX } }