Added debug info dialog

pull/213/head
M66B 1 year ago
parent 0fdb3a8f6e
commit a976ed4bb4

@ -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<Long>() {
@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() {

@ -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<Long>() {
@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() {

@ -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 <http://www.gnu.org/licenses/>.
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);
}
}

@ -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<Long>() {
@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

@ -0,0 +1,48 @@
<?xml version="1.0" encoding="utf-8"?>
<eu.faircode.email.ScrollViewEx xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="24dp"
android:scrollbarStyle="outsideOverlay">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/tvCaption"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawableStart="@drawable/twotone_bug_report_24"
android:drawablePadding="6dp"
android:drawableTint="?android:attr/textColorPrimary"
android:text="@string/title_debug_info"
android:textAppearance="@style/TextAppearance.AppCompat.Large"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<eu.faircode.email.EditTextPlain
android:id="@+id/etIssue"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
android:gravity="top"
android:hint="@string/title_debug_info_issue"
android:imeOptions="actionNone|flagNoEnterAction"
android:inputType="textCapSentences|textMultiLine|textAutoCorrect"
android:textAppearance="@style/TextAppearance.AppCompat.Medium"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tvCaption" />
<CheckBox
android:id="@+id/cbContact"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:text="@string/title_debug_info_contact"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/etIssue" />
</androidx.constraintlayout.widget.ConstraintLayout>
</eu.faircode.email.ScrollViewEx>

@ -2233,6 +2233,8 @@
<string name="title_debug_info">Debug info</string>
<string name="title_debug_info_remark">Please describe the problem and indicate the time of the problem:</string>
<string name="title_crash_info_remark">Please describe what you were doing when the app crashed:</string>
<string name="title_debug_info_issue">Problem description</string>
<string name="title_debug_info_contact">We recently had contact about this problem</string>
<string name="title_unexpected_info_remark">Please describe what you were doing when you got the error:</string>
<string name="title_issue_subject" translatable="false">FairEmail %1$s issue</string>

Loading…
Cancel
Save