From 879d348c3a5e4479f9d6754842f836bc2ef6bb35 Mon Sep 17 00:00:00 2001 From: M66B Date: Sun, 30 Jun 2019 21:43:48 +0200 Subject: [PATCH] Use dialog fragment to print --- .../java/eu/faircode/email/ActivityView.java | 128 ------------- .../eu/faircode/email/AdapterMessage.java | 43 ++--- .../faircode/email/FragmentDialogFolder.java | 2 - .../eu/faircode/email/FragmentFolders.java | 8 +- .../eu/faircode/email/FragmentMessages.java | 170 +++++++++++++++--- 5 files changed, 171 insertions(+), 180 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/ActivityView.java b/app/src/main/java/eu/faircode/email/ActivityView.java index 32e3a51f4e..702e71b3e2 100644 --- a/app/src/main/java/eu/faircode/email/ActivityView.java +++ b/app/src/main/java/eu/faircode/email/ActivityView.java @@ -35,16 +35,9 @@ import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Bundle; import android.os.Handler; -import android.print.PrintAttributes; -import android.print.PrintDocumentAdapter; -import android.print.PrintManager; -import android.text.TextUtils; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; -import android.webkit.WebSettings; -import android.webkit.WebView; -import android.webkit.WebViewClient; import android.widget.ImageView; import android.widget.ScrollView; import android.widget.Toast; @@ -70,9 +63,6 @@ import androidx.recyclerview.widget.RecyclerView; import org.json.JSONArray; import org.json.JSONObject; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.nodes.Element; import java.io.BufferedReader; import java.io.File; @@ -81,8 +71,6 @@ import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.URL; -import java.text.DateFormat; -import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; @@ -105,8 +93,6 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB private boolean exit = false; - private WebView printWebView = null; - static final int REQUEST_UNIFIED = 1; static final int REQUEST_WHY = 2; static final int REQUEST_THREAD = 3; @@ -123,7 +109,6 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB static final String ACTION_EDIT_ANSWER = BuildConfig.APPLICATION_ID + ".EDIT_ANSWER"; static final String ACTION_EDIT_RULES = BuildConfig.APPLICATION_ID + ".EDIT_RULES"; static final String ACTION_EDIT_RULE = BuildConfig.APPLICATION_ID + ".EDIT_RULE"; - static final String ACTION_PRINT = BuildConfig.APPLICATION_ID + ".PRINT"; static final String ACTION_SHOW_PRO = BuildConfig.APPLICATION_ID + ".SHOW_PRO"; static final long UPDATE_INTERVAL = (BuildConfig.BETA_RELEASE ? 4 : 12) * 3600 * 1000L; // milliseconds @@ -507,7 +492,6 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB iff.addAction(ACTION_EDIT_ANSWER); iff.addAction(ACTION_EDIT_RULES); iff.addAction(ACTION_EDIT_RULE); - iff.addAction(ACTION_PRINT); iff.addAction(ACTION_SHOW_PRO); lbm.registerReceiver(receiver, iff); @@ -931,8 +915,6 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB onEditRules(intent); else if (ACTION_EDIT_RULE.equals(action)) onEditRule(intent); - else if (ACTION_PRINT.equals(action)) - onPrint(intent); else if (ACTION_SHOW_PRO.equals(action)) onShowPro(intent); } @@ -1035,116 +1017,6 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB fragmentTransaction.commit(); } - private void onPrint(Intent intent) { - long id = intent.getLongExtra("id", -1); - - Bundle args = new Bundle(); - args.putLong("id", id); - - new SimpleTask() { - @Override - protected String[] onExecute(Context context, Bundle args) throws IOException { - long id = args.getLong("id"); - - DB db = DB.getInstance(context); - EntityMessage message = db.message().getMessage(id); - if (message == null || !message.content) - return null; - - File file = message.getFile(context); - if (!file.exists()) - return null; - - String html = Helper.readText(file); - html = HtmlHelper.getHtmlEmbedded(context, id, html); - - Document document = Jsoup.parse(html); - Element body = document.body(); - if (body != null) { - Element p = document.createElement("p"); - - if (message.from != null && message.from.length > 0) { - Element span = document.createElement("span"); - span.text(getString(R.string.title_from) + " " + MessageHelper.formatAddresses(message.from)); - p.append(span.html() + "
"); - } - - if (message.to != null && message.to.length > 0) { - Element span = document.createElement("span"); - span.text(getString(R.string.title_to) + " " + MessageHelper.formatAddresses(message.to)); - p.append(span.html() + "
"); - } - - if (message.cc != null && message.cc.length > 0) { - Element span = document.createElement("span"); - span.text(getString(R.string.title_cc) + " " + MessageHelper.formatAddresses(message.cc)); - p.append(span.html() + "
"); - } - - { - Element span = document.createElement("span"); - DateFormat DTF = SimpleDateFormat.getDateTimeInstance(SimpleDateFormat.LONG, SimpleDateFormat.LONG); - span.text(getString(R.string.title_received) + " " + DTF.format(message.received)); - p.append(span.html() + "
"); - } - - if (!TextUtils.isEmpty(message.subject)) { - Element span = document.createElement("span"); - span.text(message.subject); - p.append(span.html() + "
"); - } - - p.append("

"); - - body.prepend(p.html()); - } - - return new String[]{message.subject, document.html()}; - } - - @Override - protected void onExecuted(Bundle args, final String[] data) { - if (data == null) - return; - - // https://developer.android.com/training/printing/html-docs.html - printWebView = new WebView(ActivityView.this); - WebSettings settings = printWebView.getSettings(); - settings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); - settings.setAllowFileAccess(false); - - printWebView.setWebViewClient(new WebViewClient() { - public boolean shouldOverrideUrlLoading(WebView view, String url) { - return false; - } - - @Override - public void onPageFinished(WebView view, String url) { - try { - PrintManager printManager = (PrintManager) getOriginalContext().getSystemService(Context.PRINT_SERVICE); - String jobName = getString(R.string.app_name); - if (!TextUtils.isEmpty(data[0])) - jobName += " - " + data[0]; - PrintDocumentAdapter adapter = printWebView.createPrintDocumentAdapter(jobName); - printManager.print(jobName, adapter, new PrintAttributes.Builder().build()); - } catch (Throwable ex) { - Log.e(ex); - } finally { - printWebView = null; - } - } - }); - - printWebView.loadDataWithBaseURL("about:blank", data[1], "text/html", "UTF-8", null); - } - - @Override - protected void onException(Bundle args, Throwable ex) { - Helper.unexpectedError(ActivityView.this, ActivityView.this, ex); - } - }.execute(ActivityView.this, args, "message:print"); - } - private void onShowPro(Intent intent) { if (getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.RESUMED)) getSupportFragmentManager().popBackStack("pro", FragmentManager.POP_BACK_STACK_INCLUSIVE); diff --git a/app/src/main/java/eu/faircode/email/AdapterMessage.java b/app/src/main/java/eu/faircode/email/AdapterMessage.java index 0a1c0063f1..50d3893a53 100644 --- a/app/src/main/java/eu/faircode/email/AdapterMessage.java +++ b/app/src/main/java/eu/faircode/email/AdapterMessage.java @@ -142,6 +142,8 @@ import biweekly.property.Organizer; import biweekly.property.Summary; import biweekly.util.ICalDate; +import static android.app.Activity.RESULT_OK; + public class AdapterMessage extends RecyclerView.Adapter { private Context context; private LayoutInflater inflater; @@ -2636,37 +2638,26 @@ public class AdapterMessage extends RecyclerView.Adapter disabled) { @@ -1904,7 +1917,7 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences. protected void onException(Bundle args, Throwable ex) { Helper.unexpectedError(getContext(), getViewLifecycleOwner(), ex); } - }.execute(FragmentMessages.this, args, "messages:move"); + }.execute(this, args, "messages:move"); } @Override @@ -2293,7 +2306,7 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences. protected void onException(Bundle args, Throwable ex) { Helper.unexpectedError(getContext(), getViewLifecycleOwner(), ex); } - }.execute(getContext(), getViewLifecycleOwner(), args, "messages:accounts"); + }.execute(FragmentMessages.this, args, "messages:accounts"); return true; } }); @@ -2628,7 +2641,7 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences. protected void onException(Bundle args, Throwable ex) { Helper.unexpectedError(getContext(), getViewLifecycleOwner(), ex); } - }.execute(getContext(), getViewLifecycleOwner(), new Bundle(), "search:reset"); + }.execute(this, new Bundle(), "search:reset"); } else loadMessagesNext(top); } @@ -2896,7 +2909,7 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences. protected void onException(Bundle args, Throwable ex) { Helper.unexpectedError(getContext(), getViewLifecycleOwner(), ex); } - }.execute(FragmentMessages.this, args, "messages:navigation"); + }.execute(this, args, "messages:navigation"); } return false; } @@ -3067,7 +3080,7 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences. else Helper.unexpectedError(getContext(), getViewLifecycleOwner(), ex); } - }.execute(FragmentMessages.this, args, "messages:move"); + }.execute(this, args, "messages:move"); } private void moveUndo(final ArrayList result) { @@ -3362,6 +3375,12 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences. onActionMoveSelection(args.getLong("folder")); } break; + case REQUEST_PRINT: + if (resultCode == RESULT_OK && data != null) { + Bundle args = data.getBundleExtra("args"); + onPrint(args.getLong("id")); + } + break; case REQUEST_SEARCH: if (resultCode == RESULT_OK && data != null) { Bundle args = data.getBundleExtra("args"); @@ -3771,7 +3790,7 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences. else Helper.unexpectedError(getContext(), getViewLifecycleOwner(), ex); } - }.execute(FragmentMessages.this, args, "decrypt"); + }.execute(this, args, "decrypt"); } private void onDelete(long id) { @@ -3820,7 +3839,7 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences. protected void onException(Bundle args, Throwable ex) { Helper.unexpectedError(getContext(), getViewLifecycleOwner(), ex); } - }.execute(FragmentMessages.this, args, "message:delete"); + }.execute(this, args, "message:delete"); } private void onDelete(long[] ids) { @@ -3856,7 +3875,7 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences. protected void onException(Bundle args, Throwable ex) { Helper.unexpectedError(getContext(), getViewLifecycleOwner(), ex); } - }.execute(FragmentMessages.this, args, "messages:delete:execute"); + }.execute(this, args, "messages:delete:execute"); } private void onJunk(long id) { @@ -3891,7 +3910,7 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences. protected void onException(Bundle args, Throwable ex) { Helper.unexpectedError(getContext(), getViewLifecycleOwner(), ex); } - }.execute(getContext(), getViewLifecycleOwner(), args, "message:junk"); + }.execute(this, args, "message:junk"); } private void onMoveAskAcross(final ArrayList result) { @@ -3950,7 +3969,7 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences. protected void onException(Bundle args, Throwable ex) { Helper.unexpectedError(getContext(), getViewLifecycleOwner(), ex); } - }.execute(getContext(), getViewLifecycleOwner(), args, "message:color"); + }.execute(this, args, "message:color"); } private void onSnooze(Bundle args) { @@ -4004,7 +4023,7 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences. protected void onException(Bundle args, Throwable ex) { Helper.unexpectedError(getContext(), getViewLifecycleOwner(), ex); } - }.execute(getContext(), getViewLifecycleOwner(), args, "message:snooze"); + }.execute(this, args, "message:snooze"); } private void onSnoozeSelection(Bundle args) { @@ -4058,7 +4077,7 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences. protected void onException(Bundle args, Throwable ex) { Helper.unexpectedError(getContext(), getViewLifecycleOwner(), ex); } - }.execute(FragmentMessages.this, args, "messages:snooze"); + }.execute(this, args, "messages:snooze"); } private void onMove(Bundle args) { @@ -4094,7 +4113,118 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences. protected void onException(Bundle args, Throwable ex) { Helper.unexpectedError(getContext(), getViewLifecycleOwner(), ex); } - }.execute(getContext(), getViewLifecycleOwner(), args, "message:copy"); + }.execute(this, args, "message:copy"); + } + + private WebView printWebView = null; + + private void onPrint(long id) { + Bundle args = new Bundle(); + args.putLong("id", id); + + new SimpleTask() { + @Override + protected String[] onExecute(Context context, Bundle args) throws IOException { + long id = args.getLong("id"); + + DB db = DB.getInstance(context); + EntityMessage message = db.message().getMessage(id); + if (message == null || !message.content) + return null; + + File file = message.getFile(context); + if (!file.exists()) + return null; + + String html = Helper.readText(file); + html = HtmlHelper.getHtmlEmbedded(context, id, html); + + Document document = Jsoup.parse(html); + Element body = document.body(); + if (body != null) { + Element p = document.createElement("p"); + + if (message.from != null && message.from.length > 0) { + Element span = document.createElement("span"); + span.text(getString(R.string.title_from) + " " + MessageHelper.formatAddresses(message.from)); + p.append(span.html() + "
"); + } + + if (message.to != null && message.to.length > 0) { + Element span = document.createElement("span"); + span.text(getString(R.string.title_to) + " " + MessageHelper.formatAddresses(message.to)); + p.append(span.html() + "
"); + } + + if (message.cc != null && message.cc.length > 0) { + Element span = document.createElement("span"); + span.text(getString(R.string.title_cc) + " " + MessageHelper.formatAddresses(message.cc)); + p.append(span.html() + "
"); + } + + { + Element span = document.createElement("span"); + DateFormat DTF = SimpleDateFormat.getDateTimeInstance(SimpleDateFormat.LONG, SimpleDateFormat.LONG); + span.text(getString(R.string.title_received) + " " + DTF.format(message.received)); + p.append(span.html() + "
"); + } + + if (!TextUtils.isEmpty(message.subject)) { + Element span = document.createElement("span"); + span.text(message.subject); + p.append(span.html() + "
"); + } + + p.append("

"); + + body.prepend(p.html()); + } + + return new String[]{message.subject, document.html()}; + } + + @Override + protected void onExecuted(Bundle args, final String[] data) { + if (data == null) + return; + + // https://developer.android.com/training/printing/html-docs.html + printWebView = new WebView(getContext()); + WebSettings settings = printWebView.getSettings(); + settings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); + settings.setAllowFileAccess(false); + + printWebView.setWebViewClient(new WebViewClient() { + public boolean shouldOverrideUrlLoading(WebView view, String url) { + return false; + } + + @Override + public void onPageFinished(WebView view, String url) { + try { + ActivityBase activity = (ActivityBase) getActivity(); + PrintManager printManager = (PrintManager) activity.getOriginalContext().getSystemService(Context.PRINT_SERVICE); + String jobName = getString(R.string.app_name); + if (!TextUtils.isEmpty(data[0])) + jobName += " - " + data[0]; + PrintDocumentAdapter adapter = printWebView.createPrintDocumentAdapter(jobName); + printManager.print(jobName, adapter, new PrintAttributes.Builder().build()); + } catch (Throwable ex) { + Log.e(ex); + } finally { + printWebView = null; + } + } + }); + + printWebView.loadDataWithBaseURL("about:blank", data[1], "text/html", "UTF-8", null); + } + + @Override + protected void onException(Bundle args, Throwable ex) { + Helper.unexpectedError(getContext(), getViewLifecycleOwner(), ex); + } + }.execute(this, args, "message:print"); } static void search(