Skip to content

Commit 1e0673e

Browse files
committed
[messages] add log truncation worker
1 parent 097b835 commit 1e0673e

File tree

8 files changed

+89
-0
lines changed

8 files changed

+89
-0
lines changed

app/src/main/java/me/capcom/smsgateway/data/dao/MessageDao.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,4 +51,7 @@ interface MessageDao {
5151

5252
@Query("UPDATE messagerecipient SET state = :state, error = :error WHERE messageId = :id")
5353
fun updateRecipientsState(id: String, state: Message.State, error: String?)
54+
55+
@Query("DELETE FROM message WHERE createdAt < :until AND state <> 'Pending'")
56+
suspend fun truncateLog(until: Long)
5457
}

app/src/main/java/me/capcom/smsgateway/modules/messages/MessagesService.kt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import me.capcom.smsgateway.modules.encryption.EncryptionService
2323
import me.capcom.smsgateway.modules.events.EventBus
2424
import me.capcom.smsgateway.modules.messages.data.SendRequest
2525
import me.capcom.smsgateway.modules.messages.events.MessageStateChangedEvent
26+
import me.capcom.smsgateway.modules.messages.workers.LogTruncateWorker
2627
import me.capcom.smsgateway.modules.messages.workers.SendMessagesWorker
2728
import me.capcom.smsgateway.receivers.EventsReceiver
2829
import java.util.Date
@@ -40,9 +41,11 @@ class MessagesService(
4041

4142
fun start() {
4243
SendMessagesWorker.start(context)
44+
LogTruncateWorker.start(context)
4345
}
4446

4547
fun stop() {
48+
LogTruncateWorker.stop(context)
4649
SendMessagesWorker.stop(context)
4750
}
4851

@@ -117,6 +120,12 @@ class MessagesService(
117120
updateState(id, phone, state, error)
118121
}
119122

123+
suspend fun truncateLog() {
124+
val lifetime = settings.logLifetimeDays ?: return
125+
126+
dao.truncateLog(System.currentTimeMillis() - lifetime * 86400000L)
127+
}
128+
120129
internal suspend fun sendPendingMessages(): Boolean {
121130
val messages = dao.selectPending()
122131
if (messages.isEmpty()) {

app/src/main/java/me/capcom/smsgateway/modules/messages/MessagesSettings.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,15 @@ class MessagesSettings(
2323
val limitValue: Int
2424
get() = storage.get(LIMIT_VALUE) ?: 0
2525

26+
val logLifetimeDays: Int?
27+
get() = storage.get<Int?>(LOG_LIFETIME_DAYS)?.takeIf { it > 0 }
28+
2629
companion object {
2730
private const val SECONDS_BETWEEN_MESSAGES = "SECONDS_BETWEEN_MESSAGES"
2831

2932
private const val LIMIT_PERIOD = "limit_period"
3033
private const val LIMIT_VALUE = "limit_value"
34+
35+
private const val LOG_LIFETIME_DAYS = "log_lifetime_days"
3136
}
3237
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package me.capcom.smsgateway.modules.messages.workers
2+
3+
import android.content.Context
4+
import androidx.work.Constraints
5+
import androidx.work.CoroutineWorker
6+
import androidx.work.ExistingPeriodicWorkPolicy
7+
import androidx.work.PeriodicWorkRequestBuilder
8+
import androidx.work.WorkManager
9+
import androidx.work.WorkerParameters
10+
import me.capcom.smsgateway.modules.messages.MessagesService
11+
import org.koin.core.component.KoinComponent
12+
import org.koin.core.component.inject
13+
import java.util.concurrent.TimeUnit
14+
15+
class LogTruncateWorker(appContext: Context, params: WorkerParameters) : CoroutineWorker(
16+
appContext,
17+
params
18+
), KoinComponent {
19+
private val messagesSvc: MessagesService by inject()
20+
21+
override suspend fun doWork(): Result = try {
22+
messagesSvc.truncateLog()
23+
Result.success()
24+
} catch (e: Throwable) {
25+
e.printStackTrace()
26+
Result.retry()
27+
}
28+
29+
companion object {
30+
private const val NAME = "LogTruncateWorker"
31+
32+
fun start(context: Context) {
33+
val work = PeriodicWorkRequestBuilder<LogTruncateWorker>(1L, TimeUnit.DAYS)
34+
.setConstraints(
35+
Constraints.Builder()
36+
.setRequiresBatteryNotLow(true)
37+
.build()
38+
)
39+
.build()
40+
41+
WorkManager.getInstance(context)
42+
.enqueueUniquePeriodicWork(
43+
NAME,
44+
ExistingPeriodicWorkPolicy.KEEP,
45+
work
46+
)
47+
}
48+
49+
fun stop(context: Context) {
50+
WorkManager.getInstance(context)
51+
.cancelUniqueWork(NAME)
52+
}
53+
}
54+
}

app/src/main/java/me/capcom/smsgateway/ui/SettingsFragment.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,14 @@ class SettingsFragment : PreferenceFragmentCompat() {
7373
}
7474
}
7575

76+
if (preference.key == "messages.log_lifetime_days") {
77+
(preference as EditTextPreference).setOnBindEditTextListener {
78+
it.inputType = InputType.TYPE_CLASS_NUMBER
79+
it.setSelectAllOnFocus(true)
80+
it.selectAll()
81+
}
82+
}
83+
7684
super.onDisplayPreferenceDialog(preference)
7785
}
7886

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
<vector android:height="24dp" android:viewportHeight="512"
2+
android:viewportWidth="512" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
3+
<path android:fillColor="@color/white" android:pathData="M75,75L41,41C25.9,25.9 0,36.6 0,57.9L0,168c0,13.3 10.7,24 24,24L134.1,192c21.4,0 32.1,-25.9 17,-41l-30.8,-30.8C155,85.5 203,64 256,64c106,0 192,86 192,192s-86,192 -192,192c-40.8,0 -78.6,-12.7 -109.7,-34.4c-14.5,-10.1 -34.4,-6.6 -44.6,7.9s-6.6,34.4 7.9,44.6C151.2,495 201.7,512 256,512c141.4,0 256,-114.6 256,-256S397.4,0 256,0C185.3,0 121.3,28.7 75,75zM256,128c-13.3,0 -24,10.7 -24,24L232,256c0,6.4 2.5,12.5 7,17l72,72c9.4,9.4 24.6,9.4 33.9,0s9.4,-24.6 0,-33.9l-65,-65L279.9,152c0,-13.3 -10.7,-24 -24,-24z"/>
4+
</vector>

app/src/main/res/values/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
<string name="private_token">Private Token</string>
3939
<string name="ignored_for_public_server">Ignored for public server</string>
4040
<string name="address_is">Address is %1$s</string>
41+
<string name="log_lifetime_days">Log lifetime, days</string>
4142
<string name="limits">Limits</string>
4243
<string name="period">Period</string>
4344
<string name="messages_count">Messages count</string>

app/src/main/res/xml/root_preferences.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,11 @@
2222
</PreferenceCategory>
2323

2424
<PreferenceCategory app:title="@string/messages_header">
25+
<EditTextPreference
26+
app:icon="@drawable/ic_log_lifetime"
27+
app:key="messages.log_lifetime_days"
28+
app:useSimpleSummaryProvider="true"
29+
app:title="@string/log_lifetime_days" />
2530

2631
<SeekBarPreference
2732
android:max="600"

0 commit comments

Comments
 (0)