Add a 'Report Bug' button

This also attaches the entire 'adb logcat' in Android. This way, we can
hopefully get useful info about why something is not working.

This currently breaks the build as we need to migrate to Android X
This commit is contained in:
Vishesh Handa
2019-05-20 14:15:45 +02:00
parent ee315a1904
commit 9051d1e7dc
6 changed files with 83 additions and 1 deletions

View File

@ -0,0 +1,29 @@
package io.gitjournal.gitjournal;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
public class LogDumper {
public static void dumpLogs(String filePath) throws Exception {
File file = new File(filePath);
// Truncate the existing file
PrintWriter pw = new PrintWriter(file);
pw.close();
FileOutputStream stream = new FileOutputStream(file, true);
Process logcat = Runtime.getRuntime().exec(new String[]{"logcat", "-d"});
BufferedReader br = new BufferedReader(new InputStreamReader(logcat.getInputStream()), 4 * 1024);
String line;
String separator = System.getProperty("line.separator");
while ((line = br.readLine()) != null) {
stream.write(line.getBytes());
stream.write(separator.getBytes());
}
stream.close();
}
}

View File

@ -227,6 +227,17 @@ public class MainActivity extends FlutterActivity implements MethodCallHandler {
result.success(publicKey); result.success(publicKey);
return; return;
} else if (call.method.equals("dumpAppLogs")) {
String filePath = filesDir + "/app-logs.txt";
try {
LogDumper.dumpLogs(filePath);
} catch (Exception e) {
e.printStackTrace();
result.error("FAILED", e.toString(), null);
}
result.success(filePath);
} }
result.notImplemented(); result.notImplemented();

View File

@ -1,4 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:package_info/package_info.dart'; import 'package:package_info/package_info.dart';
import 'app.dart'; import 'app.dart';
@ -19,6 +20,14 @@ Future<String> getVersionString() async {
return versionText; return versionText;
} }
/// adb logcat
/// Returns the file path where the logs were dumped
Future<String> dumpAppLogs() async {
const _platform = const MethodChannel('gitjournal.io/git');
final String logsFilePath = await _platform.invokeMethod('dumpAppLogs');
return logsFilePath;
}
SnackBar buildUndoDeleteSnackbar( SnackBar buildUndoDeleteSnackbar(
BuildContext context, BuildContext context,
Note deletedNote, Note deletedNote,

View File

@ -1,4 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_email_sender/flutter_email_sender.dart';
import 'package:journal/analytics.dart'; import 'package:journal/analytics.dart';
import 'package:journal/state_container.dart'; import 'package:journal/state_container.dart';
import 'package:journal/utils.dart'; import 'package:journal/utils.dart';
@ -84,7 +85,7 @@ class AppDrawer extends StatelessWidget {
onTap: () async { onTap: () async {
var versionText = await getVersionString(); var versionText = await getVersionString();
var emailAddress = 'gitjournal.io@gmail.com'; var emailAddress = 'gitjournal.io+feedback@gmail.com';
var subject = 'GitJournal Feedback'; var subject = 'GitJournal Feedback';
var body = var body =
"Hey!\n\nHere are some ways to improve GitJournal - \n \n\nVersion: $versionText"; "Hey!\n\nHere are some ways to improve GitJournal - \n \n\nVersion: $versionText";
@ -98,6 +99,30 @@ class AppDrawer extends StatelessWidget {
); );
}, },
), ),
ListTile(
leading: Icon(Icons.bug_report, color: textStyle.color),
title: Text('Bug Report', style: textStyle),
onTap: () async {
var versionText = await getVersionString();
var appLogsFilePath = await dumpAppLogs();
final Email email = Email(
body:
"Hey!\n\nI found a bug in GitJournal - \n \n\nVersion: $versionText",
subject: 'GitJournal Bug',
recipients: ['gitjournal.io+bugs@gmail.com'],
attachmentPath: appLogsFilePath,
);
await FlutterEmailSender.send(email);
Navigator.pop(context);
getAnalytics().logEvent(
name: "drawer_bugreport",
);
},
),
ListTile( ListTile(
leading: Icon(Icons.settings, color: textStyle.color), leading: Icon(Icons.settings, color: textStyle.color),
title: Text('Settings', style: textStyle), title: Text('Settings', style: textStyle),

View File

@ -132,6 +132,13 @@ packages:
description: flutter description: flutter
source: sdk source: sdk
version: "0.0.0" version: "0.0.0"
flutter_email_sender:
dependency: "direct main"
description:
name: flutter_email_sender
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.2"
flutter_launcher_icons: flutter_launcher_icons:
dependency: "direct dev" dependency: "direct dev"
description: description:

View File

@ -21,6 +21,7 @@ dependencies:
launch_review: ^1.0.1 launch_review: ^1.0.1
device_info: ^0.4.0+1 device_info: ^0.4.0+1
flutter_markdown: ^0.2.0 flutter_markdown: ^0.2.0
flutter_email_sender: ^2.0.2
dev_dependencies: dev_dependencies:
flutter_launcher_icons: "^0.7.0" flutter_launcher_icons: "^0.7.0"