Skip to content

Commit 5a38940

Browse files
authored
Merge pull request #1907 from vector-im/feature/display_device_key
Feature/display device key
2 parents 81a4b5e + 15c9d68 commit 5a38940

File tree

4 files changed

+77
-165
lines changed

4 files changed

+77
-165
lines changed

CHANGES.md

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ Features ✨:
66

77
Improvements 🙌:
88
- Give user the possibility to prevent accidental call (#1869)
9+
- Display device information (name, id and key) in Cryptography setting screen (#1784)
910
- Ensure users do not accidentally ignore other users (#1890)
1011

1112
Bugfix 🐛:

vector/src/main/java/im/vector/app/features/settings/VectorSettingsSecurityPrivacyFragment.kt

+58-152
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,6 @@ import androidx.preference.PreferenceCategory
3434
import androidx.preference.SwitchPreference
3535
import androidx.recyclerview.widget.RecyclerView
3636
import com.google.android.material.textfield.TextInputEditText
37-
import org.matrix.android.sdk.api.MatrixCallback
38-
import org.matrix.android.sdk.internal.crypto.crosssigning.isVerified
39-
import org.matrix.android.sdk.internal.crypto.model.ImportRoomKeysResult
40-
import org.matrix.android.sdk.internal.crypto.model.rest.DeviceInfo
41-
import org.matrix.android.sdk.internal.crypto.model.rest.DevicesListResponse
42-
import org.matrix.android.sdk.rx.SecretsSynchronisationInfo
4337
import im.vector.app.R
4438
import im.vector.app.core.di.ActiveSessionHolder
4539
import im.vector.app.core.dialogs.ExportKeysDialog
@@ -50,6 +44,7 @@ import im.vector.app.core.intent.getFilenameFromUri
5044
import im.vector.app.core.platform.SimpleTextWatcher
5145
import im.vector.app.core.preference.VectorPreference
5246
import im.vector.app.core.preference.VectorPreferenceCategory
47+
import im.vector.app.core.utils.copyToClipboard
5348
import im.vector.app.core.utils.openFileSelection
5449
import im.vector.app.core.utils.toast
5550
import im.vector.app.features.crypto.keys.KeysExporter
@@ -65,6 +60,13 @@ import im.vector.app.features.themes.ThemeUtils
6560
import io.reactivex.android.schedulers.AndroidSchedulers
6661
import io.reactivex.disposables.Disposable
6762
import me.gujun.android.span.span
63+
import org.matrix.android.sdk.api.MatrixCallback
64+
import org.matrix.android.sdk.api.extensions.getFingerprintHumanReadable
65+
import org.matrix.android.sdk.internal.crypto.crosssigning.isVerified
66+
import org.matrix.android.sdk.internal.crypto.model.ImportRoomKeysResult
67+
import org.matrix.android.sdk.internal.crypto.model.rest.DeviceInfo
68+
import org.matrix.android.sdk.internal.crypto.model.rest.DevicesListResponse
69+
import org.matrix.android.sdk.rx.SecretsSynchronisationInfo
6870
import org.matrix.android.sdk.rx.rx
6971
import javax.inject.Inject
7072

@@ -85,6 +87,18 @@ class VectorSettingsSecurityPrivacyFragment @Inject constructor(
8587
findPreference<PreferenceCategory>(VectorPreferences.SETTINGS_CRYPTOGRAPHY_PREFERENCE_KEY)!!
8688
}
8789

90+
private val cryptoInfoDeviceNamePreference by lazy {
91+
findPreference<VectorPreference>("SETTINGS_ENCRYPTION_INFORMATION_DEVICE_NAME_PREFERENCE_KEY")!!
92+
}
93+
94+
private val cryptoInfoDeviceIdPreference by lazy {
95+
findPreference<VectorPreference>("SETTINGS_ENCRYPTION_INFORMATION_DEVICE_ID_PREFERENCE_KEY")!!
96+
}
97+
98+
private val cryptoInfoDeviceKeyPreference by lazy {
99+
findPreference<VectorPreference>("SETTINGS_ENCRYPTION_INFORMATION_DEVICE_KEY_PREFERENCE_KEY")!!
100+
}
101+
88102
private val mCrossSigningStatePreference by lazy {
89103
findPreference<VectorPreference>(VectorPreferences.SETTINGS_ENCRYPTION_CROSS_SIGNING_PREFERENCE_KEY)!!
90104
}
@@ -225,9 +239,6 @@ class VectorSettingsSecurityPrivacyFragment @Inject constructor(
225239
}
226240

227241
override fun bindPref() {
228-
// Push target
229-
refreshPushersList()
230-
231242
// Refresh Key Management section
232243
refreshKeysManagementSection()
233244

@@ -488,58 +499,48 @@ class VectorSettingsSecurityPrivacyFragment @Inject constructor(
488499

489500
/**
490501
* Build the cryptography preference section.
491-
*
492-
* @param aMyDeviceInfo the device info
493502
*/
494503
private fun refreshCryptographyPreference(devices: List<DeviceInfo>) {
495504
showDeviceListPref.isEnabled = devices.isNotEmpty()
496505
showDeviceListPref.summary = resources.getQuantityString(R.plurals.settings_active_sessions_count, devices.size, devices.size)
497-
// val userId = session.myUserId
498-
// val deviceId = session.sessionParams.deviceId
499-
500-
// device name
501-
// if (null != aMyDeviceInfo) {
502-
// cryptoInfoDeviceNamePreference.summary = aMyDeviceInfo.displayName
503-
//
504-
// cryptoInfoDeviceNamePreference.onPreferenceClickListener = Preference.OnPreferenceClickListener {
505-
// // TODO device can be rename only from the device list screen for the moment
506-
// // displayDeviceRenameDialog(aMyDeviceInfo)
507-
// true
508-
// }
509-
//
510-
// cryptoInfoDeviceNamePreference.onPreferenceLongClickListener = object : VectorPreference.OnPreferenceLongClickListener {
511-
// override fun onPreferenceLongClick(preference: Preference): Boolean {
512-
// activity?.let { copyToClipboard(it, aMyDeviceInfo.displayName!!) }
513-
// return true
514-
// }
515-
// }
516-
// }
517-
//
518-
// // crypto section: device ID
519-
// if (!deviceId.isNullOrEmpty()) {
520-
// cryptoInfoDeviceIdPreference.summary = deviceId
521-
//
522-
// cryptoInfoDeviceIdPreference.setOnPreferenceClickListener {
523-
// activity?.let { copyToClipboard(it, deviceId) }
524-
// true
525-
// }
526-
// }
527-
//
528-
// // crypto section: device key (fingerprint)
529-
// if (!deviceId.isNullOrEmpty() && userId.isNotEmpty()) {
530-
// val deviceInfo = session.getDeviceInfo(userId, deviceId)
531-
//
532-
// if (null != deviceInfo && !deviceInfo.fingerprint().isNullOrEmpty()) {
533-
// cryptoInfoTextPreference.summary = deviceInfo.getFingerprintHumanReadable()
534-
//
535-
// cryptoInfoTextPreference.setOnPreferenceClickListener {
536-
// deviceInfo.fingerprint()?.let {
537-
// copyToClipboard(requireActivity(), it)
538-
// }
539-
// true
540-
// }
541-
// }
542-
// }
506+
507+
val userId = session.myUserId
508+
val deviceId = session.sessionParams.deviceId
509+
510+
val aMyDeviceInfo = devices.find { it.deviceId == deviceId }
511+
512+
// crypto section: device name
513+
if (aMyDeviceInfo != null) {
514+
cryptoInfoDeviceNamePreference.summary = aMyDeviceInfo.displayName
515+
516+
cryptoInfoDeviceNamePreference.onPreferenceClickListener = Preference.OnPreferenceClickListener {
517+
copyToClipboard(requireActivity(), aMyDeviceInfo.displayName ?: "")
518+
true
519+
}
520+
}
521+
522+
// crypto section: device ID
523+
if (!deviceId.isNullOrEmpty()) {
524+
cryptoInfoDeviceIdPreference.summary = deviceId
525+
526+
cryptoInfoDeviceIdPreference.setOnPreferenceClickListener {
527+
copyToClipboard(requireActivity(), deviceId)
528+
true
529+
}
530+
}
531+
532+
// crypto section: device key (fingerprint)
533+
val deviceInfo = session.cryptoService().getDeviceInfo(userId, deviceId)
534+
535+
val fingerprint = deviceInfo?.fingerprint()
536+
if (fingerprint?.isNotEmpty() == true) {
537+
cryptoInfoDeviceKeyPreference.summary = deviceInfo.getFingerprintHumanReadable()
538+
539+
cryptoInfoDeviceKeyPreference.setOnPreferenceClickListener {
540+
copyToClipboard(requireActivity(), fingerprint)
541+
true
542+
}
543+
}
543544

544545
sendToUnverifiedDevicesPref.isChecked = session.cryptoService().getGlobalBlacklistUnverifiedDevices()
545546

@@ -580,103 +581,8 @@ class VectorSettingsSecurityPrivacyFragment @Inject constructor(
580581
})
581582
}
582583

583-
// ==============================================================================================================
584-
// pushers list management
585-
// ==============================================================================================================
586-
587-
/**
588-
* Refresh the pushers list
589-
*/
590-
private fun refreshPushersList() {
591-
activity?.let { _ ->
592-
/* TODO
593-
val pushManager = Matrix.getInstance(activity).pushManager
594-
val pushersList = ArrayList(pushManager.mPushersList)
595-
596-
if (pushersList.isEmpty()) {
597-
preferenceScreen.removePreference(mPushersSettingsCategory)
598-
preferenceScreen.removePreference(mPushersSettingsDivider)
599-
return
600-
}
601-
602-
// check first if there is an update
603-
var isNewList = true
604-
if (pushersList.size == mDisplayedPushers.size) {
605-
isNewList = !mDisplayedPushers.containsAll(pushersList)
606-
}
607-
608-
if (isNewList) {
609-
// remove the displayed one
610-
mPushersSettingsCategory.removeAll()
611-
612-
// add new emails list
613-
mDisplayedPushers = pushersList
614-
615-
var index = 0
616-
617-
for (pushRule in mDisplayedPushers) {
618-
if (null != pushRule.lang) {
619-
val isThisDeviceTarget = TextUtils.equals(pushManager.currentRegistrationToken, pushRule.pushkey)
620-
621-
val preference = VectorPreference(activity).apply {
622-
mTypeface = if (isThisDeviceTarget) Typeface.BOLD else Typeface.NORMAL
623-
}
624-
preference.title = pushRule.deviceDisplayName
625-
preference.summary = pushRule.appDisplayName
626-
preference.key = PUSHER_PREFERENCE_KEY_BASE + index
627-
index++
628-
mPushersSettingsCategory.addPreference(preference)
629-
630-
// the user cannot remove the self device target
631-
if (!isThisDeviceTarget) {
632-
preference.onPreferenceLongClickListener = object : VectorPreference.OnPreferenceLongClickListener {
633-
override fun onPreferenceLongClick(preference: Preference): Boolean {
634-
AlertDialog.Builder(activity)
635-
.setTitle(R.string.dialog_title_confirmation)
636-
.setMessage(R.string.settings_delete_notification_targets_confirmation)
637-
.setPositiveButton(R.string.remove)
638-
{ _, _ ->
639-
displayLoadingView()
640-
pushManager.unregister(session, pushRule, object : MatrixCallback<Unit> {
641-
override fun onSuccess(info: Void?) {
642-
refreshPushersList()
643-
onCommonDone(null)
644-
}
645-
646-
override fun onNetworkError(e: Exception) {
647-
onCommonDone(e.localizedMessage)
648-
}
649-
650-
override fun onMatrixError(e: MatrixError) {
651-
onCommonDone(e.localizedMessage)
652-
}
653-
654-
override fun onUnexpectedError(e: Exception) {
655-
onCommonDone(e.localizedMessage)
656-
}
657-
})
658-
}
659-
.setNegativeButton(R.string.cancel, null)
660-
.show()
661-
return true
662-
}
663-
}
664-
}
665-
}
666-
}
667-
}
668-
*/
669-
}
670-
}
671-
672584
companion object {
673585
private const val REQUEST_E2E_FILE_REQUEST_CODE = 123
674586
private const val REQUEST_CODE_SAVE_MEGOLM_EXPORT = 124
675-
676-
private const val PUSHER_PREFERENCE_KEY_BASE = "PUSHER_PREFERENCE_KEY_BASE"
677-
private const val DEVICES_PREFERENCE_KEY_BASE = "DEVICES_PREFERENCE_KEY_BASE"
678-
679-
// TODO i18n
680-
const val LABEL_UNAVAILABLE_DATA = "none"
681587
}
682588
}

vector/src/main/res/values/strings.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1054,7 +1054,7 @@
10541054
<string name="encryption_information_device_name_with_warning">Public name (visible to people you communicate with)</string>
10551055
<string name="device_name_warning">"A session's public name is visible to people you communicate with"</string>
10561056
<string name="encryption_information_name">Public name</string>
1057-
<string name="encryption_information_device_id">ID</string>
1057+
<string name="encryption_information_device_id">Session ID</string>
10581058
<string name="encryption_information_device_key">Session key</string>
10591059
<string name="encryption_information_verification">Verification</string>
10601060
<string name="encryption_information_ed25519_fingerprint">Ed25519 fingerprint</string>

vector/src/main/res/xml/vector_settings_security_privacy.xml

+17-12
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@
77
android:icon="@drawable/ic_notification_privacy_warning"
88
android:key="SETTINGS_CRYPTOGRAPHY_HS_ADMIN_DISABLED_E2E_DEFAULT"
99
android:persistent="false"
10-
tools:summary="@string/settings_hs_admin_e2e_disabled"
1110
app:isPreferenceVisible="false"
12-
tools:isPreferenceVisible="true">
11+
tools:isPreferenceVisible="true"
12+
tools:summary="@string/settings_hs_admin_e2e_disabled">
1313

1414
</im.vector.app.core.preference.VectorPreference>
1515

@@ -25,18 +25,23 @@
2525
tools:icon="@drawable/ic_shield_trusted"
2626
tools:summary="@string/encryption_information_dg_xsigning_complete" />
2727

28+
<im.vector.app.core.preference.VectorPreference
29+
android:key="SETTINGS_ENCRYPTION_INFORMATION_DEVICE_NAME_PREFERENCE_KEY"
30+
android:persistent="false"
31+
android:title="@string/encryption_information_device_name"
32+
tools:summary="My public device name" />
2833

29-
<!-- <im.vector.app.core.preference.VectorPreference-->
30-
<!-- android:key="SETTINGS_ENCRYPTION_INFORMATION_DEVICE_NAME_PREFERENCE_KEY"-->
31-
<!-- android:title="@string/encryption_information_device_name" />-->
32-
33-
<!-- <im.vector.app.core.preference.VectorPreference-->
34-
<!-- android:key="SETTINGS_ENCRYPTION_INFORMATION_DEVICE_ID_PREFERENCE_KEY"-->
35-
<!-- android:title="@string/encryption_information_device_id" />-->
34+
<im.vector.app.core.preference.VectorPreference
35+
android:key="SETTINGS_ENCRYPTION_INFORMATION_DEVICE_ID_PREFERENCE_KEY"
36+
android:persistent="false"
37+
android:title="@string/encryption_information_device_id"
38+
tools:summary="VZRHETBEER" />
3639

37-
<!-- <im.vector.app.core.preference.VectorPreference-->
38-
<!-- android:key="SETTINGS_ENCRYPTION_INFORMATION_DEVICE_KEY_PREFERENCE_KEY"-->
39-
<!-- android:title="@string/encryption_information_device_key" />-->
40+
<im.vector.app.core.preference.VectorPreference
41+
android:key="SETTINGS_ENCRYPTION_INFORMATION_DEVICE_KEY_PREFERENCE_KEY"
42+
android:persistent="false"
43+
android:title="@string/encryption_information_device_key"
44+
tools:summary="3To0 8c/K VRJd 4Njb DUgv 6r8A SNp9 ETZt pMwU CpE4 XJE" />
4045

4146
<im.vector.app.core.preference.VectorSwitchPreference
4247
android:enabled="true"

0 commit comments

Comments
 (0)