mirror of
https://github.com/Kunzisoft/KeePassDX.git
synced 2025-12-04 15:49:33 +01:00
Merge tag '2.9.15' into develop
2.9.15
This commit is contained in:
@@ -11,7 +11,7 @@ android {
|
|||||||
applicationId "com.kunzisoft.keepass"
|
applicationId "com.kunzisoft.keepass"
|
||||||
minSdkVersion 15
|
minSdkVersion 15
|
||||||
targetSdkVersion 30
|
targetSdkVersion 30
|
||||||
versionCode = 66
|
versionCode = 68
|
||||||
versionName = "2.9.15"
|
versionName = "2.9.15"
|
||||||
multiDexEnabled true
|
multiDexEnabled true
|
||||||
|
|
||||||
|
|||||||
@@ -162,27 +162,31 @@ class FileDatabaseSelectActivity : SpecialModeActivity(),
|
|||||||
|
|
||||||
// Observe list of databases
|
// Observe list of databases
|
||||||
databaseFilesViewModel.databaseFilesLoaded.observe(this) { databaseFiles ->
|
databaseFilesViewModel.databaseFilesLoaded.observe(this) { databaseFiles ->
|
||||||
when (databaseFiles.databaseFileAction) {
|
try {
|
||||||
DatabaseFilesViewModel.DatabaseFileAction.NONE -> {
|
when (databaseFiles.databaseFileAction) {
|
||||||
mAdapterDatabaseHistory?.replaceAllDatabaseFileHistoryList(databaseFiles.databaseFileList)
|
DatabaseFilesViewModel.DatabaseFileAction.NONE -> {
|
||||||
}
|
mAdapterDatabaseHistory?.replaceAllDatabaseFileHistoryList(databaseFiles.databaseFileList)
|
||||||
DatabaseFilesViewModel.DatabaseFileAction.ADD -> {
|
|
||||||
databaseFiles.databaseFileToActivate?.let { databaseFileToAdd ->
|
|
||||||
mAdapterDatabaseHistory?.addDatabaseFileHistory(databaseFileToAdd)
|
|
||||||
}
|
}
|
||||||
GroupActivity.launch(this@FileDatabaseSelectActivity,
|
DatabaseFilesViewModel.DatabaseFileAction.ADD -> {
|
||||||
PreferencesUtil.enableReadOnlyDatabase(this@FileDatabaseSelectActivity))
|
databaseFiles.databaseFileToActivate?.let { databaseFileToAdd ->
|
||||||
}
|
mAdapterDatabaseHistory?.addDatabaseFileHistory(databaseFileToAdd)
|
||||||
DatabaseFilesViewModel.DatabaseFileAction.UPDATE -> {
|
}
|
||||||
databaseFiles.databaseFileToActivate?.let { databaseFileToUpdate ->
|
GroupActivity.launch(this@FileDatabaseSelectActivity,
|
||||||
mAdapterDatabaseHistory?.updateDatabaseFileHistory(databaseFileToUpdate)
|
PreferencesUtil.enableReadOnlyDatabase(this@FileDatabaseSelectActivity))
|
||||||
}
|
}
|
||||||
}
|
DatabaseFilesViewModel.DatabaseFileAction.UPDATE -> {
|
||||||
DatabaseFilesViewModel.DatabaseFileAction.DELETE -> {
|
databaseFiles.databaseFileToActivate?.let { databaseFileToUpdate ->
|
||||||
databaseFiles.databaseFileToActivate?.let { databaseFileToDelete ->
|
mAdapterDatabaseHistory?.updateDatabaseFileHistory(databaseFileToUpdate)
|
||||||
mAdapterDatabaseHistory?.deleteDatabaseFileHistory(databaseFileToDelete)
|
}
|
||||||
|
}
|
||||||
|
DatabaseFilesViewModel.DatabaseFileAction.DELETE -> {
|
||||||
|
databaseFiles.databaseFileToActivate?.let { databaseFileToDelete ->
|
||||||
|
mAdapterDatabaseHistory?.deleteDatabaseFileHistory(databaseFileToDelete)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} catch (e: Exception) {
|
||||||
|
Log.e(TAG, "Unable to observe database action", e)
|
||||||
}
|
}
|
||||||
databaseFilesViewModel.consumeAction()
|
databaseFilesViewModel.consumeAction()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ import android.content.Intent
|
|||||||
import android.content.ServiceConnection
|
import android.content.ServiceConnection
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import android.os.IBinder
|
import android.os.IBinder
|
||||||
|
import android.util.Log
|
||||||
import com.kunzisoft.keepass.services.AdvancedUnlockNotificationService
|
import com.kunzisoft.keepass.services.AdvancedUnlockNotificationService
|
||||||
import com.kunzisoft.keepass.settings.PreferencesUtil
|
import com.kunzisoft.keepass.settings.PreferencesUtil
|
||||||
import com.kunzisoft.keepass.utils.SingletonHolderParameter
|
import com.kunzisoft.keepass.utils.SingletonHolderParameter
|
||||||
@@ -76,7 +77,11 @@ class CipherDatabaseAction(context: Context) {
|
|||||||
mServiceConnection!!,
|
mServiceConnection!!,
|
||||||
Context.BIND_ABOVE_CLIENT)
|
Context.BIND_ABOVE_CLIENT)
|
||||||
if (mBinder == null) {
|
if (mBinder == null) {
|
||||||
applicationContext.startService(mIntentAdvancedUnlockService)
|
try {
|
||||||
|
applicationContext.startService(mIntentAdvancedUnlockService)
|
||||||
|
} catch (e: Exception) {
|
||||||
|
Log.e(TAG, "Unable to start cipher action", e)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -173,5 +178,7 @@ class CipherDatabaseAction(context: Context) {
|
|||||||
).execute()
|
).execute()
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object : SingletonHolderParameter<CipherDatabaseAction, Context>(::CipherDatabaseAction)
|
companion object : SingletonHolderParameter<CipherDatabaseAction, Context>(::CipherDatabaseAction) {
|
||||||
|
private val TAG = CipherDatabaseAction::class.java.name
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -25,7 +25,10 @@ import android.content.Context.BIND_NOT_FOREGROUND
|
|||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.os.IBinder
|
import android.os.IBinder
|
||||||
|
import android.util.Log
|
||||||
|
import android.widget.Toast
|
||||||
import androidx.fragment.app.FragmentActivity
|
import androidx.fragment.app.FragmentActivity
|
||||||
|
import com.kunzisoft.keepass.R
|
||||||
import com.kunzisoft.keepass.activities.dialogs.DatabaseChangedDialogFragment
|
import com.kunzisoft.keepass.activities.dialogs.DatabaseChangedDialogFragment
|
||||||
import com.kunzisoft.keepass.activities.dialogs.DatabaseChangedDialogFragment.Companion.DATABASE_CHANGED_DIALOG_TAG
|
import com.kunzisoft.keepass.activities.dialogs.DatabaseChangedDialogFragment.Companion.DATABASE_CHANGED_DIALOG_TAG
|
||||||
import com.kunzisoft.keepass.app.database.CipherDatabaseEntity
|
import com.kunzisoft.keepass.app.database.CipherDatabaseEntity
|
||||||
@@ -251,11 +254,16 @@ class ProgressDatabaseTaskProvider(private val activity: FragmentActivity) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun start(bundle: Bundle? = null, actionTask: String) {
|
private fun start(bundle: Bundle? = null, actionTask: String) {
|
||||||
activity.stopService(intentDatabaseTask)
|
try {
|
||||||
if (bundle != null)
|
activity.stopService(intentDatabaseTask)
|
||||||
intentDatabaseTask.putExtras(bundle)
|
if (bundle != null)
|
||||||
intentDatabaseTask.action = actionTask
|
intentDatabaseTask.putExtras(bundle)
|
||||||
activity.startService(intentDatabaseTask)
|
intentDatabaseTask.action = actionTask
|
||||||
|
activity.startService(intentDatabaseTask)
|
||||||
|
} catch (e: Exception) {
|
||||||
|
Log.e(TAG, "Unable to perform database action", e)
|
||||||
|
Toast.makeText(activity, R.string.error_start_database_action, Toast.LENGTH_LONG).show()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -591,4 +599,8 @@ class ProgressDatabaseTaskProvider(private val activity: FragmentActivity) {
|
|||||||
}
|
}
|
||||||
, ACTION_DATABASE_SAVE)
|
, ACTION_DATABASE_SAVE)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
private val TAG = ProgressDatabaseTaskProvider::class.java.name
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -27,7 +27,7 @@ class BinaryCache {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Similar to file storage but much faster
|
// Similar to file storage but much faster TODO SparseArray
|
||||||
private val byteArrayList = HashMap<String, ByteArray>()
|
private val byteArrayList = HashMap<String, ByteArray>()
|
||||||
|
|
||||||
fun getByteArray(key: String): KeyByteArray {
|
fun getByteArray(key: String): KeyByteArray {
|
||||||
|
|||||||
@@ -20,6 +20,7 @@
|
|||||||
package com.kunzisoft.keepass.database.element.icon
|
package com.kunzisoft.keepass.database.element.icon
|
||||||
|
|
||||||
import android.os.Parcel
|
import android.os.Parcel
|
||||||
|
import android.os.ParcelUuid
|
||||||
import android.os.Parcelable
|
import android.os.Parcelable
|
||||||
import com.kunzisoft.keepass.database.element.database.DatabaseVersioned
|
import com.kunzisoft.keepass.database.element.database.DatabaseVersioned
|
||||||
import java.util.*
|
import java.util.*
|
||||||
@@ -37,17 +38,17 @@ class IconImageCustom : Parcelable, IconImageDraw {
|
|||||||
}
|
}
|
||||||
|
|
||||||
constructor(parcel: Parcel) {
|
constructor(parcel: Parcel) {
|
||||||
uuid = parcel.readSerializable() as UUID
|
uuid = parcel.readParcelable<ParcelUuid>(ParcelUuid::class.java.classLoader)?.uuid ?: DatabaseVersioned.UUID_ZERO
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun writeToParcel(dest: Parcel, flags: Int) {
|
||||||
|
dest.writeParcelable(ParcelUuid(uuid), flags)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun describeContents(): Int {
|
override fun describeContents(): Int {
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun writeToParcel(dest: Parcel, flags: Int) {
|
|
||||||
dest.writeSerializable(uuid)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun hashCode(): Int {
|
override fun hashCode(): Int {
|
||||||
val prime = 31
|
val prime = 31
|
||||||
var result = 1
|
var result = 1
|
||||||
|
|||||||
@@ -20,6 +20,7 @@
|
|||||||
package com.kunzisoft.keepass.database.element.node
|
package com.kunzisoft.keepass.database.element.node
|
||||||
|
|
||||||
import android.os.Parcel
|
import android.os.Parcel
|
||||||
|
import android.os.ParcelUuid
|
||||||
import android.os.Parcelable
|
import android.os.Parcelable
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
@@ -35,12 +36,12 @@ class NodeIdUUID : NodeId<UUID> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
constructor(parcel: Parcel) {
|
constructor(parcel: Parcel) {
|
||||||
id = parcel.readSerializable() as UUID
|
id = parcel.readParcelable<ParcelUuid>(ParcelUuid::class.java.classLoader)?.uuid ?: id
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun writeToParcel(dest: Parcel, flags: Int) {
|
override fun writeToParcel(dest: Parcel, flags: Int) {
|
||||||
super.writeToParcel(dest, flags)
|
super.writeToParcel(dest, flags)
|
||||||
dest.writeSerializable(id)
|
dest.writeParcelable(ParcelUuid(id), flags)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun equals(other: Any?): Boolean {
|
override fun equals(other: Any?): Boolean {
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ class ClipboardHelper(private val context: Context) {
|
|||||||
fun getClipboard(context: Context): CharSequence {
|
fun getClipboard(context: Context): CharSequence {
|
||||||
if (getClipboardManager()?.hasPrimaryClip() == true) {
|
if (getClipboardManager()?.hasPrimaryClip() == true) {
|
||||||
val data = getClipboardManager()?.primaryClip
|
val data = getClipboardManager()?.primaryClip
|
||||||
if (data!!.itemCount > 0) {
|
if (data != null && data.itemCount > 0) {
|
||||||
val text = data.getItemAt(0).coerceToText(context)
|
val text = data.getItemAt(0).coerceToText(context)
|
||||||
if (text != null) {
|
if (text != null) {
|
||||||
return text
|
return text
|
||||||
|
|||||||
@@ -142,6 +142,7 @@
|
|||||||
<string name="error_upload_file">An error occurred while uploading the file data.</string>
|
<string name="error_upload_file">An error occurred while uploading the file data.</string>
|
||||||
<string name="error_duplicate_file">The file data already exists.</string>
|
<string name="error_duplicate_file">The file data already exists.</string>
|
||||||
<string name="error_remove_file">An error occurred while removing the file data.</string>
|
<string name="error_remove_file">An error occurred while removing the file data.</string>
|
||||||
|
<string name="error_start_database_action">An error occurred while performing an action on the database.</string>
|
||||||
<string name="field_name">Field name</string>
|
<string name="field_name">Field name</string>
|
||||||
<string name="field_value">Field value</string>
|
<string name="field_value">Field value</string>
|
||||||
<string name="file_not_found_content">Could not find file. Try reopening it from your file browser.</string>
|
<string name="file_not_found_content">Could not find file. Try reopening it from your file browser.</string>
|
||||||
|
|||||||
Reference in New Issue
Block a user