diff --git a/app/src/main/java/org/thoughtcrime/securesms/blocked/BlockedUsersActivity.java b/app/src/main/java/org/thoughtcrime/securesms/blocked/BlockedUsersActivity.java index 8f45e7791..ce6776e44 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/blocked/BlockedUsersActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/blocked/BlockedUsersActivity.java @@ -24,6 +24,7 @@ import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.util.DynamicNoActionBarTheme; import org.thoughtcrime.securesms.util.DynamicTheme; +import org.thoughtcrime.securesms.util.LifecycleDisposable; import org.thoughtcrime.securesms.util.ViewUtil; import java.util.Optional; @@ -37,10 +38,13 @@ public class BlockedUsersActivity extends PassphraseRequiredActivity implements private BlockedUsersViewModel viewModel; + private final LifecycleDisposable lifecycleDisposable = new LifecycleDisposable(); + @Override protected void onCreate(Bundle savedInstanceState, boolean ready) { super.onCreate(savedInstanceState, ready); + lifecycleDisposable.bindTo(this); dynamicTheme.onCreate(this); setContentView(R.layout.blocked_users_activity); @@ -78,7 +82,11 @@ public class BlockedUsersActivity extends PassphraseRequiredActivity implements .add(R.id.fragment_container, new BlockedUsersFragment()) .commit(); - viewModel.getEvents().observe(this, event -> handleEvent(container, event)); + lifecycleDisposable.add( + viewModel + .getEvents() + .subscribe(event -> handleEvent(container, event)) + ); } @Override diff --git a/app/src/main/java/org/thoughtcrime/securesms/blocked/BlockedUsersFragment.java b/app/src/main/java/org/thoughtcrime/securesms/blocked/BlockedUsersFragment.java index 79f7d16f1..2022a93e8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/blocked/BlockedUsersFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/blocked/BlockedUsersFragment.java @@ -15,12 +15,15 @@ import androidx.recyclerview.widget.RecyclerView; import org.thoughtcrime.securesms.BlockUnblockDialog; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.recipients.Recipient; +import org.thoughtcrime.securesms.util.LifecycleDisposable; public class BlockedUsersFragment extends Fragment { private BlockedUsersViewModel viewModel; private Listener listener; + private final LifecycleDisposable lifecycleDisposable = new LifecycleDisposable(); + @Override public void onAttach(@NonNull Context context) { super.onAttach(context); @@ -59,16 +62,19 @@ public class BlockedUsersFragment extends Fragment { } }); + lifecycleDisposable.bindTo(getViewLifecycleOwner()); viewModel = new ViewModelProvider(requireActivity()).get(BlockedUsersViewModel.class); - viewModel.getRecipients().observe(getViewLifecycleOwner(), list -> { - if (list.isEmpty()) { - empty.setVisibility(View.VISIBLE); - } else { - empty.setVisibility(View.GONE); - } + lifecycleDisposable.add( + viewModel.getRecipients().subscribe(list -> { + if (list.isEmpty()) { + empty.setVisibility(View.VISIBLE); + } else { + empty.setVisibility(View.GONE); + } - adapter.submitList(list); - }); + adapter.submitList(list); + }) + ); } private void handleRecipientClicked(@NonNull Recipient recipient) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/blocked/BlockedUsersViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/blocked/BlockedUsersViewModel.java index f2d6ef0e2..baf4cf6ed 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/blocked/BlockedUsersViewModel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/blocked/BlockedUsersViewModel.java @@ -2,64 +2,66 @@ package org.thoughtcrime.securesms.blocked; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.lifecycle.LiveData; -import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.ViewModel; import androidx.lifecycle.ViewModelProvider; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; -import org.thoughtcrime.securesms.util.SingleLiveEvent; import java.util.List; import java.util.Objects; +import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; +import io.reactivex.rxjava3.core.Observable; +import io.reactivex.rxjava3.subjects.BehaviorSubject; +import io.reactivex.rxjava3.subjects.PublishSubject; +import io.reactivex.rxjava3.subjects.Subject; + public class BlockedUsersViewModel extends ViewModel { - private final BlockedUsersRepository repository; - private final MutableLiveData> recipients; - private final SingleLiveEvent events = new SingleLiveEvent<>(); + private final BlockedUsersRepository repository; + private final Subject> recipients = BehaviorSubject.create(); + private final Subject events = PublishSubject.create(); private BlockedUsersViewModel(@NonNull BlockedUsersRepository repository) { this.repository = repository; - this.recipients = new MutableLiveData<>(); loadRecipients(); } - public LiveData> getRecipients() { - return recipients; + public Observable> getRecipients() { + return recipients.observeOn(AndroidSchedulers.mainThread()); } - public LiveData getEvents() { - return events; + public Observable getEvents() { + return events.observeOn(AndroidSchedulers.mainThread()); } void block(@NonNull RecipientId recipientId) { repository.block(recipientId, () -> { loadRecipients(); - events.postValue(new Event(EventType.BLOCK_SUCCEEDED, Recipient.resolved(recipientId))); + events.onNext(new Event(EventType.BLOCK_SUCCEEDED, Recipient.resolved(recipientId))); }, - () -> events.postValue(new Event(EventType.BLOCK_FAILED, Recipient.resolved(recipientId)))); + () -> events.onNext(new Event(EventType.BLOCK_FAILED, Recipient.resolved(recipientId)))); } void createAndBlock(@NonNull String number) { repository.createAndBlock(number, () -> { loadRecipients(); - events.postValue(new Event(EventType.BLOCK_SUCCEEDED, number)); + events.onNext(new Event(EventType.BLOCK_SUCCEEDED, number)); }); } void unblock(@NonNull RecipientId recipientId) { repository.unblock(recipientId, () -> { loadRecipients(); - events.postValue(new Event(EventType.UNBLOCK_SUCCEEDED, Recipient.resolved(recipientId))); + events.onNext(new Event(EventType.UNBLOCK_SUCCEEDED, Recipient.resolved(recipientId))); }); } private void loadRecipients() { - repository.getBlocked(recipients::postValue); + repository.getBlocked(recipients::onNext); } enum EventType {