From b62ef8a2ed24eda029cf66c2a745b5a1a653ebd9 Mon Sep 17 00:00:00 2001 From: J-Jamet Date: Tue, 27 Aug 2019 13:13:31 +0200 Subject: [PATCH] Update database alias --- .../activities/FileDatabaseSelectActivity.kt | 7 +- .../keepass/activities/PasswordActivity.kt | 14 +- .../adapters/FileDatabaseHistoryAdapter.kt | 68 ++++++-- .../app/database/FileDatabaseHistory.kt | 39 +++-- .../app/database/FileDatabaseHistoryEntity.kt | 2 +- .../database/action/LoadDatabaseRunnable.kt | 2 +- .../keepass/utils/FileDatabaseInfo.kt | 31 ++++ .../keepass/{adapters => utils}/FileInfo.kt | 41 +++-- .../res/layout/activity_file_selection.xml | 1 - app/src/main/res/layout/item_file_row.xml | 165 ++++++++++++------ 10 files changed, 262 insertions(+), 108 deletions(-) create mode 100644 app/src/main/java/com/kunzisoft/keepass/utils/FileDatabaseInfo.kt rename app/src/main/java/com/kunzisoft/keepass/{adapters => utils}/FileInfo.kt (68%) diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/FileDatabaseSelectActivity.kt b/app/src/main/java/com/kunzisoft/keepass/activities/FileDatabaseSelectActivity.kt index b0af71008..3d0a6b28a 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/FileDatabaseSelectActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/FileDatabaseSelectActivity.kt @@ -48,7 +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.adapters.FileInfo +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 @@ -165,6 +165,9 @@ class FileDatabaseSelectActivity : StylishActivity(), mAdapterDatabaseHistory = FileDatabaseHistoryAdapter(this) mAdapterDatabaseHistory?.setOnItemClickListener(this) mAdapterDatabaseHistory?.setFileSelectClearListener(this) + mAdapterDatabaseHistory?.setSaveAliasListener { fileDatabaseHistoryWithNewAlias -> + mFileDatabaseHistory?.addOrUpdateFileDatabaseHistory(fileDatabaseHistoryWithNewAlias) + } fileDatabaseHistoryRecyclerView.adapter = mAdapterDatabaseHistory // Load default database if not an orientation change @@ -379,7 +382,7 @@ class FileDatabaseSelectActivity : StylishActivity(), runOnUiThread { if (result.isSuccess) { // Add database to recent files - mFileDatabaseHistory?.addDatabaseUri(fileURI) + mFileDatabaseHistory?.addOrUpdateDatabaseUri(fileURI) mAdapterDatabaseHistory?.notifyDataSetChanged() updateFileListVisibility() GroupActivity.launch(this@FileDatabaseSelectActivity) diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/PasswordActivity.kt b/app/src/main/java/com/kunzisoft/keepass/activities/PasswordActivity.kt index 16866167c..69481ecc2 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/PasswordActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/PasswordActivity.kt @@ -51,6 +51,7 @@ import com.kunzisoft.keepass.activities.helpers.OpenFileHelper import com.kunzisoft.keepass.activities.helpers.ReadOnlyHelper import com.kunzisoft.keepass.activities.lock.LockingActivity import com.kunzisoft.keepass.activities.stylish.StylishActivity +import com.kunzisoft.keepass.utils.FileDatabaseInfo import com.kunzisoft.keepass.app.database.FileDatabaseHistory import com.kunzisoft.keepass.autofill.AutofillHelper import com.kunzisoft.keepass.database.action.LoadDatabaseRunnable @@ -67,7 +68,6 @@ import com.kunzisoft.keepass.utils.UriUtil import com.kunzisoft.keepass.view.FingerPrintInfoView import com.kunzisoft.keepass.view.asError import kotlinx.android.synthetic.main.activity_password.* -import java.io.File import java.io.FileNotFoundException import java.lang.Exception import java.lang.ref.WeakReference @@ -230,12 +230,10 @@ class PasswordActivity : StylishActivity() { mDatabaseFileUri = databaseFileUri // Define title - val dbUriString = databaseFileUri?.toString() ?: "" - if (dbUriString.isNotEmpty()) { - if (PreferencesUtil.isFullFilePathEnable(this)) - filenameView?.text = dbUriString - else - filenameView?.text = File(databaseFileUri!!.path!!).name // TODO Encapsulate + databaseFileUri?.let { + FileDatabaseInfo(this, it).retrieveDatabaseTitle { title -> + filenameView?.text = title + } } // Define Key File text @@ -251,7 +249,7 @@ class PasswordActivity : StylishActivity() { newDefaultFileName = databaseFileUri?.toString() ?: newDefaultFileName } - prefs?.edit()?.apply() { + prefs?.edit()?.apply { putString(KEY_DEFAULT_FILENAME, newDefaultFileName) apply() } diff --git a/app/src/main/java/com/kunzisoft/keepass/adapters/FileDatabaseHistoryAdapter.kt b/app/src/main/java/com/kunzisoft/keepass/adapters/FileDatabaseHistoryAdapter.kt index 34d05dd92..528152e96 100644 --- a/app/src/main/java/com/kunzisoft/keepass/adapters/FileDatabaseHistoryAdapter.kt +++ b/app/src/main/java/com/kunzisoft/keepass/adapters/FileDatabaseHistoryAdapter.kt @@ -25,11 +25,15 @@ import android.support.annotation.ColorInt import android.support.v7.widget.RecyclerView import android.util.TypedValue import android.view.* +import android.widget.EditText import android.widget.ImageView import android.widget.TextView +import android.widget.ViewSwitcher 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() { @@ -37,6 +41,7 @@ class FileDatabaseHistoryAdapter(private val context: Context) private val inflater: LayoutInflater = LayoutInflater.from(context) private var fileItemOpenListener: FileItemOpenListener? = null private var fileSelectClearListener: FileSelectClearListener? = null + private var saveAliasListener: ((FileDatabaseHistoryEntity)->Unit)? = null private val listDatabaseFiles = ArrayList() @@ -64,9 +69,9 @@ class FileDatabaseHistoryAdapter(private val context: Context) } override fun onBindViewHolder(holder: FileDatabaseHistoryViewHolder, position: Int) { + // Get info from position val fileHistoryEntity = listDatabaseFiles[position] - - val fileDatabaseInfo = FileInfo(context, fileHistoryEntity.databaseUri) + val fileDatabaseInfo = FileDatabaseInfo(context, fileHistoryEntity.databaseUri) // Context menu creation holder.fileContainer.setOnCreateContextMenuListener(ContextMenuBuilder(fileDatabaseInfo)) @@ -75,12 +80,7 @@ class FileDatabaseHistoryAdapter(private val context: Context) holder.fileContainer.setOnClickListener(FileItemClickListener(fileHistoryEntity)) // File alias - val aliasText = fileHistoryEntity.databaseAlias - holder.fileAlias.text = when { - aliasText.isNotEmpty() -> aliasText - PreferencesUtil.isFullFilePathEnable(context) -> Uri.decode(fileDatabaseInfo.fileUri.toString()) - else -> fileDatabaseInfo.fileName - } + holder.fileAlias.text = fileDatabaseInfo.retrieveDatabaseAlias(fileHistoryEntity.databaseAlias) // File path holder.filePath.text = Uri.decode(fileDatabaseInfo.fileUri.toString()) @@ -101,15 +101,40 @@ class FileDatabaseHistoryAdapter(private val context: Context) //This line hides or shows the layout in question holder.fileExpandContainer.visibility = if (isExpanded) View.VISIBLE else View.GONE - if (isExpanded) - mPreviousExpandedPosition = position - if (mPreviousExpandedPosition != position) { - holder.fileInformation.setOnClickListener { - mExpandedPosition = if (isExpanded) -1 else position - notifyItemChanged(mPreviousExpandedPosition) - notifyItemChanged(position) - } + // Save alias modification + holder.fileAliasCloseButton.setOnClickListener { + // Change the alias + fileHistoryEntity.databaseAlias = holder.fileAliasEdit.text.toString() + saveAliasListener?.invoke(fileHistoryEntity) + + // Finish save mode + holder.fileMainSwitcher.showPrevious() + // Refresh current position to show alias + notifyItemChanged(position) } + + // Open alias modification + holder.fileModifyButton.setOnClickListener { + holder.fileAliasEdit.setText(holder.fileAlias.text) + holder.fileMainSwitcher.showNext() + } + + if (isExpanded) { + mPreviousExpandedPosition = position + } + + holder.fileInformation.setOnClickListener { + mExpandedPosition = if (isExpanded) -1 else position + + // Notify change + notifyItemChanged(mPreviousExpandedPosition) + notifyItemChanged(position) + } + + // Refresh View / Close alias modification if not contains fileAlias + if (holder.fileMainSwitcher.currentView.findViewById(R.id.file_alias) + != holder.fileAlias) + holder.fileMainSwitcher.showPrevious() } override fun getItemCount(): Int { @@ -133,6 +158,10 @@ class FileDatabaseHistoryAdapter(private val context: Context) this.fileSelectClearListener = fileSelectClearListener } + fun setSaveAliasListener(listener : ((FileDatabaseHistoryEntity)->Unit)?) { + this.saveAliasListener = listener + } + interface FileItemOpenListener { fun onFileItemOpenListener(fileDatabaseHistoryEntity: FileDatabaseHistoryEntity) } @@ -167,12 +196,17 @@ class FileDatabaseHistoryAdapter(private val context: Context) inner class FileDatabaseHistoryViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { - var fileContainer: ViewGroup = itemView.findViewById(R.id.file_main_container) + var fileContainer: ViewGroup = itemView.findViewById(R.id.file_container_basic_info) var fileAlias: TextView = itemView.findViewById(R.id.file_alias) var fileInformation: ImageView = itemView.findViewById(R.id.file_information) + var fileMainSwitcher: ViewSwitcher = itemView.findViewById(R.id.file_main_switcher) + var fileAliasEdit: EditText = itemView.findViewById(R.id.file_alias_edit) + var fileAliasCloseButton: ImageView = itemView.findViewById(R.id.file_alias_save) + var fileExpandContainer: ViewGroup = itemView.findViewById(R.id.file_expand_container) + var fileModifyButton: ImageView = itemView.findViewById(R.id.file_modify_button) var filePath: TextView = itemView.findViewById(R.id.file_path) var filePreciseInfoContainer: ViewGroup = itemView.findViewById(R.id.file_precise_info_container) var fileModification: TextView = itemView.findViewById(R.id.file_modification) diff --git a/app/src/main/java/com/kunzisoft/keepass/app/database/FileDatabaseHistory.kt b/app/src/main/java/com/kunzisoft/keepass/app/database/FileDatabaseHistory.kt index fdd9a9df1..e0270e051 100644 --- a/app/src/main/java/com/kunzisoft/keepass/app/database/FileDatabaseHistory.kt +++ b/app/src/main/java/com/kunzisoft/keepass/app/database/FileDatabaseHistory.kt @@ -32,6 +32,17 @@ class FileDatabaseHistory(applicationContext: Context) { .getDatabase(applicationContext) .databaseFileHistoryDao() + fun getFileDatabaseHistory(databaseUri: Uri, fileHistoryResultListener: (fileDatabaseHistoryResult: FileDatabaseHistoryEntity?) -> Unit) { + ActionFileHistoryAsyncTask( + { + databaseFileHistoryDao.getByDatabaseUri(databaseUri.toString()) + }, + { + fileHistoryResultListener.invoke(it) + } + ).execute() + } + fun getAll(fileHistoryResultListener: (fileDatabaseHistoryResult: List?) -> Unit) { ActionFileHistoryAsyncTask( { @@ -43,20 +54,28 @@ class FileDatabaseHistory(applicationContext: Context) { ).execute() } - fun addDatabaseUri(databaseUri: Uri, keyFileUri: Uri? = null) { + fun addOrUpdateDatabaseUri(databaseUri: Uri, keyFileUri: Uri? = null) { + addOrUpdateFileDatabaseHistory(FileDatabaseHistoryEntity( + databaseUri.toString(), + "", + keyFileUri?.toString(), + System.currentTimeMillis() + ), true) + } + + fun addOrUpdateFileDatabaseHistory(fileDatabaseHistory: FileDatabaseHistoryEntity, unmodifiedAlias: Boolean = false) { ActionFileHistoryAsyncTask( { - val newDatabaseFileHistory = FileDatabaseHistoryEntity( - databaseUri.toString(), - "", - keyFileUri?.toString(), - System.currentTimeMillis() - ) + val fileDatabaseHistoryRetrieve = databaseFileHistoryDao.getByDatabaseUri(fileDatabaseHistory.databaseUri) + + if (unmodifiedAlias) { + fileDatabaseHistory.databaseAlias = fileDatabaseHistoryRetrieve?.databaseAlias ?: "" + } // Update values if history element not yet in the database - if (databaseFileHistoryDao.getByDatabaseUri(newDatabaseFileHistory.databaseUri) == null) { - databaseFileHistoryDao.add(newDatabaseFileHistory) + if (fileDatabaseHistoryRetrieve == null) { + databaseFileHistoryDao.add(fileDatabaseHistory) } else { - databaseFileHistoryDao.update(newDatabaseFileHistory) + databaseFileHistoryDao.update(fileDatabaseHistory) } } ).execute() diff --git a/app/src/main/java/com/kunzisoft/keepass/app/database/FileDatabaseHistoryEntity.kt b/app/src/main/java/com/kunzisoft/keepass/app/database/FileDatabaseHistoryEntity.kt index 666d07f11..3ea929599 100644 --- a/app/src/main/java/com/kunzisoft/keepass/app/database/FileDatabaseHistoryEntity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/app/database/FileDatabaseHistoryEntity.kt @@ -11,7 +11,7 @@ data class FileDatabaseHistoryEntity( val databaseUri: String, @ColumnInfo(name = "database_alias") - val databaseAlias: String, + var databaseAlias: String, @ColumnInfo(name = "keyfile_uri") var keyFileUri: String?, diff --git a/app/src/main/java/com/kunzisoft/keepass/database/action/LoadDatabaseRunnable.kt b/app/src/main/java/com/kunzisoft/keepass/database/action/LoadDatabaseRunnable.kt index 748b8a99f..fbb9230d5 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/action/LoadDatabaseRunnable.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/action/LoadDatabaseRunnable.kt @@ -120,7 +120,7 @@ class LoadDatabaseRunnable(private val mWeakContext: WeakReference, keyFileUri = null } mWeakContext.get()?.let { - FileDatabaseHistory.getInstance(it).addDatabaseUri(uri, keyFileUri) + FileDatabaseHistory.getInstance(it).addOrUpdateDatabaseUri(uri, keyFileUri) } } diff --git a/app/src/main/java/com/kunzisoft/keepass/utils/FileDatabaseInfo.kt b/app/src/main/java/com/kunzisoft/keepass/utils/FileDatabaseInfo.kt new file mode 100644 index 000000000..4f8d47527 --- /dev/null +++ b/app/src/main/java/com/kunzisoft/keepass/utils/FileDatabaseInfo.kt @@ -0,0 +1,31 @@ +package com.kunzisoft.keepass.utils + +import android.content.Context +import android.net.Uri +import com.kunzisoft.keepass.app.database.FileDatabaseHistory +import com.kunzisoft.keepass.settings.PreferencesUtil + +class FileDatabaseInfo : FileInfo { + + constructor(context: Context, fileUri: Uri): super(context, fileUri) + + constructor(context: Context, filePath: String): super(context, filePath) + + fun retrieveDatabaseAlias(alias: String): String { + return when { + alias.isNotEmpty() -> alias + PreferencesUtil.isFullFilePathEnable(context) -> filePath ?: "" + else -> fileName ?: "" + } + } + + fun retrieveDatabaseTitle(titleCallback: (String)->Unit) { + + FileDatabaseHistory.getInstance(context.applicationContext).getFileDatabaseHistory(fileUri) { + fileDatabaseHistoryEntity -> + + titleCallback.invoke(retrieveDatabaseAlias(fileDatabaseHistoryEntity?.databaseAlias ?: "")) + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/kunzisoft/keepass/adapters/FileInfo.kt b/app/src/main/java/com/kunzisoft/keepass/utils/FileInfo.kt similarity index 68% rename from app/src/main/java/com/kunzisoft/keepass/adapters/FileInfo.kt rename to app/src/main/java/com/kunzisoft/keepass/utils/FileInfo.kt index 7ff4eb7c8..5d559c0c8 100644 --- a/app/src/main/java/com/kunzisoft/keepass/adapters/FileInfo.kt +++ b/app/src/main/java/com/kunzisoft/keepass/utils/FileInfo.kt @@ -17,41 +17,56 @@ * along with KeePass DX. If not, see . * */ -package com.kunzisoft.keepass.adapters +package com.kunzisoft.keepass.utils import android.content.Context import android.net.Uri import android.support.v4.provider.DocumentFile import com.kunzisoft.keepass.R - import java.io.File import java.io.Serializable import java.text.DateFormat -import java.util.Date +import java.util.* -class FileInfo(private val context: Context, pathFile: String) : Serializable { +open class FileInfo : Serializable { + var context: Context + var fileUri: Uri + var filePath: String? = null var fileName: String? = "" - var fileUri: Uri? = null var lastModification = Date() var size: Long = 0L - init { - fileUri = Uri.parse(pathFile) - if (EXTERNAL_STORAGE_AUTHORITY == fileUri!!.authority) { + constructor(context: Context, fileUri: Uri) { + this.context = context + this.fileUri = fileUri + init() + } + + constructor(context: Context, filePath: String) { + this.context = context + this.fileUri = Uri.parse(filePath) + init() + } + + fun init() { + this.filePath = fileUri.path + if (EXTERNAL_STORAGE_AUTHORITY == fileUri.authority) { val file = DocumentFile.fromSingleUri(context, fileUri) size = file.length() fileName = file.name lastModification = Date(file.lastModified()) } else { - val file = File(fileUri!!.path!!) - size = file.length() - fileName = file.name - lastModification = Date(file.lastModified()) + filePath?.let { + val file = File(it) + size = file.length() + fileName = file.name + lastModification = Date(file.lastModified()) + } } if (fileName == null || fileName!!.isEmpty()) { - fileName = fileUri!!.path + fileName = filePath } } diff --git a/app/src/main/res/layout/activity_file_selection.xml b/app/src/main/res/layout/activity_file_selection.xml index bbec44403..c0b809785 100644 --- a/app/src/main/res/layout/activity_file_selection.xml +++ b/app/src/main/res/layout/activity_file_selection.xml @@ -129,7 +129,6 @@ android:layout_height="wrap_content" android:layout_width="0dp" android:layout_margin="24dp" - android:minHeight="200dp" android:elevation="6dp" android:background="?attr/colorPrimaryDark" app:layout_constraintWidth_percent="@dimen/content_percent" diff --git a/app/src/main/res/layout/item_file_row.xml b/app/src/main/res/layout/item_file_row.xml index d80dd8b96..15b5e9805 100644 --- a/app/src/main/res/layout/item_file_row.xml +++ b/app/src/main/res/layout/item_file_row.xml @@ -33,64 +33,119 @@ android:layout_height="1dp" android:background="?attr/colorPrimaryDark"/> - - + - + + + + - + android:elevation="8dp"> + + + + - + app:layout_constraintTop_toBottomOf="@+id/file_main_switcher"> + + + app:layout_constraintStart_toEndOf="@+id/file_modification" + app:layout_constraintTop_toTopOf="@+id/file_modification" + tools:text="8 bytes" /> - + \ No newline at end of file