You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: CHANGELOG.md
+10-1Lines changed: 10 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -2,14 +2,23 @@
2
2
3
3
All notable project changes are documented here.
4
4
5
+
## [0.2.3] - 2026-08-07
6
+
7
+
Android 16 foreground-service startup hotfix.
8
+
9
+
### Fixed
10
+
11
+
- Restored the normal `CHANGE_NETWORK_STATE` permission required by Android as a `connectedDevice` foreground-service prerequisite before USB permission is available.
12
+
- Added manifest regression coverage so the companion cannot again ship with a cold-start crash caused by the missing prerequisite.
13
+
5
14
## [0.2.2] - 2026-08-06
6
15
7
16
Repository-opening hardening release.
8
17
9
18
### Changed
10
19
11
20
- AOA manufacturer is now `Zhilin` and the accessory URI points to the canonical GitHub repository.
12
-
- Removed unused network-state permission, both unused FileProviders, and their path resources.
21
+
- Removed both unused FileProviders and their path resources. The network-state permission removed in this release was restored in 0.2.3 after real Android 16 verification proved it is a foreground-service prerequisite.
Copy file name to clipboardExpand all lines: README.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -4,7 +4,7 @@ Display Bridge turns Rokid Glasses into a low-latency, video-only Android displa
4
4
5
5
> **Independent project:** Display Bridge is not affiliated with, endorsed by, or an official product of Rokid Corporation. Rokid and related product names are trademarks of their respective owners.
6
6
7
-
> **MVP status:**`v0.2.2` is the stable, release-signed build. The core External Display and Screen Mirror paths work on the target Pixel/RG_glasses pair, while several long-run and physical-input acceptance checks remain documented as pending.
7
+
> **MVP status:**`v0.2.3` is the current release-signed MVP and supersedes the Android 16 startup-broken `v0.2.2`. The core External Display and Screen Mirror paths work on the target Pixel/RG_glasses pair, while several long-run and physical-input acceptance checks remain documented as pending.
- Restored the normal `CHANGE_NETWORK_STATE` permission used by Android as a prerequisite for starting a `connectedDevice` foreground service before USB device or accessory permission exists.
8
+
- Added manifest regression coverage for the prerequisite.
9
+
- Verified on Pixel 10 user 0 that the release-signed companion cold-starts without the v0.2.2 fatal `SecurityException` and remains in the foreground.
10
+
- Installed and hash-verified the matching release-signed glasses APK on the target RG_glasses device.
11
+
12
+
The application does not use this permission to change routing, Wi-Fi, Bluetooth, or the user's audio route.
Copy file name to clipboardExpand all lines: docs/short-term-acceptance-plan.md
+3-1Lines changed: 3 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -6,13 +6,15 @@ Goal: close the 20 remaining hardware/evidence-gated OpenSpec tasks without mixi
6
6
7
7
1. Run `adb devices -l`, verify the exact phone owner profile and glasses serial, and record package versions before changes.
8
8
2. If Android reports a signature mismatch, remove only the two Display Bridge debug packages after explicit approval; never remove unrelated accessory applications.
9
-
3. Install both release-signed v0.2.2 APKs together because the AOA manufacturer changed to `Zhilin`.
9
+
3. Install both release-signed v0.2.3 APKs together because the AOA manufacturer changed to `Zhilin` and 0.2.3 repairs Android 16 foreground-service startup.
10
10
4. Verify package coexistence and that only the Display Bridge glasses app matches the new accessory identity.
11
11
5. With glasses ADB unavailable, open the companion, attach USB, verify automatic permission/handshake/External Display startup, then detach and confirm idempotent cleanup plus HOME.
12
12
6. Reconnect once and confirm no ambiguous chooser or duplicate concurrent permission request.
Result (2026-08-07): complete. Both v0.2.3 APKs were installed on the exact devices; automatic accessory dispatch, the two distinct Android USB permission stages, detach-to-HOME, and clean reconnect were verified without removing or disabling unrelated packages.
17
+
16
18
## Session 2 — Core video modes and switching (45–60 minutes)
17
19
18
20
1. External Display: use one known presentation-capable independent application, confirm presentation display discovery, non-empty encoded/sent/decoded counters, visible glasses video, phone-side controls, and phone/Bluetooth audio.
Both APKs use APK Signature Scheme v2 and the same dedicated release certificate:
34
34
@@ -39,15 +39,21 @@ The private key and credentials are kept outside Git. They are not included in r
39
39
40
40
The PKCS12 keystore and ignored signing-properties file are backed up in the master-password-protected Bitwarden Secure Note `Rokid Display Bridge Release Signing`. Both attachments and their metadata were verified through Bitwarden CLI, the vault was synchronized, and the temporary CLI session file was deleted.
41
41
42
-
Packaged manifests were also checked to confirm that the unused `CHANGE_NETWORK_STATE`permission and FileProviders are absent. The glasses accessory filter contains manufacturer `Zhilin`, model `Rokid Display Bridge`, and version `1.0`; the companion advertises `https://github.com/azhilin246/RokidDisplayBridge` as its AOA URI.
42
+
Packaged manifests were checked to confirm that FileProviders remain absent and that the companion retains `CHANGE_NETWORK_STATE`. Android 16 accepts this normal permission as the connected-device foreground-service prerequisite before USB permission exists; the application does not use it to mutate network routing. The glasses accessory filter contains manufacturer `Zhilin`, model `Rokid Display Bridge`, and version `1.0`; the companion advertises `https://github.com/azhilin246/RokidDisplayBridge` as its AOA URI.
43
43
44
44
## Device evidence
45
45
46
-
Development and iterative testing used a Pixel 10 owner profile and RG_glasses with a physical 480×640 display. The user confirmed that the application-neutral External Display MVP renders real content on the glasses. Companion and glasses packages have also been installed and cold-started independently without a matching fatal `AndroidRuntime` failure.
46
+
Development and iterative testing used a Pixel 10 owner profile and RG_glasses with a physical 480×640 display. The user confirmed that the application-neutral External Display MVP renders real content on the glasses.
47
+
48
+
The release-signed v0.2.2 companion reproduced an Android 16 `SecurityException` while starting `BridgeService` as a `connectedDevice` foreground service before USB permission. Release-signed v0.2.3 was installed in Pixel user 0, cold-started with the same companion-visibility intent, and remained alive as a foreground service with type `0x10`; the cleared crash buffer remained empty. The matching v0.2.3 glasses APK was then installed in place on exact serial `1901092553801899`. Package Manager reported version `0.2.3` (`5`) and release signature `[ad9a3b73]`; the pulled installed base APK matched the release artifact at SHA-256 `305D3CC92AC8585A26D715961C68E39F2C2160AA9E19A7F63E67475982750C0A`.
49
+
50
+
Session 1 then proved system accessory dispatch and detach behavior without glasses ADB. Android requested permission once for the normal `18d1:4ee7` device (`DEVICE_TO_AOA`) and once for the re-enumerated `18d1:2d01` device (`AOA_DATA`), with distinct device ids and no concurrent duplicate request per stage. AOA/DBP1 opened, External Display started automatically, and decoder feedback returned with a zero sender queue. The user confirmed that removing the active cable closed Display Bridge on the glasses and returned to HOME. USB host history and a fresh session showed automatic reconnect, a recreated 480×640 `PRESENTATION | OWN_CONTENT_ONLY` External Display, and resumed decoder feedback without a stale-session or fatal error.
51
+
52
+
Session 1 is complete. Both release-signed v0.2.3 APKs are installed on their exact target devices, system accessory dispatch opens only Display Bridge without an ambiguous chooser, and no unrelated package was uninstalled or disabled during install, detach, or reconnect verification. The two visible USB permission dialogs belong to the normal-device and re-enumerated AOA-device stages rather than duplicate requests for one Android `UsbDevice`.
47
53
48
54
This evidence is intentionally summarized without publishing personal ADB serials, process IDs, local paths, or unrelated installed package names.
49
55
50
-
The `v0.2.2` release certificate was verified automatically, but the release-signed APKs were not installed over the existing debug builds because Android requires a one-time uninstall when changing signing certificates.
56
+
Changing from the old debug certificate required a one-time removal of only the Display Bridge packages. Subsequent v0.2.2 to v0.2.3 companion update succeeded in place with the dedicated release certificate.
0 commit comments