fix Fingerprint issue with older Samsung devices (IsHardwareDetected=false). Now fallback correctly to Samsung Fingerprint API.

This commit is contained in:
Philipp Crocoll 2016-08-21 03:32:57 +02:00
parent c1da91e0ef
commit 199f900f4b
2 changed files with 24 additions and 4 deletions

View File

@ -126,9 +126,7 @@ namespace keepass2android
TrySetupSamsung(); TrySetupSamsung();
} }
FindViewById(Resource.Id.container_fingerprint_unlock).Visibility = _samsungFingerprint == null
? ViewStates.Visible
: ViewStates.Gone;
} }
private bool TrySetupSamsung() private bool TrySetupSamsung()
@ -142,6 +140,9 @@ namespace keepass2android
SetError(Resource.String.fingerprint_no_enrolled); SetError(Resource.String.fingerprint_no_enrolled);
} }
ShowRadioButtons(); ShowRadioButtons();
FindViewById(Resource.Id.container_fingerprint_unlock).Visibility = _samsungFingerprint == null
? ViewStates.Visible
: ViewStates.Gone;
return true; return true;
} }
catch (Exception) catch (Exception)

View File

@ -140,7 +140,10 @@ namespace keepass2android
RegisterReceiver(_intentReceiver, filter); RegisterReceiver(_intentReceiver, filter);
if ((int) Build.VERSION.SdkInt >= 23) if ((int) Build.VERSION.SdkInt >= 23)
RequestPermissions(new[] {Manifest.Permission.UseFingerprint}, FingerprintPermissionRequestCode); {
Kp2aLog.Log("requesting fingerprint permission");
RequestPermissions(new[] { Manifest.Permission.UseFingerprint }, FingerprintPermissionRequestCode);
}
else else
{ {
@ -157,6 +160,9 @@ namespace keepass2android
public override void OnRequestPermissionsResult(int requestCode, string[] permissions, Permission[] grantResults) public override void OnRequestPermissionsResult(int requestCode, string[] permissions, Permission[] grantResults)
{ {
Kp2aLog.Log("OnRequestPermissionsResult " + (requestCode == FingerprintPermissionRequestCode) +
((grantResults.Length > 0) && (grantResults[0] == Permission.Granted)));
if (requestCode == FingerprintPermissionRequestCode && grantResults[0] == Permission.Granted) if (requestCode == FingerprintPermissionRequestCode && grantResults[0] == Permission.Granted)
{ {
var btn = FindViewById<ImageButton>(Resource.Id.fingerprintbtn); var btn = FindViewById<ImageButton>(Resource.Id.fingerprintbtn);
@ -169,11 +175,13 @@ namespace keepass2android
b.Show(); b.Show();
}; };
_fingerprintPermissionGranted = true; _fingerprintPermissionGranted = true;
Kp2aLog.Log("_fingerprintPermissionGranted");
} }
} }
public void OnFingerprintError(string message) public void OnFingerprintError(string message)
{ {
Kp2aLog.Log("fingerprint error: " + message);
var btn = FindViewById<ImageButton>(Resource.Id.fingerprintbtn); var btn = FindViewById<ImageButton>(Resource.Id.fingerprintbtn);
btn.SetImageResource(Resource.Drawable.ic_fingerprint_error); btn.SetImageResource(Resource.Drawable.ic_fingerprint_error);
@ -187,6 +195,7 @@ namespace keepass2android
public void OnFingerprintAuthSucceeded() public void OnFingerprintAuthSucceeded()
{ {
Kp2aLog.Log("OnFingerprintAuthSucceeded");
_fingerprintIdentifier.StopListening(); _fingerprintIdentifier.StopListening();
var btn = FindViewById<ImageButton>(Resource.Id.fingerprintbtn); var btn = FindViewById<ImageButton>(Resource.Id.fingerprintbtn);
@ -206,6 +215,7 @@ namespace keepass2android
} }
private void InitFingerprintUnlock() private void InitFingerprintUnlock()
{ {
Kp2aLog.Log("InitFingerprintUnlock");
var btn = FindViewById<ImageButton>(Resource.Id.fingerprintbtn); var btn = FindViewById<ImageButton>(Resource.Id.fingerprintbtn);
try try
{ {
@ -221,23 +231,28 @@ namespace keepass2android
if (_fingerprintPermissionGranted) if (_fingerprintPermissionGranted)
{ {
FingerprintModule fpModule = new FingerprintModule(this); FingerprintModule fpModule = new FingerprintModule(this);
Kp2aLog.Log("fpModule.FingerprintManager.IsHardwareDetected=" + fpModule.FingerprintManager.IsHardwareDetected);
if (fpModule.FingerprintManager.IsHardwareDetected) //see FingerprintSetupActivity if (fpModule.FingerprintManager.IsHardwareDetected) //see FingerprintSetupActivity
_fingerprintIdentifier = new FingerprintDecryption(fpModule, App.Kp2a.GetDb().CurrentFingerprintPrefKey, this, _fingerprintIdentifier = new FingerprintDecryption(fpModule, App.Kp2a.GetDb().CurrentFingerprintPrefKey, this,
App.Kp2a.GetDb().CurrentFingerprintPrefKey); App.Kp2a.GetDb().CurrentFingerprintPrefKey);
else _fingerprintIdentifier = null; //force re-init Samsung
} }
if (_fingerprintIdentifier == null) if (_fingerprintIdentifier == null)
{ {
try try
{ {
Kp2aLog.Log("trying Samsung Fingerprint API...");
_fingerprintIdentifier = new FingerprintSamsungIdentifier(this); _fingerprintIdentifier = new FingerprintSamsungIdentifier(this);
btn.Click += (sender, args) => btn.Click += (sender, args) =>
{ {
if (_fingerprintIdentifier.Init()) if (_fingerprintIdentifier.Init())
_fingerprintIdentifier.StartListening(this, this); _fingerprintIdentifier.StartListening(this, this);
}; };
Kp2aLog.Log("trying Samsung Fingerprint API...Seems to work!");
} }
catch (Exception) catch (Exception)
{ {
Kp2aLog.Log("trying Samsung Fingerprint API...failed.");
FindViewById<ImageButton>(Resource.Id.fingerprintbtn).Visibility = ViewStates.Gone; FindViewById<ImageButton>(Resource.Id.fingerprintbtn).Visibility = ViewStates.Gone;
return; return;
} }
@ -246,11 +261,13 @@ namespace keepass2android
if (_fingerprintIdentifier.Init()) if (_fingerprintIdentifier.Init())
{ {
Kp2aLog.Log("successfully initialized fingerprint.");
btn.SetImageResource(Resource.Drawable.ic_fp_40px); btn.SetImageResource(Resource.Drawable.ic_fp_40px);
_fingerprintIdentifier.StartListening(this, this); _fingerprintIdentifier.StartListening(this, this);
} }
else else
{ {
Kp2aLog.Log("failed to initialize fingerprint.");
//key invalidated permanently //key invalidated permanently
btn.SetImageResource(Resource.Drawable.ic_fingerprint_error); btn.SetImageResource(Resource.Drawable.ic_fingerprint_error);
btn.Tag = GetString(Resource.String.fingerprint_unlock_failed); btn.Tag = GetString(Resource.String.fingerprint_unlock_failed);
@ -261,6 +278,7 @@ namespace keepass2android
} }
catch (Exception e) catch (Exception e)
{ {
Kp2aLog.Log("Error initializing Fingerprint Unlock: " + e);
btn.SetImageResource(Resource.Drawable.ic_fingerprint_error); btn.SetImageResource(Resource.Drawable.ic_fingerprint_error);
btn.Tag = "Error initializing Fingerprint Unlock: " + e; btn.Tag = "Error initializing Fingerprint Unlock: " + e;
@ -335,6 +353,7 @@ namespace keepass2android
base.OnPause(); base.OnPause();
if (_fingerprintIdentifier != null) if (_fingerprintIdentifier != null)
{ {
Kp2aLog.Log("FP: Stop listening");
_fingerprintIdentifier.StopListening(); _fingerprintIdentifier.StopListening();
} }
} }