1
0
Fork 0
mirror of https://github.com/anyproto/anytype-kotlin.git synced 2025-06-10 10:00:44 +09:00

DROID-939 Sets | Fix | Cover and icon are not displayed in sets (#2914)

* DROID-939 legacy

* DROID-939 legacy

* DROID-939 update cards design

* DROID-939 update mapping

* DROID-939 update view

* DROID-939 update cards design

* DROID-939 update gallery view widget

* DROID-939 fix model and mapping

* DROID-939 hasCover param fix

* DROID-939 refactoring

* DROID-939 image preview menu item fix

* DROID-939 seting background fix
This commit is contained in:
Konstantin Ivanov 2023-02-13 12:50:43 +01:00 committed by uburoiubu
parent fe83579efb
commit 066bf654e1
24 changed files with 479 additions and 679 deletions

View file

@ -100,12 +100,12 @@ suspend fun DVViewer.render(
viewer = Viewer.GalleryView(
id = id,
items = buildGalleryViews(
objects = objects,
objectIds = objects,
details = details,
relations = dataViewRelations,
coverImageHashProvider = coverImageHashProvider,
urlBuilder = builder,
store = store
objectStore = store
),
title = name,
largeCards = cardSize != DVViewerCardSize.SMALL

View file

@ -60,26 +60,20 @@ class ObjectSetSettingsViewModel(
}
}
when (viewer.coverRelationKey) {
null -> {
result.add(ViewerRelationListView.Setting.ImagePreview.None)
}
Relations.PAGE_COVER -> {
result.add(ViewerRelationListView.Setting.ImagePreview.Cover)
}
val coverRelationKey = viewer.coverRelationKey
result.add(when {
coverRelationKey.isNullOrBlank() -> ViewerRelationListView.Setting.ImagePreview.None
coverRelationKey == Relations.PAGE_COVER -> ViewerRelationListView.Setting.ImagePreview.Cover
else -> {
val dv = objectSet.dataview.content<DV>()
val preview =
dv.relations.find { it.key == viewer.coverRelationKey }
val preview = dv.relations.find { it.key == coverRelationKey }
if (preview != null) {
result.add(
ViewerRelationListView.Setting.ImagePreview.Custom(
preview.name
)
)
ViewerRelationListView.Setting.ImagePreview.Custom(preview.name)
} else {
ViewerRelationListView.Setting.ImagePreview.None
}
}
}
})
result.add(ViewerRelationListView.Setting.Toggle.HideIcon(toggled = viewer.hideIcon))
result.add(ViewerRelationListView.Setting.Toggle.FitImage(toggled = viewer.coverFit))

View file

@ -3,7 +3,7 @@ package com.anytypeio.anytype.presentation.sets
import com.anytypeio.anytype.core_models.Block
import com.anytypeio.anytype.core_models.CoverType
import com.anytypeio.anytype.core_models.DVViewer
import com.anytypeio.anytype.core_models.DVViewerCardSize
import com.anytypeio.anytype.core_models.DVViewerRelation
import com.anytypeio.anytype.core_models.Id
import com.anytypeio.anytype.core_models.ObjectTypeIds.IMAGE
import com.anytypeio.anytype.core_models.ObjectWrapper
@ -25,13 +25,14 @@ import com.anytypeio.anytype.presentation.sets.model.Viewer
suspend fun DVViewer.buildGalleryViews(
objects: List<Id>,
objectIds: List<Id>,
relations: List<ObjectWrapper.Relation>,
details: Map<Id, Block.Fields>,
coverImageHashProvider: CoverImageHashProvider,
urlBuilder: UrlBuilder,
store: ObjectStore
objectStore: ObjectStore
): List<Viewer.GalleryView.Item> {
val filteredRelations = viewerRelations.mapNotNull { setting ->
if (setting.isVisible && setting.key != Relations.NAME) {
relations.find { it.key == setting.key }
@ -39,112 +40,133 @@ suspend fun DVViewer.buildGalleryViews(
null
}
}
return objects.mapNotNull { id -> store.get(id) }.map { obj ->
if (obj.coverType == CoverType.NONE && coverRelationKey == null) {
Viewer.GalleryView.Item.Default(
objectId = obj.id,
relations = obj.values(
relations = filteredRelations,
val hasCover = !coverRelationKey.isNullOrEmpty()
return objectIds
.mapNotNull { objectStore.get(it) }
.map { obj ->
if (hasCover) {
obj.mapToCoverItem(
dvViewer = this,
coverImageHashProvider = coverImageHashProvider,
urlBuilder = urlBuilder,
details = details,
settings = viewerRelations,
storeOfObjects = store
),
bigIcon = cardSize != DVViewerCardSize.SMALL,
hideIcon = hideIcon,
name = obj.getProperName(),
icon = ObjectIcon.from(
obj = obj,
layout = obj.layout,
builder = urlBuilder
)
)
} else {
var cover: CoverView? = null
var coverColor: CoverColor? = null
var coverImage: Url? = null
var coverGradient: String? = null
if (obj.coverType != CoverType.NONE) {
val coverContainer = BasicObjectCoverWrapper(obj)
.getCover(urlBuilder, coverImageHashProvider)
coverColor = coverContainer.coverColor
coverImage = coverContainer.coverImage
coverGradient = coverContainer.coverGradient
} else {
val previewRelation = relations.find { it.key == coverRelationKey }
if (previewRelation != null && previewRelation.format == Relation.Format.FILE) {
val ids: List<Id> = when (val value = obj.map[previewRelation.key]) {
is Id -> listOf(value)
is List<*> -> value.typeOf()
else -> emptyList()
}
val previewId = ids.find { id ->
val preview = details[id]
preview != null && preview.type.contains(IMAGE)
}
if (previewId != null) {
coverImage = urlBuilder.image(previewId)
}
}
}
when {
coverImage != null -> {
cover = CoverView.Image(coverImage)
}
coverColor != null -> {
cover = CoverView.Color(coverColor)
}
coverGradient != null -> {
cover = CoverView.Gradient(coverGradient)
}
}
if (cover != null) {
Viewer.GalleryView.Item.Cover(
objectId = obj.id,
relations = obj.values(
relations = filteredRelations,
urlBuilder = urlBuilder,
details = details,
settings = viewerRelations,
storeOfObjects = store
),
hideIcon = hideIcon,
name = obj.getProperName(),
icon = ObjectIcon.from(
obj = obj,
layout = obj.layout,
builder = urlBuilder
),
cover = cover,
fitImage = coverFit,
isCoverLarge = cardSize == DVViewerCardSize.LARGE
store = objectStore,
relations = relations,
filteredRelations = filteredRelations
)
} else {
Viewer.GalleryView.Item.Default(
objectId = obj.id,
relations = obj.values(
relations = filteredRelations,
urlBuilder = urlBuilder,
details = details,
settings = viewerRelations,
storeOfObjects = store
),
bigIcon = cardSize != DVViewerCardSize.SMALL,
obj.mapToDefaultItem(
hideIcon = hideIcon,
name = obj.getProperName(),
icon = ObjectIcon.from(
obj = obj,
layout = obj.layout,
builder = urlBuilder
)
urlBuilder = urlBuilder,
details = details,
viewerRelations = viewerRelations,
store = objectStore,
filteredRelations = filteredRelations
)
}
}
}
private suspend fun ObjectWrapper.Basic.mapToDefaultItem(
hideIcon: Boolean,
urlBuilder: UrlBuilder,
details: Map<Id, Block.Fields>,
viewerRelations: List<DVViewerRelation>,
store: ObjectStore,
filteredRelations: List<ObjectWrapper.Relation>
): Viewer.GalleryView.Item.Default {
val obj = this
return Viewer.GalleryView.Item.Default(
objectId = obj.id,
relations = obj.values(
relations = filteredRelations,
urlBuilder = urlBuilder,
details = details,
settings = viewerRelations,
storeOfObjects = store
),
hideIcon = hideIcon,
name = obj.getProperName(),
icon = ObjectIcon.getEditorLinkToObjectIcon(
obj = obj,
layout = obj.layout,
builder = urlBuilder
)
)
}
private suspend fun ObjectWrapper.Basic.mapToCoverItem(
dvViewer: DVViewer,
relations: List<ObjectWrapper.Relation>,
details: Map<Id, Block.Fields>,
coverImageHashProvider: CoverImageHashProvider,
urlBuilder: UrlBuilder,
store: ObjectStore,
filteredRelations: List<ObjectWrapper.Relation>
): Viewer.GalleryView.Item.Cover {
val obj = this
var cover: CoverView? = null
var coverColor: CoverColor? = null
var coverImage: Url? = null
var coverGradient: String? = null
if (obj.coverType != CoverType.NONE) {
val coverContainer = BasicObjectCoverWrapper(obj)
.getCover(urlBuilder, coverImageHashProvider)
coverColor = coverContainer.coverColor
coverImage = coverContainer.coverImage
coverGradient = coverContainer.coverGradient
} else {
val previewRelation = relations.find { it.key == dvViewer.coverRelationKey }
if (previewRelation != null && previewRelation.format == Relation.Format.FILE) {
val ids: List<Id> = when (val value = obj.map[previewRelation.key]) {
is Id -> listOf(value)
is List<*> -> value.typeOf()
else -> emptyList()
}
val previewId = ids.find { id ->
val preview = details[id]
preview != null && preview.type.contains(IMAGE)
}
if (previewId != null) {
coverImage = urlBuilder.image(previewId)
}
}
}
when {
coverImage != null -> {
cover = CoverView.Image(coverImage)
}
coverColor != null -> {
cover = CoverView.Color(coverColor)
}
coverGradient != null -> {
cover = CoverView.Gradient(coverGradient)
}
}
return Viewer.GalleryView.Item.Cover(
objectId = obj.id,
relations = obj.values(
relations = filteredRelations,
urlBuilder = urlBuilder,
details = details,
settings = dvViewer.viewerRelations,
storeOfObjects = store
),
hideIcon = dvViewer.hideIcon,
name = obj.getProperName(),
icon = ObjectIcon.getEditorLinkToObjectIcon(
obj = obj,
layout = obj.layout,
builder = urlBuilder
),
cover = cover,
fitImage = dvViewer.coverFit
)
}

View file

@ -31,7 +31,6 @@ import com.anytypeio.anytype.domain.block.interactor.UpdateText
import com.anytypeio.anytype.domain.cover.SetDocCoverImage
import com.anytypeio.anytype.domain.dataview.SetDataViewQuery
import com.anytypeio.anytype.domain.dataview.interactor.CreateDataViewObject
import com.anytypeio.anytype.domain.dataview.interactor.UpdateDataViewViewer
import com.anytypeio.anytype.domain.error.Error
import com.anytypeio.anytype.domain.event.interactor.InterceptEvents
import com.anytypeio.anytype.domain.misc.UrlBuilder
@ -87,7 +86,6 @@ class ObjectSetViewModel(
private val reducer: ObjectSetReducer,
private val openObjectSet: OpenObjectSet,
private val closeBlock: CloseBlock,
private val updateDataViewViewer: UpdateDataViewViewer,
private val setObjectDetails: UpdateDetail,
private val downloadUnsplashImage: DownloadUnsplashImage,
private val setDocCoverImage: SetDocCoverImage,

View file

@ -9,7 +9,6 @@ import com.anytypeio.anytype.domain.block.interactor.UpdateText
import com.anytypeio.anytype.domain.cover.SetDocCoverImage
import com.anytypeio.anytype.domain.dataview.SetDataViewQuery
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.StoreOfRelations
@ -29,7 +28,6 @@ class ObjectSetViewModelFactory(
private val reducer: ObjectSetReducer,
private val openObjectSet: OpenObjectSet,
private val closeBlock: CloseBlock,
private val updateDataViewViewer: UpdateDataViewViewer,
private val setObjectDetails: UpdateDetail,
private val createDataViewObject: CreateDataViewObject,
private val downloadUnsplashImage: DownloadUnsplashImage,
@ -57,7 +55,6 @@ class ObjectSetViewModelFactory(
reducer = reducer,
openObjectSet = openObjectSet,
closeBlock = closeBlock,
updateDataViewViewer = updateDataViewViewer,
setObjectDetails = setObjectDetails,
createDataViewObject = createDataViewObject,
setDocCoverImage = setDocCoverImage,

View file

@ -70,8 +70,7 @@ sealed class Viewer {
override val name: String,
override val icon: ObjectIcon,
override val relations: List<DefaultObjectRelationValueView>,
override val hideIcon: Boolean,
val bigIcon: Boolean
override val hideIcon: Boolean
) : Item()
data class Cover(
override val objectId: Id,
@ -80,8 +79,7 @@ sealed class Viewer {
override val relations: List<DefaultObjectRelationValueView>,
override val hideIcon: Boolean,
val fitImage: Boolean,
val cover: CoverView,
val isCoverLarge: Boolean = false
val cover: CoverView? = null
) : Item()
}
}

View file

@ -71,7 +71,6 @@ class ObjectSetAddOrUpdateViewerTest : ObjectSetViewModelTestSetup() {
stubInterceptEvents()
stubInterceptThreadStatus()
stubSubscriptionEventChannel()
stubUpdateDataViewViewer()
stubOpenObjectSet(
doc = listOf(
header,
@ -171,7 +170,6 @@ class ObjectSetAddOrUpdateViewerTest : ObjectSetViewModelTestSetup() {
stubInterceptEvents()
stubInterceptThreadStatus()
stubUpdateDataViewViewer()
stubSubscriptionEventChannel()
stubOpenObjectSet(
doc = listOf(

View file

@ -54,7 +54,6 @@ class ObjectSetRestrictionsTest : ObjectSetViewModelTestSetup() {
),
dataViewRestrictions = dvRestrictions
)
stubUpdateDataViewViewer()
val vm = givenViewModel()
@ -94,8 +93,6 @@ class ObjectSetRestrictionsTest : ObjectSetViewModelTestSetup() {
stubSubscriptionEventChannel()
stubSearchWithSubscription()
stubUpdateDataViewViewer()
val vm = givenViewModel()
// TESTING
@ -133,7 +130,6 @@ class ObjectSetRestrictionsTest : ObjectSetViewModelTestSetup() {
stubInterceptThreadStatus()
stubSubscriptionEventChannel()
stubSearchWithSubscription()
stubUpdateDataViewViewer()
val vm = givenViewModel()
@ -172,7 +168,6 @@ class ObjectSetRestrictionsTest : ObjectSetViewModelTestSetup() {
stubInterceptThreadStatus()
stubSubscriptionEventChannel()
stubSearchWithSubscription()
stubUpdateDataViewViewer()
val vm = givenViewModel()
@ -211,7 +206,6 @@ class ObjectSetRestrictionsTest : ObjectSetViewModelTestSetup() {
stubInterceptThreadStatus()
stubSubscriptionEventChannel()
stubSearchWithSubscription()
stubUpdateDataViewViewer()
val vm = givenViewModel()

View file

@ -28,7 +28,6 @@ import com.anytypeio.anytype.domain.config.Gateway
import com.anytypeio.anytype.domain.cover.SetDocCoverImage
import com.anytypeio.anytype.domain.dataview.SetDataViewQuery
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
@ -80,9 +79,6 @@ open class ObjectSetViewModelTestSetup {
@Mock
lateinit var closeBlock: CloseBlock
@Mock
lateinit var updateDataViewViewer: UpdateDataViewViewer
@Mock
lateinit var updateText: UpdateText
@ -161,7 +157,6 @@ open class ObjectSetViewModelTestSetup {
fun givenViewModel(): ObjectSetViewModel = ObjectSetViewModel(
openObjectSet = openObjectSet,
closeBlock = closeBlock,
updateDataViewViewer = updateDataViewViewer,
updateText = updateText,
interceptEvents = interceptEvents,
interceptThreadStatus = interceptThreadStatus,
@ -235,19 +230,6 @@ open class ObjectSetViewModelTestSetup {
}
}
fun stubUpdateDataViewViewer(
events: List<Event> = emptyList()
) {
updateDataViewViewer.stub {
onBlocking { invoke(any()) } doReturn Either.Right(
Payload(
context = root,
events = events
)
)
}
}
fun stubCloseBlock() {
closeBlock.stub {
onBlocking { execute(any()) } doReturn Resultat.success(Unit)