From 3adc80fdf850623a2a6b55c01e5a7ae2149a9473 Mon Sep 17 00:00:00 2001 From: Patrick Honkonen <1883101+SaintPatrck@users.noreply.github.com> Date: Mon, 10 Feb 2025 13:38:29 -0500 Subject: [PATCH] [PM-18082] Force incognito keyboard on input fields (#4700) --- .../NoPersonalizedLearningInterceptor.kt | 47 +++++++++++++++++++ .../ui/platform/theme/BitwardenTheme.kt | 4 +- 2 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/com/x8bit/bitwarden/ui/platform/components/field/interceptor/NoPersonalizedLearningInterceptor.kt diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/platform/components/field/interceptor/NoPersonalizedLearningInterceptor.kt b/app/src/main/java/com/x8bit/bitwarden/ui/platform/components/field/interceptor/NoPersonalizedLearningInterceptor.kt new file mode 100644 index 0000000000..28d99922f3 --- /dev/null +++ b/app/src/main/java/com/x8bit/bitwarden/ui/platform/components/field/interceptor/NoPersonalizedLearningInterceptor.kt @@ -0,0 +1,47 @@ +package com.x8bit.bitwarden.ui.platform.components.field.interceptor + +import android.view.inputmethod.EditorInfo +import androidx.compose.runtime.Composable +import androidx.compose.ui.ExperimentalComposeUiApi +import androidx.compose.ui.platform.InterceptPlatformTextInput +import androidx.compose.ui.platform.PlatformTextInputInterceptor +import androidx.compose.ui.platform.PlatformTextInputMethodRequest +import androidx.compose.ui.platform.PlatformTextInputSession +import com.x8bit.bitwarden.data.platform.annotation.OmitFromCoverage + +/** + * Interceptor that disables the [EditorInfo.IME_FLAG_NO_PERSONALIZED_LEARNING] flag on text inputs. + */ +@OmitFromCoverage +@OptIn(ExperimentalComposeUiApi::class) +object NoPersonalizedLearningInterceptor : PlatformTextInputInterceptor { + override suspend fun interceptStartInputMethod( + request: PlatformTextInputMethodRequest, + nextHandler: PlatformTextInputSession, + ): Nothing { + val modifiedRequest = PlatformTextInputMethodRequest { outAttrs -> + request.createInputConnection(outAttrs) + .also { + outAttrs.imeOptions = + outAttrs.imeOptions or EditorInfo.IME_FLAG_NO_PERSONALIZED_LEARNING + } + } + nextHandler.startInputMethod(modifiedRequest) + } +} + +/** + * A [InterceptPlatformTextInput] that disables the [EditorInfo.IME_FLAG_NO_PERSONALIZED_LEARNING] + * flag on text inputs to force the keyboard into "Incognito Mode". + * + * This is a modified version of the workaround provided by Google here: + * https://issuetracker.google.com/issues/359257538#comment2 + */ +@OptIn(ExperimentalComposeUiApi::class) +@Composable +fun IncognitoInput(content: @Composable () -> Unit) { + InterceptPlatformTextInput( + interceptor = NoPersonalizedLearningInterceptor, + content = content, + ) +} diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/platform/theme/BitwardenTheme.kt b/app/src/main/java/com/x8bit/bitwarden/ui/platform/theme/BitwardenTheme.kt index bbdd315a6f..d0661dbeba 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/platform/theme/BitwardenTheme.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/platform/theme/BitwardenTheme.kt @@ -18,6 +18,7 @@ import androidx.compose.runtime.compositionLocalOf import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalView import androidx.core.view.WindowCompat +import com.x8bit.bitwarden.ui.platform.components.field.interceptor.IncognitoInput import com.x8bit.bitwarden.ui.platform.feature.settings.appearance.model.AppTheme import com.x8bit.bitwarden.ui.platform.theme.color.BitwardenColorScheme import com.x8bit.bitwarden.ui.platform.theme.color.darkBitwardenColorScheme @@ -125,8 +126,7 @@ fun BitwardenTheme( defaultColorScheme = materialColorScheme, ), typography = bitwardenTypography.toMaterialTypography(), - content = content, - ) + ) { IncognitoInput(content = content) } } }