Java tutorial
/* * This file is part of Adblock Plus <http://adblockplus.org/>, * Copyright (C) 2006-2013 Eyeo GmbH * * Adblock Plus is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 as * published by the Free Software Foundation. * * Adblock Plus 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 Adblock Plus. If not, see <http://www.gnu.org/licenses/>. */ package org.adblockplus.android; import java.io.IOException; import java.io.StringWriter; import java.util.regex.Pattern; import org.apache.http.HttpResponse; import org.apache.http.StatusLine; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.util.EntityUtils; import org.xmlpull.v1.XmlSerializer; import android.app.Activity; import android.os.Bundle; import android.text.TextUtils; import android.util.Log; import android.util.Xml; import android.view.View; import android.view.Window; import android.widget.EditText; import android.widget.Toast; /** * Shows crash report dialog asking user to submit crash report together with comments. */ public final class CrashReportDialog extends Activity { private final static String TAG = "CrashReportDialog"; private String report; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_LEFT_ICON); setContentView(R.layout.crashreport); Bundle extras = getIntent().getExtras(); if (extras == null) { finish(); return; } report = extras.getString("report"); getWindow().setFeatureDrawableResource(Window.FEATURE_LEFT_ICON, android.R.drawable.ic_dialog_alert); } public void onOk(View v) { String comment = ((EditText) findViewById(R.id.comments)).getText().toString(); try { String[] reportLines = report.split(System.getProperty("line.separator")); int api = Integer.parseInt(reportLines[0]); int build = Integer.parseInt(reportLines[1]); XmlSerializer xmlSerializer = Xml.newSerializer(); StringWriter writer = new StringWriter(); xmlSerializer.setOutput(writer); xmlSerializer.startDocument("UTF-8", true); xmlSerializer.startTag("", "crashreport"); xmlSerializer.attribute("", "version", "1"); xmlSerializer.attribute("", "api", String.valueOf(api)); xmlSerializer.attribute("", "build", String.valueOf(build)); xmlSerializer.startTag("", "error"); xmlSerializer.attribute("", "type", reportLines[2]); xmlSerializer.startTag("", "message"); xmlSerializer.text(reportLines[3]); xmlSerializer.endTag("", "message"); xmlSerializer.startTag("", "stacktrace"); Pattern p = Pattern.compile("\\|"); boolean hasCause = false; int i = 4; while (i < reportLines.length) { if ("cause".equals(reportLines[i])) { xmlSerializer.endTag("", "stacktrace"); xmlSerializer.startTag("", "cause"); hasCause = true; i++; xmlSerializer.attribute("", "type", reportLines[i]); i++; xmlSerializer.startTag("", "message"); xmlSerializer.text(reportLines[i]); i++; xmlSerializer.endTag("", "message"); xmlSerializer.startTag("", "stacktrace"); continue; } Log.e(TAG, "Line: " + reportLines[i]); String[] element = TextUtils.split(reportLines[i], p); xmlSerializer.startTag("", "frame"); xmlSerializer.attribute("", "class", element[0]); xmlSerializer.attribute("", "method", element[1]); xmlSerializer.attribute("", "isnative", element[2]); xmlSerializer.attribute("", "file", element[3]); xmlSerializer.attribute("", "line", element[4]); xmlSerializer.endTag("", "frame"); i++; } xmlSerializer.endTag("", "stacktrace"); if (hasCause) xmlSerializer.endTag("", "cause"); xmlSerializer.endTag("", "error"); xmlSerializer.startTag("", "comment"); xmlSerializer.text(comment); xmlSerializer.endTag("", "comment"); xmlSerializer.endTag("", "crashreport"); xmlSerializer.endDocument(); String xml = writer.toString(); HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost(getString(R.string.crash_report_url)); httppost.setHeader("Content-Type", "text/xml; charset=UTF-8"); httppost.addHeader("X-Adblock-Plus", "yes"); httppost.setEntity(new StringEntity(xml)); HttpResponse httpresponse = httpclient.execute(httppost); StatusLine statusLine = httpresponse.getStatusLine(); Log.e(TAG, statusLine.getStatusCode() + " " + statusLine.getReasonPhrase()); Log.e(TAG, EntityUtils.toString(httpresponse.getEntity())); if (statusLine.getStatusCode() != 200) throw new ClientProtocolException(); String response = EntityUtils.toString(httpresponse.getEntity()); if (!"saved".equals(response)) throw new ClientProtocolException(); deleteFile(CrashHandler.REPORT_FILE); } catch (ClientProtocolException e) { Log.e(TAG, "Failed to submit a crash", e); Toast.makeText(this, R.string.msg_crash_submission_failure, Toast.LENGTH_LONG).show(); } catch (IOException e) { Log.e(TAG, "Failed to submit a crash", e); Toast.makeText(this, R.string.msg_crash_submission_failure, Toast.LENGTH_LONG).show(); } catch (Exception e) { Log.e(TAG, "Failed to create report", e); // Assuming corrupted report file, just silently deleting it deleteFile(CrashHandler.REPORT_FILE); } finish(); } public void onCancel(View v) { deleteFile(CrashHandler.REPORT_FILE); finish(); } }