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 19a12a7b3d3d8fc8678411295df4d001447b33a994Wink Savilleimport android.app.ActivityManager; 20a12a7b3d3d8fc8678411295df4d001447b33a994Wink Savilleimport android.content.BroadcastReceiver; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent; 23a12a7b3d3d8fc8678411295df4d001447b33a994Wink Savilleimport android.content.IntentFilter; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PackageManager; 25f61101f6266be243c481d163b95e65d67b8d1669Wink Savilleimport android.net.LinkCapabilities; 2637e65ebb7eb932e1a144b1cab262e11ca5fd109bRobert Greenwaltimport android.net.LinkProperties; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Binder; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle; 29a12a7b3d3d8fc8678411295df4d001447b33a994Wink Savilleimport android.os.Handler; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder; 31a12a7b3d3d8fc8678411295df4d001447b33a994Wink Savilleimport android.os.Message; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteException; 335ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackbornimport android.os.UserHandle; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.telephony.CellLocation; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.telephony.PhoneStateListener; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.telephony.ServiceState; 37e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Savilleimport android.telephony.SignalStrength; 38963db55d59a170f4b17ff907c96615a19ef6fe17John Wangimport android.telephony.CellInfo; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.telephony.TelephonyManager; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.TextUtils; 418a9b22056b13477f59df934928c00c58b5871c95Joe Onoratoimport android.util.Slog; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList; 44b208a24cf521401912cfce16fce550a995cf1250Wink Savilleimport java.util.List; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileDescriptor; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.PrintWriter; 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.app.IBatteryStats; 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.telephony.ITelephonyRegistry; 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.telephony.IPhoneStateListener; 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.telephony.DefaultPhoneNotifier; 52a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Savilleimport com.android.internal.telephony.PhoneConstants; 53c9330ddcf407e7db17e50167d6820b4a34d57228Wink Savilleimport com.android.internal.telephony.ServiceStateTracker; 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.telephony.TelephonyIntents; 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.server.am.BatteryStatsService; 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 58e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville * Since phone process can be restarted, this class provides a centralized place 59e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville * that applications can register and be called back from. 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass TelephonyRegistry extends ITelephonyRegistry.Stub { 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String TAG = "TelephonyRegistry"; 63c9acde9aa6cf21598640aeebb7d908f1926a48ddWink Saville private static final boolean DBG = false; 64a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville private static final boolean DBG_LOC = false; 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static class Record { 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String pkgForDebug; 68e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder binder; 70e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IPhoneStateListener callback; 72e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville 73a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville int callerUid; 74a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int events; 76a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville 77a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville @Override 78a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville public String toString() { 79a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville return "{pkgForDebug=" + pkgForDebug + " callerUid=" + callerUid + 80a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville " events=" + Integer.toHexString(events) + "}"; 81a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville } 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final Context mContext; 85e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville 86163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato // access should be inside synchronized (mRecords) for these two fields 87163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato private final ArrayList<IBinder> mRemoveList = new ArrayList<IBinder>(); 88163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato private final ArrayList<Record> mRecords = new ArrayList<Record>(); 89e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final IBatteryStats mBatteryStats; 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mCallState = TelephonyManager.CALL_STATE_IDLE; 93e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String mCallIncomingNumber = ""; 95e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private ServiceState mServiceState = new ServiceState(); 97e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville 98e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville private SignalStrength mSignalStrength = new SignalStrength(); 99e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mMessageWaiting = false; 101e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mCallForwarding = false; 103e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mDataActivity = TelephonyManager.DATA_ACTIVITY_NONE; 105e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville 1068e7e0a9fd5c377294bfe2e09fca9b7551871f3c2Robert Greenwalt private int mDataConnectionState = TelephonyManager.DATA_UNKNOWN; 107e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mDataConnectionPossible = false; 109e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String mDataConnectionReason = ""; 111e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String mDataConnectionApn = ""; 113e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville 11402648a4b8422733ed401f07edf8e426318bb2f8dRobert Greenwalt private ArrayList<String> mConnectedApns; 11542acef37339afe6ac608c842f1637870ee9c4f6cRobert Greenwalt 116f61101f6266be243c481d163b95e65d67b8d1669Wink Saville private LinkProperties mDataConnectionLinkProperties; 117f61101f6266be243c481d163b95e65d67b8d1669Wink Saville 118f61101f6266be243c481d163b95e65d67b8d1669Wink Saville private LinkCapabilities mDataConnectionLinkCapabilities; 119e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Bundle mCellLocation = new Bundle(); 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12298e0b146b80670b52805b4b210ef5582dad6bb68Robert Greenwalt private int mDataConnectionNetworkType; 12398e0b146b80670b52805b4b210ef5582dad6bb68Robert Greenwalt 124c9330ddcf407e7db17e50167d6820b4a34d57228Wink Saville private int mOtaspMode = ServiceStateTracker.OTASP_UNKNOWN; 125fd2d01302781af91d77557a99874111a4fee8365Wink Saville 126b208a24cf521401912cfce16fce550a995cf1250Wink Saville private List<CellInfo> mCellInfo = null; 127963db55d59a170f4b17ff907c96615a19ef6fe17John Wang 12845515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh static final int PHONE_STATE_PERMISSION_MASK = 12945515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh PhoneStateListener.LISTEN_CALL_FORWARDING_INDICATOR | 13045515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh PhoneStateListener.LISTEN_CALL_STATE | 13145515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh PhoneStateListener.LISTEN_DATA_ACTIVITY | 13245515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh PhoneStateListener.LISTEN_DATA_CONNECTION_STATE | 13345515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh PhoneStateListener.LISTEN_MESSAGE_WAITING_INDICATOR; 13445515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh 135a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville private static final int MSG_USER_SWITCHED = 1; 136a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville 137a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville private final Handler mHandler = new Handler() { 138a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville @Override 139a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville public void handleMessage(Message msg) { 140a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville switch (msg.what) { 141a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville case MSG_USER_SWITCHED: { 142a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville Slog.d(TAG, "MSG_USER_SWITCHED userId=" + msg.arg1); 143a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville TelephonyRegistry.this.notifyCellLocation(mCellLocation); 144a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville break; 145a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville } 146a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville } 147a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville } 148a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville }; 149a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville 150a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { 151a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville @Override 152a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville public void onReceive(Context context, Intent intent) { 153a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville String action = intent.getAction(); 154a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville if (Intent.ACTION_USER_SWITCHED.equals(action)) { 155a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville mHandler.sendMessage(mHandler.obtainMessage(MSG_USER_SWITCHED, 156a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 0), 0)); 157a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville } 158a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville } 159a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville }; 160a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville 161e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville // we keep a copy of all of the state so we can send it out when folks 162e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville // register for it 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // 164e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville // In these calls we call with the lock held. This is safe becasuse remote 165e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville // calls go through a oneway interface and local calls going through a 166e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville // handler before they get to app code. 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TelephonyRegistry(Context context) { 1694ef8ec3a21da69091200aeebff80dbcde336709cDavid 'Digit' Turner CellLocation location = CellLocation.getEmpty(); 1704ef8ec3a21da69091200aeebff80dbcde336709cDavid 'Digit' Turner 1714ef8ec3a21da69091200aeebff80dbcde336709cDavid 'Digit' Turner // Note that location can be null for non-phone builds like 1724ef8ec3a21da69091200aeebff80dbcde336709cDavid 'Digit' Turner // like the generic one. 1734ef8ec3a21da69091200aeebff80dbcde336709cDavid 'Digit' Turner if (location != null) { 1744ef8ec3a21da69091200aeebff80dbcde336709cDavid 'Digit' Turner location.fillInNotifierBundle(mCellLocation); 1754ef8ec3a21da69091200aeebff80dbcde336709cDavid 'Digit' Turner } 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext = context; 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBatteryStats = BatteryStatsService.getService(); 17802648a4b8422733ed401f07edf8e426318bb2f8dRobert Greenwalt mConnectedApns = new ArrayList<String>(); 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 181a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville public void systemReady() { 182a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville // Watch for interesting updates 183a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville final IntentFilter filter = new IntentFilter(); 184a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville filter.addAction(Intent.ACTION_USER_SWITCHED); 185a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville filter.addAction(Intent.ACTION_USER_REMOVED); 186a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville mContext.registerReceiver(mBroadcastReceiver, filter); 187a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville } 188a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville 189a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville @Override 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void listen(String pkgForDebug, IPhoneStateListener callback, int events, 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean notifyNow) { 192a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville int callerUid = UserHandle.getCallingUserId(); 193a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville int myUid = UserHandle.myUserId(); 194a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville if (DBG) { 195a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville Slog.d(TAG, "listen: E pkg=" + pkgForDebug + " events=0x" + Integer.toHexString(events) 196a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville + " myUid=" + myUid 197a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville + " callerUid=" + callerUid); 198a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville } 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (events != 0) { 20045515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh /* Checks permission and throws Security exception */ 20145515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh checkListenerPermission(events); 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mRecords) { 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // register 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Record r = null; 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project find_and_add: { 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder b = callback.asBinder(); 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = mRecords.size(); 209e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville for (int i = 0; i < N; i++) { 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r = mRecords.get(i); 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (b == r.binder) { 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break find_and_add; 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r = new Record(); 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.binder = b; 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.callback = callback; 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.pkgForDebug = pkgForDebug; 219a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville r.callerUid = callerUid; 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecords.add(r); 221a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville if (DBG) Slog.i(TAG, "listen: add new record=" + r); 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int send = events & (events ^ r.events); 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.events = events; 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (notifyNow) { 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((events & PhoneStateListener.LISTEN_SERVICE_STATE) != 0) { 227163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato try { 228163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato r.callback.onServiceStateChanged(new ServiceState(mServiceState)); 229163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato } catch (RemoteException ex) { 230163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato remove(r.binder); 231163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato } 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((events & PhoneStateListener.LISTEN_SIGNAL_STRENGTH) != 0) { 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 235e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville int gsmSignalStrength = mSignalStrength.getGsmSignalStrength(); 236e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville r.callback.onSignalStrengthChanged((gsmSignalStrength == 99 ? -1 237e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville : gsmSignalStrength)); 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException ex) { 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remove(r.binder); 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((events & PhoneStateListener.LISTEN_MESSAGE_WAITING_INDICATOR) != 0) { 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.callback.onMessageWaitingIndicatorChanged(mMessageWaiting); 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException ex) { 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remove(r.binder); 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((events & PhoneStateListener.LISTEN_CALL_FORWARDING_INDICATOR) != 0) { 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.callback.onCallForwardingIndicatorChanged(mCallForwarding); 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException ex) { 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remove(r.binder); 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 256a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville if (validateEventsAndUserLocked(r, PhoneStateListener.LISTEN_CELL_LOCATION)) { 257163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato try { 258a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville if (DBG_LOC) Slog.d(TAG, "listen: mCellLocation=" + mCellLocation); 259163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato r.callback.onCellLocationChanged(new Bundle(mCellLocation)); 260163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato } catch (RemoteException ex) { 261163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato remove(r.binder); 262163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato } 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((events & PhoneStateListener.LISTEN_CALL_STATE) != 0) { 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.callback.onCallStateChanged(mCallState, mCallIncomingNumber); 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException ex) { 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remove(r.binder); 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((events & PhoneStateListener.LISTEN_DATA_CONNECTION_STATE) != 0) { 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 27398e0b146b80670b52805b4b210ef5582dad6bb68Robert Greenwalt r.callback.onDataConnectionStateChanged(mDataConnectionState, 27498e0b146b80670b52805b4b210ef5582dad6bb68Robert Greenwalt mDataConnectionNetworkType); 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException ex) { 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remove(r.binder); 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((events & PhoneStateListener.LISTEN_DATA_ACTIVITY) != 0) { 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.callback.onDataActivity(mDataActivity); 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 } 286e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville if ((events & PhoneStateListener.LISTEN_SIGNAL_STRENGTHS) != 0) { 287e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville try { 288e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville r.callback.onSignalStrengthsChanged(mSignalStrength); 289e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville } catch (RemoteException ex) { 290e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville remove(r.binder); 291e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville } 292e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville } 293fd2d01302781af91d77557a99874111a4fee8365Wink Saville if ((events & PhoneStateListener.LISTEN_OTASP_CHANGED) != 0) { 294fd2d01302781af91d77557a99874111a4fee8365Wink Saville try { 295fd2d01302781af91d77557a99874111a4fee8365Wink Saville r.callback.onOtaspChanged(mOtaspMode); 296fd2d01302781af91d77557a99874111a4fee8365Wink Saville } catch (RemoteException ex) { 297fd2d01302781af91d77557a99874111a4fee8365Wink Saville remove(r.binder); 298fd2d01302781af91d77557a99874111a4fee8365Wink Saville } 299fd2d01302781af91d77557a99874111a4fee8365Wink Saville } 300a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville if (validateEventsAndUserLocked(r, PhoneStateListener.LISTEN_CELL_INFO)) { 301963db55d59a170f4b17ff907c96615a19ef6fe17John Wang try { 302a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville if (DBG_LOC) Slog.d(TAG, "listen: mCellInfo=" + mCellInfo); 303b208a24cf521401912cfce16fce550a995cf1250Wink Saville r.callback.onCellInfoChanged(mCellInfo); 304963db55d59a170f4b17ff907c96615a19ef6fe17John Wang } catch (RemoteException ex) { 305963db55d59a170f4b17ff907c96615a19ef6fe17John Wang remove(r.binder); 306963db55d59a170f4b17ff907c96615a19ef6fe17John Wang } 307963db55d59a170f4b17ff907c96615a19ef6fe17John Wang } 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remove(callback.asBinder()); 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void remove(IBinder binder) { 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mRecords) { 317e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville final int recordCount = mRecords.size(); 318e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville for (int i = 0; i < recordCount; i++) { 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mRecords.get(i).binder == binder) { 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecords.remove(i); 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void notifyCallState(int state, String incomingNumber) { 32845515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh if (!checkNotifyPermission("notifyCallState()")) { 329ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project return; 330ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mRecords) { 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCallState = state; 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCallIncomingNumber = incomingNumber; 33402648a4b8422733ed401f07edf8e426318bb2f8dRobert Greenwalt for (Record r : mRecords) { 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((r.events & PhoneStateListener.LISTEN_CALL_STATE) != 0) { 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.callback.onCallStateChanged(state, incomingNumber); 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException ex) { 339163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato mRemoveList.add(r.binder); 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 343163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato handleRemoveListLocked(); 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project broadcastCallStateChanged(state, incomingNumber); 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void notifyServiceState(ServiceState state) { 34945515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh if (!checkNotifyPermission("notifyServiceState()")){ 350ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project return; 351e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville } 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mRecords) { 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mServiceState = state; 35402648a4b8422733ed401f07edf8e426318bb2f8dRobert Greenwalt for (Record r : mRecords) { 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((r.events & PhoneStateListener.LISTEN_SERVICE_STATE) != 0) { 356163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato try { 357163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato r.callback.onServiceStateChanged(new ServiceState(state)); 358163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato } catch (RemoteException ex) { 359163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato mRemoveList.add(r.binder); 360163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato } 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 363163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato handleRemoveListLocked(); 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project broadcastServiceStateChanged(state); 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 368e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville public void notifySignalStrength(SignalStrength signalStrength) { 36945515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh if (!checkNotifyPermission("notifySignalStrength()")) { 370ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project return; 371e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville } 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mRecords) { 373e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville mSignalStrength = signalStrength; 37402648a4b8422733ed401f07edf8e426318bb2f8dRobert Greenwalt for (Record r : mRecords) { 375e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville if ((r.events & PhoneStateListener.LISTEN_SIGNAL_STRENGTHS) != 0) { 376163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato try { 377163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato r.callback.onSignalStrengthsChanged(new SignalStrength(signalStrength)); 378163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato } catch (RemoteException ex) { 379163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato mRemoveList.add(r.binder); 380163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato } 381e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville } 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((r.events & PhoneStateListener.LISTEN_SIGNAL_STRENGTH) != 0) { 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 384e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville int gsmSignalStrength = signalStrength.getGsmSignalStrength(); 385e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville r.callback.onSignalStrengthChanged((gsmSignalStrength == 99 ? -1 386e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville : gsmSignalStrength)); 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException ex) { 388163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato mRemoveList.add(r.binder); 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 392163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato handleRemoveListLocked(); 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 394e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville broadcastSignalStrengthChanged(signalStrength); 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 397b208a24cf521401912cfce16fce550a995cf1250Wink Saville public void notifyCellInfo(List<CellInfo> cellInfo) { 398963db55d59a170f4b17ff907c96615a19ef6fe17John Wang if (!checkNotifyPermission("notifyCellInfo()")) { 399963db55d59a170f4b17ff907c96615a19ef6fe17John Wang return; 400963db55d59a170f4b17ff907c96615a19ef6fe17John Wang } 401963db55d59a170f4b17ff907c96615a19ef6fe17John Wang 402963db55d59a170f4b17ff907c96615a19ef6fe17John Wang synchronized (mRecords) { 403963db55d59a170f4b17ff907c96615a19ef6fe17John Wang mCellInfo = cellInfo; 404963db55d59a170f4b17ff907c96615a19ef6fe17John Wang for (Record r : mRecords) { 405a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville if (validateEventsAndUserLocked(r, PhoneStateListener.LISTEN_CELL_INFO)) { 406963db55d59a170f4b17ff907c96615a19ef6fe17John Wang try { 407a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville if (DBG_LOC) { 408a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville Slog.d(TAG, "notifyCellInfo: mCellInfo=" + mCellInfo + " r=" + r); 409a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville } 410b208a24cf521401912cfce16fce550a995cf1250Wink Saville r.callback.onCellInfoChanged(cellInfo); 411963db55d59a170f4b17ff907c96615a19ef6fe17John Wang } catch (RemoteException ex) { 412963db55d59a170f4b17ff907c96615a19ef6fe17John Wang mRemoveList.add(r.binder); 413963db55d59a170f4b17ff907c96615a19ef6fe17John Wang } 414963db55d59a170f4b17ff907c96615a19ef6fe17John Wang } 415963db55d59a170f4b17ff907c96615a19ef6fe17John Wang } 416963db55d59a170f4b17ff907c96615a19ef6fe17John Wang handleRemoveListLocked(); 417963db55d59a170f4b17ff907c96615a19ef6fe17John Wang } 418963db55d59a170f4b17ff907c96615a19ef6fe17John Wang } 419963db55d59a170f4b17ff907c96615a19ef6fe17John Wang 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void notifyMessageWaitingChanged(boolean mwi) { 42145515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh if (!checkNotifyPermission("notifyMessageWaitingChanged()")) { 422ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project return; 423e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville } 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mRecords) { 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMessageWaiting = mwi; 42602648a4b8422733ed401f07edf8e426318bb2f8dRobert Greenwalt for (Record r : mRecords) { 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((r.events & PhoneStateListener.LISTEN_MESSAGE_WAITING_INDICATOR) != 0) { 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.callback.onMessageWaitingIndicatorChanged(mwi); 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException ex) { 431163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato mRemoveList.add(r.binder); 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 435163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato handleRemoveListLocked(); 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void notifyCallForwardingChanged(boolean cfi) { 44045515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh if (!checkNotifyPermission("notifyCallForwardingChanged()")) { 441ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project return; 442e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville } 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mRecords) { 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCallForwarding = cfi; 44502648a4b8422733ed401f07edf8e426318bb2f8dRobert Greenwalt for (Record r : mRecords) { 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((r.events & PhoneStateListener.LISTEN_CALL_FORWARDING_INDICATOR) != 0) { 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.callback.onCallForwardingIndicatorChanged(cfi); 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException ex) { 450163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato mRemoveList.add(r.binder); 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 454163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato handleRemoveListLocked(); 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void notifyDataActivity(int state) { 45945515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh if (!checkNotifyPermission("notifyDataActivity()" )) { 460ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project return; 461e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville } 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mRecords) { 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDataActivity = state; 46402648a4b8422733ed401f07edf8e426318bb2f8dRobert Greenwalt for (Record r : mRecords) { 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((r.events & PhoneStateListener.LISTEN_DATA_ACTIVITY) != 0) { 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.callback.onDataActivity(state); 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException ex) { 469163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato mRemoveList.add(r.binder); 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 473163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato handleRemoveListLocked(); 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 47745515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh public void notifyDataConnection(int state, boolean isDataConnectivityPossible, 47837e65ebb7eb932e1a144b1cab262e11ca5fd109bRobert Greenwalt String reason, String apn, String apnType, LinkProperties linkProperties, 479a6d4248e21bd62a51ac4aaadaa67fdb55b666d98Robert Greenwalt LinkCapabilities linkCapabilities, int networkType, boolean roaming) { 48045515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh if (!checkNotifyPermission("notifyDataConnection()" )) { 481ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project return; 482e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville } 483c9acde9aa6cf21598640aeebb7d908f1926a48ddWink Saville if (DBG) { 484c9acde9aa6cf21598640aeebb7d908f1926a48ddWink Saville Slog.i(TAG, "notifyDataConnection: state=" + state + " isDataConnectivityPossible=" 48526f5a384d81487cc6bb80a78fb40d5e7e7ffc81eWink Saville + isDataConnectivityPossible + " reason='" + reason 486a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville + "' apn='" + apn + "' apnType=" + apnType + " networkType=" + networkType 487a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville + " mRecords.size()=" + mRecords.size() + " mRecords=" + mRecords); 488c9acde9aa6cf21598640aeebb7d908f1926a48ddWink Saville } 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mRecords) { 49002648a4b8422733ed401f07edf8e426318bb2f8dRobert Greenwalt boolean modified = false; 49102648a4b8422733ed401f07edf8e426318bb2f8dRobert Greenwalt if (state == TelephonyManager.DATA_CONNECTED) { 49202648a4b8422733ed401f07edf8e426318bb2f8dRobert Greenwalt if (!mConnectedApns.contains(apnType)) { 49302648a4b8422733ed401f07edf8e426318bb2f8dRobert Greenwalt mConnectedApns.add(apnType); 49402648a4b8422733ed401f07edf8e426318bb2f8dRobert Greenwalt if (mDataConnectionState != state) { 49502648a4b8422733ed401f07edf8e426318bb2f8dRobert Greenwalt mDataConnectionState = state; 49602648a4b8422733ed401f07edf8e426318bb2f8dRobert Greenwalt modified = true; 49702648a4b8422733ed401f07edf8e426318bb2f8dRobert Greenwalt } 49802648a4b8422733ed401f07edf8e426318bb2f8dRobert Greenwalt } 49902648a4b8422733ed401f07edf8e426318bb2f8dRobert Greenwalt } else { 5008e7e0a9fd5c377294bfe2e09fca9b7551871f3c2Robert Greenwalt if (mConnectedApns.remove(apnType)) { 5018e7e0a9fd5c377294bfe2e09fca9b7551871f3c2Robert Greenwalt if (mConnectedApns.isEmpty()) { 5028e7e0a9fd5c377294bfe2e09fca9b7551871f3c2Robert Greenwalt mDataConnectionState = state; 5038e7e0a9fd5c377294bfe2e09fca9b7551871f3c2Robert Greenwalt modified = true; 5048e7e0a9fd5c377294bfe2e09fca9b7551871f3c2Robert Greenwalt } else { 5058e7e0a9fd5c377294bfe2e09fca9b7551871f3c2Robert Greenwalt // leave mDataConnectionState as is and 5068e7e0a9fd5c377294bfe2e09fca9b7551871f3c2Robert Greenwalt // send out the new status for the APN in question. 5078e7e0a9fd5c377294bfe2e09fca9b7551871f3c2Robert Greenwalt } 50802648a4b8422733ed401f07edf8e426318bb2f8dRobert Greenwalt } 50902648a4b8422733ed401f07edf8e426318bb2f8dRobert Greenwalt } 510e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville mDataConnectionPossible = isDataConnectivityPossible; 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDataConnectionReason = reason; 512f61101f6266be243c481d163b95e65d67b8d1669Wink Saville mDataConnectionLinkProperties = linkProperties; 513f61101f6266be243c481d163b95e65d67b8d1669Wink Saville mDataConnectionLinkCapabilities = linkCapabilities; 51402648a4b8422733ed401f07edf8e426318bb2f8dRobert Greenwalt if (mDataConnectionNetworkType != networkType) { 51502648a4b8422733ed401f07edf8e426318bb2f8dRobert Greenwalt mDataConnectionNetworkType = networkType; 5168e7e0a9fd5c377294bfe2e09fca9b7551871f3c2Robert Greenwalt // need to tell registered listeners about the new network type 51702648a4b8422733ed401f07edf8e426318bb2f8dRobert Greenwalt modified = true; 51802648a4b8422733ed401f07edf8e426318bb2f8dRobert Greenwalt } 51902648a4b8422733ed401f07edf8e426318bb2f8dRobert Greenwalt if (modified) { 520c9acde9aa6cf21598640aeebb7d908f1926a48ddWink Saville if (DBG) { 521c9acde9aa6cf21598640aeebb7d908f1926a48ddWink Saville Slog.d(TAG, "onDataConnectionStateChanged(" + mDataConnectionState 522e6fa120275d9f6715783cf608b4fed742fd7161byoonsung.nam + ", " + mDataConnectionNetworkType + ")"); 523c9acde9aa6cf21598640aeebb7d908f1926a48ddWink Saville } 52402648a4b8422733ed401f07edf8e426318bb2f8dRobert Greenwalt for (Record r : mRecords) { 52502648a4b8422733ed401f07edf8e426318bb2f8dRobert Greenwalt if ((r.events & PhoneStateListener.LISTEN_DATA_CONNECTION_STATE) != 0) { 52602648a4b8422733ed401f07edf8e426318bb2f8dRobert Greenwalt try { 527e6fa120275d9f6715783cf608b4fed742fd7161byoonsung.nam r.callback.onDataConnectionStateChanged(mDataConnectionState, 528e6fa120275d9f6715783cf608b4fed742fd7161byoonsung.nam mDataConnectionNetworkType); 52902648a4b8422733ed401f07edf8e426318bb2f8dRobert Greenwalt } catch (RemoteException ex) { 530163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato mRemoveList.add(r.binder); 53102648a4b8422733ed401f07edf8e426318bb2f8dRobert Greenwalt } 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 534163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato handleRemoveListLocked(); 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 537e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville broadcastDataConnectionStateChanged(state, isDataConnectivityPossible, reason, apn, 538a6d4248e21bd62a51ac4aaadaa67fdb55b666d98Robert Greenwalt apnType, linkProperties, linkCapabilities, roaming); 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 54102648a4b8422733ed401f07edf8e426318bb2f8dRobert Greenwalt public void notifyDataConnectionFailed(String reason, String apnType) { 54245515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh if (!checkNotifyPermission("notifyDataConnectionFailed()")) { 543ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project return; 544e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville } 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 54602648a4b8422733ed401f07edf8e426318bb2f8dRobert Greenwalt * This is commented out because there is no onDataConnectionFailed callback 54702648a4b8422733ed401f07edf8e426318bb2f8dRobert Greenwalt * in PhoneStateListener. There should be. 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mRecords) { 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDataConnectionFailedReason = reason; 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = mRecords.size(); 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=N-1; i>=0; i--) { 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Record r = mRecords.get(i); 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((r.events & PhoneStateListener.LISTEN_DATA_CONNECTION_FAILED) != 0) { 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // XXX 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 55902648a4b8422733ed401f07edf8e426318bb2f8dRobert Greenwalt broadcastDataConnectionFailed(reason, apnType); 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void notifyCellLocation(Bundle cellLocation) { 56345515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh if (!checkNotifyPermission("notifyCellLocation()")) { 564ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project return; 565e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville } 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mRecords) { 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCellLocation = cellLocation; 56802648a4b8422733ed401f07edf8e426318bb2f8dRobert Greenwalt for (Record r : mRecords) { 569a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville if (validateEventsAndUserLocked(r, PhoneStateListener.LISTEN_CELL_LOCATION)) { 570163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato try { 571a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville if (DBG_LOC) { 572a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville Slog.d(TAG, "notifyCellLocation: mCellLocation=" + mCellLocation 573a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville + " r=" + r); 574a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville } 575163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato r.callback.onCellLocationChanged(new Bundle(cellLocation)); 576163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato } catch (RemoteException ex) { 577163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato mRemoveList.add(r.binder); 578163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato } 579163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 582163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato handleRemoveListLocked(); 583e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville } 584e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville } 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 586fd2d01302781af91d77557a99874111a4fee8365Wink Saville public void notifyOtaspChanged(int otaspMode) { 587fd2d01302781af91d77557a99874111a4fee8365Wink Saville if (!checkNotifyPermission("notifyOtaspChanged()" )) { 588fd2d01302781af91d77557a99874111a4fee8365Wink Saville return; 589fd2d01302781af91d77557a99874111a4fee8365Wink Saville } 590fd2d01302781af91d77557a99874111a4fee8365Wink Saville synchronized (mRecords) { 591fd2d01302781af91d77557a99874111a4fee8365Wink Saville mOtaspMode = otaspMode; 592fd2d01302781af91d77557a99874111a4fee8365Wink Saville for (Record r : mRecords) { 593fd2d01302781af91d77557a99874111a4fee8365Wink Saville if ((r.events & PhoneStateListener.LISTEN_OTASP_CHANGED) != 0) { 594fd2d01302781af91d77557a99874111a4fee8365Wink Saville try { 595fd2d01302781af91d77557a99874111a4fee8365Wink Saville r.callback.onOtaspChanged(otaspMode); 596fd2d01302781af91d77557a99874111a4fee8365Wink Saville } catch (RemoteException ex) { 597fd2d01302781af91d77557a99874111a4fee8365Wink Saville mRemoveList.add(r.binder); 598fd2d01302781af91d77557a99874111a4fee8365Wink Saville } 599fd2d01302781af91d77557a99874111a4fee8365Wink Saville } 600fd2d01302781af91d77557a99874111a4fee8365Wink Saville } 601fd2d01302781af91d77557a99874111a4fee8365Wink Saville handleRemoveListLocked(); 602fd2d01302781af91d77557a99874111a4fee8365Wink Saville } 603fd2d01302781af91d77557a99874111a4fee8365Wink Saville } 604fd2d01302781af91d77557a99874111a4fee8365Wink Saville 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP) 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project != PackageManager.PERMISSION_GRANTED) { 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println("Permission Denial: can't dump telephony.registry from from pid=" 610e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville + Binder.getCallingPid() + ", uid=" + Binder.getCallingUid()); 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mRecords) { 614e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville final int recordCount = mRecords.size(); 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println("last known state:"); 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" mCallState=" + mCallState); 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" mCallIncomingNumber=" + mCallIncomingNumber); 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" mServiceState=" + mServiceState); 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" mSignalStrength=" + mSignalStrength); 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" mMessageWaiting=" + mMessageWaiting); 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" mCallForwarding=" + mCallForwarding); 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" mDataActivity=" + mDataActivity); 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" mDataConnectionState=" + mDataConnectionState); 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" mDataConnectionPossible=" + mDataConnectionPossible); 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" mDataConnectionReason=" + mDataConnectionReason); 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" mDataConnectionApn=" + mDataConnectionApn); 627f61101f6266be243c481d163b95e65d67b8d1669Wink Saville pw.println(" mDataConnectionLinkProperties=" + mDataConnectionLinkProperties); 628f61101f6266be243c481d163b95e65d67b8d1669Wink Saville pw.println(" mDataConnectionLinkCapabilities=" + mDataConnectionLinkCapabilities); 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" mCellLocation=" + mCellLocation); 630963db55d59a170f4b17ff907c96615a19ef6fe17John Wang pw.println(" mCellInfo=" + mCellInfo); 631e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville pw.println("registrations: count=" + recordCount); 63202648a4b8422733ed401f07edf8e426318bb2f8dRobert Greenwalt for (Record r : mRecords) { 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" " + r.pkgForDebug + " 0x" + Integer.toHexString(r.events)); 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the legacy intent broadcasting 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void broadcastServiceStateChanged(ServiceState state) { 64332dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani long ident = Binder.clearCallingIdentity(); 64432dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani try { 645f37447bad3773b62176baa837908daf6edb44273Amith Yamasani mBatteryStats.notePhoneState(state.getState()); 64632dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani } catch (RemoteException re) { 64732dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani // Can't do much 64832dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani } finally { 64932dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani Binder.restoreCallingIdentity(ident); 65032dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani } 65132dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent intent = new Intent(TelephonyIntents.ACTION_SERVICE_STATE_CHANGED); 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Bundle data = new Bundle(); 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project state.fillInNotifierBundle(data); 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent.putExtras(data); 6565ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn mContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL); 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 659e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville private void broadcastSignalStrengthChanged(SignalStrength signalStrength) { 660627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn long ident = Binder.clearCallingIdentity(); 661627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn try { 662e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville mBatteryStats.notePhoneSignalStrength(signalStrength); 663627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } catch (RemoteException e) { 664e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville /* The remote entity disappeared, we can safely ignore the exception. */ 665627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } finally { 666627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn Binder.restoreCallingIdentity(ident); 667627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 668e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent intent = new Intent(TelephonyIntents.ACTION_SIGNAL_STRENGTH_CHANGED); 6701c633fc89bae9bf0af6fe643ac7ad2e744f27bedDianne Hackborn intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING); 671e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville Bundle data = new Bundle(); 672e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville signalStrength.fillInNotifierBundle(data); 673e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville intent.putExtras(data); 6745ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn mContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL); 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void broadcastCallStateChanged(int state, String incomingNumber) { 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long ident = Binder.clearCallingIdentity(); 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (state == TelephonyManager.CALL_STATE_IDLE) { 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBatteryStats.notePhoneOff(); 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBatteryStats.notePhoneOn(); 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 686e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville /* The remote entity disappeared, we can safely ignore the exception. */ 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(ident); 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 690e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent intent = new Intent(TelephonyManager.ACTION_PHONE_STATE_CHANGED); 692a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville intent.putExtra(PhoneConstants.STATE_KEY, 693a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville DefaultPhoneNotifier.convertCallState(state).toString()); 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!TextUtils.isEmpty(incomingNumber)) { 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent.putExtra(TelephonyManager.EXTRA_INCOMING_NUMBER, incomingNumber); 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6975ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn mContext.sendBroadcastAsUser(intent, UserHandle.ALL, 6985ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn android.Manifest.permission.READ_PHONE_STATE); 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 70142acef37339afe6ac608c842f1637870ee9c4f6cRobert Greenwalt private void broadcastDataConnectionStateChanged(int state, 70242acef37339afe6ac608c842f1637870ee9c4f6cRobert Greenwalt boolean isDataConnectivityPossible, 703f61101f6266be243c481d163b95e65d67b8d1669Wink Saville String reason, String apn, String apnType, LinkProperties linkProperties, 704a6d4248e21bd62a51ac4aaadaa67fdb55b666d98Robert Greenwalt LinkCapabilities linkCapabilities, boolean roaming) { 705627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn // Note: not reporting to the battery stats service here, because the 706627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn // status bar takes care of that after taking into account all of the 707627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn // required info. 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent intent = new Intent(TelephonyIntents.ACTION_ANY_DATA_CONNECTION_STATE_CHANGED); 709a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville intent.putExtra(PhoneConstants.STATE_KEY, 710a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville DefaultPhoneNotifier.convertDataState(state).toString()); 7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!isDataConnectivityPossible) { 712a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville intent.putExtra(PhoneConstants.NETWORK_UNAVAILABLE_KEY, true); 7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (reason != null) { 715a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville intent.putExtra(PhoneConstants.STATE_CHANGE_REASON_KEY, reason); 7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 71737e65ebb7eb932e1a144b1cab262e11ca5fd109bRobert Greenwalt if (linkProperties != null) { 718a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville intent.putExtra(PhoneConstants.DATA_LINK_PROPERTIES_KEY, linkProperties); 719ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff String iface = linkProperties.getInterfaceName(); 72047f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt if (iface != null) { 721a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville intent.putExtra(PhoneConstants.DATA_IFACE_NAME_KEY, iface); 72247f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt } 72347f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt } 724f61101f6266be243c481d163b95e65d67b8d1669Wink Saville if (linkCapabilities != null) { 725a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville intent.putExtra(PhoneConstants.DATA_LINK_CAPABILITIES_KEY, linkCapabilities); 726f61101f6266be243c481d163b95e65d67b8d1669Wink Saville } 727a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville if (roaming) intent.putExtra(PhoneConstants.DATA_NETWORK_ROAMING_KEY, true); 728a6d4248e21bd62a51ac4aaadaa67fdb55b666d98Robert Greenwalt 729a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville intent.putExtra(PhoneConstants.DATA_APN_KEY, apn); 730a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville intent.putExtra(PhoneConstants.DATA_APN_TYPE_KEY, apnType); 7315ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn mContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL); 7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 73402648a4b8422733ed401f07edf8e426318bb2f8dRobert Greenwalt private void broadcastDataConnectionFailed(String reason, String apnType) { 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent intent = new Intent(TelephonyIntents.ACTION_DATA_CONNECTION_FAILED); 736a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville intent.putExtra(PhoneConstants.FAILURE_REASON_KEY, reason); 737a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville intent.putExtra(PhoneConstants.DATA_APN_TYPE_KEY, apnType); 7385ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn mContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL); 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 740e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville 74145515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh private boolean checkNotifyPermission(String method) { 742ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.MODIFY_PHONE_STATE) 743ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project == PackageManager.PERMISSION_GRANTED) { 744ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project return true; 745ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 746ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project String msg = "Modify Phone State Permission Denial: " + method + " from pid=" 747e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville + Binder.getCallingPid() + ", uid=" + Binder.getCallingUid(); 748c9acde9aa6cf21598640aeebb7d908f1926a48ddWink Saville if (DBG) Slog.w(TAG, msg); 749ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project return false; 750ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 75145515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh 75245515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh private void checkListenerPermission(int events) { 75345515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh if ((events & PhoneStateListener.LISTEN_CELL_LOCATION) != 0) { 75445515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh mContext.enforceCallingOrSelfPermission( 75545515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh android.Manifest.permission.ACCESS_COARSE_LOCATION, null); 75645515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh 75745515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh } 75845515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh 759963db55d59a170f4b17ff907c96615a19ef6fe17John Wang if ((events & PhoneStateListener.LISTEN_CELL_INFO) != 0) { 760963db55d59a170f4b17ff907c96615a19ef6fe17John Wang mContext.enforceCallingOrSelfPermission( 761963db55d59a170f4b17ff907c96615a19ef6fe17John Wang android.Manifest.permission.ACCESS_COARSE_LOCATION, null); 762963db55d59a170f4b17ff907c96615a19ef6fe17John Wang 763963db55d59a170f4b17ff907c96615a19ef6fe17John Wang } 764963db55d59a170f4b17ff907c96615a19ef6fe17John Wang 76545515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh if ((events & PHONE_STATE_PERMISSION_MASK) != 0) { 76645515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh mContext.enforceCallingOrSelfPermission( 76745515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh android.Manifest.permission.READ_PHONE_STATE, null); 76845515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh } 76945515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh } 770163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato 771163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato private void handleRemoveListLocked() { 772163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato if (mRemoveList.size() > 0) { 773163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato for (IBinder b: mRemoveList) { 774163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato remove(b); 775163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato } 776163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato mRemoveList.clear(); 777163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato } 778163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato } 779a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville 780a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville private boolean validateEventsAndUserLocked(Record r, int events) { 781a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville int foregroundUser; 782a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville long callingIdentity = Binder.clearCallingIdentity(); 783a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville boolean valid = false; 784a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville try { 785a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville foregroundUser = ActivityManager.getCurrentUser(); 786a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville valid = r.callerUid == foregroundUser && (r.events & events) != 0; 787a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville if (DBG | DBG_LOC) { 788a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville Slog.d(TAG, "validateEventsAndUserLocked: valid=" + valid 789a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville + " r.callerUid=" + r.callerUid + " foregroundUser=" + foregroundUser 790a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville + " r.events=" + r.events + " events=" + events); 791a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville } 792a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville } finally { 793a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville Binder.restoreCallingIdentity(callingIdentity); 794a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville } 795a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville return valid; 796a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville } 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 798