From 163f38760e024aa2ba124b9b55a65719f18d72d4 Mon Sep 17 00:00:00 2001 From: hyb1996 <946994919@qq.com> Date: Fri, 5 May 2017 00:35:45 +0800 Subject: [PATCH] Fix and improve root rocording --- app/build.gradle | 15 +- app/src/main/AndroidManifest.xml | 7 +- app/src/main/assets/js/autojs_init.js | 1 + .../app/OnActivityResultDelegate.java | 4 +- .../java/com/stardust/scriptdroid/Pref.java | 7 + .../stardust/scriptdroid/autojs/AutoJs.java | 10 +- .../autojs/ScriptExecutionGlobalListener.java | 11 +- .../stardust/scriptdroid/autojs/Shell.java | 191 +++++++++++++ .../menu/content/RecordNavigatorContent.java | 49 +++- .../content/ScriptListNavigatorContent.java | 7 +- .../external/open/RunIntentActivity.java | 9 +- .../external/shortcut/ShortcutActivity.java | 7 +- .../external/tasker/TaskPrefEditActivity.java | 4 +- .../stardust/scriptdroid/record/Recorder.java | 69 +++-- .../AccessibilityActionRecorder.java | 4 +- .../inputevent/InputEventConverter.java | 70 +++-- .../record/inputevent/InputEventRecorder.java | 91 ++++-- .../inputevent/InputEventToJsConverter.java | 23 +- .../inputevent/InputEventToJsRecorder.java | 33 --- .../InputEventToSendEventConverter.java | 7 +- .../InputEventToSendEventJsConverter.java | 132 +++++++++ .../InputEventToSendEventRecorder.java | 26 -- .../record/inputevent/KeyObserver.java | 66 +++++ .../record/inputevent/TouchRecorder.java | 24 +- .../{scripts => script}/PathChecker.java | 2 +- .../{scripts => script}/ScriptFile.java | 3 +- .../{scripts => script}/ScriptFileList.java | 2 +- .../stardust/scriptdroid/script/Scripts.java | 113 ++++++++ .../SharedPrefScriptFileList.java | 2 +- .../StorageScriptProvider.java | 3 +- .../{scripts => script}/sample/Sample.java | 8 +- .../sample/SampleFileManager.java | 2 +- .../sample/SampleGroup.java | 2 +- .../tool/AccessibilityServiceTool.java | 7 +- .../scriptdroid/tool/DrawableSaver.java | 6 +- .../scriptdroid/tool/ImageSelector.java | 4 +- .../com/stardust/scriptdroid/tool/Shell.java | 161 ----------- .../ui/console/ConsoleActivity.java | 2 +- .../scriptdroid/ui/console/JraskaConsole.java | 83 ++++++ .../ui/console/StardustConsole.java | 2 +- .../scriptdroid/ui/console/TimberConsole.java | 68 ----- .../scriptdroid/ui/edit/EditActivity.java | 34 +-- .../ui/edit/ViewSampleActivity.java | 38 ++- .../scriptdroid/ui/main/MainActivity.java | 14 +- .../main/operation/ScriptFileOperation.java | 84 ------ .../sample_list/SampleScriptListFragment.java | 11 +- .../SampleScriptListRecyclerView.java | 11 +- .../script_list/MyScriptListFragment.java | 13 +- .../ScriptAndFolderListRecyclerView.java | 11 +- .../ScriptFileChooserDialogBuilder.java | 4 +- .../ScriptListWithProgressBarView.java | 4 +- .../ui/update/UpdateInfoDialogBuilder.java | 2 +- .../armeabi-v7a/libjackpal-androidterm5.so | Bin 0 -> 13532 bytes .../armeabi-v7a/libjackpal-termexec2.so | Bin 0 -> 13496 bytes .../jniLibs/mips/libjackpal-androidterm5.so | Bin 5648 -> 0 bytes .../main/jniLibs/mips/libjackpal-termexec2.so | Bin 71084 -> 0 bytes .../jniLibs/x86/libjackpal-androidterm5.so | Bin 5240 -> 0 bytes .../main/jniLibs/x86/libjackpal-termexec2.so | Bin 9300 -> 0 bytes app/src/main/res/layout/drawer.xml | 2 +- .../main/res/layout/fragment_slide_menu.xml | 2 +- app/src/main/res/menu/menu_editor.xml | 6 + app/src/main/res/menu/menu_view_sample.xml | 8 +- app/src/main/res/values/strings.xml | 18 +- autojs/build.gradle | 6 +- .../src/main/assets/javascript_engine_init.js | 28 +- .../stardust/autojs/ScriptEngineService.java | 3 +- .../autojs/runtime/AbstractScriptRuntime.java | 70 +++++ .../autojs/runtime/ScriptRuntime.java | 43 +-- .../runtime/{ => api}/AbstractConsole.java | 3 +- .../autojs/runtime/api/AbstractShell.java | 91 +++++- .../autojs/runtime/api/ProcessShell.java | 176 ++++++++++++ .../autojs/runtime/api/SlowShell.java | 28 -- .../simple_action/SimpleActionAutomator.java | 5 +- .../autojs/script/MultiScriptSource.java | 33 --- .../autojs/script/ScriptSourceWithInit.java | 33 +++ automator/build.gradle | 2 - common/build.gradle | 1 - .../java/com/stardust/util/AssetsCache.java | 6 - .../main/java/com/stardust/util/Shell.java | 264 ------------------ .../java/com/stardust/util/TextUtils.java | 12 + 80 files changed, 1386 insertions(+), 1017 deletions(-) create mode 100644 app/src/main/assets/js/autojs_init.js create mode 100644 app/src/main/java/com/stardust/scriptdroid/autojs/Shell.java delete mode 100644 app/src/main/java/com/stardust/scriptdroid/record/inputevent/InputEventToJsRecorder.java create mode 100644 app/src/main/java/com/stardust/scriptdroid/record/inputevent/InputEventToSendEventJsConverter.java delete mode 100644 app/src/main/java/com/stardust/scriptdroid/record/inputevent/InputEventToSendEventRecorder.java create mode 100644 app/src/main/java/com/stardust/scriptdroid/record/inputevent/KeyObserver.java rename app/src/main/java/com/stardust/scriptdroid/{scripts => script}/PathChecker.java (97%) rename app/src/main/java/com/stardust/scriptdroid/{scripts => script}/ScriptFile.java (97%) rename app/src/main/java/com/stardust/scriptdroid/{scripts => script}/ScriptFileList.java (95%) create mode 100644 app/src/main/java/com/stardust/scriptdroid/script/Scripts.java rename app/src/main/java/com/stardust/scriptdroid/{scripts => script}/SharedPrefScriptFileList.java (98%) rename app/src/main/java/com/stardust/scriptdroid/{scripts => script}/StorageScriptProvider.java (98%) rename app/src/main/java/com/stardust/scriptdroid/{scripts => script}/sample/Sample.java (55%) rename app/src/main/java/com/stardust/scriptdroid/{scripts => script}/sample/SampleFileManager.java (96%) rename app/src/main/java/com/stardust/scriptdroid/{scripts => script}/sample/SampleGroup.java (90%) delete mode 100644 app/src/main/java/com/stardust/scriptdroid/tool/Shell.java create mode 100644 app/src/main/java/com/stardust/scriptdroid/ui/console/JraskaConsole.java delete mode 100644 app/src/main/java/com/stardust/scriptdroid/ui/console/TimberConsole.java delete mode 100644 app/src/main/java/com/stardust/scriptdroid/ui/main/operation/ScriptFileOperation.java create mode 100644 app/src/main/jniLibs/armeabi-v7a/libjackpal-androidterm5.so create mode 100644 app/src/main/jniLibs/armeabi-v7a/libjackpal-termexec2.so delete mode 100644 app/src/main/jniLibs/mips/libjackpal-androidterm5.so delete mode 100644 app/src/main/jniLibs/mips/libjackpal-termexec2.so delete mode 100644 app/src/main/jniLibs/x86/libjackpal-androidterm5.so delete mode 100644 app/src/main/jniLibs/x86/libjackpal-termexec2.so create mode 100644 autojs/src/main/java/com/stardust/autojs/runtime/AbstractScriptRuntime.java rename autojs/src/main/java/com/stardust/autojs/runtime/{ => api}/AbstractConsole.java (94%) create mode 100644 autojs/src/main/java/com/stardust/autojs/runtime/api/ProcessShell.java delete mode 100644 autojs/src/main/java/com/stardust/autojs/runtime/api/SlowShell.java delete mode 100644 autojs/src/main/java/com/stardust/autojs/script/MultiScriptSource.java create mode 100644 autojs/src/main/java/com/stardust/autojs/script/ScriptSourceWithInit.java delete mode 100644 common/src/main/java/com/stardust/util/Shell.java create mode 100644 common/src/main/java/com/stardust/util/TextUtils.java diff --git a/app/build.gradle b/app/build.gradle index a5f7e761..ca3e60eb 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -38,6 +38,17 @@ android { output.outputFile = new File(file.parent, file.name.replace(".apk", "-" + defaultConfig.versionName + ".apk")) } } + packagingOptions { + pickFirst 'org/mozilla/javascript/tools/debugger/build.xml' + pickFirst 'org/mozilla/javascript/tools/debugger/test.js' + pickFirst 'org/mozilla/javascript/tools/idswitch/README' + pickFirst 'org/mozilla/javascript/NativeString.java.orig' + pickFirst 'org/mozilla/javascript/Node.java.orig' + pickFirst 'org/mozilla/javascript/resources/Messages_fr.properties' + pickFirst 'org/mozilla/javascript/resources/Messages.properties' + pickFirst 'org/mozilla/javascript/*.java.orig' + pickFirst 'org/mozilla/javascript/tools/resources/*.properties' + } } repositories { @@ -47,7 +58,6 @@ repositories { } dependencies { - compile fileTree(include: ['*.jar', '*.so'], dir: 'libs') testCompile 'junit:junit:4.12' debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5' releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5' @@ -62,7 +72,6 @@ dependencies { compile 'com.github.atlassian:commonmark-java:commonmark-parent-0.9.0' compile 'moe.feng:AlipayZeroSdk:1.1' compile 'com.jraska:console:0.4.3' - compile 'com.jraska:console-timber-tree:0.4.3' compile 'com.heinrichreimersoftware:android-issue-reporter:1.3.1' compile 'de.codecrafters.tableview:tableview:2.5.0' compile group: "pl.openrnd.android", name: "multi-level-listview", version: "1.0.1" @@ -72,7 +81,7 @@ dependencies { compile 'com.ashokvarma.android:bottom-navigation-bar:1.4.1' compile 'com.yqritc:recyclerview-flexibledivider:1.4.0' compile 'me.zhanghai.android.materialprogressbar:library:1.3.0' - compile group:'com.twofortyfouram', name:'android-plugin-client-sdk-for-locale', version:'[4.0.2, 5.0[' + 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.15' compile 'com.flurry.android:analytics:7.0.0@aar' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 75bc3bac..ad5ec37c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -6,7 +6,7 @@ - + @@ -23,6 +23,7 @@ tools:replace="android:label, android:icon, android:allowBackup"> @@ -68,7 +69,9 @@ android:resource="@xml/provider_paths"/> - + + + diff --git a/app/src/main/assets/js/autojs_init.js b/app/src/main/assets/js/autojs_init.js new file mode 100644 index 00000000..e1978b3e --- /dev/null +++ b/app/src/main/assets/js/autojs_init.js @@ -0,0 +1 @@ +__importClass__(com.stardust.scriptdroid.autojs.Shell); diff --git a/app/src/main/java/com/stardust/app/OnActivityResultDelegate.java b/app/src/main/java/com/stardust/app/OnActivityResultDelegate.java index bd39e7bb..de273984 100644 --- a/app/src/main/java/com/stardust/app/OnActivityResultDelegate.java +++ b/app/src/main/java/com/stardust/app/OnActivityResultDelegate.java @@ -16,10 +16,10 @@ public interface OnActivityResultDelegate { void onActivityResult(int requestCode, int resultCode, Intent data); interface DelegateHost { - Intermediary getDelegateManger(); + Mediator getDelegateManger(); } - class Intermediary implements OnActivityResultDelegate { + class Mediator implements OnActivityResultDelegate { private SparseArray mSpecialDelegate = new SparseArray<>(); private List mDelegates = new ArrayList<>(); diff --git a/app/src/main/java/com/stardust/scriptdroid/Pref.java b/app/src/main/java/com/stardust/scriptdroid/Pref.java index 4a470d05..b02a5f04 100644 --- a/app/src/main/java/com/stardust/scriptdroid/Pref.java +++ b/app/src/main/java/com/stardust/scriptdroid/Pref.java @@ -78,6 +78,13 @@ public class Pref { return def().getString(getString(R.string.key_stop_record_trigger), null); } + public static boolean hasRecordTrigger(){ + String startTrigger = getStartRecordTrigger(); + String stopTrigger = getStartRecordTrigger(); + return startTrigger != null && !startTrigger.equals("NONE") + && stopTrigger != null && !startTrigger.equals("NONE"); + } + public static boolean enableAccessibilityServiceByRoot() { return def().getBoolean(getString(R.string.key_enable_accessibility_service_by_root), false); } 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 b268ed6d..63ae97a2 100644 --- a/app/src/main/java/com/stardust/scriptdroid/autojs/AutoJs.java +++ b/app/src/main/java/com/stardust/scriptdroid/autojs/AutoJs.java @@ -13,7 +13,7 @@ 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.scriptdroid.script.StorageScriptProvider; import com.stardust.scriptdroid.ui.console.StardustConsole; import com.stardust.util.Supplier; import com.stardust.util.UiHandler; @@ -22,7 +22,7 @@ import com.stardust.scriptdroid.layout_inspector.LayoutInspector; import com.stardust.scriptdroid.record.accessibility.AccessibilityActionRecorder; import com.stardust.scriptdroid.service.AccessibilityWatchDogService; import com.stardust.scriptdroid.tool.AccessibilityServiceTool; -import com.stardust.scriptdroid.ui.console.TimberConsole; +import com.stardust.scriptdroid.ui.console.JraskaConsole; import com.stardust.view.accessibility.AccessibilityServiceUtils; @@ -58,7 +58,7 @@ public class AutoJs implements AccessibilityBridge { manager.setRequirePath(StorageScriptProvider.DEFAULT_DIRECTORY_PATH); mScriptEngineService = new ScriptEngineServiceBuilder() .uiHandler(mUiHandler) - .globalConsole(new TimberConsole()) + .globalConsole(new JraskaConsole()) .engineManger(manager) .runtime(new Supplier() { @@ -83,6 +83,10 @@ public class AutoJs implements AccessibilityBridge { return mAccessibilityActionRecorder; } + public UiHandler getUiHandler() { + return mUiHandler; + } + public LayoutInspector getLayoutInspector() { return mLayoutInspector; } diff --git a/app/src/main/java/com/stardust/scriptdroid/autojs/ScriptExecutionGlobalListener.java b/app/src/main/java/com/stardust/scriptdroid/autojs/ScriptExecutionGlobalListener.java index 1d981ba3..b8bd5add 100644 --- a/app/src/main/java/com/stardust/scriptdroid/autojs/ScriptExecutionGlobalListener.java +++ b/app/src/main/java/com/stardust/scriptdroid/autojs/ScriptExecutionGlobalListener.java @@ -1,15 +1,11 @@ package com.stardust.scriptdroid.autojs; import com.flurry.android.FlurryAgent; -import com.stardust.autojs.ScriptEngineService; import com.stardust.autojs.execution.ScriptExecution; import com.stardust.autojs.execution.ScriptExecutionListener; -import com.stardust.autojs.runtime.ScriptInterruptedException; import com.stardust.scriptdroid.App; import com.stardust.scriptdroid.R; -import java.util.concurrent.CopyOnWriteArraySet; - /** * Created by Stardust on 2017/5/3. */ @@ -29,8 +25,11 @@ public class ScriptExecutionGlobalListener implements ScriptExecutionListener { } private void onFinish(ScriptExecution execution) { - long millis = System.currentTimeMillis() - (long) execution.getEngine().getTag(ENGINE_TAG_START_TIME); - execution.getRuntime().console.verbose(App.getApp().getString(R.string.text_execution_finished), execution.getSource().toString(), (double) millis / 1000); + Long millis = (Long) execution.getEngine().getTag(ENGINE_TAG_START_TIME); + if (millis == null) + return; + double seconds = (System.currentTimeMillis() - millis) / 1000.0; + execution.getRuntime().console.verbose(App.getApp().getString(R.string.text_execution_finished), execution.getSource().toString(), seconds); } @Override diff --git a/app/src/main/java/com/stardust/scriptdroid/autojs/Shell.java b/app/src/main/java/com/stardust/scriptdroid/autojs/Shell.java new file mode 100644 index 00000000..077d0e66 --- /dev/null +++ b/app/src/main/java/com/stardust/scriptdroid/autojs/Shell.java @@ -0,0 +1,191 @@ +package com.stardust.scriptdroid.autojs; + +import android.content.Context; +import android.os.Handler; +import android.preference.PreferenceManager; +import android.util.Log; + +import com.stardust.autojs.runtime.ScriptInterruptedException; +import com.stardust.autojs.runtime.api.AbstractShell; +import com.stardust.pio.UncheckedIOException; +import com.stardust.scriptdroid.App; + +import java.io.IOException; + +import jackpal.androidterm.ShellTermSession; +import jackpal.androidterm.emulatorview.TermSession; +import jackpal.androidterm.util.TermSettings; + +/** + * Created by Stardust on 2017/4/24. + */ + +public class Shell extends AbstractShell implements AutoCloseable { + + public interface OutputListener { + void onNewOutput(String str); + } + + private static final String TAG = "Shell"; + + private TermSession mTermSession; + private RuntimeException mInitException; + private final Object mInitLock = new Object(); + private final Object mExitLock = new Object(); + private boolean mInitialized = false; + private boolean mWaitingExit = false; + private OutputListener mOutputListener; + + public Shell() { + super(); + } + + public Shell(boolean root) { + super(root); + } + + @Override + protected void init(String initialCommand) { + init(initialCommand, App.getApp(), AutoJs.getInstance().getUiHandler()); + } + + private void init(final String initialCommand, final Context context, Handler uiHandler) { + uiHandler.post(new Runnable() { + @Override + public void run() { + TermSettings settings = new TermSettings(context.getResources(), PreferenceManager.getDefaultSharedPreferences(context)); + try { + mTermSession = new MyShellTermSession(settings, initialCommand); + mTermSession.initializeEmulator(40, 40); + } catch (IOException e) { + mInitException = new UncheckedIOException(e); + } + } + }); + } + + public void exec(String command) { + ensureInitialized(); + mTermSession.write(command + "\n"); + } + + public void setOutputListener(OutputListener outputListener) { + mOutputListener = outputListener; + } + + private void ensureInitialized() { + if (mTermSession == null) { + checkInitException(); + waitInitialization(); + if (mTermSession == null) { + checkInitException(); + throw new IllegalStateException(); + } + } + } + + private void checkInitException() { + if (mInitException != null) { + throw mInitException; + } + } + + private void waitInitialization() { + if (mInitialized) + throw new IllegalStateException("already initialized"); + synchronized (mInitLock) { + try { + mInitLock.wait(); + } catch (InterruptedException e) { + exit(); + throw new ScriptInterruptedException(); + } + } + } + + @Override + public void exit() { + mTermSession.finish(); + } + + @Override + public void exitAndWaitFor() { + execExitAndWait(); + if (!isRoot()) { + return; + } + execExitAndWait(); + } + + private void execExitAndWait() { + synchronized (mExitLock) { + mWaitingExit = true; + exec("exit"); + try { + mExitLock.wait(); + } catch (InterruptedException e) { + exit(); + throw new ScriptInterruptedException(); + } + } + } + + @Override + public void close() { + exit(); + } + + private class MyShellTermSession extends ShellTermSession { + + public MyShellTermSession(TermSettings settings, String initialCommand) throws IOException { + super(settings, initialCommand); + } + + @Override + protected void processInput(byte[] data, int offset, int count) { + String output = new String(data, offset, count); + Log.d(TAG, output); + if(mOutputListener != null){ + mOutputListener.onNewOutput(output); + } + if (mInitialized && !mWaitingExit) { + return; + } + String[] lines = new String(data, offset, count).split("\n"); + for (String line : lines) { + if (!mInitialized && line.endsWith(" # ")) { + notifyInitialized(); + return; + } + if (mWaitingExit && line.endsWith(" $ ")) { + notifyExit(); + return; + } + } + } + + private void notifyExit() { + synchronized (mExitLock) { + mWaitingExit = false; + mExitLock.notify(); + } + } + + private void notifyInitialized() { + mInitialized = true; + synchronized (mInitLock) { + mInitLock.notifyAll(); + } + } + + @Override + protected void onProcessExit() { + super.onProcessExit(); + synchronized (mExitLock) { + mWaitingExit = false; + mExitLock.notify(); + } + } + } + +} 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 6a330f16..7f49ba22 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 @@ -18,6 +18,7 @@ import com.stardust.scriptdroid.external.floating_window.menu.HoverMenuService; import com.stardust.scriptdroid.record.Recorder; import com.stardust.scriptdroid.record.accessibility.AccessibilityActionRecorder; import com.stardust.scriptdroid.record.inputevent.InputEventConverter; +import com.stardust.scriptdroid.record.inputevent.KeyObserver; import com.stardust.scriptdroid.record.inputevent.TouchRecorder; import com.stardust.scriptdroid.ui.main.MainActivity; import com.stardust.util.MessageEvent; @@ -35,7 +36,7 @@ import io.mattcarroll.hover.NavigatorContent; * Created by Stardust on 2017/3/12. */ -public class RecordNavigatorContent implements NavigatorContent, Recorder.OnStateChangedListener { +public class RecordNavigatorContent implements NavigatorContent, Recorder.OnStateChangedListener, KeyObserver.KeyListener { private View mView; @ViewBinding.Id(R.id.sw_recorded_by_root) @@ -57,6 +58,8 @@ public class RecordNavigatorContent implements NavigatorContent, Recorder.OnStat private Recorder mRecorder; private Context mContext; + private KeyObserver mKeyObserver; + private VolumeChangeObserver.OnVolumeChangeListener mOnVolumeChangeListener = new VolumeChangeObserver.OnVolumeChangeListener() { @Override public void onVolumeChange() { @@ -74,8 +77,13 @@ public class RecordNavigatorContent implements NavigatorContent, Recorder.OnStat mContext = context; mView = View.inflate(context, R.layout.floating_window_record, null); ViewBinder.bind(this); - EventBus.getDefault().register(this); + HoverMenuService.getEventBus().register(this); App.getApp().getVolumeChangeObserver().addOnVolumeChangeListener(mOnVolumeChangeListener); + if (Pref.hasRecordTrigger()) { + mKeyObserver = new KeyObserver(); + mKeyObserver.startListening(); + mKeyObserver.setKeyListener(this); + } } @NonNull @@ -158,10 +166,18 @@ public class RecordNavigatorContent implements NavigatorContent, Recorder.OnStat @Subscribe public void onMessageEvent(MessageEvent event) { if (event.message.equals(HoverMenuService.MESSAGE_MENU_EXPANDING)) { - pauseRecord(); + if (mRecorder != null && mRecorder.getState() == Recorder.STATE_RECORDING) + pauseRecord(); } else if (event.message.equals(HoverMenuService.MESSAGE_MENU_EXIT)) { - EventBus.getDefault().unregister(this); - App.getApp().getVolumeChangeObserver().removeOnVolumeChangeListener(mOnVolumeChangeListener); + onMenuExit(); + } + } + + public void onMenuExit() { + HoverMenuService.getEventBus().unregister(this); + App.getApp().getVolumeChangeObserver().removeOnVolumeChangeListener(mOnVolumeChangeListener); + if (mKeyObserver != null) { + mKeyObserver.stopListening(); } } @@ -172,13 +188,6 @@ public class RecordNavigatorContent implements NavigatorContent, Recorder.OnStat } } - @Subscribe - public void onTouchRecorderStateChanged(InputEventConverter.RecordStateChangeEvent event) { - if (!event.isRecording()) { - stopRecord(); - } - } - @Override public void onStart() { Toast.makeText(mContext, R.string.text_start_record, Toast.LENGTH_SHORT).show(); @@ -198,4 +207,20 @@ public class RecordNavigatorContent implements NavigatorContent, Recorder.OnStat public void onResume() { } + + @Override + public void onKeyDown(String keyName) { + if (keyName.equals(Pref.getStopRecordTrigger())) { + if (mRecorder != null && mRecorder.getState() == Recorder.STATE_RECORDING && mRecorder.getState() == Recorder.STATE_PAUSED) + stopRecord(); + } else if (keyName.equals(Pref.getStartRecordTrigger())) { + if (mRecorder == null) + startRecord(); + } + } + + @Override + public void onKeyUp(String keyName) { + + } } diff --git a/app/src/main/java/com/stardust/scriptdroid/external/floating_window/menu/content/ScriptListNavigatorContent.java b/app/src/main/java/com/stardust/scriptdroid/external/floating_window/menu/content/ScriptListNavigatorContent.java index 10dea940..dd50f80c 100644 --- a/app/src/main/java/com/stardust/scriptdroid/external/floating_window/menu/content/ScriptListNavigatorContent.java +++ b/app/src/main/java/com/stardust/scriptdroid/external/floating_window/menu/content/ScriptListNavigatorContent.java @@ -11,8 +11,9 @@ import com.stardust.autojs.script.FileScriptSource; import com.stardust.scriptdroid.R; import com.stardust.scriptdroid.autojs.AutoJs; import com.stardust.scriptdroid.external.floating_window.menu.HoverMenuService; -import com.stardust.scriptdroid.scripts.ScriptFile; -import com.stardust.scriptdroid.scripts.StorageScriptProvider; +import com.stardust.scriptdroid.script.ScriptFile; +import com.stardust.scriptdroid.script.Scripts; +import com.stardust.scriptdroid.script.StorageScriptProvider; import com.stardust.scriptdroid.ui.edit.EditActivity; import com.stardust.scriptdroid.ui.main.script_list.ScriptAndFolderListRecyclerView; import com.stardust.scriptdroid.ui.main.script_list.ScriptListWithProgressBarView; @@ -53,7 +54,7 @@ public class ScriptListNavigatorContent implements NavigatorContent { @Override public void onClick(ScriptFile file, int position) { - AutoJs.getInstance().getScriptEngineService().execute(new FileScriptSource(file)); + Scripts.run(file); HoverMenuService.postEvent(new MessageEvent(HoverMenuService.MESSAGE_COLLAPSE_MENU)); } diff --git a/app/src/main/java/com/stardust/scriptdroid/external/open/RunIntentActivity.java b/app/src/main/java/com/stardust/scriptdroid/external/open/RunIntentActivity.java index 8f4d300a..bc572cba 100644 --- a/app/src/main/java/com/stardust/scriptdroid/external/open/RunIntentActivity.java +++ b/app/src/main/java/com/stardust/scriptdroid/external/open/RunIntentActivity.java @@ -7,13 +7,14 @@ import android.support.annotation.Nullable; import android.widget.Toast; import com.stardust.scriptdroid.autojs.AutoJs; -import com.stardust.scriptdroid.scripts.PathChecker; +import com.stardust.scriptdroid.script.PathChecker; import com.stardust.autojs.script.FileScriptSource; -import com.stardust.autojs.script.MultiScriptSource; +import com.stardust.autojs.script.ScriptSourceWithInit; import com.stardust.autojs.script.ScriptSource; import com.stardust.autojs.script.StringScriptSource; import com.stardust.scriptdroid.external.CommonUtils; import com.stardust.scriptdroid.R; +import com.stardust.scriptdroid.script.Scripts; /** * Created by Stardust on 2017/2/22. @@ -40,10 +41,10 @@ public class RunIntentActivity extends Activity { if (path == null && script != null) { source = new StringScriptSource(script); } else if (path != null && new PathChecker(this).checkAndToastError(path)) { - source = new MultiScriptSource(new StringScriptSource(script), new FileScriptSource(path)); + source = new ScriptSourceWithInit(new StringScriptSource(script), new FileScriptSource(path)); } if (source != null) { - AutoJs.getInstance().getScriptEngineService().execute(source); + Scripts.run(source); } } diff --git a/app/src/main/java/com/stardust/scriptdroid/external/shortcut/ShortcutActivity.java b/app/src/main/java/com/stardust/scriptdroid/external/shortcut/ShortcutActivity.java index fc3a1ac0..40dffed6 100644 --- a/app/src/main/java/com/stardust/scriptdroid/external/shortcut/ShortcutActivity.java +++ b/app/src/main/java/com/stardust/scriptdroid/external/shortcut/ShortcutActivity.java @@ -5,10 +5,11 @@ import android.os.Bundle; import android.widget.Toast; import com.stardust.scriptdroid.autojs.AutoJs; -import com.stardust.scriptdroid.scripts.PathChecker; +import com.stardust.scriptdroid.script.PathChecker; import com.stardust.autojs.script.FileScriptSource; -import com.stardust.scriptdroid.App; import com.stardust.scriptdroid.external.CommonUtils; +import com.stardust.scriptdroid.script.ScriptFile; +import com.stardust.scriptdroid.script.Scripts; /** * Created by Stardust on 2017/1/23. @@ -31,7 +32,7 @@ public class ShortcutActivity extends Activity { private void runScriptFile(String path) { try { - AutoJs.getInstance().getScriptEngineService().execute(new FileScriptSource(path)); + Scripts.run(new ScriptFile(path)); } catch (Exception e) { e.printStackTrace(); Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show(); diff --git a/app/src/main/java/com/stardust/scriptdroid/external/tasker/TaskPrefEditActivity.java b/app/src/main/java/com/stardust/scriptdroid/external/tasker/TaskPrefEditActivity.java index 8ee6b79a..2315ce2e 100644 --- a/app/src/main/java/com/stardust/scriptdroid/external/tasker/TaskPrefEditActivity.java +++ b/app/src/main/java/com/stardust/scriptdroid/external/tasker/TaskPrefEditActivity.java @@ -10,8 +10,8 @@ import android.view.MenuItem; import com.stardust.scriptdroid.R; import com.stardust.scriptdroid.external.CommonUtils; -import com.stardust.scriptdroid.scripts.ScriptFile; -import com.stardust.scriptdroid.scripts.StorageScriptProvider; +import com.stardust.scriptdroid.script.ScriptFile; +import com.stardust.scriptdroid.script.StorageScriptProvider; import com.stardust.scriptdroid.ui.BaseActivity; import com.stardust.scriptdroid.ui.main.script_list.ScriptAndFolderListRecyclerView; import com.stardust.scriptdroid.ui.main.script_list.ScriptListWithProgressBarView; diff --git a/app/src/main/java/com/stardust/scriptdroid/record/Recorder.java b/app/src/main/java/com/stardust/scriptdroid/record/Recorder.java index 70883ee1..8dd74e2a 100644 --- a/app/src/main/java/com/stardust/scriptdroid/record/Recorder.java +++ b/app/src/main/java/com/stardust/scriptdroid/record/Recorder.java @@ -1,5 +1,7 @@ package com.stardust.scriptdroid.record; +import java.util.Arrays; + /** * Created by Stardust on 2017/3/16. */ @@ -18,27 +20,25 @@ public interface Recorder { } - OnStateChangedListener NO_OPERATION_LISTENER = new OnStateChangedListener() { - @Override - public void onStart() { + class StateChangeEvent { + private int mOldState; + private int mCurrentState; + + public StateChangeEvent(int oldState, int currentState) { + mOldState = oldState; + mCurrentState = currentState; } - @Override - public void onStop() { - + public int getOldState() { + return mOldState; } - @Override - public void onPause() { - + public int getCurrentState() { + return mCurrentState; } + } - @Override - public void onResume() { - - } - }; int STATE_NOT_START = 0; int STATE_RECORDING = 1; @@ -59,44 +59,65 @@ public interface Recorder { void setOnStateChangedListener(OnStateChangedListener onStateChangedListener); - abstract class DefaultIMPL implements Recorder { + abstract class AbstractRecorder implements Recorder { + + private static final OnStateChangedListener NO_OPERATION_LISTENER = new OnStateChangedListener() { + @Override + public void onStart() { + + } + + @Override + public void onStop() { + + } + + @Override + public void onPause() { + + } + + @Override + public void onResume() { + + } + }; private OnStateChangedListener mOnStateChangedListener = NO_OPERATION_LISTENER; - private final boolean mSync; private int mState = STATE_NOT_START; - public DefaultIMPL(boolean syncOfState) { + public AbstractRecorder(boolean syncOfState) { mSync = syncOfState; } - public DefaultIMPL() { + public AbstractRecorder() { this(false); } public void start() { - checkState(STATE_NOT_START); + ensureIsStateOf(STATE_NOT_START); setState(STATE_RECORDING); startImpl(); mOnStateChangedListener.onStart(); } - private void checkState(int... expectedStates) { + private void ensureIsStateOf(int... expectedStates) { for (int expectedState : expectedStates) { if (mState == expectedState) return; } - throw new IllegalStateException(); + throw new IllegalStateException("expected=" + Arrays.toString(expectedStates) + " state=" + mState); } protected abstract void startImpl(); public void stop() { - checkState(STATE_RECORDING, STATE_PAUSED); + ensureIsStateOf(STATE_RECORDING, STATE_PAUSED); setState(STATE_STOPPED); stopImpl(); mOnStateChangedListener.onStop(); @@ -105,7 +126,7 @@ public interface Recorder { protected abstract void stopImpl(); public void pause() { - checkState(STATE_RECORDING); + ensureIsStateOf(STATE_RECORDING); setState(STATE_PAUSED); pauseImpl(); mOnStateChangedListener.onPause(); @@ -136,7 +157,7 @@ public interface Recorder { } public void resume() { - checkState(STATE_PAUSED); + ensureIsStateOf(STATE_PAUSED); setState(STATE_RECORDING); resumeImpl(); mOnStateChangedListener.onResume(); 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 1fdb427b..c0207e6e 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 @@ -2,12 +2,10 @@ package com.stardust.scriptdroid.record.accessibility; import android.accessibilityservice.AccessibilityService; import android.view.accessibility.AccessibilityEvent; -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; @@ -17,7 +15,7 @@ import java.util.Set; * Created by Stardust on 2017/2/14. */ -public class AccessibilityActionRecorder extends Recorder.DefaultIMPL implements AccessibilityDelegate { +public class AccessibilityActionRecorder extends Recorder.AbstractRecorder implements AccessibilityDelegate { public static class AccessibilityActionRecordEvent { diff --git a/app/src/main/java/com/stardust/scriptdroid/record/inputevent/InputEventConverter.java b/app/src/main/java/com/stardust/scriptdroid/record/inputevent/InputEventConverter.java index 765ca8f6..d7ea85cc 100644 --- a/app/src/main/java/com/stardust/scriptdroid/record/inputevent/InputEventConverter.java +++ b/app/src/main/java/com/stardust/scriptdroid/record/inputevent/InputEventConverter.java @@ -1,6 +1,14 @@ package com.stardust.scriptdroid.record.inputevent; import android.support.annotation.NonNull; +import android.text.TextUtils; +import android.widget.Toast; + +import com.flurry.android.FlurryAgent; +import com.stardust.scriptdroid.App; +import com.stardust.scriptdroid.R; +import com.stardust.scriptdroid.autojs.AutoJs; +import com.stardust.scriptdroid.record.Recorder; import org.greenrobot.eventbus.EventBus; @@ -13,22 +21,6 @@ import java.util.regex.Pattern; public abstract class InputEventConverter { - - public static class RecordStateChangeEvent { - - private boolean mIsRecording; - - public RecordStateChangeEvent(boolean isRecording) { - this.mIsRecording = isRecording; - } - - - public boolean isRecording() { - return mIsRecording; - } - - } - static class Event { static final Pattern PATTERN = Pattern.compile("^\\[([^\\]]*)\\]\\s+([^:]*):\\s+([^\\s]*)\\s+([^\\s]*)\\s+([^\\s]*)\\s*$"); @@ -76,47 +68,63 @@ public abstract class InputEventConverter { } - protected boolean mStarted = false; + protected boolean mConverting = false; + private int mState = Recorder.STATE_NOT_START; - public void parseAndAddEventIfFormatCorrect(String eventStr) { + public void convertEventIfFormatCorrect(String eventStr) { + if(!mConverting) + return; + if(TextUtils.isEmpty(eventStr) || !eventStr.startsWith("[")) + return; Event event = parseEventOrNull(eventStr); if (event != null) { - addEvent(event); + convertEvent(event); } } - public abstract void addEvent(@NonNull Event event); + public abstract void convertEvent(@NonNull Event event); + + public String getGetEventCommand() { + return "getevent -t -l"; + } public void start() { - mStarted = true; + mConverting = true; + mState = Recorder.STATE_RECORDING; + } + + public void resume(){ + mConverting = true; + mState = Recorder.STATE_RECORDING; } public void pause() { - mStarted = false; + mConverting = false; + mState = Recorder.STATE_PAUSED; } public void stop() { - mStarted = false; + mConverting = false; + mState = Recorder.STATE_STOPPED; } public abstract String getCode(); + private boolean mFirstEventFormatError = true; + public Event parseEventOrNull(String eventStr) { try { return Event.parseEvent(eventStr); } catch (EventFormatException e) { e.printStackTrace(); + if(mFirstEventFormatError){ + Toast.makeText(App.getApp(), R.string.text_record_format_error, Toast.LENGTH_SHORT).show(); + mFirstEventFormatError = false; + FlurryAgent.logEvent("EventFormatException:" + e.getMessage()); + } return null; } } - public void notifyRecordStopped() { - EventBus.getDefault().post(new RecordStateChangeEvent(false)); - } - - public void notifyRecordStarted() { - EventBus.getDefault().post(new RecordStateChangeEvent(true)); - } - } diff --git a/app/src/main/java/com/stardust/scriptdroid/record/inputevent/InputEventRecorder.java b/app/src/main/java/com/stardust/scriptdroid/record/inputevent/InputEventRecorder.java index e667c0bb..230000b6 100644 --- a/app/src/main/java/com/stardust/scriptdroid/record/inputevent/InputEventRecorder.java +++ b/app/src/main/java/com/stardust/scriptdroid/record/inputevent/InputEventRecorder.java @@ -1,11 +1,18 @@ package com.stardust.scriptdroid.record.inputevent; import android.preference.PreferenceManager; +import android.util.Log; +import com.stardust.pio.UncheckedIOException; import com.stardust.scriptdroid.App; import com.stardust.scriptdroid.record.Recorder; +import java.io.BufferedReader; import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.PipedInputStream; +import java.io.PipedOutputStream; import jackpal.androidterm.ShellTermSession; import jackpal.androidterm.emulatorview.TermSession; @@ -15,23 +22,23 @@ import jackpal.androidterm.util.TermSettings; * Created by Stardust on 2017/3/6. */ -public abstract class InputEventRecorder extends Recorder.DefaultIMPL { +public class InputEventRecorder extends Recorder.AbstractRecorder { + private static final String TAG = "InputEventRecorder"; private TermSession mTermSession; private String mGetEventCommand; protected InputEventConverter mInputEventConverter; - protected InputEventRecorder(String getEventCommand, InputEventConverter inputEventConverter) { - mGetEventCommand = getEventCommand; + protected InputEventRecorder(InputEventConverter inputEventConverter) { + mGetEventCommand = inputEventConverter.getGetEventCommand(); mInputEventConverter = inputEventConverter; } public void listen() { TermSettings settings = new TermSettings(App.getApp().getResources(), PreferenceManager.getDefaultSharedPreferences(App.getApp())); try { - mTermSession = new MyShellTermSession(settings, "su\r"); + mTermSession = new MyShellTermSession(settings, "su"); mTermSession.initializeEmulator(80, 40); - mTermSession.write("su\r"); } catch (IOException e) { throw new RuntimeException(e); } @@ -50,7 +57,7 @@ public abstract class InputEventRecorder extends Recorder.DefaultIMPL { @Override protected void resumeImpl() { - mInputEventConverter.start(); + mInputEventConverter.resume(); } @Override @@ -59,31 +66,79 @@ public abstract class InputEventRecorder extends Recorder.DefaultIMPL { mInputEventConverter.stop(); } + @Override + public String getCode() { + return mInputEventConverter.getCode(); + } - protected abstract void parseAndRecordEvent(String eventStr); + protected void convertEvent(String eventStr) { + mInputEventConverter.convertEventIfFormatCorrect(eventStr); + } private class MyShellTermSession extends ShellTermSession { - private boolean mGettingEvents = false; + private volatile boolean mGettingEvents = false; + + private BufferedReader mBufferedReader; + private OutputStream mOutputStream; + private Thread mReadingThread; public MyShellTermSession(TermSettings settings, String initialCommand) throws IOException { super(settings, initialCommand); + PipedInputStream pipedInputStream = new PipedInputStream(8192); + mBufferedReader = new BufferedReader(new InputStreamReader(pipedInputStream)); + mOutputStream = new PipedOutputStream(pipedInputStream); + startReadingThread(); + } + + private void startReadingThread() { + mReadingThread = new Thread(new Runnable() { + @Override + public void run() { + String line; + try { + while (!Thread.currentThread().isInterrupted() + && (line = mBufferedReader.readLine()) != null){ + onNewLine(line); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + }); + mReadingThread.start(); + } + + private void onNewLine(String line) { + Log.d(TAG, line); + if (!mGettingEvents && line.endsWith(" $ su")) { + mTermSession.write(mGetEventCommand + "\r"); + mGettingEvents = true; + } else if (mGettingEvents) { + convertEvent(line); + } } @Override protected void processInput(byte[] data, int offset, int count) { - String[] lines = new String(data, offset, count).split("\n"); - for (String line : lines) { - System.out.println(line); - if (!mGettingEvents && line.endsWith("data # ")) { - mTermSession.write(mGetEventCommand + "\r"); - mGettingEvents = true; - } else if (mGettingEvents) { - parseAndRecordEvent(line); - } + try { + mOutputStream.write(data, offset, count); + } catch (IOException e) { + throw new UncheckedIOException(e); + } + } + + @Override + public void finish() { + super.finish(); + mReadingThread.interrupt(); + try { + mBufferedReader.close(); + mOutputStream.close(); + } catch (IOException e) { + e.printStackTrace(); } - appendToEmulator(data, offset, count); } } } diff --git a/app/src/main/java/com/stardust/scriptdroid/record/inputevent/InputEventToJsConverter.java b/app/src/main/java/com/stardust/scriptdroid/record/inputevent/InputEventToJsConverter.java index d9d7c030..237910b7 100644 --- a/app/src/main/java/com/stardust/scriptdroid/record/inputevent/InputEventToJsConverter.java +++ b/app/src/main/java/com/stardust/scriptdroid/record/inputevent/InputEventToJsConverter.java @@ -86,7 +86,7 @@ public class InputEventToJsConverter extends InputEventConverter { } private void appendCodeIfNotStopped(Event event) { - if (!mStarted) + if (!mConverting) return; long interval = (long) (1000 * (event.time - mTouchTime)); mCode.append("sh.Swipe(") @@ -115,20 +115,12 @@ public class InputEventToJsConverter extends InputEventConverter { if (event.code.equals("BTN_TOUCH")) { mTouchDown = event.value.equals("DOWN"); if (!mTouchDown && mSwipe) { - if (mStarted) + if (mConverting) mCode.append("sh.Tap(").append(mLastTouchPoint.x).append(", ").append(mLastTouchPoint.y).append(");\n"); mSwipe = false; } } else if (event.value.equals("UP")) { - if (!mStarted && event.code.equals(mStartTriggerKey)) { - mStarted = true; - notifyRecordStarted(); - } else if (mStarted && event.code.equals(mStopTriggerKey)) { - mStarted = false; - notifyRecordStopped(); - } else { appendKeyPressCode(event); - } } } @@ -141,7 +133,6 @@ public class InputEventToJsConverter extends InputEventConverter { } private EventHandler mEventHandler = new TypeRouter(); - private String mStartTriggerKey, mStopTriggerKey; private StringBuilder mCode = new StringBuilder().append("var sh = new Shell(true);\n"); private Point mTouchPoint = new Point(), mLastTouchPoint = new Point(); private boolean mTouchDown = false, mSwipe = false; @@ -149,7 +140,7 @@ public class InputEventToJsConverter extends InputEventConverter { @Override - public void addEvent(@NonNull Event event) { + public void convertEvent(@NonNull Event event) { mEventHandler.handle(event); } @@ -163,13 +154,5 @@ public class InputEventToJsConverter extends InputEventConverter { return mCode.toString(); } - public void setStartTriggerKey(String startTriggerKey) { - mStartTriggerKey = startTriggerKey; - } - - public void setStopTriggerKey(String stopTriggerKey) { - mStopTriggerKey = stopTriggerKey; - } - } diff --git a/app/src/main/java/com/stardust/scriptdroid/record/inputevent/InputEventToJsRecorder.java b/app/src/main/java/com/stardust/scriptdroid/record/inputevent/InputEventToJsRecorder.java deleted file mode 100644 index 5efaf70d..00000000 --- a/app/src/main/java/com/stardust/scriptdroid/record/inputevent/InputEventToJsRecorder.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.stardust.scriptdroid.record.inputevent; - -/** - * Created by Stardust on 2017/3/7. - */ - -public class InputEventToJsRecorder extends InputEventRecorder { - - private InputEventToJsConverter mInputEventToJsConverter; - - public InputEventToJsRecorder() { - super("getevent -t -l", new InputEventToJsConverter()); - mInputEventToJsConverter = (InputEventToJsConverter) mInputEventConverter; - } - - @Override - protected void parseAndRecordEvent(String eventStr) { - mInputEventConverter.parseAndAddEventIfFormatCorrect(eventStr); - } - - @Override - public String getCode() { - return mInputEventConverter.getCode(); - } - - public void setStartTriggerKey(String startTriggerKey) { - mInputEventToJsConverter.setStartTriggerKey(startTriggerKey); - } - - public void setStopTriggerKey(String stopTriggerKey) { - mInputEventToJsConverter.setStopTriggerKey(stopTriggerKey); - } -} diff --git a/app/src/main/java/com/stardust/scriptdroid/record/inputevent/InputEventToSendEventConverter.java b/app/src/main/java/com/stardust/scriptdroid/record/inputevent/InputEventToSendEventConverter.java index 74a95e08..3e17a492 100644 --- a/app/src/main/java/com/stardust/scriptdroid/record/inputevent/InputEventToSendEventConverter.java +++ b/app/src/main/java/com/stardust/scriptdroid/record/inputevent/InputEventToSendEventConverter.java @@ -17,7 +17,7 @@ public class InputEventToSendEventConverter extends InputEventConverter { private StringBuilder mSendEventCommands = new StringBuilder(); @Override - public void addEvent(@NonNull Event event) { + public void convertEvent(@NonNull Event event) { if (mLastEventTime == 0) { mLastEventTime = event.time; } else if (event.time - mLastEventTime > 0.1) { @@ -32,6 +32,11 @@ public class InputEventToSendEventConverter extends InputEventConverter { } + @Override + public String getGetEventCommand() { + return "getevent -t"; + } + public String getCode() { return mSendEventCommands.toString(); } diff --git a/app/src/main/java/com/stardust/scriptdroid/record/inputevent/InputEventToSendEventJsConverter.java b/app/src/main/java/com/stardust/scriptdroid/record/inputevent/InputEventToSendEventJsConverter.java new file mode 100644 index 00000000..3aeb94a6 --- /dev/null +++ b/app/src/main/java/com/stardust/scriptdroid/record/inputevent/InputEventToSendEventJsConverter.java @@ -0,0 +1,132 @@ +package com.stardust.scriptdroid.record.inputevent; + +import android.support.annotation.NonNull; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import static com.stardust.util.ScreenMetrics.getScreenHeight; +import static com.stardust.util.ScreenMetrics.getScreenWidth; + +/** + * Created by Stardust on 2017/5/3. + */ + +public class InputEventToSendEventJsConverter extends InputEventConverter { + + private final static Pattern LAST_INT_PATTERN = Pattern.compile("[^0-9]+([0-9]+)$"); + private double mLastEventTime; + private StringBuilder mCode = new StringBuilder(); + private int mTouchDevice = -1; + private int mLastTouchX = -1; + private int mLastTouchY = -1; + + public InputEventToSendEventJsConverter() { + mCode.append("var sh = new Shell(true);\n") + .append("sh.SetScreenScale(").append(getScreenWidth()).append(", ") + .append(getScreenHeight()).append(");\n"); + } + + + @Override + public void convertEvent(@NonNull Event event) { + if (mLastEventTime == 0) { + mLastEventTime = event.time; + } else if (event.time - mLastEventTime > 0.03) { + mCode.append("sleep(").append((long) (1000 * (event.time - mLastEventTime))).append(");\n"); + mLastEventTime = event.time; + } + int device = parseDeviceNumber(event.device); + int type = (int) Long.parseLong(event.type, 16); + int code = (int) Long.parseLong(event.code, 16); + int value = (int) Long.parseLong(event.value, 16); + if (type == 3) { + if (code == 53) { + onTouchX(device, value); + return; + } + if (code == 54) { + onTouchY(device, value); + return; + } + } + checkLastTouch(); + mCode.append("sh.SendEvent("); + if (device != mTouchDevice) { + mCode.append(device).append(", "); + } + mCode.append(type).append(", ") + .append(code).append(", ") + .append(value).append(");\n"); + } + + private void checkLastTouch() { + if (mLastTouchX >= 0) { + mCode.append("sh.TouchX(").append(mLastTouchX).append(");\n"); + mLastTouchX = -1; + } + if (mLastTouchY >= 0) { + mCode.append("sh.TouchY(").append(mLastTouchY).append(");\n"); + mLastTouchY = -1; + } + } + + + private int parseDeviceNumber(String device) { + Matcher matcher = LAST_INT_PATTERN.matcher(device); + if (matcher.find()) { + String someNumberStr = matcher.group(1); + return Integer.parseInt(someNumberStr); + } + return -1; + } + + private void onTouchX(int device, int value) { + if (mTouchDevice == -1) { + setTouchDevice(device); + } + mLastTouchX = value; + } + + private void onTouchY(int device, int value) { + if (mTouchDevice == -1) { + setTouchDevice(device); + } + if (mLastTouchX >= 0) { + mCode.append("sh.Touch(") + .append(mLastTouchX).append(", ") + .append(value).append(");\n"); + mLastTouchX = -1; + } else { + mLastTouchY = value; + } + } + + private void setTouchDevice(int i) { + mCode.append("sh.SetTouchDevice(").append(i).append(");\n"); + mTouchDevice = i; + } + + @Override + public String getGetEventCommand() { + return "getevent -t"; + } + + public String getCode() { + return mCode.toString(); + } + + @Override + public void stop() { + super.stop(); + mCode.append("sh.exitAndWaitFor();"); + } + + private static String hex2dec(String hex) { + try { + return String.valueOf((int) Long.parseLong(hex, 16)); + } catch (NumberFormatException e) { + throw new EventFormatException(e); + } + } +} diff --git a/app/src/main/java/com/stardust/scriptdroid/record/inputevent/InputEventToSendEventRecorder.java b/app/src/main/java/com/stardust/scriptdroid/record/inputevent/InputEventToSendEventRecorder.java deleted file mode 100644 index 1810f741..00000000 --- a/app/src/main/java/com/stardust/scriptdroid/record/inputevent/InputEventToSendEventRecorder.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.stardust.scriptdroid.record.inputevent; - -/** - * Created by Stardust on 2017/3/7. - */ - -public class InputEventToSendEventRecorder extends InputEventRecorder { - - private InputEventToSendEventConverter mEventConverter; - - protected InputEventToSendEventRecorder() { - super("getevent -t", new InputEventToSendEventConverter()); - } - - - @Override - protected void parseAndRecordEvent(String eventStr) { - mEventConverter.parseAndAddEventIfFormatCorrect(eventStr); - } - - @Override - public String getCode() { - return mEventConverter.getCode(); - } - -} diff --git a/app/src/main/java/com/stardust/scriptdroid/record/inputevent/KeyObserver.java b/app/src/main/java/com/stardust/scriptdroid/record/inputevent/KeyObserver.java new file mode 100644 index 00000000..d5807756 --- /dev/null +++ b/app/src/main/java/com/stardust/scriptdroid/record/inputevent/KeyObserver.java @@ -0,0 +1,66 @@ +package com.stardust.scriptdroid.record.inputevent; + +import android.support.annotation.NonNull; + +/** + * Created by Stardust on 2017/5/4. + */ + +public class KeyObserver { + + public interface KeyListener { + + void onKeyDown(String keyName); + + void onKeyUp(String keyName); + + } + + private InputEventRecorder mObserver; + private KeyListener mKeyListener; + + public KeyObserver(){ + mObserver = new InputEventRecorder(new InputEventConverter() { + @Override + public void convertEvent(@NonNull Event event) { + if(event.value.equalsIgnoreCase("UP")){ + notifyKeyUp(event.code); + } + if(event.value.equalsIgnoreCase("DOWN")){ + notifyKeyDown(event.code); + } + } + + @Override + public String getCode() { + return null; + } + }); + } + + public void setKeyListener(KeyListener keyListener) { + mKeyListener = keyListener; + } + + public void startListening(){ + mObserver.listen(); + mObserver.start(); + } + + public void stopListening(){ + mObserver.stopImpl(); + } + + private void notifyKeyDown(String keyName) { + if(mKeyListener != null){ + mKeyListener.onKeyDown(keyName); + } + } + + private void notifyKeyUp(String keyName) { + if(mKeyListener != null){ + mKeyListener.onKeyUp(keyName); + } + } + +} diff --git a/app/src/main/java/com/stardust/scriptdroid/record/inputevent/TouchRecorder.java b/app/src/main/java/com/stardust/scriptdroid/record/inputevent/TouchRecorder.java index b5971f5b..3ef34bb5 100644 --- a/app/src/main/java/com/stardust/scriptdroid/record/inputevent/TouchRecorder.java +++ b/app/src/main/java/com/stardust/scriptdroid/record/inputevent/TouchRecorder.java @@ -1,26 +1,32 @@ package com.stardust.scriptdroid.record.inputevent; -import com.stardust.scriptdroid.App; import com.stardust.scriptdroid.Pref; -import com.stardust.scriptdroid.R; -import com.stardust.scriptdroid.record.Recorder; /** * Created by Stardust on 2017/3/16. */ -public class TouchRecorder extends InputEventToJsRecorder { - +public class TouchRecorder extends InputEventRecorder implements KeyObserver.KeyListener { public TouchRecorder() { + super(new InputEventToSendEventJsConverter()); listen(); - setUpTriggers(); } - private void setUpTriggers() { - setStartTriggerKey(Pref.getStartRecordTrigger()); - setStopTriggerKey(Pref.getStopRecordTrigger()); + + @Override + public void stop() { + super.stop(); } + @Override + public void onKeyDown(String keyName) { + + } + + @Override + public void onKeyUp(String keyName) { + + } } diff --git a/app/src/main/java/com/stardust/scriptdroid/scripts/PathChecker.java b/app/src/main/java/com/stardust/scriptdroid/script/PathChecker.java similarity index 97% rename from app/src/main/java/com/stardust/scriptdroid/scripts/PathChecker.java rename to app/src/main/java/com/stardust/scriptdroid/script/PathChecker.java index 258a3669..891fd32a 100644 --- a/app/src/main/java/com/stardust/scriptdroid/scripts/PathChecker.java +++ b/app/src/main/java/com/stardust/scriptdroid/script/PathChecker.java @@ -1,4 +1,4 @@ -package com.stardust.scriptdroid.scripts; +package com.stardust.scriptdroid.script; import android.app.Activity; import android.os.Build; diff --git a/app/src/main/java/com/stardust/scriptdroid/scripts/ScriptFile.java b/app/src/main/java/com/stardust/scriptdroid/script/ScriptFile.java similarity index 97% rename from app/src/main/java/com/stardust/scriptdroid/scripts/ScriptFile.java rename to app/src/main/java/com/stardust/scriptdroid/script/ScriptFile.java index f2f3cc14..04f75c23 100644 --- a/app/src/main/java/com/stardust/scriptdroid/scripts/ScriptFile.java +++ b/app/src/main/java/com/stardust/scriptdroid/script/ScriptFile.java @@ -1,8 +1,7 @@ -package com.stardust.scriptdroid.scripts; +package com.stardust.scriptdroid.script; import android.os.Environment; -import com.android.dex.util.FileUtils; import com.stardust.pio.PFile; import java.io.File; diff --git a/app/src/main/java/com/stardust/scriptdroid/scripts/ScriptFileList.java b/app/src/main/java/com/stardust/scriptdroid/script/ScriptFileList.java similarity index 95% rename from app/src/main/java/com/stardust/scriptdroid/scripts/ScriptFileList.java rename to app/src/main/java/com/stardust/scriptdroid/script/ScriptFileList.java index e8949ed0..4d9ee899 100644 --- a/app/src/main/java/com/stardust/scriptdroid/scripts/ScriptFileList.java +++ b/app/src/main/java/com/stardust/scriptdroid/script/ScriptFileList.java @@ -1,4 +1,4 @@ -package com.stardust.scriptdroid.scripts; +package com.stardust.scriptdroid.script; import java.io.File; diff --git a/app/src/main/java/com/stardust/scriptdroid/script/Scripts.java b/app/src/main/java/com/stardust/scriptdroid/script/Scripts.java new file mode 100644 index 00000000..cb199308 --- /dev/null +++ b/app/src/main/java/com/stardust/scriptdroid/script/Scripts.java @@ -0,0 +1,113 @@ +package com.stardust.scriptdroid.script; + +import android.content.Context; +import android.content.Intent; +import android.net.Uri; + +import com.stardust.autojs.execution.ScriptExecution; +import com.stardust.autojs.execution.ScriptExecutionListener; +import com.stardust.autojs.execution.SimpleScriptExecutionListener; +import com.stardust.autojs.runtime.ScriptInterruptedException; +import com.stardust.autojs.script.FileScriptSource; +import com.stardust.autojs.script.ScriptSource; +import com.stardust.autojs.script.ScriptSourceWithInit; +import com.stardust.autojs.script.StringScriptSource; +import com.stardust.scriptdroid.App; +import com.stardust.scriptdroid.BuildConfig; +import com.stardust.scriptdroid.R; +import com.stardust.scriptdroid.autojs.AutoJs; +import com.stardust.scriptdroid.external.CommonUtils; +import com.stardust.scriptdroid.external.shortcut.Shortcut; +import com.stardust.scriptdroid.external.shortcut.ShortcutActivity; +import com.stardust.scriptdroid.script.sample.Sample; +import com.stardust.scriptdroid.ui.edit.EditActivity; +import com.stardust.util.AssetsCache; + +import java.io.File; + +/** + * Created by Stardust on 2017/5/3. + */ + +public class Scripts { + + public static final String ACTION_ON_EXECUTION_FINISHED = "Don't leave me alone..."; + public static final String EXTRA_EXCEPTION_MESSAGE = "Say something...Eating...17.5.3"; + + private static final ScriptExecutionListener BROADCAST_SENDER_SCRIPT_EXECUTION_LISTENER = new SimpleScriptExecutionListener() { + + @Override + public void onSuccess(ScriptExecution execution, Object result) { + App.getApp().sendBroadcast(new Intent(ACTION_ON_EXECUTION_FINISHED)); + } + + @Override + public void onException(ScriptExecution execution, Exception e) { + if (ScriptInterruptedException.causedByInterrupted(e)) { + App.getApp().sendBroadcast(new Intent(ACTION_ON_EXECUTION_FINISHED)); + } else { + App.getApp().sendBroadcast(new Intent(ACTION_ON_EXECUTION_FINISHED) + .putExtra(EXTRA_EXCEPTION_MESSAGE, e.getMessage())); + } + } + + }; + private static final String INIT_SCRIPT_PATH = "js/autojs_init.js"; + private static ScriptSource initScriptSource; + + + public static void openByOtherApps(String path) { + Uri uri = Uri.parse("file://" + path); + App.getApp().startActivity(new Intent(Intent.ACTION_VIEW).setDataAndType(uri, "text/plain").addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); + } + + public static void openByOtherApps(File file) { + openByOtherApps(file.getPath()); + } + + public static void createShortcut(ScriptFile scriptFile) { + new Shortcut(App.getApp()).name(scriptFile.getSimplifiedName()) + .targetClass(ShortcutActivity.class) + .icon(R.drawable.ic_node_js_black) + .extras(new Intent().putExtra(CommonUtils.EXTRA_KEY_PATH, scriptFile.getPath())) + .send(); + } + + + public static void edit(ScriptFile file) { + EditActivity.editFile(App.getApp(), file.getSimplifiedName(), file.getPath()); + } + + public static void edit(String path) { + edit(new ScriptFile(path)); + } + + public static ScriptExecution run(ScriptFile file) { + return run(new FileScriptSource(file)); + } + + public static ScriptExecution run(ScriptSource source) { + return AutoJs.getInstance().getScriptEngineService().execute(wrappedWithInitSource(source)); + } + + private static ScriptSource wrappedWithInitSource(ScriptSource source) { + return new ScriptSourceWithInit(getInitScriptSource(), source); + } + + public static ScriptExecution runWithBroadcastSender(ScriptSource scriptSource) { + return AutoJs.getInstance().getScriptEngineService().execute(wrappedWithInitSource(scriptSource), BROADCAST_SENDER_SCRIPT_EXECUTION_LISTENER); + } + + public static ScriptExecution run(Context context, Sample file) { + ScriptSource source = new StringScriptSource(file.name, AssetsCache.get(context.getAssets(), file.path)); + return AutoJs.getInstance().getScriptEngineService().execute(wrappedWithInitSource(source)); + } + + private static ScriptSource getInitScriptSource() { + if(initScriptSource == null || BuildConfig.DEBUG){ + String initScript = AssetsCache.get(App.getApp().getAssets(), INIT_SCRIPT_PATH); + initScriptSource = new StringScriptSource(initScript); + } + return initScriptSource; + } +} diff --git a/app/src/main/java/com/stardust/scriptdroid/scripts/SharedPrefScriptFileList.java b/app/src/main/java/com/stardust/scriptdroid/script/SharedPrefScriptFileList.java similarity index 98% rename from app/src/main/java/com/stardust/scriptdroid/scripts/SharedPrefScriptFileList.java rename to app/src/main/java/com/stardust/scriptdroid/script/SharedPrefScriptFileList.java index 5f23c85f..97232d93 100644 --- a/app/src/main/java/com/stardust/scriptdroid/scripts/SharedPrefScriptFileList.java +++ b/app/src/main/java/com/stardust/scriptdroid/script/SharedPrefScriptFileList.java @@ -1,4 +1,4 @@ -package com.stardust.scriptdroid.scripts; +package com.stardust.scriptdroid.script; import android.content.Context; import android.content.SharedPreferences; diff --git a/app/src/main/java/com/stardust/scriptdroid/scripts/StorageScriptProvider.java b/app/src/main/java/com/stardust/scriptdroid/script/StorageScriptProvider.java similarity index 98% rename from app/src/main/java/com/stardust/scriptdroid/scripts/StorageScriptProvider.java rename to app/src/main/java/com/stardust/scriptdroid/script/StorageScriptProvider.java index 24ee50ab..90a0bae5 100644 --- a/app/src/main/java/com/stardust/scriptdroid/scripts/StorageScriptProvider.java +++ b/app/src/main/java/com/stardust/scriptdroid/script/StorageScriptProvider.java @@ -1,4 +1,4 @@ -package com.stardust.scriptdroid.scripts; +package com.stardust.scriptdroid.script; import android.os.Environment; @@ -6,7 +6,6 @@ import com.stardust.scriptdroid.App; import com.stardust.scriptdroid.R; import com.stardust.util.FileSorter; import com.stardust.util.LimitedHashMap; -import com.stardust.util.MapEntries; import org.greenrobot.eventbus.EventBus; diff --git a/app/src/main/java/com/stardust/scriptdroid/scripts/sample/Sample.java b/app/src/main/java/com/stardust/scriptdroid/script/sample/Sample.java similarity index 55% rename from app/src/main/java/com/stardust/scriptdroid/scripts/sample/Sample.java rename to app/src/main/java/com/stardust/scriptdroid/script/sample/Sample.java index d7381e4a..500c5e91 100644 --- a/app/src/main/java/com/stardust/scriptdroid/scripts/sample/Sample.java +++ b/app/src/main/java/com/stardust/scriptdroid/script/sample/Sample.java @@ -1,4 +1,10 @@ -package com.stardust.scriptdroid.scripts.sample; +package com.stardust.scriptdroid.script.sample; + +import android.content.Context; + +import com.stardust.autojs.script.StringScriptSource; +import com.stardust.scriptdroid.autojs.AutoJs; +import com.stardust.util.AssetsCache; import java.io.Serializable; diff --git a/app/src/main/java/com/stardust/scriptdroid/scripts/sample/SampleFileManager.java b/app/src/main/java/com/stardust/scriptdroid/script/sample/SampleFileManager.java similarity index 96% rename from app/src/main/java/com/stardust/scriptdroid/scripts/sample/SampleFileManager.java rename to app/src/main/java/com/stardust/scriptdroid/script/sample/SampleFileManager.java index 21d938cf..70e30eb5 100644 --- a/app/src/main/java/com/stardust/scriptdroid/scripts/sample/SampleFileManager.java +++ b/app/src/main/java/com/stardust/scriptdroid/script/sample/SampleFileManager.java @@ -1,4 +1,4 @@ -package com.stardust.scriptdroid.scripts.sample; +package com.stardust.scriptdroid.script.sample; import android.content.Context; import android.content.res.AssetManager; diff --git a/app/src/main/java/com/stardust/scriptdroid/scripts/sample/SampleGroup.java b/app/src/main/java/com/stardust/scriptdroid/script/sample/SampleGroup.java similarity index 90% rename from app/src/main/java/com/stardust/scriptdroid/scripts/sample/SampleGroup.java rename to app/src/main/java/com/stardust/scriptdroid/script/sample/SampleGroup.java index 53510dc4..4c8422d2 100644 --- a/app/src/main/java/com/stardust/scriptdroid/scripts/sample/SampleGroup.java +++ b/app/src/main/java/com/stardust/scriptdroid/script/sample/SampleGroup.java @@ -1,4 +1,4 @@ -package com.stardust.scriptdroid.scripts.sample; +package com.stardust.scriptdroid.script.sample; import java.util.ArrayList; import java.util.List; diff --git a/app/src/main/java/com/stardust/scriptdroid/tool/AccessibilityServiceTool.java b/app/src/main/java/com/stardust/scriptdroid/tool/AccessibilityServiceTool.java index c06841c0..2961f548 100644 --- a/app/src/main/java/com/stardust/scriptdroid/tool/AccessibilityServiceTool.java +++ b/app/src/main/java/com/stardust/scriptdroid/tool/AccessibilityServiceTool.java @@ -4,20 +4,17 @@ import android.accessibilityservice.AccessibilityService; import android.content.ActivityNotFoundException; import android.content.Context; import android.text.TextUtils; -import android.util.Log; import android.widget.Toast; import com.stardust.scriptdroid.Pref; import com.stardust.scriptdroid.service.AccessibilityWatchDogService; import com.stardust.scriptdroid.App; import com.stardust.scriptdroid.R; -import com.stardust.util.Shell; +import com.stardust.autojs.runtime.api.ProcessShell; import com.stardust.view.accessibility.AccessibilityServiceUtils; import java.util.Locale; -import static com.stardust.view.accessibility.AccessibilityServiceUtils.isAccessibilityServiceEnabled; - /** * Created by Stardust on 2017/1/26. */ @@ -58,7 +55,7 @@ public class AccessibilityServiceTool { public static boolean enableAccessibilityServiceByRoot(Class accessibilityService) { String serviceName = App.getApp().getPackageName() + "/" + accessibilityService.getName(); - return TextUtils.isEmpty(Shell.execCommand(String.format(Locale.getDefault(), cmd, serviceName), true).error); + return TextUtils.isEmpty(ProcessShell.exec(String.format(Locale.getDefault(), cmd, serviceName), true).error); } public static boolean enableAccessibilityServiceByRootAndWaitFor(long timeOut) { diff --git a/app/src/main/java/com/stardust/scriptdroid/tool/DrawableSaver.java b/app/src/main/java/com/stardust/scriptdroid/tool/DrawableSaver.java index ff19010e..fd142ca9 100644 --- a/app/src/main/java/com/stardust/scriptdroid/tool/DrawableSaver.java +++ b/app/src/main/java/com/stardust/scriptdroid/tool/DrawableSaver.java @@ -76,13 +76,13 @@ public abstract class DrawableSaver { } - public void select(Activity activity, final OnActivityResultDelegate.Intermediary intermediary) { - new ImageSelector(activity, intermediary, new ImageSelector.ImageSelectorCallback() { + public void select(Activity activity, final OnActivityResultDelegate.Mediator mediator) { + new ImageSelector(activity, mediator, new ImageSelector.ImageSelectorCallback() { @Override public void onImageSelected(ImageSelector selector, InputStream inputStream) { if (inputStream != null) setDrawable(inputStream); - intermediary.removeDelegate(selector); + mediator.removeDelegate(selector); } }).select(); } diff --git a/app/src/main/java/com/stardust/scriptdroid/tool/ImageSelector.java b/app/src/main/java/com/stardust/scriptdroid/tool/ImageSelector.java index b0f05bd8..dc1ccba6 100644 --- a/app/src/main/java/com/stardust/scriptdroid/tool/ImageSelector.java +++ b/app/src/main/java/com/stardust/scriptdroid/tool/ImageSelector.java @@ -25,8 +25,8 @@ public class ImageSelector implements OnActivityResultDelegate { private Activity mActivity; private ImageSelectorCallback mCallback; - public ImageSelector(Activity activity, Intermediary intermediary, ImageSelectorCallback callback) { - intermediary.addDelegate(REQUEST_CODE, this); + public ImageSelector(Activity activity, Mediator mediator, ImageSelectorCallback callback) { + mediator.addDelegate(REQUEST_CODE, this); mActivity = activity; mCallback = callback; } diff --git a/app/src/main/java/com/stardust/scriptdroid/tool/Shell.java b/app/src/main/java/com/stardust/scriptdroid/tool/Shell.java deleted file mode 100644 index 63d99b8c..00000000 --- a/app/src/main/java/com/stardust/scriptdroid/tool/Shell.java +++ /dev/null @@ -1,161 +0,0 @@ -package com.stardust.scriptdroid.tool; - -import android.content.Context; -import android.preference.PreferenceManager; - -import com.stardust.pio.UncheckedIOException; -import com.stardust.scriptdroid.App; - -import java.io.IOException; - -import jackpal.androidterm.ShellTermSession; -import jackpal.androidterm.emulatorview.TermSession; -import jackpal.androidterm.util.TermSettings; - -/** - * Created by Stardust on 2017/4/24. - */ - -public class Shell { - - private TermSession mTermSession; - private String mOutput; - - public Shell(boolean root) { - this(App.getApp(), root ? "su\n" : "sh\n"); - } - - public Shell(Context context, String initialCommand) { - TermSettings settings = new TermSettings(context.getResources(), PreferenceManager.getDefaultSharedPreferences(context)); - try { - mTermSession = new MyShellTermSession(settings, initialCommand); - } catch (IOException e) { - throw new UncheckedIOException(e); - } - } - - public String execAndWaitFor(String command) { - mTermSession.write(command + "\n"); - mOutput = null; - synchronized (this) { - try { - wait(); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - } - return mOutput; - } - - public String execAndWaitFor(String command, int millis) { - mTermSession.write(command + "\n"); - mOutput = null; - synchronized (this) { - try { - wait(millis); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - } - return mOutput; - } - - public void exec(String command) { - mTermSession.write(command); - } - - public void execute(String command) { - mTermSession.write(command); - } - - - public void Tap(int x, int y) { - execute("input tap " + x + " " + y); - } - - public void Swipe(int x1, int y1, int x2, int y2) { - execute("input swipe " + x1 + " " + y1 + " " + x2 + " " + y2); - } - - public void Swipe(int x1, int y1, int x2, int y2, long duration) { - execute("input swipe " + x1 + " " + y1 + " " + x2 + " " + y2 + " " + duration); - } - - public void KeyCode(int keyCode) { - execute("input keyevent " + keyCode); - } - - public void KeyCode(String keyCode) { - execute("input keyevent " + keyCode); - } - - public void Home() { - KeyCode(3); - } - - public void Back() { - KeyCode(4); - } - - public void Power() { - KeyCode(26); - } - - public void Up() { - KeyCode(19); - } - - public void Down() { - KeyCode(20); - } - - public void Left() { - KeyCode(21); - } - - public void Right() { - KeyCode(22); - } - - public void OK() { - KeyCode(23); - } - - public void VolumeUp() { - KeyCode(24); - } - - public void VolumeDown() { - KeyCode(25); - } - - public void Menu() { - KeyCode(1); - } - - public void Camera() { - KeyCode(27); - } - - public void Text(String text) { - execute("input text " + text); - } - - private class MyShellTermSession extends ShellTermSession { - - public MyShellTermSession(TermSettings settings, String initialCommand) throws IOException { - super(settings, initialCommand); - } - - - @Override - protected void processInput(byte[] data, int offset, int count) { - mOutput = new String(data, offset, count); - synchronized (Shell.this) { - Shell.this.notifyAll(); - } - appendToEmulator(data, offset, count); - } - } - -} diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/console/ConsoleActivity.java b/app/src/main/java/com/stardust/scriptdroid/ui/console/ConsoleActivity.java index 5909bec2..b9813ecc 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/console/ConsoleActivity.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/console/ConsoleActivity.java @@ -27,7 +27,7 @@ public class ConsoleActivity extends BaseActivity { private void setUpUI() { setContentView(R.layout.activity_console); - setToolbarAsBack(getString(R.string.text_console)); + setToolbarAsBack(getString(R.string.text_log)); } @Override diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/console/JraskaConsole.java b/app/src/main/java/com/stardust/scriptdroid/ui/console/JraskaConsole.java new file mode 100644 index 00000000..257309b9 --- /dev/null +++ b/app/src/main/java/com/stardust/scriptdroid/ui/console/JraskaConsole.java @@ -0,0 +1,83 @@ +package com.stardust.scriptdroid.ui.console; + +import android.content.Intent; +import android.text.Spannable; +import android.text.SpannableString; +import android.text.style.ForegroundColorSpan; +import android.util.Log; +import android.util.SparseArray; + +import com.jraska.console.Console; +import com.stardust.autojs.runtime.api.AbstractConsole; +import com.stardust.scriptdroid.App; +import com.stardust.util.SparseArrayEntries; +import com.stardust.util.TextUtils; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; + +/** + * Created by Stardust on 2017/4/2. + */ + +public class JraskaConsole extends AbstractConsole { + + + private static final SparseArray COLORS = new SparseArrayEntries() + .entry(Log.VERBOSE, 0xff909090) + .entry(Log.DEBUG, 0xdf000000) + .entry(Log.INFO, 0xdf4caf50) + .entry(Log.WARN, 0xff2196f3) + .entry(Log.ERROR, 0xffff534e) + .entry(Log.ASSERT, 0xffff534e) + .sparseArray(); + + private static final SparseArray TAGS = new SparseArrayEntries() + .entry(Log.VERBOSE, "V") + .entry(Log.DEBUG, "D") + .entry(Log.INFO, "I") + .entry(Log.WARN, "W") + .entry(Log.ERROR, "E") + .entry(Log.ASSERT, "A") + .sparseArray(); + + private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("HH:mm:ss.SSS/", Locale.getDefault()); + + @Override + public void println(int level, CharSequence charSequence) { + Console.write(getLevelSpannable(level, getTag(level))); + Console.writeLine(getLevelSpannable(level, charSequence)); + } + + private CharSequence getTag(int level) { + return TextUtils.join("", DATE_FORMAT.format(new Date()), TAGS.get(level), ": "); + } + + private SpannableString getLevelSpannable(int level, CharSequence charSequence) { + SpannableString spannable = new SpannableString(charSequence); + spannable.setSpan(new ForegroundColorSpan(COLORS.get(level)), 0, charSequence.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + return spannable; + } + + @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(); + } + + @Override + public void setTitle(CharSequence title) { + + } +} diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/console/StardustConsole.java b/app/src/main/java/com/stardust/scriptdroid/ui/console/StardustConsole.java index 743b1d00..142fbaad 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/console/StardustConsole.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/console/StardustConsole.java @@ -3,7 +3,7 @@ package com.stardust.scriptdroid.ui.console; import android.content.Context; import android.content.Intent; -import com.stardust.autojs.runtime.AbstractConsole; +import com.stardust.autojs.runtime.api.AbstractConsole; import com.stardust.autojs.runtime.api.Console; import com.stardust.enhancedfloaty.FloatyService; import com.stardust.enhancedfloaty.ResizableExpandableFloatyWindow; 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 deleted file mode 100644 index ba0e50d7..00000000 --- a/app/src/main/java/com/stardust/scriptdroid/ui/console/TimberConsole.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.stardust.scriptdroid.ui.console; - -import android.content.Intent; -import android.graphics.Color; -import android.text.Spannable; -import android.text.SpannableString; -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.AbstractConsole; -import com.stardust.scriptdroid.App; - - -import timber.log.Timber; - -/** - * Created by Stardust on 2017/4/2. - */ - -public class TimberConsole extends AbstractConsole { - - static { - Timber.plant(new ConsoleTree.Builder() - .minPriority(Log.VERBOSE) - .verboseColor(0xff909090) - .debugColor(0xdf000000) - .infoColor(0xdf4caf50) - .warnColor(0xff2196f3) - .errorColor(0xffff534e) - .assertColor(0xffff534e) - .build()); - } - - @Override - public void println(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(); - } - - @Override - public void setTitle(CharSequence title) { - - } -} diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/edit/EditActivity.java b/app/src/main/java/com/stardust/scriptdroid/ui/edit/EditActivity.java index d41d6c9f..33d8d34d 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/edit/EditActivity.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/edit/EditActivity.java @@ -27,7 +27,8 @@ import com.stardust.autojs.script.JsBeautifier; import com.stardust.autojs.script.StringScriptSource; import com.stardust.scriptdroid.R; import com.stardust.scriptdroid.autojs.AutoJs; -import com.stardust.scriptdroid.scripts.ScriptFile; +import com.stardust.scriptdroid.script.ScriptFile; +import com.stardust.scriptdroid.script.Scripts; import com.stardust.scriptdroid.tool.JsBeautifierFactory; import com.stardust.scriptdroid.tool.MaterialDialogFactory; import com.stardust.scriptdroid.ui.BaseActivity; @@ -35,7 +36,6 @@ import com.stardust.scriptdroid.ui.edit.completion.InputMethodEnhanceBar; import com.stardust.scriptdroid.ui.edit.editor920.Editor920Activity; import com.stardust.scriptdroid.ui.edit.editor920.Editor920Utils; import com.stardust.scriptdroid.ui.help.HelpCatalogueActivity; -import com.stardust.scriptdroid.ui.main.operation.ScriptFileOperation; import com.stardust.theme.ThemeColorManager; import com.stardust.theme.dialog.ThemeColorMaterialDialogBuilder; import com.stardust.util.SparseArrayEntries; @@ -45,11 +45,6 @@ import com.stardust.widget.ToolbarMenuItem; import java.io.File; -import timber.log.Timber; - -import static com.stardust.scriptdroid.ui.main.operation.ScriptFileOperation.ACTION_ON_RUN_FINISHED; -import static com.stardust.scriptdroid.ui.main.operation.ScriptFileOperation.EXTRA_EXCEPTION_MESSAGE; - /** * Created by Stardust on 2017/1/29. */ @@ -83,6 +78,7 @@ public class EditActivity extends Editor920Activity { } } + public static final String EXTRA_CONTENT = "Still Love Eating 17.4.5"; public static void editFile(Context context, String path) { @@ -109,13 +105,12 @@ public class EditActivity extends Editor920Activity { private BroadcastReceiver mOnRunFinishedReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { - if (intent.getAction().equals(ACTION_ON_RUN_FINISHED)) { + if (intent.getAction().equals(Scripts.ACTION_ON_EXECUTION_FINISHED)) { mScriptExecution = null; setMenuStatus(R.id.run, MenuDef.STATUS_NORMAL); - String msg = intent.getStringExtra(EXTRA_EXCEPTION_MESSAGE); + String msg = intent.getStringExtra(Scripts.EXTRA_EXCEPTION_MESSAGE); if (msg != null) { Snackbar.make(mView, getString(R.string.text_error) + ": " + msg, Snackbar.LENGTH_LONG).show(); - Timber.e(msg); } } } @@ -131,7 +126,7 @@ public class EditActivity extends Editor920Activity { handleIntent(getIntent()); setUpUI(); setUpEditor(); - registerReceiver(mOnRunFinishedReceiver, new IntentFilter(ACTION_ON_RUN_FINISHED)); + registerReceiver(mOnRunFinishedReceiver, new IntentFilter(Scripts.ACTION_ON_EXECUTION_FINISHED)); } private void handleIntent(Intent intent) { @@ -212,12 +207,13 @@ public class EditActivity extends Editor920Activity { Snackbar.make(mView, R.string.text_start_running, Snackbar.LENGTH_SHORT).show(); setMenuStatus(R.id.run, MenuDef.STATUS_DISABLED); if (mFile != null) { - mScriptExecution = ScriptFileOperation.runOnEditView(new FileScriptSource(mName, mFile)); + mScriptExecution = Scripts.runWithBroadcastSender(new FileScriptSource(mName, mFile)); } else { - mScriptExecution = ScriptFileOperation.runOnEditView(new StringScriptSource(mName, mEditorDelegate.getText())); + mScriptExecution = Scripts.runWithBroadcastSender(new StringScriptSource(mName, mEditorDelegate.getText())); } } + @ViewBinding.Click(R.id.undo) private void undo() { Command command = new Command(Command.CommandEnum.UNDO); @@ -266,6 +262,9 @@ public class EditActivity extends Editor920Activity { case R.id.action_console: showConsole(); return true; + case R.id.action_log: + showLog(); + return true; case R.id.action_help: HelpCatalogueActivity.showMainCatalogue(this); return true; @@ -282,11 +281,13 @@ public class EditActivity extends Editor920Activity { return super.onOptionsItemSelected(item); } + private void showLog() { + AutoJs.getInstance().getScriptEngineService().getGlobalConsole().show(); + } + private void showConsole() { if (mScriptExecution != null) { mScriptExecution.getRuntime().console.show(); - } else { - AutoJs.getInstance().getScriptEngineService().getGlobalConsole().show(); } } @@ -298,8 +299,7 @@ public class EditActivity extends Editor920Activity { private void openByOtherApps() { if (mFile != null) - ScriptFileOperation.openByOtherApps(mFile.getPath()); - + Scripts.openByOtherApps(mFile); } private void beautifyCode() { diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/edit/ViewSampleActivity.java b/app/src/main/java/com/stardust/scriptdroid/ui/edit/ViewSampleActivity.java index c7c93619..46e26667 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/edit/ViewSampleActivity.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/edit/ViewSampleActivity.java @@ -15,16 +15,18 @@ import com.jecelyin.editor.v2.common.Command; import com.jecelyin.editor.v2.ui.EditorDelegate; import com.jecelyin.editor.v2.view.EditorView; import com.jecelyin.editor.v2.view.menu.MenuDef; +import com.stardust.autojs.execution.ScriptExecution; import com.stardust.autojs.script.StringScriptSource; import com.stardust.scriptdroid.R; -import com.stardust.scriptdroid.scripts.sample.Sample; +import com.stardust.scriptdroid.autojs.AutoJs; +import com.stardust.scriptdroid.script.Scripts; +import com.stardust.scriptdroid.script.sample.Sample; import com.stardust.scriptdroid.ui.BaseActivity; import com.stardust.scriptdroid.ui.console.ConsoleActivity; import com.stardust.scriptdroid.ui.edit.editor920.Editor920Activity; import com.stardust.scriptdroid.ui.edit.editor920.Editor920Utils; import com.stardust.scriptdroid.ui.help.HelpCatalogueActivity; import com.stardust.scriptdroid.ui.main.MainActivity; -import com.stardust.scriptdroid.ui.main.operation.ScriptFileOperation; import com.stardust.theme.ThemeColorManager; import com.stardust.util.AssetsCache; import com.stardust.util.SparseArrayEntries; @@ -32,10 +34,10 @@ import com.stardust.view.ViewBinder; import com.stardust.view.ViewBinding; import com.stardust.widget.ToolbarMenuItem; -import timber.log.Timber; -import static com.stardust.scriptdroid.ui.main.operation.ScriptFileOperation.ACTION_ON_RUN_FINISHED; -import static com.stardust.scriptdroid.ui.main.operation.ScriptFileOperation.EXTRA_EXCEPTION_MESSAGE; +import static com.stardust.scriptdroid.script.Scripts.ACTION_ON_EXECUTION_FINISHED; +import static com.stardust.scriptdroid.script.Scripts.EXTRA_EXCEPTION_MESSAGE; + /** * Created by Stardust on 2017/4/29. @@ -43,6 +45,7 @@ import static com.stardust.scriptdroid.ui.main.operation.ScriptFileOperation.EXT public class ViewSampleActivity extends Editor920Activity { + public static void view(Context context, Sample sample) { context.startActivity(new Intent(context, ViewSampleActivity.class) .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) @@ -51,17 +54,18 @@ public class ViewSampleActivity extends Editor920Activity { private View mView; private Sample mSample; + private ScriptExecution mScriptExecution; private EditorDelegate mEditorDelegate; private SparseArray mMenuMap; private BroadcastReceiver mOnRunFinishedReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { - if (intent.getAction().equals(ACTION_ON_RUN_FINISHED)) { + if (intent.getAction().equals(ACTION_ON_EXECUTION_FINISHED)) { + mScriptExecution = null; setMenuStatus(R.id.run, MenuDef.STATUS_NORMAL); String msg = intent.getStringExtra(EXTRA_EXCEPTION_MESSAGE); if (msg != null) { Snackbar.make(mView, getString(R.string.text_error) + ": " + msg, Snackbar.LENGTH_LONG).show(); - Timber.e(msg); } } } @@ -75,7 +79,7 @@ public class ViewSampleActivity extends Editor920Activity { handleIntent(getIntent()); setUpUI(); setUpEditor(); - registerReceiver(mOnRunFinishedReceiver, new IntentFilter(ACTION_ON_RUN_FINISHED)); + registerReceiver(mOnRunFinishedReceiver, new IntentFilter(ACTION_ON_EXECUTION_FINISHED)); } private void handleIntent(Intent intent) { @@ -107,7 +111,7 @@ public class ViewSampleActivity extends Editor920Activity { private void run() { Snackbar.make(mView, R.string.text_start_running, Snackbar.LENGTH_SHORT).show(); setMenuStatus(R.id.run, MenuDef.STATUS_DISABLED); - ScriptFileOperation.runOnEditView(new StringScriptSource(mSample.name, mEditorDelegate.getText())); + mScriptExecution = Scripts.runWithBroadcastSender(new StringScriptSource(mSample.name, mEditorDelegate.getText())); } private void initMenuItem() { @@ -135,7 +139,10 @@ public class ViewSampleActivity extends Editor920Activity { public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.action_console: - startActivity(new Intent(getContext(), ConsoleActivity.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); + showConsole(); + return true; + case R.id.action_log: + showLog(); return true; case R.id.action_help: HelpCatalogueActivity.showMainCatalogue(this); @@ -147,6 +154,17 @@ public class ViewSampleActivity extends Editor920Activity { return super.onOptionsItemSelected(item); } + + private void showLog() { + AutoJs.getInstance().getScriptEngineService().getGlobalConsole().show(); + } + + private void showConsole() { + if (mScriptExecution != null) { + mScriptExecution.getRuntime().console.show(); + } + } + @Override public void doCommand(Command command) { mEditorDelegate.doCommand(command); diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/main/MainActivity.java b/app/src/main/java/com/stardust/scriptdroid/ui/main/MainActivity.java index e6a9e03a..bae7e94b 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/main/MainActivity.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/main/MainActivity.java @@ -29,9 +29,9 @@ import com.stardust.app.NotAskAgainDialog; import com.stardust.app.OnActivityResultDelegate; import com.stardust.scriptdroid.BuildConfig; import com.stardust.scriptdroid.R; -import com.stardust.scriptdroid.scripts.ScriptFile; -import com.stardust.scriptdroid.scripts.StorageScriptProvider; -import com.stardust.scriptdroid.scripts.sample.Sample; +import com.stardust.scriptdroid.script.ScriptFile; +import com.stardust.scriptdroid.script.StorageScriptProvider; +import com.stardust.scriptdroid.script.sample.Sample; import com.stardust.scriptdroid.service.AccessibilityWatchDogService; import com.stardust.scriptdroid.tool.AccessibilityServiceTool; import com.stardust.scriptdroid.tool.DrawableSaver; @@ -75,7 +75,7 @@ public class MainActivity extends BaseActivity { private SlidingUpPanel mAddBottomMenuPanel; private FragmentPagerAdapterBuilder.StoredFragmentPagerAdapter mPagerAdapter; - private OnActivityResultDelegate.Intermediary mActivityResultIntermediary = new OnActivityResultDelegate.Intermediary(); + private OnActivityResultDelegate.Mediator mActivityResultMediator = new OnActivityResultDelegate.Mediator(); private DrawableSaver mDrawerHeaderBackgroundSaver, mAppbarBackgroundSaver; private VersionGuard mVersionGuard; private Intent mIntentToHandle; @@ -240,7 +240,7 @@ public class MainActivity extends BaseActivity { @ViewBinding.Click(R.id.drawer_header_img) public void selectHeaderImage() { - mDrawerHeaderBackgroundSaver.select(this, mActivityResultIntermediary); + mDrawerHeaderBackgroundSaver.select(this, mActivityResultMediator); } @Override @@ -330,7 +330,7 @@ public class MainActivity extends BaseActivity { @ViewBinding.Click(R.id.toolbar) public void OnToolbarClick() { - mAppbarBackgroundSaver.select(this, mActivityResultIntermediary); + mAppbarBackgroundSaver.select(this, mActivityResultMediator); } @Subscribe @@ -343,7 +343,7 @@ public class MainActivity extends BaseActivity { @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { - mActivityResultIntermediary.onActivityResult(requestCode, resultCode, data); + mActivityResultMediator.onActivityResult(requestCode, resultCode, data); } @Override 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 deleted file mode 100644 index 1b475a2d..00000000 --- a/app/src/main/java/com/stardust/scriptdroid/ui/main/operation/ScriptFileOperation.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.stardust.scriptdroid.ui.main.operation; - -import android.content.Context; -import android.content.Intent; -import android.net.Uri; - -import com.stardust.autojs.execution.ScriptExecution; -import com.stardust.autojs.execution.ScriptExecutionListener; -import com.stardust.autojs.execution.SimpleScriptExecutionListener; -import com.stardust.autojs.runtime.ScriptInterruptedException; -import com.stardust.autojs.script.FileScriptSource; -import com.stardust.autojs.script.ScriptSource; -import com.stardust.autojs.script.StringScriptSource; -import com.stardust.scriptdroid.App; -import com.stardust.scriptdroid.R; -import com.stardust.scriptdroid.autojs.AutoJs; -import com.stardust.scriptdroid.external.CommonUtils; -import com.stardust.scriptdroid.external.shortcut.Shortcut; -import com.stardust.scriptdroid.external.shortcut.ShortcutActivity; -import com.stardust.scriptdroid.scripts.ScriptFile; -import com.stardust.scriptdroid.scripts.sample.Sample; -import com.stardust.scriptdroid.ui.edit.EditActivity; -import com.stardust.util.AssetsCache; - -/** - * Created by Stardust on 2017/1/23. - */ - -public abstract class ScriptFileOperation { - - public static final String ACTION_ON_RUN_FINISHED = "ACTION_ON_RUN_FINISHED"; - public static final String EXTRA_EXCEPTION_MESSAGE = "EXTRA_EXCEPTION_MESSAGE"; - - - private static final ScriptExecutionListener RUN_ON_EDIT_VIEW_SCRIPT_EXECUTION_LISTENER = new SimpleScriptExecutionListener() { - - @Override - public void onSuccess(ScriptExecution execution, Object result) { - App.getApp().sendBroadcast(new Intent(ACTION_ON_RUN_FINISHED)); - } - - @Override - public void onException(ScriptExecution execution, Exception e) { - if (ScriptInterruptedException.causedByInterrupted(e)) { - return; - } - App.getApp().sendBroadcast(new Intent(ACTION_ON_RUN_FINISHED) - .putExtra(EXTRA_EXCEPTION_MESSAGE, e.getMessage())); - } - - }; - - - public static void openByOtherApps(String path) { - Uri uri = Uri.parse("file://" + path); - App.getApp().startActivity(new Intent(Intent.ACTION_VIEW).setDataAndType(uri, "text/plain").addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); - } - - public static void createShortcut(ScriptFile scriptFile) { - new Shortcut(App.getApp()).name(scriptFile.getSimplifiedName()) - .targetClass(ShortcutActivity.class) - .icon(R.drawable.ic_node_js_black) - .extras(new Intent().putExtra(CommonUtils.EXTRA_KEY_PATH, scriptFile.getPath())) - .send(); - } - - - public static void edit(ScriptFile file) { - EditActivity.editFile(App.getApp(), file.getSimplifiedName(), file.getPath()); - } - - public static void run(ScriptFile file) { - AutoJs.getInstance().getScriptEngineService().execute(new FileScriptSource(file)); - } - - public static void run(Context context, Sample file) { - AutoJs.getInstance().getScriptEngineService().execute(new StringScriptSource(file.name, AssetsCache.get(context.getAssets(), file.path))); - } - - public static ScriptExecution runOnEditView(ScriptSource scriptSource) { - return AutoJs.getInstance().getScriptEngineService().execute(scriptSource, RUN_ON_EDIT_VIEW_SCRIPT_EXECUTION_LISTENER); - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/main/sample_list/SampleScriptListFragment.java b/app/src/main/java/com/stardust/scriptdroid/ui/main/sample_list/SampleScriptListFragment.java index 4e937a66..1da82663 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/main/sample_list/SampleScriptListFragment.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/main/sample_list/SampleScriptListFragment.java @@ -2,7 +2,6 @@ package com.stardust.scriptdroid.ui.main.sample_list; import android.os.Bundle; import android.support.annotation.Nullable; -import android.support.design.widget.Snackbar; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -10,13 +9,11 @@ import android.view.ViewGroup; import com.afollestad.materialdialogs.MaterialDialog; import com.stardust.app.Fragment; import com.stardust.scriptdroid.R; -import com.stardust.scriptdroid.scripts.sample.Sample; -import com.stardust.scriptdroid.scripts.sample.SampleFileManager; +import com.stardust.scriptdroid.script.Scripts; +import com.stardust.scriptdroid.script.sample.Sample; +import com.stardust.scriptdroid.script.sample.SampleFileManager; import com.stardust.scriptdroid.ui.edit.ViewSampleActivity; import com.stardust.scriptdroid.ui.main.MainActivity; -import com.stardust.scriptdroid.ui.main.operation.ScriptFileOperation; - -import java.io.IOException; /** * Created by Stardust on 2017/3/13. @@ -59,7 +56,7 @@ public class SampleScriptListFragment extends Fragment { @Override public void onSelection(MaterialDialog dialog, View itemView, int position, CharSequence text) { if (position == 0) { - ScriptFileOperation.run(getActivity(), sample); + Scripts.run(getActivity(), sample); } else { copySampleToMyScripts(sample); } diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/main/sample_list/SampleScriptListRecyclerView.java b/app/src/main/java/com/stardust/scriptdroid/ui/main/sample_list/SampleScriptListRecyclerView.java index 1e36c0fd..fcb45e43 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/main/sample_list/SampleScriptListRecyclerView.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/main/sample_list/SampleScriptListRecyclerView.java @@ -3,7 +3,6 @@ package com.stardust.scriptdroid.ui.main.sample_list; import android.content.Context; import android.support.annotation.NonNull; import android.support.v7.widget.DividerItemDecoration; -import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.util.AttributeSet; import android.view.LayoutInflater; @@ -17,7 +16,7 @@ import com.bignerdranch.expandablerecyclerview.ExpandableRecyclerAdapter; import com.bignerdranch.expandablerecyclerview.ParentViewHolder; import com.bignerdranch.expandablerecyclerview.model.Parent; import com.stardust.scriptdroid.R; -import com.stardust.scriptdroid.scripts.sample.Sample; +import com.stardust.scriptdroid.script.sample.Sample; import com.stardust.widget.LevelBeamView; import java.util.ArrayList; @@ -87,9 +86,9 @@ public class SampleScriptListRecyclerView extends RecyclerView { mOnItemClickListener = onItemClickListener; } - public void setSamples(List samples) { + public void setSamples(List samples) { mSampleGroups.clear(); - for (com.stardust.scriptdroid.scripts.sample.SampleGroup sampleGroup : samples) { + for (com.stardust.scriptdroid.script.sample.SampleGroup sampleGroup : samples) { mSampleGroups.add(new SampleGroup(sampleGroup)); } mAdapter = new Adapter(mSampleGroups); @@ -103,9 +102,9 @@ public class SampleScriptListRecyclerView extends RecyclerView { private class SampleGroup implements Parent { - private com.stardust.scriptdroid.scripts.sample.SampleGroup mSampleGroup; + private com.stardust.scriptdroid.script.sample.SampleGroup mSampleGroup; - SampleGroup(com.stardust.scriptdroid.scripts.sample.SampleGroup sampleGroup) { + SampleGroup(com.stardust.scriptdroid.script.sample.SampleGroup sampleGroup) { mSampleGroup = sampleGroup; } diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/main/script_list/MyScriptListFragment.java b/app/src/main/java/com/stardust/scriptdroid/ui/main/script_list/MyScriptListFragment.java index 1f7a479f..ee02bb5e 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/main/script_list/MyScriptListFragment.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/main/script_list/MyScriptListFragment.java @@ -5,7 +5,6 @@ import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.design.widget.Snackbar; import android.text.InputType; -import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -14,12 +13,12 @@ import android.widget.EditText; import com.afollestad.materialdialogs.DialogAction; import com.afollestad.materialdialogs.MaterialDialog; import com.stardust.app.Fragment; -import com.stardust.scriptdroid.scripts.ScriptFile; +import com.stardust.scriptdroid.script.ScriptFile; import com.stardust.pio.PFile; import com.stardust.scriptdroid.R; -import com.stardust.scriptdroid.scripts.StorageScriptProvider; +import com.stardust.scriptdroid.script.Scripts; +import com.stardust.scriptdroid.script.StorageScriptProvider; import com.stardust.scriptdroid.ui.edit.EditActivity; -import com.stardust.scriptdroid.ui.main.operation.ScriptFileOperation; import com.stardust.theme.dialog.ThemeColorMaterialDialogBuilder; import com.stardust.view.ViewBinder; import com.stardust.view.ViewBinding; @@ -142,7 +141,7 @@ public class MyScriptListFragment extends Fragment { } } notifyScriptFileChanged(); - ScriptFileOperation.edit(new ScriptFile(path)); + Scripts.edit(path); } else { Snackbar.make(getView(), R.string.text_create_fail, Snackbar.LENGTH_LONG).show(); } @@ -255,7 +254,7 @@ public class MyScriptListFragment extends Fragment { @ViewBinding.Click(R.id.open_by_other_apps) private void openByOtherApps() { dismissDialogs(); - ScriptFileOperation.openByOtherApps(mSelectedScriptFile.getPath()); + Scripts.openByOtherApps(mSelectedScriptFile); onScriptFileOperated(); } @@ -272,7 +271,7 @@ public class MyScriptListFragment extends Fragment { @ViewBinding.Click(R.id.create_shortcut) private void createShortcut() { dismissDialogs(); - ScriptFileOperation.createShortcut(mSelectedScriptFile); + Scripts.createShortcut(mSelectedScriptFile); Snackbar.make(getView(), R.string.text_already_create, Snackbar.LENGTH_SHORT).show(); onScriptFileOperated(); } diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/main/script_list/ScriptAndFolderListRecyclerView.java b/app/src/main/java/com/stardust/scriptdroid/ui/main/script_list/ScriptAndFolderListRecyclerView.java index 626cedd3..5980825b 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/main/script_list/ScriptAndFolderListRecyclerView.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/main/script_list/ScriptAndFolderListRecyclerView.java @@ -10,17 +10,14 @@ import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.view.ViewTreeObserver; import android.widget.RelativeLayout; import android.widget.TextView; import android.workground.WrapContentLinearLayoutManager; -import com.stardust.autojs.script.FileScriptSource; -import com.stardust.scriptdroid.autojs.AutoJs; -import com.stardust.scriptdroid.scripts.ScriptFile; +import com.stardust.scriptdroid.script.ScriptFile; import com.stardust.scriptdroid.R; -import com.stardust.scriptdroid.scripts.StorageScriptProvider; -import com.stardust.scriptdroid.ui.main.operation.ScriptFileOperation; +import com.stardust.scriptdroid.script.Scripts; +import com.stardust.scriptdroid.script.StorageScriptProvider; import com.stardust.widget.ViewHolderMutableAdapter; import com.stardust.widget.ViewHolderSupplier; import com.yqritc.recyclerviewflexibledivider.HorizontalDividerItemDecoration; @@ -111,7 +108,7 @@ public class ScriptAndFolderListRecyclerView extends RecyclerView { public void onClick(View v) { int position = getChildViewHolder((View) v.getParent()).getAdapterPosition(); ScriptFile file = mAdapter.getScriptFileAt(position); - ScriptFileOperation.run(file); + Scripts.run(file); } }; private final ViewHolderSupplier mDefaultViewHolderSupplier = new ViewHolderSupplier() { diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/main/script_list/ScriptFileChooserDialogBuilder.java b/app/src/main/java/com/stardust/scriptdroid/ui/main/script_list/ScriptFileChooserDialogBuilder.java index f53291ad..5fb06c60 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/main/script_list/ScriptFileChooserDialogBuilder.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/main/script_list/ScriptFileChooserDialogBuilder.java @@ -4,8 +4,8 @@ import android.content.Context; import android.support.annotation.NonNull; import com.afollestad.materialdialogs.MaterialDialog; -import com.stardust.scriptdroid.scripts.ScriptFile; -import com.stardust.scriptdroid.scripts.StorageScriptProvider; +import com.stardust.scriptdroid.script.ScriptFile; +import com.stardust.scriptdroid.script.StorageScriptProvider; /** * Created by Stardust on 2017/4/3. diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/main/script_list/ScriptListWithProgressBarView.java b/app/src/main/java/com/stardust/scriptdroid/ui/main/script_list/ScriptListWithProgressBarView.java index f06d997b..804c823c 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/main/script_list/ScriptListWithProgressBarView.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/main/script_list/ScriptListWithProgressBarView.java @@ -13,8 +13,8 @@ import android.view.View; import android.widget.FrameLayout; import com.stardust.scriptdroid.R; -import com.stardust.scriptdroid.scripts.ScriptFile; -import com.stardust.scriptdroid.scripts.StorageScriptProvider; +import com.stardust.scriptdroid.script.ScriptFile; +import com.stardust.scriptdroid.script.StorageScriptProvider; /** * Created by Stardust on 2017/4/3. diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/update/UpdateInfoDialogBuilder.java b/app/src/main/java/com/stardust/scriptdroid/ui/update/UpdateInfoDialogBuilder.java index c02b57de..d6049f1f 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/update/UpdateInfoDialogBuilder.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/update/UpdateInfoDialogBuilder.java @@ -16,7 +16,7 @@ import android.widget.Toast; import com.afollestad.materialdialogs.MaterialDialog; import com.stardust.scriptdroid.BuildConfig; import com.stardust.scriptdroid.R; -import com.stardust.scriptdroid.scripts.StorageScriptProvider; +import com.stardust.scriptdroid.script.StorageScriptProvider; import com.stardust.scriptdroid.tool.IntentTool; import com.stardust.scriptdroid.tool.UpdateChecker; import com.stardust.util.DownloadTask; diff --git a/app/src/main/jniLibs/armeabi-v7a/libjackpal-androidterm5.so b/app/src/main/jniLibs/armeabi-v7a/libjackpal-androidterm5.so new file mode 100644 index 0000000000000000000000000000000000000000..8abd6b575d8ce80b21aece0702f015cbae915e75 GIT binary patch literal 13532 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 literal 0 HcmV?d00001 diff --git a/app/src/main/jniLibs/armeabi-v7a/libjackpal-termexec2.so b/app/src/main/jniLibs/armeabi-v7a/libjackpal-termexec2.so new file mode 100644 index 0000000000000000000000000000000000000000..a413d87f1f4677371820586108fb88d9fe7efc78 GIT binary patch literal 13496 zcmeHue{@vUz3)C}&SWMKk`R7P!XccQ0T~kV6Of3gVG;sCkQlHcxZY$kGcZFYnK&7c zptl4|D{ZMJgla-;LB(qnwZW42ye(X*r7gYfTAe{$MT>VGP#Ww-J6i5dC?V&4z9%#B zaEj~p-u2d7?~k|jJKz1;-|znJ@80{n_t__Bvvb+1Dvsk=G8veICD8&Dt|(C@#sy4b zX2_L?k2IMA~$59%DpCD$E>}mlZNrcK0a#78Qu7 zU6S))m5^6LPLwoCa%$uLOA#;F-z2p@N@1#bNgiWK@}q!=>JrtWzPA0-kP#*A7qzsu zM0|}!^?|0MV4$hN7yg^3Zt7ze#Bh5o5uO2BHj}Y&;8_@18p~uN`I006C%jCDAJXAE zVBciM(!p)8w+DPp!am`Hz%3g2Z-94c@G$Vxz_){w{zUXQnW+7#Iy?jT7tl|GjQn4z zldl1eL7tP4x9a4(fIo%262U_CkL%<=*Wq95@EIL`Uxz=^;j21)O^4N>N_3d|Yos7c zB*No$I8%qG>9DB7vvfF5hf8(1Oox~1@NykqrNe7Acq07w0Y9XPhsQN?8|3?e&ss-2 zO!M(0;8PlW8u()kz5;wzgH4#n$8BHMx6vk$NHl&9;6CVM%GLQ^tdlPV{sh57>yO&6 z0sa*Dz61^e-#Puu`riUx16-Mq9{}zIPR83m0ly9mH&uK80{kOjT8Cu+BJkV53ljJX z;G?&ZY*cQBBdOw-atrVSz|9GH5jmPj5_p9UuLF+R8Ec0F)LuX*-wEu&eB76iKMh=_ z8NZi-+co%Y;PaaC{yp$-HTYBDD;k`R%~U(yHsHgshiy;w=T0521&(Uu9vuz?4{PL4 z>2NQw1N}|fe_Myo04G^e5}zO42C>xrF)y(wZ-jeXm$saU5xm`jjnb0 zS+?EhakcoGylVrSF?g&Y5DfkuH6C>bB2^eO;>`i?-%-O8_F+EOZmn+)hdjQPmg*+> zKrLeEyjz>uCQnl&$hJ1Y76^G@0k%rnW?#hDw2iqVp@1s$2Eq)q$;;q{myjnIYVnQ!67*phw&54y z(!5ozt8H)dR(IHY>&Y!e@#dzjt_MbgtBN8FX1v>PF0b{qL_%So>uXgtuF9_zeWk!v z=_mz}&+N8C1Oe;~ znh@F2bb76Oo6mKN`57y(xP|^L;zZR)`B!OcBjj)A+2u+)S*x4Qgzx&|FZB}>nbb?p z>zF;Y;8v4*i|HP-dUN0;Y~NfsrmLB_grcTIJ4>6w*ek|n17T8&DGoKQjkpo}Nq<-Wp0!Y=Mdq4|8^a{EGv>HTd8K@Fe3@QT62T__0nxp0zn*i zos&3FDTv}1MKWU|3=oMRRc zj-G0)O#wH9k_ksT^&Ot#W(6jb_^Jf2N$~Xv{&0dxjddI^vkfX7H&P;0SSa zbUSf0{5Wwm)J7am?oH!Q3RpJQvA>yE6;^mkFx!{r@AH0+I% zugUM#z^PR{3+Ff*b`{2>{@R3b7G#@(;$gm%gaujtU86*9)!+R zQ4qO!{WX(_KYhhFUAxDhRh_kxwR6v=NUfDSD(6G$xyA~(*g`Q?b^xurHon>@wpMa+ z*EQz&OVsW+S4+2OW#q)mXybo^UIX=l%>BIou)T-9yS{6=`9x;F;Fp0u0?Jg;g)!9J zFTkI4af-+sT$GEKUh|{nMc1S{<`@@ccANi*Q;0sq9@!9E$ITxcVAj~W<`d@rOfegJ z`Pa-ROvrPuFdG-2ca7^|(uNc+hIjY$^b=S^{XKoG^VGeQMXCF-%IW?TQRv9=8#}Z2 zv3bU*Rb)10uun0HOr9+=yQ%XB&Iu?j7L~ytDsx3%H1#TjZz#p06(gz)zM!xJEYBP* z@gITzzgb@_PQ(~vJZ1c`ZI*fe%g*u-9}|0+MKpAB@%M)K_CwB;*h|&L7(-<+U*Ugn zOfL1mu8s@qwxOM_MgdfNi@Ua8ct(Eu7T(>f~QT4(MFB%lmBQIQvxr>Yc z^AO+tBI6dEt~u^J8#5gEu0^<$*>dWb%EDSG|!IL8^RZmmKJe`X1;=0MxajK_* zp%>Xu4eQ|+Jm)+UGjucCWAHVn&UApcTD!P?9A?fngk0P^B;=+b1~P{pUdj23#T}K4 z@hRNZwZ^vvV)S5RXHty}Xr+7Y!M6@BV{LEU4zQ4Vax%4TQ_B~^uc;`%V<<(GQ1342jgL+$ z=Hk*2@A&r*`<#D?_Bua@M%mD31EjHJh!vS)To>QX#qS>Cq;e-0cMg@I2UnrBY)Du% zG%&p{jy+)o4jSLVv+q%m1j+#Y4$s5^Pz02|4u3-dp9C`aS^oxRc(2Wtl`^Sa?_gH0gFC=?ueF@d_}F4R;LRLh?`1m>2_Gtk9-;j? z=d`G?+q~#>wla8D5e_`#G@jvlo^y_ia!dIA7Y4YpZ#h%n=N54L|1dB?6l6A=mxb=9 zoLAm;h$i^W`Z-5Rly{h-%#j*1Vw41#emPmdFY{v^O6}ky>ig*!)WE3KbX#0GL*rW70JyU zLM&AxosEQ~Z71sBmlIS8GWfAKiXWIvXIB&-F!ArP_!9~zv-p#W-M`UfI4g0;cTycBa|?hH zqEKS$Ew>pvS=_IrJi|Ye^139>MUBh*NmH zR#_|>x~!rdExp|k^78FQ*>Et^KC|N02E(&kyvBnmuXE3`?{ks?dyQQb4!*UVIi|)~ z;nY~%<`BRB3Rx*q_=DymF1ASg`2c^=RFnd5sqLo}Q!k5KlvIhy#o{1#)*n<-e9szI zl=5Kn@_7Gm8m{$?_tGeEy+TR3jm1+H&c4yfIvrvrcG%BGm?I-LSKLxXV`0iQ7kv@+ zS1E&~N=lI-hLJ-gJPiA-h(B}x6YdWhepZ*`%~p5pM#X%hx&N2`iU8Rk?`4Hp$9ST+ zl}R!`Hohi@F=}>=d!jtkL9PvGV)C4o+v+T;Sad|6YCHMD9=1G zvwxguID!|0&hhBYzbb|+ z*^2k)ta`WMrOHX(6fr}b);nQ(yB}QJ>2&)?74o_GDQS)2v%C%D-16 z@eZ*MGya#D&|{VYRW>{mjk(4GKAP&d7`u#pO&JW1IK-#N=JwPL1<{!%ey`79HFTQV zKMI=5g?2;N%o$U~9DnMO)O{|T9fVjGpSo{-I6Iss8@lE}A}QWX26T2F}W@ZTl!`^*ak`OZDt_uMsu z>*U+{p67$yoS#-~v=oaOR%0iv0^Cx3wJT3lYsOy!F! zxV-Er%j2Vb-p1%T>}y3c*xb`mmjBBr?U1W(yzDVzpJ(x(-N0*f>{p2A3~Qcvw=Cf4 zbz6+(-xZzfZ}9&vqf2D5w`8lhzQo+Y%^x3i%uoi|$YRlagj4Ika>JB6C(7h$I898j zLZ+B|qYp5O94XFB3j8BD#AVdd5H&p5;> zv)WK*R7}z?xkxlGdSt-i7rLFS*39i=bIGUbsOdl!_AQ*d@+)xS;JTi4W=6S1cJVE? ze!jzE#>l*RgV~b4ZA9O$L<{8!Ryt$-c*NZ8u9xaxs!x$>#(e69PcvdKZ27)3C&u-> zSTES^9yaISECcl(kHi0#bHWE)7gyZI92RBp=y1~CH%E#QN&h&&SyMXl{P-yGfv}J} z$Sr!C{W*Ke0FzSMDGK-xmBH{01KLW(bD;jO%rPmJf-@Z#GfNqAhU%4nBt0<(dq#wn zbPCDxXIOU(q)HRiXXiYL&bQ323?3gbV^83a`(J8~NA6AJ;#gU~>YFCc!1`kEe?z9V z`rLKHj9vK;GFqoBnsp&dc(EZXjkB7?-f|u%++LRJmn_2ksyc3AX2D-#O!_B*y*DDi z=oyv;d!Bdz@$)}occsvfy^TATt*@HJ}*5ZvpIM_fyJz-MQpF&MX62_R}>oyj4|GxQ(>!P zardww8*Jo1i+hGyQ7Ya$1k^C1Pm*Y_qbH(km_v4WrMem^XHSZe^vZ5NCKVN8=gfq*O533p9F{}4;R&Hs_;d>^EyQ>VHhAytm z&@Q|?-d|T$Q6rT6#{l2`UG}bp6=g?Db2IbUnM_;e;xkNm<=Yk}?O=PW_Hs|tItuz3CtE@Eq}Ofw(r!P$!+`T=TFkklPhxrLQEu^u@CN_H8Cm|Ex`*lvHYRh6E&iM^&$D#A z(c$@xC+-o}nP#IW?#T7g=eM~Z`!~)A@%{|)$v$Q^iiVCd$bY8@xqb5{Pv z38?Xl>%#5E9(M}&-VdiU`G?uYSB=lGeWh~7Z3gkj71L3#Eq{7U;HmX?rR}!cd72l0 z$s6P$Y43rr3~x;n)Smz2^`{07GIbtumAw zyHlg}Rhi|7%2O?6qOrrYKpC_ue;(Ln+sD3bNlJ_zR6iRYzA^A)$9T2Pbi7~mRj?HF zC7ml}2EJmPJd7S5!>J-NV6sgvZ?ka=vJ5u(%USc}llk|?ewnBnAJNyf$iGVT<>CmR z%VKK>;;_Y{YX%&mV7*%&0y;@&KiEAqX4haHFBZ$E9qFn^zZl7|8pQ9abCn}zmU87; z2CigWg(&~p!J>Hs)b}5cWY~GJ3x4N}`JE=4YzDDYtrx{}Ys$dQz8mqx+cV5y!#r^E zkCOV9HnaboAa`V)U*fs;OwnA-w;Lo&*esrD%@#L=amF1H`ZDp{#NSv(+Jf{1RR+69 zejYs6nlpo*>zNiRWAWM7=+}0QKlVsfwYi$5K3vV7s^pJ1W6f`;b${~UrHuGqS^76c z(PB}DEjm0|hck6JO^3}oEa))P;o(2s?9Y%6U)ABb4qwsX%R2nA4$C@xUWd==@L3&> z>hN!M__Pk6(&3Xjd|Zd$(&1w|+^55@>9BO|=J8}YocW*NJv#Y%o&D#AZnj^klb7r8 z5*_|nSAU+aJ-<%ALWkD_n~&nj*vED=ByHaG73Er;|C{;!pC~(DF&}N~13zLq+GhEa zva?cAcIJZj_4T%us{GZqI`A@-d%>50Z>RDjIc>*21!ue4P7yzn(pLD{C|(c#s^Mr` zoG{t>^Jw{E;(dK>Wh#HQZ43C3ZEv>CijS5{;79H$Yuf}ak0?9CYWb^eZ-Ac%KB?lq zwx58X1Aa%vy=|X?_huYz8%|)y=cBj`{7CwnZHK`7j-<6&t|~iUL%kgEK5!BI7VnHDBJws0eKhdYk4%B=xQjZrDif@aAp!3Ao-(zso{mm|>)9bAl9dS7Mj zn(9hdP3@YRWwq-bay_`F_TIHMODmSKBDx1u)Zzrhkgft&FSm%eGAflvTHk8ioO7QO>ae1C#JpWv?~_)&2Bw*3=u`p!;w$nlw0 zZI8ZLmjmPTt!k6nqD0@csjchqhiw0M(z2PO_pKiSr*s(KZ0UZvKApy3{J%u1f6FT> z7E6xh_dPIIT2OeqR9aku|BG*z9L>1cIC_C_F1tyojOx+6(7g!asLVEpf?lblu%rZd zDSf|GZ%r}|pS_uJ;ksokMKE)z+&Dfbb(E6 z!yUnm&3atvYC-q@?nE(8F-B`e`|l%?29ohdYlL)3kJbj!N#p3htsos5bBbSzWmZ%^CC8FJ^MD-|fOP9&i* zss|Uw^lnFP0@8l6tF9 z0KMiXz_tI*gM6n%dX#?)yBrqD@Ln*?gdpwqMf+XIu@m4^xOu!po|5__1MNwBAC+B8*S80TIp5#&o$uUpj=wvwbGy&y6Bh!~ChVnKMS4MRFBe%Hl;K{{WQjy&rF2O^ zq%;B{7ekOEwgB6JfKmy37rlJS(7qRLcft=4E&)Epzk~jrPM^Z7P#`XH_c*m%Jwf6sUybv9Ul2#2Os1=fcAsHz2JNOZ-8wgbwNHAC}V@hwARJlMoHwX zE8)`k8J|3k&Prex5L0tUjW8E z{S^9|r_Z$sdipoecNa;mVQRdT%I3_Hq*9qFJvEjq==t2shSSw8V=8A!>cHkrWn(;N zT1I)dZsm>`y9{fhm^Fu=O?`Fu&_LnH@YgcKo3^0sW#?c;FJ#NbTsD<2j;BiHT)`3u zrS=qd7WFLbZp{^PR%&3%$ka_?bki0!ygipUwiPE!y0yU6Ga17)C0EQ?dCBKSVK-(L z*)pwcX8n4nGwINbL$i4{Qe&78rZbk+EnQNEO;V$#nKCWCOb*&$6cC#lMk|#<+otex zNY8w$r01V;=7oezZlP%p+{L$m`+|!|8gyuvLqiVL92#+G)S(+38h2=~Lp?73=cZq} z`{rKx(c19*8-bmbH>z!-1wxhMRo75JD#7sW3ihL>LT{6KMX7h*(F;c_5~`f6_B;CB z9(~G{9J#sLyK95;&TLeEF&mNVvzlC+?Ut*v8|1xNk?+lfE3hNqoC%-5DB&|VWyu3A z5T2fwrz9DK9%2fd4r}5+7&tl;jwU4>Px_TiLh~@kbbU zT;5%)RZdhj#5#yr!-=$ik+ek8?Uy37bEW-O8IQ8N2pIb)Sqf! zwC1z)nUD1M?R?)xJ{U_J`OqroluhQR7x{=HHxc9}-EQw|t(I~wxl&M)oQxdQ!R=nrD8Lvl^+jbYTnPV9|-to?r2~WYCo-2W*~p`)pW;+ zHHwe=Vcu|BgLk@`kYBwT#u)b*`R6-stwB6h#8*XpjJb*!RZWawZngJXB9Y`h`6Jdc zBv-ILe%LtyA6OsQp^Y^1Wcvt!cM?9Z4jvy?$F0b3p-&m+J8{y^_g&-(^ShjoH>-W} zRyB#aa(-=<);{K3L#`ss74kH0T~c{kC2wBtmbWf{5qk6;lAo-t)mkF0(y#189&2pJ zA609!2r*3~-rvupJ6fA^vIM+W5bxH8oV?SqeND3+#$7q_=sKDA)QRTQiT}UUi8v7C zI!?_8IEO9?MZEnLP5tFf{l}a7LG)d_E`9XLC1M}fntiyJakLi;+Tnsenm077sNpt{ z)iQbAG_|#BOcwUuhFgHCjp;a}v)Wj(Y)g0!cNy5bchBDEv>k?p3xXrbc${$_@mg_A z+lq&+)o3qpkoO7j6TQ7fQLrp7MZR&gYD>ScYlQ$YINn=*~m>5q)D`FN|;8 zXW_mv{`|TF@To>~#f?LI2BtDbiSv~0cI=qvxM68L$$9zFbPIZ;Fvh#!f{f{vd2#>t zXA;_EF>5r)CQ!gX_dDI9`y74joVezSV)}lMv*+`q+b7Z3J}Y@3q=_(4YOIR+|Iu z|7WfCfa9QDxLf}6VXc+~&Ht-bn*hZTsKEE~Uhy4!(zkl)6Viu~5U?9IaTUSCrZax< zod0a#wU#rj7kvKgW1TYh{s$j^)b3BB`O$|Tyg!Gg)3V=hjOAnK^Ii@8#Navq!3#bb z7(N^DSLzm~>IOtu#AkqaoH;1J7ksW~f8KG+*lqy(F~@#T8R^vaU+|3}0K62T4=jNf zwSA8azSc5ABP#eSb=S%t9}IcqhW6kunmyyc;5$Yc%x(}Ckwp5Vt%s0n_D3}@xNilz z{xy*FwnKmC&_6izK4>Q}1|fGHc)#cSb2VrSa21gE%WhDko|(C&lNLEv9l%z%ezhn9*wz#}vQ+6SCt;EjMwfln$-27vE8zRhl` zeq(feL-F0jw~~4vf$rG0?Kv&FWA}^ewBFcOZF786Z#=R2SuI*B8)YMJ=%%r*Q7BRO zWqVxseFDuVfoUg}1&-Zv`R6}_Z^yo@f^AxJZN$-V_4!uCtGt1q@bK;YHS)ds%nzVJ zU&BD%zT!9Pk9hc84^&Tse$>O~8UPyj8U|eZFDyf6yl_~2T<8{`#LNlPDqH%f#C8o0 z?~Cc9xv{)HZc2=2RAH#pNo?{YIPdr=Mv<{C_v#1_=F=HY% zR@Ntt)I=5vZck$Bv8k8K`caAD$jhaiHq7ahxeR>pxfmNSS`x!yG-==!8!OQUB9Aqk z7nsE70+gFPjXlJ@=KcT5Rc6|`x47TA7b(XLN_6)ehSdIN|4TrY66N?kAYMe9-vwaTv0$E@il{Hv#$0pd7y|M1D_PaGP5(z!IPwzbnKv+O$I;`}o2@*9nGIR6VS%oRiRc~{V8X;Y5h>$^~59$aw!&R~E!pkSc diff --git a/app/src/main/jniLibs/mips/libjackpal-termexec2.so b/app/src/main/jniLibs/mips/libjackpal-termexec2.so deleted file mode 100644 index ae9d250de9f5e8a86aca6b96bb4c917dc3dd7a99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 71084 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 LN4#fNe%wC+U-&qT diff --git a/app/src/main/jniLibs/x86/libjackpal-androidterm5.so b/app/src/main/jniLibs/x86/libjackpal-androidterm5.so deleted file mode 100644 index 2d19d7a6e2b8946e55b595d2014df60269f78ca9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5240 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 diff --git a/app/src/main/jniLibs/x86/libjackpal-termexec2.so b/app/src/main/jniLibs/x86/libjackpal-termexec2.so deleted file mode 100644 index 0139a2615705b2d0a402c52097b6646a7661a5ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9300 zcmeHNeQaCR6~AfRHY=X(L0SSW@Bp`@P@JSIUAtDpS(BDRAX(BcR)*`^FR`g(8~Zt= zRR-xCmm1e#)Ce(wwr+*4+Nx33s(^;JKxk4;)fAw7OhQ`3fH~3_T`5_&GQ8jKzV}ks z?H|?toN|@pbARWYd+xdCe)wI#Jkr>-vaGC3n5A5l3llAZ(0aYDStJxOT~v#iqEbwQ zh&q!-Q72gpGTQ^n(mzuO(o`ackp83B3K4bb)Q<)v`lWsfSP%3)(34~XL(e{1KGyuT z@Mn@AGLqT<_n-&7ph*9awnAUre-6G$)YC_4foh^$jv7LoD8$!HAR&kuvRQ~1n*f~n z_7dC%JTgOwo27ob=q=Hwh%Xbu4R$$Z;RRx&(BDfSH}vmd0Mwr{mEhk1S&9Zg`^!qO zqXb`Bg0CsT^Ga}S3BIiaFE7FMC3sZ{ZYsfTC3r&#-c*9yOK`XZYbE%HCAhByKURXD z0JhZXNp^^T6rL)SS0B8gd!cDXe=1k#GT$Qujc`@i+V$*T2o`4o;CPr>{flAxEl7i z1v}8C*b)qdE}_Lk-k`P;{gFq5{!3`#i>VkzTViuG7V)X^`06lXV2{Ov>PUEFe$nX- zg(5!D9#d70%%6ygc3)Tvi9{IkEm2KGwRqUusd{3fJrdg@;;I%$5Rs@F7Qu)QmT0q3 zbf}sd?h;-t5|lcBFeX6let}s0M7~fYuIitJ(S&TEA}3u!&$#OMYF@;+IUZ;7W0(Xa zON4@(kziLm!dhJO`);|#06v3v8r&Z;D#i@l%G9%mg_O%ZHy6tTN0_()bOp#fBW9z1 zC5WX;XE;-ZxDmv?>I7X4x(=j(E>_ARyx2L#^L4t>0LOv&no+lb<9LyUXY1FEx)q#f z9?yhILpBSX=i3}m1;`G%3WOys%k}u=xlNtG9w6_jfgd>A1wI`e<`E>m{D>h`6F^nNS+)6{u?LfWP?=(3k;taVW#FykuKv5|i;!G6w z%6!Ngvl^hq*k}P|FS8k-dTc~uW;#IO*nq@b1p$7H9h8`v4=BWYBxW^GO`MaMD8rVQwEAevTO~i`CZsGv3L*fSF zD6x>3t^?h~C%=MVZxeAZ@u&J);)4?3N4$r4kHnjZ_Y>zN z_7fi@?v<6E7LuxsgAhyNp*H*KO=NBPwfNjV zIOBYO4bBR*Qqm1hOEx+3r$T`}9Q=>jL$>Q&d!82C2mgQr2Hwx)pV5sfHV)>Dl9}T? z7t;Fld+X9eZTUZAYPJvd>#a^^cklnOP{@e%8mA?_$XRHq%FIglI4e+R2!+-q@a@=m zzh`i5`sn&~>37@mKamdFbO$H$4d^zr1RfCQ9jK$310!(5OXaY|iQO$AvSyQm=m@on zZ1QcrX31B>J~gi0fZnpd{Rq;WRh^oS!i(f*!xlzST+hX0As{p)+J#6pu z&9=GP4%)w45A7(Q^$ex!2M&dM?vFC9vp zlAe&6Aw15|BbR`Y>0BTBguW{Emc4I?bq(R`y=v_B0DEn4I#UDo$M->>wQvNYZX8iS zz99dg9*L3~z?iI1345PwDh!MF0|K*VdUVg6&mMiAbBA^Bj`VBAIcYMqdOqxZ_vT2t?=5eV>btxuMrz>t3x%46qDCQPP$tGpH{^UhFBJpJ+WNeGIAvslsqW z#g}>-b}>GgZ@H?^%ViWgBbR0-Z$dX1VpVY_&oJd(jLuvOm^|4VQdl^bzv1Hinb|e- zw~%o(IVbXG=J&$<9sbt^`Fj$gOUa*{mkMOrF|lIJ{DtWiD?ra5mOaWaYk8}Ae4%#7ApZ_ZV*qK6M7!ZPC z_CjappHu6vCu_s#WXlW@0`K`^NL^krsU4u;X!!XLNoZ z)!4V_tb)2(#D{pAq|YFqJ(*cc-?XP{Ir`_EyD&I;I5I4*kh*bEGTr73TCtoF2|5A3jf?9@6fn_IYZLGXHS2UpCbiBnPgbE(n-BGv(or zmLAncm!8o+ps=3}VA~^Y6DL^Dp`MZ3RGXjSX*mt^b6xf@zUna%`u9KDCWo*dXbN@W zGc-`-(nHqicndW60+ktzpq|}5O;0xG9}_SY3C-@lQI}n-%Ra^w=6~}ATspEzw?05~ z7M8(e>^>OCNf|qf=A5hb=UdIB)ndAN27Mx2x!7~YQQalP1GsS3guLO7n&yPo+FcwO}MH zRzwmZfA}U%k+($LDHU(5qYED~@79YbaRZDRN-Y*iY!0c)LqRQ|)cDn|nyA*Q^+18eUv$;%cb91~kXfwL~ne z`i+p0kBJCz0cCKBPBpA4?XgIw5lE>GVpO`kv0{@-*szpsYZYZZ6=k!n7Ryd7Ps-x7!@`gEnjZ5WEZ{ zOtA!JAAnAv%?n1G6x%#nUT<^ku&l6ECZ{&r+*5YjD$&w`mR7W^s6T46a12$*!5!m; z!p%loImQjp59<0Q&~Jd=U8JuK>w3!gdr&v@@9?P;@usHKPxM{SzFTd3%F3U#%($@o zM&6T|+h^fp(WydV6kOOUR@$t0+Aq^A-QxDEm)*S3c>|=fl+7+*wgh{K?HsT_fsK0d z^Fkp6nR2>NSOe|`-v!)y59^{L6vJvnoxC3Lzfg4>-vdIig zW?(V{lNp%Iz+?s{Gw^?r0mXbNfzjX>4AG0<)Omr+gZN&g3D0nq;CvTCS_I7Z6TF`C z*_gLP{2CHr8$Rw;;(1Lzi=mF+mV_Tp@hU-l203qzYarw!-7oM#{-VKuXYe6|{}G%& zKfVXf_b+_M!DmzU$M+xIz@3)PX>+tfX9n=Nd0eT9w z4|D`H1bP?r31}QN4S~%9%>yk4tpu$DwS&4qJ3vo?_JNLohCuIvJ^_t`rePjtaW444 zziP#bZ!6WS?pZruS>#%*EUc}=U+rS0I*M12YDo3Q)%oWe@sVHVf-aa7G!`9^kYA~D z)zwkyiU;tXPxEdTF8|hWd~2u9wU}@Pyzzi=!7(*@B^uI%3ok_R8H>o*b1pUDX^-KB zpqQw60)Di{Yt*1ezZtqv)yz74c{_tX;p&LM3qD-ZsqPG~`h?3D>Ex|VxWW-lb#;Uj zunPHa?NVcLUP3RqaJ`YZ2D$!7Edaz^2j&{#dgU6Yoa>Urb!ir}%5}xHOFOPt(kSYt zp8iPJgP3pHabJ+QFN*CjwetT6Ogru;Qr@sbRr;bGmb7e3nHy`0G-^77jO(2JeiKA7 z?YMtQ)7gPh%>A$wn05<6)!4M8h9ZCTMObfejw6I5k=`h=gG$_0WLNyZ9@MeWAIrTU zJBYcK|5JjE$?=)Rv{NClfoRA5+zmTZM_V(52T|u(X(#^&g&Q48#>>Js^uG diff --git a/app/src/main/res/menu/menu_editor.xml b/app/src/main/res/menu/menu_editor.xml index f7c87ce2..4c085e1f 100644 --- a/app/src/main/res/menu/menu_editor.xml +++ b/app/src/main/res/menu/menu_editor.xml @@ -20,6 +20,12 @@ android:title="@string/text_force_stop" app:showAsAction="never"/> + + + + 请输入名称 名称 去设置 - 软件需要打开\"自动操作服务\"才能运行,请在随后的设置中选择\"AutoJs\"并开启服务。\n您也可以稍后在侧拉菜单中设置。 + 软件需要打开\"无障碍服务\"才能运行,请在随后的设置中选择\"AutoJs\"并开启服务。\n您也可以稍后在侧拉菜单中设置。 取消 路径为空 文件不存在 无文件读写权限 内嵌920测试 - 自动操作服务未启动,脚本已停止运行 + 无障碍服务未启动,脚本已停止运行 关闭侧拉菜单 打开侧拉菜单 撤销 @@ -31,7 +31,7 @@ 直接退出 设置 退出 - 自动操作服务 + 无障碍服务 帮助 关闭所有正在运行的脚本 关于 @@ -83,7 +83,7 @@ 请选择邮件应用 点击定位剪贴板 脚本已停止 - \"点击区域辅助服务\"是在要点击的区域不是文本时使用的,参见\"帮助\"。\"点击区域辅助服务\"只有在\"自动操作服务\"开启时才有效。 + \"点击区域辅助服务\"是在要点击的区域不是文本时使用的,参见\"帮助\"。\"点击区域辅助服务\"只有在\"无障碍服务\"开启时才有效。 请选择 崩溃了o(≧口≦)o 点击\"退出\"退出程序(ಥ _ ಥ)或者提交错误报告或者复制调试信息反馈给开发者(≧∇≦)ノ @@ -94,6 +94,7 @@ 失败 清空 控制台 + 日志 微信扫一扫 提交错误报告 Bug Report @@ -112,7 +113,7 @@ 录制结束 复制到剪贴板 文件写入失败 - 需要打开\"自动操作服务“才能录制脚本 + 需要打开\"无障碍服务“才能录制脚本 加入QQ交流群 已复制到剪贴板 关闭 @@ -127,10 +128,10 @@ 文件已存在 无障碍服务 通过Root权限自动启用服务 - 自动操作服务已启用但并未运行,这可能是安卓的BUG,您可能需要重启手机 + 无障碍服务已启用但并未运行,这可能是安卓的BUG,您可能需要重启手机 key_enable_accessibility_service_by_root - 使用Root权限启动自动操作服务超时 - 开启后运行脚本会使用Root权限自动开启自动操作服务 + 使用Root权限启动无障碍服务超时 + 开启后运行脚本会使用Root权限自动开启无障碍服务 外观 主题色 选择图片 @@ -218,6 +219,7 @@ 布局分析中,请稍后点击 强制停止 \n------------\n[%s]运行结束,用时%f秒 + 录制格式错误 diff --git a/autojs/build.gradle b/autojs/build.gradle index 0af75243..929ae653 100644 --- a/autojs/build.gradle +++ b/autojs/build.gradle @@ -20,18 +20,14 @@ android { } } - packagingOptions { - exclude 'org/mozilla/javascript/tools/debugger/build.xml' - } + } dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) testCompile 'junit:junit:4.12' - compile 'com.android.support:appcompat-v7:25.3.0' compile 'com.github.hyb1996:node-android-lib:1.0.14' compile 'org.greenrobot:eventbus:3.0.0' compile project(path: ':common') diff --git a/autojs/src/main/assets/javascript_engine_init.js b/autojs/src/main/assets/javascript_engine_init.js index e83bc520..623f39f4 100644 --- a/autojs/src/main/assets/javascript_engine_init.js +++ b/autojs/src/main/assets/javascript_engine_init.js @@ -1,11 +1,11 @@ if(__engine_name__ == "rhino"){ - __importClassOld__ = importClass; + __importClass__ = importClass; var importClass = function(pack){ if(typeof(pack) == "string"){ - __importClassOld__(Packages[pack]); + __importClass__(Packages[pack]); }else{ - __importClassOld__(pack); + __importClass__(pack); } } var loadJar = function(path){ @@ -183,23 +183,23 @@ var setClip = function(text){ var Tap = function(x, y){ - __runtime__.shellExecNotReturnResultWithRoot("input tap " + x + " " + y); + __runtime__.shellExecAsync("input tap " + x + " " + y); } var Swipe = function(x1, y1, x2, y2, duration){ if(arguments.length == 5){ - __runtime__.shellExecNotReturnResultWithRoot("input swipe " + x1 + " " + y1 + " " + x2 + " " + y2 + " " + duration); + __runtime__.shellExecAsync("input swipe " + x1 + " " + y1 + " " + x2 + " " + y2 + " " + duration); }else{ - __runtime__.shellExecNotReturnResultWithRoot("input swipe " + x1 + " " + y1 + " " + x2 + " " + y2); + __runtime__.shellExecAsync("input swipe " + x1 + " " + y1 + " " + x2 + " " + y2); } } var Screencap = function(path){ - __runtime__.shellExecNotReturnResultWithRoot("screencap -p " + path); + __runtime__.shellExecAsync("screencap -p " + path); } var KeyCode = function(keyCode){ - __runtime__.shellExecNotReturnResultWithRoot("input keyevent " + keyCode); + __runtime__.shellExecAsync("input keyevent " + keyCode); } var Home = function(){ @@ -251,7 +251,7 @@ var Camera = function(){ } var Text = function(text){ - __runtime__.shellExecNotReturnResultWithRoot("input text " + text); + __runtime__.shellExecAsync("input text " + text); } var selector = function(){ @@ -299,8 +299,6 @@ var open = function(path, mode, encoding, bufferSize){ } -//__importClassOld__(com.stardust.autojs.runtime.api.SlowShell); - var newInjectableWebClient = function(){ return new com.stardust.autojs.runtime.api.InjectableWebClient(org.mozilla.javascript.Context.getCurrentContext(), __this__); } @@ -308,11 +306,3 @@ var newInjectableWebClient = function(){ var newInjectableWebView = function(activity){ return new com.stardust.autojs.runtime.api.InjectableWebView(activity, org.mozilla.javascript.Context.getCurrentContext(), __this__); } - -/* -importClass("com.stardust.script__runtime__.service.AccessibilityDelegate"); - -var addAccessibilityDelegate = function(delegate){ - __runtime__.addAccessibilityDelegate(delegate); -} -*/ \ 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 9d50ab78..3df0c4f4 100644 --- a/autojs/src/main/java/com/stardust/autojs/ScriptEngineService.java +++ b/autojs/src/main/java/com/stardust/autojs/ScriptEngineService.java @@ -147,10 +147,9 @@ public class ScriptEngineService { @Subscribe public void onScriptExecution(ScriptExecutionEvent event) { if (event.getCode() == ScriptExecutionEvent.ON_START) { - mGlobalConsole.verbose(DateFormat.getTimeInstance().format(new Date()) + " " + mContext.getString(R.string.text_start_running) + " " + event.getMessage()); + mGlobalConsole.verbose(mContext.getString(R.string.text_start_running) + "[" + event.getMessage() + "]"); } else if (event.getCode() == ScriptExecutionEvent.ON_EXCEPTION) { mUiHandler.toast(mContext.getString(R.string.text_error) + ": " + event.getMessage()); - mGlobalConsole.error(event.getMessage()); } } diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/AbstractScriptRuntime.java b/autojs/src/main/java/com/stardust/autojs/runtime/AbstractScriptRuntime.java new file mode 100644 index 00000000..54765f27 --- /dev/null +++ b/autojs/src/main/java/com/stardust/autojs/runtime/AbstractScriptRuntime.java @@ -0,0 +1,70 @@ +package com.stardust.autojs.runtime; + +import com.stardust.autojs.engine.JavaScriptEngine; +import com.stardust.autojs.runtime.api.AbstractShell; +import com.stardust.autojs.runtime.api.AppUtils; +import com.stardust.autojs.runtime.api.Console; +import com.stardust.autojs.runtime.api.UiSelector; +import com.stardust.autojs.runtime.simple_action.SimpleActionAutomator; +import com.stardust.view.accessibility.AccessibilityInfoProvider; + +/** + * Created by Stardust on 2017/5/4. + */ + +public abstract class AbstractScriptRuntime { + + @JavascriptField + public AppUtils app; + + @JavascriptField + public Console console; + + @JavascriptField + public SimpleActionAutomator automator; + + @JavascriptField + public AccessibilityInfoProvider info; + + public AbstractScriptRuntime(AppUtils app, Console console, AccessibilityBridge bridge) { + this.app = app; + this.console = console; + this.automator = new SimpleActionAutomator(bridge, this); + this.info = bridge.getInfoProvider(); + } + + public AbstractScriptRuntime() { + } + + @JavascriptInterface + public abstract void toast(final String text); + + @JavascriptInterface + public abstract void sleep(long millis); + + @JavascriptInterface + public abstract void setClip(final String text); + + @JavascriptInterface + public abstract void shellExecAsync(String cmd); + + @JavascriptInterface + public abstract AbstractShell.Result shell(String cmd, int root); + + @JavascriptInterface + public abstract UiSelector selector(JavaScriptEngine engine); + + @JavascriptInterface + public abstract boolean isStopped(); + + @JavascriptInterface + public abstract void requiresApi(int i); + + @JavascriptInterface + public abstract void loadJar(String path); + + @JavascriptInterface + public abstract void stop(); + + public abstract void ensureAccessibilityServiceEnabled(); +} diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/ScriptRuntime.java b/autojs/src/main/java/com/stardust/autojs/runtime/ScriptRuntime.java index 50e32cc1..a1fa16d9 100644 --- a/autojs/src/main/java/com/stardust/autojs/runtime/ScriptRuntime.java +++ b/autojs/src/main/java/com/stardust/autojs/runtime/ScriptRuntime.java @@ -6,17 +6,14 @@ import com.stardust.autojs.R; import com.stardust.autojs.engine.JavaScriptEngine; import com.stardust.autojs.rhino_android.AndroidClassLoader; import com.stardust.autojs.runtime.api.AbstractShell; -import com.stardust.autojs.runtime.api.SlowShell; -import com.stardust.autojs.runtime.simple_action.SimpleActionAutomator; import com.stardust.autojs.runtime.api.AppUtils; import com.stardust.autojs.runtime.api.Console; import com.stardust.autojs.runtime.api.UiSelector; import com.stardust.pio.UncheckedIOException; import com.stardust.util.ClipboardUtil; +import com.stardust.autojs.runtime.api.ProcessShell; import com.stardust.util.SdkVersionUtil; -import com.stardust.util.Shell; import com.stardust.util.UiHandler; -import com.stardust.view.accessibility.AccessibilityInfoProvider; import org.mozilla.javascript.ContextFactory; @@ -28,42 +25,25 @@ import java.io.IOException; * Created by Stardust on 2017/1/27. */ -public class ScriptRuntime { +public class ScriptRuntime extends AbstractScriptRuntime { private static final String TAG = "ScriptRuntime"; private UiHandler mUiHandler; private AccessibilityBridge mAccessibilityBridge; - @JavascriptField - public AppUtils app; - - @JavascriptField - public Console console; - - @JavascriptField - public SimpleActionAutomator automator; - - @JavascriptField - public AccessibilityInfoProvider info; - private AbstractShell mRootShell; public ScriptRuntime(UiHandler uiHandler, Console console, AccessibilityBridge accessibilityBridge) { + super(new AppUtils(uiHandler.getContext()), console, accessibilityBridge); mAccessibilityBridge = accessibilityBridge; mUiHandler = uiHandler; - app = new AppUtils(uiHandler.getContext()); - info = accessibilityBridge.getInfoProvider(); - this.console = console; - automator = new SimpleActionAutomator(accessibilityBridge, this); } - @JavascriptInterface public void toast(final String text) { mUiHandler.toast(text); } - @JavascriptInterface public void sleep(long millis) { try { Thread.sleep(millis); @@ -72,7 +52,6 @@ public class ScriptRuntime { } } - @JavascriptInterface public void setClip(final String text) { mUiHandler.post(new Runnable() { @Override @@ -82,38 +61,31 @@ public class ScriptRuntime { }); } - - @JavascriptInterface - public void shellExecNotReturnResultWithRoot(String cmd) { + public void shellExecAsync(String cmd) { if (mRootShell == null) { - mRootShell = new SlowShell(true); + mRootShell = new ProcessShell(true); } mRootShell.exec(cmd); } - @JavascriptInterface - public Shell.CommandResult shell(String cmd, int root) { - return Shell.execCommand(cmd, root != 0); + public AbstractShell.Result shell(String cmd, int root) { + return ProcessShell.exec(cmd, root != 0); } - @JavascriptInterface public UiSelector selector(JavaScriptEngine engine) { return new UiSelector(mAccessibilityBridge); } - @JavascriptInterface public boolean isStopped() { return Thread.currentThread().isInterrupted(); } - @JavascriptInterface public void requiresApi(int i) { if (Build.VERSION.SDK_INT < i) { throw new ScriptStopException(mUiHandler.getContext().getString(R.string.text_requires_sdk_version_to_run_the_script) + SdkVersionUtil.sdkIntToString(i)); } } - @JavascriptInterface public void loadJar(String path) { try { ((AndroidClassLoader) ContextFactory.getGlobal().getApplicationClassLoader()).loadJar(new File(path)); @@ -122,7 +94,6 @@ public class ScriptRuntime { } } - @JavascriptInterface public void stop() { Thread.interrupted(); } diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/AbstractConsole.java b/autojs/src/main/java/com/stardust/autojs/runtime/api/AbstractConsole.java similarity index 94% rename from autojs/src/main/java/com/stardust/autojs/runtime/AbstractConsole.java rename to autojs/src/main/java/com/stardust/autojs/runtime/api/AbstractConsole.java index 7b3453cf..def8c72b 100644 --- a/autojs/src/main/java/com/stardust/autojs/runtime/AbstractConsole.java +++ b/autojs/src/main/java/com/stardust/autojs/runtime/api/AbstractConsole.java @@ -1,8 +1,9 @@ -package com.stardust.autojs.runtime; +package com.stardust.autojs.runtime.api; import android.support.annotation.Nullable; import android.util.Log; +import com.stardust.autojs.runtime.ScriptStopException; import com.stardust.autojs.runtime.api.Console; /** diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/api/AbstractShell.java b/autojs/src/main/java/com/stardust/autojs/runtime/api/AbstractShell.java index cc36b95d..459f4e15 100644 --- a/autojs/src/main/java/com/stardust/autojs/runtime/api/AbstractShell.java +++ b/autojs/src/main/java/com/stardust/autojs/runtime/api/AbstractShell.java @@ -1,23 +1,110 @@ package com.stardust.autojs.runtime.api; +import android.text.TextUtils; + +import com.stardust.util.ScreenMetrics; + +import java.util.Arrays; + /** * Created by Stardust on 2017/4/24. */ public abstract class AbstractShell { + + public static class Result { + public int code = -1; + public String error; + public String result; + + @Override + public String toString() { + return "ShellResult{" + + "code=" + code + + ", error='" + error + '\'' + + ", result='" + result + '\'' + + '}'; + } + } + + private static final String COMMAND_SU = "su"; + private static final String COMMAND_SH = "sh"; + static final String COMMAND_EXIT = "exit\n"; + static final String COMMAND_LINE_END = "\n"; + + + private int mTouchDevice; + private int mScreenHeight, mScreenWidth; + + private boolean mRoot; + public AbstractShell() { this(false); } public AbstractShell(boolean root) { - init(root ? "su" : "sh"); + mRoot = root; + init(root ? COMMAND_SU: COMMAND_SH); + } + + public boolean isRoot() { + return mRoot; } protected abstract void init(String initialCommand); public abstract void exec(String command); + public abstract void exit(); + + public void SetTouchDevice(int touchDevice) { + mTouchDevice = touchDevice; + } + + public void SendEvent(int type, int code, int value){ + SendEvent(mTouchDevice, type, code, value); + } + + public void SendEvent(int device, int type, int code, int value){ + exec(TextUtils.join("", new Object[]{"sendevent /dev/input/event", device, " ", type, " ", code, " ", value})); + } + + public void SetScreenScale(int width, int height){ + mScreenWidth = width; + mScreenHeight = height; + } + + public void Touch(int x, int y){ + TouchX(x); + TouchY(y); + } + + public void TouchX(int x) { + SendEvent(mTouchDevice, 3, 53, scaleX(x)); + } + + private int scaleX(int x) { + int screenWidth = ScreenMetrics.getScreenWidth(); + if(screenWidth == mScreenWidth){ + return x; + } + return x * screenWidth / mScreenWidth; + } + + public void TouchY(int y) { + SendEvent(mTouchDevice, 3, 54, scaleY(y)); + } + + private int scaleY(int y) { + int screenHeight = ScreenMetrics.getScreenHeight(); + if(screenHeight == mScreenHeight){ + return y; + } + return y * screenHeight / mScreenHeight; + } + + public void KeyCode(int keyCode) { exec("input keyevent " + keyCode); } @@ -77,4 +164,6 @@ public abstract class AbstractShell { public void Text(String text) { exec("input text " + text); } + + public abstract void exitAndWaitFor(); } diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/api/ProcessShell.java b/autojs/src/main/java/com/stardust/autojs/runtime/api/ProcessShell.java new file mode 100644 index 00000000..fe33764a --- /dev/null +++ b/autojs/src/main/java/com/stardust/autojs/runtime/api/ProcessShell.java @@ -0,0 +1,176 @@ +package com.stardust.autojs.runtime.api; + + +import com.stardust.pio.UncheckedIOException; + +import java.io.BufferedReader; +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.InputStreamReader; + +/** + * Created by Stardust on 2017/1/20. + *

+ * 来自网络~~ + */ + +public class ProcessShell extends AbstractShell implements AutoCloseable { + + private static final String TAG = "ProcessShell"; + + private Process mProcess; + private DataOutputStream mCommandOutputStream; + private BufferedReader mSucceedReader; + private BufferedReader mErrorReader; + + private StringBuilder mSucceedOutput = new StringBuilder(); + private StringBuilder mErrorOutput = new StringBuilder(); + + public ProcessShell() { + + } + + public ProcessShell(boolean root) { + super(root); + } + + @Override + protected void init(String initialCommand) { + try { + mProcess = new ProcessBuilder(initialCommand).redirectErrorStream(true).start(); + mCommandOutputStream = new DataOutputStream(mProcess.getOutputStream()); + mSucceedReader = new BufferedReader(new InputStreamReader(mProcess.getInputStream())); + mErrorReader = new BufferedReader(new InputStreamReader(mProcess.getErrorStream())); + } catch (IOException e) { + throw new UncheckedIOException(e); + } + } + + @Override + public void exec(String command) { + try { + mCommandOutputStream.writeBytes(command); + if (!command.endsWith(COMMAND_LINE_END)) { + mCommandOutputStream.writeBytes(COMMAND_LINE_END); + } + mCommandOutputStream.flush(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + @Override + public void exit() { + if(mProcess != null) { + mProcess.destroy(); + mProcess = null; + } + if(mSucceedReader != null){ + try{ + mSucceedReader.close(); + }catch (IOException ignored){ + + } + mSucceedReader = null; + } + if(mErrorReader != null){ + try{ + mErrorReader.close(); + }catch (IOException ignored){ + + } + mErrorReader = null; + } + + } + + @Override + public void close() { + exit(); + } + + @Override + public void exitAndWaitFor() { + exec(COMMAND_EXIT); + waitFor(); + exit(); + } + + public int waitFor() { + try { + return mProcess.waitFor(); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + + public ProcessShell readAll() { + return readSucceedOutput().readErrorOutput(); + } + + public ProcessShell readSucceedOutput() { + try { + while (mSucceedReader.ready()) { + String line = mSucceedReader.readLine(); + mSucceedOutput.append(line).append("\n"); + } + } catch (IOException e) { + throw new UncheckedIOException(e); + } + return this; + } + + public ProcessShell readErrorOutput() { + String line; + try { + while ((line = mErrorReader.readLine()) != null) { + mErrorOutput.append(line).append("\n"); + } + } catch (IOException e) { + throw new UncheckedIOException(e); + } + return this; + } + + public StringBuilder getSucceedOutput() { + return mSucceedOutput; + } + + public StringBuilder getErrorOutput() { + return mErrorOutput; + } + + public Process getProcess() { + return mProcess; + } + + public BufferedReader getSucceedReader() { + return mSucceedReader; + } + + public BufferedReader getErrorReader() { + return mErrorReader; + } + + public static Result exec(String command, boolean isRoot) { + String[] commands = command.split("\n"); + return exec(commands, isRoot); + } + + public static Result exec(String[] commands, boolean isRoot) { + try(ProcessShell shell = new ProcessShell(isRoot)){ + for(String command : commands){ + shell.exec(command); + } + shell.exec(COMMAND_EXIT); + Result result = new Result(); + result.code = shell.waitFor(); + shell.readAll(); + result.error = shell.getErrorOutput().toString(); + result.result = shell.getSucceedOutput().toString(); + shell.exit(); + return result; + } + } + +} \ No newline at end of file diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/api/SlowShell.java b/autojs/src/main/java/com/stardust/autojs/runtime/api/SlowShell.java deleted file mode 100644 index eb113030..00000000 --- a/autojs/src/main/java/com/stardust/autojs/runtime/api/SlowShell.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.stardust.autojs.runtime.api; - -import com.stardust.util.Shell; - -/** - * Created by Stardust on 2017/3/7. - */ - -public class SlowShell extends AbstractShell { - - private Shell mShell; - - public SlowShell(boolean root) { - super(root); - } - - @Override - protected void init(String initialCommand) { - mShell = new Shell(initialCommand); - } - - @Override - public void exec(String command) { - mShell.execute(command); - } - - -} diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/simple_action/SimpleActionAutomator.java b/autojs/src/main/java/com/stardust/autojs/runtime/simple_action/SimpleActionAutomator.java index a8a847d3..632a54d5 100644 --- a/autojs/src/main/java/com/stardust/autojs/runtime/simple_action/SimpleActionAutomator.java +++ b/autojs/src/main/java/com/stardust/autojs/runtime/simple_action/SimpleActionAutomator.java @@ -8,6 +8,7 @@ import android.util.Log; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityNodeInfo; +import com.stardust.autojs.runtime.AbstractScriptRuntime; import com.stardust.autojs.runtime.AccessibilityBridge; import com.stardust.autojs.runtime.JavascriptInterface; import com.stardust.autojs.runtime.ScriptRuntime; @@ -45,9 +46,9 @@ public class SimpleActionAutomator { } private AccessibilityBridge mAccessibilityBridge; - private ScriptRuntime mScriptRuntime; + private AbstractScriptRuntime mScriptRuntime; - public SimpleActionAutomator(AccessibilityBridge accessibilityBridge, ScriptRuntime scriptRuntime) { + public SimpleActionAutomator(AccessibilityBridge accessibilityBridge, AbstractScriptRuntime scriptRuntime) { mAccessibilityBridge = accessibilityBridge; mScriptRuntime = scriptRuntime; } diff --git a/autojs/src/main/java/com/stardust/autojs/script/MultiScriptSource.java b/autojs/src/main/java/com/stardust/autojs/script/MultiScriptSource.java deleted file mode 100644 index 9903cb33..00000000 --- a/autojs/src/main/java/com/stardust/autojs/script/MultiScriptSource.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.stardust.autojs.script; - -/** - * Created by Stardust on 2017/4/2. - */ - -public class MultiScriptSource extends ScriptSource { - - private String mScript; - private FileScriptSource mFileScriptSource; - - - public MultiScriptSource(StringScriptSource stringScriptSource, FileScriptSource fileScriptSource) { - super(fileScriptSource.getName()); - mFileScriptSource = fileScriptSource; - StringBuilder stringBuilder = new StringBuilder(); - if (stringScriptSource.getScript() != null) - stringBuilder.append(stringScriptSource.getScript()).append("\n"); - stringBuilder.append(fileScriptSource.getScript()); - mScript = stringBuilder.toString(); - } - - @Override - public String getScript() { - return mScript; - } - - @Override - public String toString() { - return mFileScriptSource.toString(); - } - -} diff --git a/autojs/src/main/java/com/stardust/autojs/script/ScriptSourceWithInit.java b/autojs/src/main/java/com/stardust/autojs/script/ScriptSourceWithInit.java new file mode 100644 index 00000000..c85257f1 --- /dev/null +++ b/autojs/src/main/java/com/stardust/autojs/script/ScriptSourceWithInit.java @@ -0,0 +1,33 @@ +package com.stardust.autojs.script; + +/** + * Created by Stardust on 2017/4/2. + */ + +public class ScriptSourceWithInit extends ScriptSource { + + private String mScript; + private ScriptSource mMainScriptSource; + + + public ScriptSourceWithInit(ScriptSource initScriptSource, ScriptSource mainScriptSource) { + super(mainScriptSource.getName()); + mMainScriptSource = mainScriptSource; + StringBuilder stringBuilder = new StringBuilder(); + if (initScriptSource.getScript() != null) + stringBuilder.append(initScriptSource.getScript()).append("\n"); + stringBuilder.append(mainScriptSource.getScript()); + mScript = stringBuilder.toString(); + } + + @Override + public String getScript() { + return mScript; + } + + @Override + public String toString() { + return mMainScriptSource.toString(); + } + +} diff --git a/automator/build.gradle b/automator/build.gradle index b98a5471..4c1f3072 100644 --- a/automator/build.gradle +++ b/automator/build.gradle @@ -22,11 +22,9 @@ android { } dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) - compile 'com.android.support:appcompat-v7:25.2.0' testCompile 'junit:junit:4.12' compile project(path: ':common') } diff --git a/common/build.gradle b/common/build.gradle index 5e4b8d4b..b8009e44 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -22,7 +22,6 @@ android { } dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) diff --git a/common/src/main/java/com/stardust/util/AssetsCache.java b/common/src/main/java/com/stardust/util/AssetsCache.java index 5458a7d7..06bbc269 100644 --- a/common/src/main/java/com/stardust/util/AssetsCache.java +++ b/common/src/main/java/com/stardust/util/AssetsCache.java @@ -2,15 +2,9 @@ package com.stardust.util; import android.app.Activity; import android.content.res.AssetManager; -import android.support.v4.app.FragmentActivity; - import com.stardust.pio.PFile; -import java.io.IOException; -import java.util.HashMap; -import java.util.Map; - /** * Created by Stardust on 2017/3/14. */ diff --git a/common/src/main/java/com/stardust/util/Shell.java b/common/src/main/java/com/stardust/util/Shell.java deleted file mode 100644 index b51dd7e4..00000000 --- a/common/src/main/java/com/stardust/util/Shell.java +++ /dev/null @@ -1,264 +0,0 @@ -package com.stardust.util; - -import android.util.Log; - - -import java.io.BufferedReader; -import java.io.DataOutputStream; -import java.io.IOException; -import java.io.InputStreamReader; - -/** - * Created by Stardust on 2017/1/20. - *

- * 来自网络~~ - */ - -public class Shell { - - - private static final String TAG = "Shell"; - - private final static String COMMAND_SU = "su"; - private final static String COMMAND_SH = "sh"; - private final static String COMMAND_EXIT = "exit\n"; - private final static String COMMAND_LINE_END = "\n"; - - private Process mProcess; - private DataOutputStream mCommandOutputStream; - private BufferedReader mSucceedReader; - private BufferedReader mErrorReader; - - private StringBuilder mSucceedOutput = new StringBuilder(); - private StringBuilder mErrorOutput = new StringBuilder(); - - public Shell() { - this(false); - } - - public Shell(boolean root) { - this(root ? COMMAND_SU : COMMAND_SH); - } - - public Shell(String initialCommand) { - try { - mProcess = new ProcessBuilder(initialCommand).redirectErrorStream(true).start(); - mCommandOutputStream = new DataOutputStream(mProcess.getOutputStream()); - mSucceedReader = new BufferedReader(new InputStreamReader(mProcess.getInputStream())); - mErrorReader = new BufferedReader(new InputStreamReader(mProcess.getErrorStream())); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - public Shell execute(String command) { - try { - mCommandOutputStream.writeBytes(command); - if (!command.endsWith(COMMAND_LINE_END)) { - mCommandOutputStream.writeBytes(COMMAND_LINE_END); - } - mCommandOutputStream.flush(); - } catch (IOException e) { - throw new RuntimeException(e); - } - return this; - } - - public Shell exitAndWaitFor() { - exit(); - try { - mProcess.waitFor(); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - return this; - } - - public Shell readAll() { - return readSucceedOutput().readErrorOutput(); - } - - public Shell readSucceedOutput() { - try { - while (mSucceedReader.ready()) { - String line = mSucceedReader.readLine(); - mSucceedOutput.append(line).append("\n"); - } - } catch (IOException e) { - throw new RuntimeException(e); - } - return this; - } - - public Shell readErrorOutput() { - String line; - try { - while ((line = mErrorReader.readLine()) != null) { - mErrorOutput.append(line).append("\n"); - } - } catch (IOException e) { - throw new RuntimeException(e); - } - return this; - } - - public StringBuilder getSucceedOutput() { - return mSucceedOutput; - } - - public StringBuilder getErrorOutput() { - return mErrorOutput; - } - - public Shell exit() { - execute(COMMAND_EXIT); - return this; - } - - public Shell destroy() { - mProcess.destroy(); - return this; - } - - public Process getProcess() { - return mProcess; - } - - public BufferedReader getSucceedReader() { - return mSucceedReader; - } - - public BufferedReader getErrorReader() { - return mErrorReader; - } - - public int waitFor() { - try { - return mProcess.waitFor(); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - } - - /** - * Command执行结果 - * - * @author Mountain - */ - public static class CommandResult { - public int code = -1; - public String error; - public String result; - - @Override - public String toString() { - return "ShellResult{" + - "code=" + code + - ", error='" + error + '\'' + - ", result='" + result + '\'' + - '}'; - } - } - - /** - * 执行命令—单条 - * - * @param command - * @param isRoot - * @return - */ - public static CommandResult execCommand(String command, boolean isRoot) { - String[] commands = command.split("\n"); - return execCommand(commands, isRoot); - } - - /** - * 执行命令-多条 - * - * @param commands - * @param isRoot - * @return - */ - public static CommandResult execCommand(String[] commands, boolean isRoot) { - CommandResult commandResult = new CommandResult(); - if (commands == null || commands.length == 0) return commandResult; - Process process = null; - DataOutputStream os = null; - BufferedReader successResult = null; - BufferedReader errorResult = null; - StringBuilder successMsg = null; - StringBuilder errorMsg = null; - try { - process = Runtime.getRuntime().exec(isRoot ? COMMAND_SU : COMMAND_SH); - os = new DataOutputStream(process.getOutputStream()); - for (String command : commands) { - if (command != null) { - os.write(command.getBytes()); - os.writeBytes(COMMAND_LINE_END); - os.flush(); - } - } - os.writeBytes(COMMAND_EXIT); - os.flush(); - commandResult.code = process.waitFor(); - //获取错误信息 - successMsg = new StringBuilder(); - errorMsg = new StringBuilder(); - successResult = new BufferedReader(new InputStreamReader(process.getInputStream())); - errorResult = new BufferedReader(new InputStreamReader(process.getErrorStream())); - String s; - while ((s = successResult.readLine()) != null) successMsg.append(s); - while ((s = errorResult.readLine()) != null) errorMsg.append(s); - commandResult.result = successMsg.toString(); - commandResult.error = errorMsg.toString(); - Log.i(TAG, commandResult.toString()); - } catch (Exception e) { - String errmsg = e.getMessage(); - if (errmsg != null) { - Log.e(TAG, errmsg); - } else { - e.printStackTrace(); - } - } finally { - try { - if (os != null) os.close(); - if (successResult != null) successResult.close(); - if (errorResult != null) errorResult.close(); - } catch (IOException e) { - String errmsg = e.getMessage(); - if (errmsg != null) { - Log.e(TAG, errmsg); - } else { - e.printStackTrace(); - } - } - if (process != null) process.destroy(); - } - return commandResult; - } - - public static Process exec(String[] commands, boolean isRoot) { - try { - Process process = Runtime.getRuntime().exec(isRoot ? COMMAND_SU : COMMAND_SH); - DataOutputStream os = new DataOutputStream(process.getOutputStream()); - for (String command : commands) { - if (command != null) { - os.write(command.getBytes()); - os.writeBytes(COMMAND_LINE_END); - os.flush(); - } - } - os.writeBytes(COMMAND_EXIT); - os.flush(); - os.close(); - return process; - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - public static Process exec(String command, boolean isRoot) { - return exec(command.split("\n"), isRoot); - } -} \ No newline at end of file diff --git a/common/src/main/java/com/stardust/util/TextUtils.java b/common/src/main/java/com/stardust/util/TextUtils.java new file mode 100644 index 00000000..261d6f4a --- /dev/null +++ b/common/src/main/java/com/stardust/util/TextUtils.java @@ -0,0 +1,12 @@ +package com.stardust.util; + +/** + * Created by Stardust on 2017/5/3. + */ + +public class TextUtils { + + public static String join(CharSequence delimiter, Object... tokens){ + return android.text.TextUtils.join(delimiter, tokens); + } +}