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:
Joshua Selbo
2021-02-01 10:18:59 -08:00
committed by Facebook GitHub Bot
parent a9ad3d2f1b
commit 340a29c1d5
5 changed files with 210 additions and 26 deletions

View File

@@ -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());

View File

@@ -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);
}
}

View File

@@ -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);

View File

@@ -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);

View File

@@ -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))