diff --git a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/litho/DebugComponentDescriptor.java b/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/litho/DebugComponentDescriptor.java index b1986555d..63bedd045 100644 --- a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/litho/DebugComponentDescriptor.java +++ b/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/litho/DebugComponentDescriptor.java @@ -22,6 +22,7 @@ import com.facebook.flipper.plugins.inspector.HighlightedOverlay; import com.facebook.flipper.plugins.inspector.InspectorValue; import com.facebook.flipper.plugins.inspector.Named; import com.facebook.flipper.plugins.inspector.NodeDescriptor; +import com.facebook.flipper.plugins.inspector.SetDataOperations; import com.facebook.flipper.plugins.inspector.Touch; import com.facebook.flipper.plugins.inspector.descriptors.ObjectDescriptor; import com.facebook.flipper.plugins.inspector.descriptors.utils.ContextDescriptorUtils; @@ -48,51 +49,61 @@ import javax.annotation.Nullable; public class DebugComponentDescriptor extends NodeDescriptor { - private Map>> mOverrides = new HashMap<>(); + private Map< + String, List>>> + mOverrides = new HashMap<>(); private DebugComponent.Overrider mOverrider = new DebugComponent.Overrider() { @Override public void applyComponentOverrides(String key, Component component) { - final List> overrides = mOverrides.get(key); + final List>> + overrides = mOverrides.get(key); if (overrides == null) { return; } - for (Pair override : overrides) { + for (Pair> override : + overrides) { if (override.first[0].equals("Props")) { - applyReflectiveOverride(component, override.first, override.second); + applyReflectiveOverride( + component, override.first, override.second.first, override.second.second); } } } @Override public void applyStateOverrides(String key, StateContainer stateContainer) { - final List> overrides = mOverrides.get(key); + final List>> + overrides = mOverrides.get(key); if (overrides == null) { return; } - for (Pair override : overrides) { + for (Pair> override : + overrides) { if (override.first[0].equals("State")) { - applyReflectiveOverride(stateContainer, override.first, override.second); + applyReflectiveOverride( + stateContainer, override.first, override.second.first, override.second.second); } } } @Override public void applyLayoutOverrides(String key, DebugLayoutNode node) { - final List> overrides = mOverrides.get(key); + final List>> + overrides = mOverrides.get(key); if (overrides == null) { return; } - for (Pair override : overrides) { + for (Pair> override : + overrides) { if (override.first[0].equals("Layout")) { try { applyLayoutOverride( node, Arrays.copyOfRange(override.first, 1, override.first.length), - override.second); + override.second.second); } catch (Exception ignored) { } } @@ -327,13 +338,18 @@ public class DebugComponentDescriptor extends NodeDescriptor { } @Override - public void setValue(DebugComponent node, String[] path, FlipperDynamic value) { - List> overrides = mOverrides.get(node.getGlobalKey()); + public void setValue( + DebugComponent node, + String[] path, + @Nullable SetDataOperations.FlipperValueHint kind, + FlipperDynamic value) { + List>> overrides = + mOverrides.get(node.getGlobalKey()); if (overrides == null) { overrides = new ArrayList<>(); mOverrides.put(node.getGlobalKey(), overrides); } - overrides.add(new Pair<>(path, value)); + overrides.add(new Pair<>(path, new Pair<>(kind, value))); node.setOverrider(mOverrider); node.rerender(); @@ -554,11 +570,13 @@ public class DebugComponentDescriptor extends NodeDescriptor { // The path follows the pattern (Props|State)/field/(field|index)* private static void applyReflectiveOverride( - Object o, final String[] path, final FlipperDynamic dynamic) { + Object o, + final String[] path, + @Nullable SetDataOperations.FlipperValueHint hint, + final FlipperDynamic dynamic) { try { final Field field = o.getClass().getDeclaredField(path[1]); - FlipperEditor.updateComponent(path, field, o, dynamic); - + FlipperEditor.updateComponent(path, field, o, hint, dynamic); } catch (Exception ignored) { } } diff --git a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/litho/DebugSectionDescriptor.java b/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/litho/DebugSectionDescriptor.java index 168514f45..5807629c3 100644 --- a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/litho/DebugSectionDescriptor.java +++ b/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/litho/DebugSectionDescriptor.java @@ -18,6 +18,7 @@ import com.facebook.flipper.core.FlipperObject; import com.facebook.flipper.plugins.inspector.HighlightedOverlay; import com.facebook.flipper.plugins.inspector.Named; import com.facebook.flipper.plugins.inspector.NodeDescriptor; +import com.facebook.flipper.plugins.inspector.SetDataOperations; import com.facebook.flipper.plugins.inspector.Touch; import com.facebook.litho.sections.Section; import com.facebook.litho.sections.debug.DebugSection; @@ -96,7 +97,12 @@ public class DebugSectionDescriptor extends NodeDescriptor { } @Override - public void setValue(DebugSection node, String[] path, FlipperDynamic value) throws Exception { + public void setValue( + DebugSection node, + String[] path, + @Nullable SetDataOperations.FlipperValueHint kind, + FlipperDynamic value) + throws Exception { // TODO T39526148 } diff --git a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/litho/FlipperEditor.java b/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/litho/FlipperEditor.java index 771e5b0fb..54b4f0d4d 100644 --- a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/litho/FlipperEditor.java +++ b/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/litho/FlipperEditor.java @@ -7,11 +7,13 @@ package com.facebook.flipper.plugins.litho; +import androidx.core.util.Pair; import com.facebook.flipper.core.FlipperArray; import com.facebook.flipper.core.FlipperDynamic; import com.facebook.flipper.core.FlipperObject; import com.facebook.flipper.core.FlipperValue; import com.facebook.flipper.plugins.inspector.InspectorValue; +import com.facebook.flipper.plugins.inspector.SetDataOperations; import com.facebook.litho.editor.EditorRegistry; import com.facebook.litho.editor.model.EditorArray; import com.facebook.litho.editor.model.EditorBool; @@ -20,7 +22,10 @@ import com.facebook.litho.editor.model.EditorShape; import com.facebook.litho.editor.model.EditorString; import com.facebook.litho.editor.model.EditorValue; import java.lang.reflect.Field; +import java.util.ArrayList; import java.util.HashMap; +import java.util.Iterator; +import java.util.List; import java.util.Map; import javax.annotation.Nullable; @@ -53,7 +58,36 @@ public class FlipperEditor { * chain into the object. Fields retain their name, positions in an array use their index. */ public static @Nullable Boolean updateComponent( - String[] path, Field field, Object o, FlipperDynamic dynamic) { + String[] path, + Field field, + Object o, + final @Nullable SetDataOperations.FlipperValueHint hint, + FlipperDynamic dynamic) { + EditorValue edit = parseEditorValue(hint, dynamic); + for (int i = path.length - 1; i > 0; i--) { + HashMap content = new HashMap<>(); + content.put(path[i], edit); + edit = EditorValue.shape(content); + } + return EditorRegistry.write(field.getType(), field, o, edit); + } + + /** + * Layout Plugin supports a protocol that tags the type of all messages. This enables support for + * heterogeneous Maps and Arrays. + * + * @param hint type hint for the FlipperDynamic parameter + * @param dynamic The value produced by the Flipper user + * @return an EditorValue extracted from dynamic + */ + private static EditorValue parseEditorValue( + @Nullable SetDataOperations.FlipperValueHint hint, FlipperDynamic dynamic) { + // TODO(festevezga) - Remove educated guess when the Layout Plugin is updated to produce tagged + // messages + return hint == null ? guessEditorValue(dynamic) : extractEditorValue(hint, dynamic); + } + + private static EditorValue guessEditorValue(FlipperDynamic dynamic) { Object raw = dynamic.raw(); EditorValue edit; if (raw instanceof String) { @@ -65,12 +99,59 @@ public class FlipperEditor { } else { edit = EditorValue.string(raw.toString()); } - for (int i = path.length - 1; i > 0; i--) { - HashMap content = new HashMap<>(); - content.put(path[i], edit); - edit = EditorValue.shape(content); + return edit; + } + + /** + * This method flattens the Layout Editor messages using the type hints, recursively. + * + * @param hint type hint for the FlipperDynamic parameter + * @param dynamic The value produced by the Flipper user + * @return an EditorValue extracted from dynamic + */ + private static EditorValue extractEditorValue( + SetDataOperations.FlipperValueHint hint, FlipperDynamic dynamic) { + switch (hint) { + case STRING: + return EditorValue.string(dynamic.asString()); + case NUMBER: + return EditorValue.number(dynamic.asDouble()); + case OBJECT: + return EditorValue.shape(parseObject(dynamic.asObject())); + case ARRAY: + return EditorValue.array(parseArray(dynamic.asArray())); + case NULL: + // TODO(festevezga) - add support for null + return EditorValue.string("null"); + default: + // Java switch isn't exhaustive before Java 13 + return EditorValue.string("If you see this, report an error to the Flipper repository"); } - return EditorRegistry.write(field.getType(), field, o, edit); + } + + private static Map parseObject(FlipperObject flipperObject) { + final Iterator keys = flipperObject.keys(); + final Map values = new HashMap<>(); + while (keys.hasNext()) { + final String field = keys.next(); + final FlipperObject object = flipperObject.getObject(field); + final Pair value = + SetDataOperations.parseLayoutEditorMessage(object); + values.put(field, parseEditorValue(value.first, value.second)); + } + return values; + } + + private static List parseArray(FlipperArray flipperArray) { + ArrayList values = new ArrayList<>(); + for (int i = 0; i < flipperArray.length(); i++) { + final FlipperObject object = flipperArray.getObject(i); + final Pair value = + SetDataOperations.parseLayoutEditorMessage(object); + values.add(parseEditorValue(value.first, value.second)); + } + + return values; } /** Converts into one of FlipperValue, FlipperObject, or FlipperArray */ diff --git a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/litho/LithoRecyclerViewDescriptor.java b/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/litho/LithoRecyclerViewDescriptor.java index bc1ddbadb..48e67409d 100644 --- a/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/litho/LithoRecyclerViewDescriptor.java +++ b/android/plugins/litho/src/main/java/com/facebook/flipper/plugins/litho/LithoRecyclerViewDescriptor.java @@ -13,11 +13,13 @@ import com.facebook.flipper.core.FlipperDynamic; import com.facebook.flipper.core.FlipperObject; import com.facebook.flipper.plugins.inspector.Named; import com.facebook.flipper.plugins.inspector.NodeDescriptor; +import com.facebook.flipper.plugins.inspector.SetDataOperations; import com.facebook.flipper.plugins.inspector.Touch; import com.facebook.litho.sections.debug.DebugSection; import com.facebook.litho.widget.LithoRecylerView; import java.util.ArrayList; import java.util.List; +import javax.annotation.Nullable; public class LithoRecyclerViewDescriptor extends NodeDescriptor { @@ -105,10 +107,14 @@ public class LithoRecyclerViewDescriptor extends NodeDescriptor { } @Override - public void setValue(LithoView node, String[] path, FlipperDynamic value) throws Exception { + public void setValue( + LithoView node, + String[] path, + @Nullable SetDataOperations.FlipperValueHint kind, + FlipperDynamic value) + throws Exception { final NodeDescriptor descriptor = descriptorForClass(ViewGroup.class); - descriptor.setValue(node, path, value); + descriptor.setValue(node, path, kind, value); } @Override 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 cf98d730f..d0e052289 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 @@ -12,6 +12,7 @@ import android.content.Context; import android.view.View; import android.view.ViewGroup; import android.view.accessibility.AccessibilityEvent; +import androidx.core.util.Pair; import com.facebook.flipper.core.ErrorReportingRunnable; import com.facebook.flipper.core.FlipperArray; import com.facebook.flipper.core.FlipperConnection; @@ -331,7 +332,23 @@ public class InspectorFlipperPlugin implements FlipperPlugin { final String nodeId = params.getString("id"); final boolean ax = params.getBoolean("ax"); final FlipperArray keyPath = params.getArray("path"); - final FlipperDynamic value = params.getDynamic("value"); + + SetDataOperations.FlipperValueHint hint; + FlipperDynamic value; + final Object wrapper = params.get("value"); + if (wrapper instanceof FlipperObject && ((FlipperObject) wrapper).contains("kind")) { + + // New message with tagged types + final Pair message = + SetDataOperations.parseLayoutEditorMessage((FlipperObject) wrapper); + hint = message.first; + value = message.second; + + } else { + // Old message with untagged types + hint = null; + value = params.getDynamic("value"); + } final Object obj = mObjectTracker.get(nodeId); if (obj == null) { @@ -349,7 +366,7 @@ public class InspectorFlipperPlugin implements FlipperPlugin { path[i] = keyPath.getString(i); } - descriptor.setValue(obj, path, value); + descriptor.setValue(obj, path, hint, value); responder.success(ax ? getAXNode(nodeId) : null); } }; 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 c1bb34bc0..92bada8db 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 @@ -149,7 +149,12 @@ public abstract class NodeDescriptor { * provided by {@link this#getData(Object)} and the value will be of the same type as the value * mathcing that path in the returned object. */ - public abstract void setValue(T node, String[] path, FlipperDynamic value) throws Exception; + public abstract void setValue( + T node, + String[] path, + @Nullable SetDataOperations.FlipperValueHint kind, + FlipperDynamic value) + throws Exception; /** * Get the attributes for this node. This is a list of read-only string:string mapping which show diff --git a/android/src/main/java/com/facebook/flipper/plugins/inspector/SetDataOperations.java b/android/src/main/java/com/facebook/flipper/plugins/inspector/SetDataOperations.java new file mode 100644 index 000000000..270dbc542 --- /dev/null +++ b/android/src/main/java/com/facebook/flipper/plugins/inspector/SetDataOperations.java @@ -0,0 +1,54 @@ +/* + * 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.inspector; + +import androidx.core.util.Pair; +import com.facebook.flipper.core.FlipperDynamic; +import com.facebook.flipper.core.FlipperObject; +import javax.annotation.Nullable; + +public final class SetDataOperations { + private SetDataOperations() {} + + /** + * Extracts the type hint and data from a FlipperObject that follows the Layout Editor protocol + * + * @param wrapper the object containing the elements + * @return a pair of a nullable hint and the uncasted value as a FlipperDynamic + */ + public static Pair parseLayoutEditorMessage( + FlipperObject wrapper) { + final FlipperValueHint kind = FlipperValueHint.fromString(wrapper.getString("kind")); + final FlipperDynamic value = wrapper.getDynamic("data"); + return new Pair<>(kind, value); + } + + /** Each supported type of the Layout Editor protocol for values */ + public enum FlipperValueHint { + STRING("string"), + NUMBER("number"), + OBJECT("object"), + ARRAY("array"), + NULL("null"); + + public final String value; + + FlipperValueHint(String value) { + this.value = value; + } + + public static @Nullable FlipperValueHint fromString(String value) { + for (FlipperValueHint hint : values()) { + if (hint.value.equals(value)) { + return hint; + } + } + return null; + } + } +} 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 8a4b1a9dc..4d4145763 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 @@ -14,6 +14,7 @@ import com.facebook.flipper.core.FlipperDynamic; import com.facebook.flipper.core.FlipperObject; import com.facebook.flipper.plugins.inspector.Named; import com.facebook.flipper.plugins.inspector.NodeDescriptor; +import com.facebook.flipper.plugins.inspector.SetDataOperations; import com.facebook.flipper.plugins.inspector.Touch; import com.facebook.flipper.plugins.inspector.descriptors.utils.ContextDescriptorUtils; import com.facebook.flipper.plugins.inspector.descriptors.utils.stethocopies.FragmentActivityAccessor; @@ -73,7 +74,12 @@ public class ActivityDescriptor extends NodeDescriptor { } @Override - public void setValue(Activity node, String[] path, FlipperDynamic value) throws Exception {} + public void setValue( + Activity node, + String[] path, + @Nullable SetDataOperations.FlipperValueHint kind, + FlipperDynamic value) + throws Exception {} @Override public List> getAttributes(Activity node) { 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 a3457fd1b..416669068 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 @@ -18,6 +18,7 @@ import com.facebook.flipper.core.FlipperObject; import com.facebook.flipper.plugins.inspector.ApplicationWrapper; import com.facebook.flipper.plugins.inspector.Named; import com.facebook.flipper.plugins.inspector.NodeDescriptor; +import com.facebook.flipper.plugins.inspector.SetDataOperations; import com.facebook.flipper.plugins.inspector.Touch; import com.facebook.flipper.plugins.inspector.descriptors.utils.ContextDescriptorUtils; import java.util.ArrayList; @@ -210,7 +211,11 @@ public class ApplicationDescriptor extends NodeDescriptor { } @Override - public void setValue(ApplicationWrapper node, String[] path, FlipperDynamic value) {} + public void setValue( + ApplicationWrapper node, + String[] path, + @Nullable SetDataOperations.FlipperValueHint kind, + FlipperDynamic value) {} @Override public List> getAttributes(ApplicationWrapper 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 89fca2f29..e4f5f7594 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 @@ -13,6 +13,7 @@ import com.facebook.flipper.core.FlipperDynamic; import com.facebook.flipper.core.FlipperObject; import com.facebook.flipper.plugins.inspector.Named; import com.facebook.flipper.plugins.inspector.NodeDescriptor; +import com.facebook.flipper.plugins.inspector.SetDataOperations; import com.facebook.flipper.plugins.inspector.Touch; import java.util.Collections; import java.util.List; @@ -49,7 +50,11 @@ public class DialogDescriptor extends NodeDescriptor { } @Override - public void setValue(Dialog node, String[] path, FlipperDynamic value) {} + public void setValue( + Dialog node, + String[] path, + @Nullable SetDataOperations.FlipperValueHint kind, + FlipperDynamic value) {} @Override public List> getAttributes(Dialog node) { 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 e06717400..ce7c4788b 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 @@ -14,6 +14,7 @@ import com.facebook.flipper.core.FlipperDynamic; import com.facebook.flipper.core.FlipperObject; import com.facebook.flipper.plugins.inspector.Named; import com.facebook.flipper.plugins.inspector.NodeDescriptor; +import com.facebook.flipper.plugins.inspector.SetDataOperations; import com.facebook.flipper.plugins.inspector.Touch; import java.util.List; import javax.annotation.Nullable; @@ -52,9 +53,14 @@ public class DialogFragmentDescriptor extends NodeDescriptor { } @Override - public void setValue(DialogFragment node, String[] path, FlipperDynamic value) throws Exception { + public void setValue( + DialogFragment node, + String[] path, + @Nullable SetDataOperations.FlipperValueHint kind, + FlipperDynamic value) + throws Exception { final NodeDescriptor descriptor = descriptorForClass(Fragment.class); - descriptor.setValue(node, path, value); + descriptor.setValue(node, path, kind, value); } @Override 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 91c817739..0e2e56040 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 @@ -17,6 +17,7 @@ import com.facebook.flipper.plugins.inspector.HighlightedOverlay; import com.facebook.flipper.plugins.inspector.InspectorValue; import com.facebook.flipper.plugins.inspector.Named; import com.facebook.flipper.plugins.inspector.NodeDescriptor; +import com.facebook.flipper.plugins.inspector.SetDataOperations; import com.facebook.flipper.plugins.inspector.Touch; import java.util.Arrays; import java.util.Collections; @@ -66,7 +67,11 @@ public class DrawableDescriptor extends NodeDescriptor { } @Override - public void setValue(Drawable node, String[] path, FlipperDynamic value) { + public void setValue( + Drawable node, + String[] path, + @Nullable SetDataOperations.FlipperValueHint kind, + FlipperDynamic value) { final Rect bounds = node.getBounds(); switch (path[0]) { 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 22deb9304..a90ae9177 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 @@ -14,6 +14,7 @@ import com.facebook.flipper.core.FlipperDynamic; import com.facebook.flipper.core.FlipperObject; import com.facebook.flipper.plugins.inspector.Named; import com.facebook.flipper.plugins.inspector.NodeDescriptor; +import com.facebook.flipper.plugins.inspector.SetDataOperations; import com.facebook.flipper.plugins.inspector.Touch; import com.facebook.flipper.plugins.inspector.descriptors.utils.stethocopies.ResourcesUtil; import java.util.Arrays; @@ -63,7 +64,11 @@ public class FragmentDescriptor extends NodeDescriptor { } @Override - public void setValue(Fragment node, String[] path, FlipperDynamic value) {} + public void setValue( + Fragment node, + String[] path, + @Nullable SetDataOperations.FlipperValueHint kind, + FlipperDynamic value) {} @Override public List> getAttributes(Fragment node) { 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 ac14cb39e..2627b536a 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 @@ -11,6 +11,7 @@ import com.facebook.flipper.core.FlipperDynamic; import com.facebook.flipper.core.FlipperObject; import com.facebook.flipper.plugins.inspector.Named; import com.facebook.flipper.plugins.inspector.NodeDescriptor; +import com.facebook.flipper.plugins.inspector.SetDataOperations; import com.facebook.flipper.plugins.inspector.Touch; import java.util.Collections; import java.util.List; @@ -47,7 +48,11 @@ public class ObjectDescriptor extends NodeDescriptor { } @Override - public void setValue(Object node, String[] path, FlipperDynamic value) {} + public void setValue( + Object node, + String[] path, + @Nullable SetDataOperations.FlipperValueHint kind, + FlipperDynamic value) {} @Override public List> getAttributes(Object node) { 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 bca93ee0a..517d6830c 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 @@ -14,6 +14,7 @@ import com.facebook.flipper.core.FlipperDynamic; import com.facebook.flipper.core.FlipperObject; import com.facebook.flipper.plugins.inspector.Named; import com.facebook.flipper.plugins.inspector.NodeDescriptor; +import com.facebook.flipper.plugins.inspector.SetDataOperations; import com.facebook.flipper.plugins.inspector.Touch; import java.util.List; import javax.annotation.Nullable; @@ -52,9 +53,14 @@ public class SupportDialogFragmentDescriptor extends NodeDescriptor { } @Override - public void setValue(Fragment node, String[] path, FlipperDynamic value) {} + public void setValue( + Fragment node, + String[] path, + @Nullable SetDataOperations.FlipperValueHint kind, + FlipperDynamic value) {} @Override public List> getAttributes(Fragment node) { 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 a2c2f86d3..8e99ce808 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 @@ -18,6 +18,7 @@ import com.facebook.flipper.core.FlipperObject; import com.facebook.flipper.plugins.inspector.InspectorValue; import com.facebook.flipper.plugins.inspector.Named; import com.facebook.flipper.plugins.inspector.NodeDescriptor; +import com.facebook.flipper.plugins.inspector.SetDataOperations; import com.facebook.flipper.plugins.inspector.Touch; import java.util.ArrayList; import java.util.List; @@ -95,7 +96,12 @@ public class TextViewDescriptor extends NodeDescriptor { } @Override - public void setValue(TextView node, String[] path, FlipperDynamic value) throws Exception { + public void setValue( + TextView node, + String[] path, + @Nullable SetDataOperations.FlipperValueHint kind, + FlipperDynamic value) + throws Exception { switch (path[0]) { case "TextView": switch (path[1]) { @@ -112,7 +118,7 @@ public class TextViewDescriptor extends NodeDescriptor { break; default: final NodeDescriptor descriptor = descriptorForClass(View.class); - descriptor.setValue(node, path, value); + descriptor.setValue(node, path, kind, value); break; } invalidate(node); 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 7e8e750ca..529f4a730 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 @@ -34,6 +34,7 @@ import com.facebook.flipper.plugins.inspector.HighlightedOverlay; import com.facebook.flipper.plugins.inspector.InspectorValue; import com.facebook.flipper.plugins.inspector.Named; import com.facebook.flipper.plugins.inspector.NodeDescriptor; +import com.facebook.flipper.plugins.inspector.SetDataOperations; import com.facebook.flipper.plugins.inspector.Touch; import com.facebook.flipper.plugins.inspector.descriptors.utils.AccessibilityEvaluationUtil; import com.facebook.flipper.plugins.inspector.descriptors.utils.AccessibilityRoleUtil; @@ -202,7 +203,11 @@ public class ViewDescriptor extends NodeDescriptor { @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) @Override - public void setValue(View node, String[] path, FlipperDynamic value) { + public void setValue( + View node, + String[] path, + @Nullable SetDataOperations.FlipperValueHint kind, + FlipperDynamic value) { if (path[0].equals(axViewPropsTitle) || path[0].equals(axNodeInfoPropsTitle) || path[0].equals(axTalkbackPropsTitle)) { 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 3c1042176..ab2de35b6 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 @@ -23,6 +23,7 @@ import com.facebook.flipper.plugins.inspector.HiddenNode; import com.facebook.flipper.plugins.inspector.InspectorValue; import com.facebook.flipper.plugins.inspector.Named; import com.facebook.flipper.plugins.inspector.NodeDescriptor; +import com.facebook.flipper.plugins.inspector.SetDataOperations; import com.facebook.flipper.plugins.inspector.Touch; import com.facebook.flipper.plugins.inspector.descriptors.utils.stethocopies.FragmentCompatUtil; import java.util.ArrayList; @@ -196,7 +197,12 @@ public class ViewGroupDescriptor extends NodeDescriptor { } @Override - public void setValue(ViewGroup node, String[] path, FlipperDynamic value) throws Exception { + public void setValue( + ViewGroup node, + String[] path, + @Nullable SetDataOperations.FlipperValueHint kind, + FlipperDynamic value) + throws Exception { switch (path[0]) { case "ViewGroup": switch (path[1]) { @@ -223,7 +229,7 @@ public class ViewGroupDescriptor extends NodeDescriptor { break; default: final NodeDescriptor descriptor = descriptorForClass(View.class); - descriptor.setValue(node, path, value); + descriptor.setValue(node, path, kind, value); break; } invalidate(node); 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 4ed7bc9c3..3482396c4 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 @@ -16,6 +16,7 @@ import com.facebook.flipper.core.FlipperDynamic; import com.facebook.flipper.core.FlipperObject; import com.facebook.flipper.plugins.inspector.Named; import com.facebook.flipper.plugins.inspector.NodeDescriptor; +import com.facebook.flipper.plugins.inspector.SetDataOperations; import com.facebook.flipper.plugins.inspector.Touch; import java.lang.reflect.Field; import java.util.Collections; @@ -111,7 +112,11 @@ public class WindowDescriptor extends NodeDescriptor { } @Override - public void setValue(Window node, String[] path, FlipperDynamic value) {} + public void setValue( + Window node, + String[] path, + @Nullable SetDataOperations.FlipperValueHint kind, + FlipperDynamic value) {} @Override public List> getAttributes(Window node) { 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 063d0e663..bf7dacae8 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 @@ -15,6 +15,7 @@ import com.facebook.flipper.core.FlipperDynamic; import com.facebook.flipper.core.FlipperObject; import com.facebook.flipper.testing.FlipperConnectionMock; import java.util.List; +import javax.annotation.Nullable; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; @@ -56,7 +57,12 @@ public class DescriptorMappingTest { } @Override - public void setValue(T node, String[] path, FlipperDynamic value) throws Exception {} + public void setValue( + T node, + String[] path, + @Nullable SetDataOperations.FlipperValueHint kind, + FlipperDynamic value) + throws Exception {} @Override public List> getAttributes(T node) { 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 b2f527e75..336b13be1 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 @@ -394,7 +394,12 @@ public class InspectorFlipperPluginTest { } @Override - public void setValue(TestNode node, String[] path, FlipperDynamic value) throws Exception { + public void setValue( + TestNode node, + String[] path, + @Nullable SetDataOperations.FlipperValueHint kind, + FlipperDynamic value) + throws Exception { if (path[0].equals("data")) { node.data = value.asObject(); }