From b6106d5506b25a07922e60ae67b4090978bda584 Mon Sep 17 00:00:00 2001 From: Harris Date: Tue, 13 Sep 2022 17:52:09 +1000 Subject: [PATCH] Use streams and collectors supported below API 24 in StaticEmojiPageModel (#966) * fix: use annimon stream instead of java util * refactor: convert remaining java.til stream and functions into annimon equivalent * refactor: remove a .stream() reference * fix: possible future NPE in ConversationReactionOverlay --- .../emoji/StaticEmojiPageModel.java | 7 ++--- .../v2/ConversationReactionOverlay.java | 3 +++ .../any/ReactWithAnyEmojiViewModel.java | 5 ++-- .../thoughtcrime/securesms/util/ListUtil.java | 6 +++-- .../thoughtcrime/securesms/util/SqlUtil.kt | 6 ++--- .../util/adapter/mapping/MappingModelList.kt | 26 +++++-------------- 6 files changed, 24 insertions(+), 29 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/emoji/StaticEmojiPageModel.java b/app/src/main/java/org/thoughtcrime/securesms/components/emoji/StaticEmojiPageModel.java index 3270889ec6..812b9d648c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/emoji/StaticEmojiPageModel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/emoji/StaticEmojiPageModel.java @@ -5,13 +5,14 @@ import android.net.Uri; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import com.annimon.stream.Collectors; +import com.annimon.stream.Stream; + import org.thoughtcrime.securesms.emoji.EmojiCategory; -import java.util.Arrays; import java.util.Collections; import java.util.LinkedList; import java.util.List; -import java.util.stream.Collectors; public class StaticEmojiPageModel implements EmojiPageModel { private final @NonNull EmojiCategory category; @@ -19,7 +20,7 @@ public class StaticEmojiPageModel implements EmojiPageModel { private final @Nullable Uri sprite; public StaticEmojiPageModel(@NonNull EmojiCategory category, @NonNull String[] strings, @Nullable Uri sprite) { - this(category, Arrays.stream(strings).map(s -> new Emoji(Collections.singletonList(s))).collect(Collectors.toList()), sprite); + this(category, Stream.of(strings).map(s -> new Emoji(Collections.singletonList(s))).collect(Collectors.toList()), sprite); } public StaticEmojiPageModel(@NonNull EmojiCategory category, @NonNull List emoji, @Nullable Uri sprite) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationReactionOverlay.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationReactionOverlay.java index 298261b299..995dcda2f2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationReactionOverlay.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationReactionOverlay.java @@ -46,6 +46,7 @@ import org.thoughtcrime.securesms.util.AnimationCompleteListener; import org.thoughtcrime.securesms.util.DateUtils; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Locale; @@ -655,6 +656,8 @@ public final class ConversationReactionOverlay extends FrameLayout { boolean hasText = !message.getBody().isEmpty(); OpenGroup openGroup = DatabaseComponent.get(getContext()).lokiThreadDatabase().getOpenGroupChat(message.getThreadId()); Recipient recipient = DatabaseComponent.get(getContext()).threadDatabase().getRecipientForThreadId(message.getThreadId()); + if (recipient == null) return Collections.emptyList(); + String userPublicKey = TextSecurePreferences.getLocalNumber(getContext()); // Select message items.add(new ActionItem(R.attr.menu_select_icon, getContext().getResources().getString(R.string.conversation_context__menu_select), () -> handleActionItemClicked(Action.SELECT))); diff --git a/app/src/main/java/org/thoughtcrime/securesms/reactions/any/ReactWithAnyEmojiViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/reactions/any/ReactWithAnyEmojiViewModel.java index 6bdb1fbb28..0ac6cf18f4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/reactions/any/ReactWithAnyEmojiViewModel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/reactions/any/ReactWithAnyEmojiViewModel.java @@ -5,6 +5,8 @@ import androidx.annotation.Nullable; import androidx.lifecycle.ViewModel; import androidx.lifecycle.ViewModelProvider; +import com.annimon.stream.Stream; + import org.session.libsession.messaging.MessagingModuleConfiguration; import org.thoughtcrime.securesms.components.emoji.EmojiPageModel; import org.thoughtcrime.securesms.components.emoji.EmojiPageViewGridAdapter; @@ -79,8 +81,7 @@ public final class ReactWithAnyEmojiViewModel extends ViewModel { } private static @NonNull MappingModelList toMappingModels(@NonNull EmojiPageModel model) { - return model.getDisplayEmoji() - .stream() + return Stream.of(model.getDisplayEmoji()) .map(e -> new EmojiPageViewGridAdapter.EmojiModel(model.getKey(), e)) .collect(MappingModelList.collect()); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/ListUtil.java b/app/src/main/java/org/thoughtcrime/securesms/util/ListUtil.java index fa2281184d..20dd6d68cf 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/ListUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/ListUtil.java @@ -2,10 +2,11 @@ package org.thoughtcrime.securesms.util; import androidx.annotation.NonNull; +import com.annimon.stream.Stream; + import java.util.ArrayList; import java.util.Collection; import java.util.List; -import java.util.stream.Stream; public final class ListUtil { private ListUtil() {} @@ -23,7 +24,8 @@ public final class ListUtil { @SafeVarargs public static List concat(Collection... items) { - final List concat = new ArrayList<>(Stream.of(items).map(Collection::size).reduce(0, Integer::sum)); + //noinspection Convert2MethodRef + final List concat = new ArrayList<>(Stream.of(items).map(Collection::size).reduce(0, (lhs, rhs) -> lhs+rhs)); for (Collection list : items) { concat.addAll(list); diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/SqlUtil.kt b/app/src/main/java/org/thoughtcrime/securesms/util/SqlUtil.kt index 4d92cd9de1..f7a2a7482f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/SqlUtil.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/util/SqlUtil.kt @@ -1,7 +1,8 @@ package org.thoughtcrime.securesms.util import androidx.annotation.VisibleForTesting -import java.util.stream.Collectors +import com.annimon.stream.Collectors +import com.annimon.stream.Stream object SqlUtil { /** The maximum number of arguments (i.e. question marks) allowed in a SQL statement. */ @@ -73,8 +74,7 @@ object SqlUtil { @VisibleForTesting fun buildCustomCollectionQuery(query: String, argList: List>, maxQueryArgs: Int): List { val batchSize: Int = maxQueryArgs / argList[0].size - return ListUtil.chunk(argList, batchSize) - .stream() + return Stream.of(ListUtil.chunk(argList, batchSize)) .map { argBatch -> buildSingleCustomCollectionQuery(query, argBatch) } .collect(Collectors.toList()) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/adapter/mapping/MappingModelList.kt b/app/src/main/java/org/thoughtcrime/securesms/util/adapter/mapping/MappingModelList.kt index ab09b31bbf..5d6b8dc64e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/adapter/mapping/MappingModelList.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/util/adapter/mapping/MappingModelList.kt @@ -1,10 +1,9 @@ package org.thoughtcrime.securesms.util.adapter.mapping -import java.util.function.BiConsumer -import java.util.function.BinaryOperator -import java.util.function.Function -import java.util.function.Supplier -import java.util.stream.Collector +import com.annimon.stream.Collector +import com.annimon.stream.function.BiConsumer +import com.annimon.stream.function.Function +import com.annimon.stream.function.Supplier class MappingModelList : ArrayList?> { constructor() {} @@ -22,26 +21,15 @@ class MappingModelList : ArrayList?> { fun collect(): Collector, MappingModelList, MappingModelList> { return object : Collector, MappingModelList, MappingModelList> { override fun supplier(): Supplier { - return java.util.function.Supplier { MappingModelList() } + return Supplier { MappingModelList() } } override fun accumulator(): BiConsumer> { - return java.util.function.BiConsumer { obj: MappingModelList, e: MappingModel<*> -> obj.add(e) } - } - - override fun combiner(): BinaryOperator { - return BinaryOperator { left: MappingModelList, right: MappingModelList -> - left.addAll(right) - left - } + return BiConsumer { obj: MappingModelList, e: MappingModel<*> -> obj.add(e) } } override fun finisher(): Function { - return Function.identity() - } - - override fun characteristics(): Set { - return setOf(Collector.Characteristics.IDENTITY_FINISH) + return Function { t -> t } } } }