Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import org.thoughtcrime.securesms.notifications.BackgroundPollManager
import org.thoughtcrime.securesms.notifications.PushRegistrationHandler
import org.thoughtcrime.securesms.pro.ProStatusManager
import org.thoughtcrime.securesms.service.ExpiringMessageManager
import org.thoughtcrime.securesms.util.VersionDataFetcher
import org.thoughtcrime.securesms.webrtc.CallMessageProcessor
import javax.inject.Inject

Expand Down Expand Up @@ -41,6 +42,7 @@ class AuthAwareComponents(
proStatusManager: Lazy<ProStatusManager>,
pollerManager: Lazy<PollerManager>,
backgroundPollManager: Lazy<BackgroundPollManager>,
versionDataFetcher: Lazy<VersionDataFetcher>,
): this(
components = listOf<Lazy<out AuthAwareComponent>>(
expiringMessageManager,
Expand All @@ -56,6 +58,7 @@ class AuthAwareComponents(
proStatusManager,
pollerManager,
backgroundPollManager,
versionDataFetcher,
)
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,7 @@ import org.thoughtcrime.securesms.migration.DatabaseMigrationManager
import org.thoughtcrime.securesms.pro.subscription.SubscriptionCoordinator
import org.thoughtcrime.securesms.pro.subscription.SubscriptionManager
import org.thoughtcrime.securesms.tokenpage.TokenDataManager
import org.thoughtcrime.securesms.util.AppVisibilityManager
import org.thoughtcrime.securesms.util.CurrentActivityObserver
import org.thoughtcrime.securesms.util.VersionDataFetcher
import org.thoughtcrime.securesms.webrtc.WebRtcCallBridge
import javax.inject.Inject

Expand All @@ -38,7 +36,6 @@ class OnAppStartupComponents private constructor(
persistentLogger: PersistentLogger,
appDisguiseManager: AppDisguiseManager,
tokenFetcher: TokenFetcher,
versionDataFetcher: VersionDataFetcher,
threadDatabase: ThreadDatabase,
emojiIndexLoader: EmojiIndexLoader,
subscriptionCoordinator: SubscriptionCoordinator,
Expand All @@ -57,7 +54,6 @@ class OnAppStartupComponents private constructor(
persistentLogger,
appDisguiseManager,
tokenFetcher,
versionDataFetcher,
threadDatabase,
emojiIndexLoader,
subscriptionCoordinator,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,9 @@ import org.session.libsignal.utilities.Log
import org.thoughtcrime.securesms.auth.LoggedInState
import org.thoughtcrime.securesms.auth.LoginStateRepository
import org.thoughtcrime.securesms.database.ReceivedMessageHashDatabase
import org.thoughtcrime.securesms.util.VersionDataFetcher
import javax.inject.Inject

class CreateAccountManager @Inject constructor(
private val versionDataFetcher: VersionDataFetcher,
private val configFactory: ConfigFactoryProtocol,
private val receivedMessageHashDatabase: ReceivedMessageHashDatabase,
private val loginStateRepository: LoginStateRepository,
Expand All @@ -40,8 +38,6 @@ class CreateAccountManager @Inject constructor(
it.userProfile.setName(displayName)
it.userProfile.setNtsPriority(PRIORITY_HIDDEN)
}

versionDataFetcher.startTimedVersionCheck()
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,10 @@ import org.session.libsignal.utilities.Log
import org.thoughtcrime.securesms.auth.LoggedInState
import org.thoughtcrime.securesms.auth.LoginStateRepository
import org.thoughtcrime.securesms.database.ReceivedMessageHashDatabase
import org.thoughtcrime.securesms.util.VersionDataFetcher
import javax.inject.Inject

class LoadAccountManager @Inject constructor(
private val prefs: TextSecurePreferences,
private val versionDataFetcher: VersionDataFetcher,
private val receivedMessageHashDatabase: ReceivedMessageHashDatabase,
private val loginStateRepository: LoginStateRepository,
private val database: LokiAPIDatabaseProtocol
Expand All @@ -37,8 +35,6 @@ class LoadAccountManager @Inject constructor(

// Mark that the user has viewed their seed to prevent being prompted again
prefs.setHasViewedSeed(true)

versionDataFetcher.startTimedVersionCheck()
}
}
}
Original file line number Diff line number Diff line change
@@ -1,77 +1,83 @@
package org.thoughtcrime.securesms.util

import android.os.Handler
import android.os.Looper
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import android.app.Application
import android.content.Context
import androidx.hilt.work.HiltWorker
import androidx.work.Constraints
import androidx.work.CoroutineWorker
import androidx.work.ExistingPeriodicWorkPolicy
import androidx.work.NetworkType
import androidx.work.PeriodicWorkRequest
import androidx.work.WorkManager
import androidx.work.WorkerParameters
import androidx.work.await
import dagger.assisted.Assisted
import dagger.assisted.AssistedInject
import org.session.libsession.messaging.file_server.FileServerApis
import org.session.libsession.messaging.file_server.GetClientVersionApi
import org.session.libsession.utilities.TextSecurePreferences
import org.session.libsignal.utilities.Log
import org.thoughtcrime.securesms.api.server.ServerApiExecutor
import org.thoughtcrime.securesms.api.server.ServerApiRequest
import org.thoughtcrime.securesms.api.server.execute
import org.thoughtcrime.securesms.dependencies.OnAppStartupComponent
import org.thoughtcrime.securesms.auth.AuthAwareComponent
import org.thoughtcrime.securesms.auth.LoggedInState
import java.util.concurrent.TimeUnit
import javax.inject.Inject
import javax.inject.Provider
import javax.inject.Singleton
import kotlin.time.Duration.Companion.hours

private val TAG: String = VersionDataFetcher::class.java.simpleName
private val REFRESH_TIME_MS = 4.hours.inWholeMilliseconds
import kotlin.time.toJavaDuration

@Singleton
class VersionDataFetcher @Inject constructor(
private val prefs: TextSecurePreferences,
private val serverApiExecutor: ServerApiExecutor,
private val getClientVersionApi: Provider<GetClientVersionApi>,
) : OnAppStartupComponent {
private val handler = Handler(Looper.getMainLooper())
private val fetchVersionData = Runnable {
scope.launch {
try {
// Perform the version check
val clientVersion = serverApiExecutor.execute(
ServerApiRequest(
fileServer = FileServerApis.DEFAULT_FILE_SERVER,
api = getClientVersionApi.get()
)
)
Log.i(TAG, "Fetched version data: $clientVersion")
prefs.setLastVersionCheck()
startTimedVersionCheck()
} catch (e: Exception) {
// We can silently ignore the error
Log.e(TAG, "Error fetching version data", e)
// Schedule the next check for 4 hours from now, but do not setLastVersionCheck
// so the app will retry when the app is next foregrounded.
startTimedVersionCheck(REFRESH_TIME_MS)
}
}
private val application: Application,
) : AuthAwareComponent {

override suspend fun doWhileLoggedIn(loggedInState: LoggedInState) {
WorkManager.getInstance(application)
.enqueueUniquePeriodicWork(WORK_NAME, ExistingPeriodicWorkPolicy.KEEP,
PeriodicWorkRequest.Builder(Worker::class, 4.hours.toJavaDuration())
.setInitialDelay(0L, TimeUnit.SECONDS)
.setConstraints(Constraints(requiredNetworkType = NetworkType.CONNECTED))
.build()
)
.await()

Log.d(TAG, "VersionDataFetcherWorker started")
}

private val scope = CoroutineScope(Dispatchers.Default)
override fun onLoggedOut() {
super.onLoggedOut()

/**
* Schedules fetching version data.
*
* @param delayMillis The delay before fetching version data. Default value is 4 hours from the
* last check or 0 if there was no previous check or if it was longer than 4 hours ago.
*/
@JvmOverloads
fun startTimedVersionCheck(
delayMillis: Long = REFRESH_TIME_MS + prefs.getLastVersionCheck() - System.currentTimeMillis()
) {
stopTimedVersionCheck()
handler.postDelayed(fetchVersionData, delayMillis)
WorkManager.getInstance(application)
.cancelUniqueWork(WORK_NAME)

Log.d(TAG, "VersionDataFetcherWorker cancelled")
}

fun stopTimedVersionCheck() {
handler.removeCallbacks(fetchVersionData)
companion object {
private const val TAG = "VersionDataFetcher"

private const val WORK_NAME = "VersionDataFetcherWorker"
}

override fun onPostAppStarted() {
startTimedVersionCheck()
@HiltWorker
class Worker @AssistedInject constructor(
private val serverApiExecutor: ServerApiExecutor,
private val getClientVersionApi: Provider<GetClientVersionApi>,
@Assisted context: Context,
@Assisted params: WorkerParameters,
) : CoroutineWorker(context, params) {
override suspend fun doWork(): Result {
val clientVersion = serverApiExecutor.execute(
ServerApiRequest(
fileServer = FileServerApis.DEFAULT_FILE_SERVER,
api = getClientVersionApi.get()
)
)

Log.d(TAG, "Worker fetched version: $clientVersion")
return Result.success()
}
}
}