diff --git a/build.gradle b/build.gradle
index f6838293d7..a425f6f02e 100644
--- a/build.gradle
+++ b/build.gradle
@@ -29,7 +29,7 @@ buildscript {
classpath 'org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:3.5.0.2730'
classpath 'com.google.android.gms:oss-licenses-plugin:0.10.5'
classpath "com.likethesalad.android:stem-plugin:2.2.3"
- classpath 'org.owasp:dependency-check-gradle:7.4.3'
+ classpath 'org.owasp:dependency-check-gradle:7.4.4'
classpath "org.jetbrains.dokka:dokka-gradle-plugin:1.7.20"
classpath "org.jetbrains.kotlinx:kotlinx-knit:0.4.0"
classpath 'com.jakewharton:butterknife-gradle-plugin:10.2.3'
diff --git a/changelog.d/7913.bugfix b/changelog.d/7913.bugfix
new file mode 100644
index 0000000000..32b821f14d
--- /dev/null
+++ b/changelog.d/7913.bugfix
@@ -0,0 +1 @@
+Handle network error on API `rooms/{roomId}/threads`
diff --git a/dependencies.gradle b/dependencies.gradle
index 76ff9b0c6f..e970457e7c 100644
--- a/dependencies.gradle
+++ b/dependencies.gradle
@@ -101,7 +101,7 @@ ext.libs = [
],
element : [
'opusencoder' : "io.element.android:opusencoder:1.1.0",
- 'wysiwyg' : "io.element.android:wysiwyg:0.13.0"
+ 'wysiwyg' : "io.element.android:wysiwyg:0.14.0"
],
squareup : [
'moshi' : "com.squareup.moshi:moshi:$moshi",
diff --git a/fastlane/metadata/android/it-IT/changelogs/40105160.txt b/fastlane/metadata/android/it-IT/changelogs/40105160.txt
new file mode 100644
index 0000000000..ab24842e82
--- /dev/null
+++ b/fastlane/metadata/android/it-IT/changelogs/40105160.txt
@@ -0,0 +1,2 @@
+Modifiche principali in questa versione: i messaggi in conversazioni sono attivi in modo predefinito.
+Cronologia completa: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/it-IT/changelogs/40105180.txt b/fastlane/metadata/android/it-IT/changelogs/40105180.txt
new file mode 100644
index 0000000000..ab24842e82
--- /dev/null
+++ b/fastlane/metadata/android/it-IT/changelogs/40105180.txt
@@ -0,0 +1,2 @@
+Modifiche principali in questa versione: i messaggi in conversazioni sono attivi in modo predefinito.
+Cronologia completa: https://github.com/vector-im/element-android/releases
diff --git a/library/ui-strings/src/main/res/values-de/strings.xml b/library/ui-strings/src/main/res/values-de/strings.xml
index 3f2ea694ca..52b8f0c716 100644
--- a/library/ui-strings/src/main/res/values-de/strings.xml
+++ b/library/ui-strings/src/main/res/values-de/strings.xml
@@ -2889,4 +2889,13 @@
Link erstellen
Link
Text
+ Dein Zugriffstoken gewährt vollen Zugriff auf dein Konto. Teile ihn mit niemandem.
+ Zugriffstoken
+ Unsortierte Liste umschalten
+ Nummerierte Liste umschalten
+ In diesem Raum gibt es noch keine abgeschlossenen Umfragen
+ Vergangene Umfragen
+ In diesem Raum gibt es keine aktiven Umfragen
+ Aktive Umfragen
+ Umfrageverlauf
\ No newline at end of file
diff --git a/library/ui-strings/src/main/res/values-et/strings.xml b/library/ui-strings/src/main/res/values-et/strings.xml
index 490145b5cc..1e8e2b989e 100644
--- a/library/ui-strings/src/main/res/values-et/strings.xml
+++ b/library/ui-strings/src/main/res/values-et/strings.xml
@@ -2881,4 +2881,13 @@
Link
Loo link
Muuda linki
+ Küsitluste ajalugu
+ Käimasolevad küsitlused
+ Selles jututoas pole käimasolevaid küsitlusi
+ Varasemad küsitlused
+ Selles jututoas pole varasemaid küsitlusi
+ Lülita nummerdatud loend sisse/välja
+ Lülita täpploend sisse/välja
+ Pääsuluba
+ Sinu pääsuluba annab täismahulise ligipääsu sinu kasutajakontole. Palun ära jaga seda teistega.
\ No newline at end of file
diff --git a/library/ui-strings/src/main/res/values-fa/strings.xml b/library/ui-strings/src/main/res/values-fa/strings.xml
index 56dbe912c1..4db3812237 100644
--- a/library/ui-strings/src/main/res/values-fa/strings.xml
+++ b/library/ui-strings/src/main/res/values-fa/strings.xml
@@ -2890,4 +2890,13 @@
پیوند
متن
تنظیم پیوند
+ ژتون دسترسیتان، دسترسی کامل به حسابتان را میدهد. با هیچکس همرسانیش نکنید.
+ ژتون دسترسی
+ تغییر وضعیت سیاههٔ گلولهای
+ تغییر وضعیت سیاههٔ شمارهدار
+ هیچ نظرسنجی قدیمیای در این اتاق وجود ندارد
+ نظرسنجیهای گذشته
+ هیچ نظرسنجی فعّالی در این اتاق وجود ندارد
+ نظرسنجیهای فعّال
+ تاریخچهٔ نظرسنجیها
\ No newline at end of file
diff --git a/library/ui-strings/src/main/res/values-fr/strings.xml b/library/ui-strings/src/main/res/values-fr/strings.xml
index 33f1410502..cb1684f834 100644
--- a/library/ui-strings/src/main/res/values-fr/strings.xml
+++ b/library/ui-strings/src/main/res/values-fr/strings.xml
@@ -2890,4 +2890,13 @@
Lien
Texte
Définir un lien
+ Votre jeton d’accès donne un accès intégral à votre compte. Ne le partagez avec personne.
+ Jeton d’accès
+ (Dés)activer la liste à puce
+ (Dés)activer la liste numérotée
+ Il n’y a aucun ancien sondage dans ce salon
+ Anciens sondages
+ Il n’y a aucun sondage en cours dans ce salon
+ Sondages actifs
+ Historique des sondages
\ No newline at end of file
diff --git a/library/ui-strings/src/main/res/values-in/strings.xml b/library/ui-strings/src/main/res/values-in/strings.xml
index 8715aa84e0..8896037037 100644
--- a/library/ui-strings/src/main/res/values-in/strings.xml
+++ b/library/ui-strings/src/main/res/values-in/strings.xml
@@ -2836,4 +2836,13 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan.
Tautan
Teks
Atur tautan
+ Token akses Anda memberikan akses penuh ke akun Anda. Jangan bagikan dengan siapa pun.
+ Token Akses
+ Saklar daftar bulat
+ Saklar daftar bernomor
+ Tidak ada pemungutan suara sebelumnya di ruangan ini
+ Pemungutan suara sebelumnya
+ Tidak ada pemungutan suara yang aktif di ruangan ini
+ Pemungutan suara aktif
+ Riwayat pemungutan suara
\ No newline at end of file
diff --git a/library/ui-strings/src/main/res/values-it/strings.xml b/library/ui-strings/src/main/res/values-it/strings.xml
index b1721449ad..729b826982 100644
--- a/library/ui-strings/src/main/res/values-it/strings.xml
+++ b/library/ui-strings/src/main/res/values-it/strings.xml
@@ -2881,4 +2881,13 @@
Collegamento
Testo
Imposta collegamento
+ Il tuo token di accesso ti dà l\'accesso al tuo account. Non condividerlo con nessuno.
+ Token di accesso
+ Attiva/disattiva elenco numerato
+ Attiva/disattiva elenco puntato
+ In questa stanza non ci sono sondaggi passati
+ Sondaggi passati
+ In questa stanza non ci sono sondaggi attivi
+ Sondaggi attivi
+ Cronologia sondaggi
\ No newline at end of file
diff --git a/library/ui-strings/src/main/res/values-sk/strings.xml b/library/ui-strings/src/main/res/values-sk/strings.xml
index d46b4e8898..34155ba6a5 100644
--- a/library/ui-strings/src/main/res/values-sk/strings.xml
+++ b/library/ui-strings/src/main/res/values-sk/strings.xml
@@ -2946,4 +2946,13 @@
Odkaz
Text
Nastaviť odkaz
+ Váš prístupový token poskytuje úplný prístup k vášmu účtu. S nikým ho nezdieľajte.
+ Prístupový token
+ Prepnúť na číslovaný zoznam
+ Prepnúť zoznam s odrážkami
+ V tejto miestnosti nie sú žiadne predchádzajúce ankety
+ Predchádzajúce ankety
+ V tejto miestnosti nie sú žiadne aktívne ankety
+ Aktívne ankety
+ História ankety
\ No newline at end of file
diff --git a/library/ui-strings/src/main/res/values-sq/strings.xml b/library/ui-strings/src/main/res/values-sq/strings.xml
index b170d306e4..c3f9d53c99 100644
--- a/library/ui-strings/src/main/res/values-sq/strings.xml
+++ b/library/ui-strings/src/main/res/values-sq/strings.xml
@@ -2504,7 +2504,7 @@
%s
\nduket paksa si i zbrazët.
Jini në gjendje të incizoni dhe dërgoni transmetim zanor në rrjedhën kohore të dhomës.
- Aktivizoni transmetim zanor (nën zhvillim aktiv)
+ Aktivizoni transmetim zanor
Aktivizo regjistrim hollësish klienti
Shihini më qartë dhe kontrolloni më mirë krejt sesionet tuaj.
Aktivizo përgjegjës të ri sesionesh
@@ -2874,4 +2874,12 @@
Krijoni një lidhje
Lidhje
Tekst
+ Tokeni juaj i hyrjeve jep hyrje të plotë në llogarinë tuaj. Mos ia jepni kujt.
+ Token Hyrjesh
+ S’ka pyetësorë të kaluar në këtë dhomë
+ Pyetësorë të kaluar
+ S’ka pyetësorë aktivë në këtë dhomë
+ Pyetësorë aktivë
+ mundësia fituese
+ Historik pyetësorësh
\ No newline at end of file
diff --git a/library/ui-strings/src/main/res/values-uk/strings.xml b/library/ui-strings/src/main/res/values-uk/strings.xml
index ebe2dcaf4d..2ee9685c76 100644
--- a/library/ui-strings/src/main/res/values-uk/strings.xml
+++ b/library/ui-strings/src/main/res/values-uk/strings.xml
@@ -3002,4 +3002,13 @@
Посилання
Текст
Налаштувати посилання
+ Ваш токен доступу надає повний доступ до вашого облікового запису. Не передавайте його нікому.
+ Токен доступу
+ Перемкнути на маркований список
+ Перемкнути на нумерований список
+ У цій кімнаті ще не проводилися опитування
+ Минулі опитування
+ У цій кімнаті немає активних опитувань
+ Активні опитування
+ Історія опитувань
\ No newline at end of file
diff --git a/library/ui-strings/src/main/res/values-zh-rTW/strings.xml b/library/ui-strings/src/main/res/values-zh-rTW/strings.xml
index 934f5aa47b..14729c5b44 100644
--- a/library/ui-strings/src/main/res/values-zh-rTW/strings.xml
+++ b/library/ui-strings/src/main/res/values-zh-rTW/strings.xml
@@ -2834,4 +2834,13 @@
連結
文字
設定連結
+ 您的存取權杖可以完整存取您的帳號。不要將其與其他人分享。
+ 存取權杖
+ 切換項目符號清單
+ 切換編號清單
+ 此聊天室沒有過去的投票
+ 過去的投票
+ 此聊天室沒有正在進行的投票
+ 進行中的投票
+ 投票歷史紀錄
\ No newline at end of file
diff --git a/library/ui-strings/src/main/res/values/strings.xml b/library/ui-strings/src/main/res/values/strings.xml
index 4a4af67094..15d9e5c9e6 100644
--- a/library/ui-strings/src/main/res/values/strings.xml
+++ b/library/ui-strings/src/main/res/values/strings.xml
@@ -795,6 +795,7 @@
Shows all threads you’ve participated in
Keep discussions organized with threads
Threads help keep your conversations on-topic and easy to track.
+ You\'re homeserver does not support listing threads yet.
Tip: Long tap a message and use “%s”.
From a Thread
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/Extensions.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/Extensions.kt
index 5b41ddaaec..165dcf079e 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/Extensions.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/Extensions.kt
@@ -25,6 +25,9 @@ import java.io.IOException
import java.net.UnknownHostException
import javax.net.ssl.HttpsURLConnection
+fun Throwable.is400() = this is Failure.ServerError &&
+ httpCode == HttpsURLConnection.HTTP_BAD_REQUEST
+
fun Throwable.is401() = this is Failure.ServerError &&
httpCode == HttpsURLConnection.HTTP_UNAUTHORIZED && /* 401 */
error.code == MatrixError.M_UNAUTHORIZED
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/threads/FetchThreadsResult.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/threads/FetchThreadsResult.kt
index 5d4d67a65e..e3c5deeee7 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/threads/FetchThreadsResult.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/threads/FetchThreadsResult.kt
@@ -19,5 +19,4 @@ package org.matrix.android.sdk.api.session.room.threads
sealed class FetchThreadsResult {
data class ShouldFetchMore(val nextBatch: String) : FetchThreadsResult()
object ReachedEnd : FetchThreadsResult()
- object Failed : FetchThreadsResult()
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/threads/ThreadsService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/threads/ThreadsService.kt
index bb6f6b51d3..dfa6cdeec1 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/threads/ThreadsService.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/threads/ThreadsService.kt
@@ -23,7 +23,7 @@ import org.matrix.android.sdk.api.session.room.threads.model.ThreadSummary
* This interface defines methods to interact with thread related features.
* It's the dynamic threads implementation and the homeserver must return
* a capability entry for threads. If the server do not support m.thread
- * then [ThreadsLocalService] should be used instead
+ * then [org.matrix.android.sdk.api.session.room.threads.local.ThreadsLocalService] should be used instead
*/
interface ThreadsService {
diff --git a/vector/src/main/java/im/vector/app/features/home/room/threads/list/viewmodel/ThreadListViewActions.kt b/vector/src/main/java/im/vector/app/features/home/room/threads/list/viewmodel/ThreadListViewActions.kt
new file mode 100644
index 0000000000..7dda460a5e
--- /dev/null
+++ b/vector/src/main/java/im/vector/app/features/home/room/threads/list/viewmodel/ThreadListViewActions.kt
@@ -0,0 +1,23 @@
+/*
+ * Copyright (c) 2023 New Vector Ltd
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package im.vector.app.features.home.room.threads.list.viewmodel
+
+import im.vector.app.core.platform.VectorViewModelAction
+
+sealed interface ThreadListViewActions : VectorViewModelAction {
+ object TryAgain : ThreadListViewActions
+}
diff --git a/vector/src/main/java/im/vector/app/features/home/room/threads/list/viewmodel/ThreadListViewEvents.kt b/vector/src/main/java/im/vector/app/features/home/room/threads/list/viewmodel/ThreadListViewEvents.kt
new file mode 100644
index 0000000000..3e9af034f4
--- /dev/null
+++ b/vector/src/main/java/im/vector/app/features/home/room/threads/list/viewmodel/ThreadListViewEvents.kt
@@ -0,0 +1,23 @@
+/*
+ * Copyright (c) 2023 New Vector Ltd
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package im.vector.app.features.home.room.threads.list.viewmodel
+
+import im.vector.app.core.platform.VectorViewEvents
+
+sealed interface ThreadListViewEvents : VectorViewEvents {
+ data class ShowError(val throwable: Throwable) : ThreadListViewEvents
+}
diff --git a/vector/src/main/java/im/vector/app/features/home/room/threads/list/viewmodel/ThreadListViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/threads/list/viewmodel/ThreadListViewModel.kt
index 7124727bb7..f31f19849c 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/threads/list/viewmodel/ThreadListViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/threads/list/viewmodel/ThreadListViewModel.kt
@@ -27,8 +27,6 @@ import com.airbnb.mvrx.ViewModelContext
import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
-import im.vector.app.core.platform.EmptyAction
-import im.vector.app.core.platform.EmptyViewEvents
import im.vector.app.core.platform.VectorViewModel
import im.vector.app.features.analytics.AnalyticsTracker
import im.vector.app.features.analytics.extensions.toAnalyticsInteraction
@@ -52,7 +50,7 @@ class ThreadListViewModel @AssistedInject constructor(
@Assisted val initialState: ThreadListViewState,
private val analyticsTracker: AnalyticsTracker,
private val session: Session,
-) : VectorViewModel(initialState) {
+) : VectorViewModel(initialState) {
private val room = session.getRoom(initialState.roomId)
@@ -93,7 +91,17 @@ class ThreadListViewModel @AssistedInject constructor(
fetchAndObserveThreads()
}
- override fun handle(action: EmptyAction) {}
+ override fun handle(action: ThreadListViewActions) {
+ when (action) {
+ ThreadListViewActions.TryAgain -> handleTryAgain()
+ }
+ }
+
+ private fun handleTryAgain() {
+ viewModelScope.launch {
+ fetchNextPage()
+ }
+ }
/**
* Observing thread list with respect to homeserver capabilities.
@@ -181,21 +189,23 @@ class ThreadListViewModel @AssistedInject constructor(
true -> ThreadFilter.PARTICIPATED
false -> ThreadFilter.ALL
}
- room?.threadsService()?.fetchThreadList(
- nextBatchId = nextBatchId,
- limit = defaultPagedListConfig.pageSize,
- filter = filter,
- ).let { result ->
- when (result) {
- is FetchThreadsResult.ReachedEnd -> {
- hasReachedEnd = true
- }
- is FetchThreadsResult.ShouldFetchMore -> {
- nextBatchId = result.nextBatch
- }
- else -> {
+ try {
+ room?.threadsService()?.fetchThreadList(
+ nextBatchId = nextBatchId,
+ limit = defaultPagedListConfig.pageSize,
+ filter = filter,
+ )?.let { result ->
+ when (result) {
+ is FetchThreadsResult.ReachedEnd -> {
+ hasReachedEnd = true
+ }
+ is FetchThreadsResult.ShouldFetchMore -> {
+ nextBatchId = result.nextBatch
+ }
}
}
+ } catch (throwable: Throwable) {
+ _viewEvents.post(ThreadListViewEvents.ShowError(throwable))
}
}
}
diff --git a/vector/src/main/java/im/vector/app/features/home/room/threads/list/views/ThreadListFragment.kt b/vector/src/main/java/im/vector/app/features/home/room/threads/list/views/ThreadListFragment.kt
index 318c250906..1e67941856 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/threads/list/views/ThreadListFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/threads/list/views/ThreadListFragment.kt
@@ -26,6 +26,7 @@ import androidx.core.view.isVisible
import com.airbnb.mvrx.args
import com.airbnb.mvrx.fragmentViewModel
import com.airbnb.mvrx.withState
+import com.google.android.material.dialog.MaterialAlertDialogBuilder
import dagger.hilt.android.AndroidEntryPoint
import im.vector.app.R
import im.vector.app.core.extensions.cleanup
@@ -41,10 +42,14 @@ import im.vector.app.features.home.room.threads.arguments.ThreadListArgs
import im.vector.app.features.home.room.threads.arguments.ThreadTimelineArgs
import im.vector.app.features.home.room.threads.list.viewmodel.ThreadListController
import im.vector.app.features.home.room.threads.list.viewmodel.ThreadListPagedController
+import im.vector.app.features.home.room.threads.list.viewmodel.ThreadListViewActions
+import im.vector.app.features.home.room.threads.list.viewmodel.ThreadListViewEvents
import im.vector.app.features.home.room.threads.list.viewmodel.ThreadListViewModel
import im.vector.app.features.home.room.threads.list.viewmodel.ThreadListViewState
import im.vector.app.features.rageshake.BugReporter
import im.vector.app.features.rageshake.ReportType
+import org.matrix.android.sdk.api.failure.is400
+import org.matrix.android.sdk.api.failure.is404
import org.matrix.android.sdk.api.session.room.threads.model.ThreadSummary
import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent
import org.matrix.android.sdk.api.util.MatrixItem
@@ -126,11 +131,45 @@ class ThreadListFragment :
views.threadListRecyclerView.configureWith(legacyThreadListController, TimelineItemAnimator(), hasFixedSize = false)
legacyThreadListController.listener = this
}
+ observeViewEvents()
+ }
+
+ private fun observeViewEvents() {
+ threadListViewModel.observeViewEvents {
+ when (it) {
+ is ThreadListViewEvents.ShowError -> handleShowError(it)
+ }
+ }
+ }
+
+ private fun handleShowError(event: ThreadListViewEvents.ShowError) {
+ val error = event.throwable
+ MaterialAlertDialogBuilder(requireActivity())
+ .setTitle(R.string.dialog_title_error)
+ .also {
+ if (error.is400() || error.is404()) {
+ // Outdated Homeserver
+ it.setMessage(R.string.thread_list_not_available)
+ it.setPositiveButton(R.string.ok) { _, _ ->
+ requireActivity().finish()
+ }
+ } else {
+ // Other error, can retry
+ // (Can happen on first request or on pagination request)
+ it.setMessage(errorFormatter.toHumanReadable(error))
+ it.setPositiveButton(R.string.ok, null)
+ it.setNegativeButton(R.string.global_retry) { _, _ ->
+ threadListViewModel.handle(ThreadListViewActions.TryAgain)
+ }
+ }
+ }
+ .show()
}
override fun onDestroyView() {
views.threadListRecyclerView.cleanup()
threadListController.listener = null
+ legacyThreadListController.listener = null
super.onDestroyView()
}