@@ -4,11 +4,13 @@ import android.content.Context
44import androidx.lifecycle.ViewModel
55import androidx.lifecycle.asFlow
66import androidx.lifecycle.viewModelScope
7+ import com.squareup.phrase.Phrase
78import dagger.hilt.android.lifecycle.HiltViewModel
89import dagger.hilt.android.qualifiers.ApplicationContext
910import kotlinx.coroutines.Dispatchers
1011import kotlinx.coroutines.Job
1112import kotlinx.coroutines.channels.BufferOverflow
13+ import kotlinx.coroutines.delay
1214import kotlinx.coroutines.flow.Flow
1315import kotlinx.coroutines.flow.MutableSharedFlow
1416import kotlinx.coroutines.flow.MutableStateFlow
@@ -30,6 +32,7 @@ import network.loki.messenger.libsession_util.PRIORITY_HIDDEN
3032import org.session.libsession.database.StorageProtocol
3133import org.session.libsession.messaging.groups.GroupManagerV2
3234import org.session.libsession.utilities.Address
35+ import org.session.libsession.utilities.StringSubstitutionConstants.APP_NAME_KEY
3336import org.session.libsession.utilities.TextSecurePreferences
3437import org.session.libsession.utilities.recipients.displayName
3538import org.session.libsignal.utilities.AccountId
@@ -40,10 +43,15 @@ import org.thoughtcrime.securesms.database.model.ThreadRecord
4043import org.thoughtcrime.securesms.debugmenu.DebugLogGroup
4144import org.thoughtcrime.securesms.dependencies.ConfigFactory
4245import org.thoughtcrime.securesms.preferences.prosettings.ProSettingsDestination
46+ import org.thoughtcrime.securesms.preferences.prosettings.ProSettingsViewModel
4347import org.thoughtcrime.securesms.pro.ProStatus
4448import org.thoughtcrime.securesms.pro.ProStatusManager
4549import org.thoughtcrime.securesms.repository.ConversationRepository
4650import 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
4755import org.thoughtcrime.securesms.util.DateUtils
4856import org.thoughtcrime.securesms.util.DonationManager
4957import 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