6.2.0 - Fix - 补充未提交的文件

This commit is contained in:
SuperMonster003
2023-01-21 22:24:51 +08:00
parent 10960ddbee
commit 1334582a5b
55 changed files with 27352 additions and 1 deletions

View File

@@ -0,0 +1,23 @@
package org.autojs.autojs.core.accessibility
import android.accessibilityservice.AccessibilityServiceInfo
import android.os.Build
import org.autojs.autojs.pref.Pref
class ApplicationAccessibilityService : AccessibilityService() {
override fun onServiceConnected() {
serviceInfo = serviceInfo.apply {
AccessibilityServiceInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS.let {
flags = (if (Pref.isStableModeEnabled) flags and it.inv() else flags or it)
}
AccessibilityServiceInfo.FLAG_REQUEST_TOUCH_EXPLORATION_MODE.let {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
flags = (if (Pref.isGestureObservingEnabled) flags or it else flags and it.inv())
}
}
}
super.onServiceConnected()
}
}

View File

@@ -0,0 +1,173 @@
package org.autojs.autojs.core.automator
import android.os.Build
import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction
import androidx.core.view.accessibility.AccessibilityNodeInfoCompat
import androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat
import org.autojs.autojs.annotation.ScriptInterface
interface UiObjectActions {
fun performAction(action: Int, vararg arguments: ActionArgument): Boolean
@ScriptInterface
fun click() = performAction(AccessibilityActionCompat.ACTION_CLICK.id)
@ScriptInterface
fun longClick() = performAction(AccessibilityActionCompat.ACTION_LONG_CLICK.id)
@ScriptInterface
fun accessibilityFocus() = performAction(AccessibilityActionCompat.ACTION_ACCESSIBILITY_FOCUS.id)
@ScriptInterface
fun clearAccessibilityFocus() = performAction(AccessibilityActionCompat.ACTION_CLEAR_ACCESSIBILITY_FOCUS.id)
@ScriptInterface
fun focus() = performAction(AccessibilityActionCompat.ACTION_FOCUS.id)
@ScriptInterface
fun clearFocus() = performAction(AccessibilityActionCompat.ACTION_CLEAR_FOCUS.id)
@ScriptInterface
fun clearSelection() = performAction(AccessibilityActionCompat.ACTION_CLEAR_SELECTION.id)
@ScriptInterface
fun dragCancel() = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S_V2) performAction(AccessibilityAction.ACTION_DRAG_CANCEL.id) else false
@ScriptInterface
fun dragDrop() = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S_V2) performAction(AccessibilityAction.ACTION_DRAG_DROP.id) else false
@ScriptInterface
fun dragStart() = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S_V2) performAction(AccessibilityAction.ACTION_DRAG_START.id) else false
@ScriptInterface
fun hideTooltip() = performAction(AccessibilityActionCompat.ACTION_HIDE_TOOLTIP.id)
@ScriptInterface
fun imeEnter() = performAction(AccessibilityActionCompat.ACTION_IME_ENTER.id)
@ScriptInterface
fun moveWindow(x: Int, y: Int) = performAction(
AccessibilityActionCompat.ACTION_MOVE_WINDOW.id,
ActionArgument.IntActionArgument(AccessibilityNodeInfoCompat.ACTION_ARGUMENT_MOVE_WINDOW_X, x),
ActionArgument.IntActionArgument(AccessibilityNodeInfoCompat.ACTION_ARGUMENT_MOVE_WINDOW_Y, y),
)
@ScriptInterface
fun nextAtMovementGranularity(granularity: Int, isExtendSelection: Boolean) = performAction(
AccessibilityActionCompat.ACTION_NEXT_AT_MOVEMENT_GRANULARITY.id,
ActionArgument.IntActionArgument(AccessibilityNodeInfoCompat.ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT, granularity),
ActionArgument.BooleanActionArgument(AccessibilityNodeInfoCompat.ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN, isExtendSelection),
)
@ScriptInterface
fun nextHtmlElement(element: String) = performAction(
AccessibilityActionCompat.ACTION_NEXT_HTML_ELEMENT.id,
ActionArgument.StringActionArgument(AccessibilityNodeInfoCompat.ACTION_ARGUMENT_HTML_ELEMENT_STRING, element),
)
@ScriptInterface
fun pageDown() = performAction(AccessibilityActionCompat.ACTION_PAGE_DOWN.id)
@ScriptInterface
fun pageLeft() = performAction(AccessibilityActionCompat.ACTION_PAGE_LEFT.id)
@ScriptInterface
fun pageRight() = performAction(AccessibilityActionCompat.ACTION_PAGE_RIGHT.id)
@ScriptInterface
fun pageUp() = performAction(AccessibilityActionCompat.ACTION_PAGE_UP.id)
@ScriptInterface
fun pressAndHold() = performAction(AccessibilityActionCompat.ACTION_PRESS_AND_HOLD.id)
@ScriptInterface
fun previousAtMovementGranularity(granularity: Int, isExtendSelection: Boolean) = performAction(
AccessibilityActionCompat.ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY.id,
ActionArgument.IntActionArgument(AccessibilityNodeInfoCompat.ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT, granularity),
ActionArgument.BooleanActionArgument(AccessibilityNodeInfoCompat.ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN, isExtendSelection),
)
@ScriptInterface
fun previousHtmlElement(element: String) = performAction(
AccessibilityActionCompat.ACTION_PREVIOUS_HTML_ELEMENT.id,
ActionArgument.StringActionArgument(AccessibilityNodeInfoCompat.ACTION_ARGUMENT_HTML_ELEMENT_STRING, element),
)
@ScriptInterface
fun showTextSuggestions() = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) performAction(AccessibilityAction.ACTION_SHOW_TEXT_SUGGESTIONS.id) else false
@ScriptInterface
fun showTooltip() = performAction(AccessibilityActionCompat.ACTION_SHOW_TOOLTIP.id)
@ScriptInterface
fun copy() = performAction(AccessibilityActionCompat.ACTION_COPY.id)
@ScriptInterface
fun paste() = performAction(AccessibilityActionCompat.ACTION_PASTE.id)
@ScriptInterface
fun select() = performAction(AccessibilityActionCompat.ACTION_SELECT.id)
@ScriptInterface
fun cut() = performAction(AccessibilityActionCompat.ACTION_CUT.id)
@ScriptInterface
fun collapse() = performAction(AccessibilityActionCompat.ACTION_COLLAPSE.id)
@ScriptInterface
fun expand() = performAction(AccessibilityActionCompat.ACTION_EXPAND.id)
@ScriptInterface
fun dismiss() = performAction(AccessibilityActionCompat.ACTION_DISMISS.id)
@ScriptInterface
fun show() = performAction(AccessibilityActionCompat.ACTION_SHOW_ON_SCREEN.id)
@ScriptInterface
fun scrollForward() = performAction(AccessibilityActionCompat.ACTION_SCROLL_FORWARD.id)
@ScriptInterface
fun scrollBackward() = performAction(AccessibilityActionCompat.ACTION_SCROLL_BACKWARD.id)
@ScriptInterface
fun scrollUp() = performAction(AccessibilityActionCompat.ACTION_SCROLL_UP.id)
@ScriptInterface
fun scrollDown() = performAction(AccessibilityActionCompat.ACTION_SCROLL_DOWN.id)
@ScriptInterface
fun scrollLeft() = performAction(AccessibilityActionCompat.ACTION_SCROLL_LEFT.id)
@ScriptInterface
fun scrollRight() = performAction(AccessibilityActionCompat.ACTION_SCROLL_RIGHT.id)
@ScriptInterface
fun contextClick() = performAction(AccessibilityActionCompat.ACTION_CONTEXT_CLICK.id)
@ScriptInterface
fun setSelection(s: Int, e: Int) = performAction(
AccessibilityActionCompat.ACTION_SET_SELECTION.id,
ActionArgument.IntActionArgument(AccessibilityNodeInfoCompat.ACTION_ARGUMENT_SELECTION_START_INT, s),
ActionArgument.IntActionArgument(AccessibilityNodeInfoCompat.ACTION_ARGUMENT_SELECTION_END_INT, e),
)
@ScriptInterface
fun setText(text: String) = performAction(
AccessibilityActionCompat.ACTION_SET_TEXT.id,
ActionArgument.CharSequenceActionArgument(AccessibilityNodeInfoCompat.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE, text),
)
@ScriptInterface
fun setProgress(progress: Float) = performAction(
AccessibilityActionCompat.ACTION_SET_PROGRESS.id,
ActionArgument.FloatActionArgument(AccessibilityNodeInfoCompat.ACTION_ARGUMENT_PROGRESS_VALUE, progress),
)
@ScriptInterface
fun scrollTo(row: Int, column: Int) = performAction(
AccessibilityActionCompat.ACTION_SCROLL_TO_POSITION.id,
ActionArgument.IntActionArgument(AccessibilityNodeInfoCompat.ACTION_ARGUMENT_ROW_INT, row),
ActionArgument.IntActionArgument(AccessibilityNodeInfoCompat.ACTION_ARGUMENT_COLUMN_INT, column),
)
}

View File

@@ -0,0 +1,19 @@
package org.autojs.autojs.core.automator.filter
import org.autojs.autojs.core.automator.UiObject
import org.autojs.autojs.pref.Language
import org.autojs.autojs.util.App
/**
* Created by SuperMonster003 on Nov 19, 2022.
*/
class ActionFilter(private val actions: Array<out Any>) : Filter {
override fun filter(node: UiObject) = node.hasAction(*actions)
override fun toString() = when (actions.size) {
1 -> "action(${actions.joinToString()})"
else /* including 0. */ -> "action([${actions.joinToString(",")}])"
}
}

View File

@@ -0,0 +1,43 @@
package org.autojs.autojs.core.automator.filter
import androidx.core.util.rangeTo
import org.autojs.autojs.core.automator.UiObject
import org.autojs.autojs.runtime.api.ScreenMetrics
import org.autojs.autojs.util.StringUtils.formatDouble
/**
* Created by SuperMonster003 on Nov 19, 2022.
*/
class DoubleMinFilter(private val mDoubleMinProperty: DoubleMinProperty, private val mMin: Double? = null) : Filter {
interface DoubleMinProperty {
operator fun get(o: UiObject): Double
}
override fun filter(node: UiObject) = mDoubleMinProperty[node] >= (mMin ?: DEFAULT)
override fun toString() = "$mDoubleMinProperty(${mMin?.let { formatDouble(it) } ?: ""})"
companion object {
const val DEFAULT = 0.948
val SCREEN_COVERAGE = object : DoubleMinProperty {
override fun get(o: UiObject): Double {
val w = ScreenMetrics.deviceScreenWidth
val h = ScreenMetrics.deviceScreenHeight
val validLeft = o.left().coerceIn(0..w)
val validTop = o.top().coerceIn(0..h)
val validRight = o.right().coerceIn(0..w)
val validBottom = o.bottom().coerceIn(0..h)
val objectArea = (validRight - validLeft) * (validBottom - validTop)
val screenArea = w * h
return objectArea.toDouble() / screenArea.toDouble()
}
override fun toString() = "screenCoverage"
}
}
}

View File

@@ -0,0 +1,20 @@
package org.autojs.autojs.core.automator.filter
import org.autojs.autojs.core.automator.UiObject
/**
* Created by SuperMonster003 on Oct 17, 2022.
*/
object IdHexFilter {
private val TEXT_GETTER = object : KeyGetter {
override fun getKey(nodeInfo: UiObject) = nodeInfo.idHex()
override fun toString() = "idHex"
}
fun equals(text: String) = StringEqualsFilter(text, TEXT_GETTER)
}

View File

@@ -0,0 +1,27 @@
package org.autojs.autojs.core.automator.filter
import org.autojs.autojs.core.automator.UiObject
/**
* Created by SuperMonster003 on Nov 29, 2022.
*/
class MaxIntFilter(private val mIntProperty: IntProperty, private val mValue: Int) : Filter {
interface IntProperty {
operator fun get(o: UiObject): Int
}
override fun filter(node: UiObject): Boolean = mIntProperty[node] <= mValue
override fun toString() = "$mIntProperty($mValue)"
companion object {
val CHILD_COUNT = object : IntProperty {
override fun get(o: UiObject): Int = o.childCount()
override fun toString() = "maxChildCount"
}
}
}

View File

@@ -0,0 +1,105 @@
package org.autojs.autojs.core.automator.filter
import org.autojs.autojs.core.automator.UiObject
import org.autojs.autojs.runtime.api.ScreenMetrics.Companion.toRoundIntX
import org.autojs.autojs.runtime.api.ScreenMetrics.Companion.toRoundIntY
import org.autojs.autojs.util.StringUtils.formatDouble
/**
* Created by SuperMonster003 on Nov 19, 2022.
*/
class MetricsFilter(private val mMetricsProperty: MetricsProperty, private val mValue: Double) : Filter {
interface MetricsProperty {
operator fun get(o: UiObject, value: Double): Boolean
}
override fun filter(node: UiObject) = mMetricsProperty[node, mValue]
override fun toString() = "$mMetricsProperty(${formatDouble(mValue)})"
companion object {
val LEFT = object : MetricsProperty {
override fun get(o: UiObject, value: Double) = o.left() == toRoundIntX(value)
override fun toString() = "left"
}
val TOP = object : MetricsProperty {
override fun get(o: UiObject, value: Double) = o.top() == toRoundIntY(value)
override fun toString() = "top"
}
val RIGHT = object : MetricsProperty {
override fun get(o: UiObject, value: Double) = o.right() == toRoundIntX(value)
override fun toString() = "right"
}
val BOTTOM = object : MetricsProperty {
override fun get(o: UiObject, value: Double) = o.bottom() == toRoundIntY(value)
override fun toString() = "bottom"
}
val WIDTH = object : MetricsProperty {
override fun get(o: UiObject, value: Double) = o.width() == toRoundIntX(value)
override fun toString() = "width"
}
val HEIGHT = object : MetricsProperty {
override fun get(o: UiObject, value: Double) = o.height() == toRoundIntY(value)
override fun toString() = "height"
}
val CENTER_X = object : MetricsProperty {
override fun get(o: UiObject, value: Double) = o.centerX() == toRoundIntX(value)
override fun toString() = "centerX"
}
val CENTER_Y = object : MetricsProperty {
override fun get(o: UiObject, value: Double) = o.centerY() == toRoundIntY(value)
override fun toString() = "centerY"
}
val BOUNDS_LEFT = object : MetricsProperty {
override fun get(o: UiObject, value: Double) = o.boundsLeft() == toRoundIntX(value)
override fun toString() = "boundsLeft"
}
val BOUNDS_TOP = object : MetricsProperty {
override fun get(o: UiObject, value: Double) = o.boundsTop() == toRoundIntY(value)
override fun toString() = "boundsTop"
}
val BOUNDS_RIGHT = object : MetricsProperty {
override fun get(o: UiObject, value: Double) = o.boundsRight() == toRoundIntX(value)
override fun toString() = "boundsRight"
}
val BOUNDS_BOTTOM = object : MetricsProperty {
override fun get(o: UiObject, value: Double) = o.boundsBottom() == toRoundIntY(value)
override fun toString() = "boundsBottom"
}
val BOUNDS_WIDTH = object : MetricsProperty {
override fun get(o: UiObject, value: Double) = o.boundsWidth() == toRoundIntX(value)
override fun toString() = "boundsWidth"
}
val BOUNDS_HEIGHT = object : MetricsProperty {
override fun get(o: UiObject, value: Double) = o.boundsHeight() == toRoundIntY(value)
override fun toString() = "boundsHeight"
}
val BOUNDS_CENTER_X = object : MetricsProperty {
override fun get(o: UiObject, value: Double) = o.boundsCenterX() == toRoundIntX(value)
override fun toString() = "boundsCenterX"
}
val BOUNDS_CENTER_Y = object : MetricsProperty {
override fun get(o: UiObject, value: Double) = o.boundsCenterY() == toRoundIntY(value)
override fun toString() = "boundsCenterY"
}
}
}

View File

@@ -0,0 +1,105 @@
package org.autojs.autojs.core.automator.filter
import org.autojs.autojs.core.automator.UiObject
import org.autojs.autojs.runtime.api.ScreenMetrics.Companion.toRoundIntX
import org.autojs.autojs.runtime.api.ScreenMetrics.Companion.toRoundIntY
import org.autojs.autojs.util.StringUtils.formatDouble
/**
* Created by SuperMonster003 on Nov 19, 2022.
*/
class MetricsMaxFilter(private val mIntMaxProperty: IntMaxProperty, private val mMax: Double) : Filter {
interface IntMaxProperty {
operator fun get(o: UiObject, max: Double): Boolean
}
override fun filter(node: UiObject) = mIntMaxProperty[node, mMax]
override fun toString() = "$mIntMaxProperty(${formatDouble(mMax)})"
companion object {
val LEFT = object : IntMaxProperty {
override fun get(o: UiObject, max: Double) = o.left() <= toRoundIntX(max)
override fun toString() = "maxLeft"
}
val TOP = object : IntMaxProperty {
override fun get(o: UiObject, max: Double) = o.top() <= toRoundIntY(max)
override fun toString() = "maxTop"
}
val RIGHT = object : IntMaxProperty {
override fun get(o: UiObject, max: Double) = o.right() <= toRoundIntX(max)
override fun toString() = "maxRight"
}
val BOTTOM = object : IntMaxProperty {
override fun get(o: UiObject, max: Double) = o.bottom() <= toRoundIntY(max)
override fun toString() = "maxBottom"
}
val WIDTH = object : IntMaxProperty {
override fun get(o: UiObject, max: Double) = o.width() <= toRoundIntX(max)
override fun toString() = "maxWidth"
}
val HEIGHT = object : IntMaxProperty {
override fun get(o: UiObject, max: Double) = o.height() <= toRoundIntY(max)
override fun toString() = "maxHeight"
}
val CENTER_X = object : IntMaxProperty {
override fun get(o: UiObject, max: Double) = o.centerX() <= toRoundIntX(max)
override fun toString() = "maxCenterX"
}
val CENTER_Y = object : IntMaxProperty {
override fun get(o: UiObject, max: Double) = o.centerY() <= toRoundIntY(max)
override fun toString() = "maxCenterY"
}
val BOUNDS_LEFT = object : IntMaxProperty {
override fun get(o: UiObject, max: Double) = o.boundsLeft() <= toRoundIntX(max)
override fun toString() = "boundsMaxLeft"
}
val BOUNDS_TOP = object : IntMaxProperty {
override fun get(o: UiObject, max: Double) = o.boundsTop() <= toRoundIntY(max)
override fun toString() = "boundsMaxTop"
}
val BOUNDS_RIGHT = object : IntMaxProperty {
override fun get(o: UiObject, max: Double) = o.boundsRight() <= toRoundIntX(max)
override fun toString() = "boundsMaxRight"
}
val BOUNDS_BOTTOM = object : IntMaxProperty {
override fun get(o: UiObject, max: Double) = o.boundsBottom() <= toRoundIntY(max)
override fun toString() = "boundsMaxBottom"
}
val BOUNDS_WIDTH = object : IntMaxProperty {
override fun get(o: UiObject, max: Double) = o.boundsWidth() <= toRoundIntX(max)
override fun toString() = "boundsMaxWidth"
}
val BOUNDS_HEIGHT = object : IntMaxProperty {
override fun get(o: UiObject, max: Double) = o.boundsHeight() <= toRoundIntY(max)
override fun toString() = "boundsMaxHeight"
}
val BOUNDS_CENTER_X = object : IntMaxProperty {
override fun get(o: UiObject, max: Double) = o.boundsCenterX() <= toRoundIntX(max)
override fun toString() = "boundsMaxCenterX"
}
val BOUNDS_CENTER_Y = object : IntMaxProperty {
override fun get(o: UiObject, max: Double) = o.boundsCenterY() <= toRoundIntY(max)
override fun toString() = "boundsMaxCenterY"
}
}
}

View File

@@ -0,0 +1,105 @@
package org.autojs.autojs.core.automator.filter
import org.autojs.autojs.core.automator.UiObject
import org.autojs.autojs.runtime.api.ScreenMetrics.Companion.toRoundIntX
import org.autojs.autojs.runtime.api.ScreenMetrics.Companion.toRoundIntY
import org.autojs.autojs.util.StringUtils.formatDouble
/**
* Created by SuperMonster003 on Nov 19, 2022.
*/
class MetricsMinFilter(private val mIntMinProperty: IntMinProperty, private val mMin: Double) : Filter {
interface IntMinProperty {
operator fun get(o: UiObject, min: Double): Boolean
}
override fun filter(node: UiObject) = mIntMinProperty[node, mMin]
override fun toString() = "$mIntMinProperty(${formatDouble(mMin)})"
companion object {
val LEFT = object : IntMinProperty {
override fun get(o: UiObject, min: Double) = o.left() >= toRoundIntX(min)
override fun toString() = "minLeft"
}
val TOP = object : IntMinProperty {
override fun get(o: UiObject, min: Double) = o.top() >= toRoundIntY(min)
override fun toString() = "minTop"
}
val RIGHT = object : IntMinProperty {
override fun get(o: UiObject, min: Double) = o.right() >= toRoundIntX(min)
override fun toString() = "minRight"
}
val BOTTOM = object : IntMinProperty {
override fun get(o: UiObject, min: Double) = o.bottom() >= toRoundIntY(min)
override fun toString() = "minBottom"
}
val WIDTH = object : IntMinProperty {
override fun get(o: UiObject, min: Double) = o.width() >= toRoundIntX(min)
override fun toString() = "minWidth"
}
val HEIGHT = object : IntMinProperty {
override fun get(o: UiObject, min: Double) = o.height() >= toRoundIntY(min)
override fun toString() = "minHeight"
}
val CENTER_X = object : IntMinProperty {
override fun get(o: UiObject, min: Double) = o.centerX() >= toRoundIntX(min)
override fun toString() = "minCenterX"
}
val CENTER_Y = object : IntMinProperty {
override fun get(o: UiObject, min: Double) = o.centerY() >= toRoundIntY(min)
override fun toString() = "minCenterY"
}
val BOUNDS_LEFT = object : IntMinProperty {
override fun get(o: UiObject, min: Double) = o.boundsLeft() >= toRoundIntX(min)
override fun toString() = "boundsMinLeft"
}
val BOUNDS_TOP = object : IntMinProperty {
override fun get(o: UiObject, min: Double) = o.boundsTop() >= toRoundIntY(min)
override fun toString() = "boundsMinTop"
}
val BOUNDS_RIGHT = object : IntMinProperty {
override fun get(o: UiObject, min: Double) = o.boundsRight() >= toRoundIntX(min)
override fun toString() = "boundsMinRight"
}
val BOUNDS_BOTTOM = object : IntMinProperty {
override fun get(o: UiObject, min: Double) = o.boundsBottom() >= toRoundIntY(min)
override fun toString() = "boundsMinBottom"
}
val BOUNDS_WIDTH = object : IntMinProperty {
override fun get(o: UiObject, min: Double) = o.boundsWidth() >= toRoundIntX(min)
override fun toString() = "boundsMinWidth"
}
val BOUNDS_HEIGHT = object : IntMinProperty {
override fun get(o: UiObject, min: Double) = o.boundsHeight() >= toRoundIntY(min)
override fun toString() = "boundsMinHeight"
}
val BOUNDS_CENTER_X = object : IntMinProperty {
override fun get(o: UiObject, min: Double) = o.boundsCenterX() >= toRoundIntX(min)
override fun toString() = "boundsMinCenterX"
}
val BOUNDS_CENTER_Y = object : IntMinProperty {
override fun get(o: UiObject, min: Double) = o.boundsCenterY() >= toRoundIntY(min)
override fun toString() = "boundsMinCenterY"
}
}
}

View File

@@ -0,0 +1,105 @@
package org.autojs.autojs.core.automator.filter
import org.autojs.autojs.core.automator.UiObject
import org.autojs.autojs.runtime.api.ScreenMetrics.Companion.toRoundIntX
import org.autojs.autojs.runtime.api.ScreenMetrics.Companion.toRoundIntY
import org.autojs.autojs.util.StringUtils.formatDouble
/**
* Created by SuperMonster003 on Nov 19, 2022.
*/
class MetricsRangeFilter(private val mIntRangeProperty: IntRangeProperty, private val mMin: Double, private val mMax: Double) : Filter {
interface IntRangeProperty {
operator fun get(o: UiObject, min: Double, max: Double): Boolean
}
override fun filter(node: UiObject) = mIntRangeProperty[node, mMin, mMax]
override fun toString() = "$mIntRangeProperty(${formatDouble(mMin)}, ${formatDouble(mMax)})"
companion object {
val LEFT = object : IntRangeProperty {
override fun get(o: UiObject, min: Double, max: Double) = o.left() in toRoundIntX(min)..toRoundIntX(max)
override fun toString() = "left"
}
val TOP = object : IntRangeProperty {
override fun get(o: UiObject, min: Double, max: Double) = o.top() in toRoundIntY(min)..toRoundIntY(max)
override fun toString() = "top"
}
val RIGHT = object : IntRangeProperty {
override fun get(o: UiObject, min: Double, max: Double) = o.right() in toRoundIntX(min)..toRoundIntX(max)
override fun toString() = "right"
}
val BOTTOM = object : IntRangeProperty {
override fun get(o: UiObject, min: Double, max: Double) = o.bottom() in toRoundIntY(min)..toRoundIntY(max)
override fun toString() = "bottom"
}
val WIDTH = object : IntRangeProperty {
override fun get(o: UiObject, min: Double, max: Double) = o.width() in toRoundIntX(min)..toRoundIntX(max)
override fun toString() = "width"
}
val HEIGHT = object : IntRangeProperty {
override fun get(o: UiObject, min: Double, max: Double) = o.height() in toRoundIntY(min)..toRoundIntY(max)
override fun toString() = "height"
}
val CENTER_X = object : IntRangeProperty {
override fun get(o: UiObject, min: Double, max: Double) = o.centerX() in toRoundIntX(min)..toRoundIntX(max)
override fun toString() = "centerX"
}
val CENTER_Y = object : IntRangeProperty {
override fun get(o: UiObject, min: Double, max: Double) = o.centerY() in toRoundIntY(min)..toRoundIntY(max)
override fun toString() = "centerY"
}
val BOUNDS_LEFT = object : IntRangeProperty {
override fun get(o: UiObject, min: Double, max: Double) = o.boundsLeft() in toRoundIntX(min)..toRoundIntX(max)
override fun toString() = "boundsLeft"
}
val BOUNDS_TOP = object : IntRangeProperty {
override fun get(o: UiObject, min: Double, max: Double) = o.boundsTop() in toRoundIntY(min)..toRoundIntY(max)
override fun toString() = "boundsTop"
}
val BOUNDS_RIGHT = object : IntRangeProperty {
override fun get(o: UiObject, min: Double, max: Double) = o.boundsRight() in toRoundIntX(min)..toRoundIntX(max)
override fun toString() = "boundsRight"
}
val BOUNDS_BOTTOM = object : IntRangeProperty {
override fun get(o: UiObject, min: Double, max: Double) = o.boundsBottom() in toRoundIntY(min)..toRoundIntY(max)
override fun toString() = "boundsBottom"
}
val BOUNDS_WIDTH = object : IntRangeProperty {
override fun get(o: UiObject, min: Double, max: Double) = o.boundsWidth() in toRoundIntX(min)..toRoundIntX(max)
override fun toString() = "boundsWidth"
}
val BOUNDS_HEIGHT = object : IntRangeProperty {
override fun get(o: UiObject, min: Double, max: Double) = o.boundsHeight() in toRoundIntY(min)..toRoundIntY(max)
override fun toString() = "boundsHeight"
}
val BOUNDS_CENTER_X = object : IntRangeProperty {
override fun get(o: UiObject, min: Double, max: Double) = o.boundsCenterX() in toRoundIntX(min)..toRoundIntX(max)
override fun toString() = "boundsCenterX"
}
val BOUNDS_CENTER_Y = object : IntRangeProperty {
override fun get(o: UiObject, min: Double, max: Double) = o.boundsCenterY() in toRoundIntY(min)..toRoundIntY(max)
override fun toString() = "boundsCenterY"
}
}
}

View File

@@ -0,0 +1,27 @@
package org.autojs.autojs.core.automator.filter
import org.autojs.autojs.core.automator.UiObject
/**
* Created by SuperMonster003 on Nov 29, 2022.
*/
class MinIntFilter(private val mIntProperty: IntProperty, private val mValue: Int) : Filter {
interface IntProperty {
operator fun get(o: UiObject): Int
}
override fun filter(node: UiObject): Boolean = mIntProperty[node] >= mValue
override fun toString() = "$mIntProperty($mValue)"
companion object {
val CHILD_COUNT = object : IntProperty {
override fun get(o: UiObject): Int = o.childCount()
override fun toString() = "minChildCount"
}
}
}

View File

@@ -0,0 +1,32 @@
package org.autojs.autojs.core.automator.filter
import org.autojs.autojs.core.automator.UiObject
/**
* Created by SuperMonster003 on Oct 17, 2022.
*/
class StringListMatchFilter internal constructor(private val mRegex: String, private val mKeysGetter: KeysGetter) : Filter {
// @Hint by SuperMonster003 on Oct 17, 2022.
// ! Similar to JavaScript String.prototype.match
// ! Returns the result of matching a string against a regular expression.
// ! https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/match
// ! https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.text/-regex/contains-match-in.html
// ! https://stackoverflow.com/questions/21883629/difference-in-results-between-java-matches-vs-javascript-match
override fun filter(node: UiObject) = mKeysGetter.getKeys(node).any {
it ?: return@any false
val prefix = "/"
val suffix = "/i"
if (mRegex.startsWith(prefix) && mRegex.endsWith(suffix)) {
mRegex
.slice(prefix.length until mRegex.length - suffix.length)
.toRegex(RegexOption.IGNORE_CASE)
.containsMatchIn(it)
} else {
mRegex.toRegex().containsMatchIn(it)
}
}
override fun toString() = "${mKeysGetter}Match(\"$mRegex\")"
}

View File

@@ -0,0 +1,27 @@
package org.autojs.autojs.core.automator.filter
import org.autojs.autojs.core.automator.UiObject
/**
* Created by Stardust on 2017/3/9.
* Modified by SuperMonster003 as of Nov 19, 2022.
*/
class StringMatchFilter internal constructor(private val mRegex: String, private val mKeyGetter: KeyGetter) : Filter {
// @Hint by SuperMonster003 on Oct 17, 2022.
// ! Similar to JavaScript String.prototype.match
// ! Returns the result of matching a string against a regular expression.
// ! https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/match
// ! https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.text/-regex/contains-match-in.html
// ! https://stackoverflow.com/questions/21883629/difference-in-results-between-java-matches-vs-javascript-match
override fun filter(node: UiObject) = mKeyGetter.getKey(node)?.contains(mRegex.toRegex()) ?: false
override fun toString(): String {
val regexStr = when (mRegex.isEmpty()) {
true -> "(?:)"
else -> mRegex.toRegex().toString().replace("/", "\\/")
}
return "${mKeyGetter}Match(/$regexStr/)"
}
}

View File

@@ -0,0 +1,53 @@
package org.autojs.autojs.core.automator.filter
import org.autojs.autojs.core.automator.UiObject
import org.autojs.autojs.runtime.api.ScreenMetrics.Companion.deviceScreenHeight
import org.autojs.autojs.runtime.api.ScreenMetrics.Companion.deviceScreenWidth
import org.autojs.autojs.util.StringUtils.formatDouble
import kotlin.math.abs
/**
* Modified by SuperMonster003 as of Nov 19, 2022.
*/
class ToleranceFilter(private val mToleranceSupplier: ToleranceSupplier, private val mExceptedValue: Boolean? = null, private val mTolerance: Double? = null) : Filter {
interface ToleranceSupplier {
operator fun get(node: UiObject, tolerance: Double): Boolean
}
override fun filter(node: UiObject) = mToleranceSupplier[node, mTolerance ?: DEFAULT_TOLERANCE] == (mExceptedValue ?: DEFAULT_EXPECTED)
override fun toString() = when (mExceptedValue != null) {
true -> "$mToleranceSupplier($mExceptedValue${mTolerance?.let { ", ${formatDouble(mTolerance)}" } ?: ""})"
else -> "$mToleranceSupplier(${mTolerance?.let { formatDouble(it) } ?: ""})"
}
companion object {
const val DEFAULT_EXPECTED = true
const val DEFAULT_TOLERANCE = 0.016
val SCREEN_CENTER_X = object : ToleranceSupplier {
override fun get(node: UiObject, tolerance: Double): Boolean {
val w = deviceScreenWidth
val x = node.centerX().toDouble()
return abs(x - w / 2) / w <= tolerance
}
override fun toString() = "screenCenterX"
}
val SCREEN_CENTER_Y = object : ToleranceSupplier {
override fun get(node: UiObject, tolerance: Double): Boolean {
val h = deviceScreenHeight
val y = node.centerY().toDouble()
return abs(y - h / 2) / h <= tolerance
}
override fun toString() = "screenCenterY"
}
}
}

View File

@@ -0,0 +1,26 @@
package org.autojs.autojs.core.console
import android.content.Context
import android.util.AttributeSet
import android.util.Log
import org.autojs.autojs.tool.MapBuilder
import org.autojs.autojs6.R
class FloatingConsoleView : ConsoleView {
constructor(context: Context?) : super(context)
constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs)
constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr)
override fun getLogLevelMap(): MutableMap<Int, Int> = MapBuilder<Int, Int>()
.put(R.color.floating_console_view_verbose, Log.VERBOSE)
.put(R.color.floating_console_view_debug, Log.DEBUG)
.put(R.color.floating_console_view_info, Log.INFO)
.put(R.color.floating_console_view_warn, Log.WARN)
.put(R.color.floating_console_view_error, Log.ERROR)
.put(R.color.floating_console_view_assert, Log.ASSERT)
.build()
}

View File

@@ -0,0 +1,768 @@
@file:Suppress("unused", "MemberVisibilityCanBePrivate")
package org.autojs.autojs.core.image
import android.content.res.Resources.NotFoundException
import org.autojs.autojs.app.GlobalAppContext
import org.autojs.autojs6.R
/**
* Created by SuperMonster003 on Dec 21, 2022.
*/
class ColorTable {
object Android {
const val TRANSPARENT = 0
const val BLACK = -0x1000000
const val BLUE = -0xffff01
const val CYAN = -0xff0001
const val AQUA = CYAN
const val DARK_GRAY = -0xbbbbbc
const val DARK_GREY = DARK_GRAY
const val DKGRAY = DARK_GRAY
const val GRAY = -0x777778
const val GREY = GRAY
const val GREEN = -0xff0100
const val LIME = GREEN
const val LIGHT_GRAY = -0x333334
const val LIGHT_GREY = LIGHT_GRAY
const val LTGRAY = LIGHT_GRAY
const val MAGENTA = -0xff01
const val FUCHSIA = MAGENTA
const val MAROON = -0x800000
const val NAVY = -0xffff80
const val OLIVE = -0x7f8000
const val PURPLE = -0x7fff80
const val RED = -0x10000
const val SILVER = -0x3f3f40
const val TEAL = -0xff7f80
const val WHITE = -0x1
const val YELLOW = -0x100
}
object Css {
const val ALICE_BLUE = -0xf0701
const val ANTIQUE_WHITE = -0x51429
const val AQUAMARINE = -0x80002c
const val AZURE = -0xf0001
const val BEIGE = -0xa0a24
const val BISQUE = -0x1b3c
const val BLACK = -0x1000000
const val BLANCHED_ALMOND = -0x1433
const val BLUE = -0xffff01
const val BLUE_VIOLET = -0x75d41e
const val BROWN = -0x5ad5d6
const val BURLY_WOOD = -0x214779
const val CADET_BLUE = -0xa06160
const val CHARTREUSE = -0x800100
const val CHOCOLATE = -0x2d96e2
const val CORAL = -0x80b0
const val CORNFLOWER_BLUE = -0x9b6a13
const val CORN_SILK = -0x724
const val CRIMSON = -0x23ebc4
const val CYAN = -0xff0001
const val AQUA = CYAN
const val DARK_BLUE = -0xffff75
const val DARK_CYAN = -0xff7475
const val DARK_GOLDENROD = -0x4779f5
const val DARK_GRAY = -0x565657
const val DARK_GREY = DARK_GRAY
const val DARK_GREEN = -0xff9c00
const val DARK_KHAKI = -0x424895
const val DARK_MAGENTA = -0x74ff75
const val DARK_OLIVE_GREEN = -0xaa94d1
const val DARK_ORANGE = -0x7400
const val DARK_ORCHID = -0x66cd34
const val DARK_RED = -0x750000
const val DARK_SALMON = -0x166986
const val DARK_SEA_GREEN = -0x704371
const val DARK_SLATE_BLUE = -0xb7c275
const val DARK_SLATE_GRAY = -0xd0b0b1
const val DARK_SLATE_GREY = DARK_SLATE_GRAY
const val DARK_TURQUOISE = -0xff312f
const val DARK_VIOLET = -0x6bff2d
const val DEEP_PINK = -0xeb6d
const val DEEP_SKY_BLUE = -0xff4001
const val DIM_GRAY = -0x969697
const val DIM_GREY = DIM_GRAY
const val DODGER_BLUE = -0xe16f01
const val FIRE_BRICK = -0x4dddde
const val FLORAL_WHITE = -0x510
const val FOREST_GREEN = -0xdd74de
const val GAINSBORO = -0x232324
const val GHOST_WHITE = -0x70701
const val GOLD = -0x2900
const val GOLDENROD = -0x255ae0
const val GRAY = -0x7f7f80
const val GREY = GRAY
const val GREEN = -0xff8000
const val GREEN_YELLOW = -0x5200d1
const val HONEYDEW = -0xf0010
const val HOT_PINK = -0x964c
const val INDIAN_RED = -0x32a3a4
const val INDIGO = -0xb4ff7e
const val IVORY = -0x10
const val KHAKI = -0xf1974
const val LAVENDER = -0x191906
const val LAVENDER_BLUSH = -0xf0b
const val LAWN_GREEN = -0x830400
const val LEMON_CHIFFON = -0x533
const val LIGHT_BLUE = -0x52271a
const val LIGHT_CORAL = -0xf7f80
const val LIGHT_CYAN = -0x1f0001
const val LIGHT_GOLDENROD_YELLOW = -0x5052e
const val LIGHT_GRAY = -0x2c2c2d
const val LIGHT_GREY = LIGHT_GRAY
const val LIGHT_GREEN = -0x6f1170
const val LIGHT_PINK = -0x493f
const val LIGHT_SALMON = -0x5f86
const val LIGHT_SEA_GREEN = -0xdf4d56
const val LIGHT_SKY_BLUE = -0x783106
const val LIGHT_SLATE_GRAY = -0x887767
const val LIGHT_SLATE_GREY = LIGHT_SLATE_GRAY
const val LIGHT_STEEL_BLUE = -0x4f3b22
const val LIGHT_YELLOW = -0x20
const val LIME = -0xff0100
const val LIME_GREEN = -0xcd32ce
const val LINEN = -0x50f1a
const val MAGENTA = -0xff01
const val FUCHSIA = MAGENTA
const val MAROON = -0x800000
const val MEDIUM_AQUAMARINE = -0x993256
const val MEDIUM_BLUE = -0xffff33
const val MEDIUM_LAVENDER_MAGENTA = -0x225f23
const val MEDIUM_ORCHID = -0x45aa2d
const val MEDIUM_PURPLE = -0x6c8f25
const val MEDIUM_SEA_GREEN = -0xc34c8f
const val MEDIUM_SLATE_BLUE = -0x849712
const val MEDIUM_SPRING_GREEN = -0xff0566
const val MEDIUM_TURQUOISE = -0xb72e34
const val MEDIUM_VIOLET_RED = -0x38ea7b
const val MIDNIGHT_BLUE = -0xe6e690
const val MINT_CREAM = -0xa0006
const val MISTY_ROSE = -0x1b1f
const val MOCCASIN = -0x1b4b
const val NAVAJO_WHITE = -0x2153
const val NAVY = -0xffff80
const val OLD_LACE = -0x20a1a
const val OLIVE = -0x7f8000
const val OLIVE_DRAB = -0x9471dd
const val ORANGE = -0x5b00
const val ORANGE_RED = -0xbb00
const val ORCHID = -0x258f2a
const val PALE_GOLDENROD = -0x111756
const val PALE_GREEN = -0x670468
const val PALE_TURQUOISE = -0x501112
const val PALE_VIOLET_RED = -0x248f6d
const val PAPAYA_WHIP = -0x102b
const val PATRIARCH = -0x7fff80
const val PEACH_PUFF = -0x2547
const val PERU = -0x327ac1
const val PINK = -0x3f35
const val POWDER_BLUE = -0x4f1f1a
const val REBECCA_PURPLE = -0x99cc67
const val RED = -0x10000
const val ROSY_BROWN = -0x437071
const val ROYAL_BLUE = -0xbe961f
const val SADDLE_BROWN = -0x74baed
const val SALMON = -0x57f8e
const val SAND_BROWN = -0xb5ba0
const val SEASHELL = -0xa12
const val SEA_GREEN = -0xd174a9
const val SIENNA = -0x5fadd3
const val SILVER = -0x3f3f40
const val SKY_BLUE = -0x783115
const val SLATE_BLUE = -0x95a533
const val SLATE_GRAY = -0x8f7f70
const val SLATE_GREY = SLATE_GRAY
const val SNOW = -0x506
const val SPRING_GREEN = -0xff0081
const val STEEL_BLUE = -0xb97d4c
const val TAN = -0x2d4b74
const val TEAL = -0xff7f80
const val THISTLE = -0x274028
const val TOMATO = -0x9cb9
const val TURQUOISE = -0xbf1f30
const val VIOLET = -0x117d12
const val WHEAT = -0xa214d
const val WHITE = -0x1
const val WHITE_SMOKE = -0xa0a0b
const val YELLOW = -0x100
const val YELLOW_GREEN = -0x6532ce
}
object Web {
const val ALICE_BLUE = -0xf0701
const val ALIZARIN_CRIMSON = -0x1cd9ca
const val AMBER = -0x4100
const val AMETHYST = -0x669934
const val ANTIQUE_WHITE = -0x51429
const val APPLE_GREEN = -0x731a00
const val APRICOT = -0x19669a
const val AQUA = -0x50201c
const val AQUAMARINE = -0x80002c
const val AQUA_BLUE = -0x99001a
const val AZURE = -0xff8001
const val BABY_BLUE = -0x763010
const val BABY_PINK = -0x261a
const val BEIGE = -0xa0a24
const val BISQUE = -0x1b3c
const val BLACK = -0x1000000
const val BLANCHED_ALMOND = -0x1433
const val BLUE = -0xffff01
const val BLUE_VIOLET = -0x75d41e
const val BRIGHT_GREEN = -0x990100
const val BRONZE = -0x3280ce
const val BROWN = -0x5ad5d6
const val BURGUNDY = -0x7fffe0
const val BURLY_WOOD = -0x214779
const val BURNT_ORANGE = -0x33ab00
const val CADET_BLUE = -0xa06160
const val CAMEL = -0x5e94b9
const val CAMELLIA = -0x19c66b
const val CANARY_YELLOW = -0x1100
const val CARDINAL_RED = -0x66ffca
const val CARMINE = -0x19ffa4
const val CELADON = -0x531e51
const val CERISE = -0x21ce9d
const val CERULEAN_BLUE = -0xd5ad42
const val CHAMPAGNE_YELLOW = -0x67
const val CHARTREUSE = -0x800100
const val CHOCOLATE = -0x2d96e2
const val CHROME_YELLOW = -0x194800
const val CLEMATIS = -0x335c34
const val COBALT_BLUE = -0xffb855
const val COBALT_GREEN = -0x9900a7
const val COCONUT_BROWN = -0xb2e100
const val COFFEE = -0xb2c700
const val CORAL = -0x80b0
const val CORAL_PINK = -0x7f41
const val CORNFLOWER_BLUE = -0x9b6a13
const val CORN_SILK = -0x724
const val CREAM = -0x230
const val CRIMSON = -0x23ebc4
const val CYAN = -0xff0001
const val CYAN_BLUE = -0xf24074
const val DARK_BLUE = -0xffff75
const val DARK_CYAN = -0xff7475
const val DARK_GOLDENROD = -0x4779f5
const val DARK_GRAY = -0x565657
const val DARK_GREEN = -0xff9c00
const val DARK_KHAKI = -0x424895
const val DARK_MAGENTA = -0x74ff75
const val DARK_MINERAL_BLUE = -0xdbc983
const val DARK_OLIVE_GREEN = -0xaa94d1
const val DARK_ORANGE = -0x7400
const val DARK_ORCHID = -0x66cd34
const val DARK_POWDER_BLUE = -0xffcc67
const val DARK_RED = -0x750000
const val DARK_SALMON = -0x166986
const val DARK_SEA_GREEN = -0x704371
const val DARK_SLATE_BLUE = -0xb7c275
const val DARK_SLATE_GRAY = -0xd0b0b1
const val DARK_TURQUOISE = -0xff312f
const val DARK_VIOLET = -0x6bff2d
const val DEEP_PINK = -0xeb6d
const val DEEP_SKY_BLUE = -0xff4001
const val DIM_GRAY = -0x969697
const val DODGER_BLUE = -0xe16f01
const val EMERALD = -0xaf3788
const val FIRE_BRICK = -0x4dddde
const val FLAMINGO = -0x197548
const val FLORAL_WHITE = -0x510
const val FOLIAGE_GREEN = -0x8c47c7
const val FOREST_GREEN = -0xdd74de
const val FRESH_LEAVES = -0x6600b3
const val FUCHSIA = -0xbff5f
const val GAINSBORO = -0x232324
const val GHOST_WHITE = -0x70701
const val GOLDEN = -0x2900
const val GOLD = GOLDEN
const val GOLDENROD = -0x255ae0
const val GRASS_GREEN = -0x6619b3
const val GRAY = -0x7f7f80
const val GRAYISH_PURPLE = -0x798b5f
const val GREEN = -0xff8000
const val GREEN_YELLOW = -0x5200d1
const val HELIOTROPE = -0x208c01
const val HONEYDEW = -0xf0010
const val HONEY_ORANGE = -0x4c9a
const val HORIZON_BLUE = -0x472238
const val HOT_PINK = -0x964c
const val INDIAN_RED = -0x32a3a4
const val INDIGO = -0xb4ff80
const val INTERNATIONAL_KLEIN_BLUE = -0xffd059
const val IRON_GRAY = -0x9da4a9
const val IVORY = -0x10
const val IVY_GREEN = -0xc940ca
const val JASMINE = -0x193ca4
const val KHAKI = -0x6694e1
const val LAPIS_LAZULI = -0xd99e64
const val LAVENDER = -0x4a8124
const val LAVENDER_BLUE = -0x333301
const val PERIWINKLE = LAVENDER_BLUE
const val LAVENDER_BLUSH = -0xf0b
const val LAVENDER_MAGENTA = -0x117d12
const val LAVENDER_MIST = -0x191906
const val LAWN_GREEN = -0x830400
const val LEMON_CHIFFON = -0x533
const val LIGHT_BLUE = -0x52271a
const val LIGHT_CORAL = -0xf7f80
const val LIGHT_CYAN = -0x1f0001
const val LIGHT_GOLDENROD_YELLOW = -0x5052e
const val LIGHT_GRAY = -0x2c2c2d
const val LIGHT_GREEN = -0x6f1170
const val LIGHT_KHAKI = -0xf1974
const val LIGHT_PINK = -0x493f
const val LIGHT_SALMON = -0x5f86
const val LIGHT_SEA_GREEN = -0xdf4d56
const val LIGHT_SKY_BLUE = -0x783106
const val LIGHT_SLATE_GRAY = -0x887767
const val LIGHT_STEEL_BLUE = -0x4f3b22
const val LIGHT_VIOLET = -0x4f6247
const val LIGHT_YELLOW = -0x20
const val LILAC = -0x375d38
const val LIME = -0x330100
const val LIGHT_LIME = LIME
const val LIME_GREEN = -0xcd32ce
const val LINEN = -0x50f1a
const val MAGENTA = -0xff01
const val MAGENTA_ROSE = -0xf25a
const val MALACHITE = -0xdd3cd2
const val MALLOW = -0x26b201
const val MARIGOLD = -0x6700
const val MARINE_BLUE = -0xffb883
const val MAROON = -0x800000
const val MAUVE = -0x1f4f01
const val MEDIUM_AQUAMARINE = -0x993256
const val MEDIUM_BLUE = -0xffff33
const val MEDIUM_LAVENDER_MAGENTA = -0x225f23
const val MEDIUM_ORCHID = -0x45aa2d
const val MEDIUM_PURPLE = -0x6c8f25
const val MEDIUM_SEA_GREEN = -0xc34c8f
const val MEDIUM_SLATE_BLUE = -0x849712
const val MEDIUM_SPRING_GREEN = -0xff0566
const val MEDIUM_TURQUOISE = -0xb72e34
const val MEDIUM_VIOLET_RED = -0x38ea7b
const val MIDNIGHT_BLUE = -0xe6e690
const val MIMOSA = -0x1926cd
const val MINERAL_BLUE = -0xffb267
const val MINERAL_VIOLET = -0x5c6252
const val MINT = -0xe967d5
const val MINT_CREAM = -0xa0006
const val MISTY_ROSE = -0x1b1f
const val MOCCASIN = -0x1b4b
const val MOON_YELLOW = -0xb3
const val MOSS_GREEN = -0x9688dd
const val MUSTARD = -0x3333b3
const val NAVAJO_WHITE = -0x2153
const val NAVY = -0xffff80
const val NAVY_BLUE = NAVY
const val OCHER = -0x3388de
const val OLD_LACE = -0x20a1a
const val OLD_ROSE = -0x3f7f7f
const val OLIVE = -0x7f8000
const val OLIVE_DRAB = -0x9471dd
const val OPERA_MAUVE = -0x487b59
const val ORANGE = -0x5b00
const val ORANGE_RED = -0xbb00
const val ORCHID = -0x258f2a
const val PAIL_LILAC = -0x19301a
const val PALE_BLUE = -0x2e120e
const val PALE_DENIM = -0xa1793f
const val PALE_GOLDENROD = -0x111756
const val PALE_GREEN = -0x670468
const val PALE_OCHRE = -0x334c74
const val PALE_TURQUOISE = -0x501112
const val PALE_VIOLET_RED = -0x248f6d
const val PANSY = -0x8bff5f
const val PAPAYA_WHIP = -0x102b
const val PATRIARCH = -0x7fff80
const val PEACH = -0x1a4c
const val PEACH_PEARL = -0x4415f
const val PEACH_PUFF = -0x2547
const val PEACOCK_BLUE = -0xff7f74
const val PEACOCK_GREEN = -0xff5ea4
const val PEARL_PINK = -0x4c1a
const val PERSIMMON = -0xb2c0
const val PERU = -0x327ac1
const val PINK = -0x3f35
const val PLUM = -0x71ba7b
const val POWDER_BLUE = -0x4f1f1a
const val PRUSSIAN_BLUE = -0xffcead
const val PURPLE = -0x95f253
const val RED = -0x10000
const val ROSE = -0xff81
const val ROSE_PINK = -0x9934
const val ROSY_BROWN = -0x437071
const val ROYAL_BLUE = -0xbe961f
const val RUBY = -0x33ff80
const val SADDLE_BROWN = -0x74baed
const val SALMON = -0x57f8e
const val SALMON_PINK = -0x7f67
const val SALVIA_BLUE = -0xb27f1a
const val SAND_BEIGE = -0x193c3d
const val SAND_BROWN = -0xb5ba0
const val SAPPHIRE = -0xf7da99
const val SAXE_BLUE = -0xb8674d
const val SCARLET = -0xdc00
const val SEASHELL = -0xa12
const val SEA_GREEN = -0xd174a9
const val SEPIA = -0x8fbdec
const val SHELL_PINK = -0x4c41
const val SIENNA = -0x5fadd3
const val SILVER = -0x3f3f40
const val SKY_BLUE = -0x783115
const val SLATE_BLUE = -0x95a533
const val SLATE_GRAY = -0x8f7f70
const val SNOW = -0x506
const val SPINEL_RED = -0x8c4d
const val SPRING_GREEN = -0xff0080
const val STEEL_BLUE = -0xb97d4c
const val STRONG_BLUE = -0xff9c8c
const val STRONG_RED = -0x1a0000
const val SUN_ORANGE = -0x8d00
const val TAN = -0x2d4b74
const val TANGERINE = -0xd7b00
const val TANGERINE_YELLOW = -0x3400
const val TEAL = -0xff7f80
const val THISTLE = -0x274028
const val TOMATO = -0x9cb9
const val TROPICAL_ORANGE = -0x7fcd
const val TURQUOISE = -0xcf2a38
const val TURQUOISE_BLUE = -0xff0011
const val TURQUOISE_GREEN = -0xb21980
const val ULTRAMARINE = -0xffcc01
const val VERMILION = -0x1cbdcc
const val VERY_LIGHT_MALACHITE_GREEN = -0x8c1974
const val VIOLET = -0x7fff01
const val VIRIDIAN = -0xed8bca
const val WEDGWOOD_BLUE = -0xa97941
const val WHEAT = -0xa214d
const val WHITE = -0x1
const val WHITE_SMOKE = -0xa0a0b
const val WISTERIA = -0x365f24
const val YELLOW = -0x100
const val YELLOW_GREEN = -0x6532ce
}
object Material {
const val RED_50 = 0xFFFFEBEE
const val RED_100 = 0xFFFFCDD2
const val RED_200 = 0xFFEF9A9A
const val RED_300 = 0xFFE57373
const val RED_400 = 0xFFEF5350
const val RED_500 = 0xFFF44336
const val RED_600 = 0xFFE53935
const val RED_700 = 0xFFD32F2F
const val RED_800 = 0xFFC62828
const val RED_900 = 0xFFB71C1C
const val RED_A100 = 0xFFFF8A80
const val RED_A200 = 0xFFFF5252
const val RED_A400 = 0xFFFF1744
const val RED_A700 = 0xFFD50000
const val PINK_50 = 0xFFFCE4EC
const val PINK_100 = 0xFFF8BBD0
const val PINK_200 = 0xFFF48FB1
const val PINK_300 = 0xFFF06292
const val PINK_400 = 0xFFEC407A
const val PINK_500 = 0xFFE91E63
const val PINK_600 = 0xFFD81B60
const val PINK_700 = 0xFFC2185B
const val PINK_800 = 0xFFAD1457
const val PINK_900 = 0xFF880E4F
const val PINK_A100 = 0xFFFF80AB
const val PINK_A200 = 0xFFFF4081
const val PINK_A400 = 0xFFF50057
const val PINK_A700 = 0xFFC51162
const val PURPLE_50 = 0xFFF3E5F5
const val PURPLE_100 = 0xFFE1BEE7
const val PURPLE_200 = 0xFFCE93D8
const val PURPLE_300 = 0xFFBA68C8
const val PURPLE_400 = 0xFFAB47BC
const val PURPLE_500 = 0xFF9C27B0
const val PURPLE_600 = 0xFF8E24AA
const val PURPLE_700 = 0xFF7B1FA2
const val PURPLE_800 = 0xFF6A1B9A
const val PURPLE_900 = 0xFF4A148C
const val PURPLE_A100 = 0xFFEA80FC
const val PURPLE_A200 = 0xFFE040FB
const val PURPLE_A400 = 0xFFD500F9
const val PURPLE_A700 = 0xFFAA00FF
const val DEEP_PURPLE_50 = 0xFFEDE7F6
const val DEEP_PURPLE_100 = 0xFFD1C4E9
const val DEEP_PURPLE_200 = 0xFFB39DDB
const val DEEP_PURPLE_300 = 0xFF9575CD
const val DEEP_PURPLE_400 = 0xFF7E57C2
const val DEEP_PURPLE_500 = 0xFF673AB7
const val DEEP_PURPLE_600 = 0xFF5E35B1
const val DEEP_PURPLE_700 = 0xFF512DA8
const val DEEP_PURPLE_800 = 0xFF4527A0
const val DEEP_PURPLE_900 = 0xFF311B92
const val DEEP_PURPLE_A100 = 0xFFB388FF
const val DEEP_PURPLE_A200 = 0xFF7C4DFF
const val DEEP_PURPLE_A400 = 0xFF651FFF
const val DEEP_PURPLE_A700 = 0xFF6200EA
const val INDIGO_50 = 0xFFE8EAF6
const val INDIGO_100 = 0xFFC5CAE9
const val INDIGO_200 = 0xFF9FA8DA
const val INDIGO_300 = 0xFF7986CB
const val INDIGO_400 = 0xFF5C6BC0
const val INDIGO_500 = 0xFF3F51B5
const val INDIGO_600 = 0xFF3949AB
const val INDIGO_700 = 0xFF303F9F
const val INDIGO_800 = 0xFF283593
const val INDIGO_900 = 0xFF1A237E
const val INDIGO_A100 = 0xFF8C9EFF
const val INDIGO_A200 = 0xFF536DFE
const val INDIGO_A400 = 0xFF3D5AFE
const val INDIGO_A700 = 0xFF304FFE
const val BLUE_50 = 0xFFE3F2FD
const val BLUE_100 = 0xFFBBDEFB
const val BLUE_200 = 0xFF90CAF9
const val BLUE_300 = 0xFF64B5F6
const val BLUE_400 = 0xFF42A5F5
const val BLUE_500 = 0xFF2196F3
const val BLUE_600 = 0xFF1E88E5
const val BLUE_700 = 0xFF1976D2
const val BLUE_800 = 0xFF1565C0
const val BLUE_900 = 0xFF0D47A1
const val BLUE_A100 = 0xFF82B1FF
const val BLUE_A200 = 0xFF448AFF
const val BLUE_A400 = 0xFF2979FF
const val BLUE_A700 = 0xFF2962FF
const val LIGHT_BLUE_50 = 0xFFE1F5FE
const val LIGHT_BLUE_100 = 0xFFB3E5FC
const val LIGHT_BLUE_200 = 0xFF81D4FA
const val LIGHT_BLUE_300 = 0xFF4FC3F7
const val LIGHT_BLUE_400 = 0xFF29B6FC
const val LIGHT_BLUE_500 = 0xFF03A9F4
const val LIGHT_BLUE_600 = 0xFF039BE5
const val LIGHT_BLUE_700 = 0xFF0288D1
const val LIGHT_BLUE_800 = 0xFF0277BD
const val LIGHT_BLUE_900 = 0xFF01579B
const val LIGHT_BLUE_A100 = 0xFF80D8FF
const val LIGHT_BLUE_A200 = 0xFF40C4FF
const val LIGHT_BLUE_A400 = 0xFF00B0FF
const val LIGHT_BLUE_A700 = 0xFF0091EA
const val CYAN_50 = 0xFFE0F7FA
const val CYAN_100 = 0xFFB2EBF2
const val CYAN_200 = 0xFF80DEEA
const val CYAN_300 = 0xFF4DD0E1
const val CYAN_400 = 0xFF26C6DA
const val CYAN_500 = 0xFF00BCD4
const val CYAN_600 = 0xFF00ACC1
const val CYAN_700 = 0xFF0097A7
const val CYAN_800 = 0xFF00838F
const val CYAN_900 = 0xFF006064
const val CYAN_A100 = 0xFF84FFFF
const val CYAN_A200 = 0xFF18FFFF
const val CYAN_A400 = 0xFF00E5FF
const val CYAN_A700 = 0xFF00B8D4
const val TEAL_50 = 0xFFE0F2F1
const val TEAL_100 = 0xFFB2DFDB
const val TEAL_200 = 0xFF80CBC4
const val TEAL_300 = 0xFF4DB6AC
const val TEAL_400 = 0xFF26A69A
const val TEAL_500 = 0xFF009688
const val TEAL_600 = 0xFF00897B
const val TEAL_700 = 0xFF00796B
const val TEAL_800 = 0xFF00695C
const val TEAL_900 = 0xFF004D40
const val TEAL_A100 = 0xFFA7FFEB
const val TEAL_A200 = 0xFF64FFDA
const val TEAL_A400 = 0xFF1DE9B6
const val TEAL_A700 = 0xFF00BFA5
const val GREEN_50 = 0xFFE8F5E9
const val GREEN_100 = 0xFFC8E6C9
const val GREEN_200 = 0xFFA5D6A7
const val GREEN_300 = 0xFF81C784
const val GREEN_400 = 0xFF66BB6A
const val GREEN_500 = 0xFF4CAF50
const val GREEN_600 = 0xFF43A047
const val GREEN_700 = 0xFF388E3C
const val GREEN_800 = 0xFF2E7D32
const val GREEN_900 = 0xFF1B5E20
const val GREEN_A100 = 0xFFB9F6CA
const val GREEN_A200 = 0xFF69F0AE
const val GREEN_A400 = 0xFF00E676
const val GREEN_A700 = 0xFF00C853
const val LIGHT_GREEN_50 = 0xFFF1F8E9
const val LIGHT_GREEN_100 = 0xFFDCEDC8
const val LIGHT_GREEN_200 = 0xFFC5E1A5
const val LIGHT_GREEN_300 = 0xFFAED581
const val LIGHT_GREEN_400 = 0xFF9CCC65
const val LIGHT_GREEN_500 = 0xFF8BC34A
const val LIGHT_GREEN_600 = 0xFF7CB342
const val LIGHT_GREEN_700 = 0xFF689F38
const val LIGHT_GREEN_800 = 0xFF558B2F
const val LIGHT_GREEN_900 = 0xFF33691E
const val LIGHT_GREEN_A100 = 0xFFCCFF90
const val LIGHT_GREEN_A200 = 0xFFB2FF59
const val LIGHT_GREEN_A400 = 0xFF76FF03
const val LIGHT_GREEN_A700 = 0xFF64DD17
const val LIME_50 = 0xFFF9FBE7
const val LIME_100 = 0xFFF0F4C3
const val LIME_200 = 0xFFE6EE9C
const val LIME_300 = 0xFFDCE775
const val LIME_400 = 0xFFD4E157
const val LIME_500 = 0xFFCDDC39
const val LIME_600 = 0xFFC0CA33
const val LIME_700 = 0xFFA4B42B
const val LIME_800 = 0xFF9E9D24
const val LIME_900 = 0xFF827717
const val LIME_A100 = 0xFFF4FF81
const val LIME_A200 = 0xFFEEFF41
const val LIME_A400 = 0xFFC6FF00
const val LIME_A700 = 0xFFAEEA00
const val YELLOW_50 = 0xFFFFFDE7
const val YELLOW_100 = 0xFFFFF9C4
const val YELLOW_200 = 0xFFFFF590
const val YELLOW_300 = 0xFFFFF176
const val YELLOW_400 = 0xFFFFEE58
const val YELLOW_500 = 0xFFFFEB3B
const val YELLOW_600 = 0xFFFDD835
const val YELLOW_700 = 0xFFFBC02D
const val YELLOW_800 = 0xFFF9A825
const val YELLOW_900 = 0xFFF57F17
const val YELLOW_A100 = 0xFFFFFF82
const val YELLOW_A200 = 0xFFFFFF00
const val YELLOW_A400 = 0xFFFFEA00
const val YELLOW_A700 = 0xFFFFD600
const val AMBER_50 = 0xFFFFF8E1
const val AMBER_100 = 0xFFFFECB3
const val AMBER_200 = 0xFFFFE082
const val AMBER_300 = 0xFFFFD54F
const val AMBER_400 = 0xFFFFCA28
const val AMBER_500 = 0xFFFFC107
const val AMBER_600 = 0xFFFFB300
const val AMBER_700 = 0xFFFFA000
const val AMBER_800 = 0xFFFF8F00
const val AMBER_900 = 0xFFFF6F00
const val AMBER_A100 = 0xFFFFE57F
const val AMBER_A200 = 0xFFFFD740
const val AMBER_A400 = 0xFFFFC400
const val AMBER_A700 = 0xFFFFAB00
const val ORANGE_50 = 0xFFFFF3E0
const val ORANGE_100 = 0xFFFFE0B2
const val ORANGE_200 = 0xFFFFCC80
const val ORANGE_300 = 0xFFFFB74D
const val ORANGE_400 = 0xFFFFA726
const val ORANGE_500 = 0xFFFF9800
const val ORANGE_600 = 0xFFFB8C00
const val ORANGE_700 = 0xFFF57C00
const val ORANGE_800 = 0xFFEF6C00
const val ORANGE_900 = 0xFFE65100
const val ORANGE_A100 = 0xFFFFD180
const val ORANGE_A200 = 0xFFFFAB40
const val ORANGE_A400 = 0xFFFF9100
const val ORANGE_A700 = 0xFFFF6D00
const val DEEP_ORANGE_50 = 0xFFFBE9A7
const val DEEP_ORANGE_100 = 0xFFFFCCBC
const val DEEP_ORANGE_200 = 0xFFFFAB91
const val DEEP_ORANGE_300 = 0xFFFF8A65
const val DEEP_ORANGE_400 = 0xFFFF7043
const val DEEP_ORANGE_500 = 0xFFFF5722
const val DEEP_ORANGE_600 = 0xFFF4511E
const val DEEP_ORANGE_700 = 0xFFE64A19
const val DEEP_ORANGE_800 = 0xFFD84315
const val DEEP_ORANGE_900 = 0xFFBF360C
const val DEEP_ORANGE_A100 = 0xFFFF9E80
const val DEEP_ORANGE_A200 = 0xFFFF6E40
const val DEEP_ORANGE_A400 = 0xFFFF3D00
const val DEEP_ORANGE_A700 = 0xFFDD2600
const val BROWN_50 = 0xFFEFEBE9
const val BROWN_100 = 0xFFD7CCC8
const val BROWN_200 = 0xFFBCAAA4
const val BROWN_300 = 0xFFA1887F
const val BROWN_400 = 0xFF8D6E63
const val BROWN_500 = 0xFF795548
const val BROWN_600 = 0xFF6D4C41
const val BROWN_700 = 0xFF5D4037
const val BROWN_800 = 0xFF4E342E
const val BROWN_900 = 0xFF3E2723
const val GREY_50 = 0xFFFAFAFA
const val GREY_100 = 0xFFF5F5F5
const val GREY_200 = 0xFFEEEEEE
const val GREY_300 = 0xFFE0E0E0
const val GREY_400 = 0xFFBDBDBD
const val GREY_500 = 0xFF9E9E9E
const val GREY_600 = 0xFF757575
const val GREY_700 = 0xFF616161
const val GREY_800 = 0xFF424242
const val GREY_900 = 0xFF212121
const val BLACK_1000 = 0xFF000000
const val WHITE_1000 = 0xFFFFFFFF
const val BLUE_GREY_50 = 0xFFECEFF1
const val BLUE_GREY_100 = 0xFFCFD8DC
const val BLUE_GREY_200 = 0xFFB0BBC5
const val BLUE_GREY_300 = 0xFF90A4AE
const val BLUE_GREY_400 = 0xFF78909C
const val BLUE_GREY_500 = 0xFF607D8B
const val BLUE_GREY_600 = 0xFF546E7A
const val BLUE_GREY_700 = 0xFF455A64
const val BLUE_GREY_800 = 0xFF37474F
const val BLUE_GREY_900 = 0xFF263238
const val RED = RED_500
const val PINK = PINK_500
const val PURPLE = PURPLE_500
const val DEEP_PURPLE = DEEP_PURPLE_500
const val INDIGO = INDIGO_500
const val BLUE = BLUE_500
const val LIGHT_BLUE = LIGHT_BLUE_500
const val CYAN = CYAN_500
const val TEAL = TEAL_500
const val GREEN = GREEN_500
const val LIGHT_GREEN = LIGHT_GREEN_500
const val LIME = LIME_500
const val YELLOW = YELLOW_500
const val AMBER = AMBER_500
const val ORANGE = ORANGE_500
const val DEEP_ORANGE = DEEP_ORANGE_500
const val BROWN = BROWN_500
const val GREY = GREY_500
const val BLUE_GREY = BLUE_GREY_500
const val BLACK = BLACK_1000
const val WHITE = WHITE_1000
}
companion object {
internal val globalAppContext = GlobalAppContext.get()
@JvmStatic
@JvmOverloads
fun getColorByName(colorName: String, suppressException: Boolean = false): Int? {
val name = colorName.replace("-", "_").uppercase()
arrayOf(
Android::class.java,
Css::class.java,
Web::class.java,
Material::class.java,
).forEach { clazz ->
clazz.declaredFields.forEach { field ->
if (removeUnderscores(name) == removeUnderscores(field.name)) {
return field.getInt(field.name)
}
}
}
if (!suppressException) {
throw NotFoundException(globalAppContext.getString(R.string.error_unknown_color_name, colorName))
}
return null
}
private fun removeUnderscores(s: String) = s.replace("_", "")
}
}

View File

@@ -0,0 +1,20 @@
package org.autojs.autojs.theme.preference
import android.content.Context
import com.afollestad.materialdialogs.MaterialDialog
interface LongClickablePreferenceLike {
val prefTitle: CharSequence?
val prefContext: Context
val longClickPrompt: CharSequence?
val longClickPromptMore: CharSequence?
fun longClickPromptMoreDialogHandler(d: MaterialDialog?) {}
fun longClickPromptDialogHandler(d: MaterialDialog?) {}
}