diff --git a/app/src/main/java/eu/faircode/email/ActivitySetup.java b/app/src/main/java/eu/faircode/email/ActivitySetup.java index 7a12de137a..58d994cc55 100644 --- a/app/src/main/java/eu/faircode/email/ActivitySetup.java +++ b/app/src/main/java/eu/faircode/email/ActivitySetup.java @@ -94,6 +94,7 @@ public class ActivitySetup extends ActivityBase implements FragmentManager.OnBac static final int REQUEST_IMPORT_PROVIDERS = 12; static final int REQUEST_GRAPH_CONTACTS = 13; static final int REQUEST_GRAPH_CONTACTS_OAUTH = 14; + static final int REQUEST_DEBUG_INFO = 7000; static final int PI_CONNECTION = 1; static final int PI_MISC = 2; @@ -428,6 +429,10 @@ public class ActivitySetup extends ActivityBase implements FragmentManager.OnBac } else performBack(); break; + case REQUEST_DEBUG_INFO: + if (resultCode == RESULT_OK && data != null) + onDebugInfo(data.getBundleExtra("args")); + break; } } catch (Throwable ex) { Log.e(ex); @@ -478,10 +483,22 @@ public class ActivitySetup extends ActivityBase implements FragmentManager.OnBac } private void onDebugInfo() { + FragmentDialogDebug fragment = new FragmentDialogDebug(); + fragment.setArguments(new Bundle()); + fragment.setTargetActivity(this, REQUEST_DEBUG_INFO); + fragment.show(getSupportFragmentManager(), "debug"); + } + + private void onDebugInfo(Bundle args) { new SimpleTask() { + @Override + protected void onPreExecute(Bundle args) { + ToastEx.makeText(ActivitySetup.this, R.string.title_debug_info, Toast.LENGTH_LONG).show(); + } + @Override protected Long onExecute(Context context, Bundle args) throws IOException, JSONException { - return Log.getDebugInfo(context, "setup", R.string.title_debug_info_remark, null, null).id; + return Log.getDebugInfo(context, "setup", R.string.title_debug_info_remark, null, null, args).id; } @Override @@ -499,7 +516,7 @@ public class ActivitySetup extends ActivityBase implements FragmentManager.OnBac Log.unexpectedError(getSupportFragmentManager(), ex); } - }.execute(this, new Bundle(), "debug:info"); + }.execute(this, args, "debug:info"); } private void onMenuIssue() { diff --git a/app/src/main/java/eu/faircode/email/ActivityView.java b/app/src/main/java/eu/faircode/email/ActivityView.java index 382c6eebb3..c6d486ae7c 100644 --- a/app/src/main/java/eu/faircode/email/ActivityView.java +++ b/app/src/main/java/eu/faircode/email/ActivityView.java @@ -192,6 +192,7 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB private static final int REQUEST_RULES_ACCOUNT = 2001; private static final int REQUEST_RULES_FOLDER = 2002; + private static final int REQUEST_DEBUG_INFO = 7000; @Override @SuppressLint("MissingSuperCall") @@ -1138,6 +1139,10 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB if (resultCode == RESULT_OK && data != null) onMenuRules(data.getBundleExtra("args")); break; + case REQUEST_DEBUG_INFO: + if (resultCode == RESULT_OK && data != null) + onDebugInfo(data.getBundleExtra("args")); + break; } } catch (Throwable ex) { Log.e(ex); @@ -1484,7 +1489,7 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB sb.append(line).append("\r\n"); } - return Log.getDebugInfo(context, "crash", R.string.title_crash_info_remark, null, sb.toString()).id; + return Log.getDebugInfo(context, "crash", R.string.title_crash_info_remark, null, sb.toString(), null).id; } finally { file.delete(); } @@ -2206,15 +2211,23 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB } private void onDebugInfo() { + FragmentDialogDebug fragment = new FragmentDialogDebug(); + fragment.setArguments(new Bundle()); + fragment.setTargetActivity(this, REQUEST_DEBUG_INFO); + fragment.show(getSupportFragmentManager(), "debug"); + } + + private void onDebugInfo(Bundle args) { + Log.logBundle(args); new SimpleTask() { @Override protected void onPreExecute(Bundle args) { - ToastEx.makeText(ActivityView.this, "Debug info ...", Toast.LENGTH_LONG).show(); + ToastEx.makeText(ActivityView.this, R.string.title_debug_info, Toast.LENGTH_LONG).show(); } @Override protected Long onExecute(Context context, Bundle args) throws IOException, JSONException { - return Log.getDebugInfo(context, "main", R.string.title_debug_info_remark, null, null).id; + return Log.getDebugInfo(context, "main", R.string.title_debug_info_remark, null, null, args).id; } @Override @@ -2233,7 +2246,7 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB Log.unexpectedError(getSupportFragmentManager(), ex); } - }.execute(this, new Bundle(), "debug:info"); + }.execute(this, args, "debug:info"); } private void onShowLog() { diff --git a/app/src/main/java/eu/faircode/email/FragmentDialogDebug.java b/app/src/main/java/eu/faircode/email/FragmentDialogDebug.java new file mode 100644 index 0000000000..4fc6717854 --- /dev/null +++ b/app/src/main/java/eu/faircode/email/FragmentDialogDebug.java @@ -0,0 +1,114 @@ +package eu.faircode.email; + +/* + This file is part of FairEmail. + + FairEmail is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + FairEmail is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with FairEmail. If not, see . + + Copyright 2018-2023 by Marcel Bokhorst (M66B) +*/ + +import static android.app.Activity.RESULT_OK; + +import android.app.Dialog; +import android.content.Context; +import android.content.DialogInterface; +import android.os.Bundle; +import android.text.Editable; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.Button; +import android.widget.CheckBox; +import android.widget.EditText; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AlertDialog; + +public class FragmentDialogDebug extends FragmentDialogBase { + private boolean enabled; + + @NonNull + @Override + public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { + if (savedInstanceState != null) + enabled = savedInstanceState.getBoolean("fair:enabled"); + + final Context context = getContext(); + View view = LayoutInflater.from(context).inflate(R.layout.dialog_debug, null); + final EditText etIssue = view.findViewById(R.id.etIssue); + final CheckBox cbContact = view.findViewById(R.id.cbContact); + + etIssue.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + // Do nothing + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + // Do nothing + } + + @Override + public void afterTextChanged(Editable editable) { + enabled = !TextUtils.isEmpty(editable.toString().trim()); + setEnabled(enabled); + } + }); + + etIssue.post(new Runnable() { + @Override + public void run() { + etIssue.requestFocus(); + Helper.showKeyboard(etIssue); + } + }); + + return new AlertDialog.Builder(context) + .setView(view) + .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + Bundle args = getArguments(); + args.putString("issue", etIssue.getText().toString()); + args.putBoolean("contact", cbContact.isChecked()); + + sendResult(RESULT_OK); + } + }) + .setNegativeButton(android.R.string.cancel, null) + .create(); + } + + @Override + public void onStart() { + super.onStart(); + setEnabled(enabled); + } + + @Override + public void onSaveInstanceState(@NonNull Bundle outState) { + outState.putBoolean("fair:enabled", enabled); + super.onSaveInstanceState(outState); + } + + private void setEnabled(boolean value) { + Button ok = ((AlertDialog) getDialog()).getButton(AlertDialog.BUTTON_POSITIVE); + if (ok != null) + ok.setEnabled(value); + } +} diff --git a/app/src/main/java/eu/faircode/email/Log.java b/app/src/main/java/eu/faircode/email/Log.java index b1abb618bd..a3d6a923c5 100644 --- a/app/src/main/java/eu/faircode/email/Log.java +++ b/app/src/main/java/eu/faircode/email/Log.java @@ -1786,9 +1786,15 @@ public class Log { } } - static EntityMessage getDebugInfo(Context context, String source, int title, Throwable ex, String log) throws IOException, JSONException { + static EntityMessage getDebugInfo(Context context, String source, int title, Throwable ex, String log, Bundle args) throws IOException, JSONException { StringBuilder sb = new StringBuilder(); - sb.append(context.getString(title)).append("\n\n\n\n"); + sb.append(context.getString(title)).append("\n\n"); + if (args != null) { + sb.append(args.getString("issue")); + if (args.getBoolean("contact")) + sb.append("\n\n").append("Prior contact"); + } + sb.append("\n\n"); sb.append(getAppInfo(context)); if (ex != null) sb.append(ex.toString()).append("\n").append(android.util.Log.getStackTraceString(ex)); @@ -1942,7 +1948,7 @@ public class Log { new SimpleTask() { @Override protected Long onExecute(Context context, Bundle args) throws Throwable { - return Log.getDebugInfo(context, "report", R.string.title_unexpected_info_remark, ex, null).id; + return Log.getDebugInfo(context, "report", R.string.title_unexpected_info_remark, ex, null, null).id; } @Override diff --git a/app/src/main/res/layout/dialog_debug.xml b/app/src/main/res/layout/dialog_debug.xml new file mode 100644 index 0000000000..a74cfb60f6 --- /dev/null +++ b/app/src/main/res/layout/dialog_debug.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d11bf178cb..379a5e0357 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -2233,6 +2233,8 @@ Debug info Please describe the problem and indicate the time of the problem: Please describe what you were doing when the app crashed: + Problem description + We recently had contact about this problem Please describe what you were doing when you got the error: FairEmail %1$s issue