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