aboutsummaryrefslogtreecommitdiffstats
path: root/app/src/main/java/com/zeapo/pwdstore/utils/EntryRecyclerAdapter.kt
diff options
context:
space:
mode:
authorHarsh Shandilya <msfjarvis@gmail.com>2019-10-01 22:14:28 +0530
committerGitHub <noreply@github.com>2019-10-01 22:14:28 +0530
commit073346c157ec34b750d175c8543f346e6eae94de (patch)
treea55d24ef43563f3a2d03d7938a1e96c1f5cd1caf /app/src/main/java/com/zeapo/pwdstore/utils/EntryRecyclerAdapter.kt
parentc9dc4034f12b62f4470f92fb13ecd72871f4a5b7 (diff)
downloadHardenedPass-073346c157ec34b750d175c8543f346e6eae94de.tar.gz
HardenedPass-073346c157ec34b750d175c8543f346e6eae94de.zip
Redesign UI and introduce dark theme (#519)
Caveats: - The openpgp preference had to be removed because the open-intents developers are too lazy to update their libraries. Over the coming weeks I will be reimplementing a local solution for this instead. - The autofill dialog is broken but I since it is being worked on in #410 already I'm not going to bother fixing it.
Diffstat (limited to 'app/src/main/java/com/zeapo/pwdstore/utils/EntryRecyclerAdapter.kt')
-rw-r--r--app/src/main/java/com/zeapo/pwdstore/utils/EntryRecyclerAdapter.kt118
1 files changed, 118 insertions, 0 deletions
diff --git a/app/src/main/java/com/zeapo/pwdstore/utils/EntryRecyclerAdapter.kt b/app/src/main/java/com/zeapo/pwdstore/utils/EntryRecyclerAdapter.kt
new file mode 100644
index 00000000..f52756f4
--- /dev/null
+++ b/app/src/main/java/com/zeapo/pwdstore/utils/EntryRecyclerAdapter.kt
@@ -0,0 +1,118 @@
+package com.zeapo.pwdstore.utils
+
+import android.annotation.SuppressLint
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.appcompat.widget.AppCompatImageView
+import androidx.appcompat.widget.AppCompatTextView
+import androidx.recyclerview.widget.RecyclerView
+
+import com.zeapo.pwdstore.R
+import com.zeapo.pwdstore.widget.MultiselectableLinearLayout
+
+import java.util.ArrayList
+import java.util.TreeSet
+
+abstract class EntryRecyclerAdapter internal constructor(val values: ArrayList<PasswordItem>) : RecyclerView.Adapter<EntryRecyclerAdapter.ViewHolder>() {
+ internal val selectedItems: MutableSet<Int> = TreeSet()
+
+ // Return the size of your dataset (invoked by the layout manager)
+ override fun getItemCount(): Int {
+ return values.size
+ }
+
+ fun clear() {
+ this.values.clear()
+ this.notifyDataSetChanged()
+ }
+
+ fun addAll(list: ArrayList<PasswordItem>) {
+ this.values.addAll(list)
+ this.notifyDataSetChanged()
+ }
+
+ fun add(item: PasswordItem) {
+ this.values.add(item)
+ this.notifyItemInserted(itemCount)
+ }
+
+ internal fun toggleSelection(position: Int) {
+ if (!selectedItems.remove(position)) {
+ selectedItems.add(position)
+ }
+ }
+
+ // use this after an item is removed to update the positions of items in set
+ // that followed the removed position
+ fun updateSelectedItems(position: Int, selectedItems: MutableSet<Int>) {
+ val temp = TreeSet<Int>()
+ for (selected in selectedItems) {
+ if (selected > position) {
+ temp.add(selected - 1)
+ } else {
+ temp.add(selected)
+ }
+ }
+ selectedItems.clear()
+ selectedItems.addAll(temp)
+ }
+
+ fun remove(position: Int) {
+ this.values.removeAt(position)
+ this.notifyItemRemoved(position)
+
+ // keep selectedItems updated so we know what to notifyItemChanged
+ // (instead of just using notifyDataSetChanged)
+ updateSelectedItems(position, selectedItems)
+ }
+
+ internal open fun getOnLongClickListener(holder: ViewHolder, pass: PasswordItem): View.OnLongClickListener {
+ return View.OnLongClickListener { false }
+ }
+
+ // Replace the contents of a view (invoked by the layout manager)
+ @SuppressLint("SetTextI18n")
+ override fun onBindViewHolder(holder: ViewHolder, position: Int) {
+ val pass = values[position]
+ holder.name.text = pass.toString()
+ if (pass.type == PasswordItem.TYPE_CATEGORY) {
+ holder.typeImage.setImageResource(R.drawable.ic_folder_tinted_24dp)
+ } else {
+ holder.typeImage.setImageResource(R.drawable.ic_action_secure)
+ holder.name.text = pass.toString()
+ }
+
+ holder.type.text = pass.fullPathToParent.replace("(^/)|(/$)".toRegex(), "")
+
+ holder.view.setOnClickListener(getOnClickListener(holder, pass))
+
+ holder.view.setOnLongClickListener(getOnLongClickListener(holder, pass))
+
+ // after removal, everything is rebound for some reason; views are shuffled?
+ val selected = selectedItems.contains(position)
+ holder.view.isSelected = selected
+ (holder.itemView as MultiselectableLinearLayout).setMultiSelected(selected)
+ }
+
+ protected abstract fun getOnClickListener(holder: ViewHolder, pass: PasswordItem): View.OnClickListener
+
+ // Create new views (invoked by the layout manager)
+ override fun onCreateViewHolder(parent: ViewGroup,
+ viewType: Int): ViewHolder {
+ // create a new view
+ val v = LayoutInflater.from(parent.context)
+ .inflate(R.layout.password_row_layout, parent, false)
+ return ViewHolder(v)
+ }
+
+ // Provide a reference to the views for each data item
+ // Complex data items may need more than one view per item, and
+ // you provide access to all the views for a data item in a view holder
+ class ViewHolder(// each data item is just a string in this case
+ val view: View) : RecyclerView.ViewHolder(view) {
+ val name: AppCompatTextView = view.findViewById(R.id.label)
+ val type: AppCompatTextView = view.findViewById(R.id.type)
+ val typeImage: AppCompatImageView = view.findViewById(R.id.type_image)
+ }
+}