From 2671299a29f3f40748052d01dd0e4b33ec35d0d0 Mon Sep 17 00:00:00 2001 From: PM Date: Thu, 29 Oct 2026 12:50:02 +0800 Subject: [PATCH 1/4] =?UTF-8?q?feat(rhino):=20=E5=8D=87=E7=BA=A7=20Rhino?= =?UTF-8?q?=20=E5=88=B0=201.9.2=20=E5=B9=B6=E6=B3=A8=E5=85=A5=20UI=20?= =?UTF-8?q?=E6=8E=A7=E4=BB=B6=E5=B1=9E=E6=80=A7=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Rhino 1.8.1 -> 1.9.2,适配新的 TypeInfo 类型系统(wrap / wrapAsJavaObject 签名变更) - 新增 InjectedNativeJavaObject、SimpleTypeInfo,View 对象统一包装后可读写布局属性 - ProxyObject / ProxyJavaObject / NativeJavaObjectWithPrototype / BindingNativeJavaObject 同步重构,移除 VMBridge_custom - 新增 AttrSupport 接口,13 个 Js* 控件实现,经由 ViewExtras / ViewAttributes 读写属性 - JsSpinner 支持下拉最大高度、条目高度以及选中态/普通态文字与背景色配置 - v6-api 的 ui.ts 暴露控件属性接口 --- .../stardust/autojs/core/ui/ViewExtras.java | 41 ++++- .../core/ui/attribute/ViewAttributes.java | 4 + .../autojs/core/ui/widget/AttrSupport.java | 60 +++++++ .../autojs/core/ui/widget/JsButton.java | 2 +- .../autojs/core/ui/widget/JsEditText.java | 2 +- .../autojs/core/ui/widget/JsFrameLayout.java | 2 +- .../autojs/core/ui/widget/JsGridView.java | 2 +- .../autojs/core/ui/widget/JsImageView.java | 2 +- .../autojs/core/ui/widget/JsLinearLayout.java | 2 +- .../autojs/core/ui/widget/JsListView.java | 2 +- .../core/ui/widget/JsRelativeLayout.java | 2 +- .../autojs/core/ui/widget/JsSpinner.java | 95 ++++++++++- .../autojs/core/ui/widget/JsTabLayout.java | 2 +- .../autojs/core/ui/widget/JsTextView.java | 2 +- .../autojs/core/ui/widget/JsToolbar.java | 2 +- .../autojs/core/ui/widget/JsWebView.kt | 19 +++ .../autojs/engine/RhinoJavaScriptEngine.kt | 76 +++++---- .../autojs/rhino/BindingNativeJavaObject.java | 18 +- .../rhino/InjectedNativeJavaObject.java | 145 +++++++++++++++++ .../rhino/NativeJavaObjectWithPrototype.java | 28 ++-- .../autojs/rhino/ProxyJavaObject.java | 43 ++--- .../stardust/autojs/rhino/ProxyObject.java | 63 ++++--- .../stardust/autojs/rhino/SimpleTypeInfo.java | 30 ++++ .../stardust/autojs/runtime/ScriptBridges.kt | 51 +++--- .../autojs/runtime/ScriptRuntime.java | 11 +- .../mozilla/javascript/ContextWrapper.java | 2 +- .../mozilla/javascript/VMBridge_custom.java | 154 ------------------ autojs/src/main/js/v6-api/src/ui/ui.ts | 11 +- gradle/libs.versions.toml | 6 +- 29 files changed, 575 insertions(+), 304 deletions(-) create mode 100644 autojs/src/main/java/com/stardust/autojs/core/ui/widget/AttrSupport.java create mode 100644 autojs/src/main/java/com/stardust/autojs/rhino/InjectedNativeJavaObject.java create mode 100644 autojs/src/main/java/com/stardust/autojs/rhino/SimpleTypeInfo.java delete mode 100644 autojs/src/main/java/org/mozilla/javascript/VMBridge_custom.java diff --git a/autojs/src/main/java/com/stardust/autojs/core/ui/ViewExtras.java b/autojs/src/main/java/com/stardust/autojs/core/ui/ViewExtras.java index d63bc9454..1bad3ef79 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/ui/ViewExtras.java +++ b/autojs/src/main/java/com/stardust/autojs/core/ui/ViewExtras.java @@ -16,8 +16,12 @@ public class ViewExtras { private static final String LOG_TAG = "ViewExtras"; private NativeView mNativeView; - private ViewAttributes mViewAttributes; + private static ResourceParser sResourceParser; + + public static void setResourceParser(ResourceParser parser) { + sResourceParser = parser; + } public static ViewExtras get(View view) { ViewExtras extras; @@ -32,6 +36,9 @@ public static ViewExtras get(View view) { return extras; } + public static ViewAttributes getViewAttributes(View view) { + return getViewAttributes(view, sResourceParser); + } public static ViewAttributes getViewAttributes(View view, ResourceParser parser) { ViewExtras extras = get(view); @@ -43,7 +50,6 @@ public static ViewAttributes getViewAttributes(View view, ResourceParser parser) return attributes; } - public static NativeView getNativeView(Scriptable scope, View view, Class staticType, ScriptRuntime runtime) { ViewExtras extras = get(view); NativeView nativeView = extras.getNativeView(); @@ -59,6 +65,35 @@ public static NativeView getNativeView(View view) { return extras.getNativeView(); } + public static void setAttr(View view, String name, Object value) { + ViewExtras extras = get(view); + ViewAttributes attrs = extras.getViewAttributes(); + if (attrs == null) { + attrs = ViewAttributesFactory.create(sResourceParser, view); + extras.setViewAttributes(attrs); + } + attrs.setAttr(name, String.valueOf(value)); + } + + public static Object getAttr(View view, String name) { + ViewExtras extras = get(view); + ViewAttributes attrs = extras.getViewAttributes(); + if (attrs != null) { + return attrs.getAttrValue(name); + } + return null; + } + + public static NativeView getOrCreateNativeView(Scriptable scope, View view, ScriptRuntime runtime) { + ViewExtras extras = get(view); + NativeView nativeView = extras.getNativeView(); + if (nativeView == null) { + nativeView = new NativeView(scope, view, view.getClass(), runtime); + extras.setNativeView(nativeView); + } + return nativeView; + } + public final NativeView getNativeView() { return mNativeView; } @@ -74,4 +109,4 @@ public final void setNativeView(NativeView nativeView) { public final void setViewAttributes(ViewAttributes viewAttributes) { mViewAttributes = viewAttributes; } -} +} \ No newline at end of file diff --git a/autojs/src/main/java/com/stardust/autojs/core/ui/attribute/ViewAttributes.java b/autojs/src/main/java/com/stardust/autojs/core/ui/attribute/ViewAttributes.java index a35796684..589ce387c 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/ui/attribute/ViewAttributes.java +++ b/autojs/src/main/java/com/stardust/autojs/core/ui/attribute/ViewAttributes.java @@ -165,6 +165,10 @@ public void setAttrValue(String name, String value) { } } + public void setAttr(String name, Object value) { + setAttrValue(name, String.valueOf(value)); + } + @SuppressLint("ClickableViewAccessibility") private void init() { onRegisterAttrs(); diff --git a/autojs/src/main/java/com/stardust/autojs/core/ui/widget/AttrSupport.java b/autojs/src/main/java/com/stardust/autojs/core/ui/widget/AttrSupport.java new file mode 100644 index 000000000..23bd592b9 --- /dev/null +++ b/autojs/src/main/java/com/stardust/autojs/core/ui/widget/AttrSupport.java @@ -0,0 +1,60 @@ +package com.stardust.autojs.core.ui.widget; + +import android.view.View; +import android.view.ViewGroup; + +import com.stardust.autojs.core.ui.ViewExtras; +import com.stardust.autojs.core.ui.attribute.ViewAttributes; + +import org.mozilla.javascript.ScriptRuntime; +import org.mozilla.javascript.Undefined; + +public interface AttrSupport { + + default void attr(String name, Object value) { + ViewAttributes attrs = ViewExtras.getViewAttributes((View) this); + if (attrs != null) { + attrs.setAttr(name, ScriptRuntime.toString(value)); + } + } + + default Object attr(String name) { + ViewAttributes attrs = ViewExtras.getViewAttributes((View) this); + if (attrs != null) { + return attrs.getAttrValue(name); + } + return Undefined.SCRIPTABLE_UNDEFINED; + } + + default void setWidth(int width) { + if (this instanceof View) { + View view = (View) this; + ViewGroup.LayoutParams params = view.getLayoutParams(); + if (params != null) { + params.width = width; + view.setLayoutParams(params); + view.requestLayout(); + } + } + } + + default void setHeight(int height) { + if (this instanceof View) { + View view = (View) this; + ViewGroup.LayoutParams params = view.getLayoutParams(); + if (params != null) { + params.height = height; + view.setLayoutParams(params); + view.requestLayout(); + } + } + } + + default int getWidth() { + return this instanceof View ? ((View) this).getWidth() : 0; + } + + default int getHeight() { + return this instanceof View ? ((View) this).getHeight() : 0; + } +} \ No newline at end of file diff --git a/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsButton.java b/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsButton.java index 126eec6d2..48d05ca81 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsButton.java +++ b/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsButton.java @@ -12,7 +12,7 @@ */ @SuppressLint("AppCompatCustomView") -public class JsButton extends Button { +public class JsButton extends Button implements AttrSupport { public JsButton(Context context) { super(context); } diff --git a/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsEditText.java b/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsEditText.java index 9c0506599..d97da64c9 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsEditText.java +++ b/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsEditText.java @@ -12,7 +12,7 @@ */ @SuppressLint("AppCompatCustomView") -public class JsEditText extends EditText { +public class JsEditText extends EditText implements AttrSupport { public JsEditText(Context context) { super(context); } diff --git a/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsFrameLayout.java b/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsFrameLayout.java index 3cad32dbc..129dcd8a0 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsFrameLayout.java +++ b/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsFrameLayout.java @@ -17,7 +17,7 @@ * Created by Stardust on 2017/5/14. */ -public class JsFrameLayout extends FrameLayout { +public class JsFrameLayout extends FrameLayout implements AttrSupport { public JsFrameLayout(@NonNull Context context) { super(context); } 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 index d4e5ebd46..e4fa0f014 100644 --- 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 @@ -11,7 +11,7 @@ * Created by Stardust on 2018/3/30. */ -public class JsGridView extends JsListView { +public class JsGridView extends JsListView implements AttrSupport { public JsGridView(Context context, ScriptRuntime scriptRuntime) { super(context, scriptRuntime); diff --git a/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsImageView.java b/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsImageView.java index 97b568606..73f55849a 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsImageView.java +++ b/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsImageView.java @@ -14,7 +14,7 @@ * Created by Stardust on 2017/11/30. */ -public class JsImageView extends RoundedImageView { +public class JsImageView extends RoundedImageView implements AttrSupport { private boolean mCircle; private Drawables mDrawables; diff --git a/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsLinearLayout.java b/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsLinearLayout.java index 1ec5ec792..987e8d2cb 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsLinearLayout.java +++ b/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsLinearLayout.java @@ -14,7 +14,7 @@ * Created by Stardust on 2017/5/14. */ -public class JsLinearLayout extends LinearLayout { +public class JsLinearLayout extends LinearLayout implements AttrSupport { public JsLinearLayout(Context context) { 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 0e849373a..7b6c095c1 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 @@ -21,7 +21,7 @@ * Created by Stardust on 2018/3/28. */ -public class JsListView extends RecyclerView { +public class JsListView extends RecyclerView implements AttrSupport { public interface DataSourceAdapter { diff --git a/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsRelativeLayout.java b/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsRelativeLayout.java index 703c3f6ce..f45aefd32 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsRelativeLayout.java +++ b/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsRelativeLayout.java @@ -13,7 +13,7 @@ * Created by Stardust on 2017/5/14. */ -public class JsRelativeLayout extends RelativeLayout { +public class JsRelativeLayout extends RelativeLayout implements AttrSupport { public JsRelativeLayout(Context context) { super(context); } diff --git a/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsSpinner.java b/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsSpinner.java index ea77c62ae..d51c296f7 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsSpinner.java +++ b/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsSpinner.java @@ -8,10 +8,13 @@ import android.util.TypedValue; import android.view.View; import android.view.ViewGroup; +import android.widget.AbsListView; import android.widget.ArrayAdapter; import android.widget.TextView; -public class JsSpinner extends androidx.appcompat.widget.AppCompatSpinner { +import com.stardust.autojs.core.ui.ViewExtras; + +public class JsSpinner extends androidx.appcompat.widget.AppCompatSpinner implements AttrSupport { private float mTextSize = -1; private int mTextStyle = -1; @@ -21,6 +24,13 @@ public class JsSpinner extends androidx.appcompat.widget.AppCompatSpinner { private int mEntryTextStyle = -1; private int mEntryTextColor = 0; + private int mEntryHeight = -1; + + private int mDropdownTextColorNormal; + private int mDropdownTextColorSelected; + private int mDropdownBgColorNormal; + private int mDropdownBgColorSelected; + public JsSpinner(Context context) { super(context); } @@ -45,7 +55,6 @@ public JsSpinner(Context context, AttributeSet attrs, int defStyleAttr, int mode super(context, attrs, defStyleAttr, mode, popupTheme); } - public float getTextSize() { return mTextSize; } @@ -84,7 +93,6 @@ public void setTextSize(float textSize) { } } - public int getTextStyle() { return mTextStyle; } @@ -113,6 +121,59 @@ public void setTextColor(int textColor) { } } + public void setDropDownMaxHeight(int maxHeightPx) { + try { + java.lang.reflect.Method method = androidx.appcompat.widget.AppCompatSpinner.class + .getDeclaredMethod("getInternalPopup"); + method.setAccessible(true); + Object popup = method.invoke(this); + if (popup != null) { + java.lang.reflect.Method setHeight = popup.getClass() + .getMethod("setHeight", int.class); + setHeight.invoke(popup, maxHeightPx); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + public void setDropDownItemHeight(int heightPx) { + mEntryHeight = heightPx; + } + + public void setDropdownTextColors(int normalColor, int selectedColor) { + mDropdownTextColorNormal = normalColor; + mDropdownTextColorSelected = selectedColor; + } + + public void setDropdownBackgroundColors(int normalColor, int selectedColor) { + mDropdownBgColorNormal = normalColor; + mDropdownBgColorSelected = selectedColor; + } + + public void setDropdownItems(String[] items) { + int defaultHeight = (int) (48 * getContext().getResources().getDisplayMetrics().density); + setDropdownItems(items, defaultHeight, null, null); + } + + public void setDropdownItems(String[] items, Integer itemHeight) { + setDropdownItems(items, itemHeight, null, null); + } + + public void setDropdownItems(String[] items, Integer itemHeight, Integer itemLayout, Integer dropDownLayout) { + if (items == null || items.length == 0) return; + + if (itemHeight != null) { + mEntryHeight = itemHeight; + } + + int layoutRes = itemLayout != null ? itemLayout : android.R.layout.simple_spinner_item; + int dropDownRes = dropDownLayout != null ? dropDownLayout : android.R.layout.simple_spinner_dropdown_item; + + Adapter adapter = new Adapter(getContext(), layoutRes, items); + adapter.setDropDownViewResource(dropDownRes); + setAdapter(adapter); + } public class Adapter extends ArrayAdapter { @@ -147,6 +208,7 @@ public View getDropDownView(int position, @Nullable View convertView, @NonNull V return view; } TextView textView = (TextView) view; + if (mEntryTextColor != 0) { textView.setTextColor(mEntryTextColor); } @@ -156,7 +218,32 @@ public View getDropDownView(int position, @Nullable View convertView, @NonNull V if (mEntryTextStyle != -1) { textView.setTypeface(textView.getTypeface(), mEntryTextStyle); } + + if (position == getSelectedItemPosition()) { + if (mDropdownTextColorSelected != 0) { + textView.setTextColor(mDropdownTextColorSelected); + } + if (mDropdownBgColorSelected != 0) { + textView.setBackgroundColor(mDropdownBgColorSelected); + } + } else { + if (mDropdownTextColorNormal != 0) { + textView.setTextColor(mDropdownTextColorNormal); + } + if (mDropdownBgColorNormal != 0) { + textView.setBackgroundColor(mDropdownBgColorNormal); + } + } + + if (mEntryHeight > 0) { + AbsListView.LayoutParams lp = new AbsListView.LayoutParams( + AbsListView.LayoutParams.MATCH_PARENT, + mEntryHeight + ); + textView.setLayoutParams(lp); + } + return textView; } } -} +} \ No newline at end of file diff --git a/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsTabLayout.java b/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsTabLayout.java index 88f7aef38..cfd96e971 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsTabLayout.java +++ b/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsTabLayout.java @@ -5,7 +5,7 @@ import com.google.android.material.tabs.TabLayout; -public class JsTabLayout extends TabLayout { +public class JsTabLayout extends TabLayout implements AttrSupport { public JsTabLayout(Context context) { super(context); diff --git a/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsTextView.java b/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsTextView.java index e91153db6..2d2431ba3 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsTextView.java +++ b/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsTextView.java @@ -12,7 +12,7 @@ */ @SuppressLint("AppCompatCustomView") -public class JsTextView extends TextView { +public class JsTextView extends TextView implements AttrSupport { public JsTextView(Context context) { super(context); 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 index 95304c6e4..5bd900123 100644 --- 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 @@ -12,7 +12,7 @@ import com.stardust.autojs.R; -public class JsToolbar extends Toolbar { +public class JsToolbar extends Toolbar implements AttrSupport { public JsToolbar(Context context) { super(context); diff --git a/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsWebView.kt b/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsWebView.kt index fa310a43b..4d171dd27 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsWebView.kt +++ b/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsWebView.kt @@ -5,9 +5,12 @@ import android.content.Context import android.util.AttributeSet import android.webkit.WebView import androidx.webkit.WebViewAssetLoader +import com.stardust.autojs.core.ui.ViewExtras import com.stardust.autojs.core.web.JsBridge +import org.mozilla.javascript.ScriptRuntime import java.io.File + @SuppressLint("SetJavaScriptEnabled") open class JsWebView : WebView { //val events = EventEmitter() @@ -55,4 +58,20 @@ open class JsWebView : WebView { fun injectionJsBridge() { JsBridge.injectionJsBridge(this) } + + fun attr(name: String?, value: Any?) { + val attrs = ViewExtras.getViewAttributes(this) + if (attrs != null) { + attrs.setAttr(name, ScriptRuntime.toString(value)) + } + } + + fun attr(name: String?): Any? { + val attrs = ViewExtras.getViewAttributes(this) + if (attrs != null) { + return attrs.getAttrValue(name) + } + return null + } + } diff --git a/autojs/src/main/java/com/stardust/autojs/engine/RhinoJavaScriptEngine.kt b/autojs/src/main/java/com/stardust/autojs/engine/RhinoJavaScriptEngine.kt index a91da9942..ef446c96d 100644 --- a/autojs/src/main/java/com/stardust/autojs/engine/RhinoJavaScriptEngine.kt +++ b/autojs/src/main/java/com/stardust/autojs/engine/RhinoJavaScriptEngine.kt @@ -2,13 +2,13 @@ package com.stardust.autojs.engine import android.util.Log import android.view.View -import com.stardust.autojs.core.ui.ViewExtras import com.stardust.autojs.engine.module.AssetAndUrlModuleSourceProvider import com.stardust.autojs.engine.module.ScopeRequire import com.stardust.autojs.execution.ExecutionConfig import com.stardust.autojs.project.ScriptConfig import com.stardust.autojs.rhino.AndroidContextFactory import com.stardust.autojs.rhino.AutoJsContext +import com.stardust.autojs.rhino.InjectedNativeJavaObject import com.stardust.autojs.rhino.RhinoAndroidHelper import com.stardust.autojs.rhino.TopLevelScope import com.stardust.autojs.runtime.ScriptRuntime @@ -21,12 +21,10 @@ import org.mozilla.javascript.Script import org.mozilla.javascript.Scriptable import org.mozilla.javascript.ScriptableObject import org.mozilla.javascript.commonjs.module.provider.SoftCachingModuleScriptProvider +import org.mozilla.javascript.lc.type.TypeInfo import java.io.IOException import java.io.InputStreamReader - -/** - * Created by Stardust on 2017/4/2. - */ +import java.net.URI open class RhinoJavaScriptEngine(private val mAndroidContext: android.content.Context) : JavaScriptEngine() { @@ -34,14 +32,14 @@ open class RhinoJavaScriptEngine(private val mAndroidContext: android.content.Co private val wrapFactory = WrapFactory() val context: Context = enterContext() private val mScriptable: TopLevelScope = createScope(this.context) - lateinit var thread: Thread + var thread: Thread? = null private set private val initScript: Script by lazy