From 22185346e8c7842599fc02b5d4ff1935f2de635e Mon Sep 17 00:00:00 2001
From: hyb1996 <946994919@qq.com>
Date: Tue, 29 May 2018 20:26:21 +0800
Subject: [PATCH] save works
---
.../main/assets/sample/复杂界面/登录界面.js | 8 +--
.../org/autojs/autojs/tool/CrashHandler.java | 2 +
autojs/src/main/assets/modules/__ui__.js | 5 ++
.../autojs/core/eventloop/SimpleEvent.java | 6 ++
.../inflater/inflaters/BaseViewInflater.java | 16 +++++
.../inflater/inflaters/ToolbarInflater.java | 27 ++++----
.../autojs/core/ui/widget/JsToolbar.java | 45 ++++++++++++++
.../autojs/core/ui/xml/XmlConverter.java | 9 ++-
.../execution/ScriptExecuteActivity.java | 62 +++++++++++++++++++
autojs/src/main/res/layout/js_toolbar.xml | 8 +++
autojs/src/main/res/values/strings.xml | 2 +
autojs/src/main/res/values/styles.xml | 7 ++-
12 files changed, 177 insertions(+), 20 deletions(-)
create mode 100644 autojs/src/main/java/com/stardust/autojs/core/eventloop/SimpleEvent.java
create mode 100644 autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsToolbar.java
create mode 100644 autojs/src/main/res/layout/js_toolbar.xml
diff --git a/app/src/main/assets/sample/复杂界面/登录界面.js b/app/src/main/assets/sample/复杂界面/登录界面.js
index 60afa9ca..cdf35797 100644
--- a/app/src/main/assets/sample/复杂界面/登录界面.js
+++ b/app/src/main/assets/sample/复杂界面/登录界面.js
@@ -24,10 +24,10 @@ function showLoginUI(){
);
- ui.login.click(() => {
+ ui.login.on("click", () => {
toast("您输入的用户名为" + ui.name.text() + " 密码为" + ui.password.text());
});
- ui.register.click(() => showRegisterUI());
+ ui.register.on("click", () => showRegisterUI());
}
//显示注册界面
@@ -41,7 +41,7 @@ function showRegisterUI(){
密码
-
+
邮箱
@@ -54,5 +54,5 @@ function showRegisterUI(){
);
- ui.cancel.click(() => showLoginUI());
+ ui.cancel.on("click", () => showLoginUI());
}
\ No newline at end of file
diff --git a/app/src/main/java/org/autojs/autojs/tool/CrashHandler.java b/app/src/main/java/org/autojs/autojs/tool/CrashHandler.java
index 2f8305b0..fe707cc9 100644
--- a/app/src/main/java/org/autojs/autojs/tool/CrashHandler.java
+++ b/app/src/main/java/org/autojs/autojs/tool/CrashHandler.java
@@ -9,7 +9,9 @@ import android.content.Intent;
import android.os.Build;
import android.os.Looper;
import android.util.Log;
+import android.view.View;
import android.view.WindowManager;
+import android.widget.LinearLayout;
import android.widget.Toast;
import com.stardust.app.GlobalAppContext;
diff --git a/autojs/src/main/assets/modules/__ui__.js b/autojs/src/main/assets/modules/__ui__.js
index 8cfcafd5..38349a40 100644
--- a/autojs/src/main/assets/modules/__ui__.js
+++ b/autojs/src/main/assets/modules/__ui__.js
@@ -9,6 +9,8 @@ module.exports = function (runtime, global) {
var ui = {};
ui.__view_cache__ = {};
+ ui.__defineGetter__("emitter", ()=> activity ? activity.getEventEmitter() : null);
+
ui.layout = function (xml) {
if(!activity){
throw new Error("需要在ui模式下运行才能使用该函数");
@@ -152,6 +154,7 @@ module.exports = function (runtime, global) {
return false;
},
beforeApplyAttribute: function (inflater, view, ns, attrName, value, parent, attrs) {
+ log("beforeApplyAttribute:", view, attrName, value);
var isDynamic = layoutInflater.isDynamicValue(value);
if ((isDynamic && layoutInflater.getInflateFlags() == layoutInflater.FLAG_IGNORES_DYNAMIC_ATTRS)
|| (!isDynamic && layoutInflater.getInflateFlags() == layoutInflater.FLAG_JUST_DYNAMIC_ATTRS)) {
@@ -194,7 +197,9 @@ module.exports = function (runtime, global) {
}
function decorate(view) {
+ var androidView = view;
var view = global.events.__asEmitter__(Object.create(view));
+ view.__androidView__ = androidView;
if (view.getClass().getName() == "com.stardust.autojs.core.ui.widget.JsListView"
|| view.getClass().getName() == "com.stardust.autojs.core.ui.widget.JsGridView") {
view = decorateList(view);
diff --git a/autojs/src/main/java/com/stardust/autojs/core/eventloop/SimpleEvent.java b/autojs/src/main/java/com/stardust/autojs/core/eventloop/SimpleEvent.java
new file mode 100644
index 00000000..5fa98a52
--- /dev/null
+++ b/autojs/src/main/java/com/stardust/autojs/core/eventloop/SimpleEvent.java
@@ -0,0 +1,6 @@
+package com.stardust.autojs.core.eventloop;
+
+public class SimpleEvent {
+
+ public boolean consumed = false;
+}
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 b7446133..e212f488 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
@@ -4,6 +4,7 @@ import android.content.res.ColorStateList;
import android.graphics.PorterDuff;
import android.os.Build;
import android.support.annotation.Nullable;
+import android.support.v4.widget.DrawerLayout;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CompoundButton;
@@ -26,6 +27,7 @@ import com.stardust.autojs.core.ui.inflater.util.ValueMapper;
import org.w3c.dom.Node;
+import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Map;
@@ -151,6 +153,8 @@ public class BaseViewInflater implements ViewInflater {
((LinearLayout.LayoutParams) layoutParams).gravity = Gravities.parse(value);
} else if (parent != null && parent instanceof FrameLayout) {
((FrameLayout.LayoutParams) layoutParams).gravity = Gravities.parse(value);
+ } else {
+ return setLayoutGravity(parent, view, Gravities.parse(value));
}
break;
case "layout_weight":
@@ -585,6 +589,18 @@ public class BaseViewInflater implements ViewInflater {
return true;
}
+ public boolean setLayoutGravity(ViewGroup parent, V view, int gravity) {
+ try {
+ ViewGroup.LayoutParams layoutParams = view.getLayoutParams();
+ Field field = layoutParams.getClass().getField("gravity");
+ field.set(layoutParams, gravity);
+ return true;
+ } catch (Exception e) {
+ e.printStackTrace();
+ return false;
+ }
+ }
+
@Override
public boolean setAttr(V view, String ns, String attrName, String value, ViewGroup parent, Map attrs) {
if (ns == null || ns.equals("android")) {
diff --git a/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/inflaters/ToolbarInflater.java b/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/inflaters/ToolbarInflater.java
index 80d67acd..2db4976b 100644
--- a/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/inflaters/ToolbarInflater.java
+++ b/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/inflaters/ToolbarInflater.java
@@ -1,9 +1,14 @@
package com.stardust.autojs.core.ui.inflater.inflaters;
+import android.content.Context;
+import android.support.annotation.Nullable;
import android.support.v7.widget.Toolbar;
+import android.view.View;
import android.view.ViewGroup;
+import com.stardust.autojs.R;
import com.stardust.autojs.core.ui.inflater.ResourceParser;
+import com.stardust.autojs.core.ui.inflater.ViewCreator;
import com.stardust.autojs.core.ui.inflater.util.Strings;
import java.util.Map;
@@ -21,24 +26,20 @@ public class ToolbarInflater extends BaseViewInflater {
@Override
public boolean setAttr(V view, String attr, String value, ViewGroup parent, Map attrs) {
- return super.setAttr(view, attr, value, parent, attrs);
- }
-
- @Override
- public boolean setAttr(V view, String ns, String attrName, String value, ViewGroup parent, Map attrs) {
- if (super.setAttr(view, ns, attrName, value, parent, attrs)) {
- return true;
- }
- if (!ns.equals("app")) {
- return false;
- }
- switch (attrName) {
+ switch (attr) {
case "title":
view.setTitle(Strings.parse(view, value));
break;
default:
- return false;
+ return super.setAttr(view, attr, value, parent, attrs);
}
return true;
}
+
+ @Nullable
+ @Override
+ @SuppressWarnings("unchecked")
+ public ViewCreator super V> getCreator() {
+ return (ViewCreator) (context, attrs) -> (V) View.inflate(context, R.layout.js_toolbar, null);
+ }
}
diff --git a/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsToolbar.java b/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsToolbar.java
new file mode 100644
index 00000000..7ed8c9bc
--- /dev/null
+++ b/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsToolbar.java
@@ -0,0 +1,45 @@
+package com.stardust.autojs.core.ui.widget;
+
+import android.app.Activity;
+import android.content.Context;
+import android.support.annotation.Nullable;
+import android.support.v4.widget.DrawerLayout;
+import android.support.v7.app.ActionBarDrawerToggle;
+import android.support.v7.widget.Toolbar;
+import android.util.AttributeSet;
+import android.util.Log;
+
+import com.stardust.autojs.R;
+
+import org.mozilla.javascript.NativeObject;
+
+public class JsToolbar extends Toolbar {
+
+ public JsToolbar(Context context) {
+ super(context);
+ }
+
+ public JsToolbar(Context context, @Nullable AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public JsToolbar(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ }
+
+ public void setupWithDrawer(DrawerLayout drawerLayout) {
+ ActionBarDrawerToggle drawerToggle = new ActionBarDrawerToggle((Activity) getContext(), drawerLayout, this, R.string.text_drawer_open,
+ R.string.text_drawer_close);
+ drawerToggle.syncState();
+ drawerLayout.addDrawerListener(drawerToggle);
+ }
+
+ public void setupWithDrawer(NativeObject object) {
+ if (object.containsKey("__androidView__")) {
+ setupWithDrawer((DrawerLayout) object.get("__androidView__"));
+ } else {
+ throw new ClassCastException("cannot cast object to DrawerLayout");
+ }
+ }
+
+}
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 ef2a0c46..a18ba55b 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
@@ -1,5 +1,8 @@
package com.stardust.autojs.core.ui.xml;
+import android.support.design.widget.AppBarLayout;
+import android.support.design.widget.TabLayout;
+import android.support.v4.widget.DrawerLayout;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.webkit.WebView;
@@ -23,6 +26,7 @@ import com.stardust.autojs.core.ui.widget.JsLinearLayout;
import com.stardust.autojs.core.ui.widget.JsListView;
import com.stardust.autojs.core.ui.widget.JsRelativeLayout;
import com.stardust.autojs.core.ui.widget.JsTextView;
+import com.stardust.autojs.core.ui.widget.JsToolbar;
import com.stardust.autojs.core.ui.widget.JsWebView;
import org.w3c.dom.Document;
@@ -67,10 +71,13 @@ public class XmlConverter {
.map("radiogroup", RadioGroup.class.getName())
.map("checkbox", CheckBox.class.getName())
.map("scroll", ScrollView.class.getName())
- .map("toolbar", Toolbar.class.getName())
+ .map("toolbar", JsToolbar.class.getName())
.map("canvas", ScriptCanvasView.class.getName())
.map("list", JsListView.class.getName())
.map("grid", JsGridView.class.getName())
+ .map("drawer", DrawerLayout.class.getName())
+ .map("appbar", AppBarLayout.class.getName())
+ .map("tabs", TabLayout.class.getName())
);
private static final AttributeHandler ATTRIBUTE_HANDLER = new AttributeHandler.AttrNameRouter()
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 6f68d0b2..e4fd0c86 100644
--- a/autojs/src/main/java/com/stardust/autojs/execution/ScriptExecuteActivity.java
+++ b/autojs/src/main/java/com/stardust/autojs/execution/ScriptExecuteActivity.java
@@ -4,8 +4,13 @@ import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
+import android.os.PersistableBundle;
import android.support.v7.app.AppCompatActivity;
+import android.view.KeyEvent;
+import com.stardust.autojs.core.eventloop.EventEmitter;
+import com.stardust.autojs.core.eventloop.SimpleEvent;
+import com.stardust.autojs.engine.JavaScriptEngine;
import com.stardust.autojs.engine.LoopBasedJavaScriptEngine;
import com.stardust.autojs.engine.ScriptEngine;
import com.stardust.autojs.engine.ScriptEngineManager;
@@ -27,6 +32,9 @@ public class ScriptExecuteActivity extends AppCompatActivity {
private ActivityScriptExecution mScriptExecution;
private IntentExtras mIntentExtras;
+
+ private EventEmitter mEventEmitter;
+
public static ActivityScriptExecution execute(Context context, ScriptEngineManager manager, ScriptExecutionTask task) {
ActivityScriptExecution execution = new ActivityScriptExecution(manager, task);
Intent i = new Intent(context, ScriptExecuteActivity.class)
@@ -51,6 +59,7 @@ public class ScriptExecuteActivity extends AppCompatActivity {
mScriptSource = mScriptExecution.getSource();
mScriptEngine = mScriptExecution.createEngine(this);
mExecutionListener = mScriptExecution.getListener();
+ mEventEmitter = new EventEmitter(((JavaScriptEngine) mScriptEngine).getRuntime().bridges);
runScript();
}
@@ -134,6 +143,59 @@ public class ScriptExecuteActivity extends AppCompatActivity {
outState.putInt(IntentExtras.EXTRA_ID, extras.getId());
}
+ @Override
+ public void onBackPressed() {
+ SimpleEvent event = new SimpleEvent();
+ mEventEmitter.emit("back_pressed", event);
+ if (!event.consumed) {
+ super.onBackPressed();
+ }
+ }
+
+ @Override
+ protected void onPause() {
+ mEventEmitter.emit("pause");
+ super.onPause();
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ mEventEmitter.emit("resume");
+ }
+
+ @Override
+ protected void onRestart() {
+ super.onRestart();
+ }
+
+ @Override
+ protected void onRestoreInstanceState(Bundle savedInstanceState) {
+ super.onRestoreInstanceState(savedInstanceState);
+ mEventEmitter.emit("restore_instance_state", savedInstanceState);
+ }
+
+ @Override
+ public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
+ super.onSaveInstanceState(outState, outPersistentState);
+ mEventEmitter.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);
+ return e.consumed || super.onKeyDown(keyCode, event);
+
+ }
+
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+ super.onActivityResult(requestCode, resultCode, data);
+ mEventEmitter.emit("activity_result", requestCode, resultCode, data);
+ }
+
+
private static class ActivityScriptExecution extends ScriptExecution.AbstractScriptExecution {
private ScriptEngine mScriptEngine;
diff --git a/autojs/src/main/res/layout/js_toolbar.xml b/autojs/src/main/res/layout/js_toolbar.xml
new file mode 100644
index 00000000..a8a1ba4b
--- /dev/null
+++ b/autojs/src/main/res/layout/js_toolbar.xml
@@ -0,0 +1,8 @@
+
+
+
+
\ No newline at end of file
diff --git a/autojs/src/main/res/values/strings.xml b/autojs/src/main/res/values/strings.xml
index c8ed5315..d8c72379 100644
--- a/autojs/src/main/res/values/strings.xml
+++ b/autojs/src/main/res/values/strings.xml
@@ -18,6 +18,8 @@
沒有修改系統设置权限
通知服务未运行,请重新启用通知权限
本脚本需要Auto.js版本号%d以上才能运行
+ 打开侧拉菜单
+ 关闭侧拉菜单
diff --git a/autojs/src/main/res/values/styles.xml b/autojs/src/main/res/values/styles.xml
index a17bfb5b..00543b71 100644
--- a/autojs/src/main/res/values/styles.xml
+++ b/autojs/src/main/res/values/styles.xml
@@ -1,5 +1,5 @@
-
+
+
+
+