aboutsummaryrefslogtreecommitdiffstats
path: root/app/src/main/java/com/zeapo/pwdstore/SelectFolderFragment.kt
diff options
context:
space:
mode:
authorFabian Henneke <FabianHenneke@users.noreply.github.com>2020-04-10 13:18:42 +0200
committerGitHub <noreply@github.com>2020-04-10 16:48:42 +0530
commit575ef8472654f49dd60f0e6909164dd8dbd098fb (patch)
treebd94860a1dcb4a8c630ff5954c262716ac307b7a /app/src/main/java/com/zeapo/pwdstore/SelectFolderFragment.kt
parent2738d7500fa0d4d925f698a04045d930c27a2d59 (diff)
downloadHardenedPass-575ef8472654f49dd60f0e6909164dd8dbd098fb.tar.gz
HardenedPass-575ef8472654f49dd60f0e6909164dd8dbd098fb.zip
Modernize legacy RecyclerView adapters (#694)
* Modernize legacy RecyclerView adapters Introduces new adapters based on the SearchableRepositoryViewModel and using androidx.recyclerview.selection for multiselection support. The following positive effects in behavior are observable to end-users: - Search and navigation actions are executed on IO threads. - RecyclerViews are now animated during searches (but not navigations). - Exact scroll position is restored when navigating back. - The ActionBar title is updated with the current folder name. The following negative effects may warrant attention: - Support for the "always search from root" setting has been removed. - Due to a limitation of the fast scroll dependency, using the scroller may result in unwanted multiselections. If this is not fixed in the library, native fast scroller capabilities could be used, but these are more limited in appearance and to not offer popups. * Fix lint * Fix FastScroller/SelectionTracker incompatibility * Immediately react to settings changes * List directory entries when search term is blank * Use isEmpty() instead of == "" * Replace adapter inheritance with builders and fix selection drags * Remove dividers in password lists * Run spotlessApply * Use a more logical string in action mode * Commonize and constify path bundle key * Make lambda parameter name explicit Signed-off-by: Harsh Shandilya <me@msfjarvis.dev> Co-authored-by: Harsh Shandilya <me@msfjarvis.dev>
Diffstat (limited to 'app/src/main/java/com/zeapo/pwdstore/SelectFolderFragment.kt')
-rw-r--r--app/src/main/java/com/zeapo/pwdstore/SelectFolderFragment.kt84
1 files changed, 32 insertions, 52 deletions
diff --git a/app/src/main/java/com/zeapo/pwdstore/SelectFolderFragment.kt b/app/src/main/java/com/zeapo/pwdstore/SelectFolderFragment.kt
index e60cb286..a7489893 100644
--- a/app/src/main/java/com/zeapo/pwdstore/SelectFolderFragment.kt
+++ b/app/src/main/java/com/zeapo/pwdstore/SelectFolderFragment.kt
@@ -11,40 +11,22 @@ import android.view.View
import android.view.ViewGroup
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
-import androidx.preference.PreferenceManager
-import androidx.recyclerview.widget.DividerItemDecoration
+import androidx.fragment.app.activityViewModels
+import androidx.lifecycle.observe
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.floatingactionbutton.FloatingActionButton
-import com.zeapo.pwdstore.ui.adapters.FolderRecyclerAdapter
+import com.zeapo.pwdstore.ui.adapters.PasswordItemRecyclerAdapter
import com.zeapo.pwdstore.utils.PasswordItem
-import com.zeapo.pwdstore.utils.PasswordRepository
-import com.zeapo.pwdstore.utils.PasswordRepository.Companion.getPasswords
-import com.zeapo.pwdstore.utils.PasswordRepository.Companion.getRepositoryDirectory
-import com.zeapo.pwdstore.utils.PasswordRepository.PasswordSortOrder.Companion.getSortOrder
import java.io.File
-import java.util.Stack
-
-/**
- * A fragment representing a list of Items.
- *
- * Large screen devices (such as tablets) are supported by replacing the ListView with a
- * GridView.
- *
- */
+import me.zhanghai.android.fastscroll.FastScrollerBuilder
class SelectFolderFragment : Fragment() {
- // store the pass files list in a stack
- private var pathStack: Stack<File> = Stack()
- private lateinit var recyclerAdapter: FolderRecyclerAdapter
+ private lateinit var recyclerAdapter: PasswordItemRecyclerAdapter
private lateinit var recyclerView: RecyclerView
private lateinit var listener: OnFragmentInteractionListener
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- val path = requireNotNull(requireArguments().getString("Path"))
- recyclerAdapter = FolderRecyclerAdapter(listener, getPasswords(File(path), getRepositoryDirectory(requireActivity()), sortOrder))
- }
+ private val model: SearchableRepositoryViewModel by activityViewModels()
override fun onCreateView(
inflater: LayoutInflater,
@@ -52,35 +34,41 @@ class SelectFolderFragment : Fragment() {
savedInstanceState: Bundle?
): View? {
val view = inflater.inflate(R.layout.password_recycler_view, container, false)
- // use a linear layout manager
- recyclerView = view.findViewById(R.id.pass_recycler)
- recyclerView.layoutManager = LinearLayoutManager(requireContext())
- // use divider
- recyclerView.addItemDecoration(
- DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL))
- // Set the adapter
- recyclerView.adapter = recyclerAdapter
+ initializePasswordList(view)
val fab: FloatingActionButton = view.findViewById(R.id.fab)
fab.hide()
- registerForContextMenu(recyclerView)
return view
}
+ private fun initializePasswordList(rootView: View) {
+ recyclerAdapter = PasswordItemRecyclerAdapter()
+ .onItemClicked { _, item ->
+ listener.onFragmentInteraction(item)
+ }
+ recyclerView = rootView.findViewById(R.id.pass_recycler)
+ recyclerView.apply {
+ layoutManager = LinearLayoutManager(requireContext())
+ itemAnimator = null
+ adapter = recyclerAdapter
+ }
+
+ FastScrollerBuilder(recyclerView).build()
+ registerForContextMenu(recyclerView)
+
+ val path = requireNotNull(requireArguments().getString(PasswordStore.REQUEST_ARG_PATH))
+ model.navigateTo(File(path), listMode = ListMode.DirectoriesOnly, pushPreviousLocation = false)
+ model.searchResult.observe(this) { result ->
+ recyclerAdapter.submitList(result.passwordItems)
+ }
+ }
+
override fun onAttach(context: Context) {
super.onAttach(context)
try {
listener = object : OnFragmentInteractionListener {
override fun onFragmentInteraction(item: PasswordItem) {
if (item.type == PasswordItem.TYPE_CATEGORY) {
- // push the category were we're going
- pathStack.push(item.file)
- recyclerView.scrollToPosition(0)
- recyclerAdapter.clear()
- recyclerAdapter.addAll(getPasswords(
- item.file,
- getRepositoryDirectory(context),
- sortOrder)
- )
+ model.navigateTo(item.file, listMode = ListMode.DirectoriesOnly)
(requireActivity() as AppCompatActivity).supportActionBar?.setDisplayHomeAsUpEnabled(true)
}
}
@@ -91,16 +79,8 @@ class SelectFolderFragment : Fragment() {
}
}
- /**
- * gets the current directory
- *
- * @return the current directory
- */
- val currentDir: File?
- get() = if (pathStack.isEmpty()) getRepositoryDirectory(requireContext()) else pathStack.peek()
-
- private val sortOrder: PasswordRepository.PasswordSortOrder
- get() = getSortOrder(PreferenceManager.getDefaultSharedPreferences(requireContext()))
+ val currentDir: File
+ get() = model.currentDir.value!!
interface OnFragmentInteractionListener {
fun onFragmentInteraction(item: PasswordItem)