From fd7661c1cb92fadb05f3723744f67d919ecea0e7 Mon Sep 17 00:00:00 2001 From: M66B Date: Tue, 27 Aug 2024 09:33:19 +0200 Subject: [PATCH] Added swipe to speech --- .../java/eu/faircode/email/EntityMessage.java | 3 ++ .../eu/faircode/email/FragmentAccount.java | 5 ++ .../eu/faircode/email/FragmentCompose.java | 2 +- .../eu/faircode/email/FragmentMessages.java | 52 +++++++++++++++++++ .../java/eu/faircode/email/FragmentPop.java | 5 ++ 5 files changed, 66 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/eu/faircode/email/EntityMessage.java b/app/src/main/java/eu/faircode/email/EntityMessage.java index 7ef9b676f7..dfd9f65feb 100644 --- a/app/src/main/java/eu/faircode/email/EntityMessage.java +++ b/app/src/main/java/eu/faircode/email/EntityMessage.java @@ -128,6 +128,7 @@ public class EntityMessage implements Serializable { static final Long SWIPE_ACTION_REPLY = -9L; static final Long SWIPE_ACTION_IMPORTANCE = -10L; static final Long SWIPE_ACTION_SUMMARIZE = -11L; + static final Long SWIPE_ACTION_TTS = -12L; private static final int MAX_SNOOZED = 300; @@ -777,6 +778,8 @@ public class EntityMessage implements Serializable { return "reply"; if (SWIPE_ACTION_SUMMARIZE.equals(type)) return "summarize"; + if (SWIPE_ACTION_TTS.equals(type)) + return "TTS"; return "???"; } diff --git a/app/src/main/java/eu/faircode/email/FragmentAccount.java b/app/src/main/java/eu/faircode/email/FragmentAccount.java index 3228982792..c69a6472b8 100644 --- a/app/src/main/java/eu/faircode/email/FragmentAccount.java +++ b/app/src/main/java/eu/faircode/email/FragmentAccount.java @@ -2227,6 +2227,11 @@ public class FragmentAccount extends FragmentBase { importance.name = context.getString(R.string.title_set_importance); folders.add(importance); + EntityFolder tts = new EntityFolder(); + tts.id = EntityMessage.SWIPE_ACTION_TTS; + tts.name = context.getString(R.string.title_rule_tts); + folders.add(tts); + if (AI.isAvailable(context)) { EntityFolder summarize = new EntityFolder(); summarize.id = EntityMessage.SWIPE_ACTION_SUMMARIZE; diff --git a/app/src/main/java/eu/faircode/email/FragmentCompose.java b/app/src/main/java/eu/faircode/email/FragmentCompose.java index 8e651bfae2..93dc265513 100644 --- a/app/src/main/java/eu/faircode/email/FragmentCompose.java +++ b/app/src/main/java/eu/faircode/email/FragmentCompose.java @@ -3673,7 +3673,7 @@ public class FragmentCompose extends FragmentBase { Context context = getContext(); PackageManager pm = context.getPackageManager(); if (photo) { - // https://developer.android.com/training/camera/photobasics + // https://developer.android.com/reference/android/provider/MediaStore#ACTION_IMAGE_CAPTURE Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); if (intent.resolveActivity(pm) == null) { // action whitelisted Snackbar snackbar = Helper.setSnackbarOptions( diff --git a/app/src/main/java/eu/faircode/email/FragmentMessages.java b/app/src/main/java/eu/faircode/email/FragmentMessages.java index 2e259fa809..bfbf850318 100644 --- a/app/src/main/java/eu/faircode/email/FragmentMessages.java +++ b/app/src/main/java/eu/faircode/email/FragmentMessages.java @@ -3174,6 +3174,8 @@ public class FragmentMessages extends FragmentBase ? R.drawable.twotone_visibility_24 : R.drawable.twotone_timer_off_24)); else if (EntityMessage.SWIPE_ACTION_MOVE.equals(action)) icon = R.drawable.twotone_folder_24; + else if (EntityMessage.SWIPE_ACTION_TTS.equals(action)) + icon = R.drawable.twotone_play_arrow_24; else if (EntityMessage.SWIPE_ACTION_SUMMARIZE.equals(action)) icon = R.drawable.twotone_smart_toy_24; else if (EntityMessage.SWIPE_ACTION_JUNK.equals(action)) @@ -3333,6 +3335,9 @@ public class FragmentMessages extends FragmentBase else if (EntityMessage.SWIPE_ACTION_MOVE.equals(action)) { redraw(viewHolder); onSwipeMove(message); + } else if (EntityMessage.SWIPE_ACTION_TTS.equals(action)) { + redraw(viewHolder); + onSwipeTTS(message); } else if (EntityMessage.SWIPE_ACTION_SUMMARIZE.equals(action)) { redraw(viewHolder); onSwipeSummarize(message); @@ -3629,6 +3634,53 @@ public class FragmentMessages extends FragmentBase fragment.show(getParentFragmentManager(), "swipe:move"); } + private void onSwipeTTS(final @NonNull TupleMessageEx message) { + Bundle args = new Bundle(); + args.putLong("id", message.id); + + new SimpleTask() { + @Override + protected String onExecute(Context context, Bundle args) throws Throwable { + long id = args.getLong("id"); + + DB db = DB.getInstance(context); + EntityMessage message = db.message().getMessage(id); + if (message == null) + return null; + + StringBuilder sb = new StringBuilder(); + + if (message.from != null && message.from.length > 0) + sb.append(context.getString(R.string.title_rule_tts_from)) + .append(' ').append(MessageHelper.formatAddressesShort(message.from)).append(". "); + + if (!TextUtils.isEmpty(message.subject)) + sb.append(context.getString(R.string.title_rule_tts_subject)) + .append(' ').append(message.subject).append(". "); + + String body = Helper.readText(message.getFile(context)); + String text = HtmlHelper.getFullText(context, body); + + if (!TextUtils.isEmpty(text)) + sb.append(context.getString(R.string.title_rule_tts_content)) + .append(' ').append(text); + + return sb.toString(); + } + + @Override + protected void onExecuted(Bundle args, String text) { + if (text != null) + TTSHelper.speak(getContext(), "tts:" + message.id, text, message.language); + } + + @Override + protected void onException(Bundle args, Throwable ex) { + Log.unexpectedError(getParentFragmentManager(), ex); + } + }.execute(FragmentMessages.this, args, "tts"); + } + private void onSwipeSummarize(final @NonNull TupleMessageEx message) { final Context context = getContext(); if (AI.isAvailable(context)) diff --git a/app/src/main/java/eu/faircode/email/FragmentPop.java b/app/src/main/java/eu/faircode/email/FragmentPop.java index fee85e89dd..3341089a03 100644 --- a/app/src/main/java/eu/faircode/email/FragmentPop.java +++ b/app/src/main/java/eu/faircode/email/FragmentPop.java @@ -1201,6 +1201,11 @@ public class FragmentPop extends FragmentBase { importance.name = getString(R.string.title_set_importance); folders.add(importance); + EntityFolder tts = new EntityFolder(); + tts.id = EntityMessage.SWIPE_ACTION_TTS; + tts.name = context.getString(R.string.title_rule_tts); + folders.add(tts); + if (AI.isAvailable(context)) { EntityFolder summarize = new EntityFolder(); summarize.id = EntityMessage.SWIPE_ACTION_SUMMARIZE;