<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="org.sufficientlysecure.keychain"
    android:installLocation="auto"
    android:versionCode="27000"
    android:versionName="2.7">

    <!--
        General remarks
        ===============
        - Last APG 1 version was 10900 (1.0.9 beta 00)
        - Keychain starting with versionCode 20000!
        
        Association of file types to Keychain
        =====================================
        General remarks about file ending conventions:
        - *.gpg for binary files 
        - *.asc for ascii armored files The actual content can be anything.
        
        The file ending only shows if it is binary or ascii encoded.
        
        Remarks about the ugly android:pathPattern:
        - We are matching all files with a specific file ending.
        This is done in an ugly way because of Android limitations.
        Read http://stackoverflow.com/questions/1733195/android-intent-filter-for-a-particular-file-extension
        and http://stackoverflow.com/questions/3400072/pathpattern-to-match-file-extension-does-not-work-if-a-period-exists-elsewhere-i/8599921
        for more information.
        - Do _not_ set mimeType for gpg!
        Cyanogenmod's file manager will only show Keychain for gpg files if no mimeType is set!
        For OI Filemanager it makes no difference, gpg files can't be associated
    -->

    <!-- Specified in buid.gradle -->
    <!--<uses-sdk-->
    <!--android:minSdkVersion="9"-->
    <!--android:targetSdkVersion="19" />-->

    <uses-feature
        android:name="android.hardware.wifi"
        android:required="false" />
    <uses-feature
        android:name="android.hardware.telephony"
        android:required="false" />
    <uses-feature
        android:name="android.hardware.microphone"
        android:required="false" />
    <uses-feature
        android:name="android.hardware.touchscreen"
        android:required="false" />

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.NFC" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS"/>
    <uses-permission android:name="android.permission.MANAGE_ACCOUNTS"/>
    <uses-permission android:name="android.permission.READ_SYNC_SETTINGS"/>
    <uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS"/>
    <uses-permission android:name="android.permission.READ_CONTACTS" />
    <uses-permission android:name="android.permission.WRITE_CONTACTS" />

    <!-- android:allowBackup="false": Don't allow backup over adb backup or other apps! -->
    <application
        android:name=".KeychainApplication"
        android:allowBackup="false"
        android:hardwareAccelerated="true"
        android:icon="@drawable/icon"
        android:theme="@style/KeychainTheme"
        android:label="@string/app_name">
        <activity
            android:name=".ui.KeyListActivity"
            android:configChanges="orientation|screenSize|keyboardHidden|keyboard"
            android:label="@string/app_name"
            android:launchMode="singleTop">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".ui.EditKeyActivity"
            android:configChanges="orientation|screenSize|keyboardHidden|keyboard"
            android:label="@string/title_edit_key"
            android:windowSoftInputMode="stateHidden" />
        <activity
            android:name=".ui.ViewKeyActivity"
            android:configChanges="orientation|screenSize|keyboardHidden|keyboard"
            android:label="@string/title_key_details"
            android:parentActivityName=".ui.KeyListActivity">
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value=".ui.KeyListActivity" />
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="vnd.android.cursor.item/vnd.org.sufficientlysecure.keychain.key" />
            </intent-filter>
        </activity>
        <activity
            android:name=".ui.ViewCertActivity"
            android:configChanges="orientation|screenSize|keyboardHidden|keyboard"
            android:label="@string/title_view_cert"
            android:parentActivityName=".ui.ViewKeyActivity">
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value=".ui.ViewKeyActivity" />
        </activity>
        <activity
            android:name=".ui.SelectPublicKeyActivity"
            android:configChanges="orientation|screenSize|keyboardHidden|keyboard"
            android:label="@string/title_select_recipients"
            android:launchMode="singleTop" />
        <activity
            android:name=".ui.SelectSecretKeyActivity"
            android:configChanges="orientation|screenSize|keyboardHidden|keyboard"
            android:label="@string/title_select_secret_key"
            android:launchMode="singleTop" />
        <activity
            android:name=".ui.EncryptActivity"
            android:configChanges="orientation|screenSize|keyboardHidden|keyboard"
            android:label="@string/title_encrypt"
            android:windowSoftInputMode="stateHidden">

            <!-- Keychain's own Actions -->
            <!-- ENCRYPT with text as extra -->
            <intent-filter>
                <action android:name="org.sufficientlysecure.keychain.action.ENCRYPT" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
            <!-- ENCRYPT with data Uri -->
            <intent-filter>
                <action android:name="org.sufficientlysecure.keychain.action.ENCRYPT" />

                <category android:name="android.intent.category.DEFAULT" />
                <!-- TODO: accept other schemes! -->
                <data android:scheme="file" />
            </intent-filter>
            <!-- Android's Send Action -->
            <intent-filter android:label="@string/intent_send_encrypt">
                <action android:name="android.intent.action.SEND" />

                <category android:name="android.intent.category.DEFAULT" />

                <data android:mimeType="*/*" />
            </intent-filter>
        </activity>
        <activity
            android:name=".ui.DecryptActivity"
            android:configChanges="orientation|screenSize|keyboardHidden|keyboard"
            android:label="@string/title_decrypt"
            android:windowSoftInputMode="stateHidden">

            <!--&lt;!&ndash; VIEW with mimeType: TODO (from email app)  &ndash;&gt;-->
            <!--<intent-filter android:label="@string/intent_import_key">-->
            <!--<action android:name="android.intent.action.VIEW" />-->

            <!--<category android:name="android.intent.category.BROWSABLE" />-->
            <!--<category android:name="android.intent.category.DEFAULT" />-->

            <!--&lt;!&ndash; mime type as defined in http://tools.ietf.org/html/rfc3156 &ndash;&gt;-->
            <!--<data android:mimeType="application/pgp-signature" />-->
            <!--</intent-filter>-->
            <!--&lt;!&ndash; VIEW with mimeType: TODO (from email app)  &ndash;&gt;-->
            <!--<intent-filter android:label="@string/intent_import_key">-->
            <!--<action android:name="android.intent.action.VIEW" />-->

            <!--<category android:name="android.intent.category.BROWSABLE" />-->
            <!--<category android:name="android.intent.category.DEFAULT" />-->

            <!--&lt;!&ndash; mime type as defined in http://tools.ietf.org/html/rfc3156 &ndash;&gt;-->
            <!--<data android:mimeType="application/pgp-encrypted" />-->
            <!--</intent-filter>-->
            <!-- Keychain's own Actions -->
            <!-- DECRYPT with text as extra -->
            <intent-filter>
                <action android:name="org.sufficientlysecure.keychain.action.DECRYPT" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
            <!-- DECRYPT with data Uri -->
            <intent-filter>
                <action android:name="org.sufficientlysecure.keychain.action.DECRYPT" />

                <category android:name="android.intent.category.DEFAULT" />
                <!-- TODO: accept other schemes! -->
                <data android:scheme="file" />
            </intent-filter>
            <!-- Android's Send Action -->
            <intent-filter android:label="@string/intent_send_decrypt">
                <action android:name="android.intent.action.SEND" />

                <category android:name="android.intent.category.DEFAULT" />

                <data android:mimeType="*/*" />
            </intent-filter>
            <!-- Linking "Decrypt" to file types -->
            <intent-filter android:label="@string/intent_decrypt_file">
                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />

                <data android:host="*" />
                <data android:scheme="file" />
                <data android:scheme="content" />
                <!-- Workaround to match files in pathes with dots in them, like /cdcard/my.folder/test.gpg -->
                <data android:pathPattern=".*\\.gpg" />
                <data android:pathPattern=".*\\..*\\.gpg" />
                <data android:pathPattern=".*\\..*\\..*\\.gpg" />
                <data android:pathPattern=".*\\..*\\..*\\..*\\.gpg" />
                <data android:pathPattern=".*\\..*\\..*\\..*\\..*\\.gpg" />
                <data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\.gpg" />
                <data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\..*\\.gpg" />
                <data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\.gpg" />
                <data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\.gpg" />
                <data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\.gpg" />
            </intent-filter>
            <intent-filter android:label="@string/intent_decrypt_file">
                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />

                <data android:host="*" />
                <data android:scheme="file" />
                <data android:scheme="content" />
                <data android:mimeType="*/*" />
                <data android:pathPattern=".*\\.asc" />
                <data android:pathPattern=".*\\..*\\.asc" />
                <data android:pathPattern=".*\\..*\\..*\\.asc" />
                <data android:pathPattern=".*\\..*\\..*\\..*\\.asc" />
                <data android:pathPattern=".*\\..*\\..*\\..*\\..*\\.asc" />
                <data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\.asc" />
                <data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\..*\\.asc" />
                <data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\.asc" />
                <data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\.asc" />
                <data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\.asc" />
            </intent-filter>
        </activity>
        <activity
            android:name=".ui.UploadKeyActivity"
            android:configChanges="orientation|screenSize|keyboardHidden|keyboard"
            android:label="@string/title_send_key"
            android:parentActivityName=".ui.ViewKeyActivity">
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value=".ui.ViewKeyActivity" />
        </activity>
        <activity
            android:name=".ui.PreferencesActivity"
            android:configChanges="orientation|screenSize|keyboardHidden|keyboard"
            android:label="@string/title_preferences">
            <intent-filter>
                <action android:name="org.sufficientlysecure.keychain.ui.PREFS_GEN" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
            <intent-filter>
                <action android:name="org.sufficientlysecure.keychain.ui.PREFS_ADV" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
        <activity
            android:name=".ui.PreferencesKeyServerActivity"
            android:configChanges="orientation|screenSize|keyboardHidden|keyboard"
            android:label="@string/title_key_server_preference"
            android:windowSoftInputMode="stateHidden" />
        <activity
            android:name=".ui.CertifyKeyActivity"
            android:configChanges="orientation|screenSize|keyboardHidden|keyboard"
            android:label="@string/title_certify_key"
            android:parentActivityName=".ui.ViewKeyActivity">
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value=".ui.ViewKeyActivity" />
        </activity>
        <activity
            android:name=".ui.ImportKeysActivity"
            android:configChanges="orientation|screenSize|keyboardHidden|keyboard"
            android:label="@string/title_import_keys"
            android:launchMode="singleTop"
            android:windowSoftInputMode="stateHidden">

            <!-- VIEW with fingerprint scheme:
                      Handle URIs with fingerprints when scanning directly from Barcode Scanner -->
            <intent-filter android:label="@string/intent_import_key">
                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.BROWSABLE" />
                <category android:name="android.intent.category.DEFAULT" />

                <!-- Android's scheme matcher is case-sensitive, so include most likely variations -->
                <data android:scheme="openpgp4fpr" />
                <data android:scheme="OPENPGP4FPR" />
                <data android:scheme="OpenPGP4FPR" />
                <data android:scheme="OpenPGP4Fpr" />
                <data android:scheme="OpenPGP4fpr" />
            </intent-filter>
            <!-- VIEW with mimeType: Allows to import keys (attached to emails) from email apps  -->
            <intent-filter android:label="@string/intent_import_key">
                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.BROWSABLE" />
                <category android:name="android.intent.category.DEFAULT" />

                <!-- mime type as defined in http://tools.ietf.org/html/rfc3156 -->
                <data android:mimeType="application/pgp-keys" />
            </intent-filter>
            <!-- NFC: Handle NFC tags detected from outside our application -->
            <intent-filter>
                <action android:name="android.nfc.action.NDEF_DISCOVERED" />

                <category android:name="android.intent.category.DEFAULT" />
                <!-- mime type as defined in http://tools.ietf.org/html/rfc3156 -->
                <data android:mimeType="application/pgp-keys" />
            </intent-filter>
            <!-- VIEW with file endings: *.gpg (e.g. to import from OI File Manager) -->
            <intent-filter android:label="@string/intent_import_key">
                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />

                <data android:host="*" />
                <data android:scheme="file" />
                <data android:scheme="content" />
                <data android:pathPattern=".*\\.gpg" />
                <data android:pathPattern=".*\\..*\\.gpg" />
                <data android:pathPattern=".*\\..*\\..*\\.gpg" />
                <data android:pathPattern=".*\\..*\\..*\\..*\\.gpg" />
                <data android:pathPattern=".*\\..*\\..*\\..*\\..*\\.gpg" />
                <data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\.gpg" />
                <data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\..*\\.gpg" />
                <data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\.gpg" />
                <data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\.gpg" />
                <data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\.gpg" />
            </intent-filter>
            <!-- VIEW with file endings: *.asc -->
            <intent-filter android:label="@string/intent_import_key">
                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />

                <data android:host="*" />
                <data android:scheme="file" />
                <data android:scheme="content" />
                <data android:mimeType="*/*" />
                <data android:pathPattern=".*\\.asc" />
                <data android:pathPattern=".*\\..*\\.asc" />
                <data android:pathPattern=".*\\..*\\..*\\.asc" />
                <data android:pathPattern=".*\\..*\\..*\\..*\\.asc" />
                <data android:pathPattern=".*\\..*\\..*\\..*\\..*\\.asc" />
                <data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\.asc" />
                <data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\..*\\.asc" />
                <data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\.asc" />
                <data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\.asc" />
                <data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\..*\\.asc" />
            </intent-filter>
            <!-- Keychain's own Actions -->
            <!-- IMPORT_KEY with files TODO: does this work? -->
            <intent-filter android:label="@string/intent_import_key">
                <action android:name="org.sufficientlysecure.keychain.action.IMPORT_KEY" />

                <category android:name="android.intent.category.DEFAULT" />

                <data android:mimeType="*/*" />
            </intent-filter>
            <!-- IMPORT_KEY with mimeType 'application/pgp-keys' -->
            <intent-filter>
                <action android:name="org.sufficientlysecure.keychain.action.IMPORT_KEY" />

                <category android:name="android.intent.category.DEFAULT" />
                <!-- mime type as defined in http://tools.ietf.org/html/rfc3156, section 7 -->
                <data android:mimeType="application/pgp-keys" />
            </intent-filter>
            <!-- IMPORT_KEY without mimeType to allow import with extras Bundle -->
            <intent-filter android:label="@string/intent_import_key">
                <action android:name="org.sufficientlysecure.keychain.action.IMPORT_KEY" />
                <action android:name="org.sufficientlysecure.keychain.action.IMPORT_KEY_FROM_QR_CODE" />
                <action android:name="org.sufficientlysecure.keychain.action.IMPORT_KEY_FROM_KEYSERVER" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value=".ui.KeyListActivity" />
        </activity>
        <activity
            android:name=".ui.HelpActivity"
            android:label="@string/title_help" />

        <!-- Internal services/content providers (not exported) -->
        <service
            android:name=".service.PassphraseCacheService"
            android:exported="false"
            android:process=":passphrase_cache" />
        <service
            android:name=".service.KeychainIntentService"
            android:exported="false" />

        <provider
            android:name=".provider.KeychainProvider"
            android:authorities="org.sufficientlysecure.keychain.provider"
            android:exported="false" />

        <!-- Internal classes of the remote APIs (not exported) -->
        <activity
            android:name=".remote.ui.RemoteServiceActivity"
            android:exported="false"
            android:label="@string/app_name"
            android:launchMode="singleTop"
            android:process=":remote_api" />
        <activity
            android:name=".remote.ui.AppsListActivity"
            android:configChanges="orientation|screenSize|keyboardHidden|keyboard"
            android:exported="false"
            android:label="@string/title_api_registered_apps" />
        <activity
            android:name=".remote.ui.AppSettingsActivity"
            android:configChanges="orientation|screenSize|keyboardHidden|keyboard"
            android:exported="false">

            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value=".remote.ui.AppsListActivity" />
        </activity>
        <activity
            android:name=".remote.ui.AccountSettingsActivity"
            android:configChanges="orientation|screenSize|keyboardHidden|keyboard"
            android:exported="false" />

        <!-- OpenPGP Remote API, this service has explicitly no permission requirements
             because we are using our own package based allow/disallow system -->
        <service
            android:name=".remote.OpenPgpService"
            android:enabled="true"
            android:exported="true"
            android:process=":remote_api"
            tools:ignore="ExportedService">
            <intent-filter>
                <action android:name="org.openintents.openpgp.IOpenPgpService" />
            </intent-filter>
        </service>

        <service android:name=".service.DummyAccountService">
            <intent-filter>
                <action android:name="android.accounts.AccountAuthenticator"/>
            </intent-filter>
            <meta-data
                    android:name="android.accounts.AccountAuthenticator"
                    android:resource="@xml/account_desc"/>
        </service>

        <service android:name=".service.ContactSyncAdapterService">
            <intent-filter>
                <action android:name="android.content.SyncAdapter"/>
            </intent-filter>

            <meta-data
                    android:name="android.content.SyncAdapter"
                    android:resource="@xml/sync_adapter_desc"/>
            <meta-data
                    android:name="android.provider.CONTACTS_STRUCTURE"
                    android:resource="@xml/custom_pgp_contacts_structure"/>
        </service>

    </application>

</manifest>
