diff --git a/app/src/main/java/dk/nodes/locksmith/example/MainActivity.kt b/app/src/main/java/dk/nodes/locksmith/example/MainActivity.kt
index 9cb0fc8..07b6abe 100644
--- a/app/src/main/java/dk/nodes/locksmith/example/MainActivity.kt
+++ b/app/src/main/java/dk/nodes/locksmith/example/MainActivity.kt
@@ -9,10 +9,11 @@ import android.util.Log
import dk.nodes.locksmith.core.Locksmith
import dk.nodes.locksmith.core.exceptions.LocksmithEncryptionException
import dk.nodes.locksmith.core.exceptions.LocksmithEncryptionException.Type.*
-import dk.nodes.locksmith.core.fingerprint.FingerprintDialog
+import dk.nodes.locksmith.core.models.FingerprintDialogEvent
+import dk.nodes.locksmith.core.models.OnFingerprintDialogEventListener
import kotlinx.android.synthetic.main.activity_main.*
-class MainActivity : AppCompatActivity(), FingerprintDialog.OnFingerprintDialogEventListener {
+class MainActivity : AppCompatActivity(), OnFingerprintDialogEventListener {
private val TAG = MainActivity::class.simpleName
private val originalData = "Mary had a little lamb\n" +
@@ -131,27 +132,27 @@ class MainActivity : AppCompatActivity(), FingerprintDialog.OnFingerprintDialogE
mainTvDecryptedData.text = currentData
}
- override fun onFingerprintEvent(event: FingerprintDialog.FingerprintDialogEvent) {
+ override fun onFingerprintEvent(event: FingerprintDialogEvent) {
when (event) {
- FingerprintDialog.FingerprintDialogEvent.CANCEL -> {
+ FingerprintDialogEvent.CANCEL -> {
Log.w(TAG, "CANCEL")
}
- FingerprintDialog.FingerprintDialogEvent.SUCCESS -> {
+ FingerprintDialogEvent.SUCCESS -> {
Log.w(TAG, "SUCCESS")
}
- FingerprintDialog.FingerprintDialogEvent.ERROR -> {
+ FingerprintDialogEvent.ERROR -> {
Log.w(TAG, "ERROR")
}
- FingerprintDialog.FingerprintDialogEvent.ERROR_SECURE -> {
+ FingerprintDialogEvent.ERROR_SECURE -> {
Log.w(TAG, "ERROR_SECURE")
}
- FingerprintDialog.FingerprintDialogEvent.ERROR_HARDWARE -> {
+ FingerprintDialogEvent.ERROR_HARDWARE -> {
Log.w(TAG, "ERROR_HARDWARE")
}
- FingerprintDialog.FingerprintDialogEvent.ERROR_ENROLLMENT -> {
+ FingerprintDialogEvent.ERROR_ENROLLMENT -> {
Log.w(TAG, "ERROR_ENROLLMENT")
}
- FingerprintDialog.FingerprintDialogEvent.ERROR_CIPHER -> {
+ FingerprintDialogEvent.ERROR_CIPHER -> {
Log.w(TAG, "ERROR_ENROLLMENT")
}
}
diff --git a/app/src/main/res/layout/dialog_custom_fingerprint.xml b/app/src/main/res/layout/dialog_custom_fingerprint.xml
new file mode 100644
index 0000000..13db8c9
--- /dev/null
+++ b/app/src/main/res/layout/dialog_custom_fingerprint.xml
@@ -0,0 +1,115 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index d7de60f..34cba96 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -5,7 +5,7 @@
Login
Login to your Nodes Account
Touch the finger print sensor to authorize your account
-
+ Use Password
Error Authenticating
Successfully Authenticated!
diff --git a/locksmith/src/main/java/dk/nodes/locksmith/core/Locksmith.java b/locksmith/src/main/java/dk/nodes/locksmith/core/Locksmith.java
index 8f1d9bf..f6f8762 100644
--- a/locksmith/src/main/java/dk/nodes/locksmith/core/Locksmith.java
+++ b/locksmith/src/main/java/dk/nodes/locksmith/core/Locksmith.java
@@ -8,7 +8,8 @@
import dk.nodes.locksmith.core.encryption.EncryptionManager;
import dk.nodes.locksmith.core.exceptions.LocksmithCreationException;
import dk.nodes.locksmith.core.exceptions.LocksmithEncryptionException;
-import dk.nodes.locksmith.core.fingerprint.FingerprintDialog;
+import dk.nodes.locksmith.core.fingerprint.FingerprintDialogBase;
+import dk.nodes.locksmith.core.fingerprint.FingerprintDialogBuilder;
@SuppressLint("StaticFieldLeak")
public class Locksmith {
@@ -80,8 +81,8 @@ public long decryptLong(String data) throws LocksmithEncryptionException {
@RequiresApi(api = Build.VERSION_CODES.M)
- public FingerprintDialog.Builder getFingerprintDialogBuilder(Context context) {
- return new FingerprintDialog.Builder(context);
+ public FingerprintDialogBuilder getFingerprintDialogBuilder(Context context) {
+ return new FingerprintDialogBuilder(context);
}
// Getters
diff --git a/locksmith/src/main/java/dk/nodes/locksmith/core/fingerprint/FingerprintDialog.java b/locksmith/src/main/java/dk/nodes/locksmith/core/fingerprint/FingerprintDialog.java
index c60f5b7..da9d64f 100644
--- a/locksmith/src/main/java/dk/nodes/locksmith/core/fingerprint/FingerprintDialog.java
+++ b/locksmith/src/main/java/dk/nodes/locksmith/core/fingerprint/FingerprintDialog.java
@@ -1,15 +1,8 @@
package dk.nodes.locksmith.core.fingerprint;
-import android.app.Dialog;
-import android.app.KeyguardManager;
import android.content.Context;
import android.content.res.ColorStateList;
-import android.graphics.Color;
-import android.graphics.drawable.ColorDrawable;
-import android.hardware.fingerprint.FingerprintManager;
import android.os.Build;
-import android.os.Bundle;
-import android.os.CancellationSignal;
import android.os.Handler;
import android.support.annotation.ColorRes;
import android.support.annotation.NonNull;
@@ -17,7 +10,6 @@
import android.support.annotation.StyleRes;
import android.util.Log;
import android.view.View;
-import android.view.Window;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.Button;
@@ -26,75 +18,46 @@
import android.widget.TextView;
import dk.nodes.locksmith.R;
-import dk.nodes.locksmith.core.Locksmith;
-import dk.nodes.locksmith.core.exceptions.LocksmithCreationException;
@RequiresApi(api = Build.VERSION_CODES.M)
-public class FingerprintDialog extends Dialog {
- private static final String TAG = FingerprintDialog.class.getSimpleName();
- // Listeners
- private OnFingerprintDialogEventListener onFingerprintDialogEventListener;
+public class FingerprintDialog extends FingerprintDialogBase {
+ public static final String TAG = FingerprintDialog.class.getSimpleName();
+
// Views
private LinearLayout mainContainer;
- private TextView tvTitle;
- private TextView tvSubtitle;
- private TextView tvDescription;
- private TextView tvMessage;
- private ImageView ivFingerprint;
- private Button btnCancel;
- // Callbacks
- private FingerprintAuthenticationCallback fingerprintAuthenticationCallback = new FingerprintAuthenticationCallback();
- // Fingerprint Related Stuff
- private KeyguardManager keyguardManager;
- private FingerprintManager fingerprintManager;
- private FingerprintCryptManager cryptManager;
- private CancellationSignal cancellationSignal;
+ protected TextView tvTitle;
+ protected TextView tvSubtitle;
+ protected TextView tvDescription;
+ protected TextView tvMessage;
+ protected ImageView ivFingerprint;
+ protected Button btnCancel;
+ // Values
+ protected String titleText;
+ protected String subtitleText;
+ protected String descriptionText;
+ protected String cancelButtonText;
+ protected String successMessageText;
+ protected String errorMessageText;
// Handler
private Handler handler = new Handler();
- // Values
- private String titleText;
- private String subtitleText;
- private String descriptionText;
- private String cancelButtonText;
- private String successMessageText;
- private String errorMessageText;
-
- private FingerprintDialog(@NonNull Context context) {
+ public FingerprintDialog(@NonNull Context context) {
super(context);
- setContentView(R.layout.dialog_fingerprint);
}
@Override
public void onAttachedToWindow() {
super.onAttachedToWindow();
-
- setupWindowStyle();
-
- bindViews();
-
setupViews();
-
- checkHardware();
-
startShowAnimation();
}
@Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
+ public int getDialogLayout() {
+ return R.layout.dialog_fingerprint;
}
- private void setupWindowStyle() {
- Window window = getWindow();
-
- if (window != null) {
- window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
- window.setDimAmount(0.7f);
- }
- }
-
- private void bindViews() {
+ public void setupViews() {
if (getWindow() == null) {
dismiss();
return;
@@ -110,10 +73,6 @@ private void bindViews() {
ivFingerprint = getWindow().findViewById(R.id.dialogFragmentIvFingerprint);
btnCancel = getWindow().findViewById(R.id.dialogFragmentBtnCancel);
- }
-
- private void setupViews() {
- // If our cancel button is setup then we should show it and add the values
if (cancelButtonText != null) {
btnCancel.setText(cancelButtonText);
@@ -139,98 +98,13 @@ public void onClick(View v) {
});
}
- private void checkHardware() {
- try {
- cryptManager = new FingerprintCryptManager();
- } catch (LocksmithCreationException e) {
- if (onFingerprintDialogEventListener != null) {
- onFingerprintDialogEventListener.onFingerprintEvent(FingerprintDialogEvent.ERROR_CIPHER);
- }
-
- dismiss();
- return;
- }
-
- if (!keyguardManager.isDeviceSecure()) {
- if (onFingerprintDialogEventListener != null) {
- onFingerprintDialogEventListener.onFingerprintEvent(FingerprintDialogEvent.ERROR_SECURE);
- }
-
- dismiss();
- return;
- }
-
- if (!fingerprintManager.isHardwareDetected()) {
- if (onFingerprintDialogEventListener != null) {
- onFingerprintDialogEventListener.onFingerprintEvent(FingerprintDialogEvent.ERROR_HARDWARE);
- }
-
- dismiss();
- return;
- }
-
- if (!fingerprintManager.hasEnrolledFingerprints()) {
- if (onFingerprintDialogEventListener != null) {
- onFingerprintDialogEventListener.onFingerprintEvent(FingerprintDialogEvent.ERROR_ENROLLMENT);
- }
-
- dismiss();
- return;
- }
-
- authenticate();
- }
-
- private void authenticate() {
- cancellationSignal = new CancellationSignal();
- FingerprintManager.CryptoObject cryptoObject = cryptManager.getCryptoObject();
- fingerprintManager.authenticate(cryptoObject, cancellationSignal, 0, fingerprintAuthenticationCallback, null);
- }
-
- // Event
- private void onFingerprintSuccess() {
- setFingerprintBackgroundTint(R.color.fingerprint_success);
-
- if (successMessageText != null) {
- setTvMessageWithStyle(successMessageText, R.style.FingerprintDialogSuccess);
- btnCancel.setEnabled(false);
- handler.postDelayed(new Runnable() {
- @Override
- public void run() {
- finishDialogSuccess();
- }
- }, 1000);
- } else {
- finishDialogSuccess();
- }
- }
-
- // Fingerprint Methods
-
- private void onFingerprintError() {
- setFingerprintBackgroundTint(R.color.fingerprint_error);
-
- if (errorMessageText != null) {
- setTvMessageWithStyle(errorMessageText, R.style.FingerprintDialogError);
- btnCancel.setEnabled(false);
- handler.postDelayed(new Runnable() {
- @Override
- public void run() {
- finishDialogError();
- }
- }, 1000);
- } else {
- finishDialogError();
- }
+ @Override
+ protected void closeDialog() {
+ startCloseAnimation();
+ cancelSignal();
}
- private void onFingerprintHelp(String helpString) {
- Log.d(TAG, "onFingerprintHelp: " + helpString);
-
- setFingerprintBackgroundTint(R.color.fingerprint_help);
-
- setTvMessageWithStyle(helpString, R.style.FingerprintDialogWarn);
- }
+ // Helpers
private void setTvMessageWithStyle(String message, @StyleRes int styleRes) {
tvMessage.setVisibility(View.VISIBLE);
@@ -248,74 +122,13 @@ private void setFingerprintBackgroundTint(@ColorRes int colorRes) {
ivFingerprint.setBackgroundTintList(stateList);
}
- private void initiateEncryptionKey() {
- try {
- Locksmith.getInstance().init();
- } catch (LocksmithCreationException e) {
- e.printStackTrace();
- }
-
- onFingerprintSuccess();
- }
-
- private void finishDialogSuccess() {
- Log.d(TAG, "finishDialogSuccess");
-
- if (onFingerprintDialogEventListener != null) {
- onFingerprintDialogEventListener.onFingerprintEvent(FingerprintDialogEvent.SUCCESS);
- }
-
- closeDialog();
- }
-
- // Helpers
-
- private void finishDialogError() {
- Log.d(TAG, "finishDialogError");
-
- if (onFingerprintDialogEventListener != null) {
- onFingerprintDialogEventListener.onFingerprintEvent(FingerprintDialogEvent.ERROR);
- }
-
- closeDialog();
- }
-
- private void onCancelClicked() {
- Log.d(TAG, "onCancelClicked");
-
- if (onFingerprintDialogEventListener != null) {
- onFingerprintDialogEventListener.onFingerprintEvent(FingerprintDialogEvent.CANCEL);
- }
-
- closeDialog();
- }
-
- // Dialog Finishers
-
- private void closeDialog() {
- startCloseAnimation();
- cancelSignal();
- }
-
- @Override
- protected void onStop() {
- cancelSignal();
- super.onStop();
- }
-
- private void cancelSignal() {
- if (cancellationSignal != null && !cancellationSignal.isCanceled()) {
- cancellationSignal.cancel();
- }
- }
+ // Animation Stuff
private void startShowAnimation() {
Animation animation = AnimationUtils.loadAnimation(getContext(), R.anim.slide_up);
mainContainer.startAnimation(animation);
}
- // Event overrides
-
private void startCloseAnimation() {
Animation animation = AnimationUtils.loadAnimation(getContext(), R.anim.slide_down);
@@ -339,131 +152,55 @@ public void onAnimationRepeat(Animation animation) {
mainContainer.startAnimation(animation);
}
-
- // Cancel Signal
-
private void onCloseAnimationFinished() {
dismiss();
}
- // Animation Functions
-
- public enum FingerprintDialogEvent {
- /**
- * Is called when a user cancels the dialog
- */
- CANCEL,
- /**
- * Is called when a fingerprint is successfully accepted
- */
- SUCCESS,
- /**
- * Is called when a fingerprint is read but not accepted
- */
- ERROR,
- /**
- * Is called when the lock screen is not secured by a code/fingerprint
- */
- ERROR_SECURE,
- /**
- * Is sent when there is no hardware detected¬
- */
- ERROR_HARDWARE,
- /**
- * Is called when no finger prints are enrolled
- */
- ERROR_ENROLLMENT,
- /**
- * Is called when the cipher fails to create
- */
- ERROR_CIPHER
- }
-
- public interface OnFingerprintDialogEventListener {
- void onFingerprintEvent(@NonNull FingerprintDialogEvent event);
- }
-
- @SuppressWarnings("unused")
- @RequiresApi(api = Build.VERSION_CODES.M)
- public static class Builder {
- FingerprintDialog fingerprintDialog;
- Context context;
-
- public Builder(Context context) {
- this.context = context;
- this.fingerprintDialog = new FingerprintDialog(context);
- }
-
- public Builder setEventListener(OnFingerprintDialogEventListener onFingerprintDialogEventListener) {
- fingerprintDialog.onFingerprintDialogEventListener = onFingerprintDialogEventListener;
- return this;
- }
-
- public Builder setCancelText(String text) {
- fingerprintDialog.cancelButtonText = text;
- return this;
- }
-
- public Builder setSuccessMessage(String message) {
- fingerprintDialog.successMessageText = message;
- return this;
- }
-
- public Builder setErrorMessage(String message) {
- fingerprintDialog.errorMessageText = message;
- return this;
- }
+ // Fingerprint Events
- public Builder setTitle(String text) {
- fingerprintDialog.titleText = text;
- return this;
- }
-
- public Builder setSubtitle(String text) {
- fingerprintDialog.subtitleText = text;
- return this;
- }
+ @Override
+ public void onFingerprintSuccess() {
+ setFingerprintBackgroundTint(R.color.fingerprint_success);
- public Builder setDescription(String text) {
- fingerprintDialog.descriptionText = text;
- return this;
+ if (successMessageText != null) {
+ setTvMessageWithStyle(successMessageText, R.style.FingerprintDialogSuccess);
+ btnCancel.setEnabled(false);
+ handler.postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ closeDialog();
+ }
+ }, 1000);
+ } else {
+ closeDialog();
}
+ }
- public FingerprintDialog build() {
- fingerprintDialog.keyguardManager = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE);
- fingerprintDialog.fingerprintManager = (FingerprintManager) context.getSystemService(Context.FINGERPRINT_SERVICE);
+ @Override
+ public void onFingerprintHelp(String help) {
+ Log.d(TAG, "onFingerprintHelp: " + help);
- context = null;
+ setFingerprintBackgroundTint(R.color.fingerprint_help);
- return fingerprintDialog;
- }
+ setTvMessageWithStyle(help, R.style.FingerprintDialogWarn);
}
- public class FingerprintAuthenticationCallback extends FingerprintManager.AuthenticationCallback {
- @Override
- public void onAuthenticationError(int errMsgId, CharSequence errString) {
- Log.d(TAG, "onAuthenticationError");
- onFingerprintHelp(errString.toString());
- }
-
- @Override
- public void onAuthenticationHelp(int helpMsgId, CharSequence helpString) {
- Log.d(TAG, "onAuthenticationHelp");
- onFingerprintHelp(helpString.toString());
- }
-
- @Override
- public void onAuthenticationSucceeded(FingerprintManager.AuthenticationResult result) {
- Log.d(TAG, "onAuthenticationSucceeded");
- initiateEncryptionKey();
- fingerprintAuthenticationCallback = null;
- }
+ @Override
+ public void onFingerprintError() {
+ setFingerprintBackgroundTint(R.color.fingerprint_error);
- @Override
- public void onAuthenticationFailed() {
- Log.d(TAG, "onAuthenticationFailed");
- onFingerprintError();
- fingerprintAuthenticationCallback = null;
+ if (errorMessageText != null) {
+ setTvMessageWithStyle(errorMessageText, R.style.FingerprintDialogError);
+ btnCancel.setEnabled(false);
+ handler.postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ closeDialog();
+ }
+ }, 1000);
+ } else {
+ closeDialog();
}
}
+
}
diff --git a/locksmith/src/main/java/dk/nodes/locksmith/core/fingerprint/FingerprintDialogBase.java b/locksmith/src/main/java/dk/nodes/locksmith/core/fingerprint/FingerprintDialogBase.java
new file mode 100644
index 0000000..d3752da
--- /dev/null
+++ b/locksmith/src/main/java/dk/nodes/locksmith/core/fingerprint/FingerprintDialogBase.java
@@ -0,0 +1,208 @@
+package dk.nodes.locksmith.core.fingerprint;
+
+import android.app.Dialog;
+import android.app.KeyguardManager;
+import android.content.Context;
+import android.graphics.Color;
+import android.graphics.drawable.ColorDrawable;
+import android.hardware.fingerprint.FingerprintManager;
+import android.os.Build;
+import android.os.Bundle;
+import android.os.CancellationSignal;
+import android.support.annotation.LayoutRes;
+import android.support.annotation.NonNull;
+import android.support.annotation.RequiresApi;
+import android.util.Log;
+import android.view.Window;
+
+import dk.nodes.locksmith.core.Locksmith;
+import dk.nodes.locksmith.core.exceptions.LocksmithCreationException;
+import dk.nodes.locksmith.core.models.FingerprintDialogEvent;
+import dk.nodes.locksmith.core.models.OnFingerprintDialogEventListener;
+
+@RequiresApi(api = Build.VERSION_CODES.M)
+public abstract class FingerprintDialogBase extends Dialog {
+ private static final String TAG = FingerprintDialogBase.class.getSimpleName();
+ // Listeners
+ protected OnFingerprintDialogEventListener onFingerprintDialogEventListener;
+ // Callbacks
+ private FingerprintAuthenticationCallback fingerprintAuthenticationCallback = new FingerprintAuthenticationCallback();
+ // Fingerprint Related Stuff
+ private KeyguardManager keyguardManager;
+ private FingerprintManager fingerprintManager;
+ private FingerprintCryptManager cryptManager;
+ private CancellationSignal cancellationSignal;
+
+ public FingerprintDialogBase(@NonNull Context context) {
+ super(context);
+
+ keyguardManager = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE);
+ fingerprintManager = (FingerprintManager) context.getSystemService(Context.FINGERPRINT_SERVICE);
+
+ setContentView(getDialogLayout());
+ }
+
+ @Override
+ public void onAttachedToWindow() {
+ super.onAttachedToWindow();
+
+ setupWindowStyle();
+
+ checkHardware();
+ }
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ }
+
+ private void setupWindowStyle() {
+ Window window = getWindow();
+
+ if (window != null) {
+ window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
+ window.setDimAmount(0.7f);
+ }
+ }
+
+
+ private void checkHardware() {
+ try {
+ cryptManager = new FingerprintCryptManager();
+ } catch (LocksmithCreationException e) {
+ if (onFingerprintDialogEventListener != null) {
+ onFingerprintDialogEventListener.onFingerprintEvent(FingerprintDialogEvent.ERROR_CIPHER);
+ }
+
+ dismiss();
+ return;
+ }
+
+ if (!keyguardManager.isDeviceSecure()) {
+ if (onFingerprintDialogEventListener != null) {
+ onFingerprintDialogEventListener.onFingerprintEvent(FingerprintDialogEvent.ERROR_SECURE);
+ }
+
+ dismiss();
+ return;
+ }
+
+ if (!fingerprintManager.isHardwareDetected()) {
+ if (onFingerprintDialogEventListener != null) {
+ onFingerprintDialogEventListener.onFingerprintEvent(FingerprintDialogEvent.ERROR_HARDWARE);
+ }
+
+ dismiss();
+ return;
+ }
+
+ if (!fingerprintManager.hasEnrolledFingerprints()) {
+ if (onFingerprintDialogEventListener != null) {
+ onFingerprintDialogEventListener.onFingerprintEvent(FingerprintDialogEvent.ERROR_ENROLLMENT);
+ }
+
+ dismiss();
+ return;
+ }
+
+ authenticate();
+ }
+
+ private void authenticate() {
+ cancellationSignal = new CancellationSignal();
+ FingerprintManager.CryptoObject cryptoObject = cryptManager.getCryptoObject();
+ fingerprintManager.authenticate(cryptoObject, cancellationSignal, 0, fingerprintAuthenticationCallback, null);
+ }
+
+ @Override
+ protected void onStop() {
+ cancelSignal();
+ super.onStop();
+ }
+
+ protected void cancelSignal() {
+ if (cancellationSignal != null && !cancellationSignal.isCanceled()) {
+ cancellationSignal.cancel();
+ }
+ }
+
+
+ public class FingerprintAuthenticationCallback extends FingerprintManager.AuthenticationCallback {
+ @Override
+ public void onAuthenticationError(int errMsgId, CharSequence errString) {
+ Log.d(TAG, "onAuthenticationError");
+ onFingerprintHelp(errString.toString());
+ }
+
+ @Override
+ public void onAuthenticationHelp(int helpMsgId, CharSequence helpString) {
+ Log.d(TAG, "onAuthenticationHelp");
+ onFingerprintHelp(helpString.toString());
+ }
+
+ @Override
+ public void onAuthenticationSucceeded(FingerprintManager.AuthenticationResult result) {
+ Log.d(TAG, "onAuthenticationSucceeded");
+ preDialogSuccessful();
+ fingerprintAuthenticationCallback = null;
+ }
+
+ @Override
+ public void onAuthenticationFailed() {
+ Log.d(TAG, "onAuthenticationFailed");
+ preDialogError();
+ fingerprintAuthenticationCallback = null;
+ }
+ }
+
+ private void preDialogSuccessful() {
+ try {
+ Locksmith.getInstance().init();
+ } catch (LocksmithCreationException e) {
+ e.printStackTrace();
+ }
+
+ Log.d(TAG, "finishDialogSuccess");
+
+ if (onFingerprintDialogEventListener != null) {
+ onFingerprintDialogEventListener.onFingerprintEvent(FingerprintDialogEvent.SUCCESS);
+ }
+
+ onFingerprintSuccess();
+ }
+
+ // Helpers
+
+ private void preDialogError() {
+ Log.d(TAG, "finishDialogError");
+
+ if (onFingerprintDialogEventListener != null) {
+ onFingerprintDialogEventListener.onFingerprintEvent(FingerprintDialogEvent.ERROR);
+ }
+
+ onFingerprintError();
+ }
+
+ protected void onCancelClicked() {
+ if (onFingerprintDialogEventListener != null) {
+ onFingerprintDialogEventListener.onFingerprintEvent(FingerprintDialogEvent.CANCEL);
+ }
+
+ closeDialog();
+ }
+
+ protected void closeDialog() {
+ Log.d(TAG, "closeDialog");
+ cancelSignal();
+ dismiss();
+ }
+
+ public abstract @LayoutRes
+ int getDialogLayout();
+
+ public abstract void onFingerprintSuccess();
+
+ public abstract void onFingerprintHelp(String help);
+
+ public abstract void onFingerprintError();
+}
diff --git a/locksmith/src/main/java/dk/nodes/locksmith/core/fingerprint/FingerprintDialogBuilder.java b/locksmith/src/main/java/dk/nodes/locksmith/core/fingerprint/FingerprintDialogBuilder.java
new file mode 100644
index 0000000..cf2a787
--- /dev/null
+++ b/locksmith/src/main/java/dk/nodes/locksmith/core/fingerprint/FingerprintDialogBuilder.java
@@ -0,0 +1,55 @@
+package dk.nodes.locksmith.core.fingerprint;
+
+import android.content.Context;
+import android.os.Build;
+import android.support.annotation.RequiresApi;
+
+import dk.nodes.locksmith.core.models.OnFingerprintDialogEventListener;
+
+@RequiresApi(api = Build.VERSION_CODES.M)
+public class FingerprintDialogBuilder {
+ private FingerprintDialog fingerprintDialog;
+
+ public FingerprintDialogBuilder(Context context) {
+ this.fingerprintDialog = new FingerprintDialog(context);
+ }
+
+ public FingerprintDialogBuilder setEventListener(OnFingerprintDialogEventListener onFingerprintDialogEventListener) {
+ fingerprintDialog.onFingerprintDialogEventListener = onFingerprintDialogEventListener;
+ return this;
+ }
+
+ public FingerprintDialogBuilder setCancelText(String text) {
+ fingerprintDialog.cancelButtonText = text;
+ return this;
+ }
+
+ public FingerprintDialogBuilder setSuccessMessage(String message) {
+ fingerprintDialog.successMessageText = message;
+ return this;
+ }
+
+ public FingerprintDialogBuilder setErrorMessage(String message) {
+ fingerprintDialog.errorMessageText = message;
+ return this;
+ }
+
+ public FingerprintDialogBuilder setTitle(String text) {
+ fingerprintDialog.titleText = text;
+ return this;
+ }
+
+ public FingerprintDialogBuilder setSubtitle(String text) {
+ fingerprintDialog.subtitleText = text;
+ return this;
+ }
+
+ public FingerprintDialogBuilder setDescription(String text) {
+ fingerprintDialog.descriptionText = text;
+ return this;
+ }
+
+ public FingerprintDialogBase build() {
+ return fingerprintDialog;
+ }
+}
diff --git a/locksmith/src/main/java/dk/nodes/locksmith/core/models/FingerprintDialogEvent.java b/locksmith/src/main/java/dk/nodes/locksmith/core/models/FingerprintDialogEvent.java
new file mode 100644
index 0000000..1a7cc20
--- /dev/null
+++ b/locksmith/src/main/java/dk/nodes/locksmith/core/models/FingerprintDialogEvent.java
@@ -0,0 +1,32 @@
+package dk.nodes.locksmith.core.models;
+
+public enum FingerprintDialogEvent {
+ /**
+ * Is called when a user cancels the dialog
+ */
+ CANCEL,
+ /**
+ * Is called when a fingerprint is successfully accepted
+ */
+ SUCCESS,
+ /**
+ * Is called when a fingerprint is read but not accepted
+ */
+ ERROR,
+ /**
+ * Is called when the lock screen is not secured by a code/fingerprint
+ */
+ ERROR_SECURE,
+ /**
+ * Is sent when there is no hardware detected¬
+ */
+ ERROR_HARDWARE,
+ /**
+ * Is called when no finger prints are enrolled
+ */
+ ERROR_ENROLLMENT,
+ /**
+ * Is called when the cipher fails to create
+ */
+ ERROR_CIPHER
+}
diff --git a/locksmith/src/main/java/dk/nodes/locksmith/core/models/OnFingerprintDialogEventListener.java b/locksmith/src/main/java/dk/nodes/locksmith/core/models/OnFingerprintDialogEventListener.java
new file mode 100644
index 0000000..db339aa
--- /dev/null
+++ b/locksmith/src/main/java/dk/nodes/locksmith/core/models/OnFingerprintDialogEventListener.java
@@ -0,0 +1,7 @@
+package dk.nodes.locksmith.core.models;
+
+import android.support.annotation.NonNull;
+
+public interface OnFingerprintDialogEventListener {
+ void onFingerprintEvent(@NonNull FingerprintDialogEvent event);
+}