From 37e80f60d16c51812c99aa44766c80e710aa9f70 Mon Sep 17 00:00:00 2001 From: MrLetsplay Date: Tue, 27 Jun 2023 21:42:06 +0200 Subject: [PATCH] Set FLAG_SECURE, Add biometric lock setting --- .../cringe_authenticator/MainActivity.java | 24 ++++++++++++------- .../fragment/SettingsFragment.java | 3 +++ .../grouplist/GroupListAdapter.java | 1 - .../scanner/QRScannerActivity.java | 3 +++ .../util/SettingsUtil.java | 9 +++++++ app/src/main/res/layout/fragment_settings.xml | 7 +++++- 6 files changed, 37 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/cringe_studios/cringe_authenticator/MainActivity.java b/app/src/main/java/com/cringe_studios/cringe_authenticator/MainActivity.java index c17405d..47ffdc3 100644 --- a/app/src/main/java/com/cringe_studios/cringe_authenticator/MainActivity.java +++ b/app/src/main/java/com/cringe_studios/cringe_authenticator/MainActivity.java @@ -1,10 +1,14 @@ package com.cringe_studios.cringe_authenticator; +import static androidx.biometric.BiometricManager.Authenticators.BIOMETRIC_STRONG; +import static androidx.biometric.BiometricManager.Authenticators.DEVICE_CREDENTIAL; + import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; +import android.view.WindowManager; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Button; @@ -46,6 +50,8 @@ public class MainActivity extends AppCompatActivity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE); + Integer themeID = SettingsUtil.THEMES.get(SettingsUtil.getTheme(this)); if(themeID != null) { setTheme(themeID); @@ -66,15 +72,17 @@ public class MainActivity extends AppCompatActivity { } }); - /*BiometricPrompt.PromptInfo info = new BiometricPrompt.PromptInfo.Builder() - .setTitle("Biometric login for my app") - .setSubtitle("Log in using your biometric credential") - .setAllowedAuthenticators(BIOMETRIC_STRONG | DEVICE_CREDENTIAL) - .build(); + if(SettingsUtil.isBiometricLock(this)) { + BiometricPrompt.PromptInfo info = new BiometricPrompt.PromptInfo.Builder() + .setTitle("Cringe Authenticator") + .setSubtitle("Unlock the authenticator") + .setAllowedAuthenticators(BIOMETRIC_STRONG | DEVICE_CREDENTIAL) + .build(); - prompt.authenticate(info);*/ - - launchApp(); + prompt.authenticate(info); + }else { + launchApp(); + } startQRCodeScan = registerForActivityResult(new QRScannerContract(), obj -> { if(obj == null) return; // Cancelled diff --git a/app/src/main/java/com/cringe_studios/cringe_authenticator/fragment/SettingsFragment.java b/app/src/main/java/com/cringe_studios/cringe_authenticator/fragment/SettingsFragment.java index cddc2ed..6821c61 100644 --- a/app/src/main/java/com/cringe_studios/cringe_authenticator/fragment/SettingsFragment.java +++ b/app/src/main/java/com/cringe_studios/cringe_authenticator/fragment/SettingsFragment.java @@ -31,6 +31,9 @@ public class SettingsFragment extends NamedFragment { binding.settingsEnableIntroVideo.setChecked(SettingsUtil.isIntroVideoEnabled(requireContext())); binding.settingsEnableIntroVideo.setOnCheckedChangeListener((view, checked) -> SettingsUtil.setEnableIntroVideo(requireContext(), checked)); + binding.settingsBiometricLock.setChecked(SettingsUtil.isBiometricLock(requireContext())); + binding.settingsBiometricLock.setOnCheckedChangeListener((view, checked) -> SettingsUtil.setBiometricLock(requireContext(), checked)); + binding.settingsTheme.setAdapter(new ArrayAdapter<>(getContext(), android.R.layout.simple_list_item_1, SettingsUtil.THEME_NAMES.toArray(new String[0]))); binding.settingsTheme.setSelection(SettingsUtil.THEME_NAMES.indexOf(SettingsUtil.getTheme(requireContext()))); binding.settingsTheme.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { diff --git a/app/src/main/java/com/cringe_studios/cringe_authenticator/grouplist/GroupListAdapter.java b/app/src/main/java/com/cringe_studios/cringe_authenticator/grouplist/GroupListAdapter.java index 9f3ec24..18d178b 100644 --- a/app/src/main/java/com/cringe_studios/cringe_authenticator/grouplist/GroupListAdapter.java +++ b/app/src/main/java/com/cringe_studios/cringe_authenticator/grouplist/GroupListAdapter.java @@ -61,7 +61,6 @@ public class GroupListAdapter extends RecyclerView.Adapter { .setNegativeButton("No", (dialog, which) -> {}) .show(); // TODO: better method? - // TODO: actually delete return true; }); } diff --git a/app/src/main/java/com/cringe_studios/cringe_authenticator/scanner/QRScannerActivity.java b/app/src/main/java/com/cringe_studios/cringe_authenticator/scanner/QRScannerActivity.java index bb0dff2..3029b16 100644 --- a/app/src/main/java/com/cringe_studios/cringe_authenticator/scanner/QRScannerActivity.java +++ b/app/src/main/java/com/cringe_studios/cringe_authenticator/scanner/QRScannerActivity.java @@ -9,6 +9,7 @@ import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.view.MotionEvent; +import android.view.WindowManager; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -51,6 +52,8 @@ public class QRScannerActivity extends AppCompatActivity { protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); + getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { requestPermissions(new String[] {Manifest.permission.CAMERA}, 1234); } diff --git a/app/src/main/java/com/cringe_studios/cringe_authenticator/util/SettingsUtil.java b/app/src/main/java/com/cringe_studios/cringe_authenticator/util/SettingsUtil.java index 2dbbc92..9a6cd51 100644 --- a/app/src/main/java/com/cringe_studios/cringe_authenticator/util/SettingsUtil.java +++ b/app/src/main/java/com/cringe_studios/cringe_authenticator/util/SettingsUtil.java @@ -91,6 +91,15 @@ public class SettingsUtil { return ctx.getSharedPreferences(GENERAL_PREFS_NAME, Context.MODE_PRIVATE).getBoolean("enableIntroVideo", true); } + public static void setBiometricLock(Context ctx, boolean biometricLock) { + SharedPreferences prefs = ctx.getSharedPreferences(GENERAL_PREFS_NAME, Context.MODE_PRIVATE); + prefs.edit().putBoolean("biometricLock", biometricLock).apply(); + } + + public static boolean isBiometricLock(Context ctx) { + return ctx.getSharedPreferences(GENERAL_PREFS_NAME, Context.MODE_PRIVATE).getBoolean("biometricLock", true); + } + public static void setTheme(Context ctx, String theme) { SharedPreferences prefs = ctx.getSharedPreferences(GENERAL_PREFS_NAME, Context.MODE_PRIVATE); prefs.edit().putString("theme", theme).apply(); diff --git a/app/src/main/res/layout/fragment_settings.xml b/app/src/main/res/layout/fragment_settings.xml index 4de1696..7dec78d 100644 --- a/app/src/main/res/layout/fragment_settings.xml +++ b/app/src/main/res/layout/fragment_settings.xml @@ -1,6 +1,5 @@ + +