blob: 7a3f030f9dd7234c33cfb681c0ab47ee4a77cd11 [file] [log] [blame]
Santos Cordon5d2c1e62014-11-21 15:20:15 -08001/*
2 * Copyright (C) 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 */
16
17package com.android.server.telecom;
18
Sailesh Nepalcf855622015-07-28 19:22:14 -070019import android.content.BroadcastReceiver;
Santos Cordon5d2c1e62014-11-21 15:20:15 -080020import android.content.ComponentName;
21import android.content.Context;
22import android.content.Intent;
Sailesh Nepalcf855622015-07-28 19:22:14 -070023import android.content.IntentFilter;
Santos Cordon5d2c1e62014-11-21 15:20:15 -080024import android.content.ServiceConnection;
Svetoslavcdfd2302015-06-25 19:07:31 -070025import android.database.ContentObserver;
26import android.net.Uri;
27import android.os.Handler;
Santos Cordon5d2c1e62014-11-21 15:20:15 -080028import android.os.IBinder;
Svetoslavcdfd2302015-06-25 19:07:31 -070029import android.os.Looper;
Santos Cordon5d2c1e62014-11-21 15:20:15 -080030import android.os.RemoteException;
31import android.os.ServiceManager;
32import android.os.UserHandle;
Svetoslavcdfd2302015-06-25 19:07:31 -070033import android.provider.Settings;
34import android.telecom.DefaultDialerManager;
Sailesh Nepalcf855622015-07-28 19:22:14 -070035import android.telecom.PhoneAccountHandle;
36import android.telecom.TelecomManager;
37import android.telephony.CarrierConfigManager;
Svetoslava5a0d942015-07-01 19:49:58 -070038import android.util.IntArray;
Santos Cordon5d2c1e62014-11-21 15:20:15 -080039import android.util.Slog;
40
Svetoslava5a0d942015-07-01 19:49:58 -070041import com.android.internal.annotations.GuardedBy;
Svetoslavcdfd2302015-06-25 19:07:31 -070042import com.android.internal.telephony.SmsApplication;
43import com.android.server.LocalServices;
Santos Cordon5d2c1e62014-11-21 15:20:15 -080044import com.android.server.SystemService;
Sailesh Nepalcf855622015-07-28 19:22:14 -070045import com.android.server.pm.UserManagerService;
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +000046import com.android.server.pm.permission.DefaultPermissionGrantPolicy;
47import com.android.server.pm.permission.PermissionManagerInternal;
Santos Cordon5d2c1e62014-11-21 15:20:15 -080048
49/**
50 * Starts the telecom component by binding to its ITelecomService implementation. Telecom is setup
51 * to run in the system-server process so once it is loaded into memory it will stay running.
52 * @hide
53 */
54public class TelecomLoaderService extends SystemService {
55 private static final String TAG = "TelecomLoaderService";
56
57 private class TelecomServiceConnection implements ServiceConnection {
58 @Override
59 public void onServiceConnected(ComponentName name, IBinder service) {
60 // Normally, we would listen for death here, but since telecom runs in the same process
61 // as this loader (process="system") thats redundant here.
62 try {
63 service.linkToDeath(new IBinder.DeathRecipient() {
64 @Override
65 public void binderDied() {
66 connectToTelecom();
67 }
68 }, 0);
Svetoslavcdfd2302015-06-25 19:07:31 -070069 SmsApplication.getDefaultMmsApplication(mContext, false);
Santos Cordon5d2c1e62014-11-21 15:20:15 -080070 ServiceManager.addService(Context.TELECOM_SERVICE, service);
Svetoslava5a0d942015-07-01 19:49:58 -070071
72 synchronized (mLock) {
Sailesh Nepalcf855622015-07-28 19:22:14 -070073 if (mDefaultSmsAppRequests != null || mDefaultDialerAppRequests != null
74 || mDefaultSimCallManagerRequests != null) {
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +000075 final DefaultPermissionGrantPolicy permissionPolicy =
76 getDefaultPermissionGrantPolicy();
Svetoslava5a0d942015-07-01 19:49:58 -070077
78 if (mDefaultSmsAppRequests != null) {
79 ComponentName smsComponent = SmsApplication.getDefaultSmsApplication(
80 mContext, true);
81 if (smsComponent != null) {
82 final int requestCount = mDefaultSmsAppRequests.size();
83 for (int i = requestCount - 1; i >= 0; i--) {
84 final int userid = mDefaultSmsAppRequests.get(i);
85 mDefaultSmsAppRequests.remove(i);
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +000086 permissionPolicy.grantDefaultPermissionsToDefaultSmsApp(
Svetoslava5a0d942015-07-01 19:49:58 -070087 smsComponent.getPackageName(), userid);
88 }
89 }
90 }
91
92 if (mDefaultDialerAppRequests != null) {
93 String packageName = DefaultDialerManager.getDefaultDialerApplication(
94 mContext);
95 if (packageName != null) {
96 final int requestCount = mDefaultDialerAppRequests.size();
97 for (int i = requestCount - 1; i >= 0; i--) {
98 final int userId = mDefaultDialerAppRequests.get(i);
99 mDefaultDialerAppRequests.remove(i);
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000100 permissionPolicy.grantDefaultPermissionsToDefaultDialerApp(
Svetoslava5a0d942015-07-01 19:49:58 -0700101 packageName, userId);
102 }
103 }
104 }
Sailesh Nepalcf855622015-07-28 19:22:14 -0700105 if (mDefaultSimCallManagerRequests != null) {
106 TelecomManager telecomManager =
107 (TelecomManager) mContext.getSystemService(Context.TELECOM_SERVICE);
108 PhoneAccountHandle phoneAccount = telecomManager.getSimCallManager();
109 if (phoneAccount != null) {
110 final int requestCount = mDefaultSimCallManagerRequests.size();
111 final String packageName =
112 phoneAccount.getComponentName().getPackageName();
113 for (int i = requestCount - 1; i >= 0; i--) {
114 final int userId = mDefaultSimCallManagerRequests.get(i);
115 mDefaultSimCallManagerRequests.remove(i);
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000116 permissionPolicy
Sailesh Nepalcf855622015-07-28 19:22:14 -0700117 .grantDefaultPermissionsToDefaultSimCallManager(
118 packageName, userId);
119 }
120 }
121 }
Svetoslava5a0d942015-07-01 19:49:58 -0700122 }
123 }
Santos Cordon5d2c1e62014-11-21 15:20:15 -0800124 } catch (RemoteException e) {
125 Slog.w(TAG, "Failed linking to death.");
126 }
127 }
128
129 @Override
130 public void onServiceDisconnected(ComponentName name) {
131 connectToTelecom();
132 }
133 }
134
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000135 private DefaultPermissionGrantPolicy getDefaultPermissionGrantPolicy() {
136 return LocalServices.getService(PermissionManagerInternal.class)
137 .getDefaultPermissionGrantPolicy();
138 }
139
Santos Cordon5d2c1e62014-11-21 15:20:15 -0800140 private static final ComponentName SERVICE_COMPONENT = new ComponentName(
141 "com.android.server.telecom",
Ihab Awadc4959ab2015-02-06 17:01:49 -0800142 "com.android.server.telecom.components.TelecomService");
Santos Cordon5d2c1e62014-11-21 15:20:15 -0800143
144 private static final String SERVICE_ACTION = "com.android.ITelecomService";
145
Svetoslava5a0d942015-07-01 19:49:58 -0700146 private final Object mLock = new Object();
147
148 @GuardedBy("mLock")
149 private IntArray mDefaultSmsAppRequests;
150
151 @GuardedBy("mLock")
152 private IntArray mDefaultDialerAppRequests;
153
Sailesh Nepalcf855622015-07-28 19:22:14 -0700154 @GuardedBy("mLock")
155 private IntArray mDefaultSimCallManagerRequests;
156
Santos Cordon5d2c1e62014-11-21 15:20:15 -0800157 private final Context mContext;
Svetoslava5a0d942015-07-01 19:49:58 -0700158
159 @GuardedBy("mLock")
Santos Cordon5d2c1e62014-11-21 15:20:15 -0800160 private TelecomServiceConnection mServiceConnection;
161
162 public TelecomLoaderService(Context context) {
163 super(context);
164 mContext = context;
Svetoslavcdfd2302015-06-25 19:07:31 -0700165 registerDefaultAppProviders();
Santos Cordon5d2c1e62014-11-21 15:20:15 -0800166 }
167
168 @Override
169 public void onStart() {
170 }
171
172 @Override
173 public void onBootPhase(int phase) {
174 if (phase == PHASE_ACTIVITY_MANAGER_READY) {
Svetoslavcdfd2302015-06-25 19:07:31 -0700175 registerDefaultAppNotifier();
Sailesh Nepalcf855622015-07-28 19:22:14 -0700176 registerCarrierConfigChangedReceiver();
Santos Cordon5d2c1e62014-11-21 15:20:15 -0800177 connectToTelecom();
178 }
179 }
180
181 private void connectToTelecom() {
Svetoslava5a0d942015-07-01 19:49:58 -0700182 synchronized (mLock) {
183 if (mServiceConnection != null) {
184 // TODO: Is unbinding worth doing or wait for system to rebind?
185 mContext.unbindService(mServiceConnection);
186 mServiceConnection = null;
187 }
Santos Cordon5d2c1e62014-11-21 15:20:15 -0800188
Svetoslava5a0d942015-07-01 19:49:58 -0700189 TelecomServiceConnection serviceConnection = new TelecomServiceConnection();
190 Intent intent = new Intent(SERVICE_ACTION);
191 intent.setComponent(SERVICE_COMPONENT);
192 int flags = Context.BIND_IMPORTANT | Context.BIND_FOREGROUND_SERVICE
193 | Context.BIND_AUTO_CREATE;
Santos Cordon5d2c1e62014-11-21 15:20:15 -0800194
Svetoslava5a0d942015-07-01 19:49:58 -0700195 // Bind to Telecom and register the service
Xiaohui Chene4de5a02015-09-22 15:33:31 -0700196 if (mContext.bindServiceAsUser(intent, serviceConnection, flags, UserHandle.SYSTEM)) {
Svetoslava5a0d942015-07-01 19:49:58 -0700197 mServiceConnection = serviceConnection;
198 }
Santos Cordon5d2c1e62014-11-21 15:20:15 -0800199 }
200 }
Svetoslavcdfd2302015-06-25 19:07:31 -0700201
Svetoslava5a0d942015-07-01 19:49:58 -0700202
Svetoslavcdfd2302015-06-25 19:07:31 -0700203 private void registerDefaultAppProviders() {
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000204 final DefaultPermissionGrantPolicy permissionPolicy = getDefaultPermissionGrantPolicy();
Svetoslavcdfd2302015-06-25 19:07:31 -0700205
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000206 // Set a callback for the permission grant policy to query the default sms app.
207 permissionPolicy.setSmsAppPackagesProvider(userId -> {
208 synchronized (mLock) {
209 if (mServiceConnection == null) {
210 if (mDefaultSmsAppRequests == null) {
211 mDefaultSmsAppRequests = new IntArray();
Svetoslava5a0d942015-07-01 19:49:58 -0700212 }
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000213 mDefaultSmsAppRequests.add(userId);
214 return null;
Svetoslava5a0d942015-07-01 19:49:58 -0700215 }
Svetoslavcdfd2302015-06-25 19:07:31 -0700216 }
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000217 ComponentName smsComponent = SmsApplication.getDefaultSmsApplication(
218 mContext, true);
219 if (smsComponent != null) {
220 return new String[]{smsComponent.getPackageName()};
221 }
222 return null;
Svetoslavcdfd2302015-06-25 19:07:31 -0700223 });
224
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000225 // Set a callback for the permission grant policy to query the default dialer app.
226 permissionPolicy.setDialerAppPackagesProvider(userId -> {
227 synchronized (mLock) {
228 if (mServiceConnection == null) {
229 if (mDefaultDialerAppRequests == null) {
230 mDefaultDialerAppRequests = new IntArray();
Svetoslava5a0d942015-07-01 19:49:58 -0700231 }
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000232 mDefaultDialerAppRequests.add(userId);
233 return null;
Svetoslava5a0d942015-07-01 19:49:58 -0700234 }
Svetoslavcdfd2302015-06-25 19:07:31 -0700235 }
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000236 String packageName = DefaultDialerManager.getDefaultDialerApplication(mContext);
237 if (packageName != null) {
238 return new String[]{packageName};
239 }
240 return null;
Svetoslavcdfd2302015-06-25 19:07:31 -0700241 });
Sailesh Nepalcf855622015-07-28 19:22:14 -0700242
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000243 // Set a callback for the permission grant policy to query the default sim call manager.
244 permissionPolicy.setSimCallManagerPackagesProvider(userId -> {
245 synchronized (mLock) {
246 if (mServiceConnection == null) {
247 if (mDefaultSimCallManagerRequests == null) {
248 mDefaultSimCallManagerRequests = new IntArray();
Sailesh Nepalcf855622015-07-28 19:22:14 -0700249 }
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000250 mDefaultSimCallManagerRequests.add(userId);
251 return null;
Sailesh Nepalcf855622015-07-28 19:22:14 -0700252 }
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000253 }
254 TelecomManager telecomManager =
Sailesh Nepalcf855622015-07-28 19:22:14 -0700255 (TelecomManager) mContext.getSystemService(Context.TELECOM_SERVICE);
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000256 PhoneAccountHandle phoneAccount = telecomManager.getSimCallManager(userId);
257 if (phoneAccount != null) {
258 return new String[]{phoneAccount.getComponentName().getPackageName()};
Sailesh Nepalcf855622015-07-28 19:22:14 -0700259 }
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000260 return null;
Sailesh Nepalcf855622015-07-28 19:22:14 -0700261 });
Svetoslavcdfd2302015-06-25 19:07:31 -0700262 }
263
264 private void registerDefaultAppNotifier() {
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000265 final DefaultPermissionGrantPolicy permissionPolicy = getDefaultPermissionGrantPolicy();
Svetoslavcdfd2302015-06-25 19:07:31 -0700266
267 // Notify the package manager on default app changes
268 final Uri defaultSmsAppUri = Settings.Secure.getUriFor(
269 Settings.Secure.SMS_DEFAULT_APPLICATION);
270 final Uri defaultDialerAppUri = Settings.Secure.getUriFor(
271 Settings.Secure.DIALER_DEFAULT_APPLICATION);
272
273 ContentObserver contentObserver = new ContentObserver(
274 new Handler(Looper.getMainLooper())) {
275 @Override
276 public void onChange(boolean selfChange, Uri uri, int userId) {
277 if (defaultSmsAppUri.equals(uri)) {
278 ComponentName smsComponent = SmsApplication.getDefaultSmsApplication(
279 mContext, true);
280 if (smsComponent != null) {
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000281 permissionPolicy.grantDefaultPermissionsToDefaultSmsApp(
Svetoslavcdfd2302015-06-25 19:07:31 -0700282 smsComponent.getPackageName(), userId);
283 }
284 } else if (defaultDialerAppUri.equals(uri)) {
285 String packageName = DefaultDialerManager.getDefaultDialerApplication(
286 mContext);
287 if (packageName != null) {
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000288 permissionPolicy.grantDefaultPermissionsToDefaultDialerApp(
Svetoslavcdfd2302015-06-25 19:07:31 -0700289 packageName, userId);
290 }
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000291 updateSimCallManagerPermissions(permissionPolicy, userId);
Svetoslavcdfd2302015-06-25 19:07:31 -0700292 }
293 }
294 };
295
296 mContext.getContentResolver().registerContentObserver(defaultSmsAppUri,
297 false, contentObserver, UserHandle.USER_ALL);
298 mContext.getContentResolver().registerContentObserver(defaultDialerAppUri,
299 false, contentObserver, UserHandle.USER_ALL);
300 }
Sailesh Nepalcf855622015-07-28 19:22:14 -0700301
302
303 private void registerCarrierConfigChangedReceiver() {
Sailesh Nepalcf855622015-07-28 19:22:14 -0700304 BroadcastReceiver receiver = new BroadcastReceiver() {
305 @Override
306 public void onReceive(Context context, Intent intent) {
307 if (intent.getAction().equals(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED)) {
308 for (int userId : UserManagerService.getInstance().getUserIds()) {
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000309 updateSimCallManagerPermissions(getDefaultPermissionGrantPolicy(), userId);
Sailesh Nepalcf855622015-07-28 19:22:14 -0700310 }
311 }
312 }
313 };
314
315 mContext.registerReceiverAsUser(receiver, UserHandle.ALL,
316 new IntentFilter(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED), null, null);
317 }
318
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000319 private void updateSimCallManagerPermissions(
320 DefaultPermissionGrantPolicy permissionGrantPolicy, int userId) {
Sailesh Nepalcf855622015-07-28 19:22:14 -0700321 TelecomManager telecomManager =
322 (TelecomManager) mContext.getSystemService(Context.TELECOM_SERVICE);
323 PhoneAccountHandle phoneAccount = telecomManager.getSimCallManager(userId);
324 if (phoneAccount != null) {
325 Slog.i(TAG, "updating sim call manager permissions for userId:" + userId);
326 String packageName = phoneAccount.getComponentName().getPackageName();
Philip P. Moltmannb0be05c2018-09-19 02:46:56 +0000327 permissionGrantPolicy.grantDefaultPermissionsToDefaultSimCallManager(
Sailesh Nepalcf855622015-07-28 19:22:14 -0700328 packageName, userId);
329 }
330 }
Santos Cordon5d2c1e62014-11-21 15:20:15 -0800331}