diff --git a/ExaltedDice/.classpath b/ExaltedDice/.classpath index 207072c..9e1be04 100755 --- a/ExaltedDice/.classpath +++ b/ExaltedDice/.classpath @@ -4,5 +4,7 @@ - + + + diff --git a/ExaltedDice/AndroidManifest.xml b/ExaltedDice/AndroidManifest.xml index 5ad97cb..4f4ad3e 100755 --- a/ExaltedDice/AndroidManifest.xml +++ b/ExaltedDice/AndroidManifest.xml @@ -1,26 +1,35 @@ - - + android:installLocation="auto" + package="com.TwentyCode.android.ExaltedDice" + android:versionCode="15" + android:versionName="1.0.1" > + + + + - - - + + + + + + - - - + + + - - - \ No newline at end of file + diff --git a/ExaltedDice/Change Log.txt b/ExaltedDice/Change Log.txt deleted file mode 100644 index e69de29..0000000 diff --git a/ExaltedDice/assets/exceptionhandler.properties b/ExaltedDice/assets/exceptionhandler.properties new file mode 100644 index 0000000..3d072f2 --- /dev/null +++ b/ExaltedDice/assets/exceptionhandler.properties @@ -0,0 +1,19 @@ +# exceptionhandler.properties +# This is the default Twenty Codes, LLC Exception Handler properties file +# +# @author Twenty Codes, LLC +# @author ricky barrette + + +# The following is for using our custom server based exception handler web application +# HTTP ONLY +# server is the physical web address for your server +# file is the path to your filing script +# get is the path to your json retrieval script +server = http://powers.doesntexist.com:666/testing +file = /index.php?post=1 +#get = /index.php?get=1 + +# uncomment the following if you want your application to use email to file reports. +# if this is uncommented, email will always be used. +#email = twentycodes@gmail.com \ No newline at end of file diff --git a/ExaltedDice/bin/res/drawable/icon.png b/ExaltedDice/bin/res/drawable/icon.png new file mode 100644 index 0000000..bfb88c2 Binary files /dev/null and b/ExaltedDice/bin/res/drawable/icon.png differ diff --git a/ExaltedDice/default.properties b/ExaltedDice/default.properties old mode 100755 new mode 100644 index 51e933a..2eb7dc6 --- a/ExaltedDice/default.properties +++ b/ExaltedDice/default.properties @@ -1,13 +1,5 @@ -# This file is automatically generated by Android Tools. -# Do not modify this file -- YOUR CHANGES WILL BE ERASED! -# -# This file must be checked in Version Control Systems. -# -# To customize properties used by the Ant build system use, -# "build.properties", and override values to adapt the script to your -# project structure. - # Indicates whether an apk should be generated for each density. split.density=false # Project target. -target=android-8 +target=android-15 +android.library.reference.1=../../exception_handler_library/ExceptionHandlerLib diff --git a/ExaltedDice/lint.xml b/ExaltedDice/lint.xml new file mode 100644 index 0000000..ee0eead --- /dev/null +++ b/ExaltedDice/lint.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/ExaltedDice/project.properties b/ExaltedDice/project.properties new file mode 100644 index 0000000..5304365 --- /dev/null +++ b/ExaltedDice/project.properties @@ -0,0 +1,12 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system use, +# "ant.properties", and override values to adapt the script to your +# project structure. + +# Indicates whether an apk should be generated for each density. +# Project target. +target=android-15 diff --git a/ExaltedDice/src/com/TwentyCode/android/ExaltedDice/ExaltedDice.java b/ExaltedDice/src/com/TwentyCode/android/ExaltedDice/ExaltedDice.java index 7b68fda..397d0db 100755 --- a/ExaltedDice/src/com/TwentyCode/android/ExaltedDice/ExaltedDice.java +++ b/ExaltedDice/src/com/TwentyCode/android/ExaltedDice/ExaltedDice.java @@ -3,6 +3,8 @@ package com.TwentyCode.android.ExaltedDice; import java.util.ArrayList; import java.util.Random; +import com.TwentyCodes.android.exception.ExceptionHandler; + import android.app.Activity; import android.app.AlertDialog; import android.content.Context; @@ -48,7 +50,6 @@ public class ExaltedDice extends Activity implements OnClickListener, OnLongClic private int mEnd = 999; private static final int MENU_QUIT = Menu.FIRST; private static final int MENU_CLEAR = Menu.FIRST + 1; - protected PostMortemReportExceptionHandler mDamageReport = new PostMortemReportExceptionHandler(this); private static final String TAG = "ExaltedDice"; private Handler mHandler; //this runnable will be used to increment or decrement the amount of dice being rolled @@ -229,9 +230,8 @@ public class ExaltedDice extends Activity implements OnClickListener, OnLongClic */ @Override public void onCreate(Bundle savedInstanceState) { - mDamageReport.run(); - Thread.setDefaultUncaughtExceptionHandler(mDamageReport); - + Thread.setDefaultUncaughtExceptionHandler(new ExceptionHandler(this)); + super.onCreate(savedInstanceState); Log.i(TAG, "onCreate()"); setContentView(R.layout.main); diff --git a/ExaltedDice/src/com/TwentyCode/android/ExaltedDice/PostMortemReportExceptionHandler.java b/ExaltedDice/src/com/TwentyCode/android/ExaltedDice/PostMortemReportExceptionHandler.java deleted file mode 100644 index 29fee4e..0000000 --- a/ExaltedDice/src/com/TwentyCode/android/ExaltedDice/PostMortemReportExceptionHandler.java +++ /dev/null @@ -1,211 +0,0 @@ -package com.TwentyCode.android.ExaltedDice; - -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStreamReader; -import java.lang.Thread.UncaughtExceptionHandler; -import java.lang.reflect.Field; -import java.text.SimpleDateFormat; -import java.util.Date; - -import android.app.Activity; -import android.content.Context; -import android.content.Intent; -import android.content.pm.PackageInfo; -import android.content.pm.PackageManager; -import android.content.pm.PackageManager.NameNotFoundException; -import android.os.Build; - -/** - * dont forget the manifest tag - * - * @author ricky - */ -public class PostMortemReportExceptionHandler implements UncaughtExceptionHandler, Runnable { - public static final String ExceptionReportFilename = "postmortem.trace"; - - private static final String MSG_SUBJECT_TAG = "Exception Report"; //"app title + this tag" = email subject - private static final String MSG_SENDTO = "twentycodes@gmail.com"; //email will be sent to this account - //the following may be something you wish to consider localizing - private static final String MSG_BODY = "Just click send to help make this application better. "+ - "No personal information is being sent (you can check by reading the rest of the email)."; - - private Thread.UncaughtExceptionHandler mDefaultUEH; - private Activity mApp = null; - - public PostMortemReportExceptionHandler(Activity aApp) { - mDefaultUEH = Thread.getDefaultUncaughtExceptionHandler(); - mApp = aApp; - } - - public String getDebugReport(Throwable aException) { - -// NumberFormat theFormatter = new DecimalFormat("#0."); - //stack trace - StackTraceElement[] theStackTrace = aException.getStackTrace(); - - StringBuffer report = new StringBuffer(); - - report.append("--------- Application ---------\n\n"); - - report.append(mApp.getPackageName()+" generated the following exception:\n\n"); - - report.append(aException.toString() + "\n\n"); - - report.append("-------------------------------\n\n"); - - report.append("--------- Stack trace ---------\n\n"); - for (int i = 0; i < theStackTrace.length; i++) { - report.append(" " + theStackTrace[i].toString() + "\n"); - } - report.append("-------------------------------\n\n"); - - //app environment - PackageManager pm = mApp.getPackageManager(); - PackageInfo pi; - try { - pi = pm.getPackageInfo(mApp.getPackageName(), 0); - } catch (NameNotFoundException eNnf) { - //doubt this will ever run since we want info about our own package - pi = new PackageInfo(); - pi.versionName = "unknown"; - pi.versionCode = 69; - } - - Date theDate = new Date(); - SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd_HH.mm.ss_zzz"); - report.append("-------- Environment --------\n"); - report.append("Time\t="+sdf.format(theDate)+"\n"); - report.append("Device\t="+Build.FINGERPRINT+"\n"); - try { - Field theMfrField = Build.class.getField("MANUFACTURER"); - report.append("Make\t="+theMfrField.get(null)+"\n"); - } catch (SecurityException e) { - } catch (NoSuchFieldException e) { - } catch (IllegalArgumentException e) { - } catch (IllegalAccessException e) { - } - report.append("Device: " + Build.DEVICE + "\n"); - report.append("Brand: " + Build.BRAND + "\n"); - report.append("Model: "+Build.MODEL+"\n"); - report.append("Product: "+Build.PRODUCT+"\n"); - report.append("App:\t "+mApp.getPackageName()+", version "+pi.versionName+" (build "+pi.versionCode+")\n"); - report.append("Locale: "+mApp.getResources().getConfiguration().locale.getDisplayName()+"\n"); - report.append("-----------------------------\n\n"); - - report.append("--------- Firmware ---------\n\n"); - report.append("SDK: " + Build.VERSION.SDK + "\n"); - report.append("Release: " + Build.VERSION.RELEASE + "\n"); - report.append("Incremental: " + Build.VERSION.INCREMENTAL + "\n"); - report.append("Build Id: " + Build.ID + "\n"); - report.append("-------------------------------\n\n"); - - // If the exception was thrown in a background thread inside - // AsyncTask, then the actual exception can be found with getCause - report.append("--------- Cause ---------\n\n"); - Throwable cause = aException.getCause(); - if (cause != null) { - report.append(cause.toString() + "\n\n"); - theStackTrace = cause.getStackTrace(); - for (int i = 0; i < theStackTrace.length; i++) { - report.append(" " + theStackTrace[i].toString() + "\n"); - } - } - report.append("-------------------------------\n\n"); - - report.append("--------- Complete Logcat ---------\n\n"); - report.append(getLog().toString()); - report.append("-------------------------------\n\n"); - - report.append("END REPORT"); - - return report.toString(); - } - - protected StringBuilder getLog(){ - final StringBuilder log = new StringBuilder(); - try{ - Process process = Runtime.getRuntime().exec("logcat -d"); - BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream())); - - String line; - while ((line = bufferedReader.readLine()) != null){ - log.append(line); - log.append("\n"); - } - } - catch (IOException e){ - } - return log; - } - - public void run() { - sendDebugReportToAuthor(); - } - - protected void saveDebugReport(String aReport) { - //save report to file - try { - FileOutputStream theFile = mApp.openFileOutput(ExceptionReportFilename, Context.MODE_PRIVATE); - theFile.write(aReport.getBytes()); - theFile.close(); - } catch(IOException ioe) { - //error during error report needs to be ignored, do not wish to start infinite loop - } - } - - public void sendDebugReportToAuthor() { - String theLine = ""; - StringBuffer theTrace = new StringBuffer(); - try { - BufferedReader theReader = new BufferedReader( - new InputStreamReader(mApp.openFileInput(ExceptionReportFilename))); - while ((theLine = theReader.readLine())!=null) { - theTrace.append(theLine+"\n"); - } - if (sendDebugReportToAuthor(theTrace.toString())) { - mApp.deleteFile(ExceptionReportFilename); - } - } catch (FileNotFoundException eFnf) { - // nothing to do - } catch(IOException eIo) { - // not going to report - } - } - - public Boolean sendDebugReportToAuthor(String aReport) { - if (aReport!=null) { - Intent theIntent = new Intent(Intent.ACTION_SEND); - String theSubject = mApp.getTitle()+" "+MSG_SUBJECT_TAG; - String theBody = "\n"+MSG_BODY+"\n\n"+aReport+"\n\n"; - theIntent.putExtra(Intent.EXTRA_EMAIL,new String[] {MSG_SENDTO}); - theIntent.putExtra(Intent.EXTRA_TEXT, theBody); - theIntent.putExtra(Intent.EXTRA_SUBJECT, theSubject); - theIntent.setType("message/rfc822"); - Boolean hasSendRecipients = (mApp.getPackageManager().queryIntentActivities(theIntent,0).size()>0); - if (hasSendRecipients) { - mApp.startActivity(theIntent); - return true; - } else { - return false; - } - } else { - return true; - } - } - - public void submit(Throwable e) { - String theErrReport = getDebugReport(e); - saveDebugReport(theErrReport); - //try to send file contents via email (need to do so via the UI thread) - mApp.runOnUiThread(this); - } - - public void uncaughtException(Thread t, Throwable e) { - submit(e); - //do not forget to pass this exception through up the chain - mDefaultUEH.uncaughtException(t,e); - } -} \ No newline at end of file