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