From 04149405197df1775553988622c6697c4074ca4f Mon Sep 17 00:00:00 2001 From: Evgenii Kozlov Date: Tue, 2 Jul 2024 23:44:39 +0200 Subject: [PATCH] DROID-2619 Widgets | Tech | Widget cache proposal (#1351) --- .../presentation/home/HomeScreenViewModel.kt | 27 ++++++++++++++-- .../widgets/DataViewListWidgetContainer.kt | 28 +++++++++-------- .../widgets/ListWidgetContainer.kt | 31 +++++++++---------- .../widgets/TreeWidgetContainer.kt | 26 ++++++++-------- 4 files changed, 67 insertions(+), 45 deletions(-) diff --git a/presentation/src/main/java/com/anytypeio/anytype/presentation/home/HomeScreenViewModel.kt b/presentation/src/main/java/com/anytypeio/anytype/presentation/home/HomeScreenViewModel.kt index 90b8eed888..5d98f4b892 100644 --- a/presentation/src/main/java/com/anytypeio/anytype/presentation/home/HomeScreenViewModel.kt +++ b/presentation/src/main/java/com/anytypeio/anytype/presentation/home/HomeScreenViewModel.kt @@ -392,6 +392,7 @@ class HomeScreenViewModel( private fun proceedWithWidgetContainerPipeline() { viewModelScope.launch { widgets.filterNotNull().map { widgets -> + val currentlyDisplayedViews = views.value widgets.map { widget -> when (widget) { is Widget.Link -> LinkWidgetContainer( @@ -405,7 +406,14 @@ class HomeScreenViewModel( isSessionActive = isSessionActive, urlBuilder = urlBuilder, objectWatcher = objectWatcher, - getSpaceView = getSpaceView + getSpaceView = getSpaceView, + onRequestCache = { + currentlyDisplayedViews.find { view -> + view.id == widget.id + && view is WidgetView.Tree + && view.source == widget.source + } as? WidgetView.Tree + } ) is Widget.List -> if (BundledWidgetSourceIds.ids.contains(widget.source.id)) { ListWidgetContainer( @@ -414,10 +422,16 @@ class HomeScreenViewModel( storage = storelessSubscriptionContainer, isWidgetCollapsed = isCollapsed(widget.id), urlBuilder = urlBuilder, - spaceGradientProvider = spaceGradientProvider, isSessionActive = isSessionActive, objectWatcher = objectWatcher, - getSpaceView = getSpaceView + getSpaceView = getSpaceView, + onRequestCache = { + currentlyDisplayedViews.find { view -> + view.id == widget.id + && view is WidgetView.ListOfObjects + && view.source == widget.source + } as? WidgetView.ListOfObjects + } ) } else { DataViewListWidgetContainer( @@ -428,6 +442,13 @@ class HomeScreenViewModel( isWidgetCollapsed = isCollapsed(widget.id), isSessionActive = isSessionActive, urlBuilder = urlBuilder, + onRequestCache = { + currentlyDisplayedViews.find { view -> + view.id == widget.id + && view is WidgetView.SetOfObjects + && view.source == widget.source + } as? WidgetView.SetOfObjects + } ) } } diff --git a/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/DataViewListWidgetContainer.kt b/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/DataViewListWidgetContainer.kt index bae33d7024..8b17ba97f3 100644 --- a/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/DataViewListWidgetContainer.kt +++ b/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/DataViewListWidgetContainer.kt @@ -1,6 +1,5 @@ package com.anytypeio.anytype.presentation.widgets -import com.anytypeio.anytype.core_models.Config import com.anytypeio.anytype.core_models.DV import com.anytypeio.anytype.core_models.DVFilter import com.anytypeio.anytype.core_models.DVFilterCondition @@ -16,7 +15,6 @@ import com.anytypeio.anytype.domain.library.StorelessSubscriptionContainer import com.anytypeio.anytype.domain.misc.UrlBuilder import com.anytypeio.anytype.domain.`object`.GetObject import com.anytypeio.anytype.presentation.search.ObjectSearchConstants -import com.anytypeio.anytype.presentation.spaces.SpaceGradientProvider import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.combine @@ -35,24 +33,28 @@ class DataViewListWidgetContainer( private val urlBuilder: UrlBuilder, private val activeView: Flow, private val isWidgetCollapsed: Flow, - isSessionActive: Flow + isSessionActive: Flow, + onRequestCache: () -> WidgetView.SetOfObjects? = { null } ) : WidgetContainer { override val view = isSessionActive.flatMapLatest { isActive -> if (isActive) buildViewFlow().onStart { isWidgetCollapsed.take(1).collect { isCollapsed -> - emit( - WidgetView.SetOfObjects( - id = widget.id, - source = widget.source, - tabs = emptyList(), - elements = emptyList(), - isExpanded = !isCollapsed, - isCompact = widget.isCompact, - isLoading = true - ) + val loadingStateView = WidgetView.SetOfObjects( + id = widget.id, + source = widget.source, + tabs = emptyList(), + elements = emptyList(), + isExpanded = !isCollapsed, + isCompact = widget.isCompact, + isLoading = true ) + if (isCollapsed) { + emit(loadingStateView) + } else { + emit(onRequestCache() ?: loadingStateView) + } } } else diff --git a/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/ListWidgetContainer.kt b/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/ListWidgetContainer.kt index b9952252d1..bc39d587c4 100644 --- a/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/ListWidgetContainer.kt +++ b/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/ListWidgetContainer.kt @@ -1,7 +1,6 @@ package com.anytypeio.anytype.presentation.widgets import com.anytypeio.anytype.core_models.Block -import com.anytypeio.anytype.core_models.Config import com.anytypeio.anytype.core_models.DVSort import com.anytypeio.anytype.core_models.DVSortType import com.anytypeio.anytype.core_models.Id @@ -18,45 +17,45 @@ import com.anytypeio.anytype.domain.spaces.GetSpaceView import com.anytypeio.anytype.presentation.search.ObjectSearchConstants import com.anytypeio.anytype.presentation.search.ObjectSearchConstants.collectionsSorts import com.anytypeio.anytype.presentation.search.Subscriptions -import com.anytypeio.anytype.presentation.spaces.SpaceGradientProvider import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.emptyFlow import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.map -import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.flow.take -import timber.log.Timber class ListWidgetContainer( private val widget: Widget.List, private val subscription: Id, private val storage: StorelessSubscriptionContainer, private val urlBuilder: UrlBuilder, - private val spaceGradientProvider: SpaceGradientProvider, private val isWidgetCollapsed: Flow, private val objectWatcher: ObjectWatcher, private val getSpaceView: GetSpaceView, - isSessionActive: Flow + isSessionActive: Flow, + onRequestCache: () -> WidgetView.ListOfObjects? = { null } ) : WidgetContainer { override val view: Flow = isSessionActive.flatMapLatest { isActive -> if (isActive) buildViewFlow().onStart { isWidgetCollapsed.take(1).collect { isCollapsed -> - emit( - WidgetView.ListOfObjects( - id = widget.id, - source = widget.source, - type = resolveType(), - elements = emptyList(), - isExpanded = !isCollapsed, - isCompact = widget.isCompact, - isLoading = true - ) + val loadingStateView = WidgetView.ListOfObjects( + id = widget.id, + source = widget.source, + type = resolveType(), + elements = emptyList(), + isExpanded = !isCollapsed, + isCompact = widget.isCompact, + isLoading = true ) + if (isCollapsed) { + emit(loadingStateView) + } else { + emit(onRequestCache() ?: loadingStateView) + } } } else diff --git a/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/TreeWidgetContainer.kt b/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/TreeWidgetContainer.kt index 18ad56476b..d3bb6db2e8 100644 --- a/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/TreeWidgetContainer.kt +++ b/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/TreeWidgetContainer.kt @@ -1,6 +1,5 @@ package com.anytypeio.anytype.presentation.widgets -import com.anytypeio.anytype.core_models.Config import com.anytypeio.anytype.core_models.Id import com.anytypeio.anytype.core_models.ObjectTypeIds import com.anytypeio.anytype.core_models.ObjectWrapper @@ -11,7 +10,6 @@ import com.anytypeio.anytype.domain.misc.UrlBuilder import com.anytypeio.anytype.domain.objects.ObjectWatcher import com.anytypeio.anytype.domain.spaces.GetSpaceView import com.anytypeio.anytype.presentation.search.ObjectSearchConstants -import com.anytypeio.anytype.presentation.spaces.SpaceGradientProvider import com.anytypeio.anytype.presentation.widgets.WidgetConfig.isValidObject import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.catch @@ -19,12 +17,10 @@ import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.emptyFlow import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.map -import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.flow.take import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock -import timber.log.Timber class TreeWidgetContainer( @@ -35,7 +31,8 @@ class TreeWidgetContainer( private val isWidgetCollapsed: Flow, private val objectWatcher: ObjectWatcher, private val getSpaceView: GetSpaceView, - isSessionActive: Flow + isSessionActive: Flow, + onRequestCache: () -> WidgetView.Tree? = { null } ) : WidgetContainer { private val mutex = Mutex() @@ -48,15 +45,18 @@ class TreeWidgetContainer( if (isActive) buildViewFlow().onStart { isWidgetCollapsed.take(1).collect { isCollapsed -> - emit( - WidgetView.Tree( - id = widget.id, - source = widget.source, - isExpanded = !isCollapsed, - elements = emptyList(), - isLoading = true - ) + val loadingStateView = WidgetView.Tree( + id = widget.id, + source = widget.source, + isExpanded = !isCollapsed, + elements = emptyList(), + isLoading = true ) + if (isCollapsed) { + emit(loadingStateView) + } else { + emit(onRequestCache() ?: loadingStateView) + } } } else