From 04eae1ae3d2ef867272a0f4b097ee078f6c66d0e Mon Sep 17 00:00:00 2001 From: GianpaMX Date: Sat, 22 Oct 2022 07:57:40 +0100 Subject: [PATCH 1/9] new module --- app/build.gradle | 3 ++ database/.gitignore | 1 + database/build.gradle | 54 +++++++++++++++++++ database/consumer-rules.pro | 0 database/proguard-rules.pro | 21 ++++++++ .../database/ExampleInstrumentedTest.kt | 24 +++++++++ database/src/main/AndroidManifest.xml | 2 + .../keepass/database/ExampleUnitTest.kt | 17 ++++++ settings.gradle | 1 + 9 files changed, 123 insertions(+) create mode 100644 database/.gitignore create mode 100644 database/build.gradle create mode 100644 database/consumer-rules.pro create mode 100644 database/proguard-rules.pro create mode 100644 database/src/androidTest/java/com/kunzisoft/keepass/database/ExampleInstrumentedTest.kt create mode 100644 database/src/main/AndroidManifest.xml create mode 100644 database/src/test/java/com/kunzisoft/keepass/database/ExampleUnitTest.kt diff --git a/app/build.gradle b/app/build.gradle index 445f5b722..40779b14f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -131,6 +131,9 @@ dependencies { implementation 'me.gosimple:nbvcxz:1.5.0' // Encrypt lib implementation project(path: ':crypto') + + implementation project(path: ':database') + // Icon pack implementation project(path: ':icon-pack-classic') implementation project(path: ':icon-pack-material') diff --git a/database/.gitignore b/database/.gitignore new file mode 100644 index 000000000..42afabfd2 --- /dev/null +++ b/database/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/database/build.gradle b/database/build.gradle new file mode 100644 index 000000000..1cc7e8948 --- /dev/null +++ b/database/build.gradle @@ -0,0 +1,54 @@ +plugins { + id 'com.android.library' + id 'org.jetbrains.kotlin.android' +} + +android { + compileSdkVersion 32 + buildToolsVersion "32.0.0" + ndkVersion "21.4.7075529" + + defaultConfig { + minSdkVersion 15 + targetSdk 32 + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + consumerProguardFiles "consumer-rules.pro" + + buildConfigField "String[]", "ICON_PACKS", "{\"classic\",\"material\"}" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = '1.8' + } +} + +dependencies { + implementation "androidx.core:core-ktx:$android_core_version" + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4' + // Color + implementation 'com.github.Kunzisoft:AndroidClearChroma:2.6' + // Time + implementation 'joda-time:joda-time:2.10.13' + // Apache Commons + implementation 'commons-io:commons-io:2.8.0' + implementation 'commons-codec:commons-codec:1.15' + // Icon pack + implementation project(path: ':icon-pack-classic') + implementation project(path: ':icon-pack-material') + + implementation project(path: ':crypto') + + testImplementation 'junit:junit:4.13.2' + androidTestImplementation 'androidx.test.ext:junit:1.1.3' +} diff --git a/database/consumer-rules.pro b/database/consumer-rules.pro new file mode 100644 index 000000000..e69de29bb diff --git a/database/proguard-rules.pro b/database/proguard-rules.pro new file mode 100644 index 000000000..481bb4348 --- /dev/null +++ b/database/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/database/src/androidTest/java/com/kunzisoft/keepass/database/ExampleInstrumentedTest.kt b/database/src/androidTest/java/com/kunzisoft/keepass/database/ExampleInstrumentedTest.kt new file mode 100644 index 000000000..d446581fe --- /dev/null +++ b/database/src/androidTest/java/com/kunzisoft/keepass/database/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.kunzisoft.keepass.database + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.kunzisoft.keepass.database.test", appContext.packageName) + } +} diff --git a/database/src/main/AndroidManifest.xml b/database/src/main/AndroidManifest.xml new file mode 100644 index 000000000..2155129cd --- /dev/null +++ b/database/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + + diff --git a/database/src/test/java/com/kunzisoft/keepass/database/ExampleUnitTest.kt b/database/src/test/java/com/kunzisoft/keepass/database/ExampleUnitTest.kt new file mode 100644 index 000000000..0aca27bf9 --- /dev/null +++ b/database/src/test/java/com/kunzisoft/keepass/database/ExampleUnitTest.kt @@ -0,0 +1,17 @@ +package com.kunzisoft.keepass.database + +import org.junit.Test + +import org.junit.Assert.* + +/** + * Example local unit test, which will execute on the development machine (host). + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +class ExampleUnitTest { + @Test + fun addition_isCorrect() { + assertEquals(4, 2 + 2) + } +} diff --git a/settings.gradle b/settings.gradle index a8916a099..bd16a5917 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1,2 @@ include ':app', ':icon-pack-classic', ':icon-pack-material', ':crypto' +include ':database' From 7d7e3f4ad689253f17de7fbfde1d200398c62a7d Mon Sep 17 00:00:00 2001 From: GianpaMX Date: Tue, 25 Oct 2022 18:00:31 +0100 Subject: [PATCH 2/9] extract database module --- app/build.gradle | 7 - .../dialogs/DatabaseChangedDialogFragment.kt | 3 +- .../dialogs/SetOTPDialogFragment.kt | 3 +- .../app/database/CipherDatabaseAction.kt | 77 ++- .../app/database/FileDatabaseHistoryAction.kt | 296 +++++------ .../keepass/autofill/KeeAutofillService.kt | 1 - .../AssignMainCredentialInDatabaseRunnable.kt | 3 +- .../database/action/DatabaseTaskProvider.kt | 45 +- .../database/action/LoadDatabaseRunnable.kt | 46 +- .../hardware/HardwareKeyResponseHelper.kt | 5 +- .../keepass/icons/IconPackChooser.kt | 43 +- .../keepass/model/SnapFileDatabaseInfo.kt | 34 +- .../AdvancedUnlockNotificationService.kt | 23 +- .../DatabaseTaskNotificationService.kt | 498 +++++++++++------- .../keepass/settings/PreferencesUtil.kt | 155 ++---- .../keepass/utils/BroadcastAction.kt | 3 +- .../keepass/utils/SingletonHolder.kt | 18 - .../keepass/viewmodels/FileDatabaseInfo.kt | 33 +- app/src/main/res/values/dimens.xml | 3 +- app/src/main/res/values/strings.xml | 62 +-- database/build.gradle | 21 +- .../1.json | 0 .../2.json | 0 .../keepass/app/database/AppDatabase.kt | 0 .../keepass/app/database/CipherDatabaseDao.kt | 0 .../app/database/CipherDatabaseEntity.kt | 0 .../app/database/FileDatabaseHistoryDao.kt | 0 .../app/database/FileDatabaseHistoryEntity.kt | 0 .../keepass/app/database/IOActionTask.kt | 0 .../database/action/MergeDatabaseRunnable.kt | 4 +- .../database/action/ReloadDatabaseRunnable.kt | 28 +- .../RemoveUnlinkedDataDatabaseRunnable.kt | 0 .../database/action/SaveDatabaseRunnable.kt | 0 ...dateCompressionBinariesDatabaseRunnable.kt | 0 .../DeleteEntryHistoryDatabaseRunnable.kt | 0 .../RestoreEntryHistoryDatabaseRunnable.kt | 0 .../action/node/ActionNodeDatabaseRunnable.kt | 0 .../database/action/node/AddEntryRunnable.kt | 0 .../database/action/node/AddGroupRunnable.kt | 0 .../action/node/AfterActionNodesFinish.kt | 0 .../database/action/node/CopyNodesRunnable.kt | 0 .../action/node/DeleteNodesRunnable.kt | 0 .../database/action/node/MoveNodesRunnable.kt | 0 .../database/action/node/NodeHandler.kt | 0 .../action/node/UpdateEntryRunnable.kt | 0 .../action/node/UpdateGroupRunnable.kt | 0 .../keepass/database/crypto/AesEngine.kt | 0 .../keepass/database/crypto/ChaCha20Engine.kt | 0 .../keepass/database/crypto/CipherEngine.kt | 0 .../keepass/database/crypto/CrsAlgorithm.kt | 0 .../database/crypto/EncryptionAlgorithm.kt | 0 .../keepass/database/crypto/HmacBlock.kt | 0 .../keepass/database/crypto/TwofishEngine.kt | 0 .../database/crypto/VariantDictionary.kt | 0 .../keepass/database/crypto/kdf/AesKdf.kt | 0 .../keepass/database/crypto/kdf/Argon2Kdf.kt | 0 .../keepass/database/crypto/kdf/KdfEngine.kt | 0 .../keepass/database/crypto/kdf/KdfFactory.kt | 0 .../database/crypto/kdf/KdfParameters.kt | 0 .../keepass/database/element/Attachment.kt | 0 .../keepass/database/element/CompositeKey.kt | 0 .../keepass/database/element/CustomData.kt | 0 .../database/element/CustomDataItem.kt | 0 .../keepass/database/element/Database.kt | 16 +- .../keepass/database/element/DateInstant.kt | 0 .../keepass/database/element/DeletedObject.kt | 0 .../keepass/database/element/Entry.kt | 0 .../keepass/database/element/Field.kt | 0 .../keepass/database/element/Group.kt | 4 +- .../database/element/MainCredential.kt | 4 +- .../keepass/database/element/SortNodeEnum.kt | 0 .../keepass/database/element/Tags.kt | 0 .../database/element/binary/AttachmentPool.kt | 0 .../database/element/binary/BinaryByte.kt | 0 .../database/element/binary/BinaryCache.kt | 0 .../database/element/binary/BinaryData.kt | 0 .../database/element/binary/BinaryFile.kt | 0 .../database/element/binary/BinaryPool.kt | 0 .../database/element/binary/CustomIconPool.kt | 0 .../database/element/binary/LoadedKey.kt | 0 .../element/database/CompressionAlgorithm.kt | 2 +- .../database/element/database/DatabaseKDB.kt | 0 .../database/element/database/DatabaseKDBX.kt | 118 +++-- .../element/database/DatabaseVersioned.kt | 0 .../database/element/entry/AutoType.kt | 0 .../database/element/entry/EntryKDB.kt | 0 .../database/element/entry/EntryKDBX.kt | 0 .../database/element/entry/EntryVersioned.kt | 0 .../element/entry/EntryVersionedInterface.kt | 0 .../element/entry/FieldReferencesEngine.kt | 0 .../database/element/group/GroupKDB.kt | 0 .../database/element/group/GroupKDBX.kt | 0 .../database/element/group/GroupVersioned.kt | 0 .../element/group/GroupVersionedInterface.kt | 0 .../database/element/icon/IconImage.kt | 0 .../database/element/icon/IconImageCustom.kt | 0 .../database/element/icon/IconImageDraw.kt | 0 .../element/icon/IconImageStandard.kt | 0 .../database/element/icon/IconsManager.kt | 0 .../keepass/database/element/node/Node.kt | 0 .../keepass/database/element/node/NodeId.kt | 0 .../database/element/node/NodeIdInt.kt | 0 .../database/element/node/NodeIdUUID.kt | 0 .../database/element/node/NodeKDBInterface.kt | 0 .../element/node/NodeKDBXInterface.kt | 0 .../element/node/NodeTimeInterface.kt | 0 .../database/element/node/NodeVersioned.kt | 0 .../element/node/NodeVersionedInterface.kt | 0 .../security/MemoryProtectionConfig.kt | 0 .../element/security/ProtectedString.kt | 0 .../database/element/template/Template.kt | 0 .../element/template/TemplateAttribute.kt | 0 .../template/TemplateAttributeAction.kt | 0 .../template/TemplateAttributeOption.kt | 0 .../element/template/TemplateAttributeType.kt | 0 .../element/template/TemplateBuilder.kt | 0 .../element/template/TemplateEngine.kt | 4 +- .../template/TemplateEngineCompatible.kt | 0 .../element/template/TemplateField.kt | 4 +- .../element/template/TemplateSection.kt | 0 .../database/exception/DatabaseException.kt | 4 +- .../keepass/database/file/DatabaseHeader.kt | 0 .../database/file/DatabaseHeaderKDB.kt | 0 .../database/file/DatabaseHeaderKDBX.kt | 0 .../keepass/database/file/DatabaseKDBXXML.kt | 0 .../keepass/database/file/DateKDBXUtil.kt | 0 .../database/file/input/DatabaseInput.kt | 2 +- .../database/file/input/DatabaseInputKDB.kt | 0 .../database/file/input/DatabaseInputKDBX.kt | 0 .../file/output/DatabaseHeaderOutputKDB.kt | 0 .../file/output/DatabaseHeaderOutputKDBX.kt | 0 .../database/file/output/DatabaseOutput.kt | 0 .../database/file/output/DatabaseOutputKDB.kt | 0 .../file/output/DatabaseOutputKDBX.kt | 0 .../database/file/output/EntryOutputKDB.kt | 0 .../database/file/output/GroupOutputKDB.kt | 0 .../database/merge/DatabaseKDBXMerger.kt | 0 .../keepass/database/search/SearchHelper.kt | 1 - .../database/search/SearchParameters.kt | 0 .../kunzisoft/keepass/hardware/HardwareKey.kt | 0 .../keepass/icons/IconDrawableFactory.kt | 94 ++-- .../com/kunzisoft/keepass/icons/IconPack.kt | 15 +- .../keepass/icons/InterfaceIconPackChooser.kt | 12 + .../keepass/model/CipherDecryptDatabase.kt | 26 +- .../keepass/model/CipherEncryptDatabase.kt | 26 +- .../keepass/model/CredentialStorage.kt | 0 .../com/kunzisoft/keepass/model/CreditCard.kt | 0 .../kunzisoft/keepass/model/DatabaseFile.kt | 0 .../keepass/model/EntryAttachmentState.kt | 0 .../com/kunzisoft/keepass/model/EntryInfo.kt | 0 .../keepass/model/FocusedEditField.kt | 0 .../com/kunzisoft/keepass/model/GroupInfo.kt | 0 .../com/kunzisoft/keepass/model/NodeInfo.kt | 0 .../com/kunzisoft/keepass/model/OtpModel.kt | 0 .../keepass/model/ProgressMessage.kt | 0 .../kunzisoft/keepass/model/RegisterInfo.kt | 0 .../com/kunzisoft/keepass/model/SearchInfo.kt | 6 +- .../keepass/model/StreamDirection.kt | 0 .../com/kunzisoft/keepass/otp/OtpElement.kt | 0 .../kunzisoft/keepass/otp/OtpEntryFields.kt | 0 .../keepass/otp/TokenCalculator.java | 0 .../settings/DatabasePreferencesUtil.kt | 67 +++ .../keepass/stream/CopyInputStream.kt | 22 +- .../keepass/stream/HashedBlockInputStream.kt | 2 - .../keepass/stream/HashedBlockOutputStream.kt | 0 .../keepass/stream/HmacBlockInputStream.kt | 0 .../keepass/stream/HmacBlockOutputStream.kt | 0 .../keepass/stream/MacOutputStream.kt | 0 .../kunzisoft/keepass/tasks/ActionRunnable.kt | 19 - .../keepass/tasks/ProgressTaskUpdater.kt | 0 .../keepass/timeout/TimeoutHelper.kt | 31 +- .../kunzisoft/keepass/utils/LOCK_ACTION.kt | 3 + .../keepass/utils/ObjectNameResource.kt | 0 .../kunzisoft/keepass/utils/ParcelableUtil.kt | 0 .../keepass/utils/SingletonHolder.kt | 38 ++ .../keepass/utils/StreamBytesUtils.kt | 44 +- .../com/kunzisoft/keepass/utils/StringUtil.kt | 0 .../kunzisoft/keepass/utils/UnsignedInt.kt | 0 .../kunzisoft/keepass/utils/UnsignedLong.kt | 0 .../keepass/utils/UriUtilDatabase.kt | 106 ++++ .../com/kunzisoft/keepass/utils/UuidUtil.java | 0 .../lib/publicsuffixlist/PublicSuffixList.kt | 0 .../publicsuffixlist/PublicSuffixListData.kt | 0 .../PublicSuffixListLoader.kt | 0 .../lib/publicsuffixlist/ext/ByteArray.kt | 0 .../src/main/res/drawable/ic_blank_32dp.png | Bin database/src/main/res/values/dimens.xml | 4 + database/src/main/res/values/strings.xml | 69 +++ 188 files changed, 1154 insertions(+), 1000 deletions(-) rename {app => database}/schemas/com.kunzisoft.keepass.app.database.AppDatabase/1.json (100%) rename {app => database}/schemas/com.kunzisoft.keepass.app.database.AppDatabase/2.json (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/app/database/AppDatabase.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/app/database/CipherDatabaseDao.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/app/database/CipherDatabaseEntity.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/app/database/FileDatabaseHistoryDao.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/app/database/FileDatabaseHistoryEntity.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/app/database/IOActionTask.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/action/MergeDatabaseRunnable.kt (95%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/action/ReloadDatabaseRunnable.kt (69%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/action/RemoveUnlinkedDataDatabaseRunnable.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/action/SaveDatabaseRunnable.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/action/UpdateCompressionBinariesDatabaseRunnable.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/action/history/DeleteEntryHistoryDatabaseRunnable.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/action/history/RestoreEntryHistoryDatabaseRunnable.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/action/node/ActionNodeDatabaseRunnable.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/action/node/AddEntryRunnable.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/action/node/AddGroupRunnable.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/action/node/AfterActionNodesFinish.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/action/node/CopyNodesRunnable.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/action/node/DeleteNodesRunnable.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/action/node/MoveNodesRunnable.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/action/node/NodeHandler.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/action/node/UpdateEntryRunnable.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/action/node/UpdateGroupRunnable.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/crypto/AesEngine.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/crypto/ChaCha20Engine.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/crypto/CipherEngine.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/crypto/CrsAlgorithm.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/crypto/EncryptionAlgorithm.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/crypto/HmacBlock.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/crypto/TwofishEngine.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/crypto/VariantDictionary.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/crypto/kdf/AesKdf.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/crypto/kdf/Argon2Kdf.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/crypto/kdf/KdfEngine.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/crypto/kdf/KdfFactory.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/crypto/kdf/KdfParameters.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/element/Attachment.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/element/CompositeKey.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/element/CustomData.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/element/CustomDataItem.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/element/Database.kt (98%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/element/DateInstant.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/element/DeletedObject.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/element/Entry.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/element/Field.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/element/Group.kt (99%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/element/MainCredential.kt (98%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/element/SortNodeEnum.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/element/Tags.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/element/binary/AttachmentPool.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/element/binary/BinaryByte.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/element/binary/BinaryCache.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/element/binary/BinaryData.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/element/binary/BinaryFile.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/element/binary/BinaryPool.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/element/binary/CustomIconPool.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/element/binary/LoadedKey.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/element/database/CompressionAlgorithm.kt (98%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/element/database/DatabaseKDB.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/element/database/DatabaseKDBX.kt (90%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/element/database/DatabaseVersioned.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/element/entry/AutoType.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/element/entry/EntryKDB.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/element/entry/EntryKDBX.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/element/entry/EntryVersioned.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/element/entry/EntryVersionedInterface.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/element/entry/FieldReferencesEngine.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/element/group/GroupKDB.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/element/group/GroupKDBX.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/element/group/GroupVersioned.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/element/group/GroupVersionedInterface.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/element/icon/IconImage.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/element/icon/IconImageCustom.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/element/icon/IconImageDraw.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/element/icon/IconImageStandard.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/element/icon/IconsManager.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/element/node/Node.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/element/node/NodeId.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/element/node/NodeIdInt.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/element/node/NodeIdUUID.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/element/node/NodeKDBInterface.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/element/node/NodeKDBXInterface.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/element/node/NodeTimeInterface.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/element/node/NodeVersioned.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/element/node/NodeVersionedInterface.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/element/security/MemoryProtectionConfig.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/element/security/ProtectedString.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/element/template/Template.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/element/template/TemplateAttribute.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/element/template/TemplateAttributeAction.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/element/template/TemplateAttributeOption.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/element/template/TemplateAttributeType.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/element/template/TemplateBuilder.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/element/template/TemplateEngine.kt (99%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/element/template/TemplateEngineCompatible.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/element/template/TemplateField.kt (99%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/element/template/TemplateSection.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/exception/DatabaseException.kt (99%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/file/DatabaseHeader.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/file/DatabaseHeaderKDB.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/file/DatabaseHeaderKDBX.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/file/DatabaseKDBXXML.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/file/DateKDBXUtil.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/file/input/DatabaseInput.kt (98%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/file/input/DatabaseInputKDB.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/file/input/DatabaseInputKDBX.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/file/output/DatabaseHeaderOutputKDB.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/file/output/DatabaseHeaderOutputKDBX.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/file/output/DatabaseOutput.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/file/output/DatabaseOutputKDB.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/file/output/DatabaseOutputKDBX.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/file/output/EntryOutputKDB.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/file/output/GroupOutputKDB.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/merge/DatabaseKDBXMerger.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/search/SearchHelper.kt (99%) rename {app => database}/src/main/java/com/kunzisoft/keepass/database/search/SearchParameters.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/hardware/HardwareKey.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/icons/IconDrawableFactory.kt (83%) rename {app => database}/src/main/java/com/kunzisoft/keepass/icons/IconPack.kt (91%) create mode 100644 database/src/main/java/com/kunzisoft/keepass/icons/InterfaceIconPackChooser.kt rename {app => database}/src/main/java/com/kunzisoft/keepass/model/CipherDecryptDatabase.kt (65%) rename {app => database}/src/main/java/com/kunzisoft/keepass/model/CipherEncryptDatabase.kt (66%) rename {app => database}/src/main/java/com/kunzisoft/keepass/model/CredentialStorage.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/model/CreditCard.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/model/DatabaseFile.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/model/EntryAttachmentState.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/model/EntryInfo.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/model/FocusedEditField.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/model/GroupInfo.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/model/NodeInfo.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/model/OtpModel.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/model/ProgressMessage.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/model/RegisterInfo.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/model/SearchInfo.kt (97%) rename {app => database}/src/main/java/com/kunzisoft/keepass/model/StreamDirection.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/otp/OtpElement.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/otp/OtpEntryFields.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/otp/TokenCalculator.java (100%) create mode 100644 database/src/main/java/com/kunzisoft/keepass/settings/DatabasePreferencesUtil.kt rename {app => database}/src/main/java/com/kunzisoft/keepass/stream/CopyInputStream.kt (66%) rename {app => database}/src/main/java/com/kunzisoft/keepass/stream/HashedBlockInputStream.kt (98%) rename {app => database}/src/main/java/com/kunzisoft/keepass/stream/HashedBlockOutputStream.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/stream/HmacBlockInputStream.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/stream/HmacBlockOutputStream.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/stream/MacOutputStream.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/tasks/ActionRunnable.kt (70%) rename {app => database}/src/main/java/com/kunzisoft/keepass/tasks/ProgressTaskUpdater.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/timeout/TimeoutHelper.kt (85%) create mode 100644 database/src/main/java/com/kunzisoft/keepass/utils/LOCK_ACTION.kt rename {app => database}/src/main/java/com/kunzisoft/keepass/utils/ObjectNameResource.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/utils/ParcelableUtil.kt (100%) create mode 100644 database/src/main/java/com/kunzisoft/keepass/utils/SingletonHolder.kt rename {app => database}/src/main/java/com/kunzisoft/keepass/utils/StreamBytesUtils.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/utils/StringUtil.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/utils/UnsignedInt.kt (100%) rename {app => database}/src/main/java/com/kunzisoft/keepass/utils/UnsignedLong.kt (100%) create mode 100644 database/src/main/java/com/kunzisoft/keepass/utils/UriUtilDatabase.kt rename {app => database}/src/main/java/com/kunzisoft/keepass/utils/UuidUtil.java (100%) rename {app => database}/src/main/java/mozilla/components/lib/publicsuffixlist/PublicSuffixList.kt (100%) rename {app => database}/src/main/java/mozilla/components/lib/publicsuffixlist/PublicSuffixListData.kt (100%) rename {app => database}/src/main/java/mozilla/components/lib/publicsuffixlist/PublicSuffixListLoader.kt (100%) rename {app => database}/src/main/java/mozilla/components/lib/publicsuffixlist/ext/ByteArray.kt (100%) rename {app => database}/src/main/res/drawable/ic_blank_32dp.png (100%) create mode 100644 database/src/main/res/values/dimens.xml create mode 100644 database/src/main/res/values/strings.xml diff --git a/app/build.gradle b/app/build.gradle index 40779b14f..a10d1eacf 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -21,13 +21,6 @@ android { buildConfigField "String[]", "ICON_PACKS", "{\"classic\",\"material\"}" manifestPlaceholders = [ googleAndroidBackupAPIKey:"unused" ] - - kapt { - arguments { - arg("room.incremental", "true") - arg("room.schemaLocation", "$projectDir/schemas".toString()) - } - } } buildTypes { diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/DatabaseChangedDialogFragment.kt b/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/DatabaseChangedDialogFragment.kt index e4bb7915c..26f24dd6f 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/DatabaseChangedDialogFragment.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/DatabaseChangedDialogFragment.kt @@ -78,7 +78,8 @@ class DatabaseChangedDialogFragment : DatabaseDialogFragment() { private const val NEW_FILE_DATABASE_INFO = "NEW_FILE_DATABASE_INFO" fun getInstance(oldSnapFileDatabaseInfo: SnapFileDatabaseInfo, - newSnapFileDatabaseInfo: SnapFileDatabaseInfo) + newSnapFileDatabaseInfo: SnapFileDatabaseInfo + ) : DatabaseChangedDialogFragment { val fragment = DatabaseChangedDialogFragment() fragment.arguments = Bundle().apply { diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/SetOTPDialogFragment.kt b/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/SetOTPDialogFragment.kt index 3986dca19..dc8ce31eb 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/SetOTPDialogFragment.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/dialogs/SetOTPDialogFragment.kt @@ -32,7 +32,6 @@ import android.view.inputmethod.EditorInfo import android.widget.* import androidx.appcompat.app.AlertDialog import com.google.android.material.textfield.TextInputLayout -import com.kunzisoft.keepass.BuildConfig import com.kunzisoft.keepass.R import com.kunzisoft.keepass.model.OtpModel import com.kunzisoft.keepass.otp.OtpElement @@ -470,4 +469,4 @@ class SetOTPDialogFragment : DatabaseDialogFragment() { } } } -} \ No newline at end of file +} 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 5ca6bac0e..f1b576f2a 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 @@ -1,51 +1,33 @@ -/* - * Copyright 2019 Jeremy Jamet / Kunzisoft. - * - * This file is part of KeePassDX. - * - * KeePassDX is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * KeePassDX is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with KeePassDX. If not, see . - * - */ package com.kunzisoft.keepass.app.database -import android.content.* +import android.content.ComponentName +import android.content.Context +import android.content.IntentFilter +import android.content.ServiceConnection import android.net.Uri import android.os.IBinder import android.util.Base64 import android.util.Log import com.kunzisoft.keepass.model.CipherEncryptDatabase -import com.kunzisoft.keepass.services.AdvancedUnlockNotificationService import com.kunzisoft.keepass.settings.PreferencesUtil import com.kunzisoft.keepass.utils.SingletonHolderParameter -import java.util.* +import java.util.LinkedList class CipherDatabaseAction(context: Context) { private val applicationContext = context.applicationContext private val cipherDatabaseDao = - AppDatabase - .getDatabase(applicationContext) + AppDatabase.getDatabase(applicationContext) .cipherDatabaseDao() // Temp DAO to easily remove content if object no longer in memory private var useTempDao = PreferencesUtil.isTempAdvancedUnlockEnable(applicationContext) - private var mBinder: AdvancedUnlockNotificationService.AdvancedUnlockBinder? = null + private var mBinder: com.kunzisoft.keepass.services.AdvancedUnlockNotificationService.AdvancedUnlockBinder? = null private var mServiceConnection: ServiceConnection? = null private var mDatabaseListeners = LinkedList() - private var mAdvancedUnlockBroadcastReceiver = AdvancedUnlockNotificationService.AdvancedUnlockReceiver { + private var mAdvancedUnlockBroadcastReceiver = com.kunzisoft.keepass.services.AdvancedUnlockNotificationService.AdvancedUnlockReceiver { deleteAll() removeAllDataAndDetach() } @@ -67,12 +49,12 @@ class CipherDatabaseAction(context: Context) { @Synchronized private fun attachService(performedAction: () -> Unit) { applicationContext.registerReceiver(mAdvancedUnlockBroadcastReceiver, IntentFilter().apply { - addAction(AdvancedUnlockNotificationService.REMOVE_ADVANCED_UNLOCK_KEY_ACTION) + addAction(com.kunzisoft.keepass.services.AdvancedUnlockNotificationService.REMOVE_ADVANCED_UNLOCK_KEY_ACTION) }) mServiceConnection = object : ServiceConnection { override fun onServiceConnected(name: ComponentName?, serviceBinder: IBinder?) { - mBinder = (serviceBinder as AdvancedUnlockNotificationService.AdvancedUnlockBinder) + mBinder = (serviceBinder as com.kunzisoft.keepass.services.AdvancedUnlockNotificationService.AdvancedUnlockBinder) performedAction.invoke() } @@ -81,9 +63,9 @@ class CipherDatabaseAction(context: Context) { } } try { - AdvancedUnlockNotificationService.bindService(applicationContext, + com.kunzisoft.keepass.services.AdvancedUnlockNotificationService.bindService(applicationContext, mServiceConnection!!, - Context.BIND_AUTO_CREATE) + Context.BIND_AUTO_CREATE) } catch (e: Exception) { Log.e(TAG, "Unable to start cipher action", e) performedAction.invoke() @@ -97,7 +79,7 @@ class CipherDatabaseAction(context: Context) { } catch (e: Exception) {} mServiceConnection?.let { - AdvancedUnlockNotificationService.unbindService(applicationContext, it) + com.kunzisoft.keepass.services.AdvancedUnlockNotificationService.unbindService(applicationContext, it) } } @@ -148,8 +130,9 @@ class CipherDatabaseAction(context: Context) { } } else { IOActionTask( - { - cipherDatabaseDao.getByDatabaseUri(databaseUri.toString())?.let { cipherDatabaseEntity -> + { + cipherDatabaseDao.getByDatabaseUri(databaseUri.toString()) + ?.let { cipherDatabaseEntity -> CipherEncryptDatabase().apply { this.databaseUri = Uri.parse(cipherDatabaseEntity.databaseUri) this.encryptedValue = Base64.decode( @@ -162,10 +145,10 @@ class CipherDatabaseAction(context: Context) { ) } } - }, - { - cipherDatabaseResultListener.invoke(it) - } + }, + { + cipherDatabaseResultListener.invoke(it) + } ).execute() } } @@ -222,12 +205,12 @@ class CipherDatabaseAction(context: Context) { } } else { IOActionTask( - { - cipherDatabaseDao.deleteByDatabaseUri(databaseUri.toString()) - }, - { - cipherDatabaseResultListener?.invoke() - } + { + cipherDatabaseDao.deleteByDatabaseUri(databaseUri.toString()) + }, + { + cipherDatabaseResultListener?.invoke() + } ).execute() } } @@ -240,9 +223,9 @@ class CipherDatabaseAction(context: Context) { } // To erase the residues IOActionTask( - { - cipherDatabaseDao.deleteAll() - } + { + cipherDatabaseDao.deleteAll() + } ).execute() // Unbind removeAllDataAndDetach() @@ -251,4 +234,4 @@ class CipherDatabaseAction(context: Context) { 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/app/database/FileDatabaseHistoryAction.kt b/app/src/main/java/com/kunzisoft/keepass/app/database/FileDatabaseHistoryAction.kt index cce17c36d..6435bc8e9 100644 --- a/app/src/main/java/com/kunzisoft/keepass/app/database/FileDatabaseHistoryAction.kt +++ b/app/src/main/java/com/kunzisoft/keepass/app/database/FileDatabaseHistoryAction.kt @@ -1,22 +1,3 @@ -/* - * Copyright 2019 Jeremy Jamet / Kunzisoft. - * - * This file is part of KeePassDX. - * - * KeePassDX is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * KeePassDX is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with KeePassDX. If not, see . - * - */ package com.kunzisoft.keepass.app.database import android.content.Context @@ -25,214 +6,225 @@ import android.util.Log import com.kunzisoft.keepass.hardware.HardwareKey import com.kunzisoft.keepass.model.DatabaseFile import com.kunzisoft.keepass.settings.PreferencesUtil -import com.kunzisoft.keepass.utils.SingletonHolderParameter -import com.kunzisoft.keepass.utils.UriUtil +import com.kunzisoft.keepass.utils.UriUtilDatabase import com.kunzisoft.keepass.viewmodels.FileDatabaseInfo class FileDatabaseHistoryAction(private val applicationContext: Context) { private val databaseFileHistoryDao = - AppDatabase - .getDatabase(applicationContext) + AppDatabase.getDatabase(applicationContext) .fileDatabaseHistoryDao() fun getDatabaseFile(databaseUri: Uri, - databaseFileResult: (DatabaseFile?) -> Unit) { + databaseFileResult: (com.kunzisoft.keepass.model.DatabaseFile?) -> Unit) { IOActionTask( - { - val fileDatabaseHistoryEntity = databaseFileHistoryDao.getByDatabaseUri(databaseUri.toString()) - val fileDatabaseInfo = FileDatabaseInfo(applicationContext, databaseUri) - DatabaseFile( - databaseUri, - UriUtil.parse(fileDatabaseHistoryEntity?.keyFileUri), - HardwareKey.getHardwareKeyFromString(fileDatabaseHistoryEntity?.hardwareKey), - UriUtil.decode(fileDatabaseHistoryEntity?.databaseUri), - fileDatabaseInfo.retrieveDatabaseAlias(fileDatabaseHistoryEntity?.databaseAlias ?: ""), - fileDatabaseInfo.exists, - fileDatabaseInfo.getLastModificationString(), - fileDatabaseInfo.getSizeString() - ) - }, - { - databaseFileResult.invoke(it) - } + { + val fileDatabaseHistoryEntity = + databaseFileHistoryDao.getByDatabaseUri(databaseUri.toString()) + val fileDatabaseInfo = FileDatabaseInfo( + applicationContext, + databaseUri) + DatabaseFile( + databaseUri, + UriUtilDatabase.parse(fileDatabaseHistoryEntity?.keyFileUri), + HardwareKey.getHardwareKeyFromString(fileDatabaseHistoryEntity?.hardwareKey), + UriUtilDatabase.decode(fileDatabaseHistoryEntity?.databaseUri), + fileDatabaseInfo.retrieveDatabaseAlias(fileDatabaseHistoryEntity?.databaseAlias + ?: ""), + fileDatabaseInfo.exists, + fileDatabaseInfo.getLastModificationString(), + fileDatabaseInfo.getSizeString() + ) + }, + { + databaseFileResult.invoke(it) + } ).execute() } fun getKeyFileUriByDatabaseUri(databaseUri: Uri, keyFileUriResultListener: (Uri?) -> Unit) { IOActionTask( - { - databaseFileHistoryDao.getByDatabaseUri(databaseUri.toString()) - }, - { - it?.let { fileHistoryEntity -> - fileHistoryEntity.keyFileUri?.let { keyFileUri -> - keyFileUriResultListener.invoke(UriUtil.parse(keyFileUri)) - } - } ?: keyFileUriResultListener.invoke(null) - } + { + databaseFileHistoryDao.getByDatabaseUri(databaseUri.toString()) + }, + { + it?.let { fileHistoryEntity -> + fileHistoryEntity.keyFileUri?.let { keyFileUri -> + keyFileUriResultListener.invoke(UriUtilDatabase.parse( + keyFileUri)) + } + } ?: keyFileUriResultListener.invoke(null) + } ).execute() } - fun getDatabaseFileList(databaseFileListResult: (List) -> Unit) { + fun getDatabaseFileList(databaseFileListResult: (List) -> Unit) { IOActionTask( - { - val hideBrokenLocations = PreferencesUtil.hideBrokenLocations(applicationContext) - // Show only uri accessible - val databaseFileListLoaded = ArrayList() - databaseFileHistoryDao.getAll().forEach { fileDatabaseHistoryEntity -> - val fileDatabaseInfo = FileDatabaseInfo(applicationContext, fileDatabaseHistoryEntity.databaseUri) - if (hideBrokenLocations && fileDatabaseInfo.exists - || !hideBrokenLocations) { - databaseFileListLoaded.add( - DatabaseFile( - UriUtil.parse(fileDatabaseHistoryEntity.databaseUri), - UriUtil.parse(fileDatabaseHistoryEntity.keyFileUri), - HardwareKey.getHardwareKeyFromString(fileDatabaseHistoryEntity.hardwareKey), - UriUtil.decode(fileDatabaseHistoryEntity.databaseUri), - fileDatabaseInfo.retrieveDatabaseAlias(fileDatabaseHistoryEntity.databaseAlias), - fileDatabaseInfo.exists, - fileDatabaseInfo.getLastModificationString(), - fileDatabaseInfo.getSizeString() - ) + { + val hideBrokenLocations = + PreferencesUtil.hideBrokenLocations( + applicationContext) + // Show only uri accessible + val databaseFileListLoaded = ArrayList() + databaseFileHistoryDao.getAll().forEach { fileDatabaseHistoryEntity -> + val fileDatabaseInfo = FileDatabaseInfo( + applicationContext, + fileDatabaseHistoryEntity.databaseUri) + if (hideBrokenLocations && fileDatabaseInfo.exists + || !hideBrokenLocations + ) { + databaseFileListLoaded.add( + DatabaseFile( + UriUtilDatabase.parse(fileDatabaseHistoryEntity.databaseUri), + UriUtilDatabase.parse(fileDatabaseHistoryEntity.keyFileUri), + HardwareKey.getHardwareKeyFromString(fileDatabaseHistoryEntity.hardwareKey), + UriUtilDatabase.decode(fileDatabaseHistoryEntity.databaseUri), + fileDatabaseInfo.retrieveDatabaseAlias(fileDatabaseHistoryEntity.databaseAlias), + fileDatabaseInfo.exists, + fileDatabaseInfo.getLastModificationString(), + fileDatabaseInfo.getSizeString() ) - } - } - databaseFileListLoaded - }, - { - databaseFileList -> - databaseFileList?.let { - databaseFileListResult.invoke(it) + ) } } + databaseFileListLoaded + }, + { databaseFileList -> + databaseFileList?.let { + databaseFileListResult.invoke(it) + } + } ).execute() } fun addOrUpdateDatabaseUri(databaseUri: Uri, keyFileUri: Uri? = null, hardwareKey: HardwareKey? = null, - databaseFileAddedOrUpdatedResult: ((DatabaseFile?) -> Unit)? = null) { - addOrUpdateDatabaseFile(DatabaseFile( + databaseFileAddedOrUpdatedResult: ((com.kunzisoft.keepass.model.DatabaseFile?) -> Unit)? = null) { + addOrUpdateDatabaseFile(com.kunzisoft.keepass.model.DatabaseFile( databaseUri, keyFileUri, hardwareKey ), databaseFileAddedOrUpdatedResult) } - fun addOrUpdateDatabaseFile(databaseFileToAddOrUpdate: DatabaseFile, - databaseFileAddedOrUpdatedResult: ((DatabaseFile?) -> Unit)? = null) { + fun addOrUpdateDatabaseFile(databaseFileToAddOrUpdate: com.kunzisoft.keepass.model.DatabaseFile, + databaseFileAddedOrUpdatedResult: ((com.kunzisoft.keepass.model.DatabaseFile?) -> Unit)? = null) { IOActionTask( - { - databaseFileToAddOrUpdate.databaseUri?.let { databaseUri -> - // Try to get info in database first - val fileDatabaseHistoryRetrieve = databaseFileHistoryDao.getByDatabaseUri(databaseUri.toString()) + { + databaseFileToAddOrUpdate.databaseUri?.let { databaseUri -> + // Try to get info in database first + val fileDatabaseHistoryRetrieve = + databaseFileHistoryDao.getByDatabaseUri(databaseUri.toString()) - // Complete alias if not exists - val fileDatabaseHistory = FileDatabaseHistoryEntity( - databaseUri.toString(), - databaseFileToAddOrUpdate.databaseAlias - ?: fileDatabaseHistoryRetrieve?.databaseAlias - ?: "", - databaseFileToAddOrUpdate.keyFileUri?.toString(), - databaseFileToAddOrUpdate.hardwareKey?.value, - System.currentTimeMillis() + // Complete alias if not exists + val fileDatabaseHistory = + FileDatabaseHistoryEntity( + databaseUri.toString(), + databaseFileToAddOrUpdate.databaseAlias + ?: fileDatabaseHistoryRetrieve?.databaseAlias + ?: "", + databaseFileToAddOrUpdate.keyFileUri?.toString(), + databaseFileToAddOrUpdate.hardwareKey?.value, + System.currentTimeMillis() ) - // Update values if history element not yet in the database - try { - if (fileDatabaseHistoryRetrieve == null) { - databaseFileHistoryDao.add(fileDatabaseHistory) - } else { - databaseFileHistoryDao.update(fileDatabaseHistory) - } - } catch (e: Exception) { - Log.e(TAG, "Unable to add or update database history", e) + // Update values if history element not yet in the database + try { + if (fileDatabaseHistoryRetrieve == null) { + databaseFileHistoryDao.add(fileDatabaseHistory) + } else { + databaseFileHistoryDao.update(fileDatabaseHistory) } - - val fileDatabaseInfo = FileDatabaseInfo(applicationContext, - fileDatabaseHistory.databaseUri) - DatabaseFile( - UriUtil.parse(fileDatabaseHistory.databaseUri), - UriUtil.parse(fileDatabaseHistory.keyFileUri), - HardwareKey.getHardwareKeyFromString(fileDatabaseHistory.hardwareKey), - UriUtil.decode(fileDatabaseHistory.databaseUri), - fileDatabaseInfo.retrieveDatabaseAlias(fileDatabaseHistory.databaseAlias), - fileDatabaseInfo.exists, - fileDatabaseInfo.getLastModificationString(), - fileDatabaseInfo.getSizeString() - ) + } catch (e: Exception) { + Log.e(TAG, "Unable to add or update database history", e) } - }, - { - databaseFileAddedOrUpdatedResult?.invoke(it) + + val fileDatabaseInfo = + FileDatabaseInfo(applicationContext, + fileDatabaseHistory.databaseUri) + DatabaseFile( + UriUtilDatabase.parse(fileDatabaseHistory.databaseUri), + UriUtilDatabase.parse(fileDatabaseHistory.keyFileUri), + HardwareKey.getHardwareKeyFromString(fileDatabaseHistory.hardwareKey), + UriUtilDatabase.decode(fileDatabaseHistory.databaseUri), + fileDatabaseInfo.retrieveDatabaseAlias(fileDatabaseHistory.databaseAlias), + fileDatabaseInfo.exists, + fileDatabaseInfo.getLastModificationString(), + fileDatabaseInfo.getSizeString() + ) } + }, + { + databaseFileAddedOrUpdatedResult?.invoke(it) + } ).execute() } - fun deleteDatabaseFile(databaseFileToDelete: DatabaseFile, - databaseFileDeletedResult: (DatabaseFile?) -> Unit) { + fun deleteDatabaseFile(databaseFileToDelete: com.kunzisoft.keepass.model.DatabaseFile, + databaseFileDeletedResult: (com.kunzisoft.keepass.model.DatabaseFile?) -> Unit) { IOActionTask( - { - databaseFileToDelete.databaseUri?.let { databaseUri -> - databaseFileHistoryDao.getByDatabaseUri(databaseUri.toString())?.let { fileDatabaseHistory -> + { + databaseFileToDelete.databaseUri?.let { databaseUri -> + databaseFileHistoryDao.getByDatabaseUri(databaseUri.toString()) + ?.let { fileDatabaseHistory -> val returnValue = databaseFileHistoryDao.delete(fileDatabaseHistory) if (returnValue > 0) { DatabaseFile( - UriUtil.parse(fileDatabaseHistory.databaseUri), - UriUtil.parse(fileDatabaseHistory.keyFileUri), + UriUtilDatabase.parse(fileDatabaseHistory.databaseUri), + UriUtilDatabase.parse(fileDatabaseHistory.keyFileUri), HardwareKey.getHardwareKeyFromString(fileDatabaseHistory.hardwareKey), - UriUtil.decode(fileDatabaseHistory.databaseUri), + UriUtilDatabase.decode(fileDatabaseHistory.databaseUri), databaseFileToDelete.databaseAlias ) } else { null } } - } - }, - { - databaseFileDeletedResult.invoke(it) } + }, + { + databaseFileDeletedResult.invoke(it) + } ).execute() } fun deleteKeyFileByDatabaseUri(databaseUri: Uri, result: (() ->Unit)? = null) { IOActionTask( - { - databaseFileHistoryDao.deleteKeyFileByDatabaseUri(databaseUri.toString()) - }, - { - result?.invoke() - } + { + databaseFileHistoryDao.deleteKeyFileByDatabaseUri(databaseUri.toString()) + }, + { + result?.invoke() + } ).execute() } fun deleteAllKeyFiles(result: (() ->Unit)? = null) { IOActionTask( - { - databaseFileHistoryDao.deleteAllKeyFiles() - }, - { - result?.invoke() - } + { + databaseFileHistoryDao.deleteAllKeyFiles() + }, + { + result?.invoke() + } ).execute() } fun deleteAll(result: (() ->Unit)? = null) { IOActionTask( - { - databaseFileHistoryDao.deleteAll() - }, - { - result?.invoke() - } + { + databaseFileHistoryDao.deleteAll() + }, + { + result?.invoke() + } ).execute() } - companion object : SingletonHolderParameter(::FileDatabaseHistoryAction) { + companion object : com.kunzisoft.keepass.utils.SingletonHolderParameter(::FileDatabaseHistoryAction) { private val TAG = FileDatabaseHistoryAction::class.java.name } } diff --git a/app/src/main/java/com/kunzisoft/keepass/autofill/KeeAutofillService.kt b/app/src/main/java/com/kunzisoft/keepass/autofill/KeeAutofillService.kt index b80cc4b44..6462833ce 100644 --- a/app/src/main/java/com/kunzisoft/keepass/autofill/KeeAutofillService.kt +++ b/app/src/main/java/com/kunzisoft/keepass/autofill/KeeAutofillService.kt @@ -29,7 +29,6 @@ import android.os.CancellationSignal import android.service.autofill.* import android.util.Log import android.view.autofill.AutofillId -import android.view.inputmethod.InlineSuggestionsRequest import android.widget.RemoteViews import androidx.annotation.RequiresApi import androidx.autofill.inline.UiVersions diff --git a/app/src/main/java/com/kunzisoft/keepass/database/action/AssignMainCredentialInDatabaseRunnable.kt b/app/src/main/java/com/kunzisoft/keepass/database/action/AssignMainCredentialInDatabaseRunnable.kt index d61d83d69..fbef9b371 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/action/AssignMainCredentialInDatabaseRunnable.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/action/AssignMainCredentialInDatabaseRunnable.kt @@ -21,7 +21,6 @@ package com.kunzisoft.keepass.database.action import android.content.Context import android.net.Uri -import com.kunzisoft.keepass.app.database.CipherDatabaseAction import com.kunzisoft.keepass.app.database.FileDatabaseHistoryAction import com.kunzisoft.keepass.database.element.Database import com.kunzisoft.keepass.hardware.HardwareKey @@ -54,7 +53,7 @@ open class AssignMainCredentialInDatabaseRunnable ( super.onFinishRun() // Erase the biometric - CipherDatabaseAction.getInstance(context) + com.kunzisoft.keepass.app.database.CipherDatabaseAction.getInstance(context) .deleteByDatabaseUri(mDatabaseUri) // Erase the register keyfile FileDatabaseHistoryAction.getInstance(context) diff --git a/app/src/main/java/com/kunzisoft/keepass/database/action/DatabaseTaskProvider.kt b/app/src/main/java/com/kunzisoft/keepass/database/action/DatabaseTaskProvider.kt index 3cf02802d..3316dea53 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/action/DatabaseTaskProvider.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/action/DatabaseTaskProvider.kt @@ -1,33 +1,18 @@ -/* - * Copyright 2019 Jeremy Jamet / Kunzisoft. - * - * This file is part of KeePassDX. - * - * KeePassDX is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * KeePassDX is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with KeePassDX. If not, see . - * - */ package com.kunzisoft.keepass.database.action +import android.app.AlertDialog import android.app.Service -import android.content.* -import android.content.Context.* +import android.content.BroadcastReceiver +import android.content.ComponentName +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.content.ServiceConnection import android.net.Uri import android.os.Bundle import android.os.IBinder import android.util.Log import android.widget.Toast -import androidx.appcompat.app.AlertDialog import androidx.fragment.app.FragmentActivity import androidx.lifecycle.lifecycleScope import com.kunzisoft.keepass.R @@ -87,8 +72,9 @@ import com.kunzisoft.keepass.tasks.ProgressTaskDialogFragment.Companion.PROGRESS import com.kunzisoft.keepass.utils.DATABASE_START_TASK_ACTION import com.kunzisoft.keepass.utils.DATABASE_STOP_TASK_ACTION import com.kunzisoft.keepass.viewmodels.ChallengeResponseViewModel +import java.util.ArrayList +import java.util.UUID import kotlinx.coroutines.launch -import java.util.* /** * Utility class to connect an activity or a service to the DatabaseTaskNotificationService, @@ -103,7 +89,8 @@ class DatabaseTaskProvider { var onActionFinish: ((database: Database, actionTask: String, - result: ActionRunnable.Result) -> Unit)? = null + result: ActionRunnable.Result + ) -> Unit)? = null private var intentDatabaseTask: Intent @@ -177,7 +164,8 @@ class DatabaseTaskProvider { private val actionTaskListener = object: DatabaseTaskNotificationService.ActionTaskListener { override fun onStartAction(database: Database, - progressMessage: ProgressMessage) { + progressMessage: ProgressMessage + ) { startDialog(progressMessage) } @@ -188,7 +176,8 @@ class DatabaseTaskProvider { override fun onStopAction(database: Database, actionTask: String, - result: ActionRunnable.Result) { + result: ActionRunnable.Result + ) { onActionFinish?.invoke(database, actionTask, result) // Remove the progress task stopDialog() @@ -310,7 +299,7 @@ class DatabaseTaskProvider { private fun bindService() { initServiceConnection() serviceConnection?.let { - context.bindService(intentDatabaseTask, it, BIND_AUTO_CREATE or BIND_IMPORTANT or BIND_ABOVE_CLIENT) + context.bindService(intentDatabaseTask, it, Context.BIND_AUTO_CREATE or Context.BIND_IMPORTANT or Context.BIND_ABOVE_CLIENT) } } @@ -763,4 +752,4 @@ class DatabaseTaskProvider { companion object { private val TAG = DatabaseTaskProvider::class.java.name } -} \ No newline at end of file +} 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 24c024721..330d80338 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 @@ -21,30 +21,29 @@ package com.kunzisoft.keepass.database.action import android.content.Context import android.net.Uri -import com.kunzisoft.keepass.app.database.CipherDatabaseAction import com.kunzisoft.keepass.app.database.FileDatabaseHistoryAction import com.kunzisoft.keepass.database.element.Database +import com.kunzisoft.keepass.database.element.MainCredential import com.kunzisoft.keepass.database.element.binary.BinaryData import com.kunzisoft.keepass.database.exception.DatabaseInputException import com.kunzisoft.keepass.hardware.HardwareKey import com.kunzisoft.keepass.model.CipherEncryptDatabase -import com.kunzisoft.keepass.database.element.MainCredential import com.kunzisoft.keepass.settings.PreferencesUtil import com.kunzisoft.keepass.tasks.ActionRunnable import com.kunzisoft.keepass.tasks.ProgressTaskUpdater -import com.kunzisoft.keepass.utils.UriUtil -class LoadDatabaseRunnable(private val context: Context, - private val mDatabase: Database, - private val mDatabaseUri: Uri, - private val mMainCredential: MainCredential, - private val mChallengeResponseRetriever: (hardwareKey: HardwareKey, seed: ByteArray?) -> ByteArray, - private val mReadonly: Boolean, - private val mCipherEncryptDatabase: CipherEncryptDatabase?, - private val mFixDuplicateUUID: Boolean, - private val progressTaskUpdater: ProgressTaskUpdater?, - private val mLoadDatabaseResult: ((Result) -> Unit)?) - : ActionRunnable() { +class LoadDatabaseRunnable( + private val context: Context, + private val mDatabase: Database, + private val mDatabaseUri: Uri, + private val mMainCredential: MainCredential, + private val mChallengeResponseRetriever: (hardwareKey: HardwareKey, seed: ByteArray?) -> ByteArray, + private val mReadonly: Boolean, + private val mCipherEncryptDatabase: CipherEncryptDatabase?, + private val mFixDuplicateUUID: Boolean, + private val progressTaskUpdater: ProgressTaskUpdater?, + private val mLoadDatabaseResult: ((Result) -> Unit)?, +) : ActionRunnable() { override fun onStartRun() { // Clear before we load @@ -59,15 +58,14 @@ class LoadDatabaseRunnable(private val context: Context, mMainCredential, mChallengeResponseRetriever, mReadonly, - UriUtil.getBinaryDir(context), + com.kunzisoft.keepass.utils.UriUtilDatabase.getBinaryDir(context), { memoryWanted -> BinaryData.canMemoryBeAllocatedInRAM(context, memoryWanted) }, mFixDuplicateUUID, progressTaskUpdater ) - } - catch (e: DatabaseInputException) { + } catch (e: DatabaseInputException) { setError(e) } @@ -75,17 +73,17 @@ class LoadDatabaseRunnable(private val context: Context, // Save keyFile in app database if (PreferencesUtil.rememberDatabaseLocations(context)) { FileDatabaseHistoryAction.getInstance(context) - .addOrUpdateDatabaseUri( - mDatabaseUri, - if (PreferencesUtil.rememberKeyFileLocations(context)) mMainCredential.keyFileUri else null, - if (PreferencesUtil.rememberHardwareKey(context)) mMainCredential.hardwareKey else null, - ) + .addOrUpdateDatabaseUri( + mDatabaseUri, + if (PreferencesUtil.rememberKeyFileLocations(context)) mMainCredential.keyFileUri else null, + if (PreferencesUtil.rememberHardwareKey(context)) mMainCredential.hardwareKey else null, + ) } // Register the biometric mCipherEncryptDatabase?.let { cipherDatabase -> - CipherDatabaseAction.getInstance(context) - .addOrUpdateCipherDatabase(cipherDatabase) // return value not called + com.kunzisoft.keepass.app.database.CipherDatabaseAction.getInstance(context) + .addOrUpdateCipherDatabase(cipherDatabase) // return value not called } // Register the current time to init the lock timer diff --git a/app/src/main/java/com/kunzisoft/keepass/hardware/HardwareKeyResponseHelper.kt b/app/src/main/java/com/kunzisoft/keepass/hardware/HardwareKeyResponseHelper.kt index 256cce671..1c80b41d7 100644 --- a/app/src/main/java/com/kunzisoft/keepass/hardware/HardwareKeyResponseHelper.kt +++ b/app/src/main/java/com/kunzisoft/keepass/hardware/HardwareKeyResponseHelper.kt @@ -13,7 +13,6 @@ import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentActivity import androidx.lifecycle.lifecycleScope import com.kunzisoft.keepass.R -import com.kunzisoft.keepass.utils.UriUtil import kotlinx.coroutines.launch class HardwareKeyResponseHelper { @@ -134,11 +133,11 @@ class HardwareKeyResponseHelper { activity.getString(R.string.error_driver_required, hardwareKey.toString()) ) .setPositiveButton(R.string.download) { _, _ -> - UriUtil.openExternalApp(activity, activity.getString(R.string.key_driver_app_id)) + com.kunzisoft.keepass.utils.UriUtil.openExternalApp(activity, activity.getString(R.string.key_driver_app_id)) } .setNegativeButton(android.R.string.cancel) { _, _ -> } builder.create().show() } } } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/kunzisoft/keepass/icons/IconPackChooser.kt b/app/src/main/java/com/kunzisoft/keepass/icons/IconPackChooser.kt index bc33bc61c..69a8f14a0 100644 --- a/app/src/main/java/com/kunzisoft/keepass/icons/IconPackChooser.kt +++ b/app/src/main/java/com/kunzisoft/keepass/icons/IconPackChooser.kt @@ -1,36 +1,17 @@ -/* - * Copyright 2018 Jeremy Jamet / Kunzisoft. - * - * This file is part of KeePassDX. - * - * KeePassDX is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * KeePassDX is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with KeePassDX. If not, see . - * - */ package com.kunzisoft.keepass.icons import android.content.Context import android.util.Log import com.kunzisoft.keepass.BuildConfig -import com.kunzisoft.keepass.settings.PreferencesUtil -import java.util.* +import com.kunzisoft.keepass.settings.DatabasePreferencesUtil +import java.util.ArrayList /** * Utility class to built and select an IconPack dynamically by libraries importation * * @author J-Jamet */ -object IconPackChooser { +object IconPackChooser : InterfaceIconPackChooser { private val TAG = IconPackChooser::class.java.name @@ -50,7 +31,7 @@ object IconPackChooser { * @param context Context to construct each pack with the resources * @return An unique instance of [IconPackChooser], recall [.build] provide the same instance */ - fun build(context: Context) { + override fun build(context: Context) { synchronized(IconPackChooser::class.java) { if (!isIconPackChooserBuilt) { isIconPackChooserBuilt = true @@ -69,7 +50,7 @@ object IconPackChooser { /** * Construct dynamically the icon pack provide by the default string resource "resource_id" */ - private fun addDefaultIconPack(context: Context) { + override fun addDefaultIconPack(context: Context) { val resourceId = context.resources.getIdentifier("resource_id", "string", context.packageName) iconPackList.add(IconPack(context.packageName, context.resources, resourceId)) } @@ -77,9 +58,11 @@ object IconPackChooser { /** * Utility method to add new icon pack or catch exception if not retrieve */ - private fun addOrCatchNewIconPack(context: Context, iconPackString: String) { + override fun addOrCatchNewIconPack(context: Context, iconPackString: String) { try { - iconPackList.add(IconPack(context.packageName, context.resources, context.resources.getIdentifier( + iconPackList.add(IconPack(context.packageName, + context.resources, + context.resources.getIdentifier( iconPackString + "_resource_id", "string", context.packageName))) @@ -89,7 +72,7 @@ object IconPackChooser { } - fun setSelectedIconPack(iconPackIdString: String?) { + override fun setSelectedIconPack(iconPackIdString: String?) { for (iconPack in iconPackList) { if (iconPack.id == iconPackIdString) { iconPackSelected = iconPack @@ -104,10 +87,10 @@ object IconPackChooser { * @param context Context to build the icon pack if not already build * @return IconPack currently in usage */ - fun getSelectedIconPack(context: Context): IconPack? { + override fun getSelectedIconPack(context: Context): IconPack? { build(context) if (iconPackSelected == null) { - setSelectedIconPack(PreferencesUtil.getIconPackSelectedId(context)) + setSelectedIconPack(DatabasePreferencesUtil.getIconPackSelectedId(context)) } return iconPackSelected } @@ -118,7 +101,7 @@ object IconPackChooser { * @param context Context to build the icon pack if not already build * @return IconPack available */ - fun getIconPackList(context: Context): List { + override fun getIconPackList(context: Context): List { build(context) return iconPackList } diff --git a/app/src/main/java/com/kunzisoft/keepass/model/SnapFileDatabaseInfo.kt b/app/src/main/java/com/kunzisoft/keepass/model/SnapFileDatabaseInfo.kt index fa6650ff8..2c9c335f5 100644 --- a/app/src/main/java/com/kunzisoft/keepass/model/SnapFileDatabaseInfo.kt +++ b/app/src/main/java/com/kunzisoft/keepass/model/SnapFileDatabaseInfo.kt @@ -1,22 +1,3 @@ -/* - * Copyright 2021 Jeremy Jamet / Kunzisoft. - * - * This file is part of KeePassDX. - * - * KeePassDX is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * KeePassDX is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with KeePassDX. If not, see . - * - */ package com.kunzisoft.keepass.model import android.content.Context @@ -24,9 +5,8 @@ import android.net.Uri import android.os.Parcel import android.os.Parcelable import android.text.format.Formatter -import com.kunzisoft.keepass.viewmodels.FileDatabaseInfo import java.text.DateFormat -import java.util.* +import java.util.Date /** * Utility data class to get FileDatabaseInfo at a `t` time @@ -90,12 +70,12 @@ data class SnapFileDatabaseInfo(var fileUri: Uri?, return arrayOfNulls(size) } - fun fromFileDatabaseInfo(fileDatabaseInfo: FileDatabaseInfo): SnapFileDatabaseInfo { + fun fromFileDatabaseInfo(fileDatabaseInfo: com.kunzisoft.keepass.viewmodels.FileDatabaseInfo): SnapFileDatabaseInfo { return SnapFileDatabaseInfo( - fileDatabaseInfo.fileUri, - fileDatabaseInfo.exists, - fileDatabaseInfo.getLastModification(), - fileDatabaseInfo.getSize()) + fileDatabaseInfo.fileUri, + fileDatabaseInfo.exists, + fileDatabaseInfo.getLastModification(), + fileDatabaseInfo.getSize()) } } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/kunzisoft/keepass/services/AdvancedUnlockNotificationService.kt b/app/src/main/java/com/kunzisoft/keepass/services/AdvancedUnlockNotificationService.kt index bf6ac0f0f..b08518298 100644 --- a/app/src/main/java/com/kunzisoft/keepass/services/AdvancedUnlockNotificationService.kt +++ b/app/src/main/java/com/kunzisoft/keepass/services/AdvancedUnlockNotificationService.kt @@ -2,15 +2,16 @@ package com.kunzisoft.keepass.services import android.annotation.SuppressLint import android.app.PendingIntent -import android.content.* +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.ServiceConnection import android.net.Uri import android.os.Binder import android.os.Build import android.os.IBinder -import com.kunzisoft.keepass.R import com.kunzisoft.keepass.app.database.CipherDatabaseEntity import com.kunzisoft.keepass.settings.PreferencesUtil -import com.kunzisoft.keepass.timeout.TimeoutHelper class AdvancedUnlockNotificationService : NotificationService() { @@ -44,7 +45,7 @@ class AdvancedUnlockNotificationService : NotificationService() { } override fun retrieveChannelName(): String { - return getString(R.string.advanced_unlock) + return getString(com.kunzisoft.keepass.R.string.advanced_unlock) } override fun onCreate() { @@ -69,12 +70,12 @@ class AdvancedUnlockNotificationService : NotificationService() { val biometricUnlockEnabled = PreferencesUtil.isBiometricUnlockEnable(this) val notificationBuilder = buildNewNotification().apply { setSmallIcon(if (biometricUnlockEnabled) { - R.drawable.notification_ic_fingerprint_unlock_24dp + com.kunzisoft.keepass.R.drawable.notification_ic_fingerprint_unlock_24dp } else { - R.drawable.notification_ic_device_unlock_24dp + com.kunzisoft.keepass.R.drawable.notification_ic_device_unlock_24dp }) - setContentTitle(getString(R.string.advanced_unlock)) - setContentText(getString(R.string.advanced_unlock_tap_delete)) + setContentTitle(getString(com.kunzisoft.keepass.R.string.advanced_unlock)) + setContentText(getString(com.kunzisoft.keepass.R.string.advanced_unlock_tap_delete)) setContentIntent(pendingDeleteIntent) // Unfortunately swipe is disabled in lollipop+ setDeleteIntent(pendingDeleteIntent) @@ -82,7 +83,7 @@ class AdvancedUnlockNotificationService : NotificationService() { val notificationTimeoutMilliSecs = PreferencesUtil.getAdvancedUnlockTimeout(this) // Not necessarily a foreground service - if (mTimerJob == null && notificationTimeoutMilliSecs != TimeoutHelper.NEVER) { + if (mTimerJob == null && notificationTimeoutMilliSecs != com.kunzisoft.keepass.timeout.TimeoutHelper.NEVER) { defineTimerJob(notificationBuilder, notificationTimeoutMilliSecs) { sendBroadcast(Intent(REMOVE_ADVANCED_UNLOCK_KEY_ACTION)) } @@ -122,7 +123,7 @@ class AdvancedUnlockNotificationService : NotificationService() { // Only one service connection fun bindService(context: Context, serviceConnection: ServiceConnection, flags: Int) { context.bindService(Intent(context, - AdvancedUnlockNotificationService::class.java), + AdvancedUnlockNotificationService::class.java), serviceConnection, flags) } @@ -131,4 +132,4 @@ class AdvancedUnlockNotificationService : NotificationService() { context.unbindService(serviceConnection) } } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/kunzisoft/keepass/services/DatabaseTaskNotificationService.kt b/app/src/main/java/com/kunzisoft/keepass/services/DatabaseTaskNotificationService.kt index 2b6686f8a..e5e876b3b 100644 --- a/app/src/main/java/com/kunzisoft/keepass/services/DatabaseTaskNotificationService.kt +++ b/app/src/main/java/com/kunzisoft/keepass/services/DatabaseTaskNotificationService.kt @@ -44,6 +44,7 @@ import com.kunzisoft.keepass.database.element.node.Node import com.kunzisoft.keepass.database.element.node.NodeId import com.kunzisoft.keepass.database.element.node.Type import com.kunzisoft.keepass.hardware.HardwareKey +import com.kunzisoft.keepass.icons.IconPackChooser import com.kunzisoft.keepass.model.CipherEncryptDatabase import com.kunzisoft.keepass.model.ProgressMessage import com.kunzisoft.keepass.model.SnapFileDatabaseInfo @@ -55,9 +56,9 @@ import com.kunzisoft.keepass.utils.DATABASE_STOP_TASK_ACTION import com.kunzisoft.keepass.utils.LOCK_ACTION import com.kunzisoft.keepass.utils.closeDatabase import com.kunzisoft.keepass.viewmodels.FileDatabaseInfo +import java.util.UUID import kotlinx.coroutines.* import kotlinx.coroutines.channels.Channel -import java.util.* open class DatabaseTaskNotificationService : LockNotificationService(), ProgressTaskUpdater { @@ -75,6 +76,7 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress private var mDatabaseInfoListeners = mutableListOf() private var mActionTaskBinder = ActionTaskBinder() private var mActionTaskListeners = mutableListOf() + // Channel to connect asynchronously a listener or a response private var mRequestChallengeListenerChannel: Channel? = null private var mResponseChallengeChannel: Channel? = null @@ -93,7 +95,7 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress return getString(R.string.database) } - inner class ActionTaskBinder: Binder() { + inner class ActionTaskBinder : Binder() { fun getService(): DatabaseTaskNotificationService = this@DatabaseTaskNotificationService @@ -154,18 +156,28 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress } interface DatabaseInfoListener { - fun onDatabaseInfoChanged(previousDatabaseInfo: SnapFileDatabaseInfo, - newDatabaseInfo: SnapFileDatabaseInfo) + fun onDatabaseInfoChanged( + previousDatabaseInfo: SnapFileDatabaseInfo, + newDatabaseInfo: SnapFileDatabaseInfo, + ) } interface ActionTaskListener { - fun onStartAction(database: Database, - progressMessage: ProgressMessage) - fun onUpdateAction(database: Database, - progressMessage: ProgressMessage) - fun onStopAction(database: Database, - actionTask: String, - result: ActionRunnable.Result) + fun onStartAction( + database: Database, + progressMessage: ProgressMessage, + ) + + fun onUpdateAction( + database: Database, + progressMessage: ProgressMessage, + ) + + fun onStopAction( + database: Database, + actionTask: String, + result: ActionRunnable.Result, + ) } interface RequestChallengeListener { @@ -183,7 +195,7 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress mDatabase?.fileUri?.let { val previousDatabaseInfo = mSnapFileDatabaseInfo val lastFileDatabaseInfo = SnapFileDatabaseInfo.fromFileDatabaseInfo( - FileDatabaseInfo(applicationContext, it)) + FileDatabaseInfo(applicationContext, it)) val oldDatabaseModification = previousDatabaseInfo?.lastModification val newDatabaseModification = lastFileDatabaseInfo.lastModification @@ -194,12 +206,12 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress // To prevent dialog opening too often // Add 10 seconds delta time to prevent spamming val conditionLastModification = - (oldDatabaseModification != null && newDatabaseModification != null - && oldDatabaseSize != null - && oldDatabaseModification > 0 && newDatabaseModification > 0 - && oldDatabaseSize > 0 - && oldDatabaseModification < newDatabaseModification - && mLastLocalSaveTime + 10000 < newDatabaseModification) + (oldDatabaseModification != null && newDatabaseModification != null + && oldDatabaseSize != null + && oldDatabaseModification > 0 && newDatabaseModification > 0 + && oldDatabaseSize > 0 + && oldDatabaseModification < newDatabaseModification + && mLastLocalSaveTime + 10000 < newDatabaseModification) if (conditionExists || conditionLastModification) { // Show the dialog only if it's real new info and not a delay after a save @@ -208,7 +220,8 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress // Call listener to indicate a change in database info if (!mSaveState && previousDatabaseInfo != null) { mDatabaseInfoListeners.forEach { listener -> - listener.onDatabaseInfoChanged(previousDatabaseInfo, lastFileDatabaseInfo) + listener.onDatabaseInfoChanged(previousDatabaseInfo, + lastFileDatabaseInfo) } } mSnapFileDatabaseInfo = lastFileDatabaseInfo @@ -223,7 +236,7 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress try { mDatabase?.fileUri?.let { mSnapFileDatabaseInfo = SnapFileDatabaseInfo.fromFileDatabaseInfo( - FileDatabaseInfo(applicationContext, it)) + FileDatabaseInfo(applicationContext, it)) Log.i(TAG, "Database file saved $mSnapFileDatabaseInfo") } } catch (e: Exception) { @@ -294,7 +307,7 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { super.onStartCommand(intent, flags, startId) - val database = Database.getInstance() + val database = Database.getInstance(IconPackChooser) if (mDatabase != database) { mDatabase = database mDatabaseListeners.forEach { listener -> @@ -323,23 +336,36 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress stopSelf() } - val actionRunnable: ActionRunnable? = when (intentAction) { + val actionRunnable: ActionRunnable? = when (intentAction) { ACTION_DATABASE_CREATE_TASK -> buildDatabaseCreateActionTask(intent, database) ACTION_DATABASE_LOAD_TASK -> buildDatabaseLoadActionTask(intent, database) ACTION_DATABASE_MERGE_TASK -> buildDatabaseMergeActionTask(intent, database) ACTION_DATABASE_RELOAD_TASK -> buildDatabaseReloadActionTask(database) - ACTION_DATABASE_ASSIGN_PASSWORD_TASK -> buildDatabaseAssignPasswordActionTask(intent, database) - ACTION_DATABASE_CREATE_GROUP_TASK -> buildDatabaseCreateGroupActionTask(intent, database) - ACTION_DATABASE_UPDATE_GROUP_TASK -> buildDatabaseUpdateGroupActionTask(intent, database) - ACTION_DATABASE_CREATE_ENTRY_TASK -> buildDatabaseCreateEntryActionTask(intent, database) - ACTION_DATABASE_UPDATE_ENTRY_TASK -> buildDatabaseUpdateEntryActionTask(intent, database) + ACTION_DATABASE_ASSIGN_PASSWORD_TASK -> buildDatabaseAssignPasswordActionTask(intent, + database) + ACTION_DATABASE_CREATE_GROUP_TASK -> buildDatabaseCreateGroupActionTask(intent, + database) + ACTION_DATABASE_UPDATE_GROUP_TASK -> buildDatabaseUpdateGroupActionTask(intent, + database) + ACTION_DATABASE_CREATE_ENTRY_TASK -> buildDatabaseCreateEntryActionTask(intent, + database) + ACTION_DATABASE_UPDATE_ENTRY_TASK -> buildDatabaseUpdateEntryActionTask(intent, + database) ACTION_DATABASE_COPY_NODES_TASK -> buildDatabaseCopyNodesActionTask(intent, database) ACTION_DATABASE_MOVE_NODES_TASK -> buildDatabaseMoveNodesActionTask(intent, database) - ACTION_DATABASE_DELETE_NODES_TASK -> buildDatabaseDeleteNodesActionTask(intent, database) - ACTION_DATABASE_RESTORE_ENTRY_HISTORY -> buildDatabaseRestoreEntryHistoryActionTask(intent, database) - ACTION_DATABASE_DELETE_ENTRY_HISTORY -> buildDatabaseDeleteEntryHistoryActionTask(intent, database) - ACTION_DATABASE_UPDATE_COMPRESSION_TASK -> buildDatabaseUpdateCompressionActionTask(intent, database) - ACTION_DATABASE_REMOVE_UNLINKED_DATA_TASK -> buildDatabaseRemoveUnlinkedDataActionTask(intent, database) + ACTION_DATABASE_DELETE_NODES_TASK -> buildDatabaseDeleteNodesActionTask(intent, + database) + ACTION_DATABASE_RESTORE_ENTRY_HISTORY -> buildDatabaseRestoreEntryHistoryActionTask( + intent, + database) + ACTION_DATABASE_DELETE_ENTRY_HISTORY -> buildDatabaseDeleteEntryHistoryActionTask(intent, + database) + ACTION_DATABASE_UPDATE_COMPRESSION_TASK -> buildDatabaseUpdateCompressionActionTask( + intent, + database) + ACTION_DATABASE_REMOVE_UNLINKED_DATA_TASK -> buildDatabaseRemoveUnlinkedDataActionTask( + intent, + database) ACTION_DATABASE_UPDATE_NAME_TASK, ACTION_DATABASE_UPDATE_DESCRIPTION_TASK, ACTION_DATABASE_UPDATE_DEFAULT_USERNAME_TASK, @@ -352,7 +378,8 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress ACTION_DATABASE_UPDATE_KEY_DERIVATION_TASK, ACTION_DATABASE_UPDATE_MEMORY_USAGE_TASK, ACTION_DATABASE_UPDATE_PARALLELISM_TASK, - ACTION_DATABASE_UPDATE_ITERATIONS_TASK -> buildDatabaseUpdateElementActionTask(intent, database) + ACTION_DATABASE_UPDATE_ITERATIONS_TASK, + -> buildDatabaseUpdateElementActionTask(intent, database) ACTION_DATABASE_SAVE -> buildDatabaseSave(intent, database) else -> null } @@ -361,79 +388,81 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress if (actionRunnable != null) { mainScope.launch { executeAction(this@DatabaseTaskNotificationService, - { - TimeoutHelper.temporarilyDisableTimeout() + { + TimeoutHelper.temporarilyDisableTimeout() - mActionRunning = true + mActionRunning = true - sendBroadcast(Intent(DATABASE_START_TASK_ACTION).apply { - putExtra(DATABASE_TASK_TITLE_KEY, mProgressMessage.titleId) - putExtra(DATABASE_TASK_MESSAGE_KEY, mProgressMessage.messageId) - putExtra(DATABASE_TASK_WARNING_KEY, mProgressMessage.warningId) - }) + sendBroadcast(Intent(DATABASE_START_TASK_ACTION).apply { + putExtra(DATABASE_TASK_TITLE_KEY, mProgressMessage.titleId) + putExtra(DATABASE_TASK_MESSAGE_KEY, mProgressMessage.messageId) + putExtra(DATABASE_TASK_WARNING_KEY, mProgressMessage.warningId) + }) - mActionTaskListeners.forEach { actionTaskListener -> - actionTaskListener.onStartAction( - database, mProgressMessage - ) - } - - }, - { - actionRunnable - }, - { result -> - try { - mActionTaskListeners.forEach { actionTaskListener -> - mTaskRemovedRequested = false - actionTaskListener.onStopAction(database, intentAction!!, result) - } - } finally { - // Save the database info before performing action - when (intentAction) { - ACTION_DATABASE_LOAD_TASK, - ACTION_DATABASE_MERGE_TASK, - ACTION_DATABASE_RELOAD_TASK -> { - saveDatabaseInfo() - } - } - val save = !database.isReadOnly - && (intentAction == ACTION_DATABASE_SAVE - || intent?.getBooleanExtra(SAVE_DATABASE_KEY, false) == true) - // Save the database info after performing save action - if (save) { - database.fileUri?.let { - val newSnapFileDatabaseInfo = SnapFileDatabaseInfo.fromFileDatabaseInfo( - FileDatabaseInfo(applicationContext, it)) - mLastLocalSaveTime = System.currentTimeMillis() - mSnapFileDatabaseInfo = newSnapFileDatabaseInfo - } - } - removeIntentData(intent) - TimeoutHelper.releaseTemporarilyDisableTimeout() - // Stop service after save if user remove task - if (save && mTaskRemovedRequested) { - actionOnLock() - } else if (TimeoutHelper.checkTimeAndLockIfTimeout(this@DatabaseTaskNotificationService)) { - if (!database.loaded) { - stopSelf() - } else { - // Restart the service to open lock notification - try { - startService(Intent(applicationContext, - DatabaseTaskNotificationService::class.java)) - } catch (e: IllegalStateException) { - Log.w(TAG, "Cannot restart the database task service", e) - } - } - } - mTaskRemovedRequested = false - } - - sendBroadcast(Intent(DATABASE_STOP_TASK_ACTION)) - - mActionRunning = false + mActionTaskListeners.forEach { actionTaskListener -> + actionTaskListener.onStartAction( + database, mProgressMessage + ) } + + }, + { + actionRunnable + }, + { result -> + try { + mActionTaskListeners.forEach { actionTaskListener -> + mTaskRemovedRequested = false + actionTaskListener.onStopAction(database, intentAction!!, result) + } + } finally { + // Save the database info before performing action + when (intentAction) { + ACTION_DATABASE_LOAD_TASK, + ACTION_DATABASE_MERGE_TASK, + ACTION_DATABASE_RELOAD_TASK, + -> { + saveDatabaseInfo() + } + } + val save = !database.isReadOnly + && (intentAction == ACTION_DATABASE_SAVE + || intent?.getBooleanExtra(SAVE_DATABASE_KEY, false) == true) + // Save the database info after performing save action + if (save) { + database.fileUri?.let { + val newSnapFileDatabaseInfo = + SnapFileDatabaseInfo.fromFileDatabaseInfo( + FileDatabaseInfo(applicationContext, it)) + mLastLocalSaveTime = System.currentTimeMillis() + mSnapFileDatabaseInfo = newSnapFileDatabaseInfo + } + } + removeIntentData(intent) + TimeoutHelper.releaseTemporarilyDisableTimeout() + // Stop service after save if user remove task + if (save && mTaskRemovedRequested) { + actionOnLock() + } else if (TimeoutHelper.checkTimeAndLockIfTimeout(this@DatabaseTaskNotificationService)) { + if (!database.loaded) { + stopSelf() + } else { + // Restart the service to open lock notification + try { + startService(Intent(applicationContext, + DatabaseTaskNotificationService::class.java)) + } catch (e: IllegalStateException) { + Log.w(TAG, "Cannot restart the database task service", e) + } + } + } + mTaskRemovedRequested = false + } + + sendBroadcast(Intent(DATABASE_STOP_TASK_ACTION)) + + mActionRunning = false + } ) } } @@ -442,7 +471,8 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress ACTION_DATABASE_LOAD_TASK, ACTION_DATABASE_MERGE_TASK, ACTION_DATABASE_RELOAD_TASK, - null -> { + null, + -> { START_STICKY } else -> { @@ -470,9 +500,11 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress ACTION_DATABASE_CREATE_TASK -> R.string.creating_database ACTION_DATABASE_LOAD_TASK, ACTION_DATABASE_MERGE_TASK, - ACTION_DATABASE_RELOAD_TASK -> R.string.loading_database + ACTION_DATABASE_RELOAD_TASK, + -> R.string.loading_database ACTION_DATABASE_ASSIGN_PASSWORD_TASK, - ACTION_DATABASE_SAVE -> R.string.saving_database + ACTION_DATABASE_SAVE, + -> R.string.saving_database else -> { if (mSaveState) R.string.saving_database @@ -486,12 +518,12 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress // Warning if data is saved mProgressMessage.warningId = - if (mSaveState) - R.string.do_not_kill_app - else - null + if (mSaveState) + R.string.do_not_kill_app + else + null - val notificationBuilder = buildNewNotification().apply { + val notificationBuilder = buildNewNotification().apply { setSmallIcon(iconId) intent?.let { setContentTitle(getString( @@ -582,11 +614,13 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress /** * Execute action with a coroutine - */ - private suspend fun executeAction(progressTaskUpdater: ProgressTaskUpdater, - onPreExecute: () -> Unit, - onExecute: (ProgressTaskUpdater?) -> ActionRunnable?, - onPostExecute: (result: ActionRunnable.Result) -> Unit) { + */ + private suspend fun executeAction( + progressTaskUpdater: ProgressTaskUpdater, + onPreExecute: () -> Unit, + onExecute: (ProgressTaskUpdater?) -> ActionRunnable?, + onPostExecute: (result: ActionRunnable.Result) -> Unit, + ) { onPreExecute.invoke() withContext(Dispatchers.IO) { onExecute.invoke(progressTaskUpdater)?.apply { @@ -634,8 +668,10 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress super.onTaskRemoved(rootIntent) } - private fun retrieveResponseFromChallenge(hardwareKey: HardwareKey, - seed: ByteArray?): ByteArray { + private fun retrieveResponseFromChallenge( + hardwareKey: HardwareKey, + seed: ByteArray?, + ): ByteArray { // Request a challenge - response var response: ByteArray runBlocking { @@ -670,10 +706,11 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress private fun buildDatabaseCreateActionTask(intent: Intent, database: Database): ActionRunnable? { if (intent.hasExtra(DATABASE_URI_KEY) - && intent.hasExtra(MAIN_CREDENTIAL_KEY) + && intent.hasExtra(MAIN_CREDENTIAL_KEY) ) { val databaseUri: Uri? = intent.getParcelableExtra(DATABASE_URI_KEY) - val mainCredential: MainCredential = intent.getParcelableExtra(MAIN_CREDENTIAL_KEY) ?: MainCredential() + val mainCredential: MainCredential = + intent.getParcelableExtra(MAIN_CREDENTIAL_KEY) ?: MainCredential() if (databaseUri == null) return null @@ -702,18 +739,20 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress private fun buildDatabaseLoadActionTask(intent: Intent, database: Database): ActionRunnable? { if (intent.hasExtra(DATABASE_URI_KEY) - && intent.hasExtra(MAIN_CREDENTIAL_KEY) - && intent.hasExtra(READ_ONLY_KEY) - && intent.hasExtra(CIPHER_DATABASE_KEY) - && intent.hasExtra(FIX_DUPLICATE_UUID_KEY) + && intent.hasExtra(MAIN_CREDENTIAL_KEY) + && intent.hasExtra(READ_ONLY_KEY) + && intent.hasExtra(CIPHER_DATABASE_KEY) + && intent.hasExtra(FIX_DUPLICATE_UUID_KEY) ) { val databaseUri: Uri? = intent.getParcelableExtra(DATABASE_URI_KEY) - val mainCredential: MainCredential = intent.getParcelableExtra(MAIN_CREDENTIAL_KEY) ?: MainCredential() + val mainCredential: MainCredential = + intent.getParcelableExtra(MAIN_CREDENTIAL_KEY) ?: MainCredential() val readOnly: Boolean = intent.getBooleanExtra(READ_ONLY_KEY, true) - val cipherEncryptDatabase: CipherEncryptDatabase? = intent.getParcelableExtra(CIPHER_DATABASE_KEY) + val cipherEncryptDatabase: CipherEncryptDatabase? = + intent.getParcelableExtra(CIPHER_DATABASE_KEY) if (databaseUri == null) - return null + return null return LoadDatabaseRunnable( this, @@ -768,18 +807,21 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress private fun buildDatabaseReloadActionTask(database: Database): ActionRunnable { return ReloadDatabaseRunnable( - this, - database, - this - ) { result -> - // No need to add each info to reload database - result.data = Bundle() - } + this, + database, + this + ) { result -> + // No need to add each info to reload database + result.data = Bundle() + } } - private fun buildDatabaseAssignPasswordActionTask(intent: Intent, database: Database): ActionRunnable? { + private fun buildDatabaseAssignPasswordActionTask( + intent: Intent, + database: Database, + ): ActionRunnable? { return if (intent.hasExtra(DATABASE_URI_KEY) - && intent.hasExtra(MAIN_CREDENTIAL_KEY) + && intent.hasExtra(MAIN_CREDENTIAL_KEY) ) { val databaseUri: Uri = intent.getParcelableExtra(DATABASE_URI_KEY) ?: return null AssignMainCredentialInDatabaseRunnable(this, @@ -795,8 +837,10 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress } private inner class AfterActionNodesRunnable : AfterActionNodesFinish() { - override fun onActionNodesFinish(result: ActionRunnable.Result, - actionNodesValues: ActionNodesValues) { + override fun onActionNodesFinish( + result: ActionRunnable.Result, + actionNodesValues: ActionNodesValues, + ) { val bundle = result.data ?: Bundle() bundle.putBundle(OLD_NODES_KEY, getBundleFromListNodes(actionNodesValues.oldNodes)) bundle.putBundle(NEW_NODES_KEY, getBundleFromListNodes(actionNodesValues.newNodes)) @@ -804,16 +848,20 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress } } - private fun buildDatabaseCreateGroupActionTask(intent: Intent, database: Database): ActionRunnable? { + private fun buildDatabaseCreateGroupActionTask( + intent: Intent, + database: Database, + ): ActionRunnable? { return if (intent.hasExtra(GROUP_KEY) - && intent.hasExtra(PARENT_ID_KEY) - && intent.hasExtra(SAVE_DATABASE_KEY) + && intent.hasExtra(PARENT_ID_KEY) + && intent.hasExtra(SAVE_DATABASE_KEY) ) { val parentId: NodeId<*>? = intent.getParcelableExtra(PARENT_ID_KEY) val newGroup: Group? = intent.getParcelableExtra(GROUP_KEY) if (parentId == null - || newGroup == null) + || newGroup == null + ) return null database.getGroupById(parentId)?.let { parent -> @@ -832,16 +880,20 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress } } - private fun buildDatabaseUpdateGroupActionTask(intent: Intent, database: Database): ActionRunnable? { + private fun buildDatabaseUpdateGroupActionTask( + intent: Intent, + database: Database, + ): ActionRunnable? { return if (intent.hasExtra(GROUP_ID_KEY) - && intent.hasExtra(GROUP_KEY) - && intent.hasExtra(SAVE_DATABASE_KEY) + && intent.hasExtra(GROUP_KEY) + && intent.hasExtra(SAVE_DATABASE_KEY) ) { val groupId: NodeId<*>? = intent.getParcelableExtra(GROUP_ID_KEY) val newGroup: Group? = intent.getParcelableExtra(GROUP_KEY) if (groupId == null - || newGroup == null) + || newGroup == null + ) return null database.getGroupById(groupId)?.let { oldGroup -> @@ -860,16 +912,20 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress } } - private fun buildDatabaseCreateEntryActionTask(intent: Intent, database: Database): ActionRunnable? { + private fun buildDatabaseCreateEntryActionTask( + intent: Intent, + database: Database, + ): ActionRunnable? { return if (intent.hasExtra(ENTRY_KEY) - && intent.hasExtra(PARENT_ID_KEY) - && intent.hasExtra(SAVE_DATABASE_KEY) + && intent.hasExtra(PARENT_ID_KEY) + && intent.hasExtra(SAVE_DATABASE_KEY) ) { val parentId: NodeId<*>? = intent.getParcelableExtra(PARENT_ID_KEY) val newEntry: Entry? = intent.getParcelableExtra(ENTRY_KEY) if (parentId == null - || newEntry == null) + || newEntry == null + ) return null database.getGroupById(parentId)?.let { parent -> @@ -888,16 +944,20 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress } } - private fun buildDatabaseUpdateEntryActionTask(intent: Intent, database: Database): ActionRunnable? { + private fun buildDatabaseUpdateEntryActionTask( + intent: Intent, + database: Database, + ): ActionRunnable? { return if (intent.hasExtra(ENTRY_ID_KEY) - && intent.hasExtra(ENTRY_KEY) - && intent.hasExtra(SAVE_DATABASE_KEY) + && intent.hasExtra(ENTRY_KEY) + && intent.hasExtra(SAVE_DATABASE_KEY) ) { val entryId: NodeId? = intent.getParcelableExtra(ENTRY_ID_KEY) val newEntry: Entry? = intent.getParcelableExtra(ENTRY_KEY) if (entryId == null - || newEntry == null) + || newEntry == null + ) return null database.getEntryById(entryId)?.let { oldEntry -> @@ -916,11 +976,14 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress } } - private fun buildDatabaseCopyNodesActionTask(intent: Intent, database: Database): ActionRunnable? { + private fun buildDatabaseCopyNodesActionTask( + intent: Intent, + database: Database, + ): ActionRunnable? { return if (intent.hasExtra(GROUPS_ID_KEY) - && intent.hasExtra(ENTRIES_ID_KEY) - && intent.hasExtra(PARENT_ID_KEY) - && intent.hasExtra(SAVE_DATABASE_KEY) + && intent.hasExtra(ENTRIES_ID_KEY) + && intent.hasExtra(PARENT_ID_KEY) + && intent.hasExtra(SAVE_DATABASE_KEY) ) { val parentId: NodeId<*> = intent.getParcelableExtra(PARENT_ID_KEY) ?: return null @@ -940,11 +1003,14 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress } } - private fun buildDatabaseMoveNodesActionTask(intent: Intent, database: Database): ActionRunnable? { + private fun buildDatabaseMoveNodesActionTask( + intent: Intent, + database: Database, + ): ActionRunnable? { return if (intent.hasExtra(GROUPS_ID_KEY) - && intent.hasExtra(ENTRIES_ID_KEY) - && intent.hasExtra(PARENT_ID_KEY) - && intent.hasExtra(SAVE_DATABASE_KEY) + && intent.hasExtra(ENTRIES_ID_KEY) + && intent.hasExtra(PARENT_ID_KEY) + && intent.hasExtra(SAVE_DATABASE_KEY) ) { val parentId: NodeId<*> = intent.getParcelableExtra(PARENT_ID_KEY) ?: return null @@ -964,28 +1030,34 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress } } - private fun buildDatabaseDeleteNodesActionTask(intent: Intent, database: Database): ActionRunnable? { + private fun buildDatabaseDeleteNodesActionTask( + intent: Intent, + database: Database, + ): ActionRunnable? { return if (intent.hasExtra(GROUPS_ID_KEY) - && intent.hasExtra(ENTRIES_ID_KEY) - && intent.hasExtra(SAVE_DATABASE_KEY) + && intent.hasExtra(ENTRIES_ID_KEY) + && intent.hasExtra(SAVE_DATABASE_KEY) ) { - DeleteNodesRunnable(this, - database, - getListNodesFromBundle(database, intent.extras!!), - !database.isReadOnly && intent.getBooleanExtra(SAVE_DATABASE_KEY, false), - AfterActionNodesRunnable() - ) { hardwareKey, seed -> - retrieveResponseFromChallenge(hardwareKey, seed) - } + DeleteNodesRunnable(this, + database, + getListNodesFromBundle(database, intent.extras!!), + !database.isReadOnly && intent.getBooleanExtra(SAVE_DATABASE_KEY, false), + AfterActionNodesRunnable() + ) { hardwareKey, seed -> + retrieveResponseFromChallenge(hardwareKey, seed) + } } else { null } } - private fun buildDatabaseRestoreEntryHistoryActionTask(intent: Intent, database: Database): ActionRunnable? { + private fun buildDatabaseRestoreEntryHistoryActionTask( + intent: Intent, + database: Database, + ): ActionRunnable? { return if (intent.hasExtra(ENTRY_ID_KEY) - && intent.hasExtra(ENTRY_HISTORY_POSITION_KEY) - && intent.hasExtra(SAVE_DATABASE_KEY) + && intent.hasExtra(ENTRY_HISTORY_POSITION_KEY) + && intent.hasExtra(SAVE_DATABASE_KEY) ) { val entryId: NodeId = intent.getParcelableExtra(ENTRY_ID_KEY) ?: return null @@ -1004,10 +1076,13 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress } } - private fun buildDatabaseDeleteEntryHistoryActionTask(intent: Intent, database: Database): ActionRunnable? { + private fun buildDatabaseDeleteEntryHistoryActionTask( + intent: Intent, + database: Database, + ): ActionRunnable? { return if (intent.hasExtra(ENTRY_ID_KEY) - && intent.hasExtra(ENTRY_HISTORY_POSITION_KEY) - && intent.hasExtra(SAVE_DATABASE_KEY) + && intent.hasExtra(ENTRY_HISTORY_POSITION_KEY) + && intent.hasExtra(SAVE_DATABASE_KEY) ) { val entryId: NodeId = intent.getParcelableExtra(ENTRY_ID_KEY) ?: return null @@ -1026,16 +1101,21 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress } } - private fun buildDatabaseUpdateCompressionActionTask(intent: Intent, database: Database): ActionRunnable? { + private fun buildDatabaseUpdateCompressionActionTask( + intent: Intent, + database: Database, + ): ActionRunnable? { return if (intent.hasExtra(OLD_ELEMENT_KEY) - && intent.hasExtra(NEW_ELEMENT_KEY) - && intent.hasExtra(SAVE_DATABASE_KEY)) { + && intent.hasExtra(NEW_ELEMENT_KEY) + && intent.hasExtra(SAVE_DATABASE_KEY) + ) { val oldElement: CompressionAlgorithm? = intent.getParcelableExtra(OLD_ELEMENT_KEY) val newElement: CompressionAlgorithm? = intent.getParcelableExtra(NEW_ELEMENT_KEY) if (oldElement == null - || newElement == null) + || newElement == null + ) return null return UpdateCompressionBinariesDatabaseRunnable(this, @@ -1055,7 +1135,10 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress } } - private fun buildDatabaseRemoveUnlinkedDataActionTask(intent: Intent, database: Database): ActionRunnable? { + private fun buildDatabaseRemoveUnlinkedDataActionTask( + intent: Intent, + database: Database, + ): ActionRunnable? { return if (intent.hasExtra(SAVE_DATABASE_KEY)) { return RemoveUnlinkedDataDatabaseRunnable(this, @@ -1073,7 +1156,10 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress } } - private fun buildDatabaseUpdateElementActionTask(intent: Intent, database: Database): ActionRunnable? { + private fun buildDatabaseUpdateElementActionTask( + intent: Intent, + database: Database, + ): ActionRunnable? { return if (intent.hasExtra(SAVE_DATABASE_KEY)) { return SaveDatabaseRunnable(this, database, @@ -1120,7 +1206,8 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress private val TAG = DatabaseTaskNotificationService::class.java.name - private const val CHANNEL_DATABASE_ID = "com.kunzisoft.keepass.notification.channel.database" + private const val CHANNEL_DATABASE_ID = + "com.kunzisoft.keepass.notification.channel.database" const val ACTION_DATABASE_CREATE_TASK = "ACTION_DATABASE_CREATE_TASK" const val ACTION_DATABASE_LOAD_TASK = "ACTION_DATABASE_LOAD_TASK" @@ -1137,19 +1224,30 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress const val ACTION_DATABASE_RESTORE_ENTRY_HISTORY = "ACTION_DATABASE_RESTORE_ENTRY_HISTORY" const val ACTION_DATABASE_DELETE_ENTRY_HISTORY = "ACTION_DATABASE_DELETE_ENTRY_HISTORY" const val ACTION_DATABASE_UPDATE_NAME_TASK = "ACTION_DATABASE_UPDATE_NAME_TASK" - const val ACTION_DATABASE_UPDATE_DESCRIPTION_TASK = "ACTION_DATABASE_UPDATE_DESCRIPTION_TASK" - const val ACTION_DATABASE_UPDATE_DEFAULT_USERNAME_TASK = "ACTION_DATABASE_UPDATE_DEFAULT_USERNAME_TASK" + const val ACTION_DATABASE_UPDATE_DESCRIPTION_TASK = + "ACTION_DATABASE_UPDATE_DESCRIPTION_TASK" + const val ACTION_DATABASE_UPDATE_DEFAULT_USERNAME_TASK = + "ACTION_DATABASE_UPDATE_DEFAULT_USERNAME_TASK" const val ACTION_DATABASE_UPDATE_COLOR_TASK = "ACTION_DATABASE_UPDATE_COLOR_TASK" - const val ACTION_DATABASE_UPDATE_COMPRESSION_TASK = "ACTION_DATABASE_UPDATE_COMPRESSION_TASK" - const val ACTION_DATABASE_REMOVE_UNLINKED_DATA_TASK = "ACTION_DATABASE_REMOVE_UNLINKED_DATA_TASK" - const val ACTION_DATABASE_UPDATE_RECYCLE_BIN_TASK = "ACTION_DATABASE_UPDATE_RECYCLE_BIN_TASK" - const val ACTION_DATABASE_UPDATE_TEMPLATES_GROUP_TASK = "ACTION_DATABASE_UPDATE_TEMPLATES_GROUP_TASK" - const val ACTION_DATABASE_UPDATE_MAX_HISTORY_ITEMS_TASK = "ACTION_DATABASE_UPDATE_MAX_HISTORY_ITEMS_TASK" - const val ACTION_DATABASE_UPDATE_MAX_HISTORY_SIZE_TASK = "ACTION_DATABASE_UPDATE_MAX_HISTORY_SIZE_TASK" + const val ACTION_DATABASE_UPDATE_COMPRESSION_TASK = + "ACTION_DATABASE_UPDATE_COMPRESSION_TASK" + const val ACTION_DATABASE_REMOVE_UNLINKED_DATA_TASK = + "ACTION_DATABASE_REMOVE_UNLINKED_DATA_TASK" + const val ACTION_DATABASE_UPDATE_RECYCLE_BIN_TASK = + "ACTION_DATABASE_UPDATE_RECYCLE_BIN_TASK" + const val ACTION_DATABASE_UPDATE_TEMPLATES_GROUP_TASK = + "ACTION_DATABASE_UPDATE_TEMPLATES_GROUP_TASK" + const val ACTION_DATABASE_UPDATE_MAX_HISTORY_ITEMS_TASK = + "ACTION_DATABASE_UPDATE_MAX_HISTORY_ITEMS_TASK" + const val ACTION_DATABASE_UPDATE_MAX_HISTORY_SIZE_TASK = + "ACTION_DATABASE_UPDATE_MAX_HISTORY_SIZE_TASK" const val ACTION_DATABASE_UPDATE_ENCRYPTION_TASK = "ACTION_DATABASE_UPDATE_ENCRYPTION_TASK" - const val ACTION_DATABASE_UPDATE_KEY_DERIVATION_TASK = "ACTION_DATABASE_UPDATE_KEY_DERIVATION_TASK" - const val ACTION_DATABASE_UPDATE_MEMORY_USAGE_TASK = "ACTION_DATABASE_UPDATE_MEMORY_USAGE_TASK" - const val ACTION_DATABASE_UPDATE_PARALLELISM_TASK = "ACTION_DATABASE_UPDATE_PARALLELISM_TASK" + const val ACTION_DATABASE_UPDATE_KEY_DERIVATION_TASK = + "ACTION_DATABASE_UPDATE_KEY_DERIVATION_TASK" + const val ACTION_DATABASE_UPDATE_MEMORY_USAGE_TASK = + "ACTION_DATABASE_UPDATE_MEMORY_USAGE_TASK" + const val ACTION_DATABASE_UPDATE_PARALLELISM_TASK = + "ACTION_DATABASE_UPDATE_PARALLELISM_TASK" const val ACTION_DATABASE_UPDATE_ITERATIONS_TASK = "ACTION_DATABASE_UPDATE_ITERATIONS_TASK" const val ACTION_DATABASE_SAVE = "ACTION_DATABASE_SAVE" @@ -1173,8 +1271,10 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress const val SAVE_DATABASE_KEY = "SAVE_DATABASE_KEY" const val OLD_NODES_KEY = "OLD_NODES_KEY" const val NEW_NODES_KEY = "NEW_NODES_KEY" - const val OLD_ELEMENT_KEY = "OLD_ELEMENT_KEY" // Warning type of this thing change every time - const val NEW_ELEMENT_KEY = "NEW_ELEMENT_KEY" // Warning type of this thing change every time + const val OLD_ELEMENT_KEY = + "OLD_ELEMENT_KEY" // Warning type of this thing change every time + const val NEW_ELEMENT_KEY = + "NEW_ELEMENT_KEY" // Warning type of this thing change every time fun getListNodesFromBundle(database: Database, bundle: Bundle): List { val nodesAction = ArrayList() @@ -1211,4 +1311,4 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress } } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/kunzisoft/keepass/settings/PreferencesUtil.kt b/app/src/main/java/com/kunzisoft/keepass/settings/PreferencesUtil.kt index a0557c89e..4ae73cd65 100644 --- a/app/src/main/java/com/kunzisoft/keepass/settings/PreferencesUtil.kt +++ b/app/src/main/java/com/kunzisoft/keepass/settings/PreferencesUtil.kt @@ -1,22 +1,3 @@ -/* - * Copyright 2019 Jeremy Jamet / Kunzisoft. - * - * This file is part of KeePassDX. - * - * KeePassDX is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * KeePassDX is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with KeePassDX. If not, see . - * - */ package com.kunzisoft.keepass.settings import android.app.backup.BackupManager @@ -26,18 +7,18 @@ import android.content.res.Resources import android.net.Uri import android.util.Log import androidx.preference.PreferenceManager -import com.kunzisoft.keepass.BuildConfig import com.kunzisoft.keepass.R -import com.kunzisoft.keepass.activities.stylish.Stylish -import com.kunzisoft.keepass.biometric.AdvancedUnlockManager import com.kunzisoft.keepass.database.element.SortNodeEnum import com.kunzisoft.keepass.database.search.SearchParameters import com.kunzisoft.keepass.education.Education -import com.kunzisoft.keepass.magikeyboard.MagikeyboardService -import com.kunzisoft.keepass.password.PassphraseGenerator -import com.kunzisoft.keepass.timeout.TimeoutHelper -import com.kunzisoft.keepass.utils.UriUtil -import java.util.* +import java.util.HashSet +import java.util.Properties +import com.kunzisoft.keepass.settings.DatabasePreferencesUtil.APP_TIMEOUT_KEY +import com.kunzisoft.keepass.settings.DatabasePreferencesUtil.HIDE_EXPIRED_ENTRIES_KEY +import com.kunzisoft.keepass.settings.DatabasePreferencesUtil.SETTING_ICON_PACK_CHOOSE_KEY +import com.kunzisoft.keepass.settings.DatabasePreferencesUtil.SUBDOMAIN_SEARCH_KEY +import com.kunzisoft.keepass.settings.DatabasePreferencesUtil.TIMEOUT_BACKUP_KEY +import com.kunzisoft.keepass.settings.DatabasePreferencesUtil.TIMEOUT_DEFAULT object PreferencesUtil { @@ -61,7 +42,8 @@ object PreferencesUtil { fun saveNodeSort(context: Context, sortNodeEnum: SortNodeEnum, - sortNodeParameters: SortNodeEnum.SortNodeParameters) { + sortNodeParameters: SortNodeEnum.SortNodeParameters + ) { val prefs = PreferenceManager.getDefaultSharedPreferences(context) prefs?.edit()?.apply { putString(context.getString(R.string.sort_node_key), sortNodeEnum.name) @@ -108,12 +90,6 @@ object PreferencesUtil { context.resources.getBoolean(R.bool.auto_focus_search_default)) } - fun searchSubdomains(context: Context): Boolean { - val prefs = PreferenceManager.getDefaultSharedPreferences(context) - return prefs.getBoolean(context.getString(R.string.subdomain_search_key), - context.resources.getBoolean(R.bool.subdomain_search_default)) - } - fun showEntryColors(context: Context): Boolean { val prefs = PreferenceManager.getDefaultSharedPreferences(context) return prefs.getBoolean(context.getString(R.string.show_entry_colors_key), @@ -156,35 +132,35 @@ object PreferencesUtil { context.resources.getBoolean(R.bool.show_uuid_default)) } - fun showExpiredEntries(context: Context): Boolean { - val prefs = PreferenceManager.getDefaultSharedPreferences(context) - return ! prefs.getBoolean(context.getString(R.string.hide_expired_entries_key), - context.resources.getBoolean(R.bool.hide_expired_entries_default)) - } - fun getStyle(context: Context): String { - val defaultStyleString = Stylish.defaultStyle(context) + val defaultStyleString = + com.kunzisoft.keepass.activities.stylish.Stylish.defaultStyle(context) val styleString = PreferenceManager.getDefaultSharedPreferences(context) .getString(context.getString(R.string.setting_style_key), defaultStyleString) ?: defaultStyleString // Return the system style - return Stylish.retrieveEquivalentSystemStyle(context, styleString) + return com.kunzisoft.keepass.activities.stylish.Stylish.retrieveEquivalentSystemStyle( + context, + styleString) } fun setStyle(context: Context, styleString: String) { var tempThemeString = styleString - if (!UriUtil.contributingUser(context)) { - if (tempThemeString in BuildConfig.STYLES_DISABLED) { - tempThemeString = Stylish.defaultStyle(context) + if (!com.kunzisoft.keepass.utils.UriUtil.contributingUser(context)) { + if (tempThemeString in com.kunzisoft.keepass.BuildConfig.STYLES_DISABLED) { + tempThemeString = + com.kunzisoft.keepass.activities.stylish.Stylish.defaultStyle(context) } } // Store light style to show selection in array list - tempThemeString = Stylish.retrieveEquivalentLightStyle(context, tempThemeString) + tempThemeString = + com.kunzisoft.keepass.activities.stylish.Stylish.retrieveEquivalentLightStyle(context, + tempThemeString) PreferenceManager.getDefaultSharedPreferences(context) .edit() .putString(context.getString(R.string.setting_style_key), tempThemeString) .apply() - Stylish.load(context) + com.kunzisoft.keepass.activities.stylish.Stylish.load(context) } fun getStyleBrightness(context: Context): String? { @@ -292,16 +268,16 @@ object PreferencesUtil { } } - fun getDefaultPassphraseWordCase(context: Context): PassphraseGenerator.WordCase { + fun getDefaultPassphraseWordCase(context: Context): com.kunzisoft.keepass.password.PassphraseGenerator.WordCase { val prefs = PreferenceManager.getDefaultSharedPreferences(context) - return PassphraseGenerator.WordCase - .getByOrdinal(prefs.getInt(context + return com.kunzisoft.keepass.password.PassphraseGenerator.WordCase.Companion.getByOrdinal( + prefs.getInt(context .getString(R.string.passphrase_generator_word_case_key), 0) - ) + ) } - fun setDefaultPassphraseWordCase(context: Context, wordCase: PassphraseGenerator.WordCase) { + fun setDefaultPassphraseWordCase(context: Context, wordCase: com.kunzisoft.keepass.password.PassphraseGenerator.WordCase) { PreferenceManager.getDefaultSharedPreferences(context).edit().apply { putInt( context.getString(R.string.passphrase_generator_word_case_key), @@ -414,45 +390,23 @@ object PreferencesUtil { */ fun saveCurrentTime(context: Context) { PreferenceManager.getDefaultSharedPreferences(context).edit().apply { - putLong(context.getString(R.string.timeout_backup_key), System.currentTimeMillis()) + putLong(TIMEOUT_BACKUP_KEY, System.currentTimeMillis()) apply() } } - /** - * Time previously saved in milliseconds (commonly used to compare with current time and check timeout) - */ - fun getTimeSaved(context: Context): Long { - val prefs = PreferenceManager.getDefaultSharedPreferences(context) - return prefs.getLong(context.getString(R.string.timeout_backup_key), - TimeoutHelper.NEVER) - } - - /** - * App timeout selected in milliseconds - */ - fun getAppTimeout(context: Context): Long { - return try { - val prefs = PreferenceManager.getDefaultSharedPreferences(context) - (prefs.getString(context.getString(R.string.app_timeout_key), - context.getString(R.string.timeout_default)) ?: "300000").toLong() - } catch (e: NumberFormatException) { - TimeoutHelper.DEFAULT_TIMEOUT - } - } - fun getClipboardTimeout(context: Context): Long { val prefs = PreferenceManager.getDefaultSharedPreferences(context) return prefs.getString(context.getString(R.string.clipboard_timeout_key), - context.getString(R.string.clipboard_timeout_default))?.toLong() - ?: TimeoutHelper.DEFAULT_TIMEOUT + TIMEOUT_DEFAULT)?.toLong() + ?: com.kunzisoft.keepass.timeout.TimeoutHelper.DEFAULT_TIMEOUT } fun getAdvancedUnlockTimeout(context: Context): Long { val prefs = PreferenceManager.getDefaultSharedPreferences(context) return prefs.getString(context.getString(R.string.temp_advanced_unlock_timeout_key), context.getString(R.string.temp_advanced_unlock_timeout_default))?.toLong() - ?: TimeoutHelper.DEFAULT_TIMEOUT + ?: com.kunzisoft.keepass.timeout.TimeoutHelper.DEFAULT_TIMEOUT } fun isLockDatabaseWhenScreenShutOffEnable(context: Context): Boolean { @@ -500,7 +454,8 @@ object PreferencesUtil { return prefs.getBoolean(context.getString(R.string.biometric_unlock_enable_key), context.resources.getBoolean(R.bool.biometric_unlock_enable_default)) && (if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) { - AdvancedUnlockManager.biometricUnlockSupported(context) + com.kunzisoft.keepass.biometric.AdvancedUnlockManager.Companion.biometricUnlockSupported( + context) } else { false }) @@ -593,13 +548,6 @@ object PreferencesUtil { .apply() } - fun getIconPackSelectedId(context: Context): String? { - val prefs = PreferenceManager.getDefaultSharedPreferences(context) - return prefs.getString( - context.getString(R.string.setting_icon_pack_choose_key), - context.getString(R.string.setting_icon_pack_choose_default)) - } - fun emptyPasswordAllowed(context: Context): Boolean { val prefs = PreferenceManager.getDefaultSharedPreferences(context) return prefs.getBoolean(context.getString(R.string.allow_no_password_key), @@ -631,7 +579,9 @@ object PreferencesUtil { } fun isKeyboardSaveSearchInfoEnable(context: Context): Boolean { - if (!MagikeyboardService.activatedInSettings(context)) + if (!com.kunzisoft.keepass.magikeyboard.MagikeyboardService.Companion.activatedInSettings( + context) + ) return false val prefs = PreferenceManager.getDefaultSharedPreferences(context) return prefs.getBoolean(context.getString(R.string.keyboard_save_search_info_key), @@ -716,7 +666,7 @@ object PreferencesUtil { fun getDefaultApplicationIdBlocklist(resources: Resources?): Set { return resources?.getStringArray(R.array.autofill_application_id_blocklist_default) ?.toMutableSet()?.apply { - add(BuildConfig.APPLICATION_ID) + add(com.kunzisoft.keepass.BuildConfig.APPLICATION_ID) } ?: emptySet() } @@ -754,10 +704,12 @@ object PreferencesUtil { fun getAppProperties(context: Context): Properties { val properties = Properties() - for ((name, value) in PreferenceManager.getDefaultSharedPreferences(context).all) { + for ((name, value) in PreferenceManager.getDefaultSharedPreferences( + context).all) { properties[name] = value.toString() } - for ((name, value) in Education.getEducationSharedPreferences(context).all) { + for ((name, value) in com.kunzisoft.keepass.education.Education.Companion.getEducationSharedPreferences( + context).all) { properties[name] = value.toString() } return properties @@ -780,7 +732,9 @@ object PreferencesUtil { try { putProperty(this, name as String, value as String) } catch (e:Exception) { - Log.e("PreferencesUtil", "Error when trying to parse app property $name=$value", e) + Log.e("PreferencesUtil", + "Error when trying to parse app property $name=$value", + e) } } }.apply() @@ -788,7 +742,7 @@ object PreferencesUtil { fun setAppProperties(context: Context, properties: Properties) { putPropertiesInPreferences(properties, - PreferenceManager.getDefaultSharedPreferences(context)) { editor, name, value -> + PreferenceManager.getDefaultSharedPreferences(context)) { editor, name, value -> when (name) { context.getString(R.string.allow_no_password_key) -> editor.putBoolean(name, value.toBoolean()) context.getString(R.string.delete_entered_password_key) -> editor.putBoolean(name, value.toBoolean()) @@ -796,8 +750,8 @@ object PreferencesUtil { context.getString(R.string.enable_auto_save_database_key) -> editor.putBoolean(name, value.toBoolean()) context.getString(R.string.enable_keep_screen_on_key) -> editor.putBoolean(name, value.toBoolean()) context.getString(R.string.auto_focus_search_key) -> editor.putBoolean(name, value.toBoolean()) - context.getString(R.string.subdomain_search_key) -> editor.putBoolean(name, value.toBoolean()) - context.getString(R.string.app_timeout_key) -> editor.putString(name, value.toLong().toString()) + SUBDOMAIN_SEARCH_KEY -> editor.putBoolean(name, value.toBoolean()) + APP_TIMEOUT_KEY -> editor.putString(name, value.toLong().toString()) context.getString(R.string.lock_database_screen_off_key) -> editor.putBoolean(name, value.toBoolean()) context.getString(R.string.lock_database_back_root_key) -> editor.putBoolean(name, value.toBoolean()) context.getString(R.string.lock_database_show_button_key) -> editor.putBoolean(name, value.toBoolean()) @@ -839,7 +793,7 @@ object PreferencesUtil { context.getString(R.string.setting_style_key) -> setStyle(context, value) context.getString(R.string.setting_style_brightness_key) -> editor.putString(name, value) - context.getString(R.string.setting_icon_pack_choose_key) -> editor.putString(name, value) + SETTING_ICON_PACK_CHOOSE_KEY -> editor.putString(name, value) context.getString(R.string.show_entry_colors_key) -> editor.putBoolean(name, value.toBoolean()) context.getString(R.string.hide_password_key) -> editor.putBoolean(name, value.toBoolean()) context.getString(R.string.colorize_password_key) -> editor.putBoolean(name, value.toBoolean()) @@ -849,7 +803,7 @@ object PreferencesUtil { context.getString(R.string.show_uuid_key) -> editor.putBoolean(name, value.toBoolean()) context.getString(R.string.list_size_key) -> editor.putString(name, value) context.getString(R.string.monospace_font_fields_enable_key) -> editor.putBoolean(name, value.toBoolean()) - context.getString(R.string.hide_expired_entries_key) -> editor.putBoolean(name, value.toBoolean()) + HIDE_EXPIRED_ENTRIES_KEY -> editor.putBoolean(name, value.toBoolean()) context.getString(R.string.enable_education_screens_key) -> editor.putBoolean(name, value.toBoolean()) context.getString(R.string.password_generator_length_key) -> editor.putInt(name, value.toInt()) @@ -869,8 +823,13 @@ object PreferencesUtil { } putPropertiesInPreferences(properties, - Education.getEducationSharedPreferences(context)) { editor, name, value -> - Education.putPropertiesInEducationPreferences(context, editor, name, value) + Education.getEducationSharedPreferences( + context)) { editor, name, value -> + Education.putPropertiesInEducationPreferences( + context, + editor, + name, + value) } } } diff --git a/app/src/main/java/com/kunzisoft/keepass/utils/BroadcastAction.kt b/app/src/main/java/com/kunzisoft/keepass/utils/BroadcastAction.kt index 78e8c5edb..c68eeaf1e 100644 --- a/app/src/main/java/com/kunzisoft/keepass/utils/BroadcastAction.kt +++ b/app/src/main/java/com/kunzisoft/keepass/utils/BroadcastAction.kt @@ -40,7 +40,6 @@ import com.kunzisoft.keepass.timeout.TimeoutHelper const val DATABASE_START_TASK_ACTION = "com.kunzisoft.keepass.DATABASE_START_TASK_ACTION" const val DATABASE_STOP_TASK_ACTION = "com.kunzisoft.keepass.DATABASE_STOP_TASK_ACTION" -const val LOCK_ACTION = "com.kunzisoft.keepass.LOCK" const val REMOVE_ENTRY_MAGIKEYBOARD_ACTION = "com.kunzisoft.keepass.REMOVE_ENTRY_MAGIKEYBOARD" const val BACK_PREVIOUS_KEYBOARD_ACTION = "com.kunzisoft.keepass.BACK_PREVIOUS_KEYBOARD" @@ -165,4 +164,4 @@ fun Context.closeDatabase(database: Database?) { // Release not useful URI permission UriUtil.releaseAllUnnecessaryPermissionUris(applicationContext) -} \ No newline at end of file +} diff --git a/app/src/main/java/com/kunzisoft/keepass/utils/SingletonHolder.kt b/app/src/main/java/com/kunzisoft/keepass/utils/SingletonHolder.kt index d9ea42e02..2c080b359 100644 --- a/app/src/main/java/com/kunzisoft/keepass/utils/SingletonHolder.kt +++ b/app/src/main/java/com/kunzisoft/keepass/utils/SingletonHolder.kt @@ -18,12 +18,9 @@ * */ package com.kunzisoft.keepass.utils - open class SingletonHolderParameter(private val constructor: (A) -> T) { - @Volatile private var instance: T? = null - fun getInstance(arg: A): T { return when { instance != null -> instance!! @@ -35,18 +32,3 @@ open class SingletonHolderParameter(private val constructor: (A) -> } } -open class SingletonHolder(private val constructor: () -> T) { - - @Volatile - private var instance: T? = null - - fun getInstance(): T { - return when { - instance != null -> instance!! - else -> synchronized(this) { - if (instance == null) instance = constructor() - instance!! - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/kunzisoft/keepass/viewmodels/FileDatabaseInfo.kt b/app/src/main/java/com/kunzisoft/keepass/viewmodels/FileDatabaseInfo.kt index 3e8a8fe15..075ef7dde 100644 --- a/app/src/main/java/com/kunzisoft/keepass/viewmodels/FileDatabaseInfo.kt +++ b/app/src/main/java/com/kunzisoft/keepass/viewmodels/FileDatabaseInfo.kt @@ -1,37 +1,16 @@ -/* - * Copyright 2019 Jeremy Jamet / Kunzisoft. - * - * This file is part of KeePassDX. - * - * KeePassDX is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * KeePassDX is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with KeePassDX. If not, see . - * - */ package com.kunzisoft.keepass.viewmodels import android.content.Context import android.net.Uri import android.text.format.Formatter -import androidx.documentfile.provider.DocumentFile -import com.kunzisoft.keepass.utils.UriUtil import java.io.Serializable import java.text.DateFormat -import java.util.* +import java.util.Date class FileDatabaseInfo : Serializable { private var context: Context - private var documentFile: DocumentFile? = null + private var documentFile: androidx.documentfile.provider.DocumentFile? = null var fileUri: Uri? private set @@ -43,16 +22,16 @@ class FileDatabaseInfo : Serializable { constructor(context: Context, filePath: String) { this.context = context - this.fileUri = UriUtil.parse(filePath) + this.fileUri = com.kunzisoft.keepass.utils.UriUtil.parse(filePath) init() } fun init() { // Check permission fileUri?.let { uri -> - UriUtil.takeUriPermission(context.contentResolver, uri) + com.kunzisoft.keepass.utils.UriUtil.takeUriPermission(context.contentResolver, uri) } - documentFile = UriUtil.getFileData(context, fileUri) + documentFile = com.kunzisoft.keepass.utils.UriUtil.getFileData(context, fileUri) } var exists: Boolean = false @@ -92,4 +71,4 @@ class FileDatabaseInfo : Serializable { else -> if (exists) documentFile?.name else fileUri?.path } } -} \ No newline at end of file +} diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 6e50fcb2f..33823a56b 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -29,10 +29,9 @@ 5dp 14dp 148dp - 32dp 48dp 0dp 1 160dp 260 - \ No newline at end of file + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index aab95a64c..2b2620991 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -78,12 +78,10 @@ Remove Close fields Select to copy %1$s to clipboard - Retrieving database key… Waiting for the challenge request… Waiting for the challenge response… Database Templates - Decrypting database content… Use as default database Digits KeePassDX © %1$d Kunzisoft is <strong>open source</strong> and <strong>without advertising</strong>. @@ -92,10 +90,8 @@ In order to <strong>keep our freedom</strong>, <strong>fix bugs</strong>, <strong>add features</strong> and <strong>to be always active</strong>, we count on your <strong>contribution</strong>. Accessed Cancel - Notes Confirm password Created - Expires Expired UUID History @@ -108,11 +104,9 @@ Auto-Type Auto-Type sequence Could not find entry data. - Password Tags Custom data Save - Title Set up one-time password OTP type Secret @@ -124,38 +118,8 @@ Current group Case sensitive Regular expression - Debit / Credit Card - Holder - Number - CVV - PIN - ID Card - Name - Place of issue - Date of issue - Email - Email address - Wi-Fi - SSID - Type - Cryptocurrency wallet - Token - Public key - Private key - Seed - Account - Bank Bank name - SWIFT / BIC - IBAN - Secure Note - Membership - Standard - Template - Version OTP - URL - Username The Arcfour stream cipher is not supported. Could not handle this URI in KeePassDX. Could not create file @@ -166,10 +130,6 @@ This word is reserved and cannot be used. Select a keyfile. Select a hardware key. - No memory to load your entire database. - XML malformed. - Could not load the database. - Could not load the key. Try to lower the KDF \"Memory Usage\". At least one password generation type must be selected. At least one credential must be set. The passwords do not match. @@ -178,13 +138,8 @@ This label already exists. Enter a positive integer number in the \"Length\" field. Could not enable autofill service. - You cannot move a group here. - You cannot move an entry here. - You cannot copy an entry here. - You cannot copy a group here. Unable to create database file. Unable to create database with this password and keyfile. - Could not save the database. Secret key must be in Base32 format. Counter must be between %1$d and %2$d. Period must be between %1$d and %2$d seconds. @@ -205,14 +160,8 @@ Unable to get the response from the challenge. Cancelled by user. Driver for %1$s is required. - Unable to merge from a database V1. - Database location is unknown, database action cannot be performed. - Hardware key is not supported. - "Key cannot be empty." Field name Field value - Could not find file. Try reopening it from your file browser. - Corrupted file. File manager Generate password Confirm password @@ -224,10 +173,6 @@ Password Password Passphrase - Could not read credentials. - Wrong algorithm. - %1$s with the same UUID %2$s already exists. - Could not recognize the database format. The keyfile is empty. Length Hide passwords @@ -349,7 +294,6 @@ Special Search Underline - Unsupported database version. Upper-case Warning Avoid password characters outside of text encoding format in database file (unrecognized chars are converted to the same letter). @@ -487,10 +431,6 @@ Interface Other Compression - None - Gzip - Recycle bin - Templates Keyboard Magikeyboard Activate a custom keyboard populating your passwords and all identity fields @@ -702,4 +642,4 @@ Displays foreground and background colors for an entry Hide expired entries Expired entries are not shown - \ No newline at end of file + diff --git a/database/build.gradle b/database/build.gradle index 1cc7e8948..e1e8552b4 100644 --- a/database/build.gradle +++ b/database/build.gradle @@ -1,7 +1,7 @@ -plugins { - id 'com.android.library' - id 'org.jetbrains.kotlin.android' -} +apply plugin: 'com.android.library' +apply plugin: 'kotlin-android' +apply plugin: 'kotlin-parcelize' +apply plugin: 'kotlin-kapt' android { compileSdkVersion 32 @@ -16,6 +16,13 @@ android { consumerProguardFiles "consumer-rules.pro" buildConfigField "String[]", "ICON_PACKS", "{\"classic\",\"material\"}" + + kapt { + arguments { + arg("room.incremental", "true") + arg("room.schemaLocation", "$projectDir/schemas".toString()) + } + } } buildTypes { @@ -33,6 +40,8 @@ android { } } +def room_version = "2.4.3" + dependencies { implementation "androidx.core:core-ktx:$android_core_version" implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4' @@ -47,6 +56,10 @@ dependencies { implementation project(path: ':icon-pack-classic') implementation project(path: ':icon-pack-material') + // Database + implementation "androidx.room:room-runtime:$room_version" + kapt "androidx.room:room-compiler:$room_version" + implementation project(path: ':crypto') testImplementation 'junit:junit:4.13.2' diff --git a/app/schemas/com.kunzisoft.keepass.app.database.AppDatabase/1.json b/database/schemas/com.kunzisoft.keepass.app.database.AppDatabase/1.json similarity index 100% rename from app/schemas/com.kunzisoft.keepass.app.database.AppDatabase/1.json rename to database/schemas/com.kunzisoft.keepass.app.database.AppDatabase/1.json diff --git a/app/schemas/com.kunzisoft.keepass.app.database.AppDatabase/2.json b/database/schemas/com.kunzisoft.keepass.app.database.AppDatabase/2.json similarity index 100% rename from app/schemas/com.kunzisoft.keepass.app.database.AppDatabase/2.json rename to database/schemas/com.kunzisoft.keepass.app.database.AppDatabase/2.json diff --git a/app/src/main/java/com/kunzisoft/keepass/app/database/AppDatabase.kt b/database/src/main/java/com/kunzisoft/keepass/app/database/AppDatabase.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/app/database/AppDatabase.kt rename to database/src/main/java/com/kunzisoft/keepass/app/database/AppDatabase.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/app/database/CipherDatabaseDao.kt b/database/src/main/java/com/kunzisoft/keepass/app/database/CipherDatabaseDao.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/app/database/CipherDatabaseDao.kt rename to database/src/main/java/com/kunzisoft/keepass/app/database/CipherDatabaseDao.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/app/database/CipherDatabaseEntity.kt b/database/src/main/java/com/kunzisoft/keepass/app/database/CipherDatabaseEntity.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/app/database/CipherDatabaseEntity.kt rename to database/src/main/java/com/kunzisoft/keepass/app/database/CipherDatabaseEntity.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/app/database/FileDatabaseHistoryDao.kt b/database/src/main/java/com/kunzisoft/keepass/app/database/FileDatabaseHistoryDao.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/app/database/FileDatabaseHistoryDao.kt rename to database/src/main/java/com/kunzisoft/keepass/app/database/FileDatabaseHistoryDao.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/app/database/FileDatabaseHistoryEntity.kt b/database/src/main/java/com/kunzisoft/keepass/app/database/FileDatabaseHistoryEntity.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/app/database/FileDatabaseHistoryEntity.kt rename to database/src/main/java/com/kunzisoft/keepass/app/database/FileDatabaseHistoryEntity.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/app/database/IOActionTask.kt b/database/src/main/java/com/kunzisoft/keepass/app/database/IOActionTask.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/app/database/IOActionTask.kt rename to database/src/main/java/com/kunzisoft/keepass/app/database/IOActionTask.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/action/MergeDatabaseRunnable.kt b/database/src/main/java/com/kunzisoft/keepass/database/action/MergeDatabaseRunnable.kt similarity index 95% rename from app/src/main/java/com/kunzisoft/keepass/database/action/MergeDatabaseRunnable.kt rename to database/src/main/java/com/kunzisoft/keepass/database/action/MergeDatabaseRunnable.kt index b805793d0..ffd13395d 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/action/MergeDatabaseRunnable.kt +++ b/database/src/main/java/com/kunzisoft/keepass/database/action/MergeDatabaseRunnable.kt @@ -26,7 +26,7 @@ import com.kunzisoft.keepass.database.element.MainCredential import com.kunzisoft.keepass.database.element.binary.BinaryData import com.kunzisoft.keepass.database.exception.DatabaseException import com.kunzisoft.keepass.hardware.HardwareKey -import com.kunzisoft.keepass.settings.PreferencesUtil +import com.kunzisoft.keepass.settings.DatabasePreferencesUtil import com.kunzisoft.keepass.tasks.ActionRunnable import com.kunzisoft.keepass.tasks.ProgressTaskUpdater @@ -61,7 +61,7 @@ class MergeDatabaseRunnable(private val context: Context, if (result.isSuccess) { // Register the current time to init the lock timer - PreferencesUtil.saveCurrentTime(context) + DatabasePreferencesUtil.saveCurrentTime(context) } } diff --git a/app/src/main/java/com/kunzisoft/keepass/database/action/ReloadDatabaseRunnable.kt b/database/src/main/java/com/kunzisoft/keepass/database/action/ReloadDatabaseRunnable.kt similarity index 69% rename from app/src/main/java/com/kunzisoft/keepass/database/action/ReloadDatabaseRunnable.kt rename to database/src/main/java/com/kunzisoft/keepass/database/action/ReloadDatabaseRunnable.kt index c382e63e7..6203a5aec 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/action/ReloadDatabaseRunnable.kt +++ b/database/src/main/java/com/kunzisoft/keepass/database/action/ReloadDatabaseRunnable.kt @@ -23,37 +23,39 @@ import android.content.Context import com.kunzisoft.keepass.database.element.Database import com.kunzisoft.keepass.database.element.binary.BinaryData import com.kunzisoft.keepass.database.exception.DatabaseException -import com.kunzisoft.keepass.settings.PreferencesUtil +import com.kunzisoft.keepass.settings.DatabasePreferencesUtil import com.kunzisoft.keepass.tasks.ActionRunnable import com.kunzisoft.keepass.tasks.ProgressTaskUpdater -import com.kunzisoft.keepass.utils.UriUtil +import com.kunzisoft.keepass.utils.UriUtilDatabase -class ReloadDatabaseRunnable(private val context: Context, - private val mDatabase: Database, - private val progressTaskUpdater: ProgressTaskUpdater?, - private val mLoadDatabaseResult: ((Result) -> Unit)?) - : ActionRunnable() { +class ReloadDatabaseRunnable( + private val context: Context, + private val mDatabase: Database, + private val progressTaskUpdater: ProgressTaskUpdater?, + private val mLoadDatabaseResult: ((Result) -> Unit)?, +) : ActionRunnable() { override fun onStartRun() { // Clear before we load - mDatabase.clearIndexesAndBinaries(UriUtil.getBinaryDir(context)) + mDatabase.clearIndexesAndBinaries(UriUtilDatabase.getBinaryDir( + context)) mDatabase.wasReloaded = true } override fun onActionRun() { try { mDatabase.reloadData(context.contentResolver, - { memoryWanted -> - BinaryData.canMemoryBeAllocatedInRAM(context, memoryWanted) - }, - progressTaskUpdater) + { memoryWanted -> + BinaryData.canMemoryBeAllocatedInRAM(context, memoryWanted) + }, + progressTaskUpdater) } catch (e: DatabaseException) { setError(e) } if (result.isSuccess) { // Register the current time to init the lock timer - PreferencesUtil.saveCurrentTime(context) + DatabasePreferencesUtil.saveCurrentTime(context) } else { mDatabase.clearAndClose(context) } diff --git a/app/src/main/java/com/kunzisoft/keepass/database/action/RemoveUnlinkedDataDatabaseRunnable.kt b/database/src/main/java/com/kunzisoft/keepass/database/action/RemoveUnlinkedDataDatabaseRunnable.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/action/RemoveUnlinkedDataDatabaseRunnable.kt rename to database/src/main/java/com/kunzisoft/keepass/database/action/RemoveUnlinkedDataDatabaseRunnable.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/action/SaveDatabaseRunnable.kt b/database/src/main/java/com/kunzisoft/keepass/database/action/SaveDatabaseRunnable.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/action/SaveDatabaseRunnable.kt rename to database/src/main/java/com/kunzisoft/keepass/database/action/SaveDatabaseRunnable.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/action/UpdateCompressionBinariesDatabaseRunnable.kt b/database/src/main/java/com/kunzisoft/keepass/database/action/UpdateCompressionBinariesDatabaseRunnable.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/action/UpdateCompressionBinariesDatabaseRunnable.kt rename to database/src/main/java/com/kunzisoft/keepass/database/action/UpdateCompressionBinariesDatabaseRunnable.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/action/history/DeleteEntryHistoryDatabaseRunnable.kt b/database/src/main/java/com/kunzisoft/keepass/database/action/history/DeleteEntryHistoryDatabaseRunnable.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/action/history/DeleteEntryHistoryDatabaseRunnable.kt rename to database/src/main/java/com/kunzisoft/keepass/database/action/history/DeleteEntryHistoryDatabaseRunnable.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/action/history/RestoreEntryHistoryDatabaseRunnable.kt b/database/src/main/java/com/kunzisoft/keepass/database/action/history/RestoreEntryHistoryDatabaseRunnable.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/action/history/RestoreEntryHistoryDatabaseRunnable.kt rename to database/src/main/java/com/kunzisoft/keepass/database/action/history/RestoreEntryHistoryDatabaseRunnable.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/action/node/ActionNodeDatabaseRunnable.kt b/database/src/main/java/com/kunzisoft/keepass/database/action/node/ActionNodeDatabaseRunnable.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/action/node/ActionNodeDatabaseRunnable.kt rename to database/src/main/java/com/kunzisoft/keepass/database/action/node/ActionNodeDatabaseRunnable.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/action/node/AddEntryRunnable.kt b/database/src/main/java/com/kunzisoft/keepass/database/action/node/AddEntryRunnable.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/action/node/AddEntryRunnable.kt rename to database/src/main/java/com/kunzisoft/keepass/database/action/node/AddEntryRunnable.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/action/node/AddGroupRunnable.kt b/database/src/main/java/com/kunzisoft/keepass/database/action/node/AddGroupRunnable.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/action/node/AddGroupRunnable.kt rename to database/src/main/java/com/kunzisoft/keepass/database/action/node/AddGroupRunnable.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/action/node/AfterActionNodesFinish.kt b/database/src/main/java/com/kunzisoft/keepass/database/action/node/AfterActionNodesFinish.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/action/node/AfterActionNodesFinish.kt rename to database/src/main/java/com/kunzisoft/keepass/database/action/node/AfterActionNodesFinish.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/action/node/CopyNodesRunnable.kt b/database/src/main/java/com/kunzisoft/keepass/database/action/node/CopyNodesRunnable.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/action/node/CopyNodesRunnable.kt rename to database/src/main/java/com/kunzisoft/keepass/database/action/node/CopyNodesRunnable.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/action/node/DeleteNodesRunnable.kt b/database/src/main/java/com/kunzisoft/keepass/database/action/node/DeleteNodesRunnable.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/action/node/DeleteNodesRunnable.kt rename to database/src/main/java/com/kunzisoft/keepass/database/action/node/DeleteNodesRunnable.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/action/node/MoveNodesRunnable.kt b/database/src/main/java/com/kunzisoft/keepass/database/action/node/MoveNodesRunnable.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/action/node/MoveNodesRunnable.kt rename to database/src/main/java/com/kunzisoft/keepass/database/action/node/MoveNodesRunnable.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/action/node/NodeHandler.kt b/database/src/main/java/com/kunzisoft/keepass/database/action/node/NodeHandler.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/action/node/NodeHandler.kt rename to database/src/main/java/com/kunzisoft/keepass/database/action/node/NodeHandler.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/action/node/UpdateEntryRunnable.kt b/database/src/main/java/com/kunzisoft/keepass/database/action/node/UpdateEntryRunnable.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/action/node/UpdateEntryRunnable.kt rename to database/src/main/java/com/kunzisoft/keepass/database/action/node/UpdateEntryRunnable.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/action/node/UpdateGroupRunnable.kt b/database/src/main/java/com/kunzisoft/keepass/database/action/node/UpdateGroupRunnable.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/action/node/UpdateGroupRunnable.kt rename to database/src/main/java/com/kunzisoft/keepass/database/action/node/UpdateGroupRunnable.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/crypto/AesEngine.kt b/database/src/main/java/com/kunzisoft/keepass/database/crypto/AesEngine.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/crypto/AesEngine.kt rename to database/src/main/java/com/kunzisoft/keepass/database/crypto/AesEngine.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/crypto/ChaCha20Engine.kt b/database/src/main/java/com/kunzisoft/keepass/database/crypto/ChaCha20Engine.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/crypto/ChaCha20Engine.kt rename to database/src/main/java/com/kunzisoft/keepass/database/crypto/ChaCha20Engine.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/crypto/CipherEngine.kt b/database/src/main/java/com/kunzisoft/keepass/database/crypto/CipherEngine.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/crypto/CipherEngine.kt rename to database/src/main/java/com/kunzisoft/keepass/database/crypto/CipherEngine.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/crypto/CrsAlgorithm.kt b/database/src/main/java/com/kunzisoft/keepass/database/crypto/CrsAlgorithm.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/crypto/CrsAlgorithm.kt rename to database/src/main/java/com/kunzisoft/keepass/database/crypto/CrsAlgorithm.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/crypto/EncryptionAlgorithm.kt b/database/src/main/java/com/kunzisoft/keepass/database/crypto/EncryptionAlgorithm.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/crypto/EncryptionAlgorithm.kt rename to database/src/main/java/com/kunzisoft/keepass/database/crypto/EncryptionAlgorithm.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/crypto/HmacBlock.kt b/database/src/main/java/com/kunzisoft/keepass/database/crypto/HmacBlock.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/crypto/HmacBlock.kt rename to database/src/main/java/com/kunzisoft/keepass/database/crypto/HmacBlock.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/crypto/TwofishEngine.kt b/database/src/main/java/com/kunzisoft/keepass/database/crypto/TwofishEngine.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/crypto/TwofishEngine.kt rename to database/src/main/java/com/kunzisoft/keepass/database/crypto/TwofishEngine.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/crypto/VariantDictionary.kt b/database/src/main/java/com/kunzisoft/keepass/database/crypto/VariantDictionary.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/crypto/VariantDictionary.kt rename to database/src/main/java/com/kunzisoft/keepass/database/crypto/VariantDictionary.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/crypto/kdf/AesKdf.kt b/database/src/main/java/com/kunzisoft/keepass/database/crypto/kdf/AesKdf.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/crypto/kdf/AesKdf.kt rename to database/src/main/java/com/kunzisoft/keepass/database/crypto/kdf/AesKdf.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/crypto/kdf/Argon2Kdf.kt b/database/src/main/java/com/kunzisoft/keepass/database/crypto/kdf/Argon2Kdf.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/crypto/kdf/Argon2Kdf.kt rename to database/src/main/java/com/kunzisoft/keepass/database/crypto/kdf/Argon2Kdf.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/crypto/kdf/KdfEngine.kt b/database/src/main/java/com/kunzisoft/keepass/database/crypto/kdf/KdfEngine.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/crypto/kdf/KdfEngine.kt rename to database/src/main/java/com/kunzisoft/keepass/database/crypto/kdf/KdfEngine.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/crypto/kdf/KdfFactory.kt b/database/src/main/java/com/kunzisoft/keepass/database/crypto/kdf/KdfFactory.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/crypto/kdf/KdfFactory.kt rename to database/src/main/java/com/kunzisoft/keepass/database/crypto/kdf/KdfFactory.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/crypto/kdf/KdfParameters.kt b/database/src/main/java/com/kunzisoft/keepass/database/crypto/kdf/KdfParameters.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/crypto/kdf/KdfParameters.kt rename to database/src/main/java/com/kunzisoft/keepass/database/crypto/kdf/KdfParameters.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/Attachment.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/Attachment.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/element/Attachment.kt rename to database/src/main/java/com/kunzisoft/keepass/database/element/Attachment.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/CompositeKey.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/CompositeKey.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/element/CompositeKey.kt rename to database/src/main/java/com/kunzisoft/keepass/database/element/CompositeKey.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/CustomData.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/CustomData.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/element/CustomData.kt rename to database/src/main/java/com/kunzisoft/keepass/database/element/CustomData.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/CustomDataItem.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/CustomDataItem.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/element/CustomDataItem.kt rename to database/src/main/java/com/kunzisoft/keepass/database/element/CustomDataItem.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/Database.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/Database.kt similarity index 98% rename from app/src/main/java/com/kunzisoft/keepass/database/element/Database.kt rename to database/src/main/java/com/kunzisoft/keepass/database/element/Database.kt index f38f7df92..788313e68 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/element/Database.kt +++ b/database/src/main/java/com/kunzisoft/keepass/database/element/Database.kt @@ -56,13 +56,14 @@ import com.kunzisoft.keepass.database.search.SearchHelper import com.kunzisoft.keepass.database.search.SearchParameters import com.kunzisoft.keepass.hardware.HardwareKey import com.kunzisoft.keepass.icons.IconDrawableFactory +import com.kunzisoft.keepass.icons.InterfaceIconPackChooser import com.kunzisoft.keepass.tasks.ProgressTaskUpdater import com.kunzisoft.keepass.utils.* import java.io.* import java.util.* -class Database { +class Database(private val iconPackChooser: InterfaceIconPackChooser) { // To keep a reference for specific methods provided by version private var mDatabaseKDB: DatabaseKDB? = null @@ -76,8 +77,9 @@ class Database { var isReadOnly = false val iconDrawableFactory = IconDrawableFactory( - { binaryCache }, - { iconId -> iconsManager.getBinaryForCustomIcon(iconId) } + iconPackChooser = iconPackChooser, + retrieveBinaryCache = { binaryCache }, + retrieveCustomIconBinary = { iconId -> iconsManager.getBinaryForCustomIcon(iconId) } ) var loaded = false @@ -646,7 +648,7 @@ class Database { } // New database instance to get new changes - val databaseToMerge = Database() + val databaseToMerge = Database(iconPackChooser) databaseToMerge.fileUri = databaseToMergeUri ?: this.fileUri try { @@ -785,7 +787,7 @@ class Database { openDatabaseKDBX: (InputStream) -> Unit) { try { // Load Data, pass Uris as InputStreams - val databaseStream = UriUtil.getUriInputStream(contentResolver, databaseUri) + val databaseStream = UriUtilDatabase.getUriInputStream(contentResolver, databaseUri) ?: throw UnknownDatabaseLocationException() BufferedInputStream(databaseStream).use { databaseInputStream -> @@ -866,7 +868,7 @@ class Database { } } // Copy from the cache to the final stream - UriUtil.getUriOutputStream(contentResolver, saveUri)?.use { outputStream -> + UriUtilDatabase.getUriOutputStream(contentResolver, saveUri)?.use { outputStream -> cacheFile.inputStream().use { inputStream -> inputStream.readAllBytes { buffer -> outputStream.write(buffer) @@ -1005,7 +1007,7 @@ class Database { } fun clearAndClose(context: Context? = null) { - clearIndexesAndBinaries(context?.let { UriUtil.getBinaryDir(context) }) + clearIndexesAndBinaries(context?.let { com.kunzisoft.keepass.utils.UriUtilDatabase.getBinaryDir(context) }) this.mDatabaseKDB = null this.mDatabaseKDBX = null this.fileUri = null diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/DateInstant.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/DateInstant.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/element/DateInstant.kt rename to database/src/main/java/com/kunzisoft/keepass/database/element/DateInstant.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/DeletedObject.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/DeletedObject.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/element/DeletedObject.kt rename to database/src/main/java/com/kunzisoft/keepass/database/element/DeletedObject.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/Entry.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/Entry.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/element/Entry.kt rename to database/src/main/java/com/kunzisoft/keepass/database/element/Entry.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/Field.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/Field.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/element/Field.kt rename to database/src/main/java/com/kunzisoft/keepass/database/element/Field.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/Group.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/Group.kt similarity index 99% rename from app/src/main/java/com/kunzisoft/keepass/database/element/Group.kt rename to database/src/main/java/com/kunzisoft/keepass/database/element/Group.kt index 3f4e94155..4eb601d86 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/element/Group.kt +++ b/database/src/main/java/com/kunzisoft/keepass/database/element/Group.kt @@ -30,7 +30,7 @@ import com.kunzisoft.keepass.database.element.icon.IconImage import com.kunzisoft.keepass.database.element.node.* import com.kunzisoft.keepass.model.EntryInfo import com.kunzisoft.keepass.model.GroupInfo -import com.kunzisoft.keepass.settings.PreferencesUtil +import com.kunzisoft.keepass.settings.DatabasePreferencesUtil import java.util.* import kotlin.collections.ArrayList @@ -87,7 +87,7 @@ class Group : Node, GroupVersionedInterface { companion object { fun getDefaults(context: Context): Array { - return if (PreferencesUtil.showExpiredEntries(context)) { + return if (DatabasePreferencesUtil.showExpiredEntries(context)) { arrayOf(META_STREAM) } else { arrayOf(META_STREAM, EXPIRED) diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/MainCredential.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/MainCredential.kt similarity index 98% rename from app/src/main/java/com/kunzisoft/keepass/database/element/MainCredential.kt rename to database/src/main/java/com/kunzisoft/keepass/database/element/MainCredential.kt index 172c228ec..b1273a7ea 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/element/MainCredential.kt +++ b/database/src/main/java/com/kunzisoft/keepass/database/element/MainCredential.kt @@ -29,7 +29,7 @@ import com.kunzisoft.keepass.database.element.database.DatabaseKDBX import com.kunzisoft.keepass.hardware.HardwareKey import com.kunzisoft.keepass.utils.StringUtil.removeSpaceChars import com.kunzisoft.keepass.utils.StringUtil.toHexString -import com.kunzisoft.keepass.utils.UriUtil +import com.kunzisoft.keepass.utils.UriUtilDatabase import com.kunzisoft.keepass.utils.readEnum import com.kunzisoft.keepass.utils.writeEnum import org.apache.commons.codec.binary.Hex @@ -148,7 +148,7 @@ data class MainCredential(var password: String? = null, @Throws(Exception::class) private fun getKeyFileData(contentResolver: ContentResolver, keyFileUri: Uri): ByteArray? { - UriUtil.getUriInputStream(contentResolver, keyFileUri)?.use { keyFileInputStream -> + UriUtilDatabase.getUriInputStream(contentResolver, keyFileUri)?.use { keyFileInputStream -> return keyFileInputStream.readBytes() } return null diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/SortNodeEnum.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/SortNodeEnum.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/element/SortNodeEnum.kt rename to database/src/main/java/com/kunzisoft/keepass/database/element/SortNodeEnum.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/Tags.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/Tags.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/element/Tags.kt rename to database/src/main/java/com/kunzisoft/keepass/database/element/Tags.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/binary/AttachmentPool.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/binary/AttachmentPool.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/element/binary/AttachmentPool.kt rename to database/src/main/java/com/kunzisoft/keepass/database/element/binary/AttachmentPool.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/binary/BinaryByte.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/binary/BinaryByte.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/element/binary/BinaryByte.kt rename to database/src/main/java/com/kunzisoft/keepass/database/element/binary/BinaryByte.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/binary/BinaryCache.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/binary/BinaryCache.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/element/binary/BinaryCache.kt rename to database/src/main/java/com/kunzisoft/keepass/database/element/binary/BinaryCache.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/binary/BinaryData.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/binary/BinaryData.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/element/binary/BinaryData.kt rename to database/src/main/java/com/kunzisoft/keepass/database/element/binary/BinaryData.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/binary/BinaryFile.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/binary/BinaryFile.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/element/binary/BinaryFile.kt rename to database/src/main/java/com/kunzisoft/keepass/database/element/binary/BinaryFile.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/binary/BinaryPool.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/binary/BinaryPool.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/element/binary/BinaryPool.kt rename to database/src/main/java/com/kunzisoft/keepass/database/element/binary/BinaryPool.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/binary/CustomIconPool.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/binary/CustomIconPool.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/element/binary/CustomIconPool.kt rename to database/src/main/java/com/kunzisoft/keepass/database/element/binary/CustomIconPool.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/binary/LoadedKey.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/binary/LoadedKey.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/element/binary/LoadedKey.kt rename to database/src/main/java/com/kunzisoft/keepass/database/element/binary/LoadedKey.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/database/CompressionAlgorithm.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/database/CompressionAlgorithm.kt similarity index 98% rename from app/src/main/java/com/kunzisoft/keepass/database/element/database/CompressionAlgorithm.kt rename to database/src/main/java/com/kunzisoft/keepass/database/element/database/CompressionAlgorithm.kt index b3c193dbd..b362baded 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/element/database/CompressionAlgorithm.kt +++ b/database/src/main/java/com/kunzisoft/keepass/database/element/database/CompressionAlgorithm.kt @@ -22,7 +22,7 @@ package com.kunzisoft.keepass.database.element.database import android.content.res.Resources import android.os.Parcel import android.os.Parcelable -import com.kunzisoft.keepass.R +import com.kunzisoft.keepass.database.R import com.kunzisoft.keepass.utils.ObjectNameResource import com.kunzisoft.keepass.utils.readEnum import com.kunzisoft.keepass.utils.writeEnum diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/database/DatabaseKDB.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/database/DatabaseKDB.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/element/database/DatabaseKDB.kt rename to database/src/main/java/com/kunzisoft/keepass/database/element/database/DatabaseKDB.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/database/DatabaseKDBX.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/database/DatabaseKDBX.kt similarity index 90% rename from app/src/main/java/com/kunzisoft/keepass/database/element/database/DatabaseKDBX.kt rename to database/src/main/java/com/kunzisoft/keepass/database/element/database/DatabaseKDBX.kt index 5440faf64..906ef0956 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/element/database/DatabaseKDBX.kt +++ b/database/src/main/java/com/kunzisoft/keepass/database/element/database/DatabaseKDBX.kt @@ -24,7 +24,7 @@ import android.content.res.Resources import android.util.Base64 import android.util.Log import com.kunzisoft.encrypt.HashManager -import com.kunzisoft.keepass.R +import com.kunzisoft.keepass.database.R import com.kunzisoft.keepass.database.action.node.NodeHandler import com.kunzisoft.keepass.database.crypto.EncryptionAlgorithm import com.kunzisoft.keepass.database.crypto.VariantDictionary @@ -32,7 +32,12 @@ import com.kunzisoft.keepass.database.crypto.kdf.AesKdf import com.kunzisoft.keepass.database.crypto.kdf.KdfEngine import com.kunzisoft.keepass.database.crypto.kdf.KdfFactory import com.kunzisoft.keepass.database.crypto.kdf.KdfParameters -import com.kunzisoft.keepass.database.element.* +import com.kunzisoft.keepass.database.element.CompositeKey +import com.kunzisoft.keepass.database.element.CustomData +import com.kunzisoft.keepass.database.element.DateInstant +import com.kunzisoft.keepass.database.element.DeletedObject +import com.kunzisoft.keepass.database.element.MainCredential +import com.kunzisoft.keepass.database.element.Tags import com.kunzisoft.keepass.database.element.binary.BinaryData import com.kunzisoft.keepass.database.element.database.DatabaseKDB.Companion.BACKUP_FOLDER_TITLE import com.kunzisoft.keepass.database.element.entry.EntryKDBX @@ -58,7 +63,8 @@ import java.io.IOException import java.nio.charset.Charset import java.security.MessageDigest import java.security.NoSuchAlgorithmException -import java.util.* +import java.util.Arrays +import java.util.UUID import javax.crypto.Mac import kotlin.math.min @@ -141,6 +147,7 @@ class DatabaseKDBX : DatabaseVersioned { var maintenanceHistoryDays = UnsignedInt(365) var color = "" + /** * Determine if RecycleBin is enable or not * @return true if RecycleBin enable, false if is not available or not enable @@ -168,9 +175,11 @@ class DatabaseKDBX : DatabaseVersioned { /** * Create a new database with a root group */ - constructor(databaseName: String, - rootName: String, - templatesGroupName: String? = null) { + constructor( + databaseName: String, + rootName: String, + templatesGroupName: String? = null, + ) { name = databaseName kdbxVersion = FILE_VERSION_31 val group = createGroup().apply { @@ -187,7 +196,7 @@ class DatabaseKDBX : DatabaseVersioned { override val version: String get() { - val kdbxStringVersion = when(kdbxVersion) { + val kdbxStringVersion = when (kdbxVersion) { FILE_VERSION_31 -> "3.1" FILE_VERSION_40 -> "4.0" FILE_VERSION_41 -> "4.1" @@ -199,7 +208,7 @@ class DatabaseKDBX : DatabaseVersioned { override val defaultFileExtension: String get() = ".kdbx" - private open class NodeOperationHandler : NodeHandler() { + private open class NodeOperationHandler : NodeHandler() { var containsCustomData = false override fun operate(node: T): Boolean { if (node.customData.isNotEmpty()) { @@ -209,7 +218,7 @@ class DatabaseKDBX : DatabaseVersioned { } } - private inner class EntryOperationHandler: NodeOperationHandler() { + private inner class EntryOperationHandler : NodeOperationHandler() { var passwordQualityEstimationDisabled = false override fun operate(node: EntryKDBX): Boolean { if (!node.qualityCheck) { @@ -219,7 +228,7 @@ class DatabaseKDBX : DatabaseVersioned { } } - private inner class GroupOperationHandler: NodeOperationHandler() { + private inner class GroupOperationHandler : NodeOperationHandler() { var containsTags = false override fun operate(node: GroupKDBX): Boolean { if (node.tags.isNotEmpty()) @@ -231,7 +240,7 @@ class DatabaseKDBX : DatabaseVersioned { fun deriveMasterKey( contentResolver: ContentResolver, mainCredential: MainCredential, - challengeResponseRetriever: (HardwareKey, ByteArray?) -> ByteArray + challengeResponseRetriever: (HardwareKey, ByteArray?) -> ByteArray, ) { // Retrieve each plain credential val password = mainCredential.password @@ -263,7 +272,7 @@ class DatabaseKDBX : DatabaseVersioned { @Throws(DatabaseOutputException::class) fun deriveCompositeKey( - challengeResponseRetriever: (HardwareKey, ByteArray?) -> ByteArray + challengeResponseRetriever: (HardwareKey, ByteArray?) -> ByteArray, ) { val passwordBytes = mCompositeKey.passwordData val keyFileBytes = mCompositeKey.keyFileData @@ -286,9 +295,11 @@ class DatabaseKDBX : DatabaseVersioned { } } - private fun composedKeyToMasterKey(passwordData: ByteArray?, - keyFileData: ByteArray?, - hardwareKeyData: ByteArray? = null): ByteArray { + private fun composedKeyToMasterKey( + passwordData: ByteArray?, + keyFileData: ByteArray?, + hardwareKeyData: ByteArray? = null, + ): ByteArray { return HashManager.hashSha256( passwordData, keyFileData, @@ -308,26 +319,33 @@ class DatabaseKDBX : DatabaseVersioned { // https://keepass.info/help/kb/kdbx_4.1.html val containsGroupWithTag = groupHandler.containsTags - val containsEntryWithPasswordQualityEstimationDisabled = entryHandler.passwordQualityEstimationDisabled - val containsCustomIconWithNameOrLastModificationTime = iconsManager.containsCustomIconWithNameOrLastModificationTime() - val containsHeaderCustomDataWithLastModificationTime = customData.containsItemWithLastModificationTime() + val containsEntryWithPasswordQualityEstimationDisabled = + entryHandler.passwordQualityEstimationDisabled + val containsCustomIconWithNameOrLastModificationTime = + iconsManager.containsCustomIconWithNameOrLastModificationTime() + val containsHeaderCustomDataWithLastModificationTime = + customData.containsItemWithLastModificationTime() // https://keepass.info/help/kb/kdbx_4.html // If AES is not use, it's at least 4.0 val keyDerivationFunction = kdfEngine - val kdfIsNotAes = keyDerivationFunction != null && keyDerivationFunction.uuid != AesKdf.CIPHER_UUID + val kdfIsNotAes = + keyDerivationFunction != null && keyDerivationFunction.uuid != AesKdf.CIPHER_UUID val containsHeaderCustomData = customData.isNotEmpty() - val containsNodeCustomData = entryHandler.containsCustomData || groupHandler.containsCustomData + val containsNodeCustomData = + entryHandler.containsCustomData || groupHandler.containsCustomData // Check each condition to determine version return if (containsGroupWithTag || containsEntryWithPasswordQualityEstimationDisabled || containsCustomIconWithNameOrLastModificationTime - || containsHeaderCustomDataWithLastModificationTime) { + || containsHeaderCustomDataWithLastModificationTime + ) { FILE_VERSION_41 } else if (kdfIsNotAes || containsHeaderCustomData - || containsNodeCustomData) { + || containsNodeCustomData + ) { FILE_VERSION_40 } else { FILE_VERSION_31 @@ -339,8 +357,10 @@ class DatabaseKDBX : DatabaseVersioned { CompressionAlgorithm.GZip ) - fun changeBinaryCompression(oldCompression: CompressionAlgorithm, - newCompression: CompressionAlgorithm) { + fun changeBinaryCompression( + oldCompression: CompressionAlgorithm, + newCompression: CompressionAlgorithm, + ) { when (oldCompression) { CompressionAlgorithm.None -> { when (newCompression) { @@ -455,17 +475,21 @@ class DatabaseKDBX : DatabaseVersioned { return this.iconsManager.getIcon(iconId) } - fun buildNewCustomIcon(customIconId: UUID? = null, - result: (IconImageCustom, BinaryData?) -> Unit) { + fun buildNewCustomIcon( + customIconId: UUID? = null, + result: (IconImageCustom, BinaryData?) -> Unit, + ) { // Create a binary file for a brand new custom icon addCustomIcon(customIconId, "", null, false, result) } - fun addCustomIcon(customIconId: UUID? = null, - name: String, - lastModificationTime: DateInstant?, - smallSize: Boolean, - result: (IconImageCustom, BinaryData?) -> Unit) { + fun addCustomIcon( + customIconId: UUID? = null, + name: String, + lastModificationTime: DateInstant?, + smallSize: Boolean, + result: (IconImageCustom, BinaryData?) -> Unit, + ) { iconsManager.addCustomIcon(customIconId, name, lastModificationTime, { uniqueBinaryId -> // Create a byte array for better performance with small data binaryCache.getBinaryData(uniqueBinaryId, smallSize) @@ -525,7 +549,10 @@ class DatabaseKDBX : DatabaseVersioned { return mTemplateEngine.getTemplate(entry) } - fun decodeEntryWithTemplateConfiguration(entryKDBX: EntryKDBX, entryIsTemplate: Boolean): EntryKDBX { + fun decodeEntryWithTemplateConfiguration( + entryKDBX: EntryKDBX, + entryIsTemplate: Boolean, + ): EntryKDBX { return if (entryIsTemplate) { mTemplateEngine.decodeTemplateEntry(entryKDBX) } else { @@ -533,7 +560,11 @@ class DatabaseKDBX : DatabaseVersioned { } } - fun encodeEntryWithTemplateConfiguration(entryKDBX: EntryKDBX, entryIsTemplate: Boolean, template: Template): EntryKDBX { + fun encodeEntryWithTemplateConfiguration( + entryKDBX: EntryKDBX, + entryIsTemplate: Boolean, + template: Template, + ): EntryKDBX { return if (entryIsTemplate) { mTemplateEngine.encodeTemplateEntry(entryKDBX) } else { @@ -603,7 +634,8 @@ class DatabaseKDBX : DatabaseVersioned { val kdfEngine = getKdfEngineFromParameters(keyDerivationFunctionParameters) ?: throw IOException("Unknown key derivation function") - var transformedMasterKey = kdfEngine.transform(masterKey, keyDerivationFunctionParameters) + var transformedMasterKey = + kdfEngine.transform(masterKey, keyDerivationFunctionParameters) if (transformedMasterKey.size != 32) { transformedMasterKey = HashManager.hashSha256(transformedMasterKey) } @@ -702,7 +734,8 @@ class DatabaseKDBX : DatabaseVersioned { var currentGroup: GroupKDBX? = group while (currentGroup != null) { if (currentGroup.parent == rootGroup - && currentGroup.title.equals(BACKUP_FOLDER_TITLE, ignoreCase = true)) { + && currentGroup.title.equals(BACKUP_FOLDER_TITLE, ignoreCase = true) + ) { return true } currentGroup = currentGroup.parent @@ -761,7 +794,8 @@ class DatabaseKDBX : DatabaseVersioned { if (recycleBin == null) return false if (node is GroupKDBX - && recycleBin!!.isContainedIn(node)) + && recycleBin!!.isContainedIn(node) + ) return false if (!node.isContainedIn(recycleBin!!)) return true @@ -798,10 +832,12 @@ class DatabaseKDBX : DatabaseVersioned { mFieldReferenceEngine.clear() } - fun buildNewBinaryAttachment(smallSize: Boolean, - compression: Boolean, - protection: Boolean, - binaryPoolId: Int? = null): BinaryData { + fun buildNewBinaryAttachment( + smallSize: Boolean, + compression: Boolean, + protection: Boolean, + binaryPoolId: Int? = null, + ): BinaryData { return attachmentPool.put(binaryPoolId) { uniqueBinaryId -> binaryCache.getBinaryData(uniqueBinaryId, smallSize, compression, protection) }.binary @@ -873,4 +909,4 @@ class DatabaseKDBX : DatabaseVersioned { const val BASE_64_FLAG = Base64.NO_WRAP } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/database/DatabaseVersioned.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/database/DatabaseVersioned.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/element/database/DatabaseVersioned.kt rename to database/src/main/java/com/kunzisoft/keepass/database/element/database/DatabaseVersioned.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/entry/AutoType.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/entry/AutoType.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/element/entry/AutoType.kt rename to database/src/main/java/com/kunzisoft/keepass/database/element/entry/AutoType.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/entry/EntryKDB.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/entry/EntryKDB.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/element/entry/EntryKDB.kt rename to database/src/main/java/com/kunzisoft/keepass/database/element/entry/EntryKDB.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/entry/EntryKDBX.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/entry/EntryKDBX.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/element/entry/EntryKDBX.kt rename to database/src/main/java/com/kunzisoft/keepass/database/element/entry/EntryKDBX.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/entry/EntryVersioned.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/entry/EntryVersioned.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/element/entry/EntryVersioned.kt rename to database/src/main/java/com/kunzisoft/keepass/database/element/entry/EntryVersioned.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/entry/EntryVersionedInterface.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/entry/EntryVersionedInterface.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/element/entry/EntryVersionedInterface.kt rename to database/src/main/java/com/kunzisoft/keepass/database/element/entry/EntryVersionedInterface.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/entry/FieldReferencesEngine.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/entry/FieldReferencesEngine.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/element/entry/FieldReferencesEngine.kt rename to database/src/main/java/com/kunzisoft/keepass/database/element/entry/FieldReferencesEngine.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/group/GroupKDB.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/group/GroupKDB.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/element/group/GroupKDB.kt rename to database/src/main/java/com/kunzisoft/keepass/database/element/group/GroupKDB.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/group/GroupKDBX.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/group/GroupKDBX.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/element/group/GroupKDBX.kt rename to database/src/main/java/com/kunzisoft/keepass/database/element/group/GroupKDBX.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/group/GroupVersioned.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/group/GroupVersioned.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/element/group/GroupVersioned.kt rename to database/src/main/java/com/kunzisoft/keepass/database/element/group/GroupVersioned.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/group/GroupVersionedInterface.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/group/GroupVersionedInterface.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/element/group/GroupVersionedInterface.kt rename to database/src/main/java/com/kunzisoft/keepass/database/element/group/GroupVersionedInterface.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/icon/IconImage.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/icon/IconImage.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/element/icon/IconImage.kt rename to database/src/main/java/com/kunzisoft/keepass/database/element/icon/IconImage.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/icon/IconImageCustom.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/icon/IconImageCustom.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/element/icon/IconImageCustom.kt rename to database/src/main/java/com/kunzisoft/keepass/database/element/icon/IconImageCustom.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/icon/IconImageDraw.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/icon/IconImageDraw.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/element/icon/IconImageDraw.kt rename to database/src/main/java/com/kunzisoft/keepass/database/element/icon/IconImageDraw.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/icon/IconImageStandard.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/icon/IconImageStandard.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/element/icon/IconImageStandard.kt rename to database/src/main/java/com/kunzisoft/keepass/database/element/icon/IconImageStandard.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/icon/IconsManager.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/icon/IconsManager.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/element/icon/IconsManager.kt rename to database/src/main/java/com/kunzisoft/keepass/database/element/icon/IconsManager.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/node/Node.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/node/Node.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/element/node/Node.kt rename to database/src/main/java/com/kunzisoft/keepass/database/element/node/Node.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/node/NodeId.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/node/NodeId.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/element/node/NodeId.kt rename to database/src/main/java/com/kunzisoft/keepass/database/element/node/NodeId.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/node/NodeIdInt.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/node/NodeIdInt.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/element/node/NodeIdInt.kt rename to database/src/main/java/com/kunzisoft/keepass/database/element/node/NodeIdInt.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/node/NodeIdUUID.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/node/NodeIdUUID.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/element/node/NodeIdUUID.kt rename to database/src/main/java/com/kunzisoft/keepass/database/element/node/NodeIdUUID.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/node/NodeKDBInterface.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/node/NodeKDBInterface.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/element/node/NodeKDBInterface.kt rename to database/src/main/java/com/kunzisoft/keepass/database/element/node/NodeKDBInterface.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/node/NodeKDBXInterface.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/node/NodeKDBXInterface.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/element/node/NodeKDBXInterface.kt rename to database/src/main/java/com/kunzisoft/keepass/database/element/node/NodeKDBXInterface.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/node/NodeTimeInterface.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/node/NodeTimeInterface.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/element/node/NodeTimeInterface.kt rename to database/src/main/java/com/kunzisoft/keepass/database/element/node/NodeTimeInterface.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/node/NodeVersioned.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/node/NodeVersioned.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/element/node/NodeVersioned.kt rename to database/src/main/java/com/kunzisoft/keepass/database/element/node/NodeVersioned.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/node/NodeVersionedInterface.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/node/NodeVersionedInterface.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/element/node/NodeVersionedInterface.kt rename to database/src/main/java/com/kunzisoft/keepass/database/element/node/NodeVersionedInterface.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/security/MemoryProtectionConfig.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/security/MemoryProtectionConfig.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/element/security/MemoryProtectionConfig.kt rename to database/src/main/java/com/kunzisoft/keepass/database/element/security/MemoryProtectionConfig.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/security/ProtectedString.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/security/ProtectedString.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/element/security/ProtectedString.kt rename to database/src/main/java/com/kunzisoft/keepass/database/element/security/ProtectedString.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/template/Template.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/template/Template.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/element/template/Template.kt rename to database/src/main/java/com/kunzisoft/keepass/database/element/template/Template.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/template/TemplateAttribute.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/template/TemplateAttribute.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/element/template/TemplateAttribute.kt rename to database/src/main/java/com/kunzisoft/keepass/database/element/template/TemplateAttribute.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/template/TemplateAttributeAction.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/template/TemplateAttributeAction.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/element/template/TemplateAttributeAction.kt rename to database/src/main/java/com/kunzisoft/keepass/database/element/template/TemplateAttributeAction.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/template/TemplateAttributeOption.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/template/TemplateAttributeOption.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/element/template/TemplateAttributeOption.kt rename to database/src/main/java/com/kunzisoft/keepass/database/element/template/TemplateAttributeOption.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/template/TemplateAttributeType.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/template/TemplateAttributeType.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/element/template/TemplateAttributeType.kt rename to database/src/main/java/com/kunzisoft/keepass/database/element/template/TemplateAttributeType.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/template/TemplateBuilder.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/template/TemplateBuilder.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/element/template/TemplateBuilder.kt rename to database/src/main/java/com/kunzisoft/keepass/database/element/template/TemplateBuilder.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/template/TemplateEngine.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/template/TemplateEngine.kt similarity index 99% rename from app/src/main/java/com/kunzisoft/keepass/database/element/template/TemplateEngine.kt rename to database/src/main/java/com/kunzisoft/keepass/database/element/template/TemplateEngine.kt index fdd2a74a6..47a6c628f 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/element/template/TemplateEngine.kt +++ b/database/src/main/java/com/kunzisoft/keepass/database/element/template/TemplateEngine.kt @@ -20,7 +20,7 @@ package com.kunzisoft.keepass.database.element.template import android.content.res.Resources import android.graphics.Color import android.util.Log -import com.kunzisoft.keepass.R +import com.kunzisoft.keepass.database.R import com.kunzisoft.keepass.database.element.Field import com.kunzisoft.keepass.database.element.database.DatabaseKDBX import com.kunzisoft.keepass.database.element.entry.EntryKDBX @@ -243,4 +243,4 @@ abstract class TemplateEngine(private val mDatabase: DatabaseKDBX) { .removeSuffix(SUFFIX_DECODED_TEMPLATE) } } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/template/TemplateEngineCompatible.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/template/TemplateEngineCompatible.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/element/template/TemplateEngineCompatible.kt rename to database/src/main/java/com/kunzisoft/keepass/database/element/template/TemplateEngineCompatible.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/template/TemplateField.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/template/TemplateField.kt similarity index 99% rename from app/src/main/java/com/kunzisoft/keepass/database/element/template/TemplateField.kt rename to database/src/main/java/com/kunzisoft/keepass/database/element/template/TemplateField.kt index d9044c51d..99208ffb0 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/element/template/TemplateField.kt +++ b/database/src/main/java/com/kunzisoft/keepass/database/element/template/TemplateField.kt @@ -19,7 +19,7 @@ package com.kunzisoft.keepass.database.element.template import android.content.Context -import com.kunzisoft.keepass.R +import com.kunzisoft.keepass.database.R object TemplateField { @@ -122,4 +122,4 @@ object TemplateField { else -> name } } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/template/TemplateSection.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/template/TemplateSection.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/element/template/TemplateSection.kt rename to database/src/main/java/com/kunzisoft/keepass/database/element/template/TemplateSection.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/exception/DatabaseException.kt b/database/src/main/java/com/kunzisoft/keepass/database/exception/DatabaseException.kt similarity index 99% rename from app/src/main/java/com/kunzisoft/keepass/database/exception/DatabaseException.kt rename to database/src/main/java/com/kunzisoft/keepass/database/exception/DatabaseException.kt index 6cfd2eaaa..6f14f690a 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/exception/DatabaseException.kt +++ b/database/src/main/java/com/kunzisoft/keepass/database/exception/DatabaseException.kt @@ -21,7 +21,7 @@ package com.kunzisoft.keepass.database.exception import android.content.res.Resources import androidx.annotation.StringRes -import com.kunzisoft.keepass.R +import com.kunzisoft.keepass.database.R import com.kunzisoft.keepass.database.element.node.NodeId import com.kunzisoft.keepass.database.element.node.Type import java.io.PrintStream @@ -196,4 +196,4 @@ open class DatabaseOutputException : DatabaseException { constructor(string: String) : super(string) constructor(string: String, e: Exception) : super(string, e) constructor(e: Exception) : super(e) -} \ No newline at end of file +} diff --git a/app/src/main/java/com/kunzisoft/keepass/database/file/DatabaseHeader.kt b/database/src/main/java/com/kunzisoft/keepass/database/file/DatabaseHeader.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/file/DatabaseHeader.kt rename to database/src/main/java/com/kunzisoft/keepass/database/file/DatabaseHeader.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/file/DatabaseHeaderKDB.kt b/database/src/main/java/com/kunzisoft/keepass/database/file/DatabaseHeaderKDB.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/file/DatabaseHeaderKDB.kt rename to database/src/main/java/com/kunzisoft/keepass/database/file/DatabaseHeaderKDB.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/file/DatabaseHeaderKDBX.kt b/database/src/main/java/com/kunzisoft/keepass/database/file/DatabaseHeaderKDBX.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/file/DatabaseHeaderKDBX.kt rename to database/src/main/java/com/kunzisoft/keepass/database/file/DatabaseHeaderKDBX.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/file/DatabaseKDBXXML.kt b/database/src/main/java/com/kunzisoft/keepass/database/file/DatabaseKDBXXML.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/file/DatabaseKDBXXML.kt rename to database/src/main/java/com/kunzisoft/keepass/database/file/DatabaseKDBXXML.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/file/DateKDBXUtil.kt b/database/src/main/java/com/kunzisoft/keepass/database/file/DateKDBXUtil.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/file/DateKDBXUtil.kt rename to database/src/main/java/com/kunzisoft/keepass/database/file/DateKDBXUtil.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/file/input/DatabaseInput.kt b/database/src/main/java/com/kunzisoft/keepass/database/file/input/DatabaseInput.kt similarity index 98% rename from app/src/main/java/com/kunzisoft/keepass/database/file/input/DatabaseInput.kt rename to database/src/main/java/com/kunzisoft/keepass/database/file/input/DatabaseInput.kt index f8d4f551d..d46fe6cea 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/file/input/DatabaseInput.kt +++ b/database/src/main/java/com/kunzisoft/keepass/database/file/input/DatabaseInput.kt @@ -20,7 +20,7 @@ package com.kunzisoft.keepass.database.file.input import android.util.Log -import com.kunzisoft.keepass.R +import com.kunzisoft.keepass.database.R import com.kunzisoft.keepass.database.element.database.DatabaseVersioned import com.kunzisoft.keepass.database.exception.DatabaseInputException import com.kunzisoft.keepass.tasks.ProgressTaskUpdater diff --git a/app/src/main/java/com/kunzisoft/keepass/database/file/input/DatabaseInputKDB.kt b/database/src/main/java/com/kunzisoft/keepass/database/file/input/DatabaseInputKDB.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/file/input/DatabaseInputKDB.kt rename to database/src/main/java/com/kunzisoft/keepass/database/file/input/DatabaseInputKDB.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/file/input/DatabaseInputKDBX.kt b/database/src/main/java/com/kunzisoft/keepass/database/file/input/DatabaseInputKDBX.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/file/input/DatabaseInputKDBX.kt rename to database/src/main/java/com/kunzisoft/keepass/database/file/input/DatabaseInputKDBX.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/file/output/DatabaseHeaderOutputKDB.kt b/database/src/main/java/com/kunzisoft/keepass/database/file/output/DatabaseHeaderOutputKDB.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/file/output/DatabaseHeaderOutputKDB.kt rename to database/src/main/java/com/kunzisoft/keepass/database/file/output/DatabaseHeaderOutputKDB.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/file/output/DatabaseHeaderOutputKDBX.kt b/database/src/main/java/com/kunzisoft/keepass/database/file/output/DatabaseHeaderOutputKDBX.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/file/output/DatabaseHeaderOutputKDBX.kt rename to database/src/main/java/com/kunzisoft/keepass/database/file/output/DatabaseHeaderOutputKDBX.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/file/output/DatabaseOutput.kt b/database/src/main/java/com/kunzisoft/keepass/database/file/output/DatabaseOutput.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/file/output/DatabaseOutput.kt rename to database/src/main/java/com/kunzisoft/keepass/database/file/output/DatabaseOutput.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/file/output/DatabaseOutputKDB.kt b/database/src/main/java/com/kunzisoft/keepass/database/file/output/DatabaseOutputKDB.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/file/output/DatabaseOutputKDB.kt rename to database/src/main/java/com/kunzisoft/keepass/database/file/output/DatabaseOutputKDB.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/file/output/DatabaseOutputKDBX.kt b/database/src/main/java/com/kunzisoft/keepass/database/file/output/DatabaseOutputKDBX.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/file/output/DatabaseOutputKDBX.kt rename to database/src/main/java/com/kunzisoft/keepass/database/file/output/DatabaseOutputKDBX.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/file/output/EntryOutputKDB.kt b/database/src/main/java/com/kunzisoft/keepass/database/file/output/EntryOutputKDB.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/file/output/EntryOutputKDB.kt rename to database/src/main/java/com/kunzisoft/keepass/database/file/output/EntryOutputKDB.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/file/output/GroupOutputKDB.kt b/database/src/main/java/com/kunzisoft/keepass/database/file/output/GroupOutputKDB.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/file/output/GroupOutputKDB.kt rename to database/src/main/java/com/kunzisoft/keepass/database/file/output/GroupOutputKDB.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/merge/DatabaseKDBXMerger.kt b/database/src/main/java/com/kunzisoft/keepass/database/merge/DatabaseKDBXMerger.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/merge/DatabaseKDBXMerger.kt rename to database/src/main/java/com/kunzisoft/keepass/database/merge/DatabaseKDBXMerger.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/database/search/SearchHelper.kt b/database/src/main/java/com/kunzisoft/keepass/database/search/SearchHelper.kt similarity index 99% rename from app/src/main/java/com/kunzisoft/keepass/database/search/SearchHelper.kt rename to database/src/main/java/com/kunzisoft/keepass/database/search/SearchHelper.kt index a8ef1ce7a..b56e5b401 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/search/SearchHelper.kt +++ b/database/src/main/java/com/kunzisoft/keepass/database/search/SearchHelper.kt @@ -28,7 +28,6 @@ import com.kunzisoft.keepass.database.element.node.NodeId import com.kunzisoft.keepass.model.EntryInfo import com.kunzisoft.keepass.model.SearchInfo import com.kunzisoft.keepass.otp.OtpEntryFields.OTP_FIELD -import com.kunzisoft.keepass.settings.PreferencesUtil import com.kunzisoft.keepass.timeout.TimeoutHelper import com.kunzisoft.keepass.utils.UuidUtil diff --git a/app/src/main/java/com/kunzisoft/keepass/database/search/SearchParameters.kt b/database/src/main/java/com/kunzisoft/keepass/database/search/SearchParameters.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/database/search/SearchParameters.kt rename to database/src/main/java/com/kunzisoft/keepass/database/search/SearchParameters.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/hardware/HardwareKey.kt b/database/src/main/java/com/kunzisoft/keepass/hardware/HardwareKey.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/hardware/HardwareKey.kt rename to database/src/main/java/com/kunzisoft/keepass/hardware/HardwareKey.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/icons/IconDrawableFactory.kt b/database/src/main/java/com/kunzisoft/keepass/icons/IconDrawableFactory.kt similarity index 83% rename from app/src/main/java/com/kunzisoft/keepass/icons/IconDrawableFactory.kt rename to database/src/main/java/com/kunzisoft/keepass/icons/IconDrawableFactory.kt index 48b7dde1b..3625cbe52 100644 --- a/app/src/main/java/com/kunzisoft/keepass/icons/IconDrawableFactory.kt +++ b/database/src/main/java/com/kunzisoft/keepass/icons/IconDrawableFactory.kt @@ -32,25 +32,26 @@ import android.widget.RemoteViews import androidx.core.content.res.ResourcesCompat import androidx.core.graphics.drawable.toBitmap import androidx.core.widget.ImageViewCompat -import com.kunzisoft.keepass.R -import com.kunzisoft.keepass.database.element.Database +import com.kunzisoft.keepass.database.R import com.kunzisoft.keepass.database.element.binary.BinaryCache import com.kunzisoft.keepass.database.element.binary.BinaryData import com.kunzisoft.keepass.database.element.icon.IconImageCustom import com.kunzisoft.keepass.database.element.icon.IconImageDraw +import java.lang.ref.WeakReference +import java.util.* import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -import java.lang.ref.WeakReference -import java.util.* -import kotlin.collections.HashMap /** * Factory class who build database icons dynamically, can assign an icon of IconPack, or a custom icon to an ImageView with a tint */ -class IconDrawableFactory(private val retrieveBinaryCache : () -> BinaryCache?, - private val retrieveCustomIconBinary : (iconId: UUID) -> BinaryData?) { +class IconDrawableFactory( + private val iconPackChooser: InterfaceIconPackChooser, + private val retrieveBinaryCache: () -> BinaryCache?, + private val retrieveCustomIconBinary: (iconId: UUID) -> BinaryData?, +) { /** customIconMap * Cache for icon drawable. @@ -72,10 +73,12 @@ class IconDrawableFactory(private val retrieveBinaryCache : () -> BinaryCache?, /** * Get the [SuperDrawable] [iconDraw] (from cache, or build it and add it to the cache if not exists yet), then tint it with [tintColor] if needed */ - private fun getIconSuperDrawable(context: Context, - iconDraw: IconImageDraw, - width: Int, - tintColor: Int = Color.WHITE): SuperDrawable { + private fun getIconSuperDrawable( + context: Context, + iconDraw: IconImageDraw, + width: Int, + tintColor: Int = Color.WHITE, + ): SuperDrawable { val icon = iconDraw.getIconImageToDraw() val customIconBinary = retrieveCustomIconBinary(icon.custom.uuid) val binaryCache = retrieveBinaryCache() @@ -84,13 +87,14 @@ class IconDrawableFactory(private val retrieveBinaryCache : () -> BinaryCache?, return SuperDrawable(it) } } - val iconPack = IconPackChooser.getSelectedIconPack(context) + val iconPack = iconPackChooser.getSelectedIconPack(context) if (mCurrentIconPack != iconPack) { this.mCurrentIconPack = iconPack this.clearCache() } iconPack?.iconToResId(icon.standard.id)?.let { iconId -> - return SuperDrawable(getIconDrawable(context.resources, iconId, width, tintColor), iconPack.tintable()) + return SuperDrawable(getIconDrawable(context.resources, iconId, width, tintColor), + iconPack.tintable()) } ?: run { return SuperDrawable(PatternIcon(context.resources).blankDrawable) } @@ -99,7 +103,11 @@ class IconDrawableFactory(private val retrieveBinaryCache : () -> BinaryCache?, /** * Build a custom [Drawable] from custom [icon] */ - private fun getIconDrawable(resources: Resources, icon: IconImageCustom, iconCustomBinary: BinaryData?): Drawable? { + private fun getIconDrawable( + resources: Resources, + icon: IconImageCustom, + iconCustomBinary: BinaryData?, + ): Drawable? { val patternIcon = PatternIcon(resources) val binaryManager = retrieveBinaryCache() if (binaryManager != null) { @@ -107,7 +115,8 @@ class IconDrawableFactory(private val retrieveBinaryCache : () -> BinaryCache?, if (draw == null) { iconCustomBinary?.let { binaryFile -> try { - var bitmap: Bitmap? = BitmapFactory.decodeStream(binaryFile.getInputDataStream(binaryManager)) + var bitmap: Bitmap? = + BitmapFactory.decodeStream(binaryFile.getInputDataStream(binaryManager)) bitmap?.let { bitmapIcon -> bitmap = resize(bitmapIcon, patternIcon) val createdDraw = BitmapDrawable(resources, bitmap) @@ -130,7 +139,12 @@ class IconDrawableFactory(private val retrieveBinaryCache : () -> BinaryCache?, * Get the standard [Drawable] icon from [iconId] (cache or build it and add it to the cache if not exists yet) * , then tint it with [tintColor] if needed */ - private fun getIconDrawable(resources: Resources, iconId: Int, width: Int, tintColor: Int): Drawable { + private fun getIconDrawable( + resources: Resources, + iconId: Int, + width: Int, + tintColor: Int, + ): Drawable { val newCacheKey = CacheKey(iconId, width, true, tintColor) var draw: Drawable? = standardIconMap[newCacheKey]?.get() @@ -166,28 +180,34 @@ class IconDrawableFactory(private val retrieveBinaryCache : () -> BinaryCache?, return if (width == dimensionPattern.width && height == dimensionPattern.height) { bitmap - } else Bitmap.createScaledBitmap(bitmap, dimensionPattern.width, dimensionPattern.height, true) + } else Bitmap.createScaledBitmap(bitmap, + dimensionPattern.width, + dimensionPattern.height, + true) } /** * Assign a database [icon] to an ImageView and tint it with [tintColor] if needed */ - fun assignDatabaseIcon(imageView: ImageView, - icon: IconImageDraw, - tintColor: Int = Color.WHITE) { + fun assignDatabaseIcon( + imageView: ImageView, + icon: IconImageDraw, + tintColor: Int = Color.WHITE, + ) { try { val context = imageView.context CoroutineScope(Dispatchers.IO).launch { addToCustomCache(context.resources, icon) withContext(Dispatchers.Main) { val superDrawable = getIconSuperDrawable(context, - icon, - imageView.width, - tintColor) + icon, + imageView.width, + tintColor) imageView.setImageDrawable(superDrawable.drawable) if (superDrawable.tintable) { - ImageViewCompat.setImageTintList(imageView, ColorStateList.valueOf(tintColor)) + ImageViewCompat.setImageTintList(imageView, + ColorStateList.valueOf(tintColor)) } else { ImageViewCompat.setImageTintList(imageView, null) } @@ -201,14 +221,16 @@ class IconDrawableFactory(private val retrieveBinaryCache : () -> BinaryCache?, /** * Build a bitmap from a database [icon] */ - fun getBitmapFromIcon(context: Context, - icon: IconImageDraw, - tintColor: Int = Color.BLACK): Bitmap? { + fun getBitmapFromIcon( + context: Context, + icon: IconImageDraw, + tintColor: Int = Color.BLACK, + ): Bitmap? { try { val superDrawable = getIconSuperDrawable(context, - icon, - 24, - tintColor) + icon, + 24, + tintColor) val bitmap = superDrawable.drawable.toBitmap() // Tint bitmap if it's not a custom icon if (superDrawable.tintable && bitmap.isMutable) { @@ -230,8 +252,9 @@ class IconDrawableFactory(private val retrieveBinaryCache : () -> BinaryCache?, val icon = iconDraw.getIconImageToDraw() val customIconBinary = retrieveCustomIconBinary(icon.custom.uuid) if (customIconBinary != null - && customIconBinary.dataExists() - && !customIconMap.containsKey(icon.custom.uuid)) + && customIconBinary.dataExists() + && !customIconMap.containsKey(icon.custom.uuid) + ) getIconDrawable(resources, icon.custom, customIconBinary) } @@ -275,7 +298,12 @@ class IconDrawableFactory(private val retrieveBinaryCache : () -> BinaryCache?, /** * Key class to retrieve a Drawable in the cache if it's tinted or not */ - private inner class CacheKey(var resId: Int, var density: Int, var isTint: Boolean, var color: Int) { + private inner class CacheKey( + var resId: Int, + var density: Int, + var isTint: Boolean, + var color: Int, + ) { override fun equals(other: Any?): Boolean { if (this === other) return true diff --git a/app/src/main/java/com/kunzisoft/keepass/icons/IconPack.kt b/database/src/main/java/com/kunzisoft/keepass/icons/IconPack.kt similarity index 91% rename from app/src/main/java/com/kunzisoft/keepass/icons/IconPack.kt rename to database/src/main/java/com/kunzisoft/keepass/icons/IconPack.kt index 7dc5985bf..a4f9db318 100644 --- a/app/src/main/java/com/kunzisoft/keepass/icons/IconPack.kt +++ b/database/src/main/java/com/kunzisoft/keepass/icons/IconPack.kt @@ -21,8 +21,7 @@ package com.kunzisoft.keepass.icons import android.content.res.Resources import android.util.SparseIntArray -import com.kunzisoft.keepass.R -import java.text.DecimalFormat +import com.kunzisoft.keepass.database.R import java.util.* /** @@ -45,13 +44,14 @@ import java.util.* class IconPack(packageName: String, resources: Resources, resourceId: Int) { private val icons: SparseIntArray = SparseIntArray() + /** * Get the id of the IconPack * * @return String id of the pack */ - var id: String? = null - private set + val id: String? + /** * Get the name of the IconPack * @@ -69,12 +69,7 @@ class IconPack(packageName: String, resources: Resources, resourceId: Int) { init { - id = resources.getString(resourceId) - // If finish with a _ remove it - id?.let { idRes -> - if (idRes.lastIndexOf('_') == idRes.length - 1) - id = idRes.substring(0, idRes.length - 1) - } + id = resources.getString(resourceId).removeSuffix("_") // Build the list of icons var num = 0 diff --git a/database/src/main/java/com/kunzisoft/keepass/icons/InterfaceIconPackChooser.kt b/database/src/main/java/com/kunzisoft/keepass/icons/InterfaceIconPackChooser.kt new file mode 100644 index 000000000..af4d8a280 --- /dev/null +++ b/database/src/main/java/com/kunzisoft/keepass/icons/InterfaceIconPackChooser.kt @@ -0,0 +1,12 @@ +package com.kunzisoft.keepass.icons + +import android.content.Context + +interface InterfaceIconPackChooser { + fun build(context: Context) + fun addDefaultIconPack(context: Context) + fun addOrCatchNewIconPack(context: Context, iconPackString: String) + fun setSelectedIconPack(iconPackIdString: String?) + fun getSelectedIconPack(context: Context): IconPack? + fun getIconPackList(context: Context): List +} diff --git a/app/src/main/java/com/kunzisoft/keepass/model/CipherDecryptDatabase.kt b/database/src/main/java/com/kunzisoft/keepass/model/CipherDecryptDatabase.kt similarity index 65% rename from app/src/main/java/com/kunzisoft/keepass/model/CipherDecryptDatabase.kt rename to database/src/main/java/com/kunzisoft/keepass/model/CipherDecryptDatabase.kt index 0b3503468..c3bc15dc5 100644 --- a/app/src/main/java/com/kunzisoft/keepass/model/CipherDecryptDatabase.kt +++ b/database/src/main/java/com/kunzisoft/keepass/model/CipherDecryptDatabase.kt @@ -1,22 +1,3 @@ -/* - * Copyright 2022 Jeremy Jamet / Kunzisoft. - * - * This file is part of KeePassDX. - * - * KeePassDX is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * KeePassDX is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with KeePassDX. If not, see . - * - */ package com.kunzisoft.keepass.model import android.net.Uri @@ -28,12 +9,13 @@ import com.kunzisoft.keepass.utils.writeEnum class CipherDecryptDatabase(): Parcelable { var databaseUri: Uri? = null - var credentialStorage: CredentialStorage = CredentialStorage.DEFAULT + var credentialStorage: com.kunzisoft.keepass.model.CredentialStorage = + com.kunzisoft.keepass.model.CredentialStorage.Companion.DEFAULT var decryptedValue: ByteArray = byteArrayOf() constructor(parcel: Parcel): this() { databaseUri = parcel.readParcelable(Uri::class.java.classLoader) - credentialStorage = parcel.readEnum() ?: credentialStorage + credentialStorage = parcel.readEnum() ?: credentialStorage decryptedValue = ByteArray(parcel.readInt()) parcel.readByteArray(decryptedValue) } @@ -77,4 +59,4 @@ class CipherDecryptDatabase(): Parcelable { override fun hashCode(): Int { return databaseUri.hashCode() } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/kunzisoft/keepass/model/CipherEncryptDatabase.kt b/database/src/main/java/com/kunzisoft/keepass/model/CipherEncryptDatabase.kt similarity index 66% rename from app/src/main/java/com/kunzisoft/keepass/model/CipherEncryptDatabase.kt rename to database/src/main/java/com/kunzisoft/keepass/model/CipherEncryptDatabase.kt index 321facd97..99afc5aad 100644 --- a/app/src/main/java/com/kunzisoft/keepass/model/CipherEncryptDatabase.kt +++ b/database/src/main/java/com/kunzisoft/keepass/model/CipherEncryptDatabase.kt @@ -1,22 +1,3 @@ -/* - * Copyright 2022 Jeremy Jamet / Kunzisoft. - * - * This file is part of KeePassDX. - * - * KeePassDX is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * KeePassDX is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with KeePassDX. If not, see . - * - */ package com.kunzisoft.keepass.model import android.net.Uri @@ -28,13 +9,14 @@ import com.kunzisoft.keepass.utils.writeEnum class CipherEncryptDatabase(): Parcelable { var databaseUri: Uri? = null - var credentialStorage: CredentialStorage = CredentialStorage.DEFAULT + var credentialStorage: com.kunzisoft.keepass.model.CredentialStorage = + com.kunzisoft.keepass.model.CredentialStorage.Companion.DEFAULT var encryptedValue: ByteArray = byteArrayOf() var specParameters: ByteArray = byteArrayOf() constructor(parcel: Parcel): this() { databaseUri = parcel.readParcelable(Uri::class.java.classLoader) - credentialStorage = parcel.readEnum() ?: credentialStorage + credentialStorage = parcel.readEnum() ?: credentialStorage encryptedValue = ByteArray(parcel.readInt()) parcel.readByteArray(encryptedValue) specParameters = ByteArray(parcel.readInt()) @@ -78,4 +60,4 @@ class CipherEncryptDatabase(): Parcelable { override fun hashCode(): Int { return databaseUri.hashCode() } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/kunzisoft/keepass/model/CredentialStorage.kt b/database/src/main/java/com/kunzisoft/keepass/model/CredentialStorage.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/model/CredentialStorage.kt rename to database/src/main/java/com/kunzisoft/keepass/model/CredentialStorage.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/model/CreditCard.kt b/database/src/main/java/com/kunzisoft/keepass/model/CreditCard.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/model/CreditCard.kt rename to database/src/main/java/com/kunzisoft/keepass/model/CreditCard.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/model/DatabaseFile.kt b/database/src/main/java/com/kunzisoft/keepass/model/DatabaseFile.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/model/DatabaseFile.kt rename to database/src/main/java/com/kunzisoft/keepass/model/DatabaseFile.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/model/EntryAttachmentState.kt b/database/src/main/java/com/kunzisoft/keepass/model/EntryAttachmentState.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/model/EntryAttachmentState.kt rename to database/src/main/java/com/kunzisoft/keepass/model/EntryAttachmentState.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/model/EntryInfo.kt b/database/src/main/java/com/kunzisoft/keepass/model/EntryInfo.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/model/EntryInfo.kt rename to database/src/main/java/com/kunzisoft/keepass/model/EntryInfo.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/model/FocusedEditField.kt b/database/src/main/java/com/kunzisoft/keepass/model/FocusedEditField.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/model/FocusedEditField.kt rename to database/src/main/java/com/kunzisoft/keepass/model/FocusedEditField.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/model/GroupInfo.kt b/database/src/main/java/com/kunzisoft/keepass/model/GroupInfo.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/model/GroupInfo.kt rename to database/src/main/java/com/kunzisoft/keepass/model/GroupInfo.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/model/NodeInfo.kt b/database/src/main/java/com/kunzisoft/keepass/model/NodeInfo.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/model/NodeInfo.kt rename to database/src/main/java/com/kunzisoft/keepass/model/NodeInfo.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/model/OtpModel.kt b/database/src/main/java/com/kunzisoft/keepass/model/OtpModel.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/model/OtpModel.kt rename to database/src/main/java/com/kunzisoft/keepass/model/OtpModel.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/model/ProgressMessage.kt b/database/src/main/java/com/kunzisoft/keepass/model/ProgressMessage.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/model/ProgressMessage.kt rename to database/src/main/java/com/kunzisoft/keepass/model/ProgressMessage.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/model/RegisterInfo.kt b/database/src/main/java/com/kunzisoft/keepass/model/RegisterInfo.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/model/RegisterInfo.kt rename to database/src/main/java/com/kunzisoft/keepass/model/RegisterInfo.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/model/SearchInfo.kt b/database/src/main/java/com/kunzisoft/keepass/model/SearchInfo.kt similarity index 97% rename from app/src/main/java/com/kunzisoft/keepass/model/SearchInfo.kt rename to database/src/main/java/com/kunzisoft/keepass/model/SearchInfo.kt index fe8962216..195c2b004 100644 --- a/app/src/main/java/com/kunzisoft/keepass/model/SearchInfo.kt +++ b/database/src/main/java/com/kunzisoft/keepass/model/SearchInfo.kt @@ -6,7 +6,7 @@ import android.net.Uri import android.os.Parcel import android.os.Parcelable import com.kunzisoft.keepass.otp.OtpEntryFields -import com.kunzisoft.keepass.settings.PreferencesUtil +import com.kunzisoft.keepass.settings.DatabasePreferencesUtil import com.kunzisoft.keepass.utils.ObjectNameResource import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -141,7 +141,7 @@ class SearchInfo : ObjectNameResource, Parcelable { CoroutineScope(Dispatchers.Main).launch { if (webDomain != null) { // Warning, web domain can contains IP, don't crop in this case - if (PreferencesUtil.searchSubdomains(context) + if (DatabasePreferencesUtil.searchSubdomains(context) || Regex(WEB_IP_REGEX).matches(webDomain)) { concreteWebDomain.invoke(webDomain) } else { @@ -155,4 +155,4 @@ class SearchInfo : ObjectNameResource, Parcelable { } } } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/kunzisoft/keepass/model/StreamDirection.kt b/database/src/main/java/com/kunzisoft/keepass/model/StreamDirection.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/model/StreamDirection.kt rename to database/src/main/java/com/kunzisoft/keepass/model/StreamDirection.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/otp/OtpElement.kt b/database/src/main/java/com/kunzisoft/keepass/otp/OtpElement.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/otp/OtpElement.kt rename to database/src/main/java/com/kunzisoft/keepass/otp/OtpElement.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/otp/OtpEntryFields.kt b/database/src/main/java/com/kunzisoft/keepass/otp/OtpEntryFields.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/otp/OtpEntryFields.kt rename to database/src/main/java/com/kunzisoft/keepass/otp/OtpEntryFields.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/otp/TokenCalculator.java b/database/src/main/java/com/kunzisoft/keepass/otp/TokenCalculator.java similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/otp/TokenCalculator.java rename to database/src/main/java/com/kunzisoft/keepass/otp/TokenCalculator.java diff --git a/database/src/main/java/com/kunzisoft/keepass/settings/DatabasePreferencesUtil.kt b/database/src/main/java/com/kunzisoft/keepass/settings/DatabasePreferencesUtil.kt new file mode 100644 index 000000000..63db36053 --- /dev/null +++ b/database/src/main/java/com/kunzisoft/keepass/settings/DatabasePreferencesUtil.kt @@ -0,0 +1,67 @@ +package com.kunzisoft.keepass.settings + +import android.content.Context +import android.preference.PreferenceManager +import com.kunzisoft.keepass.database.R +import com.kunzisoft.keepass.timeout.TimeoutHelper + +object DatabasePreferencesUtil { + + const val HIDE_EXPIRED_ENTRIES_KEY = "hide_expired_entries_key" + private const val HIDE_EXPIRED_ENTRIES_DEFAULT = false + const val SETTING_ICON_PACK_CHOOSE_KEY = "setting_icon_pack_choose_key" + private const val SETTING_ICON_PACK_CHOOSE_DEFAULT = "material" + const val SUBDOMAIN_SEARCH_KEY = "subdomain_search_key" + private const val SUBDOMAIN_SEARCH_DEFAULT = false + const val TIMEOUT_BACKUP_KEY = "timeout_backup_key" + const val APP_TIMEOUT_KEY = "app_timeout_key" + const val TIMEOUT_DEFAULT = "300000" + + fun showExpiredEntries(context: Context): Boolean { + val prefs = PreferenceManager.getDefaultSharedPreferences(context) + return ! prefs.getBoolean(HIDE_EXPIRED_ENTRIES_KEY, HIDE_EXPIRED_ENTRIES_DEFAULT) + } + + fun getIconPackSelectedId(context: Context): String? { + val prefs = PreferenceManager.getDefaultSharedPreferences(context) + return prefs.getString( + SETTING_ICON_PACK_CHOOSE_KEY, + SETTING_ICON_PACK_CHOOSE_DEFAULT) + } + + fun searchSubdomains(context: Context): Boolean { + val prefs = PreferenceManager.getDefaultSharedPreferences(context) + return prefs.getBoolean(SUBDOMAIN_SEARCH_KEY, SUBDOMAIN_SEARCH_DEFAULT) + } + + /** + * Save current time, can be retrieve with `getTimeSaved()` + */ + fun saveCurrentTime(context: Context) { + PreferenceManager.getDefaultSharedPreferences(context).edit().apply { + putLong(TIMEOUT_BACKUP_KEY, System.currentTimeMillis()) + apply() + } + } + + /** + * Time previously saved in milliseconds (commonly used to compare with current time and check timeout) + */ + fun getTimeSaved(context: Context): Long { + val prefs = PreferenceManager.getDefaultSharedPreferences(context) + return prefs.getLong(TIMEOUT_BACKUP_KEY, + TimeoutHelper.NEVER) + } + + /** + * App timeout selected in milliseconds + */ + fun getAppTimeout(context: Context): Long { + return try { + val prefs = PreferenceManager.getDefaultSharedPreferences(context) + (prefs.getString(APP_TIMEOUT_KEY, TIMEOUT_DEFAULT) ?: TIMEOUT_DEFAULT).toLong() + } catch (e: NumberFormatException) { + TimeoutHelper.DEFAULT_TIMEOUT + } + } +} diff --git a/app/src/main/java/com/kunzisoft/keepass/stream/CopyInputStream.kt b/database/src/main/java/com/kunzisoft/keepass/stream/CopyInputStream.kt similarity index 66% rename from app/src/main/java/com/kunzisoft/keepass/stream/CopyInputStream.kt rename to database/src/main/java/com/kunzisoft/keepass/stream/CopyInputStream.kt index e4d4b6da3..da19a8e24 100644 --- a/app/src/main/java/com/kunzisoft/keepass/stream/CopyInputStream.kt +++ b/database/src/main/java/com/kunzisoft/keepass/stream/CopyInputStream.kt @@ -1,22 +1,3 @@ -/* - * Copyright 2017 Brian Pellin, Jeremy Jamet / Kunzisoft. - * - * This file is part of KeePassDX. - * - * KeePassDX is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * KeePassDX is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with KeePassDX. If not, see . - * - */ package com.kunzisoft.keepass.stream import java.io.IOException @@ -28,7 +9,8 @@ import java.io.OutputStream * output stream. */ class CopyInputStream(private val inputStream: InputStream, - private val outputStream: OutputStream) : InputStream() { + private val outputStream: OutputStream +) : InputStream() { @Throws(IOException::class) override fun available(): Int { diff --git a/app/src/main/java/com/kunzisoft/keepass/stream/HashedBlockInputStream.kt b/database/src/main/java/com/kunzisoft/keepass/stream/HashedBlockInputStream.kt similarity index 98% rename from app/src/main/java/com/kunzisoft/keepass/stream/HashedBlockInputStream.kt rename to database/src/main/java/com/kunzisoft/keepass/stream/HashedBlockInputStream.kt index 3ae329f96..70f2db7eb 100644 --- a/app/src/main/java/com/kunzisoft/keepass/stream/HashedBlockInputStream.kt +++ b/database/src/main/java/com/kunzisoft/keepass/stream/HashedBlockInputStream.kt @@ -24,8 +24,6 @@ import com.kunzisoft.keepass.utils.readBytes4ToUInt import com.kunzisoft.keepass.utils.readBytesLength import java.io.IOException import java.io.InputStream -import java.security.MessageDigest -import java.util.* class HashedBlockInputStream(private val baseStream: InputStream) : InputStream() { diff --git a/app/src/main/java/com/kunzisoft/keepass/stream/HashedBlockOutputStream.kt b/database/src/main/java/com/kunzisoft/keepass/stream/HashedBlockOutputStream.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/stream/HashedBlockOutputStream.kt rename to database/src/main/java/com/kunzisoft/keepass/stream/HashedBlockOutputStream.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/stream/HmacBlockInputStream.kt b/database/src/main/java/com/kunzisoft/keepass/stream/HmacBlockInputStream.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/stream/HmacBlockInputStream.kt rename to database/src/main/java/com/kunzisoft/keepass/stream/HmacBlockInputStream.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/stream/HmacBlockOutputStream.kt b/database/src/main/java/com/kunzisoft/keepass/stream/HmacBlockOutputStream.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/stream/HmacBlockOutputStream.kt rename to database/src/main/java/com/kunzisoft/keepass/stream/HmacBlockOutputStream.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/stream/MacOutputStream.kt b/database/src/main/java/com/kunzisoft/keepass/stream/MacOutputStream.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/stream/MacOutputStream.kt rename to database/src/main/java/com/kunzisoft/keepass/stream/MacOutputStream.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/tasks/ActionRunnable.kt b/database/src/main/java/com/kunzisoft/keepass/tasks/ActionRunnable.kt similarity index 70% rename from app/src/main/java/com/kunzisoft/keepass/tasks/ActionRunnable.kt rename to database/src/main/java/com/kunzisoft/keepass/tasks/ActionRunnable.kt index 07a7c476d..c701ba57d 100644 --- a/app/src/main/java/com/kunzisoft/keepass/tasks/ActionRunnable.kt +++ b/database/src/main/java/com/kunzisoft/keepass/tasks/ActionRunnable.kt @@ -1,22 +1,3 @@ -/* - * Copyright 2019 Jeremy Jamet / Kunzisoft. - * - * This file is part of KeePassDX. - * - * KeePassDX is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * KeePassDX is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with KeePassDX. If not, see . - * - */ package com.kunzisoft.keepass.tasks import android.os.Bundle diff --git a/app/src/main/java/com/kunzisoft/keepass/tasks/ProgressTaskUpdater.kt b/database/src/main/java/com/kunzisoft/keepass/tasks/ProgressTaskUpdater.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/tasks/ProgressTaskUpdater.kt rename to database/src/main/java/com/kunzisoft/keepass/tasks/ProgressTaskUpdater.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/timeout/TimeoutHelper.kt b/database/src/main/java/com/kunzisoft/keepass/timeout/TimeoutHelper.kt similarity index 85% rename from app/src/main/java/com/kunzisoft/keepass/timeout/TimeoutHelper.kt rename to database/src/main/java/com/kunzisoft/keepass/timeout/TimeoutHelper.kt index aee7c370c..e3f3d3357 100644 --- a/app/src/main/java/com/kunzisoft/keepass/timeout/TimeoutHelper.kt +++ b/database/src/main/java/com/kunzisoft/keepass/timeout/TimeoutHelper.kt @@ -1,22 +1,3 @@ -/* - * Copyright 2019 Jeremy Jamet / Kunzisoft. - * - * This file is part of KeePassDX. - * - * KeePassDX is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * KeePassDX is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with KeePassDX. If not, see . - * - */ package com.kunzisoft.keepass.timeout import android.app.AlarmManager @@ -25,7 +6,7 @@ import android.content.Context import android.content.Intent import android.os.Build import android.util.Log -import com.kunzisoft.keepass.settings.PreferencesUtil +import com.kunzisoft.keepass.settings.DatabasePreferencesUtil import com.kunzisoft.keepass.utils.LOCK_ACTION object TimeoutHelper { @@ -59,7 +40,7 @@ object TimeoutHelper { */ private fun startLockTimer(context: Context, databaseLoaded: Boolean) { if (databaseLoaded) { - val timeout = PreferencesUtil.getAppTimeout(context) + val timeout = DatabasePreferencesUtil.getAppTimeout(context) if (timeout != NEVER) { // No timeout don't start timeout service (context.applicationContext.getSystemService(Context.ALARM_SERVICE) as AlarmManager?)?.let { alarmManager -> @@ -111,7 +92,7 @@ object TimeoutHelper { || lastAppTimeoutRecord!! + 2000 <= System.currentTimeMillis()) { Log.d(TAG, "Record app timeout") // Record timeout time in case timeout service is killed - PreferencesUtil.saveCurrentTime(context) + DatabasePreferencesUtil.saveCurrentTime(context) startLockTimer(context, databaseLoaded) lastAppTimeoutRecord = System.currentTimeMillis() } @@ -131,14 +112,14 @@ object TimeoutHelper { val currentTime = System.currentTimeMillis() // Retrieve the timeout programmatically backup - val timeoutBackup = PreferencesUtil.getTimeSaved(context) + val timeoutBackup = DatabasePreferencesUtil.getTimeSaved(context) // The timeout never started if (timeoutBackup == NEVER) { return true } // Retrieve the app timeout in settings - val appTimeout = PreferencesUtil.getAppTimeout((context)) + val appTimeout = DatabasePreferencesUtil.getAppTimeout((context)) // We are set to never timeout if (appTimeout == NEVER) { return true @@ -189,4 +170,4 @@ object TimeoutHelper { fun releaseTemporarilyDisableTimeout() { temporarilyDisableLock = false } -} \ No newline at end of file +} diff --git a/database/src/main/java/com/kunzisoft/keepass/utils/LOCK_ACTION.kt b/database/src/main/java/com/kunzisoft/keepass/utils/LOCK_ACTION.kt new file mode 100644 index 000000000..cc2db1a85 --- /dev/null +++ b/database/src/main/java/com/kunzisoft/keepass/utils/LOCK_ACTION.kt @@ -0,0 +1,3 @@ +package com.kunzisoft.keepass.utils + +const val LOCK_ACTION = "com.kunzisoft.keepass.LOCK" diff --git a/app/src/main/java/com/kunzisoft/keepass/utils/ObjectNameResource.kt b/database/src/main/java/com/kunzisoft/keepass/utils/ObjectNameResource.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/utils/ObjectNameResource.kt rename to database/src/main/java/com/kunzisoft/keepass/utils/ObjectNameResource.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/utils/ParcelableUtil.kt b/database/src/main/java/com/kunzisoft/keepass/utils/ParcelableUtil.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/utils/ParcelableUtil.kt rename to database/src/main/java/com/kunzisoft/keepass/utils/ParcelableUtil.kt diff --git a/database/src/main/java/com/kunzisoft/keepass/utils/SingletonHolder.kt b/database/src/main/java/com/kunzisoft/keepass/utils/SingletonHolder.kt new file mode 100644 index 000000000..b1122b0d5 --- /dev/null +++ b/database/src/main/java/com/kunzisoft/keepass/utils/SingletonHolder.kt @@ -0,0 +1,38 @@ +/* + * Copyright 2019 Jeremy Jamet / Kunzisoft. + * + * This file is part of KeePassDX. + * + * KeePassDX is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * KeePassDX is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with KeePassDX. If not, see . + * + */ +package com.kunzisoft.keepass.utils + +import com.kunzisoft.keepass.icons.InterfaceIconPackChooser + +open class SingletonHolder(private val constructor: (iconPackChooser : InterfaceIconPackChooser) -> T) { + + @Volatile + private var instance: T? = null + + fun getInstance(iconPackChooser: InterfaceIconPackChooser): T { + return when { + instance != null -> instance!! + else -> synchronized(this) { + if (instance == null) instance = constructor(iconPackChooser) + instance!! + } + } + } +} diff --git a/app/src/main/java/com/kunzisoft/keepass/utils/StreamBytesUtils.kt b/database/src/main/java/com/kunzisoft/keepass/utils/StreamBytesUtils.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/utils/StreamBytesUtils.kt rename to database/src/main/java/com/kunzisoft/keepass/utils/StreamBytesUtils.kt index 223ef9fd6..55327bfab 100644 --- a/app/src/main/java/com/kunzisoft/keepass/utils/StreamBytesUtils.kt +++ b/database/src/main/java/com/kunzisoft/keepass/utils/StreamBytesUtils.kt @@ -193,20 +193,6 @@ fun bytes4ToUInt(buf: ByteArray): UnsignedInt { + (buf[3].toInt() and 0xFF shl 24)) } -fun bytes16ToUuid(buf: ByteArray): UUID { - var lsb: Long = 0 - for (i in 15 downTo 8) { - lsb = lsb shl 8 or (buf[i].toLong() and 0xff) - } - - var msb: Long = 0 - for (i in 7 downTo 0) { - msb = msb shl 8 or (buf[i].toLong() and 0xff) - } - - return UUID(msb, lsb) -} - /** * Unpack date from 5 byte format. The five bytes at 'offset' are unpacked * to a java.util.Date instance. @@ -265,14 +251,6 @@ fun uLongTo8Bytes(value: UnsignedLong): ByteArray { return longTo8Bytes(value.toKotlinLong()) } -fun longTo8Bytes(value: Long): ByteArray { - val buf = ByteArray(8) - for (i in 0 until 8) { - buf[i] = (value.ushr(8 * i) and 0xFF).toByte() - } - return buf -} - fun uuidTo16Bytes(uuid: UUID): ByteArray { val buf = ByteArray(16) for (i in 0 until 8) { @@ -351,3 +329,25 @@ fun writeStringToStream(outputStream: OutputStream, string: String?): Int { return length } + +fun bytes16ToUuid(buf: ByteArray): UUID { + var lsb: Long = 0 + for (i in 15 downTo 8) { + lsb = lsb shl 8 or (buf[i].toLong() and 0xff) + } + + var msb: Long = 0 + for (i in 7 downTo 0) { + msb = msb shl 8 or (buf[i].toLong() and 0xff) + } + + return UUID(msb, lsb) +} + +fun longTo8Bytes(value: Long): ByteArray { + val buf = ByteArray(8) + for (i in 0 until 8) { + buf[i] = (value.ushr(8 * i) and 0xFF).toByte() + } + return buf +} diff --git a/app/src/main/java/com/kunzisoft/keepass/utils/StringUtil.kt b/database/src/main/java/com/kunzisoft/keepass/utils/StringUtil.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/utils/StringUtil.kt rename to database/src/main/java/com/kunzisoft/keepass/utils/StringUtil.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/utils/UnsignedInt.kt b/database/src/main/java/com/kunzisoft/keepass/utils/UnsignedInt.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/utils/UnsignedInt.kt rename to database/src/main/java/com/kunzisoft/keepass/utils/UnsignedInt.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/utils/UnsignedLong.kt b/database/src/main/java/com/kunzisoft/keepass/utils/UnsignedLong.kt similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/utils/UnsignedLong.kt rename to database/src/main/java/com/kunzisoft/keepass/utils/UnsignedLong.kt diff --git a/database/src/main/java/com/kunzisoft/keepass/utils/UriUtilDatabase.kt b/database/src/main/java/com/kunzisoft/keepass/utils/UriUtilDatabase.kt new file mode 100644 index 000000000..afe117984 --- /dev/null +++ b/database/src/main/java/com/kunzisoft/keepass/utils/UriUtilDatabase.kt @@ -0,0 +1,106 @@ +/* + * Copyright 2019 Jeremy Jamet / Kunzisoft. + * + * This file is part of KeePassDX. + * + * KeePassDX is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * KeePassDX is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with KeePassDX. If not, see . + * + */ +package com.kunzisoft.keepass.utils + +import android.content.ContentResolver +import android.content.Context +import android.net.Uri +import android.os.Build +import android.util.Log +import java.io.File +import java.io.FileInputStream +import java.io.FileNotFoundException +import java.io.FileOutputStream +import java.io.InputStream +import java.io.OutputStream +import java.util.Locale + + +object UriUtilDatabase { + fun parse(stringUri: String?): Uri? { + return if (stringUri?.isNotEmpty() == true) { + Uri.parse(stringUri) + } else + null + } + + fun decode(uri: String?): String { + return Uri.decode(uri) ?: "" + } + + fun getBinaryDir(context: Context): File { + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + context.applicationContext.noBackupFilesDir + } else { + context.applicationContext.filesDir + } + } + + @Throws(FileNotFoundException::class) + fun getUriInputStream(contentResolver: ContentResolver, fileUri: Uri?): InputStream? { + if (fileUri == null) + return null + return when { + isFileScheme(fileUri) -> fileUri.path?.let { FileInputStream(it) } + isContentScheme(fileUri) -> contentResolver.openInputStream(fileUri) + else -> null + } + } + + @Throws(FileNotFoundException::class) + fun getUriOutputStream(contentResolver: ContentResolver, fileUri: Uri?): OutputStream? { + if (fileUri == null) + return null + return when { + isFileScheme(fileUri) -> fileUri.path?.let { FileOutputStream(it) } + isContentScheme(fileUri) -> { + try { + contentResolver.openOutputStream(fileUri, "wt") + } catch (e: FileNotFoundException) { + Log.e(TAG, "Unable to open stream in `wt` mode, retry in `rwt` mode.", e) + // https://issuetracker.google.com/issues/180526528 + // Try with rwt to fix content provider issue + val outStream = contentResolver.openOutputStream(fileUri, "rwt") + Log.w(TAG, "`rwt` mode used.") + outStream + } + } + else -> null + } + } + + private fun isFileScheme(fileUri: Uri): Boolean { + val scheme = fileUri.scheme + if (scheme == null || scheme.isEmpty() || scheme.lowercase(Locale.ENGLISH) == "file") { + return true + } + return false + } + + private fun isContentScheme(fileUri: Uri): Boolean { + val scheme = fileUri.scheme + if (scheme != null && scheme.lowercase(Locale.ENGLISH) == "content") { + return true + } + return false + } + + private const val TAG = "UriUtilDatabase" +} diff --git a/app/src/main/java/com/kunzisoft/keepass/utils/UuidUtil.java b/database/src/main/java/com/kunzisoft/keepass/utils/UuidUtil.java similarity index 100% rename from app/src/main/java/com/kunzisoft/keepass/utils/UuidUtil.java rename to database/src/main/java/com/kunzisoft/keepass/utils/UuidUtil.java diff --git a/app/src/main/java/mozilla/components/lib/publicsuffixlist/PublicSuffixList.kt b/database/src/main/java/mozilla/components/lib/publicsuffixlist/PublicSuffixList.kt similarity index 100% rename from app/src/main/java/mozilla/components/lib/publicsuffixlist/PublicSuffixList.kt rename to database/src/main/java/mozilla/components/lib/publicsuffixlist/PublicSuffixList.kt diff --git a/app/src/main/java/mozilla/components/lib/publicsuffixlist/PublicSuffixListData.kt b/database/src/main/java/mozilla/components/lib/publicsuffixlist/PublicSuffixListData.kt similarity index 100% rename from app/src/main/java/mozilla/components/lib/publicsuffixlist/PublicSuffixListData.kt rename to database/src/main/java/mozilla/components/lib/publicsuffixlist/PublicSuffixListData.kt diff --git a/app/src/main/java/mozilla/components/lib/publicsuffixlist/PublicSuffixListLoader.kt b/database/src/main/java/mozilla/components/lib/publicsuffixlist/PublicSuffixListLoader.kt similarity index 100% rename from app/src/main/java/mozilla/components/lib/publicsuffixlist/PublicSuffixListLoader.kt rename to database/src/main/java/mozilla/components/lib/publicsuffixlist/PublicSuffixListLoader.kt diff --git a/app/src/main/java/mozilla/components/lib/publicsuffixlist/ext/ByteArray.kt b/database/src/main/java/mozilla/components/lib/publicsuffixlist/ext/ByteArray.kt similarity index 100% rename from app/src/main/java/mozilla/components/lib/publicsuffixlist/ext/ByteArray.kt rename to database/src/main/java/mozilla/components/lib/publicsuffixlist/ext/ByteArray.kt diff --git a/app/src/main/res/drawable/ic_blank_32dp.png b/database/src/main/res/drawable/ic_blank_32dp.png similarity index 100% rename from app/src/main/res/drawable/ic_blank_32dp.png rename to database/src/main/res/drawable/ic_blank_32dp.png diff --git a/database/src/main/res/values/dimens.xml b/database/src/main/res/values/dimens.xml new file mode 100644 index 000000000..81f975f4d --- /dev/null +++ b/database/src/main/res/values/dimens.xml @@ -0,0 +1,4 @@ + + + 32dp + diff --git a/database/src/main/res/values/strings.xml b/database/src/main/res/values/strings.xml new file mode 100644 index 000000000..b80bd2575 --- /dev/null +++ b/database/src/main/res/values/strings.xml @@ -0,0 +1,69 @@ + + + None + Gzip + Recycle bin + Templates + + Standard + Template + Version + + Title + Username + Password + URL + Expires + Notes + + Debit / Credit Card + Holder + Number + CVV + PIN + ID Card + Name + Place of issue + Date of issue + Email + Email address + Wi-Fi + SSID + Type + Cryptocurrency wallet + Token + Public key + Private key + Seed + Account + Bank + SWIFT / BIC + IBAN + Secure Note + Membership + + Could not find file. Try reopening it from your file browser. + Corrupted file. + Wrong algorithm. + Database location is unknown, database action cannot be performed. + Hardware key is not supported. + "Key cannot be empty." + Could not recognize the database format. + Unsupported database version. + Could not read credentials. + Could not load the key. Try to lower the KDF \"Memory Usage\". + No memory to load your entire database. + %1$s with the same UUID %2$s already exists. + XML malformed. + Unable to merge from a database V1. + You cannot move an entry here. + You cannot move a group here. + You cannot copy an entry here. + You cannot copy a group here. + Could not load the database. + Could not save the database. + + Retrieving database key… + Decrypting database content… + + From 50343193e12422489bdc25027a20eec9710c31e5 Mon Sep 17 00:00:00 2001 From: GianpaMX Date: Wed, 26 Oct 2022 11:33:51 +0100 Subject: [PATCH 3/9] template field --- .../activities/fragments/EntryFragment.kt | 1 + .../keepass/adapters/NodesAdapter.kt | 1 + .../adapters/TemplatesSelectorAdapter.kt | 3 +- .../element/template/TemplateFieldKt.kt | 57 ++++++++++++++++ .../keepass/view/TemplateEditView.kt | 3 +- .../kunzisoft/keepass/view/TemplateView.kt | 3 +- .../keepass/view/TextEditFieldView.kt | 3 +- .../kunzisoft/keepass/view/TextFieldView.kt | 1 + app/src/main/res/values/strings.xml | 62 ++++++++++++++++- database/build.gradle | 3 - .../element/template/TemplateField.kt | 67 ++----------------- database/src/main/res/values/strings.xml | 39 +---------- 12 files changed, 136 insertions(+), 107 deletions(-) create mode 100644 app/src/main/java/com/kunzisoft/keepass/database/element/template/TemplateFieldKt.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/fragments/EntryFragment.kt b/app/src/main/java/com/kunzisoft/keepass/activities/fragments/EntryFragment.kt index c9e5b16e7..f73fb595a 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/fragments/EntryFragment.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/fragments/EntryFragment.kt @@ -17,6 +17,7 @@ import com.kunzisoft.keepass.adapters.EntryAttachmentsItemsAdapter import com.kunzisoft.keepass.database.element.Attachment import com.kunzisoft.keepass.database.element.Database import com.kunzisoft.keepass.database.element.template.TemplateField +import com.kunzisoft.keepass.database.element.template.getLocalizedName import com.kunzisoft.keepass.model.EntryAttachmentState import com.kunzisoft.keepass.model.EntryInfo import com.kunzisoft.keepass.model.StreamDirection diff --git a/app/src/main/java/com/kunzisoft/keepass/adapters/NodesAdapter.kt b/app/src/main/java/com/kunzisoft/keepass/adapters/NodesAdapter.kt index 12c1ff3a5..628d9bc34 100644 --- a/app/src/main/java/com/kunzisoft/keepass/adapters/NodesAdapter.kt +++ b/app/src/main/java/com/kunzisoft/keepass/adapters/NodesAdapter.kt @@ -42,6 +42,7 @@ import com.kunzisoft.keepass.database.element.node.Node import com.kunzisoft.keepass.database.element.node.NodeVersionedInterface import com.kunzisoft.keepass.database.element.node.Type import com.kunzisoft.keepass.database.element.template.TemplateField +import com.kunzisoft.keepass.database.element.template.getLocalizedName import com.kunzisoft.keepass.otp.OtpElement import com.kunzisoft.keepass.otp.OtpType import com.kunzisoft.keepass.settings.PreferencesUtil diff --git a/app/src/main/java/com/kunzisoft/keepass/adapters/TemplatesSelectorAdapter.kt b/app/src/main/java/com/kunzisoft/keepass/adapters/TemplatesSelectorAdapter.kt index 8745b2bba..7c210fbf5 100644 --- a/app/src/main/java/com/kunzisoft/keepass/adapters/TemplatesSelectorAdapter.kt +++ b/app/src/main/java/com/kunzisoft/keepass/adapters/TemplatesSelectorAdapter.kt @@ -11,6 +11,7 @@ import android.widget.TextView import com.kunzisoft.keepass.R import com.kunzisoft.keepass.database.element.template.Template import com.kunzisoft.keepass.database.element.template.TemplateField +import com.kunzisoft.keepass.database.element.template.getLocalizedName import com.kunzisoft.keepass.icons.IconDrawableFactory @@ -74,4 +75,4 @@ class TemplatesSelectorAdapter( var icon: ImageView? = null var name: TextView? = null } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/template/TemplateFieldKt.kt b/app/src/main/java/com/kunzisoft/keepass/database/element/template/TemplateFieldKt.kt new file mode 100644 index 000000000..31ca5ac3e --- /dev/null +++ b/app/src/main/java/com/kunzisoft/keepass/database/element/template/TemplateFieldKt.kt @@ -0,0 +1,57 @@ +package com.kunzisoft.keepass.database.element.template + +import android.content.Context +import com.kunzisoft.keepass.R + + +fun TemplateField.isStandardPasswordName(context: Context, name: String): Boolean { + return name.equals(LABEL_PASSWORD, true) + || name == getLocalizedName(context, LABEL_PASSWORD) +} + +fun TemplateField.getLocalizedName(context: Context?, name: String): String { + if (context == null + || TemplateEngine.containsTemplateDecorator(name)) + return name + + return when { + LABEL_STANDARD.equals(name, true) -> context.getString(R.string.standard) + LABEL_TEMPLATE.equals(name, true) -> context.getString(R.string.template) + LABEL_VERSION.equals(name, true) -> context.getString(R.string.version) + + LABEL_TITLE.equals(name, true) -> context.getString(R.string.entry_title) + LABEL_USERNAME.equals(name, true) -> context.getString(R.string.entry_user_name) + LABEL_PASSWORD.equals(name, true) -> context.getString(R.string.entry_password) + LABEL_URL.equals(name, true) -> context.getString(R.string.entry_url) + LABEL_EXPIRATION.equals(name, true) -> context.getString(R.string.entry_expires) + LABEL_NOTES.equals(name, true) -> context.getString(R.string.entry_notes) + + LABEL_DEBIT_CREDIT_CARD.equals(name, true) -> context.getString(R.string.debit_credit_card) + LABEL_HOLDER.equals(name, true) -> context.getString(R.string.holder) + LABEL_NUMBER.equals(name, true) -> context.getString(R.string.number) + LABEL_CVV.equals(name, true) -> context.getString(R.string.card_verification_value) + LABEL_PIN.equals(name, true) -> context.getString(R.string.personal_identification_number) + LABEL_ID_CARD.equals(name, true) -> context.getString(R.string.id_card) + LABEL_NAME.equals(name, true) -> context.getString(R.string.name) + LABEL_PLACE_OF_ISSUE.equals(name, true) -> context.getString(R.string.place_of_issue) + LABEL_DATE_OF_ISSUE.equals(name, true) -> context.getString(R.string.date_of_issue) + LABEL_EMAIL.equals(name, true) -> context.getString(R.string.email) + LABEL_EMAIL_ADDRESS.equals(name, true) -> context.getString(R.string.email_address) + LABEL_WIRELESS.equals(name, true) -> context.getString(R.string.wireless) + LABEL_SSID.equals(name, true) -> context.getString(R.string.ssid) + LABEL_TYPE.equals(name, true) -> context.getString(R.string.type) + LABEL_CRYPTOCURRENCY.equals(name, true) -> context.getString(R.string.cryptocurrency) + LABEL_TOKEN.equals(name, false) -> context.getString(R.string.token) + LABEL_PUBLIC_KEY.equals(name, true) -> context.getString(R.string.public_key) + LABEL_PRIVATE_KEY.equals(name, true) -> context.getString(R.string.private_key) + LABEL_SEED.equals(name, true) -> context.getString(R.string.seed) + LABEL_ACCOUNT.equals(name, true) -> context.getString(R.string.account) + LABEL_BANK.equals(name, true) -> context.getString(R.string.bank) + LABEL_BIC.equals(name, true) -> context.getString(R.string.bank_identifier_code) + LABEL_IBAN.equals(name, true) -> context.getString(R.string.international_bank_account_number) + LABEL_SECURE_NOTE.equals(name, true) -> context.getString(R.string.secure_note) + LABEL_MEMBERSHIP.equals(name, true) -> context.getString(R.string.membership) + + else -> name + } +} diff --git a/app/src/main/java/com/kunzisoft/keepass/view/TemplateEditView.kt b/app/src/main/java/com/kunzisoft/keepass/view/TemplateEditView.kt index 282aa2c30..add65a3ae 100644 --- a/app/src/main/java/com/kunzisoft/keepass/view/TemplateEditView.kt +++ b/app/src/main/java/com/kunzisoft/keepass/view/TemplateEditView.kt @@ -16,6 +16,7 @@ import com.kunzisoft.keepass.database.element.security.ProtectedString import com.kunzisoft.keepass.database.element.template.TemplateAttribute import com.kunzisoft.keepass.database.element.template.TemplateAttributeAction import com.kunzisoft.keepass.database.element.template.TemplateField +import com.kunzisoft.keepass.database.element.template.getLocalizedName import com.kunzisoft.keepass.otp.OtpEntryFields import org.joda.time.DateTime @@ -266,4 +267,4 @@ class TemplateEditView @JvmOverloads constructor(context: Context, override fun onSaveEntryInstanceState(savedState: SavedState) { savedState.tempDateTimeViewId = this.mTempDateTimeViewId } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/kunzisoft/keepass/view/TemplateView.kt b/app/src/main/java/com/kunzisoft/keepass/view/TemplateView.kt index a0f30b977..54b2602fb 100644 --- a/app/src/main/java/com/kunzisoft/keepass/view/TemplateView.kt +++ b/app/src/main/java/com/kunzisoft/keepass/view/TemplateView.kt @@ -9,6 +9,7 @@ import com.kunzisoft.keepass.database.element.Field import com.kunzisoft.keepass.database.element.security.ProtectedString import com.kunzisoft.keepass.database.element.template.TemplateAttribute import com.kunzisoft.keepass.database.element.template.TemplateField +import com.kunzisoft.keepass.database.element.template.getLocalizedName import com.kunzisoft.keepass.model.OtpModel import com.kunzisoft.keepass.otp.OtpElement import com.kunzisoft.keepass.otp.OtpEntryFields.OTP_TOKEN_FIELD @@ -194,4 +195,4 @@ class TemplateView @JvmOverloads constructor(context: Context, mLastOtpTokenView?.removeCallbacks(mOtpRunnable) mLastOtpTokenView = null } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/kunzisoft/keepass/view/TextEditFieldView.kt b/app/src/main/java/com/kunzisoft/keepass/view/TextEditFieldView.kt index 7e577b506..22fce4855 100644 --- a/app/src/main/java/com/kunzisoft/keepass/view/TextEditFieldView.kt +++ b/app/src/main/java/com/kunzisoft/keepass/view/TextEditFieldView.kt @@ -21,6 +21,7 @@ import com.google.android.material.textfield.TextInputEditText import com.google.android.material.textfield.TextInputLayout import com.kunzisoft.keepass.R import com.kunzisoft.keepass.database.element.template.TemplateField +import com.kunzisoft.keepass.database.element.template.isStandardPasswordName import com.kunzisoft.keepass.password.PasswordGenerator import com.kunzisoft.keepass.settings.PreferencesUtil @@ -203,4 +204,4 @@ class TextEditFieldView @JvmOverloads constructor(context: Context, const val MAX_CHARS_LIMIT = Integer.MAX_VALUE const val MAX_LINES_LIMIT = Integer.MAX_VALUE } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/kunzisoft/keepass/view/TextFieldView.kt b/app/src/main/java/com/kunzisoft/keepass/view/TextFieldView.kt index c91e85783..5799edccc 100644 --- a/app/src/main/java/com/kunzisoft/keepass/view/TextFieldView.kt +++ b/app/src/main/java/com/kunzisoft/keepass/view/TextFieldView.kt @@ -39,6 +39,7 @@ import androidx.core.view.ViewCompat import androidx.core.view.isVisible import com.kunzisoft.keepass.R import com.kunzisoft.keepass.database.element.template.TemplateField +import com.kunzisoft.keepass.database.element.template.isStandardPasswordName import com.kunzisoft.keepass.model.EntryInfo.Companion.APPLICATION_ID_FIELD_NAME import com.kunzisoft.keepass.password.PasswordGenerator import com.kunzisoft.keepass.settings.PreferencesUtil diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2b2620991..aab95a64c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -78,10 +78,12 @@ Remove Close fields Select to copy %1$s to clipboard + Retrieving database key… Waiting for the challenge request… Waiting for the challenge response… Database Templates + Decrypting database content… Use as default database Digits KeePassDX © %1$d Kunzisoft is <strong>open source</strong> and <strong>without advertising</strong>. @@ -90,8 +92,10 @@ In order to <strong>keep our freedom</strong>, <strong>fix bugs</strong>, <strong>add features</strong> and <strong>to be always active</strong>, we count on your <strong>contribution</strong>. Accessed Cancel + Notes Confirm password Created + Expires Expired UUID History @@ -104,9 +108,11 @@ Auto-Type Auto-Type sequence Could not find entry data. + Password Tags Custom data Save + Title Set up one-time password OTP type Secret @@ -118,8 +124,38 @@ Current group Case sensitive Regular expression + Debit / Credit Card + Holder + Number + CVV + PIN + ID Card + Name + Place of issue + Date of issue + Email + Email address + Wi-Fi + SSID + Type + Cryptocurrency wallet + Token + Public key + Private key + Seed + Account + Bank Bank name + SWIFT / BIC + IBAN + Secure Note + Membership + Standard + Template + Version OTP + URL + Username The Arcfour stream cipher is not supported. Could not handle this URI in KeePassDX. Could not create file @@ -130,6 +166,10 @@ This word is reserved and cannot be used. Select a keyfile. Select a hardware key. + No memory to load your entire database. + XML malformed. + Could not load the database. + Could not load the key. Try to lower the KDF \"Memory Usage\". At least one password generation type must be selected. At least one credential must be set. The passwords do not match. @@ -138,8 +178,13 @@ This label already exists. Enter a positive integer number in the \"Length\" field. Could not enable autofill service. + You cannot move a group here. + You cannot move an entry here. + You cannot copy an entry here. + You cannot copy a group here. Unable to create database file. Unable to create database with this password and keyfile. + Could not save the database. Secret key must be in Base32 format. Counter must be between %1$d and %2$d. Period must be between %1$d and %2$d seconds. @@ -160,8 +205,14 @@ Unable to get the response from the challenge. Cancelled by user. Driver for %1$s is required. + Unable to merge from a database V1. + Database location is unknown, database action cannot be performed. + Hardware key is not supported. + "Key cannot be empty." Field name Field value + Could not find file. Try reopening it from your file browser. + Corrupted file. File manager Generate password Confirm password @@ -173,6 +224,10 @@ Password Password Passphrase + Could not read credentials. + Wrong algorithm. + %1$s with the same UUID %2$s already exists. + Could not recognize the database format. The keyfile is empty. Length Hide passwords @@ -294,6 +349,7 @@ Special Search Underline + Unsupported database version. Upper-case Warning Avoid password characters outside of text encoding format in database file (unrecognized chars are converted to the same letter). @@ -431,6 +487,10 @@ Interface Other Compression + None + Gzip + Recycle bin + Templates Keyboard Magikeyboard Activate a custom keyboard populating your passwords and all identity fields @@ -642,4 +702,4 @@ Displays foreground and background colors for an entry Hide expired entries Expired entries are not shown - + \ No newline at end of file diff --git a/database/build.gradle b/database/build.gradle index e1e8552b4..35da30599 100644 --- a/database/build.gradle +++ b/database/build.gradle @@ -52,9 +52,6 @@ dependencies { // Apache Commons implementation 'commons-io:commons-io:2.8.0' implementation 'commons-codec:commons-codec:1.15' - // Icon pack - implementation project(path: ':icon-pack-classic') - implementation project(path: ':icon-pack-material') // Database implementation "androidx.room:room-runtime:$room_version" diff --git a/database/src/main/java/com/kunzisoft/keepass/database/element/template/TemplateField.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/template/TemplateField.kt index 99208ffb0..daa07ae2e 100644 --- a/database/src/main/java/com/kunzisoft/keepass/database/element/template/TemplateField.kt +++ b/database/src/main/java/com/kunzisoft/keepass/database/element/template/TemplateField.kt @@ -18,9 +18,6 @@ */ package com.kunzisoft.keepass.database.element.template -import android.content.Context -import com.kunzisoft.keepass.database.R - object TemplateField { const val LABEL_STANDARD = "Standard" @@ -60,66 +57,14 @@ object TemplateField { const val LABEL_SECURE_NOTE = "Secure Note" const val LABEL_MEMBERSHIP = "Membership" - fun isStandardPasswordName(context: Context, name: String): Boolean { - return name.equals(LABEL_PASSWORD, true) - || name == getLocalizedName(context, LABEL_PASSWORD) - } - fun isStandardFieldName(name: String): Boolean { return arrayOf( - LABEL_TITLE, - LABEL_USERNAME, - LABEL_PASSWORD, - LABEL_URL, - LABEL_EXPIRATION, - LABEL_NOTES + LABEL_TITLE, + LABEL_USERNAME, + LABEL_PASSWORD, + LABEL_URL, + LABEL_EXPIRATION, + LABEL_NOTES ).firstOrNull { it.equals(name, true) } != null } - - fun getLocalizedName(context: Context?, name: String): String { - if (context == null - || TemplateEngine.containsTemplateDecorator(name)) - return name - - return when { - LABEL_STANDARD.equals(name, true) -> context.getString(R.string.standard) - LABEL_TEMPLATE.equals(name, true) -> context.getString(R.string.template) - LABEL_VERSION.equals(name, true) -> context.getString(R.string.version) - - LABEL_TITLE.equals(name, true) -> context.getString(R.string.entry_title) - LABEL_USERNAME.equals(name, true) -> context.getString(R.string.entry_user_name) - LABEL_PASSWORD.equals(name, true) -> context.getString(R.string.entry_password) - LABEL_URL.equals(name, true) -> context.getString(R.string.entry_url) - LABEL_EXPIRATION.equals(name, true) -> context.getString(R.string.entry_expires) - LABEL_NOTES.equals(name, true) -> context.getString(R.string.entry_notes) - - LABEL_DEBIT_CREDIT_CARD.equals(name, true) -> context.getString(R.string.debit_credit_card) - LABEL_HOLDER.equals(name, true) -> context.getString(R.string.holder) - LABEL_NUMBER.equals(name, true) -> context.getString(R.string.number) - LABEL_CVV.equals(name, true) -> context.getString(R.string.card_verification_value) - LABEL_PIN.equals(name, true) -> context.getString(R.string.personal_identification_number) - LABEL_ID_CARD.equals(name, true) -> context.getString(R.string.id_card) - LABEL_NAME.equals(name, true) -> context.getString(R.string.name) - LABEL_PLACE_OF_ISSUE.equals(name, true) -> context.getString(R.string.place_of_issue) - LABEL_DATE_OF_ISSUE.equals(name, true) -> context.getString(R.string.date_of_issue) - LABEL_EMAIL.equals(name, true) -> context.getString(R.string.email) - LABEL_EMAIL_ADDRESS.equals(name, true) -> context.getString(R.string.email_address) - LABEL_WIRELESS.equals(name, true) -> context.getString(R.string.wireless) - LABEL_SSID.equals(name, true) -> context.getString(R.string.ssid) - LABEL_TYPE.equals(name, true) -> context.getString(R.string.type) - LABEL_CRYPTOCURRENCY.equals(name, true) -> context.getString(R.string.cryptocurrency) - LABEL_TOKEN.equals(name, false) -> context.getString(R.string.token) - LABEL_PUBLIC_KEY.equals(name, true) -> context.getString(R.string.public_key) - LABEL_PRIVATE_KEY.equals(name, true) -> context.getString(R.string.private_key) - LABEL_SEED.equals(name, true) -> context.getString(R.string.seed) - LABEL_ACCOUNT.equals(name, true) -> context.getString(R.string.account) - LABEL_BANK.equals(name, true) -> context.getString(R.string.bank) - LABEL_BIC.equals(name, true) -> context.getString(R.string.bank_identifier_code) - LABEL_IBAN.equals(name, true) -> context.getString(R.string.international_bank_account_number) - LABEL_SECURE_NOTE.equals(name, true) -> context.getString(R.string.secure_note) - LABEL_MEMBERSHIP.equals(name, true) -> context.getString(R.string.membership) - - else -> name - } - } } diff --git a/database/src/main/res/values/strings.xml b/database/src/main/res/values/strings.xml index b80bd2575..623aac650 100644 --- a/database/src/main/res/values/strings.xml +++ b/database/src/main/res/values/strings.xml @@ -4,44 +4,7 @@ Gzip Recycle bin Templates - - Standard - Template - Version - - Title - Username - Password - URL - Expires - Notes - - Debit / Credit Card - Holder - Number - CVV - PIN - ID Card - Name - Place of issue - Date of issue - Email - Email address - Wi-Fi - SSID - Type - Cryptocurrency wallet - Token - Public key - Private key - Seed - Account - Bank - SWIFT / BIC - IBAN - Secure Note - Membership - + Could not find file. Try reopening it from your file browser. Corrupted file. Wrong algorithm. From b11533f9fe91608909ce4dcb5e459c54d1fbcee9 Mon Sep 17 00:00:00 2001 From: GianpaMX Date: Wed, 26 Oct 2022 12:20:19 +0100 Subject: [PATCH 4/9] exceptions refactor --- .../activities/MainCredentialActivity.kt | 1 + .../exception/LocalizedDatabaseException.kt | 49 +++++++++ .../com/kunzisoft/keepass/view/ViewUtil.kt | 11 +- .../database/exception/DatabaseException.kt | 103 +++--------------- database/src/main/res/values/strings.xml | 21 ---- 5 files changed, 71 insertions(+), 114 deletions(-) create mode 100644 app/src/main/java/com/kunzisoft/keepass/database/exception/LocalizedDatabaseException.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/MainCredentialActivity.kt b/app/src/main/java/com/kunzisoft/keepass/activities/MainCredentialActivity.kt index 2d6312e36..f9724d840 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/MainCredentialActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/MainCredentialActivity.kt @@ -59,6 +59,7 @@ import com.kunzisoft.keepass.database.element.Database import com.kunzisoft.keepass.database.element.MainCredential import com.kunzisoft.keepass.database.exception.DuplicateUuidDatabaseException import com.kunzisoft.keepass.database.exception.FileNotFoundDatabaseException +import com.kunzisoft.keepass.database.exception.getLocalizedMessage import com.kunzisoft.keepass.education.PasswordActivityEducation import com.kunzisoft.keepass.hardware.HardwareKey import com.kunzisoft.keepass.model.* diff --git a/app/src/main/java/com/kunzisoft/keepass/database/exception/LocalizedDatabaseException.kt b/app/src/main/java/com/kunzisoft/keepass/database/exception/LocalizedDatabaseException.kt new file mode 100644 index 000000000..fb53782d3 --- /dev/null +++ b/app/src/main/java/com/kunzisoft/keepass/database/exception/LocalizedDatabaseException.kt @@ -0,0 +1,49 @@ +/* + * Copyright 2021 Jeremy Jamet / Kunzisoft. + * + * This file is part of KeePassDX. + * + * KeePassDX is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * KeePassDX is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with KeePassDX. If not, see . + */ +package com.kunzisoft.keepass.database.exception + +import android.content.res.Resources +import com.kunzisoft.keepass.R + +fun DatabaseException.getLocalizedMessage(resources: Resources): String = parameters?.let { + when (this) { + is FileNotFoundDatabaseException -> resources.getString(R.string.file_not_found_content) + is CorruptedDatabaseException -> resources.getString(R.string.corrupted_file) + is InvalidAlgorithmDatabaseException -> resources.getString(R.string.invalid_algorithm) + is UnknownDatabaseLocationException -> resources.getString(R.string.error_location_unknown) + is HardwareKeyDatabaseException -> resources.getString(R.string.error_hardware_key_unsupported) + is EmptyKeyDatabaseException -> resources.getString(R.string.error_empty_key) + is SignatureDatabaseException -> resources.getString(R.string.invalid_db_sig) + is VersionDatabaseException -> resources.getString(R.string.unsupported_db_version) + is InvalidCredentialsDatabaseException -> resources.getString(R.string.invalid_credentials) + is KDFMemoryDatabaseException -> resources.getString(R.string.error_load_database_KDF_memory) + is NoMemoryDatabaseException -> resources.getString(R.string.error_out_of_memory) + is DuplicateUuidDatabaseException -> resources.getString(R.string.invalid_db_same_uuid) + is XMLMalformedDatabaseException -> resources.getString(R.string.error_XML_malformed) + is MergeDatabaseKDBException -> resources.getString(R.string.error_unable_merge_database_kdb) + is MoveEntryDatabaseException -> resources.getString(R.string.error_move_entry_here) + is MoveGroupDatabaseException -> resources.getString(R.string.error_move_group_here) + is CopyEntryDatabaseException -> resources.getString(R.string.error_copy_entry_here) + is CopyGroupDatabaseException -> resources.getString(R.string.error_copy_group_here) + is DatabaseInputException -> resources.getString(R.string.error_load_database) + is DatabaseOutputException -> resources.getString(R.string.error_save_database) + else -> (mThrowable as? DatabaseException)?.getLocalizedMessage(resources) + } +} ?: resources.getString(R.string.error_load_database) + diff --git a/app/src/main/java/com/kunzisoft/keepass/view/ViewUtil.kt b/app/src/main/java/com/kunzisoft/keepass/view/ViewUtil.kt index 44182c9ee..ca329a96e 100644 --- a/app/src/main/java/com/kunzisoft/keepass/view/ViewUtil.kt +++ b/app/src/main/java/com/kunzisoft/keepass/view/ViewUtil.kt @@ -54,6 +54,7 @@ import android.graphics.drawable.Drawable import android.view.ViewGroup import android.widget.LinearLayout import com.google.android.material.appbar.CollapsingToolbarLayout +import com.kunzisoft.keepass.database.exception.getLocalizedMessage /** @@ -226,8 +227,8 @@ fun View.updateLockPaddingLeft() { fun Context.showActionErrorIfNeeded(result: ActionRunnable.Result) { if (!result.isSuccess) { - result.exception?.errorId?.let { errorId -> - Toast.makeText(this, errorId, Toast.LENGTH_LONG).show() + result.exception?.let { exception -> + Toast.makeText(this, exception.getLocalizedMessage(resources), Toast.LENGTH_LONG).show() } ?: result.message?.let { message -> Toast.makeText(this, message, Toast.LENGTH_LONG).show() } @@ -236,8 +237,8 @@ fun Context.showActionErrorIfNeeded(result: ActionRunnable.Result) { fun CoordinatorLayout.showActionErrorIfNeeded(result: ActionRunnable.Result) { if (!result.isSuccess) { - result.exception?.errorId?.let { errorId -> - Snackbar.make(this, errorId, Snackbar.LENGTH_LONG).asError().show() + result.exception?.let { exception -> + Snackbar.make(this, exception.getLocalizedMessage(resources), Snackbar.LENGTH_LONG).asError().show() } ?: result.message?.let { message -> Snackbar.make(this, message, Snackbar.LENGTH_LONG).asError().show() } @@ -288,4 +289,4 @@ fun CollapsingToolbarLayout.changeTitleColor(color: Int) { setCollapsedTitleTextColor(color) setExpandedTitleColor(color) invalidate() -} \ No newline at end of file +} diff --git a/database/src/main/java/com/kunzisoft/keepass/database/exception/DatabaseException.kt b/database/src/main/java/com/kunzisoft/keepass/database/exception/DatabaseException.kt index 6f14f690a..e5962fc53 100644 --- a/database/src/main/java/com/kunzisoft/keepass/database/exception/DatabaseException.kt +++ b/database/src/main/java/com/kunzisoft/keepass/database/exception/DatabaseException.kt @@ -19,9 +19,6 @@ */ package com.kunzisoft.keepass.database.exception -import android.content.res.Resources -import androidx.annotation.StringRes -import com.kunzisoft.keepass.database.R import com.kunzisoft.keepass.database.element.node.NodeId import com.kunzisoft.keepass.database.element.node.Type import java.io.PrintStream @@ -30,7 +27,6 @@ import java.io.PrintWriter abstract class DatabaseException : Exception { var innerMessage: String? = null - abstract var errorId: Int var parameters: (Array)? = null var mThrowable: Throwable? = null @@ -46,27 +42,12 @@ abstract class DatabaseException : Exception { } }.toString() } + constructor(throwable: Throwable) { mThrowable = throwable innerMessage = throwable.localizedMessage } - fun getLocalizedMessage(resources: Resources): String { - val throwable = mThrowable - if (throwable is DatabaseException) - errorId = throwable.errorId - val localMessage = parameters?.let { - resources.getString(errorId, *it) - } ?: resources.getString(errorId) - return StringBuilder().apply { - append(localMessage) - if (innerMessage != null) { - append(" ") - append(innerMessage) - } - }.toString() - } - override fun printStackTrace() { mThrowable?.printStackTrace() super.printStackTrace() @@ -83,116 +64,62 @@ abstract class DatabaseException : Exception { } } -class FileNotFoundDatabaseException : DatabaseInputException() { - @StringRes - override var errorId: Int = R.string.file_not_found_content -} +class FileNotFoundDatabaseException : DatabaseInputException() -class CorruptedDatabaseException : DatabaseInputException() { - @StringRes - override var errorId: Int = R.string.corrupted_file -} +class CorruptedDatabaseException : DatabaseInputException() class InvalidAlgorithmDatabaseException : DatabaseInputException { - @StringRes - override var errorId: Int = R.string.invalid_algorithm constructor() : super() constructor(exception: Throwable) : super(exception) } -class UnknownDatabaseLocationException : DatabaseException() { - @StringRes - override var errorId: Int = R.string.error_location_unknown -} +class UnknownDatabaseLocationException : DatabaseException() -class HardwareKeyDatabaseException : DatabaseException() { - @StringRes - override var errorId: Int = R.string.error_hardware_key_unsupported -} +class HardwareKeyDatabaseException : DatabaseException() -class EmptyKeyDatabaseException : DatabaseException() { - @StringRes - override var errorId: Int = R.string.error_empty_key -} +class EmptyKeyDatabaseException : DatabaseException() -class SignatureDatabaseException : DatabaseInputException() { - @StringRes - override var errorId: Int = R.string.invalid_db_sig -} +class SignatureDatabaseException : DatabaseInputException() -class VersionDatabaseException : DatabaseInputException() { - @StringRes - override var errorId: Int = R.string.unsupported_db_version -} +class VersionDatabaseException : DatabaseInputException() class InvalidCredentialsDatabaseException : DatabaseInputException { - @StringRes - override var errorId: Int = R.string.invalid_credentials constructor() : super() constructor(string: String) : super(string) } -class KDFMemoryDatabaseException(exception: Throwable) : DatabaseInputException(exception) { - @StringRes - override var errorId: Int = R.string.error_load_database_KDF_memory -} +class KDFMemoryDatabaseException(exception: Throwable) : DatabaseInputException(exception) -class NoMemoryDatabaseException(exception: Throwable) : DatabaseInputException(exception) { - @StringRes - override var errorId: Int = R.string.error_out_of_memory -} +class NoMemoryDatabaseException(exception: Throwable) : DatabaseInputException(exception) class DuplicateUuidDatabaseException(type: Type, uuid: NodeId<*>) : DatabaseInputException() { - @StringRes - override var errorId: Int = R.string.invalid_db_same_uuid init { parameters = arrayOf(type.name, uuid.toString()) } } class XMLMalformedDatabaseException : DatabaseInputException { - @StringRes - override var errorId: Int = R.string.error_XML_malformed constructor() : super() constructor(string: String) : super(string) } -class MergeDatabaseKDBException : DatabaseInputException() { - @StringRes - override var errorId: Int = R.string.error_unable_merge_database_kdb -} +class MergeDatabaseKDBException : DatabaseInputException() -class MoveEntryDatabaseException : DatabaseException() { - @StringRes - override var errorId: Int = R.string.error_move_entry_here -} +class MoveEntryDatabaseException : DatabaseException() -class MoveGroupDatabaseException : DatabaseException() { - @StringRes - override var errorId: Int = R.string.error_move_group_here -} +class MoveGroupDatabaseException : DatabaseException() -class CopyEntryDatabaseException : DatabaseException() { - @StringRes - override var errorId: Int = R.string.error_copy_entry_here -} +class CopyEntryDatabaseException : DatabaseException() -class CopyGroupDatabaseException : DatabaseException() { - @StringRes - override var errorId: Int = R.string.error_copy_group_here -} +class CopyGroupDatabaseException : DatabaseException() open class DatabaseInputException : DatabaseException { - @StringRes - override var errorId: Int = R.string.error_load_database constructor() : super() constructor(string: String) : super(string) constructor(throwable: Throwable) : super(throwable) } open class DatabaseOutputException : DatabaseException { - @StringRes - override var errorId: Int = R.string.error_save_database constructor(string: String) : super(string) constructor(string: String, e: Exception) : super(string, e) constructor(e: Exception) : super(e) diff --git a/database/src/main/res/values/strings.xml b/database/src/main/res/values/strings.xml index 623aac650..084d44889 100644 --- a/database/src/main/res/values/strings.xml +++ b/database/src/main/res/values/strings.xml @@ -4,27 +4,6 @@ Gzip Recycle bin Templates - - Could not find file. Try reopening it from your file browser. - Corrupted file. - Wrong algorithm. - Database location is unknown, database action cannot be performed. - Hardware key is not supported. - "Key cannot be empty." - Could not recognize the database format. - Unsupported database version. - Could not read credentials. - Could not load the key. Try to lower the KDF \"Memory Usage\". - No memory to load your entire database. - %1$s with the same UUID %2$s already exists. - XML malformed. - Unable to merge from a database V1. - You cannot move an entry here. - You cannot move a group here. - You cannot copy an entry here. - You cannot copy a group here. - Could not load the database. - Could not save the database. Retrieving database key… Decrypting database content… From 9e0b6fa80056279d7f53301592668fbb73c63773 Mon Sep 17 00:00:00 2001 From: GianpaMX Date: Wed, 26 Oct 2022 15:25:38 +0100 Subject: [PATCH 5/9] named compression algorithm --- .../adapters/EntryAttachmentsItemsAdapter.kt | 6 +- .../database/action/DatabaseTaskProvider.kt | 6 +- .../database/NamedCompressionAlgorithm.kt | 74 +++++++++++++++++++ .../DatabaseTaskNotificationService.kt | 21 ++++-- .../NestedDatabaseSettingsFragment.kt | 16 ++-- ...mpressionPreferenceDialogFragmentCompat.kt | 22 +++--- ...abaseSavePreferenceDialogFragmentCompat.kt | 7 +- .../keepass/viewmodels/DatabaseViewModel.kt | 12 +-- .../keepass/database/element/Database.kt | 3 +- .../element/database/CompressionAlgorithm.kt | 43 +---------- .../database/file/input/DatabaseInput.kt | 4 +- .../keepass/tasks/ProgressTaskUpdater.kt | 5 +- database/src/main/res/values/strings.xml | 6 -- 13 files changed, 134 insertions(+), 91 deletions(-) create mode 100644 app/src/main/java/com/kunzisoft/keepass/database/element/database/NamedCompressionAlgorithm.kt diff --git a/app/src/main/java/com/kunzisoft/keepass/adapters/EntryAttachmentsItemsAdapter.kt b/app/src/main/java/com/kunzisoft/keepass/adapters/EntryAttachmentsItemsAdapter.kt index cab97406b..2798df815 100644 --- a/app/src/main/java/com/kunzisoft/keepass/adapters/EntryAttachmentsItemsAdapter.kt +++ b/app/src/main/java/com/kunzisoft/keepass/adapters/EntryAttachmentsItemsAdapter.kt @@ -33,7 +33,7 @@ import androidx.recyclerview.widget.RecyclerView import com.kunzisoft.keepass.R import com.kunzisoft.keepass.activities.ImageViewerActivity import com.kunzisoft.keepass.database.element.Database -import com.kunzisoft.keepass.database.element.database.CompressionAlgorithm +import com.kunzisoft.keepass.database.element.database.NamedCompressionAlgorithm import com.kunzisoft.keepass.model.AttachmentState import com.kunzisoft.keepass.model.EntryAttachmentState import com.kunzisoft.keepass.model.StreamDirection @@ -130,7 +130,7 @@ class EntryAttachmentsItemsAdapter(context: Context) holder.binaryFileSize.text = Formatter.formatFileSize(context, size) holder.binaryFileCompression.apply { if (entryAttachmentState.attachment.binaryData.isCompressed) { - text = CompressionAlgorithm.GZip.getName(context.resources) + text = NamedCompressionAlgorithm.GZip.getName(context.resources) visibility = View.VISIBLE } else { text = "" @@ -203,4 +203,4 @@ class EntryAttachmentsItemsAdapter(context: Context) var binaryFileProgress: ProgressBar = itemView.findViewById(R.id.item_attachment_progress) var binaryFileDeleteButton: View = itemView.findViewById(R.id.item_attachment_delete_button) } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/kunzisoft/keepass/database/action/DatabaseTaskProvider.kt b/app/src/main/java/com/kunzisoft/keepass/database/action/DatabaseTaskProvider.kt index 3316dea53..3d482968e 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/action/DatabaseTaskProvider.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/action/DatabaseTaskProvider.kt @@ -24,7 +24,7 @@ import com.kunzisoft.keepass.database.element.Database import com.kunzisoft.keepass.database.element.Entry import com.kunzisoft.keepass.database.element.Group import com.kunzisoft.keepass.database.element.MainCredential -import com.kunzisoft.keepass.database.element.database.CompressionAlgorithm +import com.kunzisoft.keepass.database.element.database.NamedCompressionAlgorithm import com.kunzisoft.keepass.database.element.node.Node import com.kunzisoft.keepass.database.element.node.NodeId import com.kunzisoft.keepass.database.element.node.Type @@ -615,8 +615,8 @@ class DatabaseTaskProvider { , ACTION_DATABASE_UPDATE_COLOR_TASK) } - fun startDatabaseSaveCompression(oldCompression: CompressionAlgorithm, - newCompression: CompressionAlgorithm, + fun startDatabaseSaveCompression(oldCompression: NamedCompressionAlgorithm, + newCompression: NamedCompressionAlgorithm, save: Boolean) { start(Bundle().apply { putSerializable(DatabaseTaskNotificationService.OLD_ELEMENT_KEY, oldCompression) diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/database/NamedCompressionAlgorithm.kt b/app/src/main/java/com/kunzisoft/keepass/database/element/database/NamedCompressionAlgorithm.kt new file mode 100644 index 000000000..c289f1d93 --- /dev/null +++ b/app/src/main/java/com/kunzisoft/keepass/database/element/database/NamedCompressionAlgorithm.kt @@ -0,0 +1,74 @@ +/* + * Copyright 2019 Jeremy Jamet / Kunzisoft. + * + * This file is part of KeePassDX. + * + * KeePassDX is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * KeePassDX is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with KeePassDX. If not, see . + * + */ +package com.kunzisoft.keepass.database.element.database + +import android.content.res.Resources +import android.os.Parcel +import android.os.Parcelable +import com.kunzisoft.keepass.database.R +import com.kunzisoft.keepass.utils.ObjectNameResource +import com.kunzisoft.keepass.utils.readEnum +import com.kunzisoft.keepass.utils.writeEnum + + +// Note: We can get away with using int's to store unsigned 32-bit ints +// since we won't do arithmetic on these values (also unlikely to +// reach negative ids). +enum class NamedCompressionAlgorithm : ObjectNameResource, Parcelable { + + None, + GZip; + + override fun writeToParcel(dest: Parcel, flags: Int) { + dest.writeEnum(this) + } + + override fun describeContents(): Int { + return 0 + } + + override fun getName(resources: Resources): String { + return when (this) { + None -> resources.getString(R.string.compression_none) + GZip -> resources.getString(R.string.compression_gzip) + } + } + + companion object CREATOR : Parcelable.Creator { + override fun createFromParcel(parcel: Parcel): NamedCompressionAlgorithm { + return parcel.readEnum() ?: None + } + + override fun newArray(size: Int): Array { + return arrayOfNulls(size) + } + } +} + +fun CompressionAlgorithm.toNamedCompressionAlgorithm() = when(this) { + CompressionAlgorithm.None -> NamedCompressionAlgorithm.None + CompressionAlgorithm.GZip -> NamedCompressionAlgorithm.GZip +} + + +fun NamedCompressionAlgorithm.toCompressionAlgorithm() = when(this) { + NamedCompressionAlgorithm.None -> CompressionAlgorithm.None + NamedCompressionAlgorithm.GZip -> CompressionAlgorithm.GZip +} diff --git a/app/src/main/java/com/kunzisoft/keepass/services/DatabaseTaskNotificationService.kt b/app/src/main/java/com/kunzisoft/keepass/services/DatabaseTaskNotificationService.kt index e5e876b3b..76aeaf2a3 100644 --- a/app/src/main/java/com/kunzisoft/keepass/services/DatabaseTaskNotificationService.kt +++ b/app/src/main/java/com/kunzisoft/keepass/services/DatabaseTaskNotificationService.kt @@ -39,7 +39,8 @@ import com.kunzisoft.keepass.database.element.Database import com.kunzisoft.keepass.database.element.Entry import com.kunzisoft.keepass.database.element.Group import com.kunzisoft.keepass.database.element.MainCredential -import com.kunzisoft.keepass.database.element.database.CompressionAlgorithm +import com.kunzisoft.keepass.database.element.database.NamedCompressionAlgorithm +import com.kunzisoft.keepass.database.element.database.toCompressionAlgorithm import com.kunzisoft.keepass.database.element.node.Node import com.kunzisoft.keepass.database.element.node.NodeId import com.kunzisoft.keepass.database.element.node.Type @@ -646,11 +647,19 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress } } - override fun updateMessage(resId: Int) { + fun updateMessage(resId: Int) { mProgressMessage.messageId = resId notifyProgressMessage() } + override fun updateMessageRetrievingDBKey() { + updateMessage(R.string.retrieving_db_key) + } + + override fun updateMessageDecryptingDB() { + updateMessage(R.string.decrypting_db) + } + override fun actionOnLock() { if (!TimeoutHelper.temporarilyDisableLock) { closeDatabase(mDatabase) @@ -1110,8 +1119,8 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress && intent.hasExtra(SAVE_DATABASE_KEY) ) { - val oldElement: CompressionAlgorithm? = intent.getParcelableExtra(OLD_ELEMENT_KEY) - val newElement: CompressionAlgorithm? = intent.getParcelableExtra(NEW_ELEMENT_KEY) + val oldElement: NamedCompressionAlgorithm? = intent.getParcelableExtra(OLD_ELEMENT_KEY) + val newElement: NamedCompressionAlgorithm? = intent.getParcelableExtra(NEW_ELEMENT_KEY) if (oldElement == null || newElement == null @@ -1120,8 +1129,8 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress return UpdateCompressionBinariesDatabaseRunnable(this, database, - oldElement, - newElement, + oldElement.toCompressionAlgorithm(), + newElement.toCompressionAlgorithm(), !database.isReadOnly && intent.getBooleanExtra(SAVE_DATABASE_KEY, false) ) { hardwareKey, seed -> retrieveResponseFromChallenge(hardwareKey, seed) diff --git a/app/src/main/java/com/kunzisoft/keepass/settings/NestedDatabaseSettingsFragment.kt b/app/src/main/java/com/kunzisoft/keepass/settings/NestedDatabaseSettingsFragment.kt index 3c2c7c0d8..c14c13090 100644 --- a/app/src/main/java/com/kunzisoft/keepass/settings/NestedDatabaseSettingsFragment.kt +++ b/app/src/main/java/com/kunzisoft/keepass/settings/NestedDatabaseSettingsFragment.kt @@ -37,7 +37,9 @@ import com.kunzisoft.keepass.database.crypto.EncryptionAlgorithm import com.kunzisoft.keepass.database.crypto.kdf.KdfEngine import com.kunzisoft.keepass.database.element.Database import com.kunzisoft.keepass.database.element.Group -import com.kunzisoft.keepass.database.element.database.CompressionAlgorithm +import com.kunzisoft.keepass.database.element.database.NamedCompressionAlgorithm +import com.kunzisoft.keepass.database.element.database.toCompressionAlgorithm +import com.kunzisoft.keepass.database.element.database.toNamedCompressionAlgorithm import com.kunzisoft.keepass.database.element.template.TemplateEngine import com.kunzisoft.keepass.services.DatabaseTaskNotificationService import com.kunzisoft.keepass.settings.preference.* @@ -198,8 +200,8 @@ class NestedDatabaseSettingsFragment : NestedSettingsFragment(), DatabaseRetriev // Database compression dbDataCompressionPref = findPreference(getString(R.string.database_data_compression_key)) if (database.allowDataCompression) { - dbDataCompressionPref?.summary = (database.compressionAlgorithm - ?: CompressionAlgorithm.None).getName(resources) + dbDataCompressionPref?.summary = (database.compressionAlgorithm?.toNamedCompressionAlgorithm() + ?: NamedCompressionAlgorithm.None).getName(resources) } else { dbCompressionPrefCategory?.isVisible = false } @@ -433,13 +435,13 @@ class NestedDatabaseSettingsFragment : NestedSettingsFragment(), DatabaseRetriev dbCustomColorPref?.summary = defaultColorToShow } DatabaseTaskNotificationService.ACTION_DATABASE_UPDATE_COMPRESSION_TASK -> { - val oldCompression = data.getSerializable(DatabaseTaskNotificationService.OLD_ELEMENT_KEY) as CompressionAlgorithm - val newCompression = data.getSerializable(DatabaseTaskNotificationService.NEW_ELEMENT_KEY) as CompressionAlgorithm + val oldCompression = data.getSerializable(DatabaseTaskNotificationService.OLD_ELEMENT_KEY) as NamedCompressionAlgorithm + val newCompression = data.getSerializable(DatabaseTaskNotificationService.NEW_ELEMENT_KEY) as NamedCompressionAlgorithm val algorithmToShow = if (result.isSuccess) { newCompression } else { - mDatabase?.compressionAlgorithm = oldCompression + mDatabase?.compressionAlgorithm = oldCompression.toCompressionAlgorithm() oldCompression } dbDataCompressionPref?.summary = algorithmToShow.getName(resources) @@ -716,4 +718,4 @@ class NestedDatabaseSettingsFragment : NestedSettingsFragment(), DatabaseRetriev companion object { private const val TAG_PREF_FRAGMENT = "TAG_PREF_FRAGMENT" } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseDataCompressionPreferenceDialogFragmentCompat.kt b/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseDataCompressionPreferenceDialogFragmentCompat.kt index 878b95f37..eebbfac46 100644 --- a/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseDataCompressionPreferenceDialogFragmentCompat.kt +++ b/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseDataCompressionPreferenceDialogFragmentCompat.kt @@ -25,16 +25,18 @@ import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.kunzisoft.keepass.R import com.kunzisoft.keepass.database.element.Database -import com.kunzisoft.keepass.database.element.database.CompressionAlgorithm +import com.kunzisoft.keepass.database.element.database.NamedCompressionAlgorithm +import com.kunzisoft.keepass.database.element.database.toCompressionAlgorithm +import com.kunzisoft.keepass.database.element.database.toNamedCompressionAlgorithm import com.kunzisoft.keepass.settings.preferencedialogfragment.adapter.ListRadioItemAdapter class DatabaseDataCompressionPreferenceDialogFragmentCompat : DatabaseSavePreferenceDialogFragmentCompat(), - ListRadioItemAdapter.RadioItemSelectedCallback { + ListRadioItemAdapter.RadioItemSelectedCallback { private var mRecyclerView: RecyclerView? = null - private var mCompressionAdapter: ListRadioItemAdapter? = null - private var compressionSelected: CompressionAlgorithm? = null + private var mCompressionAdapter: ListRadioItemAdapter? = null + private var compressionSelected: NamedCompressionAlgorithm? = null override fun onBindDialogView(view: View) { super.onBindDialogView(view) @@ -45,7 +47,7 @@ class DatabaseDataCompressionPreferenceDialogFragmentCompat mRecyclerView?.layoutManager = LinearLayoutManager(context) activity?.let { activity -> - mCompressionAdapter = ListRadioItemAdapter(activity) + mCompressionAdapter = ListRadioItemAdapter(activity) mCompressionAdapter?.setRadioItemSelectedCallback(this) } } @@ -57,8 +59,8 @@ class DatabaseDataCompressionPreferenceDialogFragmentCompat mRecyclerView?.adapter = mCompressionAdapter database?.let { - compressionSelected = it.compressionAlgorithm - mCompressionAdapter?.setItems(it.availableCompressionAlgorithms, compressionSelected) + compressionSelected = it.compressionAlgorithm?.toNamedCompressionAlgorithm() + mCompressionAdapter?.setItems(it.availableCompressionAlgorithms.map { it.toNamedCompressionAlgorithm() }, compressionSelected) } } @@ -69,16 +71,16 @@ class DatabaseDataCompressionPreferenceDialogFragmentCompat if (compressionSelected != null) { val newCompression = compressionSelected val oldCompression = database.compressionAlgorithm - database.compressionAlgorithm = newCompression + database.compressionAlgorithm = newCompression?.toCompressionAlgorithm() if (oldCompression != null && newCompression != null) - saveCompression(oldCompression, newCompression) + saveCompression(oldCompression.toNamedCompressionAlgorithm(), newCompression) } } } } - override fun onItemSelected(item: CompressionAlgorithm) { + override fun onItemSelected(item: NamedCompressionAlgorithm) { this.compressionSelected = item } diff --git a/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseSavePreferenceDialogFragmentCompat.kt b/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseSavePreferenceDialogFragmentCompat.kt index 06a7bae25..ad48fdf14 100644 --- a/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseSavePreferenceDialogFragmentCompat.kt +++ b/app/src/main/java/com/kunzisoft/keepass/settings/preferencedialogfragment/DatabaseSavePreferenceDialogFragmentCompat.kt @@ -28,7 +28,7 @@ import com.kunzisoft.keepass.database.crypto.EncryptionAlgorithm import com.kunzisoft.keepass.database.crypto.kdf.KdfEngine import com.kunzisoft.keepass.database.element.Database import com.kunzisoft.keepass.database.element.Group -import com.kunzisoft.keepass.database.element.database.CompressionAlgorithm +import com.kunzisoft.keepass.database.element.database.NamedCompressionAlgorithm import com.kunzisoft.keepass.settings.PreferencesUtil import com.kunzisoft.keepass.tasks.ActionRunnable import com.kunzisoft.keepass.viewmodels.DatabaseViewModel @@ -90,8 +90,9 @@ abstract class DatabaseSavePreferenceDialogFragmentCompat mDatabaseViewModel.saveColor(oldColorString, newColorString, mDatabaseAutoSaveEnable) } - protected fun saveCompression(oldCompression: CompressionAlgorithm, - newCompression: CompressionAlgorithm) { + protected fun saveCompression(oldCompression: NamedCompressionAlgorithm, + newCompression: NamedCompressionAlgorithm + ) { mDatabaseViewModel.saveCompression(oldCompression, newCompression, mDatabaseAutoSaveEnable) } diff --git a/app/src/main/java/com/kunzisoft/keepass/viewmodels/DatabaseViewModel.kt b/app/src/main/java/com/kunzisoft/keepass/viewmodels/DatabaseViewModel.kt index 8608b144a..689fb114d 100644 --- a/app/src/main/java/com/kunzisoft/keepass/viewmodels/DatabaseViewModel.kt +++ b/app/src/main/java/com/kunzisoft/keepass/viewmodels/DatabaseViewModel.kt @@ -7,7 +7,7 @@ import com.kunzisoft.keepass.database.crypto.EncryptionAlgorithm import com.kunzisoft.keepass.database.crypto.kdf.KdfEngine import com.kunzisoft.keepass.database.element.Database import com.kunzisoft.keepass.database.element.Group -import com.kunzisoft.keepass.database.element.database.CompressionAlgorithm +import com.kunzisoft.keepass.database.element.database.NamedCompressionAlgorithm import com.kunzisoft.keepass.tasks.ActionRunnable class DatabaseViewModel: ViewModel() { @@ -119,8 +119,8 @@ class DatabaseViewModel: ViewModel() { _saveColor.value = SuperString(oldValue, newValue, save) } - fun saveCompression(oldValue: CompressionAlgorithm, - newValue: CompressionAlgorithm, + fun saveCompression(oldValue: NamedCompressionAlgorithm, + newValue: NamedCompressionAlgorithm, save: Boolean) { _saveCompression.value = SuperCompression(oldValue, newValue, save) } @@ -196,8 +196,8 @@ class DatabaseViewModel: ViewModel() { data class SuperLong(val oldValue: Long, val newValue: Long, val save: Boolean) - data class SuperCompression(val oldValue: CompressionAlgorithm, - val newValue: CompressionAlgorithm, + data class SuperCompression(val oldValue: NamedCompressionAlgorithm, + val newValue: NamedCompressionAlgorithm, val save: Boolean) data class SuperEncryption(val oldValue: EncryptionAlgorithm, val newValue: EncryptionAlgorithm, @@ -209,4 +209,4 @@ class DatabaseViewModel: ViewModel() { val newValue: Group?, val save: Boolean) -} \ No newline at end of file +} diff --git a/database/src/main/java/com/kunzisoft/keepass/database/element/Database.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/Database.kt index 788313e68..3f9a38b3d 100644 --- a/database/src/main/java/com/kunzisoft/keepass/database/element/Database.kt +++ b/database/src/main/java/com/kunzisoft/keepass/database/element/Database.kt @@ -308,7 +308,8 @@ class Database(private val iconPackChooser: InterfaceIconPackChooser) { } fun updateDataBinaryCompression(oldCompression: CompressionAlgorithm, - newCompression: CompressionAlgorithm) { + newCompression: CompressionAlgorithm + ) { mDatabaseKDBX?.changeBinaryCompression(oldCompression, newCompression) dataModifiedSinceLastLoading = true } diff --git a/database/src/main/java/com/kunzisoft/keepass/database/element/database/CompressionAlgorithm.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/database/CompressionAlgorithm.kt index b362baded..b41ad76f5 100644 --- a/database/src/main/java/com/kunzisoft/keepass/database/element/database/CompressionAlgorithm.kt +++ b/database/src/main/java/com/kunzisoft/keepass/database/element/database/CompressionAlgorithm.kt @@ -1,6 +1,6 @@ /* * Copyright 2019 Jeremy Jamet / Kunzisoft. - * + * * This file is part of KeePassDX. * * KeePassDX is free software: you can redistribute it and/or modify @@ -19,46 +19,7 @@ */ package com.kunzisoft.keepass.database.element.database -import android.content.res.Resources -import android.os.Parcel -import android.os.Parcelable -import com.kunzisoft.keepass.database.R -import com.kunzisoft.keepass.utils.ObjectNameResource -import com.kunzisoft.keepass.utils.readEnum -import com.kunzisoft.keepass.utils.writeEnum - - -// Note: We can get away with using int's to store unsigned 32-bit ints -// since we won't do arithmetic on these values (also unlikely to -// reach negative ids). -enum class CompressionAlgorithm : ObjectNameResource, Parcelable { - +enum class CompressionAlgorithm { None, GZip; - - override fun writeToParcel(dest: Parcel, flags: Int) { - dest.writeEnum(this) - } - - override fun describeContents(): Int { - return 0 - } - - override fun getName(resources: Resources): String { - return when (this) { - None -> resources.getString(R.string.compression_none) - GZip -> resources.getString(R.string.compression_gzip) - } - } - - companion object CREATOR : Parcelable.Creator { - override fun createFromParcel(parcel: Parcel): CompressionAlgorithm { - return parcel.readEnum() ?: None - } - - override fun newArray(size: Int): Array { - return arrayOfNulls(size) - } - } - } diff --git a/database/src/main/java/com/kunzisoft/keepass/database/file/input/DatabaseInput.kt b/database/src/main/java/com/kunzisoft/keepass/database/file/input/DatabaseInput.kt index d46fe6cea..2581f84a2 100644 --- a/database/src/main/java/com/kunzisoft/keepass/database/file/input/DatabaseInput.kt +++ b/database/src/main/java/com/kunzisoft/keepass/database/file/input/DatabaseInput.kt @@ -41,7 +41,7 @@ abstract class DatabaseInput> (protected var m assignMasterKey: (() -> Unit)): D protected fun startKeyTimer(progressTaskUpdater: ProgressTaskUpdater?) { - progressTaskUpdater?.updateMessage(R.string.retrieving_db_key) + progressTaskUpdater?.updateMessageRetrievingDBKey() Log.d(TAG, "Start retrieving database key...") startTimeKey = System.currentTimeMillis() } @@ -51,7 +51,7 @@ abstract class DatabaseInput> (protected var m } protected fun startContentTimer(progressTaskUpdater: ProgressTaskUpdater?) { - progressTaskUpdater?.updateMessage(R.string.decrypting_db) + progressTaskUpdater?.updateMessageDecryptingDB() Log.d(TAG, "Start decrypting database content...") startTimeContent = System.currentTimeMillis() } diff --git a/database/src/main/java/com/kunzisoft/keepass/tasks/ProgressTaskUpdater.kt b/database/src/main/java/com/kunzisoft/keepass/tasks/ProgressTaskUpdater.kt index b3fed4b9f..4daf39233 100644 --- a/database/src/main/java/com/kunzisoft/keepass/tasks/ProgressTaskUpdater.kt +++ b/database/src/main/java/com/kunzisoft/keepass/tasks/ProgressTaskUpdater.kt @@ -19,8 +19,7 @@ */ package com.kunzisoft.keepass.tasks -import androidx.annotation.StringRes - interface ProgressTaskUpdater { - fun updateMessage(@StringRes resId: Int) + fun updateMessageRetrievingDBKey() + fun updateMessageDecryptingDB() } diff --git a/database/src/main/res/values/strings.xml b/database/src/main/res/values/strings.xml index 084d44889..2a3d62da2 100644 --- a/database/src/main/res/values/strings.xml +++ b/database/src/main/res/values/strings.xml @@ -1,11 +1,5 @@ - None - Gzip Recycle bin Templates - - Retrieving database key… - Decrypting database content… - From 2206184bcb5b91ccac155c1fc19a1e4d3eac5d3d Mon Sep 17 00:00:00 2001 From: GianpaMX Date: Wed, 26 Oct 2022 16:37:08 +0100 Subject: [PATCH 6/9] recycler bin title --- .../activities/legacy/DatabaseLockActivity.kt | 2 +- .../database/NamedCompressionAlgorithm.kt | 2 +- .../services/DatabaseTaskNotificationService.kt | 1 + .../settings/NestedDatabaseSettingsFragment.kt | 2 +- .../database/action/node/DeleteNodesRunnable.kt | 5 +++-- .../keepass/database/element/Database.kt | 16 ++++++++-------- .../database/element/database/DatabaseKDBX.kt | 6 +++--- database/src/main/res/values/strings.xml | 1 - 8 files changed, 18 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/com/kunzisoft/keepass/activities/legacy/DatabaseLockActivity.kt b/app/src/main/java/com/kunzisoft/keepass/activities/legacy/DatabaseLockActivity.kt index 415f75807..eddb25254 100644 --- a/app/src/main/java/com/kunzisoft/keepass/activities/legacy/DatabaseLockActivity.kt +++ b/app/src/main/java/com/kunzisoft/keepass/activities/legacy/DatabaseLockActivity.kt @@ -319,7 +319,7 @@ abstract class DatabaseLockActivity : DatabaseModeActivity(), mDatabase?.let { database -> // If recycle bin enabled, ensure it exists if (database.isRecycleBinEnabled) { - database.ensureRecycleBinExists(resources) + database.ensureRecycleBinExists(resources.getString(R.string.recycle_bin)) } // If recycle bin enabled and not in recycle bin, move in recycle bin diff --git a/app/src/main/java/com/kunzisoft/keepass/database/element/database/NamedCompressionAlgorithm.kt b/app/src/main/java/com/kunzisoft/keepass/database/element/database/NamedCompressionAlgorithm.kt index c289f1d93..2370e8142 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/element/database/NamedCompressionAlgorithm.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/element/database/NamedCompressionAlgorithm.kt @@ -22,7 +22,7 @@ package com.kunzisoft.keepass.database.element.database import android.content.res.Resources import android.os.Parcel import android.os.Parcelable -import com.kunzisoft.keepass.database.R +import com.kunzisoft.keepass.R import com.kunzisoft.keepass.utils.ObjectNameResource import com.kunzisoft.keepass.utils.readEnum import com.kunzisoft.keepass.utils.writeEnum diff --git a/app/src/main/java/com/kunzisoft/keepass/services/DatabaseTaskNotificationService.kt b/app/src/main/java/com/kunzisoft/keepass/services/DatabaseTaskNotificationService.kt index 76aeaf2a3..3acf9d963 100644 --- a/app/src/main/java/com/kunzisoft/keepass/services/DatabaseTaskNotificationService.kt +++ b/app/src/main/java/com/kunzisoft/keepass/services/DatabaseTaskNotificationService.kt @@ -1050,6 +1050,7 @@ open class DatabaseTaskNotificationService : LockNotificationService(), Progress DeleteNodesRunnable(this, database, getListNodesFromBundle(database, intent.extras!!), + resources.getString(R.string.recycle_bin), !database.isReadOnly && intent.getBooleanExtra(SAVE_DATABASE_KEY, false), AfterActionNodesRunnable() ) { hardwareKey, seed -> diff --git a/app/src/main/java/com/kunzisoft/keepass/settings/NestedDatabaseSettingsFragment.kt b/app/src/main/java/com/kunzisoft/keepass/settings/NestedDatabaseSettingsFragment.kt index c14c13090..b72c4cb4e 100644 --- a/app/src/main/java/com/kunzisoft/keepass/settings/NestedDatabaseSettingsFragment.kt +++ b/app/src/main/java/com/kunzisoft/keepass/settings/NestedDatabaseSettingsFragment.kt @@ -217,7 +217,7 @@ class NestedDatabaseSettingsFragment : NestedSettingsFragment(), DatabaseRetriev isEnabled = if (!mDatabaseReadOnly) { setOnPreferenceChangeListener { _, newValue -> val recycleBinEnabled = newValue as Boolean - database.enableRecycleBin(recycleBinEnabled, resources) + database.enableRecycleBin(recycleBinEnabled, resources.getString(R.string.recycle_bin)) refreshRecycleBinGroup(database) // Save the database if not in readonly mode saveDatabase(mDatabaseAutoSaveEnabled) diff --git a/database/src/main/java/com/kunzisoft/keepass/database/action/node/DeleteNodesRunnable.kt b/database/src/main/java/com/kunzisoft/keepass/database/action/node/DeleteNodesRunnable.kt index 0aca84eac..dd5d126e5 100644 --- a/database/src/main/java/com/kunzisoft/keepass/database/action/node/DeleteNodesRunnable.kt +++ b/database/src/main/java/com/kunzisoft/keepass/database/action/node/DeleteNodesRunnable.kt @@ -30,6 +30,7 @@ import com.kunzisoft.keepass.hardware.HardwareKey class DeleteNodesRunnable(context: Context, database: Database, private val mNodesToDelete: List, + private val recyclerBinTitle: String, save: Boolean, afterActionNodesFinish: AfterActionNodesFinish, challengeResponseRetriever: (HardwareKey, ByteArray?) -> ByteArray) @@ -54,7 +55,7 @@ class DeleteNodesRunnable(context: Context, // Remove Node from parent mCanRecycle = database.canRecycle(groupToDelete) if (mCanRecycle) { - database.recycle(groupToDelete, context.resources) + database.recycle(groupToDelete, recyclerBinTitle) groupToDelete.setPreviousParentGroup(mOldParent) groupToDelete.touch(modified = true, touchParents = true) } else { @@ -68,7 +69,7 @@ class DeleteNodesRunnable(context: Context, // Remove Node from parent mCanRecycle = database.canRecycle(entryToDelete) if (mCanRecycle) { - database.recycle(entryToDelete, context.resources) + database.recycle(entryToDelete, recyclerBinTitle) entryToDelete.setPreviousParentGroup(mOldParent) entryToDelete.touch(modified = true, touchParents = true) } else { diff --git a/database/src/main/java/com/kunzisoft/keepass/database/element/Database.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/Database.kt index 3f9a38b3d..78dd693e5 100644 --- a/database/src/main/java/com/kunzisoft/keepass/database/element/Database.kt +++ b/database/src/main/java/com/kunzisoft/keepass/database/element/Database.kt @@ -466,10 +466,10 @@ class Database(private val iconPackChooser: InterfaceIconPackChooser) { // Backup is always enabled in KDB database get() = mDatabaseKDB != null || mDatabaseKDBX?.isRecycleBinEnabled ?: false - fun enableRecycleBin(enable: Boolean, resources: Resources) { + fun enableRecycleBin(enable: Boolean, recyclerBinTitle: String) { mDatabaseKDBX?.isRecycleBinEnabled = enable if (enable) { - ensureRecycleBinExists(resources) + ensureRecycleBinExists(recyclerBinTitle) } else { mDatabaseKDBX?.removeRecycleBin() } @@ -1221,9 +1221,9 @@ class Database(private val iconPackChooser: InterfaceIconPackChooser) { }) } - fun ensureRecycleBinExists(resources: Resources) { + fun ensureRecycleBinExists(recyclerBinTitle: String) { mDatabaseKDB?.ensureBackupExists() - mDatabaseKDBX?.ensureRecycleBinExists(resources) + mDatabaseKDBX?.ensureRecycleBinExists(recyclerBinTitle) } fun canRecycle(entry: Entry): Boolean { @@ -1248,8 +1248,8 @@ class Database(private val iconPackChooser: InterfaceIconPackChooser) { return canRecycle ?: false } - fun recycle(entry: Entry, resources: Resources) { - ensureRecycleBinExists(resources) + fun recycle(entry: Entry, recyclerBinTitle: String) { + ensureRecycleBinExists(recyclerBinTitle) entry.parent?.let { parent -> removeEntryFrom(entry, parent) } @@ -1259,8 +1259,8 @@ class Database(private val iconPackChooser: InterfaceIconPackChooser) { entry.afterAssignNewParent() } - fun recycle(group: Group, resources: Resources) { - ensureRecycleBinExists(resources) + fun recycle(group: Group, recyclerBinTitle: String) { + ensureRecycleBinExists(recyclerBinTitle) group.parent?.let { parent -> removeGroupFrom(group, parent) } diff --git a/database/src/main/java/com/kunzisoft/keepass/database/element/database/DatabaseKDBX.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/database/DatabaseKDBX.kt index 906ef0956..0f1d263b7 100644 --- a/database/src/main/java/com/kunzisoft/keepass/database/element/database/DatabaseKDBX.kt +++ b/database/src/main/java/com/kunzisoft/keepass/database/element/database/DatabaseKDBX.kt @@ -753,15 +753,15 @@ class DatabaseKDBX : DatabaseVersioned { * Ensure that the recycle bin tree exists, if enabled and create it * if it doesn't exist */ - fun ensureRecycleBinExists(resources: Resources) { + fun ensureRecycleBinExists(recyclerBinTitle: String) { if (recycleBin == null) { // Create recycle bin only if a group with a valid name don't already exists val firstGroupWithValidName = getGroupIndexes().firstOrNull { - it.title == resources.getString(R.string.recycle_bin) + it.title == recyclerBinTitle } val recycleBinGroup = if (firstGroupWithValidName == null) { val newRecycleBinGroup = createGroup().apply { - title = resources.getString(R.string.recycle_bin) + title = recyclerBinTitle icon.standard = getStandardIcon(IconImageStandard.TRASH_ID) enableAutoType = false enableSearching = false diff --git a/database/src/main/res/values/strings.xml b/database/src/main/res/values/strings.xml index 2a3d62da2..7c76d77ff 100644 --- a/database/src/main/res/values/strings.xml +++ b/database/src/main/res/values/strings.xml @@ -1,5 +1,4 @@ - Recycle bin Templates From 1495c442aca5c5e5ad63897ef40ec6623b0c2a46 Mon Sep 17 00:00:00 2001 From: GianpaMX Date: Wed, 26 Oct 2022 17:16:38 +0100 Subject: [PATCH 7/9] default template group name --- .../keepass/settings/NestedDatabaseSettingsFragment.kt | 2 +- .../keepass/database/element/template/TemplateEngine.kt | 4 ---- database/src/main/res/values/strings.xml | 4 ---- 3 files changed, 1 insertion(+), 9 deletions(-) delete mode 100644 database/src/main/res/values/strings.xml diff --git a/app/src/main/java/com/kunzisoft/keepass/settings/NestedDatabaseSettingsFragment.kt b/app/src/main/java/com/kunzisoft/keepass/settings/NestedDatabaseSettingsFragment.kt index b72c4cb4e..6d784d421 100644 --- a/app/src/main/java/com/kunzisoft/keepass/settings/NestedDatabaseSettingsFragment.kt +++ b/app/src/main/java/com/kunzisoft/keepass/settings/NestedDatabaseSettingsFragment.kt @@ -251,7 +251,7 @@ class NestedDatabaseSettingsFragment : NestedSettingsFragment(), DatabaseRetriev setOnPreferenceChangeListener { _, newValue -> val templatesEnabled = newValue as Boolean database.enableTemplates(templatesEnabled, - TemplateEngine.getDefaultTemplateGroupName(resources) + resources.getString(R.string.templates) ) refreshTemplatesGroup(database) // Save the database if not in readonly mode diff --git a/database/src/main/java/com/kunzisoft/keepass/database/element/template/TemplateEngine.kt b/database/src/main/java/com/kunzisoft/keepass/database/element/template/TemplateEngine.kt index 47a6c628f..85bd7a16d 100644 --- a/database/src/main/java/com/kunzisoft/keepass/database/element/template/TemplateEngine.kt +++ b/database/src/main/java/com/kunzisoft/keepass/database/element/template/TemplateEngine.kt @@ -211,10 +211,6 @@ abstract class TemplateEngine(private val mDatabase: DatabaseKDBX) { IconImage(IconImageStandard(IconImageStandard.BUILD_ID)), sections) } - - fun getDefaultTemplateGroupName(resources: Resources): String { - return resources.getString(R.string.templates) - } fun getDefaults(): List