current stand

This commit is contained in:
Myzel394 2023-12-21 18:12:46 +01:00
parent 7dfa29856e
commit bf84396a86
No known key found for this signature in database
GPG Key ID: 50098FCA22080F0F
4 changed files with 67 additions and 1 deletions

View File

@ -146,4 +146,6 @@ dependencies {
implementation "com.valentinilk.shimmer:compose-shimmer:1.2.0" implementation "com.valentinilk.shimmer:compose-shimmer:1.2.0"
implementation "androidx.biometric:biometric-ktx:1.2.0-alpha05"
} }

View File

@ -24,6 +24,8 @@
<uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_CAMERA" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE_CAMERA" />
<uses-permission android:name="android.permission.USE_BIOMETRIC" />
<application <application
android:name=".UpdateSettingsApp" android:name=".UpdateSettingsApp"
android:allowBackup="true" android:allowBackup="true"

View File

@ -1,11 +1,14 @@
package app.myzel394.alibi.db package app.myzel394.alibi.db
import android.content.Context import android.content.Context
import android.content.Intent
import android.media.MediaRecorder import android.media.MediaRecorder
import android.os.Build import android.os.Build
import androidx.camera.video.FileOutputOptions import androidx.biometric.BiometricManager
import androidx.biometric.BiometricManager.Authenticators
import androidx.camera.video.Quality import androidx.camera.video.Quality
import androidx.camera.video.QualitySelector import androidx.camera.video.QualitySelector
import androidx.core.app.ActivityCompat.startActivityForResult
import app.myzel394.alibi.R import app.myzel394.alibi.R
import app.myzel394.alibi.helpers.AudioBatchesFolder import app.myzel394.alibi.helpers.AudioBatchesFolder
import app.myzel394.alibi.helpers.VideoBatchesFolder import app.myzel394.alibi.helpers.VideoBatchesFolder
@ -547,3 +550,19 @@ data class NotificationSettings(
) )
} }
} }
@Serializable
class AppLockSettings {
val isEnabled
get() = true
companion object {
fun getDefaultInstance(): AppLockSettings = AppLockSettings()
fun isSupported(context: Context): Boolean {
val biometricManager = BiometricManager.from(context)
when (biometricManager.canAuthenticate(Authenticators.BIOMETRIC_STRONG or Authenticators.DEVICE_CREDENTIAL)) {
}
}
}

View File

@ -1,8 +1,16 @@
package app.myzel394.alibi.ui package app.myzel394.alibi.ui
import android.content.Context import android.content.Context
import android.hardware.biometrics.BiometricManager.Authenticators.BIOMETRIC_STRONG
import android.hardware.biometrics.BiometricManager.Authenticators.DEVICE_CREDENTIAL
import android.hardware.biometrics.BiometricPrompt
import android.hardware.biometrics.BiometricPrompt.CryptoObject
import android.hardware.camera2.CameraCharacteristics import android.hardware.camera2.CameraCharacteristics
import android.hardware.camera2.CameraManager import android.hardware.camera2.CameraManager
import android.os.Build
import android.os.CancellationSignal
import android.widget.Button
import androidx.annotation.RequiresApi
import androidx.appcompat.app.AppCompatDelegate import androidx.appcompat.app.AppCompatDelegate
import androidx.camera.core.CameraX import androidx.camera.core.CameraX
import androidx.compose.animation.core.tween import androidx.compose.animation.core.tween
@ -20,10 +28,12 @@ import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState import androidx.compose.runtime.collectAsState
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.core.content.ContextCompat
import androidx.lifecycle.viewmodel.compose.viewModel import androidx.lifecycle.viewmodel.compose.viewModel
import androidx.navigation.compose.NavHost import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController import androidx.navigation.compose.rememberNavController
import app.myzel394.alibi.R
import app.myzel394.alibi.dataStore import app.myzel394.alibi.dataStore
import app.myzel394.alibi.db.AppSettings import app.myzel394.alibi.db.AppSettings
import app.myzel394.alibi.ui.enums.Screen import app.myzel394.alibi.ui.enums.Screen
@ -61,6 +71,39 @@ fun Navigation(
} }
} }
LaunchedEffect(Unit) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
val executor = ContextCompat.getMainExecutor(context)
val promptInfo = BiometricPrompt.Builder(context)
.setTitle("Biometric login for my app")
.setSubtitle("Log in using your biometric credential")
.setAllowedAuthenticators(
BIOMETRIC_STRONG or DEVICE_CREDENTIAL
)
.build()
// Prompt appears when user clicks "Log in".
// Consider integrating with the keystore to unlock cryptographic operations,
// if needed by your app.
promptInfo.authenticate(
CancellationSignal(),
executor,
object : BiometricPrompt.AuthenticationCallback() {
override fun onAuthenticationError(errorCode: Int, errString: CharSequence) {
super.onAuthenticationError(errorCode, errString)
}
override fun onAuthenticationSucceeded(result: BiometricPrompt.AuthenticationResult) {
super.onAuthenticationSucceeded(result)
}
override fun onAuthenticationFailed() {
super.onAuthenticationFailed()
}
})
}
}
LaunchedEffect(settings.theme) { LaunchedEffect(settings.theme) {
if (!SUPPORTS_DARK_MODE_NATIVELY) { if (!SUPPORTS_DARK_MODE_NATIVELY) {
val currentValue = AppCompatDelegate.getDefaultNightMode() val currentValue = AppCompatDelegate.getDefaultNightMode()