diff --git a/app/src/main/java/de/kuschku/quasseldroid/service/QuasselService.kt b/app/src/main/java/de/kuschku/quasseldroid/service/QuasselService.kt index 55ce7e475e4be45387a7a0508a623ead4c50f3ec..b6dfc879989b9d9fc4b25f2afd42cff7e3cf79e0 100644 --- a/app/src/main/java/de/kuschku/quasseldroid/service/QuasselService.kt +++ b/app/src/main/java/de/kuschku/quasseldroid/service/QuasselService.kt @@ -29,6 +29,7 @@ import de.kuschku.libquassel.connection.ConnectionState import de.kuschku.libquassel.connection.HostnameVerifier import de.kuschku.libquassel.connection.SocketAddress import de.kuschku.libquassel.protocol.* +import de.kuschku.libquassel.quassel.BufferInfo import de.kuschku.libquassel.quassel.QuasselFeatures import de.kuschku.libquassel.quassel.syncables.interfaces.IAliasManager import de.kuschku.libquassel.session.Backend @@ -436,6 +437,30 @@ class QuasselService : DaggerLifecycleService(), }.toVariantMap() ) } + + // Cleanup deleted buffers from cache + + val buffers = session.bufferSyncer.bufferInfos().map(BufferInfo::bufferId) + + val deletedBuffersMessage = database.message().buffers().toSet() - buffers + log(INFO, "QuasselService", "Buffers deleted from message storage: $deletedBuffersMessage") + for (deletedBuffer in deletedBuffersMessage) { + database.message().clearMessages(deletedBuffer) + } + + val deletedBuffersFiltered = database.filtered().buffers(accountId).toSet() - buffers + log(INFO, "QuasselService", "Buffers deleted from filtered storage: $deletedBuffersFiltered") + for (deletedBuffer in deletedBuffersFiltered) { + database.filtered().clear(accountId, deletedBuffer) + } + + val deletedBuffersNotifications = database.notifications().buffers().toSet() - buffers + log(INFO, + "QuasselService", + "Buffers deleted from notification storage: $deletedBuffersNotifications") + for (deletedBuffer in deletedBuffersNotifications) { + database.notifications().markReadNormal(deletedBuffer) + } } companion object { @@ -449,7 +474,7 @@ class QuasselService : DaggerLifecycleService(), disconnect: Boolean? = null, markRead: BufferId? = null, markReadMessage: MsgId? = null - ): ComponentName = context.startService( + ): ComponentName? = context.startService( intent(context, disconnect, markRead, markReadMessage) ) diff --git a/persistence/src/main/java/de/kuschku/quasseldroid/persistence/QuasselDatabase.kt b/persistence/src/main/java/de/kuschku/quasseldroid/persistence/QuasselDatabase.kt index 1a585d56765c34f36b3e300b5ced209e403cabb3..a8292ea0b4ed6422d351454b37b1c81f1af65c2e 100644 --- a/persistence/src/main/java/de/kuschku/quasseldroid/persistence/QuasselDatabase.kt +++ b/persistence/src/main/java/de/kuschku/quasseldroid/persistence/QuasselDatabase.kt @@ -62,6 +62,9 @@ abstract class QuasselDatabase : RoomDatabase() { @Query("SELECT * FROM message") fun all(): List<MessageData> + @Query("SELECT DISTINCT bufferId FROM message") + fun buffers(): List<BufferId> + @Query("SELECT * FROM message WHERE messageId = :messageId") fun find(messageId: Int): MessageData? @@ -119,6 +122,9 @@ abstract class QuasselDatabase : RoomDatabase() { @Dao interface FilteredDao { + @Query("SELECT DISTINCT bufferId FROM filtered WHERE accountId = :accountId") + fun buffers(accountId: Long): List<BufferId> + @Insert(onConflict = OnConflictStrategy.REPLACE) fun replace(vararg entities: Filtered)