From ecbc0886c4517abe78bbd810b3cc38bebcaf7f60 Mon Sep 17 00:00:00 2001 From: Evgenii Kozlov Date: Wed, 24 Jan 2024 13:54:36 +0100 Subject: [PATCH] DROID-2145 Objects | Fix | Sync pinned types and app shortcut actions (#795) --- .../repo/DefaultUserSettingsCache.kt | 4 +- persistence/src/main/proto/preferences.proto | 2 +- .../presentation/home/HomeScreenViewModel.kt | 47 ++++++++++--- .../objects/SelectObjectTypeViewModel.kt | 69 +------------------ .../home/HomeScreenViewModelTest.kt | 7 +- 5 files changed, 46 insertions(+), 83 deletions(-) diff --git a/persistence/src/main/java/com/anytypeio/anytype/persistence/repo/DefaultUserSettingsCache.kt b/persistence/src/main/java/com/anytypeio/anytype/persistence/repo/DefaultUserSettingsCache.kt index 18d4d06ca..f439e1e25 100644 --- a/persistence/src/main/java/com/anytypeio/anytype/persistence/repo/DefaultUserSettingsCache.kt +++ b/persistence/src/main/java/com/anytypeio/anytype/persistence/repo/DefaultUserSettingsCache.kt @@ -208,7 +208,7 @@ class DefaultUserSettingsCache( .getOrDefault(key = space.id, defaultValue = SpacePreference()) val updated = givenSpacePreference.copy( - pinnedObjectTypeKeys = types.map { type -> type.id } + pinnedObjectTypeIds = types.map { type -> type.id } ) val result = buildMap { @@ -228,7 +228,7 @@ class DefaultUserSettingsCache( .map { preferences -> preferences .preferences[space.id] - ?.pinnedObjectTypeKeys?.map { id -> TypeId(id) } ?: emptyList() + ?.pinnedObjectTypeIds?.map { id -> TypeId(id) } ?: emptyList() } } diff --git a/persistence/src/main/proto/preferences.proto b/persistence/src/main/proto/preferences.proto index c7c84548b..40580ad74 100644 --- a/persistence/src/main/proto/preferences.proto +++ b/persistence/src/main/proto/preferences.proto @@ -10,5 +10,5 @@ message SpacePreferences { message SpacePreference { optional string defaultObjectTypeKey = 1; - repeated string pinnedObjectTypeKeys = 2; + repeated string pinnedObjectTypeIds = 2; } \ No newline at end of file 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 79eb8bb40..2be718d7a 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 @@ -21,6 +21,7 @@ import com.anytypeio.anytype.core_models.Relations import com.anytypeio.anytype.core_models.WidgetLayout import com.anytypeio.anytype.core_models.WidgetSession import com.anytypeio.anytype.core_models.ext.process +import com.anytypeio.anytype.core_models.primitives.SpaceId import com.anytypeio.anytype.core_models.primitives.TypeKey import com.anytypeio.anytype.core_utils.ext.cancel import com.anytypeio.anytype.core_utils.ext.replace @@ -47,6 +48,7 @@ import com.anytypeio.anytype.domain.page.CloseBlock import com.anytypeio.anytype.domain.page.CreateObject import com.anytypeio.anytype.domain.search.SearchObjects import com.anytypeio.anytype.domain.spaces.GetSpaceView +import com.anytypeio.anytype.domain.types.GetPinnedObjectTypes import com.anytypeio.anytype.domain.widgets.CreateWidget import com.anytypeio.anytype.domain.widgets.DeleteWidget import com.anytypeio.anytype.domain.widgets.GetWidgetSession @@ -156,7 +158,8 @@ class HomeScreenViewModel( private val setWidgetActiveView: SetWidgetActiveView, private val setObjectDetails: SetObjectDetails, private val getSpaceView: GetSpaceView, - private val searchObjects: SearchObjects + private val searchObjects: SearchObjects, + private val getPinnedObjectTypes: GetPinnedObjectTypes ) : NavigationViewModel(), Reducer, WidgetActiveViewStateHolder by widgetActiveViewStateHolder, @@ -1127,15 +1130,33 @@ class HomeScreenViewModel( private fun proceedWithSettingUpShortcuts() { spaceManager .observe() - .onEach { config -> - val defaultObjectType = getDefaultObjectType.async(Unit).getOrNull() + .flatMapLatest { config -> + getPinnedObjectTypes.flow( + GetPinnedObjectTypes.Params(space = SpaceId(config.space)) + ).map { pinned -> + config to pinned + } + } + .onEach { (config, pinned) -> val keys = buildSet { - if (defaultObjectType != null) { - add(defaultObjectType.type.key) + pinned.forEach { typeId -> + val wrapper = storeOfObjectTypes.get(typeId.id) + val uniqueKey = wrapper?.uniqueKey + if (uniqueKey != null) { + add(wrapper.uniqueKey) + } else { + Timber.w("Could not found unique key for a pinned type: ${typeId.id}") + } + } + if (size < MAX_TYPE_COUNT_FOR_APP_ACTIONS && !contains(ObjectTypeUniqueKeys.NOTE)) { + add(ObjectTypeUniqueKeys.NOTE) + } + if (size < MAX_TYPE_COUNT_FOR_APP_ACTIONS && !contains(ObjectTypeUniqueKeys.PAGE)) { + add(ObjectTypeUniqueKeys.PAGE) + } + if (size < MAX_TYPE_COUNT_FOR_APP_ACTIONS && !contains(ObjectTypeUniqueKeys.TASK)) { + add(ObjectTypeUniqueKeys.TASK) } - add(ObjectTypeUniqueKeys.NOTE) - add(ObjectTypeUniqueKeys.PAGE) - add(ObjectTypeUniqueKeys.TASK) } searchObjects( SearchObjects.Params( @@ -1360,7 +1381,8 @@ class HomeScreenViewModel( private val spaceWidgetContainer: SpaceWidgetContainer, private val setObjectDetails: SetObjectDetails, private val getSpaceView: GetSpaceView, - private val searchObjects: SearchObjects + private val searchObjects: SearchObjects, + private val getPinnedObjectTypes: GetPinnedObjectTypes ) : ViewModelProvider.Factory { @Suppress("UNCHECKED_CAST") override fun create(modelClass: Class): T = HomeScreenViewModel( @@ -1396,7 +1418,8 @@ class HomeScreenViewModel( spaceWidgetContainer = spaceWidgetContainer, setObjectDetails = setObjectDetails, getSpaceView = getSpaceView, - searchObjects = searchObjects + searchObjects = searchObjects, + getPinnedObjectTypes = getPinnedObjectTypes ) as T } @@ -1514,4 +1537,6 @@ fun ObjectWrapper.Basic.navigation() : OpenObjectNavigation { OpenObjectNavigation.UnexpectedLayoutError(layout) } } -} \ No newline at end of file +} + +const val MAX_TYPE_COUNT_FOR_APP_ACTIONS = 4 \ No newline at end of file diff --git a/presentation/src/main/java/com/anytypeio/anytype/presentation/objects/SelectObjectTypeViewModel.kt b/presentation/src/main/java/com/anytypeio/anytype/presentation/objects/SelectObjectTypeViewModel.kt index 67979af0a..7017ffef6 100644 --- a/presentation/src/main/java/com/anytypeio/anytype/presentation/objects/SelectObjectTypeViewModel.kt +++ b/presentation/src/main/java/com/anytypeio/anytype/presentation/objects/SelectObjectTypeViewModel.kt @@ -251,19 +251,6 @@ class SelectObjectTypeViewModel( proceedWithSettingPinnedTypes( pinned = updatedPinnedTypes.map { type -> TypeId(type.id) } ) - viewModelScope.launch { - proceedWithUpdatingAppActions( - pinned = updatedPinnedTypes.mapNotNull { type -> - val obj = storeOfObjectTypes.get(type.id) - val key = obj?.uniqueKey - if (obj != null && key != null) { - key to obj.name.orEmpty() - } else { - null - } - } - ) - } } } @@ -273,19 +260,6 @@ class SelectObjectTypeViewModel( if (state is SelectTypeViewState.Content) { val updatedPinnedTypes = pinned.value.filter { type -> type.id != typeView.id } proceedWithSettingPinnedTypes(pinned = updatedPinnedTypes) - viewModelScope.launch { - proceedWithUpdatingAppActions( - pinned = updatedPinnedTypes.mapNotNull { type -> - val obj = storeOfObjectTypes.get(type.id) - val key = obj?.uniqueKey - if (obj != null && key != null) { - key to obj.name.orEmpty() - } else { - null - } - } - ) - } } } @@ -298,19 +272,6 @@ class SelectObjectTypeViewModel( swap(index1 = currentPosition, index2 = currentPosition.dec()) } proceedWithSettingPinnedTypes(pinned = updatedPinnedTypes) - viewModelScope.launch { - proceedWithUpdatingAppActions( - pinned = updatedPinnedTypes.mapNotNull { type -> - val obj = storeOfObjectTypes.get(type.id) - val key = obj?.uniqueKey - if (obj != null && key != null) { - key to obj.name.orEmpty() - } else { - null - } - } - ) - } } } @@ -323,19 +284,6 @@ class SelectObjectTypeViewModel( swap(index1 = currentPosition, index2 = currentPosition.inc()) } proceedWithSettingPinnedTypes(pinned = updatedPinnedTypes) - viewModelScope.launch { - proceedWithUpdatingAppActions( - pinned = updatedPinnedTypes.mapNotNull { type -> - val obj = storeOfObjectTypes.get(type.id) - val key = obj?.uniqueKey - if (obj != null && key != null) { - key to obj.name.orEmpty() - } else { - null - } - } - ) - } } } @@ -357,19 +305,6 @@ class SelectObjectTypeViewModel( } } - private fun proceedWithUpdatingAppActions(pinned: List>) { - if (pinned.isNotEmpty()) { - appActionManager.setup( - pinned.take(MAX_TYPE_COUNT_FOR_APP_ACTIONS).map { (key, name) -> - AppActionManager.Action.CreateNew( - type = TypeKey(key), - name = name - ) - } - ) - } - } - fun onSetDefaultObjectTypeClicked(typeView: SelectTypeView.Type) { viewModelScope.launch { setDefaultObjectType.async( @@ -588,6 +523,4 @@ sealed class SelectTypeView { sealed class Command { data class ShowTypeInstalledToast(val typeName: String) : Command() data class DispatchObjectType(val type: ObjectWrapper.Type) : Command() -} - -const val MAX_TYPE_COUNT_FOR_APP_ACTIONS = 3 \ No newline at end of file +} \ No newline at end of file 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 2574a875a..64c6b70b1 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 @@ -49,6 +49,7 @@ import com.anytypeio.anytype.domain.page.CloseBlock import com.anytypeio.anytype.domain.page.CreateObject import com.anytypeio.anytype.domain.search.SearchObjects import com.anytypeio.anytype.domain.spaces.GetSpaceView +import com.anytypeio.anytype.domain.types.GetPinnedObjectTypes import com.anytypeio.anytype.domain.widgets.CreateWidget import com.anytypeio.anytype.domain.widgets.DeleteWidget import com.anytypeio.anytype.domain.widgets.GetWidgetSession @@ -193,6 +194,9 @@ class HomeScreenViewModelTest { @Mock lateinit var searchObjects: SearchObjects + @Mock + lateinit var getPinnedObjectTypes: GetPinnedObjectTypes + private val objectPayloadDispatcher = Dispatcher.Default() private val widgetEventDispatcher = Dispatcher.Default() @@ -2814,7 +2818,8 @@ class HomeScreenViewModelTest { spaceManager = spaceManager, setObjectDetails = setObjectDetails, getSpaceView = getSpaceView, - searchObjects = searchObjects + searchObjects = searchObjects, + getPinnedObjectTypes = getPinnedObjectTypes ) companion object {