diff --git a/changelog.d/6633.feature b/changelog.d/6633.feature
new file mode 100644
index 0000000000..b52e9d95bc
--- /dev/null
+++ b/changelog.d/6633.feature
@@ -0,0 +1 @@
+Add privacy setting to disable personalized learning by the keyboard
diff --git a/library/ui-strings/src/main/res/values/strings.xml b/library/ui-strings/src/main/res/values/strings.xml
index d8f6222acf..4f1917f0df 100644
--- a/library/ui-strings/src/main/res/values/strings.xml
+++ b/library/ui-strings/src/main/res/values/strings.xml
@@ -2578,6 +2578,9 @@
Prevent screenshots of the application
Enabling this setting adds the FLAG_SECURE to all Activities. Restart the application for the change to take effect.
+ Incognito keyboard
+ Request that the keyboard should not update any personalized data such as typing history and dictionary based on what the user typed. Some keyboards may not respect this setting.
+
Could not save media file
Set a new account password…
diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineFragment.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineFragment.kt
index bba607eeb4..0a8ae775a9 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineFragment.kt
@@ -1536,6 +1536,8 @@ class TimelineFragment :
observerUserTyping()
+ composerEditText.setUseIncognitoKeyboard(vectorPreferences.useIncognitoKeyboard())
+
if (vectorPreferences.sendMessageWithEnter()) {
// imeOptions="actionSend" only works with single line, so we remove multiline inputType
composerEditText.inputType = composerEditText.inputType and EditorInfo.TYPE_TEXT_FLAG_MULTI_LINE.inv()
diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/ComposerEditText.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/ComposerEditText.kt
index c751053cdf..6f09d25869 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/ComposerEditText.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/ComposerEditText.kt
@@ -79,6 +79,11 @@ class ComposerEditText @JvmOverloads constructor(
return ic
}
+ /** Set whether the keyboard should disable personalized learning. */
+ fun setUseIncognitoKeyboard(useIncognitoKeyboard: Boolean) {
+ imeOptions = if (useIncognitoKeyboard) imeOptions or INCOGNITO_KEYBOARD_IME else imeOptions and INCOGNITO_KEYBOARD_IME.inv()
+ }
+
init {
addTextChangedListener(
object : SimpleTextWatcher() {
@@ -116,4 +121,8 @@ class ComposerEditText @JvmOverloads constructor(
}
)
}
+
+ companion object {
+ const val INCOGNITO_KEYBOARD_IME = EditorInfo.IME_FLAG_NO_PERSONALIZED_LEARNING
+ }
}
diff --git a/vector/src/main/java/im/vector/app/features/settings/VectorPreferences.kt b/vector/src/main/java/im/vector/app/features/settings/VectorPreferences.kt
index 16d3210b45..b7812b9ebb 100755
--- a/vector/src/main/java/im/vector/app/features/settings/VectorPreferences.kt
+++ b/vector/src/main/java/im/vector/app/features/settings/VectorPreferences.kt
@@ -87,6 +87,7 @@ class VectorPreferences @Inject constructor(
const val SETTINGS_INTEGRATION_MANAGER_UI_URL_KEY = "SETTINGS_INTEGRATION_MANAGER_UI_URL_KEY"
const val SETTINGS_SECURE_MESSAGE_RECOVERY_PREFERENCE_KEY = "SETTINGS_SECURE_MESSAGE_RECOVERY_PREFERENCE_KEY"
const val SETTINGS_PERSISTED_SPACE_BACKSTACK = "SETTINGS_PERSISTED_SPACE_BACKSTACK"
+ const val SETTINGS_SECURITY_INCOGNITO_KEYBOARD_PREFERENCE_KEY = "SETTINGS_SECURITY_INCOGNITO_KEYBOARD_PREFERENCE_KEY"
const val SETTINGS_CRYPTOGRAPHY_HS_ADMIN_DISABLED_E2E_DEFAULT = "SETTINGS_CRYPTOGRAPHY_HS_ADMIN_DISABLED_E2E_DEFAULT"
// const val SETTINGS_SECURE_BACKUP_RESET_PREFERENCE_KEY = "SETTINGS_SECURE_BACKUP_RESET_PREFERENCE_KEY"
@@ -288,6 +289,7 @@ class VectorPreferences @Inject constructor(
SETTINGS_USE_RAGE_SHAKE_KEY,
SETTINGS_SECURITY_USE_FLAG_SECURE,
+ SETTINGS_SECURITY_INCOGNITO_KEYBOARD_PREFERENCE_KEY,
ShortcutsHandler.SHARED_PREF_KEY,
)
@@ -969,6 +971,11 @@ class VectorPreferences @Inject constructor(
return defaultPrefs.getBoolean(SETTINGS_SECURITY_USE_FLAG_SECURE, false)
}
+ /** Whether the keyboard should disable personalized learning. */
+ fun useIncognitoKeyboard(): Boolean {
+ return defaultPrefs.getBoolean(SETTINGS_SECURITY_INCOGNITO_KEYBOARD_PREFERENCE_KEY, false)
+ }
+
/**
* The user enable protecting app access with pin code.
* Currently we use the pin code store to know if the pin is enabled, so this is not used
diff --git a/vector/src/main/res/xml/vector_settings_security_privacy.xml b/vector/src/main/res/xml/vector_settings_security_privacy.xml
index 1e8997e9c8..78e1ba42a8 100644
--- a/vector/src/main/res/xml/vector_settings_security_privacy.xml
+++ b/vector/src/main/res/xml/vector_settings_security_privacy.xml
@@ -141,6 +141,12 @@
android:summary="@string/settings_security_application_protection_summary"
android:title="@string/settings_security_application_protection_title" />
+
+