diff --git a/.changelog/lang_zh-Hans.json b/.changelog/lang_zh-Hans.json index 8681bd79..67a26671 100644 --- a/.changelog/lang_zh-Hans.json +++ b/.changelog/lang_zh-Hans.json @@ -62,7 +62,7 @@ "打包应用无法正常使用 Paddle OCR 与 Rapid OCR 功能的问题", "版本历史页面部分系统因字体差别导致统计数据显示不完整的问题", "部分设备无法正常初始化 MLKit Google OCR 的问题 (试修) _[`issue #8`](http://issues.autojs6.com/8#issuecomment-3117061768)_", - "ErrorDialogActivity 可能无法正常启动或短时间自动消失的问题 _[`issue #414`](http://issues.autojs6.com/414)_ _[`issue #340`](http://issues.autojs6.com/340#issuecomment-2973485826)_", + "ErrorDialogActivity 可能无法正常启动或短时间自动消失的问题 _[`issue #471`](http://issues.autojs6.com/471)_ _[`issue #414`](http://issues.autojs6.com/414)_ _[`issue #340`](http://issues.autojs6.com/340#issuecomment-2973485826)_", "崩溃报告页面复制详细信息功能失效的问题", "文件管理器删除项目文件夹后 UI 未能自动刷新的问题", "APK 文件类型信息对话框可能无法获取应用名称及 SDK 信息的问题", diff --git a/.readme/common.json b/.readme/common.json index 6f843d18..2bb041fb 100644 --- a/.readme/common.json +++ b/.readme/common.json @@ -1,14 +1,14 @@ { - "android_studio_latest_recommended_version_name": "Android Studio Otter 2 Feature Drop | 2025.2.2", - "var_date_android_studio_latest_recommended_version_name": "2025/12/04", - "android_studio_latest_recommended_file_name_of_exe": "android-studio-2025.2.2.7-windows.exe", - "android_studio_latest_recommended_download_address_of_exe": "https://edgedl.me.gvt1.com/edgedl/android/studio/install/2025.2.2.7/android-studio-2025.2.2.7-windows.exe", + "android_studio_latest_recommended_version_name": "Android Studio Otter 2 Feature Drop | 2025.2.2 Patch 1", + "var_date_android_studio_latest_recommended_version_name": "2025/12/23", + "android_studio_latest_recommended_file_name_of_exe": "android-studio-2025.2.2.8-windows.exe", + "android_studio_latest_recommended_download_address_of_exe": "https://redirector.gvt1.com/edgedl/android/studio/install/2025.2.2.8/android-studio-2025.2.2.8-windows.exe", "android_studio_latest_recommended_file_size_of_exe": "1.34 GiB", - "android_studio_latest_recommended_file_name_of_zip": "android-studio-2025.2.2.7-windows.zip", - "android_studio_latest_recommended_download_address_of_zip": "https://edgedl.me.gvt1.com/edgedl/android/studio/ide-zips/2025.2.2.7/android-studio-2025.2.2.7-windows.zip", + "android_studio_latest_recommended_file_name_of_zip": "android-studio-2025.2.2.8-windows.zip", + "android_studio_latest_recommended_download_address_of_zip": "https://redirector.gvt1.com/edgedl/android/studio/ide-zips/2025.2.2.8/android-studio-2025.2.2.8-windows.zip", "android_studio_latest_recommended_file_size_of_zip": "1.35 GiB", - "android_studio_latest_recommended_file_name_of_tar": "android-studio-2025.2.2.7-linux.tar.gz", - "android_studio_latest_recommended_download_address_of_tar": "https://edgedl.me.gvt1.com/edgedl/android/studio/ide-zips/2025.2.2.7/android-studio-2025.2.2.7-linux.tar.gz", + "android_studio_latest_recommended_file_name_of_tar": "android-studio-2025.2.2.8-linux.tar.gz", + "android_studio_latest_recommended_download_address_of_tar": "https://redirector.gvt1.com/edgedl/android/studio/ide-zips/2025.2.2.8/android-studio-2025.2.2.8-linux.tar.gz", "android_studio_latest_recommended_file_size_of_tar": "1.38 GiB", "var_date_contribution_table_data_updated": "2025/09/06", "latest_rhino_engine_name_with_github_lineno_address": "[v2.0.0-SNAPSHOT](http://rhino.autojs6.com/blob/master/gradle.properties#L3)", diff --git a/app/src/main/java/org/autojs/autojs/AbstractAutoJs.kt b/app/src/main/java/org/autojs/autojs/AbstractAutoJs.kt index a266d4d6..4a8abd6f 100644 --- a/app/src/main/java/org/autojs/autojs/AbstractAutoJs.kt +++ b/app/src/main/java/org/autojs/autojs/AbstractAutoJs.kt @@ -29,7 +29,6 @@ import org.autojs.autojs.runtime.api.Shell import org.autojs.autojs.runtime.api.WrappedShizuku import org.autojs.autojs.script.AutoFileSource import org.autojs.autojs.script.JavaScriptSource -import org.autojs.autojs.theme.ThemeColorManager import org.autojs.autojs.tool.UiHandler import org.autojs.autojs.util.StringUtils import org.autojs.autojs.util.ViewUtils diff --git a/app/src/main/java/org/autojs/autojs/core/record/GlobalActionRecorder.java b/app/src/main/java/org/autojs/autojs/core/record/GlobalActionRecorder.java index 6503b2cc..83ec8863 100644 --- a/app/src/main/java/org/autojs/autojs/core/record/GlobalActionRecorder.java +++ b/app/src/main/java/org/autojs/autojs/core/record/GlobalActionRecorder.java @@ -57,10 +57,9 @@ public class GlobalActionRecorder implements Recorder.OnStateChangedListener { return new TouchRecorder(mContext) { @Override protected InputEventRecorder createInputEventRecorder() { - if (Pref.rootRecordGeneratesBinary()) - return new InputEventToAutoFileRecorder(mContext); - else - return new InputEventToRootAutomatorRecorder(); + return Pref.rootRecordGeneratesBinary() + ? new InputEventToAutoFileRecorder(mContext) + : new InputEventToRootAutomatorRecorder(); } }; } @@ -86,8 +85,9 @@ public class GlobalActionRecorder implements Recorder.OnStateChangedListener { } public int getState() { - if (mTouchRecorder == null) + if (mTouchRecorder == null) { return Recorder.STATE_NOT_START; + } return mTouchRecorder.getState(); } @@ -116,10 +116,11 @@ public class GlobalActionRecorder implements Recorder.OnStateChangedListener { } if (!mDiscard) { String code = getCode(); - if (code != null) + if (code != null) { handleRecordedScript(code); - else + } else { handleRecordedFile(getPath()); + } } for (Recorder.OnStateChangedListener listener : mOnStateChangedListeners) { listener.onStop(); @@ -154,14 +155,13 @@ public class GlobalActionRecorder implements Recorder.OnStateChangedListener { } private void handleRecordedFile(final String path) { - if (isBackgroundThread()) { + if (isMainThread()) { + new ScriptOperations(mContext, null) + .importFile(path) + .subscribe(); + } else { GlobalAppContext.post(() -> handleRecordedFile(path)); - return; } - new ScriptOperations(mContext, null) - .importFile(path) - .subscribe(); - } private void showRecordHandleDialog(final String script) { diff --git a/app/src/main/java/org/autojs/autojs/network/entity/VersionInfo.kt b/app/src/main/java/org/autojs/autojs/network/entity/VersionInfo.kt index 071658ae..c65565c0 100644 --- a/app/src/main/java/org/autojs/autojs/network/entity/VersionInfo.kt +++ b/app/src/main/java/org/autojs/autojs/network/entity/VersionInfo.kt @@ -13,7 +13,7 @@ import kotlin.math.roundToLong */ class VersionInfo : ExtendedVersionInfo { - var versionName: String = "" + var versionName = "" private set var versionCode = 0L @@ -43,7 +43,7 @@ class VersionInfo : ExtendedVersionInfo { Log.d(TAG, "versionName: $versionName") } if (versionCode <= 0 && line.contains(regexVersionCode)) { - versionCode = regexVersionCode.find(line)?.groupValues?.get(1)?.toDouble()?.roundToLong() ?: -1L + versionCode = regexVersionCode.find(line)?.groupValues?.get(1)?.toDoubleOrNull()?.roundToLong() ?: -1L Log.d(TAG, "versionCode: $versionCode") } if (versionName.isNotBlank() && versionCode > 0) { diff --git a/app/src/main/java/org/autojs/autojs/ui/doc/DocumentationActivity.kt b/app/src/main/java/org/autojs/autojs/ui/doc/DocumentationActivity.kt index 5e24d2f2..b67b55ba 100644 --- a/app/src/main/java/org/autojs/autojs/ui/doc/DocumentationActivity.kt +++ b/app/src/main/java/org/autojs/autojs/ui/doc/DocumentationActivity.kt @@ -66,13 +66,13 @@ class DocumentationActivity : BaseActivity() { (function() { let mainElements = document.querySelectorAll('main > *'); if (mainElements.length > 0) { - // Online docs (zh-CN: 在线文档) + // Online docs. (zh-CN: 在线文档.) mainElements.forEach(ele => { let basePaddingBottom = ele.className === 'sidebar-toggle' ? 10 : 0; ele.style.paddingBottom = (basePaddingBottom + ${systemBarInsetsBottom}) / window.devicePixelRatio + 'px'; }); } else { - // Local docs (zh-CN: 本地文档) + // Local docs. (zh-CN: 本地文档.) document.body.style.paddingBottom = '${systemBarInsetsBottom}px'; } })(); diff --git a/app/src/main/java/org/autojs/autojs/ui/floating/CircularMenu.java b/app/src/main/java/org/autojs/autojs/ui/floating/CircularMenu.java index 8e235a67..e15b1354 100644 --- a/app/src/main/java/org/autojs/autojs/ui/floating/CircularMenu.java +++ b/app/src/main/java/org/autojs/autojs/ui/floating/CircularMenu.java @@ -51,7 +51,7 @@ import java.text.MessageFormat; /** * Created by Stardust on Oct 18, 2017. */ -public class CircularMenu implements Recorder.OnStateChangedListener, LayoutInspector.CaptureAvailableListener { +public class CircularMenu implements LayoutInspector.CaptureAvailableListener { public record StateChangeEvent(int currentState, int previousState) { /* Empty record body. */ @@ -67,6 +67,7 @@ public class CircularMenu implements Recorder.OnStateChangedListener, LayoutInsp private RoundedImageView mActionViewIcon; private Context mContext; private final GlobalActionRecorder mRecorder; + private final Recorder.OnStateChangedListener mRecorderStateListener; private CircularActionMenuBinding binding; private MaterialDialog mSettingsDialog; private MaterialDialog mLayoutInspectDialog; @@ -90,7 +91,28 @@ public class CircularMenu implements Recorder.OnStateChangedListener, LayoutInsp initFloaty(); setupWindowListeners(); mRecorder = GlobalActionRecorder.getSingleton(context); - mRecorder.addOnStateChangedListener(this); + mRecorderStateListener = new Recorder.OnStateChangedListener() { + @Override + public void onStart() { + setState(STATE_RECORDING); + } + + @Override + public void onStop() { + setState(STATE_NORMAL); + } + + @Override + public void onPause() { + /* Empty body. */ + } + + @Override + public void onResume() { + /* Empty body. */ + } + }; + mRecorder.addOnStateChangedListener(mRecorderStateListener); AutoJs.getInstance().getLayoutInspector().addCaptureAvailableListener(this); mA11yTool = new AccessibilityTool(mContext); } @@ -373,28 +395,8 @@ public class CircularMenu implements Recorder.OnStateChangedListener, LayoutInsp EventBus.getDefault().post(new StateChangeEvent(STATE_CLOSED, mState)); mState = STATE_CLOSED; } - mRecorder.removeOnStateChangedListener(this); + mRecorder.removeOnStateChangedListener(mRecorderStateListener); AutoJs.getInstance().getLayoutInspector().removeCaptureAvailableListener(this); } - @Override - public void onStart() { - setState(STATE_RECORDING); - } - - @Override - public void onStop() { - setState(STATE_NORMAL); - } - - @Override - public void onPause() { - /* Empty body. */ - } - - @Override - public void onResume() { - /* Empty body. */ - } - } diff --git a/app/src/main/java/org/autojs/autojs/util/SdkVersionUtils.java b/app/src/main/java/org/autojs/autojs/util/SdkVersionUtils.java index f034d58e..0d3164ab 100644 --- a/app/src/main/java/org/autojs/autojs/util/SdkVersionUtils.java +++ b/app/src/main/java/org/autojs/autojs/util/SdkVersionUtils.java @@ -1,51 +1,21 @@ package org.autojs.autojs.util; +import org.autojs.autojs.runtime.api.augment.util.VersionCodesInfoGenerated; + /** * Created by Stardust on Apr 3, 2017. * Modified by SuperMonster003 as of Feb 5, 2022. */ public class SdkVersionUtils { - private static final String[] SDK_VERSIONS = { - /* placeholder */ null, - /* api: 1 */ "1.0", - /* api: 2 */ "1.1", - /* api: 3 */ "1.5", - /* api: 4 */ "1.6", - /* api: 5 */ "2.0", - /* api: 6 */ "2.0.1", - /* api: 7 */ "2.1.x", - /* api: 8 */ "2.2.x", - /* api: 9 */ "2.3", - /* api: 10 */ "2.3.3", - /* api: 11 */ "3.0.x", - /* api: 12 */ "3.1.x", - /* api: 13 */ "3.2", - /* api: 14 */ "4.0", - /* api: 15 */ "4.0.3", - /* api: 16 */ "4.1", - /* api: 17 */ "4.2", - /* api: 18 */ "4.3", - /* api: 19 */ "4.4.2", - /* api: 20 */ "4.4W", - /* api: 21 */ "5.0", - /* api: 22 */ "5.1", - /* api: 23 */ "6.0", - /* api: 24 */ "7.0", - /* api: 25 */ "7.1", - /* api: 26 */ "8.0", - /* api: 27 */ "8.1", - /* api: 28 */ "9", - /* api: 29 */ "10", - /* api: 30 */ "11", - /* api: 31 */ "12", - /* api: 32 */ "12.1", - /* api: 33 */ "13", - /* api: 34 */ "14" - }; - public static String sdkIntToString(int i) { - return i >= 1 && i <= SDK_VERSIONS.length ? SDK_VERSIONS[i] : "Unknown"; + for (int j = 0; j < VersionCodesInfoGenerated.list.size(); j++) { + var versionCodesInfo = VersionCodesInfoGenerated.list.get(j); + if (versionCodesInfo.getApiLevel().equals(String.valueOf(i))) { + return versionCodesInfo.getPlatformVersion(); + } + } + return "Unknown"; } } diff --git a/gradle/data/android-studio-build-version.properties b/gradle/data/android-studio-build-version.properties index 706c9f90..09f14719 100644 --- a/gradle/data/android-studio-build-version.properties +++ b/gradle/data/android-studio-build-version.properties @@ -1,4 +1,4 @@ -#Sun Dec 21 20:52:44 GMT+8 2025 +#Wed Dec 24 13:29:17 GMT+8 2025 253.28294.334.2531.14612490=2025.3.1.1 252.28238.7.2523.14608894=2025.2.3.6 252.28238.7.2523.14575018=2025.2.3.5 @@ -6,6 +6,7 @@ 252.28238.7.2523.14499447=2025.2.3.3 252.27397.103.2523.14473358=2025.2.3.2 252.27397.103.2523.14431943=2025.2.3.1 +252.27397.103.2522.14617522=2025.2.2.8 252.27397.103.2522.14514259=2025.2.2.7 252.27397.103.2522.14468004=2025.2.2.6 252.27397.103.2522.14425743=2025.2.2.5 diff --git a/modules/apk-parser/src/main/java/net/dongliu/apk/parser/struct/resource/Type.java b/modules/apk-parser/src/main/java/net/dongliu/apk/parser/struct/resource/Type.java index 678c2f40..f38707b2 100644 --- a/modules/apk-parser/src/main/java/net/dongliu/apk/parser/struct/resource/Type.java +++ b/modules/apk-parser/src/main/java/net/dongliu/apk/parser/struct/resource/Type.java @@ -55,7 +55,7 @@ public class Type { if (lang != null) { // At least keep valid language. // zh-CN: 至少保留合法 language. - tmpLocale = new Locale(lang); + tmpLocale = Locale.forLanguageTag(lang); } else { tmpLocale = Locale.ROOT; }