diff --git a/app/src/main/java/me/impy/aegis/AuthActivity.java b/app/src/main/java/me/impy/aegis/AuthActivity.java index dc572dd9..a49202cb 100644 --- a/app/src/main/java/me/impy/aegis/AuthActivity.java +++ b/app/src/main/java/me/impy/aegis/AuthActivity.java @@ -1,13 +1,9 @@ package me.impy.aegis; -import android.Manifest; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; -import android.content.pm.PackageManager; import android.hardware.fingerprint.FingerprintManager; -import android.os.Build; -import android.support.v4.app.ActivityCompat; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; @@ -30,7 +26,7 @@ import me.impy.aegis.crypto.slots.FingerprintSlot; import me.impy.aegis.crypto.slots.PasswordSlot; import me.impy.aegis.crypto.slots.Slot; import me.impy.aegis.crypto.slots.SlotCollection; -import me.impy.aegis.finger.FingerprintUiHelper; +import me.impy.aegis.helpers.FingerprintUiHelper; import me.impy.aegis.helpers.AuthHelper; public class AuthActivity extends AppCompatActivity implements FingerprintUiHelper.Callback, SlotCollectionTask.Callback { @@ -56,23 +52,18 @@ public class AuthActivity extends AppCompatActivity implements FingerprintUiHelp _slots = (SlotCollection) 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 - Context context = getApplicationContext(); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - FingerprintManager manager = (FingerprintManager) context.getSystemService(Context.FINGERPRINT_SERVICE); - if (ActivityCompat.checkSelfPermission(context, Manifest.permission.USE_FINGERPRINT) == PackageManager.PERMISSION_GRANTED && manager.isHardwareDetected()) { - if (_slots.has(FingerprintSlot.class)) { - try { - KeyStoreHandle handle = new KeyStoreHandle(); - if (handle.keyExists()) { - SecretKey key = handle.getKey(); - _fingerCipher = Slot.createCipher(key, Cipher.DECRYPT_MODE); - _fingerHelper = new FingerprintUiHelper(manager, imgFingerprint, textFingerprint, this); - boxFingerprint.setVisibility(View.VISIBLE); - } - } catch (Exception e) { - throw new UndeclaredThrowableException(e); - } + FingerprintManager manager = FingerprintUiHelper.getManager(this); + if (manager != null && _slots.has(FingerprintSlot.class)) { + try { + KeyStoreHandle handle = new KeyStoreHandle(); + if (handle.keyExists()) { + SecretKey key = handle.getKey(); + _fingerCipher = Slot.createCipher(key, Cipher.DECRYPT_MODE); + _fingerHelper = new FingerprintUiHelper(manager, imgFingerprint, textFingerprint, this); + boxFingerprint.setVisibility(View.VISIBLE); } + } catch (Exception e) { + throw new UndeclaredThrowableException(e); } } diff --git a/app/src/main/java/me/impy/aegis/CustomAuthenticatedSlide.java b/app/src/main/java/me/impy/aegis/CustomAuthenticatedSlide.java index 3ec17e3a..1926063f 100644 --- a/app/src/main/java/me/impy/aegis/CustomAuthenticatedSlide.java +++ b/app/src/main/java/me/impy/aegis/CustomAuthenticatedSlide.java @@ -22,10 +22,9 @@ import java.lang.reflect.UndeclaredThrowableException; import javax.crypto.Cipher; import javax.crypto.SecretKey; -import me.impy.aegis.crypto.CryptoUtils; import me.impy.aegis.crypto.KeyStoreHandle; import me.impy.aegis.crypto.slots.Slot; -import me.impy.aegis.finger.FingerprintUiHelper; +import me.impy.aegis.helpers.FingerprintUiHelper; import me.impy.aegis.helpers.AuthHelper; public class CustomAuthenticatedSlide extends Fragment implements FingerprintUiHelper.Callback, ISlidePolicy, ISlideSelectionListener { diff --git a/app/src/main/java/me/impy/aegis/CustomAuthenticationSlide.java b/app/src/main/java/me/impy/aegis/CustomAuthenticationSlide.java index a24c87a9..43ce89b8 100644 --- a/app/src/main/java/me/impy/aegis/CustomAuthenticationSlide.java +++ b/app/src/main/java/me/impy/aegis/CustomAuthenticationSlide.java @@ -1,14 +1,10 @@ package me.impy.aegis; -import android.Manifest; import android.content.Context; import android.content.Intent; -import android.content.pm.PackageManager; import android.hardware.fingerprint.FingerprintManager; -import android.os.Build; import android.os.Bundle; import android.support.design.widget.Snackbar; -import android.support.v4.app.ActivityCompat; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; @@ -19,6 +15,8 @@ import android.widget.TextView; import com.github.paolorotolo.appintro.ISlidePolicy; +import me.impy.aegis.helpers.FingerprintUiHelper; + public class CustomAuthenticationSlide extends Fragment implements ISlidePolicy, RadioGroup.OnCheckedChangeListener { public static final int CRYPT_TYPE_INVALID = 0; public static final int CRYPT_TYPE_NONE = 1; @@ -31,21 +29,18 @@ public class CustomAuthenticationSlide extends Fragment implements ISlidePolicy, @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { final View view = inflater.inflate(R.layout.fragment_authentication_slide, container, false); - final Context context = getContext(); _buttonGroup = view.findViewById(R.id.rg_authenticationMethod); _buttonGroup.setOnCheckedChangeListener(this); onCheckedChanged(_buttonGroup, _buttonGroup.getCheckedRadioButtonId()); // only show the fingerprint option if the api version is new enough, permission is granted and a scanner is found - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - FingerprintManager fingerprintManager = (FingerprintManager) context.getSystemService(Context.FINGERPRINT_SERVICE); - if (ActivityCompat.checkSelfPermission(context, Manifest.permission.USE_FINGERPRINT) == PackageManager.PERMISSION_GRANTED && fingerprintManager.isHardwareDetected()) { - RadioButton button = view.findViewById(R.id.rb_fingerprint); - TextView text = view.findViewById(R.id.text_rb_fingerprint); - button.setVisibility(View.VISIBLE); - text.setVisibility(View.VISIBLE); - } + FingerprintManager manager = FingerprintUiHelper.getManager(getContext()); + if (manager != null) { + RadioButton button = view.findViewById(R.id.rb_fingerprint); + TextView text = view.findViewById(R.id.text_rb_fingerprint); + button.setVisibility(View.VISIBLE); + text.setVisibility(View.VISIBLE); } view.findViewById(R.id.main).setBackgroundColor(_bgColor); diff --git a/app/src/main/java/me/impy/aegis/finger/FingerprintUiHelper.java b/app/src/main/java/me/impy/aegis/helpers/FingerprintUiHelper.java similarity index 89% rename from app/src/main/java/me/impy/aegis/finger/FingerprintUiHelper.java rename to app/src/main/java/me/impy/aegis/helpers/FingerprintUiHelper.java index 97f817c6..5eb7f4df 100644 --- a/app/src/main/java/me/impy/aegis/finger/FingerprintUiHelper.java +++ b/app/src/main/java/me/impy/aegis/helpers/FingerprintUiHelper.java @@ -17,8 +17,10 @@ * limitations under the License */ -package me.impy.aegis.finger; +package me.impy.aegis.helpers; +import android.Manifest; +import android.content.Context; import android.hardware.fingerprint.FingerprintManager; import android.os.Build; import android.os.CancellationSignal; @@ -57,6 +59,18 @@ public class FingerprintUiHelper extends FingerprintManager.AuthenticationCallba mCallback = callback; } + public static FingerprintManager getManager(Context context) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + 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; + } + } + } + return null; + } + public boolean isFingerprintAuthAvailable() { // The line below prevents the false positive inspection from Android Studio // noinspection ResourceType diff --git a/app/src/main/java/me/impy/aegis/helpers/PermissionHelper.java b/app/src/main/java/me/impy/aegis/helpers/PermissionHelper.java index ddc32f54..adbde17a 100644 --- a/app/src/main/java/me/impy/aegis/helpers/PermissionHelper.java +++ b/app/src/main/java/me/impy/aegis/helpers/PermissionHelper.java @@ -1,8 +1,10 @@ package me.impy.aegis.helpers; import android.app.Activity; +import android.content.Context; import android.content.pm.PackageManager; import android.support.v4.app.ActivityCompat; +import android.support.v4.content.ContextCompat; import java.util.ArrayList; import java.util.List; @@ -12,10 +14,14 @@ public class PermissionHelper { } + public static boolean granted(Context context, String permission) { + return ContextCompat.checkSelfPermission(context, permission) == PackageManager.PERMISSION_GRANTED; + } + public static boolean request(Activity activity, int requestCode, String... perms) { List deniedPerms = new ArrayList<>(); for (String permission : perms) { - if (ActivityCompat.checkSelfPermission(activity, permission) == PackageManager.PERMISSION_DENIED) { + if (!granted(activity, permission)) { deniedPerms.add(permission); } }