mirror of
https://github.com/TonyJiangWJ/Auto.js.git
synced 2026-06-24 21:33:16 +08:00
新增 app.sendBroadcast("inspect_layout_hierarchy"),app.sendBroadcast("inspect_layout_bounds");
This commit is contained in:
parent
429407ed2d
commit
d1fb2c44f2
@ -1,7 +1,12 @@
|
||||
package org.autojs.autojs.autojs;
|
||||
|
||||
import android.app.Application;
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.os.Looper;
|
||||
import android.support.v4.content.LocalBroadcastManager;
|
||||
|
||||
import com.stardust.app.GlobalAppContext;
|
||||
import com.stardust.autojs.core.console.GlobalStardustConsole;
|
||||
@ -10,15 +15,25 @@ import com.stardust.autojs.runtime.accessibility.AccessibilityConfig;
|
||||
import com.stardust.autojs.runtime.exception.ScriptException;
|
||||
import com.stardust.autojs.runtime.api.Console;
|
||||
import com.stardust.autojs.runtime.exception.ScriptInterruptedException;
|
||||
|
||||
import org.autojs.autojs.App;
|
||||
import org.autojs.autojs.BuildConfig;
|
||||
import org.autojs.autojs.Pref;
|
||||
import org.autojs.autojs.R;
|
||||
import org.autojs.autojs.pluginclient.DevPluginService;
|
||||
import org.autojs.autojs.ui.floating.FloatyWindowManger;
|
||||
import org.autojs.autojs.ui.floating.FullScreenFloatyWindow;
|
||||
import org.autojs.autojs.ui.floating.layoutinspector.LayoutBoundsFloatyWindow;
|
||||
import org.autojs.autojs.ui.floating.layoutinspector.LayoutHierarchyFloatyWindow;
|
||||
import org.autojs.autojs.ui.log.LogActivity_;
|
||||
import org.autojs.autojs.ui.settings.SettingsActivity;
|
||||
import org.autojs.autojs.ui.settings.SettingsActivity_;
|
||||
|
||||
import com.stardust.concurrent.VolatileBox;
|
||||
import com.stardust.view.accessibility.AccessibilityService;
|
||||
import com.stardust.view.accessibility.LayoutInspector;
|
||||
import com.stardust.view.accessibility.NodeInfo;
|
||||
|
||||
import org.autojs.autojs.tool.AccessibilityServiceTool;
|
||||
|
||||
|
||||
@ -34,14 +49,52 @@ public class AutoJs extends com.stardust.autojs.AutoJs {
|
||||
return instance;
|
||||
}
|
||||
|
||||
|
||||
public static void initInstance(Application application) {
|
||||
instance = new AutoJs(application);
|
||||
}
|
||||
|
||||
private interface LayoutInspectFloatyWindow {
|
||||
FullScreenFloatyWindow create(NodeInfo nodeInfo);
|
||||
}
|
||||
|
||||
private BroadcastReceiver mLayoutInspectBroadcastReceiver = new BroadcastReceiver() {
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
ensureAccessibilityServiceEnabled();
|
||||
String action = intent.getAction();
|
||||
if (LayoutBoundsFloatyWindow.class.getName().equals(action)) {
|
||||
capture(LayoutBoundsFloatyWindow::new);
|
||||
} else if (LayoutHierarchyFloatyWindow.class.getName().equals(action)) {
|
||||
capture(LayoutHierarchyFloatyWindow::new);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
private AutoJs(final Application application) {
|
||||
super(application);
|
||||
getScriptEngineService().registerGlobalScriptExecutionListener(new ScriptExecutionGlobalListener());
|
||||
IntentFilter intentFilter = new IntentFilter();
|
||||
intentFilter.addAction(LayoutBoundsFloatyWindow.class.getName());
|
||||
intentFilter.addAction(LayoutHierarchyFloatyWindow.class.getName());
|
||||
LocalBroadcastManager.getInstance(application).registerReceiver(mLayoutInspectBroadcastReceiver, intentFilter);
|
||||
}
|
||||
|
||||
private void capture(LayoutInspectFloatyWindow window) {
|
||||
LayoutInspector inspector = getLayoutInspector();
|
||||
LayoutInspector.CaptureAvailableListener listener = new LayoutInspector.CaptureAvailableListener() {
|
||||
@Override
|
||||
public void onCaptureAvailable(NodeInfo capture) {
|
||||
inspector.removeCaptureAvailableListener(this);
|
||||
getUiHandler().post(() ->
|
||||
FloatyWindowManger.addWindow(getApplication().getApplicationContext(), window.create(capture))
|
||||
);
|
||||
}
|
||||
};
|
||||
inspector.addCaptureAvailableListener(listener);
|
||||
if (!inspector.captureCurrentWindow()) {
|
||||
inspector.removeCaptureAvailableListener(listener);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -117,6 +170,8 @@ public class AutoJs extends com.stardust.autojs.AutoJs {
|
||||
ScriptRuntime runtime = super.createRuntime();
|
||||
runtime.putProperty("class.settings", SettingsActivity_.class);
|
||||
runtime.putProperty("class.console", LogActivity_.class);
|
||||
runtime.putProperty("broadcast.inspect_layout_bounds", LayoutBoundsFloatyWindow.class.getName());
|
||||
runtime.putProperty("broadcast.inspect_layout_hierarchy", LayoutHierarchyFloatyWindow.class.getName());
|
||||
return runtime;
|
||||
}
|
||||
|
||||
|
||||
@ -43,7 +43,7 @@ public class FloatyWindowManger {
|
||||
e.printStackTrace();
|
||||
if(hasPermission){
|
||||
manageDrawOverlays(context);
|
||||
Toast.makeText(context, R.string.text_no_floating_window_permission, Toast.LENGTH_SHORT).show();
|
||||
GlobalAppContext.toast(R.string.text_no_floating_window_permission);
|
||||
}
|
||||
}
|
||||
return false;
|
||||
|
||||
@ -17,6 +17,7 @@ import org.autojs.autojs.ui.codegeneration.CodeGenerateDialog;
|
||||
import org.autojs.autojs.ui.floating.FloatyWindowManger;
|
||||
import org.autojs.autojs.ui.floating.FullScreenFloatyWindow;
|
||||
|
||||
import com.stardust.view.accessibility.LayoutInspector;
|
||||
import com.stardust.view.accessibility.NodeInfo;
|
||||
|
||||
import org.autojs.autojs.ui.widget.BubblePopupMenu;
|
||||
@ -41,6 +42,21 @@ public class LayoutBoundsFloatyWindow extends FullScreenFloatyWindow {
|
||||
mRootNode = rootNode;
|
||||
}
|
||||
|
||||
public static void capture(LayoutInspector inspector, Context context) {
|
||||
LayoutInspector.CaptureAvailableListener listener = new LayoutInspector.CaptureAvailableListener() {
|
||||
@Override
|
||||
public void onCaptureAvailable(NodeInfo capture) {
|
||||
inspector.removeCaptureAvailableListener(this);
|
||||
LayoutBoundsFloatyWindow window = new LayoutBoundsFloatyWindow(capture);
|
||||
FloatyWindowManger.addWindow(context, window);
|
||||
}
|
||||
};
|
||||
inspector.addCaptureAvailableListener(listener);
|
||||
if (!inspector.captureCurrentWindow()) {
|
||||
inspector.removeCaptureAvailableListener(listener);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected View onCreateView(FloatyService floatyService) {
|
||||
mContext = new ContextThemeWrapper(floatyService, R.style.AppTheme);
|
||||
|
||||
@ -11,11 +11,14 @@ import android.view.WindowManager;
|
||||
import com.afollestad.materialdialogs.MaterialDialog;
|
||||
import com.afollestad.materialdialogs.Theme;
|
||||
import com.stardust.app.DialogUtils;
|
||||
import com.stardust.app.GlobalAppContext;
|
||||
import com.stardust.enhancedfloaty.FloatyService;
|
||||
import org.autojs.autojs.R;
|
||||
import org.autojs.autojs.ui.codegeneration.CodeGenerateDialog;
|
||||
import org.autojs.autojs.ui.floating.FloatyWindowManger;
|
||||
import org.autojs.autojs.ui.floating.FullScreenFloatyWindow;
|
||||
|
||||
import com.stardust.view.accessibility.LayoutInspector;
|
||||
import com.stardust.view.accessibility.NodeInfo;
|
||||
import org.autojs.autojs.ui.widget.BubblePopupMenu;
|
||||
|
||||
@ -42,7 +45,6 @@ public class LayoutHierarchyFloatyWindow extends FullScreenFloatyWindow {
|
||||
mRootNode = rootNode;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected View onCreateView(FloatyService floatyService) {
|
||||
mContext = new ContextThemeWrapper(floatyService, R.style.AppTheme);
|
||||
|
||||
@ -55,6 +55,11 @@ module.exports = function(runtime, global){
|
||||
}
|
||||
|
||||
app.sendBroadcast = function(i){
|
||||
if(typeof(i) == "string"){
|
||||
if(runtime.getProperty("broadcast." + i)){
|
||||
app.sendLocalBroadcastSync(app.intent({action: runtime.getProperty("broadcast." + i)}));
|
||||
}
|
||||
}
|
||||
context.sendBroadcast(app.intent(i));
|
||||
}
|
||||
|
||||
|
||||
@ -7,6 +7,7 @@ import android.content.pm.ApplicationInfo;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.net.Uri;
|
||||
import android.support.annotation.Nullable;
|
||||
import android.support.v4.content.LocalBroadcastManager;
|
||||
import android.util.Log;
|
||||
|
||||
import com.stardust.autojs.annotation.ScriptInterface;
|
||||
@ -49,6 +50,11 @@ public class AppUtils {
|
||||
|
||||
}
|
||||
|
||||
@ScriptInterface
|
||||
public void sendLocalBroadcastSync(Intent intent){
|
||||
LocalBroadcastManager.getInstance(mContext).sendBroadcastSync(intent);
|
||||
}
|
||||
|
||||
@ScriptInterface
|
||||
public boolean launchApp(String appName) {
|
||||
String pkg = getPackageName(appName);
|
||||
|
||||
@ -5,10 +5,6 @@ import android.support.annotation.RequiresApi;
|
||||
import android.util.Log;
|
||||
import android.view.accessibility.AccessibilityNodeInfo;
|
||||
|
||||
import com.stardust.view.accessibility.AccessibilityService;
|
||||
import com.stardust.util.UnderuseExecutors;
|
||||
|
||||
import java.util.concurrent.ConcurrentLinkedQueue;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
import java.util.concurrent.Executor;
|
||||
import java.util.concurrent.Executors;
|
||||
@ -29,18 +25,18 @@ public class LayoutInspector {
|
||||
private Executor mExecutor = Executors.newSingleThreadExecutor();
|
||||
private CopyOnWriteArrayList<CaptureAvailableListener> mCaptureAvailableListeners = new CopyOnWriteArrayList<>();
|
||||
|
||||
public void captureCurrentWindow() {
|
||||
public boolean captureCurrentWindow() {
|
||||
AccessibilityService service = AccessibilityService.getInstance();
|
||||
if (service == null) {
|
||||
Log.d(LOG_TAG, "captureCurrentWindow: service = null");
|
||||
mCapture = null;
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
final AccessibilityNodeInfo root = getRootInActiveWindow(service);
|
||||
if (root == null) {
|
||||
Log.d(LOG_TAG, "captureCurrentWindow: root = null");
|
||||
mCapture = null;
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
mExecutor.execute(() -> {
|
||||
mDumping = true;
|
||||
@ -50,7 +46,7 @@ public class LayoutInspector {
|
||||
l.onCaptureAvailable(mCapture);
|
||||
}
|
||||
});
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public void addCaptureAvailableListener(CaptureAvailableListener l){
|
||||
|
||||
Loading…
Reference in New Issue
Block a user