Better file history listener implementation

This commit is contained in:
J-Jamet
2019-08-29 11:13:29 +02:00
parent b62ef8a2ed
commit 36cb683404
3 changed files with 59 additions and 82 deletions

View File

@@ -48,9 +48,7 @@ import com.kunzisoft.keepass.activities.helpers.EntrySelectionHelper
import com.kunzisoft.keepass.activities.helpers.OpenFileHelper
import com.kunzisoft.keepass.activities.stylish.StylishActivity
import com.kunzisoft.keepass.adapters.FileDatabaseHistoryAdapter
import com.kunzisoft.keepass.utils.FileInfo
import com.kunzisoft.keepass.app.database.FileDatabaseHistory
import com.kunzisoft.keepass.app.database.FileDatabaseHistoryEntity
import com.kunzisoft.keepass.autofill.AutofillHelper
import com.kunzisoft.keepass.database.action.CreateDatabaseRunnable
import com.kunzisoft.keepass.database.action.ProgressDialogThread
@@ -67,9 +65,7 @@ import net.cachapa.expandablelayout.ExpandableLayout
import java.io.FileNotFoundException
class FileDatabaseSelectActivity : StylishActivity(),
AssignMasterKeyDialogFragment.AssignPasswordDialogListener,
FileDatabaseHistoryAdapter.FileItemOpenListener,
FileDatabaseHistoryAdapter.FileSelectClearListener {
AssignMasterKeyDialogFragment.AssignPasswordDialogListener {
// Views
private var fileListContainer: View? = null
@@ -163,9 +159,25 @@ class FileDatabaseSelectActivity : StylishActivity(),
(fileDatabaseHistoryRecyclerView.itemAnimator as SimpleItemAnimator).supportsChangeAnimations = false
// Construct adapter with listeners
mAdapterDatabaseHistory = FileDatabaseHistoryAdapter(this)
mAdapterDatabaseHistory?.setOnItemClickListener(this)
mAdapterDatabaseHistory?.setFileSelectClearListener(this)
mAdapterDatabaseHistory?.setSaveAliasListener { fileDatabaseHistoryWithNewAlias ->
mAdapterDatabaseHistory?.setOnFileDatabaseHistoryOpenListener { fileDatabaseHistoryEntityToOpen ->
launchPasswordActivity(
fileDatabaseHistoryEntityToOpen.databaseUri,
fileDatabaseHistoryEntityToOpen.keyFileUri)
updateFileListVisibility()
}
mAdapterDatabaseHistory?.setOnFileDatabaseHistoryDeleteListener { fileDatabaseHistoryToDelete ->
// Remove from app database
mFileDatabaseHistory?.deleteFileDatabaseHistory(fileDatabaseHistoryToDelete) { fileHistoryDeleted ->
// Remove from adapter
fileHistoryDeleted?.let { databaseFileHistoryDeleted ->
mAdapterDatabaseHistory?.deleteDatabaseFileHistory(databaseFileHistoryDeleted)
mAdapterDatabaseHistory?.notifyDataSetChanged()
updateFileListVisibility()
}
}
true
}
mAdapterDatabaseHistory?.setOnSaveAliasListener { fileDatabaseHistoryWithNewAlias ->
mFileDatabaseHistory?.addOrUpdateFileDatabaseHistory(fileDatabaseHistoryWithNewAlias)
}
fileDatabaseHistoryRecyclerView.adapter = mAdapterDatabaseHistory
@@ -317,7 +329,7 @@ class FileDatabaseSelectActivity : StylishActivity(),
updateExternalStorageWarning()
// Construct adapter with listeners
mFileDatabaseHistory?.getAll { databaseFileHistoryList ->
mFileDatabaseHistory?.getAllFileDatabaseHistories { databaseFileHistoryList ->
databaseFileHistoryList?.let {
mAdapterDatabaseHistory?.addDatabaseFileHistoryList(it)
updateFileListVisibility()
@@ -359,7 +371,7 @@ class FileDatabaseSelectActivity : StylishActivity(),
keyFileChecked,
keyFile,
true, // TODO get readonly
LaunchGroupActivityFinish(databaseUri)
LaunchGroupActivityFinish(databaseUri, keyFile)
)
},
R.string.progress_create)
@@ -372,7 +384,8 @@ class FileDatabaseSelectActivity : StylishActivity(),
}
}
private inner class LaunchGroupActivityFinish internal constructor(private val fileURI: Uri) : ActionRunnable() {
private inner class LaunchGroupActivityFinish(private val databaseFileUri: Uri,
private val keyFileUri: Uri?) : ActionRunnable() {
override fun run() {
finishRun(true, null)
@@ -382,7 +395,7 @@ class FileDatabaseSelectActivity : StylishActivity(),
runOnUiThread {
if (result.isSuccess) {
// Add database to recent files
mFileDatabaseHistory?.addOrUpdateDatabaseUri(fileURI)
mFileDatabaseHistory?.addOrUpdateDatabaseUri(databaseFileUri, keyFileUri)
mAdapterDatabaseHistory?.notifyDataSetChanged()
updateFileListVisibility()
GroupActivity.launch(this@FileDatabaseSelectActivity)
@@ -399,25 +412,6 @@ class FileDatabaseSelectActivity : StylishActivity(),
}
override fun onFileItemOpenListener(fileDatabaseHistoryEntity: FileDatabaseHistoryEntity) {
launchPasswordActivity(fileDatabaseHistoryEntity.databaseUri, fileDatabaseHistoryEntity.keyFileUri)
updateFileListVisibility()
}
override fun onFileSelectClearListener(fileInfo: FileInfo): Boolean {
fileInfo.fileUri?.let {
mFileDatabaseHistory?.deleteDatabaseUri(it) { fileHistoryDeleted ->
fileHistoryDeleted?.let { databaseFileHistoryDeleted ->
mAdapterDatabaseHistory?.deleteDatabaseFileHistory(databaseFileHistoryDeleted)
mAdapterDatabaseHistory?.notifyDataSetChanged()
updateFileListVisibility()
}
}
}
return true
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)

View File

@@ -33,14 +33,13 @@ import com.kunzisoft.keepass.R
import com.kunzisoft.keepass.app.database.FileDatabaseHistoryEntity
import com.kunzisoft.keepass.settings.PreferencesUtil
import com.kunzisoft.keepass.utils.FileDatabaseInfo
import com.kunzisoft.keepass.utils.FileInfo
class FileDatabaseHistoryAdapter(private val context: Context)
: RecyclerView.Adapter<FileDatabaseHistoryAdapter.FileDatabaseHistoryViewHolder>() {
private val inflater: LayoutInflater = LayoutInflater.from(context)
private var fileItemOpenListener: FileItemOpenListener? = null
private var fileSelectClearListener: FileSelectClearListener? = null
private var fileItemOpenListener: ((FileDatabaseHistoryEntity)->Unit)? = null
private var fileSelectClearListener: ((FileDatabaseHistoryEntity)->Boolean)? = null
private var saveAliasListener: ((FileDatabaseHistoryEntity)->Unit)? = null
private val listDatabaseFiles = ArrayList<FileDatabaseHistoryEntity>()
@@ -74,7 +73,7 @@ class FileDatabaseHistoryAdapter(private val context: Context)
val fileDatabaseInfo = FileDatabaseInfo(context, fileHistoryEntity.databaseUri)
// Context menu creation
holder.fileContainer.setOnCreateContextMenuListener(ContextMenuBuilder(fileDatabaseInfo))
holder.fileContainer.setOnCreateContextMenuListener(ContextMenuBuilder(fileHistoryEntity))
// Click item to open file
if (fileItemOpenListener != null)
holder.fileContainer.setOnClickListener(FileItemClickListener(fileHistoryEntity))
@@ -150,40 +149,30 @@ class FileDatabaseHistoryAdapter(private val context: Context)
listDatabaseFiles.remove(fileDatabaseHistoryToDelete)
}
fun setOnItemClickListener(fileItemOpenListener: FileItemOpenListener) {
this.fileItemOpenListener = fileItemOpenListener
fun setOnFileDatabaseHistoryOpenListener(listener : ((FileDatabaseHistoryEntity)->Unit)?) {
this.fileItemOpenListener = listener
}
fun setFileSelectClearListener(fileSelectClearListener: FileSelectClearListener) {
this.fileSelectClearListener = fileSelectClearListener
fun setOnFileDatabaseHistoryDeleteListener(listener : ((FileDatabaseHistoryEntity)->Boolean)?) {
this.fileSelectClearListener = listener
}
fun setSaveAliasListener(listener : ((FileDatabaseHistoryEntity)->Unit)?) {
fun setOnSaveAliasListener(listener : ((FileDatabaseHistoryEntity)->Unit)?) {
this.saveAliasListener = listener
}
interface FileItemOpenListener {
fun onFileItemOpenListener(fileDatabaseHistoryEntity: FileDatabaseHistoryEntity)
}
interface FileSelectClearListener {
fun onFileSelectClearListener(fileInfo: FileInfo): Boolean
}
private inner class FileItemClickListener(private val fileDatabaseHistoryEntity: FileDatabaseHistoryEntity) : View.OnClickListener {
override fun onClick(v: View) {
fileItemOpenListener?.onFileItemOpenListener(fileDatabaseHistoryEntity)
fileItemOpenListener?.invoke(fileDatabaseHistoryEntity)
}
}
private inner class ContextMenuBuilder(private val fileInfo: FileInfo) : View.OnCreateContextMenuListener {
private inner class ContextMenuBuilder(private val fileHistoryEntity: FileDatabaseHistoryEntity) : View.OnCreateContextMenuListener {
private val mOnMyActionClickListener = MenuItem.OnMenuItemClickListener { item ->
if (fileSelectClearListener == null)
return@OnMenuItemClickListener false
when (item.itemId) {
MENU_CLEAR -> fileSelectClearListener!!.onFileSelectClearListener(fileInfo)
MENU_CLEAR -> fileSelectClearListener?.invoke(fileHistoryEntity) ?: false
else -> false
}
}

View File

@@ -32,7 +32,8 @@ class FileDatabaseHistory(applicationContext: Context) {
.getDatabase(applicationContext)
.databaseFileHistoryDao()
fun getFileDatabaseHistory(databaseUri: Uri, fileHistoryResultListener: (fileDatabaseHistoryResult: FileDatabaseHistoryEntity?) -> Unit) {
fun getFileDatabaseHistory(databaseUri: Uri,
fileHistoryResultListener: (fileDatabaseHistoryResult: FileDatabaseHistoryEntity?) -> Unit) {
ActionFileHistoryAsyncTask(
{
databaseFileHistoryDao.getByDatabaseUri(databaseUri.toString())
@@ -43,7 +44,23 @@ class FileDatabaseHistory(applicationContext: Context) {
).execute()
}
fun getAll(fileHistoryResultListener: (fileDatabaseHistoryResult: List<FileDatabaseHistoryEntity>?) -> Unit) {
fun getKeyFileUriByDatabaseUri(databaseUri: Uri,
keyFileUriResultListener: (Uri?) -> Unit) {
ActionFileHistoryAsyncTask(
{
databaseFileHistoryDao.getByDatabaseUri(databaseUri.toString())
},
{
it?.let { fileHistoryEntity ->
fileHistoryEntity.keyFileUri?.let { keyFileUri ->
keyFileUriResultListener.invoke(Uri.parse(keyFileUri))
}
} ?: keyFileUriResultListener.invoke(null)
}
).execute()
}
fun getAllFileDatabaseHistories(fileHistoryResultListener: (fileDatabaseHistoryResult: List<FileDatabaseHistoryEntity>?) -> Unit) {
ActionFileHistoryAsyncTask(
{
databaseFileHistoryDao.getAll()
@@ -81,38 +98,15 @@ class FileDatabaseHistory(applicationContext: Context) {
).execute()
}
fun getKeyFileUriByDatabaseUri(databaseUri: Uri,
keyFileUriResultListener: (Uri?) -> Unit) {
fun deleteFileDatabaseHistory(fileDatabaseHistory: FileDatabaseHistoryEntity,
fileHistoryDeletedResult: (FileDatabaseHistoryEntity?) -> Unit) {
ActionFileHistoryAsyncTask(
{
databaseFileHistoryDao.getByDatabaseUri(databaseUri.toString())
},
{
it?.let { fileHistoryEntity ->
fileHistoryEntity.keyFileUri?.let { keyFileUri ->
keyFileUriResultListener.invoke(Uri.parse(keyFileUri))
}
} ?: keyFileUriResultListener.invoke(null)
}
).execute()
}
fun deleteDatabaseUri(databaseUri: Uri,
fileHistoryDeletedResult: (FileDatabaseHistoryEntity?) -> Unit) {
val databaseFileHistoryDeleted = FileDatabaseHistoryEntity(
databaseUri.toString(),
"",
null,
0)
ActionFileHistoryAsyncTask(
{
databaseFileHistoryDao.delete(databaseFileHistoryDeleted)
databaseFileHistoryDao.delete(fileDatabaseHistory)
},
{
if (it != null && it > 0)
fileHistoryDeletedResult.invoke(databaseFileHistoryDeleted)
fileHistoryDeletedResult.invoke(fileDatabaseHistory)
else
fileHistoryDeletedResult.invoke(null)
}