From 6f97d73940e712cc82a011404d0b88f12f208680 Mon Sep 17 00:00:00 2001 From: SuperMonster003 Date: Sun, 11 Jan 2026 23:08:43 +0800 Subject: [PATCH] 6.7.0 - Alpha14 - Fine tuning --- .changelog/lang_ar.json | 4 +- .changelog/lang_en.json | 4 +- .changelog/lang_es.json | 4 +- .changelog/lang_fr.json | 4 +- .changelog/lang_ja.json | 4 +- .changelog/lang_ko.json | 4 +- .changelog/lang_ru.json | 4 +- .changelog/lang_zh-Hans.json | 8 +- .changelog/lang_zh-Hant-HK.json | 4 +- .changelog/lang_zh-Hant-TW.json | 4 +- .../autojs/engine/ScriptEngineManager.java | 10 ++- .../ui/main/task/TaskListRecyclerView.java | 56 +++++++++--- .../org/autojs/autojs/util/UpdateUtils.kt | 86 +++++++++---------- gradle/data/agp-releases.list | 6 +- .../android-studio-build-version.properties | 5 +- 15 files changed, 121 insertions(+), 86 deletions(-) diff --git a/.changelog/lang_ar.json b/.changelog/lang_ar.json index 5da250e1..f61f83f5 100644 --- a/.changelog/lang_ar.json +++ b/.changelog/lang_ar.json @@ -34,7 +34,8 @@ "الدالة images.downsample لخفض الدقة وإنشاء ImageWrapper جديد", "الدالة ui.keepScreenOn لإبقاء الشاشة مضاءة عند تركيز صفحة الواجهة", "خاصية ui.root (getter) للحصول على عقدة \"حاوية المحتوى الجذرية للنافذة\" في تخطيط الواجهة", - "عنصر webview يدعم تخطيطات صفحات الويب عبر JsBridge (انظر [Auto.js Pro](https://g.pro.autojs.org/)) [مثال: Layout > Interactive HTML / Vue2 + Vant (SFC)] _[`issue #281`](http://issues.autojs6.com/281)_" + "عنصر webview يدعم تخطيطات صفحات الويب عبر JsBridge (انظر [Auto.js Pro](https://g.pro.autojs.org/)) [مثال: Layout > Interactive HTML / Vue2 + Vant (SFC)] _[`issue #281`](http://issues.autojs6.com/281)_", + "مصحح التخطيط يدعم إخفاء العناصر (بواسطة [TonyJiangWJ](https://github.com/TonyJiangWJ)) _[`pr #371`](http://pr.autojs6.com/371)_ _[`issue #355`](http://issues.autojs6.com/355)_" ], "fix": [ "قد يتم حجب بعض محتوى الوثائق عبر الإنترنت في تبويب Docs وصفحة الوثائق بواسطة شريط التنقل", @@ -60,7 +61,6 @@ "قد تفشل عملية بناء Gradle بسبب طول غير صالح لأرشيف مكتبة _[`issue #389`](http://issues.autojs6.com/389)_" ], "improvement": [ - "مصحح التخطيط يدعم إخفاء العناصر (بواسطة [TonyJiangWJ](https://github.com/TonyJiangWJ)) _[`pr #371`](http://pr.autojs6.com/371)_ _[`issue #355`](http://issues.autojs6.com/355)_", "إضافة فواصل متدرّجة في قائمة مصحح التخطيط لتجميع الوظائف", "يدعم project.json خيار permissions لمشاريع السكربتات (بواسطة [wirsnow](https://github.com/wirsnow)) _[`pr #391`](http://pr.autojs6.com/391)_ _[`issue #362`](http://issues.autojs6.com/362)_", "عند حزم ملف واحد تُقرأ أذونات التطبيق المثبت وتُحدد تلقائيًا _[`issue #362`](http://issues.autojs6.com/362)_", diff --git a/.changelog/lang_en.json b/.changelog/lang_en.json index a0a27c47..8e2ce038 100644 --- a/.changelog/lang_en.json +++ b/.changelog/lang_en.json @@ -34,7 +34,8 @@ "images.downsample method for pixel down-sampling and creating a new ImageWrapper", "ui.keepScreenOn method to keep the device screen on while a UI page is focused", "ui.root property (getter) to obtain the \"window content root container\" node of the UI layout", - "webview element now supports JsBridge-based web page layouts (Ref to [Auto.js Pro](https://g.pro.autojs.org/)) [see Sample Code > Layout > Interactive HTML / Vue2 + Vant (SFC)] _[`issue #281`](http://issues.autojs6.com/281)_" + "webview element now supports JsBridge-based web page layouts (Ref to [Auto.js Pro](https://g.pro.autojs.org/)) [see Sample Code > Layout > Interactive HTML / Vue2 + Vant (SFC)] _[`issue #281`](http://issues.autojs6.com/281)_", + "Layout Inspector supports hiding controls (by [TonyJiangWJ](https://github.com/TonyJiangWJ)) _[`pr #371`](http://pr.autojs6.com/371)_ _[`issue #355`](http://issues.autojs6.com/355)_" ], "fix": [ "Online docs in the Home > Docs tab and Docs activity may be covered by the system navigation bar", @@ -60,7 +61,6 @@ "Gradle build could fail due to invalid library archive length _[`issue #389`](http://issues.autojs6.com/389)_" ], "improvement": [ - "Layout Inspector supports hiding controls (by [TonyJiangWJ](https://github.com/TonyJiangWJ)) _[`pr #371`](http://pr.autojs6.com/371)_ _[`issue #355`](http://issues.autojs6.com/355)_", "Added gradient separators to the Layout Inspector menu for lightweight grouping", "project.json now supports a permissions option for script projects (by [wirsnow](https://github.com/wirsnow)) _[`pr #391`](http://pr.autojs6.com/391)_ _[`issue #362`](http://issues.autojs6.com/362)_", "Automatically read and check declared permissions of installed apps when packaging a single file _[`issue #362`](http://issues.autojs6.com/362)_", diff --git a/.changelog/lang_es.json b/.changelog/lang_es.json index b76db8b3..870d8be2 100644 --- a/.changelog/lang_es.json +++ b/.changelog/lang_es.json @@ -34,7 +34,8 @@ "Método images.downsample para submuestreo de píxeles y creación de un nuevo ImageWrapper", "Método ui.keepScreenOn para mantener la pantalla encendida cuando la página UI está en foco", "Propiedad ui.root (getter) para obtener el nodo \"contenedor raíz del contenido de la ventana\" del layout UI", - "El elemento webview admite diseños de páginas web basados en JsBridge (Ref a [Auto.js Pro](https://g.pro.autojs.org/)) [ver Código de ejemplo > Diseño > HTML interactivo / Vue2 + Vant (SFC)] _[`issue #281`](http://issues.autojs6.com/281)_" + "El elemento webview admite diseños de páginas web basados en JsBridge (Ref a [Auto.js Pro](https://g.pro.autojs.org/)) [ver Código de ejemplo > Diseño > HTML interactivo / Vue2 + Vant (SFC)] _[`issue #281`](http://issues.autojs6.com/281)_", + "El inspector de diseño permite ocultar controles (por [TonyJiangWJ](https://github.com/TonyJiangWJ)) _[`pr #371`](http://pr.autojs6.com/371)_ _[`issue #355`](http://issues.autojs6.com/355)_" ], "fix": [ "El contenido de la documentación en línea en la pestaña Documentos y la actividad Documentos podía quedar cubierto por la barra de navegación del sistema", @@ -60,7 +61,6 @@ "La compilación Gradle podía fallar por longitud inválida de archivo de biblioteca _[`issue #389`](http://issues.autojs6.com/389)_" ], "improvement": [ - "El inspector de diseño permite ocultar controles (por [TonyJiangWJ](https://github.com/TonyJiangWJ)) _[`pr #371`](http://pr.autojs6.com/371)_ _[`issue #355`](http://issues.autojs6.com/355)_", "Añadidos separadores degradados en el menú del inspector de diseño para agrupar funciones", "project.json admite la opción permissions para proyectos de scripts (por [wirsnow](https://github.com/wirsnow)) _[`pr #391`](http://pr.autojs6.com/391)_ _[`issue #362`](http://issues.autojs6.com/362)_", "Al empaquetar un solo archivo se leen y seleccionan automáticamente los permisos declarados por la app instalada _[`issue #362`](http://issues.autojs6.com/362)_", diff --git a/.changelog/lang_fr.json b/.changelog/lang_fr.json index dcbfd0c5..94262043 100644 --- a/.changelog/lang_fr.json +++ b/.changelog/lang_fr.json @@ -34,7 +34,8 @@ "Méthode images.downsample pour l'échantillonnage de pixels et la création d'un nouveau ImageWrapper", "Méthode ui.keepScreenOn pour garder l'écran allumé lorsque la page UI a le focus", "Propriété ui.root (getter) pour obtenir le nœud « conteneur racine du contenu de fenêtre » du layout UI", - "L'élément webview prend en charge les layouts de pages Web basés sur JsBridge (Réf. [Auto.js Pro](https://g.pro.autojs.org/)) [voir Code d'exemple > Layout > HTML interactif / Vue2 + Vant (SFC)] _[`issue #281`](http://issues.autojs6.com/281)_" + "L'élément webview prend en charge les layouts de pages Web basés sur JsBridge (Réf. [Auto.js Pro](https://g.pro.autojs.org/)) [voir Code d'exemple > Layout > HTML interactif / Vue2 + Vant (SFC)] _[`issue #281`](http://issues.autojs6.com/281)_", + "L'inspecteur de layout permet de masquer des contrôles (par [TonyJiangWJ](https://github.com/TonyJiangWJ)) _[`pr #371`](http://pr.autojs6.com/371)_ _[`issue #355`](http://issues.autojs6.com/355)_" ], "fix": [ "Le contenu de la documentation en ligne dans l'onglet Docs et l'activité Docs pouvait être recouvert par la barre de navigation système", @@ -60,7 +61,6 @@ "La compilation Gradle pouvait échouer à cause d'une longueur invalide d'archive de bibliothèque _[`issue #389`](http://issues.autojs6.com/389)_" ], "improvement": [ - "L'inspecteur de layout permet de masquer des contrôles (par [TonyJiangWJ](https://github.com/TonyJiangWJ)) _[`pr #371`](http://pr.autojs6.com/371)_ _[`issue #355`](http://issues.autojs6.com/355)_", "Ajout de séparateurs dégradés dans le menu de l'inspecteur de layout pour regrouper les fonctions", "project.json prend désormais en charge l'option permissions pour les projets de script (par [wirsnow](https://github.com/wirsnow)) _[`pr #391`](http://pr.autojs6.com/391)_ _[`issue #362`](http://issues.autojs6.com/362)_", "Lors de l'empaquetage d'un fichier unique, les permissions déclarées par l'application installée sont lues et cochées automatiquement _[`issue #362`](http://issues.autojs6.com/362)_", diff --git a/.changelog/lang_ja.json b/.changelog/lang_ja.json index 391adc8b..d0694064 100644 --- a/.changelog/lang_ja.json +++ b/.changelog/lang_ja.json @@ -34,7 +34,8 @@ "images.downsample メソッドで解像度を下げて新しい ImageWrapper を生成", "ui.keepScreenOn メソッドで UI ページがフォーカス中は画面を点灯したまま維持", "ui.root プロパティ (getter) で UI レイアウト内の「ウィンドウコンテンツのルートコンテナ」ノードを取得", - "webview 要素が JsBridge ベースのウェブページレイアウトをサポート (参照 [Auto.js Pro](https://g.pro.autojs.org/)) [例: Layout > Interactive HTML / Vue2 + Vant (SFC)] _[`issue #281`](http://issues.autojs6.com/281)_" + "webview 要素が JsBridge ベースのウェブページレイアウトをサポート (参照 [Auto.js Pro](https://g.pro.autojs.org/)) [例: Layout > Interactive HTML / Vue2 + Vant (SFC)] _[`issue #281`](http://issues.autojs6.com/281)_", + "レイアウトインスペクターが要素の非表示をサポート (寄稿 [TonyJiangWJ](https://github.com/TonyJiangWJ)) _[`pr #371`](http://pr.autojs6.com/371)_ _[`issue #355`](http://issues.autojs6.com/355)_" ], "fix": [ "Docs タブおよび Docs アクティビティのオンラインドキュメントがシステムナビゲーションバーと重なる場合がある問題を修正", @@ -60,7 +61,6 @@ "Gradle ビルドがライブラリアーカイブのサイズ不正で失敗する問題を修正 _[`issue #389`](http://issues.autojs6.com/389)_" ], "improvement": [ - "レイアウトインスペクターが要素の非表示をサポート (寄稿 [TonyJiangWJ](https://github.com/TonyJiangWJ)) _[`pr #371`](http://pr.autojs6.com/371)_ _[`issue #355`](http://issues.autojs6.com/355)_", "レイアウトインスペクターのメニューに機能グループ化用のグラデーション区切りを追加", "project.json がスクリプトプロジェクト用 permissions オプションをサポート (寄稿 [wirsnow](https://github.com/wirsnow)) _[`pr #391`](http://pr.autojs6.com/391)_ _[`issue #362`](http://issues.autojs6.com/362)_", "単一ファイルをパッケージングする際, インストール済みアプリの宣言パーミッションを自動読み取り・選択 _[`issue #362`](http://issues.autojs6.com/362)_", diff --git a/.changelog/lang_ko.json b/.changelog/lang_ko.json index 063a1e91..193401d1 100644 --- a/.changelog/lang_ko.json +++ b/.changelog/lang_ko.json @@ -34,7 +34,8 @@ "images.downsample 메서드로 해상도를 낮추고 새로운 ImageWrapper 생성", "ui.keepScreenOn 메서드로 UI 페이지가 포커스될 때 화면 켜짐 유지", "ui.root 프로퍼티 (getter) 로 UI 레이아웃 내 '윈도우 콘텐츠 루트 컨테이너' 노드를 가져옴", - "webview 요소가 JsBridge 기반 웹 페이지 레이아웃 지원 (참조 [Auto.js Pro](https://g.pro.autojs.org/)) [예: Layout > Interactive HTML / Vue2 + Vant (SFC)] _[`issue #281`](http://issues.autojs6.com/281)_" + "webview 요소가 JsBridge 기반 웹 페이지 레이아웃 지원 (참조 [Auto.js Pro](https://g.pro.autojs.org/)) [예: Layout > Interactive HTML / Vue2 + Vant (SFC)] _[`issue #281`](http://issues.autojs6.com/281)_", + "레이아웃 인스펙터가 요소 숨기기 지원 (기여 [TonyJiangWJ](https://github.com/TonyJiangWJ)) _[`pr #371`](http://pr.autojs6.com/371)_ _[`issue #355`](http://issues.autojs6.com/355)_" ], "fix": [ "Docs 탭 및 Docs 액티비티의 온라인 문서가 시스템 네비게이션 바에 가려질 수 있는 문제 수정", @@ -60,7 +61,6 @@ "Gradle 빌드가 라이브러리 아카이브 크기 오류로 실패할 수 있는 문제 수정 _[`issue #389`](http://issues.autojs6.com/389)_" ], "improvement": [ - "레이아웃 인스펙터가 요소 숨기기 지원 (기여 [TonyJiangWJ](https://github.com/TonyJiangWJ)) _[`pr #371`](http://pr.autojs6.com/371)_ _[`issue #355`](http://issues.autojs6.com/355)_", "레이아웃 인스펙터 메뉴에 기능 그룹화를 위한 그라데이션 구분선 추가", "project.json 이 스크립트 프로젝트 permissions 옵션 지원 (기여 [wirsnow](https://github.com/wirsnow)) _[`pr #391`](http://pr.autojs6.com/391)_ _[`issue #362`](http://issues.autojs6.com/362)_", "단일 파일 패키징 시 설치된 앱의 선언 권한을 자동 읽어 표시 _[`issue #362`](http://issues.autojs6.com/362)_", diff --git a/.changelog/lang_ru.json b/.changelog/lang_ru.json index 09f42b98..a33988fb 100644 --- a/.changelog/lang_ru.json +++ b/.changelog/lang_ru.json @@ -34,7 +34,8 @@ "Метод images.downsample для понижения разрешения и создания нового ImageWrapper", "Метод ui.keepScreenOn для удержания экрана включённым, пока UI-страница в фокусе", "Свойство ui.root (getter) для получения узла «корневой контейнер содержимого окна» в макете UI", - "Элемент webview поддерживает макеты веб-страниц на базе JsBridge (см. [Auto.js Pro](https://g.pro.autojs.org/)) [пример: Layout > Interactive HTML / Vue2 + Vant (SFC)] _[`issue #281`](http://issues.autojs6.com/281)_" + "Элемент webview поддерживает макеты веб-страниц на базе JsBridge (см. [Auto.js Pro](https://g.pro.autojs.org/)) [пример: Layout > Interactive HTML / Vue2 + Vant (SFC)] _[`issue #281`](http://issues.autojs6.com/281)_", + "Анализ макета поддерживает скрытие элементов (автор [TonyJiangWJ](https://github.com/TonyJiangWJ)) _[`pr #371`](http://pr.autojs6.com/371)_ _[`issue #355`](http://issues.autojs6.com/355)_" ], "fix": [ "Онлайн-документация на вкладке Docs и в активности Docs могла перекрываться системной навигационной панелью", @@ -60,7 +61,6 @@ "Сборка Gradle могла падать из-за неверного размера архивного файла библиотеки _[`issue #389`](http://issues.autojs6.com/389)_" ], "improvement": [ - "Анализ макета поддерживает скрытие элементов (автор [TonyJiangWJ](https://github.com/TonyJiangWJ)) _[`pr #371`](http://pr.autojs6.com/371)_ _[`issue #355`](http://issues.autojs6.com/355)_", "В меню анализа макета добавлены градиентные разделители для группировки функций", "Файл project.json поддерживает опцию permissions для проектов скриптов (автор [wirsnow](https://github.com/wirsnow)) _[`pr #391`](http://pr.autojs6.com/391)_ _[`issue #362`](http://issues.autojs6.com/362)_", "При упаковке одного файла автоматически читаются и отмечаются заявленные разрешения установленного приложения _[`issue #362`](http://issues.autojs6.com/362)_", diff --git a/.changelog/lang_zh-Hans.json b/.changelog/lang_zh-Hans.json index 25cf8379..41699aac 100644 --- a/.changelog/lang_zh-Hans.json +++ b/.changelog/lang_zh-Hans.json @@ -1,7 +1,7 @@ { "$data": { "v6.7.0": { - "released_date": "2026/01/09", + "released_date": "2026/01/11", "feature": [ "插件中心功能, 支持插件的安装/卸载/更新等操作 (入口: 主页抽屉按钮)", "cvt 模块, 用于数据单位转换 (参阅 项目文档 > [单位转换](https://docs.autojs6.com/#/cvt))", @@ -32,7 +32,7 @@ "选择器的正则表达式参数支持使用标志 (i, m, s, u)", "正则表达式支持后瞻断言语法 _[`issue #464`](http://issues.autojs6.com/464)_", "设置页面增加 \"Java 原始类型包装\" 设置选项 _[`issue #435`](http://issues.autojs6.com/435)_", - "设置页面增加 \"定时任务调度引擎\" 设置选项, 支持 AlarmManager/WorkManager/JobScheduler _[`issue #457`](http://issues.autojs6.com/457)_ _[`issue #434`](http://issues.autojs6.com/434)_ _[`issue #449`](http://issues.autojs6.com/449)_ _[`issue #388`](http://issues.autojs6.com/388)_ _[`issue #163`](http://issues.autojs6.com/163)_ _[`issue #53`](http://issues.autojs6.com/53)_ _[`issue #21`](http://issues.autojs6.com/21)_", + "设置页面增加 \"定时任务调度引擎\" 设置选项, 支持 AlarmManager/WorkManager/JobScheduler _[`issue #457`](http://issues.autojs6.com/457)_ _[`issue #434`](http://issues.autojs6.com/434)_ _[`issue #449`](http://issues.autojs6.com/449)_ _[`issue #388`](http://issues.autojs6.com/388)_ _[`issue #378`](http://issues.autojs6.com/378)_ _[`issue #163`](http://issues.autojs6.com/163)_ _[`issue #53`](http://issues.autojs6.com/53)_ _[`issue #21`](http://issues.autojs6.com/21)_", "设置页面增加 \"应用启动器图标\" 设置选项, 支持自适应图标/透明背景图标 _[`issue #405`](http://issues.autojs6.com/405)_", "设置页面增加 \"重启策略\" 设置选项, 用于设置主页抽屉栏重启按钮是否使用快速重启策略", "设置页面启动器快捷方式增加 \"插件\" 选项, 用于通过快捷方式跳转到插件中心页面", @@ -176,7 +176,8 @@ "images.downsample 方法, 用于像素降采样并生成新的 ImageWrapper", "ui.keepScreenOn 方法, 用于 UI 页面获取焦点时保持设备屏幕常亮", "ui.root 属性 (getter), 用于获取 UI 页面布局的 \"窗口内容根容器\" 节点", - "webview 元素支持基于 JsBridge 的 Web 页面布局 (Ref to [Auto.js Pro](https://g.pro.autojs.org/)) [参阅 示例代码 > 布局 > 可交互 HTML / Vue2 + Vant (SFC)] _[`issue #281`](http://issues.autojs6.com/281)_" + "webview 元素支持基于 JsBridge 的 Web 页面布局 (Ref to [Auto.js Pro](https://g.pro.autojs.org/)) [参阅 示例代码 > 布局 > 可交互 HTML / Vue2 + Vant (SFC)] _[`issue #281`](http://issues.autojs6.com/281)_", + "布局分析支持控件隐藏 (by [TonyJiangWJ](https://github.com/TonyJiangWJ)) _[`pr #371`](http://pr.autojs6.com/371)_ _[`issue #355`](http://issues.autojs6.com/355)_" ], "fix": [ "主页文档标签及文档活动页面显示在线文档时部分内容被系统导航栏遮挡的问题", @@ -202,7 +203,6 @@ "Gradle 构建脚本可能因获取到无效库档案文件长度而导致构建失败的问题 _[`issue #389`](http://issues.autojs6.com/389)_" ], "improvement": [ - "布局分析支持控件隐藏 (by [TonyJiangWJ](https://github.com/TonyJiangWJ)) _[`pr #371`](http://pr.autojs6.com/371)_ _[`issue #355`](http://issues.autojs6.com/355)_", "布局分析菜单添加渐变分隔线实现一定程度的功能分组", "脚本项目配置文件 project.json 支持 permissions 选项 (by [wirsnow](https://github.com/wirsnow)) _[`pr #391`](http://pr.autojs6.com/391)_ _[`issue #362`](http://issues.autojs6.com/362)_", "打包单文件时自动读取并勾选已安装应用的声明权限 _[`issue #362`](http://issues.autojs6.com/362)_", diff --git a/.changelog/lang_zh-Hant-HK.json b/.changelog/lang_zh-Hant-HK.json index 04de50af..1afca57a 100644 --- a/.changelog/lang_zh-Hant-HK.json +++ b/.changelog/lang_zh-Hant-HK.json @@ -34,7 +34,8 @@ "images.downsample 方法, 用於像素降採樣並生成新的 ImageWrapper", "ui.keepScreenOn 方法, 用於 UI 頁面獲取焦點時保持設備屏幕常亮", "ui.root 屬性 (getter), 用於獲取 UI 頁面佈局的 \"窗口內容根容器\" 節點", - "webview 元素支持基於 JsBridge 的 Web 頁面佈局 (Ref to [Auto.js Pro](https://g.pro.autojs.org/)) [參閱 示例代碼 > 佈局 > 可交互 HTML / Vue2 + Vant (SFC)] _[`issue #281`](http://issues.autojs6.com/281)_" + "webview 元素支持基於 JsBridge 的 Web 頁面佈局 (Ref to [Auto.js Pro](https://g.pro.autojs.org/)) [參閱 示例代碼 > 佈局 > 可交互 HTML / Vue2 + Vant (SFC)] _[`issue #281`](http://issues.autojs6.com/281)_", + "佈局分析支持控件隱藏 (by [TonyJiangWJ](https://github.com/TonyJiangWJ)) _[`pr #371`](http://pr.autojs6.com/371)_ _[`issue #355`](http://issues.autojs6.com/355)_" ], "fix": [ "主頁文檔標籤及文檔活動頁面顯示在線文檔時部分內容被系統導航欄遮擋的問題", @@ -60,7 +61,6 @@ "Gradle 構建腳本可能因獲取到無效庫檔案文件長度而導致構建失敗的問題 _[`issue #389`](http://issues.autojs6.com/389)_" ], "improvement": [ - "佈局分析支持控件隱藏 (by [TonyJiangWJ](https://github.com/TonyJiangWJ)) _[`pr #371`](http://pr.autojs6.com/371)_ _[`issue #355`](http://issues.autojs6.com/355)_", "佈局分析菜單添加漸變分隔線實現一定程度的功能分組", "腳本項目配置文件 project.json 支持 permissions 選項 (by [wirsnow](https://github.com/wirsnow)) _[`pr #391`](http://pr.autojs6.com/391)_ _[`issue #362`](http://issues.autojs6.com/362)_", "打包單文件時自動讀取並勾選已安裝應用的聲明權限 _[`issue #362`](http://issues.autojs6.com/362)_", diff --git a/.changelog/lang_zh-Hant-TW.json b/.changelog/lang_zh-Hant-TW.json index 33541151..83c0ba19 100644 --- a/.changelog/lang_zh-Hant-TW.json +++ b/.changelog/lang_zh-Hant-TW.json @@ -34,7 +34,8 @@ "images.downsample 方法, 用於畫素降取樣並生成新的 ImageWrapper", "ui.keepScreenOn 方法, 用於 UI 頁面獲取焦點時保持裝置螢幕常亮", "ui.root 屬性 (getter), 用於獲取 UI 頁面佈局的 \"視窗內容根容器\" 節點", - "webview 元素支援基於 JsBridge 的 Web 頁面佈局 (Ref to [Auto.js Pro](https://g.pro.autojs.org/)) [參閱 示例程式碼 > 佈局 > 可互動 HTML / Vue2 + Vant (SFC)] _[`issue #281`](http://issues.autojs6.com/281)_" + "webview 元素支援基於 JsBridge 的 Web 頁面佈局 (Ref to [Auto.js Pro](https://g.pro.autojs.org/)) [參閱 示例程式碼 > 佈局 > 可互動 HTML / Vue2 + Vant (SFC)] _[`issue #281`](http://issues.autojs6.com/281)_", + "佈局分析支援控制元件隱藏 (by [TonyJiangWJ](https://github.com/TonyJiangWJ)) _[`pr #371`](http://pr.autojs6.com/371)_ _[`issue #355`](http://issues.autojs6.com/355)_" ], "fix": [ "主頁文件標籤及文件活動頁面顯示線上文件時部分內容被系統導航欄遮擋的問題", @@ -60,7 +61,6 @@ "Gradle 構建指令碼可能因獲取到無效庫檔案檔案長度而導致構建失敗的問題 _[`issue #389`](http://issues.autojs6.com/389)_" ], "improvement": [ - "佈局分析支援控制元件隱藏 (by [TonyJiangWJ](https://github.com/TonyJiangWJ)) _[`pr #371`](http://pr.autojs6.com/371)_ _[`issue #355`](http://issues.autojs6.com/355)_", "佈局分析選單新增漸變分隔線實現一定程度的功能分組", "指令碼專案配置檔案 project.json 支援 permissions 選項 (by [wirsnow](https://github.com/wirsnow)) _[`pr #391`](http://pr.autojs6.com/391)_ _[`issue #362`](http://issues.autojs6.com/362)_", "打包單檔案時自動讀取並勾選已安裝應用的宣告許可權 _[`issue #362`](http://issues.autojs6.com/362)_", diff --git a/app/src/main/java/org/autojs/autojs/engine/ScriptEngineManager.java b/app/src/main/java/org/autojs/autojs/engine/ScriptEngineManager.java index 480e9b57..85bbe7d2 100644 --- a/app/src/main/java/org/autojs/autojs/engine/ScriptEngineManager.java +++ b/app/src/main/java/org/autojs/autojs/engine/ScriptEngineManager.java @@ -29,6 +29,8 @@ public class ScriptEngineManager { } private final Set> mEngines = new HashSet<>(); + private final Object mEnginesLock = new Object(); + private EngineLifecycleCallback mEngineLifecycleCallback; private final Map>> mEngineSuppliers = new HashMap<>(); private final Map mGlobalVariableMap = new HashMap<>(); @@ -41,7 +43,7 @@ public class ScriptEngineManager { private void addEngine(ScriptEngine engine) { engine.setOnDestroyListener(mOnEngineDestroyListener); - synchronized (mEngines) { + synchronized (mEnginesLock) { mEngines.add(engine); if (mEngineLifecycleCallback != null) { mEngineLifecycleCallback.onEngineCreate(engine); @@ -54,7 +56,7 @@ public class ScriptEngineManager { } public Set> getEngines() { - synchronized (mEngines) { + synchronized (mEnginesLock) { return Collections.unmodifiableSet(new LinkedHashSet<>(mEngines)); } } @@ -64,7 +66,7 @@ public class ScriptEngineManager { } public void removeEngine(ScriptEngine engine) { - synchronized (mEngines) { + synchronized (mEnginesLock) { if (mEngines.remove(engine) && mEngineLifecycleCallback != null) { mEngineLifecycleCallback.onEngineRemove(engine); } @@ -72,7 +74,7 @@ public class ScriptEngineManager { } public int stopAll() { - synchronized (mEngines) { + synchronized (mEnginesLock) { int n = mEngines.size(); for (ScriptEngine engine : mEngines) { engine.forceStop(); diff --git a/app/src/main/java/org/autojs/autojs/ui/main/task/TaskListRecyclerView.java b/app/src/main/java/org/autojs/autojs/ui/main/task/TaskListRecyclerView.java index ccfcdc65..5fdc0991 100644 --- a/app/src/main/java/org/autojs/autojs/ui/main/task/TaskListRecyclerView.java +++ b/app/src/main/java/org/autojs/autojs/ui/main/task/TaskListRecyclerView.java @@ -41,7 +41,7 @@ import java.util.List; /** * Created by Stardust on Mar 24, 2017. - * Modified by SuperMonster003 as of May 26, 2022. + * Modified by SuperMonster003 as of Jan 7, 2026. */ public class TaskListRecyclerView extends ThemeColorRecyclerView { @@ -59,9 +59,13 @@ public class TaskListRecyclerView extends ThemeColorRecyclerView { try { int i = mRunningTaskGroup.addTask(execution); if (i != -1) { + final Adapter adapter = mAdapter; post(() -> { - mAdapter.notifyChildInserted(0, i); - mAdapter.notifyParentChanged(0); + if (adapter != mAdapter) { + return; + } + adapter.notifyChildInserted(0, i); + notifyParentChangedSafe(adapter, 0); }); } } catch (Exception e) { @@ -80,11 +84,15 @@ public class TaskListRecyclerView extends ThemeColorRecyclerView { } private void onFinish(ScriptExecution execution) { + final Adapter adapter = mAdapter; post(() -> { + if (adapter != mAdapter) { + return; + } final int i = mRunningTaskGroup.removeTask(execution); if (i >= 0) { - mAdapter.notifyChildRemoved(0, i); - mAdapter.notifyParentChanged(0); + adapter.notifyChildRemoved(0, i); + notifyParentChangedSafe(adapter, 0); } else { refresh(); } @@ -92,6 +100,33 @@ public class TaskListRecyclerView extends ThemeColorRecyclerView { } }; + private void notifyParentChangedSafe(@NonNull Adapter adapter, int parentPosition) { + // Avoid notifying an adapter that has been replaced asynchronously. + // zh-CN: 避免对已经被异步替换的适配器发送通知. + if (adapter != mAdapter) { + return; + } + + // Avoid out-of-range parentPosition caused by transient state mismatch. + // zh-CN: 避免由于瞬时状态不一致导致的 parentPosition 越界. + if (parentPosition < 0 || parentPosition >= mTaskGroups.size()) { + return; + } + + // RecyclerView may be computing layout/dispatching updates; postpone to next loop. + // zh-CN: RecyclerView 可能正在计算布局/分发更新, 将通知延迟到下一次消息循环. + if (isComputingLayout()) { + post(() -> notifyParentChangedSafe(adapter, parentPosition)); + return; + } + + try { + adapter.notifyParentChanged(parentPosition); + } catch (IndexOutOfBoundsException e) { + /* Ignored. */ + } + } + public TaskListRecyclerView(Context context) { super(context); init(); @@ -169,14 +204,15 @@ public class TaskListRecyclerView extends ThemeColorRecyclerView { } void onTaskChange(ModelChange taskChange) { + final Adapter adapter = mAdapter; if (taskChange.getAction() == ModelChange.INSERT) { - mAdapter.notifyChildInserted(1, mPendingTaskGroup.addTask(taskChange.getData())); - mAdapter.notifyParentChanged(1); + adapter.notifyChildInserted(1, mPendingTaskGroup.addTask(taskChange.getData())); + notifyParentChangedSafe(adapter, 1); } else if (taskChange.getAction() == ModelChange.DELETE) { final int i = mPendingTaskGroup.removeTask(taskChange.getData()); if (i >= 0) { - mAdapter.notifyChildRemoved(1, i); - mAdapter.notifyParentChanged(1); + adapter.notifyChildRemoved(1, i); + notifyParentChangedSafe(adapter, 1); } else { Log.w(LOG_TAG, "data inconsistent on change: " + taskChange); refresh(); @@ -184,7 +220,7 @@ public class TaskListRecyclerView extends ThemeColorRecyclerView { } else if (taskChange.getAction() == ModelChange.UPDATE) { final int i = mPendingTaskGroup.updateTask(taskChange.getData()); if (i >= 0) { - mAdapter.notifyChildChanged(1, i); + adapter.notifyChildChanged(1, i); } else { refresh(); } diff --git a/app/src/main/java/org/autojs/autojs/util/UpdateUtils.kt b/app/src/main/java/org/autojs/autojs/util/UpdateUtils.kt index a61c840f..8e751bf3 100644 --- a/app/src/main/java/org/autojs/autojs/util/UpdateUtils.kt +++ b/app/src/main/java/org/autojs/autojs/util/UpdateUtils.kt @@ -1,9 +1,7 @@ package org.autojs.autojs.util import android.content.Context -import android.content.Intent import androidx.appcompat.app.AppCompatActivity -import androidx.core.net.toUri import com.afollestad.materialdialogs.DialogAction import com.afollestad.materialdialogs.MaterialDialog import org.autojs.autojs.app.DialogUtils @@ -26,42 +24,6 @@ object UpdateUtils { Pref.getLinkedHashSet(R.string.key_ignored_updates) } - @JvmStatic - fun openUrl(context: Context, url: String) { - context.startActivity( - Intent(Intent.ACTION_VIEW) - .setData(url.toUri()) - .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) - ) - } - - class IntervalChecker { - - private val mMinCheckedIntervalNoNewer: Long = 120 * 60 * 1000 - private val mMinCheckedIntervalPostponed: Long = 30 * 60 * 1000 - private val mMinCheckedIntervalAutoChecked: Long = 15 * 1000 - - val isBeyondNoNewer: Boolean - get() { - val now = System.currentTimeMillis() - val lastNoNewer = lastNoNewerUpdatesTimestamp - return now - lastNoNewer > mMinCheckedIntervalNoNewer - } - val isBeyondPostponed: Boolean - get() { - val now = System.currentTimeMillis() - val lastPostponed = lastUpdatesPostponedTimestamp - return now - lastPostponed > mMinCheckedIntervalPostponed - } - val isBeyondAutoChecked: Boolean - get() { - val now = System.currentTimeMillis() - val lastAutoChecked = lastUpdatesAutoCheckedTimestamp - return now - lastAutoChecked > mMinCheckedIntervalAutoChecked - } - - } - fun manageIgnoredUpdates(context: Context) { MaterialDialog.Builder(context) .title(R.string.text_ignored_updates) @@ -167,15 +129,47 @@ object UpdateUtils { @JvmStatic @JvmOverloads fun autoCheckForUpdatesIfNeededWithSnackbar(activity: AppCompatActivity, snackbarViewIdRes: Int = android.R.id.content) { - if (isAutoCheckForUpdatesEnabled) { - val checker = IntervalChecker() - if (checker.isBeyondNoNewer && checker.isBeyondPostponed && checker.isBeyondAutoChecked) { - UpdateChecker.Builder(activity.findViewById(snackbarViewIdRes)) - .setPromptMode(PromptMode.SNACKBAR) - .build().checkNow() - Pref.refreshLastUpdatesAutoCheckedTimestamp() + if (!isAutoCheckForUpdatesEnabled) return + + val checker = IntervalChecker() + if (!checker.isBeyondNoNewer || !checker.isBeyondPostponed || !checker.isBeyondAutoChecked) return + + UpdateChecker.Builder(activity.findViewById(snackbarViewIdRes)) + .setPromptMode(PromptMode.SNACKBAR) + .setGitHubMainBranch("master") + .build() + .checkNow() + + Pref.refreshLastUpdatesAutoCheckedTimestamp() + } + + private class IntervalChecker { + + private val mMinCheckedIntervalNoNewer: Long = 120 * 60 * 1000 + private val mMinCheckedIntervalPostponed: Long = 30 * 60 * 1000 + private val mMinCheckedIntervalAutoChecked: Long = 15 * 1000 + + val isBeyondNoNewer: Boolean + get() { + val now = System.currentTimeMillis() + val lastNoNewer = lastNoNewerUpdatesTimestamp + return now - lastNoNewer > mMinCheckedIntervalNoNewer } - } + + val isBeyondPostponed: Boolean + get() { + val now = System.currentTimeMillis() + val lastPostponed = lastUpdatesPostponedTimestamp + return now - lastPostponed > mMinCheckedIntervalPostponed + } + + val isBeyondAutoChecked: Boolean + get() { + val now = System.currentTimeMillis() + val lastAutoChecked = lastUpdatesAutoCheckedTimestamp + return now - lastAutoChecked > mMinCheckedIntervalAutoChecked + } + } } \ No newline at end of file diff --git a/gradle/data/agp-releases.list b/gradle/data/agp-releases.list index dd3cff2a..24aa9f7d 100644 --- a/gradle/data/agp-releases.list +++ b/gradle/data/agp-releases.list @@ -1,6 +1,6 @@ -#Tue Dec 30 10:52:45 GMT+8 2025 -9.1.0-alpha02 -9.0.0-rc02 +#Sun Jan 11 23:07:21 GMT+8 2026 +9.1.0-alpha04 +9.0.0-rc03 8.13.2 8.12.3 8.11.2 diff --git a/gradle/data/android-studio-build-version.properties b/gradle/data/android-studio-build-version.properties index 46e0c106..ccddaf4f 100644 --- a/gradle/data/android-studio-build-version.properties +++ b/gradle/data/android-studio-build-version.properties @@ -1,6 +1,9 @@ -#Tue Dec 30 10:51:57 GMT+8 2025 +#Sun Jan 11 23:06:27 GMT+8 2026 +253.29346.138.2531.14682307=2025.3.1.4 +253.29346.138.2531.14653457=2025.3.1.3 253.29346.138.2531.14643844=2025.3.1.2 253.28294.334.2531.14612490=2025.3.1.1 +252.28238.7.2523.14678998=2025.2.3.8 252.28238.7.2523.14636682=2025.2.3.7 252.28238.7.2523.14608894=2025.2.3.6 252.28238.7.2523.14575018=2025.2.3.5