diff --git a/app/build.gradle b/app/build.gradle
index 784c022e..a82339e4 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -11,9 +11,19 @@ android {
versionName "1.0-beta1"
}
+ lintOptions {
+ abortOnError true
+ disable "MissingTranslation"
+ }
+
testOptions {
unitTests.all {
useJUnitPlatform()
+
+ ignoreFailures false
+ testLogging {
+ events "passed", "skipped", "failed", "standardOut", "standardError"
+ }
}
}
diff --git a/app/src/androidTest/java/com/beemdevelopment/aegis/ApplicationTest.java b/app/src/androidTest/java/com/beemdevelopment/aegis/ApplicationTest.java
deleted file mode 100644
index c666dc56..00000000
--- a/app/src/androidTest/java/com/beemdevelopment/aegis/ApplicationTest.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.beemdevelopment.aegis;
-
-import android.app.Application;
-import android.test.ApplicationTestCase;
-
-/**
- * Testing Fundamentals
- */
-public class ApplicationTest extends ApplicationTestCase {
- public ApplicationTest() {
- super(Application.class);
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/beemdevelopment/aegis/helpers/FingerprintHelper.java b/app/src/main/java/com/beemdevelopment/aegis/helpers/FingerprintHelper.java
index 13833d71..0f377935 100644
--- a/app/src/main/java/com/beemdevelopment/aegis/helpers/FingerprintHelper.java
+++ b/app/src/main/java/com/beemdevelopment/aegis/helpers/FingerprintHelper.java
@@ -5,13 +5,16 @@ import android.content.Context;
import android.hardware.fingerprint.FingerprintManager;
import android.os.Build;
+import androidx.annotation.RequiresApi;
+
public class FingerprintHelper {
private FingerprintHelper() {
}
+ @RequiresApi(api = Build.VERSION_CODES.M)
public static FingerprintManager getManager(Context context) {
- if (isSupported() && PermissionHelper.granted(context, Manifest.permission.USE_FINGERPRINT)) {
+ if (PermissionHelper.granted(context, Manifest.permission.USE_FINGERPRINT)) {
FingerprintManager manager = (FingerprintManager) context.getSystemService(Context.FINGERPRINT_SERVICE);
if (manager != null && manager.isHardwareDetected() && manager.hasEnrolledFingerprints()) {
return manager;
@@ -20,6 +23,11 @@ public class FingerprintHelper {
return null;
}
+ @RequiresApi(api = Build.VERSION_CODES.M)
+ public static boolean isAvailable(Context context) {
+ return getManager(context) != null;
+ }
+
public static boolean isSupported() {
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.M;
}
diff --git a/app/src/main/java/com/beemdevelopment/aegis/ui/AuthActivity.java b/app/src/main/java/com/beemdevelopment/aegis/ui/AuthActivity.java
index defc1bc9..f60a0511 100644
--- a/app/src/main/java/com/beemdevelopment/aegis/ui/AuthActivity.java
+++ b/app/src/main/java/com/beemdevelopment/aegis/ui/AuthActivity.java
@@ -1,5 +1,6 @@
package com.beemdevelopment.aegis.ui;
+import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.hardware.fingerprint.FingerprintManager;
@@ -44,6 +45,7 @@ public class AuthActivity extends AegisActivity implements FingerprintUiHelper.C
private FingerprintManager.CryptoObject _fingerCryptoObj;
@Override
+ @SuppressLint("NewApi")
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_auth);
@@ -71,9 +73,10 @@ public class AuthActivity extends AegisActivity implements FingerprintUiHelper.C
_slots = (SlotList) intent.getSerializableExtra("slots");
// only show the fingerprint controls if the api version is new enough, permission is granted, a scanner is found and a fingerprint slot is found
- FingerprintManager manager = FingerprintHelper.getManager(this);
- if (manager != null && _slots.has(FingerprintSlot.class)) {
+ if (_slots.has(FingerprintSlot.class) && FingerprintHelper.isSupported() && FingerprintHelper.isAvailable(this)) {
boolean invalidated = false;
+ FingerprintManager manager = FingerprintHelper.getManager(this);
+
try {
// find a fingerprint slot with an id that matches an alias in the keystore
for (FingerprintSlot slot : _slots.findAll(FingerprintSlot.class)) {
@@ -148,6 +151,7 @@ public class AuthActivity extends AegisActivity implements FingerprintUiHelper.C
}
@Override
+ @SuppressLint("NewApi")
public void onResume() {
super.onResume();
@@ -157,6 +161,7 @@ public class AuthActivity extends AegisActivity implements FingerprintUiHelper.C
}
@Override
+ @SuppressLint("NewApi")
public void onPause() {
super.onPause();
@@ -166,6 +171,7 @@ public class AuthActivity extends AegisActivity implements FingerprintUiHelper.C
}
@Override
+ @SuppressLint("NewApi")
public void onAuthenticated() {
trySlots(FingerprintSlot.class, _fingerCryptoObj.getCipher());
}
diff --git a/app/src/main/java/com/beemdevelopment/aegis/ui/Dialogs.java b/app/src/main/java/com/beemdevelopment/aegis/ui/Dialogs.java
index f52a535d..aa67dc09 100644
--- a/app/src/main/java/com/beemdevelopment/aegis/ui/Dialogs.java
+++ b/app/src/main/java/com/beemdevelopment/aegis/ui/Dialogs.java
@@ -5,6 +5,7 @@ import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.hardware.fingerprint.FingerprintManager;
+import android.os.Build;
import android.text.Editable;
import android.text.InputType;
import android.text.TextWatcher;
@@ -35,6 +36,7 @@ import java.util.concurrent.atomic.AtomicReference;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
+import androidx.annotation.RequiresApi;
import androidx.annotation.StringRes;
import androidx.appcompat.app.AlertDialog;
@@ -178,6 +180,7 @@ public class Dialogs {
showSecureDialog(dialog);
}
+ @RequiresApi(api = Build.VERSION_CODES.M)
public static void showFingerprintDialog(Activity activity, Dialogs.SlotListener listener) {
View view = activity.getLayoutInflater().inflate(R.layout.dialog_fingerprint, null);
TextView textFingerprint = view.findViewById(R.id.text_fingerprint);
diff --git a/app/src/main/java/com/beemdevelopment/aegis/ui/PreferencesFragment.java b/app/src/main/java/com/beemdevelopment/aegis/ui/PreferencesFragment.java
index 07a3d293..1bdf4d61 100644
--- a/app/src/main/java/com/beemdevelopment/aegis/ui/PreferencesFragment.java
+++ b/app/src/main/java/com/beemdevelopment/aegis/ui/PreferencesFragment.java
@@ -284,7 +284,9 @@ public class PreferencesFragment extends PreferenceFragmentCompat {
SlotList slots = creds.getSlots();
if (!slots.has(FingerprintSlot.class)) {
- Dialogs.showFingerprintDialog(getActivity(), new RegisterFingerprintListener());
+ if (FingerprintHelper.isSupported() && FingerprintHelper.isAvailable(getContext())) {
+ Dialogs.showFingerprintDialog(getActivity(), new RegisterFingerprintListener());
+ }
} else {
// remove the fingerprint slot
FingerprintSlot slot = slots.find(FingerprintSlot.class);
@@ -669,8 +671,9 @@ public class PreferencesFragment extends PreferenceFragmentCompat {
boolean multiPassword = slots.findAll(PasswordSlot.class).size() > 1;
boolean multiFinger = slots.findAll(FingerprintSlot.class).size() > 1;
boolean showSlots = BuildConfig.DEBUG || multiPassword || multiFinger;
+ boolean canUseFinger = FingerprintHelper.isSupported() && FingerprintHelper.isAvailable(getContext());
_setPasswordPreference.setEnabled(!multiPassword);
- _fingerprintPreference.setEnabled(FingerprintHelper.getManager(getContext()) != null && !multiFinger);
+ _fingerprintPreference.setEnabled(canUseFinger && !multiFinger);
_fingerprintPreference.setChecked(slots.has(FingerprintSlot.class), true);
_slotsPreference.setVisible(showSlots);
} else {
diff --git a/app/src/main/java/com/beemdevelopment/aegis/ui/SlotManagerActivity.java b/app/src/main/java/com/beemdevelopment/aegis/ui/SlotManagerActivity.java
index 49f15db1..31367f76 100644
--- a/app/src/main/java/com/beemdevelopment/aegis/ui/SlotManagerActivity.java
+++ b/app/src/main/java/com/beemdevelopment/aegis/ui/SlotManagerActivity.java
@@ -43,7 +43,9 @@ public class SlotManagerActivity extends AegisActivity implements SlotAdapter.Li
bar.setDisplayHomeAsUpEnabled(true);
findViewById(R.id.button_add_fingerprint).setOnClickListener(view -> {
- Dialogs.showFingerprintDialog(this ,this);
+ if (FingerprintHelper.isSupported() && FingerprintHelper.isAvailable(this)) {
+ Dialogs.showFingerprintDialog(this ,this);
+ }
});
findViewById(R.id.button_add_password).setOnClickListener(view -> {
@@ -71,7 +73,7 @@ public class SlotManagerActivity extends AegisActivity implements SlotAdapter.Li
// only show the fingerprint option if we can get an instance of the fingerprint manager
// and if none of the slots in the collection has a matching alias in the keystore
int visibility = View.VISIBLE;
- if (FingerprintHelper.getManager(this) != null) {
+ if (FingerprintHelper.isSupported() && FingerprintHelper.isAvailable(this)) {
try {
KeyStoreHandle keyStore = new KeyStoreHandle();
for (FingerprintSlot slot : _creds.getSlots().findAll(FingerprintSlot.class)) {
diff --git a/app/src/main/java/com/beemdevelopment/aegis/ui/slides/CustomAuthenticatedSlide.java b/app/src/main/java/com/beemdevelopment/aegis/ui/slides/CustomAuthenticatedSlide.java
index 10a26d46..84fc2908 100644
--- a/app/src/main/java/com/beemdevelopment/aegis/ui/slides/CustomAuthenticatedSlide.java
+++ b/app/src/main/java/com/beemdevelopment/aegis/ui/slides/CustomAuthenticatedSlide.java
@@ -1,5 +1,6 @@
package com.beemdevelopment.aegis.ui.slides;
+import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.hardware.fingerprint.FingerprintManager;
@@ -70,6 +71,7 @@ public class CustomAuthenticatedSlide extends Fragment implements FingerprintUiH
return EditTextHelper.getEditTextChars(_textPassword);
}
+ @SuppressLint("NewApi")
public Cipher getFingerCipher() {
return _fingerCryptoObj.getCipher();
}
@@ -83,6 +85,7 @@ public class CustomAuthenticatedSlide extends Fragment implements FingerprintUiH
}
@Override
+ @SuppressLint("NewApi")
public void onSlideSelected() {
Intent intent = getActivity().getIntent();
_cryptType = intent.getIntExtra("cryptType", CustomAuthenticationSlide.CRYPT_TYPE_INVALID);
@@ -124,6 +127,7 @@ public class CustomAuthenticatedSlide extends Fragment implements FingerprintUiH
}
@Override
+ @SuppressLint("NewApi")
public void onSlideDeselected() {
if (_fingerHelper != null) {
_fingerAuthenticated = false;
diff --git a/app/src/main/java/com/beemdevelopment/aegis/ui/slides/CustomAuthenticationSlide.java b/app/src/main/java/com/beemdevelopment/aegis/ui/slides/CustomAuthenticationSlide.java
index a64d6a07..85d8f0b4 100644
--- a/app/src/main/java/com/beemdevelopment/aegis/ui/slides/CustomAuthenticationSlide.java
+++ b/app/src/main/java/com/beemdevelopment/aegis/ui/slides/CustomAuthenticationSlide.java
@@ -1,5 +1,6 @@
package com.beemdevelopment.aegis.ui.slides;
+import android.annotation.SuppressLint;
import android.content.Intent;
import android.hardware.fingerprint.FingerprintManager;
import android.os.Bundle;
@@ -34,8 +35,7 @@ public class CustomAuthenticationSlide extends Fragment implements ISlidePolicy,
onCheckedChanged(_buttonGroup, _buttonGroup.getCheckedRadioButtonId());
// only enable the fingerprint option if the api version is new enough, permission is granted and a scanner is found
- FingerprintManager manager = FingerprintHelper.getManager(getContext());
- if (manager != null) {
+ if (FingerprintHelper.isSupported() && FingerprintHelper.isAvailable(getContext())) {
RadioButton button = view.findViewById(R.id.rb_fingerprint);
TextView text = view.findViewById(R.id.text_rb_fingerprint);
button.setEnabled(true);