diff --git a/app/src/main/java/com/anytypeio/anytype/di/feature/ObjectMenuDI.kt b/app/src/main/java/com/anytypeio/anytype/di/feature/ObjectMenuDI.kt index 024ec2344f..9f254189cb 100644 --- a/app/src/main/java/com/anytypeio/anytype/di/feature/ObjectMenuDI.kt +++ b/app/src/main/java/com/anytypeio/anytype/di/feature/ObjectMenuDI.kt @@ -5,7 +5,6 @@ import com.anytypeio.anytype.analytics.base.Analytics import com.anytypeio.anytype.core_models.Payload import com.anytypeio.anytype.core_utils.di.scope.PerDialog import com.anytypeio.anytype.core_utils.tools.FeatureToggles -import com.anytypeio.anytype.domain.`object`.DuplicateObject import com.anytypeio.anytype.domain.auth.repo.AuthRepository import com.anytypeio.anytype.domain.base.AppCoroutineDispatchers import com.anytypeio.anytype.domain.block.interactor.CreateBlock @@ -15,12 +14,15 @@ import com.anytypeio.anytype.domain.collections.AddObjectToCollection import com.anytypeio.anytype.domain.dashboard.interactor.AddToFavorite import com.anytypeio.anytype.domain.dashboard.interactor.RemoveFromFavorite import com.anytypeio.anytype.domain.misc.UrlBuilder +import com.anytypeio.anytype.domain.`object`.DuplicateObject import com.anytypeio.anytype.domain.`object`.SetObjectDetails import com.anytypeio.anytype.domain.objects.SetObjectIsArchived import com.anytypeio.anytype.domain.page.AddBackLinkToObject import com.anytypeio.anytype.domain.page.CloseBlock import com.anytypeio.anytype.domain.page.OpenPage import com.anytypeio.anytype.domain.templates.CreateTemplateFromObject +import com.anytypeio.anytype.domain.widgets.CreateWidget +import com.anytypeio.anytype.domain.workspace.SpaceManager import com.anytypeio.anytype.presentation.common.Action import com.anytypeio.anytype.presentation.common.Delegator import com.anytypeio.anytype.presentation.editor.Editor @@ -120,7 +122,9 @@ object ObjectMenuModule { addObjectToCollection: AddObjectToCollection, createTemplateFromObject: CreateTemplateFromObject, setObjectDetails: SetObjectDetails, - debugGoroutinesShareDownloader: DebugGoroutinesShareDownloader + debugGoroutinesShareDownloader: DebugGoroutinesShareDownloader, + createWidget: CreateWidget, + spaceManager: SpaceManager ): ObjectMenuViewModel.Factory = ObjectMenuViewModel.Factory( setObjectIsArchived = setObjectIsArchived, duplicateObject = duplicateObject, @@ -138,7 +142,9 @@ object ObjectMenuModule { addObjectToCollection = addObjectToCollection, createTemplateFromObject = createTemplateFromObject, setObjectDetails = setObjectDetails, - debugGoroutinesShareDownloader = debugGoroutinesShareDownloader + debugGoroutinesShareDownloader = debugGoroutinesShareDownloader, + createWidget = createWidget, + spaceManager = spaceManager ) @JvmStatic @@ -206,7 +212,9 @@ object ObjectSetMenuModule { featureToggles: FeatureToggles, dispatcher: Dispatcher, addObjectToCollection: AddObjectToCollection, - debugGoroutinesShareDownloader: DebugGoroutinesShareDownloader + debugGoroutinesShareDownloader: DebugGoroutinesShareDownloader, + createWidget: CreateWidget, + spaceManager: SpaceManager ): ObjectSetMenuViewModel.Factory = ObjectSetMenuViewModel.Factory( setObjectIsArchived = setObjectIsArchived, addToFavorite = addToFavorite, @@ -220,7 +228,9 @@ object ObjectSetMenuModule { dispatcher = dispatcher, menuOptionsProvider = createMenuOptionsProvider(state, featureToggles), addObjectToCollection = addObjectToCollection, - debugGoroutinesShareDownloader = debugGoroutinesShareDownloader + debugGoroutinesShareDownloader = debugGoroutinesShareDownloader, + createWidget = createWidget, + spaceManager = spaceManager ) @JvmStatic diff --git a/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/objects/ObjectActionAdapter.kt b/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/objects/ObjectActionAdapter.kt index db1133f7a8..67a0e96618 100644 --- a/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/objects/ObjectActionAdapter.kt +++ b/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/objects/ObjectActionAdapter.kt @@ -84,6 +84,10 @@ class ObjectActionAdapter( ivActionIcon.setImageResource(R.drawable.ic_set_as_default_24) tvActionTitle.setText(R.string.set_as_default) } + ObjectAction.CREATE_WIDGET -> { + ivActionIcon.setImageResource(R.drawable.ic_object_action_to_widgets_24) + tvActionTitle.setText(R.string.object_action_to_widgets) + } else -> {} } } diff --git a/core-ui/src/main/res/drawable/ic_object_action_to_widgets_24.xml b/core-ui/src/main/res/drawable/ic_object_action_to_widgets_24.xml new file mode 100644 index 0000000000..b5be2b3b14 --- /dev/null +++ b/core-ui/src/main/res/drawable/ic_object_action_to_widgets_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/localization/src/main/res/values/strings.xml b/localization/src/main/res/values/strings.xml index 738fa0f992..7682f17dd3 100644 --- a/localization/src/main/res/values/strings.xml +++ b/localization/src/main/res/values/strings.xml @@ -445,7 +445,6 @@ Action-focused layout with a checkbox To Bin Undo/Redo - Duplicate Object removal process Please wait a bit. Your objects will be deleted shortly. Large @@ -1087,6 +1086,13 @@ + + + Duplicate + To widgets + + + Add block button diff --git a/presentation/src/main/java/com/anytypeio/anytype/presentation/objects/ObjectAction.kt b/presentation/src/main/java/com/anytypeio/anytype/presentation/objects/ObjectAction.kt index f596a0463b..a5887bf2c5 100644 --- a/presentation/src/main/java/com/anytypeio/anytype/presentation/objects/ObjectAction.kt +++ b/presentation/src/main/java/com/anytypeio/anytype/presentation/objects/ObjectAction.kt @@ -15,5 +15,6 @@ enum class ObjectAction { UNLOCK, LINK_TO, DELETE_FILES, - SET_AS_DEFAULT + SET_AS_DEFAULT, + CREATE_WIDGET } \ No newline at end of file diff --git a/presentation/src/main/java/com/anytypeio/anytype/presentation/objects/menu/ObjectMenuViewModel.kt b/presentation/src/main/java/com/anytypeio/anytype/presentation/objects/menu/ObjectMenuViewModel.kt index a0fd0e2246..ae014b8d84 100644 --- a/presentation/src/main/java/com/anytypeio/anytype/presentation/objects/menu/ObjectMenuViewModel.kt +++ b/presentation/src/main/java/com/anytypeio/anytype/presentation/objects/menu/ObjectMenuViewModel.kt @@ -24,6 +24,8 @@ import com.anytypeio.anytype.domain.`object`.SetObjectDetails import com.anytypeio.anytype.domain.objects.SetObjectIsArchived import com.anytypeio.anytype.domain.page.AddBackLinkToObject import com.anytypeio.anytype.domain.templates.CreateTemplateFromObject +import com.anytypeio.anytype.domain.widgets.CreateWidget +import com.anytypeio.anytype.domain.workspace.SpaceManager import com.anytypeio.anytype.presentation.common.Action import com.anytypeio.anytype.presentation.common.Delegator import com.anytypeio.anytype.presentation.editor.Editor @@ -35,6 +37,7 @@ import com.anytypeio.anytype.presentation.util.Dispatcher import com.anytypeio.anytype.presentation.util.downloader.DebugGoroutinesShareDownloader import com.anytypeio.anytype.presentation.util.downloader.DebugTreeShareDownloader import com.anytypeio.anytype.presentation.util.downloader.MiddlewareShareDownloader +import javax.inject.Inject import kotlinx.coroutines.launch import timber.log.Timber @@ -48,6 +51,7 @@ class ObjectMenuViewModel( dispatcher: Dispatcher, menuOptionsProvider: ObjectMenuOptionsProvider, duplicateObject: DuplicateObject, + createWidget: CreateWidget, private val debugTreeShareDownloader: DebugTreeShareDownloader, private val storage: Editor.Storage, private val analytics: Analytics, @@ -55,7 +59,8 @@ class ObjectMenuViewModel( private val addObjectToCollection: AddObjectToCollection, private val createTemplateFromObject: CreateTemplateFromObject, private val setObjectDetails: SetObjectDetails, - private val debugGoroutinesShareDownloader: DebugGoroutinesShareDownloader + private val debugGoroutinesShareDownloader: DebugGoroutinesShareDownloader, + private val spaceManager: SpaceManager ) : ObjectMenuViewModelBase( setObjectIsArchived = setObjectIsArchived, addToFavorite = addToFavorite, @@ -68,7 +73,9 @@ class ObjectMenuViewModel( analytics = analytics, menuOptionsProvider = menuOptionsProvider, addObjectToCollection = addObjectToCollection, - debugGoroutinesShareDownloader = debugGoroutinesShareDownloader + debugGoroutinesShareDownloader = debugGoroutinesShareDownloader, + createWidget = createWidget, + spaceManager = spaceManager ) { private val objectRestrictions = storage.objectRestrictions.current() @@ -96,6 +103,8 @@ class ObjectMenuViewModel( } } + add(ObjectAction.CREATE_WIDGET) + if (isTemplate) { add(ObjectAction.SET_AS_DEFAULT) } @@ -265,6 +274,11 @@ class ObjectMenuViewModel( ObjectAction.SET_AS_DEFAULT -> { proceedWithSettingAsDefaultTemplate(ctx = ctx) } + ObjectAction.CREATE_WIDGET -> { + val details = storage.details.current().details[ctx] + val wrapper = ObjectWrapper.Basic(details?.map ?: emptyMap()) + proceedWithCreatingWidget(obj = wrapper) + } ObjectAction.MOVE_TO, ObjectAction.MOVE_TO_BIN, ObjectAction.DELETE_FILES -> { @@ -395,7 +409,7 @@ class ObjectMenuViewModel( } @Suppress("UNCHECKED_CAST") - class Factory( + class Factory @Inject constructor( private val setObjectIsArchived: SetObjectIsArchived, private val duplicateObject: DuplicateObject, private val debugTreeShareDownloader: DebugTreeShareDownloader, @@ -412,7 +426,9 @@ class ObjectMenuViewModel( private val addObjectToCollection: AddObjectToCollection, private val createTemplateFromObject: CreateTemplateFromObject, private val setObjectDetails: SetObjectDetails, - private val debugGoroutinesShareDownloader: DebugGoroutinesShareDownloader + private val debugGoroutinesShareDownloader: DebugGoroutinesShareDownloader, + private val createWidget: CreateWidget, + private val spaceManager: SpaceManager ) : ViewModelProvider.Factory { override fun create(modelClass: Class): T { return ObjectMenuViewModel( @@ -432,7 +448,9 @@ class ObjectMenuViewModel( addObjectToCollection = addObjectToCollection, createTemplateFromObject = createTemplateFromObject, setObjectDetails = setObjectDetails, - debugGoroutinesShareDownloader = debugGoroutinesShareDownloader + debugGoroutinesShareDownloader = debugGoroutinesShareDownloader, + createWidget = createWidget, + spaceManager = spaceManager ) as T } } diff --git a/presentation/src/main/java/com/anytypeio/anytype/presentation/objects/menu/ObjectMenuViewModelBase.kt b/presentation/src/main/java/com/anytypeio/anytype/presentation/objects/menu/ObjectMenuViewModelBase.kt index 41f8cde1a5..044488fb6f 100644 --- a/presentation/src/main/java/com/anytypeio/anytype/presentation/objects/menu/ObjectMenuViewModelBase.kt +++ b/presentation/src/main/java/com/anytypeio/anytype/presentation/objects/menu/ObjectMenuViewModelBase.kt @@ -7,15 +7,20 @@ import com.anytypeio.anytype.core_models.Block import com.anytypeio.anytype.core_models.Id import com.anytypeio.anytype.core_models.Key import com.anytypeio.anytype.core_models.ObjectType +import com.anytypeio.anytype.core_models.ObjectWrapper import com.anytypeio.anytype.core_models.Payload -import com.anytypeio.anytype.domain.`object`.DuplicateObject +import com.anytypeio.anytype.core_models.WidgetLayout +import com.anytypeio.anytype.core_models.isDataView import com.anytypeio.anytype.domain.base.fold import com.anytypeio.anytype.domain.collections.AddObjectToCollection import com.anytypeio.anytype.domain.dashboard.interactor.AddToFavorite import com.anytypeio.anytype.domain.dashboard.interactor.RemoveFromFavorite import com.anytypeio.anytype.domain.misc.UrlBuilder +import com.anytypeio.anytype.domain.`object`.DuplicateObject import com.anytypeio.anytype.domain.objects.SetObjectIsArchived import com.anytypeio.anytype.domain.page.AddBackLinkToObject +import com.anytypeio.anytype.domain.widgets.CreateWidget +import com.anytypeio.anytype.domain.workspace.SpaceManager import com.anytypeio.anytype.presentation.common.Action import com.anytypeio.anytype.presentation.common.BaseViewModel import com.anytypeio.anytype.presentation.common.Delegator @@ -50,7 +55,9 @@ abstract class ObjectMenuViewModelBase( private val menuOptionsProvider: ObjectMenuOptionsProvider, private val duplicateObject: DuplicateObject, private val addObjectToCollection: AddObjectToCollection, - private val debugGoroutinesShareDownloader: DebugGoroutinesShareDownloader + private val debugGoroutinesShareDownloader: DebugGoroutinesShareDownloader, + private val createWidget: CreateWidget, + private val spaceManager: SpaceManager ) : BaseViewModel() { protected val jobs = mutableListOf() @@ -345,6 +352,36 @@ abstract class ObjectMenuViewModelBase( } } + fun proceedWithCreatingWidget(obj: ObjectWrapper.Basic) { + viewModelScope.launch { + val config = spaceManager.getConfig() + if (config != null) { + createWidget( + CreateWidget.Params( + ctx = config.widgets, + source = obj.id, + type = if (obj.layout.isDataView()) { + WidgetLayout.COMPACT_LIST + } else { + WidgetLayout.TREE + } + ) + ).collect { result -> + result.fold( + onSuccess = { + sendToast("Widget created") + isDismissed.value = true + }, + onFailure = { + Timber.e(it, "Error while creating widget") + sendToast(SOMETHING_WENT_WRONG_MSG) + } + ) + } + } + } + } + sealed class Command { object OpenObjectIcons : Command() object OpenSetIcons : Command() diff --git a/presentation/src/main/java/com/anytypeio/anytype/presentation/objects/menu/ObjectSetMenuViewModel.kt b/presentation/src/main/java/com/anytypeio/anytype/presentation/objects/menu/ObjectSetMenuViewModel.kt index 600ac87cb3..a69d8bc590 100644 --- a/presentation/src/main/java/com/anytypeio/anytype/presentation/objects/menu/ObjectSetMenuViewModel.kt +++ b/presentation/src/main/java/com/anytypeio/anytype/presentation/objects/menu/ObjectSetMenuViewModel.kt @@ -5,6 +5,7 @@ import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewModelScope import com.anytypeio.anytype.analytics.base.Analytics import com.anytypeio.anytype.core_models.Id +import com.anytypeio.anytype.core_models.ObjectWrapper import com.anytypeio.anytype.core_models.Payload import com.anytypeio.anytype.core_models.restrictions.ObjectRestriction import com.anytypeio.anytype.domain.collections.AddObjectToCollection @@ -14,6 +15,8 @@ import com.anytypeio.anytype.domain.misc.UrlBuilder import com.anytypeio.anytype.domain.`object`.DuplicateObject import com.anytypeio.anytype.domain.objects.SetObjectIsArchived import com.anytypeio.anytype.domain.page.AddBackLinkToObject +import com.anytypeio.anytype.domain.widgets.CreateWidget +import com.anytypeio.anytype.domain.workspace.SpaceManager import com.anytypeio.anytype.presentation.common.Action import com.anytypeio.anytype.presentation.common.Delegator import com.anytypeio.anytype.presentation.objects.ObjectAction @@ -21,6 +24,7 @@ import com.anytypeio.anytype.presentation.sets.dataViewState import com.anytypeio.anytype.presentation.sets.state.ObjectState import com.anytypeio.anytype.presentation.util.Dispatcher import com.anytypeio.anytype.presentation.util.downloader.DebugGoroutinesShareDownloader +import javax.inject.Inject import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.launch @@ -34,6 +38,8 @@ class ObjectSetMenuViewModel( urlBuilder: UrlBuilder, dispatcher: Dispatcher, menuOptionsProvider: ObjectMenuOptionsProvider, + createWidget: CreateWidget, + spaceManager: SpaceManager, private val objectState: StateFlow, private val analytics: Analytics, private val addObjectToCollection: AddObjectToCollection, @@ -50,11 +56,13 @@ class ObjectSetMenuViewModel( analytics = analytics, menuOptionsProvider = menuOptionsProvider, addObjectToCollection = addObjectToCollection, - debugGoroutinesShareDownloader = debugGoroutinesShareDownloader + debugGoroutinesShareDownloader = debugGoroutinesShareDownloader, + createWidget = createWidget, + spaceManager = spaceManager ) { @Suppress("UNCHECKED_CAST") - class Factory( + class Factory @Inject constructor( private val setObjectIsArchived: SetObjectIsArchived, private val addToFavorite: AddToFavorite, private val removeFromFavorite: RemoveFromFavorite, @@ -67,7 +75,9 @@ class ObjectSetMenuViewModel( private val objectState: StateFlow, private val menuOptionsProvider: ObjectMenuOptionsProvider, private val addObjectToCollection: AddObjectToCollection, - private val debugGoroutinesShareDownloader: DebugGoroutinesShareDownloader + private val debugGoroutinesShareDownloader: DebugGoroutinesShareDownloader, + private val createWidget: CreateWidget, + private val spaceManager: SpaceManager ) : ViewModelProvider.Factory { override fun create(modelClass: Class): T { return ObjectSetMenuViewModel( @@ -83,7 +93,9 @@ class ObjectSetMenuViewModel( dispatcher = dispatcher, menuOptionsProvider = menuOptionsProvider, addObjectToCollection = addObjectToCollection, - debugGoroutinesShareDownloader = debugGoroutinesShareDownloader + debugGoroutinesShareDownloader = debugGoroutinesShareDownloader, + createWidget = createWidget, + spaceManager = spaceManager ) as T } } @@ -148,6 +160,7 @@ class ObjectSetMenuViewModel( } else { add(ObjectAction.ADD_TO_FAVOURITE) } + add(ObjectAction.CREATE_WIDGET) val dataViewState = objectState.value.dataViewState() if (dataViewState != null && !dataViewState.objectRestrictions.contains(ObjectRestriction.DUPLICATE)) { add(ObjectAction.DUPLICATE) @@ -175,6 +188,11 @@ class ObjectSetMenuViewModel( ObjectAction.DUPLICATE -> { proceedWithDuplication(ctx = ctx, details = objectState.value.dataViewState()?.details) } + ObjectAction.CREATE_WIDGET -> { + val details = objectState.value.dataViewState()?.details?.get(ctx) + val wrapper = ObjectWrapper.Basic(details?.map ?: emptyMap()) + proceedWithCreatingWidget(obj = wrapper) + } ObjectAction.MOVE_TO, ObjectAction.SEARCH_ON_PAGE, ObjectAction.UNDO_REDO,