Signal-Android/app/src/main/java/org/thoughtcrime/securesms/conversation/MarkReadHelper.java

61 wiersze
2.3 KiB
Java

package org.thoughtcrime.securesms.conversation;
import android.content.Context;
import androidx.annotation.NonNull;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleOwner;
import org.signal.core.util.concurrent.SignalExecutors;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.database.MessageTable;
import org.thoughtcrime.securesms.database.SignalDatabase;
import org.thoughtcrime.securesms.database.ThreadTable;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.notifications.MarkReadReceiver;
import org.thoughtcrime.securesms.notifications.v2.ConversationId;
import org.thoughtcrime.securesms.util.Debouncer;
import org.thoughtcrime.securesms.util.concurrent.SerialMonoLifoExecutor;
import java.util.List;
import java.util.concurrent.Executor;
public class MarkReadHelper {
private static final String TAG = Log.tag(MarkReadHelper.class);
private static final long DEBOUNCE_TIMEOUT = 100;
private static final Executor EXECUTOR = new SerialMonoLifoExecutor(SignalExecutors.BOUNDED);
private final ConversationId conversationId;
private final Context context;
private final LifecycleOwner lifecycleOwner;
private final Debouncer debouncer = new Debouncer(DEBOUNCE_TIMEOUT);
private long latestTimestamp;
public MarkReadHelper(@NonNull ConversationId conversationId, @NonNull Context context, @NonNull LifecycleOwner lifecycleOwner) {
this.conversationId = conversationId;
this.context = context.getApplicationContext();
this.lifecycleOwner = lifecycleOwner;
}
public void onViewsRevealed(long timestamp) {
if (timestamp <= latestTimestamp || lifecycleOwner.getLifecycle().getCurrentState() != Lifecycle.State.RESUMED) {
return;
}
latestTimestamp = timestamp;
debouncer.publish(() -> {
EXECUTOR.execute(() -> {
ThreadTable threadTable = SignalDatabase.threads();
List<MessageTable.MarkedMessageInfo> infos = threadTable.setReadSince(conversationId, false, timestamp);
Log.d(TAG, "Marking " + infos.size() + " messages as read.");
ApplicationDependencies.getMessageNotifier().updateNotification(context);
MarkReadReceiver.process(context, infos);
});
});
}
}