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} + + +