From 83969c26fbc623d65113a77fd89810dc2f03d6c5 Mon Sep 17 00:00:00 2001 From: Emily Janzer Date: Tue, 16 Jul 2019 13:58:48 -0700 Subject: [PATCH] Decouple GuardedRunnable + friends from ReactContext Summary: Step 1 in removing the dependency on ReactContext from GuardedRunnable and other related classes. These are extensively by native modules and view managers, so in order to remove the bridge dependency from those modules we'll need to first decouple these classes from ReactContext. It turns out they only need ReactContext for its handleException method, which delegates out to product code. For backwards compatibility I'm exposing another NativeModuleExceptionManager in ReactContext that simply wraps its handleException method (since this interface already does everything we need). I figured I'd keep around an extra constructor that still uses ReactContext for now instead of trying to migrate everything over at once. Reviewed By: makovkastar Differential Revision: D16270995 fbshipit-source-id: c9a8714bea7ac2a98e78234a0bae49140c00980d --- .../facebook/react/bridge/GuardedAsyncTask.java | 11 ++++++++--- .../react/bridge/GuardedResultAsyncTask.java | 13 +++++++++---- .../facebook/react/bridge/GuardedRunnable.java | 11 ++++++++--- .../com/facebook/react/bridge/ReactContext.java | 15 +++++++++++++++ .../react/fabric/GuardedFrameCallback.java | 12 +++++++++--- 5 files changed, 49 insertions(+), 13 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/bridge/GuardedAsyncTask.java b/ReactAndroid/src/main/java/com/facebook/react/bridge/GuardedAsyncTask.java index eee4aeccd3b..a8bbcab4e7e 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/bridge/GuardedAsyncTask.java +++ b/ReactAndroid/src/main/java/com/facebook/react/bridge/GuardedAsyncTask.java @@ -18,10 +18,15 @@ import android.os.AsyncTask; */ public abstract class GuardedAsyncTask extends AsyncTask { - private final ReactContext mReactContext; + private final NativeModuleCallExceptionHandler mExceptionHandler; + @Deprecated protected GuardedAsyncTask(ReactContext reactContext) { - mReactContext = reactContext; + this(reactContext.getExceptionHandler()); + } + + protected GuardedAsyncTask(NativeModuleCallExceptionHandler exceptionHandler) { + mExceptionHandler = exceptionHandler; } @Override @@ -29,7 +34,7 @@ public abstract class GuardedAsyncTask extends AsyncTask extends AsyncTask { - private final ReactContext mReactContext; + private final NativeModuleCallExceptionHandler mExceptionHandler; + @Deprecated protected GuardedResultAsyncTask(ReactContext reactContext) { - mReactContext = reactContext; + this(reactContext.getExceptionHandler()); + } + + protected GuardedResultAsyncTask(NativeModuleCallExceptionHandler exceptionHandler) { + mExceptionHandler = exceptionHandler; } @Override @@ -25,7 +30,7 @@ public abstract class GuardedResultAsyncTask extends AsyncTask extends AsyncTask mCurrentActivity; public ReactContext(Context base) { @@ -344,6 +345,20 @@ public class ReactContext extends ContextWrapper { } } + public class ExceptionHandlerWrapper implements NativeModuleCallExceptionHandler { + @Override + public void handleException(Exception e) { + ReactContext.this.handleException(e); + } + } + + public NativeModuleCallExceptionHandler getExceptionHandler() { + if (mExceptionHandlerWrapper == null) { + mExceptionHandlerWrapper = new ExceptionHandlerWrapper(); + } + return mExceptionHandlerWrapper; + } + public boolean hasCurrentActivity() { return mCurrentActivity != null && mCurrentActivity.get() != null; } diff --git a/ReactAndroid/src/main/java/com/facebook/react/fabric/GuardedFrameCallback.java b/ReactAndroid/src/main/java/com/facebook/react/fabric/GuardedFrameCallback.java index 2982bd472e9..d1cbf4c5fdc 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/fabric/GuardedFrameCallback.java +++ b/ReactAndroid/src/main/java/com/facebook/react/fabric/GuardedFrameCallback.java @@ -6,15 +6,21 @@ */ package com.facebook.react.fabric; +import com.facebook.react.bridge.NativeModuleCallExceptionHandler; import com.facebook.react.bridge.ReactContext; import com.facebook.react.modules.core.ChoreographerCompat; public abstract class GuardedFrameCallback extends ChoreographerCompat.FrameCallback { - private final ReactContext mReactContext; + private final NativeModuleCallExceptionHandler mExceptionHandler; + @Deprecated protected GuardedFrameCallback(ReactContext reactContext) { - mReactContext = reactContext; + this(reactContext.getExceptionHandler()); + } + + protected GuardedFrameCallback(NativeModuleCallExceptionHandler exceptionHandler) { + mExceptionHandler = exceptionHandler; } @Override @@ -22,7 +28,7 @@ public abstract class GuardedFrameCallback extends ChoreographerCompat.FrameCall try { doFrameGuarded(frameTimeNanos); } catch (RuntimeException e) { - mReactContext.handleException(e); + mExceptionHandler.handleException(e); } }