新增 app.sendBroadcast("inspect_layout_hierarchy"),app.sendBroadcast("inspect_layout_bounds");

This commit is contained in:
hyb1996 2018-10-15 00:52:20 +08:00
parent 429407ed2d
commit d1fb2c44f2
7 changed files with 90 additions and 10 deletions

View File

@ -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;
}

View File

@ -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;

View File

@ -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);

View File

@ -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);

View File

@ -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));
}

View File

@ -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);

View File

@ -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){