#168 implement UI for sorting vault list. Backend still WIP
This commit is contained in:
parent
e7e3017365
commit
dc7cef7fb5
@ -603,6 +603,17 @@ class VaultListPresenter @Inject constructor( //
|
|||||||
view?.showDialog(AppIsObscuredInfoDialog.newInstance())
|
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) {
|
fun onBiometricAuthenticationSucceeded(vaultModel: VaultModel) {
|
||||||
if (changedVaultPassword) {
|
if (changedVaultPassword) {
|
||||||
changedVaultPassword = false
|
changedVaultPassword = false
|
||||||
|
@ -150,6 +150,10 @@ class VaultListActivity : BaseActivity(), //
|
|||||||
return biometricAuthentication?.stoppedBiometricAuthDuringCloudAuthentication() == true
|
return biometricAuthentication?.stoppedBiometricAuthDuringCloudAuthentication() == true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun vaultMoved(fromPosition: Int, toPosition: Int, vaultModelCollection: List<VaultModel>) {
|
||||||
|
vaultListFragment().vaultMoved(fromPosition, toPosition, vaultModelCollection)
|
||||||
|
}
|
||||||
|
|
||||||
override fun showVaultSettingsDialog(vaultModel: VaultModel) {
|
override fun showVaultSettingsDialog(vaultModel: VaultModel) {
|
||||||
val vaultSettingDialog = //
|
val vaultSettingDialog = //
|
||||||
SettingsVaultBottomSheet.newInstance(vaultModel)
|
SettingsVaultBottomSheet.newInstance(vaultModel)
|
||||||
|
@ -23,5 +23,5 @@ interface VaultListView : View {
|
|||||||
fun isVaultLocked(vaultModel: VaultModel): Boolean
|
fun isVaultLocked(vaultModel: VaultModel): Boolean
|
||||||
fun cancelBasicAuthIfRunning()
|
fun cancelBasicAuthIfRunning()
|
||||||
fun stoppedBiometricAuthDuringCloudAuthentication(): Boolean
|
fun stoppedBiometricAuthDuringCloudAuthentication(): Boolean
|
||||||
|
fun vaultMoved(fromPosition: Int, toPosition: Int, vaultModelCollection: List<VaultModel>)
|
||||||
}
|
}
|
||||||
|
@ -8,14 +8,16 @@ import org.cryptomator.presentation.ui.adapter.VaultsAdapter.VaultViewHolder
|
|||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
class VaultsAdapter @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 onVaultClicked(vaultModel: VaultModel)
|
||||||
|
|
||||||
fun onVaultSettingsClicked(vaultModel: VaultModel)
|
fun onVaultSettingsClicked(vaultModel: VaultModel)
|
||||||
|
|
||||||
fun onVaultLockClicked(vaultModel: VaultModel)
|
fun onVaultLockClicked(vaultModel: VaultModel)
|
||||||
|
|
||||||
|
fun onVaultMoved(fromPosition: Int, toPosition: Int)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getItemLayout(viewType: Int): Int {
|
override fun getItemLayout(viewType: Int): Int {
|
||||||
@ -65,4 +67,8 @@ internal constructor() : RecyclerViewBaseAdapter<VaultModel, VaultsAdapter.OnIte
|
|||||||
itemView.settings.setOnClickListener { callback.onVaultSettingsClicked(vaultModel) }
|
itemView.settings.setOnClickListener { callback.onVaultSettingsClicked(vaultModel) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun onRowMoved(fromPosition: Int, toPosition: Int) {
|
||||||
|
callback.onVaultMoved(fromPosition, toPosition)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
|
}
|
||||||
|
}
|
@ -2,6 +2,7 @@ package org.cryptomator.presentation.ui.fragment
|
|||||||
|
|
||||||
import android.util.TypedValue
|
import android.util.TypedValue
|
||||||
import android.view.View
|
import android.view.View
|
||||||
|
import androidx.recyclerview.widget.ItemTouchHelper
|
||||||
import androidx.recyclerview.widget.LinearLayoutManager
|
import androidx.recyclerview.widget.LinearLayoutManager
|
||||||
import kotlinx.android.synthetic.main.fragment_vault_list.*
|
import kotlinx.android.synthetic.main.fragment_vault_list.*
|
||||||
import kotlinx.android.synthetic.main.recycler_view_layout.*
|
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.model.VaultModel
|
||||||
import org.cryptomator.presentation.presenter.VaultListPresenter
|
import org.cryptomator.presentation.presenter.VaultListPresenter
|
||||||
import org.cryptomator.presentation.ui.adapter.VaultsAdapter
|
import org.cryptomator.presentation.ui.adapter.VaultsAdapter
|
||||||
|
import org.cryptomator.presentation.ui.adapter.VaultsMoveListener
|
||||||
|
import java.util.*
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
@Fragment(R.layout.fragment_vault_list)
|
@Fragment(R.layout.fragment_vault_list)
|
||||||
@ -22,7 +25,9 @@ class VaultListFragment : BaseFragment() {
|
|||||||
@Inject
|
@Inject
|
||||||
lateinit var vaultsAdapter: VaultsAdapter
|
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) {
|
override fun onVaultClicked(vaultModel: VaultModel) {
|
||||||
vaultListPresenter.onVaultClicked(vaultModel)
|
vaultListPresenter.onVaultClicked(vaultModel)
|
||||||
}
|
}
|
||||||
@ -34,7 +39,12 @@ class VaultListFragment : BaseFragment() {
|
|||||||
override fun onVaultLockClicked(vaultModel: VaultModel) {
|
override fun onVaultLockClicked(vaultModel: VaultModel) {
|
||||||
vaultListPresenter.onVaultLockClicked(vaultModel)
|
vaultListPresenter.onVaultLockClicked(vaultModel)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun onVaultMoved(fromPosition: Int, toPosition: Int) {
|
||||||
|
vaultListPresenter.onVaultMoved(fromPosition, toPosition)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
override fun setupView() {
|
override fun setupView() {
|
||||||
setupRecyclerView()
|
setupRecyclerView()
|
||||||
@ -48,6 +58,9 @@ class VaultListFragment : BaseFragment() {
|
|||||||
|
|
||||||
private fun setupRecyclerView() {
|
private fun setupRecyclerView() {
|
||||||
vaultsAdapter.setCallback(onItemClickListener)
|
vaultsAdapter.setCallback(onItemClickListener)
|
||||||
|
touchHelper = ItemTouchHelper(VaultsMoveListener(vaultsAdapter))
|
||||||
|
touchHelper.attachToRecyclerView(recyclerView)
|
||||||
|
|
||||||
recyclerView.layoutManager = LinearLayoutManager(context())
|
recyclerView.layoutManager = LinearLayoutManager(context())
|
||||||
recyclerView.adapter = vaultsAdapter
|
recyclerView.adapter = vaultsAdapter
|
||||||
recyclerView.setHasFixedSize(true) // smoother scrolling
|
recyclerView.setHasFixedSize(true) // smoother scrolling
|
||||||
@ -83,5 +96,19 @@ class VaultListFragment : BaseFragment() {
|
|||||||
vaultsAdapter.addOrUpdateVault(vaultModel)
|
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
|
fun rootView(): View = coordinatorLayout
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user