Android Open Source - Resonos-Android-Framework Error Reporter






From Project

Back to project page Resonos-Android-Framework.

License

The source code is released under:

Apache License

If you think the Android project Resonos-Android-Framework listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

package com.resonos.apps.library.util;
// www .j a  va 2 s .  com
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.Writer;
import java.lang.Thread.UncaughtExceptionHandler;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;

import com.resonos.apps.library.App;

/**
 * Class used to catch uncaught exceptions and submit them to a server.
 * @author Chris
 */
public class ErrorReporter {
  
  // constants
  public static final String ACTION_UNCAUGHT = "uncaught";

  // vars
  private String _lastAction, _lastText;
  private final String mAppName, mVersionID, mErrorURL;
    private UncaughtExceptionHandler mUEH = null;

  // static objects
    private static UncaughtExceptionHandler sDefaultUEH = null;
    private static ErrorReporter sInstance = null;
    
    /**
     * Get the static ErrorReporter instance.
     * This will be null until an ErrorReporter has been intialized by an app.
     * So avoid using this in calls that might occur before createApp()
     * @return the ErrorReporter instance
     */
    public static synchronized ErrorReporter getInstance() {
      return sInstance;
    }
  
    /**
     * This class catches all exceptions and submits information about them,
     * as well as some system information to a specified URL.
     * Custom errors can be submitted as well. 
     * @param app
     */
  public ErrorReporter(App app) {
    this.mAppName = app.getAppName();
    this.mVersionID = app.getVersionID();
    this.mErrorURL = app.mAppInfo.errorURL;
    _lastAction = "";
    _lastText = "";
    if (sDefaultUEH == null)
          sDefaultUEH = Thread.getDefaultUncaughtExceptionHandler();
        if (mUEH == null)
          mUEH = new UncaughtExceptionHandler() {
                public void uncaughtException(Thread t, Throwable e) {
                    final Writer result = new StringWriter();
                    final PrintWriter printWriter = new PrintWriter(result);
                    e.printStackTrace(printWriter);
                    String stacktrace = result.toString();
                    printWriter.close();
                    report(ACTION_UNCAUGHT, e.toString(), stacktrace);
                    sDefaultUEH.uncaughtException(t, e);
                }
            };
        Thread.setDefaultUncaughtExceptionHandler(mUEH);
    synchronized (this.getClass()) {
      sInstance = this;
    }
  }

  public UncaughtExceptionHandler getDefaultExceptionHandler() {
    return sDefaultUEH;
  }

  public UncaughtExceptionHandler getExceptionHandler() {
    return mUEH;
  }

  /**
   * Report an error with one parameter
   * @param action, the error name
   * @param text, the error description
   */
  public void report(String action, String text) {
    report(action, text, "");
  }
  
  /**
   * Report an error with two parameters
   * @param action, the error name
   * @param text, the error description
   * @param e, more detailed or technical error information
   */
  public void report(final String action, final String text, String e) {
    // avoid repeated submission of the same error
    if (action.equals(_lastAction) && text.equals(_lastText))
      return;

    _lastAction = action;
    _lastText = text;
    final String extra = (e == null) ? "" : e;

    new Thread() {
      @Override
      public void run() {
            HttpClient httpClient = NetworkClient.getHttpClient();
            HttpPost httpPost = new HttpPost(mErrorURL);
            List<NameValuePair> nvps = new ArrayList<NameValuePair>();
            nvps.add(new BasicNameValuePair("app", mAppName));
            nvps.add(new BasicNameValuePair("version", mVersionID));
            nvps.add(new BasicNameValuePair("text", url_utf8_encode(text)));
            nvps.add(new BasicNameValuePair("extra", url_utf8_encode(extra)));
            nvps.add(new BasicNameValuePair("info", url_utf8_encode(ErrorReporter.getInfo())));
            nvps.add(new BasicNameValuePair("action", action));
            try {
                httpPost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
                httpClient.execute(httpPost);
            } catch (IOException ex) {
                //
            }
      }
    }.start();
  }
  
  /**
   * Report an error using an exception
   * @param action, the error name
   * @param error, the exception thrown
   */
  public void report(String action, Throwable error) {
    report(action, getStackTrace(error), error.getMessage());
  }
  
  /**
   * Report an error using an exception and another parameter
   * @param action, the error name
   * @param error, the exception thrown
   * @param extra, more detailed or technical error information
   */
  public void report(String action, Throwable error, String extra) {
    String e = error.getMessage();
    final String arg = (e == null) ? extra : (e + "\n" + extra);
    report(action, getStackTrace(error), arg);
  }
  
  /**
   * Get the stacktrace in string form from a throwable
   * @param the exception or error
   * @return the stacktrace as a String
   */
  public static String getStackTrace(Throwable aThrowable) {
      final Writer result = new StringWriter();
      final PrintWriter printWriter = new PrintWriter(result);
      aThrowable.printStackTrace(printWriter);
      return result.toString();
  }
  
  /**
   * Get the stacktrace in string form from a throwable in long form
   * @param the exception or error
   * @return the stacktrace as a String
   */
  public static String getLongStackTrace(Throwable aThrowable) {
    // add the class name and any message passed to constructor
    final StringBuilder result = new StringBuilder( "Exception: " );
    result.append(aThrowable.toString());
    final String NEW_LINE = System.getProperty("line.separator");
    result.append(NEW_LINE);
    
    //add each element of the stack trace
    for (StackTraceElement element : aThrowable.getStackTrace() ){
      result.append( element );
      result.append( NEW_LINE );
    }
    return result.toString();
  }
  
  /**
   * @return a string full of all BUILD information and the Android VERSIONID
   */
  @SuppressWarnings("rawtypes")
  public static String getInfo() {
    StringBuilder bldr = new StringBuilder();
    Class build = android.os.Build.class;

    try {
      for(Field curr: build.getFields()) {
        if(curr.getType().equals(String.class)) {
          try {
            bldr.append("Build->" + curr.getName() + ":").append("" + curr.get(build)).append("\n");
          } catch (Exception e) {
            // pass
          }
        }
      }
    } catch (Exception ex) {
      bldr.append("getInfo() error");
    }
    
    Class bv = android.os.Build.VERSION.class;
    try { // TODO all version info
      for(Field curr: bv.getFields()) {
        if(curr.getType().equals(String.class)) {
          try {
            bldr.append("Version->" + curr.getName() + ":").append("" + curr.get(bv)).append("\n");
          } catch (Exception e) {
            // pass
          }
        }
      }
      bldr.append("VERSIONID:").append(android.os.Build.VERSION.SDK_INT).append("\n");
    } catch (Exception ex) {
      bldr.append("VERSIONID:error");
    }
    return bldr.toString();
  }

  /**
   * Someone else's UTF8 URL encode function, I do not remember where this is from
   * @param String to encode
   * @return URL encoded String
   */
  public static String url_utf8_encode(String s) {
    StringBuffer sbuf = new StringBuffer();
    int len = s.length();
    for (int i = 0; i < len; i++) {
      int ch = s.charAt(i);
      if ('A' <= ch && ch <= 'Z') { // 'A'..'Z'
        sbuf.append((char) ch);
      } else if ('a' <= ch && ch <= 'z') { // 'a'..'z'
        sbuf.append((char) ch);
      } else if ('0' <= ch && ch <= '9') { // '0'..'9'
        sbuf.append((char) ch);
      } else if (ch == ' ') { // space
        sbuf.append('+');
      } else if (ch == '_' // unreserved
          || ch == '.' || ch == '!' || ch == '~'
          || ch == '*'
          || ch == '\'' || ch == '(' || ch == ')') {
        sbuf.append((char) ch);
      } else if (ch == '-') {
        sbuf.append(hex[ch]);
      } else if (ch <= 0x007f) { // other ASCII
        sbuf.append(hex[ch]);
      } else if (ch <= 0x07FF) { // non-ASCII <= 0x7FF
        sbuf.append(hex[0xc0 | (ch >> 6)]);
        sbuf.append(hex[0x80 | (ch & 0x3F)]);
      } else { // 0x7FF < ch <= 0xFFFF
        sbuf.append(hex[0xe0 | (ch >> 12)]);
        sbuf.append(hex[0x80 | ((ch >> 6) & 0x3F)]);
        sbuf.append(hex[0x80 | (ch & 0x3F)]);
      }
    }
    return sbuf.toString();
  }

  final static String[] hex = { "%00", "%01", "%02", "%03", "%04", "%05",
      "%06", "%07", "%08", "%09", "%0a", "%0b", "%0c", "%0d", "%0e",
      "%0f", "%10", "%11", "%12", "%13", "%14", "%15", "%16", "%17",
      "%18", "%19", "%1a", "%1b", "%1c", "%1d", "%1e", "%1f", "%20",
      "%21", "%22", "%23", "%24", "%25", "%26", "%27", "%28", "%29",
      "%2a", "%2b", "%2c", "%2d", "%2e", "%2f", "%30", "%31", "%32",
      "%33", "%34", "%35", "%36", "%37", "%38", "%39", "%3a", "%3b",
      "%3c", "%3d", "%3e", "%3f", "%40", "%41", "%42", "%43", "%44",
      "%45", "%46", "%47", "%48", "%49", "%4a", "%4b", "%4c", "%4d",
      "%4e", "%4f", "%50", "%51", "%52", "%53", "%54", "%55", "%56",
      "%57", "%58", "%59", "%5a", "%5b", "%5c", "%5d", "%5e", "%5f",
      "%60", "%61", "%62", "%63", "%64", "%65", "%66", "%67", "%68",
      "%69", "%6a", "%6b", "%6c", "%6d", "%6e", "%6f", "%70", "%71",
      "%72", "%73", "%74", "%75", "%76", "%77", "%78", "%79", "%7a",
      "%7b", "%7c", "%7d", "%7e", "%7f", "%80", "%81", "%82", "%83",
      "%84", "%85", "%86", "%87", "%88", "%89", "%8a", "%8b", "%8c",
      "%8d", "%8e", "%8f", "%90", "%91", "%92", "%93", "%94", "%95",
      "%96", "%97", "%98", "%99", "%9a", "%9b", "%9c", "%9d", "%9e",
      "%9f", "%a0", "%a1", "%a2", "%a3", "%a4", "%a5", "%a6", "%a7",
      "%a8", "%a9", "%aa", "%ab", "%ac", "%ad", "%ae", "%af", "%b0",
      "%b1", "%b2", "%b3", "%b4", "%b5", "%b6", "%b7", "%b8", "%b9",
      "%ba", "%bb", "%bc", "%bd", "%be", "%bf", "%c0", "%c1", "%c2",
      "%c3", "%c4", "%c5", "%c6", "%c7", "%c8", "%c9", "%ca", "%cb",
      "%cc", "%cd", "%ce", "%cf", "%d0", "%d1", "%d2", "%d3", "%d4",
      "%d5", "%d6", "%d7", "%d8", "%d9", "%da", "%db", "%dc", "%dd",
      "%de", "%df", "%e0", "%e1", "%e2", "%e3", "%e4", "%e5", "%e6",
      "%e7", "%e8", "%e9", "%ea", "%eb", "%ec", "%ed", "%ee", "%ef",
      "%f0", "%f1", "%f2", "%f3", "%f4", "%f5", "%f6", "%f7", "%f8",
      "%f9", "%fa", "%fb", "%fc", "%fd", "%fe", "%ff" };

}




Java Source Code List

com.resonos.apps.library.Action.java
com.resonos.apps.library.AlertFragment.java
com.resonos.apps.library.App.java
com.resonos.apps.library.BaseFragment.java
com.resonos.apps.library.FragmentBaseActivity.java
com.resonos.apps.library.file.AltAndroidFileHandle.java
com.resonos.apps.library.file.AltAndroidFiles.java
com.resonos.apps.library.file.AltFileHandle.java
com.resonos.apps.library.file.FileCache.java
com.resonos.apps.library.media.AudioVisualizer.java
com.resonos.apps.library.media.BitmapMemoryCache.java
com.resonos.apps.library.media.HueColorFilter.java
com.resonos.apps.library.media.ImageLoader.java
com.resonos.apps.library.media.MediaScannerNotifier.java
com.resonos.apps.library.model.Coord.java
com.resonos.apps.library.model.ImmutableCoord.java
com.resonos.apps.library.tabviewpager.CustomViewPager.java
com.resonos.apps.library.tabviewpager.PageIndicator.java
com.resonos.apps.library.tabviewpager.TabPageIndicator.java
com.resonos.apps.library.tabviewpager.TabViewPagerAdapter.java
com.resonos.apps.library.tabviewpager.TabViewPagerFragment.java
com.resonos.apps.library.tabviewpager.TitleProvider.java
com.resonos.apps.library.util.AppUtils.java
com.resonos.apps.library.util.ErrorReporter.java
com.resonos.apps.library.util.LifecycleTaskQueue.java
com.resonos.apps.library.util.M.java
com.resonos.apps.library.util.NetworkClient.java
com.resonos.apps.library.util.NetworkRequest.java
com.resonos.apps.library.util.ParameterList.java
com.resonos.apps.library.util.SensorReader.java
com.resonos.apps.library.util.TouchViewWorker.java
com.resonos.apps.library.util.ViewServer.java
com.resonos.apps.library.widget.DashboardLayout.java
com.resonos.apps.library.widget.FormBuilder.java
com.resonos.apps.library.widget.FormElement.java
com.resonos.apps.library.widget.ListFormBuilder.java
com.resonos.apps.library.widget.PopupWindows3D.java
com.resonos.apps.library.widget.QuickAction3D.java
com.resonos.apps.library.widget.RangeSeekBar.java
com.resonos.apps.library.widget.SeekBar.java
com.resonos.apps.library.widget.ToolBarButton.java
com.resonos.apps.library.widget.ToolBar.java