Skip to content

Commit 3b99596

Browse files
authored
Merge pull request #748 from OpenArchive/feature/dweb-picker-and-ui-improvements
feat: Implement content picker and grid layout for media
2 parents 1bd3b91 + a21134e commit 3b99596

File tree

3 files changed

+438
-39
lines changed

3 files changed

+438
-39
lines changed

app/src/main/java/net/opendasharchive/openarchive/services/snowbird/SnowbirdFileListAdapter.kt

Lines changed: 42 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,22 @@
11
package net.opendasharchive.openarchive.services.snowbird
22

3+
import android.content.res.ColorStateList
34
import android.os.Build
45
import android.view.LayoutInflater
6+
import android.view.View
57
import android.view.ViewGroup
8+
import android.widget.ImageView
69
import androidx.annotation.RequiresExtension
710
import androidx.core.content.ContextCompat
811
import androidx.recyclerview.widget.DiffUtil
912
import androidx.recyclerview.widget.ListAdapter
1013
import androidx.recyclerview.widget.RecyclerView
1114
import net.opendasharchive.openarchive.R
12-
import net.opendasharchive.openarchive.databinding.OneLineRowBinding
15+
import net.opendasharchive.openarchive.databinding.SnowbirdMediaGridItemBinding
1316
import net.opendasharchive.openarchive.db.SnowbirdFileItem
14-
import net.opendasharchive.openarchive.extensions.scaled
1517
import java.lang.ref.WeakReference
1618

17-
class SnowbirdFileViewHolder(val binding: OneLineRowBinding) : RecyclerView.ViewHolder(binding.root)
19+
class SnowbirdFileViewHolder(val binding: SnowbirdMediaGridItemBinding) : RecyclerView.ViewHolder(binding.root)
1820

1921
class SnowbirdFileListAdapter(
2022
onClickListener: ((SnowbirdFileItem) -> Unit)? = null,
@@ -25,7 +27,7 @@ class SnowbirdFileListAdapter(
2527
private val onLongPressCallback = WeakReference(onLongPressListener)
2628

2729
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SnowbirdFileViewHolder {
28-
val binding = OneLineRowBinding.inflate(LayoutInflater.from(parent.context), parent, false)
30+
val binding = SnowbirdMediaGridItemBinding.inflate(LayoutInflater.from(parent.context), parent, false)
2931
return SnowbirdFileViewHolder(binding)
3032
}
3133

@@ -34,39 +36,54 @@ class SnowbirdFileListAdapter(
3436
val item = getItem(position)
3537

3638
with (holder.binding) {
37-
val context = button.context
39+
val context = root.context
3840

39-
button.setLeftIcon(ContextCompat.getDrawable(context, R.drawable.ic_dweb)?.scaled(40, context))
40-
//button.setBackgroundResource(R.drawable.button_outlined_ripple)
41-
button.setTitle(item.name ?: "No name provided")
41+
// Set filename
42+
name.text = item.name ?: "No name provided"
4243

43-
if (item.isDownloaded) {
44-
button.setRightIcon(ContextCompat.getDrawable(context, R.drawable.outline_cloud_done_24)?.scaled(40, context))
45-
} else {
46-
button.setRightIcon(ContextCompat.getDrawable(context, R.drawable.outline_cloud_download_24)?.scaled(40, context))
44+
// Determine file type and show appropriate icon
45+
val fileExtension = item.name?.substringAfterLast(".", "")?.lowercase() ?: ""
46+
47+
when {
48+
isImageFile(fileExtension) -> setDefaultIcon(R.drawable.ic_image)
49+
isVideoFile(fileExtension) -> setDefaultIcon(R.drawable.ic_video)
50+
isAudioFile(fileExtension) -> setDefaultIcon(R.drawable.ic_music)
51+
else -> setDefaultIcon(R.drawable.ic_folder_new)
4752
}
4853

49-
button.setOnClickListener {
54+
// Show download badge if not downloaded
55+
downloadBadge.visibility = if (item.isDownloaded) View.GONE else View.VISIBLE
56+
57+
root.setOnClickListener {
5058
onClickCallback.get()?.invoke(item)
5159
}
5260

53-
button.setOnLongClickListener {
61+
root.setOnLongClickListener {
5462
onLongPressCallback.get()?.invoke(item)
5563
true
5664
}
57-
58-
if (item.size > 0) {
59-
// convert bytes to human-readable format
60-
val sizeText = when {
61-
item.size >= 1_000_000_000 -> "${item.size / 1_000_000_000.0} GB"
62-
item.size >= 1_000_000 -> "${item.size / 1_000_000.0} MB"
63-
item.size >= 1_000 -> "${item.size / 1_000.0} KB"
64-
else -> "${item.size} bytes"
65-
}
66-
button.setSubTitle(sizeText)
67-
}
6865
}
6966
}
67+
68+
private fun SnowbirdMediaGridItemBinding.setDefaultIcon(iconRes: Int) {
69+
icon.scaleType = ImageView.ScaleType.CENTER_INSIDE
70+
icon.setImageDrawable(ContextCompat.getDrawable(root.context, iconRes)?.mutate())
71+
icon.imageTintList = ColorStateList.valueOf(
72+
ContextCompat.getColor(root.context, R.color.colorOnBackground)
73+
)
74+
}
75+
76+
private fun isImageFile(extension: String): Boolean {
77+
return extension in listOf("jpg", "jpeg", "png", "gif", "bmp", "webp", "heic", "heif")
78+
}
79+
80+
private fun isVideoFile(extension: String): Boolean {
81+
return extension in listOf("mp4", "avi", "mkv", "mov", "wmv", "flv", "webm", "3gp")
82+
}
83+
84+
private fun isAudioFile(extension: String): Boolean {
85+
return extension in listOf("mp3", "wav", "ogg", "m4a", "flac", "aac", "wma")
86+
}
7087
}
7188

7289
class SnowbirdFileDiffCallback : DiffUtil.ItemCallback<SnowbirdFileItem>() {

0 commit comments

Comments
 (0)