diff --git a/CHANGELOG b/CHANGELOG
index 5e6f2b8b8..b08419723 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -2,6 +2,7 @@ KeepassDX (2.5.0.0beta10)
* Upgrade translations
* Fix classic dark theme
* Add Material Icon Pack to the Free version
+ * Update fingerprint state with checkbox
* Fix bugs
KeepassDX (2.5.0.0beta9)
diff --git a/FAQ.md b/FAQ.md
new file mode 100644
index 000000000..1b8e76c71
--- /dev/null
+++ b/FAQ.md
@@ -0,0 +1,50 @@
+# F.A.Q.
+
+## Why KeePass DX?
+
+KeePass DX is an **Android password manager** implemented from Keepass password manager.
+
+KeePass DX was created to meet the security and usability needs of a KeePass application on Android :
+
+ - To be easy to use with **secure password management and form filling tools**.
+ - To use only tools under **open source license** to guarantee the security of the application (With [open source store](https://f-droid.org/en/) and no closed API).
+ - To be in a **native langage** (java) for weight, security and a better integration of the application.
+ - To respect **Android design, architecture and ergonomic**.
+
+## What makes KeePass DX stand out from other password managers?
+
+ - We **do not recover your sensitive data** on a private server or a closed cloud, you have control of your passwords.
+ - We respect **KeePass file standards** to maintain compatibility and data porting on different devices (computers and portable devices with different operating system).
+ - The code is **open source**, which implies increased **security**, you can check how the encryption algorithms are implemented.
+ - We remain attentive to **your needs** and we can even integrate the features that you have defined.
+ - We **do not put advertising** even in the free version.
+
+## How am I sure my passwords are safely stored on the application?
+
+- We allow users to save and use passwords, keys and digital identities in a secure way by **integrating the last encryption algorithms** and **Android architecture standards**.
+- You can increase the security of your database by increasing the rounds of encryption keys. *(In Settings -> Database Settings when your database is open)* **Warning**: *Increase the number of rounds sparingly to have a reasonable opening time.*
+
+## Can I store my data on a cloud storage?
+
+**Yes** this is possible. Otherwise, we **recommend using cloud with personal server and open source license**, like [NextCloud](https://f-droid.org/en/packages/com.nextcloud.client/) to be sure how your databases are stored.
+
+## Can I recover my passwords on another device if I loose my main device?
+
+**Yes** you can, but you **must first save the .kdb or .kdbx file from your database to an external storage** *(like a hardrive or a cloud)*.
+We recommend you save your data after each modification so incase you loose your android device you could retrieve the data and import it into the new KeePass DX installed on the new android device.
+
+## Why not an online version?
+
+The offline and online client concepts only exists with Keepass2Android because the file access network tools are directly integrated into the code of the main application. Which is a very dubious choice knowing that **it is not normally the purpose of a password management application to take care of external file synchronization on clouds** (which can be under closed licensed and recover your data base), it is rather the purpose of the [file management application](https://developer.android.com/guide/topics/providers/document-provider).
+
+## Can I open my database easily other than with a password?
+
+**Yes**, we have integrated a secure openning option of fingerprint for android devices that support this feature, so no one can access the application without scanning his/her fingerprint or fill a master key.
+
+## Can I open my database without my master key (master password and/or key file)?
+
+**No**, you can not open a database file without the master password (and / or) the associated key file. Be sure to remember your master password and save the key file in a safe place.
+
+## Can I suggest features and report bugs for the application?
+**Yes**, we welcome this you could go ahead and do that on our github:
+https://github.com/Kunzisoft/KeePassDX
diff --git a/ReadMe.md b/ReadMe.md
index 2a88da271..2eac491b9 100644
--- a/ReadMe.md
+++ b/ReadMe.md
@@ -1,31 +1,31 @@
# Android Keepass DX
-
Keepass DX is a multi-format KeePass manager for Android devices. The application allows to create keys and passwords in a secure way by integrating with the Android design standards.
+
Keepass DX is a **multi-format KeePass manager for Android devices**. The application allows to create keys and passwords in a secure way by integrating with the Android design standards.
### Features
* Create database files / entries and groups
- * Support for .kdb and .kdbx files (version 1 to 4) with AES - Twofish - ChaCha20 - Argon2 algorithm
- * Compatible with the majority of alternative programs (KeePass, KeePassX, KeePass XC...)
- * Allows fast copy of fields and opening of URI / URL
- * Fingerprint for fast unlocking
- * Material design with themes
- * AutoFill and Integration
- * Precise management of settings
+ * Support for **.kdb** and **.kdbx** files (version 1 to 4) with AES - Twofish - ChaCha20 - Argon2 algorithm
+ * **Compatible** with the majority of alternative programs (KeePass, KeePassX, KeePass XC...)
+ * Allows **fast copy** of fields and opening of URI / URL
+ * **Fingerprint** for fast unlocking
+ * Material design with **themes**
+ * **AutoFill** and Integration
+ * Precise management of **settings**
-Keepass DX is opensource and ad-free.
+Keepass DX is **open source** and **ad-free**.
## What is KeePass DX?
-Today you need to remember many passwords. You need a password for your e-mail account, your website's FTP password, online passwords (like website member account), etc. etc. etc. The list is endless. Also, you should use different passwords for each account. Because if you use only one password everywhere and someone gets this password you have a problem... A serious problem. The thief would have access to your e-mail account, website, etc. Unimaginable.
+Today you need to remember many passwords. You need a password for your e-mail account, your website's FTP password, online passwords (like website member account), etc. etc. etc. The list is endless. Also, you **should use different passwords for each account**. Because if you use only one password everywhere and someone gets this password you have a problem... A serious problem. The thief would have access to your e-mail account, website, etc. Unimaginable.
-KeePass DX is a free open source password manager for Android, which helps you to manage your passwords in a secure way. You can put all your passwords in one database, which is locked with one master key or a key file. So you only have to remember one single master password or select the key file to unlock the whole database. The databases are encrypted using the best and most secure encryption algorithms currently known.
+KeePass DX is a **free open source password manager for Android**, which helps you to **manage your passwords in a secure way**. You can put all your passwords in one database, which is locked with one **master key** or a **key file**. So you **only have to remember one single master password or select the key file** to unlock the whole database. The databases are encrypted using the best and **most secure encryption algorithms** currently known.
## Is it really free?
-Yes, KeePass DX is under free license (OSI certified) and without advertising. You can have a look at its full source and check whether the encryption algorithms are implemented correctly.
+Yes, KeePass DX is under **free license (OSI certified)** and **without advertising**. You can have a look at its full source and check whether the encryption algorithms are implemented correctly.
*Note : If you access the application from a store, visual features may not be available to incentivize the contribution to the work of open source projects. These optional visuals are accessible after a donation (and a small congratulation message :) or the purchase of an extended version, but do not worry, the main features remain completely free.*
@@ -50,15 +50,19 @@ You can contribute in different ways to help us on our work.
alt="Get it on Google Play"
height="80">](https://play.google.com/store/apps/details?id=com.kunzisoft.keepass.free)
+## F.A.Q.
+
+Other questions? You can read the [F.A.Q.](https://raw.githubusercontent.com/Kunzisoft/KeePassDX/master/FAQ.md)
+
## Other devices
-- [KeePass XC](https://keepassxc.org/) (https://keepassxc.org/) works with **GNU/Linux**, **Mac** and **Windows**, is updated regulary and under the terms of the GNU General Public License. It's the recommended version for computers.
+- [KeePass XC](https://keepassxc.org/) (https://keepassxc.org/) works with **GNU/Linux**, **Mac** and **Windows**, is updated regularly and under the terms of the GNU General Public License. This is the recommended version for computers.
- [KeePass](https://keepass.info/) (https://keepass.info/) is the historical project, with good technical documentation for standardized database files but only running on **Windows**.
## License
- Copyright (c) 2017 Jeremy Jamet / Kunzisoft.
+ Copyright (c) 2017 Jeremy Jamet / [Kunzisoft](https://www.kunzisoft.com).
This file is part of KeePass DX.
@@ -75,4 +79,4 @@ You can contribute in different ways to help us on our work.
You should have received a copy of the GNU General Public License
along with KeePass DX. If not, see .
- This project is a fork of [KeepassDroid](https://github.com/bpellin/keepassdroid) by bpellin.
+ *This project is a fork of [KeepassDroid](https://github.com/bpellin/keepassdroid) by bpellin.*
diff --git a/app/build.gradle b/app/build.gradle
index b1e069938..802ec3719 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -16,8 +16,7 @@ android {
testInstrumentationRunner = "android.test.InstrumentationTestRunner"
ndk {
- abiFilters 'x86', 'x86_64', 'armeabi', 'armeabi-v7a',
- 'arm64-v8a', 'mips', 'mips64'
+ abiFilters 'x86', 'x86_64', 'armeabi-v7a', 'arm64-v8a'
}
buildConfigField "String[]", "ICON_PACKS", "{\"classic\",\"material\"}"
diff --git a/app/src/main/java/com/kunzisoft/keepass/fingerprint/FingerPrintAnimatedVector.java b/app/src/main/java/com/kunzisoft/keepass/fingerprint/FingerPrintAnimatedVector.java
index d156455dc..8db75149a 100644
--- a/app/src/main/java/com/kunzisoft/keepass/fingerprint/FingerPrintAnimatedVector.java
+++ b/app/src/main/java/com/kunzisoft/keepass/fingerprint/FingerPrintAnimatedVector.java
@@ -42,13 +42,17 @@ public class FingerPrintAnimatedVector {
public void startScan() {
scanFingerprint.registerAnimationCallback(new Animatable2.AnimationCallback() {
public void onAnimationEnd(Drawable drawable) {
- scanFingerprint.start();
+ if (!scanFingerprint.isRunning())
+ scanFingerprint.start();
}
});
- scanFingerprint.start();
+
+ if (!scanFingerprint.isRunning())
+ scanFingerprint.start();
}
public void stopScan() {
- scanFingerprint.stop();
+ if (scanFingerprint.isRunning())
+ scanFingerprint.stop();
}
}
diff --git a/app/src/main/java/com/kunzisoft/keepass/fingerprint/FingerPrintHelper.java b/app/src/main/java/com/kunzisoft/keepass/fingerprint/FingerPrintHelper.java
index 152188f39..1152c9be0 100644
--- a/app/src/main/java/com/kunzisoft/keepass/fingerprint/FingerPrintHelper.java
+++ b/app/src/main/java/com/kunzisoft/keepass/fingerprint/FingerPrintHelper.java
@@ -131,7 +131,7 @@ public class FingerPrintHelper {
return isFingerprintInitialized(true);
}
- public boolean isFingerprintInitialized(boolean throwException) {
+ private boolean isFingerprintInitialized(boolean throwException) {
boolean isFingerprintInit = hasEnrolledFingerprints() && initOk;
if (!isFingerprintInit && fingerPrintCallback != null) {
if(throwException)
@@ -336,7 +336,7 @@ public class FingerPrintHelper {
}
public enum Mode {
- NOT_CONFIGURED_MODE, STORE_MODE, OPEN_MODE
+ NOT_CONFIGURED_MODE, WAITING_PASSWORD_MODE, STORE_MODE, OPEN_MODE
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/kunzisoft/keepass/password/PasswordActivity.java b/app/src/main/java/com/kunzisoft/keepass/password/PasswordActivity.java
index ab0e5e1c9..6fbbec644 100644
--- a/app/src/main/java/com/kunzisoft/keepass/password/PasswordActivity.java
+++ b/app/src/main/java/com/kunzisoft/keepass/password/PasswordActivity.java
@@ -55,7 +55,6 @@ import com.getkeepsafe.taptargetview.TapTarget;
import com.getkeepsafe.taptargetview.TapTargetView;
import com.kunzisoft.keepass.R;
import com.kunzisoft.keepass.activities.GroupActivity;
-import com.kunzisoft.keepass.activities.ListNodesActivity;
import com.kunzisoft.keepass.activities.LockingActivity;
import com.kunzisoft.keepass.app.App;
import com.kunzisoft.keepass.autofill.AutofillHelper;
@@ -124,8 +123,6 @@ public class PasswordActivity extends StylishActivity
private CompoundButton checkboxKeyfileView;
private CompoundButton checkboxDefaultDatabaseView;
- private ProgressTaskDialogFragment loadingDatabaseDialog;
-
private DefaultCheckChange defaultCheckChange;
private ValidateButtonViewClickListener validateButtonViewClickListener;
@@ -294,6 +291,7 @@ public class PasswordActivity extends StylishActivity
fingerprintTextView = findViewById(R.id.fingerprint_label);
fingerprintImageView = findViewById(R.id.fingerprint_image);
initForFingerprint();
+ // Init the fingerprint animation
fingerPrintAnimatedVector = new FingerPrintAnimatedVector(this,
fingerprintImageView);
}
@@ -325,6 +323,19 @@ public class PasswordActivity extends StylishActivity
// For check shutdown
super.onResume();
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+ // Check if fingerprint well init (be called the first time the fingerprint is configured
+ // and the activity still active)
+ if (fingerPrintHelper == null || !fingerPrintHelper.isFingerprintInitialized()) {
+ initForFingerprint();
+ }
+
+ // Start the animation in all cases
+ if (fingerPrintAnimatedVector != null) {
+ fingerPrintAnimatedVector.startScan();
+ }
+ }
+
new UriIntentInitTask(this, mRememberKeyfile)
.execute(getIntent());
}
@@ -434,9 +445,6 @@ public class PasswordActivity extends StylishActivity
// checks if fingerprint is available, will also start listening for fingerprints when available
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
checkFingerprintAvailability();
- if (fingerPrintAnimatedVector != null) {
- fingerPrintAnimatedVector.startScan();
- }
}
// If Activity is launch with a password and want to open directly
@@ -490,32 +498,18 @@ public class PasswordActivity extends StylishActivity
fingerPrintHelper = new FingerPrintHelper(this, this);
- // when text entered we can enable the logon/purchase button and if required update encryption/decryption mode
- passwordView.addTextChangedListener(new TextWatcher() {
- @Override
- public void beforeTextChanged(
- final CharSequence s,
- final int start,
- final int count,
- final int after) {}
-
- @Override
- public void onTextChanged(
- final CharSequence s,
- final int start,
- final int before,
- final int count) {}
-
- @Override
- public void afterTextChanged(final Editable s) {
- if ( !fingerprintMustBeConfigured ) {
- final boolean validInput = s.length() > 0;
- // encrypt or decrypt mode based on how much input or not
- setFingerPrintView(validInput ? R.string.store_with_fingerprint : R.string.scanning_fingerprint);
- if (validInput)
- toggleFingerprintMode(FingerPrintHelper.Mode.STORE_MODE);
- else
+ checkboxPasswordView.setOnCheckedChangeListener((compoundButton, checked) -> {
+ if ( !fingerprintMustBeConfigured ) {
+ // encrypt or decrypt mode based on how much input or not
+ if (checked) {
+ toggleFingerprintMode(FingerPrintHelper.Mode.STORE_MODE);
+ } else {
+ if (!prefsNoBackup.contains(getPreferenceKeyValue())) {
+ // This happens when no fingerprints are registered.
+ toggleFingerprintMode(FingerPrintHelper.Mode.WAITING_PASSWORD_MODE);
+ } else {
toggleFingerprintMode(FingerPrintHelper.Mode.OPEN_MODE);
+ }
}
}
});
@@ -600,8 +594,25 @@ public class PasswordActivity extends StylishActivity
}
}
+ @RequiresApi(api = Build.VERSION_CODES.M)
+ private void initWaitData() {
+ setFingerPrintView(R.string.no_password_stored, true);
+ fingerPrintMode = FingerPrintHelper.Mode.WAITING_PASSWORD_MODE;
+ }
+
@RequiresApi(api = Build.VERSION_CODES.M)
private synchronized void toggleFingerprintMode(final FingerPrintHelper.Mode newMode) {
+ switch (newMode) {
+ case WAITING_PASSWORD_MODE:
+ setFingerPrintView(R.string.no_password_stored, true);
+ break;
+ case STORE_MODE:
+ setFingerPrintView(R.string.store_with_fingerprint);
+ break;
+ case OPEN_MODE:
+ setFingerPrintView(R.string.scanning_fingerprint);
+ break;
+ }
if( !newMode.equals(fingerPrintMode) ) {
fingerPrintMode = newMode;
reInitWithFingerprintMode();
@@ -614,6 +625,9 @@ public class PasswordActivity extends StylishActivity
case STORE_MODE:
initEncryptData();
break;
+ case WAITING_PASSWORD_MODE:
+ initWaitData();
+ break;
case OPEN_MODE:
initDecryptData();
break;
@@ -645,10 +659,6 @@ public class PasswordActivity extends StylishActivity
setFingerPrintView(textId, false);
}
- private void setFingerPrintView(final CharSequence text) {
- setFingerPrintView(text, false);
- }
-
private void setFingerPrintView(final int textId, boolean lock) {
setFingerPrintView(getString(textId), lock);
}
@@ -656,7 +666,7 @@ public class PasswordActivity extends StylishActivity
private void setFingerPrintView(final CharSequence text, boolean lock) {
runOnUiThread(() -> {
if (lock) {
- fingerprintContainerView.setAlpha(0.6f);
+ fingerprintContainerView.setAlpha(0.8f);
} else
fingerprintContainerView.setAlpha(1f);
fingerprintTextView.setText(text);
@@ -690,9 +700,13 @@ public class PasswordActivity extends StylishActivity
// fingerprint available but no stored password found yet for this DB so show info don't listen
if (!prefsNoBackup.contains(getPreferenceKeyValue())) {
- setFingerPrintView(R.string.no_password_stored);
- // listen for encryption
- initEncryptData();
+ if (checkboxPasswordView.isChecked()) {
+ // listen for encryption
+ initEncryptData();
+ } else {
+ // wait for typing
+ initWaitData();
+ }
}
// all is set here so we can confirm to user and start listening for fingerprints
else {
@@ -741,7 +755,9 @@ public class PasswordActivity extends StylishActivity
@RequiresApi(api = Build.VERSION_CODES.M)
@Override
public void onFingerPrintException(Exception e) {
- showError(getString(R.string.fingerprint_error, e.getMessage()));
+ // Don't show error here;
+ // showError(getString(R.string.fingerprint_error, e.getMessage()));
+ // Can be uninit in Activity and init in fragment
setFingerPrintView(e.getLocalizedMessage(), true);
}
diff --git a/app/src/main/res/layout-v23/fingerprint_show.xml b/app/src/main/res/layout-v23/fingerprint_show.xml
index 312e1dff4..16532183c 100644
--- a/app/src/main/res/layout-v23/fingerprint_show.xml
+++ b/app/src/main/res/layout-v23/fingerprint_show.xml
@@ -4,27 +4,34 @@
android:id="@+id/fingerprint_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:padding="@dimen/default_margin"
tools:visibility="gone">
-
+
+
+ android:gravity="center_vertical|start" />
diff --git a/app/src/main/res/layout/password.xml b/app/src/main/res/layout/password.xml
index e00840e8a..22d03cd29 100644
--- a/app/src/main/res/layout/password.xml
+++ b/app/src/main/res/layout/password.xml
@@ -48,6 +48,18 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="?attr/actionBarSize">
+
@@ -172,18 +184,6 @@
android:tint="?attr/colorAccentCompat" />
-
-
diff --git a/app/src/main/res/layout/set_password.xml b/app/src/main/res/layout/set_password.xml
index 5e90a98de..036d5fbca 100644
--- a/app/src/main/res/layout/set_password.xml
+++ b/app/src/main/res/layout/set_password.xml
@@ -17,112 +17,114 @@
You should have received a copy of the GNU General Public License
along with KeePass DX. If not, see .
-->
-
-
+
-
+
-
-
+
+ android:layout_margin="@dimen/default_margin"
+ android:orientation="vertical">
-
-
-
-
-
-
+
+
+
-
+ app:passwordToggleEnabled="true"
+ app:passwordToggleTint="?attr/colorAccent">
+
+
+
+
+
-
+
-
+
-
-
-
-
+
+ android:layout_margin="@dimen/default_margin"
+ android:orientation="vertical">
-
-
-
-
-
-
+ android:text="@string/entry_keyfile"/>
+
-
-
-
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index 677de4ba3..cbc178d55 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -215,7 +215,7 @@
Paramètres -> Sécurité -> Empreinte digitale
Tapez votre mot de passe dans Keepass DX
Scannez votre empreinte digitale pour stocker votre mot de passe maître en toute sécurité
- Il suffit de scanner votre empreinte digitale dans Keepass DX lorsque le champ mot de passe est vide pour ouvrir la base de données
+ Scanner votre empreinte digitale lorsque la case à cocher du mot de passe n\'est pas cochée pour ouvrir la base de données
Usage
Empreinte digitale
Écoute d\'empreintes digitales
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 965becbb9..6541c0860 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -216,7 +216,7 @@
Settings -> Security -> Fingerprint
Type your password in Keepass DX
Scan your fingerprint to store your master password securely
- Just scan your fingerprint in Keepass DX when the password field is empty to open the database
+ Scan your fingerprint when the password checkbox is unchecked to open the database
Usage
Fingerprint
Fingerprint listening
diff --git a/app/src/main/res/values/style_blue.xml b/app/src/main/res/values/style_blue.xml
index 7815d002b..66ec63ff1 100644
--- a/app/src/main/res/values/style_blue.xml
+++ b/app/src/main/res/values/style_blue.xml
@@ -35,7 +35,9 @@
- @color/blue_lighter
- @color/colorTextInverse
- @color/colorTextInverse
- - @color/colorTextSecondary
+ - @color/colorTextInverse
+ - @color/colorTextInverse
+ - @color/blue_lighter
-
-
+
+
+
diff --git a/fastlane/metadata/android/en-US/changelogs/10.txt b/fastlane/metadata/android/en-US/changelogs/10.txt
index d37af4810..eb073607e 100644
--- a/fastlane/metadata/android/en-US/changelogs/10.txt
+++ b/fastlane/metadata/android/en-US/changelogs/10.txt
@@ -1,4 +1,5 @@
* Upgrade translations
* Fix classic dark theme
* Add Material Icon Pack to the Free version
+ * Update fingerprint state with checkbox
* Fix bugs
\ No newline at end of file
diff --git a/fastlane/metadata/android/fr-FR/changelogs/10.txt b/fastlane/metadata/android/fr-FR/changelogs/10.txt
index 1e7a183b7..88b9efbe9 100644
--- a/fastlane/metadata/android/fr-FR/changelogs/10.txt
+++ b/fastlane/metadata/android/fr-FR/changelogs/10.txt
@@ -1,4 +1,5 @@
* Mise à jour des traductions
* Correction du thème sombre classic
* Ajout du Pack d'Icones Material à la version gratuite
+ * Mise à jour de l'état de l'empreinte digitale avec la boite à cocher
* Corrections de bugs
\ No newline at end of file