mirror of
https://github.com/vector-im/element-android.git
synced 2024-11-15 01:35:07 +08:00
Merge branch 'develop' into feature/display_device_key
This commit is contained in:
commit
15c9d68175
@ -7,11 +7,13 @@ Features ✨:
|
||||
Improvements 🙌:
|
||||
- Give user the possibility to prevent accidental call (#1869)
|
||||
- Display device information (name, id and key) in Cryptography setting screen (#1784)
|
||||
- Ensure users do not accidentally ignore other users (#1890)
|
||||
|
||||
Bugfix 🐛:
|
||||
- Fix invisible toolbar (Status.im theme) (#1746)
|
||||
- Fix relative date time formatting (#822)
|
||||
- Fix crash reported by RageShake
|
||||
- Fix refreshing of sessions list when another session is logged out
|
||||
|
||||
Translations 🗣:
|
||||
- Add PlayStore description resources in the Triple-T format, to let Weblate handle them
|
||||
|
@ -71,7 +71,7 @@ class RxSession(private val session: Session) {
|
||||
}
|
||||
}
|
||||
|
||||
fun liveMyDeviceInfo(): Observable<List<DeviceInfo>> {
|
||||
fun liveMyDevicesInfo(): Observable<List<DeviceInfo>> {
|
||||
return session.cryptoService().getLiveMyDevicesInfo().asObservable()
|
||||
.startWithCallable {
|
||||
session.cryptoService().getMyDevicesInfo()
|
||||
|
@ -39,11 +39,8 @@ internal data class UploadSignatureQueryBuilder(
|
||||
fun build(): Map<String, Map<String, @JvmSuppressWildcards Any>> {
|
||||
val map = HashMap<String, HashMap<String, Any>>()
|
||||
|
||||
val usersList = (
|
||||
deviceInfoList.map { it.userId }
|
||||
+ signingKeyInfoList
|
||||
.map { it.userId }
|
||||
).distinct()
|
||||
val usersList = (deviceInfoList.map { it.userId } + signingKeyInfoList.map { it.userId })
|
||||
.distinct()
|
||||
|
||||
usersList.forEach { userID ->
|
||||
val userMap = HashMap<String, Any>()
|
||||
|
@ -18,14 +18,14 @@
|
||||
package org.matrix.android.sdk.internal.session.user.accountdata
|
||||
|
||||
import com.zhuinden.monarchy.Monarchy
|
||||
import org.greenrobot.eventbus.EventBus
|
||||
import org.matrix.android.sdk.api.session.accountdata.UserAccountDataTypes
|
||||
import org.matrix.android.sdk.internal.database.model.IgnoredUserEntity
|
||||
import org.matrix.android.sdk.internal.di.SessionDatabase
|
||||
import org.matrix.android.sdk.internal.di.UserId
|
||||
import org.matrix.android.sdk.internal.network.executeRequest
|
||||
import org.matrix.android.sdk.internal.session.sync.model.accountdata.IgnoredUsersContent
|
||||
import org.matrix.android.sdk.api.session.accountdata.UserAccountDataTypes
|
||||
import org.matrix.android.sdk.internal.task.Task
|
||||
import org.greenrobot.eventbus.EventBus
|
||||
import javax.inject.Inject
|
||||
|
||||
internal interface UpdateIgnoredUserIdsTask : Task<UpdateIgnoredUserIdsTask.Params, Unit> {
|
||||
@ -51,7 +51,7 @@ internal class DefaultUpdateIgnoredUserIdsTask @Inject constructor(
|
||||
{ it.userId }
|
||||
).toMutableSet()
|
||||
|
||||
val original = ignoredUserIds.toList()
|
||||
val original = ignoredUserIds.toSet()
|
||||
|
||||
ignoredUserIds.removeAll { it in params.userIdsToUnIgnore }
|
||||
ignoredUserIds.addAll(params.userIdsToIgnore)
|
||||
|
@ -66,7 +66,7 @@ class BootstrapAccountPasswordFragment @Inject constructor(
|
||||
.disposeOnDestroyView()
|
||||
|
||||
bootstrapAccountPasswordEditText.textChanges()
|
||||
.distinct()
|
||||
.distinctUntilChanged()
|
||||
.subscribe {
|
||||
if (!it.isNullOrBlank()) {
|
||||
bootstrapAccountPasswordTil.error = null
|
||||
|
@ -61,7 +61,7 @@ class ShortcutsHandler @Inject constructor(
|
||||
|
||||
return homeRoomListStore
|
||||
.observe()
|
||||
.distinct()
|
||||
.distinctUntilChanged()
|
||||
.observeOn(Schedulers.computation())
|
||||
.subscribe { rooms ->
|
||||
val shortcuts = rooms
|
||||
|
@ -100,7 +100,7 @@ class UnknownDeviceDetectorSharedViewModel @AssistedInject constructor(@Assisted
|
||||
|
||||
Observable.combineLatest<List<CryptoDeviceInfo>, List<DeviceInfo>, Optional<PrivateKeysInfo>, List<DeviceDetectionInfo>>(
|
||||
session.rx().liveUserCryptoDevices(session.myUserId),
|
||||
session.rx().liveMyDeviceInfo(),
|
||||
session.rx().liveMyDevicesInfo(),
|
||||
session.rx().liveCrossSigningPrivateKeys(),
|
||||
Function3 { cryptoList, infoList, pInfo ->
|
||||
// Timber.v("## Detector trigger ${cryptoList.map { "${it.deviceId} ${it.trustLevel}" }}")
|
||||
@ -133,12 +133,13 @@ class UnknownDeviceDetectorSharedViewModel @AssistedInject constructor(@Assisted
|
||||
}
|
||||
|
||||
session.rx().liveUserCryptoDevices(session.myUserId)
|
||||
.distinct()
|
||||
.distinctUntilChanged()
|
||||
.throttleLast(5_000, TimeUnit.MILLISECONDS)
|
||||
.subscribe {
|
||||
// If we have a new crypto device change, we might want to trigger refresh of device info
|
||||
session.cryptoService().fetchDevicesList(NoOpMatrixCallback())
|
||||
}.disposeOnClear()
|
||||
}
|
||||
.disposeOnClear()
|
||||
|
||||
// trigger a refresh of lastSeen / last Ip
|
||||
session.cryptoService().fetchDevicesList(NoOpMatrixCallback())
|
||||
|
@ -1491,7 +1491,7 @@ class RoomDetailFragment @Inject constructor(
|
||||
promptReasonToReportContent(action)
|
||||
}
|
||||
is EventSharedAction.IgnoreUser -> {
|
||||
roomDetailViewModel.handle(RoomDetailAction.IgnoreUser(action.senderId))
|
||||
action.senderId?.let { askConfirmationToIgnoreUser(it) }
|
||||
}
|
||||
is EventSharedAction.OnUrlClicked -> {
|
||||
onUrlClicked(action.url, action.title)
|
||||
@ -1507,12 +1507,21 @@ class RoomDetailFragment @Inject constructor(
|
||||
startActivity(KeysBackupRestoreActivity.intent(it))
|
||||
}
|
||||
}
|
||||
else -> {
|
||||
Toast.makeText(context, "Action $action is not implemented yet", Toast.LENGTH_LONG).show()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun askConfirmationToIgnoreUser(senderId: String) {
|
||||
AlertDialog.Builder(requireContext())
|
||||
.setTitle(R.string.room_participants_action_ignore_title)
|
||||
.setMessage(R.string.room_participants_action_ignore_prompt_msg)
|
||||
.setNegativeButton(R.string.cancel, null)
|
||||
.setPositiveButton(R.string.room_participants_action_ignore) { _, _ ->
|
||||
roomDetailViewModel.handle(RoomDetailAction.IgnoreUser(senderId))
|
||||
}
|
||||
.show()
|
||||
.withColoredButton(DialogInterface.BUTTON_POSITIVE)
|
||||
}
|
||||
|
||||
/**
|
||||
* Insert a user displayName in the message editor.
|
||||
*
|
||||
|
@ -37,10 +37,10 @@ class CrossSigningSettingsViewModel @AssistedInject constructor(@Assisted privat
|
||||
|
||||
init {
|
||||
Observable.combineLatest<List<DeviceInfo>, Optional<MXCrossSigningInfo>, Pair<List<DeviceInfo>, Optional<MXCrossSigningInfo>>>(
|
||||
session.rx().liveMyDeviceInfo(),
|
||||
session.rx().liveMyDevicesInfo(),
|
||||
session.rx().liveCrossSigningInfo(session.myUserId),
|
||||
BiFunction { myDeviceInfo, mxCrossSigningInfo ->
|
||||
(myDeviceInfo to mxCrossSigningInfo)
|
||||
BiFunction { myDevicesInfo, mxCrossSigningInfo ->
|
||||
myDevicesInfo to mxCrossSigningInfo
|
||||
}
|
||||
)
|
||||
.execute { data ->
|
||||
|
@ -81,7 +81,7 @@ class DeviceVerificationInfoBottomSheetViewModel @AssistedInject constructor(@As
|
||||
copy(deviceInfo = Loading())
|
||||
}
|
||||
|
||||
session.rx().liveMyDeviceInfo()
|
||||
session.rx().liveMyDevicesInfo()
|
||||
.map { devices ->
|
||||
devices.firstOrNull { it.deviceId == deviceId } ?: DeviceInfo(deviceId = deviceId)
|
||||
}
|
||||
|
@ -103,7 +103,7 @@ class DevicesViewModel @AssistedInject constructor(
|
||||
|
||||
Observable.combineLatest<List<CryptoDeviceInfo>, List<DeviceInfo>, List<DeviceFullInfo>>(
|
||||
session.rx().liveUserCryptoDevices(session.myUserId),
|
||||
session.rx().liveMyDeviceInfo(),
|
||||
session.rx().liveMyDevicesInfo(),
|
||||
BiFunction { cryptoList, infoList ->
|
||||
infoList
|
||||
.sortedByDescending { it.lastSeenTs }
|
||||
@ -113,7 +113,7 @@ class DevicesViewModel @AssistedInject constructor(
|
||||
}
|
||||
}
|
||||
)
|
||||
.distinct()
|
||||
.distinctUntilChanged()
|
||||
.execute { async ->
|
||||
copy(
|
||||
devices = async
|
||||
@ -137,12 +137,14 @@ class DevicesViewModel @AssistedInject constructor(
|
||||
// }
|
||||
|
||||
session.rx().liveUserCryptoDevices(session.myUserId)
|
||||
.distinct()
|
||||
.map { it.size }
|
||||
.distinctUntilChanged()
|
||||
.throttleLast(5_000, TimeUnit.MILLISECONDS)
|
||||
.subscribe {
|
||||
// If we have a new crypto device change, we might want to trigger refresh of device info
|
||||
session.cryptoService().fetchDevicesList(NoOpMatrixCallback())
|
||||
}.disposeOnClear()
|
||||
}
|
||||
.disposeOnClear()
|
||||
|
||||
// session.rx().liveUserCryptoDevices(session.myUserId)
|
||||
// .execute {
|
||||
|
@ -1801,7 +1801,7 @@
|
||||
<string name="report_content_custom_title">"Report this content"</string>
|
||||
<string name="report_content_custom_hint">"Reason for reporting this content"</string>
|
||||
<string name="report_content_custom_submit">"REPORT"</string>
|
||||
<string name="block_user">"BLOCK USER"</string>
|
||||
<string name="block_user">"IGNORE USER"</string>
|
||||
|
||||
<string name="content_reported_title">"Content reported"</string>
|
||||
<string name="content_reported_content">"This content was reported.\n\nIf you don't want to see any more content from this user, you can block him to hide his messages"</string>
|
||||
@ -1814,7 +1814,7 @@
|
||||
|
||||
<string name="no_network_indicator">There is no network connection right now</string>
|
||||
|
||||
<string name="message_ignore_user">Block user</string>
|
||||
<string name="message_ignore_user">Ignore user</string>
|
||||
|
||||
<string name="room_list_quick_actions_notifications_all_noisy">"All messages (noisy)"</string>
|
||||
<string name="room_list_quick_actions_notifications_all">"All messages"</string>
|
||||
|
Loading…
Reference in New Issue
Block a user