mirror of
https://github.com/beemdevelopment/Aegis.git
synced 2025-04-22 14:59:14 +00:00
Still a WIP. This change was made to allow us to use Android's SecretKey API. Which in turn allows us to store our secret keys in the Android KeyStore. You can read about the database file format here: doc/db.md
150 lines
No EOL
5.1 KiB
Java
150 lines
No EOL
5.1 KiB
Java
package me.impy.aegis.finger;
|
|
|
|
/*
|
|
* 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
|
|
*/
|
|
|
|
import android.hardware.fingerprint.FingerprintManager;
|
|
import android.os.Build;
|
|
import android.os.CancellationSignal;
|
|
import android.support.annotation.RequiresApi;
|
|
import android.widget.ImageView;
|
|
import android.widget.TextView;
|
|
|
|
import me.impy.aegis.R;
|
|
|
|
/**
|
|
* Small helper class to manage text/icon around fingerprint authentication UI.
|
|
*/
|
|
@RequiresApi(api = Build.VERSION_CODES.M)
|
|
public class FingerprintUiHelper extends FingerprintManager.AuthenticationCallback {
|
|
|
|
private static final long ERROR_TIMEOUT_MILLIS = 1600;
|
|
private static final long SUCCESS_DELAY_MILLIS = 1300;
|
|
|
|
private final FingerprintManager mFingerprintManager;
|
|
private final ImageView mIcon;
|
|
private final TextView mErrorTextView;
|
|
private final Callback mCallback;
|
|
private CancellationSignal mCancellationSignal;
|
|
|
|
private boolean mSelfCancelled;
|
|
|
|
/**
|
|
* Constructor for {@link FingerprintUiHelper}.
|
|
*/
|
|
FingerprintUiHelper(FingerprintManager fingerprintManager,
|
|
ImageView icon, TextView errorTextView, Callback callback) {
|
|
mFingerprintManager = fingerprintManager;
|
|
mIcon = icon;
|
|
mErrorTextView = errorTextView;
|
|
mCallback = callback;
|
|
}
|
|
|
|
public boolean isFingerprintAuthAvailable() {
|
|
// The line below prevents the false positive inspection from Android Studio
|
|
// noinspection ResourceType
|
|
return mFingerprintManager.isHardwareDetected()
|
|
&& mFingerprintManager.hasEnrolledFingerprints();
|
|
}
|
|
|
|
public void startListening(FingerprintManager.CryptoObject cryptoObject) {
|
|
if (!isFingerprintAuthAvailable()) {
|
|
return;
|
|
}
|
|
mCancellationSignal = new CancellationSignal();
|
|
mSelfCancelled = false;
|
|
// The line below prevents the false positive inspection from Android Studio
|
|
// noinspection ResourceType
|
|
mFingerprintManager
|
|
.authenticate(cryptoObject, mCancellationSignal, 0 /* flags */, this, null);
|
|
mIcon.setImageResource(R.drawable.ic_fp_40px);
|
|
}
|
|
|
|
public void stopListening() {
|
|
if (mCancellationSignal != null) {
|
|
mSelfCancelled = true;
|
|
mCancellationSignal.cancel();
|
|
mCancellationSignal = null;
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onAuthenticationError(int errMsgId, CharSequence errString) {
|
|
if (!mSelfCancelled) {
|
|
showError(errString);
|
|
mIcon.postDelayed(new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
mCallback.onError();
|
|
}
|
|
}, ERROR_TIMEOUT_MILLIS);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onAuthenticationHelp(int helpMsgId, CharSequence helpString) {
|
|
showError(helpString);
|
|
}
|
|
|
|
@Override
|
|
public void onAuthenticationFailed() {
|
|
showError(mIcon.getResources().getString(
|
|
R.string.fingerprint_not_recognized));
|
|
}
|
|
|
|
@Override
|
|
public void onAuthenticationSucceeded(FingerprintManager.AuthenticationResult result) {
|
|
mErrorTextView.removeCallbacks(mResetErrorTextRunnable);
|
|
mIcon.setImageResource(R.drawable.ic_fingerprint_success);
|
|
mErrorTextView.setTextColor(
|
|
mErrorTextView.getResources().getColor(R.color.success_color, null));
|
|
mErrorTextView.setText(
|
|
mErrorTextView.getResources().getString(R.string.fingerprint_success));
|
|
mIcon.postDelayed(new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
mCallback.onAuthenticated();
|
|
}
|
|
}, SUCCESS_DELAY_MILLIS);
|
|
}
|
|
|
|
private void showError(CharSequence error) {
|
|
mIcon.setImageResource(R.drawable.ic_fingerprint_error);
|
|
mErrorTextView.setText(error);
|
|
mErrorTextView.setTextColor(
|
|
mErrorTextView.getResources().getColor(R.color.warning_color, null));
|
|
mErrorTextView.removeCallbacks(mResetErrorTextRunnable);
|
|
mErrorTextView.postDelayed(mResetErrorTextRunnable, ERROR_TIMEOUT_MILLIS);
|
|
}
|
|
|
|
private Runnable mResetErrorTextRunnable = new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
mErrorTextView.setTextColor(
|
|
mErrorTextView.getResources().getColor(R.color.hint_color, null));
|
|
mErrorTextView.setText(
|
|
mErrorTextView.getResources().getString(R.string.fingerprint_hint));
|
|
mIcon.setImageResource(R.drawable.ic_fp_40px);
|
|
}
|
|
};
|
|
|
|
public interface Callback {
|
|
|
|
void onAuthenticated();
|
|
|
|
void onError();
|
|
}
|
|
} |