diff --git a/android/plugins/inspector/InspectorSonarPlugin.java b/android/plugins/inspector/InspectorSonarPlugin.java index a502b4587..3f14fe9c3 100644 --- a/android/plugins/inspector/InspectorSonarPlugin.java +++ b/android/plugins/inspector/InspectorSonarPlugin.java @@ -38,6 +38,19 @@ public class InspectorSonarPlugin implements SonarPlugin { private String mHighlightedId; private TouchOverlayView mTouchOverlay; private SonarConnection mConnection; + private @Nullable List mExtensionCommands; + + /** An interface for extensions to the Inspector Sonar plugin */ + public interface ExtensionCommand { + /** The command to respond to */ + String command(); + /** The corresponding SonarReceiver for the command */ + SonarReceiver receiver(ObjectTracker tracker, SonarConnection connection); + } + + public InspectorSonarPlugin(Context context, DescriptorMapping descriptorMapping) { + this(context, descriptorMapping, new NullScriptingEnvironment()); + } public InspectorSonarPlugin( Context context, @@ -46,23 +59,45 @@ public class InspectorSonarPlugin implements SonarPlugin { this( new ApplicationWrapper((Application) context.getApplicationContext()), descriptorMapping, - scriptingEnvironment); + scriptingEnvironment, + null); } - public InspectorSonarPlugin(Context context, DescriptorMapping descriptorMapping) { - this(context, descriptorMapping, new NullScriptingEnvironment()); + public InspectorSonarPlugin( + Context context, + DescriptorMapping descriptorMapping, + @Nullable List extensions) { + this( + new ApplicationWrapper((Application) context.getApplicationContext()), + descriptorMapping, + new NullScriptingEnvironment(), + extensions); + } + + public InspectorSonarPlugin( + Context context, + DescriptorMapping descriptorMapping, + ScriptingEnvironment scriptingEnvironment, + @Nullable List extensions) { + this( + new ApplicationWrapper((Application) context.getApplicationContext()), + descriptorMapping, + scriptingEnvironment, + extensions); } // Package visible for testing InspectorSonarPlugin( ApplicationWrapper wrapper, DescriptorMapping descriptorMapping, - ScriptingEnvironment scriptingEnvironment) { + ScriptingEnvironment scriptingEnvironment, + @Nullable List extensions) { mDescriptorMapping = descriptorMapping; mObjectTracker = new ObjectTracker(); mApplication = wrapper; mScriptingEnvironment = scriptingEnvironment; + mExtensionCommands = extensions; } @Override @@ -91,6 +126,13 @@ public class InspectorSonarPlugin implements SonarPlugin { connection.receive("setHighlighted", mSetHighlighted); connection.receive("setSearchActive", mSetSearchActive); connection.receive("getSearchResults", mGetSearchResults); + + if (mExtensionCommands != null) { + for (ExtensionCommand extensionCommand : mExtensionCommands) { + connection.receive( + extensionCommand.command(), extensionCommand.receiver(mObjectTracker, mConnection)); + } + } } @Override diff --git a/android/plugins/inspector/ObjectTracker.java b/android/plugins/inspector/ObjectTracker.java index 994699042..4f6b79ac0 100644 --- a/android/plugins/inspector/ObjectTracker.java +++ b/android/plugins/inspector/ObjectTracker.java @@ -13,7 +13,9 @@ import java.util.HashMap; import java.util.Map; import javax.annotation.Nullable; -class ObjectTracker { +public class ObjectTracker { + ObjectTracker() {} + private final Map> mObjects = new HashMap<>(); void put(String id, Object obj) { @@ -21,7 +23,7 @@ class ObjectTracker { } @Nullable - Object get(String id) { + public Object get(String id) { final WeakReference weakObj = mObjects.get(id); if (weakObj == null) { return null; diff --git a/android/tests/plugins/inspector/InspectorSonarPluginTest.java b/android/tests/plugins/inspector/InspectorSonarPluginTest.java index d3e1edde0..75646afed 100644 --- a/android/tests/plugins/inspector/InspectorSonarPluginTest.java +++ b/android/tests/plugins/inspector/InspectorSonarPluginTest.java @@ -62,7 +62,7 @@ public class InspectorSonarPluginTest { @Test public void testOnConnect() throws Exception { final InspectorSonarPlugin plugin = - new InspectorSonarPlugin(mApp, mDescriptorMapping, mScriptingEnvironment); + new InspectorSonarPlugin(mApp, mDescriptorMapping, mScriptingEnvironment, null); final SonarConnection connection = new SonarConnectionMock(); plugin.onConnect(connection); @@ -72,7 +72,7 @@ public class InspectorSonarPluginTest { @Test public void testOnDisconnect() throws Exception { final InspectorSonarPlugin plugin = - new InspectorSonarPlugin(mApp, mDescriptorMapping, mScriptingEnvironment); + new InspectorSonarPlugin(mApp, mDescriptorMapping, mScriptingEnvironment, null); final SonarConnection connection = new SonarConnectionMock(); plugin.onConnect(connection); @@ -83,7 +83,7 @@ public class InspectorSonarPluginTest { @Test public void testGetRoot() throws Exception { final InspectorSonarPlugin plugin = - new InspectorSonarPlugin(mApp, mDescriptorMapping, mScriptingEnvironment); + new InspectorSonarPlugin(mApp, mDescriptorMapping, mScriptingEnvironment, null); final SonarResponderMock responder = new SonarResponderMock(); final SonarConnectionMock connection = new SonarConnectionMock(); plugin.onConnect(connection); @@ -109,7 +109,7 @@ public class InspectorSonarPluginTest { @Test public void testGetNodes() throws Exception { final InspectorSonarPlugin plugin = - new InspectorSonarPlugin(mApp, mDescriptorMapping, mScriptingEnvironment); + new InspectorSonarPlugin(mApp, mDescriptorMapping, mScriptingEnvironment, null); final SonarResponderMock responder = new SonarResponderMock(); final SonarConnectionMock connection = new SonarConnectionMock(); plugin.onConnect(connection); @@ -145,7 +145,7 @@ public class InspectorSonarPluginTest { @Test public void testGetNodesThatDontExist() throws Exception { final InspectorSonarPlugin plugin = - new InspectorSonarPlugin(mApp, mDescriptorMapping, mScriptingEnvironment); + new InspectorSonarPlugin(mApp, mDescriptorMapping, mScriptingEnvironment, null); final SonarResponderMock responder = new SonarResponderMock(); final SonarConnectionMock connection = new SonarConnectionMock(); plugin.onConnect(connection); @@ -171,7 +171,7 @@ public class InspectorSonarPluginTest { @Test public void testSetData() throws Exception { final InspectorSonarPlugin plugin = - new InspectorSonarPlugin(mApp, mDescriptorMapping, mScriptingEnvironment); + new InspectorSonarPlugin(mApp, mDescriptorMapping, mScriptingEnvironment, null); final SonarConnectionMock connection = new SonarConnectionMock(); final SonarResponderMock responder = new SonarResponderMock(); plugin.onConnect(connection); @@ -207,7 +207,7 @@ public class InspectorSonarPluginTest { @Test public void testSetHighlighted() throws Exception { final InspectorSonarPlugin plugin = - new InspectorSonarPlugin(mApp, mDescriptorMapping, mScriptingEnvironment); + new InspectorSonarPlugin(mApp, mDescriptorMapping, mScriptingEnvironment, null); final SonarConnectionMock connection = new SonarConnectionMock(); final SonarResponderMock responder = new SonarResponderMock(); plugin.onConnect(connection); @@ -236,7 +236,7 @@ public class InspectorSonarPluginTest { @Test public void testHitTest() throws Exception { final InspectorSonarPlugin plugin = - new InspectorSonarPlugin(mApp, mDescriptorMapping, mScriptingEnvironment); + new InspectorSonarPlugin(mApp, mDescriptorMapping, mScriptingEnvironment, null); final SonarConnectionMock connection = new SonarConnectionMock(); plugin.onConnect(connection); @@ -273,7 +273,7 @@ public class InspectorSonarPluginTest { @Test public void testSetSearchActive() throws Exception { final InspectorSonarPlugin plugin = - new InspectorSonarPlugin(mApp, mDescriptorMapping, mScriptingEnvironment); + new InspectorSonarPlugin(mApp, mDescriptorMapping, mScriptingEnvironment, null); final SonarConnectionMock connection = new SonarConnectionMock(); final SonarResponderMock responder = new SonarResponderMock(); plugin.onConnect(connection); @@ -295,7 +295,7 @@ public class InspectorSonarPluginTest { @Test(expected = AssertionError.class) public void testNullChildThrows() throws Exception { final InspectorSonarPlugin plugin = - new InspectorSonarPlugin(mApp, mDescriptorMapping, mScriptingEnvironment); + new InspectorSonarPlugin(mApp, mDescriptorMapping, mScriptingEnvironment, null); final SonarResponderMock responder = new SonarResponderMock(); final SonarConnectionMock connection = new SonarConnectionMock(); plugin.onConnect(connection);