From 7036fa994eff51c6081fd9cd0d1f76edc33ba07d Mon Sep 17 00:00:00 2001
From: hyb1996 <946994919@qq.com>
Date: Sun, 3 Jun 2018 11:57:49 +0800
Subject: [PATCH] =?UTF-8?q?fix(autojs):=20ui.emitter.emit()=20may=20make?=
=?UTF-8?q?=20app=20crash=20if=20callback=20throws=20exception=20add(sampl?=
=?UTF-8?q?e):=20=E7=95=8C=E9=9D=A2=E6=A8=A1=E6=9D=BF=E4=B8=80.js?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../main/assets/sample/复杂界面/界面模板一.js | 89 +++++++++++++++++++
autojs/src/main/assets/modules/__bridges__.js | 3 +
.../execution/ScriptExecuteActivity.java | 43 ++++++---
.../com/stardust/autojs/runtime/api/UI.java | 5 +-
4 files changed, 128 insertions(+), 12 deletions(-)
create mode 100644 app/src/main/assets/sample/复杂界面/界面模板一.js
diff --git a/app/src/main/assets/sample/复杂界面/界面模板一.js b/app/src/main/assets/sample/复杂界面/界面模板一.js
new file mode 100644
index 00000000..d65242d4
--- /dev/null
+++ b/app/src/main/assets/sample/复杂界面/界面模板一.js
@@ -0,0 +1,89 @@
+"ui";
+
+var color = "#009688";
+
+ui.layout(
+
+
+
+
+
+
+
+
+
+
+
+
+
+);
+
+
+//创建选项菜单(右上角)
+ui.emitter.on("create_options_menu", menu=>{
+ menu.add("设置");
+ menu.add("关于");
+});
+//监听选项菜单点击
+ui.emitter.on("options_item_selected", (e, item)=>{
+ switch(item.getTitle()){
+ case "设置":
+ toast("还没有设置");
+ break;
+ case "关于":
+ alert("关于", "Auto.js界面模板 v1.0.0");
+ break;
+ }
+ e.consumed = true;
+});
+activity.setSupportActionBar(ui.toolbar);
+
+//设置滑动页面的标题
+ui.viewpager.setTitles(["标签一", "标签二", "标签三"]);
+//让滑动页面和标签栏联动
+ui.tabs.setupWithViewPager(ui.viewpager);
+
+//让工具栏左上角可以打开侧拉菜单
+ui.toolbar.setupWithDrawer(ui.drawer);
+
+ui.menu.setDataSource([
+ {
+ title: "选项一",
+ icon: "@drawable/ic_android_black_48dp"
+ },
+ {
+ title: "选项二",
+ icon: "@drawable/ic_settings_black_48dp"
+ },
+ {
+ title: "选项三",
+ icon: "@drawable/ic_favorite_black_48dp"
+ },
+ {
+ title: "退出",
+ icon: "@drawable/ic_exit_to_app_black_48dp"
+ }
+]);
+
+ui.menu.on("item_click", item => {
+ switch(item.title){
+ case "退出":
+ ui.finish();
+ break;
+ }
+})
\ No newline at end of file
diff --git a/autojs/src/main/assets/modules/__bridges__.js b/autojs/src/main/assets/modules/__bridges__.js
index 2123a36a..015d3e2c 100644
--- a/autojs/src/main/assets/modules/__bridges__.js
+++ b/autojs/src/main/assets/modules/__bridges__.js
@@ -20,6 +20,9 @@ bridges.call = function (func, target, args) {
*/
function wrap(value){
+ if(value == null || value == undefined){
+ return value;
+ }
if(!(typeof(value) == 'object' && value.getClass && util.isFunction(value.getClass))){
return value;
}
diff --git a/autojs/src/main/java/com/stardust/autojs/execution/ScriptExecuteActivity.java b/autojs/src/main/java/com/stardust/autojs/execution/ScriptExecuteActivity.java
index 81d3d39e..b431c153 100644
--- a/autojs/src/main/java/com/stardust/autojs/execution/ScriptExecuteActivity.java
+++ b/autojs/src/main/java/com/stardust/autojs/execution/ScriptExecuteActivity.java
@@ -5,7 +5,9 @@ import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.PersistableBundle;
+import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.Toolbar;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
@@ -13,13 +15,18 @@ import android.view.MotionEvent;
import com.stardust.autojs.core.eventloop.EventEmitter;
import com.stardust.autojs.core.eventloop.SimpleEvent;
+import com.stardust.autojs.core.ui.inflater.inflaters.Exceptions;
import com.stardust.autojs.engine.JavaScriptEngine;
import com.stardust.autojs.engine.LoopBasedJavaScriptEngine;
import com.stardust.autojs.engine.ScriptEngine;
import com.stardust.autojs.engine.ScriptEngineManager;
+import com.stardust.autojs.runtime.ScriptRuntime;
+import com.stardust.autojs.runtime.api.UI;
import com.stardust.autojs.script.ScriptSource;
import com.stardust.util.IntentExtras;
+import org.mozilla.javascript.NativeObject;
+
/**
* Created by Stardust on 2017/2/5.
*/
@@ -34,6 +41,7 @@ public class ScriptExecuteActivity extends AppCompatActivity {
private ScriptSource mScriptSource;
private ActivityScriptExecution mScriptExecution;
private IntentExtras mIntentExtras;
+ private ScriptRuntime mRuntime;
private EventEmitter mEventEmitter;
@@ -62,7 +70,8 @@ public class ScriptExecuteActivity extends AppCompatActivity {
mScriptSource = mScriptExecution.getSource();
mScriptEngine = mScriptExecution.createEngine(this);
mExecutionListener = mScriptExecution.getListener();
- mEventEmitter = new EventEmitter(((JavaScriptEngine) mScriptEngine).getRuntime().bridges);
+ mRuntime = ((JavaScriptEngine) mScriptEngine).getRuntime();
+ mEventEmitter = new EventEmitter(mRuntime.bridges);
runScript();
}
@@ -153,7 +162,7 @@ public class ScriptExecuteActivity extends AppCompatActivity {
@Override
public void onBackPressed() {
SimpleEvent event = new SimpleEvent();
- mEventEmitter.emit("back_pressed", event);
+ emit("back_pressed", event);
if (!event.consumed) {
super.onBackPressed();
}
@@ -161,14 +170,14 @@ public class ScriptExecuteActivity extends AppCompatActivity {
@Override
protected void onPause() {
- mEventEmitter.emit("pause");
+ emit("pause");
super.onPause();
}
@Override
protected void onResume() {
super.onResume();
- mEventEmitter.emit("resume");
+ emit("resume");
}
@Override
@@ -179,19 +188,19 @@ public class ScriptExecuteActivity extends AppCompatActivity {
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
- mEventEmitter.emit("restore_instance_state", savedInstanceState);
+ emit("restore_instance_state", savedInstanceState);
}
@Override
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
super.onSaveInstanceState(outState, outPersistentState);
- mEventEmitter.emit("save_instance_state", outState, outPersistentState);
+ emit("save_instance_state", outState, outPersistentState);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
SimpleEvent e = new SimpleEvent();
- mEventEmitter.emit("key_down", keyCode, event, e);
+ emit("key_down", keyCode, event, e);
return e.consumed || super.onKeyDown(keyCode, event);
}
@@ -199,29 +208,41 @@ public class ScriptExecuteActivity extends AppCompatActivity {
@Override
public boolean onGenericMotionEvent(MotionEvent event) {
SimpleEvent e = new SimpleEvent();
- mEventEmitter.emit("generic_motion_event", event, e);
+ emit("generic_motion_event", event, e);
return super.onGenericMotionEvent(event);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
- mEventEmitter.emit("activity_result", requestCode, resultCode, data);
+ emit("activity_result", requestCode, resultCode, data);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
- mEventEmitter.emit("create_options_menu", menu);
+ emit("create_options_menu", menu);
return menu.size() > 0;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
SimpleEvent e = new SimpleEvent();
- mEventEmitter.emit("options_item_selected", e, item);
+ emit("options_item_selected", e, item);
return e.consumed || super.onOptionsItemSelected(item);
}
+ public void emit(String event, Object... args) {
+ try {
+ mEventEmitter.emit(event, (Object[]) args);
+ } catch (Exception e) {
+ mRuntime.exit(e);
+ }
+ }
+
+ public void setSupportActionBar(@Nullable NativeObject toolbar) {
+ super.setSupportActionBar(UI.unwrapJsViewObject(toolbar, Toolbar.class));
+ }
+
private static class ActivityScriptExecution extends ScriptExecution.AbstractScriptExecution {
private ScriptEngine mScriptEngine;
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 f20b6698..3ee193cd 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
@@ -2,6 +2,7 @@ package com.stardust.autojs.runtime.api;
import android.content.Context;
import android.graphics.drawable.Drawable;
+import android.support.annotation.Nullable;
import android.view.View;
import com.stardust.autojs.core.graphics.ScriptCanvasView;
@@ -55,7 +56,9 @@ public class UI extends ProxyObject {
}
@SuppressWarnings("unchecked")
- public static V unwrapJsViewObject(NativeObject object, Class c) {
+ public static V unwrapJsViewObject(@Nullable NativeObject object, Class c) {
+ if (object == null)
+ return null;
if (!object.containsKey("__javaObject__")) {
throw new ClassCastException("object " + object + " cannot be cast to " + c.getName());
}