From 6bc8f4e8eec985492a0095b3da972b17159a82a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8A=A0=E8=84=9A=E6=9C=AC=E4=BA=BA?= <742374184@qq.com> Date: Mon, 10 Jul 2023 09:54:02 +0800 Subject: [PATCH 01/13] =?UTF-8?q?=E6=97=A0=E9=9A=9C=E7=A2=8D=E7=8A=B6?= =?UTF-8?q?=E6=80=81=E6=94=B9=E5=8F=98=E5=A2=9E=E5=8A=A0=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E8=BE=93=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../autojs/core/accessibility/AccessibilityService.kt | 4 +++- settings.gradle.kts | 1 + version.properties | 6 +++--- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/autojs/autojs/core/accessibility/AccessibilityService.kt b/app/src/main/java/org/autojs/autojs/core/accessibility/AccessibilityService.kt index 7c517f9f..74c55987 100644 --- a/app/src/main/java/org/autojs/autojs/core/accessibility/AccessibilityService.kt +++ b/app/src/main/java/org/autojs/autojs/core/accessibility/AccessibilityService.kt @@ -8,6 +8,7 @@ import android.view.accessibility.AccessibilityEvent import android.view.accessibility.AccessibilityEvent.TYPE_VIEW_FOCUSED import android.view.accessibility.AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED import android.view.accessibility.AccessibilityNodeInfo +import org.autojs.autojs.AutoJs import org.autojs.autojs.event.EventDispatcher import org.autojs.autojs.pref.Pref import java.util.TreeMap @@ -83,6 +84,7 @@ open class AccessibilityService : android.accessibilityservice.AccessibilityServ override fun onDestroy() { Log.v(TAG, "onDestroy: $instance") + AutoJs.instance.globalConsole.verbose("无障碍服务已关闭") instance = null bridge = null eventExecutor.shutdownNow() @@ -91,7 +93,7 @@ open class AccessibilityService : android.accessibilityservice.AccessibilityServ override fun onServiceConnected() { instance = this - + AutoJs.instance.globalConsole.verbose("无障碍服务已开启${instance}") serviceInfo = serviceInfo.apply { AccessibilityServiceInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS.let { flags = (if (Pref.isStableModeEnabled) flags and it.inv() else flags or it) diff --git a/settings.gradle.kts b/settings.gradle.kts index 08b79593..0faa5344 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,3 +1,4 @@ +enableFeaturePreview("STABLE_CONFIGURATION_CACHE") include( ":app", ":libs:android-job-simplified-1.4.3", diff --git a/version.properties b/version.properties index a3ee7381..00646f3d 100644 --- a/version.properties +++ b/version.properties @@ -1,8 +1,8 @@ -#Fri Jul 07 01:39:02 CST 2023 -BUILD_TIME=1688665142214 +#Mon Jul 10 09:35:09 CST 2023 +BUILD_TIME=1688952909391 COMPILE_SDK_VERSION=33 JAVA_VERSION=20 MIN_SDK_VERSION=24 TARGET_SDK_VERSION=33 -VERSION_BUILD=1999 +VERSION_BUILD=2000 VERSION_NAME=6.3.2 From f0f8417455edb09daa88a8dcf425a2a4d9b087f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8A=A0=E8=84=9A=E6=9C=AC=E4=BA=BA?= <742374184@qq.com> Date: Mon, 10 Jul 2023 10:31:11 +0800 Subject: [PATCH 02/13] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E5=85=84=E5=BC=9F=E6=8E=A7=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../autojs/autojs/core/automator/UiObject.kt | 110 ++++++++++++++---- 1 file changed, 88 insertions(+), 22 deletions(-) diff --git a/app/src/main/java/org/autojs/autojs/core/automator/UiObject.kt b/app/src/main/java/org/autojs/autojs/core/automator/UiObject.kt index 5d3eea36..9d1c5c32 100644 --- a/app/src/main/java/org/autojs/autojs/core/automator/UiObject.kt +++ b/app/src/main/java/org/autojs/autojs/core/automator/UiObject.kt @@ -31,11 +31,21 @@ import org.opencv.core.Size */ @Suppress("unused", "DEPRECATION") -open class UiObject constructor(info: Any?, private val allocator: AccessibilityNodeInfoAllocator?, private val depth: Int, private val indexInParent: Int) : AccessibilityNodeInfoCompat(info), UiObjectActions { +open class UiObject( + info: Any?, + private val allocator: AccessibilityNodeInfoAllocator?, + private val depth: Int, + private val indexInParent: Int +) : AccessibilityNodeInfoCompat(info), UiObjectActions { private val bounds by lazy { AccessibilityNodeInfoHelper.getBoundsInScreen(this) } - constructor(info: Any?, allocator: AccessibilityNodeInfoAllocator, indexInParent: Int) : this(info, allocator, 0, indexInParent) + constructor(info: Any?, allocator: AccessibilityNodeInfoAllocator, indexInParent: Int) : this( + info, + allocator, + 0, + indexInParent + ) @JvmOverloads constructor(info: Any?, depth: Int = 0, indexInParent: Int = -1) : this(info, null, depth, indexInParent) @@ -60,6 +70,8 @@ open class UiObject constructor(info: Any?, private val allocator: Accessibility null } + open fun brother(i: Int): UiObject? = parent()?.child(indexInParent() + i) + open fun childCount() = childCount fun hasChildren() = childCount > 0 @@ -342,18 +354,19 @@ open class UiObject constructor(info: Any?, private val allocator: Accessibility false } - override fun getChild(index: Int): AccessibilityNodeInfoCompat = allocator?.getChild(this, index) ?: super.getChild(index) + override fun getChild(index: Int): AccessibilityNodeInfoCompat = + allocator?.getChild(this, index) ?: super.getChild(index) override fun getParent(): AccessibilityNodeInfoCompat = allocator?.getParent(this) ?: super.getParent() override fun findAccessibilityNodeInfosByText(text: String): List { return allocator?.findAccessibilityNodeInfosByText(this, text) - ?: super.findAccessibilityNodeInfosByText(text) + ?: super.findAccessibilityNodeInfosByText(text) } override fun findAccessibilityNodeInfosByViewId(viewId: String): List { return allocator?.findAccessibilityNodeInfosByViewId(this, viewId) - ?: super.findAccessibilityNodeInfosByViewId(viewId) + ?: super.findAccessibilityNodeInfosByViewId(viewId) } override fun recycle() { @@ -375,7 +388,14 @@ open class UiObject constructor(info: Any?, private val allocator: Accessibility private val cArray = Array::class.java private val RESULT_GROUP_WIDGET by lazy { arrayOf("#", "w", RESULT_TYPE_WIDGET) } - private val RESULT_GROUP_WIDGET_COLLECTION by lazy { arrayOf("{}", "wc", "collection", "list").plus(listAliases("#", "w")) } + private val RESULT_GROUP_WIDGET_COLLECTION by lazy { + arrayOf("{}", "wc", "collection", "list").plus( + listAliases( + "#", + "w" + ) + ) + } private val RESULT_GROUP_WIDGETS by lazy { arrayOf("[]", "ws", "widgets").plus(arrayAliases("#", "w")) } private val RESULT_GROUP_CONTENT by lazy { arrayOf("$", "txt", "content") } private val RESULT_GROUP_CONTENTS by lazy { arrayOf("contents").plus(arrayAliases("$", "txt", "content")) } @@ -386,7 +406,8 @@ open class UiObject constructor(info: Any?, private val allocator: Accessibility @JvmStatic fun isCompass(s: Any?): Boolean { - return (s as? CharSequence)?.run { this == COMPASS_PASS_ON || isEmpty() || contains("^(([pkc>]|s[<>]?)-?\\d*)+$".toRegex()) } ?: false + return (s as? CharSequence)?.run { this == COMPASS_PASS_ON || isEmpty() || contains("^(([pkc>]|s[<>]?)-?\\d*)+$".toRegex()) } + ?: false } @JvmStatic @@ -417,10 +438,12 @@ open class UiObject constructor(info: Any?, private val allocator: Accessibility @JvmStatic fun createRoot(root: AccessibilityNodeInfo?) = UiObject(root, null, 0, -1) - internal fun createRoot(root: AccessibilityNodeInfo?, allocator: AccessibilityNodeInfoAllocator?) = UiObject(root, allocator, 0, -1) + internal fun createRoot(root: AccessibilityNodeInfo?, allocator: AccessibilityNodeInfoAllocator?) = + UiObject(root, allocator, 0, -1) private fun arrayAliases(symbol: String, vararg others: String): Array { - return arrayOf("$symbol$symbol", "$symbol[]", "[$symbol]").plus(others.map { listOf("$it[]", "[$it]") }.flatten()) + return arrayOf("$symbol$symbol", "$symbol[]", "[$symbol]").plus(others.map { listOf("$it[]", "[$it]") } + .flatten()) } private fun listAliases(@Suppress("SameParameterValue") symbol: String, vararg others: String): Array { @@ -478,7 +501,12 @@ open class UiObject constructor(info: Any?, private val allocator: Accessibility } } - internal class Detector(private val compass: CharSequence? = COMPASS_PASS_ON, private val result: Result, val callback: BaseFunction? = null, private val selector: UiSelector? = UiSelector()) { + internal class Detector( + private val compass: CharSequence? = COMPASS_PASS_ON, + private val result: Result, + val callback: BaseFunction? = null, + private val selector: UiSelector? = UiSelector() + ) { fun detect(): Any? = when (val type = result.type.let { if (it is List<*>) it[0] else it }.toString()) { in RESULT_GROUP_WIDGET -> getUiObject() @@ -524,13 +552,17 @@ open class UiObject constructor(info: Any?, private val allocator: Accessibility private fun getUiObject() = result.byOne()?.compass(compass) - private fun getUiObjectCollection(transformer: (UiObject?) -> UiObject?) = UiObjectCollection.transform(result.byAll(), transformer).let { RhinoUtils.wrap(it) } + private fun getUiObjectCollection(transformer: (UiObject?) -> UiObject?) = + UiObjectCollection.transform(result.byAll(), transformer).let { RhinoUtils.wrap(it) } - private fun getUiObjectArray(transformer: (UiObject?) -> Any?) = UiObjectCollection.mapNotNull(result.byAll(), transformer).let { RhinoUtils.toArray(it) } + private fun getUiObjectArray(transformer: (UiObject?) -> Any?) = + UiObjectCollection.mapNotNull(result.byAll(), transformer).let { RhinoUtils.toArray(it) } - private fun detectWithCallback(callback: BaseFunction?, args: Array<*>): Any? = callback?.let { RhinoUtils.callFunction(it, args) } + private fun detectWithCallback(callback: BaseFunction?, args: Array<*>): Any? = + callback?.let { RhinoUtils.callFunction(it, args) } - private fun detectWithCallback(callback: BaseFunction?, arg: Any?): Any? = callback?.let { detectWithCallback(it, arrayOf(arg)) } + private fun detectWithCallback(callback: BaseFunction?, arg: Any?): Any? = + callback?.let { detectWithCallback(it, arrayOf(arg)) } } @@ -596,15 +628,45 @@ open class UiObject constructor(info: Any?, private val allocator: Accessibility "setLiveRegion", "setMaxTextLength", "setMovementGranularities", ), arrayOf(cString) to arrayOf( - "compass", "findAccessibilityNodeInfosByText", "findAccessibilityNodeInfosByViewId", "setClassName", "setContentDescription", - "setError", "setHintText", "setPackageName", "setPaneTitle", "setRoleDescription", "setStateDescription", "setText", - "setTooltipText", "setViewIdResourceName", + "compass", + "findAccessibilityNodeInfosByText", + "findAccessibilityNodeInfosByViewId", + "setClassName", + "setContentDescription", + "setError", + "setHintText", + "setPackageName", + "setPaneTitle", + "setRoleDescription", + "setStateDescription", + "setText", + "setTooltipText", + "setViewIdResourceName", ), arrayOf(cBoolean) to arrayOf( - "setAccessibilityFocused", "setCanOpenPopup", "setCheckable", "setChecked", "setClickable", "setEditable", "setEnabled", - "setFocusable", "setFocused", "setHeading", "setImportantForAccessibility", "setLongClickable", "setMultiLine", "setPassword", - "setScreenReaderFocusable", "setScrollable", "setSelected", "setShowingHintText", "setTextEntryKey", "setVisibleToUser", - "setContentInvalid", "setContextClickable", "setDismissable", + "setAccessibilityFocused", + "setCanOpenPopup", + "setCheckable", + "setChecked", + "setClickable", + "setEditable", + "setEnabled", + "setFocusable", + "setFocused", + "setHeading", + "setImportantForAccessibility", + "setLongClickable", + "setMultiLine", + "setPassword", + "setScreenReaderFocusable", + "setScrollable", + "setSelected", + "setShowingHintText", + "setTextEntryKey", + "setVisibleToUser", + "setContentInvalid", + "setContextClickable", + "setDismissable", ), arrayOf(cFloatPrim) to arrayOf("setProgress"), arrayOf(cIntPrim, cIntPrim) to arrayOf("setTextSelection", "setSelection", "scrollTo"), @@ -629,7 +691,11 @@ open class UiObject constructor(info: Any?, private val allocator: Accessibility constructor(resultType: String, resultParams: Array?) : super( when (resultParams) { null -> str(R.string.error_unknown_picker_result_type, resultType) - else -> str(R.string.error_unknown_picker_result_type_with_params, resultType, "[${resultParams.joinToString { it.toString() }}]") + else -> str( + R.string.error_unknown_picker_result_type_with_params, + resultType, + "[${resultParams.joinToString { it.toString() }}]" + ) } ) From f43cdfb850eef02d843bb5048edaa11f8ad0d090 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8A=A0=E8=84=9A=E6=9C=AC=E4=BA=BA?= <742374184@qq.com> Date: Mon, 10 Jul 2023 10:31:36 +0800 Subject: [PATCH 03/13] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=97=A0=E9=9A=9C?= =?UTF-8?q?=E7=A2=8D=E5=BC=80=E5=90=AF=E5=85=B3=E9=97=AD=E5=9B=9E=E8=B0=83?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../accessibility/AccessibilityService.kt | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/autojs/autojs/core/accessibility/AccessibilityService.kt b/app/src/main/java/org/autojs/autojs/core/accessibility/AccessibilityService.kt index 74c55987..410fbab6 100644 --- a/app/src/main/java/org/autojs/autojs/core/accessibility/AccessibilityService.kt +++ b/app/src/main/java/org/autojs/autojs/core/accessibility/AccessibilityService.kt @@ -16,17 +16,22 @@ import java.util.concurrent.Executors import java.util.concurrent.TimeUnit import java.util.concurrent.locks.ReentrantLock +interface AccessibilityServiceCallback { + fun onServiceConnected() + fun onServiceDisconnected() +} + /** * Created by Stardust on 2017/5/2. */ open class AccessibilityService : android.accessibilityservice.AccessibilityService() { - val onKeyObserver = OnKeyListener.Observer() val keyInterrupterObserver = KeyInterceptor.Observer() var fastRootInActiveWindow: AccessibilityNodeInfo? = null - var bridge: AccessibilityBridge? = null + private var callback: AccessibilityServiceCallback? = null + private val gestureEventDispatcher = EventDispatcher() private val eventExecutor by lazy { Executors.newSingleThreadExecutor() } @@ -88,6 +93,7 @@ open class AccessibilityService : android.accessibilityservice.AccessibilityServ instance = null bridge = null eventExecutor.shutdownNow() + callback?.onServiceDisconnected() super.onDestroy() } @@ -104,7 +110,7 @@ open class AccessibilityService : android.accessibilityservice.AccessibilityServ } } } - + callback?.onServiceConnected() super.onServiceConnected() LOCK.lock() @@ -114,6 +120,10 @@ open class AccessibilityService : android.accessibilityservice.AccessibilityServ // FIXME: 2017/2/12 有时在无障碍中开启服务后这里不会调用服务也不会运行,安卓的BUG??? } + fun setCallback(callback: AccessibilityServiceCallback) { + this.callback = callback + } + companion object { private const val TAG = "AccessibilityService" @@ -182,11 +192,7 @@ open class AccessibilityService : android.accessibilityservice.AccessibilityServ } interface GestureListener { - fun onGesture(gestureId: Int) - } - } - } From 9419aeb3a4566e8e9837d361994b9d4a28fe7cc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8A=A0=E8=84=9A=E6=9C=AC=E4=BA=BA?= <742374184@qq.com> Date: Mon, 10 Jul 2023 13:27:34 +0800 Subject: [PATCH 04/13] =?UTF-8?q?auto=E6=A8=A1=E5=9D=97=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E6=97=A0=E9=9A=9C=E7=A2=8D=E5=9B=9E=E8=B0=83=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/modules/__automator__.js | 3 +++ .../core/accessibility/AccessibilityBridge.java | 3 +++ .../core/accessibility/AccessibilityService.kt | 12 +++++------- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/app/src/main/assets/modules/__automator__.js b/app/src/main/assets/modules/__automator__.js index 8c058bd0..1f7d05bc 100644 --- a/app/src/main/assets/modules/__automator__.js +++ b/app/src/main/assets/modules/__automator__.js @@ -61,6 +61,9 @@ module.exports = function (scriptRuntime, scope) { return util.java.toJsArray(a11yBridge.windowRoots(), false) .map(root => UiObject.createRoot(root)); }, + stateListener(listener){ + return a11yBridge.setAccessibilityListener(listener); + }, waitFor(timeout) { automator.waitForService(timeout); }, diff --git a/app/src/main/java/org/autojs/autojs/core/accessibility/AccessibilityBridge.java b/app/src/main/java/org/autojs/autojs/core/accessibility/AccessibilityBridge.java index 4f94580f..e49d5d29 100644 --- a/app/src/main/java/org/autojs/autojs/core/accessibility/AccessibilityBridge.java +++ b/app/src/main/java/org/autojs/autojs/core/accessibility/AccessibilityBridge.java @@ -150,4 +150,7 @@ public abstract class AccessibilityBridge { return mConfig; } + public void setAccessibilityListener(AccessibilityServiceCallback listener) { + AccessibilityService.Companion.setCallback(listener); + } } diff --git a/app/src/main/java/org/autojs/autojs/core/accessibility/AccessibilityService.kt b/app/src/main/java/org/autojs/autojs/core/accessibility/AccessibilityService.kt index 410fbab6..ab6af890 100644 --- a/app/src/main/java/org/autojs/autojs/core/accessibility/AccessibilityService.kt +++ b/app/src/main/java/org/autojs/autojs/core/accessibility/AccessibilityService.kt @@ -20,7 +20,6 @@ interface AccessibilityServiceCallback { fun onServiceConnected() fun onServiceDisconnected() } - /** * Created by Stardust on 2017/5/2. */ @@ -30,8 +29,6 @@ open class AccessibilityService : android.accessibilityservice.AccessibilityServ var fastRootInActiveWindow: AccessibilityNodeInfo? = null var bridge: AccessibilityBridge? = null - private var callback: AccessibilityServiceCallback? = null - private val gestureEventDispatcher = EventDispatcher() private val eventExecutor by lazy { Executors.newSingleThreadExecutor() } @@ -120,10 +117,6 @@ open class AccessibilityService : android.accessibilityservice.AccessibilityServ // FIXME: 2017/2/12 有时在无障碍中开启服务后这里不会调用服务也不会运行,安卓的BUG??? } - fun setCallback(callback: AccessibilityServiceCallback) { - this.callback = callback - } - companion object { private const val TAG = "AccessibilityService" @@ -134,6 +127,7 @@ open class AccessibilityService : android.accessibilityservice.AccessibilityServ private val LOCK = ReentrantLock() private val ENABLED = LOCK.newCondition() + private var callback: AccessibilityServiceCallback? = null var instance: AccessibilityService? = null private set @@ -191,6 +185,10 @@ open class AccessibilityService : android.accessibilityservice.AccessibilityServ } } + fun setCallback(listener: AccessibilityServiceCallback) { + callback = listener + } + interface GestureListener { fun onGesture(gestureId: Int) } From 28648369a276dd3960a922f2604f01e2b3af90a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8A=A0=E8=84=9A=E6=9C=AC=E4=BA=BA?= <742374184@qq.com> Date: Mon, 10 Jul 2023 13:28:27 +0800 Subject: [PATCH 05/13] =?UTF-8?q?=E9=87=8D=E5=91=BD=E5=90=8D=20.java=20to?= =?UTF-8?q?=20.kt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../autojs/autojs/core/ui/{JsViewHelper.java => JsViewHelper.kt} | 0 ...{OnNodeInfoSelectListener.java => OnNodeInfoSelectListener.kt} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename app/src/main/java/org/autojs/autojs/core/ui/{JsViewHelper.java => JsViewHelper.kt} (100%) rename app/src/main/java/org/autojs/autojs/ui/floating/layoutinspector/{OnNodeInfoSelectListener.java => OnNodeInfoSelectListener.kt} (100%) diff --git a/app/src/main/java/org/autojs/autojs/core/ui/JsViewHelper.java b/app/src/main/java/org/autojs/autojs/core/ui/JsViewHelper.kt similarity index 100% rename from app/src/main/java/org/autojs/autojs/core/ui/JsViewHelper.java rename to app/src/main/java/org/autojs/autojs/core/ui/JsViewHelper.kt diff --git a/app/src/main/java/org/autojs/autojs/ui/floating/layoutinspector/OnNodeInfoSelectListener.java b/app/src/main/java/org/autojs/autojs/ui/floating/layoutinspector/OnNodeInfoSelectListener.kt similarity index 100% rename from app/src/main/java/org/autojs/autojs/ui/floating/layoutinspector/OnNodeInfoSelectListener.java rename to app/src/main/java/org/autojs/autojs/ui/floating/layoutinspector/OnNodeInfoSelectListener.kt From b8840131ab6ef38aeaaf575ec3fd02e422678823 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8A=A0=E8=84=9A=E6=9C=AC=E4=BA=BA?= <742374184@qq.com> Date: Mon, 10 Jul 2023 13:28:32 +0800 Subject: [PATCH 06/13] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=B8=83=E5=B1=80?= =?UTF-8?q?=E5=88=86=E6=9E=90=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/accessibility/LayoutInspector.kt | 3 +- .../org/autojs/autojs/core/ui/JsViewHelper.kt | 37 ++++++++----------- .../layoutinspector/LayoutBoundsView.kt | 3 +- .../layoutinspector/LayoutHierarchyView.java | 34 ++++++++++++----- .../floating/layoutinspector/NodeInfoView.kt | 2 + .../OnNodeInfoSelectListener.kt | 10 ++--- 6 files changed, 49 insertions(+), 40 deletions(-) diff --git a/app/src/main/java/org/autojs/autojs/core/accessibility/LayoutInspector.kt b/app/src/main/java/org/autojs/autojs/core/accessibility/LayoutInspector.kt index fb6d89c4..897a9149 100644 --- a/app/src/main/java/org/autojs/autojs/core/accessibility/LayoutInspector.kt +++ b/app/src/main/java/org/autojs/autojs/core/accessibility/LayoutInspector.kt @@ -61,8 +61,7 @@ class LayoutInspector(private val mContext: Context) { } private fun refreshChildList(root: AccessibilityNodeInfo?) { - if (root == null) - return + if (root == null) return root.refresh() val childCount = root.childCount for (i in 0 until childCount) { diff --git a/app/src/main/java/org/autojs/autojs/core/ui/JsViewHelper.kt b/app/src/main/java/org/autojs/autojs/core/ui/JsViewHelper.kt index ed62d1cd..a950bbf9 100644 --- a/app/src/main/java/org/autojs/autojs/core/ui/JsViewHelper.kt +++ b/app/src/main/java/org/autojs/autojs/core/ui/JsViewHelper.kt @@ -1,31 +1,24 @@ -package org.autojs.autojs.core.ui; +package org.autojs.autojs.core.ui -import android.view.View; -import android.view.ViewGroup; - -import androidx.annotation.Nullable; - -import org.autojs.autojs.core.ui.inflater.util.Ids; +import android.view.View +import android.view.ViewGroup +import org.autojs.autojs.core.ui.inflater.util.Ids /** * Created by Stardust on 2017/5/14. */ -public class JsViewHelper { - - @Nullable - public static View findViewByStringId(View view, String id) { - View result = view.findViewById(Ids.parse(id)); - if (result != null) - return result; - if (!(view instanceof ViewGroup group)) { - return null; +object JsViewHelper { + @JvmStatic + fun findViewByStringId(view: View, id: String?): View? { + var result = view.findViewById(Ids.parse(id)) + if (result != null) return result + if (view !is ViewGroup) { + return null } - for (int i = 0; i < group.getChildCount(); i++) { - result = findViewByStringId(group.getChildAt(i), id); - if (result != null) - return result; + for (i in 0 until view.childCount) { + result = findViewByStringId(view.getChildAt(i), id) + if (result != null) return result } - return null; + return null } - } diff --git a/app/src/main/java/org/autojs/autojs/ui/floating/layoutinspector/LayoutBoundsView.kt b/app/src/main/java/org/autojs/autojs/ui/floating/layoutinspector/LayoutBoundsView.kt index 2bdce51d..fc048105 100644 --- a/app/src/main/java/org/autojs/autojs/ui/floating/layoutinspector/LayoutBoundsView.kt +++ b/app/src/main/java/org/autojs/autojs/ui/floating/layoutinspector/LayoutBoundsView.kt @@ -1,5 +1,6 @@ package org.autojs.autojs.ui.floating.layoutinspector +import android.annotation.SuppressLint import android.content.Context import android.graphics.Canvas import android.graphics.Color @@ -97,7 +98,7 @@ open class LayoutBoundsView : View { draw(canvas, child) } } - + @SuppressLint("ClickableViewAccessibility") override fun onTouchEvent(event: MotionEvent): Boolean { if (mRootNode != null) { setSelectedNode(findNodeAt(mRootNode!!, event.rawX.toInt(), event.rawY.toInt())) diff --git a/app/src/main/java/org/autojs/autojs/ui/floating/layoutinspector/LayoutHierarchyView.java b/app/src/main/java/org/autojs/autojs/ui/floating/layoutinspector/LayoutHierarchyView.java index 0666b0c8..270e8aca 100644 --- a/app/src/main/java/org/autojs/autojs/ui/floating/layoutinspector/LayoutHierarchyView.java +++ b/app/src/main/java/org/autojs/autojs/ui/floating/layoutinspector/LayoutHierarchyView.java @@ -1,5 +1,6 @@ package org.autojs.autojs.ui.floating.layoutinspector; +import android.annotation.SuppressLint; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; @@ -18,12 +19,7 @@ import org.autojs.autojs.ui.widget.LevelBeamView; import org.autojs.autojs.util.ViewUtils; import org.autojs.autojs6.R; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Locale; -import java.util.Set; -import java.util.Stack; +import java.util.*; import pl.openrnd.multilevellistview.ItemInfo; import pl.openrnd.multilevellistview.MultiLevelListAdapter; @@ -186,7 +182,7 @@ public class LayoutHierarchyView extends MultiLevelListView { return found; } - private class ViewHolder { + private static class ViewHolder { TextView nameView; TextView infoView; ImageView arrowView; @@ -220,6 +216,7 @@ public class LayoutHierarchyView extends MultiLevelListView { return mInitiallyExpandedNodes.contains((NodeInfo) object); } + @SuppressLint("InflateParams") @Override public View getViewForObject(Object object, View convertView, ItemInfo itemInfo) { NodeInfo nodeInfo = (NodeInfo) object; @@ -231,8 +228,8 @@ public class LayoutHierarchyView extends MultiLevelListView { } else { viewHolder = (ViewHolder) convertView.getTag(); } - - viewHolder.nameView.setText(simplifyClassName(nodeInfo.getClassName())); + //对于id,desc,text,clickable,longClickable不为空的显示信息 + viewHolder.nameView.setText(extraInfo(nodeInfo)); viewHolder.nodeInfo = nodeInfo; if (viewHolder.infoView.getVisibility() == VISIBLE) viewHolder.infoView.setText(getItemInfoDsc(itemInfo)); @@ -266,6 +263,25 @@ public class LayoutHierarchyView extends MultiLevelListView { return s; } + private String extraInfo(NodeInfo nodeInfo) { + String extra = simplifyClassName(nodeInfo.getClassName()); + ArrayList info = new ArrayList<>(); + if (nodeInfo.getSimpleId() != null) { + info.add("id=" + nodeInfo.getSimpleId()); + } + if (!nodeInfo.getText().equals("")) { + info.add("text=" + nodeInfo.getText()); + } + if (nodeInfo.getDesc() != null) { + info.add("desc=" + nodeInfo.getDesc()); + } + //字符串拼接 + String others = String.join(", ", info); + if (!others.isEmpty()) { + return extra + " [" + others + "]"; + } + return extra; + } private String getItemInfoDsc(ItemInfo itemInfo) { StringBuilder builder = new StringBuilder(); diff --git a/app/src/main/java/org/autojs/autojs/ui/floating/layoutinspector/NodeInfoView.kt b/app/src/main/java/org/autojs/autojs/ui/floating/layoutinspector/NodeInfoView.kt index 7b2988a8..4ef7a072 100644 --- a/app/src/main/java/org/autojs/autojs/ui/floating/layoutinspector/NodeInfoView.kt +++ b/app/src/main/java/org/autojs/autojs/ui/floating/layoutinspector/NodeInfoView.kt @@ -1,5 +1,6 @@ package org.autojs.autojs.ui.floating.layoutinspector +import android.annotation.SuppressLint import android.content.Context import android.util.AttributeSet import android.view.LayoutInflater @@ -41,6 +42,7 @@ class NodeInfoView : RecyclerView { ) } + @SuppressLint("NotifyDataSetChanged") fun setNodeInfo(nodeInfo: NodeInfo) { for (i in FIELDS.indices) { try { diff --git a/app/src/main/java/org/autojs/autojs/ui/floating/layoutinspector/OnNodeInfoSelectListener.kt b/app/src/main/java/org/autojs/autojs/ui/floating/layoutinspector/OnNodeInfoSelectListener.kt index cfafc3c1..1f65773d 100644 --- a/app/src/main/java/org/autojs/autojs/ui/floating/layoutinspector/OnNodeInfoSelectListener.kt +++ b/app/src/main/java/org/autojs/autojs/ui/floating/layoutinspector/OnNodeInfoSelectListener.kt @@ -1,12 +1,10 @@ -package org.autojs.autojs.ui.floating.layoutinspector; +package org.autojs.autojs.ui.floating.layoutinspector -import org.autojs.autojs.core.accessibility.NodeInfo; +import org.autojs.autojs.core.accessibility.NodeInfo /** * Created by Stardust on 2017/3/10. */ -public interface OnNodeInfoSelectListener { - - void onNodeSelect(NodeInfo info); - +fun interface OnNodeInfoSelectListener { + fun onNodeSelect(info: NodeInfo) } From 1db2837506838401abf55587800d553668f3f72f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8A=A0=E8=84=9A=E6=9C=AC=E4=BA=BA?= <742374184@qq.com> Date: Mon, 10 Jul 2023 13:39:57 +0800 Subject: [PATCH 07/13] =?UTF-8?q?=E5=BE=AE=E8=B0=83=E6=B3=A8=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/autojs/autojs/core/automator/UiObject.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/autojs/autojs/core/automator/UiObject.kt b/app/src/main/java/org/autojs/autojs/core/automator/UiObject.kt index 9d1c5c32..55015bcf 100644 --- a/app/src/main/java/org/autojs/autojs/core/automator/UiObject.kt +++ b/app/src/main/java/org/autojs/autojs/core/automator/UiObject.kt @@ -446,7 +446,10 @@ open class UiObject( .flatten()) } - private fun listAliases(@Suppress("SameParameterValue") symbol: String, vararg others: String): Array { + private fun listAliases( + @Suppress("SameParameterValue") symbol: String, + @Suppress("SameParameterValue") vararg others: String + ): Array { return arrayOf("$symbol{}", "{$symbol}").plus(others.map { listOf("$it{}", "{$it}") }.flatten()) } From a59b46fd6e31e602e0e832c2ff3942eaa84cf029 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8A=A0=E8=84=9A=E6=9C=AC=E4=BA=BA?= <742374184@qq.com> Date: Mon, 10 Jul 2023 19:19:56 +0800 Subject: [PATCH 08/13] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=97=A0=E9=9A=9C?= =?UTF-8?q?=E7=A2=8D=E4=BA=8B=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/modules/__automator__.js | 8 +++- .../accessibility/AccessibilityService.kt | 38 ++++++++++++++++--- .../accessibility/SimpleActionAutomator.kt | 19 +++++++++- .../automator/AccessibilityEventWrapper.kt | 27 +++++++++++++ .../autojs/autojs/runtime/ScriptRuntime.java | 4 +- version.properties | 6 +-- 6 files changed, 90 insertions(+), 12 deletions(-) create mode 100644 app/src/main/java/org/autojs/autojs/core/automator/AccessibilityEventWrapper.kt diff --git a/app/src/main/assets/modules/__automator__.js b/app/src/main/assets/modules/__automator__.js index 1f7d05bc..fb148f5a 100644 --- a/app/src/main/assets/modules/__automator__.js +++ b/app/src/main/assets/modules/__automator__.js @@ -61,9 +61,15 @@ module.exports = function (scriptRuntime, scope) { return util.java.toJsArray(a11yBridge.windowRoots(), false) .map(root => UiObject.createRoot(root)); }, - stateListener(listener){ + stateListener(listener) { return a11yBridge.setAccessibilityListener(listener); }, + registerEvents(name, listener) { + return rtAutomator.registerEvents(name, listener); + }, + removeEvents(name) { + return rtAutomator.removeEvents(name); + }, waitFor(timeout) { automator.waitForService(timeout); }, diff --git a/app/src/main/java/org/autojs/autojs/core/accessibility/AccessibilityService.kt b/app/src/main/java/org/autojs/autojs/core/accessibility/AccessibilityService.kt index ab6af890..a423910c 100644 --- a/app/src/main/java/org/autojs/autojs/core/accessibility/AccessibilityService.kt +++ b/app/src/main/java/org/autojs/autojs/core/accessibility/AccessibilityService.kt @@ -9,16 +9,17 @@ import android.view.accessibility.AccessibilityEvent.TYPE_VIEW_FOCUSED import android.view.accessibility.AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED import android.view.accessibility.AccessibilityNodeInfo import org.autojs.autojs.AutoJs +import org.autojs.autojs.core.automator.AccessibilityEventWrapper import org.autojs.autojs.event.EventDispatcher import org.autojs.autojs.pref.Pref -import java.util.TreeMap +import java.util.* import java.util.concurrent.Executors import java.util.concurrent.TimeUnit import java.util.concurrent.locks.ReentrantLock interface AccessibilityServiceCallback { - fun onServiceConnected() - fun onServiceDisconnected() + fun onConnected() + fun onDisconnected() } /** * Created by Stardust on 2017/5/2. @@ -28,16 +29,38 @@ open class AccessibilityService : android.accessibilityservice.AccessibilityServ val keyInterrupterObserver = KeyInterceptor.Observer() var fastRootInActiveWindow: AccessibilityNodeInfo? = null var bridge: AccessibilityBridge? = null + private val eventBox = TreeMap() private val gestureEventDispatcher = EventDispatcher() private val eventExecutor by lazy { Executors.newSingleThreadExecutor() } + private fun eventNameToType(str: String): Int { + return try { + val sb = StringBuilder() + sb.append("TYPE_") + val upperCase = str.uppercase(Locale.getDefault()) + sb.append(upperCase) + AccessibilityEvent::class.java.getField(sb.toString()).get(null) as Int + } catch (unused: NoSuchFieldException) { + throw IllegalArgumentException("unknown event type: $str") + } + } + + fun addAccessibilityEventCallback(name: String, callback: AccessibilityEventCallback) { + eventBox[eventNameToType(name)] = callback + } + + fun removeAccessibilityEventCallback(name: String) { + eventBox.remove(eventNameToType(name)) + } + override fun onAccessibilityEvent(event: AccessibilityEvent) { if (instance != this) { instance = this } val type = event.eventType + eventBox[type]?.onAccessibilityEvent(AccessibilityEventWrapper(event)) if (containsAllEventTypes || eventTypes.contains(type)) { if (type == TYPE_WINDOW_STATE_CHANGED || type == TYPE_VIEW_FOCUSED) { rootInActiveWindow?.also { fastRootInActiveWindow = it } @@ -90,7 +113,7 @@ open class AccessibilityService : android.accessibilityservice.AccessibilityServ instance = null bridge = null eventExecutor.shutdownNow() - callback?.onServiceDisconnected() + callback?.onDisconnected() super.onDestroy() } @@ -107,7 +130,7 @@ open class AccessibilityService : android.accessibilityservice.AccessibilityServ } } } - callback?.onServiceConnected() + callback?.onConnected() super.onServiceConnected() LOCK.lock() @@ -147,6 +170,7 @@ open class AccessibilityService : android.accessibilityservice.AccessibilityServ fun isNotRunning() = !isRunning() fun addDelegate(uniquePriority: Int, delegate: AccessibilityDelegate) { + //用于记录eventTypes中的事件id delegates[uniquePriority] = delegate val set = delegate.eventTypes if (set == null) { @@ -184,7 +208,9 @@ open class AccessibilityService : android.accessibilityservice.AccessibilityServ LOCK.unlock() } } - + fun clearAccessibilityEventCallback() { + instance?.eventBox?.clear() + } fun setCallback(listener: AccessibilityServiceCallback) { callback = listener } diff --git a/app/src/main/java/org/autojs/autojs/core/accessibility/SimpleActionAutomator.kt b/app/src/main/java/org/autojs/autojs/core/accessibility/SimpleActionAutomator.kt index 00821d10..1460a2c8 100644 --- a/app/src/main/java/org/autojs/autojs/core/accessibility/SimpleActionAutomator.kt +++ b/app/src/main/java/org/autojs/autojs/core/accessibility/SimpleActionAutomator.kt @@ -16,6 +16,7 @@ import androidx.annotation.RequiresApi import androidx.core.view.accessibility.AccessibilityNodeInfoCompat import org.autojs.autojs.annotation.ScriptInterface import org.autojs.autojs.core.accessibility.AccessibilityService.Companion.isRunning +import org.autojs.autojs.core.automator.AccessibilityEventWrapper import org.autojs.autojs.core.automator.GlobalActionAutomator import org.autojs.autojs.core.automator.UiObject import org.autojs.autojs.core.automator.action.ActionFactory @@ -27,7 +28,11 @@ import org.autojs.autojs.runtime.accessibility.AccessibilityConfig import org.autojs.autojs.runtime.api.ScreenMetrics import org.autojs.autojs.runtime.api.ScriptPromiseAdapter import org.autojs.autojs.util.DeveloperUtils +import java.util.concurrent.atomic.AtomicInteger +interface AccessibilityEventCallback { + fun onAccessibilityEvent(event: AccessibilityEventWrapper) +} /** * Created by Stardust on 2017/4/2. @@ -182,6 +187,18 @@ class SimpleActionAutomator(private val accessibilityBridge: AccessibilityBridge @ScriptInterface fun ensureService() = accessibilityBridge.ensureServiceEnabled() + //todo:优化实现方式 + fun registerEvents(eventName: String,callback: AccessibilityEventCallback) { + ensureService() + val service = org.autojs.autojs.core.accessibility.AccessibilityService.instance + service?.addAccessibilityEventCallback(eventName,callback) + } + + fun removeEvents(eventName: String) { + val service = org.autojs.autojs.core.accessibility.AccessibilityService.instance + service?.removeAccessibilityEventCallback(eventName) + } + private fun performAction(simpleAction: SimpleAction): Boolean { ensureService() if (AccessibilityConfig.isUnintendedGuardEnabled() && isRunningPackageSelf) { @@ -239,7 +256,7 @@ class SimpleActionAutomator(private val accessibilityBridge: AccessibilityBridge } companion object { - + val accessibilityDelegateCounter = AtomicInteger(1000) val TAG: String = SimpleActionAutomator::class.java.name } diff --git a/app/src/main/java/org/autojs/autojs/core/automator/AccessibilityEventWrapper.kt b/app/src/main/java/org/autojs/autojs/core/automator/AccessibilityEventWrapper.kt new file mode 100644 index 00000000..23fb4f6c --- /dev/null +++ b/app/src/main/java/org/autojs/autojs/core/automator/AccessibilityEventWrapper.kt @@ -0,0 +1,27 @@ +package org.autojs.autojs.core.automator + +import android.view.accessibility.AccessibilityEvent + +class AccessibilityEventWrapper(event: AccessibilityEvent) { + private val node = event.source + + val source = if (node != null) UiObject(node, null, getDepth(), getIndexInParent()) else null + + private fun getDepth(): Int { + var depth = 0 + if (node == null) return 0 + while (node.parent != null) { + depth++ + } + return depth + } + + private fun getIndexInParent(): Int { + val parent = node!!.parent + var index = 0 + while (parent.getChild(index) != node) { + index++ + } + return index + } +} \ No newline at end of file diff --git a/app/src/main/java/org/autojs/autojs/runtime/ScriptRuntime.java b/app/src/main/java/org/autojs/autojs/runtime/ScriptRuntime.java index 772a6dbd..89328f8d 100644 --- a/app/src/main/java/org/autojs/autojs/runtime/ScriptRuntime.java +++ b/app/src/main/java/org/autojs/autojs/runtime/ScriptRuntime.java @@ -11,6 +11,7 @@ import org.autojs.autojs.AutoJs; import org.autojs.autojs.annotation.ScriptVariable; import org.autojs.autojs.concurrent.VolatileDispose; import org.autojs.autojs.core.accessibility.AccessibilityBridge; +import org.autojs.autojs.core.accessibility.AccessibilityService; import org.autojs.autojs.core.accessibility.SimpleActionAutomator; import org.autojs.autojs.core.accessibility.UiSelector; import org.autojs.autojs.core.activity.ActivityInfoProvider; @@ -527,7 +528,8 @@ public class ScriptRuntime { console.hideDelayed(); } }); - + //清空无障碍事件 + ignoresException(AccessibilityService.Companion::clearAccessibilityEventCallback); ignoresException(RootUtils::resetRuntimeOverriddenRootModeState); ignoresException(ImageWrapper::recycleAll); diff --git a/version.properties b/version.properties index 00646f3d..7fcf9914 100644 --- a/version.properties +++ b/version.properties @@ -1,8 +1,8 @@ -#Mon Jul 10 09:35:09 CST 2023 -BUILD_TIME=1688952909391 +#Mon Jul 10 18:23:10 CST 2023 +BUILD_TIME=1688984590330 COMPILE_SDK_VERSION=33 JAVA_VERSION=20 MIN_SDK_VERSION=24 TARGET_SDK_VERSION=33 -VERSION_BUILD=2000 +VERSION_BUILD=2006 VERSION_NAME=6.3.2 From 392a4b953df53db1527a3b975de94b467fe4b5f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8A=A0=E8=84=9A=E6=9C=AC=E4=BA=BA?= <742374184@qq.com> Date: Tue, 11 Jul 2023 00:29:11 +0800 Subject: [PATCH 09/13] =?UTF-8?q?=E6=8B=93=E5=B1=95=E6=97=A0=E9=9A=9C?= =?UTF-8?q?=E7=A2=8D=E4=BA=8B=E4=BB=B6=E5=9B=9E=E8=B0=83=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../accessibility/AccessibilityService.kt | 4 +-- .../automator/AccessibilityEventWrapper.kt | 26 ++++++++++++------- version.properties | 6 ++--- 3 files changed, 21 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/org/autojs/autojs/core/accessibility/AccessibilityService.kt b/app/src/main/java/org/autojs/autojs/core/accessibility/AccessibilityService.kt index a423910c..9c6aa475 100644 --- a/app/src/main/java/org/autojs/autojs/core/accessibility/AccessibilityService.kt +++ b/app/src/main/java/org/autojs/autojs/core/accessibility/AccessibilityService.kt @@ -56,9 +56,7 @@ open class AccessibilityService : android.accessibilityservice.AccessibilityServ } override fun onAccessibilityEvent(event: AccessibilityEvent) { - if (instance != this) { - instance = this - } + if (instance != this) instance = this val type = event.eventType eventBox[type]?.onAccessibilityEvent(AccessibilityEventWrapper(event)) if (containsAllEventTypes || eventTypes.contains(type)) { diff --git a/app/src/main/java/org/autojs/autojs/core/automator/AccessibilityEventWrapper.kt b/app/src/main/java/org/autojs/autojs/core/automator/AccessibilityEventWrapper.kt index 23fb4f6c..bffcec05 100644 --- a/app/src/main/java/org/autojs/autojs/core/automator/AccessibilityEventWrapper.kt +++ b/app/src/main/java/org/autojs/autojs/core/automator/AccessibilityEventWrapper.kt @@ -1,27 +1,35 @@ package org.autojs.autojs.core.automator import android.view.accessibility.AccessibilityEvent +import android.view.accessibility.AccessibilityNodeInfo class AccessibilityEventWrapper(event: AccessibilityEvent) { - private val node = event.source + val raw = event + val packageName: CharSequence? = event.packageName + val eventType = event.eventType + val eventTime = event.eventTime + val action = event.action + val isFullScreen = event.isFullScreen + val className = event.className + val source = event.source?.let { UiObject(it, getDepth(it), getIndexInParent(it)) } - val source = if (node != null) UiObject(node, null, getDepth(), getIndexInParent()) else null - - private fun getDepth(): Int { + private fun getDepth(node: AccessibilityNodeInfo): Int { var depth = 0 - if (node == null) return 0 - while (node.parent != null) { + var father = node.parent + while (father != null) { depth++ + father = father.parent } return depth } - private fun getIndexInParent(): Int { - val parent = node!!.parent + private fun getIndexInParent(node: AccessibilityNodeInfo): Int { var index = 0 + val parent = node.parent ?: return 0 while (parent.getChild(index) != node) { index++ } return index } -} \ No newline at end of file +} + diff --git a/version.properties b/version.properties index 7fcf9914..7018538d 100644 --- a/version.properties +++ b/version.properties @@ -1,8 +1,8 @@ -#Mon Jul 10 18:23:10 CST 2023 -BUILD_TIME=1688984590330 +#Tue Jul 11 00:23:06 CST 2023 +BUILD_TIME=1689006186217 COMPILE_SDK_VERSION=33 JAVA_VERSION=20 MIN_SDK_VERSION=24 TARGET_SDK_VERSION=33 -VERSION_BUILD=2006 +VERSION_BUILD=2010 VERSION_NAME=6.3.2 From 72bccb25259effd97ec766462054d3125288f951 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8A=A0=E8=84=9A=E6=9C=AC=E4=BA=BA?= <742374184@qq.com> Date: Tue, 11 Jul 2023 20:20:32 +0800 Subject: [PATCH 10/13] =?UTF-8?q?=E6=8F=90=E5=8D=87=E7=BC=96=E8=BE=91?= =?UTF-8?q?=E5=99=A8=E7=9A=84=E4=BD=BF=E7=94=A8=E4=BD=93=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../model/autocomplete/CodeCompletion.java | 43 ---------------- .../model/autocomplete/CodeCompletion.kt | 33 ++++++++++++ .../model/autocomplete/CodeCompletions.java | 48 ------------------ .../model/autocomplete/CodeCompletions.kt | 33 ++++++++++++ .../autojs/model/autocomplete/Symbols.java | 4 +- .../org/autojs/autojs/ui/edit/EditorView.kt | 19 +++++-- .../autojs/ui/edit/editor/CodeEditor.java | 50 +++++++++++++++++-- app/src/main/res/layout/editor_view.xml | 19 +++---- app/src/main/res/values/strings.xml | 1 + build.gradle.kts | 1 + version.properties | 6 +-- 11 files changed, 146 insertions(+), 111 deletions(-) delete mode 100644 app/src/main/java/org/autojs/autojs/model/autocomplete/CodeCompletion.java create mode 100644 app/src/main/java/org/autojs/autojs/model/autocomplete/CodeCompletion.kt delete mode 100644 app/src/main/java/org/autojs/autojs/model/autocomplete/CodeCompletions.java create mode 100644 app/src/main/java/org/autojs/autojs/model/autocomplete/CodeCompletions.kt diff --git a/app/src/main/java/org/autojs/autojs/model/autocomplete/CodeCompletion.java b/app/src/main/java/org/autojs/autojs/model/autocomplete/CodeCompletion.java deleted file mode 100644 index 7cc2b73c..00000000 --- a/app/src/main/java/org/autojs/autojs/model/autocomplete/CodeCompletion.java +++ /dev/null @@ -1,43 +0,0 @@ -package org.autojs.autojs.model.autocomplete; - -/** - * Created by Stardust on 2018/2/3. - */ -public class CodeCompletion { - - private final String mHint; - private final String mUrl; - private final String mInsertText; - private final int mInsertPos; - - public CodeCompletion(String hint, String url, int insertPos) { - mHint = hint; - mUrl = url; - mInsertPos = insertPos; - mInsertText = null; - } - - public CodeCompletion(String hint, String url, String insertText) { - mHint = hint; - mUrl = url; - mInsertText = insertText; - mInsertPos = -1; - } - - public String getHint() { - return mHint; - } - - public String getUrl() { - return mUrl; - } - - public String getInsertText() { - if (mInsertText != null) - return mInsertText; - if (mInsertPos == 0) { - return mHint; - } - return mHint.substring(mInsertPos); - } -} diff --git a/app/src/main/java/org/autojs/autojs/model/autocomplete/CodeCompletion.kt b/app/src/main/java/org/autojs/autojs/model/autocomplete/CodeCompletion.kt new file mode 100644 index 00000000..aec12124 --- /dev/null +++ b/app/src/main/java/org/autojs/autojs/model/autocomplete/CodeCompletion.kt @@ -0,0 +1,33 @@ +package org.autojs.autojs.model.autocomplete + +/** + * Created by Stardust on 2018/2/3. + */ +class CodeCompletion { + val hint: String + val url: String? + private val mInsertText: String? + private val mInsertPos: Int + + constructor(hint: String, url: String?, insertPos: Int) { + this.hint = hint + this.url = url + mInsertPos = insertPos + mInsertText = null + } + + constructor(hint: String, url: String, insertText: String?) { + this.hint = hint + this.url = url + mInsertText = insertText + mInsertPos = -1 + } + + val insertText: String + get() { + if (mInsertText != null) return mInsertText + return if (mInsertPos == 0) { + hint + } else hint.substring(mInsertPos) + } +} \ No newline at end of file diff --git a/app/src/main/java/org/autojs/autojs/model/autocomplete/CodeCompletions.java b/app/src/main/java/org/autojs/autojs/model/autocomplete/CodeCompletions.java deleted file mode 100644 index 5a3b296d..00000000 --- a/app/src/main/java/org/autojs/autojs/model/autocomplete/CodeCompletions.java +++ /dev/null @@ -1,48 +0,0 @@ -package org.autojs.autojs.model.autocomplete; - -import java.util.ArrayList; -import java.util.List; - -/** - * Created by Stardust on 2017/9/27. - */ -public class CodeCompletions { - - - private final int mFrom; - private final List mCompletions; - - public CodeCompletions(int cursor, List completions) { - mFrom = cursor; - mCompletions = completions; - } - - public static CodeCompletions just(List hints) { - List completions = new ArrayList<>(hints.size()); - for (String hint : hints) { - completions.add(new CodeCompletion(hint, null, 0)); - } - return new CodeCompletions(-1, completions); - } - - public int getFrom() { - return mFrom; - } - - - public int size() { - return mCompletions.size(); - } - - public String getHint(int position) { - return mCompletions.get(position).getHint(); - } - - public CodeCompletion get(int pos) { - return mCompletions.get(pos); - } - - public String getUrl(int pos) { - return mCompletions.get(pos).getUrl(); - } -} diff --git a/app/src/main/java/org/autojs/autojs/model/autocomplete/CodeCompletions.kt b/app/src/main/java/org/autojs/autojs/model/autocomplete/CodeCompletions.kt new file mode 100644 index 00000000..087be311 --- /dev/null +++ b/app/src/main/java/org/autojs/autojs/model/autocomplete/CodeCompletions.kt @@ -0,0 +1,33 @@ +package org.autojs.autojs.model.autocomplete + +/** + * Created by Stardust on 2017/9/27. + */ +class CodeCompletions(val from: Int, private val mCompletions: List) { + fun size(): Int { + return mCompletions.size + } + + fun getHint(position: Int): String { + return mCompletions[position].hint + } + + operator fun get(pos: Int): CodeCompletion { + return mCompletions[pos] + } + + fun getUrl(pos: Int): String? { + return mCompletions[pos].url + } + + companion object { + @JvmStatic + fun just(hints: List): CodeCompletions { + val completions: MutableList = ArrayList(hints.size) + for (hint in hints) { + completions.add(CodeCompletion(hint!!, null, 0)) + } + return CodeCompletions(-1, completions) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/org/autojs/autojs/model/autocomplete/Symbols.java b/app/src/main/java/org/autojs/autojs/model/autocomplete/Symbols.java index 270022c7..7a0855c1 100644 --- a/app/src/main/java/org/autojs/autojs/model/autocomplete/Symbols.java +++ b/app/src/main/java/org/autojs/autojs/model/autocomplete/Symbols.java @@ -9,10 +9,10 @@ import java.util.Arrays; public class Symbols { private static final CodeCompletions sSymbols = CodeCompletions.just(Arrays.asList( - ",", ".", "=", ";", "\"", "'", "-", "_", + ",", ".", "=", ";", "\"", "'", "/", "_", "(", ")", "[", "]", "{", "}", "<", ">", "+", "*", "?", "$", "#", "@", "`", - "/", "\\", "&", "|", "!", "%", "×", "÷", + "-", "\\", "&", "|", "!", "%", "×", "÷", "∈", "∩", "∪", "∉", "⊙", "∅", "¥", "€", "°", "℃", "∵", "∴", "±", "≠", "≈", "α", "β", "γ", "λ", "μ", "π", "σ", "ω", diff --git a/app/src/main/java/org/autojs/autojs/ui/edit/EditorView.kt b/app/src/main/java/org/autojs/autojs/ui/edit/EditorView.kt index 4af57dc9..7b69074e 100644 --- a/app/src/main/java/org/autojs/autojs/ui/edit/EditorView.kt +++ b/app/src/main/java/org/autojs/autojs/ui/edit/EditorView.kt @@ -285,7 +285,12 @@ open class EditorView : FrameLayout, OnHintClickListener, ClickCallback, Toolbar .setFunctionsView(mFunctionsKeyboard) .setEditView(editor!!.codeEditText) .build() - mFunctionsKeyboard!!.setClickCallback(this) + //todo:不清楚作用,暂时注释掉 + //mFunctionsKeyboard!!.setClickCallback(this) + mShowFunctionsButton!!.setOnLongClickListener { + editor!!.beautifyCode() + true + } } private fun setUpInputMethodEnhancedBar() { @@ -321,7 +326,7 @@ open class EditorView : FrameLayout, OnHintClickListener, ClickCallback, Toolbar mAutoCompletion!!.onCursorChange(line, cursor) } - fun setTheme(theme: Theme?) { + private fun setTheme(theme: Theme?) { theme?.let { mEditorTheme = it editor!!.setTheme(it) @@ -575,11 +580,19 @@ open class EditorView : FrameLayout, OnHintClickListener, ClickCallback, Toolbar override fun onHintClick(completions: CodeCompletions, pos: Int) { val completion = completions[pos] - editor!!.insert(completion.insertText) + //todo:增加行注释 + if (completion.insertText=="/") { + editor!!.commentLine() + } else editor!!.insert(completion.insertText) } override fun onHintLongClick(completions: CodeCompletions, pos: Int) { val completion = completions[pos] + //todo:增加块注释 + if (completion.insertText=="/") { + editor!!.commentBlock() + return + } if (completion.url == null) return showManual(completion.url, completion.hint) } diff --git a/app/src/main/java/org/autojs/autojs/ui/edit/editor/CodeEditor.java b/app/src/main/java/org/autojs/autojs/ui/edit/editor/CodeEditor.java index fa1f692f..1126be2f 100644 --- a/app/src/main/java/org/autojs/autojs/ui/edit/editor/CodeEditor.java +++ b/app/src/main/java/org/autojs/autojs/ui/edit/editor/CodeEditor.java @@ -403,11 +403,14 @@ public class CodeEditor extends HVScrollView { public void beautifyCode() { setProgress(true); + int pos = mCodeEditText.getSelectionStart(); mJsBeautifier.beautify(mCodeEditText.getText().toString(), new JsBeautifier.Callback() { @Override public void onSuccess(String beautifiedCode) { setProgress(false); mCodeEditText.setText(beautifiedCode); + //格式化后恢复光标位置 + mCodeEditText.setSelection(pos); } @Override @@ -418,6 +421,43 @@ public class CodeEditor extends HVScrollView { }); } + public void commentLine() { + //如果没有选中,则添加文本/,否则选中的行前加// + String selectionText = getSelectionRaw(); + if (selectionText.equals("")) { + insert("/"); + } else { + String[] lines = selectionText.split("\\n"); + StringBuilder commentedText = new StringBuilder(); + //处理取消注释 + if (lines[0].startsWith("//")) { + for (String line : lines) { + commentedText.append(line.substring(2)).append("\n"); + } + } else { + for (String line : lines) { + commentedText.append("//").append(line).append("\n"); + } + } + mReplacement = commentedText.toString().replaceAll("\\n$", ""); + replaceSelection(); + } + } + + public void commentBlock() { + String selectionText = getSelectionRaw(); + if (!selectionText.isEmpty()) { + String regex = "/\\*([^*]|\\*+[^*/])*\\*/"; + if (selectionText.matches(regex)) { + // 取消块注释 + mReplacement = selectionText.substring(2, selectionText.length() - 2); + } else { + // 增加块注释 + mReplacement = "/*" + selectionText + "*/"; + } + replaceSelection(); + } + } public void insert(String insertText) { int selection = Math.max(mCodeEditText.getSelectionStart(), 0); @@ -437,13 +477,17 @@ public class CodeEditor extends HVScrollView { return mCodeEditText.getText().toString(); } - public Observable getSelection() { + public String getSelectionRaw() { int s = mCodeEditText.getSelectionStart(); int e = mCodeEditText.getSelectionEnd(); if (s == e) { - return Observable.just(""); + return ""; } - return Observable.just(mCodeEditText.getText().toString().substring(s, e)); + return mCodeEditText.getText().toString().substring(s, e); + } + + public Observable getSelection() { + return Observable.just(getSelectionRaw()); } diff --git a/app/src/main/res/layout/editor_view.xml b/app/src/main/res/layout/editor_view.xml index 9b2d69e3..3a2c4eba 100644 --- a/app/src/main/res/layout/editor_view.xml +++ b/app/src/main/res/layout/editor_view.xml @@ -63,15 +63,16 @@ android:layout_alignParentBottom="true" /> + android:id="@+id/functions" + android:layout_width="40dp" + android:layout_height="35dp" + android:layout_alignParentStart="true" + android:layout_alignParentTop="true" + android:background="?selectableItemBackgroundBorderless" + android:contentDescription="@string/fun" + android:padding="6dp" + android:src="@drawable/ic_ali_fx" + app:tint="#222329" /> Colon must follow a valid IP address Repeated dot symbol Repeated colon symbol + 函数 Total: %d item diff --git a/build.gradle.kts b/build.gradle.kts index 0f7a073b..801fa953 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -128,6 +128,7 @@ buildscript { } dependencies /* Android/Kotlin Gradle Plugin. */ { + classpath("com.android.tools.build:gradle:7.1.2") val android = gradlePluginVersionList[platformType]!!["android"]!! val kotlin = gradlePluginVersionList[platformType]!!["kotlin"]!! diff --git a/version.properties b/version.properties index 7018538d..f64552a5 100644 --- a/version.properties +++ b/version.properties @@ -1,8 +1,8 @@ -#Tue Jul 11 00:23:06 CST 2023 -BUILD_TIME=1689006186217 +#Tue Jul 11 20:02:39 CST 2023 +BUILD_TIME=1689076959792 COMPILE_SDK_VERSION=33 JAVA_VERSION=20 MIN_SDK_VERSION=24 TARGET_SDK_VERSION=33 -VERSION_BUILD=2010 +VERSION_BUILD=2015 VERSION_NAME=6.3.2 From 76163c796e4463781aa35833674d3ce48188e580 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8A=A0=E8=84=9A=E6=9C=AC=E4=BA=BA?= <742374184@qq.com> Date: Wed, 12 Jul 2023 02:35:27 +0800 Subject: [PATCH 11/13] =?UTF-8?q?=E5=B8=83=E5=B1=80=E5=88=86=E6=9E=90?= =?UTF-8?q?=E7=88=B6=E6=8E=A7=E4=BB=B6=E5=AD=97=E4=BD=93=E7=BA=A2=E8=89=B2?= =?UTF-8?q?=E9=AB=98=E4=BA=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../layoutinspector/LayoutHierarchyView.java | 37 +++++++++++++++++-- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/autojs/autojs/ui/floating/layoutinspector/LayoutHierarchyView.java b/app/src/main/java/org/autojs/autojs/ui/floating/layoutinspector/LayoutHierarchyView.java index 270e8aca..82b1c64f 100644 --- a/app/src/main/java/org/autojs/autojs/ui/floating/layoutinspector/LayoutHierarchyView.java +++ b/app/src/main/java/org/autojs/autojs/ui/floating/layoutinspector/LayoutHierarchyView.java @@ -36,7 +36,7 @@ public class LayoutHierarchyView extends MultiLevelListView { public interface OnItemLongClickListener { void onItemLongClick(View view, NodeInfo nodeInfo); } - + private final Map nodeMap = new LinkedHashMap<>(); private Adapter mAdapter; private OnItemLongClickListener mOnItemLongClickListener; private final AdapterView.OnItemLongClickListener mOnItemLongClickListenerProxy = new AdapterView.OnItemLongClickListener() { @@ -107,17 +107,41 @@ public class LayoutHierarchyView extends MultiLevelListView { } private void setClickedItem(View view, NodeInfo item) { - mClickedNodeInfo = item; if (mClickedView == null) { mOriginalBackground = view.getBackground(); } else { mClickedView.setBackground(mOriginalBackground); + drawListItem(mClickedNodeInfo, false); } view.setBackgroundColor(mClickedColor); + drawListItem(item, true); + mClickedNodeInfo = item; mClickedView = view; invalidate(); } + private void drawListItem(NodeInfo info, Boolean draw) { + ArrayList list = new ArrayList<>(); + NodeInfo currentInfo = info; + while (true) { + currentInfo = currentInfo.getParent(); + if (currentInfo == null) break; + ViewHolder vh = nodeMap.get(currentInfo); + list.add(vh); + } + //todo:选用能适应深色模式的字体颜色 + //fixme:列表滑动时listview数据错乱 + if (draw) { + for (ViewHolder vh : list) { + vh.nameView.setTextColor(Color.RED); // 设置字体颜色为红色 + } + } else { + for (ViewHolder vh : list) { + vh.nameView.setTextColor(Color.BLACK); // 设置字体颜色为红色 + } + } + } + private void initPaint() { mPaint = new Paint(); mPaint.setColor(Color.DKGRAY); @@ -228,7 +252,8 @@ public class LayoutHierarchyView extends MultiLevelListView { } else { viewHolder = (ViewHolder) convertView.getTag(); } - //对于id,desc,text,clickable,longClickable不为空的显示信息 + nodeMap.put(nodeInfo,viewHolder); + //对于id,desc,text,clickable,longClickable不为空的显示额外信息 viewHolder.nameView.setText(extraInfo(nodeInfo)); viewHolder.nodeInfo = nodeInfo; if (viewHolder.infoView.getVisibility() == VISIBLE) @@ -275,6 +300,12 @@ public class LayoutHierarchyView extends MultiLevelListView { if (nodeInfo.getDesc() != null) { info.add("desc=" + nodeInfo.getDesc()); } + if (nodeInfo.getClickable()) { + info.add("clickable"); + } + if (nodeInfo.getLongClickable()) { + info.add("longClickable"); + } //字符串拼接 String others = String.join(", ", info); if (!others.isEmpty()) { From 37943779846c99360fd0f0a44336c841d6c7fb13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8A=A0=E8=84=9A=E6=9C=AC=E4=BA=BA?= <742374184@qq.com> Date: Wed, 12 Jul 2023 11:29:03 +0800 Subject: [PATCH 12/13] =?UTF-8?q?=E5=B8=83=E5=B1=80=E5=88=86=E6=9E=90?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=A4=9A=E9=80=89=E5=8A=9F=E8=83=BD=EF=BC=88?= =?UTF-8?q?=E6=9C=AA=E5=AE=8C=E5=96=84=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../autojs/codegeneration/ReadOnlyUiObject.java | 2 +- .../autojs/autojs/core/accessibility/NodeInfo.kt | 10 ++++++---- .../autojs/ui/floating/LayoutFloatyWindow.kt | 10 +++++++++- .../layoutinspector/LayoutHierarchyView.java | 4 ++-- .../ui/floating/layoutinspector/NodeInfoView.kt | 16 +++++++++++++--- app/src/main/res/layout/node_info_view_item.xml | 5 +++++ version.properties | 6 +++--- 7 files changed, 39 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/org/autojs/autojs/codegeneration/ReadOnlyUiObject.java b/app/src/main/java/org/autojs/autojs/codegeneration/ReadOnlyUiObject.java index 47b999f8..5634eadb 100644 --- a/app/src/main/java/org/autojs/autojs/codegeneration/ReadOnlyUiObject.java +++ b/app/src/main/java/org/autojs/autojs/codegeneration/ReadOnlyUiObject.java @@ -70,7 +70,7 @@ public class ReadOnlyUiObject extends UiObject { @Override public String id() { - return mNodeInfo.getSimpleId(); + return mNodeInfo.getId(); } @Override diff --git a/app/src/main/java/org/autojs/autojs/core/accessibility/NodeInfo.kt b/app/src/main/java/org/autojs/autojs/core/accessibility/NodeInfo.kt index 3aea3cb7..8f1b70bf 100644 --- a/app/src/main/java/org/autojs/autojs/core/accessibility/NodeInfo.kt +++ b/app/src/main/java/org/autojs/autojs/core/accessibility/NodeInfo.kt @@ -1,5 +1,6 @@ package org.autojs.autojs.core.accessibility +import android.annotation.SuppressLint import android.content.Context import android.content.pm.PackageManager import android.content.res.Resources @@ -17,7 +18,7 @@ import java.util.HashMap * Modified by SuperMonster003 as of Jun 17, 2022. */ -@Suppress("unused") +@Suppress("unused", "MemberVisibilityCanBePrivate") @Keep class NodeInfo(private val resources: Resources?, private val node: UiObject, var parent: NodeInfo?) { @@ -27,8 +28,8 @@ class NodeInfo(private val resources: Resources?, private val node: UiObject, va val bounds = boundsToString(boundsInScreen) val children = ArrayList() - var fullId: String? = node.viewIdResourceName - val simpleId = node.simpleId() + val fullId = node.fullId() + val id = node.simpleId() val desc = node.desc() val text = node.text() val className = node.className() @@ -59,6 +60,7 @@ class NodeInfo(private val resources: Resources?, private val node: UiObject, va val childCount = node.childCount() val actionNames = node.actionNames() + @SuppressLint("DiscouragedApi") val idHex = takeIf { resources != null && packageName != null && fullId != null }?.let { "0x${Integer.toHexString(resources!!.getIdentifier(fullId, null, null))}" } @@ -68,7 +70,7 @@ class NodeInfo(private val resources: Resources?, private val node: UiObject, va "childCount=${children.size}, " + "boundsInScreen=$boundsInScreen, " + "boundsInParent=$boundsInParent, " + - "id='$simpleId', " + + "id='$id', " + "desc='$desc', " + "packageName='$packageName', " + "text='$text', " + diff --git a/app/src/main/java/org/autojs/autojs/ui/floating/LayoutFloatyWindow.kt b/app/src/main/java/org/autojs/autojs/ui/floating/LayoutFloatyWindow.kt index 0f4af14c..7e23a25c 100644 --- a/app/src/main/java/org/autojs/autojs/ui/floating/LayoutFloatyWindow.kt +++ b/app/src/main/java/org/autojs/autojs/ui/floating/LayoutFloatyWindow.kt @@ -13,9 +13,11 @@ import org.autojs.autojs.ui.floating.layoutinspector.LayoutBoundsFloatyWindow import org.autojs.autojs.ui.floating.layoutinspector.LayoutHierarchyFloatyWindow import org.autojs.autojs.ui.floating.layoutinspector.NodeInfoView import org.autojs.autojs.ui.widget.BubblePopupMenu +import org.autojs.autojs.util.ClipboardUtils +import org.autojs.autojs.util.ViewUtils import org.autojs.autojs6.R -abstract class LayoutFloatyWindow(private val rootNode: NodeInfo?, private val context: Context, private val isServiceRelied: Boolean) : FullScreenFloatyWindow() { +abstract class LayoutFloatyWindow(private val rootNode: NodeInfo?, private val context: Context, private val isServiceRelied: Boolean) : FullScreenFloatyWindow(){ private lateinit var mServiceContext: Context private lateinit var mActions: LinkedHashMap @@ -27,6 +29,12 @@ abstract class LayoutFloatyWindow(private val rootNode: NodeInfo?, private val c private val mNodeInfoDialog by lazy { AppLevelThemeDialogBuilder(mServiceContext) .customView(mNodeInfoView, false) + .positiveText("生成") + .onPositive { _, _ -> + ViewUtils.showToast(context, "TODO") + val selector = mNodeInfoView.getCheckedDate().joinToString(".") + if (selector.isNotEmpty()) ClipboardUtils.setClip(context, selector) + } .build() .also { it.window!!.setType(FloatyWindowManger.getWindowType()) } } diff --git a/app/src/main/java/org/autojs/autojs/ui/floating/layoutinspector/LayoutHierarchyView.java b/app/src/main/java/org/autojs/autojs/ui/floating/layoutinspector/LayoutHierarchyView.java index 82b1c64f..8e6790ae 100644 --- a/app/src/main/java/org/autojs/autojs/ui/floating/layoutinspector/LayoutHierarchyView.java +++ b/app/src/main/java/org/autojs/autojs/ui/floating/layoutinspector/LayoutHierarchyView.java @@ -291,8 +291,8 @@ public class LayoutHierarchyView extends MultiLevelListView { private String extraInfo(NodeInfo nodeInfo) { String extra = simplifyClassName(nodeInfo.getClassName()); ArrayList info = new ArrayList<>(); - if (nodeInfo.getSimpleId() != null) { - info.add("id=" + nodeInfo.getSimpleId()); + if (nodeInfo.getId() != null) { + info.add("id=" + nodeInfo.getId()); } if (!nodeInfo.getText().equals("")) { info.add("text=" + nodeInfo.getText()); diff --git a/app/src/main/java/org/autojs/autojs/ui/floating/layoutinspector/NodeInfoView.kt b/app/src/main/java/org/autojs/autojs/ui/floating/layoutinspector/NodeInfoView.kt index 4ef7a072..a08702c0 100644 --- a/app/src/main/java/org/autojs/autojs/ui/floating/layoutinspector/NodeInfoView.kt +++ b/app/src/main/java/org/autojs/autojs/ui/floating/layoutinspector/NodeInfoView.kt @@ -6,6 +6,7 @@ import android.util.AttributeSet import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.CheckBox import android.widget.TextView import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView @@ -21,7 +22,7 @@ import java.lang.reflect.Field * Modified by SuperMonster003 as of Dec 1, 2021. */ class NodeInfoView : RecyclerView { - + //todo:调整数据结构,对话框关闭后根据已勾选的属性,生成选择器 private val data = Array(FIELDS.size + 1) { Array(2) { "" } } constructor(context: Context) : super(context) @@ -73,6 +74,14 @@ class NodeInfoView : RecyclerView { } } + fun getCheckedDate(): Array { + //todo:数据增加checked属性,区分已选中项目 + val checkedArr = data.filter { it[0] == "id" || it[0] == "text" } + return Array(checkedArr.size) { + dataToFx(checkedArr[it]) + } + } + private inner class Adapter : RecyclerView.Adapter() { val mViewTypeHeader = 0 @@ -86,6 +95,7 @@ class NodeInfoView : RecyclerView { override fun onBindViewHolder(holder: ViewHolder, position: Int) { holder.apply { data[position].let { + //attrChecked.isChecked = false attrName.text = it[0] attrValue.text = it[1] } @@ -99,7 +109,7 @@ class NodeInfoView : RecyclerView { } internal inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { - + //val attrChecked: CheckBox = itemView.findViewById(R.id.generate) val attrName: TextView = itemView.findViewById(R.id.name) val attrValue: TextView = itemView.findViewById(R.id.value) @@ -132,7 +142,7 @@ class NodeInfoView : RecyclerView { private val FIELD_NAMES = arrayOf( // Common - "packageName", "simpleId", "fullId", "idHex", + "packageName", "id", "fullId", "idHex", "desc", "text", "bounds", "className", "clickable", "longClickable", "scrollable", diff --git a/app/src/main/res/layout/node_info_view_item.xml b/app/src/main/res/layout/node_info_view_item.xml index 06370ace..6280f231 100644 --- a/app/src/main/res/layout/node_info_view_item.xml +++ b/app/src/main/res/layout/node_info_view_item.xml @@ -10,6 +10,11 @@ android:orientation="horizontal" android:padding="8dp"> + Date: Wed, 12 Jul 2023 17:21:45 +0800 Subject: [PATCH 13/13] =?UTF-8?q?6.3.3=20-=20pre2=20-=20PR=20by=20?= =?UTF-8?q?=E6=8A=A0=E8=84=9A=E6=9C=AC=E4=BA=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/modules/__automator__.js | 14 +++++++-- .../accessibility/AccessibilityService.kt | 7 ++--- .../accessibility/SimpleActionAutomator.kt | 30 +++++++++---------- .../automator/AccessibilityEventWrapper.kt | 3 ++ .../autojs/autojs/core/automator/UiObject.kt | 27 +++++++++++++---- .../org/autojs/autojs/core/ui/JsViewHelper.kt | 14 ++++----- .../model/autocomplete/CodeCompletion.kt | 1 + .../model/autocomplete/CodeCompletions.kt | 1 + .../autojs/model/autocomplete/Symbols.java | 6 ++-- .../autojs/autojs/runtime/ScriptRuntime.java | 6 ++-- .../org/autojs/autojs/ui/edit/EditorView.kt | 6 +++- .../autojs/ui/edit/editor/CodeEditor.java | 2 +- build.gradle.kts | 1 - settings.gradle.kts | 1 + 14 files changed, 75 insertions(+), 44 deletions(-) diff --git a/app/src/main/assets/modules/__automator__.js b/app/src/main/assets/modules/__automator__.js index fb148f5a..8ecdd496 100644 --- a/app/src/main/assets/modules/__automator__.js +++ b/app/src/main/assets/modules/__automator__.js @@ -64,11 +64,19 @@ module.exports = function (scriptRuntime, scope) { stateListener(listener) { return a11yBridge.setAccessibilityListener(listener); }, - registerEvents(name, listener) { - return rtAutomator.registerEvents(name, listener); + registerEvent(name, listener) { + return rtAutomator.registerEvent(name, listener); }, + /** @deprecated */ + registerEvents(name, listener) { + return rtAutomator.registerEvent(name, listener); + }, + removeEvent(name) { + return rtAutomator.removeEvent(name); + }, + /** @deprecated */ removeEvents(name) { - return rtAutomator.removeEvents(name); + return rtAutomator.removeEvent(name); }, waitFor(timeout) { automator.waitForService(timeout); diff --git a/app/src/main/java/org/autojs/autojs/core/accessibility/AccessibilityService.kt b/app/src/main/java/org/autojs/autojs/core/accessibility/AccessibilityService.kt index 9c6aa475..2a412561 100644 --- a/app/src/main/java/org/autojs/autojs/core/accessibility/AccessibilityService.kt +++ b/app/src/main/java/org/autojs/autojs/core/accessibility/AccessibilityService.kt @@ -8,7 +8,7 @@ import android.view.accessibility.AccessibilityEvent import android.view.accessibility.AccessibilityEvent.TYPE_VIEW_FOCUSED import android.view.accessibility.AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED import android.view.accessibility.AccessibilityNodeInfo -import org.autojs.autojs.AutoJs +import org.autojs.autojs.core.accessibility.SimpleActionAutomator.Companion.AccessibilityEventCallback import org.autojs.autojs.core.automator.AccessibilityEventWrapper import org.autojs.autojs.event.EventDispatcher import org.autojs.autojs.pref.Pref @@ -107,7 +107,6 @@ open class AccessibilityService : android.accessibilityservice.AccessibilityServ override fun onDestroy() { Log.v(TAG, "onDestroy: $instance") - AutoJs.instance.globalConsole.verbose("无障碍服务已关闭") instance = null bridge = null eventExecutor.shutdownNow() @@ -117,7 +116,6 @@ open class AccessibilityService : android.accessibilityservice.AccessibilityServ override fun onServiceConnected() { instance = this - AutoJs.instance.globalConsole.verbose("无障碍服务已开启${instance}") serviceInfo = serviceInfo.apply { AccessibilityServiceInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS.let { flags = (if (Pref.isStableModeEnabled) flags and it.inv() else flags or it) @@ -168,7 +166,7 @@ open class AccessibilityService : android.accessibilityservice.AccessibilityServ fun isNotRunning() = !isRunning() fun addDelegate(uniquePriority: Int, delegate: AccessibilityDelegate) { - //用于记录eventTypes中的事件id + // 用于记录eventTypes中的事件id delegates[uniquePriority] = delegate val set = delegate.eventTypes if (set == null) { @@ -206,6 +204,7 @@ open class AccessibilityService : android.accessibilityservice.AccessibilityServ LOCK.unlock() } } + @JvmStatic fun clearAccessibilityEventCallback() { instance?.eventBox?.clear() } diff --git a/app/src/main/java/org/autojs/autojs/core/accessibility/SimpleActionAutomator.kt b/app/src/main/java/org/autojs/autojs/core/accessibility/SimpleActionAutomator.kt index 1460a2c8..006fed56 100644 --- a/app/src/main/java/org/autojs/autojs/core/accessibility/SimpleActionAutomator.kt +++ b/app/src/main/java/org/autojs/autojs/core/accessibility/SimpleActionAutomator.kt @@ -2,7 +2,6 @@ package org.autojs.autojs.core.accessibility -import android.accessibilityservice.AccessibilityService import android.accessibilityservice.GestureDescription import android.graphics.Bitmap import android.graphics.Rect @@ -15,7 +14,6 @@ import android.view.accessibility.AccessibilityNodeInfo import androidx.annotation.RequiresApi import androidx.core.view.accessibility.AccessibilityNodeInfoCompat import org.autojs.autojs.annotation.ScriptInterface -import org.autojs.autojs.core.accessibility.AccessibilityService.Companion.isRunning import org.autojs.autojs.core.automator.AccessibilityEventWrapper import org.autojs.autojs.core.automator.GlobalActionAutomator import org.autojs.autojs.core.automator.UiObject @@ -29,10 +27,7 @@ import org.autojs.autojs.runtime.api.ScreenMetrics import org.autojs.autojs.runtime.api.ScriptPromiseAdapter import org.autojs.autojs.util.DeveloperUtils import java.util.concurrent.atomic.AtomicInteger - -interface AccessibilityEventCallback { - fun onAccessibilityEvent(event: AccessibilityEventWrapper) -} +import android.accessibilityservice.AccessibilityService as AndroidAccessibilityService /** * Created by Stardust on 2017/4/2. @@ -182,21 +177,21 @@ class SimpleActionAutomator(private val accessibilityBridge: AccessibilityBridge fun paste(target: ActionTarget) = performAction(target.createAction(AccessibilityNodeInfo.ACTION_PASTE)) @ScriptInterface - fun isServiceRunning() = isRunning() + fun isServiceRunning() = AccessibilityService.isRunning() @ScriptInterface fun ensureService() = accessibilityBridge.ensureServiceEnabled() //todo:优化实现方式 - fun registerEvents(eventName: String,callback: AccessibilityEventCallback) { + // TODO by SuperMonster003 on Jul 12, 2023. + // ! Ref to Auto.js Pro + fun registerEvent(eventName: String, callback: AccessibilityEventCallback) { ensureService() - val service = org.autojs.autojs.core.accessibility.AccessibilityService.instance - service?.addAccessibilityEventCallback(eventName,callback) + AccessibilityService.instance?.addAccessibilityEventCallback(eventName, callback) } - fun removeEvents(eventName: String) { - val service = org.autojs.autojs.core.accessibility.AccessibilityService.instance - service?.removeAccessibilityEventCallback(eventName) + fun removeEvent(eventName: String) { + AccessibilityService.instance?.removeAccessibilityEventCallback(eventName) } private fun performAction(simpleAction: SimpleAction): Boolean { @@ -221,8 +216,8 @@ class SimpleActionAutomator(private val accessibilityBridge: AccessibilityBridge val promiseAdapter = mPromiseAdapter ?: ScriptPromiseAdapter().also { mPromiseAdapter = it } val service = accessibilityBridge.service!! val executor = service.mainExecutor - val callback = object : AccessibilityService.TakeScreenshotCallback { - override fun onSuccess(screenshot: AccessibilityService.ScreenshotResult) { + val callback = object : AndroidAccessibilityService.TakeScreenshotCallback { + override fun onSuccess(screenshot: AndroidAccessibilityService.ScreenshotResult) { val hardwareBuffer = Bitmap.wrapHardwareBuffer(screenshot.hardwareBuffer, screenshot.colorSpace) // @Hint by SuperMonster003 on Jun 9, 2023. @@ -239,7 +234,7 @@ class SimpleActionAutomator(private val accessibilityBridge: AccessibilityBridge } override fun onFailure(errorCode: Int) { - if (errorCode == AccessibilityService.ERROR_TAKE_SCREENSHOT_INTERVAL_TIME_SHORT) { + if (errorCode == AndroidAccessibilityService.ERROR_TAKE_SCREENSHOT_INTERVAL_TIME_SHORT) { Handler(Looper.getMainLooper()).postDelayed({ captureScreen() }, 50) @@ -259,6 +254,9 @@ class SimpleActionAutomator(private val accessibilityBridge: AccessibilityBridge val accessibilityDelegateCounter = AtomicInteger(1000) val TAG: String = SimpleActionAutomator::class.java.name + interface AccessibilityEventCallback { + fun onAccessibilityEvent(event: AccessibilityEventWrapper) + } } } diff --git a/app/src/main/java/org/autojs/autojs/core/automator/AccessibilityEventWrapper.kt b/app/src/main/java/org/autojs/autojs/core/automator/AccessibilityEventWrapper.kt index bffcec05..5e1bea68 100644 --- a/app/src/main/java/org/autojs/autojs/core/automator/AccessibilityEventWrapper.kt +++ b/app/src/main/java/org/autojs/autojs/core/automator/AccessibilityEventWrapper.kt @@ -3,6 +3,9 @@ package org.autojs.autojs.core.automator import android.view.accessibility.AccessibilityEvent import android.view.accessibility.AccessibilityNodeInfo +/** + * Created by 抠脚本人 on Jul 10, 2023. + */ class AccessibilityEventWrapper(event: AccessibilityEvent) { val raw = event val packageName: CharSequence? = event.packageName diff --git a/app/src/main/java/org/autojs/autojs/core/automator/UiObject.kt b/app/src/main/java/org/autojs/autojs/core/automator/UiObject.kt index 55015bcf..bcaf88f7 100644 --- a/app/src/main/java/org/autojs/autojs/core/automator/UiObject.kt +++ b/app/src/main/java/org/autojs/autojs/core/automator/UiObject.kt @@ -60,17 +60,34 @@ open class UiObject( } } catch (e: IllegalStateException) { // FIXME: 2017/5/5 - null + null.also { e.printStackTrace() } } open fun child(i: Int): UiObject? = try { super.getChild(i)?.run { UiObject(unwrap(), depth + 1, i) } } catch (e: IllegalStateException) { // FIXME: 2017/5/5 - null + null.also { e.printStackTrace() } } - open fun brother(i: Int): UiObject? = parent()?.child(indexInParent() + i) + @Deprecated("Deprecated in Java", ReplaceWith("offset(i)")) + open fun brother(i: Int): UiObject? = offset(i) + + open fun offset(i: Int): UiObject? = try { + parent()?.child(indexInParent + i) + } catch (e: ArrayIndexOutOfBoundsException) { + null.also { e.printStackTrace() } + } + + open fun sibling(i: Int): UiObject? = try { + parent()?.child(i) + } catch (e: ArrayIndexOutOfBoundsException) { + null.also { e.printStackTrace() } + } + + open fun nextSibling() = sibling(1) + + open fun previousSibling() = sibling(-1) open fun childCount() = childCount @@ -344,14 +361,14 @@ open class UiObject( } } catch (e: IllegalStateException) { // FIXME: 2017/5/5 - false + false.also { e.printStackTrace() } } override fun performAction(action: Int): Boolean = try { super.performAction(action) } catch (e: IllegalStateException) { // FIXME: 2017/5/5 - false + false.also { e.printStackTrace() } } override fun getChild(index: Int): AccessibilityNodeInfoCompat = diff --git a/app/src/main/java/org/autojs/autojs/core/ui/JsViewHelper.kt b/app/src/main/java/org/autojs/autojs/core/ui/JsViewHelper.kt index a950bbf9..4d22c2f1 100644 --- a/app/src/main/java/org/autojs/autojs/core/ui/JsViewHelper.kt +++ b/app/src/main/java/org/autojs/autojs/core/ui/JsViewHelper.kt @@ -6,18 +6,16 @@ import org.autojs.autojs.core.ui.inflater.util.Ids /** * Created by Stardust on 2017/5/14. + * Transformed by 抠脚本人 on Jul 10, 2023. */ object JsViewHelper { @JvmStatic fun findViewByStringId(view: View, id: String?): View? { - var result = view.findViewById(Ids.parse(id)) - if (result != null) return result - if (view !is ViewGroup) { - return null - } - for (i in 0 until view.childCount) { - result = findViewByStringId(view.getChildAt(i), id) - if (result != null) return result + view.findViewById(Ids.parse(id))?.let { return it } + if (view is ViewGroup) { + for (i in 0 until view.childCount) { + findViewByStringId(view.getChildAt(i), id)?.let { return it } + } } return null } diff --git a/app/src/main/java/org/autojs/autojs/model/autocomplete/CodeCompletion.kt b/app/src/main/java/org/autojs/autojs/model/autocomplete/CodeCompletion.kt index aec12124..2a2a00ce 100644 --- a/app/src/main/java/org/autojs/autojs/model/autocomplete/CodeCompletion.kt +++ b/app/src/main/java/org/autojs/autojs/model/autocomplete/CodeCompletion.kt @@ -2,6 +2,7 @@ package org.autojs.autojs.model.autocomplete /** * Created by Stardust on 2018/2/3. + * Transformed by 抠脚本人 on Jul 11, 2023. */ class CodeCompletion { val hint: String diff --git a/app/src/main/java/org/autojs/autojs/model/autocomplete/CodeCompletions.kt b/app/src/main/java/org/autojs/autojs/model/autocomplete/CodeCompletions.kt index 087be311..60b82405 100644 --- a/app/src/main/java/org/autojs/autojs/model/autocomplete/CodeCompletions.kt +++ b/app/src/main/java/org/autojs/autojs/model/autocomplete/CodeCompletions.kt @@ -2,6 +2,7 @@ package org.autojs.autojs.model.autocomplete /** * Created by Stardust on 2017/9/27. + * Transformed by 抠脚本人 on Jul 11, 2023. */ class CodeCompletions(val from: Int, private val mCompletions: List) { fun size(): Int { diff --git a/app/src/main/java/org/autojs/autojs/model/autocomplete/Symbols.java b/app/src/main/java/org/autojs/autojs/model/autocomplete/Symbols.java index 7a0855c1..5b82d607 100644 --- a/app/src/main/java/org/autojs/autojs/model/autocomplete/Symbols.java +++ b/app/src/main/java/org/autojs/autojs/model/autocomplete/Symbols.java @@ -9,10 +9,10 @@ import java.util.Arrays; public class Symbols { private static final CodeCompletions sSymbols = CodeCompletions.just(Arrays.asList( - ",", ".", "=", ";", "\"", "'", "/", "_", + ",", ".", "=", ";", "\"", "'", "/", "-", "_", "(", ")", "[", "]", "{", "}", "<", ">", - "+", "*", "?", "$", "#", "@", "`", - "-", "\\", "&", "|", "!", "%", "×", "÷", + "+", "*", "?", ":", "$", "#", "@", "`", + "\\", "&", "|", "!", "%", "×", "÷", "∈", "∩", "∪", "∉", "⊙", "∅", "¥", "€", "°", "℃", "∵", "∴", "±", "≠", "≈", "α", "β", "γ", "λ", "μ", "π", "σ", "ω", diff --git a/app/src/main/java/org/autojs/autojs/runtime/ScriptRuntime.java b/app/src/main/java/org/autojs/autojs/runtime/ScriptRuntime.java index 89328f8d..745f74c9 100644 --- a/app/src/main/java/org/autojs/autojs/runtime/ScriptRuntime.java +++ b/app/src/main/java/org/autojs/autojs/runtime/ScriptRuntime.java @@ -528,8 +528,10 @@ public class ScriptRuntime { console.hideDelayed(); } }); - //清空无障碍事件 - ignoresException(AccessibilityService.Companion::clearAccessibilityEventCallback); + + // 清空无障碍事件 + ignoresException(AccessibilityService::clearAccessibilityEventCallback); + ignoresException(RootUtils::resetRuntimeOverriddenRootModeState); ignoresException(ImageWrapper::recycleAll); diff --git a/app/src/main/java/org/autojs/autojs/ui/edit/EditorView.kt b/app/src/main/java/org/autojs/autojs/ui/edit/EditorView.kt index 7b69074e..20493262 100644 --- a/app/src/main/java/org/autojs/autojs/ui/edit/EditorView.kt +++ b/app/src/main/java/org/autojs/autojs/ui/edit/EditorView.kt @@ -286,7 +286,11 @@ open class EditorView : FrameLayout, OnHintClickListener, ClickCallback, Toolbar .setEditView(editor!!.codeEditText) .build() //todo:不清楚作用,暂时注释掉 - //mFunctionsKeyboard!!.setClickCallback(this) + // @Hint by SuperMonster003 on Jul 12, 2023. + // ! 此处的点击事件回调注册是为了使功能键盘智能提示的属性可以实现其接口对应的功能: + // ! 点击: 自动补全, 并根据情况添加括号或句点符号等. + // ! 长按: 以浮动窗口形式展示 [方法/属性/模块] 对应的文档内容 (如果存在的话). + mFunctionsKeyboard!!.setClickCallback(this) mShowFunctionsButton!!.setOnLongClickListener { editor!!.beautifyCode() true diff --git a/app/src/main/java/org/autojs/autojs/ui/edit/editor/CodeEditor.java b/app/src/main/java/org/autojs/autojs/ui/edit/editor/CodeEditor.java index 1126be2f..66978284 100644 --- a/app/src/main/java/org/autojs/autojs/ui/edit/editor/CodeEditor.java +++ b/app/src/main/java/org/autojs/autojs/ui/edit/editor/CodeEditor.java @@ -409,7 +409,7 @@ public class CodeEditor extends HVScrollView { public void onSuccess(String beautifiedCode) { setProgress(false); mCodeEditText.setText(beautifiedCode); - //格式化后恢复光标位置 + // 格式化后恢复光标位置 mCodeEditText.setSelection(pos); } diff --git a/build.gradle.kts b/build.gradle.kts index 801fa953..0f7a073b 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -128,7 +128,6 @@ buildscript { } dependencies /* Android/Kotlin Gradle Plugin. */ { - classpath("com.android.tools.build:gradle:7.1.2") val android = gradlePluginVersionList[platformType]!!["android"]!! val kotlin = gradlePluginVersionList[platformType]!!["kotlin"]!! diff --git a/settings.gradle.kts b/settings.gradle.kts index 0faa5344..2f65e6a0 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,4 +1,5 @@ enableFeaturePreview("STABLE_CONFIGURATION_CACHE") + include( ":app", ":libs:android-job-simplified-1.4.3",