From af5bf8ecf2ff1574d94bd716fe420f188d293dbc Mon Sep 17 00:00:00 2001
From: hyb1996 <946994919@qq.com>
Date: Fri, 30 Mar 2018 17:37:31 +0800
Subject: [PATCH] feat(ui): supports label `grid`
---
.../界面控件/表格控件-内置图标查看器.js | 20 +++++++++
autojs/src/main/assets/modules/__ui__.js | 26 +++++++++--
.../ui/inflater/DynamicLayoutInflater.java | 33 +++++++++++++-
.../autojs/core/ui/inflater/ViewInflater.java | 2 +-
.../inflater/inflaters/BaseViewInflater.java | 2 +-
.../inflaters/JsGridViewInflater.java | 45 +++++++++++++++++++
.../inflaters/JsListViewInflater.java | 14 +++---
.../core/ui/inflater/util/Drawables.java | 7 ++-
.../autojs/core/ui/widget/JsGridView.java | 23 ++++++++++
.../autojs/core/ui/widget/JsListView.java | 12 ++++-
.../autojs/core/ui/xml/XmlConverter.java | 2 +
.../engine/LoopBasedJavaScriptEngine.java | 3 +-
.../com/stardust/autojs/runtime/api/UI.java | 4 ++
13 files changed, 176 insertions(+), 17 deletions(-)
create mode 100644 app/src/main/assets/sample/界面控件/表格控件-内置图标查看器.js
create mode 100644 autojs/src/main/java/com/stardust/autojs/core/ui/inflater/inflaters/JsGridViewInflater.java
create mode 100644 autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsGridView.java
diff --git a/app/src/main/assets/sample/界面控件/表格控件-内置图标查看器.js b/app/src/main/assets/sample/界面控件/表格控件-内置图标查看器.js
new file mode 100644
index 00000000..0350aeab
--- /dev/null
+++ b/app/src/main/assets/sample/界面控件/表格控件-内置图标查看器.js
@@ -0,0 +1,20 @@
+"ui";
+
+ui.layout(
+
+
+
+
+
+);
+
+//所有内置图标名称
+var icons = ["ic_add_black_48dp", "ic_add_box_black_48dp", "ic_add_box_white_48dp", "ic_add_circle_black_48dp", "ic_add_circle_outline_black_48dp", "ic_add_circle_outline_white_48dp", "ic_add_circle_white_48dp", "ic_add_to_photos_white_48dp", "ic_add_white_48dp", "ic_adjust_black_48dp", "ic_alarm_white_48dp", "ic_archive_black_48dp", "ic_archive_white_48dp", "ic_assignment_returned_black_48dp", "ic_assignment_returned_white_48dp", "ic_assignment_return_black_48dp", "ic_assignment_return_white_48dp", "ic_assignment_turned_in_black_48dp", "ic_assignment_white_48dp", "ic_assistant_photo_white_48dp", "ic_audiotrack_white_48dp", "ic_autorenew_black_48dp", "ic_autorenew_white_48dp", "ic_backspace_black_48dp", "ic_backspace_white_48dp", "ic_backup_black_48dp", "ic_backup_white_48dp", "ic_block_black_48dp", "ic_block_white_48dp", "ic_blur_linear_black_48dp", "ic_blur_on_black_48dp", "ic_blur_on_white_48dp", "ic_book_black_48dp", "ic_brightness_3_white_48dp", "ic_brightness_5_white_48dp", "ic_brightness_7_black_48dp", "ic_broken_image_black_48dp", "ic_broken_image_white_48dp", "ic_brush_black_48dp", "ic_burst_mode_black_48dp", "ic_burst_mode_white_48dp", "ic_camera_alt_white_48dp", "ic_camera_enhance_black_48dp", "ic_camera_enhance_white_48dp", "ic_camera_front_white_48dp", "ic_camera_roll_black_48dp", "ic_card_giftcard_black_48dp", "ic_card_giftcard_white_48dp", "ic_card_membership_black_48dp", "ic_card_membership_white_48dp", "ic_card_travel_black_48dp", "ic_card_travel_white_48dp", "ic_center_focus_weak_white_48dp", "ic_change_history_black_48dp", "ic_class_white_48dp", "ic_clear_black_48dp", "ic_clear_white_48dp", "ic_code_black_48dp", "ic_collections_bookmark_white_48dp", "ic_colorize_black_48dp", "ic_compare_white_48dp", "ic_content_copy_black_48dp", "ic_content_copy_white_48dp", "ic_content_cut_black_48dp", "ic_content_cut_white_48dp", "ic_content_paste_black_48dp", "ic_content_paste_white_48dp", "ic_copyright_white_48dp", "ic_create_black_48dp", "ic_create_white_48dp", "ic_credit_card_black_48dp", "ic_credit_card_white_48dp", "ic_crop_16_9_white_48dp", "ic_crop_7_5_white_48dp", "ic_crop_din_white_48dp", "ic_crop_landscape_black_48dp", "ic_crop_portrait_black_48dp", "ic_crop_square_white_48dp", "ic_dashboard_black_48dp", "ic_dashboard_white_48dp", "ic_date_range_black_48dp", "ic_date_range_white_48dp", "ic_dehaze_white_48dp", "ic_delete_black_48dp", "ic_delete_sweep_black_48dp", "ic_delete_sweep_white_48dp", "ic_donut_small_white_48dp", "ic_drafts_black_48dp", "ic_drafts_white_48dp", "ic_edit_black_48dp", "ic_event_seat_white_48dp", "ic_exit_to_app_white_48dp", "ic_exposure_neg_1_black_48dp", "ic_exposure_neg_1_white_48dp", "ic_exposure_neg_2_white_48dp", "ic_exposure_plus_1_black_48dp", "ic_exposure_plus_2_white_48dp", "ic_exposure_white_48dp", "ic_exposure_zero_black_48dp", "ic_favorite_black_48dp", "ic_favorite_border_black_48dp", "ic_favorite_border_white_48dp", "ic_filter_1_black_48dp", "ic_filter_1_white_48dp", "ic_filter_3_black_48dp", "ic_filter_3_white_48dp", "ic_filter_4_white_48dp", "ic_filter_6_black_48dp", "ic_filter_6_white_48dp", "ic_filter_7_white_48dp", "ic_filter_8_black_48dp", "ic_filter_9_plus_black_48dp", "ic_filter_b_and_w_black_48dp", "ic_filter_center_focus_white_48dp", "ic_filter_list_black_48dp", "ic_filter_list_white_48dp", "ic_flag_black_48dp", "ic_flag_white_48dp", "ic_flash_off_black_48dp", "ic_flip_black_48dp", "ic_font_download_black_48dp", "ic_font_download_white_48dp", "ic_forward_black_48dp", "ic_forward_white_48dp", "ic_gesture_black_48dp", "ic_gesture_white_48dp", "ic_grain_black_48dp", "ic_grid_off_white_48dp", "ic_grid_on_black_48dp", "ic_hdr_off_white_48dp", "ic_hdr_strong_black_48dp", "ic_hdr_strong_white_48dp", "ic_healing_black_48dp", "ic_history_black_48dp", "ic_history_white_48dp", "ic_home_black_48dp", "ic_home_white_48dp", "ic_http_black_48dp", "ic_image_black_48dp", "ic_important_devices_black_48dp", "ic_important_devices_white_48dp", "ic_inbox_black_48dp", "ic_inbox_white_48dp", "ic_input_white_48dp", "ic_invert_colors_black_48dp", "ic_invert_colors_white_48dp", "ic_landscape_black_48dp", "ic_language_black_48dp", "ic_language_white_48dp"];
+
+ui.icons.setDataSource(icons);
+
+ui.icons.on("item_click", function(icon){
+ var d = "@drawabe/" + icon;
+ setClip(d);
+ toast(d + "已复制到剪贴板");
+});
\ No newline at end of file
diff --git a/autojs/src/main/assets/modules/__ui__.js b/autojs/src/main/assets/modules/__ui__.js
index b3c75baa..3cf19aec 100644
--- a/autojs/src/main/assets/modules/__ui__.js
+++ b/autojs/src/main/assets/modules/__ui__.js
@@ -8,11 +8,23 @@ module.exports = function (runtime, global) {
ui.__view_cache__ = {};
ui.layout = function (xml) {
+ if(!activity){
+ throw new Error("需要在ui模式下运行才能使用该函数");
+ }
runtime.ui.layoutInflater.setContext(activity);
var view = runtime.ui.layoutInflater.inflate(xml.toString());
ui.setContentView(view);
}
+ ui.inflate = function(xml, parent){
+ if(!activity){
+ throw new Error("需要在ui模式下运行才能使用该函数");
+ }
+ parent = parent || null;
+ runtime.ui.layoutInflater.setContext(activity);
+ return decorate(runtime.ui.layoutInflater.inflate(xml.toString(), parent));
+ }
+
ui.setContentView = function (view) {
ui.view = view;
ui.__view_cache__ = {};
@@ -86,7 +98,8 @@ module.exports = function (runtime, global) {
}
runtime.ui.bindingContext = global;
- runtime.ui.layoutInflater.setLayoutInflaterDelegate({
+ var layoutInflater = runtime.ui.layoutInflater;
+ layoutInflater.setLayoutInflaterDelegate({
beforeConvertXml: function (xml) {
return null;
},
@@ -109,7 +122,8 @@ module.exports = function (runtime, global) {
return null;
},
afterCreateView: function (view, node, viewName, attrs) {
- if (view.getClass().getName() == "com.stardust.autojs.core.ui.widget.JsListView") {
+ if (view.getClass().getName() == "com.stardust.autojs.core.ui.widget.JsListView" ||
+ view.getClass().getName() == "com.stardust.autojs.core.ui.widget.JsGridView") {
initListView(view);
}
return view;
@@ -133,6 +147,11 @@ module.exports = function (runtime, global) {
return false;
},
beforeApplyAttribute: function (inflater, view, ns, attrName, value, parent, attrs) {
+ var isDynamic = layoutInflater.isDynamicValue(value);
+ if ((isDynamic && layoutInflater.getInflateFlags() == layoutInflater.FLAG_IGNORES_DYNAMIC_ATTRS)
+ || (!isDynamic && layoutInflater.getInflateFlags() == layoutInflater.FLAG_JUST_DYNAMIC_ATTRS)) {
+ return true;
+ }
value = bind(value);
inflater.setAttr(view, ns, attrName, value, parent, attrs);
this.afterApplyAttribute(inflater, view, ns, attrName, value, parent, attrs);
@@ -171,7 +190,8 @@ module.exports = function (runtime, global) {
function decorate(view) {
var view = global.events.__asEmitter__(Object.create(view));
- if (view.getClass().getName() == "com.stardust.autojs.core.ui.widget.JsListView") {
+ if (view.getClass().getName() == "com.stardust.autojs.core.ui.widget.JsListView"
+ || view.getClass().getName() == "com.stardust.autojs.core.ui.widget.JsGridView") {
view = decorateList(view);
}
var gestureDetector = new android.view.GestureDetector(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 ff23d8a7..f3514f71 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
@@ -50,6 +50,11 @@ import javax.xml.parsers.DocumentBuilderFactory;
public class DynamicLayoutInflater {
+
+ public static final int FLAG_DEFAULT = 0;
+ public static final int FLAG_IGNORES_DYNAMIC_ATTRS = 1;
+ public static final int FLAG_JUST_DYNAMIC_ATTRS = 2;
+
private static final String LOG_TAG = "DynamicLayoutInflater";
private Map> mViewAttrSetters = new HashMap<>();
@@ -58,6 +63,7 @@ public class DynamicLayoutInflater {
private ResourceParser mResourceParser;
@NonNull
private LayoutInflaterDelegate mLayoutInflaterDelegate = LayoutInflaterDelegate.NO_OP;
+ private int mInflateFlags;
public DynamicLayoutInflater(ResourceParser resourceParser) {
mResourceParser = resourceParser;
@@ -72,6 +78,14 @@ public class DynamicLayoutInflater {
this.mViewCreators = new HashMap<>(inflater.mViewCreators);
}
+ public int getInflateFlags() {
+ return mInflateFlags;
+ }
+
+ public void setInflateFlags(int inflateFlags) {
+ mInflateFlags = inflateFlags;
+ }
+
public ResourceParser getResourceParser() {
return mResourceParser;
}
@@ -160,8 +174,11 @@ public class DynamicLayoutInflater {
return view;
HashMap attrs = getAttributesMap(node);
view = doCreateView(node, node.getNodeName(), attrs);
- if (parent != null && attachToParent) {
- parent.addView(view); // have to add to parent to enable certain layout attrs
+ if (parent != null) {
+ parent.addView(view); // have to add to parent to generate layout params
+ if (!attachToParent) {
+ parent.removeView(view);
+ }
}
ViewInflater inflater = applyAttributes(view, attrs, parent);
if (!(view instanceof ViewGroup) || !node.hasChildNodes()) {
@@ -297,10 +314,22 @@ public class DynamicLayoutInflater {
if (mLayoutInflaterDelegate.beforeApplyAttribute(inflater, view, ns, attrName, value, parent, attrs)) {
return;
}
+ boolean isDynamic = isDynamicValue(value);
+ if ((isDynamic && mInflateFlags == FLAG_IGNORES_DYNAMIC_ATTRS)
+ || (!isDynamic && mInflateFlags == FLAG_JUST_DYNAMIC_ATTRS)) {
+ return;
+ }
inflater.setAttr(view, ns, attrName, value, parent, attrs);
mLayoutInflaterDelegate.afterApplyAttribute(inflater, view, ns, attrName, value, parent, attrs);
}
+ public boolean isDynamicValue(String value) {
+ int i = value.indexOf("{{");
+ if (i < 0)
+ return false;
+ return value.indexOf("}}", i + 1) >= 0;
+ }
+
}
diff --git a/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/ViewInflater.java b/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/ViewInflater.java
index 1d437495..2e87e80d 100644
--- a/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/ViewInflater.java
+++ b/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/ViewInflater.java
@@ -25,5 +25,5 @@ public interface ViewInflater {
boolean inflateChildren(DynamicLayoutInflater inflater, Node node, V parent);
@Nullable
- ViewCreator getCreator();
+ ViewCreator super V> getCreator();
}
\ No newline at end of file
diff --git a/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/inflaters/BaseViewInflater.java b/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/inflaters/BaseViewInflater.java
index b91d8f3a..b7446133 100644
--- a/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/inflaters/BaseViewInflater.java
+++ b/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/inflaters/BaseViewInflater.java
@@ -616,7 +616,7 @@ public class BaseViewInflater implements ViewInflater {
@Nullable
@Override
- public ViewCreator getCreator() {
+ public ViewCreator super V> getCreator() {
return null;
}
}
diff --git a/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/inflaters/JsGridViewInflater.java b/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/inflaters/JsGridViewInflater.java
new file mode 100644
index 00000000..4ce3e610
--- /dev/null
+++ b/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/inflaters/JsGridViewInflater.java
@@ -0,0 +1,45 @@
+package com.stardust.autojs.core.ui.inflater.inflaters;
+
+import android.support.annotation.Nullable;
+import android.support.v7.widget.GridLayoutManager;
+import android.view.ViewGroup;
+
+import com.stardust.autojs.core.ui.inflater.ResourceParser;
+import com.stardust.autojs.core.ui.inflater.ViewCreator;
+import com.stardust.autojs.core.ui.widget.JsGridView;
+import com.stardust.autojs.core.ui.widget.JsListView;
+import com.stardust.autojs.runtime.ScriptRuntime;
+
+import java.util.Map;
+
+/**
+ * Created by Stardust on 2018/3/30.
+ */
+
+public class JsGridViewInflater extends JsListViewInflater {
+
+ public JsGridViewInflater(ResourceParser resourceParser, ScriptRuntime runtime) {
+ super(resourceParser, runtime);
+ }
+
+ @Override
+ public boolean setAttr(V view, String attr, String value, ViewGroup parent, Map attrs) {
+ switch (attr) {
+ case "orientation":
+ ((GridLayoutManager) view.getLayoutManager()).setOrientation(LinearLayoutInflater.ORIENTATIONS.get(value));
+ return true;
+ case "spanCount":
+ ((GridLayoutManager) view.getLayoutManager()).setSpanCount(Integer.parseInt(value));
+ return true;
+ default:
+ return super.setAttr(view, attr, value, parent, attrs);
+ }
+ }
+
+
+ @Nullable
+ @Override
+ public ViewCreator super JsListView> getCreator() {
+ return (context, attrs) -> new JsGridView(context, getRuntime());
+ }
+}
diff --git a/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/inflaters/JsListViewInflater.java b/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/inflaters/JsListViewInflater.java
index 4c79a141..d4a12ad4 100644
--- a/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/inflaters/JsListViewInflater.java
+++ b/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/inflaters/JsListViewInflater.java
@@ -21,17 +21,21 @@ import java.util.Map;
* Created by Stardust on 2018/3/28.
*/
-public class JsListViewInflater extends BaseViewInflater {
+public class JsListViewInflater extends BaseViewInflater {
- private ScriptRuntime mRuntime;
+ private final ScriptRuntime mRuntime;
public JsListViewInflater(ResourceParser resourceParser, ScriptRuntime runtime) {
super(resourceParser);
mRuntime = runtime;
}
+ public ScriptRuntime getRuntime() {
+ return mRuntime;
+ }
+
@Override
- public boolean setAttr(JsListView view, String attr, String value, ViewGroup parent, Map attrs) {
+ public boolean setAttr(V view, String attr, String value, ViewGroup parent, Map attrs) {
switch (attr) {
case "orientation":
view.setLayoutManager(new WrapContentLinearLayoutManager(view.getContext(), LinearLayoutInflater.ORIENTATIONS.get(value), false));
@@ -42,7 +46,7 @@ public class JsListViewInflater extends BaseViewInflater {
}
@Override
- public boolean setAttr(JsListView view, String ns, String attrName, String value, ViewGroup parent, Map attrs) {
+ public boolean setAttr(V view, String ns, String attrName, String value, ViewGroup parent, Map attrs) {
return super.setAttr(view, ns, attrName, value, parent, attrs);
}
@@ -60,7 +64,7 @@ public class JsListViewInflater extends BaseViewInflater {
@Nullable
@Override
- public ViewCreator getCreator() {
+ public ViewCreator super JsListView> getCreator() {
return (context, attrs) -> new JsListView(context, mRuntime);
}
}
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 684aa7e1..3a36d90b 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
@@ -55,8 +55,11 @@ public class Drawables {
}
public Drawable loadDrawableResources(Context context, String value) {
- return context.getResources().getDrawable(context.getResources().getIdentifier(value, "drawable",
- context.getPackageName()));
+ int resId = context.getResources().getIdentifier(value, "drawable",
+ context.getPackageName());
+ if (resId == 0)
+ throw new Resources.NotFoundException("drawable not found: " + value);
+ return context.getResources().getDrawable(resId);
}
public Drawable loadAttrResources(Context context, String value) {
diff --git a/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsGridView.java b/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsGridView.java
new file mode 100644
index 00000000..7db08ec4
--- /dev/null
+++ b/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsGridView.java
@@ -0,0 +1,23 @@
+package com.stardust.autojs.core.ui.widget;
+
+import android.content.Context;
+import android.support.v7.widget.GridLayoutManager;
+
+import com.stardust.autojs.runtime.ScriptRuntime;
+
+/**
+ * Created by Stardust on 2018/3/30.
+ */
+
+public class JsGridView extends JsListView {
+
+ public JsGridView(Context context, ScriptRuntime scriptRuntime) {
+ super(context, scriptRuntime);
+ }
+
+ @Override
+ protected void init() {
+ super.init();
+ setLayoutManager(new GridLayoutManager(getContext(), 1));
+ }
+}
diff --git a/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsListView.java b/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsListView.java
index d06ed07e..6c82f017 100644
--- a/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsListView.java
+++ b/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsListView.java
@@ -1,6 +1,7 @@
package com.stardust.autojs.core.ui.widget;
import android.content.Context;
+import android.os.Handler;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
@@ -47,11 +48,12 @@ public class JsListView extends RecyclerView {
init();
}
- private void init() {
+ protected void init() {
setAdapter(new Adapter());
setLayoutManager(new WrapContentLinearLayoutManager(getContext()));
}
+
public void setOnItemTouchListener(OnItemTouchListener onItemTouchListener) {
mOnItemTouchListener = onItemTouchListener;
}
@@ -101,10 +103,13 @@ public class JsListView extends RecyclerView {
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
try {
+ mDynamicLayoutInflater.setInflateFlags(DynamicLayoutInflater.FLAG_IGNORES_DYNAMIC_ATTRS);
return new ViewHolder(mDynamicLayoutInflater.inflate(mItemTemplate, parent, false));
} catch (Exception e) {
mScriptRuntime.exit(e);
return new ViewHolder(new View(parent.getContext()));
+ } finally {
+ mDynamicLayoutInflater.setInflateFlags(DynamicLayoutInflater.FLAG_DEFAULT);
}
}
@@ -113,10 +118,13 @@ public class JsListView extends RecyclerView {
try {
Object oldCtx = mScriptRuntime.ui.getBindingContext();
mScriptRuntime.ui.setBindingContext(mDataSourceAdapter.getItem(mDataSource, position));
- applyDynamicAttrs(mItemTemplate, holder.itemView, (ViewGroup) holder.itemView.getParent());
+ mDynamicLayoutInflater.setInflateFlags(DynamicLayoutInflater.FLAG_JUST_DYNAMIC_ATTRS);
+ applyDynamicAttrs(mItemTemplate, holder.itemView, JsListView.this);
mScriptRuntime.ui.setBindingContext(oldCtx);
} catch (Exception e) {
mScriptRuntime.exit(e);
+ } finally {
+ mDynamicLayoutInflater.setInflateFlags(DynamicLayoutInflater.FLAG_DEFAULT);
}
}
diff --git a/autojs/src/main/java/com/stardust/autojs/core/ui/xml/XmlConverter.java b/autojs/src/main/java/com/stardust/autojs/core/ui/xml/XmlConverter.java
index eea0ad5f..ef2a0c46 100644
--- a/autojs/src/main/java/com/stardust/autojs/core/ui/xml/XmlConverter.java
+++ b/autojs/src/main/java/com/stardust/autojs/core/ui/xml/XmlConverter.java
@@ -17,6 +17,7 @@ import com.stardust.autojs.core.graphics.ScriptCanvasView;
import com.stardust.autojs.core.ui.widget.JsButton;
import com.stardust.autojs.core.ui.widget.JsEditText;
import com.stardust.autojs.core.ui.widget.JsFrameLayout;
+import com.stardust.autojs.core.ui.widget.JsGridView;
import com.stardust.autojs.core.ui.widget.JsImageView;
import com.stardust.autojs.core.ui.widget.JsLinearLayout;
import com.stardust.autojs.core.ui.widget.JsListView;
@@ -69,6 +70,7 @@ public class XmlConverter {
.map("toolbar", Toolbar.class.getName())
.map("canvas", ScriptCanvasView.class.getName())
.map("list", JsListView.class.getName())
+ .map("grid", JsGridView.class.getName())
);
private static final AttributeHandler ATTRIBUTE_HANDLER = new AttributeHandler.AttrNameRouter()
diff --git a/autojs/src/main/java/com/stardust/autojs/engine/LoopBasedJavaScriptEngine.java b/autojs/src/main/java/com/stardust/autojs/engine/LoopBasedJavaScriptEngine.java
index 1d568786..4cb03c4b 100644
--- a/autojs/src/main/java/com/stardust/autojs/engine/LoopBasedJavaScriptEngine.java
+++ b/autojs/src/main/java/com/stardust/autojs/engine/LoopBasedJavaScriptEngine.java
@@ -65,8 +65,9 @@ public class LoopBasedJavaScriptEngine extends RhinoJavaScriptEngine {
public void forceStop() {
LooperHelper.quitForThread(getThread());
Activity activity = (Activity) getTag("activity");
- if (activity != null)
+ if (activity != null) {
activity.finish();
+ }
super.forceStop();
}
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 afc0742e..1f367b5e 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
@@ -7,8 +7,10 @@ import com.stardust.autojs.core.graphics.ScriptCanvasView;
import com.stardust.autojs.core.ui.inflater.DynamicLayoutInflater;
import com.stardust.autojs.core.ui.inflater.ResourceParser;
import com.stardust.autojs.core.ui.inflater.inflaters.CanvasViewInflater;
+import com.stardust.autojs.core.ui.inflater.inflaters.JsGridViewInflater;
import com.stardust.autojs.core.ui.inflater.inflaters.JsImageViewInflater;
import com.stardust.autojs.core.ui.inflater.inflaters.JsListViewInflater;
+import com.stardust.autojs.core.ui.widget.JsGridView;
import com.stardust.autojs.core.ui.widget.JsImageView;
import com.stardust.autojs.core.ui.widget.JsListView;
import com.stardust.autojs.rhino.ProxyObject;
@@ -43,6 +45,8 @@ public class UI extends ProxyObject {
new JsImageViewInflater(mResourceParser));
mDynamicLayoutInflater.registerViewAttrSetter(JsListView.class.getName(),
new JsListViewInflater(mResourceParser, runtime));
+ mDynamicLayoutInflater.registerViewAttrSetter(JsGridView.class.getName(),
+ new JsGridViewInflater(mResourceParser, runtime));
mDynamicLayoutInflater.registerViewAttrSetter(ScriptCanvasView.class.getName(),
new CanvasViewInflater(mResourceParser, runtime));
mProperties.put("layoutInflater", this.mDynamicLayoutInflater);