From a19d1bd8f752b4cec07365749d73868eb2d3ab8e Mon Sep 17 00:00:00 2001 From: Konstantin Ivanov <54908981+konstantiniiv@users.noreply.github.com> Date: Sun, 4 Feb 2024 12:12:19 +0100 Subject: [PATCH] DROD-2135 Files as object (#819) --- .../sets/modals/EditDataViewViewerFragment.kt | 3 + .../anytypeio/anytype/core_models/Block.kt | 7 +- .../anytypeio/anytype/core_models/Command.kt | 2 +- .../anytypeio/anytype/core_models/Event.kt | 4 +- .../anytype/core_models/ObjectWrapper.kt | 13 ++ .../anytypeio/anytype/core_models/Response.kt | 2 +- .../core_ui/features/editor/BlockAdapter.kt | 25 +-- .../decoration/DecoratableViewHolder.kt | 27 +++ .../editor/holders/error/BookmarkError.kt | 50 +---- .../editor/holders/error/FileError.kt | 50 ++--- .../editor/holders/error/MediaError.kt | 53 ++++- .../editor/holders/error/PictureError.kt | 50 ++--- .../editor/holders/error/VideoError.kt | 50 ++--- .../features/editor/holders/media/File.kt | 19 +- .../placeholders/BookmarkPlaceholder.kt | 14 +- .../holders/placeholders/FilePlaceholder.kt | 3 +- .../holders/placeholders/MediaPlaceholder.kt | 11 +- .../placeholders/PicturePlaceholder.kt | 3 +- .../holders/placeholders/VideoPlaceholder.kt | 3 +- .../editor/holders/upload/BookmarkUpload.kt | 45 +--- .../editor/holders/upload/FileUpload.kt | 39 +--- .../editor/holders/upload/MediaUpload.kt | 42 ++-- .../editor/holders/upload/PictureUpload.kt | 30 +-- .../editor/holders/upload/VideoUpload.kt | 39 +--- .../drawable/ic_bookmark_block_loading.xml | 11 - .../res/drawable/ic_bookmark_inactive.xml | 11 + .../res/drawable/ic_file_light_inactive.xml | 27 +++ .../main/res/drawable/ic_picture_inactive.xml | 17 ++ .../main/res/drawable/ic_video_inactive.xml | 18 ++ .../layout/item_block_bookmark_uploading.xml | 68 ------ .../src/main/res/layout/item_block_file.xml | 14 +- .../res/layout/item_block_file_uploading.xml | 75 ------- .../res/layout/item_block_media_error.xml | 87 ++++++++ .../layout/item_block_media_placeholder.xml | 66 ++++-- .../layout/item_block_picture_uploading.xml | 58 ----- .../res/layout/item_block_video_uploading.xml | 63 ------ core-ui/src/main/res/values/styles.xml | 10 - .../anytype/core_ui/BlockAdapterTest.kt | 10 +- .../anytype/core_ui/BlockViewDiffUtilTest.kt | 2 +- .../core_ui/BlockViewSearchTextTest.kt | 2 +- .../core_ui/features/page/BlockViewTest.kt | 2 +- .../anytype/domain/misc/UrlBuilder.kt | 20 +- .../anytype/domain/misc/UrlBuilderTest.kt | 28 --- gradle/libs.versions.toml | 2 +- localization/src/main/res/values/strings.xml | 2 + .../anytype/middleware/UnsplashMiddleware.kt | 2 +- .../middleware/block/BlockMiddleware.kt | 2 +- .../middleware/interactor/Middleware.kt | 4 +- .../interactor/MiddlewareEventMapper.kt | 4 +- .../middleware/mappers/ToCoreModelMappers.kt | 3 +- .../mappers/ToMiddlewareModelMappers.kt | 3 +- .../anytype/MiddlewareEventChannelTest.kt | 10 +- .../editor/DocumentExternalEventReducer.kt | 4 +- .../presentation/editor/EditorViewModel.kt | 79 ++++--- .../presentation/editor/editor/Command.kt | 1 - .../presentation/editor/editor/Intent.kt | 2 +- .../editor/editor/Orchestrator.kt | 2 +- .../editor/editor/ext/BlockViewExt.kt | 12 + .../editor/editor/listener/ListenerType.kt | 1 + .../editor/editor/mention/MentionExt.kt | 2 +- .../editor/editor/model/BlockView.kt | 20 +- .../editor/render/DefaultBlockViewRenderer.kt | 77 +++---- .../presentation/extension/FileUrlExt.kt | 51 +++++ .../presentation/mapper/MapperExtension.kt | 180 ++++++++++----- .../mapper/ObjectWrapperExtensions.kt | 23 -- .../objects/menu/ObjectMenuViewModel.kt | 2 +- .../objects/menu/ObjectMenuViewModelBase.kt | 2 +- .../presentation/relations/CoverTypeMapper.kt | 9 +- .../relations/ObjectSetRenderMapper.kt | 4 +- .../sets/EditDataViewViewerViewModel.kt | 2 + .../presentation/sets/GalleryViewMapper.kt | 2 +- .../presentation/sets/ObjectSetExtension.kt | 2 +- .../presentation/sets/SetsExtension.kt | 2 +- .../downloader/DocumentFileShareDownloader.kt | 5 +- .../downloader/MiddlewareShareDownloader.kt | 19 +- .../editor/EditorViewModelTest.kt | 21 +- .../editor/editor/EditorErrorMessageTest.kt | 4 +- .../editor/editor/EditorLockPageTest.kt | 87 +++++--- .../mapper/MapperExtensionKtTest.kt | 209 ++++++++++++++---- .../mapper/ObjectWrapperExtensionsKtTest.kt | 100 +-------- protocol/src/main/proto/changes.proto | 5 + protocol/src/main/proto/commands.proto | 146 +++++++++++- protocol/src/main/proto/events.proto | 15 ++ protocol/src/main/proto/models.proto | 28 ++- .../anytypeio/anytype/core_models/Block.kt | 4 +- .../anytype/presentation/MockBlockFactory.kt | 2 +- 86 files changed, 1256 insertions(+), 1073 deletions(-) delete mode 100644 core-ui/src/main/res/drawable/ic_bookmark_block_loading.xml create mode 100644 core-ui/src/main/res/drawable/ic_bookmark_inactive.xml create mode 100644 core-ui/src/main/res/drawable/ic_file_light_inactive.xml create mode 100644 core-ui/src/main/res/drawable/ic_picture_inactive.xml create mode 100644 core-ui/src/main/res/drawable/ic_video_inactive.xml delete mode 100644 core-ui/src/main/res/layout/item_block_bookmark_uploading.xml delete mode 100644 core-ui/src/main/res/layout/item_block_file_uploading.xml create mode 100644 core-ui/src/main/res/layout/item_block_media_error.xml delete mode 100644 core-ui/src/main/res/layout/item_block_picture_uploading.xml delete mode 100644 core-ui/src/main/res/layout/item_block_video_uploading.xml create mode 100644 presentation/src/main/java/com/anytypeio/anytype/presentation/extension/FileUrlExt.kt delete mode 100644 presentation/src/main/java/com/anytypeio/anytype/presentation/mapper/ObjectWrapperExtensions.kt diff --git a/app/src/main/java/com/anytypeio/anytype/ui/sets/modals/EditDataViewViewerFragment.kt b/app/src/main/java/com/anytypeio/anytype/ui/sets/modals/EditDataViewViewerFragment.kt index 86fdd3f6b4..71dbf93840 100644 --- a/app/src/main/java/com/anytypeio/anytype/ui/sets/modals/EditDataViewViewerFragment.kt +++ b/app/src/main/java/com/anytypeio/anytype/ui/sets/modals/EditDataViewViewerFragment.kt @@ -134,6 +134,9 @@ EditDataViewViewerFragment : BaseBottomSheetFragment { toast("TODO") } + EditDataViewViewerViewModel.ViewState.Graph -> { + toast("TODO") + } } } diff --git a/core-models/src/main/java/com/anytypeio/anytype/core_models/Block.kt b/core-models/src/main/java/com/anytypeio/anytype/core_models/Block.kt index d8ec2b8482..a2bcba5abd 100644 --- a/core-models/src/main/java/com/anytypeio/anytype/core_models/Block.kt +++ b/core-models/src/main/java/com/anytypeio/anytype/core_models/Block.kt @@ -218,7 +218,7 @@ data class Block( /** * File block. - * @property hash file hash + * @property targetObjectId id of the target object * @property name filename * @property mime mime type * @property size file size (in bytes) @@ -226,7 +226,7 @@ data class Block( * @property state file state */ data class File( - val hash: String? = null, + val targetObjectId: Id? = null, val name: String? = null, val mime: String? = null, val size: Long? = null, @@ -297,7 +297,8 @@ data class Block( LIST("List"), GALLERY("Gallery"), BOARD("Board"), - CALENDAR("Calendar") + CALENDAR("Calendar"), + GRAPH("Graph") } enum class Size { SMALL, MEDIUM, LARGE } diff --git a/core-models/src/main/java/com/anytypeio/anytype/core_models/Command.kt b/core-models/src/main/java/com/anytypeio/anytype/core_models/Command.kt index 09ce0da4f7..c0728f8da3 100644 --- a/core-models/src/main/java/com/anytypeio/anytype/core_models/Command.kt +++ b/core-models/src/main/java/com/anytypeio/anytype/core_models/Command.kt @@ -27,7 +27,7 @@ sealed class Command { class DownloadFile( val path: String, - val hash: Hash + val objectId: Id ) /** 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 a7faf0a6e1..57e176759c 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 @@ -177,11 +177,11 @@ sealed class Event { */ data class UpdateFileBlock( override val context: String, - val id: Id, + val blockId: Id, + val targetObjectId: Id? = null, val state: Block.Content.File.State? = null, val type: Block.Content.File.Type? = null, val name: String? = null, - val hash: String? = null, val mime: String? = null, val size: Long? = null ) : Command() 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 a07c633bf4..bddde8b121 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 @@ -296,4 +296,17 @@ sealed class ObjectWrapper { else -> emptyList() } } + + data class File(override val map: Struct) : ObjectWrapper() { + private val default = map.withDefault { null } + val id: Id by default + val name: String? by default + val description: String? by default + val fileExt: String? by default + val fileMimeType: String? by default + val sizeInBytes: Double? by default + val url: String? by default + val isArchived: Boolean? by default + val isDeleted: Boolean? by default + } } \ No newline at end of file diff --git a/core-models/src/main/java/com/anytypeio/anytype/core_models/Response.kt b/core-models/src/main/java/com/anytypeio/anytype/core_models/Response.kt index 86feb8ddc3..a6639aabca 100644 --- a/core-models/src/main/java/com/anytypeio/anytype/core_models/Response.kt +++ b/core-models/src/main/java/com/anytypeio/anytype/core_models/Response.kt @@ -31,7 +31,7 @@ sealed class Response { sealed class Media : Response() { class Upload( - val hash: String + val objectId: Id ) } diff --git a/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/BlockAdapter.kt b/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/BlockAdapter.kt index d3b9fe851e..1075be912a 100644 --- a/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/BlockAdapter.kt +++ b/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/BlockAdapter.kt @@ -15,8 +15,6 @@ import androidx.recyclerview.widget.RecyclerView import com.anytypeio.anytype.core_models.Id import com.anytypeio.anytype.core_ui.BuildConfig import com.anytypeio.anytype.core_ui.databinding.ItemBlockBookmarkBinding -import com.anytypeio.anytype.core_ui.databinding.ItemBlockBookmarkErrorBinding -import com.anytypeio.anytype.core_ui.databinding.ItemBlockBookmarkUploadingBinding import com.anytypeio.anytype.core_ui.databinding.ItemBlockBulletedBinding import com.anytypeio.anytype.core_ui.databinding.ItemBlockCalloutBinding import com.anytypeio.anytype.core_ui.databinding.ItemBlockCheckboxBinding @@ -29,13 +27,12 @@ import com.anytypeio.anytype.core_ui.databinding.ItemBlockDividerDotsBinding import com.anytypeio.anytype.core_ui.databinding.ItemBlockDividerLineBinding import com.anytypeio.anytype.core_ui.databinding.ItemBlockFeaturedRelationsBinding import com.anytypeio.anytype.core_ui.databinding.ItemBlockFileBinding -import com.anytypeio.anytype.core_ui.databinding.ItemBlockFileErrorBinding -import com.anytypeio.anytype.core_ui.databinding.ItemBlockFileUploadingBinding import com.anytypeio.anytype.core_ui.databinding.ItemBlockHeaderOneBinding import com.anytypeio.anytype.core_ui.databinding.ItemBlockHeaderThreeBinding import com.anytypeio.anytype.core_ui.databinding.ItemBlockHeaderTwoBinding import com.anytypeio.anytype.core_ui.databinding.ItemBlockHighlightBinding import com.anytypeio.anytype.core_ui.databinding.ItemBlockLatexBinding +import com.anytypeio.anytype.core_ui.databinding.ItemBlockMediaErrorBinding import com.anytypeio.anytype.core_ui.databinding.ItemBlockMediaPlaceholderBinding import com.anytypeio.anytype.core_ui.databinding.ItemBlockNumberedBinding import com.anytypeio.anytype.core_ui.databinding.ItemBlockObjectLinkArchiveBinding @@ -47,8 +44,6 @@ import com.anytypeio.anytype.core_ui.databinding.ItemBlockObjectLinkCardSmallIco import com.anytypeio.anytype.core_ui.databinding.ItemBlockObjectLinkDeleteBinding import com.anytypeio.anytype.core_ui.databinding.ItemBlockObjectLinkLoadingBinding import com.anytypeio.anytype.core_ui.databinding.ItemBlockPictureBinding -import com.anytypeio.anytype.core_ui.databinding.ItemBlockPictureErrorBinding -import com.anytypeio.anytype.core_ui.databinding.ItemBlockPictureUploadingBinding import com.anytypeio.anytype.core_ui.databinding.ItemBlockRelationCheckboxBinding import com.anytypeio.anytype.core_ui.databinding.ItemBlockRelationDefaultBinding import com.anytypeio.anytype.core_ui.databinding.ItemBlockRelationDeletedBinding @@ -66,8 +61,6 @@ import com.anytypeio.anytype.core_ui.databinding.ItemBlockTocBinding import com.anytypeio.anytype.core_ui.databinding.ItemBlockToggleBinding import com.anytypeio.anytype.core_ui.databinding.ItemBlockUnsupportedBinding import com.anytypeio.anytype.core_ui.databinding.ItemBlockVideoBinding -import com.anytypeio.anytype.core_ui.databinding.ItemBlockVideoErrorBinding -import com.anytypeio.anytype.core_ui.databinding.ItemBlockVideoUploadingBinding import com.anytypeio.anytype.core_ui.features.editor.BlockViewDiffUtil.Payload import com.anytypeio.anytype.core_ui.features.editor.decoration.DecoratableViewHolder import com.anytypeio.anytype.core_ui.features.editor.holders.dataview.DataViewBlockDefaultHolder @@ -528,12 +521,12 @@ class BlockAdapter( } HOLDER_FILE_UPLOAD -> { FileUpload( - ItemBlockFileUploadingBinding.inflate(inflater, parent, false) + ItemBlockMediaPlaceholderBinding.inflate(inflater, parent, false) ) } HOLDER_FILE_ERROR -> { FileError( - ItemBlockFileErrorBinding.inflate(inflater, parent, false) + ItemBlockMediaErrorBinding.inflate(inflater, parent, false) ) } HOLDER_VIDEO -> { @@ -548,12 +541,12 @@ class BlockAdapter( } HOLDER_VIDEO_UPLOAD -> { VideoUpload( - ItemBlockVideoUploadingBinding.inflate(inflater, parent, false) + ItemBlockMediaPlaceholderBinding.inflate(inflater, parent, false) ) } HOLDER_VIDEO_ERROR -> { VideoError( - ItemBlockVideoErrorBinding.inflate(inflater, parent, false) + ItemBlockMediaErrorBinding.inflate(inflater, parent, false) ) } HOLDER_OBJECT_LINK_DEFAULT -> { @@ -681,12 +674,12 @@ class BlockAdapter( } HOLDER_BOOKMARK_ERROR -> { BookmarkError( - ItemBlockBookmarkErrorBinding.inflate(inflater, parent, false) + ItemBlockMediaErrorBinding.inflate(inflater, parent, false) ) } HOLDER_BOOKMARK_UPLOAD -> { BookmarkUpload( - ItemBlockBookmarkUploadingBinding.inflate(inflater, parent, false) + ItemBlockMediaPlaceholderBinding.inflate(inflater, parent, false) ) } HOLDER_PICTURE -> { @@ -701,12 +694,12 @@ class BlockAdapter( } HOLDER_PICTURE_UPLOAD -> { PictureUpload( - ItemBlockPictureUploadingBinding.inflate(inflater, parent, false) + ItemBlockMediaPlaceholderBinding.inflate(inflater, parent, false) ) } HOLDER_PICTURE_ERROR -> { PictureError( - ItemBlockPictureErrorBinding.inflate(inflater, parent, false) + ItemBlockMediaErrorBinding.inflate(inflater, parent, false) ) } HOLDER_DIVIDER_LINE -> { diff --git a/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/decoration/DecoratableViewHolder.kt b/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/decoration/DecoratableViewHolder.kt index e65eedef7e..6fc880670b 100644 --- a/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/decoration/DecoratableViewHolder.kt +++ b/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/decoration/DecoratableViewHolder.kt @@ -36,6 +36,19 @@ interface DecoratableCardViewHolder : DecoratableViewHolder { } } +interface DecoratableMediaErrorViewHolder : DecoratableViewHolder { + val decoratableCard: View + + override fun applyDecorations(decorations: List) { + decoratableContainer.decorate(decorations) { rect -> + decoratableCard.applyMediaErrorDecorations( + rect = rect, + res = decoratableCard.resources + ) + } + } +} + /** * Applying decorations for card blocks (media blocks, placeholders, link-to-objects, bookmarks, etc.) */ @@ -62,4 +75,18 @@ inline fun View.applySelectorOffset( marginEnd = content.marginEnd - selectorLeftRightOffset topMargin = content.marginTop bottomMargin = content.marginBottom +} + +/** + * Applying decorations for media error blocks + */ +inline fun View.applyMediaErrorDecorations( + rect: Rect, + res: Resources +) = updateLayoutParams { + val defaultIndentOffset = res.getDimension(R.dimen.default_indent).toInt() + marginStart = defaultIndentOffset + rect.left + marginEnd = defaultIndentOffset + rect.right + topMargin = res.getDimension(R.dimen.card_block_extra_space_top).toInt() + bottomMargin = res.getDimension(R.dimen.dp_8).toInt() + rect.bottom } \ No newline at end of file diff --git a/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/holders/error/BookmarkError.kt b/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/holders/error/BookmarkError.kt index d2abe6347f..e38eb82be2 100644 --- a/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/holders/error/BookmarkError.kt +++ b/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/holders/error/BookmarkError.kt @@ -1,35 +1,14 @@ package com.anytypeio.anytype.core_ui.features.editor.holders.error -import android.view.View -import android.widget.FrameLayout -import android.widget.TextView -import androidx.core.view.updateLayoutParams -import com.anytypeio.anytype.core_ui.BuildConfig import com.anytypeio.anytype.core_ui.R -import com.anytypeio.anytype.core_ui.databinding.ItemBlockBookmarkErrorBinding -import com.anytypeio.anytype.core_ui.features.editor.decoration.DecoratableCardViewHolder -import com.anytypeio.anytype.core_ui.features.editor.decoration.EditorDecorationContainer -import com.anytypeio.anytype.core_ui.features.editor.decoration.applySelectorOffset -import com.anytypeio.anytype.core_utils.ext.dimen -import com.anytypeio.anytype.core_utils.ext.indentize +import com.anytypeio.anytype.core_ui.databinding.ItemBlockMediaErrorBinding +import com.anytypeio.anytype.core_ui.extensions.drawable import com.anytypeio.anytype.presentation.editor.editor.listener.ListenerType import com.anytypeio.anytype.presentation.editor.editor.model.BlockView class BookmarkError( - val binding: ItemBlockBookmarkErrorBinding -) : MediaError(binding.root), DecoratableCardViewHolder { - - override val root: View = binding.bookmarkErrorRoot - private val urlView: TextView = binding.errorBookmarkUrl - - override val decoratableContainer: EditorDecorationContainer - get() = binding.decorationContainer - override val decoratableCard: View - get() = binding.card - - fun setUrl(url: String) { - urlView.text = url.ifEmpty { null } - } + binding: ItemBlockMediaErrorBinding +) : MediaError(binding) { override fun errorClick(item: BlockView.Error, clicked: (ListenerType) -> Unit) { if (item is BlockView.Error.Bookmark) { @@ -37,20 +16,11 @@ class BookmarkError( } } - @Deprecated("Pre-nested-styling legacy.") - override fun indentize(item: BlockView.Indentable) { - // Do nothing. - } - - override fun select(isSelected: Boolean) { - binding.selected.isSelected = isSelected - } - - override fun applyDecorations(decorations: List) { - super.applyDecorations(decorations) - binding.selected.applySelectorOffset( - content = binding.card, - res = itemView.resources - ) + override fun bind(item: BlockView.Error, clicked: (ListenerType) -> Unit) { + super.bind(item, clicked) + binding.fileIcon.setImageDrawable(itemView.context.drawable(R.drawable.ic_bookmark_inactive)) + if (item is BlockView.Error.Bookmark) { + binding.fileName.text = item.url.ifEmpty { null } + } } } \ No newline at end of file diff --git a/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/holders/error/FileError.kt b/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/holders/error/FileError.kt index 6e7468432f..29a0973759 100644 --- a/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/holders/error/FileError.kt +++ b/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/holders/error/FileError.kt @@ -1,48 +1,30 @@ package com.anytypeio.anytype.core_ui.features.editor.holders.error -import android.view.View -import android.widget.FrameLayout -import androidx.core.view.updateLayoutParams -import com.anytypeio.anytype.core_ui.BuildConfig import com.anytypeio.anytype.core_ui.R -import com.anytypeio.anytype.core_ui.databinding.ItemBlockFileErrorBinding +import com.anytypeio.anytype.core_ui.databinding.ItemBlockMediaErrorBinding +import com.anytypeio.anytype.core_ui.extensions.drawable import com.anytypeio.anytype.core_ui.features.editor.decoration.DecoratableCardViewHolder -import com.anytypeio.anytype.core_ui.features.editor.decoration.EditorDecorationContainer -import com.anytypeio.anytype.core_ui.features.editor.decoration.applySelectorOffset -import com.anytypeio.anytype.core_utils.ext.dimen -import com.anytypeio.anytype.core_utils.ext.indentize import com.anytypeio.anytype.presentation.editor.editor.listener.ListenerType import com.anytypeio.anytype.presentation.editor.editor.model.BlockView class FileError( - val binding: ItemBlockFileErrorBinding -) : MediaError(binding.root), DecoratableCardViewHolder { - - override val root: View = itemView - - override val decoratableContainer: EditorDecorationContainer - get() = binding.decorationContainer - override val decoratableCard: View - get() = binding.card + binding: ItemBlockMediaErrorBinding +) : MediaError(binding) { override fun errorClick(item: BlockView.Error, clicked: (ListenerType) -> Unit) { - clicked(ListenerType.File.Error(item.id)) + if (item is BlockView.Error.File) { + clicked(ListenerType.File.Error(item.id)) + } } - @Deprecated("Pre-nested-styling legacy.") - override fun indentize(item: BlockView.Indentable) { - // Do nothing. - } - - override fun select(isSelected: Boolean) { - binding.selected.isSelected = isSelected - } - - override fun applyDecorations(decorations: List) { - super.applyDecorations(decorations) - binding.selected.applySelectorOffset( - content = binding.card, - res = itemView.resources - ) + override fun bind(item: BlockView.Error, clicked: (ListenerType) -> Unit) { + super.bind(item, clicked) + if (item is BlockView.Error.File) { + binding.fileName.text = if (item.name.isNullOrBlank()) { + itemView.resources.getString(R.string.hint_upload_file) + } else + item.name + } + binding.fileIcon.setImageDrawable(itemView.context.drawable(R.drawable.ic_file_light_inactive)) } } \ No newline at end of file diff --git a/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/holders/error/MediaError.kt b/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/holders/error/MediaError.kt index 312707943c..16e75acd29 100644 --- a/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/holders/error/MediaError.kt +++ b/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/holders/error/MediaError.kt @@ -1,24 +1,31 @@ package com.anytypeio.anytype.core_ui.features.editor.holders.error import android.view.View +import android.widget.FrameLayout +import androidx.core.view.marginEnd +import androidx.core.view.marginStart +import androidx.core.view.updateLayoutParams +import com.anytypeio.anytype.core_ui.R +import com.anytypeio.anytype.core_ui.databinding.ItemBlockMediaErrorBinding import com.anytypeio.anytype.core_ui.features.editor.BlockViewDiffUtil import com.anytypeio.anytype.core_ui.features.editor.BlockViewHolder import com.anytypeio.anytype.core_ui.features.editor.EditorTouchProcessor import com.anytypeio.anytype.core_ui.features.editor.SupportCustomTouchProcessor +import com.anytypeio.anytype.core_ui.features.editor.decoration.DecoratableMediaErrorViewHolder +import com.anytypeio.anytype.core_ui.features.editor.decoration.EditorDecorationContainer import com.anytypeio.anytype.presentation.editor.editor.listener.ListenerType import com.anytypeio.anytype.presentation.editor.editor.model.BlockView abstract class MediaError( - view: View -) : BlockViewHolder(view), + val binding: ItemBlockMediaErrorBinding +) : BlockViewHolder(binding.root), BlockViewHolder.IndentableHolder, - BlockViewHolder.DragAndDropHolder, - SupportCustomTouchProcessor { + SupportCustomTouchProcessor, DecoratableMediaErrorViewHolder { - abstract val root: View + override val decoratableContainer: EditorDecorationContainer get() = binding.decorationContainer + override val decoratableCard: View get() = binding.card + val errorIcon: View get() = binding.errorMessage abstract fun errorClick(item: BlockView.Error, clicked: (ListenerType) -> Unit) - abstract override fun indentize(item: BlockView.Indentable) - abstract fun select(isSelected: Boolean) override val editorTouchProcessor = EditorTouchProcessor( fallback = { e -> itemView.onTouchEvent(e) } @@ -28,23 +35,45 @@ abstract class MediaError( itemView.setOnTouchListener { v, e -> editorTouchProcessor.process(v, e) } } - fun bind( + open fun bind( item: BlockView.Error, clicked: (ListenerType) -> Unit ) { - indentize(item) select(item.isSelected) with(itemView) { setOnClickListener { errorClick(item, clicked) } } } - fun processChangePayload(payloads: List, item: BlockView) { - check(item is BlockView.Error) { "Expected error block, but was: $item" } + open fun processChangePayload(payloads: List, item: BlockView) { + check(item is BlockView.Error) { "Expected error media block, but was: $item" } payloads.forEach { payload -> if (payload.isSelectionChanged) { - itemView.isSelected = item.isSelected + select(item.isSelected) } } } + + fun select(isSelected: Boolean) { + binding.selected.isSelected = isSelected + } + + override fun applyDecorations(decorations: List) { + super.applyDecorations(decorations) + binding.selected.updateLayoutParams { + val selectorLeftRightOffset = itemView.resources.getDimension(R.dimen.selection_left_right_offset).toInt() + marginStart = binding.card.marginStart - selectorLeftRightOffset + marginEnd = binding.card.marginEnd - selectorLeftRightOffset + topMargin = itemView.resources.getDimension(R.dimen.card_block_extra_space_top).toInt() + bottomMargin = 0 + } + errorIcon.updateLayoutParams { + marginStart = binding.card.marginStart + } + } + + @Deprecated("Pre-nested-styling legacy.") + override fun indentize(item: BlockView.Indentable) { + // Do nothing. + } } \ No newline at end of file diff --git a/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/holders/error/PictureError.kt b/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/holders/error/PictureError.kt index b44f282b19..0d52a22456 100644 --- a/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/holders/error/PictureError.kt +++ b/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/holders/error/PictureError.kt @@ -1,48 +1,30 @@ package com.anytypeio.anytype.core_ui.features.editor.holders.error -import android.view.View -import android.widget.FrameLayout -import androidx.core.view.updateLayoutParams -import com.anytypeio.anytype.core_ui.BuildConfig import com.anytypeio.anytype.core_ui.R -import com.anytypeio.anytype.core_ui.databinding.ItemBlockPictureErrorBinding +import com.anytypeio.anytype.core_ui.databinding.ItemBlockMediaErrorBinding +import com.anytypeio.anytype.core_ui.extensions.drawable import com.anytypeio.anytype.core_ui.features.editor.decoration.DecoratableCardViewHolder -import com.anytypeio.anytype.core_ui.features.editor.decoration.EditorDecorationContainer -import com.anytypeio.anytype.core_ui.features.editor.decoration.applySelectorOffset -import com.anytypeio.anytype.core_utils.ext.dimen -import com.anytypeio.anytype.core_utils.ext.indentize import com.anytypeio.anytype.presentation.editor.editor.listener.ListenerType import com.anytypeio.anytype.presentation.editor.editor.model.BlockView class PictureError( - val binding: ItemBlockPictureErrorBinding -) : MediaError(binding.root), DecoratableCardViewHolder { - - override val root: View = itemView - - override val decoratableContainer: EditorDecorationContainer - get() = binding.decorationContainer - override val decoratableCard: View - get() = binding.card + binding: ItemBlockMediaErrorBinding +) : MediaError(binding) { override fun errorClick(item: BlockView.Error, clicked: (ListenerType) -> Unit) { - clicked(ListenerType.Picture.Error(item.id)) + if (item is BlockView.Error.Picture) { + clicked(ListenerType.Picture.Error(item.id)) + } } - @Deprecated("Pre-nested-styling legacy.") - override fun indentize(item: BlockView.Indentable) { - // Do nothing. - } - - override fun select(isSelected: Boolean) { - binding.selected.isSelected = isSelected - } - - override fun applyDecorations(decorations: List) { - super.applyDecorations(decorations) - binding.selected.applySelectorOffset( - content = binding.card, - res = itemView.resources - ) + override fun bind(item: BlockView.Error, clicked: (ListenerType) -> Unit) { + super.bind(item, clicked) + if (item is BlockView.Error.Picture) { + binding.fileName.text = if (item.name.isNullOrBlank()) { + itemView.resources.getString(R.string.hint_upload_image) + } else + item.name + } + binding.fileIcon.setImageDrawable(itemView.context.drawable(R.drawable.ic_picture_inactive)) } } \ No newline at end of file diff --git a/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/holders/error/VideoError.kt b/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/holders/error/VideoError.kt index 511dc13ea6..ce40e6f976 100644 --- a/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/holders/error/VideoError.kt +++ b/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/holders/error/VideoError.kt @@ -1,48 +1,30 @@ package com.anytypeio.anytype.core_ui.features.editor.holders.error -import android.view.View -import android.widget.FrameLayout -import androidx.core.view.updateLayoutParams -import com.anytypeio.anytype.core_ui.BuildConfig import com.anytypeio.anytype.core_ui.R -import com.anytypeio.anytype.core_ui.databinding.ItemBlockVideoErrorBinding +import com.anytypeio.anytype.core_ui.databinding.ItemBlockMediaErrorBinding +import com.anytypeio.anytype.core_ui.extensions.drawable import com.anytypeio.anytype.core_ui.features.editor.decoration.DecoratableCardViewHolder -import com.anytypeio.anytype.core_ui.features.editor.decoration.EditorDecorationContainer -import com.anytypeio.anytype.core_ui.features.editor.decoration.applySelectorOffset -import com.anytypeio.anytype.core_utils.ext.dimen -import com.anytypeio.anytype.core_utils.ext.indentize import com.anytypeio.anytype.presentation.editor.editor.listener.ListenerType import com.anytypeio.anytype.presentation.editor.editor.model.BlockView class VideoError( - val binding: ItemBlockVideoErrorBinding -) : MediaError(binding.root), DecoratableCardViewHolder { - - override val root: View = itemView - - override val decoratableContainer: EditorDecorationContainer - get() = binding.decorationContainer - override val decoratableCard: View - get() = binding.card + binding: ItemBlockMediaErrorBinding +) : MediaError(binding) { override fun errorClick(item: BlockView.Error, clicked: (ListenerType) -> Unit) { - clicked(ListenerType.Video.Error(item.id)) + if (item is BlockView.Error.Video) { + clicked(ListenerType.Video.Error(item.id)) + } } - @Deprecated("Pre-nested-styling legacy.") - override fun indentize(item: BlockView.Indentable) { - // Do nothing. - } - - override fun select(isSelected: Boolean) { - binding.selected.isSelected = isSelected - } - - override fun applyDecorations(decorations: List) { - super.applyDecorations(decorations) - binding.selected.applySelectorOffset( - content = binding.card, - res = itemView.resources - ) + override fun bind(item: BlockView.Error, clicked: (ListenerType) -> Unit) { + super.bind(item, clicked) + if (item is BlockView.Error.Video) { + binding.fileName.text = if (item.name.isNullOrBlank()) { + itemView.resources.getString(R.string.hint_upload_video) + } else + item.name + } + binding.fileIcon.setImageDrawable(itemView.context.drawable(R.drawable.ic_video_inactive)) } } \ No newline at end of file diff --git a/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/holders/media/File.kt b/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/holders/media/File.kt index cef6bf0458..75225b2481 100644 --- a/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/holders/media/File.kt +++ b/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/holders/media/File.kt @@ -45,9 +45,22 @@ class File(val binding: ItemBlockFileBinding) : Media(binding.root), Decoratable name.enableReadMode() if (item.size != null && item.name != null) { val size = item.size!!.readableFileSize() - val spannable = SpannableString("${item.name} $size") - val start = item.name!!.length + 2 - val end = item.name!!.length + 2 + size.length + + val spannable = if (item.fileExt.isNullOrBlank()) { + SpannableString("${item.name} $size") + } else { + SpannableString("${item.name}.${item.fileExt} $size") + } + val start = if (item.fileExt.isNullOrBlank()) { + item.name!!.length + 2 + } else { + item.name!!.length + item.fileExt!!.length + 2 + } + val end = if (item.fileExt.isNullOrBlank()) { + item.name!!.length + 2 + size.length + } else { + item.name!!.length + item.fileExt!!.length + 3 + size.length + } spannable.setSpan( RelativeSizeSpan(0.87f), start, diff --git a/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/holders/placeholders/BookmarkPlaceholder.kt b/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/holders/placeholders/BookmarkPlaceholder.kt index 811c3c8a08..15f3728a4c 100644 --- a/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/holders/placeholders/BookmarkPlaceholder.kt +++ b/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/holders/placeholders/BookmarkPlaceholder.kt @@ -2,9 +2,8 @@ package com.anytypeio.anytype.core_ui.features.editor.holders.placeholders import com.anytypeio.anytype.core_ui.R import com.anytypeio.anytype.core_ui.databinding.ItemBlockMediaPlaceholderBinding -import com.anytypeio.anytype.core_ui.features.editor.BlockViewDiffUtil +import com.anytypeio.anytype.core_ui.extensions.drawable import com.anytypeio.anytype.presentation.editor.editor.listener.ListenerType -import com.anytypeio.anytype.presentation.editor.editor.model.BlockView class BookmarkPlaceholder(binding: ItemBlockMediaPlaceholderBinding) : MediaPlaceholder(binding) { @@ -14,15 +13,6 @@ class BookmarkPlaceholder(binding: ItemBlockMediaPlaceholderBinding) : MediaPlac override fun setup() { title.text = itemView.resources.getString(R.string.hint_add_a_web_bookmark) - title.setCompoundDrawablesRelativeWithIntrinsicBounds(R.drawable.ic_bookmark_placeholder, 0, 0, 0) - } - - override fun processChangePayload(payloads: List, item: BlockView) { - super.processChangePayload(payloads, item) - // TODO process loading state changes - } - - fun isLoading(boolean: Boolean) { - // TODO process loading state changes + binding.fileIcon.setImageDrawable(itemView.context.drawable(R.drawable.ic_bookmark_placeholder)) } } \ No newline at end of file diff --git a/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/holders/placeholders/FilePlaceholder.kt b/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/holders/placeholders/FilePlaceholder.kt index 16b4a072bf..d3f097f74d 100644 --- a/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/holders/placeholders/FilePlaceholder.kt +++ b/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/holders/placeholders/FilePlaceholder.kt @@ -2,6 +2,7 @@ package com.anytypeio.anytype.core_ui.features.editor.holders.placeholders import com.anytypeio.anytype.core_ui.R import com.anytypeio.anytype.core_ui.databinding.ItemBlockMediaPlaceholderBinding +import com.anytypeio.anytype.core_ui.extensions.drawable import com.anytypeio.anytype.presentation.editor.editor.listener.ListenerType class FilePlaceholder(binding: ItemBlockMediaPlaceholderBinding) : MediaPlaceholder(binding) { @@ -12,6 +13,6 @@ class FilePlaceholder(binding: ItemBlockMediaPlaceholderBinding) : MediaPlacehol override fun setup() { title.text = itemView.resources.getString(R.string.hint_upload_file) - title.setCompoundDrawablesRelativeWithIntrinsicBounds(R.drawable.ic_file_light, 0, 0, 0) + binding.fileIcon.setImageDrawable(itemView.context.drawable(R.drawable.ic_file_light)) } } \ No newline at end of file diff --git a/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/holders/placeholders/MediaPlaceholder.kt b/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/holders/placeholders/MediaPlaceholder.kt index 414e40f3de..fab893e227 100644 --- a/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/holders/placeholders/MediaPlaceholder.kt +++ b/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/holders/placeholders/MediaPlaceholder.kt @@ -3,11 +3,6 @@ package com.anytypeio.anytype.core_ui.features.editor.holders.placeholders import android.view.View import android.widget.FrameLayout import android.widget.TextView -import androidx.core.view.updateLayoutParams -import androidx.core.view.updatePadding -import androidx.recyclerview.widget.RecyclerView -import com.anytypeio.anytype.core_ui.BuildConfig -import com.anytypeio.anytype.core_ui.R import com.anytypeio.anytype.core_ui.databinding.ItemBlockMediaPlaceholderBinding import com.anytypeio.anytype.core_ui.extensions.veryLight import com.anytypeio.anytype.core_ui.features.editor.BlockViewDiffUtil @@ -17,8 +12,7 @@ import com.anytypeio.anytype.core_ui.features.editor.SupportCustomTouchProcessor import com.anytypeio.anytype.core_ui.features.editor.decoration.DecoratableCardViewHolder import com.anytypeio.anytype.core_ui.features.editor.decoration.EditorDecorationContainer import com.anytypeio.anytype.core_ui.features.editor.decoration.applySelectorOffset -import com.anytypeio.anytype.core_utils.ext.dimen -import com.anytypeio.anytype.core_models.ThemeColor +import com.anytypeio.anytype.core_utils.ext.invisible import com.anytypeio.anytype.presentation.editor.editor.listener.ListenerType import com.anytypeio.anytype.presentation.editor.editor.model.BlockView import com.google.android.material.card.MaterialCardView @@ -33,7 +27,7 @@ abstract class MediaPlaceholder( protected val root: View = binding.root protected val card: MaterialCardView = binding.card - protected val title: TextView = binding.title + protected val title: TextView = binding.fileName override val decoratableContainer: EditorDecorationContainer get() = binding.decorationContainer @@ -61,6 +55,7 @@ abstract class MediaPlaceholder( with(itemView) { setOnClickListener { placeholderClick(item.id, clicked) } } + binding.progressBar.invisible() } open fun processChangePayload(payloads: List, item: BlockView) { diff --git a/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/holders/placeholders/PicturePlaceholder.kt b/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/holders/placeholders/PicturePlaceholder.kt index 34f9378aa9..fc0cbf1188 100644 --- a/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/holders/placeholders/PicturePlaceholder.kt +++ b/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/holders/placeholders/PicturePlaceholder.kt @@ -2,6 +2,7 @@ package com.anytypeio.anytype.core_ui.features.editor.holders.placeholders import com.anytypeio.anytype.core_ui.R import com.anytypeio.anytype.core_ui.databinding.ItemBlockMediaPlaceholderBinding +import com.anytypeio.anytype.core_ui.extensions.drawable import com.anytypeio.anytype.presentation.editor.editor.listener.ListenerType class PicturePlaceholder(binding: ItemBlockMediaPlaceholderBinding) : MediaPlaceholder(binding) { @@ -12,6 +13,6 @@ class PicturePlaceholder(binding: ItemBlockMediaPlaceholderBinding) : MediaPlace override fun setup() { title.text = itemView.resources.getString(R.string.hint_upload_image) - title.setCompoundDrawablesRelativeWithIntrinsicBounds(R.drawable.ic_picture, 0, 0, 0) + binding.fileIcon.setImageDrawable(itemView.context.drawable(R.drawable.ic_picture)) } } \ No newline at end of file diff --git a/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/holders/placeholders/VideoPlaceholder.kt b/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/holders/placeholders/VideoPlaceholder.kt index 940db02b11..0a54e11d49 100644 --- a/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/holders/placeholders/VideoPlaceholder.kt +++ b/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/holders/placeholders/VideoPlaceholder.kt @@ -2,6 +2,7 @@ package com.anytypeio.anytype.core_ui.features.editor.holders.placeholders import com.anytypeio.anytype.core_ui.R import com.anytypeio.anytype.core_ui.databinding.ItemBlockMediaPlaceholderBinding +import com.anytypeio.anytype.core_ui.extensions.drawable import com.anytypeio.anytype.presentation.editor.editor.listener.ListenerType class VideoPlaceholder(binding: ItemBlockMediaPlaceholderBinding) : MediaPlaceholder(binding) { @@ -12,6 +13,6 @@ class VideoPlaceholder(binding: ItemBlockMediaPlaceholderBinding) : MediaPlaceho override fun setup() { title.text = itemView.resources.getString(R.string.hint_upload_video) - title.setCompoundDrawablesRelativeWithIntrinsicBounds(R.drawable.ic_video, 0, 0, 0) + binding.fileIcon.setImageDrawable(itemView.context.drawable(R.drawable.ic_video)) } } \ No newline at end of file diff --git a/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/holders/upload/BookmarkUpload.kt b/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/holders/upload/BookmarkUpload.kt index 6f35759aaf..66a8258793 100644 --- a/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/holders/upload/BookmarkUpload.kt +++ b/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/holders/upload/BookmarkUpload.kt @@ -1,54 +1,27 @@ package com.anytypeio.anytype.core_ui.features.editor.holders.upload -import android.view.View -import android.widget.FrameLayout import com.anytypeio.anytype.core_models.Url -import com.anytypeio.anytype.core_ui.BuildConfig import com.anytypeio.anytype.core_ui.R -import com.anytypeio.anytype.core_ui.databinding.ItemBlockBookmarkUploadingBinding -import com.anytypeio.anytype.core_ui.databinding.ItemBlockFileUploadingBinding -import com.anytypeio.anytype.core_ui.features.editor.BlockViewDiffUtil +import com.anytypeio.anytype.core_ui.databinding.ItemBlockMediaPlaceholderBinding +import com.anytypeio.anytype.core_ui.extensions.drawable import com.anytypeio.anytype.core_ui.features.editor.decoration.DecoratableCardViewHolder -import com.anytypeio.anytype.core_ui.features.editor.decoration.EditorDecorationContainer -import com.anytypeio.anytype.core_ui.features.editor.decoration.applySelectorOffset -import com.anytypeio.anytype.core_utils.ext.dimen -import com.anytypeio.anytype.core_utils.ext.indentize import com.anytypeio.anytype.presentation.editor.editor.listener.ListenerType import com.anytypeio.anytype.presentation.editor.editor.model.BlockView class BookmarkUpload( - private val binding: ItemBlockBookmarkUploadingBinding -) : MediaUpload(binding.root), DecoratableCardViewHolder { - - override val root: View = itemView - - override val decoratableContainer: EditorDecorationContainer - get() = binding.decorationContainer - - override val decoratableCard: View = binding.card + binding: ItemBlockMediaPlaceholderBinding +) : MediaUpload(binding), DecoratableCardViewHolder { override fun uploadClick(target: String, clicked: (ListenerType) -> Unit) { - clicked(ListenerType.File.Upload(target)) + clicked(ListenerType.Bookmark.Upload(target)) } fun setUrl(url: Url?) { - binding.editUrl.text = url + binding.fileName.text = url } - @Deprecated("Pre-nested-styling legacy.") - override fun indentize(item: BlockView.Indentable) { - // Do nothing. - } - - override fun select(isSelected: Boolean) { - binding.selected.isSelected = isSelected - } - - override fun applyDecorations(decorations: List) { - super.applyDecorations(decorations) - binding.selected.applySelectorOffset( - content = binding.card, - res = itemView.resources - ) + override fun bind(item: BlockView.Upload, clicked: (ListenerType) -> Unit) { + super.bind(item, clicked) + binding.fileIcon.setImageDrawable(itemView.context.drawable(R.drawable.ic_bookmark_inactive)) } } \ No newline at end of file diff --git a/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/holders/upload/FileUpload.kt b/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/holders/upload/FileUpload.kt index 790f0bff99..3517dac70e 100644 --- a/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/holders/upload/FileUpload.kt +++ b/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/holders/upload/FileUpload.kt @@ -1,47 +1,22 @@ package com.anytypeio.anytype.core_ui.features.editor.holders.upload -import android.view.View -import android.widget.FrameLayout -import com.anytypeio.anytype.core_ui.BuildConfig import com.anytypeio.anytype.core_ui.R -import com.anytypeio.anytype.core_ui.databinding.ItemBlockFileUploadingBinding +import com.anytypeio.anytype.core_ui.databinding.ItemBlockMediaPlaceholderBinding +import com.anytypeio.anytype.core_ui.extensions.drawable import com.anytypeio.anytype.core_ui.features.editor.decoration.DecoratableCardViewHolder -import com.anytypeio.anytype.core_ui.features.editor.decoration.EditorDecorationContainer -import com.anytypeio.anytype.core_ui.features.editor.decoration.applySelectorOffset -import com.anytypeio.anytype.core_utils.ext.dimen -import com.anytypeio.anytype.core_utils.ext.indentize import com.anytypeio.anytype.presentation.editor.editor.listener.ListenerType import com.anytypeio.anytype.presentation.editor.editor.model.BlockView class FileUpload( - private val binding: ItemBlockFileUploadingBinding -) : MediaUpload(binding.root), DecoratableCardViewHolder { - - override val root: View = itemView - - override val decoratableContainer: EditorDecorationContainer - get() = binding.decorationContainer - - override val decoratableCard: View = binding.card + binding: ItemBlockMediaPlaceholderBinding +) : MediaUpload(binding), DecoratableCardViewHolder { override fun uploadClick(target: String, clicked: (ListenerType) -> Unit) { clicked(ListenerType.File.Upload(target)) } - @Deprecated("Pre-nested-styling legacy.") - override fun indentize(item: BlockView.Indentable) { - // Do nothing. - } - - override fun select(isSelected: Boolean) { - binding.selected.isSelected = isSelected - } - - override fun applyDecorations(decorations: List) { - super.applyDecorations(decorations) - binding.selected.applySelectorOffset( - content = binding.card, - res = itemView.resources - ) + override fun bind(item: BlockView.Upload, clicked: (ListenerType) -> Unit) { + super.bind(item, clicked) + binding.fileIcon.setImageDrawable(itemView.context.drawable(R.drawable.ic_file_light_inactive)) } } \ No newline at end of file diff --git a/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/holders/upload/MediaUpload.kt b/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/holders/upload/MediaUpload.kt index e23a3e5608..6f23d572da 100644 --- a/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/holders/upload/MediaUpload.kt +++ b/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/holders/upload/MediaUpload.kt @@ -1,29 +1,27 @@ package com.anytypeio.anytype.core_ui.features.editor.holders.upload import android.view.View -import androidx.core.view.updateLayoutParams -import androidx.core.view.updatePadding -import androidx.recyclerview.widget.RecyclerView -import com.anytypeio.anytype.core_ui.BuildConfig -import com.anytypeio.anytype.core_ui.R +import android.widget.FrameLayout +import com.anytypeio.anytype.core_ui.databinding.ItemBlockMediaPlaceholderBinding import com.anytypeio.anytype.core_ui.features.editor.BlockViewDiffUtil import com.anytypeio.anytype.core_ui.features.editor.BlockViewHolder import com.anytypeio.anytype.core_ui.features.editor.EditorTouchProcessor import com.anytypeio.anytype.core_ui.features.editor.SupportCustomTouchProcessor -import com.anytypeio.anytype.core_utils.ext.dimen +import com.anytypeio.anytype.core_ui.features.editor.decoration.DecoratableCardViewHolder +import com.anytypeio.anytype.core_ui.features.editor.decoration.EditorDecorationContainer +import com.anytypeio.anytype.core_ui.features.editor.decoration.applySelectorOffset import com.anytypeio.anytype.presentation.editor.editor.listener.ListenerType import com.anytypeio.anytype.presentation.editor.editor.model.BlockView abstract class MediaUpload( - view: View -) : BlockViewHolder(view), + val binding: ItemBlockMediaPlaceholderBinding +) : BlockViewHolder(binding.root), BlockViewHolder.IndentableHolder, - SupportCustomTouchProcessor { + SupportCustomTouchProcessor, DecoratableCardViewHolder { - abstract val root: View + override val decoratableContainer: EditorDecorationContainer get() = binding.decorationContainer + override val decoratableCard: View get() = binding.card abstract fun uploadClick(target: String, clicked: (ListenerType) -> Unit) - abstract override fun indentize(item: BlockView.Indentable) - abstract fun select(isSelected: Boolean) override val editorTouchProcessor = EditorTouchProcessor( fallback = { e -> itemView.onTouchEvent(e) } @@ -33,11 +31,10 @@ abstract class MediaUpload( itemView.setOnTouchListener { v, e -> editorTouchProcessor.process(v, e) } } - fun bind( + open fun bind( item: BlockView.Upload, clicked: (ListenerType) -> Unit ) { - indentize(item) select(item.isSelected) with(itemView) { setOnClickListener { uploadClick(item.id, clicked) } @@ -52,4 +49,21 @@ abstract class MediaUpload( } } } + + fun select(isSelected: Boolean) { + binding.selected.isSelected = isSelected + } + + @Deprecated("Pre-nested-styling legacy.") + override fun indentize(item: BlockView.Indentable) { + // Do nothing. + } + + override fun applyDecorations(decorations: List) { + super.applyDecorations(decorations) + binding.selected.applySelectorOffset( + content = binding.card, + res = itemView.resources + ) + } } \ No newline at end of file diff --git a/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/holders/upload/PictureUpload.kt b/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/holders/upload/PictureUpload.kt index b28de40bbf..5f299daa49 100644 --- a/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/holders/upload/PictureUpload.kt +++ b/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/holders/upload/PictureUpload.kt @@ -1,38 +1,22 @@ package com.anytypeio.anytype.core_ui.features.editor.holders.upload -import android.view.View -import com.anytypeio.anytype.core_ui.BuildConfig import com.anytypeio.anytype.core_ui.R -import com.anytypeio.anytype.core_ui.databinding.ItemBlockPictureUploadingBinding +import com.anytypeio.anytype.core_ui.databinding.ItemBlockMediaPlaceholderBinding +import com.anytypeio.anytype.core_ui.extensions.drawable import com.anytypeio.anytype.core_ui.features.editor.decoration.DecoratableCardViewHolder -import com.anytypeio.anytype.core_ui.features.editor.decoration.DecoratableViewHolder -import com.anytypeio.anytype.core_ui.features.editor.decoration.EditorDecorationContainer -import com.anytypeio.anytype.core_utils.ext.dimen -import com.anytypeio.anytype.core_utils.ext.indentize import com.anytypeio.anytype.presentation.editor.editor.listener.ListenerType import com.anytypeio.anytype.presentation.editor.editor.model.BlockView class PictureUpload( - private val binding: ItemBlockPictureUploadingBinding -) : MediaUpload(binding.root), DecoratableViewHolder, DecoratableCardViewHolder { - - override val root: View = itemView - - override val decoratableContainer: EditorDecorationContainer - get() = binding.decorationContainer - - override val decoratableCard: View get() = binding.card + binding: ItemBlockMediaPlaceholderBinding +) : MediaUpload(binding), DecoratableCardViewHolder { override fun uploadClick(target: String, clicked: (ListenerType) -> Unit) { clicked(ListenerType.Video.Upload(target)) } - @Deprecated("Pre-nested-styling legacy.") - override fun indentize(item: BlockView.Indentable) { - // Do nothing. - } - - override fun select(isSelected: Boolean) { - root.isSelected = isSelected + override fun bind(item: BlockView.Upload, clicked: (ListenerType) -> Unit) { + super.bind(item, clicked) + binding.fileIcon.setImageDrawable(itemView.context.drawable(R.drawable.ic_picture_inactive)) } } \ No newline at end of file diff --git a/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/holders/upload/VideoUpload.kt b/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/holders/upload/VideoUpload.kt index 411c2f958c..52d808b3fd 100644 --- a/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/holders/upload/VideoUpload.kt +++ b/core-ui/src/main/java/com/anytypeio/anytype/core_ui/features/editor/holders/upload/VideoUpload.kt @@ -1,47 +1,22 @@ package com.anytypeio.anytype.core_ui.features.editor.holders.upload -import android.view.View -import android.widget.FrameLayout -import com.anytypeio.anytype.core_ui.BuildConfig import com.anytypeio.anytype.core_ui.R -import com.anytypeio.anytype.core_ui.databinding.ItemBlockVideoUploadingBinding +import com.anytypeio.anytype.core_ui.databinding.ItemBlockMediaPlaceholderBinding +import com.anytypeio.anytype.core_ui.extensions.drawable import com.anytypeio.anytype.core_ui.features.editor.decoration.DecoratableCardViewHolder -import com.anytypeio.anytype.core_ui.features.editor.decoration.EditorDecorationContainer -import com.anytypeio.anytype.core_ui.features.editor.decoration.applySelectorOffset -import com.anytypeio.anytype.core_utils.ext.dimen -import com.anytypeio.anytype.core_utils.ext.indentize import com.anytypeio.anytype.presentation.editor.editor.listener.ListenerType import com.anytypeio.anytype.presentation.editor.editor.model.BlockView class VideoUpload( - val binding: ItemBlockVideoUploadingBinding -) : MediaUpload(binding.root), DecoratableCardViewHolder { - - override val root: View = itemView - - override val decoratableContainer: EditorDecorationContainer - get() = binding.decorationContainer - - override val decoratableCard: View = binding.card + binding: ItemBlockMediaPlaceholderBinding +) : MediaUpload(binding), DecoratableCardViewHolder { override fun uploadClick(target: String, clicked: (ListenerType) -> Unit) { clicked(ListenerType.Video.Upload(target)) } - @Deprecated("Pre-nested-styling legacy.") - override fun indentize(item: BlockView.Indentable) { - // Do nothing. - } - - override fun select(isSelected: Boolean) { - binding.selected.isSelected = isSelected - } - - override fun applyDecorations(decorations: List) { - super.applyDecorations(decorations) - binding.selected.applySelectorOffset( - content = binding.card, - res = itemView.resources - ) + override fun bind(item: BlockView.Upload, clicked: (ListenerType) -> Unit) { + super.bind(item, clicked) + binding.fileIcon.setImageDrawable(itemView.context.drawable(R.drawable.ic_video_inactive)) } } \ No newline at end of file diff --git a/core-ui/src/main/res/drawable/ic_bookmark_block_loading.xml b/core-ui/src/main/res/drawable/ic_bookmark_block_loading.xml deleted file mode 100644 index 998523650c..0000000000 --- a/core-ui/src/main/res/drawable/ic_bookmark_block_loading.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - diff --git a/core-ui/src/main/res/drawable/ic_bookmark_inactive.xml b/core-ui/src/main/res/drawable/ic_bookmark_inactive.xml new file mode 100644 index 0000000000..d45d84ab15 --- /dev/null +++ b/core-ui/src/main/res/drawable/ic_bookmark_inactive.xml @@ -0,0 +1,11 @@ + + + diff --git a/core-ui/src/main/res/drawable/ic_file_light_inactive.xml b/core-ui/src/main/res/drawable/ic_file_light_inactive.xml new file mode 100644 index 0000000000..f60d210cfa --- /dev/null +++ b/core-ui/src/main/res/drawable/ic_file_light_inactive.xml @@ -0,0 +1,27 @@ + + + + + + + + + diff --git a/core-ui/src/main/res/drawable/ic_picture_inactive.xml b/core-ui/src/main/res/drawable/ic_picture_inactive.xml new file mode 100644 index 0000000000..8b36bfb58a --- /dev/null +++ b/core-ui/src/main/res/drawable/ic_picture_inactive.xml @@ -0,0 +1,17 @@ + + + + + diff --git a/core-ui/src/main/res/drawable/ic_video_inactive.xml b/core-ui/src/main/res/drawable/ic_video_inactive.xml new file mode 100644 index 0000000000..67d153e441 --- /dev/null +++ b/core-ui/src/main/res/drawable/ic_video_inactive.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/core-ui/src/main/res/layout/item_block_bookmark_uploading.xml b/core-ui/src/main/res/layout/item_block_bookmark_uploading.xml deleted file mode 100644 index 349e40fa45..0000000000 --- a/core-ui/src/main/res/layout/item_block_bookmark_uploading.xml +++ /dev/null @@ -1,68 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/core-ui/src/main/res/layout/item_block_file.xml b/core-ui/src/main/res/layout/item_block_file.xml index 600be2d979..ba0488bd1e 100644 --- a/core-ui/src/main/res/layout/item_block_file.xml +++ b/core-ui/src/main/res/layout/item_block_file.xml @@ -18,6 +18,8 @@ android:paddingEnd="@dimen/default_document_content_padding_start" android:layout_width="match_parent" android:layout_height="wrap_content" + android:paddingTop="@dimen/dp_4" + android:paddingBottom="@dimen/dp_4" android:background="@drawable/item_block_multi_select_mode_selector" tools:background="@drawable/item_block_multi_select_selected"> @@ -30,17 +32,25 @@ - - - - - - - - - - - - - - - - - - diff --git a/core-ui/src/main/res/layout/item_block_media_error.xml b/core-ui/src/main/res/layout/item_block_media_error.xml new file mode 100644 index 0000000000..77c7c90cfa --- /dev/null +++ b/core-ui/src/main/res/layout/item_block_media_error.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core-ui/src/main/res/layout/item_block_media_placeholder.xml b/core-ui/src/main/res/layout/item_block_media_placeholder.xml index 15742d1b93..fe922862b6 100644 --- a/core-ui/src/main/res/layout/item_block_media_placeholder.xml +++ b/core-ui/src/main/res/layout/item_block_media_placeholder.xml @@ -1,5 +1,6 @@ + android:layout_height="52dp"> - + android:layout_height="match_parent"> + + + + + + + + + - - - - - - - - - - - - - - \ No newline at end of file diff --git a/core-ui/src/main/res/layout/item_block_video_uploading.xml b/core-ui/src/main/res/layout/item_block_video_uploading.xml deleted file mode 100644 index f0041d7371..0000000000 --- a/core-ui/src/main/res/layout/item_block_video_uploading.xml +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/core-ui/src/main/res/values/styles.xml b/core-ui/src/main/res/values/styles.xml index a6d535b73f..8e4ed78a3b 100644 --- a/core-ui/src/main/res/values/styles.xml +++ b/core-ui/src/main/res/values/styles.xml @@ -652,16 +652,6 @@ @dimen/default_graphic_text_graphic_margin_top - - -