Iris: "the organization of the rust rewrite is a mess right now... there shouldn't be anything related to the app inside of iris. Iris is supposed to be the UI framework alone." And, on the crate count: "I'm confused why the app only code needs more than one crate though." Nine cargo workspaces become three, and the port's project code -- which sat in five places, four of them inside the framework -- becomes one crate, `ai-app`, in `app-rust/`: client-core -> app-rust/src/client iris/transcript-ui -> app-rust/src/ui iris/transcript-fixture -> app-rust/src/ui/fixture.rs + tests/ + touch/ iris/desktop-app -> app-rust/src/desktop + src/bin_desktop.rs iris/android-app -> app-rust/src/android + android-project/ android-shell -> app-rust/src/shell iris/ keeps core, macro, the iris crate, tabs-ui and rig-input, and now mentions no session, transcript, setup or server anywhere. Only two of the old splits had a reason that survived reading. event-model stays a crate at the repo root because server/ depends on it too, so a crate is what makes the backend and the app agree by construction. The two Android .so names looked like a hard constraint -- a package produces one library artifact -- until P2 turned out to already plan merging those two Android apps into one; both faces now come out of libai_app.so, picked apart by features so `--no-default-features --features shell` keeps wgpu, parley and iris out of the Compose app's APK. docs/RUST.md's "One app crate" has the rest, including what each remaining feature is for. DECISIONS.md and SUBAGENTS.md move into docs/ with everything else. Verified: ./run-tests.sh and `cd iris && cargo test` green, clippy and fmt clean in all five workspaces, `cargo ndk -t x86_64` links libai_app.so, build-apk.sh produces an APK that installs and launches on this checkout's emulator (Gl ... virgl, as expected), and the phone-sized headless screenshot renders the transcript unchanged. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
69 lines
3.4 KiB
XML
69 lines
3.4 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
|
|
|
<!-- Only needed by the transcript-screen feature (RUST.md's I5),
|
|
which talks to a real ai-server; the plain tabs demo (I2/I4) makes
|
|
no network call and never noticed this was missing. Absent,
|
|
UreqTransport::new's connect failed with EPERM (Operation not
|
|
permitted), not the ECONNREFUSED/ENETUNREACH a firewall or a dead
|
|
server would give: a seccomp-level socket denial reads nothing
|
|
like a network problem, which is what made it worth a comment. -->
|
|
<uses-permission android:name="android.permission.INTERNET" />
|
|
|
|
<application
|
|
android:allowBackup="true"
|
|
android:label="iris android-view demo"
|
|
android:theme="@android:style/Theme.Material.Light.NoActionBar">
|
|
<activity
|
|
android:name=".MainActivity"
|
|
android:configChanges="orientation|screenSize|screenLayout|keyboardHidden"
|
|
android:exported="true"
|
|
android:windowSoftInputMode="adjustResize">
|
|
<intent-filter>
|
|
<action android:name="android.intent.action.MAIN" />
|
|
<category android:name="android.intent.category.LAUNCHER" />
|
|
</intent-filter>
|
|
|
|
<!-- The enrollment link Dev Updater's Enroll button opens
|
|
(what `ai-server` mints), the same one the Compose app
|
|
in `app/` registers: which app answers it is the phone
|
|
owner's choice at the moment of the tap, and both being
|
|
offered is the intended behaviour rather than a clash.
|
|
BROWSABLE so a link tapped in another app reaches here,
|
|
and `android:host` so this app is not offered for every
|
|
aiapp:// URI a future route invents. -->
|
|
<intent-filter>
|
|
<action android:name="android.intent.action.VIEW" />
|
|
<category android:name="android.intent.category.DEFAULT" />
|
|
<category android:name="android.intent.category.BROWSABLE" />
|
|
<data android:scheme="aiapp" android:host="enroll" />
|
|
</intent-filter>
|
|
|
|
<meta-data android:name="android.app.lib_name" android:value="ai_app" />
|
|
</activity>
|
|
|
|
<!-- This app's own recent log, for Dev Updater to read on the
|
|
phone. Iris runs these builds with no adb, and Android
|
|
forbids one app reading another's logcat, so this is the
|
|
only way a log::info! here reaches her. The shape is Dev
|
|
Updater's contract (its README.md, "An app's own log"), not
|
|
something invented for this app.
|
|
|
|
The authority carries ${applicationId}, so the bench package
|
|
and the ordinary one each get their own and neither can read
|
|
the other's log. Exported, because the whole point is
|
|
another app reading it, and guarded by a permission Dev
|
|
Updater declares at protectionLevel="normal" (a signature
|
|
permission is not available: the two apps are signed with
|
|
different locally generated keys). Read-only: insert,
|
|
update and delete throw. -->
|
|
<provider
|
|
android:name=".DevLogProvider"
|
|
android:authorities="${applicationId}.devlog"
|
|
android:exported="true"
|
|
android:readPermission="dev.updater.permission.READ_DEVLOG" />
|
|
|
|
</application>
|
|
|
|
</manifest>
|