From 214f112c14a31e973b6d148b6c5f862f7a7e6bc0 Mon Sep 17 00:00:00 2001 From: Pascal Hartig Date: Wed, 5 Dec 2018 08:01:38 -0800 Subject: [PATCH] Add getPluginByClass interface Summary: This deprecates the `getPlugin(String)` method and introduces a `getPluginByClass(Class)` instead which avoids having to `instanceof`-check and then cast the result, which provides a nicer experience for Java users. Reviewed By: jknoxville Differential Revision: D13277568 fbshipit-source-id: fb7b5b8c0180470ef0ad322559b5b7424520848b --- .../facebook/flipper/sample/MainActivity.java | 9 ++---- android/src/main/cpp/sonar.cpp | 23 +++++++------- .../flipper/android/FlipperClientImpl.java | 30 +++++++++++++++++-- .../facebook/flipper/core/FlipperClient.java | 4 ++- 4 files changed, 45 insertions(+), 21 deletions(-) diff --git a/android/sample/src/main/java/com/facebook/flipper/sample/MainActivity.java b/android/sample/src/main/java/com/facebook/flipper/sample/MainActivity.java index 9fa4862ce..5ac8b1969 100644 --- a/android/sample/src/main/java/com/facebook/flipper/sample/MainActivity.java +++ b/android/sample/src/main/java/com/facebook/flipper/sample/MainActivity.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. @@ -11,7 +11,6 @@ import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import com.facebook.flipper.android.AndroidFlipperClient; import com.facebook.flipper.core.FlipperClient; -import com.facebook.flipper.core.FlipperPlugin; import com.facebook.flipper.plugins.example.ExampleFlipperPlugin; import com.facebook.litho.ComponentContext; import com.facebook.litho.LithoView; @@ -26,10 +25,8 @@ public class MainActivity extends AppCompatActivity { final FlipperClient client = AndroidFlipperClient.getInstanceIfInitialized(); if (client != null) { - final FlipperPlugin samplePlugin = client.getPlugin(ExampleFlipperPlugin.ID); - if (samplePlugin instanceof ExampleFlipperPlugin) { - ((ExampleFlipperPlugin) samplePlugin).setActivity(this); - } + final ExampleFlipperPlugin samplePlugin = client.getPluginByClass(ExampleFlipperPlugin.class); + samplePlugin.setActivity(this); } } } diff --git a/android/src/main/cpp/sonar.cpp b/android/src/main/cpp/sonar.cpp index 977268ac0..a6a4146fc 100644 --- a/android/src/main/cpp/sonar.cpp +++ b/android/src/main/cpp/sonar.cpp @@ -331,17 +331,18 @@ class JFlipperClient : public jni::HybridClass { static void registerNatives() { registerHybrid({ - makeNativeMethod("init", JFlipperClient::init), - makeNativeMethod("getInstance", JFlipperClient::getInstance), - makeNativeMethod("start", JFlipperClient::start), - makeNativeMethod("stop", JFlipperClient::stop), - makeNativeMethod("addPlugin", JFlipperClient::addPlugin), - makeNativeMethod("removePlugin", JFlipperClient::removePlugin), - makeNativeMethod("subscribeForUpdates", JFlipperClient::subscribeForUpdates), - makeNativeMethod("unsubscribe", JFlipperClient::unsubscribe), - makeNativeMethod("getPlugin", JFlipperClient::getPlugin), - makeNativeMethod("getState", JFlipperClient::getState), - makeNativeMethod("getStateSummary", JFlipperClient::getStateSummary), + makeNativeMethod("init", JFlipperClient::init), + makeNativeMethod("getInstance", JFlipperClient::getInstance), + makeNativeMethod("start", JFlipperClient::start), + makeNativeMethod("stop", JFlipperClient::stop), + makeNativeMethod("addPluginNative", JFlipperClient::addPlugin), + makeNativeMethod("removePluginNative", JFlipperClient::removePlugin), + makeNativeMethod( + "subscribeForUpdates", JFlipperClient::subscribeForUpdates), + makeNativeMethod("unsubscribe", JFlipperClient::unsubscribe), + makeNativeMethod("getPlugin", JFlipperClient::getPlugin), + makeNativeMethod("getState", JFlipperClient::getState), + makeNativeMethod("getStateSummary", JFlipperClient::getStateSummary), }); } diff --git a/android/src/main/java/com/facebook/flipper/android/FlipperClientImpl.java b/android/src/main/java/com/facebook/flipper/android/FlipperClientImpl.java index 2f2a5c827..b48c941f5 100644 --- a/android/src/main/java/com/facebook/flipper/android/FlipperClientImpl.java +++ b/android/src/main/java/com/facebook/flipper/android/FlipperClientImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018-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. @@ -15,6 +15,8 @@ import com.facebook.flipper.core.StateSummary; import com.facebook.jni.HybridData; import com.facebook.proguard.annotations.DoNotStrip; import com.facebook.soloader.SoLoader; +import java.util.HashMap; +import java.util.Map; @DoNotStrip class FlipperClientImpl implements FlipperClient { @@ -25,6 +27,7 @@ class FlipperClientImpl implements FlipperClient { } private final HybridData mHybridData; + private final Map, String> mClassIdentifierMap = new HashMap(8); private FlipperClientImpl(HybridData hd) { mHybridData = hd; @@ -44,13 +47,34 @@ class FlipperClientImpl implements FlipperClient { public static native FlipperClientImpl getInstance(); @Override - public native void addPlugin(FlipperPlugin plugin); + public void addPlugin(FlipperPlugin plugin) { + mClassIdentifierMap.put(plugin.getClass(), plugin.getId()); + addPluginNative(plugin); + } + public native void addPluginNative(FlipperPlugin plugin); + + /** + * @deprecated Prefer using {@link #getPluginByClass(Class)} over the stringly-typed interface. + */ @Override + @Deprecated public native T getPlugin(String id); @Override - public native void removePlugin(FlipperPlugin plugin); + public T getPluginByClass(Class cls) { + final String id = mClassIdentifierMap.get(cls); + //noinspection deprecation + return getPlugin(id); + } + + public native void removePluginNative(FlipperPlugin plugin); + + @Override + public void removePlugin(FlipperPlugin plugin) { + mClassIdentifierMap.remove(plugin.getClass()); + removePluginNative(plugin); + } @Override public native void start(); diff --git a/android/src/main/java/com/facebook/flipper/core/FlipperClient.java b/android/src/main/java/com/facebook/flipper/core/FlipperClient.java index c19c42a2e..0bda27cb0 100644 --- a/android/src/main/java/com/facebook/flipper/core/FlipperClient.java +++ b/android/src/main/java/com/facebook/flipper/core/FlipperClient.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018-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,8 @@ public interface FlipperClient { T getPlugin(String id); + T getPluginByClass(Class cls); + void removePlugin(FlipperPlugin plugin); void start();