`./gradlew :androidApp:lintDebug` had apparently never been run. It reported 11 errors, 8 warnings and 3 hints, and one of the errors was a crash: UsageScreen formats its reset countdown with java.time -- OffsetDateTime and Duration, both API 26 -- while minSdk is 24 and core library desugaring was off. On 24 and 25 that is a NoClassDefFoundError, and the `catch (_: Exception)` around the code does not stop an Error, so the usage screen would have died rather than degraded. Core library desugaring is now on, with desugar_jdk_libs 2.1.5. Verified by looking in the built APK rather than trusting the flag: it now carries Lj$/time/Duration and Lj$/time/OffsetDateTime, the backported classes the call sites are rewritten against. The rest: the two KTX suggestions taken (SharedPreferences.edit's block form, which cannot forget its apply(), and String.toUri), the three autoboxing hints taken (mutableIntStateOf/mutableLongStateOf), and androidx.core:core-ktx declared at 1.19.0 rather than inherited through activity-compose, since this code now calls its extensions directly. Two are suppressed with their reasons, both scoped to the one element. DiscouragedApi on the scanner's screenOrientation, which is not a pin but the removal of the library's landscape lock. MissingApplicationIcon, because there is no icon yet and that is a decision to make later, not an oversight -- an app with no icon is obvious to anyone who opens a launcher, so the warning tells nobody here anything. 0 errors now. The 4 warnings left are one thing: Compose Multiplatform 1.12.0 is out and this is on 1.11.1. That is an upgrade to decide on, not a defect, so it is left for its own change. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017xn8nHw1tw1R6PtiY1eEtw
75 lines
4.1 KiB
XML
75 lines
4.1 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=".EnrollmentScanActivity"
|
|
android:clearTaskOnLaunch="true"
|
|
android:screenOrientation="fullSensor"
|
|
android:stateNotNeeded="true"
|
|
android:theme="@style/zxing_CaptureTheme"
|
|
android:windowSoftInputMode="stateAlwaysHidden"
|
|
tools:ignore="DiscouragedApi" />
|
|
</application>
|
|
</manifest>
|