You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
FairEmail/app/src/play/AndroidManifest.xml

786 lines
31 KiB

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:installLocation="internalOnly">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.USE_BIOMETRIC" />
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" />
<uses-permission android:name="com.android.vending.BILLING" />
<!-- OAuth -->
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission
android:name="android.permission.USE_CREDENTIALS"
android:maxSdkVersion="22" />
<!-- https://github.com/leolin310148/ShortcutBadger/pull/368 -->
<uses-permission android:name="com.vivo.notification.permission.BADGE_ICON" />
<!-- https://developer.android.com/guide/topics/manifest/uses-feature-element#features-reference -->
<uses-feature
android:name="android.software.app_widgets"
android:required="false" />
<!--uses-feature
android:name="android.software.webview"
android:required="false" /-->
<uses-feature
android:name="android.hardware.camera"
android:required="false" />
<uses-feature
android:name="android.hardware.fingerprint"
android:required="false" />
<uses-feature
android:name="android.hardware.touchscreen"
android:required="false" />
<!-- https://developer.android.com/topic/arc -->
<!-- Android 11: https://developer.android.com/preview/privacy/package-visibility -->
<!-- https://developer.android.com/training/package-visibility/use-cases -->
<queries>
<!-- Customtabs -->
<!-- https://developers.google.com/web/updates/2020/07/custom-tabs-android-11#detecting_browsers_that_support_custom_tabs -->
<intent>
<action android:name="android.support.customtabs.action.CustomTabsService" />
</intent>
<intent>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="https" />
</intent>
<intent>
<action android:name="android.intent.action.INSERT" />
</intent>
<intent>
<action android:name="android.intent.action.GET_CONTENT" />
<category android:name="android.intent.category.OPENABLE" />
<data android:mimeType="*/*" />
</intent>
<intent>
<action android:name="android.media.action.IMAGE_CAPTURE" />
</intent>
<intent>
<action android:name="android.provider.MediaStore.RECORD_SOUND" />
</intent>
<package android:name="com.android.vending" />
<package android:name="org.sufficientlysecure.keychain" />
<package android:name="org.sufficientlysecure.keychain.debug" />
<package android:name="eu.faircode.netguard" />
<package android:name="com.google.android.gm" />
<intent>
<action android:name="org.openintents.openpgp.IOpenPgpService2" />
</intent>
<!-- https://android-developers.googleblog.com/2015/10/in-app-translations-in-android.html -->
<intent>
<action android:name="android.intent.action.PROCESS_TEXT" />
<data android:mimeType="text/plain" />
</intent>
<intent>
<action android:name="android.intent.action.TTS_SERVICE" />
</intent>
<intent>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.HOME" />
</intent>
</queries>
<application
android:name=".ApplicationSecure"
android:allowBackup="true"
android:appCategory="productivity"
android:backupAgent=".FairEmailBackupAgent"
android:dataExtractionRules="@xml/data_extraction_rules"
android:description="@string/app_name"
android:enableOnBackInvokedCallback="true"
android:extractNativeLibs="true"
android:forceDarkAllowed="false"
android:fullBackupContent="false"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:largeHeap="${largeHeap}"
android:networkSecurityConfig="@xml/network_security_config"
android:requestLegacyExternalStorage="true"
android:resizeableActivity="true"
android:restoreAnyVersion="true"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.AppCompat.TranslucentSplash">
<!-- https://developer.samsung.com/samsung-dex/modify-optimizing.html -->
<!-- https://firebase.google.com/docs/analytics/configure-data-collection?platform=android -->
<meta-data
android:name="firebase_analytics_collection_deactivated"
android:value="true" />
<!-- https://firebase.google.com/docs/perf-mon/disable-sdk?platform=android -->
<meta-data
android:name="firebase_performance_collection_deactivated"
android:value="true" />
<!-- https://developer.android.com/guide/webapps/managing-webview#metrics -->
<meta-data
android:name="android.webkit.WebView.MetricsOptOut"
android:value="true" />
<meta-data
android:name="android.webkit.WebView.EnableSafeBrowsing"
android:value="false" />
<meta-data
android:name="android.allow_multiple_resumed_activities"
android:value="true" />
<meta-data
android:name="com.google.android.gms.car.application"
android:resource="@xml/car"
tools:node="remove" />
<!-- https://play.google.com/about/auto/developer-distribution-agreement-addendum/ -->
<meta-data
android:name="com.bugsnag.android.API_KEY"
android:value="9d2d57476a0614974449a3ec33f2604a" />
<meta-data
android:name="com.google.android.backup.api_key"
android:value="unused" />
<activity
android:name=".ActivityMain"
android:description="@string/app_name"
android:excludeFromRecents="true"
android:exported="true"
android:label="@string/app_name"
android:launchMode="singleInstance"
android:resizeableActivity="true"
android:theme="@style/Theme.AppCompat.Translucent">
<meta-data
android:name="android.app.shortcuts"
android:resource="@xml/shortcuts" />
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
<category android:name="android.intent.category.APP_EMAIL" />
</intent-filter>
<intent-filter>
<action android:name="${applicationId}.REFRESH" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<intent-filter>
<!-- legacy -->
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="message" />
<data android:host="${applicationId}" />
</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="message" />
<data android:host="email.faircode.eu" />
</intent-filter>
<intent-filter android:autoVerify="true">
<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" />
<data android:host="link.fairemail.net" />
</intent-filter>
</activity>
<activity
android:name=".ActivitySetup"
android:exported="false"
android:launchMode="singleTask"
android:parentActivityName=".ActivityMain"
android:resizeableActivity="true"
android:taskAffinity="${applicationId}.SETUP">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.NOTIFICATION_PREFERENCES" />
</intent-filter>
</activity>
<activity
android:name=".ActivitySignature"
android:exported="false"
android:launchMode="singleTask"
android:parentActivityName=".ActivitySetup"
android:resizeableActivity="true"
android:taskAffinity="${applicationId}.SETUP" />
<activity
android:name=".ActivityWidget"
android:exported="true"
android:resizeableActivity="true">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" />
</intent-filter>
</activity>
<activity
android:name=".ActivityWidgetSync"
android:exported="true"
android:resizeableActivity="true">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" />
</intent-filter>
</activity>
<activity
android:name=".ActivityWidgetUnified"
android:exported="true"
android:resizeableActivity="true">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" />
</intent-filter>
</activity>
<activity
android:name=".ActivityView"
android:exported="false"
android:launchMode="singleTask"
android:parentActivityName=".ActivityMain"
android:resizeableActivity="true" />
<activity
android:name=".ActivitySearch"
android:enabled="false"
android:excludeFromRecents="true"
android:exported="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_search"
android:launchMode="singleTask"
android:resizeableActivity="true"
android:theme="@style/Theme.AppCompat.Translucent">
<intent-filter>
<action android:name="android.intent.action.PROCESS_TEXT" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="${namespace}.search" />
</intent-filter>
</activity>
<activity
android:name=".ActivityAnswer"
android:enabled="false"
android:excludeFromRecents="true"
android:exported="true"
android:icon="@drawable/twotone_reply_24"
android:label="@string/app_answer"
android:launchMode="singleTask"
android:resizeableActivity="true">
<intent-filter>
<action android:name="android.intent.action.PROCESS_TEXT" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
</activity>
<activity
android:name=".ActivityCompose"
android:description="@string/app_name"
android:exported="true"
android:label="@string/app_name"
android:launchMode="singleTask"
android:parentActivityName=".ActivityView"
android:resizeableActivity="true"
android:taskAffinity="${applicationId}.COMPOSE">
<meta-data
android:name="android.service.chooser.chooser_target_service"
android:value="androidx.sharetarget.ChooserTargetServiceCompat" />
<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="mailto" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.SENDTO" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="mailto" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.SEND" />
<action android:name="android.intent.action.SEND_MULTIPLE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="*/*" />
</intent-filter>
</activity>
<activity
android:name=".ActivitySendSelf"
android:enabled="false"
android:excludeFromRecents="true"
android:exported="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_send_self"
android:launchMode="singleTask"
android:resizeableActivity="true"
android:theme="@style/Theme.AppCompat.Translucent">
<meta-data
android:name="android.service.chooser.chooser_target_service"
android:value="androidx.sharetarget.ChooserTargetServiceCompat" />
<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="mailto" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.SENDTO" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="mailto" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.SEND" />
<action android:name="android.intent.action.SEND_MULTIPLE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="*/*" />
</intent-filter>
</activity>
<activity
android:name=".ActivityClear"
android:excludeFromRecents="true"
android:exported="false"
android:launchMode="singleInstance"
android:resizeableActivity="true" />
<activity
android:name=".ActivityError"
android:exported="false"
android:launchMode="singleTask"
android:resizeableActivity="true" />
<activity
android:name=".ActivityEML"
android:description="@string/app_name"
android:exported="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:launchMode="singleInstance"
android:resizeableActivity="true">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="content" />
<data android:mimeType="message/rfc822" />
<data android:host="*" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="content" />
<data android:mimeType="*/*" />
<data android:host="*" />
<data android:pathPattern="/.*\\.eml" />
<data android:pathPattern="/.*\\..*\\.eml" />
<data android:pathPattern="/.*\\..*\\..*\\.eml" />
<data android:pathPattern="/.*\\..*\\..*\\..*\\.eml" />
<data android:pathPattern="/.*\\..*\\..*\\..*\\..*\\.eml" />
</intent-filter>
</activity>
<activity
android:name=".ActivityDSN"
android:description="@string/app_name"
android:exported="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:launchMode="singleInstance"
android:resizeableActivity="true">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="content" />
<data android:mimeType="message/delivery-status" />
<data android:mimeType="message/disposition-notification" />
<data android:mimeType="text/rfc822-headers" />
<data android:host="*" />
</intent-filter>
</activity>
<activity
android:name=".ActivityAMP"
android:description="@string/app_name"
android:exported="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:launchMode="singleInstance"
android:resizeableActivity="true">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="content" />
<data android:mimeType="text/x-amp-html" />
<data android:host="*" />
</intent-filter>
</activity>
<activity
android:name=".ActivityCode"
android:description="@string/app_name"
android:exported="false"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:launchMode="singleInstance"
android:resizeableActivity="true" />
<activity
android:name=".ActivityDMARC"
android:enabled="false"
android:description="@string/title_advanced_dmarc_viewer"
android:exported="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_dmarc"
android:launchMode="singleInstance"
android:resizeableActivity="true">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="content" />
<data android:mimeType="text/xml" />
<data android:mimeType="application/xml" />
<data android:host="*" />
</intent-filter>
</activity>
<activity
android:name=".ActivityBilling"
android:exported="false"
android:icon="@mipmap/ic_launcher"
android:launchMode="singleTask"
android:resizeableActivity="true"
android:taskAffinity="${applicationId}.BILLING" />
<!-- https://developer.android.com/training/permissions/explaining-access -->
<activity
android:name=".ActivityRationale"
android:description="@string/app_name"
android:excludeFromRecents="true"
android:exported="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:launchMode="singleTask"
android:permission="android.permission.START_VIEW_PERMISSION_USAGE"
android:resizeableActivity="true"
android:theme="@style/Theme.AppCompat.Translucent">
<intent-filter>
<action android:name="android.intent.action.VIEW_PERMISSION_USAGE" />
<action android:name="android.intent.action.VIEW_PERMISSION_USAGE_FOR_PERIOD" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity
android:name="net.openid.appauth.RedirectUriReceiverActivity"
android:exported="true"
android:resizeableActivity="true"
android:taskAffinity="${applicationId}.SETUP"
tools:node="replace">
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="oauth.faircode.eu"
android:scheme="https" />
</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="${namespace}" />
</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:host="auth"
android:scheme="msauth.${namespace}" />
</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:host="${namespace}"
android:path="/xSLzBBuLJunOQPB89rtzM54FXx4="
android:scheme="msauth" />
</intent-filter>
</activity>
<activity
android:name="net.openid.appauth.AuthorizationManagementActivity"
android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation|keyboard|keyboardHidden"
android:exported="false"
android:launchMode="singleTask"
android:resizeableActivity="true"
android:taskAffinity="${applicationId}.SETUP"
android:theme="@style/Theme.AppCompat.Translucent.NoTitleBar"
tools:node="replace" />
<service
android:name=".ServiceSynchronize"
android:exported="false"
android:foregroundServiceType="specialUse">
<property
android:name="android.app.PROPERTY_SPECIAL_USE_FGS_SUBTYPE"
android:value="FairEmail is an email app. Users expect to receive instant new email notifications, and the app to be auto-started. A foreground service is required to keep a continuous connection to email servers to listen for push messages via IMAP IDLE, for which there is no Firebase Cloud Messaging integration. Other foreground service types do not fit this use case, or can't be used on Android 15 because there are time limits or auto-starting on boot is not allowed. Using the Android work manager isn't an option either." />
</service>
<service
android:name=".ServiceSend"
android:exported="false"
android:foregroundServiceType="dataSync" />
<service
android:name=".ServiceUI"
android:exported="false" />
<service
android:name=".ServiceExternal"
android:exported="true"
android:foregroundServiceType="dataSync">
<intent-filter>
<action android:name="${applicationId}.POLL" />
<action android:name="${applicationId}.ENABLE" />
<action android:name="${applicationId}.DISABLE" />
<action android:name="${applicationId}.INTERVAL" />
<action android:name="${applicationId}.RULE" />
<action android:name="${applicationId}.TEMPLATE" />
<action android:name="${applicationId}.DISCONNECT.ME" />
<action android:name="${applicationId}.ADGUARD" />
</intent-filter>
</service>
<service
android:name=".ServiceTileClear"
android:exported="true"
android:icon="@drawable/twotone_warning_24"
android:label="@string/app_name"
android:permission="android.permission.BIND_QUICK_SETTINGS_TILE">
<intent-filter>
<action android:name="android.service.quicksettings.action.QS_TILE" />
</intent-filter>
</service>
<service
android:name=".ServiceTileSynchronize"
android:exported="true"
android:icon="@drawable/twotone_sync_disabled_24"
android:label="@string/app_name"
android:permission="android.permission.BIND_QUICK_SETTINGS_TILE">
<intent-filter>
<action android:name="android.service.quicksettings.action.QS_TILE" />
</intent-filter>
</service>
<service
android:name=".ServiceTileUnseen"
android:exported="true"
android:icon="@drawable/twotone_mail_outline_24"
android:label="@string/tile_unseen"
android:permission="android.permission.BIND_QUICK_SETTINGS_TILE">
<intent-filter>
<action android:name="android.service.quicksettings.action.QS_TILE" />
</intent-filter>
</service>
<service
android:name=".ServicePowerControl"
android:enabled="false"
android:exported="true"
android:label="@string/app_name"
android:permission="android.permission.BIND_CONTROLS">
<intent-filter>
<action android:name="android.service.controls.ControlsProviderService" />
</intent-filter>
</service>
<service
android:name="WidgetUnifiedService"
android:exported="true"
android:permission="android.permission.BIND_REMOTEVIEWS" />
<provider
android:name=".FileProviderEx"
android:authorities="${applicationId}"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/fileprovider_paths" />
</provider>
<!-- https://developer.android.com/topic/libraries/architecture/workmanager/advanced/custom-configuration -->
<!-- https://issuetracker.google.com/issues/138465476 -->
<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>
<receiver
android:name=".Widget"
android:exported="true"
android:label="@string/title_widget_title_count">
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/widget" />
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
</receiver>
<receiver
android:name=".WidgetUnified"
android:exported="true"
android:label="@string/title_widget_title_list">
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/widget_unified" />
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
</receiver>
<receiver
android:name=".WidgetSync"
android:exported="true"
android:label="@string/title_widget_title_sync">
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/widget_sync" />
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
</receiver>
<receiver
android:name=".ReceiverAutoStart"
android:exported="true">
<!-- https://developer.android.com/guide/topics/manifest/intent-filter-element.html#priority -->
<intent-filter android:priority="1000">
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.MY_PACKAGE_REPLACED" />
</intent-filter>
<intent-filter>
<action android:name="android.app.action.SCHEDULE_EXACT_ALARM_PERMISSION_STATE_CHANGED" />
</intent-filter>
</receiver>
</application>
</manifest>