From 204076de575173143ed8032b47767929fa74bdf9 Mon Sep 17 00:00:00 2001 From: Sergey Boishtyan Date: Fri, 8 Jul 2022 18:26:47 +0300 Subject: [PATCH] Sets | Enhancement | Add "Hide icon" icon option to GridView (#2404) --- .../anytype/di/common/ComponentManager.kt | 8 ++-- .../anytype/di/feature/ObjectSetDI.kt | 4 +- ...lationListDi.kt => ObjectSetSettingsDi.kt} | 20 ++++----- .../anytype/ui/sets/ObjectSetFragment.kt | 14 +++---- ...agment.kt => ObjectSetSettingsFragment.kt} | 37 +++++++---------- .../layout/fragment_doc_menu_bottom_sheet.xml | 2 +- .../features/dataview/ViewerGridAdapter.kt | 29 +++++++++---- .../dataview/ViewerGridHeaderAdapter.kt | 25 ----------- .../widget_data_view_customize_view.xml | 14 +++---- .../features/dataview/GridDiffUtilTest.kt | 41 +++++++++++++++++++ .../presentation/mapper/MapperExtension.kt | 7 +--- .../relations/ObjectSetRenderMapper.kt | 2 +- ...Model.kt => ObjectSetSettingsViewModel.kt} | 17 ++++---- .../presentation/sets/ObjectSetCommand.kt | 2 +- .../presentation/sets/ObjectSetViewModel.kt | 6 +-- .../presentation/sets/SetsExtension.kt | 6 +-- .../anytype/presentation/sets/model/Viewer.kt | 3 +- .../presentation/sets/TagAndStatusTests.kt | 14 +++++-- .../sets/main/ObjectSetRestrictionsTest.kt | 2 +- .../main/ObjectSetSettingActiveViewerTest.kt | 9 ++-- .../sets/main/ObjectSetZeroViewTest.kt | 2 +- 21 files changed, 148 insertions(+), 116 deletions(-) rename app/src/main/java/com/anytypeio/anytype/di/feature/{ViewerRelationListDi.kt => ObjectSetSettingsDi.kt} (75%) rename app/src/main/java/com/anytypeio/anytype/ui/sets/modals/{ViewerRelationsFragment.kt => ObjectSetSettingsFragment.kt} (87%) create mode 100644 core-ui/src/test/java/com/anytypeio/anytype/core_ui/features/dataview/GridDiffUtilTest.kt rename presentation/src/main/java/com/anytypeio/anytype/presentation/relations/{ViewerRelationsViewModel.kt => ObjectSetSettingsViewModel.kt} (95%) 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 a3137023c1..18704558e6 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 @@ -43,6 +43,7 @@ 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.ObjectSetRecordModule +import com.anytypeio.anytype.di.feature.ObjectSetSettingsModule import com.anytypeio.anytype.di.feature.ObjectTypeChangeModule import com.anytypeio.anytype.di.feature.OtherSettingsModule import com.anytypeio.anytype.di.feature.PageNavigationModule @@ -59,7 +60,6 @@ import com.anytypeio.anytype.di.feature.StartLoginModule import com.anytypeio.anytype.di.feature.TextBlockIconPickerModule import com.anytypeio.anytype.di.feature.ViewerCustomizeModule import com.anytypeio.anytype.di.feature.ViewerFilterModule -import com.anytypeio.anytype.di.feature.ViewerRelationsModule import com.anytypeio.anytype.di.feature.ViewerSortByModule import com.anytypeio.anytype.di.feature.ViewerSortModule import com.anytypeio.anytype.di.feature.auth.DeletedAccountModule @@ -515,11 +515,11 @@ class ComponentManager( .build() } - val viewerRelationsComponent = DependentComponentMap { ctx -> + val objectsSetSettingsComponent = DependentComponentMap { ctx -> objectSetComponent .get(ctx) - .viewerRelationsComponent() - .module(ViewerRelationsModule) + .objectSetSettingsComponent() + .module(ObjectSetSettingsModule) .build() } 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 d14c55baf6..2218d338ee 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 @@ -34,6 +34,7 @@ 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.page.CloseBlock +import com.anytypeio.anytype.domain.page.CreateNewObject import com.anytypeio.anytype.domain.page.CreatePage import com.anytypeio.anytype.domain.relations.AddFileToRecord import com.anytypeio.anytype.domain.relations.DeleteRelationFromDataView @@ -45,7 +46,6 @@ import com.anytypeio.anytype.domain.unsplash.DownloadUnsplashImage import com.anytypeio.anytype.domain.unsplash.UnsplashRepository 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.presentation.relations.providers.DataViewObjectRelationProvider import com.anytypeio.anytype.presentation.relations.providers.DataViewObjectValueProvider import com.anytypeio.anytype.presentation.relations.providers.ObjectDetailProvider @@ -85,7 +85,7 @@ interface ObjectSetSubComponent { fun editDataViewViewerComponent(): EditDataViewViewerSubComponent.Builder fun objectRelationValueComponent(): ObjectSetObjectRelationValueSubComponent.Builder fun manageViewerComponent(): ManageViewerSubComponent.Builder - fun viewerRelationsComponent(): ViewerRelationsSubComponent.Builder + fun objectSetSettingsComponent(): ObjectSetSettingsSubComponent.Builder fun viewerCardSizeSelectComponent(): ViewerCardSizeSelectSubcomponent.Builder fun viewerImagePreviewSelectComponent(): ViewerImagePreviewSelectSubcomponent.Builder fun relationAddToDataViewComponent() : RelationAddToDataViewSubComponent.Builder diff --git a/app/src/main/java/com/anytypeio/anytype/di/feature/ViewerRelationListDi.kt b/app/src/main/java/com/anytypeio/anytype/di/feature/ObjectSetSettingsDi.kt similarity index 75% rename from app/src/main/java/com/anytypeio/anytype/di/feature/ViewerRelationListDi.kt rename to app/src/main/java/com/anytypeio/anytype/di/feature/ObjectSetSettingsDi.kt index f7d23dd47f..00ed9f48ff 100644 --- a/app/src/main/java/com/anytypeio/anytype/di/feature/ViewerRelationListDi.kt +++ b/app/src/main/java/com/anytypeio/anytype/di/feature/ObjectSetSettingsDi.kt @@ -7,35 +7,35 @@ 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.relations.DeleteRelationFromDataView -import com.anytypeio.anytype.presentation.relations.ViewerRelationsViewModel +import com.anytypeio.anytype.presentation.relations.ObjectSetSettingsViewModel import com.anytypeio.anytype.presentation.sets.ObjectSet import com.anytypeio.anytype.presentation.sets.ObjectSetSession import com.anytypeio.anytype.presentation.util.Dispatcher -import com.anytypeio.anytype.ui.sets.modals.ViewerRelationsFragment +import com.anytypeio.anytype.ui.sets.modals.ObjectSetSettingsFragment import dagger.Module import dagger.Provides import dagger.Subcomponent import kotlinx.coroutines.flow.StateFlow -@Subcomponent(modules = [ViewerRelationsModule::class]) +@Subcomponent(modules = [ObjectSetSettingsModule::class]) @PerModal -interface ViewerRelationsSubComponent { +interface ObjectSetSettingsSubComponent { @Subcomponent.Builder interface Builder { - fun module(module: ViewerRelationsModule): Builder - fun build(): ViewerRelationsSubComponent + fun module(module: ObjectSetSettingsModule): Builder + fun build(): ObjectSetSettingsSubComponent } - fun inject(fragment: ViewerRelationsFragment) + fun inject(fragment: ObjectSetSettingsFragment) } @Module -object ViewerRelationsModule { +object ObjectSetSettingsModule { @JvmStatic @Provides @PerModal - fun provideViewerRelationsListViewModelFactory( + fun provideViewModelFactory( state: StateFlow, session: ObjectSetSession, dispatcher: Dispatcher, @@ -43,7 +43,7 @@ object ViewerRelationsModule { updateDataViewViewer: UpdateDataViewViewer, deleteRelationFromDataView: DeleteRelationFromDataView, analytics: Analytics - ): ViewerRelationsViewModel.Factory = ViewerRelationsViewModel.Factory( + ): ObjectSetSettingsViewModel.Factory = ObjectSetSettingsViewModel.Factory( state = state, session = session, dispatcher = dispatcher, 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 cc091fd3f5..841092c38c 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 @@ -76,8 +76,8 @@ import com.anytypeio.anytype.ui.relations.RelationValueBaseFragment 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.ViewerBottomSheetRootFragment -import com.anytypeio.anytype.ui.sets.modals.ViewerRelationsFragment import com.anytypeio.anytype.ui.sets.modals.sort.ViewerSortFragment import com.bumptech.glide.Glide import kotlinx.coroutines.flow.filterNotNull @@ -170,7 +170,7 @@ open class ObjectSetFragment : setupWindowInsetAnimation() - setupGridAdapters(view) + setupGridAdapters() title.clearFocus() topToolbarTitle.alpha = 0f binding.root.setTransitionListener(transitionListener) @@ -193,9 +193,9 @@ open class ObjectSetFragment : vm.onViewerFiltersClicked() } subscribe( - binding.bottomPanel.root.findViewById(R.id.btnRelations).clicks() + binding.bottomPanel.root.findViewById(R.id.btnSettings).clicks() ) { - vm.onViewerRelationsClicked() + vm.onViewerSettingsClicked() } subscribe(binding.bottomPanel.root.findViewById(R.id.btnSort).clicks()) { vm.onViewerSortsClicked() @@ -249,7 +249,7 @@ open class ObjectSetFragment : } } - private fun setupGridAdapters(view: View) { + private fun setupGridAdapters() { val horizontalDivider = drawable(R.drawable.divider_dv_horizontal) val verticalDivider = drawable(R.drawable.divider_dv_grid) @@ -589,8 +589,8 @@ open class ObjectSetFragment : val fr = ManageViewerFragment.new(ctx = command.ctx, dataview = command.dataview) fr.show(childFragmentManager, EMPTY_TAG) } - is ObjectSetCommand.Modal.ModifyViewerRelationOrder -> { - val fr = ViewerRelationsFragment.new( + is ObjectSetCommand.Modal.OpenSettings -> { + val fr = ObjectSetSettingsFragment.new( ctx = command.ctx, dv = command.dv, viewer = command.viewer diff --git a/app/src/main/java/com/anytypeio/anytype/ui/sets/modals/ViewerRelationsFragment.kt b/app/src/main/java/com/anytypeio/anytype/ui/sets/modals/ObjectSetSettingsFragment.kt similarity index 87% rename from app/src/main/java/com/anytypeio/anytype/ui/sets/modals/ViewerRelationsFragment.kt rename to app/src/main/java/com/anytypeio/anytype/ui/sets/modals/ObjectSetSettingsFragment.kt index baf65b99b8..6051a19d27 100644 --- a/app/src/main/java/com/anytypeio/anytype/ui/sets/modals/ViewerRelationsFragment.kt +++ b/app/src/main/java/com/anytypeio/anytype/ui/sets/modals/ObjectSetSettingsFragment.kt @@ -19,24 +19,27 @@ import com.anytypeio.anytype.core_ui.features.dataview.ViewerRelationsAdapter import com.anytypeio.anytype.core_ui.layout.DividerVerticalItemDecoration import com.anytypeio.anytype.core_ui.reactive.clicks import com.anytypeio.anytype.core_ui.tools.DefaultDragAndDropBehavior -import com.anytypeio.anytype.core_utils.ext.* +import com.anytypeio.anytype.core_utils.ext.arg +import com.anytypeio.anytype.core_utils.ext.invisible +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.BaseBottomSheetFragment import com.anytypeio.anytype.core_utils.ui.OnStartDragListener import com.anytypeio.anytype.databinding.FragmentViewerRelationsListBinding import com.anytypeio.anytype.di.common.componentManager -import com.anytypeio.anytype.presentation.relations.ViewerRelationsViewModel -import com.anytypeio.anytype.presentation.sets.model.SimpleRelationView +import com.anytypeio.anytype.presentation.relations.ObjectSetSettingsViewModel import com.anytypeio.anytype.ui.relations.RelationAddToDataViewFragment import com.anytypeio.anytype.ui.sets.modals.viewer.ViewerCardSizeSelectFragment import com.anytypeio.anytype.ui.sets.modals.viewer.ViewerImagePreviewSelectFragment import javax.inject.Inject -class ViewerRelationsFragment : BaseBottomSheetFragment(), +class ObjectSetSettingsFragment : BaseBottomSheetFragment(), OnStartDragListener { @Inject - lateinit var factory: ViewerRelationsViewModel.Factory - private val vm: ViewerRelationsViewModel by viewModels { factory } + lateinit var factory: ObjectSetSettingsViewModel.Factory + private val vm: ObjectSetSettingsViewModel by viewModels { factory } private val ctx get() = arg(CTX_KEY) private val viewer get() = arg(VIEWER_KEY) @@ -151,9 +154,9 @@ class ViewerRelationsFragment : BaseBottomSheetFragment { + ObjectSetSettingsViewModel.ScreenState.LIST -> { with(binding) { recycler.apply { dndItemTouchHelper.attachToRecyclerView(null) @@ -168,7 +171,7 @@ class ViewerRelationsFragment : BaseBottomSheetFragment { + ObjectSetSettingsViewModel.ScreenState.EDIT -> { with(binding) { recycler.apply { dndItemTouchHelper.attachToRecyclerView(this) @@ -186,26 +189,16 @@ class ViewerRelationsFragment : BaseBottomSheetFragment { - if (row.image != null || row.emoji != null) { + if ((row.image != null || row.emoji != null) && row.showIcon) { binding.objectIcon.visible() if (row.image != null) { binding.objectIcon.setRectangularImage(row.image) @@ -130,15 +130,23 @@ class ViewerGridAdapter( } } ObjectType.Layout.PROFILE -> { - binding.objectIcon.visible() - if (row.image != null) { - binding.objectIcon.setCircularImage(row.image) + if (row.showIcon) { + binding.objectIcon.visible() + if (row.image != null) { + binding.objectIcon.setCircularImage(row.image) + } else { + binding.objectIcon.setProfileInitials(row.name.orEmpty()) + } } else { - binding.objectIcon.setProfileInitials(row.name.orEmpty()) + binding.objectIcon.gone() } } else -> { - binding.objectIcon.gone() + if (row.showIcon) { + binding.objectIcon.visible() + } else { + binding.objectIcon.gone() + } } } binding.tvTitle.text = row.name @@ -163,10 +171,12 @@ class ViewerGridAdapter( override fun getChangePayload( oldItem: Viewer.GridView.Row, newItem: Viewer.GridView.Row - ): Any { + ): List? { val payload = mutableListOf() if (isHeaderChanged(oldItem, newItem)) payload.add(OBJECT_HEADER_CHANGED) - return payload + return if (payload.isEmpty()) { + null + } else payload } private fun isHeaderChanged( @@ -176,7 +186,8 @@ class ViewerGridAdapter( || oldItem.image != newItem.image || oldItem.name != newItem.name || oldItem.isChecked != newItem.isChecked - || oldItem.layout != newItem.layout) + || oldItem.layout != newItem.layout + || oldItem.showIcon != newItem.showIcon) const val OBJECT_HEADER_CHANGED = 0 } diff --git a/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/dataview/ViewerGridHeaderAdapter.kt b/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/dataview/ViewerGridHeaderAdapter.kt index ab18e04689..26ecb171a0 100644 --- a/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/dataview/ViewerGridHeaderAdapter.kt +++ b/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/dataview/ViewerGridHeaderAdapter.kt @@ -7,7 +7,6 @@ import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView import com.anytypeio.anytype.core_ui.databinding.ItemGridColumnHeaderBinding -import com.anytypeio.anytype.core_ui.databinding.ItemGridColumnHeaderPlusBinding import com.anytypeio.anytype.presentation.sets.model.ColumnView class ViewerGridHeaderAdapter() : @@ -24,15 +23,6 @@ class ViewerGridHeaderAdapter() : override fun onBindViewHolder(holder: HeaderViewHolder, position: Int) { if (holder is HeaderViewHolder.DefaultHolder) holder.bind(getItem(position)) } - -// override fun getItemViewType(position: Int) = if (position == super.getItemCount()) { -// PLUS_TYPE -// } else { -// HEADER_TYPE -// } - -// override fun getItemCount(): Int = if (super.getItemCount() == 0) 0 else super.getItemCount() + 1 - sealed class HeaderViewHolder(view: View) : RecyclerView.ViewHolder(view) { class DefaultHolder(val binding: ItemGridColumnHeaderBinding) : HeaderViewHolder(binding.root) { fun bind(item: ColumnView) { @@ -51,20 +41,6 @@ class ViewerGridHeaderAdapter() : ) } } - - class PlusHolder(val binding: ItemGridColumnHeaderPlusBinding) : HeaderViewHolder(binding.root) { - companion object { - fun create( - parent: ViewGroup - ): PlusHolder = PlusHolder( - ItemGridColumnHeaderPlusBinding.inflate( - LayoutInflater.from(parent.context), - parent, - false - ) - ) - } - } } object ColumnHeaderDiffCallback : DiffUtil.ItemCallback() { @@ -81,6 +57,5 @@ class ViewerGridHeaderAdapter() : companion object { const val HEADER_TYPE = 0 - const val PLUS_TYPE = 1 } } \ No newline at end of file diff --git a/core-ui/src/main/res/layout/widget_data_view_customize_view.xml b/core-ui/src/main/res/layout/widget_data_view_customize_view.xml index 2a253371c9..1f9120c329 100644 --- a/core-ui/src/main/res/layout/widget_data_view_customize_view.xml +++ b/core-ui/src/main/res/layout/widget_data_view_customize_view.xml @@ -48,7 +48,7 @@ android:layout_height="52dp" android:layout_marginTop="12dp" android:background="@drawable/rect_data_view_customize_view_button" - app:layout_constraintEnd_toStartOf="@+id/btnRelations" + app:layout_constraintEnd_toStartOf="@+id/btnSettings" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/dragger"> @@ -62,7 +62,7 @@ + app:layout_constraintEnd_toEndOf="@+id/btnSettings" + app:layout_constraintStart_toStartOf="@+id/btnSettings" + app:layout_constraintTop_toBottomOf="@+id/btnSettings" /> >(payload) + + assertContains(payloadCasted, ViewerGridAdapter.GridDiffUtil.OBJECT_HEADER_CHANGED) + } + + @Test + fun `nothing changed - payloads is empty`() { + val old = Viewer.GridView.Row( + id = MockDataFactory.randomUuid(), + showIcon = false + ) + val new = old.copy() + val payload = ViewerGridAdapter.GridDiffUtil.getChangePayload( + old, new + ) + assertNull(payload) + } +} \ No newline at end of file diff --git a/presentation/src/main/java/com/anytypeio/anytype/presentation/mapper/MapperExtension.kt b/presentation/src/main/java/com/anytypeio/anytype/presentation/mapper/MapperExtension.kt index 8425a31d58..8c2a7006fc 100644 --- a/presentation/src/main/java/com/anytypeio/anytype/presentation/mapper/MapperExtension.kt +++ b/presentation/src/main/java/com/anytypeio/anytype/presentation/mapper/MapperExtension.kt @@ -612,24 +612,21 @@ fun Viewer.Filter.Condition.toDomain(): DVFilterCondition = when (this) { is Viewer.Filter.Condition.Text.None -> DVFilterCondition.NONE } -fun List>.filterRecordsBy(filterBy: String): List> = - filter { it.containsKey(filterBy) } - fun List>.toGridRecordRows( + showIcon: Boolean, columns: List, relations: List, - types: List, details: Map, builder: UrlBuilder ): List { val rows = mutableListOf() forEach { record -> val row = columns.buildGridRow( + showIcon = showIcon, record = record, relations = relations, details = details, builder = builder, - objectTypes = types ) rows.add(row) } diff --git a/presentation/src/main/java/com/anytypeio/anytype/presentation/relations/ObjectSetRenderMapper.kt b/presentation/src/main/java/com/anytypeio/anytype/presentation/relations/ObjectSetRenderMapper.kt index ac901d876e..1cba8509c8 100644 --- a/presentation/src/main/java/com/anytypeio/anytype/presentation/relations/ObjectSetRenderMapper.kt +++ b/presentation/src/main/java/com/anytypeio/anytype/presentation/relations/ObjectSetRenderMapper.kt @@ -130,11 +130,11 @@ fun ObjectSet.render( viewerDb[viewer.id]?.let { data -> rows.addAll( data.records.toGridRecordRows( + showIcon = !viewer.hideIcon, columns = columns, relations = relations, details = details, builder = builder, - types = objectTypes ) ) } diff --git a/presentation/src/main/java/com/anytypeio/anytype/presentation/relations/ViewerRelationsViewModel.kt b/presentation/src/main/java/com/anytypeio/anytype/presentation/relations/ObjectSetSettingsViewModel.kt similarity index 95% rename from presentation/src/main/java/com/anytypeio/anytype/presentation/relations/ViewerRelationsViewModel.kt rename to presentation/src/main/java/com/anytypeio/anytype/presentation/relations/ObjectSetSettingsViewModel.kt index 35a2880abb..36414b2a95 100644 --- a/presentation/src/main/java/com/anytypeio/anytype/presentation/relations/ViewerRelationsViewModel.kt +++ b/presentation/src/main/java/com/anytypeio/anytype/presentation/relations/ObjectSetSettingsViewModel.kt @@ -4,14 +4,17 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewModelScope import com.anytypeio.anytype.analytics.base.Analytics -import com.anytypeio.anytype.core_models.* +import com.anytypeio.anytype.core_models.Block +import com.anytypeio.anytype.core_models.DV +import com.anytypeio.anytype.core_models.Id +import com.anytypeio.anytype.core_models.Payload +import com.anytypeio.anytype.core_models.Relations import com.anytypeio.anytype.core_models.ext.content import com.anytypeio.anytype.domain.dataview.interactor.ModifyDataViewViewerRelationOrder import com.anytypeio.anytype.domain.dataview.interactor.UpdateDataViewViewer import com.anytypeio.anytype.domain.relations.DeleteRelationFromDataView import com.anytypeio.anytype.presentation.common.BaseListViewModel import com.anytypeio.anytype.presentation.extension.sendAnalyticsRelationDeleteEvent -import com.anytypeio.anytype.presentation.extension.sendAnalyticsRelationValueEvent import com.anytypeio.anytype.presentation.sets.ObjectSet import com.anytypeio.anytype.presentation.sets.ObjectSetSession import com.anytypeio.anytype.presentation.sets.filterHiddenRelations @@ -21,12 +24,11 @@ import com.anytypeio.anytype.presentation.sets.viewerById import com.anytypeio.anytype.presentation.util.Dispatcher import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow -import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.filter import kotlinx.coroutines.launch import timber.log.Timber -class ViewerRelationsViewModel( +class ObjectSetSettingsViewModel( private val objectSetState: StateFlow, private val session: ObjectSetSession, private val dispatcher: Dispatcher, @@ -83,7 +85,8 @@ class ViewerRelationsViewModel( result.add(ViewerRelationListView.Setting.Toggle.FitImage(toggled = viewer.coverFit)) } Block.Content.DataView.Viewer.Type.GRID -> { - // TODO in the next PR + result.add(ViewerRelationListView.Section.Settings) + result.add(ViewerRelationListView.Setting.Toggle.HideIcon(toggled = viewer.hideIcon)) } Block.Content.DataView.Viewer.Type.LIST -> { result.add(ViewerRelationListView.Section.Settings) @@ -147,7 +150,7 @@ class ViewerRelationsViewModel( ) ).process( success = { dispatcher.send(it) }, - failure = { Timber.e("Error while updating") } + failure = { Timber.w("Error while updating") } ) } } @@ -267,7 +270,7 @@ class ViewerRelationsViewModel( ) : ViewModelProvider.Factory { @Suppress("UNCHECKED_CAST") override fun create(modelClass: Class): T { - return ViewerRelationsViewModel( + return ObjectSetSettingsViewModel( objectSetState = state, session = session, dispatcher = dispatcher, diff --git a/presentation/src/main/java/com/anytypeio/anytype/presentation/sets/ObjectSetCommand.kt b/presentation/src/main/java/com/anytypeio/anytype/presentation/sets/ObjectSetCommand.kt index 51f8efad1f..caf834417a 100644 --- a/presentation/src/main/java/com/anytypeio/anytype/presentation/sets/ObjectSetCommand.kt +++ b/presentation/src/main/java/com/anytypeio/anytype/presentation/sets/ObjectSetCommand.kt @@ -26,7 +26,7 @@ sealed class ObjectSetCommand { data class ManageViewer(val ctx: Id, val dataview: Id) : Modal() - data class ModifyViewerRelationOrder( + data class OpenSettings( val ctx: Id, val dv: Id, val viewer: Id diff --git a/presentation/src/main/java/com/anytypeio/anytype/presentation/sets/ObjectSetViewModel.kt b/presentation/src/main/java/com/anytypeio/anytype/presentation/sets/ObjectSetViewModel.kt index 082d71bddd..3faad2636f 100644 --- a/presentation/src/main/java/com/anytypeio/anytype/presentation/sets/ObjectSetViewModel.kt +++ b/presentation/src/main/java/com/anytypeio/anytype/presentation/sets/ObjectSetViewModel.kt @@ -34,13 +34,13 @@ import com.anytypeio.anytype.domain.error.Error import com.anytypeio.anytype.domain.event.interactor.InterceptEvents import com.anytypeio.anytype.domain.misc.UrlBuilder import com.anytypeio.anytype.domain.page.CloseBlock +import com.anytypeio.anytype.domain.page.CreateNewObject import com.anytypeio.anytype.domain.sets.OpenObjectSet import com.anytypeio.anytype.domain.status.InterceptThreadStatus import com.anytypeio.anytype.domain.templates.GetTemplates import com.anytypeio.anytype.domain.unsplash.DownloadUnsplashImage 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.presentation.editor.editor.Proxy import com.anytypeio.anytype.presentation.editor.editor.model.BlockView import com.anytypeio.anytype.presentation.editor.model.TextUpdate @@ -891,7 +891,7 @@ class ObjectSetViewModel( } } - fun onViewerRelationsClicked() { + fun onViewerSettingsClicked() { Timber.d("onViewerRelationsClicked, ") if (isRestrictionPresent(DataViewRestriction.RELATION)) { toast(NOT_ALLOWED) @@ -904,7 +904,7 @@ class ObjectSetViewModel( val viewer = dv.viewers.find { it.id == session.currentViewerId } ?: dv.viewers.first() dispatch( - ObjectSetCommand.Modal.ModifyViewerRelationOrder( + ObjectSetCommand.Modal.OpenSettings( ctx = context, dv = block.id, viewer = viewer.id diff --git a/presentation/src/main/java/com/anytypeio/anytype/presentation/sets/SetsExtension.kt b/presentation/src/main/java/com/anytypeio/anytype/presentation/sets/SetsExtension.kt index c46e4ed1a8..f64d756df4 100644 --- a/presentation/src/main/java/com/anytypeio/anytype/presentation/sets/SetsExtension.kt +++ b/presentation/src/main/java/com/anytypeio/anytype/presentation/sets/SetsExtension.kt @@ -2,7 +2,6 @@ package com.anytypeio.anytype.presentation.sets 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.ObjectWrapper import com.anytypeio.anytype.core_models.Relation import com.anytypeio.anytype.core_models.Relations @@ -23,9 +22,9 @@ import com.anytypeio.anytype.presentation.sets.model.TagView import com.anytypeio.anytype.presentation.sets.model.Viewer fun List.buildGridRow( + showIcon: Boolean, record: Map, relations: List, - objectTypes: List = emptyList(), details: Map, builder: UrlBuilder ): Viewer.GridView.Row { @@ -180,7 +179,8 @@ fun List.buildGridRow( image = image?.let { if (it.isEmpty()) null else builder.thumbnail(it) }, cells = cells, layout = layout, - isChecked = done + isChecked = done, + showIcon = showIcon, ) } diff --git a/presentation/src/main/java/com/anytypeio/anytype/presentation/sets/model/Viewer.kt b/presentation/src/main/java/com/anytypeio/anytype/presentation/sets/model/Viewer.kt index 858f49f5f9..bdc83dd3d8 100644 --- a/presentation/src/main/java/com/anytypeio/anytype/presentation/sets/model/Viewer.kt +++ b/presentation/src/main/java/com/anytypeio/anytype/presentation/sets/model/Viewer.kt @@ -39,7 +39,8 @@ sealed class Viewer { val type: String? = null, val isChecked: Boolean? = null, val cells: List = emptyList(), - val layout: ObjectType.Layout? = null + val layout: ObjectType.Layout? = null, + val showIcon: Boolean, ) companion object { diff --git a/presentation/src/test/java/com/anytypeio/anytype/presentation/sets/TagAndStatusTests.kt b/presentation/src/test/java/com/anytypeio/anytype/presentation/sets/TagAndStatusTests.kt index 57b7f59c03..f8db03d7aa 100644 --- a/presentation/src/test/java/com/anytypeio/anytype/presentation/sets/TagAndStatusTests.kt +++ b/presentation/src/test/java/com/anytypeio/anytype/presentation/sets/TagAndStatusTests.kt @@ -6,7 +6,11 @@ import com.anytypeio.anytype.domain.config.Gateway import com.anytypeio.anytype.domain.misc.UrlBuilder import com.anytypeio.anytype.presentation.mapper.toViewerColumns import com.anytypeio.anytype.presentation.relations.ObjectSetConfig -import com.anytypeio.anytype.presentation.sets.model.* +import com.anytypeio.anytype.presentation.sets.model.CellView +import com.anytypeio.anytype.presentation.sets.model.ColumnView +import com.anytypeio.anytype.presentation.sets.model.StatusView +import com.anytypeio.anytype.presentation.sets.model.TagView +import com.anytypeio.anytype.presentation.sets.model.Viewer import com.anytypeio.anytype.test_utils.MockDataFactory import org.junit.Before import org.junit.Test @@ -133,13 +137,15 @@ class TagAndStatusTests { record = records, relations = dataViewRelations, builder = UrlBuilder(gateway), - details = emptyMap() + details = emptyMap(), + showIcon = false, ) val expected = Viewer.GridView.Row( id = recordId, name = "", type = "Type111", + showIcon = false, cells = listOf( CellView.Description( id = recordId, @@ -276,13 +282,15 @@ class TagAndStatusTests { record = records, relations = dataViewRelations, builder = UrlBuilder(gateway), - details = emptyMap() + details = emptyMap(), + showIcon = false, ) val expected = Viewer.GridView.Row( id = recordId, name = "", type = "Type111", + showIcon = false, cells = listOf( CellView.Description( id = recordId, diff --git a/presentation/src/test/java/com/anytypeio/anytype/presentation/sets/main/ObjectSetRestrictionsTest.kt b/presentation/src/test/java/com/anytypeio/anytype/presentation/sets/main/ObjectSetRestrictionsTest.kt index 02f3b8cc1c..ea5250a8df 100644 --- a/presentation/src/test/java/com/anytypeio/anytype/presentation/sets/main/ObjectSetRestrictionsTest.kt +++ b/presentation/src/test/java/com/anytypeio/anytype/presentation/sets/main/ObjectSetRestrictionsTest.kt @@ -208,7 +208,7 @@ class ObjectSetRestrictionsTest : ObjectSetViewModelTestSetup() { vm.onStart(root) - vm.onViewerRelationsClicked() + vm.onViewerSettingsClicked() val result = vm.toasts.stream().first() diff --git a/presentation/src/test/java/com/anytypeio/anytype/presentation/sets/main/ObjectSetSettingActiveViewerTest.kt b/presentation/src/test/java/com/anytypeio/anytype/presentation/sets/main/ObjectSetSettingActiveViewerTest.kt index 0a17fa49ae..0ac8b8e4b6 100644 --- a/presentation/src/test/java/com/anytypeio/anytype/presentation/sets/main/ObjectSetSettingActiveViewerTest.kt +++ b/presentation/src/test/java/com/anytypeio/anytype/presentation/sets/main/ObjectSetSettingActiveViewerTest.kt @@ -19,6 +19,7 @@ import org.mockito.MockitoAnnotations import org.mockito.kotlin.doReturn import org.mockito.kotlin.stub import kotlin.test.assertEquals +import kotlin.test.assertIs import kotlin.test.assertTrue class ObjectSetSettingActiveViewerTest : ObjectSetViewModelTestSetup() { @@ -149,6 +150,7 @@ class ObjectSetSettingActiveViewerTest : ObjectSetViewModelTestSetup() { emoji = null, image = null, type = doc.firstRecordType, + showIcon = true, cells = listOf( CellView.Description( id = doc.firstRecordId, @@ -168,6 +170,7 @@ class ObjectSetSettingActiveViewerTest : ObjectSetViewModelTestSetup() { emoji = null, image = null, type = doc.secondRecordType, + showIcon = true, cells = listOf( CellView.Description( id = doc.secondRecordId, @@ -183,9 +186,7 @@ class ObjectSetSettingActiveViewerTest : ObjectSetViewModelTestSetup() { ) ) - assertTrue { valueBefore is Viewer.GridView } - - check(valueBefore is Viewer.GridView) + assertIs(valueBefore) assertEquals( expected = expectedColumnsBefore, @@ -215,6 +216,7 @@ class ObjectSetSettingActiveViewerTest : ObjectSetViewModelTestSetup() { emoji = null, image = null, type = doc.secondRecordType, + showIcon = true, cells = listOf( CellView.Description( id = doc.secondRecordId, @@ -229,6 +231,7 @@ class ObjectSetSettingActiveViewerTest : ObjectSetViewModelTestSetup() { emoji = null, image = null, type = doc.firstRecordType, + showIcon = true, cells = listOf( CellView.Description( id = doc.firstRecordId, diff --git a/presentation/src/test/java/com/anytypeio/anytype/presentation/sets/main/ObjectSetZeroViewTest.kt b/presentation/src/test/java/com/anytypeio/anytype/presentation/sets/main/ObjectSetZeroViewTest.kt index 6dc9091015..0d5603c405 100644 --- a/presentation/src/test/java/com/anytypeio/anytype/presentation/sets/main/ObjectSetZeroViewTest.kt +++ b/presentation/src/test/java/com/anytypeio/anytype/presentation/sets/main/ObjectSetZeroViewTest.kt @@ -133,6 +133,6 @@ class ObjectSetZeroViewTest : ObjectSetViewModelTestSetup() { vm.onViewerCustomizeButtonClicked() vm.onViewerSortsClicked() vm.onViewerFiltersClicked() - vm.onViewerRelationsClicked() + vm.onViewerSettingsClicked() } } \ No newline at end of file