diff --git a/.gitignore b/.gitignore index 15dde8e3d..01bfec063 100644 --- a/.gitignore +++ b/.gitignore @@ -13,7 +13,8 @@ /analytics/gradle.properties .DS_Store **/build -/libs +/libs/build +/libs/lib.aar /captures .externalNativeBuild ktlint diff --git a/Makefile b/Makefile index 740f11629..b37514d65 100644 --- a/Makefile +++ b/Makefile @@ -15,3 +15,5 @@ enable_analytics_for_debug: pr_check: compile_android_test_sources test_debug_all +setup_local_mw: + ./gradlew libs:publishToMavenLocal diff --git a/RELATIONS_REFACTORING.md b/RELATIONS_REFACTORING.md new file mode 100644 index 000000000..a05e7674f --- /dev/null +++ b/RELATIONS_REFACTORING.md @@ -0,0 +1,37 @@ + + +# Relations as object +New API docs [here](https://linear.app/anytype/document/new-api-59b2f463bb78) + +### New Api +- [ ] ObjectCreateRelation +- [ ] ObjectCreateRelationOption +- [ ] RelationListRemoveOption +- [ ] RelationOptions + +### Removed or deprecated API: +#### DataView +- [ ] BlockDataviewRecordCreate +- [ ] BlockDataviewRecordUpdate +- [ ] BlockDataviewRecordDelete +- [ ] BlockDataviewRecordRelationOptionAdd +- [ ] BlockDataviewRecordRelationOptionUpdate +- [ ] BlockDataviewRecordRelationOptionDelete +- [ ] BlockDataviewRelationUpdate + +#### Relations +- [ ] ObjectRelationOptionAdd +- [ ] ObjectRelationOptionUpdate +- [ ] ObjectRelationOptionDelete +- [ ] ObjectRelationUpdate + +#### Types +- [ ] ObjectTypeList + +##### Classes to update +- [ ] android-anytype/middleware/***/Middleware.kt +- [ ] android-anytype/middleware/***/MiddlewareService.kt +- [ ] android-anytype/middleware/***/MiddlewareServiceImplementation.kt +- [ ] android-anytype/middleware/***/MiddlewareEventChannel.kt +- [ ] android-anytype/middleware/***/MiddlewareEventMapper.kt +- [ ] android-anytype/middleware/***/ToCoreModelMappers.kt \ No newline at end of file diff --git a/app/src/androidTest/java/com/anytypeio/anytype/features/editor/SlashWidgetTesting.kt b/app/src/androidTest/java/com/anytypeio/anytype/features/editor/SlashWidgetTesting.kt index 5c09a565a..c756c4e44 100644 --- a/app/src/androidTest/java/com/anytypeio/anytype/features/editor/SlashWidgetTesting.kt +++ b/app/src/androidTest/java/com/anytypeio/anytype/features/editor/SlashWidgetTesting.kt @@ -14,9 +14,10 @@ import androidx.test.filters.LargeTest import com.anytypeio.anytype.R import com.anytypeio.anytype.core_models.Block import com.anytypeio.anytype.core_models.Event -import com.anytypeio.anytype.core_models.ObjectType +import com.anytypeio.anytype.core_models.ObjectWrapper import com.anytypeio.anytype.core_models.Position import com.anytypeio.anytype.core_models.Relation +import com.anytypeio.anytype.core_models.Relations import com.anytypeio.anytype.core_models.StubBookmark import com.anytypeio.anytype.core_ui.features.editor.slash.holders.MainMenuHolder import com.anytypeio.anytype.core_ui.features.editor.slash.holders.MediaMenuHolder @@ -478,29 +479,15 @@ class SlashWidgetTesting : EditorTestSetup() { val document = listOf(page, header, title, paragraph) val objectTypes = listOf( - ObjectType( - url = MockDataFactory.randomUuid(), - name = MockDataFactory.randomString(), - emoji = MockDataFactory.randomString(), - layout = ObjectType.Layout.BASIC, - relations = emptyList(), - description = MockDataFactory.randomString(), - isHidden = false, - smartBlockTypes = listOf(), - isArchived = false, - isReadOnly = false + ObjectWrapper.Type( + mapOf( + Relations.ID to MockDataFactory.randomUuid() + ) ), - ObjectType( - url = MockDataFactory.randomUuid(), - name = MockDataFactory.randomString(), - emoji = MockDataFactory.randomString(), - layout = ObjectType.Layout.BASIC, - relations = emptyList(), - description = MockDataFactory.randomString(), - isHidden = false, - smartBlockTypes = listOf(), - isArchived = false, - isReadOnly = false + ObjectWrapper.Type( + mapOf( + Relations.ID to MockDataFactory.randomUuid() + ) ) ) diff --git a/app/src/androidTest/java/com/anytypeio/anytype/features/editor/base/EditorTestSetup.kt b/app/src/androidTest/java/com/anytypeio/anytype/features/editor/base/EditorTestSetup.kt index d1eff771d..017d67bfb 100644 --- a/app/src/androidTest/java/com/anytypeio/anytype/features/editor/base/EditorTestSetup.kt +++ b/app/src/androidTest/java/com/anytypeio/anytype/features/editor/base/EditorTestSetup.kt @@ -11,12 +11,11 @@ import com.anytypeio.anytype.core_models.Command import com.anytypeio.anytype.core_models.DocumentInfo import com.anytypeio.anytype.core_models.Event 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.Payload import com.anytypeio.anytype.core_models.Relation import com.anytypeio.anytype.core_utils.tools.FeatureToggles import com.anytypeio.anytype.domain.`object`.ConvertObjectToSet -import com.anytypeio.anytype.domain.`object`.ObjectTypesProvider import com.anytypeio.anytype.domain.`object`.UpdateDetail import com.anytypeio.anytype.domain.base.AppCoroutineDispatchers import com.anytypeio.anytype.domain.base.Either @@ -54,15 +53,16 @@ import com.anytypeio.anytype.domain.config.Gateway import com.anytypeio.anytype.domain.config.UserSettingsRepository import com.anytypeio.anytype.domain.cover.RemoveDocCover import com.anytypeio.anytype.domain.cover.SetDocCoverImage -import com.anytypeio.anytype.domain.dataview.interactor.GetCompatibleObjectTypes -import com.anytypeio.anytype.domain.search.SearchObjects -import com.anytypeio.anytype.domain.relations.SetRelationKey import com.anytypeio.anytype.domain.download.DownloadFile import com.anytypeio.anytype.domain.event.interactor.InterceptEvents import com.anytypeio.anytype.domain.icon.DocumentEmojiIconProvider import com.anytypeio.anytype.domain.icon.SetDocumentImageIcon import com.anytypeio.anytype.domain.launch.GetDefaultEditorType import com.anytypeio.anytype.domain.misc.UrlBuilder +import com.anytypeio.anytype.domain.objects.DefaultStoreOfObjectTypes +import com.anytypeio.anytype.domain.objects.DefaultStoreOfRelations +import com.anytypeio.anytype.domain.objects.StoreOfObjectTypes +import com.anytypeio.anytype.domain.objects.StoreOfRelations import com.anytypeio.anytype.domain.page.CloseBlock import com.anytypeio.anytype.domain.page.CreateDocument import com.anytypeio.anytype.domain.page.CreateNewDocument @@ -73,6 +73,8 @@ import com.anytypeio.anytype.domain.page.Redo import com.anytypeio.anytype.domain.page.Undo import com.anytypeio.anytype.domain.page.bookmark.CreateBookmarkBlock import com.anytypeio.anytype.domain.page.bookmark.SetupBookmark +import com.anytypeio.anytype.domain.relations.SetRelationKey +import com.anytypeio.anytype.domain.search.SearchObjects import com.anytypeio.anytype.domain.sets.FindObjectSetForType import com.anytypeio.anytype.domain.status.InterceptThreadStatus import com.anytypeio.anytype.domain.status.ThreadStatusChannel @@ -98,6 +100,7 @@ import com.anytypeio.anytype.presentation.editor.selection.SelectionStateHolder import com.anytypeio.anytype.presentation.editor.template.DefaultEditorTemplateDelegate import com.anytypeio.anytype.presentation.editor.template.EditorTemplateDelegate import com.anytypeio.anytype.presentation.editor.toggle.ToggleStateHolder +import com.anytypeio.anytype.presentation.search.ObjectSearchConstants import com.anytypeio.anytype.presentation.util.CopyFileToCacheDirectory import com.anytypeio.anytype.presentation.util.Dispatcher import com.anytypeio.anytype.presentation.util.downloader.MiddlewareShareDownloader @@ -133,8 +136,6 @@ open class EditorTestSetup { lateinit var move: Move lateinit var setRelationKey: SetRelationKey lateinit var updateDetail: UpdateDetail - lateinit var getCompatibleObjectTypes: GetCompatibleObjectTypes - lateinit var copyFileToCacheDirectory: CopyFileToCacheDirectory @@ -242,9 +243,6 @@ open class EditorTestSetup { @Mock lateinit var documentEmojiIconProvider: DocumentEmojiIconProvider - @Mock - lateinit var objectTypesProvider: ObjectTypesProvider - @Mock lateinit var createTable: CreateTable @@ -270,6 +268,9 @@ open class EditorTestSetup { intents = intents ) + private val storeOfRelations: StoreOfRelations = DefaultStoreOfRelations() + private val storeOfObjectTypes: StoreOfObjectTypes = DefaultStoreOfObjectTypes() + open fun setup() { MockitoAnnotations.openMocks(this) @@ -322,7 +323,6 @@ open class EditorTestSetup { removeDocCover = RemoveDocCover(repo) turnIntoStyle = TurnIntoStyle(repo) updateDetail = UpdateDetail(repo) - getCompatibleObjectTypes = GetCompatibleObjectTypes(repo) getDefaultEditorType = GetDefaultEditorType(userSettingsRepository) createObjectSet = CreateObjectSet(repo) findObjectSetForType = FindObjectSetForType(repo) @@ -357,7 +357,8 @@ open class EditorTestSetup { renderer = DefaultBlockViewRenderer( urlBuilder = urlBuilder, toggleStateHolder = ToggleStateHolder.Default(), - coverImageHashProvider = coverImageHashProvider + coverImageHashProvider = coverImageHashProvider, + storeOfRelations = storeOfRelations ), orchestrator = Orchestrator( createBlock = createBlock, @@ -411,8 +412,6 @@ open class EditorTestSetup { dispatcher = Dispatcher.Default(), detailModificationManager = InternalDetailModificationManager(stores.details), updateDetail = updateDetail, - getCompatibleObjectTypes = getCompatibleObjectTypes, - objectTypesProvider = objectTypesProvider, searchObjects = getSearchObjects, getDefaultEditorType = getDefaultEditorType, createObjectSet = createObjectSet, @@ -425,6 +424,8 @@ open class EditorTestSetup { editorTemplateDelegate = editorTemplateDelegate, createNewObject = createNewObject, objectToSet = objectToSet, + storeOfRelations = storeOfRelations, + storeOfObjectTypes = storeOfObjectTypes, featureToggles = featureToggles, tableDelegate = tableDelegate ) @@ -505,9 +506,18 @@ open class EditorTestSetup { } } - fun stubGetObjectTypes(objectTypes: List) { + fun stubGetObjectTypes(objectTypes: List) { repo.stub { - onBlocking { getObjectTypes() } doReturn objectTypes + onBlocking { + searchObjects( + filters = ObjectSearchConstants.filterObjectType, + keys = ObjectSearchConstants.defaultKeysObjectType, + sorts = emptyList(), + limit = 0, + offset = 0, + fulltext = "" + ) + } doReturn objectTypes.map { it.map } } } diff --git a/app/src/androidTest/java/com/anytypeio/anytype/features/relations/AddRelationStatusValueTest.kt b/app/src/androidTest/java/com/anytypeio/anytype/features/relations/AddRelationStatusValueTest.kt index cda81bbef..e20e3cab0 100644 --- a/app/src/androidTest/java/com/anytypeio/anytype/features/relations/AddRelationStatusValueTest.kt +++ b/app/src/androidTest/java/com/anytypeio/anytype/features/relations/AddRelationStatusValueTest.kt @@ -10,26 +10,30 @@ import com.anytypeio.anytype.R import com.anytypeio.anytype.analytics.base.Analytics 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.Payload import com.anytypeio.anytype.core_models.Relation +import com.anytypeio.anytype.core_models.StubRelationOptionObject import com.anytypeio.anytype.core_models.ThemeColor import com.anytypeio.anytype.core_ui.extensions.dark import com.anytypeio.anytype.domain.`object`.UpdateDetail import com.anytypeio.anytype.domain.block.repo.BlockRepository import com.anytypeio.anytype.domain.config.Gateway -import com.anytypeio.anytype.domain.dataview.interactor.AddDataViewRelationOption import com.anytypeio.anytype.domain.misc.UrlBuilder import com.anytypeio.anytype.domain.objects.DefaultObjectStore +import com.anytypeio.anytype.domain.objects.DefaultStoreOfRelations import com.anytypeio.anytype.domain.objects.ObjectStore -import com.anytypeio.anytype.domain.relations.AddObjectRelationOption +import com.anytypeio.anytype.domain.objects.StoreOfRelations +import com.anytypeio.anytype.domain.objects.options.GetOptions +import com.anytypeio.anytype.domain.relations.CreateRelationOption import com.anytypeio.anytype.presentation.relations.ObjectSetConfig import com.anytypeio.anytype.presentation.relations.add.AddOptionsRelationDVViewModel import com.anytypeio.anytype.presentation.relations.add.AddOptionsRelationProvider import com.anytypeio.anytype.presentation.relations.providers.DataViewObjectRelationProvider import com.anytypeio.anytype.presentation.relations.providers.DataViewObjectValueProvider +import com.anytypeio.anytype.presentation.relations.providers.ObjectDetailProvider import com.anytypeio.anytype.presentation.sets.ObjectSet import com.anytypeio.anytype.presentation.sets.ObjectSetDatabase -import com.anytypeio.anytype.presentation.sets.ObjectSetSession import com.anytypeio.anytype.presentation.util.Dispatcher import com.anytypeio.anytype.test_utils.MockDataFactory import com.anytypeio.anytype.test_utils.utils.checkHasText @@ -74,9 +78,12 @@ class AddRelationStatusValueTest { @Mock lateinit var analytics: Analytics - private lateinit var addRelationOption: AddDataViewRelationOption - private lateinit var addObjectRelationOption: AddObjectRelationOption + @Mock + lateinit var objectDetailProvider: ObjectDetailProvider + + private lateinit var createRelationOption: CreateRelationOption private lateinit var updateDetail: UpdateDetail + private lateinit var getOptions: GetOptions private lateinit var urlBuilder: UrlBuilder @get:Rule @@ -88,25 +95,31 @@ class AddRelationStatusValueTest { private val ctx = MockDataFactory.randomUuid() private val state = MutableStateFlow(ObjectSet.init()) private val store : ObjectStore = DefaultObjectStore() + private val storeOfRelations: StoreOfRelations = DefaultStoreOfRelations() private val db = ObjectSetDatabase(store = store) @Before fun setup() { MockitoAnnotations.openMocks(this) - addRelationOption = AddDataViewRelationOption(repo) - addObjectRelationOption = AddObjectRelationOption(repo) + createRelationOption = CreateRelationOption(repo) + getOptions = GetOptions(repo) updateDetail = UpdateDetail(repo) urlBuilder = UrlBuilder(gateway) TestRelationOptionValueDVAddFragment.testVmFactory = AddOptionsRelationDVViewModel.Factory( - relations = DataViewObjectRelationProvider(state), + relations = DataViewObjectRelationProvider( + objectSetState = state, + storeOfRelations = storeOfRelations + ), values = DataViewObjectValueProvider( db = db ), - addDataViewRelationOption = addRelationOption, dispatcher = dispatcher, optionsProvider = AddOptionsRelationProvider(), setObjectDetail = updateDetail, - analytics = analytics + analytics = analytics, + createRelationOption = createRelationOption, + detailsProvider = objectDetailProvider, + getOptions = getOptions ) } @@ -156,34 +169,9 @@ class AddRelationStatusValueTest { ) ) - state.value = ObjectSet( - blocks = listOf(dv), -// viewerDb = mapOf( -// viewer.id to ObjectSet.ViewerData( -// records = listOf(record), -// total = 1 -// ) -// ) - ) + state.value = ObjectSet(blocks = listOf(dv)) - repo.stub { - onBlocking { - addDataViewRelationOption( - ctx = any(), - dataview = any(), - relation = any(), - color = any(), - name = any(), - record = any() - ) - } doReturn Pair( - Payload( - context = ctx, - events = emptyList() - ), - MockDataFactory.randomUuid() - ) - } + stubCreateRelationOption() // TESTING @@ -213,16 +201,7 @@ class AddRelationStatusValueTest { // Verifying that the request is made. - verifyBlocking(repo, times(1)) { - addDataViewRelationOption( - ctx = any(), - dataview = any(), - relation = any(), - color = any(), - name = any(), - record = any() - ) - } + verifyCreateRelationOptionCalled() } @Test @@ -281,24 +260,7 @@ class AddRelationStatusValueTest { // ) ) - repo.stub { - onBlocking { - addDataViewRelationOption( - ctx = any(), - dataview = any(), - relation = any(), - color = any(), - name = any(), - record = any() - ) - } doReturn Pair( - Payload( - context = ctx, - events = emptyList() - ), - MockDataFactory.randomUuid() - ) - } + stubCreateRelationOption() // TESTING @@ -610,14 +572,10 @@ class AddRelationStatusValueTest { // Veryfying UI verifyBlocking(repo, times(1)) { - updateDataViewRecord( - context = ctx, - target = dv.id, - record = target, - values = mapOf( - ObjectSetConfig.ID_KEY to target, - relationKey to listOf(option2.id) - ) + updateDetail( + ctx = target, + key = relationKey, + value = listOf(option2.id) ) } } @@ -628,4 +586,35 @@ class AddRelationStatusValueTest { themeResId = R.style.AppTheme ) } + + private fun verifyCreateRelationOptionCalled() { + verifyBlocking(repo, times(1)) { + createRelationOption( + relation = any(), + color = any(), + name = any() + ) + } + } + + private fun stubCreateRelationOption( + relation: Key = MockDataFactory.randomUuid(), + name: String = MockDataFactory.randomString(), + id: Id = MockDataFactory.randomUuid(), + color: String = ThemeColor.values().random().code + ) { + repo.stub { + onBlocking { + createRelationOption( + relation = relation, + color = color, + name = name + ) + } doReturn StubRelationOptionObject( + id = id, + text = name, + color = color + ) + } + } } \ No newline at end of file diff --git a/app/src/androidTest/java/com/anytypeio/anytype/features/relations/AddRelationTagValueTest.kt b/app/src/androidTest/java/com/anytypeio/anytype/features/relations/AddRelationTagValueTest.kt index 8158026a3..c8e6deab4 100644 --- a/app/src/androidTest/java/com/anytypeio/anytype/features/relations/AddRelationTagValueTest.kt +++ b/app/src/androidTest/java/com/anytypeio/anytype/features/relations/AddRelationTagValueTest.kt @@ -12,24 +12,27 @@ import com.anytypeio.anytype.core_models.Block import com.anytypeio.anytype.core_models.Id import com.anytypeio.anytype.core_models.Payload import com.anytypeio.anytype.core_models.Relation +import com.anytypeio.anytype.core_models.StubRelationOptionObject import com.anytypeio.anytype.core_models.ThemeColor import com.anytypeio.anytype.core_ui.extensions.dark import com.anytypeio.anytype.domain.`object`.UpdateDetail import com.anytypeio.anytype.domain.block.repo.BlockRepository import com.anytypeio.anytype.domain.config.Gateway -import com.anytypeio.anytype.domain.dataview.interactor.AddDataViewRelationOption import com.anytypeio.anytype.domain.misc.UrlBuilder import com.anytypeio.anytype.domain.objects.DefaultObjectStore +import com.anytypeio.anytype.domain.objects.DefaultStoreOfRelations import com.anytypeio.anytype.domain.objects.ObjectStore -import com.anytypeio.anytype.domain.relations.AddObjectRelationOption +import com.anytypeio.anytype.domain.objects.StoreOfRelations +import com.anytypeio.anytype.domain.objects.options.GetOptions +import com.anytypeio.anytype.domain.relations.CreateRelationOption import com.anytypeio.anytype.presentation.relations.ObjectSetConfig import com.anytypeio.anytype.presentation.relations.add.AddOptionsRelationDVViewModel import com.anytypeio.anytype.presentation.relations.add.AddOptionsRelationProvider import com.anytypeio.anytype.presentation.relations.providers.DataViewObjectRelationProvider import com.anytypeio.anytype.presentation.relations.providers.DataViewObjectValueProvider +import com.anytypeio.anytype.presentation.relations.providers.ObjectDetailProvider import com.anytypeio.anytype.presentation.sets.ObjectSet import com.anytypeio.anytype.presentation.sets.ObjectSetDatabase -import com.anytypeio.anytype.presentation.sets.ObjectSetSession import com.anytypeio.anytype.presentation.util.Dispatcher import com.anytypeio.anytype.test_utils.MockDataFactory import com.anytypeio.anytype.test_utils.utils.checkHasText @@ -73,9 +76,12 @@ class AddRelationTagValueTest { @Mock lateinit var analytics: Analytics - private lateinit var addRelationOption: AddDataViewRelationOption - private lateinit var addObjectRelationOption: AddObjectRelationOption + @Mock + lateinit var objectDetailProvider: ObjectDetailProvider + + private lateinit var createRelationOption: CreateRelationOption private lateinit var updateDetail: UpdateDetail + private lateinit var getOptions: GetOptions private lateinit var urlBuilder: UrlBuilder @get:Rule @@ -87,23 +93,29 @@ class AddRelationTagValueTest { private val ctx = MockDataFactory.randomUuid() private val state = MutableStateFlow(ObjectSet.init()) private val store : ObjectStore = DefaultObjectStore() + private val storeOfRelations: StoreOfRelations = DefaultStoreOfRelations() private val db = ObjectSetDatabase(store = store) @Before fun setup() { MockitoAnnotations.openMocks(this) - addRelationOption = AddDataViewRelationOption(repo) - addObjectRelationOption = AddObjectRelationOption(repo) + createRelationOption = CreateRelationOption(repo) + getOptions = GetOptions(repo) updateDetail = UpdateDetail(repo) urlBuilder = UrlBuilder(gateway) TestRelationOptionValueDVAddFragment.testVmFactory = AddOptionsRelationDVViewModel.Factory( - relations = DataViewObjectRelationProvider(state), + relations = DataViewObjectRelationProvider( + objectSetState = state, + storeOfRelations = storeOfRelations + ), values = DataViewObjectValueProvider(db = db), - addDataViewRelationOption = addRelationOption, + createRelationOption = createRelationOption, dispatcher = dispatcher, optionsProvider = AddOptionsRelationProvider(), analytics = analytics, - setObjectDetail = updateDetail + setObjectDetail = updateDetail, + detailsProvider = objectDetailProvider, + getOptions = getOptions ) } @@ -163,24 +175,7 @@ class AddRelationTagValueTest { // ) ) - repo.stub { - onBlocking { - addDataViewRelationOption( - ctx = any(), - dataview = any(), - relation = any(), - color = any(), - name = any(), - record = any() - ) - } doReturn Pair( - Payload( - context = ctx, - events = emptyList() - ), - MockDataFactory.randomUuid() - ) - } + stubCreateRelationOption() // TESTING @@ -212,16 +207,7 @@ class AddRelationTagValueTest { // Verifying that the request is made. - verifyBlocking(repo, times(1)) { - addDataViewRelationOption( - ctx = any(), - dataview = any(), - relation = any(), - color = any(), - name = any(), - record = any() - ) - } + verifyCreateRelationOptionCalled() } @Test @@ -533,14 +519,10 @@ class AddRelationTagValueTest { R.id.btnAdd.performClick() verifyBlocking(repo, times(1)) { - updateDataViewRecord( - context = ctx, - target = dv.id, - record = target, - values = mapOf( - ObjectSetConfig.ID_KEY to target, - relationKey to listOf(option1.id, option2.id) - ) + updateDetail( + ctx = target, + key = relationKey, + value = listOf(option1.id, option2.id) ) } } @@ -551,4 +533,34 @@ class AddRelationTagValueTest { themeResId = R.style.AppTheme ) } + + private fun verifyCreateRelationOptionCalled() { + verifyBlocking(repo, times(1)) { + createRelationOption( + relation = any(), + color = any(), + name = any() + ) + } + } + + private fun stubCreateRelationOption( + name: String = MockDataFactory.randomString(), + id: Id = MockDataFactory.randomUuid(), + color: String = ThemeColor.values().random().code + ) { + repo.stub { + onBlocking { + createRelationOption( + relation = any(), + color = any(), + name = any() + ) + } doReturn StubRelationOptionObject( + id = id, + text = name, + color = color + ) + } + } } \ No newline at end of file diff --git a/app/src/androidTest/java/com/anytypeio/anytype/features/relations/DisplayObjectRelationTextValueTest.kt b/app/src/androidTest/java/com/anytypeio/anytype/features/relations/DisplayObjectRelationTextValueTest.kt index 946231584..44b74081d 100644 --- a/app/src/androidTest/java/com/anytypeio/anytype/features/relations/DisplayObjectRelationTextValueTest.kt +++ b/app/src/androidTest/java/com/anytypeio/anytype/features/relations/DisplayObjectRelationTextValueTest.kt @@ -19,13 +19,14 @@ import com.anytypeio.anytype.core_models.Block import com.anytypeio.anytype.core_models.Relation import com.anytypeio.anytype.domain.`object`.ReloadObject import com.anytypeio.anytype.domain.objects.DefaultObjectStore +import com.anytypeio.anytype.domain.objects.DefaultStoreOfRelations import com.anytypeio.anytype.domain.objects.ObjectStore +import com.anytypeio.anytype.domain.objects.StoreOfRelations import com.anytypeio.anytype.presentation.relations.ObjectSetConfig import com.anytypeio.anytype.presentation.relations.providers.DataViewObjectRelationProvider import com.anytypeio.anytype.presentation.relations.providers.DataViewObjectValueProvider import com.anytypeio.anytype.presentation.sets.ObjectSet import com.anytypeio.anytype.presentation.sets.ObjectSetDatabase -import com.anytypeio.anytype.presentation.sets.ObjectSetSession import com.anytypeio.anytype.presentation.sets.RelationTextValueViewModel import com.anytypeio.anytype.test_utils.MockDataFactory import com.anytypeio.anytype.test_utils.utils.espresso.TextLineCountMatcher @@ -61,13 +62,17 @@ class DisplayObjectRelationTextValueTest { private val state = MutableStateFlow(ObjectSet.init()) private val store: ObjectStore = DefaultObjectStore() + private val storeOfRelations: StoreOfRelations = DefaultStoreOfRelations() private val db = ObjectSetDatabase(store = store) @Before fun before() { MockitoAnnotations.openMocks(this) TestRelationTextValueFragment.testVmFactory = RelationTextValueViewModel.Factory( - relations = DataViewObjectRelationProvider(state), + relations = DataViewObjectRelationProvider( + objectSetState = state, + storeOfRelations = storeOfRelations + ), values = DataViewObjectValueProvider(db = db), reloadObject = reloadObject, analytics = analytics diff --git a/app/src/androidTest/java/com/anytypeio/anytype/features/relations/DisplayRelationNumberValueTest.kt b/app/src/androidTest/java/com/anytypeio/anytype/features/relations/DisplayRelationNumberValueTest.kt index 90ad9b8ac..5823ccd26 100644 --- a/app/src/androidTest/java/com/anytypeio/anytype/features/relations/DisplayRelationNumberValueTest.kt +++ b/app/src/androidTest/java/com/anytypeio/anytype/features/relations/DisplayRelationNumberValueTest.kt @@ -18,13 +18,14 @@ import com.anytypeio.anytype.domain.`object`.ReloadObject import com.anytypeio.anytype.domain.block.repo.BlockRepository import com.anytypeio.anytype.domain.config.Gateway import com.anytypeio.anytype.domain.objects.DefaultObjectStore +import com.anytypeio.anytype.domain.objects.DefaultStoreOfRelations import com.anytypeio.anytype.domain.objects.ObjectStore +import com.anytypeio.anytype.domain.objects.StoreOfRelations import com.anytypeio.anytype.presentation.relations.ObjectSetConfig import com.anytypeio.anytype.presentation.relations.providers.DataViewObjectRelationProvider import com.anytypeio.anytype.presentation.relations.providers.DataViewObjectValueProvider import com.anytypeio.anytype.presentation.sets.ObjectSet import com.anytypeio.anytype.presentation.sets.ObjectSetDatabase -import com.anytypeio.anytype.presentation.sets.ObjectSetSession import com.anytypeio.anytype.presentation.sets.RelationTextValueViewModel import com.anytypeio.anytype.presentation.util.Dispatcher import com.anytypeio.anytype.test_utils.MockDataFactory @@ -69,13 +70,17 @@ class DisplayRelationNumberValueTest { private val root = MockDataFactory.randomUuid() private val state = MutableStateFlow(ObjectSet.init()) private val store: ObjectStore = DefaultObjectStore() + private val storeOfRelations: StoreOfRelations = DefaultStoreOfRelations() private val db = ObjectSetDatabase(store = store) @Before fun setup() { MockitoAnnotations.openMocks(this) TestRelationTextValueFragment.testVmFactory = RelationTextValueViewModel.Factory( - relations = DataViewObjectRelationProvider(state), + relations = DataViewObjectRelationProvider( + objectSetState = state, + storeOfRelations = storeOfRelations + ), values = DataViewObjectValueProvider(db = db), reloadObject = reloadObject, analytics = analytics diff --git a/app/src/androidTest/java/com/anytypeio/anytype/features/relations/DisplayRelationObjectValueTest.kt b/app/src/androidTest/java/com/anytypeio/anytype/features/relations/DisplayRelationObjectValueTest.kt index bfae5bfb4..7a13b7ffe 100644 --- a/app/src/androidTest/java/com/anytypeio/anytype/features/relations/DisplayRelationObjectValueTest.kt +++ b/app/src/androidTest/java/com/anytypeio/anytype/features/relations/DisplayRelationObjectValueTest.kt @@ -18,14 +18,18 @@ import com.anytypeio.anytype.core_models.Id import com.anytypeio.anytype.core_models.ObjectType import com.anytypeio.anytype.core_models.Payload import com.anytypeio.anytype.core_models.Relation -import com.anytypeio.anytype.domain.`object`.ObjectTypesProvider +import com.anytypeio.anytype.core_models.StubRelationOptionObject +import com.anytypeio.anytype.core_models.ThemeColor import com.anytypeio.anytype.domain.`object`.UpdateDetail import com.anytypeio.anytype.domain.block.repo.BlockRepository import com.anytypeio.anytype.domain.config.Gateway -import com.anytypeio.anytype.domain.dataview.interactor.AddDataViewRelationOption import com.anytypeio.anytype.domain.misc.UrlBuilder import com.anytypeio.anytype.domain.objects.DefaultObjectStore +import com.anytypeio.anytype.domain.objects.DefaultStoreOfObjectTypes +import com.anytypeio.anytype.domain.objects.DefaultStoreOfRelations import com.anytypeio.anytype.domain.objects.ObjectStore +import com.anytypeio.anytype.domain.objects.StoreOfObjectTypes +import com.anytypeio.anytype.domain.objects.StoreOfRelations import com.anytypeio.anytype.domain.relations.AddFileToObject import com.anytypeio.anytype.presentation.relations.ObjectSetConfig import com.anytypeio.anytype.presentation.relations.providers.DataViewObjectRelationProvider @@ -33,7 +37,6 @@ import com.anytypeio.anytype.presentation.relations.providers.DataViewObjectValu import com.anytypeio.anytype.presentation.relations.providers.ObjectDetailProvider import com.anytypeio.anytype.presentation.sets.ObjectSet import com.anytypeio.anytype.presentation.sets.ObjectSetDatabase -import com.anytypeio.anytype.presentation.sets.ObjectSetSession import com.anytypeio.anytype.presentation.sets.RelationValueDVViewModel import com.anytypeio.anytype.presentation.util.CopyFileToCacheDirectory import com.anytypeio.anytype.presentation.util.Dispatcher @@ -53,6 +56,11 @@ import org.junit.Test import org.junit.runner.RunWith import org.mockito.Mock import org.mockito.MockitoAnnotations +import org.mockito.kotlin.any +import org.mockito.kotlin.doReturn +import org.mockito.kotlin.stub +import org.mockito.kotlin.times +import org.mockito.kotlin.verifyBlocking @RunWith(AndroidJUnit4::class) @LargeTest @@ -73,7 +81,6 @@ class DisplayRelationObjectValueTest { @Mock lateinit var copyFileToCacheDirectory: CopyFileToCacheDirectory - private lateinit var addRelationOption: AddDataViewRelationOption private lateinit var updateDetail: UpdateDetail private lateinit var urlBuilder: UrlBuilder private lateinit var addFileToObject: AddFileToObject @@ -87,31 +94,32 @@ class DisplayRelationObjectValueTest { private val root = MockDataFactory.randomUuid() private val state = MutableStateFlow(ObjectSet.init()) private val store: ObjectStore = DefaultObjectStore() + private val storeOfRelations: StoreOfRelations = DefaultStoreOfRelations() + private val storeOfObjectTypes: StoreOfObjectTypes = DefaultStoreOfObjectTypes() private val db = ObjectSetDatabase(store = store) @Before fun setup() { MockitoAnnotations.openMocks(this) - addRelationOption = AddDataViewRelationOption(repo) updateDetail = UpdateDetail(repo) addFileToObject = AddFileToObject(repo) urlBuilder = UrlBuilder(gateway) TestRelationValueDVFragment.testVmFactory = RelationValueDVViewModel.Factory( - relations = DataViewObjectRelationProvider(state), + relations = DataViewObjectRelationProvider( + objectSetState = state, + storeOfRelations = storeOfRelations + ), values = DataViewObjectValueProvider(db = db), details = object: ObjectDetailProvider { override fun provide(): Map = state.value.details }, - types = object : ObjectTypesProvider { - override fun set(objectTypes: List) {} - override fun get(): List = state.value.objectTypes - }, urlBuilder = urlBuilder, copyFileToCache = copyFileToCacheDirectory, analytics = analytics, addFileToObject = addFileToObject, setObjectDetails = updateDetail, - dispatcher = dispatcher + dispatcher = dispatcher, + storeOfObjectTypes = storeOfObjectTypes ) } @@ -348,7 +356,7 @@ class DisplayRelationObjectValueTest { val objectType1 = ObjectType( url = MockDataFactory.randomUuid(), name = "Director", - relations = emptyList(), + relationLinks = emptyList(), emoji = "", layout = ObjectType.Layout.values().random(), description = "", @@ -361,7 +369,7 @@ class DisplayRelationObjectValueTest { val objectType2 = ObjectType( url = MockDataFactory.randomUuid(), name = "Actor", - relations = emptyList(), + relationLinks = emptyList(), emoji = "", layout = ObjectType.Layout.values().random(), description = "", @@ -473,7 +481,7 @@ class DisplayRelationObjectValueTest { val objectType1 = ObjectType( url = MockDataFactory.randomUuid(), name = "Writer", - relations = emptyList(), + relationLinks = emptyList(), emoji = "", layout = ObjectType.Layout.PROFILE, description = "", @@ -486,7 +494,7 @@ class DisplayRelationObjectValueTest { val objectType2 = ObjectType( url = MockDataFactory.randomUuid(), name = "Writer", - relations = emptyList(), + relationLinks = emptyList(), emoji = "", layout = ObjectType.Layout.PROFILE, description = "", @@ -600,7 +608,7 @@ class DisplayRelationObjectValueTest { val objectType1 = ObjectType( url = MockDataFactory.randomUuid(), name = "Writer", - relations = emptyList(), + relationLinks = emptyList(), emoji = "", layout = ObjectType.Layout.PROFILE, description = "", @@ -613,7 +621,7 @@ class DisplayRelationObjectValueTest { val objectType2 = ObjectType( url = MockDataFactory.randomUuid(), name = "Writer", - relations = emptyList(), + relationLinks = emptyList(), emoji = "", layout = ObjectType.Layout.PROFILE, description = "", @@ -714,4 +722,33 @@ class DisplayRelationObjectValueTest { ) } + private fun verifyCreateRelationOptionCalled() { + verifyBlocking(repo, times(1)) { + createRelationOption( + relation = any(), + color = any(), + name = any() + ) + } + } + + private fun stubCreateRelationOption( + name: String = MockDataFactory.randomString(), + id: Id = MockDataFactory.randomUuid(), + color: String = ThemeColor.values().random().code + ) { + repo.stub { + onBlocking { + createRelationOption( + relation = any(), + color = any(), + name = any() + ) + } doReturn StubRelationOptionObject( + id = id, + color = color, + text = name + ) + } + } } \ No newline at end of file diff --git a/app/src/androidTest/java/com/anytypeio/anytype/features/relations/DisplayRelationStatusValueTest.kt b/app/src/androidTest/java/com/anytypeio/anytype/features/relations/DisplayRelationStatusValueTest.kt index 0c2b9f43f..8d9c63737 100644 --- a/app/src/androidTest/java/com/anytypeio/anytype/features/relations/DisplayRelationStatusValueTest.kt +++ b/app/src/androidTest/java/com/anytypeio/anytype/features/relations/DisplayRelationStatusValueTest.kt @@ -15,19 +15,20 @@ import com.anytypeio.anytype.R import com.anytypeio.anytype.analytics.base.Analytics import com.anytypeio.anytype.core_models.Block import com.anytypeio.anytype.core_models.Id -import com.anytypeio.anytype.core_models.ObjectType import com.anytypeio.anytype.core_models.Payload import com.anytypeio.anytype.core_models.Relation +import com.anytypeio.anytype.core_models.ThemeColor import com.anytypeio.anytype.core_ui.extensions.dark -import com.anytypeio.anytype.domain.`object`.ObjectTypesProvider import com.anytypeio.anytype.domain.`object`.UpdateDetail import com.anytypeio.anytype.domain.block.repo.BlockRepository import com.anytypeio.anytype.domain.config.Gateway -import com.anytypeio.anytype.domain.dataview.interactor.AddDataViewRelationOption import com.anytypeio.anytype.domain.misc.UrlBuilder -import com.anytypeio.anytype.core_models.ThemeColor import com.anytypeio.anytype.domain.objects.DefaultObjectStore +import com.anytypeio.anytype.domain.objects.DefaultStoreOfObjectTypes +import com.anytypeio.anytype.domain.objects.DefaultStoreOfRelations import com.anytypeio.anytype.domain.objects.ObjectStore +import com.anytypeio.anytype.domain.objects.StoreOfObjectTypes +import com.anytypeio.anytype.domain.objects.StoreOfRelations import com.anytypeio.anytype.domain.relations.AddFileToObject import com.anytypeio.anytype.presentation.relations.ObjectSetConfig import com.anytypeio.anytype.presentation.relations.providers.DataViewObjectRelationProvider @@ -35,7 +36,6 @@ import com.anytypeio.anytype.presentation.relations.providers.DataViewObjectValu import com.anytypeio.anytype.presentation.relations.providers.ObjectDetailProvider import com.anytypeio.anytype.presentation.sets.ObjectSet import com.anytypeio.anytype.presentation.sets.ObjectSetDatabase -import com.anytypeio.anytype.presentation.sets.ObjectSetSession import com.anytypeio.anytype.presentation.sets.RelationValueDVViewModel import com.anytypeio.anytype.presentation.util.CopyFileToCacheDirectory import com.anytypeio.anytype.presentation.util.Dispatcher @@ -75,7 +75,6 @@ class DisplayRelationStatusValueTest { @Mock lateinit var copyFileToCacheDirectory: CopyFileToCacheDirectory - private lateinit var addRelationOption: AddDataViewRelationOption private lateinit var updateDetail: UpdateDetail private lateinit var addFileToObject: AddFileToObject private lateinit var urlBuilder: UrlBuilder @@ -89,33 +88,34 @@ class DisplayRelationStatusValueTest { private val root = MockDataFactory.randomUuid() private val state = MutableStateFlow(ObjectSet.init()) private val store: ObjectStore = DefaultObjectStore() + private val storeOfRelations: StoreOfRelations = DefaultStoreOfRelations() + private val storeOfObjectTypes: StoreOfObjectTypes = DefaultStoreOfObjectTypes() private val db = ObjectSetDatabase(store) @Before fun setup() { MockitoAnnotations.openMocks(this) - addRelationOption = AddDataViewRelationOption(repo) updateDetail = UpdateDetail(repo) addFileToObject = AddFileToObject(repo) urlBuilder = UrlBuilder(gateway) TestRelationValueDVFragment.testVmFactory = RelationValueDVViewModel.Factory( - relations = DataViewObjectRelationProvider(state), + relations = DataViewObjectRelationProvider( + objectSetState = state, + storeOfRelations = storeOfRelations + ), values = DataViewObjectValueProvider( db = db ), details = object : ObjectDetailProvider { override fun provide(): Map = state.value.details }, - types = object : ObjectTypesProvider { - override fun set(objectTypes: List) {} - override fun get(): List = state.value.objectTypes - }, urlBuilder = urlBuilder, copyFileToCache = copyFileToCacheDirectory, dispatcher = dispatcher, analytics = analytics, setObjectDetails = updateDetail, - addFileToObject = addFileToObject + addFileToObject = addFileToObject, + storeOfObjectTypes = storeOfObjectTypes ) } diff --git a/app/src/androidTest/java/com/anytypeio/anytype/features/relations/DisplayRelationTagValueTest.kt b/app/src/androidTest/java/com/anytypeio/anytype/features/relations/DisplayRelationTagValueTest.kt index 7321eeb04..096389e80 100644 --- a/app/src/androidTest/java/com/anytypeio/anytype/features/relations/DisplayRelationTagValueTest.kt +++ b/app/src/androidTest/java/com/anytypeio/anytype/features/relations/DisplayRelationTagValueTest.kt @@ -15,19 +15,20 @@ import com.anytypeio.anytype.R import com.anytypeio.anytype.analytics.base.Analytics import com.anytypeio.anytype.core_models.Block import com.anytypeio.anytype.core_models.Id -import com.anytypeio.anytype.core_models.ObjectType import com.anytypeio.anytype.core_models.Payload import com.anytypeio.anytype.core_models.Relation +import com.anytypeio.anytype.core_models.ThemeColor import com.anytypeio.anytype.core_ui.extensions.dark -import com.anytypeio.anytype.domain.`object`.ObjectTypesProvider import com.anytypeio.anytype.domain.`object`.UpdateDetail import com.anytypeio.anytype.domain.block.repo.BlockRepository import com.anytypeio.anytype.domain.config.Gateway -import com.anytypeio.anytype.domain.dataview.interactor.AddDataViewRelationOption import com.anytypeio.anytype.domain.misc.UrlBuilder -import com.anytypeio.anytype.core_models.ThemeColor import com.anytypeio.anytype.domain.objects.DefaultObjectStore +import com.anytypeio.anytype.domain.objects.DefaultStoreOfObjectTypes +import com.anytypeio.anytype.domain.objects.DefaultStoreOfRelations import com.anytypeio.anytype.domain.objects.ObjectStore +import com.anytypeio.anytype.domain.objects.StoreOfObjectTypes +import com.anytypeio.anytype.domain.objects.StoreOfRelations import com.anytypeio.anytype.domain.relations.AddFileToObject import com.anytypeio.anytype.presentation.relations.ObjectSetConfig import com.anytypeio.anytype.presentation.relations.providers.DataViewObjectRelationProvider @@ -35,7 +36,6 @@ import com.anytypeio.anytype.presentation.relations.providers.DataViewObjectValu import com.anytypeio.anytype.presentation.relations.providers.ObjectDetailProvider import com.anytypeio.anytype.presentation.sets.ObjectSet import com.anytypeio.anytype.presentation.sets.ObjectSetDatabase -import com.anytypeio.anytype.presentation.sets.ObjectSetSession import com.anytypeio.anytype.presentation.sets.RelationValueDVViewModel import com.anytypeio.anytype.presentation.util.CopyFileToCacheDirectory import com.anytypeio.anytype.presentation.util.Dispatcher @@ -75,7 +75,6 @@ class DisplayRelationTagValueTest { @Mock lateinit var copyFileToCacheDirectory: CopyFileToCacheDirectory - private lateinit var addRelationOption: AddDataViewRelationOption private lateinit var updateDetail: UpdateDetail private lateinit var addFileToObject: AddFileToObject private lateinit var urlBuilder: UrlBuilder @@ -89,31 +88,32 @@ class DisplayRelationTagValueTest { private val root = MockDataFactory.randomUuid() private val state = MutableStateFlow(ObjectSet.init()) private val store: ObjectStore = DefaultObjectStore() + private val storeOfRelations: StoreOfRelations = DefaultStoreOfRelations() private val db = ObjectSetDatabase(store) + private val storeOfObjectTypes: StoreOfObjectTypes = DefaultStoreOfObjectTypes() @Before fun setup() { MockitoAnnotations.openMocks(this) - addRelationOption = AddDataViewRelationOption(repo) updateDetail = UpdateDetail(repo) addFileToObject = AddFileToObject(repo) urlBuilder = UrlBuilder(gateway) TestRelationValueDVFragment.testVmFactory = RelationValueDVViewModel.Factory( - relations = DataViewObjectRelationProvider(state), + relations = DataViewObjectRelationProvider( + objectSetState = state, + storeOfRelations = storeOfRelations + ), values = DataViewObjectValueProvider(db = db), details = object: ObjectDetailProvider { override fun provide(): Map = state.value.details }, - types = object : ObjectTypesProvider { - override fun set(objectTypes: List) {} - override fun get(): List = state.value.objectTypes - }, urlBuilder = urlBuilder, copyFileToCache = copyFileToCacheDirectory, dispatcher = dispatcher, analytics = analytics, setObjectDetails = updateDetail, - addFileToObject = addFileToObject + addFileToObject = addFileToObject, + storeOfObjectTypes = storeOfObjectTypes ) } @@ -537,7 +537,7 @@ class DisplayRelationTagValueTest { } private fun launchFragment(args: Bundle): FragmentScenario { - return launchFragmentInContainer( + return launchFragmentInContainer( fragmentArgs = args, themeResId = R.style.AppTheme ) diff --git a/app/src/androidTest/java/com/anytypeio/anytype/features/relations/EditRelationTagValueTest.kt b/app/src/androidTest/java/com/anytypeio/anytype/features/relations/EditRelationTagValueTest.kt index b469cd645..4c3988a78 100644 --- a/app/src/androidTest/java/com/anytypeio/anytype/features/relations/EditRelationTagValueTest.kt +++ b/app/src/androidTest/java/com/anytypeio/anytype/features/relations/EditRelationTagValueTest.kt @@ -10,19 +10,20 @@ import com.anytypeio.anytype.R import com.anytypeio.anytype.analytics.base.Analytics import com.anytypeio.anytype.core_models.Block import com.anytypeio.anytype.core_models.Id -import com.anytypeio.anytype.core_models.ObjectType import com.anytypeio.anytype.core_models.Payload import com.anytypeio.anytype.core_models.Relation +import com.anytypeio.anytype.core_models.ThemeColor import com.anytypeio.anytype.core_ui.extensions.dark -import com.anytypeio.anytype.domain.`object`.ObjectTypesProvider import com.anytypeio.anytype.domain.`object`.UpdateDetail import com.anytypeio.anytype.domain.block.repo.BlockRepository import com.anytypeio.anytype.domain.config.Gateway -import com.anytypeio.anytype.domain.dataview.interactor.AddDataViewRelationOption import com.anytypeio.anytype.domain.misc.UrlBuilder -import com.anytypeio.anytype.core_models.ThemeColor import com.anytypeio.anytype.domain.objects.DefaultObjectStore +import com.anytypeio.anytype.domain.objects.DefaultStoreOfObjectTypes +import com.anytypeio.anytype.domain.objects.DefaultStoreOfRelations import com.anytypeio.anytype.domain.objects.ObjectStore +import com.anytypeio.anytype.domain.objects.StoreOfObjectTypes +import com.anytypeio.anytype.domain.objects.StoreOfRelations import com.anytypeio.anytype.domain.relations.AddFileToObject import com.anytypeio.anytype.presentation.relations.ObjectSetConfig import com.anytypeio.anytype.presentation.relations.providers.DataViewObjectRelationProvider @@ -30,7 +31,6 @@ import com.anytypeio.anytype.presentation.relations.providers.DataViewObjectValu import com.anytypeio.anytype.presentation.relations.providers.ObjectDetailProvider import com.anytypeio.anytype.presentation.sets.ObjectSet import com.anytypeio.anytype.presentation.sets.ObjectSetDatabase -import com.anytypeio.anytype.presentation.sets.ObjectSetSession import com.anytypeio.anytype.presentation.sets.RelationValueDVViewModel import com.anytypeio.anytype.presentation.util.CopyFileToCacheDirectory import com.anytypeio.anytype.presentation.util.Dispatcher @@ -77,7 +77,6 @@ class EditRelationTagValueTest { @Mock lateinit var copyFileToCacheDirectory: CopyFileToCacheDirectory - private lateinit var addRelationOption: AddDataViewRelationOption private lateinit var updateDetail: UpdateDetail private lateinit var urlBuilder: UrlBuilder private lateinit var addFileToObject: AddFileToObject @@ -91,31 +90,32 @@ class EditRelationTagValueTest { private val ctx = MockDataFactory.randomUuid() private val state = MutableStateFlow(ObjectSet.init()) private val store: ObjectStore = DefaultObjectStore() + private val storeOfRelations: StoreOfRelations = DefaultStoreOfRelations() private val db = ObjectSetDatabase(store = store) + private val storeOfObjectTypes: StoreOfObjectTypes = DefaultStoreOfObjectTypes() @Before fun setup() { MockitoAnnotations.openMocks(this) - addRelationOption = AddDataViewRelationOption(repo) updateDetail = UpdateDetail(repo) urlBuilder = UrlBuilder(gateway) addFileToObject = AddFileToObject(repo) TestRelationValueDVFragment.testVmFactory = RelationValueDVViewModel.Factory( - relations = DataViewObjectRelationProvider(state), + relations = DataViewObjectRelationProvider( + objectSetState = state, + storeOfRelations = storeOfRelations + ), values = DataViewObjectValueProvider(db = db), details = object : ObjectDetailProvider { override fun provide(): Map = state.value.details }, - types = object : ObjectTypesProvider { - override fun set(objectTypes: List) {} - override fun get(): List = state.value.objectTypes - }, urlBuilder = urlBuilder, copyFileToCache = copyFileToCacheDirectory, addFileToObject = addFileToObject, dispatcher = dispatcher, analytics = analytics, - setObjectDetails = updateDetail + setObjectDetails = updateDetail, + storeOfObjectTypes = storeOfObjectTypes ) } @@ -337,13 +337,10 @@ class EditRelationTagValueTest { rvMatcher.onItemView(1, R.id.btnRemoveTag).performClick() verifyBlocking(repo, times(1)) { - updateDataViewRecord( - context = ctx, - target = dv.id, - record = target, - values = mapOf( - relationKey to listOf(option2.id) - ) + updateDetail( + ctx= target, + key = relationKey, + value = listOf(option2.id) ) } } diff --git a/app/src/androidTest/java/com/anytypeio/anytype/features/relations/ObjectRelationDateValueTest.kt b/app/src/androidTest/java/com/anytypeio/anytype/features/relations/ObjectRelationDateValueTest.kt index 6b7e3c0b2..5fc79b3f1 100644 --- a/app/src/androidTest/java/com/anytypeio/anytype/features/relations/ObjectRelationDateValueTest.kt +++ b/app/src/androidTest/java/com/anytypeio/anytype/features/relations/ObjectRelationDateValueTest.kt @@ -17,7 +17,9 @@ import com.anytypeio.anytype.core_models.Relation import com.anytypeio.anytype.core_utils.const.DateConst.DEFAULT_DATE_FORMAT import com.anytypeio.anytype.core_utils.ext.formatTimeInMillis import com.anytypeio.anytype.domain.objects.DefaultObjectStore +import com.anytypeio.anytype.domain.objects.DefaultStoreOfRelations import com.anytypeio.anytype.domain.objects.ObjectStore +import com.anytypeio.anytype.domain.objects.StoreOfRelations import com.anytypeio.anytype.presentation.relations.ObjectSetConfig import com.anytypeio.anytype.presentation.relations.providers.DataViewObjectRelationProvider import com.anytypeio.anytype.presentation.relations.providers.DataViewObjectValueProvider @@ -52,12 +54,16 @@ class ObjectRelationDateValueTest { private val state = MutableStateFlow(ObjectSet.init()) private val store: ObjectStore = DefaultObjectStore() private val db = ObjectSetDatabase(store) + private val storeOfRelations: StoreOfRelations = DefaultStoreOfRelations() @Before fun setup() { MockitoAnnotations.openMocks(this) TestRelationDateValueFragment.testVmFactory = RelationDateValueViewModel.Factory( - relations = DataViewObjectRelationProvider(state), + relations = DataViewObjectRelationProvider( + objectSetState = state, + storeOfRelations = storeOfRelations + ), values = DataViewObjectValueProvider(db = db) ) } diff --git a/app/src/androidTest/java/com/anytypeio/anytype/features/relations/ObjectRelationListTest.kt b/app/src/androidTest/java/com/anytypeio/anytype/features/relations/ObjectRelationListTest.kt index c88c00cfd..5fa0c7c28 100644 --- a/app/src/androidTest/java/com/anytypeio/anytype/features/relations/ObjectRelationListTest.kt +++ b/app/src/androidTest/java/com/anytypeio/anytype/features/relations/ObjectRelationListTest.kt @@ -15,20 +15,21 @@ import com.anytypeio.anytype.core_models.Block import com.anytypeio.anytype.core_models.Id import com.anytypeio.anytype.core_models.Payload import com.anytypeio.anytype.core_models.Relation +import com.anytypeio.anytype.core_models.ThemeColor import com.anytypeio.anytype.core_ui.extensions.dark import com.anytypeio.anytype.core_utils.const.DateConst import com.anytypeio.anytype.core_utils.ext.toTimeSeconds import com.anytypeio.anytype.domain.`object`.UpdateDetail import com.anytypeio.anytype.domain.block.repo.BlockRepository import com.anytypeio.anytype.domain.config.Gateway -import com.anytypeio.anytype.domain.relations.ObjectRelationList import com.anytypeio.anytype.domain.misc.UrlBuilder +import com.anytypeio.anytype.domain.objects.StoreOfRelations import com.anytypeio.anytype.domain.relations.AddToFeaturedRelations import com.anytypeio.anytype.domain.relations.DeleteRelationFromObject +import com.anytypeio.anytype.domain.relations.ObjectRelationList import com.anytypeio.anytype.domain.relations.RemoveFromFeaturedRelations import com.anytypeio.anytype.presentation.editor.Editor import com.anytypeio.anytype.presentation.editor.editor.DetailModificationManager -import com.anytypeio.anytype.core_models.ThemeColor import com.anytypeio.anytype.presentation.relations.ObjectRelationListViewModelFactory import com.anytypeio.anytype.presentation.util.Dispatcher import com.anytypeio.anytype.test_utils.MockDataFactory @@ -76,6 +77,9 @@ class ObjectRelationListTest { @Mock lateinit var analytics: Analytics + @Mock + lateinit var storeOfRelations: StoreOfRelations + private lateinit var objectRelationList: ObjectRelationList private lateinit var updateDetail: UpdateDetail private lateinit var addToFeaturedRelations: AddToFeaturedRelations @@ -106,7 +110,8 @@ class ObjectRelationListTest { addToFeaturedRelations = addToFeaturedRelations, removeFromFeaturedRelations = removeFromFeaturedRelations, deleteRelationFromObject = deleteRelationFromObject, - analytics = analytics + analytics = analytics, + storeOfRelations = storeOfRelations ) } diff --git a/app/src/androidTest/java/com/anytypeio/anytype/features/sets/dv/ObjectSetGridColumnRenderingTest.kt b/app/src/androidTest/java/com/anytypeio/anytype/features/sets/dv/ObjectSetGridColumnRenderingTest.kt index ae57472a2..abf66a2c2 100644 --- a/app/src/androidTest/java/com/anytypeio/anytype/features/sets/dv/ObjectSetGridColumnRenderingTest.kt +++ b/app/src/androidTest/java/com/anytypeio/anytype/features/sets/dv/ObjectSetGridColumnRenderingTest.kt @@ -53,7 +53,7 @@ class ObjectSetGridColumnRenderingTest : TestObjectSetSetup() { name = MockDataFactory.randomString(), emoji = MockDataFactory.randomString(), layout = ObjectType.Layout.BASIC, - relations = emptyList(), + relationLinks = emptyList(), description = "", isHidden = false, smartBlockTypes = listOf(), @@ -150,15 +150,10 @@ class ObjectSetGridColumnRenderingTest : TestObjectSetSetup() { stubInterceptEvents() stubInterceptThreadStatus() - stubSetActiveViewer() stubOpenObjectSetWithRecord( set = set, relations = listOf(relation1, relation2, relation3, relation4, relation5), details = defaultDetails, - viewer = viewer.id, - dataview = dataview.id, - records = emptyList(), - total = 1, objectTypes = listOf(type) ) diff --git a/app/src/androidTest/java/com/anytypeio/anytype/features/sets/dv/ObjectSetGridFileCellRenderingTest.kt b/app/src/androidTest/java/com/anytypeio/anytype/features/sets/dv/ObjectSetGridFileCellRenderingTest.kt index 58599e734..274655068 100644 --- a/app/src/androidTest/java/com/anytypeio/anytype/features/sets/dv/ObjectSetGridFileCellRenderingTest.kt +++ b/app/src/androidTest/java/com/anytypeio/anytype/features/sets/dv/ObjectSetGridFileCellRenderingTest.kt @@ -65,7 +65,7 @@ class ObjectSetGridFileCellRenderingTest : TestObjectSetSetup() { val objectType = ObjectType( url = MockDataFactory.randomUuid(), name = "Movie", - relations = emptyList(), + relationLinks = emptyList(), emoji = MockDataFactory.randomString(), layout = ObjectType.Layout.PROFILE, description = "", @@ -159,15 +159,10 @@ class ObjectSetGridFileCellRenderingTest : TestObjectSetSetup() { stubInterceptEvents() stubInterceptThreadStatus() - stubSetActiveViewer() stubOpenObjectSetWithRecord( set = set, relations = listOf(relation), details = details, - viewer = viewer.id, - dataview = dataview.id, - records = listOf(record1, record2), - total = 1, objectTypes = listOf(objectType) ) diff --git a/app/src/androidTest/java/com/anytypeio/anytype/features/sets/dv/ObjectSetGridNumberCellRenderingTest.kt b/app/src/androidTest/java/com/anytypeio/anytype/features/sets/dv/ObjectSetGridNumberCellRenderingTest.kt index 1266eba75..ce5fad312 100644 --- a/app/src/androidTest/java/com/anytypeio/anytype/features/sets/dv/ObjectSetGridNumberCellRenderingTest.kt +++ b/app/src/androidTest/java/com/anytypeio/anytype/features/sets/dv/ObjectSetGridNumberCellRenderingTest.kt @@ -62,7 +62,7 @@ class ObjectSetGridNumberCellRenderingTest : TestObjectSetSetup() { val objectType = ObjectType( url = MockDataFactory.randomUuid(), name = "Movie", - relations = emptyList(), + relationLinks = emptyList(), emoji = MockDataFactory.randomString(), layout = ObjectType.Layout.PROFILE, description = "", @@ -125,14 +125,9 @@ class ObjectSetGridNumberCellRenderingTest : TestObjectSetSetup() { stubInterceptEvents() stubInterceptThreadStatus() - stubSetActiveViewer() stubOpenObjectSetWithRecord( set = set, relations = listOf(relation), - viewer = viewer.id, - dataview = dataview.id, - records = listOf(record1), - total = 1, objectTypes = listOf(objectType) ) @@ -166,7 +161,7 @@ class ObjectSetGridNumberCellRenderingTest : TestObjectSetSetup() { val objectType = ObjectType( url = MockDataFactory.randomUuid(), name = "Movie", - relations = emptyList(), + relationLinks = emptyList(), emoji = MockDataFactory.randomString(), layout = ObjectType.Layout.PROFILE, description = "", @@ -229,14 +224,9 @@ class ObjectSetGridNumberCellRenderingTest : TestObjectSetSetup() { stubInterceptEvents() stubInterceptThreadStatus() - stubSetActiveViewer() stubOpenObjectSetWithRecord( set = set, relations = listOf(relation), - viewer = viewer.id, - dataview = dataview.id, - records = listOf(record1), - total = 1, objectTypes = listOf(objectType) ) @@ -270,7 +260,7 @@ class ObjectSetGridNumberCellRenderingTest : TestObjectSetSetup() { val objectType = ObjectType( url = MockDataFactory.randomUuid(), name = "Movie", - relations = emptyList(), + relationLinks = emptyList(), emoji = MockDataFactory.randomString(), layout = ObjectType.Layout.PROFILE, description = "", @@ -333,14 +323,9 @@ class ObjectSetGridNumberCellRenderingTest : TestObjectSetSetup() { stubInterceptEvents() stubInterceptThreadStatus() - stubSetActiveViewer() stubOpenObjectSetWithRecord( set = set, relations = listOf(relation), - viewer = viewer.id, - dataview = dataview.id, - records = listOf(record1), - total = 1, objectTypes = listOf(objectType) ) @@ -374,7 +359,7 @@ class ObjectSetGridNumberCellRenderingTest : TestObjectSetSetup() { val objectType = ObjectType( url = MockDataFactory.randomUuid(), name = "Movie", - relations = emptyList(), + relationLinks = emptyList(), emoji = MockDataFactory.randomString(), layout = ObjectType.Layout.PROFILE, description = "", @@ -437,14 +422,9 @@ class ObjectSetGridNumberCellRenderingTest : TestObjectSetSetup() { stubInterceptEvents() stubInterceptThreadStatus() - stubSetActiveViewer() stubOpenObjectSetWithRecord( set = set, relations = listOf(relation), - viewer = viewer.id, - dataview = dataview.id, - records = listOf(record1), - total = 1, objectTypes = listOf(objectType) ) @@ -478,7 +458,7 @@ class ObjectSetGridNumberCellRenderingTest : TestObjectSetSetup() { val objectType = ObjectType( url = MockDataFactory.randomUuid(), name = "Movie", - relations = emptyList(), + relationLinks = emptyList(), emoji = MockDataFactory.randomString(), layout = ObjectType.Layout.PROFILE, description = "", @@ -541,14 +521,9 @@ class ObjectSetGridNumberCellRenderingTest : TestObjectSetSetup() { stubInterceptEvents() stubInterceptThreadStatus() - stubSetActiveViewer() stubOpenObjectSetWithRecord( set = set, relations = listOf(relation), - viewer = viewer.id, - dataview = dataview.id, - records = listOf(record1), - total = 1, objectTypes = listOf(objectType) ) @@ -582,7 +557,7 @@ class ObjectSetGridNumberCellRenderingTest : TestObjectSetSetup() { val objectType = ObjectType( url = MockDataFactory.randomUuid(), name = "Movie", - relations = emptyList(), + relationLinks = emptyList(), emoji = MockDataFactory.randomString(), layout = ObjectType.Layout.PROFILE, description = "", @@ -645,14 +620,9 @@ class ObjectSetGridNumberCellRenderingTest : TestObjectSetSetup() { stubInterceptEvents() stubInterceptThreadStatus() - stubSetActiveViewer() stubOpenObjectSetWithRecord( set = set, relations = listOf(relation), - viewer = viewer.id, - dataview = dataview.id, - records = listOf(record1), - total = 1, objectTypes = listOf(objectType) ) diff --git a/app/src/androidTest/java/com/anytypeio/anytype/features/sets/dv/ObjectSetGridObjectCellRenderingTest.kt b/app/src/androidTest/java/com/anytypeio/anytype/features/sets/dv/ObjectSetGridObjectCellRenderingTest.kt index 43192c52d..bed9a1ead 100644 --- a/app/src/androidTest/java/com/anytypeio/anytype/features/sets/dv/ObjectSetGridObjectCellRenderingTest.kt +++ b/app/src/androidTest/java/com/anytypeio/anytype/features/sets/dv/ObjectSetGridObjectCellRenderingTest.kt @@ -64,7 +64,7 @@ class ObjectSetGridObjectCellRenderingTest : TestObjectSetSetup() { val objectType = ObjectType( url = MockDataFactory.randomUuid(), name = "Movie", - relations = emptyList(), + relationLinks = emptyList(), emoji = MockDataFactory.randomString(), layout = ObjectType.Layout.PROFILE, description = "", @@ -158,15 +158,10 @@ class ObjectSetGridObjectCellRenderingTest : TestObjectSetSetup() { stubInterceptEvents() stubInterceptThreadStatus() - stubSetActiveViewer() stubOpenObjectSetWithRecord( set = set, relations = listOf(relation), details = details, - viewer = viewer.id, - dataview = dataview.id, - records = listOf(record1, record2), - total = 1, objectTypes = listOf(objectType) ) @@ -197,7 +192,7 @@ class ObjectSetGridObjectCellRenderingTest : TestObjectSetSetup() { val objectType = ObjectType( url = MockDataFactory.randomUuid(), name = "Movie", - relations = emptyList(), + relationLinks = emptyList(), emoji = MockDataFactory.randomString(), layout = ObjectType.Layout.PROFILE, description = "", @@ -282,15 +277,10 @@ class ObjectSetGridObjectCellRenderingTest : TestObjectSetSetup() { stubInterceptEvents() stubInterceptThreadStatus() - stubSetActiveViewer() stubOpenObjectSetWithRecord( set = set, relations = listOf(relation), details = details, - viewer = viewer.id, - dataview = dataview.id, - records = listOf(record1), - total = 1, objectTypes = listOf(objectType) ) diff --git a/app/src/androidTest/java/com/anytypeio/anytype/features/sets/dv/ObjectSetGridPrimitiveRelationTest.kt b/app/src/androidTest/java/com/anytypeio/anytype/features/sets/dv/ObjectSetGridPrimitiveRelationTest.kt index 58955a7a1..c7c34de46 100644 --- a/app/src/androidTest/java/com/anytypeio/anytype/features/sets/dv/ObjectSetGridPrimitiveRelationTest.kt +++ b/app/src/androidTest/java/com/anytypeio/anytype/features/sets/dv/ObjectSetGridPrimitiveRelationTest.kt @@ -57,7 +57,7 @@ class ObjectSetGridPrimitiveRelationTest : TestObjectSetSetup() { name = MockDataFactory.randomString(), emoji = MockDataFactory.randomString(), layout = ObjectType.Layout.BASIC, - relations = emptyList(), + relationLinks = emptyList(), description = "", isHidden = false, smartBlockTypes = listOf(), @@ -190,15 +190,10 @@ class ObjectSetGridPrimitiveRelationTest : TestObjectSetSetup() { stubInterceptEvents() stubInterceptThreadStatus() - stubSetActiveViewer() stubOpenObjectSetWithRecord( set = set, relations = listOf(relation1, relation2, relation3, relation4, relation5), details = defaultDetails, - viewer = viewer.id, - dataview = dataview.id, - records = listOf(record1, record2), - total = 1, objectTypes = listOf(type) ) diff --git a/app/src/androidTest/java/com/anytypeio/anytype/features/sets/dv/ObjectSetGridTagCellRenderingTest.kt b/app/src/androidTest/java/com/anytypeio/anytype/features/sets/dv/ObjectSetGridTagCellRenderingTest.kt index 90e48b738..f4bbfc41b 100644 --- a/app/src/androidTest/java/com/anytypeio/anytype/features/sets/dv/ObjectSetGridTagCellRenderingTest.kt +++ b/app/src/androidTest/java/com/anytypeio/anytype/features/sets/dv/ObjectSetGridTagCellRenderingTest.kt @@ -66,7 +66,7 @@ class ObjectSetGridTagCellRenderingTest : TestObjectSetSetup() { val objectType = ObjectType( url = MockDataFactory.randomUuid(), name = "Film", - relations = emptyList(), + relationLinks = emptyList(), emoji = MockDataFactory.randomString(), layout = ObjectType.Layout.BASIC , description = "", @@ -152,16 +152,11 @@ class ObjectSetGridTagCellRenderingTest : TestObjectSetSetup() { val set = listOf(root, header, title, dataview) stubInterceptEvents() - stubSetActiveViewer() stubInterceptThreadStatus() stubOpenObjectSetWithRecord( set = set, relations = listOf(relation), details = details, - viewer = viewer.id, - dataview = dataview.id, - records = listOf(record1, record2), - total = 1, objectTypes = listOf(objectType) ) diff --git a/app/src/androidTest/java/com/anytypeio/anytype/features/sets/dv/TestObjectSetSetup.kt b/app/src/androidTest/java/com/anytypeio/anytype/features/sets/dv/TestObjectSetSetup.kt index 55f9cb6e3..24b25bd97 100644 --- a/app/src/androidTest/java/com/anytypeio/anytype/features/sets/dv/TestObjectSetSetup.kt +++ b/app/src/androidTest/java/com/anytypeio/anytype/features/sets/dv/TestObjectSetSetup.kt @@ -6,12 +6,8 @@ import androidx.fragment.app.testing.launchFragmentInContainer import com.anytypeio.anytype.R import com.anytypeio.anytype.analytics.base.Analytics import com.anytypeio.anytype.core_models.Block -import com.anytypeio.anytype.core_models.DVFilter -import com.anytypeio.anytype.core_models.DVRecord -import com.anytypeio.anytype.core_models.DVSort import com.anytypeio.anytype.core_models.Event 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.Payload import com.anytypeio.anytype.core_models.Relation @@ -26,14 +22,19 @@ import com.anytypeio.anytype.domain.block.repo.BlockRepository import com.anytypeio.anytype.domain.config.Gateway import com.anytypeio.anytype.domain.cover.SetDocCoverImage import com.anytypeio.anytype.domain.dataview.SetDataViewSource -import com.anytypeio.anytype.domain.dataview.interactor.AddNewRelationToDataView -import com.anytypeio.anytype.domain.dataview.interactor.CreateDataViewRecord +import com.anytypeio.anytype.domain.dataview.interactor.CreateDataViewObject import com.anytypeio.anytype.domain.dataview.interactor.UpdateDataViewViewer import com.anytypeio.anytype.domain.event.interactor.InterceptEvents import com.anytypeio.anytype.domain.misc.UrlBuilder import com.anytypeio.anytype.domain.objects.DefaultObjectStore +import com.anytypeio.anytype.domain.objects.DefaultStoreOfRelations import com.anytypeio.anytype.domain.objects.ObjectStore +import com.anytypeio.anytype.domain.objects.StoreOfRelations import com.anytypeio.anytype.domain.page.CloseBlock +import com.anytypeio.anytype.domain.page.CreateNewObject +import com.anytypeio.anytype.domain.search.CancelSearchSubscription +import com.anytypeio.anytype.domain.search.DataViewSubscriptionContainer +import com.anytypeio.anytype.domain.search.SubscriptionEventChannel import com.anytypeio.anytype.domain.sets.OpenObjectSet import com.anytypeio.anytype.domain.status.InterceptThreadStatus import com.anytypeio.anytype.domain.status.ThreadStatusChannel @@ -43,14 +44,9 @@ import com.anytypeio.anytype.domain.unsplash.UnsplashRepository import com.anytypeio.anytype.emojifier.data.DefaultDocumentEmojiIconProvider import com.anytypeio.anytype.presentation.common.Action import com.anytypeio.anytype.presentation.common.Delegator -import com.anytypeio.anytype.domain.page.CreateNewObject -import com.anytypeio.anytype.domain.search.CancelSearchSubscription -import com.anytypeio.anytype.domain.search.DataViewSubscriptionContainer -import com.anytypeio.anytype.domain.search.SubscriptionEventChannel import com.anytypeio.anytype.presentation.editor.cover.CoverImageHashProvider import com.anytypeio.anytype.presentation.sets.ObjectSetDatabase import com.anytypeio.anytype.presentation.sets.ObjectSetPaginator -import com.anytypeio.anytype.presentation.sets.ObjectSetRecordCache import com.anytypeio.anytype.presentation.sets.ObjectSetReducer import com.anytypeio.anytype.presentation.sets.ObjectSetSession import com.anytypeio.anytype.presentation.sets.ObjectSetViewModelFactory @@ -68,11 +64,10 @@ import org.mockito.kotlin.stub abstract class TestObjectSetSetup { private lateinit var openObjectSet: OpenObjectSet - private lateinit var addDataViewRelation: AddNewRelationToDataView private lateinit var updateDataViewViewer: UpdateDataViewViewer private lateinit var setObjectDetails: UpdateDetail private lateinit var updateText: UpdateText - private lateinit var createDataViewRecord: CreateDataViewRecord + private lateinit var createDataViewObject: CreateDataViewObject private lateinit var closeBlock: CloseBlock private lateinit var interceptThreadStatus: InterceptThreadStatus private lateinit var setDocCoverImage: SetDocCoverImage @@ -109,17 +104,17 @@ abstract class TestObjectSetSetup { @Mock lateinit var createNewObject: CreateNewObject - lateinit var getTemplates: GetTemplates + private lateinit var getTemplates: GetTemplates private val session = ObjectSetSession() private val reducer = ObjectSetReducer() private val dispatcher: Dispatcher = Dispatcher.Default() - private val objectSetRecordCache = ObjectSetRecordCache() private val paginator = ObjectSetPaginator() private val store: ObjectStore = DefaultObjectStore() + private val storeOfRelations: StoreOfRelations = DefaultStoreOfRelations() - lateinit var database: ObjectSetDatabase - lateinit var dataViewSubscriptionContainer: DataViewSubscriptionContainer + private lateinit var database: ObjectSetDatabase + private lateinit var dataViewSubscriptionContainer: DataViewSubscriptionContainer val ctx : Id = MockDataFactory.randomUuid() @@ -144,16 +139,15 @@ abstract class TestObjectSetSetup { ) ) - val delegator = Delegator.Default() + private val delegator = Delegator.Default() open fun setup() { MockitoAnnotations.openMocks(this) setDataViewSource = SetDataViewSource(repo) - addDataViewRelation = AddNewRelationToDataView(repo) updateText = UpdateText(repo) openObjectSet = OpenObjectSet(repo, auth) - createDataViewRecord = CreateDataViewRecord(repo) + createDataViewObject = CreateDataViewObject(repo) setObjectDetails = UpdateDetail(repo) updateDataViewViewer = UpdateDataViewViewer(repo) interceptThreadStatus = InterceptThreadStatus(channel = threadStatusChannel) @@ -183,11 +177,10 @@ abstract class TestObjectSetSetup { TestObjectSetFragment.testVmFactory = ObjectSetViewModelFactory( openObjectSet = openObjectSet, closeBlock = closeBlock, - addDataViewRelation = addDataViewRelation, interceptEvents = interceptEvents, interceptThreadStatus = interceptThreadStatus, updateDataViewViewer = updateDataViewViewer, - createDataViewRecord = createDataViewRecord, + createDataViewObject = createDataViewObject, setObjectDetails = setObjectDetails, updateText = updateText, urlBuilder = urlBuilder, @@ -195,7 +188,6 @@ abstract class TestObjectSetSetup { session = session, dispatcher = dispatcher, reducer = reducer, - objectSetRecordCache = objectSetRecordCache, analytics = analytics, downloadUnsplashImage = downloadUnsplashImage, setDocCoverImage = setDocCoverImage, @@ -206,7 +198,8 @@ abstract class TestObjectSetSetup { cancelSearchSubscription = cancelSearchSubscription, paginator = paginator, database = database, - dataViewSubscriptionContainer = dataViewSubscriptionContainer + dataViewSubscriptionContainer = dataViewSubscriptionContainer, + storeOfRelations = storeOfRelations ) } @@ -216,24 +209,6 @@ abstract class TestObjectSetSetup { } } - @Deprecated("To be deleted") - fun stubSetActiveViewer() { - repo.stub { - onBlocking { - setActiveDataViewViewer( - context = any(), - block = any(), - view = any(), - offset = any(), - limit = any() - ) - } doReturn Payload( - context = ctx, - events = emptyList() - ) - } - } - fun stubInterceptThreadStatus() { threadStatusChannel.stub { onBlocking { observe(any()) } doReturn emptyFlow() @@ -263,15 +238,10 @@ abstract class TestObjectSetSetup { } } - @Deprecated("To be deleted") fun stubOpenObjectSetWithRecord( set: List, details: Block.Details = Block.Details(), relations: List = emptyList(), - dataview: Id, - viewer: Id, - total: Int, - records: List, objectTypes: List ) { repo.stub { @@ -293,35 +263,6 @@ abstract class TestObjectSetSetup { } } - fun stubSearchWithSubscription( - subscription: Id, - filters: List, - sorts: List, - afterId: Id? = null, - beforeId: Id? = null, - sources: List = emptyList(), - keys: List, - offset: Long, - limit: Int, - result: SearchResult - ) { - repo.stub { - onBlocking { - searchObjectsWithSubscription( - subscription = subscription, - filters = filters, - sorts = sorts, - afterId = afterId, - beforeId = beforeId, - source = sources, - keys = keys, - limit = limit, - offset = offset - ) - } doReturn result - } - } - fun stubSearchWithSubscription() { repo.stub { onBlocking { @@ -334,7 +275,9 @@ abstract class TestObjectSetSetup { source = any(), keys = any(), limit = any(), - offset = any() + offset = any(), + ignoreWorkspace = any(), + noDepSubscription = any() ) } doReturn SearchResult( results = emptyList(), diff --git a/app/src/androidTest/java/com/anytypeio/anytype/features/sets/filter/CreateSelectedFilterTest.kt b/app/src/androidTest/java/com/anytypeio/anytype/features/sets/filter/CreateSelectedFilterTest.kt index 316f0a1cc..f8887200b 100644 --- a/app/src/androidTest/java/com/anytypeio/anytype/features/sets/filter/CreateSelectedFilterTest.kt +++ b/app/src/androidTest/java/com/anytypeio/anytype/features/sets/filter/CreateSelectedFilterTest.kt @@ -14,14 +14,20 @@ import com.anytypeio.anytype.core_models.DVFilter import com.anytypeio.anytype.core_models.DVFilterCondition import com.anytypeio.anytype.core_models.Payload import com.anytypeio.anytype.core_models.Relation -import com.anytypeio.anytype.domain.`object`.ObjectTypesProvider import com.anytypeio.anytype.domain.block.repo.BlockRepository import com.anytypeio.anytype.domain.config.Gateway -import com.anytypeio.anytype.domain.search.SearchObjects import com.anytypeio.anytype.domain.dataview.interactor.UpdateDataViewViewer import com.anytypeio.anytype.domain.misc.UrlBuilder +import com.anytypeio.anytype.domain.objects.DefaultObjectStore +import com.anytypeio.anytype.domain.objects.DefaultStoreOfObjectTypes +import com.anytypeio.anytype.domain.objects.DefaultStoreOfRelations +import com.anytypeio.anytype.domain.objects.ObjectStore +import com.anytypeio.anytype.domain.objects.StoreOfObjectTypes +import com.anytypeio.anytype.domain.objects.StoreOfRelations +import com.anytypeio.anytype.domain.search.SearchObjects import com.anytypeio.anytype.presentation.relations.ObjectSetConfig import com.anytypeio.anytype.presentation.sets.ObjectSet +import com.anytypeio.anytype.presentation.sets.ObjectSetDatabase import com.anytypeio.anytype.presentation.sets.ObjectSetSession import com.anytypeio.anytype.presentation.sets.filter.FilterViewModel import com.anytypeio.anytype.presentation.util.Dispatcher @@ -58,9 +64,6 @@ class CreateSelectedFilterTest { @Mock lateinit var gateway: Gateway - @Mock - lateinit var objectTypesProvider: ObjectTypesProvider - @Mock lateinit var analytics: Analytics @@ -72,6 +75,10 @@ class CreateSelectedFilterTest { private val session = ObjectSetSession() private val state = MutableStateFlow(ObjectSet.init()) private val dispatcher = Dispatcher.Default() + private val storeOfObjectTypes: StoreOfObjectTypes = DefaultStoreOfObjectTypes() + private val storeOfRelations: StoreOfRelations = DefaultStoreOfRelations() + private val objectStore: ObjectStore = DefaultObjectStore() + private val db = ObjectSetDatabase(store = objectStore) @Before fun setup() { @@ -86,8 +93,10 @@ class CreateSelectedFilterTest { urlBuilder = urlBuilder, searchObjects = searchObjects, objectSetState = state, - objectTypesProvider = objectTypesProvider, - analytics = analytics + analytics = analytics, + storeOfObjectTypes = storeOfObjectTypes, + storeOfRelations = storeOfRelations, + objectSetDatabase = db ) } diff --git a/app/src/androidTest/java/com/anytypeio/anytype/features/sets/filter/ModifyInputValueFilterTest.kt b/app/src/androidTest/java/com/anytypeio/anytype/features/sets/filter/ModifyInputValueFilterTest.kt index f5edb0715..2c7850623 100644 --- a/app/src/androidTest/java/com/anytypeio/anytype/features/sets/filter/ModifyInputValueFilterTest.kt +++ b/app/src/androidTest/java/com/anytypeio/anytype/features/sets/filter/ModifyInputValueFilterTest.kt @@ -22,14 +22,20 @@ import com.anytypeio.anytype.core_models.DVFilter import com.anytypeio.anytype.core_models.DVFilterCondition import com.anytypeio.anytype.core_models.Payload import com.anytypeio.anytype.core_models.Relation -import com.anytypeio.anytype.domain.`object`.ObjectTypesProvider import com.anytypeio.anytype.domain.block.repo.BlockRepository import com.anytypeio.anytype.domain.config.Gateway -import com.anytypeio.anytype.domain.search.SearchObjects import com.anytypeio.anytype.domain.dataview.interactor.UpdateDataViewViewer import com.anytypeio.anytype.domain.misc.UrlBuilder +import com.anytypeio.anytype.domain.objects.DefaultObjectStore +import com.anytypeio.anytype.domain.objects.DefaultStoreOfObjectTypes +import com.anytypeio.anytype.domain.objects.DefaultStoreOfRelations +import com.anytypeio.anytype.domain.objects.ObjectStore +import com.anytypeio.anytype.domain.objects.StoreOfObjectTypes +import com.anytypeio.anytype.domain.objects.StoreOfRelations +import com.anytypeio.anytype.domain.search.SearchObjects import com.anytypeio.anytype.presentation.relations.ObjectSetConfig import com.anytypeio.anytype.presentation.sets.ObjectSet +import com.anytypeio.anytype.presentation.sets.ObjectSetDatabase import com.anytypeio.anytype.presentation.sets.ObjectSetSession import com.anytypeio.anytype.presentation.sets.filter.FilterViewModel import com.anytypeio.anytype.presentation.util.Dispatcher @@ -60,9 +66,6 @@ class ModifyInputValueFilterTest { @Mock lateinit var repo: BlockRepository - @Mock - lateinit var objectTypesProvider: ObjectTypesProvider - @Mock lateinit var gateway: Gateway @@ -77,6 +80,10 @@ class ModifyInputValueFilterTest { private val session = ObjectSetSession() private val state = MutableStateFlow(ObjectSet.init()) private val dispatcher = Dispatcher.Default() + private val storeOfObjectTypes: StoreOfObjectTypes = DefaultStoreOfObjectTypes() + private val storeOfRelations: StoreOfRelations = DefaultStoreOfRelations() + private val objectStore: ObjectStore = DefaultObjectStore() + private val db = ObjectSetDatabase(store = objectStore) @Before fun setup() { @@ -91,8 +98,10 @@ class ModifyInputValueFilterTest { dispatcher = dispatcher, searchObjects = searchObjects, urlBuilder = urlBuilder, - objectTypesProvider = objectTypesProvider, - analytics = analytics + analytics = analytics, + storeOfObjectTypes = storeOfObjectTypes, + storeOfRelations = storeOfRelations, + objectSetDatabase = db ) } diff --git a/app/src/androidTest/java/com/anytypeio/anytype/features/sets/filter/ModifyStatusFilterTest.kt b/app/src/androidTest/java/com/anytypeio/anytype/features/sets/filter/ModifyStatusFilterTest.kt index 529bfa0e5..a47cd4c1a 100644 --- a/app/src/androidTest/java/com/anytypeio/anytype/features/sets/filter/ModifyStatusFilterTest.kt +++ b/app/src/androidTest/java/com/anytypeio/anytype/features/sets/filter/ModifyStatusFilterTest.kt @@ -19,14 +19,20 @@ import com.anytypeio.anytype.core_models.DVFilter import com.anytypeio.anytype.core_models.DVFilterCondition import com.anytypeio.anytype.core_models.Payload import com.anytypeio.anytype.core_models.Relation -import com.anytypeio.anytype.domain.`object`.ObjectTypesProvider import com.anytypeio.anytype.domain.block.repo.BlockRepository import com.anytypeio.anytype.domain.config.Gateway -import com.anytypeio.anytype.domain.search.SearchObjects import com.anytypeio.anytype.domain.dataview.interactor.UpdateDataViewViewer import com.anytypeio.anytype.domain.misc.UrlBuilder +import com.anytypeio.anytype.domain.objects.DefaultObjectStore +import com.anytypeio.anytype.domain.objects.DefaultStoreOfObjectTypes +import com.anytypeio.anytype.domain.objects.DefaultStoreOfRelations +import com.anytypeio.anytype.domain.objects.ObjectStore +import com.anytypeio.anytype.domain.objects.StoreOfObjectTypes +import com.anytypeio.anytype.domain.objects.StoreOfRelations +import com.anytypeio.anytype.domain.search.SearchObjects import com.anytypeio.anytype.presentation.relations.ObjectSetConfig import com.anytypeio.anytype.presentation.sets.ObjectSet +import com.anytypeio.anytype.presentation.sets.ObjectSetDatabase import com.anytypeio.anytype.presentation.sets.ObjectSetSession import com.anytypeio.anytype.presentation.sets.filter.FilterViewModel import com.anytypeio.anytype.presentation.util.Dispatcher @@ -60,8 +66,6 @@ class ModifyStatusFilterTest { lateinit var repo: BlockRepository @Mock lateinit var gateway: Gateway - @Mock - lateinit var objectTypesProvider: ObjectTypesProvider @Mock lateinit var analytics: Analytics @@ -74,6 +78,10 @@ class ModifyStatusFilterTest { private val session = ObjectSetSession() private val state = MutableStateFlow(ObjectSet.init()) private val dispatcher = Dispatcher.Default() + private val storeOfObjectTypes: StoreOfObjectTypes = DefaultStoreOfObjectTypes() + private val storeOfRelations: StoreOfRelations = DefaultStoreOfRelations() + private val objectStore: ObjectStore = DefaultObjectStore() + private val db = ObjectSetDatabase(store = objectStore) @Before fun setup() { @@ -88,8 +96,10 @@ class ModifyStatusFilterTest { dispatcher = dispatcher, searchObjects = searchObjects, urlBuilder = urlBuilder, - objectTypesProvider = objectTypesProvider, - analytics = analytics + storeOfObjectTypes = storeOfObjectTypes, + analytics = analytics, + storeOfRelations = storeOfRelations, + objectSetDatabase = db ) } diff --git a/app/src/androidTest/java/com/anytypeio/anytype/features/sets/filter/ModifyTagFilterTest.kt b/app/src/androidTest/java/com/anytypeio/anytype/features/sets/filter/ModifyTagFilterTest.kt index c7b98f634..a04d0020a 100644 --- a/app/src/androidTest/java/com/anytypeio/anytype/features/sets/filter/ModifyTagFilterTest.kt +++ b/app/src/androidTest/java/com/anytypeio/anytype/features/sets/filter/ModifyTagFilterTest.kt @@ -22,11 +22,18 @@ import com.anytypeio.anytype.core_models.Relation import com.anytypeio.anytype.domain.`object`.ObjectTypesProvider import com.anytypeio.anytype.domain.block.repo.BlockRepository import com.anytypeio.anytype.domain.config.Gateway -import com.anytypeio.anytype.domain.search.SearchObjects import com.anytypeio.anytype.domain.dataview.interactor.UpdateDataViewViewer import com.anytypeio.anytype.domain.misc.UrlBuilder +import com.anytypeio.anytype.domain.objects.DefaultObjectStore +import com.anytypeio.anytype.domain.objects.DefaultStoreOfObjectTypes +import com.anytypeio.anytype.domain.objects.DefaultStoreOfRelations +import com.anytypeio.anytype.domain.objects.ObjectStore +import com.anytypeio.anytype.domain.objects.StoreOfObjectTypes +import com.anytypeio.anytype.domain.objects.StoreOfRelations +import com.anytypeio.anytype.domain.search.SearchObjects import com.anytypeio.anytype.presentation.relations.ObjectSetConfig import com.anytypeio.anytype.presentation.sets.ObjectSet +import com.anytypeio.anytype.presentation.sets.ObjectSetDatabase import com.anytypeio.anytype.presentation.sets.ObjectSetSession import com.anytypeio.anytype.presentation.sets.filter.FilterViewModel import com.anytypeio.anytype.presentation.util.Dispatcher @@ -72,6 +79,10 @@ class ModifyTagFilterTest { private val session = ObjectSetSession() private val state = MutableStateFlow(ObjectSet.init()) private val dispatcher = Dispatcher.Default() + private val storeOfObjectTypes: StoreOfObjectTypes = DefaultStoreOfObjectTypes() + private val storeOfRelations: StoreOfRelations = DefaultStoreOfRelations() + private val objectStore: ObjectStore = DefaultObjectStore() + private val db = ObjectSetDatabase(store = objectStore) @Before fun setup() { @@ -86,8 +97,10 @@ class ModifyTagFilterTest { dispatcher = dispatcher, searchObjects = searchObjects, urlBuilder = urlBuilder, - objectTypesProvider = objectTypesProvider, - analytics = analytics + analytics = analytics, + storeOfObjectTypes = storeOfObjectTypes, + storeOfRelations = storeOfRelations, + objectSetDatabase = db ) } diff --git a/app/src/main/java/com/anytypeio/anytype/di/common/ComponentManager.kt b/app/src/main/java/com/anytypeio/anytype/di/common/ComponentManager.kt index 3dbea8074..eb27b79fa 100644 --- a/app/src/main/java/com/anytypeio/anytype/di/common/ComponentManager.kt +++ b/app/src/main/java/com/anytypeio/anytype/di/common/ComponentManager.kt @@ -10,8 +10,6 @@ import com.anytypeio.anytype.di.feature.CreateAccountModule import com.anytypeio.anytype.di.feature.CreateBookmarkModule import com.anytypeio.anytype.di.feature.CreateDataViewViewerModule import com.anytypeio.anytype.di.feature.CreateObjectModule -import com.anytypeio.anytype.di.feature.CreateObjectTypeModule -import com.anytypeio.anytype.di.feature.CreateSetModule import com.anytypeio.anytype.di.feature.DataViewViewerActionModule import com.anytypeio.anytype.di.feature.DebugSettingsModule import com.anytypeio.anytype.di.feature.DocumentRelationModule @@ -36,12 +34,13 @@ import com.anytypeio.anytype.di.feature.ObjectIconPickerModule import com.anytypeio.anytype.di.feature.ObjectLayoutModule import com.anytypeio.anytype.di.feature.ObjectMenuModule import com.anytypeio.anytype.di.feature.ObjectMenuModuleBase -import com.anytypeio.anytype.di.feature.ObjectRelationValueModule +import com.anytypeio.anytype.di.feature.ObjectObjectRelationValueModule import com.anytypeio.anytype.di.feature.ObjectSearchModule import com.anytypeio.anytype.di.feature.ObjectSetCreateBookmarkRecordModule import com.anytypeio.anytype.di.feature.ObjectSetIconPickerModule import com.anytypeio.anytype.di.feature.ObjectSetMenuModule import com.anytypeio.anytype.di.feature.ObjectSetModule +import com.anytypeio.anytype.di.feature.ObjectSetObjectRelationValueModule import com.anytypeio.anytype.di.feature.ObjectSetRecordModule import com.anytypeio.anytype.di.feature.ObjectSetSettingsModule import com.anytypeio.anytype.di.feature.ObjectTypeChangeModule @@ -338,18 +337,6 @@ class ComponentManager( .build() } - val createSetComponent = Component { - main.createSetComponentBuilder() - .module(CreateSetModule) - .build() - } - - val createObjectTypeComponent = Component { - main.createObjectTypeComponentBuilder() - .module(CreateObjectTypeModule) - .build() - } - val objectSetComponent = ComponentMap { main.objectSetComponentBuilder() .module(ObjectSetModule) @@ -456,7 +443,7 @@ class ComponentManager( objectSetComponent .get(ctx) .objectRelationValueComponent() - .module(ObjectRelationValueModule) + .module(ObjectSetObjectRelationValueModule) .build() } @@ -472,7 +459,7 @@ class ComponentManager( editorComponent .get(ctx) .editDocRelationComponent() - .module(ObjectRelationValueModule) + .module(ObjectObjectRelationValueModule) .build() } diff --git a/app/src/main/java/com/anytypeio/anytype/di/feature/AddObjectRelationObjectValuDI.kt b/app/src/main/java/com/anytypeio/anytype/di/feature/AddObjectRelationObjectValuDI.kt index 5f6c79334..511b29ed5 100644 --- a/app/src/main/java/com/anytypeio/anytype/di/feature/AddObjectRelationObjectValuDI.kt +++ b/app/src/main/java/com/anytypeio/anytype/di/feature/AddObjectRelationObjectValuDI.kt @@ -1,9 +1,9 @@ package com.anytypeio.anytype.di.feature import com.anytypeio.anytype.core_utils.di.scope.PerDialog -import com.anytypeio.anytype.domain.`object`.ObjectTypesProvider -import com.anytypeio.anytype.domain.search.SearchObjects import com.anytypeio.anytype.domain.misc.UrlBuilder +import com.anytypeio.anytype.domain.objects.StoreOfObjectTypes +import com.anytypeio.anytype.domain.search.SearchObjects import com.anytypeio.anytype.presentation.relations.add.AddObjectRelationViewModel import com.anytypeio.anytype.presentation.relations.providers.ObjectRelationProvider import com.anytypeio.anytype.presentation.relations.providers.ObjectValueProvider @@ -34,11 +34,11 @@ object AddObjectRelationModule { fun provideViewModelFactory( relations: ObjectRelationProvider, values: ObjectValueProvider, - objectTypesProvider: ObjectTypesProvider, + storeOfObjectTypes: StoreOfObjectTypes, searchObjects: SearchObjects, urlBuilder: UrlBuilder ): AddObjectRelationViewModel.Factory = AddObjectRelationViewModel.Factory( - relations, values, searchObjects, urlBuilder, objectTypesProvider + relations, values, searchObjects, urlBuilder, storeOfObjectTypes ) } \ No newline at end of file diff --git a/app/src/main/java/com/anytypeio/anytype/di/feature/AddObjectRelationValueDI.kt b/app/src/main/java/com/anytypeio/anytype/di/feature/AddObjectRelationValueDI.kt index d23f0a823..7c7bbad9e 100644 --- a/app/src/main/java/com/anytypeio/anytype/di/feature/AddObjectRelationValueDI.kt +++ b/app/src/main/java/com/anytypeio/anytype/di/feature/AddObjectRelationValueDI.kt @@ -5,11 +5,12 @@ import com.anytypeio.anytype.core_models.Payload import com.anytypeio.anytype.core_utils.di.scope.PerDialog import com.anytypeio.anytype.domain.`object`.UpdateDetail import com.anytypeio.anytype.domain.block.repo.BlockRepository -import com.anytypeio.anytype.domain.dataview.interactor.AddDataViewRelationOption -import com.anytypeio.anytype.domain.relations.AddObjectRelationOption +import com.anytypeio.anytype.domain.objects.options.GetOptions +import com.anytypeio.anytype.domain.relations.CreateRelationOption import com.anytypeio.anytype.presentation.relations.add.AddOptionsRelationDVViewModel import com.anytypeio.anytype.presentation.relations.add.AddOptionsRelationProvider import com.anytypeio.anytype.presentation.relations.add.AddOptionsRelationViewModel +import com.anytypeio.anytype.presentation.relations.providers.ObjectDetailProvider import com.anytypeio.anytype.presentation.relations.providers.ObjectRelationProvider import com.anytypeio.anytype.presentation.relations.providers.ObjectValueProvider import com.anytypeio.anytype.presentation.util.Dispatcher @@ -42,17 +43,21 @@ object AddObjectRelationValueModule { relations: ObjectRelationProvider, values: ObjectValueProvider, dispatcher: Dispatcher, - addDataViewRelationOption: AddDataViewRelationOption, + createRelationOption: CreateRelationOption, analytics: Analytics, setObjectDetail: UpdateDetail, + detailsProvider: ObjectDetailProvider, + getOptions: GetOptions ): AddOptionsRelationDVViewModel.Factory = AddOptionsRelationDVViewModel.Factory( relations = relations, values = values, dispatcher = dispatcher, - addDataViewRelationOption = addDataViewRelationOption, + createRelationOption = createRelationOption, optionsProvider = AddOptionsRelationProvider(), analytics = analytics, - setObjectDetail = setObjectDetail + setObjectDetail = setObjectDetail, + detailsProvider = detailsProvider, + getOptions = getOptions ) @JvmStatic @@ -62,23 +67,32 @@ object AddObjectRelationValueModule { relations: ObjectRelationProvider, values: ObjectValueProvider, dispatcher: Dispatcher, - addObjectRelationOption: AddObjectRelationOption, + createRelationOption: CreateRelationOption, updateDetail: UpdateDetail, - analytics: Analytics + analytics: Analytics, + detailsProvider: ObjectDetailProvider, + getOptions: GetOptions ): AddOptionsRelationViewModel.Factory = AddOptionsRelationViewModel.Factory( relations = relations, values = values, dispatcher = dispatcher, - addObjectRelationOption = addObjectRelationOption, + createRelationOption = createRelationOption, updateDetail = updateDetail, analytics = analytics, - optionsProvider = AddOptionsRelationProvider() + optionsProvider = AddOptionsRelationProvider(), + detailProvider = detailsProvider, + getOptions = getOptions ) @JvmStatic @Provides @PerDialog - fun provideAddObjectRelationOptionUseCase( + fun createRelationOption( repo: BlockRepository - ): AddObjectRelationOption = AddObjectRelationOption(repo = repo) + ): CreateRelationOption = CreateRelationOption(repo = repo) + + @JvmStatic + @Provides + @PerDialog + fun getOptions(repo: BlockRepository) = GetOptions(repo) } \ No newline at end of file diff --git a/app/src/main/java/com/anytypeio/anytype/di/feature/CreateObjectSetDI.kt b/app/src/main/java/com/anytypeio/anytype/di/feature/CreateObjectSetDI.kt deleted file mode 100644 index ed3305ff1..000000000 --- a/app/src/main/java/com/anytypeio/anytype/di/feature/CreateObjectSetDI.kt +++ /dev/null @@ -1,70 +0,0 @@ -package com.anytypeio.anytype.di.feature - -import com.anytypeio.anytype.core_utils.di.scope.PerScreen -import com.anytypeio.anytype.domain.block.interactor.sets.CreateObjectSet -import com.anytypeio.anytype.domain.block.interactor.sets.CreateObjectType -import com.anytypeio.anytype.domain.block.interactor.sets.GetObjectTypes -import com.anytypeio.anytype.domain.block.repo.BlockRepository -import com.anytypeio.anytype.domain.icon.DocumentEmojiIconProvider -import com.anytypeio.anytype.presentation.sets.CreateObjectSetViewModel -import com.anytypeio.anytype.ui.sets.CreateObjectSetFragment -import dagger.Module -import dagger.Provides -import dagger.Subcomponent - -@Subcomponent(modules = [CreateSetModule::class]) -@PerScreen -interface CreateSetSubComponent { - - @Subcomponent.Builder - interface Builder { - fun module(module: CreateSetModule): Builder - fun build(): CreateSetSubComponent - } - - fun inject(fragment: CreateObjectSetFragment) -} - -@Module -object CreateSetModule { - - @JvmStatic - @Provides - @PerScreen - fun provideCreateSetViewModelFactory( - getObjectTypes: GetObjectTypes, - createObjectSet: CreateObjectSet, - createObjectType: CreateObjectType - ): CreateObjectSetViewModel.Factory { - return CreateObjectSetViewModel.Factory( - getObjectTypes = getObjectTypes, - createObjectSet = createObjectSet, - createObjectType = createObjectType - ) - } - - @JvmStatic - @Provides - @PerScreen - fun provideCreateObjectTypeUseCase( - repo: BlockRepository, - documentEmojiProvider: DocumentEmojiIconProvider - ): CreateObjectType = CreateObjectType( - repo = repo, - documentEmojiProvider = documentEmojiProvider - ) - - @JvmStatic - @Provides - @PerScreen - fun provideGetObjectTypesUseCase( - repo: BlockRepository - ): GetObjectTypes = GetObjectTypes(repo = repo) - - @JvmStatic - @Provides - @PerScreen - fun provideCreateObjectSetUseCase( - repo: BlockRepository - ): CreateObjectSet = CreateObjectSet(repo = repo) -} \ No newline at end of file diff --git a/app/src/main/java/com/anytypeio/anytype/di/feature/CreateObjectTypeDI.kt b/app/src/main/java/com/anytypeio/anytype/di/feature/CreateObjectTypeDI.kt deleted file mode 100644 index d442ef8e6..000000000 --- a/app/src/main/java/com/anytypeio/anytype/di/feature/CreateObjectTypeDI.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.anytypeio.anytype.di.feature - -import com.anytypeio.anytype.presentation.sets.CreateObjectTypeViewModel -import com.anytypeio.anytype.core_utils.di.scope.PerScreen -import com.anytypeio.anytype.ui.sets.CreateObjectTypeFragment -import dagger.Module -import dagger.Provides -import dagger.Subcomponent - -@Subcomponent(modules = [CreateObjectTypeModule::class]) -@PerScreen -interface CreateObjectTypeSubComponent { - - @Subcomponent.Builder - interface Builder { - fun module(module: CreateObjectTypeModule): Builder - fun build(): CreateObjectTypeSubComponent - } - - fun inject(fragment: CreateObjectTypeFragment) -} - -@Module -object CreateObjectTypeModule { - - @JvmStatic - @Provides - @PerScreen - fun provideCreateObjectTypeViewModelFactory( - ): CreateObjectTypeViewModel.Factory { - return CreateObjectTypeViewModel.Factory() - } -} \ No newline at end of file diff --git a/app/src/main/java/com/anytypeio/anytype/di/feature/DashboardDi.kt b/app/src/main/java/com/anytypeio/anytype/di/feature/DashboardDi.kt index 6adc6fdda..ab9e3d1d8 100644 --- a/app/src/main/java/com/anytypeio/anytype/di/feature/DashboardDi.kt +++ b/app/src/main/java/com/anytypeio/anytype/di/feature/DashboardDi.kt @@ -16,7 +16,6 @@ import com.anytypeio.anytype.domain.config.InfrastructureRepository import com.anytypeio.anytype.domain.config.UserSettingsRepository import com.anytypeio.anytype.domain.dashboard.interactor.CloseDashboard import com.anytypeio.anytype.domain.dashboard.interactor.OpenDashboard -import com.anytypeio.anytype.domain.search.SearchObjects import com.anytypeio.anytype.domain.event.interactor.EventChannel import com.anytypeio.anytype.domain.event.interactor.InterceptEvents import com.anytypeio.anytype.domain.launch.GetDefaultEditorType @@ -24,12 +23,14 @@ import com.anytypeio.anytype.domain.misc.UrlBuilder import com.anytypeio.anytype.domain.objects.DeleteObjects import com.anytypeio.anytype.domain.objects.ObjectStore import com.anytypeio.anytype.domain.objects.SetObjectListIsArchived +import com.anytypeio.anytype.domain.objects.StoreOfObjectTypes +import com.anytypeio.anytype.domain.page.CreateNewObject import com.anytypeio.anytype.domain.page.CreatePage import com.anytypeio.anytype.domain.search.CancelSearchSubscription import com.anytypeio.anytype.domain.search.ObjectSearchSubscriptionContainer +import com.anytypeio.anytype.domain.search.SearchObjects import com.anytypeio.anytype.domain.search.SubscriptionEventChannel import com.anytypeio.anytype.domain.templates.GetTemplates -import com.anytypeio.anytype.domain.page.CreateNewObject import com.anytypeio.anytype.presentation.dashboard.HomeDashboardEventConverter import com.anytypeio.anytype.presentation.dashboard.HomeDashboardViewModelFactory import com.anytypeio.anytype.ui.dashboard.DashboardFragment @@ -77,8 +78,9 @@ object HomeDashboardModule { objectSearchSubscriptionContainer: ObjectSearchSubscriptionContainer, cancelSearchSubscription: CancelSearchSubscription, objectStore: ObjectStore, + featureToggles: FeatureToggles, createNewObject: CreateNewObject, - featureToggles: FeatureToggles + storeOfObjectTypes: StoreOfObjectTypes ): HomeDashboardViewModelFactory = HomeDashboardViewModelFactory( getProfile = getProfile, openDashboard = openDashboard, @@ -97,7 +99,8 @@ object HomeDashboardModule { cancelSearchSubscription = cancelSearchSubscription, objectStore = objectStore, createNewObject = createNewObject, - featureToggles = featureToggles + featureToggles = featureToggles, + storeOfObjectTypes = storeOfObjectTypes ) @JvmStatic 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 a931f00fe..4d57e7fb0 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 @@ -12,9 +12,8 @@ import com.anytypeio.anytype.di.feature.cover.UnsplashSubComponent import com.anytypeio.anytype.di.feature.relations.RelationAddToObjectSubComponent import com.anytypeio.anytype.di.feature.relations.RelationCreateFromScratchForObjectBlockSubComponent import com.anytypeio.anytype.di.feature.relations.RelationCreateFromScratchForObjectSubComponent -import com.anytypeio.anytype.domain.`object`.DuplicateObject import com.anytypeio.anytype.domain.`object`.ConvertObjectToSet -import com.anytypeio.anytype.domain.`object`.ObjectTypesProvider +import com.anytypeio.anytype.domain.`object`.DuplicateObject import com.anytypeio.anytype.domain.`object`.UpdateDetail import com.anytypeio.anytype.domain.auth.repo.AuthRepository import com.anytypeio.anytype.domain.base.AppCoroutineDispatchers @@ -51,7 +50,6 @@ import com.anytypeio.anytype.domain.clipboard.Copy import com.anytypeio.anytype.domain.clipboard.Paste import com.anytypeio.anytype.domain.config.UserSettingsRepository import com.anytypeio.anytype.domain.cover.SetDocCoverImage -import com.anytypeio.anytype.domain.dataview.interactor.GetCompatibleObjectTypes import com.anytypeio.anytype.domain.download.DownloadFile import com.anytypeio.anytype.domain.download.Downloader import com.anytypeio.anytype.domain.event.interactor.EventChannel @@ -61,6 +59,8 @@ import com.anytypeio.anytype.domain.icon.SetDocumentImageIcon import com.anytypeio.anytype.domain.launch.GetDefaultEditorType import com.anytypeio.anytype.domain.misc.UrlBuilder import com.anytypeio.anytype.domain.objects.SetObjectIsArchived +import com.anytypeio.anytype.domain.objects.StoreOfObjectTypes +import com.anytypeio.anytype.domain.objects.StoreOfRelations import com.anytypeio.anytype.domain.page.CloseBlock import com.anytypeio.anytype.domain.page.CreateDocument import com.anytypeio.anytype.domain.page.CreateNewDocument @@ -74,6 +74,7 @@ import com.anytypeio.anytype.domain.page.UpdateTitle import com.anytypeio.anytype.domain.page.bookmark.CreateBookmarkBlock import com.anytypeio.anytype.domain.page.bookmark.SetupBookmark import com.anytypeio.anytype.domain.relations.AddFileToObject +import com.anytypeio.anytype.domain.relations.AddRelationToObject import com.anytypeio.anytype.domain.relations.SetRelationKey import com.anytypeio.anytype.domain.search.SearchObjects import com.anytypeio.anytype.domain.sets.FindObjectSetForType @@ -217,8 +218,6 @@ object EditorSessionModule { delegator: Delegator, detailModificationManager: DetailModificationManager, updateDetail: UpdateDetail, - getCompatibleObjectTypes: GetCompatibleObjectTypes, - objectTypesProvider: ObjectTypesProvider, searchObjects: SearchObjects, getDefaultEditorType: GetDefaultEditorType, findObjectSetForType: FindObjectSetForType, @@ -228,6 +227,8 @@ object EditorSessionModule { setDocImageIcon: SetDocumentImageIcon, editorTemplateDelegate: EditorTemplateDelegate, createNewObject: CreateNewObject, + storeOfRelations: StoreOfRelations, + storeOfObjectTypes: StoreOfObjectTypes, objectToSet: ConvertObjectToSet, featureToggles: FeatureToggles, tableDelegate: EditorTableDelegate @@ -250,8 +251,6 @@ object EditorSessionModule { delegator = delegator, detailModificationManager = detailModificationManager, updateDetail = updateDetail, - getCompatibleObjectTypes = getCompatibleObjectTypes, - objectTypesProvider = objectTypesProvider, searchObjects = searchObjects, getDefaultEditorType = getDefaultEditorType, findObjectSetForType = findObjectSetForType, @@ -262,6 +261,8 @@ object EditorSessionModule { setDocImageIcon = setDocImageIcon, editorTemplateDelegate = editorTemplateDelegate, createNewObject = createNewObject, + storeOfRelations = storeOfRelations, + storeOfObjectTypes = storeOfObjectTypes, objectToSet = objectToSet, featureToggles = featureToggles, tableDelegate = tableDelegate @@ -307,11 +308,13 @@ object EditorSessionModule { fun provideDefaultBlockViewRenderer( urlBuilder: UrlBuilder, toggleStateHolder: ToggleStateHolder, - coverImageHashProvider: CoverImageHashProvider + coverImageHashProvider: CoverImageHashProvider, + storeOfRelations: StoreOfRelations ): DefaultBlockViewRenderer = DefaultBlockViewRenderer( urlBuilder = urlBuilder, toggleStateHolder = toggleStateHolder, - coverImageHashProvider = coverImageHashProvider + coverImageHashProvider = coverImageHashProvider, + storeOfRelations = storeOfRelations ) @JvmStatic @@ -831,8 +834,12 @@ object EditorUseCaseModule { @Provides @PerScreen fun provideDefaultObjectRelationProvider( - storage: Editor.Storage - ): ObjectRelationProvider = DefaultObjectRelationProvider(storage.relations) + storage: Editor.Storage, + storeOfRelations: StoreOfRelations + ): ObjectRelationProvider = DefaultObjectRelationProvider( + storage = storage, + storeOfRelations = storeOfRelations + ) @JvmStatic @Provides @@ -924,13 +931,6 @@ object EditorUseCaseModule { fun provideGetDefaultPageType(repo: UserSettingsRepository): GetDefaultEditorType = GetDefaultEditorType(repo) - @JvmStatic - @Provides - @PerScreen - fun provideGetCompatibleObjectTypesUseCase( - repository: BlockRepository - ): GetCompatibleObjectTypes = GetCompatibleObjectTypes(repository) - @JvmStatic @Provides @PerScreen @@ -997,6 +997,11 @@ object EditorUseCaseModule { ) ) + @JvmStatic + @Provides + @PerScreen + fun provideAddRelationToObject(repo: BlockRepository) = AddRelationToObject(repo) + @JvmStatic @Provides @PerScreen diff --git a/app/src/main/java/com/anytypeio/anytype/di/feature/LinkToObjectOrWebDi.kt b/app/src/main/java/com/anytypeio/anytype/di/feature/LinkToObjectOrWebDi.kt index b8935dc8b..eed02f43f 100644 --- a/app/src/main/java/com/anytypeio/anytype/di/feature/LinkToObjectOrWebDi.kt +++ b/app/src/main/java/com/anytypeio/anytype/di/feature/LinkToObjectOrWebDi.kt @@ -3,9 +3,9 @@ package com.anytypeio.anytype.di.feature import com.anytypeio.anytype.analytics.base.Analytics import com.anytypeio.anytype.core_utils.di.scope.PerModal import com.anytypeio.anytype.core_utils.tools.UrlValidator -import com.anytypeio.anytype.domain.`object`.ObjectTypesProvider -import com.anytypeio.anytype.domain.search.SearchObjects import com.anytypeio.anytype.domain.misc.UrlBuilder +import com.anytypeio.anytype.domain.objects.StoreOfObjectTypes +import com.anytypeio.anytype.domain.search.SearchObjects import com.anytypeio.anytype.presentation.editor.Editor import com.anytypeio.anytype.presentation.linking.LinkToObjectOrWebViewModelFactory import com.anytypeio.anytype.ui.linking.LinkToObjectOrWebPagesFragment @@ -36,14 +36,14 @@ object LinkToObjectOrWebModule { @Provides fun provideLinkToObjectViewModelFactory( urlBuilder: UrlBuilder, - objectTypesProvider: ObjectTypesProvider, + storeOfObjectTypes: StoreOfObjectTypes, searchObjects: SearchObjects, analytics: Analytics, stores: Editor.Storage, urlValidator: UrlValidator ): LinkToObjectOrWebViewModelFactory = LinkToObjectOrWebViewModelFactory( urlBuilder = urlBuilder, - objectTypesProvider = objectTypesProvider, + storeOfObjectTypes = storeOfObjectTypes, searchObjects = searchObjects, analytics = analytics, stores = stores, diff --git a/app/src/main/java/com/anytypeio/anytype/di/feature/MainEntryDI.kt b/app/src/main/java/com/anytypeio/anytype/di/feature/MainEntryDI.kt index 711b2ad67..910db82a2 100644 --- a/app/src/main/java/com/anytypeio/anytype/di/feature/MainEntryDI.kt +++ b/app/src/main/java/com/anytypeio/anytype/di/feature/MainEntryDI.kt @@ -12,6 +12,7 @@ import com.anytypeio.anytype.domain.config.ConfigStorage import com.anytypeio.anytype.domain.config.FeaturesConfigProvider import com.anytypeio.anytype.domain.config.UserSettingsRepository import com.anytypeio.anytype.domain.device.PathProvider +import com.anytypeio.anytype.domain.search.RelationsSubscriptionManager import com.anytypeio.anytype.domain.theme.GetTheme import com.anytypeio.anytype.domain.wallpaper.ObserveWallpaper import com.anytypeio.anytype.domain.wallpaper.RestoreWallpaper @@ -49,14 +50,16 @@ object MainEntryModule { observeWallpaper: ObserveWallpaper, restoreWallpaper: RestoreWallpaper, interceptAccountStatus: InterceptAccountStatus, - logout: Logout + logout: Logout, + relationsSubscriptionManager: RelationsSubscriptionManager ): MainViewModelFactory = MainViewModelFactory( resumeAccount = resumeAccount, analytics = analytics, observeWallpaper = observeWallpaper, restoreWallpaper = restoreWallpaper, interceptAccountStatus = interceptAccountStatus, - logout = logout + logout = logout, + relationsSubscriptionManager = relationsSubscriptionManager ) @JvmStatic diff --git a/app/src/main/java/com/anytypeio/anytype/di/feature/ObjectRelationDI.kt b/app/src/main/java/com/anytypeio/anytype/di/feature/ObjectRelationDI.kt index 11f02bef7..bcc041549 100644 --- a/app/src/main/java/com/anytypeio/anytype/di/feature/ObjectRelationDI.kt +++ b/app/src/main/java/com/anytypeio/anytype/di/feature/ObjectRelationDI.kt @@ -5,10 +5,11 @@ import com.anytypeio.anytype.core_models.Payload import com.anytypeio.anytype.core_utils.di.scope.PerModal import com.anytypeio.anytype.domain.`object`.UpdateDetail import com.anytypeio.anytype.domain.block.repo.BlockRepository -import com.anytypeio.anytype.domain.relations.ObjectRelationList import com.anytypeio.anytype.domain.misc.UrlBuilder +import com.anytypeio.anytype.domain.objects.StoreOfRelations import com.anytypeio.anytype.domain.relations.AddToFeaturedRelations import com.anytypeio.anytype.domain.relations.DeleteRelationFromObject +import com.anytypeio.anytype.domain.relations.ObjectRelationList import com.anytypeio.anytype.domain.relations.RemoveFromFeaturedRelations import com.anytypeio.anytype.presentation.editor.Editor import com.anytypeio.anytype.presentation.editor.editor.DetailModificationManager @@ -47,7 +48,8 @@ object DocumentRelationModule { addToFeaturedRelations: AddToFeaturedRelations, removeFromFeaturedRelations: RemoveFromFeaturedRelations, deleteRelationFromObject: DeleteRelationFromObject, - analytics: Analytics + analytics: Analytics, + storeOfRelations: StoreOfRelations ): ObjectRelationListViewModelFactory { return ObjectRelationListViewModelFactory( stores = stores, @@ -59,7 +61,8 @@ object DocumentRelationModule { addToFeaturedRelations = addToFeaturedRelations, removeFromFeaturedRelations = removeFromFeaturedRelations, deleteRelationFromObject = deleteRelationFromObject, - analytics = analytics + analytics = analytics, + storeOfRelations = storeOfRelations ) } diff --git a/app/src/main/java/com/anytypeio/anytype/di/feature/ObjectRelationValueDi.kt b/app/src/main/java/com/anytypeio/anytype/di/feature/ObjectRelationValueDi.kt index 118b536b1..f70b58830 100644 --- a/app/src/main/java/com/anytypeio/anytype/di/feature/ObjectRelationValueDi.kt +++ b/app/src/main/java/com/anytypeio/anytype/di/feature/ObjectRelationValueDi.kt @@ -4,11 +4,9 @@ import android.content.Context import com.anytypeio.anytype.analytics.base.Analytics import com.anytypeio.anytype.core_models.Payload import com.anytypeio.anytype.core_utils.di.scope.PerModal -import com.anytypeio.anytype.domain.`object`.ObjectTypesProvider import com.anytypeio.anytype.domain.`object`.UpdateDetail -import com.anytypeio.anytype.domain.block.repo.BlockRepository -import com.anytypeio.anytype.domain.dataview.interactor.AddDataViewRelationOption import com.anytypeio.anytype.domain.misc.UrlBuilder +import com.anytypeio.anytype.domain.objects.StoreOfObjectTypes import com.anytypeio.anytype.domain.relations.AddFileToObject import com.anytypeio.anytype.presentation.relations.providers.ObjectDetailProvider import com.anytypeio.anytype.presentation.relations.providers.ObjectRelationProvider @@ -24,12 +22,12 @@ import dagger.Module import dagger.Provides import dagger.Subcomponent -@Subcomponent(modules = [ObjectRelationValueModule::class, ObjectSetObjectRelationValueModule::class]) +@Subcomponent(modules = [ObjectSetObjectRelationValueModule::class]) @PerModal interface ObjectSetObjectRelationValueSubComponent { @Subcomponent.Builder interface Builder { - fun module(module: ObjectRelationValueModule): Builder + fun module(module: ObjectSetObjectRelationValueModule): Builder fun build(): ObjectSetObjectRelationValueSubComponent } @@ -40,12 +38,12 @@ interface ObjectSetObjectRelationValueSubComponent { fun addRelationFileValueAddComponent() : AddFileRelationSubComponent.Builder } -@Subcomponent(modules = [ObjectRelationValueModule::class, ObjectObjectRelationValueModule::class]) +@Subcomponent(modules = [ObjectObjectRelationValueModule::class]) @PerModal interface ObjectObjectRelationValueSubComponent { @Subcomponent.Builder interface Builder { - fun module(module: ObjectRelationValueModule): Builder + fun module(module: ObjectObjectRelationValueModule): Builder fun build(): ObjectObjectRelationValueSubComponent } @@ -56,17 +54,6 @@ interface ObjectObjectRelationValueSubComponent { fun addRelationFileValueAddComponent() : AddFileRelationSubComponent.Builder } -@Module -object ObjectRelationValueModule { - - @JvmStatic - @Provides - @PerModal - fun provideAddRelationOptionUseCase( - repo: BlockRepository - ): AddDataViewRelationOption = AddDataViewRelationOption(repo = repo) -} - @Module object ObjectSetObjectRelationValueModule { @@ -84,7 +71,7 @@ object ObjectSetObjectRelationValueModule { relations: ObjectRelationProvider, values: ObjectValueProvider, details: ObjectDetailProvider, - types: ObjectTypesProvider, + storeOfObjectTypes: StoreOfObjectTypes, urlBuilder: UrlBuilder, setObjectDetails: UpdateDetail, addFileToObject: AddFileToObject, @@ -95,7 +82,7 @@ object ObjectSetObjectRelationValueModule { relations = relations, values = values, details = details, - types = types, + storeOfObjectTypes = storeOfObjectTypes, urlBuilder = urlBuilder, addFileToObject = addFileToObject, copyFileToCache = copyFileToCacheDirectory, @@ -115,7 +102,7 @@ object ObjectObjectRelationValueModule { relations: ObjectRelationProvider, values: ObjectValueProvider, details: ObjectDetailProvider, - types: ObjectTypesProvider, + storeOfObjectTypes: StoreOfObjectTypes, urlBuilder: UrlBuilder, dispatcher: Dispatcher, updateDetail: UpdateDetail, @@ -126,7 +113,7 @@ object ObjectObjectRelationValueModule { relations = relations, values = values, details = details, - types = types, + storeOfObjectTypes = storeOfObjectTypes, urlBuilder = urlBuilder, dispatcher = dispatcher, updateDetail = updateDetail, 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 e8c662726..f9d8f2cd2 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 @@ -23,8 +23,7 @@ import com.anytypeio.anytype.domain.block.repo.BlockRepository import com.anytypeio.anytype.domain.config.UserSettingsRepository import com.anytypeio.anytype.domain.cover.SetDocCoverImage import com.anytypeio.anytype.domain.dataview.SetDataViewSource -import com.anytypeio.anytype.domain.dataview.interactor.AddNewRelationToDataView -import com.anytypeio.anytype.domain.dataview.interactor.CreateDataViewRecord +import com.anytypeio.anytype.domain.dataview.interactor.CreateDataViewObject import com.anytypeio.anytype.domain.dataview.interactor.UpdateDataViewViewer import com.anytypeio.anytype.domain.event.interactor.EventChannel import com.anytypeio.anytype.domain.event.interactor.InterceptEvents @@ -34,6 +33,7 @@ import com.anytypeio.anytype.domain.misc.UrlBuilder import com.anytypeio.anytype.domain.objects.DefaultObjectStore import com.anytypeio.anytype.domain.objects.ObjectStore import com.anytypeio.anytype.domain.objects.SetObjectIsArchived +import com.anytypeio.anytype.domain.objects.StoreOfRelations import com.anytypeio.anytype.domain.page.CloseBlock import com.anytypeio.anytype.domain.page.CreateNewObject import com.anytypeio.anytype.domain.page.CreatePage @@ -61,14 +61,11 @@ import com.anytypeio.anytype.presentation.relations.providers.ObjectValueProvide import com.anytypeio.anytype.presentation.sets.ObjectSet import com.anytypeio.anytype.presentation.sets.ObjectSetDatabase import com.anytypeio.anytype.presentation.sets.ObjectSetPaginator -import com.anytypeio.anytype.presentation.sets.ObjectSetRecordCache import com.anytypeio.anytype.presentation.sets.ObjectSetReducer import com.anytypeio.anytype.presentation.sets.ObjectSetSession import com.anytypeio.anytype.presentation.sets.ObjectSetViewModelFactory import com.anytypeio.anytype.presentation.util.Dispatcher -import com.anytypeio.anytype.presentation.util.downloader.UriFileProvider import com.anytypeio.anytype.providers.DefaultCoverImageHashProvider -import com.anytypeio.anytype.providers.DefaultUriFileProvider import com.anytypeio.anytype.ui.sets.ObjectSetFragment import dagger.Binds import dagger.Module @@ -138,17 +135,16 @@ object ObjectSetModule { fun provideObjectSetViewModelFactory( openObjectSet: OpenObjectSet, closeBlock: CloseBlock, - addDataViewRelation: AddNewRelationToDataView, updateDataViewViewer: UpdateDataViewViewer, setObjectDetails: UpdateDetail, updateText: UpdateText, interceptEvents: InterceptEvents, interceptThreadStatus: InterceptThreadStatus, - createDataViewRecord: CreateDataViewRecord, + createDataViewObject: CreateDataViewObject, + createNewObject: CreateNewObject, reducer: ObjectSetReducer, dispatcher: Dispatcher, delegator: Delegator, - objectSetRecordCache: ObjectSetRecordCache, urlBuilder: UrlBuilder, coverImageHashProvider: CoverImageHashProvider, session: ObjectSetSession, @@ -158,24 +154,22 @@ object ObjectSetModule { getTemplates: GetTemplates, dataViewSubscriptionContainer: DataViewSubscriptionContainer, cancelSearchSubscription: CancelSearchSubscription, - createNewObject: CreateNewObject, setDataViewSource: SetDataViewSource, database: ObjectSetDatabase, - paginator: ObjectSetPaginator + paginator: ObjectSetPaginator, + storeOfRelations: StoreOfRelations ): ObjectSetViewModelFactory = ObjectSetViewModelFactory( openObjectSet = openObjectSet, closeBlock = closeBlock, - addDataViewRelation = addDataViewRelation, updateDataViewViewer = updateDataViewViewer, setObjectDetails = setObjectDetails, - createDataViewRecord = createDataViewRecord, + createDataViewObject = createDataViewObject, updateText = updateText, interceptEvents = interceptEvents, interceptThreadStatus = interceptThreadStatus, reducer = reducer, dispatcher = dispatcher, delegator = delegator, - objectSetRecordCache = objectSetRecordCache, coverImageHashProvider = coverImageHashProvider, urlBuilder = urlBuilder, session = session, @@ -188,7 +182,8 @@ object ObjectSetModule { cancelSearchSubscription = cancelSearchSubscription, setDataViewSource = setDataViewSource, database = database, - paginator = paginator + paginator = paginator, + storeOfRelations = storeOfRelations ) @JvmStatic @@ -234,13 +229,6 @@ object ObjectSetModule { auth: AuthRepository ): OpenObjectSet = OpenObjectSet(repo = repo, auth = auth) - @JvmStatic - @Provides - @PerScreen - fun provideAddDataViewRelationUseCase( - repo: BlockRepository - ): AddNewRelationToDataView = AddNewRelationToDataView(repo = repo) - @JvmStatic @Provides @PerScreen @@ -253,7 +241,7 @@ object ObjectSetModule { @PerScreen fun provideCreateDataViewRecordUseCase( repo: BlockRepository - ): CreateDataViewRecord = CreateDataViewRecord(repo = repo) + ): CreateDataViewObject = CreateDataViewObject(repo = repo) @JvmStatic @Provides @@ -315,17 +303,16 @@ object ObjectSetModule { @PerScreen fun provideDelegator(): Delegator = Delegator.Default() - @JvmStatic - @Provides - @PerScreen - fun provideObjectSetRecordCache(): ObjectSetRecordCache = ObjectSetRecordCache() - @JvmStatic @Provides @PerScreen fun provideDataViewObjectRelationProvider( - state: StateFlow - ): ObjectRelationProvider = DataViewObjectRelationProvider(state) + state: StateFlow, + storeOfRelations: StoreOfRelations + ): ObjectRelationProvider = DataViewObjectRelationProvider( + objectSetState = state, + storeOfRelations = storeOfRelations + ) @JvmStatic @Provides diff --git a/app/src/main/java/com/anytypeio/anytype/di/feature/ObjectSetRecordDI.kt b/app/src/main/java/com/anytypeio/anytype/di/feature/ObjectSetRecordDI.kt index 4562606c5..f97eadb93 100644 --- a/app/src/main/java/com/anytypeio/anytype/di/feature/ObjectSetRecordDI.kt +++ b/app/src/main/java/com/anytypeio/anytype/di/feature/ObjectSetRecordDI.kt @@ -1,14 +1,13 @@ package com.anytypeio.anytype.di.feature; import com.anytypeio.anytype.domain.`object`.UpdateDetail -import com.anytypeio.anytype.presentation.sets.ObjectSet -import com.anytypeio.anytype.presentation.sets.ObjectSetRecordCache +import com.anytypeio.anytype.domain.objects.ObjectStore import com.anytypeio.anytype.presentation.sets.ObjectSetRecordViewModel import com.anytypeio.anytype.ui.sets.modals.SetObjectSetRecordNameFragment import dagger.Module import dagger.Provides import dagger.Subcomponent -import kotlinx.coroutines.flow.StateFlow +import javax.inject.Named import javax.inject.Scope @Subcomponent(modules = [ObjectSetRecordModule::class]) @@ -25,20 +24,18 @@ interface ObjectSetRecordSubComponent { @Module object ObjectSetRecordModule { - @JvmStatic @Provides @ObjectSetRecordScope fun provideObjectSetRecordViewModelFactory( setObjectDetails: UpdateDetail, - objectSetState: StateFlow, - objectSetRecordCache: ObjectSetRecordCache + @Named("object-set-store") objectStore: ObjectStore ): ObjectSetRecordViewModel.Factory = ObjectSetRecordViewModel.Factory( setObjectDetails = setObjectDetails, - objectSetRecordCache = objectSetRecordCache + objectStore = objectStore ) } @Scope -@kotlin.annotation.Retention(AnnotationRetention.RUNTIME) +@Retention(AnnotationRetention.RUNTIME) annotation class ObjectSetRecordScope \ No newline at end of file diff --git a/app/src/main/java/com/anytypeio/anytype/di/feature/ObjectSetSettingsDi.kt b/app/src/main/java/com/anytypeio/anytype/di/feature/ObjectSetSettingsDi.kt index 00ed9f48f..f1a1ae5af 100644 --- a/app/src/main/java/com/anytypeio/anytype/di/feature/ObjectSetSettingsDi.kt +++ b/app/src/main/java/com/anytypeio/anytype/di/feature/ObjectSetSettingsDi.kt @@ -6,6 +6,7 @@ import com.anytypeio.anytype.core_utils.di.scope.PerModal import com.anytypeio.anytype.domain.block.repo.BlockRepository import com.anytypeio.anytype.domain.dataview.interactor.ModifyDataViewViewerRelationOrder import com.anytypeio.anytype.domain.dataview.interactor.UpdateDataViewViewer +import com.anytypeio.anytype.domain.objects.StoreOfRelations import com.anytypeio.anytype.domain.relations.DeleteRelationFromDataView import com.anytypeio.anytype.presentation.relations.ObjectSetSettingsViewModel import com.anytypeio.anytype.presentation.sets.ObjectSet @@ -42,6 +43,7 @@ object ObjectSetSettingsModule { modifyViewerRelationOrder: ModifyDataViewViewerRelationOrder, updateDataViewViewer: UpdateDataViewViewer, deleteRelationFromDataView: DeleteRelationFromDataView, + store: StoreOfRelations, analytics: Analytics ): ObjectSetSettingsViewModel.Factory = ObjectSetSettingsViewModel.Factory( state = state, @@ -50,7 +52,8 @@ object ObjectSetSettingsModule { modifyViewerRelationOrder = modifyViewerRelationOrder, updateDataViewViewer = updateDataViewViewer, deleteRelationFromDataView = deleteRelationFromDataView, - analytics = analytics + analytics = analytics, + store = store, ) @JvmStatic diff --git a/app/src/main/java/com/anytypeio/anytype/di/feature/ObjectTypeDI.kt b/app/src/main/java/com/anytypeio/anytype/di/feature/ObjectTypeDI.kt index 939c89bad..5d1575a56 100644 --- a/app/src/main/java/com/anytypeio/anytype/di/feature/ObjectTypeDI.kt +++ b/app/src/main/java/com/anytypeio/anytype/di/feature/ObjectTypeDI.kt @@ -2,9 +2,14 @@ package com.anytypeio.anytype.di.feature import com.anytypeio.anytype.core_utils.di.scope.PerScreen import com.anytypeio.anytype.domain.block.repo.BlockRepository -import com.anytypeio.anytype.domain.dataview.interactor.GetCompatibleObjectTypes +import com.anytypeio.anytype.domain.objects.StoreOfObjectTypes +import com.anytypeio.anytype.domain.search.SearchObjects import com.anytypeio.anytype.presentation.objects.ObjectTypeChangeViewModelFactory -import com.anytypeio.anytype.ui.objects.ObjectTypeChangeFragment +import com.anytypeio.anytype.ui.objects.types.pickers.AppDefaultObjectTypeFragment +import com.anytypeio.anytype.ui.objects.types.pickers.DataViewSelectSourceFragment +import com.anytypeio.anytype.ui.objects.types.pickers.DraftObjectSelectTypeFragment +import com.anytypeio.anytype.ui.objects.types.pickers.EmptyDataViewSelectSourceFragment +import com.anytypeio.anytype.ui.objects.types.pickers.ObjectSelectTypeFragment import dagger.Module import dagger.Provides import dagger.Subcomponent @@ -19,7 +24,11 @@ interface ObjectTypeChangeSubComponent { fun build(): ObjectTypeChangeSubComponent } - fun inject(fragment: ObjectTypeChangeFragment) + fun inject(fragment: DraftObjectSelectTypeFragment) + fun inject(fragment: ObjectSelectTypeFragment) + fun inject(fragment: DataViewSelectSourceFragment) + fun inject(fragment: EmptyDataViewSelectSourceFragment) + fun inject(fragment: AppDefaultObjectTypeFragment) } @Module @@ -29,17 +38,17 @@ object ObjectTypeChangeModule { @Provides @PerScreen fun provideObjectTypeViewModelFactory( - getCompatibleObjectTypes: GetCompatibleObjectTypes + storeOfObjectTypes: StoreOfObjectTypes ): ObjectTypeChangeViewModelFactory { return ObjectTypeChangeViewModelFactory( - getCompatibleObjectTypes = getCompatibleObjectTypes + storeOfObjectTypes = storeOfObjectTypes ) } @JvmStatic @Provides @PerScreen - fun provideGetCompatibleObjectTypesUseCase( + fun provideSearchObjectsUseCase( repository: BlockRepository - ): GetCompatibleObjectTypes = GetCompatibleObjectTypes(repository) + ): SearchObjects = SearchObjects(repository) } \ No newline at end of file diff --git a/app/src/main/java/com/anytypeio/anytype/di/feature/SelectSortRelationDI.kt b/app/src/main/java/com/anytypeio/anytype/di/feature/SelectSortRelationDI.kt index 43f4c02da..f521599f1 100644 --- a/app/src/main/java/com/anytypeio/anytype/di/feature/SelectSortRelationDI.kt +++ b/app/src/main/java/com/anytypeio/anytype/di/feature/SelectSortRelationDI.kt @@ -5,6 +5,7 @@ import com.anytypeio.anytype.core_models.Payload import com.anytypeio.anytype.core_utils.di.scope.PerModal import com.anytypeio.anytype.domain.block.repo.BlockRepository import com.anytypeio.anytype.domain.dataview.interactor.AddDataViewViewerSort +import com.anytypeio.anytype.domain.objects.StoreOfRelations import com.anytypeio.anytype.presentation.sets.ObjectSet import com.anytypeio.anytype.presentation.sets.ObjectSetSession import com.anytypeio.anytype.presentation.sets.SelectSortRelationViewModel @@ -37,12 +38,14 @@ object SelectSortRelationModule { session: ObjectSetSession, dispatcher: Dispatcher, addDataViewViewerSort: AddDataViewViewerSort, + storeOfRelations: StoreOfRelations, analytics: Analytics ): SelectSortRelationViewModel.Factory = SelectSortRelationViewModel.Factory( state = state, session = session, dispatcher = dispatcher, addDataViewViewerSort = addDataViewViewerSort, + storeOfRelations = storeOfRelations, analytics = analytics ) diff --git a/app/src/main/java/com/anytypeio/anytype/di/feature/SplashDi.kt b/app/src/main/java/com/anytypeio/anytype/di/feature/SplashDi.kt index 5baa866ee..56197258c 100644 --- a/app/src/main/java/com/anytypeio/anytype/di/feature/SplashDi.kt +++ b/app/src/main/java/com/anytypeio/anytype/di/feature/SplashDi.kt @@ -18,6 +18,8 @@ import com.anytypeio.anytype.domain.launch.GetDefaultEditorType import com.anytypeio.anytype.domain.launch.SetDefaultEditorType import com.anytypeio.anytype.domain.misc.AppActionManager import com.anytypeio.anytype.domain.page.CreatePage +import com.anytypeio.anytype.domain.search.ObjectTypesSubscriptionManager +import com.anytypeio.anytype.domain.search.RelationsSubscriptionManager import com.anytypeio.anytype.presentation.splash.SplashViewModelFactory import com.anytypeio.anytype.ui.splash.SplashFragment import dagger.Module @@ -48,23 +50,25 @@ object SplashModule { launchAccount: LaunchAccount, launchWallet: LaunchWallet, analytics: Analytics, - storeObjectTypes: StoreObjectTypes, getLastOpenedObject: GetLastOpenedObject, getDefaultEditorType: GetDefaultEditorType, setDefaultEditorType: SetDefaultEditorType, createPage: CreatePage, - appActionManager: AppActionManager + appActionManager: AppActionManager, + relationsSubscriptionManager: RelationsSubscriptionManager, + objectTypesSubscriptionManager: ObjectTypesSubscriptionManager ): SplashViewModelFactory = SplashViewModelFactory( checkAuthorizationStatus = checkAuthorizationStatus, launchAccount = launchAccount, launchWallet = launchWallet, analytics = analytics, - storeObjectTypes = storeObjectTypes, getLastOpenedObject = getLastOpenedObject, setDefaultEditorType = setDefaultEditorType, getDefaultEditorType = getDefaultEditorType, createPage = createPage, - appActionManager = appActionManager + appActionManager = appActionManager, + relationsSubscriptionManager = relationsSubscriptionManager, + objectTypesSubscriptionManager = objectTypesSubscriptionManager ) @JvmStatic diff --git a/app/src/main/java/com/anytypeio/anytype/di/feature/ViewerSortByDI.kt b/app/src/main/java/com/anytypeio/anytype/di/feature/ViewerSortByDI.kt index 03eca00c3..8c0040447 100644 --- a/app/src/main/java/com/anytypeio/anytype/di/feature/ViewerSortByDI.kt +++ b/app/src/main/java/com/anytypeio/anytype/di/feature/ViewerSortByDI.kt @@ -1,5 +1,6 @@ package com.anytypeio.anytype.di.feature +import com.anytypeio.anytype.domain.objects.StoreOfRelations import com.anytypeio.anytype.presentation.sets.ObjectSet import com.anytypeio.anytype.presentation.sets.ViewerSortByViewModel import com.anytypeio.anytype.ui.sets.ViewerSortByFragment @@ -29,8 +30,12 @@ object ViewerSortByModule { @Provides @ViewerSortByScope fun provideViewerSortByViewModelFactory( - state: StateFlow - ): ViewerSortByViewModel.Factory = ViewerSortByViewModel.Factory(state) + state: StateFlow, + storeOfRelations: StoreOfRelations + ): ViewerSortByViewModel.Factory = ViewerSortByViewModel.Factory( + state = state, + storeOfRelations = storeOfRelations + ) } @Scope diff --git a/app/src/main/java/com/anytypeio/anytype/di/feature/auth/DeletedAccountDI.kt b/app/src/main/java/com/anytypeio/anytype/di/feature/auth/DeletedAccountDI.kt index 7022d425d..f8d4bebd3 100644 --- a/app/src/main/java/com/anytypeio/anytype/di/feature/auth/DeletedAccountDI.kt +++ b/app/src/main/java/com/anytypeio/anytype/di/feature/auth/DeletedAccountDI.kt @@ -7,6 +7,7 @@ import com.anytypeio.anytype.domain.account.RestoreAccount import com.anytypeio.anytype.domain.auth.interactor.Logout import com.anytypeio.anytype.domain.auth.repo.AuthRepository import com.anytypeio.anytype.domain.config.ConfigStorage +import com.anytypeio.anytype.domain.search.RelationsSubscriptionManager import com.anytypeio.anytype.ext.DefaultDateHelper import com.anytypeio.anytype.presentation.auth.account.DeletedAccountViewModel import com.anytypeio.anytype.ui.auth.account.DeletedAccountFragment @@ -35,12 +36,14 @@ object DeletedAccountModule { restoreAccount: RestoreAccount, logout: Logout, helper: DateHelper, - analytics: Analytics + analytics: Analytics, + relationsSubscriptionManager: RelationsSubscriptionManager ): DeletedAccountViewModel.Factory = DeletedAccountViewModel.Factory( restoreAccount = restoreAccount, logout = logout, helper = helper, - analytics = analytics + analytics = analytics, + relationsSubscriptionManager = relationsSubscriptionManager ) @JvmStatic diff --git a/app/src/main/java/com/anytypeio/anytype/di/feature/relations/RelationAddDI.kt b/app/src/main/java/com/anytypeio/anytype/di/feature/relations/RelationAddDI.kt index e3666757c..3c0b47714 100644 --- a/app/src/main/java/com/anytypeio/anytype/di/feature/relations/RelationAddDI.kt +++ b/app/src/main/java/com/anytypeio/anytype/di/feature/relations/RelationAddDI.kt @@ -5,9 +5,10 @@ import com.anytypeio.anytype.core_models.Payload import com.anytypeio.anytype.core_utils.di.scope.PerDialog import com.anytypeio.anytype.domain.block.repo.BlockRepository import com.anytypeio.anytype.domain.dataview.interactor.AddRelationToDataView -import com.anytypeio.anytype.domain.relations.ObjectRelationList import com.anytypeio.anytype.domain.dataview.interactor.UpdateDataViewViewer +import com.anytypeio.anytype.domain.objects.StoreOfRelations import com.anytypeio.anytype.domain.relations.AddRelationToObject +import com.anytypeio.anytype.domain.relations.ObjectRelationList import com.anytypeio.anytype.presentation.relations.RelationAddToDataViewViewModel import com.anytypeio.anytype.presentation.relations.RelationAddToObjectViewModel import com.anytypeio.anytype.presentation.relations.providers.ObjectRelationProvider @@ -43,12 +44,12 @@ object RelationAddToObjectModule { @PerDialog fun provideViewModelFactory( addRelationToObject: AddRelationToObject, - objectRelationList: ObjectRelationList, + storeOfRelations: StoreOfRelations, dispatcher: Dispatcher, analytics: Analytics, relationsProvider: ObjectRelationProvider, ): RelationAddToObjectViewModel.Factory = RelationAddToObjectViewModel.Factory( - objectRelationList = objectRelationList, + storeOfRelations = storeOfRelations, addRelationToObject = addRelationToObject, dispatcher = dispatcher, analytics = analytics, @@ -61,13 +62,6 @@ object RelationAddToObjectModule { fun provideObjectRelationListUseCase( repo: BlockRepository ): ObjectRelationList = ObjectRelationList(repo) - - @JvmStatic - @Provides - @PerDialog - fun provideAddRelationToObjectUseCase( - repo: BlockRepository - ): AddRelationToObject = AddRelationToObject(repo) } @Subcomponent(modules = [RelationAddToDataViewModule::class]) @@ -90,7 +84,7 @@ object RelationAddToDataViewModule { @PerDialog fun provideViewModelFactory( addRelationToDataView: AddRelationToDataView, - objectRelationList: ObjectRelationList, + storeOfRelations: StoreOfRelations, dispatcher: Dispatcher, state: StateFlow, session: ObjectSetSession, @@ -98,7 +92,7 @@ object RelationAddToDataViewModule { analytics: Analytics, relationsProvider: ObjectRelationProvider, ): RelationAddToDataViewViewModel.Factory = RelationAddToDataViewViewModel.Factory( - objectRelationList = objectRelationList, + storeOfRelations = storeOfRelations, addRelationToDataView = addRelationToDataView, dispatcher = dispatcher, state = state, diff --git a/app/src/main/java/com/anytypeio/anytype/di/feature/relations/RelationCreateFromScratchDI.kt b/app/src/main/java/com/anytypeio/anytype/di/feature/relations/RelationCreateFromScratchDI.kt index c2f99b94a..1ccc55ed2 100644 --- a/app/src/main/java/com/anytypeio/anytype/di/feature/relations/RelationCreateFromScratchDI.kt +++ b/app/src/main/java/com/anytypeio/anytype/di/feature/relations/RelationCreateFromScratchDI.kt @@ -6,9 +6,11 @@ import com.anytypeio.anytype.core_models.RelationFormat import com.anytypeio.anytype.core_utils.di.scope.CreateFromScratch import com.anytypeio.anytype.core_utils.di.scope.PerDialog import com.anytypeio.anytype.domain.block.repo.BlockRepository -import com.anytypeio.anytype.domain.dataview.interactor.AddNewRelationToDataView +import com.anytypeio.anytype.domain.dataview.interactor.AddRelationToDataView import com.anytypeio.anytype.domain.dataview.interactor.UpdateDataViewViewer -import com.anytypeio.anytype.domain.relations.AddNewRelationToObject +import com.anytypeio.anytype.domain.objects.StoreOfRelations +import com.anytypeio.anytype.domain.relations.AddRelationToObject +import com.anytypeio.anytype.domain.relations.CreateRelation import com.anytypeio.anytype.presentation.relations.RelationCreateFromScratchForDataViewViewModel import com.anytypeio.anytype.presentation.relations.RelationCreateFromScratchForObjectBlockViewModel import com.anytypeio.anytype.presentation.relations.RelationCreateFromScratchForObjectViewModel @@ -48,24 +50,29 @@ object RelationCreateFromScratchForObjectModule { @Provides @CreateFromScratch fun provideViewModelFactory( - addNewRelationToObject: AddNewRelationToObject, + addRelationToObject: AddRelationToObject, dispatcher: Dispatcher, analytics: Analytics, - createFromScratchState: StateHolder - ): RelationCreateFromScratchForObjectViewModel.Factory = - RelationCreateFromScratchForObjectViewModel.Factory( - addNewRelationToObject = addNewRelationToObject, + createFromScratchState: StateHolder, + createRelation: CreateRelation + ) = RelationCreateFromScratchForObjectViewModel.Factory( + addRelationToObject = addRelationToObject, + createRelation = createRelation, dispatcher = dispatcher, analytics = analytics, createFromScratchState = createFromScratchState - ) + ) @JvmStatic @Provides @CreateFromScratch - fun provideAddNewRelationToObjectUseCase( - repo: BlockRepository - ): AddNewRelationToObject = AddNewRelationToObject(repo) + fun createRelation( + repo: BlockRepository, + storeOfRelations: StoreOfRelations + ) = CreateRelation( + repo = repo, + storeOfRelations = storeOfRelations + ) @JvmStatic @Provides @@ -95,6 +102,7 @@ interface RelationCreateFromScratchForDataViewSubComponent { @Module object RelationCreateFromScratchForDataViewModule { + @JvmStatic @Provides @CreateFromScratch @@ -102,20 +110,21 @@ object RelationCreateFromScratchForDataViewModule { state: StateFlow, session: ObjectSetSession, updateDataViewViewer: UpdateDataViewViewer, - addNewRelationToDataView: AddNewRelationToDataView, dispatcher: Dispatcher, analytics: Analytics, - createFromScratchState: StateHolder - ): RelationCreateFromScratchForDataViewViewModel.Factory = - RelationCreateFromScratchForDataViewViewModel.Factory( - addNewRelationToDataView = addNewRelationToDataView, + createFromScratchState: StateHolder, + createRelation: CreateRelation, + addRelationToDataView: AddRelationToDataView + ) = RelationCreateFromScratchForDataViewViewModel.Factory( + addRelationToDataView = addRelationToDataView, dispatcher = dispatcher, state = state, session = session, updateDataViewViewer = updateDataViewViewer, analytics = analytics, - createFromScratchState = createFromScratchState - ) + createFromScratchState = createFromScratchState, + createRelation = createRelation + ) @JvmStatic @Provides @@ -126,6 +135,22 @@ object RelationCreateFromScratchForDataViewModule { limitObjectTypes = emptyList() ) ) + + @JvmStatic + @Provides + @CreateFromScratch + fun createRelation( + repo: BlockRepository, + storeOfRelations: StoreOfRelations + ) = CreateRelation( + repo = repo, + storeOfRelations = storeOfRelations + ) + + @JvmStatic + @Provides + @CreateFromScratch + fun addRelationToDataView(repo: BlockRepository) = AddRelationToDataView(repo) } @Subcomponent(modules = [RelationCreateFromScratchForObjectBlockModule::class]) @@ -145,28 +170,23 @@ interface RelationCreateFromScratchForObjectBlockSubComponent { @Module object RelationCreateFromScratchForObjectBlockModule { - @JvmStatic - @Provides - @CreateFromScratch - fun provideViewModelFactory( - addNewRelationToObject: AddNewRelationToObject, - dispatcher: Dispatcher, - analytics: Analytics, - createFromScratchState: StateHolder - ): RelationCreateFromScratchForObjectBlockViewModel.Factory = - RelationCreateFromScratchForObjectBlockViewModel.Factory( - addNewRelationToObject = addNewRelationToObject, - dispatcher = dispatcher, - analytics = analytics, - createFromScratchState = createFromScratchState - ) @JvmStatic @Provides @CreateFromScratch - fun provideAddNewRelationToObjectUseCase( - repo: BlockRepository - ): AddNewRelationToObject = AddNewRelationToObject(repo) + fun provideViewModelFactory( + addRelationToObject: AddRelationToObject, + createRelation: CreateRelation, + dispatcher: Dispatcher, + analytics: Analytics, + createFromScratchState: StateHolder + ) = RelationCreateFromScratchForObjectBlockViewModel.Factory( + addRelationToObject = addRelationToObject, + createRelation = createRelation, + dispatcher = dispatcher, + analytics = analytics, + createFromScratchState = createFromScratchState + ) @JvmStatic @Provides @@ -177,6 +197,17 @@ object RelationCreateFromScratchForObjectBlockModule { limitObjectTypes = emptyList() ) ) + + @JvmStatic + @Provides + @CreateFromScratch + fun createRelation( + repo: BlockRepository, + storeOfRelations: StoreOfRelations + ) = CreateRelation( + repo = repo, + storeOfRelations = storeOfRelations + ) } @Subcomponent diff --git a/app/src/main/java/com/anytypeio/anytype/di/feature/sets/CreateFilter.kt b/app/src/main/java/com/anytypeio/anytype/di/feature/sets/CreateFilter.kt index 2521027e2..53c2af4de 100644 --- a/app/src/main/java/com/anytypeio/anytype/di/feature/sets/CreateFilter.kt +++ b/app/src/main/java/com/anytypeio/anytype/di/feature/sets/CreateFilter.kt @@ -3,11 +3,13 @@ package com.anytypeio.anytype.di.feature.sets; import com.anytypeio.anytype.analytics.base.Analytics import com.anytypeio.anytype.core_models.Payload import com.anytypeio.anytype.core_utils.di.scope.PerModal -import com.anytypeio.anytype.domain.`object`.ObjectTypesProvider -import com.anytypeio.anytype.domain.search.SearchObjects import com.anytypeio.anytype.domain.dataview.interactor.UpdateDataViewViewer import com.anytypeio.anytype.domain.misc.UrlBuilder +import com.anytypeio.anytype.domain.objects.StoreOfObjectTypes +import com.anytypeio.anytype.domain.objects.StoreOfRelations +import com.anytypeio.anytype.domain.search.SearchObjects import com.anytypeio.anytype.presentation.sets.ObjectSet +import com.anytypeio.anytype.presentation.sets.ObjectSetDatabase import com.anytypeio.anytype.presentation.sets.ObjectSetSession import com.anytypeio.anytype.presentation.sets.filter.FilterViewModel import com.anytypeio.anytype.presentation.util.Dispatcher @@ -45,7 +47,9 @@ object CreateFilterModule { updateDataViewViewer: UpdateDataViewViewer, searchObjects: SearchObjects, urlBuilder: UrlBuilder, - objectTypesProvider: ObjectTypesProvider, + storeOfObjectTypes: StoreOfObjectTypes, + storeOfRelations: StoreOfRelations, + objectSetDatabase: ObjectSetDatabase, analytics: Analytics ): FilterViewModel.Factory = FilterViewModel.Factory( objectSetState = state, @@ -54,7 +58,9 @@ object CreateFilterModule { updateDataViewViewer = updateDataViewViewer, searchObjects = searchObjects, urlBuilder = urlBuilder, - objectTypesProvider = objectTypesProvider, + storeOfObjectTypes = storeOfObjectTypes, + storeOfRelations = storeOfRelations, + objectSetDatabase = objectSetDatabase, analytics = analytics ) } diff --git a/app/src/main/java/com/anytypeio/anytype/di/feature/sets/ModifyFilter.kt b/app/src/main/java/com/anytypeio/anytype/di/feature/sets/ModifyFilter.kt index 6254259d6..95cd0a399 100644 --- a/app/src/main/java/com/anytypeio/anytype/di/feature/sets/ModifyFilter.kt +++ b/app/src/main/java/com/anytypeio/anytype/di/feature/sets/ModifyFilter.kt @@ -3,11 +3,13 @@ package com.anytypeio.anytype.di.feature.sets; import com.anytypeio.anytype.analytics.base.Analytics import com.anytypeio.anytype.core_models.Payload import com.anytypeio.anytype.core_utils.di.scope.PerModal -import com.anytypeio.anytype.domain.`object`.ObjectTypesProvider -import com.anytypeio.anytype.domain.search.SearchObjects import com.anytypeio.anytype.domain.dataview.interactor.UpdateDataViewViewer import com.anytypeio.anytype.domain.misc.UrlBuilder +import com.anytypeio.anytype.domain.objects.StoreOfObjectTypes +import com.anytypeio.anytype.domain.objects.StoreOfRelations +import com.anytypeio.anytype.domain.search.SearchObjects import com.anytypeio.anytype.presentation.sets.ObjectSet +import com.anytypeio.anytype.presentation.sets.ObjectSetDatabase import com.anytypeio.anytype.presentation.sets.ObjectSetSession import com.anytypeio.anytype.presentation.sets.filter.FilterViewModel import com.anytypeio.anytype.presentation.util.Dispatcher @@ -45,8 +47,10 @@ object ModifyFilterModule { updateDataViewViewer: UpdateDataViewViewer, searchObjects: SearchObjects, urlBuilder: UrlBuilder, - objectTypesProvider: ObjectTypesProvider, - analytics: Analytics + storeOfObjectTypes: StoreOfObjectTypes, + analytics: Analytics, + objectSetDatabase: ObjectSetDatabase, + storeOfRelations: StoreOfRelations ): FilterViewModel.Factory = FilterViewModel.Factory( objectSetState = state, session = session, @@ -54,7 +58,9 @@ object ModifyFilterModule { updateDataViewViewer = updateDataViewViewer, searchObjects = searchObjects, urlBuilder = urlBuilder, - objectTypesProvider = objectTypesProvider, + storeOfObjectTypes = storeOfObjectTypes, + objectSetDatabase = objectSetDatabase, + storeOfRelations = storeOfRelations, analytics = analytics ) } diff --git a/app/src/main/java/com/anytypeio/anytype/di/feature/sets/SelectFilterRelationDI.kt b/app/src/main/java/com/anytypeio/anytype/di/feature/sets/SelectFilterRelationDI.kt index ec5bfb3c0..8c5bc161d 100644 --- a/app/src/main/java/com/anytypeio/anytype/di/feature/sets/SelectFilterRelationDI.kt +++ b/app/src/main/java/com/anytypeio/anytype/di/feature/sets/SelectFilterRelationDI.kt @@ -1,6 +1,7 @@ package com.anytypeio.anytype.di.feature.sets import com.anytypeio.anytype.core_utils.di.scope.PerModal +import com.anytypeio.anytype.domain.objects.StoreOfRelations import com.anytypeio.anytype.presentation.sets.ObjectSet import com.anytypeio.anytype.presentation.sets.ObjectSetSession import com.anytypeio.anytype.presentation.sets.SelectFilterRelationViewModel @@ -29,9 +30,11 @@ object SelectFilterRelationModule { @PerModal fun provideSelectSortRelationViewModelFactory( state: StateFlow, - session: ObjectSetSession + session: ObjectSetSession, + storeOfRelations: StoreOfRelations ): SelectFilterRelationViewModel.Factory = SelectFilterRelationViewModel.Factory( state = state, - session = session + session = session, + storeOfRelations = storeOfRelations ) } \ No newline at end of file diff --git a/app/src/main/java/com/anytypeio/anytype/di/feature/settings/LogoutWarningDI.kt b/app/src/main/java/com/anytypeio/anytype/di/feature/settings/LogoutWarningDI.kt index 638866d38..c085719a8 100644 --- a/app/src/main/java/com/anytypeio/anytype/di/feature/settings/LogoutWarningDI.kt +++ b/app/src/main/java/com/anytypeio/anytype/di/feature/settings/LogoutWarningDI.kt @@ -5,6 +5,7 @@ import com.anytypeio.anytype.core_utils.di.scope.PerScreen import com.anytypeio.anytype.domain.auth.interactor.Logout import com.anytypeio.anytype.domain.auth.repo.AuthRepository import com.anytypeio.anytype.domain.config.ConfigStorage +import com.anytypeio.anytype.domain.search.RelationsSubscriptionManager import com.anytypeio.anytype.ui.settings.LogoutWarningFragment import com.anytypeio.anytype.ui_settings.account.LogoutWarningViewModel import dagger.Module @@ -32,8 +33,13 @@ object LogoutWarningModule { @PerScreen fun provideViewModelFactory( logout: Logout, - analytics: Analytics - ): LogoutWarningViewModel.Factory = LogoutWarningViewModel.Factory(logout, analytics) + analytics: Analytics, + relationsSubscriptionManager: RelationsSubscriptionManager + ): LogoutWarningViewModel.Factory = LogoutWarningViewModel.Factory( + logout = logout, + analytics = analytics, + relationsSubscriptionManager = relationsSubscriptionManager + ) @JvmStatic @PerScreen diff --git a/app/src/main/java/com/anytypeio/anytype/di/main/MainComponent.kt b/app/src/main/java/com/anytypeio/anytype/di/main/MainComponent.kt index c1644c435..0a253364b 100644 --- a/app/src/main/java/com/anytypeio/anytype/di/main/MainComponent.kt +++ b/app/src/main/java/com/anytypeio/anytype/di/main/MainComponent.kt @@ -3,7 +3,23 @@ package com.anytypeio.anytype.di.main import com.anytypeio.anytype.app.AndroidApplication import com.anytypeio.anytype.di.common.ComponentDependencies import com.anytypeio.anytype.di.common.ComponentDependenciesKey -import com.anytypeio.anytype.di.feature.* +import com.anytypeio.anytype.di.feature.ArchiveSubComponent +import com.anytypeio.anytype.di.feature.AuthSubComponent +import com.anytypeio.anytype.di.feature.CreateBookmarkSubComponent +import com.anytypeio.anytype.di.feature.CreateObjectSubComponent +import com.anytypeio.anytype.di.feature.DebugSettingsSubComponent +import com.anytypeio.anytype.di.feature.EditorSubComponent +import com.anytypeio.anytype.di.feature.HomeDashboardSubComponent +import com.anytypeio.anytype.di.feature.KeychainPhraseSubComponent +import com.anytypeio.anytype.di.feature.LinkToObjectSubComponent +import com.anytypeio.anytype.di.feature.MainEntrySubComponent +import com.anytypeio.anytype.di.feature.MoveToSubComponent +import com.anytypeio.anytype.di.feature.ObjectSearchSubComponent +import com.anytypeio.anytype.di.feature.ObjectSetSubComponent +import com.anytypeio.anytype.di.feature.ObjectTypeChangeSubComponent +import com.anytypeio.anytype.di.feature.OtherSettingsSubComponent +import com.anytypeio.anytype.di.feature.PageNavigationSubComponent +import com.anytypeio.anytype.di.feature.SplashSubComponent import com.anytypeio.anytype.di.feature.auth.DeletedAccountSubcomponent import com.anytypeio.anytype.di.feature.settings.AboutAppSubComponent import com.anytypeio.anytype.di.feature.settings.AccountAndDataSubComponent @@ -32,7 +48,8 @@ import javax.inject.Singleton EmojiModule::class, ClipboardModule::class, AnalyticsModule::class, - LocalNetworkAddressModule::class + LocalNetworkAddressModule::class, + SubscriptionsModule::class ] ) interface MainComponent : AppearanceDependencies { @@ -48,8 +65,6 @@ interface MainComponent : AppearanceDependencies { fun moveToBuilder(): MoveToSubComponent.Builder fun objectSearchComponentBuilder(): ObjectSearchSubComponent.Builder fun mainEntryComponentBuilder(): MainEntrySubComponent.Builder - fun createSetComponentBuilder(): CreateSetSubComponent.Builder - fun createObjectTypeComponentBuilder(): CreateObjectTypeSubComponent.Builder fun objectSetComponentBuilder(): ObjectSetSubComponent.Builder fun objectTypeChangeComponent(): ObjectTypeChangeSubComponent.Builder fun wallpaperSelectComponent(): WallpaperSelectSubComponent.Builder diff --git a/app/src/main/java/com/anytypeio/anytype/di/main/SubscriptionsModule.kt b/app/src/main/java/com/anytypeio/anytype/di/main/SubscriptionsModule.kt new file mode 100644 index 000000000..15519420b --- /dev/null +++ b/app/src/main/java/com/anytypeio/anytype/di/main/SubscriptionsModule.kt @@ -0,0 +1,85 @@ +package com.anytypeio.anytype.di.main + +import com.anytypeio.anytype.domain.base.AppCoroutineDispatchers +import com.anytypeio.anytype.domain.block.repo.BlockRepository +import com.anytypeio.anytype.domain.objects.DefaultStoreOfObjectTypes +import com.anytypeio.anytype.domain.objects.DefaultStoreOfRelations +import com.anytypeio.anytype.domain.objects.StoreOfObjectTypes +import com.anytypeio.anytype.domain.objects.StoreOfRelations +import com.anytypeio.anytype.domain.search.ObjectTypesSubscriptionContainer +import com.anytypeio.anytype.domain.search.ObjectTypesSubscriptionManager +import com.anytypeio.anytype.domain.search.RelationsSubscriptionContainer +import com.anytypeio.anytype.domain.search.RelationsSubscriptionManager +import com.anytypeio.anytype.domain.search.SubscriptionEventChannel +import dagger.Module +import dagger.Provides +import kotlinx.coroutines.Dispatchers +import javax.inject.Singleton + +@Module +object SubscriptionsModule { + + @JvmStatic + @Provides + @Singleton + fun relationsSubscriptionContainer( + repo: BlockRepository, + channel: SubscriptionEventChannel, + store: StoreOfRelations + ): RelationsSubscriptionContainer = RelationsSubscriptionContainer( + repo = repo, + channel = channel, + store = store, + dispatchers = AppCoroutineDispatchers( + io = Dispatchers.IO, + computation = Dispatchers.Default, + main = Dispatchers.Main + ) + ) + + @JvmStatic + @Provides + @Singleton + fun objectTypesSubscriptionContainer( + repo: BlockRepository, + channel: SubscriptionEventChannel, + store: StoreOfObjectTypes + ): ObjectTypesSubscriptionContainer = ObjectTypesSubscriptionContainer( + repo = repo, + channel = channel, + store = store, + dispatchers = AppCoroutineDispatchers( + io = Dispatchers.IO, + computation = Dispatchers.Default, + main = Dispatchers.Main + ) + ) + + @JvmStatic + @Provides + @Singleton + fun relationsStore(): StoreOfRelations = DefaultStoreOfRelations() + + @JvmStatic + @Provides + @Singleton + fun objectTypesStore(): StoreOfObjectTypes = DefaultStoreOfObjectTypes() + + @JvmStatic + @Provides + @Singleton + fun relationsSubscriptionManager( + subscription: RelationsSubscriptionContainer + ): RelationsSubscriptionManager = RelationsSubscriptionManager( + subscription = subscription + ) + + @JvmStatic + @Provides + @Singleton + fun objectTypesSubscriptionManager( + subscription: ObjectTypesSubscriptionContainer + ): ObjectTypesSubscriptionManager = ObjectTypesSubscriptionManager( + subscription = subscription + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/anytypeio/anytype/navigation/Navigator.kt b/app/src/main/java/com/anytypeio/anytype/navigation/Navigator.kt index 0d9f8c237..d3a09e947 100644 --- a/app/src/main/java/com/anytypeio/anytype/navigation/Navigator.kt +++ b/app/src/main/java/com/anytypeio/anytype/navigation/Navigator.kt @@ -15,7 +15,6 @@ import com.anytypeio.anytype.ui.auth.account.DeletedAccountFragment import com.anytypeio.anytype.ui.dashboard.DashboardFragment import com.anytypeio.anytype.ui.editor.EditorFragment import com.anytypeio.anytype.ui.navigation.PageNavigationFragment -import com.anytypeio.anytype.ui.sets.CreateObjectSetFragment import com.anytypeio.anytype.ui.sets.ObjectSetFragment import com.anytypeio.anytype.ui.templates.TemplateSelectFragment @@ -228,13 +227,6 @@ class Navigator : AppNavigation { } } - override fun openCreateSetScreen(ctx: Id) { - navController?.navigate( - R.id.from_desktop_to_create_sets, - bundleOf(CreateObjectSetFragment.CONTEXT_ID_KEY to ctx) - ) - } - override fun openUserSettingsScreen() { navController?.navigate(R.id.action_profileScreen_to_userSettingsFragment) } diff --git a/app/src/main/java/com/anytypeio/anytype/ui/base/NavigationFragment.kt b/app/src/main/java/com/anytypeio/anytype/ui/base/NavigationFragment.kt index c0ad9ca12..d46ce972f 100644 --- a/app/src/main/java/com/anytypeio/anytype/ui/base/NavigationFragment.kt +++ b/app/src/main/java/com/anytypeio/anytype/ui/base/NavigationFragment.kt @@ -69,7 +69,6 @@ abstract class NavigationFragment( is Command.OpenPageNavigationScreen -> navigation.openPageNavigation(command.target) is Command.ExitToDesktopAndOpenPage -> navigation.exitToDesktopAndOpenPage(command.pageId) is Command.OpenPageSearch -> navigation.openPageSearch() - is Command.OpenCreateSetScreen -> navigation.openCreateSetScreen(command.ctx) is Command.OpenUpdateAppScreen -> navigation.openUpdateAppScreen() is Command.DeletedAccountScreen -> navigation.deletedAccountScreen(command.deadline) is Command.OpenTemplates -> navigation.openTemplates( 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 ebe62c8d6..15eab4bfd 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 @@ -29,7 +29,6 @@ import androidx.core.view.WindowInsetsAnimationCompat.Callback.DISPATCH_MODE_STO import androidx.core.view.WindowInsetsCompat import androidx.core.view.isVisible import androidx.core.view.updateLayoutParams -import androidx.fragment.app.setFragmentResultListener import androidx.fragment.app.viewModels import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleEventObserver @@ -48,6 +47,7 @@ import androidx.viewbinding.ViewBinding import com.anytypeio.anytype.BuildConfig 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.SyncStatus import com.anytypeio.anytype.core_models.ThemeColor import com.anytypeio.anytype.core_models.Url @@ -132,10 +132,9 @@ import com.anytypeio.anytype.ui.linking.LinkToObjectOrWebPagesFragment import com.anytypeio.anytype.ui.linking.OnLinkToAction import com.anytypeio.anytype.ui.moving.MoveToFragment import com.anytypeio.anytype.ui.moving.OnMoveToAction -import com.anytypeio.anytype.ui.objects.ObjectTypeChangeFragment -import com.anytypeio.anytype.ui.objects.ObjectTypeChangeFragment.Companion.OBJECT_IS_DRAFT_KEY -import com.anytypeio.anytype.ui.objects.ObjectTypeChangeFragment.Companion.OBJECT_TYPE_REQUEST_KEY -import com.anytypeio.anytype.ui.objects.ObjectTypeChangeFragment.Companion.OBJECT_TYPE_URL_KEY +import com.anytypeio.anytype.ui.objects.types.pickers.DraftObjectSelectTypeFragment +import com.anytypeio.anytype.ui.objects.types.pickers.ObjectSelectTypeFragment +import com.anytypeio.anytype.ui.objects.types.pickers.OnObjectSelectTypeAction import com.anytypeio.anytype.ui.objects.appearance.ObjectAppearanceSettingFragment import com.anytypeio.anytype.ui.relations.RelationAddBaseFragment.Companion.CTX_KEY import com.anytypeio.anytype.ui.relations.RelationAddResult @@ -172,7 +171,8 @@ open class EditorFragment : NavigationFragment(R.layout.f DocumentMenuActionReceiver, ClipboardInterceptor, OnMoveToAction, - OnLinkToAction { + OnLinkToAction, + OnObjectSelectTypeAction { private val keyboardDelayJobs = mutableListOf() @@ -413,15 +413,6 @@ open class EditorFragment : NavigationFragment(R.layout.f override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) pickerDelegate.initPicker(vm, ctx) - setFragmentResultListener(OBJECT_TYPE_REQUEST_KEY) { _, bundle -> - val type = bundle.getString(OBJECT_TYPE_URL_KEY) - val isObjectDraft = bundle.getBoolean(OBJECT_IS_DRAFT_KEY, false) - if (type != null) { - onObjectTypePicked(type = type, isObjectDraft = isObjectDraft) - } else { - toast("Cannot change object type, when new one is unknown") - } - } setupOnBackPressedDispatcher() getEditorSettings() } @@ -886,10 +877,6 @@ open class EditorFragment : NavigationFragment(R.layout.f vm.onSetRelationKeyClicked(blockId = blockId, key = key) } - private fun onObjectTypePicked(type: Id, isObjectDraft: Boolean) { - vm.onObjectTypeChanged(type = type, isObjectDraft = isObjectDraft) - } - private fun execute(event: EventWrapper) { event.getContentIfNotHandled()?.let { command -> when (command) { @@ -1031,7 +1018,8 @@ open class EditorFragment : NavigationFragment(R.layout.f val fr = RelationValueFragment.new( ctx = command.ctx, target = command.target, - relation = command.relation, + relationId = command.relationId, + relationKey = command.relationKey, targetObjectTypes = command.targetObjectTypes, isLocked = command.isLocked ) @@ -1041,8 +1029,9 @@ open class EditorFragment : NavigationFragment(R.layout.f hideKeyboard() val fr = RelationTextValueFragment.new( ctx = command.ctx, + relationId = command.relationId, + relationKey = command.relationKey, objectId = command.target, - relationId = command.relation, isLocked = command.isLocked ) fr.show(childFragmentManager, null) @@ -1052,25 +1041,27 @@ open class EditorFragment : NavigationFragment(R.layout.f val fr = RelationDateValueFragment.new( ctx = command.ctx, objectId = command.target, - relationId = command.relation + relationId = command.relationId, + relationKey = command.relationKey ) fr.show(childFragmentManager, null) } Command.AddSlashWidgetTriggerToFocusedBlock -> { binding.recycler.addTextFromSelectedStart(text = "/") } - is Command.OpenChangeObjectTypeScreen -> { + is Command.OpenDraftObjectSelectTypeScreen -> { hideKeyboard() - findNavController() - .safeNavigate( - R.id.pageScreen, - R.id.objectTypeChangeScreen, - bundleOf( - ObjectTypeChangeFragment.ARG_SMART_BLOCK_TYPE to command.smartBlockType, - ObjectTypeChangeFragment.ARG_EXCLUDED_TYPES to command.excludedTypes, - ObjectTypeChangeFragment.OBJECT_IS_DRAFT_KEY to command.isDraft - ) - ) + val fr = DraftObjectSelectTypeFragment.newInstance( + excludeTypes = command.excludedTypes + ) + fr.show(childFragmentManager, null) + } + is Command.OpenObjectSelectTypeScreen -> { + hideKeyboard() + val fr = ObjectSelectTypeFragment.newInstance( + excludeTypes = command.excludedTypes + ) + fr.show(childFragmentManager, null) } is Command.OpenMoveToScreen -> { jobs += lifecycleScope.launch { @@ -1999,19 +1990,19 @@ open class EditorFragment : NavigationFragment(R.layout.f vm.onLayoutClicked() } - override fun onTextValueChanged(ctx: Id, text: String, objectId: Id, relationId: Id) { + override fun onTextValueChanged(ctx: Id, text: String, objectId: Id, relationKey: Key) { vm.onRelationTextValueChanged( ctx = ctx, value = text, - relationId = relationId + relationKey = relationKey ) } - override fun onNumberValueChanged(ctx: Id, number: Double?, objectId: Id, relationId: Id) { + override fun onNumberValueChanged(ctx: Id, number: Double?, objectId: Id, relationKey: Key) { vm.onRelationTextValueChanged( ctx = ctx, value = number, - relationId = relationId + relationKey = relationKey ) } @@ -2019,11 +2010,11 @@ open class EditorFragment : NavigationFragment(R.layout.f ctx: Id, timeInSeconds: Number?, objectId: Id, - relationId: Id + relationKey: Key ) { vm.onRelationTextValueChanged( ctx = ctx, - relationId = relationId, + relationKey = relationKey, value = timeInSeconds ) } @@ -2090,6 +2081,14 @@ open class EditorFragment : NavigationFragment(R.layout.f vm.proceedToCreateObjectAndAddToTextAsLink(name) } + override fun onProceedWithUpdateType(id: Id) { + vm.onObjectTypeChanged(type = id, isObjectDraft = false) + } + + override fun onProceedWithDraftUpdateType(id: Id) { + vm.onObjectTypeChanged(type = id, isObjectDraft = true) + } + private fun observeNavBackStack() { findNavController().run { val navBackStackEntry = getBackStackEntry(R.id.pageScreen) @@ -2115,7 +2114,7 @@ open class EditorFragment : NavigationFragment(R.layout.f if (resultRelationAdd != null) { vm.proceedWithAddingRelationToTarget( target = resultRelationAdd.target, - relation = resultRelationAdd.relation + relationKey = resultRelationAdd.relation ) } } @@ -2125,7 +2124,7 @@ open class EditorFragment : NavigationFragment(R.layout.f if (resultRelationNew != null) { vm.proceedWithAddingRelationToTarget( target = resultRelationNew.target, - relation = resultRelationNew.relation + relationKey = resultRelationNew.relation ) } } diff --git a/app/src/main/java/com/anytypeio/anytype/ui/objects/ObjectTypeChangeFragment.kt b/app/src/main/java/com/anytypeio/anytype/ui/objects/ObjectTypeChangeFragment.kt index 8a1700662..390336b05 100644 --- a/app/src/main/java/com/anytypeio/anytype/ui/objects/ObjectTypeChangeFragment.kt +++ b/app/src/main/java/com/anytypeio/anytype/ui/objects/ObjectTypeChangeFragment.kt @@ -5,46 +5,36 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.EditText -import androidx.core.os.bundleOf -import androidx.fragment.app.setFragmentResult import androidx.fragment.app.viewModels import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.LinearLayoutManager -import com.anytypeio.anytype.R import com.anytypeio.anytype.core_models.Id -import com.anytypeio.anytype.core_models.SmartBlockType import com.anytypeio.anytype.core_ui.features.objects.ObjectTypeVerticalAdapter import com.anytypeio.anytype.core_ui.reactive.textChanges -import com.anytypeio.anytype.core_utils.ext.arg import com.anytypeio.anytype.core_utils.ext.argOrNull -import com.anytypeio.anytype.core_utils.ext.hideKeyboard import com.anytypeio.anytype.core_utils.ext.subscribe import com.anytypeio.anytype.core_utils.ui.BaseBottomSheetTextInputFragment import com.anytypeio.anytype.databinding.FragmentObjectTypeChangeBinding -import com.anytypeio.anytype.di.common.componentManager import com.anytypeio.anytype.presentation.objects.ObjectTypeChangeViewModel import com.anytypeio.anytype.presentation.objects.ObjectTypeChangeViewModelFactory import com.anytypeio.anytype.presentation.objects.ObjectTypeView import javax.inject.Inject -class ObjectTypeChangeFragment : +abstract class BaseObjectTypeChangeFragment : BaseBottomSheetTextInputFragment() { - private val smartBlockType: SmartBlockType get() = arg(ARG_SMART_BLOCK_TYPE) - private val excludedTypes: List - get() = argOrNull>(ARG_EXCLUDED_TYPES) ?: emptyList() - - private val vm by viewModels { factory } - - private val isDraft: Boolean get() = argOrNull(OBJECT_IS_DRAFT_KEY) ?: false - - private val isSetSource: Boolean get() = argOrNull(ARG_IS_SET_SOURCE) ?: false - - private val selectedSources : List - get() = argOrNull>(ARG_SOURCES) ?: emptyList() + abstract fun setTitle() + abstract fun startWithParams() + abstract fun onItemClicked(id: Id, name: String) @Inject lateinit var factory: ObjectTypeChangeViewModelFactory + protected val vm by viewModels { factory } + + protected val excludeTypes: List + get() = argOrNull>(ARG_EXCLUDE_TYPES) ?: emptyList() + protected val selectedTypes: List + get() = argOrNull>(ARG_SELECTED_TYPES) ?: emptyList() private val objectTypeAdapter by lazy { ObjectTypeVerticalAdapter( @@ -57,31 +47,19 @@ class ObjectTypeChangeFragment : override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - if (isSetSource) { - binding.tvTitle.text = getString(R.string.select_source) - } + setTitle() binding.recycler.apply { adapter = objectTypeAdapter layoutManager = LinearLayoutManager(context) } } - private fun observeViews(views: List) { + private fun observeViews(views: List) { objectTypeAdapter.update(views) } - private fun onItemClicked(id: String, name: String) { - val bundle = bundleOf( - OBJECT_TYPE_URL_KEY to id, - OBJECT_TYPE_NAME_KEY to name, - OBJECT_IS_DRAFT_KEY to isDraft - ) - setFragmentResult(OBJECT_TYPE_REQUEST_KEY, bundle) - view?.rootView?.hideKeyboard() - dismiss() - } - override fun onStart() { + super.onStart() expand() with(lifecycleScope) { jobs += subscribe(vm.results) { observeViews(it) } @@ -89,22 +67,7 @@ class ObjectTypeChangeFragment : vm.onQueryChanged(it.toString()) } } - super.onStart() - vm.onStart( - smartBlockType = smartBlockType, - excludedTypes = excludedTypes, - isDraft = isDraft, - selectedSources = selectedSources, - isSetSource = isSetSource - ) - } - - override fun injectDependencies() { - componentManager().objectTypeChangeComponent.get().inject(this) - } - - override fun releaseDependencies() { - componentManager().objectTypeChangeComponent.release() + startWithParams() } override fun inflateBinding( @@ -115,13 +78,9 @@ class ObjectTypeChangeFragment : ) companion object { - const val ARG_SMART_BLOCK_TYPE = "arg.object-type.smart-block-type" - const val ARG_EXCLUDED_TYPES = "arg.object-type.excluded-types" - const val ARG_IS_SET_SOURCE = "arg.object-type.is-set-source" - const val ARG_SOURCES = "arg.object-type.sources" + const val ARG_EXCLUDE_TYPES = "arg.object-type-change.exclude-types" + const val ARG_SELECTED_TYPES = "arg.object-type-change.selected-types" const val OBJECT_TYPE_URL_KEY = "object-type-url.key" - const val OBJECT_TYPE_NAME_KEY = "object-type-name.key" const val OBJECT_TYPE_REQUEST_KEY = "object-type.request" - const val OBJECT_IS_DRAFT_KEY = "arg.object-type-change.isDraft" } } \ No newline at end of file diff --git a/app/src/main/java/com/anytypeio/anytype/ui/objects/types/pickers/AppDefaultObjectTypeFragment.kt b/app/src/main/java/com/anytypeio/anytype/ui/objects/types/pickers/AppDefaultObjectTypeFragment.kt new file mode 100644 index 000000000..861e4db04 --- /dev/null +++ b/app/src/main/java/com/anytypeio/anytype/ui/objects/types/pickers/AppDefaultObjectTypeFragment.kt @@ -0,0 +1,58 @@ +package com.anytypeio.anytype.ui.objects.types.pickers + +import androidx.core.os.bundleOf +import com.anytypeio.anytype.R +import com.anytypeio.anytype.core_models.Id +import com.anytypeio.anytype.core_utils.ext.hideSoftInput +import com.anytypeio.anytype.core_utils.ext.withParent +import com.anytypeio.anytype.di.common.componentManager +import com.anytypeio.anytype.ui.objects.BaseObjectTypeChangeFragment + +/** + * Selecting a default object type for application + */ +class AppDefaultObjectTypeFragment : BaseObjectTypeChangeFragment() { + + override fun startWithParams() { + vm.onStart( + isWithSet = false, + isWithBookmark = false, + excludeTypes = excludeTypes, + selectedTypes = emptyList(), + isSetSource = false + ) + } + + override fun onItemClicked(id: Id, name: String) { + withParent { + onProceedWithUpdateType( + id = id, + name = name + ) + } + hideSoftInput() + dismiss() + } + + override fun setTitle() { + binding.tvTitle.text = getString(R.string.change_type) + } + + override fun injectDependencies() { + componentManager().objectTypeChangeComponent.get().inject(this) + } + + override fun releaseDependencies() { + componentManager().objectTypeChangeComponent.release() + } + + companion object { + fun newInstance(excludeTypes: List) = AppDefaultObjectTypeFragment().apply { + arguments = bundleOf(ARG_EXCLUDE_TYPES to excludeTypes) + } + } + + interface OnObjectTypeAction { + fun onProceedWithUpdateType(id: Id, name: String) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/anytypeio/anytype/ui/objects/types/pickers/DataViewSelectSourceFragment.kt b/app/src/main/java/com/anytypeio/anytype/ui/objects/types/pickers/DataViewSelectSourceFragment.kt new file mode 100644 index 000000000..9b6fe293c --- /dev/null +++ b/app/src/main/java/com/anytypeio/anytype/ui/objects/types/pickers/DataViewSelectSourceFragment.kt @@ -0,0 +1,51 @@ +package com.anytypeio.anytype.ui.objects.types.pickers + +import androidx.core.os.bundleOf +import com.anytypeio.anytype.R +import com.anytypeio.anytype.core_models.Id +import com.anytypeio.anytype.core_utils.ext.hideSoftInput +import com.anytypeio.anytype.core_utils.ext.withParent +import com.anytypeio.anytype.di.common.componentManager +import com.anytypeio.anytype.ui.objects.BaseObjectTypeChangeFragment + +/** + * Selecting a source by SmartBlockType.Page for the non-empty data view + */ +class DataViewSelectSourceFragment : BaseObjectTypeChangeFragment() { + + override fun startWithParams() { + vm.onStart( + isWithSet = false, + isWithBookmark = true, + excludeTypes = emptyList(), + selectedTypes = selectedTypes, + isSetSource = true + ) + } + + override fun onItemClicked(id: Id, name: String) { + withParent { + onProceedWithSelectSource(id = id) + } + hideSoftInput() + dismiss() + } + + override fun setTitle() { + binding.tvTitle.text = getString(R.string.select_source) + } + + override fun injectDependencies() { + componentManager().objectTypeChangeComponent.get().inject(this) + } + + override fun releaseDependencies() { + componentManager().objectTypeChangeComponent.release() + } + + companion object { + fun newInstance(selectedTypes: List) = DataViewSelectSourceFragment().apply { + arguments = bundleOf(ARG_SELECTED_TYPES to selectedTypes) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/anytypeio/anytype/ui/objects/types/pickers/DraftObjectSelectTypeFragment.kt b/app/src/main/java/com/anytypeio/anytype/ui/objects/types/pickers/DraftObjectSelectTypeFragment.kt new file mode 100644 index 000000000..2a4fa3069 --- /dev/null +++ b/app/src/main/java/com/anytypeio/anytype/ui/objects/types/pickers/DraftObjectSelectTypeFragment.kt @@ -0,0 +1,51 @@ +package com.anytypeio.anytype.ui.objects.types.pickers + +import androidx.core.os.bundleOf +import com.anytypeio.anytype.R +import com.anytypeio.anytype.core_models.Id +import com.anytypeio.anytype.core_utils.ext.hideSoftInput +import com.anytypeio.anytype.core_utils.ext.withParent +import com.anytypeio.anytype.di.common.componentManager +import com.anytypeio.anytype.ui.objects.BaseObjectTypeChangeFragment + +/** + * Selecting an object type by SmartBlockType.Page for the object in draft state + */ +class DraftObjectSelectTypeFragment : BaseObjectTypeChangeFragment() { + + override fun startWithParams() { + vm.onStart( + isWithSet = true, + isWithBookmark = false, + excludeTypes = excludeTypes, + selectedTypes = emptyList(), + isSetSource = false + ) + } + + override fun onItemClicked(id: Id, name: String) { + withParent { + onProceedWithDraftUpdateType(id = id) + } + hideSoftInput() + dismiss() + } + + override fun setTitle() { + binding.tvTitle.text = getString(R.string.change_type) + } + + override fun injectDependencies() { + componentManager().objectTypeChangeComponent.get().inject(this) + } + + override fun releaseDependencies() { + componentManager().objectTypeChangeComponent.release() + } + + companion object { + fun newInstance(excludeTypes: List) = DraftObjectSelectTypeFragment().apply { + arguments = bundleOf(ARG_EXCLUDE_TYPES to excludeTypes) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/anytypeio/anytype/ui/objects/types/pickers/EmptyDataViewSelectSourceFragment.kt b/app/src/main/java/com/anytypeio/anytype/ui/objects/types/pickers/EmptyDataViewSelectSourceFragment.kt new file mode 100644 index 000000000..711a6b845 --- /dev/null +++ b/app/src/main/java/com/anytypeio/anytype/ui/objects/types/pickers/EmptyDataViewSelectSourceFragment.kt @@ -0,0 +1,48 @@ +package com.anytypeio.anytype.ui.objects.types.pickers + +import com.anytypeio.anytype.R +import com.anytypeio.anytype.core_models.Id +import com.anytypeio.anytype.core_utils.ext.hideSoftInput +import com.anytypeio.anytype.core_utils.ext.withParent +import com.anytypeio.anytype.di.common.componentManager +import com.anytypeio.anytype.ui.objects.BaseObjectTypeChangeFragment + +/** + * Selecting a source by SmartBlockType.Page for the empty data view + */ +class EmptyDataViewSelectSourceFragment : BaseObjectTypeChangeFragment() { + + override fun startWithParams() { + vm.onStart( + isWithSet = false, + isWithBookmark = true, + excludeTypes = emptyList(), + selectedTypes = emptyList(), + isSetSource = true + ) + } + + override fun onItemClicked(id: Id, name: String) { + withParent { + onProceedWithSelectSource(id = id) + } + hideSoftInput() + dismiss() + } + + override fun setTitle() { + binding.tvTitle.text = getString(R.string.select_source) + } + + override fun injectDependencies() { + componentManager().objectTypeChangeComponent.get().inject(this) + } + + override fun releaseDependencies() { + componentManager().objectTypeChangeComponent.release() + } + + companion object { + fun newInstance() = EmptyDataViewSelectSourceFragment() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/anytypeio/anytype/ui/objects/types/pickers/ObjectSelectTypeFragment.kt b/app/src/main/java/com/anytypeio/anytype/ui/objects/types/pickers/ObjectSelectTypeFragment.kt new file mode 100644 index 000000000..00caab64b --- /dev/null +++ b/app/src/main/java/com/anytypeio/anytype/ui/objects/types/pickers/ObjectSelectTypeFragment.kt @@ -0,0 +1,51 @@ +package com.anytypeio.anytype.ui.objects.types.pickers + +import androidx.core.os.bundleOf +import com.anytypeio.anytype.R +import com.anytypeio.anytype.core_models.Id +import com.anytypeio.anytype.core_utils.ext.hideSoftInput +import com.anytypeio.anytype.core_utils.ext.withParent +import com.anytypeio.anytype.di.common.componentManager +import com.anytypeio.anytype.ui.objects.BaseObjectTypeChangeFragment + +/** + * Selecting an object type by SmartBlockType.Page for the object + */ +class ObjectSelectTypeFragment : BaseObjectTypeChangeFragment() { + + override fun startWithParams() { + vm.onStart( + isWithSet = false, + isWithBookmark = false, + excludeTypes = excludeTypes, + selectedTypes = emptyList(), + isSetSource = false + ) + } + + override fun onItemClicked(id: Id, name: String) { + withParent { + onProceedWithUpdateType(id = id) + } + hideSoftInput() + dismiss() + } + + override fun setTitle() { + binding.tvTitle.text = getString(R.string.change_type) + } + + override fun injectDependencies() { + componentManager().objectTypeChangeComponent.get().inject(this) + } + + override fun releaseDependencies() { + componentManager().objectTypeChangeComponent.release() + } + + companion object { + fun newInstance(excludeTypes: List) = ObjectSelectTypeFragment().apply { + arguments = bundleOf(ARG_EXCLUDE_TYPES to excludeTypes) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/anytypeio/anytype/ui/objects/types/pickers/OnDataViewSelectSourceAction.kt b/app/src/main/java/com/anytypeio/anytype/ui/objects/types/pickers/OnDataViewSelectSourceAction.kt new file mode 100644 index 000000000..8554afc8b --- /dev/null +++ b/app/src/main/java/com/anytypeio/anytype/ui/objects/types/pickers/OnDataViewSelectSourceAction.kt @@ -0,0 +1,7 @@ +package com.anytypeio.anytype.ui.objects.types.pickers + +import com.anytypeio.anytype.core_models.Id + +interface OnDataViewSelectSourceAction { + fun onProceedWithSelectSource(id: Id) +} \ No newline at end of file diff --git a/app/src/main/java/com/anytypeio/anytype/ui/objects/types/pickers/OnObjectSelectTypeAction.kt b/app/src/main/java/com/anytypeio/anytype/ui/objects/types/pickers/OnObjectSelectTypeAction.kt new file mode 100644 index 000000000..7152dce51 --- /dev/null +++ b/app/src/main/java/com/anytypeio/anytype/ui/objects/types/pickers/OnObjectSelectTypeAction.kt @@ -0,0 +1,8 @@ +package com.anytypeio.anytype.ui.objects.types.pickers + +import com.anytypeio.anytype.core_models.Id + +interface OnObjectSelectTypeAction { + fun onProceedWithUpdateType(id: Id) + fun onProceedWithDraftUpdateType(id: Id) +} \ No newline at end of file diff --git a/app/src/main/java/com/anytypeio/anytype/ui/relations/RelationAddBaseFragment.kt b/app/src/main/java/com/anytypeio/anytype/ui/relations/RelationAddBaseFragment.kt index 11fc10da9..bd1445d33 100644 --- a/app/src/main/java/com/anytypeio/anytype/ui/relations/RelationAddBaseFragment.kt +++ b/app/src/main/java/com/anytypeio/anytype/ui/relations/RelationAddBaseFragment.kt @@ -21,7 +21,13 @@ import com.anytypeio.anytype.core_ui.features.relations.RelationAddAdapter import com.anytypeio.anytype.core_ui.features.relations.RelationAddHeaderAdapter import com.anytypeio.anytype.core_ui.reactive.focusChanges import com.anytypeio.anytype.core_ui.reactive.textChanges -import com.anytypeio.anytype.core_utils.ext.* +import com.anytypeio.anytype.core_utils.ext.arg +import com.anytypeio.anytype.core_utils.ext.drawable +import com.anytypeio.anytype.core_utils.ext.invisible +import com.anytypeio.anytype.core_utils.ext.statusBarHeight +import com.anytypeio.anytype.core_utils.ext.subscribe +import com.anytypeio.anytype.core_utils.ext.toast +import com.anytypeio.anytype.core_utils.ext.visible import com.anytypeio.anytype.core_utils.ui.BaseBottomSheetTextInputFragment import com.anytypeio.anytype.databinding.FragmentRelationAddBinding import com.anytypeio.anytype.di.common.componentManager @@ -104,7 +110,7 @@ abstract class RelationAddBaseFragment : BaseBottomSheetTextInputFragment(FLOW_KEY) override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -105,7 +107,7 @@ open class RelationDateValueFragment : BaseBottomSheetFragment - if (views.isEmpty()) { - views - } else { - views.filter { model -> - if (model is RelationListViewModel.Model.Item) { - model.view.name.contains(query, true) - } else { - true - } - } - } - } - subscribe(searchRelationInput.textChanges()) { - if (it.isEmpty()) clearSearchText.invisible() else clearSearchText.visible() - } - subscribe(views) { docRelationAdapter.update(it) } - } else { - binding.searchBar.root.gone() - subscribe(vm.views) { docRelationAdapter.update(it) } - } - subscribe(vm.commands) { command -> execute(command) } - subscribe(vm.toasts) { toast(it) } - subscribe(vm.isEditMode) { isEditMode -> - if (isEditMode) { - binding.btnEditOrDone.setText(R.string.done) - binding.btnPlus.invisible() - } else { - binding.btnPlus.visible() - binding.btnEditOrDone.setText(R.string.edit) - } - } - } - } - + private fun execute(command: Command) { when (command) { is Command.EditTextRelationValue -> { val fr = RelationTextValueFragment.new( ctx = ctx, - relationId = command.relation, + relationId = command.relationId, + relationKey = command.relationKey, objectId = command.target, isLocked = command.isLocked ) @@ -155,22 +114,22 @@ open class RelationListFragment : BaseBottomSheetFragment { val fr = RelationDateValueFragment.new( ctx = ctx, - relationId = command.relation, + relationId = command.relationId, + relationKey = command.relationKey, objectId = command.target ) fr.show(childFragmentManager, null) } is Command.EditRelationValue -> { - findNavController().navigate( - R.id.objectRelationValueScreen, - bundleOf( - RelationValueBaseFragment.CTX_KEY to command.ctx, - RelationValueBaseFragment.TARGET_KEY to command.target, - RelationValueBaseFragment.RELATION_KEY to command.relation, - RelationValueBaseFragment.TARGET_TYPES_KEY to command.targetObjectTypes, - RelationValueBaseFragment.IS_LOCKED_KEY to command.isLocked - ) + val fr = RelationValueFragment.new( + ctx = ctx, + target = command.target, + relationId = command.relationId, + relationKey = command.relationKey, + targetObjectTypes = command.targetObjectTypes, + isLocked = command.isLocked ) + fr.show(childFragmentManager, null) } is Command.SetRelationKey -> { withParent { @@ -185,6 +144,42 @@ open class RelationListFragment : BaseBottomSheetFragment execute(command) } + jobs += lifecycleScope.subscribe(vm.toasts) { toast(it) } + jobs += lifecycleScope.subscribe(vm.isEditMode) { isEditMode -> + if (isEditMode) { + binding.btnEditOrDone.setText(R.string.done) + binding.btnPlus.invisible() + } else { + binding.btnPlus.visible() + binding.btnEditOrDone.setText(R.string.edit) + } + } + if (mode == MODE_ADD) { + binding.searchBar.root.visible() + val queries = searchRelationInput.textChanges() + .onStart { emit(searchRelationInput.text.toString()) } + val views = vm.views.combine(queries) { views, query -> + if (views.isEmpty()) { + views + } else { + views.filter { model -> + if (model is RelationListViewModel.Model.Item) { + model.view.name.contains(query, true) + } else { + true + } + } + } + } + jobs += lifecycleScope.subscribe(searchRelationInput.textChanges()) { + if (it.isEmpty()) clearSearchText.invisible() else clearSearchText.visible() + } + jobs += lifecycleScope.subscribe(views) { docRelationAdapter.update(it) } + } else { + binding.searchBar.root.gone() + jobs += lifecycleScope.subscribe(vm.views) { docRelationAdapter.update(it) } + } super.onStart() if (mode == MODE_LIST) { vm.onStartListMode(ctx) @@ -198,19 +193,19 @@ open class RelationListFragment : BaseBottomSheetFragment(CONTEXT_ID) private val relationId get() = arg(RELATION_ID) + private val relationKey get() = arg(RELATION_KEY) private val objectId get() = arg(OBJECT_ID) private val flow get() = arg(FLOW_KEY) private val isLocked get() = arg(LOCKED_KEY) @@ -82,7 +83,7 @@ open class RelationTextValueFragment : withParent { onTextValueChanged( ctx = ctx, - relationId = relationId, + relationKey = relationKey, objectId = objectId, text = parsed ) @@ -122,7 +123,7 @@ open class RelationTextValueFragment : override fun onStart() { jobs += lifecycleScope.subscribe(vm.views) { relationValueAdapter.update(it) } - jobs += lifecycleScope.subscribe(vm.actions) { relationValueActionAdapter.submitList(it) } + jobs += lifecycleScope.subscribe(vm.actions) { relationValueActionAdapter.submitList(it) } jobs += lifecycleScope.subscribe(vm.intents) { proceedWithAction(it) } jobs += lifecycleScope.subscribe(vm.title) { binding.tvRelationHeader.text = it } jobs += lifecycleScope.subscribe(vm.isDismissed) { isDismissed -> @@ -138,6 +139,7 @@ open class RelationTextValueFragment : } else { vm.onStart( relationId = relationId, + relationKey = relationKey, recordId = objectId, isLocked = isLocked, ) @@ -154,7 +156,7 @@ open class RelationTextValueFragment : withParent { onTextValueChanged( ctx = ctx, - relationId = relationId, + relationKey = relationKey, objectId = objectId, text = txt ) @@ -167,7 +169,7 @@ open class RelationTextValueFragment : withParent { onNumberValueChanged( ctx = ctx, - relationId = relationId, + relationKey = relationKey, objectId = objectId, number = number ) @@ -221,6 +223,7 @@ open class RelationTextValueFragment : fun new( ctx: Id, relationId: Id, + relationKey: Key, objectId: Id, flow: Int = FLOW_DEFAULT, isLocked: Boolean = false, @@ -228,6 +231,7 @@ open class RelationTextValueFragment : arguments = bundleOf( CONTEXT_ID to ctx, RELATION_ID to relationId, + RELATION_KEY to relationKey, OBJECT_ID to objectId, FLOW_KEY to flow, LOCKED_KEY to isLocked @@ -238,7 +242,7 @@ open class RelationTextValueFragment : ctx: Id, name: String = "", value: Long? = null - ) = new(ctx, "", "", FLOW_CHANGE_DATE) + ) = new(ctx, "", "", "", FLOW_CHANGE_DATE) .apply { arguments?.apply { putString(KEY_NAME, name) @@ -248,6 +252,7 @@ open class RelationTextValueFragment : const val CONTEXT_ID = "arg.edit-relation-value.context" const val RELATION_ID = "arg.edit-relation-value.relation.id" + const val RELATION_KEY = "arg.edit-relation-value.relation.key" const val OBJECT_ID = "arg.edit-relation-value.object.id" const val FLOW_KEY = "arg.edit-relation-value.flow" const val LOCKED_KEY = "arg.edit-relation-value.locked" @@ -264,14 +269,14 @@ open class RelationTextValueFragment : ctx: Id, text: String, objectId: Id, - relationId: Id + relationKey: Key ) fun onNumberValueChanged( ctx: Id, number: Double?, objectId: Id, - relationId: Id + relationKey: Key ) } } \ No newline at end of file diff --git a/app/src/main/java/com/anytypeio/anytype/ui/relations/RelationValueBaseFragment.kt b/app/src/main/java/com/anytypeio/anytype/ui/relations/RelationValueBaseFragment.kt index bf61836e7..b8d73a82e 100644 --- a/app/src/main/java/com/anytypeio/anytype/ui/relations/RelationValueBaseFragment.kt +++ b/app/src/main/java/com/anytypeio/anytype/ui/relations/RelationValueBaseFragment.kt @@ -24,6 +24,7 @@ import androidx.recyclerview.widget.RecyclerView import com.anytypeio.anytype.BuildConfig import com.anytypeio.anytype.R import com.anytypeio.anytype.core_models.Id +import com.anytypeio.anytype.core_models.Key import com.anytypeio.anytype.core_ui.features.sets.RelationValueAdapter import com.anytypeio.anytype.core_ui.reactive.clicks import com.anytypeio.anytype.core_ui.tools.DefaultDragAndDropBehavior @@ -73,12 +74,13 @@ abstract class RelationValueBaseFragment : BaseBottomSheetFragment>(TARGET_TYPES_KEY) - protected val isLocked get() = arg(IS_LOCKED_KEY) + private val isLocked get() = arg(IS_LOCKED_KEY) abstract val vm: RelationValueBaseViewModel @@ -92,7 +94,7 @@ abstract class RelationValueBaseFragment : BaseBottomSheetFragment vm.onRemoveStatusFromObjectClicked( target = target, - relation = relation, + relationKey = relationKey, status = status.id ) }, onRemoveTagClicked = { tag -> vm.onRemoveTagFromObjectClicked( target = target, - relation = relation, + relationKey = relationKey, tag = tag.id ) }, @@ -146,7 +148,7 @@ abstract class RelationValueBaseFragment : BaseBottomSheetFragment vm.onRemoveObjectFromObjectClicked( target = target, - relation = relation, + relationKey = relationKey, objectId = obj ) }, @@ -154,7 +156,7 @@ abstract class RelationValueBaseFragment : BaseBottomSheetFragment vm.onRemoveFileFromObjectClicked( target = target, - relation = relation, + relationKey = relationKey, fileId = file ) } @@ -190,7 +192,10 @@ abstract class RelationValueBaseFragment : BaseBottomSheetFragment observeLoading(isLoading) } jobs += lifecycleScope.subscribe(vm.copyFileStatus) { command -> onCopyFileCommand(command) } super.onStart() - vm.onStart(relationId = relation, objectId = target) + vm.onStart( + relationKey = relationKey, + objectId = target + ) } private fun observeLoading(isLoading: Boolean) { @@ -451,7 +456,8 @@ abstract class RelationValueBaseFragment : BaseBottomSheetFragment ) { vm.onAddObjectsOrFilesValueToRecord( - record = target, - relation = relation, + record = objectId, + relationKey = relationKey, ids = ids ) } - override fun onFileValueChanged(ctx: Id, objectId: Id, relationId: Id, ids: List) { + override fun onFileValueChanged(ctx: Id, objectId: Id, relationKey: Key, ids: List) { vm.onAddObjectsOrFilesValueToRecord( - record = target, - relation = relation, + record = objectId, + relationKey = relationKey, ids = ids ) } @@ -492,7 +498,8 @@ open class RelationValueDVFragment : RelationValueBaseFragment() { val fragmentFlow = AddObjectRelationFragment.FLOW_DATAVIEW val fr = AddObjectRelationFragment.new( ctx = ctx, - relationId = relation, + relationId = relationId, + relationKey = relationKey, objectId = target, types = types, flow = fragmentFlow @@ -503,7 +510,8 @@ open class RelationValueDVFragment : RelationValueBaseFragment() { val fr = AddOptionsRelationDVFragment.new( ctx = ctx, target = target, - relation = relation, + relationId = relationId, + relationKey = relationKey, dataview = dataview, viewer = viewer ) @@ -512,9 +520,10 @@ open class RelationValueDVFragment : RelationValueBaseFragment() { RelationValueBaseViewModel.ObjectRelationValueCommand.ShowAddFileScreen -> { val fr = AddFileRelationFragment.new( ctx = ctx, - relationId = relation, + relationId = relationId, objectId = target, - flow = AddFileRelationFragment.FLOW_DATAVIEW + flow = AddFileRelationFragment.FLOW_DATAVIEW, + relationKey = relationKey ) fr.show(childFragmentManager, null) } @@ -543,7 +552,7 @@ open class RelationValueDVFragment : RelationValueBaseFragment() { vm.onAddFileToObject( ctx = ctx, target = target, - relation = relation, + relationKey = relationKey, filePath = filePath ) } else { @@ -582,22 +591,22 @@ class RelationValueFragment : RelationValueBaseFragment() { override fun onObjectValueChanged( ctx: Id, objectId: Id, - relationId: Id, + relationKey: Key, ids: List ) { vm.onAddObjectsOrFilesValueToObject( ctx = ctx, - target = target, - relation = relation, + target = objectId, + relationKey = relationKey, ids = ids ) } - override fun onFileValueChanged(ctx: Id, objectId: Id, relationId: Id, ids: List) { + override fun onFileValueChanged(ctx: Id, objectId: Id, relationKey: Key, ids: List) { vm.onAddObjectsOrFilesValueToObject( ctx = ctx, - target = target, - relation = relation, + target = objectId, + relationKey = relationKey, ids = ids ) } @@ -615,7 +624,8 @@ class RelationValueFragment : RelationValueBaseFragment() { RelationValueBaseViewModel.ObjectRelationValueCommand.ShowAddObjectScreen -> { val fr = AddObjectRelationFragment.new( ctx = ctx, - relationId = relation, + relationId = relationId, + relationKey = relationKey, objectId = target, types = types ) @@ -625,14 +635,16 @@ class RelationValueFragment : RelationValueBaseFragment() { val fr = AddOptionsRelationFragment.new( ctx = ctx, objectId = target, - relationId = relation + relationId = relationId, + relationKey = relationKey ) fr.show(childFragmentManager, null) } RelationValueBaseViewModel.ObjectRelationValueCommand.ShowAddFileScreen -> { val fr = AddFileRelationFragment.new( ctx = ctx, - relationId = relation, + relationId = relationId, + relationKey = relationKey, objectId = target, flow = AddFileRelationFragment.FLOW_DEFAULT ) @@ -668,7 +680,7 @@ class RelationValueFragment : RelationValueBaseFragment() { vm.onAddFileToObject( ctx = ctx, target = target, - relation = relation, + relationKey = relationKey, filePath = filePath ) } else { @@ -688,14 +700,16 @@ class RelationValueFragment : RelationValueBaseFragment() { fun new( ctx: Id, target: Id, - relation: Id, + relationId: Id, + relationKey: Key, targetObjectTypes: List, isLocked: Boolean = false ) = RelationValueFragment().apply { arguments = bundleOf( CTX_KEY to ctx, TARGET_KEY to target, - RELATION_KEY to relation, + RELATION_ID to relationId, + RELATION_KEY to relationKey, TARGET_TYPES_KEY to targetObjectTypes, IS_LOCKED_KEY to isLocked ) diff --git a/app/src/main/java/com/anytypeio/anytype/ui/relations/add/AddFileRelationFragment.kt b/app/src/main/java/com/anytypeio/anytype/ui/relations/add/AddFileRelationFragment.kt index 552445b96..d297c6aa7 100644 --- a/app/src/main/java/com/anytypeio/anytype/ui/relations/add/AddFileRelationFragment.kt +++ b/app/src/main/java/com/anytypeio/anytype/ui/relations/add/AddFileRelationFragment.kt @@ -11,6 +11,7 @@ import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.LinearLayoutManager import com.anytypeio.anytype.R import com.anytypeio.anytype.core_models.Id +import com.anytypeio.anytype.core_models.Key import com.anytypeio.anytype.core_ui.features.relations.RelationFileValueAdapter import com.anytypeio.anytype.core_ui.reactive.textChanges import com.anytypeio.anytype.core_utils.ext.arg @@ -37,6 +38,7 @@ class AddFileRelationFragment : private val ctx get() = argString(CONTEXT_ID) private val objectId get() = argString(OBJECT_ID) private val relationId get() = argString(RELATION_ID) + private val relationKey get() = argString(RELATION_KEY) private val flow get() = arg(FLOW_KEY) private lateinit var searchRelationInput: EditText @@ -104,7 +106,7 @@ class AddFileRelationFragment : onFileValueChanged( ctx = ctx, objectId = objectId, - relationId = relationId, + relationKey = relationKey, ids = ids ) } @@ -144,18 +146,21 @@ class AddFileRelationFragment : ctx: Id, objectId: Id, relationId: Id, + relationKey: Key, flow: Int = FLOW_DEFAULT ) = AddFileRelationFragment().apply { arguments = bundleOf( CONTEXT_ID to ctx, OBJECT_ID to objectId, RELATION_ID to relationId, + RELATION_KEY to relationKey, FLOW_KEY to flow ) } const val CONTEXT_ID = "arg.relation.add.file.context" const val RELATION_ID = "arg.relation.add.file.relation.id" + const val RELATION_KEY = "arg.relation.add.file.relation.key" const val OBJECT_ID = "arg.relation.add.file.object.id" const val FLOW_KEY = "arg.relation.add.file.flow" const val FLOW_DEFAULT = 0 @@ -166,7 +171,7 @@ class AddFileRelationFragment : fun onFileValueChanged( ctx: Id, objectId: Id, - relationId: Id, + relationKey: Key, ids: List ) } diff --git a/app/src/main/java/com/anytypeio/anytype/ui/relations/add/AddObjectRelationFragment.kt b/app/src/main/java/com/anytypeio/anytype/ui/relations/add/AddObjectRelationFragment.kt index 5caa22b8f..c2f04b546 100644 --- a/app/src/main/java/com/anytypeio/anytype/ui/relations/add/AddObjectRelationFragment.kt +++ b/app/src/main/java/com/anytypeio/anytype/ui/relations/add/AddObjectRelationFragment.kt @@ -13,6 +13,7 @@ import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.LinearLayoutManager import com.anytypeio.anytype.R import com.anytypeio.anytype.core_models.Id +import com.anytypeio.anytype.core_models.Key import com.anytypeio.anytype.core_ui.features.relations.RelationObjectValueAdapter import com.anytypeio.anytype.core_ui.reactive.clicks import com.anytypeio.anytype.core_ui.reactive.textChanges @@ -43,6 +44,7 @@ class AddObjectRelationFragment : BaseDialogFragment>(TARGET_TYPES) private val flow get() = arg(FLOW_KEY) @@ -116,7 +118,7 @@ class AddObjectRelationFragment : BaseDialogFragment, flow: Int = FLOW_DEFAULT ) = AddObjectRelationFragment().apply { @@ -194,6 +197,7 @@ class AddObjectRelationFragment : BaseDialogFragment ) } diff --git a/app/src/main/java/com/anytypeio/anytype/ui/relations/add/AddOptionsRelationDVFragment.kt b/app/src/main/java/com/anytypeio/anytype/ui/relations/add/AddOptionsRelationDVFragment.kt index 72c61b66f..d52497599 100644 --- a/app/src/main/java/com/anytypeio/anytype/ui/relations/add/AddOptionsRelationDVFragment.kt +++ b/app/src/main/java/com/anytypeio/anytype/ui/relations/add/AddOptionsRelationDVFragment.kt @@ -3,6 +3,7 @@ package com.anytypeio.anytype.ui.relations.add import androidx.core.os.bundleOf import androidx.fragment.app.viewModels import com.anytypeio.anytype.core_models.Id +import com.anytypeio.anytype.core_models.Key import com.anytypeio.anytype.di.common.componentManager import com.anytypeio.anytype.presentation.relations.RelationValueView import com.anytypeio.anytype.presentation.relations.add.AddOptionsRelationDVViewModel @@ -16,31 +17,24 @@ open class AddOptionsRelationDVFragment : BaseAddOptionsRelationFragment() { override fun onStatusClicked(status: RelationValueView.Option.Status) { vm.onAddObjectSetStatusClicked( - ctx = ctx, obj = target, - dataview = dataview, - viewer = viewer, - relation = relation, + relationKey = relationKey, status = status ) } override fun onCreateOptionClicked(name: String) { vm.onCreateDataViewRelationOptionClicked( - ctx = ctx, - relation = relation, + relationKey = relationKey, name = name, - dataview = dataview, - viewer = viewer, target = target ) } override fun onAddButtonClicked() { vm.onAddSelectedValuesToDataViewClicked( - ctx = ctx, target = target, - relation = relation + relationKey = relationKey ) } @@ -56,14 +50,16 @@ open class AddOptionsRelationDVFragment : BaseAddOptionsRelationFragment() { fun new( ctx: Id, target: Id, - relation: Id, + relationId: Id, + relationKey: Key, dataview: Id, viewer: Id ) = AddOptionsRelationDVFragment().apply { arguments = bundleOf( CTX_KEY to ctx, TARGET_KEY to target, - RELATION_KEY to relation, + RELATION_ID to relationId, + RELATION_KEY to relationKey, DATAVIEW_KEY to dataview, VIEWER_KEY to viewer ) diff --git a/app/src/main/java/com/anytypeio/anytype/ui/relations/add/AddOptionsRelationFragment.kt b/app/src/main/java/com/anytypeio/anytype/ui/relations/add/AddOptionsRelationFragment.kt index 3d3e455b8..f75ffae08 100644 --- a/app/src/main/java/com/anytypeio/anytype/ui/relations/add/AddOptionsRelationFragment.kt +++ b/app/src/main/java/com/anytypeio/anytype/ui/relations/add/AddOptionsRelationFragment.kt @@ -3,6 +3,7 @@ package com.anytypeio.anytype.ui.relations.add import androidx.core.os.bundleOf import androidx.fragment.app.viewModels import com.anytypeio.anytype.core_models.Id +import com.anytypeio.anytype.core_models.Key import com.anytypeio.anytype.di.common.componentManager import com.anytypeio.anytype.presentation.relations.RelationValueView import com.anytypeio.anytype.presentation.relations.add.AddOptionsRelationViewModel @@ -17,15 +18,14 @@ class AddOptionsRelationFragment : BaseAddOptionsRelationFragment() { override fun onStatusClicked(status: RelationValueView.Option.Status) { vm.onAddObjectStatusClicked( ctx = ctx, - relation = relation, + relationKey = relationKey, status = status ) } override fun onCreateOptionClicked(name: String) { vm.onCreateObjectRelationOptionClicked( - ctx = ctx, - relation = relation, + relationKey = relationKey, obj = target, name = name ) @@ -33,9 +33,8 @@ class AddOptionsRelationFragment : BaseAddOptionsRelationFragment() { override fun onAddButtonClicked() { vm.onAddSelectedValuesToObjectClicked( - ctx = ctx, obj = target, - relation = relation, + relationKey = relationKey ) } @@ -51,12 +50,14 @@ class AddOptionsRelationFragment : BaseAddOptionsRelationFragment() { fun new( ctx: Id, objectId: Id, - relationId: Id + relationId: Id, + relationKey: Key ) = AddOptionsRelationFragment().apply { arguments = bundleOf( CTX_KEY to ctx, TARGET_KEY to objectId, - RELATION_KEY to relationId + RELATION_ID to relationId, + RELATION_KEY to relationKey ) } } diff --git a/app/src/main/java/com/anytypeio/anytype/ui/relations/add/BaseAddOptionsRelationFragment.kt b/app/src/main/java/com/anytypeio/anytype/ui/relations/add/BaseAddOptionsRelationFragment.kt index dad3bdcc5..7d58191be 100644 --- a/app/src/main/java/com/anytypeio/anytype/ui/relations/add/BaseAddOptionsRelationFragment.kt +++ b/app/src/main/java/com/anytypeio/anytype/ui/relations/add/BaseAddOptionsRelationFragment.kt @@ -37,7 +37,8 @@ abstract class BaseAddOptionsRelationFragment : BaseDialogFragment(FLOW_KEY) val dataview get() = argString(DATAVIEW_KEY) @@ -178,7 +179,7 @@ abstract class BaseAddOptionsRelationFragment : BaseDialogFragment(R.layout.fragment_create_set), - CreateObjectTypeCallback { - - private val ctx: String get() = argString(CONTEXT_ID_KEY) - - private val vm: CreateObjectSetViewModel by viewModels { factory } - - @Inject - lateinit var factory: CreateObjectSetViewModel.Factory - - private val headerAdapter by lazy { - CreateSetHeaderAdapter { vm.onCreateNewObjectType() } - } - - private val typeAdapter by lazy { - CreateSetObjectTypeAdapter { type -> vm.onObjectTypeSelected(type, ctx) } - } - - private val createSetAdapter by lazy { - ConcatAdapter(headerAdapter, typeAdapter) - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - vm.state.observe(viewLifecycleOwner) { observe(it) } - binding.recycler.apply { - layoutManager = LinearLayoutManager(context) - adapter = createSetAdapter - } - } - - override fun onActivityCreated(savedInstanceState: Bundle?) { - super.onActivityCreated(savedInstanceState) - vm.objectTypeViews.onEach { - Timber.d("Receiving new views: $it") - typeAdapter.views = it - typeAdapter.notifyDataSetChanged() - createSetAdapter.notifyDataSetChanged() - }.launchIn(lifecycleScope) - } - - override fun onCreateObjectTypeClicked(type: CreateObjectTypeView, name: String) { - vm.onCreateObjectTypeClicked(type, name) - Timber.d("CreateObjectType:$type, $name") - } - - override fun injectDependencies() { - componentManager().createSetComponent.get().inject(this) - } - - override fun releaseDependencies() { - componentManager().createSetComponent.release() - } - - private fun observe(state: CreateSetViewState) { - when (state) { - is CreateSetViewState.AddObjectType -> { - CreateObjectTypeFragment.newInstance(state.data).show(childFragmentManager, null) - } - } - } - - override fun inflateBinding( - inflater: LayoutInflater, - container: ViewGroup? - ): FragmentCreateSetBinding = FragmentCreateSetBinding.inflate( - inflater, container, false - ) - - companion object { - const val CONTEXT_ID_KEY = "arg.create_object_set.context" - } -} - -interface CreateObjectTypeCallback { - fun onCreateObjectTypeClicked(type: CreateObjectTypeView, name: String) -} \ No newline at end of file diff --git a/app/src/main/java/com/anytypeio/anytype/ui/sets/CreateObjectTypeFragment.kt b/app/src/main/java/com/anytypeio/anytype/ui/sets/CreateObjectTypeFragment.kt deleted file mode 100644 index 2a30dbeec..000000000 --- a/app/src/main/java/com/anytypeio/anytype/ui/sets/CreateObjectTypeFragment.kt +++ /dev/null @@ -1,88 +0,0 @@ -package com.anytypeio.anytype.ui.sets - -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.fragment.app.viewModels -import androidx.lifecycle.observe -import androidx.recyclerview.widget.LinearLayoutManager -import com.anytypeio.anytype.core_ui.features.sets.CreateObjectTypeAdapter -import com.anytypeio.anytype.core_utils.ext.hideKeyboard -import com.anytypeio.anytype.core_utils.ui.BaseBottomSheetFragment -import com.anytypeio.anytype.databinding.FragmentCreateObjectTypeBinding -import com.anytypeio.anytype.di.common.componentManager -import com.anytypeio.anytype.presentation.sets.CreateObjectTypeView -import com.anytypeio.anytype.presentation.sets.CreateObjectTypeViewModel -import com.anytypeio.anytype.presentation.sets.CreateObjectTypeViewState -import javax.inject.Inject - -class CreateObjectTypeFragment : BaseBottomSheetFragment() { - - @Inject - lateinit var factory: CreateObjectTypeViewModel.Factory - private val vm by viewModels { factory } - private val typesAdapter by lazy { CreateObjectTypeAdapter { vm.onSelectType(it) } } - private val types: List - get() { - val args = requireArguments() - val list = - args.getParcelableArrayList(ARG_TYPES) - checkNotNull(list) - return list - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - binding.btnCreate.setOnClickListener { vm.onCreateClicked(binding.edtTypeName.text.toString()) } - vm.state.observe(viewLifecycleOwner) { observeData(it) } - binding.rvTypes.layoutManager = LinearLayoutManager(requireContext()) - binding.rvTypes.adapter = typesAdapter - vm.init(types) - } - - private fun observeData(state: CreateObjectTypeViewState) { - when (state) { - CreateObjectTypeViewState.Loading -> TODO() - is CreateObjectTypeViewState.Success -> { - typesAdapter.types = state.data - typesAdapter.notifyDataSetChanged() - } - is CreateObjectTypeViewState.Exit -> { - (parentFragment as CreateObjectTypeCallback).onCreateObjectTypeClicked( - state.type, - state.name - ) - binding.edtTypeName.hideKeyboard() - dismiss() - } - } - } - - override fun injectDependencies() { - componentManager().createObjectTypeComponent.get().inject(this) - } - - override fun releaseDependencies() { - componentManager().createObjectTypeComponent.release() - } - - override fun inflateBinding( - inflater: LayoutInflater, - container: ViewGroup? - ): FragmentCreateObjectTypeBinding = FragmentCreateObjectTypeBinding.inflate( - inflater, container, false - ) - - companion object { - - private const val ARG_TYPES = "arg.create.object.types" - - fun newInstance(types: ArrayList): CreateObjectTypeFragment = - CreateObjectTypeFragment().apply { - arguments = Bundle().apply { - putParcelableArrayList(ARG_TYPES, types) - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/anytypeio/anytype/ui/sets/ObjectSetFragment.kt b/app/src/main/java/com/anytypeio/anytype/ui/sets/ObjectSetFragment.kt index c7d214b27..15b2fceeb 100644 --- a/app/src/main/java/com/anytypeio/anytype/ui/sets/ObjectSetFragment.kt +++ b/app/src/main/java/com/anytypeio/anytype/ui/sets/ObjectSetFragment.kt @@ -32,6 +32,7 @@ import androidx.recyclerview.widget.RecyclerView import com.anytypeio.anytype.BuildConfig 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.SyncStatus import com.anytypeio.anytype.core_ui.extensions.setEmojiOrNull import com.anytypeio.anytype.core_ui.features.dataview.ViewerGridAdapter @@ -73,7 +74,10 @@ import com.anytypeio.anytype.ui.base.NavigationFragment import com.anytypeio.anytype.ui.editor.cover.SelectCoverObjectSetFragment import com.anytypeio.anytype.ui.editor.modals.IconPickerFragmentBase import com.anytypeio.anytype.ui.editor.sheets.ObjectMenuBaseFragment -import com.anytypeio.anytype.ui.objects.ObjectTypeChangeFragment +import com.anytypeio.anytype.ui.objects.BaseObjectTypeChangeFragment +import com.anytypeio.anytype.ui.objects.types.pickers.DataViewSelectSourceFragment +import com.anytypeio.anytype.ui.objects.types.pickers.EmptyDataViewSelectSourceFragment +import com.anytypeio.anytype.ui.objects.types.pickers.OnDataViewSelectSourceAction import com.anytypeio.anytype.ui.relations.RelationDateValueFragment import com.anytypeio.anytype.ui.relations.RelationDateValueFragment.DateValueEditReceiver import com.anytypeio.anytype.ui.relations.RelationTextValueFragment @@ -83,8 +87,7 @@ import com.anytypeio.anytype.ui.sets.modals.CreateDataViewViewerFragment import com.anytypeio.anytype.ui.sets.modals.EditDataViewViewerFragment import com.anytypeio.anytype.ui.sets.modals.ManageViewerFragment import com.anytypeio.anytype.ui.sets.modals.ObjectSetSettingsFragment -import com.anytypeio.anytype.ui.sets.modals.SetObjectCreateBookmarkRecordFragment -import com.anytypeio.anytype.ui.sets.modals.SetObjectSetRecordNameFragment +import com.anytypeio.anytype.ui.sets.modals.SetObjectCreateRecordFragmentBase import com.anytypeio.anytype.ui.sets.modals.ViewerBottomSheetRootFragment import com.anytypeio.anytype.ui.sets.modals.sort.ViewerSortFragment import com.bumptech.glide.Glide @@ -96,7 +99,8 @@ import javax.inject.Inject open class ObjectSetFragment : NavigationFragment(R.layout.fragment_object_set), TextValueEditReceiver, - DateValueEditReceiver { + DateValueEditReceiver, + OnDataViewSelectSourceAction { // Controls @@ -187,7 +191,7 @@ open class ObjectSetFragment : binding.root.setTransitionListener(transitionListener) with(lifecycleScope) { - subscribe(addNewButton.clicks().throttleFirst()) { vm.onCreateNewRecord() } + subscribe(addNewButton.clicks().throttleFirst()) { vm.onCreateNewDataViewObject() } subscribe(title.editorActionEvents(actionHandler)) { title.apply { hideKeyboard() @@ -262,8 +266,8 @@ open class ObjectSetFragment : DefaultTextWatcher { vm.onTitleChanged(it.toString()) } ) - setFragmentResultListener(ObjectTypeChangeFragment.OBJECT_TYPE_REQUEST_KEY) { _, bundle -> - val source = bundle.getString(ObjectTypeChangeFragment.OBJECT_TYPE_URL_KEY) + setFragmentResultListener(BaseObjectTypeChangeFragment.OBJECT_TYPE_REQUEST_KEY) { _, bundle -> + val source = bundle.getString(BaseObjectTypeChangeFragment.OBJECT_TYPE_URL_KEY) if (source != null) { vm.onDataViewSourcePicked(source = source) } else { @@ -582,20 +586,24 @@ open class ObjectSetFragment : ) } is ObjectSetCommand.Modal.EditGridTextCell -> { + //todo Relation as object, fix relationKey val fr = RelationTextValueFragment.new( ctx = ctx, - relationId = command.relationId, + relationId = "", objectId = command.recordId, - flow = RelationTextValueFragment.FLOW_DATAVIEW + flow = RelationTextValueFragment.FLOW_DATAVIEW, + relationKey = command.relationKey ) fr.show(childFragmentManager, EMPTY_TAG) } is ObjectSetCommand.Modal.EditGridDateCell -> { + //todo Relation as object, fix relationKey val fr = RelationDateValueFragment.new( ctx = ctx, - relationId = command.relationId, + relationId = command.relationKey, objectId = command.objectId, - flow = RelationDateValueFragment.FLOW_DATAVIEW + flow = RelationDateValueFragment.FLOW_DATAVIEW, + relationKey = "" ) fr.show(childFragmentManager, EMPTY_TAG) } @@ -607,7 +615,8 @@ open class ObjectSetFragment : RelationValueBaseFragment.CTX_KEY to command.ctx, RelationValueBaseFragment.TARGET_KEY to command.target, RelationValueBaseFragment.DATAVIEW_KEY to command.dataview, - RelationValueBaseFragment.RELATION_KEY to command.relation, + RelationValueBaseFragment.RELATION_KEY to command.relationKey, + RelationValueBaseFragment.RELATION_ID to "", RelationValueBaseFragment.VIEWER_KEY to command.viewer, RelationValueBaseFragment.TARGET_TYPES_KEY to command.targetObjectTypes, RelationValueBaseFragment.IS_LOCKED_KEY to false @@ -647,11 +656,14 @@ open class ObjectSetFragment : ) fr.show(childFragmentManager, EMPTY_TAG) } - is ObjectSetCommand.Modal.SetNameForCreatedRecord -> { + is ObjectSetCommand.Modal.SetNameForCreatedObject -> { findNavController().safeNavigate( R.id.objectSetScreen, R.id.setNameForNewRecordScreen, - bundleOf(SetObjectSetRecordNameFragment.CONTEXT_KEY to command.ctx) + bundleOf( + SetObjectCreateRecordFragmentBase.CONTEXT_KEY to command.ctx, + SetObjectCreateRecordFragmentBase.TARGET_KEY to command.target + ) ) } is ObjectSetCommand.Intent.MailTo -> { @@ -717,22 +729,17 @@ open class ObjectSetFragment : findNavController().safeNavigate( R.id.objectSetScreen, R.id.setUrlForNewBookmark, - bundleOf( - SetObjectCreateBookmarkRecordFragment.CTX_KEY to command.ctx - ) - ) + bundleOf(SetObjectCreateRecordFragmentBase.CONTEXT_KEY to command.ctx)) } - is ObjectSetCommand.Modal.OpenSelectSourceScreen -> { - findNavController() - .safeNavigate( - R.id.objectSetScreen, - R.id.objectTypeChangeScreen, - bundleOf( - ObjectTypeChangeFragment.ARG_SMART_BLOCK_TYPE to command.smartBlockType, - ObjectTypeChangeFragment.ARG_IS_SET_SOURCE to true, - ObjectTypeChangeFragment.ARG_SOURCES to command.sources - ) - ) + is ObjectSetCommand.Modal.OpenDataViewSelectSourceScreen -> { + val fr = DataViewSelectSourceFragment.newInstance( + selectedTypes = command.selectedTypes + ) + fr.show(childFragmentManager, null) + } + is ObjectSetCommand.Modal.OpenEmptyDataViewSelectSourceScreen -> { + val fr = EmptyDataViewSelectSourceFragment() + fr.show(childFragmentManager, null) } } } @@ -864,11 +871,11 @@ open class ObjectSetFragment : ctx: String, text: String, objectId: String, - relationId: String + relationKey: Key ) = vm.onRelationTextValueChanged( value = text, objectId = objectId, - relationKey = relationId + relationKey = relationKey ) override fun onNumberValueChanged( @@ -886,15 +893,19 @@ open class ObjectSetFragment : ctx: Id, timeInSeconds: Number?, objectId: Id, - relationId: Id + relationKey: Key ) { vm.onRelationTextValueChanged( value = timeInSeconds, objectId = objectId, - relationKey = relationId + relationKey = relationKey ) } + override fun onProceedWithSelectSource(id: Id) { + vm.onDataViewSourcePicked(source = id) + } + override fun injectDependencies() { componentManager().objectSetComponent.get(ctx).inject(this) } diff --git a/app/src/main/java/com/anytypeio/anytype/ui/sets/modals/SetObjectCreateBookmarkRecordFragment.kt b/app/src/main/java/com/anytypeio/anytype/ui/sets/modals/SetObjectCreateBookmarkRecordFragment.kt index 09f22f428..025fb8e58 100644 --- a/app/src/main/java/com/anytypeio/anytype/ui/sets/modals/SetObjectCreateBookmarkRecordFragment.kt +++ b/app/src/main/java/com/anytypeio/anytype/ui/sets/modals/SetObjectCreateBookmarkRecordFragment.kt @@ -6,7 +6,6 @@ import android.view.ViewGroup import android.widget.EditText import android.widget.TextView import androidx.fragment.app.viewModels -import com.anytypeio.anytype.core_utils.ext.arg import com.anytypeio.anytype.databinding.FragmentSetObjectCreateBookmarkRecordBinding import com.anytypeio.anytype.di.common.componentManager import com.anytypeio.anytype.presentation.sets.ObjectSetCreateBookmarkRecordViewModel @@ -15,15 +14,12 @@ import javax.inject.Inject class SetObjectCreateBookmarkRecordFragment : SetObjectCreateRecordFragmentBase() { - override val textInputType: Int = TYPE_TEXT_VARIATION_URI override val textInputField: EditText get() = binding.textInputField override val button: TextView get() = binding.button - private val ctx: String get() = arg(CTX_KEY) - @Inject lateinit var factory: ObjectSetCreateBookmarkRecordViewModel.Factory override val vm: ObjectSetCreateBookmarkRecordViewModel by viewModels { factory } @@ -37,15 +33,18 @@ class SetObjectCreateBookmarkRecordFragment : componentManager().objectSetCreateBookmarkRecordComponent.release(ctx) } + override fun onButtonClicked() { + vm.onButtonClicked(input = textInputField.text.toString()) + } + + override fun onKeyboardActionDone() { + vm.onActionDone(input = textInputField.text.toString()) + } + override fun inflateBinding( inflater: LayoutInflater, container: ViewGroup? - ): FragmentSetObjectCreateBookmarkRecordBinding = - FragmentSetObjectCreateBookmarkRecordBinding.inflate( + ): FragmentSetObjectCreateBookmarkRecordBinding = FragmentSetObjectCreateBookmarkRecordBinding.inflate( inflater, container, false - ) - - companion object { - const val CTX_KEY = "arg.object-set-record.context" - } + ) } \ No newline at end of file diff --git a/app/src/main/java/com/anytypeio/anytype/ui/sets/modals/SetObjectCreateRecordFragmentBase.kt b/app/src/main/java/com/anytypeio/anytype/ui/sets/modals/SetObjectCreateRecordFragmentBase.kt index 87f31a353..fc9ca2f42 100644 --- a/app/src/main/java/com/anytypeio/anytype/ui/sets/modals/SetObjectCreateRecordFragmentBase.kt +++ b/app/src/main/java/com/anytypeio/anytype/ui/sets/modals/SetObjectCreateRecordFragmentBase.kt @@ -14,8 +14,7 @@ import com.anytypeio.anytype.core_utils.ext.argString import com.anytypeio.anytype.core_utils.ext.hideKeyboard import com.anytypeio.anytype.core_utils.ext.toast import com.anytypeio.anytype.core_utils.ui.BaseBottomSheetFragment -import com.anytypeio.anytype.presentation.sets.ObjectSetCreateRecordViewModelBase -import com.anytypeio.anytype.ui.sets.modals.SetObjectSetRecordNameFragment.Companion.CONTEXT_KEY +import com.anytypeio.anytype.presentation.sets.SetDataViewObjectNameViewModelBase import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch @@ -23,11 +22,15 @@ abstract class SetObjectCreateRecordFragmentBase : BaseBottomSheetFragment() { protected abstract val textInputType: Int - private val ctx: String get() = argString(CONTEXT_KEY) protected abstract val textInputField: EditText protected abstract val button: View - protected abstract val vm: ObjectSetCreateRecordViewModelBase + protected abstract val vm: SetDataViewObjectNameViewModelBase + + abstract fun onButtonClicked() + abstract fun onKeyboardActionDone() + + protected val ctx: String get() = argString(CONTEXT_KEY) private val handler: (Int) -> Boolean = { action -> action == EditorInfo.IME_ACTION_DONE @@ -35,15 +38,8 @@ abstract class SetObjectCreateRecordFragmentBase : override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - textInputField.apply { - setRawInputType(textInputType) - } - button.setOnClickListener { - vm.onButtonClicked( - ctx = ctx, - input = textInputField.text.toString() - ) - } + textInputField.apply { setRawInputType(textInputType) } + button.setOnClickListener { onButtonClicked() } lifecycleScope.launch { viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) { onStart(this) @@ -68,11 +64,16 @@ abstract class SetObjectCreateRecordFragmentBase : textInputField.editorActionEvents(handler).collect { textInputField.clearFocus() textInputField.hideKeyboard() - vm.onComplete(ctx, textInputField.text.toString()) + onKeyboardActionDone() } } private suspend fun subscribeIsCompleted() { vm.isCompleted.collect { isCompleted -> if (isCompleted) dismiss() } } + + companion object { + const val CONTEXT_KEY = "arg.object-set-record.context" + const val TARGET_KEY = "arg.object-set-record.target" + } } \ No newline at end of file diff --git a/app/src/main/java/com/anytypeio/anytype/ui/sets/modals/SetObjectSetRecordNameFragment.kt b/app/src/main/java/com/anytypeio/anytype/ui/sets/modals/SetObjectSetRecordNameFragment.kt index 68a36935b..016ad1894 100644 --- a/app/src/main/java/com/anytypeio/anytype/ui/sets/modals/SetObjectSetRecordNameFragment.kt +++ b/app/src/main/java/com/anytypeio/anytype/ui/sets/modals/SetObjectSetRecordNameFragment.kt @@ -28,12 +28,13 @@ class SetObjectSetRecordNameFragment : SetObjectCreateRecordFragmentBase() { +class OtherSettingsFragment : BaseBottomSheetFragment(), + AppDefaultObjectTypeFragment.OnObjectTypeAction { @Inject lateinit var factory: OtherSettingsViewModel.Factory private val vm by viewModels { factory } - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setFragmentResultListener(ObjectTypeChangeFragment.OBJECT_TYPE_REQUEST_KEY) { _, bundle -> - val id = bundle.getString(ObjectTypeChangeFragment.OBJECT_TYPE_URL_KEY) - val name = bundle.getString(ObjectTypeChangeFragment.OBJECT_TYPE_NAME_KEY) - vm.proceedWithUpdateType(type = id, name = name) - } + override fun onProceedWithUpdateType(id: Id, name: String) { + vm.proceedWithUpdateType(type = id, name = name) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -55,13 +48,10 @@ class OtherSettingsFragment : BaseBottomSheetFragment dismiss() is OtherSettingsViewModel.Command.NavigateToObjectTypesScreen -> { - findNavController().navigate( - R.id.objectTypeChangeScreen, - bundleOf( - ObjectTypeChangeFragment.ARG_SMART_BLOCK_TYPE to command.smartBlockType, - ObjectTypeChangeFragment.ARG_EXCLUDED_TYPES to command.excludedTypes - ) + val fr = AppDefaultObjectTypeFragment.newInstance( + excludeTypes = command.excludeTypes ) + fr.show(childFragmentManager, null) } is OtherSettingsViewModel.Command.Toast -> toast(command.msg) is OtherSettingsViewModel.Command.ShowClearCacheAlert -> { diff --git a/app/src/main/res/layout/fragment_object_type_change.xml b/app/src/main/res/layout/fragment_object_type_change.xml index 81a0bf1ab..1a694c310 100644 --- a/app/src/main/res/layout/fragment_object_type_change.xml +++ b/app/src/main/res/layout/fragment_object_type_change.xml @@ -20,7 +20,7 @@ android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginTop="18dp" - android:text="@string/change_type" /> + tools:text="@string/change_type" /> , val viewers: List, - val relations: List + @Deprecated("To be deleted") + val relations: List, + val relationsIndex: List = emptyList() ) : Content() { data class Viewer( @@ -334,12 +336,16 @@ data class Block( enum class Type { ASC, DESC, CUSTOM } } + /** + * [relationFormat] optional relation format, which should be specified for date-related filtering. + */ data class Filter( val relationKey: String, + val relationFormat: RelationFormat? = null, val operator: Operator = Operator.AND, val condition: Condition, val quickOption: QuickOption = QuickOption.EXACT_DATE, - val value: Any? + val value: Any? = null ) { enum class Operator { AND, OR } enum class Condition { diff --git a/core-models/src/main/java/com/anytypeio/anytype/core_models/Event.kt b/core-models/src/main/java/com/anytypeio/anytype/core_models/Event.kt index 35b45906a..25c86b5e3 100644 --- a/core-models/src/main/java/com/anytypeio/anytype/core_models/Event.kt +++ b/core-models/src/main/java/com/anytypeio/anytype/core_models/Event.kt @@ -26,6 +26,7 @@ sealed class Event { val type: SmartBlockType = SmartBlockType.PAGE, val objectTypes: List = emptyList(), val relations: List = emptyList(), + val relationLinks: List = emptyList(), val objectRestrictions: List = emptyList(), val dataViewRestrictions: List = emptyList() ) : Command() @@ -194,24 +195,18 @@ sealed class Event { val style: Block.Content.Divider.Style ) : Command() - sealed class ObjectRelations : Command() { - data class Set( - override val context: String, - val id: Id, - val relations: List - ) : ObjectRelations() - + sealed class ObjectRelationLinks : Command() { data class Amend( override val context: String, val id: Id, - val relations: List - ) : ObjectRelations() + val relationLinks: List + ) : ObjectRelationLinks() data class Remove( override val context: String, val id: Id, - val keys: List - ) : ObjectRelations() + val keys: List + ) : ObjectRelationLinks() } sealed class ObjectRelation : Command() { @@ -250,14 +245,13 @@ sealed class Event { /** * Sent when a data-view's relation has been changed or added. - * @property [id] data view's block id - * @property [key] relation key + * @property [dv] data view's block id + * @property [links] relations link for this data view */ data class SetRelation( override val context: Id, - val id: Id, - val key: String, - val relation: Relation + val dv: Id, + val links: List ) : DataView() diff --git a/core-models/src/main/java/com/anytypeio/anytype/core_models/ObjectType.kt b/core-models/src/main/java/com/anytypeio/anytype/core_models/ObjectType.kt index 3e9cf5c42..797ff617c 100644 --- a/core-models/src/main/java/com/anytypeio/anytype/core_models/ObjectType.kt +++ b/core-models/src/main/java/com/anytypeio/anytype/core_models/ObjectType.kt @@ -9,17 +9,26 @@ package com.anytypeio.anytype.core_models * @property [layout] template's layout * */ -@Deprecated("Will be deprecated. Object type will be treated as object") data class ObjectType( + @Deprecated("Will be deprecated. Object type will be treated as object") val url: Url, + @Deprecated("Will be deprecated. Object type will be treated as object") val name: String, - val relations: List, + @Deprecated("Will be deprecated. Object type will be treated as object") + val relationLinks: List, + @Deprecated("Will be deprecated. Object type will be treated as object") val layout: Layout, + @Deprecated("Will be deprecated. Object type will be treated as object") val emoji: String, + @Deprecated("Will be deprecated. Object type will be treated as object") val description: String, + @Deprecated("Will be deprecated. Object type will be treated as object") val isHidden: Boolean, + @Deprecated("Will be deprecated. Object type will be treated as object") val isArchived: Boolean, + @Deprecated("Will be deprecated. Object type will be treated as object") val isReadOnly: Boolean, + @Deprecated("Will be deprecated. Object type will be treated as object") val smartBlockTypes: List ) { enum class Layout(val code: Int) { @@ -47,54 +56,4 @@ data class ObjectType( val layout: Layout, val emoji: String ) - - /** - * Keys for predefined, bundled object types. - */ - companion object { - const val PAGE_URL = "_otpage" - const val OBJECT_TYPE_URL = "_otobjectType" - const val RELATION_URL = "_otrelation" - const val TEMPLATE_URL = "_ottemplate" - const val IMAGE_URL = "_otimage" - const val FILE_URL = "_otfile" - const val VIDEO_URL = "_otvideo" - const val AUDIO_URL = "_otaudio" - const val SET_URL = "_otset" - const val TASK_URL = "_ottask" - const val DATE_URL = "_otdate" - const val PROFILE_URL = "_otprofile" //contains User Profile page and Anytype Person page - const val NOTE_URL = "_otnote" - const val WORKSPACE_URL = "_otspace" - const val DASHBOARD_TYPE = "_otdashboard" - const val BOOKMARK_TYPE = "_otbookmark" - - const val MAX_SNIPPET_SIZE = 30 - } -} - -class ObjectTypeComparator : Comparator { - - override fun compare(o1: ObjectType, o2: ObjectType): Int { - val o1Url = o1.url - val o2Url = o2.url - if (o1Url == o2Url) return 0 - - if (o1Url == ObjectType.PAGE_URL && o2Url != ObjectType.PAGE_URL) return -1 - if (o1Url != ObjectType.PAGE_URL && o2Url == ObjectType.PAGE_URL) return 1 - - if (o1Url == ObjectType.NOTE_URL && o2Url != ObjectType.NOTE_URL) return -1 - if (o1Url != ObjectType.NOTE_URL && o2Url == ObjectType.NOTE_URL) return 1 - - if (o1Url == ObjectType.SET_URL && o2Url != ObjectType.SET_URL) return -1 - if (o1Url != ObjectType.SET_URL && o2Url == ObjectType.SET_URL) return 1 - - if (o1Url == ObjectType.TASK_URL && o2Url != ObjectType.TASK_URL) return -1 - if (o1Url != ObjectType.TASK_URL && o2Url == ObjectType.TASK_URL) return 1 - - val o1Name = o1.name - val o2Name = o2.name - - return o1Name.compareTo(o2Name) - } } \ No newline at end of file diff --git a/core-models/src/main/java/com/anytypeio/anytype/core_models/ObjectTypeIds.kt b/core-models/src/main/java/com/anytypeio/anytype/core_models/ObjectTypeIds.kt new file mode 100644 index 000000000..4dff86224 --- /dev/null +++ b/core-models/src/main/java/com/anytypeio/anytype/core_models/ObjectTypeIds.kt @@ -0,0 +1,24 @@ +package com.anytypeio.anytype.core_models + +/** + * Keys for predefined, bundled object types. + */ +object ObjectTypeIds { + const val PAGE = "_otpage" + const val OBJECT_TYPE = "_otobjectType" + const val RELATION = "_otrelation" + const val TEMPLATE = "_ottemplate" + const val IMAGE = "_otimage" + const val FILE = "_otfile" + const val VIDEO = "_otvideo" + const val AUDIO = "_otaudio" + const val SET = "_otset" + const val TASK = "_ottask" + const val DATE = "_otdate" + const val PROFILE = "_otprofile" //contains User Profile page and Anytype Person page + const val NOTE = "_otnote" + const val WORKSPACE = "_otspace" + const val DASHBOARD = "_otdashboard" + const val BOOKMARK = "_otbookmark" + const val RELATION_OPTION = "_otrelationOption" +} \ No newline at end of file diff --git a/core-models/src/main/java/com/anytypeio/anytype/core_models/ObjectWrapper.kt b/core-models/src/main/java/com/anytypeio/anytype/core_models/ObjectWrapper.kt index 662b1fb3c..f21bc4c6e 100644 --- a/core-models/src/main/java/com/anytypeio/anytype/core_models/ObjectWrapper.kt +++ b/core-models/src/main/java/com/anytypeio/anytype/core_models/ObjectWrapper.kt @@ -1,6 +1,8 @@ package com.anytypeio.anytype.core_models +import com.anytypeio.anytype.core_models.Relations.RELATION_FORMAT_OBJECT_TYPES import com.anytypeio.anytype.core_models.ext.typeOf +import com.anytypeio.anytype.core_models.restrictions.ObjectRestriction /** * Wrapper for easily parsing object's relations when object is represented as an untyped structure. @@ -64,7 +66,7 @@ sealed class ObjectWrapper { val fileMimeType: String? by default - inline fun getValue(relation: Id) : T? { + inline fun getValue(relation: Id): T? { val value = map.getOrDefault(relation, null) return if (value is T) value @@ -80,7 +82,42 @@ sealed class ObjectWrapper { val featuredRelations: List? by default + val smartBlockTypes: List + get() = when (val value = map[Relations.SMARTBLOCKTYPES]) { + is Double -> listOf(value) + is List<*> -> value.typeOf() + else -> emptyList() + } + fun isEmpty(): Boolean = map.isEmpty() + + val relationKey: String by default + val isFavorite: Boolean? by default + val isHidden: Boolean? by default + val isReadonly: Boolean? by default + + val relationFormat: RelationFormat? + get() = when (val value = map[Relations.RELATION_FORMAT]) { + is Double -> RelationFormat.values().singleOrNull { format -> + format.code == value.toInt() + } + else -> null + } + + val restrictions: List + get() = when (val value = map[Relations.RESTRICTIONS]) { + is Double -> buildList { + ObjectRestriction.values().firstOrNull { it.code == value.toInt() } + } + is List<*> -> value.typeOf().mapNotNull { code -> + ObjectRestriction.values().firstOrNull { it.code == code.toInt() } + } + else -> emptyList() + } + + val relationOptionColor: String? by default + val relationOptionText: String? by default + val relationReadonlyValue: Boolean? by default } /** @@ -97,4 +134,104 @@ sealed class ObjectWrapper { val isArchived: Boolean? by default val isDeleted: Boolean? by default } + + /** + * Wrapper for object types + */ + data class Type(val map: Map) : ObjectWrapper() { + private val default = map.withDefault { null } + val id: Id by default + val name: String? by default + val description: String? by default + val isArchived: Boolean? by default + val iconEmoji: String? by default + val isDeleted: Boolean? by default + val smartBlockTypes: List + get() = when (val value = map[Relations.SMARTBLOCKTYPES]) { + is Double -> buildList { + SmartBlockType.values().firstOrNull { it.code == value.toInt() } + } + is List<*> -> value.typeOf().mapNotNull { code -> + SmartBlockType.values().firstOrNull { it.code == code.toInt() } + } + else -> emptyList() + } + } + + data class Relation(val map: Struct) : ObjectWrapper() { + + private val default = map.withDefault { null } + + private val relationKey : Key by default + + val relationFormat: RelationFormat + get() { + val value = map[Relations.RELATION_FORMAT] + return if (value is Double) { + RelationFormat.values().firstOrNull { f -> + f.code == value.toInt() + } ?: RelationFormat.UNDEFINED + } else { + RelationFormat.UNDEFINED + } + } + + + val relationOptionsDict: List + get() = when (val value = map[Relations.RELATION_OPTION_DICT]) { + is Id -> listOf(id) + is List<*> -> value.typeOf() + else -> emptyList() + } + + private val relationReadonlyValue: Boolean? by default + + val id: Id by default + val key: Key get() = relationKey + val format: RelationFormat get() = relationFormat + val name: String? by default + val isHidden: Boolean? by default + val isReadOnly: Boolean? by default + val isArchived: Boolean? by default + val isDeleted: Boolean? by default + val isReadonly: Boolean? by default + val isReadonlyValue: Boolean = relationReadonlyValue ?: false + + val restrictions: List + get() = when (val value = map[Relations.RESTRICTIONS]) { + is Double -> buildList { + ObjectRestriction.values().firstOrNull { it.code == value.toInt() } + } + is List<*> -> value.typeOf().mapNotNull { code -> + ObjectRestriction.values().firstOrNull { it.code == code.toInt() } + } + else -> emptyList() + } + + val relationFormatObjectTypes + get() = when (val value = map[RELATION_FORMAT_OBJECT_TYPES]) { + is Id -> listOf(value) + is List<*> -> value.typeOf() + else -> emptyList() + } + + val type: List + get() = when (val value = map[Relations.TYPE]) { + is Id -> listOf(value) + is List<*> -> value.typeOf() + else -> emptyList() + } + + val isValid get() = map.containsKey(Relations.RELATION_KEY) && map.containsKey(Relations.ID) + } + + data class Option(val map: Struct) { + private val default = map.withDefault { null } + private val relationOptionText : String? by default + private val relationOptionColor : String? by default + + val id: Id by default + val title: String = relationOptionText.orEmpty() + val color: String = relationOptionColor.orEmpty() + } } \ No newline at end of file diff --git a/core-models/src/main/java/com/anytypeio/anytype/core_models/Relation.kt b/core-models/src/main/java/com/anytypeio/anytype/core_models/Relation.kt index 17ecdac19..70537044a 100644 --- a/core-models/src/main/java/com/anytypeio/anytype/core_models/Relation.kt +++ b/core-models/src/main/java/com/anytypeio/anytype/core_models/Relation.kt @@ -7,35 +7,46 @@ package com.anytypeio.anytype.core_models * @property [isReadOnly] editable by user or not * @property [isHidden] whether this type is internal (not displayed to user) */ -@Deprecated("Will be deprecated. Relations will be treated as objects") data class Relation( + @Deprecated("Will be deprecated. Relations will be treated as objects") val key: String, + @Deprecated("Will be deprecated. Relations will be treated as objects") val name: String, + @Deprecated("Will be deprecated. Relations will be treated as objects") val format: Format, + @Deprecated("Will be deprecated. Relations will be treated as objects") val source: Source, + @Deprecated("Will be deprecated. Relations will be treated as objects") val isHidden: Boolean = false, + @Deprecated("Will be deprecated. Relations will be treated as objects") val isReadOnly: Boolean = false, + @Deprecated("Will be deprecated. Relations will be treated as objects") val isMulti: Boolean = false, + @Deprecated("Will be deprecated. Relations will be treated as objects") val selections: List