mirror of
https://github.com/element-hq/element-android
synced 2024-11-27 11:59:12 +03:00
Merge pull request #6633 from Benjiko99/feature/incognito-keyboard
Add privacy setting to disable personalized learning by the keyboard
This commit is contained in:
commit
4974fdf905
7 changed files with 55 additions and 4 deletions
1
changelog.d/6633.feature
Normal file
1
changelog.d/6633.feature
Normal file
|
@ -0,0 +1 @@
|
|||
Add privacy setting to disable personalized learning by the keyboard
|
|
@ -2578,6 +2578,9 @@
|
|||
<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_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="change_password_summary">Set a new account password…</string>
|
||||
|
||||
|
|
|
@ -1538,11 +1538,10 @@ class TimelineFragment :
|
|||
|
||||
observerUserTyping()
|
||||
|
||||
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()
|
||||
composerEditText.imeOptions = EditorInfo.IME_ACTION_SEND
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||
composerEditText.setUseIncognitoKeyboard(vectorPreferences.useIncognitoKeyboard())
|
||||
}
|
||||
composerEditText.setSendMessageWithEnter(vectorPreferences.sendMessageWithEnter())
|
||||
|
||||
composerEditText.setOnEditorActionListener { v, actionId, keyEvent ->
|
||||
val imeActionId = actionId and EditorInfo.IME_MASK_ACTION
|
||||
|
|
|
@ -20,10 +20,12 @@ package im.vector.app.features.home.room.detail.composer
|
|||
import android.content.ClipData
|
||||
import android.content.Context
|
||||
import android.net.Uri
|
||||
import android.os.Build
|
||||
import android.text.Editable
|
||||
import android.util.AttributeSet
|
||||
import android.view.inputmethod.EditorInfo
|
||||
import android.view.inputmethod.InputConnection
|
||||
import androidx.annotation.RequiresApi
|
||||
import androidx.appcompat.widget.AppCompatEditText
|
||||
import androidx.core.view.OnReceiveContentListener
|
||||
import androidx.core.view.ViewCompat
|
||||
|
@ -79,6 +81,27 @@ class ComposerEditText @JvmOverloads constructor(
|
|||
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 {
|
||||
addTextChangedListener(
|
||||
object : SimpleTextWatcher() {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -20,6 +20,7 @@ package im.vector.app.features.settings
|
|||
import android.app.Activity
|
||||
import android.content.Intent
|
||||
import android.net.Uri
|
||||
import android.os.Build
|
||||
import android.os.Bundle
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
|
@ -160,6 +161,10 @@ class VectorSettingsSecurityPrivacyFragment :
|
|||
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 {
|
||||
return super.onCreateRecyclerView(inflater, parent, savedInstanceState).also {
|
||||
// Insert animation are really annoying the first time the list is shown
|
||||
|
@ -275,6 +280,9 @@ class VectorSettingsSecurityPrivacyFragment :
|
|||
// Analytics
|
||||
setUpAnalytics()
|
||||
|
||||
// Incognito Keyboard
|
||||
setUpIncognitoKeyboard()
|
||||
|
||||
// Pin code
|
||||
openPinCodeSettingsPref.setOnPreferenceClickListener {
|
||||
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
|
||||
private fun refreshXSigningStatus() {
|
||||
val crossSigningKeys = session.cryptoService().crossSigningService().getMyCrossSigningKeys()
|
||||
|
|
|
@ -141,6 +141,12 @@
|
|||
android:summary="@string/settings_security_application_protection_summary"
|
||||
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
|
||||
android:defaultValue="false"
|
||||
android:key="SETTINGS_SECURITY_USE_FLAG_SECURE"
|
||||
|
|
Loading…
Reference in a new issue