diff --git a/autojs/src/main/assets/modules/__dialogs__.js b/autojs/src/main/assets/modules/__dialogs__.js index f1615849..8217d0c0 100644 --- a/autojs/src/main/assets/modules/__dialogs__.js +++ b/autojs/src/main/assets/modules/__dialogs__.js @@ -194,6 +194,14 @@ module.exports = function(__runtime__, scope){ builder.getDialog().emit("check", checked, builder.getDialog()); }); } + if(properties.customView != undefined) { + let customView = properties.customView; + if(typeof(customView) == 'xml' || typeof(customView) == 'string') { + customView = ui.run(() => ui.inflate(customView)); + } + let wrapInScrollView = (properties.wrapInScrollView === undefined) ? true : properties.wrapInScrollView; + builder.customView(customView, wrapInScrollView); + } } function wrapNonNullString(str){ diff --git a/autojs/src/main/assets/modules/__ui__.js b/autojs/src/main/assets/modules/__ui__.js index f9fcb9a0..c0dec773 100644 --- a/autojs/src/main/assets/modules/__ui__.js +++ b/autojs/src/main/assets/modules/__ui__.js @@ -11,7 +11,7 @@ module.exports = function (runtime, global) { ui.__defineGetter__("emitter", ()=> activity ? activity.getEventEmitter() : null); ui.layout = function (xml) { - if(!activity){ + if(typeof(activity) == 'undefined'){ throw new Error("需要在ui模式下运行才能使用该函数"); } runtime.ui.layoutInflater.setContext(activity); @@ -24,15 +24,18 @@ module.exports = function (runtime, global) { } ui.inflate = function(xml, parent, attachToParent){ - if(!activity){ - throw new Error("需要在ui模式下运行才能使用该函数"); - } if(typeof(xml) == 'xml'){ xml = xml.toXMLString(); } parent = parent || null; attachToParent = !!attachToParent; - runtime.ui.layoutInflater.setContext(activity); + let ctx; + if(typeof(activity) == 'undefined') { + ctx = new android.view.ContextThemeWrapper(context, com.stardust.autojs.R.style.ScriptTheme); + } else { + ctx = activity; + } + runtime.ui.layoutInflater.setContext(ctx); return runtime.ui.layoutInflater.inflate(xml.toString(), parent, attachToParent); } diff --git a/autojs/src/main/java/com/stardust/autojs/core/looper/Loopers.java b/autojs/src/main/java/com/stardust/autojs/core/looper/Loopers.java index 31b402f0..c7cd424f 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/looper/Loopers.java +++ b/autojs/src/main/java/com/stardust/autojs/core/looper/Loopers.java @@ -17,10 +17,13 @@ import org.mozilla.javascript.Context; import java.util.HashSet; import java.util.concurrent.CopyOnWriteArrayList; +import androidx.annotation.Nullable; + /** * Created by Stardust on 2017/7/29. */ +@SuppressWarnings("ConstantConditions") public class Loopers implements MessageQueue.IdleHandler { private static final String LOG_TAG = "Loopers"; @@ -32,9 +35,27 @@ public class Loopers implements MessageQueue.IdleHandler { private static final Runnable EMPTY_RUNNABLE = () -> { }; - private volatile ThreadLocal waitWhenIdle = new ThreadLocal<>(); - private volatile ThreadLocal> waitIds = new ThreadLocal<>(); - private volatile ThreadLocal maxWaitId = new ThreadLocal<>(); + private volatile ThreadLocal waitWhenIdle = new ThreadLocal() { + @Nullable + @Override + protected Boolean initialValue() { + return Looper.myLooper() == Looper.getMainLooper(); + } + }; + private volatile ThreadLocal> waitIds = new ThreadLocal>() { + @Nullable + @Override + protected HashSet initialValue() { + return new HashSet<>(); + } + }; + private volatile ThreadLocal maxWaitId = new ThreadLocal() { + @Nullable + @Override + protected Integer initialValue() { + return 0; + } + }; private volatile ThreadLocal> looperQuitHandlers = new ThreadLocal<>(); private volatile Looper mServantLooper; private Timers mTimers; @@ -126,7 +147,7 @@ public class Loopers implements MessageQueue.IdleHandler { return mServantLooper; } - public void quitServantLooper() { + private void quitServantLooper() { if (mServantLooper == null) return; mServantLooper.quit(); @@ -134,12 +155,14 @@ public class Loopers implements MessageQueue.IdleHandler { public int waitWhenIdle() { int id = maxWaitId.get(); + Log.d(LOG_TAG, "waitWhenIdle: " + id); maxWaitId.set(id + 1); waitIds.get().add(id); return id; } public void doNotWaitWhenIdle(int waitId) { + Log.d(LOG_TAG, "doNotWaitWhenIdle: " + waitId); waitIds.get().remove(waitId); } @@ -181,9 +204,6 @@ public class Loopers implements MessageQueue.IdleHandler { if (Looper.myLooper() == null) LooperHelper.prepare(); Looper.myQueue().addIdleHandler(this); - waitWhenIdle.set(Looper.myLooper() == Looper.getMainLooper()); - waitIds.set(new HashSet<>()); - maxWaitId.set(0); } public void notifyThreadExit(TimerThread thread) { diff --git a/autojs/src/main/java/com/stardust/autojs/core/looper/Timer.java b/autojs/src/main/java/com/stardust/autojs/core/looper/Timer.java index 324c16b6..03218186 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/looper/Timer.java +++ b/autojs/src/main/java/com/stardust/autojs/core/looper/Timer.java @@ -89,6 +89,10 @@ public class Timer { } } + public void post(Runnable r) { + + } + public boolean clearInterval(int id) { return clearCallback(id); } diff --git a/autojs/src/main/java/com/stardust/autojs/core/ui/dialog/JsDialogBuilder.java b/autojs/src/main/java/com/stardust/autojs/core/ui/dialog/JsDialogBuilder.java index e089536f..5dc2ff13 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/ui/dialog/JsDialogBuilder.java +++ b/autojs/src/main/java/com/stardust/autojs/core/ui/dialog/JsDialogBuilder.java @@ -34,7 +34,7 @@ public class JsDialogBuilder extends MaterialDialog.Builder { super(context); mTimer = runtime.timers.getTimerForCurrentThread(); mLoopers = runtime.loopers; - mEmitter = new EventEmitter(runtime.bridges, mTimer); + mEmitter = new EventEmitter(runtime.bridges); mUiHandler = runtime.uiHandler; setUpEvents(); } @@ -70,7 +70,6 @@ public class JsDialogBuilder extends MaterialDialog.Builder { public void onShowCalled() { mTimer.postDelayed(() -> mWaitId = mLoopers.waitWhenIdle(), 0); - } public JsDialog getDialog() { diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/api/Dialogs.java b/autojs/src/main/java/com/stardust/autojs/runtime/api/Dialogs.java index 14425ba1..75d0ce72 100644 --- a/autojs/src/main/java/com/stardust/autojs/runtime/api/Dialogs.java +++ b/autojs/src/main/java/com/stardust/autojs/runtime/api/Dialogs.java @@ -144,7 +144,6 @@ public class Dialogs { } return new JsDialogBuilder(context, mRuntime) .theme(Theme.LIGHT); - } public class NonUiDialogs {