/** * Copyright 2010 Jason Hudgins, All Rights Reserved. */ package com.droidworks.exception; import java.util.ArrayList; import android.text.TextUtils; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.message.BasicNameValuePair; import android.app.Service; import android.content.Intent; import android.content.pm.PackageInfo; import android.content.pm.PackageManager.NameNotFoundException; import android.os.Build; import android.os.IBinder; import android.util.Log; import com.droidworks.exception.RemoteLoggingExceptionHandler.Keys; import com.droidworks.util.GuidManager; import com.droidworks.util.StringUtils; /** * @author jasonhudgins * */ public class RemoteLoggerService extends Service { public static final String EXTRA_MESSAGE = "message"; public static final String EXTRA_STACK_TRACE = "stack_trace"; public static final String EXTRA_REMOTE_HOST_URL = "remote_host_url"; public static final String EXTRA_PACKAGE = "package"; private String mMessage; private String mTrace; private String mUrl; private String mPackage; private final String mProduct = Build.PRODUCT; private final String mDevice = Build.DEVICE; private final String mSDK = Build.VERSION.SDK; private final String mCodename = Build.VERSION.CODENAME; private String mAppVersionName; private String mAppVersionCode; private String mGuid; public RemoteLoggerService() { super(); } @Override public void onStart(Intent intent, int startId) { super.onStart(intent, startId); mMessage = intent.getStringExtra(EXTRA_MESSAGE); mTrace = intent.getStringExtra(EXTRA_STACK_TRACE); mUrl = intent.getStringExtra(EXTRA_REMOTE_HOST_URL); mPackage = intent.getStringExtra(EXTRA_PACKAGE); // quick sanity check if (TextUtils.isEmpty(mTrace) || TextUtils.isEmpty(mUrl) || TextUtils.isEmpty(mPackage)) { return; } mGuid = new GuidManager(this).getGuid(); PackageInfo packageInfo = null; try { packageInfo = getPackageManager() .getPackageInfo(mPackage, 0); } catch (NameNotFoundException e) { Log.e(getClass().getName(), "package not found: " + mPackage, e); } mAppVersionName = packageInfo.versionName; mAppVersionCode = Integer.toString(packageInfo.versionCode); new Thread(new ErrorReporter()).start(); } @Override public IBinder onBind(Intent arg0) { return null; } private class ErrorReporter implements Runnable { public void run() { HttpPost post = new HttpPost(mUrl); ArrayList<NameValuePair> data = new ArrayList<NameValuePair>(); data.add(new BasicNameValuePair(Keys.GUID, mGuid)); data.add(new BasicNameValuePair(Keys.APP_VERSION, mAppVersionName)); data.add(new BasicNameValuePair(Keys.VERSION_CODE, mAppVersionCode)); data.add(new BasicNameValuePair(Keys.MESSAGE, (TextUtils.isEmpty(mMessage)) ? "An Exception Occured" : mMessage)); data.add(new BasicNameValuePair(Keys.TRACE, mTrace)); data.add(new BasicNameValuePair(Keys.PRODUCT, mProduct)); data.add(new BasicNameValuePair(Keys.DEVICE, mDevice)); data.add(new BasicNameValuePair(Keys.BUILD_CODENAME, mCodename)); data.add(new BasicNameValuePair(Keys.PLATFORM_SDK, mSDK)); try { UrlEncodedFormEntity form = new UrlEncodedFormEntity(data, "utf-8"); post.setEntity(form); HttpResponse response = new DefaultHttpClient().execute(post); } catch (Exception e) { Log.e(getClass().getName(), "Failure transmitting exception data", e); } } } }