fix: error code 28 #2105

This commit is contained in:
J-Jamet
2025-08-13 19:03:15 +02:00
parent da0f02e536
commit c12eb3d643
2 changed files with 16 additions and 36 deletions

View File

@@ -133,14 +133,9 @@ class DeviceUnlockFragment: Fragment() {
viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) { viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {
mDeviceUnlockViewModel.uiState.collect { uiState -> mDeviceUnlockViewModel.uiState.collect { uiState ->
// Change mode // Change mode
toggleDeviceCredentialMode( toggleDeviceCredentialMode(uiState.newDeviceUnlockMode)
uiState.newDeviceUnlockMode,
uiState.deviceUnlockModeChange
)
// Prompt // Prompt
manageDeviceCredentialPrompt( manageDeviceCredentialPrompt(uiState.cryptoPromptState)
uiState.cryptoPromptState
)
// Advanced menu // Advanced menu
mAllowAdvancedUnlockMenu = uiState.allowAdvancedUnlockMenu mAllowAdvancedUnlockMenu = uiState.allowAdvancedUnlockMenu
activity?.invalidateOptionsMenu() activity?.invalidateOptionsMenu()
@@ -164,21 +159,19 @@ class DeviceUnlockFragment: Fragment() {
mBiometricPrompt?.cancelAuthentication() mBiometricPrompt?.cancelAuthentication()
} }
private fun toggleDeviceCredentialMode(deviceUnlockMode: DeviceUnlockMode, modeChanged: Boolean) { private fun toggleDeviceCredentialMode(deviceUnlockMode: DeviceUnlockMode) {
if (modeChanged) { try {
try { when (deviceUnlockMode) {
when (deviceUnlockMode) { DeviceUnlockMode.BIOMETRIC_UNAVAILABLE -> setNotAvailableMode()
DeviceUnlockMode.BIOMETRIC_UNAVAILABLE -> setNotAvailableMode() DeviceUnlockMode.BIOMETRIC_SECURITY_UPDATE_REQUIRED -> setSecurityUpdateRequiredMode()
DeviceUnlockMode.BIOMETRIC_SECURITY_UPDATE_REQUIRED -> setSecurityUpdateRequiredMode() DeviceUnlockMode.DEVICE_CREDENTIAL_OR_BIOMETRIC_NOT_CONFIGURED -> setNotConfiguredMode()
DeviceUnlockMode.DEVICE_CREDENTIAL_OR_BIOMETRIC_NOT_CONFIGURED -> setNotConfiguredMode() DeviceUnlockMode.KEY_MANAGER_UNAVAILABLE -> setKeyManagerNotAvailableMode()
DeviceUnlockMode.KEY_MANAGER_UNAVAILABLE -> setKeyManagerNotAvailableMode() DeviceUnlockMode.WAIT_CREDENTIAL -> setWaitCredentialMode()
DeviceUnlockMode.WAIT_CREDENTIAL -> setWaitCredentialMode() DeviceUnlockMode.STORE_CREDENTIAL -> setStoreCredentialMode()
DeviceUnlockMode.STORE_CREDENTIAL -> setStoreCredentialMode() DeviceUnlockMode.EXTRACT_CREDENTIAL -> setExtractCredentialMode()
DeviceUnlockMode.EXTRACT_CREDENTIAL -> setExtractCredentialMode()
}
} catch (e: Exception) {
mDeviceUnlockViewModel.setException(e)
} }
} catch (e: Exception) {
mDeviceUnlockViewModel.setException(e)
} }
} }

View File

@@ -93,26 +93,16 @@ class DeviceUnlockViewModel(application: Application): AndroidViewModel(applicat
checkUnlockAvailability() checkUnlockAvailability()
} }
private fun isModeChanging(newMode: DeviceUnlockMode): Boolean {
return deviceUnlockMode != newMode
}
@RequiresApi(Build.VERSION_CODES.M) @RequiresApi(Build.VERSION_CODES.M)
fun selectMode(containsCipherDatabase: Boolean) { fun selectMode(containsCipherDatabase: Boolean) {
try { try {
if (isConditionToStoreCredentialVerified) { if (isConditionToStoreCredentialVerified) {
if (deviceUnlockManager == null deviceUnlockManager = DeviceUnlockManager(getApplication())
|| isModeChanging(DeviceUnlockMode.STORE_CREDENTIAL)) {
deviceUnlockManager = DeviceUnlockManager(getApplication())
}
// listen for encryption // listen for encryption
changeMode(DeviceUnlockMode.STORE_CREDENTIAL) changeMode(DeviceUnlockMode.STORE_CREDENTIAL)
initEncryptData() initEncryptData()
} else if (containsCipherDatabase) { } else if (containsCipherDatabase) {
if (deviceUnlockManager == null deviceUnlockManager = DeviceUnlockManager(getApplication())
|| isModeChanging(DeviceUnlockMode.EXTRACT_CREDENTIAL)) {
deviceUnlockManager = DeviceUnlockManager(getApplication())
}
// biometric available but no stored password found yet for this DB // biometric available but no stored password found yet for this DB
// listen for decryption // listen for decryption
changeMode(DeviceUnlockMode.EXTRACT_CREDENTIAL) changeMode(DeviceUnlockMode.EXTRACT_CREDENTIAL)
@@ -377,13 +367,11 @@ class DeviceUnlockViewModel(application: Application): AndroidViewModel(applicat
@RequiresApi(Build.VERSION_CODES.M) @RequiresApi(Build.VERSION_CODES.M)
private fun changeMode(deviceUnlockMode: DeviceUnlockMode) { private fun changeMode(deviceUnlockMode: DeviceUnlockMode) {
val modeChanged = this.deviceUnlockMode == deviceUnlockMode
this.deviceUnlockMode = deviceUnlockMode this.deviceUnlockMode = deviceUnlockMode
cipherDatabaseAction.containsCipherDatabase(databaseUri) { containsCipher -> cipherDatabaseAction.containsCipherDatabase(databaseUri) { containsCipher ->
_uiState.update { currentState -> _uiState.update { currentState ->
currentState.copy( currentState.copy(
newDeviceUnlockMode = deviceUnlockMode, newDeviceUnlockMode = deviceUnlockMode,
deviceUnlockModeChange = modeChanged,
allowAdvancedUnlockMenu = containsCipher allowAdvancedUnlockMenu = containsCipher
&& deviceUnlockMode != DeviceUnlockMode.BIOMETRIC_UNAVAILABLE && deviceUnlockMode != DeviceUnlockMode.BIOMETRIC_UNAVAILABLE
&& deviceUnlockMode != DeviceUnlockMode.KEY_MANAGER_UNAVAILABLE && deviceUnlockMode != DeviceUnlockMode.KEY_MANAGER_UNAVAILABLE
@@ -444,7 +432,6 @@ enum class DeviceUnlockPromptMode {
data class DeviceUnlockState( data class DeviceUnlockState(
val newDeviceUnlockMode: DeviceUnlockMode = DeviceUnlockMode.BIOMETRIC_UNAVAILABLE, val newDeviceUnlockMode: DeviceUnlockMode = DeviceUnlockMode.BIOMETRIC_UNAVAILABLE,
val deviceUnlockModeChange: Boolean = true,
val allowAdvancedUnlockMenu: Boolean = false, val allowAdvancedUnlockMenu: Boolean = false,
val credentialRequiredCipher: Cipher? = null, val credentialRequiredCipher: Cipher? = null,
val cipherEncryptDatabase: CipherEncryptDatabase? = null, val cipherEncryptDatabase: CipherEncryptDatabase? = null,