Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 62 additions & 0 deletions .github/workflows/android-verify.yml
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,68 @@ jobs:
- name: Verify Android build and lint
run: ./gradlew :app:lintRelease :app:testDebugUnitTest :app:assembleRelease :app:bundleRelease

android-ui:
runs-on: ubuntu-latest
timeout-minutes: 20
steps:
- name: Check out repository
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5

- name: Set up Java
uses: actions/setup-java@c1e323688fd81a25caa38c78aa6df2d33d3e20d9
with:
distribution: temurin
java-version: "17"

- name: Set up Gradle
uses: gradle/actions/setup-gradle@0b6dd653ba04f4f93bf581ec31e66cbd7dcb644d

- name: Build app and UI tests
run: |
chmod +x gradlew
./gradlew :app:assembleDebug :app:assembleDebugAndroidTest

- name: Start Android 35 emulator
run: |
sudo chmod 666 /dev/kvm
export PATH="$ANDROID_HOME/platform-tools:$ANDROID_HOME/cmdline-tools/latest/bin:$PATH"
export ANDROID_USER_HOME="$RUNNER_TEMP/ventoid-android"
export ANDROID_AVD_HOME="$ANDROID_USER_HOME/avd"
mkdir -p "$ANDROID_AVD_HOME"
echo "$ANDROID_HOME/platform-tools" >> "$GITHUB_PATH"
"$ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager" "system-images;android-35;google_apis;x86_64"
echo no | "$ANDROID_HOME/cmdline-tools/latest/bin/avdmanager" create avd -n ventoid-ci -p "$ANDROID_AVD_HOME/ventoid-ci.avd" -k "system-images;android-35;google_apis;x86_64"
test -f "$ANDROID_AVD_HOME/ventoid-ci.ini"
"$ANDROID_HOME/emulator/emulator" -avd ventoid-ci -port 5554 -no-window -no-audio -no-boot-anim -no-snapshot -gpu swiftshader_indirect > emulator.log 2>&1 &
emulator_pid=$!
boot_deadline=$((SECONDS + 180))
until [ "$(adb -s emulator-5554 shell getprop sys.boot_completed 2>/dev/null | tr -d '\r')" = 1 ]; do
if ! kill -0 "$emulator_pid" 2>/dev/null || (( SECONDS >= boot_deadline )); then
cat emulator.log
exit 1
fi
sleep 2
done
adb -s emulator-5554 shell input keyevent 82

- name: Verify UI, rotation, confirmation, and diagnostic exports
shell: bash
run: |
adb -s emulator-5554 install -r app/build/outputs/apk/debug/app-debug.apk
adb -s emulator-5554 install -r app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk
adb -s emulator-5554 shell am instrument -w com.ventoid.app.test/androidx.test.runner.AndroidJUnitRunner | tee android-ui.log
grep -E '^OK \([1-9][0-9]* tests?\)' android-ui.log

- name: Retain emulator test logs
if: always()
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02
with:
name: android-ui-logs
path: |
android-ui.log
emulator.log
retention-days: 7

fdroid-release-preflight:
if: startsWith(github.ref, 'refs/tags/v') || github.event_name == 'workflow_dispatch'
runs-on: ubuntu-latest
Expand Down
18 changes: 18 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,24 @@ Tagged releases and the entries below distinguish published behavior from change
available only in a source checkout. GitHub and F-Droid builds use separate
signing identities.

## Unreleased — 0.4.1

- Use the adaptive launcher artwork contributed in PR #21, including themed icons
and a contrasting background on older Android versions.
- Keep USB work and progress in a connected-device foreground service across
screen rotation and app switching. Do not replay writes after process death.
- Reserve one operation before requesting permission; reject duplicate service
starts and lock refresh, drive selection, and layout controls until it ends.
- Read the actual drive capacity before showing an erase confirmation. Bind the
confirmed request to that connection and capacity, and keep Update/Repair separate.
- Refresh USB connections automatically, invalidate stale analysis, and stop at
the next I/O boundary after a drive is detached.
- Preview, save, and share diagnostics containing app/phone/drive details, status,
and a bounded recent log. Share only reports through a private FileProvider.
- Add Korean UI strings and offline ISO-copying, first-boot, and MOK enrollment
help; translate the new controls for the existing Chinese UI.
- Keep the bundled Ventoy 1.1.18 payload and existing release signing identities.

## 0.4.0 — 2026-10-13

### Bundled Ventoy
Expand Down
23 changes: 23 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,9 @@ in the [roadmap](ROADMAP.md).
4. Select the target USB device carefully.
5. Choose MBR or GPT layout.
6. Start USB preparation.
Check the device name, capacity, partition scheme, and reserved space in the
erase confirmation before proceeding. Use Update or Repair to preserve an
existing Ventoy data partition.
7. After Ventoid prepares the drive, remount it if needed, then copy ISO files to the exFAT data partition with Android Files or another file manager.

Ventoid writes to the selected USB drive. This can erase or overwrite existing data. Back up anything important first.
Expand Down Expand Up @@ -64,6 +67,15 @@ Ventoid writes to the selected USB drive. This can erase or overwrite existing d
- Reconnect the drive after opening Ventoid and grant the USB permission prompt.
- If the drive disconnects or repeatedly disappears, try a direct OTG adapter, a powered hub, or another USB port or drive.

### Sharing a diagnostic report

Open **Diagnostics**, review the device details and recent log, then choose
**Save report** or **Share report**. Reports include the app version, Android/phone
model, selected USB device, operation and status, available drive analysis, and
up to 64 KiB of recent log text. Sharing happens only when you choose a target.
The app also includes offline **USB and first-boot help**, including ISO copying
and the bundled Ventoy MOK certificate enrollment path.

### The exFAT data partition is not visible after preparation

Remount or physically reconnect the drive after Ventoid finishes. Android should then expose the exFAT data partition so ISO files can be copied with Android Files or another file manager.
Expand Down Expand Up @@ -107,6 +119,14 @@ Successful and failed hardware combinations can be submitted with the [device co
- Validate reserved space before writing, sample written core/EFI sectors for
readback verification, and re-analyse the drive after installation
- Show transfer speed and estimated remaining time while writing VTOYEFI
- Keep one USB operation and its progress across screen rotation and app
switching using a foreground service and progress notification. Notification
permission can be declined; operations still work. Force-stop, process death,
and unplugging the drive do not automatically resume a write.
- Lock USB/layout controls during an operation, confirm destructive preparation,
and detect USB attachment and removal automatically
- Preview, save, or share a diagnostic report with a bounded recent log
- Korean and Chinese UI, with offline USB and first-boot help
- Keep five stable progress rows for the partition table, core image, exFAT data,
Ventoy EFI, and final checks, with progress shown directly on the install action
- No ads
Expand All @@ -120,6 +140,9 @@ reach the Ventoy 1.1.18 menu under both BIOS and UEFI for fresh and updated
MBR/GPT layouts; ISO guest boots, Secure Boot enforcement, and physical Android
OTG workflows still need separate verification.

The 0.4.1 UI and operation-lifetime changes above are available in development
until a corresponding release is tagged; see the changelog for release status.

## Install

The recommended install path is F-Droid:
Expand Down
14 changes: 8 additions & 6 deletions ROADMAP.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Ventoid development roadmap

Updated: 2026-10-13. This is a development plan, not a list of released features.
Updated: 2026-11-01. This is a development plan, not a list of released features.
See [CHANGELOG.md](CHANGELOG.md) for implemented changes and
[RECOVERY-HANDOFF.md](RECOVERY-HANDOFF.md) for historical verification evidence.

Expand All @@ -9,10 +9,10 @@ See [CHANGELOG.md](CHANGELOG.md) for implemented changes and
| Item | State |
| --- | --- |
| Latest published Ventoid release | 0.4.0, versionCode 16, tag `v0.4.0` |
| App version in this checkout | 0.4.0, versionCode 16 |
| App version in this checkout | 0.4.1, versionCode 17 |
| Bundled Ventoy | 1.1.18 |
| Latest upstream release checked | [Ventoy 1.1.18](https://github.com/ventoy/Ventoy/releases/tag/v1.1.18), published 2026-10-09 |
| Next app release target | next feature release (unassigned) |
| Next app release target | 0.4.1: USB operation reliability and diagnostics |

Implemented development changes include drive inspection, non-destructive
updates, ISO listing and free-space analysis, large-drive support, sampled
Expand Down Expand Up @@ -45,12 +45,14 @@ verified.

## Feature backlog

The 0.4.1 candidate implements retained foreground USB work, duplicate-operation
guards, erase confirmation, hotplug handling, diagnostics export, Korean UI, and
offline first-boot help. Android emulator lifecycle checks use a synthetic USB
target; they establish UI/state retention rather than physical OTG behavior.

| Priority | Feature | Acceptance target |
| --- | --- | --- |
| P1 | Retain long-running work across UI recreation | Rotation and app switching preserve one USB operation and its progress; an appropriate foreground service owns long-running writes. |
| P1 | Richer ISO browser | Show path and size, search and sort, and clearly report scan/list limits. |
| P1 | Export diagnostics | Save or share a user-reviewed report containing app/device versions, drive details, operation stage, and the relevant log. |
| P1 | Korean UI and first-boot help | Translate user-facing strings and provide offline MOK enrollment guidance without promising firmware compatibility. |
| P2 | Optional full readback and ISO checksums | Verify the actual written regions and compare a streamed ISO SHA-256 against a supplied reference; handle cancellation and progress. |
| P2 | Boot-region backup and recovery | Save the relevant boot regions before updating and restore only after matching the drive identity and partition layout. |
| P2 | In-app ISO copying | Start with USB volumes exposed through Android's document provider; check space, handle interrupted copies, and verify completion. |
Expand Down
6 changes: 4 additions & 2 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@ android {
applicationId = "com.ventoid.app"
minSdk = 21
targetSdk = 35
versionCode = 16
versionName = "0.4.0"
versionCode = 17
versionName = "0.4.1"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
signingConfigs {
Expand Down Expand Up @@ -100,4 +100,6 @@ dependencies {

testImplementation(libs.junit.jupiter)
testImplementation(libs.test.core)
androidTestImplementation(libs.test.core)
androidTestImplementation(libs.test.runner)
}
Loading
Loading