#168 implement UI for sorting vault list. Backend still WIP

This commit is contained in:
Julian Raufelder 2021-01-31 16:45:02 +01:00
parent e7e3017365
commit dc7cef7fb5
No known key found for this signature in database
GPG Key ID: 17EE71F6634E381D
6 changed files with 84 additions and 4 deletions

View File

@ -603,6 +603,17 @@ class VaultListPresenter @Inject constructor( //
view?.showDialog(AppIsObscuredInfoDialog.newInstance())
}
fun onVaultMoved(fromPosition: Int, toPosition: Int) {
// FIXME insert position int into the db and update here
getVaultListUseCase.run(object : DefaultResultHandler<List<Vault>>() {
override fun onSuccess(vaults: List<Vault>) {
val vaultModels = vaults.mapTo(ArrayList()) { VaultModel(it) }
view?.vaultMoved(fromPosition, toPosition, vaultModels)
}
})
}
fun onBiometricAuthenticationSucceeded(vaultModel: VaultModel) {
if (changedVaultPassword) {
changedVaultPassword = false

View File

@ -150,6 +150,10 @@ class VaultListActivity : BaseActivity(), //
return biometricAuthentication?.stoppedBiometricAuthDuringCloudAuthentication() == true
}
override fun vaultMoved(fromPosition: Int, toPosition: Int, vaultModelCollection: List<VaultModel>) {
vaultListFragment().vaultMoved(fromPosition, toPosition, vaultModelCollection)
}
override fun showVaultSettingsDialog(vaultModel: VaultModel) {
val vaultSettingDialog = //
SettingsVaultBottomSheet.newInstance(vaultModel)

View File

@ -23,5 +23,5 @@ interface VaultListView : View {
fun isVaultLocked(vaultModel: VaultModel): Boolean
fun cancelBasicAuthIfRunning()
fun stoppedBiometricAuthDuringCloudAuthentication(): Boolean
fun vaultMoved(fromPosition: Int, toPosition: Int, vaultModelCollection: List<VaultModel>)
}

View File

@ -8,14 +8,16 @@ import org.cryptomator.presentation.ui.adapter.VaultsAdapter.VaultViewHolder
import javax.inject.Inject
class VaultsAdapter @Inject
internal constructor() : RecyclerViewBaseAdapter<VaultModel, VaultsAdapter.OnItemClickListener, VaultViewHolder>() {
internal constructor() : RecyclerViewBaseAdapter<VaultModel, VaultsAdapter.OnItemInteractionListener, VaultViewHolder>(), VaultsMoveListener.Listener {
interface OnItemClickListener {
interface OnItemInteractionListener {
fun onVaultClicked(vaultModel: VaultModel)
fun onVaultSettingsClicked(vaultModel: VaultModel)
fun onVaultLockClicked(vaultModel: VaultModel)
fun onVaultMoved(fromPosition: Int, toPosition: Int)
}
override fun getItemLayout(viewType: Int): Int {
@ -65,4 +67,8 @@ internal constructor() : RecyclerViewBaseAdapter<VaultModel, VaultsAdapter.OnIte
itemView.settings.setOnClickListener { callback.onVaultSettingsClicked(vaultModel) }
}
}
override fun onRowMoved(fromPosition: Int, toPosition: Int) {
callback.onVaultMoved(fromPosition, toPosition)
}
}

View File

@ -0,0 +1,32 @@
package org.cryptomator.presentation.ui.adapter
import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.RecyclerView
class VaultsMoveListener(val adapter: VaultsAdapter) : ItemTouchHelper.Callback() {
override fun getMovementFlags(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder): Int {
val dragFlags = ItemTouchHelper.UP or ItemTouchHelper.DOWN
return makeMovementFlags(dragFlags, 0)
}
override fun isItemViewSwipeEnabled(): Boolean {
return false
}
override fun isLongPressDragEnabled(): Boolean {
return true
}
override fun onMove(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, target: RecyclerView.ViewHolder): Boolean {
adapter.onRowMoved(viewHolder.adapterPosition, target.adapterPosition)
return true
}
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
}
interface Listener {
fun onRowMoved(fromPosition: Int, toPosition: Int)
}
}

View File

@ -2,6 +2,7 @@ package org.cryptomator.presentation.ui.fragment
import android.util.TypedValue
import android.view.View
import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.LinearLayoutManager
import kotlinx.android.synthetic.main.fragment_vault_list.*
import kotlinx.android.synthetic.main.recycler_view_layout.*
@ -11,6 +12,8 @@ import org.cryptomator.presentation.R
import org.cryptomator.presentation.model.VaultModel
import org.cryptomator.presentation.presenter.VaultListPresenter
import org.cryptomator.presentation.ui.adapter.VaultsAdapter
import org.cryptomator.presentation.ui.adapter.VaultsMoveListener
import java.util.*
import javax.inject.Inject
@Fragment(R.layout.fragment_vault_list)
@ -22,7 +25,9 @@ class VaultListFragment : BaseFragment() {
@Inject
lateinit var vaultsAdapter: VaultsAdapter
private val onItemClickListener = object : VaultsAdapter.OnItemClickListener {
lateinit var touchHelper: ItemTouchHelper
private val onItemClickListener = object : VaultsAdapter.OnItemInteractionListener {
override fun onVaultClicked(vaultModel: VaultModel) {
vaultListPresenter.onVaultClicked(vaultModel)
}
@ -34,8 +39,13 @@ class VaultListFragment : BaseFragment() {
override fun onVaultLockClicked(vaultModel: VaultModel) {
vaultListPresenter.onVaultLockClicked(vaultModel)
}
override fun onVaultMoved(fromPosition: Int, toPosition: Int) {
vaultListPresenter.onVaultMoved(fromPosition, toPosition)
}
}
override fun setupView() {
setupRecyclerView()
fab_vault.setOnClickListener { vaultListPresenter.onCreateVaultClicked() }
@ -48,6 +58,9 @@ class VaultListFragment : BaseFragment() {
private fun setupRecyclerView() {
vaultsAdapter.setCallback(onItemClickListener)
touchHelper = ItemTouchHelper(VaultsMoveListener(vaultsAdapter))
touchHelper.attachToRecyclerView(recyclerView)
recyclerView.layoutManager = LinearLayoutManager(context())
recyclerView.adapter = vaultsAdapter
recyclerView.setHasFixedSize(true) // smoother scrolling
@ -83,5 +96,19 @@ class VaultListFragment : BaseFragment() {
vaultsAdapter.addOrUpdateVault(vaultModel)
}
fun vaultMoved(fromPosition: Int, toPosition: Int, vaultModelCollection: List<VaultModel>?) {
if (fromPosition < toPosition) {
for (i in fromPosition until toPosition) {
Collections.swap(vaultModelCollection, i, i + 1)
}
} else {
for (i in fromPosition downTo toPosition + 1) {
Collections.swap(vaultModelCollection, i, i - 1)
}
}
vaultsAdapter.notifyItemMoved(fromPosition, toPosition)
}
fun rootView(): View = coordinatorLayout
}