Fix biometric lock on devices without biometric data
This commit is contained in:
parent
9e9e02cb01
commit
0153f72aaa
@ -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");
|
||||||
|
@ -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());
|
||||||
|
|
@ -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);
|
||||||
|
@ -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));
|
||||||
|
|
||||||
|
if(BiometricManager.from(requireContext()).canAuthenticate(BIOMETRIC_STRONG | DEVICE_CREDENTIAL) == BiometricManager.BIOMETRIC_SUCCESS) {
|
||||||
binding.settingsBiometricLock.setChecked(SettingsUtil.isBiometricLock(requireContext()));
|
binding.settingsBiometricLock.setChecked(SettingsUtil.isBiometricLock(requireContext()));
|
||||||
binding.settingsBiometricLock.setOnCheckedChangeListener((view, checked) -> SettingsUtil.setBiometricLock(requireContext(), checked));
|
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())));
|
||||||
|
@ -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"
|
@ -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>
|
Loading…
Reference in New Issue
Block a user