Sync blocked users UI.

This commit is contained in:
Michelle Tang
2026-09-02 16:11:31 -03:00
committed by Alex Hart
parent adbcf6e2f3
commit b7bfbaa745
4 changed files with 35 additions and 3 deletions
@@ -5,6 +5,7 @@ import androidx.annotation.Nullable;
import androidx.lifecycle.ViewModel;
import androidx.lifecycle.ViewModelProvider;
import org.thoughtcrime.securesms.database.RxDatabaseObserver;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.recipients.RecipientId;
@@ -13,6 +14,7 @@ import java.util.Objects;
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.disposables.CompositeDisposable;
import io.reactivex.rxjava3.subjects.BehaviorSubject;
import io.reactivex.rxjava3.subjects.PublishSubject;
import io.reactivex.rxjava3.subjects.Subject;
@@ -20,15 +22,21 @@ import io.reactivex.rxjava3.subjects.Subject;
public class BlockedUsersViewModel extends ViewModel {
private final BlockedUsersRepository repository;
private final Subject<List<Recipient>> recipients = BehaviorSubject.create();
private final Subject<Event> events = PublishSubject.create();
private final Subject<List<Recipient>> recipients = BehaviorSubject.create();
private final Subject<Event> events = PublishSubject.create();
private final CompositeDisposable disposables = new CompositeDisposable();
private BlockedUsersViewModel(@NonNull BlockedUsersRepository repository) {
this.repository = repository;
loadRecipients();
disposables.add(RxDatabaseObserver.getBlockedUsers().subscribe(unused -> loadRecipients()));
}
@Override
protected void onCleared() {
disposables.clear();
}
public Observable<List<Recipient>> getRecipients() {
return recipients.observeOn(AndroidSchedulers.mainThread());
}
@@ -49,6 +49,7 @@ public class DatabaseObserver {
private static final String KEY_IN_APP_PAYMENTS = "InAppPayments";
private static final String KEY_CHAT_FOLDER = "ChatFolder";
private static final String KEY_STARRED_MESSAGES = "StarredMessages";
private static final String KEY_BLOCKED_USERS = "BlockedUsers";
private final Executor executor;
@@ -73,6 +74,7 @@ public class DatabaseObserver {
private final Set<InAppPaymentObserver> inAppPaymentObservers;
private final Set<Observer> chatFolderObservers;
private final Set<Observer> starredMessageObservers;
private final Set<Observer> blockedUsersObservers;
public DatabaseObserver() {
this.executor = new SerialExecutor(SignalExecutors.BOUNDED);
@@ -97,6 +99,7 @@ public class DatabaseObserver {
this.inAppPaymentObservers = new HashSet<>();
this.chatFolderObservers = new HashSet<>();
this.starredMessageObservers = new HashSet<>();
this.blockedUsersObservers = new HashSet<>();
}
public void registerConversationListObserver(@NonNull Observer listener) {
@@ -220,6 +223,10 @@ public class DatabaseObserver {
executor.execute(() -> starredMessageObservers.add(observer));
}
public void registerBlockedUsersObserver(@NonNull Observer observer) {
executor.execute(() -> blockedUsersObservers.add(observer));
}
public void unregisterObserver(@NonNull Observer listener) {
executor.execute(() -> {
conversationListObservers.remove(listener);
@@ -239,6 +246,7 @@ public class DatabaseObserver {
unregisterMapped(callLinkObservers, listener);
chatFolderObservers.remove(listener);
starredMessageObservers.remove(listener);
blockedUsersObservers.remove(listener);
});
}
@@ -411,6 +419,10 @@ public class DatabaseObserver {
runPostSuccessfulTransaction(KEY_STARRED_MESSAGES, () -> notifySet(starredMessageObservers));
}
public void notifyBlockedUsersObservers() {
runPostSuccessfulTransaction(KEY_BLOCKED_USERS, () -> notifySet(blockedUsersObservers));
}
private void runPostSuccessfulTransaction(@NonNull String dedupeKey, @NonNull Runnable runnable) {
SignalDatabase.runPostSuccessfulTransaction(dedupeKey, () -> {
executor.execute(runnable);
@@ -1504,6 +1504,7 @@ open class RecipientTable(context: Context, databaseHelper: SignalDatabase) : Da
if (update(id, values)) {
rotateStorageId(id)
AppDependencies.databaseObserver.notifyRecipientChanged(id)
AppDependencies.databaseObserver.notifyBlockedUsersObservers()
}
}
@@ -4054,6 +4055,7 @@ open class RecipientTable(context: Context, databaseHelper: SignalDatabase) : Da
}
}
AppDependencies.databaseObserver.notifyBlockedUsersObservers()
AppDependencies.recipientCache.clear()
}
@@ -1,5 +1,6 @@
package org.thoughtcrime.securesms.database
import com.squareup.wire.internal.JvmStatic
import io.reactivex.rxjava3.core.BackpressureStrategy
import io.reactivex.rxjava3.core.Emitter
import io.reactivex.rxjava3.core.Flowable
@@ -18,6 +19,9 @@ object RxDatabaseObserver {
val chatFolders: Flowable<Unit> by lazy { chatFoldersFlowable() }
val starredMessages: Flowable<Unit> by lazy { starredMessagesFlowable() }
@JvmStatic
val blockedUsers: Flowable<Unit> by lazy { blockedUsersFlowable() }
private fun conversationListFlowable(): Flowable<Unit> {
return databaseFlowable { listener ->
AppDependencies.databaseObserver.registerConversationListObserver(listener)
@@ -50,6 +54,12 @@ object RxDatabaseObserver {
}
}
private fun blockedUsersFlowable(): Flowable<Unit> {
return databaseFlowable { listener ->
AppDependencies.databaseObserver.registerBlockedUsersObserver(listener)
}
}
private fun databaseFlowable(registerObserver: (RxObserver) -> Unit): Flowable<Unit> {
val flowable = Flowable.create(
{