diff --git a/app/build.gradle b/app/build.gradle index 6104a949a..bcfe97202 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -3,7 +3,6 @@ apply plugin: 'com.android.application' android { compileSdkVersion 30 buildToolsVersion "30.0.3" - ndkVersion "21.3.6528147" signingConfigs { def keystorePwd = null def alias = null @@ -86,10 +85,11 @@ tasks.withType(JavaCompile) { dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') implementation "androidx.activity:activity:1.2.0-rc01" - implementation 'androidx.appcompat:appcompat:1.3.0-alpha02' + implementation 'androidx.appcompat:appcompat:1.3.0-beta01' implementation 'androidx.biometric:biometric:1.2.0-alpha01' implementation "androidx.browser:browser:1.3.0" implementation 'androidx.cardview:cardview:1.0.0' + implementation 'androidx.dynamicanimation:dynamicanimation:1.1.0-alpha03' implementation "androidx.fragment:fragment:1.3.0-rc01" implementation "androidx.preference:preference:1.1.1" implementation "androidx.recyclerview:recyclerview:1.2.0-beta01" @@ -108,7 +108,6 @@ dependencies { implementation 'com.github.seven332:streampipe:0.1.0' implementation 'com.github.seven332:tuxiang:0.1.6' implementation 'com.github.seven332:unifile:9ec57bcd8f' - implementation 'com.github.seven332:yorozuya:0.1.2' implementation 'com.github.seven332:yorozuya-thread:0.1.1' implementation 'com.github.seven332:yorozuya-collect:0.1.4' implementation 'com.h6ah4i.android.widget.advrecyclerview:advrecyclerview:1.0.0' @@ -119,9 +118,10 @@ dependencies { implementation 'com.squareup.okhttp3:okhttp:4.9.0' implementation 'com.squareup.okhttp3:okhttp-dnsoverhttps:4.9.0' implementation 'com.takisoft.preferencex:preferencex:1.1.0' - implementation 'com.github.NekoInverter:DrawerLayout:6ba992f8d4' + implementation 'com.gitlab.NekoInverter:DrawerLayout:4e79840448' implementation 'com.github.NekoInverter:Image:8fd6c1e1df' implementation 'com.github.NekoInverter.preferencex-android:preferencex-simplemenu:88f93154b2' + implementation 'com.gitlab.NekoInverter:yorozuya:723dc867a9' implementation 'org.ccil.cowan.tagsoup:tagsoup:1.2.1' implementation 'org.greenrobot:greendao:3.3.0' implementation 'org.jsoup:jsoup:1.13.1' @@ -138,5 +138,6 @@ configurations.all { exclude group: 'com.github.seven332', module: 'okhttp' exclude group: 'com.github.seven332', module: 'image' + exclude group: 'com.github.seven332', module: 'yorozuya' } } diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/SecurityScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/SecurityScene.java index 29ae92b7f..6d0f083da 100755 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/SecurityScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/SecurityScene.java @@ -53,6 +53,9 @@ public class SecurityScene extends SolidScene implements private SensorManager mSensorManager; private Sensor mAccelerometer; private ShakeDetector mShakeDetector; + private BiometricPrompt.PromptInfo promptInfo; + private BiometricPrompt biometricPrompt; + private boolean canAuthenticate = false; private int mRetryTimes; @@ -80,6 +83,31 @@ public class SecurityScene extends SolidScene implements } else { mRetryTimes = savedInstanceState.getInt(KEY_RETRY_TIMES); } + + canAuthenticate = Settings.getEnableFingerprint() && + BiometricManager.from(requireContext()).canAuthenticate(BiometricManager.Authenticators.BIOMETRIC_WEAK) == BiometricManager.BIOMETRIC_SUCCESS; + biometricPrompt = new BiometricPrompt(this, Executors.newSingleThreadExecutor(), new BiometricPrompt.AuthenticationCallback() { + @Override + public void onAuthenticationError(int errorCode, @NonNull CharSequence errString) { + super.onAuthenticationError(errorCode, errString); + } + + @Override + public void onAuthenticationSucceeded(@NonNull BiometricPrompt.AuthenticationResult result) { + startSceneForCheckStep(CHECK_STEP_SECURITY, getArguments()); + finish(); + } + + @Override + public void onAuthenticationFailed() { + super.onAuthenticationFailed(); + } + }); + promptInfo = new BiometricPrompt.PromptInfo.Builder() + .setTitle(getString(R.string.app_name)) + .setNegativeButtonText(getString(android.R.string.cancel)) + .setConfirmationRequired(false) + .build(); } @Override @@ -99,35 +127,13 @@ public class SecurityScene extends SolidScene implements mSensorManager.registerListener(mShakeDetector, mAccelerometer, SensorManager.SENSOR_DELAY_UI); } - startBiometricPrompt(); + if (canAuthenticate) { + startBiometricPrompt(); + } } private void startBiometricPrompt() { - if (Settings.getEnableFingerprint() && BiometricManager.from(requireContext()).canAuthenticate(BiometricManager.Authenticators.BIOMETRIC_WEAK) == BiometricManager.BIOMETRIC_SUCCESS) { - BiometricPrompt biometricPrompt = new BiometricPrompt(this, Executors.newSingleThreadExecutor(), new BiometricPrompt.AuthenticationCallback() { - @Override - public void onAuthenticationError(int errorCode, @NonNull CharSequence errString) { - super.onAuthenticationError(errorCode, errString); - } - - @Override - public void onAuthenticationSucceeded(@NonNull BiometricPrompt.AuthenticationResult result) { - startSceneForCheckStep(CHECK_STEP_SECURITY, getArguments()); - finish(); - super.onAuthenticationSucceeded(result); - } - - @Override - public void onAuthenticationFailed() { - super.onAuthenticationFailed(); - } - }); - BiometricPrompt.PromptInfo promptInfo = new BiometricPrompt.PromptInfo.Builder() - .setTitle(getString(R.string.app_name)) - .setNegativeButtonText(getString(android.R.string.cancel)) - .build(); - biometricPrompt.authenticate(promptInfo); - } + biometricPrompt.authenticate(promptInfo); } @Override @@ -150,7 +156,9 @@ public class SecurityScene extends SolidScene implements public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.scene_security, container, false); - view.setOnClickListener(v -> startBiometricPrompt()); + if (canAuthenticate) { + view.setOnClickListener(v -> startBiometricPrompt()); + } mPatternView = (LockPatternView) ViewUtils.$$(view, R.id.pattern_view); mPatternView.setOnPatternListener(this);