Added Script file chooser. Fixed the issue that background image setting not working

This commit is contained in:
hyb1996
2017-04-03 16:28:07 +08:00
parent bfabef6a0e
commit 59811a4a5d
53 changed files with 1465 additions and 530 deletions

View File

@@ -81,11 +81,11 @@ var shell = function(cmd, root){
}
var currentPackage = function(){
return __runtime__.automator.currentPackage();
return __runtime__.info.getLatestPackage();
}
var currentActivity = function(){
return __runtime__.automator.currentActivity();
return __runtime__.info.getLatestActivity();
}
var __this__ = this;

View File

@@ -38,13 +38,18 @@ public class RhinoJavaScriptEngine implements JavaScriptEngine {
@Override
public Object execute(ScriptSource source) {
return mContext.evaluateString(mScriptable, source.getScript(), "<script>", 1, null);
try {
return mContext.evaluateString(mScriptable, source.getScript(), "<script>", 1, null);
} catch (Exception e) {
stop();
throw e;
}
}
@Override
public void stop() {
stopNotRemoveFromManager();
mEngineManager.removeEngine(this);
stopNotRemoveFromManager();
}
@Override

View File

@@ -0,0 +1,14 @@
package com.stardust.autojs.runtime;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* Created by Stardust on 2017/4/3.
*/
@Retention(RetentionPolicy.SOURCE)
@Target(ElementType.TYPE)
public @interface JavascriptClass {
}

View File

@@ -1,18 +1,20 @@
package com.stardust.autojs.runtime;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.os.Build;
import android.os.Handler;
import android.widget.Toast;
import com.stardust.autojs.R;
import com.stardust.autojs.runtime.action.ActionAutomator;
import com.stardust.autojs.runtime.api.AppUtils;
import com.stardust.autojs.runtime.api.Console;
import com.stardust.autojs.runtime.api.UiSelector;
import com.stardust.util.ClipboardUtil;
import com.stardust.util.SdkVersionUtil;
import com.stardust.util.Shell;
import com.stardust.view.accessibility.AccessibilityInfoProvider;
;
/**
* Created by Stardust on 2017/1/27.
@@ -35,11 +37,15 @@ public class ScriptRuntime {
@JavascriptField
public ActionAutomator automator;
@JavascriptField
public AccessibilityInfoProvider info;
public ScriptRuntime(Context context, Console console, AccessibilityBridge accessibilityBridge) {
mContext = context;
mAccessibilityBridge = accessibilityBridge;
mUIHandler = new Handler(mContext.getMainLooper());
app = new AppUtils(context);
info = accessibilityBridge.getInfoProvider();
this.console = console;
automator = new ActionAutomator(accessibilityBridge, this);
}
@@ -68,7 +74,7 @@ public class ScriptRuntime {
mUIHandler.post(new Runnable() {
@Override
public void run() {
((ClipboardManager) mContext.getSystemService(Context.CLIPBOARD_SERVICE)).setPrimaryClip(ClipData.newPlainText(TAG, text));
ClipboardUtil.setClip(mContext, text);
}
});
}
@@ -88,6 +94,13 @@ public class ScriptRuntime {
return Thread.currentThread().isInterrupted();
}
@JavascriptInterface
public void requiresApi(int i) {
if (Build.VERSION.SDK_INT < i) {
throw new ScriptStopException(mContext.getString(R.string.text_requires_sdk_version_to_run_the_script) + SdkVersionUtil.sdkIntToString(i));
}
}
@JavascriptInterface
public void stop() {
Thread.interrupted();

View File

@@ -8,8 +8,8 @@ import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
import com.stardust.autojs.runtime.AccessibilityBridge;
import com.stardust.autojs.runtime.JavascriptInterface;
import com.stardust.autojs.runtime.ScriptRuntime;
import com.stardust.autojs.runtime.ScriptStopException;
import com.stardust.automator.AccessibilityEventCommandHost;
/**
@@ -41,169 +41,122 @@ public class ActionAutomator {
mScriptRuntime = scriptRuntime;
}
@JavascriptInterface
public ActionTarget text(String text, int i) {
return new ActionTarget.TextActionTarget(text, i);
}
@JavascriptInterface
public ActionTarget bounds(int left, int top, int right, int bottom) {
return new ActionTarget.BoundsActionTarget(new Rect(left, top, right, bottom));
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@JavascriptInterface
public ActionTarget editable(int i) {
mScriptRuntime.requiresApi(Build.VERSION_CODES.LOLLIPOP);
return new ActionTarget.EditableActionTarget(i);
}
@JavascriptInterface
public ActionTarget id(String id) {
return new ActionTarget.IdActionTarget(id);
}
@JavascriptInterface
public boolean click(ActionTarget target) {
return performAction(target.createAction(AccessibilityNodeInfo.ACTION_CLICK));
}
@JavascriptInterface
public boolean longClick(ActionTarget target) {
return performAction(target.createAction(AccessibilityNodeInfo.ACTION_LONG_CLICK));
}
@JavascriptInterface
public boolean scrollUp(ActionTarget target) {
return performAction(target.createAction(AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD));
}
@JavascriptInterface
public boolean scrollDown(ActionTarget target) {
return performAction(target.createAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD));
}
@JavascriptInterface
public boolean scrollUp(int i) {
return performAction(ActionFactory.createScrollAction(AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD, i));
}
@JavascriptInterface
public boolean scrollDown(int i) {
return performAction(ActionFactory.createScrollAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD, i));
}
@JavascriptInterface
public boolean scrollAllUp() {
return performAction(ActionFactory.createScrollMaxAction(AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD));
}
@JavascriptInterface
public boolean scrollAllDown() {
return performAction(ActionFactory.createScrollMaxAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD));
}
@JavascriptInterface
public boolean focus(ActionTarget target) {
return performAction(target.createAction(AccessibilityNodeInfo.ACTION_FOCUS));
}
@JavascriptInterface
public boolean select(ActionTarget target) {
return performAction(target.createAction(AccessibilityNodeInfo.ACTION_SELECT));
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public boolean setText(ActionTarget target, String text) {
ensureApi(Build.VERSION_CODES.LOLLIPOP);
mScriptRuntime.requiresApi(Build.VERSION_CODES.LOLLIPOP);
return performAction(target.createAction(AccessibilityNodeInfo.ACTION_SET_TEXT, text));
}
@JavascriptInterface
public boolean back() {
return performGlobalAction(AccessibilityService.GLOBAL_ACTION_BACK);
}
@JavascriptInterface
public boolean home() {
return performGlobalAction(AccessibilityService.GLOBAL_ACTION_HOME);
}
@JavascriptInterface
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public boolean powerDialog() {
ensureApi(Build.VERSION_CODES.LOLLIPOP);
mScriptRuntime.requiresApi(Build.VERSION_CODES.LOLLIPOP);
return performGlobalAction(AccessibilityService.GLOBAL_ACTION_POWER_DIALOG);
}
private void ensureApi(int i) {
if (Build.VERSION.SDK_INT < i) {
throw new ScriptStopException();
}
}
@JavascriptInterface
public boolean notifications() {
return performGlobalAction(AccessibilityService.GLOBAL_ACTION_NOTIFICATIONS);
}
@JavascriptInterface
public boolean quickSettings() {
return performGlobalAction(AccessibilityService.GLOBAL_ACTION_QUICK_SETTINGS);
}
@JavascriptInterface
public boolean recents() {
return performGlobalAction(AccessibilityService.GLOBAL_ACTION_RECENTS);
}
@JavascriptInterface
@RequiresApi(api = Build.VERSION_CODES.N)
public boolean splitScreen() {
return performGlobalAction(AccessibilityService.GLOBAL_ACTION_TOGGLE_SPLIT_SCREEN);
}
public boolean swipeDown() {
return performGlobalAction(AccessibilityService.GESTURE_SWIPE_DOWN);
}
public boolean swipeDownLeft() {
return performGlobalAction(AccessibilityService.GESTURE_SWIPE_DOWN_AND_LEFT);
}
public boolean swipeDownRight() {
return performGlobalAction(AccessibilityService.GESTURE_SWIPE_DOWN_AND_RIGHT);
}
public boolean swipeDownUp() {
return performGlobalAction(AccessibilityService.GESTURE_SWIPE_DOWN_AND_UP);
}
public boolean swipeUp() {
return performGlobalAction(AccessibilityService.GESTURE_SWIPE_UP);
}
public boolean swipeUpLeft() {
return performGlobalAction(AccessibilityService.GESTURE_SWIPE_UP_AND_LEFT);
}
public boolean swipeUpRight() {
return performGlobalAction(AccessibilityService.GESTURE_SWIPE_UP_AND_RIGHT);
}
public boolean swipeUpDown() {
return performGlobalAction(AccessibilityService.GESTURE_SWIPE_UP_AND_DOWN);
}
public boolean swipeLeft() {
return performGlobalAction(AccessibilityService.GESTURE_SWIPE_LEFT);
}
public boolean swipeLeftRight() {
return performGlobalAction(AccessibilityService.GESTURE_SWIPE_LEFT_AND_RIGHT);
}
public boolean swipeLeftUp() {
return performGlobalAction(AccessibilityService.GESTURE_SWIPE_LEFT_AND_UP);
}
public boolean swipeLeftDown() {
return performGlobalAction(AccessibilityService.GESTURE_SWIPE_LEFT_AND_DOWN);
}
public boolean swipeRight() {
return performGlobalAction(AccessibilityService.GESTURE_SWIPE_RIGHT);
}
public boolean swipeRightLeft() {
return performGlobalAction(AccessibilityService.GESTURE_SWIPE_RIGHT_AND_LEFT);
}
public boolean swipeRightUp() {
return performGlobalAction(AccessibilityService.GESTURE_SWIPE_RIGHT_AND_UP);
}
public boolean swipeRightDown() {
return performGlobalAction(AccessibilityService.GESTURE_SWIPE_RIGHT_AND_DOWN);
}
private boolean performGlobalAction(final int action) {
ensureAccessibilityServiceEnabled();
PerformGlobalActionCommand command = new PerformGlobalActionCommand(action);
@@ -211,25 +164,16 @@ public class ActionAutomator {
return command.result;
}
@JavascriptInterface
public boolean paste(ActionTarget target) {
return performAction(target.createAction(AccessibilityNodeInfo.ACTION_PASTE));
}
public String currentPackage() {
ensureAccessibilityServiceEnabled();
return mAccessibilityBridge.getInfoProvider().getLatestPackage();
}
private void ensureAccessibilityServiceEnabled() {
mAccessibilityBridge.ensureServiceEnabled();
}
public String currentActivity() {
ensureAccessibilityServiceEnabled();
return mAccessibilityBridge.getInfoProvider().getLatestActivity();
}
@SuppressWarnings("unchecked")
private <T> T performAction(Action action) {
ensureAccessibilityServiceEnabled();
mAccessibilityBridge.getActionPerformHost().addAction(action);

View File

@@ -1,7 +1,9 @@
package com.stardust.autojs.runtime.action;
import android.graphics.Rect;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.RequiresApi;
import android.view.accessibility.AccessibilityNodeInfo;
import com.stardust.util.MapEntries;
@@ -38,6 +40,7 @@ public class ActionFactory {
return new DepthFirstSearchTargetAction(action, new FilterAction.BoundsFilter(rect));
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public static Action createActionWithEditableFilter(int action, int index, final String text) {
return new SearchTargetAction(action, new FilterAction.EditableFilter(index)) {

View File

@@ -1,6 +1,8 @@
package com.stardust.autojs.runtime.action;
import android.graphics.Rect;
import android.os.Build;
import android.support.annotation.RequiresApi;
/**
* Created by Stardust on 2017/1/27.
@@ -40,6 +42,7 @@ public interface ActionTarget {
}
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
class EditableActionTarget implements ActionTarget {
private int mIndex;

View File

@@ -4,12 +4,15 @@ import android.content.Context;
import android.webkit.ValueCallback;
import android.webkit.WebView;
import com.stardust.autojs.runtime.JavascriptClass;
import com.stardust.autojs.runtime.JavascriptInterface;
import org.mozilla.javascript.Scriptable;
/**
* Created by Stardust on 2017/4/1.
*/
@JavascriptClass
public class InjectableWebView extends WebView {
private InjectableWebClient mInjectableWebClient;
@@ -24,10 +27,12 @@ public class InjectableWebView extends WebView {
setWebViewClient(mInjectableWebClient);
}
@JavascriptInterface
public void inject(String script, ValueCallback<String> callback) {
mInjectableWebClient.inject(script, callback);
}
@JavascriptInterface
public void inject(String script) {
mInjectableWebClient.inject(script);
}

View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">AutoJs</string>
<string name="text_error">Error: </string>
<string name="text_start_running">开始运行</string>
<string name="text_path_is_empty">路径为空</string>
<string name="text_file_not_exists">文件不存在</string>
<string name="text_no_file_rw_permission">无文件读写权限</string>
<string name="text_no_running_script">没有正在运行的脚本</string>
<string name="text_already_stop_n_scripts">已停止%d个正在运行的脚本</string>
<string name="text_requires_sdk_version_to_run_the_script">本脚本需要此安卓版本以上才能运行:</string>
</resources>

View File

@@ -1,5 +1,5 @@
<resources>
<string name="app_name">autojs</string>
<string name="app_name">AutoJs</string>
<string name="text_error">错误:</string>
<string name="text_start_running">开始运行</string>
<string name="text_path_is_empty">路径为空</string>
@@ -7,5 +7,6 @@
<string name="text_no_file_rw_permission">无文件读写权限</string>
<string name="text_no_running_script">没有正在运行的脚本</string>
<string name="text_already_stop_n_scripts">已停止%d个正在运行的脚本</string>
<string name="text_requires_sdk_version_to_run_the_script">本脚本需要此安卓版本以上才能运行:</string>
</resources>