Merge branch 'octoshrimpy:master' into widget_conversations_162

This commit is contained in:
gavine99
2025-01-15 20:00:41 +11:00
committed by GitHub
19 changed files with 187 additions and 41 deletions
@@ -23,17 +23,45 @@ import android.content.ComponentName
import android.content.Context
import android.content.Intent
import com.klinker.android.send_message.BroadcastUtils
import dev.octoshrimpy.quik.util.Preferences
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
import java.util.concurrent.TimeUnit
import java.util.concurrent.atomic.AtomicReference
import javax.inject.Inject
class WidgetManagerImpl @Inject constructor(private val context: Context) : WidgetManager {
class WidgetManagerImpl @Inject constructor(
private val context: Context,
private val prefs: Preferences
) : WidgetManager {
override fun updateUnreadCount() {
BroadcastUtils.sendExplicitBroadcast(context, Intent(), WidgetManager.ACTION_NOTIFY_DATASET_CHANGED)
companion object {
private var staticUnreadAtTopPrefsDisposable = AtomicReference<Disposable>(null)
fun sendDatasetChanged(context: Context) {
BroadcastUtils.sendExplicitBroadcast(context, Intent(), WidgetManager.ACTION_NOTIFY_DATASET_CHANGED)
}
}
init {
// this class is always instantiated by it's factory with the application context so we can capture that context value below
// when unreadAtTop preference changes, send broadcast to widgets to update themselves
if (staticUnreadAtTopPrefsDisposable.get() === null)
staticUnreadAtTopPrefsDisposable.set(prefs.unreadAtTop.asObservable()
.skip(1)
.debounce(400, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.doOnNext { sendDatasetChanged(context) }
.subscribe())
}
override fun sendDatasetChanged() {
sendDatasetChanged(context)
}
override fun updateTheme() {
val ids = AppWidgetManager.getInstance(context)
.getAppWidgetIds(ComponentName("dev.octoshrimpy.quik", "dev.octoshrimpy.quik.feature.widget.WidgetProvider"))
.getAppWidgetIds(ComponentName(context.packageName, "dev.octoshrimpy.quik.feature.widget.WidgetProvider"))
val intent = Intent().putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, ids)
@@ -56,7 +56,15 @@ class ConversationRepositoryImpl @Inject constructor(
private val phoneNumberUtils: PhoneNumberUtils
) : ConversationRepository {
override fun getConversations(archived: Boolean): RealmResults<Conversation> {
override fun getConversations(unreadAtTop: Boolean, archived: Boolean): RealmResults<Conversation> {
val sortOrder: MutableList<String> = arrayListOf("pinned", "draft", "lastMessage.date")
val sortDirections: MutableList<Sort> = arrayListOf(Sort.DESCENDING, Sort.DESCENDING, Sort.DESCENDING)
if (unreadAtTop) {
sortOrder.add(0, "lastMessage.read")
sortDirections.add(0, Sort.ASCENDING)
}
return Realm.getDefaultInstance()
.where(Conversation::class.java)
.notEqualTo("id", 0L)
@@ -69,13 +77,21 @@ class ConversationRepositoryImpl @Inject constructor(
.isNotEmpty("draft")
.endGroup()
.sort(
arrayOf("pinned", "draft", "lastMessage.date"),
arrayOf(Sort.DESCENDING, Sort.DESCENDING, Sort.DESCENDING)
sortOrder.toTypedArray(),
sortDirections.toTypedArray()
)
.findAllAsync()
}
override fun getConversationsSnapshot(): List<Conversation> {
override fun getConversationsSnapshot(unreadAtTop: Boolean): List<Conversation> {
val sortOrder: MutableList<String> = arrayListOf("pinned", "draft", "lastMessage.date")
val sortDirections: MutableList<Sort> = arrayListOf(Sort.DESCENDING, Sort.DESCENDING, Sort.DESCENDING)
if (unreadAtTop) {
sortOrder.add(0, "lastMessage.read")
sortDirections.add(0, Sort.ASCENDING)
}
return Realm.getDefaultInstance().use { realm ->
realm.refresh()
realm.copyFromRealm(realm.where(Conversation::class.java)
@@ -89,8 +105,8 @@ class ConversationRepositoryImpl @Inject constructor(
.isNotEmpty("draft")
.endGroup()
.sort(
arrayOf("pinned", "draft", "lastMessage.date"),
arrayOf(Sort.DESCENDING, Sort.DESCENDING, Sort.DESCENDING)
sortOrder.toTypedArray(),
sortDirections.toTypedArray()
)
.findAll())
}