diff --git a/app/build.gradle b/app/build.gradle index b828daf6b..4f36d745b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -11,7 +11,7 @@ android { applicationId "com.kunzisoft.keepass" minSdkVersion 15 targetSdkVersion 30 - versionCode = 66 + versionCode = 68 versionName = "2.9.15" multiDexEnabled true 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 48b2ae293..83dd275b1 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/FileDatabaseSelectActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/FileDatabaseSelectActivity.kt @@ -162,27 +162,31 @@ class FileDatabaseSelectActivity : SpecialModeActivity(), // Observe list of databases databaseFilesViewModel.databaseFilesLoaded.observe(this) { databaseFiles -> - when (databaseFiles.databaseFileAction) { - DatabaseFilesViewModel.DatabaseFileAction.NONE -> { - mAdapterDatabaseHistory?.replaceAllDatabaseFileHistoryList(databaseFiles.databaseFileList) - } - DatabaseFilesViewModel.DatabaseFileAction.ADD -> { - databaseFiles.databaseFileToActivate?.let { databaseFileToAdd -> - mAdapterDatabaseHistory?.addDatabaseFileHistory(databaseFileToAdd) + try { + when (databaseFiles.databaseFileAction) { + DatabaseFilesViewModel.DatabaseFileAction.NONE -> { + mAdapterDatabaseHistory?.replaceAllDatabaseFileHistoryList(databaseFiles.databaseFileList) } - GroupActivity.launch(this@FileDatabaseSelectActivity, - PreferencesUtil.enableReadOnlyDatabase(this@FileDatabaseSelectActivity)) - } - DatabaseFilesViewModel.DatabaseFileAction.UPDATE -> { - databaseFiles.databaseFileToActivate?.let { databaseFileToUpdate -> - mAdapterDatabaseHistory?.updateDatabaseFileHistory(databaseFileToUpdate) - } - } - DatabaseFilesViewModel.DatabaseFileAction.DELETE -> { - databaseFiles.databaseFileToActivate?.let { databaseFileToDelete -> - mAdapterDatabaseHistory?.deleteDatabaseFileHistory(databaseFileToDelete) + DatabaseFilesViewModel.DatabaseFileAction.ADD -> { + databaseFiles.databaseFileToActivate?.let { databaseFileToAdd -> + mAdapterDatabaseHistory?.addDatabaseFileHistory(databaseFileToAdd) + } + GroupActivity.launch(this@FileDatabaseSelectActivity, + PreferencesUtil.enableReadOnlyDatabase(this@FileDatabaseSelectActivity)) + } + DatabaseFilesViewModel.DatabaseFileAction.UPDATE -> { + databaseFiles.databaseFileToActivate?.let { databaseFileToUpdate -> + mAdapterDatabaseHistory?.updateDatabaseFileHistory(databaseFileToUpdate) + } + } + DatabaseFilesViewModel.DatabaseFileAction.DELETE -> { + databaseFiles.databaseFileToActivate?.let { databaseFileToDelete -> + mAdapterDatabaseHistory?.deleteDatabaseFileHistory(databaseFileToDelete) + } } } + } catch (e: Exception) { + Log.e(TAG, "Unable to observe database action", e) } databaseFilesViewModel.consumeAction() } diff --git a/app/src/main/java/com/kunzisoft/keepass/app/database/CipherDatabaseAction.kt b/app/src/main/java/com/kunzisoft/keepass/app/database/CipherDatabaseAction.kt index eec183cda..f49d8a1d9 100644 --- a/app/src/main/java/com/kunzisoft/keepass/app/database/CipherDatabaseAction.kt +++ b/app/src/main/java/com/kunzisoft/keepass/app/database/CipherDatabaseAction.kt @@ -25,6 +25,7 @@ import android.content.Intent import android.content.ServiceConnection import android.net.Uri import android.os.IBinder +import android.util.Log import com.kunzisoft.keepass.services.AdvancedUnlockNotificationService import com.kunzisoft.keepass.settings.PreferencesUtil import com.kunzisoft.keepass.utils.SingletonHolderParameter @@ -76,7 +77,11 @@ class CipherDatabaseAction(context: Context) { mServiceConnection!!, Context.BIND_ABOVE_CLIENT) 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() } - companion object : SingletonHolderParameter(::CipherDatabaseAction) + companion object : SingletonHolderParameter(::CipherDatabaseAction) { + private val TAG = CipherDatabaseAction::class.java.name + } } \ No newline at end of file diff --git a/app/src/main/java/com/kunzisoft/keepass/database/action/ProgressDatabaseTaskProvider.kt b/app/src/main/java/com/kunzisoft/keepass/database/action/ProgressDatabaseTaskProvider.kt index a9b2aad79..61caf5494 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/action/ProgressDatabaseTaskProvider.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/action/ProgressDatabaseTaskProvider.kt @@ -25,7 +25,10 @@ import android.content.Context.BIND_NOT_FOREGROUND import android.net.Uri import android.os.Bundle import android.os.IBinder +import android.util.Log +import android.widget.Toast import androidx.fragment.app.FragmentActivity +import com.kunzisoft.keepass.R import com.kunzisoft.keepass.activities.dialogs.DatabaseChangedDialogFragment import com.kunzisoft.keepass.activities.dialogs.DatabaseChangedDialogFragment.Companion.DATABASE_CHANGED_DIALOG_TAG 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) { - activity.stopService(intentDatabaseTask) - if (bundle != null) - intentDatabaseTask.putExtras(bundle) - intentDatabaseTask.action = actionTask - activity.startService(intentDatabaseTask) + try { + activity.stopService(intentDatabaseTask) + if (bundle != null) + intentDatabaseTask.putExtras(bundle) + 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) } + + companion object { + private val TAG = ProgressDatabaseTaskProvider::class.java.name + } } \ No newline at end of file diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/binary/BinaryCache.kt b/app/src/main/java/com/kunzisoft/keepass/database/element/binary/BinaryCache.kt index 46e4c84a0..d41509cb0 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/element/binary/BinaryCache.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/element/binary/BinaryCache.kt @@ -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() fun getByteArray(key: String): KeyByteArray { diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/icon/IconImageCustom.kt b/app/src/main/java/com/kunzisoft/keepass/database/element/icon/IconImageCustom.kt index efc039ee4..514222fe9 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/element/icon/IconImageCustom.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/element/icon/IconImageCustom.kt @@ -20,6 +20,7 @@ package com.kunzisoft.keepass.database.element.icon import android.os.Parcel +import android.os.ParcelUuid import android.os.Parcelable import com.kunzisoft.keepass.database.element.database.DatabaseVersioned import java.util.* @@ -37,17 +38,17 @@ class IconImageCustom : Parcelable, IconImageDraw { } constructor(parcel: Parcel) { - uuid = parcel.readSerializable() as UUID + uuid = parcel.readParcelable(ParcelUuid::class.java.classLoader)?.uuid ?: DatabaseVersioned.UUID_ZERO + } + + override fun writeToParcel(dest: Parcel, flags: Int) { + dest.writeParcelable(ParcelUuid(uuid), flags) } override fun describeContents(): Int { return 0 } - override fun writeToParcel(dest: Parcel, flags: Int) { - dest.writeSerializable(uuid) - } - override fun hashCode(): Int { val prime = 31 var result = 1 diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/node/NodeIdUUID.kt b/app/src/main/java/com/kunzisoft/keepass/database/element/node/NodeIdUUID.kt index 9ccbfcbae..06eecf05c 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/element/node/NodeIdUUID.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/element/node/NodeIdUUID.kt @@ -20,6 +20,7 @@ package com.kunzisoft.keepass.database.element.node import android.os.Parcel +import android.os.ParcelUuid import android.os.Parcelable import java.util.* @@ -35,12 +36,12 @@ class NodeIdUUID : NodeId { } constructor(parcel: Parcel) { - id = parcel.readSerializable() as UUID + id = parcel.readParcelable(ParcelUuid::class.java.classLoader)?.uuid ?: id } override fun writeToParcel(dest: Parcel, flags: Int) { super.writeToParcel(dest, flags) - dest.writeSerializable(id) + dest.writeParcelable(ParcelUuid(id), flags) } override fun equals(other: Any?): Boolean { diff --git a/app/src/main/java/com/kunzisoft/keepass/timeout/ClipboardHelper.kt b/app/src/main/java/com/kunzisoft/keepass/timeout/ClipboardHelper.kt index ea9a979bd..7c7ac123f 100644 --- a/app/src/main/java/com/kunzisoft/keepass/timeout/ClipboardHelper.kt +++ b/app/src/main/java/com/kunzisoft/keepass/timeout/ClipboardHelper.kt @@ -67,7 +67,7 @@ class ClipboardHelper(private val context: Context) { fun getClipboard(context: Context): CharSequence { if (getClipboardManager()?.hasPrimaryClip() == true) { val data = getClipboardManager()?.primaryClip - if (data!!.itemCount > 0) { + if (data != null && data.itemCount > 0) { val text = data.getItemAt(0).coerceToText(context) if (text != null) { return text diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d88a2fd90..a12c2ef0e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -142,6 +142,7 @@ An error occurred while uploading the file data. The file data already exists. An error occurred while removing the file data. + An error occurred while performing an action on the database. Field name Field value Could not find file. Try reopening it from your file browser.