Implement Stories feature behind flag.

Co-Authored-By: Greyson Parrelli <37311915+greyson-signal@users.noreply.github.com>
Co-Authored-By: Rashad Sookram <95182499+rashad-signal@users.noreply.github.com>
This commit is contained in:
Alex Hart
2022-02-24 13:40:28 -04:00
parent 765185952e
commit 174cd860a0
416 changed files with 19506 additions and 857 deletions

View File

@@ -0,0 +1,71 @@
package org.thoughtcrime.securesms.service
import android.app.Application
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import androidx.annotation.WorkerThread
import org.signal.core.util.logging.Log
import org.thoughtcrime.securesms.database.SignalDatabase
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies
import java.util.concurrent.TimeUnit
/**
* Manages deleting stories 24 hours after they've been sent.
*/
class ExpiringStoriesManager(
application: Application
) : TimedEventManager<ExpiringStoriesManager.Event>(application, "ExpiringStoriesManager") {
companion object {
private val TAG = Log.tag(ExpiringStoriesManager::class.java)
private val STORY_LIFESPAN = TimeUnit.HOURS.toMillis(24)
}
private val mmsDatabase = SignalDatabase.mms
init {
scheduleIfNecessary()
}
@WorkerThread
override fun getNextClosestEvent(): Event? {
val oldestTimestamp = mmsDatabase.oldestStorySendTimestamp ?: return null
val timeSinceSend = System.currentTimeMillis() - oldestTimestamp
val delay = (STORY_LIFESPAN - timeSinceSend).coerceAtLeast(0)
Log.i(TAG, "The oldest story needs to be deleted in $delay ms.")
return Event(delay)
}
@WorkerThread
override fun executeEvent(event: Event) {
val threshold = System.currentTimeMillis() - STORY_LIFESPAN
val deletes = mmsDatabase.deleteStoriesOlderThan(threshold)
Log.i(TAG, "Deleted $deletes stories before $threshold")
}
@WorkerThread
override fun getDelayForEvent(event: Event): Long = event.delay
@WorkerThread
override fun scheduleAlarm(application: Application, delay: Long) {
setAlarm(application, delay, ExpireStoriesAlarm::class.java)
}
data class Event(val delay: Long)
class ExpireStoriesAlarm : BroadcastReceiver() {
companion object {
private val TAG = Log.tag(ExpireStoriesAlarm::class.java)
}
override fun onReceive(context: Context?, intent: Intent?) {
Log.d(TAG, "onReceive()")
ApplicationDependencies.getExpireStoriesManager().scheduleIfNecessary()
}
}
}