From 6246fea83bcb499b9200931ea9d743ebdbe9e1df Mon Sep 17 00:00:00 2001 From: gmbnt Date: Tue, 24 Mar 2020 11:31:01 +1100 Subject: [PATCH] Further improve threading --- AndroidManifest.xml | 2 +- .../securesms/ApplicationContext.java | 4 +- ...er.kt => BackgroundOpenGroupPollWorker.kt} | 14 ++--- .../messaging/BackgroundPollWorker.kt | 4 +- .../messaging/LokiPublicChatPoller.kt | 51 +++++++++++-------- .../redesign/messaging/LokiRSSFeedPoller.kt | 3 +- .../securesms/util/TextSecurePreferences.java | 4 +- 7 files changed, 46 insertions(+), 36 deletions(-) rename src/org/thoughtcrime/securesms/loki/redesign/messaging/{BackgroundPublicChatPollWorker.kt => BackgroundOpenGroupPollWorker.kt} (62%) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 7709ebc715..bfa2c456dc 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -666,7 +666,7 @@ - + diff --git a/src/org/thoughtcrime/securesms/ApplicationContext.java b/src/org/thoughtcrime/securesms/ApplicationContext.java index 3bf81018ac..d4ee2c93c6 100644 --- a/src/org/thoughtcrime/securesms/ApplicationContext.java +++ b/src/org/thoughtcrime/securesms/ApplicationContext.java @@ -64,7 +64,7 @@ import org.thoughtcrime.securesms.loki.LokiPublicChatManager; import org.thoughtcrime.securesms.loki.MultiDeviceUtilities; import org.thoughtcrime.securesms.loki.redesign.activities.HomeActivity; import org.thoughtcrime.securesms.loki.redesign.messaging.BackgroundPollWorker; -import org.thoughtcrime.securesms.loki.redesign.messaging.BackgroundPublicChatPollWorker; +import org.thoughtcrime.securesms.loki.redesign.messaging.BackgroundOpenGroupPollWorker; import org.thoughtcrime.securesms.loki.redesign.messaging.LokiAPIDatabase; import org.thoughtcrime.securesms.loki.redesign.messaging.LokiRSSFeedPoller; import org.thoughtcrime.securesms.loki.redesign.messaging.LokiUserDatabase; @@ -355,7 +355,7 @@ public class ApplicationContext extends MultiDexApplication implements Dependenc LocalBackupListener.schedule(this); RotateSenderCertificateListener.schedule(this); BackgroundPollWorker.schedule(this); // Session - BackgroundPublicChatPollWorker.schedule(this); // Session + BackgroundOpenGroupPollWorker.schedule(this); // Session if (BuildConfig.PLAY_STORE_DISABLED) { UpdateApkRefreshListener.schedule(this); diff --git a/src/org/thoughtcrime/securesms/loki/redesign/messaging/BackgroundPublicChatPollWorker.kt b/src/org/thoughtcrime/securesms/loki/redesign/messaging/BackgroundOpenGroupPollWorker.kt similarity index 62% rename from src/org/thoughtcrime/securesms/loki/redesign/messaging/BackgroundPublicChatPollWorker.kt rename to src/org/thoughtcrime/securesms/loki/redesign/messaging/BackgroundOpenGroupPollWorker.kt index 130122c492..197a9812a8 100644 --- a/src/org/thoughtcrime/securesms/loki/redesign/messaging/BackgroundPublicChatPollWorker.kt +++ b/src/org/thoughtcrime/securesms/loki/redesign/messaging/BackgroundOpenGroupPollWorker.kt @@ -7,32 +7,32 @@ import org.thoughtcrime.securesms.service.PersistentAlarmManagerListener import org.thoughtcrime.securesms.util.TextSecurePreferences import java.util.concurrent.TimeUnit -class BackgroundPublicChatPollWorker : PersistentAlarmManagerListener() { +class BackgroundOpenGroupPollWorker : PersistentAlarmManagerListener() { companion object { private val pollInterval = TimeUnit.MINUTES.toMillis(4) @JvmStatic fun schedule(context: Context) { - BackgroundPublicChatPollWorker().onReceive(context, Intent()) + BackgroundOpenGroupPollWorker().onReceive(context, Intent()) } } override fun getNextScheduledExecutionTime(context: Context): Long { - return TextSecurePreferences.getPublicChatBackgroundPollTime(context) + return TextSecurePreferences.getOpenGroupBackgroundPollTime(context) } override fun onAlarm(context: Context, scheduledTime: Long): Long { if (scheduledTime != 0L) { - val publicChats = DatabaseFactory.getLokiThreadDatabase(context).getAllPublicChats().map { it.value } - for (publicChat in publicChats) { - val poller = LokiPublicChatPoller(context, publicChat) + val openGroups = DatabaseFactory.getLokiThreadDatabase(context).getAllPublicChats().map { it.value } + for (openGroup in openGroups) { + val poller = LokiPublicChatPoller(context, openGroup) poller.stop() poller.pollForNewMessages() } } val nextTime = System.currentTimeMillis() + pollInterval - TextSecurePreferences.setPublicChatBackgroundPollTime(context, nextTime) + TextSecurePreferences.setOpenGroupBackgroundPollTime(context, nextTime) return nextTime } } diff --git a/src/org/thoughtcrime/securesms/loki/redesign/messaging/BackgroundPollWorker.kt b/src/org/thoughtcrime/securesms/loki/redesign/messaging/BackgroundPollWorker.kt index 184e11d585..4b8fdc9037 100644 --- a/src/org/thoughtcrime/securesms/loki/redesign/messaging/BackgroundPollWorker.kt +++ b/src/org/thoughtcrime/securesms/loki/redesign/messaging/BackgroundPollWorker.kt @@ -32,7 +32,9 @@ class BackgroundPollWorker : PersistentAlarmManagerListener() { val userHexEncodedPublicKey = TextSecurePreferences.getLocalNumber(context) val lokiAPIDatabase = DatabaseFactory.getLokiAPIDatabase(context) try { - LokiAPI(userHexEncodedPublicKey, lokiAPIDatabase, (context.applicationContext as ApplicationContext).broadcaster).getMessages().map { messages -> + val applicationContext = context.applicationContext as ApplicationContext + val broadcaster = applicationContext.broadcaster + LokiAPI(userHexEncodedPublicKey, lokiAPIDatabase, broadcaster).getMessages().map { messages -> messages.forEach { PushContentReceiveJob(context).processEnvelope(SignalServiceEnvelope(it)) } diff --git a/src/org/thoughtcrime/securesms/loki/redesign/messaging/LokiPublicChatPoller.kt b/src/org/thoughtcrime/securesms/loki/redesign/messaging/LokiPublicChatPoller.kt index 71b0e766e1..1d98b3e761 100644 --- a/src/org/thoughtcrime/securesms/loki/redesign/messaging/LokiPublicChatPoller.kt +++ b/src/org/thoughtcrime/securesms/loki/redesign/messaging/LokiPublicChatPoller.kt @@ -23,7 +23,6 @@ import org.whispersystems.signalservice.api.messages.multidevice.SentTranscriptM import org.whispersystems.signalservice.api.push.SignalServiceAddress import org.whispersystems.signalservice.loki.api.* import org.whispersystems.signalservice.loki.messaging.LokiThreadFriendRequestStatus -import org.whispersystems.signalservice.loki.utilities.successBackground import java.security.MessageDigest import java.util.* @@ -70,6 +69,7 @@ class LokiPublicChatPoller(private val context: Context, private val group: Loki } private val pollForDisplayNamesTask = object : Runnable { + override fun run() { pollForDisplayNames() handler.postDelayed(this, pollForDisplayNamesInterval) @@ -217,6 +217,7 @@ class LokiPublicChatPoller(private val context: Context, private val group: Loki val userPrivateKey = IdentityKeyUtil.getIdentityKeyPair(context).privateKey.serialize() val database = DatabaseFactory.getLokiAPIDatabase(context) LokiFileServerAPI.configure(false, userHexEncodedPublicKey, userPrivateKey, database) + // Kovenant propagates a context to chained promises, so LokiPublicChatAPI.sharedContext should be used for all of the below LokiDeviceLinkUtilities.getAllLinkedDeviceHexEncodedPublicKeys(userHexEncodedPublicKey).bind(LokiPublicChatAPI.sharedContext) { devices -> userDevices = devices api.getMessages(group.channel, group.server) @@ -235,22 +236,24 @@ class LokiPublicChatPoller(private val context: Context, private val group: Loki } } Promise.of(messages) - }.successBackground { + }.success { val newDisplayNameUpdatees = uniqueDevices.mapNotNull { // This will return null if the current device is a master device LokiDeviceLinkUtilities.getMasterHexEncodedPublicKey(it).get() }.toSet() // Fetch the display names of the master devices displayNameUpdatees = displayNameUpdatees.union(newDisplayNameUpdatees) - }.successBackground { messages -> + }.success { messages -> // Process messages in the background - messages.forEach { message -> - if (userDevices.contains(message.hexEncodedPublicKey)) { - processOutgoingMessage(message) - } else { - processIncomingMessage(message) + Thread { + messages.forEach { message -> + if (userDevices.contains(message.hexEncodedPublicKey)) { + processOutgoingMessage(message) + } else { + processIncomingMessage(message) + } } - } + }.start() }.fail { Log.d("Loki", "Failed to get messages for group chat with ID: ${group.channel} on server: ${group.server}.") } @@ -260,11 +263,13 @@ class LokiPublicChatPoller(private val context: Context, private val group: Loki if (displayNameUpdatees.isEmpty()) { return } val hexEncodedPublicKeys = displayNameUpdatees displayNameUpdatees = setOf() - api.getDisplayNames(hexEncodedPublicKeys, group.server).successBackground { mapping -> - for (pair in mapping.entries) { - val senderDisplayName = "${pair.value} (...${pair.key.takeLast(8)})" - DatabaseFactory.getLokiUserDatabase(context).setServerDisplayName(group.id, pair.key, senderDisplayName) - } + api.getDisplayNames(hexEncodedPublicKeys, group.server).success { mapping -> + Thread { + for (pair in mapping.entries) { + val senderDisplayName = "${pair.value} (...${pair.key.takeLast(8)})" + DatabaseFactory.getLokiUserDatabase(context).setServerDisplayName(group.id, pair.key, senderDisplayName) + } + }.start() }.fail { displayNameUpdatees = displayNameUpdatees.union(hexEncodedPublicKeys) } @@ -272,14 +277,16 @@ class LokiPublicChatPoller(private val context: Context, private val group: Loki private fun pollForDeletedMessages() { api.getDeletedMessageServerIDs(group.channel, group.server).success { deletedMessageServerIDs -> - val lokiMessageDatabase = DatabaseFactory.getLokiMessageDatabase(context) - val deletedMessageIDs = deletedMessageServerIDs.mapNotNull { lokiMessageDatabase.getMessageID(it) } - val smsMessageDatabase = DatabaseFactory.getSmsDatabase(context) - val mmsMessageDatabase = DatabaseFactory.getMmsDatabase(context) - deletedMessageIDs.forEach { - smsMessageDatabase.deleteMessage(it) - mmsMessageDatabase.delete(it) - } + Thread { + val lokiMessageDatabase = DatabaseFactory.getLokiMessageDatabase(context) + val deletedMessageIDs = deletedMessageServerIDs.mapNotNull { lokiMessageDatabase.getMessageID(it) } + val smsMessageDatabase = DatabaseFactory.getSmsDatabase(context) + val mmsMessageDatabase = DatabaseFactory.getMmsDatabase(context) + deletedMessageIDs.forEach { + smsMessageDatabase.deleteMessage(it) + mmsMessageDatabase.delete(it) + } + }.start() }.fail { Log.d("Loki", "Failed to get deleted messages for group chat with ID: ${group.channel} on server: ${group.server}.") } diff --git a/src/org/thoughtcrime/securesms/loki/redesign/messaging/LokiRSSFeedPoller.kt b/src/org/thoughtcrime/securesms/loki/redesign/messaging/LokiRSSFeedPoller.kt index b45ce47ade..c8ac9bb5fb 100644 --- a/src/org/thoughtcrime/securesms/loki/redesign/messaging/LokiRSSFeedPoller.kt +++ b/src/org/thoughtcrime/securesms/loki/redesign/messaging/LokiRSSFeedPoller.kt @@ -25,6 +25,7 @@ class LokiRSSFeedPoller(private val context: Context, private val feed: LokiRSSF private var hasStarted = false private val task = object : Runnable { + override fun run() { poll() handler.postDelayed(this, interval) @@ -69,7 +70,7 @@ class LokiRSSFeedPoller(private val context: Context, private val feed: LokiRSSF PushDecryptJob(context).handleTextMessage(x3, x2, Optional.absent(), Optional.absent()) } }.fail { exception -> - Log.d("Loki", "Couldn't update RSS feed with ID: $feed.id. $exception") + Log.d("Loki", "Couldn't update RSS feed with ID: $feed.id due to exception: $exception.") } } } \ No newline at end of file diff --git a/src/org/thoughtcrime/securesms/util/TextSecurePreferences.java b/src/org/thoughtcrime/securesms/util/TextSecurePreferences.java index 7229a8ef0f..42c204dfbb 100644 --- a/src/org/thoughtcrime/securesms/util/TextSecurePreferences.java +++ b/src/org/thoughtcrime/securesms/util/TextSecurePreferences.java @@ -1185,11 +1185,11 @@ public class TextSecurePreferences { setLongPreference(context, "background_poll_time", backgroundPollTime); } - public static long getPublicChatBackgroundPollTime(Context context) { + public static long getOpenGroupBackgroundPollTime(Context context) { return getLongPreference(context, "public_chat_background_poll_time", 0L); } - public static void setPublicChatBackgroundPollTime(Context context, long backgroundPollTime) { + public static void setOpenGroupBackgroundPollTime(Context context, long backgroundPollTime) { setLongPreference(context, "public_chat_background_poll_time", backgroundPollTime); }