1
0
Fork 0
mirror of https://github.com/anyproto/anytype-kotlin.git synced 2025-06-08 05:47:05 +09:00

DROID-2619 Widgets | Tech | Widget cache proposal (#1351)

This commit is contained in:
Evgenii Kozlov 2024-07-02 23:44:39 +02:00 committed by GitHub
parent faa9621703
commit 0414940519
Signed by: github
GPG key ID: B5690EEEBB952194
4 changed files with 67 additions and 45 deletions

View file

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

View file

@ -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<Id?>,
private val isWidgetCollapsed: Flow<Boolean>,
isSessionActive: Flow<Boolean>
isSessionActive: Flow<Boolean>,
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

View file

@ -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<Boolean>,
private val objectWatcher: ObjectWatcher,
private val getSpaceView: GetSpaceView,
isSessionActive: Flow<Boolean>
isSessionActive: Flow<Boolean>,
onRequestCache: () -> WidgetView.ListOfObjects? = { null }
) : WidgetContainer {
override val view: Flow<WidgetView> = 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

View file

@ -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<Boolean>,
private val objectWatcher: ObjectWatcher,
private val getSpaceView: GetSpaceView,
isSessionActive: Flow<Boolean>
isSessionActive: Flow<Boolean>,
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