diff --git a/ExceptionReportViewer/.classpath b/ExceptionReportViewer/.classpath
new file mode 100644
index 0000000..6cdaec2
--- /dev/null
+++ b/ExceptionReportViewer/.classpath
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/ExceptionReportViewer/.project b/ExceptionReportViewer/.project
new file mode 100644
index 0000000..1c6635e
--- /dev/null
+++ b/ExceptionReportViewer/.project
@@ -0,0 +1,33 @@
+
+
+ ExceptionReportViewer
+
+
+
+
+
+ com.android.ide.eclipse.adt.ResourceManagerBuilder
+
+
+
+
+ com.android.ide.eclipse.adt.PreCompilerBuilder
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+ com.android.ide.eclipse.adt.ApkBuilder
+
+
+
+
+
+ com.android.ide.eclipse.adt.AndroidNature
+ org.eclipse.jdt.core.javanature
+
+
diff --git a/ExceptionReportViewer/AndroidManifest.xml b/ExceptionReportViewer/AndroidManifest.xml
new file mode 100644
index 0000000..2e00cbf
--- /dev/null
+++ b/ExceptionReportViewer/AndroidManifest.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ExceptionReportViewer/assets/exceptionhandler.properties b/ExceptionReportViewer/assets/exceptionhandler.properties
new file mode 100644
index 0000000..3d072f2
--- /dev/null
+++ b/ExceptionReportViewer/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/ExceptionReportViewer/bin/ExceptionReportViewer.apk b/ExceptionReportViewer/bin/ExceptionReportViewer.apk
new file mode 100644
index 0000000..77c46c2
Binary files /dev/null and b/ExceptionReportViewer/bin/ExceptionReportViewer.apk differ
diff --git a/ExceptionReportViewer/bin/classes.dex b/ExceptionReportViewer/bin/classes.dex
new file mode 100644
index 0000000..2ade5f3
Binary files /dev/null and b/ExceptionReportViewer/bin/classes.dex differ
diff --git a/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/ExceptionReportViewer/Main.class b/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/ExceptionReportViewer/Main.class
new file mode 100644
index 0000000..c4aea1d
Binary files /dev/null and b/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/ExceptionReportViewer/Main.class differ
diff --git a/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/ExceptionReportViewer/R$array.class b/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/ExceptionReportViewer/R$array.class
new file mode 100644
index 0000000..41d5911
Binary files /dev/null and b/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/ExceptionReportViewer/R$array.class differ
diff --git a/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/ExceptionReportViewer/R$attr.class b/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/ExceptionReportViewer/R$attr.class
new file mode 100644
index 0000000..2a5772c
Binary files /dev/null and b/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/ExceptionReportViewer/R$attr.class differ
diff --git a/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/ExceptionReportViewer/R$bool.class b/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/ExceptionReportViewer/R$bool.class
new file mode 100644
index 0000000..fd35f90
Binary files /dev/null and b/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/ExceptionReportViewer/R$bool.class differ
diff --git a/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/ExceptionReportViewer/R$color.class b/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/ExceptionReportViewer/R$color.class
new file mode 100644
index 0000000..99515db
Binary files /dev/null and b/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/ExceptionReportViewer/R$color.class differ
diff --git a/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/ExceptionReportViewer/R$dimen.class b/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/ExceptionReportViewer/R$dimen.class
new file mode 100644
index 0000000..b3ef400
Binary files /dev/null and b/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/ExceptionReportViewer/R$dimen.class differ
diff --git a/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/ExceptionReportViewer/R$drawable.class b/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/ExceptionReportViewer/R$drawable.class
new file mode 100644
index 0000000..b306176
Binary files /dev/null and b/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/ExceptionReportViewer/R$drawable.class differ
diff --git a/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/ExceptionReportViewer/R$id.class b/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/ExceptionReportViewer/R$id.class
new file mode 100644
index 0000000..a38910f
Binary files /dev/null and b/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/ExceptionReportViewer/R$id.class differ
diff --git a/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/ExceptionReportViewer/R$integer.class b/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/ExceptionReportViewer/R$integer.class
new file mode 100644
index 0000000..1ca1a09
Binary files /dev/null and b/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/ExceptionReportViewer/R$integer.class differ
diff --git a/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/ExceptionReportViewer/R$layout.class b/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/ExceptionReportViewer/R$layout.class
new file mode 100644
index 0000000..d42262d
Binary files /dev/null and b/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/ExceptionReportViewer/R$layout.class differ
diff --git a/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/ExceptionReportViewer/R$string.class b/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/ExceptionReportViewer/R$string.class
new file mode 100644
index 0000000..34ced2f
Binary files /dev/null and b/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/ExceptionReportViewer/R$string.class differ
diff --git a/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/ExceptionReportViewer/R$style.class b/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/ExceptionReportViewer/R$style.class
new file mode 100644
index 0000000..d9b4bed
Binary files /dev/null and b/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/ExceptionReportViewer/R$style.class differ
diff --git a/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/ExceptionReportViewer/R$styleable.class b/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/ExceptionReportViewer/R$styleable.class
new file mode 100644
index 0000000..8457167
Binary files /dev/null and b/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/ExceptionReportViewer/R$styleable.class differ
diff --git a/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/ExceptionReportViewer/R.class b/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/ExceptionReportViewer/R.class
new file mode 100644
index 0000000..2d81054
Binary files /dev/null and b/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/ExceptionReportViewer/R.class differ
diff --git a/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/ExceptionReportViewer/ReportAdapter$Holder.class b/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/ExceptionReportViewer/ReportAdapter$Holder.class
new file mode 100644
index 0000000..4621b90
Binary files /dev/null and b/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/ExceptionReportViewer/ReportAdapter$Holder.class differ
diff --git a/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/ExceptionReportViewer/ReportAdapter.class b/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/ExceptionReportViewer/ReportAdapter.class
new file mode 100644
index 0000000..b45b3a6
Binary files /dev/null and b/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/ExceptionReportViewer/ReportAdapter.class differ
diff --git a/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/ExceptionReportViewer/ReportListFragment$1.class b/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/ExceptionReportViewer/ReportListFragment$1.class
new file mode 100644
index 0000000..d2271c4
Binary files /dev/null and b/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/ExceptionReportViewer/ReportListFragment$1.class differ
diff --git a/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/ExceptionReportViewer/ReportListFragment$2.class b/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/ExceptionReportViewer/ReportListFragment$2.class
new file mode 100644
index 0000000..cadb83a
Binary files /dev/null and b/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/ExceptionReportViewer/ReportListFragment$2.class differ
diff --git a/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/ExceptionReportViewer/ReportListFragment.class b/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/ExceptionReportViewer/ReportListFragment.class
new file mode 100644
index 0000000..ea68fa3
Binary files /dev/null and b/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/ExceptionReportViewer/ReportListFragment.class differ
diff --git a/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/exception/R$array.class b/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/exception/R$array.class
new file mode 100644
index 0000000..3a63025
Binary files /dev/null and b/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/exception/R$array.class differ
diff --git a/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/exception/R$attr.class b/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/exception/R$attr.class
new file mode 100644
index 0000000..3d3d2a2
Binary files /dev/null and b/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/exception/R$attr.class differ
diff --git a/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/exception/R$bool.class b/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/exception/R$bool.class
new file mode 100644
index 0000000..a78fa76
Binary files /dev/null and b/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/exception/R$bool.class differ
diff --git a/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/exception/R$color.class b/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/exception/R$color.class
new file mode 100644
index 0000000..86878e6
Binary files /dev/null and b/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/exception/R$color.class differ
diff --git a/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/exception/R$dimen.class b/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/exception/R$dimen.class
new file mode 100644
index 0000000..5942010
Binary files /dev/null and b/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/exception/R$dimen.class differ
diff --git a/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/exception/R$drawable.class b/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/exception/R$drawable.class
new file mode 100644
index 0000000..c8f8033
Binary files /dev/null and b/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/exception/R$drawable.class differ
diff --git a/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/exception/R$id.class b/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/exception/R$id.class
new file mode 100644
index 0000000..29dbe52
Binary files /dev/null and b/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/exception/R$id.class differ
diff --git a/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/exception/R$integer.class b/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/exception/R$integer.class
new file mode 100644
index 0000000..04a3be1
Binary files /dev/null and b/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/exception/R$integer.class differ
diff --git a/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/exception/R$layout.class b/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/exception/R$layout.class
new file mode 100644
index 0000000..6195c18
Binary files /dev/null and b/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/exception/R$layout.class differ
diff --git a/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/exception/R$string.class b/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/exception/R$string.class
new file mode 100644
index 0000000..8945db9
Binary files /dev/null and b/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/exception/R$string.class differ
diff --git a/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/exception/R$style.class b/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/exception/R$style.class
new file mode 100644
index 0000000..bd8b458
Binary files /dev/null and b/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/exception/R$style.class differ
diff --git a/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/exception/R$styleable.class b/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/exception/R$styleable.class
new file mode 100644
index 0000000..1121e52
Binary files /dev/null and b/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/exception/R$styleable.class differ
diff --git a/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/exception/R.class b/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/exception/R.class
new file mode 100644
index 0000000..df574fe
Binary files /dev/null and b/ExceptionReportViewer/bin/classes/com/TwentyCodes/android/exception/R.class differ
diff --git a/ExceptionReportViewer/bin/classes/com/jakewharton/android/viewpagerindicator/FragmentAdapter.class b/ExceptionReportViewer/bin/classes/com/jakewharton/android/viewpagerindicator/FragmentAdapter.class
new file mode 100644
index 0000000..712ee26
Binary files /dev/null and b/ExceptionReportViewer/bin/classes/com/jakewharton/android/viewpagerindicator/FragmentAdapter.class differ
diff --git a/ExceptionReportViewer/bin/classes/com/jakewharton/android/viewpagerindicator/PageIndicator.class b/ExceptionReportViewer/bin/classes/com/jakewharton/android/viewpagerindicator/PageIndicator.class
new file mode 100644
index 0000000..4fb636e
Binary files /dev/null and b/ExceptionReportViewer/bin/classes/com/jakewharton/android/viewpagerindicator/PageIndicator.class differ
diff --git a/ExceptionReportViewer/bin/classes/com/jakewharton/android/viewpagerindicator/TitlePageIndicator$IndicatorStyle.class b/ExceptionReportViewer/bin/classes/com/jakewharton/android/viewpagerindicator/TitlePageIndicator$IndicatorStyle.class
new file mode 100644
index 0000000..ed918ea
Binary files /dev/null and b/ExceptionReportViewer/bin/classes/com/jakewharton/android/viewpagerindicator/TitlePageIndicator$IndicatorStyle.class differ
diff --git a/ExceptionReportViewer/bin/classes/com/jakewharton/android/viewpagerindicator/TitlePageIndicator$SavedState$1.class b/ExceptionReportViewer/bin/classes/com/jakewharton/android/viewpagerindicator/TitlePageIndicator$SavedState$1.class
new file mode 100644
index 0000000..ca836f8
Binary files /dev/null and b/ExceptionReportViewer/bin/classes/com/jakewharton/android/viewpagerindicator/TitlePageIndicator$SavedState$1.class differ
diff --git a/ExceptionReportViewer/bin/classes/com/jakewharton/android/viewpagerindicator/TitlePageIndicator$SavedState.class b/ExceptionReportViewer/bin/classes/com/jakewharton/android/viewpagerindicator/TitlePageIndicator$SavedState.class
new file mode 100644
index 0000000..ee289f3
Binary files /dev/null and b/ExceptionReportViewer/bin/classes/com/jakewharton/android/viewpagerindicator/TitlePageIndicator$SavedState.class differ
diff --git a/ExceptionReportViewer/bin/classes/com/jakewharton/android/viewpagerindicator/TitlePageIndicator.class b/ExceptionReportViewer/bin/classes/com/jakewharton/android/viewpagerindicator/TitlePageIndicator.class
new file mode 100644
index 0000000..e702663
Binary files /dev/null and b/ExceptionReportViewer/bin/classes/com/jakewharton/android/viewpagerindicator/TitlePageIndicator.class differ
diff --git a/ExceptionReportViewer/bin/classes/com/jakewharton/android/viewpagerindicator/TitleProvider.class b/ExceptionReportViewer/bin/classes/com/jakewharton/android/viewpagerindicator/TitleProvider.class
new file mode 100644
index 0000000..9f77b33
Binary files /dev/null and b/ExceptionReportViewer/bin/classes/com/jakewharton/android/viewpagerindicator/TitleProvider.class differ
diff --git a/ExceptionReportViewer/bin/classes/com/jakewharton/android/viewpagerindicator/TitledFragmentAdapter.class b/ExceptionReportViewer/bin/classes/com/jakewharton/android/viewpagerindicator/TitledFragmentAdapter.class
new file mode 100644
index 0000000..138b748
Binary files /dev/null and b/ExceptionReportViewer/bin/classes/com/jakewharton/android/viewpagerindicator/TitledFragmentAdapter.class differ
diff --git a/ExceptionReportViewer/bin/res/drawable-hdpi/ic_launcher.png b/ExceptionReportViewer/bin/res/drawable-hdpi/ic_launcher.png
new file mode 100644
index 0000000..c6d9781
Binary files /dev/null and b/ExceptionReportViewer/bin/res/drawable-hdpi/ic_launcher.png differ
diff --git a/ExceptionReportViewer/bin/res/drawable-ldpi/ic_launcher.png b/ExceptionReportViewer/bin/res/drawable-ldpi/ic_launcher.png
new file mode 100644
index 0000000..ef1e59e
Binary files /dev/null and b/ExceptionReportViewer/bin/res/drawable-ldpi/ic_launcher.png differ
diff --git a/ExceptionReportViewer/bin/res/drawable-mdpi/ic_launcher.png b/ExceptionReportViewer/bin/res/drawable-mdpi/ic_launcher.png
new file mode 100644
index 0000000..d4f0612
Binary files /dev/null and b/ExceptionReportViewer/bin/res/drawable-mdpi/ic_launcher.png differ
diff --git a/ExceptionReportViewer/bin/res/drawable-xhdpi/ic_launcher.png b/ExceptionReportViewer/bin/res/drawable-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..32f3b89
Binary files /dev/null and b/ExceptionReportViewer/bin/res/drawable-xhdpi/ic_launcher.png differ
diff --git a/ExceptionReportViewer/bin/resources.ap_ b/ExceptionReportViewer/bin/resources.ap_
new file mode 100644
index 0000000..4d22815
Binary files /dev/null and b/ExceptionReportViewer/bin/resources.ap_ differ
diff --git a/ExceptionReportViewer/gen/com/TwentyCodes/android/ExceptionReportViewer/R.java b/ExceptionReportViewer/gen/com/TwentyCodes/android/ExceptionReportViewer/R.java
new file mode 100644
index 0000000..5b864e0
--- /dev/null
+++ b/ExceptionReportViewer/gen/com/TwentyCodes/android/ExceptionReportViewer/R.java
@@ -0,0 +1,482 @@
+/* AUTO-GENERATED FILE. DO NOT MODIFY.
+ *
+ * This class was automatically generated by the
+ * aapt tool from the resource data it found. It
+ * should not be modified by hand.
+ */
+
+package com.TwentyCodes.android.ExceptionReportViewer;
+
+public final class R {
+ public static final class array {
+ public static final int titles=0x7f050000;
+ }
+ public static final class attr {
+ /**
Must be a reference to another resource, in the form "@[+][package:]type:name"
+or to a theme attribute in the form "?[package:][type:]name".
+ */
+ public static final int circlePageIndicatorStyle=0x7f010000;
+ /**
Must be a dimension value, which is a floating point number appended with a unit such as "14.5sp".
+Available units are: px (pixels), dp (density-independent pixels), sp (scaled pixels based on preferred font size),
+in (inches), mm (millimeters).
+
This may also be a reference to a resource (in the form
+"@[package:]type:name") or
+theme attribute (in the form
+"?[package:][type:]name")
+containing a value of this type.
+ */
+ public static final int clipPadding=0x7f010002;
+ /**
Must be a color value, in the form of "#rgb", "#argb",
+"#rrggbb", or "#aarrggbb".
+
This may also be a reference to a resource (in the form
+"@[package:]type:name") or
+theme attribute (in the form
+"?[package:][type:]name")
+containing a value of this type.
+ */
+ public static final int footerColor=0x7f010003;
+ /**
Must be a dimension value, which is a floating point number appended with a unit such as "14.5sp".
+Available units are: px (pixels), dp (density-independent pixels), sp (scaled pixels based on preferred font size),
+in (inches), mm (millimeters).
+
This may also be a reference to a resource (in the form
+"@[package:]type:name") or
+theme attribute (in the form
+"?[package:][type:]name")
+containing a value of this type.
+ */
+ public static final int footerIndicatorHeight=0x7f010006;
+ /**
Must be a dimension value, which is a floating point number appended with a unit such as "14.5sp".
+Available units are: px (pixels), dp (density-independent pixels), sp (scaled pixels based on preferred font size),
+in (inches), mm (millimeters).
+
This may also be a reference to a resource (in the form
+"@[package:]type:name") or
+theme attribute (in the form
+"?[package:][type:]name")
+containing a value of this type.
+ */
+ public static final int footerIndicatorPadding=0x7f010007;
+ /**
Must be one of the following constant values.
+
+
+
+
+| Constant | Value | Description |
+none | 0 | |
+triangle | 1 | |
+underline | 2 | |
+
+ */
+ public static final int footerIndicatorStyle=0x7f010005;
+ /** Must be a dimension value, which is a floating point number appended with a unit such as "14.5sp".
+Available units are: px (pixels), dp (density-independent pixels), sp (scaled pixels based on preferred font size),
+in (inches), mm (millimeters).
+
This may also be a reference to a resource (in the form
+"@[package:]type:name") or
+theme attribute (in the form
+"?[package:][type:]name")
+containing a value of this type.
+ */
+ public static final int footerIndicatorUnderlinePadding=0x7f010008;
+ /**
Must be a dimension value, which is a floating point number appended with a unit such as "14.5sp".
+Available units are: px (pixels), dp (density-independent pixels), sp (scaled pixels based on preferred font size),
+in (inches), mm (millimeters).
+
This may also be a reference to a resource (in the form
+"@[package:]type:name") or
+theme attribute (in the form
+"?[package:][type:]name")
+containing a value of this type.
+ */
+ public static final int footerLineHeight=0x7f010004;
+ /**
Must be a boolean value, either "true" or "false".
+
This may also be a reference to a resource (in the form
+"@[package:]type:name") or
+theme attribute (in the form
+"?[package:][type:]name")
+containing a value of this type.
+ */
+ public static final int selectedBold=0x7f01000a;
+ /**
Must be a color value, in the form of "#rgb", "#argb",
+"#rrggbb", or "#aarrggbb".
+
This may also be a reference to a resource (in the form
+"@[package:]type:name") or
+theme attribute (in the form
+"?[package:][type:]name")
+containing a value of this type.
+ */
+ public static final int selectedColor=0x7f010009;
+ /**
Must be a color value, in the form of "#rgb", "#argb",
+"#rrggbb", or "#aarrggbb".
+
This may also be a reference to a resource (in the form
+"@[package:]type:name") or
+theme attribute (in the form
+"?[package:][type:]name")
+containing a value of this type.
+ */
+ public static final int textColor=0x7f01000b;
+ /**
Must be a dimension value, which is a floating point number appended with a unit such as "14.5sp".
+Available units are: px (pixels), dp (density-independent pixels), sp (scaled pixels based on preferred font size),
+in (inches), mm (millimeters).
+
This may also be a reference to a resource (in the form
+"@[package:]type:name") or
+theme attribute (in the form
+"?[package:][type:]name")
+containing a value of this type.
+ */
+ public static final int textSize=0x7f01000c;
+ /**
Must be a dimension value, which is a floating point number appended with a unit such as "14.5sp".
+Available units are: px (pixels), dp (density-independent pixels), sp (scaled pixels based on preferred font size),
+in (inches), mm (millimeters).
+
This may also be a reference to a resource (in the form
+"@[package:]type:name") or
+theme attribute (in the form
+"?[package:][type:]name")
+containing a value of this type.
+ */
+ public static final int titlePadding=0x7f01000d;
+ /**
Must be a reference to another resource, in the form "@[+][package:]type:name"
+or to a theme attribute in the form "?[package:][type:]name".
+ */
+ public static final int titlePageIndicatorStyle=0x7f010001;
+ }
+ public static final class bool {
+ public static final int default_title_indicator_selected_bold=0x7f0a0000;
+ }
+ public static final class color {
+ public static final int default_title_indicator_footer_color=0x7f080000;
+ public static final int default_title_indicator_selected_color=0x7f080001;
+ public static final int default_title_indicator_text_color=0x7f080002;
+ }
+ public static final class dimen {
+ public static final int default_title_indicator_clip_padding=0x7f070000;
+ public static final int default_title_indicator_footer_indicator_height=0x7f070002;
+ public static final int default_title_indicator_footer_indicator_padding=0x7f070003;
+ public static final int default_title_indicator_footer_indicator_underline_padding=0x7f070004;
+ public static final int default_title_indicator_footer_line_height=0x7f070001;
+ public static final int default_title_indicator_text_size=0x7f070005;
+ public static final int default_title_indicator_title_padding=0x7f070006;
+ }
+ public static final class drawable {
+ public static final int ic_launcher=0x7f020000;
+ }
+ public static final class id {
+ public static final int app=0x7f060009;
+ public static final int description=0x7f060004;
+ public static final int exception_text=0x7f060006;
+ public static final int exception_title=0x7f060005;
+ public static final int id=0x7f060007;
+ public static final int indicator=0x7f06000b;
+ public static final int msg=0x7f06000a;
+ public static final int none=0x7f060000;
+ public static final int pager=0x7f06000c;
+ public static final int send=0x7f060003;
+ public static final int status=0x7f060008;
+ public static final int triangle=0x7f060001;
+ public static final int underline=0x7f060002;
+ }
+ public static final class integer {
+ public static final int default_title_indicator_footer_indicator_style=0x7f090000;
+ }
+ public static final class layout {
+ public static final int exception_activity=0x7f030000;
+ public static final int exception_list_item=0x7f030001;
+ public static final int list=0x7f030002;
+ public static final int list_item=0x7f030003;
+ public static final int main=0x7f030004;
+ }
+ public static final class string {
+ public static final int app_name=0x7f040007;
+ public static final int crash=0x7f040000;
+ public static final int description=0x7f040004;
+ public static final int hello=0x7f040006;
+ public static final int send=0x7f040003;
+ public static final int sending=0x7f040002;
+ public static final int sorry=0x7f040001;
+ public static final int version=0x7f040005;
+ }
+ public static final class style {
+ public static final int CustomTitlePageIndicator=0x7f0b0001;
+ public static final int StyledIndicators=0x7f0b0000;
+ /** Copyright (C) 2011 Jake Wharton Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
+ */
+ public static final int Theme_PageIndicatorDefaults=0x7f0b0002;
+ public static final int Widget_TitlePageIndicator=0x7f0b0003;
+ }
+ public static final class styleable {
+ /** Attributes that can be used with a TitlePageIndicator.
+
Includes the following attributes:
+
+
+
+ | Attribute | Description |
+ {@link #TitlePageIndicator_clipPadding com.TwentyCodes.android.ExceptionReportViewer:clipPadding} | |
+ {@link #TitlePageIndicator_footerColor com.TwentyCodes.android.ExceptionReportViewer:footerColor} | |
+ {@link #TitlePageIndicator_footerIndicatorHeight com.TwentyCodes.android.ExceptionReportViewer:footerIndicatorHeight} | |
+ {@link #TitlePageIndicator_footerIndicatorPadding com.TwentyCodes.android.ExceptionReportViewer:footerIndicatorPadding} | |
+ {@link #TitlePageIndicator_footerIndicatorStyle com.TwentyCodes.android.ExceptionReportViewer:footerIndicatorStyle} | |
+ {@link #TitlePageIndicator_footerIndicatorUnderlinePadding com.TwentyCodes.android.ExceptionReportViewer:footerIndicatorUnderlinePadding} | |
+ {@link #TitlePageIndicator_footerLineHeight com.TwentyCodes.android.ExceptionReportViewer:footerLineHeight} | |
+ {@link #TitlePageIndicator_selectedBold com.TwentyCodes.android.ExceptionReportViewer:selectedBold} | |
+ {@link #TitlePageIndicator_selectedColor com.TwentyCodes.android.ExceptionReportViewer:selectedColor} | |
+ {@link #TitlePageIndicator_textColor com.TwentyCodes.android.ExceptionReportViewer:textColor} | |
+ {@link #TitlePageIndicator_textSize com.TwentyCodes.android.ExceptionReportViewer:textSize} | |
+ {@link #TitlePageIndicator_titlePadding com.TwentyCodes.android.ExceptionReportViewer:titlePadding} | |
+
+ @see #TitlePageIndicator_clipPadding
+ @see #TitlePageIndicator_footerColor
+ @see #TitlePageIndicator_footerIndicatorHeight
+ @see #TitlePageIndicator_footerIndicatorPadding
+ @see #TitlePageIndicator_footerIndicatorStyle
+ @see #TitlePageIndicator_footerIndicatorUnderlinePadding
+ @see #TitlePageIndicator_footerLineHeight
+ @see #TitlePageIndicator_selectedBold
+ @see #TitlePageIndicator_selectedColor
+ @see #TitlePageIndicator_textColor
+ @see #TitlePageIndicator_textSize
+ @see #TitlePageIndicator_titlePadding
+ */
+ public static final int[] TitlePageIndicator = {
+ 0x7f010002, 0x7f010003, 0x7f010004, 0x7f010005,
+ 0x7f010006, 0x7f010007, 0x7f010008, 0x7f010009,
+ 0x7f01000a, 0x7f01000b, 0x7f01000c, 0x7f01000d
+ };
+ /**
+ This symbol is the offset where the {@link com.TwentyCodes.android.ExceptionReportViewer.R.attr#clipPadding}
+ attribute's value can be found in the {@link #TitlePageIndicator} array.
+
+
+
Must be a dimension value, which is a floating point number appended with a unit such as "14.5sp".
+Available units are: px (pixels), dp (density-independent pixels), sp (scaled pixels based on preferred font size),
+in (inches), mm (millimeters).
+
This may also be a reference to a resource (in the form
+"@[package:]type:name") or
+theme attribute (in the form
+"?[package:][type:]name")
+containing a value of this type.
+ @attr name android:clipPadding
+ */
+ public static final int TitlePageIndicator_clipPadding = 0;
+ /**
+
This symbol is the offset where the {@link com.TwentyCodes.android.ExceptionReportViewer.R.attr#footerColor}
+ attribute's value can be found in the {@link #TitlePageIndicator} array.
+
+
+
Must be a color value, in the form of "#rgb", "#argb",
+"#rrggbb", or "#aarrggbb".
+
This may also be a reference to a resource (in the form
+"@[package:]type:name") or
+theme attribute (in the form
+"?[package:][type:]name")
+containing a value of this type.
+ @attr name android:footerColor
+ */
+ public static final int TitlePageIndicator_footerColor = 1;
+ /**
+
This symbol is the offset where the {@link com.TwentyCodes.android.ExceptionReportViewer.R.attr#footerIndicatorHeight}
+ attribute's value can be found in the {@link #TitlePageIndicator} array.
+
+
+
Must be a dimension value, which is a floating point number appended with a unit such as "14.5sp".
+Available units are: px (pixels), dp (density-independent pixels), sp (scaled pixels based on preferred font size),
+in (inches), mm (millimeters).
+
This may also be a reference to a resource (in the form
+"@[package:]type:name") or
+theme attribute (in the form
+"?[package:][type:]name")
+containing a value of this type.
+ @attr name android:footerIndicatorHeight
+ */
+ public static final int TitlePageIndicator_footerIndicatorHeight = 4;
+ /**
+
This symbol is the offset where the {@link com.TwentyCodes.android.ExceptionReportViewer.R.attr#footerIndicatorPadding}
+ attribute's value can be found in the {@link #TitlePageIndicator} array.
+
+
+
Must be a dimension value, which is a floating point number appended with a unit such as "14.5sp".
+Available units are: px (pixels), dp (density-independent pixels), sp (scaled pixels based on preferred font size),
+in (inches), mm (millimeters).
+
This may also be a reference to a resource (in the form
+"@[package:]type:name") or
+theme attribute (in the form
+"?[package:][type:]name")
+containing a value of this type.
+ @attr name android:footerIndicatorPadding
+ */
+ public static final int TitlePageIndicator_footerIndicatorPadding = 5;
+ /**
+
This symbol is the offset where the {@link com.TwentyCodes.android.ExceptionReportViewer.R.attr#footerIndicatorStyle}
+ attribute's value can be found in the {@link #TitlePageIndicator} array.
+
+
+
Must be one of the following constant values.
+
+
+
+
+| Constant | Value | Description |
+none | 0 | |
+triangle | 1 | |
+underline | 2 | |
+
+ @attr name android:footerIndicatorStyle
+ */
+ public static final int TitlePageIndicator_footerIndicatorStyle = 3;
+ /**
+ This symbol is the offset where the {@link com.TwentyCodes.android.ExceptionReportViewer.R.attr#footerIndicatorUnderlinePadding}
+ attribute's value can be found in the {@link #TitlePageIndicator} array.
+
+
+
Must be a dimension value, which is a floating point number appended with a unit such as "14.5sp".
+Available units are: px (pixels), dp (density-independent pixels), sp (scaled pixels based on preferred font size),
+in (inches), mm (millimeters).
+
This may also be a reference to a resource (in the form
+"@[package:]type:name") or
+theme attribute (in the form
+"?[package:][type:]name")
+containing a value of this type.
+ @attr name android:footerIndicatorUnderlinePadding
+ */
+ public static final int TitlePageIndicator_footerIndicatorUnderlinePadding = 6;
+ /**
+
This symbol is the offset where the {@link com.TwentyCodes.android.ExceptionReportViewer.R.attr#footerLineHeight}
+ attribute's value can be found in the {@link #TitlePageIndicator} array.
+
+
+
Must be a dimension value, which is a floating point number appended with a unit such as "14.5sp".
+Available units are: px (pixels), dp (density-independent pixels), sp (scaled pixels based on preferred font size),
+in (inches), mm (millimeters).
+
This may also be a reference to a resource (in the form
+"@[package:]type:name") or
+theme attribute (in the form
+"?[package:][type:]name")
+containing a value of this type.
+ @attr name android:footerLineHeight
+ */
+ public static final int TitlePageIndicator_footerLineHeight = 2;
+ /**
+
This symbol is the offset where the {@link com.TwentyCodes.android.ExceptionReportViewer.R.attr#selectedBold}
+ attribute's value can be found in the {@link #TitlePageIndicator} array.
+
+
+
Must be a boolean value, either "true" or "false".
+
This may also be a reference to a resource (in the form
+"@[package:]type:name") or
+theme attribute (in the form
+"?[package:][type:]name")
+containing a value of this type.
+ @attr name android:selectedBold
+ */
+ public static final int TitlePageIndicator_selectedBold = 8;
+ /**
+
This symbol is the offset where the {@link com.TwentyCodes.android.ExceptionReportViewer.R.attr#selectedColor}
+ attribute's value can be found in the {@link #TitlePageIndicator} array.
+
+
+
Must be a color value, in the form of "#rgb", "#argb",
+"#rrggbb", or "#aarrggbb".
+
This may also be a reference to a resource (in the form
+"@[package:]type:name") or
+theme attribute (in the form
+"?[package:][type:]name")
+containing a value of this type.
+ @attr name android:selectedColor
+ */
+ public static final int TitlePageIndicator_selectedColor = 7;
+ /**
+
This symbol is the offset where the {@link com.TwentyCodes.android.ExceptionReportViewer.R.attr#textColor}
+ attribute's value can be found in the {@link #TitlePageIndicator} array.
+
+
+
Must be a color value, in the form of "#rgb", "#argb",
+"#rrggbb", or "#aarrggbb".
+
This may also be a reference to a resource (in the form
+"@[package:]type:name") or
+theme attribute (in the form
+"?[package:][type:]name")
+containing a value of this type.
+ @attr name android:textColor
+ */
+ public static final int TitlePageIndicator_textColor = 9;
+ /**
+
This symbol is the offset where the {@link com.TwentyCodes.android.ExceptionReportViewer.R.attr#textSize}
+ attribute's value can be found in the {@link #TitlePageIndicator} array.
+
+
+
Must be a dimension value, which is a floating point number appended with a unit such as "14.5sp".
+Available units are: px (pixels), dp (density-independent pixels), sp (scaled pixels based on preferred font size),
+in (inches), mm (millimeters).
+
This may also be a reference to a resource (in the form
+"@[package:]type:name") or
+theme attribute (in the form
+"?[package:][type:]name")
+containing a value of this type.
+ @attr name android:textSize
+ */
+ public static final int TitlePageIndicator_textSize = 10;
+ /**
+
This symbol is the offset where the {@link com.TwentyCodes.android.ExceptionReportViewer.R.attr#titlePadding}
+ attribute's value can be found in the {@link #TitlePageIndicator} array.
+
+
+
Must be a dimension value, which is a floating point number appended with a unit such as "14.5sp".
+Available units are: px (pixels), dp (density-independent pixels), sp (scaled pixels based on preferred font size),
+in (inches), mm (millimeters).
+
This may also be a reference to a resource (in the form
+"@[package:]type:name") or
+theme attribute (in the form
+"?[package:][type:]name")
+containing a value of this type.
+ @attr name android:titlePadding
+ */
+ public static final int TitlePageIndicator_titlePadding = 11;
+ /**
+ Copyright (C) 2011 Patrik Åkerfeldt
+ Copyright (C) 2011 Jake Wharton
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+
Includes the following attributes:
+
+
+
+ | Attribute | Description |
+ {@link #ViewPagerIndicator_circlePageIndicatorStyle com.TwentyCodes.android.ExceptionReportViewer:circlePageIndicatorStyle} | |
+ {@link #ViewPagerIndicator_titlePageIndicatorStyle com.TwentyCodes.android.ExceptionReportViewer:titlePageIndicatorStyle} | |
+
+ @see #ViewPagerIndicator_circlePageIndicatorStyle
+ @see #ViewPagerIndicator_titlePageIndicatorStyle
+ */
+ public static final int[] ViewPagerIndicator = {
+ 0x7f010000, 0x7f010001
+ };
+ /**
+ This symbol is the offset where the {@link com.TwentyCodes.android.ExceptionReportViewer.R.attr#circlePageIndicatorStyle}
+ attribute's value can be found in the {@link #ViewPagerIndicator} array.
+
+
+
Must be a reference to another resource, in the form "@[+][package:]type:name"
+or to a theme attribute in the form "?[package:][type:]name".
+ @attr name android:circlePageIndicatorStyle
+ */
+ public static final int ViewPagerIndicator_circlePageIndicatorStyle = 0;
+ /**
+
This symbol is the offset where the {@link com.TwentyCodes.android.ExceptionReportViewer.R.attr#titlePageIndicatorStyle}
+ attribute's value can be found in the {@link #ViewPagerIndicator} array.
+
+
+
Must be a reference to another resource, in the form "@[+][package:]type:name"
+or to a theme attribute in the form "?[package:][type:]name".
+ @attr name android:titlePageIndicatorStyle
+ */
+ public static final int ViewPagerIndicator_titlePageIndicatorStyle = 1;
+ };
+}
diff --git a/ExceptionReportViewer/gen/com/TwentyCodes/android/exception/R.java b/ExceptionReportViewer/gen/com/TwentyCodes/android/exception/R.java
new file mode 100644
index 0000000..44d6471
--- /dev/null
+++ b/ExceptionReportViewer/gen/com/TwentyCodes/android/exception/R.java
@@ -0,0 +1,482 @@
+/* AUTO-GENERATED FILE. DO NOT MODIFY.
+ *
+ * This class was automatically generated by the
+ * aapt tool from the resource data it found. It
+ * should not be modified by hand.
+ */
+
+package com.TwentyCodes.android.exception;
+
+public final class R {
+ public static final class array {
+ public static final int titles=0x7f050000;
+ }
+ public static final class attr {
+ /**
Must be a reference to another resource, in the form "@[+][package:]type:name"
+or to a theme attribute in the form "?[package:][type:]name".
+ */
+ public static final int circlePageIndicatorStyle=0x7f010000;
+ /**
Must be a dimension value, which is a floating point number appended with a unit such as "14.5sp".
+Available units are: px (pixels), dp (density-independent pixels), sp (scaled pixels based on preferred font size),
+in (inches), mm (millimeters).
+
This may also be a reference to a resource (in the form
+"@[package:]type:name") or
+theme attribute (in the form
+"?[package:][type:]name")
+containing a value of this type.
+ */
+ public static final int clipPadding=0x7f010002;
+ /**
Must be a color value, in the form of "#rgb", "#argb",
+"#rrggbb", or "#aarrggbb".
+
This may also be a reference to a resource (in the form
+"@[package:]type:name") or
+theme attribute (in the form
+"?[package:][type:]name")
+containing a value of this type.
+ */
+ public static final int footerColor=0x7f010003;
+ /**
Must be a dimension value, which is a floating point number appended with a unit such as "14.5sp".
+Available units are: px (pixels), dp (density-independent pixels), sp (scaled pixels based on preferred font size),
+in (inches), mm (millimeters).
+
This may also be a reference to a resource (in the form
+"@[package:]type:name") or
+theme attribute (in the form
+"?[package:][type:]name")
+containing a value of this type.
+ */
+ public static final int footerIndicatorHeight=0x7f010006;
+ /**
Must be a dimension value, which is a floating point number appended with a unit such as "14.5sp".
+Available units are: px (pixels), dp (density-independent pixels), sp (scaled pixels based on preferred font size),
+in (inches), mm (millimeters).
+
This may also be a reference to a resource (in the form
+"@[package:]type:name") or
+theme attribute (in the form
+"?[package:][type:]name")
+containing a value of this type.
+ */
+ public static final int footerIndicatorPadding=0x7f010007;
+ /**
Must be one of the following constant values.
+
+
+
+
+| Constant | Value | Description |
+none | 0 | |
+triangle | 1 | |
+underline | 2 | |
+
+ */
+ public static final int footerIndicatorStyle=0x7f010005;
+ /** Must be a dimension value, which is a floating point number appended with a unit such as "14.5sp".
+Available units are: px (pixels), dp (density-independent pixels), sp (scaled pixels based on preferred font size),
+in (inches), mm (millimeters).
+
This may also be a reference to a resource (in the form
+"@[package:]type:name") or
+theme attribute (in the form
+"?[package:][type:]name")
+containing a value of this type.
+ */
+ public static final int footerIndicatorUnderlinePadding=0x7f010008;
+ /**
Must be a dimension value, which is a floating point number appended with a unit such as "14.5sp".
+Available units are: px (pixels), dp (density-independent pixels), sp (scaled pixels based on preferred font size),
+in (inches), mm (millimeters).
+
This may also be a reference to a resource (in the form
+"@[package:]type:name") or
+theme attribute (in the form
+"?[package:][type:]name")
+containing a value of this type.
+ */
+ public static final int footerLineHeight=0x7f010004;
+ /**
Must be a boolean value, either "true" or "false".
+
This may also be a reference to a resource (in the form
+"@[package:]type:name") or
+theme attribute (in the form
+"?[package:][type:]name")
+containing a value of this type.
+ */
+ public static final int selectedBold=0x7f01000a;
+ /**
Must be a color value, in the form of "#rgb", "#argb",
+"#rrggbb", or "#aarrggbb".
+
This may also be a reference to a resource (in the form
+"@[package:]type:name") or
+theme attribute (in the form
+"?[package:][type:]name")
+containing a value of this type.
+ */
+ public static final int selectedColor=0x7f010009;
+ /**
Must be a color value, in the form of "#rgb", "#argb",
+"#rrggbb", or "#aarrggbb".
+
This may also be a reference to a resource (in the form
+"@[package:]type:name") or
+theme attribute (in the form
+"?[package:][type:]name")
+containing a value of this type.
+ */
+ public static final int textColor=0x7f01000b;
+ /**
Must be a dimension value, which is a floating point number appended with a unit such as "14.5sp".
+Available units are: px (pixels), dp (density-independent pixels), sp (scaled pixels based on preferred font size),
+in (inches), mm (millimeters).
+
This may also be a reference to a resource (in the form
+"@[package:]type:name") or
+theme attribute (in the form
+"?[package:][type:]name")
+containing a value of this type.
+ */
+ public static final int textSize=0x7f01000c;
+ /**
Must be a dimension value, which is a floating point number appended with a unit such as "14.5sp".
+Available units are: px (pixels), dp (density-independent pixels), sp (scaled pixels based on preferred font size),
+in (inches), mm (millimeters).
+
This may also be a reference to a resource (in the form
+"@[package:]type:name") or
+theme attribute (in the form
+"?[package:][type:]name")
+containing a value of this type.
+ */
+ public static final int titlePadding=0x7f01000d;
+ /**
Must be a reference to another resource, in the form "@[+][package:]type:name"
+or to a theme attribute in the form "?[package:][type:]name".
+ */
+ public static final int titlePageIndicatorStyle=0x7f010001;
+ }
+ public static final class bool {
+ public static final int default_title_indicator_selected_bold=0x7f0a0000;
+ }
+ public static final class color {
+ public static final int default_title_indicator_footer_color=0x7f080000;
+ public static final int default_title_indicator_selected_color=0x7f080001;
+ public static final int default_title_indicator_text_color=0x7f080002;
+ }
+ public static final class dimen {
+ public static final int default_title_indicator_clip_padding=0x7f070000;
+ public static final int default_title_indicator_footer_indicator_height=0x7f070002;
+ public static final int default_title_indicator_footer_indicator_padding=0x7f070003;
+ public static final int default_title_indicator_footer_indicator_underline_padding=0x7f070004;
+ public static final int default_title_indicator_footer_line_height=0x7f070001;
+ public static final int default_title_indicator_text_size=0x7f070005;
+ public static final int default_title_indicator_title_padding=0x7f070006;
+ }
+ public static final class drawable {
+ public static final int ic_launcher=0x7f020000;
+ }
+ public static final class id {
+ public static final int app=0x7f060009;
+ public static final int description=0x7f060004;
+ public static final int exception_text=0x7f060006;
+ public static final int exception_title=0x7f060005;
+ public static final int id=0x7f060007;
+ public static final int indicator=0x7f06000b;
+ public static final int msg=0x7f06000a;
+ public static final int none=0x7f060000;
+ public static final int pager=0x7f06000c;
+ public static final int send=0x7f060003;
+ public static final int status=0x7f060008;
+ public static final int triangle=0x7f060001;
+ public static final int underline=0x7f060002;
+ }
+ public static final class integer {
+ public static final int default_title_indicator_footer_indicator_style=0x7f090000;
+ }
+ public static final class layout {
+ public static final int exception_activity=0x7f030000;
+ public static final int exception_list_item=0x7f030001;
+ public static final int list=0x7f030002;
+ public static final int list_item=0x7f030003;
+ public static final int main=0x7f030004;
+ }
+ public static final class string {
+ public static final int app_name=0x7f040007;
+ public static final int crash=0x7f040000;
+ public static final int description=0x7f040004;
+ public static final int hello=0x7f040006;
+ public static final int send=0x7f040003;
+ public static final int sending=0x7f040002;
+ public static final int sorry=0x7f040001;
+ public static final int version=0x7f040005;
+ }
+ public static final class style {
+ public static final int CustomTitlePageIndicator=0x7f0b0001;
+ public static final int StyledIndicators=0x7f0b0000;
+ /** Copyright (C) 2011 Jake Wharton Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
+ */
+ public static final int Theme_PageIndicatorDefaults=0x7f0b0002;
+ public static final int Widget_TitlePageIndicator=0x7f0b0003;
+ }
+ public static final class styleable {
+ /** Attributes that can be used with a TitlePageIndicator.
+
Includes the following attributes:
+
+
+
+ | Attribute | Description |
+ {@link #TitlePageIndicator_clipPadding com.TwentyCodes.android.ExceptionReportViewer:clipPadding} | |
+ {@link #TitlePageIndicator_footerColor com.TwentyCodes.android.ExceptionReportViewer:footerColor} | |
+ {@link #TitlePageIndicator_footerIndicatorHeight com.TwentyCodes.android.ExceptionReportViewer:footerIndicatorHeight} | |
+ {@link #TitlePageIndicator_footerIndicatorPadding com.TwentyCodes.android.ExceptionReportViewer:footerIndicatorPadding} | |
+ {@link #TitlePageIndicator_footerIndicatorStyle com.TwentyCodes.android.ExceptionReportViewer:footerIndicatorStyle} | |
+ {@link #TitlePageIndicator_footerIndicatorUnderlinePadding com.TwentyCodes.android.ExceptionReportViewer:footerIndicatorUnderlinePadding} | |
+ {@link #TitlePageIndicator_footerLineHeight com.TwentyCodes.android.ExceptionReportViewer:footerLineHeight} | |
+ {@link #TitlePageIndicator_selectedBold com.TwentyCodes.android.ExceptionReportViewer:selectedBold} | |
+ {@link #TitlePageIndicator_selectedColor com.TwentyCodes.android.ExceptionReportViewer:selectedColor} | |
+ {@link #TitlePageIndicator_textColor com.TwentyCodes.android.ExceptionReportViewer:textColor} | |
+ {@link #TitlePageIndicator_textSize com.TwentyCodes.android.ExceptionReportViewer:textSize} | |
+ {@link #TitlePageIndicator_titlePadding com.TwentyCodes.android.ExceptionReportViewer:titlePadding} | |
+
+ @see #TitlePageIndicator_clipPadding
+ @see #TitlePageIndicator_footerColor
+ @see #TitlePageIndicator_footerIndicatorHeight
+ @see #TitlePageIndicator_footerIndicatorPadding
+ @see #TitlePageIndicator_footerIndicatorStyle
+ @see #TitlePageIndicator_footerIndicatorUnderlinePadding
+ @see #TitlePageIndicator_footerLineHeight
+ @see #TitlePageIndicator_selectedBold
+ @see #TitlePageIndicator_selectedColor
+ @see #TitlePageIndicator_textColor
+ @see #TitlePageIndicator_textSize
+ @see #TitlePageIndicator_titlePadding
+ */
+ public static final int[] TitlePageIndicator = {
+ 0x7f010002, 0x7f010003, 0x7f010004, 0x7f010005,
+ 0x7f010006, 0x7f010007, 0x7f010008, 0x7f010009,
+ 0x7f01000a, 0x7f01000b, 0x7f01000c, 0x7f01000d
+ };
+ /**
+ This symbol is the offset where the {@link com.TwentyCodes.android.ExceptionReportViewer.R.attr#clipPadding}
+ attribute's value can be found in the {@link #TitlePageIndicator} array.
+
+
+
Must be a dimension value, which is a floating point number appended with a unit such as "14.5sp".
+Available units are: px (pixels), dp (density-independent pixels), sp (scaled pixels based on preferred font size),
+in (inches), mm (millimeters).
+
This may also be a reference to a resource (in the form
+"@[package:]type:name") or
+theme attribute (in the form
+"?[package:][type:]name")
+containing a value of this type.
+ @attr name android:clipPadding
+ */
+ public static final int TitlePageIndicator_clipPadding = 0;
+ /**
+
This symbol is the offset where the {@link com.TwentyCodes.android.ExceptionReportViewer.R.attr#footerColor}
+ attribute's value can be found in the {@link #TitlePageIndicator} array.
+
+
+
Must be a color value, in the form of "#rgb", "#argb",
+"#rrggbb", or "#aarrggbb".
+
This may also be a reference to a resource (in the form
+"@[package:]type:name") or
+theme attribute (in the form
+"?[package:][type:]name")
+containing a value of this type.
+ @attr name android:footerColor
+ */
+ public static final int TitlePageIndicator_footerColor = 1;
+ /**
+
This symbol is the offset where the {@link com.TwentyCodes.android.ExceptionReportViewer.R.attr#footerIndicatorHeight}
+ attribute's value can be found in the {@link #TitlePageIndicator} array.
+
+
+
Must be a dimension value, which is a floating point number appended with a unit such as "14.5sp".
+Available units are: px (pixels), dp (density-independent pixels), sp (scaled pixels based on preferred font size),
+in (inches), mm (millimeters).
+
This may also be a reference to a resource (in the form
+"@[package:]type:name") or
+theme attribute (in the form
+"?[package:][type:]name")
+containing a value of this type.
+ @attr name android:footerIndicatorHeight
+ */
+ public static final int TitlePageIndicator_footerIndicatorHeight = 4;
+ /**
+
This symbol is the offset where the {@link com.TwentyCodes.android.ExceptionReportViewer.R.attr#footerIndicatorPadding}
+ attribute's value can be found in the {@link #TitlePageIndicator} array.
+
+
+
Must be a dimension value, which is a floating point number appended with a unit such as "14.5sp".
+Available units are: px (pixels), dp (density-independent pixels), sp (scaled pixels based on preferred font size),
+in (inches), mm (millimeters).
+
This may also be a reference to a resource (in the form
+"@[package:]type:name") or
+theme attribute (in the form
+"?[package:][type:]name")
+containing a value of this type.
+ @attr name android:footerIndicatorPadding
+ */
+ public static final int TitlePageIndicator_footerIndicatorPadding = 5;
+ /**
+
This symbol is the offset where the {@link com.TwentyCodes.android.ExceptionReportViewer.R.attr#footerIndicatorStyle}
+ attribute's value can be found in the {@link #TitlePageIndicator} array.
+
+
+
Must be one of the following constant values.
+
+
+
+
+| Constant | Value | Description |
+none | 0 | |
+triangle | 1 | |
+underline | 2 | |
+
+ @attr name android:footerIndicatorStyle
+ */
+ public static final int TitlePageIndicator_footerIndicatorStyle = 3;
+ /**
+ This symbol is the offset where the {@link com.TwentyCodes.android.ExceptionReportViewer.R.attr#footerIndicatorUnderlinePadding}
+ attribute's value can be found in the {@link #TitlePageIndicator} array.
+
+
+
Must be a dimension value, which is a floating point number appended with a unit such as "14.5sp".
+Available units are: px (pixels), dp (density-independent pixels), sp (scaled pixels based on preferred font size),
+in (inches), mm (millimeters).
+
This may also be a reference to a resource (in the form
+"@[package:]type:name") or
+theme attribute (in the form
+"?[package:][type:]name")
+containing a value of this type.
+ @attr name android:footerIndicatorUnderlinePadding
+ */
+ public static final int TitlePageIndicator_footerIndicatorUnderlinePadding = 6;
+ /**
+
This symbol is the offset where the {@link com.TwentyCodes.android.ExceptionReportViewer.R.attr#footerLineHeight}
+ attribute's value can be found in the {@link #TitlePageIndicator} array.
+
+
+
Must be a dimension value, which is a floating point number appended with a unit such as "14.5sp".
+Available units are: px (pixels), dp (density-independent pixels), sp (scaled pixels based on preferred font size),
+in (inches), mm (millimeters).
+
This may also be a reference to a resource (in the form
+"@[package:]type:name") or
+theme attribute (in the form
+"?[package:][type:]name")
+containing a value of this type.
+ @attr name android:footerLineHeight
+ */
+ public static final int TitlePageIndicator_footerLineHeight = 2;
+ /**
+
This symbol is the offset where the {@link com.TwentyCodes.android.ExceptionReportViewer.R.attr#selectedBold}
+ attribute's value can be found in the {@link #TitlePageIndicator} array.
+
+
+
Must be a boolean value, either "true" or "false".
+
This may also be a reference to a resource (in the form
+"@[package:]type:name") or
+theme attribute (in the form
+"?[package:][type:]name")
+containing a value of this type.
+ @attr name android:selectedBold
+ */
+ public static final int TitlePageIndicator_selectedBold = 8;
+ /**
+
This symbol is the offset where the {@link com.TwentyCodes.android.ExceptionReportViewer.R.attr#selectedColor}
+ attribute's value can be found in the {@link #TitlePageIndicator} array.
+
+
+
Must be a color value, in the form of "#rgb", "#argb",
+"#rrggbb", or "#aarrggbb".
+
This may also be a reference to a resource (in the form
+"@[package:]type:name") or
+theme attribute (in the form
+"?[package:][type:]name")
+containing a value of this type.
+ @attr name android:selectedColor
+ */
+ public static final int TitlePageIndicator_selectedColor = 7;
+ /**
+
This symbol is the offset where the {@link com.TwentyCodes.android.ExceptionReportViewer.R.attr#textColor}
+ attribute's value can be found in the {@link #TitlePageIndicator} array.
+
+
+
Must be a color value, in the form of "#rgb", "#argb",
+"#rrggbb", or "#aarrggbb".
+
This may also be a reference to a resource (in the form
+"@[package:]type:name") or
+theme attribute (in the form
+"?[package:][type:]name")
+containing a value of this type.
+ @attr name android:textColor
+ */
+ public static final int TitlePageIndicator_textColor = 9;
+ /**
+
This symbol is the offset where the {@link com.TwentyCodes.android.ExceptionReportViewer.R.attr#textSize}
+ attribute's value can be found in the {@link #TitlePageIndicator} array.
+
+
+
Must be a dimension value, which is a floating point number appended with a unit such as "14.5sp".
+Available units are: px (pixels), dp (density-independent pixels), sp (scaled pixels based on preferred font size),
+in (inches), mm (millimeters).
+
This may also be a reference to a resource (in the form
+"@[package:]type:name") or
+theme attribute (in the form
+"?[package:][type:]name")
+containing a value of this type.
+ @attr name android:textSize
+ */
+ public static final int TitlePageIndicator_textSize = 10;
+ /**
+
This symbol is the offset where the {@link com.TwentyCodes.android.ExceptionReportViewer.R.attr#titlePadding}
+ attribute's value can be found in the {@link #TitlePageIndicator} array.
+
+
+
Must be a dimension value, which is a floating point number appended with a unit such as "14.5sp".
+Available units are: px (pixels), dp (density-independent pixels), sp (scaled pixels based on preferred font size),
+in (inches), mm (millimeters).
+
This may also be a reference to a resource (in the form
+"@[package:]type:name") or
+theme attribute (in the form
+"?[package:][type:]name")
+containing a value of this type.
+ @attr name android:titlePadding
+ */
+ public static final int TitlePageIndicator_titlePadding = 11;
+ /**
+ Copyright (C) 2011 Patrik Åkerfeldt
+ Copyright (C) 2011 Jake Wharton
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+
Includes the following attributes:
+
+
+
+ | Attribute | Description |
+ {@link #ViewPagerIndicator_circlePageIndicatorStyle com.TwentyCodes.android.ExceptionReportViewer:circlePageIndicatorStyle} | |
+ {@link #ViewPagerIndicator_titlePageIndicatorStyle com.TwentyCodes.android.ExceptionReportViewer:titlePageIndicatorStyle} | |
+
+ @see #ViewPagerIndicator_circlePageIndicatorStyle
+ @see #ViewPagerIndicator_titlePageIndicatorStyle
+ */
+ public static final int[] ViewPagerIndicator = {
+ 0x7f010000, 0x7f010001
+ };
+ /**
+ This symbol is the offset where the {@link com.TwentyCodes.android.ExceptionReportViewer.R.attr#circlePageIndicatorStyle}
+ attribute's value can be found in the {@link #ViewPagerIndicator} array.
+
+
+
Must be a reference to another resource, in the form "@[+][package:]type:name"
+or to a theme attribute in the form "?[package:][type:]name".
+ @attr name android:circlePageIndicatorStyle
+ */
+ public static final int ViewPagerIndicator_circlePageIndicatorStyle = 0;
+ /**
+
This symbol is the offset where the {@link com.TwentyCodes.android.ExceptionReportViewer.R.attr#titlePageIndicatorStyle}
+ attribute's value can be found in the {@link #ViewPagerIndicator} array.
+
+
+
Must be a reference to another resource, in the form "@[+][package:]type:name"
+or to a theme attribute in the form "?[package:][type:]name".
+ @attr name android:titlePageIndicatorStyle
+ */
+ public static final int ViewPagerIndicator_titlePageIndicatorStyle = 1;
+ };
+}
diff --git a/ExceptionReportViewer/lint.xml b/ExceptionReportViewer/lint.xml
new file mode 100644
index 0000000..ee0eead
--- /dev/null
+++ b/ExceptionReportViewer/lint.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/ExceptionReportViewer/proguard.cfg b/ExceptionReportViewer/proguard.cfg
new file mode 100644
index 0000000..b1cdf17
--- /dev/null
+++ b/ExceptionReportViewer/proguard.cfg
@@ -0,0 +1,40 @@
+-optimizationpasses 5
+-dontusemixedcaseclassnames
+-dontskipnonpubliclibraryclasses
+-dontpreverify
+-verbose
+-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
+
+-keep public class * extends android.app.Activity
+-keep public class * extends android.app.Application
+-keep public class * extends android.app.Service
+-keep public class * extends android.content.BroadcastReceiver
+-keep public class * extends android.content.ContentProvider
+-keep public class * extends android.app.backup.BackupAgentHelper
+-keep public class * extends android.preference.Preference
+-keep public class com.android.vending.licensing.ILicensingService
+
+-keepclasseswithmembernames class * {
+ native ;
+}
+
+-keepclasseswithmembers class * {
+ public (android.content.Context, android.util.AttributeSet);
+}
+
+-keepclasseswithmembers class * {
+ public (android.content.Context, android.util.AttributeSet, int);
+}
+
+-keepclassmembers class * extends android.app.Activity {
+ public void *(android.view.View);
+}
+
+-keepclassmembers enum * {
+ public static **[] values();
+ public static ** valueOf(java.lang.String);
+}
+
+-keep class * implements android.os.Parcelable {
+ public static final android.os.Parcelable$Creator *;
+}
diff --git a/ExceptionReportViewer/project.properties b/ExceptionReportViewer/project.properties
new file mode 100644
index 0000000..ec60ec5
--- /dev/null
+++ b/ExceptionReportViewer/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.
+
+# Project target.
+target=android-15
+android.library.reference.1=../ExceptionHandlerLib
diff --git a/ExceptionReportViewer/res/drawable-hdpi/ic_launcher.png b/ExceptionReportViewer/res/drawable-hdpi/ic_launcher.png
new file mode 100644
index 0000000..362f19f
Binary files /dev/null and b/ExceptionReportViewer/res/drawable-hdpi/ic_launcher.png differ
diff --git a/ExceptionReportViewer/res/drawable-ldpi/ic_launcher.png b/ExceptionReportViewer/res/drawable-ldpi/ic_launcher.png
new file mode 100644
index 0000000..0f365f6
Binary files /dev/null and b/ExceptionReportViewer/res/drawable-ldpi/ic_launcher.png differ
diff --git a/ExceptionReportViewer/res/drawable-mdpi/ic_launcher.png b/ExceptionReportViewer/res/drawable-mdpi/ic_launcher.png
new file mode 100644
index 0000000..88809cc
Binary files /dev/null and b/ExceptionReportViewer/res/drawable-mdpi/ic_launcher.png differ
diff --git a/ExceptionReportViewer/res/drawable-xhdpi/ic_launcher.png b/ExceptionReportViewer/res/drawable-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..ebe985c
Binary files /dev/null and b/ExceptionReportViewer/res/drawable-xhdpi/ic_launcher.png differ
diff --git a/ExceptionReportViewer/res/layout/list_item.xml b/ExceptionReportViewer/res/layout/list_item.xml
new file mode 100644
index 0000000..89133a2
--- /dev/null
+++ b/ExceptionReportViewer/res/layout/list_item.xml
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ExceptionReportViewer/res/layout/main.xml b/ExceptionReportViewer/res/layout/main.xml
new file mode 100644
index 0000000..6856db2
--- /dev/null
+++ b/ExceptionReportViewer/res/layout/main.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ExceptionReportViewer/res/values/array.xml b/ExceptionReportViewer/res/values/array.xml
new file mode 100644
index 0000000..17cae17
--- /dev/null
+++ b/ExceptionReportViewer/res/values/array.xml
@@ -0,0 +1,9 @@
+
+
+
+
+ - Production
+ - Testing
+
+
+
\ No newline at end of file
diff --git a/ExceptionReportViewer/res/values/attrs.xml b/ExceptionReportViewer/res/values/attrs.xml
new file mode 100644
index 0000000..75afbe5
--- /dev/null
+++ b/ExceptionReportViewer/res/values/attrs.xml
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ExceptionReportViewer/res/values/defaults.xml b/ExceptionReportViewer/res/values/defaults.xml
new file mode 100644
index 0000000..1493c40
--- /dev/null
+++ b/ExceptionReportViewer/res/values/defaults.xml
@@ -0,0 +1,41 @@
+
+
+
+
+
+ 0dp
+
+ #FFFFFFFF
+
+ 1px
+
+ 1
+
+ 7dp
+ 5dp
+ 10dp
+
+ #FF99CC00
+
+ true
+
+ #FFFFFFFF
+
+ 18dp
+ 5dp
+
+
\ No newline at end of file
diff --git a/ExceptionReportViewer/res/values/strings.xml b/ExceptionReportViewer/res/values/strings.xml
new file mode 100644
index 0000000..c688b6e
--- /dev/null
+++ b/ExceptionReportViewer/res/values/strings.xml
@@ -0,0 +1,7 @@
+
+
+
+ Hello World, Main!
+ ExceptionReportViewer
+
+
\ No newline at end of file
diff --git a/ExceptionReportViewer/res/values/styles.xml b/ExceptionReportViewer/res/values/styles.xml
new file mode 100644
index 0000000..92d1f85
--- /dev/null
+++ b/ExceptionReportViewer/res/values/styles.xml
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ExceptionReportViewer/src/com/TwentyCodes/android/ExceptionReportViewer/Main.java b/ExceptionReportViewer/src/com/TwentyCodes/android/ExceptionReportViewer/Main.java
new file mode 100644
index 0000000..131fd24
--- /dev/null
+++ b/ExceptionReportViewer/src/com/TwentyCodes/android/ExceptionReportViewer/Main.java
@@ -0,0 +1,59 @@
+package com.TwentyCodes.android.ExceptionReportViewer;
+
+import java.util.ArrayList;
+
+import com.TwentyCodes.android.exception.ExceptionHandler;
+import com.jakewharton.android.viewpagerindicator.TitlePageIndicator;
+import com.jakewharton.android.viewpagerindicator.TitledFragmentAdapter;
+
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentActivity;
+import android.support.v4.view.ViewPager;
+
+/**
+ * This is the main activity of this application.
+ * This application will be used to download and display the exception reports from a server.
+ *
+ * TODO Create settings activity and implement the following settings
+ * + production url
+ * + testing url
+ * + version preference
+ *
+ * TODO Create icons for titled view pager
+ *
+ * TODO Update ReportListFragment to a dynamically load 10 reports, and retrieve more when necessary.
+ * This will probably also entail server side changes
+ *
+ * @author ricky barrette
+ */
+public class Main extends FragmentActivity {
+
+
+ /** Called when the activity is first created. */
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ Thread.setDefaultUncaughtExceptionHandler(new ExceptionHandler(this));
+ setContentView(R.layout.main);
+
+ ArrayList fragments = new ArrayList();
+ fragments.add(new ReportListFragment("http://powers.doesntexist.com:666/?get=1"));
+ fragments.add(new ReportListFragment("http://powers.doesntexist.com:666/testing/?get=1"));
+
+ //the icons for the pages go here
+ int[] icons = new int[]{
+ //TODO create icons and update
+ android.R.drawable.stat_sys_warning,
+ android.R.drawable.stat_sys_warning
+ };
+
+ //display the pages
+ ViewPager pager = (ViewPager) findViewById(R.id.pager);
+ pager.setAdapter(new TitledFragmentAdapter(this.getSupportFragmentManager(), fragments, this.getResources().getStringArray(R.array.titles), icons));
+
+ //display the titles
+ TitlePageIndicator indicator = (TitlePageIndicator) findViewById(R.id.indicator);
+ indicator.setViewPager(pager);
+ }
+}
\ No newline at end of file
diff --git a/ExceptionReportViewer/src/com/TwentyCodes/android/ExceptionReportViewer/ReportAdapter.java b/ExceptionReportViewer/src/com/TwentyCodes/android/ExceptionReportViewer/ReportAdapter.java
new file mode 100644
index 0000000..780943e
--- /dev/null
+++ b/ExceptionReportViewer/src/com/TwentyCodes/android/ExceptionReportViewer/ReportAdapter.java
@@ -0,0 +1,155 @@
+/**
+ * ReportAdapter.java
+ * @date Dec 19, 2011
+ * @author ricky barrette
+ * @author Twenty Codes, LLC
+ */
+package com.TwentyCodes.android.ExceptionReportViewer;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import android.content.Context;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+import android.widget.TextView;
+
+/**
+ * This adaptor will be used to populate a listview with report titles provided
+ * a JSONArray
+ *
+ * @author ricky barrette
+ */
+public class ReportAdapter extends BaseAdapter {
+
+ private static final String TAG = "ReportAdapter";
+ private JSONArray mReports;
+ private LayoutInflater mInflater;
+
+ /**
+ * Creates a new ReportAdator
+ *
+ * @author ricky barrette
+ */
+ public ReportAdapter(Context context, JSONArray reports) {
+ mReports = reports;
+ mInflater = LayoutInflater.from(context);
+ }
+
+ /**
+ * returns the amount of reports in the reports JSONArray (non-Javadoc)
+ *
+ * @see android.widget.Adapter#getCount()
+ */
+ @Override
+ public int getCount() {
+ return mReports.length();
+ }
+
+ /**
+ * returns the report at index
+ *
+ * @param index
+ * (non-Javadoc)
+ * @see android.widget.Adapter#getItem(int)
+ */
+ @Override
+ public JSONObject getItem(int position) {
+ try {
+ return mReports.getJSONObject(position);
+ } catch (JSONException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ /**
+ * (non-Javadoc)
+ *
+ * @see android.widget.Adapter#getItemId(int)
+ */
+ @Override
+ public long getItemId(int position) {
+ return position;
+ }
+
+ /**
+ * this method will be used to populate the views (non-Javadoc)
+ *
+ * @see android.widget.Adapter#getView(int, android.view.View,
+ * android.view.ViewGroup)
+ */
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+ /*
+ * here we will only create new views when needed, and recycle old ones
+ * when provided
+ */
+ Holder holder;
+ if (convertView == null) {
+ convertView = mInflater.inflate(R.layout.list_item, null);
+ holder = new Holder();
+ holder.id = (TextView) convertView.findViewById(R.id.id);
+ holder.msg = (TextView) convertView.findViewById(R.id.msg);
+ holder.status = (TextView) convertView.findViewById(R.id.status);
+ holder.app = (TextView) convertView.findViewById(R.id.app);
+
+ convertView.setTag(holder);
+ } else {
+ holder = (Holder) convertView.getTag();
+ }
+
+ /*
+ * here we will populate the views
+ */
+ JSONObject report = null;
+ try {
+ report = getItem(position).getJSONObject("report");
+ } catch (JSONException e1) {
+ e1.printStackTrace();
+ }
+
+ Log.d(TAG, report.toString());
+
+ try {
+ holder.id.setText(report.getString("id"));
+ } catch (JSONException e) {
+ holder.id.setText(e.getMessage());
+ }
+ try {
+ holder.msg.setText(report.getString("msg"));
+ } catch (JSONException e) {
+ holder.msg.setText(e.getMessage());
+ }
+ try {
+ holder.status.setText(report.getString("status"));
+ } catch (JSONException e) {
+ holder.status.setText(e.getMessage());
+ }
+ try {
+ holder.app.setText(report.getString("app"));
+ } catch (JSONException e) {
+ holder.app.setText(e.getMessage());
+ }
+
+ return convertView;
+ }
+
+ /**
+ * This simple class will be used to hold views, so they can be recycled
+ *
+ * @author ricky barrette
+ */
+ class Holder {
+ TextView id;
+ TextView status;
+ TextView msg;
+ TextView app;
+ }
+
+}
diff --git a/ExceptionReportViewer/src/com/TwentyCodes/android/ExceptionReportViewer/ReportListFragment.java b/ExceptionReportViewer/src/com/TwentyCodes/android/ExceptionReportViewer/ReportListFragment.java
new file mode 100644
index 0000000..eb525a3
--- /dev/null
+++ b/ExceptionReportViewer/src/com/TwentyCodes/android/ExceptionReportViewer/ReportListFragment.java
@@ -0,0 +1,147 @@
+/**
+ * ReportListFragment.java
+ * @date Dec 19, 2011
+ * @author ricky barrette
+ * @author Twenty Codes, LLC
+ */
+package com.TwentyCodes.android.ExceptionReportViewer;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+import org.apache.http.client.ClientProtocolException;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.impl.client.DefaultHttpClient;
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import com.TwentyCodes.android.exception.ExceptionReportActivity;
+import com.TwentyCodes.android.exception.Report;
+
+import android.content.Intent;
+import android.os.Handler;
+import android.os.Message;
+import android.support.v4.app.ListFragment;
+import android.view.View;
+import android.widget.ListView;
+import android.widget.Toast;
+
+/**
+ * This fragment will be used to display a list of exception reports to the user
+ * @author ricky barrette
+ */
+public class ReportListFragment extends ListFragment {
+
+ protected static final int DOWNLOADED_REPORTS = 0;
+ protected static final int ERROR = 1;
+ private JSONArray mReports;
+
+ /**
+ * Creates a new ReportListFragment
+ * @param url of server
+ * @author ricky barrette
+ */
+ public ReportListFragment(final String url) {
+
+ final Handler handler = new Handler(){
+
+ /**
+ * (non-Javadoc)
+ * @see android.os.Handler#handleMessage(android.os.Message)
+ */
+ @Override
+ public void handleMessage(Message msg) {
+ switch(msg.what){
+ case DOWNLOADED_REPORTS:
+ try {
+ parseJSON((String) msg.obj);
+ } catch (JSONException e) {
+ ReportListFragment.this.setEmptyText(e.getMessage());
+ e.printStackTrace();
+ }
+ break;
+ case ERROR:
+ ReportListFragment.this.setEmptyText((String) msg.obj);
+ break;
+
+ }
+ super.handleMessage(msg);
+ }
+
+ };
+
+ new Thread(new Runnable(){
+ @Override
+ public void run(){
+ /*
+ * Here we will try to download and parse the reports from the server
+ * if there is any errors, the user is notified via the list's empty text view
+ */
+ try {
+ handler.sendMessage(handler.obtainMessage(DOWNLOADED_REPORTS, downloadJSON(url)));
+ } catch (IllegalStateException e) {
+ handler.sendMessage(handler.obtainMessage(ERROR, e.getMessage()));
+ e.printStackTrace();
+ } catch (ClientProtocolException e) {
+ handler.sendMessage(handler.obtainMessage(ERROR, e.getMessage()));
+ e.printStackTrace();
+ } catch (IOException e) {
+ handler.sendMessage(handler.obtainMessage(ERROR, e.getMessage()));
+ e.printStackTrace();
+ }
+
+ }
+ }).start();
+ }
+
+ /**
+ * parses the JSON reports and displays them in a list
+ * @param json
+ * @throws JSONException
+ * @author ricky barrette
+ */
+ private void parseJSON(String json) throws JSONException {
+ mReports = new JSONObject(json).getJSONArray("reports");
+ this.setListAdapter(new ReportAdapter(this.getActivity(), mReports));
+ }
+
+ /**
+ * Downloads exception report JSON from the Internet
+ * @param url
+ * @return
+ * @throws IllegalStateException
+ * @throws ClientProtocolException
+ * @throws IOException
+ * @author ricky barrette
+ */
+ private String downloadJSON(String url) throws IllegalStateException, ClientProtocolException, IOException {
+ if(url == null)
+ throw new NullPointerException();
+ StringBuffer response = new StringBuffer();
+ BufferedReader br = new BufferedReader(new InputStreamReader(new DefaultHttpClient().execute(new HttpGet(url)).getEntity().getContent()));
+ String buff = null;
+ while ((buff = br.readLine()) != null){
+ System.out.print(buff);
+ response.append(buff);
+ }
+ return response.toString();
+ }
+
+ /**
+ * Called when the user selects a report to display
+ * (non-Javadoc)
+ * @see android.support.v4.app.ListFragment#onListItemClick(android.widget.ListView, android.view.View, int, long)
+ */
+ @Override
+ public void onListItemClick(ListView l, View v, int position, long id) {
+ try {
+ this.startActivity(new Intent(this.getActivity(), ExceptionReportActivity.class)
+ .putExtra("display", true)
+ .putExtra("report", new Report("").generateReport(mReports.getJSONObject(position).getJSONObject("report"))));
+ } catch (JSONException e) {
+ Toast.makeText(this.getActivity().getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show();
+ }
+ }
+}
\ No newline at end of file
diff --git a/ExceptionReportViewer/src/com/jakewharton/android/viewpagerindicator/FragmentAdapter.java b/ExceptionReportViewer/src/com/jakewharton/android/viewpagerindicator/FragmentAdapter.java
new file mode 100644
index 0000000..451924b
--- /dev/null
+++ b/ExceptionReportViewer/src/com/jakewharton/android/viewpagerindicator/FragmentAdapter.java
@@ -0,0 +1,45 @@
+/**
+ * FragmentAdapter.java
+ * @date Aug 6, 2011
+ * @author Twenty Codes, LLC
+ * @author ricky barrette
+ */
+package com.jakewharton.android.viewpagerindicator;
+
+import java.util.ArrayList;
+
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentManager;
+import android.support.v4.app.FragmentPagerAdapter;
+
+/**
+ * This adaptor maintains the How and What fragments
+ * @author ricky
+ */
+class FragmentAdapter extends FragmentPagerAdapter {
+
+ private ArrayList mFragments;
+
+ /**
+ * Creates a new FragmentAdaptor
+ * @param fm
+ * @param fragments to be displayed
+ * @author ricky barrette
+ */
+ public FragmentAdapter(FragmentManager fm, ArrayList fragments) {
+ super(fm);
+ this.mFragments = fragments;
+ }
+
+ @Override
+ public Fragment getItem(int position) {
+ return this.mFragments.get(position);
+ }
+
+ @Override
+ public int getCount() {
+ return this.mFragments.size();
+ }
+
+
+}
\ No newline at end of file
diff --git a/ExceptionReportViewer/src/com/jakewharton/android/viewpagerindicator/PageIndicator.java b/ExceptionReportViewer/src/com/jakewharton/android/viewpagerindicator/PageIndicator.java
new file mode 100644
index 0000000..f965233
--- /dev/null
+++ b/ExceptionReportViewer/src/com/jakewharton/android/viewpagerindicator/PageIndicator.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2011 Patrik Akerfeldt
+ * Copyright (C) 2011 Jake Wharton
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.jakewharton.android.viewpagerindicator;
+
+import android.support.v4.view.ViewPager;
+
+/**
+ * A PageIndicator is responsible to show an visual indicator on the total views
+ * number and the current visible view.
+ */
+public interface PageIndicator extends ViewPager.OnPageChangeListener {
+ /**
+ * Bind the indicator to a ViewPager.
+ *
+ * @param view
+ */
+ public void setViewPager(ViewPager view);
+
+ /**
+ * Bind the indicator to a ViewPager.
+ *
+ * @param view
+ * @param initialPosition
+ */
+ public void setViewPager(ViewPager view, int initialPosition);
+
+ /**
+ * Set the current page of both the ViewPager and indicator.
+ *
+ * This must be used if you need to set the page before
+ * the views are drawn on screen (e.g., default start page).
+ *
+ * @param item
+ */
+ public void setCurrentItem(int item);
+
+ /**
+ * Set a page change listener which will receive forwarded events.
+ *
+ * @param listener
+ */
+ public void setOnPageChangeListener(ViewPager.OnPageChangeListener listener);
+}
diff --git a/ExceptionReportViewer/src/com/jakewharton/android/viewpagerindicator/TitlePageIndicator.java b/ExceptionReportViewer/src/com/jakewharton/android/viewpagerindicator/TitlePageIndicator.java
new file mode 100644
index 0000000..f08c314
--- /dev/null
+++ b/ExceptionReportViewer/src/com/jakewharton/android/viewpagerindicator/TitlePageIndicator.java
@@ -0,0 +1,640 @@
+/*
+ * Copyright (C) 2011 Patrik Akerfeldt
+ * Copyright (C) 2011 Francisco Figueiredo Jr.
+ * Copyright (C) 2011 Jake Wharton
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.jakewharton.android.viewpagerindicator;
+
+import java.util.ArrayList;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.Path;
+import android.graphics.Rect;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.support.v4.view.ViewPager;
+import android.util.AttributeSet;
+import android.view.MotionEvent;
+import android.view.View;
+import android.widget.TextView;
+
+import com.TwentyCodes.android.exception.R;
+
+/**
+ * A TitlePageIndicator is a PageIndicator which displays the title of left view
+ * (if exist), the title of the current select view (centered) and the title of
+ * the right view (if exist). When the user scrolls the ViewPager then titles are
+ * also scrolled.
+ */
+public class TitlePageIndicator extends TextView implements PageIndicator, View.OnTouchListener {
+ private static final float UNDERLINE_FADE_PERCENTAGE = 0.25f;
+
+ public enum IndicatorStyle {
+ None(0), Triangle(1), Underline(2);
+
+ public final int value;
+
+ private IndicatorStyle(int value) {
+ this.value = value;
+ }
+
+ public static IndicatorStyle fromValue(int value) {
+ for (IndicatorStyle style : IndicatorStyle.values()) {
+ if (style.value == value) {
+ return style;
+ }
+ }
+ return null;
+ }
+ }
+
+ private ViewPager mViewPager;
+ private ViewPager.OnPageChangeListener mListener;
+ private TitleProvider mTitleProvider;
+ private int mCurrentPage;
+ private int mCurrentOffset;
+ private final Paint mPaintText;
+ private final Paint mPaintSelected;
+ private Path mPath;
+ private final Paint mPaintFooterLine;
+ private IndicatorStyle mFooterIndicatorStyle;
+ private final Paint mPaintFooterIndicator;
+ private float mFooterIndicatorHeight;
+ private float mFooterIndicatorPadding;
+ private float mFooterIndicatorUnderlinePadding;
+ private float mTitlePadding;
+ /** Left and right side padding for not active view titles. */
+ private float mClipPadding;
+ private float mFooterLineHeight;
+
+
+ public TitlePageIndicator(Context context) {
+ this(context, null);
+ }
+
+ public TitlePageIndicator(Context context, AttributeSet attrs) {
+ this(context, attrs, R.attr.titlePageIndicatorStyle);
+ }
+
+ public TitlePageIndicator(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ super.setOnTouchListener(this);
+
+ //Load defaults from resources
+ final Resources res = getResources();
+ final int defaultFooterColor = res.getColor(R.color.default_title_indicator_footer_color);
+ final float defaultFooterLineHeight = res.getDimension(R.dimen.default_title_indicator_footer_line_height);
+ final int defaultFooterIndicatorStyle = res.getInteger(R.integer.default_title_indicator_footer_indicator_style);
+ final float defaultFooterIndicatorHeight = res.getDimension(R.dimen.default_title_indicator_footer_indicator_height);
+ final float defaultFooterIndicatorPadding = res.getDimension(R.dimen.default_title_indicator_footer_indicator_padding);
+ final float defaultFooterIndicatorUnderlinePadding = res.getDimension(R.dimen.default_title_indicator_footer_indicator_underline_padding);
+ final int defaultSelectedColor = res.getColor(R.color.default_title_indicator_selected_color);
+ final boolean defaultSelectedBold = res.getBoolean(R.bool.default_title_indicator_selected_bold);
+ final int defaultTextColor = res.getColor(R.color.default_title_indicator_text_color);
+ final float defaultTextSize = res.getDimension(R.dimen.default_title_indicator_text_size);
+ final float defaultTitlePadding = res.getDimension(R.dimen.default_title_indicator_title_padding);
+ final float defaultClipPadding = res.getDimension(R.dimen.default_title_indicator_clip_padding);
+
+ //Retrieve styles attributes
+ TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.TitlePageIndicator, defStyle, R.style.Widget_TitlePageIndicator);
+
+ //Retrieve the colors to be used for this view and apply them.
+ mFooterLineHeight = a.getDimension(R.styleable.TitlePageIndicator_footerLineHeight, defaultFooterLineHeight);
+ mFooterIndicatorStyle = IndicatorStyle.fromValue(a.getInteger(R.styleable.TitlePageIndicator_footerIndicatorStyle, defaultFooterIndicatorStyle));
+ mFooterIndicatorHeight = a.getDimension(R.styleable.TitlePageIndicator_footerIndicatorHeight, defaultFooterIndicatorHeight);
+ mFooterIndicatorPadding = a.getDimension(R.styleable.TitlePageIndicator_footerIndicatorPadding, defaultFooterIndicatorPadding);
+ mFooterIndicatorUnderlinePadding = a.getDimension(R.styleable.TitlePageIndicator_footerIndicatorUnderlinePadding, defaultFooterIndicatorUnderlinePadding);
+ mTitlePadding = a.getDimension(R.styleable.TitlePageIndicator_titlePadding, defaultTitlePadding);
+ mClipPadding = a.getDimension(R.styleable.TitlePageIndicator_clipPadding, defaultClipPadding);
+
+ final float textSize = a.getDimension(R.styleable.TitlePageIndicator_textSize, defaultTextSize);
+ final int footerColor = a.getColor(R.styleable.TitlePageIndicator_footerColor, defaultFooterColor);
+ mPaintText = new Paint();
+ mPaintText.setColor(a.getColor(R.styleable.TitlePageIndicator_textColor, defaultTextColor));
+ mPaintText.setTextSize(textSize);
+ mPaintText.setAntiAlias(true);
+ mPaintSelected = new Paint();
+ mPaintSelected.setColor(a.getColor(R.styleable.TitlePageIndicator_selectedColor, defaultSelectedColor));
+ mPaintSelected.setTextSize(textSize);
+ mPaintSelected.setFakeBoldText(a.getBoolean(R.styleable.TitlePageIndicator_selectedBold, defaultSelectedBold));
+ mPaintSelected.setAntiAlias(true);
+ mPaintFooterLine = new Paint();
+ mPaintFooterLine.setStyle(Paint.Style.FILL_AND_STROKE);
+ mPaintFooterLine.setStrokeWidth(mFooterLineHeight);
+ mPaintFooterLine.setColor(footerColor);
+ mPaintFooterIndicator = new Paint();
+ mPaintFooterIndicator.setStyle(Paint.Style.FILL_AND_STROKE);
+ mPaintFooterIndicator.setColor(footerColor);
+
+ a.recycle();
+ }
+
+
+ public int getFooterColor() {
+ return mPaintFooterLine.getColor();
+ }
+
+ public void setFooterColor(int footerColor) {
+ mPaintFooterLine.setColor(footerColor);
+ invalidate();
+ }
+
+ public float getFooterLineHeight() {
+ return mFooterLineHeight;
+ }
+
+ public void setFooterLineHeight(float footerLineHeight) {
+ mFooterLineHeight = footerLineHeight;
+ invalidate();
+ }
+
+ public float getFooterIndicatorHeight() {
+ return mFooterIndicatorHeight;
+ }
+
+ public void setFooterIndicatorHeight(float footerTriangleHeight) {
+ mFooterIndicatorHeight = footerTriangleHeight;
+ invalidate();
+ }
+
+ public IndicatorStyle getFooterIndicatorStyle() {
+ return mFooterIndicatorStyle;
+ }
+
+ public void setFooterIndicatorStyle(IndicatorStyle indicatorStyle) {
+ mFooterIndicatorStyle = indicatorStyle;
+ invalidate();
+ }
+
+ public int getSelectedColor() {
+ return mPaintSelected.getColor();
+ }
+
+ public void setSelectedColor(int selectedColor) {
+ mPaintSelected.setColor(selectedColor);
+ invalidate();
+ }
+
+ public boolean isSelectedBold() {
+ return mPaintSelected.isFakeBoldText();
+ }
+
+ public void setSelectedBold(boolean selectedBold) {
+ mPaintSelected.setFakeBoldText(selectedBold);
+ invalidate();
+ }
+
+ public int getTextColor() {
+ return mPaintText.getColor();
+ }
+
+ public void setTextColor(int textColor) {
+ mPaintText.setColor(textColor);
+ invalidate();
+ }
+
+ public float getTextSize() {
+ return mPaintText.getTextSize();
+ }
+
+ public void setTextSize(float textSize) {
+ mPaintText.setTextSize(textSize);
+ invalidate();
+ }
+
+ public float getTitlePadding() {
+ return this.mTitlePadding;
+ }
+
+ public void setTitlePadding(float titlePadding) {
+ mTitlePadding = titlePadding;
+ invalidate();
+ }
+
+ public float getClipPadding() {
+ return this.mClipPadding;
+ }
+
+ public void setClipPadding(float clipPadding) {
+ mClipPadding = clipPadding;
+ invalidate();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see android.view.View#onDraw(android.graphics.Canvas)
+ */
+ @Override
+ protected void onDraw(Canvas canvas) {
+ super.onDraw(canvas);
+
+ //Calculate views bounds
+ ArrayList bounds = calculateAllBounds(mPaintText);
+
+ final int count = mViewPager.getAdapter().getCount();
+ final int countMinusOne = count - 1;
+ final int halfWidth = getWidth() / 2;
+ final int left = getLeft();
+ final int width = getWidth();
+ final int height = getHeight();
+ final int leftPlusWidth = left + width;
+
+ //Verify if the current view must be clipped to the screen
+ Rect curViewBound = bounds.get(mCurrentPage);
+ int curViewWidth = curViewBound.right - curViewBound.left;
+ if (curViewBound.left < 0) {
+ //Try to clip to the screen (left side)
+ clipViewOnTheLeft(curViewBound, curViewWidth);
+ }
+ if (curViewBound.right > leftPlusWidth) {
+ //Try to clip to the screen (right side)
+ clipViewOnTheRight(curViewBound, curViewWidth, leftPlusWidth);
+ }
+
+ //Left views starting from the current position
+ if (mCurrentPage > 0) {
+ for (int i = mCurrentPage - 1; i >= 0; i--) {
+ Rect bound = bounds.get(i);
+ int w = bound.right - bound.left;
+ //Is left side is outside the screen
+ if (bound.left < 0) {
+ //Try to clip to the screen (left side)
+ clipViewOnTheLeft(bound, w);
+ //Except if there's an intersection with the right view
+ if (i < countMinusOne && mCurrentPage != i) {
+ Rect rightBound = bounds.get(i + 1);
+ //Intersection
+ if (bound.right + (int)mTitlePadding > rightBound.left) {
+ bound.left = rightBound.left - (w + (int)mTitlePadding);
+ }
+ }
+ }
+ }
+ }
+ //Right views starting from the current position
+ if (mCurrentPage < countMinusOne) {
+ for (int i = mCurrentPage + 1 ; i < count; i++) {
+ Rect bound = bounds.get(i);
+ int w = bound.right - bound.left;
+ //If right side is outside the screen
+ if (bound.right > leftPlusWidth) {
+ //Try to clip to the screen (right side)
+ clipViewOnTheRight(bound, w, leftPlusWidth);
+ //Except if there's an intersection with the left view
+ if (i > 0 && mCurrentPage != i) {
+ Rect leftBound = bounds.get(i - 1);
+ //Intersection
+ if (bound.left - (int)mTitlePadding < leftBound.right) {
+ bound.left = leftBound.right + (int)mTitlePadding;
+ }
+ }
+ }
+ }
+ }
+
+ Bitmap icon = null;
+ //Now draw views
+ for (int i = 0; i < count; i++) {
+ //Get the title
+ Rect bound = bounds.get(i);
+ //Only if one side is visible
+ if ((bound.left > left && bound.left < leftPlusWidth) || (bound.right > left && bound.right < leftPlusWidth)) {
+ Paint paint = mPaintText;
+ //Change the color is the title is closed to the center
+ int middle = (bound.left + bound.right) / 2;
+ if (Math.abs(middle - halfWidth) < 20) {
+ paint = mPaintSelected;
+ }
+
+ /*
+ * Draw the icons
+ * @author ricky barrette
+ */
+ icon = BitmapFactory.decodeResource( getResources(), mTitleProvider.getIcon(i));;
+ canvas.drawBitmap(icon, bound.left - (icon.getWidth() + 4), (bound.bottom - (icon.getHeight() / 2) )-mFooterIndicatorHeight , paint);
+ canvas.drawText(mTitleProvider.getTitle(i), bound.left, bound.bottom, paint);
+ }
+ }
+
+ //Draw the footer line
+ mPath = new Path();
+ mPath.moveTo(0, height - mFooterLineHeight);
+ mPath.lineTo(width, height - mFooterLineHeight);
+ mPath.close();
+ canvas.drawPath(mPath, mPaintFooterLine);
+
+ switch (mFooterIndicatorStyle) {
+ case Triangle:
+ mPath = new Path();
+ mPath.moveTo(halfWidth, height - mFooterLineHeight - mFooterIndicatorHeight);
+ mPath.lineTo(halfWidth + mFooterIndicatorHeight, height - mFooterLineHeight);
+ mPath.lineTo(halfWidth - mFooterIndicatorHeight, height - mFooterLineHeight);
+ mPath.close();
+ canvas.drawPath(mPath, mPaintFooterIndicator);
+ break;
+
+ case Underline:
+ float deltaPercentage = mCurrentOffset * 1.0f / width;
+ int alpha = 0xFF;
+ int page = mCurrentPage;
+ if (deltaPercentage <= UNDERLINE_FADE_PERCENTAGE) {
+ alpha = (int)(0xFF * ((UNDERLINE_FADE_PERCENTAGE - deltaPercentage) / UNDERLINE_FADE_PERCENTAGE));
+ } else if (deltaPercentage >= (1 - UNDERLINE_FADE_PERCENTAGE)) {
+ alpha = (int)(0xFF * ((deltaPercentage - (1 - UNDERLINE_FADE_PERCENTAGE)) / UNDERLINE_FADE_PERCENTAGE));
+ page += 1; //We are coming into the next page
+ } else if (mCurrentOffset != 0) {
+ break; //Not in underline scope
+ }
+
+ Rect underlineBounds = bounds.get(page);
+ mPath = new Path();
+ mPath.moveTo(underlineBounds.left - mFooterIndicatorUnderlinePadding, height - mFooterLineHeight);
+ mPath.lineTo(underlineBounds.right + mFooterIndicatorUnderlinePadding, height - mFooterLineHeight);
+ mPath.lineTo(underlineBounds.right + mFooterIndicatorUnderlinePadding, height - mFooterLineHeight - mFooterIndicatorHeight);
+ mPath.lineTo(underlineBounds.left - mFooterIndicatorUnderlinePadding, height - mFooterLineHeight - mFooterIndicatorHeight);
+ mPath.close();
+
+ mPaintFooterIndicator.setAlpha(alpha);
+ canvas.drawPath(mPath, mPaintFooterIndicator);
+ mPaintFooterIndicator.setAlpha(0xFF);
+ break;
+ }
+ }
+
+ @Override
+ public final boolean onTouch(View view, MotionEvent event) {
+ if ((view != this) || (event.getAction() != MotionEvent.ACTION_DOWN)) {
+ return false;
+ }
+
+ final int count = mViewPager.getAdapter().getCount();
+ final float halfWidth = getWidth() / 2;
+ final float sixthWidth = getWidth() / 6;
+
+ if ((mCurrentPage > 0) && (event.getX() < halfWidth - sixthWidth)) {
+ mViewPager.setCurrentItem(mCurrentPage - 1);
+ return true;
+ } else if ((mCurrentPage < count - 1) && (event.getX() > halfWidth + sixthWidth)) {
+ mViewPager.setCurrentItem(mCurrentPage + 1);
+ return true;
+ }
+
+ return false;
+ }
+
+ @Override
+ public final void setOnTouchListener(OnTouchListener listener) {
+ throw new UnsupportedOperationException("This view does not support listening to its touch events.");
+ }
+
+ /**
+ * Set bounds for the right textView including clip padding.
+ *
+ * @param curViewBound
+ * current bounds.
+ * @param curViewWidth
+ * width of the view.
+ */
+ private void clipViewOnTheRight(Rect curViewBound, int curViewWidth, int leftPlusWidth) {
+ curViewBound.right = leftPlusWidth - (int)mClipPadding;
+ curViewBound.left = curViewBound.right - curViewWidth;
+ }
+
+ /**
+ * Set bounds for the left textView including clip padding.
+ *
+ * @param curViewBound
+ * current bounds.
+ * @param curViewWidth
+ * width of the view.
+ */
+ private void clipViewOnTheLeft(Rect curViewBound, int curViewWidth) {
+ curViewBound.left = 0 + (int)mClipPadding;
+ curViewBound.right = curViewWidth;
+ }
+
+ /**
+ * Calculate views bounds and scroll them according to the current index
+ *
+ * @param paint
+ * @param currentIndex
+ * @return
+ */
+ private ArrayList calculateAllBounds(Paint paint) {
+ ArrayList list = new ArrayList();
+ //For each views (If no values then add a fake one)
+ final int count = mViewPager.getAdapter().getCount();
+ final int width = getWidth();
+ final int halfWidth = width / 2;
+ for (int i = 0; i < count; i++) {
+ Rect bounds = calcBounds(i, paint);
+ int w = (bounds.right - bounds.left);
+ int h = (bounds.bottom - bounds.top);
+ bounds.left = (halfWidth) - (w / 2) - mCurrentOffset + ((i - mCurrentPage) * width);
+ bounds.right = bounds.left + w;
+ bounds.top = 0;
+ bounds.bottom = h;
+ list.add(bounds);
+ }
+
+ return list;
+ }
+
+ /**
+ * Calculate the bounds for a view's title
+ *
+ * @param index
+ * @param paint
+ * @return
+ */
+ private Rect calcBounds(int index, Paint paint) {
+ //Calculate the text bounds
+ Rect bounds = new Rect();
+ bounds.right = (int)paint.measureText(mTitleProvider.getTitle(index));
+ bounds.bottom = (int)(paint.descent() - paint.ascent());
+ return bounds;
+ }
+
+ @Override
+ public void setViewPager(ViewPager view) {
+ if (view.getAdapter() == null) {
+ throw new IllegalStateException("ViewPager does not have adapter instance.");
+ }
+ if (!(view.getAdapter() instanceof TitleProvider)) {
+ throw new IllegalStateException("ViewPager adapter must implement TitleProvider to be used with TitlePageIndicator.");
+ }
+ mViewPager = view;
+ mViewPager.setOnPageChangeListener(this);
+ mTitleProvider = (TitleProvider)mViewPager.getAdapter();
+ invalidate();
+ }
+
+ @Override
+ public void setViewPager(ViewPager view, int initialPosition) {
+ setViewPager(view);
+ setCurrentItem(initialPosition);
+ }
+
+ @Override
+ public void setCurrentItem(int item) {
+ if (mViewPager == null) {
+ throw new IllegalStateException("ViewPager has not been bound.");
+ }
+ mViewPager.setCurrentItem(item);
+ mCurrentPage = item;
+ invalidate();
+ }
+
+ @Override
+ public void onPageScrollStateChanged(int state) {
+ if (mListener != null) {
+ mListener.onPageScrollStateChanged(state);
+ }
+ }
+
+ @Override
+ public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
+ mCurrentPage = position;
+ mCurrentOffset = positionOffsetPixels;
+ invalidate();
+
+ if (mListener != null) {
+ mListener.onPageScrolled(position, positionOffset, positionOffsetPixels);
+ }
+ }
+
+ @Override
+ public void onPageSelected(int position) {
+ if (mListener != null) {
+ mListener.onPageSelected(position);
+ }
+ }
+
+ @Override
+ public void setOnPageChangeListener(ViewPager.OnPageChangeListener listener) {
+ mListener = listener;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see android.view.View#onMeasure(int, int)
+ */
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ setMeasuredDimension(measureWidth(widthMeasureSpec), measureHeight(heightMeasureSpec));
+ }
+
+ /**
+ * Determines the width of this view
+ *
+ * @param measureSpec
+ * A measureSpec packed into an int
+ * @return The width of the view, honoring constraints from measureSpec
+ */
+ private int measureWidth(int measureSpec) {
+ int result = 0;
+ int specMode = MeasureSpec.getMode(measureSpec);
+ int specSize = MeasureSpec.getSize(measureSpec);
+
+ if (specMode != MeasureSpec.EXACTLY) {
+ throw new IllegalStateException(getClass().getSimpleName() + " can only be used in EXACTLY mode.");
+ }
+ result = specSize;
+ return result;
+ }
+
+ /**
+ * Determines the height of this view
+ *
+ * @param measureSpec
+ * A measureSpec packed into an int
+ * @return The height of the view, honoring constraints from measureSpec
+ */
+ private int measureHeight(int measureSpec) {
+ float result = 0;
+ int specMode = MeasureSpec.getMode(measureSpec);
+ int specSize = MeasureSpec.getSize(measureSpec);
+
+ if (specMode == MeasureSpec.EXACTLY) {
+ //We were told how big to be
+ result = specSize;
+ } else {
+ //Calculate the text bounds
+ Rect bounds = new Rect();
+ bounds.bottom = (int) (mPaintText.descent()-mPaintText.ascent());
+ result = bounds.bottom - bounds.top + mFooterLineHeight;
+ if (mFooterIndicatorStyle != IndicatorStyle.None) {
+ result += mFooterIndicatorHeight + mFooterIndicatorPadding;
+ }
+ }
+ return (int)result;
+ }
+
+ @Override
+ public void onRestoreInstanceState(Parcelable state) {
+ SavedState savedState = (SavedState)state;
+ super.onRestoreInstanceState(savedState.getSuperState());
+ mCurrentPage = savedState.currentPage;
+ requestLayout();
+ }
+
+ @Override
+ public Parcelable onSaveInstanceState() {
+ setFreezesText(true);
+ Parcelable superState = super.onSaveInstanceState();
+ SavedState savedState = new SavedState(superState);
+ savedState.currentPage = mCurrentPage;
+ return savedState;
+ }
+
+ static class SavedState extends BaseSavedState {
+ int currentPage;
+
+ public SavedState(Parcelable superState) {
+ super(superState);
+ }
+
+ private SavedState(Parcel in) {
+ super(in);
+ currentPage = in.readInt();
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ super.writeToParcel(dest, flags);
+ dest.writeInt(currentPage);
+ }
+
+ public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
+ @Override
+ public SavedState createFromParcel(Parcel in) {
+ return new SavedState(in);
+ }
+
+ @Override
+ public SavedState[] newArray(int size) {
+ return new SavedState[size];
+ }
+ };
+ }
+}
diff --git a/ExceptionReportViewer/src/com/jakewharton/android/viewpagerindicator/TitleProvider.java b/ExceptionReportViewer/src/com/jakewharton/android/viewpagerindicator/TitleProvider.java
new file mode 100644
index 0000000..7891ca5
--- /dev/null
+++ b/ExceptionReportViewer/src/com/jakewharton/android/viewpagerindicator/TitleProvider.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2011 Patrik Akerfeldt
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.jakewharton.android.viewpagerindicator;
+
+/**
+ * A TitleProvider provides the title to display according to a view.
+ */
+public interface TitleProvider {
+ /**
+ * Returns the title of the view at position
+ * @param position
+ * @return
+ */
+ public String getTitle(int position);
+
+ /**
+ * returns the icon res id of the view at position
+ * @param postion
+ * @return
+ * @author ricky barrette
+ */
+ public int getIcon(int postion);
+}
diff --git a/ExceptionReportViewer/src/com/jakewharton/android/viewpagerindicator/TitledFragmentAdapter.java b/ExceptionReportViewer/src/com/jakewharton/android/viewpagerindicator/TitledFragmentAdapter.java
new file mode 100644
index 0000000..65db188
--- /dev/null
+++ b/ExceptionReportViewer/src/com/jakewharton/android/viewpagerindicator/TitledFragmentAdapter.java
@@ -0,0 +1,46 @@
+/**
+ * TitleFragmentAdapter.java
+ * @date Aug 6, 2011
+ * @author Twenty Codes, LLC
+ * @author ricky barrette
+ */
+package com.jakewharton.android.viewpagerindicator;
+
+import java.util.ArrayList;
+
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentManager;
+
+
+/**
+ * This adaptor maintains a ViewPager title indicator.
+ * @author ricky
+ */
+public class TitledFragmentAdapter extends FragmentAdapter implements TitleProvider {
+
+ private String[] mTitles;
+ private int[] mIcons;
+
+ /**
+ * Creates a new TitleFragmentAdapter
+ * @param fm
+ * @param fragments to be displayed
+ * @param titles for the fragments
+ * @author ricky barrette
+ */
+ public TitledFragmentAdapter(FragmentManager fm, ArrayList fragments, String[] titles, int[] icons) {
+ super(fm, fragments);
+ this.mTitles = titles;
+ this.mIcons = icons;
+ }
+
+ @Override
+ public String getTitle(int position) {
+ return this.mTitles[position];
+ }
+
+ @Override
+ public int getIcon(int position) {
+ return this.mIcons[position];
+ }
+}
\ No newline at end of file