Skip to content

Commit

Permalink
Merge pull request #8071 from muqeeta96/fix-issue-7705
Browse files Browse the repository at this point in the history
Fix a crash that occurs when the password input field visibility state changes and an accessibility service is enabled running Android 7 (API level 25) and below
  • Loading branch information
cketti authored Aug 28, 2024
2 parents 44eddcb + 89bacb2 commit aa9ca29
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 aa9ca29

Please sign in to comment.