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 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 @@ - + +