<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:ignore="GoogleAppIndexingWarning">

    <!-- If a device is missing a GPS - we will still be able to work though , must be before uses-permission-->
    <uses-feature
        android:name="android.hardware.location"
        android:required="false" />
    <uses-feature
        android:name="android.hardware.location.gps"
        android:required="false" />

    <!-- Request legacy Bluetooth permissions on older devices -->
    <uses-permission android:name="android.permission.BLUETOOTH"
        android:maxSdkVersion="30" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"
        android:maxSdkVersion="30" />

    <!-- API 31+ Bluetooth permissions -->
    <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
    <uses-permission android:name="android.permission.BLUETOOTH_SCAN"
        android:usesPermissionFlags="neverForLocation"
        tools:targetApi="s" />

    <!-- API 33+ Notification runtime permissions -->
    <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />

    <!-- Permissions required for providing location (from phone GPS) to mesh -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

    <!-- This permission is required for analytics - and soon the MQTT gateway -->
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />

    <!--
      This permission is optional but recommended so we can be smart
      about when to send data.
     -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

    <!-- Only for debug log writing, disable for production
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    -->

    <!-- We run our mesh code as a foreground service - FIXME, find a way to stop doing this -->
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE_CONNECTED_DEVICE" />
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE_LOCATION" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />

    <!-- Needed to open our bluetooth connection to our paired device (after reboot) -->
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

    <!-- zxing library for QR Code scanning using camera -->
    <uses-permission android:name="android.permission.CAMERA" />

    <uses-feature
        android:name="android.hardware.camera"
        android:required="false" />

    <uses-feature
        android:name="android.hardware.bluetooth_le"
        android:required="false" />

    <!-- for USB serial access -->
    <uses-feature
        android:name="android.hardware.usb.host"
        android:required="false" />

    <!-- hardware acceleration is required for zxing barcode lib -->
    <application
        android:name="com.geeksville.mesh.MeshUtilApplication"
        android:allowBackup="false"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="false"
        android:icon="@mipmap/ic_launcher2"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher2_round"
        android:supportsRtl="true"
        android:hardwareAccelerated="true"
        android:theme="@style/AppTheme"
        android:localeConfig="@xml/locales_config">

        <!-- Default crash collection and analytics off until we (possibly) turn it on in application.onCreate -->
        <meta-data
            android:name="firebase_crashlytics_collection_enabled"
            android:value="false" />
        <meta-data
            android:name="firebase_analytics_collection_enabled"
            android:value="false" />

        <!-- we need bind job service for oreo -->
<!--
        <service
            android:name="com.geeksville.mesh.service.SoftwareUpdateService"
            android:enabled="true"
            android:exported="false"
            android:permission="android.permission.BIND_JOB_SERVICE" />
-->

        <!-- This is the public API for doing mesh radio operations from android apps -->
        <service
            android:name="com.geeksville.mesh.service.MeshService"
            android:enabled="true"
            android:foregroundServiceType="connectedDevice|location"
            android:exported="true" tools:ignore="ExportedActivity">
            <intent-filter>
                <action android:name="com.geeksville.mesh.Service" />
            </intent-filter>
        </service>

        <service
            android:name="androidx.appcompat.app.AppLocalesMetadataHolderService"
            android:enabled="false"
            android:exported="false">
            <meta-data
                android:name="autoStoreLocales"
                android:value="true" />
        </service>

        <activity
            android:name="com.journeyapps.barcodescanner.CaptureActivity"
            android:screenOrientation="unspecified"
            tools:replace="screenOrientation" />

        <activity
            android:name="com.geeksville.mesh.MainActivity"
            android:launchMode="singleInstance"
            android:screenOrientation="unspecified"
            android:windowSoftInputMode="stateAlwaysHidden"
            android:theme="@style/Theme.App.Starting"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

            <intent-filter android:autoVerify="true">
                <!-- The QR codes to share channel settings are shared as meshtastic URLS

                an approximate example:
                http://meshtastic.org/e/YXNkZnF3ZXJhc2RmcXdlcmFzZGZxd2Vy
                -->
                <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="meshtastic.org"
                    android:pathPrefix="/e/" />
                <data
                    android:scheme="https"
                    android:host="meshtastic.org"
                    android:pathPrefix="/E/" />
            </intent-filter>

            <intent-filter>
                <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
            </intent-filter>

            <!-- The USB devices we want to be informed about -->
            <meta-data
                android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
                android:resource="@xml/device_filter" />
        </activity>

        <receiver android:name="com.geeksville.mesh.service.BootCompleteReceiver"
            android:exported="false">
            <!-- handle boot events -->
            <intent-filter>
                <category android:name="android.intent.category.DEFAULT" />

                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <action android:name="android.intent.action.QUICKBOOT_POWERON" />
                <!--For HTC devices per https://stackoverflow.com/questions/20441308/boot-completed-not-working-android/46294732#46294732 -->
                <action android:name="com.htc.intent.action.QUICKBOOT_POWERON" />

                <!-- for testing -->
                <action android:name="com.geeksville.mesh.SIM_BOOT" />
            </intent-filter>

            <!-- Also restart our service if the app gets upgraded -->
            <intent-filter>
                <action android:name="android.intent.action.MY_PACKAGE_REPLACED" />
                <!-- I was using PACKAGE_REPLACED, but MY_PACKAGE_REPLACED is newer and seems cleaner
                <data
                    android:scheme="package"
                    android:path="com.geeksville.mesh" /> -->
            </intent-filter>
        </receiver>

        <activity
            android:name=".AppIntroduction"/>

        <!-- allow for plugin discovery -->
        <activity
            android:name="com.atakmap.app.component"
            android:exported="true"
            tools:ignore="MissingClass">
            <intent-filter android:label="@string/app_name">
                <action android:name="com.atakmap.app.component" />
            </intent-filter>
        </activity>
    </application>

</manifest>
