mirror of
https://github.com/signalapp/Signal-Android.git
synced 2026-09-20 08:45:50 +01:00
Sync blocked users UI.
This commit is contained in:
@@ -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(
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user