Merge branch 'develop' into feature/ChangeAlgorithms to Fix NDK

This commit is contained in:
J-Jamet
2018-05-09 12:01:16 +02:00
17 changed files with 273 additions and 173 deletions

View File

@@ -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
View 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

View File

@@ -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.*

View File

@@ -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\"}"

View File

@@ -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();
}
}

View File

@@ -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
}
}

View File

@@ -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);
}

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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">

View File

@@ -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">

View File

@@ -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 -->

View File

@@ -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

View File

@@ -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