mirror of
https://github.com/Kunzisoft/KeePassDX.git
synced 2025-12-04 15:49:33 +01:00
Merge branch 'develop' into feature/ChangeAlgorithms to Fix NDK
This commit is contained in:
@@ -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)
|
||||
|
||||
50
FAQ.md
Normal file
50
FAQ.md
Normal file
@@ -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
|
||||
34
ReadMe.md
34
ReadMe.md
@@ -1,31 +1,31 @@
|
||||
# Android Keepass DX
|
||||
|
||||
<img src="https://raw.githubusercontent.com/Kunzisoft/KeePassDX/master/art/icon.png"> 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.
|
||||
<img src="https://raw.githubusercontent.com/Kunzisoft/KeePassDX/master/art/icon.png"> 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.
|
||||
|
||||
<img src="https://raw.githubusercontent.com/Kunzisoft/KeePassDX/master/art/screen.jpg" width="220">
|
||||
|
||||
### 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 <http://www.gnu.org/licenses/>.
|
||||
|
||||
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.*
|
||||
|
||||
@@ -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\"}"
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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">
|
||||
<!-- added these 2 fingerprint related views -->
|
||||
<View
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="1dp"
|
||||
android:background="?attr/colorPrimaryDark"/>
|
||||
|
||||
<android.support.v7.widget.AppCompatImageView
|
||||
android:id="@+id/fingerprint_image"
|
||||
android:layout_width="48dp"
|
||||
android:layout_height="48dp"
|
||||
android:layout_margin="4dp"
|
||||
android:layout_marginTop="@dimen/default_margin"
|
||||
android:layout_marginBottom="@dimen/default_margin"
|
||||
android:layout_marginStart="4dp"
|
||||
android:layout_marginEnd="@dimen/default_margin"
|
||||
android:layout_alignParentEnd="true"
|
||||
android:elevation="4dp"
|
||||
android:elevation="8dp"
|
||||
android:src="@drawable/fingerprint"
|
||||
android:background="@drawable/circle"
|
||||
android:backgroundTint="?attr/colorAccent" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/fingerprint_label"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_centerVertical="true"
|
||||
android:layout_marginEnd="12dp"
|
||||
android:layout_marginStart="24dp"
|
||||
android:layout_marginEnd="18dp"
|
||||
android:layout_toStartOf="@+id/fingerprint_image"
|
||||
style="@style/KeepassDXStyle.TextAppearance.DefaultTextOnPrimary"
|
||||
android:gravity="center_vertical|end" />
|
||||
android:gravity="center_vertical|start" />
|
||||
</RelativeLayout>
|
||||
|
||||
@@ -48,6 +48,18 @@
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_marginTop="?attr/actionBarSize">
|
||||
<android.support.v7.widget.SwitchCompat
|
||||
android:id="@+id/default_database"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
style="@style/KeepassDXStyle.TextAppearance.Small"
|
||||
android:textColor="?android:attr/textColorHintInverse"
|
||||
android:layout_marginLeft="24dp"
|
||||
android:layout_marginStart="24dp"
|
||||
android:layout_marginRight="12dp"
|
||||
android:layout_marginEnd="12dp"
|
||||
android:layout_marginBottom="6dp"
|
||||
android:text="@string/default_checkbox" />
|
||||
<include
|
||||
layout="@layout/fingerprint_show" />
|
||||
</LinearLayout>
|
||||
@@ -172,18 +184,6 @@
|
||||
android:tint="?attr/colorAccentCompat" />
|
||||
</RelativeLayout>
|
||||
|
||||
<android.support.v7.widget.SwitchCompat
|
||||
android:id="@+id/default_database"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
style="@style/KeepassDXStyle.TextAppearance.Small"
|
||||
android:layout_marginTop="24dp"
|
||||
android:layout_marginLeft="12dp"
|
||||
android:layout_marginStart="12dp"
|
||||
android:layout_marginRight="12dp"
|
||||
android:layout_marginEnd="12dp"
|
||||
android:text="@string/default_checkbox" />
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</android.support.v4.widget.NestedScrollView>
|
||||
|
||||
@@ -17,112 +17,114 @@
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with KeePass DX. If not, see <http://www.gnu.org/licenses/>.
|
||||
-->
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:padding="@dimen/default_margin"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:importantForAutofill="noExcludeDescendants"
|
||||
tools:targetApi="o">
|
||||
<android.support.v7.widget.CardView
|
||||
android:id="@+id/card_view_master_password"
|
||||
android:layout_margin="4dp"
|
||||
android:layout_gravity="center"
|
||||
android:layout_height="match_parent">
|
||||
<LinearLayout
|
||||
android:padding="@dimen/default_margin"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
app:cardCornerRadius="4dp">
|
||||
<LinearLayout
|
||||
android:importantForAutofill="noExcludeDescendants"
|
||||
tools:targetApi="o">
|
||||
<android.support.v7.widget.CardView
|
||||
android:id="@+id/card_view_master_password"
|
||||
android:layout_margin="4dp"
|
||||
android:layout_gravity="center"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="@dimen/default_margin"
|
||||
android:orientation="vertical">
|
||||
|
||||
<android.support.v7.widget.AppCompatCheckBox
|
||||
android:id="@+id/password_checkbox"
|
||||
app:cardCornerRadius="4dp">
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/password"/>
|
||||
android:layout_margin="@dimen/default_margin"
|
||||
android:orientation="vertical">
|
||||
|
||||
<!-- Password Input -->
|
||||
<android.support.design.widget.TextInputLayout
|
||||
android:id="@+id/password_input_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
app:passwordToggleEnabled="true"
|
||||
app:passwordToggleTint="?attr/colorAccent">
|
||||
<android.support.design.widget.TextInputEditText
|
||||
android:id="@+id/pass_password"
|
||||
<android.support.v7.widget.AppCompatCheckBox
|
||||
android:id="@+id/password_checkbox"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:inputType="textPassword"
|
||||
android:maxLines="1"
|
||||
android:hint="@string/hint_pass"/>
|
||||
</android.support.design.widget.TextInputLayout>
|
||||
<android.support.design.widget.TextInputLayout
|
||||
android:id="@+id/password_repeat_input_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
app:passwordToggleEnabled="true"
|
||||
app:passwordToggleTint="?attr/colorAccent">
|
||||
<EditText android:id="@+id/pass_conf_password"
|
||||
android:text="@string/password"/>
|
||||
|
||||
<!-- Password Input -->
|
||||
<android.support.design.widget.TextInputLayout
|
||||
android:id="@+id/password_input_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:inputType="textPassword"
|
||||
android:maxLines="1"
|
||||
android:hint="@string/hint_conf_pass"/>
|
||||
</android.support.design.widget.TextInputLayout>
|
||||
app:passwordToggleEnabled="true"
|
||||
app:passwordToggleTint="?attr/colorAccent">
|
||||
<android.support.design.widget.TextInputEditText
|
||||
android:id="@+id/pass_password"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:inputType="textPassword"
|
||||
android:maxLines="1"
|
||||
android:hint="@string/hint_pass"/>
|
||||
</android.support.design.widget.TextInputLayout>
|
||||
<android.support.design.widget.TextInputLayout
|
||||
android:id="@+id/password_repeat_input_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
app:passwordToggleEnabled="true"
|
||||
app:passwordToggleTint="?attr/colorAccent">
|
||||
<EditText android:id="@+id/pass_conf_password"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:inputType="textPassword"
|
||||
android:maxLines="1"
|
||||
android:hint="@string/hint_conf_pass"/>
|
||||
</android.support.design.widget.TextInputLayout>
|
||||
|
||||
</LinearLayout>
|
||||
</LinearLayout>
|
||||
|
||||
</android.support.v7.widget.CardView>
|
||||
</android.support.v7.widget.CardView>
|
||||
|
||||
<android.support.v7.widget.CardView
|
||||
android:id="@+id/card_view_key_file"
|
||||
android:layout_gravity="center"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="4dp"
|
||||
app:cardCornerRadius="4dp">
|
||||
<LinearLayout
|
||||
<android.support.v7.widget.CardView
|
||||
android:id="@+id/card_view_key_file"
|
||||
android:layout_gravity="center"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="@dimen/default_margin"
|
||||
android:orientation="vertical">
|
||||
|
||||
<android.support.v7.widget.AppCompatCheckBox
|
||||
android:id="@+id/keyfile_checkox"
|
||||
android:layout_margin="4dp"
|
||||
app:cardCornerRadius="4dp">
|
||||
<LinearLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@string/entry_keyfile"/>
|
||||
android:layout_margin="@dimen/default_margin"
|
||||
android:orientation="vertical">
|
||||
|
||||
<RelativeLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<android.support.v7.widget.AppCompatImageView
|
||||
android:id="@+id/browse_button"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentEnd="true"
|
||||
android:layout_alignParentRight="true"
|
||||
android:padding="12dp"
|
||||
android:src="@drawable/ic_folder_white_24dp"
|
||||
android:tint="?attr/colorAccentCompat" />
|
||||
|
||||
<android.support.v7.widget.AppCompatEditText
|
||||
android:id="@+id/pass_keyfile"
|
||||
<android.support.v7.widget.AppCompatCheckBox
|
||||
android:id="@+id/keyfile_checkox"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_toLeftOf="@+id/browse_button"
|
||||
android:layout_toStartOf="@+id/browse_button"
|
||||
android:hint="@string/hint_keyfile"
|
||||
android:maxLines="1"
|
||||
android:singleLine="true"/>
|
||||
</RelativeLayout>
|
||||
android:text="@string/entry_keyfile"/>
|
||||
|
||||
<RelativeLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
</LinearLayout>
|
||||
</android.support.v7.widget.CardView>
|
||||
</LinearLayout>
|
||||
<android.support.v7.widget.AppCompatImageView
|
||||
android:id="@+id/browse_button"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentEnd="true"
|
||||
android:layout_alignParentRight="true"
|
||||
android:padding="12dp"
|
||||
android:src="@drawable/ic_folder_white_24dp"
|
||||
android:tint="?attr/colorAccentCompat" />
|
||||
|
||||
<android.support.v7.widget.AppCompatEditText
|
||||
android:id="@+id/pass_keyfile"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_toLeftOf="@+id/browse_button"
|
||||
android:layout_toStartOf="@+id/browse_button"
|
||||
android:hint="@string/hint_keyfile"
|
||||
android:maxLines="1"
|
||||
android:singleLine="true"/>
|
||||
</RelativeLayout>
|
||||
</LinearLayout>
|
||||
</android.support.v7.widget.CardView>
|
||||
</LinearLayout>
|
||||
</ScrollView>
|
||||
@@ -215,7 +215,7 @@
|
||||
<string name="fingerprint_setting_way_text">Paramètres -> Sécurité -> Empreinte digitale</string>
|
||||
<string name="fingerprint_type_password_text">Tapez votre mot de passe dans Keepass DX</string>
|
||||
<string name="fingerprint_scan_to_store">Scannez votre empreinte digitale pour stocker votre mot de passe maître en toute sécurité</string>
|
||||
<string name="fingerprint_scan_to_open">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</string>
|
||||
<string name="fingerprint_scan_to_open">Scanner votre empreinte digitale lorsque la case à cocher du mot de passe n\'est pas cochée pour ouvrir la base de données</string>
|
||||
<string name="usage">Usage</string>
|
||||
<string name="fingerprint">Empreinte digitale</string>
|
||||
<string name="fingerprint_enable_title">Écoute d\'empreintes digitales</string>
|
||||
|
||||
@@ -216,7 +216,7 @@
|
||||
<string name="fingerprint_setting_way_text">Settings -> Security -> Fingerprint</string>
|
||||
<string name="fingerprint_type_password_text">Type your password in Keepass DX</string>
|
||||
<string name="fingerprint_scan_to_store">Scan your fingerprint to store your master password securely</string>
|
||||
<string name="fingerprint_scan_to_open">Just scan your fingerprint in Keepass DX when the password field is empty to open the database</string>
|
||||
<string name="fingerprint_scan_to_open">Scan your fingerprint when the password checkbox is unchecked to open the database</string>
|
||||
<string name="usage">Usage</string>
|
||||
<string name="fingerprint">Fingerprint</string>
|
||||
<string name="fingerprint_enable_title">Fingerprint listening</string>
|
||||
|
||||
@@ -35,7 +35,9 @@
|
||||
<item name="colorControlActivated">@color/blue_lighter</item>
|
||||
<item name="colorControlNormal">@color/colorTextInverse</item>
|
||||
<item name="android:textColorPrimary">@color/colorTextInverse</item>
|
||||
<item name="android:textColorSecondary">@color/colorTextSecondary</item>
|
||||
<item name="android:textColorSecondary">@color/colorTextInverse</item>
|
||||
<item name="android:editTextColor">@color/colorTextInverse</item>
|
||||
<item name="android:textColorHint">@color/blue_lighter</item>
|
||||
</style>
|
||||
<!-- File Picker Theme -->
|
||||
<style name="KeepassDXStyle.FilePickerStyle.Blue" parent="KeepassDXStyle.FilePickerStyle">
|
||||
|
||||
@@ -37,7 +37,9 @@
|
||||
<style name="KeepassDXStyle.Toolbar.Purple" parent="KeepassDXStyle.Purple">
|
||||
<item name="colorControlNormal">@color/colorTextInverse</item>
|
||||
<item name="android:textColorPrimary">@color/colorTextInverse</item>
|
||||
<item name="android:textColorSecondary">@color/colorTextSecondary</item>
|
||||
<item name="android:textColorSecondary">@color/colorTextInverse</item>
|
||||
<item name="android:editTextColor">@color/colorTextInverse</item>
|
||||
<item name="android:textColorHint">@color/purple_lighter</item>
|
||||
</style>
|
||||
<!-- File Picker Theme -->
|
||||
<style name="KeepassDXStyle.FilePickerStyle.Purple" parent="KeepassDXStyle.FilePickerStyle">
|
||||
|
||||
@@ -71,7 +71,7 @@
|
||||
<item name="buttonBarPositiveButtonStyle">@style/KeepassDXStyle.Dialog.PositiveButton</item>
|
||||
|
||||
<!-- Toolbar -->
|
||||
<item name="toolbarAppearance">@style/KeepassDXStyle.Toolbar</item>
|
||||
<item name="toolbarAppearance">@style/KeepassDXStyle.Toolbar.Light</item>
|
||||
<item name="toolbarPopupAppearance">@style/KeepassDXStyle.Light.Toolbar.Popup</item>
|
||||
|
||||
<!-- White FAB -->
|
||||
@@ -125,7 +125,7 @@
|
||||
<item name="buttonBarPositiveButtonStyle">@style/KeepassDXStyle.Dialog.PositiveButton</item>
|
||||
|
||||
<!-- Toolbar -->
|
||||
<item name="toolbarAppearance">@style/KeepassDXStyle.Toolbar</item>
|
||||
<item name="toolbarAppearance">@style/KeepassDXStyle.Toolbar.Night</item>
|
||||
<item name="toolbarPopupAppearance">@style/KeepassDXStyle.Night.Toolbar.Popup</item>
|
||||
|
||||
<!-- White FAB -->
|
||||
@@ -154,11 +154,22 @@
|
||||
<item name="android:activityCloseExitAnimation">@anim/slide_out_right</item>
|
||||
</style>
|
||||
|
||||
<!-- Toolbar Style Green -->
|
||||
<style name="KeepassDXStyle.Toolbar" parent="KeepassDXStyle.Light.v21">
|
||||
<!-- Toolbar Style Light Green -->
|
||||
<style name="KeepassDXStyle.Toolbar.Light" parent="KeepassDXStyle.Light.v21">
|
||||
<item name="colorControlNormal">@color/colorTextInverse</item>
|
||||
<item name="android:textColorPrimary">@color/colorTextInverse</item>
|
||||
<item name="android:textColorSecondary">@color/colorTextSecondary</item>
|
||||
<item name="android:textColorSecondary">@color/colorTextInverse</item>
|
||||
<item name="android:editTextColor">@color/colorTextInverse</item>
|
||||
<item name="android:textColorHint">@color/green_lighter</item>
|
||||
</style>
|
||||
|
||||
<!-- Toolbar Style Night Green -->
|
||||
<style name="KeepassDXStyle.Toolbar.Night" parent="KeepassDXStyle.Night.v21">
|
||||
<item name="colorControlNormal">@color/colorTextInverse</item>
|
||||
<item name="android:textColorPrimary">@color/colorTextInverse</item>
|
||||
<item name="android:textColorSecondary">@color/colorTextInverse</item>
|
||||
<item name="android:editTextColor">@color/colorTextInverse</item>
|
||||
<item name="android:textColorHint">@color/green_lighter</item>
|
||||
</style>
|
||||
|
||||
<!-- Dialog -->
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user