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);