Skip to content

Commit abe07c7

Browse files
Merge pull request #5775 from vector-im/feature/aris/threads_after_release_experience
Enhance user experience when home servers do not support threads.
2 parents 48680c3 + 1a38b8c commit abe07c7

File tree

6 files changed

+67
-11
lines changed

6 files changed

+67
-11
lines changed

changelog.d/5761.feature

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Improve user experience when home servers do not yet support threads

matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/homeserver/HomeServerCapabilities.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ data class HomeServerCapabilities(
5454
/**
5555
* True if the home server support threading
5656
*/
57-
var canUseThreading: Boolean = false
57+
val canUseThreading: Boolean = false
5858
) {
5959

6060
enum class RoomCapabilitySupport {

vector/src/main/java/im/vector/app/features/home/room/detail/timeline/action/MessageActionsViewModel.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -452,6 +452,10 @@ class MessageActionsViewModel @AssistedInject constructor(
452452
actionPermissions: ActionPermissions): Boolean {
453453
// We let reply in thread visible even if threads are not enabled, with an enhanced flow to attract users
454454
// if (!vectorPreferences.areThreadMessagesEnabled()) return false
455+
// Disable beta prompt if the homeserver do not support threads
456+
if (!vectorPreferences.areThreadMessagesEnabled() &&
457+
!session.getHomeServerCapabilities().canUseThreading) return false
458+
455459
if (initialState.isFromThreadTimeline) return false
456460
if (event.root.isThread()) return false
457461
if (event.root.getClearType() != EventType.MESSAGE &&

vector/src/main/java/im/vector/app/features/home/room/threads/ThreadsManager.kt

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package im.vector.app.features.home.room.threads
1818

1919
import android.app.Activity
2020
import android.text.Spanned
21+
import androidx.annotation.StringRes
2122
import androidx.core.text.HtmlCompat
2223
import im.vector.app.R
2324
import im.vector.app.core.resources.StringProvider
@@ -49,11 +50,17 @@ class ThreadsManager @Inject constructor(
4950
/**
5051
* Generates and return an Html spanned string to be rendered especially in dialogs
5152
*/
52-
fun getBetaEnableThreadsMessage(): Spanned {
53+
private fun generateLearnMoreHtmlString(@StringRes messageId: Int): Spanned {
5354
val learnMore = stringProvider.getString(R.string.action_learn_more)
5455
val learnMoreUrl = stringProvider.getString(R.string.threads_learn_more_url)
5556
val href = "<a href='$learnMoreUrl'>$learnMore</a>.<br><br>"
56-
val message = stringProvider.getString(R.string.threads_beta_enable_notice_message, href)
57+
val message = stringProvider.getString(messageId, href)
5758
return HtmlCompat.fromHtml(message, HtmlCompat.FROM_HTML_MODE_LEGACY)
5859
}
60+
61+
fun getBetaEnableThreadsMessage(): Spanned =
62+
generateLearnMoreHtmlString(R.string.threads_beta_enable_notice_message)
63+
64+
fun getLabsEnableThreadsMessage(): Spanned =
65+
generateLearnMoreHtmlString(R.string.threads_labs_enable_notice_message)
5966
}

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

Lines changed: 49 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,18 +17,23 @@
1717
package im.vector.app.features.settings
1818

1919
import android.os.Bundle
20+
import android.text.method.LinkMovementMethod
21+
import android.widget.TextView
2022
import androidx.preference.Preference
23+
import com.google.android.material.dialog.MaterialAlertDialogBuilder
2124
import im.vector.app.R
2225
import im.vector.app.core.preference.VectorSwitchPreference
2326
import im.vector.app.features.MainActivity
2427
import im.vector.app.features.MainActivityArgs
2528
import im.vector.app.features.analytics.plan.MobileScreen
29+
import im.vector.app.features.home.room.threads.ThreadsManager
2630
import org.matrix.android.sdk.api.settings.LightweightSettingsStorage
2731
import javax.inject.Inject
2832

2933
class VectorSettingsLabsFragment @Inject constructor(
3034
private val vectorPreferences: VectorPreferences,
31-
private val lightweightSettingsStorage: LightweightSettingsStorage
35+
private val lightweightSettingsStorage: LightweightSettingsStorage,
36+
private val threadsManager: ThreadsManager
3237
) : VectorSettingsBaseFragment() {
3338

3439
override var titleRes = R.string.room_settings_labs_pref_title
@@ -46,15 +51,51 @@ class VectorSettingsLabsFragment @Inject constructor(
4651
}
4752

4853
// clear cache
49-
findPreference<VectorSwitchPreference>(VectorPreferences.SETTINGS_LABS_ENABLE_THREAD_MESSAGES)?.let {
50-
it.onPreferenceClickListener = Preference.OnPreferenceClickListener {
51-
// We should migrate threads only if threads are disabled
52-
vectorPreferences.setShouldMigrateThreads(!vectorPreferences.areThreadMessagesEnabled())
53-
lightweightSettingsStorage.setThreadMessagesEnabled(vectorPreferences.areThreadMessagesEnabled())
54-
displayLoadingView()
55-
MainActivity.restartApp(requireActivity(), MainActivityArgs(clearCache = true))
54+
findPreference<VectorSwitchPreference>(VectorPreferences.SETTINGS_LABS_ENABLE_THREAD_MESSAGES)?.let { vectorPref ->
55+
vectorPref.onPreferenceClickListener = Preference.OnPreferenceClickListener {
56+
onThreadsPreferenceClickedInterceptor(vectorPref)
5657
false
5758
}
5859
}
5960
}
61+
62+
/**
63+
* Intercept the click to display a user friendly dialog when their homeserver do not support threads
64+
*/
65+
private fun onThreadsPreferenceClickedInterceptor(vectorSwitchPreference: VectorSwitchPreference) {
66+
val userEnabledThreads = vectorPreferences.areThreadMessagesEnabled()
67+
if (!session.getHomeServerCapabilities().canUseThreading && userEnabledThreads) {
68+
activity?.let {
69+
MaterialAlertDialogBuilder(it)
70+
.setTitle(R.string.threads_labs_enable_notice_title)
71+
.setMessage(threadsManager.getLabsEnableThreadsMessage())
72+
.setCancelable(true)
73+
.setNegativeButton(R.string.action_not_now) { _, _ ->
74+
vectorSwitchPreference.isChecked = false
75+
}
76+
.setPositiveButton(R.string.action_try_it_out) { _, _ ->
77+
onThreadsPreferenceClicked()
78+
}
79+
.show()
80+
?.findViewById<TextView>(android.R.id.message)
81+
?.apply {
82+
linksClickable = true
83+
movementMethod = LinkMovementMethod.getInstance()
84+
}
85+
}
86+
} else {
87+
onThreadsPreferenceClicked()
88+
}
89+
}
90+
91+
/**
92+
* Action when threads preference switch is actually clicked
93+
*/
94+
private fun onThreadsPreferenceClicked() {
95+
// We should migrate threads only if threads are disabled
96+
vectorPreferences.setShouldMigrateThreads(!vectorPreferences.areThreadMessagesEnabled())
97+
lightweightSettingsStorage.setThreadMessagesEnabled(vectorPreferences.areThreadMessagesEnabled())
98+
displayLoadingView()
99+
MainActivity.restartApp(requireActivity(), MainActivityArgs(clearCache = true))
100+
}
60101
}

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -739,6 +739,9 @@
739739
<string name="threads_beta_enable_notice_title">Threads Beta</string>
740740
<!-- %s will be replaced with action_learn_more string resource that will be clickable(url redirection) -->
741741
<string name="threads_beta_enable_notice_message">Threads help keep your conversations on-topic and easy to track. %sEnabling threads will refresh the app. This may take longer for some accounts.</string>
742+
<string name="threads_labs_enable_notice_title">Threads Beta</string>
743+
<string name="threads_labs_enable_notice_message">Your homeserver does not currently support threads, so this feature may be unreliable. Some threaded messages may not be reliably available. %sDo you want to enable threads anyway?</string>
744+
742745

743746
<!-- Search -->
744747
<string name="search_hint">Search</string>

0 commit comments

Comments
 (0)