1<?xml version="1.0" encoding="utf-8"?>
  2<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3    xmlns:tools="http://schemas.android.com/tools">
  4
  5    <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
  6    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  7    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
  8    <uses-permission android:name="android.permission.INTERNET" />
  9    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
 10    <uses-permission android:name="android.permission.WAKE_LOCK" />
 11    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
 12    <uses-permission android:name="android.permission.VIBRATE" />
 13    <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
 14    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
 15    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
 16    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
 17    <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
 18
 19    <uses-feature
 20        android:name="android.hardware.location"
 21        android:required="false" />
 22    <uses-feature
 23        android:name="android.hardware.location.gps"
 24        android:required="false" />
 25    <uses-feature
 26        android:name="android.hardware.location.network"
 27        android:required="false" />
 28
 29    <uses-permission android:name="android.permission.CAMERA" />
 30    <uses-permission android:name="android.permission.RECORD_AUDIO" />
 31    <uses-permission android:name="android.permission.BLUETOOTH" />
 32    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
 33    <uses-permission android:name="android.permission.USE_FULL_SCREEN_INTENT" />
 34    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
 35    <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
 36
 37    <!--    New permissions required to run as foreground service on Android 14.
 38            SYSTEM_EXEMPTED is used when the app is on the doze allow list. This is normal
 39            and the expected default behaviour. The other two hijack RECORD_AUDIO and CAMERA if they
 40            happen to be granted. -->
 41    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
 42    <uses-permission android:name="android.permission.FOREGROUND_SERVICE_SYSTEM_EXEMPTED" />
 43    <uses-permission android:name="android.permission.FOREGROUND_SERVICE_SPECIAL_USE" />
 44    <uses-permission android:name="android.permission.FOREGROUND_SERVICE_CAMERA" />
 45    <uses-permission android:name="android.permission.FOREGROUND_SERVICE_MICROPHONE" />
 46
 47    <!-- this foreground service type permission is exclusively used for import and export backup -->
 48    <uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" />
 49
 50    <uses-permission android:name="android.permission.MANAGE_OWN_CALLS" />
 51
 52    <uses-feature
 53        android:name="android.hardware.camera"
 54        android:required="false" />
 55    <uses-feature
 56        android:name="android.hardware.camera.autofocus"
 57        android:required="false" />
 58
 59    <uses-feature
 60        android:name="android.hardware.microphone"
 61        android:required="false" />
 62
 63    <uses-sdk tools:overrideLibrary="androidx.heifwriter" />
 64
 65    <queries>
 66        <package android:name="org.sufficientlysecure.keychain" />
 67        <package android:name="org.torproject.android" />
 68
 69        <intent>
 70            <action android:name="eu.siacs.conversations.location.request" />
 71        </intent>
 72        <intent>
 73            <action android:name="eu.siacs.conversations.location.show" />
 74        </intent>
 75        <intent>
 76            <action android:name="android.intent.action.VIEW" />
 77        </intent>
 78        <intent>
 79            <action android:name="org.unifiedpush.android.connector.MESSAGE" />
 80        </intent>
 81    </queries>
 82
 83    <application
 84        android:name=".Conversations"
 85        android:allowBackup="true"
 86        android:appCategory="social"
 87        android:dataExtractionRules="@xml/data_extraction_rules"
 88        android:fullBackupContent="@xml/backup_content"
 89        android:hardwareAccelerated="true"
 90        android:icon="@mipmap/new_launcher"
 91        android:label="@string/app_name"
 92        android:largeHeap="true"
 93        android:localeConfig="@xml/locales_config"
 94        android:networkSecurityConfig="@xml/network_security_configuration"
 95        android:preserveLegacyExternalStorage="true"
 96        android:requestLegacyExternalStorage="true"
 97        android:theme="@style/Theme.Conversations3"
 98        tools:targetApi="tiramisu">
 99
100        <meta-data
101            android:name="com.google.android.gms.car.application"
102            android:resource="@xml/automotive_app_desc" />
103
104        <!-- The warning that systemExempted requires alarm permission is incorrect because doze white list is sufficient -->
105        <service
106            android:name=".services.XmppConnectionService"
107            android:exported="false"
108            android:foregroundServiceType="specialUse|systemExempted|microphone|camera"
109            tools:ignore="ForegroundServicePermission">
110            <property
111                android:name="android.app.PROPERTY_SPECIAL_USE_FGS_SUBTYPE"
112                android:value="xmpp-im" />
113        </service>
114
115        <service
116            android:name="androidx.work.impl.foreground.SystemForegroundService"
117            android:foregroundServiceType="dataSync"
118            tools:node="merge" />
119
120        <service
121            android:name=".services.CallIntegrationConnectionService"
122            android:exported="true"
123            android:permission="android.permission.BIND_TELECOM_CONNECTION_SERVICE">
124            <intent-filter>
125                <action android:name="android.telecom.ConnectionService" />
126            </intent-filter>
127        </service>
128
129        <receiver
130            android:name=".receiver.SystemEventReceiver"
131            android:exported="false">
132            <intent-filter>
133                <action android:name="android.intent.action.BOOT_COMPLETED" />
134                <action android:name="android.intent.action.MY_PACKAGE_REPLACED" />
135                <action
136                    android:name="android.net.conn.CONNECTIVITY_CHANGE"
137                    tools:ignore="BatteryLife" />
138                <action android:name="android.intent.action.ACTION_SHUTDOWN" />
139                <action android:name="android.media.RINGER_MODE_CHANGED" />
140            </intent-filter>
141        </receiver>
142
143        <receiver
144            android:name=".receiver.UnifiedPushDistributor"
145            android:enabled="false"
146            android:exported="true">
147            <intent-filter>
148                <action android:name="org.unifiedpush.android.distributor.REGISTER" />
149                <action android:name="org.unifiedpush.android.distributor.UNREGISTER" />
150                <action android:name="org.unifiedpush.android.distributor.feature.BYTES_MESSAGE" />
151                <action android:name="org.unifiedpush.android.distributor.feature.MESSENGER" />
152                <action android:name="org.unifiedpush.android.distributor.feature.APP_VALIDATION" />
153            </intent-filter>
154            <intent-filter>
155                <action android:name="android.intent.action.PACKAGE_FULLY_REMOVED" />
156                <data android:scheme="package" />
157            </intent-filter>
158        </receiver>
159
160        <activity
161            android:name=".ui.ShareLocationActivity"
162            android:label="@string/title_activity_share_location" />
163        <activity
164            android:name=".ui.SearchActivity"
165            android:label="@string/search_messages" />
166        <activity
167            android:name=".ui.RecordingActivity"
168            android:configChanges="orientation|screenSize"
169            android:theme="@style/Theme.Conversations3.Dialog" />
170        <activity
171            android:name=".ui.ShowLocationActivity"
172            android:label="@string/title_activity_show_location" />
173        <activity
174            android:name=".ui.ConversationActivity"
175            android:exported="true"
176            android:theme="@style/Theme.Conversations3.SplashScreen">
177            <intent-filter>
178                <action android:name="android.intent.action.MAIN" />
179                <category android:name="android.intent.category.LAUNCHER" />
180            </intent-filter>
181            <meta-data
182                android:name="android.app.shortcuts"
183                android:resource="@xml/shortcuts" />
184        </activity>
185        <activity
186            android:name=".ui.ConversationsActivity"
187            android:launchMode="singleTask"
188            android:minWidth="300dp"
189            android:minHeight="300dp"
190            android:windowSoftInputMode="stateHidden" />
191        <activity
192            android:name=".ui.ScanActivity"
193            android:screenOrientation="portrait"
194            android:theme="@style/Theme.Conversations3.FullScreen"
195            android:windowSoftInputMode="stateAlwaysHidden" />
196        <activity
197            android:name=".ui.UriHandlerActivity"
198            android:exported="true">
199            <intent-filter>
200                <action android:name="android.intent.action.VIEW" />
201
202                <category android:name="android.intent.category.DEFAULT" />
203                <category android:name="android.intent.category.BROWSABLE" />
204
205                <data android:scheme="xmpp" />
206            </intent-filter>
207            <intent-filter android:autoVerify="true">
208                <action android:name="android.intent.action.VIEW" />
209
210                <category android:name="android.intent.category.DEFAULT" />
211                <category android:name="android.intent.category.BROWSABLE" />
212
213                <data android:scheme="https" />
214                <data android:host="conversations.im" />
215                <data android:pathPrefix="/i/" />
216                <data android:pathPrefix="/j/" />
217            </intent-filter>
218            <intent-filter>
219                <action android:name="android.intent.action.SENDTO" />
220
221                <category android:name="android.intent.category.DEFAULT" />
222
223                <data android:scheme="imto" />
224                <data android:host="jabber" />
225            </intent-filter>
226            <intent-filter>
227                <action android:name="android.intent.action.SENDTO" />
228
229                <category android:name="android.intent.category.DEFAULT" />
230
231                <data android:scheme="imto" />
232                <data android:host="xmpp" />
233            </intent-filter>
234        </activity>
235        <activity
236            android:name=".ui.StartConversationActivity"
237            android:exported="true"
238            android:label="@string/title_activity_new_chat"
239            android:launchMode="singleTop">
240            <intent-filter>
241                <action android:name="android.intent.action.VIEW" />
242            </intent-filter>
243        </activity>
244        <activity
245            android:name=".ui.activity.SettingsActivity"
246            android:exported="true"
247            android:label="@string/title_activity_settings">
248            <intent-filter>
249                <action android:name="android.intent.action.MAIN" />
250                <category android:name="android.intent.category.NOTIFICATION_PREFERENCES" />
251            </intent-filter>
252        </activity>
253        <activity
254            android:name=".ui.ChooseContactActivity"
255            android:label="@string/title_activity_choose_contact" />
256        <activity
257            android:name=".ui.BlocklistActivity"
258            android:label="@string/title_activity_block_list" />
259        <activity
260            android:name=".ui.ChangePasswordActivity"
261            android:label="@string/change_password_on_server" />
262        <activity
263            android:name=".ui.ChooseAccountForProfilePictureActivity"
264            android:enabled="false"
265            android:exported="true"
266            android:label="@string/choose_account">
267            <intent-filter android:label="@string/set_profile_picture">
268                <action android:name="android.intent.action.ATTACH_DATA" />
269                <category android:name="android.intent.category.DEFAULT" />
270
271                <data android:mimeType="image/*" />
272            </intent-filter>
273        </activity>
274        <activity
275            android:name=".ui.ShareViaAccountActivity"
276            android:label="@string/title_activity_share_via_account"
277            android:launchMode="singleTop" />
278        <activity
279            android:name=".ui.EditAccountActivity"
280            android:exported="false"
281            android:launchMode="singleTop"
282            android:windowSoftInputMode="stateHidden|adjustResize" />
283        <activity
284            android:name=".ui.ConferenceDetailsActivity"
285            android:label="@string/action_muc_details"
286            android:windowSoftInputMode="stateHidden" />
287        <activity
288            android:name=".ui.ContactDetailsActivity"
289            android:windowSoftInputMode="stateHidden" />
290        <activity
291            android:name=".ui.PublishProfilePictureActivity"
292            android:label="@string/mgmt_account_publish_avatar"
293            android:windowSoftInputMode="stateHidden" />
294        <activity
295            android:name=".ui.PublishGroupChatProfilePictureActivity"
296            android:label="@string/group_chat_avatar" />
297        <activity
298            android:name=".ui.ShareWithActivity"
299            android:exported="true"
300            android:launchMode="singleTop">
301
302            <intent-filter>
303                <action android:name="android.intent.action.SEND" />
304                <action android:name="android.intent.action.SEND_MULTIPLE" />
305
306                <category android:name="android.intent.category.DEFAULT" />
307
308                <data android:mimeType="text/plain" />
309            </intent-filter>
310
311            <intent-filter>
312                <action android:name="android.intent.action.SEND" />
313                <action android:name="android.intent.action.SEND_MULTIPLE" />
314
315                <category android:name="android.intent.category.DEFAULT" />
316
317                <data android:mimeType="*/*" />
318            </intent-filter>
319
320            <meta-data
321                android:name="android.service.chooser.chooser_target_service"
322                android:value="androidx.sharetarget.ChooserTargetServiceCompat" />
323        </activity>
324        <activity
325            android:name=".ui.TrustKeysActivity"
326            android:label="@string/trust_omemo_fingerprints"
327            android:windowSoftInputMode="stateAlwaysHidden" />
328        <activity
329            android:name=".ui.AboutActivity"
330            android:parentActivityName=".ui.activity.SettingsActivity">
331            <meta-data
332                android:name="android.support.PARENT_ACTIVITY"
333                android:value="eu.siacs.conversations.ui.activity.SettingsActivity" />
334        </activity>
335        <activity
336            android:name="com.canhub.cropper.CropImageActivity"
337            android:theme="@style/Base.Theme.AppCompat" />
338        <activity android:name=".ui.MemorizingActivity" />
339
340        <activity
341            android:name=".ui.MediaBrowserActivity"
342            android:label="@string/media_browser" />
343        <activity android:name=".ui.AddReactionActivity" />
344
345        <provider
346            android:name="androidx.core.content.FileProvider"
347            android:authorities="${applicationId}.files"
348            android:exported="false"
349            android:grantUriPermissions="true">
350            <meta-data
351                android:name="android.support.FILE_PROVIDER_PATHS"
352                android:resource="@xml/file_paths" />
353        </provider>
354        <provider
355            android:name=".services.BarcodeProvider"
356            android:authorities="${applicationId}.barcodes"
357            android:exported="false"
358            android:grantUriPermissions="true" />
359
360        <activity
361            android:name=".ui.ShortcutActivity"
362            android:exported="true"
363            android:label="@string/contact">
364            <intent-filter>
365                <action android:name="android.intent.action.CREATE_SHORTCUT" />
366            </intent-filter>
367        </activity>
368        <activity android:name=".ui.ViewProfilePictureActivity"
369            android:theme="@style/Theme.Conversations3.Dark"/>
370        <activity
371            android:name=".ui.MucUsersActivity"
372            android:label="@string/group_chat_members" />
373        <activity
374            android:name=".ui.ChannelDiscoveryActivity"
375            android:label="@string/discover_channels" />
376        <activity
377            android:name=".ui.RtpSessionActivity"
378            android:autoRemoveFromRecents="true"
379            android:launchMode="singleInstance"
380            android:supportsPictureInPicture="true" />
381        <activity
382            android:name=".ui.ImportBackupActivity"
383            android:exported="true"
384            android:label="@string/restore_backup"
385            android:launchMode="singleTask">
386            <intent-filter>
387                <action android:name="android.intent.action.VIEW" />
388                <category android:name="android.intent.category.DEFAULT" />
389
390                <data android:mimeType="application/vnd.conversations.backup" />
391                <data android:scheme="content" />
392            </intent-filter>
393            <intent-filter>
394                <action android:name="android.intent.action.VIEW" />
395                <category android:name="android.intent.category.DEFAULT" />
396
397                <data android:mimeType="application/vnd.conversations.backup" />
398                <data android:scheme="file" />
399            </intent-filter>
400            <intent-filter>
401                <action android:name="android.intent.action.VIEW" />
402
403                <category android:name="android.intent.category.DEFAULT" />
404                <category android:name="android.intent.category.BROWSABLE" />
405
406                <data android:scheme="content" />
407                <data android:host="*" />
408                <data android:mimeType="*/*" />
409                <data android:pathPattern=".*\\.ceb" />
410                <data android:pathPattern=".*\\..*\\.ceb" />
411                <data android:pathPattern=".*\\..*\\..*\\.ceb" />
412                <data android:pathPattern=".*\\..*\\..*\\..*\\.ceb" />
413                <data android:pathPattern=".*\\..*\\..*\\..*\\..*\\.ceb" />
414                <data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\.ceb" />
415                <data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\..*\\.ceb" />
416            </intent-filter>
417            <intent-filter>
418                <action android:name="android.intent.action.VIEW" />
419
420                <category android:name="android.intent.category.DEFAULT" />
421                <category android:name="android.intent.category.BROWSABLE" />
422
423                <data android:scheme="file" />
424                <data android:host="*" />
425                <data android:mimeType="*/*" />
426                <data android:pathPattern=".*\\.ceb" />
427                <data android:pathPattern=".*\\..*\\.ceb" />
428                <data android:pathPattern=".*\\..*\\..*\\.ceb" />
429                <data android:pathPattern=".*\\..*\\..*\\..*\\.ceb" />
430                <data android:pathPattern=".*\\..*\\..*\\..*\\..*\\.ceb" />
431                <data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\.ceb" />
432                <data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\..*\\.ceb" />
433            </intent-filter>
434        </activity>
435    </application>
436
437</manifest>