Skip to content

Commit abd3bcc

Browse files
Merge pull request #1751 from session-foundation/feature/slow-mode-whitelisst
Feature/slow mode whitelisst
2 parents 0536bda + cea6964 commit abd3bcc

File tree

8 files changed

+344
-11
lines changed

8 files changed

+344
-11
lines changed

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

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import org.session.libsession.utilities.TextSecurePreferences.Companion.DEBUG_SH
3737
import org.session.libsession.utilities.TextSecurePreferences.Companion.ENVIRONMENT
3838
import org.session.libsession.utilities.TextSecurePreferences.Companion.FOLLOW_SYSTEM_SETTINGS
3939
import org.session.libsession.utilities.TextSecurePreferences.Companion.FORCED_SHORT_TTL
40+
import org.session.libsession.utilities.TextSecurePreferences.Companion.HAS_CHECKED_DOZE_WHITELIST
4041
import org.session.libsession.utilities.TextSecurePreferences.Companion.HAS_COPIED_DONATION_URL
4142
import org.session.libsession.utilities.TextSecurePreferences.Companion.HAS_DONATED
4243
import org.session.libsession.utilities.TextSecurePreferences.Companion.HAS_HIDDEN_MESSAGE_REQUESTS
@@ -114,7 +115,6 @@ interface TextSecurePreferences {
114115
fun setHasSeenGIFMetaDataWarning()
115116
fun isGifSearchInGridLayout(): Boolean
116117
fun setIsGifSearchInGridLayout(isGrid: Boolean)
117-
fun getNotificationPriority(): Int
118118
fun getMessageBodyTextSize(): Int
119119
fun setPreferredCameraDirection(value: CameraSelector)
120120
fun getPreferredCameraDirection(): CameraSelector
@@ -234,6 +234,8 @@ interface TextSecurePreferences {
234234
fun setSubscriptionProvider(provider: String)
235235
fun getSubscriptionProvider(): String?
236236

237+
fun hasCheckedDozeWhitelist(): Boolean
238+
fun setHasCheckedDozeWhitelist(hasChecked: Boolean)
237239
fun hasDonated(): Boolean
238240
fun setHasDonated(hasDonated: Boolean)
239241
fun hasCopiedDonationURL(): Boolean
@@ -311,7 +313,6 @@ interface TextSecurePreferences {
311313
const val LOCAL_REGISTRATION_ID_PREF = "pref_local_registration_id"
312314
const val REPEAT_ALERTS_PREF = "pref_repeat_alerts"
313315
const val NOTIFICATION_PRIVACY_PREF = "pref_notification_privacy"
314-
const val NOTIFICATION_PRIORITY_PREF = "pref_notification_priority"
315316
const val MEDIA_DOWNLOAD_MOBILE_PREF = "pref_media_download_mobile"
316317
const val MEDIA_DOWNLOAD_WIFI_PREF = "pref_media_download_wifi"
317318
const val MEDIA_DOWNLOAD_ROAMING_PREF = "pref_media_download_roaming"
@@ -422,6 +423,8 @@ interface TextSecurePreferences {
422423
const val SUBSCRIPTION_PROVIDER = "session_subscription_provider"
423424
const val DEBUG_AVATAR_REUPLOAD = "debug_avatar_reupload"
424425

426+
const val HAS_CHECKED_DOZE_WHITELIST = "has_checked_doze_whitelist"
427+
425428
// Donation
426429
const val HAS_DONATED = "has_donated"
427430
const val HAS_COPIED_DONATION_URL = "has_copied_donation_url"
@@ -1198,11 +1201,6 @@ class AppTextSecurePreferences @Inject constructor(
11981201
setBooleanPreference(TextSecurePreferences.GIF_GRID_LAYOUT, isGrid)
11991202
}
12001203

1201-
override fun getNotificationPriority(): Int {
1202-
return getStringPreference(
1203-
TextSecurePreferences.NOTIFICATION_PRIORITY_PREF, NotificationCompat.PRIORITY_HIGH.toString())!!.toInt()
1204-
}
1205-
12061204
override fun getMessageBodyTextSize(): Int {
12071205
return getStringPreference(TextSecurePreferences.MESSAGE_BODY_TEXT_SIZE_PREF, "16")!!.toInt()
12081206
}
@@ -1839,6 +1837,14 @@ class AppTextSecurePreferences @Inject constructor(
18391837
})
18401838
}
18411839

1840+
override fun hasCheckedDozeWhitelist(): Boolean {
1841+
return getBooleanPreference(HAS_CHECKED_DOZE_WHITELIST, false)
1842+
}
1843+
1844+
override fun setHasCheckedDozeWhitelist(hasChecked: Boolean) {
1845+
setBooleanPreference(HAS_CHECKED_DOZE_WHITELIST, hasChecked)
1846+
}
1847+
18421848
override fun hasDonated(): Boolean {
18431849
return getBooleanPreference(HAS_DONATED, false)
18441850
}

app/src/main/java/org/thoughtcrime/securesms/home/HomeActivity.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,9 @@ import org.thoughtcrime.securesms.reviews.ui.InAppReviewViewModel
8585
import org.thoughtcrime.securesms.showSessionDialog
8686
import org.thoughtcrime.securesms.tokenpage.TokenPageNotificationManager
8787
import org.thoughtcrime.securesms.ui.components.Avatar
88+
import org.thoughtcrime.securesms.ui.findActivity
89+
import org.thoughtcrime.securesms.ui.isWhitelistedFromDoze
90+
import org.thoughtcrime.securesms.ui.requestDozeWhitelist
8891
import org.thoughtcrime.securesms.ui.setThemedContent
8992
import org.thoughtcrime.securesms.ui.theme.LocalDimensions
9093
import org.thoughtcrime.securesms.util.AvatarUtils
@@ -250,6 +253,10 @@ class HomeActivity : ScreenLockActionBarActivity(),
250253
)
251254
)
252255
}
256+
257+
is HomeViewModel.UiEvent.ShowWhiteListSystemDialog -> {
258+
requestDozeWhitelist()
259+
}
253260
}
254261
}
255262
}

app/src/main/java/org/thoughtcrime/securesms/home/HomeDialogs.kt

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,17 @@ import org.session.libsession.utilities.StringSubstitutionConstants.TIME_KEY
1919
import org.thoughtcrime.securesms.home.HomeViewModel.Commands.*
2020
import org.thoughtcrime.securesms.home.startconversation.StartConversationSheet
2121
import org.thoughtcrime.securesms.preferences.prosettings.ProSettingsDestination
22+
import org.thoughtcrime.securesms.ui.AlertDialog
2223
import org.thoughtcrime.securesms.ui.AnimatedSessionProCTA
2324
import org.thoughtcrime.securesms.ui.CTAFeature
25+
import org.thoughtcrime.securesms.ui.DialogButtonData
26+
import org.thoughtcrime.securesms.ui.GetString
2427
import org.thoughtcrime.securesms.ui.OpenURLAlertDialog
2528
import org.thoughtcrime.securesms.ui.PinProCTA
2629
import org.thoughtcrime.securesms.ui.SimpleSessionProCTA
2730
import org.thoughtcrime.securesms.ui.UserProfileModal
31+
import org.thoughtcrime.securesms.ui.components.annotatedStringResource
32+
import org.thoughtcrime.securesms.ui.theme.LocalColors
2833
import org.thoughtcrime.securesms.ui.theme.SessionMaterialTheme
2934

3035
@Composable
@@ -33,6 +38,42 @@ fun HomeDialogs(
3338
sendCommand: (HomeViewModel.Commands) -> Unit
3439
) {
3540
SessionMaterialTheme {
41+
// Simple dialogs
42+
if (dialogsState.showSimpleDialog != null) {
43+
val buttons = mutableListOf<DialogButtonData>()
44+
if(dialogsState.showSimpleDialog.positiveText != null) {
45+
buttons.add(
46+
DialogButtonData(
47+
text = GetString(dialogsState.showSimpleDialog.positiveText),
48+
color = if (dialogsState.showSimpleDialog.positiveStyleDanger) LocalColors.current.danger
49+
else LocalColors.current.text,
50+
qaTag = dialogsState.showSimpleDialog.positiveQaTag,
51+
onClick = dialogsState.showSimpleDialog.onPositive
52+
)
53+
)
54+
}
55+
if(dialogsState.showSimpleDialog.negativeText != null){
56+
buttons.add(
57+
DialogButtonData(
58+
text = GetString(dialogsState.showSimpleDialog.negativeText),
59+
qaTag = dialogsState.showSimpleDialog.negativeQaTag,
60+
onClick = dialogsState.showSimpleDialog.onNegative
61+
)
62+
)
63+
}
64+
65+
AlertDialog(
66+
onDismissRequest = {
67+
// hide dialog
68+
sendCommand(HideSimpleDialog)
69+
},
70+
title = annotatedStringResource(dialogsState.showSimpleDialog.title),
71+
text = annotatedStringResource(dialogsState.showSimpleDialog.message),
72+
showCloseButton = dialogsState.showSimpleDialog.showXIcon,
73+
buttons = buttons
74+
)
75+
}
76+
3677
// pin CTA
3778
if(dialogsState.pinCTA != null){
3879
PinProCTA(

app/src/main/java/org/thoughtcrime/securesms/home/HomeViewModel.kt

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,13 @@ import android.content.Context
44
import androidx.lifecycle.ViewModel
55
import androidx.lifecycle.asFlow
66
import androidx.lifecycle.viewModelScope
7+
import com.squareup.phrase.Phrase
78
import dagger.hilt.android.lifecycle.HiltViewModel
89
import dagger.hilt.android.qualifiers.ApplicationContext
910
import kotlinx.coroutines.Dispatchers
1011
import kotlinx.coroutines.Job
1112
import kotlinx.coroutines.channels.BufferOverflow
13+
import kotlinx.coroutines.delay
1214
import kotlinx.coroutines.flow.Flow
1315
import kotlinx.coroutines.flow.MutableSharedFlow
1416
import kotlinx.coroutines.flow.MutableStateFlow
@@ -30,6 +32,7 @@ import network.loki.messenger.libsession_util.PRIORITY_HIDDEN
3032
import org.session.libsession.database.StorageProtocol
3133
import org.session.libsession.messaging.groups.GroupManagerV2
3234
import org.session.libsession.utilities.Address
35+
import org.session.libsession.utilities.StringSubstitutionConstants.APP_NAME_KEY
3336
import org.session.libsession.utilities.TextSecurePreferences
3437
import org.session.libsession.utilities.recipients.displayName
3538
import org.session.libsignal.utilities.AccountId
@@ -40,10 +43,15 @@ import org.thoughtcrime.securesms.database.model.ThreadRecord
4043
import org.thoughtcrime.securesms.debugmenu.DebugLogGroup
4144
import org.thoughtcrime.securesms.dependencies.ConfigFactory
4245
import org.thoughtcrime.securesms.preferences.prosettings.ProSettingsDestination
46+
import org.thoughtcrime.securesms.preferences.prosettings.ProSettingsViewModel
4347
import org.thoughtcrime.securesms.pro.ProStatus
4448
import org.thoughtcrime.securesms.pro.ProStatusManager
4549
import org.thoughtcrime.securesms.repository.ConversationRepository
4650
import org.thoughtcrime.securesms.sskenvironment.TypingStatusRepository
51+
import org.thoughtcrime.securesms.ui.SimpleDialogData
52+
import org.thoughtcrime.securesms.ui.findActivity
53+
import org.thoughtcrime.securesms.ui.isWhitelistedFromDoze
54+
import org.thoughtcrime.securesms.ui.requestDozeWhitelist
4755
import org.thoughtcrime.securesms.util.DateUtils
4856
import org.thoughtcrime.securesms.util.DonationManager
4957
import org.thoughtcrime.securesms.util.DonationManager.Companion.URL_DONATE
@@ -161,6 +169,41 @@ class HomeViewModel @Inject constructor(
161169
private var userProfileModalUtils: UserProfileUtils? = null
162170

163171
init {
172+
// check for white list status in case of slow mode
173+
if(!prefs.hasCheckedDozeWhitelist() // the user has not yet seen the dialog
174+
&& !prefs.pushEnabled.value // the user is in slow mode
175+
&& !context.isWhitelistedFromDoze() // the user isn't yet whitelisted
176+
){
177+
prefs.setHasCheckedDozeWhitelist(true)
178+
viewModelScope.launch {
179+
delay(1500)
180+
_dialogsState.update {
181+
it.copy(
182+
showSimpleDialog = SimpleDialogData(
183+
title = Phrase.from(context, R.string.runSessionBackground)
184+
.put(APP_NAME_KEY, context.getString(R.string.app_name))
185+
.format().toString(),
186+
message = Phrase.from(context, R.string.runSessionBackgroundDescription)
187+
.put(APP_NAME_KEY, context.getString(R.string.app_name))
188+
.format().toString(),
189+
positiveText = context.getString(R.string.allow),
190+
negativeText = context.getString(R.string.cancel),
191+
positiveQaTag = context.getString(R.string.qa_conversation_settings_dialog_whitelist_confirm),
192+
negativeQaTag = context.getString(R.string.qa_conversation_settings_dialog_whitelist_cancel),
193+
positiveStyleDanger = false,
194+
onPositive = {
195+
// show system whitelist dialog
196+
viewModelScope.launch {
197+
_uiEvents.emit(UiEvent.ShowWhiteListSystemDialog)
198+
}
199+
},
200+
onNegative = {}
201+
)
202+
)
203+
}
204+
}
205+
}
206+
164207
// observe subscription status
165208
viewModelScope.launch {
166209
proStatusManager.proDataState.collect { subscription ->
@@ -331,6 +374,10 @@ class HomeViewModel @Inject constructor(
331374
}
332375
}
333376

377+
is Commands.HideSimpleDialog -> {
378+
_dialogsState.update { it.copy(showSimpleDialog = null) }
379+
}
380+
334381
is Commands.HideDonationCTADialog -> {
335382
_dialogsState.update { it.copy(donationCTA = false) }
336383
}
@@ -392,6 +439,7 @@ class HomeViewModel @Inject constructor(
392439
val showStartConversationSheet: StartConversationSheetData? = null,
393440
val proExpiringCTA: ProExpiringCTA? = null,
394441
val proExpiredCTA: Boolean = false,
442+
val showSimpleDialog: SimpleDialogData? = null,
395443
val donationCTA: Boolean = false,
396444
val showUrlDialog: String? = null,
397445
)
@@ -411,6 +459,7 @@ class HomeViewModel @Inject constructor(
411459

412460
sealed interface UiEvent {
413461
data class OpenProSettings(val start: ProSettingsDestination) : UiEvent
462+
data object ShowWhiteListSystemDialog: UiEvent // once confirmed, this is for the system whitelist dialog
414463
}
415464

416465
sealed interface Commands {
@@ -430,6 +479,8 @@ class HomeViewModel @Inject constructor(
430479
data object ShowStartConversationSheet : Commands
431480
data object HideStartConversationSheet : Commands
432481

482+
data object HideSimpleDialog: Commands
483+
433484
data class GotoProSettings(
434485
val destination: ProSettingsDestination
435486
): Commands

0 commit comments

Comments
 (0)