Start observing only after animations complete.

This commit is contained in:
casey langen 2019-02-14 23:13:28 -08:00
parent ef6e9422ee
commit 497452c01c
5 changed files with 40 additions and 22 deletions

View File

@ -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")

View File

@ -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() {

View File

@ -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?) {

View File

@ -85,7 +85,7 @@ abstract class BaseSlidingWindow(
}
}
private val adapterChangedDebouncer = object : Debouncer<String>(200) {
private val adapterChangedDebouncer = object : Debouncer<String>(50) {
override fun onDebounced(last: String?) {
recyclerView.adapter?.notifyDataSetChanged()
}

View File

@ -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 {