Fix biometric lock on devices without biometric data

This commit is contained in:
MrLetsplay 2023-06-29 22:30:49 +02:00
parent 9e9e02cb01
commit 0153f72aaa
Signed by: mr
SSH Key Fingerprint: SHA256:92jBH80vpXyaZHjaIl47pjRq+Yt7XGTArqQg1V7hSqg
6 changed files with 31 additions and 22 deletions

View File

@ -4,7 +4,6 @@ import static androidx.biometric.BiometricManager.Authenticators.BIOMETRIC_STRON
import static androidx.biometric.BiometricManager.Authenticators.DEVICE_CREDENTIAL; import static androidx.biometric.BiometricManager.Authenticators.DEVICE_CREDENTIAL;
import android.os.Bundle; import android.os.Bundle;
import android.util.Log;
import android.view.Menu; import android.view.Menu;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
@ -19,6 +18,7 @@ import androidx.activity.result.ActivityResultLauncher;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
import androidx.biometric.BiometricManager;
import androidx.biometric.BiometricPrompt; import androidx.biometric.BiometricPrompt;
import androidx.core.content.ContextCompat; import androidx.core.content.ContextCompat;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
@ -27,7 +27,7 @@ import com.cringe_studios.cringe_authenticator.databinding.ActivityMainBinding;
import com.cringe_studios.cringe_authenticator.databinding.DialogInputCodeChoiceBinding; import com.cringe_studios.cringe_authenticator.databinding.DialogInputCodeChoiceBinding;
import com.cringe_studios.cringe_authenticator.databinding.DialogInputCodeHotpBinding; import com.cringe_studios.cringe_authenticator.databinding.DialogInputCodeHotpBinding;
import com.cringe_studios.cringe_authenticator.databinding.DialogInputCodeTotpBinding; import com.cringe_studios.cringe_authenticator.databinding.DialogInputCodeTotpBinding;
import com.cringe_studios.cringe_authenticator.fragment.DynamicFragment; import com.cringe_studios.cringe_authenticator.fragment.GroupFragment;
import com.cringe_studios.cringe_authenticator.fragment.HomeFragment; import com.cringe_studios.cringe_authenticator.fragment.HomeFragment;
import com.cringe_studios.cringe_authenticator.fragment.MenuFragment; import com.cringe_studios.cringe_authenticator.fragment.MenuFragment;
import com.cringe_studios.cringe_authenticator.fragment.SettingsFragment; import com.cringe_studios.cringe_authenticator.fragment.SettingsFragment;
@ -72,7 +72,7 @@ public class MainActivity extends AppCompatActivity {
} }
}); });
if(SettingsUtil.isBiometricLock(this)) { if(SettingsUtil.isBiometricLock(this) && BiometricManager.from(this).canAuthenticate(BIOMETRIC_STRONG | DEVICE_CREDENTIAL) == BiometricManager.BIOMETRIC_SUCCESS) {
BiometricPrompt.PromptInfo info = new BiometricPrompt.PromptInfo.Builder() BiometricPrompt.PromptInfo info = new BiometricPrompt.PromptInfo.Builder()
.setTitle("Cringe Authenticator") .setTitle("Cringe Authenticator")
.setSubtitle("Unlock the authenticator") .setSubtitle("Unlock the authenticator")
@ -93,11 +93,10 @@ public class MainActivity extends AppCompatActivity {
} }
Fragment fragment = NavigationUtil.getCurrentFragment(this); Fragment fragment = NavigationUtil.getCurrentFragment(this);
if(fragment instanceof DynamicFragment) { if(fragment instanceof GroupFragment) {
DynamicFragment frag = (DynamicFragment) fragment; GroupFragment frag = (GroupFragment) fragment;
frag.addOTP(obj.getData()); frag.addOTP(obj.getData());
} }
Log.i("AMOGUS", "Actually got something bruh" + obj);
}); });
} }
@ -198,7 +197,7 @@ public class MainActivity extends AppCompatActivity {
binding.inputDigits.setAdapter(new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, new Integer[]{6, 7, 8, 9, 10, 11, 12})); binding.inputDigits.setAdapter(new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, new Integer[]{6, 7, 8, 9, 10, 11, 12}));
showCodeDialog(binding.getRoot(), () -> { showCodeDialog(binding.getRoot(), () -> {
Fragment fragment = NavigationUtil.getCurrentFragment(this); Fragment fragment = NavigationUtil.getCurrentFragment(this);
if(!(fragment instanceof DynamicFragment)) return true; if(!(fragment instanceof GroupFragment)) return true;
try { try {
String name = binding.inputName.getText().toString(); String name = binding.inputName.getText().toString();
@ -216,7 +215,7 @@ public class MainActivity extends AppCompatActivity {
return false; return false;
} }
((DynamicFragment) fragment).addOTP(data); ((GroupFragment) fragment).addOTP(data);
return true; return true;
}catch(NumberFormatException e) { }catch(NumberFormatException e) {
showErrorDialog("Invalid number entered"); showErrorDialog("Invalid number entered");
@ -231,7 +230,7 @@ public class MainActivity extends AppCompatActivity {
binding.inputDigits.setAdapter(new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, new Integer[]{6, 7, 8, 9, 10, 11, 12})); binding.inputDigits.setAdapter(new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, new Integer[]{6, 7, 8, 9, 10, 11, 12}));
showCodeDialog(binding.getRoot(), () -> { showCodeDialog(binding.getRoot(), () -> {
Fragment fragment = NavigationUtil.getCurrentFragment(this); Fragment fragment = NavigationUtil.getCurrentFragment(this);
if(!(fragment instanceof DynamicFragment)) return true; if(!(fragment instanceof GroupFragment)) return true;
try { try {
String name = binding.inputName.getText().toString(); String name = binding.inputName.getText().toString();
@ -249,7 +248,7 @@ public class MainActivity extends AppCompatActivity {
return false; return false;
} }
((DynamicFragment) fragment).addOTP(data); ((GroupFragment) fragment).addOTP(data);
return true; return true;
}catch(NumberFormatException e) { }catch(NumberFormatException e) {
showErrorDialog("Invalid number entered"); showErrorDialog("Invalid number entered");

View File

@ -11,7 +11,7 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import com.cringe_studios.cringe_authenticator.OTPData; import com.cringe_studios.cringe_authenticator.OTPData;
import com.cringe_studios.cringe_authenticator.databinding.FragmentDynamicBinding; import com.cringe_studios.cringe_authenticator.databinding.FragmentGroupBinding;
import com.cringe_studios.cringe_authenticator.otplist.OTPListAdapter; import com.cringe_studios.cringe_authenticator.otplist.OTPListAdapter;
import com.cringe_studios.cringe_authenticator.otplist.OTPListItem; import com.cringe_studios.cringe_authenticator.otplist.OTPListItem;
import com.cringe_studios.cringe_authenticator.util.FabUtil; import com.cringe_studios.cringe_authenticator.util.FabUtil;
@ -20,13 +20,13 @@ import com.cringe_studios.cringe_authenticator_library.OTPType;
import java.util.List; import java.util.List;
public class DynamicFragment extends NamedFragment { public class GroupFragment extends NamedFragment {
public static final String BUNDLE_GROUP = "group"; public static final String BUNDLE_GROUP = "group";
private String groupName; private String groupName;
private FragmentDynamicBinding binding; private FragmentGroupBinding binding;
private Handler handler; private Handler handler;
@ -47,9 +47,9 @@ public class DynamicFragment extends NamedFragment {
@Nullable @Nullable
@Override @Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
binding = FragmentDynamicBinding.inflate(inflater, container, false); binding = FragmentGroupBinding.inflate(inflater, container, false);
groupName = requireArguments().getString(DynamicFragment.BUNDLE_GROUP); groupName = requireArguments().getString(GroupFragment.BUNDLE_GROUP);
FabUtil.showFabs(requireActivity()); FabUtil.showFabs(requireActivity());

View File

@ -35,8 +35,8 @@ public class MenuFragment extends NamedFragment {
groupListAdapter = new GroupListAdapter(requireContext(), group -> { groupListAdapter = new GroupListAdapter(requireContext(), group -> {
Bundle bundle = new Bundle(); Bundle bundle = new Bundle();
bundle.putString(DynamicFragment.BUNDLE_GROUP, group); bundle.putString(GroupFragment.BUNDLE_GROUP, group);
NavigationUtil.navigate(this, DynamicFragment.class, bundle); NavigationUtil.navigate(this, GroupFragment.class, bundle);
}, this::removeGroup); }, this::removeGroup);
binding.menuItems.setAdapter(groupListAdapter); binding.menuItems.setAdapter(groupListAdapter);

View File

@ -1,5 +1,8 @@
package com.cringe_studios.cringe_authenticator.fragment; package com.cringe_studios.cringe_authenticator.fragment;
import static androidx.biometric.BiometricManager.Authenticators.BIOMETRIC_STRONG;
import static androidx.biometric.BiometricManager.Authenticators.DEVICE_CREDENTIAL;
import android.os.Bundle; import android.os.Bundle;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
@ -9,6 +12,7 @@ import android.widget.ArrayAdapter;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.biometric.BiometricManager;
import com.cringe_studios.cringe_authenticator.databinding.FragmentSettingsBinding; import com.cringe_studios.cringe_authenticator.databinding.FragmentSettingsBinding;
import com.cringe_studios.cringe_authenticator.util.FabUtil; import com.cringe_studios.cringe_authenticator.util.FabUtil;
@ -31,8 +35,14 @@ public class SettingsFragment extends NamedFragment {
binding.settingsEnableIntroVideo.setChecked(SettingsUtil.isIntroVideoEnabled(requireContext())); binding.settingsEnableIntroVideo.setChecked(SettingsUtil.isIntroVideoEnabled(requireContext()));
binding.settingsEnableIntroVideo.setOnCheckedChangeListener((view, checked) -> SettingsUtil.setEnableIntroVideo(requireContext(), checked)); binding.settingsEnableIntroVideo.setOnCheckedChangeListener((view, checked) -> SettingsUtil.setEnableIntroVideo(requireContext(), checked));
binding.settingsBiometricLock.setChecked(SettingsUtil.isBiometricLock(requireContext())); if(BiometricManager.from(requireContext()).canAuthenticate(BIOMETRIC_STRONG | DEVICE_CREDENTIAL) == BiometricManager.BIOMETRIC_SUCCESS) {
binding.settingsBiometricLock.setOnCheckedChangeListener((view, checked) -> SettingsUtil.setBiometricLock(requireContext(), checked)); binding.settingsBiometricLock.setChecked(SettingsUtil.isBiometricLock(requireContext()));
binding.settingsBiometricLock.setOnCheckedChangeListener((view, checked) -> SettingsUtil.setBiometricLock(requireContext(), checked));
}else {
binding.settingsBiometricLock.setChecked(false);
binding.settingsBiometricLock.setEnabled(false);
// TODO: inform user
}
binding.settingsTheme.setAdapter(new ArrayAdapter<>(getContext(), android.R.layout.simple_list_item_1, SettingsUtil.THEME_NAMES.toArray(new String[0]))); 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.setSelection(SettingsUtil.THEME_NAMES.indexOf(SettingsUtil.getTheme(requireContext())));

View File

@ -4,7 +4,7 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
tools:context=".fragment.DynamicFragment"> tools:context=".fragment.GroupFragment">
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent" android:layout_width="match_parent"

View File

@ -25,8 +25,8 @@
</fragment> </fragment>
<fragment <fragment
android:id="@+id/DynamicFragment" android:id="@+id/DynamicFragment"
android:name="com.cringe_studios.cringe_authenticator.fragment.DynamicFragment" android:name="com.cringe_studios.cringe_authenticator.fragment.GroupFragment"
android:label="Dynamic" android:label="Dynamic"
tools:layout="@layout/fragment_dynamic"> tools:layout="@layout/fragment_group">
</fragment> </fragment>
</navigation> </navigation>