11package net.opendasharchive.openarchive.services.snowbird
22
3+ import android.content.res.ColorStateList
34import android.os.Build
45import android.view.LayoutInflater
6+ import android.view.View
57import android.view.ViewGroup
8+ import android.widget.ImageView
69import androidx.annotation.RequiresExtension
710import androidx.core.content.ContextCompat
811import androidx.recyclerview.widget.DiffUtil
912import androidx.recyclerview.widget.ListAdapter
1013import androidx.recyclerview.widget.RecyclerView
1114import net.opendasharchive.openarchive.R
12- import net.opendasharchive.openarchive.databinding.OneLineRowBinding
15+ import net.opendasharchive.openarchive.databinding.SnowbirdMediaGridItemBinding
1316import net.opendasharchive.openarchive.db.SnowbirdFileItem
14- import net.opendasharchive.openarchive.extensions.scaled
1517import 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
1921class 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
7289class SnowbirdFileDiffCallback : DiffUtil .ItemCallback <SnowbirdFileItem >() {
0 commit comments