From d1fb2c44f25aee14758bbb9c56051ebb9b37af51 Mon Sep 17 00:00:00 2001 From: hyb1996 <946994919@qq.com> Date: Mon, 15 Oct 2018 00:52:20 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=20app.sendBroadcast("inspect?= =?UTF-8?q?=5Flayout=5Fhierarchy"),app.sendBroadcast("inspect=5Flayout=5Fb?= =?UTF-8?q?ounds");?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/autojs/autojs/autojs/AutoJs.java | 55 +++++++++++++++++++ .../ui/floating/FloatyWindowManger.java | 2 +- .../LayoutBoundsFloatyWindow.java | 16 ++++++ .../LayoutHierarchyFloatyWindow.java | 4 +- autojs/src/main/assets/modules/__app__.js | 5 ++ .../stardust/autojs/runtime/api/AppUtils.java | 6 ++ .../view/accessibility/LayoutInspector.java | 12 ++-- 7 files changed, 90 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/org/autojs/autojs/autojs/AutoJs.java b/app/src/main/java/org/autojs/autojs/autojs/AutoJs.java index e3189496..7f398d28 100644 --- a/app/src/main/java/org/autojs/autojs/autojs/AutoJs.java +++ b/app/src/main/java/org/autojs/autojs/autojs/AutoJs.java @@ -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; } diff --git a/app/src/main/java/org/autojs/autojs/ui/floating/FloatyWindowManger.java b/app/src/main/java/org/autojs/autojs/ui/floating/FloatyWindowManger.java index eea6a3f6..ee4c0af7 100644 --- a/app/src/main/java/org/autojs/autojs/ui/floating/FloatyWindowManger.java +++ b/app/src/main/java/org/autojs/autojs/ui/floating/FloatyWindowManger.java @@ -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; diff --git a/app/src/main/java/org/autojs/autojs/ui/floating/layoutinspector/LayoutBoundsFloatyWindow.java b/app/src/main/java/org/autojs/autojs/ui/floating/layoutinspector/LayoutBoundsFloatyWindow.java index 19519e89..d69bce4f 100644 --- a/app/src/main/java/org/autojs/autojs/ui/floating/layoutinspector/LayoutBoundsFloatyWindow.java +++ b/app/src/main/java/org/autojs/autojs/ui/floating/layoutinspector/LayoutBoundsFloatyWindow.java @@ -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); diff --git a/app/src/main/java/org/autojs/autojs/ui/floating/layoutinspector/LayoutHierarchyFloatyWindow.java b/app/src/main/java/org/autojs/autojs/ui/floating/layoutinspector/LayoutHierarchyFloatyWindow.java index 2be24ba9..18813913 100644 --- a/app/src/main/java/org/autojs/autojs/ui/floating/layoutinspector/LayoutHierarchyFloatyWindow.java +++ b/app/src/main/java/org/autojs/autojs/ui/floating/layoutinspector/LayoutHierarchyFloatyWindow.java @@ -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); diff --git a/autojs/src/main/assets/modules/__app__.js b/autojs/src/main/assets/modules/__app__.js index 5159d415..355b1784 100644 --- a/autojs/src/main/assets/modules/__app__.js +++ b/autojs/src/main/assets/modules/__app__.js @@ -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)); } diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/api/AppUtils.java b/autojs/src/main/java/com/stardust/autojs/runtime/api/AppUtils.java index b26a2279..2a5d3a75 100644 --- a/autojs/src/main/java/com/stardust/autojs/runtime/api/AppUtils.java +++ b/autojs/src/main/java/com/stardust/autojs/runtime/api/AppUtils.java @@ -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); diff --git a/automator/src/main/java/com/stardust/view/accessibility/LayoutInspector.java b/automator/src/main/java/com/stardust/view/accessibility/LayoutInspector.java index e53e4308..1d7383c4 100644 --- a/automator/src/main/java/com/stardust/view/accessibility/LayoutInspector.java +++ b/automator/src/main/java/com/stardust/view/accessibility/LayoutInspector.java @@ -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 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){