diff --git a/app/src/main/java/eu/faircode/email/Core.java b/app/src/main/java/eu/faircode/email/Core.java index 4ca0d822da..7e791a0a31 100644 --- a/app/src/main/java/eu/faircode/email/Core.java +++ b/app/src/main/java/eu/faircode/email/Core.java @@ -1136,8 +1136,9 @@ class Core { Helper.writeText(file, body); db.message().setMessageContent(message.id, true, + HtmlHelper.getLanguage(context, body), parts.isPlainOnly(), - HtmlHelper.getPreview(file), + HtmlHelper.getPreview(body), parts.getWarnings(message.warning)); } @@ -1610,8 +1611,9 @@ class Core { Helper.writeText(file, body); db.message().setMessageContent(message.id, true, + HtmlHelper.getLanguage(context, body), parts.isPlainOnly(), - HtmlHelper.getPreview(file), + HtmlHelper.getPreview(body), parts.getWarnings(message.warning)); for (EntityAttachment attachment : parts.getAttachments()) @@ -2349,8 +2351,9 @@ class Core { Helper.writeText(file, body); db.message().setMessageContent(message.id, true, + HtmlHelper.getLanguage(context, body), parts.isPlainOnly(), - HtmlHelper.getPreview(file), + HtmlHelper.getPreview(body), parts.getWarnings(message.warning)); Log.i(folder.name + " inline downloaded message id=" + message.id + " size=" + message.size + "/" + (body == null ? null : body.length())); @@ -2683,8 +2686,9 @@ class Core { Helper.writeText(file, body); db.message().setMessageContent(message.id, true, + HtmlHelper.getLanguage(context, body), parts.isPlainOnly(), - HtmlHelper.getPreview(file), + HtmlHelper.getPreview(body), parts.getWarnings(message.warning)); Log.i(folder.name + " downloaded message id=" + message.id + " size=" + message.size + "/" + (body == null ? null : body.length())); diff --git a/app/src/main/java/eu/faircode/email/DaoMessage.java b/app/src/main/java/eu/faircode/email/DaoMessage.java index fbd04eda42..fe610473cb 100644 --- a/app/src/main/java/eu/faircode/email/DaoMessage.java +++ b/app/src/main/java/eu/faircode/email/DaoMessage.java @@ -538,18 +538,20 @@ public interface DaoMessage { @Query("UPDATE message SET revisions = :revisions WHERE id = :id") int setMessageRevisions(long id, Integer revisions); - @Query("UPDATE message SET language = :language WHERE id = :id") - int setMessageLanguage(long id, String language); - @Query("UPDATE message" + - " SET content = :content, fts = 0, preview = CASE WHEN :content THEN preview ELSE NULL END" + + " SET content = 0, fts = 0, language = NULL, plain_only = NULL, preview = NULL" + " WHERE id = :id") - int setMessageContent(long id, boolean content); + int resetMessageContent(long id); @Query("UPDATE message" + - " SET content = :content, fts = 0, plain_only = :plain_only, preview = :preview, warning = :warning" + + " SET content = :content" + + ", fts = 0" + + ", language = :language" + + ", plain_only = :plain_only" + + ", preview = :preview" + + ", warning = :warning" + " WHERE id = :id") - int setMessageContent(long id, boolean content, Boolean plain_only, String preview, String warning); + int setMessageContent(long id, boolean content, String language, Boolean plain_only, String preview, String warning); @Query("UPDATE message SET size = :size, total = :total WHERE id = :id") int setMessageSize(long id, Long size, Long total); diff --git a/app/src/main/java/eu/faircode/email/EntityOperation.java b/app/src/main/java/eu/faircode/email/EntityOperation.java index a6c7fdf635..9effa6dace 100644 --- a/app/src/main/java/eu/faircode/email/EntityOperation.java +++ b/app/src/main/java/eu/faircode/email/EntityOperation.java @@ -294,8 +294,7 @@ public class EntityOperation { Helper.copy(msource, mtarget); } catch (IOException ex) { Log.e(ex); - db.message().setMessageContent(tmpid, false, null, null, null); - db.message().setMessageSize(message.id, null, null); + db.message().resetMessageContent(tmpid); } EntityAttachment.copy(context, message.id, tmpid); diff --git a/app/src/main/java/eu/faircode/email/EntityRule.java b/app/src/main/java/eu/faircode/email/EntityRule.java index dd22e4439d..ded6458e7f 100644 --- a/app/src/main/java/eu/faircode/email/EntityRule.java +++ b/app/src/main/java/eu/faircode/email/EntityRule.java @@ -422,8 +422,9 @@ public class EntityRule { Helper.writeText(file, body); db.message().setMessageContent(reply.id, true, + HtmlHelper.getLanguage(context, body), false, - HtmlHelper.getPreview(file), + HtmlHelper.getPreview(body), null); EntityOperation.queue(context, reply, EntityOperation.SEND); diff --git a/app/src/main/java/eu/faircode/email/FragmentCompose.java b/app/src/main/java/eu/faircode/email/FragmentCompose.java index d0ddfeaa12..28cc32c5d1 100644 --- a/app/src/main/java/eu/faircode/email/FragmentCompose.java +++ b/app/src/main/java/eu/faircode/email/FragmentCompose.java @@ -3288,6 +3288,7 @@ public class FragmentCompose extends FragmentBase { db.message().setMessageContent(data.draft.id, true, + HtmlHelper.getLanguage(context, html), data.draft.plain_only, HtmlHelper.getPreview(html), null); @@ -3408,6 +3409,7 @@ public class FragmentCompose extends FragmentBase { db.message().setMessageContent(data.draft.id, true, + HtmlHelper.getLanguage(context, html), data.draft.plain_only, HtmlHelper.getPreview(html), null); @@ -3849,6 +3851,7 @@ public class FragmentCompose extends FragmentBase { db.message().setMessageContent(draft.id, true, + HtmlHelper.getLanguage(context, body), draft.plain_only, // unchanged HtmlHelper.getPreview(body), null); diff --git a/app/src/main/java/eu/faircode/email/HtmlHelper.java b/app/src/main/java/eu/faircode/email/HtmlHelper.java index f3a9e94f36..125b2aeb91 100644 --- a/app/src/main/java/eu/faircode/email/HtmlHelper.java +++ b/app/src/main/java/eu/faircode/email/HtmlHelper.java @@ -33,6 +33,8 @@ import android.text.Spanned; import android.text.TextUtils; import android.text.style.ForegroundColorSpan; import android.util.Base64; +import android.view.textclassifier.TextClassificationManager; +import android.view.textclassifier.TextLanguage; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -1103,17 +1105,36 @@ public class HtmlHelper { Log.i(document.head().html()); } - static String getPreview(File file) throws IOException { + static String getLanguage(Context context, String body) { try { - Document d = JsoupEx.parse(file); - return _getText(d, false); - } catch (OutOfMemoryError ex) { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + boolean conversation_actions = prefs.getBoolean("conversation_actions", true); + if (!conversation_actions) + return null; + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + TextClassificationManager tcm = + (TextClassificationManager) context.getSystemService(Context.TEXT_CLASSIFICATION_SERVICE); + if (tcm == null) + return null; + + String text = getPreview(body); + if (body == null) + return null; + + TextLanguage.Request trequest = new TextLanguage.Request.Builder(text).build(); + TextLanguage tlanguage = tcm.getTextClassifier().detectLanguage(trequest); + if (tlanguage.getLocaleHypothesisCount() > 0) + return tlanguage.getLocale(0).toLocale().getLanguage(); + } + + return null; + } catch (Throwable ex) { Log.e(ex); return null; } } - @Deprecated static String getPreview(String body) { try { if (body == null) diff --git a/app/src/main/java/eu/faircode/email/Log.java b/app/src/main/java/eu/faircode/email/Log.java index 71893eb565..ece8ef867e 100644 --- a/app/src/main/java/eu/faircode/email/Log.java +++ b/app/src/main/java/eu/faircode/email/Log.java @@ -820,8 +820,9 @@ public class Log { Helper.writeText(file, body); db.message().setMessageContent(draft.id, true, + HtmlHelper.getLanguage(context, body), false, - HtmlHelper.getPreview(file), + HtmlHelper.getPreview(body), null); attachSettings(context, draft.id, 1); diff --git a/app/src/main/java/eu/faircode/email/ServiceSend.java b/app/src/main/java/eu/faircode/email/ServiceSend.java index 09a4b9bd07..ae20177e6e 100644 --- a/app/src/main/java/eu/faircode/email/ServiceSend.java +++ b/app/src/main/java/eu/faircode/email/ServiceSend.java @@ -411,8 +411,9 @@ public class ServiceSend extends ServiceBase { Helper.writeText(file, body); db.message().setMessageContent(message.id, true, + HtmlHelper.getLanguage(this, body), parts.isPlainOnly(), - HtmlHelper.getPreview(file), + HtmlHelper.getPreview(body), parts.getWarnings(message.warning)); EntityAttachment.copy(this, id, message.id); diff --git a/app/src/main/java/eu/faircode/email/ServiceUI.java b/app/src/main/java/eu/faircode/email/ServiceUI.java index 17aa7ba88a..ddc07a73da 100644 --- a/app/src/main/java/eu/faircode/email/ServiceUI.java +++ b/app/src/main/java/eu/faircode/email/ServiceUI.java @@ -239,9 +239,9 @@ public class ServiceUI extends IntentService { boolean plain_only = prefs.getBoolean("plain_only", false); Bundle results = RemoteInput.getResultsFromIntent(intent); - String text = results.getString("text"); - if (text != null) - text = "
" + text.replaceAll("\\r?\\n", "
") + "
" + body.replaceAll("\\r?\\n", "
") + "