1<?xml version="1.0" encoding="utf-8"?>
2<!--
3    Copyright (C) 2015 The Android Open Source Project
4
5    Licensed under the Apache License, Version 2.0 (the "License");
6    you may not use this file except in compliance with the License.
7    You may obtain a copy of the License at
8
9         http://www.apache.org/licenses/LICENSE-2.0
10
11    Unless required by applicable law or agreed to in writing, software
12    distributed under the License is distributed on an "AS IS" BASIS,
13    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14    See the License for the specific language governing permissions and
15    limitations under the License.
16-->
17<manifest xmlns:android="http://schemas.android.com/apk/res/android"
18    package="com.android.messaging"
19    android:installLocation="internalOnly">
20
21    <uses-sdk android:minSdkVersion="19" android:targetSdkVersion="24" />
22
23    <!-- Application holds CPU wakelock while working in background -->
24    <uses-permission android:name="android.permission.WAKE_LOCK" />
25    <!-- Application needs SMS/MMS permissions -->
26    <uses-permission android:name="android.permission.READ_SMS"/>
27    <uses-permission android:name="android.permission.WRITE_SMS"/>
28    <uses-permission android:name="android.permission.RECEIVE_SMS"/>
29    <uses-permission android:name="android.permission.RECEIVE_MMS"/>
30    <uses-permission android:name="android.permission.SEND_SMS"/>
31    <!-- Application needs access to MMS network -->
32    <uses-permission android:name="android.permission.INTERNET" />
33    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
34    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
35    <!-- Application needs CONTACT permissions -->
36    <uses-permission android:name="android.permission.READ_CONTACTS"/>
37    <uses-permission android:name="android.permission.WRITE_CONTACTS"/>
38    <!-- Application needs to read profiles for the user itself from CP2 -->
39    <uses-permission android:name="android.permission.READ_PROFILE"/>
40    <uses-permission android:name="android.permission.VIBRATE"/>
41    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
42
43    <uses-permission android:name="android.permission.CAMERA" />
44    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
45    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
46    <uses-permission android:name="android.permission.RECORD_AUDIO" />
47    <uses-permission android:name="android.permission.CALL_PHONE" />
48    <uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />
49    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
50
51    <!--  Optional features -->
52    <uses-feature android:name="android.hardware.camera" android:required="false" />
53    <uses-feature android:name="android.hardware.camera.front" android:required="false" />
54    <uses-feature android:name="android.hardware.camera.autofocus" android:required="false" />
55    <uses-feature android:name="android.hardware.microphone" android:required="false" />
56    <uses-feature android:name="android.hardware.screen.portrait" android:required="false" />
57
58    <application
59        android:name="com.android.messaging.BugleApplication"
60        android:allowBackup="false"
61        android:icon="@drawable/ic_launcher"
62        android:label="@string/app_name"
63        android:theme="@style/BugleTheme"
64        android:supportsRtl="true">
65
66        <!-- Displays a list of conversations -->
67        <activity
68            android:name=".ui.conversationlist.ConversationListActivity"
69            android:configChanges="orientation|screenSize|keyboardHidden"
70            android:screenOrientation="user"
71            android:label="@string/app_name"
72            android:exported="true"
73            android:theme="@style/BugleTheme.ConversationListActivity">
74            <intent-filter>
75                <action android:name="android.intent.action.MAIN" />
76                <category android:name="android.intent.category.LAUNCHER" />
77                <category android:name="android.intent.category.DEFAULT" />
78                <category android:name="android.intent.category.APP_MESSAGING" />
79            </intent-filter>
80        </activity>
81
82        <activity
83            android:name=".ui.PermissionCheckActivity"
84            android:screenOrientation="portrait"
85            android:configChanges="orientation|screenSize|keyboardHidden" />
86
87        <!-- Launches a conversation (ensures correct app name shown in recents) -->
88        <activity
89            android:name=".ui.conversation.LaunchConversationActivity"
90            android:configChanges="orientation|screenSize|keyboardHidden"
91            android:screenOrientation="user"
92            android:theme="@style/Invisible"
93            android:noHistory="true"
94            android:exported="true"
95            android:documentLaunchMode="always">
96            <intent-filter>
97                <action android:name="android.intent.action.VIEW" />
98                <action android:name="android.intent.action.SENDTO" />
99                <category android:name="android.intent.category.DEFAULT" />
100                <category android:name="android.intent.category.BROWSABLE" />
101                <data android:scheme="sms" />
102                <data android:scheme="smsto" />
103                <data android:scheme="mms" />
104                <data android:scheme="mmsto" />
105            </intent-filter>
106        </activity>
107
108        <!-- Displays a list of archived conversations -->
109        <activity
110            android:name=".ui.conversationlist.ArchivedConversationListActivity"
111            android:configChanges="orientation|screenSize|keyboardHidden"
112            android:screenOrientation="user"
113            android:label="@string/archived_activity_title"
114            android:theme="@style/BugleTheme.ArchivedConversationListActivity"
115            android:parentActivityName="com.android.messaging.ui.conversationlist.ConversationListActivity">
116            <meta-data
117                android:name="android.support.PARENT_ACTIVITY"
118                android:value="com.android.messaging.ui.conversationlist.ConversationListActivity" />
119        </activity>
120
121        <!-- Displays the contents of a single conversation -->
122        <activity
123            android:name=".ui.conversation.ConversationActivity"
124            android:configChanges="orientation|screenSize|keyboardHidden"
125            android:screenOrientation="user"
126            android:windowSoftInputMode="stateHidden|adjustResize"
127            android:theme="@style/BugleTheme.ConversationActivity"
128            android:parentActivityName="com.android.messaging.ui.conversationlist.ConversationListActivity">
129            <meta-data
130                android:name="android.support.PARENT_ACTIVITY"
131                android:value="com.android.messaging.ui.conversationlist.ConversationListActivity" />
132        </activity>
133
134        <!-- Blocked Participants -->
135        <activity
136            android:name=".ui.BlockedParticipantsActivity"
137            android:configChanges="orientation|screenSize|keyboardHidden"
138            android:screenOrientation="user"
139            android:label="@string/blocked_contacts_title"
140            android:theme="@style/BugleTheme"
141            android:parentActivityName="com.android.messaging.ui.conversationlist.ConversationListActivity">
142            <meta-data
143                android:name="android.support.PARENT_ACTIVITY"
144                android:value="com.android.messaging.ui.conversationlist.ConversationListActivity" />
145        </activity>
146
147        <!-- Full-screen photo viewer -->
148        <activity
149            android:name=".ui.photoviewer.BuglePhotoViewActivity"
150            android:label="@string/photo_view_activity_title"
151            android:configChanges="orientation|screenSize|keyboardHidden"
152            android:screenOrientation="user"
153            android:theme="@style/BuglePhotoViewTheme"
154        />
155
156        <!-- Settings -->
157        <activity
158            android:name=".ui.appsettings.SettingsActivity"
159            android:label="@string/settings_activity_title"
160            android:theme="@style/BugleTheme.SettingsActivity"
161            android:configChanges="orientation|screenSize|keyboardHidden"
162            android:screenOrientation="user"
163            android:parentActivityName="com.android.messaging.ui.conversationlist.ConversationListActivity">
164            <meta-data
165                android:name="android.support.PARENT_ACTIVITY"
166                android:value="com.android.messaging.ui.conversationlist.ConversationListActivity" />
167        </activity>
168
169        <activity
170            android:name=".ui.appsettings.PerSubscriptionSettingsActivity"
171            android:label="@string/advanced_settings_activity_title"
172            android:theme="@style/BugleTheme.SettingsActivity"
173            android:configChanges="orientation|screenSize|keyboardHidden"
174            android:screenOrientation="user"
175            android:parentActivityName="com.android.messaging.ui.appsettings.SettingsActivity">
176            <meta-data
177                android:name="android.support.PARENT_ACTIVITY"
178                android:value="com.android.messaging.ui.appsettings.SettingsActivity" />
179        </activity>
180
181        <activity
182            android:name=".ui.appsettings.ApplicationSettingsActivity"
183            android:label="@string/general_settings_activity_title"
184            android:theme="@style/BugleTheme.SettingsActivity"
185            android:configChanges="orientation|screenSize|keyboardHidden"
186            android:screenOrientation="user"
187            android:parentActivityName="com.android.messaging.ui.appsettings.SettingsActivity">
188            <meta-data
189                android:name="android.support.PARENT_ACTIVITY"
190                android:exported="true"
191                android:value="com.android.messaging.ui.appsettings.SettingsActivity" />
192            <intent-filter>
193                <action android:name="android.intent.action.MAIN" />
194                <category android:name="android.intent.category.DEFAULT" />
195                <category android:name="android.intent.category.NOTIFICATION_PREFERENCES" />
196            </intent-filter>
197        </activity>
198
199        <!-- Handles sharing intent -->
200        <activity
201            android:name=".ui.conversationlist.ShareIntentActivity"
202            android:configChanges="orientation|screenSize|keyboardHidden"
203            android:screenOrientation="user"
204            android:theme="@style/BugleTheme.DialogActivity"
205            android:excludeFromRecents="true"
206            android:exported="true"
207            android:documentLaunchMode="always">
208            <intent-filter
209                android:label="@string/share_intent_label">
210                <action android:name="android.intent.action.SEND" />
211                <action android:name="android.intent.action.SEND_MULTIPLE" />
212                <category android:name="android.intent.category.DEFAULT" />
213                <data android:mimeType="text/plain" />
214                <data android:mimeType="text/x-vCard" />
215                <data android:mimeType="text/x-vcard" />
216                <data android:mimeType="image/*" />
217                <data android:mimeType="audio/*" />
218                <data android:mimeType="video/*" />
219                <data android:mimeType="application/ogg" />
220            </intent-filter>
221        </activity>
222
223        <!-- People & Options -->
224        <activity
225            android:name=".ui.conversationsettings.PeopleAndOptionsActivity"
226            android:configChanges="orientation|screenSize|keyboardHidden"
227            android:screenOrientation="user"
228            android:label="@string/people_and_options_activity_title"
229            android:theme="@style/BugleTheme"
230            android:parentActivityName="com.android.messaging.ui.conversation.ConversationActivity">
231            <meta-data
232                android:name="android.support.PARENT_ACTIVITY"
233                android:value="com.android.messaging.ui.conversation.ConversationActivity" />
234        </activity>
235
236         <!-- License -->
237        <activity android:name=".ui.LicenseActivity"
238            android:exported="true"
239            android:theme="@android:style/Theme.Holo.Light.Dialog"
240            android:label="@string/menu_license">
241        </activity>
242
243        <!-- Message Forwarding -->
244        <activity
245            android:name=".ui.conversationlist.ForwardMessageActivity"
246            android:configChanges="orientation|screenSize|keyboardHidden"
247            android:screenOrientation="user"
248            android:label="@string/forward_message_activity_title"
249            android:theme="@style/BugleTheme.DialogActivity">
250        </activity>
251
252        <!-- Entry point for handling remote input/actions. Currently, this is only used by Android
253             Wear to send voice replies. Since that uses PendingIntents, we don't need to export
254             this activity. If we want other apps to be able to use this activity at will,
255             we'll need to guard it with a signature-matching protected permission. We would also
256             need to add an intent filter and remove the android:exported attribute. -->
257        <activity
258            android:name=".ui.RemoteInputEntrypointActivity"
259            android:configChanges="orientation|screenSize|keyboardHidden"
260            android:screenOrientation="user"
261            android:exported="false"
262            android:theme="@style/Invisible">
263        </activity>
264
265        <!-- VCard details -->
266        <activity
267            android:name=".ui.VCardDetailActivity"
268            android:configChanges="orientation|screenSize|keyboardHidden"
269            android:screenOrientation="user"
270            android:label="@string/vcard_detail_activity_title"
271            android:theme="@style/BugleTheme">
272            <meta-data
273                android:name="android.support.PARENT_ACTIVITY"
274                android:value=".ui.conversation.ConversationActivity" />
275        </activity>
276
277        <!-- Attachment chooser -->
278        <activity
279            android:name=".ui.attachmentchooser.AttachmentChooserActivity"
280            android:configChanges="orientation|screenSize|keyboardHidden"
281            android:screenOrientation="user"
282            android:label="@string/attachment_chooser_activity_title"
283            android:theme="@style/BugleTheme"
284            android:parentActivityName="com.android.messaging.ui.conversation.ConversationActivity">
285            <meta-data
286                android:name="android.support.PARENT_ACTIVITY"
287                android:value="com.android.messaging.ui.conversation.ConversationActivity" />
288        </activity>
289
290        <!-- Test activity that we use to host fragments/views. Unfortunately, apparently necessary
291             because Android framework test cases want activity to be in the instrumented package.
292             See http://developer.android.com/reference/android/test/ActivityInstrumentationTestCase2.html
293        -->
294        <activity
295            android:name=".ui.TestActivity"
296            android:configChanges="orientation|screenSize|keyboardHidden">
297        </activity>
298
299        <activity
300            android:name=".ui.debug.DebugMmsConfigActivity"
301            android:configChanges="orientation|screenSize|keyboardHidden"
302            android:screenOrientation="user"
303            android:theme="@style/BugleTheme.DialogActivity"
304            android:exported="false">
305        </activity>
306
307        <provider android:name=".datamodel.MessagingContentProvider" android:label="@string/app_name"
308                  android:authorities="com.android.messaging.datamodel.MessagingContentProvider"
309                  android:exported="false" >
310        </provider>
311
312        <provider android:name=".datamodel.MmsFileProvider"
313                  android:authorities="com.android.messaging.datamodel.MmsFileProvider"
314                  android:grantUriPermissions="true"
315                  android:exported="false" />
316
317        <provider android:name=".datamodel.MediaScratchFileProvider"
318                  android:authorities="com.android.messaging.datamodel.MediaScratchFileProvider"
319                  android:grantUriPermissions="true"
320                  android:exported="false" />
321
322
323        <!-- Action Services -->
324        <service android:name=".datamodel.action.ActionServiceImpl"
325                 android:permission="android.permission.BIND_JOB_SERVICE"
326                 android:exported="true"/>
327        <service android:name=".datamodel.action.BackgroundWorkerService"
328                 android:permission="android.permission.BIND_JOB_SERVICE"
329                 android:exported="true"/>
330
331        <!-- Sms and Mms related items -->
332
333        <!-- Intents for Notification and Pre-KLP Delivery -->
334        <!-- Registered with the highest possible priority (max_int) -->
335        <receiver android:name=".receiver.MmsWapPushReceiver"
336                  android:enabled="false"
337                  android:exported="true"
338                  android:permission="android.permission.BROADCAST_WAP_PUSH">
339            <intent-filter android:priority="2147483647">
340                <action android:name="android.provider.Telephony.WAP_PUSH_RECEIVED" />
341                <data android:mimeType="application/vnd.wap.mms-message" />
342            </intent-filter>
343        </receiver>
344        <receiver android:name=".receiver.SmsReceiver"
345                  android:enabled="false"
346                  android:exported="true"
347                  android:permission="android.permission.BROADCAST_SMS">
348            <intent-filter android:priority="2147483647">
349                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
350            </intent-filter>
351            <intent-filter android:priority="2147483647">
352                <action android:name="android.provider.Telephony.MMS_DOWNLOADED" />
353            </intent-filter>
354        </receiver>
355
356        <!-- Intents for aborting SMS/MMS broadcasts pre-KLP -->
357        <!-- Registered for a priority just ahead of inbox Messaging apps (2) -->
358        <receiver android:name=".receiver.AbortMmsWapPushReceiver"
359                  android:enabled="false"
360                  android:exported="true"
361                  android:permission="android.permission.BROADCAST_WAP_PUSH">
362            <intent-filter android:priority="3">
363                <action android:name="android.provider.Telephony.WAP_PUSH_RECEIVED" />
364                <data android:mimeType="application/vnd.wap.mms-message" />
365            </intent-filter>
366        </receiver>
367        <receiver android:name=".receiver.AbortSmsReceiver"
368                  android:enabled="false"
369                  android:exported="true"
370                  android:permission="android.permission.BROADCAST_SMS">
371            <intent-filter android:priority="3">
372                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
373            </intent-filter>
374        </receiver>
375
376        <!-- Intents for KLP+ Delivery -->
377        <receiver android:name=".receiver.MmsWapPushDeliverReceiver"
378                  android:exported="true"
379                  android:permission="android.permission.BROADCAST_WAP_PUSH">
380            <intent-filter>
381                <action android:name="android.provider.Telephony.WAP_PUSH_DELIVER" />
382                <data android:mimeType="application/vnd.wap.mms-message" />
383            </intent-filter>
384        </receiver>
385        <receiver android:name=".receiver.SmsDeliverReceiver"
386                  android:exported="true"
387                  android:permission="android.permission.BROADCAST_SMS">
388            <intent-filter>
389                <action android:name="android.provider.Telephony.SMS_DELIVER" />
390            </intent-filter>
391        </receiver>
392
393        <receiver android:name=".receiver.SendStatusReceiver"
394                android:exported="false">
395            <intent-filter>
396                <action android:name="com.android.messaging.receiver.SendStatusReceiver.MESSAGE_SENT" />
397                <data android:scheme="content" />
398            </intent-filter>
399            <intent-filter>
400                <action android:name="com.android.messaging.receiver.SendStatusReceiver.MESSAGE_DELIVERED" />
401            </intent-filter>
402            <intent-filter>
403                <action android:name="com.android.messaging.receiver.SendStatusReceiver.MMS_SENT" />
404                <data android:scheme="content" />
405            </intent-filter>
406            <intent-filter>
407                <action android:name="com.android.messaging.receiver.SendStatusReceiver.MMS_DOWNLOADED" />
408                <data android:scheme="content" />
409            </intent-filter>
410        </receiver>
411
412        <service android:name=".datamodel.NoConfirmationSmsSendService"
413                 android:permission="android.permission.SEND_RESPOND_VIA_MESSAGE"
414                 android:exported="true" >
415            <intent-filter>
416                <action android:name="android.intent.action.RESPOND_VIA_MESSAGE" />
417                <category android:name="android.intent.category.DEFAULT" />
418                <data android:scheme="sms" />
419                <data android:scheme="smsto" />
420                <data android:scheme="mms" />
421                <data android:scheme="mmsto" />
422            </intent-filter>
423        </service>
424
425        <activity android:name=".ui.ClassZeroActivity"
426                  android:configChanges="orientation|screenSize|keyboardHidden"
427                  android:screenOrientation="user"
428                  android:label="@string/class_0_message_activity"
429                  android:theme="@style/BugleTheme.DialogActivity"
430                  android:launchMode="singleTask"
431                  android:excludeFromRecents="true">
432        </activity>
433
434        <activity android:name=".ui.SmsStorageLowWarningActivity"
435                  android:theme="@style/Translucent"
436                  android:configChanges="orientation|screenSize|keyboardHidden" />
437
438        <activity android:name=".ui.appsettings.ApnSettingsActivity"
439                  android:configChanges="orientation|screenSize|keyboardHidden"
440                  android:screenOrientation="user"
441                  android:theme="@style/BugleTheme"
442                  android:parentActivityName="com.android.messaging.ui.appsettings.SettingsActivity" />
443
444        <activity android:name=".ui.appsettings.ApnEditorActivity"
445                  android:configChanges="orientation|screenSize|keyboardHidden"
446                  android:screenOrientation="user"
447                  android:theme="@style/BugleTheme"
448                  android:parentActivityName="com.android.messaging.ui.appsettings.ApnSettingsActivity"/>
449
450        <receiver android:name=".receiver.StorageStatusReceiver"
451            android:exported="true">
452            <intent-filter>
453                <action android:name="android.intent.action.DEVICE_STORAGE_LOW" />
454            </intent-filter>
455            <intent-filter>
456                <action android:name="android.intent.action.DEVICE_STORAGE_OK" />
457            </intent-filter>
458        </receiver>
459
460        <receiver android:name=".receiver.BootAndPackageReplacedReceiver"
461            android:exported="true">
462            <intent-filter>
463                <action android:name="android.intent.action.BOOT_COMPLETED"/>
464                <action android:name="android.intent.action.MY_PACKAGE_REPLACED"/>
465            </intent-filter>
466        </receiver>
467
468        <!-- Broadcast receiver that will be notified to reset notifications -->
469        <receiver
470            android:name=".receiver.NotificationReceiver"
471            android:exported="false">
472        </receiver>
473
474        <!-- Broadcast receiver that will be notified for ActionService alarms. -->
475        <receiver
476            android:name=".datamodel.action.ActionServiceImpl$PendingActionReceiver"
477            android:exported="false">
478            <intent-filter>
479                <action android:name="com.android.messaging.datamodel.PENDING_ACTION" />
480            </intent-filter>
481        </receiver>
482
483        <receiver android:name=".receiver.DefaultSmsSubscriptionChangeReceiver"
484            android:exported="true">
485            <intent-filter>
486                <action android:name="android.telephony.action.DEFAULT_SMS_SUBSCRIPTION_CHANGED"/>
487            </intent-filter>
488        </receiver>
489
490        <!-- Widget that displays the conversation list -->
491        <receiver android:name=".widget.BugleWidgetProvider"
492                android:exported="true"
493                android:label="@string/widget_conversation_name">
494            <intent-filter>
495                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
496            </intent-filter>
497            <meta-data android:name="android.appwidget.provider"
498                       android:resource="@xml/widget_conversation_list" />
499        </receiver>
500
501        <!-- Widget that displays the messages of a single conversation -->
502        <receiver android:name=".widget.WidgetConversationProvider"
503                android:exported="true"
504                android:label="@string/widget_conversation_name">
505            <intent-filter>
506                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
507            </intent-filter>
508            <meta-data android:name="android.appwidget.provider"
509                       android:resource="@xml/widget_conversation" />
510        </receiver>
511
512        <service android:name=".widget.WidgetConversationListService"
513                 android:permission="android.permission.BIND_REMOTEVIEWS"
514                 android:exported="false" />
515
516        <service android:name=".widget.WidgetConversationService"
517                 android:permission="android.permission.BIND_REMOTEVIEWS"
518                 android:exported="false" />
519
520        <activity android:name=".ui.WidgetPickConversationActivity"
521            android:theme="@style/BugleTheme"
522                android:exported="true"
523            android:label="@string/app_name" >
524            <intent-filter>
525                <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" />
526            </intent-filter>
527        </activity>
528
529        <service android:name="androidx.appcompat.mms.MmsService"/>
530    </application>
531
532</manifest>
533