Convert all database notifiers to use DatabaseObserver.

Lots of red in this diff to celebrate the release of Red (Taylor's Version).
This commit is contained in:
Greyson Parrelli
2021-11-12 12:14:59 -05:00
committed by Cody Henthorne
parent ab55fec6bd
commit 658de3b6e7
30 changed files with 179 additions and 729 deletions

View File

@@ -99,7 +99,7 @@ public class ViewOnceMessageActivity extends PassphraseRequiredActivity implemen
private void initViewModel(long messageId, @NonNull Uri uri) {
ViewOnceMessageRepository repository = new ViewOnceMessageRepository(this);
viewModel = ViewModelProviders.of(this, new ViewOnceMessageViewModel.Factory(getApplication(), messageId, repository))
viewModel = ViewModelProviders.of(this, new ViewOnceMessageViewModel.Factory(messageId, repository))
.get(ViewOnceMessageViewModel.class);
viewModel.getMessage().observe(this, (message) -> {

View File

@@ -9,6 +9,7 @@ import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.database.DatabaseFactory;
import org.thoughtcrime.securesms.database.MessageDatabase;
import org.thoughtcrime.securesms.database.MmsDatabase;
import org.thoughtcrime.securesms.database.NoSuchMessageException;
import org.thoughtcrime.securesms.database.model.MessageId;
import org.thoughtcrime.securesms.database.model.MmsMessageRecord;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
@@ -31,8 +32,8 @@ class ViewOnceMessageRepository {
void getMessage(long messageId, @NonNull Callback<Optional<MmsMessageRecord>> callback) {
SignalExecutors.BOUNDED.execute(() -> {
try (MmsDatabase.Reader reader = MmsDatabase.readerFor(mmsDatabase.getMessageCursor(messageId))) {
MmsMessageRecord record = (MmsMessageRecord) reader.getNext();
try {
MmsMessageRecord record = (MmsMessageRecord) mmsDatabase.getMessageRecord(messageId);
MessageDatabase.MarkedMessageInfo info = mmsDatabase.setIncomingMessageViewed(record.getId());
if (info != null) {
@@ -44,6 +45,8 @@ class ViewOnceMessageRepository {
}
callback.onComplete(Optional.fromNullable(record));
} catch (NoSuchMessageException e) {
callback.onComplete(Optional.absent());
}
});
}

View File

@@ -1,8 +1,6 @@
package org.thoughtcrime.securesms.revealable;
import android.app.Application;
import android.database.ContentObserver;
import android.net.Uri;
import androidx.annotation.NonNull;
import androidx.lifecycle.LiveData;
@@ -12,37 +10,25 @@ import androidx.lifecycle.ViewModelProvider;
import org.signal.core.util.ThreadUtil;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.database.DatabaseContentProviders;
import org.thoughtcrime.securesms.database.DatabaseObserver;
import org.thoughtcrime.securesms.database.model.MmsMessageRecord;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.whispersystems.libsignal.util.guava.Optional;
class ViewOnceMessageViewModel extends ViewModel {
private static final String TAG = Log.tag(ViewOnceMessageViewModel.class);
private final Application application;
private final ViewOnceMessageRepository repository;
private final MutableLiveData<Optional<MmsMessageRecord>> message;
private final ContentObserver observer;
private final DatabaseObserver.Observer observer;
private ViewOnceMessageViewModel(@NonNull Application application,
long messageId,
@NonNull ViewOnceMessageRepository repository)
{
this.application = application;
this.repository = repository;
this.message = new MutableLiveData<>();
this.observer = new ContentObserver(null) {
@Override
public void onChange(boolean selfChange) {
repository.getMessage(messageId, optionalMessage -> onMessageRetrieved(optionalMessage));
}
};
private ViewOnceMessageViewModel(long messageId, @NonNull ViewOnceMessageRepository repository) {
this.message = new MutableLiveData<>();
this.observer = () -> repository.getMessage(messageId, this::onMessageRetrieved);
repository.getMessage(messageId, message -> {
if (message.isPresent()) {
Uri uri = DatabaseContentProviders.Conversation.getUriForThread(message.get().getThreadId());
application.getContentResolver().registerContentObserver(uri, true, observer);
ApplicationDependencies.getDatabaseObserver().registerConversationObserver(message.get().getThreadId(), observer);
}
onMessageRetrieved(message);
@@ -55,7 +41,7 @@ class ViewOnceMessageViewModel extends ViewModel {
@Override
protected void onCleared() {
application.getContentResolver().unregisterContentObserver(observer);
ApplicationDependencies.getDatabaseObserver().unregisterObserver(observer);
}
private void onMessageRetrieved(@NonNull Optional<MmsMessageRecord> optionalMessage) {
@@ -73,15 +59,10 @@ class ViewOnceMessageViewModel extends ViewModel {
static class Factory extends ViewModelProvider.NewInstanceFactory {
private final Application application;
private final long messageId;
private final ViewOnceMessageRepository repository;
Factory(@NonNull Application application,
long messageId,
@NonNull ViewOnceMessageRepository repository)
{
this.application = application;
Factory(long messageId, @NonNull ViewOnceMessageRepository repository) {
this.messageId = messageId;
this.repository = repository;
}
@@ -89,7 +70,7 @@ class ViewOnceMessageViewModel extends ViewModel {
@Override
public @NonNull <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
//noinspection ConstantConditions
return modelClass.cast(new ViewOnceMessageViewModel(application, messageId, repository));
return modelClass.cast(new ViewOnceMessageViewModel(messageId, repository));
}
}
}