2019-12-19 19:09:40 +01:00
|
|
|
/* Copyright 2019 Tusky Contributors
|
|
|
|
*
|
|
|
|
* This file is a part of Tusky.
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or modify it under the terms of the
|
|
|
|
* GNU General Public License as published by the Free Software Foundation; either version 3 of the
|
|
|
|
* License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
|
|
|
|
* the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
|
|
|
* Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License along with Tusky; if not,
|
|
|
|
* see <http://www.gnu.org/licenses>. */
|
|
|
|
|
|
|
|
package com.keylesspalace.tusky.components.compose
|
|
|
|
|
|
|
|
import android.content.Context
|
|
|
|
import android.view.View
|
|
|
|
import android.view.ViewGroup
|
|
|
|
import android.widget.ImageView
|
|
|
|
import android.widget.PopupMenu
|
|
|
|
import androidx.constraintlayout.widget.ConstraintLayout
|
|
|
|
import androidx.recyclerview.widget.AsyncListDiffer
|
|
|
|
import androidx.recyclerview.widget.DiffUtil
|
|
|
|
import androidx.recyclerview.widget.RecyclerView
|
|
|
|
import com.bumptech.glide.Glide
|
|
|
|
import com.bumptech.glide.load.engine.DiskCacheStrategy
|
|
|
|
import com.keylesspalace.tusky.R
|
|
|
|
import com.keylesspalace.tusky.components.compose.view.ProgressImageView
|
|
|
|
|
|
|
|
class MediaPreviewAdapter(
|
2021-06-28 21:13:24 +02:00
|
|
|
context: Context,
|
|
|
|
private val onAddCaption: (ComposeActivity.QueuedMedia) -> Unit,
|
Add UI for image-attachment "focus" (#2620)
* Attempt-zero implementation of a "focus" feature for image attachments. Choose "Set focus" in the attachment menu, tap once to select focus point (no visual feedback currently), tap "OK". Works in tests.
* Remove code duplication between 'update description' and 'update focus'
* Fix ktlint/bitrise failures
* Make updateMediaItem private
* When focus is set on a post attachment the preview focuses correctly. ProgressImageView now inherits from MediaPreviewImageView.
* Replace use of PointF for Focus where focus is represented, fix ktlint
* Substitute 'focus' for 'focus point' in strings
* First attempt draw focus point. Only updates on initial load. Modeled on code from RoundedCorners builtin from Glide
* Redraw focus after each tap
* Dark curtain where focus isn't (now looks like mastosoc)
* Correct ktlint for FocusDialog
* draft: switch to overlay for focus indicator
* Draw focus circle, but ImageView and FocusIndicatorView seem to share a single canvas
* Switch focus circle to path approach
* Correctly scale, save and load focuses. Clamp to visible area. Focus editor looks and feels right
* ktlint fixes and comments
* Focus indicator drawing should use device-independent pixels
* Shrink focus window when it gets unattractively tall (no linting, misbehaves on wide aspect ratio screens)
* Correct max-height behavior for screens in landscape mode
* Focus attachment result is are flipped on x axis; fix this
* Correctly thread focus through on scheduled posts, redrafted posts, and drafts (but draft focus is lost on post)
* More focus ktlint fixes
* Fix specific case where a draft is given a focus, then deleted, then posted in that order
* Fix accidental file change in focus PR
* ktLint fix
* Fix property style warnings in focus
* Fix remaining style warnings from focus PR
Co-authored-by: Conny Duck <k.pozniak@gmx.at>
2022-09-21 20:28:06 +02:00
|
|
|
private val onAddFocus: (ComposeActivity.QueuedMedia) -> Unit,
|
2022-05-22 21:01:14 +02:00
|
|
|
private val onEditImage: (ComposeActivity.QueuedMedia) -> Unit,
|
2021-06-28 21:13:24 +02:00
|
|
|
private val onRemove: (ComposeActivity.QueuedMedia) -> Unit
|
2019-12-19 19:09:40 +01:00
|
|
|
) : RecyclerView.Adapter<MediaPreviewAdapter.PreviewViewHolder>() {
|
|
|
|
|
|
|
|
fun submitList(list: List<ComposeActivity.QueuedMedia>) {
|
|
|
|
this.differ.submitList(list)
|
|
|
|
}
|
|
|
|
|
|
|
|
private fun onMediaClick(position: Int, view: View) {
|
|
|
|
val item = differ.currentList[position]
|
|
|
|
val popup = PopupMenu(view.context, view)
|
|
|
|
val addCaptionId = 1
|
Add UI for image-attachment "focus" (#2620)
* Attempt-zero implementation of a "focus" feature for image attachments. Choose "Set focus" in the attachment menu, tap once to select focus point (no visual feedback currently), tap "OK". Works in tests.
* Remove code duplication between 'update description' and 'update focus'
* Fix ktlint/bitrise failures
* Make updateMediaItem private
* When focus is set on a post attachment the preview focuses correctly. ProgressImageView now inherits from MediaPreviewImageView.
* Replace use of PointF for Focus where focus is represented, fix ktlint
* Substitute 'focus' for 'focus point' in strings
* First attempt draw focus point. Only updates on initial load. Modeled on code from RoundedCorners builtin from Glide
* Redraw focus after each tap
* Dark curtain where focus isn't (now looks like mastosoc)
* Correct ktlint for FocusDialog
* draft: switch to overlay for focus indicator
* Draw focus circle, but ImageView and FocusIndicatorView seem to share a single canvas
* Switch focus circle to path approach
* Correctly scale, save and load focuses. Clamp to visible area. Focus editor looks and feels right
* ktlint fixes and comments
* Focus indicator drawing should use device-independent pixels
* Shrink focus window when it gets unattractively tall (no linting, misbehaves on wide aspect ratio screens)
* Correct max-height behavior for screens in landscape mode
* Focus attachment result is are flipped on x axis; fix this
* Correctly thread focus through on scheduled posts, redrafted posts, and drafts (but draft focus is lost on post)
* More focus ktlint fixes
* Fix specific case where a draft is given a focus, then deleted, then posted in that order
* Fix accidental file change in focus PR
* ktLint fix
* Fix property style warnings in focus
* Fix remaining style warnings from focus PR
Co-authored-by: Conny Duck <k.pozniak@gmx.at>
2022-09-21 20:28:06 +02:00
|
|
|
val addFocusId = 2
|
|
|
|
val editImageId = 3
|
|
|
|
val removeId = 4
|
2023-02-14 21:13:38 +01:00
|
|
|
|
|
|
|
popup.menu.add(0, addCaptionId, 0, R.string.action_set_caption)
|
|
|
|
if (item.type == ComposeActivity.QueuedMedia.Type.IMAGE) {
|
|
|
|
popup.menu.add(0, addFocusId, 0, R.string.action_set_focus)
|
|
|
|
if (item.state != ComposeActivity.QueuedMedia.State.PUBLISHED) {
|
|
|
|
// Already-published items can't be edited
|
2022-12-08 10:18:12 +01:00
|
|
|
popup.menu.add(0, editImageId, 0, R.string.action_edit_image)
|
|
|
|
}
|
Add UI for image-attachment "focus" (#2620)
* Attempt-zero implementation of a "focus" feature for image attachments. Choose "Set focus" in the attachment menu, tap once to select focus point (no visual feedback currently), tap "OK". Works in tests.
* Remove code duplication between 'update description' and 'update focus'
* Fix ktlint/bitrise failures
* Make updateMediaItem private
* When focus is set on a post attachment the preview focuses correctly. ProgressImageView now inherits from MediaPreviewImageView.
* Replace use of PointF for Focus where focus is represented, fix ktlint
* Substitute 'focus' for 'focus point' in strings
* First attempt draw focus point. Only updates on initial load. Modeled on code from RoundedCorners builtin from Glide
* Redraw focus after each tap
* Dark curtain where focus isn't (now looks like mastosoc)
* Correct ktlint for FocusDialog
* draft: switch to overlay for focus indicator
* Draw focus circle, but ImageView and FocusIndicatorView seem to share a single canvas
* Switch focus circle to path approach
* Correctly scale, save and load focuses. Clamp to visible area. Focus editor looks and feels right
* ktlint fixes and comments
* Focus indicator drawing should use device-independent pixels
* Shrink focus window when it gets unattractively tall (no linting, misbehaves on wide aspect ratio screens)
* Correct max-height behavior for screens in landscape mode
* Focus attachment result is are flipped on x axis; fix this
* Correctly thread focus through on scheduled posts, redrafted posts, and drafts (but draft focus is lost on post)
* More focus ktlint fixes
* Fix specific case where a draft is given a focus, then deleted, then posted in that order
* Fix accidental file change in focus PR
* ktLint fix
* Fix property style warnings in focus
* Fix remaining style warnings from focus PR
Co-authored-by: Conny Duck <k.pozniak@gmx.at>
2022-09-21 20:28:06 +02:00
|
|
|
}
|
2019-12-19 19:09:40 +01:00
|
|
|
popup.menu.add(0, removeId, 0, R.string.action_remove)
|
|
|
|
popup.setOnMenuItemClickListener { menuItem ->
|
|
|
|
when (menuItem.itemId) {
|
|
|
|
addCaptionId -> onAddCaption(item)
|
Add UI for image-attachment "focus" (#2620)
* Attempt-zero implementation of a "focus" feature for image attachments. Choose "Set focus" in the attachment menu, tap once to select focus point (no visual feedback currently), tap "OK". Works in tests.
* Remove code duplication between 'update description' and 'update focus'
* Fix ktlint/bitrise failures
* Make updateMediaItem private
* When focus is set on a post attachment the preview focuses correctly. ProgressImageView now inherits from MediaPreviewImageView.
* Replace use of PointF for Focus where focus is represented, fix ktlint
* Substitute 'focus' for 'focus point' in strings
* First attempt draw focus point. Only updates on initial load. Modeled on code from RoundedCorners builtin from Glide
* Redraw focus after each tap
* Dark curtain where focus isn't (now looks like mastosoc)
* Correct ktlint for FocusDialog
* draft: switch to overlay for focus indicator
* Draw focus circle, but ImageView and FocusIndicatorView seem to share a single canvas
* Switch focus circle to path approach
* Correctly scale, save and load focuses. Clamp to visible area. Focus editor looks and feels right
* ktlint fixes and comments
* Focus indicator drawing should use device-independent pixels
* Shrink focus window when it gets unattractively tall (no linting, misbehaves on wide aspect ratio screens)
* Correct max-height behavior for screens in landscape mode
* Focus attachment result is are flipped on x axis; fix this
* Correctly thread focus through on scheduled posts, redrafted posts, and drafts (but draft focus is lost on post)
* More focus ktlint fixes
* Fix specific case where a draft is given a focus, then deleted, then posted in that order
* Fix accidental file change in focus PR
* ktLint fix
* Fix property style warnings in focus
* Fix remaining style warnings from focus PR
Co-authored-by: Conny Duck <k.pozniak@gmx.at>
2022-09-21 20:28:06 +02:00
|
|
|
addFocusId -> onAddFocus(item)
|
2022-05-22 21:01:14 +02:00
|
|
|
editImageId -> onEditImage(item)
|
2019-12-19 19:09:40 +01:00
|
|
|
removeId -> onRemove(item)
|
|
|
|
}
|
|
|
|
true
|
|
|
|
}
|
|
|
|
popup.show()
|
|
|
|
}
|
|
|
|
|
|
|
|
private val thumbnailViewSize =
|
2021-06-28 21:13:24 +02:00
|
|
|
context.resources.getDimensionPixelSize(R.dimen.compose_media_preview_size)
|
2019-12-19 19:09:40 +01:00
|
|
|
|
|
|
|
override fun getItemCount(): Int = differ.currentList.size
|
|
|
|
|
|
|
|
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PreviewViewHolder {
|
|
|
|
return PreviewViewHolder(ProgressImageView(parent.context))
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onBindViewHolder(holder: PreviewViewHolder, position: Int) {
|
|
|
|
val item = differ.currentList[position]
|
|
|
|
holder.progressImageView.setChecked(!item.description.isNullOrEmpty())
|
|
|
|
holder.progressImageView.setProgress(item.uploadPercent)
|
2020-01-16 19:05:52 +01:00
|
|
|
if (item.type == ComposeActivity.QueuedMedia.Type.AUDIO) {
|
|
|
|
// TODO: Fancy waveform display?
|
|
|
|
holder.progressImageView.setImageResource(R.drawable.ic_music_box_preview_24dp)
|
|
|
|
} else {
|
Add UI for image-attachment "focus" (#2620)
* Attempt-zero implementation of a "focus" feature for image attachments. Choose "Set focus" in the attachment menu, tap once to select focus point (no visual feedback currently), tap "OK". Works in tests.
* Remove code duplication between 'update description' and 'update focus'
* Fix ktlint/bitrise failures
* Make updateMediaItem private
* When focus is set on a post attachment the preview focuses correctly. ProgressImageView now inherits from MediaPreviewImageView.
* Replace use of PointF for Focus where focus is represented, fix ktlint
* Substitute 'focus' for 'focus point' in strings
* First attempt draw focus point. Only updates on initial load. Modeled on code from RoundedCorners builtin from Glide
* Redraw focus after each tap
* Dark curtain where focus isn't (now looks like mastosoc)
* Correct ktlint for FocusDialog
* draft: switch to overlay for focus indicator
* Draw focus circle, but ImageView and FocusIndicatorView seem to share a single canvas
* Switch focus circle to path approach
* Correctly scale, save and load focuses. Clamp to visible area. Focus editor looks and feels right
* ktlint fixes and comments
* Focus indicator drawing should use device-independent pixels
* Shrink focus window when it gets unattractively tall (no linting, misbehaves on wide aspect ratio screens)
* Correct max-height behavior for screens in landscape mode
* Focus attachment result is are flipped on x axis; fix this
* Correctly thread focus through on scheduled posts, redrafted posts, and drafts (but draft focus is lost on post)
* More focus ktlint fixes
* Fix specific case where a draft is given a focus, then deleted, then posted in that order
* Fix accidental file change in focus PR
* ktLint fix
* Fix property style warnings in focus
* Fix remaining style warnings from focus PR
Co-authored-by: Conny Duck <k.pozniak@gmx.at>
2022-09-21 20:28:06 +02:00
|
|
|
val imageView = holder.progressImageView
|
|
|
|
val focus = item.focus
|
|
|
|
|
|
|
|
if (focus != null)
|
|
|
|
imageView.setFocalPoint(focus)
|
|
|
|
else
|
|
|
|
imageView.removeFocalPoint() // Probably unnecessary since we have no UI for removal once added.
|
|
|
|
|
|
|
|
var glide = Glide.with(holder.itemView.context)
|
2021-06-28 21:13:24 +02:00
|
|
|
.load(item.uri)
|
|
|
|
.diskCacheStrategy(DiskCacheStrategy.NONE)
|
|
|
|
.dontAnimate()
|
Add UI for image-attachment "focus" (#2620)
* Attempt-zero implementation of a "focus" feature for image attachments. Choose "Set focus" in the attachment menu, tap once to select focus point (no visual feedback currently), tap "OK". Works in tests.
* Remove code duplication between 'update description' and 'update focus'
* Fix ktlint/bitrise failures
* Make updateMediaItem private
* When focus is set on a post attachment the preview focuses correctly. ProgressImageView now inherits from MediaPreviewImageView.
* Replace use of PointF for Focus where focus is represented, fix ktlint
* Substitute 'focus' for 'focus point' in strings
* First attempt draw focus point. Only updates on initial load. Modeled on code from RoundedCorners builtin from Glide
* Redraw focus after each tap
* Dark curtain where focus isn't (now looks like mastosoc)
* Correct ktlint for FocusDialog
* draft: switch to overlay for focus indicator
* Draw focus circle, but ImageView and FocusIndicatorView seem to share a single canvas
* Switch focus circle to path approach
* Correctly scale, save and load focuses. Clamp to visible area. Focus editor looks and feels right
* ktlint fixes and comments
* Focus indicator drawing should use device-independent pixels
* Shrink focus window when it gets unattractively tall (no linting, misbehaves on wide aspect ratio screens)
* Correct max-height behavior for screens in landscape mode
* Focus attachment result is are flipped on x axis; fix this
* Correctly thread focus through on scheduled posts, redrafted posts, and drafts (but draft focus is lost on post)
* More focus ktlint fixes
* Fix specific case where a draft is given a focus, then deleted, then posted in that order
* Fix accidental file change in focus PR
* ktLint fix
* Fix property style warnings in focus
* Fix remaining style warnings from focus PR
Co-authored-by: Conny Duck <k.pozniak@gmx.at>
2022-09-21 20:28:06 +02:00
|
|
|
.centerInside()
|
|
|
|
|
|
|
|
if (focus != null)
|
|
|
|
glide = glide.addListener(imageView)
|
|
|
|
|
|
|
|
glide.into(imageView)
|
2020-01-16 19:05:52 +01:00
|
|
|
}
|
2019-12-19 19:09:40 +01:00
|
|
|
}
|
|
|
|
|
2021-06-28 21:13:24 +02:00
|
|
|
private val differ = AsyncListDiffer(
|
|
|
|
this,
|
|
|
|
object : DiffUtil.ItemCallback<ComposeActivity.QueuedMedia>() {
|
|
|
|
override fun areItemsTheSame(oldItem: ComposeActivity.QueuedMedia, newItem: ComposeActivity.QueuedMedia): Boolean {
|
|
|
|
return oldItem.localId == newItem.localId
|
|
|
|
}
|
2019-12-19 19:09:40 +01:00
|
|
|
|
2021-06-28 21:13:24 +02:00
|
|
|
override fun areContentsTheSame(oldItem: ComposeActivity.QueuedMedia, newItem: ComposeActivity.QueuedMedia): Boolean {
|
|
|
|
return oldItem == newItem
|
|
|
|
}
|
2019-12-19 19:09:40 +01:00
|
|
|
}
|
2021-06-28 21:13:24 +02:00
|
|
|
)
|
2019-12-19 19:09:40 +01:00
|
|
|
|
2021-06-28 21:13:24 +02:00
|
|
|
inner class PreviewViewHolder(val progressImageView: ProgressImageView) :
|
|
|
|
RecyclerView.ViewHolder(progressImageView) {
|
2019-12-19 19:09:40 +01:00
|
|
|
init {
|
|
|
|
val layoutParams = ConstraintLayout.LayoutParams(thumbnailViewSize, thumbnailViewSize)
|
|
|
|
val margin = itemView.context.resources
|
2021-06-28 21:13:24 +02:00
|
|
|
.getDimensionPixelSize(R.dimen.compose_media_preview_margin)
|
2019-12-19 19:09:40 +01:00
|
|
|
val marginBottom = itemView.context.resources
|
2021-06-28 21:13:24 +02:00
|
|
|
.getDimensionPixelSize(R.dimen.compose_media_preview_margin_bottom)
|
2019-12-19 19:09:40 +01:00
|
|
|
layoutParams.setMargins(margin, 0, margin, marginBottom)
|
|
|
|
progressImageView.layoutParams = layoutParams
|
|
|
|
progressImageView.scaleType = ImageView.ScaleType.CENTER_CROP
|
|
|
|
progressImageView.setOnClickListener {
|
2021-04-10 20:30:44 +02:00
|
|
|
onMediaClick(bindingAdapterPosition, progressImageView)
|
2019-12-19 19:09:40 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2021-06-28 21:13:24 +02:00
|
|
|
}
|