Skip to content

Commit acfe2b3

Browse files
Merge pull request #2076 from session-foundation/feature/slow-mode-call-warning
Feature/slow mode call warning
2 parents 5dbf398 + 19b7543 commit acfe2b3

4 files changed

Lines changed: 99 additions & 18 deletions

File tree

app/src/main/java/org/session/libsession/utilities/TextSecurePreferences.kt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,8 @@ interface TextSecurePreferences {
155155
fun setHasSeenProExpired()
156156
fun clearProExpiryView()
157157
fun watchPostProStatus(): StateFlow<Boolean>
158+
fun hasSeenSlowModeCallWarning(): Boolean
159+
fun setHasSeenSlowModeCallWarning(value: Boolean)
158160
fun setShownCallWarning(): Boolean
159161
fun setShownCallNotification(): Boolean
160162
fun setCallNotificationsEnabled(enabled : Boolean)
@@ -289,6 +291,7 @@ interface TextSecurePreferences {
289291
const val SET_FORCE_POST_PRO = "pref_force_post_pro"
290292
const val HAS_SEEN_PRO_EXPIRING = "has_seen_pro_expiring"
291293
const val HAS_SEEN_PRO_EXPIRED = "has_seen_pro_expired"
294+
const val SHOWN_SLOW_MODE_CALL_WARNING = "has_seen_slow_mode_call_warning"
292295
const val CALL_NOTIFICATIONS_ENABLED = "pref_call_notifications_enabled"
293296
const val SHOWN_CALL_WARNING = "pref_shown_call_warning" // call warning is user-facing warning of enabling calls
294297
const val SHOWN_CALL_NOTIFICATION = "pref_shown_call_notification" // call notification is a prompt to check privacy settings
@@ -893,6 +896,14 @@ class AppTextSecurePreferences @Inject constructor(
893896
return getBooleanPreference(CALL_NOTIFICATIONS_ENABLED, false)
894897
}
895898

899+
override fun hasSeenSlowModeCallWarning(): Boolean {
900+
return getBooleanPreference(TextSecurePreferences.SHOWN_SLOW_MODE_CALL_WARNING, false)
901+
}
902+
903+
override fun setHasSeenSlowModeCallWarning(value: Boolean) {
904+
setBooleanPreference(TextSecurePreferences.SHOWN_SLOW_MODE_CALL_WARNING, value)
905+
}
906+
896907
override fun getLastVacuum(): Long {
897908
return getLongPreference(LAST_VACUUM_TIME, 0)
898909
}

app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationViewModel.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -110,17 +110,18 @@ import org.thoughtcrime.securesms.database.model.GroupThreadStatus
110110
import org.thoughtcrime.securesms.database.model.MessageId
111111
import org.thoughtcrime.securesms.database.model.MessageRecord
112112
import org.thoughtcrime.securesms.database.model.MmsMessageRecord
113-
import org.thoughtcrime.securesms.links.LinkChecker
114-
import org.thoughtcrime.securesms.links.LinkType
115113
import org.thoughtcrime.securesms.database.model.NotifyType
116114
import org.thoughtcrime.securesms.dependencies.ConfigFactory
117115
import org.thoughtcrime.securesms.groups.ExpiredGroupManager
118116
import org.thoughtcrime.securesms.groups.OpenGroupManager
117+
import org.thoughtcrime.securesms.links.LinkChecker
118+
import org.thoughtcrime.securesms.links.LinkType
119+
import org.thoughtcrime.securesms.notifications.NotificationPreferences.PUSH_ENABLED
119120
import org.thoughtcrime.securesms.pro.ProStatusManager
120121
import org.thoughtcrime.securesms.repository.ConversationRepository
121-
import org.thoughtcrime.securesms.ui.dialog.SimpleDialogData
122122
import org.thoughtcrime.securesms.ui.components.ConversationAppBarData
123123
import org.thoughtcrime.securesms.ui.components.ConversationAppBarPagerData
124+
import org.thoughtcrime.securesms.ui.dialog.SimpleDialogData
124125
import org.thoughtcrime.securesms.ui.getSubbedString
125126
import org.thoughtcrime.securesms.util.AvatarUIData
126127
import org.thoughtcrime.securesms.util.AvatarUtils

app/src/main/java/org/thoughtcrime/securesms/preferences/compose/PrivacySettingsPreferenceScreen.kt

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import org.session.libsession.utilities.NonTranslatableStringConstants.SESSION_F
2525
import org.session.libsession.utilities.StringSubstitutionConstants.APP_NAME_KEY
2626
import org.session.libsession.utilities.StringSubstitutionConstants.SESSION_FOUNDATION_KEY
2727
import org.thoughtcrime.securesms.permissions.Permissions
28+
import org.thoughtcrime.securesms.preferences.NotificationSettingsActivity
2829
import org.thoughtcrime.securesms.preferences.compose.PrivacySettingsPreferenceViewModel.Commands.*
2930
import org.thoughtcrime.securesms.preferences.compose.PrivacySettingsPreferenceViewModel.PrivacySettingsPreferenceEvent.*
3031
import org.thoughtcrime.securesms.service.KeyCachingService
@@ -58,14 +59,18 @@ fun PrivacySettingsPreferenceScreen(
5859
LaunchedEffect(Unit) {
5960
viewModel.uiEvents.collect { event ->
6061
when (event) {
61-
is OpenAppNotificationSettings -> {
62+
is OpenSystemNotificationSettings -> {
6263
Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS)
6364
.putExtra(Settings.EXTRA_APP_PACKAGE, BuildConfig.APPLICATION_ID)
6465
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
6566
.takeIf { IntentUtils.isResolvable(context, it) }
6667
?.let { context.startActivity(it, null) }
6768
}
6869

70+
is OpenNotificationsSettings -> {
71+
context.startActivity(Intent(context, NotificationSettingsActivity::class.java))
72+
}
73+
6974
AskMicrophonePermission -> {
7075
// Ask for permissions here
7176
Permissions.with(context.findActivity())
@@ -308,7 +313,34 @@ fun PrivacySettingsPreference(
308313
}
309314
}
310315

311-
if (uiState.showCallsWarningDialog) {
316+
if(uiState.showSlowModeCallsWarningDialog){
317+
AlertDialog(
318+
onDismissRequest = {
319+
// hide dialog
320+
sendCommand(HideSlowModeCallsWarningDialog)
321+
},
322+
title = stringResource(R.string.notificationWarning),
323+
text = Phrase.from(context, R.string.notificationWarningDescription)
324+
.put(APP_NAME_KEY, stringResource(R.string.app_name))
325+
.format().toString(),
326+
buttons = listOf(
327+
DialogButtonData(
328+
text = GetString(stringResource(R.string.change)),
329+
qaTag = stringResource(R.string.qa_preferences_dialog_enable),
330+
onClick = {
331+
sendCommand(NavigateToNotificationsSettings)
332+
}
333+
),
334+
DialogButtonData(
335+
text = GetString(stringResource(R.string.skip)),
336+
qaTag = stringResource(R.string.qa_preferences_dialog_enable),
337+
onClick = {
338+
sendCommand(ShowCallsWarningDialog)
339+
}
340+
),
341+
)
342+
)
343+
} else if (uiState.showCallsWarningDialog) {
312344
AlertDialog(
313345
onDismissRequest = {
314346
// hide dialog
@@ -351,7 +383,7 @@ fun PrivacySettingsPreference(
351383
text = GetString(stringResource(R.string.enable)),
352384
qaTag = stringResource(R.string.qa_preferences_dialog_enable),
353385
onClick = {
354-
sendCommand(NavigateToAppNotificationsSettings)
386+
sendCommand(NavigateToSystemNotificationsSettings)
355387
}
356388
),
357389
DialogButtonData(
@@ -370,7 +402,9 @@ fun PrivacySettingsPreference(
370402
@Composable
371403
fun PreviewPrivacySettingsPreference() {
372404
PrivacySettingsPreference(
373-
uiState = PrivacySettingsPreferenceViewModel.UIState(),
405+
uiState = PrivacySettingsPreferenceViewModel.UIState(
406+
showSlowModeCallsWarningDialog = true
407+
),
374408
sendCommand = {},
375409
onBackPressed = {},
376410
listState = LazyListState()

app/src/main/java/org/thoughtcrime/securesms/preferences/compose/PrivacySettingsPreferenceViewModel.kt

Lines changed: 46 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import org.session.libsession.utilities.TextSecurePreferences.Companion.LINK_PRE
2828
import org.session.libsession.utilities.observeBooleanKey
2929
import org.session.libsession.utilities.withMutableUserConfigs
3030
import org.thoughtcrime.securesms.dependencies.ConfigFactory
31+
import org.thoughtcrime.securesms.notifications.NotificationPreferences.PUSH_ENABLED
3132
import org.thoughtcrime.securesms.preferences.CommunicationPreferences
3233
import org.thoughtcrime.securesms.preferences.PreferenceStorage
3334
import org.thoughtcrime.securesms.preferences.compose.PrivacySettingsPreferenceViewModel.Commands.ShowCallsWarningDialog
@@ -41,7 +42,7 @@ class PrivacySettingsPreferenceViewModel @Inject constructor(
4142
private val configFactory: ConfigFactory,
4243
private val app: Application,
4344
private val typingStatusRepository: TypingStatusRepository,
44-
private val notificationManager: NotificationManagerCompat,
45+
private val notificationManager: NotificationManagerCompat
4546
) : ViewModel() {
4647

4748
private val keyguardSecure = MutableStateFlow(true)
@@ -129,11 +130,6 @@ class PrivacySettingsPreferenceViewModel @Inject constructor(
129130
typingIndicators = prefState.typingIndicators,
130131
linkPreviewEnabled = prefState.linkPreviewEnabled,
131132
incognitoKeyboardEnabled = prefState.incognitoKeyboardEnabled,
132-
133-
// keep these as-is (not derived from prefs flow)
134-
allowCommunityMessageRequests = current.allowCommunityMessageRequests,
135-
showCallsWarningDialog = current.showCallsWarningDialog,
136-
showCallsNotificationDialog = current.showCallsNotificationDialog,
137133
)
138134
}
139135
}
@@ -190,6 +186,8 @@ class PrivacySettingsPreferenceViewModel @Inject constructor(
190186
_scrollAction.value = ScrollAction()
191187
}
192188

189+
fun fastModeEnabled() = prefStorage[PUSH_ENABLED]
190+
193191
fun onCommand(command: Commands) {
194192
when (command) {
195193
is Commands.ToggleCallsNotification -> {
@@ -241,9 +239,15 @@ class PrivacySettingsPreferenceViewModel @Inject constructor(
241239
}
242240
}
243241

244-
Commands.NavigateToAppNotificationsSettings -> {
242+
Commands.NavigateToSystemNotificationsSettings -> {
245243
viewModelScope.launch {
246-
_uiEvents.emit(PrivacySettingsPreferenceEvent.OpenAppNotificationSettings)
244+
_uiEvents.emit(PrivacySettingsPreferenceEvent.OpenSystemNotificationSettings)
245+
}
246+
}
247+
248+
Commands.NavigateToNotificationsSettings -> {
249+
viewModelScope.launch {
250+
_uiEvents.emit(PrivacySettingsPreferenceEvent.OpenNotificationsSettings)
247251
}
248252
}
249253

@@ -255,10 +259,37 @@ class PrivacySettingsPreferenceViewModel @Inject constructor(
255259
}
256260
}
257261

262+
Commands.HideSlowModeCallsWarningDialog -> {
263+
_uiState.update {
264+
it.copy(
265+
showSlowModeCallsWarningDialog = false
266+
)
267+
}
268+
}
269+
258270
ShowCallsWarningDialog -> {
271+
// There are two warnings
272+
// 1. The first one is shown only once, in case the user is using slow mode
273+
// which doesn't work well with calls
274+
if(!prefs.hasSeenSlowModeCallWarning() && !fastModeEnabled()) {
275+
_uiState.update {
276+
it.copy(
277+
showSlowModeCallsWarningDialog = true,
278+
showCallsWarningDialog = false
279+
)
280+
}
281+
282+
// mark warning as seen
283+
prefs.setHasSeenSlowModeCallWarning(true)
284+
285+
return
286+
}
287+
288+
// 2. The second is the "always shown" warning regarding calls
259289
_uiState.update {
260290
it.copy(
261-
showCallsWarningDialog = true
291+
showCallsWarningDialog = true,
292+
showSlowModeCallsWarningDialog = false
262293
)
263294
}
264295
}
@@ -291,9 +322,11 @@ class PrivacySettingsPreferenceViewModel @Inject constructor(
291322
data class ToggleIncognitoKeyboard(val isEnabled : Boolean) : Commands
292323

293324
data object AskMicPermission : Commands
294-
data object NavigateToAppNotificationsSettings : Commands
325+
data object NavigateToSystemNotificationsSettings : Commands
326+
data object NavigateToNotificationsSettings : Commands
295327

296328
// Dialog for Calls warning
329+
data object HideSlowModeCallsWarningDialog : Commands
297330
data object HideCallsWarningDialog : Commands
298331
data object ShowCallsWarningDialog : Commands
299332

@@ -304,8 +337,9 @@ class PrivacySettingsPreferenceViewModel @Inject constructor(
304337

305338
sealed interface PrivacySettingsPreferenceEvent {
306339
data object StartLockToggledService : PrivacySettingsPreferenceEvent
307-
data object OpenAppNotificationSettings : PrivacySettingsPreferenceEvent
340+
data object OpenSystemNotificationSettings : PrivacySettingsPreferenceEvent
308341
data object AskMicrophonePermission : PrivacySettingsPreferenceEvent
342+
data object OpenNotificationsSettings : PrivacySettingsPreferenceEvent
309343

310344
data class ScrollToIndex(val index: Int) : PrivacySettingsPreferenceEvent
311345
}
@@ -324,6 +358,7 @@ class PrivacySettingsPreferenceViewModel @Inject constructor(
324358
val allowCommunityMessageRequests: Boolean = false, // Get from userConfigs
325359

326360
val showCallsWarningDialog: Boolean = false,
361+
val showSlowModeCallsWarningDialog: Boolean = false,
327362
val showCallsNotificationDialog: Boolean = false
328363
)
329364

0 commit comments

Comments
 (0)