From c45901934ae1ca541fea5efa6e6ed25eccbf24ed Mon Sep 17 00:00:00 2001 From: Evgenii Kozlov Date: Fri, 4 Apr 2025 22:02:07 +0200 Subject: [PATCH] DROID-3526 Widgets | Enhancement | Do not suggest a system widget if it is already added + remove legacy (#2245) --- .../ui/widgets/types/DataViewWidget.kt | 2 - .../anytype/ui/widgets/types/ListWidget.kt | 2 - .../anytype/core_models/widgets/Widgets.kt | 11 ++ .../domain/widgets/GetSuggestedWidgetTypes.kt | 30 +++- .../presentation/extension/AnalyticsExt.kt | 23 --- .../presentation/home/HomeScreenViewModel.kt | 36 +--- .../widgets/ListWidgetContainer.kt | 27 +-- .../widgets/SelectWidgetSourceViewModel.kt | 96 +++++++---- .../widgets/SelectWidgetTypeViewModel.kt | 1 + .../widgets/TreeWidgetContainer.kt | 1 + .../anytype/presentation/widgets/Widget.kt | 13 +- .../presentation/widgets/WidgetConfig.kt | 15 -- .../presentation/widgets/WidgetView.kt | 2 - .../widgets/source/BundledWidgetSourceView.kt | 2 +- .../home/HomeScreenViewModelTest.kt | 158 ++---------------- 15 files changed, 111 insertions(+), 308 deletions(-) create mode 100644 core-models/src/main/java/com/anytypeio/anytype/core_models/widgets/Widgets.kt diff --git a/app/src/main/java/com/anytypeio/anytype/ui/widgets/types/DataViewWidget.kt b/app/src/main/java/com/anytypeio/anytype/ui/widgets/types/DataViewWidget.kt index ecf165efef..392e5939cc 100644 --- a/app/src/main/java/com/anytypeio/anytype/ui/widgets/types/DataViewWidget.kt +++ b/app/src/main/java/com/anytypeio/anytype/ui/widgets/types/DataViewWidget.kt @@ -598,8 +598,6 @@ fun Widget.Source.Bundled.res(): Int = when (this) { Widget.Source.Bundled.Favorites -> R.string.favorites Widget.Source.Bundled.Recent -> R.string.recent Widget.Source.Bundled.RecentLocal -> R.string.recently_opened - Widget.Source.Bundled.Sets -> R.string.sets - Widget.Source.Bundled.Collections -> R.string.collections Widget.Source.Bundled.Bin -> R.string.bin Widget.Source.Bundled.AllObjects -> R.string.all_content } \ No newline at end of file diff --git a/app/src/main/java/com/anytypeio/anytype/ui/widgets/types/ListWidget.kt b/app/src/main/java/com/anytypeio/anytype/ui/widgets/types/ListWidget.kt index 913854bbf9..b3fc69e478 100644 --- a/app/src/main/java/com/anytypeio/anytype/ui/widgets/types/ListWidget.kt +++ b/app/src/main/java/com/anytypeio/anytype/ui/widgets/types/ListWidget.kt @@ -80,8 +80,6 @@ fun ListWidgetCard( Type.Favorites -> stringResource(id = R.string.favorites) Type.Recent -> stringResource(id = R.string.recent) Type.RecentLocal -> stringResource(id = R.string.recently_opened) - Type.Sets -> stringResource(id = R.string.sets) - Type.Collections -> stringResource(id = R.string.collections) Type.Bin -> stringResource(R.string.bin) }, isCardMenuExpanded = isCardMenuExpanded, diff --git a/core-models/src/main/java/com/anytypeio/anytype/core_models/widgets/Widgets.kt b/core-models/src/main/java/com/anytypeio/anytype/core_models/widgets/Widgets.kt new file mode 100644 index 0000000000..617375faae --- /dev/null +++ b/core-models/src/main/java/com/anytypeio/anytype/core_models/widgets/Widgets.kt @@ -0,0 +1,11 @@ +package com.anytypeio.anytype.core_models.widgets + +object BundledWidgetSourceIds { + const val FAVORITE = "favorite" + const val RECENT = "recent" + const val RECENT_LOCAL = "recentOpen" + const val BIN = "bin" + const val ALL_OBJECTS = "allObjects" + + val ids = listOf(FAVORITE, RECENT, RECENT_LOCAL, BIN, ALL_OBJECTS) +} \ No newline at end of file diff --git a/domain/src/main/java/com/anytypeio/anytype/domain/widgets/GetSuggestedWidgetTypes.kt b/domain/src/main/java/com/anytypeio/anytype/domain/widgets/GetSuggestedWidgetTypes.kt index 49c039f7cc..d86f9b20c2 100644 --- a/domain/src/main/java/com/anytypeio/anytype/domain/widgets/GetSuggestedWidgetTypes.kt +++ b/domain/src/main/java/com/anytypeio/anytype/domain/widgets/GetSuggestedWidgetTypes.kt @@ -11,6 +11,7 @@ import com.anytypeio.anytype.core_models.Relations import com.anytypeio.anytype.core_models.ext.asMap import com.anytypeio.anytype.core_models.primitives.Space import com.anytypeio.anytype.core_models.primitives.SpaceId +import com.anytypeio.anytype.core_models.widgets.BundledWidgetSourceIds import com.anytypeio.anytype.domain.base.AppCoroutineDispatchers import com.anytypeio.anytype.domain.base.ResultInteractor import com.anytypeio.anytype.domain.block.repo.BlockRepository @@ -19,11 +20,11 @@ import javax.inject.Inject class GetSuggestedWidgetTypes @Inject constructor( dispatchers: AppCoroutineDispatchers, private val repo: BlockRepository, -) : ResultInteractor>(dispatchers.io) { +) : ResultInteractor(dispatchers.io) { - override suspend fun doWork(params: Params): List { + override suspend fun doWork(params: Params): Result { - val alreadyUsedObjectTypes = getAlreadyUsedTypes( + val (alreadyUsedObjectTypes, alreadyUsedSystemSources) = getAlreadyUsedTypes( space = params.space, widgets = params.ctx ) @@ -55,11 +56,15 @@ class GetSuggestedWidgetTypes @Inject constructor( ObjectWrapper.Type(result) } - return types + return Result( + suggestedObjectTypes = types, + suggestedSystemSources = BundledWidgetSourceIds.ids - alreadyUsedSystemSources + ) } - private suspend fun getAlreadyUsedTypes(space: SpaceId, widgets: Id) : List { - val result = mutableListOf() + private suspend fun getAlreadyUsedTypes(space: SpaceId, widgets: Id) : Pair, List> { + val usedObjectTypes = mutableListOf() + val usedSystemSources = mutableListOf() runCatching { val preview = repo.getObject(space = space, id = widgets) @@ -77,14 +82,18 @@ class GetSuggestedWidgetTypes @Inject constructor( ) val wrapper = ObjectWrapper.Basic(source) if (wrapper.layout == ObjectType.Layout.OBJECT_TYPE) { - result.add(wrapper.id) + usedObjectTypes.add(wrapper.id) + } else { + if (BundledWidgetSourceIds.ids.contains(content.target)) { + usedSystemSources.add(content.target) + } } } } } } - return result.distinct() + return usedObjectTypes.distinct() to usedSystemSources.distinct() } @@ -94,6 +103,11 @@ class GetSuggestedWidgetTypes @Inject constructor( val objectTypeFilters: List, val objectTypeKeys: List ) + + data class Result( + val suggestedObjectTypes: List, + val suggestedSystemSources: List + ) companion object { const val DEFAULT_LIMIT = 10 diff --git a/presentation/src/main/java/com/anytypeio/anytype/presentation/extension/AnalyticsExt.kt b/presentation/src/main/java/com/anytypeio/anytype/presentation/extension/AnalyticsExt.kt index d63b4ad41a..67533d821d 100644 --- a/presentation/src/main/java/com/anytypeio/anytype/presentation/extension/AnalyticsExt.kt +++ b/presentation/src/main/java/com/anytypeio/anytype/presentation/extension/AnalyticsExt.kt @@ -1636,10 +1636,6 @@ fun CoroutineScope.sendDeleteWidgetEvent( props = Props( buildMap { when (bundled) { - Widget.Source.Bundled.Collections -> { - put(WidgetAnalytics.TYPE, WidgetAnalytics.WIDGET_SOURCE_COLLECTIONS) - } - Widget.Source.Bundled.Favorites -> { put(WidgetAnalytics.TYPE, WidgetAnalytics.WIDGET_SOURCE_FAVORITES) } @@ -1652,9 +1648,6 @@ fun CoroutineScope.sendDeleteWidgetEvent( put(WidgetAnalytics.TYPE, WidgetAnalytics.WIDGET_SOURCE_RECENT_LOCAL) } - Widget.Source.Bundled.Sets -> { - put(WidgetAnalytics.TYPE, WidgetAnalytics.WIDGET_SOURCE_SETS) - } Widget.Source.Bundled.Bin -> { put(WidgetAnalytics.TYPE, WidgetAnalytics.WIDGET_SOURCE_BIN) } @@ -1682,9 +1675,6 @@ fun CoroutineScope.sendSelectHomeTabEvent( buildMap { put(WidgetAnalytics.VIEW, WidgetAnalytics.VIEW_WIDGET) when (bundled) { - Widget.Source.Bundled.Collections -> { - put(WidgetAnalytics.TAB, WidgetAnalytics.WIDGET_SOURCE_COLLECTIONS) - } Widget.Source.Bundled.Favorites -> { put(WidgetAnalytics.TAB, WidgetAnalytics.WIDGET_SOURCE_FAVORITES) @@ -1698,9 +1688,6 @@ fun CoroutineScope.sendSelectHomeTabEvent( put(WidgetAnalytics.TAB, WidgetAnalytics.WIDGET_SOURCE_RECENT_LOCAL) } - Widget.Source.Bundled.Sets -> { - put(WidgetAnalytics.TAB, WidgetAnalytics.WIDGET_SOURCE_SETS) - } Widget.Source.Bundled.Bin -> { put(WidgetAnalytics.TAB, WidgetAnalytics.WIDGET_SOURCE_BIN) } @@ -1762,25 +1749,15 @@ fun CoroutineScope.sendReorderWidgetEvent( props = Props( buildMap { when (bundled) { - Widget.Source.Bundled.Collections -> { - put(WidgetAnalytics.TYPE, WidgetAnalytics.WIDGET_SOURCE_COLLECTIONS) - } - Widget.Source.Bundled.Favorites -> { put(WidgetAnalytics.TYPE, WidgetAnalytics.WIDGET_SOURCE_FAVORITES) } - Widget.Source.Bundled.Recent -> { put(WidgetAnalytics.TYPE, WidgetAnalytics.WIDGET_SOURCE_RECENT) } - Widget.Source.Bundled.RecentLocal -> { put(WidgetAnalytics.TYPE, WidgetAnalytics.WIDGET_SOURCE_RECENT_LOCAL) } - - Widget.Source.Bundled.Sets -> { - put(WidgetAnalytics.TYPE, WidgetAnalytics.WIDGET_SOURCE_SETS) - } Widget.Source.Bundled.Bin -> { put(WidgetAnalytics.TYPE, WidgetAnalytics.WIDGET_SOURCE_BIN) } 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 4cc98098cd..ce6728beb7 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 @@ -32,6 +32,7 @@ import com.anytypeio.anytype.core_models.multiplayer.SpaceMemberPermissions import com.anytypeio.anytype.core_models.primitives.Space import com.anytypeio.anytype.core_models.primitives.SpaceId import com.anytypeio.anytype.core_models.primitives.TypeKey +import com.anytypeio.anytype.core_models.widgets.BundledWidgetSourceIds import com.anytypeio.anytype.core_utils.ext.cancel import com.anytypeio.anytype.core_utils.ext.replace import com.anytypeio.anytype.core_utils.ext.withLatestFrom @@ -111,7 +112,6 @@ import com.anytypeio.anytype.presentation.spaces.spaceIcon import com.anytypeio.anytype.presentation.util.Dispatcher import com.anytypeio.anytype.presentation.vault.ExitToVaultDelegate import com.anytypeio.anytype.presentation.widgets.AllContentWidgetContainer -import com.anytypeio.anytype.presentation.widgets.BundledWidgetSourceIds import com.anytypeio.anytype.presentation.widgets.CollapsedWidgetStateHolder import com.anytypeio.anytype.presentation.widgets.DataViewListWidgetContainer import com.anytypeio.anytype.presentation.widgets.DropDownMenuAction @@ -1001,22 +1001,6 @@ class HomeScreenViewModel( ) } } - is Widget.Source.Bundled.Sets -> { - viewModelScope.sendSelectHomeTabEvent( - analytics = analytics, - bundled = source - ) - // TODO switch to bundled widgets id - viewModelScope.launch { - navigation( - Navigation.ExpandWidget( - subscription = Subscription.Sets, - space = spaceManager.get() - ) - ) - } - } - is Widget.Source.Bundled.Recent -> { viewModelScope.sendSelectHomeTabEvent( analytics = analytics, @@ -1032,7 +1016,6 @@ class HomeScreenViewModel( ) } } - is Widget.Source.Bundled.RecentLocal -> { viewModelScope.sendSelectHomeTabEvent( analytics = analytics, @@ -1048,23 +1031,6 @@ class HomeScreenViewModel( ) } } - - is Widget.Source.Bundled.Collections -> { - viewModelScope.sendSelectHomeTabEvent( - analytics = analytics, - bundled = source - ) - // TODO switch to bundled widgets id - viewModelScope.launch { - navigation( - Navigation.ExpandWidget( - subscription = Subscription.Collections, - space = spaceManager.get() - ) - ) - } - } - is Widget.Source.Default -> { if (source.obj.isArchived != true) { dispatchSelectHomeTabCustomSourceEvent(source) 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 9839b14a48..50b2381205 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 @@ -9,6 +9,7 @@ import com.anytypeio.anytype.core_models.ObjectWrapper import com.anytypeio.anytype.core_models.RelationFormat import com.anytypeio.anytype.core_models.Relations import com.anytypeio.anytype.core_models.primitives.SpaceId +import com.anytypeio.anytype.core_models.widgets.BundledWidgetSourceIds import com.anytypeio.anytype.domain.library.StoreSearchByIdsParams import com.anytypeio.anytype.domain.library.StoreSearchParams import com.anytypeio.anytype.domain.library.StorelessSubscriptionContainer @@ -191,9 +192,7 @@ class ListWidgetContainer( private fun resolveType() = when (subscription) { BundledWidgetSourceIds.RECENT -> WidgetView.ListOfObjects.Type.Recent BundledWidgetSourceIds.RECENT_LOCAL -> WidgetView.ListOfObjects.Type.RecentLocal - BundledWidgetSourceIds.SETS -> WidgetView.ListOfObjects.Type.Sets BundledWidgetSourceIds.FAVORITE -> WidgetView.ListOfObjects.Type.Favorites - BundledWidgetSourceIds.COLLECTIONS -> WidgetView.ListOfObjects.Type.Collections BundledWidgetSourceIds.BIN -> WidgetView.ListOfObjects.Type.Bin else -> throw IllegalStateException("Unexpected subscription: $subscription") } @@ -236,18 +235,6 @@ class ListWidgetContainer( limit = limit ) } - - BundledWidgetSourceIds.SETS -> { - StoreSearchParams( - space = SpaceId(space), - subscription = subscription, - sorts = ObjectSearchConstants.sortTabSets, - filters = ObjectSearchConstants.filterTabSets(), - keys = keys, - limit = limit - ) - } - BundledWidgetSourceIds.FAVORITE -> { StoreSearchParams( space = SpaceId(space), @@ -269,18 +256,6 @@ class ListWidgetContainer( limit = limit ) } - - BundledWidgetSourceIds.COLLECTIONS -> { - StoreSearchParams( - space = SpaceId(space), - subscription = subscription, - sorts = collectionsSorts, - filters = ObjectSearchConstants.collectionFilters(), - keys = keys, - limit = limit - ) - } - BundledWidgetSourceIds.BIN, Subscriptions.SUBSCRIPTION_BIN -> { StoreSearchParams( space = SpaceId(space), diff --git a/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/SelectWidgetSourceViewModel.kt b/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/SelectWidgetSourceViewModel.kt index dec7a7fb8e..541b290bd4 100644 --- a/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/SelectWidgetSourceViewModel.kt +++ b/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/SelectWidgetSourceViewModel.kt @@ -9,7 +9,9 @@ import com.anytypeio.anytype.core_models.DVFilter import com.anytypeio.anytype.core_models.DVFilterCondition import com.anytypeio.anytype.core_models.Id import com.anytypeio.anytype.core_models.ObjectType +import com.anytypeio.anytype.core_models.ObjectWrapper import com.anytypeio.anytype.core_models.Relations +import com.anytypeio.anytype.core_models.widgets.BundledWidgetSourceIds import com.anytypeio.anytype.domain.base.Resultat import com.anytypeio.anytype.domain.base.fold import com.anytypeio.anytype.domain.base.getOrDefault @@ -62,7 +64,7 @@ class SelectWidgetSourceViewModel( storeOfObjectTypes = storeOfObjectTypes ) { - val suggested = MutableStateFlow?>(null) + val suggested = MutableStateFlow(SuggestedWidgetsState.Init) val isDismissed = MutableStateFlow(false) var config : Config = Config.None @@ -70,38 +72,51 @@ class SelectWidgetSourceViewModel( val viewState = combine( stateData .asFlow(), - suggested.filterNotNull() + suggested.filterIsInstance() ) { state, suggested -> - if (suggested.isNotEmpty()) { - when(state) { - is ObjectSearchView.Success -> { - state.copy( - objects = buildList { - // System widgets + + when(state) { + is ObjectSearchView.Success -> { + state.copy( + objects = buildList { + + // System widgets + + if (suggested.suggestedSystemSources.isNotEmpty()) { add(ObjectSearchSection.SelectWidgetSource.System) - add(BundledWidgetSourceView.Favorites) - add(BundledWidgetSourceView.AllObjects) - add(BundledWidgetSourceView.Recent) - add(BundledWidgetSourceView.RecentLocal) - add(BundledWidgetSourceView.Bin) - - // Suggested widgets (aka object type widgets) - if (suggested.isNotEmpty()) { - add(ObjectSearchSection.SelectWidgetSource.Suggested) - addAll(suggested) + with(suggested.suggestedSystemSources) { + if (contains(BundledWidgetSourceIds.FAVORITE)) { + add(BundledWidgetSourceView.Favorites) + } + if (contains(BundledWidgetSourceIds.ALL_OBJECTS)) { + add(BundledWidgetSourceView.AllObjects) + } + if (contains(BundledWidgetSourceIds.RECENT)) { + add(BundledWidgetSourceView.Recent) + } + if (contains(BundledWidgetSourceIds.RECENT_LOCAL)) { + add(BundledWidgetSourceView.RecentLocal) + } + if (contains(BundledWidgetSourceIds.BIN)) { + add(BundledWidgetSourceView.Bin) + } } - - // Widgets from existing objects - add(ObjectSearchSection.SelectWidgetSource.FromMyObjects) - addAll(state.objects) } - ) - } - else -> state + + // Suggested widgets (aka object type widgets) + if (suggested.suggestedObjectTypes.isNotEmpty()) { + add(ObjectSearchSection.SelectWidgetSource.Suggested) + addAll(suggested.suggestedObjectTypes) + } + + // Widgets from existing objects + add(ObjectSearchSection.SelectWidgetSource.FromMyObjects) + addAll(state.objects) + } + ) } - } else { - state + else -> state } } @@ -186,14 +201,17 @@ class SelectWidgetSourceViewModel( objectTypeKeys = ObjectSearchConstants.defaultKeysObjectType, ctx = ctx ) - ).onSuccess { types -> - suggested.value = types.map { type -> - SuggestWidgetObjectType( - id = type.id, - name = fieldParser.getObjectPluralName(type), - objectIcon = type.objectIcon() - ) - } + ).onSuccess { result -> + suggested.value = SuggestedWidgetsState.Default( + suggestedSystemSources = result.suggestedSystemSources, + suggestedObjectTypes = result.suggestedObjectTypes.map { type -> + SuggestWidgetObjectType( + id = type.id, + name = fieldParser.getObjectPluralName(type), + objectIcon = type.objectIcon() + ) + } + ) } } getObjectTypes() @@ -415,4 +433,12 @@ class SelectWidgetSourceViewModel( val isInEditMode: Boolean ) : Config() } + + sealed class SuggestedWidgetsState { + data object Init : SuggestedWidgetsState() + data class Default( + val suggestedObjectTypes: List, + val suggestedSystemSources: List + ) : SuggestedWidgetsState() + } } \ No newline at end of file diff --git a/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/SelectWidgetTypeViewModel.kt b/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/SelectWidgetTypeViewModel.kt index b00f1b774b..7c1f03dd36 100644 --- a/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/SelectWidgetTypeViewModel.kt +++ b/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/SelectWidgetTypeViewModel.kt @@ -9,6 +9,7 @@ import com.anytypeio.anytype.core_models.ObjectType import com.anytypeio.anytype.core_models.Payload import com.anytypeio.anytype.core_models.WidgetLayout import com.anytypeio.anytype.core_models.isDataView +import com.anytypeio.anytype.core_models.widgets.BundledWidgetSourceIds import com.anytypeio.anytype.domain.base.AppCoroutineDispatchers import com.anytypeio.anytype.domain.base.fold import com.anytypeio.anytype.domain.widgets.UpdateWidget 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 e449c5d001..eb679f86a6 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 @@ -5,6 +5,7 @@ import com.anytypeio.anytype.core_models.ObjectTypeIds import com.anytypeio.anytype.core_models.ObjectWrapper import com.anytypeio.anytype.core_models.Relations import com.anytypeio.anytype.core_models.primitives.SpaceId +import com.anytypeio.anytype.core_models.widgets.BundledWidgetSourceIds import com.anytypeio.anytype.domain.library.StoreSearchByIdsParams import com.anytypeio.anytype.domain.library.StorelessSubscriptionContainer import com.anytypeio.anytype.domain.misc.UrlBuilder diff --git a/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/Widget.kt b/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/Widget.kt index b42b76cd5f..56c8827e6d 100644 --- a/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/Widget.kt +++ b/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/Widget.kt @@ -9,6 +9,7 @@ import com.anytypeio.anytype.core_models.Relations import com.anytypeio.anytype.core_models.Struct import com.anytypeio.anytype.core_models.ext.asMap import com.anytypeio.anytype.core_models.SupportedLayouts.isSupportedForWidgets +import com.anytypeio.anytype.core_models.widgets.BundledWidgetSourceIds import com.anytypeio.anytype.domain.primitives.FieldParser import com.anytypeio.anytype.presentation.widgets.WidgetView.Name @@ -83,16 +84,6 @@ sealed class Widget { override val type: Id? = null } - data object Sets : Bundled() { - override val id: Id = BundledWidgetSourceIds.SETS - override val type: Id? = null - } - - data object Collections : Bundled() { - override val id: Id = BundledWidgetSourceIds.COLLECTIONS - override val type: Id? = null - } - data object Recent : Bundled() { override val id: Id = BundledWidgetSourceIds.RECENT override val type: Id? = null @@ -240,8 +231,6 @@ fun List.parseWidgets( fun Id.bundled() : Widget.Source.Bundled = when (this) { BundledWidgetSourceIds.RECENT -> Widget.Source.Bundled.Recent BundledWidgetSourceIds.RECENT_LOCAL -> Widget.Source.Bundled.RecentLocal - BundledWidgetSourceIds.SETS -> Widget.Source.Bundled.Sets - BundledWidgetSourceIds.COLLECTIONS -> Widget.Source.Bundled.Collections BundledWidgetSourceIds.FAVORITE -> Widget.Source.Bundled.Favorites BundledWidgetSourceIds.BIN -> Widget.Source.Bundled.Bin BundledWidgetSourceIds.ALL_OBJECTS -> Widget.Source.Bundled.AllObjects diff --git a/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/WidgetConfig.kt b/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/WidgetConfig.kt index ec2ad83fb3..f683c5ffd1 100644 --- a/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/WidgetConfig.kt +++ b/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/WidgetConfig.kt @@ -70,19 +70,4 @@ object WidgetConfig { private val listLimitOptions = intArrayOf(DEFAULT_LIST_LIMIT, 6, 8) private val compactListLimitOptions = intArrayOf(DEFAULT_COMPACT_LIST_LIMIT, 10, 14) private val treeLimitOptions = intArrayOf(DEFAULT_TREE_LIMIT, 10, 14) -} - -object BundledWidgetSourceIds { - const val FAVORITE = "favorite" - const val RECENT = "recent" - const val RECENT_LOCAL = "recentOpen" - const val BIN = "bin" - const val ALL_OBJECTS = "allObjects" - - @Deprecated("DROID-3438 To be deleted") - const val SETS = "set" - @Deprecated("DROID-3438 To be deleted") - const val COLLECTIONS = "collection" - - val ids = listOf(FAVORITE, RECENT, RECENT_LOCAL, SETS, COLLECTIONS, BIN, ALL_OBJECTS) } \ No newline at end of file diff --git a/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/WidgetView.kt b/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/WidgetView.kt index 99bd52edef..7f5b047cbf 100644 --- a/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/WidgetView.kt +++ b/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/WidgetView.kt @@ -117,8 +117,6 @@ sealed class WidgetView { data object Recent : Type() data object RecentLocal : Type() data object Favorites : Type() - data object Sets: Type() - data object Collections: Type() data object Bin: Type() } } diff --git a/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/source/BundledWidgetSourceView.kt b/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/source/BundledWidgetSourceView.kt index c5c60e83f1..19dff73d9b 100644 --- a/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/source/BundledWidgetSourceView.kt +++ b/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/source/BundledWidgetSourceView.kt @@ -1,9 +1,9 @@ package com.anytypeio.anytype.presentation.widgets.source import com.anytypeio.anytype.core_models.Id +import com.anytypeio.anytype.core_models.widgets.BundledWidgetSourceIds import com.anytypeio.anytype.presentation.navigation.DefaultSearchItem import com.anytypeio.anytype.presentation.objects.ObjectIcon -import com.anytypeio.anytype.presentation.widgets.BundledWidgetSourceIds /** * Used for picking bundled widget source from list of objects. diff --git a/presentation/src/test/java/com/anytypeio/anytype/presentation/home/HomeScreenViewModelTest.kt b/presentation/src/test/java/com/anytypeio/anytype/presentation/home/HomeScreenViewModelTest.kt index dcd9c59de7..98c204a593 100644 --- a/presentation/src/test/java/com/anytypeio/anytype/presentation/home/HomeScreenViewModelTest.kt +++ b/presentation/src/test/java/com/anytypeio/anytype/presentation/home/HomeScreenViewModelTest.kt @@ -29,6 +29,7 @@ import com.anytypeio.anytype.core_models.primitives.Space import com.anytypeio.anytype.core_models.primitives.SpaceId import com.anytypeio.anytype.core_models.primitives.TypeId import com.anytypeio.anytype.core_models.primitives.TypeKey +import com.anytypeio.anytype.core_models.widgets.BundledWidgetSourceIds import com.anytypeio.anytype.core_utils.tools.FeatureToggles import com.anytypeio.anytype.domain.auth.interactor.ClearLastOpenedObject import com.anytypeio.anytype.domain.base.AppCoroutineDispatchers @@ -89,7 +90,6 @@ import com.anytypeio.anytype.presentation.spaces.SpaceIconView import com.anytypeio.anytype.presentation.util.DefaultCoroutineTestRule import com.anytypeio.anytype.presentation.util.Dispatcher import com.anytypeio.anytype.presentation.vault.ExitToVaultDelegate -import com.anytypeio.anytype.presentation.widgets.BundledWidgetSourceIds import com.anytypeio.anytype.presentation.widgets.CollapsedWidgetStateHolder import com.anytypeio.anytype.presentation.widgets.DropDownMenuAction import com.anytypeio.anytype.presentation.widgets.ListWidgetContainer @@ -917,7 +917,6 @@ class HomeScreenViewModelTest { val favoriteSource = StubObject(id = BundledWidgetSourceIds.FAVORITE) val recentSource = StubObject(id = BundledWidgetSourceIds.RECENT) - val setsSource = StubObject(id = BundledWidgetSourceIds.SETS) val favoriteLink = StubLinkToObjectBlock( target = favoriteSource.id @@ -927,10 +926,6 @@ class HomeScreenViewModelTest { target = recentSource.id ) - val setsLink = StubLinkToObjectBlock( - target = setsSource.id - ) - val favoriteWidgetBlock = StubWidgetBlock( layout = layout, children = listOf(favoriteLink.id) @@ -941,14 +936,9 @@ class HomeScreenViewModelTest { children = listOf(recentLink.id) ) - val setsWidgetBlock = StubWidgetBlock( - layout = layout, - children = listOf(setsLink.id) - ) - val smartBlock = StubSmartBlock( id = WIDGET_OBJECT_ID, - children = listOf(favoriteWidgetBlock.id, recentWidgetBlock.id, setsWidgetBlock.id), + children = listOf(favoriteWidgetBlock.id, recentWidgetBlock.id) ) val givenObjectView = StubObjectView( @@ -958,9 +948,7 @@ class HomeScreenViewModelTest { favoriteWidgetBlock, favoriteLink, recentWidgetBlock, - recentLink, - setsWidgetBlock, - setsLink + recentLink ) ) @@ -974,13 +962,6 @@ class HomeScreenViewModelTest { results = listOf(firstLink, secondLink) ) - stubSearchByIds( - subscription = setsWidgetBlock.id, - targets = listOf(firstLink.id, secondLink.id), - results = listOf(firstLink, secondLink), - keys = TreeWidgetContainer.keys - ) - stubDefaultSearch( params = ListWidgetContainer.params( subscription = BundledWidgetSourceIds.FAVORITE, @@ -1042,16 +1023,6 @@ class HomeScreenViewModelTest { stubGetSpaceView(defaultSpaceConfig.spaceView) - stubDefaultSearch( - params = ListWidgetContainer.params( - subscription = BundledWidgetSourceIds.SETS, - space = defaultSpaceConfig.space, - keys = TreeWidgetContainer.keys, - limit = WidgetConfig.DEFAULT_TREE_LIMIT - ), - results = listOf(firstLink, secondLink) - ) - stubCollapsedWidgetState(id = anyString()) stubGetWidgetSession() stubWidgetActiveView(favoriteWidgetBlock) @@ -1084,10 +1055,6 @@ class HomeScreenViewModelTest { val secondWidget = firstTimeLoadingState1[2] secondWidget is WidgetView.Tree && secondWidget.isLoading } - assertTrue { - val thirdWidget = firstTimeLoadingState1[3] - thirdWidget is WidgetView.Tree && thirdWidget.isLoading - } advanceUntilIdle() @@ -1100,10 +1067,6 @@ class HomeScreenViewModelTest { val secondWidget = firstTimeLoadingState2[2] secondWidget is WidgetView.Tree && !secondWidget.isLoading } - assertTrue { - val thirdWidget = firstTimeLoadingState2[3] - thirdWidget is WidgetView.Tree && !thirdWidget.isLoading - } val secondTimeState = awaitItem() @@ -1180,40 +1143,6 @@ class HomeScreenViewModelTest { isExpanded = true ) ) - add( - WidgetView.Tree( - id = setsWidgetBlock.id, - source = Widget.Source.Bundled.Sets, - name = WidgetView.Name.Bundled( - Widget.Source.Bundled.Sets, - ), - elements = listOf( - WidgetView.Tree.Element( - id = firstLink.id, - elementIcon = WidgetView.Tree.ElementIcon.Leaf, - obj = firstLink, - objectIcon = ObjectIcon.TypeIcon.Fallback.DEFAULT, - indent = 0, - path = setsWidgetBlock.id + "/" + setsSource.id + "/" + firstLink.id, - name = WidgetView.Name.Default( - prettyPrintName = fieldParser.getObjectName(firstLink) - ) - ), - WidgetView.Tree.Element( - id = secondLink.id, - elementIcon = WidgetView.Tree.ElementIcon.Leaf, - obj = secondLink, - objectIcon = ObjectIcon.TypeIcon.Fallback.DEFAULT, - indent = 0, - path = setsWidgetBlock.id + "/" + setsSource.id + "/" + secondLink.id, - name = WidgetView.Name.Default( - prettyPrintName = fieldParser.getObjectName(secondLink) - ) - ) - ), - isExpanded = true - ) - ) addAll(HomeScreenViewModel.actions) }, actual = secondTimeState @@ -1600,11 +1529,9 @@ class HomeScreenViewModelTest { val favoriteSource = StubObject(id = BundledWidgetSourceIds.FAVORITE) val recentSource = StubObject(id = BundledWidgetSourceIds.RECENT) - val setsSource = StubObject(id = BundledWidgetSourceIds.SETS) val favoriteLink = StubLinkToObjectBlock(target = favoriteSource.id) val recentLink = StubLinkToObjectBlock(target = recentSource.id) - val setsLink = StubLinkToObjectBlock(target = setsSource.id) val favoriteWidgetBlock = StubWidgetBlock( layout = Block.Content.Widget.Layout.TREE, @@ -1616,14 +1543,9 @@ class HomeScreenViewModelTest { children = listOf(recentLink.id) ) - val setsWidgetBlock = StubWidgetBlock( - layout = Block.Content.Widget.Layout.TREE, - children = listOf(setsLink.id) - ) - val firstWidgetObjectSmartBlock = StubSmartBlock( id = WIDGET_OBJECT_ID, - children = listOf(favoriteWidgetBlock.id, recentWidgetBlock.id, setsWidgetBlock.id), + children = listOf(favoriteWidgetBlock.id, recentWidgetBlock.id) ) val secondWidgetObjectSmartBlock = StubSmartBlock( @@ -1638,9 +1560,7 @@ class HomeScreenViewModelTest { favoriteWidgetBlock, favoriteLink, recentWidgetBlock, - recentLink, - setsWidgetBlock, - setsLink + recentLink ) ) @@ -1671,12 +1591,6 @@ class HomeScreenViewModelTest { results = listOf(firstLink, secondLink) ) - stubSearchByIds( - subscription = setsWidgetBlock.id, - targets = listOf(firstLink.id, secondLink.id), - results = listOf(firstLink, secondLink) - ) - stubDefaultSearch( params = ListWidgetContainer.params( subscription = BundledWidgetSourceIds.FAVORITE, @@ -1697,16 +1611,6 @@ class HomeScreenViewModelTest { results = listOf(firstLink, secondLink) ) - stubDefaultSearch( - params = ListWidgetContainer.params( - subscription = BundledWidgetSourceIds.SETS, - space = defaultSpaceConfig.space, - keys = ListWidgetContainer.keys, - limit = WidgetConfig.DEFAULT_LIST_LIMIT - ), - results = listOf(firstLink, secondLink) - ) - stubCollapsedWidgetState(id = anyString()) stubGetWidgetSession() stubWidgetActiveView(favoriteWidgetBlock) @@ -1728,8 +1632,7 @@ class HomeScreenViewModelTest { unsubscribe( listOf( favoriteSource.id, - recentSource.id, - setsSource.id + recentSource.id ) ) } doReturn Unit @@ -1752,8 +1655,7 @@ class HomeScreenViewModelTest { unsubscribe( subscriptions = listOf( favoriteSource.id, - recentSource.id, - setsSource.id + recentSource.id ) ) } @@ -1766,8 +1668,7 @@ class HomeScreenViewModelTest { unsubscribe( subscriptions = listOf( favoriteSource.id, - recentSource.id, - setsSource.id + recentSource.id ) ) } @@ -1796,11 +1697,9 @@ class HomeScreenViewModelTest { val favoriteSource = StubObject(id = BundledWidgetSourceIds.FAVORITE) val recentSource = StubObject(id = BundledWidgetSourceIds.RECENT) - val setsSource = StubObject(id = BundledWidgetSourceIds.SETS) val favoriteLink = StubLinkToObjectBlock(target = favoriteSource.id) val recentLink = StubLinkToObjectBlock(target = recentSource.id) - val setsLink = StubLinkToObjectBlock(target = setsSource.id) val layout = Block.Content.Widget.Layout.LIST @@ -1814,14 +1713,9 @@ class HomeScreenViewModelTest { children = listOf(recentLink.id) ) - val setsWidgetBlock = StubWidgetBlock( - layout = layout, - children = listOf(setsLink.id) - ) - val firstWidgetObjectSmartBlock = StubSmartBlock( id = WIDGET_OBJECT_ID, - children = listOf(favoriteWidgetBlock.id, recentWidgetBlock.id, setsWidgetBlock.id), + children = listOf(favoriteWidgetBlock.id, recentWidgetBlock.id) ) val secondWidgetObjectSmartBlock = StubSmartBlock( @@ -1836,9 +1730,7 @@ class HomeScreenViewModelTest { favoriteWidgetBlock, favoriteLink, recentWidgetBlock, - recentLink, - setsWidgetBlock, - setsLink + recentLink ) ) @@ -1871,12 +1763,6 @@ class HomeScreenViewModelTest { results = listOf(firstLink, secondLink) ) - stubSearchByIds( - subscription = setsWidgetBlock.id, - targets = listOf(firstLink.id, secondLink.id), - results = listOf(firstLink, secondLink) - ) - stubSearchByIds( subscription = favoriteSource.id, keys = ListWidgetContainer.keys, @@ -1905,16 +1791,6 @@ class HomeScreenViewModelTest { stubGetSpaceView(defaultSpaceConfig.spaceView) - stubDefaultSearch( - params = ListWidgetContainer.params( - subscription = BundledWidgetSourceIds.SETS, - space = defaultSpaceConfig.space, - keys = ListWidgetContainer.keys, - limit = WidgetConfig.DEFAULT_LIST_LIMIT - ), - results = listOf(firstLink, secondLink) - ) - stubCollapsedWidgetState(id = anyString()) stubGetWidgetSession() stubWidgetActiveView(favoriteWidgetBlock) @@ -1950,17 +1826,6 @@ class HomeScreenViewModelTest { ) } - verifyBlocking(storelessSubscriptionContainer, times(1)) { - subscribe( - ListWidgetContainer.params( - subscription = setsSource.id, - space = defaultSpaceConfig.space, - keys = ListWidgetContainer.keys, - limit = WidgetConfig.DEFAULT_LIST_LIMIT - ) - ) - } - verifyBlocking(storelessSubscriptionContainer, times(1)) { subscribe( ListWidgetContainer.params( @@ -1982,8 +1847,7 @@ class HomeScreenViewModelTest { unsubscribe( subscriptions = listOf( favoriteSource.id, - recentSource.id, - setsSource.id + recentSource.id ) ) }