feat: img attrs; disable CodeEditText autofill

This commit is contained in:
hyb1996 2018-10-13 11:02:52 +08:00
parent 4c482428dd
commit 506a68d816
10 changed files with 242 additions and 67 deletions

View File

@ -22,8 +22,11 @@ import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Typeface;
import android.os.Build;
import android.os.Bundle;
import android.os.Parcelable;
import android.service.autofill.AutofillService;
import android.support.annotation.RequiresApi;
import android.support.v7.widget.AppCompatEditText;
import android.text.Editable;
import android.text.Layout;
@ -32,6 +35,7 @@ import android.util.Log;
import android.util.TimingLogger;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.autofill.AutofillManager;
import org.autojs.autojs.ui.edit.theme.Theme;
import org.autojs.autojs.ui.edit.theme.TokenMapping;
@ -93,6 +97,15 @@ public class CodeEditText extends AppCompatEditText {
setHorizontallyScrolling(true);
mTheme = Theme.getDefault(getContext());
mLineHighlightPaint.setStyle(Paint.Style.FILL);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
setImportantForAutofill(IMPORTANT_FOR_AUTOFILL_NO);
}
}
@RequiresApi(api = Build.VERSION_CODES.O)
@Override
public int getAutofillType() {
return AUTOFILL_TYPE_NONE;
}
public LinkedHashMap<Integer, CodeEditor.Breakpoint> getBreakpoints() {

View File

@ -4,6 +4,7 @@ import android.view.View;
import com.stardust.autojs.R;
import com.stardust.autojs.core.ui.attribute.ViewAttributes;
import com.stardust.autojs.core.ui.attribute.ViewAttributesFactory;
import com.stardust.autojs.core.ui.inflater.ResourceParser;
import com.stardust.autojs.core.ui.nativeview.NativeView;
import com.stardust.autojs.runtime.ScriptRuntime;
@ -33,7 +34,7 @@ public class ViewExtras {
ViewExtras extras = get(view);
ViewAttributes attributes = extras.getViewAttributes();
if (attributes == null) {
attributes = new ViewAttributes(parser, view);
attributes = ViewAttributesFactory.create(parser, view);
extras.setViewAttributes(attributes);
}
return attributes;

View File

@ -0,0 +1,79 @@
package com.stardust.autojs.core.ui.attribute;
import android.content.res.ColorStateList;
import android.graphics.Color;
import android.graphics.PorterDuff;
import android.os.Build;
import android.support.v4.widget.ImageViewCompat;
import android.view.View;
import android.widget.ImageView;
import com.stardust.autojs.core.ui.inflater.ResourceParser;
import com.stardust.util.BiMap;
import com.stardust.util.BiMaps;
import static com.stardust.autojs.core.ui.inflater.inflaters.BaseViewInflater.TINT_MODES;
public class ImageViewAttributes extends ViewAttributes {
private static final BiMap<String, ImageView.ScaleType> SCALE_TYPES = BiMaps.<String, ImageView.ScaleType>newBuilder()
.put("center", ImageView.ScaleType.CENTER)
.put("centerCrop", ImageView.ScaleType.CENTER_CROP)
.put("centerInside", ImageView.ScaleType.CENTER_INSIDE)
.put("fitCenter", ImageView.ScaleType.FIT_CENTER)
.put("fitEnd", ImageView.ScaleType.FIT_END)
.put("fitStart", ImageView.ScaleType.FIT_START)
.put("fitXY", ImageView.ScaleType.FIT_XY)
.put("matrix", ImageView.ScaleType.MATRIX)
.build();
public ImageViewAttributes(ResourceParser resourceParser, View view) {
super(resourceParser, view);
}
@Override
protected void onRegisterAttrs() {
super.onRegisterAttrs();
registerBooleanAttr("adjustViewBounds", getView()::setAdjustViewBounds);
registerIntPixelAttr("baseline", getView()::setBaseline);
registerBooleanAttr("baselineAlignBottom", getView()::setBaselineAlignBottom);
registerBooleanAttr("cropToPadding", getView()::setCropToPadding);
registerIntPixelAttr("maxHeight", getView()::setMaxHeight);
registerIntPixelAttr("maxWidth", getView()::setMaxWidth);
registerAttr("path", value ->
getDrawables().setupWithImage(getView(), wrapAsPath(value))
);
registerAttr("scaleType", getView()::getScaleType, getView()::setScaleType, SCALE_TYPES);
registerAttr("src", value ->
getDrawables().setupWithImage(getView(), value)
);
registerAttr("tint", Color::parseColor, value -> {
ImageViewCompat.setImageTintList(getView(), ColorStateList.valueOf(value));
});
registerAttr("tintMode", TINT_MODES::get, value -> {
ImageViewCompat.setImageTintMode(getView(), value);
});
registerAttr("url", value ->
getDrawables().setupWithImage(getView(), wrapAsUrl(value))
);
}
private String wrapAsPath(String value) {
if (!value.startsWith("file://")) {
return "file://" + value;
}
return value;
}
private String wrapAsUrl(String value) {
if (!value.startsWith("http://") && !value.startsWith("https://")) {
return "http://" + value;
}
return value;
}
@Override
public ImageView getView() {
return (ImageView) super.getView();
}
}

View File

@ -0,0 +1,24 @@
package com.stardust.autojs.core.ui.attribute;
import android.view.View;
import android.widget.TextView;
import com.stardust.autojs.core.ui.inflater.ResourceParser;
public class TextViewAttributes extends ViewAttributes {
public TextViewAttributes(ResourceParser resourceParser, View view) {
super(resourceParser, view);
}
@Override
protected void onRegisterAttrs() {
super.onRegisterAttrs();
}
@Override
public TextView getView() {
return (TextView) super.getView();
}
}

View File

@ -13,6 +13,7 @@ import android.view.ViewGroup;
import android.view.ViewParent;
import android.widget.CompoundButton;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import com.stardust.autojs.core.internal.Functions;
@ -23,6 +24,8 @@ import com.stardust.autojs.core.ui.inflater.util.Drawables;
import com.stardust.autojs.core.ui.inflater.util.Gravities;
import com.stardust.autojs.core.ui.inflater.util.Ids;
import com.stardust.autojs.core.ui.inflater.util.Strings;
import com.stardust.util.BiMap;
import com.stardust.util.Supplier;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
@ -86,6 +89,10 @@ public class ViewAttributes {
void apply(T value);
}
protected interface ValueGetter<T> {
T get();
}
protected static class MappingAttributeSetter<T> implements AttributeSetter {
private final ValueConverter<T> mValueConverter;
@ -102,6 +109,7 @@ public class ViewAttributes {
}
}
private Map<String, Attribute> mAttributes = new HashMap<>();
private final Drawables mDrawables;
private final View mView;
@ -113,6 +121,14 @@ public class ViewAttributes {
}
public Drawables getDrawables() {
return mDrawables;
}
public View getView() {
return mView;
}
public boolean contains(String name) {
return mAttributes.containsKey(name);
}
@ -207,37 +223,37 @@ public class ViewAttributes {
registerAttr("layoutDirection", LAYOUT_DIRECTIONS::get, mView::setLayoutDirection);
}
private void setForegroundTintMode(PorterDuff.Mode mode) {
protected void setForegroundTintMode(PorterDuff.Mode mode) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
mView.setForegroundTintMode(mode);
}
}
private void setForegroundGravity(int g) {
protected void setForegroundGravity(int g) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
mView.setForegroundGravity(g);
}
}
private void setForeground(Drawable foreground) {
protected void setForeground(Drawable foreground) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
mView.setForeground(foreground);
}
}
private void forceHasOverlappingRendering(boolean b) {
protected void forceHasOverlappingRendering(boolean b) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
mView.forceHasOverlappingRendering(b);
}
}
private void setElevation(int e) {
protected void setElevation(int e) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
mView.setElevation(e);
}
}
private void setScrollbars(String scrollbars) {
protected void setScrollbars(String scrollbars) {
for (String str : scrollbars.split("\\|")) {
if (str.equals("horizontal")) {
mView.setHorizontalScrollBarEnabled(true);
@ -248,16 +264,16 @@ public class ViewAttributes {
}
private float parseDimensionToPixel(String value) {
protected float parseDimensionToPixel(String value) {
return Dimensions.parseToPixel(mView, value);
}
private int parseDimensionToIntPixel(String value) {
protected int parseDimensionToIntPixel(String value) {
return Dimensions.parseToIntPixel(value, mView);
}
private int parseDimension(String dim) {
protected int parseDimension(String dim) {
switch (dim) {
case "wrap_content":
return ViewGroup.LayoutParams.WRAP_CONTENT;
@ -273,6 +289,21 @@ public class ViewAttributes {
mAttributes.put(name, attribute);
}
protected <V> void registerAttr(String name, ValueGetter<V> getter, ValueApplier<V> setter, BiMap<String, V> biMap) {
mAttributes.put(name, new Attribute() {
@Override
public String get() {
return biMap.getKey(getter.get());
}
@Override
public void set(String value) {
V v = biMap.get(value);
setter.apply(v);
}
});
}
protected void registerAttr(String name, AttributeGetter getter, AttributeSetter setter) {
mAttributes.put(name, new Attribute() {
@Override
@ -315,17 +346,25 @@ public class ViewAttributes {
}
private void registerDrawableAttrs(String[] names, ValueApplier<Drawable> applier) {
protected void registerDrawableAttrs(String[] names, ValueApplier<Drawable> applier) {
registerAttrs(names, new BaseAttribute(new MappingAttributeSetter<>(
this::parseDrawable, applier)));
}
protected void registerIntPixelAttr(String name, ValueApplier<Integer> applier) {
registerAttr(name, this::parseDimensionToIntPixel, applier);
}
protected void registerBooleanAttr(String name, ValueApplier<Boolean> applier) {
registerAttr(name, Boolean::parseBoolean, applier);
}
protected Drawable parseDrawable(String value) {
return mDrawables.parse(mView, value);
}
private boolean setGravity(int g) {
protected boolean setGravity(int g) {
try {
Method setGravity = mView.getClass().getMethod("setGravity", int.class);
setGravity.invoke(mView, g);
@ -336,7 +375,7 @@ public class ViewAttributes {
}
}
private void setMargin(int margin) {
protected void setMargin(int margin) {
if (mView.getLayoutParams() instanceof ViewGroup.MarginLayoutParams) {
ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) mView.getLayoutParams();
params.bottomMargin = params.leftMargin = params.topMargin = params.rightMargin = margin;
@ -347,28 +386,28 @@ public class ViewAttributes {
}
}
private void setMarginLeft(int margin) {
protected void setMarginLeft(int margin) {
if (mView.getLayoutParams() instanceof ViewGroup.MarginLayoutParams) {
ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) mView.getLayoutParams();
params.leftMargin = margin;
}
}
private void setMarginRight(int margin) {
protected void setMarginRight(int margin) {
if (mView.getLayoutParams() instanceof ViewGroup.MarginLayoutParams) {
ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) mView.getLayoutParams();
params.rightMargin = margin;
}
}
private void setMarginTop(int margin) {
protected void setMarginTop(int margin) {
if (mView.getLayoutParams() instanceof ViewGroup.MarginLayoutParams) {
ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) mView.getLayoutParams();
params.topMargin = margin;
}
}
private void setMarginBottom(int margin) {
protected void setMarginBottom(int margin) {
if (mView.getLayoutParams() instanceof ViewGroup.MarginLayoutParams) {
ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) mView.getLayoutParams();
params.bottomMargin = margin;
@ -377,72 +416,72 @@ public class ViewAttributes {
}
}
private void setMarginStart(int margin) {
protected void setMarginStart(int margin) {
if (mView.getLayoutParams() instanceof ViewGroup.MarginLayoutParams) {
ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) mView.getLayoutParams();
params.setMarginStart(margin);
}
}
private void setMarginEnd(int margin) {
protected void setMarginEnd(int margin) {
if (mView.getLayoutParams() instanceof ViewGroup.MarginLayoutParams) {
ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) mView.getLayoutParams();
params.setMarginEnd(margin);
}
}
private void setPadding(int padding) {
protected void setPadding(int padding) {
mView.setPadding(padding, padding, padding, padding);
}
private void setPaddingLeft(int padding) {
protected void setPaddingLeft(int padding) {
mView.setPadding(padding, mView.getPaddingTop(), mView.getPaddingRight(), mView.getPaddingBottom());
}
private void setPaddingRight(int padding) {
protected void setPaddingRight(int padding) {
mView.setPadding(mView.getPaddingLeft(), mView.getPaddingTop(), padding, mView.getPaddingBottom());
}
private void setPaddingTop(int padding) {
protected void setPaddingTop(int padding) {
mView.setPadding(mView.getPaddingLeft(), padding, mView.getPaddingRight(), mView.getPaddingBottom());
}
private void setPaddingStart(int padding) {
protected void setPaddingStart(int padding) {
mView.setPaddingRelative(padding, mView.getPaddingTop(), mView.getPaddingEnd(), mView.getPaddingBottom());
}
private void setPaddingEnd(int padding) {
protected void setPaddingEnd(int padding) {
mView.setPaddingRelative(mView.getPaddingStart(), mView.getPaddingTop(), padding, mView.getPaddingBottom());
}
private void setPaddingBottom(int padding) {
protected void setPaddingBottom(int padding) {
mView.setPadding(mView.getPaddingLeft(), mView.getPaddingTop(), mView.getPaddingRight(), padding);
}
private void setBackgroundTint(int color) {
protected void setBackgroundTint(int color) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
mView.setBackgroundTintList(ColorStateList.valueOf(color));
}
}
private void setContextClickable(boolean clickable) {
protected void setContextClickable(boolean clickable) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
mView.setContextClickable(clickable);
}
}
private void setChecked(boolean checked) {
protected void setChecked(boolean checked) {
if (mView instanceof CompoundButton) {
((CompoundButton) mView).setChecked(checked);
}
}
private void setLayoutGravity(int gravity) {
protected void setLayoutGravity(int gravity) {
ViewParent parent = mView.getParent();
ViewGroup.LayoutParams layoutParams = mView.getLayoutParams();
if (parent instanceof LinearLayout) {
@ -463,7 +502,7 @@ public class ViewAttributes {
}
}
private void setLayoutWeight(float weight) {
protected void setLayoutWeight(float weight) {
ViewParent parent = mView.getParent();
ViewGroup.LayoutParams layoutParams = mView.getLayoutParams();
if (parent instanceof LinearLayout) {
@ -473,25 +512,25 @@ public class ViewAttributes {
}
private void setWidth(int width) {
protected void setWidth(int width) {
ViewGroup.LayoutParams layoutParams = mView.getLayoutParams();
layoutParams.width = width;
mView.setLayoutParams(layoutParams);
}
private void setHeight(int height) {
protected void setHeight(int height) {
ViewGroup.LayoutParams layoutParams = mView.getLayoutParams();
layoutParams.height = height;
mView.setLayoutParams(layoutParams);
}
private String parseString(String value) {
protected String parseString(String value) {
return Strings.parse(mView, value);
}
private static <
T1, T2> ValueApplier<T2> bind(Functions.VoidFunc2<T1, T2> func2, T1 t1) {
protected static <T1, T2> ValueApplier<T2> bind(Functions.VoidFunc2<T1, T2> func2, T1 t1) {
return value -> func2.call(t1, value);
}
}

View File

@ -0,0 +1,37 @@
package com.stardust.autojs.core.ui.attribute;
import android.view.View;
import android.widget.ImageView;
import com.stardust.autojs.core.ui.inflater.ResourceParser;
import java.util.HashMap;
public class ViewAttributesFactory {
interface ViewAttributesCreator {
ViewAttributes create(ResourceParser resourceParser, View view);
}
private static HashMap<Class<? extends View>, ViewAttributesCreator> sViewAttributesCreators = new HashMap<>();
static {
sViewAttributesCreators.put(ImageView.class, ImageViewAttributes::new);
}
public static void put(Class<? extends View> clazz, ViewAttributesCreator creator) {
sViewAttributesCreators.put(clazz, creator);
}
public static ViewAttributes create(ResourceParser resourceParser, View view) {
Class viewClass = view.getClass();
while (viewClass != null && !viewClass.equals(Object.class)) {
ViewAttributesCreator creator = sViewAttributesCreators.get(viewClass);
if (creator != null) {
return creator.create(resourceParser, view);
}
viewClass = viewClass.getSuperclass();
}
return new ViewAttributes(resourceParser, view);
}
}

View File

@ -37,9 +37,7 @@ public class ImageViewInflater<V extends ImageView> extends BaseViewInflater<V>
view.setBaselineAlignBottom(Boolean.valueOf(value));
break;
case "cropToPadding":
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
view.setCropToPadding(Boolean.valueOf(value));
}
view.setCropToPadding(Boolean.valueOf(value));
break;
case "maxHeight":
view.setMaxHeight(Dimensions.parseToIntPixel(value, view));

View File

@ -230,18 +230,10 @@ public class TextViewInflater<V extends TextView> extends BaseViewInflater<V> {
}
break;
case "lineSpacingExtra":
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
view.setLineSpacing(Dimensions.parseToIntPixel(value, view), view.getLineSpacingMultiplier());
} else {
mLineSpacingExtra = Dimensions.parseToIntPixel(value, view);
}
view.setLineSpacing(Dimensions.parseToIntPixel(value, view), view.getLineSpacingMultiplier());
break;
case "lineSpacingMultiplier":
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
view.setLineSpacing(view.getLineSpacingExtra(), Dimensions.parseToIntPixel(value, view));
} else {
mLineSpacingMultiplier = Dimensions.parseToIntPixel(value, view);
}
view.setLineSpacing(view.getLineSpacingExtra(), Dimensions.parseToIntPixel(value, view));
break;
case "lines":
view.setLines(Integer.valueOf(value));
@ -302,24 +294,16 @@ public class TextViewInflater<V extends TextView> extends BaseViewInflater<V> {
view.setSelectAllOnFocus(Boolean.valueOf(value));
break;
case "shadowColor":
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
view.setShadowLayer(view.getShadowRadius(), view.getShadowDx(), view.getShadowDy(), Colors.parse(view, value));
}
view.setShadowLayer(view.getShadowRadius(), view.getShadowDx(), view.getShadowDy(), Colors.parse(view, value));
break;
case "shadowDx":
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
view.setShadowLayer(view.getShadowRadius(), Dimensions.parseToPixel(value, view), view.getShadowDy(), view.getShadowColor());
}
view.setShadowLayer(view.getShadowRadius(), Dimensions.parseToPixel(value, view), view.getShadowDy(), view.getShadowColor());
break;
case "shadowDy":
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
view.setShadowLayer(view.getShadowRadius(), view.getShadowDx(), Dimensions.parseToPixel(value, view), view.getShadowColor());
}
view.setShadowLayer(view.getShadowRadius(), view.getShadowDx(), Dimensions.parseToPixel(value, view), view.getShadowColor());
break;
case "shadowRadius":
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
view.setShadowLayer(Dimensions.parseToPixel(value, view), view.getShadowDx(), view.getShadowDy(), view.getShadowColor());
}
view.setShadowLayer(Dimensions.parseToPixel(value, view), view.getShadowDx(), view.getShadowDy(), view.getShadowColor());
break;
case "singleLine":
view.setSingleLine(Boolean.valueOf(value));

View File

@ -1,6 +1,8 @@
package com.stardust.autojs.core.ui.widget;
import android.content.Context;
import android.support.v4.widget.ImageViewCompat;
import android.support.v7.widget.AppCompatImageView;
import android.util.AttributeSet;
import com.makeramen.roundedimageview.RoundedImageView;
@ -21,6 +23,7 @@ public class JsImageView extends RoundedImageView {
super(context);
}
public JsImageView(Context context, AttributeSet attrs) {
super(context, attrs);
}

View File

@ -5,6 +5,7 @@ import android.content.Context;
import android.os.Build;
import android.support.annotation.Nullable;
import android.support.annotation.RequiresApi;
import android.support.v7.widget.AppCompatTextView;
import android.util.AttributeSet;
import android.widget.TextView;
@ -13,7 +14,8 @@ import android.widget.TextView;
*/
@SuppressLint("AppCompatCustomView")
public class JsTextView extends TextView {
public class JsTextView extends AppCompatTextView {
public JsTextView(Context context) {
super(context);
}
@ -26,11 +28,6 @@ public class JsTextView extends TextView {
super(context, attrs, defStyleAttr);
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public JsTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
public String text() {
return getText().toString();
}