diff --git a/app/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java b/app/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java index 85895cc9be..5106278b6b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java +++ b/app/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java @@ -205,11 +205,11 @@ public class ApplicationContext extends MultiDexApplication implements Dependenc contactDB.setContact(contact); } } - if (poller != null) { poller.setCaughtUp(false); } startPollingIfNeeded(); + OpenGroupManager.INSTANCE.setAllCaughtUp(false); OpenGroupManager.INSTANCE.startPolling(); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/loki/activities/HomeActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/HomeActivity.kt index 84fd67da53..0e5ccd6fde 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/loki/activities/HomeActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/HomeActivity.kt @@ -31,6 +31,7 @@ import org.greenrobot.eventbus.ThreadMode import org.session.libsession.messaging.jobs.JobQueue import org.session.libsession.messaging.mentions.MentionsManager import org.session.libsession.messaging.sending_receiving.MessageSender +import org.session.libsession.messaging.sending_receiving.pollers.OpenGroupPollerV2 import org.session.libsession.utilities.* import org.session.libsignal.utilities.toHexString import org.session.libsignal.utilities.ThreadUtils diff --git a/libsession/src/main/java/org/session/libsession/messaging/open_groups/OpenGroupAPIV2.kt b/libsession/src/main/java/org/session/libsession/messaging/open_groups/OpenGroupAPIV2.kt index 12e5fc1364..68f8d3d8d8 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/open_groups/OpenGroupAPIV2.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/open_groups/OpenGroupAPIV2.kt @@ -13,8 +13,10 @@ import okhttp3.HttpUrl import okhttp3.MediaType import okhttp3.RequestBody import org.session.libsession.messaging.MessagingModuleConfiguration +import org.session.libsession.messaging.sending_receiving.pollers.OpenGroupPollerV2 import org.session.libsession.snode.OnionRequestAPI import org.session.libsession.utilities.AESGCM +import org.session.libsession.utilities.TextSecurePreferences import org.session.libsignal.utilities.HTTP import org.session.libsignal.utilities.HTTP.Verb.* import org.session.libsignal.utilities.removing05PrefixIfNeeded @@ -30,6 +32,15 @@ object OpenGroupAPIV2 { private val moderators: HashMap> = hashMapOf() // Server URL to (channel ID to set of moderator IDs) private val curve = Curve25519.getInstance(Curve25519.BEST) val defaultRooms = MutableSharedFlow>(replay = 1) + private val hasPerformedInitialPoll = mutableMapOf() + private var hasUpdatedLastOpenDate = false + + private val timeSinceLastOpen by lazy { + val context = MessagingModuleConfiguration.shared.context + val lastOpenDate = TextSecurePreferences.getLastOpenTimeDate(context) + val now = System.currentTimeMillis() + now - lastOpenDate + } private const val defaultServerPublicKey = "a03c383cf63c3c4efe67acc52112a6dd734b3a946b9545f488aaa93da7991238" const val defaultServer = "http://116.203.70.33" @@ -349,6 +360,14 @@ object OpenGroupAPIV2 { fun compactPoll(rooms: List, server: String): Promise, Exception> { val authTokenRequests = rooms.associateWith { room -> getAuthToken(room, server) } val storage = MessagingModuleConfiguration.shared.storage + val context = MessagingModuleConfiguration.shared.context + val timeSinceLastOpen = this.timeSinceLastOpen + val useMessageLimit = (hasPerformedInitialPoll[server] != true + && timeSinceLastOpen > OpenGroupPollerV2.maxInactivityPeriod) + hasPerformedInitialPoll[server] = true + if (!hasUpdatedLastOpenDate) { + TextSecurePreferences.setLastOpenDate(context) + } val requests = rooms.mapNotNull { room -> val authToken = try { authTokenRequests[room]?.get() @@ -359,8 +378,8 @@ object OpenGroupAPIV2 { CompactPollRequest( roomID = room, authToken = authToken, - fromDeletionServerID = storage.getLastDeletionServerID(room, server), - fromMessageServerID = storage.getLastMessageServerID(room, server) + fromDeletionServerID = if (useMessageLimit) null else storage.getLastDeletionServerID(room, server), + fromMessageServerID = if (useMessageLimit) null else storage.getLastMessageServerID(room, server) ) } val request = Request(verb = POST, room = null, server = server, endpoint = "compact_poll", isAuthRequired = false, parameters = mapOf( "requests" to requests )) diff --git a/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/pollers/OpenGroupPollerV2.kt b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/pollers/OpenGroupPollerV2.kt index a6649c5150..8adf308554 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/pollers/OpenGroupPollerV2.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/pollers/OpenGroupPollerV2.kt @@ -22,6 +22,7 @@ class OpenGroupPollerV2(private val server: String, private val executorService: companion object { private val pollInterval: Long = 4 * 1000 + const val maxInactivityPeriod = 14 * 24 * 60 * 60 * 1000 } fun startIfNeeded() { diff --git a/libsession/src/main/java/org/session/libsession/utilities/TextSecurePreferences.kt b/libsession/src/main/java/org/session/libsession/utilities/TextSecurePreferences.kt index 9aa9b2ac09..263771aa6e 100644 --- a/libsession/src/main/java/org/session/libsession/utilities/TextSecurePreferences.kt +++ b/libsession/src/main/java/org/session/libsession/utilities/TextSecurePreferences.kt @@ -99,16 +99,16 @@ object TextSecurePreferences { private const val GIF_GRID_LAYOUT = "pref_gif_grid_layout" - // region FCM const val IS_USING_FCM = "pref_is_using_fcm" private const val FCM_TOKEN = "pref_fcm_token" private const val LAST_FCM_TOKEN_UPLOAD_TIME = "pref_last_fcm_token_upload_time_2" - // region Multi Device private const val LAST_CONFIGURATION_SYNC_TIME = "pref_last_configuration_sync_time" const val CONFIGURATION_SYNCED = "pref_configuration_synced" private const val LAST_PROFILE_UPDATE_TIME = "pref_last_profile_update_time" + private const val LAST_OPEN_DATE = "pref_last_open_date" + @JvmStatic fun getLastConfigurationSyncTime(context: Context): Long { return getLongPreference(context, LAST_CONFIGURATION_SYNC_TIME, 0) @@ -771,5 +771,12 @@ object TextSecurePreferences { fun setPerformedContactMigration(context: Context) { setBooleanPreference(context, "has_performed_contact_migration", true) } - // endregion + + fun getLastOpenTimeDate(context: Context): Long { + return getLongPreference(context, LAST_OPEN_DATE, 0) + } + + fun setLastOpenDate(context: Context) { + setLongPreference(context, LAST_OPEN_DATE, System.currentTimeMillis()) + } } \ No newline at end of file