From d7d923c820a0eef874ede4e2338dfd0228e24e34 Mon Sep 17 00:00:00 2001 From: Cody Henthorne Date: Tue, 2 Aug 2022 23:26:58 -0400 Subject: [PATCH] Tweak emoji suggestions UX. --- .../securesms/components/ComposeText.java | 4 +--- .../conversation/ConversationParentFragment.java | 1 + .../ui/inlinequery/InlineQueryReplacement.kt | 2 +- .../ui/inlinequery/InlineQueryResultsController.kt | 7 ++++--- .../ui/inlinequery/InlineQueryResultsPopup.kt | 8 ++++++-- .../keyboard/emoji/search/EmojiSearchRepository.kt | 12 +++++++----- .../main/res/layout/inline_query_results_popup.xml | 5 +++-- 7 files changed, 23 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/ComposeText.java b/app/src/main/java/org/thoughtcrime/securesms/components/ComposeText.java index beaefa8bb6..edf84341c9 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/ComposeText.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/ComposeText.java @@ -52,7 +52,7 @@ import static org.thoughtcrime.securesms.database.MentionUtil.MENTION_STARTER; public class ComposeText extends EmojiEditText { private static final char EMOJI_STARTER = ':'; - private static final long EMOJI_KEYWORD_DELAY = TimeUnit.SECONDS.toMillis(1); + private static final long EMOJI_KEYWORD_DELAY = 1500; private CharSequence hint; private SpannableString subHint; @@ -322,11 +322,9 @@ public class ComposeText extends EmojiEditText { } private void doAfterCursorChange(@NonNull Editable text) { - removeCallbacks(keywordSearchRunnable); if (enoughToFilter(text, false)) { performFiltering(text, false); } else { - postDelayed(keywordSearchRunnable, EMOJI_KEYWORD_DELAY); clearInlineQuery(); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java index 22126255a7..0b567bbfd8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java @@ -2358,6 +2358,7 @@ public class ConversationParentFragment extends Fragment composeText, getViewLifecycleOwner() ); + inlineQueryResultsController.onOrientationChange(getResources().getConfiguration().orientation == ORIENTATION_LANDSCAPE); recipient.observe(getViewLifecycleOwner(), r -> { if (r.isPushV2Group() && !mentionsSuggestions.resolved()) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryReplacement.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryReplacement.kt index 3daefab310..31691f3c7b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryReplacement.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryReplacement.kt @@ -10,7 +10,7 @@ sealed class InlineQueryReplacement(@get:JvmName("isKeywordSearch") val keywordS class Emoji(private val emoji: String, keywordSearch: Boolean) : InlineQueryReplacement(keywordSearch) { override fun toCharSequence(context: Context): CharSequence { - return "$emoji " + return emoji } } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsController.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsController.kt index afc3d27141..31139783ef 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsController.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsController.kt @@ -10,7 +10,6 @@ import io.reactivex.rxjava3.kotlin.subscribeBy import org.signal.core.util.DimensionUnit import org.thoughtcrime.securesms.components.ComposeText import org.thoughtcrime.securesms.util.LifecycleDisposable -import org.thoughtcrime.securesms.util.VibrateUtil import org.thoughtcrime.securesms.util.adapter.mapping.AnyMappingModel import org.thoughtcrime.securesms.util.doOnEachLayout @@ -30,6 +29,7 @@ class InlineQueryResultsController( private var popup: InlineQueryResultsPopup? = null private var previousResults: List? = null private var canShow: Boolean = false + private var isLandscape: Boolean = false init { lifecycleDisposable.bindTo(lifecycleOwner) @@ -61,6 +61,8 @@ class InlineQueryResultsController( } fun onOrientationChange(isLandscape: Boolean) { + this.isLandscape = isLandscape + if (isLandscape) { dismiss() } else { @@ -70,7 +72,7 @@ class InlineQueryResultsController( private fun updateList(results: List) { previousResults = results - if (results.isEmpty() || !canShow) { + if (results.isEmpty() || !canShow || isLandscape) { dismiss() } else if (popup != null) { popup?.setResults(results) @@ -82,7 +84,6 @@ class InlineQueryResultsController( baseOffsetX = DimensionUnit.DP.toPixels(16f).toInt(), callback = this ).show() - VibrateUtil.vibrateTick(context) } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsPopup.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsPopup.kt index 97578538ce..a3b04068b2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsPopup.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsPopup.kt @@ -6,8 +6,8 @@ import android.os.Build import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.view.ViewOutlineProvider import android.widget.PopupWindow -import androidx.core.content.ContextCompat import androidx.recyclerview.widget.RecyclerView import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.util.ViewUtil @@ -34,7 +34,11 @@ class InlineQueryResultsPopup( private val adapter: MappingAdapter init { - setBackgroundDrawable(ContextCompat.getDrawable(context, R.drawable.signal_context_menu_background)) + if (Build.VERSION.SDK_INT >= 21) { + contentView.outlineProvider = ViewOutlineProvider.BACKGROUND + contentView.clipToOutline = true + } + inputMethodMode = INPUT_METHOD_NOT_NEEDED setOnDismissListener { diff --git a/app/src/main/java/org/thoughtcrime/securesms/keyboard/emoji/search/EmojiSearchRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/keyboard/emoji/search/EmojiSearchRepository.kt index a27cf83be6..559c1d7465 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/keyboard/emoji/search/EmojiSearchRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/keyboard/emoji/search/EmojiSearchRepository.kt @@ -18,18 +18,20 @@ private const val MINIMUM_QUERY_THRESHOLD = 1 private const val MINIMUM_INLINE_QUERY_THRESHOLD = 2 private const val EMOJI_SEARCH_LIMIT = 20 +private val NOT_PUNCTUATION = "[A-Za-z0-9 ]".toRegex() + class EmojiSearchRepository(private val context: Context) { private val emojiSearchDatabase: EmojiSearchDatabase = SignalDatabase.emojiSearch fun submitQuery(query: String, limit: Int = EMOJI_SEARCH_LIMIT): Single> { - if (query.length < MINIMUM_INLINE_QUERY_THRESHOLD) { - return Single.just(emptyList()) + val result = if (query.length >= MINIMUM_INLINE_QUERY_THRESHOLD && NOT_PUNCTUATION.matches(query.substring(query.lastIndex))) { + Single.fromCallable> { emojiSearchDatabase.query(query, limit) } + } else { + Single.just(emptyList()) } - return Single.fromCallable> { - emojiSearchDatabase.query(query, limit) - }.subscribeOn(Schedulers.io()) + return result.subscribeOn(Schedulers.io()) } fun submitQuery(query: String, includeRecents: Boolean, limit: Int = EMOJI_SEARCH_LIMIT, consumer: Consumer) { diff --git a/app/src/main/res/layout/inline_query_results_popup.xml b/app/src/main/res/layout/inline_query_results_popup.xml index 9946840f8a..27eacd4371 100644 --- a/app/src/main/res/layout/inline_query_results_popup.xml +++ b/app/src/main/res/layout/inline_query_results_popup.xml @@ -2,16 +2,17 @@ + android:layout_height="wrap_content" + android:background="@drawable/signal_context_menu_background"> \ No newline at end of file