make autojs module more independent
@@ -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 |
BIN
inrt/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
Normal file
|
After Width: | Height: | Size: 9.8 KiB |
BIN
inrt/src/main/res/mipmap-xxxhdpi/ic_launcher.png
Normal file
|
After Width: | Height: | Size: 10 KiB |
BIN
inrt/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
Normal file
|
After Width: | Height: | Size: 14 KiB |
6
inrt/src/main/res/values/colors.xml
Normal file
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<color name="colorPrimary">#3F51B5</color>
|
||||
<color name="colorPrimaryDark">#303F9F</color>
|
||||
<color name="colorAccent">#FF4081</color>
|
||||
</resources>
|
||||
5
inrt/src/main/res/values/strings.xml
Normal file
@@ -0,0 +1,5 @@
|
||||
<resources>
|
||||
<string name="app_name">inrt</string>
|
||||
<string name="text_no_accessibility_permission">无障碍服务未启动</string>
|
||||
<string name="text_auto_operate_service_enabled_but_not_running">无障碍服务已启用但没有运行,您可以尝试重新启用或重启手机</string>
|
||||
</resources>
|
||||
11
inrt/src/main/res/values/styles.xml
Normal file
@@ -0,0 +1,11 @@
|
||||
<resources>
|
||||
|
||||
<!-- Base application theme. -->
|
||||
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
|
||||
<!-- Customize your theme here. -->
|
||||
<item name="colorPrimary">@color/colorPrimary</item>
|
||||
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
|
||||
<item name="colorAccent">@color/colorAccent</item>
|
||||
</style>
|
||||
|
||||
</resources>
|
||||
@@ -0,0 +1,17 @@
|
||||
package com.stardust.auojs.inrt;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
/**
|
||||
* Example local unit test, which will execute on the development machine (host).
|
||||
*
|
||||
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
|
||||
*/
|
||||
public class ExampleUnitTest {
|
||||
@Test
|
||||
public void addition_isCorrect() throws Exception {
|
||||
assertEquals(4, 2 + 2);
|
||||
}
|
||||
}
|
||||