6.7.0 - Alpha21 - Fine tuning
This commit is contained in:
@@ -25,7 +25,7 @@
|
|||||||
"v6.6.3": {
|
"v6.6.3": {
|
||||||
"released_date": "2025/05/27",
|
"released_date": "2025/05/27",
|
||||||
"feature": [
|
"feature": [
|
||||||
"ميزة سجل الإصدار: عرض سجلات التغيير والإحصائيات متعددة اللغات",
|
"ميزة سجل الاصدارات: عرض سجل التغييرات متعدد اللغات والاحصاءات",
|
||||||
"الدالة timers.keepAlive (أصبحت عالمية) للحفاظ على بقاء السكربت نشطًا",
|
"الدالة timers.keepAlive (أصبحت عالمية) للحفاظ على بقاء السكربت نشطًا",
|
||||||
"مستمعو الأحداث مثل engines.on('start/stop/error', callback) لأحداث المحرك العامة",
|
"مستمعو الأحداث مثل engines.on('start/stop/error', callback) لأحداث المحرك العامة",
|
||||||
"الدالة images.detectMultiColors للتحقق من ألوان متعددة النقاط _[`issue #374`](http://issues.autojs6.com/374)_",
|
"الدالة images.detectMultiColors للتحقق من ألوان متعددة النقاط _[`issue #374`](http://issues.autojs6.com/374)_",
|
||||||
@@ -40,7 +40,7 @@
|
|||||||
"fix": [
|
"fix": [
|
||||||
"قد يتم حجب بعض محتوى الوثائق عبر الإنترنت في تبويب Docs وصفحة الوثائق بواسطة شريط التنقل",
|
"قد يتم حجب بعض محتوى الوثائق عبر الإنترنت في تبويب Docs وصفحة الوثائق بواسطة شريط التنقل",
|
||||||
"في بعض الصفحات قد يؤدي النقر على أزرار شريط الأدوات إلى تفعيل حدث النقر على العنوان بالخطأ",
|
"في بعض الصفحات قد يؤدي النقر على أزرار شريط الأدوات إلى تفعيل حدث النقر على العنوان بالخطأ",
|
||||||
"السطور الفارغة في محرّر الشيفرة تظهر كرموز مربّعة على بعض الأجهزة (حل مؤقت)",
|
"على بعض الاجهزة، كانت الاسطر الفارغة في محرر الشفرة تظهر كمربعات; اصلاح تجريبي",
|
||||||
"مربع حوار لوحة الألوان في إعداد لون السمة قد يتراكم بلا حدود",
|
"مربع حوار لوحة الألوان في إعداد لون السمة قد يتراكم بلا حدود",
|
||||||
"زر رفع الصوت لا يوقف جميع السكربتات عند تعطيل خدمة الوصول",
|
"زر رفع الصوت لا يوقف جميع السكربتات عند تعطيل خدمة الوصول",
|
||||||
"تداخل لوحة المفاتيح عند تحرير بث مخصّص في صفحة المهام المجدولة",
|
"تداخل لوحة المفاتيح عند تحرير بث مخصّص في صفحة المهام المجدولة",
|
||||||
|
|||||||
@@ -25,7 +25,7 @@
|
|||||||
"v6.6.3": {
|
"v6.6.3": {
|
||||||
"released_date": "2025/05/27",
|
"released_date": "2025/05/27",
|
||||||
"feature": [
|
"feature": [
|
||||||
"Función de historial de lanzamientos: ver registros de cambios y estadísticas de lanzamientos en múltiples idiomas",
|
"Función de historial de versiones: ver registros de cambios multilingües y estadísticas",
|
||||||
"Método timers.keepAlive (ahora global) para mantener activo el script",
|
"Método timers.keepAlive (ahora global) para mantener activo el script",
|
||||||
"Métodos de escucha de eventos como engines.on('start/stop/error', callback) para eventos globales del motor",
|
"Métodos de escucha de eventos como engines.on('start/stop/error', callback) para eventos globales del motor",
|
||||||
"Método images.detectMultiColors para verificación de colores multipunto _[`issue #374`](http://issues.autojs6.com/374)_",
|
"Método images.detectMultiColors para verificación de colores multipunto _[`issue #374`](http://issues.autojs6.com/374)_",
|
||||||
@@ -40,7 +40,7 @@
|
|||||||
"fix": [
|
"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",
|
"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",
|
||||||
"En algunas páginas, al pulsar botones de la Toolbar se podía activar por error el evento de clic en el título",
|
"En algunas páginas, al pulsar botones de la Toolbar se podía activar por error el evento de clic en el título",
|
||||||
"Las líneas en blanco del editor de código mostraban caracteres de cuadro en ciertos dispositivos (solución tentativa)",
|
"En algunos dispositivos, las líneas en blanco del editor de código mostraban cuadros; corrección provisional",
|
||||||
"El cuadro de diálogo del selector de colores en los ajustes de color de tema podía apilarse infinitamente",
|
"El cuadro de diálogo del selector de colores en los ajustes de color de tema podía apilarse infinitamente",
|
||||||
"La tecla de subir volumen no detenía todos los scripts cuando el servicio de accesibilidad estaba desactivado",
|
"La tecla de subir volumen no detenía todos los scripts cuando el servicio de accesibilidad estaba desactivado",
|
||||||
"Superposición del teclado IME al editar contenido de difusión personalizado en la página de tareas programadas",
|
"Superposición del teclado IME al editar contenido de difusión personalizado en la página de tareas programadas",
|
||||||
|
|||||||
@@ -25,7 +25,7 @@
|
|||||||
"v6.6.3": {
|
"v6.6.3": {
|
||||||
"released_date": "2025/05/27",
|
"released_date": "2025/05/27",
|
||||||
"feature": [
|
"feature": [
|
||||||
"Fonctionnalité d'historique des versions : visualisation des changelogs de versions multilingues et des statistiques",
|
"Fonction d'historique des versions : consulter le journal des changements multilingue et les statistiques",
|
||||||
"Méthode timers.keepAlive (désormais globale) pour maintenir le script actif",
|
"Méthode timers.keepAlive (désormais globale) pour maintenir le script actif",
|
||||||
"Méthodes d'écoute d'événements telles que engines.on('start/stop/error', callback) pour les événements globaux du moteur",
|
"Méthodes d'écoute d'événements telles que engines.on('start/stop/error', callback) pour les événements globaux du moteur",
|
||||||
"Méthode images.detectMultiColors pour la vérification de couleurs multipoints _[`issue #374`](http://issues.autojs6.com/374)_",
|
"Méthode images.detectMultiColors pour la vérification de couleurs multipoints _[`issue #374`](http://issues.autojs6.com/374)_",
|
||||||
@@ -40,7 +40,7 @@
|
|||||||
"fix": [
|
"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",
|
"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",
|
||||||
"Sur certaines pages, cliquer sur les boutons de la Toolbar pouvait déclencher par erreur l'événement de clic sur le titre",
|
"Sur certaines pages, cliquer sur les boutons de la Toolbar pouvait déclencher par erreur l'événement de clic sur le titre",
|
||||||
"Les lignes vides dans l'éditeur de code affichaient des carrés sur certains appareils (solution provisoire)",
|
"Sur certains appareils, les lignes vides de l'editeur de code affichaient des caracteres en forme de carre; correction tentative",
|
||||||
"La boîte de dialogue du sélecteur de couleurs dans les paramètres de couleur du thème pouvait se superposer indéfiniment",
|
"La boîte de dialogue du sélecteur de couleurs dans les paramètres de couleur du thème pouvait se superposer indéfiniment",
|
||||||
"La touche volume + ne stoppait pas tous les scripts lorsque le service d'accessibilité était désactivé",
|
"La touche volume + ne stoppait pas tous les scripts lorsque le service d'accessibilité était désactivé",
|
||||||
"Chevauchement du clavier IME lors de l'édition d'un contenu de diffusion personnalisé dans la page des tâches planifiées",
|
"Chevauchement du clavier IME lors de l'édition d'un contenu de diffusion personnalisé dans la page des tâches planifiées",
|
||||||
|
|||||||
@@ -25,7 +25,7 @@
|
|||||||
"v6.6.3": {
|
"v6.6.3": {
|
||||||
"released_date": "2025/05/27",
|
"released_date": "2025/05/27",
|
||||||
"feature": [
|
"feature": [
|
||||||
"リリース履歴機能: 多言語リリース変更履歴と統計の表示",
|
"リリース履歴機能: 多言語の変更履歴と統計を表示",
|
||||||
"timers.keepAlive メソッド (グローバルへ昇格) によりスクリプトの活動を維持",
|
"timers.keepAlive メソッド (グローバルへ昇格) によりスクリプトの活動を維持",
|
||||||
"engines.on('start/stop/error', callback) などのイベントリスナーでエンジンのグローバルイベントを受信",
|
"engines.on('start/stop/error', callback) などのイベントリスナーでエンジンのグローバルイベントを受信",
|
||||||
"images.detectMultiColors メソッドで複数点のカラーを検査 _[`issue #374`](http://issues.autojs6.com/374)_",
|
"images.detectMultiColors メソッドで複数点のカラーを検査 _[`issue #374`](http://issues.autojs6.com/374)_",
|
||||||
@@ -40,7 +40,7 @@
|
|||||||
"fix": [
|
"fix": [
|
||||||
"Docs タブおよび Docs アクティビティのオンラインドキュメントがシステムナビゲーションバーと重なる場合がある問題を修正",
|
"Docs タブおよび Docs アクティビティのオンラインドキュメントがシステムナビゲーションバーと重なる場合がある問題を修正",
|
||||||
"一部ページで Toolbar ボタンをタップすると誤ってタイトルのクリックイベントが発火する問題を修正",
|
"一部ページで Toolbar ボタンをタップすると誤ってタイトルのクリックイベントが発火する問題を修正",
|
||||||
"コードエディタの空行が一部デバイスで四角形として表示される問題を修正 (暫定対応)",
|
"一部端末でコードエディタの空行が□表示になる問題 (暫定修正)",
|
||||||
"テーマカラー設定のカラーピッカーダイアログが無限に重なる問題を修正",
|
"テーマカラー設定のカラーピッカーダイアログが無限に重なる問題を修正",
|
||||||
"アクセシビリティサービスが無効のときに音量アップキーが全スクリプトを停止しない問題を修正",
|
"アクセシビリティサービスが無効のときに音量アップキーが全スクリプトを停止しない問題を修正",
|
||||||
"スケジュールタスクでユーザー定義ブロードキャストメッセージを編集する際に IME が入力エリアを覆う問題を修正",
|
"スケジュールタスクでユーザー定義ブロードキャストメッセージを編集する際に IME が入力エリアを覆う問題を修正",
|
||||||
|
|||||||
@@ -25,7 +25,7 @@
|
|||||||
"v6.6.3": {
|
"v6.6.3": {
|
||||||
"released_date": "2025/05/27",
|
"released_date": "2025/05/27",
|
||||||
"feature": [
|
"feature": [
|
||||||
"릴리스 히스토리 기능: 다국어 릴리스 체인지로그 및 통계 보기",
|
"릴리스 기록 기능: 다국어 변경 로그와 통계를 보기",
|
||||||
"timers.keepAlive 메서드 (전역으로 승격) 로 스크립트 활성 유지",
|
"timers.keepAlive 메서드 (전역으로 승격) 로 스크립트 활성 유지",
|
||||||
"engines.on('start/stop/error', callback) 등의 이벤트 리스너로 엔진 전역 이벤트 수신",
|
"engines.on('start/stop/error', callback) 등의 이벤트 리스너로 엔진 전역 이벤트 수신",
|
||||||
"images.detectMultiColors 메서드로 여러 지점 색상 검사 _[`issue #374`](http://issues.autojs6.com/374)_",
|
"images.detectMultiColors 메서드로 여러 지점 색상 검사 _[`issue #374`](http://issues.autojs6.com/374)_",
|
||||||
@@ -40,7 +40,7 @@
|
|||||||
"fix": [
|
"fix": [
|
||||||
"Docs 탭 및 Docs 액티비티의 온라인 문서가 시스템 네비게이션 바에 가려질 수 있는 문제 수정",
|
"Docs 탭 및 Docs 액티비티의 온라인 문서가 시스템 네비게이션 바에 가려질 수 있는 문제 수정",
|
||||||
"일부 페이지에서 Toolbar 버튼을 누르면 제목 클릭 이벤트가 잘못 발생하는 문제 수정",
|
"일부 페이지에서 Toolbar 버튼을 누르면 제목 클릭 이벤트가 잘못 발생하는 문제 수정",
|
||||||
"일부 기기에서 코드 편집기 빈 줄이 사각형 문자로 표시되는 문제 (수정 시도)",
|
"일부 기기에서 코드 편집기 빈 줄이 □로 표시되던 문제 (임시 수정)",
|
||||||
"테마 색상 설정의 컬러 피커 대화상자가 무한 중첩되는 문제 수정",
|
"테마 색상 설정의 컬러 피커 대화상자가 무한 중첩되는 문제 수정",
|
||||||
"접근성 서비스가 꺼진 상태에서 볼륨 업 키가 모든 스크립트를 중지하지 않는 문제 수정",
|
"접근성 서비스가 꺼진 상태에서 볼륨 업 키가 모든 스크립트를 중지하지 않는 문제 수정",
|
||||||
"예약 작업에서 사용자 정의 브로드캐스트 메시지를 편집할 때 IME가 입력 영역을 덮는 문제 수정",
|
"예약 작업에서 사용자 정의 브로드캐스트 메시지를 편집할 때 IME가 입력 영역을 덮는 문제 수정",
|
||||||
|
|||||||
@@ -25,7 +25,7 @@
|
|||||||
"v6.6.3": {
|
"v6.6.3": {
|
||||||
"released_date": "2025/05/27",
|
"released_date": "2025/05/27",
|
||||||
"feature": [
|
"feature": [
|
||||||
"Функция истории релизов: просмотр многоязычных журналов изменений релизов и статистики",
|
"Функция истории релизов: просмотр многоязычных списков изменений и статистики",
|
||||||
"Метод timers.keepAlive (теперь глобальный) для поддержания активности скрипта",
|
"Метод timers.keepAlive (теперь глобальный) для поддержания активности скрипта",
|
||||||
"Слушатели событий, такие как engines.on('start/stop/error', callback), для глобальных событий движка",
|
"Слушатели событий, такие как engines.on('start/stop/error', callback), для глобальных событий движка",
|
||||||
"Метод images.detectMultiColors для проверки нескольких точек цвета _[`issue #374`](http://issues.autojs6.com/374)_",
|
"Метод images.detectMultiColors для проверки нескольких точек цвета _[`issue #374`](http://issues.autojs6.com/374)_",
|
||||||
@@ -40,7 +40,7 @@
|
|||||||
"fix": [
|
"fix": [
|
||||||
"Онлайн-документация на вкладке Docs и в активности Docs могла перекрываться системной навигационной панелью",
|
"Онлайн-документация на вкладке Docs и в активности Docs могла перекрываться системной навигационной панелью",
|
||||||
"На некоторых страницах нажатие кнопок Toolbar могло ошибочно вызывать событие клика по заголовку",
|
"На некоторых страницах нажатие кнопок Toolbar могло ошибочно вызывать событие клика по заголовку",
|
||||||
"Пустые строки в редакторе кода отображались квадратиками на ряде устройств (предварительное решение)",
|
"На некоторых устройствах пустые строки в редакторе кода отображались квадратами; пробное исправление",
|
||||||
"Диалог выбора цвета в настройках темы мог бесконечно накладываться друг на друга",
|
"Диалог выбора цвета в настройках темы мог бесконечно накладываться друг на друга",
|
||||||
"Кнопка увеличения громкости не останавливала все скрипты при выключенной службе доступности",
|
"Кнопка увеличения громкости не останавливала все скрипты при выключенной службе доступности",
|
||||||
"IME перекрывал ввод при редактировании пользовательского широковещательного сообщения в расписании задач",
|
"IME перекрывал ввод при редактировании пользовательского широковещательного сообщения в расписании задач",
|
||||||
|
|||||||
@@ -1,26 +1,101 @@
|
|||||||
// scrape-and-inject-agp-releases-list.mjs
|
// scrape-and-inject-agp-releases-list.mjs
|
||||||
|
|
||||||
import * as cheerio from 'cheerio';
|
import { compareVersionStrings, compareVersionStringsDescending } from './utils/versioning.mjs';
|
||||||
import { compareVersionStrings } from './utils/versioning.mjs';
|
|
||||||
import { getMinSupportedAgpVersion } from './utils/properties.mjs';
|
import { getMinSupportedAgpVersion } from './utils/properties.mjs';
|
||||||
|
import { sleep } from './utils/async.mjs';
|
||||||
import { updateGradleListData } from './utils/update-helper.mjs';
|
import { updateGradleListData } from './utils/update-helper.mjs';
|
||||||
|
|
||||||
const URL = 'https://developer.android.com/reference/tools/gradle-api';
|
// @Hint by JetBrains AI Assistant (GPT-5.2) on Feb 23, 2026.
|
||||||
|
// ! Use Google Maven metadata instead of scraping developer.android.com to avoid frequent network timeouts.
|
||||||
|
// ! zh-CN: 使用 Google Maven 元数据替代抓取 developer.android.com, 以避免频繁的网络超时.
|
||||||
|
// # const URL = 'https://developer.android.com/reference/tools/gradle-api';
|
||||||
|
const MAVEN_METADATA_URL = 'https://dl.google.com/dl/android/maven2/com/android/tools/build/gradle/maven-metadata.xml';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetch text with retry/backoff.
|
||||||
|
* zh-CN: 带重试/退避的文本拉取.
|
||||||
|
*
|
||||||
|
* @param {string | URL | Request} url
|
||||||
|
* @param attempts
|
||||||
|
* @param timeoutMs
|
||||||
|
*/
|
||||||
|
async function fetchTextWithRetry(url, { attempts = 5, timeoutMs = 60000 } = {}) {
|
||||||
|
let lastErr;
|
||||||
|
for (let i = 0; i < attempts; i++) {
|
||||||
|
const controller = new AbortController();
|
||||||
|
const t = setTimeout(() => controller.abort(new Error(`Request timed out after ${timeoutMs}ms`)), timeoutMs);
|
||||||
|
try {
|
||||||
|
const res = await fetch(url, {
|
||||||
|
signal: controller.signal,
|
||||||
|
headers: {
|
||||||
|
// Some CDNs behave better with a UA.
|
||||||
|
// zh-CN: 某些 CDN 在带 UA 的情况下表现更稳定.
|
||||||
|
'User-Agent': 'agp-releases-list-updater/1.0 (+nodejs)',
|
||||||
|
'Accept': 'application/xml,text/xml,text/plain,*/*',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
if (!res.ok) {
|
||||||
|
// noinspection ExceptionCaughtLocallyJS
|
||||||
|
throw new Error(`HTTP ${res.status} ${res.statusText}`);
|
||||||
|
}
|
||||||
|
return await res.text();
|
||||||
|
} catch (e) {
|
||||||
|
lastErr = e;
|
||||||
|
// Exponential backoff with jitter.
|
||||||
|
// zh-CN: 带抖动的指数退避.
|
||||||
|
const backoff = Math.min(2000 * (2 ** i), 15000) + Math.floor(Math.random() * 250);
|
||||||
|
await sleep(backoff);
|
||||||
|
} finally {
|
||||||
|
clearTimeout(t);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
throw lastErr;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Minimal parser: extract <version>...</version>.
|
||||||
|
* zh-CN: 最小解析器: 提取 <version>...</version>.
|
||||||
|
*
|
||||||
|
* @param {string} xml
|
||||||
|
*/
|
||||||
|
function extractVersionsFromMavenMetadataXml(xml) {
|
||||||
|
const versions = [];
|
||||||
|
const re = /<version>\s*([^<\s]+)\s*<\/version>/g;
|
||||||
|
let m;
|
||||||
|
while ((m = re.exec(xml)) !== null) {
|
||||||
|
versions.push(m[1]);
|
||||||
|
}
|
||||||
|
return versions;
|
||||||
|
}
|
||||||
|
|
||||||
(async function main() {
|
(async function main() {
|
||||||
const res = await fetch(URL);
|
const xml = await fetchTextWithRetry(MAVEN_METADATA_URL);
|
||||||
const $ = cheerio.load(await res.text());
|
|
||||||
const results = new Set();
|
const versions = extractVersionsFromMavenMetadataXml(xml);
|
||||||
$('table').find('a').each((_, el) => {
|
|
||||||
const a = $(el);
|
|
||||||
const href = a.attr('href');
|
|
||||||
if (href.includes('reference/tools/gradle-api')) {
|
|
||||||
results.add(a.text());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
const minSupportedVersion = getMinSupportedAgpVersion();
|
const minSupportedVersion = getMinSupportedAgpVersion();
|
||||||
const agpList = new Set(Array.from(results).filter(v => compareVersionStrings(v, minSupportedVersion) >= 0));
|
const agpListAll = new Set(versions.filter(v => compareVersionStrings(v, minSupportedVersion) >= 0));
|
||||||
await updateGradleListData('agp-releases', agpList, {
|
const agpListMajor = new Map();
|
||||||
|
|
||||||
|
const rex = /^(\d+\.\d+)\.(\d+.*)$/
|
||||||
|
for (let v of agpListAll) {
|
||||||
|
const matched = rex.exec(v);
|
||||||
|
if (!matched) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
const major = matched[1];
|
||||||
|
if (!agpListMajor.has(major)) {
|
||||||
|
agpListMajor.set(major, v);
|
||||||
|
} else {
|
||||||
|
if (compareVersionStrings(v, agpListMajor.get(major)) > 0) {
|
||||||
|
agpListMajor.set(major, v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const agpListFinal = new Set([...agpListMajor.values()].sort(compareVersionStringsDescending));
|
||||||
|
|
||||||
|
await updateGradleListData('agp-releases', agpListFinal, {
|
||||||
label: 'AGP releases list',
|
label: 'AGP releases list',
|
||||||
sort: 'descending.as.version',
|
sort: 'descending.as.version',
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package org.autojs.autojs.runtime
|
package org.autojs.autojs.runtime
|
||||||
|
|
||||||
|
import org.autojs.autojs.annotation.ScriptInterface
|
||||||
import org.autojs.autojs.core.automator.UiObjectCollection
|
import org.autojs.autojs.core.automator.UiObjectCollection
|
||||||
import org.autojs.autojs.engine.RhinoJavaScriptEngine
|
import org.autojs.autojs.engine.RhinoJavaScriptEngine
|
||||||
import org.autojs.autojs.util.RhinoUtils.callFunction
|
import org.autojs.autojs.util.RhinoUtils.callFunction
|
||||||
@@ -15,15 +16,17 @@ import org.mozilla.javascript.Undefined
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by Stardust on Jul 21, 2017.
|
* Created by Stardust on Jul 21, 2017.
|
||||||
* Modified by SuperMonster003 as of May 26, 2022.
|
|
||||||
* Transformed by SuperMonster003 on Nov 7, 2023.
|
* Transformed by SuperMonster003 on Nov 7, 2023.
|
||||||
|
* Modified by SuperMonster003 as of Feb 13, 2026.
|
||||||
*
|
*
|
||||||
* @Reference to aiselp (https://github.com/aiselp) on Nov 7, 2023.
|
* @Reference to aiselp (https://github.com/aiselp) on Nov 7, 2023.
|
||||||
* https://github.com/kkevsekk1/AutoX/pull/529/commits/782f1c3c12dee64d9b1ad70aba462afaf60313a4#diff-b8e544bc658140f04a7fa7171cc938032f18c92495ca25bb08e2d2eb546b70f5
|
* https://github.com/kkevsekk1/AutoX/pull/529/commits/782f1c3c12dee64d9b1ad70aba462afaf60313a4#diff-b8e544bc658140f04a7fa7171cc938032f18c92495ca25bb08e2d2eb546b70f5
|
||||||
*/
|
*/
|
||||||
class ScriptBridges : IScriptBridges {
|
class ScriptBridges : IScriptBridges {
|
||||||
|
|
||||||
lateinit var engine: RhinoJavaScriptEngine
|
@get:ScriptInterface
|
||||||
|
var engine: RhinoJavaScriptEngine? = null
|
||||||
|
private set
|
||||||
|
|
||||||
fun setup(engine: RhinoJavaScriptEngine) {
|
fun setup(engine: RhinoJavaScriptEngine) {
|
||||||
this.engine = engine
|
this.engine = engine
|
||||||
@@ -43,11 +46,11 @@ class ScriptBridges : IScriptBridges {
|
|||||||
val niceArgs = args.map { Context.javaToJS(it, niceScope) }.toTypedArray()
|
val niceArgs = args.map { Context.javaToJS(it, niceScope) }.toTypedArray()
|
||||||
val thisObj = Context.javaToJS(target, niceScope) as? Scriptable ?: Undefined.SCRIPTABLE_UNDEFINED
|
val thisObj = Context.javaToJS(target, niceScope) as? Scriptable ?: Undefined.SCRIPTABLE_UNDEFINED
|
||||||
|
|
||||||
callFunction(engine.runtime, func, niceScope, thisObj, niceArgs)
|
callFunction(engine?.runtime, func, niceScope, thisObj, niceArgs)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun toArray(o: Iterable<*>?): NativeArray = useJsContext { cx ->
|
override fun toArray(o: Iterable<*>?): NativeArray = useJsContext { cx ->
|
||||||
val scope = engine.runtime.topLevelScope
|
val scope = engine?.runtime?.topLevelScope ?: cx.initStandardObjects()
|
||||||
cx.newArray(scope, o?.map { Context.javaToJS(it, scope) }?.toTypedArray()) as NativeArray
|
cx.newArray(scope, o?.map { Context.javaToJS(it, scope) }?.toTypedArray()) as NativeArray
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -72,12 +75,15 @@ class ScriptBridges : IScriptBridges {
|
|||||||
override fun toString(obj: Any?): String =
|
override fun toString(obj: Any?): String =
|
||||||
Context.toString(obj)
|
Context.toString(obj)
|
||||||
|
|
||||||
override fun toPrimitive(obj: Any?): Any? =
|
override fun toPrimitive(obj: Any?): Any? = useJsContext { cx ->
|
||||||
Context.javaToJS(obj, engine.runtime.topLevelScope)
|
val scope = engine?.runtime?.topLevelScope ?: cx.initStandardObjects()
|
||||||
|
Context.javaToJS(obj, scope)
|
||||||
|
}
|
||||||
|
|
||||||
private fun <T> useJsContext(f: (Context) -> T): T {
|
private fun <T> useJsContext(f: (Context) -> T): T {
|
||||||
val currentContext = Context.getCurrentContext()
|
val currentContext = Context.getCurrentContext()
|
||||||
return try {
|
return try {
|
||||||
|
val engine = engine ?: return f(Context.enter())
|
||||||
// Enter Context via engine to ensure WrapFactory and AutoJsContext binding are installed.
|
// Enter Context via engine to ensure WrapFactory and AutoJsContext binding are installed.
|
||||||
// zh-CN: 通过 engine 进入 Context, 确保 WrapFactory 与 AutoJsContext 绑定已安装.
|
// zh-CN: 通过 engine 进入 Context, 确保 WrapFactory 与 AutoJsContext 绑定已安装.
|
||||||
f(currentContext ?: engine.enterContext())
|
f(currentContext ?: engine.enterContext())
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ import java.util.ArrayDeque
|
|||||||
*/
|
*/
|
||||||
object ScriptToast {
|
object ScriptToast {
|
||||||
|
|
||||||
private const val MAX_GLOBAL_QUEUE_SIZE = 17
|
private const val MAX_GLOBAL_QUEUE_SIZE = 32
|
||||||
|
|
||||||
private val mainHandler = Handler(Looper.getMainLooper())
|
private val mainHandler = Handler(Looper.getMainLooper())
|
||||||
private val queue = ArrayDeque<ToastTask>(MAX_GLOBAL_QUEUE_SIZE)
|
private val queue = ArrayDeque<ToastTask>(MAX_GLOBAL_QUEUE_SIZE)
|
||||||
@@ -56,13 +56,15 @@ object ScriptToast {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val task = ToastTask(message, duration, ownerId)
|
||||||
|
|
||||||
if (queue.size >= MAX_GLOBAL_QUEUE_SIZE) {
|
if (queue.size >= MAX_GLOBAL_QUEUE_SIZE) {
|
||||||
// Discard newest task when the queue is full.
|
// Keep newest: discard oldest when queue is full.
|
||||||
// zh-CN: 当队列已满时丢弃最新任务.
|
// zh-CN: 保留最新: 队列满时丢弃最旧任务.
|
||||||
return
|
queue.removeFirstOrNull()
|
||||||
}
|
}
|
||||||
|
|
||||||
queue.addLast(ToastTask(message, duration, ownerId))
|
queue.addLast(task)
|
||||||
|
|
||||||
tryShowNextLocked(context.applicationContext)
|
tryShowNextLocked(context.applicationContext)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -113,7 +113,7 @@ object VersionCodes : Augmentable() {
|
|||||||
val (_, month, day, year) = it.groupValues
|
val (_, month, day, year) = it.groupValues
|
||||||
"$year,${monthMap[month.lowercase().slice(0..2)]!!.minus(1)},$day"
|
"$year,${monthMap[month.lowercase().slice(0..2)]!!.minus(1)},$day"
|
||||||
}
|
}
|
||||||
val (year, month, day) = replaceFullDate.split(',').map { it.toInt() }
|
val (year, month, day) = replaceFullDate.split(',').map { it.toIntOrNull() ?: return@parseTimestamp 0 }
|
||||||
return Calendar.getInstance().apply {
|
return Calendar.getInstance().apply {
|
||||||
clear()
|
clear()
|
||||||
set(year, month, day)
|
set(year, month, day)
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
#Tue Jan 27 22:23:42 GMT+8 2026
|
#Tue Feb 24 20:06:12 GMT+8 2026
|
||||||
9.1.0-alpha06
|
9.2.0-alpha01
|
||||||
9.0.0
|
9.1.0-rc01
|
||||||
|
9.0.1
|
||||||
8.13.2
|
8.13.2
|
||||||
8.12.3
|
8.12.3
|
||||||
8.11.2
|
8.11.2
|
||||||
|
|||||||
Reference in New Issue
Block a user