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                <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="application/ogg" />
220            </intent-filter>
221            <intent-filter
222                    android:label="@string/share_intent_label">
223                <action android:name="android.intent.action.SEND_MULTIPLE" />
224                <category android:name="android.intent.category.DEFAULT" />
225                <data android:mimeType="image/*" />
226            </intent-filter>
227        </activity>
228
229        <!-- People & Options -->
230        <activity
231            android:name=".ui.conversationsettings.PeopleAndOptionsActivity"
232            android:configChanges="orientation|screenSize|keyboardHidden"
233            android:screenOrientation="user"
234            android:label="@string/people_and_options_activity_title"
235            android:theme="@style/BugleTheme"
236            android:parentActivityName="com.android.messaging.ui.conversation.ConversationActivity">
237            <meta-data
238                android:name="android.support.PARENT_ACTIVITY"
239                android:value="com.android.messaging.ui.conversation.ConversationActivity" />
240        </activity>
241
242         <!-- License -->
243        <activity android:name=".ui.LicenseActivity"
244            android:exported="true"
245            android:theme="@android:style/Theme.Holo.Light.Dialog"
246            android:label="@string/menu_license">
247        </activity>
248
249        <!-- Message Forwarding -->
250        <activity
251            android:name=".ui.conversationlist.ForwardMessageActivity"
252            android:configChanges="orientation|screenSize|keyboardHidden"
253            android:screenOrientation="user"
254            android:label="@string/forward_message_activity_title"
255            android:theme="@style/BugleTheme.DialogActivity">
256        </activity>
257
258        <!-- Entry point for handling remote input/actions. Currently, this is only used by Android
259             Wear to send voice replies. Since that uses PendingIntents, we don't need to export
260             this activity. If we want other apps to be able to use this activity at will,
261             we'll need to guard it with a signature-matching protected permission. We would also
262             need to add an intent filter and remove the android:exported attribute. -->
263        <activity
264            android:name=".ui.RemoteInputEntrypointActivity"
265            android:configChanges="orientation|screenSize|keyboardHidden"
266            android:screenOrientation="user"
267            android:exported="false"
268            android:theme="@style/Invisible">
269        </activity>
270
271        <!-- VCard details -->
272        <activity
273            android:name=".ui.VCardDetailActivity"
274            android:configChanges="orientation|screenSize|keyboardHidden"
275            android:screenOrientation="user"
276            android:label="@string/vcard_detail_activity_title"
277            android:theme="@style/BugleTheme">
278            <meta-data
279                android:name="android.support.PARENT_ACTIVITY"
280                android:value=".ui.conversation.ConversationActivity" />
281        </activity>
282
283        <!-- Attachment chooser -->
284        <activity
285            android:name=".ui.attachmentchooser.AttachmentChooserActivity"
286            android:configChanges="orientation|screenSize|keyboardHidden"
287            android:screenOrientation="user"
288            android:label="@string/attachment_chooser_activity_title"
289            android:theme="@style/BugleTheme"
290            android:parentActivityName="com.android.messaging.ui.conversation.ConversationActivity">
291            <meta-data
292                android:name="android.support.PARENT_ACTIVITY"
293                android:value="com.android.messaging.ui.conversation.ConversationActivity" />
294        </activity>
295
296        <!-- Test activity that we use to host fragments/views. Unfortunately, apparently necessary
297             because Android framework test cases want activity to be in the instrumented package.
298             See http://developer.android.com/reference/android/test/ActivityInstrumentationTestCase2.html
299        -->
300        <activity
301            android:name=".ui.TestActivity"
302            android:configChanges="orientation|screenSize|keyboardHidden">
303        </activity>
304
305        <activity
306            android:name=".ui.debug.DebugMmsConfigActivity"
307            android:configChanges="orientation|screenSize|keyboardHidden"
308            android:screenOrientation="user"
309            android:theme="@style/BugleTheme.DialogActivity"
310            android:exported="false">
311        </activity>
312
313        <provider android:name=".datamodel.MessagingContentProvider" android:label="@string/app_name"
314                  android:authorities="com.android.messaging.datamodel.MessagingContentProvider"
315                  android:exported="false" >
316        </provider>
317
318        <provider android:name=".datamodel.MmsFileProvider"
319                  android:authorities="com.android.messaging.datamodel.MmsFileProvider"
320                  android:grantUriPermissions="true" />
321
322        <provider android:name=".datamodel.MediaScratchFileProvider"
323                  android:authorities="com.android.messaging.datamodel.MediaScratchFileProvider"
324                  android:grantUriPermissions="true" />
325
326
327        <!-- Action Services -->
328        <service android:name=".datamodel.action.ActionServiceImpl"/>
329        <service android:name=".datamodel.action.BackgroundWorkerService"/>
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:permission="android.permission.BROADCAST_WAP_PUSH">
338            <intent-filter android:priority="2147483647">
339                <action android:name="android.provider.Telephony.WAP_PUSH_RECEIVED" />
340                <data android:mimeType="application/vnd.wap.mms-message" />
341            </intent-filter>
342        </receiver>
343        <receiver android:name=".receiver.SmsReceiver"
344                  android:enabled="false"
345                  android:permission="android.permission.BROADCAST_SMS">
346            <intent-filter android:priority="2147483647">
347                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
348            </intent-filter>
349            <intent-filter android:priority="2147483647">
350                <action android:name="android.provider.Telephony.MMS_DOWNLOADED" />
351            </intent-filter>
352        </receiver>
353
354        <!-- Intents for aborting SMS/MMS broadcasts pre-KLP -->
355        <!-- Registered for a priority just ahead of inbox Messaging apps (2) -->
356        <receiver android:name=".receiver.AbortMmsWapPushReceiver"
357                  android:enabled="false"
358                  android:permission="android.permission.BROADCAST_WAP_PUSH">
359            <intent-filter android:priority="3">
360                <action android:name="android.provider.Telephony.WAP_PUSH_RECEIVED" />
361                <data android:mimeType="application/vnd.wap.mms-message" />
362            </intent-filter>
363        </receiver>
364        <receiver android:name=".receiver.AbortSmsReceiver"
365                  android:enabled="false"
366                  android:permission="android.permission.BROADCAST_SMS">
367            <intent-filter android:priority="3">
368                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
369            </intent-filter>
370        </receiver>
371
372        <!-- Intents for KLP+ Delivery -->
373        <receiver android:name=".receiver.MmsWapPushDeliverReceiver"
374                  android:permission="android.permission.BROADCAST_WAP_PUSH">
375            <intent-filter>
376                <action android:name="android.provider.Telephony.WAP_PUSH_DELIVER" />
377                <data android:mimeType="application/vnd.wap.mms-message" />
378            </intent-filter>
379        </receiver>
380        <receiver android:name=".receiver.SmsDeliverReceiver"
381                  android:permission="android.permission.BROADCAST_SMS">
382            <intent-filter>
383                <action android:name="android.provider.Telephony.SMS_DELIVER" />
384            </intent-filter>
385        </receiver>
386
387        <receiver android:name=".receiver.SendStatusReceiver"
388                android:exported="false">
389            <intent-filter>
390                <action android:name="com.android.messaging.receiver.SendStatusReceiver.MESSAGE_SENT" />
391                <data android:scheme="content" />
392            </intent-filter>
393            <intent-filter>
394                <action android:name="com.android.messaging.receiver.SendStatusReceiver.MESSAGE_DELIVERED" />
395            </intent-filter>
396            <intent-filter>
397                <action android:name="com.android.messaging.receiver.SendStatusReceiver.MMS_SENT" />
398                <data android:scheme="content" />
399            </intent-filter>
400            <intent-filter>
401                <action android:name="com.android.messaging.receiver.SendStatusReceiver.MMS_DOWNLOADED" />
402                <data android:scheme="content" />
403            </intent-filter>
404        </receiver>
405
406        <service android:name=".datamodel.NoConfirmationSmsSendService"
407                 android:permission="android.permission.SEND_RESPOND_VIA_MESSAGE"
408                 android:exported="true" >
409            <intent-filter>
410                <action android:name="android.intent.action.RESPOND_VIA_MESSAGE" />
411                <category android:name="android.intent.category.DEFAULT" />
412                <data android:scheme="sms" />
413                <data android:scheme="smsto" />
414            </intent-filter>
415        </service>
416
417        <activity android:name=".ui.ClassZeroActivity"
418                  android:configChanges="orientation|screenSize|keyboardHidden"
419                  android:screenOrientation="user"
420                  android:label="@string/class_0_message_activity"
421                  android:theme="@style/BugleTheme.DialogActivity"
422                  android:launchMode="singleTask"
423                  android:excludeFromRecents="true">
424        </activity>
425
426        <activity android:name=".ui.SmsStorageLowWarningActivity"
427                  android:theme="@style/Invisible"
428                  android:configChanges="orientation|screenSize|keyboardHidden" />
429
430        <activity android:name=".ui.appsettings.ApnSettingsActivity"
431                  android:configChanges="orientation|screenSize|keyboardHidden"
432                  android:screenOrientation="user"
433                  android:theme="@style/BugleTheme"
434                  android:parentActivityName="com.android.messaging.ui.appsettings.SettingsActivity" />
435
436        <activity android:name=".ui.appsettings.ApnEditorActivity"
437                  android:configChanges="orientation|screenSize|keyboardHidden"
438                  android:screenOrientation="user"
439                  android:theme="@style/BugleTheme"
440                  android:parentActivityName="com.android.messaging.ui.appsettings.ApnSettingsActivity"/>
441
442        <receiver android:name=".receiver.StorageStatusReceiver">
443            <intent-filter>
444                <action android:name="android.intent.action.DEVICE_STORAGE_LOW" />
445            </intent-filter>
446            <intent-filter>
447                <action android:name="android.intent.action.DEVICE_STORAGE_OK" />
448            </intent-filter>
449        </receiver>
450
451        <receiver android:name=".receiver.BootAndPackageReplacedReceiver">
452            <intent-filter>
453                <action android:name="android.intent.action.BOOT_COMPLETED"/>
454                <action android:name="android.intent.action.MY_PACKAGE_REPLACED"/>
455                </intent-filter>
456        </receiver>
457
458        <!-- Broadcast receiver that will be notified to reset notifications -->
459        <receiver
460            android:name=".receiver.NotificationReceiver"
461            android:exported="false">
462        </receiver>
463
464        <!-- Broadcast receiver that will be notified for ActionService alarms. -->
465        <receiver
466            android:name=".datamodel.action.ActionServiceImpl$PendingActionReceiver"
467            android:exported="false">
468            <intent-filter>
469                <action android:name="com.android.messaging.datamodel.PENDING_ACTION" />
470            </intent-filter>
471        </receiver>
472
473        <receiver android:name=".receiver.DefaultSmsSubscriptionChangeReceiver">
474            <intent-filter>
475                <action android:name="android.intent.action.ACTION_DEFAULT_SMS_SUBSCRIPTION_CHANGED"/>
476            </intent-filter>
477        </receiver>
478
479        <!-- Widget that displays the conversation list -->
480        <receiver android:name=".widget.BugleWidgetProvider"
481                android:label="@string/widget_conversation_name">
482            <intent-filter>
483                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
484            </intent-filter>
485            <intent-filter>
486                <action android:name="com.android.Bugle.intent.action.ACTION_NOTIFY_CONVERSATIONS_CHANGED" />
487            </intent-filter>
488            <meta-data android:name="android.appwidget.provider"
489                       android:resource="@xml/widget_conversation_list" />
490        </receiver>
491
492        <!-- Widget that displays the messages of a single conversation -->
493        <receiver android:name=".widget.WidgetConversationProvider"
494                android:label="@string/widget_conversation_name">
495            <intent-filter>
496                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
497            </intent-filter>
498            <intent-filter>
499                <action android:name="com.android.Bugle.intent.action.ACTION_NOTIFY_MESSAGES_CHANGED" />
500            </intent-filter>
501            <meta-data android:name="android.appwidget.provider"
502                       android:resource="@xml/widget_conversation" />
503        </receiver>
504
505        <service android:name=".widget.WidgetConversationListService"
506                 android:permission="android.permission.BIND_REMOTEVIEWS"
507                 android:exported="false" />
508
509        <service android:name=".widget.WidgetConversationService"
510                 android:permission="android.permission.BIND_REMOTEVIEWS"
511                 android:exported="false" />
512
513        <activity android:name=".ui.WidgetPickConversationActivity"
514            android:theme="@style/BugleTheme"
515            android:label="@string/app_name" >
516            <intent-filter>
517                <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" />
518            </intent-filter>
519        </activity>
520
521        <service android:name="android.support.v7.mms.MmsService"/>
522    </application>
523
524</manifest>
525