Merge pull request #6633 from Benjiko99/feature/incognito-keyboard

Add privacy setting to disable personalized learning by the keyboard
This commit is contained in:
Benoit Marty 2022-10-04 18:22:22 +02:00 committed by GitHub
commit 4974fdf905
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 55 additions and 4 deletions

1
changelog.d/6633.feature Normal file
View File

@ -0,0 +1 @@
Add privacy setting to disable personalized learning by the keyboard

View File

@ -2578,6 +2578,9 @@
<string name="settings_security_prevent_screenshots_title">Prevent screenshots of the application</string> <string name="settings_security_prevent_screenshots_title">Prevent screenshots of the application</string>
<string name="settings_security_prevent_screenshots_summary">Enabling this setting adds the FLAG_SECURE to all Activities. Restart the application for the change to take effect.</string> <string name="settings_security_prevent_screenshots_summary">Enabling this setting adds the FLAG_SECURE to all Activities. Restart the application for the change to take effect.</string>
<string name="settings_security_incognito_keyboard_title">Incognito keyboard</string>
<string name="settings_security_incognito_keyboard_summary">"Request that the keyboard should not update any personalized data such as typing history and dictionary based on what you've typed in conversations. Notice that some keyboards may not respect this setting."</string>
<string name="error_saving_media_file">Could not save media file</string> <string name="error_saving_media_file">Could not save media file</string>
<string name="change_password_summary">Set a new account password…</string> <string name="change_password_summary">Set a new account password…</string>

View File

@ -1538,11 +1538,10 @@ class TimelineFragment :
observerUserTyping() observerUserTyping()
if (vectorPreferences.sendMessageWithEnter()) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
// imeOptions="actionSend" only works with single line, so we remove multiline inputType composerEditText.setUseIncognitoKeyboard(vectorPreferences.useIncognitoKeyboard())
composerEditText.inputType = composerEditText.inputType and EditorInfo.TYPE_TEXT_FLAG_MULTI_LINE.inv()
composerEditText.imeOptions = EditorInfo.IME_ACTION_SEND
} }
composerEditText.setSendMessageWithEnter(vectorPreferences.sendMessageWithEnter())
composerEditText.setOnEditorActionListener { v, actionId, keyEvent -> composerEditText.setOnEditorActionListener { v, actionId, keyEvent ->
val imeActionId = actionId and EditorInfo.IME_MASK_ACTION val imeActionId = actionId and EditorInfo.IME_MASK_ACTION

View File

@ -20,10 +20,12 @@ package im.vector.app.features.home.room.detail.composer
import android.content.ClipData import android.content.ClipData
import android.content.Context import android.content.Context
import android.net.Uri import android.net.Uri
import android.os.Build
import android.text.Editable import android.text.Editable
import android.util.AttributeSet import android.util.AttributeSet
import android.view.inputmethod.EditorInfo import android.view.inputmethod.EditorInfo
import android.view.inputmethod.InputConnection import android.view.inputmethod.InputConnection
import androidx.annotation.RequiresApi
import androidx.appcompat.widget.AppCompatEditText import androidx.appcompat.widget.AppCompatEditText
import androidx.core.view.OnReceiveContentListener import androidx.core.view.OnReceiveContentListener
import androidx.core.view.ViewCompat import androidx.core.view.ViewCompat
@ -79,6 +81,27 @@ class ComposerEditText @JvmOverloads constructor(
return ic return ic
} }
/** Set whether the keyboard should disable personalized learning. */
@RequiresApi(Build.VERSION_CODES.O)
fun setUseIncognitoKeyboard(useIncognitoKeyboard: Boolean) {
imeOptions = if (useIncognitoKeyboard) {
imeOptions or EditorInfo.IME_FLAG_NO_PERSONALIZED_LEARNING
} else {
imeOptions and EditorInfo.IME_FLAG_NO_PERSONALIZED_LEARNING.inv()
}
}
/** Set whether enter should send the message or add a new line. */
fun setSendMessageWithEnter(sendMessageWithEnter: Boolean) {
if (sendMessageWithEnter) {
inputType = inputType and EditorInfo.TYPE_TEXT_FLAG_MULTI_LINE.inv()
imeOptions = imeOptions or EditorInfo.IME_ACTION_SEND
} else {
inputType = inputType or EditorInfo.TYPE_TEXT_FLAG_MULTI_LINE
imeOptions = imeOptions and EditorInfo.IME_ACTION_SEND.inv()
}
}
init { init {
addTextChangedListener( addTextChangedListener(
object : SimpleTextWatcher() { object : SimpleTextWatcher() {

View File

@ -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_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_SECURE_MESSAGE_RECOVERY_PREFERENCE_KEY = "SETTINGS_SECURE_MESSAGE_RECOVERY_PREFERENCE_KEY"
const val SETTINGS_PERSISTED_SPACE_BACKSTACK = "SETTINGS_PERSISTED_SPACE_BACKSTACK" 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_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" // 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_USE_RAGE_SHAKE_KEY,
SETTINGS_SECURITY_USE_FLAG_SECURE, SETTINGS_SECURITY_USE_FLAG_SECURE,
SETTINGS_SECURITY_INCOGNITO_KEYBOARD_PREFERENCE_KEY,
ShortcutsHandler.SHARED_PREF_KEY, ShortcutsHandler.SHARED_PREF_KEY,
) )
@ -969,6 +971,11 @@ class VectorPreferences @Inject constructor(
return defaultPrefs.getBoolean(SETTINGS_SECURITY_USE_FLAG_SECURE, false) 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. * 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 * Currently we use the pin code store to know if the pin is enabled, so this is not used

View File

@ -20,6 +20,7 @@ package im.vector.app.features.settings
import android.app.Activity import android.app.Activity
import android.content.Intent import android.content.Intent
import android.net.Uri import android.net.Uri
import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
@ -160,6 +161,10 @@ class VectorSettingsSecurityPrivacyFragment :
findPreference<VectorSwitchPreference>("SETTINGS_USER_ANALYTICS_CONSENT_KEY")!! findPreference<VectorSwitchPreference>("SETTINGS_USER_ANALYTICS_CONSENT_KEY")!!
} }
private val incognitoKeyboardPref by lazy {
findPreference<VectorSwitchPreference>(VectorPreferences.SETTINGS_SECURITY_INCOGNITO_KEYBOARD_PREFERENCE_KEY)!!
}
override fun onCreateRecyclerView(inflater: LayoutInflater, parent: ViewGroup, savedInstanceState: Bundle?): RecyclerView { override fun onCreateRecyclerView(inflater: LayoutInflater, parent: ViewGroup, savedInstanceState: Bundle?): RecyclerView {
return super.onCreateRecyclerView(inflater, parent, savedInstanceState).also { return super.onCreateRecyclerView(inflater, parent, savedInstanceState).also {
// Insert animation are really annoying the first time the list is shown // Insert animation are really annoying the first time the list is shown
@ -275,6 +280,9 @@ class VectorSettingsSecurityPrivacyFragment :
// Analytics // Analytics
setUpAnalytics() setUpAnalytics()
// Incognito Keyboard
setUpIncognitoKeyboard()
// Pin code // Pin code
openPinCodeSettingsPref.setOnPreferenceClickListener { openPinCodeSettingsPref.setOnPreferenceClickListener {
openPinCodePreferenceScreen() openPinCodePreferenceScreen()
@ -337,6 +345,10 @@ class VectorSettingsSecurityPrivacyFragment :
} }
} }
private fun setUpIncognitoKeyboard() {
incognitoKeyboardPref.isVisible = Build.VERSION.SDK_INT >= Build.VERSION_CODES.O
}
// Todo this should be refactored and use same state as 4S section // Todo this should be refactored and use same state as 4S section
private fun refreshXSigningStatus() { private fun refreshXSigningStatus() {
val crossSigningKeys = session.cryptoService().crossSigningService().getMyCrossSigningKeys() val crossSigningKeys = session.cryptoService().crossSigningService().getMyCrossSigningKeys()

View File

@ -141,6 +141,12 @@
android:summary="@string/settings_security_application_protection_summary" android:summary="@string/settings_security_application_protection_summary"
android:title="@string/settings_security_application_protection_title" /> android:title="@string/settings_security_application_protection_title" />
<im.vector.app.core.preference.VectorSwitchPreference
android:defaultValue="false"
android:key="SETTINGS_SECURITY_INCOGNITO_KEYBOARD_PREFERENCE_KEY"
android:summary="@string/settings_security_incognito_keyboard_summary"
android:title="@string/settings_security_incognito_keyboard_title" />
<im.vector.app.core.preference.VectorSwitchPreference <im.vector.app.core.preference.VectorSwitchPreference
android:defaultValue="false" android:defaultValue="false"
android:key="SETTINGS_SECURITY_USE_FLAG_SECURE" android:key="SETTINGS_SECURITY_USE_FLAG_SECURE"