DroidFS/app/src/main/java/sushi/hardcore/droidfs/adapters/VolumeAdapter.kt

111 lines
3.5 KiB
Kotlin
Raw Normal View History

2022-03-05 12:51:02 +01:00
package sushi.hardcore.droidfs.adapters
import android.annotation.SuppressLint
2022-03-05 12:51:02 +01:00
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.LinearLayout
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import sushi.hardcore.droidfs.R
import sushi.hardcore.droidfs.Volume
import sushi.hardcore.droidfs.VolumeDatabase
class VolumeAdapter(
private val context: Context,
private val volumeDatabase: VolumeDatabase,
private val allowSelection: Boolean,
private val showReadOnly: Boolean,
2022-04-17 15:52:34 +02:00
private val listener: Listener,
) : SelectableAdapter<Volume>(listener::onSelectionChanged) {
2022-03-05 12:51:02 +01:00
private val inflater: LayoutInflater = LayoutInflater.from(context)
lateinit var volumes: List<Volume>
init {
reloadVolumes()
}
2022-04-17 15:52:34 +02:00
interface Listener {
fun onSelectionChanged(size: Int)
fun onVolumeItemClick(volume: Volume, position: Int)
fun onVolumeItemLongClick()
}
2022-04-09 20:13:39 +02:00
override fun getItems(): List<Volume> {
return volumes
}
2022-03-05 12:51:02 +01:00
private fun reloadVolumes() {
volumes = if (showReadOnly) {
volumeDatabase.getVolumes()
} else {
volumeDatabase.getVolumes().filter { v -> v.canWrite(context.filesDir.path) }
}
}
2022-04-09 20:13:39 +02:00
override fun onItemClick(position: Int): Boolean {
2022-04-17 15:52:34 +02:00
listener.onVolumeItemClick(volumes[position], position)
2022-04-09 20:13:39 +02:00
return if (allowSelection) {
super.onItemClick(position)
} else {
false
2022-03-05 12:51:02 +01:00
}
}
2022-04-09 20:13:39 +02:00
override fun onItemLongClick(position: Int): Boolean {
2022-04-17 15:52:34 +02:00
listener.onVolumeItemLongClick()
2022-03-05 12:51:02 +01:00
return if (allowSelection)
2022-04-09 20:13:39 +02:00
super.onItemLongClick(position)
2022-03-05 12:51:02 +01:00
else
false
}
fun onVolumeChanged(position: Int) {
reloadVolumes()
notifyItemChanged(position)
}
@SuppressLint("NotifyDataSetChanged")
2022-03-05 12:51:02 +01:00
fun refresh() {
reloadVolumes()
unSelectAll(false)
notifyDataSetChanged()
2022-03-05 12:51:02 +01:00
}
inner class VolumeViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
fun bind(position: Int) {
val volume = volumes[position]
itemView.findViewById<TextView>(R.id.text_volume_name).text = volume.shortName
itemView.findViewById<ImageView>(R.id.image_icon).setImageResource(R.drawable.icon_volume)
itemView.findViewById<TextView>(R.id.text_path).text = if (volume.isHidden)
context.getString(R.string.hidden_volume)
else
volume.name
itemView.findViewById<ImageView>(R.id.icon_fingerprint).visibility = if (volume.encryptedHash == null) {
View.GONE
} else {
View.VISIBLE
}
itemView.findViewById<TextView>(R.id.text_read_only).apply {
visibility = if (volume.canWrite(context.filesDir.path))
View.GONE
2022-03-05 12:51:02 +01:00
else {
View.VISIBLE
2022-03-05 12:51:02 +01:00
}
}
2022-04-09 20:13:39 +02:00
setSelectable(itemView.findViewById<LinearLayout>(R.id.selectable_container), itemView, layoutPosition)
2022-03-05 12:51:02 +01:00
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
val view: View = inflater.inflate(R.layout.adapter_volume, parent, false)
return VolumeViewHolder(view)
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
(holder as VolumeViewHolder).bind(position)
}
}