From 4446510916f82c6fb5fe117d3bedbb44545f26ed Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Fri, 1 Nov 2024 09:33:33 -0400 Subject: [PATCH] Only show connection warning if not actively connected. --- .../securesms/dependencies/AppDependencies.kt | 7 +++--- .../notifications/VitalsViewModel.kt | 5 +++- .../util/concurrent/LatestValueObservable.kt | 23 +++++++++++++++++++ 3 files changed, 30 insertions(+), 5 deletions(-) create mode 100644 core-util/src/main/java/org/signal/core/util/concurrent/LatestValueObservable.kt diff --git a/app/src/main/java/org/thoughtcrime/securesms/dependencies/AppDependencies.kt b/app/src/main/java/org/thoughtcrime/securesms/dependencies/AppDependencies.kt index abf1a273db..555c0d4eb9 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/dependencies/AppDependencies.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/dependencies/AppDependencies.kt @@ -2,12 +2,11 @@ package org.thoughtcrime.securesms.dependencies import android.annotation.SuppressLint import android.app.Application -import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.subjects.BehaviorSubject -import io.reactivex.rxjava3.subjects.Subject import okhttp3.OkHttpClient import org.signal.core.util.billing.BillingApi import org.signal.core.util.concurrent.DeadlockDetector +import org.signal.core.util.concurrent.LatestValueObservable import org.signal.core.util.resettableLazy import org.signal.libsignal.net.Network import org.signal.libsignal.zkgroup.profiles.ClientZkProfileOperations @@ -209,14 +208,14 @@ object AppDependencies { provider.provideBillingApi() } - private val _webSocketObserver: Subject = BehaviorSubject.create() + private val _webSocketObserver: BehaviorSubject = BehaviorSubject.create() /** * An observable that emits the current state of the WebSocket connection across the various lifecycles * of the [signalWebSocket]. */ @JvmStatic - val webSocketObserver: Observable = _webSocketObserver + val webSocketObserver: LatestValueObservable = LatestValueObservable(_webSocketObserver) private val _networkModule = resettableLazy { NetworkDependenciesModule(application, provider, _webSocketObserver) diff --git a/app/src/main/java/org/thoughtcrime/securesms/notifications/VitalsViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/notifications/VitalsViewModel.kt index baebccd488..e8220c7a7f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/notifications/VitalsViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/notifications/VitalsViewModel.kt @@ -14,10 +14,12 @@ import io.reactivex.rxjava3.schedulers.Schedulers import io.reactivex.rxjava3.subjects.BehaviorSubject import org.thoughtcrime.securesms.crash.CrashConfig import org.thoughtcrime.securesms.database.LogDatabase +import org.thoughtcrime.securesms.dependencies.AppDependencies import org.thoughtcrime.securesms.keyvalue.SignalStore import org.thoughtcrime.securesms.notifications.DeviceSpecificNotificationConfig.ShowCondition import org.thoughtcrime.securesms.util.ConnectivityWarning import org.thoughtcrime.securesms.util.NetworkUtil +import org.whispersystems.signalservice.api.websocket.WebSocketConnectionState import java.util.concurrent.TimeUnit import kotlin.time.Duration.Companion.days @@ -72,8 +74,9 @@ class VitalsViewModel(private val context: Application) : AndroidViewModel(conte val timeSinceLastConnection = System.currentTimeMillis() - SignalStore.misc.lastWebSocketConnectTime val timeSinceLastConnectionWarning = System.currentTimeMillis() - SignalStore.misc.lastConnectivityWarningTime + val connectedToWebSocket = AppDependencies.webSocketObserver.value == WebSocketConnectionState.CONNECTED - if (ConnectivityWarning.isEnabled && timeSinceLastConnection > ConnectivityWarning.threshold && timeSinceLastConnectionWarning > 14.days.inWholeMilliseconds && NetworkUtil.isConnected(context) && SignalStore.account.isRegistered) { + if (ConnectivityWarning.isEnabled && timeSinceLastConnection > ConnectivityWarning.threshold && timeSinceLastConnectionWarning > 14.days.inWholeMilliseconds && NetworkUtil.isConnected(context) && SignalStore.account.isRegistered && !connectedToWebSocket) { return@fromCallable if (ConnectivityWarning.isDebugPromptEnabled) { State.PROMPT_DEBUGLOGS_FOR_CONNECTIVITY_WARNING } else { diff --git a/core-util/src/main/java/org/signal/core/util/concurrent/LatestValueObservable.kt b/core-util/src/main/java/org/signal/core/util/concurrent/LatestValueObservable.kt new file mode 100644 index 0000000000..5e68350348 --- /dev/null +++ b/core-util/src/main/java/org/signal/core/util/concurrent/LatestValueObservable.kt @@ -0,0 +1,23 @@ +/* + * Copyright 2024 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.signal.core.util.concurrent + +import io.reactivex.rxjava3.core.Observable +import io.reactivex.rxjava3.core.Observer +import io.reactivex.rxjava3.subjects.BehaviorSubject + +/** + * An Observer that provides instant access to the latest emitted value. + * Basically a read-only version of [BehaviorSubject]. + */ +class LatestValueObservable(private val subject: BehaviorSubject) : Observable() { + val value: T? + get() = subject.value + + override fun subscribeActual(observer: Observer) { + subject.subscribe(observer) + } +}