TelephonyRegistry.java revision ba87e3e6c985e7175152993b5efcc7dd2f0e1c93
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage com.android.server; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PackageManager; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Binder; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteException; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.telephony.CellLocation; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.telephony.PhoneStateListener; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.telephony.ServiceState; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.telephony.TelephonyManager; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.TextUtils; 31ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Projectimport android.util.Log; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileDescriptor; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.PrintWriter; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.app.IBatteryStats; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.telephony.ITelephonyRegistry; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.telephony.IPhoneStateListener; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.telephony.DefaultPhoneNotifier; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.telephony.Phone; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.telephony.PhoneStateIntentReceiver; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.telephony.TelephonyIntents; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.server.am.BatteryStatsService; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Since phone process can be restarted, this class provides a centralized 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * place that applications can register and be called back from. 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass TelephonyRegistry extends ITelephonyRegistry.Stub { 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String TAG = "TelephonyRegistry"; 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static class Record { 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String pkgForDebug; 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder binder; 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IPhoneStateListener callback; 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int events; 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final Context mContext; 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final ArrayList<Record> mRecords = new ArrayList(); 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final IBatteryStats mBatteryStats; 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mCallState = TelephonyManager.CALL_STATE_IDLE; 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String mCallIncomingNumber = ""; 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private ServiceState mServiceState = new ServiceState(); 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mSignalStrength = -1; 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mMessageWaiting = false; 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mCallForwarding = false; 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mDataActivity = TelephonyManager.DATA_ACTIVITY_NONE; 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mDataConnectionState = TelephonyManager.DATA_CONNECTED; 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mDataConnectionPossible = false; 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String mDataConnectionReason = ""; 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String mDataConnectionApn = ""; 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String mDataConnectionInterfaceName = ""; 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Bundle mCellLocation = new Bundle(); 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // we keep a copy of all of the sate so we can send it out when folks register for it 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // In these calls we call with the lock held. This is safe becasuse remote 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // calls go through a oneway interface and local calls going through a handler before 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // they get to app code. 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TelephonyRegistry(Context context) { 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CellLocation.getEmpty().fillInNotifierBundle(mCellLocation); 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext = context; 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBatteryStats = BatteryStatsService.getService(); 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void listen(String pkgForDebug, IPhoneStateListener callback, int events, 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean notifyNow) { 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //Log.d(TAG, "listen pkg=" + pkgForDebug + " events=0x" + Integer.toHexString(events)); 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (events != 0) { 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // check permissions 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((events & PhoneStateListener.LISTEN_CELL_LOCATION) != 0) { 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext.enforceCallingOrSelfPermission( 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android.Manifest.permission.ACCESS_COARSE_LOCATION, null); 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mRecords) { 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // register 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Record r = null; 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project find_and_add: { 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder b = callback.asBinder(); 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = mRecords.size(); 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r = mRecords.get(i); 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (b == r.binder) { 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break find_and_add; 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r = new Record(); 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.binder = b; 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.callback = callback; 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.pkgForDebug = pkgForDebug; 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecords.add(r); 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int send = events & (events ^ r.events); 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.events = events; 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (notifyNow) { 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((events & PhoneStateListener.LISTEN_SERVICE_STATE) != 0) { 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sendServiceState(r, mServiceState); 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((events & PhoneStateListener.LISTEN_SIGNAL_STRENGTH) != 0) { 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.callback.onSignalStrengthChanged(mSignalStrength); 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException ex) { 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remove(r.binder); 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((events & PhoneStateListener.LISTEN_MESSAGE_WAITING_INDICATOR) != 0) { 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.callback.onMessageWaitingIndicatorChanged(mMessageWaiting); 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException ex) { 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remove(r.binder); 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((events & PhoneStateListener.LISTEN_CALL_FORWARDING_INDICATOR) != 0) { 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.callback.onCallForwardingIndicatorChanged(mCallForwarding); 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException ex) { 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remove(r.binder); 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((events & PhoneStateListener.LISTEN_CELL_LOCATION) != 0) { 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sendCellLocation(r, mCellLocation); 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((events & PhoneStateListener.LISTEN_CALL_STATE) != 0) { 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.callback.onCallStateChanged(mCallState, mCallIncomingNumber); 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException ex) { 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remove(r.binder); 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((events & PhoneStateListener.LISTEN_DATA_CONNECTION_STATE) != 0) { 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.callback.onDataConnectionStateChanged(mDataConnectionState); 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException ex) { 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remove(r.binder); 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((events & PhoneStateListener.LISTEN_DATA_ACTIVITY) != 0) { 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.callback.onDataActivity(mDataActivity); 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException ex) { 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remove(r.binder); 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remove(callback.asBinder()); 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void remove(IBinder binder) { 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mRecords) { 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = mRecords.size(); 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mRecords.get(i).binder == binder) { 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecords.remove(i); 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void notifyCallState(int state, String incomingNumber) { 191ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project if (!checkPhoneStatePermission("notifyCallState()")) { 192ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project return; 193ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mRecords) { 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCallState = state; 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCallIncomingNumber = incomingNumber; 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = mRecords.size(); 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=N-1; i>=0; i--) { 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Record r = mRecords.get(i); 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((r.events & PhoneStateListener.LISTEN_CALL_STATE) != 0) { 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.callback.onCallStateChanged(state, incomingNumber); 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException ex) { 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remove(r.binder); 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project broadcastCallStateChanged(state, incomingNumber); 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void notifyServiceState(ServiceState state) { 213ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project if (!checkPhoneStatePermission("notifyServiceState()")) { 214ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project return; 215ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mRecords) { 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mServiceState = state; 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = mRecords.size(); 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=N-1; i>=0; i--) { 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Record r = mRecords.get(i); 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((r.events & PhoneStateListener.LISTEN_SERVICE_STATE) != 0) { 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sendServiceState(r, state); 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project broadcastServiceStateChanged(state); 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void notifySignalStrength(int signalStrengthASU) { 230ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project if (!checkPhoneStatePermission("notifySignalStrength()")) { 231ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project return; 232ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mRecords) { 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSignalStrength = signalStrengthASU; 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = mRecords.size(); 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=N-1; i>=0; i--) { 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Record r = mRecords.get(i); 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((r.events & PhoneStateListener.LISTEN_SIGNAL_STRENGTH) != 0) { 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.callback.onSignalStrengthChanged(signalStrengthASU); 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException ex) { 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remove(r.binder); 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project broadcastSignalStrengthChanged(signalStrengthASU); 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void notifyMessageWaitingChanged(boolean mwi) { 251ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project if (!checkPhoneStatePermission("notifyMessageWaitingChanged()")) { 252ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project return; 253ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mRecords) { 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMessageWaiting = mwi; 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = mRecords.size(); 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=N-1; i>=0; i--) { 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Record r = mRecords.get(i); 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((r.events & PhoneStateListener.LISTEN_MESSAGE_WAITING_INDICATOR) != 0) { 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.callback.onMessageWaitingIndicatorChanged(mwi); 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException ex) { 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remove(r.binder); 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void notifyCallForwardingChanged(boolean cfi) { 271ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project if (!checkPhoneStatePermission("notifyCallForwardingChanged()")) { 272ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project return; 273ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mRecords) { 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCallForwarding = cfi; 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = mRecords.size(); 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=N-1; i>=0; i--) { 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Record r = mRecords.get(i); 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((r.events & PhoneStateListener.LISTEN_CALL_FORWARDING_INDICATOR) != 0) { 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.callback.onCallForwardingIndicatorChanged(cfi); 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException ex) { 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remove(r.binder); 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void notifyDataActivity(int state) { 291ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project if (!checkPhoneStatePermission("notifyDataActivity()")) { 292ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project return; 293ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mRecords) { 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDataActivity = state; 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = mRecords.size(); 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=N-1; i>=0; i--) { 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Record r = mRecords.get(i); 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((r.events & PhoneStateListener.LISTEN_DATA_ACTIVITY) != 0) { 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.callback.onDataActivity(state); 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException ex) { 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remove(r.binder); 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void notifyDataConnection(int state, boolean isDataConnectivityPissible, 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String reason, String apn, String interfaceName) { 312ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project if (!checkPhoneStatePermission("notifyDataConnection()")) { 313ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project return; 314ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mRecords) { 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDataConnectionState = state; 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDataConnectionPossible = isDataConnectivityPissible; 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDataConnectionReason = reason; 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDataConnectionApn = apn; 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDataConnectionInterfaceName = interfaceName; 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = mRecords.size(); 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=N-1; i>=0; i--) { 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Record r = mRecords.get(i); 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((r.events & PhoneStateListener.LISTEN_DATA_CONNECTION_STATE) != 0) { 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.callback.onDataConnectionStateChanged(state); 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException ex) { 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remove(r.binder); 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project broadcastDataConnectionStateChanged(state, isDataConnectivityPissible, 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project reason, apn, interfaceName); 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void notifyDataConnectionFailed(String reason) { 338ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project if (!checkPhoneStatePermission("notifyDataConnectionFailed()")) { 339ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project return; 340ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is commented out because there is on onDataConnectionFailed callback 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * on PhoneStateListener. There should be. 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mRecords) { 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDataConnectionFailedReason = reason; 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = mRecords.size(); 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=N-1; i>=0; i--) { 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Record r = mRecords.get(i); 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((r.events & PhoneStateListener.LISTEN_DATA_CONNECTION_FAILED) != 0) { 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // XXX 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project broadcastDataConnectionFailed(reason); 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void notifyCellLocation(Bundle cellLocation) { 359ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project if (!checkPhoneStatePermission("notifyCellLocation()")) { 360ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project return; 361ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mRecords) { 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCellLocation = cellLocation; 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = mRecords.size(); 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=N-1; i>=0; i--) { 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Record r = mRecords.get(i); 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((r.events & PhoneStateListener.LISTEN_CELL_LOCATION) != 0) { 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sendCellLocation(r, cellLocation); 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the new callback broadcasting 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // copy the service state object so they can't mess it up in the local calls 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void sendServiceState(Record r, ServiceState state) { 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.callback.onServiceStateChanged(new ServiceState(state)); 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException ex) { 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remove(r.binder); 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void sendCellLocation(Record r, Bundle cellLocation) { 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.callback.onCellLocationChanged(new Bundle(cellLocation)); 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException ex) { 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remove(r.binder); 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP) 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project != PackageManager.PERMISSION_GRANTED) { 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println("Permission Denial: can't dump telephony.registry from from pid=" 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Binder.getCallingPid() 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ", uid=" + Binder.getCallingUid()); 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mRecords) { 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = mRecords.size(); 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println("last known state:"); 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" mCallState=" + mCallState); 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" mCallIncomingNumber=" + mCallIncomingNumber); 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" mServiceState=" + mServiceState); 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" mSignalStrength=" + mSignalStrength); 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" mMessageWaiting=" + mMessageWaiting); 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" mCallForwarding=" + mCallForwarding); 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" mDataActivity=" + mDataActivity); 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" mDataConnectionState=" + mDataConnectionState); 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" mDataConnectionPossible=" + mDataConnectionPossible); 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" mDataConnectionReason=" + mDataConnectionReason); 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" mDataConnectionApn=" + mDataConnectionApn); 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" mDataConnectionInterfaceName=" + mDataConnectionInterfaceName); 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" mCellLocation=" + mCellLocation); 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println("registrations: count=" + N); 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Record r = mRecords.get(i); 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" " + r.pkgForDebug + " 0x" + Integer.toHexString(r.events)); 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the legacy intent broadcasting 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void broadcastServiceStateChanged(ServiceState state) { 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent intent = new Intent(TelephonyIntents.ACTION_SERVICE_STATE_CHANGED); 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Bundle data = new Bundle(); 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project state.fillInNotifierBundle(data); 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent.putExtras(data); 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext.sendStickyBroadcast(intent); 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void broadcastSignalStrengthChanged(int asu) { 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent intent = new Intent(TelephonyIntents.ACTION_SIGNAL_STRENGTH_CHANGED); 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent.putExtra(PhoneStateIntentReceiver.INTENT_KEY_ASU, asu); 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext.sendStickyBroadcast(intent); 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void broadcastCallStateChanged(int state, String incomingNumber) { 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long ident = Binder.clearCallingIdentity(); 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (state == TelephonyManager.CALL_STATE_IDLE) { 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBatteryStats.notePhoneOff(); 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBatteryStats.notePhoneOn(); 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(ident); 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent intent = new Intent(TelephonyManager.ACTION_PHONE_STATE_CHANGED); 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent.putExtra(Phone.STATE_KEY, 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DefaultPhoneNotifier.convertCallState(state).toString()); 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!TextUtils.isEmpty(incomingNumber)) { 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent.putExtra(TelephonyManager.EXTRA_INCOMING_NUMBER, incomingNumber); 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext.sendBroadcast(intent, android.Manifest.permission.READ_PHONE_STATE); 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void broadcastDataConnectionStateChanged(int state, boolean isDataConnectivityPossible, 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String reason, String apn, String interfaceName) { 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent intent = new Intent(TelephonyIntents.ACTION_ANY_DATA_CONNECTION_STATE_CHANGED); 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent.putExtra(Phone.STATE_KEY, DefaultPhoneNotifier.convertDataState(state).toString()); 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!isDataConnectivityPossible) { 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent.putExtra(Phone.NETWORK_UNAVAILABLE_KEY, true); 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (reason != null) { 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent.putExtra(Phone.STATE_CHANGE_REASON_KEY, reason); 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent.putExtra(Phone.DATA_APN_KEY, apn); 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent.putExtra(Phone.DATA_IFACE_NAME_KEY, interfaceName); 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext.sendStickyBroadcast(intent); 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void broadcastDataConnectionFailed(String reason) { 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent intent = new Intent(TelephonyIntents.ACTION_DATA_CONNECTION_FAILED); 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent.putExtra(Phone.FAILURE_REASON_KEY, reason); 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext.sendStickyBroadcast(intent); 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 490ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 491ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project private boolean checkPhoneStatePermission(String method) { 492ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.MODIFY_PHONE_STATE) 493ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project == PackageManager.PERMISSION_GRANTED) { 494ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project return true; 495ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 496ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project String msg = "Modify Phone State Permission Denial: " + method + " from pid=" 497ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project + Binder.getCallingPid() 498ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project + ", uid=" + Binder.getCallingUid(); 499ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project Log.w(TAG, msg); 500ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project return false; 501ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 503