Inform user the progress or result of opening wallet (#297)

This commit is contained in:
0140454 2018-06-15 03:33:23 +08:00 committed by m2049r
parent af0ecb2894
commit d6d2de8312
13 changed files with 177 additions and 50 deletions

View File

@ -32,6 +32,7 @@ import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.graphics.drawable.VectorDrawable; import android.graphics.drawable.VectorDrawable;
import android.hardware.fingerprint.FingerprintManager; import android.hardware.fingerprint.FingerprintManager;
import android.os.AsyncTask;
import android.os.Build; import android.os.Build;
import android.os.CancellationSignal; import android.os.CancellationSignal;
import android.os.Environment; import android.os.Environment;
@ -67,6 +68,7 @@ import java.net.MalformedURLException;
import java.net.SocketTimeoutException; import java.net.SocketTimeoutException;
import java.net.URL; import java.net.URL;
import java.util.Locale; import java.util.Locale;
import java.util.concurrent.atomic.AtomicBoolean;
import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.HttpsURLConnection;
@ -381,6 +383,7 @@ public class Helper {
} }
static AlertDialog openDialog = null; // for preventing opening of multiple dialogs static AlertDialog openDialog = null; // for preventing opening of multiple dialogs
static AsyncTask<Void, Void, Boolean> loginTask = null;
static public void promptPassword(final Context context, final String wallet, boolean fingerprintDisabled, final PasswordAction action) { static public void promptPassword(final Context context, final String wallet, boolean fingerprintDisabled, final PasswordAction action) {
if (openDialog != null) return; // we are already asking for password if (openDialog != null) return; // we are already asking for password
@ -393,11 +396,68 @@ public class Helper {
final TextInputLayout etPassword = (TextInputLayout) promptsView.findViewById(R.id.etPassword); final TextInputLayout etPassword = (TextInputLayout) promptsView.findViewById(R.id.etPassword);
etPassword.setHint(context.getString(R.string.prompt_password, wallet)); etPassword.setHint(context.getString(R.string.prompt_password, wallet));
final TextView tvOpenPrompt = (TextView) promptsView.findViewById(R.id.tvOpenPrompt);
final Drawable icFingerprint = context.getDrawable(R.drawable.ic_fingerprint);
final Drawable icError = context.getDrawable(R.drawable.ic_error_red_36dp);
final Drawable icInfo = context.getDrawable(R.drawable.ic_info_green_36dp);
final boolean fingerprintAuthCheck = FingerprintHelper.isFingerPassValid(context, wallet); final boolean fingerprintAuthCheck = FingerprintHelper.isFingerPassValid(context, wallet);
final boolean fingerprintAuthAllowed = !fingerprintDisabled && fingerprintAuthCheck; final boolean fingerprintAuthAllowed = !fingerprintDisabled && fingerprintAuthCheck;
final CancellationSignal cancelSignal = new CancellationSignal(); final CancellationSignal cancelSignal = new CancellationSignal();
final AtomicBoolean incorrectSavedPass = new AtomicBoolean(false);
class LoginWalletTask extends AsyncTask<Void, Void, Boolean> {
private String pass;
private boolean fingerprintUsed;
LoginWalletTask(String pass, boolean fingerprintUsed) {
this.pass = pass;
this.fingerprintUsed = fingerprintUsed;
}
@Override
protected void onPreExecute() {
tvOpenPrompt.setCompoundDrawablesRelativeWithIntrinsicBounds(icInfo, null, null, null);
tvOpenPrompt.setText(context.getText(R.string.prompt_open_wallet));
tvOpenPrompt.setVisibility(View.VISIBLE);
}
@Override
protected Boolean doInBackground(Void... unused) {
return processPasswordEntry(context, wallet, pass, fingerprintUsed, action);
}
@Override
protected void onPostExecute(Boolean result) {
if (result) {
Helper.hideKeyboardAlways((Activity) context);
cancelSignal.cancel();
openDialog.dismiss();
openDialog = null;
} else {
if (fingerprintUsed) {
incorrectSavedPass.set(true);
tvOpenPrompt.setCompoundDrawablesRelativeWithIntrinsicBounds(icError, null, null, null);
tvOpenPrompt.setText(context.getText(R.string.bad_saved_password));
} else {
if (!fingerprintAuthAllowed) {
tvOpenPrompt.setVisibility(View.GONE);
} else if (incorrectSavedPass.get()) {
tvOpenPrompt.setCompoundDrawablesRelativeWithIntrinsicBounds(icError, null, null, null);
tvOpenPrompt.setText(context.getText(R.string.bad_password));
} else {
tvOpenPrompt.setCompoundDrawablesRelativeWithIntrinsicBounds(icFingerprint, null, null, null);
tvOpenPrompt.setText(context.getText(R.string.prompt_fingerprint_auth));
}
etPassword.setError(context.getString(R.string.bad_password));
}
}
loginTask = null;
}
}
etPassword.getEditText().addTextChangedListener(new TextWatcher() { etPassword.getEditText().addTextChangedListener(new TextWatcher() {
@Override @Override
@ -427,6 +487,10 @@ public class Helper {
public void onClick(DialogInterface dialog, int id) { public void onClick(DialogInterface dialog, int id) {
Helper.hideKeyboardAlways((Activity) context); Helper.hideKeyboardAlways((Activity) context);
cancelSignal.cancel(); cancelSignal.cancel();
if (loginTask != null) {
loginTask.cancel(true);
loginTask = null;
}
dialog.cancel(); dialog.cancel();
openDialog = null; openDialog = null;
} }
@ -440,30 +504,28 @@ public class Helper {
fingerprintAuthCallback = new FingerprintManager.AuthenticationCallback() { fingerprintAuthCallback = new FingerprintManager.AuthenticationCallback() {
@Override @Override
public void onAuthenticationError(int errMsgId, CharSequence errString) { public void onAuthenticationError(int errMsgId, CharSequence errString) {
((TextView) promptsView.findViewById(R.id.txtFingerprintAuth)).setText(errString); tvOpenPrompt.setCompoundDrawablesRelativeWithIntrinsicBounds(icError, null, null, null);
tvOpenPrompt.setText(errString);
} }
@Override @Override
public void onAuthenticationSucceeded(FingerprintManager.AuthenticationResult result) { public void onAuthenticationSucceeded(FingerprintManager.AuthenticationResult result) {
try { try {
String userPass = KeyStoreHelper.loadWalletUserPass(context, wallet); String userPass = KeyStoreHelper.loadWalletUserPass(context, wallet);
if (Helper.processPasswordEntry(context, wallet, userPass, true, action)) { if (loginTask == null) {
Helper.hideKeyboardAlways((Activity) context); loginTask = new LoginWalletTask(userPass, true);
openDialog.dismiss(); loginTask.execute();
openDialog = null;
} else {
etPassword.setError(context.getString(R.string.bad_password));
} }
} catch (KeyStoreHelper.BrokenPasswordStoreException ex) { } catch (KeyStoreHelper.BrokenPasswordStoreException ex) {
etPassword.setError(context.getString(R.string.bad_password)); etPassword.setError(context.getString(R.string.bad_password));
// TODO: better errror message here - what would it be? // TODO: better error message here - what would it be?
} }
} }
@Override @Override
public void onAuthenticationFailed() { public void onAuthenticationFailed() {
((TextView) promptsView.findViewById(R.id.txtFingerprintAuth)) tvOpenPrompt.setCompoundDrawablesRelativeWithIntrinsicBounds(icError, null, null, null);
.setText(context.getString(R.string.bad_fingerprint)); tvOpenPrompt.setText(context.getString(R.string.bad_fingerprint));
} }
}; };
} }
@ -472,7 +534,9 @@ public class Helper {
@Override @Override
public void onShow(DialogInterface dialog) { public void onShow(DialogInterface dialog) {
if (fingerprintAuthAllowed && fingerprintAuthCallback != null) { if (fingerprintAuthAllowed && fingerprintAuthCallback != null) {
promptsView.findViewById(R.id.txtFingerprintAuth).setVisibility(View.VISIBLE); tvOpenPrompt.setCompoundDrawablesRelativeWithIntrinsicBounds(icFingerprint, null, null, null);
tvOpenPrompt.setText(context.getText(R.string.prompt_fingerprint_auth));
tvOpenPrompt.setVisibility(View.VISIBLE);
FingerprintHelper.authenticate(context, cancelSignal, fingerprintAuthCallback); FingerprintHelper.authenticate(context, cancelSignal, fingerprintAuthCallback);
} }
Button button = ((AlertDialog) dialog).getButton(AlertDialog.BUTTON_POSITIVE); Button button = ((AlertDialog) dialog).getButton(AlertDialog.BUTTON_POSITIVE);
@ -480,13 +544,9 @@ public class Helper {
@Override @Override
public void onClick(View view) { public void onClick(View view) {
String pass = etPassword.getEditText().getText().toString(); String pass = etPassword.getEditText().getText().toString();
if (processPasswordEntry(context, wallet, pass, false, action)) { if (loginTask == null) {
Helper.hideKeyboardAlways((Activity) context); loginTask = new LoginWalletTask(pass, false);
cancelSignal.cancel(); loginTask.execute();
openDialog.dismiss();
openDialog = null;
} else {
etPassword.setError(context.getString(R.string.bad_password));
} }
} }
}); });
@ -498,13 +558,9 @@ public class Helper {
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) || (actionId == EditorInfo.IME_ACTION_DONE)) { if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) || (actionId == EditorInfo.IME_ACTION_DONE)) {
String pass = etPassword.getEditText().getText().toString(); String pass = etPassword.getEditText().getText().toString();
if (processPasswordEntry(context, wallet, pass, false, action)) { if (loginTask == null) {
Helper.hideKeyboardAlways((Activity) context); loginTask = new LoginWalletTask(pass, false);
cancelSignal.cancel(); loginTask.execute();
openDialog.dismiss();
openDialog = null;
} else {
etPassword.setError(context.getString(R.string.bad_password));
} }
return true; return true;
} }

View File

@ -0,0 +1,27 @@
<!--
~ Copyright (C) 2015 The Android Open Source Project
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="36dp"
android:height="36dp"
android:viewportWidth="36"
android:viewportHeight="36" >
<path
android:fillColor="#f4511e"
android:pathData="M18,18m -18, 0a 18, 18 0 1, 0 36, 0a 18, 18 0 1, 0 -36, 0" />
<path
android:fillColor="#ffffffff"
android:pathData="m16.665,24.915001l2.67,0l0,2.67l-2.67,0l0,-2.67zm0,-16.5l2.67,0l0,12.67l-2.67,0l0,-12.67z" />
</vector>

View File

@ -1,37 +1,40 @@
<!-- <!--
Copyright (C) 2015 The Android Open Source Project ~ Copyright (C) 2015 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License"); ~
you may not use this file except in compliance with the License. ~ Licensed under the Apache License, Version 2.0 (the "License");
You may obtain a copy of the License at ~ you may not use this file except in compliance with the License.
http://www.apache.org/licenses/LICENSE-2.0 ~ You may obtain a copy of the License at
Unless required by applicable law or agreed to in writing, software ~
distributed under the License is distributed on an "AS IS" BASIS, ~ http://www.apache.org/licenses/LICENSE-2.0
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ~
See the License for the specific language governing permissions and ~ Unless required by applicable law or agreed to in writing, software
limitations under the License ~ distributed under the License is distributed on an "AS IS" BASIS,
--> ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android" <vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="32dp" android:width="36dp"
android:height="32dp" android:height="36dp"
android:viewportWidth="32.0" android:viewportWidth="36.0"
android:viewportHeight="32.0"> android:viewportHeight="36.0">
<path <path
android:fillColor="#6b8693" android:fillColor="#009688"
android:pathData="M16,16m -16, 0a 16, 16 0 1, 0 32, 0a 16, 16 0 1, 0 -32, 0" /> android:pathData="M18,18m -18, 0a 18, 18 0 1, 0 36, 0a 18, 18 0 1, 0 -36, 0" />
<path <path
android:fillColor="#ffffff" android:fillColor="#ffffff"
android:pathData="M23.7,5.9c-0.1,0.0 -0.2,0.0 -0.3,-0.1C21.0,4.5 18.6,3.9 16.0,3.9c-2.5,0.0 -4.6,0.6 -6.9,1.9C8.8,6.0 8.3,5.9 8.1,5.5C7.9,5.2 8.0,4.7 8.4,4.5c2.5,-1.4 4.9,-2.1 7.7,-2.1c2.8,0.0 5.4,0.7 8.0,2.1c0.4,0.2 0.5,0.6 0.3,1.0C24.2,5.7 24.0,5.9 23.7,5.9z"/> android:pathData="m23.815,10.47c-0.08,0 -0.16,-0.02 -0.23,-0.06c-1.92,-0.99 -3.58,-1.41 -5.57,-1.41c-1.98,0 -3.86,0.47 -5.57,1.41c-0.24,0.13 -0.54,0.04 -0.68,-0.2c-0.13,-0.24 -0.04,-0.55 0.2,-0.68c1.86,-1.01 3.9,-1.53 6.05,-1.53c2.13,0 3.99,0.47 6.03,1.52c0.25,0.13 0.34,0.43 0.21,0.67c-0.09,0.18 -0.26,0.28 -0.44,0.28z" />
<path <path
android:fillColor="#ffffff" android:fillColor="#ffffff"
android:pathData="M5.3,13.2c-0.1,0.0 -0.3,0.0 -0.4,-0.1c-0.3,-0.2 -0.4,-0.7 -0.2,-1.0c1.3,-1.9 2.9,-3.4 4.9,-4.5c4.1,-2.2 9.3,-2.2 13.4,0.0c1.9,1.1 3.6,2.5 4.9,4.4c0.2,0.3 0.1,0.8 -0.2,1.0c-0.3,0.2 -0.8,0.1 -1.0,-0.2c-1.2,-1.7 -2.6,-3.0 -4.3,-4.0c-3.7,-2.0 -8.3,-2.0 -12.0,0.0c-1.7,0.9 -3.2,2.3 -4.3,4.0C5.7,13.1 5.5,13.2 5.3,13.2z"/> android:pathData="m9.505,15.72c-0.1,0 -0.2,-0.03 -0.29,-0.09c-0.23,-0.16 -0.28,-0.47 -0.12,-0.7c0.99,-1.4 2.25,-2.5 3.75,-3.27c3.14,-1.62 7.16,-1.63 10.31,-0.01c1.5,0.77 2.76,1.86 3.75,3.25c0.16,0.22 0.11,0.54 -0.12,0.7c-0.23,0.16 -0.54,0.11 -0.7,-0.12c-0.9,-1.26 -2.04,-2.25 -3.39,-2.94c-2.87,-1.47 -6.54,-1.47 -9.4,0.01c-1.36,0.7 -2.5,1.7 -3.4,2.96c-0.08,0.14 -0.23,0.21 -0.39,0.21z" />
<path <path
android:fillColor="#ffffff" android:fillColor="#ffffff"
android:pathData="M13.3,29.6c-0.2,0.0 -0.4,-0.1 -0.5,-0.2c-1.1,-1.2 -1.7,-2.0 -2.6,-3.6c-0.9,-1.7 -1.4,-3.7 -1.4,-5.9c0.0,-4.1 3.3,-7.4 7.4,-7.4c4.1,0.0 7.4,3.3 7.4,7.4c0.0,0.4 -0.3,0.7 -0.7,0.7s-0.7,-0.3 -0.7,-0.7c0.0,-3.3 -2.7,-5.9 -5.9,-5.9c-3.3,0.0 -5.9,2.7 -5.9,5.9c0.0,2.0 0.4,3.8 1.2,5.2c0.8,1.6 1.4,2.2 2.4,3.3c0.3,0.3 0.3,0.8 0.0,1.0C13.7,29.5 13.5,29.6 13.3,29.6z"/> android:pathData="m15.755,27.79c-0.13,0 -0.26,-0.05 -0.35,-0.15c-0.87,-0.87 -1.34,-1.43 -2.01,-2.64c-0.69,-1.23 -1.05,-2.73 -1.05,-4.34c0,-2.97 2.54,-5.39 5.66,-5.39s5.66,2.42 5.66,5.39c0,0.28 -0.22,0.5 -0.5,0.5s-0.5,-0.22 -0.5,-0.5c0,-2.42 -2.09,-4.39 -4.66,-4.39c-2.57,0 -4.66,1.97 -4.66,4.39c0,1.44 0.32,2.77 0.93,3.85c0.64,1.15 1.08,1.64 1.85,2.42c0.19,0.2 0.19,0.51 0,0.71c-0.11,0.1 -0.24,0.15 -0.37,0.15z" />
<path <path
android:fillColor="#ffffff" android:fillColor="#ffffff"
android:pathData="M22.6,27.1c-1.6,0.0 -2.9,-0.4 -4.1,-1.2c-1.9,-1.4 -3.1,-3.6 -3.1,-6.0c0.0,-0.4 0.3,-0.7 0.7,-0.7s0.7,0.3 0.7,0.7c0.0,1.9 0.9,3.7 2.5,4.8c0.9,0.6 1.9,1.0 3.2,1.0c0.3,0.0 0.8,0.0 1.3,-0.1c0.4,-0.1 0.8,0.2 0.8,0.6c0.1,0.4 -0.2,0.8 -0.6,0.8C23.4,27.1 22.8,27.1 22.6,27.1z"/> android:pathData="m22.925,25.94c-1.19,0 -2.24,-0.3 -3.1,-0.89c-1.49,-1.01 -2.38,-2.65 -2.38,-4.39c0,-0.28 0.22,-0.5 0.5,-0.5s0.5,0.22 0.5,0.5c0,1.41 0.72,2.74 1.94,3.56c0.71,0.48 1.54,0.71 2.54,0.71c0.24,0 0.64,-0.03 1.04,-0.1c0.27,-0.05 0.53,0.13 0.58,0.41c0.05,0.27 -0.13,0.53 -0.41,0.58c-0.57,0.11 -1.07,0.12 -1.21,0.12z" />
<path <path
android:fillColor="#ffffff" android:fillColor="#ffffff"
android:pathData="M20.0,29.9c-0.1,0.0 -0.1,0.0 -0.2,0.0c-2.1,-0.6 -3.4,-1.4 -4.8,-2.9c-1.8,-1.9 -2.8,-4.4 -2.8,-7.1c0.0,-2.2 1.8,-4.1 4.1,-4.1c2.2,0.0 4.1,1.8 4.1,4.1c0.0,1.4 1.2,2.6 2.6,2.6c1.4,0.0 2.6,-1.2 2.6,-2.6c0.0,-5.1 -4.2,-9.3 -9.3,-9.3c-3.6,0.0 -6.9,2.1 -8.4,5.4C7.3,17.1 7.0,18.4 7.0,19.8c0.0,1.1 0.1,2.7 0.9,4.9c0.1,0.4 -0.1,0.8 -0.4,0.9c-0.4,0.1 -0.8,-0.1 -0.9,-0.4c-0.6,-1.8 -0.9,-3.6 -0.9,-5.4c0.0,-1.6 0.3,-3.1 0.9,-4.4c1.7,-3.8 5.6,-6.3 9.8,-6.3c5.9,0.0 10.7,4.8 10.7,10.7c0.0,2.2 -1.8,4.1 -4.1,4.1s-4.0,-1.8 -4.0,-4.1c0.0,-1.4 -1.2,-2.6 -2.6,-2.6c-1.4,0.0 -2.6,1.2 -2.6,2.6c0.0,2.3 0.9,4.5 2.4,6.1c1.2,1.3 2.4,2.0 4.2,2.5c0.4,0.1 0.6,0.5 0.5,0.9C20.6,29.7 20.3,29.9 20.0,29.9z"/> android:pathData="m20.915,28c-0.04,0 -0.09,-0.01 -0.13,-0.02c-1.59,-0.44 -2.63,-1.03 -3.72,-2.1c-1.4,-1.39 -2.17,-3.24 -2.17,-5.22c0,-1.62 1.38,-2.94 3.08,-2.94c1.7,0 3.08,1.32 3.08,2.94c0,1.07 0.93,1.94 2.08,1.94s2.08,-0.87 2.08,-1.94c0,-3.77 -3.25,-6.83 -7.25,-6.83c-2.84,0 -5.44,1.58 -6.61,4.03c-0.39,0.81 -0.59,1.76 -0.59,2.8c0,0.78 0.07,2.01 0.67,3.61c0.1,0.26 -0.03,0.55 -0.29,0.64c-0.26,0.1 -0.55,-0.04 -0.64,-0.29c-0.49,-1.31 -0.73,-2.61 -0.73,-3.96c0,-1.2 0.23,-2.29 0.68,-3.24c1.33,-2.79 4.28,-4.6 7.51,-4.6c4.55,0 8.25,3.51 8.25,7.83c0,1.62 -1.38,2.94 -3.08,2.94s-3.08,-1.32 -3.08,-2.94c0,-1.07 -0.93,-1.94 -2.08,-1.94s-2.08,0.87 -2.08,1.94c0,1.71 0.66,3.31 1.87,4.51c0.95,0.94 1.86,1.46 3.27,1.85c0.27,0.07 0.42,0.35 0.35,0.61c-0.05,0.23 -0.26,0.38 -0.47,0.38z" />
</vector> </vector>

View File

@ -0,0 +1,27 @@
<!--
~ Copyright (C) 2015 The Android Open Source Project
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="36dp"
android:height="36dp"
android:viewportWidth="36"
android:viewportHeight="36" >
<path
android:fillColor="#009688"
android:pathData="M18,18m -18, 0a 18, 18 0 1, 0 36, 0a 18, 18 0 1, 0 -36, 0" />
<path
android:fillColor="#ffffff"
android:pathData="m16.665,8.415001l2.67,0l0,2.67l-2.67,0l0,-2.67zm0,6.5l2.67,0l0,12.67l-2.67,0l0,-12.67z" />
</vector>

View File

@ -23,12 +23,10 @@
</android.support.design.widget.TextInputLayout> </android.support.design.widget.TextInputLayout>
<TextView <TextView
android:id="@+id/txtFingerprintAuth" android:id="@+id/tvOpenPrompt"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:drawablePadding="10dp" android:drawablePadding="10dp"
android:drawableStart="@drawable/ic_fingerprint"
android:gravity="center_vertical" android:gravity="center_vertical"
android:text="@string/prompt_fingerprint_auth"
android:visibility="gone" /> android:visibility="gone" />
</LinearLayout> </LinearLayout>

View File

@ -133,8 +133,10 @@
<string name="prompt_password">Passwort für %1$s</string> <string name="prompt_password">Passwort für %1$s</string>
<string name="prompt_fingerprint_auth">Fingerabdruck-Authentifizierung möglich.\nBitte Sensor berühren.</string> <string name="prompt_fingerprint_auth">Fingerabdruck-Authentifizierung möglich.\nBitte Sensor berühren.</string>
<string name="prompt_send_password">Passwort bestätigen</string> <string name="prompt_send_password">Passwort bestätigen</string>
<string name="prompt_open_wallet">[Opening the wallet&#8230;]</string>
<string name="bad_fingerprint">Fingerabdruck nicht erkannt. Nochmals versuchen.</string> <string name="bad_fingerprint">Fingerabdruck nicht erkannt. Nochmals versuchen.</string>
<string name="bad_password">Falsches Passwort!</string> <string name="bad_password">Falsches Passwort!</string>
<string name="bad_saved_password">[Saved password is incorrect.\nPlease enter password manually.]</string>
<string name="bad_wallet">Wallet existiert nicht!</string> <string name="bad_wallet">Wallet existiert nicht!</string>
<string name="prompt_daemon_missing">Daemonadresse muss gesetzt sein!</string> <string name="prompt_daemon_missing">Daemonadresse muss gesetzt sein!</string>
<string name="prompt_wrong_net">Wallet entspricht nicht dem ausgewähltem Netz</string> <string name="prompt_wrong_net">Wallet entspricht nicht dem ausgewähltem Netz</string>

View File

@ -80,8 +80,10 @@
<string name="prompt_password">Contraseña para %1$s</string> <string name="prompt_password">Contraseña para %1$s</string>
<string name="prompt_fingerprint_auth">Puedes poner tu dedo en el sensor para autorizar con tu huella.</string> <string name="prompt_fingerprint_auth">Puedes poner tu dedo en el sensor para autorizar con tu huella.</string>
<string name="prompt_send_password">Confirmar Contraseña</string> <string name="prompt_send_password">Confirmar Contraseña</string>
<string name="prompt_open_wallet">[Opening the wallet&#8230;]</string>
<string name="bad_fingerprint">Huella no reconocida. Inténtalo nuevamente.</string> <string name="bad_fingerprint">Huella no reconocida. Inténtalo nuevamente.</string>
<string name="bad_password">¡Contraseña incorrecta!</string> <string name="bad_password">¡Contraseña incorrecta!</string>
<string name="bad_saved_password">[Saved password is incorrect.\nPlease enter password manually.]</string>
<string name="bad_wallet">¡El monedero no existe!</string> <string name="bad_wallet">¡El monedero no existe!</string>
<string name="prompt_daemon_missing">¡La dirección del daemon debe estar configurada!</string> <string name="prompt_daemon_missing">¡La dirección del daemon debe estar configurada!</string>
<string name="prompt_wrong_net">El monedero no coincide con la red seleccionada</string> <string name="prompt_wrong_net">El monedero no coincide con la red seleccionada</string>

View File

@ -134,8 +134,10 @@
<string name="prompt_password">Mot de passe pour %1$s</string> <string name="prompt_password">Mot de passe pour %1$s</string>
<string name="prompt_fingerprint_auth">Vous pouvez également ouvrir le portefeuille avec votre empreinte digitale.\nMerci de toucher le capteur.</string> <string name="prompt_fingerprint_auth">Vous pouvez également ouvrir le portefeuille avec votre empreinte digitale.\nMerci de toucher le capteur.</string>
<string name="prompt_send_password">Confirmez le mot de passe</string> <string name="prompt_send_password">Confirmez le mot de passe</string>
<string name="prompt_open_wallet">[Opening the wallet&#8230;]</string>
<string name="bad_fingerprint">Empreinte digitale non reconnue. Résessayez.</string> <string name="bad_fingerprint">Empreinte digitale non reconnue. Résessayez.</string>
<string name="bad_password">Mot de passe incorrect !</string> <string name="bad_password">Mot de passe incorrect !</string>
<string name="bad_saved_password">[Saved password is incorrect.\nPlease enter password manually.]</string>
<string name="bad_wallet">Portefeuille inexistant !</string> <string name="bad_wallet">Portefeuille inexistant !</string>
<string name="prompt_daemon_missing">L\'adresse du démon ne peut pas être configurée !</string> <string name="prompt_daemon_missing">L\'adresse du démon ne peut pas être configurée !</string>
<string name="prompt_wrong_net">Portefeuille incompatible avec le réseau sélectionné</string> <string name="prompt_wrong_net">Portefeuille incompatible avec le réseau sélectionné</string>

View File

@ -133,8 +133,10 @@
<string name="prompt_password">Password per %1$s</string> <string name="prompt_password">Password per %1$s</string>
<string name="prompt_fingerprint_auth">Puoi aprire il portafoglio anche usando la tua impronta digitale./nTocca il sensore.</string> <string name="prompt_fingerprint_auth">Puoi aprire il portafoglio anche usando la tua impronta digitale./nTocca il sensore.</string>
<string name="prompt_send_password">Conferma Password</string> <string name="prompt_send_password">Conferma Password</string>
<string name="prompt_open_wallet">[Opening the wallet&#8230;]</string>
<string name="bad_fingerprint">Impronta digitale non riconosciuta. Prova di nuovo.</string> <string name="bad_fingerprint">Impronta digitale non riconosciuta. Prova di nuovo.</string>
<string name="bad_password">Password errata!</string> <string name="bad_password">Password errata!</string>
<string name="bad_saved_password">[Saved password is incorrect.\nPlease enter password manually.]</string>
<string name="bad_wallet">Il portafoglio non esiste!</string> <string name="bad_wallet">Il portafoglio non esiste!</string>
<string name="prompt_daemon_missing">Deve essere impostato l\'indirizzo del Daemon!</string> <string name="prompt_daemon_missing">Deve essere impostato l\'indirizzo del Daemon!</string>
<string name="prompt_wrong_net">Il portafoglio non si abbina con la rete selezionata</string> <string name="prompt_wrong_net">Il portafoglio non si abbina con la rete selezionata</string>

View File

@ -131,8 +131,10 @@
<string name="prompt_password">Passord for %1$s</string> <string name="prompt_password">Passord for %1$s</string>
<string name="prompt_fingerprint_auth">[You can also open wallet using fingerprint.\nPlease touch sensor.]</string> <string name="prompt_fingerprint_auth">[You can also open wallet using fingerprint.\nPlease touch sensor.]</string>
<string name="prompt_send_password">Bekreft passord</string> <string name="prompt_send_password">Bekreft passord</string>
<string name="prompt_open_wallet">[Opening the wallet&#8230;]</string>
<string name="bad_fingerprint">[Fingerprint not recognized. Try again.]</string> <string name="bad_fingerprint">[Fingerprint not recognized. Try again.]</string>
<string name="bad_password">Feil passord!</string> <string name="bad_password">Feil passord!</string>
<string name="bad_saved_password">[Saved password is incorrect.\nPlease enter password manually.]</string>
<string name="bad_wallet">Lommebok eksisterer ikke!</string> <string name="bad_wallet">Lommebok eksisterer ikke!</string>
<string name="prompt_daemon_missing">Daemon-adresse må være gitt!</string> <string name="prompt_daemon_missing">Daemon-adresse må være gitt!</string>
<string name="prompt_wrong_net">Lommebok matcher ikke valgt nett</string> <string name="prompt_wrong_net">Lommebok matcher ikke valgt nett</string>

View File

@ -132,8 +132,10 @@
<string name="prompt_password">%1$s 的密码</string> <string name="prompt_password">%1$s 的密码</string>
<string name="prompt_fingerprint_auth">你也可以使用指纹来开启钱包。\n请轻触你的指纹感应器。</string> <string name="prompt_fingerprint_auth">你也可以使用指纹来开启钱包。\n请轻触你的指纹感应器。</string>
<string name="prompt_send_password">确认密码</string> <string name="prompt_send_password">确认密码</string>
<string name="prompt_open_wallet">[Opening the wallet&#8230;]</string>
<string name="bad_fingerprint">无法识别指纹,请再试一次。</string> <string name="bad_fingerprint">无法识别指纹,请再试一次。</string>
<string name="bad_password">密码错误!</string> <string name="bad_password">密码错误!</string>
<string name="bad_saved_password">[Saved password is incorrect.\nPlease enter password manually.]</string>
<string name="bad_wallet">钱包不存在!</string> <string name="bad_wallet">钱包不存在!</string>
<string name="prompt_daemon_missing">必需要设定节点位置!</string> <string name="prompt_daemon_missing">必需要设定节点位置!</string>
<string name="prompt_wrong_net">钱包不符合选择的网络</string> <string name="prompt_wrong_net">钱包不符合选择的网络</string>

View File

@ -133,8 +133,10 @@
<string name="prompt_password">%1$s 的密碼</string> <string name="prompt_password">%1$s 的密碼</string>
<string name="prompt_fingerprint_auth">你也可以使用指紋來開啟錢包。\n請輕觸你的指紋感應器。</string> <string name="prompt_fingerprint_auth">你也可以使用指紋來開啟錢包。\n請輕觸你的指紋感應器。</string>
<string name="prompt_send_password">確認密碼</string> <string name="prompt_send_password">確認密碼</string>
<string name="prompt_open_wallet">正在開啟錢包&#8230;</string>
<string name="bad_fingerprint">無法辨識的指紋,請再試一次。</string> <string name="bad_fingerprint">無法辨識的指紋,請再試一次。</string>
<string name="bad_password">密碼錯誤!</string> <string name="bad_password">密碼錯誤!</string>
<string name="bad_saved_password">儲存的密碼不正確。\n請手動輸入密碼。</string>
<string name="bad_wallet">錢包不存在!</string> <string name="bad_wallet">錢包不存在!</string>
<string name="prompt_daemon_missing">必需要設定節點位置!</string> <string name="prompt_daemon_missing">必需要設定節點位置!</string>
<string name="prompt_wrong_net">錢包不符合選擇的網路</string> <string name="prompt_wrong_net">錢包不符合選擇的網路</string>

View File

@ -139,8 +139,10 @@
<string name="prompt_password">Password for %1$s</string> <string name="prompt_password">Password for %1$s</string>
<string name="prompt_fingerprint_auth">You can also open wallet using fingerprint.\nPlease touch sensor.</string> <string name="prompt_fingerprint_auth">You can also open wallet using fingerprint.\nPlease touch sensor.</string>
<string name="prompt_send_password">Confirm Password</string> <string name="prompt_send_password">Confirm Password</string>
<string name="prompt_open_wallet">Opening the wallet&#8230;</string>
<string name="bad_fingerprint">Fingerprint not recognized. Try again.</string> <string name="bad_fingerprint">Fingerprint not recognized. Try again.</string>
<string name="bad_password">Incorrect password!</string> <string name="bad_password">Incorrect password!</string>
<string name="bad_saved_password">Saved password is incorrect.\nPlease enter password manually.</string>
<string name="bad_wallet">Wallet does not exist!</string> <string name="bad_wallet">Wallet does not exist!</string>
<string name="prompt_daemon_missing">Daemon address must be set!</string> <string name="prompt_daemon_missing">Daemon address must be set!</string>
<string name="prompt_wrong_net">Wallet does not match selected net</string> <string name="prompt_wrong_net">Wallet does not match selected net</string>