[PM-18082] Force incognito keyboard on input fields (#4700)

This commit is contained in:
Patrick Honkonen
2025-02-10 13:38:29 -05:00
committed by GitHub
parent e70b21c951
commit 3adc80fdf8
2 changed files with 49 additions and 2 deletions

View File

@@ -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,
)
}

View File

@@ -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) }
}
}