diff --git a/android/sample/AndroidManifest.xml b/android/sample/AndroidManifest.xml
index 0b8514c4b..b23319b47 100644
--- a/android/sample/AndroidManifest.xml
+++ b/android/sample/AndroidManifest.xml
@@ -25,6 +25,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/android/sample/src/main/java/com/facebook/flipper/sample/DeepLinkActivity.java b/android/sample/src/main/java/com/facebook/flipper/sample/DeepLinkActivity.java
new file mode 100644
index 000000000..3b66a5efb
--- /dev/null
+++ b/android/sample/src/main/java/com/facebook/flipper/sample/DeepLinkActivity.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * 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.sample;
+
+import android.os.Bundle;
+import androidx.appcompat.app.AppCompatActivity;
+import com.facebook.flipper.plugins.navigation.NavigationFlipperPlugin;
+import com.facebook.litho.Component;
+import com.facebook.litho.ComponentContext;
+import com.facebook.litho.LithoView;
+import com.facebook.litho.widget.Text;
+
+public class DeepLinkActivity extends AppCompatActivity {
+
+ @Override
+ protected void onCreate(final Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ NavigationFlipperPlugin.getInstance().sendNavigationEvent("flipper://deep_link_activity/");
+
+ final ComponentContext context = new ComponentContext(this);
+
+ final Component component =
+ Text.create(context).text("Welcome to the Deep Link Activity!").textSizeDip(40).build();
+
+ setContentView(LithoView.create(context, component));
+ }
+}
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 7744515fa..c00bcec8e 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
@@ -12,6 +12,7 @@ import android.database.DatabaseUtils;
import com.facebook.drawee.backends.pipeline.Fresco;
import com.facebook.flipper.android.AndroidFlipperClient;
import com.facebook.flipper.core.FlipperClient;
+import com.facebook.flipper.plugins.navigation.NavigationFlipperPlugin;
import com.facebook.flipper.sample.network.NetworkClient;
import com.facebook.soloader.SoLoader;
@@ -23,6 +24,7 @@ public class FlipperSampleApplication extends Application {
Fresco.initialize(this);
final FlipperClient client = AndroidFlipperClient.getInstance(this);
+ client.addPlugin(NavigationFlipperPlugin.getInstance());
final FlipperInitializer.IntializationResult initializationResult =
FlipperInitializer.initFlipperPlugins(this, client);
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 52291330d..b360dd71d 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
@@ -11,6 +11,7 @@ import androidx.appcompat.app.AppCompatActivity;
import com.facebook.flipper.android.AndroidFlipperClient;
import com.facebook.flipper.core.FlipperClient;
import com.facebook.flipper.plugins.example.ExampleFlipperPlugin;
+import com.facebook.flipper.plugins.navigation.NavigationFlipperPlugin;
import com.facebook.litho.ComponentContext;
import com.facebook.litho.LithoView;
@@ -19,6 +20,9 @@ public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+
+ NavigationFlipperPlugin.getInstance().sendNavigationEvent("flipper://demo_page/");
+
final ComponentContext c = new ComponentContext(this);
setContentView(LithoView.create(c, RootComponent.create(c).build()));
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 da56034d9..76651b27a 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
@@ -62,6 +62,12 @@ public class RootComponentSpec {
.key("5")
.textSizeSp(20)
.clickHandler(RootComponent.loadImage(c)))
+ .child(
+ Text.create(c)
+ .text("Navigate to another page")
+ .key("5")
+ .textSizeSp(20)
+ .clickHandler(RootComponent.openAlternateActivityOne(c)))
.child(displayImage ? FrescoImage.create(c).controller(controller) : null)
.build();
}
@@ -87,6 +93,12 @@ public class RootComponentSpec {
c.getAndroidContext().startActivity(intent);
}
+ @OnEvent(ClickEvent.class)
+ static void openAlternateActivityOne(final ComponentContext c) {
+ final Intent intent = new Intent(c.getAndroidContext(), DeepLinkActivity.class);
+ c.getAndroidContext().startActivity(intent);
+ }
+
@OnUpdateState
static void updateDisplayImage(StateValue displayImage) {
displayImage.set(true);
diff --git a/android/src/main/java/com/facebook/flipper/plugins/navigation/NavigationFlipperPlugin.java b/android/src/main/java/com/facebook/flipper/plugins/navigation/NavigationFlipperPlugin.java
new file mode 100644
index 000000000..6d49a588a
--- /dev/null
+++ b/android/src/main/java/com/facebook/flipper/plugins/navigation/NavigationFlipperPlugin.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * 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.navigation;
+
+import androidx.annotation.Nullable;
+import com.facebook.flipper.core.FlipperConnection;
+import com.facebook.flipper.core.FlipperObject;
+import com.facebook.flipper.core.FlipperPlugin;
+import com.facebook.flipper.core.FlipperReceiver;
+import com.facebook.flipper.core.FlipperResponder;
+
+public class NavigationFlipperPlugin implements FlipperPlugin {
+
+ private FlipperConnection mConnection = null;
+
+ @Nullable private static NavigationFlipperPlugin instance = null;
+
+ private NavigationFlipperPlugin() {}
+
+ public void sendNavigationEvent(@Nullable String keyURI) {
+ if (mConnection != null) {
+ mConnection.send("nav_event", new FlipperObject.Builder().put("uri", keyURI).build());
+ }
+ }
+
+ @Override
+ public String getId() {
+ return "Navigation";
+ }
+
+ @Override
+ public void onConnect(FlipperConnection connection) throws Exception {
+ mConnection = connection;
+ connection.receive(
+ "greet",
+ new FlipperReceiver() {
+ @Override
+ public void onReceive(FlipperObject params, FlipperResponder responder) throws Exception {
+ responder.success(new FlipperObject.Builder().put("greeting", "Hello").build());
+ }
+ });
+ mConnection.send("nav_plugin_active", new FlipperObject.Builder().build());
+ }
+
+ @Override
+ public void onDisconnect() throws Exception {}
+
+ @Override
+ public boolean runInBackground() {
+ return true;
+ }
+
+ public static NavigationFlipperPlugin getInstance() {
+ if (instance == null) {
+ instance = new NavigationFlipperPlugin();
+ }
+ return instance;
+ }
+}
+
+/* @scarf-info: do not remove, more info: https://fburl.com/scarf */
+/* @scarf-generated: flipper-plugin android/Plugin.java 0bfa32e5-fb15-4705-81f8-86260a1f3f8e */
diff --git a/android/src/test/java/com/facebook/flipper/plugins/navigation/NavigationFlipperPluginTest.java b/android/src/test/java/com/facebook/flipper/plugins/navigation/NavigationFlipperPluginTest.java
new file mode 100644
index 000000000..6198c06d4
--- /dev/null
+++ b/android/src/test/java/com/facebook/flipper/plugins/navigation/NavigationFlipperPluginTest.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2018-present, 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.navigation;
+
+import static org.hamcrest.CoreMatchers.hasItem;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+import com.facebook.flipper.core.FlipperObject;
+import com.facebook.flipper.testing.FlipperConnectionMock;
+import com.facebook.flipper.testing.FlipperResponderMock;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+
+@RunWith(RobolectricTestRunner.class)
+public class NavigationFlipperPluginTest {
+ @Test
+ public void greetingTest() throws Exception {
+ final NavigationFlipperPlugin plugin = NavigationFlipperPlugin.getInstance();
+ final FlipperConnectionMock connection = new FlipperConnectionMock();
+ final FlipperResponderMock responder = new FlipperResponderMock();
+
+ plugin.onConnect(connection);
+ connection.receivers.get("greet").onReceive(null, responder);
+
+ assertThat(
+ responder.successes, hasItem(new FlipperObject.Builder().put("greeting", "Hello").build()));
+ }
+}
+
+/* @scarf-info: do not remove, more info: https://fburl.com/scarf */
+/* @scarf-generated: flipper-plugin android/test/PluginTest.java 0bfa32e5-fb15-4705-81f8-86260a1f3f8e */