package com.tns; import java.lang.Thread.UncaughtExceptionHandler; import android.content.Context; public class NativeScriptUncaughtExceptionHandler implements UncaughtExceptionHandler { private final Context context; private final UncaughtExceptionHandler defaultHandler; private final Logger logger; public NativeScriptUncaughtExceptionHandler(Logger logger, Context context) { this.logger = logger; this.context = context; defaultHandler = Thread.getDefaultUncaughtExceptionHandler(); } @Override public void uncaughtException(Thread thread, Throwable ex) { String currentThreadMessage = "An uncaught Exception occurred on \"" + thread.getName() + "\" thread.\n"; String errorMessage = currentThreadMessage + getErrorMessage(ex); if (Runtime.isInitialized()) { try { ex.printStackTrace(); Runtime runtime = Runtime.getCurrentRuntime(); if (runtime != null) { runtime.passUncaughtExceptionToJs(ex, errorMessage); } } catch (Throwable t) { t.printStackTrace(); } } if (logger.isEnabled()) { logger.write("Uncaught Exception Message=" + errorMessage); } boolean res = false; if (Util.isDebuggableApp(context)) { try { Class<?> ErrReport = null; java.lang.reflect.Method startActivity = null; ErrReport = java.lang.Class.forName("com.tns.ErrorReport"); startActivity = ErrReport.getDeclaredMethod("startActivity", android.content.Context.class, String.class); res = (Boolean) startActivity.invoke(null, context, errorMessage); } catch (Exception e) { android.util.Log.v("Error", errorMessage); e.printStackTrace(); android.util.Log.v("Application Error", "ErrorActivity default implementation not found. Reinstall android platform to fix."); } } if (!res && defaultHandler != null) { defaultHandler.uncaughtException(thread, ex); } } private static String getErrorMessage(Throwable ex) { String content; java.io.PrintStream ps = null; try { java.io.ByteArrayOutputStream baos = new java.io.ByteArrayOutputStream(); ps = new java.io.PrintStream(baos); ex.printStackTrace(ps); try { content = baos.toString("US-ASCII"); } catch (java.io.UnsupportedEncodingException e) { content = e.getMessage(); } } finally { if (ps != null) { ps.close(); } } return content; } }