Summary: The second tree has access to all AX NodeInfo properties (they are not in the sidebar yet). Infrastructure set up to customize displayed information bassed on what is most useful. Descriptors for views updated to include AX functionality and non-view descriptors AX functions defaulted to null/empty. Non-view nodes (like Fragments, Window, Appication) no longer included in AX tree. Corresponding nodes will be highlighted (although not expanded) on click in either tree. Differential Revision: D8795800 fbshipit-source-id: cf2333f69bfecca3ff84aae62681c684dfa14bf3
158 lines
4.8 KiB
Java
158 lines
4.8 KiB
Java
/*
|
|
* Copyright (c) 2018-present, Facebook, Inc.
|
|
*
|
|
* This source code is licensed under the MIT license found in the LICENSE
|
|
* file in the root directory of this source tree.
|
|
*
|
|
*/
|
|
|
|
package com.facebook.sonar.plugins.inspector.descriptors;
|
|
|
|
import static com.facebook.sonar.plugins.inspector.InspectorValue.Type.Color;
|
|
import static com.facebook.sonar.plugins.inspector.InspectorValue.Type.Number;
|
|
import static com.facebook.sonar.plugins.inspector.InspectorValue.Type.Text;
|
|
|
|
import android.view.View;
|
|
import android.widget.TextView;
|
|
import com.facebook.sonar.core.SonarDynamic;
|
|
import com.facebook.sonar.core.SonarObject;
|
|
import com.facebook.sonar.plugins.inspector.InspectorValue;
|
|
import com.facebook.sonar.plugins.inspector.Named;
|
|
import com.facebook.sonar.plugins.inspector.NodeDescriptor;
|
|
import com.facebook.sonar.plugins.inspector.Touch;
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
import javax.annotation.Nullable;
|
|
|
|
public class TextViewDescriptor extends NodeDescriptor<TextView> {
|
|
|
|
@Override
|
|
public void init(TextView node) throws Exception {
|
|
final NodeDescriptor descriptor = descriptorForClass(View.class);
|
|
descriptor.init(node);
|
|
}
|
|
|
|
@Override
|
|
public String getId(TextView node) throws Exception {
|
|
final NodeDescriptor descriptor = descriptorForClass(View.class);
|
|
return descriptor.getId(node);
|
|
}
|
|
|
|
@Override
|
|
public String getName(TextView node) throws Exception {
|
|
final NodeDescriptor descriptor = descriptorForClass(View.class);
|
|
return descriptor.getName(node);
|
|
}
|
|
|
|
@Override
|
|
public String getAXName(TextView node) throws Exception {
|
|
final NodeDescriptor descriptor = descriptorForClass(View.class);
|
|
return descriptor.getAXName(node);
|
|
}
|
|
|
|
@Override
|
|
public int getChildCount(TextView node) {
|
|
return 0;
|
|
}
|
|
|
|
@Override
|
|
public @Nullable Object getChildAt(TextView node, int index) {
|
|
return null;
|
|
}
|
|
|
|
@Override
|
|
public @Nullable Object getAXChildAt(TextView node, int index) {
|
|
return null;
|
|
}
|
|
|
|
@Override
|
|
public List<Named<SonarObject>> getData(TextView node) throws Exception {
|
|
final List<Named<SonarObject>> props = new ArrayList<>();
|
|
final NodeDescriptor descriptor = descriptorForClass(View.class);
|
|
|
|
props.add(
|
|
0,
|
|
new Named<>(
|
|
"TextView",
|
|
new SonarObject.Builder()
|
|
.put("text", InspectorValue.mutable(Text, node.getText().toString()))
|
|
.put(
|
|
"textColor",
|
|
InspectorValue.mutable(Color, node.getTextColors().getDefaultColor()))
|
|
.put("textSize", InspectorValue.mutable(Number, node.getTextSize()))
|
|
.build()));
|
|
|
|
props.addAll(descriptor.getData(node));
|
|
|
|
return props;
|
|
}
|
|
|
|
@Override
|
|
public List<Named<SonarObject>> getAXData(TextView node) throws Exception {
|
|
final List<Named<SonarObject>> props = new ArrayList<>();
|
|
final NodeDescriptor descriptor = descriptorForClass(View.class);
|
|
props.addAll(descriptor.getAXData(node));
|
|
return props;
|
|
}
|
|
|
|
@Override
|
|
public void setValue(TextView node, String[] path, SonarDynamic value) throws Exception {
|
|
switch (path[0]) {
|
|
case "TextView":
|
|
switch (path[1]) {
|
|
case "text":
|
|
node.setText(value.asString());
|
|
break;
|
|
case "textColor":
|
|
node.setTextColor(value.asInt());
|
|
break;
|
|
case "textSize":
|
|
node.setTextSize(value.asInt());
|
|
break;
|
|
}
|
|
break;
|
|
default:
|
|
final NodeDescriptor descriptor = descriptorForClass(View.class);
|
|
descriptor.setValue(node, path, value);
|
|
break;
|
|
}
|
|
invalidate(node);
|
|
}
|
|
|
|
@Override
|
|
public List<Named<String>> getAttributes(TextView node) throws Exception {
|
|
final NodeDescriptor descriptor = descriptorForClass(View.class);
|
|
return descriptor.getAttributes(node);
|
|
}
|
|
|
|
@Override
|
|
public List<Named<String>> getAXAttributes(TextView node) throws Exception {
|
|
final NodeDescriptor descriptor = descriptorForClass(View.class);
|
|
return descriptor.getAXAttributes(node);
|
|
}
|
|
|
|
@Override
|
|
public void setHighlighted(TextView node, boolean selected) throws Exception {
|
|
final NodeDescriptor descriptor = descriptorForClass(View.class);
|
|
descriptor.setHighlighted(node, selected);
|
|
}
|
|
|
|
@Override
|
|
public void hitTest(TextView node, Touch touch) throws Exception {
|
|
final NodeDescriptor descriptor = descriptorForClass(View.class);
|
|
descriptor.hitTest(node, touch);
|
|
}
|
|
|
|
@Override
|
|
public @Nullable String getDecoration(TextView node) throws Exception {
|
|
final NodeDescriptor descriptor = descriptorForClass(View.class);
|
|
return descriptor.getDecoration(node);
|
|
}
|
|
|
|
@Override
|
|
public boolean matches(String query, TextView node) throws Exception {
|
|
final NodeDescriptor descriptor = descriptorForClass(Object.class);
|
|
return descriptor.matches(query, node);
|
|
}
|
|
}
|