diff --git a/android/src/main/java/com/facebook/flipper/plugins/inspector/InspectorFlipperPlugin.java b/android/src/main/java/com/facebook/flipper/plugins/inspector/InspectorFlipperPlugin.java index 66600c9b9..1ef66efc0 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/inspector/InspectorFlipperPlugin.java +++ b/android/src/main/java/com/facebook/flipper/plugins/inspector/InspectorFlipperPlugin.java @@ -10,6 +10,8 @@ package com.facebook.flipper.plugins.inspector; import android.app.Activity; import android.app.Application; import android.content.Context; +import android.graphics.Bitmap; +import android.util.Base64; import android.util.Log; import android.view.View; import android.view.ViewGroup; @@ -24,6 +26,7 @@ import com.facebook.flipper.core.FlipperReceiver; import com.facebook.flipper.core.FlipperResponder; import com.facebook.flipper.plugins.common.MainThreadFlipperReceiver; import com.facebook.flipper.plugins.inspector.descriptors.ApplicationDescriptor; +import java.io.ByteArrayOutputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -37,6 +40,7 @@ public class InspectorFlipperPlugin implements FlipperPlugin { private DescriptorMapping mDescriptorMapping; private ObjectTracker mObjectTracker; private String mHighlightedId; + private boolean mHighlightedAlignmentMode; TouchOverlayView mTouchOverlay; private FlipperConnection mConnection; private @Nullable List mExtensionCommands; @@ -147,6 +151,7 @@ public class InspectorFlipperPlugin implements FlipperPlugin { connection.receive("getSearchResults", mGetSearchResults); connection.receive("getAXRoot", mGetAXRoot); connection.receive("getAXNodes", mGetAXNodes); + connection.receive("getSnapshot", mGetSnapshot); connection.receive("onRequestAXFocus", mOnRequestAXFocus); connection.receive( "shouldShowLithoAccessibilitySettings", mShouldShowLithoAccessibilitySettings); @@ -414,6 +419,45 @@ public class InspectorFlipperPlugin implements FlipperPlugin { setHighlighted(nodeId, true, isAlignmentMode); } mHighlightedId = nodeId; + mHighlightedAlignmentMode = isAlignmentMode; + } + }; + + final FlipperReceiver mGetSnapshot = + new MainThreadFlipperReceiver() { + @Override + public void onReceiveOnMainThread(final FlipperObject params, FlipperResponder responder) + throws Exception { + final String nodeId = params.getString("id"); + + if (mHighlightedId != null) { + setHighlighted(mHighlightedId, false, false); + } + + try { + final Bitmap bitmap = getSnapshot(nodeId, true); + if (bitmap != null) { + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream); + byte[] byteArray = byteArrayOutputStream.toByteArray(); + final String base64 = Base64.encodeToString(byteArray, Base64.DEFAULT); + + responder.success( + new FlipperObject.Builder().put("id", nodeId).put("snapshot", base64).build()); + } else { + throw new Exception("An error occurred whilst trying to encode snapshot"); + } + } catch (Exception ex) { + responder.error( + new FlipperObject.Builder() + .put("error", "unable to obtain snapshpt for object") + .put("id", nodeId) + .build()); + } finally { + if (mHighlightedId != null) { + setHighlighted(mHighlightedId, true, mHighlightedAlignmentMode); + } + } } }; @@ -546,6 +590,34 @@ public class InspectorFlipperPlugin implements FlipperPlugin { descriptor.setHighlighted(obj, highlighted, isAlignmentMode); } + private @Nullable Bitmap getSnapshot(final String id, final boolean includeChildren) + throws Exception { + if (id == null) { + return null; + } + + final Object obj = mObjectTracker.get(id); + if (obj == null) { + return null; + } + + final NodeDescriptor descriptor = descriptorForObject(obj); + if (descriptor == null) { + return null; + } + + try { + return descriptor.getSnapshot(obj, includeChildren); + } catch (java.lang.AbstractMethodError error) { + /* There may be some descriptors which may not provide an implementation. + * In those cases, java.lang.AbstractMethodError will be thrown which + * does not inherit from java.lang.Exception hence will not be caught + * by the try/catch block of the caller. + */ + return null; + } + } + private boolean hasAXNode(FlipperObject node) { FlipperObject extraInfo = node.getObject("extraInfo"); return extraInfo != null && extraInfo.getBoolean("linkedNode"); diff --git a/android/src/main/java/com/facebook/flipper/plugins/inspector/NodeDescriptor.java b/android/src/main/java/com/facebook/flipper/plugins/inspector/NodeDescriptor.java index fef888004..7b13ce6bb 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/inspector/NodeDescriptor.java +++ b/android/src/main/java/com/facebook/flipper/plugins/inspector/NodeDescriptor.java @@ -7,6 +7,7 @@ package com.facebook.flipper.plugins.inspector; +import android.graphics.Bitmap; import androidx.annotation.Nullable; import com.facebook.flipper.core.ErrorReportingRunnable; import com.facebook.flipper.core.FlipperArray; @@ -175,6 +176,13 @@ public abstract class NodeDescriptor { public abstract void setHighlighted(T node, boolean selected, boolean isAlignmentMode) throws Exception; + /** + * Get a snapshot of this node. + * + * @return A Bitmap representation of the specified node. + */ + public abstract @Nullable Bitmap getSnapshot(T node, boolean includeChildren) throws Exception; + /** * Perform hit testing on the given node. Either continue the search in a child with {@link * Touch#continueWithOffset(int, int, int)} or finish the hit testing on this node with {@link diff --git a/android/src/main/java/com/facebook/flipper/plugins/inspector/descriptors/ActivityDescriptor.java b/android/src/main/java/com/facebook/flipper/plugins/inspector/descriptors/ActivityDescriptor.java index f3948121b..53faed1ad 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/inspector/descriptors/ActivityDescriptor.java +++ b/android/src/main/java/com/facebook/flipper/plugins/inspector/descriptors/ActivityDescriptor.java @@ -8,6 +8,7 @@ package com.facebook.flipper.plugins.inspector.descriptors; import android.app.Activity; +import android.graphics.Bitmap; import android.util.Log; import android.view.Window; import com.facebook.flipper.core.FlipperDynamic; @@ -93,6 +94,12 @@ public class ActivityDescriptor extends NodeDescriptor { descriptor.setHighlighted(node.getWindow(), selected, isAlignmentMode); } + @Override + public Bitmap getSnapshot(Activity node, boolean includeChildren) throws Exception { + final NodeDescriptor descriptor = descriptorForClass(Window.class); + return descriptor.getSnapshot(node.getWindow(), includeChildren); + } + @Override public void hitTest(Activity node, Touch touch) { touch.continueWithOffset(0, 0, 0); diff --git a/android/src/main/java/com/facebook/flipper/plugins/inspector/descriptors/ApplicationDescriptor.java b/android/src/main/java/com/facebook/flipper/plugins/inspector/descriptors/ApplicationDescriptor.java index fe4d2a49c..606eecbbb 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/inspector/descriptors/ApplicationDescriptor.java +++ b/android/src/main/java/com/facebook/flipper/plugins/inspector/descriptors/ApplicationDescriptor.java @@ -8,6 +8,7 @@ package com.facebook.flipper.plugins.inspector.descriptors; import android.app.Activity; +import android.graphics.Bitmap; import android.view.View; import android.view.ViewGroup; import android.view.accessibility.AccessibilityEvent; @@ -241,6 +242,19 @@ public class ApplicationDescriptor extends NodeDescriptor { } } + @Override + public Bitmap getSnapshot(ApplicationWrapper node, boolean includeChildren) throws Exception { + final int childCount = getChildCount(node); + if (childCount > 0) { + final Object topChild = getChildAt(node, childCount - 1); + final NodeDescriptor descriptor = descriptorForClass(topChild.getClass()); + if (descriptor != null) { + return descriptor.getSnapshot(topChild, includeChildren); + } + } + return null; + } + private void runHitTest(ApplicationWrapper node, Touch touch, boolean ax) { final int childCount = getChildCount(node); diff --git a/android/src/main/java/com/facebook/flipper/plugins/inspector/descriptors/DialogDescriptor.java b/android/src/main/java/com/facebook/flipper/plugins/inspector/descriptors/DialogDescriptor.java index 0f8d0f370..5e10f7bbb 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/inspector/descriptors/DialogDescriptor.java +++ b/android/src/main/java/com/facebook/flipper/plugins/inspector/descriptors/DialogDescriptor.java @@ -8,6 +8,7 @@ package com.facebook.flipper.plugins.inspector.descriptors; import android.app.Dialog; +import android.graphics.Bitmap; import android.view.Window; import com.facebook.flipper.core.FlipperDynamic; import com.facebook.flipper.core.FlipperObject; @@ -68,6 +69,12 @@ public class DialogDescriptor extends NodeDescriptor { descriptor.setHighlighted(node.getWindow(), selected, isAlignmentMode); } + @Override + public Bitmap getSnapshot(Dialog node, boolean includeChildren) throws Exception { + final NodeDescriptor descriptor = descriptorForClass(Window.class); + return descriptor.getSnapshot(node.getWindow(), includeChildren); + } + @Override public void hitTest(Dialog node, Touch touch) { touch.continueWithOffset(0, 0, 0); diff --git a/android/src/main/java/com/facebook/flipper/plugins/inspector/descriptors/DialogFragmentDescriptor.java b/android/src/main/java/com/facebook/flipper/plugins/inspector/descriptors/DialogFragmentDescriptor.java index 5c7e8550f..1ef2df276 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/inspector/descriptors/DialogFragmentDescriptor.java +++ b/android/src/main/java/com/facebook/flipper/plugins/inspector/descriptors/DialogFragmentDescriptor.java @@ -10,6 +10,7 @@ package com.facebook.flipper.plugins.inspector.descriptors; import android.app.Dialog; import android.app.DialogFragment; import android.app.Fragment; +import android.graphics.Bitmap; import com.facebook.flipper.core.FlipperDynamic; import com.facebook.flipper.core.FlipperObject; import com.facebook.flipper.plugins.inspector.Named; @@ -84,6 +85,15 @@ public class DialogFragmentDescriptor extends NodeDescriptor { } } + @Override + public Bitmap getSnapshot(DialogFragment node, boolean includeChildren) throws Exception { + final NodeDescriptor descriptor = descriptorForClass(Dialog.class); + if (node.getDialog() != null) { + return descriptor.getSnapshot(node.getDialog(), includeChildren); + } + return null; + } + @Override public void hitTest(DialogFragment node, Touch touch) { touch.continueWithOffset(0, 0, 0); diff --git a/android/src/main/java/com/facebook/flipper/plugins/inspector/descriptors/DrawableDescriptor.java b/android/src/main/java/com/facebook/flipper/plugins/inspector/descriptors/DrawableDescriptor.java index f5e76ae17..5f90d9dd9 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/inspector/descriptors/DrawableDescriptor.java +++ b/android/src/main/java/com/facebook/flipper/plugins/inspector/descriptors/DrawableDescriptor.java @@ -7,7 +7,10 @@ package com.facebook.flipper.plugins.inspector.descriptors; +import android.graphics.Bitmap; +import android.graphics.Canvas; import android.graphics.Rect; +import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.os.Build; import android.view.View; @@ -132,6 +135,30 @@ public class DrawableDescriptor extends NodeDescriptor { } } + @Override + public Bitmap getSnapshot(Drawable node, boolean includeChildren) throws Exception { + Bitmap bitmap = null; + + if (node instanceof BitmapDrawable) { + BitmapDrawable bitmapDrawable = (BitmapDrawable) node; + if (bitmapDrawable.getBitmap() != null) { + return bitmapDrawable.getBitmap(); + } + } + + if (node.getIntrinsicWidth() <= 0 || node.getIntrinsicHeight() <= 0) { + return null; + } else { + bitmap = + Bitmap.createBitmap( + node.getIntrinsicWidth(), node.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); + } + + Canvas canvas = new Canvas(bitmap); + node.draw(canvas); + return bitmap; + } + @Override public void hitTest(Drawable node, Touch touch) { touch.finish(); diff --git a/android/src/main/java/com/facebook/flipper/plugins/inspector/descriptors/FragmentDescriptor.java b/android/src/main/java/com/facebook/flipper/plugins/inspector/descriptors/FragmentDescriptor.java index eb1fb0fce..c9648d712 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/inspector/descriptors/FragmentDescriptor.java +++ b/android/src/main/java/com/facebook/flipper/plugins/inspector/descriptors/FragmentDescriptor.java @@ -8,6 +8,7 @@ package com.facebook.flipper.plugins.inspector.descriptors; import android.app.Fragment; +import android.graphics.Bitmap; import android.os.Bundle; import android.view.View; import com.facebook.flipper.core.FlipperDynamic; @@ -108,6 +109,16 @@ public class FragmentDescriptor extends NodeDescriptor { descriptor.setHighlighted(node.getView(), selected, isAlignmentMode); } + @Override + public Bitmap getSnapshot(Fragment node, boolean includeChildren) throws Exception { + if (node.getView() == null) { + return null; + } + + final NodeDescriptor descriptor = descriptorForClass(View.class); + return descriptor.getSnapshot(node.getView(), includeChildren); + } + @Override public void hitTest(Fragment node, Touch touch) { touch.continueWithOffset(0, 0, 0); diff --git a/android/src/main/java/com/facebook/flipper/plugins/inspector/descriptors/ImageViewDescriptor.java b/android/src/main/java/com/facebook/flipper/plugins/inspector/descriptors/ImageViewDescriptor.java index e59409248..0b1127ffe 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/inspector/descriptors/ImageViewDescriptor.java +++ b/android/src/main/java/com/facebook/flipper/plugins/inspector/descriptors/ImageViewDescriptor.java @@ -7,6 +7,7 @@ package com.facebook.flipper.plugins.inspector.descriptors; +import android.graphics.Bitmap; import android.view.View; import android.widget.ImageView; import com.facebook.flipper.core.FlipperDynamic; @@ -149,6 +150,12 @@ public class ImageViewDescriptor extends NodeDescriptor { descriptor.setHighlighted(node, selected, isAlignmentMode); } + @Override + public Bitmap getSnapshot(ImageView node, boolean includeChildren) throws Exception { + final NodeDescriptor descriptor = descriptorForClass(View.class); + return descriptor.getSnapshot(node, includeChildren); + } + @Override public void hitTest(ImageView node, Touch touch) throws Exception { final NodeDescriptor descriptor = descriptorForClass(View.class); diff --git a/android/src/main/java/com/facebook/flipper/plugins/inspector/descriptors/ObjectDescriptor.java b/android/src/main/java/com/facebook/flipper/plugins/inspector/descriptors/ObjectDescriptor.java index 7b9935186..ccd576bad 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/inspector/descriptors/ObjectDescriptor.java +++ b/android/src/main/java/com/facebook/flipper/plugins/inspector/descriptors/ObjectDescriptor.java @@ -7,6 +7,7 @@ package com.facebook.flipper.plugins.inspector.descriptors; +import android.graphics.Bitmap; import com.facebook.flipper.core.FlipperDynamic; import com.facebook.flipper.core.FlipperObject; import com.facebook.flipper.plugins.inspector.Named; @@ -62,6 +63,11 @@ public class ObjectDescriptor extends NodeDescriptor { @Override public void setHighlighted(Object node, boolean selected, boolean isAlignmentMode) {} + @Override + public Bitmap getSnapshot(Object node, boolean includeChildren) throws Exception { + return null; + } + @Override public void hitTest(Object node, Touch touch) { touch.finish(); diff --git a/android/src/main/java/com/facebook/flipper/plugins/inspector/descriptors/SupportDialogFragmentDescriptor.java b/android/src/main/java/com/facebook/flipper/plugins/inspector/descriptors/SupportDialogFragmentDescriptor.java index 0d0ecbecc..ef9829bb7 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/inspector/descriptors/SupportDialogFragmentDescriptor.java +++ b/android/src/main/java/com/facebook/flipper/plugins/inspector/descriptors/SupportDialogFragmentDescriptor.java @@ -8,6 +8,7 @@ package com.facebook.flipper.plugins.inspector.descriptors; import android.app.Dialog; +import android.graphics.Bitmap; import androidx.fragment.app.DialogFragment; import androidx.fragment.app.Fragment; import com.facebook.flipper.core.FlipperDynamic; @@ -84,6 +85,15 @@ public class SupportDialogFragmentDescriptor extends NodeDescriptor { descriptor.setHighlighted(node.getView(), selected, isAlignmentMode); } + @Override + public Bitmap getSnapshot(Fragment node, boolean includeChildren) throws Exception { + if (node.getView() == null) { + return null; + } + + final NodeDescriptor descriptor = descriptorForClass(View.class); + return descriptor.getSnapshot(node.getView(), includeChildren); + } + @Override public void hitTest(Fragment node, Touch touch) { touch.continueWithOffset(0, 0, 0); diff --git a/android/src/main/java/com/facebook/flipper/plugins/inspector/descriptors/TextViewDescriptor.java b/android/src/main/java/com/facebook/flipper/plugins/inspector/descriptors/TextViewDescriptor.java index 090264a82..37f3f5fd9 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/inspector/descriptors/TextViewDescriptor.java +++ b/android/src/main/java/com/facebook/flipper/plugins/inspector/descriptors/TextViewDescriptor.java @@ -11,6 +11,7 @@ import static com.facebook.flipper.plugins.inspector.InspectorValue.Type.Color; import static com.facebook.flipper.plugins.inspector.InspectorValue.Type.Number; import static com.facebook.flipper.plugins.inspector.InspectorValue.Type.Text; +import android.graphics.Bitmap; import android.view.View; import android.widget.TextView; import com.facebook.flipper.core.FlipperDynamic; @@ -149,6 +150,12 @@ public class TextViewDescriptor extends NodeDescriptor { descriptor.setHighlighted(node, selected, isAlignmentMode); } + @Override + public Bitmap getSnapshot(TextView node, boolean includeChildren) throws Exception { + final NodeDescriptor descriptor = descriptorForClass(View.class); + return descriptor.getSnapshot(node, includeChildren); + } + @Override public void hitTest(TextView node, Touch touch) throws Exception { final NodeDescriptor descriptor = descriptorForClass(View.class); diff --git a/android/src/main/java/com/facebook/flipper/plugins/inspector/descriptors/ViewDescriptor.java b/android/src/main/java/com/facebook/flipper/plugins/inspector/descriptors/ViewDescriptor.java index 2eef56903..0d117d765 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/inspector/descriptors/ViewDescriptor.java +++ b/android/src/main/java/com/facebook/flipper/plugins/inspector/descriptors/ViewDescriptor.java @@ -11,6 +11,8 @@ import static com.facebook.flipper.plugins.inspector.InspectorValue.Type.Color; import static com.facebook.flipper.plugins.inspector.InspectorValue.Type.Enum; import android.annotation.TargetApi; +import android.graphics.Bitmap; +import android.graphics.Canvas; import android.graphics.Rect; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; @@ -513,6 +515,17 @@ public class ViewDescriptor extends NodeDescriptor { HighlightedOverlay.setHighlighted(targetView, margin, padding, contentBounds, isAlignmentMode); } + @Override + public Bitmap getSnapshot(View node, boolean includeChildren) throws Exception { + if (node.getWidth() == 0 || node.getHeight() == 0) { + return null; + } + Bitmap bitmap = Bitmap.createBitmap(node.getWidth(), node.getHeight(), Bitmap.Config.ARGB_8888); + Canvas c = new Canvas(bitmap); + node.draw(c); + return bitmap; + } + @Override public void hitTest(View node, Touch touch) { touch.finish(); diff --git a/android/src/main/java/com/facebook/flipper/plugins/inspector/descriptors/ViewGroupDescriptor.java b/android/src/main/java/com/facebook/flipper/plugins/inspector/descriptors/ViewGroupDescriptor.java index 2053f156c..73e3ef6c5 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/inspector/descriptors/ViewGroupDescriptor.java +++ b/android/src/main/java/com/facebook/flipper/plugins/inspector/descriptors/ViewGroupDescriptor.java @@ -12,6 +12,7 @@ import static androidx.core.view.ViewGroupCompat.LAYOUT_MODE_OPTICAL_BOUNDS; import static com.facebook.flipper.plugins.inspector.InspectorValue.Type.Boolean; import static com.facebook.flipper.plugins.inspector.InspectorValue.Type.Enum; +import android.graphics.Bitmap; import android.os.Build; import android.view.View; import android.view.ViewGroup; @@ -260,6 +261,12 @@ public class ViewGroupDescriptor extends NodeDescriptor { descriptor.setHighlighted(node, selected, isAlignmentMode); } + @Override + public Bitmap getSnapshot(ViewGroup node, boolean includeChildren) throws Exception { + final NodeDescriptor descriptor = descriptorForClass(View.class); + return descriptor.getSnapshot(node, true); + } + private void runHitTest(ViewGroup node, Touch touch) { boolean finish = true; for (int i = node.getChildCount() - 1; i >= 0; i--) { diff --git a/android/src/main/java/com/facebook/flipper/plugins/inspector/descriptors/WindowDescriptor.java b/android/src/main/java/com/facebook/flipper/plugins/inspector/descriptors/WindowDescriptor.java index 61a26cb70..bedf823a2 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/inspector/descriptors/WindowDescriptor.java +++ b/android/src/main/java/com/facebook/flipper/plugins/inspector/descriptors/WindowDescriptor.java @@ -8,6 +8,7 @@ package com.facebook.flipper.plugins.inspector.descriptors; import android.content.Context; +import android.graphics.Bitmap; import android.util.Log; import android.util.TypedValue; import android.view.View; @@ -130,6 +131,12 @@ public class WindowDescriptor extends NodeDescriptor { descriptor.setHighlighted(node.getDecorView(), selected, isAlignmentMode); } + @Override + public Bitmap getSnapshot(Window node, boolean includeChildren) throws Exception { + final NodeDescriptor descriptor = descriptorForClass(View.class); + return descriptor.getSnapshot(node.getDecorView(), true); + } + @Override public void hitTest(Window node, Touch touch) { touch.continueWithOffset(0, 0, 0); diff --git a/android/src/test/java/com/facebook/flipper/plugins/inspector/DescriptorMappingTest.java b/android/src/test/java/com/facebook/flipper/plugins/inspector/DescriptorMappingTest.java index 3a1f85abf..8d7d7ae5d 100644 --- a/android/src/test/java/com/facebook/flipper/plugins/inspector/DescriptorMappingTest.java +++ b/android/src/test/java/com/facebook/flipper/plugins/inspector/DescriptorMappingTest.java @@ -10,6 +10,7 @@ package com.facebook.flipper.plugins.inspector; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.MatcherAssert.assertThat; +import android.graphics.Bitmap; import com.facebook.flipper.core.FlipperConnection; import com.facebook.flipper.core.FlipperDynamic; import com.facebook.flipper.core.FlipperObject; @@ -72,6 +73,11 @@ public class DescriptorMappingTest { @Override public void setHighlighted(T t, boolean b, boolean b1) throws Exception {} + @Override + public Bitmap getSnapshot(T t, boolean b) throws Exception { + return null; + } + @Override public void hitTest(T node, Touch touch) {} diff --git a/android/src/test/java/com/facebook/flipper/plugins/inspector/InspectorFlipperPluginTest.java b/android/src/test/java/com/facebook/flipper/plugins/inspector/InspectorFlipperPluginTest.java index 6981d0214..9d8879e77 100644 --- a/android/src/test/java/com/facebook/flipper/plugins/inspector/InspectorFlipperPluginTest.java +++ b/android/src/test/java/com/facebook/flipper/plugins/inspector/InspectorFlipperPluginTest.java @@ -14,6 +14,7 @@ import static org.mockito.ArgumentMatchers.any; import static org.robolectric.annotation.LooperMode.Mode.LEGACY; import android.app.Application; +import android.graphics.Bitmap; import android.graphics.Rect; import android.view.View; import android.view.ViewGroup; @@ -415,6 +416,11 @@ public class InspectorFlipperPluginTest { testNode.highlighted = b; } + @Override + public Bitmap getSnapshot(TestNode testNode, boolean includeChildren) { + return null; + } + @Override public void hitTest(TestNode node, Touch touch) { boolean finish = true; diff --git a/desktop/plugins/public/layout/index.tsx b/desktop/plugins/public/layout/index.tsx index aa71975fc..a76cef0ab 100644 --- a/desktop/plugins/public/layout/index.tsx +++ b/desktop/plugins/public/layout/index.tsx @@ -489,16 +489,15 @@ export default class LayoutPlugin extends FlipperPlugin< active={this.state.inTargetMode} /> )} - {!this.props.isArchivedDevice && - this.realClient.query.os === 'iOS' && ( - - )} + {!this.props.isArchivedDevice && ( + + )} {this.realClient.query.os === 'Android' && (