diff --git a/app/src/main/java/com/anytypeio/anytype/di/feature/EditorDI.kt b/app/src/main/java/com/anytypeio/anytype/di/feature/EditorDI.kt index d7cca0e63b..0cefc3d093 100644 --- a/app/src/main/java/com/anytypeio/anytype/di/feature/EditorDI.kt +++ b/app/src/main/java/com/anytypeio/anytype/di/feature/EditorDI.kt @@ -117,6 +117,7 @@ import com.anytypeio.anytype.presentation.editor.render.DefaultBlockViewRenderer import com.anytypeio.anytype.presentation.editor.selection.SelectionStateHolder import com.anytypeio.anytype.presentation.editor.toggle.ToggleStateHolder import com.anytypeio.anytype.presentation.objects.LockedStateProvider +import com.anytypeio.anytype.presentation.objects.ObjectRestrictionProvider import com.anytypeio.anytype.presentation.relations.providers.DefaultObjectRelationProvider import com.anytypeio.anytype.presentation.relations.providers.DefaultObjectValueProvider import com.anytypeio.anytype.presentation.relations.providers.ObjectDetailProvider @@ -218,6 +219,11 @@ object EditorSessionModule { @PerScreen fun provideStorage(): Editor.Storage = Editor.Storage() + @JvmStatic + @Provides + @PerScreen + fun provideRestriction(storage: Editor.Storage): ObjectRestrictionProvider = storage + @JvmStatic @Provides @PerScreen diff --git a/app/src/main/java/com/anytypeio/anytype/di/feature/ObjectRelationListDI.kt b/app/src/main/java/com/anytypeio/anytype/di/feature/ObjectRelationListDI.kt index 8e2351ea68..1b86fa1413 100644 --- a/app/src/main/java/com/anytypeio/anytype/di/feature/ObjectRelationListDI.kt +++ b/app/src/main/java/com/anytypeio/anytype/di/feature/ObjectRelationListDI.kt @@ -12,6 +12,7 @@ import com.anytypeio.anytype.domain.relations.AddToFeaturedRelations import com.anytypeio.anytype.domain.relations.DeleteRelationFromObject import com.anytypeio.anytype.domain.relations.RemoveFromFeaturedRelations import com.anytypeio.anytype.presentation.objects.LockedStateProvider +import com.anytypeio.anytype.presentation.objects.ObjectRestrictionProvider import com.anytypeio.anytype.presentation.relations.ObjectRelationListViewModelFactory import com.anytypeio.anytype.presentation.relations.providers.RelationListProvider import com.anytypeio.anytype.presentation.util.Dispatcher @@ -49,7 +50,8 @@ object ObjectRelationListModule { deleteRelationFromObject: DeleteRelationFromObject, analytics: Analytics, storeOfRelations: StoreOfRelations, - addRelationToObject: AddRelationToObject + addRelationToObject: AddRelationToObject, + restrictions: ObjectRestrictionProvider ): ObjectRelationListViewModelFactory { return ObjectRelationListViewModelFactory( lockedStateProvider = lockedStateProvider, @@ -62,7 +64,8 @@ object ObjectRelationListModule { deleteRelationFromObject = deleteRelationFromObject, analytics = analytics, storeOfRelations = storeOfRelations, - addRelationToObject = addRelationToObject + addRelationToObject = addRelationToObject, + restrictions = restrictions ) } diff --git a/app/src/main/java/com/anytypeio/anytype/di/feature/ObjectSetDI.kt b/app/src/main/java/com/anytypeio/anytype/di/feature/ObjectSetDI.kt index 3a7308f766..39d4e74f53 100644 --- a/app/src/main/java/com/anytypeio/anytype/di/feature/ObjectSetDI.kt +++ b/app/src/main/java/com/anytypeio/anytype/di/feature/ObjectSetDI.kt @@ -70,8 +70,10 @@ import com.anytypeio.anytype.domain.workspace.SpaceManager import com.anytypeio.anytype.presentation.analytics.AnalyticSpaceHelperDelegate import com.anytypeio.anytype.presentation.common.Action import com.anytypeio.anytype.presentation.common.Delegator +import com.anytypeio.anytype.presentation.editor.Editor import com.anytypeio.anytype.presentation.editor.cover.CoverImageHashProvider import com.anytypeio.anytype.presentation.objects.LockedStateProvider +import com.anytypeio.anytype.presentation.objects.ObjectRestrictionProvider import com.anytypeio.anytype.presentation.relations.providers.DataViewObjectRelationProvider import com.anytypeio.anytype.presentation.relations.providers.DataViewObjectValueProvider import com.anytypeio.anytype.presentation.relations.providers.ObjectDetailProvider @@ -406,6 +408,11 @@ object ObjectSetModule { @PerScreen fun provideObjectStateReducer(): ObjectStateReducer = DefaultObjectStateReducer() + @JvmStatic + @Provides + @PerScreen + fun provideRestriction(reducer: ObjectStateReducer): ObjectRestrictionProvider = reducer + @JvmStatic @Provides @PerScreen diff --git a/app/src/main/java/com/anytypeio/anytype/ui/editor/EditorFragment.kt b/app/src/main/java/com/anytypeio/anytype/ui/editor/EditorFragment.kt index fed5e8784d..a74bdbc2ff 100644 --- a/app/src/main/java/com/anytypeio/anytype/ui/editor/EditorFragment.kt +++ b/app/src/main/java/com/anytypeio/anytype/ui/editor/EditorFragment.kt @@ -1023,20 +1023,6 @@ open class EditorFragment : NavigationFragment(R.layout.f ) .showChildFragment() } - is Command.OpenObjectRelationScreen.RelationList -> { - hideKeyboard() - findNavController().safeNavigate( - R.id.pageScreen, - R.id.objectRelationListScreen, - bundleOf( - ObjectRelationListFragment.ARG_CTX to command.ctx, - ObjectRelationListFragment.ARG_SPACE to space, - ObjectRelationListFragment.ARG_TARGET to command.target, - ObjectRelationListFragment.ARG_LOCKED to command.isLocked, - ObjectRelationListFragment.ARG_MODE to ObjectRelationListFragment.MODE_LIST, - ) - ) - } is Command.OpenObjectRelationScreen.Value.Default -> { hideKeyboard() val fr = RelationValueFragment.new( @@ -2024,10 +2010,6 @@ open class EditorFragment : NavigationFragment(R.layout.f vm.onMovedToBin() } - override fun onSearchOnPageClicked() { - vm.onEnterSearchModeClicked() - } - override fun onSetTextBlockValue() { vm.onSetTextBlockValue() } @@ -2036,26 +2018,6 @@ open class EditorFragment : NavigationFragment(R.layout.f vm.onMentionClicked(target = target) } - override fun onUndoRedoClicked() { - vm.onUndoRedoActionClicked() - } - - override fun onDocRelationsClicked() { - vm.onDocRelationsClicked() - } - - override fun onAddCoverClicked() { - vm.onAddCoverClicked() - } - - override fun onSetIconClicked() { - vm.onSetObjectIconClicked() - } - - override fun onLayoutClicked() { - vm.onLayoutClicked() - } - override fun onTextValueChanged(ctx: Id, text: String, objectId: Id, relationKey: Key) { vm.onRelationTextValueChanged( ctx = ctx, diff --git a/app/src/main/java/com/anytypeio/anytype/ui/editor/sheets/ObjectMenuBaseFragment.kt b/app/src/main/java/com/anytypeio/anytype/ui/editor/sheets/ObjectMenuBaseFragment.kt index 7707de084f..3a0e10d556 100644 --- a/app/src/main/java/com/anytypeio/anytype/ui/editor/sheets/ObjectMenuBaseFragment.kt +++ b/app/src/main/java/com/anytypeio/anytype/ui/editor/sheets/ObjectMenuBaseFragment.kt @@ -342,12 +342,6 @@ abstract class ObjectMenuBaseFragment : interface DocumentMenuActionReceiver { fun onMoveToBinSuccess() - fun onSearchOnPageClicked() - fun onDocRelationsClicked() - fun onAddCoverClicked() - fun onSetIconClicked() - fun onLayoutClicked() - fun onUndoRedoClicked() } } diff --git a/app/src/main/java/com/anytypeio/anytype/ui/editor/sheets/ObjectMenuFragment.kt b/app/src/main/java/com/anytypeio/anytype/ui/editor/sheets/ObjectMenuFragment.kt index 5887d0d6ca..ca23c2de88 100644 --- a/app/src/main/java/com/anytypeio/anytype/ui/editor/sheets/ObjectMenuFragment.kt +++ b/app/src/main/java/com/anytypeio/anytype/ui/editor/sheets/ObjectMenuFragment.kt @@ -46,7 +46,6 @@ class ObjectMenuFragment : ObjectMenuBaseFragment() { } companion object { - fun new( ctx: Id, space: Id, diff --git a/app/src/main/java/com/anytypeio/anytype/ui/relations/ObjectRelationListFragment.kt b/app/src/main/java/com/anytypeio/anytype/ui/relations/ObjectRelationListFragment.kt index 1f4004266a..85a2b41bf9 100644 --- a/app/src/main/java/com/anytypeio/anytype/ui/relations/ObjectRelationListFragment.kt +++ b/app/src/main/java/com/anytypeio/anytype/ui/relations/ObjectRelationListFragment.kt @@ -14,6 +14,7 @@ import com.anytypeio.anytype.R import com.anytypeio.anytype.core_models.Id import com.anytypeio.anytype.core_models.Key import com.anytypeio.anytype.core_models.primitives.SpaceId +import com.anytypeio.anytype.core_models.restrictions.ObjectRestriction import com.anytypeio.anytype.core_ui.features.relations.DocumentRelationAdapter import com.anytypeio.anytype.core_ui.reactive.textChanges import com.anytypeio.anytype.core_utils.ext.arg @@ -188,6 +189,13 @@ open class ObjectRelationListFragment : BaseBottomSheetFragment execute(command) } jobs += lifecycleScope.subscribe(vm.toasts) { toast(it) } + jobs += lifecycleScope.subscribe(vm.restrictions) { restrictions -> + if (restrictions.contains(ObjectRestriction.RELATIONS) || restrictions.contains(ObjectRestriction.DETAILS)) { + binding.topToolbar.gone() + } else { + binding.topToolbar.visible() + } + } jobs += lifecycleScope.subscribe(vm.isEditMode) { isEditMode -> if (isEditMode) { binding.btnEditOrDone.setText(R.string.done) diff --git a/presentation/src/main/java/com/anytypeio/anytype/presentation/editor/Editor.kt b/presentation/src/main/java/com/anytypeio/anytype/presentation/editor/Editor.kt index 84a9457056..0fb0019791 100644 --- a/presentation/src/main/java/com/anytypeio/anytype/presentation/editor/Editor.kt +++ b/presentation/src/main/java/com/anytypeio/anytype/presentation/editor/Editor.kt @@ -3,6 +3,7 @@ package com.anytypeio.anytype.presentation.editor import com.anytypeio.anytype.core_models.Block import com.anytypeio.anytype.core_models.Document import com.anytypeio.anytype.core_models.Id +import com.anytypeio.anytype.core_models.restrictions.ObjectRestriction import com.anytypeio.anytype.domain.editor.Editor import com.anytypeio.anytype.domain.editor.Editor.Focus import com.anytypeio.anytype.presentation.editor.editor.Proxy @@ -10,6 +11,7 @@ import com.anytypeio.anytype.presentation.editor.editor.Store import com.anytypeio.anytype.presentation.editor.editor.actions.ActionItemType import com.anytypeio.anytype.presentation.editor.editor.model.BlockView import com.anytypeio.anytype.presentation.editor.selection.SelectionStateHolder +import com.anytypeio.anytype.presentation.objects.ObjectRestrictionProvider import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow @@ -95,7 +97,7 @@ interface Editor { ) : Mode() } - class Storage { + class Storage : ObjectRestrictionProvider { val document: DocumentProvider = DocumentProvider.Default() val views: Store> = Store.Screen() val focus: Store = Store.Focus() @@ -106,6 +108,10 @@ interface Editor { val textSelection: Store = Store.TextSelection() val objectRestrictions: Store.ObjectRestrictions = Store.ObjectRestrictions() val relationLinks: Store.RelationLinks = Store.RelationLinks() + + override fun provide(): List { + return objectRestrictions.current() + } } class Proxer( diff --git a/presentation/src/main/java/com/anytypeio/anytype/presentation/editor/EditorViewModel.kt b/presentation/src/main/java/com/anytypeio/anytype/presentation/editor/EditorViewModel.kt index 110f1bd9e9..df9e305e7b 100644 --- a/presentation/src/main/java/com/anytypeio/anytype/presentation/editor/EditorViewModel.kt +++ b/presentation/src/main/java/com/anytypeio/anytype/presentation/editor/EditorViewModel.kt @@ -2190,17 +2190,6 @@ class EditorViewModel( viewModelScope.launch { refresh() } } - fun onDocRelationsClicked() { - Timber.d("onDocRelationsClicked, ") - dispatch( - Command.OpenObjectRelationScreen.RelationList( - ctx = context, - target = null, - isLocked = mode == EditorMode.Locked - ) - ) - } - fun onSearchToolbarEvent(event: SearchInDocEvent) { Timber.d("onSearchToolbarEvent, event:[$event]") if (mode !is EditorMode.Search) return @@ -3330,25 +3319,6 @@ class EditorViewModel( } } - fun onSetObjectIconClicked() { - viewModelScope.launch { - val obj = orchestrator.stores.details.getAsObject(context) - val space = obj?.spaceId - if (space != null) { - dispatch(Command.SetObjectIcon(ctx = context, space = space)) - } else { - Timber.e("Space not found").also { - sendToast("Space not found") - } - } - } - } - - fun onLayoutClicked() { - Timber.d("onLayoutClicked, ") - dispatch(Command.OpenObjectLayout(context)) - } - fun onLayoutDialogDismissed() { Timber.d("onLayoutDialogDismissed, ") proceedWithOpeningObjectMenu() diff --git a/presentation/src/main/java/com/anytypeio/anytype/presentation/editor/editor/Command.kt b/presentation/src/main/java/com/anytypeio/anytype/presentation/editor/editor/Command.kt index 6d0279eaa8..b058142cf4 100644 --- a/presentation/src/main/java/com/anytypeio/anytype/presentation/editor/editor/Command.kt +++ b/presentation/src/main/java/com/anytypeio/anytype/presentation/editor/editor/Command.kt @@ -3,6 +3,7 @@ package com.anytypeio.anytype.presentation.editor.editor import com.anytypeio.anytype.core_models.Id import com.anytypeio.anytype.core_models.Key import com.anytypeio.anytype.core_models.Url +import com.anytypeio.anytype.core_models.restrictions.ObjectRestriction import com.anytypeio.anytype.core_utils.ext.Mimetype import com.anytypeio.anytype.presentation.objects.ObjectIcon @@ -82,12 +83,6 @@ sealed class Command { } sealed class OpenObjectRelationScreen : Command() { - data class RelationList( - val ctx: String, - val target: String?, - val isLocked: Boolean - ) : OpenObjectRelationScreen() - data class RelationAdd(val ctx: String, val target: String) : OpenObjectRelationScreen() sealed class Value : OpenObjectRelationScreen() { abstract val isReadOnlyValue: Boolean diff --git a/presentation/src/main/java/com/anytypeio/anytype/presentation/objects/ObjectRestrictionProvider.kt b/presentation/src/main/java/com/anytypeio/anytype/presentation/objects/ObjectRestrictionProvider.kt new file mode 100644 index 0000000000..db7ac72a62 --- /dev/null +++ b/presentation/src/main/java/com/anytypeio/anytype/presentation/objects/ObjectRestrictionProvider.kt @@ -0,0 +1,7 @@ +package com.anytypeio.anytype.presentation.objects + +import com.anytypeio.anytype.core_models.restrictions.ObjectRestriction + +interface ObjectRestrictionProvider { + fun provide() : List +} \ No newline at end of file diff --git a/presentation/src/main/java/com/anytypeio/anytype/presentation/relations/ObjectRelationListViewModelFactory.kt b/presentation/src/main/java/com/anytypeio/anytype/presentation/relations/ObjectRelationListViewModelFactory.kt index 3ba7a8302e..10b91be2c9 100644 --- a/presentation/src/main/java/com/anytypeio/anytype/presentation/relations/ObjectRelationListViewModelFactory.kt +++ b/presentation/src/main/java/com/anytypeio/anytype/presentation/relations/ObjectRelationListViewModelFactory.kt @@ -12,6 +12,7 @@ import com.anytypeio.anytype.domain.relations.AddToFeaturedRelations import com.anytypeio.anytype.domain.relations.DeleteRelationFromObject import com.anytypeio.anytype.domain.relations.RemoveFromFeaturedRelations import com.anytypeio.anytype.presentation.objects.LockedStateProvider +import com.anytypeio.anytype.presentation.objects.ObjectRestrictionProvider import com.anytypeio.anytype.presentation.relations.providers.RelationListProvider import com.anytypeio.anytype.presentation.util.Dispatcher @@ -26,7 +27,8 @@ class ObjectRelationListViewModelFactory( private val deleteRelationFromObject: DeleteRelationFromObject, private val analytics: Analytics, private val storeOfRelations: StoreOfRelations, - private val addRelationToObject: AddRelationToObject + private val addRelationToObject: AddRelationToObject, + private val restrictions: ObjectRestrictionProvider ) : ViewModelProvider.Factory { @Suppress("UNCHECKED_CAST") @@ -42,7 +44,8 @@ class ObjectRelationListViewModelFactory( deleteRelationFromObject = deleteRelationFromObject, analytics = analytics, storeOfRelations = storeOfRelations, - addRelationToObject = addRelationToObject + addRelationToObject = addRelationToObject, + objectRestrictionProvider = restrictions ) as T } } \ No newline at end of file diff --git a/presentation/src/main/java/com/anytypeio/anytype/presentation/relations/RelationListViewModel.kt b/presentation/src/main/java/com/anytypeio/anytype/presentation/relations/RelationListViewModel.kt index 07ddefc4a2..a53da92857 100644 --- a/presentation/src/main/java/com/anytypeio/anytype/presentation/relations/RelationListViewModel.kt +++ b/presentation/src/main/java/com/anytypeio/anytype/presentation/relations/RelationListViewModel.kt @@ -14,6 +14,7 @@ import com.anytypeio.anytype.core_models.Payload import com.anytypeio.anytype.core_models.RelationFormat import com.anytypeio.anytype.core_models.RelationLink import com.anytypeio.anytype.core_models.ext.mapToObjectWrapperType +import com.anytypeio.anytype.core_models.restrictions.ObjectRestriction import com.anytypeio.anytype.core_utils.diff.DefaultObjectDiffIdentifier import com.anytypeio.anytype.domain.misc.UrlBuilder import com.anytypeio.anytype.domain.`object`.UpdateDetail @@ -27,6 +28,7 @@ import com.anytypeio.anytype.presentation.common.BaseViewModel import com.anytypeio.anytype.presentation.extension.sendAnalyticsRelationDeleteEvent import com.anytypeio.anytype.presentation.extension.sendAnalyticsRelationValueEvent import com.anytypeio.anytype.presentation.objects.LockedStateProvider +import com.anytypeio.anytype.presentation.objects.ObjectRestrictionProvider import com.anytypeio.anytype.presentation.objects.getProperType import com.anytypeio.anytype.presentation.relations.model.RelationOperationError import com.anytypeio.anytype.presentation.relations.providers.RelationListProvider @@ -41,6 +43,7 @@ import timber.log.Timber class RelationListViewModel( private val relationListProvider: RelationListProvider, + private val objectRestrictionProvider: ObjectRestrictionProvider, private val lockedStateProvider: LockedStateProvider, private val urlBuilder: UrlBuilder, private val dispatcher: Dispatcher, @@ -60,6 +63,7 @@ class RelationListViewModel( private val isInAddMode = MutableStateFlow(false) val commands = MutableSharedFlow(replay = 0) val views = MutableStateFlow>(emptyList()) + val restrictions = MutableStateFlow(objectRestrictionProvider.provide()) fun onStartListMode(ctx: Id) { Timber.d("onStartListMode, ctx: $ctx") diff --git a/presentation/src/main/java/com/anytypeio/anytype/presentation/sets/state/ObjectStateReducer.kt b/presentation/src/main/java/com/anytypeio/anytype/presentation/sets/state/ObjectStateReducer.kt index 6359a3f34f..217c62508b 100644 --- a/presentation/src/main/java/com/anytypeio/anytype/presentation/sets/state/ObjectStateReducer.kt +++ b/presentation/src/main/java/com/anytypeio/anytype/presentation/sets/state/ObjectStateReducer.kt @@ -1,10 +1,12 @@ package com.anytypeio.anytype.presentation.sets.state import com.anytypeio.anytype.core_models.Event +import com.anytypeio.anytype.core_models.restrictions.ObjectRestriction +import com.anytypeio.anytype.presentation.objects.ObjectRestrictionProvider import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharedFlow -interface ObjectStateReducer { +interface ObjectStateReducer : ObjectRestrictionProvider { val state: MutableStateFlow val effects: SharedFlow> @@ -13,4 +15,13 @@ interface ObjectStateReducer { suspend fun dispatch(events: List) fun reduce(state: ObjectState, events: List): DefaultObjectStateReducer.Transformation fun clear() + + override fun provide(): List { + return when(val value = state.value) { + is ObjectState.DataView.Collection -> value.objectRestrictions + is ObjectState.DataView.Set -> value.objectRestrictions + ObjectState.ErrorLayout -> emptyList() + ObjectState.Init -> emptyList() + } + } } \ No newline at end of file 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 222f7a095f..358b9f5c8c 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 @@ -164,7 +164,7 @@ fun List.parseWidgets( } Block.Content.Widget.Layout.VIEW -> { - + // Do nothing. } } }