BiometricPromptActivity.kt (2171B) - raw
1 package me.rhunk.snapenhance.bridge 2 3 import android.content.Intent 4 import android.hardware.biometrics.BiometricManager 5 import android.hardware.biometrics.BiometricPrompt 6 import android.os.Build 7 import android.os.Bundle 8 import android.os.CancellationSignal 9 import androidx.activity.ComponentActivity 10 import androidx.activity.compose.setContent 11 import me.rhunk.snapenhance.SharedContextHolder 12 import java.util.concurrent.Executors 13 14 class BiometricPromptActivity: ComponentActivity() { 15 override fun onCreate(savedInstanceState: Bundle?) { 16 super.onCreate(savedInstanceState) 17 18 fun cancel() { 19 setResult(RESULT_CANCELED, Intent()) 20 finish() 21 } 22 23 val remoteSideContext = SharedContextHolder.remote(this) 24 25 BiometricPrompt.Builder(this@BiometricPromptActivity) 26 .setTitle(remoteSideContext.translation["biometric_auth.title"]) 27 .setSubtitle(remoteSideContext.translation["biometric_auth.subtitle"]) 28 .apply { 29 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { 30 setAllowedAuthenticators(BiometricManager.Authenticators.BIOMETRIC_WEAK or BiometricManager.Authenticators.DEVICE_CREDENTIAL) 31 } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { 32 @Suppress("DEPRECATION") 33 setDeviceCredentialAllowed(true) 34 } 35 } 36 .build().authenticate( 37 CancellationSignal().apply { 38 setOnCancelListener { 39 cancel() 40 } 41 }, 42 Executors.newSingleThreadExecutor(), 43 object: BiometricPrompt.AuthenticationCallback() { 44 override fun onAuthenticationError(errorCode: Int, errString: CharSequence?) { 45 cancel() 46 } 47 48 override fun onAuthenticationSucceeded(result: BiometricPrompt.AuthenticationResult?) { 49 setResult(RESULT_OK, Intent()) 50 finish() 51 } 52 } 53 ) 54 55 setContent {} 56 } 57 }