package org.sugr.gearshift.ui; import android.content.Intent; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.os.Build; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.text.Html; import android.widget.TextView; import org.sugr.gearshift.R; import java.io.IOException; import java.io.InputStreamReader; import java.util.Date; public class CrashReport extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_crash_report); ((TextView) findViewById(R.id.crash_title)).setText( Html.fromHtml(getString(R.string.crash_title)) ); findViewById(R.id.cancel).setOnClickListener(v -> System.exit(1)); findViewById(R.id.send).setOnClickListener(v -> { sendLogFile(); System.exit(1); }); } private String extractLogToString() { PackageManager manager = this.getPackageManager(); PackageInfo info = null; try { info = manager.getPackageInfo(this.getPackageName(), 0); } catch (PackageManager.NameNotFoundException e2) { } String model = Build.MODEL; if (!model.startsWith(Build.MANUFACTURER)) { model = Build.MANUFACTURER + " " + model; } InputStreamReader reader = null; try { String cmd = "logcat -d -v time"; // get input stream Process process = Runtime.getRuntime().exec(cmd); reader = new InputStreamReader(process.getInputStream()); StringBuilder stringBuffer = new StringBuilder(); stringBuffer.append("Android version: ").append(Build.VERSION.SDK_INT).append("\n"); stringBuffer.append("Device: ").append(model).append("\n"); stringBuffer.append("App version: ").append(info == null ? "(null)" : info.versionCode).append("\n"); stringBuffer.append("App version name: ").append(info == null ? "(null)" : info.versionName).append("\n"); char[] buffer = new char[10000]; do { int n = reader.read (buffer, 0, buffer.length); if (n == -1) { break; } stringBuffer.append(buffer, 0, n); } while (true); reader.close(); return stringBuffer.toString(); } catch (IOException e) { if (reader != null) { try { reader.close(); } catch (IOException ignored) { } } // You might want to write a failure message to the log here. return null; } } private void sendLogFile() { String log = extractLogToString(); if (log == null) { return; } Intent intent = new Intent (Intent.ACTION_SEND); intent.setType("plain/text"); intent.putExtra(Intent.EXTRA_EMAIL, new String[] {"crashreports@sugr.org"}); intent.putExtra(Intent.EXTRA_SUBJECT, "Gear Shift crash report on " + new Date().toString()); intent.putExtra(Intent.EXTRA_TEXT, "The crash produced the following error log:\n\n" + log); startActivity(intent); } }