diff --git a/android/sample/src/main/java/com/facebook/flipper/sample/FlipperSampleApplication.java b/android/sample/src/main/java/com/facebook/flipper/sample/FlipperSampleApplication.java index fca9fa714..e18520fbb 100644 --- a/android/sample/src/main/java/com/facebook/flipper/sample/FlipperSampleApplication.java +++ b/android/sample/src/main/java/com/facebook/flipper/sample/FlipperSampleApplication.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004-present, Facebook, Inc. + * Copyright (c) Facebook, Inc. * * This source code is licensed under the MIT license found in the LICENSE * file in the root directory of this source tree. @@ -12,6 +12,7 @@ import android.content.Context; import android.support.annotation.Nullable; import com.facebook.flipper.android.AndroidFlipperClient; import com.facebook.flipper.core.FlipperClient; +import com.facebook.flipper.plugins.crashreporter.CrashReporterPlugin; import com.facebook.flipper.plugins.example.ExampleFlipperPlugin; import com.facebook.flipper.plugins.inspector.DescriptorMapping; import com.facebook.flipper.plugins.inspector.InspectorFlipperPlugin; @@ -64,6 +65,7 @@ public class FlipperSampleApplication extends Application { new SharedPreferencesDescriptor("other_sample", Context.MODE_PRIVATE)))); client.addPlugin(new LeakCanaryFlipperPlugin()); client.addPlugin(new ExampleFlipperPlugin()); + client.addPlugin(new CrashReporterPlugin()); client.start(); getSharedPreferences("sample", Context.MODE_PRIVATE).edit().putString("Hello", "world").apply(); diff --git a/android/sample/src/main/java/com/facebook/flipper/sample/RootComponentSpec.java b/android/sample/src/main/java/com/facebook/flipper/sample/RootComponentSpec.java index 1b1212434..c6a738fbc 100644 --- a/android/sample/src/main/java/com/facebook/flipper/sample/RootComponentSpec.java +++ b/android/sample/src/main/java/com/facebook/flipper/sample/RootComponentSpec.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004-present, Facebook, Inc. + * Copyright (c) Facebook, Inc. * * This source code is licensed under the MIT license found in the LICENSE * file in the root directory of this source tree. diff --git a/android/src/main/java/com/facebook/flipper/plugins/crashreporter/CrashReporterPlugin.java b/android/src/main/java/com/facebook/flipper/plugins/crashreporter/CrashReporterPlugin.java new file mode 100644 index 000000000..8ef0ab3d1 --- /dev/null +++ b/android/src/main/java/com/facebook/flipper/plugins/crashreporter/CrashReporterPlugin.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) Facebook, Inc. + * + * This source code is licensed under the MIT license found in the LICENSE + * file in the root directory of this source tree. + * + */ +package com.facebook.flipper.plugins.crashreporter; + +import android.app.Activity; +import android.support.annotation.Nullable; +import com.facebook.flipper.core.FlipperConnection; +import com.facebook.flipper.core.FlipperObject; +import com.facebook.flipper.core.FlipperPlugin; +import java.io.PrintWriter; +import java.io.StringWriter; + +public class CrashReporterPlugin implements FlipperPlugin { + public static final String ID = "CrashReporter"; + + @Nullable private Activity mActivity; + + @Nullable private FlipperConnection mConnection; + + @Nullable private Thread.UncaughtExceptionHandler prevHandler; + + /* + * Activity to be used to display incoming messages + */ + public void setActivity(Activity activity) { + mActivity = activity; + } + + @Override + public void onConnect(FlipperConnection connection) { + mConnection = connection; + prevHandler = Thread.getDefaultUncaughtExceptionHandler(); + Thread.setDefaultUncaughtExceptionHandler( + new Thread.UncaughtExceptionHandler() { + @Override + public void uncaughtException(Thread paramThread, Throwable paramThrowable) { + if (mConnection != null) { + FlipperConnection connection = mConnection; + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + paramThrowable.printStackTrace(pw); + connection.send( + "crash-report", + new FlipperObject.Builder() + .put("callstack", sw.toString()) + .put("cause", paramThrowable.toString()) + .put("reason", paramThrowable.toString()) + .build()); + } + if (prevHandler != null) { + prevHandler.uncaughtException(paramThread, paramThrowable); + } + } + }); + } + + @Override + public void onDisconnect() { + mConnection = null; + Thread.setDefaultUncaughtExceptionHandler(prevHandler); + } + + @Override + public boolean runInBackground() { + return true; + } + + @Override + public String getId() { + return ID; + } +}