From 68706fbd98195878894af170b0b4b12e83462171 Mon Sep 17 00:00:00 2001 From: hyb1996 <946994919@qq.com> Date: Tue, 2 May 2017 11:27:04 +0800 Subject: [PATCH] Dying... --- app/build.gradle | 1 + app/proguard-rules.pro | 29 +++++- .../java/com/stardust/scriptdroid/App.java | 14 +++ .../stardust/scriptdroid/autojs/AutoJs.java | 50 ++++++++-- .../menu/HoverMenuService.java | 8 +- .../content/MainMenuNavigatorContent.java | 28 ++++-- .../menu/content/RecordNavigatorContent.java | 6 +- .../layout_inspector/LayoutInspector.java | 33 ++++--- .../view/LayoutHierarchyView.java | 4 +- .../view/LayoutInspectView.java | 5 - .../AccessibilityActionConverter.java | 16 +--- .../AccessibilityActionRecorder.java | 12 +++ .../service/AccessibilityWatchDogService.java | 43 +++++---- .../stardust/scriptdroid/ui/BaseActivity.java | 2 +- .../scriptdroid/ui/console/TimberConsole.java | 72 +++++--------- .../ui/edit/completion/CodeCompletion.java | 2 +- .../main/operation/ScriptFileOperation.java | 2 +- .../ui/main/task/TaskListRecyclerView.java | 9 +- .../ui/main/task/TaskManagerFragment.java | 3 +- app/src/main/res/values-en/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + .../autojs/RunnableScriptExecution.java | 37 +++++++ .../stardust/autojs/ScriptEngineService.java | 96 +++++++------------ .../autojs/ScriptEngineServiceBuilder.java | 13 +-- .../com/stardust/autojs/ScriptExecution.java | 30 ++++++ .../stardust/autojs/ScriptExecutionTask.java | 30 ++++-- .../engine/JavaScriptEngineManager.java | 1 - .../engine/NodeJsJavaScriptEngineManager.java | 6 +- .../autojs/engine/RhinoJavaScriptEngine.java | 18 ---- .../engine/RhinoJavaScriptEngineManager.java | 5 +- .../autojs/engine/ScriptExecuteActivity.java | 70 ++++++++++---- .../autojs/runtime/AbstractConsole.java | 63 ++++++++++++ .../autojs/runtime/ScriptRuntime.java | 15 +-- .../stardust/autojs/runtime/api/Console.java | 20 ++-- .../autojs/runtime/api/UiSelector.java | 9 +- .../simple_action/SimpleActionAutomator.java | 8 +- .../AccessibilityEventCommandHost.java | 6 ++ .../stardust/automator/UiGlobalSelector.java | 30 ++---- .../java/com/stardust/automator/UiObject.java | 50 +++++++++- .../automator/UiObjectCollection.java | 38 +++----- .../automator/filter/BooleanFilter.java | 41 ++++---- .../automator/filter/BoundsFilter.java | 4 +- .../automator/filter/ClassNameFilter.java | 4 +- .../stardust/automator/filter/DescFilter.java | 4 +- .../stardust/automator/filter/DfsFilter.java | 26 +++-- .../com/stardust/automator/filter/Filter.java | 6 +- .../stardust/automator/filter/IdFilter.java | 10 +- .../stardust/automator/filter/KeyGetter.java | 4 +- .../stardust/automator/filter/ListFilter.java | 14 ++- .../automator/filter/PackageNameFilter.java | 4 +- .../filter/StringContainsFilter.java | 4 +- .../filter/StringEndsWithFilter.java | 4 +- .../automator/filter/StringEqualsFilter.java | 4 +- .../automator/filter/StringMatchesFilter.java | 4 +- .../filter/StringStartsWithFilter.java | 4 +- .../stardust/automator/filter/TextFilter.java | 10 +- .../automator/simple_action/Able.java | 13 +-- .../simple_action/ActionFactory.java | 3 +- .../DepthFirstSearchTargetAction.java | 10 +- .../automator/simple_action/FilterAction.java | 48 +++++----- .../automator/simple_action/ScrollAction.java | 24 +++-- .../simple_action/ScrollMaxAction.java | 15 ++- .../simple_action/SearchTargetAction.java | 11 +-- .../simple_action/SearchUpTargetAction.java | 15 +-- .../automator/simple_action/SimpleAction.java | 20 +--- .../SimpleActionPerformHost.java | 15 +-- .../accessibility/AccessibilityDelegate.java | 12 +++ .../AccessibilityInfoProvider.java | 16 +++- .../AccessibilityNodeInfoAllocator.java | 10 +- .../accessibility/AccessibilityService.java | 19 ++++ .../main/java/com/stardust/util/Supplier.java | 9 ++ 71 files changed, 759 insertions(+), 514 deletions(-) create mode 100644 autojs/src/main/java/com/stardust/autojs/RunnableScriptExecution.java create mode 100644 autojs/src/main/java/com/stardust/autojs/runtime/AbstractConsole.java create mode 100644 automator/src/main/java/com/stardust/view/accessibility/AccessibilityService.java create mode 100644 common/src/main/java/com/stardust/util/Supplier.java diff --git a/app/build.gradle b/app/build.gradle index 21302120..2d88e03b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -75,6 +75,7 @@ dependencies { compile group:'com.twofortyfouram', name:'android-plugin-client-sdk-for-locale', version:'[4.0.2, 5.0[' compile 'com.android.volley:volley:1.0.0' compile 'com.github.hyb1996:EnhancedFloaty:0.12' + compile 'com.flurry.android:analytics:7.0.0@aar' compile 'com.android.support:multidex:1.0.1' compile(name: 'libtermexec-release', ext: 'aar') compile(name: 'emulatorview-release', ext: 'aar') diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 97ef9112..568bf4c2 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -81,4 +81,31 @@ } -keepattributes Signature --keepattributes EnclosingMethod \ No newline at end of file +-keepattributes EnclosingMethod + + +# Required to preserve the Flurry SDK +-keep class com.flurry.** { *; } +-dontwarn com.flurry.** +-keepattributes *Annotation*,EnclosingMethod,Signature +-keepclasseswithmembers class * { + public (android.content.Context, android.util.AttributeSet, int); + } + + # Google Play Services library + -keep class * extends java.util.ListResourceBundle { + protected Object[ ][ ] getContents(); +} + + -keep public class com.google.android.gms.common.internal.safeparcel.SafeParcelable { + public static final *** NULL; + } + + -keepnames @com.google.android.gms.common.annotation.KeepName class * + -keepclassmembernames class * { + @com.google.android.gms.common.annotation.KeepName *; + } + + -keepnames class * implements android.os.Parcelable { + public static final ** CREATOR; + } \ No newline at end of file diff --git a/app/src/main/java/com/stardust/scriptdroid/App.java b/app/src/main/java/com/stardust/scriptdroid/App.java index 97383bcc..a4b52601 100644 --- a/app/src/main/java/com/stardust/scriptdroid/App.java +++ b/app/src/main/java/com/stardust/scriptdroid/App.java @@ -3,9 +3,11 @@ package com.stardust.scriptdroid; import android.app.Activity; import android.content.Intent; import android.content.IntentFilter; +import android.os.Bundle; import android.support.annotation.Keep; import android.support.multidex.MultiDexApplication; +import com.flurry.android.FlurryAgent; import com.squareup.leakcanary.LeakCanary; import com.stardust.app.SimpleActivityLifecycleCallbacks; import com.stardust.app.VolumeChangeObserver; @@ -40,10 +42,16 @@ public class App extends MultiDexApplication { public void onCreate() { super.onCreate(); instance = new WeakReference<>(this); + setUpStaticsTool(); setUpDebugEnvironment(); init(); registerActivityLifecycleCallback(); + } + private void setUpStaticsTool() { + new FlurryAgent.Builder() + .withLogEnabled(true) + .build(this, "D42MH48ZN4PJC5TKNYZD"); } @@ -80,6 +88,12 @@ public class App extends MultiDexApplication { private void registerActivityLifecycleCallback() { registerActivityLifecycleCallbacks(new SimpleActivityLifecycleCallbacks() { + @Override + public void onActivityCreated(Activity activity, Bundle savedInstanceState) { + super.onActivityCreated(activity, savedInstanceState); + FlurryAgent.logEvent(activity.getClass().getSimpleName()); + } + @Override public void onActivityPaused(Activity activity) { currentActivity = null; diff --git a/app/src/main/java/com/stardust/scriptdroid/autojs/AutoJs.java b/app/src/main/java/com/stardust/scriptdroid/autojs/AutoJs.java index 91a31924..f4884a6f 100644 --- a/app/src/main/java/com/stardust/scriptdroid/autojs/AutoJs.java +++ b/app/src/main/java/com/stardust/scriptdroid/autojs/AutoJs.java @@ -2,19 +2,24 @@ package com.stardust.scriptdroid.autojs; import android.accessibilityservice.AccessibilityService; import android.content.Context; +import android.os.Handler; import android.support.annotation.Nullable; +import com.flurry.android.FlurryAgent; import com.stardust.autojs.ScriptEngineService; import com.stardust.autojs.ScriptEngineServiceBuilder; +import com.stardust.autojs.ScriptExecutionListener; +import com.stardust.autojs.engine.JavaScriptEngine; import com.stardust.autojs.engine.NodeJsJavaScriptEngineManager; import com.stardust.autojs.runtime.*; -import com.stardust.autojs.runtime.api.Console; +import com.stardust.autojs.script.ScriptSource; import com.stardust.automator.AccessibilityEventCommandHost; import com.stardust.automator.simple_action.SimpleActionPerformHost; import com.stardust.scriptdroid.App; import com.stardust.scriptdroid.Pref; import com.stardust.scriptdroid.R; import com.stardust.scriptdroid.scripts.StorageScriptProvider; +import com.stardust.util.Supplier; import com.stardust.view.accessibility.AccessibilityInfoProvider; import com.stardust.scriptdroid.layout_inspector.LayoutInspector; import com.stardust.scriptdroid.record.accessibility.AccessibilityActionRecorder; @@ -46,23 +51,49 @@ public class AutoJs implements AccessibilityBridge { private final LayoutInspector mLayoutInspector = new LayoutInspector(); private final ScriptEngineService mScriptEngineService; private final AccessibilityInfoProvider mAccessibilityInfoProvider; - private final ScriptRuntime mRuntime; + private final Handler mUiHandler; - private AutoJs(Context context) { + private AutoJs(final Context context) { + mUiHandler = new Handler(context.getMainLooper()); mAccessibilityInfoProvider = new AccessibilityInfoProvider(context.getPackageManager()); - Console console = new TimberConsole(); - mRuntime = new ScriptRuntime(context, console, this); - NodeJsJavaScriptEngineManager manager = new NodeJsJavaScriptEngineManager(context, mRuntime); + NodeJsJavaScriptEngineManager manager = new NodeJsJavaScriptEngineManager(context); manager.setRequirePath(StorageScriptProvider.DEFAULT_DIRECTORY_PATH); mScriptEngineService = new ScriptEngineServiceBuilder() .context(context) .engineManger(manager) - .console(console) - .runtime(mRuntime) + .runtime(new Supplier() { + + @Override + public ScriptRuntime get() { + return new ScriptRuntime(context, mUiHandler, new TimberConsole(), AutoJs.this); + } + }) .build(); - ScriptEngineService.setInstance(mScriptEngineService); addAccessibilityServiceDelegates(); + setDefaultScriptExecutionListener(mScriptEngineService); + } + + + private static void setDefaultScriptExecutionListener(ScriptEngineService scriptEngineService) { + final ScriptExecutionListener listener = scriptEngineService.getDefaultScriptExecutionListener(); + scriptEngineService.setDefaultScriptExecutionListener(new ScriptExecutionListener() { + @Override + public void onStart(JavaScriptEngine engine, ScriptSource source) { + listener.onStart(engine, source); + FlurryAgent.logEvent("EXEC:" + source.toString()); + } + + @Override + public void onSuccess(JavaScriptEngine engine, ScriptSource source, Object result) { + listener.onSuccess(engine, source, result); + } + + @Override + public void onException(JavaScriptEngine engine, ScriptSource source, Exception e) { + listener.onException(engine, source, e); + } + }); } private void addAccessibilityServiceDelegates() { @@ -113,7 +144,6 @@ public class AutoJs implements AccessibilityBridge { } } if (errorMessage != null) { - mRuntime.toast(errorMessage); throw new ScriptStopException(errorMessage); } } diff --git a/app/src/main/java/com/stardust/scriptdroid/external/floating_window/menu/HoverMenuService.java b/app/src/main/java/com/stardust/scriptdroid/external/floating_window/menu/HoverMenuService.java index 090cd628..01b026ad 100644 --- a/app/src/main/java/com/stardust/scriptdroid/external/floating_window/menu/HoverMenuService.java +++ b/app/src/main/java/com/stardust/scriptdroid/external/floating_window/menu/HoverMenuService.java @@ -154,11 +154,7 @@ public class HoverMenuService extends Service { } private void captureCurrentWindow() { - NodeInfo nodeInfo = AutoJs.getInstance().getLayoutInspector().captureCurrentWindow(); - if (nodeInfo == null) - return; - mFloatingLayoutHierarchyView.setRootNode(nodeInfo); - mFloatingLayoutBoundsView.setRootNode(nodeInfo); + AutoJs.getInstance().getLayoutInspector().captureCurrentWindow(); } @Nullable @@ -216,11 +212,13 @@ public class HoverMenuService extends Service { } private void showLayoutBounds() { + mFloatingLayoutBoundsView.setRootNode(AutoJs.getInstance().getLayoutInspector().getCapture()); mWindowHoverMenu.getHoverMenuView().setVisibility(View.GONE); showView(mFloatingLayoutBoundsView); } public void showLayoutHierarchy() { + mFloatingLayoutHierarchyView.setRootNode(AutoJs.getInstance().getLayoutInspector().getCapture()); mWindowHoverMenu.getHoverMenuView().setVisibility(View.GONE); showView(mFloatingLayoutHierarchyView); } diff --git a/app/src/main/java/com/stardust/scriptdroid/external/floating_window/menu/content/MainMenuNavigatorContent.java b/app/src/main/java/com/stardust/scriptdroid/external/floating_window/menu/content/MainMenuNavigatorContent.java index 1c43ea46..3cfeeafd 100644 --- a/app/src/main/java/com/stardust/scriptdroid/external/floating_window/menu/content/MainMenuNavigatorContent.java +++ b/app/src/main/java/com/stardust/scriptdroid/external/floating_window/menu/content/MainMenuNavigatorContent.java @@ -12,6 +12,7 @@ import com.stardust.scriptdroid.App; import com.stardust.scriptdroid.R; import com.stardust.scriptdroid.autojs.AutoJs; import com.stardust.scriptdroid.external.floating_window.menu.HoverMenuService; +import com.stardust.scriptdroid.layout_inspector.LayoutInspector; import com.stardust.util.ClipboardUtil; import com.stardust.scriptdroid.ui.main.MainActivity; import com.stardust.util.MessageEvent; @@ -47,20 +48,31 @@ public class MainMenuNavigatorContent implements NavigatorContent { @ViewBinding.Click(R.id.layout_hierarchy) private void showLayoutHierarchy() { - if (AutoJs.getInstance().getLayoutInspector().getCapture() == null) { - Toast.makeText(mView.getContext(), R.string.text_no_accessibility_permission_to_capture, Toast.LENGTH_SHORT).show(); - } else { - HoverMenuService.postEvent(new MessageEvent(HoverMenuService.MESSAGE_SHOW_LAYOUT_HIERARCHY)); + if (!ensureCapture()) { + return; } + HoverMenuService.postEvent(new MessageEvent(HoverMenuService.MESSAGE_SHOW_LAYOUT_HIERARCHY)); + } + + private boolean ensureCapture() { + LayoutInspector inspector = AutoJs.getInstance().getLayoutInspector(); + if (inspector.isDumping()) { + Toast.makeText(mView.getContext(), R.string.text_layout_inspector_is_dumping, Toast.LENGTH_SHORT).show(); + return false; + } + if (inspector.getCapture() == null) { + Toast.makeText(mView.getContext(), R.string.text_no_accessibility_permission_to_capture, Toast.LENGTH_SHORT).show(); + return false; + } + return true; } @ViewBinding.Click(R.id.layout_bounds) private void showLayoutBounds() { - if (AutoJs.getInstance().getLayoutInspector().getCapture() == null) { - Toast.makeText(mView.getContext(), R.string.text_no_accessibility_permission_to_capture, Toast.LENGTH_SHORT).show(); - } else { - HoverMenuService.postEvent(new MessageEvent(HoverMenuService.MESSAGE_SHOW_LAYOUT_BOUNDS)); + if (!ensureCapture()) { + return; } + HoverMenuService.postEvent(new MessageEvent(HoverMenuService.MESSAGE_SHOW_LAYOUT_BOUNDS)); } @ViewBinding.Click(R.id.stop_all_running_scripts) diff --git a/app/src/main/java/com/stardust/scriptdroid/external/floating_window/menu/content/RecordNavigatorContent.java b/app/src/main/java/com/stardust/scriptdroid/external/floating_window/menu/content/RecordNavigatorContent.java index 54192205..6a330f16 100644 --- a/app/src/main/java/com/stardust/scriptdroid/external/floating_window/menu/content/RecordNavigatorContent.java +++ b/app/src/main/java/com/stardust/scriptdroid/external/floating_window/menu/content/RecordNavigatorContent.java @@ -118,7 +118,7 @@ public class RecordNavigatorContent implements NavigatorContent, Recorder.OnStat private void resumeRecord() { mRecorder.resume(); setState(Recorder.STATE_RECORDING); - EventBus.getDefault().post(new MessageEvent(HoverMenuService.MESSAGE_COLLAPSE_MENU)); + HoverMenuService.postEvent(new MessageEvent(HoverMenuService.MESSAGE_COLLAPSE_MENU)); } private void pauseRecord() { @@ -131,7 +131,7 @@ public class RecordNavigatorContent implements NavigatorContent, Recorder.OnStat mRecorder.setOnStateChangedListener(this); mRecorder.start(); setState(Recorder.STATE_RECORDING); - EventBus.getDefault().post(new MessageEvent(HoverMenuService.MESSAGE_COLLAPSE_MENU)); + HoverMenuService.postEvent(new MessageEvent(HoverMenuService.MESSAGE_COLLAPSE_MENU)); } private void setState(int state) { @@ -147,7 +147,7 @@ public class RecordNavigatorContent implements NavigatorContent, Recorder.OnStat private void stopRecord() { mRecorder.stop(); setState(Recorder.STATE_STOPPED); - EventBus.getDefault().post(new MessageEvent(HoverMenuService.MESSAGE_COLLAPSE_MENU)); + HoverMenuService.postEvent(new MessageEvent(HoverMenuService.MESSAGE_COLLAPSE_MENU)); } diff --git a/app/src/main/java/com/stardust/scriptdroid/layout_inspector/LayoutInspector.java b/app/src/main/java/com/stardust/scriptdroid/layout_inspector/LayoutInspector.java index 46bd0c5f..dcb6af97 100644 --- a/app/src/main/java/com/stardust/scriptdroid/layout_inspector/LayoutInspector.java +++ b/app/src/main/java/com/stardust/scriptdroid/layout_inspector/LayoutInspector.java @@ -1,40 +1,51 @@ package com.stardust.scriptdroid.layout_inspector; import android.accessibilityservice.AccessibilityService; +import android.util.Log; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityNodeInfo; import com.stardust.scriptdroid.service.AccessibilityWatchDogService; import com.stardust.view.accessibility.AccessibilityDelegate; +import java.util.Set; +import java.util.concurrent.Executor; +import java.util.concurrent.Executors; + /** * Created by Stardust on 2017/3/10. */ -public class LayoutInspector implements AccessibilityDelegate { +public class LayoutInspector { - private NodeInfo mCapture; + private volatile NodeInfo mCapture; + private volatile boolean mDumping = false; + private Executor mExecutor = Executors.newSingleThreadExecutor(); - @Override - public boolean onAccessibilityEvent(AccessibilityService service, AccessibilityEvent event) { - return false; - } - - public NodeInfo captureCurrentWindow() { + public void captureCurrentWindow() { AccessibilityService service = AccessibilityWatchDogService.getInstance(); if (service == null) { mCapture = null; } else { - AccessibilityNodeInfo root = service.getRootInActiveWindow(); + final AccessibilityNodeInfo root = service.getRootInActiveWindow(); if (root == null) { mCapture = null; } else { - mCapture = NodeInfo.capture(root); + mExecutor.execute(new Runnable() { + @Override + public void run() { + mDumping = true; + mCapture = NodeInfo.capture(root); + mDumping = false; + } + }); } } - return mCapture; } + public boolean isDumping() { + return mDumping; + } public void clearCapture() { mCapture = null; diff --git a/app/src/main/java/com/stardust/scriptdroid/layout_inspector/view/LayoutHierarchyView.java b/app/src/main/java/com/stardust/scriptdroid/layout_inspector/view/LayoutHierarchyView.java index 343e68ff..ff80632a 100644 --- a/app/src/main/java/com/stardust/scriptdroid/layout_inspector/view/LayoutHierarchyView.java +++ b/app/src/main/java/com/stardust/scriptdroid/layout_inspector/view/LayoutHierarchyView.java @@ -81,7 +81,6 @@ public class LayoutHierarchyView extends MultiLevelListView { } - private void init() { mAdapter = new Adapter(); setAdapter(mAdapter); @@ -204,6 +203,8 @@ public class LayoutHierarchyView extends MultiLevelListView { } private String simplifyClassName(CharSequence className) { + if (className == null) + return null; String s = className.toString(); if (s.startsWith("android.widget.")) { s = s.substring(15); @@ -214,7 +215,6 @@ public class LayoutHierarchyView extends MultiLevelListView { private String getItemInfoDsc(ItemInfo itemInfo) { StringBuilder builder = new StringBuilder(); - builder.append(String.format(Locale.getDefault(), "level[%d], idx in level[%d/%d]", itemInfo.getLevel() + 1, /*Indexing starts from 0*/ itemInfo.getIdxInLevel() + 1 /*Indexing starts from 0*/, diff --git a/app/src/main/java/com/stardust/scriptdroid/layout_inspector/view/LayoutInspectView.java b/app/src/main/java/com/stardust/scriptdroid/layout_inspector/view/LayoutInspectView.java index 17f99ff5..32239b43 100644 --- a/app/src/main/java/com/stardust/scriptdroid/layout_inspector/view/LayoutInspectView.java +++ b/app/src/main/java/com/stardust/scriptdroid/layout_inspector/view/LayoutInspectView.java @@ -71,11 +71,6 @@ public class LayoutInspectView extends FrameLayout { } } - public void showLayoutBoundsView() { - mLayoutBoundsView.setRootNode(AutoJs.getInstance().getLayoutInspector().captureCurrentWindow()); - backToLayoutBoundsView(); - } - public boolean isLayoutBoundsViewShowing() { return mCurrentView == mLayoutBoundsView; } diff --git a/app/src/main/java/com/stardust/scriptdroid/record/accessibility/AccessibilityActionConverter.java b/app/src/main/java/com/stardust/scriptdroid/record/accessibility/AccessibilityActionConverter.java index 2e7fae3f..19351f17 100644 --- a/app/src/main/java/com/stardust/scriptdroid/record/accessibility/AccessibilityActionConverter.java +++ b/app/src/main/java/com/stardust/scriptdroid/record/accessibility/AccessibilityActionConverter.java @@ -6,6 +6,7 @@ import android.util.SparseArray; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityNodeInfo; +import com.stardust.automator.UiObject; import com.stardust.automator.simple_action.FilterAction; import com.stardust.scriptdroid.layout_inspector.NodeInfo; import com.stardust.util.SparseArrayEntries; @@ -123,24 +124,17 @@ public class AccessibilityActionConverter { if (source == null) return; AccessibilityNodeInfoAllocator allocator = new AccessibilityNodeInfoAllocator(); - List editableList = FilterAction.EditableFilter.findEditable(allocator, service.getRootInActiveWindow()); + UiObject uiObject = new UiObject(service.getRootInActiveWindow(), allocator); + List editableList = FilterAction.EditableFilter.findEditable(uiObject); int i = findInEditableList(editableList, source); - recycle(editableList); sb.append("while(!input(").append(i).append(", \"").append(source.getText()).append("\"));"); source.recycle(); allocator.recycleAll(); } - private void recycle(List list) { - for (AccessibilityNodeInfo nodeInfo : list) { - nodeInfo.recycle(); - } - } - - - private static int findInEditableList(List editableList, AccessibilityNodeInfo editable) { + private static int findInEditableList(List editableList, AccessibilityNodeInfo editable) { int i = 0; - for (AccessibilityNodeInfo nodeInfo : editableList) { + for (UiObject nodeInfo : editableList) { if (AccessibilityNodeInfoHelper.getBoundsInScreen(nodeInfo).equals(AccessibilityNodeInfoHelper.getBoundsInScreen(editable))) { return i; } diff --git a/app/src/main/java/com/stardust/scriptdroid/record/accessibility/AccessibilityActionRecorder.java b/app/src/main/java/com/stardust/scriptdroid/record/accessibility/AccessibilityActionRecorder.java index a92635f0..1fdb427b 100644 --- a/app/src/main/java/com/stardust/scriptdroid/record/accessibility/AccessibilityActionRecorder.java +++ b/app/src/main/java/com/stardust/scriptdroid/record/accessibility/AccessibilityActionRecorder.java @@ -7,6 +7,11 @@ import android.view.accessibility.AccessibilityNodeInfo; import com.stardust.scriptdroid.record.Recorder; import com.stardust.view.accessibility.AccessibilityDelegate; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + /** * Created by Stardust on 2017/2/14. @@ -27,6 +32,8 @@ public class AccessibilityActionRecorder extends Recorder.DefaultIMPL implements } } + private static final Set EVENT_TYPES = new HashSet<>(Arrays.asList(AccessibilityEvent.TYPE_VIEW_CLICKED, AccessibilityEvent.TYPE_VIEW_LONG_CLICKED, AccessibilityEvent.TYPE_VIEW_SCROLLED, AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED)); + private static final long RECORD_TIME_OUT = 10 * 60 * 1000; private boolean mShouldIgnoreFirstAction = false; @@ -64,6 +71,11 @@ public class AccessibilityActionRecorder extends Recorder.DefaultIMPL implements return false; } + @Override + public Set getEventTypes() { + return EVENT_TYPES; + } + private void checkTimeOut() { if (System.currentTimeMillis() - mRecordStartMillis > RECORD_TIME_OUT) { stop(); diff --git a/app/src/main/java/com/stardust/scriptdroid/service/AccessibilityWatchDogService.java b/app/src/main/java/com/stardust/scriptdroid/service/AccessibilityWatchDogService.java index 56ff1060..499c364e 100644 --- a/app/src/main/java/com/stardust/scriptdroid/service/AccessibilityWatchDogService.java +++ b/app/src/main/java/com/stardust/scriptdroid/service/AccessibilityWatchDogService.java @@ -1,6 +1,5 @@ package com.stardust.scriptdroid.service; -import android.accessibilityservice.AccessibilityService; import android.os.Build; import android.util.Log; import android.view.accessibility.AccessibilityEvent; @@ -10,12 +9,16 @@ import com.stardust.autojs.runtime.JavascriptInterface; import com.stardust.view.accessibility.AccessibilityDelegate; import com.stardust.scriptdroid.App; import com.stardust.scriptdroid.tool.AccessibilityServiceTool; +import com.stardust.view.accessibility.AccessibilityService; import com.stardust.view.accessibility.AccessibilityServiceUtils; import org.greenrobot.eventbus.EventBus; import java.lang.ref.WeakReference; +import java.util.HashSet; +import java.util.List; import java.util.Map; +import java.util.Set; import java.util.SortedMap; import java.util.TreeMap; import java.util.concurrent.Executor; @@ -32,10 +35,16 @@ public class AccessibilityWatchDogService extends AccessibilityService { private static final SortedMap mDelegates = new TreeMap<>(); private static final Object LOCK = new Object(); private static AccessibilityWatchDogService instance; - private Executor mExecutor = Executors.newSingleThreadExecutor(); + private static boolean containsAllEventTypes = false; + private static final Set eventTypes = new HashSet<>(); public static void addDelegate(int uniquePriority, AccessibilityDelegate delegate) { mDelegates.put(uniquePriority, delegate); + Set set = delegate.getEventTypes(); + if (set == null) + containsAllEventTypes = true; + else + eventTypes.addAll(set); } public static boolean isEnable() { @@ -49,25 +58,17 @@ public class AccessibilityWatchDogService extends AccessibilityService { @Override public void onAccessibilityEvent(final AccessibilityEvent event) { Log.v(TAG, "onAccessibilityEvent: " + event); - mExecutor.execute(new Runnable() { - @Override - public void run() { - for (Map.Entry entry : mDelegates.entrySet()) { - Log.v(TAG, "delegate: " + entry.getValue().getClass().getName()); - if (entry.getValue().onAccessibilityEvent(AccessibilityWatchDogService.this, event)) - break; - } - } - }); - } - - @Override - public AccessibilityNodeInfo getRootInActiveWindow() { - try { - return super.getRootInActiveWindow(); - } catch (IllegalStateException e) { - e.printStackTrace(); - return null; + if (!containsAllEventTypes && !eventTypes.contains(event.getEventType())) + return; + for (Map.Entry entry : mDelegates.entrySet()) { + AccessibilityDelegate delegate = entry.getValue(); + Set types = delegate.getEventTypes(); + if (types != null && !delegate.getEventTypes().contains(event.getEventType())) + continue; + long start = System.currentTimeMillis(); + if (delegate.onAccessibilityEvent(AccessibilityWatchDogService.this, event)) + break; + Log.v(TAG, "millis: " + (System.currentTimeMillis() - start) + " delegate: " + entry.getValue().getClass().getName()); } } diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/BaseActivity.java b/app/src/main/java/com/stardust/scriptdroid/ui/BaseActivity.java index eba39324..a416c5ce 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/BaseActivity.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/BaseActivity.java @@ -14,6 +14,7 @@ import android.view.View; import com.afollestad.materialdialogs.DialogAction; import com.afollestad.materialdialogs.MaterialDialog; +import com.flurry.android.FlurryAgent; import com.stardust.pio.PFile; import com.stardust.scriptdroid.App; import com.stardust.scriptdroid.R; @@ -59,7 +60,6 @@ public abstract class BaseActivity extends AppCompatActivity { } - @Override protected void onPause() { super.onPause(); diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/console/TimberConsole.java b/app/src/main/java/com/stardust/scriptdroid/ui/console/TimberConsole.java index f232e355..c501d703 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/console/TimberConsole.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/console/TimberConsole.java @@ -2,14 +2,15 @@ package com.stardust.scriptdroid.ui.console; import android.content.Intent; import android.graphics.Color; -import android.support.annotation.Nullable; +import android.text.Spannable; import android.text.SpannableString; -import android.text.Spanned; +import android.text.SpannableStringBuilder; import android.text.style.ForegroundColorSpan; import android.util.Log; +import com.jraska.console.Console; import com.jraska.console.timber.ConsoleTree; -import com.stardust.autojs.runtime.api.Console; +import com.stardust.autojs.runtime.AbstractConsole; import com.stardust.scriptdroid.App; @@ -19,7 +20,7 @@ import timber.log.Timber; * Created by Stardust on 2017/4/2. */ -public class TimberConsole implements Console { +public class TimberConsole extends AbstractConsole { static { Timber.plant(new ConsoleTree.Builder() @@ -34,54 +35,29 @@ public class TimberConsole implements Console { } @Override - public void i(@Nullable Object o) { - i(o + ""); - } - - @Override - public void i(String str) { - Timber.i(str); - } - - @Override - public void e(@Nullable String message) { - Timber.e(message); - } - - @Override - public void e(@Nullable Object o) { - e(o + ""); - } - - @Override - public void v(@Nullable String v) { - Timber.v(v); - } - - @Override - public void v(@Nullable Object o) { - v(o + ""); - } - - @Override - public void log(@Nullable Object o) { - log(o + ""); - } - - @Override - public void log(String str) { - SpannableString spannableString = new SpannableString(str); - spannableString.setSpan(new ForegroundColorSpan(Color.BLACK), 0, str.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); - com.jraska.console.Console.writeLine(spannableString); - } - - @Override - public void show() { - App.getApp().startActivity(new Intent(App.getApp(), ConsoleActivity.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); + protected void log(int level, CharSequence charSequence) { + if (level == Log.DEBUG) { + SpannableString spannable = new SpannableString(charSequence); + spannable.setSpan(new ForegroundColorSpan(0xdd000000), 0, charSequence.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + Console.writeLine(spannable); + } else { + Timber.log(level, charSequence.toString()); + } } @Override public void clear() { com.jraska.console.Console.clear(); } + + @Override + public void show() { + App.getApp().startActivity(new Intent(App.getApp(), ConsoleActivity.class) + .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); + } + + @Override + public void hide() { + throw new UnsupportedOperationException(); + } } diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/edit/completion/CodeCompletion.java b/app/src/main/java/com/stardust/scriptdroid/ui/edit/completion/CodeCompletion.java index fdd1197c..dc0ac7c2 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/edit/completion/CodeCompletion.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/edit/completion/CodeCompletion.java @@ -106,7 +106,7 @@ public class CodeCompletion implements TextWatcher { mFunctions = functions; } - private String[] mFunctions = {"toast", "launchPackage", "launch", "launchApp", "click", "longClick", "scrollUp", "scrollDown", "select", "focus", "paste", "input", "sleep", "isStopped", "notStopped", "log", "err", "openConsole", "clearConsole", "shell", "getTexts", "getPackageName", "getActivityName", "setClip", "addAccessibilityDelegate"}; + private String[] mFunctions = {"toast", "launchPackage", "launch", "launchApp", "click", "longClick", "scrollUp", "scrollDown", "select", "focus", "paste", "input", "sleep", "isStopped", "notStopped", "println", "err", "openConsole", "clearConsole", "shell", "getTexts", "getPackageName", "getActivityName", "setClip", "addAccessibilityDelegate"}; private boolean searchCodeCompletion(String str) { Collection c = searchWordCompletion(str); diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/main/operation/ScriptFileOperation.java b/app/src/main/java/com/stardust/scriptdroid/ui/main/operation/ScriptFileOperation.java index 47953887..d3b0b9a5 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/main/operation/ScriptFileOperation.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/main/operation/ScriptFileOperation.java @@ -34,7 +34,7 @@ public abstract class ScriptFileOperation { @Override public void onStart(JavaScriptEngine engine, ScriptSource source) { - AutoJs.getInstance().getScriptEngineService().getDefaultListener().onStart(engine, source); + AutoJs.getInstance().getScriptEngineService().getDefaultScriptExecutionListener().onStart(engine, source); } @Override diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/main/task/TaskListRecyclerView.java b/app/src/main/java/com/stardust/scriptdroid/ui/main/task/TaskListRecyclerView.java index 3f18849d..896ddedd 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/main/task/TaskListRecyclerView.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/main/task/TaskListRecyclerView.java @@ -18,6 +18,7 @@ import com.stardust.autojs.engine.JavaScriptEngine; import com.stardust.autojs.engine.JavaScriptEngineManager; import com.stardust.autojs.script.ScriptSource; import com.stardust.scriptdroid.R; +import com.stardust.scriptdroid.autojs.AutoJs; import com.yqritc.recyclerviewflexibledivider.HorizontalDividerItemDecoration; import java.util.ArrayList; @@ -46,8 +47,10 @@ public class TaskListRecyclerView extends ThemeColorRecyclerView implements Java } }; + private final List mScriptEngines = new ArrayList<>(); private Adapter mAdapter; + private final ScriptEngineService mScriptEngineService = AutoJs.getInstance().getScriptEngineService(); public TaskListRecyclerView(Context context) { super(context); @@ -78,14 +81,14 @@ public class TaskListRecyclerView extends ThemeColorRecyclerView implements Java public void updateEngineList() { mScriptEngines.clear(); - mScriptEngines.addAll(ScriptEngineService.getInstance().getEngines()); + mScriptEngines.addAll(mScriptEngineService.getEngines()); mAdapter.notifyDataSetChanged(); } @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); - ScriptEngineService.getInstance().registerEngineLifecycleCallback(this); + mScriptEngineService.registerEngineLifecycleCallback(this); } @Override @@ -97,7 +100,7 @@ public class TaskListRecyclerView extends ThemeColorRecyclerView implements Java @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); - ScriptEngineService.getInstance().unregisterEngineLifecycleCallback(this); + mScriptEngineService.unregisterEngineLifecycleCallback(this); } @Override diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/main/task/TaskManagerFragment.java b/app/src/main/java/com/stardust/scriptdroid/ui/main/task/TaskManagerFragment.java index 68b99fa3..85ca2aad 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/main/task/TaskManagerFragment.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/main/task/TaskManagerFragment.java @@ -11,6 +11,7 @@ import android.view.ViewGroup; import com.stardust.app.Fragment; import com.stardust.autojs.ScriptEngineService; import com.stardust.scriptdroid.R; +import com.stardust.scriptdroid.autojs.AutoJs; import com.stardust.view.ViewBinder; import com.stardust.view.ViewBinding; import com.stardust.widget.SimpleAdapterDataObserver; @@ -74,6 +75,6 @@ public class TaskManagerFragment extends Fragment { @ViewBinding.Click(R.id.close_all) private void closeAllRunningScripts() { - ScriptEngineService.getInstance().stopAll(); + AutoJs.getInstance().getScriptEngineService().stopAll(); } } diff --git a/app/src/main/res/values-en/strings.xml b/app/src/main/res/values-en/strings.xml index 29ec5ef5..566a771b 100644 --- a/app/src/main/res/values-en/strings.xml +++ b/app/src/main/res/values-en/strings.xml @@ -184,5 +184,6 @@ Check for updates New Directory 已重置 + 布局分析中,请稍后点击 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 46004038..94ca246c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -215,6 +215,7 @@ 在本软件界面无法运行自动操作命令以免误触 key_guard_mode 控制台悬浮窗 + 布局分析中,请稍后点击 diff --git a/autojs/src/main/java/com/stardust/autojs/RunnableScriptExecution.java b/autojs/src/main/java/com/stardust/autojs/RunnableScriptExecution.java new file mode 100644 index 00000000..03f2dd09 --- /dev/null +++ b/autojs/src/main/java/com/stardust/autojs/RunnableScriptExecution.java @@ -0,0 +1,37 @@ +package com.stardust.autojs; + +import com.stardust.autojs.engine.JavaScriptEngine; +import com.stardust.autojs.runtime.ScriptRuntime; + +/** + * Created by Stardust on 2017/5/1. + */ + +public class RunnableScriptExecution extends ScriptExecution.AbstarctScriptExecution implements ScriptExecution, Runnable { + + private JavaScriptEngine mJavaScriptEngine; + private ScriptRuntime mScriptRuntime; + private ScriptEngineService mScriptEngineService; + + public RunnableScriptExecution(ScriptEngineService service, ScriptExecutionTask task) { + super(task); + mScriptEngineService = service; + } + + @Override + public void run() { + mJavaScriptEngine = mScriptEngineService.createScriptEngine(); + mScriptRuntime = mScriptEngineService.createScriptRuntime(); + mScriptExecutionTask.execute(mScriptRuntime, mJavaScriptEngine); + } + + @Override + public JavaScriptEngine getEngine() { + return mJavaScriptEngine; + } + + @Override + public ScriptRuntime getRuntime() { + return mScriptRuntime; + } +} \ No newline at end of file diff --git a/autojs/src/main/java/com/stardust/autojs/ScriptEngineService.java b/autojs/src/main/java/com/stardust/autojs/ScriptEngineService.java index 92e8563b..c7cf3dee 100644 --- a/autojs/src/main/java/com/stardust/autojs/ScriptEngineService.java +++ b/autojs/src/main/java/com/stardust/autojs/ScriptEngineService.java @@ -11,6 +11,7 @@ import com.stardust.autojs.runtime.ScriptRuntime; import com.stardust.autojs.runtime.api.Console; import com.stardust.autojs.script.ScriptSource; import com.stardust.lang.ThreadCompat; +import com.stardust.util.Supplier; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; @@ -20,6 +21,7 @@ import java.util.Arrays; import java.util.Date; import java.util.LinkedHashSet; import java.util.Set; +import java.util.concurrent.CopyOnWriteArraySet; /** * Created by Stardust on 2017/1/23. @@ -29,16 +31,6 @@ public class ScriptEngineService { private static final String LOG_TAG = "ScriptEngineService"; private static final EventBus EVENT_BUS = new EventBus(); - private static ScriptEngineService instance; - - public static ScriptEngineService getInstance() { - return instance; - } - - public static void setInstance(ScriptEngineService service) { - instance = service; - } - private static final ScriptExecutionListener DEFAULT_LISTENER = new SimpleScriptExecutionListener() { @Override public void onStart(JavaScriptEngine engine, ScriptSource source) { @@ -54,31 +46,34 @@ public class ScriptEngineService { }; - private final ScriptRuntime mRuntime; + private final Supplier mRuntimeSupplier; private final Context mContext; - private final Console mConsole; + private ScriptRuntime mGlobalScriptRuntime; + private final Console mGlobalConsole; private final JavaScriptEngineManager mJavaScriptEngineManager; private final EngineLifecycleObserver mEngineLifecycleObserver = new EngineLifecycleObserver(); + private ScriptExecutionListener mDefaultScriptExecutionListener = DEFAULT_LISTENER; ScriptEngineService(ScriptEngineServiceBuilder builder) { - mRuntime = builder.mRuntime; + mRuntimeSupplier = builder.mRuntimeSupplier; mContext = builder.mContext; mJavaScriptEngineManager = builder.mJavaScriptEngineManager; - mConsole = builder.mConsole; + mGlobalScriptRuntime = mRuntimeSupplier.get(); + mGlobalConsole = mGlobalScriptRuntime.console; mJavaScriptEngineManager.setEngineLifecycleCallback(mEngineLifecycleObserver); EVENT_BUS.register(this); } - public ScriptRuntime getRuntime() { - return mRuntime; + public Console getGlobalConsole() { + return mGlobalConsole; } - public Console getConsole() { - return mConsole; + public ScriptExecutionListener getDefaultScriptExecutionListener() { + return mDefaultScriptExecutionListener; } - public ScriptExecutionListener getDefaultListener() { - return DEFAULT_LISTENER; + public void setDefaultScriptExecutionListener(ScriptExecutionListener defaultScriptExecutionListener) { + mDefaultScriptExecutionListener = defaultScriptExecutionListener; } public JavaScriptEngine createScriptEngine() { @@ -87,6 +82,10 @@ public class ScriptEngineService { return engine; } + public ScriptRuntime createScriptRuntime() { + return mRuntimeSupplier.get(); + } + public void registerEngineLifecycleCallback(JavaScriptEngineManager.EngineLifecycleCallback engineLifecycleCallback) { mEngineLifecycleObserver.registerCallback(engineLifecycleCallback); } @@ -96,18 +95,15 @@ public class ScriptEngineService { } public static boolean causedByInterrupted(Throwable e) { - return e.getCause() instanceof ScriptInterrupptedException; + return e instanceof ScriptInterrupptedException || e.getCause() instanceof ScriptInterrupptedException; } public ScriptExecution execute(ScriptExecutionTask task) { - ScriptExecutionListener listener = task.getExecutionListenerOrDefault(DEFAULT_LISTENER); - ScriptSource source = task.getSource(); - int mode = source.getExecutionMode(); - if ((mode & ScriptSource.EXECUTION_MODE_UI) != 0) { - ScriptExecuteActivity.execute(mContext, task); - return null; + task.setDefaultListenerIfNeeded(mDefaultScriptExecutionListener); + if (isUiMode(task)) { + return ScriptExecuteActivity.execute(mContext, this, task); } else { - RunnableScriptExecution scriptExecution = new RunnableScriptExecution(source, listener, task.getConfig()); + RunnableScriptExecution scriptExecution = new RunnableScriptExecution(this, task); if (task.getConfig().runInNewThread) { new ThreadCompat(scriptExecution).start(); } else { @@ -117,6 +113,12 @@ public class ScriptEngineService { } } + private boolean isUiMode(ScriptExecutionTask task) { + ScriptSource source = task.getSource(); + int mode = source.getExecutionMode(); + return (mode & ScriptSource.EXECUTION_MODE_UI) != 0; + } + public ScriptExecution execute(ScriptSource source, ScriptExecutionListener listener, ExecutionConfig config) { return execute(new ScriptExecutionTask(source, listener, config)); } @@ -126,16 +128,16 @@ public class ScriptEngineService { } public ScriptExecution execute(ScriptSource source) { - return execute(source, DEFAULT_LISTENER, ExecutionConfig.getDefault()); + return execute(source, mDefaultScriptExecutionListener, ExecutionConfig.getDefault()); } @Subscribe public void onScriptExecution(ScriptExecutionEvent event) { if (event.getCode() == ScriptExecutionEvent.ON_START) { - mConsole.v(DateFormat.getTimeInstance().format(new Date()) + " " + mContext.getString(R.string.text_start_running) + " " + event.getMessage()); + mGlobalConsole.verbose(DateFormat.getTimeInstance().format(new Date()) + " " + mContext.getString(R.string.text_start_running) + " " + event.getMessage()); } else if (event.getCode() == ScriptExecutionEvent.ON_EXCEPTION) { - mRuntime.toast(mContext.getString(R.string.text_error) + ": " + event.getMessage()); - mConsole.e(event.getMessage()); + mGlobalScriptRuntime.toast(mContext.getString(R.string.text_error) + ": " + event.getMessage()); + mGlobalConsole.error(event.getMessage()); } } @@ -147,9 +149,9 @@ public class ScriptEngineService { public void stopAllAndToast() { int n = stopAll(); if (n > 0) - mRuntime.toast(String.format(mContext.getString(R.string.text_already_stop_n_scripts), n)); + mGlobalScriptRuntime.toast(String.format(mContext.getString(R.string.text_already_stop_n_scripts), n)); else - mRuntime.toast(mContext.getString(R.string.text_no_running_script)); + mGlobalScriptRuntime.toast(mContext.getString(R.string.text_no_running_script)); } public String[] getGlobalFunctions() { @@ -160,31 +162,6 @@ public class ScriptEngineService { return mJavaScriptEngineManager.getEngines(); } - private class RunnableScriptExecution extends ScriptExecutionTask implements ScriptExecution, Runnable { - - private JavaScriptEngine mJavaScriptEngine; - - RunnableScriptExecution(ScriptSource source, ScriptExecutionListener listener, ExecutionConfig config) { - super(source, listener, config); - } - - @Override - public void run() { - mJavaScriptEngine = createScriptEngine(); - execute(mRuntime, mJavaScriptEngine); - } - - @Override - public JavaScriptEngine getEngine() { - return mJavaScriptEngine; - } - - @Override - public ScriptRuntime getRuntime() { - return mRuntime; - } - } - private static class EngineLifecycleObserver implements JavaScriptEngineManager.EngineLifecycleCallback { private final Set mEngineLifecycleCallbacks = new LinkedHashSet<>(); @@ -211,6 +188,7 @@ public class ScriptEngineService { synchronized (mEngineLifecycleCallbacks) { mEngineLifecycleCallbacks.add(callback); } + } void unregisterCallback(JavaScriptEngineManager.EngineLifecycleCallback callback) { diff --git a/autojs/src/main/java/com/stardust/autojs/ScriptEngineServiceBuilder.java b/autojs/src/main/java/com/stardust/autojs/ScriptEngineServiceBuilder.java index 446ac67f..12632ae2 100644 --- a/autojs/src/main/java/com/stardust/autojs/ScriptEngineServiceBuilder.java +++ b/autojs/src/main/java/com/stardust/autojs/ScriptEngineServiceBuilder.java @@ -5,6 +5,7 @@ import android.content.Context; import com.stardust.autojs.engine.JavaScriptEngineManager; import com.stardust.autojs.runtime.ScriptRuntime; import com.stardust.autojs.runtime.api.Console; +import com.stardust.util.Supplier; /** * Created by Stardust on 2017/4/2. @@ -12,17 +13,16 @@ import com.stardust.autojs.runtime.api.Console; public class ScriptEngineServiceBuilder { - ScriptRuntime mRuntime; + Supplier mRuntimeSupplier; Context mContext; - Console mConsole; JavaScriptEngineManager mJavaScriptEngineManager; public ScriptEngineServiceBuilder() { } - public ScriptEngineServiceBuilder runtime(ScriptRuntime runtime) { - mRuntime = runtime; + public ScriptEngineServiceBuilder runtime(Supplier runtimeSupplier) { + mRuntimeSupplier = runtimeSupplier; return this; } @@ -31,11 +31,6 @@ public class ScriptEngineServiceBuilder { return this; } - public ScriptEngineServiceBuilder console(Console console) { - mConsole = console; - return this; - } - public ScriptEngineServiceBuilder engineManger(JavaScriptEngineManager manager) { mJavaScriptEngineManager = manager; return this; diff --git a/autojs/src/main/java/com/stardust/autojs/ScriptExecution.java b/autojs/src/main/java/com/stardust/autojs/ScriptExecution.java index fd983ef0..9a5da044 100644 --- a/autojs/src/main/java/com/stardust/autojs/ScriptExecution.java +++ b/autojs/src/main/java/com/stardust/autojs/ScriptExecution.java @@ -19,4 +19,34 @@ public interface ScriptExecution { ScriptExecutionListener getListener(); ExecutionConfig getConfig(); + + abstract class AbstarctScriptExecution implements ScriptExecution { + + protected ScriptExecutionTask mScriptExecutionTask; + + public AbstarctScriptExecution(ScriptExecutionTask task) { + mScriptExecutionTask = task; + } + + @Override + public abstract JavaScriptEngine getEngine(); + + @Override + public abstract ScriptRuntime getRuntime(); + + @Override + public ScriptSource getSource() { + return mScriptExecutionTask.getSource(); + } + + @Override + public ScriptExecutionListener getListener() { + return mScriptExecutionTask.getListener(); + } + + @Override + public ExecutionConfig getConfig() { + return mScriptExecutionTask.getConfig(); + } + } } diff --git a/autojs/src/main/java/com/stardust/autojs/ScriptExecutionTask.java b/autojs/src/main/java/com/stardust/autojs/ScriptExecutionTask.java index 708ae267..6c6f5994 100644 --- a/autojs/src/main/java/com/stardust/autojs/ScriptExecutionTask.java +++ b/autojs/src/main/java/com/stardust/autojs/ScriptExecutionTask.java @@ -38,14 +38,12 @@ public class ScriptExecutionTask implements Serializable { return mExecutionConfig; } + + public void execute(ScriptRuntime runtime, JavaScriptEngine engine) { try { - if ((mScriptSource.getExecutionMode() & ScriptSource.EXECUTION_MODE_AUTO) != 0) { - runtime.ensureAccessibilityServiceEnabled(); - } - mExecutionListener.onStart(engine, mScriptSource); - engine.setTag("script", mScriptSource); - mExecutionListener.onSuccess(engine, mScriptSource, engine.execute(mScriptSource)); + prepare(runtime, engine); + doExecution(engine); } catch (Exception e) { e.printStackTrace(); mExecutionListener.onException(engine, mScriptSource, e); @@ -55,9 +53,29 @@ public class ScriptExecutionTask implements Serializable { } } + private void prepare(ScriptRuntime runtime, JavaScriptEngine engine) { + if ((mScriptSource.getExecutionMode() & ScriptSource.EXECUTION_MODE_AUTO) != 0) { + runtime.ensureAccessibilityServiceEnabled(); + } + engine.put("__runtime__", runtime); + engine.init(); + } + + private void doExecution(JavaScriptEngine engine) { + engine.setTag("script", mScriptSource); + mExecutionListener.onStart(engine, mScriptSource); + mExecutionListener.onSuccess(engine, mScriptSource, engine.execute(mScriptSource)); + } + public ScriptExecutionListener getExecutionListenerOrDefault(ScriptExecutionListener defaultListener) { if (mExecutionListener == null) return defaultListener; return mExecutionListener; } + + public void setDefaultListenerIfNeeded(ScriptExecutionListener defaultScriptExecutionListener) { + if (mExecutionListener == null) { + mExecutionListener = defaultScriptExecutionListener; + } + } } diff --git a/autojs/src/main/java/com/stardust/autojs/engine/JavaScriptEngineManager.java b/autojs/src/main/java/com/stardust/autojs/engine/JavaScriptEngineManager.java index 3ddc6ade..b8f91a85 100644 --- a/autojs/src/main/java/com/stardust/autojs/engine/JavaScriptEngineManager.java +++ b/autojs/src/main/java/com/stardust/autojs/engine/JavaScriptEngineManager.java @@ -43,7 +43,6 @@ public abstract class JavaScriptEngineManager { public JavaScriptEngine createEngine() { JavaScriptEngine engine = createEngineInner(); putProperties(engine); - engine.init(); addEngine(engine); return engine; } diff --git a/autojs/src/main/java/com/stardust/autojs/engine/NodeJsJavaScriptEngineManager.java b/autojs/src/main/java/com/stardust/autojs/engine/NodeJsJavaScriptEngineManager.java index 1ad17de7..8eb1e46d 100644 --- a/autojs/src/main/java/com/stardust/autojs/engine/NodeJsJavaScriptEngineManager.java +++ b/autojs/src/main/java/com/stardust/autojs/engine/NodeJsJavaScriptEngineManager.java @@ -11,12 +11,12 @@ import com.stardust.autojs.runtime.ScriptRuntime; public class NodeJsJavaScriptEngineManager extends RhinoJavaScriptEngineManager { - public NodeJsJavaScriptEngineManager(Context context, ScriptRuntime runtime) { - super(context, runtime); + public NodeJsJavaScriptEngineManager(Context context) { + super(context); } @Override - public NodeJsJavaScriptEngine createEngineInner() { + protected NodeJsJavaScriptEngine createEngineInner() { NodeJsJavaScriptEngine engine = new NodeJsJavaScriptEngine(this); initRequireBuilder(engine.getContext(), engine.getScriptable()); return engine; diff --git a/autojs/src/main/java/com/stardust/autojs/engine/RhinoJavaScriptEngine.java b/autojs/src/main/java/com/stardust/autojs/engine/RhinoJavaScriptEngine.java index 5eced342..5605326e 100644 --- a/autojs/src/main/java/com/stardust/autojs/engine/RhinoJavaScriptEngine.java +++ b/autojs/src/main/java/com/stardust/autojs/engine/RhinoJavaScriptEngine.java @@ -43,7 +43,6 @@ public class RhinoJavaScriptEngine implements JavaScriptEngine { mThread = Thread.currentThread(); mContext = createContext(); mScriptable = createScope(mContext); - setTag("create-traces", Arrays.toString(Thread.currentThread().getStackTrace())); } @Override @@ -53,8 +52,6 @@ public class RhinoJavaScriptEngine implements JavaScriptEngine { @Override public Object execute(ScriptSource source) { - setTag("execute-traces", Arrays.toString(Thread.currentThread().getStackTrace())); - setTag("execute-source", source); return mContext.evaluateString(mScriptable, source.getScript(), "