package fm.last.android.activity;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.preference.DialogPreference;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.EditText;
import fm.last.android.LastFMApplication;
import fm.last.android.R;
public class BugReport extends DialogPreference {
private EditText mBug = null;
public BugReport(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void showDialog(Bundle state) {
super.showDialog(state);
mBug = (EditText) getDialog().findViewById(R.id.bug);
try {
LastFMApplication.getInstance().tracker.trackPageView("/BugReport");
} catch (Exception e) {
//Google Analytics doesn't appear to be thread safe
}
}
@Override
protected void onDialogClosed(boolean positiveResult) {
if (positiveResult) {
// These are the files to include in the ZIP file
String[] filenames = new String[] { "player.log", "scrobbler.log" };
// Create a buffer for reading the files
byte[] buf = new byte[1024];
try {
// Create the ZIP file
String outFilename = Environment.getExternalStorageDirectory() + "/lastfm-logs.zip";
Log.i("Last.fm", "Creating " + outFilename);
ZipOutputStream out = new ZipOutputStream(new FileOutputStream(outFilename));
// Compress the files
for (int i = 0; i < filenames.length; i++) {
try {
FileInputStream in = new FileInputStream(getContext().getFilesDir().getAbsolutePath() + "/" + filenames[i]);
// Add ZIP entry to output stream.
out.putNextEntry(new ZipEntry(filenames[i]));
// Transfer bytes from the file to the ZIP file
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
// Complete the entry
out.closeEntry();
in.close();
} catch (FileNotFoundException e) {
Log.i("Last.fm", "Skipping non-existing log file: " + filenames[i]);
}
}
// Run 'logcat' and store the output as a file inside our zip
ArrayList<String> commandLine = new ArrayList<String>();
commandLine.add("logcat");
commandLine.add("-d");
commandLine.add("-v");
commandLine.add("time");
commandLine.add("*:I");
commandLine.add("PlayerDriver:W"); //Filter out SenseUI's over-sharing audio driver
Process process = Runtime.getRuntime().exec(commandLine.toArray(new String[0]));
InputStream in = process.getInputStream();
// Add ZIP entry to output stream.
out.putNextEntry(new ZipEntry("logcat.log"));
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
out.closeEntry();
in.close();
// Complete the ZIP file
out.close();
String bugReport = "Description\n" + "===========\n" + mBug.getText() + "\n" + "\nAdditional Info\n" + "===========\n" + "App version: "
+ getContext().getPackageManager().getPackageInfo("fm.last.android", 0).versionName + "\n" + "Device: " + Build.MODEL + "\n"
+ "Android version: " + Build.VERSION.RELEASE + "\n" + "Firmware fingerprint: " + Build.FINGERPRINT + "\n";
String address[] = { "Last.fm Client Team <client@last.fm>" };
Intent email = new Intent(Intent.ACTION_SEND);
email.putExtra(Intent.EXTRA_EMAIL, address);
email.putExtra(Intent.EXTRA_TEXT, bugReport);
email.putExtra(Intent.EXTRA_SUBJECT, "Bug Report: Last.fm for Android");
email.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://" + outFilename));
email.setType("message/rfc822");
getContext().startActivity(Intent.createChooser(email, "Email:"));
} catch (Exception e) {
e.printStackTrace();
}
}
}
}