1/*
2 * Copyright 2014, The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *     http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package com.android.managedprovisioning;
17
18import static android.speech.RecognizerIntent.ACTION_RECOGNIZE_SPEECH;
19
20import android.content.Context;
21import android.content.Intent;
22import android.content.IntentFilter;
23import android.content.pm.PackageManager;
24import android.provider.MediaStore;
25
26import com.android.managedprovisioning.ProvisionLogger;
27
28import java.util.List;
29/**
30 * Class to set CrossProfileIntentFilters during managed profile creation, and reset them after an
31 * ota.
32 */
33public class CrossProfileIntentFiltersHelper {
34
35    public static void setFilters(PackageManager pm, int parentUserId, int managedProfileUserId) {
36        ProvisionLogger.logd("Setting cross-profile intent filters");
37
38        // Voicemail scheme, phone/call related MIME types and emergency/priviledged calls are sent
39        // directly to the parent user.
40        IntentFilter mimeTypeTelephony = new IntentFilter();
41        mimeTypeTelephony.addAction(Intent.ACTION_DIAL);
42        mimeTypeTelephony.addAction(Intent.ACTION_VIEW);
43        mimeTypeTelephony.addAction(Intent.ACTION_CALL_EMERGENCY);
44        mimeTypeTelephony.addAction(Intent.ACTION_CALL_PRIVILEGED);
45        mimeTypeTelephony.addCategory(Intent.CATEGORY_DEFAULT);
46        mimeTypeTelephony.addCategory(Intent.CATEGORY_BROWSABLE);
47        try {
48            mimeTypeTelephony.addDataType("vnd.android.cursor.item/phone");
49            mimeTypeTelephony.addDataType("vnd.android.cursor.item/phone_v2");
50            mimeTypeTelephony.addDataType("vnd.android.cursor.item/person");
51            mimeTypeTelephony.addDataType("vnd.android.cursor.dir/calls");
52            mimeTypeTelephony.addDataType("vnd.android.cursor.item/calls");
53        } catch (IntentFilter.MalformedMimeTypeException e) {
54            //will not happen
55        }
56        pm.addCrossProfileIntentFilter(mimeTypeTelephony, managedProfileUserId, parentUserId,
57                PackageManager.SKIP_CURRENT_PROFILE);
58
59        IntentFilter callEmergency = new IntentFilter();
60        callEmergency.addAction(Intent.ACTION_CALL_EMERGENCY);
61        callEmergency.addAction(Intent.ACTION_CALL_PRIVILEGED);
62        callEmergency.addCategory(Intent.CATEGORY_DEFAULT);
63        callEmergency.addCategory(Intent.CATEGORY_BROWSABLE);
64        callEmergency.addDataScheme("tel");
65        callEmergency.addDataScheme("sip");
66        callEmergency.addDataScheme("voicemail");
67        pm.addCrossProfileIntentFilter(callEmergency, managedProfileUserId, parentUserId,
68                PackageManager.SKIP_CURRENT_PROFILE);
69
70        IntentFilter callVoicemail = new IntentFilter();
71        callVoicemail.addAction(Intent.ACTION_DIAL);
72        callVoicemail.addAction(Intent.ACTION_CALL);
73        callVoicemail.addAction(Intent.ACTION_VIEW);
74        callVoicemail.addCategory(Intent.CATEGORY_DEFAULT);
75        callVoicemail.addCategory(Intent.CATEGORY_BROWSABLE);
76        callVoicemail.addDataScheme("voicemail");
77        pm.addCrossProfileIntentFilter(callVoicemail, managedProfileUserId, parentUserId,
78                PackageManager.SKIP_CURRENT_PROFILE);
79
80        // Let VoIP apps from the managed profile handle tel: and sip: schemes (except emergency)
81        // and call button intents.
82        IntentFilter callDial = new IntentFilter();
83        callDial.addAction(Intent.ACTION_DIAL);
84        callDial.addAction(Intent.ACTION_CALL);
85        callDial.addAction(Intent.ACTION_VIEW);
86        callDial.addCategory(Intent.CATEGORY_DEFAULT);
87        callDial.addCategory(Intent.CATEGORY_BROWSABLE);
88        callDial.addDataScheme("tel");
89        callDial.addDataScheme("sip");
90        pm.addCrossProfileIntentFilter(callDial, managedProfileUserId, parentUserId, 0);
91
92        IntentFilter callButton = new IntentFilter();
93        callButton.addAction(Intent.ACTION_CALL_BUTTON);
94        callButton.addCategory(Intent.CATEGORY_DEFAULT);
95        pm.addCrossProfileIntentFilter(callButton, managedProfileUserId, parentUserId, 0);
96
97        IntentFilter callDialNoData = new IntentFilter();
98        callDialNoData.addAction(Intent.ACTION_DIAL);
99        callDialNoData.addAction(Intent.ACTION_CALL);
100        callDialNoData.addCategory(Intent.CATEGORY_DEFAULT);
101        callDialNoData.addCategory(Intent.CATEGORY_BROWSABLE);
102        pm.addCrossProfileIntentFilter(callDialNoData, managedProfileUserId, parentUserId,
103                PackageManager.SKIP_CURRENT_PROFILE);
104
105        IntentFilter smsMms = new IntentFilter();
106        smsMms.addAction(Intent.ACTION_VIEW);
107        smsMms.addAction(Intent.ACTION_SENDTO);
108        smsMms.addCategory(Intent.CATEGORY_DEFAULT);
109        smsMms.addCategory(Intent.CATEGORY_BROWSABLE);
110        smsMms.addDataScheme("sms");
111        smsMms.addDataScheme("smsto");
112        smsMms.addDataScheme("mms");
113        smsMms.addDataScheme("mmsto");
114        pm.addCrossProfileIntentFilter(smsMms, managedProfileUserId, parentUserId,
115                PackageManager.SKIP_CURRENT_PROFILE);
116
117        IntentFilter mobileNetworkSettings = new IntentFilter();
118        mobileNetworkSettings.addAction(android.provider.Settings.ACTION_DATA_ROAMING_SETTINGS);
119        mobileNetworkSettings.addAction(android.provider.Settings.ACTION_NETWORK_OPERATOR_SETTINGS);
120        mobileNetworkSettings.addCategory(Intent.CATEGORY_DEFAULT);
121        pm.addCrossProfileIntentFilter(mobileNetworkSettings, managedProfileUserId,
122                parentUserId, PackageManager.SKIP_CURRENT_PROFILE);
123
124        IntentFilter home = new IntentFilter();
125        home.addAction(Intent.ACTION_MAIN);
126        home.addCategory(Intent.CATEGORY_DEFAULT);
127        home.addCategory(Intent.CATEGORY_HOME);
128        pm.addCrossProfileIntentFilter(home, managedProfileUserId, parentUserId,
129                PackageManager.SKIP_CURRENT_PROFILE);
130
131        IntentFilter send = new IntentFilter();
132        send.addAction(Intent.ACTION_SEND);
133        send.addAction(Intent.ACTION_SEND_MULTIPLE);
134        send.addCategory(Intent.CATEGORY_DEFAULT);
135        try {
136            send.addDataType("*/*");
137        } catch (IntentFilter.MalformedMimeTypeException e) {
138            //will not happen
139        }
140        // This is the only filter set on the opposite direction (from parent to managed profile).
141        pm.addCrossProfileIntentFilter(send, parentUserId, managedProfileUserId, 0);
142
143        IntentFilter getContent = new IntentFilter();
144        getContent.addAction(Intent.ACTION_GET_CONTENT);
145        getContent.addCategory(Intent.CATEGORY_DEFAULT);
146        getContent.addCategory(Intent.CATEGORY_OPENABLE);
147        try {
148            getContent.addDataType("*/*");
149        } catch (IntentFilter.MalformedMimeTypeException e) {
150            //will not happen
151        }
152        pm.addCrossProfileIntentFilter(getContent, managedProfileUserId, parentUserId, 0);
153
154        IntentFilter openDocument = new IntentFilter();
155        openDocument.addAction(Intent.ACTION_OPEN_DOCUMENT);
156        openDocument.addCategory(Intent.CATEGORY_DEFAULT);
157        openDocument.addCategory(Intent.CATEGORY_OPENABLE);
158        try {
159            openDocument.addDataType("*/*");
160        } catch (IntentFilter.MalformedMimeTypeException e) {
161            //will not happen
162        }
163        pm.addCrossProfileIntentFilter(openDocument, managedProfileUserId, parentUserId, 0);
164
165        IntentFilter pick = new IntentFilter();
166        pick.addAction(Intent.ACTION_PICK);
167        pick.addCategory(Intent.CATEGORY_DEFAULT);
168        try {
169            pick.addDataType("*/*");
170        } catch (IntentFilter.MalformedMimeTypeException e) {
171            //will not happen
172        }
173        pm.addCrossProfileIntentFilter(pick, managedProfileUserId, parentUserId, 0);
174
175        IntentFilter pickNoData = new IntentFilter();
176        pickNoData.addAction(Intent.ACTION_PICK);
177        pickNoData.addCategory(Intent.CATEGORY_DEFAULT);
178        pm.addCrossProfileIntentFilter(pickNoData, managedProfileUserId,
179                parentUserId, 0);
180
181        IntentFilter recognizeSpeech = new IntentFilter();
182        recognizeSpeech.addAction(ACTION_RECOGNIZE_SPEECH);
183        recognizeSpeech.addCategory(Intent.CATEGORY_DEFAULT);
184        pm.addCrossProfileIntentFilter(recognizeSpeech, managedProfileUserId, parentUserId, 0);
185
186        IntentFilter capture = new IntentFilter();
187        capture.addAction(MediaStore.ACTION_IMAGE_CAPTURE);
188        capture.addAction(MediaStore.ACTION_IMAGE_CAPTURE_SECURE);
189        capture.addAction(MediaStore.ACTION_VIDEO_CAPTURE);
190        capture.addAction(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA);
191        capture.addAction(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA_SECURE);
192        capture.addAction(MediaStore.INTENT_ACTION_VIDEO_CAMERA);
193        capture.addCategory(Intent.CATEGORY_DEFAULT);
194        pm.addCrossProfileIntentFilter(capture, managedProfileUserId, parentUserId, 0);
195    }
196}
197