Files
kvitt/android/app/src/main/AndroidManifest.xml
T
jacobh2 cb832a7cac M8: app integration — navigation, :data bindings in both variants, FCM adapter, push notifications, hardening
:app binds every :core:model interface to :data in debug and release (AppDataModule, D-085); the
debug fakes module is gone. NavHost over all feature screens with the session gate (S-1, S-2, S-18),
bottom destinations from each screen's own bar, result snackbars, deep links (kvitt://invite and the
/i/<CODE> landing link) and notification taps. :adapter:fcm maps payload v1 to PushEvent and registers
by Firebase Installation ID (firebase-messaging 26, D-087). Push work runs in WorkManager: expedited
sync waited up to 20 s, then the notification from local data or the generic text. WorkManager uses
KvittWorkerFactory, Coil uses :data's ImageLoader, SyncTriggers on start and foreground, update check
in release only. Network security configs (debug cleartext, D-086; pinned-root variant), release
signing from local.properties, notification permission after the first sync.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TQd3pEP9UeN2uifbHknQ7B
2026-10-18 14:25:46 +02:00

62 lines
2.9 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">
<!-- AC-2.9: asked after the first full sync that follows a pairing. -->
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<!-- FR-16: PackageInstaller (declared by :data as well). -->
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<!-- SPEC §8.8: no backup, no device transfer; network security per build type (§8.5). -->
<application
android:name=".KvittApplication"
android:allowBackup="false"
android:dataExtractionRules="@xml/data_extraction_rules"
android:label="@string/app_name"
android:networkSecurityConfig="@xml/network_security_config"
android:supportsRtl="true"
android:theme="@android:style/Theme.Material.NoActionBar">
<!-- The only exported activity (§8.8): launcher, the invite links of AC-2.6 and notification taps. -->
<activity
android:name=".MainActivity"
android:exported="true"
android:launchMode="singleTask"
android:windowSoftInputMode="adjustResize">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<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="kvitt" android:host="invite" />
</intent-filter>
<!-- Unverified link: the user may get a chooser (AC-2.6). -->
<intent-filter android:autoVerify="false">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:scheme="https"
android:host="icehack.asuscomm.com"
android:port="8443"
android:pathPrefix="/i/" />
</intent-filter>
</activity>
<!-- WorkManager is configured by KvittApplication (KvittWorkerFactory, D-041): no default initializer. -->
<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
android:exported="false"
tools:node="merge">
<meta-data
android:name="androidx.work.WorkManagerInitializer"
android:value="androidx.startup"
tools:node="remove" />
</provider>
</application>
</manifest>