Add inspector descriptor for ImageView
Summary: - Made `EnumMapping` support generic value type - `ImageView.ScaleType` is a Java enum; the scaleType api uses this instead of int types. - Introduce descriptor for `ImageView` and allow getting/setting scaleType. Reviewed By: mweststrate Differential Revision: D26092725 fbshipit-source-id: ea3a4ee036b2b808f14277387d360318b7d25824
This commit is contained in:
committed by
Facebook GitHub Bot
parent
a9ad3d2f1b
commit
340a29c1d5
@@ -13,6 +13,7 @@ import android.graphics.drawable.Drawable;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.Window;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
import androidx.annotation.Nullable;
|
||||
import com.facebook.flipper.core.FlipperConnection;
|
||||
@@ -22,6 +23,7 @@ import com.facebook.flipper.plugins.inspector.descriptors.DialogDescriptor;
|
||||
import com.facebook.flipper.plugins.inspector.descriptors.DialogFragmentDescriptor;
|
||||
import com.facebook.flipper.plugins.inspector.descriptors.DrawableDescriptor;
|
||||
import com.facebook.flipper.plugins.inspector.descriptors.FragmentDescriptor;
|
||||
import com.facebook.flipper.plugins.inspector.descriptors.ImageViewDescriptor;
|
||||
import com.facebook.flipper.plugins.inspector.descriptors.ObjectDescriptor;
|
||||
import com.facebook.flipper.plugins.inspector.descriptors.SupportDialogFragmentDescriptor;
|
||||
import com.facebook.flipper.plugins.inspector.descriptors.SupportFragmentDescriptor;
|
||||
@@ -52,6 +54,7 @@ public class DescriptorMapping {
|
||||
mapping.register(ViewGroup.class, new ViewGroupDescriptor());
|
||||
mapping.register(View.class, new ViewDescriptor());
|
||||
mapping.register(TextView.class, new TextViewDescriptor());
|
||||
mapping.register(ImageView.class, new ImageViewDescriptor());
|
||||
mapping.register(Drawable.class, new DrawableDescriptor());
|
||||
mapping.register(Dialog.class, new DialogDescriptor());
|
||||
mapping.register(android.app.Fragment.class, new FragmentDescriptor());
|
||||
|
||||
@@ -0,0 +1,181 @@
|
||||
/*
|
||||
* 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.descriptors;
|
||||
|
||||
import android.view.View;
|
||||
import android.widget.ImageView;
|
||||
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.EnumMapping;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
public class ImageViewDescriptor extends NodeDescriptor<ImageView> {
|
||||
|
||||
private static final EnumMapping<ImageView.ScaleType> sScaleTypeMapping =
|
||||
new EnumMapping<ImageView.ScaleType>("CENTER") {
|
||||
{
|
||||
put("CENTER", ImageView.ScaleType.CENTER);
|
||||
put("CENTER_CROP", ImageView.ScaleType.CENTER_CROP);
|
||||
put("CENTER_INSIDE", ImageView.ScaleType.CENTER_INSIDE);
|
||||
put("FIT_CENTER", ImageView.ScaleType.FIT_CENTER);
|
||||
put("FIT_END", ImageView.ScaleType.FIT_END);
|
||||
put("FIT_START", ImageView.ScaleType.FIT_START);
|
||||
put("FIT_XY", ImageView.ScaleType.FIT_XY);
|
||||
put("MATRIX", ImageView.ScaleType.MATRIX);
|
||||
}
|
||||
};
|
||||
|
||||
@Override
|
||||
public void init(ImageView node) throws Exception {
|
||||
final NodeDescriptor descriptor = descriptorForClass(View.class);
|
||||
descriptor.init(node);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getId(ImageView node) throws Exception {
|
||||
final NodeDescriptor descriptor = descriptorForClass(View.class);
|
||||
return descriptor.getId(node);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName(ImageView node) throws Exception {
|
||||
final NodeDescriptor descriptor = descriptorForClass(View.class);
|
||||
return descriptor.getName(node);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getAXName(ImageView node) throws Exception {
|
||||
final NodeDescriptor descriptor = descriptorForClass(View.class);
|
||||
return descriptor.getAXName(node);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getChildCount(ImageView node) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable Object getChildAt(ImageView node, int index) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable Object getAXChildAt(ImageView node, int index) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Named<FlipperObject>> getData(ImageView node) throws Exception {
|
||||
final List<Named<FlipperObject>> props = new ArrayList<>();
|
||||
final NodeDescriptor descriptor = descriptorForClass(View.class);
|
||||
|
||||
props.add(
|
||||
0,
|
||||
new Named<>(
|
||||
"ImageView",
|
||||
new FlipperObject.Builder()
|
||||
.put("scaleType", sScaleTypeMapping.toPicker(node.getScaleType()))
|
||||
.build()));
|
||||
|
||||
props.addAll(descriptor.getData(node));
|
||||
|
||||
return props;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Named<FlipperObject>> getAXData(ImageView node) throws Exception {
|
||||
final List<Named<FlipperObject>> props = new ArrayList<>();
|
||||
final NodeDescriptor descriptor = descriptorForClass(View.class);
|
||||
props.addAll(descriptor.getAXData(node));
|
||||
return props;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setValue(
|
||||
ImageView node,
|
||||
String[] path,
|
||||
@Nullable SetDataOperations.FlipperValueHint kind,
|
||||
FlipperDynamic value)
|
||||
throws Exception {
|
||||
switch (path[0]) {
|
||||
case "ImageView":
|
||||
switch (path[1]) {
|
||||
case "scaleType":
|
||||
node.setScaleType(sScaleTypeMapping.get(value.asString()));
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
final NodeDescriptor descriptor = descriptorForClass(View.class);
|
||||
descriptor.setValue(node, path, kind, value);
|
||||
break;
|
||||
}
|
||||
invalidate(node);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Named<String>> getAttributes(ImageView node) throws Exception {
|
||||
final NodeDescriptor descriptor = descriptorForClass(View.class);
|
||||
return descriptor.getAttributes(node);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Named<String>> getAXAttributes(ImageView node) throws Exception {
|
||||
final NodeDescriptor descriptor = descriptorForClass(View.class);
|
||||
return descriptor.getAXAttributes(node);
|
||||
}
|
||||
|
||||
@Override
|
||||
public FlipperObject getExtraInfo(ImageView node) {
|
||||
final NodeDescriptor descriptor = descriptorForClass(View.class);
|
||||
return descriptor.getExtraInfo(node);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setHighlighted(ImageView node, boolean selected, boolean isAlignmentMode)
|
||||
throws Exception {
|
||||
final NodeDescriptor descriptor = descriptorForClass(View.class);
|
||||
descriptor.setHighlighted(node, selected, isAlignmentMode);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void hitTest(ImageView node, Touch touch) throws Exception {
|
||||
final NodeDescriptor descriptor = descriptorForClass(View.class);
|
||||
descriptor.hitTest(node, touch);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void axHitTest(ImageView node, Touch touch) throws Exception {
|
||||
final NodeDescriptor descriptor = descriptorForClass(View.class);
|
||||
descriptor.axHitTest(node, touch);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable String getDecoration(ImageView node) throws Exception {
|
||||
final NodeDescriptor descriptor = descriptorForClass(View.class);
|
||||
return descriptor.getDecoration(node);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable String getAXDecoration(ImageView node) throws Exception {
|
||||
final NodeDescriptor descriptor = descriptorForClass(View.class);
|
||||
return descriptor.getAXDecoration(node);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean matches(String query, ImageView node) throws Exception {
|
||||
final NodeDescriptor descriptor = descriptorForClass(Object.class);
|
||||
return descriptor.matches(query, node);
|
||||
}
|
||||
}
|
||||
@@ -698,8 +698,8 @@ public class ViewDescriptor extends NodeDescriptor<View> {
|
||||
}
|
||||
}
|
||||
|
||||
private static final EnumMapping sVisibilityMapping =
|
||||
new EnumMapping("VISIBLE") {
|
||||
private static final EnumMapping<Integer> sVisibilityMapping =
|
||||
new EnumMapping<Integer>("VISIBLE") {
|
||||
{
|
||||
put("VISIBLE", View.VISIBLE);
|
||||
put("INVISIBLE", View.INVISIBLE);
|
||||
@@ -707,8 +707,8 @@ public class ViewDescriptor extends NodeDescriptor<View> {
|
||||
}
|
||||
};
|
||||
|
||||
private static final EnumMapping sLayoutDirectionMapping =
|
||||
new EnumMapping("LAYOUT_DIRECTION_INHERIT") {
|
||||
private static final EnumMapping<Integer> sLayoutDirectionMapping =
|
||||
new EnumMapping<Integer>("LAYOUT_DIRECTION_INHERIT") {
|
||||
{
|
||||
put("LAYOUT_DIRECTION_INHERIT", View.LAYOUT_DIRECTION_INHERIT);
|
||||
put("LAYOUT_DIRECTION_LOCALE", View.LAYOUT_DIRECTION_LOCALE);
|
||||
@@ -717,8 +717,8 @@ public class ViewDescriptor extends NodeDescriptor<View> {
|
||||
}
|
||||
};
|
||||
|
||||
private static final EnumMapping sTextDirectionMapping =
|
||||
new EnumMapping("TEXT_DIRECTION_INHERIT") {
|
||||
private static final EnumMapping<Integer> sTextDirectionMapping =
|
||||
new EnumMapping<Integer>("TEXT_DIRECTION_INHERIT") {
|
||||
{
|
||||
put("TEXT_DIRECTION_INHERIT", View.TEXT_DIRECTION_INHERIT);
|
||||
put("TEXT_DIRECTION_FIRST_STRONG", View.TEXT_DIRECTION_FIRST_STRONG);
|
||||
@@ -731,8 +731,8 @@ public class ViewDescriptor extends NodeDescriptor<View> {
|
||||
}
|
||||
};
|
||||
|
||||
private static final EnumMapping sTextAlignmentMapping =
|
||||
new EnumMapping("TEXT_ALIGNMENT_INHERIT") {
|
||||
private static final EnumMapping<Integer> sTextAlignmentMapping =
|
||||
new EnumMapping<Integer>("TEXT_ALIGNMENT_INHERIT") {
|
||||
{
|
||||
put("TEXT_ALIGNMENT_INHERIT", View.TEXT_ALIGNMENT_INHERIT);
|
||||
put("TEXT_ALIGNMENT_GRAVITY", View.TEXT_ALIGNMENT_GRAVITY);
|
||||
@@ -744,8 +744,8 @@ public class ViewDescriptor extends NodeDescriptor<View> {
|
||||
}
|
||||
};
|
||||
|
||||
private static final EnumMapping sGravityMapping =
|
||||
new EnumMapping("NO_GRAVITY") {
|
||||
private static final EnumMapping<Integer> sGravityMapping =
|
||||
new EnumMapping<Integer>("NO_GRAVITY") {
|
||||
{
|
||||
put("NO_GRAVITY", Gravity.NO_GRAVITY);
|
||||
put("LEFT", Gravity.LEFT);
|
||||
|
||||
@@ -37,8 +37,8 @@ public final class AccessibilityUtil {
|
||||
|
||||
private AccessibilityUtil() {}
|
||||
|
||||
public static final EnumMapping sAccessibilityActionMapping =
|
||||
new EnumMapping("UNKNOWN") {
|
||||
public static final EnumMapping<Integer> sAccessibilityActionMapping =
|
||||
new EnumMapping<Integer>("UNKNOWN") {
|
||||
{
|
||||
put("FOCUS", AccessibilityNodeInfoCompat.ACTION_FOCUS);
|
||||
put("CLEAR_FOCUS", AccessibilityNodeInfoCompat.ACTION_CLEAR_FOCUS);
|
||||
@@ -72,8 +72,8 @@ public final class AccessibilityUtil {
|
||||
}
|
||||
};
|
||||
|
||||
public static final EnumMapping sImportantForAccessibilityMapping =
|
||||
new EnumMapping("AUTO") {
|
||||
public static final EnumMapping<Integer> sImportantForAccessibilityMapping =
|
||||
new EnumMapping<Integer>("AUTO") {
|
||||
{
|
||||
put("AUTO", View.IMPORTANT_FOR_ACCESSIBILITY_AUTO);
|
||||
put("NO", View.IMPORTANT_FOR_ACCESSIBILITY_NO);
|
||||
|
||||
@@ -14,24 +14,24 @@ import androidx.collection.ArrayMap;
|
||||
import androidx.collection.SimpleArrayMap;
|
||||
import com.facebook.flipper.plugins.inspector.InspectorValue;
|
||||
|
||||
public class EnumMapping {
|
||||
private final ArrayMap<String, Integer> mMapping = new ArrayMap<>();
|
||||
public class EnumMapping<T> {
|
||||
private final ArrayMap<String, T> mMapping = new ArrayMap<>();
|
||||
private final String mDefaultKey;
|
||||
|
||||
public EnumMapping(final String defaultKey) {
|
||||
mDefaultKey = defaultKey;
|
||||
}
|
||||
|
||||
public void put(final String s, final int i) {
|
||||
public void put(final String s, final T i) {
|
||||
mMapping.put(s, i);
|
||||
}
|
||||
|
||||
public InspectorValue get(final int i) {
|
||||
public InspectorValue<String> get(final T i) {
|
||||
return get(i, true);
|
||||
}
|
||||
|
||||
public static String findKeyForValue(
|
||||
SimpleArrayMap<String, Integer> mapping, String mDefaultValue, int currentValue) {
|
||||
public static <T> String findKeyForValue(
|
||||
SimpleArrayMap<String, T> mapping, String mDefaultValue, T currentValue) {
|
||||
for (int i = 0, count = mapping.size(); i < count; i++) {
|
||||
if (mapping.valueAt(i).equals(currentValue)) {
|
||||
return mapping.keyAt(i);
|
||||
@@ -40,33 +40,33 @@ public class EnumMapping {
|
||||
return mDefaultValue;
|
||||
}
|
||||
|
||||
public InspectorValue get(final int i, final boolean mutable) {
|
||||
public InspectorValue<String> get(final T i, final boolean mutable) {
|
||||
String value = findKeyForValue(mMapping, mDefaultKey, i);
|
||||
return mutable ? InspectorValue.mutable(Enum, value) : InspectorValue.immutable(Enum, value);
|
||||
}
|
||||
|
||||
public int get(final String s) {
|
||||
public T get(final String s) {
|
||||
if (mMapping.containsKey(s)) {
|
||||
return mMapping.get(s);
|
||||
}
|
||||
return mMapping.get(mDefaultKey);
|
||||
}
|
||||
|
||||
public InspectorValue toPicker() {
|
||||
public InspectorValue<?> toPicker() {
|
||||
return toPicker(true);
|
||||
}
|
||||
|
||||
public InspectorValue toPicker(final boolean mutable) {
|
||||
public InspectorValue<?> toPicker(final boolean mutable) {
|
||||
return mutable
|
||||
? InspectorValue.mutable(Picker, new InspectorValue.Picker(mMapping.keySet(), mDefaultKey))
|
||||
: InspectorValue.immutable(Enum, mDefaultKey);
|
||||
}
|
||||
|
||||
public InspectorValue toPicker(final int currentValue) {
|
||||
public InspectorValue<?> toPicker(final T currentValue) {
|
||||
return toPicker(currentValue, true);
|
||||
}
|
||||
|
||||
public InspectorValue toPicker(final int currentValue, final boolean mutable) {
|
||||
public InspectorValue<?> toPicker(final T currentValue, final boolean mutable) {
|
||||
String value = findKeyForValue(mMapping, mDefaultKey, currentValue);
|
||||
return mutable
|
||||
? InspectorValue.mutable(Picker, new InspectorValue.Picker(mMapping.keySet(), value))
|
||||
|
||||
Reference in New Issue
Block a user