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                  android:exported="false" />
322
323        <provider android:name=".datamodel.MediaScratchFileProvider"
324                  android:authorities="com.android.messaging.datamodel.MediaScratchFileProvider"
325                  android:grantUriPermissions="true"
326                  android:exported="false" />
327
328
329        <!-- Action Services -->
330        <service android:name=".datamodel.action.ActionServiceImpl"/>
331        <service android:name=".datamodel.action.BackgroundWorkerService"/>
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/Invisible"
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            <intent-filter>
488                <action android:name="com.android.Bugle.intent.action.ACTION_NOTIFY_CONVERSATIONS_CHANGED" />
489            </intent-filter>
490            <meta-data android:name="android.appwidget.provider"
491                       android:resource="@xml/widget_conversation_list" />
492        </receiver>
493
494        <!-- Widget that displays the messages of a single conversation -->
495        <receiver android:name=".widget.WidgetConversationProvider"
496                android:label="@string/widget_conversation_name">
497            <intent-filter>
498                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
499            </intent-filter>
500            <intent-filter>
501                <action android:name="com.android.Bugle.intent.action.ACTION_NOTIFY_MESSAGES_CHANGED" />
502            </intent-filter>
503            <meta-data android:name="android.appwidget.provider"
504                       android:resource="@xml/widget_conversation" />
505        </receiver>
506
507        <service android:name=".widget.WidgetConversationListService"
508                 android:permission="android.permission.BIND_REMOTEVIEWS"
509                 android:exported="false" />
510
511        <service android:name=".widget.WidgetConversationService"
512                 android:permission="android.permission.BIND_REMOTEVIEWS"
513                 android:exported="false" />
514
515        <activity android:name=".ui.WidgetPickConversationActivity"
516            android:theme="@style/BugleTheme"
517            android:label="@string/app_name" >
518            <intent-filter>
519                <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" />
520            </intent-filter>
521        </activity>
522
523        <service android:name="android.support.v7.mms.MmsService"/>
524    </application>
525
526</manifest>
527