2017-08-13 23:38:38 +02:00
// This file was originally taken from https://github.com/googlesamples/android-FingerprintDialog/blob/2feb02945ae220ebd1bc2c2b620a1d43e30daea8/Application/src/main/java/com/example/android/fingerprintdialog/FingerprintUiHelper.java
// It has been modified to suit Aegis' needs
2016-11-13 18:21:00 +01:00
/ *
* 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
* /
2017-12-23 18:26:57 +01:00
package me.impy.aegis.helpers ;
2017-08-13 23:38:38 +02:00
2016-11-13 18:21:00 +01:00
import android.hardware.fingerprint.FingerprintManager ;
import android.os.Build ;
import android.os.CancellationSignal ;
import android.support.annotation.RequiresApi ;
import android.widget.TextView ;
2017-08-19 16:48:57 +02:00
import com.mattprecious.swirl.SwirlView ;
2016-11-13 18:21:00 +01:00
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 ;
2017-08-19 16:56:14 +02:00
private static final long SUCCESS_DELAY_MILLIS = 100 ;
2016-11-13 18:21:00 +01:00
private final FingerprintManager mFingerprintManager ;
2017-08-19 16:48:57 +02:00
private final SwirlView mIcon ;
2016-11-13 18:21:00 +01:00
private final TextView mErrorTextView ;
private final Callback mCallback ;
private CancellationSignal mCancellationSignal ;
private boolean mSelfCancelled ;
/ * *
* Constructor for { @link FingerprintUiHelper } .
* /
2017-08-12 14:27:45 +02:00
public FingerprintUiHelper ( FingerprintManager fingerprintManager ,
2017-08-19 16:48:57 +02:00
SwirlView icon , TextView errorTextView , Callback callback ) {
2016-11-13 18:21:00 +01:00
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 ) ;
2017-08-19 16:48:57 +02:00
mIcon . setState ( SwirlView . State . ON ) ;
2016-11-13 18:21:00 +01:00
}
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 ) ;
2017-08-19 16:48:57 +02:00
mIcon . setState ( SwirlView . State . OFF ) ;
2016-11-13 18:21:00 +01:00
mErrorTextView . setText (
mErrorTextView . getResources ( ) . getString ( R . string . fingerprint_success ) ) ;
mIcon . postDelayed ( new Runnable ( ) {
@Override
public void run ( ) {
mCallback . onAuthenticated ( ) ;
}
} , SUCCESS_DELAY_MILLIS ) ;
2017-08-19 16:56:14 +02:00
// ugly hack to keep the fingerprint icon visible while also giving visual feedback of success to the user
mIcon . postDelayed ( new Runnable ( ) {
@Override
public void run ( ) {
mIcon . setState ( SwirlView . State . ON ) ;
}
} , 500 ) ;
2016-11-13 18:21:00 +01:00
}
private void showError ( CharSequence error ) {
2017-08-19 16:48:57 +02:00
mIcon . setState ( SwirlView . State . ERROR ) ;
2016-11-13 18:21:00 +01:00
mErrorTextView . setText ( error ) ;
mErrorTextView . removeCallbacks ( mResetErrorTextRunnable ) ;
mErrorTextView . postDelayed ( mResetErrorTextRunnable , ERROR_TIMEOUT_MILLIS ) ;
}
private Runnable mResetErrorTextRunnable = new Runnable ( ) {
@Override
public void run ( ) {
mErrorTextView . setText (
mErrorTextView . getResources ( ) . getString ( R . string . fingerprint_hint ) ) ;
2017-08-19 16:48:57 +02:00
mIcon . setState ( SwirlView . State . ON ) ;
2016-11-13 18:21:00 +01:00
}
} ;
public interface Callback {
void onAuthenticated ( ) ;
void onError ( ) ;
}
2017-08-13 23:38:38 +02:00
}