Merge branch 'release/2.5.0.0beta4'

This commit is contained in:
Jeremy
2018-02-01 17:44:29 +01:00
82 changed files with 1558 additions and 461 deletions

View File

@@ -1,3 +1,12 @@
KeepassDX (2.5.0.0beta4)
* Show only file name
* Setting for full path
* Add information for each database file
* Setting to delete fingerprints
* Solve bugs when change fingerprint
* Delete view assignment for fingerprint opening
* Merge KeePassDroid 2.2.1
KeepassDX (2.5.0.0beta3) KeepassDX (2.5.0.0beta3)
* New database workflow with new screens and folder selection * New database workflow with new screens and folder selection
* Settings for default password generation * Settings for default password generation
@@ -21,6 +30,10 @@ KeepassDX (2.5.0.0beta1)
* Update French translation * Update French translation
* Change donation (see KeepassDroid to contribute on both projects) * Change donation (see KeepassDroid to contribute on both projects)
KeePassDroid (2.2.1)
* Fix kdbx4 date corruption
* Updated German translations
KeePassDroid (2.2.0.9) KeePassDroid (2.2.0.9)
* Update build tools version to workaround CM/Lineage bug (closes: #249) * Update build tools version to workaround CM/Lineage bug (closes: #249)
* Update Russian translations * Update Russian translations

View File

@@ -21,7 +21,7 @@ Diego Pierotto - Italian
Laurent, Norman Obry, Nam, Bruno Parmentier, Credomo - French Laurent, Norman Obry, Nam, Bruno Parmentier, Credomo - French
Maciej Bieniek, cod3r - Polish Maciej Bieniek, cod3r - Polish
Максим Сёмочкин, i.nedoboy, filimonic, bboa - Russian Максим Сёмочкин, i.nedoboy, filimonic, bboa - Russian
MaWi, rvs2008, meviox, MaDill - German MaWi, rvs2008, meviox, MaDill, EdlerProgrammierer, Jan Thomas - German
yslandro - Norwegian Nynorsk yslandro - Norwegian Nynorsk
王科峰 - Chinese 王科峰 - Chinese
Typhoon - Slovak Typhoon - Slovak

View File

@@ -30,8 +30,6 @@ Even if the application is free, to maintain the application, you can make donat
[![Donation Paypal](https://4.bp.blogspot.com/-ncaIbUGaHOk/WfhaThYUPGI/AAAAAAAAAVQ/_HidNgdB1q4DaC24ujaKNzH64KUUJiQewCLcBGAs/s1600/pay-with-paypal.png)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=KM6QMDAXZM3UU "Kunzisoft Paypal Donation") [![Donation Paypal](https://4.bp.blogspot.com/-ncaIbUGaHOk/WfhaThYUPGI/AAAAAAAAAVQ/_HidNgdB1q4DaC24ujaKNzH64KUUJiQewCLcBGAs/s1600/pay-with-paypal.png)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=KM6QMDAXZM3UU "Kunzisoft Paypal Donation")
<a href="bitcoin:1DSwXCk7Sob24sNsofywNoRQw2f5Qj5t2F"><img src="https://2.bp.blogspot.com/-K7-LKnSZd7c/WkvIKpLdmKI/AAAAAAAAAVs/-5LTimDq5IURMHwMmEP5VPTT53b2EUsswCLcBGAs/s1600/donate-with-bitcoin.png" alt="Kunzisoft Bitcoin" />Bitcoin wallet address : 1DSwXCk7Sob24sNsofywNoRQw2f5Qj5t2F</a>
[![Donation Liberapay](https://liberapay.com/assets/widgets/donate.svg)](https://liberapay.com/Kunzisoft/donate "Kunzisoft Liberapay Donation") [![Donation Liberapay](https://liberapay.com/assets/widgets/donate.svg)](https://liberapay.com/Kunzisoft/donate "Kunzisoft Liberapay Donation")
<img src="https://raw.githubusercontent.com/Kunzisoft/KeePassDX/master/art/screen4.jpg" width="220"> <img src="https://raw.githubusercontent.com/Kunzisoft/KeePassDX/master/art/screen4.jpg" width="220">

View File

@@ -8,8 +8,8 @@ android {
applicationId "com.kunzisoft.keepass" applicationId "com.kunzisoft.keepass"
minSdkVersion 14 minSdkVersion 14
targetSdkVersion 25 targetSdkVersion 25
versionCode = 3 versionCode = 4
versionName = "2.5.0.0beta3" versionName = "2.5.0.0beta4"
testApplicationId = "com.keepassdroid.tests" testApplicationId = "com.keepassdroid.tests"
testInstrumentationRunner = "android.test.InstrumentationTestRunner" testInstrumentationRunner = "android.test.InstrumentationTestRunner"

View File

@@ -53,11 +53,14 @@
</intent-filter> </intent-filter>
</activity> </activity>
<activity android:name="com.keepassdroid.fileselect.FileSelectActivity" <activity android:name="com.keepassdroid.fileselect.FileSelectActivity"
android:launchMode="singleInstance"
android:configChanges="orientation|keyboardHidden" android:configChanges="orientation|keyboardHidden"
android:windowSoftInputMode="stateHidden" /> android:windowSoftInputMode="stateHidden" />
<activity android:name="com.keepassdroid.AboutActivity" <activity android:name="com.keepassdroid.AboutActivity"
android:launchMode="singleInstance"
android:label="@string/menu_about" /> android:label="@string/menu_about" />
<activity android:name="com.keepassdroid.PasswordActivity" android:configChanges="orientation|keyboardHidden"> <activity android:name="com.keepassdroid.PasswordActivity"
android:configChanges="orientation|keyboardHidden">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.VIEW" /> <action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.DEFAULT" />

View File

@@ -27,8 +27,10 @@ import android.util.Log;
import android.view.MenuItem; import android.view.MenuItem;
import android.widget.TextView; import android.widget.TextView;
import com.kunzisoft.keepass.R;
import com.keepassdroid.stylish.StylishActivity; import com.keepassdroid.stylish.StylishActivity;
import com.kunzisoft.keepass.R;
import org.joda.time.DateTime;
public class AboutActivity extends StylishActivity { public class AboutActivity extends StylishActivity {
@@ -56,6 +58,9 @@ public class AboutActivity extends StylishActivity {
version = getString(R.string.version_label) + " " + version; version = getString(R.string.version_label) + " " + version;
TextView versionText = (TextView) findViewById(R.id.activity_about_version); TextView versionText = (TextView) findViewById(R.id.activity_about_version);
versionText.setText(version); versionText.setText(version);
TextView disclaimerText = (TextView) findViewById(R.id.disclaimer);
disclaimerText.setText(getString(R.string.disclaimer_formal, new DateTime().getYear()));
} }
@Override @Override

View File

@@ -19,12 +19,13 @@
*/ */
package com.keepassdroid; package com.keepassdroid;
import android.app.SearchManager; import android.app.SearchManager;
import android.content.ComponentName; import android.content.ComponentName;
import android.content.Context; import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor; import android.content.SharedPreferences.Editor;
import android.os.Build;
import android.net.Uri; import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
@@ -306,6 +307,24 @@ public abstract class GroupBaseActivity extends LockCloseListActivity
} }
} }
} }
@Override
public void startActivityForResult(Intent intent, int requestCode, Bundle options) {
/*
* ACTION_SEARCH automatically forces a new task. This occurs when you open a kdb file in
* another app such as Files or GoogleDrive and then Search for an entry. Here we remove the
* FLAG_ACTIVITY_NEW_TASK flag bit allowing search to open it's activity in the current task.
*/
if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
int flags = intent.getFlags();
flags &= ~Intent.FLAG_ACTIVITY_NEW_TASK;
intent.setFlags(flags);
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
super.startActivityForResult(intent, requestCode, options);
}
}
public class AfterDeleteGroup extends OnFinish { public class AfterDeleteGroup extends OnFinish {
public AfterDeleteGroup(Handler handler) { public AfterDeleteGroup(Handler handler) {

View File

@@ -20,7 +20,6 @@
package com.keepassdroid; package com.keepassdroid;
import android.app.Activity; import android.app.Activity;
import android.content.Context;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener; import android.content.DialogInterface.OnClickListener;
import android.content.Intent; import android.content.Intent;
@@ -40,7 +39,6 @@ import android.view.Menu;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.widget.Button; import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton; import android.widget.CompoundButton;
import android.widget.EditText; import android.widget.EditText;
import android.widget.ImageView; import android.widget.ImageView;
@@ -60,7 +58,6 @@ import com.keepassdroid.settings.PrefsUtil;
import com.keepassdroid.utils.EmptyUtils; import com.keepassdroid.utils.EmptyUtils;
import com.keepassdroid.utils.MenuUtil; import com.keepassdroid.utils.MenuUtil;
import com.keepassdroid.utils.UriUtil; import com.keepassdroid.utils.UriUtil;
import com.keepassdroid.utils.Util;
import com.keepassdroid.view.FingerPrintDialog; import com.keepassdroid.view.FingerPrintDialog;
import com.keepassdroid.view.KeyFileHelper; import com.keepassdroid.view.KeyFileHelper;
import com.kunzisoft.keepass.KeePass; import com.kunzisoft.keepass.KeePass;
@@ -71,23 +68,21 @@ import java.io.FileNotFoundException;
import javax.crypto.Cipher; import javax.crypto.Cipher;
public class PasswordActivity extends LockingActivity implements FingerPrintHelper.FingerPrintCallback { public class PasswordActivity extends LockingActivity
implements FingerPrintHelper.FingerPrintCallback, UriIntentInitTaskCallback {
public static final String KEY_DEFAULT_FILENAME = "defaultFileName"; public static final String KEY_DEFAULT_FILENAME = "defaultFileName";
private static final String KEY_FILENAME = "fileName";
private static final String KEY_KEYFILE = "keyFile";
private static final String KEY_PASSWORD = "password"; private static final String KEY_PASSWORD = "password";
private static final String KEY_LAUNCH_IMMEDIATELY = "launchImmediately"; private static final String KEY_LAUNCH_IMMEDIATELY = "launchImmediately";
private static final String VIEW_INTENT = "android.intent.action.VIEW";
private Uri mDbUri = null; private Uri mDbUri = null;
private Uri mKeyUri = null; private Uri mKeyUri = null;
private boolean mRememberKeyfile;
SharedPreferences prefs; SharedPreferences prefs;
SharedPreferences prefsNoBackup; SharedPreferences prefsNoBackup;
private FingerPrintHelper fingerPrintHelper; private FingerPrintHelper fingerPrintHelper;
private boolean fingerprintMustBeConfigured = true; private boolean fingerprintMustBeConfigured = true;
private boolean mRememberKeyfile;
private int mode; private int mode;
private static final String PREF_KEY_VALUE_PREFIX = "valueFor_"; // key is a combination of db file name and this prefix private static final String PREF_KEY_VALUE_PREFIX = "valueFor_"; // key is a combination of db file name and this prefix
@@ -101,8 +96,9 @@ public class PasswordActivity extends LockingActivity implements FingerPrintHelp
private EditText passwordView; private EditText passwordView;
private EditText keyFileView; private EditText keyFileView;
private Button confirmButtonView; private Button confirmButtonView;
private CheckBox checkboxPasswordView; private CompoundButton checkboxPasswordView;
private CheckBox checkboxKeyfileView; private CompoundButton checkboxKeyfileView;
private CompoundButton checkboxDefaultDatabaseView;
private KeyFileHelper keyFileHelper; private KeyFileHelper keyFileHelper;
@@ -132,8 +128,8 @@ public class PasswordActivity extends LockingActivity implements FingerPrintHelp
} }
Intent i = new Intent(act, PasswordActivity.class); Intent i = new Intent(act, PasswordActivity.class);
i.putExtra(KEY_FILENAME, fileName); i.putExtra(UriIntentInitTask.KEY_FILENAME, fileName);
i.putExtra(KEY_KEYFILE, keyFile); i.putExtra(UriIntentInitTask.KEY_KEYFILE, keyFile);
act.startActivityForResult(i, 0); act.startActivityForResult(i, 0);
@@ -146,15 +142,17 @@ public class PasswordActivity extends LockingActivity implements FingerPrintHelp
Intent data) { Intent data) {
super.onActivityResult(requestCode, resultCode, data); super.onActivityResult(requestCode, resultCode, data);
keyFileHelper.onActivityResultCallback(requestCode, resultCode, data, if (keyFileHelper != null) {
new KeyFileHelper.KeyFileCallback() { keyFileHelper.onActivityResultCallback(requestCode, resultCode, data,
@Override new KeyFileHelper.KeyFileCallback() {
public void onKeyFileResultCallback(Uri uri) { @Override
if(uri != null) { public void onKeyFileResultCallback(Uri uri) {
keyFileView.setText(uri.toString()); if (uri != null) {
keyFileView.setText(uri.toString());
}
} }
} });
}); }
switch (requestCode) { switch (requestCode) {
case KeePass.EXIT_NORMAL: case KeePass.EXIT_NORMAL:
@@ -169,19 +167,18 @@ public class PasswordActivity extends LockingActivity implements FingerPrintHelp
App.getDB().clear(); App.getDB().clear();
break; break;
} }
} }
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
Intent i = getIntent();
prefs = PreferenceManager.getDefaultSharedPreferences(this); prefs = PreferenceManager.getDefaultSharedPreferences(this);
prefsNoBackup = getSharedPreferences("nobackup", Context.MODE_PRIVATE); prefsNoBackup = PrefsUtil.getNoBackupSharedPreferences(getApplicationContext());
mRememberKeyfile = prefs.getBoolean(getString(R.string.keyfile_key),
getResources().getBoolean(R.bool.keyfile_default));
mRememberKeyfile = prefs.getBoolean(getString(R.string.keyfile_key), getResources().getBoolean(R.bool.keyfile_default));
setContentView(R.layout.password); setContentView(R.layout.password);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
@@ -198,8 +195,13 @@ public class PasswordActivity extends LockingActivity implements FingerPrintHelp
filenameView = (TextView) findViewById(R.id.filename); filenameView = (TextView) findViewById(R.id.filename);
passwordView = (EditText) findViewById(R.id.password); passwordView = (EditText) findViewById(R.id.password);
keyFileView = (EditText) findViewById(R.id.pass_keyfile); keyFileView = (EditText) findViewById(R.id.pass_keyfile);
checkboxPasswordView = (CheckBox) findViewById(R.id.password_checkbox); checkboxPasswordView = (CompoundButton) findViewById(R.id.password_checkbox);
checkboxKeyfileView = (CheckBox) findViewById(R.id.keyfile_checkox); checkboxKeyfileView = (CompoundButton) findViewById(R.id.keyfile_checkox);
checkboxDefaultDatabaseView = (CompoundButton) findViewById(R.id.default_database);
View browseView = findViewById(R.id.browse_button);
keyFileHelper = new KeyFileHelper(PasswordActivity.this);
browseView.setOnClickListener(keyFileHelper.getOpenFileOnClickViewListener());
passwordView.addTextChangedListener(new TextWatcher() { passwordView.addTextChangedListener(new TextWatcher() {
@Override @Override
@@ -226,12 +228,74 @@ public class PasswordActivity extends LockingActivity implements FingerPrintHelp
} }
}); });
new UriIntentInitTask(this, mRememberKeyfile)
.execute(getIntent());
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
fingerPrintAnimatedVector = new FingerPrintAnimatedVector(this, fingerPrintAnimatedVector = new FingerPrintAnimatedVector(this,
(ImageView) fingerprintImageView); (ImageView) fingerprintImageView);
} }
}
new InitTask().execute(i); @Override
public void onPostInitTask(Uri dbUri, Uri keyFileUri, Integer errorStringId) {
mDbUri = dbUri;
mKeyUri = keyFileUri;
Intent intent = getIntent();
String password = intent.getStringExtra(KEY_PASSWORD);
boolean launch_immediately = intent.getBooleanExtra(KEY_LAUNCH_IMMEDIATELY, false);
if (errorStringId != null) {
Toast.makeText(PasswordActivity.this, errorStringId, Toast.LENGTH_LONG).show();
finish();
return;
}
populateView();
confirmButtonView.setOnClickListener(new OkClickHandler());
if (password != null) {
passwordView.setText(password);
}
checkboxDefaultDatabaseView.setOnCheckedChangeListener(new DefaultCheckChange());
retrieveSettings();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
checkFingerprintAvailability();
}
if (launch_immediately) {
verifyCheckboxesAndLoadDatabase(password, mKeyUri);
}
}
private void retrieveSettings() {
String defaultFilename = prefs.getString(KEY_DEFAULT_FILENAME, "");
if (mDbUri!=null
&& !EmptyUtils.isNullOrEmpty(mDbUri.getPath())
&& UriUtil.equalsDefaultfile(mDbUri, defaultFilename)) {
checkboxDefaultDatabaseView.setChecked(true);
}
}
private void populateView() {
String db = (mDbUri == null) ? "" : mDbUri.toString();
if (!db.isEmpty()) {
if (PrefsUtil.isFullFilePathEnable(this))
filenameView.setText(db);
else
filenameView.setText(new File(mDbUri.getPath()).getName()); // TODO Encapsulate
}
String key = (mKeyUri == null) ? "" : mKeyUri.toString();
if (!key.isEmpty() && mRememberKeyfile) { // Bug KeepassDX #18
keyFileView.setText(key);
}
} }
@Override @Override
@@ -250,7 +314,7 @@ public class PasswordActivity extends LockingActivity implements FingerPrintHelp
// checks if fingerprint is available, will also start listening for fingerprints when available // checks if fingerprint is available, will also start listening for fingerprints when available
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
initForFingerprint(); initForFingerprint();
checkAvailability(); checkFingerprintAvailability();
if (fingerPrintAnimatedVector != null) { if (fingerPrintAnimatedVector != null) {
fingerPrintAnimatedVector.startScan(); fingerPrintAnimatedVector.startScan();
} }
@@ -259,16 +323,11 @@ public class PasswordActivity extends LockingActivity implements FingerPrintHelp
private void setEmptyViews() { private void setEmptyViews() {
passwordView.setText(""); passwordView.setText("");
keyFileView.setText("");
checkboxPasswordView.setChecked(false); checkboxPasswordView.setChecked(false);
checkboxKeyfileView.setChecked(false); // Bug KeepassDX #18
} if (!mRememberKeyfile) {
keyFileView.setText("");
private void retrieveSettings() { checkboxKeyfileView.setChecked(false);
String defaultFilename = prefs.getString(KEY_DEFAULT_FILENAME, "");
if (!EmptyUtils.isNullOrEmpty(mDbUri.getPath()) && UriUtil.equalsDefaultfile(mDbUri, defaultFilename)) {
CompoundButton checkbox = (CompoundButton) findViewById(R.id.default_database);
checkbox.setChecked(true);
} }
} }
@@ -280,19 +339,11 @@ public class PasswordActivity extends LockingActivity implements FingerPrintHelp
} }
} }
private void populateView() {
String db = (mDbUri == null) ? "" : mDbUri.toString();
if (!db.isEmpty())
filenameView.setText(db);
String key = (mKeyUri == null) ? "" : mKeyUri.toString();
if (!key.isEmpty())
keyFileView.setText(key);
}
// fingerprint related code here // fingerprint related code here
@RequiresApi(api = Build.VERSION_CODES.M) @RequiresApi(api = Build.VERSION_CODES.M)
private void initForFingerprint() { private void initForFingerprint() {
mode = -1;
fingerPrintHelper = new FingerPrintHelper(this, this); fingerPrintHelper = new FingerPrintHelper(this, this);
// when text entered we can enable the logon/purchase button and if required update encryption/decryption mode // when text entered we can enable the logon/purchase button and if required update encryption/decryption mode
@@ -316,7 +367,7 @@ public class PasswordActivity extends LockingActivity implements FingerPrintHelp
if ( !fingerprintMustBeConfigured ) { if ( !fingerprintMustBeConfigured ) {
final boolean validInput = s.length() > 0; final boolean validInput = s.length() > 0;
// encrypt or decrypt mode based on how much input or not // encrypt or decrypt mode based on how much input or not
fingerprintTextView.setText(validInput ? R.string.store_with_fingerprint : R.string.scanning_fingerprint); setFingerPrintTextView(validInput ? R.string.store_with_fingerprint : R.string.scanning_fingerprint);
mode = validInput ? toggleMode(Cipher.ENCRYPT_MODE) : toggleMode(Cipher.DECRYPT_MODE); mode = validInput ? toggleMode(Cipher.ENCRYPT_MODE) : toggleMode(Cipher.DECRYPT_MODE);
} }
} }
@@ -342,7 +393,8 @@ public class PasswordActivity extends LockingActivity implements FingerPrintHelp
final int helpCode, final int helpCode,
final CharSequence helpString) { final CharSequence helpString) {
onFingerprintException(new Exception("onAuthenticationHelp")); showError(helpString);
checkFingerprintAvailability();
fingerprintTextView.setText(helpString); fingerprintTextView.setText(helpString);
} }
@@ -367,7 +419,8 @@ public class PasswordActivity extends LockingActivity implements FingerPrintHelp
@Override @Override
public void onAuthenticationFailed() { public void onAuthenticationFailed() {
onFingerprintException(new Exception("onAuthenticationFailed")); showError(R.string.fingerprint_not_recognized);
checkFingerprintAvailability();
} }
}); });
} }
@@ -382,16 +435,19 @@ public class PasswordActivity extends LockingActivity implements FingerPrintHelp
} }
@RequiresApi(api = Build.VERSION_CODES.M) @RequiresApi(api = Build.VERSION_CODES.M)
private int toggleMode(final int newMode) { private synchronized int toggleMode(final int newMode) {
mode = newMode; if(newMode != mode) {
switch (mode) { mode = newMode;
case Cipher.ENCRYPT_MODE: switch (mode) {
fingerPrintHelper.initEncryptData(); case Cipher.ENCRYPT_MODE:
break; fingerPrintHelper.initEncryptData();
case Cipher.DECRYPT_MODE: break;
final String ivSpecValue = prefsNoBackup.getString(getPreferenceKeyIvSpec(), null); case Cipher.DECRYPT_MODE:
fingerPrintHelper.initDecryptData(ivSpecValue); final String ivSpecValue = prefsNoBackup.getString(getPreferenceKeyIvSpec(), null);
break; if (ivSpecValue != null)
fingerPrintHelper.initDecryptData(ivSpecValue);
break;
}
} }
return newMode; return newMode;
} }
@@ -411,17 +467,40 @@ public class PasswordActivity extends LockingActivity implements FingerPrintHelp
} }
} }
private void setFingerPrintVisibility(int vis) { private void setFingerPrintVisibility(final int vis) {
fingerprintContainerView.setVisibility(vis); runOnUiThread(new Runnable() {
@Override
public void run() {
fingerprintContainerView.setVisibility(vis);
}
});
}
private void setFingerPrintTextView(final int textId) {
runOnUiThread(new Runnable() {
@Override
public void run() {
fingerprintTextView.setText(textId);
}
});
}
private void setFingerPrintAlphaImageView(final float alpha) {
runOnUiThread(new Runnable() {
@Override
public void run() {
fingerprintImageView.setAlpha(alpha);
}
});
} }
@RequiresApi(api = Build.VERSION_CODES.M) @RequiresApi(api = Build.VERSION_CODES.M)
private void checkAvailability() { private synchronized void checkFingerprintAvailability() {
// fingerprint not supported (by API level or hardware) so keep option hidden // fingerprint not supported (by API level or hardware) so keep option hidden
// or manually disable // or manually disable
if (!PrefsUtil.isFingerprintEnable(getApplicationContext()) if (!PrefsUtil.isFingerprintEnable(getApplicationContext())
|| !fingerPrintHelper.isFingerprintSupported(FingerprintManagerCompat.from(this))) { || !FingerPrintHelper.isFingerprintSupported(FingerprintManagerCompat.from(this))) {
setFingerPrintVisibility(View.GONE); setFingerPrintVisibility(View.GONE);
} }
// fingerprint is available but not configured show icon but in disabled state with some information // fingerprint is available but not configured show icon but in disabled state with some information
@@ -437,23 +516,25 @@ public class PasswordActivity extends LockingActivity implements FingerPrintHelp
setFingerPrintVisibility(View.VISIBLE); setFingerPrintVisibility(View.VISIBLE);
if (!fingerPrintHelper.hasEnrolledFingerprints()) { if (!fingerPrintHelper.hasEnrolledFingerprints()) {
fingerprintImageView.setAlpha(0.3f); setFingerPrintAlphaImageView(0.3f);
// This happens when no fingerprints are registered. Listening won't start // This happens when no fingerprints are registered. Listening won't start
fingerprintTextView.setText(R.string.configure_fingerprint); setFingerPrintTextView(R.string.configure_fingerprint);
} }
// finally fingerprint available and configured so we can use it // finally fingerprint available and configured so we can use it
else { else {
fingerprintMustBeConfigured = false; fingerprintMustBeConfigured = false;
fingerprintImageView.setAlpha(1f); setFingerPrintAlphaImageView(1f);
// fingerprint available but no stored password found yet for this DB so show info don't listen // fingerprint available but no stored password found yet for this DB so show info don't listen
if (prefsNoBackup.getString(getPreferenceKeyValue(), null) == null) { if (!prefsNoBackup.contains(getPreferenceKeyValue())) {
fingerprintTextView.setText(R.string.no_password_stored); setFingerPrintTextView(R.string.no_password_stored);
// listen for encryption
toggleMode(Cipher.ENCRYPT_MODE);
} }
// all is set here so we can confirm to user and start listening for fingerprints // all is set here so we can confirm to user and start listening for fingerprints
else { else {
fingerprintTextView.setText(R.string.scanning_fingerprint); setFingerPrintTextView(R.string.scanning_fingerprint);
// listen for decryption by default // listen for decryption
toggleMode(Cipher.DECRYPT_MODE); toggleMode(Cipher.DECRYPT_MODE);
} }
} }
@@ -464,36 +545,58 @@ public class PasswordActivity extends LockingActivity implements FingerPrintHelp
public void handleEncryptedResult( public void handleEncryptedResult(
final String value, final String value,
final String ivSpec) { final String ivSpec) {
prefsNoBackup.edit() prefsNoBackup.edit()
.putString(getPreferenceKeyValue(), value) .putString(getPreferenceKeyValue(), value)
.putString(getPreferenceKeyIvSpec(), ivSpec) .putString(getPreferenceKeyIvSpec(), ivSpec)
.apply(); .apply();
// and remove visual input to reset UI // and remove visual input to reset UI
confirmButtonView.performClick(); confirmButtonView.performClick();
fingerprintTextView.setText(R.string.encrypted_value_stored); setFingerPrintTextView(R.string.encrypted_value_stored);
} }
@Override @Override
public void handleDecryptedResult(final String value) { public void handleDecryptedResult(final String passwordValue) {
// on decrypt enter it for the purchase/login action // Load database directly
passwordView.setText(value); String key = keyFileView.getText().toString();
confirmButtonView.performClick(); loadDatabase(passwordValue, key);
} }
@RequiresApi(api = Build.VERSION_CODES.M) @RequiresApi(api = Build.VERSION_CODES.M)
@Override @Override
public void onInvalidKeyException() { public void onInvalidKeyException(Exception e) {
Toast.makeText(this, R.string.fingerprint_invalid_key, Toast.LENGTH_SHORT).show(); showError(R.string.fingerprint_invalid_key);
checkAvailability(); // restarts listening prefsNoBackup.edit()
} .remove(getPreferenceKeyValue())
.remove(getPreferenceKeyIvSpec())
@RequiresApi(api = Build.VERSION_CODES.M) .apply();
@Override
public void onFingerprintException(Exception e) {
//Toast.makeText(this, R.string.fingerprint_error, Toast.LENGTH_SHORT).show();
checkAvailability();
e.printStackTrace(); e.printStackTrace();
checkFingerprintAvailability(); // restarts listening
}
@RequiresApi(api = Build.VERSION_CODES.M)
@Override
public void onFingerPrintException(Exception e) {
showError(R.string.fingerprint_error);
e.printStackTrace();
checkFingerprintAvailability();
}
private void showError(final int messageId) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), messageId, Toast.LENGTH_SHORT).show();
}
});
}
private void showError(final CharSequence message) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), message, Toast.LENGTH_SHORT).show();
}
});
} }
private class DefaultCheckChange implements CompoundButton.OnCheckedChangeListener { private class DefaultCheckChange implements CompoundButton.OnCheckedChangeListener {
@@ -527,10 +630,28 @@ public class PasswordActivity extends LockingActivity implements FingerPrintHelp
public void onClick(View view) { public void onClick(View view) {
String pass = passwordView.getText().toString(); String pass = passwordView.getText().toString();
String key = keyFileView.getText().toString(); String key = keyFileView.getText().toString();
loadDatabase(pass, key); verifyCheckboxesAndLoadDatabase(pass, key);
} }
} }
private void verifyCheckboxesAndLoadDatabase(
String pass,
String keyfile) {
verifyCheckboxesAndLoadDatabase(pass, UriUtil.parseDefaultFile(keyfile));
}
private void verifyCheckboxesAndLoadDatabase(
String pass,
Uri keyfile) {
if (!checkboxPasswordView.isChecked()) {
pass = "";
}
if (!checkboxKeyfileView.isChecked()) {
keyfile = null;
}
loadDatabase(pass, keyfile);
}
private void loadDatabase( private void loadDatabase(
String pass, String pass,
String keyfile) { String keyfile) {
@@ -548,23 +669,12 @@ public class PasswordActivity extends LockingActivity implements FingerPrintHelp
// Clear the shutdown flag // Clear the shutdown flag
App.clearShutdown(); App.clearShutdown();
if (!checkboxPasswordView.isChecked()) {
pass = "";
}
if (!checkboxKeyfileView.isChecked()) {
keyfile = null;
}
Handler handler = new Handler(); Handler handler = new Handler();
LoadDB task = new LoadDB(db, PasswordActivity.this, mDbUri, pass, keyfile, new AfterLoad(handler, db)); LoadDB task = new LoadDB(db, PasswordActivity.this, mDbUri, pass, keyfile, new AfterLoad(handler, db));
ProgressTask pt = new ProgressTask(PasswordActivity.this, task, R.string.loading_database); ProgressTask pt = new ProgressTask(PasswordActivity.this, task, R.string.loading_database);
pt.run(); pt.run();
} }
private String getEditText(int resId) {
return Util.getEditText(this, resId);
}
@Override @Override
public boolean onCreateOptionsMenu(Menu menu) { public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu); super.onCreateOptionsMenu(menu);
@@ -621,20 +731,30 @@ public class PasswordActivity extends LockingActivity implements FingerPrintHelp
} }
} }
private class InitTask extends AsyncTask<Intent, Void, Integer> { private static class UriIntentInitTask extends AsyncTask<Intent, Void, Integer> {
String password = ""; static final String KEY_FILENAME = "fileName";
boolean launch_immediately = false; static final String KEY_KEYFILE = "keyFile";
private static final String VIEW_INTENT = "android.intent.action.VIEW";
private UriIntentInitTaskCallback uriIntentInitTaskCallback;
private boolean isKeyFileNeeded;
private Uri databaseUri;
private Uri keyFileUri;
UriIntentInitTask(UriIntentInitTaskCallback uriIntentInitTaskCallback, boolean isKeyFileNeeded) {
this.uriIntentInitTaskCallback = uriIntentInitTaskCallback;
this.isKeyFileNeeded = isKeyFileNeeded;
}
@Override @Override
protected Integer doInBackground(Intent... args) { protected Integer doInBackground(Intent... args) {
Intent i = args[0]; Intent intent = args[0];
String action = i.getAction(); String action = intent.getAction();
if (action != null && action.equals(VIEW_INTENT)) { if (action != null && action.equals(VIEW_INTENT)) {
Uri incoming = i.getData(); Uri incoming = intent.getData();
mDbUri = incoming; databaseUri = incoming;
keyFileUri = ClipDataCompat.getUriFromIntent(intent, KEY_KEYFILE);
mKeyUri = ClipDataCompat.getUriFromIntent(i, KEY_KEYFILE);
if (incoming == null) { if (incoming == null) {
return R.string.error_can_not_handle_uri; return R.string.error_can_not_handle_uri;
@@ -643,68 +763,47 @@ public class PasswordActivity extends LockingActivity implements FingerPrintHelp
if (fileName.length() == 0) { if (fileName.length() == 0) {
// No file name // No file name
return R.string.FileNotFound; return R.string.file_not_found;
} }
File dbFile = new File(fileName); File dbFile = new File(fileName);
if (!dbFile.exists()) { if (!dbFile.exists()) {
// File does not exist // File does not exist
return R.string.FileNotFound; return R.string.file_not_found;
} }
if (mKeyUri == null) { if (keyFileUri == null) {
mKeyUri = getKeyFile(mDbUri); keyFileUri = getKeyFile(databaseUri);
} }
} else if (incoming.getScheme().equals("content")) { } else if (incoming.getScheme().equals("content")) {
if (mKeyUri == null) { if (keyFileUri == null) {
mKeyUri = getKeyFile(mDbUri); keyFileUri = getKeyFile(databaseUri);
} }
} else { } else {
return R.string.error_can_not_handle_uri; return R.string.error_can_not_handle_uri;
} }
password = i.getStringExtra(KEY_PASSWORD);
launch_immediately = i.getBooleanExtra(KEY_LAUNCH_IMMEDIATELY, false);
} else { } else {
mDbUri = UriUtil.parseDefaultFile(i.getStringExtra(KEY_FILENAME)); databaseUri = UriUtil.parseDefaultFile(intent.getStringExtra(KEY_FILENAME));
mKeyUri = UriUtil.parseDefaultFile(i.getStringExtra(KEY_KEYFILE)); keyFileUri = UriUtil.parseDefaultFile(intent.getStringExtra(KEY_KEYFILE));
password = i.getStringExtra(KEY_PASSWORD);
launch_immediately = i.getBooleanExtra(KEY_LAUNCH_IMMEDIATELY, false);
if (mKeyUri == null || mKeyUri.toString().length() == 0) { if (keyFileUri == null || keyFileUri.toString().length() == 0) {
mKeyUri = getKeyFile(mDbUri); keyFileUri = getKeyFile(databaseUri);
} }
} }
return null; return null;
} }
public void onPostExecute(Integer result) { public void onPostExecute(Integer result) {
if (result != null) { uriIntentInitTaskCallback.onPostInitTask(databaseUri, keyFileUri, result);
Toast.makeText(PasswordActivity.this, result, Toast.LENGTH_LONG).show(); }
finish();
return;
}
populateView(); private Uri getKeyFile(Uri dbUri) {
if (isKeyFileNeeded) {
Button confirmButton = (Button) findViewById(R.id.pass_ok); return App.getFileHistory().getFileByName(dbUri);
confirmButton.setOnClickListener(new OkClickHandler()); } else {
return null;
if (password != null) {
passwordView.setText(password);
}
CompoundButton defaultCheck = (CompoundButton) findViewById(R.id.default_database);
defaultCheck.setOnCheckedChangeListener(new DefaultCheckChange());
View browseView = findViewById(R.id.browse_button);
keyFileHelper = new KeyFileHelper(PasswordActivity.this);
browseView.setOnClickListener(keyFileHelper.getOpenFileOnClickViewListener());
retrieveSettings();
if (launch_immediately) {
loadDatabase(password, mKeyUri);
} }
} }
} }

View File

@@ -30,7 +30,16 @@ public class UnavailableFeatureDialog extends DialogFragment {
minVersionRequired = getArguments().getInt(MIN_REQUIRED_VERSION_ARG); minVersionRequired = getArguments().getInt(MIN_REQUIRED_VERSION_ARG);
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setMessage(getString(R.string.unavailable_feature_text, Build.VERSION.SDK_INT, minVersionRequired))
String message = getString(R.string.unavailable_feature_text).concat("\n");
if(Build.VERSION.SDK_INT <= minVersionRequired)
message = message.concat(getString(R.string.unavailable_feature_version,
Build.VERSION.SDK_INT,
minVersionRequired));
else
message = message.concat(getString(R.string.unavailable_feature_hardware));
builder.setMessage(message)
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) { } public void onClick(DialogInterface dialog, int id) { }
}); });

View File

@@ -0,0 +1,7 @@
package com.keepassdroid;
import android.net.Uri;
interface UriIntentInitTaskCallback {
void onPostInitTask(Uri dbUri, Uri keyFileUri, Integer errorStringId);
}

View File

@@ -78,7 +78,7 @@ public class LoadDB extends RunnableOnFinish {
finish(false, mCtx.getString(R.string.file_not_found_content)); finish(false, mCtx.getString(R.string.file_not_found_content));
return; return;
} catch (FileNotFoundException e) { } catch (FileNotFoundException e) {
finish(false, mCtx.getString(R.string.FileNotFound)); finish(false, mCtx.getString(R.string.file_not_found));
return; return;
} catch (IOException e) { } catch (IOException e) {
finish(false, e.getMessage()); finish(false, e.getMessage());

View File

@@ -922,7 +922,7 @@ public class ImporterV4 extends Importer {
byte[] buf = Base64Coder.decode(sDate); byte[] buf = Base64Coder.decode(sDate);
if (buf.length != 8) { if (buf.length != 8) {
byte[] buf8 = new byte[8]; byte[] buf8 = new byte[8];
System.arraycopy(buf, 0, buf8, 0, buf.length); System.arraycopy(buf, 0, buf8, 0, Math.min(buf.length, 8));
buf = buf8; buf = buf8;
} }

View File

@@ -0,0 +1,52 @@
/*
* Copyright 2018 Jeremy Jamet / Kunzisoft.
*
* This file is part of KeePass DX.
*
* KeePass DX is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* KeePass DX is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with KeePass DX. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.keepassdroid.fileselect;
import android.os.AsyncTask;
class DeleteFileHistoryAsyncTask extends AsyncTask<FileSelectBean, Void, Void> {
private AfterDeleteFileHistoryListener afterDeleteFileHistoryListener;
private RecentFileHistory fileHistory;
private FileSelectAdapter adapter;
DeleteFileHistoryAsyncTask(AfterDeleteFileHistoryListener afterDeleteFileHistoryListener, RecentFileHistory fileHistory, FileSelectAdapter adapter) {
this.afterDeleteFileHistoryListener = afterDeleteFileHistoryListener;
this.fileHistory = fileHistory;
this.adapter = adapter;
}
protected Void doInBackground(FileSelectBean... args) {
fileHistory.deleteFile(args[0].getFileUri());
return null;
}
protected void onPostExecute(Void v) {
adapter.notifyDataSetChanged();
if (adapter.getItemCount() == 0) {
if(afterDeleteFileHistoryListener != null)
afterDeleteFileHistoryListener.afterDeleteFile();
}
}
public interface AfterDeleteFileHistoryListener {
void afterDeleteFile();
}
}

View File

@@ -0,0 +1,90 @@
/*
* Copyright 2018 Jeremy Jamet / Kunzisoft.
*
* This file is part of KeePass DX.
*
* KeePass DX is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* KeePass DX is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with KeePass DX. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.keepassdroid.fileselect;
import android.app.Dialog;
import android.content.DialogInterface;
import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.DialogFragment;
import android.support.v7.app.AlertDialog;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.TextView;
import com.kunzisoft.keepass.R;
import java.text.DateFormat;
public class FileInformationDialogFragment extends DialogFragment {
private static final String FILE_SELECT_BEEN_ARG = "FILE_SELECT_BEEN_ARG";
public static FileInformationDialogFragment newInstance(FileSelectBean fileSelectBean) {
FileInformationDialogFragment fileInformationDialogFragment =
new FileInformationDialogFragment();
Bundle args = new Bundle();
args.putSerializable(FILE_SELECT_BEEN_ARG, fileSelectBean);
fileInformationDialogFragment.setArguments(args);
return fileInformationDialogFragment;
}
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
LayoutInflater inflater = getActivity().getLayoutInflater();
View root = inflater.inflate(R.layout.file_selection_information, null);
if (getArguments() != null && getArguments().containsKey(FILE_SELECT_BEEN_ARG)) {
FileSelectBean fileSelectBean = (FileSelectBean) getArguments().getSerializable(FILE_SELECT_BEEN_ARG);
TextView fileWarningView = (TextView) root.findViewById(R.id.file_warning);
if(fileSelectBean != null) {
TextView fileNameView = (TextView) root.findViewById(R.id.file_filename);
TextView filePathView = (TextView) root.findViewById(R.id.file_path);
TextView fileSizeView = (TextView) root.findViewById(R.id.file_size);
TextView fileModificationView = (TextView) root.findViewById(R.id.file_modification);
fileWarningView.setVisibility(View.GONE);
fileNameView.setText(fileSelectBean.getFileName());
filePathView.setText(Uri.decode(fileSelectBean.getFileUri().toString()));
fileSizeView.setText(String.valueOf(fileSelectBean.getSize()));
fileModificationView.setText(DateFormat.getDateTimeInstance()
.format(fileSelectBean.getLastModification()));
if(fileSelectBean.notFound())
showFileNotFound(fileWarningView);
} else
showFileNotFound(fileWarningView);
}
builder.setView(root);
builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
}
});
return builder.create();
}
private void showFileNotFound(TextView fileWarningView) {
fileWarningView.setVisibility(View.VISIBLE);
fileWarningView.setText(R.string.file_not_found);
}
}

View File

@@ -20,33 +20,25 @@
package com.keepassdroid.fileselect; package com.keepassdroid.fileselect;
import android.Manifest; import android.Manifest;
import android.app.Activity;
import android.content.ActivityNotFoundException; import android.content.ActivityNotFoundException;
import android.content.ContentResolver; import android.content.ContentResolver;
import android.content.Intent; import android.content.Intent;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.net.Uri; import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle; import android.os.Bundle;
import android.os.Environment; import android.os.Environment;
import android.preference.PreferenceManager; import android.preference.PreferenceManager;
import android.support.v4.app.ActivityCompat; import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat; import android.support.v4.content.ContextCompat;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar; import android.support.v7.widget.Toolbar;
import android.util.Log; import android.util.Log;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.Menu; import android.view.Menu;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.EditText; import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import com.keepassdroid.AssignMasterKeyDialog; import com.keepassdroid.AssignMasterKeyDialog;
@@ -74,20 +66,20 @@ import com.kunzisoft.keepass.R;
import java.io.File; import java.io.File;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.io.IOException; import java.io.IOException;
import java.lang.ref.WeakReference;
import java.net.URLDecoder; import java.net.URLDecoder;
public class FileSelectActivity extends StylishActivity implements public class FileSelectActivity extends StylishActivity implements
CreateFileDialog.DefinePathDialogListener , CreateFileDialog.DefinePathDialogListener ,
AssignMasterKeyDialog.AssignPasswordDialogListener { AssignMasterKeyDialog.AssignPasswordDialogListener,
FileSelectAdapter.FileSelectClearListener,
FileSelectAdapter.FileInformationShowListener {
private static final String TAG = "FileSelectActivity"; private static final String TAG = "FileSelectActivity";
private static final int MY_PERMISSIONS_REQUEST_EXTERNAL_STORAGE = 111; private static final int MY_PERMISSIONS_REQUEST_EXTERNAL_STORAGE = 111;
private ListView mList; private RecyclerView mListFiles;
private BaseAdapter mAdapter; private FileSelectAdapter mAdapter;
private View fileListTitle;
private static final int CMENU_CLEAR = Menu.FIRST;
public static final int FILE_BROWSE = 1; public static final int FILE_BROWSE = 1;
public static final int GET_CONTENT = 2; public static final int GET_CONTENT = 2;
@@ -109,25 +101,17 @@ public class FileSelectActivity extends StylishActivity implements
fileHistory = App.getFileHistory(); fileHistory = App.getFileHistory();
setContentView(R.layout.file_selection); setContentView(R.layout.file_selection);
fileListTitle = findViewById(R.id.file_list_title);
if (fileHistory.hasRecentFiles()) { if (fileHistory.hasRecentFiles()) {
recentMode = true; recentMode = true;
} else { }
findViewById(R.id.file_listtop).setVisibility(View.INVISIBLE);
}
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.setTitle(getString(R.string.app_name)); toolbar.setTitle(getString(R.string.app_name));
setSupportActionBar(toolbar); setSupportActionBar(toolbar);
mList = (ListView)findViewById(R.id.file_list); mListFiles = (RecyclerView) findViewById(R.id.file_list);
mListFiles.setLayoutManager(new LinearLayoutManager(this));
mList.setOnItemClickListener(
new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
onListItemClick((ListView)parent, v, position, id);
}
}
);
// Open button // Open button
View openButton = findViewById(R.id.open_database); View openButton = findViewById(R.id.open_database);
@@ -145,7 +129,7 @@ public class FileSelectActivity extends StylishActivity implements
} }
catch (FileNotFoundException e) { catch (FileNotFoundException e) {
Toast.makeText(FileSelectActivity.this, Toast.makeText(FileSelectActivity.this,
R.string.FileNotFound, Toast.LENGTH_LONG).show(); R.string.file_not_found, Toast.LENGTH_LONG).show();
} }
} }
}); });
@@ -217,9 +201,7 @@ public class FileSelectActivity extends StylishActivity implements
openFileNameView.setText(defaultPath); openFileNameView.setText(defaultPath);
fillData(); fillData();
registerForContextMenu(mList);
// Load default database // Load default database
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
String fileName = prefs.getString(PasswordActivity.KEY_DEFAULT_FILENAME, ""); String fileName = prefs.getString(PasswordActivity.KEY_DEFAULT_FILENAME, "");
@@ -252,6 +234,13 @@ public class FileSelectActivity extends StylishActivity implements
} }
} }
private void updateTitleFileListView() {
if(mAdapter.getItemCount() == 0)
fileListTitle.setVisibility(View.INVISIBLE);
else
fileListTitle.setVisibility(View.VISIBLE);
}
/** /**
* Create file for database * Create file for database
* @return If not created, return false * @return If not created, return false
@@ -362,7 +351,7 @@ public class FileSelectActivity extends StylishActivity implements
} }
private class AssignPasswordOnFinish extends FileOnFinish { private class AssignPasswordOnFinish extends FileOnFinish {
AssignPasswordOnFinish(FileOnFinish fileOnFinish) { AssignPasswordOnFinish(FileOnFinish fileOnFinish) {
super(fileOnFinish); super(fileOnFinish);
@@ -390,19 +379,65 @@ public class FileSelectActivity extends StylishActivity implements
// Add to recent files // Add to recent files
fileHistory.createFile(mUri, getFilename()); fileHistory.createFile(mUri, getFilename());
mAdapter.notifyDataSetChanged(); mAdapter.notifyDataSetChanged();
updateTitleFileListView();
GroupActivity.Launch(FileSelectActivity.this); GroupActivity.Launch(FileSelectActivity.this);
} }
} }
} }
private void fillData() { private void fillData() {
mAdapter = new ArrayAdapter<>(FileSelectActivity.this, R.layout.file_row, R.id.file_filename, fileHistory.getDbList()); mAdapter = new FileSelectAdapter(FileSelectActivity.this, fileHistory.getDbList());
mList.setAdapter(mAdapter); mAdapter.setOnItemClickListener(
new View.OnClickListener() {
public void onClick(View view) {
int itemPosition = mListFiles.getChildLayoutPosition(view);
new OpenFileHistoryAsyncTask(new OpenFileHistoryAsyncTask.AfterOpenFileHistoryListener() {
@Override
public void afterOpenFile(String fileName, String keyFile) {
try {
PasswordActivity.Launch(FileSelectActivity.this,
fileName, keyFile);
} catch (ContentFileNotFoundException e) {
Toast.makeText(FileSelectActivity.this,
R.string.file_not_found_content, Toast.LENGTH_LONG)
.show();
} catch (FileNotFoundException e) {
Toast.makeText(FileSelectActivity.this,
R.string.file_not_found, Toast.LENGTH_LONG)
.show();
}
updateTitleFileListView();
}
}, fileHistory).execute(itemPosition);
}
}
);
mAdapter.setFileSelectClearListener(this);
mAdapter.setFileInformationShowListener(this);
mListFiles.setAdapter(mAdapter);
} }
protected void onListItemClick(ListView l, View v, int position, long id) { @Override
new OpenFileHistoryAsyncTask(this, fileHistory).execute(position); public void onClickFileInformation(FileSelectBean fileSelectBean) {
} if (fileSelectBean != null) {
FileInformationDialogFragment fileInformationDialogFragment =
FileInformationDialogFragment.newInstance(fileSelectBean);
fileInformationDialogFragment.show(getSupportFragmentManager(), "fileInformation");
}
}
@Override
public boolean onFileSelectClearListener(final FileSelectBean fileSelectBean) {
new DeleteFileHistoryAsyncTask(new DeleteFileHistoryAsyncTask.AfterDeleteFileHistoryListener() {
@Override
public void afterDeleteFile() {
fileHistory.deleteFile(fileSelectBean.getFileUri());
mAdapter.notifyDataSetChanged();
updateTitleFileListView();
}
}, fileHistory, mAdapter).execute(fileSelectBean);
return true;
}
@Override @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) { protected void onActivityResult(int requestCode, int resultCode, Intent data) {
@@ -466,6 +501,8 @@ public class FileSelectActivity extends StylishActivity implements
FileNameView fnv = (FileNameView) findViewById(R.id.file_select); FileNameView fnv = (FileNameView) findViewById(R.id.file_select);
fnv.updateExternalStorageWarning(); fnv.updateExternalStorageWarning();
updateTitleFileListView();
} }
private void checkStoragePermission() { private void checkStoragePermission() {
@@ -535,82 +572,4 @@ public class FileSelectActivity extends StylishActivity implements
&& super.onOptionsItemSelected(item); && super.onOptionsItemSelected(item);
} }
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
menu.add(0, CMENU_CLEAR, 0, R.string.remove_from_filelist);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
super.onContextItemSelected(item);
if ( item.getItemId() == CMENU_CLEAR ) {
AdapterContextMenuInfo acmi = (AdapterContextMenuInfo) item.getMenuInfo();
TextView tv = (TextView) acmi.targetView;
String filename = tv.getText().toString();
new DeleteFileHistoryAsyncTask(fileHistory, mAdapter).execute(filename);
return true;
}
return false;
}
private static class OpenFileHistoryAsyncTask extends AsyncTask<Integer, Void, Void> {
private WeakReference<Activity> weakActivity;
private RecentFileHistory fileHistory;
private String fileName;
private String keyFile;
OpenFileHistoryAsyncTask(Activity activity, RecentFileHistory fileHistory) {
this.weakActivity = new WeakReference<>(activity);
this.fileHistory = fileHistory;
}
protected Void doInBackground(Integer... args) {
int position = args[0];
fileName = fileHistory.getDatabaseAt(position);
keyFile = fileHistory.getKeyfileAt(position);
return null;
}
protected void onPostExecute(Void v) {
try {
PasswordActivity.Launch(weakActivity.get(), fileName, keyFile);
}
catch (ContentFileNotFoundException e) {
Toast.makeText(weakActivity.get(), R.string.file_not_found_content, Toast.LENGTH_LONG)
.show();
}
catch (FileNotFoundException e) {
Toast.makeText(weakActivity.get(), R.string.FileNotFound, Toast.LENGTH_LONG)
.show();
}
}
}
private static class DeleteFileHistoryAsyncTask extends AsyncTask<String, Void, Void> {
private RecentFileHistory fileHistory;
private BaseAdapter adapter;
DeleteFileHistoryAsyncTask(RecentFileHistory fileHistory, BaseAdapter adapter) {
this.fileHistory = fileHistory;
this.adapter = adapter;
}
protected java.lang.Void doInBackground(String... args) {
fileHistory.deleteFile(Uri.parse(args[0]));
return null;
}
protected void onPostExecute(Void v) {
adapter.notifyDataSetChanged();
}
}
} }

View File

@@ -0,0 +1,160 @@
/*
* Copyright 2018 Jeremy Jamet / Kunzisoft.
*
* This file is part of KeePass DX.
*
* KeePass DX is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* KeePass DX is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with KeePass DX. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.keepassdroid.fileselect;
import android.content.Context;
import android.content.res.Resources;
import android.net.Uri;
import android.support.annotation.ColorInt;
import android.support.v7.widget.RecyclerView;
import android.util.TypedValue;
import android.view.ContextMenu;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import com.keepassdroid.settings.PrefsUtil;
import com.kunzisoft.keepass.R;
import java.util.List;
public class FileSelectAdapter extends RecyclerView.Adapter<FileSelectViewHolder> {
private static final int MENU_CLEAR = 1;
private Context context;
private LayoutInflater inflater;
private List<String> listFiles;
private View.OnClickListener mOnClickListener;
private FileSelectClearListener fileSelectClearListener;
private FileInformationShowListener fileInformationShowListener;
private @ColorInt
int warningColor;
FileSelectAdapter(Context context, List<String> listFiles) {
inflater = LayoutInflater.from(context);
this.context = context;
this.listFiles = listFiles;
TypedValue typedValue = new TypedValue();
Resources.Theme theme = context.getTheme();
theme.resolveAttribute(R.attr.colorAccentCompat, typedValue, true);
warningColor = typedValue.data;
}
@Override
public FileSelectViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = inflater.inflate(R.layout.file_row, parent, false);
view.setOnClickListener(mOnClickListener);
return new FileSelectViewHolder(view);
}
@Override
public void onBindViewHolder(FileSelectViewHolder holder, int position) {
FileSelectBean fileSelectBean = new FileSelectBean(context, listFiles.get(position));
holder.fileContainer.setOnCreateContextMenuListener(new ContextMenuBuilder(fileSelectBean));
if (PrefsUtil.isFullFilePathEnable(context))
holder.fileName.setText(Uri.decode(fileSelectBean.getFileUri().toString()));
else
holder.fileName.setText(fileSelectBean.getFileName());
holder.fileName.setTextSize(PrefsUtil.getListTextSize(context));
if(fileSelectBean.notFound()) {
holder.fileInformation.setColorFilter(
warningColor,
android.graphics.PorterDuff.Mode.MULTIPLY);
}
if (fileInformationShowListener != null)
holder.fileInformation.setOnClickListener(new FileInformationClickListener(fileSelectBean));
}
@Override
public int getItemCount() {
return listFiles.size();
}
void setOnItemClickListener(View.OnClickListener onItemClickListener) {
this.mOnClickListener = onItemClickListener;
}
void setFileSelectClearListener(FileSelectClearListener fileSelectClearListener) {
this.fileSelectClearListener = fileSelectClearListener;
}
void setFileInformationShowListener(FileInformationShowListener fileInformationShowListener) {
this.fileInformationShowListener = fileInformationShowListener;
}
public interface FileInformationShowListener {
void onClickFileInformation(FileSelectBean fileSelectBean);
}
public interface FileSelectClearListener {
boolean onFileSelectClearListener(FileSelectBean fileSelectBean);
}
private class FileInformationClickListener implements View.OnClickListener {
private FileSelectBean fileSelectBean;
FileInformationClickListener(FileSelectBean fileSelectBean) {
this.fileSelectBean = fileSelectBean;
}
@Override
public void onClick(View view) {
fileInformationShowListener.onClickFileInformation(fileSelectBean);
}
}
private class ContextMenuBuilder implements View.OnCreateContextMenuListener {
private FileSelectBean fileSelectBean;
public ContextMenuBuilder(FileSelectBean fileSelectBean) {
this.fileSelectBean = fileSelectBean;
}
@Override
public void onCreateContextMenu(ContextMenu contextMenu, View view, ContextMenu.ContextMenuInfo contextMenuInfo) {
MenuItem clearMenu = contextMenu.add(Menu.NONE, MENU_CLEAR, Menu.NONE, R.string.remove_from_filelist);
clearMenu.setOnMenuItemClickListener(mOnMyActionClickListener);
}
private MenuItem.OnMenuItemClickListener mOnMyActionClickListener = new MenuItem.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
if (item.getItemId() == MENU_CLEAR) {
return fileSelectClearListener.onFileSelectClearListener(fileSelectBean);
}
return false;
}
};
}
}

View File

@@ -0,0 +1,89 @@
/*
* Copyright 2017 Jeremy Jamet / Kunzisoft.
*
* This file is part of KeePass DX.
*
* KeePass DX is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* KeePass DX is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with KeePass DX. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.keepassdroid.fileselect;
import android.content.Context;
import android.net.Uri;
import android.support.v4.provider.DocumentFile;
import java.io.File;
import java.io.Serializable;
import java.util.Date;
public class FileSelectBean implements Serializable {
private static final String EXTERNAL_STORAGE_AUTHORITY = "com.android.externalstorage.documents";
private String fileName = "";
private Uri fileUri;
private Date lastModification = new Date();
private long size = 0;
public FileSelectBean(Context context, String pathFile) {
fileUri = Uri.parse(pathFile);
if (EXTERNAL_STORAGE_AUTHORITY.equals(fileUri.getAuthority())) {
DocumentFile file = DocumentFile.fromSingleUri(context, fileUri);
size = file.length();
fileName = file.getName();
lastModification = new Date(file.lastModified());
} else {
File file = new File(fileUri.getPath());
size = file.length();
fileName = file.getName();
lastModification = new Date(file.lastModified());
}
}
public boolean notFound() {
return getSize() == 0;
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public Uri getFileUri() {
return fileUri;
}
public void setFileUri(Uri fileUri) {
this.fileUri = fileUri;
}
public Date getLastModification() {
return lastModification;
}
public void setLastModification(Date lastModification) {
this.lastModification = lastModification;
}
public long getSize() {
return size;
}
public void setSize(long size) {
this.size = size;
}
}

View File

@@ -0,0 +1,41 @@
/*
* Copyright 2018 Jeremy Jamet / Kunzisoft.
*
* This file is part of KeePass DX.
*
* KeePass DX is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* KeePass DX is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with KeePass DX. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.keepassdroid.fileselect;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import com.kunzisoft.keepass.R;
class FileSelectViewHolder extends RecyclerView.ViewHolder {
View fileContainer;
TextView fileName;
ImageView fileInformation;
FileSelectViewHolder(View itemView) {
super(itemView);
fileContainer = itemView.findViewById(R.id.file_container);
fileName = (TextView) itemView.findViewById(R.id.file_filename);
fileInformation = (ImageView) itemView.findViewById(R.id.file_information);
}
}

View File

@@ -0,0 +1,50 @@
/*
* Copyright 2018 Jeremy Jamet / Kunzisoft.
*
* This file is part of KeePass DX.
*
* KeePass DX is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* KeePass DX is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with KeePass DX. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.keepassdroid.fileselect;
import android.os.AsyncTask;
class OpenFileHistoryAsyncTask extends AsyncTask<Integer, Void, Void> {
private AfterOpenFileHistoryListener afterOpenFileHistoryListener;
private RecentFileHistory fileHistory;
private String fileName;
private String keyFile;
OpenFileHistoryAsyncTask(AfterOpenFileHistoryListener afterOpenFileHistoryListener, RecentFileHistory fileHistory) {
this.afterOpenFileHistoryListener = afterOpenFileHistoryListener;
this.fileHistory = fileHistory;
}
protected Void doInBackground(Integer... args) {
int position = args[0];
fileName = fileHistory.getDatabaseAt(position);
keyFile = fileHistory.getKeyfileAt(position);
return null;
}
protected void onPostExecute(Void v) {
afterOpenFileHistoryListener.afterOpenFile(fileName, keyFile);
}
public interface AfterOpenFileHistoryListener {
void afterOpenFile(String fileName, String keyFile);
}
}

View File

@@ -34,8 +34,14 @@ import android.util.Base64;
import com.keepassdroid.compat.BuildCompat; import com.keepassdroid.compat.BuildCompat;
import java.io.IOException;
import java.security.KeyStore; import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher; import javax.crypto.Cipher;
import javax.crypto.KeyGenerator; import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey; import javax.crypto.SecretKey;
@@ -43,7 +49,7 @@ import javax.crypto.spec.IvParameterSpec;
public class FingerPrintHelper { public class FingerPrintHelper {
private static final String ALIAS_KEY = "example-key"; private static final String FINGERPRINT_KEYSTORE_KEY = "example-key";
private FingerprintManagerCompat fingerprintManager; private FingerprintManagerCompat fingerprintManager;
private KeyStore keyStore = null; private KeyStore keyStore = null;
@@ -74,7 +80,7 @@ public class FingerPrintHelper {
} }
public void stopListening() { public void stopListening() {
if (!isFingerprintInitialized()) { if (!isFingerprintInitialized(false)) {
return; return;
} }
if (cancellationSignal != null) { if (cancellationSignal != null) {
@@ -83,13 +89,6 @@ public class FingerPrintHelper {
} }
} }
public interface FingerPrintCallback {
void handleEncryptedResult(String value, String ivSpec);
void handleDecryptedResult(String value);
void onInvalidKeyException();
void onFingerprintException(Exception e);
}
@TargetApi(BuildCompat.VERSION_CODE_M) @TargetApi(BuildCompat.VERSION_CODE_M)
public FingerPrintHelper( public FingerPrintHelper(
final Context context, final Context context,
@@ -118,20 +117,26 @@ public class FingerPrintHelper {
setInitOk(true); setInitOk(true);
} catch (final Exception e) { } catch (final Exception e) {
setInitOk(false); setInitOk(false);
fingerPrintCallback.onFingerprintException(e); fingerPrintCallback.onFingerPrintException(e);
} }
} }
} }
public boolean isFingerprintSupported(FingerprintManagerCompat fingerprintManager) { public static boolean isFingerprintSupported(FingerprintManagerCompat fingerprintManager) {
return Build.VERSION.SDK_INT >= BuildCompat.VERSION_CODE_M return Build.VERSION.SDK_INT >= BuildCompat.VERSION_CODE_M
&& fingerprintManager != null
&& fingerprintManager.isHardwareDetected(); && fingerprintManager.isHardwareDetected();
} }
public boolean isFingerprintInitialized() { public boolean isFingerprintInitialized() {
return isFingerprintInitialized(true);
}
public boolean isFingerprintInitialized(boolean throwException) {
boolean isFingerprintInit = hasEnrolledFingerprints() && initOk; boolean isFingerprintInit = hasEnrolledFingerprints() && initOk;
if (!isFingerprintInit && fingerPrintCallback != null) { if (!isFingerprintInit && fingerPrintCallback != null) {
fingerPrintCallback.onFingerprintException(new Exception("FingerPrint not initialized")); if(throwException)
fingerPrintCallback.onFingerPrintException(new Exception("FingerPrint not initialized"));
} }
return isFingerprintInit; return isFingerprintInit;
} }
@@ -144,16 +149,17 @@ public class FingerPrintHelper {
try { try {
createNewKeyIfNeeded(false); // no need to keep deleting existing keys createNewKeyIfNeeded(false); // no need to keep deleting existing keys
keyStore.load(null); keyStore.load(null);
final SecretKey key = (SecretKey) keyStore.getKey(ALIAS_KEY, null); final SecretKey key = (SecretKey) keyStore.getKey(FINGERPRINT_KEYSTORE_KEY, null);
cipher.init(Cipher.ENCRYPT_MODE, key); cipher.init(Cipher.ENCRYPT_MODE, key);
stopListening(); stopListening();
startListening(); startListening();
} catch (final UnrecoverableKeyException unrecoverableKeyException) {
deleteEntryKey();
} catch (final KeyPermanentlyInvalidatedException invalidKeyException) { } catch (final KeyPermanentlyInvalidatedException invalidKeyException) {
fingerPrintCallback.onInvalidKeyException(); fingerPrintCallback.onInvalidKeyException(invalidKeyException);
} catch (final Exception e) { } catch (final Exception e) {
fingerPrintCallback.onFingerprintException(e); fingerPrintCallback.onFingerPrintException(e);
} }
} }
@@ -164,7 +170,7 @@ public class FingerPrintHelper {
try { try {
// actual do encryption here // actual do encryption here
byte[] encrypted = cipher.doFinal(value.getBytes()); byte[] encrypted = cipher.doFinal(value.getBytes());
final String encryptedValue = Base64.encodeToString(encrypted, 0 /* flags */); final String encryptedValue = Base64.encodeToString(encrypted, Base64.DEFAULT);
// passes updated iv spec on to callback so this can be stored for decryption // passes updated iv spec on to callback so this can be stored for decryption
final IvParameterSpec spec = cipher.getParameters().getParameterSpec(IvParameterSpec.class); final IvParameterSpec spec = cipher.getParameters().getParameterSpec(IvParameterSpec.class);
@@ -172,7 +178,7 @@ public class FingerPrintHelper {
fingerPrintCallback.handleEncryptedResult(encryptedValue, ivSpecValue); fingerPrintCallback.handleEncryptedResult(encryptedValue, ivSpecValue);
} catch (final Exception e) { } catch (final Exception e) {
fingerPrintCallback.onFingerprintException(e); fingerPrintCallback.onFingerPrintException(e);
} }
} }
@@ -184,7 +190,7 @@ public class FingerPrintHelper {
try { try {
createNewKeyIfNeeded(false); createNewKeyIfNeeded(false);
keyStore.load(null); keyStore.load(null);
final SecretKey key = (SecretKey) keyStore.getKey(ALIAS_KEY, null); final SecretKey key = (SecretKey) keyStore.getKey(FINGERPRINT_KEYSTORE_KEY, null);
// important to restore spec here that was used for decryption // important to restore spec here that was used for decryption
final byte[] iv = Base64.decode(ivSpecValue, Base64.DEFAULT); final byte[] iv = Base64.decode(ivSpecValue, Base64.DEFAULT);
@@ -195,9 +201,11 @@ public class FingerPrintHelper {
startListening(); startListening();
} catch (final KeyPermanentlyInvalidatedException invalidKeyException) { } catch (final KeyPermanentlyInvalidatedException invalidKeyException) {
fingerPrintCallback.onInvalidKeyException(); fingerPrintCallback.onInvalidKeyException(invalidKeyException);
} catch (final UnrecoverableKeyException unrecoverableKeyException) {
deleteEntryKey();
} catch (final Exception e) { } catch (final Exception e) {
fingerPrintCallback.onFingerprintException(e); fingerPrintCallback.onFingerPrintException(e);
} }
} }
@@ -207,14 +215,16 @@ public class FingerPrintHelper {
} }
try { try {
// actual decryption here // actual decryption here
final byte[] encrypted = Base64.decode(encryptedValue, 0); final byte[] encrypted = Base64.decode(encryptedValue, Base64.DEFAULT);
byte[] decrypted = cipher.doFinal(encrypted); byte[] decrypted = cipher.doFinal(encrypted);
final String decryptedString = new String(decrypted); final String decryptedString = new String(decrypted);
//final String encryptedString = Base64.encodeToString(encrypted, 0 /* flags */); //final String encryptedString = Base64.encodeToString(encrypted, 0 /* flags */);
fingerPrintCallback.handleDecryptedResult(decryptedString); fingerPrintCallback.handleDecryptedResult(decryptedString);
} catch (final BadPaddingException badPaddingException) {
fingerPrintCallback.onInvalidKeyException(badPaddingException);
} catch (final Exception e) { } catch (final Exception e) {
fingerPrintCallback.onFingerprintException(e); fingerPrintCallback.onFingerPrintException(e);
} }
} }
@@ -226,18 +236,17 @@ public class FingerPrintHelper {
try { try {
keyStore.load(null); keyStore.load(null);
if (allowDeleteExisting if (allowDeleteExisting
&& keyStore.containsAlias(ALIAS_KEY)) { && keyStore.containsAlias(FINGERPRINT_KEYSTORE_KEY)) {
keyStore.deleteEntry(FINGERPRINT_KEYSTORE_KEY);
keyStore.deleteEntry(ALIAS_KEY);
} }
// Create new key if needed // Create new key if needed
if (!keyStore.containsAlias(ALIAS_KEY)) { if (!keyStore.containsAlias(FINGERPRINT_KEYSTORE_KEY)) {
// Set the alias of the entry in Android KeyStore where the key will appear // Set the alias of the entry in Android KeyStore where the key will appear
// and the constrains (purposes) in the constructor of the Builder // and the constrains (purposes) in the constructor of the Builder
keyGenerator.init( keyGenerator.init(
new KeyGenParameterSpec.Builder( new KeyGenParameterSpec.Builder(
ALIAS_KEY, FINGERPRINT_KEYSTORE_KEY,
KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_ENCRYPT |
KeyProperties.PURPOSE_DECRYPT) KeyProperties.PURPOSE_DECRYPT)
.setBlockModes(KeyProperties.BLOCK_MODE_CBC) .setBlockModes(KeyProperties.BLOCK_MODE_CBC)
@@ -249,7 +258,19 @@ public class FingerPrintHelper {
keyGenerator.generateKey(); keyGenerator.generateKey();
} }
} catch (final Exception e) { } catch (final Exception e) {
fingerPrintCallback.onFingerprintException(e); fingerPrintCallback.onFingerPrintException(e);
}
}
public void deleteEntryKey() {
try {
keyStore.load(null);
keyStore.deleteEntry(FINGERPRINT_KEYSTORE_KEY);
} catch (KeyStoreException
| CertificateException
| NoSuchAlgorithmException
| IOException e) {
fingerPrintCallback.onFingerPrintException(e);
} }
} }
@@ -257,8 +278,6 @@ public class FingerPrintHelper {
public boolean hasEnrolledFingerprints() { public boolean hasEnrolledFingerprints() {
// fingerprint hardware supported and api level OK // fingerprint hardware supported and api level OK
return isFingerprintSupported(fingerprintManager) return isFingerprintSupported(fingerprintManager)
&& fingerprintManager != null
&& fingerprintManager.isHardwareDetected()
// fingerprints enrolled // fingerprints enrolled
&& fingerprintManager.hasEnrolledFingerprints() && fingerprintManager.hasEnrolledFingerprints()
// and lockscreen configured // and lockscreen configured
@@ -269,4 +288,40 @@ public class FingerPrintHelper {
this.initOk = initOk; this.initOk = initOk;
} }
/**
* Remove entry key in keystore
*/
public static void deleteEntryKeyInKeystoreForFingerprints(final Context context,
final FingerPrintErrorCallback fingerPrintCallback) {
FingerPrintHelper fingerPrintHelper = new FingerPrintHelper(
context, new FingerPrintCallback() {
@Override
public void handleEncryptedResult(String value, String ivSpec) {}
@Override
public void handleDecryptedResult(String value) {}
@Override
public void onInvalidKeyException(Exception e) {
fingerPrintCallback.onInvalidKeyException(e);
}
@Override
public void onFingerPrintException(Exception e) {
fingerPrintCallback.onFingerPrintException(e);
}
});
fingerPrintHelper.deleteEntryKey();
}
public interface FingerPrintErrorCallback {
void onInvalidKeyException(Exception e);
void onFingerPrintException(Exception e);
}
public interface FingerPrintCallback extends FingerPrintErrorCallback {
void handleEncryptedResult(String value, String ivSpec);
void handleDecryptedResult(String value);
}
} }

View File

@@ -5,7 +5,6 @@ import android.os.Bundle;
import android.support.v4.app.DialogFragment; import android.support.v4.app.DialogFragment;
import android.support.v7.preference.Preference; import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceFragmentCompat; import android.support.v7.preference.PreferenceFragmentCompat;
import android.widget.Toast;
import com.keepassdroid.Database; import com.keepassdroid.Database;
import com.keepassdroid.app.App; import com.keepassdroid.app.App;

View File

@@ -19,22 +19,26 @@
*/ */
package com.keepassdroid.settings; package com.keepassdroid.settings;
import android.content.DialogInterface;
import android.content.res.Resources; import android.content.res.Resources;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.support.v14.preference.SwitchPreference; import android.support.v14.preference.SwitchPreference;
import android.support.v4.app.DialogFragment; import android.support.v4.app.DialogFragment;
import android.support.v4.hardware.fingerprint.FingerprintManagerCompat;
import android.support.v7.app.AlertDialog;
import android.support.v7.preference.Preference; import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceFragmentCompat; import android.support.v7.preference.PreferenceFragmentCompat;
import android.util.Log; import android.util.Log;
import android.widget.Toast; import android.widget.Toast;
import com.keepassdroid.UnavailableFeatureDialog;
import com.kunzisoft.keepass.R;
import com.keepassdroid.Database; import com.keepassdroid.Database;
import com.keepassdroid.UnavailableFeatureDialog;
import com.keepassdroid.app.App; import com.keepassdroid.app.App;
import com.keepassdroid.database.PwEncryptionAlgorithm; import com.keepassdroid.database.PwEncryptionAlgorithm;
import com.keepassdroid.fingerprint.FingerPrintHelper;
import com.keepassdroid.stylish.Stylish; import com.keepassdroid.stylish.Stylish;
import com.kunzisoft.keepass.R;
public class NestedSettingsFragment extends PreferenceFragmentCompat { public class NestedSettingsFragment extends PreferenceFragmentCompat {
@@ -103,11 +107,11 @@ public class NestedSettingsFragment extends PreferenceFragmentCompat {
} }
}); });
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { SwitchPreference fingerprintEnablePreference = (SwitchPreference) findPreference(getString(R.string.fingerprint_enable_key));
if (!FingerPrintHelper.isFingerprintSupported(FingerprintManagerCompat.from(getContext()))) {
// False if under Marshmallow // False if under Marshmallow
SwitchPreference preference = (SwitchPreference) findPreference(getString(R.string.fingerprint_enable_key)); fingerprintEnablePreference.setDefaultValue(false);
preference.setDefaultValue(false); fingerprintEnablePreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
preference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override @Override
public boolean onPreferenceClick(Preference preference) { public boolean onPreferenceClick(Preference preference) {
((SwitchPreference) preference).setChecked(false); ((SwitchPreference) preference).setChecked(false);
@@ -118,6 +122,46 @@ public class NestedSettingsFragment extends PreferenceFragmentCompat {
}); });
} }
Preference deleteKeysFingerprints = findPreference(getString(R.string.fingerprint_delete_all_key));
deleteKeysFingerprints.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
new AlertDialog.Builder(getContext())
.setMessage(getResources().getString(R.string.fingerprint_delete_all_warning))
.setIcon(getResources().getDrawable(
android.R.drawable.ic_dialog_alert))
.setPositiveButton(
getResources().getString(android.R.string.yes),
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
FingerPrintHelper.deleteEntryKeyInKeystoreForFingerprints(
getContext(),
new FingerPrintHelper.FingerPrintErrorCallback() {
@Override
public void onInvalidKeyException(Exception e) {}
@Override
public void onFingerPrintException(Exception e) {
Toast.makeText(getContext(), R.string.fingerprint_error, Toast.LENGTH_SHORT).show();
}
});
PrefsUtil.deleteAllValuesFromNoBackupPreferences(getContext());
}
})
.setNegativeButton(
getResources().getString(android.R.string.no),
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
}
}).show();
return false;
}
});
break; break;
case NESTED_SCREEN_DB_KEY: case NESTED_SCREEN_DB_KEY:

View File

@@ -31,6 +31,21 @@ import java.util.Set;
public class PrefsUtil { public class PrefsUtil {
private static final String NO_BACKUP_PREFERENCE_FILE_NAME = "nobackup";
public static SharedPreferences getNoBackupSharedPreferences(Context ctx) {
return ctx.getSharedPreferences(
PrefsUtil.NO_BACKUP_PREFERENCE_FILE_NAME,
Context.MODE_PRIVATE);
}
public static void deleteAllValuesFromNoBackupPreferences(Context ctx) {
SharedPreferences prefsNoBackup = getNoBackupSharedPreferences(ctx);
SharedPreferences.Editor sharedPreferencesEditor = prefsNoBackup.edit();
sharedPreferencesEditor.clear();
sharedPreferencesEditor.apply();
}
public static float getListTextSize(Context ctx) { public static float getListTextSize(Context ctx) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(ctx); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(ctx);
return Float.parseFloat(prefs.getString(ctx.getString(R.string.list_size_key), ctx.getString(R.string.list_size_default))); return Float.parseFloat(prefs.getString(ctx.getString(R.string.list_size_key), ctx.getString(R.string.list_size_default)));
@@ -67,4 +82,10 @@ public class PrefsUtil {
return prefs.getBoolean(ctx.getString(R.string.fingerprint_enable_key), return prefs.getBoolean(ctx.getString(R.string.fingerprint_enable_key),
ctx.getResources().getBoolean(R.bool.fingerprint_enable_default)); ctx.getResources().getBoolean(R.bool.fingerprint_enable_default));
} }
public static boolean isFullFilePathEnable(Context ctx) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(ctx);
return prefs.getBoolean(ctx.getString(R.string.full_file_path_enable_key),
ctx.getResources().getBoolean(R.bool.full_file_path_enable_default));
}
} }

View File

@@ -21,17 +21,37 @@ package com.keepassdroid.utils;
import org.joda.time.DateTime; import org.joda.time.DateTime;
import org.joda.time.DateTimeZone; import org.joda.time.DateTimeZone;
import org.joda.time.Seconds;
import java.util.Date; import java.util.Date;
public class DateUtil { public class DateUtil {
private static final DateTime dotNetEpoch = new DateTime(1, 1, 1, 0, 0, 0, DateTimeZone.UTC); private static final DateTime dotNetEpoch = new DateTime(1, 1, 1, 0, 0, 0, DateTimeZone.UTC);
private static final DateTime javaEpoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeZone.UTC);
private static final long epochOffset;
static {
Date dotNet = dotNetEpoch.toDate();
Date java = javaEpoch.toDate();
epochOffset = (javaEpoch.getMillis() - dotNetEpoch.getMillis()) / 1000L;
}
public static Date convertKDBX4Time(long seconds) { public static Date convertKDBX4Time(long seconds) {
return dotNetEpoch.plus(seconds).toDate();
DateTime dt = dotNetEpoch.plus(seconds * 1000L);
// Switch corrupted dates to a more recent date that won't cause issues on the client
if (dt.isBefore(javaEpoch)) {
return javaEpoch.toDate();
}
return dt.toDate();
} }
public static long convertDateToKDBX4Time(DateTime dt) { public static long convertDateToKDBX4Time(DateTime dt) {
return (dt.getMillis() / 1000) - (dotNetEpoch.getMillis() / 1000); Seconds secs = Seconds.secondsBetween(javaEpoch, dt);
return secs.getSeconds() + epochOffset;
} }
} }

View File

@@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FFFFFF"
android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM13,17h-2v-6h2v6zM13,9h-2L11,7h2v2z"/>
</vector>

View File

@@ -17,11 +17,35 @@
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with KeePass DX. If not, see <http://www.gnu.org/licenses/>. along with KeePass DX. If not, see <http://www.gnu.org/licenses/>.
--> -->
<TextView xmlns:android="http://schemas.android.com/apk/res/android" <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/file_filename" android:id="@+id/file_container"
android:layout_width="wrap_content" android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:paddingTop="8dp" android:background="?android:attr/selectableItemBackground">
android:paddingLeft="18dp" <android.support.v7.widget.AppCompatTextView
android:paddingRight="18dp" android:id="@+id/file_filename"
android:paddingBottom="8dp" /> android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_centerVertical="true"
android:layout_toLeftOf="@+id/file_information"
android:layout_toStartOf="@+id/file_information"
android:paddingBottom="18dp"
android:paddingEnd="18dp"
android:paddingLeft="18dp"
android:paddingRight="18dp"
android:paddingStart="18dp"
android:paddingTop="18dp" />
<android.support.v7.widget.AppCompatImageView
android:id="@+id/file_information"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:padding="18dp"
android:src="@drawable/ic_info_white_24dp"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:tint="?attr/colorPrimary"/>
</RelativeLayout>

View File

@@ -18,37 +18,91 @@
along with KeePass DX. If not, see <http://www.gnu.org/licenses/>. along with KeePass DX. If not, see <http://www.gnu.org/licenses/>.
--> -->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_height="match_parent" android:layout_width="match_parent"
android:orientation="vertical"> android:layout_height="match_parent">
<LinearLayout
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent">
android:orientation="vertical">
<include <android.support.design.widget.AppBarLayout
android:id="@+id/toolbar" android:id="@+id/app_bar"
layout="@layout/toolbar_default" />
<com.keepassdroid.view.FileNameView android:id="@+id/file_select"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<TextView android:id="@+id/file_listtop"
android:layout_marginLeft="@dimen/default_margin"
android:layout_marginStart="@dimen/default_margin"
android:layout_marginRight="@dimen/default_margin"
android:layout_marginEnd="@dimen/default_margin"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
style="@style/KeepassDXStyle.TextAppearance.Title" android:elevation="4dp"
android:text="@string/open_recent" /> android:fitsSystemWindows="true">
<ListView android:id="@+id/file_list" <android.support.design.widget.CollapsingToolbarLayout
android:id="@+id/toolbar_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:titleEnabled="false"
app:contentScrim="?attr/colorPrimary"
app:layout_scrollFlags="scroll|enterAlways|snap">
<com.keepassdroid.view.FileNameView android:id="@+id/file_select"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="?attr/actionBarSize"/>
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:theme="?attr/toolbarAppearance"
app:popupTheme="?attr/toolbarPopupAppearance"
app:layout_collapseMode="pin"/>
</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
<android.support.design.widget.FloatingActionButton
android:id="@+id/open_database"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="24dp"
android:layout_marginLeft="24dp"
android:layout_marginEnd="24dp"
android:layout_marginRight="24dp"
android:layout_marginBottom="48dp"
android:paddingTop="-20dp"
app:fabSize="mini"
app:layout_anchor="@id/app_bar"
app:layout_anchorGravity="bottom|end"
android:src="@drawable/ic_open_folder_white_24dp" />
<android.support.v4.widget.NestedScrollView
app:layout_behavior="@string/appbar_scrolling_view_behavior"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" /> android:layout_height="match_parent"
android:layout_gravity="fill_vertical"
android:fillViewport="true">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
</LinearLayout> <TextView android:id="@+id/file_list_title"
android:layout_marginTop="@dimen/default_margin"
android:layout_marginLeft="@dimen/default_margin"
android:layout_marginStart="@dimen/default_margin"
android:layout_marginRight="@dimen/default_margin"
android:layout_marginEnd="@dimen/default_margin"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/KeepassDXStyle.TextAppearance.Title"
android:text="@string/open_recent" />
<android.support.v7.widget.RecyclerView
android:id="@+id/file_list"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
</android.support.v4.widget.NestedScrollView>
</android.support.design.widget.CoordinatorLayout>
<android.support.design.widget.FloatingActionButton <android.support.design.widget.FloatingActionButton
android:id="@+id/create_database" android:id="@+id/create_database"
@@ -59,5 +113,4 @@
android:layout_alignParentBottom="true" android:layout_alignParentBottom="true"
android:src="@drawable/ic_database_plus_white_24dp" android:src="@drawable/ic_database_plus_white_24dp"
style="@style/KeepassDXStyle.Fab"/> style="@style/KeepassDXStyle.Fab"/>
</RelativeLayout> </RelativeLayout>

View File

@@ -24,9 +24,9 @@
<android.support.v7.widget.CardView <android.support.v7.widget.CardView
android:id="@+id/filename_container" android:id="@+id/filename_container"
app:cardBackgroundColor="?attr/colorPrimary"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content">
android:layout_marginBottom="32dp">
<RelativeLayout <RelativeLayout
android:layout_width="wrap_content" android:layout_width="wrap_content"
@@ -36,7 +36,7 @@
android:layout_marginStart="@dimen/default_margin" android:layout_marginStart="@dimen/default_margin"
android:layout_marginRight="@dimen/default_margin" android:layout_marginRight="@dimen/default_margin"
android:layout_marginEnd="@dimen/default_margin" android:layout_marginEnd="@dimen/default_margin"
android:layout_marginBottom="12dp"> android:layout_marginBottom="22dp">
<TextView android:id="@+id/label_warning" <TextView android:id="@+id/label_warning"
android:layout_width="wrap_content" android:layout_width="wrap_content"
@@ -47,7 +47,7 @@
<TextView android:id="@+id/label_open_by_filename" <TextView android:id="@+id/label_open_by_filename"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
style="@style/KeepassDXStyle.TextAppearance.Title" style="@style/KeepassDXStyle.TextAppearance.Inverse"
android:text="@string/enter_filename"/> android:text="@string/enter_filename"/>
<android.support.v7.widget.AppCompatImageView <android.support.v7.widget.AppCompatImageView
@@ -68,6 +68,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_below="@id/label_open_by_filename" android:layout_below="@id/label_open_by_filename"
android:inputType="textUri" android:inputType="textUri"
android:textColor="?attr/textColorInverse"
android:layout_toLeftOf="@+id/browse_button" android:layout_toLeftOf="@+id/browse_button"
android:layout_toStartOf="@+id/browse_button" android:layout_toStartOf="@+id/browse_button"
android:maxLines="1" /> android:maxLines="1" />
@@ -75,18 +76,4 @@
</android.support.v7.widget.CardView> </android.support.v7.widget.CardView>
<android.support.design.widget.FloatingActionButton
android:id="@+id/open_database"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/filename_container"
android:layout_marginStart="24dp"
android:layout_marginLeft="24dp"
android:layout_marginEnd="24dp"
android:layout_marginRight="24dp"
app:fabSize="mini"
app:layout_anchor="@id/filename_container"
app:layout_anchorGravity="bottom|start"
android:src="@drawable/ic_open_folder_white_24dp" />
</android.support.design.widget.CoordinatorLayout> </android.support.design.widget.CoordinatorLayout>

View File

@@ -0,0 +1,72 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="@dimen/default_margin">
<android.support.v7.widget.AppCompatTextView
android:id="@+id/file_filename"
android:layout_margin="8dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/KeepassDXStyle.TextAppearance.LargeTitle"/>
<android.support.v7.widget.AppCompatTextView
android:id="@+id/file_path"
android:layout_margin="8dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="end"
android:textStyle="italic"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="end">
<android.support.v7.widget.AppCompatTextView
android:id="@+id/file_modification_label"
android:layout_margin="8dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/entry_modified"/>
<android.support.v7.widget.AppCompatTextView
android:id="@+id/file_modification"
android:layout_margin="8dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="end" />
</LinearLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp">
<android.support.v7.widget.AppCompatTextView
android:id="@+id/file_size"
android:layout_marginLeft="8dp"
android:layout_marginStart="8dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toLeftOf="@+id/file_size_unit"
android:layout_toStartOf="@+id/file_size_unit"
android:gravity="end" />
<android.support.v7.widget.AppCompatTextView
android:id="@+id/file_size_unit"
android:layout_marginLeft="8dp"
android:layout_marginStart="8dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/bytes"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true" />
</RelativeLayout>
<android.support.v7.widget.AppCompatTextView
android:id="@+id/file_warning"
android:layout_margin="8dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"
style="@style/KeepassDXStyle.TextAppearance.WarningTextStyle"/>
</LinearLayout>

View File

@@ -51,7 +51,7 @@
<string name="decrypting_entry">Desencriptant entrada</string> <string name="decrypting_entry">Desencriptant entrada</string>
<string name="default_checkbox">Utilitza aquesta com a base de dades per defecte</string> <string name="default_checkbox">Utilitza aquesta com a base de dades per defecte</string>
<string name="digits">Dígits</string> <string name="digits">Dígits</string>
<string name="disclaimer_formal">KeePass DX Copyright 2017 Brian Pellin, Jeremy Jamet / Kunzisoft ve SENSE CAP MENA DE GARANTIA; Això és programari lliure, i pots redistribuïr-lo sota els termes de la llicència GPL versió 2 o posterior.</string> <string name="disclaimer_formal">KeePass DX \u00A9 %1$d Jeremy Jamet / Kunzisoft, Brian Pellin ve SENSE CAP MENA DE GARANTIA; Això és programari lliure, i pots redistribuïr-lo sota els termes de la llicència GPL versió 2 o posterior.</string>
<string name="ellipsis">\u2026</string> <string name="ellipsis">\u2026</string>
<string name="enter_filename">Introdueix el nom de la base de dades:</string> <string name="enter_filename">Introdueix el nom de la base de dades:</string>
<string name="entry_accessed">Accedida: </string> <string name="entry_accessed">Accedida: </string>
@@ -88,7 +88,7 @@
<string name="error_rounds_too_large">Massa passades. Establint a 2147483648.</string> <string name="error_rounds_too_large">Massa passades. Establint a 2147483648.</string>
<string name="error_title_required">És necessari un títol.</string> <string name="error_title_required">És necessari un títol.</string>
<string name="error_wrong_length">Insereix un enter positiu al camp longitud</string> <string name="error_wrong_length">Insereix un enter positiu al camp longitud</string>
<string name="FileNotFound">Arxiu no trobat.</string> <string name="file_not_found">Arxiu no trobat.</string>
<string name="file_browser">Explorador d\'arxius</string> <string name="file_browser">Explorador d\'arxius</string>
<string name="generate_password">Generar contrasenya</string> <string name="generate_password">Generar contrasenya</string>
<string name="group">Grup</string> <string name="group">Grup</string>
@@ -138,7 +138,7 @@
<string name="no_keys">Sense entrades a la base de dades o grup.</string> <string name="no_keys">Sense entrades a la base de dades o grup.</string>
<string name="no_results">Cap resultat de cerca</string> <string name="no_results">Cap resultat de cerca</string>
<string name="no_url_handler">Sense gestor per aquesta url.</string> <string name="no_url_handler">Sense gestor per aquesta url.</string>
<string name="open_recent">Obre base de dades recent (clica per obrir):</string> <string name="open_recent">Obre base de dades recent :</string>
<string name="omitbackup_title">No cerquis entrades a còpia de seguretat ni paperera</string> <string name="omitbackup_title">No cerquis entrades a còpia de seguretat ni paperera</string>
<string name="omitbackup_summary">Omet els grups \'Còpia de seguretat\' i paperera dels resultats de cerca</string> <string name="omitbackup_summary">Omet els grups \'Còpia de seguretat\' i paperera dels resultats de cerca</string>
<string name="pass_filename">Nom de base de dades KeePass:</string> <string name="pass_filename">Nom de base de dades KeePass:</string>

View File

@@ -56,7 +56,7 @@
<string name="decrypting_entry">Dešifruji záznam</string> <string name="decrypting_entry">Dešifruji záznam</string>
<string name="default_checkbox">Použít jako výchozí databázi</string> <string name="default_checkbox">Použít jako výchozí databázi</string>
<string name="digits">Čísla</string> <string name="digits">Čísla</string>
<string name="disclaimer_formal">KeePass DX Copyright 2017 Brian Pellin, Jeremy Jamet / Kunzisoft dodáván BEZ JAKÉKOLIV ZÁRUKY; Toto je free software zdarma, a je možná jeho redistribuce pod podmínkou licence GPL verze 2 nebo novější.</string> <string name="disclaimer_formal">KeePass DX \u00A9 %1$d Jeremy Jamet / Kunzisoft, Brian Pellin dodáván BEZ JAKÉKOLIV ZÁRUKY; Toto je free software zdarma, a je možná jeho redistribuce pod podmínkou licence GPL verze 2 nebo novější.</string>
<string name="ellipsis">\u2026</string> <string name="ellipsis">\u2026</string>
<string name="enter_filename">Zadejte názvev souboru databáze:</string> <string name="enter_filename">Zadejte názvev souboru databáze:</string>
<string name="entry_accessed">Poslední přístup: </string> <string name="entry_accessed">Poslední přístup: </string>
@@ -97,7 +97,7 @@
<string name="error_wrong_length">Zadejte celé kladné číslo do délky pole</string> <string name="error_wrong_length">Zadejte celé kladné číslo do délky pole</string>
<string name="field_name">Název pole</string> <string name="field_name">Název pole</string>
<string name="field_value">Hodnota pole</string> <string name="field_value">Hodnota pole</string>
<string name="FileNotFound">Soubor nenalezen.</string> <string name="file_not_found">Soubor nenalezen.</string>
<string name="file_browser">Správce souborů</string> <string name="file_browser">Správce souborů</string>
<string name="generate_password">Generovat heslo</string> <string name="generate_password">Generovat heslo</string>
<string name="group">Skupina</string> <string name="group">Skupina</string>
@@ -150,7 +150,7 @@
<string name="no_keys">Žádný záznam v databázi nebo ve skupině.</string> <string name="no_keys">Žádný záznam v databázi nebo ve skupině.</string>
<string name="no_results">žádný výsledek hledání</string> <string name="no_results">žádný výsledek hledání</string>
<string name="no_url_handler">Žádný handler pro toto url.</string> <string name="no_url_handler">Žádný handler pro toto url.</string>
<string name="open_recent">Otevřít poslední databázi (kliknout pro otevření):</string> <string name="open_recent">Otevřít poslední databázi :</string>
<string name="omitbackup_title">Neprohledávat zálohy a koš</string> <string name="omitbackup_title">Neprohledávat zálohy a koš</string>
<string name="omitbackup_summary">Vynechat skupiny Záloha a Koš ve výsledcích hledání</string> <string name="omitbackup_summary">Vynechat skupiny Záloha a Koš ve výsledcích hledání</string>
<string name="pass_filename">Název souboru KeePass databáze:</string> <string name="pass_filename">Název souboru KeePass databáze:</string>

View File

@@ -55,7 +55,7 @@
<string name="decrypting_entry">Dekrypterer post</string> <string name="decrypting_entry">Dekrypterer post</string>
<string name="default_checkbox">Brug denne database som standard</string> <string name="default_checkbox">Brug denne database som standard</string>
<string name="digits">Cifre</string> <string name="digits">Cifre</string>
<string name="disclaimer_formal">KeePass DX Copyright 2017 Brian Pellin, Jeremy Jamet / Kunzisoft comes with ABSOLUTELY NO WARRANTY; This is free software, and you are welcome to redistribute it under the conditions of the GPL version 2 or later.</string> <string name="disclaimer_formal">KeePass DX \u00A9 %1$d Jeremy Jamet / Kunzisoft, Brian Pellin comes with ABSOLUTELY NO WARRANTY; This is free software, and you are welcome to redistribute it under the conditions of the GPL version 2 or later.</string>
<string name="ellipsis">\u2026</string> <string name="ellipsis">\u2026</string>
<string name="enter_filename">Angiv navn på databasefil:</string> <string name="enter_filename">Angiv navn på databasefil:</string>
<string name="entry_accessed">Senest åbnet: </string> <string name="entry_accessed">Senest åbnet: </string>
@@ -96,7 +96,7 @@
<string name="error_wrong_length">Angiv et positivt helt tal i feltet</string> <string name="error_wrong_length">Angiv et positivt helt tal i feltet</string>
<string name="field_name">Felt-navn</string> <string name="field_name">Felt-navn</string>
<string name="field_value">Felt-værdi</string> <string name="field_value">Felt-værdi</string>
<string name="FileNotFound">Filen blev ikke fundet.</string> <string name="file_not_found">Filen blev ikke fundet.</string>
<string name="file_browser">Fil-browser</string> <string name="file_browser">Fil-browser</string>
<string name="generate_password">Generer adgangskode</string> <string name="generate_password">Generer adgangskode</string>
<string name="group">Gruppe</string> <string name="group">Gruppe</string>
@@ -149,7 +149,7 @@
<string name="no_keys">Ingen poster i databasen eller gruppen.</string> <string name="no_keys">Ingen poster i databasen eller gruppen.</string>
<string name="no_results">Ingen søgeresultater</string> <string name="no_results">Ingen søgeresultater</string>
<string name="no_url_handler">Kan ikke håndtere denne url.</string> <string name="no_url_handler">Kan ikke håndtere denne url.</string>
<string name="open_recent">Åbn seneste database (klik for at åbne):</string> <string name="open_recent">Åbn seneste database :</string>
<string name="omitbackup_title">Søg ikke efter backup poster og poster i papirkurven</string> <string name="omitbackup_title">Søg ikke efter backup poster og poster i papirkurven</string>
<string name="omitbackup_summary">Udelad \'Backup\' og papirkurvs-gruppen i søgeresultater</string> <string name="omitbackup_summary">Udelad \'Backup\' og papirkurvs-gruppen i søgeresultater</string>
<string name="pass_filename">KeePass database filnavn:</string> <string name="pass_filename">KeePass database filnavn:</string>

View File

@@ -42,7 +42,7 @@
<string name="brackets">Klammern</string> <string name="brackets">Klammern</string>
<string name="browser_intall_text">Um diese Funktion nutzen zu können, benötigen Sie den OI File Manager, den Sie über Google Play bzw. direkt von der Entwicklerwebseite herunterladen können. Aufgrund einiger Eigenheiten des Dateimanagers, kann es bei der ersten Benutzung zu Einschränkungen kommen.</string> <string name="browser_intall_text">Um diese Funktion nutzen zu können, benötigen Sie den OI File Manager, den Sie über Google Play bzw. direkt von der Entwicklerwebseite herunterladen können. Aufgrund einiger Eigenheiten des Dateimanagers, kann es bei der ersten Benutzung zu Einschränkungen kommen.</string>
<string name="building_search_idx">Erstelle den Suchindex\u2026</string> <string name="building_search_idx">Erstelle den Suchindex\u2026</string>
<string name="cancel">Abbr.</string> <string name="cancel">Abbrechen</string>
<string name="ClearClipboard">Zwischenablage geleert</string> <string name="ClearClipboard">Zwischenablage geleert</string>
<string name="clipboard_error_title">Zwischenablagefehler</string> <string name="clipboard_error_title">Zwischenablagefehler</string>
<string name="clipboard_error">Die Implementierung der Zwischenablagefunktion in einigen Samsung Android-Smartphones ist offenbar fehlerhaft, wodurch das Kopieren von Daten aus der Anwendung heraus fehlschlägt. Weitere Informationen dazu finden Sie unter:</string> <string name="clipboard_error">Die Implementierung der Zwischenablagefunktion in einigen Samsung Android-Smartphones ist offenbar fehlerhaft, wodurch das Kopieren von Daten aus der Anwendung heraus fehlschlägt. Weitere Informationen dazu finden Sie unter:</string>
@@ -59,7 +59,7 @@
<string name="decrypting_entry">Eintrag entschlüsselt</string> <string name="decrypting_entry">Eintrag entschlüsselt</string>
<string name="default_checkbox">Als Standard-Datenbank benutzen</string> <string name="default_checkbox">Als Standard-Datenbank benutzen</string>
<string name="digits">Zahlen</string> <string name="digits">Zahlen</string>
<string name="disclaimer_formal">KeePass DX \u00A9 2009&#8211;2013 Brian Pellin. Alle Rechte vorbehalten. Die Nutzung der Software erfolgt auf eigene Verantwortung und ohne jegliche Garantie. Die Applikation ist kostenlos und wird unter den Bedingungen der GNU GPL Version 2 (oder später) verbreitet und lizenziert.</string> <string name="disclaimer_formal">KeePass DX \u00A9 %1$d Jeremy Jamet / Kunzisoft, Brian Pellin. Alle Rechte vorbehalten. Die Nutzung der Software erfolgt auf eigene Verantwortung und ohne jegliche Garantie. Die Applikation ist kostenlos und wird unter den Bedingungen der GNU GPL Version 2 (oder später) verbreitet und lizenziert.</string>
<string name="ellipsis">\u2026</string> <string name="ellipsis">\u2026</string>
<string name="enter_filename">Dateinamen der Datenbank eingeben:</string> <string name="enter_filename">Dateinamen der Datenbank eingeben:</string>
<string name="entry_accessed">Letzter Zugriff:</string> <string name="entry_accessed">Letzter Zugriff:</string>
@@ -100,7 +100,7 @@
<string name="error_wrong_length">Geben Sie die erforderliche Länge als positive Ganzzahl in das Feld ein.</string> <string name="error_wrong_length">Geben Sie die erforderliche Länge als positive Ganzzahl in das Feld ein.</string>
<string name="field_name">Feldname</string> <string name="field_name">Feldname</string>
<string name="field_value">Feldwert</string> <string name="field_value">Feldwert</string>
<string name="FileNotFound">Datei nicht gefunden.</string> <string name="file_not_found">Datei nicht gefunden.</string>
<string name="file_not_found_content">Datei nicht gefunden. Versuche es von ihrem Dienstanbieter erneut zu öffnen.</string> <string name="file_not_found_content">Datei nicht gefunden. Versuche es von ihrem Dienstanbieter erneut zu öffnen.</string>
<string name="file_browser">Dateimanager</string> <string name="file_browser">Dateimanager</string>
<string name="generate_password">Passwort generieren</string> <string name="generate_password">Passwort generieren</string>
@@ -154,7 +154,7 @@
<string name="no_keys">Keine Einträge in dieser Datenbank oder Gruppe.</string> <string name="no_keys">Keine Einträge in dieser Datenbank oder Gruppe.</string>
<string name="no_results">Keine Suchergebnisse</string> <string name="no_results">Keine Suchergebnisse</string>
<string name="no_url_handler">Kein Handler zum Öffnen der URL vorhanden.</string> <string name="no_url_handler">Kein Handler zum Öffnen der URL vorhanden.</string>
<string name="open_recent">Zuletzt geöffnete Datenbank (Klicken zum Öffnen):</string> <string name="open_recent">Zuletzt geöffnete Datenbank :</string>
<string name="omitbackup_title">Papierkorb/Sicherungen nicht durchsuchen</string> <string name="omitbackup_title">Papierkorb/Sicherungen nicht durchsuchen</string>
<string name="omitbackup_summary">Papierkorb und Sicherungseinträge werden bei der Suche nicht berücksichtigt (nur bei kdb Dateien).</string> <string name="omitbackup_summary">Papierkorb und Sicherungseinträge werden bei der Suche nicht berücksichtigt (nur bei kdb Dateien).</string>
<string name="pass_filename">KeePass Datenbankdatei:</string> <string name="pass_filename">KeePass Datenbankdatei:</string>
@@ -175,6 +175,9 @@
<string name="rounds">Schlüsseltransformationen</string> <string name="rounds">Schlüsseltransformationen</string>
<string name="rounds_explaination">Je höher die Anzahl der Schlüsseltransformationen, desto besser ist der Schutz gegen Wörterbuch- oder Brute-Force-Angriffe. Allerdings dauert dann auch das Laden und Speichern der Datenbank entsprechend länger.</string> <string name="rounds_explaination">Je höher die Anzahl der Schlüsseltransformationen, desto besser ist der Schutz gegen Wörterbuch- oder Brute-Force-Angriffe. Allerdings dauert dann auch das Laden und Speichern der Datenbank entsprechend länger.</string>
<string name="rounds_hint">Schlüsseltransformationen</string> <string name="rounds_hint">Schlüsseltransformationen</string>
<string name="rounds_fix_title">Datenbank reparieren</string>
<string name="rounds_fix">Schlüsseltransformationen vor Datenbankkorruption</string>
<string name="rounds_fix_explanation">Falls ihre Datenbank von KeepassDroid version 2.2.0.0 bis 2.2.0.6 beschädigt wurde, können Sie die Anzahl der Schlüsseltransformationen welche verwendet wurden eingeben um ihre Datenbank wieder zu öffnen.</string>
<string name="saving_database">Speichere Datenbank\u2026</string> <string name="saving_database">Speichere Datenbank\u2026</string>
<string name="space">Leerzeichen</string> <string name="space">Leerzeichen</string>
<string name="search_label">Suchen</string> <string name="search_label">Suchen</string>
@@ -207,4 +210,41 @@
<item>Mittel</item> <item>Mittel</item>
<item>Groß</item> <item>Groß</item>
</string-array> </string-array>
<string name="warning_empty_password">Sind Sie sicher, dass sie ein leeres Passwort verwenden wollen ?</string>
<string name="warning_no_encryption_key">Sind Sie sicher, dass sie keinen Verschlüsselungsschlüssel verwenden wollen ?</string>
<string name="appearance">Aussehen</string>
<string name="password_size_title">Passwortgröße</string>
<string name="password_size_summary">Standartlänge des generierten Passworts ändern</string>
<string name="clipboard_notifications_title">Zwischenablagenbenachrichtigungen</string>
<string name="clipboard_notifications_summary">Zwischenablagenbenachrichtigungen zum kopieren von Benutzername und Passwort einschalten</string>
<string name="lock_database_screen_off_title">Bildschirmsperre</string>
<string name="lock_database_screen_off_summary">Datenbank sperren, wenn der Bildschirm ausgeschaltet wird</string>
<string name="create_keepass_file">Keepass Datei erstellen</string>
<string name="style_choose_title">Thema auswählen</string>
<string name="assign_master_key">Hauptschlüssel zuweisen</string>
<string name="path">Pfad</string>
<string name="file_name">Dateiname</string>
<string name="unavailable_feature_text">Dieses Feature wird nicht von ihrer Android version unterstützt</string>
<string name="fingerprint_enable_summary">Datenbanköffnung mit Fingerabdruck einschalten</string>
<string name="fingerprint">Fingerabdruck</string>
<string name="fingerprint_enable_title">Fingerabruckscanner</string>
<string name="fingerprint_scan_to_open">Fingerabruck scannen während Passwortfeld leer ist, um Datenbank zu öffnen</string>
<string name="fingerprint_scan_to_store">Fingerabruck scannen, um Masterpasswort zu speichern</string>
<string name="fingerprint_type_password_text">Geben Sie ihr Passwort in Keepass DX ein</string>
<string name="lock">Sperre</string>
<string name="list_password_generator_options_summary">Standartzeichen für Passwortgenerator setzen</string>
<string name="list_password_generator_options_title">Passwortzeichen</string>
<string name="configure_fingerprint">Fingerabruck unterstützt, jedoch nicht für dieses Gerät konfiguriert</string>
<string name="scanning_fingerprint">Fingerabdruck wird gescannt</string>
<string name="encrypted_value_stored">Verschlüsseltes Passwort wurde gespeichert</string>
<string name="history">Verlauf</string>
<string name="fingerprint_quick_unlock_title">Wie richte ich den Fingerabdruckscanner ein ?</string>
<string name="fingerprint_setting_text">Speichern sie ihren persönlichen Fingerabruck in</string>
<string name="fingerprint_setting_way_text">Einstellungen -> Fingerabdruck</string>
<string name="usage">Verwendung</string>
<string name="general">Allgemein</string>
<string name="store_with_fingerprint">Fingerabruck verwenden um dieses Passwort zu speichern</string>
<string name="no_password_stored">Noch kein Passwort für diese Datenbank gespeichert</string>
<string name="style_choose_summary">Thema durch verändern der Farben ändern</string>
</resources> </resources>

View File

@@ -53,7 +53,7 @@
<string name="decrypting_entry">Αποκρυπτογράφηση εγγραφής</string> <string name="decrypting_entry">Αποκρυπτογράφηση εγγραφής</string>
<string name="default_checkbox">Χρήση αυτής της βάσης ως προεπιλεγμένη</string> <string name="default_checkbox">Χρήση αυτής της βάσης ως προεπιλεγμένη</string>
<string name="digits">Ψηφία</string> <string name="digits">Ψηφία</string>
<string name="disclaimer_formal">KeePass DX Πνευματική Ιδιοκτησία 2009&#8211;2012 Brian Pellin χωρίς ΚΑΜΙΑ ΑΠΟΛΥΤΩΣ ΕΓΓΥΗΣΗ. Το παρόν είναι δωρεάν λογισμικό και είστε ευπρόσδεκτοι να το διαμοιράσετε υπό τις συνθήκες της ΙΕΛ έκδοσης 2 ή μεταγενέστερης.</string> <string name="disclaimer_formal">KeePass DX \u00A9 %1$d Jeremy Jamet / Kunzisoft, Brian Pellin χωρίς ΚΑΜΙΑ ΑΠΟΛΥΤΩΣ ΕΓΓΥΗΣΗ. Το παρόν είναι δωρεάν λογισμικό και είστε ευπρόσδεκτοι να το διαμοιράσετε υπό τις συνθήκες της ΙΕΛ έκδοσης 2 ή μεταγενέστερης.</string>
<string name="ellipsis">\u2026</string> <string name="ellipsis">\u2026</string>
<string name="enter_filename">Εισαγωγή ονόματος βάσης δεδομένων:</string> <string name="enter_filename">Εισαγωγή ονόματος βάσης δεδομένων:</string>
<string name="entry_accessed">Προσπελάσθηκε: </string> <string name="entry_accessed">Προσπελάσθηκε: </string>
@@ -94,7 +94,7 @@
<string name="error_wrong_length">Εισάγετε έναν θετικό ακέραιο αριθμό στο πεδίο μήκους</string> <string name="error_wrong_length">Εισάγετε έναν θετικό ακέραιο αριθμό στο πεδίο μήκους</string>
<string name="field_name">Όνομα Πεδίου</string> <string name="field_name">Όνομα Πεδίου</string>
<string name="field_value">Τιμή πεδίου</string> <string name="field_value">Τιμή πεδίου</string>
<string name="FileNotFound">Το αρχείο δεν βρέθηκε.</string> <string name="file_not_found">Το αρχείο δεν βρέθηκε.</string>
<string name="file_browser">Διαχείριση Αρχείων</string> <string name="file_browser">Διαχείριση Αρχείων</string>
<string name="generate_password">Δημιουργία Κωδικού</string> <string name="generate_password">Δημιουργία Κωδικού</string>
<string name="group">Ομάδα</string> <string name="group">Ομάδα</string>
@@ -147,7 +147,7 @@
<string name="no_keys">Δεν υπάρχουν εγγραφές στη βάση ή στην ομάδα.</string> <string name="no_keys">Δεν υπάρχουν εγγραφές στη βάση ή στην ομάδα.</string>
<string name="no_results">Δε βρέθηκαν αποτελέσματα αναζήτησης</string> <string name="no_results">Δε βρέθηκαν αποτελέσματα αναζήτησης</string>
<string name="no_url_handler">Χωρίς χειριστή για τη διεύθυνση url.</string> <string name="no_url_handler">Χωρίς χειριστή για τη διεύθυνση url.</string>
<string name="open_recent">Άνοιγμα πρόσφατης βάσης (πατήστε για άνοιγμα):</string> <string name="open_recent">Άνοιγμα πρόσφατης βάσης :</string>
<string name="omitbackup_title">Να μην γίνει αναζήτηση σε αντίγραφο ασφαλείας εγγραφών</string> <string name="omitbackup_title">Να μην γίνει αναζήτηση σε αντίγραφο ασφαλείας εγγραφών</string>
<string name="omitbackup_summary">Παράληψη ομάδας \'Αντίγραφο Ασφαλείας\' από τα αποτελέσματα αναζήτησης (εφαρμόζεται μόνο σε αρχεία .kdb)</string> <string name="omitbackup_summary">Παράληψη ομάδας \'Αντίγραφο Ασφαλείας\' από τα αποτελέσματα αναζήτησης (εφαρμόζεται μόνο σε αρχεία .kdb)</string>
<string name="pass_filename">Όνομα βάσης δεδομένων KeePass:</string> <string name="pass_filename">Όνομα βάσης δεδομένων KeePass:</string>

View File

@@ -50,7 +50,7 @@ Spanish translation by José I. Paños. Updated by David García-Abad (23-09-201
<string name="decrypting_entry">Descrifrando la entrada</string> <string name="decrypting_entry">Descrifrando la entrada</string>
<string name="default_checkbox">Utilice esto como base de datos por defecto</string> <string name="default_checkbox">Utilice esto como base de datos por defecto</string>
<string name="digits">Dígitos</string> <string name="digits">Dígitos</string>
<string name="disclaimer_formal">KeePass DX Copyright 2017 Brian Pellin, Jeremy Jamet / Kunzisoft NO TIENE TOTAL GARANTÍA; Este es software libre, y puedes redristribuirlo bajo las condiciones de la licencia GPL version 2 o posterior.</string> <string name="disclaimer_formal">KeePass DX \u00A9 %1$d Jeremy Jamet / Kunzisoft, Brian Pellin NO TIENE TOTAL GARANTÍA; Este es software libre, y puedes redristribuirlo bajo las condiciones de la licencia GPL version 2 o posterior.</string>
<string name="ellipsis">\u2026</string> <string name="ellipsis">\u2026</string>
<string name="enter_filename">Introduzca el nombre del archivo de base de datos:</string> <string name="enter_filename">Introduzca el nombre del archivo de base de datos:</string>
<string name="entry_accessed">Acceso: </string> <string name="entry_accessed">Acceso: </string>
@@ -87,7 +87,7 @@ Spanish translation by José I. Paños. Updated by David García-Abad (23-09-201
<string name="error_rounds_too_large">Pasadas demasiado grande. Establecido a 2147483648.</string> <string name="error_rounds_too_large">Pasadas demasiado grande. Establecido a 2147483648.</string>
<string name="error_title_required">Se necesita un título.</string> <string name="error_title_required">Se necesita un título.</string>
<string name="error_wrong_length">Introduzca un entero positivo en el campo longitud</string> <string name="error_wrong_length">Introduzca un entero positivo en el campo longitud</string>
<string name="FileNotFound">Archivo no encontrado.</string> <string name="file_not_found">Archivo no encontrado.</string>
<string name="file_browser">Explorador de Archivos</string> <string name="file_browser">Explorador de Archivos</string>
<string name="generate_password">Generar Contraseña</string> <string name="generate_password">Generar Contraseña</string>
<string name="group">Grupo</string> <string name="group">Grupo</string>
@@ -139,7 +139,7 @@ Spanish translation by José I. Paños. Updated by David García-Abad (23-09-201
<string name="no_url_handler">Sin manejador para esta url.</string> <string name="no_url_handler">Sin manejador para esta url.</string>
<string name="recentfile_title">Historial de archivos recientes</string> <string name="recentfile_title">Historial de archivos recientes</string>
<string name="recentfile_summary">Recordar nombres de archivos usados recientemente</string> <string name="recentfile_summary">Recordar nombres de archivos usados recientemente</string>
<string name="open_recent">Abrir base de datos reciente (clic para abrir):</string> <string name="open_recent">Abrir base de datos reciente :</string>
<string name="omitbackup_title">No buscar en las entradas de copia de seguridad o papelera de reciclaje</string> <string name="omitbackup_title">No buscar en las entradas de copia de seguridad o papelera de reciclaje</string>
<string name="omitbackup_summary">Omitir \'Backup\' y grupo de Papelera de Reciclaje en los resultados de búsqueda</string> <string name="omitbackup_summary">Omitir \'Backup\' y grupo de Papelera de Reciclaje en los resultados de búsqueda</string>
<string name="pass_filename">Nombre de archivo de base de datos de KeePass:</string> <string name="pass_filename">Nombre de archivo de base de datos de KeePass:</string>

View File

@@ -55,7 +55,7 @@
<string name="decrypting_entry">Sarrera desenkriptatzen</string> <string name="decrypting_entry">Sarrera desenkriptatzen</string>
<string name="default_checkbox">Hau erabili modu lehenetsitako datubase gisa</string> <string name="default_checkbox">Hau erabili modu lehenetsitako datubase gisa</string>
<string name="digits">Zenbakiak</string> <string name="digits">Zenbakiak</string>
<string name="disclaimer_formal">KeePass DX Copyright 2017 Brian Pellin, Jeremy Jamet / Kunzisoft ez dakar inolako bermerik; Lan hau software librea da; banatu edo/eta aldatu egin dezakezu GNU General Public License bigarren bertsioaren baldintzapean.</string> <string name="disclaimer_formal">KeePass DX \u00A9 %1$d Jeremy Jamet / Kunzisoft, Brian Pellin ez dakar inolako bermerik; Lan hau software librea da; banatu edo/eta aldatu egin dezakezu GNU General Public License bigarren bertsioaren baldintzapean.</string>
<string name="ellipsis">\u2026</string> <string name="ellipsis">\u2026</string>
<string name="enter_filename">Datubasearen fitxategiaren izena sartu:</string> <string name="enter_filename">Datubasearen fitxategiaren izena sartu:</string>
<string name="entry_accessed">Akzesoa: </string> <string name="entry_accessed">Akzesoa: </string>
@@ -96,7 +96,7 @@
<string name="error_wrong_length">Eremuaren luzeran entero positibo bat sartu</string> <string name="error_wrong_length">Eremuaren luzeran entero positibo bat sartu</string>
<string name="field_name">Eremuaren izena</string> <string name="field_name">Eremuaren izena</string>
<string name="field_value">Eremuaren balorea</string> <string name="field_value">Eremuaren balorea</string>
<string name="FileNotFound">Fitxategi ez aurkitua.</string> <string name="file_not_found">Fitxategi ez aurkitua.</string>
<string name="file_browser">Fitxategien nabigatzailea</string> <string name="file_browser">Fitxategien nabigatzailea</string>
<string name="generate_password">Pasahitza sortu</string> <string name="generate_password">Pasahitza sortu</string>
<string name="group">Taldea</string> <string name="group">Taldea</string>
@@ -149,7 +149,7 @@
<string name="no_keys">Sarrerarik ez datubasean edo taldean.</string> <string name="no_keys">Sarrerarik ez datubasean edo taldean.</string>
<string name="no_results">Emaitzarik gabeko bilaketa</string> <string name="no_results">Emaitzarik gabeko bilaketa</string>
<string name="no_url_handler">URL kudatzeko euskarririk ez.</string> <string name="no_url_handler">URL kudatzeko euskarririk ez.</string>
<string name="open_recent">Duela gutxiko datubasea ireki (klik irekitzeko):</string> <string name="open_recent">Duela gutxiko datubasea ireki :</string>
<string name="omitbackup_title">Ez bilatu segurtasun kopiaren sarreretan</string> <string name="omitbackup_title">Ez bilatu segurtasun kopiaren sarreretan</string>
<string name="omitbackup_summary">Kendu segurtasun kopien taldea bilaketen emaitzetatik (.kdb fitxategie dagokie bakarrik)</string> <string name="omitbackup_summary">Kendu segurtasun kopien taldea bilaketen emaitzetatik (.kdb fitxategie dagokie bakarrik)</string>
<string name="pass_filename">Keepass datubasearen izena:</string> <string name="pass_filename">Keepass datubasearen izena:</string>

View File

@@ -53,7 +53,7 @@
<string name="decrypting_entry">Puretaan salasanatietuetta</string> <string name="decrypting_entry">Puretaan salasanatietuetta</string>
<string name="default_checkbox">Käytä tätä oletustietokantana</string> <string name="default_checkbox">Käytä tätä oletustietokantana</string>
<string name="digits">Numerot</string> <string name="digits">Numerot</string>
<string name="disclaimer_formal">KeePass DX Copyright 2017 Brian Pellin, Jeremy Jamet / Kunzisoft comes with ABSOLUTELY NO WARRANTY; This is free software, and you are welcome to redistribute it under the conditions of the GPL version 2 or later.</string> <string name="disclaimer_formal">KeePass DX \u00A9 %1$d Jeremy Jamet / Kunzisoft, Brian Pellin comes with ABSOLUTELY NO WARRANTY; This is free software, and you are welcome to redistribute it under the conditions of the GPL version 2 or later.</string>
<string name="ellipsis">\u2026</string> <string name="ellipsis">\u2026</string>
<string name="enter_filename">Anna tietokannan tiedostonimi:</string> <string name="enter_filename">Anna tietokannan tiedostonimi:</string>
<string name="entry_accessed">Käytetty: </string> <string name="entry_accessed">Käytetty: </string>
@@ -94,7 +94,7 @@
<string name="error_wrong_length">Syötä positiivinen kokonaisluku pituus-kenttään</string> <string name="error_wrong_length">Syötä positiivinen kokonaisluku pituus-kenttään</string>
<string name="field_name">Kentän nimi</string> <string name="field_name">Kentän nimi</string>
<string name="field_value">Kentän arvo</string> <string name="field_value">Kentän arvo</string>
<string name="FileNotFound">Tiedostoa ei löydetty.</string> <string name="file_not_found">Tiedostoa ei löydetty.</string>
<string name="file_browser">Tiedostoselain</string> <string name="file_browser">Tiedostoselain</string>
<string name="generate_password">Generoi salasana</string> <string name="generate_password">Generoi salasana</string>
<string name="group">Ryhmä</string> <string name="group">Ryhmä</string>
@@ -147,7 +147,7 @@
<string name="no_keys">Ei tietueita tietokannassa tai ryhmässä.</string> <string name="no_keys">Ei tietueita tietokannassa tai ryhmässä.</string>
<string name="no_results">Ei hakutuloksia</string> <string name="no_results">Ei hakutuloksia</string>
<string name="no_url_handler">Tälle URL:lle ei ole käsittelijää.</string> <string name="no_url_handler">Tälle URL:lle ei ole käsittelijää.</string>
<string name="open_recent">Avaa viimeisin salasanatietokanta (avaa klikkaamalla):</string> <string name="open_recent">Avaa viimeisin salasanatietokanta :</string>
<string name="omitbackup_title">Älä etsi varmuuskopioista eikä roskakorista</string> <string name="omitbackup_title">Älä etsi varmuuskopioista eikä roskakorista</string>
<string name="omitbackup_summary">Poista \'Varmuuskopiot\' ja roskakori hakutuloksista</string> <string name="omitbackup_summary">Poista \'Varmuuskopiot\' ja roskakori hakutuloksista</string>
<string name="pass_filename">KeePass salasanatietokannan tiedostonimi:</string> <string name="pass_filename">KeePass salasanatietokannan tiedostonimi:</string>

View File

@@ -20,8 +20,8 @@
<resources <resources
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
tools:ignore="MissingTranslation"> tools:ignore="MissingTranslation">
<string name="about_feedback">Signaler une anomalie\u00A0:</string> <string name="about_feedback">Signaler une anomalie :</string>
<string name="about_homepage">Site web\u00A0:</string> <string name="about_homepage">Site web :</string>
<string name="AboutText">KeePass DX est une implémentation sur Android du gestionnaire de mots de passe KeePass.</string> <string name="AboutText">KeePass DX est une implémentation sur Android du gestionnaire de mots de passe KeePass.</string>
<string name="accept">Accepter</string> <string name="accept">Accepter</string>
<string name="add_entry">Ajouter une entrée</string> <string name="add_entry">Ajouter une entrée</string>
@@ -29,7 +29,7 @@
<string name="add_group_title">Ajouter un groupe</string> <string name="add_group_title">Ajouter un groupe</string>
<string name="add_string">Ajouter une chaîne</string> <string name="add_string">Ajouter une chaîne</string>
<string name="algorithm">Algorithme</string> <string name="algorithm">Algorithme</string>
<string name="algorithm_colon">Algorithme\u00A0:</string> <string name="algorithm_colon">Algorithme :</string>
<string name="app_timeout">Application timeout</string> <string name="app_timeout">Application timeout</string>
<string name="app_timeout_summary">Temps avant le verrouillage de la base de données lorsque l\'application est inactive.</string> <string name="app_timeout_summary">Temps avant le verrouillage de la base de données lorsque l\'application est inactive.</string>
<string name="application">Application</string> <string name="application">Application</string>
@@ -42,25 +42,25 @@
<string name="cancel">Annuler</string> <string name="cancel">Annuler</string>
<string name="ClearClipboard">Presse-papier vidé</string> <string name="ClearClipboard">Presse-papier vidé</string>
<string name="clipboard_error_title">Erreur de presse-papier</string> <string name="clipboard_error_title">Erreur de presse-papier</string>
<string name="clipboard_error">Certains appareils Android Samsung ont un bug dans l\'implémentation du presse-papier qui empêche la copie depuis des applications. Pour plus de détails, visitez\u00A0:</string> <string name="clipboard_error">Certains appareils Android Samsung ont un bug dans l\'implémentation du presse-papier qui empêche la copie depuis des applications. Pour plus de détails, visitez :</string>
<string name="clipboard_error_clear">Le vidage du presse-papier a échoué</string> <string name="clipboard_error_clear">Le vidage du presse-papier a échoué</string>
<string name="clipboard_timeout">Clipboard timeout</string> <string name="clipboard_timeout">Clipboard timeout</string>
<string name="clipboard_timeout_summary">Temps avant le vidage du presse-papier après copie du nom d\'utilisateur ou du mot de passe</string> <string name="clipboard_timeout_summary">Temps avant le vidage du presse-papier après copie du nom d\'utilisateur ou du mot de passe</string>
<string name="copy_username">Copier le nom d\'utilisateur dans le presse-papier</string> <string name="copy_username">Copier le nom d\'utilisateur dans le presse-papier</string>
<string name="copy_password">Copier le mot de passe dans le presse-papier</string> <string name="copy_password">Copier le mot de passe dans le presse-papier</string>
<string name="creating_db_key">Création de la clé de base de données…</string> <string name="creating_db_key">Création de la clé de base de données…</string>
<string name="current_group">Groupe actuel\u00A0:</string> <string name="current_group">Groupe actuel :</string>
<string name="current_group_root">Groupe actuel\u00A0: Racine</string> <string name="current_group_root">Groupe actuel : Racine</string>
<string name="database">Base de données</string> <string name="database">Base de données</string>
<string name="decrypting_db">Déchiffrement du contenu de la base de données…</string> <string name="decrypting_db">Déchiffrement du contenu de la base de données…</string>
<string name="decrypting_entry">Déchiffrement de l\'entrée</string> <string name="decrypting_entry">Déchiffrement de l\'entrée</string>
<string name="default_checkbox">Utiliser comme base de données par défaut</string> <string name="default_checkbox">Utiliser comme base de données par défaut</string>
<string name="digits">Nombres</string> <string name="digits">Nombres</string>
<string name="disclaimer_formal">KeePass DX Copyright 2017 Brian Pellin, Jeremy Jamet / Kunzisoft n\'offre ABSOLUMENT AUCUNE GARANTIE; il s\'agit d\'un logiciel libre, vous pouvez le redistribuer sous les conditions de la licence GPL v2 ou ultérieure.</string> <string name="disclaimer_formal">KeePass DX \u00A9 %1$d Jeremy Jamet / Kunzisoft, Brian Pellin n\'offre ABSOLUMENT AUCUNE GARANTIE; il s\'agit d\'un logiciel libre, vous pouvez le redistribuer sous les conditions de la licence GPL v2 ou ultérieure.</string>
<string name="ellipsis">\u2026</string> <string name="ellipsis">\u2026</string>
<string name="enter_filename">Sélectionnez la base de données\u00A0:</string> <string name="enter_filename">Sélectionnez la base de données :</string>
<string name="entry_accessed">Dernier accès</string> <string name="entry_accessed">Dernier accès</string>
<string name="entry_and_or">Entrez un mot de passe et/ou un fichier de clé pour ouvrir la base de données\u00A0:</string> <string name="entry_and_or">Entrez un mot de passe et/ou un fichier de clé pour ouvrir la base de données :</string>
<string name="entry_cancel">Annuler</string> <string name="entry_cancel">Annuler</string>
<string name="entry_comment">Commentaires</string> <string name="entry_comment">Commentaires</string>
<string name="entry_confpassword">Confirmer mot de passe</string> <string name="entry_confpassword">Confirmer mot de passe</string>
@@ -82,7 +82,7 @@
<string name="error_database_settings">Impossible de déterminer les paramètres de la base de données.</string> <string name="error_database_settings">Impossible de déterminer les paramètres de la base de données.</string>
<string name="error_failed_to_launch_link">Échec lors de l\'ouverture du lien.</string> <string name="error_failed_to_launch_link">Échec lors de l\'ouverture du lien.</string>
<string name="error_filename_required">Le nom de fichier est obligatoire.</string> <string name="error_filename_required">Le nom de fichier est obligatoire.</string>
<string name="error_file_not_create">Impossible de créer le fichier\u00A0:</string> <string name="error_file_not_create">Impossible de créer le fichier :</string>
<string name="error_invalid_db">Base de données invalide.</string> <string name="error_invalid_db">Base de données invalide.</string>
<string name="error_invalid_path">Chemin invalide.</string> <string name="error_invalid_path">Chemin invalide.</string>
<string name="error_no_name">Le nom est obligatoire.</string> <string name="error_no_name">Le nom est obligatoire.</string>
@@ -97,7 +97,7 @@
<string name="error_wrong_length">Entrez un entier positif pour la longueur du champ</string> <string name="error_wrong_length">Entrez un entier positif pour la longueur du champ</string>
<string name="field_name">Nom du champ</string> <string name="field_name">Nom du champ</string>
<string name="field_value">Valeur</string> <string name="field_value">Valeur</string>
<string name="FileNotFound">Fichier non trouvé.</string> <string name="file_not_found">Fichier non trouvé.</string>
<string name="file_not_found_content">Fichier non trouvé. Essayer de l\'ouvrir à nouveau à partir de votre fournisseur de contenu.</string> <string name="file_not_found_content">Fichier non trouvé. Essayer de l\'ouvrir à nouveau à partir de votre fournisseur de contenu.</string>
<string name="file_browser">Navigateur de fichiers</string> <string name="file_browser">Navigateur de fichiers</string>
<string name="generate_password">Générer mot de passe</string> <string name="generate_password">Générer mot de passe</string>
@@ -121,8 +121,8 @@
<string name="keyfile_does_not_exist">Le fichier de clé n\'existe pas.</string> <string name="keyfile_does_not_exist">Le fichier de clé n\'existe pas.</string>
<string name="keyfile_is_empty">Le fichier de clé est vide.</string> <string name="keyfile_is_empty">Le fichier de clé est vide.</string>
<string name="length">Longueur</string> <string name="length">Longueur</string>
<string name="list_size_title">Taille de la liste des groupes</string> <string name="list_size_title">Taille des éléments de liste</string>
<string name="list_size_summary">Taille de la police de caractères utilisée pour la liste des groupes</string> <string name="list_size_summary">Taille de la police de caractères utilisée pour les éléments de liste</string>
<string name="loading_database">Ouverture de la base de données…</string> <string name="loading_database">Ouverture de la base de données…</string>
<string name="lowercase">Minuscule</string> <string name="lowercase">Minuscule</string>
<string name="MaskedPassword">*****</string> <string name="MaskedPassword">*****</string>
@@ -151,7 +151,7 @@
<string name="no_keys">Aucun élément.</string> <string name="no_keys">Aucun élément.</string>
<string name="no_results">Aucun résultat pour cette recherche.</string> <string name="no_results">Aucun résultat pour cette recherche.</string>
<string name="no_url_handler">Impossible d\'ouvrir cette URL.</string> <string name="no_url_handler">Impossible d\'ouvrir cette URL.</string>
<string name="open_recent">Bases de données utilisées récemment\u00A0:</string> <string name="open_recent">Bases de données utilisées récemment :</string>
<string name="omitbackup_title">Ignorer les sauvegardes</string> <string name="omitbackup_title">Ignorer les sauvegardes</string>
<string name="omitbackup_summary">Ignorer le groupe Sauvegardes des résultats de recherche (uniquement pour .kdb)</string> <string name="omitbackup_summary">Ignorer le groupe Sauvegardes des résultats de recherche (uniquement pour .kdb)</string>
<string name="pass_filename">Fichier de base de données KeePass</string> <string name="pass_filename">Fichier de base de données KeePass</string>
@@ -196,11 +196,12 @@
<string name="warning_unmounted">Votre carte SD n\'est actuellement pas montée sur votre appareil. Vous ne pourrez pas charger ou créer votre base de données.</string> <string name="warning_unmounted">Votre carte SD n\'est actuellement pas montée sur votre appareil. Vous ne pourrez pas charger ou créer votre base de données.</string>
<string name="warning_empty_password">Voulez-vous vraiment utiliser une chaine de caractères vide comme mot de passe ?</string> <string name="warning_empty_password">Voulez-vous vraiment utiliser une chaine de caractères vide comme mot de passe ?</string>
<string name="warning_no_encryption_key">Etes-vous sûr de ne vouloir utiliser aucune clé de chiffrement.</string> <string name="warning_no_encryption_key">Etes-vous sûr de ne vouloir utiliser aucune clé de chiffrement.</string>
<string name="version_label">Version\u00A0:</string> <string name="version_label">Version :</string>
<string name="configure_fingerprint">Reconnaissance d\'empreinte digitale non configuré pour cet appareil</string> <string name="configure_fingerprint">Reconnaissance d\'empreinte digitale non configuré pour cet appareil</string>
<string name="scanning_fingerprint">Attente d\'une reconnaissance d\'empreinte digitale</string> <string name="scanning_fingerprint">Attente d\'une reconnaissance d\'empreinte digitale</string>
<string name="encrypted_value_stored">Mot de passe encrypté stocké</string> <string name="encrypted_value_stored">Mot de passe encrypté stocké</string>
<string name="fingerprint_invalid_key">Problème de clé invalide</string> <string name="fingerprint_invalid_key">Problème de clé invalide</string>
<string name="fingerprint_not_recognized">Empreinte digitale non reconnue</string>
<string name="fingerprint_error">Problème d\'empreinte digitale</string> <string name="fingerprint_error">Problème d\'empreinte digitale</string>
<string name="store_with_fingerprint">Utiliser l\'empreinte digitale pour stocker le mot de passe</string> <string name="store_with_fingerprint">Utiliser l\'empreinte digitale pour stocker le mot de passe</string>
<string name="no_password_stored">Pas de mot de passe encore stocké pour cette base de données</string> <string name="no_password_stored">Pas de mot de passe encore stocké pour cette base de données</string>
@@ -225,11 +226,19 @@
<string name="fingerprint">Empreinte digitale</string> <string name="fingerprint">Empreinte digitale</string>
<string name="fingerprint_enable_title">Écoute d\'empreintes digitales</string> <string name="fingerprint_enable_title">Écoute d\'empreintes digitales</string>
<string name="fingerprint_enable_summary">Activer l\'ouverture de la base de données par empreinte digitale</string> <string name="fingerprint_enable_summary">Activer l\'ouverture de la base de données par empreinte digitale</string>
<string name="unavailable_feature_text">Impossible de démarrer cette fonctionnalité\nVotre version Android %1$d n\'est pas la version minimale %2$d requise</string> <string name="fingerprint_delete_all_title">Supprimer les clés de chiffrement</string>
<string name="fingerprint_delete_all_summary">Supprimer toutes les clés de chiffrement liées à la reconnaissance des empreintes digitales</string>
<string name="fingerprint_delete_all_warning">Êtes-vous sûr de vouloir supprimer toutes les clés liées aux empreintes digitales?</string>
<string name="unavailable_feature_text">Impossible de démarrer cette fonctionnalité.</string>
<string name="unavailable_feature_version">Votre version Android %1$d n\'est pas la version minimale %2$d requise.</string>
<string name="unavailable_feature_hardware">Le matériel n\'est pas détecté.</string>
<string name="file_name">Nom de fichier</string> <string name="file_name">Nom de fichier</string>
<string name="path">Chemin</string> <string name="path">Chemin</string>
<string name="assign_master_key">Assigner une clé maître</string> <string name="assign_master_key">Assigner une clé maître</string>
<string name="create_keepass_file">Créer un fichier keepass</string> <string name="create_keepass_file">Créer un fichier keepass</string>
<string name="bytes">Octets</string>
<string name="full_file_path_enable_title">Chemin de fichier</string>
<string name="full_file_path_enable_summary">Afficher le chemin complet des fichiers</string>
<string-array name="clipboard_timeout_options"> <string-array name="clipboard_timeout_options">
<item>30 secondes</item> <item>30 secondes</item>

View File

@@ -50,7 +50,7 @@
<string name="decrypting_entry">Bejegyzés dekódolása</string> <string name="decrypting_entry">Bejegyzés dekódolása</string>
<string name="default_checkbox">Adatbázis beállítása alapértelmezettként</string> <string name="default_checkbox">Adatbázis beállítása alapértelmezettként</string>
<string name="digits">Számok</string> <string name="digits">Számok</string>
<string name="disclaimer_formal">KeePass DX Copyright 2017 Brian Pellin, Jeremy Jamet / Kunzisoft. Ehhez a programhoz SEMMILYEN GARANCIA NEM JÁR; Ez egy szabad szoftver, GNU General Public License v2 vagy későbbi verziójának feltételei mellett terjeszthető, illetve módosítható. Fordította: Eversmann</string> <string name="disclaimer_formal">KeePass DX \u00A9 %1$d Jeremy Jamet / Kunzisoft, Brian Pellin. Ehhez a programhoz SEMMILYEN GARANCIA NEM JÁR; Ez egy szabad szoftver, GNU General Public License v2 vagy későbbi verziójának feltételei mellett terjeszthető, illetve módosítható. Fordította: Eversmann</string>
<string name="ellipsis"></string> <string name="ellipsis"></string>
<string name="enter_filename">Adja meg az adatbázis fájlnevét:</string> <string name="enter_filename">Adja meg az adatbázis fájlnevét:</string>
<string name="entry_accessed">Utolsó hozzáférés:</string> <string name="entry_accessed">Utolsó hozzáférés:</string>
@@ -90,7 +90,7 @@
<string name="error_wrong_length">Írjon be egy pozitív egész számot a hossz mezőbe</string> <string name="error_wrong_length">Írjon be egy pozitív egész számot a hossz mezőbe</string>
<string name="field_name">Megnevezés</string> <string name="field_name">Megnevezés</string>
<string name="field_value">Érték</string> <string name="field_value">Érték</string>
<string name="FileNotFound">A fájl nem található</string> <string name="file_not_found">A fájl nem található</string>
<string name="file_not_found_content">A fájl nem található. Próbálja meg újra megnyitni.</string> <string name="file_not_found_content">A fájl nem található. Próbálja meg újra megnyitni.</string>
<string name="file_browser">Fájlkezelő</string> <string name="file_browser">Fájlkezelő</string>
<string name="generate_password">Jelszó generálás</string> <string name="generate_password">Jelszó generálás</string>
@@ -144,7 +144,7 @@
<string name="no_keys">Nincs bejegyzés az adatbázisban vagy csoportban.</string> <string name="no_keys">Nincs bejegyzés az adatbázisban vagy csoportban.</string>
<string name="no_results">Nincs találat</string> <string name="no_results">Nincs találat</string>
<string name="no_url_handler">Nem található kezelő ehhez az url-hez.</string> <string name="no_url_handler">Nem található kezelő ehhez az url-hez.</string>
<string name="open_recent">Korábbi adatbázis megnyitása (kattintson rá a megnyitáshoz):</string> <string name="open_recent">Korábbi adatbázis megnyitása :</string>
<string name="omitbackup_title">Keresési kivételek</string> <string name="omitbackup_title">Keresési kivételek</string>
<string name="omitbackup_summary">A Backup és Lomtár csoportok kihagyása a keresésből</string> <string name="omitbackup_summary">A Backup és Lomtár csoportok kihagyása a keresésből</string>
<string name="pass_filename">KeePass adatbázis fájlnév:</string> <string name="pass_filename">KeePass adatbázis fájlnév:</string>

View File

@@ -51,7 +51,7 @@
<string name="decrypting_entry">Decodifica valore</string> <string name="decrypting_entry">Decodifica valore</string>
<string name="default_checkbox">Usa come database predefinito</string> <string name="default_checkbox">Usa come database predefinito</string>
<string name="digits">Cifre</string> <string name="digits">Cifre</string>
<string name="disclaimer_formal">KeePass DX Copyright 2017 Brian Pellin, Jeremy Jamet / Kunzisoft viene distribuito ASSOLUTAMENTE con NESSUNA GARANZIA; Si tratta di software libero, e sei invitato a distribuirlo sotto le condizioni della licenza GPL versione 2 o superiore.</string> <string name="disclaimer_formal">KeePass DX \u00A9 %1$d Jeremy Jamet / Kunzisoft, Brian Pellin viene distribuito ASSOLUTAMENTE con NESSUNA GARANZIA; Si tratta di software libero, e sei invitato a distribuirlo sotto le condizioni della licenza GPL versione 2 o superiore.</string>
<string name="ellipsis">\u2026</string> <string name="ellipsis">\u2026</string>
<string name="enter_filename">Inserisci il nome file del database:</string> <string name="enter_filename">Inserisci il nome file del database:</string>
<string name="entry_accessed">Ultimo accesso: </string> <string name="entry_accessed">Ultimo accesso: </string>
@@ -88,7 +88,7 @@
<string name="error_rounds_too_large">Livello troppo grande. Impostato a 2147483648.</string> <string name="error_rounds_too_large">Livello troppo grande. Impostato a 2147483648.</string>
<string name="error_title_required">E\' necessario un titolo.</string> <string name="error_title_required">E\' necessario un titolo.</string>
<string name="error_wrong_length">Inserisci un valore positivo nella lunghezza campo</string> <string name="error_wrong_length">Inserisci un valore positivo nella lunghezza campo</string>
<string name="FileNotFound">File non trovato.</string> <string name="file_not_found">File non trovato.</string>
<string name="file_browser">Sfoglia file</string> <string name="file_browser">Sfoglia file</string>
<string name="generate_password">Genera password</string> <string name="generate_password">Genera password</string>
<string name="group">Gruppo</string> <string name="group">Gruppo</string>
@@ -138,7 +138,7 @@
<string name="no_keys">Nessuna voce nel database o nel gruppo.</string> <string name="no_keys">Nessuna voce nel database o nel gruppo.</string>
<string name="no_results">Nessun risultato di ricerca</string> <string name="no_results">Nessun risultato di ricerca</string>
<string name="no_url_handler">Nessun gestore per questo URL.</string> <string name="no_url_handler">Nessun gestore per questo URL.</string>
<string name="open_recent">Apri un database recente (clicca per aprire):</string> <string name="open_recent">Apri un database recente :</string>
<string name="omitbackup_title">Non cercare voci di backup e nel Cestino</string> <string name="omitbackup_title">Non cercare voci di backup e nel Cestino</string>
<string name="omitbackup_summary">Ometti i gruppi \'Backup\' e Cestino dai risultati di ricerca</string> <string name="omitbackup_summary">Ometti i gruppi \'Backup\' e Cestino dai risultati di ricerca</string>
<string name="pass_filename">Nome file del database di KeePass:</string> <string name="pass_filename">Nome file del database di KeePass:</string>

View File

@@ -92,7 +92,7 @@
<string name="error_wrong_length">הזן מספר חיובי בשדה האורך</string> <string name="error_wrong_length">הזן מספר חיובי בשדה האורך</string>
<string name="field_name">שם השדה</string> <string name="field_name">שם השדה</string>
<string name="field_value">ערך השדה</string> <string name="field_value">ערך השדה</string>
<string name="FileNotFound">קובץ לא נמצא.</string> <string name="file_not_found">קובץ לא נמצא.</string>
<string name="file_browser">סייר קבצים</string> <string name="file_browser">סייר קבצים</string>
<string name="generate_password">צור סיסמה</string> <string name="generate_password">צור סיסמה</string>
<string name="group">קבוצה</string> <string name="group">קבוצה</string>
@@ -143,7 +143,7 @@
<string name="no_keys">אין ערכים במסד נתונים או בקבוצה.</string> <string name="no_keys">אין ערכים במסד נתונים או בקבוצה.</string>
<string name="no_results">אין תוצאות חיפוש</string> <string name="no_results">אין תוצאות חיפוש</string>
<string name="no_url_handler">אין מטפל לכתובת url זו.</string> <string name="no_url_handler">אין מטפל לכתובת url זו.</string>
<string name="open_recent">פתח מסד נתונים אחרון (לחץ לפתיחה):</string> <string name="open_recent">פתח מסד נתונים אחרון :</string>
<string name="omitbackup_title">אל תחפש ערכי גיבוי</string> <string name="omitbackup_title">אל תחפש ערכי גיבוי</string>
<string name="omitbackup_summary">הורד את קבוצת \"גיבוי\" מתוצאות חיפוש (תואם רק לקבצי kdb)</string> <string name="omitbackup_summary">הורד את קבוצת \"גיבוי\" מתוצאות חיפוש (תואם רק לקבצי kdb)</string>
<string name="pass_filename">שם קובץ למסד נתוני KeePass:</string> <string name="pass_filename">שם קובץ למסד נתוני KeePass:</string>

View File

@@ -48,7 +48,7 @@
<string name="decrypting_entry">暗号解除エントリー</string> <string name="decrypting_entry">暗号解除エントリー</string>
<string name="default_checkbox">このデータベースを次回以降も利用する</string> <string name="default_checkbox">このデータベースを次回以降も利用する</string>
<string name="digits">数字</string> <string name="digits">数字</string>
<string name="disclaimer_formal">KeePass DX Copyright 2017 Brian Pellin, Jeremy Jamet / Kunzisoft によって作られたフリーソフトウェアであり、無保証です。GPLバージョン2以上の条件下でこれを再頒布することができます。</string> <string name="disclaimer_formal">KeePass DX \u00A9 %1$d Jeremy Jamet / Kunzisoft, Brian Pellin によって作られたフリーソフトウェアであり、無保証です。GPLバージョン2以上の条件下でこれを再頒布することができます。</string>
<string name="ellipsis">\u2026</string> <string name="ellipsis">\u2026</string>
<string name="enter_filename">データベースファイル:</string> <string name="enter_filename">データベースファイル:</string>
<string name="entry_accessed">最終アクセス日: </string> <string name="entry_accessed">最終アクセス日: </string>
@@ -85,7 +85,7 @@
<string name="error_rounds_too_large">値が大きすぎます。 2147483648にセットしました。</string> <string name="error_rounds_too_large">値が大きすぎます。 2147483648にセットしました。</string>
<string name="error_title_required">タイトルは必須入力です。</string> <string name="error_title_required">タイトルは必須入力です。</string>
<string name="error_wrong_length">\"長さ\"欄には正の整数を入力してください。</string> <string name="error_wrong_length">\"長さ\"欄には正の整数を入力してください。</string>
<string name="FileNotFound">ファイルが見つかりません。</string> <string name="file_not_found">ファイルが見つかりません。</string>
<string name="file_browser">ファイルブラウザ</string> <string name="file_browser">ファイルブラウザ</string>
<string name="generate_password">パスワードを生成する</string> <string name="generate_password">パスワードを生成する</string>
<string name="group">グループ</string> <string name="group">グループ</string>
@@ -135,7 +135,7 @@
<string name="no_keys">データベース・グループがありません。</string> <string name="no_keys">データベース・グループがありません。</string>
<string name="no_results">検索結果に該当するものはありません。</string> <string name="no_results">検索結果に該当するものはありません。</string>
<string name="no_url_handler">このuriを処理できません。</string> <string name="no_url_handler">このuriを処理できません。</string>
<string name="open_recent">以前使用したデータベースを開く(クリック):</string> <string name="open_recent">以前使用したデータベースを開く:</string>
<string name="omitbackup_title">検索対象から除外</string> <string name="omitbackup_title">検索対象から除外</string>
<string name="omitbackup_summary">\"バックアップ\"と\"ごみ箱\"を検索対象から除外します</string> <string name="omitbackup_summary">\"バックアップ\"と\"ごみ箱\"を検索対象から除外します</string>
<string name="pass_filename">KeePassデータベースファイル:</string> <string name="pass_filename">KeePassデータベースファイル:</string>

View File

@@ -2,7 +2,7 @@
<resources> <resources>
<string name="AboutText">KeePass DX yra KeePass slaptažodžių tvarkyklės realizacija Android platformai</string> <string name="AboutText">KeePass DX yra KeePass slaptažodžių tvarkyklės realizacija Android platformai</string>
<string name="ClearClipboard">Iškarpinė išvalyta.</string> <string name="ClearClipboard">Iškarpinė išvalyta.</string>
<string name="FileNotFound">Failas nerastas.</string> <string name="file_not_found">Failas nerastas.</string>
<string name="InvalidPassword">Neteisingas slaptažodis arba rakto failas.</string> <string name="InvalidPassword">Neteisingas slaptažodis arba rakto failas.</string>
<string name="MaskedPassword">*****</string> <string name="MaskedPassword">*****</string>
<string name="about_feedback">Atsiliepimai:</string> <string name="about_feedback">Atsiliepimai:</string>
@@ -113,7 +113,7 @@
<string name="lowercase">Mažosios raidės</string> <string name="lowercase">Mažosios raidės</string>
<string name="minus">Minusas</string> <string name="minus">Minusas</string>
<string name="underline">Pabraukimas</string> <string name="underline">Pabraukimas</string>
<string name="open_recent">Atidaryti naujausią duomenų bazę (spausti)</string> <string name="open_recent">Atidaryti naujausią duomenų bazę </string>
<string name="default_checkbox">Naudoti šią duomenų bazę kaip numatytąją</string> <string name="default_checkbox">Naudoti šią duomenų bazę kaip numatytąją</string>
<string name="maskpass_summary">Slėpti slaptažodžius pagal nutylėjimą</string> <string name="maskpass_summary">Slėpti slaptažodžius pagal nutylėjimą</string>
<string name="menu_homepage">Eiti į pagrindinį puslapį</string> <string name="menu_homepage">Eiti į pagrindinį puslapį</string>

View File

@@ -35,7 +35,6 @@
<string name="decrypting_entry">Ieraksta atšifrēšana</string> <string name="decrypting_entry">Ieraksta atšifrēšana</string>
<string name="default_checkbox">Izmantot šo kā manu noklusējuma datu bāzi</string> <string name="default_checkbox">Izmantot šo kā manu noklusējuma datu bāzi</string>
<string name="digits">Cipari</string> <string name="digits">Cipari</string>
<string name="disclaimer_formal">Paroles Aurortiesības 20092012 Brian Pellin.</string>
<string name="ellipsis"></string> <string name="ellipsis"></string>
<string name="enter_filename">Ievadiet datu bāzes nosaukumu:</string> <string name="enter_filename">Ievadiet datu bāzes nosaukumu:</string>
<string name="entry_accessed">Piekļuve:</string> <string name="entry_accessed">Piekļuve:</string>
@@ -75,7 +74,7 @@
<string name="error_wrong_length">Norādiet garumu lielāku par nulli</string> <string name="error_wrong_length">Norādiet garumu lielāku par nulli</string>
<string name="field_name">Lauka nosaukums</string> <string name="field_name">Lauka nosaukums</string>
<string name="field_value">Lauka vērtība</string> <string name="field_value">Lauka vērtība</string>
<string name="FileNotFound">Fails nav atrasts.</string> <string name="file_not_found">Fails nav atrasts.</string>
<string name="file_browser">Failu pārlūks</string> <string name="file_browser">Failu pārlūks</string>
<string name="generate_password">Ģenerēt Paroli</string> <string name="generate_password">Ģenerēt Paroli</string>
<string name="group">Grupa</string> <string name="group">Grupa</string>
@@ -128,7 +127,7 @@
<string name="no_keys">Nav ierakstu datu bāzē vai grupā.</string> <string name="no_keys">Nav ierakstu datu bāzē vai grupā.</string>
<string name="no_results">Nav meklēšanas rezultātu</string> <string name="no_results">Nav meklēšanas rezultātu</string>
<string name="no_url_handler">Neizdevās atvērt saiti.</string> <string name="no_url_handler">Neizdevās atvērt saiti.</string>
<string name="open_recent">Atvērt pēdējo datu bāzi (noklikšķiniet, lai atvērtu):</string> <string name="open_recent">Atvērt pēdējo datu bāzi :</string>
<string name="omitbackup_title">Nemeklēt kopijās un atkritnē</string> <string name="omitbackup_title">Nemeklēt kopijās un atkritnē</string>
<string name="omitbackup_summary">Izlaist kopijas un atkritni no meklēšanas rezultātiem</string> <string name="omitbackup_summary">Izlaist kopijas un atkritni no meklēšanas rezultātiem</string>
<string name="pass_filename">KeePass datu bāzes faila nosaukums:</string> <string name="pass_filename">KeePass datu bāzes faila nosaukums:</string>

View File

@@ -50,7 +50,7 @@
<string name="decrypting_entry">Record wordt ontcijferd</string> <string name="decrypting_entry">Record wordt ontcijferd</string>
<string name="default_checkbox">Gebruik dit als mijn standaard database</string> <string name="default_checkbox">Gebruik dit als mijn standaard database</string>
<string name="digits">Cijfers</string> <string name="digits">Cijfers</string>
<string name="disclaimer_formal">KeePass DX Copyright 2017 Brian Pellin, Jeremy Jamet / Kunzisoft biedt GEEN ENKELE GARANTIE; Dit is vrije software, u mag deze software verspreiden onder de voorwaarden van de GPL versie 2 of recenter.</string> <string name="disclaimer_formal">KeePass DX \u00A9 %1$d Jeremy Jamet / Kunzisoft, Brian Pellin biedt GEEN ENKELE GARANTIE; Dit is vrije software, u mag deze software verspreiden onder de voorwaarden van de GPL versie 2 of recenter.</string>
<string name="ellipsis">\u2026</string> <string name="ellipsis">\u2026</string>
<string name="enter_filename">Geef de databasebestandsnaam:</string> <string name="enter_filename">Geef de databasebestandsnaam:</string>
<string name="entry_accessed">Laatst benaderd: </string> <string name="entry_accessed">Laatst benaderd: </string>
@@ -87,7 +87,7 @@
<string name="error_rounds_too_large">Cycli-waarde te groot. Ik gebruik 2147483648.</string> <string name="error_rounds_too_large">Cycli-waarde te groot. Ik gebruik 2147483648.</string>
<string name="error_title_required">Een titel ontbreekt.</string> <string name="error_title_required">Een titel ontbreekt.</string>
<string name="error_wrong_length">Geef een positief geheel getal voor het lengteveld</string> <string name="error_wrong_length">Geef een positief geheel getal voor het lengteveld</string>
<string name="FileNotFound">Bestand niet gevonden.</string> <string name="file_not_found">Bestand niet gevonden.</string>
<string name="file_browser">Verkenner</string> <string name="file_browser">Verkenner</string>
<string name="generate_password">Genereer wachtwoord</string> <string name="generate_password">Genereer wachtwoord</string>
<string name="group">Groep</string> <string name="group">Groep</string>
@@ -137,7 +137,7 @@
<string name="no_keys">Geen records in de database of groep.</string> <string name="no_keys">Geen records in de database of groep.</string>
<string name="no_results">Geen zoekresultaten</string> <string name="no_results">Geen zoekresultaten</string>
<string name="no_url_handler">Geen afhandeling voor deze url mogelijk.</string> <string name="no_url_handler">Geen afhandeling voor deze url mogelijk.</string>
<string name="open_recent">Recente database openen (klik om te openen):</string> <string name="open_recent">Recente database openen :</string>
<string name="omitbackup_title">Niet in backup en prullenbak zoeken</string> <string name="omitbackup_title">Niet in backup en prullenbak zoeken</string>
<string name="omitbackup_summary">Laat \'Backup\' en Prullenbak-groep weg uit zoekresultaten</string> <string name="omitbackup_summary">Laat \'Backup\' en Prullenbak-groep weg uit zoekresultaten</string>
<string name="pass_filename">KeePass databasebestandsnaam:</string> <string name="pass_filename">KeePass databasebestandsnaam:</string>

View File

@@ -48,7 +48,7 @@
<string name="decrypting_entry">Dekrypterer oppføringa</string> <string name="decrypting_entry">Dekrypterer oppføringa</string>
<string name="default_checkbox">Standarddatabasen</string> <string name="default_checkbox">Standarddatabasen</string>
<string name="digits">Tal</string> <string name="digits">Tal</string>
<string name="disclaimer_formal">KeePass DX Copyright 2017 Brian Pellin, Jeremy Jamet / Kunzisoft kjem med INGEN SOM HELST GARANTI. Dette er eit fritt program. Du er velkomen til å redistribuera det i samsvar med vilkåra til GPL utgåve 2 eller nyare.</string> <string name="disclaimer_formal">KeePass DX \u00A9 %1$d Jeremy Jamet / Kunzisoft, Brian Pellin kjem med INGEN SOM HELST GARANTI. Dette er eit fritt program. Du er velkomen til å redistribuera det i samsvar med vilkåra til GPL utgåve 2 eller nyare.</string>
<string name="ellipsis">\u2026</string> <string name="ellipsis">\u2026</string>
<string name="enter_filename">Skriv filnamnet til databasen:</string> <string name="enter_filename">Skriv filnamnet til databasen:</string>
<string name="entry_accessed">Brukt: </string> <string name="entry_accessed">Brukt: </string>
@@ -85,7 +85,7 @@
<string name="error_rounds_too_large">For mange omgangar. Bruker 2147483648.</string> <string name="error_rounds_too_large">For mange omgangar. Bruker 2147483648.</string>
<string name="error_title_required">Treng ein tittel.</string> <string name="error_title_required">Treng ein tittel.</string>
<string name="error_wrong_length">Bruk eit positivt heiltal i lengdfeltet</string> <string name="error_wrong_length">Bruk eit positivt heiltal i lengdfeltet</string>
<string name="FileNotFound">Fann ikkje fila.</string> <string name="file_not_found">Fann ikkje fila.</string>
<string name="file_browser">Filbehandlar</string> <string name="file_browser">Filbehandlar</string>
<string name="generate_password">Lag passord</string> <string name="generate_password">Lag passord</string>
<string name="group">Gruppe</string> <string name="group">Gruppe</string>
@@ -135,7 +135,7 @@
<string name="no_keys">Ingen oppføringar i databasen eller gruppa.</string> <string name="no_keys">Ingen oppføringar i databasen eller gruppa.</string>
<string name="no_results">Ingen søkjeresultat</string> <string name="no_results">Ingen søkjeresultat</string>
<string name="no_url_handler">Ingen behandlar for denne adressa.</string> <string name="no_url_handler">Ingen behandlar for denne adressa.</string>
<string name="open_recent">Opna nyleg brukt database (klikk for å opna):</string> <string name="open_recent">Opna nyleg brukt database :</string>
<string name="omitbackup_title">Søk ikkje i kopipostane eller søppelbøtta</string> <string name="omitbackup_title">Søk ikkje i kopipostane eller søppelbøtta</string>
<string name="omitbackup_summary">Søkjeresultatet inneheld ikkje oppføringar frå \'Backup\' eller søppelbøtta</string> <string name="omitbackup_summary">Søkjeresultatet inneheld ikkje oppføringar frå \'Backup\' eller søppelbøtta</string>
<string name="pass_filename">Filnamnet til KeePass-databasen:</string> <string name="pass_filename">Filnamnet til KeePass-databasen:</string>
@@ -151,7 +151,7 @@
<string name="rounds_explaination">Fleire krypteringsomgangar gjev tilleggsvern mot rå makt-åtak, men kan òg gjera lasting og lagring mykje tregare.</string> <string name="rounds_explaination">Fleire krypteringsomgangar gjev tilleggsvern mot rå makt-åtak, men kan òg gjera lasting og lagring mykje tregare.</string>
<string name="rounds_hint">omgangar</string> <string name="rounds_hint">omgangar</string>
<string name="saving_database">Lagrar databasen …</string> <string name="saving_database">Lagrar databasen …</string>
<string name="space">Mellomrom</string> <string name="space">Mellomrom</string>
<string name="search_label">Søk</string> <string name="search_label">Søk</string>
<string name="show_password">Syn passordet</string> <string name="show_password">Syn passordet</string>
<string name="sort_name">Sorter etter namn</string> <string name="sort_name">Sorter etter namn</string>

View File

@@ -83,7 +83,7 @@ along with KeePass DX. If not, see <http://www.gnu.org/licenses/>.
<string name="error_rounds_too_large">Wartość za duża. Ustaw 2147483648.</string> <string name="error_rounds_too_large">Wartość za duża. Ustaw 2147483648.</string>
<string name="error_title_required">Wymagany tytuł.</string> <string name="error_title_required">Wymagany tytuł.</string>
<string name="error_wrong_length">Wprowadź dodatnią liczbę całkowitą.</string> <string name="error_wrong_length">Wprowadź dodatnią liczbę całkowitą.</string>
<string name="FileNotFound">Plik nie istnieje.</string> <string name="file_not_found">Plik nie istnieje.</string>
<string name="file_browser">Przeglądarka plików</string> <string name="file_browser">Przeglądarka plików</string>
<string name="generate_password">Generuj hasło</string> <string name="generate_password">Generuj hasło</string>
<string name="group">Grupa</string> <string name="group">Grupa</string>
@@ -133,7 +133,7 @@ along with KeePass DX. If not, see <http://www.gnu.org/licenses/>.
<string name="no_keys">Brak wpisów w bazie danych lub grupie.</string> <string name="no_keys">Brak wpisów w bazie danych lub grupie.</string>
<string name="no_results">Brak wyników wyszukiwania</string> <string name="no_results">Brak wyników wyszukiwania</string>
<string name="no_url_handler">Brak obsługi dla tego urla.</string> <string name="no_url_handler">Brak obsługi dla tego urla.</string>
<string name="open_recent">Otwórz ostatnio używaną bazę danych (kliknij by otworzyć):</string> <string name="open_recent">Otwórz ostatnio używaną bazę danych :</string>
<string name="omitbackup_title">Nie wyszukuj zapasowych wpisów</string> <string name="omitbackup_title">Nie wyszukuj zapasowych wpisów</string>
<string name="omitbackup_summary">Pomiń kopię zapasową grupy z wyników wyszukiwania (dotyczy tylko .kdb)</string> <string name="omitbackup_summary">Pomiń kopię zapasową grupy z wyników wyszukiwania (dotyczy tylko .kdb)</string>
<string name="pass_filename">Nazwa pliku bazy danych KeePass:</string> <string name="pass_filename">Nazwa pliku bazy danych KeePass:</string>

View File

@@ -51,7 +51,7 @@
<string name="decrypting_entry">Decifrando entrada</string> <string name="decrypting_entry">Decifrando entrada</string>
<string name="default_checkbox">Usar este banco de dados como padrão</string> <string name="default_checkbox">Usar este banco de dados como padrão</string>
<string name="digits">Digitos</string> <string name="digits">Digitos</string>
<string name="disclaimer_formal">KeePass DX Copyright 2017 Brian Pellin, Jeremy Jamet / Kunzisoft vem com ABSOLUTAMENTE NENHUMA GARANTIA; Este é um software livre, e você está convidado a redistribui-lo sob as condições da GPL versão 2 ou posterior.</string> <string name="disclaimer_formal">KeePass DX \u00A9 %1$d Jeremy Jamet / Kunzisoft, Brian Pellin vem com ABSOLUTAMENTE NENHUMA GARANTIA; Este é um software livre, e você está convidado a redistribui-lo sob as condições da GPL versão 2 ou posterior.</string>
<string name="ellipsis">\u2026</string> <string name="ellipsis">\u2026</string>
<string name="enter_filename">Digite o nome do arquivo de banco de dados:</string> <string name="enter_filename">Digite o nome do arquivo de banco de dados:</string>
<string name="entry_accessed">Acessado: </string> <string name="entry_accessed">Acessado: </string>
@@ -88,7 +88,7 @@
<string name="error_rounds_too_large">Número de rodadas é muito grande. Modificado para 2147483648.</string> <string name="error_rounds_too_large">Número de rodadas é muito grande. Modificado para 2147483648.</string>
<string name="error_title_required">É necessário um título.</string> <string name="error_title_required">É necessário um título.</string>
<string name="error_wrong_length">Digite um número inteiro positivo no campo de tamanho</string> <string name="error_wrong_length">Digite um número inteiro positivo no campo de tamanho</string>
<string name="FileNotFound">Arquivo não encontrado.</string> <string name="file_not_found">Arquivo não encontrado.</string>
<string name="file_browser">Localizador de Arquivos</string> <string name="file_browser">Localizador de Arquivos</string>
<string name="generate_password">Gerar Senha</string> <string name="generate_password">Gerar Senha</string>
<string name="group">Grupo</string> <string name="group">Grupo</string>
@@ -138,7 +138,7 @@
<string name="no_keys">Nenhuma entrada no grupo.</string> <string name="no_keys">Nenhuma entrada no grupo.</string>
<string name="no_results">Sem resultados na busca.</string> <string name="no_results">Sem resultados na busca.</string>
<string name="no_url_handler">Erro ao tratar url.</string> <string name="no_url_handler">Erro ao tratar url.</string>
<string name="open_recent">Abrir banco de dados recente (clique para abrir):</string> <string name="open_recent">Abrir banco de dados recente :</string>
<string name="omitbackup_title">Não procurar entradas no backup ou na lixeira.</string> <string name="omitbackup_title">Não procurar entradas no backup ou na lixeira.</string>
<string name="omitbackup_summary">Omitir os grupos \'Backup\' e \'Lixeira\' dos resultados da busca</string> <string name="omitbackup_summary">Omitir os grupos \'Backup\' e \'Lixeira\' dos resultados da busca</string>
<string name="pass_filename">Arquivo de banco de dados do KeePass:</string> <string name="pass_filename">Arquivo de banco de dados do KeePass:</string>

View File

@@ -56,7 +56,7 @@
<string name="decrypting_entry">A desencriptar entrada</string> <string name="decrypting_entry">A desencriptar entrada</string>
<string name="default_checkbox">Utilizar esta base de dados como predefinida</string> <string name="default_checkbox">Utilizar esta base de dados como predefinida</string>
<string name="digits">Dígitos</string> <string name="digits">Dígitos</string>
<string name="disclaimer_formal">KeePass DX Copyright 2017 Brian Pellin, Jeremy Jamet / Kunzisoft vem com ABSOLUTAMENTE NENHUMA GARANTIA; Este software é livre, e pode redistribui-lo conforme as condições da licença GPL versão 2 ou superior.</string> <string name="disclaimer_formal">KeePass DX \u00A9 %1$d Jeremy Jamet / Kunzisoft, Brian Pellin vem com ABSOLUTAMENTE NENHUMA GARANTIA; Este software é livre, e pode redistribui-lo conforme as condições da licença GPL versão 2 ou superior.</string>
<string name="ellipsis">\u2026</string> <string name="ellipsis">\u2026</string>
<string name="enter_filename">Introduza o nome do ficheiro da base de dados:</string> <string name="enter_filename">Introduza o nome do ficheiro da base de dados:</string>
<string name="entry_accessed">Acedido: </string> <string name="entry_accessed">Acedido: </string>
@@ -97,7 +97,7 @@
<string name="error_wrong_length">Introduza um número inteiro positivo no campo do comprimento</string> <string name="error_wrong_length">Introduza um número inteiro positivo no campo do comprimento</string>
<string name="field_name">Nome do campo</string> <string name="field_name">Nome do campo</string>
<string name="field_value">Valor do campo</string> <string name="field_value">Valor do campo</string>
<string name="FileNotFound">Ficheiro não encontrado.</string> <string name="file_not_found">Ficheiro não encontrado.</string>
<string name="file_not_found_content">Ficheiro não encontrado. Tente reabrir a partir do seu fornecedor de conteúdo.</string> <string name="file_not_found_content">Ficheiro não encontrado. Tente reabrir a partir do seu fornecedor de conteúdo.</string>
<string name="file_browser">Explorador de ficheiros</string> <string name="file_browser">Explorador de ficheiros</string>
<string name="generate_password">Gerar palavra-passe</string> <string name="generate_password">Gerar palavra-passe</string>
@@ -151,7 +151,7 @@
<string name="no_keys">Sem entradas na base de dados ou grupo.</string> <string name="no_keys">Sem entradas na base de dados ou grupo.</string>
<string name="no_results">A pesquisa não obteve resultados</string> <string name="no_results">A pesquisa não obteve resultados</string>
<string name="no_url_handler">Sem suporte para este URL.</string> <string name="no_url_handler">Sem suporte para este URL.</string>
<string name="open_recent">Abrir base de dados recente (clique para abrir):</string> <string name="open_recent">Abrir base de dados recente :</string>
<string name="omitbackup_title">Não pesquisar entradas nas cópias de segurança</string> <string name="omitbackup_title">Não pesquisar entradas nas cópias de segurança</string>
<string name="omitbackup_summary">Omitir o grupo \"Backup\" dos resultados da pesquisa (aplica-se apenas a ficheiros .kdb)</string> <string name="omitbackup_summary">Omitir o grupo \"Backup\" dos resultados da pesquisa (aplica-se apenas a ficheiros .kdb)</string>
<string name="pass_filename">Nome do ficheiro da base de dados KeePass:</string> <string name="pass_filename">Nome do ficheiro da base de dados KeePass:</string>

View File

@@ -53,7 +53,7 @@
<string name="decrypting_entry">Расшифровка записи…</string> <string name="decrypting_entry">Расшифровка записи…</string>
<string name="default_checkbox">По умолчанию</string> <string name="default_checkbox">По умолчанию</string>
<string name="digits">Цифры 0…9</string> <string name="digits">Цифры 0…9</string>
<string name="disclaimer_formal">"KeePass DX © 20092017 Разработчик Brian Pellin, Jeremy JAMET / Kunzisoft Программа предоставляется БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ. Распространяется свободно по лицензии GPL v2 или новее"</string> <string name="disclaimer_formal">KeePass DX \u00A9 %1$d Jeremy Jamet / Kunzisoft, Brian Pellin Программа предоставляется БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ. Распространяется свободно по лицензии GPL v2 или новее</string>
<string name="ellipsis"></string> <string name="ellipsis"></string>
<string name="enter_filename">Путь к базе KeePass:</string> <string name="enter_filename">Путь к базе KeePass:</string>
<string name="entry_accessed">Доступ:</string> <string name="entry_accessed">Доступ:</string>
@@ -94,7 +94,7 @@
<string name="error_wrong_length">Укажите длину больше нуля</string> <string name="error_wrong_length">Укажите длину больше нуля</string>
<string name="field_name">Имя поля</string> <string name="field_name">Имя поля</string>
<string name="field_value">Значение поля</string> <string name="field_value">Значение поля</string>
<string name="FileNotFound">Файл не найден</string> <string name="file_not_found">Файл не найден</string>
<string name="file_browser">Обзор файлов</string> <string name="file_browser">Обзор файлов</string>
<string name="generate_password">Создать пароль</string> <string name="generate_password">Создать пароль</string>
<string name="group">Группа</string> <string name="group">Группа</string>

View File

@@ -48,7 +48,7 @@
<string name="decrypting_entry">Dešifrujem záznam</string> <string name="decrypting_entry">Dešifrujem záznam</string>
<string name="default_checkbox">Použiť toto ako predvolenú databázu</string> <string name="default_checkbox">Použiť toto ako predvolenú databázu</string>
<string name="digits">Číslice</string> <string name="digits">Číslice</string>
<string name="disclaimer_formal">KeePass DX Copyright 2017 Brian Pellin, Jeremy Jamet / Kunzisoft použitie Absolútne bez Záruky; Toto je free software, a môžete ho používať pod GPL ver. 2 alebo vyššie.</string> <string name="disclaimer_formal">KeePass DX \u00A9 %1$d Jeremy Jamet / Kunzisoft, Brian Pellin použitie Absolútne bez Záruky; Toto je free software, a môžete ho používať pod GPL ver. 2 alebo vyššie.</string>
<string name="ellipsis">\u2026</string> <string name="ellipsis">\u2026</string>
<string name="enter_filename">Vložte názov Databázy:</string> <string name="enter_filename">Vložte názov Databázy:</string>
<string name="entry_accessed">Pristupované: </string> <string name="entry_accessed">Pristupované: </string>
@@ -85,7 +85,7 @@
<string name="error_rounds_too_large">Príliš veľa opakovaní. Nastavujem na 2147483648.</string> <string name="error_rounds_too_large">Príliš veľa opakovaní. Nastavujem na 2147483648.</string>
<string name="error_title_required">Vyžaduje sa názov.</string> <string name="error_title_required">Vyžaduje sa názov.</string>
<string name="error_wrong_length">Zadajte celé kladné číslo na dĺžku poľa</string> <string name="error_wrong_length">Zadajte celé kladné číslo na dĺžku poľa</string>
<string name="FileNotFound">Súbor nenájdený.</string> <string name="file_not_found">Súbor nenájdený.</string>
<string name="file_browser">Správca Súborov</string> <string name="file_browser">Správca Súborov</string>
<string name="generate_password">Generovať Heslo</string> <string name="generate_password">Generovať Heslo</string>
<string name="group">Skupina</string> <string name="group">Skupina</string>
@@ -135,7 +135,7 @@
<string name="no_keys">Žiadne záznamy v Databáze.</string> <string name="no_keys">Žiadne záznamy v Databáze.</string>
<string name="no_results">Žiadne výsledky hľadania</string> <string name="no_results">Žiadne výsledky hľadania</string>
<string name="no_url_handler">Žiaden manažér pre url.</string> <string name="no_url_handler">Žiaden manažér pre url.</string>
<string name="open_recent">Otvoriť poslednú databázu (kliknutím otvoriť):</string> <string name="open_recent">Otvoriť poslednú databázu :</string>
<string name="omitbackup_title">Neprehľadávať položky</string> <string name="omitbackup_title">Neprehľadávať položky</string>
<string name="omitbackup_summary">Vynechať skupinu \'Backup\' a Recycle Bin z výsledkov hľadania</string> <string name="omitbackup_summary">Vynechať skupinu \'Backup\' a Recycle Bin z výsledkov hľadania</string>
<string name="pass_filename">KeePass databázový súbor:</string> <string name="pass_filename">KeePass databázový súbor:</string>

View File

@@ -55,7 +55,7 @@
<string name="decrypting_entry">Dekrypterar post</string> <string name="decrypting_entry">Dekrypterar post</string>
<string name="default_checkbox">Använda denna databasen som standard</string> <string name="default_checkbox">Använda denna databasen som standard</string>
<string name="digits">Siffror</string> <string name="digits">Siffror</string>
<string name="disclaimer_formal">KeePass DX Copyright 2017 Brian Pellin, Jeremy Jamet / Kunzisoft kommer HELT UTAN GARANTIER; Detta är fri programvara och du är välkommen att distribuera den utifrån villkoren i GPL version 2 eller senare.</string> <string name="disclaimer_formal">KeePass DX \u00A9 %1$d Jeremy Jamet / Kunzisoft, Brian Pellin kommer HELT UTAN GARANTIER; Detta är fri programvara och du är välkommen att distribuera den utifrån villkoren i GPL version 2 eller senare.</string>
<string name="ellipsis">\u2026</string> <string name="ellipsis">\u2026</string>
<string name="enter_filename">Ange databasnamn:</string> <string name="enter_filename">Ange databasnamn:</string>
<string name="entry_accessed">Senast använd: </string> <string name="entry_accessed">Senast använd: </string>
@@ -95,7 +95,7 @@
<string name="error_wrong_length">Ange ett positivt heltal i fältet för längd</string> <string name="error_wrong_length">Ange ett positivt heltal i fältet för längd</string>
<string name="field_name">Fältnamn</string> <string name="field_name">Fältnamn</string>
<string name="field_value">Fältvärde</string> <string name="field_value">Fältvärde</string>
<string name="FileNotFound">Filen hittades inte.</string> <string name="file_not_found">Filen hittades inte.</string>
<string name="file_browser">Filhanterare</string> <string name="file_browser">Filhanterare</string>
<string name="generate_password">Generera lösenord</string> <string name="generate_password">Generera lösenord</string>
<string name="group">Grupp</string> <string name="group">Grupp</string>
@@ -148,7 +148,7 @@
<string name="no_keys">Inga poster i databasen eller gruppen.</string> <string name="no_keys">Inga poster i databasen eller gruppen.</string>
<string name="no_results">Inget sökresultat</string> <string name="no_results">Inget sökresultat</string>
<string name="no_url_handler">Inget standardprogram för denna URL.</string> <string name="no_url_handler">Inget standardprogram för denna URL.</string>
<string name="open_recent">Senat öppnade databaser (klicka för att öppna):</string> <string name="open_recent">Senat öppnade databaser :</string>
<string name="omitbackup_title">Sök inte efter poster i backup/papperskorg</string> <string name="omitbackup_title">Sök inte efter poster i backup/papperskorg</string>
<string name="omitbackup_summary">Söker inte efter poster i \'Backup\' eller \'Recycle Bin\'</string> <string name="omitbackup_summary">Söker inte efter poster i \'Backup\' eller \'Recycle Bin\'</string>
<string name="pass_filename">KeePass databasfilnamn:</string> <string name="pass_filename">KeePass databasfilnamn:</string>

View File

@@ -48,7 +48,7 @@
<string name="decrypting_entry">Розшифрування запису</string> <string name="decrypting_entry">Розшифрування запису</string>
<string name="default_checkbox">Використовувати як мою типову базу даних</string> <string name="default_checkbox">Використовувати як мою типову базу даних</string>
<string name="digits">Цифри</string> <string name="digits">Цифри</string>
<string name="disclaimer_formal">KeePass DX Copyright 2017 Brian Pellin, Jeremy Jamet / Kunzisoft comes with ABSOLUTELY NO WARRANTY; This is free software, and you are welcome to redistribute it under the conditions of the GPL version 2 or later.</string> <string name="disclaimer_formal">KeePass DX \u00A9 %1$d Jeremy Jamet / Kunzisoft, Brian Pellin comes with ABSOLUTELY NO WARRANTY; This is free software, and you are welcome to redistribute it under the conditions of the GPL version 2 or later.</string>
<string name="ellipsis">\u2026</string> <string name="ellipsis">\u2026</string>
<string name="enter_filename">Введіть ім’я бази даних:</string> <string name="enter_filename">Введіть ім’я бази даних:</string>
<string name="entry_accessed">Доступ: </string> <string name="entry_accessed">Доступ: </string>
@@ -85,7 +85,7 @@
<string name="error_rounds_too_large">Надто багато циклів. Установлено 2147483648.</string> <string name="error_rounds_too_large">Надто багато циклів. Установлено 2147483648.</string>
<string name="error_title_required">Необхідно вказати заголовок.</string> <string name="error_title_required">Необхідно вказати заголовок.</string>
<string name="error_wrong_length">Введіть ціле число на усю довжину поля</string> <string name="error_wrong_length">Введіть ціле число на усю довжину поля</string>
<string name="FileNotFound">Файл не знайдено.</string> <string name="file_not_found">Файл не знайдено.</string>
<string name="file_browser">Перегляд файлів</string> <string name="file_browser">Перегляд файлів</string>
<string name="generate_password">Згенерувати пароль</string> <string name="generate_password">Згенерувати пароль</string>
<string name="group">Група</string> <string name="group">Група</string>
@@ -135,7 +135,7 @@
<string name="no_keys">Нема записів у базі даних або у групі.</string> <string name="no_keys">Нема записів у базі даних або у групі.</string>
<string name="no_results">Нічого не знайдено.</string> <string name="no_results">Нічого не знайдено.</string>
<string name="no_url_handler">Нема програми для опрацювання цього посилання.</string> <string name="no_url_handler">Нема програми для опрацювання цього посилання.</string>
<string name="open_recent">Відкрити останню базу даних (натисніть для відкриття):</string> <string name="open_recent">Відкрити останню базу даних :</string>
<string name="omitbackup_title">Не шукати записів з резервного копіювання та кошиків</string> <string name="omitbackup_title">Не шукати записів з резервного копіювання та кошиків</string>
<string name="omitbackup_summary">Пропустити групу \'Резервна копія\' та Кошик серед результатів пошуку</string> <string name="omitbackup_summary">Пропустити групу \'Резервна копія\' та Кошик серед результатів пошуку</string>
<string name="pass_filename">ім’я бази даних KeePass:</string> <string name="pass_filename">ім’я бази даних KeePass:</string>

View File

@@ -48,7 +48,7 @@
<string name="decrypting_entry">解密条目中</string> <string name="decrypting_entry">解密条目中</string>
<string name="default_checkbox">使用这做为我的默认数据库</string> <string name="default_checkbox">使用这做为我的默认数据库</string>
<string name="digits">数字</string> <string name="digits">数字</string>
<string name="disclaimer_formal">KeePass DX版权归Brian Pellin软件不带有绝对担保是自由软件您可在遵循GPL 2或者更高版本的情况下重新发布。中文简繁体翻译wangkf@gmail.com</string> <string name="disclaimer_formal">KeePass DX \u00A9 %1$d Jeremy Jamet / Kunzisoft, Brian Pellin软件不带有绝对担保是自由软件您可在遵循GPL 2或者更高版本的情况下重新发布。中文简繁体翻译wangkf@gmail.com</string>
<string name="ellipsis">\u2026</string> <string name="ellipsis">\u2026</string>
<string name="enter_filename">输入数据库名:</string> <string name="enter_filename">输入数据库名:</string>
<string name="entry_accessed">访问时间:</string> <string name="entry_accessed">访问时间:</string>
@@ -85,7 +85,7 @@
<string name="error_rounds_too_large">次数太大。最大设置到2147483648。</string> <string name="error_rounds_too_large">次数太大。最大设置到2147483648。</string>
<string name="error_title_required">标题是必填项。</string> <string name="error_title_required">标题是必填项。</string>
<string name="error_wrong_length">长度字段输入一个正整数</string> <string name="error_wrong_length">长度字段输入一个正整数</string>
<string name="FileNotFound">文件未找到。</string> <string name="file_not_found">文件未找到。</string>
<string name="file_browser">文件浏览</string> <string name="file_browser">文件浏览</string>
<string name="generate_password">生成密码</string> <string name="generate_password">生成密码</string>
<string name="group">群组</string> <string name="group">群组</string>
@@ -134,7 +134,7 @@
<string name="no_keys">数据库或群组中无条目。</string> <string name="no_keys">数据库或群组中无条目。</string>
<string name="no_results">没有搜索结果</string> <string name="no_results">没有搜索结果</string>
<string name="no_url_handler">没有这个链接的处理程序。</string> <string name="no_url_handler">没有这个链接的处理程序。</string>
<string name="open_recent">打开最近数据库(点击打开)</string> <string name="open_recent">打开最近数据库:</string>
<string name="pass_filename">KeePass数据库文件名</string> <string name="pass_filename">KeePass数据库文件名</string>
<string name="password_title">输入数据库密码</string> <string name="password_title">输入数据库密码</string>
<string name="progress_create">创建新数据库中&#8230;</string> <string name="progress_create">创建新数据库中&#8230;</string>

View File

@@ -48,7 +48,7 @@
<string name="decrypting_entry">解密條目中</string> <string name="decrypting_entry">解密條目中</string>
<string name="default_checkbox">使用這做為我的默認資料庫</string> <string name="default_checkbox">使用這做為我的默認資料庫</string>
<string name="digits">數字</string> <string name="digits">數字</string>
<string name="disclaimer_formal">KeePass DX版權歸Brian Pellin軟體不帶有絕對擔保是自由軟體您可在遵循GPL 2或者更高版本的情況下重新發佈。中文簡繁體翻譯wangkf@gmail.com</string> <string name="disclaimer_formal">KeePass DX \u00A9 %1$d Jeremy Jamet / Kunzisoft, Brian Pellin軟體不帶有絕對擔保是自由軟體您可在遵循GPL 2或者更高版本的情況下重新發佈。中文簡繁體翻譯wangkf@gmail.com</string>
<string name="ellipsis">\u2026</string> <string name="ellipsis">\u2026</string>
<string name="enter_filename">輸入資料庫名:</string> <string name="enter_filename">輸入資料庫名:</string>
<string name="entry_accessed">訪問時間:</string> <string name="entry_accessed">訪問時間:</string>
@@ -85,7 +85,7 @@
<string name="error_rounds_too_large">次數太大。最大設置到2147483648。</string> <string name="error_rounds_too_large">次數太大。最大設置到2147483648。</string>
<string name="error_title_required">標題是必填項。</string> <string name="error_title_required">標題是必填項。</string>
<string name="error_wrong_length">長度欄位輸入一個正整數</string> <string name="error_wrong_length">長度欄位輸入一個正整數</string>
<string name="FileNotFound">文件未找到。</string> <string name="file_not_found">文件未找到。</string>
<string name="file_browser">檔流覽</string> <string name="file_browser">檔流覽</string>
<string name="generate_password">生成密碼</string> <string name="generate_password">生成密碼</string>
<string name="group">群組</string> <string name="group">群組</string>
@@ -134,7 +134,7 @@
<string name="no_keys">資料庫或群組中無條目。</string> <string name="no_keys">資料庫或群組中無條目。</string>
<string name="no_results">沒有搜索結果</string> <string name="no_results">沒有搜索結果</string>
<string name="no_url_handler">沒有這個鏈結的處理程式。</string> <string name="no_url_handler">沒有這個鏈結的處理程式。</string>
<string name="open_recent">打開最近資料庫(點擊打開)</string> <string name="open_recent">打開最近資料庫:</string>
<string name="pass_filename">KeePass資料庫檔案名</string> <string name="pass_filename">KeePass資料庫檔案名</string>
<string name="password_title">輸入資料庫密碼</string> <string name="password_title">輸入資料庫密碼</string>
<string name="progress_create">創建新資料庫中&#8230;</string> <string name="progress_create">創建新資料庫中&#8230;</string>

View File

@@ -21,7 +21,7 @@
<string name="app_name" translatable="false">KeePass DX</string> <string name="app_name" translatable="false">KeePass DX</string>
<string name="clipboard_error_url" translatable="false">http://code.google.com/p/android/issues/detail?id=35732</string> <string name="clipboard_error_url" translatable="false">http://code.google.com/p/android/issues/detail?id=35732</string>
<string name="donate_url" translatable="false"><![CDATA[https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=KM6QMDAXZM3UU]]></string> <string name="donate_url" translatable="false">http://www.kunzisoft.com/donation.html</string>
<string name="homepage" translatable="false">http://www.kunzisoft.com/KeepassDX</string> <string name="homepage" translatable="false">http://www.kunzisoft.com/KeepassDX</string>
<string name="issues" translatable="false">https://github.com/Kunzisoft/KeePassDX/issues</string> <string name="issues" translatable="false">https://github.com/Kunzisoft/KeePassDX/issues</string>
<string name="oi_filemanager_market" translatable="false">market://details?id=org.openintents.filemanager</string> <string name="oi_filemanager_market" translatable="false">market://details?id=org.openintents.filemanager</string>
@@ -56,6 +56,8 @@
<string name="clipboard_notifications_key" translatable="false">clipboard_notifications_key</string> <string name="clipboard_notifications_key" translatable="false">clipboard_notifications_key</string>
<string name="lock_database_screen_off_key" translatable="false">lock_database_screen_off_key</string> <string name="lock_database_screen_off_key" translatable="false">lock_database_screen_off_key</string>
<string name="fingerprint_enable_key" translatable="true">fingerprint_enable_key</string> <string name="fingerprint_enable_key" translatable="true">fingerprint_enable_key</string>
<string name="full_file_path_enable_key" translatable="true">full_file_path_enable_key</string>
<string name="fingerprint_delete_all_key" translatable="true">fingerprint_delete_all_key</string>
<bool name="maskpass_default" translatable="false">true</bool> <bool name="maskpass_default" translatable="false">true</bool>
<bool name="keyfile_default" translatable="false">true</bool> <bool name="keyfile_default" translatable="false">true</bool>
@@ -66,6 +68,7 @@
<bool name="clipboard_notifications_default" translatable="false">true</bool> <bool name="clipboard_notifications_default" translatable="false">true</bool>
<bool name="lock_database_screen_off_default" translatable="false">true</bool> <bool name="lock_database_screen_off_default" translatable="false">true</bool>
<bool name="fingerprint_enable_default" translatable="true">false</bool> <bool name="fingerprint_enable_default" translatable="true">false</bool>
<bool name="full_file_path_enable_default" translatable="true">false</bool>
<string name="clipboard_timeout_default" translatable="false">300000</string> <string name="clipboard_timeout_default" translatable="false">300000</string>
<string-array name="clipboard_timeout_values"> <string-array name="clipboard_timeout_values">

View File

@@ -55,7 +55,7 @@
<string name="decrypting_entry">Decrypting entry</string> <string name="decrypting_entry">Decrypting entry</string>
<string name="default_checkbox">Use this as my default database</string> <string name="default_checkbox">Use this as my default database</string>
<string name="digits">Digits</string> <string name="digits">Digits</string>
<string name="disclaimer_formal">KeePass DX Copyright 2017 Brian Pellin, Jeremy Jamet / Kunzisoft comes with ABSOLUTELY NO WARRANTY; This is free software, and you are welcome to redistribute it under the conditions of the GPL version 2 or later.</string> <string name="disclaimer_formal">KeePass DX \u00A9 %1$d Jeremy Jamet / Kunzisoft, Brian Pellin comes with ABSOLUTELY NO WARRANTY; This is free software, and you are welcome to redistribute it under the conditions of the GPL version 2 or later.</string>
<string name="ellipsis">\u2026</string> <string name="ellipsis">\u2026</string>
<string name="enter_filename">Enter database filename:</string> <string name="enter_filename">Enter database filename:</string>
<string name="entry_accessed">Accessed: </string> <string name="entry_accessed">Accessed: </string>
@@ -96,7 +96,7 @@
<string name="error_wrong_length">Enter a positive integer on length field</string> <string name="error_wrong_length">Enter a positive integer on length field</string>
<string name="field_name">Field Name</string> <string name="field_name">Field Name</string>
<string name="field_value">Field value</string> <string name="field_value">Field value</string>
<string name="FileNotFound">File not found.</string> <string name="file_not_found">File not found.</string>
<string name="file_not_found_content">File not found. Try reopening from your content provider.</string> <string name="file_not_found_content">File not found. Try reopening from your content provider.</string>
<string name="file_browser">File Browser</string> <string name="file_browser">File Browser</string>
<string name="generate_password">Generate Password</string> <string name="generate_password">Generate Password</string>
@@ -120,8 +120,8 @@
<string name="keyfile_does_not_exist">Key file does not exist.</string> <string name="keyfile_does_not_exist">Key file does not exist.</string>
<string name="keyfile_is_empty">Key file is empty.</string> <string name="keyfile_is_empty">Key file is empty.</string>
<string name="length">Length</string> <string name="length">Length</string>
<string name="list_size_title">Group list size</string> <string name="list_size_title">Size of list items</string>
<string name="list_size_summary">Text size in the group list</string> <string name="list_size_summary">Text size in the element list</string>
<string name="loading_database">Loading database&#8230;</string> <string name="loading_database">Loading database&#8230;</string>
<string name="lowercase">Lower-case</string> <string name="lowercase">Lower-case</string>
<string name="MaskedPassword">*****</string> <string name="MaskedPassword">*****</string>
@@ -151,7 +151,7 @@
<string name="no_keys">No entries in the database or group.</string> <string name="no_keys">No entries in the database or group.</string>
<string name="no_results">No search results</string> <string name="no_results">No search results</string>
<string name="no_url_handler">No handler for this url.</string> <string name="no_url_handler">No handler for this url.</string>
<string name="open_recent">Open recent database (click to open):</string> <string name="open_recent">Open recent database :</string>
<string name="omitbackup_title">Don\'t search backup entries</string> <string name="omitbackup_title">Don\'t search backup entries</string>
<string name="omitbackup_summary">Omit \'Backup\' group from search results (applies to .kdb only)</string> <string name="omitbackup_summary">Omit \'Backup\' group from search results (applies to .kdb only)</string>
<string name="pass_filename">KeePass database filename:</string> <string name="pass_filename">KeePass database filename:</string>
@@ -201,6 +201,7 @@
<string name="scanning_fingerprint">Listening for fingerprints</string> <string name="scanning_fingerprint">Listening for fingerprints</string>
<string name="encrypted_value_stored">Encrypted password stored</string> <string name="encrypted_value_stored">Encrypted password stored</string>
<string name="fingerprint_invalid_key">Invalid Key problem</string> <string name="fingerprint_invalid_key">Invalid Key problem</string>
<string name="fingerprint_not_recognized">Fingerprint not recognized</string>
<string name="fingerprint_error">Fingerprint problem</string> <string name="fingerprint_error">Fingerprint problem</string>
<string name="store_with_fingerprint">Use fingerprint to store this password</string> <string name="store_with_fingerprint">Use fingerprint to store this password</string>
<string name="no_password_stored">No password stored yet for this database</string> <string name="no_password_stored">No password stored yet for this database</string>
@@ -226,11 +227,19 @@
<string name="fingerprint">Fingerprint</string> <string name="fingerprint">Fingerprint</string>
<string name="fingerprint_enable_title">Fingerprint listening</string> <string name="fingerprint_enable_title">Fingerprint listening</string>
<string name="fingerprint_enable_summary">Enable database opening by fingerprint</string> <string name="fingerprint_enable_summary">Enable database opening by fingerprint</string>
<string name="unavailable_feature_text">Can not start this feature\nYour Android version %1$d is not the minimum version %2$d required</string> <string name="fingerprint_delete_all_title">Delete encryption keys</string>
<string name="fingerprint_delete_all_summary">Delete all encryption keys related to fingerprint recognition</string>
<string name="fingerprint_delete_all_warning">Are you sure you want to delete all the keys related to fingerprints?</string>
<string name="unavailable_feature_text">Can not start this feature.</string>
<string name="unavailable_feature_version">Your Android version %1$d is not the minimum version %2$d required.</string>
<string name="unavailable_feature_hardware">The hardware is not detected.</string>
<string name="file_name">File name</string> <string name="file_name">File name</string>
<string name="path">Path</string> <string name="path">Path</string>
<string name="assign_master_key">Assign a master key</string> <string name="assign_master_key">Assign a master key</string>
<string name="create_keepass_file">Create a keepass file</string> <string name="create_keepass_file">Create a keepass file</string>
<string name="bytes">Bytes</string>
<string name="full_file_path_enable_title">File Path</string>
<string name="full_file_path_enable_summary">View the full file path</string>
<string-array name="clipboard_timeout_options"> <string-array name="clipboard_timeout_options">
<item>30 seconds</item> <item>30 seconds</item>

View File

@@ -177,6 +177,9 @@
<style name="KeepassDXStyle.TextAppearance.Default" parent="KeepassDXStyle.TextAppearance"> <style name="KeepassDXStyle.TextAppearance.Default" parent="KeepassDXStyle.TextAppearance">
<item name="android:textSize">16sp</item> <item name="android:textSize">16sp</item>
</style> </style>
<style name="KeepassDXStyle.TextAppearance.Large" parent="KeepassDXStyle.TextAppearance">
<item name="android:textSize">18sp</item>
</style>
<style name="KeepassDXStyle.TextAppearance.FolderTitle" parent="KeepassDXStyle.TextAppearance.Default"> <style name="KeepassDXStyle.TextAppearance.FolderTitle" parent="KeepassDXStyle.TextAppearance.Default">
<item name="android:textColor">?android:attr/textColorPrimary</item> <item name="android:textColor">?android:attr/textColorPrimary</item>
</style> </style>
@@ -188,6 +191,10 @@
<item name="android:textColor">?android:attr/textColorPrimary</item> <item name="android:textColor">?android:attr/textColorPrimary</item>
<item name="android:textSize">14sp</item> <item name="android:textSize">14sp</item>
</style> </style>
<style name="KeepassDXStyle.TextAppearance.LargeTitle" parent="KeepassDXStyle.TextAppearance">
<item name="android:textColor">?android:attr/textColorPrimary</item>
<item name="android:textSize">20sp</item>
</style>
<style name="KeepassDXStyle.TextAppearance.SecondaryText" parent="KeepassDXStyle.TextAppearance"> <style name="KeepassDXStyle.TextAppearance.SecondaryText" parent="KeepassDXStyle.TextAppearance">
<item name="android:textSize">14sp</item> <item name="android:textSize">14sp</item>
</style> </style>

View File

@@ -118,6 +118,10 @@
android:title="@string/fingerprint_enable_title" android:title="@string/fingerprint_enable_title"
android:summary="@string/fingerprint_enable_summary" android:summary="@string/fingerprint_enable_summary"
android:defaultValue="@bool/fingerprint_enable_default"/> android:defaultValue="@bool/fingerprint_enable_default"/>
<android.support.v7.preference.Preference
android:key="@string/fingerprint_delete_all_key"
android:title="@string/fingerprint_delete_all_title"
android:summary="@string/fingerprint_delete_all_summary" />
</android.support.v7.preference.PreferenceCategory> </android.support.v7.preference.PreferenceCategory>
@@ -139,6 +143,11 @@
android:entryValues="@array/list_size_values" android:entryValues="@array/list_size_values"
android:dialogTitle="@string/list_size_summary" android:dialogTitle="@string/list_size_summary"
android:defaultValue="@string/list_size_default"/> android:defaultValue="@string/list_size_default"/>
<android.support.v14.preference.SwitchPreference
android:key="@string/full_file_path_enable_key"
android:title="@string/full_file_path_enable_title"
android:summary="@string/full_file_path_enable_summary"
android:defaultValue="@bool/full_file_path_enable_default"/>
</android.support.v7.preference.PreferenceCategory> </android.support.v7.preference.PreferenceCategory>
</android.support.v7.preference.PreferenceScreen> </android.support.v7.preference.PreferenceScreen>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

2
fastlane/Appfile Normal file
View File

@@ -0,0 +1,2 @@
json_key_file "./../Google_Play_Android_Developer.json" # Path to the json secret file - Follow https://docs.fastlane.tools/actions/supply/#setup to get one
package_name "com.kunzisoft.keepass" # e.g. com.krausefx.app

46
fastlane/Fastfile Normal file
View File

@@ -0,0 +1,46 @@
# This file contains the fastlane.tools configuration
# You can find the documentation at https://docs.fastlane.tools
#
# For a list of all available actions, check out
#
# https://docs.fastlane.tools/actions
#
# Uncomment the line if you want fastlane to automatically update itself
# update_fastlane
default_platform(:android)
platform :android do
desc "Runs all the tests"
lane :tests do
gradle(task: "test")
end
desc "Build a new Beta version"
lane :build_beta_google_free do |options|
gradle(
task: "assemble",
flavor: "free_google",
build_type: "Release",
print_command: false,
properties: {
"android.injected.signing.store.file" => options[:storefile],
"android.injected.signing.store.password" => options[:storepass],
"android.injected.signing.key.alias" => options[:keyalias],
"android.injected.signing.key.password" => options[:keypass],
}
)
end
desc "Deploy a new Beta version to the Google Play"
lane :deploy_beta_google_free do
upload_to_play_store(
track: "beta",
skip_upload_metadata: "false",
skip_upload_images: "true",
skip_upload_screenshots: "false",
validate_only: "true",
)
end
end

30
fastlane/README.md Normal file
View File

@@ -0,0 +1,30 @@
fastlane documentation
================
# Installation
Install _fastlane_ using
```
[sudo] gem install fastlane -NV
```
or alternatively using `brew cask install fastlane`
# Available Actions
## Android
```
fastlane tests
```
Runs all the tests
```
fastlane build_beta_google_free storefile:"" storepass:"" keyalias:"" keypass:""
```
Build a new Beta version
```
fastlane deploy_beta_google_free
```
Deploy a new Beta version to the Google Play
----
More information about fastlane can be found on [fastlane.tools](https://fastlane.tools).
The documentation of fastlane can be found on [docs.fastlane.tools](https://docs.fastlane.tools).

View File

@@ -0,0 +1,9 @@
* New database workflow with new screens and folder selection
* Settings for default password generation
* Fingerprint dialog for explanations
* Setting to disable fingerprint
* Directly opening kdbx file
* Setting to disable notifications
* Setting to lock database when screen is shut off
* Merge KeePassDroid 2.2.0.9
* Add corruption fix mode

View File

@@ -0,0 +1,7 @@
* Show only file name
* Setting for full path
* Add information for each database file
* Setting to delete fingerprints
* Solve bugs when change fingerprint
* Delete view assignment for fingerprint opening
* Merge KeePassDroid 2.2.1

View File

@@ -0,0 +1,15 @@
If you want a light material design Keepass client to manage keys and passwords in secure database, you're in the right place !
Features :
* Create database files / entries and groups
* Support for .kdb and .kdbx files (version 1 to 4)
* Open database, copy username / password, open URI / URL
* Fingerprint for fast unlocking
* Material design with themes
* AutoFill and Integration (Development in progress)
* Precise management of settings
Keepass DX is opensource and ad-free.
You can donate for a better service and a quick development of your features.
Any issue : https://github.com/Kunzisoft/KeePassDX/issues

View File

Before

Width:  |  Height:  |  Size: 77 KiB

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

View File

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 30 KiB

View File

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 34 KiB

View File

Before

Width:  |  Height:  |  Size: 55 KiB

After

Width:  |  Height:  |  Size: 55 KiB

View File

Before

Width:  |  Height:  |  Size: 51 KiB

After

Width:  |  Height:  |  Size: 51 KiB

View File

Before

Width:  |  Height:  |  Size: 51 KiB

After

Width:  |  Height:  |  Size: 51 KiB

View File

Before

Width:  |  Height:  |  Size: 58 KiB

After

Width:  |  Height:  |  Size: 58 KiB

View File

@@ -0,0 +1 @@
KeePass deluxe to manage your passwords in a secure way

View File

@@ -0,0 +1 @@
KeePass DX

View File

@@ -0,0 +1,9 @@
* Nouveau workflow de base de données avec nouveaux écrans et sélection de dossier
* Paramètres pour la génération de mots de passe
* Dialogue d'empreinte digitale pour les explications
* Paramètre pour désactiver l'empreinte digitale
* Ouverture direct des fichiers kdbx
* Paramètre de désactivation des notifications
* Paramètre de fermeture de la base de données quand l'écran séteint
* Merge KeePassDroid 2.2.0.9
* Ajout de la résolution de corruption

View File

@@ -0,0 +1,7 @@
* Affichage uniquement du nom du fichier
* Paramètre pour le chemin complet
* Ajout des informations pour chaque fichier de base de données
* Paramètre pour supprimer les empreintes digitales
* Résolution des bugs lors du changement d'empreinte digitale
* Suppression de l'attribution de la vue pour l'ouverture par empreinte digitale
* Merge KeePassDroid 2.2.1

View File

@@ -0,0 +1,15 @@
Si vous voulez un client Keepass material design pour gérer vos clés et mots de passe dans une base de données sécurisée, vous êtes au bon endroit !
Fonctionnalités :
* Création de fichiers de base de données / entrées et groupes
* Support des fichiers .kdb et .kdbx (version 1 à 4)
* Ouverture de la base de données, copie du nom d'utilisateur / mot de passe, ouverture des URI / URL
* Empreinte digitale pour déblocage rapide
* Material design avec thèmes
* AutoFill et Intégration (Développement en cours)
* Gestion précise des paramètres
Keepass DX est opensource et sans publicité.
Vous pouvez faire un don pour un meilleur service et un développement rapide de vos fonctionnalités.
Vous avez un bug : https://github.com/Kunzisoft/KeePassDX/issues

View File

@@ -0,0 +1 @@
KeePass deluxe pour gérer vos mots de passe de façon sécurisée