5.6 KiB · text History b868907
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">

    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.CAMERA"/>
    <!-- Asked for when a run is first watched, not at launch: the app
         has nothing to say until then. -->
    <uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
    <uses-feature android:name="android.hardware.camera" android:required="false"/>
    <!-- A TV, for the live CI wall: no touchscreen, and a home screen of
         its own (the leanback launcher) to be found on. Neither is
         required, so phones and tablets install it as before. -->
    <uses-feature android:name="android.hardware.touchscreen" android:required="false"/>
    <uses-feature android:name="android.software.leanback" android:required="false"/>

    <application
        android:label="@string/app_name"
        android:icon="@mipmap/ic_launcher"
        android:roundIcon="@mipmap/ic_launcher"
        android:banner="@drawable/tv_banner"
        android:allowBackup="false"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:supportsRtl="true"
        android:theme="@style/Theme.GitGud"
        android:usesCleartextTraffic="true">

        <activity
            android:name=".MainActivity"
            android:exported="true"
            android:launchMode="singleTask"
            android:theme="@style/Theme.GitGud"
            android:configChanges="orientation|screenSize|screenLayout|smallestScreenSize|keyboard|keyboardHidden|navigation">
            <!-- Compose redraws for these itself. Without them, the CI
                 wall hiding the system bars resizes the window, which on
                 Android 14 and older rebuilds the activity, which shows the
                 bars again: a loop that flickers the wall between
                 "Loading…" and its cards. -->
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>

            <!-- A TV's home screen. Opens straight onto the CI wall. -->
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LEANBACK_LAUNCHER"/>
            </intent-filter>

            <!-- gitgud://wall — the "Live CI wall" launcher shortcut. -->
            <intent-filter android:autoVerify="false">
                <action android:name="android.intent.action.VIEW"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <data android:scheme="gitgud" android:host="wall"/>
            </intent-filter>

            <meta-data
                android:name="android.app.shortcuts"
                android:resource="@xml/shortcuts"/>

            <!--
                gitgud://pair?base=<server>&token=<api-token> — scanned from
                Settings → API tokens after minting a token with the "Mobile
                app" scope bundle, or tapped from a note. Resolves to
                PairScreen via the runtime intent dispatch in MainActivity.
            -->
            <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="gitgud" android:host="pair"/>
            </intent-filter>

            <!-- Where a "run finished" notification lands: straight at
                 the run it is about. -->
            <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="gitgud" android:host="run"/>
            </intent-filter>

            <!-- A circle on the CI widget: the repository it stands for. -->
            <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="gitgud" android:host="repo"/>
            </intent-filter>
        </activity>

        <!-- The home-screen CI widget, after the Plasma one. -->
        <receiver
            android:name=".widget.CiWidgetProvider"
            android:label="@string/widget_ci_name"
            android:exported="false">
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
            </intent-filter>
            <meta-data
                android:name="android.appwidget.provider"
                android:resource="@xml/ci_widget_info"/>
        </receiver>

        <!-- Its own task, so choosing what a widget watches doesn't drag
             the app's back stack along with it. -->
        <activity
            android:name=".widget.CiWidgetConfigActivity"
            android:exported="true"
            android:excludeFromRecents="true"
            android:taskAffinity=""
            android:theme="@style/Theme.GitGud">
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE"/>
            </intent-filter>
        </activity>
    </application>
</manifest>