package org.thoughtcrime.securesms.recipients.ui.managerecipient; import android.content.Context; import androidx.annotation.NonNull; import androidx.annotation.WorkerThread; import androidx.core.util.Consumer; import com.annimon.stream.Stream; import org.thoughtcrime.securesms.color.MaterialColor; import org.thoughtcrime.securesms.color.MaterialColors; import org.thoughtcrime.securesms.database.DatabaseFactory; import org.thoughtcrime.securesms.database.GroupDatabase; import org.thoughtcrime.securesms.database.IdentityDatabase; import org.thoughtcrime.securesms.database.ThreadDatabase; import org.thoughtcrime.securesms.mms.OutgoingExpirationUpdateMessage; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.sms.MessageSender; import org.thoughtcrime.securesms.util.concurrent.SignalExecutors; import org.thoughtcrime.securesms.util.concurrent.SimpleTask; import java.util.ArrayList; import java.util.List; final class ManageRecipientRepository { private final Context context; private final RecipientId recipientId; ManageRecipientRepository(@NonNull Context context, @NonNull RecipientId recipientId) { this.context = context; this.recipientId = recipientId; } public RecipientId getRecipientId() { return recipientId; } void getThreadId(@NonNull Consumer onGetThreadId) { SignalExecutors.BOUNDED.execute(() -> onGetThreadId.accept(getThreadId())); } @WorkerThread private long getThreadId() { ThreadDatabase threadDatabase = DatabaseFactory.getThreadDatabase(context); Recipient groupRecipient = Recipient.resolved(recipientId); return threadDatabase.getThreadIdFor(groupRecipient); } void getIdentity(@NonNull Consumer callback) { SignalExecutors.BOUNDED.execute(() -> callback.accept(DatabaseFactory.getIdentityDatabase(context) .getIdentity(recipientId) .orNull())); } void setExpiration(int newExpirationTime) { SignalExecutors.BOUNDED.execute(() -> { DatabaseFactory.getRecipientDatabase(context).setExpireMessages(recipientId, newExpirationTime); OutgoingExpirationUpdateMessage outgoingMessage = new OutgoingExpirationUpdateMessage(Recipient.resolved(recipientId), System.currentTimeMillis(), newExpirationTime * 1000L); MessageSender.send(context, outgoingMessage, getThreadId(), false, null); }); } void getGroupMembership(@NonNull Consumer> onComplete) { SignalExecutors.BOUNDED.execute(() -> { GroupDatabase groupDatabase = DatabaseFactory.getGroupDatabase(context); List groupRecords = groupDatabase.getPushGroupsContainingMember(recipientId); ArrayList groupRecipients = new ArrayList<>(groupRecords.size()); for (GroupDatabase.GroupRecord groupRecord : groupRecords) { groupRecipients.add(groupRecord.getRecipientId()); } onComplete.accept(groupRecipients); }); } public void getRecipient(@NonNull Consumer recipientCallback) { SignalExecutors.BOUNDED.execute(() -> recipientCallback.accept(Recipient.resolved(recipientId))); } void setMuteUntil(long until) { SignalExecutors.BOUNDED.execute(() -> DatabaseFactory.getRecipientDatabase(context).setMuted(recipientId, until)); } void setColor(int color) { SignalExecutors.BOUNDED.execute(() -> { MaterialColor selectedColor = MaterialColors.CONVERSATION_PALETTE.getByColor(context, color); if (selectedColor != null) { DatabaseFactory.getRecipientDatabase(context).setColor(recipientId, selectedColor); } }); } @WorkerThread @NonNull List getSharedGroups(@NonNull RecipientId recipientId) { return Stream.of(DatabaseFactory.getGroupDatabase(context) .getPushGroupsContainingMember(recipientId)) .filter(g -> g.getMembers().contains(Recipient.self().getId())) .map(GroupDatabase.GroupRecord::getRecipientId) .map(Recipient::resolved) .sortBy(gr -> gr.getDisplayName(context)) .toList(); } void getActiveGroupCount(@NonNull Consumer onComplete) { SignalExecutors.BOUNDED.execute(() -> onComplete.accept(DatabaseFactory.getGroupDatabase(context).getActiveGroupCount())); } }