From 1706c287c6f61dfe0ee0a32247e413cd8a030eaf Mon Sep 17 00:00:00 2001 From: power690 <2103890018@qq.com> Date: Sat, 13 Jun 2026 04:20:44 +0000 Subject: [PATCH 01/18] Complete Chinese (zh-CN) translation --- app/src/main/res/values-zh-rCN/strings.xml | 215 ++++++++++++++---- .../src/main/res/values-zh-rCN/strings.xml | 6 + 2 files changed, 182 insertions(+), 39 deletions(-) create mode 100644 terminal-view/src/main/res/values-zh-rCN/strings.xml diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 6fcf5fd..0f70f53 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -1,16 +1,11 @@ - + Vectras VM - - - 虚拟机已启动! 虚拟机已关闭! 无进程! 未知状态! - 要使用外接鼠标:\n\t请在虚拟机中关闭鼠标加速.\n\t\t对于X-Window,执行: xset m 1\n\t\t对于其它操作系统在 Vectras主选项中关闭\"增强指针准确性\"或者在鼠标选项中选择\"usb-tablet\" (usb-tablet为QEMU中的一个选项)\n\t接入外接鼠标后点击OK\n\t最后通过让鼠标滑至屏幕的各个边缘以校准 - 打开抽屉 收起抽屉 地址 @@ -30,13 +25,10 @@ 用户名 保存 内存使用量 - 允许外部VNC连接 显示 移除 查看日志 - - 硬件鼠标模式 ROM 名称 ROM驱动(qcow2,img等) @@ -47,9 +39,7 @@ 鼠标模式 导出 退出 - 新建虚拟机 - 下箭头 左箭头 右箭头 @@ -99,19 +89,14 @@ 作为副本保存 缩放 可缩放 - Patreon - - 再次发送按键 发送按键 用户名 用于 Windows 身份验证 终端 - 安装 修改 - 再次尝试 大小(GB) 创建 QCOW2 @@ -227,9 +212,6 @@ 运行虚拟机时出现问题: 虚拟机所需要的文件或文件夹不存在 创建新虚拟机时自动新建硬盘 它的大小为128GB - - - 新建会话 键盘 重置 @@ -237,56 +219,39 @@ 终端显示文本 保持屏幕打开 自动填充密码 - 安装中… 无法安装 Vterm 无法安装初始化包 停止 再次尝试 Vterm 只能安装在主用户帐户上 - 已达到的最大终端数 在开新的之前关闭现有项 - 重置终端 - 选择 URL 点击 URL 进行复制或长按打开 分享终端输出 在终端中找不到 URL URL 已复制到剪贴板 发送文本至: - 终止进程(%d) 真的要终止此会话吗? - 设置会话名称 确认 新命名会话 新建 - Vterm:Style 插件尚未安装 安装 - 退出 加上唤醒锁 释放唤醒锁 - 文件保存至 ~/downloads/ 编辑 打开文件夹 - - - - - - 未连接    帮助       首选项   在这里您可以像Termux一样设置一些额外按键 (可以看看 这个) 以及其余项 (e.g. META).\n 留空则使用默认值 - - 取消 返回显示界面 X11 @@ -319,7 +284,6 @@ 需要初始化! 您可以选择让软件自动下载或者选择初始化包完成手动设置 手动安装 - Alpine Xfce4 分辨率模式 缩放值(%) @@ -619,7 +583,7 @@ 删除文件时出错,稍后重试 文件已删除 打开主文件夹 - 您正在使用 X11而非 VNC。要使用 VNC,请进入设置-> QEMU,向下滚动到底部,然后在用户界面中选择"VNC"。 + 您正在使用 X11而非 VNC。要使用 VNC,请进入设置-> QEMU,向下滚动到底部,然后在用户界面中选择"VNC"。 没有可用于进行该操作的APP 文件夹不存在 共享文件夹体积不应超过516MB,请删除部分文件 @@ -732,4 +696,177 @@ 前往 Termux:X11 设置。 使用 SDL 如果您想使用 3dfx 并玩老游戏,请开启此选项(仅适用于 x86_64 和 i386)。 - + 解放巴勒斯坦 + x86_64 + 发生错误。ROM信息已损坏,已应用部分默认设置。错误代码:CR_CVBI4。 + 文件格式不受支持,可能无法正常工作。常见支持格式包括 qcow2、img、vhd、vhdx、vdi、qcow、vmdk 和 vpc。是否继续? + 文件格式不受支持,可能无法正常工作。常见支持格式包括 iso、img、cdr 和 toast。是否继续? + 文件格式不受支持,可能无法正常工作。常见支持格式包括 img、flp 和 ima。是否继续? + 镜像源 + 开始吧 + 无法复制此文件,请尝试从其他位置选择该文件。 + 使用VNC + 正在安装系统文件 + 连接中… + 您想如何安装? + 标准安装还是手动安装? + 标准安装 + 推荐方式,安装程序将自动完成所有设置。 + 自定义安装 + 如果您想手动选择引导文件并安装所需的Qemu版本。 + 选择离您最近的镜像源以加快安装速度。 + 请勿断开网络连接,这可能需要几分钟时间。 + 出了点问题 + 设置未能完成,以下是日志信息。 + 由于无法连接服务器,此选项暂时不可用。 + Vectras VM 无法在此设备上运行。 + 存储空间不足。 + 没有日志。 + 所需的软件包未安装,您需要先安装它才能使用此功能。 + 未安装 Termux:X11 应用,您需要安装它才能继续。 + 解压前检查 + 快速检测错误,避免浪费时间解压后才发现问题。 + 检查中… + 快速编辑 + 写点什么… + 切换到VNC + 首选项 + 大小 (GB) + 创建新虚拟磁盘 + 将创建在 + 共享者 + 系统更新 + 有系统更新可用,立即更新以获得完整体验。 + QEMU 文档 + 您需要切换到SDL才能使用3dfx。 + 设备管理器 + 在文件夹中显示 + 退出 + 3dfx + 刷新 + 非常抱歉,应用之前发生了崩溃。 + 虚拟鼠标 + 显示虚拟鼠标 + 隐藏虚拟鼠标 + 此引导文件无效。 + 虚拟机已创建。 + 虚拟机已编辑。 + 发生错误,虚拟机未创建。 + 发生错误,虚拟机未修改。 + 使用参数编辑器编辑 + 您可以使用参数编辑器应用来编辑此虚拟机。 + 无法保存,请稍后重试。 + 高级 + 启动 + 显示启动菜单 + 默认 + 硬盘 + 软盘 + 网络 + ROM 导出成功。 + 选项 + 添加文件 + 文件已添加 + 复制完整路径 + 添加文件失败,请稍后重试。 + 项目已清空。 + 显示回收站 + 删除虚拟机时发生错误。 + 虚拟机文件已被保留,因为它们仍在其他地方使用。 + 暂停 + 虚拟机的状态将被保存并关闭以节省资源。下次启动时将恢复到此状态。请不要更改、移动或删除此虚拟机使用的文件。 + 虚拟机正在暂停… +请不要离开此页面。 + 正在恢复… + 恢复之前暂停的虚拟机状态时出现问题。如果您在启动前修改了此虚拟机或Qemu设置,请检查是否将其更改为与上次开机时相同的设置。您想保留还是移除保存的状态? + 保留并继续 + 移除并继续 + 发生错误,无法保存虚拟机状态。请稍后重试。 + 无法打开此文件夹。 + 新通知 + 点击查看。 + 在 An Bui 应用中查看 + 您可以在此处查看和获取。 + 工具 + 3dfx 包装器 + Windows VirtIO 工具 + 需要下载 + 此工具需要先下载才能使用。下载完成后将通知您。 + 下载失败,请稍后重试。 + Windows VirtIO 工具现已就绪 + 是否立即将其插入光驱? + 试试 Play 商店版 + 输入命令 + 控制台 + 截图 + 无法截图。 + 已保存到相册。 + 正在截图… + 此虚拟机已在运行。 + 服务器正在运行 + 在虚拟机中访问此链接以访问您设备上的下载文件夹: + +%s + +您也可以从虚拟机发送文件到您设备的下载文件夹,以下是使用 curl 的示例: + +%s + 启动服务器时发生错误,请稍后重试。 + 复制链接 + 复制上传命令 + 文件夹共享服务器 + 静音 + 取消静音 + 光驱 1 + 光驱 2 + 设备已锁定,暂时无法弹出。请稍后重试。您可以尝试在此虚拟机运行的操作系统中打开设备管理器或文件管理器并请求弹出。 + 设备已锁定,暂时无法更换。请稍后重试。您可以尝试先弹出设备,然后再次尝试更换。 + 管理 + 连接 + 正在关机… + 无法保存到此处,请选择其他位置。 + 处理器 + 主板 + 核心 + 核心 + 线程 + 线程 + 刷新率 + 低刷新率 + 如果您的设备因绘制过多帧而过载,可以启用此功能以提升虚拟机性能并将刷新率降低至30。 + 全面屏 + 禁用全面屏 + 双指缩放 + 虚拟机选择器 + 切换 + 切换到 + 没有可用的虚拟机。 + 硬盘 0 + 硬盘 1 + 光驱 + 光驱 0 + 光驱 1 + 此文件已在虚拟机的其他地方使用。您需要找到并移除或重命名它,然后重新选择。 + 更高质量 + 图像质量将会提高,但如果使用外部连接,延迟会更大。 + 电池 + 准备中… + 通知 + 管理通知类型和主题。 + 建议和提示 + 接收关于我们的建议和提示的通知。 + 在系统设置中。 + 缺少的软件包 + 以下是您需要安装的缺少软件包: + 在内置和外部显示之间切换时需要重启应用。 + 包含广告 + 安全模式 + 使用 Termux:X11 应用代替内置屏幕。 + 模糊效果 + 模糊周围区域以增加对需要注意的特定区域的聚焦。 + G4 (高性能) + G4 (基本) + G2 (工作站) + G2 (低功耗) + 空白片段 + \ No newline at end of file diff --git a/terminal-view/src/main/res/values-zh-rCN/strings.xml b/terminal-view/src/main/res/values-zh-rCN/strings.xml new file mode 100644 index 0000000..85dba47 --- /dev/null +++ b/terminal-view/src/main/res/values-zh-rCN/strings.xml @@ -0,0 +1,6 @@ + + + 粘贴 + 复制 + 更多… + From 71614fa6ff1aad7f5268a960d772615deeda5fc3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Jun 2026 08:17:17 +0000 Subject: [PATCH 02/18] Bump com.google.firebase:firebase-messaging from 25.0.2 to 25.1.0 Bumps [com.google.firebase:firebase-messaging](https://github.com/firebase/firebase-android-sdk) from 25.0.2 to 25.1.0. - [Commits](https://github.com/firebase/firebase-android-sdk/commits) --- updated-dependencies: - dependency-name: com.google.firebase:firebase-messaging dependency-version: 25.1.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index bbbcc1e..7bcd270 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -13,7 +13,7 @@ drawerlayout = "1.2.0" espressoCore = "3.7.0" firebaseBom = "34.14.1" firebaseCrashlyticsGradle = "3.0.7" -firebaseMessaging = "25.0.2" +firebaseMessaging = "25.1.0" glide = "5.0.7" googleFirebase = "firebase-analytics" googleFirebaseCrashlytics = "3.0.7" From 56dd71a3556608b4d63465fa9abcb22e18726ad7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Jun 2026 08:17:20 +0000 Subject: [PATCH 03/18] Bump com.google.firebase:firebase-bom from 34.14.1 to 34.15.0 Bumps com.google.firebase:firebase-bom from 34.14.1 to 34.15.0. --- updated-dependencies: - dependency-name: com.google.firebase:firebase-bom dependency-version: 34.15.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index bbbcc1e..b7e932d 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -11,7 +11,7 @@ coreKtx = "1.19.0" documentfile = "1.1.0" drawerlayout = "1.2.0" espressoCore = "3.7.0" -firebaseBom = "34.14.1" +firebaseBom = "34.15.0" firebaseCrashlyticsGradle = "3.0.7" firebaseMessaging = "25.0.2" glide = "5.0.7" From 6b00df578515f3bc82955c7af43229b21f4963de Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Jun 2026 08:17:43 +0000 Subject: [PATCH 04/18] Bump gradle-wrapper from 9.5.0 to 9.6.0 Bumps [gradle-wrapper](https://github.com/gradle/gradle) from 9.5.0 to 9.6.0. - [Release notes](https://github.com/gradle/gradle/releases) - [Commits](https://github.com/gradle/gradle/compare/v9.5.0...v9.6.0) --- updated-dependencies: - dependency-name: gradle-wrapper dependency-version: 9.6.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- gradle/wrapper/gradle-wrapper.properties | 4 ++-- gradlew | 4 ++-- gradlew.bat | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 4b271a6..65d8749 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionSha256Sum=553c78f50dafcd54d65b9a444649057857469edf836431389695608536d6b746 -distributionUrl=https\://services.gradle.org/distributions/gradle-9.5.0-bin.zip +distributionSha256Sum=bbaeb2fef8710818cf0e261201dab964c572f92b942812df0c3620d62a529a01 +distributionUrl=https\://services.gradle.org/distributions/gradle-9.6.0-bin.zip networkTimeout=10000 retries=0 retryBackOffMs=500 diff --git a/gradlew b/gradlew index b9bb139..249efbb 100755 --- a/gradlew +++ b/gradlew @@ -20,7 +20,7 @@ ############################################################################## # -# Gradle start up script for POSIX generated by Gradle. +# gradlew start up script for POSIX generated by Gradle. # # Important for running: # @@ -29,7 +29,7 @@ # bash, then to run this script, type that shell name before the whole # command line, like: # -# ksh Gradle +# ksh gradlew # # Busybox and similar reduced shells will NOT work, because this script # requires all of these POSIX shell features: diff --git a/gradlew.bat b/gradlew.bat index aa5f10b..8508ef6 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -19,7 +19,7 @@ @if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem -@rem Gradle startup script for Windows +@rem gradlew startup script for Windows @rem @rem ########################################################################## @@ -72,7 +72,7 @@ echo location of your Java installation. 1>&2 -@rem Execute Gradle +@rem Execute gradlew @rem endlocal doesn't take effect until after the line is parsed and variables are expanded @rem which allows us to clear the local environment before executing the java command endlocal & "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* & call :exitWithErrorLevel From a531e2331b18cc504f9bfb48e86480a4259110d5 Mon Sep 17 00:00:00 2001 From: An Bui <91354810+AnBui2004@users.noreply.github.com> Date: Mon, 29 Jun 2026 14:06:49 +0700 Subject: [PATCH 05/18] Update bug.yaml --- .github/ISSUE_TEMPLATE/bug.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/ISSUE_TEMPLATE/bug.yaml b/.github/ISSUE_TEMPLATE/bug.yaml index 1e7cf9c..a8b2edb 100644 --- a/.github/ISSUE_TEMPLATE/bug.yaml +++ b/.github/ISSUE_TEMPLATE/bug.yaml @@ -32,6 +32,7 @@ body: options: - Latest - Beta + - 4.3.0 - 4.2.0 - 4.1.0 - 4.0.0 From 1735664e6c0e2fa2c55e94550dc89494adbb603c Mon Sep 17 00:00:00 2001 From: An Bui <91354810+AnBui2004@users.noreply.github.com> Date: Wed, 1 Jul 2026 20:43:58 +0700 Subject: [PATCH 06/18] Update vroms-store.json --- web/data/vroms-store.json | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/web/data/vroms-store.json b/web/data/vroms-store.json index 96362da..a5ef1ad 100644 --- a/web/data/vroms-store.json +++ b/web/data/vroms-store.json @@ -1541,6 +1541,26 @@ "vecid": "windows10mobilecvbi", "id": "99672" }, + { + "rom_name": "Windows 10 S 1709 ARM64 build 16299", + "rom_icon": "https://vuetiwuvbyxywfukompp.supabase.co/storage/v1/object/public/getmyos/v1/files/2018/09/17/windows-logo_1_926ed76111646acbbe332bc5af0cf2ce.png", + "rom_url": "https://youtu.be/2csyaU2w8dk", + "rom_path": "Windows 10 S ARM64 build 16299.cvbi", + "rom_avail": true, + "gui": true, + "rom_size": "Fall Creators Update", + "rom_arch": "ARM64", + "rom_kernel": "windows", + "rom_extra": "", + "final_rom_file_name": "", + "desc": "This Rom is from Nguyen Bao An Bui. You can get it on An Bui app: https://play.google.com/store/apps/details?id=com.anbui.app\n\nWindows 10 is a major release of the Windows NT operating system developed by Microsoft. The successor to Windows 8.1, it was released to manufacturing on July 15, 2015, became generally available on July 29, 2015, and was a free upgrade to users of Windows 7, 8, and 8.1. Its server counterparts are Windows Server 2016, 2019, and 2022. It was succeeded by Windows 11 in October 2021.", + "file_size": "16 GB", + "containsAds": true, + "creator": "Nguyen Bao An Bui", + "verified": true, + "vecid": "windows10sarm64build16299cvbi", + "id": "99627" + }, { "rom_name": "Windows 11 21H2", "rom_icon": "https://www.getmyos.com/app_public/files/t/1/2021/06/windows_11_logo_by_getmyos.png", From 582d1d9845844b485c9286207c29e825f1f8e236 Mon Sep 17 00:00:00 2001 From: An Bui <91354810+AnBui2004@users.noreply.github.com> Date: Tue, 7 Jul 2026 15:43:01 +0700 Subject: [PATCH 07/18] 4.3.1 - Improved system update. - Added error reporting when virtual drive creation fails. - Automatically resumes opening the X11 screen after missing packages have been installed. - Fixed an issue with the virtual machine startup dialog getting stuck. - Fixed an issue when selecting an invalid file in the virtual machine control dialog. - Fixed a failure to check if the device supports 64-bit. - Added a check for available Google Play services. - Improved checking for broken virtual machine listings. - New Terminal2. - Cleaned up unnecessary resources and assets. - Fixed other minor issues. --- .firebaserc | 5 - app/build.gradle | 4 +- .../com/vectras/qemu/MainSettingsManager.java | 12 + .../com/vectras/qemu/MainVNCActivity.java | 12 +- .../java/com/vectras/vm/AboutActivity.java | 2 +- .../main/java/com/vectras/vm/AppConfig.java | 10 +- .../Fragment/CreateImageDialogFragment.java | 6 +- .../main/java/com/vectras/vm/MainService.java | 59 +++- .../java/com/vectras/vm/SplashActivity.java | 7 +- .../main/java/com/vectras/vm/VMManager.java | 40 +-- .../main/java/com/vectras/vm/VectrasApp.java | 10 +- .../vectras/vm/creator/VMCreatorActivity.java | 31 ++- .../java/com/vectras/vm/fcm/FCMManager.java | 5 + .../vectras/vm/main/core/DisplaySystem.java | 35 ++- .../com/vectras/vm/main/core/MainStartVM.java | 4 +- .../vectras/vm/main/core/PendingCommand.java | 30 +- .../vectras/vm/main/core/StartVmDialog.java | 48 ++-- .../main/monitor/SystemMonitorFragment.java | 5 +- .../vm/manager/BatteryEmulatorManager.java | 3 +- .../vectras/vm/manager/HostSharedFolder.java | 19 +- .../vectras/vm/manager/ProcessManager.java | 4 +- .../com/vectras/vm/manager/QemuManager.java | 4 +- .../vectras/vm/manager/VmAudioManager.java | 2 +- .../vm/manager/VmControllerDialog.java | 11 +- .../vm/setupwizard/SetupFeatureCore.java | 1 - .../vm/setupwizard/SetupWizard2Activity.java | 257 +++++------------- .../vm/{utils => sound}/StreamAudio.java | 4 +- .../com/vectras/vm/utils/CommandUtils.java | 19 +- .../com/vectras/vm/utils/DeviceUtils.java | 8 +- .../java/com/vectras/vm/utils/GmsChecker.java | 13 + .../java/com/vectras/vm/utils/JSONUtils.java | 5 + .../com/vectras/vm/utils/LibraryChecker.java | 146 +++++----- .../java/com/vectras/vm/x11/X11Activity.java | 8 +- .../java/com/vectras/vterm/Terminal2.java | 252 +++++++++++++++++ app/src/main/res/values-vi/strings.xml | 2 + app/src/main/res/values/strings.xml | 2 + .../android/en-US/full_description.txt | 15 - .../android/en-US/images/featureGraphic.jpg | Bin 61484 -> 0 bytes .../metadata/android/en-US/images/icon.png | Bin 19643 -> 0 bytes .../en-US/images/phoneScreenshots/1.jpg | Bin 22242 -> 0 bytes .../en-US/images/phoneScreenshots/2.jpg | Bin 59506 -> 0 bytes .../en-US/images/phoneScreenshots/3.jpg | Bin 38964 -> 0 bytes .../en-US/images/phoneScreenshots/4.jpg | Bin 33645 -> 0 bytes .../android/en-US/short_description.txt | 1 - gradle/libs.versions.toml | 4 +- gradle/wrapper/gradle-wrapper.properties | 2 +- web/1024.png | Bin 132487 -> 0 bytes web/README.txt | 18 -- web/apple-touch-icon.png | Bin 9496 -> 0 bytes web/coffee.html | 30 -- web/data/UpdateConfig.json | 8 +- web/favicon.ico | Bin 5238 -> 0 bytes web/how.html | 30 -- web/icon-192-maskable.png | Bin 10045 -> 0 bytes web/icon-192.png | Bin 12693 -> 0 bytes web/icon-512-maskable.png | Bin 35495 -> 0 bytes web/icon-512.png | Bin 42882 -> 0 bytes web/index.html | 30 -- web/logo.png | Bin 100438 -> 0 bytes 59 files changed, 716 insertions(+), 507 deletions(-) delete mode 100644 .firebaserc rename app/src/main/java/com/vectras/vm/{utils => sound}/StreamAudio.java (98%) create mode 100644 app/src/main/java/com/vectras/vm/utils/GmsChecker.java create mode 100644 app/src/main/java/com/vectras/vterm/Terminal2.java delete mode 100644 fastlane/metadata/android/en-US/full_description.txt delete mode 100644 fastlane/metadata/android/en-US/images/featureGraphic.jpg delete mode 100644 fastlane/metadata/android/en-US/images/icon.png delete mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/1.jpg delete mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/2.jpg delete mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/3.jpg delete mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/4.jpg delete mode 100644 fastlane/metadata/android/en-US/short_description.txt delete mode 100644 web/1024.png delete mode 100644 web/README.txt delete mode 100644 web/apple-touch-icon.png delete mode 100644 web/coffee.html delete mode 100644 web/favicon.ico delete mode 100644 web/how.html delete mode 100644 web/icon-192-maskable.png delete mode 100644 web/icon-192.png delete mode 100644 web/icon-512-maskable.png delete mode 100644 web/icon-512.png delete mode 100644 web/index.html delete mode 100644 web/logo.png diff --git a/.firebaserc b/.firebaserc deleted file mode 100644 index d1ca34f..0000000 --- a/.firebaserc +++ /dev/null @@ -1,5 +0,0 @@ -{ - "projects": { - "default": "vectras-1678b" - } -} diff --git a/app/build.gradle b/app/build.gradle index cf5dbc9..181b40f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -12,8 +12,8 @@ android { applicationId "com.vectras.vm" minSdk minApi targetSdk targetApi - versionCode 134 - versionName "4.3.0" + versionCode 135 + versionName "4.3.1" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" multiDexEnabled true diff --git a/app/src/main/java/com/vectras/qemu/MainSettingsManager.java b/app/src/main/java/com/vectras/qemu/MainSettingsManager.java index f10ad44..c9a51f4 100644 --- a/app/src/main/java/com/vectras/qemu/MainSettingsManager.java +++ b/app/src/main/java/com/vectras/qemu/MainSettingsManager.java @@ -1188,6 +1188,18 @@ public class MainSettingsManager extends AppCompatActivity return prefs.getInt("standardSetupVersion", 0); } + public static void setCoreSetupVersion(Context context, int value) { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + SharedPreferences.Editor edit = prefs.edit(); + edit.putInt("coreSetupVersion", value); + edit.apply(); + } + + public static int getCoreSetupVersion(Context context) { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + return prefs.getInt("coreSetupVersion", 0); + } + public static void setShowLastCrashLog(Context context, Boolean _boolean) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); SharedPreferences.Editor edit = prefs.edit(); diff --git a/app/src/main/java/com/vectras/qemu/MainVNCActivity.java b/app/src/main/java/com/vectras/qemu/MainVNCActivity.java index 1e38d2a..ccb6295 100644 --- a/app/src/main/java/com/vectras/qemu/MainVNCActivity.java +++ b/app/src/main/java/com/vectras/qemu/MainVNCActivity.java @@ -73,7 +73,7 @@ import com.vectras.vm.utils.DialogUtils; import com.vectras.vm.utils.FileUtils; import com.vectras.vm.utils.ListUtils; import com.vectras.vm.utils.SimulateKeyEvent; -import com.vectras.vm.utils.StreamAudio; +import com.vectras.vm.sound.StreamAudio; import com.vectras.vm.utils.UIUtils; import com.vectras.vm.view.DynamicBubble; @@ -774,8 +774,14 @@ public class MainVNCActivity extends VncCanvasActivity { } catch (InterruptedException e) { Log.e(TAG, "onMonitor: ", e); } - monitorMode = true; - vncCanvas.sendMetaKey1(50, 6); + + try { + vncCanvas.sendMetaKey1(50, 6); + monitorMode = true; + } catch (NullPointerException e) { + monitorMode = false; + Log.e(TAG, "onMonitor: ", e); + } }); t.start(); diff --git a/app/src/main/java/com/vectras/vm/AboutActivity.java b/app/src/main/java/com/vectras/vm/AboutActivity.java index df508b1..5b79239 100644 --- a/app/src/main/java/com/vectras/vm/AboutActivity.java +++ b/app/src/main/java/com/vectras/vm/AboutActivity.java @@ -94,7 +94,7 @@ public class AboutActivity extends AppCompatActivity implements View.OnClickList TextView qemuVersion = findViewById(R.id.qemuVersion); executor.execute(() -> { - String qemuVersionName = CommandUtils.getQemuVersionName(); + String qemuVersionName = CommandUtils.getQemuVersionName(this); runOnUiThread(() -> { if (!qemuVersionName.isEmpty()) qemuVersion.setText(qemuVersionName); else getString(R.string.unknow); }); diff --git a/app/src/main/java/com/vectras/vm/AppConfig.java b/app/src/main/java/com/vectras/vm/AppConfig.java index c52c500..60b3a6b 100644 --- a/app/src/main/java/com/vectras/vm/AppConfig.java +++ b/app/src/main/java/com/vectras/vm/AppConfig.java @@ -19,6 +19,7 @@ public class AppConfig { public static String vectrasVersion; public static int vectrasVersionCode; public static final int standardSetupVersion = 922202606; + public static final int coreSetupVersion = 0; public static String vectrasWebsite = "https://vectras.vercel.app/"; public static String vectrasWebsiteRaw = "https://raw.githubusercontent.com/AnBui2004/Vectras-VM-Emu-Android/refs/heads/master/web/"; public static String bootstrapfileslink = vectrasWebsiteRaw + "/data/setupfiles3.json"; @@ -78,13 +79,13 @@ public class AppConfig { public static String neededPkgs() { if (DeviceUtils.isArm()) { - return "bash aria2 tar dwm xterm libslirp libslirp-dev pulseaudio-dev glib-dev pixman-dev zlib-dev spice-dev" + + return "sudo bash aria2 tar dwm xterm libslirp libslirp-dev pulseaudio-dev glib-dev pixman-dev zlib-dev spice-dev" + " libusbredirparser usbredir-dev sdl2 sdl2-dev sdl2_image-dev libepoxy-dev virglrenderer-dev rdma-core fluxbox" + " libusb libaio ncurses-libs curl libnfs gtk+3.0 gtk+3.0-dev fuse libpulse libseccomp jack pipewire liburing pulseaudio pulseaudio-alsa alsa-plugins-pulse" + " mesa-dri-gallium mesa-vulkan-swrast vulkan-loader mesa-utils mesa-egl mesa-gbm mesa-vulkan-ati mesa-vulkan-broadcom mesa-vulkan-freedreno mesa-vulkan-panfrost" + " qemu-audio-sdl capstone libcbor snappy lzo ndctl keyutils-libs vde2-libs libdw libbpf sndio-libs linux-pam fuse3-libs libssh vte3 iasl perl"; } else { - return "bash aria2 tar dwm xterm libslirp libslirp-dev pulseaudio-dev glib-dev pixman-dev zlib-dev spice-dev" + + return "sudo bash aria2 tar dwm xterm libslirp libslirp-dev pulseaudio-dev glib-dev pixman-dev zlib-dev spice-dev" + " libusbredirparser usbredir-dev sdl2 sdl2-dev sdl2_image-dev libepoxy-dev virglrenderer-dev rdma-core fluxbox" + " libusb libaio ncurses-libs curl libnfs gtk+3.0 gtk+3.0-dev fuse libpulse libseccomp jack pipewire liburing pulseaudio pulseaudio-alsa alsa-plugins-pulse" + " mesa-dri-gallium mesa-vulkan-swrast vulkan-loader mesa-utils mesa-egl" + @@ -94,13 +95,13 @@ public class AppConfig { public static String neededPkgs32bit() { if (DeviceUtils.isArm()) { - return "bash aria2 tar dwm xterm libslirp libslirp-dev pulseaudio-dev glib-dev pixman-dev zlib-dev spice-dev" + + return "sudo bash aria2 tar dwm xterm libslirp libslirp-dev pulseaudio-dev glib-dev pixman-dev zlib-dev spice-dev" + " libusbredirparser usbredir-dev sdl2 sdl2-dev sdl2_image-dev libepoxy-dev virglrenderer-dev rdma-core fluxbox" + " libusb libaio ncurses-libs curl libnfs gtk+3.0 gtk+3.0-dev fuse libpulse libseccomp jack pipewire liburing pulseaudio pulseaudio-alsa alsa-plugins-pulse" + " mesa-dri-gallium mesa-vulkan-swrast vulkan-loader mesa-utils mesa-egl" + " qemu-audio-sdl capstone libcbor snappy lzo ndctl keyutils-libs vde2-libs libdw libbpf sndio-libs linux-pam fuse3-libs libssh vte3 iasl perl"; } else { - return "bash aria2 tar dwm xterm libslirp libslirp-dev pulseaudio-dev glib-dev pixman-dev zlib-dev spice-dev" + + return "sudo bash aria2 tar dwm xterm libslirp libslirp-dev pulseaudio-dev glib-dev pixman-dev zlib-dev spice-dev" + " libusbredirparser usbredir-dev sdl2 sdl2-dev sdl2_image-dev libepoxy-dev virglrenderer-dev rdma-core fluxbox" + " libusb libaio ncurses-libs curl libnfs gtk+3.0 gtk+3.0-dev fuse libpulse libseccomp jack pipewire liburing pulseaudio pulseaudio-alsa alsa-plugins-pulse" + " mesa-dri-gallium mesa-vulkan-swrast vulkan-loader mesa-utils mesa-egl" + @@ -119,4 +120,5 @@ public class AppConfig { public static String virtIOWinUrl = "https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/virtio-win-0.1.285-1/virtio-win.iso"; public static String virtIOWinUrlMd5 = "9e650d0e7c6e017a91ca299c8f7ed766"; + public static boolean isGmsAvailable = false; } diff --git a/app/src/main/java/com/vectras/vm/Fragment/CreateImageDialogFragment.java b/app/src/main/java/com/vectras/vm/Fragment/CreateImageDialogFragment.java index 5ce7915..bd2ae3e 100644 --- a/app/src/main/java/com/vectras/vm/Fragment/CreateImageDialogFragment.java +++ b/app/src/main/java/com/vectras/vm/Fragment/CreateImageDialogFragment.java @@ -23,7 +23,7 @@ import com.vectras.vm.R; import com.vectras.vm.manager.VmFileManager; import com.vectras.vm.utils.DialogUtils; import com.vectras.vm.utils.ProgressDialog; -import com.vectras.vterm.Terminal; +import com.vectras.vterm.Terminal2; import java.io.File; import java.util.Objects; @@ -99,8 +99,8 @@ public class CreateImageDialogFragment extends DialogFragment { progressDialog.show(); new Thread(() -> { - String result = Terminal.executeShellCommandWithResult("qemu-img create -f qcow2 \"" + folder + Objects.requireNonNull(imageName.getText()) + ".qcow2\" " + - Objects.requireNonNull(imageSize.getText()) + "G", requireActivity()).trim(); + String result = new Terminal2(requireContext()).executeOnThisThread("qemu-img create -f qcow2 \"" + folder + Objects.requireNonNull(imageName.getText()) + ".qcow2\" " + + Objects.requireNonNull(imageSize.getText()) + "G").trim(); if (isMarkPendingAdd) VmFileManager.markPendingAdd(folder + Objects.requireNonNull(imageName.getText()) + ".qcow2"); requireActivity().runOnUiThread(() -> { diff --git a/app/src/main/java/com/vectras/vm/MainService.java b/app/src/main/java/com/vectras/vm/MainService.java index c026fc5..6c13776 100644 --- a/app/src/main/java/com/vectras/vm/MainService.java +++ b/app/src/main/java/com/vectras/vm/MainService.java @@ -1,5 +1,6 @@ package com.vectras.vm; +import android.app.Activity; import android.app.Notification; import android.app.NotificationChannel; import android.app.NotificationManager; @@ -8,12 +9,17 @@ import android.app.Service; import android.content.Context; import android.content.Intent; import android.os.Build; +import android.os.Handler; import android.os.IBinder; +import android.os.Looper; import android.util.Log; import androidx.core.app.NotificationCompat; +import com.vectras.vm.utils.ClipboardUltils; +import com.vectras.vm.utils.DialogUtils; import com.vectras.vterm.Terminal; +import com.vectras.vterm.Terminal2; import java.util.Objects; @@ -22,7 +28,7 @@ public class MainService extends Service { private final int NOTIFICATION_ID = 1; private final String MACHINE_NAME = "Vectras VM"; public static String env = null; - private String TAG = "MainService"; + private static String TAG = "MainService"; public static MainService service; public static Context activityContext; @@ -51,8 +57,7 @@ public class MainService extends Service { if (env != null) { if (service != null) { - Terminal vterm = new Terminal(activityContext); - vterm.executeShellCommand2(env, true, activityContext); + startCommand(env, activityContext); } } else { Log.e(TAG, "env is null"); @@ -97,8 +102,50 @@ public class MainService extends Service { } } - public static void startCommand(String _env, Context _context) { - Terminal vterm = new Terminal(_context); - vterm.executeShellCommand2(_env, true, _context); + public static void startCommand(String env, Context context) { + Terminal2 terminal2 = new Terminal2(activityContext); + terminal2.setDefaultShellBash(); + terminal2.setStartup("export XDG_RUNTIME_DIR=/tmp && unset PULSE_SERVER"); + terminal2.execute(env, new Terminal2.Terminal2Callback() { + @Override + public void onRunning(String command, String newLine) { + // Nothing to do. + } + + @Override + public void onFinished(String command, String log, int status) { + if (context instanceof Activity activity) { + if (activity.isFinishing() || activity.isDestroyed()) { + return; + } + } else { + Log.e(TAG, "context is not an Activity"); + return; + } + + new Handler(Looper.getMainLooper()).post(() -> { + if (VMManager.isExecutedCommandError(command, log, context)) + return; + + DialogUtils.twoDialog(context, "Execution Result", log, context.getString(R.string.copy), context.getString(R.string.close), true, R.drawable.round_terminal_24, true, + () -> ClipboardUltils.copyToClipboard(context, log), null, null); + }); + } + + @Override + public void onError(String command, Exception exception) { + if (context instanceof Activity activity) { + if (activity.isFinishing() || activity.isDestroyed()) { + return; + } + } else { + Log.e(TAG, "context is not an Activity"); + return; + } + + new Handler(Looper.getMainLooper()).post(() -> DialogUtils.twoDialog(context, "Execution Result", exception.getMessage(), context.getString(R.string.copy), context.getString(R.string.close), true, R.drawable.round_terminal_24, true, + () -> ClipboardUltils.copyToClipboard(context, exception.getMessage()), null, null)); + } + }); } } \ No newline at end of file diff --git a/app/src/main/java/com/vectras/vm/SplashActivity.java b/app/src/main/java/com/vectras/vm/SplashActivity.java index cdcaace..af15f8e 100644 --- a/app/src/main/java/com/vectras/vm/SplashActivity.java +++ b/app/src/main/java/com/vectras/vm/SplashActivity.java @@ -126,7 +126,12 @@ public class SplashActivity extends AppCompatActivity { if (MainSettingsManager.getShowLastCrashLog(this)) { startActivity(new Intent(this, LastCrashActivity.class)); } else if (SetupFeatureCore.isInstalledQemu(this)) { - if (MainSettingsManager.getStandardSetupVersion(this) != AppConfig.standardSetupVersion && + if (MainSettingsManager.getCoreSetupVersion(this) != AppConfig.coreSetupVersion) { + Intent intent = new Intent(); + intent.putExtra("action", SetupWizard2Activity.ACTION_CORE_SYSTEM_UPDATE); + intent.setClass(this, SetupWizard2Activity.class); + startActivity(intent); + } else if (MainSettingsManager.getStandardSetupVersion(this) != AppConfig.standardSetupVersion && !MainSettingsManager.getsetUpWithManualSetupBefore(this)) { Intent intent = new Intent(); intent.putExtra("action", SetupWizard2Activity.ACTION_SYSTEM_UPDATE); diff --git a/app/src/main/java/com/vectras/vm/VMManager.java b/app/src/main/java/com/vectras/vm/VMManager.java index a013dd5..cafc2c3 100644 --- a/app/src/main/java/com/vectras/vm/VMManager.java +++ b/app/src/main/java/com/vectras/vm/VMManager.java @@ -19,6 +19,7 @@ import com.google.gson.Gson; import com.google.gson.JsonArray; import com.google.gson.JsonObject; import com.google.gson.JsonParser; +import com.google.gson.JsonSyntaxException; import com.google.gson.reflect.TypeToken; import com.vectras.qemu.Config; import com.vectras.qemu.MainSettingsManager; @@ -37,6 +38,7 @@ import com.vectras.vm.utils.JSONUtils; import com.vectras.vm.utils.ProgressDialog; import com.vectras.vm.utils.TextUtils; import com.vectras.vterm.Terminal; +import com.vectras.vterm.Terminal2; import org.jetbrains.annotations.Contract; @@ -70,8 +72,14 @@ public class VMManager { if (!JSONUtils.isValidFromString(vmJsonListContent) || vmId.isEmpty()) return false; - ArrayList> vmList = new Gson().fromJson(vmJsonListContent, new TypeToken>>() { - }.getType()); + ArrayList> vmList; + + try { + vmList = new Gson().fromJson(vmJsonListContent, new TypeToken>>() { + }.getType()); + } catch (JsonSyntaxException e) { + return JSONUtils.isValidFromFile(VmFileManager.getConfigFile(vmId)); + } if (vmList == null) return false; @@ -841,7 +849,7 @@ public class VMManager { } public static boolean isVMRunning(Context context, String vmID) { - String result = Terminal.executeShellCommandWithResult("ps -e", context); + String result = new Terminal2(context).executeOnThisThread("ps -e"); if (result.contains(" -qmp unix:" + Config.getLocalQMPSocketPath(vmID))) { Log.d("VMManager.isThisVMRunning", "Yes.\n\n" + result); return true; @@ -858,18 +866,6 @@ public class VMManager { return exists; } - public static boolean isQemuRunning(Activity activity) { - Terminal vterm = new Terminal(activity); - vterm.executeShellCommand2("ps -e", false, activity); - if (AppConfig.temporaryLastedTerminalOutput.contains("qemu-system")) { - Log.d("VMManager.isQemuRunning", "Yes"); - return true; - } else { - Log.d("VMManager.isQemuRunning", "No"); - return false; - } - } - public static boolean isHaveADisk(String env) { return env.contains("-drive") || env.contains("-hda") || env.contains("-hdb") || env.contains("-cdrom") || env.contains("-fda") || env.contains("-fdb"); } @@ -902,20 +898,8 @@ public class VMManager { }, null, null); } - public static void killcurrentqemuprocess(Activity activity) { - Terminal vterm = new Terminal(activity); - String qemuProcess = switch (MainSettingsManager.getArch(activity)) { - case "ARM64" -> "qemu-system-aarch64"; - case "PPC" -> "qemu-system-ppc"; - case "I386" -> "qemu-system-i386"; - default -> "qemu-system-x86_64"; - }; - vterm.executeShellCommand2("killall -15 " + qemuProcess + "; sleep 1; killall -9 " + qemuProcess, false, null); - } - public static void killallqemuprocesses(Context context) { - Terminal vterm = new Terminal(context); - vterm.executeShellCommand2("pkill -15 -f qemu-system-; sleep 1; pkill -9 -f qemu-system-", false, null); + new Terminal2(context).executeOnThisThread("pkill -15 -f qemu-system-; sleep 1; pkill -9 -f qemu-system-"); } public static String startMigrate() { diff --git a/app/src/main/java/com/vectras/vm/VectrasApp.java b/app/src/main/java/com/vectras/vm/VectrasApp.java index c2dd2dc..bc9b474 100644 --- a/app/src/main/java/com/vectras/vm/VectrasApp.java +++ b/app/src/main/java/com/vectras/vm/VectrasApp.java @@ -19,11 +19,11 @@ import com.google.firebase.crashlytics.FirebaseCrashlytics; import com.vectras.qemu.Config; import com.vectras.qemu.MainSettingsManager; import com.vectras.vm.utils.FileUtils; +import com.vectras.vm.utils.GmsChecker; import com.vectras.vm.utils.PackageUtils; import com.vectras.vm.utils.UIUtils; import java.lang.ref.WeakReference; -import java.util.Locale; public class VectrasApp extends Application { public static VectrasApp vectrasapp; @@ -97,8 +97,14 @@ public class VectrasApp extends Application { } }); - FirebaseAnalytics.getInstance(this).logEvent(FirebaseAnalytics.Event.APP_OPEN, null); FirebaseCrashlytics.getInstance().log("App started: " + AppConfig.vectrasVersion); + + if (GmsChecker.isAvailable(this)) { + AppConfig.isGmsAvailable = true; + FirebaseAnalytics.getInstance(this).logEvent(FirebaseAnalytics.Event.APP_OPEN, null); + } else { + FirebaseCrashlytics.getInstance().log("Device does not support GMS."); + } } private void setupTheme() { diff --git a/app/src/main/java/com/vectras/vm/creator/VMCreatorActivity.java b/app/src/main/java/com/vectras/vm/creator/VMCreatorActivity.java index 480a019..c947f18 100644 --- a/app/src/main/java/com/vectras/vm/creator/VMCreatorActivity.java +++ b/app/src/main/java/com/vectras/vm/creator/VMCreatorActivity.java @@ -5,12 +5,15 @@ import android.content.ComponentName; import android.content.Intent; import android.net.Uri; import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; import android.text.Editable; import android.text.TextWatcher; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; +import android.widget.Toast; import androidx.activity.OnBackPressedCallback; import androidx.activity.result.ActivityResultLauncher; @@ -63,6 +66,7 @@ import java.util.concurrent.Executors; import com.vectras.vm.utils.ZipUtils; import com.vectras.vterm.Terminal; import com.vectras.vm.utils.PermissionUtils; +import com.vectras.vterm.Terminal2; public class VMCreatorActivity extends AppCompatActivity { @@ -309,9 +313,28 @@ public class VMCreatorActivity extends AppCompatActivity { setDefault(); if (MainSettingsManager.autoCreateDisk(this)) { if (createVMFolder(true)) { - Terminal vterm = new Terminal(this); - vterm.executeShellCommand2("qemu-img create -f qcow2 " + VmFileManager.getPath(vmID, "disk.qcow2") + " 128G", false, this); - binding.drive.setText(VmFileManager.getPath(vmID, "disk.qcow2")); + Terminal2 terminal2 = new Terminal2(this); + terminal2.setShowProgressDialog(true); + terminal2.execute("qemu-img create -f qcow2 " + VmFileManager.getPath(vmID, "disk.qcow2") + " 128G", new Terminal2.Terminal2Callback() { + @Override + public void onRunning(String command, String newLine) { + // Nothing to do. + } + + @Override + public void onFinished(String command, String log, int status) { + new Handler(Looper.getMainLooper()).post(() -> { + if (status == terminal2.SUCCESS) + binding.drive.setText(VmFileManager.getPath(vmID, "disk.qcow2")); + }); + } + + @Override + public void onError(String command, Exception exception) { + new Handler(Looper.getMainLooper()).post(() -> Toast.makeText(getApplicationContext(), getString(R.string.an_error_occurred_while_creating_the_virtual_drive), Toast.LENGTH_SHORT).show()); + + } + }); } } else { setDrive(SELECT_DISK_0_FILE_MODE, null); @@ -1156,7 +1179,7 @@ public class VMCreatorActivity extends AppCompatActivity { private void showProgressDialog(String message) { dialogProgressStyleBinding.progressText.setText(message); dialogProgressStyleBinding.progressBar.setIndeterminate(true); - progressDialog.show(); + if (!isFinishing() && !isDestroyed()) progressDialog.show(); } private String copyToTemp(Uri uri) throws IOException { diff --git a/app/src/main/java/com/vectras/vm/fcm/FCMManager.java b/app/src/main/java/com/vectras/vm/fcm/FCMManager.java index 429a0fd..40d068a 100644 --- a/app/src/main/java/com/vectras/vm/fcm/FCMManager.java +++ b/app/src/main/java/com/vectras/vm/fcm/FCMManager.java @@ -3,11 +3,14 @@ package com.vectras.vm.fcm; import android.util.Log; import com.google.firebase.messaging.FirebaseMessaging; +import com.vectras.vm.AppConfig; public class FCMManager { private static final String TAG = "FCMManager"; public static void subscribe() { + if (!AppConfig.isGmsAvailable) return; + FirebaseMessaging.getInstance() .subscribeToTopic("vectrasvmandroidgithub") .addOnCompleteListener(task -> { @@ -20,6 +23,8 @@ public class FCMManager { } public static void unSubscribe() { + if (!AppConfig.isGmsAvailable) return; + FirebaseMessaging.getInstance() .unsubscribeFromTopic("vectrasvmandroidgithub") .addOnCompleteListener(task -> { diff --git a/app/src/main/java/com/vectras/vm/main/core/DisplaySystem.java b/app/src/main/java/com/vectras/vm/main/core/DisplaySystem.java index 4f5abfb..0dc4b63 100644 --- a/app/src/main/java/com/vectras/vm/main/core/DisplaySystem.java +++ b/app/src/main/java/com/vectras/vm/main/core/DisplaySystem.java @@ -6,6 +6,8 @@ import static com.vectras.vm.utils.LibraryChecker.isPackageInstalled2; import android.app.Activity; import android.content.Context; import android.content.Intent; +import android.os.Handler; +import android.os.Looper; import android.util.Log; import com.termux.app.TermuxService; @@ -21,6 +23,7 @@ import com.vectras.vm.utils.FileUtils; import com.vectras.vm.utils.PackageUtils; import com.vectras.vm.x11.X11Activity; import com.vectras.vterm.Terminal; +import com.vectras.vterm.Terminal2; import java.io.File; import java.util.HashSet; @@ -86,8 +89,32 @@ public class DisplaySystem { R.drawable.desktop_24px, true, () -> { - String installCommand = "apk add " + necessaryPackage; - new Terminal(context).executeShellCommand(installCommand, true, true, context.getString(R.string.just_a_moment), context); + String installCommand = "apk add " + necessaryPackage + " && echo \"Installed: " + necessaryPackage + "\""; + + Terminal2 terminal2 = new Terminal2(context); + terminal2.setShowProgressDialog(true); + terminal2.execute(installCommand, new Terminal2.Terminal2Callback() { + @Override + public void onRunning(String command, String newLine) { + // Nothing to do. + } + + @Override + public void onFinished(String command, String log, int status) { + new Handler(Looper.getMainLooper()).post(() -> { + if (status == terminal2.SUCCESS) { + launchX11(context, isKill); + } else { + DialogUtils.oopsDialog(context, log); + } + }); + } + + @Override + public void onError(String command, Exception exception) { + new Handler(Looper.getMainLooper()).post(() -> DialogUtils.oopsDialog(context, exception.getMessage())); + } + }); }, null, null @@ -116,7 +143,9 @@ public class DisplaySystem { } public static void startDesktop(Context context) { - new Terminal(context).executeShellCommand2("export DISPLAY=:0 && fluxbox > /dev/null", false, context); + Terminal2 terminal2 = new Terminal2(context); + terminal2.setDefaultShellBash(); + terminal2.execute("export DISPLAY=:0 && fluxbox > /dev/null"); } public static void startTermuxX11(Context context) { diff --git a/app/src/main/java/com/vectras/vm/main/core/MainStartVM.java b/app/src/main/java/com/vectras/vm/main/core/MainStartVM.java index 64b25fa..ba72d09 100644 --- a/app/src/main/java/com/vectras/vm/main/core/MainStartVM.java +++ b/app/src/main/java/com/vectras/vm/main/core/MainStartVM.java @@ -50,7 +50,7 @@ public class MainStartVM { public static String pendingVMID = ""; public static String pendingThumbnailFile = ""; public static boolean isLaunchFromPending = false; - public static String runCommandFormat = "export TMPDIR=/tmp && mkdir -p $TMPDIR/pulse && export XDG_RUNTIME_DIR=/tmp && chmod -R 775 $TMPDIR/pulse && pulseaudio --start --exit-idle-time=-1 > /dev/null 2>&1 && %s"; + public static String runCommandFormat = "%s"; private static StartVmDialog dialog; @@ -488,6 +488,6 @@ public class MainStartVM { } public static void setDefault() { - runCommandFormat = "export TMPDIR=/tmp && mkdir -p $TMPDIR/pulse && export XDG_RUNTIME_DIR=/tmp && chmod -R 775 $TMPDIR/pulse && pulseaudio --start --exit-idle-time=-1 > /dev/null 2>&1 && %s"; + runCommandFormat = "%s"; } } diff --git a/app/src/main/java/com/vectras/vm/main/core/PendingCommand.java b/app/src/main/java/com/vectras/vm/main/core/PendingCommand.java index c30a936..153fe9e 100644 --- a/app/src/main/java/com/vectras/vm/main/core/PendingCommand.java +++ b/app/src/main/java/com/vectras/vm/main/core/PendingCommand.java @@ -1,6 +1,8 @@ package com.vectras.vm.main.core; import android.app.Activity; +import android.os.Handler; +import android.os.Looper; import android.util.Log; import android.widget.Toast; @@ -13,6 +15,7 @@ import com.vectras.vm.manager.VmFileManager; import com.vectras.vm.utils.DialogUtils; import com.vectras.vm.utils.FileUtils; import com.vectras.vterm.Terminal; +import com.vectras.vterm.Terminal2; public class PendingCommand { private static final String TAG = "PendingCommand"; @@ -49,9 +52,30 @@ public class PendingCommand { null ); } else { - Terminal _vterm = new Terminal(activity); - _vterm.executeShellCommand2(command, false, activity); - Toast.makeText(activity, activity.getResources().getString(R.string.done), Toast.LENGTH_LONG).show(); + Terminal2 terminal2 = new Terminal2(activity); + terminal2.setShowProgressDialog(true); + terminal2.execute(command, new Terminal2.Terminal2Callback() { + @Override + public void onRunning(String command, String newLine) { + // Nothing to do. + } + + @Override + public void onFinished(String command, String log, int status) { + new Handler(Looper.getMainLooper()).post(() -> { + if (status == terminal2.SUCCESS) { + Toast.makeText(activity, activity.getResources().getString(R.string.done), Toast.LENGTH_LONG).show(); + } else { + Toast.makeText(activity, activity.getResources().getString(R.string.an_error_occurred_while_creating_the_virtual_drive), Toast.LENGTH_LONG).show(); + } + }); + } + + @Override + public void onError(String command, Exception exception) { + new Handler(Looper.getMainLooper()).post(() -> Toast.makeText(activity, activity.getResources().getString(R.string.an_error_occurred_while_creating_the_virtual_drive), Toast.LENGTH_LONG).show()); + } + }); } command = ""; diff --git a/app/src/main/java/com/vectras/vm/main/core/StartVmDialog.java b/app/src/main/java/com/vectras/vm/main/core/StartVmDialog.java index 2b1f029..8ffc3d8 100644 --- a/app/src/main/java/com/vectras/vm/main/core/StartVmDialog.java +++ b/app/src/main/java/com/vectras/vm/main/core/StartVmDialog.java @@ -3,6 +3,7 @@ package com.vectras.vm.main.core; import android.app.Activity; import android.os.Handler; import android.os.Looper; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.widget.ImageView; @@ -92,31 +93,38 @@ public class StartVmDialog { boolean isVmRuning = VMManager.isVMRunning(activity, vmId); - while (isVmRuning) { - Config.vmID = vmId; + if (!isVmRuning) { + new Handler(Looper.getMainLooper()).post(() -> { + isShuttingDown = false; + dismiss(); + }); + } else { + while (true) { + Config.vmID = vmId; - isVmRuning = VMManager.isVMRunning(activity, vmId); + isVmRuning = VMManager.isVMRunning(activity, vmId); - QmpSender.shutdown(); + QmpSender.shutdown(); - if (!isVmRuning || VMManager.isQemuStopedWithError || triedCount == MAX_TRY) { - if (triedCount < MAX_TRY) FileUtils.delete(Config.getLocalQMPSocketPath(vmId)); + if (!isVmRuning || VMManager.isQemuStopedWithError || triedCount >= MAX_TRY) { + if (triedCount < MAX_TRY) FileUtils.delete(Config.getLocalQMPSocketPath(vmId)); - new Handler(Looper.getMainLooper()).post(() -> { - isShuttingDown = false; - dismiss(); - }); + new Handler(Looper.getMainLooper()).post(() -> { + isShuttingDown = false; + dismiss(); + }); - break; + break; + } + + try { + Thread.sleep(1000); + } catch (InterruptedException ignored) { + + } + + triedCount++; } - - try { - Thread.sleep(1000); - } catch (InterruptedException ignored) { - - } - - triedCount++; } }).start(); }); @@ -126,7 +134,7 @@ public class StartVmDialog { .setCancelable(false) .create(); - progressDialog.show(); + if (!activity.isFinishing() && !activity.isDestroyed()) progressDialog.show(); } public void setStatus(String status) { diff --git a/app/src/main/java/com/vectras/vm/main/monitor/SystemMonitorFragment.java b/app/src/main/java/com/vectras/vm/main/monitor/SystemMonitorFragment.java index 9ac30ff..6cf5305 100644 --- a/app/src/main/java/com/vectras/vm/main/monitor/SystemMonitorFragment.java +++ b/app/src/main/java/com/vectras/vm/main/monitor/SystemMonitorFragment.java @@ -34,6 +34,7 @@ import com.vectras.vm.manager.QmpSender; import com.vectras.vm.utils.CommandUtils; import com.vectras.vm.utils.DialogUtils; import com.vectras.vterm.Terminal; +import com.vectras.vterm.Terminal2; import java.io.File; import java.util.Locale; @@ -229,10 +230,10 @@ public class SystemMonitorFragment extends Fragment { binding.tvQemuarch.setText(getString(R.string.arch) + " " + currentArch + "."); executor.execute(() -> { - String qemuVersionName = CommandUtils.getQemuVersionName(); + String qemuVersionName = CommandUtils.getQemuVersionName(requireContext()); if (!isAdded()) return; - String result = Terminal.executeShellCommandWithResult("ps -e command && echo \"psendhere\" && cat /proc/cpuinfo", requireActivity()); + String result = new Terminal2(requireContext()).executeOnThisThread("ps -e command && echo \"psendhere\" && cat /proc/cpuinfo"); if (!isAdded()) return; requireActivity().runOnUiThread(() -> { diff --git a/app/src/main/java/com/vectras/vm/manager/BatteryEmulatorManager.java b/app/src/main/java/com/vectras/vm/manager/BatteryEmulatorManager.java index 170550b..9de414f 100644 --- a/app/src/main/java/com/vectras/vm/manager/BatteryEmulatorManager.java +++ b/app/src/main/java/com/vectras/vm/manager/BatteryEmulatorManager.java @@ -6,6 +6,7 @@ import com.vectras.vm.setupwizard.SetupFeatureCore; import com.vectras.vm.utils.DeviceUtils; import com.vectras.vm.utils.FileUtils; import com.vectras.vterm.Terminal; +import com.vectras.vterm.Terminal2; import java.io.File; @@ -51,7 +52,7 @@ public class BatteryEmulatorManager { FileUtils.writeToFile(vmTemp.getAbsolutePath(), "battery.asl", batteryAsl); if (FileUtils.isFileExists(VmFileManager.getTempPath(context, vmId, "battery.asl"))) { - String respond = Terminal.executeShellCommandWithResult("cd " + vmTemp.getAbsolutePath() + " && iasl battery.asl && echo Compiled", context); + String respond = new Terminal2(context).executeOnThisThread("cd " + vmTemp.getAbsolutePath() + " && iasl battery.asl && echo Compiled"); //Log.d(TAG, respond); return respond.contains("Compiled"); } else { diff --git a/app/src/main/java/com/vectras/vm/manager/HostSharedFolder.java b/app/src/main/java/com/vectras/vm/manager/HostSharedFolder.java index 2189547..2d675f2 100644 --- a/app/src/main/java/com/vectras/vm/manager/HostSharedFolder.java +++ b/app/src/main/java/com/vectras/vm/manager/HostSharedFolder.java @@ -10,6 +10,7 @@ import com.vectras.vm.utils.ClipboardUltils; import com.vectras.vm.utils.DialogUtils; import com.vectras.vm.utils.ProgressDialog; import com.vectras.vterm.Terminal; +import com.vectras.vterm.Terminal2; public class HostSharedFolder { public static final String TAG = "HostSharedFolder"; @@ -25,13 +26,16 @@ public class HostSharedFolder { new Thread(() -> { boolean isRuning; - if (Terminal.executeShellCommandWithResult("pgrep -f 'http.server 19000'", context).isEmpty()) { - if (!Terminal.executeShellCommandWithResult("which python3", context).contains("python3")) - Terminal.executeShellCommandWithResult("apk add python3", context); - startCommand(context); + Terminal2 terminal2 = new Terminal2(context); - isRuning = !Terminal.executeShellCommandWithResult("sleep 1; pgrep -f 'http.server 19000'", context).isEmpty(); + if (terminal2.executeOnThisThread("pgrep -f 'http.server 19000'").isEmpty()) { + if (!terminal2.executeOnThisThread("which python3").contains("python3")) + terminal2.executeOnThisThread("apk add python3"); + + new Terminal2(context).execute("python3 -m http.server 19000 --bind 127.0.0.1 --directory " + SHARED_DIR); + + isRuning = !terminal2.executeOnThisThread("sleep 1; pgrep -f 'http.server 19000'").isEmpty(); } else { isRuning = true; } @@ -61,9 +65,4 @@ public class HostSharedFolder { }); }).start(); } - - public static void startCommand(Context _context) { - Terminal vterm = new Terminal(_context); - vterm.executeShellCommand2("python3 -m http.server 19000 --bind 127.0.0.1 --directory " + SHARED_DIR, false, null); - } } diff --git a/app/src/main/java/com/vectras/vm/manager/ProcessManager.java b/app/src/main/java/com/vectras/vm/manager/ProcessManager.java index 484d636..c7c8e3b 100644 --- a/app/src/main/java/com/vectras/vm/manager/ProcessManager.java +++ b/app/src/main/java/com/vectras/vm/manager/ProcessManager.java @@ -2,10 +2,10 @@ package com.vectras.vm.manager; import android.content.Context; -import com.vectras.vterm.Terminal; +import com.vectras.vterm.Terminal2; public class ProcessManager { public static boolean isQemuRunning(Context context) { - return Terminal.executeShellCommandWithResult("ps -e", context).contains("qemu-system-"); + return new Terminal2(context).executeOnThisThread("ps -e").contains("qemu-system-"); } } diff --git a/app/src/main/java/com/vectras/vm/manager/QemuManager.java b/app/src/main/java/com/vectras/vm/manager/QemuManager.java index 88b50d8..d548978 100644 --- a/app/src/main/java/com/vectras/vm/manager/QemuManager.java +++ b/app/src/main/java/com/vectras/vm/manager/QemuManager.java @@ -4,14 +4,14 @@ import android.content.Context; import com.vectras.qemu.MainSettingsManager; import com.vectras.vm.settings.ItemSettingsSelector; -import com.vectras.vterm.Terminal; +import com.vectras.vterm.Terminal2; public class QemuManager { public static final int DEFAULT_REFRESH_RATE = 60; public static final int DEFAULT_LOW_REFRESH_RATE = 30; public static boolean isSupportSetRefreshRate(Context context) { - return Terminal.executeShellCommandWithResult(getQemuExecutableFile(context) + " -vnc help", context).contains("refresh-rate"); + return new Terminal2(context).executeOnThisThread(getQemuExecutableFile(context) + " -vnc help").contains("refresh-rate"); } public static boolean isSupportAcpiTable(Context context) { diff --git a/app/src/main/java/com/vectras/vm/manager/VmAudioManager.java b/app/src/main/java/com/vectras/vm/manager/VmAudioManager.java index 97bd772..ebf41b7 100644 --- a/app/src/main/java/com/vectras/vm/manager/VmAudioManager.java +++ b/app/src/main/java/com/vectras/vm/manager/VmAudioManager.java @@ -5,7 +5,7 @@ import android.util.Log; import com.vectras.qemu.Config; import com.vectras.vm.VectrasApp; import com.vectras.vm.utils.FileUtils; -import com.vectras.vm.utils.StreamAudio; +import com.vectras.vm.sound.StreamAudio; public class VmAudioManager { private static final String TAG = "VmAudioManager"; diff --git a/app/src/main/java/com/vectras/vm/manager/VmControllerDialog.java b/app/src/main/java/com/vectras/vm/manager/VmControllerDialog.java index 54b2540..b8b522d 100644 --- a/app/src/main/java/com/vectras/vm/manager/VmControllerDialog.java +++ b/app/src/main/java/com/vectras/vm/manager/VmControllerDialog.java @@ -32,7 +32,7 @@ import com.vectras.vm.settings.VNCSettingsActivity; import com.vectras.vm.utils.DialogUtils; import com.vectras.vm.utils.FileUtils; import com.vectras.vm.utils.ProgressDialog; -import com.vectras.vm.utils.StreamAudio; +import com.vectras.vm.sound.StreamAudio; import com.vectras.vm.x11.X11Activity; import java.io.File; @@ -667,7 +667,14 @@ public class VmControllerDialog extends DialogFragment { if (uri != null) { try { new Thread(() -> { - File selectedFilePath = new File(Objects.requireNonNull(FileUtils.getPath(getContext(), uri))); + String filePath = FileUtils.getPath(getContext(), uri); + + if (filePath == null) { + showErrorSelectedFileDialog(); + return; + } + + File selectedFilePath = new File(filePath); if (isAdded()) { requireActivity().runOnUiThread(() -> { diff --git a/app/src/main/java/com/vectras/vm/setupwizard/SetupFeatureCore.java b/app/src/main/java/com/vectras/vm/setupwizard/SetupFeatureCore.java index 3867716..d5bb1a9 100644 --- a/app/src/main/java/com/vectras/vm/setupwizard/SetupFeatureCore.java +++ b/app/src/main/java/com/vectras/vm/setupwizard/SetupFeatureCore.java @@ -3,7 +3,6 @@ package com.vectras.vm.setupwizard; import android.app.Activity; import android.content.Context; import android.os.Build; -import android.os.Environment; import android.util.Log; import com.vectras.vm.R; diff --git a/app/src/main/java/com/vectras/vm/setupwizard/SetupWizard2Activity.java b/app/src/main/java/com/vectras/vm/setupwizard/SetupWizard2Activity.java index 54cc9bb..684c073 100644 --- a/app/src/main/java/com/vectras/vm/setupwizard/SetupWizard2Activity.java +++ b/app/src/main/java/com/vectras/vm/setupwizard/SetupWizard2Activity.java @@ -1,9 +1,6 @@ package com.vectras.vm.setupwizard; -import static android.content.Intent.ACTION_VIEW; - import android.annotation.SuppressLint; -import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.res.Configuration; @@ -13,10 +10,8 @@ import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.transition.TransitionManager; -import android.view.LayoutInflater; +import android.util.Log; import android.view.View; -import android.view.ViewGroup; -import android.widget.BaseAdapter; import androidx.activity.OnBackPressedCallback; import androidx.activity.result.ActivityResultLauncher; @@ -29,7 +24,6 @@ import com.anbui.elephant.retrofit2utils.Retrofit2Utils; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import com.termux.app.TermuxActivity; -import com.termux.app.TermuxService; import com.vectras.qemu.MainSettingsManager; import com.vectras.vm.AppConfig; import com.vectras.vm.R; @@ -37,7 +31,6 @@ import com.vectras.vm.VMManager; import com.vectras.vm.creator.VMCreatorSelector; import com.vectras.vm.databinding.ActivitySetupWizard2Binding; import com.vectras.vm.databinding.SetupQemuDoneBinding; -import com.vectras.vm.databinding.SimpleLayoutListViewWithCheckBinding; import com.vectras.vm.main.MainActivity; import com.vectras.vm.utils.DeviceUtils; import com.vectras.vm.utils.DialogUtils; @@ -48,14 +41,9 @@ import com.vectras.vm.utils.ListUtils; import com.vectras.vm.utils.PermissionUtils; import com.vectras.vm.utils.TarUtils; import com.vectras.vm.utils.UIUtils; +import com.vectras.vterm.Terminal2; import com.vectras.vterm.TerminalBottomSheetDialog; -import java.io.BufferedReader; -import java.io.BufferedWriter; -import java.io.File; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.OutputStreamWriter; import java.util.ArrayList; import java.util.HashMap; import java.util.Objects; @@ -66,6 +54,8 @@ public class SetupWizard2Activity extends AppCompatActivity { ActivitySetupWizard2Binding binding; SetupQemuDoneBinding bindingFinalSteps; public static final int ACTION_SYSTEM_UPDATE = 1; + public static final int ACTION_CORE_SYSTEM_UPDATE = 2; + int ACTION; final int STEP_REQUEST_PERMISSION = 1; final int STEP_EXTRACTING_SYSTEM_FILES = 2; final int STEP_GETTING_DATA = 3; @@ -84,7 +74,6 @@ public class SetupWizard2Activity extends AppCompatActivity { String downloadBootstrapsCommand = ""; String tarPath = ""; String progressText ="0%"; - boolean isSystemUpdateMode = false; boolean isExecutingCommand = false; boolean isLibProotError = false; boolean aria2Error = false; @@ -188,7 +177,7 @@ public class SetupWizard2Activity extends AppCompatActivity { }); binding.btnTryAgain.setOnClickListener(v -> { - if (isSystemUpdateMode) { + if (ACTION == ACTION_SYSTEM_UPDATE) { uiController(STEP_SYSTEM_UPDATE); binding.btnSkipSystemUpdate.setVisibility(View.GONE); } else if (isLibProotError) { @@ -232,16 +221,22 @@ public class SetupWizard2Activity extends AppCompatActivity { uiController(STEP_EXTRACTING_SYSTEM_FILES); new Thread(() -> { VMManager.killallqemuprocesses(this); - FileUtils.delete(getFilesDir().getAbsolutePath() + "/data"); - FileUtils.delete(getFilesDir().getAbsolutePath() + "/distro"); - FileUtils.delete(getFilesDir().getAbsolutePath() + "/usr"); + if (ACTION == ACTION_CORE_SYSTEM_UPDATE) { + FileUtils.delete(getFilesDir().getAbsolutePath() + "/data"); + FileUtils.delete(getFilesDir().getAbsolutePath() + "/distro"); + FileUtils.delete(getFilesDir().getAbsolutePath() + "/usr"); + } runOnUiThread(this::extractSystemFiles); }).start(); }); if (getIntent().hasExtra("action")) { - if (getIntent().getIntExtra("action", -1) == ACTION_SYSTEM_UPDATE) { - isSystemUpdateMode = true; + ACTION = getIntent().getIntExtra("action", -1); + + if (ACTION == ACTION_CORE_SYSTEM_UPDATE) { + uiController(STEP_SYSTEM_UPDATE); + binding.btnSkipSystemUpdate.setVisibility(View.GONE); + } else if (ACTION == ACTION_SYSTEM_UPDATE) { uiController(STEP_SYSTEM_UPDATE); } } @@ -379,6 +374,11 @@ public class SetupWizard2Activity extends AppCompatActivity { } private void extractSystemFiles() { + if (ACTION == ACTION_SYSTEM_UPDATE) { + getDataForStandardSetup(); + return; + } + uiController(STEP_EXTRACTING_SYSTEM_FILES); executor.execute(() -> { @@ -423,7 +423,7 @@ public class SetupWizard2Activity extends AppCompatActivity { } } new Handler(Looper.getMainLooper()).postDelayed(() -> { - if (isSystemUpdateMode) { + if (ACTION == ACTION_SYSTEM_UPDATE) { startSetup(); } else { uiController(STEP_SETUP_OPTIONS); @@ -431,6 +431,7 @@ public class SetupWizard2Activity extends AppCompatActivity { }, 1000); } else { new Handler(Looper.getMainLooper()).postDelayed(() -> uiController(STEP_SETUP_OPTIONS), 1000); + Log.e("SetupWizard2Activity", "getDataForStandardSetup: " + error); } })); } @@ -465,32 +466,46 @@ public class SetupWizard2Activity extends AppCompatActivity { " apk update;" + " echo \"Installing packages...\";" + " apk add " + (DeviceUtils.is64bit() ? AppConfig.neededPkgs() - : AppConfig.neededPkgs32bit()) + ";" + - " echo \"Downloading Qemu...\";"; + : AppConfig.neededPkgs32bit()) + ";"; - if (isCustomSetupMode) { - cmd += " tar -xzvf " + tarPath + " -C /;" + - " rm " + tarPath + ";" + - " chmod 775 /usr/local/bin/*;"; - } else { - if (FileUtils.isFileExists(getFilesDir().getAbsolutePath() + "/distro/root/setup.tar.gz")) - FileUtils.delete(getFilesDir().getAbsolutePath() + "/distro/root/setup.tar.gz"); - - cmd += downloadBootstrapsCommand + ";" + + if (ACTION == ACTION_SYSTEM_UPDATE) { + cmd += "echo \"Uninstalling...\";" + + " rm -f /usr/local/bin/qemu-*;" + + " rm -f /usr/share/applications/qemu.desktop;" + + " rm -f /usr/share/icons/hicolor/*/qemu.png;" + + " rm -rf /usr/share/qemu;" + + downloadBootstrapsCommand + ";" + " echo \"Installing Qemu...\";" + " tar -xzvf setup.tar.gz -C /;" + " rm setup.tar.gz;" + " chmod 775 /usr/local/bin/*;"; + } else { + if (isCustomSetupMode) { + cmd += " echo \"Installing Qemu...\";" + + " tar -xzvf " + tarPath + " -C /;" + + " rm " + tarPath + ";" + + " chmod 775 /usr/local/bin/*;" + + " echo \"Just a sec...\";" + + " mkdir -p ~/.vnc && echo -e \"555555\\n555555\" | vncpasswd -f > ~/.vnc/passwd && chmod 0600 ~/.vnc/passwd;"; + } else { + if (FileUtils.isFileExists(getFilesDir().getAbsolutePath() + "/distro/root/setup.tar.gz")) + FileUtils.delete(getFilesDir().getAbsolutePath() + "/distro/root/setup.tar.gz"); + + cmd += " echo \"Downloading Qemu...\";" + + downloadBootstrapsCommand + ";" + + " echo \"Installing Qemu...\";" + + " tar -xzvf setup.tar.gz -C /;" + + " rm setup.tar.gz;" + + " chmod 775 /usr/local/bin/*;" + + " echo \"Just a sec...\";" + + " mkdir -p ~/.vnc && echo -e \"555555\\n555555\" | vncpasswd -f > ~/.vnc/passwd && chmod 0600 ~/.vnc/passwd;"; + + } } - cmd += " echo \"Just a sec...\";" + - " echo export TMPDIR=/tmp >> /etc/profile;" + - " mkdir -p $TMPDIR/pulse;" + - " echo export PULSE_SERVER=127.0.0.1 >> /etc/profile;" + - " mkdir -p ~/.vnc && echo -e \"555555\\n555555\" | vncpasswd -f > ~/.vnc/passwd && chmod 0600 ~/.vnc/passwd;" + - " echo \"Installation successful! xssFjnj58Id\""; + cmd += " echo \"Installation successful! xssFjnj58Id\""; - executeShellCommand(cmd); + execute(cmd); }); }).start(); } @@ -526,83 +541,17 @@ public class SetupWizard2Activity extends AppCompatActivity { } }); - public void executeShellCommand(String userCommand) { - isExecutingCommand = true; - new Thread(() -> { - try { - // Set up the process builder to start PRoot with environmental variables and commands - ProcessBuilder processBuilder = new ProcessBuilder(); + private void execute(String command) { + Terminal2 terminal2 = new Terminal2(this); + terminal2.execute(command, new Terminal2.Terminal2Callback() { + @Override + public void onRunning(String command, String newLine) { + runOnUiThread(() -> appendTextAndScroll(newLine + "\n")); + } - // Adjust these environment variables as necessary for your app - String filesDir = getFilesDir().getAbsolutePath(); - - File tmpDir = new File(getFilesDir(), "usr/tmp"); - - // Setup environment for the PRoot process - processBuilder.environment().put("PROOT_TMP_DIR", tmpDir.getAbsolutePath()); - - processBuilder.environment().put("HOME", "/root"); - processBuilder.environment().put("USER", "root"); - processBuilder.environment().put("PATH", "/bin:/usr/bin:/sbin:/usr/sbin"); - processBuilder.environment().put("TERM", "xterm-256color"); - processBuilder.environment().put("TMPDIR", tmpDir.getAbsolutePath()); - processBuilder.environment().put("SHELL", "/bin/sh"); - - String[] prootCommand = { - TermuxService.PREFIX_PATH + "/bin/proot", // PRoot binary path - "--kill-on-exit", - "--link2symlink", - "-0", - "-r", filesDir + "/distro", // Path to the rootfs - "-b", "/dev", - "-b", "/proc", - "-b", "/sys", - "-b", "/sdcard", - "-b", "/storage", - "-b", "/data", - "-w", "/root", - "/bin/sh", - "--login"// The shell to execute inside PRoot - }; - - processBuilder.command(prootCommand); - Process process = processBuilder.start(); - // Get the input and output streams of the process - BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(process.getOutputStream())); - BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); - BufferedReader errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream())); - - // Send user command to PRoot - writer.write(userCommand); - writer.newLine(); - writer.flush(); - writer.close(); - - // Read the input stream for the output of the command - String line; - while ((line = reader.readLine()) != null) { - final String outputLine = line; - runOnUiThread(() -> appendTextAndScroll(outputLine + "\n")); - } - - // Read any errors from the error stream - while ((line = errorReader.readLine()) != null) { - final String errorLine = line; - runOnUiThread(() -> appendTextAndScroll(errorLine + "\n")); - } - - // Clean up - reader.close(); - errorReader.close(); - - // Wait for the process to finish - process.waitFor(); - - // Wait for the process to finish - int exitValue = process.waitFor(); - - // Check if the exit value indicates an error - if (exitValue != 0) { + @Override + public void onFinished(String command, String log, int status) { + if (status != terminal2.SUCCESS) { isExecutingCommand = false; if (aria2Error && downloadBootstrapsCommand.contains("aria2c")) { runOnUiThread(() -> { @@ -611,22 +560,22 @@ public class SetupWizard2Activity extends AppCompatActivity { }); } else { runOnUiThread(() -> { - String toastMessage = "Command failed with exit code: " + exitValue; + String toastMessage = "Command failed with exit code: " + status; appendTextAndScroll("Error: " + toastMessage + "\n"); uiController(STEP_ERROR, logs); }); } } - } catch (IOException | InterruptedException e) { - isExecutingCommand = false; - // Handle exceptions by printing the stack trace in the terminal output - final String errorMessage = e.getMessage(); + } + + @Override + public void onError(String command, Exception exception) { runOnUiThread(() -> { - appendTextAndScroll("Error: " + errorMessage + "\n"); + appendTextAndScroll("Error: " + exception.getMessage() + "\n"); uiController(STEP_ERROR, logs); }); } - }).start(); // Execute the command in a separate thread to prevent blocking the UI thread + }); } @SuppressLint("SetTextI18n") @@ -636,9 +585,10 @@ public class SetupWizard2Activity extends AppCompatActivity { if (newLog.contains("xssFjnj58Id")) { isExecutingCommand = false; MainSettingsManager.setStandardSetupVersion(this, AppConfig.standardSetupVersion); + MainSettingsManager.setCoreSetupVersion(this, AppConfig.coreSetupVersion); MainSettingsManager.setsetUpWithManualSetupBefore(this, isCustomSetupMode); uiController(STEP_JOIN_COMMUNITY); - if (isSystemUpdateMode) { + if (ACTION == ACTION_SYSTEM_UPDATE) { uiControllerFinalSteps(STEP_FINISH); } } else if (newLog.contains("libproot.so --help") || newLog.contains("/bin/sh: can't fork:")) { @@ -694,65 +644,6 @@ public class SetupWizard2Activity extends AppCompatActivity { }), getString(R.string.mirrors)); } - public static class SpinnerSelectMirrorAdapter extends BaseAdapter { - - private final ArrayList> data; - private final LayoutInflater inflater; - private final int selectedPosition; - - public SpinnerSelectMirrorAdapter(Context context, ArrayList> arr) { - this.data = arr; - this.inflater = LayoutInflater.from(context); - this.selectedPosition = MainSettingsManager.getSelectedMirror(context); - } - - @Override - public int getCount() { - return data.size(); - } - - @Override - public HashMap getItem(int position) { - return data.get(position); - } - - @Override - public long getItemId(int position) { - return position; - } - - @Override - public View getView(int position, View convertView, ViewGroup parent) { - SetupWizard2Activity.SpinnerSelectMirrorAdapter.ViewHolder holder; - - if (convertView == null) { - // Inflate binding only once for each new item - SimpleLayoutListViewWithCheckBinding simpleLayoutListViewWithCheckBinding = - SimpleLayoutListViewWithCheckBinding.inflate(inflater, parent, false); - - // Create ViewHolder to hold binding - holder = new SetupWizard2Activity.SpinnerSelectMirrorAdapter.ViewHolder(simpleLayoutListViewWithCheckBinding); - convertView = simpleLayoutListViewWithCheckBinding.getRoot(); - convertView.setTag(holder); - } else { - // Get back the saved ViewHolder - holder = (SetupWizard2Activity.SpinnerSelectMirrorAdapter.ViewHolder) convertView.getTag(); - } - - // Assign data - HashMap item = data.get(position); - holder.simpleLayoutListViewWithCheckBinding.textview.setText(item.get("location")); - holder.simpleLayoutListViewWithCheckBinding.ivCheck.setVisibility(position == selectedPosition ? View.VISIBLE : View.INVISIBLE); - - - return convertView; - } - - // ViewHolder holds binding for reuse - private record ViewHolder(SimpleLayoutListViewWithCheckBinding simpleLayoutListViewWithCheckBinding) { - } - } - public String getPath(Uri uri) { return FileUtils.getPath(this, uri); } diff --git a/app/src/main/java/com/vectras/vm/utils/StreamAudio.java b/app/src/main/java/com/vectras/vm/sound/StreamAudio.java similarity index 98% rename from app/src/main/java/com/vectras/vm/utils/StreamAudio.java rename to app/src/main/java/com/vectras/vm/sound/StreamAudio.java index a513eed..756ff72 100644 --- a/app/src/main/java/com/vectras/vm/utils/StreamAudio.java +++ b/app/src/main/java/com/vectras/vm/sound/StreamAudio.java @@ -1,4 +1,4 @@ -package com.vectras.vm.utils; +package com.vectras.vm.sound; import android.app.Activity; import android.content.Context; @@ -7,6 +7,8 @@ import android.media.AudioFormat; import android.media.AudioTrack; import android.util.Log; +import com.vectras.vm.utils.FileUtils; + import java.io.RandomAccessFile; public class StreamAudio { diff --git a/app/src/main/java/com/vectras/vm/utils/CommandUtils.java b/app/src/main/java/com/vectras/vm/utils/CommandUtils.java index e577ff7..c2321da 100644 --- a/app/src/main/java/com/vectras/vm/utils/CommandUtils.java +++ b/app/src/main/java/com/vectras/vm/utils/CommandUtils.java @@ -1,9 +1,11 @@ package com.vectras.vm.utils; import android.app.Activity; +import android.content.Context; import com.vectras.vm.VectrasApp; import com.vectras.vterm.Terminal; +import com.vectras.vterm.Terminal2; public class CommandUtils { public static String createForSelectedMirror(boolean _https, String _url, String _beforemain) { @@ -18,24 +20,23 @@ public class CommandUtils { } public static void run(String _command, boolean _isShowResult, Activity _activity) { - Terminal vterm = new Terminal(_activity); - vterm.executeShellCommand2(_command, _isShowResult, _activity); + new Terminal2(_activity).execute(_command); } - public static String getQemuVersionName() { - String qemuVersion = getQemuVersion(); + public static String getQemuVersionName(Context context) { + String qemuVersion = getQemuVersion(context); if (qemuVersion.toLowerCase().contains("failed") || qemuVersion.toLowerCase().contains("not found")) return ""; - return (qemuVersion.contains("Error") ? qemuVersion.substring(0, qemuVersion.indexOf("Error")) : qemuVersion) + (is3dfxVersion() ? " - 3dfx" : ""); + return (qemuVersion.contains("Error") ? qemuVersion.substring(0, qemuVersion.indexOf("Error")) : qemuVersion) + (is3dfxVersion(context) ? " - 3dfx" : ""); } - public static String getQemuVersion() { - return VectrasApp.getContext() == null ? "Unknow" : Terminal.executeShellCommandWithResult("qemu-system-x86_64 --version | head -n1 | awk '{print $4}'", VectrasApp.getContext()).replaceAll("\n", ""); + public static String getQemuVersion(Context context) { + return VectrasApp.getContext() == null ? "Unknow" : new Terminal2(context).executeOnThisThread("qemu-system-x86_64 --version | head -n1 | awk '{print $4}'").replaceAll("\n", ""); } - public static boolean is3dfxVersion() { - return VectrasApp.getContext() != null && Terminal.executeShellCommandWithResult("qemu-system-x86_64 --version", VectrasApp.getContext()).contains("3dfx"); + public static boolean is3dfxVersion(Context context) { + return VectrasApp.getContext() != null && new Terminal2(context).executeOnThisThread("qemu-system-x86_64 --version").contains("3dfx"); } } diff --git a/app/src/main/java/com/vectras/vm/utils/DeviceUtils.java b/app/src/main/java/com/vectras/vm/utils/DeviceUtils.java index 1216e11..f90aad6 100644 --- a/app/src/main/java/com/vectras/vm/utils/DeviceUtils.java +++ b/app/src/main/java/com/vectras/vm/utils/DeviceUtils.java @@ -70,7 +70,13 @@ public class DeviceUtils { } public static boolean is64bit() { - return new CpuHelper().is64Bit(); + try { + return new CpuHelper().is64Bit(); + } catch (UnsatisfiedLinkError e) { + return Build.SUPPORTED_ABIS[0].contains("64") && + Build.SUPPORTED_64_BIT_ABIS != null && + Build.SUPPORTED_64_BIT_ABIS.length > 0; + } } public static boolean isArm() { return Build.SUPPORTED_ABIS[0].contains("arm"); diff --git a/app/src/main/java/com/vectras/vm/utils/GmsChecker.java b/app/src/main/java/com/vectras/vm/utils/GmsChecker.java new file mode 100644 index 0000000..4e8a5ab --- /dev/null +++ b/app/src/main/java/com/vectras/vm/utils/GmsChecker.java @@ -0,0 +1,13 @@ +package com.vectras.vm.utils; + +import android.content.Context; + +import com.google.android.gms.common.ConnectionResult; +import com.google.android.gms.common.GoogleApiAvailability; + +public class GmsChecker { + public static boolean isAvailable(Context context) { + GoogleApiAvailability googleApiAvailability = GoogleApiAvailability.getInstance(); + return googleApiAvailability.isGooglePlayServicesAvailable(context) == ConnectionResult.SUCCESS; + } +} diff --git a/app/src/main/java/com/vectras/vm/utils/JSONUtils.java b/app/src/main/java/com/vectras/vm/utils/JSONUtils.java index 6953428..7a7c3fa 100644 --- a/app/src/main/java/com/vectras/vm/utils/JSONUtils.java +++ b/app/src/main/java/com/vectras/vm/utils/JSONUtils.java @@ -1,5 +1,7 @@ package com.vectras.vm.utils; +import android.util.Log; + import com.google.gson.Gson; import com.google.gson.JsonArray; import com.google.gson.JsonElement; @@ -14,11 +16,14 @@ import java.util.HashMap; import java.util.Objects; public class JSONUtils { + private static final String TAG = "JSONUtils"; + public static boolean isValidFromString(String _content) { try { JsonElement element = JsonParser.parseString(_content); return element != null; } catch (Exception e) { + Log.e(TAG, "isValidFromString: " + e.getMessage()); return false; } } diff --git a/app/src/main/java/com/vectras/vm/utils/LibraryChecker.java b/app/src/main/java/com/vectras/vm/utils/LibraryChecker.java index 87c5126..81f2da3 100644 --- a/app/src/main/java/com/vectras/vm/utils/LibraryChecker.java +++ b/app/src/main/java/com/vectras/vm/utils/LibraryChecker.java @@ -2,14 +2,16 @@ package com.vectras.vm.utils; import android.app.Activity; import android.content.Context; +import android.os.Handler; +import android.os.Looper; import androidx.appcompat.app.AlertDialog; import com.vectras.vm.AppConfig; import com.vectras.vm.R; import com.vectras.vterm.Terminal; +import com.vectras.vterm.Terminal2; -import java.util.Arrays; import java.util.HashSet; import java.util.Set; @@ -66,30 +68,69 @@ public class LibraryChecker { () -> { // Create the installation command String installCommand = "apk add " + missingLibraries.replace("\n", " "); - new Terminal(context).executeShellCommand(installCommand, true, true, activity); + + Terminal2 terminal2 = new Terminal2(context); + terminal2.setShowProgressDialog(true); + terminal2.execute(installCommand, new Terminal2.Terminal2Callback() { + @Override + public void onRunning(String command, String newLine) { + // Nothing to do. + } + + @Override + public void onFinished(String command, String log, int status) { + new Handler(Looper.getMainLooper()).post(() -> { + if (status == terminal2.SUCCESS) { + DialogUtils.oneDialog( + activity, + activity.getString(R.string.done), + activity.getString(R.string.the_necessary_packages_have_been_installed), + R.drawable.check_24px + ); + } else { + DialogUtils.oopsDialog(context, log); + } + }); + } + + @Override + public void onError(String command, Exception exception) { + new Handler(Looper.getMainLooper()).post(() -> DialogUtils.oopsDialog(context, exception.getMessage())); + } + }); }, null, null ); } - // Method to show the "All Libraries Installed" dialog - private void showAllLibrariesInstalledDialog(Activity activity) { - new AlertDialog.Builder(activity, R.style.MainDialogTheme) - .setTitle("All Libraries Installed") - .setMessage("All required libraries are already installed.") - .setPositiveButton("OK", (dialog, which) -> dialog.dismiss()) - .show(); - } - // Method to check if the package is installed public void isPackageInstalled(String packageName, Terminal.CommandCallback callback) { String command = "apk info"; - Terminal terminal = new Terminal(context); - terminal.executeShellCommand(command, (Activity) context, false, (output, errors) -> { - if (callback != null) { - callback.onCommandCompleted(output, errors); + Terminal2 terminal2 = new Terminal2(context); + terminal2.execute(command, new Terminal2.Terminal2Callback() { + @Override + public void onRunning(String command, String newLine) { + // Nothing to do. + } + + @Override + public void onFinished(String command, String log, int status) { + new Handler(Looper.getMainLooper()).post(() -> { + if (callback != null) { + if (status == terminal2.SUCCESS) { + callback.onCommandCompleted(log, ""); + } else { + callback.onCommandCompleted(log, log); + } + } + }); + } + + @Override + public void onError(String command, Exception exception) { + new Handler(Looper.getMainLooper()).post(() -> callback.onCommandCompleted("", exception.getMessage())); } }); } @@ -98,59 +139,30 @@ public class LibraryChecker { public static void isPackageInstalled2(Context context, String packageName, Terminal.CommandCallback callback) { String command = "apk info"; - Terminal terminal = new Terminal(context); - terminal.executeShellCommand(command, context, false, (output, errors) -> { - if (callback != null) { - callback.onCommandCompleted(output, errors); + Terminal2 terminal2 = new Terminal2(context); + terminal2.execute(command, new Terminal2.Terminal2Callback() { + @Override + public void onRunning(String command, String newLine) { + // Nothing to do. + } + + @Override + public void onFinished(String command, String log, int status) { + new Handler(Looper.getMainLooper()).post(() -> { + if (callback != null) { + if (status == terminal2.SUCCESS) { + callback.onCommandCompleted(log, ""); + } else { + callback.onCommandCompleted(log, log); + } + } + }); + } + + @Override + public void onError(String command, Exception exception) { + new Handler(Looper.getMainLooper()).post(() -> callback.onCommandCompleted("", exception.getMessage())); } }); } - - public void checkAndInstallXFCE4(Activity activity) { - // XFCE4 meta-package - String xfce4Package = "xfce4"; - - // Check if XFCE4 is installed - isPackageInstalled(xfce4Package, (output, errors) -> { - boolean isInstalled = false; - - // Check if the package exists in the installed packages output - if (output != null) { - Set installedPackages = new HashSet<>(); - for (String installedPackage : output.split("\n")) { - installedPackages.add(installedPackage.trim()); - } - - isInstalled = installedPackages.contains(xfce4Package.trim()); - } - - // If not installed, show a dialog to install it - if (!isInstalled) { - showInstallDialog(activity, xfce4Package); - } else { - showAlreadyInstalledDialog(activity); - } - }); - } - - private void showInstallDialog(Activity activity, String packageName) { - new AlertDialog.Builder(activity, R.style.MainDialogTheme) - .setTitle("Install XFCE4") - .setMessage("XFCE4 is not installed. Would you like to install it?") - .setCancelable(false) - .setPositiveButton("Install", (dialog, which) -> { - String installCommand = "apk add " + packageName; - new Terminal(context).executeShellCommand(installCommand, true, true, activity); - }) - .setNegativeButton("Cancel", (dialog, which) -> dialog.dismiss()) - .show(); - } - - private void showAlreadyInstalledDialog(Activity activity) { - new AlertDialog.Builder(activity, R.style.MainDialogTheme) - .setTitle("XFCE4 Installed") - .setMessage("XFCE4 is already installed on this system.") - .setPositiveButton("OK", (dialog, which) -> dialog.dismiss()) - .show(); - } } diff --git a/app/src/main/java/com/vectras/vm/x11/X11Activity.java b/app/src/main/java/com/vectras/vm/x11/X11Activity.java index ec41fe8..72803dd 100644 --- a/app/src/main/java/com/vectras/vm/x11/X11Activity.java +++ b/app/src/main/java/com/vectras/vm/x11/X11Activity.java @@ -2,8 +2,6 @@ package com.vectras.vm.x11; import static android.Manifest.permission.WRITE_SECURE_SETTINGS; -import android.app.Dialog; - import static android.content.pm.PackageManager.PERMISSION_GRANTED; import static android.os.Build.VERSION.SDK_INT; @@ -16,8 +14,6 @@ import static android.view.InputDevice.KEYBOARD_TYPE_ALPHABETIC; import static android.view.KeyEvent.*; import static android.view.WindowManager.LayoutParams.*; -import android.view.WindowManager; - import androidx.appcompat.content.res.AppCompatResources; import androidx.fragment.app.FragmentTransaction; @@ -37,7 +33,7 @@ import com.vectras.vm.manager.VmFileManager; import com.vectras.vm.manager.VmListManager; import com.vectras.vm.manager.VmPicker; import com.vectras.vm.utils.DialogUtils; -import com.vectras.vm.utils.StreamAudio; +import com.vectras.vm.sound.StreamAudio; import com.vectras.vm.utils.UIUtils; import static com.vectras.vm.x11.CmdEntryPoint.ACTION_START; @@ -80,7 +76,6 @@ import android.view.Window; import android.view.WindowInsets; import android.view.inputmethod.InputMethodManager; import android.widget.FrameLayout; -import android.widget.ImageButton; import android.widget.LinearLayout; import androidx.annotation.NonNull; @@ -98,7 +93,6 @@ import com.vectras.vm.x11.utils.KeyInterceptor; import com.vectras.vm.x11.utils.TermuxX11ExtraKeys; import com.vectras.vm.x11.utils.X11ToolbarViewPager; import com.vectras.vm.R; -import com.vectras.vterm.Terminal; import java.util.ArrayList; import java.util.HashMap; diff --git a/app/src/main/java/com/vectras/vterm/Terminal2.java b/app/src/main/java/com/vectras/vterm/Terminal2.java new file mode 100644 index 0000000..4949063 --- /dev/null +++ b/app/src/main/java/com/vectras/vterm/Terminal2.java @@ -0,0 +1,252 @@ +package com.vectras.vterm; + +import android.content.Context; +import android.os.Handler; +import android.os.Looper; +import android.util.Log; + +import com.vectras.vm.AppConfig; +import com.vectras.vm.R; +import com.vectras.vm.logger.VectrasStatus; +import com.vectras.vm.utils.FileUtils; +import com.vectras.vm.utils.ProgressDialog; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.File; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.util.Objects; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicReference; + +public class Terminal2 { + final String TAG = "Terminal2"; + public final int SUCCESS = 0; + public final int ERROR = 1; + Context context; + String user = "root"; + String home = "/root"; + String display = ":0"; + String shell = "/bin/sh"; + String startup = ""; + String logs = ""; + String lastLog = ""; + boolean isShowProgressDialog; + + ProgressDialog progressDialog = null; + + public interface Terminal2Callback { + void onRunning(String command, String newLine); + void onFinished(String command, String log, int status); + void onError(String command, Exception exception); + } + + public Terminal2(Context context) { + this.context = context; + } + + public void setUserName(String user) { + this.user = user; + home = user.equals("root") ? "/root" : "/home/" + user; + } + + public void setRootMode() { + this.user = "root"; + home = "/root"; + } + + public void setDefaultShell() { + this.shell = "/bin/sh"; + } + + public void setDefaultShellBash() { + this.shell = "/bin/bash"; + } + + public void setStartup(String command) { + this.startup = command; + } + + public String getLogs() { + return logs; + } + + public void clearLog() { + logs = ""; + } + + public void setShowProgressDialog(boolean isShow) { + this.isShowProgressDialog = isShow; + } + + public String executeOnThisThread(String command) { + execute(command, null, false); + return lastLog; + } + + public void execute(String command) { + execute(command, null); + } + + public void execute(String command, Terminal2Callback callback) { + execute(command, callback, true); + } + + public void execute(String command, Terminal2Callback callback, boolean isNewThread) { + AtomicReference process = new AtomicReference<>(); + + Runnable runnable = () -> { + + if (isShowProgressDialog) { + progressDialog = new ProgressDialog(context); + progressDialog.setText(context.getString(R.string.executing_command_please_wait)); + new Handler(Looper.getMainLooper()).post((progressDialog::show)); + } + + try { + ProcessBuilder processBuilder = new ProcessBuilder(); + + + String filesDir = Objects.requireNonNull(context.getFilesDir().getAbsolutePath()); + String prootPath = new File(filesDir, "usr/bin/proot").getAbsolutePath(); + String tmpDir = new File(filesDir, "usr/tmp").getAbsolutePath(); + + if (!FileUtils.isFileExists(filesDir + "/distro" + shell)) { + setDefaultShell(); + } + + if (!FileUtils.isFileExists(filesDir + "/distro" + home)) { + FileUtils.createDirectory(filesDir + "/distro" + home); + } + + processBuilder.environment().put("PROOT_TMP_DIR", tmpDir); + processBuilder.environment().put("HOME", home); + processBuilder.environment().put("USER", user); + processBuilder.environment().put("TERM", "xterm-256color"); + processBuilder.environment().put("TMPDIR", "/tmp"); + processBuilder.environment().put("SHELL", shell); + processBuilder.environment().put("DISPLAY", display); + processBuilder.environment().put("XDG_RUNTIME_DIR", "/tmp"); + processBuilder.environment().put("SDL_VIDEODRIVER", "x11"); + + String[] prootCommand = { + prootPath, + "--kill-on-exit", + "--link2symlink", + "-0", + "-r", filesDir + "/distro", + "-b", "/dev", + "-b", "/proc", + "-b", "/sys", + "-b", AppConfig.internalDataDirPath + "distro" + home + ":/dev/shm", + "-b", "/sdcard", + "-b", "/storage", + "-b", "/data", + "-b", AppConfig.internalDataDirPath + "usr/tmp:/tmp", + "-w", home, + shell, + "--login" + }; + + processBuilder.command(prootCommand); + process.set(processBuilder.start()); + + resultData data = startProcess((startup.isEmpty() ? "" : startup + " && ") + command, process.get(), callback); + + if (callback != null) callback.onFinished(command, data.log.toString(), data.status); + } catch (IOException e) { + if (callback != null) callback.onError(command, e); + + addToLogs(command, e.getMessage()); + } finally { + if (progressDialog != null) { + new Handler(Looper.getMainLooper()).post(() -> { + progressDialog.reset(); + progressDialog = null; + }); + } + } + }; + + if (isNewThread) { + new Thread(runnable).start(); + } else { + runnable.run(); + } + } + + private resultData startProcess(String command, Process process, Terminal2Callback callback) { + resultData data = new resultData(); + AtomicInteger exitCode = new AtomicInteger(); + + int MAX_LOG_SIZE = 200_000; // ~200KB text + StringBuilder output = new StringBuilder(); + try { + BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(process.getOutputStream())); + BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); + + writer.write(command); + writer.newLine(); + writer.flush(); + writer.close(); + + String line; + while ((line = reader.readLine()) != null) { + Log.d(TAG, line); + VectrasStatus.logError(line); + output.append(line).append("\n"); + if (callback != null) callback.onRunning(command, line); + + if (output.length() > MAX_LOG_SIZE) { + output.delete(0, output.length() - MAX_LOG_SIZE); + } + + if (progressDialog != null) { + String finalLine = line; + new Handler(Looper.getMainLooper()).post(() -> progressDialog.setText(finalLine)); + } + } + + try { + exitCode.set(process.waitFor()); + } catch (InterruptedException e) { + exitCode.set(ERROR); + } + data.status = exitCode.get(); + + reader.close(); + } catch (Exception e) { + output.append(e.getMessage()); + Log.e(TAG, "streamLog: ", e); + } + + data.status = exitCode.get(); + data.log = output; + + addToLogs(command, output.toString()); + + return data; + } + + private void addToLogs(String command,String log) { + lastLog = log; + + if (!logs.isEmpty()) { + logs += "\n\n----------\n\n"; + } + + logs += "$ " + command + "\n\n"; + + logs += log; + + if (logs.contains("\n") && logs.lastIndexOf("\n") > 1000) + logs = logs.substring(logs.lastIndexOf("\n") + 1); + } + + private class resultData { + StringBuilder log; + int status; + } +} diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index 9dea90b..5365e25 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -609,6 +609,8 @@ Bạn cần tắt tất cả máy ảo đang chạy để thực hiện hành động này. Tự động chuyển sang chuột ngoài Tự động chuyển đổi khi kết nối và ngắt chuột rời. + Các gói cần thiết đã được cài đặt. + Đã xảy ra lỗi khi tạo ổ đĩa ảo. Vterm diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f7263e9..1bf76eb 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -627,6 +627,8 @@ You need to shut down all running virtual machines to perform this action. Auto switch to external mouse Automatically switches when the mouse is connected and disconnected. + The necessary packages have been installed. + An error occurred while creating the virtual drive. diff --git a/fastlane/metadata/android/en-US/full_description.txt b/fastlane/metadata/android/en-US/full_description.txt deleted file mode 100644 index 4f8d23f..0000000 --- a/fastlane/metadata/android/en-US/full_description.txt +++ /dev/null @@ -1,15 +0,0 @@ -Welcome to Vectras VM! A virtual machine app for Android based on QEMU that lets you emulate various OSes including: Linux, Windows, Android, macOS and more. - -Minimum System Requirements -- Android 6.0 and up. -- 3GB RAM (1GB of free RAM). -- A good processor. - -Recommended System Requirements -- Android 8.1 and up. -- 8GB RAM (3GB of free RAM). -- CPU and Android OS support 64-bit. -- Snapdragon 855 CPU or better. -- Integrated or removable cooling system (if running operating systems from 2010 to present). - -Tips: If the OS you are trying to emulate crashes, try using an older version. diff --git a/fastlane/metadata/android/en-US/images/featureGraphic.jpg b/fastlane/metadata/android/en-US/images/featureGraphic.jpg deleted file mode 100644 index c0044d69738ccc6cc5df5092d6d5d793b22c05f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61484 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⪼fe({0DEUb0ed5MhN>9 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 Z1;*Wa{*{Ppz6JJ^zdWsf9b|u|{|hT1uDJjJ diff --git a/fastlane/metadata/android/en-US/images/icon.png b/fastlane/metadata/android/en-US/images/icon.png deleted file mode 100644 index 29d6c324ee234409ce1df20e84ea69d9d5c0795b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19643 zcmb@t^+QzO*EW1+h7Jko2I)@eP*9Lix;v#?KxzPKkPt*^MG)zbMp8f;q<%WTw;0$*TQswgS|cc}llKfb;LpI~}D zQ+tBBiA{vf$`^br3O-WFc&6}3+jn+%!6%buJ#hVESZm?k5yL$X206k^O8zK=IOU&s zg-XwA3$6G2JZkrc7Sr~<>--NRs;3;#9PZ7#_7Bm($e$8>c*}`UE`v3i3GGW2AWFqtAEV3L! z31T{w)_c(u6{R|ub8HhPTMZX^I;h*Sp*r;Vxx5*+HmpWYh@W1cB0vNqVM_I~nkpP1 zO8RCU(vEO6|DD4Y@}NxvK{1kX^n(%z5BoSe(+JP(UhEY4!_($rPFq2&kHg(Aa(M)w zL|kdcnVn>0@(~e<%l4nA2A`kdjSyr4Z()%kVQmnEnmOi37%q-{`!G96X5`QSi3imU z=e*91GU7MFF%Y>QE+?I6+gwRbl+=MG{|I9Pb`R1Nq8GB;*54LnTq8#s%CX^u2KK=* z7jP4IgN>OAS)-|3_ zQ*KG9oB@r^^UkFxuA|ob^|Vvp%FB$0!oUMCckjf`!Q6w;p_z8#OREMDDjkom3SZkB z+qEPBu9%abBfvRn=tYweItWt)b=x*`z@JY)=?tF#UBZ~h4#4v{G0R%{OGcDrP~Ap} zphV=jTOiPwtEm#}AN1LuZ@Xt*$zV6bL_-Mb$;I4zc$k)b`U{kYcZS`;NB;txd58tXAZ zTb-L0UfMBF$nOQuZmM7cQRjVnV4>dsh9%ILiHTUnVhQewD1u0`FDF4+8m8V!TrS+Z zrgP(Q!I1Snyib(G{${rya5>Cv?NZ~DGLB))T{#u|dfc?6D3tyhnTe4h48_8K6yQsv)^I4Pj#o$cK0@8 zqP!;M?IQ&R;vT4U+Y+Xk;wRz9a@S{x*ztE5h$YBAX8OoY5GWD4jH9y$ZLPrF{b_;& z0?5IlB&+Z(IqZ%AX_{LweI@elrfxEM(3X;RP*6&+;};UE^FbaS0ltu+VBgD!vHNq; zt}H}JZv-(kITE}i)V#e}baZsIb#&DYbRO9}LErRB*Y3k@5j`E$E*oo0gSY0QJ(deN zi>ofXzJnoU=8bPFtxH+n_44zJshTZOzRlUluRFtIdw%S3{>%M&=Emyyx3S}_&2`l~ zz-|anke~nO2$DZ9kFo>`k4k|I3!!GxGI`=0h>!2>Jw7opGOqnX#q$B~T3v_opos|!mk`LNw`sIFl; z^|!Jz=2Ydb(h%pLYD!a>*FK03H4j~`uzr4rCXP|?c8T2P0O_$m%$8f?-`a}#6{VTD z?yYyFnf{H>x|(iqq`xAdSzGBHJII}Ot>tp1;C5Aq9;F?xj&S? zysyfViO4T4Kd6oj>di}#?kQWi68E$vTsmV52+lNBCra|*pD3M( zi4iU>RWoipU|I~Ct7$&Dl6?73vq{=3I9{aR{3%;l)QxQT-J^DE*)@;)Bi&+9f*U>4{&?WT}-Ruf4xs|`t5IB{uQJkebncI8kIVK8oDh0Vur6CiEt zUv#N|{|IL zuz4a|&TL;&9@}(-Cm(&|k%?2iuLvnAY0}T=jH&;PT1156eDpuLl6ml*r)N<6ZlCBOqZ3*(GF%&Dx+5Ax zcc4gNBxc*YY}mHiDcFY1?DB9S;4YHD6M;yoJh*naexlH) z=pupuUBUd_SdX|bl0Whu{okAYK*>@bHH|u4jA^ua^k(QW*{T%D-)Ekz*B3kpStyT& zjM>AC)o{?C1P7dQ%?ICEfu7{=Y5NCXyf8wdq|aDIxk&Onbk{qNvRl#Ry)kLh zb(~9}byK|OGaF!&y`+-~nrbqrbFZHV?$C-PWk8`T3`tq7O6xITZDw*o~ z^@}}0`aml9M%3(&9l>q#?d>DE_|~YXIHB$u+)2adIeT_J)czC{6qbWq`QL>_pU&7) zm@~SpwygtqFYbqHb zVV!HCoU5mBlq#tiU1%pFN>ad)Z`+nUMK%PVOAy>#a|nJMm=_JGC2^y5i3)h+0wWOw zgdugr?O$Xm>9hAjf){a`UQi=7LCBgH>!c{En+gySeGGGY*ngU~guuP?5Cx50vIyff zwi~WG`e-CPl)L4AJ(?cm*S4o2ZqxI2*%qu}IwpNr4lD>ye?>-Z;_gN_!DBclgo#P; zzQxzJ(NVkvsY`CN+bMdFV}0f&>|XOiPdt7Gk?X3XGhuE zVD844>xW&NhuiuCcTUU{TOA9ugiUZ)n=L_mx9wr`SAP{LXlP>oeB*6jz=<;c0%2I+ z3TAYPv+|aylT8jc+X*Xgfqor&O{>cPf=hjXiuwak`3|n;lbmAWG$T2npg!wy(Hxn z6l^;v!uGG4>rcE}4tB4^ULPy8T7AAka@-^Y;NHGUQUu*tH{qBry3Nu6%gb;H^H}ps4 z-2oM3rV=hP`K*9^wtaCn5o1Io1`7W;*!8e!v;zbZ@)&Ol$lPRL&}; zhsXf7$Fi zx+Yn=U4%K!)jn9lKhb2`!zA*^JedqpmNV~9ME}(rXbdVzL$hjuNXGYMc4BP zBrx8F!=L=OZb5#rfiMEuuI=*u-gVnzw>rq-D~PngI4PX8UC%U=BJ^tUjr>hJ%+o-_ z{BaK4W?Ids-ac$XKpi~0Hp70$^8GbCf*Zk{cQC(tBOo?!cE1qTCUGcmJ^c3UI@r23 z<4U&GjxkdJxuXn6Z8cM6nmo6>Jm)I-lEQUQ23#&5rtV{5T1Xxqpi@r-czZ4;hX_4D zBIu^2=lt*1=U=(7Fx1oX>tgfcfHvUqXwtB@^%~=a)CDvz&(Dab0$cCN@D)xYp)*j} zePWq;brX#1dfL%>wKj4TY-sm@hN=DuE$oScwP6RRoa;U%-Q~p?jr9Av83>oVJcR4> z^nNoYJX7$AbH(3p4KAKPBYOxsikHRXnQ-HEpdB@^j{G-ig;u#yQO4?%XMVR`dLWJ% z3UIC>_F<&$J#5p^1=4%R&hOsIBR7K1>>jC>p$UIOHP1BCN8b?lO8J^S(>*fcCi8H6 znfJ>BN^C+K-~+)xe^11#%s1-<G4+FvD_|e;6 zzB8a_l$2KM#i@Y~gi+t>NlxKsQH6fJ*Qf!Yi+m!kz?&NlUs@EIWRt6dDJU?f31Glz zWIRH9a(o%h>L66TS|Wi}g-|&hy{Zp$r#v)bu<}fx^+Rdt`Xf&xH%W7$prH-Wt0ftO zK+S2PHta9k>-81^QD`n>%uO68;9Gxi=Q-Qrx?Jy^t#ehE27IfXCH z;hhjnjEL#lK+Lc(&z4YpzQQBkK0v*b2G-Ux#tZ!1(!F}a7`kB1w;=UO64gZkh){g$ zyL++#W@tIv1$}&g{u^K%X~ z8_l4nPX%eDeBUG`i7ocObqB@imRN=jRm{v}!vyew%2EK&c3$t< z#|pUmw18W+3nrL9GRE4txkW86`v}cnuX}Xqgtz2TRbrSgsKDV1=vCu zyzRA1L6fr(l&d2~M~91Hr4hSOnn^PFWCLJzkEmA^9bW&TBF0=aNHGnC35Y4dMwGY^ zXHfS|&i{3TfK9+BDhsm^aTRPXP*;^&*nyv;1}fOa#9+X<$Oj1ZEPC43P~q=7lQ9(4 zOHdC7aDVtp(%e8Dn<7U*9c2q^k0A_uaqjQXMKFahUcKy=1Cfj*I$V=b7iyT+k4O6C_g_`pHcEq*`T5%Wzd{0jN}%sf;XwEkZg;G4c~7fh%2 zeTs6l|GaS&RPI}PMT(o46=L^aBpdq-B%+C@!krZBP=fJzgahQeJZ3R(*uFo~VlajQ zPU*)1Fh`S@(2k7mu3`VPHjjH$=!qm&c`(fps`-0u$+M?c8@r=YD1n4<0?$_R=Vu{W z+E8s=LLwq{Kq8#P^g6utxY<26&b_$HssM!I)x0j6aGy zsoc8Hz@%BL4PnP@sDq8OfieXLX_=RSsHs%!W|&~TH2usN%EV-&3dzk>-JqBbr`LuG zgV96jLW3UeA@J!%o2HXLd5f#SToB$5Ox(tpT%CzWXh2@7WPTJ0&^J0A7h+-^-#+)6 zz?9!WU7KEM-QhSD{mcByZOrPeDLbChCk`MbV_sRVUlYWlGUm05xIZwDB&`r%jBvYs zeK&=5@CV1oC)HC0wevr92)Wc9U$8y1X|Ll?u8FhekczW3+xdNELJShL zFY4g5AJanLKb#U6F>H1|`*U(SaPvyerE@>Ou&}70tR=gvKdth$4fVE!gh8zrQE3fF zx`UJhm-O%K2xesu19M?VN{RzJs?Rao@RX0s@DK41>tso|#7xW!#$ z@I*&jui(HdpU;Nf>1RBuW(U-ydJi}j{rxi$>vwfROS4J4@@>6*Rq;%^<9>ov@AAzR zB`saIVK@*S0fnPY0DOgLPK?|6O6Y;m0#ayba_cjl3iAtPmmjNCd-XRMWj_urXV*lN zp4)%__Def1#H%l_r8c>7R{8y4YiQl~@;^z`<%p}Z+t42R;E2Ue%*r4yTCe;74j@WM z7h8YrDW<-P!`u(TV{9=!EG(6b%@~}?S|7Km9@$@4OYZ2!@4ss%Jtw^?R8Wq9aB^vu zn8@Vh$GRX6)wVDC&P0(5m2K9QFrCe4Q`EA#1dJ#8J& zE}e|?W7mK;gRV_6?;{*iFP^OB7I3PqH$J>YzN@P)sfpmb9-H#JnV>!Yh=s|L!WUAQ*k?(ZlrZ z;)@;Gpx87s-=v+5LTK$uI25kx>_pl=XkEI`2@#h^<0;z-9`x2b>3gp(C2+7j}PRNt*C)|Z60;2eed)v zgf-PRP*Jk=;v0eI*hHGTi9twL;Q@K?SM$)4%URCa=3UO)-PQ|!72R^k@L0;MpdAk2 z5d`|tA(!jZ!RdmBNKJ0Dy6hK$mwC-cYg~n8MQ-G`U5k22U#i|0L>TS`oDI&O^b!b_ zJKG~G9>WK+q43PPmHao7Aoz1Fcs%KPZ)BB=CHsFYW?fX$Xikd=Am0M#4xxigpv`6-b8g^byQcns~#tBeG zFl#b%4F65%nmigRn=33T<~!X}iq-@Y?TyCp^teND29aEvUV|qh#=#d7=@}WuPxUC} zY?UB#1uUzNuB2X$bwwy~Q^3ee9jv<2bv~GT@Fsm!2YcHWzA2u|{Z=*Y&&2d;)%j?n z-dZI4YgOhzCMY{IH-k|_d`BaOQlB^_r|}8xs)OIL-&`Er2{srgmwYNx+L3C8|g`5R>u>!_d4oxRgv=X-uc2j$AYO?8*D$iq~rm3mrOGQ#(D zAk#9>_yeWU`(_2z9UL1T>i~)qM#s*#zwyL>kEnVk9qjU? z|GWErll*~|d*uhxreMAO^?DySJD}82AK_q5a(ZU)DoZevqH0GP|LPJkoy+)_+@C&A z!sBJho27<%kKN>JQLKc$y6cts z@+>ogz6BDN*CjI)MG+>TzTAML?2KOGT3KQr>X@d#ST$YoY2vp&sV?UDjX@trhd+fNPDhj`1M%Yw-{Moy z$pT9=7W%pbqCC~j!P3Tc<0Hm4q-bBhZ~#itRmbsdc~{(bRkT61Q*K@i*TL_ouB$Ag z9CUq$nFE;Eg}Pwv-)LyUY1w!rUr_GNId7U;UHr^<>#~&hp4E(S6@CVw103R$hNs7d zw|nU4m&Fl*f#S4deV3loh(2J{=?C}K#}`{z8%F&hGM%!{;fkl7t-D^2%uVsJUnnLk z-~gJMRV}O0Fr;jDxc@842*KQlR(|fX@+StkR2L-#uh-CIThDKt0OIPb!cC{ zg9q4)4D9dpUw#n;8K!+$Ch%Kl%AktK+l%|ETQ&_+vb>VGno~=4ni+BTTF8rg#7I+F z(Lnd)%klZ-;WXs@ETN-1vc2wEE2Ff(#`Ecw&6EToxcdXuy(Rp+bw2L71c+g>qVgN? zFoFKbJmkk7?iZ(MXIB%1YP|}+qCdy7-hZRii+^oiw>+HveMc4_2cn5X0x+*}V_tCw zAH}UE!7z%s?vAP+HWsjLSVmd4k;GYyNA9;;oL`Z1|B%lmWN`lqFjPL|$H@uCZaGM| z5H403!HqsVwl2AZWTpumCs4`UB`@!ZI*pLav#I`3fyn*oH>8s^zc_r=*~ad0{k8qi zq-0d+^SfgjO89UqRym#CU%rC^fI+}UT;k=$?}yV9xDG)De6$l%K!mwWfQZvN2_7r} z)R=xg`C!ejYVSdul&D`tMmLKqyI?iG={n1eL2W>e{R3^xdS1K3XP>{>_vhy}X7_w> zon8TiEjLs&dzd29V|D^b3t!KAE`g1cdj8Hb)AP~itfeZ9#Pm1-vHbhAgifu<(1@qI zgTf8>Z64qNjqkHQj&fgniSBHVeSGH&daUW*bL2ThWtdWZTh>$K9&8+Iz#iukx+7-e zduZqj{{cF46O4tp9&tRxjQ>j_I|6r zm1m#5o=iv;CrV4sB~ZRSCimx47y>0xS$!tFvn}*8we@36ZS<)K(Z~Q=9b|FG+Y`nv z^K2eep%VS=r$F4(@1IQ$KPv5sZr|SR;M;;ufGRke9vz5I)u2B;ZFmb8)EccBS=PqG zfe1~>ZWS3ax#xkSCm$@sp=~9UOvY7uKGwE2{IJN&yl(?h17P(0sXW=yYmqmXUu_+Y zl=(5?0IyD};s2rmN@&w^AFjmf=xJM}B`L(Ek@axNLF#IUV$~p;MF&tIW{v5#-I)v} zgAqT&LkE(6MwQ9Y-{aTTc*-nJ0w^T2c1!@I;7@so9J9se<`?CET9rK50kEoUEpk6s z=`;8%b40WkMXn1Zia8bvR|=*0Y=l4Z0gH{2I4M*MAbduMs~{5nc{V7?S_Awm5z7vO zF^;Xy{0tm@CA6ajeG82}nFa@7!nSn(agt~Log(qSQKKN74=zjJdgVVN;t&H@_9nUr z3T(j`l9|EA(L~NiPNNQRre~i4hGc#Xk>8U=(Eoe2+jx|YrNnFi&OqF03HMTHod5&# z|3>Xfj(*80SL_GAdjjt1(Px^Xbt7*m$ur`Ab9|1UqydBUU(soB5dA!h!K12+s#QUFDpgezEYPBg0A$)t&fl91(t?QgC< zw-1<}7BL2v~`{X2Q)2%|DSQVW&R=WwQ8RDWU6T($uAWNy@e%Z3|;dt-Bz z6F@4OLb4nvVS&$%*=%p2>M!Jym{CGZ*|3EQr(?=7Yy3MOfHnE)YbVw=OZv}IEAc@& zPl#FjdS7c_lRvwMnp{9Zt6&N|=YJ<6Ok`3(op*cp->Eaae>r!EWjM7MERqg5% zdkORZ^bF7EhTecp?gT>kPsC`^TQ~~{s$d>W?qnL2Mf?)~R{2pNma*vmdXi9wTzR}w zFBt4TX!H{+l1-ia-=|Bm|L9gU9{czYsQH%p9bt~M+}R;TDb)Th&J}HH72~CL41b$? zG}}jnhdmQ)O6MXXxeO96_wK$*pV>_|_WY*Pra0Sos<=tPwEuf6v(<#bM;l;zRloan z;HPuE^(UrPI)dOKjH^VPQ%~XPVVvO_^ci#6PG_Q>udZRv)OGQyZk;~_S8oRlDFz$= zmLumcex2{xaY>z3d)wohUIt~A-jWy5Jr0DXK|EGY}xo!S@Y}F7W@K}YT5U9-jNH_Og8=%ux;)M zdPvb~7iwkgL_hCGkrBlvMmLPM)cJFlI=7NDeG|@SWPKi+vC#51YplY`9BJvh*VT5` zGi+baHG`1)8hY@?Y8^w#Z!g$3P)OI=?NeWJ4XfDNK?_#HIwPLdvbY-MnQV0nCGM+i z_pAri?c488Rgs>jB~v}aexSeM)SU*hxPEs*G0qY2L05-$*{a4$MrXjoJn3%rZ^83uaxSn(y8ZKJGk|GtpW z^=*UHlyNYxeSEJI)xgJQ`nBH-FU|s!zE3G6Kko#dfF-y@C|F%lqSOSy>IR2AXp&$l z0z~BsV8IMbB~c|jbX1*J@C)b^m^33m8~p#+Nf|6EDtKH>{+2|0AoC%!hsW+t(i*U8 ztGj;}k1l&&M}A#_Pj?i$U)gTeAZxdKeyVn!Gv6~XEw3+m>*`Tw(|vaIcuDA$RQsa{ zf~!{nIYSo#@92auwzxiZz}{V_=w{{o)GR>|zsRQlz?UPs78z5wx1RL<(sb{d%Ec4% zL+SDA%#0x3q!)o|3Tw)secQ0Zg0C`Hqr=owsqPRbVch~Y-PAzAOQ`_dO+@89!OC~h zTTg?fo4fDi*Q!IcnvW7cAeZT+9!~oDisNe_J?(`Sa}98_*MlBzCj<|#JRL%0CxF(B z!7cK{YLybSTyag?>vh4Ft3{;$7T0neUs&<%;nIkd-^iiQu>8`-`O!yndImARcB?#t zGkxD%JbtPGvsr4_fKGlQnfKU3^0RS~m2tASvu^~&%emgwk$!or>b5tw=qoQnh1TDf zawSgPGHLtU(PE+HYv|eFbPM&_tRe0LgELRk#q-*y0cS#~i|1FPb;wWn5ls(^4$^#4 z3Jb!b0gKK+Nsdu!?d2MCBK?=&Dx3Xzj3?gT4eoD;`TI}~#qn3tyz{w`h{g5@i z*pyo4iHjn-c&jf7gF=CJ@)KR6kIK)7JF$GNZYai!qW^`*-wM9oWw^mfD`1RBvIjpJ z|BENjEPK`|e|?>|NMK6FL&X;&lWiyLHF5S+#u%kVl-K{|`{L$WMJ+u}Q9(Ha6}}3+ z$&xlvz$20U0lZuW?1PHd%tYjn@!Qyc5iWEZOA?}LnxyexkIIjRsVscSFCcvAY@7g|N8ZPgAD%PbEOn8YB4eV4;>Y{LN@OG zFP3CXKQXH~$6|j8qa>k}qPNikBGmuGZbNA7{{ab#vdtHYBbt$) z9v4Gm{+-n4!l!&pV<^zVK-T$Eq59;d`2XU2+(rZ>BICG*Dp$!8HK?lgU^NON{kPH2 zN%zvAr`@+KO!?12-&gRY7%%1@I<>4PlPKzaElia7pY&tmzYxgz-kI(GhiaK)qDu(i zm|sxq7C_05rP0yLfK4)XE zd~wfF;UU)PstD-NQ{UgmLGOJv(B&+9G1gatrs|nQ}ScUNv-$x8k3Wp^Be1}5s zeQnJS$3vMl8&s4vH`VV1)r~%NoBdIwuO{Xqr7L;q72LO@FgeZ+8BjJs=PsU-z#*2s z{E({uO{u*KLuorp+)+af4b6g0uEttOLl2uPBjyJ=ligTP$0nG57$cu> z3ItaTo4m1;FV6Qbjrgt{uvyAc>3yTw=|B0XPoB~|oqKfQYn?7%=W+cl7kx9u!|z*L zW~da`vTsBioqplvj2MAj>9E%m@ARr#LKXb9dc?}o_kqLWG`ZCGM(-#0%<6)XF*igS%xzmJt*@~Jcm17(~kcue- z>zC&Zuwu-OpNh=L;NCYx&(^pw`=bWVJ~X1~e16Q@DXE8npD5TSPWjpK3qBRP+w)1y z)X)TDXwD9Qdgo*1P*hc*Gr|v<_+Ppn4li1bosqn`}+Kbi#zx=tim^<0I5?xy`0Qj2j+DV5MiedQIt+w+S;ZZ8B6My*iKSeS4SB zxjR{WuFd9E?k%s|e-+P`526y~w*nF2-pI{5D+*>jE*{t0h5Q(+6_3&T*L~q@rHCTZBSwU@F}}aV>XQWO&Vpy1l->qrUcb zky=@>8I-`d?>!XG9M?|aLt583)0jQe9$Bllx4NCO&bX8@_nq(|kLqQEke1g_`8&7T|2^g%c)ZV#_m<3GQNg;ZJ&t;nNl*(1 z5adzBK#Z$bo;_CZFmM!iFUtAEc;nGGzybWaKo88jmmTsWFn^jzow*@GQK-3USLZps zY>Ys`nKlPYw#CsY8zM2yS!g5dDbv5A6~#*Kj4zc6CuBe;!zIgD%>v>qLM zlIVC7|9h3rbN5Qh=^6z+!Kt0gv)(NHcsWUwMDfd-r+jZ~S!tLtH^ojc(Go;CxVSO~ zr`ZuX`{6A_Bv6GI=FHK}@bA}a#1(;C zfnI#;ielrmBm+wyKvqj1DI5HI0jK`RQeT^V1s3=)dLSAiXpmD{zPn0)yV*4Fx!;*7 z^=ke`R^&Dr6WpjjMgTp?&~3CNM+@^1i$Q(hejeO;)*UP+cjX{ zPU`4a9$w)=8WyNV^XQDZ>v#cvl1|b%3yu~?4xnG~CT-+l@Q|5ooDuPlwAj|j*_UaK z^l$MJ#Wa156Fgmd{I%Qc5Ol_e53nF%l)ir$nqNcd76?on5wk26-|5neKXI-WL2Zk2 z$e#)NpUMVq>&{AvtVm4U2GGwp^;dY?3Ek*yBa3_x@pu*`x>xV6!5DCjP3?}$7KylB z0Nu#+2oCjHdqH>^6Ms3CVbP~gztKazlsh#*o`ShBt~_O3?qoEhm;_Kx=X3MYRC<|p zMnc3o*H*ym)iUZ6=|6HtJB5u6s;Jc4in!lb=Vsj&C_M@r)ZuT%FmyDxfqkE7>T&p8 z#>tRuZGa2Qal45j5&t&mJ$9Cj)JuoXS6)dXiL;kh8`2;} z%@4$6qv=~(oYxHF&T1S!zk) z;CI;4{l{&a@;DGdyDfhfCStp8_&RzjoX1+S@gQTiq8sKYa#D-Z`6#7%%DNpjv# zSH~v&$osF8&?hStx8h8nrLBmVVGNb|YQ}iDVtQqofXvB6To6(dap*MA!Xz6()guNc z15qS685xQb(clN26}8GB<3js|{%;Nm*ax>=_@FhL4pgB4lpvGlq3ZLVHXD~+ILNyI zX$xAY@tzU$p%1ptLf(N?kly?*I7qGOSm9=&!6O=gF4p=Vy!LOq%te30oQnf)me}uG zrG1!)Rjw*nl2l-}k841HbOluI{_J7xt2VOhw>;C`UEt85M+b{=Ac^hwNYzh#BB!O2 zw;@mv{zft9RJvrt*H~Ptax?v)C6DE1Pz8Wz&6zSN#wqQ>eNIRtt$H>HX%+gS*TFqW zpuSLcyBe3wL2Q)4(qB|ctXnp~M>=r70(~iT<`rM2%ojgsA4vUTVp?Ul%LeqY_5VFU zt)M~R-6firi@OT8r~_%c$3Gzqfm{wWS{Ny`56msVCK8U_a^diQ@0fVezVmjvG=@1{ z?dqRkD@nyeL4o@;TDX=k~)E=~O{}SMn25ur@)t?q@{{tKQA1#E-4$ep!`^ zril*LFEX)@(9nc140Fb7bK2~6pvg~Bjm0z8bCTct%FJ1hkH3eEkDPf$kSS59EElbX zYC7cHVf{$Om<6E;j*Y6OG6_mIs9^iNvdVbRj%Ey}yn1o{^C9ph?rBC;)X(lW=x^Rz zO71hvjpi%2q5Eb>M%!DF^#kVcbm1>n4L)E6W=N$;S?D;`~-r#C__b z%2BK4q=v5D{c0aPm=u9M&Ou)-U63w<5VOiHD~p&--?H5AOR=2!89@p!(ni7;)tHzL z-pvVA;M#Gy)^j z`sGG|(1ben;K7b4BNLO>fz%XRZnb}h6l8T)VB`o7yuqYyLOa~eT?@%&#aB!H`3i~- zGMWS|y4&)nPkF0$Gx{5e)ipHQlWWmYw>$jx3P|Pv_0)*k*M(8LbRa`0g;g6`tE#VD zPh%-pZ|&jiED}pL$d(#oCr`F&YO{XWnaZI*`ay^UP7cK^qtcEOr~E;>x=9ul`Y*U9K~0V14b)leXX`oDbW!0p`pxH?e{M zo?s+LKwLD~{WLJ3 zt?%jdcez+-bX3asc}kdMQ_m$Da|5xuiB4~~%H+t1y6BYJV8iDiUXVEl3>1f)UX;m# zDwdK9a=;o15k6j48Oa9N6#Ia_{8hL2#RpjK3MXIzAlIvsib$L?33!$-RDL&sg}V7S zAT`Scn-y1iPqPD;?0bdB6Y6Zyb=z8IF5qUMviB6vcpj&pnrT)AEb+xv5SxdB1V$6< zxgIuLWlby)$B)jEmgrY9(`WQ+T0$6bGXX)**_aTP6SrO|atv^SpW%!Q?T(n>)vwBL zN0x?08Hbe(M7g3M)3fS6g2H~;M@LXXjd;anY3Xef9#ryoS7ji=z zaLql64L>?+(Gm;rHq?;-gs?t#Q!8o5@y+@&g_{&Twc#9|9`A2w(DN$vX0hc4dh%PD z+rPrYE5F^|Drz`Qf4(;8I5bs2kQ5oa`E5lSSYggKMX>wT+q#xTP^WcXrz1i%U+aO? zvIaFOrVU#>?gc;Sdme+IBCeacoU*HT+#~XIE?-};^x?FbSN!$N?iAZ?2m*GGMz`Rg zqrDG0`}Y=-`&et(>_6rpAi1EYDRncvCqfk=q!WjSw&GK!J)+C4-Dn1h} zw%~02Z7BK-a=pVD>uCw^5$$xia>vg>EG~jg9fe$*PN>#azn;mq@w>r^jd0=Skv@>X zi)no|Di@P`+nx5Qf3ICYCMl&LFWLt;j%D8Kq2H8DpomcSf{M$x7*hM@j%(OLekARB z{#;-2Mu3E4>$nU8#4gt-PTB+0*eE6UmBo7-Shjd^?ko&vTdn>_gWP7dVmTR0_XAdc zToa69!eQ-0>#HJ;g`qyBp*r#HFn518P(t%y2$}7c!02uuM)*ajWo? zaU(IxgaU=HXuFwsso(r2JtZ)5LdhdP*y3@YC#Nf-03 znA!lBAgpPO%xH(ZyfOd}Iu|l_F>CH9GT%TqyN*uqbJ+xRJr`-9=lXZ9%@J4ynsj<5 zGeeR~L4hq1x8ZML<$^s=PKMaF0P~PEcOlAEyGZGJOMw7{<;(HoHYO(Q_tkK9F)MRL zDO=RkX}ku%B4xcK9jCba&$M*5EaVhix+EY<{W&_@pC0Fv|3!RH6>BLP1Vt zDrki+*&_lK`bC^v^{WNNeserini@${0$Y^EC)ZdCV-Uj6)7mGEDX(;X4S7L>3x^x4C*UHmR`7H_=Za1=gFo$ zMuX!aap%9t`DtZE%;`00KuG2q?aYTRjfOiLYmfY6OPQIe_)HBNdwR2F zr=1mekt0bId`<|6K=wNA(mkiav(q%ujvn4{l?g_5kl3mUTG3iAF~5Cx+he7#TBvUH z0e6!2_AVc;FxdK_2{6~Efi&TT;4TKw`S}xv;|rwgYw?3hX=k^>FiAm9YcgLmZH0ZT zkz}qr(d36pu48t6#{;R(u5G=8Z)SG@HJ^bB8tym^Cf(2Y&#~H{pzwqy{KPYbF?Dnw zQ#|@b0N;-`1dIcfDMr{RTI>$1|E6zG8~bCq`oW7Mqxx;VT4b$J`QZ8&*#=W4_B%zM zLm<(U+8h(f?x#=dR@HTa?0r@5C;mlB8y$oIm<^7YP9E}Td4*_i=8C?3`@C%;>al*c z^vFuyghWvoOG<%1JSgSt?vooS;I>UEtAsX2^%~>hP}tHmS_WBtFp3AuY~lj)K{MD8 zzvtMrp=+}wZ{mY>Y|y97{3%;+qt90TTkeeg-6js32eSPc!|?#16|dz`rds0(j*G#) zVBdTrVWlG&=%tDHjGwrvEJ|Xa^wPK`Y3VAfss8#<<@3e~feZRV&R>Z^#h?=cbR0k& z(*rnXbYqHH2f0j=yrC~#LrE=qRKr2zu)P^=g6!udQx3diGJmQqnTq88O@zz&s}z>e)O5=PNbSHbHQ{2#bq z)~a9|ISO=Fyq?eu+7^{jJ=+!4(9)uvU=Pzk5aEnpxbA3^Zbf?(0Zr~4>)N+DKf~L? zYs$0`Jr5hZ!cg?$q%T76bcuGrOHkrRI%u8U!O!NPG8YGDpqv+OHG!T zcK66$y2xA>`&9UjUKgI7@*|xQ>YrX{32*{HXPZw5Tl7ZbydgPMSG3dB1f$g-y~GLc z&MxUK$ZE&o^6`>ef6w8Hx$^Lqda``&Ea-|i=;r=@p0oQ(d@xx(L48itWmndVM_d5^ zC!7k*bLa>*H_PzUniYgle-?3xrk#&C;_E18YbSV7Qv@DQuka*c93M;O$xU=B9AU)8 z#Wg)%nZ0y99$BAvMV6j^DARMNZHn2V#4lKuxEc)qT#|S8aX5hWdi#+%dId*cpa8}e zC*qH;zApqlcEuEtlVZ!m0xbklehG zQV7+0ed&>4y>gpczlA|qh5(X_uhWsugEdx@5KJvtt$-RH&8CbD zDg)fLg|5|B`H|(|#i1@q+OB}ZOwKk8L@T83@8f6IQ!C36fw(=G%WSS4&VfD-c4>Og|B_$yWfdG!I`^`{*9p;GvhHaqwW zK%{zMapx8EY2dU!6-ahE+Y9|l(7=$W0ZNSnUmQOeq}$m?WTdsfuW{3%{;rLw(oJs4 zhg=G2#kh=FIG2x0ug)Z_Ao2-ad_=^`Sw$8hSh4<{ng`iN=lciP`G2ikYgE$N9_5YV zq?QV(1rCOZrZTA+wtTWSOZYY9-2R{;gSS*18|&+dW^-r+pqD&RP5H^V@sA5S&^5xG4zu!QGn6 z?p%%IhWJophQC`NQ)iNZd+?K}oR{QYd%Xyd*@eeo1 zO+x5?^3zYF zz+8(}E;kq4ul_Hz3%GE`aJPIJ8D3eUjKFD zGdg3~SuA;2%B*?%1wTMwMwP&)>yrEN)hZmE9WD=7*YS7SEhGqhRWYY5x1>(vfwhl< zy2~IR-uGS$<1X2EKd~x3$G9&L>{k4Hbjr{TZ{OukcsU?N+)>A^3`&7A&%ShxPn+QQ zURrL@h>fY|g5%Vfbg``XsYsXgSOQt!`#wvLR5qEf-CDF6VAio;RPwXsGH9@+J^k2) zCvTXx7A2hRVje8fy8jw@`Bi<{G-a|+{`ojuP(R0Q1zc3?u}}w6TS8bX(%}cazT1f- z3b}%qO6fK1J#d*V5cd_1@v%40o!l_c&Rpu0$8x$Cl&`sOQ%;b=#Vp4qu$wS!;*Bl)yh-|i6x4rlJ0G;`#vD(0jO(H2At zx7Y(QSZimcu@!MsSiq^qV*C6)aogXN0ZI((cILUa4Ek<@jUdaQx*hvc#PmPIL5A9A zmQTqQg0ddX1UPi$9moUC7ahj6WQ*2cbrHw5Hig-?fhUeP zroY}I2EL_;z#BZvf@`nPg;>zzS~WJJ@d*Um1MDF8m(PP6S+1}?b85qo+ed2it;`H# zM9E~(n|2iF#D(9!eZN;q1-b)sv*2mG3T}yIWtFCdNq} zb^dC!7!C&m%1PRuw`NO5wCqP#zj0mRShMHh7{9ycb1MO>De6l>+QDrpb4DQjX1=Xb2VD3FQ4? zG&%O0hYMW^4ZDIFq8=)1jk!W@B~9X``Wspnw?B_%_l0_0MM=RJgar04$XMGWanw#@sCkd$yMij1c^?m2D+ndSRScf)r`R}dbome5zpksH53 z2hf=?4v~j?jGRM!2|c8CGL%Y%-`+c$tV(!YlMs>U(snxqjMhZkZ61INh|;Jkv}V=b zPwfH!DK;ZlNl_fe0HW1E`oR88rP=)5VhksnhgGDRT_jCBkm51EKmFzYQ0gk?Y=^HE zMIcu@t;UJ1J6(3$jaJPj+m?;JG^CfJ0EG&@)l?xB9&+QopN!N0SP&-0V^GmywZ^>Z z8i&wC8gM3Zlg@b){=cnb!3^EVoau;a5Yd3-E@DyCo+5f?QFdS!I~(XgTgY4dy~q@= z&jS8IrUd$K3-k-{B$ETlCaa({;r_mbN5)R} z-=UwzIINw%@3=kOKgIa>i5E;vos4lP>$r>A5hom{6FCkhH~$XbI)#nC!*@<$H)nfi z9L|GN*b%I89|xP@;9KT@f{p$J8{0dc;)mdH?$}tnoXR>4r==q{wS{Qn?&onA9pD6L z0CK>+)AHk=4O|u-PA@y$pE+O+m;yHd1;7?C26%7~ zKX4o11B6b7f&0K&eEie@v-oET&YmS8Bsxck3nUka&J$fGxpL()$>mF=WYpxOSE;UE zx=cYwL3QmKEiLU8a{BA^G}ozVXlYKF;GHEPAS56pK6j3ohV(Ki&EF0u?*P*CXGQSl z@bMUdGo*OKcwIu|hAH+tXAA_$F)De9VB zr)Fjo64o*?d*+AZNr#j6Bm5@w3{E5g;kom;Tpm)KF1Tl0eVxH6c8Y;_hV&{vpZZxc zeuA5i2!FZvlu>}(AtJTl{p86IK#Y$=C&ecPq=17?z`+xTFTfseIz;e`a?6ub>i?JU z1)cQ9lK>R;E@=1J99m(==+1NH%8g2(W0q(yYj?B2l9yu{5nQzoqnICR;62-MCrmVbf6vxw z%*H)dHkNbce$FUCd_`Ci2d$W>usNg2TMjATU_vZ2q?xSD;fqSGeEEl*y(C@` zRj@KI8sQus8O&UwQQe_H8kCJ$mGxFi)|vAWj_rNg5F7g_SKO(hXK0C+O!I#3E9bVp zNYjZ>waX70F$nMbEYl<-EO|&2GRUvS{hE%R07H@NNHjyZm2S}Jp(7vP-0M7dv-lH0 z#j>Sl+p35gTW|v8IKyXT=eAZlB$`BcU-1?S{@G@082q#%)UiOIgWFA%Oj16`xYu~N(D?jy9mh%;PIRwxZ=ZWtfsmr8 zZtt)J+6eWE(#^KpD0O^#H=wXUkit`pVQ(cH98e17seqZ873o!+8OA?w27PjKYf1K+Z zYj8CTt_x5dy{tH-R6VKtdc|F%y&0LFr5m{FcFsE6Vp^tEXKk)Jbk4raGMrS>T=|Hd z3D$2i`<%FX%c449b}VN)#@wlg@>bpLo(BI7NV506$j0dEtK6;Y^1bjGWZWEjGUY6I z&N0}JzG2;%h*+GGtE$TYeMKzOk4BG4$2{wWfK~&O`>IO&C*RmPV_dDmafK zg+g6Z|0dcv>Ar7~IScbpPJDV`qp&-B<@D#-zNdW`wP<39^j@r1TPA4U(UX1G*tp2B zqTHk7Xgg!j1O5QL$b;X+{eH{!V~&+AcsZvW(%m?Bp9Nk5RgaioXDmUxT2?+I8&b4^ zaBGp*YCeF#a&r6G)Sx7EUOJI%ANH^-=2Y;{j7U~Ed?<#w+W3yBn&R#>0V)Qa%03Yq zqwC6uQE%OlXqPSFhoj-?OdC7AN-{NT3`}{E{ZLxw$W$)Dg_mh5*#X)4ZLN8Ott@i} zjnGP4=FGB;J5>J8VxfgS&`I4z_9ZeFX}OZz4p(^2^pMrd3b=*+HaWzNsMRG8xvL3z zB<_crgQDVdB7G@A>eNA%h2zPxEIs)puX_k|b2cb!nKNoT??Y5u;zhZwvm6_^@dkqN7&~%8J~@^&SH^R2@OI8<*HScvt&fP9lML|| z_V+6SP9{bWdi;pEdaCT~AK#$NMqP1A(0Yaggo3H$=A5tv4}F9nUs7NX%ZzOvg$} z-XtY^`oQ=u0BG`F#iTyD%*mt~9M!v7SX7mqxq98@o!(GcRdO19Y}4~O#GY~|Z;dVc zH02EzMo^9NYF-jLO#wmi>`qZaPg6)B|5p&P$4Z)i)91T}246M|A0+IW)ntVh{jT;N zj6J1yqr}cb;+|srre}CTR@HHu z<>MEFzH^HF@D3YF1Bvye~j{;kTKAASkfZrdcG;Hjo>s zq7kubyUll^oMTce!pCyToyYVags4Vw zGY)lO5m{~}Ph>PyGWKn&9+YR*>li~)w7T>VAB;fDBV|8sdtt#5QOD`74sk zVyqW@0x$_*Sfot3s=vflvV%Mzn4{K6W#@byP$-RxsiaFt45*BKOMLqKn_0rzk!+#v&jHV`iNtQMJ$=zmXo~t>f-OuTm2~P#i3$ zenx_HXmCY9zxgGDR9PPF39#!@EBQG5_^LVaqVV}?ntAm{2}cwyd3pWXMviIQUg{KN z0>QB2_i1{*l3|Un&9ItR48j(^pNeTFnY4s9~+_k4`g{WE*+ zL3w3O&ud9RXop?>+xqba=9p+J-6UkiJggLExw^BjyMJ!Qk^^B~AjMS@Khq}c2(sbD zj1T&;?~P--A79;}a@IQmdO~<7ZTyG)NXnbjd==+5XN;*VcNIHww2x5y2Q3j(fCTTI z%e1nenIM`vnsAp+G8EioalH+W`WwS1p2IJ8fkXQB16u52t;6f$e0$} ze?6l}fs&Z6SaElBVJ=58$vaXao@d3tW5$+~Q+>q{$(DhgJUJx4t|dKk2Wh{5?HrsgSTLF-H~m>^K=xpo zb*Rj;qxtdXE|c!hdNWPU%g@U@RZRA%21<;bQ1;MhH68fCO+IdQkHRhS;=#Snxx+0( zXTuYqUEo+?$$(CnqRp#)`$1Ey)DWe=)I!DL31BvO0$l5L77wtu*|0qUdbzkEex>Y} z6?9gbl}bDGG`XT(3ioRKA*X~I315-<*t-C}fr;|;6pX2n@)TRp6oJN=u#bmr3pJ|3LS z-B5uXH^BOUz^Xx7B`sL3O4nIcI_0;?H@v@SKE1tNtDUp?ZaJ%ZB&B-w!g06WxO7wN6T66E zszYF3;O=%B@;Jfzi?IMOsX4jAG*NwHnzNm#aA+;&P)40XwnWCPp^NicB%eAo%wv8V z1k>61wP}xImn7lJqhKzIF9qn(2yBHk*eNJIq4ZeNU*rxfbHF#@#z2cm5YrLp#a0k~{dVj*f%(`-o z4ojrdbr1!!z5LuUg(K@><%8`PZ`&xZ6!r{p)7tu*h2wIC|!V@u;Y)Sr&k|V6X0OJ7w>E-O*oWNWZ}ye!PV!Gm1~I&_SB)8GDV!D_rtU zO8LrWIp#q#$N#SHj+d35>#bB%lk*i_mFqQZZm(y?f~ce7JM3~WJ^E&8&-6kC=vq9Z zL+P2QSGnPvG9qJ1yy{bnHt~XWYc{51D-bf&Fl~{du9mn?yJr>wtnB8?Q2^Q_yQE|m z$*0eq=f=XQ+HW$pTCpY^LV#EnPb)W5A`lGE%{DxmE6tRN@hIDHiamVU>?*XcO{=6t zOnQ7i&5CwQy7j1GOoq&nV#ex$c0S7ZOV7{*pP^RMd{)UjQnB9}l5wvLIw(7#=jqD} zMJ5OO2;VpDF>wsYJbm1vmvlokC6H=MWW?GnPH~-Rb!B{je?v_}>kVgYkY`AhW-rkh zjC)pgYlFny|I3mtF@=+y0Qa`Qt5F-Q^42k#gOmdeUWIl`^0M`zq}f^`-OSCkGhX74 z!l~#AF#zj??p<7k;Qie8BA`$w1HoSMJ%J&c4rZ#A2Tb&M%wa%#8F9qQh$xkDN)ZQ(3nEJ$3 zY!sNgNDww8^=?T#O>>z()tsP2wVsAez@OpTTH_83z&4N?1Q+ka(8h_4N<5RLz z`iynZC1^|2sf<%$N)vFp{OD7%>{I&KcmJ7KHBR|Yu~0$&UlJcxgnHXP9h}|L6uRIV z(&nB;DgZ(_@@&uOAf~ohebCXHjeXj5z4WBN)z@F|Kko|l!*3kjDYI+wV~-Fka?Ng? zCHFV`zp!6#;qcbEd#3xZY`&+YMF}CPUny13J@S`ps5g8CUeS4SrsrQ_|Eqr3@P|Ox zw3*5U-PEsEUtfjK9&vbI`!~X=oxNdZr;*H88RMZMfFRTLUrYYE7nI^U%lJL)^)Vt-Z{>>cZK5iG_1m_HUSsZ{dVxV0nKS?@MK;*TaTcS&!BCZltPMa zDE&juXchFQmMVQi)ol~>8?DkLv?_av1* z!%}Id@=cbb@hGUXyxGqYG?h%1kUXETg8C7jaUc zq_%VC_^jqy_OSxFmsBHc8eg!YzvAf1UUWTNm%68Fh^;#vI!vsgKDo3wOy549pTPX0 zeGKE4&_ESrKaur$g~VEzM$EH9^s26BKmwPV>LueSLBo4o2B4P!%fsKQ0N1h_e>5*G z3Dj*s*ZjAv9~ghW{d9cbQ{U9z;(l;ga@eAu{gr2*GTT@8*p%t(W5pE02f()l?NIb0dQFSP*-}V{=7U{$A+@n@aU=(Nra9ZEv5LZd#@lNrKSqpRz@ib} z;u)0S^I_b+1Y4Lg$1K2#N{m~Dz{T}gmgx#UzzQoOVrgTCBn5gHUMy@qwtQ>E#pavV zpslg9$e5Xz)uB@)8-Na7$PP+~6>KAQJGz8=F4^|_YO`5gU?!c8nq`eqkQR7&k;yw? zkI8M)DViov<)FxOwzf_nZ^8!{xbYtR+K?2BH6l9CqtX8^Qlhhj*-JwZ7F7_c>g^<9 zX}sKjKb+^aZNY$_l?**1NZd!Yf-7iAivwvgtKZ)2;9~)mH&K)1Ok~xj-IYxHxE{%TyttHYbmkV9u`jZ_4ms4o>C%AFG50FW~R_q>aE-B zQi{hdC7;TDQtY`3c;@tW6yw&ls@qNghXeK)(Mf^ERp>Kghf=699v*2ofPeSGpaqC+EV^$j#{mpKBTPYy(?r&p8WN*<;OB z&cN%gice=ptGgH(IXTYmn`C_&H=`4G?J2!eZds?GP;7b!onF_gRKwwH>w(D`7}=DW zn{|w{Z^{X662m%t~u;?2_wna@Zo$O6X-vNMLJx;~ZjkIHFLOi(JdSFf9}mEnLgJZGP7#i}TTzIZqqGrEZ?mX+7wr7aP4*e2_P-5ASE35;j5H)7^8qLN! z=q6Os`FA~jn8z}_#Qi#0j$Oao5RUY*$&_2w4KhcoHH+&m$1Z$%<5MQ+KnUur_Gyj) z*_OK;iA67@Ty6Rw>qCJ`!CpE1@NQsgE$x$zb$z)(MsGi-cQdnUhf~z^*E4hdth1_h zyXDU7i<7rMz!h?&NH@?PrqQiD+Xt_M<22(J% z@j&vD8(27}fwC0b0Knq=%m3dRm5-hxEt%*#7sm0&HYBhs)|4$!#ZXAAfy#b}Di&(; zjPGm1PG2`gtGupJPTi}kVoE~SB3_Zdnxci>y}nR)_L-?m?GBe`V_~8^W{G4h+;Jh_dv`h1w}_%=$VYc4p?y zQeGb2lWwDs+RBonDSRtxZnYiDtg@KG2NG);Nf3Clp(ppOkx^p&$jNoy{I%R`BUHMzpmoHQ~A!Em&jxGfGR{6y6p*F^zttT}iWMa_CNfvMzDt_grzRC%J06o^^SVw;ZL@Si5@2xH;D*}m(fE#@c4LjG2+DDi;Dl6&z61stJOF>y~ zNWjcVAh7fhUagBtC|{Q`kefY5?MHPUv1K`7ls8ivb;>Gxj->LJcuI0+apPgyQj?mD zWz()m;$V`xW2T=dmLDoT09ib!-I45+k?G+6dY!<~0kXDS7dRYbpCqjEE>N-S)z8eKGLiThSXO**X>a^qqcZ8Iww_+ zOFq6Miu64)u-fex{uEtEZC?#cHl^ZTU#*TRXNqrmAy0&lVOLl=QN?El9!*DJx{V2MqEB1{@k8-YZhcs;p`U^o1Ui!#LBX$f_I|Bl-IWt4r;> zNh%X72bp888s=Q5XvdZD2vdIP5g8358m|VM#u~YFCooo0#^?kfvX?%(5@j9gHVHOF zq|8d8#(Zn@%(iV#fZ=`N%=m>#sq>!{{1*yT!YX=P0$I{?1G_$s6U-&EHR|3DzP=!= zx~27ro5V#!$v!9<|*Oz?9cvl|peKpkDdb}y-JM&cz8#)=GIcF`t zv(dRd6kVuq>&AJuWju_g)jAw(Q12|iWr$uq%OG<6QiX2tmdSC3=12j=Gi#qU{h|Wl z;}uD@;4RslP>c6e*~^ zM3dhefjQ(E3&^e^^1hxzU#+p`R$? z7#acwTU*BZO@FofJeILI**QJ#vTuhlu6dj!D|GE0WumC~T$$dYCBt@GE3t}EK2}}e zsBN{wHQ{o9X<>Bs4yOyN`B^8Y6M&y++B38C?ji@XG#R+E~>TQitfx3dkNlD5gj)S&h^JB9RUc ze+YPf+cNmySv9GvQw2T{6hy5Cy>0l~t;BLh10w1)++At5WiUGYs%ur3xLk8?Sv-(o zY}w`IXSO4=8P`uyZ*w+|pj|adOS_)c>}9B|r6W0|=_KzmPekJY3)*G1Wq)6G9hus0 zmW9oUit19)9erUJZ(dbr8#AhJSJ(FVFjeP{>hoJ)3*tWpp$!<$4aTuOY!<)lk8@MY z`-t~=#x03Cw)u9LJqCZC@0o;M^nq zE8VN!hcBu>b^%L1ZN@vWsga^;EPuW)VPCAtQipFun?YbIUNZTtNXva}W-I{ROd(m> z#=#i_dY7*UIsqzsmD8u(jpoJi(6y*dg>T4 z`}Zz_SF_T_Wt)7KQe?QPBIlcj;$I8@d9ib9^uFA_5oz8&t=vQ+U% z_-d{bEUrXd^WByVsAc>Ea{R2sO3JwUs_$jnuL@^`ZPvF~!7JtYaLx_cm6^5dQ{FfYZI~s~Po=)nG03TI zk?5$CsQ8$ZM1gE{SYelI7~FZ?+~gT2=nYe@M3!$fyavQY|8Bj-9cv!{Y6oJ@`l_~1 z8ra~QMR!oKb-;1SDNu0!+1sS0%nomiikhKvc4Xraw3j8d-f|>3NeFndT5U2FkT5t=xP0;foKi(fy%ZU8Cz; zt2wC=tHuU%oB~=%#Ht}_&<3Q8U;w`6_BDy1CYsdLi#p$RyVcR@j0LrpR|)qHR>7&X z+9VwnSafgJ7KwtzA!a|e{k5QHa_XCLtKMrOr!}G_(G_d<5ZDs=E8cG@KW|9iDg^G} zz#`T1xHD9_$kqH?jfj{Lr)B0H++8H$WS`8ovb4lr)gIcC8666ajHqy_E2h3$NjzP} zrbL2VQ*sU?3Jau>9STUnsO!ct=JS$6mhWNp4Y=R!8#nY<%AUte(Qv*}mmz=aO|qvO zgbW*R;};n8+bDg_#~o8CPie7UN?FvK0oIyVj#Sa)u!p*`*?Jc#7s1+XLq^OqXt8D@ z$PXf{)246pYFH}@XI&gQ)muM^4Acf{x_X6c(<)Lam5iML&o^GkpeLO&%PNqOlUANw zAayv}tDGr9)SW$l8b&5W-YwBj2APO%()QeH%d1^k zDJKSOg!8VC@kBH;ho`!5Iyph~tD``qkeqn)6r(tCoQ=&_&7wH58a%J|IR9b6Y^){Dp z*bBX~+gLpF{Gt&mBkHQ==uPieZk%c#LcQED;c(l@;fRZ2>v>a`m&aBd>s-na4dw`W zv{pb|?v4Tq^ZELQX=Rxwbt$p96UH*_f|0luUJ8*mqe&=Kl9F$!0=3c7cTBv?$VL}& z|LSWmdP^yJVPXZl58;Kwh~oYlh9n44rH=5DY^ZV<)Df86< zGenTs=b<*`MV&|`2Bi(*5@ElJe>(9XD#_oY_=uZD=eFk{D@rM-zP~p;j?*=)nIfch zN_q;FyfUvn_XhH<+ZeNvv4#f+HC6C0e*zf%f9ongx&PFGC~(?oLe{Q2eH(zSwngSg z`?Ci1zaqb!05{(`eWV*z_4u;#$#oBR_8SDH^ulqcjTFw0?xw9zRbdD1O+qw_70Bkak_Eo&iPBtWAz~7k2Hb!A@E%8|wP|fcmlQ+BI>~k9;Mq z3a|Dx-fB*Yv9|s?T^QeBt;;NlV;pt4Ex7qjqKk<<&w-ag8afVHOt|m3tLpBJ{NC z?M8NO`n9Z?UYiimh{97o!iY6Dt8F>?LNz0B@I~ouS!65CXEF0EV=PEroPU`;BxiLX z@3zl0_Qpsl~1u|K?$-5rU-rmk1wJXLc^5NH(?iC>)nyJERGkl zW8%}&n)B(_jAoAmp<#tHfm7B4th+h^_6-D$i}YNe65{?y4xLCXx%gGvLXJcEIP-xl zQss+2zLyZ*d#;&Y1PqKW-qdgf(jJzpWlmI)NC}s&IOJ^kn6svFPFDTv)Rj>BR%DDEv{JF(^hyTyaN==zX5OMjY0_|CuqYKg-+|6VrDvMRY zVb~W_q1X1}d@gw0$+~B70xUaCM&;kp#=I<#BG%i`zi6>`;lY9qqdfLm#(JfWfb#b1 z?5eidRNlus^cTENfPyIE)DFs6zbzl*57FI_!9nf8bfZR;gmaNFRPr-covMDwX@h_N z>h1~fs57?q;LI zG&B7T?mzcNF8mD+|AhKee-rMDrT=O8>3sP68I!-y^}h}9``0&rzvjME{I>!A!y%`? zUyc85fd6fPf2-B}cLdxiKlA_J6inVxO!T}Fo73>XCT%SaGlN~19xy)$8|Q>AMem6s~BE>xKSEjdq7g`gEQo8JwVhcpXlu$Imu(I!f@CCZh*ekQ&Io_^QAH=n$H$2Tp{KGAq^ zabJ^n6Imgr5RYkh^<_)!Z|Y?`ll5sf`eXd)&u;VfQG8lCGfj>IWUZ!`z$D{r)R{Oy!0@`p8{4lU4LCqOezT)Do3=*vw$)fe z8xpqzqM!~N36oXE%zp}He}Cz<3;%~TTaT@Rc6j4JKU0+JW>r9|>Af0|Rlny|Sa?ww ztYCP0#9i--`#+sDO|SpY%oIGCi3~NKLyog5*n{|Saz?#s^2iE1C*O1{k?Xv@hvS;v zhYV3qF1#y|kOpsvDF*5gD>SS*g2=Wt8+Ukqh3(PNuCN3SsyzI_Q=}isZWy>Q%qEM( zLPA}NbRf;(1GS#hga6U%Lgv|tNIl0bT~8^^%yUweBLuFDt8E>6cJ zvxy3TlbqxvvN1^0$l1u76=tKB!s~=7F5StO3&ts%oN6`RyD1=ESoG_3r_GGjgQe#Z z_bAP}cP?brUo=V}RWF^3Vi9ZF;MC(d0Z=;py>jNw;5K2KflSLG%W{7u5pg1Yt-%1h z;$Bdjl|Hko)o7s{j{-Ump60XxzEMD!bbE}Un;Uh$4{|q&Ke|T+QtY_Q3^uA`K!RLK z0}i{?-At^b6O-=Jn9eI{^Ijf{>F}s0e^o|^$%_=W;*drgzF?S8=8q_Eym zH0eKmK70wy_aB;o9&VEo4ElR_Uto@z_ai<{q=)uw;5d0lit zx1b~l*&6W1MWrHxCbDsmA_&7{SuGr8`Hn$kM^d6^?CDz}qJl|et~fj<#&bkQK~Ah9 zXH8Cq5d-U$a~etLTq$>2o=qEJ^FdS%5C#;Od#qln>I?MWTGeT2Fq za~9g_1NtE5k#L7QSG8#$0!>Ng7#%8`p2Q}IwDQaBvtoia+>eMpSw1&I6e-ZT z>FU0=%GOeQSM=e?HLZ&3Df)g!h`L6LCy@`$c;w-Hsc3>&p_u$GLiE6U6Wj`tmTq&S zw`0WkR(|0CFSe{FQz8A8JY}l-_4=r-9;OEQ6>K2VA{ZSNvTH73JIa_vN(jU4z^*hQ zmmilHD}K!=muNR-ny@KN4NEb!EfS^B#h9Ry4||wCk3@wF&Z(2#Y!Oh4D~^CSZ12)p z!sElquyUHxFLkb21@Q!Gw8fxeGM3^{MI)F^{rXRo2|Kja3tEPj>hbS*gO5qBR=${v_=RQp6k6P> zB6?+T7Kzq)+z#DLEvVajd>@v60wm_o-Z%DNKlcAW(YVydU*Os=a9>~3k=H1~0%N8O z(?*9j$M(E?VtS9M)Df*FGgU>t?wOoaJIk=9(i`R8r+6kV3q;dA!C9b=w>i(D1|OYFbR^AfRU4zjgvGN%HeXLyyhON`C>@es8N7MOT3~L5a?;0b zFGVBcbE8+ z*ve;*(Z^t+#}%3tl8dT~HQ(hzy8D&m^Wz42jZ92C^+xlmDIgx`O`pnQI1Hi9U4Ie#)2*x7HIk~N z$#yypdD3b|gZ1IovEPxzq^rMYRCJL`wn{Iw%23_A+ z<=jd72Sso@baja$;FnCEIG(?2c&hu%+9mr*+y>hz8yxHJs(&xk_Y9myv>smHsa-eS zenTP$%P>Xa(!cA~F$j`vuJ$8R<8{x%aY;)Q(eiDser_^WhmWfU^=_86Tl1GFQVQ)J z4hp}0hm-ZnInb*GC(L{~VL(V_`8KXdv-FGxn_>2oItQ#fBvD?(mm+vQi=CtqHJXoTkp@WSi* zD|Df2R(78q+%rOK&{hKz{`iwbc#EFk%2`#bsTTuFhBO;(v6F~DcmP=askaiPL7>bskY(vlMEKpZ+sEfl0IX(<-JdXifNkP;aYK$Jc>LXu zgl`TSJ1v33`#xxV%57t*df}mov!|vMUak7eQZ{J!e9`Ih6wfyp6N2mn@f9YCh^x4)Y^u7hNMtAv?UG zYM8iRCVx=u6BHY-vvdNiCi+4rKCu~w@zK}3H<8zMUKvCC{b=JTt!!Osmqt*<3 z(ON!f6&6Y>Iv(%3Wz3t@vTFt?9Bu9=<|8vy`;cp1QiJ-74O9`kt_<~BpP=UHm6QAB zpYyObeSQ}GPEkj#6TZ5OY_e3<9($N(M(IRK$ox3e^HkyK3NW0PD@_hn#9?KMe z%P*{9&XzA$%k-Hv4DFYxP|=xdoNtUr@|=dYprwL_6r-<=6Ih;+Px_$)s%!gYA5Zvb zrg51p%bEElFRH0nmw!kQQZJnv%Bo;RFv=r?P}`qo_6+fK*Muu{#piyFX}Ztjr8~&! zGJKWM0j$cNyw)4jWkyysBsdw0Gy0rKAL!-1y4~IQaTg(f0tBfs$X_e-Q3ZfEzZd5e zAkb?NSdsLqiy^tWNQ5|WLNy6n^U?|HEaogsWy%(rd@6y(A#K5i1N)>RS-le*lgpMt z2_ES8Lr@=>J-F?n{&Ys7# zV9WyZ-izcYYx+AJlYhtw%+-~zGNLeg&kRnYM_YgLiV(4D<2U%gNgy=6^R)g!rbxQ8 z>xjVJCEbs)zhXPu!aTExd$=}dV*?Ao3%g_sUoJN;7MFmK4R=FB6BNl^+u~;WP(^JX zH|Xd5bXXCYF|H`nNLJB>oETNG@~$Iq%&nw6In@>PxX9~D!!=>HhW!oRC#Mzg&6mu* z)c82SuH>E3Sg!e=-vJEx=A7n&NEZqSZQR>qW9N_85}I}mY%Q}tQXaIVWkeRZ=pUO& z-H)blls2T>yd#|PsycbZvwUzAFL)(t>}}G{uym-4icO8Dd&DYM#k@c_E+4BFz6IKO z)byH3LB#XO``OcCL9)-E7M8l&rF$K1m8;asD#)wH=QulO4JVHug>+mqi?h9^zq0vw z2zpn$R*`xxXzhh@dSoQ6v-7GB@~W^^S~9AV=NkLK*5zmDc&V-zDVL|n17nGxp9)La zK9@~Jz~XqjRO4ScB1~iZr`S7Z4Gcell1tJUuC7@<&Q>)Y^XGMuP%2P2!FlMGg+0y?kab5X4{tm%5N2RT4?}2*Df1_969EZ_hY}U z(15i8LO-njea|q8i0EjdHfRY2h2#B_C!%Nci@OuKsLlNea^38XrDFo#`s`j-3F0Yl z6th70xB4r1S*G{H`Dh~%V z)#;io6Ov;NHw>Nv!}e|tH`xWysV2zjLJ&GJ;qqE7F7Yyv`bjZDpR3(5j<(wyd~0G% z-8@`x^t8CTNw{s2b*PsDj7vdbPP#LWCfR{)mll8$r8AnE_wgwp1+smN`E(KdWBT6} z`PYLdZuoreT-B*#oE5nOrJ&`2UsECah_PzfZq8MsFd%gJDA}c)>q}KfQmk~A;&ZT# zr3&)~YT6_Lf`x)8C^V(6h=r5|owx1XiGxp>wji#t`Nct}BZWAaMgrSNVI#-cW^*Yu za)fU(8+vsg*P+5V^Qd&gm#W(=HE>6`ouw5JZD_gbK_ptoegjmgB~Wt$XxZ-w9ar}D zP0?nIiNSOEQB-nP`uqjGxq)Q*VWAjw;ap{rev55f^VX_GPO?|fk(+6gq}(SF^w$uk zf<;=2PGhAEx^gFS7K)0%kU-0BP&_3kGrUYVQv;c4Rmn@iTyTl4!IK}=O;H$hq#t3n1{s72)0AE%vZM05p{uv$hTi=C_6aJ20&*V4c*fC^^MMSRMlm$K z%2?N676jPi;sJsffBfZovamfny%|!NwyUV6h$r^Gn{7 zPc#-C>%}C}>brDToOfCsN36TMK&vq`m7vfriPaG-TwGX~`yiT%S%7`Rbe4-;B#+NV zx*wT<)Ku_~HXdN2G&Sl;*Re{A9}m{so;cTOS?#FG6ysf~mQujdPsUOyU$%b-Vvm4{ zdTVoUSzA$(+dlZr)TJrRs$sj_?4>e(zS*^C@#_4;azjo#=lr7g2K`z~Rt=o#S{Rx< z>E_BJEPe*hs(4LCN%jj?c`YrQ=!#~BLMsl}+4^ZQ`Pxygy;5}QZpDK2E5WxCow}Si zOt!+HJVmq5q}$Cfq@?`%gS?W$tKj{8>k??jX6daZE-MKM$*zb(Q#r&kDTP4uAw*>E zobd_JbR#$gf4+|^)`YCTc=kiCvp)w6{jkWlG z&EC9Ur6v)d|cH|1{Do!adwn(wccbT?tP?6TfWevMY$eK`jCMN?me z_;t1Xr#CEU!0DxZojQY#RV+azWvr6JP-b>6m27EOq&#*Hf{fb$&(_|??YiG6nSvAc zYjZxzPj`wAr6$@>f5YM#}au(y5mMWZMy?kK(M8cPFc=dB`0H3cbk6b8f(=YfYRV}VuC zOda&hih8`=SVDQC1aEm}Ey+X>Ja|(>Ys9X*OU+P*OH<69CL9ZK(o{ETCeu+DDRa2s zjBXGL5f0y`*^6uN@wa^>VhVG-U`yMi1o#B!838+K%;gNM|0ZLW+=M7t{Sf7){UFb_X0 z?rozTs=BX_TMh=zZga-fEjX}rT!V4-LKD^0UsxLYKP>0!%@4cAk>xqF-S5d^GE#(9 zwW@V68Vqz`=3LtrTC3);72I|yb|^vT`q7)1g!akEqPns%S@4;2mK6pTTn_iS z`;cPt^GUBZDwKP4<$Ni#f@Vzl5!YB^Zq0^n)@MiZ<;ysU3#iInvb|Z^Gnv_q9hpVP zkB6p~mS(#0bt|2bPe`d`fyHulkt)5q0P){Aeuc7J#g=UMzSZnd`{hoEBg9;Fo{>{s zz>!arb#^-0`|j$s=#_O5Kl&P&h3)IBNa9E8fm!uV>24Rj!$LO-f*QQiL-UlU{*a9MZ028 zU52`Le6yw>_~Fhb*8OZs(e<)$R)N6yW?WI@V47SSGkmT;)0;w+{T0vPQDj$O#aHUd6A-2ygmrI)Yo0W0x{ssi=~*W zf)*zO2TUw=F&>Ln?B*q1txEd*Y7nwF@KO%}nSM{x>cJ9J{94E)lrw$T0v8XJ*2_G1sD|y*ZLCmwDpw&Df`MkTj1tgK^+&g^C1yh z`YYrVSo=dvR+iOB9M4Qgy!$msjFL@bW@P5%eHDnh?24zQX&~KR(hydEq2`wPlbfj@ zv}n94(d&Z?#ucIveXSwa6$)r_sm}a#eMHuqjEoorT-V}JOvb|3u|_5>sA-HXcnaeh z2b}k$V>2p+WtMm9-m?5W2hrhRdYb1|G=<3m%?~NF&V2k)RfH^!{W5N8kzt<|2yB=! zR&{qQcEnjaJlSJ_r?JGE>XQ|%l9XZbjf1J)4qUexg@i@<`>@JIh7_EZA7X}WsnYA( zGyRa`1Oktoon*tU0}`F!t7Dk_CDqN3u1_iK>V&LRYV>>x`xTV#^CMf&+9UXtcXCs>XZz!l@trZ5wmfUY94y#-=NsB0UUf5?vStdq+D9ORi>IpUEt*+Cz@fb>J zjS80ad>9M1*|lZ{GL@uuQA2ACEQThfH4CwFojqbx5nKx30@g0-+Pb_ZUi>?FB(@)1 zIc2=DJ17|vdh5XzHov4?uNq`v-TMnfv_9O0DQUxtQyI^7ItJ_Oja?Ek7)Mn&5?RAx r^5pwAOtp5$1_|yXYCUYo32Iv>wEdQqg|0VFt?`sVFlfnN78mz{j diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/2.jpg b/fastlane/metadata/android/en-US/images/phoneScreenshots/2.jpg deleted file mode 100644 index 9b2390b9251d809263ae5102d987b6c74a02acd2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59506 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 diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/4.jpg b/fastlane/metadata/android/en-US/images/phoneScreenshots/4.jpg deleted file mode 100644 index 032d9d9bcbc40625a2140d6683a556530d983da2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33645 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Π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®Kf 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: - - - - -Add this to your app's manifest.json: - - ... - { - "icons": [ - { "src": "/favicon.ico", "type": "image/x-icon", "sizes": "16x16 32x32" }, - { "src": "/icon-192.png", "type": "image/png", "sizes": "192x192" }, - { "src": "/icon-512.png", "type": "image/png", "sizes": "512x512" }, - { "src": "/icon-192-maskable.png", "type": "image/png", "sizes": "192x192", "purpose": "maskable" }, - { "src": "/icon-512-maskable.png", "type": "image/png", "sizes": "512x512", "purpose": "maskable" } - ] - } - ... diff --git a/web/apple-touch-icon.png b/web/apple-touch-icon.png deleted file mode 100644 index 8aa2f077726fc86ecef4beafac8a75af53f10cf1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9496 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 - - - - - - - - - - - -Just a moment... Home - - - - - - -

Just a moment...

- - - - - \ No newline at end of file diff --git a/web/data/UpdateConfig.json b/web/data/UpdateConfig.json index e0b11a7..ab11e24 100644 --- a/web/data/UpdateConfig.json +++ b/web/data/UpdateConfig.json @@ -5,11 +5,11 @@ "url": "https://github.com/xoureldeen/Vectras-VM-Android/releases", "Message": "

4.3.0

\nBugs fixed.", "cancellable": true, - "versionCodeBeta":"134", - "versionNameBeta":"4.3.0", - "versionNameBetas":"4.0.1,4.0.2,4.0.3,4.0.4,4.0.5,4.0.6,4.0.7,4.0.8,4.0.9,4.1.1,4.1.2,4.1.3,4.1.4,4.1.5,4.1.6,4.1.7,4.1.8,4.1.9,4.2.0,4.2.1,4.2.2,4.2.3,4.2.4,4.2.5,4.2.6,4.2.7,4.2.8,4.2.9,4.3.0", + "versionCodeBeta":"135", + "versionNameBeta":"4.3.1", + "versionNameBetas":"4.0.1,4.0.2,4.0.3,4.0.4,4.0.5,4.0.6,4.0.7,4.0.8,4.0.9,4.1.1,4.1.2,4.1.3,4.1.4,4.1.5,4.1.6,4.1.7,4.1.8,4.1.9,4.2.1,4.2.2,4.2.3,4.2.4,4.2.5,4.2.6,4.2.7,4.2.8,4.2.9,4.3.0,4.3.1", "sizeBeta": "45 MB", "urlBeta": "https://github.com/AnBui2004/Vectras-VM-Emu-Android/releases", - "MessageBeta": "

4.3.0

Bugs fixed.", + "MessageBeta": "

4.3.1

Bugs fixed.", "cancellableBeta": true } diff --git a/web/favicon.ico b/web/favicon.ico deleted file mode 100644 index 3b43dc67b7cd409a884a7006b8ed66b076556505..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5238 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 - - - - - - - - - - - -Just a moment... Home - - - - - - -

Just a moment...

- - - - - \ No newline at end of file diff --git a/web/icon-192-maskable.png b/web/icon-192-maskable.png deleted file mode 100644 index d0c15033eec86a5d048f6f61547d24c83d97effb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10045 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 VBlS7^#brGl&{Wk`sk~(q_CM0f5pVzi diff --git a/web/icon-192.png b/web/icon-192.png deleted file mode 100644 index b468d14fd10f5f8aef666ac119c99d4cbbc2daf2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12693 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 diff --git a/web/icon-512-maskable.png b/web/icon-512-maskable.png deleted file mode 100644 index 94161f5e7c42ff980574c7b1034ddcb7c37c8065..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35495 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 UwLmOzX@DO!CGA_KH?2eeAI&+gGynhq diff --git a/web/icon-512.png b/web/icon-512.png deleted file mode 100644 index 33ddc40be4c7957c6c2a99ccae2bd848713f33fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42882 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 ak66wc>F7p$9_j?3KOHRt&2n|enEwI%Oy`II diff --git a/web/index.html b/web/index.html deleted file mode 100644 index d26f911..0000000 --- a/web/index.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - -Just a moment... Home - - - - - - -

Just a moment...

- - - - - \ No newline at end of file diff --git a/web/logo.png b/web/logo.png deleted file mode 100644 index b16de6afb4a2370ea5925ea4dff5e99cc333f55d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 100438 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 F{||J5TBQI0 From 24a63b4311792addd7715aeb7ff8197ce194dafc Mon Sep 17 00:00:00 2001 From: An Bui <91354810+AnBui2004@users.noreply.github.com> Date: Wed, 8 Jul 2026 22:20:50 +0700 Subject: [PATCH 08/18] 4.3.2 - Fixed Terminal2 not collecting error logs. - Improved detection of whether QEMU returns an error. --- app/build.gradle | 4 +- .../main/java/com/vectras/vm/MainService.java | 38 ++++++++++++------- .../main/java/com/vectras/vm/VMManager.java | 4 +- .../com/vectras/vm/main/core/MainStartVM.java | 6 ++- .../java/com/vectras/vterm/Terminal2.java | 1 + web/data/UpdateConfig.json | 8 ++-- 6 files changed, 36 insertions(+), 25 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 181b40f..03201c9 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -12,8 +12,8 @@ android { applicationId "com.vectras.vm" minSdk minApi targetSdk targetApi - versionCode 135 - versionName "4.3.1" + versionCode 136 + versionName "4.3.2" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" multiDexEnabled true diff --git a/app/src/main/java/com/vectras/vm/MainService.java b/app/src/main/java/com/vectras/vm/MainService.java index 6c13776..0f5a56b 100644 --- a/app/src/main/java/com/vectras/vm/MainService.java +++ b/app/src/main/java/com/vectras/vm/MainService.java @@ -16,6 +16,8 @@ import android.util.Log; import androidx.core.app.NotificationCompat; +import com.vectras.vm.main.core.MainStartVM; +import com.vectras.vm.manager.VmServiceManager; import com.vectras.vm.utils.ClipboardUltils; import com.vectras.vm.utils.DialogUtils; import com.vectras.vterm.Terminal; @@ -26,7 +28,7 @@ import java.util.Objects; public class MainService extends Service { public static String CHANNEL_ID = "Vectras VM Service"; private final int NOTIFICATION_ID = 1; - private final String MACHINE_NAME = "Vectras VM"; + public static String vmName = "Vectras VM"; public static String env = null; private static String TAG = "MainService"; public static MainService service; @@ -48,7 +50,7 @@ public class MainService extends Service { Notification notification = new NotificationCompat.Builder(this, CHANNEL_ID) .setContentTitle(getString(R.string.app_name)) - .setContentText(MACHINE_NAME + " running in background.") + .setContentText("The virtual machines are running...") .setSmallIcon(R.drawable.ic_vectras_vm_48) .addAction(R.drawable.close_24px, getString(R.string.stop), pStopSelf) .build(); @@ -57,7 +59,7 @@ public class MainService extends Service { if (env != null) { if (service != null) { - startCommand(env, activityContext); + startCommand(vmName, env, activityContext); } } else { Log.e(TAG, "env is null"); @@ -77,10 +79,13 @@ public class MainService extends Service { @Override public int onStartCommand(Intent intent, int flags, int startId) { if (intent != null && Objects.equals(intent.getAction(), STOP_ACTION)) { - VMManager.killallqemuprocesses(this); - stopForeground(true); - stopSelf(); - return START_NOT_STICKY; + new Thread(() -> { + VMManager.killallqemuprocesses(this); + new Handler(Looper.getMainLooper()).post(() -> { + stopForeground(true); + stopSelf(); + }); + }).start(); } return START_NOT_STICKY; } @@ -102,7 +107,7 @@ public class MainService extends Service { } } - public static void startCommand(String env, Context context) { + public static void startCommand(String vmName, String env, Context context) { Terminal2 terminal2 = new Terminal2(activityContext); terminal2.setDefaultShellBash(); terminal2.setStartup("export XDG_RUNTIME_DIR=/tmp && unset PULSE_SERVER"); @@ -123,13 +128,18 @@ public class MainService extends Service { return; } - new Handler(Looper.getMainLooper()).post(() -> { - if (VMManager.isExecutedCommandError(command, log, context)) - return; + if (!(log.trim().isEmpty() || log.trim().equals(MainStartVM.TAG_FINISHED_WITHOUT_ERROR))) { + new Handler(Looper.getMainLooper()).post(() -> { + if (!VMManager.isExecutedCommandError(command, log, context)) { + String finalLog = log.contains(MainStartVM.TAG_FINISHED_WITHOUT_ERROR) ? log.substring(0, log.lastIndexOf(MainStartVM.TAG_FINISHED_WITHOUT_ERROR) - 1) : log; - DialogUtils.twoDialog(context, "Execution Result", log, context.getString(R.string.copy), context.getString(R.string.close), true, R.drawable.round_terminal_24, true, - () -> ClipboardUltils.copyToClipboard(context, log), null, null); - }); + DialogUtils.twoDialog(context, vmName, finalLog, context.getString(R.string.copy), context.getString(R.string.close), true, R.drawable.stack_24px, true, + () -> ClipboardUltils.copyToClipboard(context, log), null, null); + } + }); + } + + VmServiceManager.stopService(context); } @Override diff --git a/app/src/main/java/com/vectras/vm/VMManager.java b/app/src/main/java/com/vectras/vm/VMManager.java index cafc2c3..61425b0 100644 --- a/app/src/main/java/com/vectras/vm/VMManager.java +++ b/app/src/main/java/com/vectras/vm/VMManager.java @@ -666,8 +666,6 @@ public class VMManager { return false; } - VmServiceManager.stopService(_activity); - if (_command.contains("qemu-system") && _result.contains("Killed")) { isQemuStopedWithError = true; return true; @@ -735,7 +733,7 @@ public class VMManager { }, null, null); return false; - } else if (_command.contains("qemu-system") && _result.contains("qemu-system") && !_result.contains("warning:")) { + } else if (!_result.contains(MainStartVM.TAG_FINISHED_WITHOUT_ERROR)) { //Error code: UNKNOW_ERROR DialogUtils.oneDialog(_activity, _activity.getString(R.string.problem_has_been_detected), _activity.getString(R.string.vm_could_not_be_run_content) + "\n\n" + _result, R.drawable.error_96px); _activity.stopService(new Intent(_activity, MainService.class)); diff --git a/app/src/main/java/com/vectras/vm/main/core/MainStartVM.java b/app/src/main/java/com/vectras/vm/main/core/MainStartVM.java index ba72d09..2073dc9 100644 --- a/app/src/main/java/com/vectras/vm/main/core/MainStartVM.java +++ b/app/src/main/java/com/vectras/vm/main/core/MainStartVM.java @@ -35,6 +35,7 @@ import java.io.File; public class MainStartVM { public static final String TAG = "HomeStartVM"; + public static final String TAG_FINISHED_WITHOUT_ERROR = "This VM has shut down."; public static boolean skipIDEwithARM64DialogInStartVM = false; public static boolean breakNow = false; public static final Handler handlerForLaunch = new Handler(Looper.getMainLooper()); @@ -297,7 +298,7 @@ public class MainStartVM { ) { VMManager.isQemuStopedWithError = false; - String cleanUpCommand = "; rm -r " + Config.getCacheVMPath(vmID); + String cleanUpCommand = " && echo \"" + TAG_FINISHED_WITHOUT_ERROR + "\"\nrm -r " + Config.getCacheVMPath(vmID); String finalCommand = VMManager.addAudioDevWav(vmID, String.format(runCommandFormat, env + cleanUpCommand)); @@ -314,11 +315,12 @@ public class MainStartVM { } if (ServiceUtils.isServiceRunning(context, MainService.class)) { - MainService.startCommand(finalCommand, context); + MainService.startCommand(vmName, finalCommand, context); } else { Intent serviceIntent = new Intent(context, MainService.class); MainService.activityContext = context; MainService.env = finalCommand; + MainService.vmName = vmName; MainService.CHANNEL_ID = vmName; if (SDK_INT >= Build.VERSION_CODES.O) { context.startForegroundService(serviceIntent); diff --git a/app/src/main/java/com/vectras/vterm/Terminal2.java b/app/src/main/java/com/vectras/vterm/Terminal2.java index 4949063..3d2d811 100644 --- a/app/src/main/java/com/vectras/vterm/Terminal2.java +++ b/app/src/main/java/com/vectras/vterm/Terminal2.java @@ -107,6 +107,7 @@ public class Terminal2 { try { ProcessBuilder processBuilder = new ProcessBuilder(); + processBuilder.redirectErrorStream(true); String filesDir = Objects.requireNonNull(context.getFilesDir().getAbsolutePath()); diff --git a/web/data/UpdateConfig.json b/web/data/UpdateConfig.json index ab11e24..63d593c 100644 --- a/web/data/UpdateConfig.json +++ b/web/data/UpdateConfig.json @@ -5,11 +5,11 @@ "url": "https://github.com/xoureldeen/Vectras-VM-Android/releases", "Message": "

4.3.0

\nBugs fixed.", "cancellable": true, - "versionCodeBeta":"135", - "versionNameBeta":"4.3.1", - "versionNameBetas":"4.0.1,4.0.2,4.0.3,4.0.4,4.0.5,4.0.6,4.0.7,4.0.8,4.0.9,4.1.1,4.1.2,4.1.3,4.1.4,4.1.5,4.1.6,4.1.7,4.1.8,4.1.9,4.2.1,4.2.2,4.2.3,4.2.4,4.2.5,4.2.6,4.2.7,4.2.8,4.2.9,4.3.0,4.3.1", + "versionCodeBeta":"136", + "versionNameBeta":"4.3.2", + "versionNameBetas":"4.0.1,4.0.2,4.0.3,4.0.4,4.0.5,4.0.6,4.0.7,4.0.8,4.0.9,4.1.1,4.1.2,4.1.3,4.1.4,4.1.5,4.1.6,4.1.7,4.1.8,4.1.9,4.2.1,4.2.2,4.2.3,4.2.4,4.2.5,4.2.6,4.2.7,4.2.8,4.2.9,4.3.0,4.3.1,4.3.2", "sizeBeta": "45 MB", "urlBeta": "https://github.com/AnBui2004/Vectras-VM-Emu-Android/releases", - "MessageBeta": "

4.3.1

Bugs fixed.", + "MessageBeta": "

4.3.2

Bugs fixed.", "cancellableBeta": true } From 3990bbb4c86d40cede6f3fd1b7443aeb20004b95 Mon Sep 17 00:00:00 2001 From: An Bui <91354810+AnBui2004@users.noreply.github.com> Date: Thu, 9 Jul 2026 23:38:17 +0700 Subject: [PATCH 09/18] 4.3.3 - Fixed the issue of being unable to insert or change optical discs, floppy drives, and memory cards when filenames contained spaces. - Added equalizer. - Bubbles on the built-in VNC screen will automatically fade when there is no interaction. - The default setting for automatically switching to external mouse mode on the built-in VNC screen is now off. --- app/build.gradle | 4 +- app/src/main/AndroidManifest.xml | 5 + .../com/vectras/qemu/MainSettingsManager.java | 2 +- .../com/vectras/qemu/MainVNCActivity.java | 2 +- .../com/vectras/vm/manager/QmpSender.java | 2 +- .../vm/settings/EqualizerActivity.java | 195 +++++++++++ .../vm/settings/Settings2Activity.java | 2 + .../vectras/vm/sound/AudioSettingsData.java | 62 ++++ .../com/vectras/vm/sound/SoundEffect.java | 118 +++++++ .../com/vectras/vm/sound/StreamAudio.java | 65 ++++ .../com/vectras/vm/view/DynamicBubble.java | 7 + .../java/com/vectras/vm/x11/X11Activity.java | 2 +- app/src/main/res/drawable/graphic_eq_24px.xml | 10 + .../main/res/drawable/graphic_eq_off_96px.xml | 10 + app/src/main/res/drawable/undo_24px.xml | 11 + .../main/res/layout/activity_equalizer.xml | 308 ++++++++++++++++++ app/src/main/res/layout/activity_main.xml | 7 +- .../main/res/layout/activity_settings2.xml | 39 ++- app/src/main/res/menu/equalizer_menu.xml | 13 + app/src/main/res/values-vi/strings.xml | 11 + app/src/main/res/values/strings.xml | 11 + web/data/UpdateConfig.json | 8 +- 22 files changed, 879 insertions(+), 15 deletions(-) create mode 100644 app/src/main/java/com/vectras/vm/settings/EqualizerActivity.java create mode 100644 app/src/main/java/com/vectras/vm/sound/AudioSettingsData.java create mode 100644 app/src/main/java/com/vectras/vm/sound/SoundEffect.java create mode 100644 app/src/main/res/drawable/graphic_eq_24px.xml create mode 100644 app/src/main/res/drawable/graphic_eq_off_96px.xml create mode 100644 app/src/main/res/drawable/undo_24px.xml create mode 100644 app/src/main/res/layout/activity_equalizer.xml create mode 100644 app/src/main/res/menu/equalizer_menu.xml diff --git a/app/build.gradle b/app/build.gradle index 03201c9..4a074e8 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -12,8 +12,8 @@ android { applicationId "com.vectras.vm" minSdk minApi targetSdk targetApi - versionCode 136 - versionName "4.3.2" + versionCode 137 + versionName "4.3.3" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" multiDexEnabled true diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7a7b5d2..7c09edb 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -299,6 +299,11 @@ + + \ No newline at end of file diff --git a/app/src/main/java/com/vectras/qemu/MainSettingsManager.java b/app/src/main/java/com/vectras/qemu/MainSettingsManager.java index c9a51f4..59d51bc 100644 --- a/app/src/main/java/com/vectras/qemu/MainSettingsManager.java +++ b/app/src/main/java/com/vectras/qemu/MainSettingsManager.java @@ -1341,6 +1341,6 @@ public class MainSettingsManager extends AppCompatActivity public static Boolean getAutoSwitchToExternalMouse(Context context) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); - return prefs.getBoolean("autoSwitchToExternalMouse", true); + return prefs.getBoolean("autoSwitchToExternalMouse", false); } } diff --git a/app/src/main/java/com/vectras/qemu/MainVNCActivity.java b/app/src/main/java/com/vectras/qemu/MainVNCActivity.java index ccb6295..617ea55 100644 --- a/app/src/main/java/com/vectras/qemu/MainVNCActivity.java +++ b/app/src/main/java/com/vectras/qemu/MainVNCActivity.java @@ -397,7 +397,7 @@ public class MainVNCActivity extends VncCanvasActivity { public void onDestroy() { super.onDestroy(); this.stopTimeListener(); - if (streamAudio != null) streamAudio.stop(); + if (streamAudio != null) streamAudio.release(); //Terminal.killQemuProcess(); } diff --git a/app/src/main/java/com/vectras/vm/manager/QmpSender.java b/app/src/main/java/com/vectras/vm/manager/QmpSender.java index 861cc89..76a8e5e 100644 --- a/app/src/main/java/com/vectras/vm/manager/QmpSender.java +++ b/app/src/main/java/com/vectras/vm/manager/QmpSender.java @@ -363,7 +363,7 @@ public class QmpSender { public static String changeDevice(String deviceId, String filePath) { if (filePath.trim().isEmpty()) return ejectDevice(deviceId); - return send("change " + deviceId + " " + filePath); + return send("change " + deviceId + " \"" + filePath + "\""); } public static void quickEjectDevice(Context context, String deviceId) { diff --git a/app/src/main/java/com/vectras/vm/settings/EqualizerActivity.java b/app/src/main/java/com/vectras/vm/settings/EqualizerActivity.java new file mode 100644 index 0000000..7fe1328 --- /dev/null +++ b/app/src/main/java/com/vectras/vm/settings/EqualizerActivity.java @@ -0,0 +1,195 @@ +package com.vectras.vm.settings; + +import android.content.Intent; +import android.os.Bundle; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; + +import androidx.activity.EdgeToEdge; +import androidx.appcompat.app.AppCompatActivity; + +import com.vectras.vm.R; +import com.vectras.vm.databinding.ActivityEqualizerBinding; +import com.vectras.vm.sound.AudioSettingsData; +import com.vectras.vm.sound.SoundEffect; + +import java.text.DecimalFormat; +import java.util.Objects; + +public class EqualizerActivity extends AppCompatActivity { + + ActivityEqualizerBinding binding; + AudioSettingsData audioSettingsData; + float[] lastValues = new float[5]; + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + int id = item.getItemId(); + if (id == R.id.undo) { + binding.sliderUpperTreble.setValue(lastValues[0]); + binding.sliderTreble.setValue(lastValues[1]); + binding.sliderMid.setValue(lastValues[2]); + binding.sliderBass.setValue(lastValues[3]); + binding.sliderLowBass.setValue(lastValues[4]); + return true; + } else if (id == R.id.reset) { + binding.sliderUpperTreble.setValue(0); + binding.sliderTreble.setValue(0); + binding.sliderMid.setValue(0); + binding.sliderBass.setValue(0); + binding.sliderLowBass.setValue(0); + return true; + } else { + return super.onOptionsItemSelected(item); + } + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.equalizer_menu, menu); + return true; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + EdgeToEdge.enable(this); + binding = ActivityEqualizerBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + setSupportActionBar(binding.toolbar); + Objects.requireNonNull(getSupportActionBar()).setDisplayHomeAsUpEnabled(true); + binding.toolbar.setNavigationOnClickListener(view -> finish()); + initialize(); + } + + @Override + public void onPause() { + super.onPause(); + + if (audioSettingsData != null) { + audioSettingsData.setEqualizerEnabled(binding.swEnabled.isChecked()); + audioSettingsData.setUpperTreble(binding.sliderUpperTreble.getValue()); + audioSettingsData.setTreble(binding.sliderTreble.getValue()); + audioSettingsData.setMid(binding.sliderMid.getValue()); + audioSettingsData.setBass(binding.sliderBass.getValue()); + audioSettingsData.setLowBass(binding.sliderLowBass.getValue()); + } + } + + private void initialize() { + SoundEffect soundEffect = new SoundEffect(this, 0); + short bands = soundEffect.equalizer.getNumberOfBands(); + + if (bands < 2) { + binding.lnUnsupport.setVisibility(View.VISIBLE); + binding.appbar.setVisibility(View.GONE); + binding.lnEnabled.setVisibility(View.GONE); + binding.lnAllOptions.setVisibility(View.GONE); + binding.btnExit.setOnClickListener(v -> finish()); + return; + } + + audioSettingsData = new AudioSettingsData(this); + + lastValues[0] = audioSettingsData.getUpperTreble(); + lastValues[1] = audioSettingsData.getTreble(); + lastValues[2] = audioSettingsData.getMid(); + lastValues[3] = audioSettingsData.getBass(); + lastValues[4] = audioSettingsData.getLowBass(); + + + // 1dB = 100mB + int minBandLevelRange = soundEffect.getMinBandLevelRange() / 100; + int maxBandLevelRange = soundEffect.getMaxBandLevelRange() / 100; + + if (bands > 4) { + binding.sliderLowBass.setValueFrom(minBandLevelRange); + binding.sliderLowBass.setValueTo(maxBandLevelRange); + + binding.sliderLowBass.setValue(audioSettingsData.getLowBass()); + + binding.tvLowBassValue.setText(getFormattedValue(binding.sliderLowBass.getValue())); + + binding.sliderLowBass.addOnChangeListener((slider, value, fromUser) -> binding.tvLowBassValue.setText(getFormattedValue(value))); + } else { + binding.lnLowBass.setVisibility(View.GONE); + binding.tvUpperTreble.setText(R.string.upper_treble); + binding.tvTreble.setText(R.string.treble); + binding.tvMid.setText(R.string.bass); + binding.tvBass.setText(R.string.low_bass); + } + + if (bands > 3) { + binding.sliderBass.setValueFrom(minBandLevelRange); + binding.sliderBass.setValueTo(maxBandLevelRange); + + binding.sliderBass.setValue(audioSettingsData.getBass()); + + binding.tvBassValue.setText(getFormattedValue(binding.sliderBass.getValue())); + + binding.sliderBass.addOnChangeListener((slider, value, fromUser) -> binding.tvBassValue.setText(getFormattedValue(value))); + } else { + binding.lnBass.setVisibility(View.GONE); + binding.tvUpperTreble.setText(R.string.treble); + binding.tvTreble.setText(R.string.mid); + binding.tvMid.setText(R.string.bass); + } + + if (bands > 2) { + binding.sliderMid.setValueFrom(minBandLevelRange); + binding.sliderMid.setValueTo(maxBandLevelRange); + + binding.sliderMid.setValue(audioSettingsData.getMid()); + + binding.tvMidValue.setText(getFormattedValue(binding.sliderMid.getValue())); + + binding.sliderMid.addOnChangeListener((slider, value, fromUser) -> binding.tvMidValue.setText(getFormattedValue(value))); + } else { + binding.lnMid.setVisibility(View.GONE); + binding.tvUpperTreble.setText(R.string.treble); + binding.tvTreble.setText(R.string.bass); + } + + binding.sliderUpperTreble.setValueFrom(minBandLevelRange); + binding.sliderUpperTreble.setValueTo(maxBandLevelRange); + + binding.sliderTreble.setValueFrom(minBandLevelRange); + binding.sliderTreble.setValueTo(maxBandLevelRange); + + + binding.sliderUpperTreble.setValue(audioSettingsData.getUpperTreble()); + binding.sliderTreble.setValue(audioSettingsData.getTreble()); + + + binding.tvUpperTrebleValue.setText(getFormattedValue(binding.sliderUpperTreble.getValue())); + binding.tvTrebleValue.setText(getFormattedValue(binding.sliderTreble.getValue())); + + + binding.sliderUpperTreble.addOnChangeListener((slider, value, fromUser) -> binding.tvUpperTrebleValue.setText(getFormattedValue(value))); + binding.sliderTreble.addOnChangeListener((slider, value, fromUser) -> binding.tvTrebleValue.setText(getFormattedValue(value))); + + + binding.lnEnabled.setOnClickListener(v -> binding.swEnabled.toggle()); + binding.swEnabled.setChecked(audioSettingsData.isEqualizerEnabled()); + binding.swEnabled.setOnCheckedChangeListener((buttonView, isChecked) -> setEnabled(isChecked)); + + + setEnabled(binding.swEnabled.isChecked()); + } + + private void setEnabled(boolean isEnabled) { + binding.lnAllOptions.setAlpha(isEnabled ? 1 : 0.5f); + binding.sliderUpperTreble.setEnabled(isEnabled); + binding.sliderTreble.setEnabled(isEnabled); + binding.sliderMid.setEnabled(isEnabled); + binding.sliderBass.setEnabled(isEnabled); + binding.sliderLowBass.setEnabled(isEnabled); + } + + DecimalFormat decimalFormat = new DecimalFormat("#.#"); + + private String getFormattedValue(float value) { + return decimalFormat.format(value) + " dB"; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/vectras/vm/settings/Settings2Activity.java b/app/src/main/java/com/vectras/vm/settings/Settings2Activity.java index 9dd2bf4..30bb1d3 100644 --- a/app/src/main/java/com/vectras/vm/settings/Settings2Activity.java +++ b/app/src/main/java/com/vectras/vm/settings/Settings2Activity.java @@ -42,5 +42,7 @@ public class Settings2Activity extends AppCompatActivity { binding.lnVnc.setOnClickListener(v -> startActivity(new Intent(this, VNCSettingsActivity.class))); binding.lnX11.setOnClickListener(v -> startActivity(new Intent(this, X11DisplaySettingsActivity.class))); + + binding.lnEqualizer.setOnClickListener(v -> startActivity(new Intent(this, EqualizerActivity.class))); } } \ No newline at end of file diff --git a/app/src/main/java/com/vectras/vm/sound/AudioSettingsData.java b/app/src/main/java/com/vectras/vm/sound/AudioSettingsData.java new file mode 100644 index 0000000..d7a53f1 --- /dev/null +++ b/app/src/main/java/com/vectras/vm/sound/AudioSettingsData.java @@ -0,0 +1,62 @@ +package com.vectras.vm.sound; + +import android.content.Context; +import android.content.SharedPreferences; + +public class AudioSettingsData { + Context context; + SharedPreferences sharedPreferences; + + public AudioSettingsData(Context context) { + this.context = context; + sharedPreferences = context.getSharedPreferences("audio_settings", Context.MODE_PRIVATE); + } + + public void setEqualizerEnabled(boolean enabled) { + sharedPreferences.edit().putBoolean("isEnabled", enabled).apply(); + } + + public boolean isEqualizerEnabled() { + return sharedPreferences.getBoolean("isEnabled", false); + } + + public void setUpperTreble(float value) { + sharedPreferences.edit().putFloat("upperTreble", value).apply(); + } + + public float getUpperTreble() { + return sharedPreferences.getFloat("upperTreble", 0); + } + + public void setTreble(float value) { + sharedPreferences.edit().putFloat("treble", value).apply(); + } + + public float getTreble() { + return sharedPreferences.getFloat("treble", 0); + } + + public void setMid(float value) { + sharedPreferences.edit().putFloat("mid", value).apply(); + } + + public float getMid() { + return sharedPreferences.getFloat("mid", 0); + } + + public void setBass(float value) { + sharedPreferences.edit().putFloat("bass", value).apply(); + } + + public float getBass() { + return sharedPreferences.getFloat("bass", 0); + } + + public void setLowBass(float value) { + sharedPreferences.edit().putFloat("lowBass", value).apply(); + } + + public float getLowBass() { + return sharedPreferences.getFloat("lowBass", 0); + } +} diff --git a/app/src/main/java/com/vectras/vm/sound/SoundEffect.java b/app/src/main/java/com/vectras/vm/sound/SoundEffect.java new file mode 100644 index 0000000..2eaec7b --- /dev/null +++ b/app/src/main/java/com/vectras/vm/sound/SoundEffect.java @@ -0,0 +1,118 @@ +package com.vectras.vm.sound; + +import android.content.Context; +import android.media.audiofx.Equalizer; +import android.util.Log; + +public class SoundEffect { + final String TAG = "SoundEffect"; + + Context context; + public int session; + public Equalizer equalizer; + + public SoundEffect(Context context, int session) { + this.context = context; + this.session = session; + + equalizer = new Equalizer(1000, session); + } + + public AudioFrequencyData getDeviceAudioFrequencies() { + AudioFrequencyData data = new AudioFrequencyData(); + + int[] targets = { 60, 230, 910, 4000, 14000 }; + + short bands = equalizer.getNumberOfBands(); + int[] hzList = new int[bands]; + + for (short i = 0; i < bands; i++) { + int center = equalizer.getCenterFreq(i); + hzList[i] = center / 1000; + } + + if (bands <= targets.length) { + int[] finalIds = new int[bands]; + for (int i = 0; i < bands; i++) { + finalIds[i] = i; + } + + data.frequencies = hzList; + data.ids = finalIds; + + Log.d(TAG, "Equalizer bands: " + bands); + Log.d(TAG, "Equalizer frequencies: " + hzList[0] + ", " + hzList[1] + ", " + hzList[2] + ", " + hzList[3] + ", " + hzList[4]); + Log.d(TAG, "Equalizer ids: " + finalIds[0] + ", " + finalIds[1] + ", " + finalIds[2] + ", " + finalIds[3] + ", " + finalIds[4]); + + return data; + } + + int[] finalHzList = new int[5]; + int[] finalIds = new int[5]; + + for (int i = 0; i < targets.length; i++) { + int losest = Integer.MAX_VALUE; + int bandId = 0; + for (int ii = 0; ii < hzList.length; ii++) { + if (Math.abs(targets[i] - hzList[ii]) < losest) { + losest = hzList[ii]; + bandId = ii; + } + + finalHzList[i] = losest; + finalIds[i] = bandId; + } + } + + data.frequencies = finalHzList; + data.ids = finalIds; + + Log.d(TAG, "Equalizer bands: " + bands); + Log.d(TAG, "Equalizer frequencies: " + hzList[0] + ", " + hzList[1] + ", " + hzList[2] + ", " + hzList[3] + ", " + hzList[4]); + Log.d(TAG, "Equalizer ids: " + finalIds[0] + ", " + finalIds[1] + ", " + finalIds[2] + ", " + finalIds[3] + ", " + finalIds[4]); + + return data; + } + + public void applyEffect(float[] dBData) { + short bands = equalizer.getNumberOfBands(); + + if (bands < 2) { + Log.d(TAG, "Equalizer bands: " + bands); + return; + } + + AudioFrequencyData data = getDeviceAudioFrequencies(); + + equalizer.setBandLevel((short) data.ids[0], (short) dBData[0]); + equalizer.setBandLevel((short) data.ids[1], (short) dBData[1]); + if (bands > 2) equalizer.setBandLevel((short) data.ids[2], (short) dBData[2]); + if (bands > 3) equalizer.setBandLevel((short) data.ids[3], (short) dBData[3]); + if (bands > 4) equalizer.setBandLevel((short) data.ids[4], (short) dBData[4]); + + Log.d(TAG, "Equalizer dB: " + dBData[0] + ", " + dBData[1] + ", " + dBData[2] + ", " + dBData[3] + ", " + dBData[4]); + } + + public void release() { + if (equalizer != null) { + equalizer.release(); + } + } + + public void setEnabled(boolean isEnabled) { + equalizer.setEnabled(isEnabled); + } + + public short getMinBandLevelRange() { + return equalizer.getBandLevelRange()[0]; + } + + public short getMaxBandLevelRange() { + return equalizer.getBandLevelRange()[1]; + } + + public static class AudioFrequencyData { + int[] frequencies; + int[] ids; + } +} diff --git a/app/src/main/java/com/vectras/vm/sound/StreamAudio.java b/app/src/main/java/com/vectras/vm/sound/StreamAudio.java index 756ff72..f5a4599 100644 --- a/app/src/main/java/com/vectras/vm/sound/StreamAudio.java +++ b/app/src/main/java/com/vectras/vm/sound/StreamAudio.java @@ -5,6 +5,7 @@ import android.content.Context; import android.media.AudioAttributes; import android.media.AudioFormat; import android.media.AudioTrack; +import android.media.audiofx.Equalizer; import android.util.Log; import com.vectras.vm.utils.FileUtils; @@ -19,6 +20,7 @@ public class StreamAudio { private int sampleRate = 48000; public boolean isDestroyed; private StreamAudio cross; + private SoundEffect soundEffect; public StreamAudio(Context context) { this.context = context; @@ -56,6 +58,10 @@ public class StreamAudio { sampleRate = 48000; } + public void release() { + isPlay = false; + releaseSoundEffect(); + } public void streamFromFile() { if (isPlay) return; @@ -102,6 +108,8 @@ public class StreamAudio { .setTransferMode(AudioTrack.MODE_STREAM) .build(); + applyEffect(audioTrack); + audioTrack.play(); if (cross != null && !cross.isDestroyed && cross.isPlaying()) cross.stop(); @@ -135,6 +143,63 @@ public class StreamAudio { }).start(); } + float[] currentdBData = new float[5]; + + public void applyEffect(AudioTrack audioTrack) { + if (soundEffect != null && soundEffect.equalizer.getNumberOfBands() < 2) return; + + AudioSettingsData audioSettingsData = new AudioSettingsData(context); + + if (!audioSettingsData.isEqualizerEnabled()) { + releaseSoundEffect(); + return; + } + + if (soundEffect == null || soundEffect.session != audioTrack.getAudioSessionId()) + soundEffect = new SoundEffect(context, audioTrack.getAudioSessionId()); + + if (soundEffect.equalizer.getNumberOfBands() < 2) return; + + float[] dBData = new float[5]; + + //Bass -> Mid -> Treble + dBData[0] = audioSettingsData.getLowBass(); + dBData[1] = audioSettingsData.getBass(); + dBData[2] = audioSettingsData.getMid(); + dBData[3] = audioSettingsData.getTreble(); + dBData[4] = audioSettingsData.getUpperTreble(); + + if ( + currentdBData[0] == dBData[0] && + currentdBData[1] == dBData[1] && + currentdBData[2] == dBData[2] && + currentdBData[3] == dBData[3] && + currentdBData[4] == dBData[4]) { + return; + } + + this.currentdBData = dBData; + + // Convert dB to mB + for (int i = 0; i < dBData.length; i++) { + dBData[i] = dBData[i] * 100; + } + + soundEffect.applyEffect(dBData); + + soundEffect.setEnabled(audioSettingsData.isEqualizerEnabled()); + + Log.d(TAG, "Equalizer enabled: " + audioSettingsData.isEqualizerEnabled()); + } + + public void releaseSoundEffect() { + if (soundEffect != null) { + soundEffect.setEnabled(false); + soundEffect.release(); + soundEffect = null; + } + } + private boolean isContextDestroyed(Context context) { if (context instanceof Activity activity) { isDestroyed = activity.isDestroyed() || activity.isFinishing(); diff --git a/app/src/main/java/com/vectras/vm/view/DynamicBubble.java b/app/src/main/java/com/vectras/vm/view/DynamicBubble.java index 285d470..8836331 100644 --- a/app/src/main/java/com/vectras/vm/view/DynamicBubble.java +++ b/app/src/main/java/com/vectras/vm/view/DynamicBubble.java @@ -23,6 +23,8 @@ public class DynamicBubble { } private void setup() { + bubble.animate().alpha(0.5f).setDuration(200); + bubble.setOnTouchListener((v, event) -> { switch (event.getActionMasked()) { @@ -44,6 +46,9 @@ public class DynamicBubble { // If the displacement exceeds the threshold, it is determined that pulling is occurring. if (Math.abs(movedX) > CLICK_ACTION_THRESHOLD || Math.abs(movedY) > CLICK_ACTION_THRESHOLD) { + + if (!isDragging) bubble.animate().alpha(1).setDuration(200); + isDragging = true; // Move the view using your finger. @@ -75,6 +80,8 @@ public class DynamicBubble { } private void onDropped() { + bubble.animate().alpha(0.5f).setDuration(200); + if (bubble.getX() > (float) container.getWidth() / 2) { bubble.animate().x(container.getWidth() - bubble.getWidth()); } else { diff --git a/app/src/main/java/com/vectras/vm/x11/X11Activity.java b/app/src/main/java/com/vectras/vm/x11/X11Activity.java index 72803dd..18a73f3 100644 --- a/app/src/main/java/com/vectras/vm/x11/X11Activity.java +++ b/app/src/main/java/com/vectras/vm/x11/X11Activity.java @@ -752,7 +752,7 @@ public class X11Activity extends AppCompatActivity implements View.OnApplyWindow @Override protected void onDestroy() { unregisterReceiver(receiver); - if (streamAudio != null) streamAudio.stop(); + if (streamAudio != null) streamAudio.release(); super.onDestroy(); } diff --git a/app/src/main/res/drawable/graphic_eq_24px.xml b/app/src/main/res/drawable/graphic_eq_24px.xml new file mode 100644 index 0000000..ee498e8 --- /dev/null +++ b/app/src/main/res/drawable/graphic_eq_24px.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/graphic_eq_off_96px.xml b/app/src/main/res/drawable/graphic_eq_off_96px.xml new file mode 100644 index 0000000..d532fad --- /dev/null +++ b/app/src/main/res/drawable/graphic_eq_off_96px.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/undo_24px.xml b/app/src/main/res/drawable/undo_24px.xml new file mode 100644 index 0000000..a3f745b --- /dev/null +++ b/app/src/main/res/drawable/undo_24px.xml @@ -0,0 +1,11 @@ + + + diff --git a/app/src/main/res/layout/activity_equalizer.xml b/app/src/main/res/layout/activity_equalizer.xml new file mode 100644 index 0000000..6f51acb --- /dev/null +++ b/app/src/main/res/layout/activity_equalizer.xml @@ -0,0 +1,308 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index cc07d5e..7d5b74d 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -6,9 +6,7 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - + app:menu="@menu/home_drawer_menu" + app:itemTextAppearanceActiveBoldEnabled="false" /> diff --git a/app/src/main/res/layout/activity_settings2.xml b/app/src/main/res/layout/activity_settings2.xml index c4a2769..98587cc 100644 --- a/app/src/main/res/layout/activity_settings2.xml +++ b/app/src/main/res/layout/activity_settings2.xml @@ -302,7 +302,7 @@ android:id="@+id/ln_x11" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginBottom="2dp" + android:layout_marginBottom="18dp" android:background="@drawable/object_shape_bottom_high" android:padding="16dp" android:gravity="center_vertical"> @@ -334,6 +334,43 @@ android:textSize="14sp" /> + + + + + + + + + + + + diff --git a/app/src/main/res/menu/equalizer_menu.xml b/app/src/main/res/menu/equalizer_menu.xml new file mode 100644 index 0000000..00f3199 --- /dev/null +++ b/app/src/main/res/menu/equalizer_menu.xml @@ -0,0 +1,13 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index 5365e25..a9818ac 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -770,6 +770,17 @@ Hiệu ứng mờ Làm mờ xung quanh để tăng khả năng tập trung vào một vùng cần được chú ý. Bạn cần khởi động lại ứng dụng khi chuyển đổi giữa tích hợp sẵn và ngoài. + Bộ chỉnh âm + Bổng, trung và trầm. + Bạn có thể cần khởi động lại máy ảo để áp dụng các thay đổi. Hiệu ứng âm thanh có thể chỉ có tác dụng nếu bạn sử dụng các phụ kiện như tai nghe. + Dùng bộ chỉnh âm + Bổng cao + Bổng + Trung + Trầm + Trầm sâu + Thiết bị của bạn không được hỗ trợ. + Hoàn tác diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1bf76eb..f8956c3 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -629,6 +629,17 @@ Automatically switches when the mouse is connected and disconnected. The necessary packages have been installed. An error occurred while creating the virtual drive. + Equalizer + Treble, mid and bass. + You may need to restart the virtual machine for the changes to take effect. Sound effects may be affected if you use accessories such as headphones. + Use equalizer + Upper treble + Treble + Mid + Bass + Low bass + Your device is not supported. + Undo diff --git a/web/data/UpdateConfig.json b/web/data/UpdateConfig.json index 63d593c..b814b06 100644 --- a/web/data/UpdateConfig.json +++ b/web/data/UpdateConfig.json @@ -5,11 +5,11 @@ "url": "https://github.com/xoureldeen/Vectras-VM-Android/releases", "Message": "

4.3.0

\nBugs fixed.", "cancellable": true, - "versionCodeBeta":"136", - "versionNameBeta":"4.3.2", - "versionNameBetas":"4.0.1,4.0.2,4.0.3,4.0.4,4.0.5,4.0.6,4.0.7,4.0.8,4.0.9,4.1.1,4.1.2,4.1.3,4.1.4,4.1.5,4.1.6,4.1.7,4.1.8,4.1.9,4.2.1,4.2.2,4.2.3,4.2.4,4.2.5,4.2.6,4.2.7,4.2.8,4.2.9,4.3.0,4.3.1,4.3.2", + "versionCodeBeta":"137", + "versionNameBeta":"4.3.3", + "versionNameBetas":"4.0.1,4.0.2,4.0.3,4.0.4,4.0.5,4.0.6,4.0.7,4.0.8,4.0.9,4.1.1,4.1.2,4.1.3,4.1.4,4.1.5,4.1.6,4.1.7,4.1.8,4.1.9,4.2.1,4.2.2,4.2.3,4.2.4,4.2.5,4.2.6,4.2.7,4.2.8,4.2.9,4.3.0,4.3.1,4.3.2,4.3.3", "sizeBeta": "45 MB", "urlBeta": "https://github.com/AnBui2004/Vectras-VM-Emu-Android/releases", - "MessageBeta": "

4.3.2

Bugs fixed.", + "MessageBeta": "

4.3.3

Bugs fixed.", "cancellableBeta": true } From 96366e060a25cbd006ff2c11fefa41c4b7845cc8 Mon Sep 17 00:00:00 2001 From: An Bui <91354810+AnBui2004@users.noreply.github.com> Date: Fri, 10 Jul 2026 20:14:17 +0700 Subject: [PATCH 10/18] Update vroms-store.json --- web/data/vroms-store.json | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/web/data/vroms-store.json b/web/data/vroms-store.json index a5ef1ad..907905f 100644 --- a/web/data/vroms-store.json +++ b/web/data/vroms-store.json @@ -674,6 +674,26 @@ "vecid": "macosxleopardcvbi", "id": "" }, + { + "rom_name": "macOS High Sierra", + "rom_icon": "https://static.wikia.nocookie.net/ipod/images/e/ec/MacOSHighSierraCircle.png/revision/latest/thumbnail/width/360/height/450?cb=20241004222256", + "rom_url": "https://youtu.be/ZvMxdVennwU", + "rom_path": "macOS High Sierra.cvbi", + "rom_avail": true, + "gui": true, + "rom_size": "10.13", + "rom_arch": "X86_64", + "rom_kernel": "apple", + "rom_extra": "", + "final_rom_file_name": "", + "desc": "This Rom is from Nguyen Bao An Bui. You can get it on An Bui app: https://play.google.com/store/apps/details?id=com.anbui.app\n\nmacOS High Sierra (version 10.13) is the fourteenth major release of macOS, Apple's desktop operating system for Macintosh computers. macOS High Sierra was announced at the WWDC 2017 on June 5, 2017 and was released on September 25, 2017. The name \"High Sierra\" refers to the High Sierra region in California. Its name signified its goal to be a refinement of the previous macOS version, macOS Sierra, focused on performance improvements and technical updates rather than features. This makes it similar to previous macOS releases Snow Leopard, Mavericks and El Capitan. Among the apps with notable changes are Photos and Safari.", + "file_size": "16 GB", + "containsAds": true, + "creator": "Nguyen Bao An Bui", + "verified": true, + "vecid": "macoshighsierracvbi", + "id": "99624" + }, { "rom_name": "macOS Mojave", "rom_icon": "https://cdsassets.apple.com/live/SZLF0YNV/images/sp/111930_mojave-roundel-240.png", From dbe1c700f03a44e38613c0a667b4684b2e31884b Mon Sep 17 00:00:00 2001 From: An Bui <91354810+AnBui2004@users.noreply.github.com> Date: Sat, 11 Jul 2026 21:17:06 +0700 Subject: [PATCH 11/18] 4.3.4 - Fixed the issue of sending incorrect characters that required Shift when using Send text in the built-in VNC display. - Added a built-in File picker. - Bugs fixed. --- app/build.gradle | 4 +- app/src/main/AndroidManifest.xml | 15 +- .../java/android/androidVNC/VncCanvas.java | 19 +- .../com/vectras/qemu/MainSettingsManager.java | 12 + .../com/vectras/qemu/MainVNCActivity.java | 3 +- .../vectras/vm/creator/VMCreatorActivity.java | 132 +++-- .../com/vectras/vm/file/FilePickerData.java | 9 + .../com/vectras/vm/file/FilePickerDialog.java | 469 ++++++++++++++++++ .../vectras/vm/file/FilePickerSettings.java | 47 ++ .../com/vectras/vm/main/MainActivity.java | 10 +- .../vm/manager/VmControllerDialog.java | 253 ++++++---- .../settings/FilePickerSettingsActivity.java | 65 +++ .../com/vectras/vm/settings/Minitools.java | 2 +- .../vm/settings/Settings2Activity.java | 1 + .../java/com/vectras/vm/store/RomInfo.java | 162 +++--- .../com/vectras/vm/utils/ClipboardUltils.java | 6 +- .../java/com/vectras/vterm/Terminal2.java | 3 +- app/src/main/res/drawable/android_24px.xml | 10 + .../res/drawable/arrow_upward_alt_24px.xml | 10 + app/src/main/res/drawable/code_24px.xml | 10 + app/src/main/res/drawable/database_24px.xml | 10 + .../main/res/drawable/description_24px.xml | 10 + app/src/main/res/drawable/draft_24px.xml | 11 + app/src/main/res/drawable/folder_zip_24px.xml | 10 + app/src/main/res/drawable/image_24px.xml | 10 + app/src/main/res/drawable/ios_24px.xml | 10 + app/src/main/res/drawable/key_24px.xml | 10 + app/src/main/res/drawable/movie_24px.xml | 10 + app/src/main/res/drawable/music_note_24px.xml | 10 + app/src/main/res/drawable/titlecase_24px.xml | 10 + app/src/main/res/drawable/tune_24px.xml | 10 + app/src/main/res/drawable/vectras_vm_24px.xml | 67 +++ app/src/main/res/drawable/wysiwyg_24px.xml | 11 + .../layout/activity_file_picker_settings.xml | 217 ++++++++ .../main/res/layout/activity_settings2.xml | 37 ++ .../main/res/layout/dialog_file_picker.xml | 202 ++++++++ app/src/main/res/layout/list_file.xml | 37 ++ app/src/main/res/values-vi/strings.xml | 12 + app/src/main/res/values/strings.xml | 12 + 39 files changed, 1715 insertions(+), 233 deletions(-) create mode 100644 app/src/main/java/com/vectras/vm/file/FilePickerData.java create mode 100644 app/src/main/java/com/vectras/vm/file/FilePickerDialog.java create mode 100644 app/src/main/java/com/vectras/vm/file/FilePickerSettings.java create mode 100644 app/src/main/java/com/vectras/vm/settings/FilePickerSettingsActivity.java create mode 100644 app/src/main/res/drawable/android_24px.xml create mode 100644 app/src/main/res/drawable/arrow_upward_alt_24px.xml create mode 100644 app/src/main/res/drawable/code_24px.xml create mode 100644 app/src/main/res/drawable/database_24px.xml create mode 100644 app/src/main/res/drawable/description_24px.xml create mode 100644 app/src/main/res/drawable/draft_24px.xml create mode 100644 app/src/main/res/drawable/folder_zip_24px.xml create mode 100644 app/src/main/res/drawable/image_24px.xml create mode 100644 app/src/main/res/drawable/ios_24px.xml create mode 100644 app/src/main/res/drawable/key_24px.xml create mode 100644 app/src/main/res/drawable/movie_24px.xml create mode 100644 app/src/main/res/drawable/music_note_24px.xml create mode 100644 app/src/main/res/drawable/titlecase_24px.xml create mode 100644 app/src/main/res/drawable/tune_24px.xml create mode 100644 app/src/main/res/drawable/vectras_vm_24px.xml create mode 100644 app/src/main/res/drawable/wysiwyg_24px.xml create mode 100644 app/src/main/res/layout/activity_file_picker_settings.xml create mode 100644 app/src/main/res/layout/dialog_file_picker.xml create mode 100644 app/src/main/res/layout/list_file.xml diff --git a/app/build.gradle b/app/build.gradle index 4a074e8..f5d72cf 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -12,8 +12,8 @@ android { applicationId "com.vectras.vm" minSdk minApi targetSdk targetApi - versionCode 137 - versionName "4.3.3" + versionCode 138 + versionName "4.3.4" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" multiDexEnabled true diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7c09edb..40938ae 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -47,6 +47,16 @@ android:requestLegacyExternalStorage="true" android:supportsRtl="true" android:theme="@style/AppTheme"> + + - - \ No newline at end of file diff --git a/app/src/main/java/android/androidVNC/VncCanvas.java b/app/src/main/java/android/androidVNC/VncCanvas.java index 1301006..f04971c 100644 --- a/app/src/main/java/android/androidVNC/VncCanvas.java +++ b/app/src/main/java/android/androidVNC/VncCanvas.java @@ -1331,11 +1331,13 @@ public class VncCanvas extends AppCompatImageView { } + private static final String SHIFT_CHARS = "~!@#$%^&*()_+{}|:\"<>?"; + private static final int LEFT_SHIFT_KEY_CODE = 0xFFE1; + public void sendText(String s) { int l = s.length(); for (int i = 0; i < l; i++) { char c = s.charAt(i); - int meta = 0; int keysym = c; if (Character.isISOControl(c)) { if (c == '\n') { @@ -1344,9 +1346,20 @@ public class VncCanvas extends AppCompatImageView { continue; } } + + boolean isNeedShift = Character.isUpperCase(c) || SHIFT_CHARS.indexOf(c) >= 0; + try { - rfb.writeKeyEvent(keysym, meta, true); - rfb.writeKeyEvent(keysym, meta, false); + if (isNeedShift) { + rfb.writeKeyEvent(LEFT_SHIFT_KEY_CODE, 0, true); + } + + rfb.writeKeyEvent(keysym, 0, true); + rfb.writeKeyEvent(keysym, 0, false); + + if (isNeedShift) { + rfb.writeKeyEvent(LEFT_SHIFT_KEY_CODE, 0, false); + } } catch (IOException ioe) { Log.e(TAG, "sendText: ",ioe); } diff --git a/app/src/main/java/com/vectras/qemu/MainSettingsManager.java b/app/src/main/java/com/vectras/qemu/MainSettingsManager.java index 59d51bc..932e78e 100644 --- a/app/src/main/java/com/vectras/qemu/MainSettingsManager.java +++ b/app/src/main/java/com/vectras/qemu/MainSettingsManager.java @@ -1343,4 +1343,16 @@ public class MainSettingsManager extends AppCompatActivity SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); return prefs.getBoolean("autoSwitchToExternalMouse", false); } + + public static void setBuiltInFilePicker(Context context, Boolean _boolean) { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + SharedPreferences.Editor edit = prefs.edit(); + edit.putBoolean("builtInFilePicker", _boolean); + edit.apply(); + } + + public static Boolean getBuiltInFilePicker(Context context) { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + return prefs.getBoolean("builtInFilePicker", false); + } } diff --git a/app/src/main/java/com/vectras/qemu/MainVNCActivity.java b/app/src/main/java/com/vectras/qemu/MainVNCActivity.java index 617ea55..61c2571 100644 --- a/app/src/main/java/com/vectras/qemu/MainVNCActivity.java +++ b/app/src/main/java/com/vectras/qemu/MainVNCActivity.java @@ -1479,8 +1479,9 @@ public class MainVNCActivity extends VncCanvasActivity { }); bindingSendKey.sendtextButton.setOnClickListener(v -> { - vncCanvas.sendText(bindingSendKey.sendtextEdittext.getText().toString()); + String text = bindingSendKey.sendtextEdittext.getText().toString(); bindingSendKey.sendtextEdittext.setText(""); + new Thread(() -> vncCanvas.sendText(text)).start(); }); bindingSendKey.sendtextEdittext.addTextChangedListener(new TextWatcher() { diff --git a/app/src/main/java/com/vectras/vm/creator/VMCreatorActivity.java b/app/src/main/java/com/vectras/vm/creator/VMCreatorActivity.java index c947f18..22ce9da 100644 --- a/app/src/main/java/com/vectras/vm/creator/VMCreatorActivity.java +++ b/app/src/main/java/com/vectras/vm/creator/VMCreatorActivity.java @@ -32,6 +32,7 @@ import com.vectras.qemu.MainSettingsManager; import com.vectras.vm.AppConfig; import com.vectras.vm.Fragment.CreateImageDialogFragment; import com.vectras.vm.R; +import com.vectras.vm.file.FilePickerDialog; import com.vectras.vm.store.RomInfo; import com.vectras.vm.SplashActivity; import com.vectras.vm.VMManager; @@ -103,13 +104,25 @@ public class VMCreatorActivity extends AppCompatActivity { return true; } else if (id == R.id.add_file) { try { - filePicker.launch("*/*"); + if (MainSettingsManager.getBuiltInFilePicker(this)) { + FilePickerDialog filePickerDialog = new FilePickerDialog(); + filePickerDialog.pick(this, filePickerDialog.TYPE_FILE, (path -> handleAddFile(Uri.fromFile(new File (path))))); + } else { + filePicker.launch("*/*"); + } } catch (Exception e) { IntentUtils.showErrorDialog(this); } return true; } else if (id == R.id.show_in_folder) { - FileUtils.openFolder(this, VmFileManager.getPath(vmID)); + if (MainSettingsManager.getBuiltInFilePicker(this)) { + FilePickerDialog filePickerDialog = new FilePickerDialog(); + filePickerDialog.setHomeName(current.itemName); + filePickerDialog.setLockHome(true); + filePickerDialog.browse(this, VmFileManager.getPath(vmID)); + } else { + FileUtils.openFolder(this, VmFileManager.getPath(vmID)); + } return true; } else { return super.onOptionsItemSelected(item); @@ -305,7 +318,12 @@ public class VMCreatorActivity extends AppCompatActivity { } else if (getIntent().hasExtra("importcvbinow")) { setDefault(); try { - cvbiPicker.launch("*/*"); + if (MainSettingsManager.getBuiltInFilePicker(this)) { + FilePickerDialog filePickerDialog = new FilePickerDialog(); + filePickerDialog.pick(this, filePickerDialog.ROM_FILE, (path -> importRom(null, path, new File(path).getName()))); + } else { + cvbiPicker.launch("*/*"); + } } catch (Exception e) { IntentUtils.showErrorDialog(this); } @@ -505,44 +523,46 @@ public class VMCreatorActivity extends AppCompatActivity { @SuppressLint("SetTextI18n") private final ActivityResultLauncher filePicker = - registerForActivityResult(new ActivityResultContracts.GetContent(), uri -> { - if (uri == null) return; - showProgressDialog(getString(R.string.copying_file)); + registerForActivityResult(new ActivityResultContracts.GetContent(), this::handleAddFile); - executor.execute(() -> { - try { - isProcessingFile = true; + public void handleAddFile(Uri uri) { + if (uri == null) return; + showProgressDialog(getString(R.string.copying_file)); - String filePath = copyToTemp(uri); + executor.execute(() -> { + try { + isProcessingFile = true; - runOnUiThread(() -> DialogUtils.twoDialog(this, - getString(R.string.file_added), - filePath, - getString(R.string.copy_full_path), - getString(R.string.close), - true, - R.drawable.check_24px, - true, - () -> ClipboardUltils.copyToClipboard(this, filePath), - null, - null)); - } catch (Exception e) { - runOnUiThread(() -> DialogUtils.oneDialog(this, - getString(R.string.oops), - getString(R.string.adding_file_failed_content), - getString(R.string.ok), - true, - R.drawable.error_96px, - true, - null, - null)); - Log.e(TAG, "filePicker: " + e.getMessage()); - } finally { - isProcessingFile = false; - runOnUiThread(() -> DialogUtils.safeDismiss(this, progressDialog)); - } - }); - }); + String filePath = copyToTemp(uri); + + runOnUiThread(() -> DialogUtils.twoDialog(this, + getString(R.string.file_added), + filePath, + getString(R.string.copy_full_path), + getString(R.string.close), + true, + R.drawable.check_24px, + true, + () -> ClipboardUltils.copyToClipboard(this, filePath), + null, + null)); + } catch (Exception e) { + runOnUiThread(() -> DialogUtils.oneDialog(this, + getString(R.string.oops), + getString(R.string.adding_file_failed_content), + getString(R.string.ok), + true, + R.drawable.error_96px, + true, + null, + null)); + Log.e(TAG, "filePicker: " + e.getMessage()); + } finally { + isProcessingFile = false; + runOnUiThread(() -> DialogUtils.safeDismiss(this, progressDialog)); + } + }); + } private void loadConfig(DataMainRoms vmConfig) { if (vmConfig != null) current = vmConfig; @@ -1295,13 +1315,26 @@ public class VMCreatorActivity extends AppCompatActivity { try { if (PENDING_SELECT_FILE_MODE == SELECT_CDROM_0_FILE_MODE || PENDING_SELECT_FILE_MODE == SELECT_CDROM_1_FILE_MODE) { - isoPicker.launch("*/*"); + if (MainSettingsManager.getBuiltInFilePicker(this)) { + builtInFilePicker(PICK_OPTICAL_FILE_MODE); + } else { + isoPicker.launch("*/*"); + } } else if (PENDING_SELECT_FILE_MODE == SELECT_FLOPPY_A_FILE_MODE || PENDING_SELECT_FILE_MODE == SELECT_FLOPPY_B_FILE_MODE) { + if (MainSettingsManager.getBuiltInFilePicker(this)) { + builtInFilePicker(PICK_FLOPPY_FILE_MODE); + } else { floppyPicker.launch("*/*"); + } } else { - diskPicker.launch("*/*"); + if (MainSettingsManager.getBuiltInFilePicker(this)) { + builtInFilePicker(PICK_DRIVE_FILE_MODE); + } else { + diskPicker.launch("*/*"); + } } } catch (Exception e) { + Log.e(TAG, "pickStorageFile: ", e); IntentUtils.showErrorDialog(this); } } @@ -1475,4 +1508,23 @@ public class VMCreatorActivity extends AppCompatActivity { }); } } + + final int PICK_DRIVE_FILE_MODE = 0; + final int PICK_OPTICAL_FILE_MODE = 1; + final int PICK_FLOPPY_FILE_MODE = 2; + + private void builtInFilePicker(int mode) { + FilePickerDialog filePickerDialog = new FilePickerDialog(); + + int finalMode; + if (mode == PICK_DRIVE_FILE_MODE) { + finalMode = filePickerDialog.FIT_PICK_DISK_FILE_MODE; + } else if (mode == PICK_OPTICAL_FILE_MODE) { + finalMode = filePickerDialog.FIT_PICK_OPTICAL_FILE_MODE; + } else { + finalMode = filePickerDialog.FIT_PICK_FLOPPY_FILE_MODE; + } + + filePickerDialog.pick(this, finalMode, (path -> handleFile(Uri.fromFile(new File(path))))); + } } diff --git a/app/src/main/java/com/vectras/vm/file/FilePickerData.java b/app/src/main/java/com/vectras/vm/file/FilePickerData.java new file mode 100644 index 0000000..7a732cb --- /dev/null +++ b/app/src/main/java/com/vectras/vm/file/FilePickerData.java @@ -0,0 +1,9 @@ +package com.vectras.vm.file; + +public class FilePickerData { + String name = ""; + String path = ""; + int type = -1; + int icon = -1; + boolean enabled = true; +} diff --git a/app/src/main/java/com/vectras/vm/file/FilePickerDialog.java b/app/src/main/java/com/vectras/vm/file/FilePickerDialog.java new file mode 100644 index 0000000..7ed3ab7 --- /dev/null +++ b/app/src/main/java/com/vectras/vm/file/FilePickerDialog.java @@ -0,0 +1,469 @@ +package com.vectras.vm.file; + +import android.app.Activity; +import android.app.Dialog; +import android.content.Intent; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.os.Environment; +import android.os.Handler; +import android.os.Looper; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.webkit.MimeTypeMap; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.appcompat.app.AlertDialog; +import androidx.core.content.FileProvider; +import androidx.fragment.app.DialogFragment; +import androidx.fragment.app.FragmentActivity; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.vectras.vm.R; +import com.vectras.vm.databinding.DialogFilePickerBinding; +import com.vectras.vm.databinding.ListFileBinding; +import com.vectras.vm.manager.FormatManager; +import com.vectras.vm.utils.ClipboardUltils; +import com.vectras.vm.utils.FileUtils; +import com.vectras.vm.utils.IntentUtils; + +import java.io.File; +import java.util.ArrayList; +import java.util.Collections; + +public class FilePickerDialog extends DialogFragment { + + DialogFilePickerBinding binding; + LinearLayoutManager layoutmanager; + RecyclerviewAdapter adapter; + FilePickerDialogCallback callback; + FilePickerSettings settings; + + String currentPath = ""; + String homeName; + String homePath; + boolean lockHome; + int pickType = -1; + + boolean isShowHiddenFile; + boolean isShowHiddenDiviers; + + boolean fixTextColor; + + int textColor; + + @NonNull + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + binding = DialogFilePickerBinding.inflate(getLayoutInflater()); + + settings = new FilePickerSettings(requireActivity()); + + isShowHiddenFile = settings.showHiddenFiles(); + isShowHiddenDiviers = settings.divider(); + + if (fixTextColor) { + textColor = binding.tvTitle.getCurrentTextColor(); + binding.tvFullPath.setTextColor(textColor); + binding.tvNothingHere.setTextColor(textColor); + } + + AlertDialog dialog = new AlertDialog.Builder(requireActivity()).create(); + dialog.setView(binding.getRoot()); + + layoutmanager = new LinearLayoutManager(requireActivity()); + adapter = new RecyclerviewAdapter(requireActivity(), dialog, new ArrayList<>(), callback); + binding.list.setAdapter(adapter); + binding.list.setLayoutManager(layoutmanager); + + binding.list.addOnScrollListener(new RecyclerView.OnScrollListener() { + @Override + public void onScrolled(@NonNull RecyclerView rv, int dx, int dy) { + boolean canScrollUp = rv.canScrollVertically(-1); + boolean canScrollDown = rv.canScrollVertically(1); + + binding.dvTop.setVisibility(canScrollUp ? View.VISIBLE : View.INVISIBLE); + binding.dvBottom.setVisibility(canScrollDown ? View.VISIBLE : View.INVISIBLE); + } + }); + + String lastPath = new File(settings.lastPath()).exists() ? settings.lastPath() : Environment.getExternalStorageDirectory().getAbsolutePath(); + + adapter.load((homePath != null && new File(homePath).exists()) ? homePath : lastPath); + + binding.btnHome.setOnClickListener(v -> adapter.load(homePath != null && new File(homePath).exists() ? homePath : Environment.getExternalStorageDirectory().getAbsolutePath())); + binding.btnUp.setOnClickListener(v -> adapter.load(new File(currentPath).getParent())); + + if (pickType == BROWSE_MODE) { + binding.btnOpenInOtherApp.setOnClickListener(v -> { + if (!isAdded()) return; + FileUtils.openFolder(requireContext(), currentPath); + dismiss(); + }); + } else { + binding.btnOpenInOtherApp.setVisibility(View.GONE); + } + binding.tvFullPath.setOnClickListener(v -> { + if (!isAdded()) return; + ClipboardUltils.copyToClipboard(requireContext(), currentPath, false); + Toast.makeText(requireContext(), R.string.the_folder_path_has_been_copied_to_the_clipboard, Toast.LENGTH_SHORT).show(); + }); + binding.btnClose.setOnClickListener(v -> dismiss()); + + return dialog; + } + + public void setFixTextColor(boolean isEnable) { + fixTextColor = isEnable; + } + + public void setHomeName(String name) { + homeName = name; + } + + public void setHomePath(String path) { + homePath = new File(path).getAbsolutePath(); + } + + public void setLockHome(boolean lock) { + lockHome = lock; + } + + public void browse(Activity activity) { + pickType = BROWSE_MODE; + show(((FragmentActivity) activity).getSupportFragmentManager(), "file_picker"); + } + + public void browse(Activity activity, String path) { + setHomePath(path); + browse(activity); + } + + public void pick(Activity activity, int type, FilePickerDialogCallback callback) { + this.callback = callback; + pickType = type; + show(((FragmentActivity) activity).getSupportFragmentManager(), "file_picker"); + } + + public void updateUpButton(String path) { + if (path.equals(Environment.getExternalStorageDirectory().getAbsolutePath())) { + binding.tvTitle.setText(R.string.internal_storage); + binding.btnHome.setVisibility(View.GONE); + binding.btnUp.setVisibility(View.INVISIBLE); + binding.btnUp.setEnabled(false); + } else if (lockHome && homePath.equals(path)) { + binding.tvTitle.setText(homeName.isEmpty() ? new File(path).getName() : homeName); + binding.btnHome.setVisibility(View.GONE); + binding.btnUp.setVisibility(View.INVISIBLE); + binding.btnUp.setEnabled(false); + } else { + binding.tvTitle.setText(new File(path).getName()); + binding.btnHome.setVisibility(View.VISIBLE); + binding.btnUp.setVisibility(View.VISIBLE); + binding.btnUp.setEnabled(true); + } + + binding.tvFullPath.setText(path); + } + + boolean isLoading; + + private ArrayList loadFileList(String path) { + currentPath = path; + + new Handler(Looper.getMainLooper()).post(() -> updateUpButton(path)); + + ArrayList list = new ArrayList<>(); + + File dir = new File(path); + if (!dir.exists() || dir.isFile()) return list; + + File[] listFiles = dir.listFiles(); + if (listFiles == null || listFiles.length == 0) return list; + + list.clear(); + for (File file : listFiles) { + if (!isShowHiddenFile && file.getName().startsWith(".")) continue; + + FilePickerData item = new FilePickerData(); + + item.name = file.getName(); + item.path = file.getAbsolutePath(); + item.type = file.isDirectory() ? TYPE_FOLDER : getType(file.getName()); + item.icon = getIcon(item.type); + item.enabled = pickType == TYPE_FILE || pickType == BROWSE_MODE || item.type == TYPE_FOLDER || (pickType >= FIT_PICK_DISK_FILE_MODE ? checkFitPickFileMode(item.name) : item.type == pickType); + list.add(item); + } + + Collections.sort(list, (o1, o2) -> { + if (o1.name == null || o2.name == null) { + return 0; + } + return o1.name.compareToIgnoreCase(o2.name); + }); + + return list; + } + + public static final int BROWSE_MODE = -1; + public static final int TYPE_FILE = 0; + public static final int TYPE_FOLDER = 1; + public static final int AUDIO_FILE = 2; + public static final int VIDEO_FILE = 3; + public static final int IMAGE_FILE = 4; + public static final int DOCUMENT_FILE = 5; + public static final int APPLICATION_FILE = 6; + public static final int DISK_FILE = 7; + public static final int ISO_FILE = 8; + public static final int FLOPPY_FILE = 9; + public static final int ROM_FILE = 10; + public static final int SHELL_FILE = 11; + public static final int DB_FILE = 12; + public static final int LOG_FILE = 13; + public static final int WINDOWS_FILE = 14; + public static final int CONFIG_FILE = 15; + public static final int ZIP_FILE = 16; + public static final int DEV_FILE = 17; + public static final int SYSTEM_FILE = 18; + public static final int PACKAGE_FILE = 19; + public static final int FONT_FILE = 20; + public static final int KEY_FILE = 21; + public static final int IOS_FILE = 22; + + private int getType(String fileName) { + if (!fileName.contains(".")) return TYPE_FILE; + + String extension = fileName.substring(fileName.lastIndexOf(".")).toLowerCase(); + return switch (extension) { + case ".mp3", ".wav", ".ogg", ".flac", ".m4a", ".aif", ".wma", ".smi" -> AUDIO_FILE; + case ".mp4", ".webm", ".mov", ".mkv", ".avi", ".wmv" -> VIDEO_FILE; + case ".jpg", ".jpeg", ".png", ".gif", ".webp", ".raw" -> IMAGE_FILE; + case ".pdf", ".txt", ".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx", ".md", ".csv" -> DOCUMENT_FILE; + case ".apk", ".xapk", ".apkm", ".apks" -> APPLICATION_FILE; + case ".img", ".qcow2", ".vhd", ".vhdx", ".vdi", ".qcow", ".vmdk", ".vpc" -> DISK_FILE; + case ".iso", ".cdr", ".toast" -> ISO_FILE; + case ".flp", ".ima" -> FLOPPY_FILE; + case ".cvbi" -> ROM_FILE; + case ".sh", ".cmd", ".bat", ".ps1" -> SHELL_FILE; + case ".json", ".db", ".sqlite", ".sqlite3", ".dbf", ".accdb", ".mdf", ".ldf", ".ibd", ".frm", ".parquet", ".orc", ".kdbx" -> DB_FILE; + case ".log" -> LOG_FILE; + case ".exe", ".msi", ".msix", ".appx", ".msixbundle" -> WINDOWS_FILE; + case ".conf", ".ini" -> CONFIG_FILE; + case ".zip", ".7z", ".rar" -> ZIP_FILE; + case ".java", ".kt", ".js", ".py", ".c", ".cpp", ".h", ".xml", ".html", ".css", ".lua", ".go", ".asl" -> DEV_FILE; + case ".dll" -> SYSTEM_FILE; + case ".deb", ".rpm" -> PACKAGE_FILE; + case ".ttf", ".otf" -> FONT_FILE; + case ".jks" -> KEY_FILE; + case ".ipa", ".ipsw" -> IOS_FILE; + default -> TYPE_FILE; + }; + } + + private int getIcon(int type) { + return switch (type) { + case TYPE_FOLDER -> R.drawable.folder_24px; + case AUDIO_FILE -> R.drawable.music_note_24px; + case VIDEO_FILE -> R.drawable.movie_24px; + case IMAGE_FILE -> R.drawable.image_24px; + case DOCUMENT_FILE -> R.drawable.description_24px; + case APPLICATION_FILE -> R.drawable.android_24px; + case DISK_FILE -> R.drawable.hard_drive_24px; + case ISO_FILE -> R.drawable.album_24px; + case ROM_FILE -> R.drawable.vectras_vm_24px; + case SHELL_FILE -> R.drawable.terminal_24px; + case DB_FILE -> R.drawable.database_24px; + case LOG_FILE -> R.drawable.monitor_heart_24px; + case WINDOWS_FILE -> R.drawable.wysiwyg_24px; + case CONFIG_FILE -> R.drawable.tune_24px; + case ZIP_FILE -> R.drawable.folder_zip_24px; + case DEV_FILE -> R.drawable.code_24px; + case SYSTEM_FILE -> R.drawable.settings_24px; + case PACKAGE_FILE -> R.drawable.package_24px; + case FONT_FILE -> R.drawable.titlecase_24px; + case KEY_FILE -> R.drawable.key_24px; + case IOS_FILE -> R.drawable.ios_24px; + default -> R.drawable.draft_24px; + }; + } + + public static final int FIT_PICK_DISK_FILE_MODE = 20; + public static final int FIT_PICK_OPTICAL_FILE_MODE = 21; + public static final int FIT_PICK_FLOPPY_FILE_MODE = 22; + + public boolean checkFitPickFileMode(String fileName) { + if (pickType == FIT_PICK_DISK_FILE_MODE) { + return FormatManager.isHardDriveFileFormat(fileName); + } else if (pickType == FIT_PICK_OPTICAL_FILE_MODE) { + return FormatManager.isOpticalFileFormat(fileName); + } else if (pickType == FIT_PICK_FLOPPY_FILE_MODE) { + return FormatManager.isFloppyFileFormat(fileName); + } else { + return false; + } + } + + public interface FilePickerDialogCallback { + void onPicked(String path); + } + + private class RecyclerviewAdapter extends RecyclerView.Adapter { + + Activity activity; + ArrayList data; + AlertDialog dialog; + FilePickerDialogCallback callback; + + public RecyclerviewAdapter(Activity activity, AlertDialog alertDialog, ArrayList arr, FilePickerDialogCallback callback) { + this.activity = activity; + data = arr; + dialog = alertDialog; + this.callback = callback; + } + + @NonNull + @Override + public RecyclerviewAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + LayoutInflater inflater = activity.getLayoutInflater(); + ListFileBinding binding1 = ListFileBinding.inflate(inflater, parent, false); + return new RecyclerviewAdapter.ViewHolder(binding1.getRoot()); + } + + @Override + public void onBindViewHolder(RecyclerviewAdapter.ViewHolder holder, final int position) { + View view = holder.itemView; + TextView text = view.findViewById(R.id.text); + ImageView icon = view.findViewById(R.id.icon); + text.setText(data.get(position).name); + icon.setImageResource(data.get(position).icon); + + if (fixTextColor) text.setTextColor(textColor); + + LinearLayout main = view.findViewById(R.id.main); + + if (data.get(position).enabled) { + main.setEnabled(true); + main.setAlpha(1f); + main.setOnClickListener(v -> { + if (data.get(position).type == TYPE_FOLDER) { + load(data.get(position).path); + } else { + if (activity.isFinishing() || activity.isDestroyed()) return; + if (pickType == BROWSE_MODE) { + openFile(data.get(position).path); + } else { + if (callback != null) callback.onPicked(data.get(position).path); + + settings.lastPath(currentPath); + dialog.dismiss(); + } + } + }); + } else { + main.setAlpha(0.5f); + main.setOnClickListener(null); + main.setEnabled(false); + } + + if (!isShowHiddenDiviers || position == data.size() - 1) { + view.findViewById(R.id.md_inset_bottom).setVisibility(View.GONE); + } else { + view.findViewById(R.id.md_inset_bottom).setVisibility(View.VISIBLE); + } + } + + @Override + public int getItemCount() { + return data.size(); + } + + public void load(String path) { + isLoading = true; + + new Handler(Looper.getMainLooper()).postDelayed(() -> { + if (isAdded() && isLoading) binding.lnLoading.setVisibility(View.VISIBLE); + }, 200); + + new Thread(() -> { + ArrayList data1 = loadFileList(path); + new Handler(Looper.getMainLooper()).post(() -> { + if (!isAdded()) return; + + if (data1.isEmpty()) { + binding.lnEmpty.setVisibility(View.VISIBLE); + binding.lnBrowse.setVisibility(View.INVISIBLE); + } else { + binding.lnEmpty.setVisibility(View.INVISIBLE); + binding.lnBrowse.setVisibility(View.VISIBLE); + data.clear(); + data.addAll(data1); + notifyDataSetChanged(); + } + + binding.lnLoading.setVisibility(View.GONE); + isLoading = false; + }); + }).start(); + } + + public static class ViewHolder extends RecyclerView.ViewHolder { + public ViewHolder(View v) { + super(v); + } + } + } + + public void openFile(String path) { + File file = new File(path); + + if (!file.exists()) { + if (!isAdded()) return; + IntentUtils.showErrorDialog(requireActivity()); + return; + } + + Intent intent = new Intent(Intent.ACTION_VIEW); + Uri fileUri; + + if (!isAdded()) return; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + String authority = requireActivity().getPackageName() + ".provider"; + fileUri = FileProvider.getUriForFile(requireContext(), authority, file); + } else { + fileUri = Uri.fromFile(file); + } + + + String extension = MimeTypeMap.getFileExtensionFromUrl(Uri.fromFile(file).toString()); + String mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension.toLowerCase()); + if (mimeType == null) { + mimeType = "*/*"; + } + + intent.setDataAndType(fileUri, mimeType); + + + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + + + Intent chooserIntent = Intent.createChooser(intent, getString(R.string.open_with)); + chooserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + + + if (!isAdded()) return; + if (intent.resolveActivity(requireActivity().getPackageManager()) != null) { + requireContext().startActivity(chooserIntent); + } else { + IntentUtils.showErrorDialog(requireActivity()); + } + } +} diff --git a/app/src/main/java/com/vectras/vm/file/FilePickerSettings.java b/app/src/main/java/com/vectras/vm/file/FilePickerSettings.java new file mode 100644 index 0000000..0cfc573 --- /dev/null +++ b/app/src/main/java/com/vectras/vm/file/FilePickerSettings.java @@ -0,0 +1,47 @@ +package com.vectras.vm.file; + +import android.content.Context; +import android.content.SharedPreferences; +import android.os.Environment; + +public class FilePickerSettings { + Context context; + SharedPreferences sharedPreferences; + + public FilePickerSettings(Context context) { + this.context = context; + sharedPreferences = context.getSharedPreferences("built_in_file_picker_settings", Context.MODE_PRIVATE); + } + + public void lastPath(String path) { + sharedPreferences.edit().putString("lastPath", path).apply(); + } + + public String lastPath() { + return sharedPreferences.getString("lastPath", Environment.getExternalStorageDirectory().getAbsolutePath()); + } + + public void resume(boolean enabled) { + sharedPreferences.edit().putBoolean("resume", enabled).apply(); + } + + public boolean resume() { + return sharedPreferences.getBoolean("resume", true); + } + + public void showHiddenFiles(boolean enabled) { + sharedPreferences.edit().putBoolean("showHiddenFiles", enabled).apply(); + } + + public boolean showHiddenFiles() { + return sharedPreferences.getBoolean("showHiddenFiles", true); + } + + public void divider(boolean enabled) { + sharedPreferences.edit().putBoolean("divider", enabled).apply(); + } + + public boolean divider() { + return sharedPreferences.getBoolean("divider", false); + } +} diff --git a/app/src/main/java/com/vectras/vm/main/MainActivity.java b/app/src/main/java/com/vectras/vm/main/MainActivity.java index 54efe39..f099cb9 100644 --- a/app/src/main/java/com/vectras/vm/main/MainActivity.java +++ b/app/src/main/java/com/vectras/vm/main/MainActivity.java @@ -46,6 +46,7 @@ import com.vectras.qemu.MainSettingsManager; import com.vectras.vm.AboutActivity; import com.vectras.vm.AppConfig; import com.vectras.vm.creator.VMCreatorActivity; +import com.vectras.vm.file.FilePickerDialog; import com.vectras.vm.settings.Minitools; import com.vectras.vm.R; import com.vectras.vm.WebViewActivity; @@ -522,7 +523,14 @@ public class MainActivity extends AppCompatActivity implements RomStoreFragment. startActivity(new Intent(this, Settings2Activity.class)); } else if (id == R.id.navigation_data_explorer) { // startActivity(new Intent(this, DataExplorerActivity.class)); - FileUtils.openFolder(this, AppConfig.maindirpath); + if (MainSettingsManager.getBuiltInFilePicker(this)) { + FilePickerDialog filePickerDialog = new FilePickerDialog(); + filePickerDialog.setHomeName(getString(R.string.app_name)); + filePickerDialog.setLockHome(true); + filePickerDialog.browse(this, AppConfig.maindirpath); + } else { + FileUtils.openFolder(this, AppConfig.maindirpath); + } } else if (id == R.id.navigation_item_donate) { String tw = "https://www.patreon.com/VectrasTeam"; Intent w = new Intent(ACTION_VIEW); diff --git a/app/src/main/java/com/vectras/vm/manager/VmControllerDialog.java b/app/src/main/java/com/vectras/vm/manager/VmControllerDialog.java index b8b522d..affd2a9 100644 --- a/app/src/main/java/com/vectras/vm/manager/VmControllerDialog.java +++ b/app/src/main/java/com/vectras/vm/manager/VmControllerDialog.java @@ -5,6 +5,7 @@ import android.androidVNC.VncCanvas; import android.app.Dialog; import android.content.DialogInterface; import android.content.Intent; +import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.os.Looper; @@ -26,6 +27,7 @@ import com.vectras.vm.AppConfig; import com.vectras.vm.R; import com.vectras.vm.VMManager; import com.vectras.vm.databinding.DialogChangeRemovableDevicesBinding; +import com.vectras.vm.file.FilePickerDialog; import com.vectras.vm.main.core.DisplaySystem; import com.vectras.vm.main.vms.DataMainRoms; import com.vectras.vm.settings.VNCSettingsActivity; @@ -226,7 +228,16 @@ public class VmControllerDialog extends DialogFragment { if (isHavingOpticalDisc() || isHavingSecondaryOpticalDisc()) { if (isHavingOpticalDisc()) { - binding.lnCdrom.setOnClickListener(v -> isoPicker.launch("*/*")); + binding.lnCdrom.setOnClickListener(v -> { + if (MainSettingsManager.getBuiltInFilePicker(requireContext())) { + FilePickerDialog filePickerDialog = new FilePickerDialog(); + if (requireActivity() instanceof MainVNCActivity) filePickerDialog.setFixTextColor(true); + filePickerDialog.pick(requireActivity(), filePickerDialog.FIT_PICK_OPTICAL_FILE_MODE, (path -> handleIsoFile(Uri.fromFile(new File(path))))); + } else { + isoPicker.launch("*/*"); + } + + }); binding.ivEjectcdrom.setOnClickListener(v -> { QmpSender.ejectOpticalDisc(requireActivity(), infoBlock); @@ -240,7 +251,15 @@ public class VmControllerDialog extends DialogFragment { } if (isHavingSecondaryOpticalDisc()) { - binding.lnSecondaryCdrom.setOnClickListener(v -> isoPickerSecondary.launch("*/*")); + binding.lnSecondaryCdrom.setOnClickListener(v -> { + if (MainSettingsManager.getBuiltInFilePicker(requireContext())) { + FilePickerDialog filePickerDialog = new FilePickerDialog(); + if (requireActivity() instanceof MainVNCActivity) filePickerDialog.setFixTextColor(true); + filePickerDialog.pick(requireActivity(), filePickerDialog.FIT_PICK_OPTICAL_FILE_MODE, (path -> handleIsoFile2(Uri.fromFile(new File(path))))); + } else { + isoPickerSecondary.launch("*/*"); + } + }); binding.ivSecondaryEjectcdrom.setOnClickListener(v -> { QmpSender.ejectSecondaryOpticalDisc(requireActivity(), infoBlock); @@ -282,7 +301,15 @@ public class VmControllerDialog extends DialogFragment { } if (infoBlock.contains(QmpSender.DEFAULT_FLOPPY_DISK_0_ID)) { - binding.lnFda.setOnClickListener(v -> floppyAPicker.launch("*/*")); + binding.lnFda.setOnClickListener(v -> { + if (MainSettingsManager.getBuiltInFilePicker(requireContext())) { + FilePickerDialog filePickerDialog = new FilePickerDialog(); + if (requireActivity() instanceof MainVNCActivity) filePickerDialog.setFixTextColor(true); + filePickerDialog.pick(requireActivity(), filePickerDialog.FIT_PICK_FLOPPY_FILE_MODE, (path -> handleFloppyAFile(Uri.fromFile(new File(path))))); + } else { + floppyAPicker.launch("*/*"); + } + }); binding.ivEjectfda.setOnClickListener(v -> { QmpSender.ejectFloppyDiskA(requireActivity()); @@ -297,7 +324,15 @@ public class VmControllerDialog extends DialogFragment { } if (infoBlock.contains(QmpSender.DEFAULT_FLOPPY_DISK_1_ID)) { - binding.lnFdb.setOnClickListener(v -> floppyBPicker.launch("*/*")); + binding.lnFdb.setOnClickListener(v -> { + if (MainSettingsManager.getBuiltInFilePicker(requireContext())) { + FilePickerDialog filePickerDialog = new FilePickerDialog(); + if (requireActivity() instanceof MainVNCActivity) filePickerDialog.setFixTextColor(true); + filePickerDialog.pick(requireActivity(), filePickerDialog.FIT_PICK_FLOPPY_FILE_MODE, (path -> handleFloppyBFile(Uri.fromFile(new File(path))))); + } else { + floppyBPicker.launch("*/*"); + } + }); binding.ivEjectfdb.setOnClickListener(v -> { QmpSender.ejectFloppyDiskB(requireActivity()); @@ -312,7 +347,15 @@ public class VmControllerDialog extends DialogFragment { } if (infoBlock.contains(QmpSender.DEFAULT_MEMORY_CARD_ID)) { - binding.lnSd.setOnClickListener(v -> memoryCardPicker.launch("*/*")); + binding.lnSd.setOnClickListener(v -> { + if (MainSettingsManager.getBuiltInFilePicker(requireContext())) { + FilePickerDialog filePickerDialog = new FilePickerDialog(); + if (requireActivity() instanceof MainVNCActivity) filePickerDialog.setFixTextColor(true); + filePickerDialog.pick(requireActivity(), filePickerDialog.DISK_FILE, (path -> handleMemoryCardFile(Uri.fromFile(new File(path))))); + } else { + memoryCardPicker.launch("*/*"); + } + }); binding.ivEjectsd.setOnClickListener(v -> { QmpSender.ejectMemoryCard(requireActivity()); @@ -571,124 +614,134 @@ public class VmControllerDialog extends DialogFragment { } private final ActivityResultLauncher isoPicker = - registerForActivityResult(new ActivityResultContracts.GetContent(), uri -> { - if (uri != null) { - try { - new Thread(() -> { - String path = FileUtils.getPath(getContext(), uri); + registerForActivityResult(new ActivityResultContracts.GetContent(), this::handleIsoFile); - if (path == null) { - showErrorSelectedFileDialog(); - dismiss(); - return; - } + public void handleIsoFile(Uri uri) { + if (uri != null) { + try { + new Thread(() -> { + String path = FileUtils.getPath(getContext(), uri); - File selectedFilePath = new File(path); - - if (isAdded()) { - requireActivity().runOnUiThread(() -> { - QmpSender.changeOpticalDisc(requireActivity(), selectedFilePath.getAbsolutePath(), infoBlock); - dismiss(); - }); - } - }).start(); - } catch (Exception e) { + if (path == null) { showErrorSelectedFileDialog(); dismiss(); + return; } - } - }); + + File selectedFilePath = new File(path); + + if (isAdded()) { + requireActivity().runOnUiThread(() -> { + QmpSender.changeOpticalDisc(requireActivity(), selectedFilePath.getAbsolutePath(), infoBlock); + dismiss(); + }); + } + }).start(); + } catch (Exception e) { + showErrorSelectedFileDialog(); + dismiss(); + } + } + } private final ActivityResultLauncher isoPickerSecondary = - registerForActivityResult(new ActivityResultContracts.GetContent(), uri -> { - if (uri != null) { - try { - new Thread(() -> { - File selectedFilePath = new File(Objects.requireNonNull(FileUtils.getPath(getContext(), uri))); + registerForActivityResult(new ActivityResultContracts.GetContent(), this::handleIsoFile2); - if (isAdded()) { - requireActivity().runOnUiThread(() -> { - QmpSender.changeSecondaryOpticalDisc(requireActivity(), selectedFilePath.getAbsolutePath(), infoBlock); - dismiss(); - }); - } - }).start(); - } catch (Exception e) { - showErrorSelectedFileDialog(); - dismiss(); + public void handleIsoFile2(Uri uri) { + if (uri != null) { + try { + new Thread(() -> { + File selectedFilePath = new File(Objects.requireNonNull(FileUtils.getPath(getContext(), uri))); + + if (isAdded()) { + requireActivity().runOnUiThread(() -> { + QmpSender.changeSecondaryOpticalDisc(requireActivity(), selectedFilePath.getAbsolutePath(), infoBlock); + dismiss(); + }); } - } - }); + }).start(); + } catch (Exception e) { + showErrorSelectedFileDialog(); + dismiss(); + } + } + } private final ActivityResultLauncher floppyAPicker = - registerForActivityResult(new ActivityResultContracts.GetContent(), uri -> { - if (uri != null) { - try { - new Thread(() -> { - File selectedFilePath = new File(Objects.requireNonNull(FileUtils.getPath(getContext(), uri))); + registerForActivityResult(new ActivityResultContracts.GetContent(), this::handleFloppyAFile); - if (isAdded()) { - requireActivity().runOnUiThread(() -> { - QmpSender.changeFloppyDiskA(requireActivity(), selectedFilePath.getAbsolutePath()); - dismiss(); - }); - } - }).start(); - } catch (Exception e) { - showErrorSelectedFileDialog(); - dismiss(); + public void handleFloppyAFile(Uri uri) { + if (uri != null) { + try { + new Thread(() -> { + File selectedFilePath = new File(Objects.requireNonNull(FileUtils.getPath(getContext(), uri))); + + if (isAdded()) { + requireActivity().runOnUiThread(() -> { + QmpSender.changeFloppyDiskA(requireActivity(), selectedFilePath.getAbsolutePath()); + dismiss(); + }); } - } - }); + }).start(); + } catch (Exception e) { + showErrorSelectedFileDialog(); + dismiss(); + } + } + } private final ActivityResultLauncher floppyBPicker = - registerForActivityResult(new ActivityResultContracts.GetContent(), uri -> { - if (uri != null) { - try { - new Thread(() -> { - File selectedFilePath = new File(Objects.requireNonNull(FileUtils.getPath(getContext(), uri))); + registerForActivityResult(new ActivityResultContracts.GetContent(), this::handleFloppyBFile); - if (isAdded()) { - requireActivity().runOnUiThread(() -> { - QmpSender.changeFloppyDiskB(requireActivity(), selectedFilePath.getAbsolutePath()); - dismiss(); - }); - } - }).start(); - } catch (Exception e) { - showErrorSelectedFileDialog(); - dismiss(); + public void handleFloppyBFile(Uri uri) { + if (uri != null) { + try { + new Thread(() -> { + File selectedFilePath = new File(Objects.requireNonNull(FileUtils.getPath(getContext(), uri))); + + if (isAdded()) { + requireActivity().runOnUiThread(() -> { + QmpSender.changeFloppyDiskB(requireActivity(), selectedFilePath.getAbsolutePath()); + dismiss(); + }); } - } - }); + }).start(); + } catch (Exception e) { + showErrorSelectedFileDialog(); + dismiss(); + } + } + } private final ActivityResultLauncher memoryCardPicker = - registerForActivityResult(new ActivityResultContracts.GetContent(), uri -> { - if (uri != null) { - try { - new Thread(() -> { - String filePath = FileUtils.getPath(getContext(), uri); + registerForActivityResult(new ActivityResultContracts.GetContent(), this::handleMemoryCardFile); - if (filePath == null) { - showErrorSelectedFileDialog(); - return; - } + public void handleMemoryCardFile(Uri uri) { + if (uri != null) { + try { + new Thread(() -> { + String filePath = FileUtils.getPath(getContext(), uri); - File selectedFilePath = new File(filePath); - - if (isAdded()) { - requireActivity().runOnUiThread(() -> { - QmpSender.changeMemoryCard(requireActivity(), selectedFilePath.getAbsolutePath()); - dismiss(); - }); - } - }).start(); - } catch (Exception e) { + if (filePath == null) { showErrorSelectedFileDialog(); - dismiss(); + return; } - } - }); + + File selectedFilePath = new File(filePath); + + if (isAdded()) { + requireActivity().runOnUiThread(() -> { + QmpSender.changeMemoryCard(requireActivity(), selectedFilePath.getAbsolutePath()); + dismiss(); + }); + } + }).start(); + } catch (Exception e) { + showErrorSelectedFileDialog(); + dismiss(); + } + } + } private void showErrorSelectedFileDialog() { DialogUtils.oneDialog(requireActivity(), diff --git a/app/src/main/java/com/vectras/vm/settings/FilePickerSettingsActivity.java b/app/src/main/java/com/vectras/vm/settings/FilePickerSettingsActivity.java new file mode 100644 index 0000000..0ebd709 --- /dev/null +++ b/app/src/main/java/com/vectras/vm/settings/FilePickerSettingsActivity.java @@ -0,0 +1,65 @@ +package com.vectras.vm.settings; + +import android.os.Bundle; + +import androidx.activity.EdgeToEdge; +import androidx.appcompat.app.AppCompatActivity; + +import com.vectras.qemu.MainSettingsManager; +import com.vectras.vm.R; +import com.vectras.vm.databinding.ActivityFilePickerSettingsBinding; +import com.vectras.vm.file.FilePickerSettings; + +import java.util.Objects; + +public class FilePickerSettingsActivity extends AppCompatActivity { + + ActivityFilePickerSettingsBinding binding; + FilePickerSettings settings; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + EdgeToEdge.enable(this); + setContentView(R.layout.activity_external_vnc_settings); + binding = ActivityFilePickerSettingsBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + setSupportActionBar(binding.toolbar); + Objects.requireNonNull(getSupportActionBar()).setDisplayHomeAsUpEnabled(true); + binding.toolbar.setNavigationOnClickListener(view -> finish()); + initialize(); + } + + private void initialize() { + settings = new FilePickerSettings(this); + + binding.swEnabled.setOnCheckedChangeListener((buttonView, isChecked) -> { + MainSettingsManager.setBuiltInFilePicker(this, isChecked); + uiController(isChecked); + }); + binding.lnEnabled.setOnClickListener(v -> binding.swEnabled.toggle()); + + binding.swResume.setOnCheckedChangeListener((buttonView, isChecked) -> settings.resume(isChecked)); + binding.lnResume.setOnClickListener(v -> binding.swResume.toggle()); + + binding.swDivider.setOnCheckedChangeListener((buttonView, isChecked) -> settings.divider(isChecked)); + binding.lnDivider.setOnClickListener(v -> binding.swDivider.toggle()); + + binding.swShowHiddenFiles.setOnCheckedChangeListener((buttonView, isChecked) -> settings.showHiddenFiles(isChecked)); + binding.lnShowHiddenFiles.setOnClickListener(v -> binding.swShowHiddenFiles.toggle()); + + binding.swResume.setChecked(settings.resume()); + binding.swDivider.setChecked(settings.divider()); + binding.swShowHiddenFiles.setChecked(settings.showHiddenFiles()); + binding.swEnabled.setChecked(MainSettingsManager.getBuiltInFilePicker(this)); + + uiController(binding.swEnabled.isChecked()); + } + + private void uiController(boolean isEnabled) { + binding.lnAllOptions.setAlpha(isEnabled ? 1f : 0.5f); + binding.lnResume.setEnabled(isEnabled); + binding.lnDivider.setEnabled(isEnabled); + binding.lnShowHiddenFiles.setEnabled(isEnabled); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/vectras/vm/settings/Minitools.java b/app/src/main/java/com/vectras/vm/settings/Minitools.java index 67a3a77..901c54c 100644 --- a/app/src/main/java/com/vectras/vm/settings/Minitools.java +++ b/app/src/main/java/com/vectras/vm/settings/Minitools.java @@ -287,7 +287,7 @@ public class Minitools extends AppCompatActivity { FileUtils.delete(new File(getFilesDir().getAbsolutePath() + "/usr")); runOnUiThread(() -> { - progressDialog.dismiss(); + DialogUtils.safeDismiss(this, progressDialog); Intent intent = new Intent(); intent.setClass(this, SetupWizard2Activity.class); startActivity(intent); diff --git a/app/src/main/java/com/vectras/vm/settings/Settings2Activity.java b/app/src/main/java/com/vectras/vm/settings/Settings2Activity.java index 30bb1d3..688883e 100644 --- a/app/src/main/java/com/vectras/vm/settings/Settings2Activity.java +++ b/app/src/main/java/com/vectras/vm/settings/Settings2Activity.java @@ -31,6 +31,7 @@ public class Settings2Activity extends AppCompatActivity { binding.lnTheme.setOnClickListener(v -> startActivity(new Intent(this, ThemeActivity.class))); binding.lnNotification.setOnClickListener(v -> startActivity(new Intent(this, NotificationSettingsActivity.class))); binding.lnSearch.setOnClickListener(v -> startActivity(new Intent(this, SearchSettingsActivity.class))); + binding.lnFilePicker.setOnClickListener(v -> startActivity(new Intent(this, FilePickerSettingsActivity.class))); binding.lnSystem.setOnClickListener(v -> startActivity(new Intent(this, SystemSettingsActivity.class))); binding.lnQemu.setOnClickListener(v -> { diff --git a/app/src/main/java/com/vectras/vm/store/RomInfo.java b/app/src/main/java/com/vectras/vm/store/RomInfo.java index 3ca96fd..5a8b188 100644 --- a/app/src/main/java/com/vectras/vm/store/RomInfo.java +++ b/app/src/main/java/com/vectras/vm/store/RomInfo.java @@ -22,11 +22,13 @@ import com.anbui.elephant.interaction.Interaction; import com.bumptech.glide.Glide; import com.bumptech.glide.request.target.CustomTarget; import com.bumptech.glide.request.transition.Transition; +import com.vectras.qemu.MainSettingsManager; import com.vectras.vm.ImagePrvActivity; import com.vectras.vm.R; import com.vectras.vm.VMManager; import com.vectras.vm.creator.VMCreatorActivity; import com.vectras.vm.databinding.ActivityRomInfoBinding; +import com.vectras.vm.file.FilePickerDialog; import com.vectras.vm.utils.DialogUtils; import com.vectras.vm.utils.FileUtils; import com.vectras.vm.utils.ImageUtils; @@ -72,89 +74,90 @@ public class RomInfo extends AppCompatActivity { } private final ActivityResultLauncher romPicker = - registerForActivityResult(new ActivityResultContracts.GetContent(), uri -> { + registerForActivityResult(new ActivityResultContracts.GetContent(), this::handlePickedRom); - if (uri == null) return; + public void handlePickedRom(Uri uri) { + if (uri == null) return; - executor.execute(() -> { - String filePath; - try { - File selectedFilePath = new File(getPath(uri)); - filePath = selectedFilePath.getPath(); - } catch (Exception e) { - filePath = ""; + executor.execute(() -> { + String filePath; + try { + File selectedFilePath = new File(getPath(uri)); + filePath = selectedFilePath.getPath(); + } catch (Exception e) { + filePath = ""; + } + + String selectedFileName = FileUtils.getFileNameFromUri(this, uri); + + if (isFinishing() || isDestroyed()) return; + + String finalFilePath = filePath; + runOnUiThread(() -> { + if (selectedFileName.equals(getIntent().getStringExtra("filename")) || + (selectedFileName.endsWith(".cvbi.zip") && selectedFileName.equals(getIntent().getStringExtra("filename") + ".zip"))) { + Intent intent = new Intent(); + + if (getIntent().hasExtra("icon") && + !Objects.requireNonNull(getIntent().getStringExtra("icon")).isEmpty() && + (!selectedFileName.endsWith(".cvbi") + || !selectedFileName.endsWith(".cvbi.zip"))) { + + Glide.with(this) + .asBitmap() + .load(getIntent().getStringExtra("icon")) + .into(new CustomTarget() { + @Override + public void onResourceReady(@NonNull Bitmap resource, + @Nullable Transition transition) { + File cacheDir = getExternalCacheDir(); + + if (cacheDir != null) + ImageUtils.saveBitmapToPNGFile(resource, cacheDir.getAbsolutePath(), "thumbnail.png"); + + intent.putExtra("romicon", cacheDir != null ? cacheDir.getAbsolutePath() + "/thumbnail.png" : ""); + } + + @Override + public void onLoadCleared(@Nullable Drawable placeholder) { + intent.putExtra("romicon", ""); + } + }); + } else { + intent.putExtra("romicon", ""); } - String selectedFileName = FileUtils.getFileNameFromUri(this, uri); + intent.setClass(getApplicationContext(), VMCreatorActivity.class); + intent.putExtra("addromnow", ""); + intent.putExtra("romname", getIntent().getStringExtra("title")); + intent.putExtra("romfilename", getIntent().getStringExtra("filename")); + intent.putExtra("finalromfilename", getIntent().getStringExtra("finalromfilename")); + intent.putExtra("rompath", finalFilePath); + intent.putExtra("romuri", uri.toString()); + if (Objects.requireNonNull(getIntent().getStringExtra("extra")).contains(selectedFileName)) { + intent.putExtra("addtodrive", ""); + intent.putExtra("romextra", getIntent().getStringExtra("extra")); + } else { + intent.putExtra("addtodrive", "1"); + intent.putExtra("romextra", getIntent().getStringExtra("extra")); + } - if (isFinishing() || isDestroyed()) return; + VMManager.setArch(getIntent().hasExtra("arch") && getIntent().getStringExtra("arch") != null ? Objects.requireNonNull(getIntent().getStringExtra("arch")) : "", this); - String finalFilePath = filePath; - runOnUiThread(() -> { - if (selectedFileName.equals(getIntent().getStringExtra("filename")) || - (selectedFileName.endsWith(".cvbi.zip") && selectedFileName.equals(getIntent().getStringExtra("filename") + ".zip"))) { - Intent intent = new Intent(); - - if (getIntent().hasExtra("icon") && - !Objects.requireNonNull(getIntent().getStringExtra("icon")).isEmpty() && - (!selectedFileName.endsWith(".cvbi") - || !selectedFileName.endsWith(".cvbi.zip"))) { - - Glide.with(this) - .asBitmap() - .load(getIntent().getStringExtra("icon")) - .into(new CustomTarget() { - @Override - public void onResourceReady(@NonNull Bitmap resource, - @Nullable Transition transition) { - File cacheDir = getExternalCacheDir(); - - if (cacheDir != null) - ImageUtils.saveBitmapToPNGFile(resource, cacheDir.getAbsolutePath(), "thumbnail.png"); - - intent.putExtra("romicon", cacheDir != null ? cacheDir.getAbsolutePath() + "/thumbnail.png" : ""); - } - - @Override - public void onLoadCleared(@Nullable Drawable placeholder) { - intent.putExtra("romicon", ""); - } - }); - } else { - intent.putExtra("romicon", ""); - } - - intent.setClass(getApplicationContext(), VMCreatorActivity.class); - intent.putExtra("addromnow", ""); - intent.putExtra("romname", getIntent().getStringExtra("title")); - intent.putExtra("romfilename", getIntent().getStringExtra("filename")); - intent.putExtra("finalromfilename", getIntent().getStringExtra("finalromfilename")); - intent.putExtra("rompath", finalFilePath); - intent.putExtra("romuri", uri.toString()); - if (Objects.requireNonNull(getIntent().getStringExtra("extra")).contains(selectedFileName)) { - intent.putExtra("addtodrive", ""); - intent.putExtra("romextra", getIntent().getStringExtra("extra")); - } else { - intent.putExtra("addtodrive", "1"); - intent.putExtra("romextra", getIntent().getStringExtra("extra")); - } - - VMManager.setArch(getIntent().hasExtra("arch") && getIntent().getStringExtra("arch") != null ? Objects.requireNonNull(getIntent().getStringExtra("arch")) : "", this); - - startActivity(intent); - } else { - DialogUtils.oneDialog(RomInfo.this, - getString(R.string.problem_has_been_detected), - getString(R.string.please_select) + " " + getIntent().getStringExtra("filename"), - getString(R.string.ok), - true, R.drawable.warning_48px, - true, - null, - null); - } - }); - }); + startActivity(intent); + } else { + DialogUtils.oneDialog(RomInfo.this, + getString(R.string.problem_has_been_detected), + getString(R.string.please_select) + " " + getIntent().getStringExtra("filename"), + getString(R.string.ok), + true, R.drawable.warning_48px, + true, + null, + null); + } }); + }); + } public String getPath(Uri uri) { return FileUtils.getPath(RomInfo.this, uri); @@ -168,7 +171,12 @@ public class RomInfo extends AppCompatActivity { if (getIntent().hasExtra("isRomInfo") && getIntent().getBooleanExtra("isRomInfo", false)) { binding.btnPick.setOnClickListener(v -> { try { - romPicker.launch("*/*"); + if (MainSettingsManager.getBuiltInFilePicker(this)) { + FilePickerDialog filePickerDialog = new FilePickerDialog(); + filePickerDialog.pick(this, filePickerDialog.ROM_FILE, (path -> handlePickedRom(Uri.fromFile(new File(path))))); + } else { + romPicker.launch("*/*"); + } } catch (Exception e) { IntentUtils.showErrorDialog(this); } diff --git a/app/src/main/java/com/vectras/vm/utils/ClipboardUltils.java b/app/src/main/java/com/vectras/vm/utils/ClipboardUltils.java index 9300750..5261306 100644 --- a/app/src/main/java/com/vectras/vm/utils/ClipboardUltils.java +++ b/app/src/main/java/com/vectras/vm/utils/ClipboardUltils.java @@ -11,10 +11,14 @@ import com.vectras.vm.R; public class ClipboardUltils { public static void copyToClipboard(Context context, String text) { + copyToClipboard(context, text, true); + } + + public static void copyToClipboard(Context context, String text, boolean showToast) { ClipboardManager clipboard = (ClipboardManager) context.getSystemService(CLIPBOARD_SERVICE); ClipData clip = ClipData.newPlainText("From Vectras VM", text); assert clipboard != null; clipboard.setPrimaryClip(clip); - Toast.makeText(context, context.getString(R.string.copied), Toast.LENGTH_SHORT).show(); + if (showToast) Toast.makeText(context, context.getString(R.string.copied), Toast.LENGTH_SHORT).show(); } } diff --git a/app/src/main/java/com/vectras/vterm/Terminal2.java b/app/src/main/java/com/vectras/vterm/Terminal2.java index 3d2d811..cb64f69 100644 --- a/app/src/main/java/com/vectras/vterm/Terminal2.java +++ b/app/src/main/java/com/vectras/vterm/Terminal2.java @@ -109,7 +109,6 @@ public class Terminal2 { ProcessBuilder processBuilder = new ProcessBuilder(); processBuilder.redirectErrorStream(true); - String filesDir = Objects.requireNonNull(context.getFilesDir().getAbsolutePath()); String prootPath = new File(filesDir, "usr/bin/proot").getAbsolutePath(); String tmpDir = new File(filesDir, "usr/tmp").getAbsolutePath(); @@ -157,7 +156,7 @@ public class Terminal2 { resultData data = startProcess((startup.isEmpty() ? "" : startup + " && ") + command, process.get(), callback); if (callback != null) callback.onFinished(command, data.log.toString(), data.status); - } catch (IOException e) { + } catch (Exception e) { if (callback != null) callback.onError(command, e); addToLogs(command, e.getMessage()); diff --git a/app/src/main/res/drawable/android_24px.xml b/app/src/main/res/drawable/android_24px.xml new file mode 100644 index 0000000..be1c5e3 --- /dev/null +++ b/app/src/main/res/drawable/android_24px.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/arrow_upward_alt_24px.xml b/app/src/main/res/drawable/arrow_upward_alt_24px.xml new file mode 100644 index 0000000..16f5cae --- /dev/null +++ b/app/src/main/res/drawable/arrow_upward_alt_24px.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/code_24px.xml b/app/src/main/res/drawable/code_24px.xml new file mode 100644 index 0000000..8e7fc92 --- /dev/null +++ b/app/src/main/res/drawable/code_24px.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/database_24px.xml b/app/src/main/res/drawable/database_24px.xml new file mode 100644 index 0000000..92d0650 --- /dev/null +++ b/app/src/main/res/drawable/database_24px.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/description_24px.xml b/app/src/main/res/drawable/description_24px.xml new file mode 100644 index 0000000..9e37e87 --- /dev/null +++ b/app/src/main/res/drawable/description_24px.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/draft_24px.xml b/app/src/main/res/drawable/draft_24px.xml new file mode 100644 index 0000000..eacfbbc --- /dev/null +++ b/app/src/main/res/drawable/draft_24px.xml @@ -0,0 +1,11 @@ + + + diff --git a/app/src/main/res/drawable/folder_zip_24px.xml b/app/src/main/res/drawable/folder_zip_24px.xml new file mode 100644 index 0000000..4f69cd7 --- /dev/null +++ b/app/src/main/res/drawable/folder_zip_24px.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/image_24px.xml b/app/src/main/res/drawable/image_24px.xml new file mode 100644 index 0000000..8f9ee7f --- /dev/null +++ b/app/src/main/res/drawable/image_24px.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ios_24px.xml b/app/src/main/res/drawable/ios_24px.xml new file mode 100644 index 0000000..df9a936 --- /dev/null +++ b/app/src/main/res/drawable/ios_24px.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/key_24px.xml b/app/src/main/res/drawable/key_24px.xml new file mode 100644 index 0000000..6fda034 --- /dev/null +++ b/app/src/main/res/drawable/key_24px.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/movie_24px.xml b/app/src/main/res/drawable/movie_24px.xml new file mode 100644 index 0000000..1d00939 --- /dev/null +++ b/app/src/main/res/drawable/movie_24px.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/music_note_24px.xml b/app/src/main/res/drawable/music_note_24px.xml new file mode 100644 index 0000000..02a46d9 --- /dev/null +++ b/app/src/main/res/drawable/music_note_24px.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/titlecase_24px.xml b/app/src/main/res/drawable/titlecase_24px.xml new file mode 100644 index 0000000..85c2b3a --- /dev/null +++ b/app/src/main/res/drawable/titlecase_24px.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/tune_24px.xml b/app/src/main/res/drawable/tune_24px.xml new file mode 100644 index 0000000..c37eb33 --- /dev/null +++ b/app/src/main/res/drawable/tune_24px.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/vectras_vm_24px.xml b/app/src/main/res/drawable/vectras_vm_24px.xml new file mode 100644 index 0000000..16f468e --- /dev/null +++ b/app/src/main/res/drawable/vectras_vm_24px.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/wysiwyg_24px.xml b/app/src/main/res/drawable/wysiwyg_24px.xml new file mode 100644 index 0000000..f3c3073 --- /dev/null +++ b/app/src/main/res/drawable/wysiwyg_24px.xml @@ -0,0 +1,11 @@ + + + diff --git a/app/src/main/res/layout/activity_file_picker_settings.xml b/app/src/main/res/layout/activity_file_picker_settings.xml new file mode 100644 index 0000000..becb6ca --- /dev/null +++ b/app/src/main/res/layout/activity_file_picker_settings.xml @@ -0,0 +1,217 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_settings2.xml b/app/src/main/res/layout/activity_settings2.xml index 98587cc..b2d4e71 100644 --- a/app/src/main/res/layout/activity_settings2.xml +++ b/app/src/main/res/layout/activity_settings2.xml @@ -150,6 +150,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/list_file.xml b/app/src/main/res/layout/list_file.xml new file mode 100644 index 0000000..08dd4d2 --- /dev/null +++ b/app/src/main/res/layout/list_file.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index a9818ac..cc41481 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -781,6 +781,18 @@ Trầm sâu Thiết bị của bạn không được hỗ trợ. Hoàn tác + Bộ nhớ trong + Mở bằng + Trình chọn tệp + Trình chọn và duyệt tệp tích hợp sẵn. + Dùng trình chọn tệp + Tiếp tục + Tiếp tục ở thư mục cuối cùng mà bạn đã chọn tệp trong lần dùng trước đó. + Hiện các tệp ẩn + Áp dụng với các tệp và thư mục có tên bắt đầu bằng \".\". + Đã sap chép đường dẫn thư mục vào bảng tạm. + Đường phân cách + Thêm các đường phân cách giữa các mục. diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f8956c3..f18d8bf 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -640,6 +640,18 @@ Low bass Your device is not supported. Undo + Internal storage + Open with + File picker + Built-in file picker and browser. + Use file picker + Resume + Continue in the last folder where you selected the file in the previous use. + Show hidden files + This applies to files and folders whose names begin with \".\". + The folder path has been copied to the clipboard. + Divider + Add dividers between items. From 05a0fb6fce633496fde15f96b8d7a1429bbd2d67 Mon Sep 17 00:00:00 2001 From: An Bui <91354810+AnBui2004@users.noreply.github.com> Date: Sat, 11 Jul 2026 21:18:00 +0700 Subject: [PATCH 12/18] Update UpdateConfig.json --- web/data/UpdateConfig.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/web/data/UpdateConfig.json b/web/data/UpdateConfig.json index b814b06..a884e99 100644 --- a/web/data/UpdateConfig.json +++ b/web/data/UpdateConfig.json @@ -5,11 +5,11 @@ "url": "https://github.com/xoureldeen/Vectras-VM-Android/releases", "Message": "

4.3.0

\nBugs fixed.", "cancellable": true, - "versionCodeBeta":"137", - "versionNameBeta":"4.3.3", - "versionNameBetas":"4.0.1,4.0.2,4.0.3,4.0.4,4.0.5,4.0.6,4.0.7,4.0.8,4.0.9,4.1.1,4.1.2,4.1.3,4.1.4,4.1.5,4.1.6,4.1.7,4.1.8,4.1.9,4.2.1,4.2.2,4.2.3,4.2.4,4.2.5,4.2.6,4.2.7,4.2.8,4.2.9,4.3.0,4.3.1,4.3.2,4.3.3", + "versionCodeBeta":"138", + "versionNameBeta":"4.3.4", + "versionNameBetas":"4.0.1,4.0.2,4.0.3,4.0.4,4.0.5,4.0.6,4.0.7,4.0.8,4.0.9,4.1.1,4.1.2,4.1.3,4.1.4,4.1.5,4.1.6,4.1.7,4.1.8,4.1.9,4.2.1,4.2.2,4.2.3,4.2.4,4.2.5,4.2.6,4.2.7,4.2.8,4.2.9,4.3.0,4.3.1,4.3.2,4.3.3,4.3.4", "sizeBeta": "45 MB", "urlBeta": "https://github.com/AnBui2004/Vectras-VM-Emu-Android/releases", - "MessageBeta": "

4.3.3

Bugs fixed.", + "MessageBeta": "

4.3.4

Bugs fixed.", "cancellableBeta": true } From 81e53212014a0c45147202bd029b13c425a53433 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 Jul 2026 08:16:43 +0000 Subject: [PATCH 13/18] Bump com.google.firebase:firebase-bom from 34.15.0 to 34.16.0 Bumps com.google.firebase:firebase-bom from 34.15.0 to 34.16.0. --- updated-dependencies: - dependency-name: com.google.firebase:firebase-bom dependency-version: 34.16.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index fac00a7..dac3edf 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -11,7 +11,7 @@ coreKtx = "1.19.0" documentfile = "1.1.0" drawerlayout = "1.2.0" espressoCore = "3.7.0" -firebaseBom = "34.15.0" +firebaseBom = "34.16.0" firebaseCrashlyticsGradle = "3.0.7" firebaseMessaging = "25.1.0" glide = "5.0.7" From 74230ebfc0fadb8a06485bda2db30fc6bc0bb7bb Mon Sep 17 00:00:00 2001 From: An Bui <91354810+AnBui2004@users.noreply.github.com> Date: Mon, 13 Jul 2026 18:09:40 +0700 Subject: [PATCH 14/18] 4.3.5 - Open source licenses have been added. - New virtual machine creator interface. - Network card options have been added. --- app/build.gradle | 7 +- .../java/com/vectras/vm/AboutActivity.java | 3 + .../com/vectras/vm/ExportRomActivity.java | 1 + app/src/main/java/com/vectras/vm/StartVM.java | 5 + .../vectras/vm/creator/VMCreatorActivity.java | 710 +++--------------- .../vectras/vm/creator/VMCreatorSelector.java | 23 +- .../vm/creator/{ => configs}/ListManager.java | 26 +- .../creator/editor/AdvancedConfigsDialog.java | 108 +++ .../vm/creator/editor/BoardConfigsDialog.java | 102 +++ .../creator/editor/FirmwareConfigsDialog.java | 124 +++ .../creator/editor/NetworkConfigsDialog.java | 86 +++ .../creator/editor/StorageConfigsDialog.java | 569 ++++++++++++++ .../vm/creator/utils/CreatorUtils.java | 107 +++ .../com/vectras/vm/main/vms/DataMainRoms.java | 52 +- .../com/vectras/vm/view/CheckBoxView.java | 2 +- .../java/com/vectras/vm/view/SwitchView.java | 2 +- .../main/res/layout/activity_vm_creator.xml | 534 ++++--------- app/src/main/res/layout/checkbox_view.xml | 3 +- app/src/main/res/layout/content_about.xml | 8 + .../res/layout/creator_advanced_dialog.xml | 58 ++ .../main/res/layout/creator_board_dialog.xml | 77 ++ .../res/layout/creator_firmware_dialog.xml | 86 +++ .../res/layout/creator_network_dialog.xml | 47 ++ .../res/layout/creator_storage_dialog.xml | 215 ++++++ .../main/res/layout/rom_options_dialog.xml | 3 +- app/src/main/res/layout/select_box_view.xml | 3 +- app/src/main/res/layout/switch_view.xml | 6 +- app/src/main/res/values-vi/strings.xml | 9 + app/src/main/res/values/strings.xml | 31 + build.gradle | 1 + gradle/libs.versions.toml | 24 +- web/data/UpdateConfig.json | 8 +- 32 files changed, 1988 insertions(+), 1052 deletions(-) rename app/src/main/java/com/vectras/vm/creator/{ => configs}/ListManager.java (82%) create mode 100644 app/src/main/java/com/vectras/vm/creator/editor/AdvancedConfigsDialog.java create mode 100644 app/src/main/java/com/vectras/vm/creator/editor/BoardConfigsDialog.java create mode 100644 app/src/main/java/com/vectras/vm/creator/editor/FirmwareConfigsDialog.java create mode 100644 app/src/main/java/com/vectras/vm/creator/editor/NetworkConfigsDialog.java create mode 100644 app/src/main/java/com/vectras/vm/creator/editor/StorageConfigsDialog.java create mode 100644 app/src/main/java/com/vectras/vm/creator/utils/CreatorUtils.java create mode 100644 app/src/main/res/layout/creator_advanced_dialog.xml create mode 100644 app/src/main/res/layout/creator_board_dialog.xml create mode 100644 app/src/main/res/layout/creator_firmware_dialog.xml create mode 100644 app/src/main/res/layout/creator_network_dialog.xml create mode 100644 app/src/main/res/layout/creator_storage_dialog.xml diff --git a/app/build.gradle b/app/build.gradle index f5d72cf..c39bff4 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,6 +2,7 @@ plugins { id 'com.android.application' id 'com.google.gms.google-services' id 'com.google.firebase.crashlytics' + id 'com.google.android.gms.oss-licenses-plugin' } android { @@ -12,8 +13,8 @@ android { applicationId "com.vectras.vm" minSdk minApi targetSdk targetApi - versionCode 138 - versionName "4.3.4" + versionCode 139 + versionName "4.3.5" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" multiDexEnabled true @@ -123,4 +124,6 @@ dependencies { testImplementation libs.junit androidTestImplementation libs.androidx.junit androidTestImplementation libs.androidx.espresso.core + + implementation libs.play.services.oss.licenses } \ No newline at end of file diff --git a/app/src/main/java/com/vectras/vm/AboutActivity.java b/app/src/main/java/com/vectras/vm/AboutActivity.java index 5b79239..da8ed84 100644 --- a/app/src/main/java/com/vectras/vm/AboutActivity.java +++ b/app/src/main/java/com/vectras/vm/AboutActivity.java @@ -8,6 +8,7 @@ import android.os.Bundle; import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.LinearLayoutManager; +import com.google.android.gms.oss.licenses.OssLicensesMenuActivity; import com.vectras.vm.adapters.GithubUserAdapter; import com.vectras.vm.utils.CommandUtils; import com.vectras.vm.utils.UIUtils; @@ -100,6 +101,8 @@ public class AboutActivity extends AppCompatActivity implements View.OnClickList }); }); + findViewById(R.id.btn_open_source_licenses).setOnClickListener(v -> startActivity(new Intent(this, OssLicensesMenuActivity.class))); + } @Override diff --git a/app/src/main/java/com/vectras/vm/ExportRomActivity.java b/app/src/main/java/com/vectras/vm/ExportRomActivity.java index a28e4f4..58456c6 100644 --- a/app/src/main/java/com/vectras/vm/ExportRomActivity.java +++ b/app/src/main/java/com/vectras/vm/ExportRomActivity.java @@ -168,6 +168,7 @@ public class ExportRomActivity extends AppCompatActivity { vmConfigMap.put("fdb", ""); } + vmConfigMap.put("networkCard", current.networkCard); vmConfigMap.put("sharedFolder", current.sharedFolder); vmConfigMap.put("bootFrom", current.bootFrom); vmConfigMap.put("isShowBootMenu", current.isShowBootMenu); diff --git a/app/src/main/java/com/vectras/vm/StartVM.java b/app/src/main/java/com/vectras/vm/StartVM.java index 2d1f769..6a18f1d 100644 --- a/app/src/main/java/com/vectras/vm/StartVM.java +++ b/app/src/main/java/com/vectras/vm/StartVM.java @@ -73,6 +73,11 @@ public class StartVM { if (!cpuParams.isEmpty()) extraParams = cpuParams + " " + extraParams; + String network = Objects.requireNonNull(VMCreatorSelector.getNetworkCard(activity, vmData.networkCard).get("value")).toString(); + if (!network.isEmpty()) { + extraParams = "-device " + network + ",netdev=net0 -netdev user,id=net0 " + extraParams; + } + String bootFromParams = Objects.requireNonNull(VMCreatorSelector.getBootFrom(activity, vmData.bootFrom).get("value")).toString(); String showBootMenuParams = vmData.isShowBootMenu ? "menu=on" : ""; String bootParams = ""; diff --git a/app/src/main/java/com/vectras/vm/creator/VMCreatorActivity.java b/app/src/main/java/com/vectras/vm/creator/VMCreatorActivity.java index 22ce9da..485a772 100644 --- a/app/src/main/java/com/vectras/vm/creator/VMCreatorActivity.java +++ b/app/src/main/java/com/vectras/vm/creator/VMCreatorActivity.java @@ -24,14 +24,17 @@ import androidx.appcompat.app.AppCompatActivity; import com.bumptech.glide.Glide; import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.google.android.material.dialog.MaterialAlertDialogBuilder; -import com.google.android.material.textfield.TextInputEditText; -import com.google.android.material.textfield.TextInputLayout; import com.google.gson.Gson; import com.google.gson.JsonSyntaxException; import com.vectras.qemu.MainSettingsManager; import com.vectras.vm.AppConfig; -import com.vectras.vm.Fragment.CreateImageDialogFragment; import com.vectras.vm.R; +import com.vectras.vm.creator.editor.AdvancedConfigsDialog; +import com.vectras.vm.creator.editor.BoardConfigsDialog; +import com.vectras.vm.creator.editor.NetworkConfigsDialog; +import com.vectras.vm.creator.utils.CreatorUtils; +import com.vectras.vm.creator.editor.FirmwareConfigsDialog; +import com.vectras.vm.creator.editor.StorageConfigsDialog; import com.vectras.vm.file.FilePickerDialog; import com.vectras.vm.store.RomInfo; import com.vectras.vm.SplashActivity; @@ -58,14 +61,11 @@ import org.json.JSONException; import org.json.JSONObject; import java.io.File; -import java.io.IOException; -import java.util.ArrayList; import java.util.Objects; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import com.vectras.vm.utils.ZipUtils; -import com.vectras.vterm.Terminal; import com.vectras.vm.utils.PermissionUtils; import com.vectras.vterm.Terminal2; @@ -76,7 +76,6 @@ public class VMCreatorActivity extends AppCompatActivity { private final ExecutorService executor = Executors.newSingleThreadExecutor(); private DialogProgressStyleBinding dialogProgressStyleBinding; private AlertDialog progressDialog; - boolean iseditparams = false; public String previousName = ""; public boolean addromnowdone = false; private boolean created = false; @@ -85,16 +84,8 @@ public class VMCreatorActivity extends AppCompatActivity { public static DataMainRoms current = new DataMainRoms(); private String thumbnailPath = ""; private String vmID = VMManager.idGenerator(); - private int cpu = 0; - private int cores = 0; - private int threads = 0; - private boolean isUseBattery = false; - private boolean isShowBootMenu = false; - private boolean isUseLocalTime = true; - private boolean isUseUefi = false; - private boolean isUseDefaultBios = true; - private boolean sharedFolder = false; - private int bootFrom = 0; + + private CreatorUtils utils; @Override public boolean onOptionsItemSelected(MenuItem item) { @@ -106,7 +97,7 @@ public class VMCreatorActivity extends AppCompatActivity { try { if (MainSettingsManager.getBuiltInFilePicker(this)) { FilePickerDialog filePickerDialog = new FilePickerDialog(); - filePickerDialog.pick(this, filePickerDialog.TYPE_FILE, (path -> handleAddFile(Uri.fromFile(new File (path))))); + filePickerDialog.pick(this, FilePickerDialog.TYPE_FILE, (path -> handleAddFile(Uri.fromFile(new File (path))))); } else { filePicker.launch("*/*"); } @@ -158,24 +149,6 @@ public class VMCreatorActivity extends AppCompatActivity { binding.btnCreate.setOnClickListener(v -> startCreateVM()); - setupStorageUi(); - - binding.qemu.setOnClickListener(v -> { - iseditparams = true; - Intent intent = new Intent(); - intent.setClass(getApplicationContext(), QemuParamsEditorActivity.class); - intent.putExtra("content", Objects.requireNonNull(binding.qemu.getText()).toString()); - startActivity(intent); - }); - - binding.qemuField.setOnClickListener(v -> { - iseditparams = true; - Intent intent = new Intent(); - intent.setClass(getApplicationContext(), QemuParamsEditorActivity.class); - intent.putExtra("content", Objects.requireNonNull(binding.qemu.getText()).toString()); - startActivity(intent); - }); - TextWatcher afterTextChangedListener = new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { @@ -197,8 +170,6 @@ public class VMCreatorActivity extends AppCompatActivity { } }; binding.title.addTextChangedListener(afterTextChangedListener); - binding.drive.addTextChangedListener(afterTextChangedListener); - binding.qemu.addTextChangedListener(afterTextChangedListener); binding.ivIcon.setOnClickListener(v -> { if (thumbnailPath.isEmpty()) { @@ -217,56 +188,57 @@ public class VMCreatorActivity extends AppCompatActivity { binding.ivAddThubnail.setImageResource(R.drawable.add_24px); VMManager.setIconWithName(binding.ivIcon, Objects.requireNonNull(binding.title.getText()).toString()); - if (FileUtils.isFileExists(VmFileManager.getThumbnail(vmID))) markDelete(VmFileManager.getThumbnail(vmID)); + if (FileUtils.isFileExists(VmFileManager.getThumbnail(vmID))) utils.markDelete(VmFileManager.getThumbnail(vmID)); }, null); } }); binding.lineardisclaimer.setOnClickListener(v -> DialogUtils.oneDialog(this, getResources().getString(R.string.dont_miss_out), getResources().getString(R.string.disclaimer_when_using_rom), getResources().getString(R.string.i_agree), true, R.drawable.verified_user_24px, true, null, null)); + binding.lnBoard.setOnClickListener(v -> { + save(); - binding.sbvCpu.setOnClickListener(v -> VMCreatorSelector.cpu(this, MainSettingsManager.getArch(this), cpu, ((position, name, value) -> { - cpu = position; - binding.sbvCpu.setSubtitle(name); - }))); - - binding.sbvCore.setOnClickListener(v -> VMCreatorSelector.cpuCore(this, MainSettingsManager.getArch(this), cores, ((position, name, value) -> { - cores = position; - binding.sbvCore.setSubtitle(name); - }))); - - binding.sbvThread.setOnClickListener(v -> VMCreatorSelector.cpuThread(this, MainSettingsManager.getArch(this), threads, ((position, name, value) -> { - threads = position; - binding.sbvThread.setSubtitle(name); - }))); - - binding.cbvBattery.setOnCheckedChangeListener((v, isChecked) -> isUseBattery = isChecked); - - - - binding.sbvBootfrom.setOnClickListener(v -> VMCreatorSelector.bootFrom(this, bootFrom, ((position, name, value) -> { - bootFrom = position; - binding.sbvBootfrom.setSubtitle(name); - }))); - - binding.cbvShowbootmenu.setOnCheckedChangeListener((v, isChecked) -> isShowBootMenu = isChecked); - - binding.cbvUselocaltime.setOnCheckedChangeListener((v, isChecked) -> isUseLocalTime = isChecked); - - if (!MainSettingsManager.getArch(this).equals("X86_64")) { - binding.cbvUseuefi.setVisibility(View.GONE); - } else { - binding.cbvUseuefi.setOnCheckedChangeListener((v, isChecked) -> isUseUefi = isChecked); - } - - binding.cbvUseDefaultBios.setOnCheckedChangeListener((v, isChecked) -> { - isUseDefaultBios = isChecked; - binding.cbvUseuefi.setEnabled(isChecked); + BoardConfigsDialog dialog = new BoardConfigsDialog(); + dialog.setConfigs(current); + dialog.setOnDismiss(this::loadConfig); + dialog.show(getSupportFragmentManager(), "board_configs_dialog"); }); + binding.lnStorage.setOnClickListener(v -> { + save(); + StorageConfigsDialog dialog = new StorageConfigsDialog(); + dialog.setConfigs(current); + dialog.setOnDismiss(this::loadConfig); + dialog.show(getSupportFragmentManager(), "storage_configs_dialog"); + }); - VmFileManager.removeTemp(this, vmID, peddingTempFolder); + binding.lnFirmware.setOnClickListener(v -> { + save(); + + FirmwareConfigsDialog dialog = new FirmwareConfigsDialog(); + dialog.setConfigs(current); + dialog.setOnDismiss(this::loadConfig); + dialog.show(getSupportFragmentManager(), "firmware_configs_dialog"); + }); + + binding.lnNetwork.setOnClickListener(v -> { + save(); + + NetworkConfigsDialog dialog = new NetworkConfigsDialog(); + dialog.setConfigs(current); + dialog.setOnDismiss(this::loadConfig); + dialog.show(getSupportFragmentManager(), "network_configs_dialog"); + }); + + binding.lnAdvanced.setOnClickListener(v -> { + save(); + + AdvancedConfigsDialog dialog = new AdvancedConfigsDialog(); + dialog.setConfigs(current); + dialog.setOnDismiss(this::loadConfig); + dialog.show(getSupportFragmentManager(), "advanced_configs_dialog"); + }); modify = getIntent().getBooleanExtra("MODIFY", false); if (modify) { @@ -275,20 +247,23 @@ public class VMCreatorActivity extends AppCompatActivity { loadConfig(VMManager.getVMConfig(getIntent().getIntExtra("POS", 0))); - vmID = getIntent().getStringExtra("VMID"); - - if (vmID == null || vmID.isEmpty()) { - vmID = VMManager.idGenerator(); - } +// vmID = getIntent().getStringExtra("VMID"); +// +// if (vmID == null || vmID.isEmpty()) { +// vmID = VMManager.idGenerator(); +// } previousName = current.itemName; } else { checkVMID(); + + utils = new CreatorUtils(this, vmID); + if (getIntent().hasExtra("addromnow")) { if (Objects.requireNonNull(getIntent().getStringExtra("romextra")).isEmpty()) { setDefault(); } else { - binding.qemu.setText(VmFileManager.textMarkToPath(this, vmID, Objects.requireNonNull(getIntent().getStringExtra("romextra")))); + current.itemExtra = VmFileManager.textMarkToPath(this, vmID, Objects.requireNonNull(getIntent().getStringExtra("romextra"))); } binding.title.setText(getIntent().getStringExtra("romname")); @@ -309,9 +284,9 @@ public class VMCreatorActivity extends AppCompatActivity { handleDiskFile(Uri.fromFile(new File((Objects.requireNonNull(getIntent().getStringExtra("rompath"))))), false); } if (!Objects.requireNonNull(getIntent().getStringExtra("addtodrive")).isEmpty()) { - setDrive(SELECT_DISK_0_FILE_MODE, VmFileManager.getPath(vmID, getIntent().getStringExtra("romfilename"))); + current.itemPath = VmFileManager.getPath(vmID, getIntent().getStringExtra("romfilename")); } else { - setDrive(SELECT_DISK_0_FILE_MODE, null); + current.itemPath = ""; } } @@ -320,7 +295,7 @@ public class VMCreatorActivity extends AppCompatActivity { try { if (MainSettingsManager.getBuiltInFilePicker(this)) { FilePickerDialog filePickerDialog = new FilePickerDialog(); - filePickerDialog.pick(this, filePickerDialog.ROM_FILE, (path -> importRom(null, path, new File(path).getName()))); + filePickerDialog.pick(this, FilePickerDialog.ROM_FILE, (path -> importRom(null, path, new File(path).getName()))); } else { cvbiPicker.launch("*/*"); } @@ -343,7 +318,7 @@ public class VMCreatorActivity extends AppCompatActivity { public void onFinished(String command, String log, int status) { new Handler(Looper.getMainLooper()).post(() -> { if (status == terminal2.SUCCESS) - binding.drive.setText(VmFileManager.getPath(vmID, "disk.qcow2")); + current.itemPath = VmFileManager.getPath(vmID, "disk.qcow2"); }); } @@ -355,12 +330,14 @@ public class VMCreatorActivity extends AppCompatActivity { }); } } else { - setDrive(SELECT_DISK_0_FILE_MODE, null); + current.itemPath = ""; } } } + utils.removeTemp(); + checkCreateCommandConfig(); getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) { @@ -375,10 +352,6 @@ public class VMCreatorActivity extends AppCompatActivity { public void onResume() { super.onResume(); PermissionUtils.storagepermission(this, true); - if (iseditparams) { - iseditparams = false; - binding.qemu.setText(QemuParamsEditorActivity.result); - } } private void onBack() { @@ -413,94 +386,6 @@ public class VMCreatorActivity extends AppCompatActivity { handleThumbnail(uri); }); - private final ActivityResultLauncher diskPicker = - registerForActivityResult(new ActivityResultContracts.GetContent(), uri -> { - if (uri == null) return; - handleDiskFile(uri, true); - }); - - @SuppressLint("SetTextI18n") - private final ActivityResultLauncher isoPicker = - registerForActivityResult(new ActivityResultContracts.GetContent(), uri -> { - if (uri == null) return; - - String fileName = FileUtils.getFileNameFromUri(this, uri); - if (fileName != null && !fileName.isEmpty() && !FormatManager.isOpticalFileFormat(fileName)) { - DialogUtils.twoDialog(this, getString(R.string.problem_has_been_detected), getString(R.string.file_format_is_not_supported_optical_drive), getResources().getString(R.string.continuetext), getResources().getString(R.string.cancel), true, R.drawable.album_24px, true, - () -> handleFile(uri), null, null); - } else { - handleFile(uri); - } - }); - - - @SuppressLint("SetTextI18n") - private final ActivityResultLauncher floppyPicker = - registerForActivityResult(new ActivityResultContracts.GetContent(), uri -> { - if (uri == null) return; - - String fileName = FileUtils.getFileNameFromUri(this, uri); - if (fileName != null && !fileName.isEmpty() && !FormatManager.isFloppyFileFormat(fileName)) { - DialogUtils.twoDialog(this, getString(R.string.problem_has_been_detected), getString(R.string.file_format_is_not_supported_floppy_drive), getResources().getString(R.string.continuetext), getResources().getString(R.string.cancel), true, R.drawable.save_24px, true, - () -> handleFile(uri), null, null); - } else { - handleFile(uri); - } - }); - - - private void handleFile(Uri uri) { - if (MainSettingsManager.copyFile(this)) { - showProgressDialog(getString(R.string.copying_file)); - - executor.execute(() -> { - try { - isProcessingFile = true; - - String path = copyToTemp(uri); - - runOnUiThread(() -> setDrive(this.PENDING_SELECT_FILE_MODE, path)); - } catch (Exception e) { - runOnUiThread(() -> DialogUtils.oneDialog(this, - getString(R.string.oops), - getString(R.string.unable_to_copy_file_content), - getString(R.string.ok), - true, - R.drawable.warning_48px, - true, - null, - null)); - Log.e(TAG, "isoPicker: " + e.getMessage()); - } finally { - isProcessingFile = false; - runOnUiThread(() -> DialogUtils.safeDismiss(this, progressDialog)); - } - }); - } else { - executor.execute(() -> { - if (!FileUtils.isValidFilePath(this, FileUtils.getPath(this, uri), false)) { - runOnUiThread(() -> DialogUtils.oneDialog(this, - getString(R.string.problem_has_been_detected), - getString(R.string.invalid_file_path_content), - getString(R.string.ok), - true, - R.drawable.warning_48px, - true, - null, - null) - ); - } else { - runOnUiThread(() -> showProgressDialog(getString(R.string.just_a_moment))); - String path = getPath(uri); - runOnUiThread(() -> { - setDrive(this.PENDING_SELECT_FILE_MODE, new File(path).getAbsolutePath()); - DialogUtils.safeDismiss(this, progressDialog); - }); - } - }); - } - } - private final ActivityResultLauncher cvbiPicker = registerForActivityResult(new ActivityResultContracts.GetContent(), uri -> { @@ -533,7 +418,7 @@ public class VMCreatorActivity extends AppCompatActivity { try { isProcessingFile = true; - String filePath = copyToTemp(uri); + String filePath = utils.copyToTemp(uri); runOnUiThread(() -> DialogUtils.twoDialog(this, getString(R.string.file_added), @@ -572,6 +457,8 @@ public class VMCreatorActivity extends AppCompatActivity { checkVMID(); } + utils = new CreatorUtils(this, vmID); + if (current.itemArch != null) { VMManager.setArch(current.itemArch, this); binding.collapsingToolbarLayout.setSubtitle(MainSettingsManager.getArch(this)); @@ -581,77 +468,10 @@ public class VMCreatorActivity extends AppCompatActivity { binding.title.setText(current.itemName); } - if (current.itemPath != null && !current.itemPath.isEmpty()) { - setDrive(SELECT_DISK_0_FILE_MODE, (current.itemPath.contains("/") ? "" : VmFileManager.getPath(vmID)).concat(current.itemPath)); - } - - if (current.hd1 != null && !current.hd1.isEmpty()) { - setDrive(SELECT_DISK_1_FILE_MODE, (current.hd1.contains("/") ? "" : VmFileManager.getPath(vmID)).concat(current.hd1)); - } - - if (MainSettingsManager.getArch(this).equals(MainSettingsManager.ARM64_ARCH)) { - binding.lnFloppyContainer.setVisibility(View.GONE); - } else { - if (current.fda!= null && !current.fda.isEmpty()) { - setDrive(SELECT_FLOPPY_A_FILE_MODE, (current.fda.contains("/") ? "" : VmFileManager.getPath(vmID)).concat(current.fda)); - } - - if (current.fdb!= null && !current.fdb.isEmpty()) { - setDrive(SELECT_FLOPPY_B_FILE_MODE, (current.fdb.contains("/") ? "" : VmFileManager.getPath(vmID)).concat(current.fdb)); - } - } - - if (current.imgCdrom != null && !current.imgCdrom.isEmpty()) { - setDrive(SELECT_CDROM_0_FILE_MODE, (current.imgCdrom.contains("/") ? "" : VmFileManager.getPath(vmID)).concat(current.imgCdrom)); - } - - if (current.cdrom1 != null && !current.cdrom1.isEmpty()) { - setDrive(SELECT_CDROM_1_FILE_MODE, (current.cdrom1.contains("/") ? "" : VmFileManager.getPath(vmID)).concat(current.cdrom1)); - } - if (current.itemIcon != null && !current.itemIcon.isEmpty()) { thumbnailPath = (current.itemIcon.contains("/") ? current.itemIcon : VmFileManager.getPath(vmID, current.itemIcon)); updateThumbnailViewer(""); } - - if (current.itemExtra != null) { - binding.qemu.setText(VmFileManager.textMarkToPath(this, vmID, current.itemExtra)); - } - - cpu = current.cpu; - binding.sbvCpu.setSubtitle(Objects.requireNonNull(VMCreatorSelector.getCpu(this, MainSettingsManager.getArch(this), current.cpu).get("name")).toString()); - - cores = current.cores; - binding.sbvCore.setSubtitle(Objects.requireNonNull(VMCreatorSelector.getCpuCore(MainSettingsManager.getArch(this), cores).get("value")).toString()); - - threads = current.threads; - binding.sbvThread.setSubtitle(String.valueOf(threads + 1)); - - isUseBattery = current.battery; - binding.cbvBattery.setChecked(isUseBattery); - - bootFrom = current.bootFrom; - binding.sbvBootfrom.setSubtitle(Objects.requireNonNull(VMCreatorSelector.getBootFrom(this, current.bootFrom).get("name")).toString()); - isShowBootMenu = current.isShowBootMenu; - binding.cbvShowbootmenu.setChecked(isShowBootMenu); - - sharedFolder = current.sharedFolder; - binding.svSharedFolder.setChecked(sharedFolder); - - if (MainSettingsManager.getArch(this).equals(MainSettingsManager.X86_64_ARCH)) { - isUseUefi = current.isUseUefi; - binding.cbvUseuefi.setChecked(isUseUefi); - } else { - binding.cbvUseuefi.setVisibility(View.GONE); - } - - isUseDefaultBios = current.isUseDefaultBios; - binding.cbvUseDefaultBios.setChecked(isUseDefaultBios); - - binding.cbvUseuefi.setEnabled(isUseDefaultBios); - - isUseLocalTime = current.isUseLocalTime; - binding.cbvUselocaltime.setChecked(isUseLocalTime); } } @@ -660,36 +480,32 @@ public class VMCreatorActivity extends AppCompatActivity { if (DeviceUtils.is64bit()) { defQemuParams = switch (MainSettingsManager.getArch(this)) { case "ARM64" -> - "-M virt,virtualization=true -accel tcg,thread=multi -net nic,model=e1000 -net user -device nec-usb-xhci -device usb-kbd -device usb-mouse -device VGA"; + "-M virt,virtualization=true -accel tcg,thread=multi -device nec-usb-xhci -device usb-kbd -device usb-mouse -device VGA"; case "PPC" -> "-M mac99 -accel tcg,thread=multi"; default -> - "-M pc -accel tcg,thread=multi -vga std -netdev user,id=usernet -device e1000,netdev=usernet -usb -device usb-tablet"; + "-M pc -accel tcg,thread=multi -vga std -usb -device usb-tablet"; }; } else { defQemuParams = switch (MainSettingsManager.getArch(this)) { case "ARM64" -> - "-M virt -net nic,model=e1000 -net user -device nec-usb-xhci -device usb-kbd -device usb-mouse -device VGA"; - case "PPC" -> "-M mac99 1"; + "-M virt -device nec-usb-xhci -device usb-kbd -device usb-mouse -device VGA"; + case "PPC" -> "-M mac99"; default -> - "-M pc -vga std -netdev user,id=usernet -device e1000,netdev=usernet -usb -device usb-tablet"; + "-M pc -vga std -usb -device usb-tablet"; }; } binding.title.setText(getString(R.string.new_vm)); - binding.qemu.setText(defQemuParams); + current.itemExtra = defQemuParams; String currentArch = MainSettingsManager.getArch(this); if (currentArch.equals(MainSettingsManager.X86_64_ARCH)) { - cores = Math.min(1, VMCreatorSelector.getCpuCorePosition(new CpuHelper().getCpuCores() - 1)); - binding.sbvCore.setSubtitle(Objects.requireNonNull(VMCreatorSelector.getCpuCore(currentArch, cores).get("value")).toString()); + current.cores = Math.min(1, VMCreatorSelector.getCpuCorePosition(new CpuHelper().getCpuCores() - 1)); } else if (currentArch.equals(MainSettingsManager.ARM64_ARCH)) { - cores = Math.min(2, VMCreatorSelector.getCpuCorePosition(new CpuHelper().getCpuCores() - 1)); - binding.sbvCore.setSubtitle(Objects.requireNonNull(VMCreatorSelector.getCpuCore(currentArch, cores).get("value")).toString()); - } else { - binding.sbvCore.setSubtitle("1"); + current.cores = Math.min(2, VMCreatorSelector.getCpuCorePosition(new CpuHelper().getCpuCores() - 1)); } - binding.sbvThread.setSubtitle("1"); + current.networkCard = 3; // Intel E1000 (82540EM) } private void checkVMID() { @@ -720,16 +536,18 @@ public class VMCreatorActivity extends AppCompatActivity { } private void startCreateVM() { - if (Objects.requireNonNull(binding.title.getText()).toString().isEmpty()) { + save(); + + if (current.itemName.isEmpty()) { DialogUtils.oneDialog(this, getString(R.string.oops), getString(R.string.need_set_name), getString(R.string.ok), true, R.drawable.error_96px, true, null, null); } else { String _contentDialog = ""; - if (Objects.requireNonNull(binding.qemu.getText()).toString().isEmpty()) { + if (current.itemExtra.isEmpty()) { _contentDialog = getResources().getString(R.string.qemu_params_is_empty); } if (isAllDriveEmpty()) { - if (!VMManager.isHaveADisk(Objects.requireNonNull(binding.qemu.getText()).toString())) { + if (!current.itemExtra.isEmpty()) { if (!_contentDialog.isEmpty()) { _contentDialog += "\n\n"; } @@ -756,7 +574,7 @@ public class VMCreatorActivity extends AppCompatActivity { FileUtils.writeToFile(AppConfig.maindirpath, "roms-data.json", "[]"); } - if (!VMManager.addVM(finalVmConfig(), modify ? getIntent().getIntExtra("POS", 0) : -1)) { + if (!VMManager.addVM(current, modify ? getIntent().getIntExtra("POS", 0) : -1)) { DialogUtils.oneDialog( this, getString(R.string.oops), @@ -776,7 +594,7 @@ public class VMCreatorActivity extends AppCompatActivity { showProgressDialog(getString(R.string.just_a_sec)); new Thread(() -> { - moveAllFromTemp(); + utils.moveAllFromTemp(); VmFileManager.unMarkAllPendingAdd(vmID); VmFileManager.removeAllPendingDeleteMarkFiles(vmID); @@ -796,7 +614,7 @@ public class VMCreatorActivity extends AppCompatActivity { }).start(); } - private DataMainRoms finalVmConfig() { + private void save() { current.vmID = vmID; current.itemArch = MainSettingsManager.getArch(this); @@ -804,38 +622,7 @@ public class VMCreatorActivity extends AppCompatActivity { current.itemIcon = thumbnailPath; - current.cpu = cpu; - current.cores = cores; - current.threads = threads; - current.battery = isUseBattery; - - - current.itemPath = Objects.requireNonNull(binding.drive.getText()).toString(); - current.hd1 = Objects.requireNonNull(binding.tieHd1.getText()).toString(); - - current.fda = Objects.requireNonNull(binding.tieFda.getText()).toString(); - current.fdb = Objects.requireNonNull(binding.tieFdb.getText()).toString(); - - current.imgCdrom = Objects.requireNonNull(binding.cdrom.getText()).toString(); - current.cdrom1 = Objects.requireNonNull(binding.tieCdrom1.getText()).toString(); - - current.sharedFolder = sharedFolder; - - - current.bootFrom = bootFrom; - current.isShowBootMenu = isShowBootMenu; - current.isUseLocalTime = isUseLocalTime; - - current.isUseUefi = isUseUefi; - current.isUseDefaultBios = isUseDefaultBios; - - - current.itemExtra = Objects.requireNonNull(binding.qemu.getText()).toString(); - - current.qmpPort = 8080; - - return current; } private void handleThumbnail(Uri uri) { @@ -848,7 +635,7 @@ public class VMCreatorActivity extends AppCompatActivity { if (FileUtils.isFileExists(VmFileManager.getThumbnail(vmID))) VmFileManager.markPendingDelete(VmFileManager.getThumbnail(vmID)); - String tempPath = VmFileManager.getTempPath(this, vmID, peddingTempFolder + VmFileManager.THUMBNAIL_FILE_NAME); + String tempPath = utils.getTempPath(VmFileManager.THUMBNAIL_FILE_NAME); ImageUtils.convertToPng(this, uri, tempPath); @@ -931,7 +718,7 @@ public class VMCreatorActivity extends AppCompatActivity { _filename = String.valueOf(System.currentTimeMillis()); } - String path = copyToTemp(_content_describer); + String path = utils.copyToTemp(_content_describer); String final_filename = _filename; runOnUiThread(() -> { @@ -941,7 +728,7 @@ public class VMCreatorActivity extends AppCompatActivity { return; } if (_addtodrive) { - setDrive(PENDING_SELECT_FILE_MODE, path); + current.itemPath = path; } }); } catch (Exception e) { @@ -977,7 +764,7 @@ public class VMCreatorActivity extends AppCompatActivity { null, null); } else { - setDrive(PENDING_SELECT_FILE_MODE, path); + current.itemPath = path; } }); }).start(); @@ -1096,13 +883,13 @@ public class VMCreatorActivity extends AppCompatActivity { addromnowdone = true; if (Objects.requireNonNull(getIntent().getStringExtra("romextra")).isEmpty()) { setDefault(); - binding.drive.setText(_getDiskFile); + current.itemPath = _getDiskFile; } else { if (Objects.requireNonNull(getIntent().getStringExtra("romextra")).contains(Objects.requireNonNull(getIntent().getStringExtra("finalromfilename")))) { - binding.qemu.setText(Objects.requireNonNull(getIntent().getStringExtra("romextra")).replaceAll(Objects.requireNonNull(getIntent().getStringExtra("finalromfilename")), "\"" + _getDiskFile + "\"")); + current.itemExtra = Objects.requireNonNull(getIntent().getStringExtra("romextra")).replaceAll(Objects.requireNonNull(getIntent().getStringExtra("finalromfilename")), "\"" + _getDiskFile + "\""); } else { - binding.drive.setText(_getDiskFile); - binding.qemu.setText(VmFileManager.textMarkToPath(this, vmID, Objects.requireNonNull(getIntent().getStringExtra("romextra")))); + current.itemPath = _getDiskFile; + current.itemExtra = VmFileManager.textMarkToPath(this, vmID, Objects.requireNonNull(getIntent().getStringExtra("romextra"))); } } @@ -1112,13 +899,11 @@ public class VMCreatorActivity extends AppCompatActivity { handleThumbnail(Uri.parse(getIntent().getStringExtra("romicon"))); } } else { - if (Objects.requireNonNull(binding.qemu.getText()).toString().isEmpty()) { - setDefault(); - } + if (current.itemExtra.isEmpty()) setDefault(); if (Objects.requireNonNull(binding.title.getText()).toString().isEmpty() || binding.title.getText().toString().equals("New VM")) { binding.title.setText(_filename.replace(".cvbi", "")); } - binding.drive.setText(_getDiskFile); + current.itemPath = _getDiskFile; VMManager.setArch("", this); } @@ -1202,291 +987,17 @@ public class VMCreatorActivity extends AppCompatActivity { if (!isFinishing() && !isDestroyed()) progressDialog.show(); } - private String copyToTemp(Uri uri) throws IOException { - String fileName = FileUtils.getFileNameFromUri(this, uri); - - if (fileName == null || fileName.isEmpty()) { - fileName = String.valueOf(System.currentTimeMillis()); - } - - FileUtils.copyFileFromUri(this, uri, VmFileManager.getTempPath(this, vmID, peddingTempFolder + fileName)); - return VmFileManager.getPath(vmID, fileName); - } - public String getPath(Uri uri) { return FileUtils.getPath(this, uri); } - String peddingTempFolder = "pedding/"; - - private void onFileChange(String fileName) { - markDelete(VmFileManager.getPath(vmID, fileName)); - } - - private void markDelete(String path) { - VmFileManager.markPendingDelete(path); - deleteTemp(new File(path).getName()); - } - - private void deleteTemp(String fileName) { - VmFileManager.removeTemp(this, vmID, peddingTempFolder + fileName); - } - - public void moveAllFromTemp() { - ArrayList fileList = new ArrayList<>(); - FileUtils.getAListOfAllFilesAndFoldersInADirectory(VmFileManager.getTempPath(this, vmID, peddingTempFolder), fileList); - for (int position = 0; position < fileList.size(); position++) { - FileUtils.moveToFolder(fileList.get(position), VmFileManager.getPath(vmID)); - } - - ArrayList fileListInternal = new ArrayList<>(); - FileUtils.getAListOfAllFilesAndFoldersInADirectory(VmFileManager.getInternalTempPath(this, vmID, peddingTempFolder), fileListInternal); - for (int position = 0; position < fileListInternal.size(); position++) { - FileUtils.moveToFolder(fileListInternal.get(position), VmFileManager.getPath(vmID)); - } - } - - // STORAGE LOGIC CORE - - private void setupStorageUi() { - binding.drive.setOnClickListener(v -> pickStorageFile(SELECT_DISK_0_FILE_MODE)); - binding.driveField.setOnClickListener(v -> pickStorageFile(SELECT_DISK_0_FILE_MODE)); - binding.driveField.setEndIconOnClickListener(v -> { - if (Objects.requireNonNull(binding.drive.getText()).toString().isEmpty()) { - callQcow2CreatorDialog(SELECT_DISK_0_FILE_MODE); - } else { - storageFileOptionDialog(SELECT_DISK_0_FILE_MODE); - } - }); - - - - binding.tieHd1.setOnClickListener(v -> pickStorageFile(SELECT_DISK_1_FILE_MODE)); - binding.tilHd1.setOnClickListener(v -> pickStorageFile(SELECT_DISK_1_FILE_MODE)); - binding.tilHd1.setEndIconOnClickListener(v -> { - if (Objects.requireNonNull(binding.tieHd1.getText()).toString().isEmpty()) { - callQcow2CreatorDialog(SELECT_DISK_1_FILE_MODE); - } else { - storageFileOptionDialog(SELECT_DISK_1_FILE_MODE); - } - }); - - - - if (MainSettingsManager.getArch(this).equals(MainSettingsManager.ARM64_ARCH)) { - binding.lnFloppyContainer.setVisibility(View.GONE); - } - - binding.tieFda.setOnClickListener(v -> pickStorageFile(SELECT_FLOPPY_A_FILE_MODE)); - binding.tilFda.setOnClickListener(v -> pickStorageFile(SELECT_FLOPPY_A_FILE_MODE)); - binding.tilFda.setEndIconOnClickListener(v -> setDrive(SELECT_FLOPPY_A_FILE_MODE, null)); - - binding.tieFdb.setOnClickListener(v -> pickStorageFile(SELECT_FLOPPY_B_FILE_MODE)); - binding.tilFdb.setOnClickListener(v -> pickStorageFile(SELECT_FLOPPY_B_FILE_MODE)); - binding.tilFdb.setEndIconOnClickListener(v -> setDrive(SELECT_FLOPPY_B_FILE_MODE, null)); - - - binding.cdrom.setOnClickListener(v -> pickStorageFile(SELECT_CDROM_0_FILE_MODE)); - binding.cdromField.setOnClickListener(v -> pickStorageFile(SELECT_CDROM_0_FILE_MODE)); - binding.cdromField.setEndIconOnClickListener(v -> setDrive(SELECT_CDROM_0_FILE_MODE, null)); - - binding.tieCdrom1.setOnClickListener(v -> pickStorageFile(SELECT_CDROM_1_FILE_MODE)); - binding.tilCdrom1.setOnClickListener(v -> pickStorageFile(SELECT_CDROM_1_FILE_MODE)); - binding.tilCdrom1.setEndIconOnClickListener(v -> setDrive(SELECT_CDROM_1_FILE_MODE, null)); - - - - binding.svSharedFolder.setSubTitle(AppConfig.sharedFolder); - binding.svSharedFolder.setOnCheckedChangeListener((v, isChecked) -> sharedFolder = isChecked); - } - - private final int SELECT_DISK_0_FILE_MODE = 0; - private final int SELECT_DISK_1_FILE_MODE = 1; - public final int SELECT_CDROM_0_FILE_MODE = 2; - public final int SELECT_CDROM_1_FILE_MODE = 3; - public final int SELECT_FLOPPY_A_FILE_MODE = 4; - public final int SELECT_FLOPPY_B_FILE_MODE = 5; - private int PENDING_SELECT_FILE_MODE = 0; - private String PENDING_OLD_FILE_AFTER_SELECTED_NEW_FILE = ""; - - private void pickStorageFile(int mode) { - PENDING_SELECT_FILE_MODE = mode; - PENDING_OLD_FILE_AFTER_SELECTED_NEW_FILE = Objects.requireNonNull(getPeddingStorageEditText().getText()).toString(); - - try { - if (PENDING_SELECT_FILE_MODE == SELECT_CDROM_0_FILE_MODE || PENDING_SELECT_FILE_MODE == SELECT_CDROM_1_FILE_MODE) { - if (MainSettingsManager.getBuiltInFilePicker(this)) { - builtInFilePicker(PICK_OPTICAL_FILE_MODE); - } else { - isoPicker.launch("*/*"); - } - } else if (PENDING_SELECT_FILE_MODE == SELECT_FLOPPY_A_FILE_MODE || PENDING_SELECT_FILE_MODE == SELECT_FLOPPY_B_FILE_MODE) { - if (MainSettingsManager.getBuiltInFilePicker(this)) { - builtInFilePicker(PICK_FLOPPY_FILE_MODE); - } else { - floppyPicker.launch("*/*"); - } - } else { - if (MainSettingsManager.getBuiltInFilePicker(this)) { - builtInFilePicker(PICK_DRIVE_FILE_MODE); - } else { - diskPicker.launch("*/*"); - } - } - } catch (Exception e) { - Log.e(TAG, "pickStorageFile: ", e); - IntentUtils.showErrorDialog(this); - } - } - - private void storageFileOptionDialog(int mode) { - PENDING_SELECT_FILE_MODE = mode; - - //TextInputLayout peddingTextInputLayout = getPeddingStorageInputLayout(); - TextInputEditText peddingTextInputEditText = getPeddingStorageEditText(); - - DialogUtils.threeDialog(this, - getString(R.string.change_hard_drive), - getString(R.string.do_you_want_to_change_create_or_remove), - getString(R.string.change), getString(R.string.remove), - getString(R.string.create), - true, - R.drawable.hard_drive_24px, - true, - () -> pickStorageFile(mode), - () -> { - String path = new File(Objects.requireNonNull(peddingTextInputEditText.getText()).toString()).getAbsolutePath(); - if (path.startsWith(VmFileManager.quickGetPath(vmID))) { - ProgressDialog progressDialog1 = new ProgressDialog(this); - progressDialog1.show(); - new Thread(() -> { - markDelete(path); - runOnUiThread(progressDialog1::reset); - }).start(); - } - - setDrive(mode, ""); - }, - () -> { - if (createVMFolder(true)) { - callQcow2CreatorDialog(PENDING_SELECT_FILE_MODE); - } - }, null); - } - - private void callQcow2CreatorDialog(int mode) { - PENDING_SELECT_FILE_MODE = mode; - - TextInputLayout peddingTextInputLayout = getPeddingStorageInputLayout(); - TextInputEditText peddingTextInputEditText = getPeddingStorageEditText(); - - CreateImageDialogFragment dialogFragment = new CreateImageDialogFragment(); - dialogFragment.folder = VmFileManager.getPath(vmID); - dialogFragment.customRom = true; - dialogFragment.filename = Objects.requireNonNull(binding.title.getText()).toString(); - dialogFragment.drive = peddingTextInputEditText; - dialogFragment.driveLayout = peddingTextInputLayout; - dialogFragment.isMarkPendingAdd = true; - dialogFragment.show(getSupportFragmentManager(), "CreateImageDialogFragment"); - } - - private void setRemovableDriveEndIconOnClickListener(int mode, TextInputLayout textInputLayout) { - textInputLayout.setEndIconOnClickListener(v -> { - PENDING_SELECT_FILE_MODE = mode; - PENDING_OLD_FILE_AFTER_SELECTED_NEW_FILE = Objects.requireNonNull(getPeddingStorageEditText().getText()).toString(); - setDrive(mode, null); - }); - } - - private void setDrive(Integer mode, String path) { - if (isFileReadyinUse(path)) { - DialogUtils.oopsDialog(this, getString(R.string.vm_creator_this_file_is_already_in_use_content)); - deleteTemp(new File(path).getName()); - return; - } - - if (mode != null) PENDING_SELECT_FILE_MODE = mode; - - TextInputLayout peddingTextInputLayout = getPeddingStorageInputLayout(); - TextInputEditText peddingTextInputEditText = getPeddingStorageEditText(); - - peddingTextInputEditText.setText(path != null ? path : ""); - - if (path == null || path.isEmpty()) { - if (PENDING_SELECT_FILE_MODE == SELECT_CDROM_0_FILE_MODE || PENDING_SELECT_FILE_MODE == SELECT_CDROM_1_FILE_MODE || PENDING_SELECT_FILE_MODE == SELECT_FLOPPY_A_FILE_MODE || PENDING_SELECT_FILE_MODE == SELECT_FLOPPY_B_FILE_MODE) { - peddingTextInputLayout.setEndIconMode(TextInputLayout.END_ICON_NONE); - } else { - peddingTextInputLayout.setEndIconDrawable(R.drawable.add_24px); - } - } else { - if (PENDING_SELECT_FILE_MODE == SELECT_CDROM_0_FILE_MODE || PENDING_SELECT_FILE_MODE == SELECT_CDROM_1_FILE_MODE || PENDING_SELECT_FILE_MODE == SELECT_FLOPPY_A_FILE_MODE || PENDING_SELECT_FILE_MODE == SELECT_FLOPPY_B_FILE_MODE) { - peddingTextInputLayout.setEndIconMode(TextInputLayout.END_ICON_CUSTOM); - peddingTextInputLayout.setEndIconDrawable(R.drawable.close_24px); - setRemovableDriveEndIconOnClickListener(PENDING_SELECT_FILE_MODE, peddingTextInputLayout); - } else { - peddingTextInputLayout.setEndIconDrawable(R.drawable.more_vert_24px); - } - } - - if (!PENDING_OLD_FILE_AFTER_SELECTED_NEW_FILE.isEmpty()) { - onFileChange(new File(PENDING_OLD_FILE_AFTER_SELECTED_NEW_FILE).getName()); - PENDING_OLD_FILE_AFTER_SELECTED_NEW_FILE = ""; - } - } - - private TextInputLayout getPeddingStorageInputLayout() { - if (PENDING_SELECT_FILE_MODE == SELECT_DISK_1_FILE_MODE) { - return binding.tilHd1; - } else if (PENDING_SELECT_FILE_MODE == SELECT_CDROM_0_FILE_MODE) { - return binding.cdromField; - } else if (PENDING_SELECT_FILE_MODE == SELECT_CDROM_1_FILE_MODE) { - return binding.tilCdrom1; - } else if (PENDING_SELECT_FILE_MODE == SELECT_FLOPPY_A_FILE_MODE) { - return binding.tilFda; - } else if (PENDING_SELECT_FILE_MODE == SELECT_FLOPPY_B_FILE_MODE) { - return binding.tilFdb; - } else { - return binding.driveField; - } - } - - private TextInputEditText getPeddingStorageEditText() { - if (PENDING_SELECT_FILE_MODE == SELECT_DISK_1_FILE_MODE) { - return binding.tieHd1; - } else if (PENDING_SELECT_FILE_MODE == SELECT_CDROM_0_FILE_MODE) { - return binding.cdrom; - } else if (PENDING_SELECT_FILE_MODE == SELECT_CDROM_1_FILE_MODE) { - return binding.tieCdrom1; - } else if (PENDING_SELECT_FILE_MODE == SELECT_FLOPPY_A_FILE_MODE) { - return binding.tieFda; - } else if (PENDING_SELECT_FILE_MODE == SELECT_FLOPPY_B_FILE_MODE) { - return binding.tieFdb; - } else { - return binding.drive; - } - } - private boolean isAllDriveEmpty() { - return (Objects.requireNonNull(binding.drive.getText()).toString().isEmpty()) && - (Objects.requireNonNull(binding.tieHd1.getText()).toString().isEmpty()) && - (Objects.requireNonNull(binding.cdrom.getText()).toString().isEmpty()) && - (Objects.requireNonNull(binding.tieCdrom1.getText()).toString().isEmpty()) && - (Objects.requireNonNull(binding.tieFda.getText()).toString().isEmpty()) && - (Objects.requireNonNull(binding.tieFdb.getText()).toString().isEmpty()); - } - - private boolean isFileReadyinUse(String path) { - if (path == null || path.trim().isEmpty()) return false; - - String paramCollection = Objects.requireNonNull(binding.drive.getText()).toString(); - paramCollection += "\n" + Objects.requireNonNull(binding.tieHd1.getText()); - paramCollection += "\n" + Objects.requireNonNull(binding.cdrom.getText()); - paramCollection += "\n" + Objects.requireNonNull(binding.tieCdrom1.getText()); - paramCollection += "\n" + Objects.requireNonNull(binding.tieFda.getText()); - paramCollection += "\n" + Objects.requireNonNull(binding.tieFdb.getText()); - paramCollection += "\n" + Objects.requireNonNull(binding.qemu.getText()); - - return paramCollection.contains(path); + return (current.itemPath.isEmpty() && + current.hd1.isEmpty() && + current.imgCdrom.isEmpty() && + current.cdrom1.isEmpty() && + current.fda.isEmpty() && + current.fdb.isEmpty()); } private void checkCreateCommandConfig() { @@ -1508,23 +1019,4 @@ public class VMCreatorActivity extends AppCompatActivity { }); } } - - final int PICK_DRIVE_FILE_MODE = 0; - final int PICK_OPTICAL_FILE_MODE = 1; - final int PICK_FLOPPY_FILE_MODE = 2; - - private void builtInFilePicker(int mode) { - FilePickerDialog filePickerDialog = new FilePickerDialog(); - - int finalMode; - if (mode == PICK_DRIVE_FILE_MODE) { - finalMode = filePickerDialog.FIT_PICK_DISK_FILE_MODE; - } else if (mode == PICK_OPTICAL_FILE_MODE) { - finalMode = filePickerDialog.FIT_PICK_OPTICAL_FILE_MODE; - } else { - finalMode = filePickerDialog.FIT_PICK_FLOPPY_FILE_MODE; - } - - filePickerDialog.pick(this, finalMode, (path -> handleFile(Uri.fromFile(new File(path))))); - } } diff --git a/app/src/main/java/com/vectras/vm/creator/VMCreatorSelector.java b/app/src/main/java/com/vectras/vm/creator/VMCreatorSelector.java index e5bbd7b..9e964c8 100644 --- a/app/src/main/java/com/vectras/vm/creator/VMCreatorSelector.java +++ b/app/src/main/java/com/vectras/vm/creator/VMCreatorSelector.java @@ -2,26 +2,13 @@ package com.vectras.vm.creator; import android.app.Activity; import android.content.Context; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ImageView; -import android.widget.TextView; -import androidx.annotation.NonNull; -import androidx.appcompat.app.AlertDialog; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - -import com.google.android.material.color.MaterialColors; import com.vectras.vm.R; -import com.vectras.vm.databinding.DialogListSelectorLayoutBinding; -import com.vectras.vm.databinding.SimpleLayoutListViewWithCheckBinding; +import com.vectras.vm.creator.configs.ListManager; import com.vectras.vm.utils.UniversalPickerDialog; import java.util.ArrayList; import java.util.HashMap; -import java.util.Objects; public class VMCreatorSelector { private static final String TAG = "VMCreatorSelector"; @@ -54,6 +41,14 @@ public class VMCreatorSelector { showDialog(activity, ListManager.threads(arch), position, callback, activity.getString(R.string.thread)); } + public static void networkCard(Activity activity, int position, UniversalPickerDialog.UniversalPickerDialogCallback callback) { + showDialog(activity, ListManager.networkCards(activity), position, callback, activity.getString(R.string.network_card)); + } + + public static HashMap getNetworkCard(Context context, int position) { + return ListManager.networkCards(context).get(position); + } + public static HashMap getBootFrom(Context context, int position) { return ListManager.bootFrom(context).get(position); } diff --git a/app/src/main/java/com/vectras/vm/creator/ListManager.java b/app/src/main/java/com/vectras/vm/creator/configs/ListManager.java similarity index 82% rename from app/src/main/java/com/vectras/vm/creator/ListManager.java rename to app/src/main/java/com/vectras/vm/creator/configs/ListManager.java index a46766a..bc70331 100644 --- a/app/src/main/java/com/vectras/vm/creator/ListManager.java +++ b/app/src/main/java/com/vectras/vm/creator/configs/ListManager.java @@ -1,4 +1,4 @@ -package com.vectras.vm.creator; +package com.vectras.vm.creator.configs; import android.content.Context; @@ -145,4 +145,28 @@ public class ListManager { return list; } + + public static ArrayList> networkCards(Context context) { + ArrayList> list = new ArrayList<>(); + UniversalPickerDialog.putToList(list, context.getString(R.string.none), ""); + UniversalPickerDialog.putToList(list, context.getString(R.string.intel_e1000e_82574l), "e1000e"); + UniversalPickerDialog.putToList(list, context.getString(R.string.intel_igb_82576), "igb"); + UniversalPickerDialog.putToList(list, context.getString(R.string.intel_e1000_82540em), "e1000"); + UniversalPickerDialog.putToList(list, context.getString(R.string.intel_e1000_82545em), "e1000-82545em"); + UniversalPickerDialog.putToList(list, context.getString(R.string.intel_e1000_82544gc), "e1000-82544gc"); + UniversalPickerDialog.putToList(list, context.getString(R.string.intel_i82801), "i82801"); + UniversalPickerDialog.putToList(list, context.getString(R.string.intel_i82562), "i82562"); + UniversalPickerDialog.putToList(list, context.getString(R.string.intel_i82559er), "i82559er"); + UniversalPickerDialog.putToList(list, context.getString(R.string.intel_i82558b), "i82558b"); + UniversalPickerDialog.putToList(list, context.getString(R.string.intel_i82557c), "i82557c"); + UniversalPickerDialog.putToList(list, context.getString(R.string.intel_i82551), "i82551"); + UniversalPickerDialog.putToList(list, context.getString(R.string.intel_i82550), "i82550"); + UniversalPickerDialog.putToList(list, context.getString(R.string.realtek_rtl8139), "rtl8139"); + UniversalPickerDialog.putToList(list, context.getString(R.string.amd_pcnet), "pcnet"); + UniversalPickerDialog.putToList(list, context.getString(R.string.novell_ne2000), "ne2k_pci"); + UniversalPickerDialog.putToList(list, context.getString(R.string.vmware_vmxnet3), "vmxnet3"); + UniversalPickerDialog.putToList(list, context.getString(R.string.virtio_net), "virtio-net-pci"); + UniversalPickerDialog.putToList(list, context.getString(R.string.virtio_net_transitional), "virtio-net-pci-transitional"); + return list; + } } diff --git a/app/src/main/java/com/vectras/vm/creator/editor/AdvancedConfigsDialog.java b/app/src/main/java/com/vectras/vm/creator/editor/AdvancedConfigsDialog.java new file mode 100644 index 0000000..ef7633f --- /dev/null +++ b/app/src/main/java/com/vectras/vm/creator/editor/AdvancedConfigsDialog.java @@ -0,0 +1,108 @@ +package com.vectras.vm.creator.editor; + +import android.content.DialogInterface; +import android.content.Intent; +import android.os.Bundle; +import android.widget.FrameLayout; + +import androidx.annotation.NonNull; + +import com.google.android.material.bottomsheet.BottomSheetBehavior; +import com.google.android.material.bottomsheet.BottomSheetDialog; +import com.google.android.material.bottomsheet.BottomSheetDialogFragment; +import com.vectras.vm.creator.QemuParamsEditorActivity; +import com.vectras.vm.databinding.CreatorAdvancedDialogBinding; +import com.vectras.vm.main.vms.DataMainRoms; + +import java.util.Objects; + +public class AdvancedConfigsDialog extends BottomSheetDialogFragment { + final String TAG = "AdvancedConfigsDialog"; + + String vmId; + DataMainRoms configs; + + public void setConfigs(DataMainRoms configs) { + this.configs = configs; + if (configs != null) { + vmId = configs.vmID; + } + } + + CreatorAdvancedDialogBinding binding; + + boolean iseditparams; + + @NonNull + @Override + public BottomSheetDialog onCreateDialog(Bundle savedInstanceState) { + binding = CreatorAdvancedDialogBinding.inflate(getLayoutInflater()); + + BottomSheetDialog dialog = new BottomSheetDialog(requireActivity()); + dialog.setContentView(binding.getRoot()); + + initialize(); + + dialog.setOnShowListener(d -> { + BottomSheetBehavior behavior = dialog.getBehavior(); + behavior.setState(BottomSheetBehavior.STATE_EXPANDED); + behavior.setSkipCollapsed(true); + }); + + return dialog; + } + + public void onResume() { + super.onResume(); + if (iseditparams) { + iseditparams = false; + binding.qemu.setText(QemuParamsEditorActivity.result); + } + } + + AdvancedConfigsDialogCallback callback; + + public void setOnDismiss(AdvancedConfigsDialogCallback callback) { + this.callback = callback; + } + + public interface AdvancedConfigsDialogCallback { + void onDismiss(DataMainRoms configs); + } + + public void onDismiss(@NonNull DialogInterface dialogInterface) { + super.onDismiss(dialogInterface); + if (callback != null) { + save(); + callback.onDismiss(configs); + } + } + + private void initialize() { + binding.qemu.setOnClickListener(v -> { + iseditparams = true; + Intent intent = new Intent(); + intent.setClass(requireContext(), QemuParamsEditorActivity.class); + intent.putExtra("content", Objects.requireNonNull(binding.qemu.getText()).toString()); + startActivity(intent); + }); + + binding.qemuField.setOnClickListener(v -> { + iseditparams = true; + Intent intent = new Intent(); + intent.setClass(requireContext(), QemuParamsEditorActivity.class); + intent.putExtra("content", Objects.requireNonNull(binding.qemu.getText()).toString()); + startActivity(intent); + }); + + load(); + } + + private void load() { + binding.qemu.setText(configs.itemExtra); + } + + private void save() { + configs.itemExtra = Objects.requireNonNull(binding.qemu.getText()).toString(); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/vectras/vm/creator/editor/BoardConfigsDialog.java b/app/src/main/java/com/vectras/vm/creator/editor/BoardConfigsDialog.java new file mode 100644 index 0000000..8956bf6 --- /dev/null +++ b/app/src/main/java/com/vectras/vm/creator/editor/BoardConfigsDialog.java @@ -0,0 +1,102 @@ +package com.vectras.vm.creator.editor; + +import android.content.DialogInterface; +import android.os.Bundle; +import android.widget.FrameLayout; + +import androidx.annotation.NonNull; + +import com.google.android.material.bottomsheet.BottomSheetBehavior; +import com.google.android.material.bottomsheet.BottomSheetDialog; +import com.google.android.material.bottomsheet.BottomSheetDialogFragment; +import com.vectras.qemu.MainSettingsManager; +import com.vectras.vm.creator.VMCreatorSelector; +import com.vectras.vm.databinding.CreatorBoardDialogBinding; +import com.vectras.vm.main.vms.DataMainRoms; + +import java.util.Objects; + +public class BoardConfigsDialog extends BottomSheetDialogFragment { + final String TAG = "BoardConfigsDialog"; + + String vmId; + DataMainRoms configs; + public void setConfigs(DataMainRoms configs) { + this.configs = configs; + if (configs != null) { + vmId = configs.vmID; + } + } + + CreatorBoardDialogBinding binding; + + @NonNull + @Override + public BottomSheetDialog onCreateDialog(Bundle savedInstanceState) { + binding = CreatorBoardDialogBinding.inflate(getLayoutInflater()); + + BottomSheetDialog dialog = new BottomSheetDialog(requireActivity()); + dialog.setContentView(binding.getRoot()); + + initialize(); + + dialog.setOnShowListener(d -> { + BottomSheetBehavior behavior = dialog.getBehavior(); + behavior.setState(BottomSheetBehavior.STATE_EXPANDED); + behavior.setSkipCollapsed(true); + }); + + return dialog; + } + + BoardConfigsDialogCallback callback; + + public void setOnDismiss(BoardConfigsDialogCallback callback) { + this.callback = callback; + } + + public interface BoardConfigsDialogCallback { + void onDismiss(DataMainRoms configs); + } + + public void onDismiss(@NonNull DialogInterface dialogInterface) { + super.onDismiss(dialogInterface); + if (callback != null) { + save(); + callback.onDismiss(configs); + } + } + + private void initialize() { + binding.sbvCpu.setOnClickListener(v -> VMCreatorSelector.cpu(requireActivity(), MainSettingsManager.getArch(requireContext()), configs.cpu, ((position, name, value) -> { + configs.cpu = position; + binding.sbvCpu.setSubtitle(name); + }))); + + binding.sbvCore.setOnClickListener(v -> VMCreatorSelector.cpuCore(requireActivity(), MainSettingsManager.getArch(requireContext()), configs.cores, ((position, name, value) -> { + configs.cores = position; + binding.sbvCore.setSubtitle(name); + }))); + + binding.sbvThread.setOnClickListener(v -> VMCreatorSelector.cpuThread(requireActivity(), MainSettingsManager.getArch(requireContext()), configs.threads, ((position, name, value) -> { + configs.threads = position; + binding.sbvThread.setSubtitle(name); + }))); + + load(); + } + + private void load() { + binding.sbvCpu.setSubtitle(Objects.requireNonNull(VMCreatorSelector.getCpu(requireContext(), MainSettingsManager.getArch(requireContext()), configs.cpu).get("name")).toString()); + + binding.sbvCore.setSubtitle(Objects.requireNonNull(VMCreatorSelector.getCpuCore(MainSettingsManager.getArch(requireContext()), configs.cores).get("value")).toString()); + + binding.sbvThread.setSubtitle(String.valueOf(configs.threads + 1)); + + binding.cbvBattery.setChecked(configs.battery); + } + + private void save() { + configs.battery = binding.cbvBattery.isChecked(); + } +} diff --git a/app/src/main/java/com/vectras/vm/creator/editor/FirmwareConfigsDialog.java b/app/src/main/java/com/vectras/vm/creator/editor/FirmwareConfigsDialog.java new file mode 100644 index 0000000..0f83e13 --- /dev/null +++ b/app/src/main/java/com/vectras/vm/creator/editor/FirmwareConfigsDialog.java @@ -0,0 +1,124 @@ +package com.vectras.vm.creator.editor; + +import android.content.DialogInterface; +import android.os.Bundle; +import android.view.View; +import android.widget.FrameLayout; + +import androidx.annotation.NonNull; +import androidx.appcompat.content.res.AppCompatResources; + +import com.google.android.material.bottomsheet.BottomSheetBehavior; +import com.google.android.material.bottomsheet.BottomSheetDialog; +import com.google.android.material.bottomsheet.BottomSheetDialogFragment; +import com.vectras.qemu.MainSettingsManager; +import com.vectras.vm.R; +import com.vectras.vm.creator.VMCreatorSelector; +import com.vectras.vm.databinding.CreatorFirmwareDialogBinding; +import com.vectras.vm.main.vms.DataMainRoms; + +import java.util.Objects; + +public class FirmwareConfigsDialog extends BottomSheetDialogFragment { + final String TAG = "FirmwareConfigsDialog"; + + String vmId; + DataMainRoms configs; + + public void setConfigs(DataMainRoms configs) { + this.configs = configs; + if (configs != null) { + vmId = configs.vmID; + } + } + + CreatorFirmwareDialogBinding binding; + + @NonNull + @Override + public BottomSheetDialog onCreateDialog(Bundle savedInstanceState) { + binding = CreatorFirmwareDialogBinding.inflate(getLayoutInflater()); + + BottomSheetDialog dialog = new BottomSheetDialog(requireActivity()); + dialog.setContentView(binding.getRoot()); + + initialize(); + + dialog.setOnShowListener(d -> { + BottomSheetBehavior behavior = dialog.getBehavior(); + behavior.setState(BottomSheetBehavior.STATE_EXPANDED); + behavior.setSkipCollapsed(true); + }); + + return dialog; + } + + FirmwareConfigsDialogCallback callback; + + public void setOnDismiss(FirmwareConfigsDialogCallback callback) { + this.callback = callback; + } + + public interface FirmwareConfigsDialogCallback { + void onDismiss(DataMainRoms configs); + } + + public void onDismiss(@NonNull DialogInterface dialogInterface) { + super.onDismiss(dialogInterface); + if (callback != null) { + save(); + callback.onDismiss(configs); + } + } + + private void initialize() { + binding.sbvBootfrom.setOnClickListener(v -> VMCreatorSelector.bootFrom(requireActivity(), configs.bootFrom, ((position, name, value) -> { + configs.bootFrom = position; + binding.sbvBootfrom.setSubtitle(name); + }))); + + binding.cbvShowbootmenu.setOnCheckedChangeListener((v, isChecked) -> configs.isShowBootMenu = isChecked); + + binding.cbvUselocaltime.setOnCheckedChangeListener((v, isChecked) -> configs.isUseLocalTime = isChecked); + + if (!MainSettingsManager.getArch(requireContext()).equals("X86_64")) { + binding.cbvUseuefi.setVisibility(View.GONE); + binding.cbvUseDefaultBios.setBackground(AppCompatResources.getDrawable(requireContext(), R.drawable.object_shape_single_high)); + } else { + binding.cbvUseuefi.setOnCheckedChangeListener((v, isChecked) -> configs.isUseUefi = isChecked); + } + + binding.cbvUseDefaultBios.setOnCheckedChangeListener((v, isChecked) -> { + configs.isUseDefaultBios = isChecked; + binding.cbvUseuefi.setEnabled(isChecked); + }); + + load(); + } + + private void load() { + binding.sbvBootfrom.setSubtitle(Objects.requireNonNull(VMCreatorSelector.getBootFrom(requireActivity(), configs.bootFrom).get("name")).toString()); + + binding.cbvShowbootmenu.setChecked(configs.isShowBootMenu); + + if (MainSettingsManager.getArch(requireContext()).equals(MainSettingsManager.X86_64_ARCH)) { + binding.cbvUseuefi.setChecked(configs.isUseUefi); + } else { + binding.cbvUseuefi.setVisibility(View.GONE); + } + + binding.cbvUseDefaultBios.setChecked(configs.isUseDefaultBios); + + binding.cbvUseuefi.setEnabled(configs.isUseDefaultBios); + + binding.cbvUselocaltime.setChecked(configs.isUseLocalTime); + } + + private void save() { + configs.isShowBootMenu = binding.cbvShowbootmenu.isChecked(); + + configs.isUseUefi = binding.cbvUseuefi.isChecked(); + configs.isUseDefaultBios = binding.cbvUseDefaultBios.isChecked(); + configs.isUseLocalTime = binding.cbvUselocaltime.isChecked(); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/vectras/vm/creator/editor/NetworkConfigsDialog.java b/app/src/main/java/com/vectras/vm/creator/editor/NetworkConfigsDialog.java new file mode 100644 index 0000000..6f743ca --- /dev/null +++ b/app/src/main/java/com/vectras/vm/creator/editor/NetworkConfigsDialog.java @@ -0,0 +1,86 @@ +package com.vectras.vm.creator.editor; + +import android.content.DialogInterface; +import android.os.Bundle; +import android.widget.FrameLayout; + +import androidx.annotation.NonNull; + +import com.google.android.material.bottomsheet.BottomSheetBehavior; +import com.google.android.material.bottomsheet.BottomSheetDialog; +import com.google.android.material.bottomsheet.BottomSheetDialogFragment; +import com.vectras.qemu.MainSettingsManager; +import com.vectras.vm.creator.VMCreatorSelector; +import com.vectras.vm.databinding.CreatorNetworkDialogBinding; +import com.vectras.vm.main.vms.DataMainRoms; + +import java.util.Objects; + +public class NetworkConfigsDialog extends BottomSheetDialogFragment { + final String TAG = "NetworkConfigsDialog"; + + String vmId; + DataMainRoms configs; + public void setConfigs(DataMainRoms configs) { + this.configs = configs; + if (configs != null) { + vmId = configs.vmID; + } + } + + CreatorNetworkDialogBinding binding; + + @NonNull + @Override + public BottomSheetDialog onCreateDialog(Bundle savedInstanceState) { + binding = CreatorNetworkDialogBinding.inflate(getLayoutInflater()); + + BottomSheetDialog dialog = new BottomSheetDialog(requireActivity()); + dialog.setContentView(binding.getRoot()); + + initialize(); + + dialog.setOnShowListener(d -> { + BottomSheetBehavior behavior = dialog.getBehavior(); + behavior.setState(BottomSheetBehavior.STATE_EXPANDED); + behavior.setSkipCollapsed(true); + }); + + return dialog; + } + + NetworkConfigsDialogCallback callback; + + public void setOnDismiss(NetworkConfigsDialogCallback callback) { + this.callback = callback; + } + + public interface NetworkConfigsDialogCallback { + void onDismiss(DataMainRoms configs); + } + + public void onDismiss(@NonNull DialogInterface dialogInterface) { + super.onDismiss(dialogInterface); + if (callback != null) { + save(); + callback.onDismiss(configs); + } + } + + private void initialize() { + binding.sbvCardType.setOnClickListener(v -> VMCreatorSelector.networkCard(requireActivity(), configs.networkCard, ((position, name, value) -> { + configs.networkCard = position; + binding.sbvCardType.setSubtitle(name); + }))); + + load(); + } + + private void load() { + binding.sbvCardType.setSubtitle(Objects.requireNonNull(VMCreatorSelector.getNetworkCard(requireActivity(), configs.networkCard).get("name")).toString()); + } + + private void save() { + // It may be used in subsequent versions. + } +} \ No newline at end of file diff --git a/app/src/main/java/com/vectras/vm/creator/editor/StorageConfigsDialog.java b/app/src/main/java/com/vectras/vm/creator/editor/StorageConfigsDialog.java new file mode 100644 index 0000000..fbfa576 --- /dev/null +++ b/app/src/main/java/com/vectras/vm/creator/editor/StorageConfigsDialog.java @@ -0,0 +1,569 @@ +package com.vectras.vm.creator.editor; + +import android.annotation.SuppressLint; +import android.content.DialogInterface; +import android.net.Uri; +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.widget.FrameLayout; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.annotation.NonNull; + +import com.google.android.material.bottomsheet.BottomSheetBehavior; +import com.google.android.material.bottomsheet.BottomSheetDialog; +import com.google.android.material.bottomsheet.BottomSheetDialogFragment; +import com.google.android.material.textfield.TextInputEditText; +import com.google.android.material.textfield.TextInputLayout; +import com.vectras.qemu.MainSettingsManager; +import com.vectras.vm.AppConfig; +import com.vectras.vm.Fragment.CreateImageDialogFragment; +import com.vectras.vm.R; +import com.vectras.vm.creator.utils.CreatorUtils; +import com.vectras.vm.databinding.CreatorStorageDialogBinding; +import com.vectras.vm.file.FilePickerDialog; +import com.vectras.vm.main.vms.DataMainRoms; +import com.vectras.vm.manager.FormatManager; +import com.vectras.vm.manager.VmFileManager; +import com.vectras.vm.utils.DialogUtils; +import com.vectras.vm.utils.FileUtils; +import com.vectras.vm.utils.IntentUtils; +import com.vectras.vm.utils.ProgressDialog; + +import java.io.File; +import java.util.Objects; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +public class StorageConfigsDialog extends BottomSheetDialogFragment { + final String TAG = "StorageConfigsDialog"; + + String vmId; + DataMainRoms configs; + public void setConfigs(DataMainRoms configs) { + this.configs = configs; + if (configs != null) { + vmId = configs.vmID; + if (isAdded()) utils = new CreatorUtils(requireActivity(), vmId); + } + } + + CreatorStorageDialogBinding binding; + private final ExecutorService executor = Executors.newSingleThreadExecutor(); + private CreatorUtils utils; + + @NonNull + @Override + public BottomSheetDialog onCreateDialog(Bundle savedInstanceState) { + binding = CreatorStorageDialogBinding.inflate(getLayoutInflater()); + + utils = new CreatorUtils(requireActivity(), vmId); + + BottomSheetDialog dialog = new BottomSheetDialog(requireActivity()); + dialog.setContentView(binding.getRoot()); + + initialize(); + + dialog.setOnShowListener(d -> { + BottomSheetBehavior behavior = dialog.getBehavior(); + behavior.setState(BottomSheetBehavior.STATE_EXPANDED); + behavior.setSkipCollapsed(true); + }); + + return dialog; + } + + StorageConfigsDialogCallback callback; + + public void setOnDismiss(StorageConfigsDialogCallback callback) { + this.callback = callback; + } + + public interface StorageConfigsDialogCallback { + void onDismiss(DataMainRoms configs); + } + + public void onDismiss(@NonNull DialogInterface dialogInterface) { + super.onDismiss(dialogInterface); + if (callback != null) { + save(); + callback.onDismiss(configs); + } + } + + private final ActivityResultLauncher diskPicker = + registerForActivityResult(new ActivityResultContracts.GetContent(), uri -> { + if (uri == null) return; + handleDiskFile(uri); + }); + + @SuppressLint("SetTextI18n") + private final ActivityResultLauncher isoPicker = + registerForActivityResult(new ActivityResultContracts.GetContent(), uri -> { + if (uri == null) return; + + String fileName = FileUtils.getFileNameFromUri(requireActivity(), uri); + if (fileName != null && !fileName.isEmpty() && !FormatManager.isOpticalFileFormat(fileName)) { + DialogUtils.twoDialog(requireActivity(), getString(R.string.problem_has_been_detected), getString(R.string.file_format_is_not_supported_optical_drive), getResources().getString(R.string.continuetext), getResources().getString(R.string.cancel), true, R.drawable.album_24px, true, + () -> handleFile(uri), null, null); + } else { + handleFile(uri); + } + }); + + + @SuppressLint("SetTextI18n") + private final ActivityResultLauncher floppyPicker = + registerForActivityResult(new ActivityResultContracts.GetContent(), uri -> { + if (uri == null) return; + + String fileName = FileUtils.getFileNameFromUri(requireActivity(), uri); + if (fileName != null && !fileName.isEmpty() && !FormatManager.isFloppyFileFormat(fileName)) { + DialogUtils.twoDialog(requireActivity(), getString(R.string.problem_has_been_detected), getString(R.string.file_format_is_not_supported_floppy_drive), getResources().getString(R.string.continuetext), getResources().getString(R.string.cancel), true, R.drawable.save_24px, true, + () -> handleFile(uri), null, null); + } else { + handleFile(uri); + } + }); + + + private void handleFile(Uri uri) { + if (MainSettingsManager.copyFile(requireActivity())) { + utils.showProgressDialog(getString(R.string.copying_file)); + + executor.execute(() -> { + try { + + String path = utils.copyToTemp(uri); + + requireActivity().runOnUiThread(() -> setDrive(PENDING_SELECT_FILE_MODE, path)); + } catch (Exception e) { + requireActivity().runOnUiThread(() -> DialogUtils.oneDialog(requireActivity(), + getString(R.string.oops), + getString(R.string.unable_to_copy_file_content), + getString(R.string.ok), + true, + R.drawable.warning_48px, + true, + null, + null)); + Log.e(TAG, "isoPicker: " + e.getMessage()); + } finally { + requireActivity().runOnUiThread(() -> utils.dissmissProgressDialog()); + } + }); + } else { + executor.execute(() -> { + CreatorUtils.FilePathData filePathData = utils.getFilePath(uri); + + if (!filePathData.isValid) { + requireActivity().runOnUiThread(() -> DialogUtils.oneDialog(requireActivity(), + getString(R.string.problem_has_been_detected), + getString(R.string.invalid_file_path_content), + getString(R.string.ok), + true, + R.drawable.warning_48px, + true, + null, + null) + ); + } else { + requireActivity().runOnUiThread(() -> utils.showProgressDialog(getString(R.string.just_a_moment))); + requireActivity().runOnUiThread(() -> { + setDrive(PENDING_SELECT_FILE_MODE, new File(filePathData.path).getAbsolutePath()); + utils.dissmissProgressDialog(); + }); + } + }); + } + } + + private void handleDiskFile(Uri uri) { + ProgressDialog progressDialog1 = new ProgressDialog(requireActivity()); + progressDialog1.show(); + new Thread(() -> { + CreatorUtils.FilePathData filePathData = utils.getFilePath(uri); + + if (filePathData.isValid) { + requireActivity().runOnUiThread(() -> { + progressDialog1.reset(); + + if (FormatManager.isHardDriveFileFormat(filePathData.name)) { + startHandleHardDriveFile(uri); + } else { + DialogUtils.twoDialog(requireActivity(), getString(R.string.problem_has_been_detected), getString(R.string.file_format_is_not_supported_hard_drive), getResources().getString(R.string.continuetext), getResources().getString(R.string.cancel), true, R.drawable.hard_drive_24px, true, + () -> startHandleHardDriveFile(uri), null, null); + } + }); + } else { + requireActivity().runOnUiThread(() -> startHandleHardDriveFile(uri)); + } + }).start(); + } + + @SuppressLint("SetTextI18n") + private void startHandleHardDriveFile(Uri _content_describer) { + if (MainSettingsManager.copyFile(requireActivity())) { + + if (requireActivity().isFinishing() || requireActivity().isDestroyed()) return; + utils.showProgressDialog(getString(R.string.copying_file)); + + executor.execute(() -> { + try { + String _filename = FileUtils.getFileNameFromUri(requireActivity(), _content_describer); + if (_filename == null || _filename.isEmpty()) { + _filename = String.valueOf(System.currentTimeMillis()); + } + + String path = utils.copyToTemp(_content_describer); + + String final_filename = _filename; + requireActivity().runOnUiThread(() -> { + if (requireActivity().isFinishing() || requireActivity().isDestroyed()) { + if (!vmId.isEmpty()) + FileUtils.delete(new File(VmFileManager.getPath(vmId, final_filename))); + return; + } + + setDrive(PENDING_SELECT_FILE_MODE, path); + }); + } catch (Exception e) { + requireActivity().runOnUiThread(() -> DialogUtils.oneDialog(requireActivity(), + getString(R.string.oops), + getString(R.string.unable_to_copy_hard_drive_file_content), + getString(R.string.ok), + true, + R.drawable.warning_48px, + true, + null, + null)); + } finally { + requireActivity().runOnUiThread(() -> utils.dissmissProgressDialog()); + } + }); + } else { + ProgressDialog progressDialog1 = new ProgressDialog(requireActivity()); + progressDialog1.show(); + new Thread(() -> { + String path = FileUtils.getPath(requireContext(), _content_describer); + requireActivity().runOnUiThread(() -> { + progressDialog1.reset(); + + if (!FileUtils.isValidFilePath(requireActivity(), path, false)) { + DialogUtils.oneDialog(requireActivity(), + getString(R.string.problem_has_been_detected), + getString(R.string.invalid_file_path_content), + getString(R.string.ok), + true, + R.drawable.warning_48px, + true, + null, + null); + } else { + setDrive(PENDING_SELECT_FILE_MODE, path); + } + }); + }).start(); + } + } + + private void onFileChange(String fileName) { + utils.markDelete(VmFileManager.getPath(vmId, fileName)); + } + + // STORAGE LOGIC CORE + + private void initialize() { + binding.drive.setOnClickListener(v -> pickStorageFile(SELECT_DISK_0_FILE_MODE)); + binding.driveField.setOnClickListener(v -> pickStorageFile(SELECT_DISK_0_FILE_MODE)); + binding.driveField.setEndIconOnClickListener(v -> { + if (Objects.requireNonNull(binding.drive.getText()).toString().isEmpty()) { + callQcow2CreatorDialog(SELECT_DISK_0_FILE_MODE); + } else { + storageFileOptionDialog(SELECT_DISK_0_FILE_MODE); + } + }); + + + + binding.tieHd1.setOnClickListener(v -> pickStorageFile(SELECT_DISK_1_FILE_MODE)); + binding.tilHd1.setOnClickListener(v -> pickStorageFile(SELECT_DISK_1_FILE_MODE)); + binding.tilHd1.setEndIconOnClickListener(v -> { + if (Objects.requireNonNull(binding.tieHd1.getText()).toString().isEmpty()) { + callQcow2CreatorDialog(SELECT_DISK_1_FILE_MODE); + } else { + storageFileOptionDialog(SELECT_DISK_1_FILE_MODE); + } + }); + + + + if (MainSettingsManager.getArch(requireActivity()).equals(MainSettingsManager.ARM64_ARCH)) { + binding.lnFloppyContainer.setVisibility(View.GONE); + } + + binding.tieFda.setOnClickListener(v -> pickStorageFile(SELECT_FLOPPY_A_FILE_MODE)); + binding.tilFda.setOnClickListener(v -> pickStorageFile(SELECT_FLOPPY_A_FILE_MODE)); + binding.tilFda.setEndIconOnClickListener(v -> setDrive(SELECT_FLOPPY_A_FILE_MODE, null)); + + binding.tieFdb.setOnClickListener(v -> pickStorageFile(SELECT_FLOPPY_B_FILE_MODE)); + binding.tilFdb.setOnClickListener(v -> pickStorageFile(SELECT_FLOPPY_B_FILE_MODE)); + binding.tilFdb.setEndIconOnClickListener(v -> setDrive(SELECT_FLOPPY_B_FILE_MODE, null)); + + + binding.cdrom.setOnClickListener(v -> pickStorageFile(SELECT_CDROM_0_FILE_MODE)); + binding.cdromField.setOnClickListener(v -> pickStorageFile(SELECT_CDROM_0_FILE_MODE)); + binding.cdromField.setEndIconOnClickListener(v -> setDrive(SELECT_CDROM_0_FILE_MODE, null)); + + binding.tieCdrom1.setOnClickListener(v -> pickStorageFile(SELECT_CDROM_1_FILE_MODE)); + binding.tilCdrom1.setOnClickListener(v -> pickStorageFile(SELECT_CDROM_1_FILE_MODE)); + binding.tilCdrom1.setEndIconOnClickListener(v -> setDrive(SELECT_CDROM_1_FILE_MODE, null)); + + + binding.svSharedFolder.setSubTitle(AppConfig.sharedFolder); + + load(); + } + + private final int SELECT_DISK_0_FILE_MODE = 0; + private final int SELECT_DISK_1_FILE_MODE = 1; + public final int SELECT_CDROM_0_FILE_MODE = 2; + public final int SELECT_CDROM_1_FILE_MODE = 3; + public final int SELECT_FLOPPY_A_FILE_MODE = 4; + public final int SELECT_FLOPPY_B_FILE_MODE = 5; + private int PENDING_SELECT_FILE_MODE = 0; + private String PENDING_OLD_FILE_AFTER_SELECTED_NEW_FILE = ""; + + private void pickStorageFile(int mode) { + PENDING_SELECT_FILE_MODE = mode; + PENDING_OLD_FILE_AFTER_SELECTED_NEW_FILE = Objects.requireNonNull(getPeddingStorageEditText().getText()).toString(); + + try { + if (PENDING_SELECT_FILE_MODE == SELECT_CDROM_0_FILE_MODE || PENDING_SELECT_FILE_MODE == SELECT_CDROM_1_FILE_MODE) { + if (MainSettingsManager.getBuiltInFilePicker(requireActivity())) { + builtInFilePicker(PICK_OPTICAL_FILE_MODE); + } else { + isoPicker.launch("*/*"); + } + } else if (PENDING_SELECT_FILE_MODE == SELECT_FLOPPY_A_FILE_MODE || PENDING_SELECT_FILE_MODE == SELECT_FLOPPY_B_FILE_MODE) { + if (MainSettingsManager.getBuiltInFilePicker(requireActivity())) { + builtInFilePicker(PICK_FLOPPY_FILE_MODE); + } else { + floppyPicker.launch("*/*"); + } + } else { + if (MainSettingsManager.getBuiltInFilePicker(requireActivity())) { + builtInFilePicker(PICK_DRIVE_FILE_MODE); + } else { + diskPicker.launch("*/*"); + } + } + } catch (Exception e) { + Log.e(TAG, "pickStorageFile: ", e); + IntentUtils.showErrorDialog(requireActivity()); + } + } + + private void storageFileOptionDialog(int mode) { + PENDING_SELECT_FILE_MODE = mode; + + //TextInputLayout peddingTextInputLayout = getPeddingStorageInputLayout(); + TextInputEditText peddingTextInputEditText = getPeddingStorageEditText(); + + DialogUtils.threeDialog(requireActivity(), + getString(R.string.change_hard_drive), + getString(R.string.do_you_want_to_change_create_or_remove), + getString(R.string.change), getString(R.string.remove), + getString(R.string.create), + true, + R.drawable.hard_drive_24px, + true, + () -> pickStorageFile(mode), + () -> { + String path = new File(Objects.requireNonNull(peddingTextInputEditText.getText()).toString()).getAbsolutePath(); + if (path.startsWith(VmFileManager.quickGetPath(vmId))) { + ProgressDialog progressDialog1 = new ProgressDialog(requireActivity()); + progressDialog1.show(); + new Thread(() -> { + utils.markDelete(path); + requireActivity().runOnUiThread(progressDialog1::reset); + }).start(); + } + + setDrive(mode, ""); + }, + () -> callQcow2CreatorDialog(PENDING_SELECT_FILE_MODE), null); + } + + private void callQcow2CreatorDialog(int mode) { + PENDING_SELECT_FILE_MODE = mode; + + TextInputLayout peddingTextInputLayout = getPeddingStorageInputLayout(); + TextInputEditText peddingTextInputEditText = getPeddingStorageEditText(); + + CreateImageDialogFragment dialogFragment = new CreateImageDialogFragment(); + dialogFragment.folder = VmFileManager.getPath(vmId); + dialogFragment.customRom = true; + dialogFragment.filename = configs.itemName; + dialogFragment.drive = peddingTextInputEditText; + dialogFragment.driveLayout = peddingTextInputLayout; + dialogFragment.isMarkPendingAdd = true; + dialogFragment.show(requireActivity().getSupportFragmentManager(), "CreateImageDialogFragment"); + } + + private void setRemovableDriveEndIconOnClickListener(int mode, TextInputLayout textInputLayout) { + textInputLayout.setEndIconOnClickListener(v -> { + PENDING_SELECT_FILE_MODE = mode; + PENDING_OLD_FILE_AFTER_SELECTED_NEW_FILE = Objects.requireNonNull(getPeddingStorageEditText().getText()).toString(); + setDrive(mode, null); + }); + } + + private void setDrive(Integer mode, String path) { + if (isFileReadyinUse(path)) { + DialogUtils.oopsDialog(requireActivity(), getString(R.string.vm_creator_this_file_is_already_in_use_content)); + utils.deleteTemp(new File(path).getName()); + return; + } + + if (mode != null) PENDING_SELECT_FILE_MODE = mode; + + TextInputLayout peddingTextInputLayout = getPeddingStorageInputLayout(); + TextInputEditText peddingTextInputEditText = getPeddingStorageEditText(); + + peddingTextInputEditText.setText(path != null ? path : ""); + + if (path == null || path.isEmpty()) { + if (PENDING_SELECT_FILE_MODE == SELECT_CDROM_0_FILE_MODE || PENDING_SELECT_FILE_MODE == SELECT_CDROM_1_FILE_MODE || PENDING_SELECT_FILE_MODE == SELECT_FLOPPY_A_FILE_MODE || PENDING_SELECT_FILE_MODE == SELECT_FLOPPY_B_FILE_MODE) { + peddingTextInputLayout.setEndIconMode(TextInputLayout.END_ICON_NONE); + } else { + peddingTextInputLayout.setEndIconDrawable(R.drawable.add_24px); + } + } else { + if (PENDING_SELECT_FILE_MODE == SELECT_CDROM_0_FILE_MODE || PENDING_SELECT_FILE_MODE == SELECT_CDROM_1_FILE_MODE || PENDING_SELECT_FILE_MODE == SELECT_FLOPPY_A_FILE_MODE || PENDING_SELECT_FILE_MODE == SELECT_FLOPPY_B_FILE_MODE) { + peddingTextInputLayout.setEndIconMode(TextInputLayout.END_ICON_CUSTOM); + peddingTextInputLayout.setEndIconDrawable(R.drawable.close_24px); + setRemovableDriveEndIconOnClickListener(PENDING_SELECT_FILE_MODE, peddingTextInputLayout); + } else { + peddingTextInputLayout.setEndIconDrawable(R.drawable.more_vert_24px); + } + } + + if (!PENDING_OLD_FILE_AFTER_SELECTED_NEW_FILE.isEmpty()) { + onFileChange(new File(PENDING_OLD_FILE_AFTER_SELECTED_NEW_FILE).getName()); + PENDING_OLD_FILE_AFTER_SELECTED_NEW_FILE = ""; + } + } + + private TextInputLayout getPeddingStorageInputLayout() { + if (PENDING_SELECT_FILE_MODE == SELECT_DISK_1_FILE_MODE) { + return binding.tilHd1; + } else if (PENDING_SELECT_FILE_MODE == SELECT_CDROM_0_FILE_MODE) { + return binding.cdromField; + } else if (PENDING_SELECT_FILE_MODE == SELECT_CDROM_1_FILE_MODE) { + return binding.tilCdrom1; + } else if (PENDING_SELECT_FILE_MODE == SELECT_FLOPPY_A_FILE_MODE) { + return binding.tilFda; + } else if (PENDING_SELECT_FILE_MODE == SELECT_FLOPPY_B_FILE_MODE) { + return binding.tilFdb; + } else { + return binding.driveField; + } + } + + private TextInputEditText getPeddingStorageEditText() { + if (PENDING_SELECT_FILE_MODE == SELECT_DISK_1_FILE_MODE) { + return binding.tieHd1; + } else if (PENDING_SELECT_FILE_MODE == SELECT_CDROM_0_FILE_MODE) { + return binding.cdrom; + } else if (PENDING_SELECT_FILE_MODE == SELECT_CDROM_1_FILE_MODE) { + return binding.tieCdrom1; + } else if (PENDING_SELECT_FILE_MODE == SELECT_FLOPPY_A_FILE_MODE) { + return binding.tieFda; + } else if (PENDING_SELECT_FILE_MODE == SELECT_FLOPPY_B_FILE_MODE) { + return binding.tieFdb; + } else { + return binding.drive; + } + } + + private boolean isFileReadyinUse(String path) { + if (path == null || path.trim().isEmpty()) return false; + + String paramCollection = Objects.requireNonNull(binding.drive.getText()).toString(); + paramCollection += "\n" + Objects.requireNonNull(binding.tieHd1.getText()); + paramCollection += "\n" + Objects.requireNonNull(binding.cdrom.getText()); + paramCollection += "\n" + Objects.requireNonNull(binding.tieCdrom1.getText()); + paramCollection += "\n" + Objects.requireNonNull(binding.tieFda.getText()); + paramCollection += "\n" + Objects.requireNonNull(binding.tieFdb.getText()); + paramCollection += "\n" + Objects.requireNonNull(configs.itemExtra); + + return paramCollection.contains(path); + } + + final int PICK_DRIVE_FILE_MODE = 0; + final int PICK_OPTICAL_FILE_MODE = 1; + final int PICK_FLOPPY_FILE_MODE = 2; + + private void builtInFilePicker(int mode) { + FilePickerDialog filePickerDialog = new FilePickerDialog(); + + int finalMode; + if (mode == PICK_DRIVE_FILE_MODE) { + finalMode = FilePickerDialog.FIT_PICK_DISK_FILE_MODE; + } else if (mode == PICK_OPTICAL_FILE_MODE) { + finalMode = FilePickerDialog.FIT_PICK_OPTICAL_FILE_MODE; + } else { + finalMode = FilePickerDialog.FIT_PICK_FLOPPY_FILE_MODE; + } + + filePickerDialog.pick(requireActivity(), finalMode, (path -> handleFile(Uri.fromFile(new File(path))))); + } + + private void load() { + if (configs.itemPath != null && !configs.itemPath.isEmpty()) { + setDrive(SELECT_DISK_0_FILE_MODE, (configs.itemPath.contains("/") ? "" : VmFileManager.getPath(vmId)).concat(configs.itemPath)); + } + + if (configs.hd1 != null && !configs.hd1.isEmpty()) { + setDrive(SELECT_DISK_1_FILE_MODE, (configs.hd1.contains("/") ? "" : VmFileManager.getPath(vmId)).concat(configs.hd1)); + } + + if (MainSettingsManager.getArch(getContext()).equals(MainSettingsManager.ARM64_ARCH)) { + binding.lnFloppyContainer.setVisibility(View.GONE); + } else { + if (configs.fda!= null && !configs.fda.isEmpty()) { + setDrive(SELECT_FLOPPY_A_FILE_MODE, (configs.fda.contains("/") ? "" : VmFileManager.getPath(vmId)).concat(configs.fda)); + } + + if (configs.fdb!= null && !configs.fdb.isEmpty()) { + setDrive(SELECT_FLOPPY_B_FILE_MODE, (configs.fdb.contains("/") ? "" : VmFileManager.getPath(vmId)).concat(configs.fdb)); + } + } + + if (configs.imgCdrom != null && !configs.imgCdrom.isEmpty()) { + setDrive(SELECT_CDROM_0_FILE_MODE, (configs.imgCdrom.contains("/") ? "" : VmFileManager.getPath(vmId)).concat(configs.imgCdrom)); + } + + if (configs.cdrom1 != null && !configs.cdrom1.isEmpty()) { + setDrive(SELECT_CDROM_1_FILE_MODE, (configs.cdrom1.contains("/") ? "" : VmFileManager.getPath(vmId)).concat(configs.cdrom1)); + } + + binding.svSharedFolder.setChecked(configs.sharedFolder); + } + + private void save() { + configs.itemPath = Objects.requireNonNull(binding.drive.getText()).toString(); + configs.hd1 = Objects.requireNonNull(binding.tieHd1.getText()).toString(); + + configs.fda = Objects.requireNonNull(binding.tieFda.getText()).toString(); + configs.fdb = Objects.requireNonNull(binding.tieFdb.getText()).toString(); + + configs.imgCdrom = Objects.requireNonNull(binding.cdrom.getText()).toString(); + configs.cdrom1 = Objects.requireNonNull(binding.tieCdrom1.getText()).toString(); + + configs.sharedFolder = binding.svSharedFolder.isChecked(); + } +} diff --git a/app/src/main/java/com/vectras/vm/creator/utils/CreatorUtils.java b/app/src/main/java/com/vectras/vm/creator/utils/CreatorUtils.java new file mode 100644 index 0000000..63fe408 --- /dev/null +++ b/app/src/main/java/com/vectras/vm/creator/utils/CreatorUtils.java @@ -0,0 +1,107 @@ +package com.vectras.vm.creator.utils; + +import android.app.Activity; +import android.net.Uri; + +import com.vectras.vm.manager.VmFileManager; +import com.vectras.vm.utils.FileUtils; +import com.vectras.vm.utils.ProgressDialog; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; + +public class CreatorUtils { + public static final String PENDING_FOLDER = "pending/"; + + Activity activity; + String vmId; + + ProgressDialog progressDialog; + + public CreatorUtils(Activity activity, String vmId) { + this.activity = activity; + this.vmId = vmId; + } + + public void showProgressDialog(String message) { + if (progressDialog == null) progressDialog = new ProgressDialog(activity); + progressDialog.setText(message); + if (!activity.isFinishing() && !activity.isDestroyed()) progressDialog.show(); + } + + public void dissmissProgressDialog() { + if (progressDialog != null && !activity.isFinishing() && !activity.isDestroyed()) { + progressDialog.dismiss(); + } + } + + public String getTempPath(String fileName) { + return VmFileManager.getTempPath(activity, vmId, PENDING_FOLDER + fileName); + } + + public boolean removeTemp() { + return VmFileManager.removeTemp(activity, vmId, PENDING_FOLDER); + } + + public String copyToTemp(Uri uri) throws IOException { + String fileName = FileUtils.getFileNameFromUri(activity, uri); + + if (fileName == null || fileName.isEmpty()) { + fileName = String.valueOf(System.currentTimeMillis()); + } + + FileUtils.copyFileFromUri(activity, uri, VmFileManager.getTempPath(activity, vmId, PENDING_FOLDER + fileName)); + return VmFileManager.getPath(vmId, fileName); + } + + public void moveAllFromTemp() { + ArrayList fileList = new ArrayList<>(); + FileUtils.getAListOfAllFilesAndFoldersInADirectory(VmFileManager.getTempPath(activity, vmId, PENDING_FOLDER), fileList); + for (int position = 0; position < fileList.size(); position++) { + FileUtils.moveToFolder(fileList.get(position), VmFileManager.getPath(vmId)); + } + + ArrayList fileListInternal = new ArrayList<>(); + FileUtils.getAListOfAllFilesAndFoldersInADirectory(VmFileManager.getInternalTempPath(activity, vmId, PENDING_FOLDER), fileListInternal); + for (int position = 0; position < fileListInternal.size(); position++) { + FileUtils.moveToFolder(fileListInternal.get(position), VmFileManager.getPath(vmId)); + } + } + + public void deleteTemp(String fileName) { + VmFileManager.removeTemp(activity, vmId, PENDING_FOLDER + fileName); + } + + + public void markDelete(String path) { + VmFileManager.markPendingDelete(path); + deleteTemp(new File(path).getName()); + } + + public FilePathData getFilePath(Uri uri) { + try { + String filePath = FileUtils.getPath(activity, uri); + + if (filePath != null && FileUtils.isFileExists(filePath)) { + return new FilePathData() { + { + isValid = true; + path = filePath; + name = new File(filePath).getName(); + } + }; + } + } catch (Exception e) { + return new FilePathData(); + } + + return new FilePathData(); + } + + public static class FilePathData { + public boolean isValid = false; + public String path; + public String name; + } +} diff --git a/app/src/main/java/com/vectras/vm/main/vms/DataMainRoms.java b/app/src/main/java/com/vectras/vm/main/vms/DataMainRoms.java index 810b7e9..f979efd 100644 --- a/app/src/main/java/com/vectras/vm/main/vms/DataMainRoms.java +++ b/app/src/main/java/com/vectras/vm/main/vms/DataMainRoms.java @@ -3,9 +3,15 @@ package com.vectras.vm.main.vms; import com.google.gson.annotations.SerializedName; public class DataMainRoms { - public int cpu = 0; - public int cores = 0; - public int threads = 0; + public String vmID = ""; + + @SerializedName( + value = "arch", + alternate = { "imgArch" } + ) + public String itemArch = ""; + + // Personalize @SerializedName( value = "icon", @@ -19,11 +25,15 @@ public class DataMainRoms { ) public String itemName = ""; - @SerializedName( - value = "arch", - alternate = { "imgArch" } - ) - public String itemArch = ""; + // Board + + public int cpu = 0; + public int cores = 0; + public int threads = 0; + + public boolean battery = false; + + // Storage @SerializedName( value = "drive", @@ -33,11 +43,6 @@ public class DataMainRoms { public String hd1 = ""; - @SerializedName( - value = "qemu", - alternate = { "imgExtra" } - ) - public String itemExtra = ""; @SerializedName( value = "cdrom", @@ -47,15 +52,19 @@ public class DataMainRoms { public String cdrom1 = ""; + public String fda = ""; public String fdb = ""; + public boolean sharedFolder = false; - public String vmID = ""; + // Network - public int qmpPort = 0; + public int networkCard = 0; + + // Firmware public int bootFrom = 0; @@ -67,5 +76,16 @@ public class DataMainRoms { public boolean isUseDefaultBios = true; - public boolean battery = false; + // Advanced + + @SerializedName( + value = "qemu", + alternate = { "imgExtra" } + ) + public String itemExtra = ""; + + // Deprecated + + @Deprecated + public int qmpPort = 0; } diff --git a/app/src/main/java/com/vectras/vm/view/CheckBoxView.java b/app/src/main/java/com/vectras/vm/view/CheckBoxView.java index 45f3b1e..8b2f3cd 100644 --- a/app/src/main/java/com/vectras/vm/view/CheckBoxView.java +++ b/app/src/main/java/com/vectras/vm/view/CheckBoxView.java @@ -49,7 +49,7 @@ public class CheckBoxView extends LinearLayout { typedArray.recycle(); } - findViewById(R.id.root).setOnClickListener(v -> checkBox.setChecked(!checkBox.isChecked())); + setOnClickListener(v -> checkBox.setChecked(!checkBox.isChecked())); checkBox.setOnCheckedChangeListener((buttonView, isChecked) -> { if (listener != null) { diff --git a/app/src/main/java/com/vectras/vm/view/SwitchView.java b/app/src/main/java/com/vectras/vm/view/SwitchView.java index 3af0851..9549b04 100644 --- a/app/src/main/java/com/vectras/vm/view/SwitchView.java +++ b/app/src/main/java/com/vectras/vm/view/SwitchView.java @@ -52,7 +52,7 @@ public class SwitchView extends LinearLayout { typedArray.recycle(); } - findViewById(R.id.root).setOnClickListener(v -> switchWidget.setChecked(!switchWidget.isChecked())); + setOnClickListener(v -> switchWidget.setChecked(!switchWidget.isChecked())); switchWidget.setOnCheckedChangeListener((buttonView, isChecked) -> { if (listener != null) { diff --git a/app/src/main/res/layout/activity_vm_creator.xml b/app/src/main/res/layout/activity_vm_creator.xml index 6c8aa20..ea99c08 100644 --- a/app/src/main/res/layout/activity_vm_creator.xml +++ b/app/src/main/res/layout/activity_vm_creator.xml @@ -58,87 +58,74 @@ android:orientation="vertical" android:padding="8dp"> - + android:layout_marginBottom="2dp" + android:orientation="vertical" + android:padding="16dp" + android:background="@drawable/object_shape_top_high"> - + - + - - - + android:layout_height="match_parent" + android:background="?attr/selectableItemBackground" + android:scaleType="centerCrop" + app:srcCompat="@drawable/ic_computer_180dp_with_padding" /> + + + android:id="@+id/ivAddThubnail" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:background="@drawable/backgroud_round_only_left_25_black_50_style" + android:padding="4dp" + app:srcCompat="@drawable/round_add_24" + app:tint="@android:color/white" /> + + + - + - - - - - - + android:inputType="text" + android:selectAllOnFocus="true" + android:singleLine="true" /> + - - - - - +
- + android:layout_marginBottom="2dp" + android:background="@drawable/object_shape_middle_high" + android:padding="16dp"> + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent"> + android:text="@string/board" + android:textSize="18sp" /> - - - - - - - - - - + android:text="@string/board_note" + android:textColor="?android:attr/textColorSecondary" + android:textSize="14sp" /> - + - + android:layout_marginBottom="2dp" + android:background="@drawable/object_shape_middle_high" + android:padding="16dp"> + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent"> + android:text="@string/storage" + android:textSize="18sp" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + android:text="@string/storage_note" + android:textColor="?android:attr/textColorSecondary" + android:textSize="14sp" /> - + - + android:layout_marginBottom="2dp" + android:background="@drawable/object_shape_middle_high" + android:padding="16dp"> + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent"> + android:text="@string/network" + android:textSize="18sp" /> - - - - - - - - - - - - + android:text="@string/network_note" + android:textColor="?android:attr/textColorSecondary" + android:textSize="14sp" /> - + - + android:layout_marginBottom="2dp" + android:background="@drawable/object_shape_middle_high" + android:padding="16dp"> + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent"> + android:text="@string/firmware" + android:textSize="18sp" /> - - - - + android:text="@string/firmware_note" + android:textColor="?android:attr/textColorSecondary" + android:textSize="14sp" /> - + + + + + + + + + + + + android:gravity="center_vertical"> + + +
diff --git a/app/src/main/res/layout/creator_advanced_dialog.xml b/app/src/main/res/layout/creator_advanced_dialog.xml new file mode 100644 index 0000000..41b3ebf --- /dev/null +++ b/app/src/main/res/layout/creator_advanced_dialog.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/creator_board_dialog.xml b/app/src/main/res/layout/creator_board_dialog.xml new file mode 100644 index 0000000..f97b213 --- /dev/null +++ b/app/src/main/res/layout/creator_board_dialog.xml @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/creator_firmware_dialog.xml b/app/src/main/res/layout/creator_firmware_dialog.xml new file mode 100644 index 0000000..a363239 --- /dev/null +++ b/app/src/main/res/layout/creator_firmware_dialog.xml @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/creator_network_dialog.xml b/app/src/main/res/layout/creator_network_dialog.xml new file mode 100644 index 0000000..50699cf --- /dev/null +++ b/app/src/main/res/layout/creator_network_dialog.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/creator_storage_dialog.xml b/app/src/main/res/layout/creator_storage_dialog.xml new file mode 100644 index 0000000..c1fff9f --- /dev/null +++ b/app/src/main/res/layout/creator_storage_dialog.xml @@ -0,0 +1,215 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/rom_options_dialog.xml b/app/src/main/res/layout/rom_options_dialog.xml index cec6370..2a4b7a2 100644 --- a/app/src/main/res/layout/rom_options_dialog.xml +++ b/app/src/main/res/layout/rom_options_dialog.xml @@ -29,8 +29,7 @@ + app:cardBackgroundColor="?attr/colorSurfaceContainerLowest"> + android:gravity="center_vertical"> + android:paddingHorizontal="16dp" + android:gravity="center_vertical"> Đã sap chép đường dẫn thư mục vào bảng tạm.
Đường phân cách Thêm các đường phân cách giữa các mục. + Các ổ lưu trữ, thư mục được chia sẻ,… + Giấy phép nguồn mở + Bộ xử lý, nhân, luồng,… + Phần mềm + UEFI, khởi động từ, tuỳ chọn khởi động,… + Các tham số mở rộng,… + Loại thẻ + Thẻ mạng + Trống diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f18d8bf..015590d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -652,6 +652,16 @@ The folder path has been copied to the clipboard. Divider Add dividers between items. + Drives, shared folder,… + Open source licenses + Processor, cores, threads,… + Firmware + UEFI, boot from, boot menu,… + Extra params,… + Network card,… + Card type + Network card + None @@ -881,6 +891,27 @@ G3 G2 (Workstation) G2 (Low-Power) + + + Intel E1000E (82574L) + Intel IGB (82576) + Intel E1000 (82540EM) + Intel E1000 (82545EM) + Intel E1000 (82544GC) + Intel i82801 + Intel i82562 + Intel i82559ER + Intel i82558B + Intel i82557C + Intel i82551 + Intel i82550 + Realtek RTL8139 + AMD PCNET + Novell NE2000 + VMWare (VMXNET3) + VirtIO Net + VirtIO Net (Transitional) + diff --git a/build.gradle b/build.gradle index 768f8e5..d402e07 100644 --- a/build.gradle +++ b/build.gradle @@ -15,6 +15,7 @@ buildscript { // Add other classpaths like Google Services and Firebase Crashlytics if needed here. classpath libs.google.services // assuming you need it for your project classpath libs.firebase.crashlytics.gradle + classpath libs.play.services.oss.licenses.plugin // assuming you need it for project } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index fac00a7..6700e3a 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,9 +1,7 @@ [versions] activityKtx = "1.13.0" -agp = "9.2.1" annotation = "1.10.0" appcompat = "1.7.1" -comGoogleFirebase = "firebase-crashlytics" commonsCompress = "1.28.0" commonsIo = "2.22.0" constraintlayout = "2.2.1" @@ -11,16 +9,12 @@ coreKtx = "1.19.0" documentfile = "1.1.0" drawerlayout = "1.2.0" espressoCore = "3.7.0" -firebaseBom = "34.15.0" +firebaseBom = "34.16.0" firebaseCrashlyticsGradle = "3.0.7" -firebaseMessaging = "25.1.0" -glide = "5.0.7" -googleFirebase = "firebase-analytics" -googleFirebaseCrashlytics = "3.0.7" -googleGmsGoogleServices = "4.5.0" +firebaseMessaging = "25.1.1" +glide = "5.0.9" googleServices = "4.5.0" gradle = "9.2.1" -gradleToolchainsFoojayResolverConvention = "1.0.0" gson = "2.14.0" guava = "33.6.0-jre" junit = "4.13.2" @@ -33,6 +27,8 @@ retrofit2 = "3.0.0" swiperefreshlayout = "1.2.0" viewpager = "1.1.0" window = "1.5.1" +playServicesOssLicensesPlugin = "0.12.0" +playServicesOssLicenses = "17.0.0" [libraries] androidx-activity-ktx = { group = "androidx.activity", name = "activity-ktx", version.ref = "activityKtx" } @@ -67,11 +63,5 @@ kotlin-gradle-plugin = { group = "org.jetbrains.kotlin", name = "kotlin-gradle-p lottie = { group = "com.airbnb.android", name = "lottie", version.ref = "lottie" } material = { group = "com.google.android.material", name = "material", version.ref = "material" } retrofit = { group = "com.squareup.retrofit2", name = "retrofit", version.ref = "retrofit2" } - -[plugins] -android-application = { id = "com.android.application", version.ref = "agp" } -com-google-firebase = { id = "com.google.firebase", version.ref = "comGoogleFirebase" } -google-firebase = { id = "com.google.firebase", version.ref = "googleFirebase" } -google-firebase-crashlytics = { id = "com.google.firebase.crashlytics", version.ref = "googleFirebaseCrashlytics" } -google-gms-google-services = { id = "com.google.gms.google-services", version.ref = "googleGmsGoogleServices" } -foojay-resolver = { id = "org.gradle.toolchains.foojay-resolver-convention", version.ref = "gradleToolchainsFoojayResolverConvention" } +play-services-oss-licenses-plugin = { group = "com.google.android.gms", name = "oss-licenses-plugin", version.ref = "playServicesOssLicensesPlugin" } +play-services-oss-licenses = { group = "com.google.android.gms", name = "play-services-oss-licenses", version.ref = "playServicesOssLicenses" } diff --git a/web/data/UpdateConfig.json b/web/data/UpdateConfig.json index a884e99..657461a 100644 --- a/web/data/UpdateConfig.json +++ b/web/data/UpdateConfig.json @@ -5,11 +5,11 @@ "url": "https://github.com/xoureldeen/Vectras-VM-Android/releases", "Message": "

4.3.0

\nBugs fixed.", "cancellable": true, - "versionCodeBeta":"138", - "versionNameBeta":"4.3.4", - "versionNameBetas":"4.0.1,4.0.2,4.0.3,4.0.4,4.0.5,4.0.6,4.0.7,4.0.8,4.0.9,4.1.1,4.1.2,4.1.3,4.1.4,4.1.5,4.1.6,4.1.7,4.1.8,4.1.9,4.2.1,4.2.2,4.2.3,4.2.4,4.2.5,4.2.6,4.2.7,4.2.8,4.2.9,4.3.0,4.3.1,4.3.2,4.3.3,4.3.4", + "versionCodeBeta":"139", + "versionNameBeta":"4.3.5", + "versionNameBetas":"4.0.1,4.0.2,4.0.3,4.0.4,4.0.5,4.0.6,4.0.7,4.0.8,4.0.9,4.1.1,4.1.2,4.1.3,4.1.4,4.1.5,4.1.6,4.1.7,4.1.8,4.1.9,4.2.1,4.2.2,4.2.3,4.2.4,4.2.5,4.2.6,4.2.7,4.2.8,4.2.9,4.3.0,4.3.1,4.3.2,4.3.3,4.3.4,4.3.5", "sizeBeta": "45 MB", "urlBeta": "https://github.com/AnBui2004/Vectras-VM-Emu-Android/releases", - "MessageBeta": "

4.3.4

Bugs fixed.", + "MessageBeta": "

4.3.5

Bugs fixed.", "cancellableBeta": true } From ac39965d475caa2286cdbce2d07639ef84f134d8 Mon Sep 17 00:00:00 2001 From: An Bui <91354810+AnBui2004@users.noreply.github.com> Date: Mon, 13 Jul 2026 20:35:16 +0700 Subject: [PATCH 15/18] Update vroms-store.json --- web/data/vroms-store.json | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/web/data/vroms-store.json b/web/data/vroms-store.json index 907905f..69b5c90 100644 --- a/web/data/vroms-store.json +++ b/web/data/vroms-store.json @@ -1301,6 +1301,26 @@ "vecid": "windows1022h2rcvbi", "id": "99679" }, + { + "rom_name": "Windows 10 22H2 ARM64", + "rom_icon": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQGdZ3UWM5f8Bz9xUPQ21x973GSDQPcgIEJwA&s", + "rom_url": "https://youtu.be/7zOg-8aNJt0", + "rom_path": "Windows 10 22H2 ARM64.cvbi", + "rom_avail": true, + "gui": true, + "rom_size": "The final version of Windows 10", + "rom_arch": "ARM64", + "rom_kernel": "windows", + "rom_extra": "", + "final_rom_file_name": "", + "desc": "This Rom is from Nguyen Bao An Bui. You can get it on An Bui app: https://play.google.com/store/apps/details?id=com.anbui.app\n\nWindows 10 is a major release of the Windows NT operating system developed by Microsoft. The successor to Windows 8.1, it was released to manufacturing on July 15, 2015, became generally available on July 29, 2015, and was a free upgrade to users of Windows 7, 8, and 8.1. Its server counterparts are Windows Server 2016, 2019, and 2022. It was succeeded by Windows 11 in October 2021.", + "file_size": "7 GB", + "containsAds": true, + "creator": "Nguyen Bao An Bui", + "verified": true, + "vecid": "windows1022h2arm64cvbi", + "id": "99623" + }, { "rom_name": "Windows 10 buid 10051", "rom_icon": "https://vuetiwuvbyxywfukompp.supabase.co/storage/v1/object/public/getmyos/v1/files/2018/09/17/windows-logo_1_926ed76111646acbbe332bc5af0cf2ce.png", From 12672d5770272d3763720b75623ab9d7882ca5c8 Mon Sep 17 00:00:00 2001 From: An Bui <91354810+AnBui2004@users.noreply.github.com> Date: Mon, 13 Jul 2026 20:57:22 +0700 Subject: [PATCH 16/18] Update README.md --- README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 8785173..53ad623 100644 --- a/README.md +++ b/README.md @@ -161,7 +161,13 @@ Help support the project by contributing! ## ⭐ Star History -[![Star History Chart](https://api.star-history.com/svg?repos=xoureldeen/Vectras-VM-Android,AnBui2004/Vectras-VM-Emu-Android&type=date&legend=top-left)](https://www.star-history.com/#xoureldeen/Vectras-VM-Android&AnBui2004/Vectras-VM-Emu-Android&type=date&legend=top-left) +
+ + + + Star History Chart + + [ico-telegram]: https://img.shields.io/badge/Telegram-2CA5E0?logo=telegram&logoColor=white [ico-discord]: https://img.shields.io/badge/Discord-%235865F2.svg?&logo=discord&logoColor=white From ba7b9bcebaf95cb167828bc777651634ff902c6b Mon Sep 17 00:00:00 2001 From: power690 <2103890018@qq.com> Date: Tue, 14 Jul 2026 03:03:12 +0000 Subject: [PATCH 17/18] Complete Simplified Chinese (zh-rCN) translations --- app/src/main/res/values-zh-rCN/strings.xml | 55 ++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 0f70f53..ef78a9c 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -869,4 +869,59 @@ G2 (工作站) G2 (低功耗) 空白片段 + + 未找到匹配的结果。\n请尝试添加或移除下方的过滤器。 + 其他 + 操作系统 + 免费/社区版 + 高质量/包含广告 + 无图形界面 + 随机推荐 + 在商店和推荐中搜索。 + 猜猜会出现什么? + 过滤器 + 更可控地搜索,更快速地浏览。 + 重置 UEFI/BIOS + 所有默认的 UEFI/BIOS 设置将被重置。是否要继续? + 您需要关闭所有正在运行的虚拟机才能执行此操作。 + 自动切换到外接鼠标 + 在鼠标连接和断开时自动切换。 + 必要的软件包已安装。 + 创建虚拟驱动器时发生错误。 + 均衡器 + 高音、中音和低音。 + 您可能需要重启虚拟机才能使更改生效。如果使用耳机等配件,音效可能会受到影响。 + 使用均衡器 + 超高音 + 高音 + 中音 + 低音 + 超低音 + 您的设备不受支持。 + 撤销 + 内部存储 + 打开方式 + 文件选择器 + 内置文件选择器和浏览器。 + 使用文件选择器 + 恢复 + 继续上一次选择文件时所在的文件夹。 + 显示隐藏文件 + 适用于名称以 \".\" 开头的文件和文件夹。 + 文件夹路径已复制到剪贴板。 + 分隔线 + 在项目之间添加分隔线。 + 驱动器、共享文件夹…… + 开源许可证 + 处理器、核心、线程…… + 固件 + UEFI、启动源、启动菜单…… + 额外参数…… + 网卡…… + 卡类型 + 网卡 + + 在 Vterm 环境中执行任意命令 + + \ No newline at end of file From 9b3e5cec8dea9e89d6bc52eb34a2426530949241 Mon Sep 17 00:00:00 2001 From: An Bui <91354810+AnBui2004@users.noreply.github.com> Date: Tue, 14 Jul 2026 20:50:58 +0700 Subject: [PATCH 18/18] 4.3.6 - Fixed an issue where the virtual machine creator crashed after the Vectras VM was freed from memory and reopened. - Fixed the issue where Ctrl, Alt, and Windows keys were not working on the built-in VNC screen. - Fixed the inability to type characters requiring Shift when typing directly on the built-in VNC screen. - Added brightness adjustment for the built-in VNC screen. - Added volume adjustment for the virtual machine. - Added a Machine type option. - Added a Nested virtualization option. - Improved the process of not adding machine type, processor, symmetric multiprocessing, and memory parameters when the expansion parameter already includes them. - Improved Chinese language support (Thanks to @power690 for the contribution) (https://github.com/xoureldeen/Vectras-VM-Android/pull/689). - Other minor issues have been resolved. --- app/build.gradle | 4 +- .../java/android/androidVNC/VncCanvas.java | 34 +++- .../android/androidVNC/VncCanvasActivity.java | 6 + .../com/vectras/qemu/MainVNCActivity.java | 61 +++--- app/src/main/java/com/vectras/vm/StartVM.java | 93 ++++++--- .../vectras/vm/creator/VMCreatorActivity.java | 10 +- .../vm/creator/configs/ListManager.java | 33 ++++ .../creator/editor/AdvancedConfigsDialog.java | 19 +- .../vm/creator/editor/BoardConfigsDialog.java | 40 +++- .../creator/editor/FirmwareConfigsDialog.java | 20 +- .../creator/editor/NetworkConfigsDialog.java | 23 ++- .../creator/editor/StorageConfigsDialog.java | 90 ++++++--- .../vectras/vm/creator/utils/EditorUtils.java | 20 ++ .../{ => utils}/VMCreatorSelector.java | 11 +- .../com/vectras/vm/main/vms/DataMainRoms.java | 10 +- .../com/vectras/vm/manager/ParamManager.java | 14 +- .../com/vectras/vm/manager/VNCKeyManager.java | 176 ++++++++++++++++++ .../vm/manager/VmControllerDialog.java | 66 +++++-- .../java/com/vectras/vm/manager/VmPicker.java | 1 - .../com/vectras/vm/settings/Minitools.java | 2 +- .../vm/setupwizard/SetupWizard2Activity.java | 2 +- .../com/vectras/vm/sound/StreamAudio.java | 27 ++- .../main/res/drawable/brightness_5_24px.xml | 10 + app/src/main/res/layout/checkbox_view.xml | 1 + .../main/res/layout/creator_board_dialog.xml | 22 +++ .../dialog_change_removable_devices.xml | 66 ++++--- app/src/main/res/layout/switch_view.xml | 1 + app/src/main/res/values-vi/strings.xml | 76 ++++---- app/src/main/res/values/strings.xml | 24 ++- web/data/UpdateConfig.json | 8 +- 30 files changed, 766 insertions(+), 204 deletions(-) create mode 100644 app/src/main/java/com/vectras/vm/creator/utils/EditorUtils.java rename app/src/main/java/com/vectras/vm/creator/{ => utils}/VMCreatorSelector.java (83%) create mode 100644 app/src/main/java/com/vectras/vm/manager/VNCKeyManager.java create mode 100644 app/src/main/res/drawable/brightness_5_24px.xml diff --git a/app/build.gradle b/app/build.gradle index c39bff4..8aa4f59 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -13,8 +13,8 @@ android { applicationId "com.vectras.vm" minSdk minApi targetSdk targetApi - versionCode 139 - versionName "4.3.5" + versionCode 140 + versionName "4.3.6" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" multiDexEnabled true diff --git a/app/src/main/java/android/androidVNC/VncCanvas.java b/app/src/main/java/android/androidVNC/VncCanvas.java index f04971c..b2ea16d 100644 --- a/app/src/main/java/android/androidVNC/VncCanvas.java +++ b/app/src/main/java/android/androidVNC/VncCanvas.java @@ -859,10 +859,10 @@ public class VncCanvas extends AppCompatImageView { } // Useful shortcuts for modifier masks. - final static int CTRL_MASK = KeyEvent.META_SYM_ON; - final static int SHIFT_MASK = KeyEvent.META_SHIFT_ON; - final static int META_MASK = 0; - final static int ALT_MASK = KeyEvent.META_ALT_ON; + public final static int CTRL_MASK = KeyEvent.META_SYM_ON; + public final static int SHIFT_MASK = KeyEvent.META_SHIFT_ON; + public final static int META_MASK = 0; + public final static int ALT_MASK = KeyEvent.META_ALT_ON; private static final int MOUSE_BUTTON_NONE = 0; static final int MOUSE_BUTTON_LEFT = 1; static final int MOUSE_BUTTON_MIDDLE = 2; @@ -1130,7 +1130,7 @@ public class VncCanvas extends AppCompatImageView { boolean down = (evt.getAction() == KeyEvent.ACTION_DOWN); int key; int metaState = evt.getMetaState(); - metaState = 0; + //metaState = 0; // Log.v("Key Pressed", keyCode + ", metaState = " + metaState); switch (keyCode) { @@ -1207,6 +1207,11 @@ public class VncCanvas extends AppCompatImageView { break; } + if ((evt.getMetaState() & KeyEvent.META_META_ON) == KeyEvent.META_META_ON) { + // Log.v("meta", "setting meta mask"); + metaState = metaState | VncCanvas.META_MASK; + } + if ((evt.getMetaState() & KeyEvent.META_CTRL_ON) == KeyEvent.META_CTRL_ON) { // Log.v("meta", "setting ctrl mask"); metaState = metaState | VncCanvas.CTRL_MASK; @@ -1232,7 +1237,7 @@ public class VncCanvas extends AppCompatImageView { lastKeyDown = key; } - rfb.writeKeyEvent(key, metaState, down); + rfb.writeKeyEvent(key, metaStateCollector > 0 ? metaStateCollector : metaState, down); this.ALT_PRESSED = false; } catch (Exception e) { Log.e(TAG, "processLocalKeyEvent: ", e); @@ -1249,10 +1254,15 @@ public class VncCanvas extends AppCompatImageView { } } + public int metaStateCollector = 0; + public void sendMetaKey1(int key, int flags) { try { rfb.writeKeyEvent(key, flags, true); rfb.writeKeyEvent(key, flags, false); + + VncCanvasActivity activity = (VncCanvasActivity) VncCanvas.this.getContext(); + activity.onKeyChanged(key, false, flags); } catch (IOException ioe) { Log.e(TAG, "sendMetaKey1: ", ioe); } @@ -1262,6 +1272,9 @@ public class VncCanvas extends AppCompatImageView { public void sendMetaKey1Down(int key, int flags) { try { rfb.writeKeyEvent(key, flags, true); + + VncCanvasActivity activity = (VncCanvasActivity) VncCanvas.this.getContext(); + activity.onKeyChanged(key, true, flags); } catch (IOException ioe) { Log.e(TAG, "sendMetaKey1Down: ", ioe); } @@ -1271,6 +1284,9 @@ public class VncCanvas extends AppCompatImageView { public void sendMetaKey1Up(int key, int flags) { try { rfb.writeKeyEvent(key, flags, false); + + VncCanvasActivity activity = (VncCanvasActivity) VncCanvas.this.getContext(); + activity.onKeyChanged(key, false, flags); } catch (IOException ioe) { Log.e(TAG, "sendMetaKey1Up: ", ioe); } @@ -1331,7 +1347,6 @@ public class VncCanvas extends AppCompatImageView { } - private static final String SHIFT_CHARS = "~!@#$%^&*()_+{}|:\"<>?"; private static final int LEFT_SHIFT_KEY_CODE = 0xFFE1; public void sendText(String s) { @@ -1347,7 +1362,7 @@ public class VncCanvas extends AppCompatImageView { } } - boolean isNeedShift = Character.isUpperCase(c) || SHIFT_CHARS.indexOf(c) >= 0; + boolean isNeedShift = Character.isUpperCase(c) || isSpecialKey(c) > -1; try { if (isNeedShift) { @@ -1364,6 +1379,9 @@ public class VncCanvas extends AppCompatImageView { Log.e(TAG, "sendText: ",ioe); } } + + VncCanvasActivity activity = (VncCanvasActivity) VncCanvas.this.getContext(); + activity.onKeyChanged(-1, false, -1); } void sendMetaKey(MetaKeyBean meta) { diff --git a/app/src/main/java/android/androidVNC/VncCanvasActivity.java b/app/src/main/java/android/androidVNC/VncCanvasActivity.java index 4a45871..f91481b 100644 --- a/app/src/main/java/android/androidVNC/VncCanvasActivity.java +++ b/app/src/main/java/android/androidVNC/VncCanvasActivity.java @@ -1179,6 +1179,7 @@ public abstract class VncCanvasActivity extends AppCompatActivity { boolean defaultKeyDownHandler(int keyCode, KeyEvent evt) { if (vncCanvas.processLocalKeyEvent(keyCode, evt)) { + onKeyChanged(keyCode, true, -1); return true; } return super.onKeyDown(keyCode, evt); @@ -1186,6 +1187,7 @@ public abstract class VncCanvasActivity extends AppCompatActivity { boolean defaultKeyUpHandler(int keyCode, KeyEvent evt) { if (vncCanvas.processLocalKeyEvent(keyCode, evt)) { + onKeyChanged(keyCode, false, -1); return true; } return super.onKeyUp(keyCode, evt); @@ -1816,6 +1818,10 @@ public abstract class VncCanvasActivity extends AppCompatActivity { } + public void onKeyChanged(int key, boolean isDown, int flags) { + + } + public void reconnect() { // Recreate canvas to change resolution as resolution when changed in some Linux OS may cause canvas to not resize accordingly. diff --git a/app/src/main/java/com/vectras/qemu/MainVNCActivity.java b/app/src/main/java/com/vectras/qemu/MainVNCActivity.java index 61c2571..fac8691 100644 --- a/app/src/main/java/com/vectras/qemu/MainVNCActivity.java +++ b/app/src/main/java/com/vectras/qemu/MainVNCActivity.java @@ -65,6 +65,7 @@ import com.vectras.vm.databinding.DesktopControlsBinding; import com.vectras.vm.databinding.GameControlsBinding; import com.vectras.vm.databinding.SendKeyDialogBinding; import com.vectras.vm.manager.QmpSender; +import com.vectras.vm.manager.VNCKeyManager; import com.vectras.vm.manager.VmAudioManager; import com.vectras.vm.manager.VmFileManager; import com.vectras.vm.manager.VmControllerDialog; @@ -113,8 +114,6 @@ public class MainVNCActivity extends VncCanvasActivity { String[] functionsArray = {"F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "F10", "F11", "F12"}; - public boolean ctrlClicked = false; - public boolean altClicked = false; private final ArrayList> listmapForSendKey = new ArrayList<>(); private boolean isConnected = false; @@ -124,6 +123,8 @@ public class MainVNCActivity extends VncCanvasActivity { private boolean isScaling = false; private boolean isPinchToZoom; + VNCKeyManager vncKeyManager; + private InputManager inputManager; private final InputManager.InputDeviceListener inputDeviceListener = @@ -886,6 +887,11 @@ public class MainVNCActivity extends VncCanvasActivity { } } + @Override + public void onKeyChanged(int key, boolean isDown, int flags) { + if (vncKeyManager != null) vncKeyManager.onKeyChanged(key, isDown, flags); + } + @Override public void onConnected() { runOnUiThread(() -> { @@ -925,6 +931,9 @@ public class MainVNCActivity extends VncCanvasActivity { } firstConnection = true; + + vncKeyManager = new VNCKeyManager(vncCanvas); + vncKeyManager.setButtons(null, bindingDesktopControls.ctrlBtn, bindingDesktopControls.altBtn, bindingDesktopControls.winBtn); }); } @@ -947,6 +956,8 @@ public class MainVNCActivity extends VncCanvasActivity { MainSettingsManager.getAutoSwitchToExternalMouse(this) && Config.mouseMode == Config.MouseMode.External) setUIModeMobile(false); + + if (vncKeyManager != null) vncKeyManager.reset(); }); } @@ -1249,39 +1260,17 @@ public class MainVNCActivity extends VncCanvasActivity { bindingDesktopControls.enterBtn.setOnClickListener(v -> simulateKeyPress(KeyEvent.KEYCODE_ENTER)); - bindingDesktopControls.ctrlBtn.setOnClickListener(new View.OnClickListener() { - @SuppressLint("UseCompatLoadingForDrawables") - @Override - public void onClick(View v) { - if (!ctrlClicked) { - sendKey(KeyEvent.KEYCODE_CTRL_LEFT, false); - bindingDesktopControls.ctrlBtn.setBackgroundResource(R.drawable.controls_button2); - ctrlClicked = true; - } else { - sendKey(KeyEvent.KEYCODE_CTRL_LEFT, true); - bindingDesktopControls.ctrlBtn.setBackgroundResource(R.drawable.controls_button1); - ctrlClicked = false; - } - } + bindingDesktopControls.ctrlBtn.setOnClickListener(v -> { + if (vncKeyManager != null) vncKeyManager.ctrlKey(); }); - bindingDesktopControls.altBtn.setOnClickListener(new View.OnClickListener() { - @SuppressLint("UseCompatLoadingForDrawables") - @Override - public void onClick(View v) { - if (!altClicked) { - sendKey(KeyEvent.KEYCODE_ALT_LEFT, false); - bindingDesktopControls.altBtn.setBackgroundResource(R.drawable.controls_button2); - altClicked = true; - } else { - sendKey(KeyEvent.KEYCODE_ALT_LEFT, true); - bindingDesktopControls.altBtn.setBackgroundResource(R.drawable.controls_button1); - altClicked = false; - } - } + bindingDesktopControls.altBtn.setOnClickListener(v -> { + if (vncKeyManager != null) vncKeyManager.altKey(); }); - bindingDesktopControls.delBtn.setOnClickListener(v -> simulateKeyPress(KeyEvent.KEYCODE_DEL)); + bindingDesktopControls.delBtn.setOnClickListener(v -> { + if (vncKeyManager != null) vncKeyManager.deleteKey(); + }); bindingControls.btnQmp.setOnClickListener(v -> { if (monitorMode) { @@ -1327,10 +1316,7 @@ public class MainVNCActivity extends VncCanvasActivity { }); bindingDesktopControls.winBtn.setOnClickListener(v -> { - sendKey(KeyEvent.KEYCODE_CTRL_LEFT, false); - sendKey(KeyEvent.KEYCODE_ESCAPE, false); - sendKey(KeyEvent.KEYCODE_CTRL_LEFT, false); - sendKey(KeyEvent.KEYCODE_ESCAPE, false); + if (vncKeyManager != null) vncKeyManager.winKey(); }); ArrayAdapter adapter = new ArrayAdapter<>(this, @@ -1566,6 +1552,11 @@ public class MainVNCActivity extends VncCanvasActivity { _all.setOnClickListener(_view1 -> { if (_position == 0) { sendCtrlAtlDelKey(); + } else if (_position == 2) { + if (vncKeyManager != null) { + vncKeyManager.winKey(); + new Handler(Looper.getMainLooper()).postDelayed(() -> vncKeyManager.winKey(), 100); + } } else { Boolean useKeyEvent = (Boolean) _data.get(_position).get("useKeyEvent"); Boolean sendWithQMP = (Boolean) _data.get(_position).get("useQMP"); diff --git a/app/src/main/java/com/vectras/vm/StartVM.java b/app/src/main/java/com/vectras/vm/StartVM.java index 6a18f1d..1514991 100644 --- a/app/src/main/java/com/vectras/vm/StartVM.java +++ b/app/src/main/java/com/vectras/vm/StartVM.java @@ -7,7 +7,7 @@ import android.util.Log; import com.vectras.qemu.Config; import com.vectras.qemu.MainSettingsManager; import com.vectras.qemu.utils.RamInfo; -import com.vectras.vm.creator.VMCreatorSelector; +import com.vectras.vm.creator.utils.VMCreatorSelector; import com.vectras.vm.main.vms.DataMainRoms; import com.vectras.vm.manager.BatteryEmulatorManager; import com.vectras.vm.manager.FirmwareManager; @@ -15,7 +15,6 @@ import com.vectras.vm.manager.ParamManager; import com.vectras.vm.manager.QemuManager; import com.vectras.vm.manager.VmFileManager; import com.vectras.vm.settings.ItemSettingsSelector; -import com.vectras.vm.setupwizard.SetupFeatureCore; import com.vectras.vm.utils.CpuHelper; import com.vectras.vm.utils.DeviceUtils; import com.vectras.vm.utils.FileUtils; @@ -52,30 +51,74 @@ public class StartVM { String extraParams = vmData.itemExtra; - String cpuParams = ""; + String machineParams = ""; + if (!ParamManager.hasMachine(extraParams)) { + String machine = Objects.requireNonNull(VMCreatorSelector.getMachine(activity, MainSettingsManager.getArch(activity), vmData.machine).get("value")).toString(); + if (!machine.isEmpty()) { + machineParams = "-M " + machine; + } - String cpu = Objects.requireNonNull(VMCreatorSelector.getCpu(activity, MainSettingsManager.getArch(activity), vmData.cpu).get("value")).toString(); - if (!cpu.isEmpty() && !extraParams.contains("-cpu ")) { - cpuParams = " -cpu " + cpu; + if ( + vmConfigs.nvirt && + !MainSettingsManager.getArch(activity).equals(MainSettingsManager.PPC_ARCH) && + MainSettingsManager.getArch(activity).equals(MainSettingsManager.ARM64_ARCH) + ) { + machineParams += ",virtualization=true"; + } + + machineParams += " "; } - CpuHelper cpuHelper = new CpuHelper(); + String cpuParams = ""; + if (!ParamManager.hasCpu(extraParams)) { + String cpu = Objects.requireNonNull(VMCreatorSelector.getCpu(activity, MainSettingsManager.getArch(activity), vmData.cpu).get("value")).toString(); - int cores = Integer.parseInt(Objects.requireNonNull(VMCreatorSelector.getCpuCore(MainSettingsManager.getArch(activity), vmConfigs.cores).get("value")).toString()); - int threads = Math.max(1, vmConfigs.threads + 1); - if (!extraParams.contains("-smp ")) { - if (cores * threads > cpuHelper.getCpuThreads()) { - cpuParams += " -smp sockets=1,cores=" + cpuHelper.getCpuCores() + ",threads=1"; - } else { - cpuParams += " -smp sockets=1,cores=" + cores + ",threads=" + threads; + String flags = ""; + if ( + vmConfigs.nvirt && + ( + MainSettingsManager.getArch(activity).equals(MainSettingsManager.X86_64_ARCH) || + MainSettingsManager.getArch(activity).equals(MainSettingsManager.I386_ARCH) + ) + ) { + flags += ",+vmx,+svm"; + } + + if (!flags.isEmpty() && cpu.isEmpty()) { + if (MainSettingsManager.getArch(activity).equals(MainSettingsManager.X86_64_ARCH)) { + cpu = "qemu64"; + } else if (MainSettingsManager.getArch(activity).equals(MainSettingsManager.I386_ARCH)) { + cpu = "qemu32"; + } + } + + if (!cpu.isEmpty()) { + cpuParams = " -cpu " + cpu + flags; } } - if (!cpuParams.isEmpty()) extraParams = cpuParams + " " + extraParams; + if (!ParamManager.hasSmp(extraParams)) { + CpuHelper cpuHelper = new CpuHelper(); + + int cores = Integer.parseInt(Objects.requireNonNull(VMCreatorSelector.getCpuCore(MainSettingsManager.getArch(activity), vmConfigs.cores).get("value")).toString()); + int threads = Math.max(1, vmConfigs.threads + 1); + if (!extraParams.contains("-smp ")) { + if (cores * threads > cpuHelper.getCpuThreads()) { + cpuParams += " -smp sockets=1,cores=" + cpuHelper.getCpuCores() + ",threads=1"; + } else { + cpuParams += " -smp sockets=1,cores=" + cores + ",threads=" + threads; + } + } + } + + if (!cpuParams.isEmpty()) cpuParams += " "; + + + String networkParams = ""; String network = Objects.requireNonNull(VMCreatorSelector.getNetworkCard(activity, vmData.networkCard).get("value")).toString(); if (!network.isEmpty()) { - extraParams = "-device " + network + ",netdev=net0 -netdev user,id=net0 " + extraParams; + networkParams = " -device " + network + ",netdev=net0 -netdev user,id=net0"; } String bootFromParams = Objects.requireNonNull(VMCreatorSelector.getBootFrom(activity, vmData.bootFrom).get("value")).toString(); @@ -85,7 +128,7 @@ public class StartVM { bootParams = "-boot " + bootFromParams + (!bootFromParams.isEmpty() && !showBootMenuParams.isEmpty() ? "," : "") + showBootMenuParams + " "; } - extraParams = bootParams + extraParams; + extraParams = machineParams + cpuParams + bootParams + networkParams + " " + extraParams; return env(activity, extraParams, vmData.itemPath, false); } @@ -291,14 +334,14 @@ public class StartVM { extractFirmware(activity); } - String machine = "-M "; - if (Objects.equals(MainSettingsManager.getArch(activity), "X86_64")) { - machine += "pc"; - params.add(machine); - } else if (Objects.equals(MainSettingsManager.getArch(activity), "ARM64")) { - machine += "virt"; - params.add(machine); - } +// String machine = "-M "; +// if (Objects.equals(MainSettingsManager.getArch(activity), "X86_64")) { +// machine += "pc"; +// params.add(machine); +// } else if (Objects.equals(MainSettingsManager.getArch(activity), "ARM64")) { +// machine += "virt"; +// params.add(machine); +// } if (MainSettingsManager.useMemoryOvercommit(activity)) { params.add("-overcommit"); diff --git a/app/src/main/java/com/vectras/vm/creator/VMCreatorActivity.java b/app/src/main/java/com/vectras/vm/creator/VMCreatorActivity.java index 485a772..b033a87 100644 --- a/app/src/main/java/com/vectras/vm/creator/VMCreatorActivity.java +++ b/app/src/main/java/com/vectras/vm/creator/VMCreatorActivity.java @@ -35,6 +35,7 @@ import com.vectras.vm.creator.editor.NetworkConfigsDialog; import com.vectras.vm.creator.utils.CreatorUtils; import com.vectras.vm.creator.editor.FirmwareConfigsDialog; import com.vectras.vm.creator.editor.StorageConfigsDialog; +import com.vectras.vm.creator.utils.VMCreatorSelector; import com.vectras.vm.file.FilePickerDialog; import com.vectras.vm.store.RomInfo; import com.vectras.vm.SplashActivity; @@ -480,18 +481,18 @@ public class VMCreatorActivity extends AppCompatActivity { if (DeviceUtils.is64bit()) { defQemuParams = switch (MainSettingsManager.getArch(this)) { case "ARM64" -> - "-M virt,virtualization=true -accel tcg,thread=multi -device nec-usb-xhci -device usb-kbd -device usb-mouse -device VGA"; + "-accel tcg,thread=multi -device nec-usb-xhci -device usb-kbd -device usb-mouse -device VGA"; case "PPC" -> "-M mac99 -accel tcg,thread=multi"; default -> - "-M pc -accel tcg,thread=multi -vga std -usb -device usb-tablet"; + "-accel tcg,thread=multi -vga std -usb -device usb-tablet"; }; } else { defQemuParams = switch (MainSettingsManager.getArch(this)) { case "ARM64" -> - "-M virt -device nec-usb-xhci -device usb-kbd -device usb-mouse -device VGA"; + "-device nec-usb-xhci -device usb-kbd -device usb-mouse -device VGA"; case "PPC" -> "-M mac99"; default -> - "-M pc -vga std -usb -device usb-tablet"; + "-vga std -usb -device usb-tablet"; }; } binding.title.setText(getString(R.string.new_vm)); @@ -503,6 +504,7 @@ public class VMCreatorActivity extends AppCompatActivity { current.cores = Math.min(1, VMCreatorSelector.getCpuCorePosition(new CpuHelper().getCpuCores() - 1)); } else if (currentArch.equals(MainSettingsManager.ARM64_ARCH)) { current.cores = Math.min(2, VMCreatorSelector.getCpuCorePosition(new CpuHelper().getCpuCores() - 1)); + current.nvirt = true; } current.networkCard = 3; // Intel E1000 (82540EM) diff --git a/app/src/main/java/com/vectras/vm/creator/configs/ListManager.java b/app/src/main/java/com/vectras/vm/creator/configs/ListManager.java index bc70331..7235169 100644 --- a/app/src/main/java/com/vectras/vm/creator/configs/ListManager.java +++ b/app/src/main/java/com/vectras/vm/creator/configs/ListManager.java @@ -146,6 +146,39 @@ public class ListManager { return list; } + public static ArrayList> machines(Context context, String arch) { + return switch (arch) { + case MainSettingsManager.ARM64_ARCH -> machinesArm64(context); + case MainSettingsManager.PPC_ARCH -> machinesPpc(context); + default -> machinesX8664(context); + }; + } + + public static ArrayList> machinesX8664(Context context) { + ArrayList> list = new ArrayList<>(); + UniversalPickerDialog.putToList(list, context.getString(R.string.defaulttext), ""); + UniversalPickerDialog.putToList(list, context.getString(R.string.i440fx), "pc"); + UniversalPickerDialog.putToList(list, context.getString(R.string.q35), "q35"); + return list; + } + + public static ArrayList> machinesArm64(Context context) { + ArrayList> list = new ArrayList<>(); + UniversalPickerDialog.putToList(list, context.getString(R.string.virt), "virt"); + return list; + } + + public static ArrayList> machinesPpc(Context context) { + ArrayList> list = new ArrayList<>(); + UniversalPickerDialog.putToList(list, context.getString(R.string.defaulttext), ""); + UniversalPickerDialog.putToList(list, context.getString(R.string.mac99), "mac99"); + UniversalPickerDialog.putToList(list, context.getString(R.string.g3beige), "g3beige"); + UniversalPickerDialog.putToList(list, context.getString(R.string.pegasos2), "pegasos2"); + UniversalPickerDialog.putToList(list, context.getString(R.string.amigaone), "amigaone"); + UniversalPickerDialog.putToList(list, context.getString(R.string.sam460ex), "sam460ex"); + return list; + } + public static ArrayList> networkCards(Context context) { ArrayList> list = new ArrayList<>(); UniversalPickerDialog.putToList(list, context.getString(R.string.none), ""); diff --git a/app/src/main/java/com/vectras/vm/creator/editor/AdvancedConfigsDialog.java b/app/src/main/java/com/vectras/vm/creator/editor/AdvancedConfigsDialog.java index ef7633f..706e243 100644 --- a/app/src/main/java/com/vectras/vm/creator/editor/AdvancedConfigsDialog.java +++ b/app/src/main/java/com/vectras/vm/creator/editor/AdvancedConfigsDialog.java @@ -10,9 +10,12 @@ import androidx.annotation.NonNull; import com.google.android.material.bottomsheet.BottomSheetBehavior; import com.google.android.material.bottomsheet.BottomSheetDialog; import com.google.android.material.bottomsheet.BottomSheetDialogFragment; +import com.vectras.vm.R; import com.vectras.vm.creator.QemuParamsEditorActivity; +import com.vectras.vm.creator.utils.EditorUtils; import com.vectras.vm.databinding.CreatorAdvancedDialogBinding; import com.vectras.vm.main.vms.DataMainRoms; +import com.vectras.vm.utils.DialogUtils; import java.util.Objects; @@ -22,6 +25,8 @@ public class AdvancedConfigsDialog extends BottomSheetDialogFragment { String vmId; DataMainRoms configs; + boolean isSave = true; + public void setConfigs(DataMainRoms configs) { this.configs = configs; if (configs != null) { @@ -36,6 +41,14 @@ public class AdvancedConfigsDialog extends BottomSheetDialogFragment { @NonNull @Override public BottomSheetDialog onCreateDialog(Bundle savedInstanceState) { + // This can happen after the app is freed from memory and then reopened. + if (configs == null) { + isSave = false; + DialogUtils.oopsDialog(requireActivity(), getString(R.string.something_went_wrong)); + dismiss(); + return EditorUtils.getDummyDialog(requireActivity()); + } + binding = CreatorAdvancedDialogBinding.inflate(getLayoutInflater()); BottomSheetDialog dialog = new BottomSheetDialog(requireActivity()); @@ -72,13 +85,15 @@ public class AdvancedConfigsDialog extends BottomSheetDialogFragment { public void onDismiss(@NonNull DialogInterface dialogInterface) { super.onDismiss(dialogInterface); - if (callback != null) { + if (callback != null && isSave) { save(); callback.onDismiss(configs); } } private void initialize() { + if (!isAdded()) return; + binding.qemu.setOnClickListener(v -> { iseditparams = true; Intent intent = new Intent(); @@ -99,6 +114,8 @@ public class AdvancedConfigsDialog extends BottomSheetDialogFragment { } private void load() { + if (!isAdded()) return; + binding.qemu.setText(configs.itemExtra); } diff --git a/app/src/main/java/com/vectras/vm/creator/editor/BoardConfigsDialog.java b/app/src/main/java/com/vectras/vm/creator/editor/BoardConfigsDialog.java index 8956bf6..a44e894 100644 --- a/app/src/main/java/com/vectras/vm/creator/editor/BoardConfigsDialog.java +++ b/app/src/main/java/com/vectras/vm/creator/editor/BoardConfigsDialog.java @@ -2,17 +2,22 @@ package com.vectras.vm.creator.editor; import android.content.DialogInterface; import android.os.Bundle; +import android.view.View; import android.widget.FrameLayout; import androidx.annotation.NonNull; +import androidx.appcompat.content.res.AppCompatResources; import com.google.android.material.bottomsheet.BottomSheetBehavior; import com.google.android.material.bottomsheet.BottomSheetDialog; import com.google.android.material.bottomsheet.BottomSheetDialogFragment; import com.vectras.qemu.MainSettingsManager; -import com.vectras.vm.creator.VMCreatorSelector; +import com.vectras.vm.R; +import com.vectras.vm.creator.utils.EditorUtils; +import com.vectras.vm.creator.utils.VMCreatorSelector; import com.vectras.vm.databinding.CreatorBoardDialogBinding; import com.vectras.vm.main.vms.DataMainRoms; +import com.vectras.vm.utils.DialogUtils; import java.util.Objects; @@ -21,6 +26,9 @@ public class BoardConfigsDialog extends BottomSheetDialogFragment { String vmId; DataMainRoms configs; + + boolean isSave = true; + public void setConfigs(DataMainRoms configs) { this.configs = configs; if (configs != null) { @@ -33,6 +41,14 @@ public class BoardConfigsDialog extends BottomSheetDialogFragment { @NonNull @Override public BottomSheetDialog onCreateDialog(Bundle savedInstanceState) { + // This can happen after the app is freed from memory and then reopened. + if (configs == null) { + isSave = false; + DialogUtils.oopsDialog(requireActivity(), getString(R.string.something_went_wrong)); + dismiss(); + return EditorUtils.getDummyDialog(requireActivity()); + } + binding = CreatorBoardDialogBinding.inflate(getLayoutInflater()); BottomSheetDialog dialog = new BottomSheetDialog(requireActivity()); @@ -61,13 +77,20 @@ public class BoardConfigsDialog extends BottomSheetDialogFragment { public void onDismiss(@NonNull DialogInterface dialogInterface) { super.onDismiss(dialogInterface); - if (callback != null) { + if (callback != null && isSave) { save(); callback.onDismiss(configs); } } private void initialize() { + if (!isAdded()) return; + + binding.sbvMachine.setOnClickListener(v -> VMCreatorSelector.machine(requireActivity(), MainSettingsManager.getArch(requireContext()), configs.machine, ((position, name, value) -> { + configs.machine = position; + binding.sbvMachine.setSubtitle(name); + }))); + binding.sbvCpu.setOnClickListener(v -> VMCreatorSelector.cpu(requireActivity(), MainSettingsManager.getArch(requireContext()), configs.cpu, ((position, name, value) -> { configs.cpu = position; binding.sbvCpu.setSubtitle(name); @@ -83,20 +106,29 @@ public class BoardConfigsDialog extends BottomSheetDialogFragment { binding.sbvThread.setSubtitle(name); }))); + if (MainSettingsManager.getArch(requireContext()).equals(MainSettingsManager.PPC_ARCH)) { + binding.cbvNestedVirtualization.setVisibility(View.GONE); + binding.sbvThread.setBackground(AppCompatResources.getDrawable(requireContext(), R.drawable.object_shape_bottom_high)); + } + load(); } private void load() { + if (!isAdded()) return; + + binding.sbvMachine.setSubtitle(Objects.requireNonNull(VMCreatorSelector.getMachine(requireContext(), MainSettingsManager.getArch(requireContext()), configs.machine).get("name")).toString()); + binding.sbvCpu.setSubtitle(Objects.requireNonNull(VMCreatorSelector.getCpu(requireContext(), MainSettingsManager.getArch(requireContext()), configs.cpu).get("name")).toString()); - binding.sbvCore.setSubtitle(Objects.requireNonNull(VMCreatorSelector.getCpuCore(MainSettingsManager.getArch(requireContext()), configs.cores).get("value")).toString()); - binding.sbvThread.setSubtitle(String.valueOf(configs.threads + 1)); + binding.cbvNestedVirtualization.setChecked(configs.nvirt); binding.cbvBattery.setChecked(configs.battery); } private void save() { + configs.nvirt = binding.cbvNestedVirtualization.isChecked(); configs.battery = binding.cbvBattery.isChecked(); } } diff --git a/app/src/main/java/com/vectras/vm/creator/editor/FirmwareConfigsDialog.java b/app/src/main/java/com/vectras/vm/creator/editor/FirmwareConfigsDialog.java index 0f83e13..46b4a4d 100644 --- a/app/src/main/java/com/vectras/vm/creator/editor/FirmwareConfigsDialog.java +++ b/app/src/main/java/com/vectras/vm/creator/editor/FirmwareConfigsDialog.java @@ -13,9 +13,11 @@ import com.google.android.material.bottomsheet.BottomSheetDialog; import com.google.android.material.bottomsheet.BottomSheetDialogFragment; import com.vectras.qemu.MainSettingsManager; import com.vectras.vm.R; -import com.vectras.vm.creator.VMCreatorSelector; +import com.vectras.vm.creator.utils.EditorUtils; +import com.vectras.vm.creator.utils.VMCreatorSelector; import com.vectras.vm.databinding.CreatorFirmwareDialogBinding; import com.vectras.vm.main.vms.DataMainRoms; +import com.vectras.vm.utils.DialogUtils; import java.util.Objects; @@ -25,6 +27,8 @@ public class FirmwareConfigsDialog extends BottomSheetDialogFragment { String vmId; DataMainRoms configs; + boolean isSave = true; + public void setConfigs(DataMainRoms configs) { this.configs = configs; if (configs != null) { @@ -37,6 +41,14 @@ public class FirmwareConfigsDialog extends BottomSheetDialogFragment { @NonNull @Override public BottomSheetDialog onCreateDialog(Bundle savedInstanceState) { + // This can happen after the app is freed from memory and then reopened. + if (configs == null) { + isSave = false; + DialogUtils.oopsDialog(requireActivity(), getString(R.string.something_went_wrong)); + dismiss(); + return EditorUtils.getDummyDialog(requireActivity()); + } + binding = CreatorFirmwareDialogBinding.inflate(getLayoutInflater()); BottomSheetDialog dialog = new BottomSheetDialog(requireActivity()); @@ -65,13 +77,15 @@ public class FirmwareConfigsDialog extends BottomSheetDialogFragment { public void onDismiss(@NonNull DialogInterface dialogInterface) { super.onDismiss(dialogInterface); - if (callback != null) { + if (callback != null && isSave) { save(); callback.onDismiss(configs); } } private void initialize() { + if (!isAdded()) return; + binding.sbvBootfrom.setOnClickListener(v -> VMCreatorSelector.bootFrom(requireActivity(), configs.bootFrom, ((position, name, value) -> { configs.bootFrom = position; binding.sbvBootfrom.setSubtitle(name); @@ -97,6 +111,8 @@ public class FirmwareConfigsDialog extends BottomSheetDialogFragment { } private void load() { + if (!isAdded()) return; + binding.sbvBootfrom.setSubtitle(Objects.requireNonNull(VMCreatorSelector.getBootFrom(requireActivity(), configs.bootFrom).get("name")).toString()); binding.cbvShowbootmenu.setChecked(configs.isShowBootMenu); diff --git a/app/src/main/java/com/vectras/vm/creator/editor/NetworkConfigsDialog.java b/app/src/main/java/com/vectras/vm/creator/editor/NetworkConfigsDialog.java index 6f743ca..d612538 100644 --- a/app/src/main/java/com/vectras/vm/creator/editor/NetworkConfigsDialog.java +++ b/app/src/main/java/com/vectras/vm/creator/editor/NetworkConfigsDialog.java @@ -9,10 +9,12 @@ import androidx.annotation.NonNull; import com.google.android.material.bottomsheet.BottomSheetBehavior; import com.google.android.material.bottomsheet.BottomSheetDialog; import com.google.android.material.bottomsheet.BottomSheetDialogFragment; -import com.vectras.qemu.MainSettingsManager; -import com.vectras.vm.creator.VMCreatorSelector; +import com.vectras.vm.R; +import com.vectras.vm.creator.utils.EditorUtils; +import com.vectras.vm.creator.utils.VMCreatorSelector; import com.vectras.vm.databinding.CreatorNetworkDialogBinding; import com.vectras.vm.main.vms.DataMainRoms; +import com.vectras.vm.utils.DialogUtils; import java.util.Objects; @@ -21,6 +23,9 @@ public class NetworkConfigsDialog extends BottomSheetDialogFragment { String vmId; DataMainRoms configs; + + boolean isSave = true; + public void setConfigs(DataMainRoms configs) { this.configs = configs; if (configs != null) { @@ -33,6 +38,14 @@ public class NetworkConfigsDialog extends BottomSheetDialogFragment { @NonNull @Override public BottomSheetDialog onCreateDialog(Bundle savedInstanceState) { + // This can happen after the app is freed from memory and then reopened. + if (configs == null) { + isSave = false; + DialogUtils.oopsDialog(requireActivity(), getString(R.string.something_went_wrong)); + dismiss(); + return EditorUtils.getDummyDialog(requireActivity()); + } + binding = CreatorNetworkDialogBinding.inflate(getLayoutInflater()); BottomSheetDialog dialog = new BottomSheetDialog(requireActivity()); @@ -61,13 +74,15 @@ public class NetworkConfigsDialog extends BottomSheetDialogFragment { public void onDismiss(@NonNull DialogInterface dialogInterface) { super.onDismiss(dialogInterface); - if (callback != null) { + if (callback != null && isSave) { save(); callback.onDismiss(configs); } } private void initialize() { + if (!isAdded()) return; + binding.sbvCardType.setOnClickListener(v -> VMCreatorSelector.networkCard(requireActivity(), configs.networkCard, ((position, name, value) -> { configs.networkCard = position; binding.sbvCardType.setSubtitle(name); @@ -77,6 +92,8 @@ public class NetworkConfigsDialog extends BottomSheetDialogFragment { } private void load() { + if (!isAdded()) return; + binding.sbvCardType.setSubtitle(Objects.requireNonNull(VMCreatorSelector.getNetworkCard(requireActivity(), configs.networkCard).get("name")).toString()); } diff --git a/app/src/main/java/com/vectras/vm/creator/editor/StorageConfigsDialog.java b/app/src/main/java/com/vectras/vm/creator/editor/StorageConfigsDialog.java index fbfa576..9a27a5e 100644 --- a/app/src/main/java/com/vectras/vm/creator/editor/StorageConfigsDialog.java +++ b/app/src/main/java/com/vectras/vm/creator/editor/StorageConfigsDialog.java @@ -22,6 +22,7 @@ import com.vectras.vm.AppConfig; import com.vectras.vm.Fragment.CreateImageDialogFragment; import com.vectras.vm.R; import com.vectras.vm.creator.utils.CreatorUtils; +import com.vectras.vm.creator.utils.EditorUtils; import com.vectras.vm.databinding.CreatorStorageDialogBinding; import com.vectras.vm.file.FilePickerDialog; import com.vectras.vm.main.vms.DataMainRoms; @@ -42,6 +43,9 @@ public class StorageConfigsDialog extends BottomSheetDialogFragment { String vmId; DataMainRoms configs; + + boolean isSave = true; + public void setConfigs(DataMainRoms configs) { this.configs = configs; if (configs != null) { @@ -57,6 +61,14 @@ public class StorageConfigsDialog extends BottomSheetDialogFragment { @NonNull @Override public BottomSheetDialog onCreateDialog(Bundle savedInstanceState) { + // This can happen after the app is freed from memory and then reopened. + if (configs == null) { + isSave = false; + DialogUtils.oopsDialog(requireActivity(), getString(R.string.something_went_wrong)); + dismiss(); + return EditorUtils.getDummyDialog(requireActivity()); + } + binding = CreatorStorageDialogBinding.inflate(getLayoutInflater()); utils = new CreatorUtils(requireActivity(), vmId); @@ -87,7 +99,7 @@ public class StorageConfigsDialog extends BottomSheetDialogFragment { public void onDismiss(@NonNull DialogInterface dialogInterface) { super.onDismiss(dialogInterface); - if (callback != null) { + if (callback != null && isSave) { save(); callback.onDismiss(configs); } @@ -130,6 +142,8 @@ public class StorageConfigsDialog extends BottomSheetDialogFragment { private void handleFile(Uri uri) { + if (!isAdded()) return; + if (MainSettingsManager.copyFile(requireActivity())) { utils.showProgressDialog(getString(R.string.copying_file)); @@ -138,26 +152,31 @@ public class StorageConfigsDialog extends BottomSheetDialogFragment { String path = utils.copyToTemp(uri); - requireActivity().runOnUiThread(() -> setDrive(PENDING_SELECT_FILE_MODE, path)); + if (isAdded()) + requireActivity().runOnUiThread(() -> setDrive(PENDING_SELECT_FILE_MODE, path)); } catch (Exception e) { - requireActivity().runOnUiThread(() -> DialogUtils.oneDialog(requireActivity(), - getString(R.string.oops), - getString(R.string.unable_to_copy_file_content), - getString(R.string.ok), - true, - R.drawable.warning_48px, - true, - null, - null)); + if (isAdded()) + requireActivity().runOnUiThread(() -> DialogUtils.oneDialog(requireActivity(), + getString(R.string.oops), + getString(R.string.unable_to_copy_file_content), + getString(R.string.ok), + true, + R.drawable.warning_48px, + true, + null, + null)); Log.e(TAG, "isoPicker: " + e.getMessage()); } finally { - requireActivity().runOnUiThread(() -> utils.dissmissProgressDialog()); + if (isAdded()) + requireActivity().runOnUiThread(() -> utils.dissmissProgressDialog()); } }); } else { executor.execute(() -> { CreatorUtils.FilePathData filePathData = utils.getFilePath(uri); + if (!isAdded()) return; + if (!filePathData.isValid) { requireActivity().runOnUiThread(() -> DialogUtils.oneDialog(requireActivity(), getString(R.string.problem_has_been_detected), @@ -181,14 +200,17 @@ public class StorageConfigsDialog extends BottomSheetDialogFragment { } private void handleDiskFile(Uri uri) { - ProgressDialog progressDialog1 = new ProgressDialog(requireActivity()); - progressDialog1.show(); + if (!isAdded()) return; + utils.showProgressDialog(getString(R.string.just_a_moment)); + new Thread(() -> { CreatorUtils.FilePathData filePathData = utils.getFilePath(uri); + if (!isAdded()) return; + if (filePathData.isValid) { requireActivity().runOnUiThread(() -> { - progressDialog1.reset(); + utils.dissmissProgressDialog(); if (FormatManager.isHardDriveFileFormat(filePathData.name)) { startHandleHardDriveFile(uri); @@ -205,6 +227,8 @@ public class StorageConfigsDialog extends BottomSheetDialogFragment { @SuppressLint("SetTextI18n") private void startHandleHardDriveFile(Uri _content_describer) { + if (!isAdded()) return; + if (MainSettingsManager.copyFile(requireActivity())) { if (requireActivity().isFinishing() || requireActivity().isDestroyed()) return; @@ -212,6 +236,8 @@ public class StorageConfigsDialog extends BottomSheetDialogFragment { executor.execute(() -> { try { + if (!isAdded()) return; + String _filename = FileUtils.getFileNameFromUri(requireActivity(), _content_describer); if (_filename == null || _filename.isEmpty()) { _filename = String.valueOf(System.currentTimeMillis()); @@ -220,6 +246,9 @@ public class StorageConfigsDialog extends BottomSheetDialogFragment { String path = utils.copyToTemp(_content_describer); String final_filename = _filename; + + if (!isAdded()) return; + requireActivity().runOnUiThread(() -> { if (requireActivity().isFinishing() || requireActivity().isDestroyed()) { if (!vmId.isEmpty()) @@ -230,7 +259,7 @@ public class StorageConfigsDialog extends BottomSheetDialogFragment { setDrive(PENDING_SELECT_FILE_MODE, path); }); } catch (Exception e) { - requireActivity().runOnUiThread(() -> DialogUtils.oneDialog(requireActivity(), + if (!isAdded()) requireActivity().runOnUiThread(() -> DialogUtils.oneDialog(requireActivity(), getString(R.string.oops), getString(R.string.unable_to_copy_hard_drive_file_content), getString(R.string.ok), @@ -240,16 +269,19 @@ public class StorageConfigsDialog extends BottomSheetDialogFragment { null, null)); } finally { - requireActivity().runOnUiThread(() -> utils.dissmissProgressDialog()); + if (!isAdded()) requireActivity().runOnUiThread(() -> utils.dissmissProgressDialog()); } }); } else { - ProgressDialog progressDialog1 = new ProgressDialog(requireActivity()); - progressDialog1.show(); + utils.showProgressDialog(getString(R.string.just_a_moment)); + new Thread(() -> { String path = FileUtils.getPath(requireContext(), _content_describer); + + if (!isAdded()) return; + requireActivity().runOnUiThread(() -> { - progressDialog1.reset(); + utils.dissmissProgressDialog(); if (!FileUtils.isValidFilePath(requireActivity(), path, false)) { DialogUtils.oneDialog(requireActivity(), @@ -276,6 +308,8 @@ public class StorageConfigsDialog extends BottomSheetDialogFragment { // STORAGE LOGIC CORE private void initialize() { + if (!isAdded()) return; + binding.drive.setOnClickListener(v -> pickStorageFile(SELECT_DISK_0_FILE_MODE)); binding.driveField.setOnClickListener(v -> pickStorageFile(SELECT_DISK_0_FILE_MODE)); binding.driveField.setEndIconOnClickListener(v -> { @@ -287,7 +321,6 @@ public class StorageConfigsDialog extends BottomSheetDialogFragment { }); - binding.tieHd1.setOnClickListener(v -> pickStorageFile(SELECT_DISK_1_FILE_MODE)); binding.tilHd1.setOnClickListener(v -> pickStorageFile(SELECT_DISK_1_FILE_MODE)); binding.tilHd1.setEndIconOnClickListener(v -> { @@ -299,7 +332,6 @@ public class StorageConfigsDialog extends BottomSheetDialogFragment { }); - if (MainSettingsManager.getArch(requireActivity()).equals(MainSettingsManager.ARM64_ARCH)) { binding.lnFloppyContainer.setVisibility(View.GONE); } @@ -337,6 +369,8 @@ public class StorageConfigsDialog extends BottomSheetDialogFragment { private String PENDING_OLD_FILE_AFTER_SELECTED_NEW_FILE = ""; private void pickStorageFile(int mode) { + if (!isAdded()) return; + PENDING_SELECT_FILE_MODE = mode; PENDING_OLD_FILE_AFTER_SELECTED_NEW_FILE = Objects.requireNonNull(getPeddingStorageEditText().getText()).toString(); @@ -367,6 +401,8 @@ public class StorageConfigsDialog extends BottomSheetDialogFragment { } private void storageFileOptionDialog(int mode) { + if (!isAdded()) return; + PENDING_SELECT_FILE_MODE = mode; //TextInputLayout peddingTextInputLayout = getPeddingStorageInputLayout(); @@ -383,7 +419,7 @@ public class StorageConfigsDialog extends BottomSheetDialogFragment { () -> pickStorageFile(mode), () -> { String path = new File(Objects.requireNonNull(peddingTextInputEditText.getText()).toString()).getAbsolutePath(); - if (path.startsWith(VmFileManager.quickGetPath(vmId))) { + if (path.startsWith(VmFileManager.quickGetPath(vmId))) { ProgressDialog progressDialog1 = new ProgressDialog(requireActivity()); progressDialog1.show(); new Thread(() -> { @@ -422,6 +458,8 @@ public class StorageConfigsDialog extends BottomSheetDialogFragment { } private void setDrive(Integer mode, String path) { + if (!isAdded()) return; + if (isFileReadyinUse(path)) { DialogUtils.oopsDialog(requireActivity(), getString(R.string.vm_creator_this_file_is_already_in_use_content)); utils.deleteTemp(new File(path).getName()); @@ -508,6 +546,8 @@ public class StorageConfigsDialog extends BottomSheetDialogFragment { final int PICK_FLOPPY_FILE_MODE = 2; private void builtInFilePicker(int mode) { + if (!isAdded()) return; + FilePickerDialog filePickerDialog = new FilePickerDialog(); int finalMode; @@ -534,11 +574,11 @@ public class StorageConfigsDialog extends BottomSheetDialogFragment { if (MainSettingsManager.getArch(getContext()).equals(MainSettingsManager.ARM64_ARCH)) { binding.lnFloppyContainer.setVisibility(View.GONE); } else { - if (configs.fda!= null && !configs.fda.isEmpty()) { + if (configs.fda != null && !configs.fda.isEmpty()) { setDrive(SELECT_FLOPPY_A_FILE_MODE, (configs.fda.contains("/") ? "" : VmFileManager.getPath(vmId)).concat(configs.fda)); } - if (configs.fdb!= null && !configs.fdb.isEmpty()) { + if (configs.fdb != null && !configs.fdb.isEmpty()) { setDrive(SELECT_FLOPPY_B_FILE_MODE, (configs.fdb.contains("/") ? "" : VmFileManager.getPath(vmId)).concat(configs.fdb)); } } diff --git a/app/src/main/java/com/vectras/vm/creator/utils/EditorUtils.java b/app/src/main/java/com/vectras/vm/creator/utils/EditorUtils.java new file mode 100644 index 0000000..a3e542d --- /dev/null +++ b/app/src/main/java/com/vectras/vm/creator/utils/EditorUtils.java @@ -0,0 +1,20 @@ +package com.vectras.vm.creator.utils; + +import android.app.Activity; +import android.graphics.Color; +import android.graphics.drawable.ColorDrawable; +import android.view.WindowManager; + +import com.google.android.material.bottomsheet.BottomSheetDialog; + +public class EditorUtils { + public static BottomSheetDialog getDummyDialog(Activity activity) { + BottomSheetDialog dialog = new BottomSheetDialog(activity); + if (dialog.getWindow() != null) { + dialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); + dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); + } + + return dialog; + } +} diff --git a/app/src/main/java/com/vectras/vm/creator/VMCreatorSelector.java b/app/src/main/java/com/vectras/vm/creator/utils/VMCreatorSelector.java similarity index 83% rename from app/src/main/java/com/vectras/vm/creator/VMCreatorSelector.java rename to app/src/main/java/com/vectras/vm/creator/utils/VMCreatorSelector.java index 9e964c8..c2dcfab 100644 --- a/app/src/main/java/com/vectras/vm/creator/VMCreatorSelector.java +++ b/app/src/main/java/com/vectras/vm/creator/utils/VMCreatorSelector.java @@ -1,4 +1,4 @@ -package com.vectras.vm.creator; +package com.vectras.vm.creator.utils; import android.app.Activity; import android.content.Context; @@ -41,6 +41,15 @@ public class VMCreatorSelector { showDialog(activity, ListManager.threads(arch), position, callback, activity.getString(R.string.thread)); } + public static HashMap getMachine(Context context, String arch, int position) { + ArrayList> list = ListManager.machines(context, arch); + return list.get(position < 0 ? 0 : Math.min(position, list.size() - 1)); + } + + public static void machine(Activity activity, String arch, int position, UniversalPickerDialog.UniversalPickerDialogCallback callback) { + showDialog(activity, ListManager.machines(activity, arch), position, callback, activity.getString(R.string.machine)); + } + public static void networkCard(Activity activity, int position, UniversalPickerDialog.UniversalPickerDialogCallback callback) { showDialog(activity, ListManager.networkCards(activity), position, callback, activity.getString(R.string.network_card)); } diff --git a/app/src/main/java/com/vectras/vm/main/vms/DataMainRoms.java b/app/src/main/java/com/vectras/vm/main/vms/DataMainRoms.java index f979efd..68bfc1b 100644 --- a/app/src/main/java/com/vectras/vm/main/vms/DataMainRoms.java +++ b/app/src/main/java/com/vectras/vm/main/vms/DataMainRoms.java @@ -26,12 +26,14 @@ public class DataMainRoms { public String itemName = ""; // Board + public int machine = 0; + public boolean nvirt; // Nested virtualization public int cpu = 0; public int cores = 0; public int threads = 0; - public boolean battery = false; + public boolean battery; // Storage @@ -58,7 +60,7 @@ public class DataMainRoms { public String fdb = ""; - public boolean sharedFolder = false; + public boolean sharedFolder; // Network @@ -68,11 +70,11 @@ public class DataMainRoms { public int bootFrom = 0; - public boolean isShowBootMenu = false; + public boolean isShowBootMenu; public boolean isUseLocalTime = true; - public boolean isUseUefi = false; + public boolean isUseUefi; public boolean isUseDefaultBios = true; diff --git a/app/src/main/java/com/vectras/vm/manager/ParamManager.java b/app/src/main/java/com/vectras/vm/manager/ParamManager.java index 825ef5e..0570677 100644 --- a/app/src/main/java/com/vectras/vm/manager/ParamManager.java +++ b/app/src/main/java/com/vectras/vm/manager/ParamManager.java @@ -3,7 +3,19 @@ package com.vectras.vm.manager; import java.util.regex.Pattern; public class ParamManager { + public static boolean hasMachine(String param) { + return Pattern.compile("(? streamAudio.setVolume(value)); + if (isAdded() && requireActivity() instanceof X11Activity) { if (!streamAudio.getFile().equals(VmFileManager.findAudioRaw(getContext(), Config.vmID)) || !streamAudio.isPlaying()) { - binding.ivMute.setImageResource(R.drawable.volume_up_24px); - binding.tvMute.setText(R.string.unmute); +// binding.ivMute.setImageResource(R.drawable.volume_up_24px); +// binding.tvMute.setText(R.string.unmute); + binding.sliderVolume.setVisibility(View.GONE); } } else if (!streamAudio.isPlaying()) { - binding.ivMute.setImageResource(R.drawable.volume_up_24px); - binding.tvMute.setText(R.string.unmute); +// binding.ivMute.setImageResource(R.drawable.volume_up_24px); +// binding.tvMute.setText(R.string.unmute); + binding.sliderVolume.setVisibility(View.GONE); } - binding.lnMute.setOnClickListener(v -> mute()); + if (binding.sliderVolume.getVisibility() == View.VISIBLE) { + binding.lnMute.setVisibility(View.GONE); + } else { + binding.lnMute.setOnClickListener(v -> mute()); + } } if (infoBlock != null && (infoBlock.contains(QmpSender.DEFAULT_OPTICAL_DISC_1_ID) @@ -381,6 +393,10 @@ public class VmControllerDialog extends DialogFragment { if (isAdded() && requireActivity() instanceof MainVNCActivity mainVNCActivity) { + binding.sliderBrightness.setValue(vncCanvas.getAlpha() * 100); + binding.sliderBrightness.addOnChangeListener((slider, value, fromUser) -> vncCanvas.setAlpha(value / 100)); + + binding.lnRefresh.setOnClickListener(v -> { requireActivity().startActivity(new Intent(requireActivity(), MainVNCActivity.class)); requireActivity().overridePendingTransition(0, 0); @@ -512,6 +528,8 @@ public class VmControllerDialog extends DialogFragment { } else { binding.lnUserInterface.setVisibility(View.GONE); } + + if (streamAudio != null) lastVolume = streamAudio.getVolume(); }); }).start(); @@ -530,6 +548,13 @@ public class VmControllerDialog extends DialogFragment { if (onDismissCallback != null) { onDismissCallback.run(); } + + if (streamAudio != null && streamAudio.getVolume() == 0) { + if (lastVolume == 0) lastVolume = 1f; + + streamAudio.stop(); + streamAudio.setNextPlayVolume(lastVolume); + } } private void takeScreenshot() { @@ -577,29 +602,34 @@ public class VmControllerDialog extends DialogFragment { if (isAdded() && requireActivity() instanceof X11Activity) { if (streamAudio.isPlaying() && streamAudio.getFile().equals(VmFileManager.findAudioRaw(getContext(), Config.vmID))) { streamAudio.stop(); - binding.ivMute.setImageResource(R.drawable.volume_up_24px); - binding.tvMute.setText(R.string.unmute); +// binding.ivMute.setImageResource(R.drawable.volume_up_24px); +// binding.tvMute.setText(R.string.unmute); } else { if (!streamAudio.getFile().equals(VmFileManager.findAudioRaw(getContext(), Config.vmID))) { streamAudio.stop(); streamAudio.setFile(VmFileManager.findAudioRaw(getContext(), Config.vmID)); } streamAudio.play(); - binding.ivMute.setImageResource(R.drawable.volume_off_24px); - binding.tvMute.setText(R.string.mute); +// binding.ivMute.setImageResource(R.drawable.volume_off_24px); +// binding.tvMute.setText(R.string.mute); + binding.lnMute.setVisibility(View.GONE); + binding.sliderVolume.setVisibility(View.VISIBLE); } } else if (streamAudio.isPlaying()) { streamAudio.stop(); - binding.ivMute.setImageResource(R.drawable.volume_up_24px); - binding.tvMute.setText(R.string.unmute); +// binding.ivMute.setImageResource(R.drawable.volume_up_24px); +// binding.tvMute.setText(R.string.unmute); } else { if (isAdded() && requireActivity() instanceof MainVNCActivity) { streamAudio.play(); } else { VmAudioManager.stream(Config.vmID); } - binding.ivMute.setImageResource(R.drawable.volume_off_24px); - binding.tvMute.setText(R.string.mute); +// binding.ivMute.setImageResource(R.drawable.volume_off_24px); +// binding.tvMute.setText(R.string.mute); + + binding.lnMute.setVisibility(View.GONE); + binding.sliderVolume.setVisibility(View.VISIBLE); } } diff --git a/app/src/main/java/com/vectras/vm/manager/VmPicker.java b/app/src/main/java/com/vectras/vm/manager/VmPicker.java index a9306ed..7c91cef 100644 --- a/app/src/main/java/com/vectras/vm/manager/VmPicker.java +++ b/app/src/main/java/com/vectras/vm/manager/VmPicker.java @@ -3,7 +3,6 @@ package com.vectras.vm.manager; import android.app.Activity; import com.vectras.vm.R; -import com.vectras.vm.creator.VMCreatorSelector; import com.vectras.vm.utils.UniversalPickerDialog; import java.util.ArrayList; diff --git a/app/src/main/java/com/vectras/vm/settings/Minitools.java b/app/src/main/java/com/vectras/vm/settings/Minitools.java index 901c54c..0b8c9e9 100644 --- a/app/src/main/java/com/vectras/vm/settings/Minitools.java +++ b/app/src/main/java/com/vectras/vm/settings/Minitools.java @@ -25,7 +25,7 @@ import com.vectras.qemu.MainSettingsManager; import com.vectras.vm.AppConfig; import com.vectras.vm.R; import com.vectras.vm.VMManager; -import com.vectras.vm.creator.VMCreatorSelector; +import com.vectras.vm.creator.utils.VMCreatorSelector; import com.vectras.vm.databinding.ActivityMinitoolsBinding; import com.vectras.vm.main.MainActivity; import com.vectras.vm.manager.FirmwareManager; diff --git a/app/src/main/java/com/vectras/vm/setupwizard/SetupWizard2Activity.java b/app/src/main/java/com/vectras/vm/setupwizard/SetupWizard2Activity.java index 684c073..6bbcc81 100644 --- a/app/src/main/java/com/vectras/vm/setupwizard/SetupWizard2Activity.java +++ b/app/src/main/java/com/vectras/vm/setupwizard/SetupWizard2Activity.java @@ -28,7 +28,7 @@ import com.vectras.qemu.MainSettingsManager; import com.vectras.vm.AppConfig; import com.vectras.vm.R; import com.vectras.vm.VMManager; -import com.vectras.vm.creator.VMCreatorSelector; +import com.vectras.vm.creator.utils.VMCreatorSelector; import com.vectras.vm.databinding.ActivitySetupWizard2Binding; import com.vectras.vm.databinding.SetupQemuDoneBinding; import com.vectras.vm.main.MainActivity; diff --git a/app/src/main/java/com/vectras/vm/sound/StreamAudio.java b/app/src/main/java/com/vectras/vm/sound/StreamAudio.java index f5a4599..244917c 100644 --- a/app/src/main/java/com/vectras/vm/sound/StreamAudio.java +++ b/app/src/main/java/com/vectras/vm/sound/StreamAudio.java @@ -5,7 +5,6 @@ import android.content.Context; import android.media.AudioAttributes; import android.media.AudioFormat; import android.media.AudioTrack; -import android.media.audiofx.Equalizer; import android.util.Log; import com.vectras.vm.utils.FileUtils; @@ -20,6 +19,7 @@ public class StreamAudio { private int sampleRate = 48000; public boolean isDestroyed; private StreamAudio cross; + AudioTrack audioTrack; private SoundEffect soundEffect; public StreamAudio(Context context) { @@ -31,6 +31,7 @@ public class StreamAudio { } public void stop() { + if (audioTrack != null) audioTrack.stop(); isPlay = false; } @@ -58,6 +59,24 @@ public class StreamAudio { sampleRate = 48000; } + float volume = 1f; + + public void setVolume(float volume) { + this.volume = volume / 100; + if (audioTrack != null) audioTrack.setVolume(this.volume); + } + + float nextPlayVolume = -1; + + public void setNextPlayVolume(float volume) { + this.volume = volume / 100; + } + + public float getVolume() { + return volume * 100; + } + + public void release() { isPlay = false; releaseSoundEffect(); @@ -95,7 +114,7 @@ public class StreamAudio { return; } - AudioTrack audioTrack = new AudioTrack.Builder() + audioTrack = new AudioTrack.Builder() .setAudioAttributes(new AudioAttributes.Builder() .setUsage(AudioAttributes.USAGE_MEDIA) .build()) @@ -108,6 +127,10 @@ public class StreamAudio { .setTransferMode(AudioTrack.MODE_STREAM) .build(); + audioTrack.setVolume(nextPlayVolume < 0 ? volume : nextPlayVolume); + + nextPlayVolume = -1; + applyEffect(audioTrack); audioTrack.play(); diff --git a/app/src/main/res/drawable/brightness_5_24px.xml b/app/src/main/res/drawable/brightness_5_24px.xml new file mode 100644 index 0000000..371733f --- /dev/null +++ b/app/src/main/res/drawable/brightness_5_24px.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/layout/checkbox_view.xml b/app/src/main/res/layout/checkbox_view.xml index 38cb46b..3a7ad3a 100644 --- a/app/src/main/res/layout/checkbox_view.xml +++ b/app/src/main/res/layout/checkbox_view.xml @@ -17,5 +17,6 @@ android:id="@+id/checkbox" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:saveEnabled="false" android:clickable="false"/> \ No newline at end of file diff --git a/app/src/main/res/layout/creator_board_dialog.xml b/app/src/main/res/layout/creator_board_dialog.xml index f97b213..94656cb 100644 --- a/app/src/main/res/layout/creator_board_dialog.xml +++ b/app/src/main/res/layout/creator_board_dialog.xml @@ -34,6 +34,20 @@ android:paddingBottom="16dp" android:text="@string/board" /> + + + + + + + + + + + + + - - - - - + + \ No newline at end of file diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index e9457e0..c3fbef8 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -611,6 +611,46 @@ Tự động chuyển đổi khi kết nối và ngắt chuột rời. Các gói cần thiết đã được cài đặt. Đã xảy ra lỗi khi tạo ổ đĩa ảo. + Dùng ứng dụng Termux:X11 thay vì màn hình có sẵn. + Hiệu ứng mờ + Làm mờ xung quanh để tăng khả năng tập trung vào một vùng cần được chú ý. + Bạn cần khởi động lại ứng dụng khi chuyển đổi giữa tích hợp sẵn và ngoài. + Bộ chỉnh âm + Bổng, trung và trầm. + Bạn có thể cần khởi động lại máy ảo để áp dụng các thay đổi. Hiệu ứng âm thanh có thể chỉ có tác dụng nếu bạn sử dụng các phụ kiện như tai nghe. + Dùng bộ chỉnh âm + Bổng cao + Bổng + Trung + Trầm + Trầm sâu + Thiết bị của bạn không được hỗ trợ. + Hoàn tác + Bộ nhớ trong + Mở bằng + Trình chọn tệp + Trình chọn và duyệt tệp tích hợp sẵn. + Dùng trình chọn tệp + Tiếp tục + Tiếp tục ở thư mục cuối cùng mà bạn đã chọn tệp trong lần dùng trước đó. + Hiện các tệp ẩn + Áp dụng với các tệp và thư mục có tên bắt đầu bằng \".\". + Đã sap chép đường dẫn thư mục vào bảng tạm. + Đường phân cách + Thêm các đường phân cách giữa các mục. + Các ổ lưu trữ, thư mục được chia sẻ,… + Giấy phép nguồn mở + Bộ xử lý, nhân, luồng,… + Phần mềm + UEFI, khởi động từ, tuỳ chọn khởi động,… + Các tham số mở rộng,… + Loại thẻ + Thẻ mạng + Trống + Loại máy + Máy + Ảo hoá lồng nhau + Phát âm thanh Vterm @@ -766,42 +806,6 @@ Bàn phím Khác Đang thực thi, vui lòng đợi… - Dùng ứng dụng Termux:X11 thay vì màn hình có sẵn. - Hiệu ứng mờ - Làm mờ xung quanh để tăng khả năng tập trung vào một vùng cần được chú ý. - Bạn cần khởi động lại ứng dụng khi chuyển đổi giữa tích hợp sẵn và ngoài. - Bộ chỉnh âm - Bổng, trung và trầm. - Bạn có thể cần khởi động lại máy ảo để áp dụng các thay đổi. Hiệu ứng âm thanh có thể chỉ có tác dụng nếu bạn sử dụng các phụ kiện như tai nghe. - Dùng bộ chỉnh âm - Bổng cao - Bổng - Trung - Trầm - Trầm sâu - Thiết bị của bạn không được hỗ trợ. - Hoàn tác - Bộ nhớ trong - Mở bằng - Trình chọn tệp - Trình chọn và duyệt tệp tích hợp sẵn. - Dùng trình chọn tệp - Tiếp tục - Tiếp tục ở thư mục cuối cùng mà bạn đã chọn tệp trong lần dùng trước đó. - Hiện các tệp ẩn - Áp dụng với các tệp và thư mục có tên bắt đầu bằng \".\". - Đã sap chép đường dẫn thư mục vào bảng tạm. - Đường phân cách - Thêm các đường phân cách giữa các mục. - Các ổ lưu trữ, thư mục được chia sẻ,… - Giấy phép nguồn mở - Bộ xử lý, nhân, luồng,… - Phần mềm - UEFI, khởi động từ, tuỳ chọn khởi động,… - Các tham số mở rộng,… - Loại thẻ - Thẻ mạng - Trống diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 015590d..a3ef678 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -662,6 +662,13 @@ Card type Network card None + Use the Termux:X11 app instead of the built-in screen. + Blur effect + Blur the surrounding area to increase focus on a specific area that needs attention. + Machine type + Machine + Nested virtualization + Play sound @@ -818,14 +825,11 @@ Keyboard Other Executing command, please wait… - Use the Termux:X11 app instead of the built-in screen. - Blur effect - Blur the surrounding area to increase focus on a specific area that needs attention. Max Host - QEMU64 + QEMU64 QEMU32 Base KVM64 @@ -912,6 +916,18 @@ VirtIO Net VirtIO Net (Transitional) + + i440FX + Q35 + + ARM Virtual Machine + + Mac99 + Heathrow + bPlan Pegasos II + Eyetech AmigaOne + aCube Sam460ex + diff --git a/web/data/UpdateConfig.json b/web/data/UpdateConfig.json index 657461a..6c5d688 100644 --- a/web/data/UpdateConfig.json +++ b/web/data/UpdateConfig.json @@ -5,11 +5,11 @@ "url": "https://github.com/xoureldeen/Vectras-VM-Android/releases", "Message": "

4.3.0

\nBugs fixed.", "cancellable": true, - "versionCodeBeta":"139", - "versionNameBeta":"4.3.5", - "versionNameBetas":"4.0.1,4.0.2,4.0.3,4.0.4,4.0.5,4.0.6,4.0.7,4.0.8,4.0.9,4.1.1,4.1.2,4.1.3,4.1.4,4.1.5,4.1.6,4.1.7,4.1.8,4.1.9,4.2.1,4.2.2,4.2.3,4.2.4,4.2.5,4.2.6,4.2.7,4.2.8,4.2.9,4.3.0,4.3.1,4.3.2,4.3.3,4.3.4,4.3.5", + "versionCodeBeta":"140", + "versionNameBeta":"4.3.6", + "versionNameBetas":"4.0.1,4.0.2,4.0.3,4.0.4,4.0.5,4.0.6,4.0.7,4.0.8,4.0.9,4.1.1,4.1.2,4.1.3,4.1.4,4.1.5,4.1.6,4.1.7,4.1.8,4.1.9,4.2.1,4.2.2,4.2.3,4.2.4,4.2.5,4.2.6,4.2.7,4.2.8,4.2.9,4.3.0,4.3.1,4.3.2,4.3.3,4.3.4,4.3.5,4.3.6", "sizeBeta": "45 MB", "urlBeta": "https://github.com/AnBui2004/Vectras-VM-Emu-Android/releases", - "MessageBeta": "

4.3.5

Bugs fixed.", + "MessageBeta": "

4.3.6

Bugs fixed.", "cancellableBeta": true }