From 316415343feb4e1535ff1c5256020e3b44722a07 Mon Sep 17 00:00:00 2001 From: hyb1996 <946994919@qq.com> Date: Wed, 24 Jan 2018 12:31:12 +0800 Subject: [PATCH] feat: relative path support for ui image source --- .../java/com/stardust/scriptdroid/App.java | 2 +- .../autojs/core/ui/ConvertLayoutInflater.java | 16 +- .../ui/inflater/DynamicLayoutInflater.java | 33 ++-- .../autojs/core/ui/inflater/ValueParser.java | 22 +++ .../attrsetter/BaseViewAttrSetter.java | 16 +- .../attrsetter/DatePickerAttrSetter.java | 5 + .../attrsetter/FrameLayoutAttrSetter.java | 5 + .../attrsetter/ImageViewAttrSetter.java | 11 +- .../attrsetter/JsImageViewAttrSetter.java | 22 ++- .../attrsetter/LinearLayoutAttrSetter.java | 7 +- .../attrsetter/ProgressBarAttrSetter.java | 9 +- .../attrsetter/RadioGroupAttrSetter.java | 5 + .../attrsetter/SpinnerAttrSetter.java | 7 +- .../attrsetter/TextViewAttrSetter.java | 13 +- .../attrsetter/TimePickerAttrSetter.java | 5 + .../attrsetter/ToolbarAttrSetter.java | 5 + .../attrsetter/ViewGroupAttrSetter.java | 5 + .../core/ui/inflater/util/Drawables.java | 185 ++++++++++-------- .../autojs/core/ui/widget/JsImageView.java | 11 +- .../autojs/runtime/ScriptRuntime.java | 2 +- .../com/stardust/autojs/runtime/api/UI.java | 30 ++- 21 files changed, 280 insertions(+), 136 deletions(-) create mode 100644 autojs/src/main/java/com/stardust/autojs/core/ui/inflater/ValueParser.java diff --git a/app/src/main/java/com/stardust/scriptdroid/App.java b/app/src/main/java/com/stardust/scriptdroid/App.java index fece1814..db418128 100644 --- a/app/src/main/java/com/stardust/scriptdroid/App.java +++ b/app/src/main/java/com/stardust/scriptdroid/App.java @@ -87,7 +87,7 @@ public class App extends MultiDexApplication { } private void setupDrawableImageLoader() { - Drawables.setImageLoader(new ImageLoader() { + Drawables.setDefaultImageLoader(new ImageLoader() { @Override public void loadInto(ImageView imageView, Uri uri) { GlideApp.with(App.this) diff --git a/autojs/src/main/java/com/stardust/autojs/core/ui/ConvertLayoutInflater.java b/autojs/src/main/java/com/stardust/autojs/core/ui/ConvertLayoutInflater.java index c698c9bf..c4a2d31c 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/ui/ConvertLayoutInflater.java +++ b/autojs/src/main/java/com/stardust/autojs/core/ui/ConvertLayoutInflater.java @@ -5,8 +5,6 @@ import android.view.View; import com.stardust.autojs.core.ui.inflater.DynamicLayoutInflater; import com.stardust.autojs.core.ui.widget.JsFrameLayout; -import com.stardust.autojs.core.ui.widget.JsImageView; -import com.stardust.autojs.core.ui.inflater.attrsetter.JsImageViewAttrSetter; import com.stardust.autojs.core.ui.xml.XmlConverter; @@ -18,22 +16,12 @@ public class ConvertLayoutInflater implements JsLayoutInflater { private DynamicLayoutInflater mDynamicLayoutInflater; - public ConvertLayoutInflater() { - - } - - private void ensureInflater(Context context) { - if (mDynamicLayoutInflater != null) { - return; - } - mDynamicLayoutInflater = new DynamicLayoutInflater(context); - mDynamicLayoutInflater.registerViewAttrSetter(JsImageView.class.getName(), - new JsImageViewAttrSetter<>()); + public ConvertLayoutInflater(DynamicLayoutInflater dynamicLayoutInflater) { + mDynamicLayoutInflater = dynamicLayoutInflater; } @Override public View inflate(Context context, String xml) { - ensureInflater(context); try { String androidLayoutXml = XmlConverter.convertToAndroidLayout(xml); JsFrameLayout root = new JsFrameLayout(context); diff --git a/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/DynamicLayoutInflater.java b/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/DynamicLayoutInflater.java index 8058cfcc..4eef76bb 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/DynamicLayoutInflater.java +++ b/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/DynamicLayoutInflater.java @@ -32,7 +32,9 @@ import com.stardust.autojs.core.ui.inflater.attrsetter.TextViewAttrSetter; import com.stardust.autojs.core.ui.inflater.attrsetter.TimePickerAttrSetter; import com.stardust.autojs.core.ui.inflater.attrsetter.ToolbarAttrSetter; import com.stardust.autojs.core.ui.inflater.attrsetter.ViewGroupAttrSetter; +import com.stardust.autojs.core.ui.inflater.util.Drawables; import com.stardust.autojs.core.ui.inflater.util.Res; + import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; @@ -77,22 +79,27 @@ public class DynamicLayoutInflater { private Map> mViewAttrSetters = new HashMap<>(); private Map> mViewCreators = new HashMap<>(); private Context mContext; + private ValueParser mValueParser; - public DynamicLayoutInflater(Context context) { + public DynamicLayoutInflater(Context context, ValueParser valueParser) { mContext = context; - registerViewAttrSetter(TextView.class.getName(), new TextViewAttrSetter<>()); - registerViewAttrSetter(EditText.class.getName(), new TextViewAttrSetter<>()); - registerViewAttrSetter(ImageView.class.getName(), new ImageViewAttrSetter<>()); - registerViewAttrSetter(LinearLayout.class.getName(), new LinearLayoutAttrSetter<>()); - registerViewAttrSetter(FrameLayout.class.getName(), new FrameLayoutAttrSetter<>()); - registerViewAttrSetter(View.class.getName(), new BaseViewAttrSetter<>()); - registerViewAttrSetter(Toolbar.class.getName(), new ToolbarAttrSetter<>()); - registerViewAttrSetter(DatePicker.class.getName(), new DatePickerAttrSetter()); - registerViewAttrSetter(RadioGroup.class.getName(), new RadioGroupAttrSetter<>()); - registerViewAttrSetter(ProgressBar.class.getName(), new ProgressBarAttrSetter<>()); - registerViewAttrSetter(Spinner.class.getName(), new SpinnerAttrSetter()); - registerViewAttrSetter(TimePicker.class.getName(), new TimePickerAttrSetter()); + mValueParser = valueParser; + registerViewAttrSetters(); + } + protected void registerViewAttrSetters() { + registerViewAttrSetter(TextView.class.getName(), new TextViewAttrSetter<>(mValueParser)); + registerViewAttrSetter(EditText.class.getName(), new TextViewAttrSetter<>(mValueParser)); + registerViewAttrSetter(ImageView.class.getName(), new ImageViewAttrSetter<>(mValueParser)); + registerViewAttrSetter(LinearLayout.class.getName(), new LinearLayoutAttrSetter<>(mValueParser)); + registerViewAttrSetter(FrameLayout.class.getName(), new FrameLayoutAttrSetter<>(mValueParser)); + registerViewAttrSetter(View.class.getName(), new BaseViewAttrSetter<>(mValueParser)); + registerViewAttrSetter(Toolbar.class.getName(), new ToolbarAttrSetter<>(mValueParser)); + registerViewAttrSetter(DatePicker.class.getName(), new DatePickerAttrSetter(mValueParser)); + registerViewAttrSetter(RadioGroup.class.getName(), new RadioGroupAttrSetter<>(mValueParser)); + registerViewAttrSetter(ProgressBar.class.getName(), new ProgressBarAttrSetter<>(mValueParser)); + registerViewAttrSetter(Spinner.class.getName(), new SpinnerAttrSetter(mValueParser)); + registerViewAttrSetter(TimePicker.class.getName(), new TimePickerAttrSetter(mValueParser)); } public void registerViewAttrSetter(String fullName, ViewAttrSetter setter) { diff --git a/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/ValueParser.java b/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/ValueParser.java new file mode 100644 index 00000000..69a0c023 --- /dev/null +++ b/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/ValueParser.java @@ -0,0 +1,22 @@ +package com.stardust.autojs.core.ui.inflater; + +import com.stardust.autojs.core.ui.inflater.util.Drawables; + +/** + * Created by Stardust on 2018/1/24. + */ + +public class ValueParser { + + + private final Drawables mDrawables; + + + public ValueParser(Drawables drawables) { + mDrawables = drawables; + } + + public Drawables getDrawables() { + return mDrawables; + } +} diff --git a/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/attrsetter/BaseViewAttrSetter.java b/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/attrsetter/BaseViewAttrSetter.java index 72f6c5d0..de6447c0 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/attrsetter/BaseViewAttrSetter.java +++ b/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/attrsetter/BaseViewAttrSetter.java @@ -12,6 +12,7 @@ import android.widget.LinearLayout; import android.widget.RelativeLayout; +import com.stardust.autojs.core.ui.inflater.ValueParser; import com.stardust.autojs.core.ui.inflater.ViewAttrSetter; import com.stardust.autojs.core.ui.inflater.ViewCreator; import com.stardust.autojs.core.ui.inflater.util.Colors; @@ -90,6 +91,17 @@ public class BaseViewAttrSetter implements ViewAttrSetter { .map("viewEnd", 6) .map("viewStart", 5); + private final ValueParser mValueParser; + + public BaseViewAttrSetter(ValueParser valueParser) { + mValueParser = valueParser; + } + + public Drawables getDrawables(){ + return mValueParser.getDrawables(); + } + + @Override public boolean setAttr(V view, String attr, String value, ViewGroup parent, Map attrs) { Integer layoutRule = null; @@ -252,7 +264,7 @@ public class BaseViewAttrSetter implements ViewAttrSetter { view.setPadding(view.getPaddingLeft(), view.getPaddingTop(), view.getPaddingRight(), Dimensions.parseToIntPixel(value, view)); break; case "background": - Drawables.setupWithViewBackground(view, value); + getDrawables().setupWithViewBackground(view, value); break; case "accessibilityLiveRegion": case "accessibilityTraversalAfter": @@ -333,7 +345,7 @@ public class BaseViewAttrSetter implements ViewAttrSetter { break; case "foreground": if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - view.setForeground(Drawables.parse(view, value)); + view.setForeground(getDrawables().parse(view, value)); } break; case "foregroundGravity": diff --git a/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/attrsetter/DatePickerAttrSetter.java b/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/attrsetter/DatePickerAttrSetter.java index e08f1ac4..b4d6e73c 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/attrsetter/DatePickerAttrSetter.java +++ b/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/attrsetter/DatePickerAttrSetter.java @@ -9,6 +9,7 @@ import android.widget.DatePicker; import com.stardust.autojs.R; +import com.stardust.autojs.core.ui.inflater.ValueParser; import com.stardust.autojs.core.ui.inflater.ViewCreator; import java.text.ParseException; @@ -24,6 +25,10 @@ public class DatePickerAttrSetter extends BaseViewAttrSetter { private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("mm/dd/yyyy", Locale.getDefault()); + public DatePickerAttrSetter(ValueParser valueParser) { + super(valueParser); + } + @Override public boolean setAttr(DatePicker view, String attr, String value, ViewGroup parent, Map attrs) { switch (attr) { diff --git a/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/attrsetter/FrameLayoutAttrSetter.java b/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/attrsetter/FrameLayoutAttrSetter.java index dd208d9c..0bf1c2bc 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/attrsetter/FrameLayoutAttrSetter.java +++ b/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/attrsetter/FrameLayoutAttrSetter.java @@ -4,6 +4,7 @@ import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; +import com.stardust.autojs.core.ui.inflater.ValueParser; import com.stardust.autojs.core.ui.inflater.util.Gravities; import java.util.Map; @@ -16,6 +17,10 @@ public class FrameLayoutAttrSetter extends ViewGroupAttrS private Integer mGravity; + public FrameLayoutAttrSetter(ValueParser valueParser) { + super(valueParser); + } + @Override public boolean setAttr(V view, String attr, String value, ViewGroup parent, Map attrs) { if (attr.equals("gravity")) { diff --git a/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/attrsetter/ImageViewAttrSetter.java b/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/attrsetter/ImageViewAttrSetter.java index 81ac3888..fb77c0f8 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/attrsetter/ImageViewAttrSetter.java +++ b/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/attrsetter/ImageViewAttrSetter.java @@ -5,6 +5,7 @@ import android.view.InflateException; import android.view.ViewGroup; import android.widget.ImageView; +import com.stardust.autojs.core.ui.inflater.ValueParser; import com.stardust.autojs.core.ui.inflater.util.Colors; import com.stardust.autojs.core.ui.inflater.util.Dimensions; import com.stardust.autojs.core.ui.inflater.util.Drawables; @@ -17,6 +18,10 @@ import java.util.Map; public class ImageViewAttrSetter extends BaseViewAttrSetter { + public ImageViewAttrSetter(ValueParser valueParser) { + super(valueParser); + } + @Override public boolean setAttr(V view, String attr, String value, ViewGroup parent, Map attrs) { if (super.setAttr(view, attr, value, parent, attrs)) { @@ -44,13 +49,13 @@ public class ImageViewAttrSetter extends BaseViewAttrSetter view.setMaxWidth(Dimensions.parseToIntPixel(value, view)); break; case "path": - Drawables.setupWithImage(view, wrapAsPath(value)); + getDrawables().setupWithImage(view, wrapAsPath(value)); break; case "scaleType": view.setScaleType(parseScaleType(value)); break; case "src": - Drawables.setupWithImage(view, value); + getDrawables().setupWithImage(view, value); break; case "tint": view.setColorFilter(Colors.parse(view, value)); @@ -61,7 +66,7 @@ public class ImageViewAttrSetter extends BaseViewAttrSetter } break; case "url": - Drawables.setupWithImage(view, wrapAsUrl(value)); + getDrawables().setupWithImage(view, wrapAsUrl(value)); break; default: return false; diff --git a/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/attrsetter/JsImageViewAttrSetter.java b/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/attrsetter/JsImageViewAttrSetter.java index 7af0de77..b48357bd 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/attrsetter/JsImageViewAttrSetter.java +++ b/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/attrsetter/JsImageViewAttrSetter.java @@ -1,9 +1,13 @@ package com.stardust.autojs.core.ui.inflater.attrsetter; +import android.content.Context; +import android.support.annotation.Nullable; import android.view.ViewGroup; import android.widget.ImageView.ScaleType; import com.makeramen.roundedimageview.Corner; +import com.stardust.autojs.core.ui.inflater.ValueParser; +import com.stardust.autojs.core.ui.inflater.ViewCreator; import com.stardust.autojs.core.ui.inflater.util.Colors; import com.stardust.autojs.core.ui.inflater.util.Dimensions; import com.stardust.autojs.core.ui.inflater.util.ValueMapper; @@ -16,7 +20,7 @@ import java.util.Map; * Created by Stardust on 2017/11/30. */ -public class JsImageViewAttrSetter extends ImageViewAttrSetter { +public class JsImageViewAttrSetter extends ImageViewAttrSetter { protected static final ValueMapper SCALE_TYPES = new ValueMapper("scaleType") @@ -29,8 +33,12 @@ public class JsImageViewAttrSetter extends ImageViewAttrS .map("fitXY", ScaleType.FIT_XY) .map("matrix", ScaleType.MATRIX); + public JsImageViewAttrSetter(ValueParser valueParser) { + super(valueParser); + } + @Override - public boolean setAttr(V view, String attr, String value, ViewGroup parent, Map attrs) { + public boolean setAttr(JsImageView view, String attr, String value, ViewGroup parent, Map attrs) { switch (attr) { case "radius": view.setCornerRadius(Dimensions.parseToPixel(value, view)); @@ -64,4 +72,14 @@ public class JsImageViewAttrSetter extends ImageViewAttrS } return true; } + + @Nullable + @Override + public ViewCreator getCreator() { + return (context, attrs) -> { + JsImageView imageView = new JsImageView(context); + imageView.setDrawables(getDrawables()); + return imageView; + }; + } } diff --git a/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/attrsetter/LinearLayoutAttrSetter.java b/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/attrsetter/LinearLayoutAttrSetter.java index 63222d36..586c2adb 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/attrsetter/LinearLayoutAttrSetter.java +++ b/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/attrsetter/LinearLayoutAttrSetter.java @@ -3,6 +3,7 @@ package com.stardust.autojs.core.ui.inflater.attrsetter; import android.view.ViewGroup; import android.widget.LinearLayout; +import com.stardust.autojs.core.ui.inflater.ValueParser; 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.ValueMapper; @@ -19,6 +20,10 @@ public class LinearLayoutAttrSetter extends ViewGroupAtt .map("vertical", LinearLayout.VERTICAL) .map("horizontal", LinearLayout.HORIZONTAL); + public LinearLayoutAttrSetter(ValueParser valueParser) { + super(valueParser); + } + @Override public boolean setAttr(V view, String attr, String value, ViewGroup parent, Map attrs) { switch (attr) { @@ -29,7 +34,7 @@ public class LinearLayoutAttrSetter extends ViewGroupAtt view.setBaselineAlignedChildIndex(Integer.valueOf(value)); break; case "divider": - view.setDividerDrawable(Drawables.parse(view, value)); + view.setDividerDrawable(getDrawables().parse(view, value)); break; case "gravity": view.setGravity(Gravities.parse(value)); diff --git a/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/attrsetter/ProgressBarAttrSetter.java b/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/attrsetter/ProgressBarAttrSetter.java index c11e6e33..e4fd65cf 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/attrsetter/ProgressBarAttrSetter.java +++ b/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/attrsetter/ProgressBarAttrSetter.java @@ -5,6 +5,7 @@ import android.os.Build; import android.view.ViewGroup; import android.widget.ProgressBar; +import com.stardust.autojs.core.ui.inflater.ValueParser; import com.stardust.autojs.core.ui.inflater.util.Colors; import com.stardust.autojs.core.ui.inflater.util.Dimensions; import com.stardust.autojs.core.ui.inflater.util.Drawables; @@ -17,6 +18,10 @@ import java.util.Map; public class ProgressBarAttrSetter extends BaseViewAttrSetter { + public ProgressBarAttrSetter(ValueParser valueParser) { + super(valueParser); + } + @Override public boolean setAttr(V view, String attr, String value, ViewGroup parent, Map attrs) { switch (attr) { @@ -30,7 +35,7 @@ public class ProgressBarAttrSetter extends BaseViewAttrSe Exceptions.unsupports(view, attr, value); break; case "indeterminateDrawable": - view.setIndeterminateDrawable(Drawables.parse(view, value)); + view.setIndeterminateDrawable(getDrawables().parse(view, value)); break; case "indeterminateDuration": Exceptions.unsupports(view, attr, value); @@ -86,7 +91,7 @@ public class ProgressBarAttrSetter extends BaseViewAttrSe } break; case "progressDrawable": - view.setProgressDrawable(Drawables.parse(view, value)); + view.setProgressDrawable(getDrawables().parse(view, value)); break; case "progressTint": if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { diff --git a/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/attrsetter/RadioGroupAttrSetter.java b/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/attrsetter/RadioGroupAttrSetter.java index e8d5dc23..a92210f6 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/attrsetter/RadioGroupAttrSetter.java +++ b/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/attrsetter/RadioGroupAttrSetter.java @@ -3,6 +3,7 @@ package com.stardust.autojs.core.ui.inflater.attrsetter; import android.view.ViewGroup; import android.widget.RadioGroup; +import com.stardust.autojs.core.ui.inflater.ValueParser; import com.stardust.autojs.core.ui.inflater.util.Ids; import java.util.Map; @@ -15,6 +16,10 @@ public class RadioGroupAttrSetter extends LinearLayoutAttr private Integer mCheckedButton; + public RadioGroupAttrSetter(ValueParser valueParser) { + super(valueParser); + } + @Override public boolean setAttr(V view, String attr, String value, ViewGroup parent, Map attrs) { if (attr.equals("checkedButton")) { diff --git a/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/attrsetter/SpinnerAttrSetter.java b/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/attrsetter/SpinnerAttrSetter.java index 1536940c..90f4fdb5 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/attrsetter/SpinnerAttrSetter.java +++ b/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/attrsetter/SpinnerAttrSetter.java @@ -8,6 +8,7 @@ import android.widget.ArrayAdapter; import android.widget.SimpleAdapter; import android.widget.Spinner; +import com.stardust.autojs.core.ui.inflater.ValueParser; import com.stardust.autojs.core.ui.inflater.ViewCreator; import com.stardust.autojs.core.ui.inflater.util.Dimensions; import com.stardust.autojs.core.ui.inflater.util.Drawables; @@ -27,6 +28,10 @@ public class SpinnerAttrSetter extends BaseViewAttrSetter { .map("dialog", Spinner.MODE_DIALOG) .map("dropdown", Spinner.MODE_DROPDOWN); + public SpinnerAttrSetter(ValueParser valueParser) { + super(valueParser); + } + @Override public boolean setAttr(Spinner view, String attr, String value, ViewGroup parent, Map attrs) { switch (attr) { @@ -50,7 +55,7 @@ public class SpinnerAttrSetter extends BaseViewAttrSetter { break; case "popupBackground": if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { - view.setPopupBackgroundDrawable(Drawables.parse(view, value)); + view.setPopupBackgroundDrawable(getDrawables().parse(view, value)); } break; case "prompt": diff --git a/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/attrsetter/TextViewAttrSetter.java b/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/attrsetter/TextViewAttrSetter.java index f26d6cde..c8882831 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/attrsetter/TextViewAttrSetter.java +++ b/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/attrsetter/TextViewAttrSetter.java @@ -14,6 +14,7 @@ import android.view.ViewGroup; import android.view.inputmethod.EditorInfo; import android.widget.TextView; +import com.stardust.autojs.core.ui.inflater.ValueParser; import com.stardust.autojs.core.ui.inflater.util.Colors; import com.stardust.autojs.core.ui.inflater.util.Dimensions; import com.stardust.autojs.core.ui.inflater.util.Drawables; @@ -122,6 +123,10 @@ public class TextViewAttrSetter extends BaseViewAttrSetter attrs) { if (super.setAttr(view, attrName, value, parent, attrs)) { @@ -148,16 +153,16 @@ public class TextViewAttrSetter extends BaseViewAttrSetter { + public TimePickerAttrSetter(ValueParser valueParser) { + super(valueParser); + } + @Nullable @Override public ViewCreator getCreator() { diff --git a/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/attrsetter/ToolbarAttrSetter.java b/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/attrsetter/ToolbarAttrSetter.java index 25c4422d..ea95fee6 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/attrsetter/ToolbarAttrSetter.java +++ b/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/attrsetter/ToolbarAttrSetter.java @@ -3,6 +3,7 @@ package com.stardust.autojs.core.ui.inflater.attrsetter; import android.support.v7.widget.Toolbar; import android.view.ViewGroup; +import com.stardust.autojs.core.ui.inflater.ValueParser; import com.stardust.autojs.core.ui.inflater.util.Strings; import java.util.Map; @@ -14,6 +15,10 @@ import java.util.Map; public class ToolbarAttrSetter extends BaseViewAttrSetter { + public ToolbarAttrSetter(ValueParser valueParser) { + super(valueParser); + } + @Override public boolean setAttr(V view, String attr, String value, ViewGroup parent, Map attrs) { return super.setAttr(view, attr, value, parent, attrs); diff --git a/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/attrsetter/ViewGroupAttrSetter.java b/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/attrsetter/ViewGroupAttrSetter.java index 18f4dd0a..64df8e2b 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/attrsetter/ViewGroupAttrSetter.java +++ b/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/attrsetter/ViewGroupAttrSetter.java @@ -4,6 +4,7 @@ import android.animation.LayoutTransition; import android.os.Build; import android.view.ViewGroup; +import com.stardust.autojs.core.ui.inflater.ValueParser; import com.stardust.autojs.core.ui.inflater.util.ValueMapper; import java.util.Map; @@ -29,6 +30,10 @@ public class ViewGroupAttrSetter extends BaseViewAttrSetter .map("beforeDescendants", ViewGroup.FOCUS_BEFORE_DESCENDANTS) .map("blocksDescendants", ViewGroup.FOCUS_BLOCK_DESCENDANTS); + public ViewGroupAttrSetter(ValueParser valueParser) { + super(valueParser); + } + @Override public boolean setAttr(V view, String attr, String value, ViewGroup parent, Map attrs) { diff --git a/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/util/Drawables.java b/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/util/Drawables.java index 6c45a79d..bc286216 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/util/Drawables.java +++ b/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/util/Drawables.java @@ -26,8 +26,106 @@ import java.util.regex.Pattern; public class Drawables { - private static final Pattern DATA_PATTERN = Pattern.compile("data:(\\w+/\\w+);base64,(.+)"); - private static ImageLoader sImageLoader = new ImageLoader() { + private final Pattern DATA_PATTERN = Pattern.compile("data:(\\w+/\\w+);base64,(.+)"); + private static ImageLoader sDefaultImageLoader = new DefaultImageLoader(); + private ImageLoader mImageLoader = sDefaultImageLoader; + + public static void setDefaultImageLoader(ImageLoader defaultImageLoader) { + sDefaultImageLoader = defaultImageLoader; + } + + public Drawable parse(Context context, String value) { + Resources resources = context.getResources(); + if (value.startsWith("@color/") || value.startsWith("@android:color/") || value.startsWith("#")) { + return new ColorDrawable(Colors.parse(context, value)); + } + if (value.startsWith("?")) { + return loadAttrResources(context, value); + } + if (value.startsWith("file://")) { + return decodeImage(value.substring(7)); + } + return loadDrawableResources(context, value); + } + + public Drawable loadDrawableResources(Context context, String value) { + return context.getResources().getDrawable(context.getResources().getIdentifier(value, "drawable", + context.getPackageName())); + } + + public Drawable loadAttrResources(Context context, String value) { + int[] attr = {context.getResources().getIdentifier(value.substring(1), "attr", + context.getPackageName())}; + TypedArray ta = context.obtainStyledAttributes(attr); + Drawable drawable = ta.getDrawable(0 /* index */); + ta.recycle(); + return drawable; + } + + public Drawable decodeImage(String path) { + return new BitmapDrawable(BitmapFactory.decodeFile(path)); + } + + public Drawable parse(View view, String name) { + return parse(view.getContext(), name); + } + + public void loadInto(ImageView view, Uri uri) { + mImageLoader.loadInto(view, uri); + } + + public void loadIntoBackground(View view, Uri uri) { + mImageLoader.loadIntoBackground(view, uri); + } + + public void setupWithImage(V view, String value) { + if (value.startsWith("http://") || value.startsWith("https://")) { + loadInto(view, Uri.parse(value)); + } else if (value.startsWith("data:")) { + loadDataInto(view, value); + } else { + view.setImageDrawable(parse(view, value)); + } + } + + private void loadDataInto(ImageView view, String data) { + Bitmap bitmap = loadData(data); + view.setImageBitmap(bitmap); + } + + public Bitmap loadData(String data) { + Matcher matcher = DATA_PATTERN.matcher(data); + if (!matcher.matches() || matcher.groupCount() != 2) { + return null; + } + String mimeType = matcher.group(1); + String base64 = matcher.group(2); + byte[] bytes = Base64.decode(base64, Base64.DEFAULT); + return BitmapFactory.decodeByteArray(bytes, 0, bytes.length); + } + + public void setupWithViewBackground(View view, String value) { + if (value.startsWith("http://") || value.startsWith("https://")) { + loadIntoBackground(view, Uri.parse(value)); + } else { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { + view.setBackground(parse(view, value)); + } else { + view.setBackgroundDrawable(parse(view, value)); + } + } + } + + public void setImageLoader(ImageLoader imageLoader) { + mImageLoader = imageLoader; + } + + public ImageLoader getImageLoader() { + return mImageLoader; + } + + private static class DefaultImageLoader implements ImageLoader { + @Override public void loadInto(final ImageView view, Uri uri) { load(view, uri, view::setImageDrawable); @@ -66,87 +164,6 @@ public class Drawables { } }).start(); } - }; - - public static Drawable parse(Context context, String value) { - Resources resources = context.getResources(); - if (value.startsWith("@color/") || value.startsWith("@android:color/") || value.startsWith("#")) { - return new ColorDrawable(Colors.parse(context, value)); - } - if (value.startsWith("?")) { - int[] attr = {resources.getIdentifier(value.substring(1), "attr", - context.getPackageName())}; - TypedArray ta = context.obtainStyledAttributes(attr); - Drawable drawable = ta.getDrawable(0 /* index */); - ta.recycle(); - return drawable; - } - if (value.startsWith("file://")) { - return decodeImage(value.substring(7)); - } - return resources.getDrawable(resources.getIdentifier(value, "drawable", - context.getPackageName())); - } - - private static Drawable decodeImage(String path) { - return new BitmapDrawable(BitmapFactory.decodeFile(path)); - } - - public static Drawable parse(View view, String name) { - return parse(view.getContext(), name); - } - - public static void loadInto(ImageView view, Uri uri) { - sImageLoader.loadInto(view, uri); - } - - public static void loadIntoBackground(View view, Uri uri) { - sImageLoader.loadIntoBackground(view, uri); - } - - public static void setupWithImage(V view, String value) { - if (value.startsWith("http://") || value.startsWith("https://")) { - loadInto(view, Uri.parse(value)); - } else if(value.startsWith("data:")) { - loadDataInto(view, value); - }else { - view.setImageDrawable(Drawables.parse(view, value)); - } - } - - private static void loadDataInto(ImageView view, String data) { - Bitmap bitmap = loadData(data); - view.setImageBitmap(bitmap); - } - - public static Bitmap loadData(String data){ - Matcher matcher = DATA_PATTERN.matcher(data); - if(!matcher.matches() || matcher.groupCount() != 2){ - return null; - } - String mimeType = matcher.group(1); - String base64 = matcher.group(2); - byte[] bytes = Base64.decode(base64, Base64.DEFAULT); - return BitmapFactory.decodeByteArray(bytes, 0, bytes.length); - } - - public static void setupWithViewBackground(View view, String value) { - if (value.startsWith("http://") || value.startsWith("https://")) { - loadIntoBackground(view, Uri.parse(value)); - } else { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { - view.setBackground(com.stardust.autojs.core.ui.inflater.util.Drawables.parse(view, value)); - } else { - view.setBackgroundDrawable(com.stardust.autojs.core.ui.inflater.util.Drawables.parse(view, value)); - } - } - } - - public static void setImageLoader(ImageLoader imageLoader) { - sImageLoader = imageLoader; - } - - public static ImageLoader getImageLoader() { - return sImageLoader; } } + diff --git a/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsImageView.java b/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsImageView.java index 0a8a9f08..d6bcd8db 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsImageView.java +++ b/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsImageView.java @@ -14,6 +14,7 @@ import com.stardust.autojs.core.ui.inflater.util.Drawables; public class JsImageView extends RoundedImageView { private boolean mCircle; + private Drawables mDrawables; public JsImageView(Context context) { super(context); @@ -39,7 +40,7 @@ public class JsImageView extends RoundedImageView { } public void setSource(String uri) { - Drawables.setupWithImage(this, uri); + getDrawables().setupWithImage(this, uri); } @Override @@ -50,4 +51,12 @@ public class JsImageView extends RoundedImageView { setCornerRadius(getMeasuredWidth() / 2); } } + + public void setDrawables(Drawables drawables) { + mDrawables = drawables; + } + + public Drawables getDrawables() { + return mDrawables; + } } diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/ScriptRuntime.java b/autojs/src/main/java/com/stardust/autojs/runtime/ScriptRuntime.java index c7617ae9..3b88ed4d 100644 --- a/autojs/src/main/java/com/stardust/autojs/runtime/ScriptRuntime.java +++ b/autojs/src/main/java/com/stardust/autojs/runtime/ScriptRuntime.java @@ -189,7 +189,7 @@ public class ScriptRuntime { console = builder.mConsole; accessibilityBridge = builder.mAccessibilityBridge; mShellSupplier = builder.mShellSupplier; - ui = new UI(uiHandler.getContext()); + ui = new UI(uiHandler.getContext(), this); this.automator = new SimpleActionAutomator(accessibilityBridge, this); automator.setScreenMetrics(mScreenMetrics); this.info = accessibilityBridge.getInfoProvider(); diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/api/UI.java b/autojs/src/main/java/com/stardust/autojs/runtime/api/UI.java index 8409e7b5..9e0d73d6 100644 --- a/autojs/src/main/java/com/stardust/autojs/runtime/api/UI.java +++ b/autojs/src/main/java/com/stardust/autojs/runtime/api/UI.java @@ -1,10 +1,16 @@ package com.stardust.autojs.runtime.api; import android.content.Context; +import android.graphics.drawable.Drawable; import com.stardust.autojs.core.ui.ConvertLayoutInflater; import com.stardust.autojs.core.ui.JsLayoutInflater; +import com.stardust.autojs.core.ui.inflater.DynamicLayoutInflater; +import com.stardust.autojs.core.ui.inflater.ValueParser; +import com.stardust.autojs.core.ui.inflater.attrsetter.JsImageViewAttrSetter; +import com.stardust.autojs.core.ui.widget.JsImageView; import com.stardust.autojs.rhino.ProxyObject; +import com.stardust.autojs.runtime.ScriptRuntime; import org.mozilla.javascript.Scriptable; import org.mozilla.javascript.UniqueTag; @@ -22,15 +28,18 @@ public class UI extends ProxyObject { private Context mContext; private Map mProperties = new ConcurrentHashMap<>(); private JsLayoutInflater mJsLayoutInflater; + private ScriptRuntime mRuntime; + private ValueParser mValueParser; - public UI(Context context, JsLayoutInflater layoutInflater) { + public UI(Context context, ScriptRuntime runtime) { mContext = context; - mProperties.put("layoutInflater", layoutInflater); - mJsLayoutInflater = layoutInflater; - } - - public UI(Context context) { - this(context, new ConvertLayoutInflater()); + mRuntime = runtime; + mValueParser = new ValueParser(new Drawables()); + DynamicLayoutInflater inflater = new DynamicLayoutInflater(context, mValueParser); + inflater.registerViewAttrSetter(JsImageView.class.getName(), + new JsImageViewAttrSetter(mValueParser)); + mJsLayoutInflater = new ConvertLayoutInflater(inflater); + mProperties.put("layoutInflater", mJsLayoutInflater); } @@ -57,6 +66,13 @@ public class UI extends ProxyObject { } + private class Drawables extends com.stardust.autojs.core.ui.inflater.util.Drawables { + + @Override + public Drawable decodeImage(String path) { + return super.decodeImage(mRuntime.files.path(path)); + } + } }