From 497452c01c6b4c79a3f599f6b8bf68bd517cee94 Mon Sep 17 00:00:00 2001 From: casey langen Date: Thu, 14 Feb 2019 23:13:28 -0800 Subject: [PATCH] Start observing only after animations complete. --- .../ui/albums/fragment/AlbumBrowseFragment.kt | 18 ++++++------- .../fragment/CategoryBrowseFragment.kt | 11 +++----- .../remote/ui/shared/fragment/BaseFragment.kt | 25 ++++++++++++++++++- .../ui/shared/model/BaseSlidingWindow.kt | 2 +- .../ui/tracks/fragment/TrackListFragment.kt | 6 ++--- 5 files changed, 40 insertions(+), 22 deletions(-) diff --git a/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/ui/albums/fragment/AlbumBrowseFragment.kt b/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/ui/albums/fragment/AlbumBrowseFragment.kt index 5d0f7d317..7f90e62f5 100644 --- a/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/ui/albums/fragment/AlbumBrowseFragment.kt +++ b/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/ui/albums/fragment/AlbumBrowseFragment.kt @@ -72,11 +72,6 @@ class AlbumBrowseFragment: BaseFragment(), IFilterable, ITitleProvider, ITranspo initToolbarIfNecessary(appCompatActivity, this) } - override fun onResume() { - super.onResume() - initObservables() - } - override fun setFilter(filter: String) { if (filter != lastFilter) { lastFilter = filter @@ -84,21 +79,24 @@ class AlbumBrowseFragment: BaseFragment(), IFilterable, ITitleProvider, ITranspo } } - fun createOptionsMenu(menu: Menu): Boolean = initSearchMenu(menu, this) - override fun onTransportChanged() = adapter.notifyDataSetChanged() + fun createOptionsMenu(menu: Menu): Boolean = + initSearchMenu(menu, this) - private fun initObservables() = + override fun onTransportChanged() = + adapter.notifyDataSetChanged() + + override fun initObservables() { disposables.add(data.provider.observeState().subscribeBy( onNext = { state -> if (state.first == IDataProvider.State.Connected) { requery() - } - else { + } else { emptyView.update(state.first, adapter.itemCount) } }, onError = { })) + } private fun requery() = @Suppress("unused") diff --git a/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/ui/category/fragment/CategoryBrowseFragment.kt b/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/ui/category/fragment/CategoryBrowseFragment.kt index 115ffd507..19ac6aaa6 100644 --- a/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/ui/category/fragment/CategoryBrowseFragment.kt +++ b/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/ui/category/fragment/CategoryBrowseFragment.kt @@ -100,11 +100,6 @@ class CategoryBrowseFragment: BaseFragment(), IFilterable, ITitleProvider, ITran override val fabVisible: Boolean get() = (category == Metadata.Category.PLAYLISTS) - override fun onResume() { - super.onResume() - initObservers() - } - override fun setFilter(filter: String) { this.lastFilter = filter this.filterDebouncer.call() @@ -121,7 +116,7 @@ class CategoryBrowseFragment: BaseFragment(), IFilterable, ITitleProvider, ITran override fun onTransportChanged() = adapter.notifyDataSetChanged() - private fun initObservers() = + override fun initObservables() { disposables.add(data.provider.observeState().subscribeBy( onNext = { states -> when (states.first) { @@ -132,11 +127,13 @@ class CategoryBrowseFragment: BaseFragment(), IFilterable, ITitleProvider, ITran IDataProvider.State.Disconnected -> { emptyView.update(states.first, adapter.itemCount) } - else -> { } + else -> { + } } }, onError = { })) + } private val categoryTypeString: String get() { diff --git a/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/ui/shared/fragment/BaseFragment.kt b/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/ui/shared/fragment/BaseFragment.kt index 90d90e1f5..57eb35fc3 100644 --- a/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/ui/shared/fragment/BaseFragment.kt +++ b/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/ui/shared/fragment/BaseFragment.kt @@ -29,7 +29,7 @@ import java.lang.Exception open class BaseFragment: Fragment(), ViewModel.Provider { private val mixins = MixinSet() - private val handler = Handler() + protected val handler = Handler() protected lateinit var prefs: SharedPreferences protected val component: ViewComponent = DaggerViewComponent.builder() @@ -38,9 +38,27 @@ open class BaseFragment: Fragment(), ViewModel.Provider { protected var paused = true /* `private set` confuses proguard. sigh */ + protected var animating = false + private set(value) { + field = value + when (field) { + true -> destroyObservables() + false -> initObservables() + } + } + protected var disposables = CompositeDisposable() private set + private fun destroyObservables() { + disposables.dispose() + disposables = CompositeDisposable() + } + + protected open fun initObservables() { + /* for subclass use */ + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) mixins.onCreate(savedInstanceState ?: Bundle()) @@ -64,6 +82,9 @@ open class BaseFragment: Fragment(), ViewModel.Provider { if (this is ITitleProvider) { toolbar?.setTitleFromIntent(title) } + if (!animating) { + initObservables() + } } override fun onPause() { @@ -115,6 +136,7 @@ open class BaseFragment: Fragment(), ViewModel.Provider { else { AnimationUtils.loadAnimation(activity, nextAnim)?.apply { view?.setLayerType(View.LAYER_TYPE_HARDWARE, null) + animating = true setAnimationListener(object : Animation.AnimationListener { override fun onAnimationRepeat(animation: Animation?) { @@ -122,6 +144,7 @@ open class BaseFragment: Fragment(), ViewModel.Provider { override fun onAnimationEnd(animation: Animation?) { view?.setLayerType(View.LAYER_TYPE_NONE, null) + animating = false } override fun onAnimationStart(animation: Animation?) { diff --git a/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/ui/shared/model/BaseSlidingWindow.kt b/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/ui/shared/model/BaseSlidingWindow.kt index c3ae77831..d9fbfdabf 100644 --- a/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/ui/shared/model/BaseSlidingWindow.kt +++ b/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/ui/shared/model/BaseSlidingWindow.kt @@ -85,7 +85,7 @@ abstract class BaseSlidingWindow( } } - private val adapterChangedDebouncer = object : Debouncer(200) { + private val adapterChangedDebouncer = object : Debouncer(50) { override fun onDebounced(last: String?) { recyclerView.adapter?.notifyDataSetChanged() } diff --git a/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/ui/tracks/fragment/TrackListFragment.kt b/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/ui/tracks/fragment/TrackListFragment.kt index ef0dfb007..dd6b90489 100644 --- a/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/ui/tracks/fragment/TrackListFragment.kt +++ b/src/musikdroid/app/src/main/java/io/casey/musikcube/remote/ui/tracks/fragment/TrackListFragment.kt @@ -77,16 +77,15 @@ class TrackListFragment: BaseFragment(), IFilterable, ITitleProvider, ITransport override fun onResume() { tracks.resume() /* needs to happen first */ super.onResume() - initObservers() requeryIfViewingOfflineCache() } - private fun initObservers() = + override fun initObservables() { disposables.add(data.provider.observeState().subscribeBy( onNext = { states -> val shouldRequery = states.first === IDataProvider.State.Connected || - (states.first === IDataProvider.State.Disconnected && isOfflineTracks) + (states.first === IDataProvider.State.Disconnected && isOfflineTracks) if (shouldRequery) { filterDebouncer.cancel() @@ -98,6 +97,7 @@ class TrackListFragment: BaseFragment(), IFilterable, ITitleProvider, ITransport }, onError = { })) + } override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View = inflater.inflate(this.getLayoutId(), container, false).apply {