From 2c48afdf0423223d5344ae6316432860079873c4 Mon Sep 17 00:00:00 2001 From: Phoomraphee Luenam Date: Mon, 6 Aug 2018 07:38:36 -0700 Subject: [PATCH] Implement AlignmentMode in layoutplugin Summary: Add a Button to toggle alignment lines on Sonar interface. Call sonar plugin in java, sending isAlignmentMode flag. Changed API for setHighlighted to include alignment mode flag. Button design to be added in future diffs by @[100003260904633:maximg] Reviewed By: danielbuechele Differential Revision: D9123749 fbshipit-source-id: 01c299f299be30dbb695bfb1d8007d63c27643d5 --- .../plugins/inspector/HighlightedOverlay.java | 6 +-- .../inspector/InspectorSonarPlugin.java | 12 ++--- .../plugins/inspector/NodeDescriptor.java | 3 +- .../descriptors/ActivityDescriptor.java | 4 +- .../descriptors/ApplicationDescriptor.java | 4 +- .../descriptors/DialogDescriptor.java | 4 +- .../descriptors/DialogFragmentDescriptor.java | 4 +- .../descriptors/DrawableDescriptor.java | 4 +- .../descriptors/FragmentDescriptor.java | 4 +- .../descriptors/ObjectDescriptor.java | 2 +- .../SupportDialogFragmentDescriptor.java | 4 +- .../SupportFragmentDescriptor.java | 4 +- .../descriptors/TextViewDescriptor.java | 4 +- .../inspector/descriptors/ViewDescriptor.java | 4 +- .../descriptors/ViewGroupDescriptor.java | 4 +- .../descriptors/WindowDescriptor.java | 5 ++- .../litho/DebugComponentDescriptor.java | 4 +- .../plugins/litho/LithoViewDescriptor.java | 4 +- src/plugins/layout/index.js | 44 +++++++++++++++++-- 19 files changed, 80 insertions(+), 44 deletions(-) diff --git a/android/src/main/java/com/facebook/sonar/plugins/inspector/HighlightedOverlay.java b/android/src/main/java/com/facebook/sonar/plugins/inspector/HighlightedOverlay.java index 217b20664..ab46136b4 100644 --- a/android/src/main/java/com/facebook/sonar/plugins/inspector/HighlightedOverlay.java +++ b/android/src/main/java/com/facebook/sonar/plugins/inspector/HighlightedOverlay.java @@ -30,12 +30,8 @@ public class HighlightedOverlay { * @param padding A {@link Rect} containing the padding values * @param contentBounds The {@link Rect} bounds of the content, which includes padding */ - public static void setHighlighted( - View targetView, Rect margin, Rect padding, Rect contentBounds) { - setHighlightedAndAlignment(targetView, margin, padding, contentBounds, false); - } - public static void setHighlightedAndAlignment( + public static void setHighlighted( View targetView, Rect margin, Rect padding, Rect contentBounds, boolean isAlignmentMode) { if (!VIEW_OVERLAY_SUPPORT) { return; diff --git a/android/src/main/java/com/facebook/sonar/plugins/inspector/InspectorSonarPlugin.java b/android/src/main/java/com/facebook/sonar/plugins/inspector/InspectorSonarPlugin.java index 6e2768f53..faad04430 100644 --- a/android/src/main/java/com/facebook/sonar/plugins/inspector/InspectorSonarPlugin.java +++ b/android/src/main/java/com/facebook/sonar/plugins/inspector/InspectorSonarPlugin.java @@ -151,7 +151,7 @@ public class InspectorSonarPlugin implements SonarPlugin { @Override public void onDisconnect() throws Exception { if (mHighlightedId != null) { - setHighlighted(mHighlightedId, false); + setHighlighted(mHighlightedId, false, false); mHighlightedId = null; } @@ -292,15 +292,15 @@ public class InspectorSonarPlugin implements SonarPlugin { public void onReceiveOnMainThread(final SonarObject params, SonarResponder responder) throws Exception { final String nodeId = params.getString("id"); + final boolean isAlignmentMode = params.getBoolean("isAlignmentMode"); if (mHighlightedId != null) { - setHighlighted(mHighlightedId, false); + setHighlighted(mHighlightedId, false, isAlignmentMode); } if (nodeId != null) { - setHighlighted(nodeId, true); + setHighlighted(nodeId, true, isAlignmentMode); } - mHighlightedId = nodeId; } }; @@ -416,7 +416,7 @@ public class InspectorSonarPlugin implements SonarPlugin { descriptor.hitTest(mApplication, touch); } - private void setHighlighted(final String id, final boolean highlighted) throws Exception { + private void setHighlighted(final String id, final boolean highlighted, final boolean isAlignmentMode) throws Exception { final Object obj = mObjectTracker.get(id); if (obj == null) { return; @@ -427,7 +427,7 @@ public class InspectorSonarPlugin implements SonarPlugin { return; } - descriptor.setHighlighted(obj, highlighted); + descriptor.setHighlighted(obj, highlighted, isAlignmentMode); } public SearchResultNode searchTree(String query, Object obj) throws Exception { diff --git a/android/src/main/java/com/facebook/sonar/plugins/inspector/NodeDescriptor.java b/android/src/main/java/com/facebook/sonar/plugins/inspector/NodeDescriptor.java index dbda90cda..9f97c53c7 100644 --- a/android/src/main/java/com/facebook/sonar/plugins/inspector/NodeDescriptor.java +++ b/android/src/main/java/com/facebook/sonar/plugins/inspector/NodeDescriptor.java @@ -167,7 +167,8 @@ public abstract class NodeDescriptor { * node which is selected in the inspector. The plugin automatically takes care of de-selecting * the previously highlighted node. */ - public abstract void setHighlighted(T node, boolean selected) throws Exception; + public abstract void setHighlighted(T node, boolean selected, boolean isAlignmentMode) + throws Exception; /** * Perform hit testing on the given node. Either continue the search in a child with {@link diff --git a/android/src/main/java/com/facebook/sonar/plugins/inspector/descriptors/ActivityDescriptor.java b/android/src/main/java/com/facebook/sonar/plugins/inspector/descriptors/ActivityDescriptor.java index 12998afe0..bfb19c243 100644 --- a/android/src/main/java/com/facebook/sonar/plugins/inspector/descriptors/ActivityDescriptor.java +++ b/android/src/main/java/com/facebook/sonar/plugins/inspector/descriptors/ActivityDescriptor.java @@ -78,9 +78,9 @@ public class ActivityDescriptor extends NodeDescriptor { } @Override - public void setHighlighted(Activity node, boolean selected) throws Exception { + public void setHighlighted(Activity node, boolean selected, boolean isAlignmentMode) throws Exception { final NodeDescriptor descriptor = descriptorForClass(Window.class); - descriptor.setHighlighted(node.getWindow(), selected); + descriptor.setHighlighted(node.getWindow(), selected, isAlignmentMode); } @Override diff --git a/android/src/main/java/com/facebook/sonar/plugins/inspector/descriptors/ApplicationDescriptor.java b/android/src/main/java/com/facebook/sonar/plugins/inspector/descriptors/ApplicationDescriptor.java index 0284ad4a9..56507d5ed 100644 --- a/android/src/main/java/com/facebook/sonar/plugins/inspector/descriptors/ApplicationDescriptor.java +++ b/android/src/main/java/com/facebook/sonar/plugins/inspector/descriptors/ApplicationDescriptor.java @@ -186,12 +186,12 @@ public class ApplicationDescriptor extends NodeDescriptor { } @Override - public void setHighlighted(ApplicationWrapper node, boolean selected) throws Exception { + public void setHighlighted(ApplicationWrapper node, boolean selected, boolean isAlignmentMode) throws Exception { final int childCount = getChildCount(node); if (childCount > 0) { final Object topChild = getChildAt(node, childCount - 1); final NodeDescriptor descriptor = descriptorForClass(topChild.getClass()); - descriptor.setHighlighted(topChild, selected); + descriptor.setHighlighted(topChild, selected, isAlignmentMode); } } diff --git a/android/src/main/java/com/facebook/sonar/plugins/inspector/descriptors/DialogDescriptor.java b/android/src/main/java/com/facebook/sonar/plugins/inspector/descriptors/DialogDescriptor.java index 4e16cc21a..d79aefb11 100644 --- a/android/src/main/java/com/facebook/sonar/plugins/inspector/descriptors/DialogDescriptor.java +++ b/android/src/main/java/com/facebook/sonar/plugins/inspector/descriptors/DialogDescriptor.java @@ -58,9 +58,9 @@ public class DialogDescriptor extends NodeDescriptor { } @Override - public void setHighlighted(Dialog node, boolean selected) throws Exception { + public void setHighlighted(Dialog node, boolean selected, boolean isAlignmentMode) throws Exception { final NodeDescriptor descriptor = descriptorForClass(Window.class); - descriptor.setHighlighted(node.getWindow(), selected); + descriptor.setHighlighted(node.getWindow(), selected, isAlignmentMode); } @Override diff --git a/android/src/main/java/com/facebook/sonar/plugins/inspector/descriptors/DialogFragmentDescriptor.java b/android/src/main/java/com/facebook/sonar/plugins/inspector/descriptors/DialogFragmentDescriptor.java index b47604d53..6cd9ae942 100644 --- a/android/src/main/java/com/facebook/sonar/plugins/inspector/descriptors/DialogFragmentDescriptor.java +++ b/android/src/main/java/com/facebook/sonar/plugins/inspector/descriptors/DialogFragmentDescriptor.java @@ -71,10 +71,10 @@ public class DialogFragmentDescriptor extends NodeDescriptor { } @Override - public void setHighlighted(DialogFragment node, boolean selected) throws Exception { + public void setHighlighted(DialogFragment node, boolean selected, boolean isAlignmentMode) throws Exception { final NodeDescriptor descriptor = descriptorForClass(Dialog.class); if (node.getDialog() != null) { - descriptor.setHighlighted(node.getDialog(), selected); + descriptor.setHighlighted(node.getDialog(), selected, isAlignmentMode); } } diff --git a/android/src/main/java/com/facebook/sonar/plugins/inspector/descriptors/DrawableDescriptor.java b/android/src/main/java/com/facebook/sonar/plugins/inspector/descriptors/DrawableDescriptor.java index eaba20d4b..e7c8b97f4 100644 --- a/android/src/main/java/com/facebook/sonar/plugins/inspector/descriptors/DrawableDescriptor.java +++ b/android/src/main/java/com/facebook/sonar/plugins/inspector/descriptors/DrawableDescriptor.java @@ -107,7 +107,7 @@ public class DrawableDescriptor extends NodeDescriptor { } @Override - public void setHighlighted(Drawable node, boolean selected) { + public void setHighlighted(Drawable node, boolean selected, boolean isAlignmentMode) { // Ensure we handle wrapping drawable Drawable.Callback callbacks = node.getCallback(); while (callbacks instanceof Drawable) { @@ -122,7 +122,7 @@ public class DrawableDescriptor extends NodeDescriptor { if (selected) { final Rect zero = new Rect(); final Rect bounds = node.getBounds(); - HighlightedOverlay.setHighlighted(callbackView, zero, zero, bounds); + HighlightedOverlay.setHighlighted(callbackView, zero, zero, bounds, isAlignmentMode); } else { HighlightedOverlay.removeHighlight(callbackView); } diff --git a/android/src/main/java/com/facebook/sonar/plugins/inspector/descriptors/FragmentDescriptor.java b/android/src/main/java/com/facebook/sonar/plugins/inspector/descriptors/FragmentDescriptor.java index dbfc7f49a..397b34286 100644 --- a/android/src/main/java/com/facebook/sonar/plugins/inspector/descriptors/FragmentDescriptor.java +++ b/android/src/main/java/com/facebook/sonar/plugins/inspector/descriptors/FragmentDescriptor.java @@ -94,13 +94,13 @@ public class FragmentDescriptor extends NodeDescriptor { } @Override - public void setHighlighted(Fragment node, boolean selected) throws Exception { + public void setHighlighted(Fragment node, boolean selected, boolean isAlignmentMode) throws Exception { if (node.getView() == null) { return; } final NodeDescriptor descriptor = descriptorForClass(View.class); - descriptor.setHighlighted(node.getView(), selected); + descriptor.setHighlighted(node.getView(), selected, isAlignmentMode); } @Override diff --git a/android/src/main/java/com/facebook/sonar/plugins/inspector/descriptors/ObjectDescriptor.java b/android/src/main/java/com/facebook/sonar/plugins/inspector/descriptors/ObjectDescriptor.java index 8a8d42fec..b822fbdd7 100644 --- a/android/src/main/java/com/facebook/sonar/plugins/inspector/descriptors/ObjectDescriptor.java +++ b/android/src/main/java/com/facebook/sonar/plugins/inspector/descriptors/ObjectDescriptor.java @@ -56,7 +56,7 @@ public class ObjectDescriptor extends NodeDescriptor { } @Override - public void setHighlighted(Object node, boolean selected) {} + public void setHighlighted(Object node, boolean selected, boolean isAlignmentMode) {} @Override public void hitTest(Object node, Touch touch) { diff --git a/android/src/main/java/com/facebook/sonar/plugins/inspector/descriptors/SupportDialogFragmentDescriptor.java b/android/src/main/java/com/facebook/sonar/plugins/inspector/descriptors/SupportDialogFragmentDescriptor.java index 43b14f48a..184ecbff0 100644 --- a/android/src/main/java/com/facebook/sonar/plugins/inspector/descriptors/SupportDialogFragmentDescriptor.java +++ b/android/src/main/java/com/facebook/sonar/plugins/inspector/descriptors/SupportDialogFragmentDescriptor.java @@ -71,10 +71,10 @@ public class SupportDialogFragmentDescriptor extends NodeDescriptor { } @Override - public void setHighlighted(Fragment node, boolean selected) throws Exception { + public void setHighlighted(Fragment node, boolean selected, boolean isAlignmentMode) throws Exception { if (node.getView() == null) { return; } final NodeDescriptor descriptor = descriptorForClass(View.class); - descriptor.setHighlighted(node.getView(), selected); + descriptor.setHighlighted(node.getView(), selected, isAlignmentMode); } @Override diff --git a/android/src/main/java/com/facebook/sonar/plugins/inspector/descriptors/TextViewDescriptor.java b/android/src/main/java/com/facebook/sonar/plugins/inspector/descriptors/TextViewDescriptor.java index efa7561b2..ee4fd3b97 100644 --- a/android/src/main/java/com/facebook/sonar/plugins/inspector/descriptors/TextViewDescriptor.java +++ b/android/src/main/java/com/facebook/sonar/plugins/inspector/descriptors/TextViewDescriptor.java @@ -138,9 +138,9 @@ public class TextViewDescriptor extends NodeDescriptor { } @Override - public void setHighlighted(TextView node, boolean selected) throws Exception { + public void setHighlighted(TextView node, boolean selected, boolean isAlignmentMode) throws Exception { final NodeDescriptor descriptor = descriptorForClass(View.class); - descriptor.setHighlighted(node, selected); + descriptor.setHighlighted(node, selected, isAlignmentMode); } @Override diff --git a/android/src/main/java/com/facebook/sonar/plugins/inspector/descriptors/ViewDescriptor.java b/android/src/main/java/com/facebook/sonar/plugins/inspector/descriptors/ViewDescriptor.java index 6f87bc608..85078281f 100644 --- a/android/src/main/java/com/facebook/sonar/plugins/inspector/descriptors/ViewDescriptor.java +++ b/android/src/main/java/com/facebook/sonar/plugins/inspector/descriptors/ViewDescriptor.java @@ -477,7 +477,7 @@ public class ViewDescriptor extends NodeDescriptor { } @Override - public void setHighlighted(View node, boolean selected) { + public void setHighlighted(View node, boolean selected, boolean isAlignmentMode) { // We need to figure out whether the given View has a parent View since margins are not // included within a View's bounds. So, in order to display the margin values for a particular // view, we need to apply an overlay on its parent rather than itself. @@ -525,7 +525,7 @@ public class ViewDescriptor extends NodeDescriptor { contentBounds.offset(-left, -top); } - HighlightedOverlay.setHighlighted(targetView, margin, padding, contentBounds); + HighlightedOverlay.setHighlighted(targetView, margin, padding, contentBounds, isAlignmentMode); } @Override diff --git a/android/src/main/java/com/facebook/sonar/plugins/inspector/descriptors/ViewGroupDescriptor.java b/android/src/main/java/com/facebook/sonar/plugins/inspector/descriptors/ViewGroupDescriptor.java index d3c5d8207..2a839b756 100644 --- a/android/src/main/java/com/facebook/sonar/plugins/inspector/descriptors/ViewGroupDescriptor.java +++ b/android/src/main/java/com/facebook/sonar/plugins/inspector/descriptors/ViewGroupDescriptor.java @@ -243,9 +243,9 @@ public class ViewGroupDescriptor extends NodeDescriptor { } @Override - public void setHighlighted(ViewGroup node, boolean selected) throws Exception { + public void setHighlighted(ViewGroup node, boolean selected, boolean isAlignmentMode) throws Exception { final NodeDescriptor descriptor = descriptorForClass(View.class); - descriptor.setHighlighted(node, selected); + descriptor.setHighlighted(node, selected, isAlignmentMode); } @Override diff --git a/android/src/main/java/com/facebook/sonar/plugins/inspector/descriptors/WindowDescriptor.java b/android/src/main/java/com/facebook/sonar/plugins/inspector/descriptors/WindowDescriptor.java index 6b070283f..0c0a968d8 100644 --- a/android/src/main/java/com/facebook/sonar/plugins/inspector/descriptors/WindowDescriptor.java +++ b/android/src/main/java/com/facebook/sonar/plugins/inspector/descriptors/WindowDescriptor.java @@ -58,9 +58,10 @@ public class WindowDescriptor extends NodeDescriptor { } @Override - public void setHighlighted(Window node, boolean selected) throws Exception { + public void setHighlighted(Window node, boolean selected, boolean isAlignmentMode) + throws Exception { final NodeDescriptor descriptor = descriptorForClass(View.class); - descriptor.setHighlighted(node.getDecorView(), selected); + descriptor.setHighlighted(node.getDecorView(), selected, isAlignmentMode); } @Override diff --git a/android/src/main/java/com/facebook/sonar/plugins/litho/DebugComponentDescriptor.java b/android/src/main/java/com/facebook/sonar/plugins/litho/DebugComponentDescriptor.java index a4c9d75fd..8267bda05 100644 --- a/android/src/main/java/com/facebook/sonar/plugins/litho/DebugComponentDescriptor.java +++ b/android/src/main/java/com/facebook/sonar/plugins/litho/DebugComponentDescriptor.java @@ -582,7 +582,7 @@ public class DebugComponentDescriptor extends NodeDescriptor { } @Override - public void setHighlighted(DebugComponent node, boolean selected) { + public void setHighlighted(DebugComponent node, boolean selected, boolean isAlignmentMode) { final LithoView lithoView = node.getLithoView(); if (lithoView == null) { return; @@ -616,7 +616,7 @@ public class DebugComponentDescriptor extends NodeDescriptor { hasNode ? (int) layout.getResultPadding(YogaEdge.BOTTOM) : 0); final Rect contentBounds = node.getBoundsInLithoView(); - HighlightedOverlay.setHighlighted(lithoView, margin, padding, contentBounds); + HighlightedOverlay.setHighlighted(lithoView, margin, padding, contentBounds, isAlignmentMode); } @Override diff --git a/android/src/main/java/com/facebook/sonar/plugins/litho/LithoViewDescriptor.java b/android/src/main/java/com/facebook/sonar/plugins/litho/LithoViewDescriptor.java index a69774511..98d592220 100644 --- a/android/src/main/java/com/facebook/sonar/plugins/litho/LithoViewDescriptor.java +++ b/android/src/main/java/com/facebook/sonar/plugins/litho/LithoViewDescriptor.java @@ -125,9 +125,9 @@ public class LithoViewDescriptor extends NodeDescriptor { } @Override - public void setHighlighted(LithoView node, boolean selected) throws Exception { + public void setHighlighted(LithoView node, boolean selected, boolean isAlignmentMode) throws Exception { final NodeDescriptor descriptor = descriptorForClass(ViewGroup.class); - descriptor.setHighlighted(node, selected); + descriptor.setHighlighted(node, selected, isAlignmentMode); } @Override diff --git a/src/plugins/layout/index.js b/src/plugins/layout/index.js index 1574b4b72..5fe047f68 100644 --- a/src/plugins/layout/index.js +++ b/src/plugins/layout/index.js @@ -49,6 +49,7 @@ export type InspectorState = {| AXelements: {[key: ElementID]: Element}, inAXMode: boolean, AXtoNonAXMapping: {[key: ElementID]: ElementID}, + isAlignmentMode: boolean, |}; type SelectElementArgs = {| @@ -182,6 +183,7 @@ export default class Layout extends SonarPlugin { AXselected: null, AXfocused: null, AXtoNonAXMapping: {}, + isAlignmentMode: false, }; reducers = { @@ -308,6 +310,13 @@ export default class Layout extends SonarPlugin { return {isSearchActive}; }, + SetAlignmentActive( + state: InspectorState, + {isAlignmentMode}: {isAlignmentMode: boolean}, + ) { + return {isAlignmentMode}; + }, + SetAXMode(state: InspectorState, {inAXMode}: {inAXMode: boolean}) { return {inAXMode}; }, @@ -510,7 +519,10 @@ export default class Layout extends SonarPlugin { this.dispatchAction({expand: true, key, type: 'ExpandElement'}); } - this.client.send('setHighlighted', {id: selected}); + this.client.send('setHighlighted', { + id: selected, + isAlignmentMode: this.state.isAlignmentMode, + }); this.client.send('setSearchActive', {active: false}); }, ); @@ -702,6 +714,10 @@ export default class Layout extends SonarPlugin { const inAXMode = !this.state.inAXMode; this.dispatchAction({inAXMode, type: 'SetAXMode'}); }; + onToggleAlignment = () => { + const isAlignmentMode = !this.state.isAlignmentMode; + this.dispatchAction({isAlignmentMode, type: 'SetAlignmentActive'}); + }; onElementSelected = debounce((key: ElementID) => { let finalKey = key; @@ -737,7 +753,10 @@ export default class Layout extends SonarPlugin { AXkey: finalAXkey, type: 'SelectElement', }); - this.client.send('setHighlighted', {id: key}); + this.client.send('setHighlighted', { + id: key, + isAlignmentMode: this.state.isAlignmentMode, + }); this.getNodes([finalKey], {force: true, ax: false}).then( (elements: Array) => { this.dispatchAction({elements, type: 'UpdateElements'}); @@ -753,7 +772,10 @@ export default class Layout extends SonarPlugin { }); onElementHovered = debounce((key: ?ElementID) => { - this.client.send('setHighlighted', {id: key}); + this.client.send('setHighlighted', { + id: key, + isAlignmentMode: this.state.isAlignmentMode, + }); }); onDataValueChanged = (path: Array, value: any) => { @@ -808,6 +830,7 @@ export default class Layout extends SonarPlugin { isSearchActive, inAXMode, outstandingSearchQuery, + isAlignmentMode, } = this.state; return ( @@ -845,6 +868,21 @@ export default class Layout extends SonarPlugin { /> ) : null} + + +