The four Kotlin files that were the link rather than this product now come from the submodule: the pinned TrustManager, the enrollment store and its Keystore sealing, the QR capture activity, and the local-network permission check. `:link` is a subproject resolved by path, so the app half is version-locked to the same commit the Rust half already was. What stays here is the two facts that are actually about this app, and both are load-bearing in a way that would fail quietly if got wrong: the `aiapp` URI scheme, and the Keystore alias `aiapp-token-key` that every enrolled phone's token is already sealed under. A wrong alias would leave those phones reading as not enrolled with nothing on screen to explain it, so the value is carried over exactly and the reason is written beside it. Call sites are unchanged. `ServerSettings` stays available unqualified as a typealias and `applyPinnedTls()` stays an extension, so the diff is the three files that bind the product-specific values plus two imports -- rather than every screen that happens to use a setting. Also clears a warning the build had been printing: `setup?.id.orEmpty()` where the compiler already knows `setup` is non-null, because `chosen` came from that setup's own provider list. Verified by running the build, not only by reading it: ktfmt, Kotlin compile and Android Lint are all clean with no warnings, and the APK still builds -- which exercises the pinned-CA generator, since that is the step that reads the CA off this machine. Still unpushed, per the hold until the rebuild bug is proven fixed. Note the submodule: a checkout of this commit needs `git submodule update --init` before `app/` or `server/` will build.
75 lines
4.2 KiB
XML
75 lines
4.2 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
|
xmlns:tools="http://schemas.android.com/tools">
|
|
<uses-permission android:name="android.permission.INTERNET" />
|
|
<!-- Android 17 (API 37) made Local Network Protection mandatory: an app
|
|
targeting 37+ needs this runtime permission to reach *any* local
|
|
network address, including a plain socket to a LAN IP literal.
|
|
Without it the traffic is silently dropped, surfacing only as a
|
|
connect timeout. See MainActivity.kt's runtime request, and
|
|
dev-updater's manifest for the full story. -->
|
|
<uses-permission android:name="android.permission.ACCESS_LOCAL_NETWORK" />
|
|
|
|
<!-- tools:ignore MissingApplicationIcon: there is no icon yet, and
|
|
that is a decision rather than an oversight. An app with no icon
|
|
of its own is obvious to anyone who opens a launcher, so the
|
|
warning tells nobody here anything they cannot already see, and
|
|
the fix is a judgement about how this app should look. Drop this
|
|
suppression when a real icon lands. -->
|
|
<application
|
|
android:label="AI Sessions"
|
|
android:allowBackup="true"
|
|
android:theme="@android:style/Theme.Material.Light.NoActionBar"
|
|
tools:ignore="MissingApplicationIcon">
|
|
<!-- adjustResize (not the system's default pan): the layout handles
|
|
the keyboard itself via imePadding(), so the window must resize
|
|
rather than slide the top bar off screen. -->
|
|
<activity
|
|
android:name=".MainActivity"
|
|
android:exported="true"
|
|
android:launchMode="singleTop"
|
|
android:windowSoftInputMode="adjustResize"
|
|
android:theme="@android:style/Theme.Material.Light.NoActionBar">
|
|
<intent-filter>
|
|
<action android:name="android.intent.action.MAIN" />
|
|
<category android:name="android.intent.category.LAUNCHER" />
|
|
</intent-filter>
|
|
<!-- Enrollment: the server prints its aiapp://enroll QR to the
|
|
terminal. This intent filter is the fallback path for a
|
|
camera app that redirects a scanned aiapp:// URI here
|
|
directly; the Settings screen's own "Scan QR code" button
|
|
(zxing-android-embedded) is the primary path and needs no
|
|
filter, since it decodes the QR itself and hands the URI
|
|
to parseEnrollmentUri in-process. -->
|
|
<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>
|
|
</activity>
|
|
|
|
<!-- The scanner behind Settings' "Scan QR code". Declared here so
|
|
it can drop the library CaptureActivity's landscape pin: the
|
|
code being scanned is usually on a monitor in front of someone
|
|
holding the phone upright. zxing_CaptureTheme is the library's
|
|
own fullscreen theme, which is all the activity needs. -->
|
|
<!-- tools:ignore DiscouragedApi: lint flags every fixed
|
|
screenOrientation, because Android 16 ignores most of them.
|
|
This one is not a pin but its removal. fullSensor is what
|
|
drops the library's landscape lock, so the activity follows
|
|
the phone rather than asking anyone to turn it, and where the
|
|
platform ignores the attribute the behaviour is the one this
|
|
asked for anyway. Scoped to this activity, so a genuine pin
|
|
elsewhere would still be reported. -->
|
|
<activity
|
|
android:name="com.example.wgapplink.EnrollmentScanActivity"
|
|
android:clearTaskOnLaunch="true"
|
|
android:screenOrientation="fullSensor"
|
|
android:stateNotNeeded="true"
|
|
android:theme="@style/zxing_CaptureTheme"
|
|
android:windowSoftInputMode="stateAlwaysHidden"
|
|
tools:ignore="DiscouragedApi" />
|
|
</application>
|
|
</manifest>
|