From 7d7e3f4ad689253f17de7fbfde1d200398c62a7d Mon Sep 17 00:00:00 2001 From: GianpaMX Date: Tue, 25 Oct 2022 18:00:31 +0100 Subject: [PATCH] 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… + +