make autojs module more independent
1
.idea/gradle.xml
generated
@@ -12,6 +12,7 @@
|
|||||||
<option value="$PROJECT_DIR$/autojs" />
|
<option value="$PROJECT_DIR$/autojs" />
|
||||||
<option value="$PROJECT_DIR$/automator" />
|
<option value="$PROJECT_DIR$/automator" />
|
||||||
<option value="$PROJECT_DIR$/common" />
|
<option value="$PROJECT_DIR$/common" />
|
||||||
|
<option value="$PROJECT_DIR$/inrt" />
|
||||||
</set>
|
</set>
|
||||||
</option>
|
</option>
|
||||||
<option name="resolveModulePerSourceSet" value="false" />
|
<option name="resolveModulePerSourceSet" value="false" />
|
||||||
|
|||||||
1
.idea/modules.xml
generated
@@ -7,6 +7,7 @@
|
|||||||
<module fileurl="file://$PROJECT_DIR$/autojs/autojs.iml" filepath="$PROJECT_DIR$/autojs/autojs.iml" />
|
<module fileurl="file://$PROJECT_DIR$/autojs/autojs.iml" filepath="$PROJECT_DIR$/autojs/autojs.iml" />
|
||||||
<module fileurl="file://$PROJECT_DIR$/automator/automator.iml" filepath="$PROJECT_DIR$/automator/automator.iml" />
|
<module fileurl="file://$PROJECT_DIR$/automator/automator.iml" filepath="$PROJECT_DIR$/automator/automator.iml" />
|
||||||
<module fileurl="file://$PROJECT_DIR$/common/common.iml" filepath="$PROJECT_DIR$/common/common.iml" />
|
<module fileurl="file://$PROJECT_DIR$/common/common.iml" filepath="$PROJECT_DIR$/common/common.iml" />
|
||||||
|
<module fileurl="file://$PROJECT_DIR$/inrt/inrt.iml" filepath="$PROJECT_DIR$/inrt/inrt.iml" />
|
||||||
</modules>
|
</modules>
|
||||||
</component>
|
</component>
|
||||||
</project>
|
</project>
|
||||||
@@ -97,7 +97,6 @@ dependencies {
|
|||||||
compile 'com.android.support:multidex:1.0.1'
|
compile 'com.android.support:multidex:1.0.1'
|
||||||
// Personal libraries
|
// Personal libraries
|
||||||
compile 'com.github.hyb1996:MutableTheme:0.2.2'
|
compile 'com.github.hyb1996:MutableTheme:0.2.2'
|
||||||
compile 'com.github.hyb1996:EnhancedFloaty:0.17'
|
|
||||||
// Material Dialogs
|
// Material Dialogs
|
||||||
compile 'com.afollestad.material-dialogs:core:0.9.2.3'
|
compile 'com.afollestad.material-dialogs:core:0.9.2.3'
|
||||||
// Gson
|
// Gson
|
||||||
@@ -121,10 +120,6 @@ dependencies {
|
|||||||
compile 'com.android.volley:volley:1.0.0'
|
compile 'com.android.volley:volley:1.0.0'
|
||||||
compile 'com.flurry.android:analytics:7.0.0@aar'
|
compile 'com.flurry.android:analytics:7.0.0@aar'
|
||||||
compile 'com.pushtorefresh.storio:sqlite:1.12.3'
|
compile 'com.pushtorefresh.storio:sqlite:1.12.3'
|
||||||
// Terminal emulator
|
|
||||||
compile(name: 'libtermexec-release', ext: 'aar')
|
|
||||||
compile(name: 'emulatorview-release', ext: 'aar')
|
|
||||||
compile(name: 'term-debug', ext: 'aar')
|
|
||||||
// 920 Text Editor
|
// 920 Text Editor
|
||||||
compile 'com.afollestad.material-dialogs:commons:0.9.2.3'
|
compile 'com.afollestad.material-dialogs:commons:0.9.2.3'
|
||||||
compile 'com.makeramen:roundedimageview:2.2.1'
|
compile 'com.makeramen:roundedimageview:2.2.1'
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
android:theme="@style/AppTheme"
|
android:theme="@style/AppTheme"
|
||||||
tools:replace="android:label, android:icon, android:allowBackup">
|
tools:replace="android:label, android:icon, android:allowBackup">
|
||||||
<activity
|
<activity
|
||||||
android:name=".ui.main.MainActivity"
|
android:name=".ui.main.MainActivity_"
|
||||||
android:hardwareAccelerated="true"
|
android:hardwareAccelerated="true"
|
||||||
android:label="@string/_app_name"
|
android:label="@string/_app_name"
|
||||||
android:launchMode="singleTask"
|
android:launchMode="singleTask"
|
||||||
@@ -46,21 +46,6 @@
|
|||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
<service
|
|
||||||
android:name=".service.AccessibilityWatchDogService"
|
|
||||||
android:enabled="true"
|
|
||||||
android:exported="true"
|
|
||||||
android:label="@string/_app_name"
|
|
||||||
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
|
|
||||||
<intent-filter>
|
|
||||||
<action android:name="android.accessibilityservice.AccessibilityService"/>
|
|
||||||
</intent-filter>
|
|
||||||
<meta-data
|
|
||||||
android:name="android.accessibilityservice"
|
|
||||||
android:resource="@xml/accessibility_service_config"/>
|
|
||||||
|
|
||||||
</service>
|
|
||||||
|
|
||||||
<provider
|
<provider
|
||||||
android:name="android.support.v4.content.FileProvider"
|
android:name="android.support.v4.content.FileProvider"
|
||||||
android:authorities="com.stardust.scriptdroid.fileprovider"
|
android:authorities="com.stardust.scriptdroid.fileprovider"
|
||||||
@@ -72,21 +57,21 @@
|
|||||||
</provider>
|
</provider>
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name=".ui.edit.EditActivity"
|
android:name=".ui.edit.EditActivity_"
|
||||||
android:multiprocess="true">
|
android:multiprocess="true">
|
||||||
|
|
||||||
</activity>
|
</activity>
|
||||||
<activity android:name=".ui.help.DocumentationActivity"/>
|
<activity android:name=".ui.help.DocumentationActivity"/>
|
||||||
<activity android:name=".ui.help.HelpCatalogueActivity"/>
|
<activity android:name=".ui.help.HelpCatalogueActivity"/>
|
||||||
<activity android:name=".ui.settings.AboutActivity"/>
|
<activity android:name=".ui.settings.AboutActivity_"/>
|
||||||
<activity android:name=".ui.settings.SettingsActivity"/>
|
<activity android:name=".ui.settings.SettingsActivity_"/>
|
||||||
<activity android:name=".ui.console.LogActivity"/>
|
<activity android:name=".ui.console.LogActivity_"/>
|
||||||
<activity android:name=".ui.error.ErrorReportActivity"/>
|
<activity android:name=".ui.error.ErrorReportActivity"/>
|
||||||
<activity android:name=".ui.help.LocalWebViewActivity"/>
|
<activity android:name=".ui.help.LocalWebViewActivity"/>
|
||||||
<activity android:name=".external.tasker.TaskerScriptEditActivity"/>
|
<activity android:name=".external.tasker.TaskerScriptEditActivity"/>
|
||||||
<activity android:name=".ui.edit.ViewSampleActivity"/>
|
<activity android:name=".ui.edit.ViewSampleActivity"/>
|
||||||
<activity
|
<activity
|
||||||
android:name=".autojs.api.ScreenCaptureRequestActivity"
|
android:name="com.stardust.autojs.runtime.api.image.ScreenCaptureRequestActivity"
|
||||||
android:taskAffinity="com.stardust.scriptdroid.autojs.api.ScreenCaptureRequestActivity"/>
|
android:taskAffinity="com.stardust.scriptdroid.autojs.api.ScreenCaptureRequestActivity"/>
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
|
|||||||
@@ -1,65 +0,0 @@
|
|||||||
__importClass__(com.stardust.scriptdroid.autojs.api.Shell);
|
|
||||||
|
|
||||||
|
|
||||||
var dialogs = {};
|
|
||||||
|
|
||||||
dialogs.rawInput = function(title, prefill){
|
|
||||||
prefill = prefill || "";
|
|
||||||
var s = __runtime__.dialogs.rawInput(title, prefill);
|
|
||||||
return s ? String(s) : null;
|
|
||||||
};
|
|
||||||
|
|
||||||
dialogs.input = function(title, prefill){
|
|
||||||
return eval(dialogs.rawInput(title, prefill));
|
|
||||||
}
|
|
||||||
|
|
||||||
dialogs.prompt = dialogs.rawInput;
|
|
||||||
|
|
||||||
dialogs.alert = function(title, prefill){
|
|
||||||
prefill = prefill || "";
|
|
||||||
return __runtime__.dialogs.alert(title, prefill);
|
|
||||||
}
|
|
||||||
|
|
||||||
dialogs.confirm = function(title, prefill){
|
|
||||||
prefill = prefill || "";
|
|
||||||
return __runtime__.dialogs.confirm(title, prefill);
|
|
||||||
}
|
|
||||||
|
|
||||||
dialogs.select = function(title, items){
|
|
||||||
if(items instanceof Array){
|
|
||||||
return __runtime__.dialogs.select(title, items);
|
|
||||||
}
|
|
||||||
return __runtime__.dialogs.select(title, [].slice.call(arguments, 1));
|
|
||||||
}
|
|
||||||
|
|
||||||
dialogs.singleChoice = function(title, items, index){
|
|
||||||
index = index || 0;
|
|
||||||
return __runtime__.dialogs.singleChoice(title, index, items);
|
|
||||||
}
|
|
||||||
|
|
||||||
dialogs.multiChoice = function(title, items, index){
|
|
||||||
index = index || [];
|
|
||||||
var javaArray = __runtime__.dialogs.multiChoice(title, index, items);
|
|
||||||
var jsArray = [];
|
|
||||||
var len = javaArray.length;
|
|
||||||
for (var i = 0;i < len;i++){
|
|
||||||
jsArray.push(javaArray[i]);
|
|
||||||
}
|
|
||||||
return jsArray;
|
|
||||||
}
|
|
||||||
|
|
||||||
var rawInput = function(title, prefill){
|
|
||||||
return dialogs.rawInput(title, prefill);
|
|
||||||
}
|
|
||||||
|
|
||||||
var alert = function(title, prefill){
|
|
||||||
dialogs.alert(title, prefill);
|
|
||||||
}
|
|
||||||
|
|
||||||
var confirm = function(title, prefill){
|
|
||||||
return dialogs.confirm(title, prefill);
|
|
||||||
}
|
|
||||||
|
|
||||||
var prompt = function(title, prefill){
|
|
||||||
return dialogs.prompt(title, prefill);
|
|
||||||
}
|
|
||||||
@@ -46,7 +46,6 @@ public class App extends MultiDexApplication {
|
|||||||
setUpStaticsTool();
|
setUpStaticsTool();
|
||||||
setUpDebugEnvironment();
|
setUpDebugEnvironment();
|
||||||
init();
|
init();
|
||||||
registerActivityLifecycleCallback();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setUpStaticsTool() {
|
private void setUpStaticsTool() {
|
||||||
@@ -83,9 +82,6 @@ public class App extends MultiDexApplication {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void registerActivityLifecycleCallback() {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public static String getResString(int id) {
|
public static String getResString(int id) {
|
||||||
return getApp().getString(id);
|
return getApp().getString(id);
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
package com.stardust.scriptdroid.autojs;
|
package com.stardust.scriptdroid.autojs;
|
||||||
|
|
||||||
import android.accessibilityservice.AccessibilityService;
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
@@ -15,33 +14,31 @@ import com.stardust.autojs.ScriptEngineServiceBuilder;
|
|||||||
import com.stardust.autojs.engine.RhinoJavaScriptEngineManager;
|
import com.stardust.autojs.engine.RhinoJavaScriptEngineManager;
|
||||||
import com.stardust.autojs.engine.ScriptEngineManager;
|
import com.stardust.autojs.engine.ScriptEngineManager;
|
||||||
import com.stardust.autojs.runtime.AccessibilityBridge;
|
import com.stardust.autojs.runtime.AccessibilityBridge;
|
||||||
|
import com.stardust.autojs.runtime.ScriptRuntime;
|
||||||
import com.stardust.autojs.runtime.ScriptStopException;
|
import com.stardust.autojs.runtime.ScriptStopException;
|
||||||
import com.stardust.autojs.runtime.api.AbstractShell;
|
import com.stardust.autojs.runtime.api.AbstractShell;
|
||||||
import com.stardust.autojs.runtime.api.AppUtils;
|
import com.stardust.autojs.runtime.api.AppUtils;
|
||||||
|
import com.stardust.autojs.runtime.api.Console;
|
||||||
import com.stardust.autojs.runtime.api.image.ScreenCaptureRequester;
|
import com.stardust.autojs.runtime.api.image.ScreenCaptureRequester;
|
||||||
import com.stardust.automator.AccessibilityEventCommandHost;
|
import com.stardust.automator.AccessibilityEventCommandHost;
|
||||||
import com.stardust.automator.simple_action.SimpleActionPerformHost;
|
import com.stardust.automator.simple_action.SimpleActionPerformHost;
|
||||||
import com.stardust.pio.PFile;
|
|
||||||
import com.stardust.pio.UncheckedIOException;
|
|
||||||
import com.stardust.scriptdroid.App;
|
import com.stardust.scriptdroid.App;
|
||||||
import com.stardust.scriptdroid.Pref;
|
import com.stardust.scriptdroid.Pref;
|
||||||
import com.stardust.scriptdroid.R;
|
import com.stardust.scriptdroid.R;
|
||||||
import com.stardust.scriptdroid.autojs.api.ScreenCaptureRequestActivity;
|
import com.stardust.autojs.runtime.api.image.ScreenCaptureRequestActivity;
|
||||||
import com.stardust.scriptdroid.autojs.api.Shell;
|
import com.stardust.autojs.runtime.api.Shell;
|
||||||
import com.stardust.scriptdroid.ui.console.StardustConsole;
|
import com.stardust.autojs.runtime.console.StardustConsole;
|
||||||
import com.stardust.util.ScreenMetrics;
|
import com.stardust.util.ScreenMetrics;
|
||||||
import com.stardust.util.Supplier;
|
import com.stardust.util.Supplier;
|
||||||
import com.stardust.util.UiHandler;
|
import com.stardust.util.UiHandler;
|
||||||
import com.stardust.view.accessibility.AccessibilityInfoProvider;
|
import com.stardust.view.accessibility.AccessibilityInfoProvider;
|
||||||
import com.stardust.scriptdroid.external.floatingwindow.menu.layout_inspector.LayoutInspector;
|
import com.stardust.scriptdroid.external.floatingwindow.menu.layout_inspector.LayoutInspector;
|
||||||
import com.stardust.scriptdroid.external.floatingwindow.menu.record.accessibility.AccessibilityActionRecorder;
|
import com.stardust.scriptdroid.external.floatingwindow.menu.record.accessibility.AccessibilityActionRecorder;
|
||||||
import com.stardust.scriptdroid.service.AccessibilityWatchDogService;
|
import com.stardust.view.accessibility.AccessibilityService;
|
||||||
import com.stardust.scriptdroid.tool.AccessibilityServiceTool;
|
import com.stardust.scriptdroid.tool.AccessibilityServiceTool;
|
||||||
import com.stardust.scriptdroid.ui.console.JraskaConsole;
|
import com.stardust.scriptdroid.ui.console.JraskaConsole;
|
||||||
import com.stardust.view.accessibility.AccessibilityServiceUtils;
|
import com.stardust.view.accessibility.AccessibilityServiceUtils;
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by Stardust on 2017/4/2.
|
* Created by Stardust on 2017/4/2.
|
||||||
@@ -50,7 +47,6 @@ import java.io.IOException;
|
|||||||
public class AutoJs implements AccessibilityBridge {
|
public class AutoJs implements AccessibilityBridge {
|
||||||
|
|
||||||
private static AutoJs instance;
|
private static AutoJs instance;
|
||||||
private static final String INIT_SCRIPT_PATH = "js/autojs_init.js";
|
|
||||||
|
|
||||||
public static AutoJs getInstance() {
|
public static AutoJs getInstance() {
|
||||||
return instance;
|
return instance;
|
||||||
@@ -92,16 +88,17 @@ public class AutoJs implements AccessibilityBridge {
|
|||||||
mAppUtils = new AppUtils(context);
|
mAppUtils = new AppUtils(context);
|
||||||
mAccessibilityInfoProvider = new AccessibilityInfoProvider(context.getPackageManager());
|
mAccessibilityInfoProvider = new AccessibilityInfoProvider(context.getPackageManager());
|
||||||
ScriptEngineManager manager = createScriptEngineManager(context);
|
ScriptEngineManager manager = createScriptEngineManager(context);
|
||||||
|
final Console globalConsole = new JraskaConsole();
|
||||||
mScriptEngineService = new ScriptEngineServiceBuilder()
|
mScriptEngineService = new ScriptEngineServiceBuilder()
|
||||||
.uiHandler(mUiHandler)
|
.uiHandler(mUiHandler)
|
||||||
.globalConsole(new JraskaConsole())
|
.globalConsole(globalConsole)
|
||||||
.engineManger(manager)
|
.engineManger(manager)
|
||||||
.runtime(new Supplier<com.stardust.autojs.runtime.ScriptRuntime>() {
|
.runtime(new Supplier<com.stardust.autojs.runtime.ScriptRuntime>() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public com.stardust.autojs.runtime.ScriptRuntime get() {
|
public com.stardust.autojs.runtime.ScriptRuntime get() {
|
||||||
return new ScriptRuntime.Builder()
|
return new ScriptRuntime.Builder()
|
||||||
.setConsole(new StardustConsole(mUiHandler))
|
.setConsole(new StardustConsole(mUiHandler, globalConsole))
|
||||||
.setScreenCaptureRequester(mScreenCaptureRequester)
|
.setScreenCaptureRequester(mScreenCaptureRequester)
|
||||||
.setAccessibilityBridge(AutoJs.this)
|
.setAccessibilityBridge(AutoJs.this)
|
||||||
.setUiHandler(mUiHandler)
|
.setUiHandler(mUiHandler)
|
||||||
@@ -109,7 +106,7 @@ public class AutoJs implements AccessibilityBridge {
|
|||||||
.setShellSupplier(new Supplier<AbstractShell>() {
|
.setShellSupplier(new Supplier<AbstractShell>() {
|
||||||
@Override
|
@Override
|
||||||
public AbstractShell get() {
|
public AbstractShell get() {
|
||||||
return new Shell(true);
|
return new Shell(context, true);
|
||||||
}
|
}
|
||||||
}).build();
|
}).build();
|
||||||
}
|
}
|
||||||
@@ -142,20 +139,14 @@ public class AutoJs implements AccessibilityBridge {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private ScriptEngineManager createScriptEngineManager(Context context) {
|
private ScriptEngineManager createScriptEngineManager(Context context) {
|
||||||
RhinoJavaScriptEngineManager manager = new RhinoJavaScriptEngineManager(context);
|
return new RhinoJavaScriptEngineManager(context);
|
||||||
try {
|
|
||||||
manager.setInitScript(PFile.read(context.getAssets().open(INIT_SCRIPT_PATH)));
|
|
||||||
} catch (IOException e) {
|
|
||||||
throw new UncheckedIOException(e);
|
|
||||||
}
|
|
||||||
return manager;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addAccessibilityServiceDelegates() {
|
private void addAccessibilityServiceDelegates() {
|
||||||
AccessibilityWatchDogService.addDelegate(100, mAccessibilityInfoProvider);
|
AccessibilityService.addDelegate(100, mAccessibilityInfoProvider);
|
||||||
AccessibilityWatchDogService.addDelegate(300, mAccessibilityActionRecorder);
|
AccessibilityService.addDelegate(300, mAccessibilityActionRecorder);
|
||||||
// AccessibilityWatchDogService.addDelegate(400, mSimpleActionPerformHost);
|
// AccessibilityService.addDelegate(400, mSimpleActionPerformHost);
|
||||||
//AccessibilityWatchDogService.addDelegate(500, mAccessibilityEventCommandHost);
|
//AccessibilityService.addDelegate(500, mAccessibilityEventCommandHost);
|
||||||
}
|
}
|
||||||
|
|
||||||
public AccessibilityActionRecorder getAccessibilityActionRecorder() {
|
public AccessibilityActionRecorder getAccessibilityActionRecorder() {
|
||||||
@@ -186,15 +177,15 @@ public class AutoJs implements AccessibilityBridge {
|
|||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
public AccessibilityService getService() {
|
public android.accessibilityservice.AccessibilityService getService() {
|
||||||
return AccessibilityWatchDogService.getInstance();
|
return AccessibilityService.getInstance();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void ensureServiceEnabled() {
|
public void ensureServiceEnabled() {
|
||||||
if (AccessibilityWatchDogService.getInstance() == null) {
|
if (AccessibilityService.getInstance() == null) {
|
||||||
String errorMessage = null;
|
String errorMessage = null;
|
||||||
if (AccessibilityServiceUtils.isAccessibilityServiceEnabled(App.getApp(), AccessibilityWatchDogService.class)) {
|
if (AccessibilityServiceUtils.isAccessibilityServiceEnabled(App.getApp(), AccessibilityService.class)) {
|
||||||
errorMessage = App.getApp().getString(R.string.text_auto_operate_service_enabled_but_not_running);
|
errorMessage = App.getApp().getString(R.string.text_auto_operate_service_enabled_but_not_running);
|
||||||
} else {
|
} else {
|
||||||
if (Pref.enableAccessibilityServiceByRoot()) {
|
if (Pref.enableAccessibilityServiceByRoot()) {
|
||||||
|
|||||||
@@ -1,42 +0,0 @@
|
|||||||
package com.stardust.scriptdroid.autojs;
|
|
||||||
|
|
||||||
import com.stardust.autojs.runtime.AccessibilityBridge;
|
|
||||||
import com.stardust.autojs.runtime.ScriptVariable;
|
|
||||||
import com.stardust.autojs.runtime.api.AbstractShell;
|
|
||||||
import com.stardust.autojs.runtime.api.AppUtils;
|
|
||||||
import com.stardust.autojs.runtime.api.Console;
|
|
||||||
import com.stardust.scriptdroid.autojs.api.Dialogs;
|
|
||||||
import com.stardust.util.Supplier;
|
|
||||||
import com.stardust.util.UiHandler;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by Stardust on 2017/5/8.
|
|
||||||
*/
|
|
||||||
|
|
||||||
public class ScriptRuntime extends com.stardust.autojs.runtime.ScriptRuntime {
|
|
||||||
|
|
||||||
|
|
||||||
public static class Builder extends com.stardust.autojs.runtime.ScriptRuntime.Builder {
|
|
||||||
|
|
||||||
|
|
||||||
public Builder() {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public ScriptRuntime build() {
|
|
||||||
return new ScriptRuntime(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@ScriptVariable
|
|
||||||
public Dialogs dialogs;
|
|
||||||
|
|
||||||
private ScriptRuntime(Builder builder) {
|
|
||||||
super(builder);
|
|
||||||
dialogs = new Dialogs(app, getUiHandler());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -13,8 +13,8 @@ import com.stardust.scriptdroid.R;
|
|||||||
import com.stardust.scriptdroid.autojs.AutoJs;
|
import com.stardust.scriptdroid.autojs.AutoJs;
|
||||||
import com.stardust.scriptdroid.external.floatingwindow.menu.HoverMenuService;
|
import com.stardust.scriptdroid.external.floatingwindow.menu.HoverMenuService;
|
||||||
import com.stardust.scriptdroid.external.floatingwindow.menu.layout_inspector.LayoutInspector;
|
import com.stardust.scriptdroid.external.floatingwindow.menu.layout_inspector.LayoutInspector;
|
||||||
|
import com.stardust.scriptdroid.ui.main.MainActivity_;
|
||||||
import com.stardust.util.ClipboardUtil;
|
import com.stardust.util.ClipboardUtil;
|
||||||
import com.stardust.scriptdroid.ui.main.MainActivity;
|
|
||||||
import com.stardust.util.MessageEvent;
|
import com.stardust.util.MessageEvent;
|
||||||
import com.stardust.view.ViewBinder;
|
import com.stardust.view.ViewBinder;
|
||||||
import com.stardust.view.ViewBinding;
|
import com.stardust.view.ViewBinding;
|
||||||
@@ -82,7 +82,7 @@ public class MainMenuNavigatorContent implements NavigatorContent {
|
|||||||
|
|
||||||
@ViewBinding.Click(R.id.open_launcher)
|
@ViewBinding.Click(R.id.open_launcher)
|
||||||
private void openMainActivity() {
|
private void openMainActivity() {
|
||||||
App.getApp().startActivity(new Intent(App.getApp(), MainActivity.class)
|
App.getApp().startActivity(new Intent(App.getApp(), MainActivity_.class)
|
||||||
.addFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY | Intent.FLAG_ACTIVITY_NEW_TASK));
|
.addFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY | Intent.FLAG_ACTIVITY_NEW_TASK));
|
||||||
HoverMenuService.postIntent(new Intent(HoverMenuService.ACTION_COLLAPSE_MENU));
|
HoverMenuService.postIntent(new Intent(HoverMenuService.ACTION_COLLAPSE_MENU));
|
||||||
}
|
}
|
||||||
@@ -95,7 +95,6 @@ public class MainMenuNavigatorContent implements NavigatorContent {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onShown(@NonNull Navigator navigator) {
|
public void onShown(@NonNull Navigator navigator) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressLint("SetTextI18n")
|
@SuppressLint("SetTextI18n")
|
||||||
|
|||||||
@@ -79,7 +79,7 @@ public class RecordNavigatorContent implements NavigatorContent, Recorder.OnStat
|
|||||||
HoverMenuService.getEventBus().register(this);
|
HoverMenuService.getEventBus().register(this);
|
||||||
App.getApp().getVolumeChangeObserver().addOnVolumeChangeListener(mOnVolumeChangeListener);
|
App.getApp().getVolumeChangeObserver().addOnVolumeChangeListener(mOnVolumeChangeListener);
|
||||||
if (Pref.hasRecordTrigger()) {
|
if (Pref.hasRecordTrigger()) {
|
||||||
mKeyObserver = new KeyObserver();
|
mKeyObserver = new KeyObserver(mContext);
|
||||||
mKeyObserver.startListening();
|
mKeyObserver.startListening();
|
||||||
mKeyObserver.setKeyListener(this);
|
mKeyObserver.setKeyListener(this);
|
||||||
}
|
}
|
||||||
@@ -134,7 +134,7 @@ public class RecordNavigatorContent implements NavigatorContent, Recorder.OnStat
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void startRecord() {
|
private void startRecord() {
|
||||||
mRecorder = mRecordedByRootSwitch.isChecked() ? new TouchRecorder() : AutoJs.getInstance().getAccessibilityActionRecorder();
|
mRecorder = mRecordedByRootSwitch.isChecked() ? new TouchRecorder(mContext) : AutoJs.getInstance().getAccessibilityActionRecorder();
|
||||||
mRecorder.setOnStateChangedListener(this);
|
mRecorder.setOnStateChangedListener(this);
|
||||||
mRecorder.start();
|
mRecorder.start();
|
||||||
setState(Recorder.STATE_RECORDING);
|
setState(Recorder.STATE_RECORDING);
|
||||||
|
|||||||
@@ -1,9 +1,8 @@
|
|||||||
package com.stardust.scriptdroid.external.floatingwindow.menu.layout_inspector;
|
package com.stardust.scriptdroid.external.floatingwindow.menu.layout_inspector;
|
||||||
|
|
||||||
import android.accessibilityservice.AccessibilityService;
|
|
||||||
import android.view.accessibility.AccessibilityNodeInfo;
|
import android.view.accessibility.AccessibilityNodeInfo;
|
||||||
|
|
||||||
import com.stardust.scriptdroid.service.AccessibilityWatchDogService;
|
import com.stardust.view.accessibility.AccessibilityService;
|
||||||
import com.stardust.util.UnderuseExecutors;
|
import com.stardust.util.UnderuseExecutors;
|
||||||
|
|
||||||
import java.util.concurrent.Executor;
|
import java.util.concurrent.Executor;
|
||||||
@@ -19,7 +18,7 @@ public class LayoutInspector {
|
|||||||
private Executor mExecutor = UnderuseExecutors.getExecutor();
|
private Executor mExecutor = UnderuseExecutors.getExecutor();
|
||||||
|
|
||||||
public void captureCurrentWindow() {
|
public void captureCurrentWindow() {
|
||||||
AccessibilityWatchDogService service = AccessibilityWatchDogService.getInstance();
|
AccessibilityService service = AccessibilityService.getInstance();
|
||||||
if (service == null) {
|
if (service == null) {
|
||||||
mCapture = null;
|
mCapture = null;
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -1,6 +1,9 @@
|
|||||||
package com.stardust.scriptdroid.external.floatingwindow.menu.record.inputevent;
|
package com.stardust.scriptdroid.external.floatingwindow.menu.record.inputevent;
|
||||||
|
|
||||||
import com.stardust.scriptdroid.autojs.api.Shell;
|
import android.content.Context;
|
||||||
|
|
||||||
|
import com.stardust.autojs.runtime.api.Shell;
|
||||||
|
import com.stardust.scriptdroid.App;
|
||||||
import com.stardust.scriptdroid.external.floatingwindow.menu.record.Recorder;
|
import com.stardust.scriptdroid.external.floatingwindow.menu.record.Recorder;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -13,15 +16,17 @@ public class InputEventRecorder extends Recorder.AbstractRecorder {
|
|||||||
private String mGetEventCommand;
|
private String mGetEventCommand;
|
||||||
private Shell mShell;
|
private Shell mShell;
|
||||||
protected InputEventConverter mInputEventConverter;
|
protected InputEventConverter mInputEventConverter;
|
||||||
|
private Context mContext;
|
||||||
|
|
||||||
|
|
||||||
protected InputEventRecorder(InputEventConverter inputEventConverter) {
|
protected InputEventRecorder(Context context, InputEventConverter inputEventConverter) {
|
||||||
mGetEventCommand = inputEventConverter.getGetEventCommand();
|
mGetEventCommand = inputEventConverter.getGetEventCommand();
|
||||||
mInputEventConverter = inputEventConverter;
|
mInputEventConverter = inputEventConverter;
|
||||||
|
mContext = context;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void listen() {
|
public void listen() {
|
||||||
mShell = new Shell(true);
|
mShell = new Shell(mContext, true);
|
||||||
mShell.setCallback(new Shell.SimpleCallback() {
|
mShell.setCallback(new Shell.SimpleCallback() {
|
||||||
@Override
|
@Override
|
||||||
public void onNewLine(String str) {
|
public void onNewLine(String str) {
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package com.stardust.scriptdroid.external.floatingwindow.menu.record.inputevent;
|
package com.stardust.scriptdroid.external.floatingwindow.menu.record.inputevent;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
import android.support.annotation.NonNull;
|
import android.support.annotation.NonNull;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -19,14 +20,14 @@ public class KeyObserver {
|
|||||||
private InputEventRecorder mObserver;
|
private InputEventRecorder mObserver;
|
||||||
private KeyListener mKeyListener;
|
private KeyListener mKeyListener;
|
||||||
|
|
||||||
public KeyObserver(){
|
public KeyObserver(Context context) {
|
||||||
mObserver = new InputEventRecorder(new InputEventConverter() {
|
mObserver = new InputEventRecorder(context, new InputEventConverter() {
|
||||||
@Override
|
@Override
|
||||||
public void convertEvent(@NonNull Event event) {
|
public void convertEvent(@NonNull Event event) {
|
||||||
if(event.value.equalsIgnoreCase("UP")){
|
if (event.value.equalsIgnoreCase("UP")) {
|
||||||
notifyKeyUp(event.code);
|
notifyKeyUp(event.code);
|
||||||
}
|
}
|
||||||
if(event.value.equalsIgnoreCase("DOWN")){
|
if (event.value.equalsIgnoreCase("DOWN")) {
|
||||||
notifyKeyDown(event.code);
|
notifyKeyDown(event.code);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -42,23 +43,23 @@ public class KeyObserver {
|
|||||||
mKeyListener = keyListener;
|
mKeyListener = keyListener;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void startListening(){
|
public void startListening() {
|
||||||
mObserver.listen();
|
mObserver.listen();
|
||||||
mObserver.start();
|
mObserver.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void stopListening(){
|
public void stopListening() {
|
||||||
mObserver.stopImpl();
|
mObserver.stopImpl();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void notifyKeyDown(String keyName) {
|
private void notifyKeyDown(String keyName) {
|
||||||
if(mKeyListener != null){
|
if (mKeyListener != null) {
|
||||||
mKeyListener.onKeyDown(keyName);
|
mKeyListener.onKeyDown(keyName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void notifyKeyUp(String keyName) {
|
private void notifyKeyUp(String keyName) {
|
||||||
if(mKeyListener != null){
|
if (mKeyListener != null) {
|
||||||
mKeyListener.onKeyUp(keyName);
|
mKeyListener.onKeyUp(keyName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,13 +1,15 @@
|
|||||||
package com.stardust.scriptdroid.external.floatingwindow.menu.record.inputevent;
|
package com.stardust.scriptdroid.external.floatingwindow.menu.record.inputevent;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by Stardust on 2017/3/16.
|
* Created by Stardust on 2017/3/16.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public class TouchRecorder extends InputEventRecorder {
|
public class TouchRecorder extends InputEventRecorder {
|
||||||
|
|
||||||
public TouchRecorder() {
|
public TouchRecorder(Context context) {
|
||||||
super(new InputEventToSendEventJsConverter());
|
super(context, new InputEventToSendEventJsConverter());
|
||||||
listen();
|
listen();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,122 +0,0 @@
|
|||||||
package com.stardust.scriptdroid.service;
|
|
||||||
|
|
||||||
import android.accessibilityservice.AccessibilityServiceInfo;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.os.Build;
|
|
||||||
import android.util.Log;
|
|
||||||
import android.view.KeyEvent;
|
|
||||||
import android.view.accessibility.AccessibilityEvent;
|
|
||||||
import android.view.accessibility.AccessibilityNodeInfo;
|
|
||||||
|
|
||||||
import com.nickandjerry.dynamiclayoutinflator.lib.DynamicLayoutInflator;
|
|
||||||
import com.stardust.scriptdroid.tool.AccessibilityServiceTool;
|
|
||||||
import com.stardust.view.accessibility.AccessibilityDelegate;
|
|
||||||
import com.stardust.view.accessibility.AccessibilityService;
|
|
||||||
import com.stardust.view.accessibility.AccessibilityServiceUtils;
|
|
||||||
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Set;
|
|
||||||
import java.util.SortedMap;
|
|
||||||
import java.util.TreeMap;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by Stardust on 2017/2/14.
|
|
||||||
*/
|
|
||||||
|
|
||||||
public class AccessibilityWatchDogService extends AccessibilityService {
|
|
||||||
|
|
||||||
private static final String TAG = "AccessibilityWatchDog";
|
|
||||||
|
|
||||||
private static final SortedMap<Integer, AccessibilityDelegate> mDelegates = new TreeMap<>();
|
|
||||||
private static final Object LOCK = new Object();
|
|
||||||
private static AccessibilityWatchDogService instance;
|
|
||||||
private static boolean containsAllEventTypes = false;
|
|
||||||
private static final Set<Integer> eventTypes = new HashSet<>();
|
|
||||||
|
|
||||||
public static void addDelegate(int uniquePriority, AccessibilityDelegate delegate) {
|
|
||||||
mDelegates.put(uniquePriority, delegate);
|
|
||||||
Set<Integer> set = delegate.getEventTypes();
|
|
||||||
if (set == null)
|
|
||||||
containsAllEventTypes = true;
|
|
||||||
else
|
|
||||||
eventTypes.addAll(set);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean isEnable(Context context) {
|
|
||||||
return AccessibilityServiceUtils.isAccessibilityServiceEnabled(context, AccessibilityWatchDogService.class);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static AccessibilityWatchDogService getInstance() {
|
|
||||||
return instance;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onAccessibilityEvent(final AccessibilityEvent event) {
|
|
||||||
Log.v(TAG, "onAccessibilityEvent: " + event);
|
|
||||||
super.onAccessibilityEvent(event);
|
|
||||||
if (!containsAllEventTypes && !eventTypes.contains(event.getEventType()))
|
|
||||||
return;
|
|
||||||
for (Map.Entry<Integer, AccessibilityDelegate> entry : mDelegates.entrySet()) {
|
|
||||||
AccessibilityDelegate delegate = entry.getValue();
|
|
||||||
Set<Integer> types = delegate.getEventTypes();
|
|
||||||
if (types != null && !delegate.getEventTypes().contains(event.getEventType()))
|
|
||||||
continue;
|
|
||||||
long start = System.currentTimeMillis();
|
|
||||||
if (delegate.onAccessibilityEvent(AccessibilityWatchDogService.this, event))
|
|
||||||
break;
|
|
||||||
Log.v(TAG, "millis: " + (System.currentTimeMillis() - start) + " delegate: " + entry.getValue().getClass().getName());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected boolean onKeyEvent(KeyEvent event) {
|
|
||||||
Log.v(TAG, "onKeyEvent: " + event);
|
|
||||||
return super.onKeyEvent(event);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected boolean onGesture(int gestureId) {
|
|
||||||
Log.v(TAG, "onGesture: " + gestureId);
|
|
||||||
return super.onGesture(gestureId);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onInterrupt() {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onDestroy() {
|
|
||||||
instance = null;
|
|
||||||
super.onDestroy();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onServiceConnected() {
|
|
||||||
Log.v(TAG, "onServiceConnected: " + getServiceInfo().toString());
|
|
||||||
instance = this;
|
|
||||||
super.onServiceConnected();
|
|
||||||
synchronized (LOCK) {
|
|
||||||
LOCK.notifyAll();
|
|
||||||
}
|
|
||||||
// FIXME: 2017/2/12 有时在无障碍中开启服务后这里不会调用服务也不会运行,安卓的BUG???
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void disable() {
|
|
||||||
if (instance != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
|
|
||||||
instance.disableSelf();
|
|
||||||
} else {
|
|
||||||
AccessibilityServiceTool.goToAccessibilitySetting();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void waitForEnabled(long timeOut) {
|
|
||||||
synchronized (LOCK) {
|
|
||||||
try {
|
|
||||||
LOCK.wait(timeOut);
|
|
||||||
} catch (InterruptedException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,13 +1,12 @@
|
|||||||
package com.stardust.scriptdroid.tool;
|
package com.stardust.scriptdroid.tool;
|
||||||
|
|
||||||
import android.accessibilityservice.AccessibilityService;
|
|
||||||
import android.content.ActivityNotFoundException;
|
import android.content.ActivityNotFoundException;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
import com.stardust.scriptdroid.Pref;
|
import com.stardust.scriptdroid.Pref;
|
||||||
import com.stardust.scriptdroid.service.AccessibilityWatchDogService;
|
import com.stardust.view.accessibility.AccessibilityService;
|
||||||
import com.stardust.scriptdroid.App;
|
import com.stardust.scriptdroid.App;
|
||||||
import com.stardust.scriptdroid.R;
|
import com.stardust.scriptdroid.R;
|
||||||
import com.stardust.autojs.runtime.api.ProcessShell;
|
import com.stardust.autojs.runtime.api.ProcessShell;
|
||||||
@@ -23,7 +22,7 @@ public class AccessibilityServiceTool {
|
|||||||
|
|
||||||
public static void enableAccessibilityService() {
|
public static void enableAccessibilityService() {
|
||||||
if (Pref.enableAccessibilityServiceByRoot()) {
|
if (Pref.enableAccessibilityServiceByRoot()) {
|
||||||
if (!enableAccessibilityServiceByRoot(AccessibilityWatchDogService.class)) {
|
if (!enableAccessibilityServiceByRoot(AccessibilityService.class)) {
|
||||||
goToAccessibilitySetting();
|
goToAccessibilitySetting();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -53,22 +52,22 @@ public class AccessibilityServiceTool {
|
|||||||
"settings put secure enabled_accessibility_services $enabled\n" +
|
"settings put secure enabled_accessibility_services $enabled\n" +
|
||||||
"fi";
|
"fi";
|
||||||
|
|
||||||
public static boolean enableAccessibilityServiceByRoot(Class<? extends AccessibilityService> accessibilityService) {
|
public static boolean enableAccessibilityServiceByRoot(Class<? extends android.accessibilityservice.AccessibilityService> accessibilityService) {
|
||||||
String serviceName = App.getApp().getPackageName() + "/" + accessibilityService.getName();
|
String serviceName = App.getApp().getPackageName() + "/" + accessibilityService.getName();
|
||||||
return TextUtils.isEmpty(ProcessShell.execCommand(String.format(Locale.getDefault(), cmd, serviceName), true).error);
|
return TextUtils.isEmpty(ProcessShell.execCommand(String.format(Locale.getDefault(), cmd, serviceName), true).error);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean enableAccessibilityServiceByRootAndWaitFor(long timeOut) {
|
public static boolean enableAccessibilityServiceByRootAndWaitFor(long timeOut) {
|
||||||
if (enableAccessibilityServiceByRoot(AccessibilityWatchDogService.class)) {
|
if (enableAccessibilityServiceByRoot(AccessibilityService.class)) {
|
||||||
AccessibilityWatchDogService.waitForEnabled(timeOut);
|
AccessibilityService.waitForEnabled(timeOut);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void enableAccessibilityServiceByRootIfNeeded() {
|
public static void enableAccessibilityServiceByRootIfNeeded() {
|
||||||
if (AccessibilityWatchDogService.getInstance() == null)
|
if (AccessibilityService.getInstance() == null)
|
||||||
if (Pref.enableAccessibilityServiceByRoot()) {
|
if (Pref.enableAccessibilityServiceByRoot()) {
|
||||||
AccessibilityServiceTool.enableAccessibilityServiceByRoot(AccessibilityWatchDogService.class);
|
AccessibilityServiceTool.enableAccessibilityServiceByRoot(AccessibilityService.class);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -76,7 +76,7 @@ public class JraskaConsole extends AbstractConsole {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void show() {
|
public void show() {
|
||||||
App.getApp().startActivity(new Intent(App.getApp(), LogActivity.class)
|
App.getApp().startActivity(new Intent(App.getApp(), LogActivity_.class)
|
||||||
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
|
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -13,20 +13,17 @@ import com.stardust.scriptdroid.ui.BaseActivity;
|
|||||||
import com.jraska.console.Console;
|
import com.jraska.console.Console;
|
||||||
import com.stardust.scriptdroid.R;
|
import com.stardust.scriptdroid.R;
|
||||||
|
|
||||||
|
import org.androidannotations.annotations.AfterViews;
|
||||||
|
import org.androidannotations.annotations.EActivity;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by Stardust on 2017/2/12.
|
* Created by Stardust on 2017/2/12.
|
||||||
*/
|
*/
|
||||||
|
@EActivity(R.layout.activity_console)
|
||||||
public class LogActivity extends BaseActivity {
|
public class LogActivity extends BaseActivity {
|
||||||
|
|
||||||
@Override
|
@AfterViews
|
||||||
protected void onCreate(@Nullable Bundle savedInstanceState) {
|
void setUpUI() {
|
||||||
super.onCreate(savedInstanceState);
|
|
||||||
setUpUI();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setUpUI() {
|
|
||||||
setContentView(R.layout.activity_console);
|
|
||||||
setToolbarAsBack(getString(R.string.text_log));
|
setToolbarAsBack(getString(R.string.text_log));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -39,16 +39,19 @@ import com.stardust.scriptdroid.ui.help.HelpCatalogueActivity;
|
|||||||
import com.stardust.theme.ThemeColorManager;
|
import com.stardust.theme.ThemeColorManager;
|
||||||
import com.stardust.theme.dialog.ThemeColorMaterialDialogBuilder;
|
import com.stardust.theme.dialog.ThemeColorMaterialDialogBuilder;
|
||||||
import com.stardust.util.SparseArrayEntries;
|
import com.stardust.util.SparseArrayEntries;
|
||||||
import com.stardust.view.ViewBinder;
|
|
||||||
import com.stardust.view.ViewBinding;
|
|
||||||
import com.stardust.widget.ToolbarMenuItem;
|
import com.stardust.widget.ToolbarMenuItem;
|
||||||
|
|
||||||
|
import org.androidannotations.annotations.AfterViews;
|
||||||
|
import org.androidannotations.annotations.Click;
|
||||||
|
import org.androidannotations.annotations.EActivity;
|
||||||
|
import org.androidannotations.annotations.ViewById;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by Stardust on 2017/1/29.
|
* Created by Stardust on 2017/1/29.
|
||||||
*/
|
*/
|
||||||
|
@EActivity(R.layout.activity_edit)
|
||||||
public class EditActivity extends Editor920Activity implements OnActivityResultDelegate.DelegateHost {
|
public class EditActivity extends Editor920Activity implements OnActivityResultDelegate.DelegateHost {
|
||||||
|
|
||||||
|
|
||||||
@@ -81,26 +84,28 @@ public class EditActivity extends Editor920Activity implements OnActivityResultD
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static final String EXTRA_CONTENT = "Still Love Eating 17.4.5";
|
public static final String EXTRA_PATH = "Still Love Eating 17.4.5";
|
||||||
|
private static final String EXTRA_NAME = "Still love you 17.6.29 But....(ಥ_ಥ)";
|
||||||
|
|
||||||
public static void editFile(Context context, String path) {
|
public static void editFile(Context context, String path) {
|
||||||
editFile(context, null, path);
|
editFile(context, null, path);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void editFile(Context context, String name, String path) {
|
public static void editFile(Context context, String name, String path) {
|
||||||
context.startActivity(new Intent(context, EditActivity.class)
|
context.startActivity(new Intent(context, EditActivity_.class)
|
||||||
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
||||||
.putExtra("path", path)
|
.putExtra(EXTRA_PATH, path)
|
||||||
.putExtra("name", name));
|
.putExtra(EXTRA_NAME, name));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void editFile(Context context, ScriptFile file) {
|
public static void editFile(Context context, ScriptFile file) {
|
||||||
editFile(context, file.getSimplifiedName(), file.getPath());
|
editFile(context, file.getSimplifiedName(), file.getPath());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ViewById(R.id.content_view)
|
||||||
|
View mView;
|
||||||
private String mName;
|
private String mName;
|
||||||
private File mFile;
|
private File mFile;
|
||||||
private View mView;
|
|
||||||
private EditorDelegate mEditorDelegate;
|
private EditorDelegate mEditorDelegate;
|
||||||
private SparseArray<ToolbarMenuItem> mMenuMap;
|
private SparseArray<ToolbarMenuItem> mMenuMap;
|
||||||
private boolean mReadOnly = false;
|
private boolean mReadOnly = false;
|
||||||
@@ -124,17 +129,21 @@ public class EditActivity extends Editor920Activity implements OnActivityResultD
|
|||||||
public void onCreate(Bundle b) {
|
public void onCreate(Bundle b) {
|
||||||
super.onCreate(b);
|
super.onCreate(b);
|
||||||
setTheme(R.style.EditorTheme);
|
setTheme(R.style.EditorTheme);
|
||||||
mView = View.inflate(this, R.layout.activity_edit, null);
|
|
||||||
setContentView(mView);
|
|
||||||
handleIntent(getIntent());
|
handleIntent(getIntent());
|
||||||
setUpUI();
|
|
||||||
setUpEditor();
|
|
||||||
registerReceiver(mOnRunFinishedReceiver, new IntentFilter(Scripts.ACTION_ON_EXECUTION_FINISHED));
|
registerReceiver(mOnRunFinishedReceiver, new IntentFilter(Scripts.ACTION_ON_EXECUTION_FINISHED));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@AfterViews
|
||||||
|
void setUpViews() {
|
||||||
|
ThemeColorManager.addActivityStatusBar(this);
|
||||||
|
setUpToolbar();
|
||||||
|
initMenuItem();
|
||||||
|
setUpEditor();
|
||||||
|
}
|
||||||
|
|
||||||
private void handleIntent(Intent intent) {
|
private void handleIntent(Intent intent) {
|
||||||
String path = intent.getStringExtra("path");
|
String path = intent.getStringExtra(EXTRA_PATH);
|
||||||
mName = intent.getStringExtra("name");
|
mName = intent.getStringExtra(EXTRA_NAME);
|
||||||
mReadOnly = intent.getBooleanExtra("readOnly", false);
|
mReadOnly = intent.getBooleanExtra("readOnly", false);
|
||||||
boolean saveEnabled = intent.getBooleanExtra("saveEnabled", true);
|
boolean saveEnabled = intent.getBooleanExtra("saveEnabled", true);
|
||||||
if (mReadOnly || !saveEnabled) {
|
if (mReadOnly || !saveEnabled) {
|
||||||
@@ -152,13 +161,6 @@ public class EditActivity extends Editor920Activity implements OnActivityResultD
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setUpUI() {
|
|
||||||
ThemeColorManager.addActivityStatusBar(this);
|
|
||||||
setUpToolbar();
|
|
||||||
initMenuItem();
|
|
||||||
ViewBinder.bind(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setUpEditor() {
|
private void setUpEditor() {
|
||||||
final EditorView editorView = (EditorView) findViewById(R.id.editor);
|
final EditorView editorView = (EditorView) findViewById(R.id.editor);
|
||||||
mEditorDelegate.setEditorView(editorView);
|
mEditorDelegate.setEditorView(editorView);
|
||||||
@@ -184,8 +186,8 @@ public class EditActivity extends Editor920Activity implements OnActivityResultD
|
|||||||
BaseActivity.setToolbarAsBack(this, R.id.toolbar, mName);
|
BaseActivity.setToolbarAsBack(this, R.id.toolbar, mName);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ViewBinding.Click(R.id.run)
|
@Click(R.id.run)
|
||||||
private void runAndSaveFileIFNeeded() {
|
void runAndSaveFileIFNeeded() {
|
||||||
if (!mReadOnly && mEditorDelegate.isChanged()) {
|
if (!mReadOnly && mEditorDelegate.isChanged()) {
|
||||||
saveFile(false, new SaveListener() {
|
saveFile(false, new SaveListener() {
|
||||||
@Override
|
@Override
|
||||||
@@ -213,21 +215,21 @@ public class EditActivity extends Editor920Activity implements OnActivityResultD
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ViewBinding.Click(R.id.undo)
|
@Click(R.id.undo)
|
||||||
private void undo() {
|
void undo() {
|
||||||
Command command = new Command(Command.CommandEnum.UNDO);
|
Command command = new Command(Command.CommandEnum.UNDO);
|
||||||
mEditorDelegate.doCommand(command);
|
mEditorDelegate.doCommand(command);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ViewBinding.Click(R.id.redo)
|
@Click(R.id.redo)
|
||||||
private void redo() {
|
void redo() {
|
||||||
Command command = new Command(Command.CommandEnum.REDO);
|
Command command = new Command(Command.CommandEnum.REDO);
|
||||||
mEditorDelegate.doCommand(command);
|
mEditorDelegate.doCommand(command);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ViewBinding.Click(R.id.save)
|
@Click(R.id.save)
|
||||||
private void saveFile() {
|
void saveFile() {
|
||||||
saveFile(false, null);
|
saveFile(false, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -10,13 +10,13 @@ import android.view.View;
|
|||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
|
|
||||||
import com.stardust.app.Fragment;
|
import com.stardust.app.Fragment;
|
||||||
|
import com.stardust.scriptdroid.R;
|
||||||
import com.stardust.scriptdroid.external.floatingwindow.FloatingWindowManger;
|
import com.stardust.scriptdroid.external.floatingwindow.FloatingWindowManger;
|
||||||
import com.stardust.scriptdroid.external.floatingwindow.menu.HoverMenuService;
|
import com.stardust.scriptdroid.external.floatingwindow.menu.HoverMenuService;
|
||||||
import com.stardust.view.ViewBinding;
|
import com.stardust.scriptdroid.ui.console.LogActivity_;
|
||||||
import com.stardust.scriptdroid.R;
|
|
||||||
import com.stardust.scriptdroid.ui.console.LogActivity;
|
|
||||||
import com.stardust.scriptdroid.ui.help.HelpCatalogueActivity;
|
import com.stardust.scriptdroid.ui.help.HelpCatalogueActivity;
|
||||||
import com.stardust.view.ViewBinder;
|
import com.stardust.view.ViewBinder;
|
||||||
|
import com.stardust.view.ViewBinding;
|
||||||
|
|
||||||
import org.greenrobot.eventbus.EventBus;
|
import org.greenrobot.eventbus.EventBus;
|
||||||
import org.greenrobot.eventbus.Subscribe;
|
import org.greenrobot.eventbus.Subscribe;
|
||||||
@@ -92,7 +92,7 @@ public class EditSideMenuFragment extends Fragment {
|
|||||||
|
|
||||||
@ViewBinding.Click(R.id.console)
|
@ViewBinding.Click(R.id.console)
|
||||||
private void startConsoleActivity() {
|
private void startConsoleActivity() {
|
||||||
startActivity(new Intent(getContext(), LogActivity.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
|
startActivity(new Intent(getContext(), LogActivity_.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ViewBinding.Check(R.id.sw_floating_window)
|
@ViewBinding.Check(R.id.sw_floating_window)
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ import com.stardust.scriptdroid.external.floatingwindow.FloatingWindowManger;
|
|||||||
import com.stardust.scriptdroid.script.ScriptFile;
|
import com.stardust.scriptdroid.script.ScriptFile;
|
||||||
import com.stardust.scriptdroid.script.StorageScriptProvider;
|
import com.stardust.scriptdroid.script.StorageScriptProvider;
|
||||||
import com.stardust.scriptdroid.script.sample.Sample;
|
import com.stardust.scriptdroid.script.sample.Sample;
|
||||||
import com.stardust.scriptdroid.service.AccessibilityWatchDogService;
|
import com.stardust.view.accessibility.AccessibilityService;
|
||||||
import com.stardust.scriptdroid.tool.AccessibilityServiceTool;
|
import com.stardust.scriptdroid.tool.AccessibilityServiceTool;
|
||||||
import com.stardust.scriptdroid.tool.DrawableSaver;
|
import com.stardust.scriptdroid.tool.DrawableSaver;
|
||||||
import com.stardust.scriptdroid.ui.BaseActivity;
|
import com.stardust.scriptdroid.ui.BaseActivity;
|
||||||
@@ -46,25 +46,27 @@ import com.stardust.scriptdroid.ui.main.sample_list.SampleScriptListFragment;
|
|||||||
import com.stardust.scriptdroid.ui.main.script_list.MyScriptListFragment;
|
import com.stardust.scriptdroid.ui.main.script_list.MyScriptListFragment;
|
||||||
import com.stardust.scriptdroid.ui.main.script_list.ScriptFileChooserDialogBuilder;
|
import com.stardust.scriptdroid.ui.main.script_list.ScriptFileChooserDialogBuilder;
|
||||||
import com.stardust.scriptdroid.ui.main.task.TaskManagerFragment;
|
import com.stardust.scriptdroid.ui.main.task.TaskManagerFragment;
|
||||||
import com.stardust.scriptdroid.ui.settings.SettingsActivity;
|
import com.stardust.scriptdroid.ui.settings.SettingsActivity_;
|
||||||
import com.stardust.scriptdroid.ui.update.VersionGuard;
|
import com.stardust.scriptdroid.ui.update.VersionGuard;
|
||||||
import com.stardust.theme.dialog.ThemeColorMaterialDialogBuilder;
|
import com.stardust.theme.dialog.ThemeColorMaterialDialogBuilder;
|
||||||
import com.stardust.util.BackPressedHandler;
|
import com.stardust.util.BackPressedHandler;
|
||||||
import com.stardust.util.Callback;
|
import com.stardust.util.Callback;
|
||||||
import com.stardust.util.MessageEvent;
|
import com.stardust.util.MessageEvent;
|
||||||
import com.stardust.view.DrawerAutoClose;
|
import com.stardust.view.DrawerAutoClose;
|
||||||
import com.stardust.view.ViewBinder;
|
|
||||||
import com.stardust.view.ViewBinding;
|
|
||||||
import com.stardust.view.accessibility.AccessibilityServiceUtils;
|
import com.stardust.view.accessibility.AccessibilityServiceUtils;
|
||||||
import com.stardust.widget.CommonMarkdownView;
|
import com.stardust.widget.CommonMarkdownView;
|
||||||
import com.stardust.widget.SlidingUpPanel;
|
import com.stardust.widget.SlidingUpPanel;
|
||||||
|
|
||||||
|
import org.androidannotations.annotations.AfterViews;
|
||||||
|
import org.androidannotations.annotations.Click;
|
||||||
|
import org.androidannotations.annotations.EActivity;
|
||||||
|
import org.androidannotations.annotations.ViewById;
|
||||||
import org.greenrobot.eventbus.EventBus;
|
import org.greenrobot.eventbus.EventBus;
|
||||||
import org.greenrobot.eventbus.Subscribe;
|
import org.greenrobot.eventbus.Subscribe;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
|
@EActivity(R.layout.activity_main)
|
||||||
public class MainActivity extends BaseActivity implements OnActivityResultDelegate.DelegateHost {
|
public class MainActivity extends BaseActivity implements OnActivityResultDelegate.DelegateHost {
|
||||||
|
|
||||||
public static final String MESSAGE_CLEAR_BACKGROUND_SETTINGS = "MESSAGE_CLEAR_BACKGROUND_SETTINGS";
|
public static final String MESSAGE_CLEAR_BACKGROUND_SETTINGS = "MESSAGE_CLEAR_BACKGROUND_SETTINGS";
|
||||||
@@ -80,21 +82,22 @@ public class MainActivity extends BaseActivity implements OnActivityResultDelega
|
|||||||
private static final String ARGUMENT_SAMPLE = "Take a chance on me...ok...?";
|
private static final String ARGUMENT_SAMPLE = "Take a chance on me...ok...?";
|
||||||
|
|
||||||
|
|
||||||
private DrawerLayout mDrawerLayout;
|
@ViewById(R.id.drawer_layout)
|
||||||
@ViewBinding.Id(R.id.bottom_menu)
|
DrawerLayout mDrawerLayout;
|
||||||
private SlidingUpPanel mAddBottomMenuPanel;
|
@ViewById(R.id.bottom_menu)
|
||||||
|
SlidingUpPanel mAddBottomMenuPanel;
|
||||||
|
@ViewById(R.id.viewpager)
|
||||||
|
ViewPager mViewPager;
|
||||||
private FragmentPagerAdapterBuilder.StoredFragmentPagerAdapter mPagerAdapter;
|
private FragmentPagerAdapterBuilder.StoredFragmentPagerAdapter mPagerAdapter;
|
||||||
|
|
||||||
private OnActivityResultDelegate.Mediator mActivityResultMediator = new OnActivityResultDelegate.Mediator();
|
private OnActivityResultDelegate.Mediator mActivityResultMediator = new OnActivityResultDelegate.Mediator();
|
||||||
private DrawableSaver mDrawerHeaderBackgroundSaver, mAppbarBackgroundSaver;
|
private DrawableSaver mDrawerHeaderBackgroundSaver, mAppbarBackgroundSaver;
|
||||||
private VersionGuard mVersionGuard;
|
private VersionGuard mVersionGuard;
|
||||||
private Intent mIntentToHandle;
|
private Intent mIntentToHandle;
|
||||||
private ViewPager mViewPager;
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
setUpUI();
|
|
||||||
checkPermissions();
|
checkPermissions();
|
||||||
registerBackPressHandlers();
|
registerBackPressHandlers();
|
||||||
mIntentToHandle = getIntent();
|
mIntentToHandle = getIntent();
|
||||||
@@ -103,9 +106,14 @@ public class MainActivity extends BaseActivity implements OnActivityResultDelega
|
|||||||
showAnnunciationIfNeeded();
|
showAnnunciationIfNeeded();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@AfterViews
|
||||||
protected void onStart() {
|
void setUpViews() {
|
||||||
super.onStart();
|
setUpToolbar();
|
||||||
|
setUpTabViewPager();
|
||||||
|
setUpDrawerHeader();
|
||||||
|
setUpFragment();
|
||||||
|
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void showAnnunciationIfNeeded() {
|
private void showAnnunciationIfNeeded() {
|
||||||
@@ -143,7 +151,7 @@ public class MainActivity extends BaseActivity implements OnActivityResultDelega
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void showAccessibilitySettingPromptIfDisabled() {
|
private void showAccessibilitySettingPromptIfDisabled() {
|
||||||
if (!AccessibilityServiceUtils.isAccessibilityServiceEnabled(this, AccessibilityWatchDogService.class)) {
|
if (!AccessibilityServiceUtils.isAccessibilityServiceEnabled(this, AccessibilityService.class)) {
|
||||||
new NotAskAgainDialog.Builder(this, "Eating...love you...miss you...17.4.12")
|
new NotAskAgainDialog.Builder(this, "Eating...love you...miss you...17.4.12")
|
||||||
.title(R.string.text_need_to_enable_accessibility_service)
|
.title(R.string.text_need_to_enable_accessibility_service)
|
||||||
.content(R.string.explain_accessibility_permission)
|
.content(R.string.explain_accessibility_permission)
|
||||||
@@ -158,17 +166,6 @@ public class MainActivity extends BaseActivity implements OnActivityResultDelega
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setUpUI() {
|
|
||||||
mDrawerLayout = (DrawerLayout) View.inflate(this, R.layout.activity_main, null);
|
|
||||||
setContentView(mDrawerLayout);
|
|
||||||
setUpToolbar();
|
|
||||||
setUpTabViewPager();
|
|
||||||
setUpDrawerHeader();
|
|
||||||
setUpFragment();
|
|
||||||
ViewBinder.bind(this);
|
|
||||||
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setUpFragment() {
|
private void setUpFragment() {
|
||||||
SideMenuFragment.setFragment(this, R.id.fragment_slide_menu);
|
SideMenuFragment.setFragment(this, R.id.fragment_slide_menu);
|
||||||
}
|
}
|
||||||
@@ -193,7 +190,6 @@ public class MainActivity extends BaseActivity implements OnActivityResultDelega
|
|||||||
|
|
||||||
private void setUpTabViewPager() {
|
private void setUpTabViewPager() {
|
||||||
TabLayout tabLayout = $(R.id.tab);
|
TabLayout tabLayout = $(R.id.tab);
|
||||||
mViewPager = $(R.id.viewpager);
|
|
||||||
mPagerAdapter = new FragmentPagerAdapterBuilder(this)
|
mPagerAdapter = new FragmentPagerAdapterBuilder(this)
|
||||||
.add(new MyScriptListFragment(), R.string.text_my_script)
|
.add(new MyScriptListFragment(), R.string.text_my_script)
|
||||||
.add(new SampleScriptListFragment(), R.string.text_sample_script)
|
.add(new SampleScriptListFragment(), R.string.text_sample_script)
|
||||||
@@ -212,13 +208,13 @@ public class MainActivity extends BaseActivity implements OnActivityResultDelega
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ViewBinding.Click(R.id.add)
|
@Click(R.id.add)
|
||||||
private void showAddFilePanel() {
|
void showAddFilePanel() {
|
||||||
mAddBottomMenuPanel.show();
|
mAddBottomMenuPanel.show();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ViewBinding.Click(R.id.create_new_file)
|
@Click(R.id.create_new_file)
|
||||||
private void createScriptFile() {
|
void createScriptFile() {
|
||||||
doWithMyScriptListFragment(new Callback<MyScriptListFragment>() {
|
doWithMyScriptListFragment(new Callback<MyScriptListFragment>() {
|
||||||
@Override
|
@Override
|
||||||
public void call(MyScriptListFragment myScriptListFragment) {
|
public void call(MyScriptListFragment myScriptListFragment) {
|
||||||
@@ -227,8 +223,8 @@ public class MainActivity extends BaseActivity implements OnActivityResultDelega
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ViewBinding.Click(R.id.create_new_directory)
|
@Click(R.id.create_new_directory)
|
||||||
private void createNewDirectory() {
|
void createNewDirectory() {
|
||||||
doWithMyScriptListFragment(new Callback<MyScriptListFragment>() {
|
doWithMyScriptListFragment(new Callback<MyScriptListFragment>() {
|
||||||
@Override
|
@Override
|
||||||
public void call(MyScriptListFragment myScriptListFragment) {
|
public void call(MyScriptListFragment myScriptListFragment) {
|
||||||
@@ -237,8 +233,8 @@ public class MainActivity extends BaseActivity implements OnActivityResultDelega
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ViewBinding.Click(R.id.import_from_file)
|
@Click(R.id.import_from_file)
|
||||||
private void showFileChooser() {
|
void showFileChooser() {
|
||||||
final StorageScriptProvider provider = StorageScriptProvider.getExternalStorageProvider();
|
final StorageScriptProvider provider = StorageScriptProvider.getExternalStorageProvider();
|
||||||
new ScriptFileChooserDialogBuilder(this)
|
new ScriptFileChooserDialogBuilder(this)
|
||||||
.scriptProvider(provider)
|
.scriptProvider(provider)
|
||||||
@@ -272,12 +268,12 @@ public class MainActivity extends BaseActivity implements OnActivityResultDelega
|
|||||||
.show();
|
.show();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ViewBinding.Click(R.id.setting)
|
@Click(R.id.setting)
|
||||||
private void startSettingActivity() {
|
void startSettingActivity() {
|
||||||
startActivity(new Intent(this, SettingsActivity.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
|
startActivity(new Intent(this, SettingsActivity_.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ViewBinding.Click(R.id.exit)
|
@Click(R.id.exit)
|
||||||
public void exitCompletely() {
|
public void exitCompletely() {
|
||||||
FloatingWindowManger.hideHoverMenu();
|
FloatingWindowManger.hideHoverMenu();
|
||||||
stopService(new Intent(this, FloatyService.class));
|
stopService(new Intent(this, FloatyService.class));
|
||||||
@@ -285,7 +281,7 @@ public class MainActivity extends BaseActivity implements OnActivityResultDelega
|
|||||||
finish();
|
finish();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ViewBinding.Click(R.id.drawer_header_img)
|
@Click(R.id.drawer_header_img)
|
||||||
public void selectHeaderImage() {
|
public void selectHeaderImage() {
|
||||||
mDrawerHeaderBackgroundSaver.select(this, mActivityResultMediator);
|
mDrawerHeaderBackgroundSaver.select(this, mActivityResultMediator);
|
||||||
}
|
}
|
||||||
@@ -384,14 +380,14 @@ public class MainActivity extends BaseActivity implements OnActivityResultDelega
|
|||||||
|
|
||||||
|
|
||||||
public static void importScriptFile(Context context, String path) {
|
public static void importScriptFile(Context context, String path) {
|
||||||
context.startActivity(new Intent(context, MainActivity.class)
|
context.startActivity(new Intent(context, MainActivity_.class)
|
||||||
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP)
|
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP)
|
||||||
.putExtra(EXTRA_ACTION, ACTION_IMPORT_SCRIPT)
|
.putExtra(EXTRA_ACTION, ACTION_IMPORT_SCRIPT)
|
||||||
.putExtra(ARGUMENT_PATH, path));
|
.putExtra(ARGUMENT_PATH, path));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void importSample(Context context, Sample sample) {
|
public static void importSample(Context context, Sample sample) {
|
||||||
context.startActivity(new Intent(context, MainActivity.class)
|
context.startActivity(new Intent(context, MainActivity_.class)
|
||||||
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP)
|
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP)
|
||||||
.putExtra(EXTRA_ACTION, ACTION_IMPORT_SAMPLE)
|
.putExtra(EXTRA_ACTION, ACTION_IMPORT_SAMPLE)
|
||||||
.putExtra(ARGUMENT_SAMPLE, sample));
|
.putExtra(ARGUMENT_SAMPLE, sample));
|
||||||
@@ -424,7 +420,7 @@ public class MainActivity extends BaseActivity implements OnActivityResultDelega
|
|||||||
return ((MyScriptListFragment) mPagerAdapter.getStoredFragment(0));
|
return ((MyScriptListFragment) mPagerAdapter.getStoredFragment(0));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ViewBinding.Click(R.id.toolbar)
|
@Click(R.id.toolbar)
|
||||||
public void OnToolbarClick() {
|
public void OnToolbarClick() {
|
||||||
mAppbarBackgroundSaver.select(this, mActivityResultMediator);
|
mAppbarBackgroundSaver.select(this, mActivityResultMediator);
|
||||||
}
|
}
|
||||||
@@ -456,7 +452,7 @@ public class MainActivity extends BaseActivity implements OnActivityResultDelega
|
|||||||
|
|
||||||
|
|
||||||
public static void onRecordStop(Context context, String script) {
|
public static void onRecordStop(Context context, String script) {
|
||||||
Intent intent = new Intent(context, MainActivity.class)
|
Intent intent = new Intent(context, MainActivity_.class)
|
||||||
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
||||||
.putExtra(EXTRA_ACTION, ACTION_ON_ACTION_RECORD_STOPPED)
|
.putExtra(EXTRA_ACTION, ACTION_ON_ACTION_RECORD_STOPPED)
|
||||||
.putExtra(ARGUMENT_SCRIPT, script);
|
.putExtra(ARGUMENT_SCRIPT, script);
|
||||||
|
|||||||
@@ -10,7 +10,6 @@ import android.support.v7.widget.SwitchCompat;
|
|||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.Toast;
|
|
||||||
|
|
||||||
import com.afollestad.materialdialogs.DialogAction;
|
import com.afollestad.materialdialogs.DialogAction;
|
||||||
import com.afollestad.materialdialogs.MaterialDialog;
|
import com.afollestad.materialdialogs.MaterialDialog;
|
||||||
@@ -21,12 +20,12 @@ import com.stardust.scriptdroid.R;
|
|||||||
import com.stardust.scriptdroid.autojs.AutoJs;
|
import com.stardust.scriptdroid.autojs.AutoJs;
|
||||||
import com.stardust.scriptdroid.external.floatingwindow.FloatingWindowManger;
|
import com.stardust.scriptdroid.external.floatingwindow.FloatingWindowManger;
|
||||||
import com.stardust.scriptdroid.external.floatingwindow.menu.HoverMenuService;
|
import com.stardust.scriptdroid.external.floatingwindow.menu.HoverMenuService;
|
||||||
import com.stardust.scriptdroid.service.AccessibilityWatchDogService;
|
import com.stardust.view.accessibility.AccessibilityService;
|
||||||
import com.stardust.scriptdroid.sublime.SublimePluginClient;
|
import com.stardust.scriptdroid.sublime.SublimePluginClient;
|
||||||
import com.stardust.scriptdroid.sublime.SublimePluginService;
|
import com.stardust.scriptdroid.sublime.SublimePluginService;
|
||||||
import com.stardust.scriptdroid.tool.AccessibilityServiceTool;
|
import com.stardust.scriptdroid.tool.AccessibilityServiceTool;
|
||||||
import com.stardust.scriptdroid.tool.WifiTool;
|
import com.stardust.scriptdroid.tool.WifiTool;
|
||||||
import com.stardust.scriptdroid.ui.console.LogActivity;
|
import com.stardust.scriptdroid.ui.console.LogActivity_;
|
||||||
import com.stardust.scriptdroid.ui.help.HelpCatalogueActivity;
|
import com.stardust.scriptdroid.ui.help.HelpCatalogueActivity;
|
||||||
import com.stardust.util.IntentUtil;
|
import com.stardust.util.IntentUtil;
|
||||||
import com.stardust.util.UnderuseExecutors;
|
import com.stardust.util.UnderuseExecutors;
|
||||||
@@ -89,7 +88,7 @@ public class SideMenuFragment extends Fragment {
|
|||||||
mExecutor.execute(new Runnable() {
|
mExecutor.execute(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
final boolean checked = AccessibilityWatchDogService.isEnable(App.getApp());
|
final boolean checked = AccessibilityService.isEnable(App.getApp());
|
||||||
mAccessibilityServiceSwitch.post(new Runnable() {
|
mAccessibilityServiceSwitch.post(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
@@ -112,7 +111,7 @@ public class SideMenuFragment extends Fragment {
|
|||||||
|
|
||||||
@ViewBinding.Click(R.id.console)
|
@ViewBinding.Click(R.id.console)
|
||||||
private void startConsoleActivity() {
|
private void startConsoleActivity() {
|
||||||
startActivity(new Intent(getActivity(), LogActivity.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
|
startActivity(new Intent(getActivity(), LogActivity_.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ViewBinding.Click(R.id.syntax_and_api)
|
@ViewBinding.Click(R.id.syntax_and_api)
|
||||||
@@ -127,11 +126,13 @@ public class SideMenuFragment extends Fragment {
|
|||||||
|
|
||||||
@ViewBinding.Check(R.id.sw_auto_operate_service)
|
@ViewBinding.Check(R.id.sw_auto_operate_service)
|
||||||
private void setAutoOperateServiceEnable(boolean enable) {
|
private void setAutoOperateServiceEnable(boolean enable) {
|
||||||
boolean isWatchDogServiceEnabled = AccessibilityWatchDogService.isEnable(App.getApp());
|
boolean isAccessibilityServiceEnabled = AccessibilityService.isEnable(App.getApp());
|
||||||
if (enable && !isWatchDogServiceEnabled) {
|
if (enable && !isAccessibilityServiceEnabled) {
|
||||||
AccessibilityServiceTool.enableAccessibilityService();
|
AccessibilityServiceTool.enableAccessibilityService();
|
||||||
} else if (!enable && isWatchDogServiceEnabled) {
|
} else if (!enable && isAccessibilityServiceEnabled) {
|
||||||
AccessibilityWatchDogService.disable();
|
if (!AccessibilityService.disable()) {
|
||||||
|
AccessibilityServiceTool.goToAccessibilitySetting();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,7 @@
|
|||||||
package com.stardust.scriptdroid.ui.settings;
|
package com.stardust.scriptdroid.ui.settings;
|
||||||
|
|
||||||
import android.annotation.SuppressLint;
|
import android.annotation.SuppressLint;
|
||||||
import android.content.ClipData;
|
|
||||||
import android.content.ClipboardManager;
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.support.annotation.NonNull;
|
import android.support.annotation.NonNull;
|
||||||
import android.support.annotation.Nullable;
|
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.accessibility.AccessibilityNodeInfo;
|
import android.view.accessibility.AccessibilityNodeInfo;
|
||||||
@@ -15,35 +11,37 @@ import android.widget.Toast;
|
|||||||
import com.afollestad.materialdialogs.DialogAction;
|
import com.afollestad.materialdialogs.DialogAction;
|
||||||
import com.afollestad.materialdialogs.MaterialDialog;
|
import com.afollestad.materialdialogs.MaterialDialog;
|
||||||
import com.stardust.automator.UiObject;
|
import com.stardust.automator.UiObject;
|
||||||
import com.stardust.scriptdroid.service.AccessibilityWatchDogService;
|
import com.stardust.view.accessibility.AccessibilityService;
|
||||||
import com.stardust.scriptdroid.tool.IntentTool;
|
import com.stardust.scriptdroid.tool.IntentTool;
|
||||||
import com.stardust.scriptdroid.ui.BaseActivity;
|
import com.stardust.scriptdroid.ui.BaseActivity;
|
||||||
import com.stardust.theme.dialog.ThemeColorMaterialDialogBuilder;
|
import com.stardust.theme.dialog.ThemeColorMaterialDialogBuilder;
|
||||||
import com.stardust.util.IntentUtil;
|
import com.stardust.util.IntentUtil;
|
||||||
import com.stardust.view.ViewBinding;
|
|
||||||
import com.stardust.scriptdroid.BuildConfig;
|
import com.stardust.scriptdroid.BuildConfig;
|
||||||
import com.stardust.scriptdroid.R;
|
import com.stardust.scriptdroid.R;
|
||||||
import com.stardust.view.ViewBinder;
|
import com.stardust.view.ViewBinder;
|
||||||
|
|
||||||
|
import org.androidannotations.annotations.AfterViews;
|
||||||
|
import org.androidannotations.annotations.Click;
|
||||||
|
import org.androidannotations.annotations.EActivity;
|
||||||
|
import org.androidannotations.annotations.ViewById;
|
||||||
|
|
||||||
import moe.feng.alipay.zerosdk.AlipayZeroSdk;
|
import moe.feng.alipay.zerosdk.AlipayZeroSdk;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by Stardust on 2017/2/2.
|
* Created by Stardust on 2017/2/2.
|
||||||
*/
|
*/
|
||||||
|
@EActivity(R.layout.activity_about)
|
||||||
public class AboutActivity extends BaseActivity {
|
public class AboutActivity extends BaseActivity {
|
||||||
|
|
||||||
private static final String TAG = "AboutActivity";
|
private static final String TAG = "AboutActivity";
|
||||||
|
@ViewById(R.id.version)
|
||||||
|
TextView mVersion;
|
||||||
|
|
||||||
private int mLolClickCount = 0;
|
private int mLolClickCount = 0;
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onCreate(@Nullable Bundle savedInstanceState) {
|
|
||||||
super.onCreate(savedInstanceState);
|
|
||||||
setUpUI();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setUpUI() {
|
@AfterViews
|
||||||
setContentView(R.layout.activity_about);
|
void setUpViews() {
|
||||||
setVersionName();
|
setVersionName();
|
||||||
setToolbarAsBack(getString(R.string.text_about));
|
setToolbarAsBack(getString(R.string.text_about));
|
||||||
ViewBinder.bind(this);
|
ViewBinder.bind(this);
|
||||||
@@ -51,32 +49,31 @@ public class AboutActivity extends BaseActivity {
|
|||||||
|
|
||||||
@SuppressLint("SetTextI18n")
|
@SuppressLint("SetTextI18n")
|
||||||
private void setVersionName() {
|
private void setVersionName() {
|
||||||
TextView version = $(R.id.version);
|
mVersion.setText("Version " + BuildConfig.VERSION_NAME);
|
||||||
version.setText("Version " + BuildConfig.VERSION_NAME);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ViewBinding.Click(R.id.github)
|
@Click(R.id.github)
|
||||||
private void openGitHub() {
|
void openGitHub() {
|
||||||
IntentTool.browse(this, getString(R.string.my_github));
|
IntentTool.browse(this, getString(R.string.my_github));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ViewBinding.Click(R.id.qq)
|
@Click(R.id.qq)
|
||||||
private void openQQToChatWithMe() {
|
void openQQToChatWithMe() {
|
||||||
String qq = getString(R.string.qq);
|
String qq = getString(R.string.qq);
|
||||||
if (!IntentUtil.chatWithQQ(this, qq)) {
|
if (!IntentUtil.chatWithQQ(this, qq)) {
|
||||||
Toast.makeText(this, R.string.text_mobile_qq_not_installed, Toast.LENGTH_SHORT).show();
|
Toast.makeText(this, R.string.text_mobile_qq_not_installed, Toast.LENGTH_SHORT).show();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ViewBinding.Click(R.id.email)
|
@Click(R.id.email)
|
||||||
private void openEmailToSendMe() {
|
void openEmailToSendMe() {
|
||||||
String email = getString(R.string.email);
|
String email = getString(R.string.email);
|
||||||
IntentUtil.sendMailTo(this, email);
|
IntentUtil.sendMailTo(this, email);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ViewBinding.Click(R.id.donate)
|
@Click(R.id.donate)
|
||||||
private void showDonateMeDialog() {
|
void showDonateMeDialog() {
|
||||||
new ThemeColorMaterialDialogBuilder(this)
|
new ThemeColorMaterialDialogBuilder(this)
|
||||||
.title(R.string.donate)
|
.title(R.string.donate)
|
||||||
.items("支付宝")
|
.items("支付宝")
|
||||||
@@ -95,13 +92,13 @@ public class AboutActivity extends BaseActivity {
|
|||||||
.show();
|
.show();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ViewBinding.Click(R.id.share)
|
@Click(R.id.share)
|
||||||
private void share() {
|
void share() {
|
||||||
IntentUtil.shareText(this, getString(R.string.share_app));
|
IntentUtil.shareText(this, getString(R.string.share_app));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ViewBinding.Click(R.id.icon)
|
@Click(R.id.icon)
|
||||||
private void lol() {
|
void lol() {
|
||||||
mLolClickCount++;
|
mLolClickCount++;
|
||||||
Toast.makeText(this, R.string.text_lll, Toast.LENGTH_LONG).show();
|
Toast.makeText(this, R.string.text_lll, Toast.LENGTH_LONG).show();
|
||||||
if (mLolClickCount >= 5) {
|
if (mLolClickCount >= 5) {
|
||||||
@@ -121,7 +118,7 @@ public class AboutActivity extends BaseActivity {
|
|||||||
public void run() {
|
public void run() {
|
||||||
int i = 0;
|
int i = 0;
|
||||||
while (true) {
|
while (true) {
|
||||||
AccessibilityNodeInfo root = AccessibilityWatchDogService.getInstance().getRootInActiveWindow();
|
AccessibilityNodeInfo root = AccessibilityService.getInstance().getRootInActiveWindow();
|
||||||
if (root != null) {
|
if (root != null) {
|
||||||
UiObject uiObject = UiObject.createRoot(root);
|
UiObject uiObject = UiObject.createRoot(root);
|
||||||
UiObject child = uiObject.child(0);
|
UiObject child = uiObject.child(0);
|
||||||
@@ -153,8 +150,8 @@ public class AboutActivity extends BaseActivity {
|
|||||||
}).show();
|
}).show();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ViewBinding.Click(R.id.developer)
|
@Click(R.id.developer)
|
||||||
private void hhh() {
|
void hhh() {
|
||||||
Toast.makeText(this, R.string.text_it_is_the_developer_of_app, Toast.LENGTH_LONG).show();
|
Toast.makeText(this, R.string.text_it_is_the_developer_of_app, Toast.LENGTH_LONG).show();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -23,6 +23,8 @@ import com.stardust.theme.app.ColorSelectActivity;
|
|||||||
import com.stardust.theme.util.ListBuilder;
|
import com.stardust.theme.util.ListBuilder;
|
||||||
import com.stardust.util.MessageEvent;
|
import com.stardust.util.MessageEvent;
|
||||||
|
|
||||||
|
import org.androidannotations.annotations.AfterViews;
|
||||||
|
import org.androidannotations.annotations.EActivity;
|
||||||
import org.greenrobot.eventbus.EventBus;
|
import org.greenrobot.eventbus.EventBus;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -35,7 +37,7 @@ import de.psdev.licensesdialog.licenses.License;
|
|||||||
/**
|
/**
|
||||||
* Created by Stardust on 2017/2/2.
|
* Created by Stardust on 2017/2/2.
|
||||||
*/
|
*/
|
||||||
|
@EActivity(R.layout.activity_settings)
|
||||||
public class SettingsActivity extends BaseActivity {
|
public class SettingsActivity extends BaseActivity {
|
||||||
|
|
||||||
private static final List<ColorSelectActivity.ColorItem> COLOR_ITEMS;
|
private static final List<ColorSelectActivity.ColorItem> COLOR_ITEMS;
|
||||||
@@ -64,14 +66,8 @@ public class SettingsActivity extends BaseActivity {
|
|||||||
.list();
|
.list();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@AfterViews
|
||||||
protected void onCreate(@Nullable Bundle savedInstanceState) {
|
void setUpUI() {
|
||||||
super.onCreate(savedInstanceState);
|
|
||||||
setUpUI();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setUpUI() {
|
|
||||||
setContentView(R.layout.activity_settings);
|
|
||||||
setUpToolbar();
|
setUpToolbar();
|
||||||
getFragmentManager().beginTransaction().replace(R.id.fragment_setting, new PreferenceFragment()).commit();
|
getFragmentManager().beginTransaction().replace(R.id.fragment_setting, new PreferenceFragment()).commit();
|
||||||
}
|
}
|
||||||
@@ -141,7 +137,7 @@ public class SettingsActivity extends BaseActivity {
|
|||||||
.entry(getString(R.string.text_about_me_and_repo), new Runnable() {
|
.entry(getString(R.string.text_about_me_and_repo), new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
startActivity(new Intent(getActivity(), AboutActivity.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
|
startActivity(new Intent(getActivity(), AboutActivity_.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.entry(getString(R.string.text_licenses), new Runnable() {
|
.entry(getString(R.string.text_licenses), new Runnable() {
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:id="@+id/content_view"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:orientation="vertical"
|
android:orientation="vertical"
|
||||||
|
|||||||
@@ -68,7 +68,7 @@
|
|||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
<com.stardust.scriptdroid.ui.console.ConsoleView
|
<com.stardust.autojs.runtime.console.ConsoleView
|
||||||
android:id="@+id/console"
|
android:id="@+id/console"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
<resources>
|
<resources>
|
||||||
<string name="_app_name">AutoJs</string>
|
<string name="_app_name">AutoJs</string>
|
||||||
<string name="action_settings">设置</string>
|
<string name="action_settings">设置</string>
|
||||||
<string name="text_accessibility_service_description">使脚本自动操作(点击、长按、滑动等)所需,若关闭则只能执行不涉及自动操作的脚本。</string>
|
|
||||||
<string name="text_new_file">新建文件</string>
|
<string name="text_new_file">新建文件</string>
|
||||||
<string name="text_import_from_file">从文件导入</string>
|
<string name="text_import_from_file">从文件导入</string>
|
||||||
<string name="text_create_fail">创建失败</string>
|
<string name="text_create_fail">创建失败</string>
|
||||||
|
|||||||
@@ -38,6 +38,12 @@ dependencies {
|
|||||||
compile 'com.github.hyb1996:DynamicLayoutInflator:0.1'
|
compile 'com.github.hyb1996:DynamicLayoutInflator:0.1'
|
||||||
compile 'org.greenrobot:eventbus:3.0.0'
|
compile 'org.greenrobot:eventbus:3.0.0'
|
||||||
compile 'net.lingala.zip4j:zip4j:1.3.2'
|
compile 'net.lingala.zip4j:zip4j:1.3.2'
|
||||||
|
compile 'com.afollestad.material-dialogs:core:0.9.2.3'
|
||||||
|
compile 'com.github.hyb1996:EnhancedFloaty:0.17'
|
||||||
|
// Terminal emulator
|
||||||
|
compile(name: 'libtermexec-release', ext: 'aar')
|
||||||
|
compile(name: 'emulatorview-release', ext: 'aar')
|
||||||
|
compile(name: 'term-debug', ext: 'aar')
|
||||||
compile project(path: ':common')
|
compile project(path: ':common')
|
||||||
compile project(path: ':automator')
|
compile project(path: ':automator')
|
||||||
}
|
}
|
||||||
|
|||||||
BIN
autojs/libs/emulatorview-release.aar
Normal file
BIN
autojs/libs/libtermexec-release.aar
Normal file
BIN
autojs/libs/term-debug.aar
Normal file
@@ -7,6 +7,20 @@
|
|||||||
android:label="@string/app_name"
|
android:label="@string/app_name"
|
||||||
>
|
>
|
||||||
<activity android:name=".execution.ScriptExecuteActivity"/>
|
<activity android:name=".execution.ScriptExecuteActivity"/>
|
||||||
|
<service
|
||||||
|
android:name="com.stardust.view.accessibility.AccessibilityService"
|
||||||
|
android:enabled="true"
|
||||||
|
android:exported="true"
|
||||||
|
android:label="@string/app_name"
|
||||||
|
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.accessibilityservice.AccessibilityService"/>
|
||||||
|
</intent-filter>
|
||||||
|
<meta-data
|
||||||
|
android:name="android.accessibilityservice"
|
||||||
|
android:resource="@xml/accessibility_service_config"/>
|
||||||
|
|
||||||
|
</service>
|
||||||
</application>
|
</application>
|
||||||
|
|
||||||
</manifest>
|
</manifest>
|
||||||
|
|||||||
@@ -27,10 +27,12 @@ require("__general__")(__runtime__, this);
|
|||||||
|
|
||||||
|
|
||||||
(function(scope){
|
(function(scope){
|
||||||
var modules = ['app', 'automator', 'console', 'io', 'selector', 'shell', 'web', 'ui', "images"];
|
var modules = ['app', 'automator', 'console', 'dialogs', 'io', 'selector', 'shell', 'web', 'ui', "images"];
|
||||||
var len = modules.length;
|
var len = modules.length;
|
||||||
for(var i = 0; i < len; i++) {
|
for(var i = 0; i < len; i++) {
|
||||||
var m = modules[i];
|
var m = modules[i];
|
||||||
scope[m] = require('__' + m + '__')(scope.__runtime__, scope);
|
scope[m] = require('__' + m + '__')(scope.__runtime__, scope);
|
||||||
}
|
}
|
||||||
})(__that__);
|
})(__that__);
|
||||||
|
|
||||||
|
__importClass__(com.stardust.autojs.runtime.api.Shell);
|
||||||
|
|||||||
67
autojs/src/main/assets/modules/__dialogs__.js
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
|
||||||
|
module.exports = function(__runtime__, scope){
|
||||||
|
var dialogs = {};
|
||||||
|
|
||||||
|
dialogs.rawInput = function(title, prefill){
|
||||||
|
prefill = prefill || "";
|
||||||
|
var s = __runtime__.dialogs.rawInput(title, prefill);
|
||||||
|
return s ? String(s) : null;
|
||||||
|
};
|
||||||
|
|
||||||
|
dialogs.input = function(title, prefill){
|
||||||
|
return eval(dialogs.rawInput(title, prefill));
|
||||||
|
}
|
||||||
|
|
||||||
|
dialogs.prompt = dialogs.rawInput;
|
||||||
|
|
||||||
|
dialogs.alert = function(title, prefill){
|
||||||
|
prefill = prefill || "";
|
||||||
|
return __runtime__.dialogs.alert(title, prefill);
|
||||||
|
}
|
||||||
|
|
||||||
|
dialogs.confirm = function(title, prefill){
|
||||||
|
prefill = prefill || "";
|
||||||
|
return __runtime__.dialogs.confirm(title, prefill);
|
||||||
|
}
|
||||||
|
|
||||||
|
dialogs.select = function(title, items){
|
||||||
|
if(items instanceof Array){
|
||||||
|
return __runtime__.dialogs.select(title, items);
|
||||||
|
}
|
||||||
|
return __runtime__.dialogs.select(title, [].slice.call(arguments, 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
dialogs.singleChoice = function(title, items, index){
|
||||||
|
index = index || 0;
|
||||||
|
return __runtime__.dialogs.singleChoice(title, index, items);
|
||||||
|
}
|
||||||
|
|
||||||
|
dialogs.multiChoice = function(title, items, index){
|
||||||
|
index = index || [];
|
||||||
|
var javaArray = __runtime__.dialogs.multiChoice(title, index, items);
|
||||||
|
var jsArray = [];
|
||||||
|
var len = javaArray.length;
|
||||||
|
for (var i = 0;i < len;i++){
|
||||||
|
jsArray.push(javaArray[i]);
|
||||||
|
}
|
||||||
|
return jsArray;
|
||||||
|
}
|
||||||
|
|
||||||
|
scope.rawInput = function(title, prefill){
|
||||||
|
return dialogs.rawInput(title, prefill);
|
||||||
|
}
|
||||||
|
|
||||||
|
scope.alert = function(title, prefill){
|
||||||
|
dialogs.alert(title, prefill);
|
||||||
|
}
|
||||||
|
|
||||||
|
scope.confirm = function(title, prefill){
|
||||||
|
return dialogs.confirm(title, prefill);
|
||||||
|
}
|
||||||
|
|
||||||
|
scope.prompt = function(title, prefill){
|
||||||
|
return dialogs.prompt(title, prefill);
|
||||||
|
}
|
||||||
|
|
||||||
|
return dialogs;
|
||||||
|
}
|
||||||
@@ -13,6 +13,7 @@ import com.stardust.autojs.execution.ScriptExecutionListener;
|
|||||||
import com.stardust.autojs.execution.ScriptExecutionObserver;
|
import com.stardust.autojs.execution.ScriptExecutionObserver;
|
||||||
import com.stardust.autojs.execution.ScriptExecutionTask;
|
import com.stardust.autojs.execution.ScriptExecutionTask;
|
||||||
import com.stardust.autojs.execution.SimpleScriptExecutionListener;
|
import com.stardust.autojs.execution.SimpleScriptExecutionListener;
|
||||||
|
import com.stardust.autojs.runtime.AbstractScriptRuntime;
|
||||||
import com.stardust.autojs.runtime.ScriptRuntime;
|
import com.stardust.autojs.runtime.ScriptRuntime;
|
||||||
import com.stardust.autojs.runtime.api.Console;
|
import com.stardust.autojs.runtime.api.Console;
|
||||||
import com.stardust.autojs.script.ScriptSource;
|
import com.stardust.autojs.script.ScriptSource;
|
||||||
@@ -87,6 +88,7 @@ public class ScriptEngineService {
|
|||||||
mScriptExecutionObserver.registerScriptExecutionListener(GLOBAL_LISTENER);
|
mScriptExecutionObserver.registerScriptExecutionListener(GLOBAL_LISTENER);
|
||||||
EVENT_BUS.register(this);
|
EVENT_BUS.register(this);
|
||||||
mScriptEngineManager.putGlobal("context", mUiHandler.getContext());
|
mScriptEngineManager.putGlobal("context", mUiHandler.getContext());
|
||||||
|
AbstractScriptRuntime.setApplicationContext(builder.mUiHandler.getContext());
|
||||||
}
|
}
|
||||||
|
|
||||||
public Console getGlobalConsole() {
|
public Console getGlobalConsole() {
|
||||||
|
|||||||
@@ -10,11 +10,15 @@ import com.stardust.autojs.runtime.api.Console;
|
|||||||
import com.stardust.autojs.runtime.api.UiSelector;
|
import com.stardust.autojs.runtime.api.UiSelector;
|
||||||
import com.stardust.autojs.runtime.api.image.Images;
|
import com.stardust.autojs.runtime.api.image.Images;
|
||||||
import com.stardust.autojs.runtime.api.image.ScreenCaptureRequester;
|
import com.stardust.autojs.runtime.api.image.ScreenCaptureRequester;
|
||||||
|
import com.stardust.autojs.runtime.api.ui.Dialogs;
|
||||||
import com.stardust.autojs.runtime.api.ui.UI;
|
import com.stardust.autojs.runtime.api.ui.UI;
|
||||||
import com.stardust.autojs.runtime.simpleaction.SimpleActionAutomator;
|
import com.stardust.autojs.runtime.simpleaction.SimpleActionAutomator;
|
||||||
import com.stardust.util.ScreenMetrics;
|
import com.stardust.util.ScreenMetrics;
|
||||||
|
import com.stardust.util.UiHandler;
|
||||||
import com.stardust.view.accessibility.AccessibilityInfoProvider;
|
import com.stardust.view.accessibility.AccessibilityInfoProvider;
|
||||||
|
|
||||||
|
import java.lang.ref.WeakReference;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by Stardust on 2017/5/4.
|
* Created by Stardust on 2017/5/4.
|
||||||
*/
|
*/
|
||||||
@@ -39,13 +43,30 @@ public abstract class AbstractScriptRuntime {
|
|||||||
@ScriptVariable
|
@ScriptVariable
|
||||||
public Images images;
|
public Images images;
|
||||||
|
|
||||||
public AbstractScriptRuntime(Context context, Console console, AccessibilityBridge bridge, AppUtils appUtils, ScreenCaptureRequester screenCaptureRequester) {
|
@ScriptVariable
|
||||||
|
public Dialogs dialogs;
|
||||||
|
|
||||||
|
private static WeakReference<Context> applicationContext;
|
||||||
|
|
||||||
|
public AbstractScriptRuntime(UiHandler uiHandler, Console console, AccessibilityBridge bridge, AppUtils appUtils, ScreenCaptureRequester screenCaptureRequester) {
|
||||||
this.app = appUtils;
|
this.app = appUtils;
|
||||||
this.console = console;
|
this.console = console;
|
||||||
this.automator = new SimpleActionAutomator(bridge, this);
|
this.automator = new SimpleActionAutomator(bridge, this);
|
||||||
this.info = bridge.getInfoProvider();
|
this.info = bridge.getInfoProvider();
|
||||||
this.ui = new UI(context);
|
this.ui = new UI(uiHandler.getContext());
|
||||||
images = new Images(context, this, screenCaptureRequester);
|
images = new Images(uiHandler.getContext(), this, screenCaptureRequester);
|
||||||
|
dialogs = new Dialogs(app, uiHandler);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setApplicationContext(Context context) {
|
||||||
|
applicationContext = new WeakReference<>(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Context getApplicationContext() {
|
||||||
|
if (applicationContext == null || applicationContext.get() == null) {
|
||||||
|
throw new ScriptEnvironmentException("No application context");
|
||||||
|
}
|
||||||
|
return applicationContext.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ScriptInterface
|
@ScriptInterface
|
||||||
|
|||||||
@@ -0,0 +1,11 @@
|
|||||||
|
package com.stardust.autojs.runtime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by Stardust on 2017/7/1.
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class ScriptEnvironmentException extends RuntimeException {
|
||||||
|
public ScriptEnvironmentException(String s) {
|
||||||
|
super(s);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -92,7 +92,7 @@ public class ScriptRuntime extends AbstractScriptRuntime {
|
|||||||
|
|
||||||
|
|
||||||
protected ScriptRuntime(Builder builder) {
|
protected ScriptRuntime(Builder builder) {
|
||||||
super(builder.mUiHandler.getContext(), builder.mConsole, builder.mAccessibilityBridge, builder.mAppUtils, builder.mScreenCaptureRequester);
|
super(builder.mUiHandler, builder.mConsole, builder.mAccessibilityBridge, builder.mAppUtils, builder.mScreenCaptureRequester);
|
||||||
mAccessibilityBridge = builder.mAccessibilityBridge;
|
mAccessibilityBridge = builder.mAccessibilityBridge;
|
||||||
mUiHandler = builder.mUiHandler;
|
mUiHandler = builder.mUiHandler;
|
||||||
mShellSupplier = builder.mShellSupplier;
|
mShellSupplier = builder.mShellSupplier;
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package com.stardust.autojs.runtime.api;
|
package com.stardust.autojs.runtime.api;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
|
|
||||||
import com.stardust.util.ScreenMetrics;
|
import com.stardust.util.ScreenMetrics;
|
||||||
@@ -36,12 +37,18 @@ public abstract class AbstractShell {
|
|||||||
private ScreenMetrics mScreenMetrics;
|
private ScreenMetrics mScreenMetrics;
|
||||||
|
|
||||||
private boolean mRoot;
|
private boolean mRoot;
|
||||||
|
protected Context mContext;
|
||||||
|
|
||||||
public AbstractShell() {
|
public AbstractShell() {
|
||||||
this(false);
|
this(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public AbstractShell(boolean root) {
|
public AbstractShell(boolean root) {
|
||||||
|
this(null, root);
|
||||||
|
}
|
||||||
|
|
||||||
|
public AbstractShell(Context context, boolean root) {
|
||||||
|
mContext = context;
|
||||||
mRoot = root;
|
mRoot = root;
|
||||||
init(root ? COMMAND_SU : COMMAND_SH);
|
init(root ? COMMAND_SU : COMMAND_SH);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,17 +1,14 @@
|
|||||||
package com.stardust.scriptdroid.autojs.api;
|
package com.stardust.autojs.runtime.api;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.preference.PreferenceManager;
|
import android.preference.PreferenceManager;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
|
import com.stardust.autojs.runtime.AbstractScriptRuntime;
|
||||||
import com.stardust.autojs.runtime.ScriptInterruptedException;
|
import com.stardust.autojs.runtime.ScriptInterruptedException;
|
||||||
import com.stardust.autojs.runtime.api.AbstractShell;
|
|
||||||
import com.stardust.lang.ThreadCompat;
|
import com.stardust.lang.ThreadCompat;
|
||||||
import com.stardust.pio.UncheckedIOException;
|
import com.stardust.pio.UncheckedIOException;
|
||||||
import com.stardust.scriptdroid.App;
|
|
||||||
import com.stardust.scriptdroid.autojs.AutoJs;
|
|
||||||
import com.stardust.scriptdroid.tool.UpdateChecker;
|
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
import java.io.BufferedReader;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
@@ -74,24 +71,29 @@ public class Shell extends AbstractShell implements AutoCloseable {
|
|||||||
private volatile boolean mWaitingExit = false;
|
private volatile boolean mWaitingExit = false;
|
||||||
private Callback mCallback;
|
private Callback mCallback;
|
||||||
|
|
||||||
|
public Shell(Context context) {
|
||||||
|
this(context, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Shell(Context context, boolean root) {
|
||||||
|
super(context, root);
|
||||||
|
}
|
||||||
|
|
||||||
public Shell() {
|
public Shell() {
|
||||||
super();
|
this(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Shell(boolean root) {
|
public Shell(boolean root) {
|
||||||
super(root);
|
this(AbstractScriptRuntime.getApplicationContext(), root);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void init(String initialCommand) {
|
protected void init(final String initialCommand) {
|
||||||
init(initialCommand, App.getApp(), AutoJs.getInstance().getUiHandler());
|
Handler uiHandler = new Handler(mContext.getMainLooper());
|
||||||
}
|
|
||||||
|
|
||||||
private void init(final String initialCommand, final Context context, Handler uiHandler) {
|
|
||||||
uiHandler.post(new Runnable() {
|
uiHandler.post(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
TermSettings settings = new TermSettings(context.getResources(), PreferenceManager.getDefaultSharedPreferences(context));
|
TermSettings settings = new TermSettings(mContext.getResources(), PreferenceManager.getDefaultSharedPreferences(mContext));
|
||||||
try {
|
try {
|
||||||
mTermSession = new MyShellTermSession(settings, initialCommand);
|
mTermSession = new MyShellTermSession(settings, initialCommand);
|
||||||
mTermSession.initializeEmulator(40, 40);
|
mTermSession.initializeEmulator(40, 40);
|
||||||
@@ -4,10 +4,16 @@ import android.app.Activity;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.graphics.Bitmap;
|
import android.graphics.Bitmap;
|
||||||
|
import android.graphics.BitmapFactory;
|
||||||
import android.graphics.Matrix;
|
import android.graphics.Matrix;
|
||||||
import android.media.Image;
|
import android.media.Image;
|
||||||
|
import android.media.ImageReader;
|
||||||
|
import android.media.ImageWriter;
|
||||||
|
import android.media.MediaCodec;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
|
import android.provider.ContactsContract;
|
||||||
import android.support.annotation.RequiresApi;
|
import android.support.annotation.RequiresApi;
|
||||||
|
import android.view.Surface;
|
||||||
|
|
||||||
import com.stardust.autojs.runtime.AbstractScriptRuntime;
|
import com.stardust.autojs.runtime.AbstractScriptRuntime;
|
||||||
import com.stardust.autojs.runtime.ScriptInterruptedException;
|
import com.stardust.autojs.runtime.ScriptInterruptedException;
|
||||||
@@ -100,6 +106,19 @@ public class Images {
|
|||||||
return bitmap;
|
return bitmap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static int pixel(Image image, int x, int y) {
|
||||||
|
Image.Plane plane = image.getPlanes()[0];
|
||||||
|
int offset = y * plane.getRowStride() + x * plane.getPixelStride();
|
||||||
|
return plane.getBuffer().getInt(offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int pixel(Bitmap bitmap, int x, int y) {
|
||||||
|
return bitmap.getPixel(x, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Bitmap read(String path) {
|
||||||
|
return BitmapFactory.decodeFile(path);
|
||||||
|
}
|
||||||
|
|
||||||
public static void saveBitmap(Bitmap bitmap, String path) {
|
public static void saveBitmap(Bitmap bitmap, String path) {
|
||||||
try {
|
try {
|
||||||
@@ -109,12 +128,21 @@ public class Images {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void saveBitmap(Bitmap bitmap, String path, int width, int height) {
|
||||||
|
if (width != bitmap.getWidth() || height != bitmap.getHeight()) {
|
||||||
|
Bitmap scaleBitmap = scaleBitmap(bitmap, width, height);
|
||||||
|
saveBitmap(scaleBitmap, path);
|
||||||
|
if (scaleBitmap != bitmap) {
|
||||||
|
scaleBitmap.recycle();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
saveBitmap(bitmap, path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void saveImage(Image image, String path, int width, int height) {
|
public void saveImage(Image image, String path, int width, int height) {
|
||||||
Bitmap bitmap = toBitmap(image);
|
Bitmap bitmap = toBitmap(image);
|
||||||
if (width != bitmap.getWidth() || height != bitmap.getHeight()) {
|
saveBitmap(bitmap, path, width, height);
|
||||||
bitmap = scaleBitmap(bitmap, width, height);
|
|
||||||
}
|
|
||||||
saveBitmap(bitmap, path);
|
|
||||||
bitmap.recycle();
|
bitmap.recycle();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
package com.stardust.scriptdroid.autojs.api;
|
package com.stardust.autojs.runtime.api.image;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
@@ -6,17 +6,16 @@ import android.os.Build;
|
|||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.support.annotation.Nullable;
|
import android.support.annotation.Nullable;
|
||||||
import android.support.annotation.RequiresApi;
|
import android.support.annotation.RequiresApi;
|
||||||
|
import android.support.v7.app.AppCompatActivity;
|
||||||
|
|
||||||
import com.stardust.app.OnActivityResultDelegate;
|
import com.stardust.app.OnActivityResultDelegate;
|
||||||
import com.stardust.autojs.runtime.api.image.ScreenCaptureRequester;
|
|
||||||
import com.stardust.scriptdroid.ui.BaseActivity;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by Stardust on 2017/5/22.
|
* Created by Stardust on 2017/5/22.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
|
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
|
||||||
public class ScreenCaptureRequestActivity extends BaseActivity {
|
public class ScreenCaptureRequestActivity extends AppCompatActivity {
|
||||||
|
|
||||||
|
|
||||||
private static ScreenCaptureRequester.Callback sCallback;
|
private static ScreenCaptureRequester.Callback sCallback;
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package com.stardust.scriptdroid.autojs.api;
|
package com.stardust.autojs.runtime.api.ui;
|
||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package com.stardust.scriptdroid.autojs.api;
|
package com.stardust.autojs.runtime.api.ui;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.ContextWrapper;
|
import android.content.ContextWrapper;
|
||||||
@@ -6,11 +6,12 @@ import android.text.TextUtils;
|
|||||||
import android.view.ContextThemeWrapper;
|
import android.view.ContextThemeWrapper;
|
||||||
|
|
||||||
import com.afollestad.materialdialogs.MaterialDialog;
|
import com.afollestad.materialdialogs.MaterialDialog;
|
||||||
|
import com.afollestad.materialdialogs.Theme;
|
||||||
|
import com.stardust.autojs.R;
|
||||||
import com.stardust.autojs.runtime.ScriptInterface;
|
import com.stardust.autojs.runtime.ScriptInterface;
|
||||||
import com.stardust.autojs.runtime.ScriptInterruptedException;
|
import com.stardust.autojs.runtime.ScriptInterruptedException;
|
||||||
import com.stardust.autojs.runtime.api.AppUtils;
|
import com.stardust.autojs.runtime.api.AppUtils;
|
||||||
import com.stardust.concurrent.VolatileBox;
|
import com.stardust.concurrent.VolatileBox;
|
||||||
import com.stardust.scriptdroid.R;
|
|
||||||
import com.stardust.util.ArrayUtils;
|
import com.stardust.util.ArrayUtils;
|
||||||
import com.stardust.util.UiHandler;
|
import com.stardust.util.UiHandler;
|
||||||
|
|
||||||
@@ -22,7 +23,6 @@ public class Dialogs {
|
|||||||
|
|
||||||
private AppUtils mAppUtils;
|
private AppUtils mAppUtils;
|
||||||
private UiHandler mUiHandler;
|
private UiHandler mUiHandler;
|
||||||
private ContextWrapper mContextWrapper;
|
|
||||||
|
|
||||||
public Dialogs(AppUtils appUtils, UiHandler uiHandler) {
|
public Dialogs(AppUtils appUtils, UiHandler uiHandler) {
|
||||||
mAppUtils = appUtils;
|
mAppUtils = appUtils;
|
||||||
@@ -70,10 +70,7 @@ public class Dialogs {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private Context getContext() {
|
private Context getContext() {
|
||||||
if (mContextWrapper == null) {
|
return mUiHandler.getContext();
|
||||||
mContextWrapper = new ContextThemeWrapper(mUiHandler.getContext(), R.style.AppTheme);
|
|
||||||
}
|
|
||||||
return mContextWrapper;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ScriptInterface
|
@ScriptInterface
|
||||||
@@ -117,6 +114,7 @@ public class Dialogs {
|
|||||||
if (context == null) {
|
if (context == null) {
|
||||||
context = getContext();
|
context = getContext();
|
||||||
}
|
}
|
||||||
return new BlockedMaterialDialog.Builder(context, mUiHandler);
|
return (BlockedMaterialDialog.Builder) new BlockedMaterialDialog.Builder(context, mUiHandler)
|
||||||
|
.theme(Theme.LIGHT);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package com.stardust.scriptdroid.ui.console;
|
package com.stardust.autojs.runtime.console;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.ContextWrapper;
|
import android.content.ContextWrapper;
|
||||||
@@ -10,8 +10,8 @@ import android.widget.TextView;
|
|||||||
import com.stardust.enhancedfloaty.FloatyService;
|
import com.stardust.enhancedfloaty.FloatyService;
|
||||||
import com.stardust.enhancedfloaty.ResizableExpandableFloaty;
|
import com.stardust.enhancedfloaty.ResizableExpandableFloaty;
|
||||||
import com.stardust.enhancedfloaty.ResizableExpandableFloatyWindow;
|
import com.stardust.enhancedfloaty.ResizableExpandableFloatyWindow;
|
||||||
import com.stardust.scriptdroid.R;
|
|
||||||
import com.stardust.util.ViewUtil;
|
import com.stardust.util.ViewUtil;
|
||||||
|
import com.stardust.autojs.R;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by Stardust on 2017/4/20.
|
* Created by Stardust on 2017/4/20.
|
||||||
@@ -47,7 +47,7 @@ public class ConsoleFloaty extends ResizableExpandableFloaty.AbstractResizableEx
|
|||||||
|
|
||||||
private void ensureContextWrapper(Context context) {
|
private void ensureContextWrapper(Context context) {
|
||||||
if (mContextWrapper == null) {
|
if (mContextWrapper == null) {
|
||||||
mContextWrapper = new ContextThemeWrapper(context, R.style.AppTheme);
|
mContextWrapper = new ContextThemeWrapper(context, R.style.ConsoleTheme);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package com.stardust.scriptdroid.ui.console;
|
package com.stardust.autojs.runtime.console;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.support.annotation.Nullable;
|
import android.support.annotation.Nullable;
|
||||||
@@ -18,14 +18,14 @@ import android.widget.LinearLayout;
|
|||||||
import android.widget.ScrollView;
|
import android.widget.ScrollView;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import com.stardust.autojs.R;
|
||||||
|
import com.stardust.autojs.runtime.console.StardustConsole;
|
||||||
import com.stardust.enhancedfloaty.ResizableExpandableFloatyWindow;
|
import com.stardust.enhancedfloaty.ResizableExpandableFloatyWindow;
|
||||||
import com.stardust.scriptdroid.R;
|
|
||||||
import com.stardust.util.SparseArrayEntries;
|
import com.stardust.util.SparseArrayEntries;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by Stardust on 2017/5/2.
|
* Created by Stardust on 2017/5/2.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public class ConsoleView extends FrameLayout implements StardustConsole.LogListener {
|
public class ConsoleView extends FrameLayout implements StardustConsole.LogListener {
|
||||||
|
|
||||||
private static final SparseArray<Integer> COLORS = new SparseArrayEntries<Integer>()
|
private static final SparseArray<Integer> COLORS = new SparseArrayEntries<Integer>()
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package com.stardust.scriptdroid.ui.console;
|
package com.stardust.autojs.runtime.console;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
@@ -11,10 +11,10 @@ import com.stardust.autojs.runtime.api.AbstractConsole;
|
|||||||
import com.stardust.autojs.runtime.api.Console;
|
import com.stardust.autojs.runtime.api.Console;
|
||||||
import com.stardust.enhancedfloaty.FloatyService;
|
import com.stardust.enhancedfloaty.FloatyService;
|
||||||
import com.stardust.enhancedfloaty.ResizableExpandableFloatyWindow;
|
import com.stardust.enhancedfloaty.ResizableExpandableFloatyWindow;
|
||||||
import com.stardust.scriptdroid.R;
|
import com.stardust.util.FloatingWindowUtils;
|
||||||
import com.stardust.scriptdroid.autojs.AutoJs;
|
import com.stardust.util.IntentUtil;
|
||||||
import com.stardust.scriptdroid.external.floatingwindow.FloatingWindowManger;
|
|
||||||
import com.stardust.util.UiHandler;
|
import com.stardust.util.UiHandler;
|
||||||
|
import com.stardust.autojs.R;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -44,7 +44,7 @@ public class StardustConsole extends AbstractConsole {
|
|||||||
void onLogClear();
|
void onLogClear();
|
||||||
}
|
}
|
||||||
|
|
||||||
private final Console GLOBAL_CONSOLE = AutoJs.getInstance().getScriptEngineService().getGlobalConsole();
|
private final Console mGlobalConsole;
|
||||||
private List<Log> mLogs = new ArrayList<>();
|
private List<Log> mLogs = new ArrayList<>();
|
||||||
private ResizableExpandableFloatyWindow mFloatyWindow;
|
private ResizableExpandableFloatyWindow mFloatyWindow;
|
||||||
private ConsoleFloaty mConsoleFloaty;
|
private ConsoleFloaty mConsoleFloaty;
|
||||||
@@ -55,9 +55,14 @@ public class StardustConsole extends AbstractConsole {
|
|||||||
private volatile boolean mShown = false;
|
private volatile boolean mShown = false;
|
||||||
|
|
||||||
public StardustConsole(UiHandler uiHandler) {
|
public StardustConsole(UiHandler uiHandler) {
|
||||||
|
this(uiHandler, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public StardustConsole(UiHandler uiHandler, Console globalConsole) {
|
||||||
mUiHandler = uiHandler;
|
mUiHandler = uiHandler;
|
||||||
mConsoleFloaty = new ConsoleFloaty(this);
|
mConsoleFloaty = new ConsoleFloaty(this);
|
||||||
mFloatyWindow = new ResizableExpandableFloatyWindow(mConsoleFloaty);
|
mFloatyWindow = new ResizableExpandableFloatyWindow(mConsoleFloaty);
|
||||||
|
mGlobalConsole = globalConsole;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setConsoleView(ConsoleView consoleView) {
|
public void setConsoleView(ConsoleView consoleView) {
|
||||||
@@ -80,7 +85,9 @@ public class StardustConsole extends AbstractConsole {
|
|||||||
public void println(int level, CharSequence charSequence) {
|
public void println(int level, CharSequence charSequence) {
|
||||||
Log log = new Log(level, charSequence + "\n");
|
Log log = new Log(level, charSequence + "\n");
|
||||||
mLogs.add(log);
|
mLogs.add(log);
|
||||||
GLOBAL_CONSOLE.println(level, charSequence);
|
if (mGlobalConsole != null) {
|
||||||
|
mGlobalConsole.println(level, charSequence);
|
||||||
|
}
|
||||||
if (mLogListener != null) {
|
if (mLogListener != null) {
|
||||||
mLogListener.onNewLog(log);
|
mLogListener.onNewLog(log);
|
||||||
}
|
}
|
||||||
@@ -91,7 +98,9 @@ public class StardustConsole extends AbstractConsole {
|
|||||||
public void write(int level, CharSequence charSequence) {
|
public void write(int level, CharSequence charSequence) {
|
||||||
Log log = new Log(level, charSequence);
|
Log log = new Log(level, charSequence);
|
||||||
mLogs.add(log);
|
mLogs.add(log);
|
||||||
GLOBAL_CONSOLE.print(level, charSequence);
|
if (mGlobalConsole != null) {
|
||||||
|
mGlobalConsole.print(level, charSequence);
|
||||||
|
}
|
||||||
if (mLogListener != null) {
|
if (mLogListener != null) {
|
||||||
mLogListener.onNewLog(log);
|
mLogListener.onNewLog(log);
|
||||||
}
|
}
|
||||||
@@ -108,8 +117,8 @@ public class StardustConsole extends AbstractConsole {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void show() {
|
public void show() {
|
||||||
if (!FloatingWindowManger.hasFloatingWindowPermission(mUiHandler.getContext())) {
|
if (!FloatingWindowUtils.hasOverlayPermission(mUiHandler.getContext())) {
|
||||||
FloatingWindowManger.goToFloatingWindowPermissionSetting();
|
IntentUtil.goToAppDetailSettings(mUiHandler.getContext());
|
||||||
mUiHandler.toast(R.string.text_no_floating_window_permission);
|
mUiHandler.toast(R.string.text_no_floating_window_permission);
|
||||||
}
|
}
|
||||||
startFloatyService();
|
startFloatyService();
|
||||||
|
Before Width: | Height: | Size: 221 B After Width: | Height: | Size: 221 B |
|
Before Width: | Height: | Size: 548 B After Width: | Height: | Size: 548 B |
|
Before Width: | Height: | Size: 367 B After Width: | Height: | Size: 367 B |
|
Before Width: | Height: | Size: 175 B After Width: | Height: | Size: 175 B |
|
Before Width: | Height: | Size: 352 B After Width: | Height: | Size: 352 B |
|
Before Width: | Height: | Size: 269 B After Width: | Height: | Size: 269 B |
|
Before Width: | Height: | Size: 257 B After Width: | Height: | Size: 257 B |
|
Before Width: | Height: | Size: 726 B After Width: | Height: | Size: 726 B |
|
Before Width: | Height: | Size: 456 B After Width: | Height: | Size: 456 B |
|
Before Width: | Height: | Size: 347 B After Width: | Height: | Size: 347 B |
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 690 B After Width: | Height: | Size: 690 B |
|
Before Width: | Height: | Size: 436 B After Width: | Height: | Size: 436 B |
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 930 B After Width: | Height: | Size: 930 B |
|
Before Width: | Height: | Size: 905 B After Width: | Height: | Size: 905 B |
|
Before Width: | Height: | Size: 82 B After Width: | Height: | Size: 82 B |
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
@@ -47,7 +47,7 @@
|
|||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:text="@string/ok"
|
android:text="@string/ok"
|
||||||
android:textColor="@android:color/white"
|
android:textColor="@android:color/white"
|
||||||
android:theme="@style/AppTheme.Console"/>
|
android:theme="@style/ConsoleTheme"/>
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
106
autojs/src/main/res/layout/floating_console_expand.xml
Normal file
@@ -0,0 +1,106 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:layout_margin="12dp"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="40dp"
|
||||||
|
android:background="@drawable/floating_console_bg_top"
|
||||||
|
android:orientation="horizontal">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/title"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:layout_marginLeft="16dp"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:ellipsize="end"
|
||||||
|
android:gravity="center_vertical|left"
|
||||||
|
android:maxLines="1"
|
||||||
|
android:text="@string/text_console"
|
||||||
|
android:textColor="@android:color/white"
|
||||||
|
android:textSize="16sp"/>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:layout_alignParentRight="true">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/minimize"
|
||||||
|
android:layout_width="40dp"
|
||||||
|
android:layout_height="40dp"
|
||||||
|
android:background="?selectableItemBackgroundBorderless"
|
||||||
|
android:paddingBottom="8dp"
|
||||||
|
android:paddingLeft="8dp"
|
||||||
|
android:paddingRight="8dp"
|
||||||
|
android:paddingTop="24dp"
|
||||||
|
android:scaleType="center"
|
||||||
|
android:src="@drawable/ic_remove_white_24dp"/>
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/move_or_resize"
|
||||||
|
android:layout_width="40dp"
|
||||||
|
android:layout_height="40dp"
|
||||||
|
android:background="?selectableItemBackgroundBorderless"
|
||||||
|
android:padding="8dp"
|
||||||
|
android:scaleType="fitXY"
|
||||||
|
android:src="@drawable/ic_settings_ethernet_white_24dp"
|
||||||
|
android:tint="@android:color/white"/>
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/close"
|
||||||
|
android:layout_width="40dp"
|
||||||
|
android:layout_height="40dp"
|
||||||
|
android:background="?selectableItemBackgroundBorderless"
|
||||||
|
android:padding="8dp"
|
||||||
|
android:scaleType="fitXY"
|
||||||
|
android:src="@drawable/ic_close_white_24dp"/>
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<com.stardust.autojs.runtime.console.ConsoleView
|
||||||
|
android:id="@+id/console"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:background="@drawable/floating_console_bg_bottom"
|
||||||
|
android:minHeight="200dp"/>
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/resizer"
|
||||||
|
android:layout_width="25dp"
|
||||||
|
android:layout_height="25dp"
|
||||||
|
android:layout_alignParentBottom="true"
|
||||||
|
android:layout_alignParentRight="true"
|
||||||
|
android:background="@drawable/circle_cool_black"
|
||||||
|
android:padding="6dp"
|
||||||
|
android:scaleType="fitXY"
|
||||||
|
android:src="@drawable/ic_resizer"
|
||||||
|
android:tint="@android:color/white"
|
||||||
|
android:visibility="gone"/>
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/move_cursor"
|
||||||
|
android:layout_width="25dp"
|
||||||
|
android:layout_height="25dp"
|
||||||
|
android:layout_alignParentLeft="true"
|
||||||
|
android:layout_alignParentTop="true"
|
||||||
|
android:background="@drawable/circle_cool_black"
|
||||||
|
android:padding="5dp"
|
||||||
|
android:scaleType="fitXY"
|
||||||
|
android:src="@drawable/ic_move_cursor"
|
||||||
|
android:tint="@android:color/white"
|
||||||
|
android:visibility="gone"/>
|
||||||
|
|
||||||
|
</RelativeLayout>
|
||||||
@@ -8,5 +8,11 @@
|
|||||||
<string name="text_no_running_script">没有正在运行的脚本</string>
|
<string name="text_no_running_script">没有正在运行的脚本</string>
|
||||||
<string name="text_already_stop_n_scripts">已停止%d个正在运行的脚本</string>
|
<string name="text_already_stop_n_scripts">已停止%d个正在运行的脚本</string>
|
||||||
<string name="text_requires_sdk_version_to_run_the_script">本脚本需要此安卓版本以上才能运行:</string>
|
<string name="text_requires_sdk_version_to_run_the_script">本脚本需要此安卓版本以上才能运行:</string>
|
||||||
|
<string name="ok">确定</string>
|
||||||
|
<string name="cancel">取消</string>
|
||||||
|
<string name="text_console">控制台</string>
|
||||||
|
<string name="text_no_floating_window_permission">没有悬浮窗权限</string>
|
||||||
|
<string name="text_accessibility_service_description">使脚本自动操作(点击、长按、滑动等)所需,若关闭则只能执行不涉及自动操作的脚本。</string>
|
||||||
|
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
8
autojs/src/main/res/values/styles.xml
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
|
||||||
|
<style name="ConsoleTheme" parent="Theme.AppCompat.Light.DarkActionBar">
|
||||||
|
<!-- Customize your theme here. -->
|
||||||
|
<item name="colorButtonNormal">#cc181818</item>
|
||||||
|
</style>
|
||||||
|
</resources>
|
||||||
@@ -21,6 +21,12 @@ android {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
repositories {
|
||||||
|
flatDir {
|
||||||
|
dirs 'libs'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
|
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
|
||||||
exclude group: 'com.android.support', module: 'support-annotations'
|
exclude group: 'com.android.support', module: 'support-annotations'
|
||||||
|
|||||||
@@ -1,9 +1,18 @@
|
|||||||
package com.stardust.view.accessibility;
|
package com.stardust.view.accessibility;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.os.Build;
|
||||||
import android.support.annotation.CallSuper;
|
import android.support.annotation.CallSuper;
|
||||||
|
import android.util.Log;
|
||||||
|
import android.view.KeyEvent;
|
||||||
import android.view.accessibility.AccessibilityEvent;
|
import android.view.accessibility.AccessibilityEvent;
|
||||||
import android.view.accessibility.AccessibilityNodeInfo;
|
import android.view.accessibility.AccessibilityNodeInfo;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.SortedMap;
|
||||||
|
import java.util.TreeMap;
|
||||||
import java.util.concurrent.CopyOnWriteArrayList;
|
import java.util.concurrent.CopyOnWriteArrayList;
|
||||||
import java.util.concurrent.CopyOnWriteArraySet;
|
import java.util.concurrent.CopyOnWriteArraySet;
|
||||||
|
|
||||||
@@ -11,18 +20,56 @@ import java.util.concurrent.CopyOnWriteArraySet;
|
|||||||
* Created by Stardust on 2017/5/2.
|
* Created by Stardust on 2017/5/2.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public abstract class AccessibilityService extends android.accessibilityservice.AccessibilityService {
|
public class AccessibilityService extends android.accessibilityservice.AccessibilityService {
|
||||||
|
|
||||||
private AccessibilityNodeInfo mRootInActiveWindow;
|
private AccessibilityNodeInfo mRootInActiveWindow;
|
||||||
|
|
||||||
@CallSuper
|
|
||||||
|
private static final String TAG = "AccessibilityService";
|
||||||
|
|
||||||
|
private static final SortedMap<Integer, AccessibilityDelegate> mDelegates = new TreeMap<>();
|
||||||
|
private static final Object LOCK = new Object();
|
||||||
|
private static AccessibilityService instance;
|
||||||
|
private static boolean containsAllEventTypes = false;
|
||||||
|
private static final Set<Integer> eventTypes = new HashSet<>();
|
||||||
|
|
||||||
|
public static void addDelegate(int uniquePriority, AccessibilityDelegate delegate) {
|
||||||
|
mDelegates.put(uniquePriority, delegate);
|
||||||
|
Set<Integer> set = delegate.getEventTypes();
|
||||||
|
if (set == null)
|
||||||
|
containsAllEventTypes = true;
|
||||||
|
else
|
||||||
|
eventTypes.addAll(set);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isEnable(Context context) {
|
||||||
|
return AccessibilityServiceUtils.isAccessibilityServiceEnabled(context, AccessibilityService.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static AccessibilityService getInstance() {
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onAccessibilityEvent(AccessibilityEvent event) {
|
public void onAccessibilityEvent(final AccessibilityEvent event) {
|
||||||
|
Log.v(TAG, "onAccessibilityEvent: " + event);
|
||||||
if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED
|
if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED
|
||||||
|| event.getEventType() == AccessibilityEvent.TYPE_VIEW_HOVER_ENTER
|
|| event.getEventType() == AccessibilityEvent.TYPE_VIEW_HOVER_ENTER
|
||||||
|| event.getEventType() == AccessibilityEvent.TYPE_VIEW_HOVER_EXIT) {
|
|| event.getEventType() == AccessibilityEvent.TYPE_VIEW_HOVER_EXIT) {
|
||||||
mRootInActiveWindow = super.getRootInActiveWindow();
|
mRootInActiveWindow = super.getRootInActiveWindow();
|
||||||
}
|
}
|
||||||
|
if (!containsAllEventTypes && !eventTypes.contains(event.getEventType()))
|
||||||
|
return;
|
||||||
|
for (Map.Entry<Integer, AccessibilityDelegate> entry : mDelegates.entrySet()) {
|
||||||
|
AccessibilityDelegate delegate = entry.getValue();
|
||||||
|
Set<Integer> types = delegate.getEventTypes();
|
||||||
|
if (types != null && !delegate.getEventTypes().contains(event.getEventType()))
|
||||||
|
continue;
|
||||||
|
long start = System.currentTimeMillis();
|
||||||
|
if (delegate.onAccessibilityEvent(AccessibilityService.this, event))
|
||||||
|
break;
|
||||||
|
Log.v(TAG, "millis: " + (System.currentTimeMillis() - start) + " delegate: " + entry.getValue().getClass().getName());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -35,4 +82,57 @@ public abstract class AccessibilityService extends android.accessibilityservice.
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected boolean onKeyEvent(KeyEvent event) {
|
||||||
|
Log.v(TAG, "onKeyEvent: " + event);
|
||||||
|
return super.onKeyEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected boolean onGesture(int gestureId) {
|
||||||
|
Log.v(TAG, "onGesture: " + gestureId);
|
||||||
|
return super.onGesture(gestureId);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onInterrupt() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDestroy() {
|
||||||
|
instance = null;
|
||||||
|
super.onDestroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onServiceConnected() {
|
||||||
|
Log.v(TAG, "onServiceConnected: " + getServiceInfo().toString());
|
||||||
|
instance = this;
|
||||||
|
super.onServiceConnected();
|
||||||
|
synchronized (LOCK) {
|
||||||
|
LOCK.notifyAll();
|
||||||
|
}
|
||||||
|
// FIXME: 2017/2/12 有时在无障碍中开启服务后这里不会调用服务也不会运行,安卓的BUG???
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean disable() {
|
||||||
|
if (instance != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
|
||||||
|
instance.disableSelf();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void waitForEnabled(long timeOut) {
|
||||||
|
synchronized (LOCK) {
|
||||||
|
try {
|
||||||
|
LOCK.wait(timeOut);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,6 +7,8 @@ import android.content.Intent;
|
|||||||
import android.provider.Settings;
|
import android.provider.Settings;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
|
|
||||||
|
import java.util.Locale;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by Stardust on 2017/1/26.
|
* Created by Stardust on 2017/1/26.
|
||||||
|
|||||||
@@ -3,6 +3,8 @@ package com.stardust.util;
|
|||||||
import android.Manifest;
|
import android.Manifest;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.pm.PackageManager;
|
import android.content.pm.PackageManager;
|
||||||
|
import android.os.Build;
|
||||||
|
import android.provider.Settings;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -12,7 +14,7 @@ import android.widget.Toast;
|
|||||||
public class FloatingWindowUtils {
|
public class FloatingWindowUtils {
|
||||||
|
|
||||||
public static boolean checkFloatingWindowPermission(Context context, int messageResId) {
|
public static boolean checkFloatingWindowPermission(Context context, int messageResId) {
|
||||||
if (!isFloatingWindowPermitted(context)) {
|
if (!hasOverlayPermission(context)) {
|
||||||
Toast.makeText(context, messageResId, Toast.LENGTH_SHORT).show();
|
Toast.makeText(context, messageResId, Toast.LENGTH_SHORT).show();
|
||||||
IntentUtil.goToAppDetailSettings(context, context.getPackageName());
|
IntentUtil.goToAppDetailSettings(context, context.getPackageName());
|
||||||
return false;
|
return false;
|
||||||
@@ -28,4 +30,10 @@ public class FloatingWindowUtils {
|
|||||||
== PackageManager.PERMISSION_GRANTED;
|
== PackageManager.PERMISSION_GRANTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean hasOverlayPermission(Context context) {
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||||
|
return Settings.canDrawOverlays(context);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
1
inrt/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
/build
|
||||||
43
inrt/build.gradle
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
apply plugin: 'com.android.application'
|
||||||
|
|
||||||
|
android {
|
||||||
|
compileSdkVersion 25
|
||||||
|
buildToolsVersion "25.0.2"
|
||||||
|
|
||||||
|
defaultConfig {
|
||||||
|
applicationId "com.stardust.auojs.inrt"
|
||||||
|
minSdkVersion 19
|
||||||
|
targetSdkVersion 23
|
||||||
|
versionCode 1
|
||||||
|
versionName "0.0.1"
|
||||||
|
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
|
||||||
|
ndk {
|
||||||
|
abiFilters 'armeabi-v7a'
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
buildTypes {
|
||||||
|
release {
|
||||||
|
minifyEnabled false
|
||||||
|
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
repositories {
|
||||||
|
flatDir {
|
||||||
|
dirs 'libs'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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.3.0'
|
||||||
|
testCompile 'junit:junit:4.12'
|
||||||
|
compile project(':automator')
|
||||||
|
compile project(':common')
|
||||||
|
compile project(':autojs')
|
||||||
|
}
|
||||||
BIN
inrt/libs/emulatorview-release.aar
Normal file
BIN
inrt/libs/libtermexec-release.aar
Normal file
BIN
inrt/libs/term-debug.aar
Normal file
25
inrt/proguard-rules.pro
vendored
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
# Add project specific ProGuard rules here.
|
||||||
|
# By default, the flags in this file are appended to flags specified
|
||||||
|
# in E:\YiBin\eclipse\Android_SDK_windows/tools/proguard/proguard-android.txt
|
||||||
|
# You can edit the include path and order by changing the proguardFiles
|
||||||
|
# directive in build.gradle.
|
||||||
|
#
|
||||||
|
# For more details, see
|
||||||
|
# http://developer.android.com/guide/developing/tools/proguard.html
|
||||||
|
|
||||||
|
# Add any project specific keep options here:
|
||||||
|
|
||||||
|
# If your project uses WebView with JS, uncomment the following
|
||||||
|
# and specify the fully qualified class name to the JavaScript interface
|
||||||
|
# class:
|
||||||
|
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
|
||||||
|
# public *;
|
||||||
|
#}
|
||||||
|
|
||||||
|
# Uncomment this to preserve the line number information for
|
||||||
|
# debugging stack traces.
|
||||||
|
#-keepattributes SourceFile,LineNumberTable
|
||||||
|
|
||||||
|
# If you keep the line number information, uncomment this to
|
||||||
|
# hide the original source file name.
|
||||||
|
#-renamesourcefileattribute SourceFile
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
package com.stardust.auojs.inrt;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.support.test.InstrumentationRegistry;
|
||||||
|
import android.support.test.runner.AndroidJUnit4;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Instrumentation test, which will execute on an Android device.
|
||||||
|
*
|
||||||
|
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
|
||||||
|
*/
|
||||||
|
@RunWith(AndroidJUnit4.class)
|
||||||
|
public class ExampleInstrumentedTest {
|
||||||
|
@Test
|
||||||
|
public void useAppContext() throws Exception {
|
||||||
|
// Context of the app under test.
|
||||||
|
Context appContext = InstrumentationRegistry.getTargetContext();
|
||||||
|
|
||||||
|
assertEquals("com.stardust.auojs.inrt", appContext.getPackageName());
|
||||||
|
}
|
||||||
|
}
|
||||||
22
inrt/src/main/AndroidManifest.xml
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
package="com.stardust.auojs.inrt">
|
||||||
|
|
||||||
|
<application
|
||||||
|
android:name=".App"
|
||||||
|
android:allowBackup="true"
|
||||||
|
android:icon="@mipmap/ic_launcher"
|
||||||
|
android:label="@string/app_name"
|
||||||
|
android:roundIcon="@mipmap/ic_launcher_round"
|
||||||
|
android:supportsRtl="true"
|
||||||
|
android:theme="@style/AppTheme">
|
||||||
|
<activity android:name=".MainActivity">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.MAIN"/>
|
||||||
|
|
||||||
|
<category android:name="android.intent.category.LAUNCHER"/>
|
||||||
|
</intent-filter>
|
||||||
|
</activity>
|
||||||
|
</application>
|
||||||
|
|
||||||
|
</manifest>
|
||||||
5
inrt/src/main/assets/script.js
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
"auto";
|
||||||
|
launch("com.tencent.mm");
|
||||||
|
sleep(500);
|
||||||
|
while(!click("发现"));
|
||||||
|
while(!click("扫一扫"));
|
||||||
18
inrt/src/main/java/com/stardust/auojs/inrt/App.java
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
package com.stardust.auojs.inrt;
|
||||||
|
|
||||||
|
import android.app.Application;
|
||||||
|
|
||||||
|
import com.stardust.auojs.inrt.rt.AutoJs;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by Stardust on 2017/7/1.
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class App extends Application {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreate() {
|
||||||
|
super.onCreate();
|
||||||
|
AutoJs.initInstance(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
29
inrt/src/main/java/com/stardust/auojs/inrt/MainActivity.java
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
package com.stardust.auojs.inrt;
|
||||||
|
|
||||||
|
import android.support.v7.app.AppCompatActivity;
|
||||||
|
import android.os.Bundle;
|
||||||
|
|
||||||
|
import com.stardust.auojs.inrt.rt.AutoJs;
|
||||||
|
import com.stardust.autojs.execution.ExecutionConfig;
|
||||||
|
import com.stardust.autojs.script.StringScriptSource;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
|
||||||
|
public class MainActivity extends AppCompatActivity {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
try {
|
||||||
|
InputStream is = getAssets().open("script.js");
|
||||||
|
byte[] data = new byte[is.available()];
|
||||||
|
is.read(data);
|
||||||
|
String js = new String(data);
|
||||||
|
StringScriptSource source = new StringScriptSource("<script>", js);
|
||||||
|
AutoJs.getInstance().getScriptEngineService().execute(source);
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
package com.stardust.auojs.inrt.rt;
|
||||||
|
|
||||||
|
import android.accessibilityservice.AccessibilityService;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.text.TextUtils;
|
||||||
|
|
||||||
|
import com.stardust.autojs.runtime.api.ProcessShell;
|
||||||
|
|
||||||
|
import java.util.Locale;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by Stardust on 2017/7/1.
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class AccessibilityServiceTool {
|
||||||
|
|
||||||
|
private static final String cmd = "enabled=$(settings get secure enabled_accessibility_services)\n" +
|
||||||
|
"pkg=%s\n" +
|
||||||
|
"if [[ $enabled == *$pkg* ]]\n" +
|
||||||
|
"then\n" +
|
||||||
|
"echo already_enabled\n" +
|
||||||
|
"else\n" +
|
||||||
|
"enabled=$pkg:$enabled\n" +
|
||||||
|
"settings put secure enabled_accessibility_services $enabled\n" +
|
||||||
|
"fi";
|
||||||
|
|
||||||
|
public static boolean enableAccessibilityServiceByRoot(Context context, Class<? extends AccessibilityService> accessibilityService) {
|
||||||
|
String serviceName = context.getPackageName() + "/" + accessibilityService.getName();
|
||||||
|
return TextUtils.isEmpty(ProcessShell.execCommand(String.format(Locale.getDefault(), cmd, serviceName), true).error);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean enableAccessibilityServiceByRootAndWaitFor(Context context, long timeOut) {
|
||||||
|
if (enableAccessibilityServiceByRoot(context, com.stardust.view.accessibility.AccessibilityService.class)) {
|
||||||
|
com.stardust.view.accessibility.AccessibilityService.waitForEnabled(timeOut);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
181
inrt/src/main/java/com/stardust/auojs/inrt/rt/AutoJs.java
Normal file
@@ -0,0 +1,181 @@
|
|||||||
|
package com.stardust.auojs.inrt.rt;
|
||||||
|
|
||||||
|
import android.app.Activity;
|
||||||
|
import android.app.Application;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.os.Build;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.support.annotation.Nullable;
|
||||||
|
import android.support.annotation.RequiresApi;
|
||||||
|
|
||||||
|
import com.stardust.app.OnActivityResultDelegate;
|
||||||
|
import com.stardust.app.SimpleActivityLifecycleCallbacks;
|
||||||
|
import com.stardust.auojs.inrt.R;
|
||||||
|
import com.stardust.autojs.ScriptEngineService;
|
||||||
|
import com.stardust.autojs.ScriptEngineServiceBuilder;
|
||||||
|
import com.stardust.autojs.engine.RhinoJavaScriptEngineManager;
|
||||||
|
import com.stardust.autojs.engine.ScriptEngineManager;
|
||||||
|
import com.stardust.autojs.runtime.AccessibilityBridge;
|
||||||
|
import com.stardust.autojs.runtime.ScriptRuntime;
|
||||||
|
import com.stardust.autojs.runtime.ScriptStopException;
|
||||||
|
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.Shell;
|
||||||
|
import com.stardust.autojs.runtime.api.image.ScreenCaptureRequestActivity;
|
||||||
|
import com.stardust.autojs.runtime.api.image.ScreenCaptureRequester;
|
||||||
|
import com.stardust.autojs.runtime.console.StardustConsole;
|
||||||
|
import com.stardust.automator.AccessibilityEventCommandHost;
|
||||||
|
import com.stardust.automator.simple_action.SimpleActionPerformHost;
|
||||||
|
import com.stardust.util.ScreenMetrics;
|
||||||
|
import com.stardust.util.Supplier;
|
||||||
|
import com.stardust.util.UiHandler;
|
||||||
|
import com.stardust.view.accessibility.AccessibilityInfoProvider;
|
||||||
|
import com.stardust.view.accessibility.AccessibilityService;
|
||||||
|
import com.stardust.view.accessibility.AccessibilityServiceUtils;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by Stardust on 2017/7/1.
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class AutoJs implements AccessibilityBridge {
|
||||||
|
|
||||||
|
private static AutoJs instance;
|
||||||
|
|
||||||
|
public static AutoJs getInstance() {
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void initInstance(Application context) {
|
||||||
|
instance = new AutoJs(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
private final AccessibilityEventCommandHost mAccessibilityEventCommandHost = new AccessibilityEventCommandHost();
|
||||||
|
private final SimpleActionPerformHost mSimpleActionPerformHost = new SimpleActionPerformHost();
|
||||||
|
private final ScriptEngineService mScriptEngineService;
|
||||||
|
private final AccessibilityInfoProvider mAccessibilityInfoProvider;
|
||||||
|
private final UiHandler mUiHandler;
|
||||||
|
private final AppUtils mAppUtils;
|
||||||
|
private final Application mApplication;
|
||||||
|
private final ScreenCaptureRequester mScreenCaptureRequester = new ScreenCaptureRequester.AbstractScreenCaptureRequester() {
|
||||||
|
|
||||||
|
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
|
||||||
|
@Override
|
||||||
|
public void request() {
|
||||||
|
Activity activity = mAppUtils.getCurrentActivity();
|
||||||
|
if (activity instanceof OnActivityResultDelegate.DelegateHost) {
|
||||||
|
ScreenCaptureRequester requester = new ActivityScreenCaptureRequester(
|
||||||
|
((OnActivityResultDelegate.DelegateHost) activity).getOnActivityResultDelegateMediator(), activity);
|
||||||
|
requester.setOnActivityResultCallback(mCallback);
|
||||||
|
requester.request();
|
||||||
|
} else {
|
||||||
|
ScreenCaptureRequestActivity.request(mUiHandler.getContext(), mCallback);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
private AutoJs(final Application application) {
|
||||||
|
mApplication = application;
|
||||||
|
final Context context = application.getApplicationContext();
|
||||||
|
mUiHandler = new UiHandler(context);
|
||||||
|
mAppUtils = new AppUtils(context);
|
||||||
|
mAccessibilityInfoProvider = new AccessibilityInfoProvider(context.getPackageManager());
|
||||||
|
ScriptEngineManager manager = createScriptEngineManager(context);
|
||||||
|
mScriptEngineService = new ScriptEngineServiceBuilder()
|
||||||
|
.uiHandler(mUiHandler)
|
||||||
|
.engineManger(manager)
|
||||||
|
.runtime(new Supplier<ScriptRuntime>() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public com.stardust.autojs.runtime.ScriptRuntime get() {
|
||||||
|
return new ScriptRuntime.Builder()
|
||||||
|
.setConsole(new StardustConsole(mUiHandler))
|
||||||
|
.setScreenCaptureRequester(mScreenCaptureRequester)
|
||||||
|
.setAccessibilityBridge(AutoJs.this)
|
||||||
|
.setUiHandler(mUiHandler)
|
||||||
|
.setAppUtils(mAppUtils)
|
||||||
|
.setShellSupplier(new Supplier<AbstractShell>() {
|
||||||
|
@Override
|
||||||
|
public AbstractShell get() {
|
||||||
|
return new Shell(context, true);
|
||||||
|
}
|
||||||
|
}).build();
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.build();
|
||||||
|
addAccessibilityServiceDelegates();
|
||||||
|
registerActivityLifecycleCallbacks();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void registerActivityLifecycleCallbacks() {
|
||||||
|
mApplication.registerActivityLifecycleCallbacks(new SimpleActivityLifecycleCallbacks() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
|
||||||
|
ScreenMetrics.initIfNeeded(activity);
|
||||||
|
mAppUtils.setCurrentActivity(activity);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onActivityPaused(Activity activity) {
|
||||||
|
mAppUtils.setCurrentActivity(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onActivityResumed(Activity activity) {
|
||||||
|
mAppUtils.setCurrentActivity(activity);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private ScriptEngineManager createScriptEngineManager(Context context) {
|
||||||
|
return new RhinoJavaScriptEngineManager(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addAccessibilityServiceDelegates() {
|
||||||
|
AccessibilityService.addDelegate(100, mAccessibilityInfoProvider);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public AccessibilityEventCommandHost getCommandHost() {
|
||||||
|
return mAccessibilityEventCommandHost;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SimpleActionPerformHost getActionPerformHost() {
|
||||||
|
return mSimpleActionPerformHost;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public android.accessibilityservice.AccessibilityService getService() {
|
||||||
|
return AccessibilityService.getInstance();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void ensureServiceEnabled() {
|
||||||
|
Context context = mApplication.getApplicationContext();
|
||||||
|
if (AccessibilityService.getInstance() == null) {
|
||||||
|
String errorMessage = null;
|
||||||
|
if (AccessibilityServiceUtils.isAccessibilityServiceEnabled(context, AccessibilityService.class)) {
|
||||||
|
errorMessage = context.getString(R.string.text_auto_operate_service_enabled_but_not_running);
|
||||||
|
} else {
|
||||||
|
errorMessage = context.getString(R.string.text_no_accessibility_permission);
|
||||||
|
}
|
||||||
|
AccessibilityServiceUtils.goToAccessibilitySetting(context);
|
||||||
|
throw new ScriptStopException(errorMessage);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public AccessibilityInfoProvider getInfoProvider() {
|
||||||
|
return mAccessibilityInfoProvider;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ScriptEngineService getScriptEngineService() {
|
||||||
|
return mScriptEngineService;
|
||||||
|
}
|
||||||
|
}
|
||||||
11
inrt/src/main/res/layout/activity_main.xml
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<LinearLayout
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
tools:context="com.stardust.auojs.inrt.MainActivity">
|
||||||
|
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
BIN
inrt/src/main/res/mipmap-hdpi/ic_launcher.png
Normal file
|
After Width: | Height: | Size: 3.3 KiB |
BIN
inrt/src/main/res/mipmap-hdpi/ic_launcher_round.png
Normal file
|
After Width: | Height: | Size: 4.1 KiB |
BIN
inrt/src/main/res/mipmap-mdpi/ic_launcher.png
Normal file
|
After Width: | Height: | Size: 2.2 KiB |
BIN
inrt/src/main/res/mipmap-mdpi/ic_launcher_round.png
Normal file
|
After Width: | Height: | Size: 2.5 KiB |
BIN
inrt/src/main/res/mipmap-xhdpi/ic_launcher.png
Normal file
|
After Width: | Height: | Size: 4.7 KiB |
BIN
inrt/src/main/res/mipmap-xhdpi/ic_launcher_round.png
Normal file
|
After Width: | Height: | Size: 6.0 KiB |
BIN
inrt/src/main/res/mipmap-xxhdpi/ic_launcher.png
Normal file
|
After Width: | Height: | Size: 7.5 KiB |