From 0882cf4166d77550756e92d48a9e9dc544a9b120 Mon Sep 17 00:00:00 2001 From: SuperMonster003 Date: Thu, 15 May 2025 16:26:46 +0800 Subject: [PATCH] =?UTF-8?q?6.6.3=20-=20Alpha4=20-=20=E6=84=8F=E5=9B=BE?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E6=93=8D=E4=BD=9C=20(=E7=BC=96=E8=BE=91/?= =?UTF-8?q?=E6=9F=A5=E7=9C=8B/=E5=AE=89=E8=A3=85/=E5=8F=91=E9=80=81/?= =?UTF-8?q?=E6=92=AD=E6=94=BE=E7=AD=89)=20=E5=A2=9E=E5=8A=A0=E6=93=8D?= =?UTF-8?q?=E4=BD=9C=E5=BC=82=E5=B8=B8=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .changelog/lang_zh-Hans.json | 1 + .readme/README-ar.md | 2 +- .readme/README-en.md | 2 +- .readme/README-es.md | 2 +- .readme/README-fr.md | 2 +- .readme/README-ja.md | 2 +- .readme/README-ko.md | 2 +- .readme/README-ru.md | 2 +- .readme/README-zh-Hans.md | 3 +- .readme/README-zh-Hant-HK.md | 2 +- .readme/README-zh-Hant-TW.md | 2 +- README.md | 3 +- .../main/assets-app/doc/CHANGELOG-zh-Hans.md | 1 + app/src/main/assets-app/doc/CHANGELOG.md | 1 + .../autojs/model/explorer/ExplorerItem.java | 56 +++++- .../org/autojs/autojs/model/script/Scripts.kt | 24 ++- .../autojs/autojs/network/UpdateChecker.java | 9 +- .../org/autojs/autojs/runtime/api/AppUtils.kt | 26 ++- .../org/autojs/autojs/runtime/api/Images.java | 3 +- .../org/autojs/autojs/ui/edit/EditorMenu.java | 7 +- .../autojs/autojs/ui/explorer/ExplorerView.kt | 13 +- .../ui/main/scripts/ApkInfoDialogManager.kt | 9 +- .../ui/main/scripts/ExplorerFragment.kt | 15 +- .../autojs/ui/project/BuildActivity.java | 9 +- .../org/autojs/autojs/util/IntentUtils.kt | 180 ++++++++++++++---- app/src/main/res/values-ar/strings.xml | 6 + app/src/main/res/values-en/strings.xml | 6 + app/src/main/res/values-es/strings.xml | 6 + app/src/main/res/values-fr/strings.xml | 6 + app/src/main/res/values-ja/strings.xml | 6 + app/src/main/res/values-ko/strings.xml | 6 + app/src/main/res/values-ru/strings.xml | 6 + app/src/main/res/values-zh-rHK/strings.xml | 6 + app/src/main/res/values-zh-rTW/strings.xml | 6 + app/src/main/res/values-zh/strings.xml | 6 + app/src/main/res/values/strings.xml | 6 + version.properties | 6 +- 37 files changed, 361 insertions(+), 89 deletions(-) diff --git a/.changelog/lang_zh-Hans.json b/.changelog/lang_zh-Hans.json index 514be08c..7538177f 100644 --- a/.changelog/lang_zh-Hans.json +++ b/.changelog/lang_zh-Hans.json @@ -32,6 +32,7 @@ "设置页面对话框相关设置支持 \"使用默认值\" 菜单选项", "文件管理器浮动按钮展开后点击其他区域可自动隐藏", "打包单文件时自动读取并勾选已安装应用的声明权限 _[`issue #362`](http://issues.autojs6.com/362)_", + "意图相关操作 (编辑/查看/安装/发送/播放等) 增加操作异常提示", "已忽略更新记录及客户端模式连接地址记录支持清空操作", "版本更新信息支持多语言显示 (与当前显示语言同步)", "使用异步加载方式一定程度提升文件管理器列表滑动流畅性", diff --git a/.readme/README-ar.md b/.readme/README-ar.md index e8d045cd..2f4f9d27 100644 --- a/.readme/README-ar.md +++ b/.readme/README-ar.md @@ -389,7 +389,7 @@ SDK Tools (أدوات SDK) (في النافذة اليمنى) يعتمد مشروع AutoJs6 على إصدار `JDK (مجموعة تطوير جافا)` بإصدار لا يقل عن `17`، ولكن يفضل الإصدار الذي لا يقل عن `19`. -اعتبارًا من 14 May 2025، الإصدار الأقصى المدعوم من JDK لمشروع AutoJs6 هو `24`. +اعتبارًا من 15 May 2025، الإصدار الأقصى المدعوم من JDK لمشروع AutoJs6 هو `24`. > ملاحظة: إذا كان نظام الكمبيوتر يحتوي على JDK والإصدار يفي بالمتطلبات المذكورة أعلاه، فيمكنك تخطي هذا القسم. diff --git a/.readme/README-en.md b/.readme/README-en.md index c58bcd68..7a63e705 100644 --- a/.readme/README-en.md +++ b/.readme/README-en.md @@ -389,7 +389,7 @@ Check `Show Package Details`, click NDK and CMake respectively to ensure the cor The `JDK (Java Development Kit)` version required for the AutoJs6 project should be at least `17`, but `19` or higher is recommended. -As of May 14, 2025, AutoJs6 supports up to version `24` of the JDK. +As of May 15, 2025, AutoJs6 supports up to version `24` of the JDK. > Note: If the JDK is already installed on the computer system and the version meets the above requirements, this section can be skipped. diff --git a/.readme/README-es.md b/.readme/README-es.md index f8aec382..663236fb 100644 --- a/.readme/README-es.md +++ b/.readme/README-es.md @@ -389,7 +389,7 @@ Marca `Show Package Details (Mostrar detalles del paquete)`, haz clic en NDK y C La versión mínima requerida del `JDK (Kit de Desarrollo de Java)` para el proyecto AutoJs6 es `17`, pero se recomienda usar una versión no inferior a `19`. -Hasta el 14 de May de 2025, AutoJs6 soporta hasta la versión `24` de JDK. +Hasta el 15 de May de 2025, AutoJs6 soporta hasta la versión `24` de JDK. > Nota: Si el sistema ya tiene instalado JDK y cumple con los requisitos anteriores, puedes omitir esta sección. diff --git a/.readme/README-fr.md b/.readme/README-fr.md index 13645cbe..6b4c8fc6 100644 --- a/.readme/README-fr.md +++ b/.readme/README-fr.md @@ -389,7 +389,7 @@ Cochez `Show Package Details (afficher les détails du package)`, puis cliquez r La version de JDK (Kit de développement Java) requise pour le projet AutoJs6 doit être au moins `17`, mais il est recommandé d'avoir au moins `19`. -À partir du 14 May 2025, AutoJs6 prend en charge la version maximale de JDK `24`. +À partir du 15 May 2025, AutoJs6 prend en charge la version maximale de JDK `24`. > Note : Si le JDK est déjà installé sur le système informatique et que la version répond aux exigences ci-dessus, vous pouvez ignorer cette section. diff --git a/.readme/README-ja.md b/.readme/README-ja.md index 4ef5dab0..5b10ea8d 100644 --- a/.readme/README-ja.md +++ b/.readme/README-ja.md @@ -389,7 +389,7 @@ SDK Tools (SDK ツール) (右側のウィンドウにあります) AutoJs6プロジェクトが依存する `JDK (Java開発キット)` のリリースバージョンは少なくとも `17` で, それ以下のバージョンは推奨されませんが, 最低でも `19` の使用を推奨します. -2025 年 5 月 14 日 現在, AutoJs6がサポートする最大のJDKバージョンは `24` です. +2025 年 5 月 15 日 現在, AutoJs6がサポートする最大のJDKバージョンは `24` です. > 注: コンピュータシステムに適切なバージョンのJDKがインストールされている場合, この節の内容をスキップできます. diff --git a/.readme/README-ko.md b/.readme/README-ko.md index 3fb0d3b0..a123fbe6 100644 --- a/.readme/README-ko.md +++ b/.readme/README-ko.md @@ -389,7 +389,7 @@ SDK Tools (SDK 도구) (오른쪽 창에 위치) AutoJs6 프로젝트는 `JDK (Java 개발 도구 키트)` 버전이 `17` 이상이어야 하지만, `19` 이상을 권장합니다. -2025 년 5 월 14 일 기준으로, AutoJs6이 지원하는 최대 JDK 버전은 `24` 입니다. +2025 년 5 월 15 일 기준으로, AutoJs6이 지원하는 최대 JDK 버전은 `24` 입니다. > 메모: 시스템에 JDK가 설치되어 있고, 버전이 위의 요구 사항을 충족하는 경우, 이 섹션을 건너뛸 수 있습니다. diff --git a/.readme/README-ru.md b/.readme/README-ru.md index 3e28eb65..0fae75dc 100644 --- a/.readme/README-ru.md +++ b/.readme/README-ru.md @@ -389,7 +389,7 @@ SDK Tools (SDK Инструменты) (находится в правом ок Для проекта AutoJs6 требуется версия `JDK (Java Development Kit)` не ниже `17`, но рекомендуется не ниже `19`. -По состоянию на 14 May 2025 года AutoJs6 поддерживает JDK максимальной версии `24`. +По состоянию на 15 May 2025 года AutoJs6 поддерживает JDK максимальной версии `24`. > Примечание: Если на компьютере уже установлен JDK и версия соответствует указанным требованиям, этот раздел можно пропустить. diff --git a/.readme/README-zh-Hans.md b/.readme/README-zh-Hans.md index 8b741637..8f2be452 100644 --- a/.readme/README-zh-Hans.md +++ b/.readme/README-zh-Hans.md @@ -184,6 +184,7 @@ AutoJs6 在 Auto.js 最终项目的基础上, 于 `2021/12/01` 进行二次开 * `优化` 设置页面对话框相关设置支持 "使用默认值" 菜单选项 * `优化` 文件管理器浮动按钮展开后点击其他区域可自动隐藏 * `优化` 打包单文件时自动读取并勾选已安装应用的声明权限 _[`issue #362`](http://issues.autojs6.com/362)_ +* `优化` 意图相关操作 (编辑/查看/安装/发送/播放等) 增加操作异常提示 * `优化` 已忽略更新记录及客户端模式连接地址记录支持清空操作 * `优化` 版本更新信息支持多语言显示 (与当前显示语言同步) * `优化` 使用异步加载方式一定程度提升文件管理器列表滑动流畅性 @@ -334,7 +335,7 @@ SDK Tools (SDK 工具) (位于右侧窗口) AutoJs6 项目依赖的 `JDK (Java 开发工具包)` 发行版本不低于 `17`, 但建议不低于 `19`. -截至 2025 年 5 月 14 日, AutoJs6 可支持 JDK 最高版本为 `24`. +截至 2025 年 5 月 15 日, AutoJs6 可支持 JDK 最高版本为 `24`. > 注: 如果计算机系统已安装 JDK 且版本满足上述要求, 则可跳过此小节内容. diff --git a/.readme/README-zh-Hant-HK.md b/.readme/README-zh-Hant-HK.md index 50bfa500..e03a9568 100644 --- a/.readme/README-zh-Hant-HK.md +++ b/.readme/README-zh-Hant-HK.md @@ -389,7 +389,7 @@ SDK Tools (SDK 工具) (位於右側窗口) AutoJs6 項目依賴的 `JDK (Java 開發工具包)` 發行版本不低於 `17`, 但建議不低於 `19`. -截至 2025 年 5 月 14 日, AutoJs6 可支持 JDK 最高版本為 `24`. +截至 2025 年 5 月 15 日, AutoJs6 可支持 JDK 最高版本為 `24`. > 注: 如果計算機系統已安裝 JDK 且版本滿足上述要求, 則可跳過此小節內容. diff --git a/.readme/README-zh-Hant-TW.md b/.readme/README-zh-Hant-TW.md index bc405b91..61df68c2 100644 --- a/.readme/README-zh-Hant-TW.md +++ b/.readme/README-zh-Hant-TW.md @@ -389,7 +389,7 @@ SDK Tools (SDK 工具) (位於右側視窗) AutoJs6 專案依賴的 `JDK (Java 開發工具包)` 發行版本不低於 `17`, 但建議不低於 `19`. -截至 2025 年 5 月 14 日, AutoJs6 可支援 JDK 最高版本為 `24`. +截至 2025 年 5 月 15 日, AutoJs6 可支援 JDK 最高版本為 `24`. > 注: 如果計算機系統已安裝 JDK 且版本滿足上述要求, 則可跳過此小節內容. diff --git a/README.md b/README.md index 8b741637..8f2be452 100644 --- a/README.md +++ b/README.md @@ -184,6 +184,7 @@ AutoJs6 在 Auto.js 最终项目的基础上, 于 `2021/12/01` 进行二次开 * `优化` 设置页面对话框相关设置支持 "使用默认值" 菜单选项 * `优化` 文件管理器浮动按钮展开后点击其他区域可自动隐藏 * `优化` 打包单文件时自动读取并勾选已安装应用的声明权限 _[`issue #362`](http://issues.autojs6.com/362)_ +* `优化` 意图相关操作 (编辑/查看/安装/发送/播放等) 增加操作异常提示 * `优化` 已忽略更新记录及客户端模式连接地址记录支持清空操作 * `优化` 版本更新信息支持多语言显示 (与当前显示语言同步) * `优化` 使用异步加载方式一定程度提升文件管理器列表滑动流畅性 @@ -334,7 +335,7 @@ SDK Tools (SDK 工具) (位于右侧窗口) AutoJs6 项目依赖的 `JDK (Java 开发工具包)` 发行版本不低于 `17`, 但建议不低于 `19`. -截至 2025 年 5 月 14 日, AutoJs6 可支持 JDK 最高版本为 `24`. +截至 2025 年 5 月 15 日, AutoJs6 可支持 JDK 最高版本为 `24`. > 注: 如果计算机系统已安装 JDK 且版本满足上述要求, 则可跳过此小节内容. diff --git a/app/src/main/assets-app/doc/CHANGELOG-zh-Hans.md b/app/src/main/assets-app/doc/CHANGELOG-zh-Hans.md index 9d543ef4..d7697a66 100644 --- a/app/src/main/assets-app/doc/CHANGELOG-zh-Hans.md +++ b/app/src/main/assets-app/doc/CHANGELOG-zh-Hans.md @@ -33,6 +33,7 @@ * `优化` 设置页面对话框相关设置支持 "使用默认值" 菜单选项 * `优化` 文件管理器浮动按钮展开后点击其他区域可自动隐藏 * `优化` 打包单文件时自动读取并勾选已安装应用的声明权限 _[`issue #362`](http://issues.autojs6.com/362)_ +* `优化` 意图相关操作 (编辑/查看/安装/发送/播放等) 增加操作异常提示 * `优化` 已忽略更新记录及客户端模式连接地址记录支持清空操作 * `优化` 版本更新信息支持多语言显示 (与当前显示语言同步) * `优化` 使用异步加载方式一定程度提升文件管理器列表滑动流畅性 diff --git a/app/src/main/assets-app/doc/CHANGELOG.md b/app/src/main/assets-app/doc/CHANGELOG.md index 9d543ef4..d7697a66 100644 --- a/app/src/main/assets-app/doc/CHANGELOG.md +++ b/app/src/main/assets-app/doc/CHANGELOG.md @@ -33,6 +33,7 @@ * `优化` 设置页面对话框相关设置支持 "使用默认值" 菜单选项 * `优化` 文件管理器浮动按钮展开后点击其他区域可自动隐藏 * `优化` 打包单文件时自动读取并勾选已安装应用的声明权限 _[`issue #362`](http://issues.autojs6.com/362)_ +* `优化` 意图相关操作 (编辑/查看/安装/发送/播放等) 增加操作异常提示 * `优化` 已忽略更新记录及客户端模式连接地址记录支持清空操作 * `优化` 版本更新信息支持多语言显示 (与当前显示语言同步) * `优化` 使用异步加载方式一定程度提升文件管理器列表滑动流畅性 diff --git a/app/src/main/java/org/autojs/autojs/model/explorer/ExplorerItem.java b/app/src/main/java/org/autojs/autojs/model/explorer/ExplorerItem.java index 41e63d07..180a2330 100644 --- a/app/src/main/java/org/autojs/autojs/model/explorer/ExplorerItem.java +++ b/app/src/main/java/org/autojs/autojs/model/explorer/ExplorerItem.java @@ -1,14 +1,18 @@ package org.autojs.autojs.model.explorer; import android.content.Context; +import android.view.View; import androidx.annotation.NonNull; import androidx.annotation.Nullable; - import org.autojs.autojs.external.fileprovider.AppFileProvider; import org.autojs.autojs.model.script.ScriptFile; import org.autojs.autojs.runtime.api.Mime; import org.autojs.autojs.util.FileUtils; import org.autojs.autojs.util.IntentUtils; +import org.autojs.autojs.util.IntentUtils.SnackExceptionHolder; +import org.autojs.autojs.util.IntentUtils.ToastExceptionHolder; +import org.autojs.autojs6.R; +import org.jetbrains.annotations.NotNull; public interface ExplorerItem { @@ -64,11 +68,37 @@ public interface ExplorerItem { return getType().isMediaMenu(); } - default void install(Context context) { - IntentUtils.installApk(context, getPath()); + default boolean install(@NotNull View view) { + return IntentUtils.installApk(view.getContext(), getPath(), AppFileProvider.AUTHORITY, new SnackExceptionHolder(view)); } - default void play(Context context) { + default boolean install(Context context) { + return IntentUtils.installApk(context, getPath(), AppFileProvider.AUTHORITY, new ToastExceptionHolder(context)); + } + + default boolean play(@NotNull View view) { + String mimeType = determineMimeTypeForPlay(); + return IntentUtils.viewFile( + view.getContext(), + getPath(), + mimeType, + AppFileProvider.AUTHORITY, + new SnackExceptionHolder(view, R.string.error_no_applications_available_for_playing_this_file) + ); + } + + default boolean play(Context context) { + String mimeType = determineMimeTypeForPlay(); + return IntentUtils.viewFile( + context, + getPath(), + mimeType, + AppFileProvider.AUTHORITY, + new ToastExceptionHolder(context, R.string.error_no_applications_available_for_playing_this_file) + ); + } + + private @NotNull String determineMimeTypeForPlay() { String mimeType; FileUtils.TypeData typeData = getType().getTypeData(); if (typeData == FileUtils.TypeDataHolder.INSTANCE.getVIDEO() || typeData == FileUtils.TypeDataHolder.INSTANCE.getVIDEO_PLAYLIST()) { @@ -78,11 +108,23 @@ public interface ExplorerItem { } else { mimeType = Mime.WILDCARD; } - IntentUtils.viewFile(context, getPath(), mimeType, AppFileProvider.AUTHORITY); + return mimeType; } - default void view(Context context) { - IntentUtils.viewFile(context, getPath(), Mime.WILDCARD, AppFileProvider.AUTHORITY); + default boolean view(@NotNull View view) { + return IntentUtils.viewFile(view.getContext(), getPath(), null, AppFileProvider.AUTHORITY, new SnackExceptionHolder(view)); + } + + default boolean view(Context context) { + return IntentUtils.viewFile(context, getPath(), null, AppFileProvider.AUTHORITY, new ToastExceptionHolder(context)); + } + + default boolean edit(@NotNull View view) { + return IntentUtils.editFile(view.getContext(), getPath(), AppFileProvider.AUTHORITY, new SnackExceptionHolder(view)); + } + + default boolean edit(Context context) { + return IntentUtils.editFile(context, getPath(), AppFileProvider.AUTHORITY, new ToastExceptionHolder(context)); } } diff --git a/app/src/main/java/org/autojs/autojs/model/script/Scripts.kt b/app/src/main/java/org/autojs/autojs/model/script/Scripts.kt index 4645400a..8e8fc101 100644 --- a/app/src/main/java/org/autojs/autojs/model/script/Scripts.kt +++ b/app/src/main/java/org/autojs/autojs/model/script/Scripts.kt @@ -17,6 +17,7 @@ import org.autojs.autojs.script.ScriptSource import org.autojs.autojs.ui.edit.EditActivity import org.autojs.autojs.util.FileUtils import org.autojs.autojs.util.IntentUtils +import org.autojs.autojs.util.IntentUtils.ToastExceptionHolder import org.autojs.autojs.util.ViewUtils import org.autojs.autojs.util.WorkingDirectoryUtils import org.autojs.autojs6.R @@ -77,7 +78,13 @@ object Scripts { @JvmStatic fun openByOtherApps(uri: Uri) { - IntentUtils.viewFile(globalAppContext, uri, "text/plain", AppFileProvider.AUTHORITY) + IntentUtils.viewFile( + globalAppContext, + uri, + "text/plain", + AppFileProvider.AUTHORITY, + ToastExceptionHolder(globalAppContext), + ) } @JvmStatic @@ -159,15 +166,12 @@ object Scripts { @JvmStatic fun send(context: Context, file: ScriptFile) { - Intent(Intent.ACTION_SEND) - .setType("text/plain") - .putExtra( - Intent.EXTRA_STREAM, - IntentUtils.getUriOfFile(context, file.path, AppFileProvider.AUTHORITY) - ) - .let { Intent.createChooser(it, context.getString(R.string.text_send)) } - .apply { addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) } - .let { context.startActivity(it) } + IntentUtils.sendFile( + context, + file.path, + AppFileProvider.AUTHORITY, + ToastExceptionHolder(context), + ) } } diff --git a/app/src/main/java/org/autojs/autojs/network/UpdateChecker.java b/app/src/main/java/org/autojs/autojs/network/UpdateChecker.java index 23850e83..602b51e2 100644 --- a/app/src/main/java/org/autojs/autojs/network/UpdateChecker.java +++ b/app/src/main/java/org/autojs/autojs/network/UpdateChecker.java @@ -23,6 +23,7 @@ import org.autojs.autojs.annotation.Lazy; import org.autojs.autojs.core.pref.Language; import org.autojs.autojs.core.pref.Pref; import org.autojs.autojs.core.ui.widget.CustomSnackbar; +import org.autojs.autojs.external.fileprovider.AppFileProvider; import org.autojs.autojs.network.api.StreamingUrlApi; import org.autojs.autojs.network.download.DownloadManager; import org.autojs.autojs.network.entity.ExtendedVersionInfo; @@ -31,6 +32,7 @@ import org.autojs.autojs.tool.SimpleObserver; import org.autojs.autojs.ui.settings.DisplayVersionHistoriesActivity; import org.autojs.autojs.util.AndroidUtils; import org.autojs.autojs.util.IntentUtils; +import org.autojs.autojs.util.IntentUtils.ToastExceptionHolder; import org.autojs.autojs.util.TextUtils; import org.autojs.autojs.util.UpdateUtils; import org.autojs.autojs.util.ViewUtils; @@ -241,7 +243,12 @@ public class UpdateChecker { private void download(Context context, VersionInfo versionInfo) { Consumer onNext = file -> { mUpdateDialog = null; - IntentUtils.installApk(context, file.getPath()); + IntentUtils.installApk( + context, + file.getPath(), + AppFileProvider.AUTHORITY, + new ToastExceptionHolder(context) + ); }; Consumer onError = e -> { diff --git a/app/src/main/java/org/autojs/autojs/runtime/api/AppUtils.kt b/app/src/main/java/org/autojs/autojs/runtime/api/AppUtils.kt index dfb91052..43b4bf19 100644 --- a/app/src/main/java/org/autojs/autojs/runtime/api/AppUtils.kt +++ b/app/src/main/java/org/autojs/autojs/runtime/api/AppUtils.kt @@ -5,11 +5,14 @@ import android.content.Context import android.content.Intent import android.content.pm.ApplicationInfo import android.content.pm.PackageManager -import android.content.pm.PackageManager.* +import android.content.pm.PackageManager.ApplicationInfoFlags +import android.content.pm.PackageManager.GET_META_DATA +import android.content.pm.PackageManager.NameNotFoundException +import android.content.pm.PackageManager.PackageInfoFlags import android.graphics.drawable.Drawable -import android.net.Uri import android.os.Build import android.util.Log +import androidx.core.net.toUri import org.autojs.autojs.annotation.ScriptInterface import org.autojs.autojs.app.GlobalAppContext import org.autojs.autojs.external.fileprovider.AppFileProvider @@ -33,7 +36,7 @@ import org.autojs.autojs.runtime.api.augment.app.App as AugmentableApp * Created by Stardust on Apr 2, 2017. * Modified by SuperMonster003 as of Jul 13, 2022. */ -class AppUtils(context: Context, @get:ScriptInterface val fileProviderAuthority: String? = AppFileProvider.AUTHORITY) { +class AppUtils(context: Context, @get:ScriptInterface val fileProviderAuthority: String = AppFileProvider.AUTHORITY) { private val mContext: Context = context private val mPackageManager = mContext.packageManager @@ -155,16 +158,27 @@ class AppUtils(context: Context, @get:ScriptInterface val fileProviderAuthority: @ScriptInterface fun uninstall(packageName: String) { - Intent(Intent.ACTION_DELETE, Uri.parse("package:$packageName")) + Intent(Intent.ACTION_DELETE, "package:$packageName".toUri()) .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) .let { mContext.startActivity(it) } } @ScriptInterface - fun viewFile(path: String) = IntentUtils.viewFile(mContext, path, fileProviderAuthority) + fun viewFile(path: String) = IntentUtils.viewFile( + context = mContext, + path = path, + mimeType = null, + fileProviderAuthority = fileProviderAuthority, + exceptionHolder = IntentUtils.ToastExceptionHolder(mContext), + ) @ScriptInterface - fun editFile(path: String) = IntentUtils.editFile(mContext, path, fileProviderAuthority) + fun editFile(path: String) = IntentUtils.editFile( + context = mContext, + path = path, + fileProviderAuthority = fileProviderAuthority, + exceptionHolder = IntentUtils.ToastExceptionHolder(mContext), + ) @ScriptInterface fun openUrl(url: String) { diff --git a/app/src/main/java/org/autojs/autojs/runtime/api/Images.java b/app/src/main/java/org/autojs/autojs/runtime/api/Images.java index 050d0ea3..535d29ef 100644 --- a/app/src/main/java/org/autojs/autojs/runtime/api/Images.java +++ b/app/src/main/java/org/autojs/autojs/runtime/api/Images.java @@ -11,6 +11,7 @@ import android.graphics.Paint; import android.media.Image; import android.os.Build; import android.os.Handler; +import android.os.Looper; import android.util.Base64; import android.util.Log; import android.view.Gravity; @@ -190,7 +191,7 @@ public class Images { public ScriptPromiseAdapter requestScreenCapture(int orientation, int width, int height, boolean isAsync) { ScriptPromiseAdapter promiseAdapter = new ScriptPromiseAdapter(); if (mScreenCapturer == null) { - Handler handler = isAsync ? new Handler() : new Handler(mScriptRuntime.loopers.getServantLooper()); + Handler handler = isAsync ? new Handler(Looper.getMainLooper()) : new Handler(mScriptRuntime.loopers.getServantLooper()); Context contextForRequest = mScriptRuntime.app.getCurrentActivity(); if (contextForRequest == null) contextForRequest = mContext; mScreenCaptureRequester = new ScreenCaptureRequester(); diff --git a/app/src/main/java/org/autojs/autojs/ui/edit/EditorMenu.java b/app/src/main/java/org/autojs/autojs/ui/edit/EditorMenu.java index b2fa37a6..e4a57492 100644 --- a/app/src/main/java/org/autojs/autojs/ui/edit/EditorMenu.java +++ b/app/src/main/java/org/autojs/autojs/ui/edit/EditorMenu.java @@ -23,6 +23,7 @@ import org.autojs.autojs.ui.project.BuildActivity; import org.autojs.autojs.util.ClipboardUtils; import org.autojs.autojs.util.ConsoleUtils; import org.autojs.autojs.util.IntentUtils; +import org.autojs.autojs.util.IntentUtils.ToastExceptionHolder; import org.autojs.autojs.util.ViewUtils; import org.autojs.autojs6.R; @@ -198,7 +199,11 @@ public class EditorMenu { var executionInfo = JavaScriptFileSource.parseExecutionMode(mEditor.getText()); mEditor.insert(executionInfo.getLineno(), item.getImportText() + ";\n"); }) - .onNeutral((ignored, which) -> IntentUtils.browse(mContext, item.getUrl())) + .onNeutral((ignored, which) -> IntentUtils.browse( + mContext, + item.getUrl(), + new ToastExceptionHolder(mContext) + )) .onAny((ignored, which) -> dialog.dismiss()) .show(); } diff --git a/app/src/main/java/org/autojs/autojs/ui/explorer/ExplorerView.kt b/app/src/main/java/org/autojs/autojs/ui/explorer/ExplorerView.kt index 2c94b71f..12b153fc 100644 --- a/app/src/main/java/org/autojs/autojs/ui/explorer/ExplorerView.kt +++ b/app/src/main/java/org/autojs/autojs/ui/explorer/ExplorerView.kt @@ -21,7 +21,6 @@ import io.reactivex.Completable import io.reactivex.Observable import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.schedulers.Schedulers -import org.autojs.autojs.app.GlobalAppContext import org.autojs.autojs.core.pref.Pref.getInt import org.autojs.autojs.core.pref.Pref.getLinkedList import org.autojs.autojs.core.pref.Pref.getStringOrNull @@ -30,7 +29,6 @@ import org.autojs.autojs.core.pref.Pref.putLinkedList import org.autojs.autojs.core.pref.Pref.putString import org.autojs.autojs.core.pref.Pref.remove import org.autojs.autojs.extension.ViewExtensions.setForceShowIconCompat -import org.autojs.autojs.external.fileprovider.AppFileProvider import org.autojs.autojs.groundwork.WrapContentGridLayoutManger import org.autojs.autojs.model.explorer.Explorer import org.autojs.autojs.model.explorer.ExplorerChangeEvent @@ -65,7 +63,6 @@ import org.autojs.autojs.ui.widget.FirstCharView import org.autojs.autojs.util.ColorUtils import org.autojs.autojs.util.EnvironmentUtils.externalStoragePath import org.autojs.autojs.util.FileUtils -import org.autojs.autojs.util.IntentUtils import org.autojs.autojs.util.Observers import org.autojs.autojs.util.ViewUtils.showSnack import org.autojs.autojs.util.WorkingDirectoryUtils @@ -669,8 +666,6 @@ open class ExplorerView : ThemeColorSwipeRefreshLayout, SwipeRefreshLayout.OnRef internal inner class ExplorerItemViewHolder(itemView: View) : BindableViewHolder(itemView) { - private val globalAppContext by lazy { GlobalAppContext.get() } - private val mFirstChar: FirstCharView private val mName: TextView @@ -841,7 +836,7 @@ open class ExplorerView : ThemeColorSwipeRefreshLayout, SwipeRefreshLayout.OnRef notifyItemOperated() } mExplorerItem.isMediaPlayable -> { - mExplorerItem.play(context) + mExplorerItem.play(this@ExplorerView) notifyItemOperated() } } @@ -854,7 +849,7 @@ open class ExplorerView : ThemeColorSwipeRefreshLayout, SwipeRefreshLayout.OnRef notifyItemOperated() } mExplorerItem.isExternalEditable -> { - IntentUtils.editFile(globalAppContext, mExplorerItem.path, AppFileProvider.AUTHORITY) + mExplorerItem.edit(this@ExplorerView) notifyItemOperated() } } @@ -876,11 +871,11 @@ open class ExplorerView : ThemeColorSwipeRefreshLayout, SwipeRefreshLayout.OnRef private fun install() { when { mExplorerItem.isInstallable -> { - mExplorerItem.install(context) + mExplorerItem.install(this@ExplorerView) notifyItemOperated() } else -> { - IntentUtils.viewFile(globalAppContext, mExplorerItem.path) + mExplorerItem.view(this@ExplorerView) notifyItemOperated() } } diff --git a/app/src/main/java/org/autojs/autojs/ui/main/scripts/ApkInfoDialogManager.kt b/app/src/main/java/org/autojs/autojs/ui/main/scripts/ApkInfoDialogManager.kt index 77fda3fc..b4d18f37 100644 --- a/app/src/main/java/org/autojs/autojs/ui/main/scripts/ApkInfoDialogManager.kt +++ b/app/src/main/java/org/autojs/autojs/ui/main/scripts/ApkInfoDialogManager.kt @@ -20,9 +20,11 @@ import net.dongliu.apk.parser.ApkFile import org.autojs.autojs.extension.MaterialDialogExtensions.makeSettingsLaunchable import org.autojs.autojs.extension.MaterialDialogExtensions.makeTextCopyable import org.autojs.autojs.extension.MaterialDialogExtensions.setCopyableTextIfAbsent +import org.autojs.autojs.external.fileprovider.AppFileProvider import org.autojs.autojs.pio.PFiles import org.autojs.autojs.runtime.api.AppUtils import org.autojs.autojs.util.IntentUtils +import org.autojs.autojs.util.IntentUtils.ToastExceptionHolder import org.autojs.autojs6.R import org.autojs.autojs6.databinding.ApkFileInfoDialogListItemBinding import java.io.File @@ -49,7 +51,12 @@ object ApkInfoDialogManager { .positiveColorRes(R.color.dialog_button_attraction) .onPositive { materialDialog, _ -> materialDialog.dismiss() - IntentUtils.installApk(context, apkFilePath) + IntentUtils.installApk( + context = context, + path = apkFilePath, + fileProviderAuthority = AppFileProvider.AUTHORITY, + exceptionHolder = ToastExceptionHolder(context), + ) } .negativeText(R.string.text_cancel) .negativeColorRes(R.color.dialog_button_default) diff --git a/app/src/main/java/org/autojs/autojs/ui/main/scripts/ExplorerFragment.kt b/app/src/main/java/org/autojs/autojs/ui/main/scripts/ExplorerFragment.kt index cfdfcd44..620af1a8 100644 --- a/app/src/main/java/org/autojs/autojs/ui/main/scripts/ExplorerFragment.kt +++ b/app/src/main/java/org/autojs/autojs/ui/main/scripts/ExplorerFragment.kt @@ -14,6 +14,7 @@ import com.google.android.material.floatingactionbutton.FloatingActionButton import com.google.android.material.tabs.TabLayout import io.reactivex.android.schedulers.AndroidSchedulers import org.autojs.autojs.app.GlobalAppContext +import org.autojs.autojs.external.fileprovider.AppFileProvider import org.autojs.autojs.model.explorer.ExplorerItem import org.autojs.autojs.model.script.Scripts import org.autojs.autojs.tool.SimpleObserver @@ -29,6 +30,8 @@ import org.autojs.autojs.ui.main.ViewStatesManageable import org.autojs.autojs.ui.project.ProjectConfigActivity import org.autojs.autojs.ui.widget.ScrollAwareFABBehavior import org.autojs.autojs.util.IntentUtils +import org.autojs.autojs.util.IntentUtils.SnackExceptionHolder +import org.autojs.autojs.util.IntentUtils.ToastExceptionHolder import org.autojs.autojs.util.ViewUtils import org.autojs.autojs6.R import org.autojs.autojs6.databinding.FragmentExplorerBinding @@ -103,7 +106,17 @@ class ExplorerFragment : ViewPagerFragment(0), OnFloatingActionButtonClickListen } } - private fun viewFile(item: ExplorerItem) = IntentUtils.viewFile(GlobalAppContext.get(), item.path) + private fun viewFile(item: ExplorerItem): Boolean { + val context = context ?: GlobalAppContext.get() + val exceptionHolder = view?.let { SnackExceptionHolder(it) } ?: ToastExceptionHolder(context) + return IntentUtils.viewFile( + context = context, + path = item.path, + mimeType = null, + fileProviderAuthority = AppFileProvider.AUTHORITY, + exceptionHolder = exceptionHolder, + ) + } override fun onFabClick(fab: FloatingActionButton) { // initFloatingActionMenuIfNeeded(fab).run { if (isExpanded) collapse() else expand() } diff --git a/app/src/main/java/org/autojs/autojs/ui/project/BuildActivity.java b/app/src/main/java/org/autojs/autojs/ui/project/BuildActivity.java index 66d5a12b..a223d9b3 100644 --- a/app/src/main/java/org/autojs/autojs/ui/project/BuildActivity.java +++ b/app/src/main/java/org/autojs/autojs/ui/project/BuildActivity.java @@ -36,6 +36,7 @@ import org.autojs.autojs.apkbuilder.ApkBuilder; import org.autojs.autojs.apkbuilder.keystore.KeyStore; import org.autojs.autojs.core.pref.Language; import org.autojs.autojs.extension.MaterialDialogExtensions; +import org.autojs.autojs.external.fileprovider.AppFileProvider; import org.autojs.autojs.model.explorer.Explorers; import org.autojs.autojs.model.script.ScriptFile; import org.autojs.autojs.project.ProjectConfig; @@ -56,6 +57,7 @@ import org.autojs.autojs.util.AndroidUtils.Abi; import org.autojs.autojs.util.BitmapUtils; import org.autojs.autojs.util.EnvironmentUtils; import org.autojs.autojs.util.IntentUtils; +import org.autojs.autojs.util.IntentUtils.ToastExceptionHolder; import org.autojs.autojs.util.ViewUtils; import org.autojs.autojs.util.WorkingDirectoryUtils; import org.autojs.autojs6.R; @@ -987,7 +989,12 @@ public class BuildActivity extends BaseActivity implements ApkBuilder.ProgressCa .content(getString(R.string.format_build_succeeded, outApk.getPath())) .positiveText(R.string.text_install) .positiveColorRes(R.color.dialog_button_attraction) - .onPositive((dialog, which) -> IntentUtils.installApk(BuildActivity.this, outApk.getPath())) + .onPositive((dialog, which) -> IntentUtils.installApk( + BuildActivity.this, + outApk.getPath(), + AppFileProvider.AUTHORITY, + new ToastExceptionHolder(BuildActivity.this) + )) .negativeText(R.string.text_cancel) .negativeColorRes(R.color.dialog_button_default) .neutralText(R.string.dialog_button_file_information) diff --git a/app/src/main/java/org/autojs/autojs/util/IntentUtils.kt b/app/src/main/java/org/autojs/autojs/util/IntentUtils.kt index 39367ff1..c99b900b 100644 --- a/app/src/main/java/org/autojs/autojs/util/IntentUtils.kt +++ b/app/src/main/java/org/autojs/autojs/util/IntentUtils.kt @@ -5,7 +5,10 @@ import android.content.Context import android.content.Intent import android.net.Uri import android.provider.Settings +import android.view.View import androidx.core.content.FileProvider +import androidx.core.net.toUri +import com.google.android.material.snackbar.Snackbar import org.autojs.autojs.external.fileprovider.AppFileProvider import org.autojs.autojs.runtime.api.Mime import org.autojs.autojs6.R @@ -17,7 +20,7 @@ object IntentUtils { true.also { @Suppress("SpellCheckingInspection") val url = "mqqwpa://im/chat?chat_type=wpa&uin=$qq" - Intent(Intent.ACTION_VIEW, Uri.parse(url)) + Intent(Intent.ACTION_VIEW, url.toUri()) .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) .let { context.startActivity(it) } } @@ -29,7 +32,7 @@ object IntentUtils { true.also { @Suppress("SpellCheckingInspection") val url = "mqqopensdkapi://bizAgent/qm/qr?url=http%3A%2F%2Fqm.qq.com%2Fcgi-bin%2Fqm%2Fqr%3Ffrom%3Dapp%26p%3Dandroid%26k%3D$key" - Intent(Intent.ACTION_VIEW, Uri.parse(url)) + Intent(Intent.ACTION_VIEW, url.toUri()) .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) .let { context.startActivity(it) } } @@ -40,7 +43,7 @@ object IntentUtils { @JvmOverloads fun sendMailTo(context: Context, sendTo: String, title: String? = null, content: String? = null) = try { true.also { - Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:$sendTo")).apply { + Intent(Intent.ACTION_SENDTO, "mailto:$sendTo".toUri()).apply { addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) putExtra(Intent.EXTRA_CC, /* email */ arrayOf(sendTo)) title?.let { putExtra(Intent.EXTRA_SUBJECT, it) } @@ -52,17 +55,18 @@ object IntentUtils { } @JvmStatic - fun browse(context: Context, link: String?) = try { + @JvmOverloads + fun browse(context: Context, link: String, exceptionHolder: ExceptionHolder? = null) = try { true.also { - Intent(Intent.ACTION_VIEW, Uri.parse(link)) + Intent(Intent.ACTION_VIEW, link.toUri()) .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) .let { context.startActivity(it) } } - } catch (ignored: ActivityNotFoundException) { - false.also { - ViewUtils.showToast(context, R.string.text_no_browser, true) - } + } catch (e: ActivityNotFoundException) { + exceptionHolder?.show(R.string.error_no_applications_available_for_browsing_this_link) + // ViewUtils.showToast(context, R.string.text_no_browser, true) + false.also { e.printStackTrace() } } fun shareText(context: Context, text: String?) = try { @@ -73,9 +77,7 @@ object IntentUtils { .let { context.startActivity(it) } } } catch (e: ActivityNotFoundException) { - false.also { - e.printStackTrace() - } + false.also { e.printStackTrace() } } @JvmOverloads @@ -84,16 +86,21 @@ object IntentUtils { Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).apply { addCategory(Intent.CATEGORY_DEFAULT) addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) - data = Uri.parse("package:$packageName") + data = "package:$packageName".toUri() }.let { context.startActivity(it) } } - } catch (ignored: ActivityNotFoundException) { + } catch (_: ActivityNotFoundException) { false } @JvmStatic @JvmOverloads - fun installApk(context: Context, path: String, fileProviderAuthority: String? = AppFileProvider.AUTHORITY) = try { + fun installApk( + context: Context, + path: String, + fileProviderAuthority: String = AppFileProvider.AUTHORITY, + exceptionHolder: ExceptionHolder? = null, + ) = try { Intent(Intent.ACTION_VIEW) .setDataAndType( getUriOfFile(context, path, fileProviderAuthority), @@ -105,8 +112,9 @@ object IntentUtils { .let { context.startActivity(it) } true } catch (e: ActivityNotFoundException) { + exceptionHolder?.show(R.string.error_no_applications_available_for_installing_this_file) + // ViewUtils.showToast(context, R.string.text_activity_not_found_for_apk_installing) e.printStackTrace() - ViewUtils.showToast(context, R.string.text_activity_not_found_for_apk_installing) false } @@ -116,51 +124,70 @@ object IntentUtils { fun getUriOfFile(context: Context, path: String?, fileProviderAuthority: String? = AppFileProvider.AUTHORITY): Uri { return fileProviderAuthority?.let { FileProvider.getUriForFile(context, it, File(path ?: "")) - } ?: Uri.parse("file://$path") + } ?: "file://$path".toUri() } @JvmStatic - fun viewFile(context: Context, path: String, fileProviderAuthority: String? = AppFileProvider.AUTHORITY): Boolean { + fun viewFile(context: Context, path: String, fileProviderAuthority: String = AppFileProvider.AUTHORITY): Boolean { return viewFile(context, path, Mime.fromFileOr(path, Mime.WILDCARD), fileProviderAuthority) } @JvmStatic @JvmOverloads - fun viewFile(context: Context, uri: Uri, mimeType: String?, fileProviderAuthority: String? = AppFileProvider.AUTHORITY): Boolean { - if (uri.scheme == "file") { - return uri.path?.let { viewFile(context, it, mimeType, fileProviderAuthority) } ?: false - } - return try { - true.also { - Intent(Intent.ACTION_VIEW) - .setDataAndType(uri, mimeType) - .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) - .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) - .addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION) - .let { context.startActivity(it) } - } - } catch (e: Exception) { - false.also { e.printStackTrace() } + fun viewFile( + context: Context, + uri: Uri, + mimeType: String? = null, + fileProviderAuthority: String = AppFileProvider.AUTHORITY, + exceptionHolder: ExceptionHolder? = null, + ): Boolean = when (uri.scheme) { + uri.scheme -> { + uri.path?.let { viewFile(context, it, mimeType, fileProviderAuthority) } ?: false } + else -> launchViewIntent(context, uri, mimeType, exceptionHolder) } @JvmStatic - fun viewFile(context: Context, path: String, mimeType: String?, fileProviderAuthority: String? = AppFileProvider.AUTHORITY) = try { + fun viewFile( + context: Context, + path: String, + mimeType: String? = null, + fileProviderAuthority: String = AppFileProvider.AUTHORITY, + exceptionHolder: ExceptionHolder? = null, + ) = launchViewIntent( + context = context, + uri = getUriOfFile(context, path, fileProviderAuthority), + mimeType = mimeType ?: Mime.fromFileOrWildcard(path), + exceptionHolder = exceptionHolder, + ) + + private fun launchViewIntent( + context: Context, + uri: Uri, + mimeType: String?, + exceptionHolder: ExceptionHolder? = null, + ) = try { true.also { Intent(Intent.ACTION_VIEW) - .setDataAndType(getUriOfFile(context, path, fileProviderAuthority), mimeType) + .setDataAndType(uri, mimeType) .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) .addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION) .let { context.startActivity(it) } } - } catch (e: ActivityNotFoundException) { + } catch (e: Exception) { + exceptionHolder?.show(R.string.error_no_applications_available_for_viewing_this_file) false.also { e.printStackTrace() } } @JvmStatic @JvmOverloads - fun editFile(context: Context, path: String, fileProviderAuthority: String? = AppFileProvider.AUTHORITY) = try { + fun editFile( + context: Context, + path: String, + fileProviderAuthority: String = AppFileProvider.AUTHORITY, + exceptionHolder: ExceptionHolder? = null, + ) = try { true.also { Intent(Intent.ACTION_EDIT) .setDataAndType( @@ -173,6 +200,28 @@ object IntentUtils { .let { context.startActivity(it) } } } catch (e: ActivityNotFoundException) { + exceptionHolder?.show(R.string.error_no_applications_available_for_editing_this_file) + false.also { e.printStackTrace() } + } + + @JvmStatic + @JvmOverloads + fun sendFile( + context: Context, + path: String, + fileProviderAuthority: String = AppFileProvider.AUTHORITY, + exceptionHolder: ExceptionHolder? = null, + ) = try { + true.also { + Intent(Intent.ACTION_SEND) + .setType("text/plain") + .putExtra(Intent.EXTRA_STREAM, getUriOfFile(context, path, fileProviderAuthority)) + .let { Intent.createChooser(it, context.getString(R.string.text_send)) } + .apply { addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) } + .let { context.startActivity(it) } + } + } catch (e: ActivityNotFoundException) { + exceptionHolder?.show(R.string.error_no_applications_available_for_sending_this_file) false.also { e.printStackTrace() } } @@ -184,4 +233,61 @@ object IntentUtils { e.printStackTrace() } + data class SnackExceptionHolder @JvmOverloads constructor( + private val view: View, + private val overriddenMessage: String? = null, + private val duration: Int = Snackbar.LENGTH_LONG, + ) : ExceptionHolder { + + @JvmOverloads + constructor( + view: View, + overriddenMessageRes: Int, + duration: Int = Snackbar.LENGTH_LONG, + ) : this( + view = view, + overriddenMessage = view.context.getString(overriddenMessageRes), + duration = duration, + ) + + override fun show(message: String?) { + ViewUtils.showSnack(view, overriddenMessage ?: message ?: "Failed to start an activity", duration) + } + + override fun show(messageRes: Int) { + show(view.context.getString(messageRes)) + } + } + + data class ToastExceptionHolder @JvmOverloads constructor( + private val context: Context, + private val overriddenMessage: String? = null, + private val isLong: Boolean = true, + ) : ExceptionHolder { + + @JvmOverloads + constructor( + context: Context, + overriddenMessageRes: Int, + isLong: Boolean = true, + ) : this( + context = context, + overriddenMessage = context.getString(overriddenMessageRes), + isLong = isLong, + ) + + override fun show(message: String?) { + ViewUtils.showToast(context, overriddenMessage ?: message ?: "Failed to start an activity", isLong) + } + + override fun show(messageRes: Int) { + show(context.getString(messageRes)) + } + } + + interface ExceptionHolder { + fun show(message: String? = null) + fun show(messageRes: Int) + } + } \ No newline at end of file diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 9230028d..f2ef0b7d 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -1042,5 +1042,11 @@ كتابة إعدادات النظام إخفاء هذه العقدة إخفاء العقدة ذات الإطار المماثل + لا توجد تطبيقات متاحة لتحرير هذا الملف + لا توجد تطبيقات متاحة لاستعراض هذا الرابط + لا توجد تطبيقات متاحة لتثبيت هذا الملف + لا توجد تطبيقات متاحة لعرض هذا الملف + لا توجد تطبيقات متاحة لإرسال هذا الملف + لا توجد تطبيقات متاحة لتشغيل هذا الملف diff --git a/app/src/main/res/values-en/strings.xml b/app/src/main/res/values-en/strings.xml index 185f46cc..9302d16d 100644 --- a/app/src/main/res/values-en/strings.xml +++ b/app/src/main/res/values-en/strings.xml @@ -1037,5 +1037,11 @@ Write system settings Hide this node Hide same frame nodes + No applications available for editing this file + No applications available for browsing this link + No applications available for installing this file + No applications available for viewing this file + No applications available for sending this file + No applications available for playing this file diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index d77f6fab..4044f704 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -1040,5 +1040,11 @@ Escribir la configuración del sistema Ocultar este nodo Ocultar nodo del mismo marco + No hay aplicaciones disponibles para editar este archivo + No hay aplicaciones disponibles para abrir este enlace + No hay aplicaciones disponibles para instalar este archivo + No hay aplicaciones disponibles para ver este archivo + No hay aplicaciones disponibles para enviar este archivo + No hay aplicaciones disponibles para reproducir este archivo diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 646388ef..03d6b118 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -1040,5 +1040,11 @@ Écrire les paramètres système Masquer ce nœud Masquer le nœud du même cadre + Aucune application disponible pour modifier ce fichier + Aucune application disponible pour parcourir ce lien + Aucune application disponible pour installer ce fichier + Aucune application disponible pour afficher ce fichier + Aucune application disponible pour envoyer ce fichier + Aucune application disponible pour lire ce fichier diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index a7db2fbf..ebc4c5a8 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -1041,5 +1041,11 @@ システム設定の書き込み このノードを隠す 同じフレームのノードを隠す + このファイルを編集できるアプリがありません + このリンクを閲覧できるアプリがありません + このファイルをインストールできるアプリがありません + このファイルを表示できるアプリがありません + このファイルを送信できるアプリがありません + このファイルを再生できるアプリがありません diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 3dffdb49..04dd3ee9 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -1042,5 +1042,11 @@ 시스템 설정을 작성하십시오 이 노드를 숨기기 동일 프레임의 노드를 숨기기 + 이 파일을 편집할 수 있는 앱이 없습니다 + 이 링크를 탐색할 수 있는 앱이 없습니다 + 이 파일을 설치할 수 있는 앱이 없습니다 + 이 파일을 볼 수 있는 앱이 없습니다 + 이 파일을 전송할 수 있는 앱이 없습니다 + 이 파일을 재생할 수 있는 앱이 없습니다 diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 9ae86226..5672bc26 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -1040,5 +1040,11 @@ Запись системных настроек Скрыть этот узел Скрыть узел того же фрейма + Нет приложений для редактирования этого файла + Нет приложений для просмотра этой ссылки + Нет приложений для установки этого файла + Нет приложений для просмотра этого файла + Нет приложений для отправки этого файла + Нет приложений для воспроизведения этого файла diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index c11d6cfd..a45726e3 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -1038,5 +1038,11 @@ 修改系統設置 隱藏此節點 隱藏同框節點 + 未找到用於編輯該文件的應用 + 未找到用於瀏覽該鏈接的應用 + 未找到用於安裝該文件的應用 + 未找到用於查看該文件的應用 + 未找到用於發送該文件的應用 + 未找到用於播放該文件的應用 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 29834b02..d2929922 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -1038,5 +1038,11 @@ 修改系統設定 隱藏此節點 隱藏同框節點 + 未找到用於編輯該檔案的應用 + 未找到用於瀏覽該連結的應用 + 未找到用於安裝該檔案的應用 + 未找到用於檢視該檔案的應用 + 未找到用於傳送該檔案的應用 + 未找到用於播放該檔案的應用 diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index 510d73be..994f0d3a 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -1038,5 +1038,11 @@ 修改系统设置 隐藏此节点 隐藏同框节点 + 未找到用于编辑该文件的应用 + 未找到用于浏览该链接的应用 + 未找到用于安装该文件的应用 + 未找到用于查看该文件的应用 + 未找到用于发送该文件的应用 + 未找到用于播放该文件的应用 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d9774b78..ca5f1d15 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1268,5 +1268,11 @@ Write system settings Hide this node Hide same frame nodes + No applications available for editing this file + No applications available for browsing this link + No applications available for installing this file + No applications available for viewing this file + No applications available for sending this file + No applications available for playing this file diff --git a/version.properties b/version.properties index d7385618..1aa79ad3 100644 --- a/version.properties +++ b/version.properties @@ -1,5 +1,5 @@ -#Wed May 14 23:13:52 CST 2025 -BUILD_TIME=1747235632440 +#Thu May 15 15:32:42 CST 2025 +BUILD_TIME=1747294362850 COMPILE_SDK_VERSION=35 JAVA_VERSION=24 JAVA_VERSION_MIN_RADICAL=0 @@ -17,6 +17,6 @@ RAPID_OCR_OPENCV_MOBILE_LABEL_VERSION=13 RAPID_OCR_OPENCV_MOBILE_VERSION=4.5.3 TARGET_SDK_VERSION=35 TARGET_SDK_VERSION_INRT=29 -VERSION_BUILD=3220 +VERSION_BUILD=3223 VERSION_NAME=6.6.3 Alpha4 VSCODE_EXT_REQUIRED_VERSION=1.0.8