From 33b5ba8d8838f4b786ab2b82b3bf9d1d59c0d8c2 Mon Sep 17 00:00:00 2001 From: M66B Date: Mon, 17 Aug 2020 19:14:15 +0200 Subject: [PATCH 01/12] Updated FAQ --- FAQ.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FAQ.md b/FAQ.md index 9dfd806a4f..abdec33b78 100644 --- a/FAQ.md +++ b/FAQ.md @@ -1004,7 +1004,7 @@ Possible causes are: * A firewall or router is blocking connections to the server * The host name or port number is invalid * The are problems with the internet connection -* The email server is refusing to accept connections +* The email server is refusing to accept (external) connections * The email server is refusing to accept a message, for example because it is too large or contains unacceptable links * There are too many connections to the server, see also the next question From d51505b717c6ae76aef3b07a7d632a9eb0e2efcc Mon Sep 17 00:00:00 2001 From: M66B Date: Mon, 17 Aug 2020 19:14:22 +0200 Subject: [PATCH 02/12] Prevent quick poll --- app/src/main/java/eu/faircode/email/ServiceUI.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/java/eu/faircode/email/ServiceUI.java b/app/src/main/java/eu/faircode/email/ServiceUI.java index d98b8b1fd9..33a2ae0c85 100644 --- a/app/src/main/java/eu/faircode/email/ServiceUI.java +++ b/app/src/main/java/eu/faircode/email/ServiceUI.java @@ -579,6 +579,8 @@ public class ServiceUI extends IntentService { long now = new Date().getTime(); long interval = pollInterval * 60 * 1000L; long next = now + interval - now % interval + 30 * 1000L; + if (next < now + interval / 5) + next += interval; EntityLog.log(context, "Poll next=" + new Date(next)); From 6916b279f108bbfa6d39465303e0c0985106d324 Mon Sep 17 00:00:00 2001 From: M66B Date: Mon, 17 Aug 2020 19:42:39 +0200 Subject: [PATCH 03/12] Prevent crash --- app/src/main/java/eu/faircode/email/EntityMessage.java | 3 ++- 1 file changed, 2 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 9ee52335a4..ff6b1fa61e 100644 --- a/app/src/main/java/eu/faircode/email/EntityMessage.java +++ b/app/src/main/java/eu/faircode/email/EntityMessage.java @@ -298,7 +298,8 @@ public class EntityMessage implements Serializable { Element strong = document.createElement("strong"); strong.text(Helper.getString(context, l, R.string.title_received) + " "); p.appendChild(strong); - p.appendText(DF.format(received)); + if (received != null) // embedded messages + p.appendText(DF.format(received)); p.appendElement("br"); } { From 49dba1b9b29664828200d24d4995aceafaa7e279 Mon Sep 17 00:00:00 2001 From: M66B Date: Tue, 18 Aug 2020 08:20:23 +0200 Subject: [PATCH 04/12] Try original exception after retrying with username --- .../eu/faircode/email/FragmentQuickSetup.java | 26 +++++++++++-------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/FragmentQuickSetup.java b/app/src/main/java/eu/faircode/email/FragmentQuickSetup.java index 6aee3fa46a..30f770a6aa 100644 --- a/app/src/main/java/eu/faircode/email/FragmentQuickSetup.java +++ b/app/src/main/java/eu/faircode/email/FragmentQuickSetup.java @@ -318,18 +318,22 @@ public class FragmentQuickSetup extends FragmentBase { throw ex; } catch (Throwable ex) { // Why not AuthenticationFailedException? - // Some providers refuse connection with an invalid username - if (!user.equals(username)) { - Log.w(ex); - user = username; - Log.i("Retry with user=" + user); - iservice.connect( - provider.imap.host, provider.imap.port, - EmailService.AUTH_TYPE_PASSWORD, null, - user, password, - null, null); - } else + // Some providers terminate the connection with an invalid username + if (user.equals(username)) throw ex; + else + try { + user = username; + Log.i("Retry with user=" + user); + iservice.connect( + provider.imap.host, provider.imap.port, + EmailService.AUTH_TYPE_PASSWORD, null, + user, password, + null, null); + } catch (Throwable ex1) { + Log.w(ex1); + throw ex; + } } folders = iservice.getFolders(); From e3ea98e43a7045aa9aa2fdae2c74a8927f85cbe1 Mon Sep 17 00:00:00 2001 From: M66B Date: Tue, 18 Aug 2020 17:25:19 +0200 Subject: [PATCH 05/12] GPLv3 license --- .../main/java/eu/faircode/email/FragmentAbout.java | 10 ++++++++++ .../main/java/eu/faircode/email/FragmentEula.java | 12 ++++++++++++ app/src/main/java/eu/faircode/email/Helper.java | 1 + app/src/main/res/layout/include_eula.xml | 3 ++- 4 files changed, 25 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/eu/faircode/email/FragmentAbout.java b/app/src/main/java/eu/faircode/email/FragmentAbout.java index 7fd67f0ac6..3d226e25d1 100644 --- a/app/src/main/java/eu/faircode/email/FragmentAbout.java +++ b/app/src/main/java/eu/faircode/email/FragmentAbout.java @@ -19,6 +19,7 @@ package eu.faircode.email; Copyright 2018-2020 by Marcel Bokhorst (M66B) */ +import android.graphics.Paint; import android.net.Uri; import android.os.Bundle; import android.text.TextUtils; @@ -44,10 +45,19 @@ public class FragmentAbout extends FragmentBase { TextView tvVersion = view.findViewById(R.id.tvVersion); TextView tvRelease = view.findViewById(R.id.tvRelease); + TextView tvGplV3 = view.findViewById(R.id.tvGplV3); tvVersion.setText(getString(R.string.title_version, BuildConfig.VERSION_NAME)); tvRelease.setText(BuildConfig.RELEASE_NAME); + tvGplV3.setPaintFlags(tvGplV3.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG); + tvGplV3.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + Helper.view(getContext(), Uri.parse(Helper.LICENSE_URI), true); + } + }); + return view; } diff --git a/app/src/main/java/eu/faircode/email/FragmentEula.java b/app/src/main/java/eu/faircode/email/FragmentEula.java index 5fd4b54c4c..ccbafc3e39 100644 --- a/app/src/main/java/eu/faircode/email/FragmentEula.java +++ b/app/src/main/java/eu/faircode/email/FragmentEula.java @@ -20,11 +20,14 @@ package eu.faircode.email; */ import android.content.SharedPreferences; +import android.graphics.Paint; +import android.net.Uri; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; +import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -38,6 +41,15 @@ public class FragmentEula extends FragmentBase { View view = inflater.inflate(R.layout.fragment_eula, container, false); + TextView tvGplV3 = view.findViewById(R.id.tvGplV3); + tvGplV3.setPaintFlags(tvGplV3.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG); + tvGplV3.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + Helper.view(getContext(), Uri.parse(Helper.LICENSE_URI), true); + } + }); + Button btnAgree = view.findViewById(R.id.btnOk); Button btnDisagree = view.findViewById(R.id.btnCancel); diff --git a/app/src/main/java/eu/faircode/email/Helper.java b/app/src/main/java/eu/faircode/email/Helper.java index 923b518a4b..513d42e869 100644 --- a/app/src/main/java/eu/faircode/email/Helper.java +++ b/app/src/main/java/eu/faircode/email/Helper.java @@ -155,6 +155,7 @@ public class Helper { static final String TEST_URI = "https://play.google.com/apps/testing/" + BuildConfig.APPLICATION_ID; static final String CROWDIN_URI = "https://crowdin.com/project/open-source-email"; static final String GRAVATAR_PRIVACY_URI = "https://meta.stackexchange.com/questions/44717/is-gravatar-a-privacy-risk"; + static final String LICENSE_URI = "https://www.gnu.org/licenses/gpl-3.0.html"; static final Pattern EMAIL_ADDRESS = Pattern.compile( diff --git a/app/src/main/res/layout/include_eula.xml b/app/src/main/res/layout/include_eula.xml index b1beb9bbe0..93480a5061 100644 --- a/app/src/main/res/layout/include_eula.xml +++ b/app/src/main/res/layout/include_eula.xml @@ -43,6 +43,7 @@ android:layout_marginTop="12dp" android:text="@string/app_eula" android:textAppearance="@style/TextAppearance.AppCompat.Small" + android:textIsSelectable="true" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/tvEulaTitle" /> @@ -53,7 +54,7 @@ android:layout_marginTop="12dp" android:text="@string/title_gplv3" android:textAppearance="@style/TextAppearance.AppCompat.Small" - android:textStyle="italic" + android:textColor="?android:attr/textColorLink" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/tvEula" /> From 310f39d1e3648764d5eb860cba490613106cd71c Mon Sep 17 00:00:00 2001 From: M66B Date: Tue, 18 Aug 2020 17:29:51 +0200 Subject: [PATCH 06/12] Show icon single source/target folder --- .../eu/faircode/email/FragmentMessages.java | 35 ++++++++++++++++--- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/FragmentMessages.java b/app/src/main/java/eu/faircode/email/FragmentMessages.java index 086381a48e..b0703963b2 100644 --- a/app/src/main/java/eu/faircode/email/FragmentMessages.java +++ b/app/src/main/java/eu/faircode/email/FragmentMessages.java @@ -7293,6 +7293,19 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences. this.name = folder.name; this.display = folder.getDisplayName(context); } + + @Override + public boolean equals(Object other) { + if (other instanceof Folder) + return this.id == ((Folder) other).id; + else + return false; + } + + @Override + public int hashCode() { + return Objects.hash(id); + } } } @@ -7554,15 +7567,27 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences. tvSourceFolders.setText(getDisplay(result, false)); tvTargetFolders.setText(getDisplay(result, true)); + List sources = new ArrayList<>(); + List targets = new ArrayList<>(); + for (MessageTarget t : result) { + if (!sources.contains(t.sourceFolder)) + sources.add(t.sourceFolder); + if (!targets.contains(t.targetFolder)) + targets.add(t.targetFolder); + } + Drawable source = null; - Drawable target = null; - if (result.size() == 1) { - source = getResources().getDrawable(EntityFolder.getIcon(result.get(0).sourceFolder.type), null); - target = getResources().getDrawable(EntityFolder.getIcon(result.get(0).targetFolder.type), null); + if (sources.size() == 1) { + source = getResources().getDrawable(EntityFolder.getIcon(sources.get(0).type), null); if (source != null) source.setBounds(0, 0, source.getIntrinsicWidth(), source.getIntrinsicHeight()); + } + + Drawable target = null; + if (targets.size() == 1) { + target = getResources().getDrawable(EntityFolder.getIcon(targets.get(0).type), null); if (target != null) - target.setBounds(0, 0, target.getIntrinsicWidth(), source.getIntrinsicHeight()); + target.setBounds(0, 0, target.getIntrinsicWidth(), target.getIntrinsicHeight()); } tvSourceFolders.setCompoundDrawablesRelative(source, null, null, null); From bc0e4a1bf0c6afa68b3523457b931ca7e550976d Mon Sep 17 00:00:00 2001 From: M66B Date: Tue, 18 Aug 2020 17:44:07 +0200 Subject: [PATCH 07/12] Small layout improvement --- app/src/main/res/layout/dialog_ask_move.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/src/main/res/layout/dialog_ask_move.xml b/app/src/main/res/layout/dialog_ask_move.xml index d9f1ddf1e8..5065fc922c 100644 --- a/app/src/main/res/layout/dialog_ask_move.xml +++ b/app/src/main/res/layout/dialog_ask_move.xml @@ -14,6 +14,7 @@ android:id="@+id/tvMessages" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:gravity="center" android:text="Messages" android:textAppearance="@style/TextAppearance.AppCompat.Large" android:textColor="?android:attr/textColorPrimary" @@ -28,6 +29,7 @@ android:layout_marginTop="24dp" android:drawableStart="@drawable/baseline_inbox_24" android:drawablePadding="6dp" + android:gravity="center" android:text="Source folders" android:textAppearance="@style/TextAppearance.AppCompat.Medium" android:textColor="?android:attr/textColorPrimary" @@ -40,6 +42,7 @@ android:layout_width="48dp" android:layout_height="48dp" android:layout_marginTop="12dp" + android:gravity="center" android:tint="?android:attr/textColorSecondary" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -53,6 +56,7 @@ android:layout_marginTop="12dp" android:drawableStart="@drawable/baseline_archive_24" android:drawablePadding="6dp" + android:gravity="center" android:text="Target folders" android:textAppearance="@style/TextAppearance.AppCompat.Medium" android:textColor="?android:attr/textColorPrimary" @@ -65,6 +69,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="24dp" + android:gravity="center" android:text="@string/title_no_ask_again" android:textAppearance="@style/TextAppearance.AppCompat.Small" app:layout_constraintEnd_toEndOf="parent" From 3752a43570b6edce1b494b0cde88a3f480b7c7f9 Mon Sep 17 00:00:00 2001 From: M66B Date: Tue, 18 Aug 2020 20:21:25 +0200 Subject: [PATCH 08/12] Prevent crash --- app/src/main/java/eu/faircode/email/AdapterMessage.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/eu/faircode/email/AdapterMessage.java b/app/src/main/java/eu/faircode/email/AdapterMessage.java index 394bad02e0..19b80f534a 100644 --- a/app/src/main/java/eu/faircode/email/AdapterMessage.java +++ b/app/src/main/java/eu/faircode/email/AdapterMessage.java @@ -3506,7 +3506,7 @@ public class AdapterMessage extends RecyclerView.Adapter Date: Tue, 18 Aug 2020 20:45:21 +0200 Subject: [PATCH 09/12] Simplification --- .../eu/faircode/email/FragmentMessages.java | 29 +++++-------------- 1 file changed, 8 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/FragmentMessages.java b/app/src/main/java/eu/faircode/email/FragmentMessages.java index b0703963b2..95f705c160 100644 --- a/app/src/main/java/eu/faircode/email/FragmentMessages.java +++ b/app/src/main/java/eu/faircode/email/FragmentMessages.java @@ -7293,19 +7293,6 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences. this.name = folder.name; this.display = folder.getDisplayName(context); } - - @Override - public boolean equals(Object other) { - if (other instanceof Folder) - return this.id == ((Folder) other).id; - else - return false; - } - - @Override - public int hashCode() { - return Objects.hash(id); - } } } @@ -7567,25 +7554,25 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences. tvSourceFolders.setText(getDisplay(result, false)); tvTargetFolders.setText(getDisplay(result, true)); - List sources = new ArrayList<>(); - List targets = new ArrayList<>(); + List sources = new ArrayList<>(); + List targets = new ArrayList<>(); for (MessageTarget t : result) { - if (!sources.contains(t.sourceFolder)) - sources.add(t.sourceFolder); - if (!targets.contains(t.targetFolder)) - targets.add(t.targetFolder); + if (!sources.contains(t.sourceFolder.type)) + sources.add(t.sourceFolder.type); + if (!targets.contains(t.targetFolder.type)) + targets.add(t.targetFolder.type); } Drawable source = null; if (sources.size() == 1) { - source = getResources().getDrawable(EntityFolder.getIcon(sources.get(0).type), null); + source = getResources().getDrawable(EntityFolder.getIcon(sources.get(0)), null); if (source != null) source.setBounds(0, 0, source.getIntrinsicWidth(), source.getIntrinsicHeight()); } Drawable target = null; if (targets.size() == 1) { - target = getResources().getDrawable(EntityFolder.getIcon(targets.get(0).type), null); + target = getResources().getDrawable(EntityFolder.getIcon(targets.get(0)), null); if (target != null) target.setBounds(0, 0, target.getIntrinsicWidth(), target.getIntrinsicHeight()); } From d0858f3862adb75523234838b450f606483effb7 Mon Sep 17 00:00:00 2001 From: M66B Date: Wed, 19 Aug 2020 11:17:01 +0200 Subject: [PATCH 10/12] Use view handler for boundary callbacks --- .../java/eu/faircode/email/BoundaryCallbackMessages.java | 6 ++---- app/src/main/java/eu/faircode/email/FragmentMessages.java | 2 +- app/src/main/java/eu/faircode/email/ViewModelMessages.java | 5 +++-- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/BoundaryCallbackMessages.java b/app/src/main/java/eu/faircode/email/BoundaryCallbackMessages.java index e2597a2c61..b4f18a5bdb 100644 --- a/app/src/main/java/eu/faircode/email/BoundaryCallbackMessages.java +++ b/app/src/main/java/eu/faircode/email/BoundaryCallbackMessages.java @@ -85,9 +85,7 @@ public class BoundaryCallbackMessages extends PagedList.BoundaryCallback Date: Wed, 19 Aug 2020 11:19:16 +0200 Subject: [PATCH 11/12] Revert "Use view handler for boundary callbacks" This reverts commit d0858f3862adb75523234838b450f606483effb7. --- .../java/eu/faircode/email/BoundaryCallbackMessages.java | 6 ++++-- app/src/main/java/eu/faircode/email/FragmentMessages.java | 2 +- app/src/main/java/eu/faircode/email/ViewModelMessages.java | 5 ++--- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/BoundaryCallbackMessages.java b/app/src/main/java/eu/faircode/email/BoundaryCallbackMessages.java index b4f18a5bdb..e2597a2c61 100644 --- a/app/src/main/java/eu/faircode/email/BoundaryCallbackMessages.java +++ b/app/src/main/java/eu/faircode/email/BoundaryCallbackMessages.java @@ -85,7 +85,9 @@ public class BoundaryCallbackMessages extends PagedList.BoundaryCallback Date: Wed, 19 Aug 2020 11:39:01 +0200 Subject: [PATCH 12/12] Enable ANR reporting for debug versions --- app/build.gradle | 2 +- app/src/main/java/eu/faircode/email/Log.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 8ec69d6991..ccb88a4603 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -366,7 +366,7 @@ dependencies { // https://github.com/bugsnag/bugsnag-android implementation("com.bugsnag:bugsnag-android:$bugsnag_version") { - exclude group: "com.bugsnag", module: "bugsnag-plugin-android-anr" + //exclude group: "com.bugsnag", module: "bugsnag-plugin-android-anr" exclude group: "com.bugsnag", module: "bugsnag-plugin-android-ndk" } diff --git a/app/src/main/java/eu/faircode/email/Log.java b/app/src/main/java/eu/faircode/email/Log.java index edac99b683..6ed10ca1d3 100644 --- a/app/src/main/java/eu/faircode/email/Log.java +++ b/app/src/main/java/eu/faircode/email/Log.java @@ -283,7 +283,7 @@ public class Log { config.setAutoTrackSessions(false); ErrorTypes etypes = new ErrorTypes(); - etypes.setAnrs(false); + etypes.setAnrs(BuildConfig.DEBUG); etypes.setNdkCrashes(false); config.setEnabledErrorTypes(etypes);