Skip to content

Commit

Permalink
Merge pull request #1944 from pantasystem/feature/unuse-recyclerview-…
Browse files Browse the repository at this point in the history
…url-preview

OGPの表示や画像や動画を除くファイルの表示にRecyclerViewを使用するのをやめた
  • Loading branch information
pantasystem authored Nov 5, 2023
2 parents 8a84feb + 36b2f30 commit 41bd777
Show file tree
Hide file tree
Showing 14 changed files with 367 additions and 336 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,6 @@ class TimelineListAdapter(
cardActionListener.onReactionCountAction(it)
}

private val urlPreviewListRecyclerViewPool = RecyclerView.RecycledViewPool()
private val manyFilePreviewListViewRecyclerViewPool = RecyclerView.RecycledViewPool()

enum class ViewHolderType {
Expand Down Expand Up @@ -141,7 +140,7 @@ class TimelineListAdapter(
false
)
// binding.simpleNote.reactionView.setRecycledViewPool(reactionCounterRecyclerViewPool)
binding.simpleNote.urlPreviewList.setRecycledViewPool(urlPreviewListRecyclerViewPool)
// binding.simpleNote.urlPreviewList.setRecycledViewPool(urlPreviewListRecyclerViewPool)
binding.simpleNote.manyFilePreviewListView.setRecycledViewPool(
manyFilePreviewListViewRecyclerViewPool
)
Expand All @@ -160,7 +159,7 @@ class TimelineListAdapter(
false
)
// binding.simpleNote.reactionView.setRecycledViewPool(reactionCounterRecyclerViewPool)
binding.simpleNote.urlPreviewList.setRecycledViewPool(urlPreviewListRecyclerViewPool)
// binding.simpleNote.urlPreviewList.setRecycledViewPool(urlPreviewListRecyclerViewPool)
binding.simpleNote.manyFilePreviewListView.setRecycledViewPool(
manyFilePreviewListViewRecyclerViewPool
)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package net.pantasystem.milktea.note.url

import android.content.Context
import android.util.AttributeSet
import android.widget.ImageView
import android.widget.TextView
import androidx.constraintlayout.widget.ConstraintLayout
import net.pantasystem.milktea.model.file.FilePreviewSource
import net.pantasystem.milktea.note.R
import net.pantasystem.milktea.note.R.layout
import net.pantasystem.milktea.note.url.UrlPreviewHelper.setUrlPreviewThumbnail

class OtherFileView @JvmOverloads constructor(
context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : ConstraintLayout(
context, attrs, defStyleAttr
) {

private val fileThumbnailView: ImageView
private val fileNameView: TextView
private val fileTypeView: TextView
init {
inflate(context, layout.view_other_file, this)
fileThumbnailView = findViewById(R.id.fileThumbnailView)
fileNameView = findViewById(R.id.fileNameView)
fileTypeView = findViewById(R.id.fileTypeView)
}

fun setOtherFile(otherFile: FilePreviewSource) {
fileThumbnailView.setUrlPreviewThumbnail(otherFile.thumbnailUrl)
fileNameView.text = otherFile.name
fileTypeView.text = otherFile.type
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,38 +1,111 @@
package net.pantasystem.milktea.note.url

import android.annotation.SuppressLint
import android.app.Activity
import android.content.ActivityNotFoundException
import android.content.Intent
import android.net.Uri
import android.view.LayoutInflater
import android.view.View
import android.widget.ImageView
import android.widget.LinearLayout
import android.widget.Toast
import androidx.core.view.isVisible
import androidx.databinding.BindingAdapter
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import dagger.hilt.android.EntryPointAccessors
import dagger.hilt.android.internal.managers.FragmentComponentManager
import net.pantasystem.milktea.common_android_ui.NavigationEntryPointForBinding
import net.pantasystem.milktea.common_navigation.MediaNavigationArgs
import net.pantasystem.milktea.note.R
import net.pantasystem.milktea.note.databinding.ItemUrlOrFilePreviewBinding
import net.pantasystem.milktea.note.viewmodel.Preview

object UrlPreviewHelper {

@SuppressLint("IntentReset")
@JvmStatic
@BindingAdapter("previewList")
fun RecyclerView.setUrlPreviewList(previewList: List<Preview>?){
fun LinearLayout.setUrlPreviewList(previewList: List<Preview>?) {
this.visibility = View.GONE
if (previewList.isNullOrEmpty()) {
return
}

if(previewList.isNullOrEmpty()){
this.visibility = View.GONE
while(this.childCount > previewList.size){
this.removeViewAt(this.childCount - 1)
}

}else{
this.isNestedScrollingEnabled = false
this.visibility = View.VISIBLE
val adapter = (this.adapter as? PreviewListAdapter)?: PreviewListAdapter().also {
adapter = it
previewList.forEachIndexed { index, preview ->
val existsView: ItemUrlOrFilePreviewBinding? = this.getChildAt(index)?.let {
ItemUrlOrFilePreviewBinding.bind(it)
}

val lm = (this.layoutManager as? LinearLayoutManager) ?: LinearLayoutManager(this.context).also {
layoutManager = it
val view = existsView ?: ItemUrlOrFilePreviewBinding.inflate(LayoutInflater.from(this.context), this, false)

when(preview) {
is Preview.FileWrapper -> {
view.urlPreviewView.isVisible = false
view.filePreviewView.isVisible = true
view.filePreviewView.setOtherFile(preview.file)

view.filePreviewView.setOnClickListener { v ->

if (preview.file.type.startsWith("audio")) {
val activity = FragmentComponentManager.findActivity(v.context)
if (activity is Activity) {
val accessor = EntryPointAccessors.fromActivity(
activity,
NavigationEntryPointForBinding::class.java
)
val intent = accessor.mediaNavigation().newIntent(
MediaNavigationArgs.AFile(
preview.file
)
)
v.context?.startActivity(intent)
}
} else {
try {
v.context?.startActivity(
Intent().apply {
data = Uri.parse(preview.file.path)
type = preview.file.type
}
)
} catch (e: ActivityNotFoundException) {
Toast.makeText(
v.context,
context.getString(net.pantasystem.milktea.common_resource.R.string.no_app_available_to_open_this_file),
Toast.LENGTH_SHORT
).show()
}

}
}
}
is Preview.UrlWrapper -> {
view.urlPreviewView.isVisible = true
view.filePreviewView.isVisible = false
view.urlPreviewView.setUrlPreview(preview.urlPreview)


view.urlPreviewView.setOnClickListener {
context?.startActivity(
Intent(Intent.ACTION_VIEW).apply{
data = Uri.parse(preview.urlPreview.url)
}
)
}
}
}
lm.recycleChildrenOnDetach = true
adapter.submitList(previewList)

if(existsView == null){
this.addView(view.root)
}
}

this.visibility = View.VISIBLE
}

@JvmStatic
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package net.pantasystem.milktea.note.url

import android.content.Context
import android.util.AttributeSet
import android.widget.ImageView
import android.widget.TextView
import androidx.constraintlayout.widget.ConstraintLayout
import net.pantasystem.milktea.common_android.ui.CircleOutlineHelper.setCircleOutline
import net.pantasystem.milktea.model.url.UrlPreview
import net.pantasystem.milktea.note.R
import net.pantasystem.milktea.note.url.UrlPreviewHelper.setSiteIcon
import net.pantasystem.milktea.note.url.UrlPreviewHelper.setUrlPreviewThumbnail

class UrlPreviewView @JvmOverloads constructor(
context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
): ConstraintLayout(
context, attrs, defStyleAttr
) {

private val siteThumbnailView: ImageView
private val siteTitleView: TextView
private val siteDescription: TextView
private val siteIconView: ImageView
private val siteNameView: TextView

init {
inflate(context, R.layout.view_url_preview, this)
siteThumbnailView = findViewById(R.id.siteThumbnailView)
siteTitleView = findViewById(R.id.siteTitleView)
siteDescription = findViewById(R.id.siteDescription)
siteIconView = findViewById(R.id.siteIconView)
siteNameView = findViewById(R.id.siteNameView)
this.setCircleOutline(7)
}

fun setUrlPreview(urlPreview: UrlPreview) {
siteThumbnailView.setUrlPreviewThumbnail(urlPreview.thumbnail)
siteTitleView.text = urlPreview.title
siteDescription.text = urlPreview.description
siteIconView.setSiteIcon(urlPreview.icon)
siteNameView.text = urlPreview.siteName
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ class PlaneNoteViewDataCache(
private val getAccount: suspend () -> Account,
private val noteCaptureAdapter: NoteCaptureAPIAdapter,
private val translationStore: NoteTranslationStore,
private val GetUrlPreviewStore: suspend (Account) -> UrlPreviewStore?,
private val getUrlPreviewStore: suspend (Account) -> UrlPreviewStore?,
private val coroutineScope: CoroutineScope,
private val noteRelationGetter: NoteRelationGetter,
private val noteDataSource: NoteDataSource,
Expand Down Expand Up @@ -242,7 +242,7 @@ class PlaneNoteViewDataCache(
private suspend fun loadUrlPreview(note: PlaneNoteViewData) {
(note.textNode as? TextType.Misskey?)?.root?.getUrls()?.let { urls ->
UrlPreviewLoadTask(
GetUrlPreviewStore.invoke(getAccount.invoke()),
getUrlPreviewStore.invoke(getAccount.invoke()),
urls,
coroutineScope + Dispatchers.IO,
).load(note.urlPreviewLoadTaskCallback)
Expand Down
Loading

0 comments on commit 41bd777

Please sign in to comment.