6.7.0 - Alpha2 - 修复 ErrorDialogActivity 可能无法正常启动的问题 (issue #414, #340); 修复错误报告页面复制详细信息功能失效的问题

This commit is contained in:
SuperMonster003
2025-06-28 19:53:56 +08:00
parent 65ebc8311f
commit 23f84d935d
21 changed files with 279 additions and 151 deletions

View File

@@ -1,7 +1,7 @@
{ {
"$data": { "$data": {
"v6.7.0": { "v6.7.0": {
"released_date": "2025/06/23", "released_date": "2025/06/28",
"feature": [ "feature": [
"zip 模块, 用于文件压缩与解压缩操作 (Ref to [Auto.js Pro](https://g.pro.autojs.org/)) (参阅 项目文档 > [Zip](https://docs.autojs6.com/#/zip))", "zip 模块, 用于文件压缩与解压缩操作 (Ref to [Auto.js Pro](https://g.pro.autojs.org/)) (参阅 项目文档 > [Zip](https://docs.autojs6.com/#/zip))",
"mediainfo 模块, 用于查看媒体文件的详细信息 (参阅 项目文档 > [媒体信息](https://docs.autojs6.com/#/mediainfo))", "mediainfo 模块, 用于查看媒体文件的详细信息 (参阅 项目文档 > [媒体信息](https://docs.autojs6.com/#/mediainfo))",
@@ -13,12 +13,15 @@
"images 部分相关方法出现异常时 oneShot 标记功能失效的问题 _[`issue #372`](http://issues.autojs6.com/372)_", "images 部分相关方法出现异常时 oneShot 标记功能失效的问题 _[`issue #372`](http://issues.autojs6.com/372)_",
"Android 10 UiObject#child 方法可能出现 ArrayIndexOutOfBoundsException 异常的问题 _[`issue #416`](http://issues.autojs6.com/416)_", "Android 10 UiObject#child 方法可能出现 ArrayIndexOutOfBoundsException 异常的问题 _[`issue #416`](http://issues.autojs6.com/416)_",
"打包应用无法正常使用 Paddle OCR 与 Rapid OCR 功能的问题", "打包应用无法正常使用 Paddle OCR 与 Rapid OCR 功能的问题",
"版本历史页面部分系统因字体差别导致统计数据显示不完整的问题" "版本历史页面部分系统因字体差别导致统计数据显示不完整的问题",
"ErrorDialogActivity 可能无法正常启动的问题 _[`issue #414`](http://issues.autojs6.com/414)_ _[`issue #340`](http://issues.autojs6.com/340#issuecomment-2973485826)_",
"错误报告页面复制详细信息功能失效的问题"
], ],
"improvement": [ "improvement": [
"http 模块相关方法支持不安全选项参数 (isInsecure/insecure), 用于忽略证书相关异常 _[`issue #417`](http://issues.autojs6.com/417)_", "http 模块相关方法支持不安全选项参数 (isInsecure/insecure), 用于忽略证书相关异常 _[`issue #417`](http://issues.autojs6.com/417)_",
"android.graphics.Paint#setColor 支持正常解析 ColorInt/ColorHex/ColorName 等颜色参数", "android.graphics.Paint#setColor 支持正常解析 ColorInt/ColorHex/ColorName 等颜色参数",
"内置模块相关方法实参类型的异常消息增加类型摘要信息" "内置模块相关方法实参类型的异常消息增加类型摘要信息",
"错误报告页面支持双指缩放调整字体大小并添加常用功能按钮"
], ],
"dependency": [ "dependency": [
"附加 Androidx Core (KTX) 版本 1.16.0", "附加 Androidx Core (KTX) 版本 1.16.0",

View File

@@ -3,6 +3,7 @@ package org.autojs.autojs.runtime.api.augment.ocr
import org.autojs.autojs.annotation.RhinoRuntimeFunctionInterface import org.autojs.autojs.annotation.RhinoRuntimeFunctionInterface
import org.autojs.autojs.core.image.ImageWrapper import org.autojs.autojs.core.image.ImageWrapper
import org.autojs.autojs.extension.AnyExtensions.isJsNullish import org.autojs.autojs.extension.AnyExtensions.isJsNullish
import org.autojs.autojs.extension.AnyExtensions.isJsString
import org.autojs.autojs.extension.AnyExtensions.jsBrief import org.autojs.autojs.extension.AnyExtensions.jsBrief
import org.autojs.autojs.extension.AnyExtensions.jsSpecies import org.autojs.autojs.extension.AnyExtensions.jsSpecies
import org.autojs.autojs.extension.ArrayExtensions.toNativeArray import org.autojs.autojs.extension.ArrayExtensions.toNativeArray
@@ -14,6 +15,7 @@ import org.autojs.autojs.runtime.api.augment.Invokable
import org.autojs.autojs.runtime.api.augment.images.Images import org.autojs.autojs.runtime.api.augment.images.Images
import org.autojs.autojs.runtime.exception.WrappedIllegalArgumentException import org.autojs.autojs.runtime.exception.WrappedIllegalArgumentException
import org.autojs.autojs.runtime.exception.ShouldNeverHappenException import org.autojs.autojs.runtime.exception.ShouldNeverHappenException
import org.autojs.autojs.util.RhinoUtils
import org.autojs.autojs.util.RhinoUtils.UNDEFINED import org.autojs.autojs.util.RhinoUtils.UNDEFINED
import org.autojs.autojs.util.RhinoUtils.newNativeArray import org.autojs.autojs.util.RhinoUtils.newNativeArray
import org.autojs.autojs.util.RhinoUtils.newNativeObject import org.autojs.autojs.util.RhinoUtils.newNativeObject
@@ -58,13 +60,12 @@ class Ocr(private val scriptRuntime: ScriptRuntime) : Augmentable(scriptRuntime)
scriptRuntime.augmentedOcrMLKit -> OcrMode.MLKIT scriptRuntime.augmentedOcrMLKit -> OcrMode.MLKIT
scriptRuntime.augmentedOcrPaddle -> OcrMode.PADDLE scriptRuntime.augmentedOcrPaddle -> OcrMode.PADDLE
scriptRuntime.augmentedOcrRapid -> OcrMode.RAPID scriptRuntime.augmentedOcrRapid -> OcrMode.RAPID
is String -> when (mode.lowercase()) { else -> when (RhinoUtils.coerceStringLowercase(mode, "")) {
OcrMode.MLKIT.value -> OcrMode.MLKIT OcrMode.MLKIT.value -> OcrMode.MLKIT
OcrMode.PADDLE.value -> OcrMode.PADDLE OcrMode.PADDLE.value -> OcrMode.PADDLE
OcrMode.RAPID.value -> OcrMode.RAPID OcrMode.RAPID.value -> OcrMode.RAPID
else -> null else -> null
} }
else -> null
} ?: OcrMode.MLKIT.also { throw WrappedIllegalArgumentException("Unknown mode ${mode.jsSpecies()} for ocr.tap") } } ?: OcrMode.MLKIT.also { throw WrappedIllegalArgumentException("Unknown mode ${mode.jsSpecies()} for ocr.tap") }
return@ensureArgumentsOnlyOne UNDEFINED return@ensureArgumentsOnlyOne UNDEFINED
} }
@@ -75,7 +76,7 @@ class Ocr(private val scriptRuntime: ScriptRuntime) : Augmentable(scriptRuntime)
val (arg0, arg1, arg2) = argList val (arg0, arg1, arg2) = argList
when { when {
arg0 is String -> { arg0.isJsString() -> {
// @Signature // @Signature
// recognizeText(imgPath: string, options?: DetectOptionsMLKit | DetectOptionsPaddle): string[]; // recognizeText(imgPath: string, options?: DetectOptionsMLKit | DetectOptionsPaddle): string[];
@@ -153,7 +154,7 @@ class Ocr(private val scriptRuntime: ScriptRuntime) : Augmentable(scriptRuntime)
val (arg0, arg1, arg2) = argList val (arg0, arg1, arg2) = argList
when { when {
arg0 is String -> { arg0.isJsString() -> {
// @Signature // @Signature
// detect(imgPath: string, options?: DetectOptionsMLKit | DetectOptionsPaddle): org.autojs.autojs.runtime.api.OcrResult[]; // detect(imgPath: string, options?: DetectOptionsMLKit | DetectOptionsPaddle): org.autojs.autojs.runtime.api.OcrResult[];

View File

@@ -1,12 +1,15 @@
package org.autojs.autojs.runtime.api.augment.util package org.autojs.autojs.runtime.api.augment.util
import android.os.Build
import org.autojs.autojs.runtime.exception.WrappedIllegalArgumentException
import org.autojs.autojs.util.RhinoUtils.newNativeObject import org.autojs.autojs.util.RhinoUtils.newNativeObject
object VersionCodesInfo { object VersionCodesInfo {
// @UpTo Jan 2, 2025. // @Updated by SuperMonster003 on Jun 26, 2025.
// @Reference https://en.wikipedia.org/wiki/Android_version_history
private val raw = mutableMapOf( private val raw = mutableMapOf(
"BAKLAVA" to listOf("Android 16", "Baklava", "16", "36", "Q2, 2025"), "BAKLAVA" to listOf("Android 16", "Baklava", "16", "36", "Jun 10, 2025"),
"VANILLA_ICE_CREAM" to listOf("Android 15", "Vanilla Ice Cream", "15", "35", "September 3, 2024"), "VANILLA_ICE_CREAM" to listOf("Android 15", "Vanilla Ice Cream", "15", "35", "September 3, 2024"),
"UPSIDE_DOWN_CAKE" to listOf("Android 14", "Upside Down Cake", "14", "34", "October 4, 2023"), "UPSIDE_DOWN_CAKE" to listOf("Android 14", "Upside Down Cake", "14", "34", "October 4, 2023"),
"TIRAMISU" to listOf("Android 13", "Tiramisu", "13", "33", "August 15, 2022"), "TIRAMISU" to listOf("Android 13", "Tiramisu", "13", "33", "August 15, 2022"),
@@ -57,4 +60,19 @@ object VersionCodesInfo {
} }
} }
@JvmStatic
@JvmOverloads
fun briefOfVersionInt(versionInt: Int, isCompat: Boolean = false): String {
return list.find { runCatching { it.apiLevel.toInt() }.getOrNull() == versionInt }?.let { info ->
var result = "${if (isCompat) "API Lv." else "Android API Level "}${info.apiLevel}"
info.releaseName.takeIf { it.isNotBlank() }?.let { result += " ($it)" }
info.internalCodename.takeIf { it.isNotBlank() }?.let { result += " [$it]" }
result
} ?: throw WrappedIllegalArgumentException("$versionInt is an invalid or unknown version int")
}
@JvmStatic
@JvmOverloads
fun briefOfCurrentVersionInt(isCompat: Boolean = false) = briefOfVersionInt(Build.VERSION.SDK_INT, isCompat)
} }

View File

@@ -2,7 +2,6 @@ package org.autojs.autojs.ui.error;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.view.Window;
import com.afollestad.materialdialogs.MaterialDialog; import com.afollestad.materialdialogs.MaterialDialog;
import org.autojs.autojs.extension.MaterialDialogExtensions; import org.autojs.autojs.extension.MaterialDialogExtensions;
import org.autojs.autojs.ui.BaseActivity; import org.autojs.autojs.ui.BaseActivity;
@@ -21,7 +20,6 @@ public class ErrorDialogActivity extends BaseActivity {
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
// Get extras from intent // Get extras from intent
Intent intent = getIntent(); Intent intent = getIntent();

View File

@@ -1,21 +1,16 @@
package org.autojs.autojs.ui.error package org.autojs.autojs.ui.error
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.content.ClipData
import android.content.ClipboardManager
import android.content.Context
import android.content.Intent import android.content.Intent
import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.util.Log import org.autojs.autojs.runtime.api.augment.util.VersionCodesInfo.briefOfCurrentVersionInt
import com.afollestad.materialdialogs.MaterialDialog
import org.autojs.autojs.app.GlobalAppContext
import org.autojs.autojs.ui.BaseActivity import org.autojs.autojs.ui.BaseActivity
import org.autojs.autojs.ui.main.MainActivity
import org.autojs.autojs.util.ClipboardUtils
import org.autojs.autojs.util.ViewUtils import org.autojs.autojs.util.ViewUtils
import org.autojs.autojs6.BuildConfig import org.autojs.autojs6.BuildConfig
import org.autojs.autojs6.R import org.autojs.autojs6.R
import org.autojs.autojs6.databinding.ActivityErrorReportBinding import org.autojs.autojs6.databinding.ActivityErrorReportBinding
import java.util.*
/** /**
* Created by Stardust on Feb 2, 2017. * Created by Stardust on Feb 2, 2017.
@@ -23,88 +18,62 @@ import java.util.*
*/ */
class ErrorReportActivity : BaseActivity() { class ErrorReportActivity : BaseActivity() {
private lateinit var errorMessage: String
@SuppressLint("ClickableViewAccessibility")
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
try { super.onCreate(savedInstanceState)
super.onCreate(savedInstanceState)
ActivityErrorReportBinding.inflate(layoutInflater).also { binding -> val msg = buildString {
setContentView(binding.root) appendLine("${getString(R.string.app_name)} ${BuildConfig.VERSION_NAME} (${BuildConfig.VERSION_CODE})")
binding.toolbar.apply { appendLine(briefOfCurrentVersionInt(true))
title = getString(R.string.text_error_report) intent.getStringExtra("message")?.let { appendLine().appendLine(it.trimEnd()) }
setSupportActionBar(this) intent.getStringExtra("error")?.let { appendLine().appendLine(it.trimEnd()) }
} }.also { errorMessage = it }
supportActionBar?.setHomeButtonEnabled(false)
val binding = ActivityErrorReportBinding.inflate(layoutInflater).also {
setContentView(it.root)
it.toolbar.apply {
title = getString(R.string.text_app_crashed)
setSupportActionBar(this)
} }
} catch (t: Throwable) { supportActionBar?.setHomeButtonEnabled(false)
t.message?.let { msg ->
copyToClip(msg)
ViewUtils.showToast(this, msg)
}
Log.e(TAG, t.message ?: "", t)
exitAfter(3000)
}
}
override fun onResume() {
super.onResume()
val message = intent.getStringExtra("message")
val errorDetail = intent.getStringExtra("error")
val errorMessage = buildString {
appendLine("Version: ${BuildConfig.VERSION_CODE}")
appendLine("Android: ${Build.VERSION.SDK_INT}")
message?.let { appendLine().appendLine(it) }
errorDetail?.let { appendLine().appendLine(it) }
} }
MaterialDialog.Builder(this) val textView = binding.errorMessage.apply { text = msg }
.title(R.string.text_app_crashed)
.content(R.string.crash_feedback) val textSizeScaleDetector = ViewUtils.TextSizeScaleDetector(this, textView)
.neutralText(R.string.text_copy_debug_info)
.neutralColorRes(R.color.dialog_button_hint) binding.errorMessageContainer.setOnTouchListener { _, event ->
.onNegative { _, _ -> when (event.pointerCount) {
copyToClip(errorMessage) 2 -> false.also { textSizeScaleDetector.onTouchEvent(event) }
exitAfter(1500) else -> super.onTouchEvent(event)
} }
.positiveText(R.string.text_exit) }
.positiveColorRes(R.color.dialog_button_failure)
.onPositive { _, _ -> exit() }
.cancelable(false)
.show()
}
private fun exitAfter(delay: Int) { binding.copy.setOnClickListener { copy() }
Timer().schedule(object : TimerTask() { binding.restart.setOnClickListener { restart() }
override fun run() = exit() binding.exit.setOnClickListener { exit() }
}, delay.toLong())
}
private fun copyToClip(text: String) { savedInstanceState ?: copy()
val clipboardManager = getSystemService(CLIPBOARD_SERVICE) as ClipboardManager
clipboardManager.setPrimaryClip(ClipData.newPlainText("Debug", text))
ViewUtils.showToast(this, R.string.text_already_copied_to_clip)
} }
@Deprecated("Deprecated in Java") @Deprecated("Deprecated in Java")
@SuppressLint("MissingSuperCall") @SuppressLint("MissingSuperCall")
override fun onBackPressed() = exit() override fun onBackPressed() = exit()
private fun copy() = ClipboardUtils.setClip(this, errorMessage)
private fun exit() = finishAffinity() private fun exit() = finishAffinity()
companion object { private fun restart() {
val intent = packageManager.getLaunchIntentForPackage(packageName)?.apply {
private val TAG: String = ErrorReportActivity::class.java.simpleName addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
} ?: Intent(this, MainActivity::class.java).apply {
@JvmStatic addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK)
@JvmOverloads
fun test(context: Context = GlobalAppContext.get()) {
Intent(context, ErrorReportActivity::class.java)
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
.putExtra("message", "Test message\nSecond line")
.putExtra("error", "Test error\nSecond line")
.let { context.startActivity(it) }
} }
startActivity(intent)
exit()
} }
} }

View File

@@ -6,9 +6,7 @@ import android.content.ClipboardManager
import android.content.res.ColorStateList import android.content.res.ColorStateList
import android.os.Bundle import android.os.Bundle
import android.text.SpannableStringBuilder import android.text.SpannableStringBuilder
import android.util.TypedValue
import android.view.KeyEvent import android.view.KeyEvent
import android.view.ScaleGestureDetector
import android.view.View import android.view.View
import android.widget.TextView import android.widget.TextView
import com.google.android.material.floatingactionbutton.FloatingActionButton import com.google.android.material.floatingactionbutton.FloatingActionButton
@@ -24,11 +22,9 @@ import kotlinx.coroutines.launch
import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock import kotlinx.coroutines.sync.withLock
import org.autojs.autojs.ui.BaseActivity import org.autojs.autojs.ui.BaseActivity
import org.autojs.autojs.util.DisplayUtils
import org.autojs.autojs.util.ViewUtils import org.autojs.autojs.util.ViewUtils
import org.autojs.autojs6.R import org.autojs.autojs6.R
import org.autojs.autojs6.databinding.ActivityDisplayScrollableContentBinding import org.autojs.autojs6.databinding.ActivityDisplayScrollableContentBinding
import kotlin.math.floor
abstract class BaseDisplayContentActivity : BaseActivity() { abstract class BaseDisplayContentActivity : BaseActivity() {
@@ -49,12 +45,6 @@ abstract class BaseDisplayContentActivity : BaseActivity() {
private var mIsContentLoaded = false private var mIsContentLoaded = false
private val mTextUpdateMutex = Mutex() private val mTextUpdateMutex = Mutex()
protected val minTextSize = 4.0f
protected val maxTextSize = 72.0f
private var mLastScaleFactor = 1.0f
private var mLastTextSize = 0.0f
@SuppressLint("ClickableViewAccessibility") @SuppressLint("ClickableViewAccessibility")
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
@@ -73,7 +63,7 @@ abstract class BaseDisplayContentActivity : BaseActivity() {
} }
} }
val scaleGestureDetector = ScaleGestureDetector(this, ScaleListener(internalTextView)) val scaleGestureDetector = ViewUtils.TextSizeScaleDetector(this, internalTextView)
val innerScrollView = binding.innerScrollView.also { val innerScrollView = binding.innerScrollView.also {
ViewUtils.excludePaddingClippableViewFromBottomNavigationBar(it) ViewUtils.excludePaddingClippableViewFromBottomNavigationBar(it)
@@ -264,35 +254,4 @@ abstract class BaseDisplayContentActivity : BaseActivity() {
ViewUtils.showSnack(internalTextView, R.string.text_already_copied_to_clip, true) ViewUtils.showSnack(internalTextView, R.string.text_already_copied_to_clip, true)
} }
// Scaling & Text Size Handling
protected inner class ScaleListener(private val textView: TextView) : ScaleGestureDetector.SimpleOnScaleGestureListener() {
override fun onScale(detector: ScaleGestureDetector): Boolean {
val currentFactor = (floor((detector.scaleFactor * 10).toDouble()) / 10).toFloat()
if (mLastTextSize <= 0) {
mLastTextSize = getTextSize()
}
if (currentFactor > 0 && mLastScaleFactor != currentFactor) {
val currentTextSize: Float = mLastTextSize + (if (currentFactor > mLastScaleFactor) 1 else -1)
mLastTextSize = currentTextSize.coerceIn(minTextSize, maxTextSize)
setTextSize(mLastTextSize)
mLastScaleFactor = currentFactor
}
return super.onScale(detector)
}
override fun onScaleEnd(detector: ScaleGestureDetector) {
mLastScaleFactor = 1.0f
super.onScaleEnd(detector)
}
fun setTextSize(size: Float) {
mLastTextSize = size
textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, size)
}
fun getTextSize(): Float = DisplayUtils.pxToSp(textView.textSize)
}
} }

View File

@@ -21,6 +21,7 @@ import android.util.DisplayMetrics
import android.util.TypedValue import android.util.TypedValue
import android.view.Gravity import android.view.Gravity
import android.view.Menu import android.view.Menu
import android.view.ScaleGestureDetector
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.view.ViewGroup.LayoutParams.MATCH_PARENT import android.view.ViewGroup.LayoutParams.MATCH_PARENT
@@ -32,6 +33,7 @@ import android.view.inputmethod.InputMethodManager
import android.widget.EditText import android.widget.EditText
import android.widget.FrameLayout import android.widget.FrameLayout
import android.widget.ImageView import android.widget.ImageView
import android.widget.TextView
import android.widget.Toast import android.widget.Toast
import androidx.annotation.ColorInt import androidx.annotation.ColorInt
import androidx.annotation.IdRes import androidx.annotation.IdRes
@@ -52,6 +54,7 @@ import org.autojs.autojs.core.pref.Pref
import org.autojs.autojs.theme.ThemeColorManager import org.autojs.autojs.theme.ThemeColorManager
import org.autojs.autojs.util.StringUtils.key import org.autojs.autojs.util.StringUtils.key
import org.autojs.autojs6.R import org.autojs.autojs6.R
import kotlin.math.floor
import kotlin.math.roundToInt import kotlin.math.roundToInt
/** /**
@@ -700,4 +703,64 @@ object ViewUtils {
} }
@SuppressLint("ClickableViewAccessibility")
class TextSizeScaleDetector(context: Context, textView: TextView) :ScaleGestureDetector(context, TextSizeScaleListener(textView)) {
init {
textView.apply {
setTextIsSelectable(true)
isLongClickable = true
isFocusableInTouchMode = true
setOnTouchListener { v, event ->
this@TextSizeScaleDetector.onTouchEvent(event)
when {
event.pointerCount > 1 -> {
v.parent?.requestDisallowInterceptTouchEvent(true)
true
}
else -> false
}
}
}
}
}
// Scaling & Text Size Handling
private class TextSizeScaleListener(private val textView: TextView) : ScaleGestureDetector.SimpleOnScaleGestureListener() {
private val mMinTextSize = 4.0f
private val mMaxTextSize = 72.0f
private var mLastScaleFactor = 1.0f
private var mLastTextSize = 0.0f
override fun onScale(detector: ScaleGestureDetector): Boolean {
val currentFactor = (floor((detector.scaleFactor * 10).toDouble()) / 10).toFloat()
if (mLastTextSize <= 0) {
mLastTextSize = getTextSize()
}
if (currentFactor > 0 && mLastScaleFactor != currentFactor) {
val currentTextSize: Float = mLastTextSize + (if (currentFactor > mLastScaleFactor) 1 else -1)
mLastTextSize = currentTextSize.coerceIn(mMinTextSize, mMaxTextSize)
setTextSize(mLastTextSize)
mLastScaleFactor = currentFactor
}
return super.onScale(detector)
}
override fun onScaleEnd(detector: ScaleGestureDetector) {
mLastScaleFactor = 1.0f
super.onScaleEnd(detector)
}
fun setTextSize(size: Float) {
mLastTextSize = size
textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, size)
}
fun getTextSize(): Float = DisplayUtils.pxToSp(textView.textSize)
}
} }

View File

@@ -1,15 +1,16 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:orientation="vertical"> android:orientation="vertical">
<com.google.android.material.appbar.AppBarLayout <com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:fitsSystemWindows="true"
app:theme="@style/AppTheme.AppBarOverlay"> app:theme="@style/AppTheme.AppBarOverlay">
<org.autojs.autojs.theme.widget.ThemeColorToolbar <org.autojs.autojs.theme.widget.ThemeColorToolbar
@@ -21,14 +22,130 @@
</com.google.android.material.appbar.AppBarLayout> </com.google.android.material.appbar.AppBarLayout>
<TextView <LinearLayout
android:id="@+id/error"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:padding="16dp" android:orientation="vertical">
android:scrollbars="vertical"
android:textColor="@android:color/secondary_text_light" <ScrollView
android:textSize="16sp" android:id="@+id/error_message_container"
tools:text="@string/text_error" /> android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
<org.autojs.autojs.ui.widget.SelectableTextView
android:id="@+id/error_message"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="16dp"
android:scrollbars="vertical"
android:textColor="@color/day_night_full"
android:textSize="16sp"
tools:text="@string/text_error" />
</ScrollView>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/day_night_alpha_20" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="41dp"
android:layout_gravity="center_horizontal"
android:baselineAligned="false">
<LinearLayout
android:id="@+id/copy"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="?selectableItemBackground"
android:gravity="center"
android:orientation="horizontal">
<ImageView
android:layout_width="16dp"
android:layout_height="16dp"
android:layout_gravity="center"
android:layout_marginEnd="10dp"
android:src="@drawable/ic_content_copy_small_black_48dp"
app:tint="?android:textColorPrimary"
tools:ignore="ContentDescription" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginEnd="4dp"
android:gravity="center"
android:text="@string/text_copy"
android:textColor="?android:textColorPrimary"
android:textSize="15sp" />
</LinearLayout>
<LinearLayout
android:id="@+id/restart"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="?selectableItemBackground"
android:gravity="center"
android:orientation="horizontal">
<ImageView
android:layout_width="16dp"
android:layout_height="16dp"
android:layout_gravity="center"
android:layout_marginEnd="10dp"
android:src="@drawable/ic_refresh_white_24dp"
app:tint="?android:textColorPrimary"
tools:ignore="ContentDescription" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginEnd="4dp"
android:gravity="center"
android:text="@string/text_restart"
android:textColor="?android:textColorPrimary"
android:textSize="15sp" />
</LinearLayout>
<LinearLayout
android:id="@+id/exit"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="?selectableItemBackground"
android:gravity="center"
android:orientation="horizontal">
<ImageView
android:layout_width="16dp"
android:layout_height="16dp"
android:layout_gravity="center"
android:layout_marginEnd="10dp"
android:src="@drawable/ic_ali_exit"
app:tint="?android:textColorPrimary"
tools:ignore="ContentDescription" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginEnd="4dp"
android:textColor="?android:textColorPrimary"
android:gravity="center"
android:text="@string/text_exit"
android:textSize="15sp" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
</LinearLayout> </LinearLayout>

View File

@@ -83,7 +83,7 @@
android:layout_gravity="center_vertical" android:layout_gravity="center_vertical"
android:layout_marginEnd="4dp" android:layout_marginEnd="4dp"
android:gravity="center" android:gravity="center"
android:text="@string/text_restart_app" android:text="@string/text_restart"
android:textColor="?android:textColorPrimary" android:textColor="?android:textColorPrimary"
android:textSize="15sp" /> android:textSize="15sp" />

View File

@@ -910,7 +910,7 @@
<string name="text_reset_succeed">نجحت إعادة تعيين</string> <string name="text_reset_succeed">نجحت إعادة تعيين</string>
<string name="text_reset_to_initial_content">إعادة تعيين في البداية</string> <string name="text_reset_to_initial_content">إعادة تعيين في البداية</string>
<string name="text_reset_to_initial_content_only_for_assets">إعادة التعيين هي فقط للعينات</string> <string name="text_reset_to_initial_content_only_for_assets">إعادة التعيين هي فقط للعينات</string>
<string name="text_restart_app">إعادة بدء</string> <string name="text_restart">إعادة بدء</string>
<string name="text_result">نتيجة</string> <string name="text_result">نتيجة</string>
<string name="text_revoke_autojs6_access_in_shizuku_app">قم بإلغاء الوصول إلى AutoJs6 في تطبيق Shizuku</string> <string name="text_revoke_autojs6_access_in_shizuku_app">قم بإلغاء الوصول إلى AutoJs6 في تطبيق Shizuku</string>
<string name="text_root_mode_title">فحص الجذر مجموعة القوة</string> <string name="text_root_mode_title">فحص الجذر مجموعة القوة</string>

View File

@@ -905,7 +905,7 @@
<string name="text_reset_succeed">Reset succeeded</string> <string name="text_reset_succeed">Reset succeeded</string>
<string name="text_reset_to_initial_content">Reset initially</string> <string name="text_reset_to_initial_content">Reset initially</string>
<string name="text_reset_to_initial_content_only_for_assets">Reset is only for samples</string> <string name="text_reset_to_initial_content_only_for_assets">Reset is only for samples</string>
<string name="text_restart_app">Restart</string> <string name="text_restart">Restart</string>
<string name="text_result">Result</string> <string name="text_result">Result</string>
<string name="text_revoke_autojs6_access_in_shizuku_app">Revoke AutoJs6 access in Shizuku app</string> <string name="text_revoke_autojs6_access_in_shizuku_app">Revoke AutoJs6 access in Shizuku app</string>
<string name="text_root_mode_title">Force set root check</string> <string name="text_root_mode_title">Force set root check</string>

View File

@@ -908,7 +908,7 @@
<string name="text_reset_succeed">Restablecer con éxito</string> <string name="text_reset_succeed">Restablecer con éxito</string>
<string name="text_reset_to_initial_content">Restablecer inicialmente</string> <string name="text_reset_to_initial_content">Restablecer inicialmente</string>
<string name="text_reset_to_initial_content_only_for_assets">El restablecimiento es sólo para las muestras</string> <string name="text_reset_to_initial_content_only_for_assets">El restablecimiento es sólo para las muestras</string>
<string name="text_restart_app">Reiniciar</string> <string name="text_restart">Reiniciar</string>
<string name="text_result">Resultado</string> <string name="text_result">Resultado</string>
<string name="text_revoke_autojs6_access_in_shizuku_app">Revocar privilegios de AutoJs6 en una aplicación Shizuku</string> <string name="text_revoke_autojs6_access_in_shizuku_app">Revocar privilegios de AutoJs6 en una aplicación Shizuku</string>
<string name="text_root_mode_title">Forzar la comprobación de root</string> <string name="text_root_mode_title">Forzar la comprobación de root</string>

View File

@@ -908,7 +908,7 @@
<string name="text_reset_succeed">Réinitialisation réussie</string> <string name="text_reset_succeed">Réinitialisation réussie</string>
<string name="text_reset_to_initial_content">Réinitialisation initiale</string> <string name="text_reset_to_initial_content">Réinitialisation initiale</string>
<string name="text_reset_to_initial_content_only_for_assets">Reset n\'est que pour les échantillons</string> <string name="text_reset_to_initial_content_only_for_assets">Reset n\'est que pour les échantillons</string>
<string name="text_restart_app">Redémarrer</string> <string name="text_restart">Redémarrer</string>
<string name="text_result">Résultat</string> <string name="text_result">Résultat</string>
<string name="text_revoke_autojs6_access_in_shizuku_app">Révoquer les privilèges AutoJs6 dans une application Shizuku</string> <string name="text_revoke_autojs6_access_in_shizuku_app">Révoquer les privilèges AutoJs6 dans une application Shizuku</string>
<string name="text_root_mode_title">Force set root check</string> <string name="text_root_mode_title">Force set root check</string>

View File

@@ -909,7 +909,7 @@
<string name="text_reset_succeed">リセット成功</string> <string name="text_reset_succeed">リセット成功</string>
<string name="text_reset_to_initial_content">初期リセット</string> <string name="text_reset_to_initial_content">初期リセット</string>
<string name="text_reset_to_initial_content_only_for_assets">リセットはサンプルのみ</string> <string name="text_reset_to_initial_content_only_for_assets">リセットはサンプルのみ</string>
<string name="text_restart_app">再起動</string> <string name="text_restart">再起動</string>
<string name="text_result">結果</string> <string name="text_result">結果</string>
<string name="text_revoke_autojs6_access_in_shizuku_app">Shizuku アプリケーションで AutoJs6 権限を取り消す</string> <string name="text_revoke_autojs6_access_in_shizuku_app">Shizuku アプリケーションで AutoJs6 権限を取り消す</string>
<string name="text_root_mode_title">強制的に root にするチェック</string> <string name="text_root_mode_title">強制的に root にするチェック</string>

View File

@@ -910,7 +910,7 @@
<string name="text_reset_succeed">재설정이 성공했습니다</string> <string name="text_reset_succeed">재설정이 성공했습니다</string>
<string name="text_reset_to_initial_content">처음에 재설정하십시오</string> <string name="text_reset_to_initial_content">처음에 재설정하십시오</string>
<string name="text_reset_to_initial_content_only_for_assets">재설정은 샘플에만 해당됩니다</string> <string name="text_reset_to_initial_content_only_for_assets">재설정은 샘플에만 해당됩니다</string>
<string name="text_restart_app">재시작</string> <string name="text_restart">재시작</string>
<string name="text_result">결과</string> <string name="text_result">결과</string>
<string name="text_revoke_autojs6_access_in_shizuku_app">Shizuku 애플리케이션에서 AutoJs6 권한 취소하기</string> <string name="text_revoke_autojs6_access_in_shizuku_app">Shizuku 애플리케이션에서 AutoJs6 권한 취소하기</string>
<string name="text_root_mode_title">강제 설정 루트 검사</string> <string name="text_root_mode_title">강제 설정 루트 검사</string>

View File

@@ -908,7 +908,7 @@
<string name="text_reset_succeed">Сброс выполнен успешно</string> <string name="text_reset_succeed">Сброс выполнен успешно</string>
<string name="text_reset_to_initial_content">Сброс первоначально</string> <string name="text_reset_to_initial_content">Сброс первоначально</string>
<string name="text_reset_to_initial_content_only_for_assets">Сброс выполняется только для образцов</string> <string name="text_reset_to_initial_content_only_for_assets">Сброс выполняется только для образцов</string>
<string name="text_restart_app">Перезапустить</string> <string name="text_restart">Перезапустить</string>
<string name="text_result">Результат</string> <string name="text_result">Результат</string>
<string name="text_revoke_autojs6_access_in_shizuku_app">Отмена привилегий AutoJs6 в приложении Shizuku</string> <string name="text_revoke_autojs6_access_in_shizuku_app">Отмена привилегий AutoJs6 в приложении Shizuku</string>
<string name="text_root_mode_title">Проверка принудительной установки root</string> <string name="text_root_mode_title">Проверка принудительной установки root</string>

View File

@@ -906,7 +906,7 @@
<string name="text_reset_succeed">重置成功</string> <string name="text_reset_succeed">重置成功</string>
<string name="text_reset_to_initial_content">重置為初始內容</string> <string name="text_reset_to_initial_content">重置為初始內容</string>
<string name="text_reset_to_initial_content_only_for_assets">只能重置示例代碼文件</string> <string name="text_reset_to_initial_content_only_for_assets">只能重置示例代碼文件</string>
<string name="text_restart_app">重啓</string> <string name="text_restart">重啓</string>
<string name="text_result">結果</string> <string name="text_result">結果</string>
<string name="text_revoke_autojs6_access_in_shizuku_app">在 Shizuku 應用中撤銷 AutoJs6 權限</string> <string name="text_revoke_autojs6_access_in_shizuku_app">在 Shizuku 應用中撤銷 AutoJs6 權限</string>
<string name="text_root_mode_title">強制 Root 權限檢查</string> <string name="text_root_mode_title">強制 Root 權限檢查</string>

View File

@@ -906,7 +906,7 @@
<string name="text_reset_succeed">重置成功</string> <string name="text_reset_succeed">重置成功</string>
<string name="text_reset_to_initial_content">重置為初始內容</string> <string name="text_reset_to_initial_content">重置為初始內容</string>
<string name="text_reset_to_initial_content_only_for_assets">只能重置示例程式碼檔案</string> <string name="text_reset_to_initial_content_only_for_assets">只能重置示例程式碼檔案</string>
<string name="text_restart_app">重啟</string> <string name="text_restart">重啟</string>
<string name="text_result">結果</string> <string name="text_result">結果</string>
<string name="text_revoke_autojs6_access_in_shizuku_app">在 Shizuku 應用中撤銷 AutoJs6 許可權</string> <string name="text_revoke_autojs6_access_in_shizuku_app">在 Shizuku 應用中撤銷 AutoJs6 許可權</string>
<string name="text_root_mode_title">強制 Root 許可權檢查</string> <string name="text_root_mode_title">強制 Root 許可權檢查</string>

View File

@@ -906,7 +906,7 @@
<string name="text_reset_succeed">重置成功</string> <string name="text_reset_succeed">重置成功</string>
<string name="text_reset_to_initial_content">重置为初始内容</string> <string name="text_reset_to_initial_content">重置为初始内容</string>
<string name="text_reset_to_initial_content_only_for_assets">只能重置示例代码文件</string> <string name="text_reset_to_initial_content_only_for_assets">只能重置示例代码文件</string>
<string name="text_restart_app">重启</string> <string name="text_restart">重启</string>
<string name="text_result">结果</string> <string name="text_result">结果</string>
<string name="text_revoke_autojs6_access_in_shizuku_app">在 Shizuku 应用中撤销 AutoJs6 权限</string> <string name="text_revoke_autojs6_access_in_shizuku_app">在 Shizuku 应用中撤销 AutoJs6 权限</string>
<string name="text_root_mode_title">强制 Root 权限检查</string> <string name="text_root_mode_title">强制 Root 权限检查</string>

View File

@@ -1136,7 +1136,7 @@
<string name="text_reset_succeed">Reset succeeded</string> <string name="text_reset_succeed">Reset succeeded</string>
<string name="text_reset_to_initial_content">Reset initially</string> <string name="text_reset_to_initial_content">Reset initially</string>
<string name="text_reset_to_initial_content_only_for_assets">Reset is only for samples</string> <string name="text_reset_to_initial_content_only_for_assets">Reset is only for samples</string>
<string name="text_restart_app">Restart</string> <string name="text_restart">Restart</string>
<string name="text_result">Result</string> <string name="text_result">Result</string>
<string name="text_revoke_autojs6_access_in_shizuku_app">Revoke AutoJs6 access in Shizuku app</string> <string name="text_revoke_autojs6_access_in_shizuku_app">Revoke AutoJs6 access in Shizuku app</string>
<string name="text_root_mode_title">Force set root check</string> <string name="text_root_mode_title">Force set root check</string>

View File

@@ -1,5 +1,5 @@
#Mon Jun 23 16:34:06 CST 2025 #Sat Jun 28 19:48:58 CST 2025
BUILD_TIME=1750667646268 BUILD_TIME=1751111338507
COMPILE_SDK_VERSION=35 COMPILE_SDK_VERSION=35
IMAGE_QUANT_CMAKE_VERSION=3.22.1 IMAGE_QUANT_CMAKE_VERSION=3.22.1
IMAGE_QUANT_NDK_VERSION=26.1.10909125 IMAGE_QUANT_NDK_VERSION=26.1.10909125
@@ -19,6 +19,6 @@ RAPID_OCR_OPENCV_MOBILE_LABEL_VERSION=13
RAPID_OCR_OPENCV_MOBILE_VERSION=4.5.3 RAPID_OCR_OPENCV_MOBILE_VERSION=4.5.3
TARGET_SDK_VERSION=35 TARGET_SDK_VERSION=35
TARGET_SDK_VERSION_INRT=29 TARGET_SDK_VERSION_INRT=29
VERSION_BUILD=3302 VERSION_BUILD=3308
VERSION_NAME=6.7.0 Alpha2 VERSION_NAME=6.7.0 Alpha2
VSCODE_EXT_REQUIRED_VERSION=1.0.8 VSCODE_EXT_REQUIRED_VERSION=1.0.8