Remove all remaining usages of annimon.stream.

This commit is contained in:
Jesse Weinstein
2026-04-11 11:08:02 -04:00
committed by jeffrey-signal
parent 7f6e96a522
commit 82df20190d
101 changed files with 458 additions and 548 deletions
@@ -87,6 +87,7 @@ import org.thoughtcrime.securesms.util.views.SimpleProgressDialog;
import java.io.IOException;
import java.util.Collections;
import java.util.stream.Collectors;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
@@ -340,7 +341,7 @@ public final class ContactSelectionListFragment extends LoggingFragment {
this,
currentSelection.stream()
.map(r -> new ContactSearchKey.RecipientSearchKey(r, false))
.collect(java.util.stream.Collectors.toSet()),
.collect(Collectors.toSet()),
selectionLimit,
isMulti,
new ContactSearchAdapter.DisplayOptions(
@@ -467,7 +468,7 @@ public final class ContactSelectionListFragment extends LoggingFragment {
return contactSearchMediator.getSelectedContacts()
.stream()
.map(ContactSearchKey::requireSelectedContact)
.collect(java.util.stream.Collectors.toList());
.collect(Collectors.toList());
}
public int getSelectedContactsCount() {
@@ -662,7 +663,7 @@ public final class ContactSelectionListFragment extends LoggingFragment {
.filter(r -> !contactSearchMediator.getSelectedContacts()
.contains(new ContactSearchKey.RecipientSearchKey(r, false)))
.map(SelectedContact::forRecipientId)
.collect(java.util.stream.Collectors.toSet());
.collect(Collectors.toSet());
if (toMarkSelected.isEmpty()) {
return;
@@ -19,8 +19,7 @@ package org.thoughtcrime.securesms;
import android.content.Intent;
import android.os.Bundle;
import com.annimon.stream.Collectors;
import com.annimon.stream.Stream;
import java.util.stream.Collectors;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.contacts.SelectedContact;
@@ -59,7 +58,7 @@ public class PushContactSelectionActivity extends ContactSelectionActivity {
protected final void onFinishedSelection() {
Intent resultIntent = getIntent();
List<SelectedContact> selectedContacts = contactsFragment.getSelectedContacts();
List<RecipientId> recipients = Stream.of(selectedContacts).map(sc -> sc.getOrCreateRecipientId()).collect(Collectors.toList());
List<RecipientId> recipients = selectedContacts.stream().map(sc -> sc.getOrCreateRecipientId()).collect(Collectors.toList());
resultIntent.putParcelableArrayListExtra(KEY_SELECTED_RECIPIENTS, new ArrayList<>(recipients));
@@ -16,15 +16,14 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import com.annimon.stream.Stream;
import com.bumptech.glide.RequestManager;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import org.signal.glide.decryptableuri.DecryptableUri;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.contactshare.Contact;
import org.thoughtcrime.securesms.contactshare.ContactUtil;
import org.thoughtcrime.securesms.database.RecipientTable;
import org.signal.glide.decryptableuri.DecryptableUri;
import org.thoughtcrime.securesms.recipients.LiveRecipient;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.recipients.RecipientForeverObserver;
@@ -116,7 +115,7 @@ public class SharedContactView extends LinearLayout implements RecipientForeverO
this.locale = locale;
this.contact = contact;
Stream.of(activeRecipients.values()).forEach(recipient -> recipient.removeForeverObserver(this));
activeRecipients.values().stream().forEach(recipient -> recipient.removeForeverObserver(this));
this.activeRecipients.clear();
presentContact(contact);
@@ -7,13 +7,12 @@ import androidx.annotation.NonNull;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import com.annimon.stream.Collectors;
import com.annimon.stream.Stream;
import java.util.stream.Collectors;
import org.signal.core.util.ThreadUtil;
import org.signal.core.util.Util;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.signal.core.util.Util;
import java.util.ArrayList;
import java.util.Collections;
@@ -140,7 +139,7 @@ public class TypingStatusRepository {
notifier.postValue(new TypingState(new ArrayList<>(uniqueTypists), isReplacedByIncomingMessage));
Set<Long> activeThreads = Stream.of(typistMap.keySet()).filter(t -> !typistMap.get(t).isEmpty()).collect(Collectors.toSet());
Set<Long> activeThreads = typistMap.keySet().stream().filter(t -> !typistMap.get(t).isEmpty()).collect(Collectors.toSet());
threadsNotifier.postValue(activeThreads);
}
@@ -9,8 +9,7 @@ import androidx.annotation.MainThread;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.annimon.stream.Collectors;
import com.annimon.stream.Stream;
import java.util.stream.Collectors;
import com.fasterxml.jackson.databind.type.CollectionType;
import com.fasterxml.jackson.databind.type.TypeFactory;
@@ -73,7 +72,7 @@ public class RecentEmojiPageModel implements EmojiPageModel {
}
@Override public List<Emoji> getDisplayEmoji() {
return Stream.of(getEmoji()).map(Emoji::new).collect(Collectors.toList());
return getEmoji().stream().map(Emoji::new).collect(Collectors.toList());
}
@Override public @Nullable Uri getSpriteUri() {
@@ -8,14 +8,14 @@ import android.text.Spanned;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.annimon.stream.Collectors;
import com.annimon.stream.Stream;
import java.util.stream.Collectors;
import org.thoughtcrime.securesms.database.model.Mention;
import org.thoughtcrime.securesms.recipients.RecipientId;
import java.util.Collections;
import java.util.List;
import java.util.stream.Stream;
/**
* This wraps an Android standard {@link Annotation} so it can leverage the built in
@@ -52,8 +52,8 @@ public final class MentionAnnotation {
public static @NonNull List<Mention> getMentionsFromAnnotations(@Nullable CharSequence text) {
if (text instanceof Spanned) {
Spanned spanned = (Spanned) text;
return Stream.of(getMentionAnnotations(spanned))
.map(annotation -> {
return getMentionAnnotations(spanned).stream()
.map(annotation -> {
int spanStart = spanned.getSpanStart(annotation);
int spanLength = spanned.getSpanEnd(annotation) - spanStart;
return new Mention(RecipientId.from(annotation.getValue()), spanStart, spanLength);
@@ -7,7 +7,6 @@ import android.content.Context;
import android.content.SyncResult;
import android.os.Bundle;
import com.annimon.stream.Stream;
import org.signal.contacts.SystemContactsRepository;
import org.signal.core.util.logging.Log;
@@ -70,10 +69,10 @@ public class ContactsSyncAdapter extends AbstractThreadedSyncAdapter {
Log.w(TAG, e);
}
} else if (unknownSystemE164s.size() > 0) {
List<Recipient> recipients = Stream.of(unknownSystemE164s)
.filter(s -> s.startsWith("+"))
.map(s -> Recipient.external(s))
.filter(it -> it != null).collect(com.annimon.stream.Collectors.toList());
List<Recipient> recipients = unknownSystemE164s.stream()
.filter(s -> s.startsWith("+"))
.map(s -> Recipient.external(s))
.filter(it -> it != null).collect(Collectors.toList());
Log.i(TAG, "There are " + unknownSystemE164s.size() + " unknown E164s, which are now " + recipients.size() + " recipients. Only syncing these specific contacts.");
@@ -14,8 +14,7 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.RecyclerView;
import com.annimon.stream.Collectors;
import com.annimon.stream.Stream;
import java.util.stream.Collectors;
import com.bumptech.glide.RequestManager;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
@@ -76,9 +75,9 @@ class ContactFieldAdapter extends RecyclerView.Adapter<ContactFieldAdapter.Conta
fields.add(new Field(avatar));
}
fields.addAll(Stream.of(phoneNumbers).map(phone -> new Field(context, phone, locale)).collect(Collectors.toList()));
fields.addAll(Stream.of(emails).map(email -> new Field(context, email)).collect(Collectors.toList()));
fields.addAll(Stream.of(postalAddresses).map(address -> new Field(context, address)).collect(Collectors.toList()));
fields.addAll(phoneNumbers.stream().map(phone -> new Field(context, phone, locale)).collect(Collectors.toList()));
fields.addAll(emails.stream().map(email -> new Field(context, email)).collect(Collectors.toList()));
fields.addAll(postalAddresses.stream().map(address -> new Field(context, address)).collect(Collectors.toList()));
notifyDataSetChanged();
}
@@ -8,8 +8,7 @@ import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;
import androidx.lifecycle.ViewModelProvider;
import com.annimon.stream.Collectors;
import com.annimon.stream.Stream;
import java.util.stream.Collectors;
import org.thoughtcrime.securesms.contactshare.Contact.Name;
import org.thoughtcrime.securesms.util.SingleLiveEvent;
@@ -83,7 +82,7 @@ class ContactShareEditViewModel extends ViewModel {
}
private <E extends Selectable> List<E> trimSelectables(List<E> selectables) {
return Stream.of(selectables).filter(Selectable::isSelected).collect(Collectors.toList());
return selectables.stream().filter(Selectable::isSelected).collect(Collectors.toList());
}
@NonNull
@@ -12,7 +12,6 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.WorkerThread;
import com.annimon.stream.Stream;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.i18n.phonenumbers.NumberParseException;
import com.google.i18n.phonenumbers.PhoneNumberUtil;
@@ -98,7 +97,7 @@ public final class ContactUtil {
return null;
}
List<Phone> mobileNumbers = Stream.of(contact.getPhoneNumbers()).filter(number -> number.getType() == Phone.Type.MOBILE).collect(com.annimon.stream.Collectors.toList());
List<Phone> mobileNumbers = contact.getPhoneNumbers().stream().filter(number -> number.getType() == Phone.Type.MOBILE).collect(Collectors.toList());
if (mobileNumbers.size() > 0) {
return mobileNumbers.get(0);
}
@@ -17,6 +17,7 @@ import org.thoughtcrime.securesms.util.MediaUtil;
import org.thoughtcrime.securesms.util.adapter.StableIdGenerator;
import java.util.ArrayList;
import java.util.stream.Collectors;
import java.util.List;
import java.util.concurrent.TimeUnit;
@@ -75,7 +76,7 @@ class AttachmentKeyboardMediaAdapter extends RecyclerView.Adapter<AttachmentKeyb
public void setMedia(@NonNull List<Media> media, boolean addFooter) {
this.media.clear();
this.media.addAll(media.stream().map(MediaContent::new).collect(java.util.stream.Collectors.toList()));
this.media.addAll(media.stream().map(MediaContent::new).collect(Collectors.toList()));
if (addFooter) {
this.media.add(new MediaContent(true));
}
@@ -30,8 +30,7 @@ import androidx.core.view.ViewKt;
import androidx.core.view.WindowInsetsCompat;
import androidx.vectordrawable.graphics.drawable.AnimatorInflaterCompat;
import com.annimon.stream.Collectors;
import com.annimon.stream.Stream;
import java.util.stream.Stream;
import org.signal.core.ui.compose.SignalIcons;
import org.signal.core.util.DimensionUnit;
@@ -52,6 +51,7 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.stream.LongStream;
import java.util.stream.Collectors;
import kotlin.Unit;
@@ -673,15 +673,15 @@ public final class ConversationReactionOverlay extends FrameLayout {
}
private static @Nullable String getOldEmoji(@NonNull MessageRecord messageRecord) {
return Stream.of(messageRecord.getReactions())
.filter(record -> record.getAuthor()
return messageRecord.getReactions().stream()
.filter(record -> record.getAuthor()
.serialize()
.equals(Recipient.self()
.getId()
.serialize()))
.findFirst()
.map(ReactionRecord::getEmoji)
.orElse(null);
.findFirst()
.map(ReactionRecord::getEmoji)
.orElse(null);
}
private @NonNull List<ActionItem> getMenuActionItems(@NonNull ConversationMessage conversationMessage) {
@@ -785,7 +785,7 @@ public final class ConversationReactionOverlay extends FrameLayout {
anim.setTarget(emojiViews[idx.intValue()]);
anim.setStartDelay(idx * animationEmojiStartDelayFactor);
return anim;
}).collect(java.util.stream.Collectors.toList());
}).collect(Collectors.toList());
Animator backgroundRevealAnim = AnimatorInflaterCompat.loadAnimator(getContext(), android.R.animator.fade_in);
backgroundRevealAnim.setTarget(backgroundView);
@@ -13,7 +13,6 @@ import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleOwner;
import androidx.recyclerview.widget.LinearLayoutManager;
import com.annimon.stream.Stream;
import org.signal.core.util.concurrent.SignalExecutors;
import org.signal.core.util.logging.Log;
@@ -128,7 +127,7 @@ public class MarkReadHelper {
if (item != null) {
MessageRecord record = item.getMessageRecord();
long latestReactionReceived = Stream.of(record.getReactions())
long latestReactionReceived = record.getReactions().stream()
.map(ReactionRecord::getDateReceived)
.max(Long::compareTo)
.orElse(0L);
@@ -22,8 +22,7 @@ import androidx.lifecycle.ViewModelProvider;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.annimon.stream.Collectors;
import com.annimon.stream.Stream;
import java.util.stream.Collectors;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import org.signal.core.util.logging.Log;
@@ -34,6 +33,7 @@ import org.thoughtcrime.securesms.verify.VerifyIdentityActivity;
import java.util.Collection;
import java.util.List;
import java.util.stream.Stream;
public final class SafetyNumberChangeDialog extends DialogFragment implements SafetyNumberChangeAdapter.Callbacks {
@@ -72,10 +72,10 @@ public final class SafetyNumberChangeDialog extends DialogFragment implements Sa
}
public static void showForGroupCall(@NonNull FragmentManager fragmentManager, @NonNull List<IdentityRecord> identityRecords) {
List<String> ids = Stream.of(identityRecords)
.filter(identityRecord -> !identityRecord.isFirstUse())
.map(record -> record.getRecipientId().serialize())
.distinct().collect(Collectors.toList());
List<String> ids = identityRecords.stream()
.filter(identityRecord -> !identityRecord.isFirstUse())
.map(record -> record.getRecipientId().serialize())
.distinct().collect(Collectors.toList());
Bundle arguments = new Bundle();
arguments.putStringArray(RECIPIENT_IDS_EXTRA, ids.toArray(new String[0]));
@@ -92,9 +92,9 @@ public final class SafetyNumberChangeDialog extends DialogFragment implements Sa
return;
}
List<String> ids = Stream.of(recipientIds)
.map(RecipientId::serialize)
.distinct().collect(Collectors.toList());
List<String> ids = recipientIds.stream()
.map(RecipientId::serialize)
.distinct().collect(Collectors.toList());
Bundle arguments = new Bundle();
arguments.putStringArray(RECIPIENT_IDS_EXTRA, ids.toArray(new String[0]));
@@ -8,8 +8,7 @@ import androidx.annotation.WorkerThread;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import com.annimon.stream.Stream;
import org.signal.core.util.Util;
import org.signal.core.util.concurrent.SignalExecutors;
import org.signal.core.util.logging.Log;
import org.signal.libsignal.protocol.IdentityKey;
@@ -28,7 +27,6 @@ import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.recipients.RecipientId;
import org.thoughtcrime.securesms.safety.SafetyNumberRecipient;
import org.thoughtcrime.securesms.sms.MessageSender;
import org.signal.core.util.Util;
import org.whispersystems.signalservice.api.SignalSessionLock;
import org.whispersystems.signalservice.api.push.SignalServiceAddress;
@@ -89,10 +87,10 @@ public final class SafetyNumberChangeRepository {
messageRecord = getMessageRecord(messageId, messageType);
}
List<Recipient> recipients = Stream.of(recipientIds).map(Recipient::resolved).collect(com.annimon.stream.Collectors.toList());
List<Recipient> recipients = recipientIds.stream().map(Recipient::resolved).collect(Collectors.toList());
List<ChangedRecipient> changedRecipients = Stream.of(AppDependencies.getProtocolStore().aci().identities().getIdentityRecords(recipients).getIdentityRecords())
.map(record -> new ChangedRecipient(Recipient.resolved(record.getRecipientId()), record)).collect(com.annimon.stream.Collectors.toList());
List<ChangedRecipient> changedRecipients = AppDependencies.getProtocolStore().aci().identities().getIdentityRecords(recipients).getIdentityRecords().stream()
.map(record -> new ChangedRecipient(Recipient.resolved(record.getRecipientId()), record)).collect(Collectors.toList());
Log.d(TAG, "Safety number change state, message: " + (messageRecord != null ? messageRecord.getId() : "null") + " records: " + Util.join(changedRecipients, ","));
@@ -3,8 +3,7 @@ package org.thoughtcrime.securesms.conversation.ui.error;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.annimon.stream.Collectors;
import com.annimon.stream.Stream;
import java.util.stream.Collectors;
import org.thoughtcrime.securesms.database.model.MessageRecord;
import org.thoughtcrime.securesms.recipients.RecipientId;
@@ -29,7 +28,7 @@ public class TrustAndVerifyResult {
}
TrustAndVerifyResult(@NonNull List<ChangedRecipient> changedRecipients, @Nullable MessageRecord messageRecord, @NonNull Result result) {
this.changedRecipients = Stream.of(changedRecipients).map(changedRecipient -> changedRecipient.getRecipient().getId()).collect(Collectors.toList());
this.changedRecipients = changedRecipients.stream().map(changedRecipient -> changedRecipient.getRecipient().getId()).collect(Collectors.toList());
this.messageRecord = messageRecord;
this.result = result;
}
@@ -8,8 +8,7 @@ import androidx.lifecycle.Transformations;
import androidx.lifecycle.ViewModel;
import androidx.lifecycle.ViewModelProvider;
import com.annimon.stream.Collectors;
import com.annimon.stream.Stream;
import java.util.stream.Collectors;
import org.thoughtcrime.securesms.conversation.ui.mentions.MentionsPickerRepository.MentionQuery;
import org.thoughtcrime.securesms.recipients.LiveRecipient;
@@ -41,7 +40,7 @@ public class MentionsPickerViewModel extends ViewModel {
LiveData<MentionQuery> mentionQuery = LiveDataUtil.combineLatest(liveQuery, fullMembers, (q, m) -> new MentionQuery(q.query, m));
this.mentionList = LiveDataUtil.mapAsync(mentionQuery, q -> Stream.of(mentionsPickerRepository.search(q)).<MappingModel<?>>map(MentionViewState::new).collect(Collectors.toList()));
this.mentionList = LiveDataUtil.mapAsync(mentionQuery, q -> mentionsPickerRepository.search(q).stream().<MappingModel<?>>map(MentionViewState::new).collect(Collectors.toList()));
}
@NonNull LiveData<List<MappingModel<?>>> getMentionList() {
@@ -5,7 +5,6 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.WorkerThread;
import com.annimon.stream.Stream;
import org.signal.core.util.Base64;
import org.signal.core.util.logging.Log;
@@ -99,7 +98,7 @@ public class SealedSenderAccessUtil {
return Optional.ofNullable(unidentifiedAccess);
}).collect(Collectors.toList());
int unidentifiedCount = Stream.of(access).filter(Optional::isPresent).collect(com.annimon.stream.Collectors.toList()).size();
int unidentifiedCount = access.stream().filter(Optional::isPresent).collect(Collectors.toList()).size();
int otherCount = access.size() - unidentifiedCount;
if (log) {
@@ -8,7 +8,6 @@ import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import androidx.annotation.WorkerThread;
import com.annimon.stream.Stream;
import java.util.function.Function;
import org.thoughtcrime.securesms.database.model.Mention;
@@ -117,12 +116,12 @@ public final class MentionUtil {
public static @NonNull List<Mention> bodyRangeListToMentions(@Nullable BodyRangeList bodyRanges) {
if (bodyRanges != null) {
return Stream.of(bodyRanges.ranges)
.filter(bodyRange -> bodyRange.mentionUuid != null)
.map(mention -> {
return bodyRanges.ranges.stream()
.filter(bodyRange -> bodyRange.mentionUuid != null)
.map(mention -> {
RecipientId id = Recipient.externalPush(ServiceId.parseOrThrow(mention.mentionUuid)).getId();
return new Mention(id, mention.start, mention.length);
}).collect(com.annimon.stream.Collectors.toList());
}).collect(Collectors.toList());
} else {
return Collections.emptyList();
}
@@ -3,7 +3,6 @@ package org.thoughtcrime.securesms.database;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.annimon.stream.Stream;
import com.mobilecoin.lib.KeyImage;
import com.mobilecoin.lib.Receipt;
import com.mobilecoin.lib.RistrettoPublic;
@@ -13,8 +13,6 @@ import android.os.SystemClock
import android.preference.PreferenceManager
import android.text.TextUtils
import androidx.core.content.contentValuesOf
import com.annimon.stream.Collectors
import com.annimon.stream.Stream
import org.signal.core.models.ServiceId.ACI
import org.signal.core.util.Base64
import org.signal.core.util.CursorUtil
@@ -649,9 +647,8 @@ object V149_LegacyMigrations : SignalDatabaseMigration {
if (oldVersion < NOTIFICATION_RECIPIENT_IDS && Build.VERSION.SDK_INT >= 26) {
val notificationManager = ServiceUtil.getNotificationManager(context)
val channels = Stream.of(notificationManager.notificationChannels)
val channels = notificationManager.notificationChannels
.filter { c: NotificationChannel -> c.id.startsWith("contact_") }
.collect(Collectors.toList())
Log.i(TAG, "Migrating " + channels.size + " channels to use RecipientId's.")
@@ -11,8 +11,7 @@ import androidx.annotation.NonNull;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.Transformations;
import com.annimon.stream.Collectors;
import com.annimon.stream.Stream;
import java.util.stream.Collectors;
import org.thoughtcrime.securesms.fonts.SignalSymbols;
import org.thoughtcrime.securesms.fonts.SignalSymbols.Glyph;
@@ -42,8 +41,8 @@ public final class LiveUpdateMessage {
return LiveDataUtil.just(toSpannable(context, updateDescription, updateDescription.getStaticSpannable(), defaultTint, adjustPosition));
}
List<LiveData<Recipient>> allMentionedRecipients = Stream.of(updateDescription.getMentioned())
.map(uuid -> Recipient.resolved(RecipientId.from(uuid)).live().getLiveData()).collect(Collectors.toList());
List<LiveData<Recipient>> allMentionedRecipients = updateDescription.getMentioned().stream()
.map(uuid -> Recipient.resolved(RecipientId.from(uuid)).live().getLiveData()).collect(Collectors.toList());
LiveData<?> mentionedRecipientChangeStream = allMentionedRecipients.isEmpty() ? LiveDataUtil.just(new Object())
: LiveDataUtil.merge(allMentionedRecipients);
@@ -30,8 +30,7 @@ import androidx.annotation.VisibleForTesting;
import androidx.annotation.WorkerThread;
import androidx.core.content.ContextCompat;
import com.annimon.stream.Collectors;
import com.annimon.stream.Stream;
import java.util.stream.Collectors;
import org.signal.core.util.Base64;
import org.signal.core.util.BidiUtil;
@@ -594,9 +593,9 @@ public abstract class MessageRecord extends DisplayRecord {
public static @NonNull UpdateDescription getGroupCallUpdateDescription(@NonNull Context context, @NonNull String body, boolean withTime) {
GroupCallUpdateDetails groupCallUpdateDetails = GroupCallUpdateDetailsUtil.parse(body);
List<ServiceId> joinedMembers = Stream.of(groupCallUpdateDetails.inCallUuids)
.map(UuidUtil::parseOrNull).filter(Objects::nonNull)
.<ServiceId>map(ACI::from).collect(Collectors.toList());
List<ServiceId> joinedMembers = groupCallUpdateDetails.inCallUuids.stream()
.map(UuidUtil::parseOrNull).filter(Objects::nonNull)
.<ServiceId>map(ACI::from).collect(Collectors.toList());
UpdateDescription.SpannableFactory stringFactory = new GroupCallUpdateMessageFactory(context, joinedMembers, withTime, groupCallUpdateDetails);
@@ -3,7 +3,6 @@ package org.thoughtcrime.securesms.delete;
import androidx.annotation.NonNull;
import androidx.core.util.Consumer;
import com.annimon.stream.Stream;
import com.google.i18n.phonenumbers.PhoneNumberUtil;
import org.signal.core.util.E164Util;
@@ -10,7 +10,6 @@ import androidx.lifecycle.Transformations;
import androidx.lifecycle.ViewModel;
import androidx.lifecycle.ViewModelProvider;
import com.annimon.stream.Stream;
import com.google.i18n.phonenumbers.NumberParseException;
import com.google.i18n.phonenumbers.PhoneNumberUtil;
import com.google.i18n.phonenumbers.Phonenumber;
@@ -10,7 +10,6 @@ import androidx.lifecycle.Transformations;
import androidx.lifecycle.ViewModel;
import androidx.lifecycle.ViewModelProvider;
import com.annimon.stream.Stream;
import org.signal.paging.LivePagedData;
import org.signal.paging.PagedData;
@@ -9,8 +9,7 @@ import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.Transformations;
import com.annimon.stream.Collectors;
import com.annimon.stream.Stream;
import java.util.stream.Collectors;
import org.signal.core.models.ServiceId;
import org.signal.core.util.concurrent.SignalExecutors;
@@ -88,12 +87,12 @@ public final class LiveGroup {
protected static LiveData<List<GroupMemberEntry.FullMember>> mapToFullMembers(@NonNull LiveData<GroupRecord> groupRecord) {
return LiveDataUtil.mapAsync(groupRecord,
g -> Stream.of(g.getMembers())
.map(m -> {
g -> g.getMembers().stream()
.map(m -> {
Recipient recipient = Recipient.resolved(m);
return new GroupMemberEntry.FullMember(recipient, g.isAdmin(recipient));
})
.sorted(MEMBER_ORDER).collect(Collectors.toList()));
.sorted(MEMBER_ORDER).collect(Collectors.toList()));
}
protected static LiveData<List<GroupMemberEntry.RequestingMember>> mapToRequestingMembers(@NonNull LiveData<GroupRecord> groupRecord) {
@@ -106,8 +105,8 @@ public final class LiveGroup {
boolean selfAdmin = g.isAdmin(Recipient.self());
List<DecryptedRequestingMember> requestingMembersList = g.requireV2GroupProperties().getDecryptedGroup().requestingMembers;
return Stream.of(requestingMembersList)
.map(requestingMember -> {
return requestingMembersList.stream()
.map(requestingMember -> {
Recipient recipient = Recipient.externalPush(ServiceId.parseOrThrow(requestingMember.aciBytes));
return new GroupMemberEntry.RequestingMember(recipient, selfAdmin);
}).collect(Collectors.toList());
@@ -194,8 +193,8 @@ public final class LiveGroup {
public LiveData<List<GroupMemberEntry.FullMember>> getNonAdminFullMembers() {
return Transformations.map(fullMembers,
members -> Stream.of(members)
.filter(fullMember -> !fullMember.isAdmin()).collect(Collectors.toList()));
members -> members.stream()
.filter(fullMember -> !fullMember.isAdmin()).collect(Collectors.toList()));
}
public LiveData<List<GroupMemberEntry.FullMember>> getFullMembers() {
@@ -10,8 +10,7 @@ import androidx.lifecycle.LifecycleOwner;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.annimon.stream.Collectors;
import com.annimon.stream.Stream;
import java.util.stream.Collectors;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.recipients.Recipient;
@@ -82,7 +81,7 @@ public final class GroupMemberListView extends RecyclerView {
}
public void setDisplayOnlyMembers(@NonNull List<Recipient> recipients) {
membersAdapter.updateData(Stream.of(recipients).map(r -> new GroupMemberEntry.FullMember(r, false)).collect(Collectors.toList()));
membersAdapter.updateData(recipients.stream().map(r -> new GroupMemberEntry.FullMember(r, false)).collect(Collectors.toList()));
}
@Override
@@ -7,7 +7,6 @@ import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.fragment.app.FragmentActivity;
import com.annimon.stream.Stream;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import org.signal.core.util.logging.Log;
@@ -62,7 +61,7 @@ public final class LeaveGroupDialog {
if (groupProperties != null && groupProperties.isAdmin(Recipient.self())) {
List<Recipient> otherMemberRecipients = groupProperties.getMemberRecipients(GroupTable.MemberSet.FULL_MEMBERS_EXCLUDING_SELF);
long otherAdminsCount = Stream.of(otherMemberRecipients).filter(groupProperties::isAdmin).count();
long otherAdminsCount = otherMemberRecipients.stream().filter(groupProperties::isAdmin).count();
return otherAdminsCount == 0 && !otherMemberRecipients.isEmpty();
}
@@ -11,8 +11,7 @@ import androidx.annotation.NonNull;
import androidx.appcompat.widget.Toolbar;
import androidx.lifecycle.ViewModelProvider;
import com.annimon.stream.Collectors;
import com.annimon.stream.Stream;
import java.util.stream.Collectors;
import org.thoughtcrime.securesms.MainActivity;
import org.thoughtcrime.securesms.PassphraseRequiredActivity;
@@ -74,10 +73,10 @@ public final class ChooseNewAdminActivity extends PassphraseRequiredActivity {
initializeViewModel();
groupList.initializeAdapter(this);
groupList.setRecipientSelectionChangeListener(selection -> viewModel.setSelection(Stream.of(selection)
.filter(x -> x instanceof GroupMemberEntry.FullMember)
.map(x-> (GroupMemberEntry.FullMember)x)
.collect(Collectors.toSet())));
groupList.setRecipientSelectionChangeListener(selection -> viewModel.setSelection(selection.stream()
.filter(x -> x instanceof GroupMemberEntry.FullMember)
.map(x-> (GroupMemberEntry.FullMember)x)
.collect(Collectors.toSet())));
done.setOnClickListener(v -> {
done.setSpinning();
@@ -7,8 +7,7 @@ import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;
import androidx.lifecycle.ViewModelProvider;
import com.annimon.stream.Collectors;
import com.annimon.stream.Stream;
import java.util.stream.Collectors;
import org.thoughtcrime.securesms.dependencies.AppDependencies;
import org.thoughtcrime.securesms.groups.GroupId;
@@ -51,7 +50,7 @@ final class ChooseNewAdminViewModel extends ViewModel {
void updateAdminsAndLeave(@NonNull Consumer<GroupChangeResult> consumer) {
//noinspection ConstantConditions
List<RecipientId> recipientIds = Stream.of(selection.getValue()).map(entry -> entry.getMember().getId()).collect(Collectors.toList());
List<RecipientId> recipientIds = selection.getValue().stream().map(entry -> entry.getMember().getId()).collect(Collectors.toList());
SimpleTask.run(() -> repository.updateAdminsAndLeave(groupId, recipientIds), consumer::accept);
}
@@ -6,7 +6,6 @@ import androidx.annotation.NonNull;
import androidx.annotation.WorkerThread;
import androidx.core.util.Consumer;
import com.annimon.stream.Stream;
import org.signal.core.util.concurrent.SignalExecutors;
import org.signal.core.util.logging.Log;
@@ -28,7 +27,7 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.concurrent.Executor;
import com.annimon.stream.Collectors;
import java.util.stream.Collectors;
import okio.ByteString;
@@ -60,7 +59,7 @@ final class PendingMemberInvitesRepository {
ByteString self = SignalStore.account().requireAci().toByteString();
boolean selfIsAdmin = v2GroupProperties.isAdmin(Recipient.self());
Stream.of(pendingMembersList)
pendingMembersList.stream()
.collect(Collectors.groupingBy(m -> m.addedByAci))
.entrySet()
.forEach(g ->
@@ -15,7 +15,7 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.text.util.LinkifyCompat;
import com.annimon.stream.Stream;
import java.util.stream.Stream;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.components.emoji.EmojiTextView;
@@ -22,7 +22,6 @@ import androidx.appcompat.widget.Toolbar;
import androidx.lifecycle.ViewModelProvider;
import androidx.navigation.Navigation;
import com.annimon.stream.Stream;
import org.signal.core.util.ResourceUtil;
import org.signal.core.ui.logging.LoggingFragment;
@@ -110,7 +109,7 @@ public class HelpFragment extends LoggingFragment {
private void initializeListeners() {
problem.addTextChangedListener(new AfterTextChanged(e -> helpViewModel.onProblemChanged(e.toString())));
Stream.of(emoji).forEach(view -> view.setOnClickListener(this::handleEmojiClicked));
emoji.stream().forEach(view -> view.setOnClickListener(this::handleEmojiClicked));
faq.setOnClickListener(v -> launchFaq());
debugLogInfo.setOnClickListener(v -> launchDebugLogInfo());
next.setOnClickListener(v -> submitForm());
@@ -150,7 +149,7 @@ public class HelpFragment extends LoggingFragment {
if (clicked.isSelected()) {
clicked.setSelected(false);
} else {
Stream.of(emoji).forEach(view -> view.setSelected(false));
emoji.stream().forEach(view -> view.setSelected(false));
clicked.setSelected(true);
}
}
@@ -185,10 +184,10 @@ public class HelpFragment extends LoggingFragment {
}
private void submitFormWithDebugLog(@Nullable String debugLog) {
Feeling feeling = Stream.of(emoji)
.filter(View::isSelected)
.map(view -> Feeling.getByViewId(view.getId()))
.findFirst().orElse(null);
Feeling feeling = emoji.stream()
.filter(View::isSelected)
.map(view -> Feeling.getByViewId(view.getId()))
.findFirst().orElse(null);
CommunicationActions.openEmail(requireContext(),
@@ -5,7 +5,6 @@ import android.os.HandlerThread;
import androidx.annotation.NonNull;
import com.annimon.stream.Stream;
import org.signal.core.util.ThreadUtil;
import org.signal.core.util.logging.Log;
@@ -40,7 +39,7 @@ class InAppScheduler implements Scheduler {
@Override
public void schedule(long delay, @NonNull List<Constraint> constraints) {
if (delay > 0 && Stream.of(constraints).allMatch(Constraint::isMet)) {
if (delay > 0 && constraints.stream().allMatch(Constraint::isMet)) {
Log.i(TAG, "Scheduling a retry in " + delay + " ms.");
handler.postDelayed(() -> {
Log.i(TAG, "Triggering a job retry.");
@@ -7,8 +7,7 @@ import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import androidx.annotation.WorkerThread;
import com.annimon.stream.Collectors;
import com.annimon.stream.Stream;
import java.util.stream.Collectors;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.jobmanager.persistence.ConstraintSpec;
@@ -120,7 +119,7 @@ class JobController {
@WorkerThread
void submitNewJobChain(@NonNull List<List<Job>> chain) {
synchronized (this) {
chain = Stream.of(chain).filter(jobs -> !jobs.isEmpty()).collect(Collectors.toList());
chain = chain.stream().filter(jobs -> !jobs.isEmpty()).collect(Collectors.toList());
if (chain.isEmpty()) {
Log.w(TAG, "Tried to submit an empty job chain. Skipping.");
@@ -163,13 +162,13 @@ class JobController {
}
Set<String> allDependsOn = new HashSet<>(dependsOn);
Set<String> aliveDependsOn = Stream.of(dependsOn)
.filter(id -> jobStorage.getJobSpec(id) != null)
.collect(Collectors.toSet());
Set<String> aliveDependsOn = dependsOn.stream()
.filter(id -> jobStorage.getJobSpec(id) != null)
.collect(Collectors.toSet());
if (dependsOnQueue != null) {
List<String> inQueue = Stream.of(jobStorage.getJobsInQueue(dependsOnQueue))
.map(JobSpec::getId).collect(Collectors.toList());
List<String> inQueue = jobStorage.getJobsInQueue(dependsOnQueue).stream()
.map(JobSpec::getId).collect(Collectors.toList());
allDependsOn.addAll(inQueue);
aliveDependsOn.addAll(inQueue);
@@ -220,7 +219,7 @@ class JobController {
return;
}
List<FullSpec> fullSpecs = canRun.stream().map(it -> buildFullSpec(it, Collections.emptyList())).collect(java.util.stream.Collectors.toList());
List<FullSpec> fullSpecs = canRun.stream().map(it -> buildFullSpec(it, Collections.emptyList())).collect(Collectors.toList());
jobStorage.insertJobs(fullSpecs);
scheduleJobs(canRun);
@@ -268,7 +267,7 @@ class JobController {
// We have no control over what happens in jobs' onFailure method, so we drop our lock to reduce the possibility of a deadlock
if (inactiveJob != null) {
inactiveJob.onFailure();
Stream.of(inactiveJobDependents).forEach(Job::onFailure);
inactiveJobDependents.stream().forEach(Job::onFailure);
}
}
@@ -279,7 +278,7 @@ class JobController {
jobsInQueue = jobStorage.getJobsInQueue(queue);
}
Stream.of(jobsInQueue)
jobsInQueue.stream()
.map(JobSpec::getId)
.forEach(this::cancelJob);
}
@@ -307,9 +306,9 @@ class JobController {
jobStorage.updateJobAfterRetry(job.getId(), System.currentTimeMillis(), nextRunAttempt, backoffInterval, serializedData);
jobTracker.onStateChange(job, JobTracker.JobState.PENDING);
List<Constraint> constraints = Stream.of(jobStorage.getConstraintSpecs(job.getId()))
.map(ConstraintSpec::getFactoryKey)
.map(constraintInstantiator::instantiate).collect(Collectors.toList());
List<Constraint> constraints = jobStorage.getConstraintSpecs(job.getId()).stream()
.map(ConstraintSpec::getFactoryKey)
.map(constraintInstantiator::instantiate).collect(Collectors.toList());
Log.i(TAG, JobLogger.format(job, "Scheduling a retry in " + backoffInterval + " ms."));
@@ -325,10 +324,10 @@ class JobController {
@WorkerThread
synchronized void onSuccess(@NonNull Job job, @Nullable byte[] outputData) {
if (outputData != null) {
List<JobSpec> updates = Stream.of(jobStorage.getDependencySpecsThatDependOnJob(job.getId()))
.map(DependencySpec::getJobId)
.map(jobStorage::getJobSpec)
.map(jobSpec -> mapToJobWithInputData(jobSpec, outputData)).collect(Collectors.toList());
List<JobSpec> updates = jobStorage.getDependencySpecsThatDependOnJob(job.getId()).stream()
.map(DependencySpec::getJobId)
.map(jobStorage::getJobSpec)
.map(jobSpec -> mapToJobWithInputData(jobSpec, outputData)).collect(Collectors.toList());
jobStorage.updateJobs(updates);
}
@@ -343,10 +342,10 @@ class JobController {
*/
@WorkerThread
synchronized @NonNull List<Job> onFailure(@NonNull Job job) {
List<Job> dependents = Stream.of(jobStorage.getDependencySpecsThatDependOnJob(job.getId()))
.map(DependencySpec::getJobId)
.map(jobStorage::getJobSpec).filter(Objects::nonNull)
.map(jobSpec -> {
List<Job> dependents = jobStorage.getDependencySpecsThatDependOnJob(job.getId()).stream()
.map(DependencySpec::getJobId)
.map(jobStorage::getJobSpec).filter(Objects::nonNull)
.map(jobSpec -> {
List<ConstraintSpec> constraintSpecs = jobStorage.getConstraintSpecs(jobSpec.getId());
return createJob(jobSpec, constraintSpecs);
}).collect(Collectors.toList());
@@ -355,8 +354,8 @@ class JobController {
all.add(job);
all.addAll(dependents);
jobStorage.deleteJobs(Stream.of(all).map(Job::getId).collect(Collectors.toList()));
Stream.of(all).forEach(j -> jobTracker.onStateChange(j, JobTracker.JobState.FAILURE));
jobStorage.deleteJobs(all.stream().map(Job::getId).collect(Collectors.toList()));
all.stream().forEach(j -> jobTracker.onStateChange(j, JobTracker.JobState.FAILURE));
return dependents;
}
@@ -408,7 +407,7 @@ class JobController {
*/
@WorkerThread
synchronized @NonNull String getDebugInfo() {
List<JobSpec> running = runningJobs.keySet().stream().map(jobStorage::getJobSpec).collect(java.util.stream.Collectors.toList());
List<JobSpec> running = runningJobs.keySet().stream().map(jobStorage::getJobSpec).collect(Collectors.toList());
List<JobSpec> jobs = jobStorage.debugGetJobSpecs(1000);
List<ConstraintSpec> constraints = jobStorage.debugGetConstraintSpecs(1000);
List<DependencySpec> dependencies = jobStorage.debugGetAllDependencySpecs();
@@ -429,21 +428,21 @@ class JobController {
info.append("\n-- Jobs\n");
if (!jobs.isEmpty()) {
Stream.of(jobs).forEach(j -> info.append(j.toString()).append('\n'));
jobs.stream().forEach(j -> info.append(j.toString()).append('\n'));
} else {
info.append("None\n");
}
info.append("\n-- Constraints\n");
if (!constraints.isEmpty()) {
Stream.of(constraints).forEach(c -> info.append(c.toString()).append('\n'));
constraints.stream().forEach(c -> info.append(c.toString()).append('\n'));
} else {
info.append("None\n");
}
info.append("\n-- Dependencies\n");
if (!dependencies.isEmpty()) {
Stream.of(dependencies).forEach(d -> info.append(d.toString()).append('\n'));
dependencies.stream().forEach(d -> info.append(d.toString()).append('\n'));
} else {
info.append("None\n");
}
@@ -574,8 +573,8 @@ class JobController {
@WorkerThread
private void triggerOnSubmit(@NonNull List<List<Job>> chain) {
Stream.of(chain)
.forEach(list -> Stream.of(list).forEach(job -> {
chain.stream()
.forEach(list -> list.stream().forEach(job -> {
job.setContext(application);
job.onSubmit();
}));
@@ -590,7 +589,7 @@ class JobController {
for (Job job : jobList) {
fullSpecs.add(buildFullSpec(job, dependsOn));
}
dependsOn = Stream.of(jobList).map(Job::getId).collect(Collectors.toList());
dependsOn = jobList.stream().map(Job::getId).collect(Collectors.toList());
}
jobStorage.insertJobs(fullSpecs);
@@ -617,11 +616,11 @@ class JobController {
job.getParameters().getQueuePriority(),
job.getParameters().getInitialDelay());
List<ConstraintSpec> constraintSpecs = Stream.of(job.getParameters().getConstraintKeys())
.map(key -> new ConstraintSpec(jobSpec.getId(), key, jobSpec.isMemoryOnly())).collect(Collectors.toList());
List<ConstraintSpec> constraintSpecs = job.getParameters().getConstraintKeys().stream()
.map(key -> new ConstraintSpec(jobSpec.getId(), key, jobSpec.isMemoryOnly())).collect(Collectors.toList());
List<DependencySpec> dependencySpecs = Stream.of(dependsOn)
.map(depends -> {
List<DependencySpec> dependencySpecs = dependsOn.stream()
.map(depends -> {
JobSpec dependsOnJobSpec = jobStorage.getJobSpec(depends);
boolean memoryOnly = job.getParameters().isMemoryOnly() || (dependsOnJobSpec != null && dependsOnJobSpec.isMemoryOnly());
@@ -652,11 +651,11 @@ class JobController {
}
List<ConstraintSpec> constraintSpecs = jobStorage.getConstraintSpecs(minimalJobSpec.getId());
List<Constraint> constraints = Stream.of(constraintSpecs)
.map(ConstraintSpec::getFactoryKey)
.map(constraintInstantiator::instantiate).collect(Collectors.toList());
List<Constraint> constraints = constraintSpecs.stream()
.map(ConstraintSpec::getFactoryKey)
.map(constraintInstantiator::instantiate).collect(Collectors.toList());
return Stream.of(constraints).allMatch(Constraint::isMet);
return constraints.stream().allMatch(Constraint::isMet);
});
if (jobSpec == null) {
@@ -682,8 +681,8 @@ class JobController {
} catch (RuntimeException e) {
Log.e(TAG, "Failed to instantiate job! Failing it and its dependencies without calling Job#onFailure. Crash imminent.");
List<String> failIds = Stream.of(jobStorage.getDependencySpecsThatDependOnJob(jobSpec.getId()))
.map(DependencySpec::getJobId).collect(Collectors.toList());
List<String> failIds = jobStorage.getDependencySpecsThatDependOnJob(jobSpec.getId()).stream()
.map(DependencySpec::getJobId).collect(Collectors.toList());
jobStorage.deleteJob(jobSpec.getId());
jobStorage.deleteJobs(failIds);
@@ -700,7 +699,7 @@ class JobController {
.setLifespan(jobSpec.getLifespan())
.setMaxAttempts(jobSpec.getMaxAttempts())
.setQueue(jobSpec.getQueueKey())
.setConstraints(Stream.of(constraintSpecs).map(ConstraintSpec::getFactoryKey).collect(Collectors.toList()))
.setConstraints(constraintSpecs.stream().map(ConstraintSpec::getFactoryKey).collect(Collectors.toList()))
.setInputData(jobSpec.getSerializedInputData())
.build();
}
@@ -10,8 +10,7 @@ import android.content.ComponentName;
import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
import com.annimon.stream.Collectors;
import com.annimon.stream.Stream;
import java.util.stream.Collectors;
import org.signal.core.util.concurrent.SignalExecutors;
import org.signal.core.util.logging.Log;
@@ -38,11 +37,11 @@ public final class JobSchedulerScheduler implements Scheduler {
SignalExecutors.BOUNDED.execute(() -> {
JobScheduler jobScheduler = application.getSystemService(JobScheduler.class);
String constraintNames = constraints.isEmpty() ? ""
: Stream.of(constraints)
.map(Constraint::getJobSchedulerKeyPart).filter(Objects::nonNull)
.sorted()
.collect(Collectors.joining("-"));
String constraintNames;
constraintNames = constraints.isEmpty() ? "" : constraints.stream()
.map(Constraint::getJobSchedulerKeyPart).filter(Objects::nonNull)
.sorted()
.collect(Collectors.joining("-"));
int jobId = constraintNames.hashCode();
@@ -4,7 +4,6 @@ import androidx.annotation.AnyThread;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.annimon.stream.Stream;
import org.signal.core.util.concurrent.SignalExecutors;
import org.signal.core.util.LRUCache;
@@ -72,7 +71,7 @@ public class JobTracker {
synchronized void onStateChange(@NonNull Job job, @NonNull JobState state) {
getOrCreateJobInfo(job).setJobState(state);
Stream.of(jobListeners)
jobListeners.stream()
.filter(info -> info.getFilter().matches(job))
.map(ListenerInfo::getListener)
.forEach(listener -> {
@@ -6,8 +6,7 @@ import android.net.Uri;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.annimon.stream.Collectors;
import com.annimon.stream.Stream;
import java.util.stream.Collectors;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.components.emoji.EmojiPageModel;
@@ -36,6 +35,7 @@ import java.util.List;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
import java.util.stream.IntStream;
import java.util.stream.Stream;
/**
* Downloads Emoji JSON and Images to local persistent storage.
@@ -127,9 +127,9 @@ public class DownloadLatestEmojiDataJob extends BaseJob {
EmojiData emojiData = downloadJson(context, targetVersion);
List<String> supportedDensities = emojiData.getDensities();
String format = emojiData.getFormat();
List<String> imagePaths = Stream.of(emojiData.getDataPages())
.map(EmojiPageModel::getSpriteUri)
.map(Uri::getLastPathSegment).collect(Collectors.toList());
List<String> imagePaths = emojiData.getDataPages().stream()
.map(EmojiPageModel::getSpriteUri)
.map(Uri::getLastPathSegment).collect(Collectors.toList());
String density = resolveDensity(supportedDensities, targetVersion.getDensity());
targetVersion = new EmojiFiles.Version(targetVersion.getVersion(), targetVersion.getUuid(), density);
@@ -4,7 +4,6 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.WorkerThread;
import com.annimon.stream.Stream;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.database.SignalDatabase;
@@ -61,9 +60,9 @@ public class GroupCallUpdateSendJob extends BaseJob {
throw new AssertionError("We have a recipient, but it's not a V2 Group");
}
List<RecipientId> recipientIds = Stream.of(RecipientUtil.getEligibleForSending(Recipient.resolvedList(conversationRecipient.getParticipantIds())))
.filter(recipient -> !recipient.isSelf())
.map(Recipient::getId).collect(com.annimon.stream.Collectors.toList());
List<RecipientId> recipientIds = RecipientUtil.getEligibleForSending(Recipient.resolvedList(conversationRecipient.getParticipantIds())).stream()
.filter(recipient -> !recipient.isSelf())
.map(Recipient::getId).collect(Collectors.toList());
return new GroupCallUpdateSendJob(recipientId,
eraId,
@@ -126,7 +125,7 @@ public class GroupCallUpdateSendJob extends BaseJob {
return;
}
List<Recipient> destinations = Stream.of(recipients).map(Recipient::resolved).collect(com.annimon.stream.Collectors.toList());
List<Recipient> destinations = recipients.stream().map(Recipient::resolved).collect(Collectors.toList());
List<Recipient> completions = deliver(conversationRecipient, destinations);
for (Recipient completion : completions) {
@@ -6,8 +6,7 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.WorkerThread;
import com.annimon.stream.Collectors;
import com.annimon.stream.Stream;
import java.util.stream.Collectors;
import org.signal.core.util.Util;
import org.signal.core.util.UuidUtil;
@@ -278,7 +277,7 @@ public class IndividualSendJob extends PushSendJob {
SignalServiceMessageSender messageSender = AppDependencies.getSignalServiceMessageSender();
SignalServiceAddress address = RecipientUtil.toSignalServiceAddress(context, messageRecipient);
List<Attachment> attachments = Stream.of(message.getAttachments()).filter(attachment -> !attachment.isSticker()).collect(Collectors.toList());
List<Attachment> attachments = message.getAttachments().stream().filter(attachment -> !attachment.isSticker()).collect(Collectors.toList());
List<SignalServiceAttachment> serviceAttachments = getAttachmentPointersFor(attachments);
Optional<byte[]> profileKey = getProfileKey(messageRecipient);
Optional<SignalServiceDataMessage.Sticker> sticker = getStickerFor(message);
@@ -3,8 +3,8 @@ package org.thoughtcrime.securesms.jobs;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.annimon.stream.Collectors;
import com.annimon.stream.Stream;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import com.fasterxml.jackson.annotation.JsonProperty;
import org.signal.core.util.ListUtil;
@@ -3,8 +3,8 @@ package org.thoughtcrime.securesms.jobs;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.annimon.stream.Collectors;
import com.annimon.stream.Stream;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import com.fasterxml.jackson.annotation.JsonProperty;
import org.signal.core.util.ListUtil;
@@ -6,7 +6,6 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.WorkerThread;
import com.annimon.stream.Stream;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.attachments.Attachment;
@@ -178,7 +177,7 @@ public final class PushDistributionListSendJob extends PushSendJob {
targets.addAll(filterRecipientIds.stream().map(Recipient::resolved).collect(Collectors.toList()));
targets.addAll(existingNetworkFailures.stream().map(NetworkFailure::getRecipientId).distinct().map(Recipient::resolved).collect(Collectors.toList()));
} else if (!existingNetworkFailures.isEmpty()) {
targets = Stream.of(existingNetworkFailures).map(NetworkFailure::getRecipientId).distinct().map(Recipient::resolved).collect(com.annimon.stream.Collectors.toList());
targets = existingNetworkFailures.stream().map(NetworkFailure::getRecipientId).distinct().map(Recipient::resolved).collect(Collectors.toList());
} else {
Stories.SendData data = Stories.getRecipientsToSendTo(messageId, message.getSentTimeMillis(), message.getStoryType().isStoryWithReplies());
targets = data.getTargets();
@@ -206,11 +205,11 @@ public final class PushDistributionListSendJob extends PushSendJob {
throws IOException, UntrustedIdentityException, UndeliverableMessageException
{
try {
List<Attachment> attachments = Stream.of(message.getAttachments()).filter(attachment -> !attachment.isSticker()).collect(com.annimon.stream.Collectors.toList());
List<Attachment> attachments = message.getAttachments().stream().filter(attachment -> !attachment.isSticker()).collect(Collectors.toList());
List<SignalServiceAttachment> attachmentPointers = getAttachmentPointersFor(attachments);
List<BodyRange> bodyRanges = getBodyRanges(message);
boolean isRecipientUpdate = Stream.of(SignalDatabase.groupReceipts().getGroupReceiptInfo(messageId))
.anyMatch(info -> info.getStatus() > GroupReceiptTable.STATUS_UNDELIVERED);
boolean isRecipientUpdate = SignalDatabase.groupReceipts().getGroupReceiptInfo(messageId).stream()
.anyMatch(info -> info.getStatus() > GroupReceiptTable.STATUS_UNDELIVERED);
final SignalServiceStoryMessage storyMessage;
if (message.getStoryType().isTextStory()) {
@@ -6,8 +6,7 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.WorkerThread;
import com.annimon.stream.Collectors;
import com.annimon.stream.Stream;
import java.util.stream.Collectors;
import org.signal.core.util.SetUtil;
import org.signal.core.util.logging.Log;
@@ -234,10 +233,10 @@ public final class PushGroupSendJob extends PushSendJob {
if (Util.hasItems(filterRecipients)) {
target = new ArrayList<>(filterRecipients.size() + existingNetworkFailures.size());
target.addAll(Stream.of(filterRecipients).map(Recipient::resolved).collect(Collectors.toList()));
target.addAll(Stream.of(existingNetworkFailures).map(NetworkFailure::getRecipientId).distinct().map(Recipient::resolved).collect(Collectors.toList()));
target.addAll(filterRecipients.stream().map(Recipient::resolved).collect(Collectors.toList()));
target.addAll(existingNetworkFailures.stream().map(NetworkFailure::getRecipientId).distinct().map(Recipient::resolved).collect(Collectors.toList()));
} else if (!existingNetworkFailures.isEmpty()) {
target = Stream.of(existingNetworkFailures).map(NetworkFailure::getRecipientId).distinct().map(Recipient::resolved).collect(Collectors.toList());
target = existingNetworkFailures.stream().map(NetworkFailure::getRecipientId).distinct().map(Recipient::resolved).collect(Collectors.toList());
} else {
GroupRecipientResult result = getGroupMessageRecipients(groupRecipient.requireGroupId(), messageId);
@@ -288,10 +287,10 @@ public final class PushGroupSendJob extends PushSendJob {
SignalServiceDataMessage.PollCreate pollCreate = getPollCreate(message);
SignalServiceDataMessage.PollTerminate pollTerminate = getPollTerminate(message);
SignalServiceDataMessage.PinnedMessage pinnedMessage = getPinnedMessage(message);
List<Attachment> attachments = Stream.of(message.getAttachments()).filter(attachment -> !attachment.isSticker()).collect(Collectors.toList());
List<Attachment> attachments = message.getAttachments().stream().filter(attachment -> !attachment.isSticker()).collect(Collectors.toList());
List<SignalServiceAttachment> attachmentPointers = getAttachmentPointersFor(attachments);
boolean isRecipientUpdate = Stream.of(SignalDatabase.groupReceipts().getGroupReceiptInfo(messageId))
.anyMatch(info -> info.getStatus() > GroupReceiptTable.STATUS_UNDELIVERED);
boolean isRecipientUpdate = SignalDatabase.groupReceipts().getGroupReceiptInfo(messageId).stream()
.anyMatch(info -> info.getStatus() > GroupReceiptTable.STATUS_UNDELIVERED);
if (message.getStoryType().isStory()) {
Optional<GroupRecord> groupRecord = SignalDatabase.groups().getGroup(groupId);
@@ -444,17 +443,17 @@ public final class PushGroupSendJob extends PushSendJob {
MessageTable database = SignalDatabase.messages();
RecipientAccessList accessList = new RecipientAccessList(target);
List<NetworkFailure> networkFailures = Stream.of(results).filter(SendMessageResult::isNetworkFailure).map(result -> new NetworkFailure(accessList.requireIdByAddress(result.getAddress()))).collect(Collectors.toList());
List<IdentityKeyMismatch> identityMismatches = Stream.of(results).filter(result -> result.getIdentityFailure() != null)
.map(result -> new IdentityKeyMismatch(accessList.requireIdByAddress(result.getAddress()), result.getIdentityFailure().getIdentityKey())).collect(Collectors.toList());
ProofRequiredException proofRequired = Stream.of(results).filter(r -> r.getProofRequiredFailure() != null).reduce((a,b) -> b).map(SendMessageResult::getProofRequiredFailure).orElse(null);
List<SendMessageResult> successes = Stream.of(results).filter(result -> result.getSuccess() != null).collect(Collectors.toList());
List<Pair<RecipientId, Boolean>> successUnidentifiedStatus = Stream.of(successes).map(result -> new Pair<>(accessList.requireIdByAddress(result.getAddress()), result.getSuccess().isUnidentified())).collect(Collectors.toList());
Set<RecipientId> successIds = Stream.of(successUnidentifiedStatus).map(Pair::getFirst).collect(Collectors.toSet());
Set<NetworkFailure> resolvedNetworkFailures = Stream.of(existingNetworkFailures).filter(failure -> successIds.contains(failure.getRecipientId())).collect(Collectors.toSet());
Set<IdentityKeyMismatch> resolvedIdentityFailures = Stream.of(existingIdentityMismatches).filter(failure -> successIds.contains(failure.getRecipientId())).collect(Collectors.toSet());
List<RecipientId> unregisteredRecipients = Stream.of(results).filter(SendMessageResult::isUnregisteredFailure).map(result -> RecipientId.from(result.getAddress())).collect(Collectors.toList());
List<RecipientId> invalidPreKeyRecipients = Stream.of(results).filter(SendMessageResult::isInvalidPreKeyFailure).map(result -> RecipientId.from(result.getAddress())).collect(Collectors.toList());
List<NetworkFailure> networkFailures = results.stream().filter(SendMessageResult::isNetworkFailure).map(result -> new NetworkFailure(accessList.requireIdByAddress(result.getAddress()))).collect(Collectors.toList());
List<IdentityKeyMismatch> identityMismatches = results.stream().filter(result -> result.getIdentityFailure() != null)
.map(result -> new IdentityKeyMismatch(accessList.requireIdByAddress(result.getAddress()), result.getIdentityFailure().getIdentityKey())).collect(Collectors.toList());
ProofRequiredException proofRequired = results.stream().filter(r -> r.getProofRequiredFailure() != null).reduce((a, b) -> b).map(SendMessageResult::getProofRequiredFailure).orElse(null);
List<SendMessageResult> successes = results.stream().filter(result -> result.getSuccess() != null).collect(Collectors.toList());
List<Pair<RecipientId, Boolean>> successUnidentifiedStatus = successes.stream().map(result -> new Pair<>(accessList.requireIdByAddress(result.getAddress()), result.getSuccess().isUnidentified())).collect(Collectors.toList());
Set<RecipientId> successIds = successUnidentifiedStatus.stream().map(Pair::getFirst).collect(Collectors.toSet());
Set<NetworkFailure> resolvedNetworkFailures = existingNetworkFailures.stream().filter(failure -> successIds.contains(failure.getRecipientId())).collect(Collectors.toSet());
Set<IdentityKeyMismatch> resolvedIdentityFailures = existingIdentityMismatches.stream().filter(failure -> successIds.contains(failure.getRecipientId())).collect(Collectors.toSet());
List<RecipientId> unregisteredRecipients = results.stream().filter(SendMessageResult::isUnregisteredFailure).map(result -> RecipientId.from(result.getAddress())).collect(Collectors.toList());
List<RecipientId> invalidPreKeyRecipients = results.stream().filter(SendMessageResult::isInvalidPreKeyFailure).map(result -> RecipientId.from(result.getAddress())).collect(Collectors.toList());
Set<RecipientId> skippedRecipients = new HashSet<>();
skippedRecipients.addAll(skipped);
@@ -522,9 +521,9 @@ public final class PushGroupSendJob extends PushSendJob {
database.markAsSentFailed(messageId);
notifyMediaMessageDeliveryFailed(context, messageId);
Set<RecipientId> mismatchRecipientIds = Stream.of(existingIdentityMismatches)
.map(mismatch -> mismatch.getRecipientId())
.collect(Collectors.toSet());
Set<RecipientId> mismatchRecipientIds = existingIdentityMismatches.stream()
.map(mismatch -> mismatch.getRecipientId())
.collect(Collectors.toSet());
RetrieveProfileJob.enqueue(mismatchRecipientIds, true);
} else if (!networkFailures.isEmpty()) {
@@ -548,20 +547,20 @@ public final class PushGroupSendJob extends PushSendJob {
List<Recipient> possible;
if (!destinations.isEmpty()) {
possible = Stream.of(destinations)
.map(GroupReceiptInfo::getRecipientId)
.map(Recipient::resolved)
.distinct().collect(Collectors.toList());
possible = destinations.stream()
.map(GroupReceiptInfo::getRecipientId)
.map(Recipient::resolved)
.distinct().collect(Collectors.toList());
} else {
Log.w(TAG, "No destinations found for group message " + groupId + " using current group membership");
possible = Stream.of(SignalDatabase.groups()
.getGroupMembers(groupId, GroupTable.MemberSet.FULL_MEMBERS_EXCLUDING_SELF))
.map(Recipient::resolve)
.distinct().collect(Collectors.toList());
possible = SignalDatabase.groups()
.getGroupMembers(groupId, GroupTable.MemberSet.FULL_MEMBERS_EXCLUDING_SELF).stream()
.map(Recipient::resolve)
.distinct().collect(Collectors.toList());
}
List<Recipient> eligible = RecipientUtil.getEligibleForSending(possible);
List<RecipientId> skipped = Stream.of(SetUtil.difference(possible, eligible)).map(Recipient::getId).collect(Collectors.toList());
List<RecipientId> skipped = SetUtil.difference(possible, eligible).stream().map(Recipient::getId).collect(Collectors.toList());
return new GroupRecipientResult(eligible, skipped);
}
@@ -12,8 +12,6 @@ import android.text.TextUtils;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.annimon.stream.Stream;
import org.greenrobot.eventbus.EventBus;
import org.signal.blurhash.BlurHash;
import org.signal.core.models.ServiceId.ACI;
@@ -216,16 +214,18 @@ public abstract class PushSendJob extends SendJob {
attachments.addAll(message.getAttachments());
attachments.addAll(Stream.of(message.getLinkPreviews())
.map(LinkPreview::getThumbnail)
.filter(Optional::isPresent)
.map(Optional::get).collect(com.annimon.stream.Collectors.toList()));
attachments.addAll(message.getLinkPreviews().stream()
.map(LinkPreview::getThumbnail)
.filter(Optional::isPresent)
.map(Optional::get)
.collect(Collectors.toList()));
attachments.addAll(Stream.of(message.getSharedContacts())
.map(Contact::getAvatar).filter(Objects::nonNull)
.map(Contact.Avatar::getAttachment).filter(Objects::nonNull).collect(com.annimon.stream.Collectors.toList()));
attachments.addAll(message.getSharedContacts().stream()
.map(Contact::getAvatar).filter(Objects::nonNull)
.map(Contact.Avatar::getAttachment).filter(Objects::nonNull)
.collect(Collectors.toList()));
HashSet<String> jobs = new HashSet<>(Stream.of(attachments).map(a -> {
HashSet<String> jobs = new HashSet<>(attachments.stream().map(a -> {
final AttachmentId attachmentId = ((DatabaseAttachment) a).attachmentId;
Log.d(TAG, "Enqueueing job chain to upload " + attachmentId);
AttachmentUploadJob attachmentUploadJob = new AttachmentUploadJob(attachmentId);
@@ -235,7 +235,8 @@ public abstract class PushSendJob extends SendJob {
.enqueue();
return attachmentUploadJob.getId();
}).collect(com.annimon.stream.Collectors.toList()));
})
.collect(Collectors.toList()));
if (message.getOutgoingQuote() != null && message.getOutgoingQuote().getAttachment() != null) {
AttachmentId attachmentId = ((DatabaseAttachment) message.getOutgoingQuote().getAttachment()).attachmentId;
@@ -251,7 +252,7 @@ public abstract class PushSendJob extends SendJob {
}
protected @NonNull List<SignalServiceAttachment> getAttachmentPointersFor(List<Attachment> attachments) {
return Stream.of(attachments).map(this::getAttachmentPointerFor).filter(a -> a != null).collect(com.annimon.stream.Collectors.toList());
return attachments.stream().map(this::getAttachmentPointerFor).filter(a -> a != null).collect(Collectors.toList());
}
protected @Nullable SignalServiceAttachment getAttachmentPointerFor(Attachment attachment) {
@@ -371,7 +372,7 @@ public abstract class PushSendJob extends SendJob {
}
protected Optional<SignalServiceDataMessage.Sticker> getStickerFor(OutgoingMessage message) {
Attachment stickerAttachment = Stream.of(message.getAttachments()).filter(Attachment::isSticker).findFirst().orElse(null);
Attachment stickerAttachment = message.getAttachments().stream().filter(Attachment::isSticker).findFirst().orElse(null);
if (stickerAttachment == null) {
return Optional.empty();
@@ -428,15 +429,15 @@ public abstract class PushSendJob extends SendJob {
}
List<SignalServicePreview> getPreviewsFor(OutgoingMessage mediaMessage) {
return Stream.of(mediaMessage.getLinkPreviews()).map(lp -> {
return mediaMessage.getLinkPreviews().stream().map(lp -> {
SignalServiceAttachment attachment = lp.getThumbnail().isPresent() ? getAttachmentPointerFor(lp.getThumbnail().get()) : null;
return new SignalServicePreview(lp.getUrl(), lp.getTitle(), lp.getDescription(), lp.getDate(), Optional.ofNullable(attachment));
}).collect(com.annimon.stream.Collectors.toList());
}).collect(Collectors.toList());
}
List<SignalServiceDataMessage.Mention> getMentionsFor(@NonNull List<Mention> mentions) {
return Stream.of(mentions)
.map(m -> new SignalServiceDataMessage.Mention(Recipient.resolved(m.getRecipientId()).requireAci(), m.getStart(), m.getLength())).collect(com.annimon.stream.Collectors.toList());
return mentions.stream()
.map(m -> new SignalServiceDataMessage.Mention(Recipient.resolved(m.getRecipientId()).requireAci(), m.getStart(), m.getLength())).collect(Collectors.toList());
}
@Nullable SignalServiceDataMessage.GiftBadge getGiftBadgeFor(@NonNull OutgoingMessage message) throws UndeliverableMessageException {
@@ -2,7 +2,6 @@ package org.thoughtcrime.securesms.jobs;
import androidx.annotation.NonNull;
import com.annimon.stream.Stream;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.BuildConfig;
@@ -50,8 +49,8 @@ public abstract class SendJob extends BaseJob {
List<Attachment> attachments = new LinkedList<>();
attachments.addAll(message.getAttachments());
attachments.addAll(Stream.of(message.getLinkPreviews()).map(lp -> lp.getThumbnail().orElse(null)).filter(Objects::nonNull).collect(com.annimon.stream.Collectors.toList()));
attachments.addAll(Stream.of(message.getSharedContacts()).map(Contact::getAvatarAttachment).filter(Objects::nonNull).collect(com.annimon.stream.Collectors.toList()));
attachments.addAll(message.getLinkPreviews().stream().map(lp -> lp.getThumbnail().orElse(null)).filter(Objects::nonNull).collect(Collectors.toList()));
attachments.addAll(message.getSharedContacts().stream().map(Contact::getAvatarAttachment).filter(Objects::nonNull).collect(Collectors.toList()));
if (message.getOutgoingQuote() != null && message.getOutgoingQuote().getAttachment() != null) {
attachments.add(message.getOutgoingQuote().getAttachment());
@@ -1,7 +1,6 @@
package org.thoughtcrime.securesms.jobs
import android.content.Context
import com.annimon.stream.Stream
import org.signal.core.models.storageservice.StorageKey
import org.signal.core.util.Base64
import org.signal.core.util.SqlUtil
@@ -331,7 +330,7 @@ class StorageSyncJob private constructor(parameters: Parameters, private var loc
processKnownRecords(context, remoteOnly)
val unknownInserts: List<SignalStorageRecord> = remoteOnly.unknown
val unknownDeletes = Stream.of(idDifference.localOnlyIds).filter { obj: StorageId -> obj.isUnknown }.collect(com.annimon.stream.Collectors.toList())
val unknownDeletes = idDifference.localOnlyIds.stream().filter { obj: StorageId -> obj.isUnknown }.collect(Collectors.toList())
Log.i(TAG, "[Remote Sync] Unknowns :: " + unknownInserts.size + " inserts, " + unknownDeletes.size + " deletes")
@@ -377,7 +376,7 @@ class StorageSyncJob private constructor(parameters: Parameters, private var loc
val localStorageIds = getAllLocalStorageIds(self)
val idDifference = StorageSyncHelper.findIdDifference(remoteManifest.storageIds, localStorageIds)
val remoteInserts = buildLocalStorageRecords(context, self, idDifference.localOnlyIds.stream().filter { it: StorageId -> !it.isUnknown }.collect(Collectors.toList()))
val remoteDeletes = Stream.of(idDifference.remoteOnlyIds).map { obj: StorageId -> obj.raw }.collect(com.annimon.stream.Collectors.toList())
val remoteDeletes = idDifference.remoteOnlyIds.stream().map { obj: StorageId -> obj.raw }.collect(Collectors.toList())
Log.i(TAG, "ID Difference :: $idDifference")
@@ -3,8 +3,7 @@ package org.thoughtcrime.securesms.jobs;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.annimon.stream.Collectors;
import com.annimon.stream.Stream;
import java.util.stream.Collectors;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.database.GroupTable;
@@ -128,8 +127,8 @@ public class TypingSendJob extends BaseJob {
groupId = Optional.of(recipient.requireGroupId().getDecodedId());
}
recipients = RecipientUtil.getEligibleForSending(Stream.of(recipients)
.map(Recipient::resolve).collect(Collectors.toList()));
recipients = RecipientUtil.getEligibleForSending(recipients.stream()
.map(Recipient::resolve).collect(Collectors.toList()));
SignalServiceTypingMessage typingMessage = new SignalServiceTypingMessage(typing ? Action.STARTED : Action.STOPPED, System.currentTimeMillis(), groupId);
@@ -10,8 +10,7 @@ import androidx.annotation.Nullable;
import androidx.core.text.HtmlCompat;
import androidx.core.text.util.LinkifyCompat;
import com.annimon.stream.Collectors;
import com.annimon.stream.Stream;
import java.util.stream.Collectors;
import org.thoughtcrime.securesms.util.DateUtils;
import org.thoughtcrime.securesms.util.LinkUtil;
@@ -26,6 +25,7 @@ import java.util.Optional;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Stream;
import okhttp3.HttpUrl;
@@ -155,10 +155,10 @@ public final class LinkPreviewUtil {
@SuppressLint("ObsoleteSdkInt")
public long getDate() {
return Stream.of(new String[] { values.get(KEY_PUBLISHED_TIME_1),
values.get(KEY_PUBLISHED_TIME_2),
values.get(KEY_MODIFIED_TIME_1),
values.get(KEY_MODIFIED_TIME_2) })
return Stream.of(values.get(KEY_PUBLISHED_TIME_1),
values.get(KEY_PUBLISHED_TIME_2),
values.get(KEY_MODIFIED_TIME_1),
values.get(KEY_MODIFIED_TIME_2))
.map(DateUtils::parseIso8601)
.filter(time -> time > 0)
.findFirst()
@@ -178,9 +178,9 @@ public final class LinkPreviewUtil {
private Links(@NonNull List<Link> links) {
this.links = links;
this.urlSet = Stream.of(links)
.map(link -> trimTrailingSlash(link.url))
.collect(Collectors.toSet());
this.urlSet = links.stream()
.map(link -> trimTrailingSlash(link.url))
.collect(Collectors.toSet());
}
public Optional<Link> findFirst() {
@@ -4,12 +4,10 @@ import android.content.Context;
import androidx.annotation.NonNull;
import com.annimon.stream.Stream;
import org.signal.core.util.Util;
import org.thoughtcrime.securesms.dependencies.AppDependencies;
import org.thoughtcrime.securesms.jobmanager.Constraint;
import org.thoughtcrime.securesms.jobs.JobManagerFactories;
import org.signal.core.util.Util;
import java.util.Map;
@@ -24,7 +22,7 @@ final class LogSectionConstraints implements LogSection {
public @NonNull CharSequence getContent(@NonNull Context context) {
StringBuilder output = new StringBuilder();
Map<String, Constraint.Factory> factories = JobManagerFactories.getConstraintFactories(AppDependencies.getApplication());
int keyLength = Stream.of(factories.keySet()).map(String::length).max(Integer::compareTo).orElse(0);
int keyLength = factories.keySet().stream().map(String::length).max(Integer::compareTo).orElse(0);
for (Map.Entry<String, Constraint.Factory> entry : factories.entrySet()) {
output.append(Util.rightPad(entry.getKey(), keyLength)).append(": ").append(entry.getValue().create().isMet()).append("\n");
@@ -4,10 +4,8 @@ import android.content.Context;
import androidx.annotation.NonNull;
import com.annimon.stream.Stream;
import org.thoughtcrime.securesms.util.RemoteConfig;
import org.signal.core.util.Util;
import org.thoughtcrime.securesms.util.RemoteConfig;
import java.util.Map;
@@ -24,9 +22,9 @@ public class LogSectionRemoteConfig implements LogSection {
Map<String, Object> memory = RemoteConfig.getMemoryValues();
Map<String, Object> disk = RemoteConfig.getDebugDiskValues();
Map<String, Object> pending = RemoteConfig.getDebugPendingDiskValues();
int remoteLength = Stream.of(memory.keySet()).map(String::length).max(Integer::compareTo).orElse(0);
int diskLength = Stream.of(disk.keySet()).map(String::length).max(Integer::compareTo).orElse(0);
int pendingLength = Stream.of(pending.keySet()).map(String::length).max(Integer::compareTo).orElse(0);
int remoteLength = memory.keySet().stream().map(String::length).max(Integer::compareTo).orElse(0);
int diskLength = disk.keySet().stream().map(String::length).max(Integer::compareTo).orElse(0);
int pendingLength = pending.keySet().stream().map(String::length).max(Integer::compareTo).orElse(0);
out.append("-- Memory\n");
for (Map.Entry<String, Object> entry : memory.entrySet()) {
@@ -10,9 +10,6 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.WorkerThread;
import com.annimon.stream.Collectors;
import com.annimon.stream.Stream;
import org.json.JSONException;
import org.json.JSONObject;
import org.signal.core.util.StreamUtil;
@@ -41,6 +38,8 @@ import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
import java.util.function.Consumer;
import java.util.regex.Pattern;
import java.util.stream.Stream;
import java.util.stream.Collectors;
import java.util.zip.GZIPOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
@@ -32,18 +32,15 @@ import androidx.annotation.Nullable;
import androidx.lifecycle.Observer;
import androidx.recyclerview.widget.RecyclerView;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import com.annimon.stream.Collectors;
import com.annimon.stream.Stream;
import java.util.stream.Collectors;
import com.bumptech.glide.RequestManager;
import com.codewaves.stickyheadergrid.StickyHeaderGridAdapter;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.signal.core.util.ByteSize;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.attachments.DatabaseAttachment;
import org.thoughtcrime.securesms.components.AudioView;
import org.thoughtcrime.securesms.components.ThumbnailView;
@@ -51,17 +48,15 @@ import org.thoughtcrime.securesms.components.voice.VoiceNotePlaybackState;
import org.thoughtcrime.securesms.database.MediaTable;
import org.thoughtcrime.securesms.database.MediaTable.MediaRecord;
import org.thoughtcrime.securesms.database.loaders.GroupedThreadMediaLoader.GroupedThreadMedia;
import org.thoughtcrime.securesms.jobs.AttachmentDownloadJob;
import org.thoughtcrime.securesms.keyvalue.SignalStore;
import org.thoughtcrime.securesms.mediapreview.MediaPreviewCache;
import org.thoughtcrime.securesms.mms.AudioSlide;
import org.thoughtcrime.securesms.mms.Slide;
import org.thoughtcrime.securesms.recipients.LiveRecipient;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.jobs.AttachmentDownloadJob;
import org.thoughtcrime.securesms.util.DateUtils;
import org.thoughtcrime.securesms.util.MediaUtil;
import org.signal.core.util.Util;
import org.thoughtcrime.securesms.util.livedata.LiveDataPair;
import java.util.Collection;
@@ -236,8 +231,8 @@ final class MediaGalleryAllAdapter extends StickyHeaderGridAdapter {
}
public long getSelectedMediaTotalFileSize() {
return Stream.of(selected.values())
.collect(Collectors.summingLong(a -> a.getAttachment() != null ? a.getAttachment().size : 0));
return selected.values().stream()
.collect(Collectors.summingLong(a -> a.getAttachment() != null ? a.getAttachment().size : 0));
}
@NonNull
@@ -62,6 +62,7 @@ import org.json.JSONArray;
import org.json.JSONException;
import java.util.Arrays;
import java.util.stream.Collectors;
import java.util.Collection;
import java.util.Collections;
import java.util.Objects;
@@ -523,7 +524,7 @@ public final class MediaOverviewPageFragment extends LoggingFragment
return;
} else if (someOffloaded) {
OffloadedMediaDialogUtil.showPartiallyOffloaded(requireContext(), () -> {
Collection<MediaTable.MediaRecord> saveable = selected.stream().filter(r -> r.getAttachment() == null || r.getAttachment().hasData).collect(java.util.stream.Collectors.toList());
Collection<MediaTable.MediaRecord> saveable = selected.stream().filter(r -> r.getAttachment() == null || r.getAttachment().hasData).collect(Collectors.toList());
lifecycleDisposable.add(
MediaActions
.handleSaveMedia(MediaOverviewPageFragment.this, saveable)
@@ -9,29 +9,26 @@ import android.provider.MediaStore;
import android.provider.MediaStore.Images;
import android.provider.MediaStore.Video;
import android.provider.OpenableColumns;
import kotlin.Pair;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import androidx.annotation.WorkerThread;
import com.annimon.stream.Stream;
import org.signal.core.util.concurrent.SignalExecutors;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.R;
import org.signal.core.models.media.Media;
import org.signal.core.models.media.MediaFolder;
import org.signal.core.models.media.TransformProperties;
import org.signal.core.ui.util.StorageUtil;
import org.signal.core.util.SqlUtil;
import org.signal.core.util.Stopwatch;
import org.signal.core.util.Util;
import org.signal.core.util.concurrent.SignalExecutors;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.dependencies.AppDependencies;
import org.thoughtcrime.securesms.keyvalue.SignalStore;
import org.thoughtcrime.securesms.mms.PartAuthority;
import org.thoughtcrime.securesms.util.MediaUtil;
import org.signal.core.util.SqlUtil;
import org.signal.core.util.Stopwatch;
import org.signal.core.ui.util.StorageUtil;
import org.signal.core.util.Util;
import java.io.IOException;
import java.util.ArrayList;
@@ -46,7 +43,7 @@ import java.util.stream.Collectors;
import io.reactivex.rxjava3.core.Single;
import io.reactivex.rxjava3.schedulers.Schedulers;
import kotlin.collections.MapsKt;
import kotlin.Pair;
/**
* Handles the retrieval of media present on the user's device.
@@ -108,7 +105,7 @@ public class MediaRepository {
* much data as we have, like width/height.
*/
public void getPopulatedMedia(@NonNull Context context, @NonNull List<Media> media, @NonNull Callback<List<Media>> callback) {
if (Stream.of(media).allMatch(this::isPopulated)) {
if (media.stream().allMatch(this::isPopulated)) {
callback.onComplete(media);
return;
}
@@ -157,14 +154,14 @@ public class MediaRepository {
String cameraBucketId = imageFolders.getCameraBucketId() != null ? imageFolders.getCameraBucketId() : videoFolders.getCameraBucketId();
FolderData cameraFolder = cameraBucketId != null ? folders.remove(cameraBucketId) : null;
List<MediaFolder> mediaFolders = Stream.of(folders.values())
.filter(folder -> folder.getTitle() != null)
.map(folder -> new MediaFolder(folder.getThumbnail(),
List<MediaFolder> mediaFolders = folders.values().stream()
.filter(folder -> folder.getTitle() != null)
.map(folder -> new MediaFolder(folder.getThumbnail(),
folder.getTitle(),
folder.getCount(),
folder.getBucketId(),
MediaFolder.FolderType.NORMAL))
.sorted((o1, o2) -> o1.getTitle().toLowerCase().compareTo(o2.getTitle().toLowerCase())).collect(com.annimon.stream.Collectors.toList());
.sorted((o1, o2) -> o1.getTitle().toLowerCase().compareTo(o2.getTitle().toLowerCase())).collect(Collectors.toList());
Uri allMediaThumbnail = imageFolders.getThumbnailTimestamp() > videoFolders.getThumbnailTimestamp() ? imageFolders.getThumbnail() : videoFolders.getThumbnail();
@@ -6,16 +6,14 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.WorkerThread;
import com.annimon.stream.Stream;
import org.signal.core.models.media.Media;
import org.signal.core.models.media.TransformProperties;
import org.signal.core.util.ThreadUtil;
import org.signal.core.util.concurrent.SignalExecutors;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.attachments.Attachment;
import org.thoughtcrime.securesms.attachments.AttachmentId;
import org.thoughtcrime.securesms.database.AttachmentTable;
import org.signal.core.models.media.Media;
import org.signal.core.models.media.TransformProperties;
import org.thoughtcrime.securesms.database.SignalDatabase;
import org.thoughtcrime.securesms.dependencies.AppDependencies;
import org.thoughtcrime.securesms.jobmanager.JobManager;
@@ -168,7 +166,7 @@ public class MediaUploadRepository {
if (result != null) {
Log.d(TAG, "Canceling attachment upload job for " + result.getAttachmentId());
Stream.of(result.getJobIds()).forEach(jobManager::cancel);
result.getJobIds().stream().forEach(jobManager::cancel);
uploadResults.remove(media);
SignalDatabase.attachments().deleteAttachment(result.getAttachmentId());
}
@@ -8,8 +8,7 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.WorkerThread;
import com.annimon.stream.Collectors;
import com.annimon.stream.Stream;
import java.util.stream.Collectors;
import org.signal.core.util.concurrent.SignalExecutors;
import org.thoughtcrime.securesms.database.MegaphoneDatabase;
@@ -21,6 +20,7 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.Executor;
import java.util.stream.Stream;
/**
* Synchronization of data structures is done using a serial executor. Do not access or change
@@ -123,8 +123,8 @@ public class MegaphoneRepository {
@WorkerThread
private void init() {
List<MegaphoneRecord> records = database.getAllAndDeleteMissing();
Set<Event> events = Stream.of(records).map(MegaphoneRecord::getEvent).collect(Collectors.toSet());
Set<Event> missing = Stream.of(Megaphones.Event.values()).filter(o -> !events.contains(o)).collect(Collectors.toSet());
Set<Event> events = records.stream().map(MegaphoneRecord::getEvent).collect(Collectors.toSet());
Set<Event> missing = Stream.of(Event.values()).filter(o -> !events.contains(o)).collect(Collectors.toSet());
database.insert(missing);
resetDatabaseCache();
@@ -139,7 +139,7 @@ public class MegaphoneRepository {
@WorkerThread
private void resetDatabaseCache() {
databaseCache.clear();
databaseCache.putAll(Stream.of(database.getAllAndDeleteMissing()).collect(Collectors.toMap(MegaphoneRecord::getEvent, m -> m)));
databaseCache.putAll(database.getAllAndDeleteMissing().stream().collect(Collectors.toMap(MegaphoneRecord::getEvent, m -> m)));
}
public interface Callback<E> {
@@ -11,8 +11,7 @@ import androidx.annotation.Nullable;
import androidx.annotation.WorkerThread;
import androidx.core.app.NotificationManagerCompat;
import com.annimon.stream.Collectors;
import com.annimon.stream.Stream;
import java.util.stream.Collectors;
import com.bumptech.glide.Glide;
import org.signal.core.util.DiskUtil;
@@ -90,17 +89,17 @@ public final class Megaphones {
static @Nullable Megaphone getNextMegaphone(@NonNull Context context, @NonNull Map<Event, MegaphoneRecord> records) {
long currentTime = System.currentTimeMillis();
List<Megaphone> megaphones = Stream.of(buildDisplayOrder(context, records))
.filter(e -> {
List<Megaphone> megaphones = buildDisplayOrder(context, records).entrySet().stream()
.filter(e -> {
MegaphoneRecord record = Objects.requireNonNull(records.get(e.getKey()));
MegaphoneSchedule schedule = e.getValue();
return !record.isFinished() && schedule.shouldDisplay(record.getSeenCount(), record.getLastSeen(), record.getFirstVisible(), currentTime);
})
.map(Map.Entry::getKey)
.map(records::get)
.map(record -> Megaphones.forRecord(context, record))
.filter(Objects::nonNull).collect(Collectors.toList());
.map(Map.Entry::getKey)
.map(records::get)
.map(record -> Megaphones.forRecord(context, record))
.filter(Objects::nonNull).collect(Collectors.toList());
if (megaphones.size() > 0) {
return megaphones.get(0);
@@ -3,8 +3,8 @@ package org.thoughtcrime.securesms.migrations;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.annimon.stream.Collectors;
import com.annimon.stream.Stream;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.dependencies.AppDependencies;
@@ -52,7 +52,7 @@ public class StickerAdditionMigrationJob extends MigrationJob {
@Override
public @Nullable byte[] serialize() {
String[] packsRaw = Stream.of(packs).map(BlessedPacks.Pack::toJson).toArray(String[]::new);
String[] packsRaw = packs.stream().map(BlessedPacks.Pack::toJson).toArray(String[]::new);
return new JsonJobData.Builder().putStringArray(KEY_PACKS, packsRaw).serialize();
}
@@ -19,12 +19,11 @@ package org.thoughtcrime.securesms.mms;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.annimon.stream.Collectors;
import com.annimon.stream.Stream;
import java.util.stream.Collectors;
import org.signal.core.util.Util;
import org.thoughtcrime.securesms.attachments.Attachment;
import org.thoughtcrime.securesms.util.MediaUtil;
import org.signal.core.util.Util;
import java.util.LinkedList;
import java.util.List;
@@ -111,7 +110,7 @@ public class SlideDeck {
}
public @NonNull List<Slide> getThumbnailSlides() {
return Stream.of(slides).filter(Slide::hasImage).collect(Collectors.toList());
return slides.stream().filter(Slide::hasImage).collect(Collectors.toList());
}
public @Nullable AudioSlide getAudioSlide() {
@@ -4,8 +4,7 @@ import android.text.TextUtils;
import androidx.annotation.NonNull;
import com.annimon.stream.Collectors;
import com.annimon.stream.Stream;
import java.util.stream.Collectors;
import com.bumptech.glide.util.ContentLengthInputStream;
import org.signal.core.util.concurrent.SignalExecutors;
@@ -139,8 +138,8 @@ public class ChunkedDataFetcher {
List<ByteRange> requestPattern;
try {
if (firstChunk.isPresent()) {
requestPattern = Stream.of(getRequestPattern(contentLength - firstChunk.get().getSecond()))
.map(b -> new ByteRange(b.start + firstChunk.get().getSecond(),
requestPattern = getRequestPattern(contentLength - firstChunk.get().getSecond()).stream()
.map(b -> new ByteRange(b.start + firstChunk.get().getSecond(),
b.end + firstChunk.get().getSecond(),
b.ignoreFirst)).collect(Collectors.toList());
} else {
@@ -153,14 +152,14 @@ public class ChunkedDataFetcher {
}
SignalExecutors.UNBOUNDED.execute(() -> {
List<CallRequestController> controllers = Stream.of(requestPattern).map(range -> makeChunkRequest(client, url, range)).collect(Collectors.toList());
List<CallRequestController> controllers = requestPattern.stream().map(range -> makeChunkRequest(client, url, range)).collect(Collectors.toList());
List<InputStream> streams = new ArrayList<>(controllers.size() + (firstChunk.isPresent() ? 1 : 0));
if (firstChunk.isPresent()) {
streams.add(firstChunk.get().getFirst());
}
Stream.of(controllers).forEach(compositeController::addController);
controllers.stream().forEach(compositeController::addController);
for (CallRequestController controller : controllers) {
Optional<InputStream> stream = controller.getStream();
@@ -2,8 +2,6 @@ package org.thoughtcrime.securesms.net;
import androidx.annotation.NonNull;
import com.annimon.stream.Stream;
import java.util.ArrayList;
import java.util.List;
@@ -23,7 +21,7 @@ public class CompositeRequestController implements RequestController {
@Override
public synchronized void cancel() {
canceled = true;
Stream.of(controllers).forEach(RequestController::cancel);
controllers.stream().forEach(RequestController::cancel);
}
public synchronized boolean isCanceled() {
@@ -2,8 +2,8 @@ package org.thoughtcrime.securesms.net;
import androidx.annotation.NonNull;
import com.annimon.stream.Collectors;
import com.annimon.stream.Stream;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.signal.core.util.logging.Log;
import org.xbill.DNS.ARecord;
@@ -7,8 +7,7 @@ import android.content.Intent;
import androidx.annotation.NonNull;
import com.annimon.stream.Collectors;
import com.annimon.stream.Stream;
import java.util.stream.Collectors;
import org.signal.core.util.concurrent.SignalExecutors;
import org.signal.core.util.logging.Log;
@@ -29,8 +28,6 @@ import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import kotlin.Pair;
public class MarkReadReceiver extends BroadcastReceiver {
private static final String TAG = Log.tag(MarkReadReceiver.class);
@@ -76,25 +73,27 @@ public class MarkReadReceiver extends BroadcastReceiver {
public static void process(@NonNull List<MarkedMessageInfo> markedReadMessages) {
if (markedReadMessages.isEmpty()) return;
List<SyncMessageId> syncMessageIds = Stream.of(markedReadMessages)
.map(MarkedMessageInfo::getSyncMessageId).collect(Collectors.toList());
List<ExpirationInfo> expirationInfo = Stream.of(markedReadMessages)
.map(MarkedMessageInfo::getExpirationInfo)
.filter(info -> info.getExpiresIn() > 0 && info.getExpireStarted() <= 0).collect(Collectors.toList());
List<SyncMessageId> syncMessageIds = markedReadMessages.stream()
.map(MarkedMessageInfo::getSyncMessageId)
.collect(Collectors.toList());
List<ExpirationInfo> expirationInfo = markedReadMessages.stream()
.map(MarkedMessageInfo::getExpirationInfo)
.filter(info -> info.getExpiresIn() > 0 && info.getExpireStarted() <= 0)
.collect(Collectors.toList());
scheduleDeletion(expirationInfo);
MultiDeviceReadUpdateJob.enqueue(syncMessageIds);
Map<Long, List<MarkedMessageInfo>> threadToInfo = Stream.of(markedReadMessages)
.collect(Collectors.groupingBy(MarkedMessageInfo::getThreadId));
Map<Long, List<MarkedMessageInfo>> threadToInfo = markedReadMessages.stream()
.collect(Collectors.groupingBy(MarkedMessageInfo::getThreadId));
Stream.of(threadToInfo).forEach(threadToInfoEntry -> {
Map<RecipientId, List<MarkedMessageInfo>> recipientIdToInfo = Stream.of(threadToInfoEntry.getValue())
.map(info -> info)
.collect(Collectors.groupingBy(info -> info.getSyncMessageId().getRecipientId()));
threadToInfo.entrySet().stream().forEach(threadToInfoEntry -> {
Map<RecipientId, List<MarkedMessageInfo>> recipientIdToInfo = threadToInfoEntry.getValue().stream()
.map(info -> info)
.collect(Collectors.groupingBy(info -> info.getSyncMessageId().getRecipientId()));
Stream.of(recipientIdToInfo).forEach(entry -> {
recipientIdToInfo.entrySet().stream().forEach(entry -> {
long threadId = threadToInfoEntry.getKey();
RecipientId recipientId = entry.getKey();
List<MarkedMessageInfo> infos = entry.getValue();
@@ -108,7 +107,7 @@ public class MarkReadReceiver extends BroadcastReceiver {
List<RecipientId> peers = SignalDatabase.threads().getRecipientIdsForThreadIds(threads.stream()
.filter(it -> it.getGroupStoryId() == null)
.map(ConversationId::getThreadId)
.collect(java.util.stream.Collectors.toList()));
.collect(Collectors.toList()));
for (RecipientId peer : peers) {
CallTable.Call lastCallInThread = SignalDatabase.calls().markAllCallEventsWithPeerBeforeTimestampRead(peer, timestamp);
@@ -121,10 +120,10 @@ public class MarkReadReceiver extends BroadcastReceiver {
private static void scheduleDeletion(@NonNull List<ExpirationInfo> expirationInfo) {
if (expirationInfo.size() > 0) {
long now = System.currentTimeMillis();
SignalDatabase.messages().markExpireStarted(Stream.of(expirationInfo).map(info -> new Pair<>(info.getId(), now)).collect(Collectors.toList()));
SignalDatabase.messages().markExpireStarted(expirationInfo.stream().map(info -> new kotlin.Pair<>(info.getId(), now)).collect(Collectors.toList()));
AppDependencies.getExpiringMessageManager()
.scheduleDeletion(Stream.of(expirationInfo).map(info -> info.copy(info.getId(), info.getExpiresIn(), now, info.isMms())).collect(Collectors.toList()));
.scheduleDeletion(expirationInfo.stream().map(info -> info.copy(info.getId(), info.getExpiresIn(), now, info.isMms())).collect(Collectors.toList()));
}
}
}
@@ -9,8 +9,6 @@ import android.service.notification.StatusBarNotification;
import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
import com.annimon.stream.Stream;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.database.SignalDatabase;
import org.thoughtcrime.securesms.dependencies.AppDependencies;
@@ -25,6 +23,7 @@ import java.util.Collections;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Stream;
/**
* Consolidates Notification Cancellation logic to one class.
@@ -22,8 +22,7 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.WorkerThread;
import com.annimon.stream.Collectors;
import com.annimon.stream.Stream;
import java.util.stream.Collectors;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.BuildConfig;
@@ -575,7 +574,7 @@ public class NotificationChannels {
}
}
Set<String> existingChannelIds = Stream.of(notificationManager.getNotificationChannels()).map(NotificationChannel::getId).collect(Collectors.toSet());
Set<String> existingChannelIds = notificationManager.getNotificationChannels().stream().map(NotificationChannel::getId).collect(Collectors.toSet());
for (NotificationChannel existingChannel : notificationManager.getNotificationChannels()) {
if ((existingChannel.getId().startsWith(CONTACT_PREFIX) || existingChannel.getId().startsWith(MESSAGES_PREFIX)) &&
@@ -3,9 +3,10 @@ package org.thoughtcrime.securesms.payments;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import java.util.List;
import java.util.stream.Collectors;
import java.util.List;
/**
* A payment may be comprised of zero or more defrag transactions and the payment transaction.
* <p>
@@ -22,7 +23,7 @@ public final class PaymentSubmissionResult {
throw new IllegalStateException();
}
this.defrags = transactions.stream()
.filter(TransactionSubmissionResult::isDefrag).collect(Collectors.toList());
.filter(TransactionSubmissionResult::isDefrag).collect(Collectors.toList());
final List<TransactionSubmissionResult> nonDefragTransactions = transactions.stream().filter(x -> !x.isDefrag()).collect(Collectors.toList());
if (nonDefragTransactions.size() > 1) throw new IllegalStateException("Too many defrag transaction results!");
this.nonDefrag = nonDefragTransactions.isEmpty() ? null : nonDefragTransactions.get(0);
@@ -35,6 +35,7 @@ import java.util.Comparator;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.stream.IntStream;
import java.util.stream.Collectors;
public class PaymentsRecoveryPhraseFragment extends Fragment {
@@ -71,7 +72,7 @@ public class PaymentsRecoveryPhraseFragment extends Fragment {
List<MnemonicPart> parts = IntStream.range(0, words.size()).boxed()
.map(index -> new MnemonicPart(index, words.get(index)))
.sorted(new MnemonicPartComparator(words.size(), SPAN_COUNT)).collect(java.util.stream.Collectors.toList());
.sorted(new MnemonicPartComparator(words.size(), SPAN_COUNT)).collect(Collectors.toList());
MnemonicPartAdapter adapter = new MnemonicPartAdapter();
@@ -18,7 +18,6 @@ import androidx.navigation.fragment.NavHostFragment;
import androidx.recyclerview.widget.RecyclerView;
import com.airbnb.lottie.LottieAnimationView;
import com.annimon.stream.Stream;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.snackbar.Snackbar;
@@ -139,7 +138,7 @@ public class PaymentsHomeFragment extends LoggingFragment {
});
viewModel.getList().observe(getViewLifecycleOwner(), list -> {
boolean hadPaymentItems = Stream.of(adapter.getCurrentList()).anyMatch(model -> model instanceof PaymentItem);
boolean hadPaymentItems = adapter.getCurrentList().stream().anyMatch(model -> model instanceof PaymentItem);
if (!hadPaymentItems) {
adapter.submitList(list, () -> recycler.scrollToPosition(0));
@@ -7,8 +7,7 @@ import androidx.lifecycle.Transformations;
import androidx.lifecycle.ViewModel;
import androidx.lifecycle.ViewModelProvider;
import com.annimon.stream.Collectors;
import com.annimon.stream.Stream;
import java.util.stream.Collectors;
import org.signal.core.util.logging.Log;
import org.signal.core.util.money.FiatMoney;
@@ -196,9 +195,9 @@ public class PaymentsHomeViewModel extends ViewModel {
private @NonNull PaymentsHomeState updateRecentPayments(@NonNull List<Payment> payments,
@NonNull PaymentsHomeState state)
{
List<PaymentItem> paymentItems = Stream.of(payments)
.limit(MAX_PAYMENT_ITEMS)
.map(PaymentItem::fromPayment).collect(Collectors.toList());
List<PaymentItem> paymentItems = payments.stream()
.limit(MAX_PAYMENT_ITEMS)
.map(PaymentItem::fromPayment).collect(Collectors.toList());
return state.updatePayments(paymentItems, payments.size());
}
@@ -6,8 +6,7 @@ import androidx.annotation.NonNull;
import androidx.annotation.WorkerThread;
import androidx.lifecycle.LiveData;
import com.annimon.stream.Collectors;
import com.annimon.stream.Stream;
import java.util.stream.Collectors;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.database.PaymentTable;
@@ -57,9 +56,9 @@ public class PaymentsRepository {
}
private void updateDatabaseWithNewBlockInformation(@NonNull List<Payment> reconcileOutput) {
List<LedgerReconcile.BlockOverridePayment> blockOverridePayments = Stream.of(reconcileOutput)
.filter(x -> x instanceof LedgerReconcile.BlockOverridePayment)
.map(x -> (LedgerReconcile.BlockOverridePayment)x).collect(Collectors.toList());
List<LedgerReconcile.BlockOverridePayment> blockOverridePayments = reconcileOutput.stream()
.filter(x -> x instanceof LedgerReconcile.BlockOverridePayment)
.map(x -> (LedgerReconcile.BlockOverridePayment)x).collect(Collectors.toList());
if (blockOverridePayments.isEmpty()) {
return;
@@ -102,7 +101,7 @@ public class PaymentsRepository {
private @NonNull List<Payment> filterPayments(@NonNull List<Payment> payments,
@NonNull Direction direction)
{
return Stream.of(payments)
.filter(p -> p.getDirection() == direction).collect(Collectors.toList());
return payments.stream()
.filter(p -> p.getDirection() == direction).collect(Collectors.toList());
}
}
@@ -7,8 +7,6 @@ import androidx.lifecycle.Transformations;
import androidx.lifecycle.ViewModel;
import androidx.lifecycle.ViewModelProvider;
import com.annimon.stream.Stream;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.BuildConfig;
import org.thoughtcrime.securesms.R;
@@ -25,7 +23,9 @@ import org.signal.core.util.SetUtil;
import org.thoughtcrime.securesms.util.adapter.mapping.MappingModelList;
import org.thoughtcrime.securesms.util.livedata.Store;
import java.util.Arrays;
import java.util.Collection;
import java.util.stream.Collectors;
import java.util.Comparator;
import java.util.Currency;
import java.util.List;
@@ -127,10 +127,10 @@ public final class SetCurrencyViewModel extends ViewModel {
}
public static class SetCurrencyState {
private static final List<Currency> DEFAULT_CURRENCIES = Stream.of(BuildConfig.DEFAULT_CURRENCIES.split(","))
private static final List<Currency> DEFAULT_CURRENCIES = Arrays.stream(BuildConfig.DEFAULT_CURRENCIES.split(","))
.map(CurrencyUtil::getCurrencyByCurrencyCode)
.filter(Objects::nonNull)
.collect(com.annimon.stream.Collectors.toList());
.collect(Collectors.toList());
private final Currency currentCurrency;
private final CurrencyExchange currencyExchange;
@@ -8,7 +8,6 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
import com.annimon.stream.Stream;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.payments.Payment;
@@ -3,8 +3,7 @@ package org.thoughtcrime.securesms.payments.reconciliation;
import androidx.annotation.NonNull;
import androidx.annotation.WorkerThread;
import com.annimon.stream.Collectors;
import com.annimon.stream.Stream;
import java.util.stream.Collectors;
import org.signal.core.util.MapUtil;
import org.signal.core.util.logging.Log;
@@ -52,7 +51,7 @@ public final class LedgerReconcile {
private static @NonNull List<Payment> reconcile(@NonNull Collection<? extends Payment> allLocalPaymentTransactions,
@NonNull List<MobileCoinLedgerWrapper.OwnedTxo> allTxOuts)
{
List<? extends Payment> nonFailedLocalPayments = Stream.of(allLocalPaymentTransactions).filter(i -> i.getState() != State.FAILED).collect(Collectors.toList());
List<? extends Payment> nonFailedLocalPayments = allLocalPaymentTransactions.stream().filter(i -> i.getState() != State.FAILED).collect(Collectors.toList());
Set<ByteString> allKnownPublicKeys = new HashSet<>(nonFailedLocalPayments.size());
Set<ByteString> allKnownKeyImages = new HashSet<>(nonFailedLocalPayments.size());
@@ -63,24 +62,24 @@ public final class LedgerReconcile {
allKnownKeyImages.addAll(txoIdentification.keyImages);
}
Set<MobileCoinLedgerWrapper.OwnedTxo> knownTxosByKeyImage = Stream.of(allTxOuts)
.filter(t -> allKnownKeyImages.contains(t.getKeyImage()))
.collect(Collectors.toSet());
Set<MobileCoinLedgerWrapper.OwnedTxo> knownTxosByKeyImage = allTxOuts.stream()
.filter(t -> allKnownKeyImages.contains(t.getKeyImage()))
.collect(Collectors.toSet());
Set<MobileCoinLedgerWrapper.OwnedTxo> knownTxosByPublicKeys = Stream.of(allTxOuts)
.filter(t -> allKnownPublicKeys.contains(t.getPublicKey()))
.collect(Collectors.toSet());
Set<MobileCoinLedgerWrapper.OwnedTxo> knownTxosByPublicKeys = allTxOuts.stream()
.filter(t -> allKnownPublicKeys.contains(t.getPublicKey()))
.collect(Collectors.toSet());
// any TXO that we can't pair up the pub key for, we don't have detail for how it got into the account
Set<MobileCoinLedgerWrapper.OwnedTxo> unknownTxOutsReceived = new HashSet<>(allTxOuts);
unknownTxOutsReceived.removeAll(knownTxosByPublicKeys);
// any TXO that we can't pair up the keyimage for, we don't have detail for how it got spent
Set<MobileCoinLedgerWrapper.OwnedTxo> unknownTxOutsSpent = Stream.of(allTxOuts).filter(MobileCoinLedgerWrapper.OwnedTxo::isSpent).collect(Collectors.toSet());
Set<MobileCoinLedgerWrapper.OwnedTxo> unknownTxOutsSpent = allTxOuts.stream().filter(MobileCoinLedgerWrapper.OwnedTxo::isSpent).collect(Collectors.toSet());
unknownTxOutsSpent.removeAll(knownTxosByKeyImage);
if (unknownTxOutsReceived.isEmpty() && unknownTxOutsSpent.isEmpty()) {
return Stream.of(allLocalPaymentTransactions).map(t -> (Payment) t).collect(Collectors.toList());
return allLocalPaymentTransactions.stream().map(t -> (Payment) t).collect(Collectors.toList());
}
List<DetailedTransaction> detailedTransactions = reconstructAllTransactions(unknownTxOutsReceived, unknownTxOutsSpent);
@@ -184,25 +183,25 @@ public final class LedgerReconcile {
}
private static @NonNull List<DetailedTransaction> reconstructAllTransactions(@NonNull Set<MobileCoinLedgerWrapper.OwnedTxo> unknownReceived, @NonNull Set<MobileCoinLedgerWrapper.OwnedTxo> unknownSpent) {
Set<Long> allBlocksWithActivity = Stream.of(unknownReceived)
.map(MobileCoinLedgerWrapper.OwnedTxo::getReceivedInBlock)
.collect(Collectors.toSet());
Set<Long> allBlocksWithActivity = unknownReceived.stream()
.map(MobileCoinLedgerWrapper.OwnedTxo::getReceivedInBlock)
.collect(Collectors.toSet());
allBlocksWithActivity
.addAll(Stream.of(unknownSpent)
.map(MobileCoinLedgerWrapper.OwnedTxo::getSpentInBlock)
.collect(Collectors.toSet()));
.addAll(unknownSpent.stream()
.map(MobileCoinLedgerWrapper.OwnedTxo::getSpentInBlock)
.collect(Collectors.toSet()));
Map<Long, List<MobileCoinLedgerWrapper.OwnedTxo>> receivedInBlock = Stream.of(unknownReceived)
.collect(Collectors.groupingBy(MobileCoinLedgerWrapper.OwnedTxo::getReceivedInBlock));
Map<Long, List<MobileCoinLedgerWrapper.OwnedTxo>> receivedInBlock = unknownReceived.stream()
.collect(Collectors.groupingBy(MobileCoinLedgerWrapper.OwnedTxo::getReceivedInBlock));
Map<Long, List<MobileCoinLedgerWrapper.OwnedTxo>> spentInBlock = Stream.of(unknownSpent)
.filter(MobileCoinLedgerWrapper.OwnedTxo::isSpent)
.collect(Collectors.groupingBy(MobileCoinLedgerWrapper.OwnedTxo::getSpentInBlock));
Map<Long, List<MobileCoinLedgerWrapper.OwnedTxo>> spentInBlock = unknownSpent.stream()
.filter(MobileCoinLedgerWrapper.OwnedTxo::isSpent)
.collect(Collectors.groupingBy(MobileCoinLedgerWrapper.OwnedTxo::getSpentInBlock));
return Stream.of(allBlocksWithActivity)
.sorted((a, b) -> b.compareTo(a))
.flatMap(blockIndex -> {
return allBlocksWithActivity.stream()
.sorted((a, b) -> b.compareTo(a))
.flatMap(blockIndex -> {
List<MobileCoinLedgerWrapper.OwnedTxo> unspent = MapUtil.getOrDefault(receivedInBlock, blockIndex, Collections.emptyList());
List<MobileCoinLedgerWrapper.OwnedTxo> spent = MapUtil.getOrDefault(spentInBlock, blockIndex, Collections.emptyList());
@@ -221,15 +220,15 @@ public final class LedgerReconcile {
TransactionReconstruction transactionReconstruction = TransactionReconstruction.estimateBlockLevelActivity(toMobileCoinList(spent), toMobileCoinList(unspent));
BlockDetail blockDetail = new BlockDetail(blockIndex, timeStamp);
return Stream.of(transactionReconstruction.getAllTransactions())
.map(t -> new DetailedTransaction(blockDetail, t));
return transactionReconstruction.getAllTransactions().stream()
.map(t -> new DetailedTransaction(blockDetail, t));
})
.sorted(DetailedTransaction.DESCENDING).collect(Collectors.toList());
.sorted(DetailedTransaction.DESCENDING).collect(Collectors.toList());
}
private static @NonNull List<Money.MobileCoin> toMobileCoinList(@NonNull List<MobileCoinLedgerWrapper.OwnedTxo> spent) {
return Stream.of(spent)
.map(MobileCoinLedgerWrapper.OwnedTxo::getValue).collect(Collectors.toList());
return spent.stream()
.map(MobileCoinLedgerWrapper.OwnedTxo::getValue).collect(Collectors.toList());
}
public static class BlockOverridePayment extends PaymentDecorator {
@@ -10,8 +10,7 @@ import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;
import androidx.lifecycle.ViewModelProvider;
import com.annimon.stream.Collectors;
import com.annimon.stream.Stream;
import java.util.stream.Collectors;
import org.thoughtcrime.securesms.groups.GroupId;
import org.thoughtcrime.securesms.groups.LiveGroup;
@@ -87,9 +86,9 @@ public class ReviewCardViewModel extends ViewModel {
@WorkerThread
private @NonNull List<ReviewCard> transformReviewRecipients(boolean isSelfGroupAdmin, @NonNull List<ReviewRecipient> reviewRecipients) {
return Stream.of(reviewRecipients)
.filter(r -> repository.loadGroupsInCommonCount(r) > 0)
.map(r -> new ReviewCard(r,
return reviewRecipients.stream()
.filter(r -> repository.loadGroupsInCommonCount(r) > 0)
.map(r -> new ReviewCard(r,
repository.loadGroupsInCommonCount(r) - (isGroupThread ? 1 : 0),
getCardType(r),
getPrimaryAction(r, isSelfGroupAdmin),
@@ -13,7 +13,6 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
import com.annimon.stream.Stream;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.components.emoji.EmojiImageView;
@@ -164,7 +163,7 @@ public class ReactionsConversationView extends LinearLayout {
List<Reaction> shortened = new ArrayList<>(3);
shortened.add(reactions.get(0));
shortened.add(reactions.get(1));
shortened.add(Stream.of(reactions).skip(2).reduce(new Reaction(null, null, 0, 0, false), Reaction::merge));
shortened.add(reactions.stream().skip(2).reduce(new Reaction(null, null, 0, 0, false), Reaction::merge));
return shortened;
} else {
@@ -4,8 +4,7 @@ import androidx.annotation.NonNull;
import androidx.lifecycle.ViewModel;
import androidx.lifecycle.ViewModelProvider;
import com.annimon.stream.Collectors;
import com.annimon.stream.Stream;
import java.util.stream.Collectors;
import org.thoughtcrime.securesms.database.model.MessageId;
@@ -14,7 +13,6 @@ import java.util.List;
import java.util.Map;
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
import io.reactivex.rxjava3.core.Maybe;
import io.reactivex.rxjava3.core.Observable;
public class ReactionsViewModel extends ViewModel {
@@ -30,9 +28,9 @@ public class ReactionsViewModel extends ViewModel {
public @NonNull Observable<List<EmojiCount>> getEmojiCounts() {
return repository.getReactions(messageId)
.map(reactionList -> {
List<EmojiCount> emojiCounts = Stream.of(Stream.of(reactionList)
List<EmojiCount> emojiCounts = reactionList.stream()
.collect(Collectors.groupingBy(ReactionDetails::getBaseEmoji))
.entrySet())
.entrySet().stream()
.sorted(this::compareReactions)
.map(entry -> new EmojiCount(entry.getKey(),
getCountDisplayEmoji(entry.getValue()),
@@ -56,10 +54,10 @@ public class ReactionsViewModel extends ViewModel {
}
private long getLatestTimestamp(List<ReactionDetails> reactions) {
return Stream.of(reactions)
.max(Comparator.comparingLong(ReactionDetails::getTimestamp))
.map(ReactionDetails::getTimestamp)
.orElse(-1L);
return reactions.stream()
.max(Comparator.comparingLong(ReactionDetails::getTimestamp))
.map(ReactionDetails::getTimestamp)
.orElse(-1L);
}
private @NonNull String getCountDisplayEmoji(@NonNull List<ReactionDetails> reactions) {
@@ -4,8 +4,7 @@ import android.content.Context;
import androidx.annotation.NonNull;
import com.annimon.stream.Collectors;
import com.annimon.stream.Stream;
import java.util.stream.Collectors;
import org.signal.core.util.ThreadUtil;
import org.signal.core.util.concurrent.SignalExecutors;
@@ -39,16 +38,17 @@ final class ReactWithAnyEmojiRepository {
this.recentEmojiPageModel = new RecentEmojiPageModel(context, storageKey);
this.emojiPages = new LinkedList<>();
emojiPages.addAll(Stream.of(EmojiSource.getLatest().getDisplayPages())
emojiPages.addAll(EmojiSource.getLatest().getDisplayPages().stream()
.filter(p -> p.getIconAttr() != EmojiCategory.EMOTICONS.getIcon())
.map(page -> new ReactWithAnyEmojiPage(Collections.singletonList(new ReactWithAnyEmojiPageBlock(EmojiCategory.getCategoryLabel(page.getIconAttr()), page)))).collect(Collectors.toList()));
.map(page -> new ReactWithAnyEmojiPage(Collections.singletonList(new ReactWithAnyEmojiPageBlock(EmojiCategory.getCategoryLabel(page.getIconAttr()), page))))
.collect(Collectors.toList()));
}
List<ReactWithAnyEmojiPage> getEmojiPageModels(@NonNull List<ReactionDetails> thisMessagesReactions) {
List<ReactWithAnyEmojiPage> pages = new LinkedList<>();
List<String> thisMessage = Stream.of(thisMessagesReactions)
.map(ReactionDetails::getDisplayEmoji)
.distinct().collect(Collectors.toList());
List<String> thisMessage = thisMessagesReactions.stream()
.map(ReactionDetails::getDisplayEmoji)
.distinct().collect(Collectors.toList());
if (thisMessage.isEmpty()) {
pages.add(new ReactWithAnyEmojiPage(Collections.singletonList(new ReactWithAnyEmojiPageBlock(R.string.ReactWithAnyEmojiBottomSheetDialogFragment__recently_used, recentEmojiPageModel))));
@@ -64,10 +64,10 @@ final class ReactWithAnyEmojiRepository {
void addEmojiToMessage(@NonNull String emoji, @NonNull MessageId messageId) {
SignalExecutors.BOUNDED.execute(() -> {
ReactionRecord oldRecord = Stream.of(SignalDatabase.reactions().getReactions(messageId))
.filter(record -> record.getAuthor().equals(Recipient.self().getId()))
.findFirst()
.orElse(null);
ReactionRecord oldRecord = SignalDatabase.reactions().getReactions(messageId).stream()
.filter(record -> record.getAuthor().equals(Recipient.self().getId()))
.findFirst()
.orElse(null);
if (oldRecord != null && oldRecord.getEmoji().equals(emoji)) {
MessageSender.sendReactionRemoval(context, messageId, oldRecord);
@@ -5,8 +5,7 @@ import android.net.Uri;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.annimon.stream.Collectors;
import com.annimon.stream.Stream;
import java.util.stream.Collectors;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.components.emoji.Emoji;
@@ -43,7 +42,7 @@ class ThisMessageEmojiPageModel implements EmojiPageModel {
@Override
public @NonNull List<Emoji> getDisplayEmoji() {
return Stream.of(getEmoji()).map(Emoji::new).collect(Collectors.toList());
return getEmoji().stream().map(Emoji::new).collect(Collectors.toList());
}
@Override
@@ -6,7 +6,6 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.WorkerThread;
import com.annimon.stream.Stream;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.contacts.sync.ContactDiscovery;
@@ -106,9 +105,9 @@ public class RecipientUtil {
public static boolean ensureUuidsAreAvailable(@NonNull Context context, @NonNull Collection<Recipient> recipients)
throws IOException
{
List<Recipient> recipientsWithoutUuids = Stream.of(recipients)
.map(Recipient::resolve)
.filter(recipient -> !recipient.getHasServiceId()).collect(com.annimon.stream.Collectors.toList());
List<Recipient> recipientsWithoutUuids = recipients.stream()
.map(Recipient::resolve)
.filter(recipient -> !recipient.getHasServiceId()).collect(Collectors.toList());
if (recipientsWithoutUuids.size() > 0) {
ContactDiscovery.refresh(context, recipientsWithoutUuids, false);
@@ -129,9 +128,9 @@ public class RecipientUtil {
}
public static List<Recipient> getEligibleForSending(@NonNull List<Recipient> recipients) {
return Stream.of(recipients)
.filter(r -> r.getRegistered() != RegisteredState.NOT_REGISTERED)
.filter(r -> !r.isBlocked()).collect(com.annimon.stream.Collectors.toList());
return recipients.stream()
.filter(r -> r.getRegistered() != RegisteredState.NOT_REGISTERED)
.filter(r -> !r.isBlocked()).collect(Collectors.toList());
}
/**
@@ -426,7 +425,7 @@ public class RecipientUtil {
@WorkerThread
private static boolean isProfileSharedViaGroup(@NonNull Recipient recipient) {
return Stream.of(SignalDatabase.groups().getPushGroupsContainingMember(recipient.getId()))
.anyMatch(group -> Recipient.resolved(group.getRecipientId()).isProfileSharing());
return SignalDatabase.groups().getPushGroupsContainingMember(recipient.getId()).stream()
.anyMatch(group -> Recipient.resolved(group.getRecipientId()).isProfileSharing());
}
}
@@ -4,8 +4,7 @@ import android.util.LongSparseArray;
import androidx.annotation.NonNull;
import com.annimon.stream.Collectors;
import com.annimon.stream.Stream;
import java.util.stream.Collectors;
import org.signal.core.util.logging.Log;
import org.signal.ringrtc.CallException;
@@ -193,8 +192,8 @@ public class GroupActionProcessor extends DeviceAwareActionProcessor {
Recipient group = currentState.getCallInfoState().getCallRecipient();
GroupCall groupCall = currentState.getCallInfoState().requireGroupCall();
List<GroupCall.GroupMemberInfo> members = Stream.of(GroupManager.getUuidCipherTexts(context, group.requireGroupId().requireV2()))
.map(entry -> new GroupCall.GroupMemberInfo(entry.getKey(), entry.getValue().serialize())).collect(Collectors.toList());
List<GroupCall.GroupMemberInfo> members = GroupManager.getUuidCipherTexts(context, group.requireGroupId().requireV2()).entrySet().stream()
.map(entry -> new GroupCall.GroupMemberInfo(entry.getKey(), entry.getValue().serialize())).collect(Collectors.toList());
try {
groupCall.setGroupMembers(new ArrayList<>(members));
@@ -6,8 +6,7 @@ import android.util.LongSparseArray;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.annimon.stream.Collectors;
import com.annimon.stream.Stream;
import java.util.stream.Collectors;
import org.signal.core.util.logging.Log;
import org.signal.ringrtc.CallException;
@@ -22,7 +21,6 @@ import org.thoughtcrime.securesms.keyvalue.SignalStore;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.ringrtc.Camera;
import org.thoughtcrime.securesms.ringrtc.RemotePeer;
import org.thoughtcrime.securesms.service.webrtc.state.CallInfoState;
import org.thoughtcrime.securesms.service.webrtc.state.WebRtcEphemeralState;
import org.thoughtcrime.securesms.service.webrtc.state.WebRtcServiceState;
import org.thoughtcrime.securesms.service.webrtc.state.WebRtcServiceStateBuilder;
@@ -254,9 +252,9 @@ public class GroupConnectedActionProcessor extends GroupActionProcessor {
String eraId = WebRtcUtil.getGroupCallEraId(groupCall);
webRtcInteractor.sendGroupCallMessage(currentState.getCallInfoState().getCallRecipient(), eraId, null, false, false);
List<UUID> members = Stream.of(currentState.getCallInfoState().getRemoteCallParticipants())
.filter(p -> p.getRecipient().getHasServiceId())
.map(p -> p.getRecipient().requireServiceId().getRawUuid()).collect(Collectors.toList());
List<UUID> members = currentState.getCallInfoState().getRemoteCallParticipants().stream()
.filter(p -> p.getRecipient().getHasServiceId())
.map(p -> p.getRecipient().requireServiceId().getRawUuid()).collect(Collectors.toList());
webRtcInteractor.updateGroupCallUpdateMessage(currentState.getCallInfoState().getCallRecipient().getId(), eraId, members, false);
currentState = currentState.builder()
@@ -5,8 +5,7 @@ import android.os.ResultReceiver;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.annimon.stream.Collectors;
import com.annimon.stream.Stream;
import java.util.stream.Collectors;
import org.signal.core.util.logging.Log;
import org.signal.ringrtc.CallException;
@@ -144,8 +143,8 @@ public class GroupPreJoinActionProcessor extends GroupActionProcessor {
return currentState;
}
List<Recipient> callParticipants = Stream.of(peekInfo.getJoinedMembers())
.map(uuid -> Recipient.externalPush(ACI.from(uuid))).collect(Collectors.toList());
List<Recipient> callParticipants = peekInfo.getJoinedMembers().stream()
.map(uuid -> Recipient.externalPush(ACI.from(uuid))).collect(Collectors.toList());
WebRtcServiceStateBuilder.CallInfoStateBuilder builder = currentState.builder()
.changeCallInfoState()
@@ -11,8 +11,6 @@ import androidx.annotation.AnyThread;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.annimon.stream.Stream;
import org.greenrobot.eventbus.EventBus;
import org.signal.core.models.ServiceId.ACI;
import org.signal.core.util.Util;
@@ -481,8 +479,8 @@ public final class SignalCallManager implements CallManager.Observer, GroupCall.
GroupId.V2 groupId = group.requireGroupId().requireV2();
ExternalGroupCredential credential = GroupManager.getExternalGroupCredential(context, groupId);
List<GroupCall.GroupMemberInfo> members = Stream.of(GroupManager.getUuidCipherTexts(context, groupId))
.map(entry -> new GroupCall.GroupMemberInfo(entry.getKey(), entry.getValue().serialize())).collect(com.annimon.stream.Collectors.toList());
List<GroupCall.GroupMemberInfo> members = GroupManager.getUuidCipherTexts(context, groupId).entrySet().stream()
.map(entry -> new GroupCall.GroupMemberInfo(entry.getKey(), entry.getValue().serialize())).collect(Collectors.toList());
callManager.peekGroupCall(SignalStore.internal().getGroupCallingServer(), credential.token.getBytes(Charsets.UTF_8), members, peekInfo -> {
Long threadId = SignalDatabase.threads().getThreadIdFor(group.getId());
@@ -959,8 +957,8 @@ public final class SignalCallManager implements CallManager.Observer, GroupCall.
SignalExecutors.BOUNDED_IO.execute(() -> {
List<Pair<String, String>> headerPairs;
if (headers != null) {
headerPairs = Stream.of(headers)
.map(header -> new Pair<>(header.getName(), header.getValue())).collect(com.annimon.stream.Collectors.toList());
headerPairs = headers.stream()
.map(header -> new Pair<>(header.getName(), header.getValue())).collect(Collectors.toList());
} else {
headerPairs = Collections.emptyList();
}
@@ -6,8 +6,7 @@ import android.os.ResultReceiver;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.annimon.stream.Collectors;
import com.annimon.stream.Stream;
import java.util.stream.Collectors;
import org.signal.core.util.logging.Log;
import org.signal.libsignal.protocol.IdentityKey;
@@ -534,8 +533,9 @@ public abstract class WebRtcActionProcessor {
protected final @NonNull WebRtcServiceState handleSendIceCandidates(@NonNull WebRtcServiceState currentState, @NonNull CallMetadata callMetadata, boolean broadcast, @NonNull List<byte[]> iceCandidates) {
Log.i(tag, "handleSendIceCandidates(): id: " + callMetadata.getCallId().format(callMetadata.getRemoteDevice()));
List<IceUpdateMessage> iceUpdateMessages = Stream.of(iceCandidates)
.map(c -> new IceUpdateMessage(callMetadata.getCallId().longValue(), c)).collect(Collectors.toList());
List<IceUpdateMessage> iceUpdateMessages = iceCandidates.stream()
.map(c -> new IceUpdateMessage(callMetadata.getCallId().longValue(), c))
.collect(Collectors.toList());
Integer destinationDeviceId = broadcast ? null : callMetadata.getRemoteDevice();
SignalServiceCallMessage callMessage = SignalServiceCallMessage.forIceUpdates(iceUpdateMessages, destinationDeviceId);
@@ -8,7 +8,6 @@ import android.text.TextUtils;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.annimon.stream.Stream;
import org.signal.core.util.BreakIteratorCompat;
import org.signal.core.util.logging.Log;
@@ -248,7 +247,7 @@ public final class MultiShareArgs implements Parcelable {
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeTypedList(Stream.of(contactSearchKeys).map(ContactSearchKey::requireRecipientSearchKey).collect(com.annimon.stream.Collectors.toList()));
dest.writeTypedList(contactSearchKeys.stream().map(ContactSearchKey::requireRecipientSearchKey).collect(Collectors.toList()));
dest.writeTypedList(media);
dest.writeString(draftText);
dest.writeParcelable(stickerLocator, flags);
@@ -21,7 +21,6 @@ import org.thoughtcrime.securesms.contactshare.Contact;
import org.thoughtcrime.securesms.conversation.MessageSendType;
import org.thoughtcrime.securesms.conversation.colors.ChatColors;
import org.signal.core.models.media.TransformProperties;
import org.thoughtcrime.securesms.database.AttachmentTable;
import org.thoughtcrime.securesms.database.SignalDatabase;
import org.thoughtcrime.securesms.database.model.Mention;
import org.thoughtcrime.securesms.database.model.StoryType;
@@ -10,7 +10,6 @@ import androidx.appcompat.widget.Toolbar;
import androidx.lifecycle.ViewModelProvider;
import androidx.recyclerview.widget.RecyclerView;
import com.annimon.stream.Stream;
import com.bumptech.glide.Glide;
import org.thoughtcrime.securesms.PassphraseRequiredActivity;
@@ -86,8 +85,8 @@ public class ShareInterstitialActivity extends PassphraseRequiredActivity {
linkPreviewViewModel = new ViewModelProvider(this, linkPreviewViewModelFactory).get(LinkPreviewViewModel.class);
boolean hasSms = Stream.of(args.getRecipientSearchKeys())
.anyMatch(c -> {
boolean hasSms = args.getRecipientSearchKeys().stream()
.anyMatch(c -> {
Recipient recipient = Recipient.resolved(c.getRecipientId());
if (recipient.isDistributionList()) {
return false;
@@ -4,8 +4,7 @@ import androidx.annotation.NonNull;
import androidx.annotation.WorkerThread;
import androidx.core.util.Consumer;
import com.annimon.stream.Collectors;
import com.annimon.stream.Stream;
import java.util.stream.Collectors;
import org.signal.core.util.concurrent.SignalExecutors;
import org.thoughtcrime.securesms.contacts.paged.ContactSearchKey;
@@ -22,8 +21,8 @@ class ShareInterstitialRepository {
@WorkerThread
private List<Recipient> resolveRecipients(@NonNull Set<ContactSearchKey.RecipientSearchKey> recipientSearchKeys) {
return Stream.of(recipientSearchKeys)
.map(ContactSearchKey.RecipientSearchKey::getRecipientId)
.map(Recipient::resolved).collect(Collectors.toList());
return recipientSearchKeys.stream()
.map(ContactSearchKey.RecipientSearchKey::getRecipientId)
.map(Recipient::resolved).collect(Collectors.toList());
}
}
@@ -24,7 +24,6 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.WorkerThread;
import com.annimon.stream.Stream;
import org.greenrobot.eventbus.EventBus;
import org.signal.core.util.logging.Log;
@@ -297,8 +296,8 @@ public class MessageSender {
Recipient recipient = message.getThreadRecipient();
long allocatedThreadId = threadTable.getOrCreateValidThreadId(message.getThreadRecipient(), threadId);
List<AttachmentId> attachmentIds = Stream.of(preUploadResults).map(PreUploadResult::getAttachmentId).collect(com.annimon.stream.Collectors.toList());
List<String> jobIds = Stream.of(preUploadResults).map(PreUploadResult::getJobIds).flatMap(Stream::of).collect(com.annimon.stream.Collectors.toList());
List<AttachmentId> attachmentIds = preUploadResults.stream().map(PreUploadResult::getAttachmentId).collect(Collectors.toList());
List<String> jobIds = preUploadResults.stream().map(PreUploadResult::getJobIds).flatMap(x -> x.stream()).collect(Collectors.toList());
if (!attachmentDatabase.hasAttachments(attachmentIds)) {
Log.w(TAG, "Attachments not found in database for " + message.getThreadRecipient().getId() + ", thread: " + threadId + ", pre-uploads: " + preUploadResults);
@@ -337,16 +336,16 @@ public class MessageSender {
@NonNull Collection<PreUploadResult> preUploadResults,
boolean overwritePreUploadMessageIds)
{
Log.i(TAG, "Sending media broadcast (overwrite: " + overwritePreUploadMessageIds + ") to " + Stream.of(messages).map(m -> m.getThreadRecipient().getId()).collect(com.annimon.stream.Collectors.toList()));
Log.i(TAG, "Sending media broadcast (overwrite: " + overwritePreUploadMessageIds + ") to " + messages.stream().map(m -> m.getThreadRecipient().getId()).collect(Collectors.toList()));
Preconditions.checkArgument(messages.size() > 0, "No messages!");
Preconditions.checkArgument(Stream.of(messages).allMatch(m -> m.getAttachments().isEmpty()), "Messages can't have attachments! They should be pre-uploaded.");
Preconditions.checkArgument(messages.stream().allMatch(m -> m.getAttachments().isEmpty()), "Messages can't have attachments! They should be pre-uploaded.");
JobManager jobManager = AppDependencies.getJobManager();
AttachmentTable attachmentDatabase = SignalDatabase.attachments();
MessageTable mmsDatabase = SignalDatabase.messages();
ThreadTable threadTable = SignalDatabase.threads();
List<AttachmentId> preUploadAttachmentIds = Stream.of(preUploadResults).map(PreUploadResult::getAttachmentId).collect(com.annimon.stream.Collectors.toList());
List<String> preUploadJobIds = Stream.of(preUploadResults).map(PreUploadResult::getJobIds).flatMap(Stream::of).collect(com.annimon.stream.Collectors.toList());
List<AttachmentId> preUploadAttachmentIds = preUploadResults.stream().map(PreUploadResult::getAttachmentId).collect(Collectors.toList());
List<String> preUploadJobIds = preUploadResults.stream().map(PreUploadResult::getJobIds).flatMap(x -> x.stream()).collect(Collectors.toList());
List<Long> messageIds = new ArrayList<>(messages.size());
List<String> messageDependsOnIds = new ArrayList<>(preUploadJobIds);
OutgoingMessage primaryMessage = messages.get(0);
@@ -370,8 +369,8 @@ public class MessageSender {
messageIds.add(primaryMessageId);
}
List<DatabaseAttachment> preUploadAttachments = Stream.of(preUploadAttachmentIds)
.map(attachmentDatabase::getAttachment).collect(com.annimon.stream.Collectors.toList());
List<DatabaseAttachment> preUploadAttachments = preUploadAttachmentIds.stream()
.map(attachmentDatabase::getAttachment).collect(Collectors.toList());
if (messages.size() > 0) {
List<OutgoingMessage> secondaryMessages = overwritePreUploadMessageIds ? messages.subList(1, messages.size()) : messages;
@@ -6,8 +6,7 @@ import android.database.Cursor;
import androidx.annotation.NonNull;
import androidx.annotation.WorkerThread;
import com.annimon.stream.Collectors;
import com.annimon.stream.Stream;
import java.util.stream.Collectors;
import org.signal.core.util.concurrent.SignalExecutors;
import org.signal.core.util.logging.Log;
@@ -88,8 +87,8 @@ public final class StickerPackPreviewRepository {
remoteManifest.getTitle(),
remoteManifest.getAuthor(),
toOptionalSticker(packId, packKey, remoteManifest.getCover()),
Stream.of(remoteManifest.getStickers())
.map(s -> toSticker(packId, packKey, s)).collect(Collectors.toList()));
remoteManifest.getStickers().stream()
.map(s -> toSticker(packId, packKey, s)).collect(Collectors.toList()));
return Optional.of(new StickerManifestResult(localManifest, false));
} catch (IOException | InvalidMessageException e) {
@@ -2,8 +2,7 @@ package org.thoughtcrime.securesms.storage;
import androidx.annotation.NonNull;
import com.annimon.stream.Collectors;
import com.annimon.stream.Stream;
import java.util.stream.Collectors;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.recipients.Recipient;
@@ -35,7 +34,7 @@ public final class StorageSyncValidations {
validateManifestAndInserts(result.manifest, result.inserts, self);
if (result.deletes.size() > 0) {
Set<String> allSetEncoded = Stream.of(result.manifest.storageIds).map(StorageId::getRaw).map(Base64::encodeWithPadding).collect(Collectors.toSet());
Set<String> allSetEncoded = result.manifest.storageIds.stream().map(StorageId::getRaw).map(Base64::encodeWithPadding).collect(Collectors.toSet());
for (byte[] delete : result.deletes) {
String encoded = Base64.encodeWithPadding(delete);
@@ -59,14 +58,14 @@ public final class StorageSyncValidations {
return;
}
Set<ByteBuffer> previousIds = Stream.of(previousManifest.storageIds).map(id -> ByteBuffer.wrap(id.getRaw())).collect(Collectors.toSet());
Set<ByteBuffer> newIds = Stream.of(result.manifest.storageIds).map(id -> ByteBuffer.wrap(id.getRaw())).collect(Collectors.toSet());
Set<ByteBuffer> previousIds = previousManifest.storageIds.stream().map(id -> ByteBuffer.wrap(id.getRaw())).collect(Collectors.toSet());
Set<ByteBuffer> newIds = result.manifest.storageIds.stream().map(id -> ByteBuffer.wrap(id.getRaw())).collect(Collectors.toSet());
Set<ByteBuffer> manifestInserts = SetUtil.difference(newIds, previousIds);
Set<ByteBuffer> manifestDeletes = SetUtil.difference(previousIds, newIds);
Set<ByteBuffer> declaredInserts = Stream.of(result.inserts).map(r -> ByteBuffer.wrap(r.getId().getRaw())).collect(Collectors.toSet());
Set<ByteBuffer> declaredDeletes = Stream.of(result.deletes).map(ByteBuffer::wrap).collect(Collectors.toSet());
Set<ByteBuffer> declaredInserts = result.inserts.stream().map(r -> ByteBuffer.wrap(r.getId().getRaw())).collect(Collectors.toSet());
Set<ByteBuffer> declaredDeletes = result.deletes.stream().map(ByteBuffer::wrap).collect(Collectors.toSet());
if (declaredInserts.size() > manifestInserts.size()) {
Log.w(TAG, "DeclaredInserts: " + declaredInserts.size() + ", ManifestInserts: " + manifestInserts.size());
@@ -117,8 +116,8 @@ public final class StorageSyncValidations {
}
Set<StorageId> allSet = new HashSet<>(manifest.storageIds);
Set<StorageId> insertSet = new HashSet<>(Stream.of(inserts).map(SignalStorageRecord::getId).collect(Collectors.toList()));
Set<ByteBuffer> rawIdSet = Stream.of(allSet).map(id -> ByteBuffer.wrap(id.getRaw())).collect(Collectors.toSet());
Set<StorageId> insertSet = new HashSet<>(inserts.stream().map(SignalStorageRecord::getId).collect(Collectors.toList()));
Set<ByteBuffer> rawIdSet = allSet.stream().map(id -> ByteBuffer.wrap(id.getRaw())).collect(Collectors.toSet());
if (allSet.size() != manifest.storageIds.size()) {
throw new DuplicateStorageIdError();
@@ -12,7 +12,6 @@ import androidx.core.content.LocusIdCompat;
import androidx.core.content.pm.ShortcutInfoCompat;
import androidx.core.content.pm.ShortcutManagerCompat;
import com.annimon.stream.Stream;
import com.google.common.collect.Sets;
import org.signal.core.util.concurrent.SignalExecutors;
@@ -94,7 +93,7 @@ public final class ConversationUtil {
public static void clearAllShortcuts(@NonNull Context context) {
List<ShortcutInfoCompat> shortcutInfos = ShortcutManagerCompat.getDynamicShortcuts(context);
ShortcutManagerCompat.removeLongLivedShortcuts(context, Stream.of(shortcutInfos).map(ShortcutInfoCompat::getId).collect(com.annimon.stream.Collectors.toList()));
ShortcutManagerCompat.removeLongLivedShortcuts(context, shortcutInfos.stream().map(ShortcutInfoCompat::getId).collect(Collectors.toList()));
}
/**
@@ -102,7 +101,7 @@ public final class ConversationUtil {
*/
public static void clearShortcuts(@NonNull Context context, @NonNull Collection<RecipientId> recipientIds) {
SignalExecutors.BOUNDED.execute(() -> {
ShortcutManagerCompat.removeLongLivedShortcuts(context, Stream.of(recipientIds).filter(Objects::nonNull).map(ConversationUtil::getShortcutId).collect(com.annimon.stream.Collectors.toList()));
ShortcutManagerCompat.removeLongLivedShortcuts(context, recipientIds.stream().filter(Objects::nonNull).map(ConversationUtil::getShortcutId).collect(Collectors.toList()));
});
}
@@ -272,7 +271,7 @@ public final class ConversationUtil {
private static @NonNull Person[] buildPersonsForGroup(@NonNull Context context, @NonNull GroupId groupId) {
List<Recipient> members = SignalDatabase.groups().getGroupMembers(groupId, GroupTable.MemberSet.FULL_MEMBERS_EXCLUDING_SELF);
return Stream.of(members).map(member -> buildPersonWithoutIcon(context, member.resolve())).toArray(Person[]::new);
return members.stream().map(member -> buildPersonWithoutIcon(context, member.resolve())).toArray(Person[]::new);
}
/**
@@ -4,7 +4,6 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import com.annimon.stream.Stream;
import com.fasterxml.jackson.annotation.JsonProperty;
import org.signal.core.util.Util;
@@ -14,6 +13,7 @@ import org.thoughtcrime.securesms.BuildConfig;
import java.io.IOException;
import java.util.Comparator;
import java.util.Objects;
import java.util.stream.Stream;
public final class RemoteDeprecation {
@@ -9,8 +9,8 @@ import android.text.style.CharacterStyle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.annimon.stream.Collectors;
import com.annimon.stream.Stream;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.signal.core.util.StringUtil;
import org.thoughtcrime.securesms.components.spoiler.SpoilerAnnotation;
@@ -6,8 +6,6 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.RecyclerView;
import com.annimon.stream.Stream;
import java.util.List;
/**
@@ -12,8 +12,7 @@ import androidx.annotation.Nullable;
import androidx.appcompat.widget.Toolbar;
import androidx.viewpager2.widget.ViewPager2;
import com.annimon.stream.Collectors;
import com.annimon.stream.Stream;
import java.util.stream.Collectors;
import org.thoughtcrime.securesms.PassphraseRequiredActivity;
import org.thoughtcrime.securesms.R;
@@ -81,9 +80,9 @@ public class ChatWallpaperPreviewActivity extends PassphraseRequiredActivity {
viewPager.setAdapter(adapter);
adapter.submitList(Collections.singletonList(new ChatWallpaperSelectionMappingModel(selected)));
repository.getAllWallpaper(wallpapers -> adapter.submitList(Stream.of(wallpapers)
.map(wallpaper -> ChatWallpaperFactory.updateWithDimming(wallpaper, dim ? ChatWallpaper.FIXED_DIM_LEVEL_FOR_DARK_THEME : 0f))
.<MappingModel<?>>map(ChatWallpaperSelectionMappingModel::new).collect(Collectors.toList())));
repository.getAllWallpaper(wallpapers -> adapter.submitList(wallpapers.stream()
.map(wallpaper -> ChatWallpaperFactory.updateWithDimming(wallpaper, dim ? ChatWallpaper.FIXED_DIM_LEVEL_FOR_DARK_THEME : 0f))
.<MappingModel<?>>map(ChatWallpaperSelectionMappingModel::new).collect(Collectors.toList())));
submit.setOnClickListener(unused -> {
ChatWallpaperSelectionMappingModel model = (ChatWallpaperSelectionMappingModel) adapter.getCurrentList().get(viewPager.getCurrentItem());
@@ -8,8 +8,7 @@ import androidx.lifecycle.Transformations;
import androidx.lifecycle.ViewModel;
import androidx.lifecycle.ViewModelProvider;
import com.annimon.stream.Collectors;
import com.annimon.stream.Stream;
import java.util.stream.Collectors;
import org.thoughtcrime.securesms.conversation.colors.AvatarColor;
import org.thoughtcrime.securesms.conversation.colors.ChatColors;
@@ -140,9 +139,9 @@ public class ChatWallpaperViewModel extends ViewModel {
@NonNull LiveData<List<MappingModel<?>>> getWallpapers() {
return LiveDataUtil.combineLatest(builtins, dimInDarkTheme, (wallpapers, dimInDarkMode) ->
Stream.of(wallpapers)
.map(paper -> ChatWallpaperFactory.updateWithDimming(paper, dimInDarkMode ? ChatWallpaper.FIXED_DIM_LEVEL_FOR_DARK_THEME : 0f))
.<MappingModel<?>>map(ChatWallpaperSelectionMappingModel::new).collect(Collectors.toList())
wallpapers.stream()
.map(paper -> ChatWallpaperFactory.updateWithDimming(paper, dimInDarkMode ? ChatWallpaper.FIXED_DIM_LEVEL_FOR_DARK_THEME : 0f))
.<MappingModel<?>>map(ChatWallpaperSelectionMappingModel::new).collect(Collectors.toList())
);
}