2022-03-05 12:51:02 +01:00
|
|
|
package sushi.hardcore.droidfs.adapters
|
|
|
|
|
2022-04-18 14:49:35 +02:00
|
|
|
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
|
2022-06-18 21:13:16 +02:00
|
|
|
import sushi.hardcore.droidfs.SavedVolume
|
2022-03-05 12:51:02 +01:00
|
|
|
import sushi.hardcore.droidfs.VolumeDatabase
|
2022-07-03 13:38:32 +02:00
|
|
|
import sushi.hardcore.droidfs.filesystems.EncryptedVolume
|
2022-03-05 12:51:02 +01:00
|
|
|
|
|
|
|
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,
|
2022-06-18 21:13:16 +02:00
|
|
|
) : SelectableAdapter<SavedVolume>(listener::onSelectionChanged) {
|
2022-03-05 12:51:02 +01:00
|
|
|
private val inflater: LayoutInflater = LayoutInflater.from(context)
|
2022-06-18 21:13:16 +02:00
|
|
|
lateinit var volumes: List<SavedVolume>
|
2022-03-05 12:51:02 +01:00
|
|
|
|
|
|
|
init {
|
|
|
|
reloadVolumes()
|
|
|
|
}
|
|
|
|
|
2022-04-17 15:52:34 +02:00
|
|
|
interface Listener {
|
|
|
|
fun onSelectionChanged(size: Int)
|
2022-06-18 21:13:16 +02:00
|
|
|
fun onVolumeItemClick(volume: SavedVolume, position: Int)
|
2022-04-17 15:52:34 +02:00
|
|
|
fun onVolumeItemLongClick()
|
|
|
|
}
|
|
|
|
|
2022-06-18 21:13:16 +02:00
|
|
|
override fun getItems(): List<SavedVolume> {
|
2022-04-09 20:13:39 +02:00
|
|
|
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)
|
|
|
|
}
|
|
|
|
|
2022-04-18 14:49:35 +02:00
|
|
|
@SuppressLint("NotifyDataSetChanged")
|
2022-03-05 12:51:02 +01:00
|
|
|
fun refresh() {
|
|
|
|
reloadVolumes()
|
2022-04-18 14:49:35 +02:00
|
|
|
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
|
2022-04-18 14:55:59 +02:00
|
|
|
itemView.findViewById<ImageView>(R.id.icon_fingerprint).visibility = if (volume.encryptedHash == null) {
|
|
|
|
View.GONE
|
|
|
|
} else {
|
|
|
|
View.VISIBLE
|
|
|
|
}
|
2022-07-03 13:38:32 +02:00
|
|
|
itemView.findViewById<TextView>(R.id.text_info).text = context.getString(
|
|
|
|
if (volume.canWrite(context.filesDir.path)) {
|
|
|
|
R.string.volume_type
|
|
|
|
} else {
|
|
|
|
R.string.volume_type_read_only
|
|
|
|
},
|
|
|
|
context.getString(if (volume.type == EncryptedVolume.GOCRYPTFS_VOLUME_TYPE) {
|
|
|
|
R.string.gocryptfs
|
|
|
|
} else {
|
|
|
|
R.string.cryfs
|
|
|
|
})
|
|
|
|
)
|
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)
|
|
|
|
}
|
|
|
|
}
|