Inline language recognition

pull/177/head
M66B 6 years ago
parent cb3629b880
commit 1c437a52f5

@ -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()));

@ -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);

@ -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);

@ -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);

@ -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);

@ -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)

@ -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);

@ -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);

@ -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 = "<p>" + text.replaceAll("\\r?\\n", "<br>") + "</p>";
String body = results.getString("text");
if (body != null)
body = "<p>" + body.replaceAll("\\r?\\n", "<br>") + "</p>";
DB db = DB.getInstance(this);
try {
@ -281,12 +281,13 @@ public class ServiceUI extends IntentService {
reply.id = db.message().insertMessage(reply);
File file = reply.getFile(this);
Helper.writeText(file, text);
Helper.writeText(file, body);
db.message().setMessageContent(reply.id,
true,
HtmlHelper.getLanguage(this, body),
plain_only || ref.plain_only,
HtmlHelper.getPreview(file),
HtmlHelper.getPreview(body),
null);
EntityOperation.queue(this, reply, EntityOperation.SEND);

@ -82,7 +82,7 @@ public class WorkerCleanup extends Worker {
File file = message.getFile(context);
if (!file.exists()) {
Log.w("Message file missing id=" + mid);
db.message().setMessageContent(mid, false);
db.message().resetMessageContent(mid);
}
}
}

@ -22,12 +22,8 @@ package eu.faircode.email;
import android.content.Context;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.os.Build;
import android.view.textclassifier.TextClassificationManager;
import android.view.textclassifier.TextLanguage;
import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
import androidx.preference.PreferenceManager;
import androidx.work.ExistingWorkPolicy;
import androidx.work.OneTimeWorkRequest;
@ -82,10 +78,6 @@ public class WorkerFts extends Worker {
File file = message.getFile(getApplicationContext());
String text = HtmlHelper.getFullText(file);
if (BuildConfig.DEBUG &&
Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)
db.message().setMessageLanguage(message.id, getLanguage(text));
try {
sdb.beginTransaction();
FtsDbHelper.insert(sdb, message, text);
@ -117,21 +109,6 @@ public class WorkerFts extends Worker {
}
}
@RequiresApi(api = Build.VERSION_CODES.Q)
private String getLanguage(String text) {
TextClassificationManager tcm = (TextClassificationManager) getApplicationContext()
.getSystemService(Context.TEXT_CLASSIFICATION_SERVICE);
if (tcm == 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;
}
private void markIndexed(DB db, List<Long> ids) {
try {
db.beginTransaction();

Loading…
Cancel
Save