Update database alias

This commit is contained in:
J-Jamet
2019-08-27 13:13:31 +02:00
parent 622ba65841
commit b62ef8a2ed
10 changed files with 262 additions and 108 deletions

View File

@@ -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)

View File

@@ -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()
}

View File

@@ -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<FileDatabaseHistoryAdapter.FileDatabaseHistoryViewHolder>() {
@@ -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<FileDatabaseHistoryEntity>()
@@ -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)
// 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
if (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<View>(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)

View File

@@ -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<FileDatabaseHistoryEntity>?) -> Unit) {
ActionFileHistoryAsyncTask(
{
@@ -43,20 +54,28 @@ class FileDatabaseHistory(applicationContext: Context) {
).execute()
}
fun addDatabaseUri(databaseUri: Uri, keyFileUri: Uri? = null) {
ActionFileHistoryAsyncTask(
{
val newDatabaseFileHistory = FileDatabaseHistoryEntity(
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 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()

View File

@@ -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?,

View File

@@ -120,7 +120,7 @@ class LoadDatabaseRunnable(private val mWeakContext: WeakReference<Context>,
keyFileUri = null
}
mWeakContext.get()?.let {
FileDatabaseHistory.getInstance(it).addDatabaseUri(uri, keyFileUri)
FileDatabaseHistory.getInstance(it).addOrUpdateDatabaseUri(uri, keyFileUri)
}
}

View File

@@ -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 ?: ""))
}
}
}

View File

@@ -17,41 +17,56 @@
* along with KeePass DX. If not, see <http://www.gnu.org/licenses/>.
*
*/
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!!)
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
}
}

View File

@@ -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"

View File

@@ -33,8 +33,12 @@
android:layout_height="1dp"
android:background="?attr/colorPrimaryDark"/>
<ViewSwitcher
android:id="@+id/file_main_switcher"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.constraint.ConstraintLayout
android:id="@+id/file_main_container"
android:id="@+id/file_container_basic_info"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@@ -69,28 +73,79 @@
app:layout_constraintStart_toEndOf="@+id/file_alias"
app:layout_constraintEnd_toEndOf="parent"
android:src="@drawable/ic_info_white_24dp"
android:contentDescription="@string/content_description_file_information"
android:tint="?android:attr/textColorHintInverse"/>
android:tint="?android:attr/textColorHintInverse"
android:contentDescription="@string/content_description_file_information"/>
</android.support.constraint.ConstraintLayout>
<android.support.constraint.ConstraintLayout
android:id="@+id/file_container_alias_register"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?android:attr/selectableItemBackground"
app:layout_constraintTop_toTopOf="parent"
android:elevation="8dp">
<android.support.v7.widget.AppCompatEditText
android:id="@+id/file_alias_edit"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:minHeight="48dp"
android:layout_centerVertical="true"
android:maxLines="2"
android:gravity="center_vertical"
android:layout_marginTop="4dp"
android:layout_marginBottom="4dp"
android:layout_marginStart="24dp"
android:layout_marginEnd="24dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toStartOf="@+id/file_alias_save"
android:textColor="?attr/textColorInverse"
tools:text="DatabaseAlias" />
<android.support.v7.widget.AppCompatImageView
android:id="@+id/file_alias_save"
android:layout_width="48dp"
android:layout_height="48dp"
android:padding="12dp"
android:layout_centerVertical="true"
android:layout_marginTop="4dp"
android:layout_marginBottom="4dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toEndOf="@+id/file_alias_edit"
app:layout_constraintEnd_toEndOf="parent"
android:src="@drawable/ic_save_white_24dp"
android:contentDescription="@string/content_description_file_information"/>
</android.support.constraint.ConstraintLayout>
</ViewSwitcher>
<LinearLayout
<android.support.constraint.ConstraintLayout
android:id="@+id/file_expand_container"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimaryDark"
app:layout_constraintTop_toBottomOf="@+id/file_main_container"
android:padding="8dp">
app:layout_constraintTop_toBottomOf="@+id/file_main_switcher">
<android.support.v7.widget.AppCompatImageView
android:id="@+id/file_modify_button"
android:layout_width="48dp"
android:layout_height="48dp"
android:padding="12dp"
android:src="@drawable/ic_mode_edit_white_24dp"
android:scaleX="-1"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
android:tint="?android:attr/textColorHintInverse"/>
<android.support.v7.widget.AppCompatTextView
android:id="@+id/file_path"
android:textIsSelectable="true"
android:layout_marginBottom="8dp"
android:layout_marginLeft="8dp"
android:layout_marginStart="8dp"
android:layout_width="match_parent"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:minHeight="48dp"
android:padding="12dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toEndOf="@+id/file_modify_button"
app:layout_constraintEnd_toEndOf="parent"
tools:text="/path/to/DatabaseName.kdbx"
android:textColor="?android:attr/textColorHintInverse"
android:gravity="end"
@@ -98,38 +153,38 @@
<android.support.constraint.ConstraintLayout
android:id="@+id/file_precise_info_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@+id/file_path"
app:layout_constraintStart_toEndOf="@+id/file_modify_button"
app:layout_constraintEnd_toEndOf="parent"
android:paddingBottom="12dp"
android:paddingStart="12dp"
android:paddingEnd="12dp"
android:orientation="horizontal">
<android.support.v7.widget.AppCompatTextView
android:id="@+id/file_modification"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="8dp"
android:layout_marginStart="8dp"
tools:text="25 Augst"
android:textColor="?android:attr/textColorHintInverse"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toStartOf="@+id/file_size"
android:layout_margin="8dp"
android:gravity="start"/>
<android.support.v7.widget.AppCompatTextView
android:id="@+id/file_size"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="8dp"
android:layout_marginStart="8dp"
tools:text="8 bytes"
android:gravity="end"
android:textColor="?android:attr/textColorHintInverse"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toEndOf="@+id/file_modification"
app:layout_constraintEnd_toEndOf="parent"
android:layout_margin="8dp"
android:gravity="end"/>
app:layout_constraintStart_toEndOf="@+id/file_modification"
app:layout_constraintTop_toTopOf="@+id/file_modification"
tools:text="8 bytes" />
</android.support.constraint.ConstraintLayout>
</LinearLayout>
</android.support.constraint.ConstraintLayout>
</LinearLayout>