From f0a34f78d2ce1f2d609263173653f4c98cbcbd70 Mon Sep 17 00:00:00 2001 From: M66B Date: Mon, 16 Nov 2020 16:03:36 +0100 Subject: [PATCH] Refactoring --- .../eu/faircode/email/AdapterMessage.java | 56 +++-------------- .../java/eu/faircode/email/TextHelper.java | 62 ++++++++++++++++++- 2 files changed, 69 insertions(+), 49 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/AdapterMessage.java b/app/src/main/java/eu/faircode/email/AdapterMessage.java index 4a5265f8bd..7597ed6733 100644 --- a/app/src/main/java/eu/faircode/email/AdapterMessage.java +++ b/app/src/main/java/eu/faircode/email/AdapterMessage.java @@ -27,7 +27,6 @@ import android.app.Dialog; import android.app.Notification; import android.app.NotificationChannel; import android.app.NotificationManager; -import android.app.Person; import android.app.RemoteAction; import android.content.ActivityNotFoundException; import android.content.ClipData; @@ -94,8 +93,6 @@ import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputMethodManager; import android.view.textclassifier.ConversationAction; import android.view.textclassifier.ConversationActions; -import android.view.textclassifier.TextClassificationManager; -import android.view.textclassifier.TextClassifier; import android.webkit.WebView; import android.widget.Button; import android.widget.CheckBox; @@ -160,20 +157,16 @@ import java.text.Collator; import java.text.DateFormat; import java.text.NumberFormat; import java.text.SimpleDateFormat; -import java.time.ZoneId; -import java.time.ZonedDateTime; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Date; import java.util.HashMap; -import java.util.HashSet; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Objects; import java.util.Properties; -import java.util.Set; import java.util.concurrent.Executor; import java.util.concurrent.ExecutorService; @@ -2415,48 +2408,17 @@ public class AdapterMessage extends RecyclerView.Adapter input = new ArrayList<>(); + List texts = new ArrayList<>(); if (!TextUtils.isEmpty(message.subject)) - input.add(new ConversationActions.Message.Builder(author) - .setReferenceTime(dt) - .setText(message.subject) - .build()); - input.add(new ConversationActions.Message.Builder(author) - .setReferenceTime(dt) - .setText(document.text()) - .build()); + texts.add(message.subject); + texts.add(document.text()); - Set excluded = new HashSet<>(Arrays.asList( - ConversationAction.TYPE_OPEN_URL, - ConversationAction.TYPE_SEND_EMAIL - )); - if (!conversation_actions_replies) - excluded.add(ConversationAction.TYPE_TEXT_REPLY); - TextClassifier.EntityConfig config = - new TextClassifier.EntityConfig.Builder() - .setExcludedTypes(excluded) - .build(); - - List hints = Collections.unmodifiableList(Arrays.asList( - ConversationActions.Request.HINT_FOR_IN_APP - )); - ConversationActions.Request crequest = - new ConversationActions.Request.Builder(input) - .setTypeConfig(config) - .setHints(hints) - .build(); - - return tcm.getTextClassifier().suggestConversationActions(crequest); + return TextHelper.getConversationActions( + context, + texts.toArray(new String[0]), + conversation_actions_replies, + isOutgoing(message), + message.received); } }.setCount(false).execute(context, owner, args, "message:body"); } diff --git a/app/src/main/java/eu/faircode/email/TextHelper.java b/app/src/main/java/eu/faircode/email/TextHelper.java index 14baa33fd0..199e89a07f 100644 --- a/app/src/main/java/eu/faircode/email/TextHelper.java +++ b/app/src/main/java/eu/faircode/email/TextHelper.java @@ -1,13 +1,25 @@ package eu.faircode.email; +import android.app.Person; import android.content.Context; import android.os.Build; import android.text.TextUtils; +import android.view.textclassifier.ConversationAction; +import android.view.textclassifier.ConversationActions; import android.view.textclassifier.TextClassificationManager; import android.view.textclassifier.TextClassifier; import android.view.textclassifier.TextLanguage; +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Date; +import java.util.HashSet; +import java.util.List; import java.util.Locale; +import java.util.Set; public class TextHelper { @@ -44,12 +56,58 @@ public class TextHelper { if (tcm == null) return null; - TextLanguage.Request trequest = new TextLanguage.Request.Builder(text).build(); + TextLanguage.Request request = new TextLanguage.Request.Builder(text).build(); TextClassifier tc = tcm.getTextClassifier(); - TextLanguage tlanguage = tc.detectLanguage(trequest); + TextLanguage tlanguage = tc.detectLanguage(request); if (tlanguage.getLocaleHypothesisCount() > 0) return tlanguage.getLocale(0).toLocale(); return null; } + + static ConversationActions getConversationActions( + Context context, String[] texts, boolean replies, boolean outgoing, long time) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) + return null; + + TextClassificationManager tcm = + (TextClassificationManager) context.getSystemService(Context.TEXT_CLASSIFICATION_SERVICE); + if (tcm == null) + return null; + + Person author = outgoing + ? ConversationActions.Message.PERSON_USER_SELF + : ConversationActions.Message.PERSON_USER_OTHERS; + ZonedDateTime dt = new Date(time) + .toInstant() + .atZone(ZoneId.systemDefault()); + List input = new ArrayList<>(); + for (String text : texts) + input.add(new ConversationActions.Message.Builder(author) + .setReferenceTime(dt) + .setText(text) + .build()); + + Set excluded = new HashSet<>(Arrays.asList( + ConversationAction.TYPE_OPEN_URL, + ConversationAction.TYPE_SEND_EMAIL + )); + if (!replies) + excluded.add(ConversationAction.TYPE_TEXT_REPLY); + TextClassifier.EntityConfig config = + new TextClassifier.EntityConfig.Builder() + .setExcludedTypes(excluded) + .build(); + + List hints = Collections.unmodifiableList(Arrays.asList( + ConversationActions.Request.HINT_FOR_IN_APP + )); + ConversationActions.Request request = + new ConversationActions.Request.Builder(input) + .setTypeConfig(config) + .setHints(hints) + .build(); + + return tcm.getTextClassifier().suggestConversationActions(request); + } }