session-android/app/src/main/java/org/thoughtcrime/securesms/notifications/BackgroundPollWorker.kt

96 lines
3.8 KiB
Kotlin
Raw Normal View History

2021-07-09 05:56:38 +02:00
package org.thoughtcrime.securesms.notifications
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import androidx.work.*
import nl.komponents.kovenant.Promise
import nl.komponents.kovenant.all
import nl.komponents.kovenant.functional.map
2021-05-21 02:30:02 +02:00
import org.session.libsession.messaging.MessagingModuleConfiguration
import org.session.libsession.messaging.jobs.MessageReceiveJob
2021-05-21 02:30:02 +02:00
import org.session.libsession.messaging.sending_receiving.pollers.ClosedGroupPollerV2
2021-05-19 02:03:31 +02:00
import org.session.libsession.messaging.sending_receiving.pollers.OpenGroupPollerV2
2021-04-23 08:09:47 +02:00
import org.session.libsession.snode.SnodeAPI
2021-01-18 23:12:44 +01:00
import org.session.libsession.utilities.TextSecurePreferences
2021-05-18 01:12:33 +02:00
import org.session.libsignal.utilities.Log
import org.thoughtcrime.securesms.dependencies.DatabaseComponent
import java.util.concurrent.TimeUnit
class BackgroundPollWorker(val context: Context, params: WorkerParameters) : Worker(context, params) {
companion object {
const val TAG = "BackgroundPollWorker"
@JvmStatic
fun schedulePeriodic(context: Context) {
Log.v(TAG, "Scheduling periodic work.")
val builder = PeriodicWorkRequestBuilder<BackgroundPollWorker>(15, TimeUnit.MINUTES)
2021-05-13 01:24:13 +02:00
builder.setConstraints(Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).build())
val workRequest = builder.build()
WorkManager.getInstance(context).enqueueUniquePeriodicWork(
TAG,
ExistingPeriodicWorkPolicy.KEEP,
2021-05-13 01:24:13 +02:00
workRequest
)
}
}
override fun doWork(): Result {
if (TextSecurePreferences.getLocalNumber(context) == null) {
2021-05-13 01:24:13 +02:00
Log.v(TAG, "User not registered yet.")
return Result.failure()
}
try {
Log.v(TAG, "Performing background poll.")
val promises = mutableListOf<Promise<Unit, Exception>>()
2021-05-13 01:24:13 +02:00
// DMs
2021-01-18 23:12:44 +01:00
val userPublicKey = TextSecurePreferences.getLocalNumber(context)!!
2021-05-13 01:24:13 +02:00
val dmsPromise = SnodeAPI.getMessages(userPublicKey).map { envelopes ->
envelopes.map { (envelope, serverHash) ->
2021-05-12 08:17:25 +02:00
// FIXME: Using a job here seems like a bad idea...
MessageReceiveJob(envelope.toByteArray(), serverHash).executeAsync()
}
}
2021-05-13 01:24:13 +02:00
promises.addAll(dmsPromise.get())
// Closed groups
2021-05-21 02:30:02 +02:00
val closedGroupPoller = ClosedGroupPollerV2() // Intentionally don't use shared
val storage = MessagingModuleConfiguration.shared.storage
val allGroupPublicKeys = storage.getAllClosedGroupPublicKeys()
allGroupPublicKeys.forEach { closedGroupPoller.poll(it) }
// Open Groups
val threadDB = DatabaseComponent.get(context).lokiThreadDatabase()
2021-05-19 02:03:31 +02:00
val v2OpenGroups = threadDB.getAllV2OpenGroups()
val v2OpenGroupServers = v2OpenGroups.map { it.value.server }.toSet()
2021-05-03 09:58:02 +02:00
2021-05-19 02:03:31 +02:00
for (server in v2OpenGroupServers) {
val poller = OpenGroupPollerV2(server, null)
poller.hasStarted = true
promises.add(poller.poll(true))
2021-05-03 09:58:02 +02:00
}
2021-05-13 01:24:13 +02:00
// Wait until all the promises are resolved
all(promises).get()
return Result.success()
} catch (exception: Exception) {
2021-05-13 01:24:13 +02:00
Log.e(TAG, "Background poll failed due to error: ${exception.message}.", exception)
return Result.retry()
}
}
class BootBroadcastReceiver: BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
if (intent.action == Intent.ACTION_BOOT_COMPLETED) {
Log.v(TAG, "Boot broadcast caught.")
2021-05-13 01:24:13 +02:00
schedulePeriodic(context)
}
}
}
}