Skip to content

Commit

Permalink
Fix crash when unmasking password field with TalkBack enabled
Browse files Browse the repository at this point in the history
  • Loading branch information
muqeeta96 authored and cketti committed Aug 28, 2024
1 parent 054accc commit 89bacb2
Showing 1 changed file with 18 additions and 2 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package app.k9mail.core.ui.compose.designsystem.atom.textfield

import android.os.Build
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
Expand All @@ -8,6 +9,8 @@ import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.semantics.password
import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.text.input.PasswordVisualTransformation
import androidx.compose.ui.text.input.VisualTransformation
Expand All @@ -34,7 +37,7 @@ fun TextFieldOutlinedPassword(
Material3OutlinedTextField(
value = value,
onValueChange = stripLineBreaks(onValueChange),
modifier = modifier,
modifier = modifier.applyLegacyPasswordSemantics(),
enabled = isEnabled,
label = selectLabel(label, isRequired),
trailingIcon = selectTrailingIcon(
Expand Down Expand Up @@ -69,7 +72,7 @@ fun TextFieldOutlinedPassword(
Material3OutlinedTextField(
value = value,
onValueChange = stripLineBreaks(onValueChange),
modifier = modifier,
modifier = modifier.applyLegacyPasswordSemantics(),
enabled = isEnabled,
label = selectLabel(label, isRequired),
trailingIcon = selectTrailingIcon(
Expand Down Expand Up @@ -129,3 +132,16 @@ private fun selectVisualTransformation(
}

private fun isShowPasswordAllowed(isEnabled: Boolean, isPasswordVisible: Boolean) = isEnabled && isPasswordVisible

private fun Modifier.applyLegacyPasswordSemantics(): Modifier {
/*
* Workaround for a crash that can occur when the password visibility state changes
* while an accessibility service is enabled on devices running Android API level 25 or below.
* This approach mitigates the issue by applying password semantics only on affected versions.
*/
return this.semantics {
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.N_MR1) {
password()
}
}
}

0 comments on commit 89bacb2

Please sign in to comment.