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; 2016a16899505ec0a9ede5b76650bfb8817b3227c7Svet Ganovimport android.app.AppOpsManager; 21a12a7b3d3d8fc8678411295df4d001447b33a994Wink Savilleimport android.content.BroadcastReceiver; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent; 24a12a7b3d3d8fc8678411295df4d001447b33a994Wink Savilleimport android.content.IntentFilter; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PackageManager; 2637e65ebb7eb932e1a144b1cab262e11ca5fd109bRobert Greenwaltimport android.net.LinkProperties; 27f9cb86aebe9647e0fe0137fc198ba16c017445c6Robert Greenwaltimport android.net.NetworkCapabilities; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Binder; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle; 30a12a7b3d3d8fc8678411295df4d001447b33a994Wink Savilleimport android.os.Handler; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder; 32a12a7b3d3d8fc8678411295df4d001447b33a994Wink Savilleimport android.os.Message; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteException; 345ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackbornimport android.os.UserHandle; 35963db55d59a170f4b17ff907c96615a19ef6fe17John Wangimport android.telephony.CellInfo; 36d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yuimport android.telephony.CellLocation; 37c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuelaimport android.telephony.DisconnectCause; 38d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yuimport android.telephony.PhoneStateListener; 39c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuelaimport android.telephony.PreciseCallState; 40c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuelaimport android.telephony.PreciseDataConnectionState; 41c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuelaimport android.telephony.PreciseDisconnectCause; 42d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yuimport android.telephony.Rlog; 43d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yuimport android.telephony.ServiceState; 44d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yuimport android.telephony.SignalStrength; 45d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yuimport android.telephony.SubscriptionManager; 46d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yuimport android.telephony.TelephonyManager; 47d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yuimport android.telephony.VoLteServiceState; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.TextUtils; 49d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yuimport android.util.LocalLog; 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.app.IBatteryStats; 52d09c4cad65c708f2c4810d24295456708a2000d2Wink Savilleimport com.android.internal.telephony.IOnSubscriptionsChangedListener; 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.telephony.IPhoneStateListener; 54d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yuimport com.android.internal.telephony.ITelephonyRegistry; 555a0618ead121b258204c19b97c37cb85d4ad0856Nathan Haroldimport com.android.internal.telephony.PhoneConstantConversions; 56a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Savilleimport com.android.internal.telephony.PhoneConstants; 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.telephony.TelephonyIntents; 58fe9a53bc45fd0124a876dc0a49680aaf86641d3eJeff Sharkeyimport com.android.internal.util.DumpUtils; 59d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yuimport com.android.internal.util.IndentingPrintWriter; 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.server.am.BatteryStatsService; 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 62d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yuimport java.io.FileDescriptor; 63d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yuimport java.io.PrintWriter; 64d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yuimport java.util.ArrayList; 65d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yuimport java.util.Arrays; 66d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yuimport java.util.List; 67d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yu 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 69e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville * Since phone process can be restarted, this class provides a centralized place 70e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville * that applications can register and be called back from. 71e380b9866703355e4768a9ce163369b80842080cWink Saville * 72e380b9866703355e4768a9ce163369b80842080cWink Saville * Change-Id: I450c968bda93767554b5188ee63e10c9f43c5aa4 fixes bugs 16148026 73e380b9866703355e4768a9ce163369b80842080cWink Saville * and 15973975 by saving the phoneId of the registrant and then using the 74e380b9866703355e4768a9ce163369b80842080cWink Saville * phoneId when deciding to to make a callback. This is necessary because 75e380b9866703355e4768a9ce163369b80842080cWink Saville * a subId changes from to a dummy value when a SIM is removed and thus won't 7663f03dd94c43c22f2c77306059b5748e5e1e0e3cWink Saville * compare properly. Because SubscriptionManager.getPhoneId(int subId) handles 77e380b9866703355e4768a9ce163369b80842080cWink Saville * the dummy value conversion we properly do the callbacks. 78e380b9866703355e4768a9ce163369b80842080cWink Saville * 79e380b9866703355e4768a9ce163369b80842080cWink Saville * Eventually we may want to remove the notion of dummy value but for now this 80e380b9866703355e4768a9ce163369b80842080cWink Saville * looks like the best approach. 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass TelephonyRegistry extends ITelephonyRegistry.Stub { 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String TAG = "TelephonyRegistry"; 846d13bc8e3b1cf0dac56590a0a76e9da4a1ecab75Wink Saville private static final boolean DBG = false; // STOPSHIP if true 85fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville private static final boolean DBG_LOC = false; // STOPSHIP if true 866d13bc8e3b1cf0dac56590a0a76e9da4a1ecab75Wink Saville private static final boolean VDBG = false; // STOPSHIP if true 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static class Record { 8916a16899505ec0a9ede5b76650bfb8817b3227c7Svet Ganov String callingPackage; 90e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder binder; 92e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IPhoneStateListener callback; 94d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville IOnSubscriptionsChangedListener onSubscriptionsChangedListenerCallback; 95e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville 96309b2f63f3265c341f6a43cbca2fb25f9c38109aFyodor Kupolov int callerUserId; 97a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int events; 99a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville 100d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville int subId = SubscriptionManager.INVALID_SUBSCRIPTION_ID; 101fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville 102d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville int phoneId = SubscriptionManager.INVALID_PHONE_INDEX; 103a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville 104309b2f63f3265c341f6a43cbca2fb25f9c38109aFyodor Kupolov boolean canReadPhoneState; 105309b2f63f3265c341f6a43cbca2fb25f9c38109aFyodor Kupolov 106a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville boolean matchPhoneStateListenerEvent(int events) { 107a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville return (callback != null) && ((events & this.events) != 0); 108a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville } 109a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville 110d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville boolean matchOnSubscriptionsChangedListener() { 111d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville return (onSubscriptionsChangedListenerCallback != null); 112a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville } 113e380b9866703355e4768a9ce163369b80842080cWink Saville 114a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville @Override 115a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville public String toString() { 11616a16899505ec0a9ede5b76650bfb8817b3227c7Svet Ganov return "{callingPackage=" + callingPackage + " binder=" + binder 11716a16899505ec0a9ede5b76650bfb8817b3227c7Svet Ganov + " callback=" + callback 118d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville + " onSubscriptionsChangedListenererCallback=" 119d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville + onSubscriptionsChangedListenerCallback 120309b2f63f3265c341f6a43cbca2fb25f9c38109aFyodor Kupolov + " callerUserId=" + callerUserId + " subId=" + subId + " phoneId=" + phoneId 121309b2f63f3265c341f6a43cbca2fb25f9c38109aFyodor Kupolov + " events=" + Integer.toHexString(events) 122309b2f63f3265c341f6a43cbca2fb25f9c38109aFyodor Kupolov + " canReadPhoneState=" + canReadPhoneState + "}"; 123a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville } 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final Context mContext; 127e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville 128163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato // access should be inside synchronized (mRecords) for these two fields 129163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato private final ArrayList<IBinder> mRemoveList = new ArrayList<IBinder>(); 130163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato private final ArrayList<Record> mRecords = new ArrayList<Record>(); 131e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final IBatteryStats mBatteryStats; 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13416a16899505ec0a9ede5b76650bfb8817b3227c7Svet Ganov private final AppOpsManager mAppOps; 13516a16899505ec0a9ede5b76650bfb8817b3227c7Svet Ganov 136d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville private boolean hasNotifySubscriptionInfoChangedOccurred = false; 137d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville 138fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville private int mNumPhones; 139e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville 140fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville private int[] mCallState; 141e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville 142fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville private String[] mCallIncomingNumber; 143e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville 144fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville private ServiceState[] mServiceState; 145e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville 14612312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu private int[] mVoiceActivationState; 14712312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu 14812312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu private int[] mDataActivationState; 14912312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu 150fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville private SignalStrength[] mSignalStrength; 151e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville 152fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville private boolean[] mMessageWaiting; 153e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville 154fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville private boolean[] mCallForwarding; 155e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville 156fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville private int[] mDataActivity; 157e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville 158fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville private int[] mDataConnectionState; 159e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville 160fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville private boolean[] mDataConnectionPossible; 161e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville 162fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville private String[] mDataConnectionReason; 163fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville 16457b39e3efa35daf1e495a0e4f217c3276d691d1dYifan Bai private ArrayList<String>[] mConnectedApns; 16542acef37339afe6ac608c842f1637870ee9c4f6cRobert Greenwalt 166fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville private LinkProperties[] mDataConnectionLinkProperties; 167f61101f6266be243c481d163b95e65d67b8d1669Wink Saville 168fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville private NetworkCapabilities[] mDataConnectionNetworkCapabilities; 169e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville 170fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville private Bundle[] mCellLocation; 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 172fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville private int[] mDataConnectionNetworkType; 17398e0b146b80670b52805b4b210ef5582dad6bb68Robert Greenwalt 174016e9c6a785963770d0fa0063fa02f58d5b2851cNathan Harold private int mOtaspMode = TelephonyManager.OTASP_UNKNOWN; 175fd2d01302781af91d77557a99874111a4fee8365Wink Saville 176fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville private ArrayList<List<CellInfo>> mCellInfo = null; 177fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville 178fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville private VoLteServiceState mVoLteServiceState = new VoLteServiceState(); 179fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville 180d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville private int mDefaultSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID; 181e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe 182d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville private int mDefaultPhoneId = SubscriptionManager.INVALID_PHONE_INDEX; 183e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe 184c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela private int mRingingCallState = PreciseCallState.PRECISE_CALL_STATE_IDLE; 185c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela 186c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela private int mForegroundCallState = PreciseCallState.PRECISE_CALL_STATE_IDLE; 187c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela 188c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela private int mBackgroundCallState = PreciseCallState.PRECISE_CALL_STATE_IDLE; 189c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela 190c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela private PreciseCallState mPreciseCallState = new PreciseCallState(); 191c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela 1921f45264dd6b874d72ed901a2213c779d42d321c1Andrew Flynn private boolean mCarrierNetworkChangeState = false; 1931f45264dd6b874d72ed901a2213c779d42d321c1Andrew Flynn 194d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yu private final LocalLog mLocalLog = new LocalLog(100); 195d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yu 196c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela private PreciseDataConnectionState mPreciseDataConnectionState = 197c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela new PreciseDataConnectionState(); 198c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela 199309b2f63f3265c341f6a43cbca2fb25f9c38109aFyodor Kupolov static final int ENFORCE_PHONE_STATE_PERMISSION_MASK = 20045515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh PhoneStateListener.LISTEN_CALL_FORWARDING_INDICATOR | 201309b2f63f3265c341f6a43cbca2fb25f9c38109aFyodor Kupolov PhoneStateListener.LISTEN_MESSAGE_WAITING_INDICATOR | 202309b2f63f3265c341f6a43cbca2fb25f9c38109aFyodor Kupolov PhoneStateListener.LISTEN_VOLTE_STATE; 203309b2f63f3265c341f6a43cbca2fb25f9c38109aFyodor Kupolov 204309b2f63f3265c341f6a43cbca2fb25f9c38109aFyodor Kupolov static final int CHECK_PHONE_STATE_PERMISSION_MASK = 20545515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh PhoneStateListener.LISTEN_CALL_STATE | 20645515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh PhoneStateListener.LISTEN_DATA_ACTIVITY | 207309b2f63f3265c341f6a43cbca2fb25f9c38109aFyodor Kupolov PhoneStateListener.LISTEN_DATA_CONNECTION_STATE; 20845515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh 209c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela static final int PRECISE_PHONE_STATE_PERMISSION_MASK = 210c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela PhoneStateListener.LISTEN_PRECISE_CALL_STATE | 211c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela PhoneStateListener.LISTEN_PRECISE_DATA_CONNECTION_STATE; 212c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela 213a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville private static final int MSG_USER_SWITCHED = 1; 214fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville private static final int MSG_UPDATE_DEFAULT_SUB = 2; 215a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville 216a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville private final Handler mHandler = new Handler() { 217a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville @Override 218a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville public void handleMessage(Message msg) { 219a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville switch (msg.what) { 220a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville case MSG_USER_SWITCHED: { 221e380b9866703355e4768a9ce163369b80842080cWink Saville if (VDBG) log("MSG_USER_SWITCHED userId=" + msg.arg1); 222fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville int numPhones = TelephonyManager.getDefault().getPhoneCount(); 223fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville for (int sub = 0; sub < numPhones; sub++) { 224bc0272754df7a2fb71bf709a2a8a7c852ee69e5cWink Saville TelephonyRegistry.this.notifyCellLocationForSubscriber(sub, 225e380b9866703355e4768a9ce163369b80842080cWink Saville mCellLocation[sub]); 226fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville } 227fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville break; 228fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville } 229e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe case MSG_UPDATE_DEFAULT_SUB: { 230e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe int newDefaultPhoneId = msg.arg1; 23163f03dd94c43c22f2c77306059b5748e5e1e0e3cWink Saville int newDefaultSubId = (Integer)(msg.obj); 232e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe if (VDBG) { 233e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe log("MSG_UPDATE_DEFAULT_SUB:current mDefaultSubId=" + mDefaultSubId 234e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe + " current mDefaultPhoneId=" + mDefaultPhoneId + " newDefaultSubId= " 235e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe + newDefaultSubId + " newDefaultPhoneId=" + newDefaultPhoneId); 236e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe } 237e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe 238e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe //Due to possible risk condition,(notify call back using the new 239e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe //defaultSubId comes before new defaultSubId update) we need to recall all 240e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe //possible missed notify callback 241e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe synchronized (mRecords) { 242a33cf075fa13c29d702d6b0a2aa2ae1323c60d73Etan Cohen for (Record r : mRecords) { 243d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville if(r.subId == SubscriptionManager.DEFAULT_SUBSCRIPTION_ID) { 244a33cf075fa13c29d702d6b0a2aa2ae1323c60d73Etan Cohen checkPossibleMissNotify(r, newDefaultPhoneId); 245a33cf075fa13c29d702d6b0a2aa2ae1323c60d73Etan Cohen } 246a33cf075fa13c29d702d6b0a2aa2ae1323c60d73Etan Cohen } 247a33cf075fa13c29d702d6b0a2aa2ae1323c60d73Etan Cohen handleRemoveListLocked(); 248e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe } 249e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe mDefaultSubId = newDefaultSubId; 250e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe mDefaultPhoneId = newDefaultPhoneId; 251a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville } 252a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville } 253a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville } 254a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville }; 255a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville 256a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { 257a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville @Override 258a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville public void onReceive(Context context, Intent intent) { 259a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville String action = intent.getAction(); 260e380b9866703355e4768a9ce163369b80842080cWink Saville if (VDBG) log("mBroadcastReceiver: action=" + action); 261a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville if (Intent.ACTION_USER_SWITCHED.equals(action)) { 262eeacf9374748a5f7fc96a1beaf18c353d473d752Wink Saville int userHandle = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 0); 263f4cd25b2c867ad74f983f1bacae3925005685a69Wink Saville if (DBG) log("onReceive: userHandle=" + userHandle); 264eeacf9374748a5f7fc96a1beaf18c353d473d752Wink Saville mHandler.sendMessage(mHandler.obtainMessage(MSG_USER_SWITCHED, userHandle, 0)); 265fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville } else if (action.equals(TelephonyIntents.ACTION_DEFAULT_SUBSCRIPTION_CHANGED)) { 26663f03dd94c43c22f2c77306059b5748e5e1e0e3cWink Saville Integer newDefaultSubIdObj = new Integer(intent.getIntExtra( 2677ea3e8bf8954343d7b243b6a23bcb8339921f3c8Shishir Agrawal PhoneConstants.SUBSCRIPTION_KEY, 2687ea3e8bf8954343d7b243b6a23bcb8339921f3c8Shishir Agrawal SubscriptionManager.getDefaultSubscriptionId())); 269e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe int newDefaultPhoneId = intent.getIntExtra(PhoneConstants.SLOT_KEY, 270e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe SubscriptionManager.getPhoneId(mDefaultSubId)); 271e380b9866703355e4768a9ce163369b80842080cWink Saville if (DBG) { 272e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe log("onReceive:current mDefaultSubId=" + mDefaultSubId 273e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe + " current mDefaultPhoneId=" + mDefaultPhoneId + " newDefaultSubId= " 274e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe + newDefaultSubIdObj + " newDefaultPhoneId=" + newDefaultPhoneId); 275e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe } 276e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe 277985f52cde55a3b1b72d3fc73ffe67005d1906438Junda Liu if(validatePhoneId(newDefaultPhoneId) && (!newDefaultSubIdObj.equals(mDefaultSubId) 278e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe || (newDefaultPhoneId != mDefaultPhoneId))) { 279e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe mHandler.sendMessage(mHandler.obtainMessage(MSG_UPDATE_DEFAULT_SUB, 280e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe newDefaultPhoneId, 0, newDefaultSubIdObj)); 281e380b9866703355e4768a9ce163369b80842080cWink Saville } 282a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville } 283a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville } 284a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville }; 285a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville 286e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville // we keep a copy of all of the state so we can send it out when folks 287e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville // register for it 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // 289e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville // In these calls we call with the lock held. This is safe becasuse remote 290e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville // calls go through a oneway interface and local calls going through a 291e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville // handler before they get to app code. 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TelephonyRegistry(Context context) { 2944ef8ec3a21da69091200aeebff80dbcde336709cDavid 'Digit' Turner CellLocation location = CellLocation.getEmpty(); 2954ef8ec3a21da69091200aeebff80dbcde336709cDavid 'Digit' Turner 296fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville mContext = context; 297fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville mBatteryStats = BatteryStatsService.getService(); 298fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville 299fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville int numPhones = TelephonyManager.getDefault().getPhoneCount(); 300f4cd25b2c867ad74f983f1bacae3925005685a69Wink Saville if (DBG) log("TelephonyRegistor: ctor numPhones=" + numPhones); 301fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville mNumPhones = numPhones; 30257b39e3efa35daf1e495a0e4f217c3276d691d1dYifan Bai mConnectedApns = new ArrayList[numPhones]; 303fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville mCallState = new int[numPhones]; 304fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville mDataActivity = new int[numPhones]; 305fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville mDataConnectionState = new int[numPhones]; 306fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville mDataConnectionNetworkType = new int[numPhones]; 307fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville mCallIncomingNumber = new String[numPhones]; 308fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville mServiceState = new ServiceState[numPhones]; 30912312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu mVoiceActivationState = new int[numPhones]; 31012312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu mDataActivationState = new int[numPhones]; 311fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville mSignalStrength = new SignalStrength[numPhones]; 312fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville mMessageWaiting = new boolean[numPhones]; 313fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville mDataConnectionPossible = new boolean[numPhones]; 314fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville mDataConnectionReason = new String[numPhones]; 315fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville mCallForwarding = new boolean[numPhones]; 316fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville mCellLocation = new Bundle[numPhones]; 317fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville mDataConnectionLinkProperties = new LinkProperties[numPhones]; 318fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville mDataConnectionNetworkCapabilities = new NetworkCapabilities[numPhones]; 319fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville mCellInfo = new ArrayList<List<CellInfo>>(); 320fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville for (int i = 0; i < numPhones; i++) { 321fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville mCallState[i] = TelephonyManager.CALL_STATE_IDLE; 322fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville mDataActivity[i] = TelephonyManager.DATA_ACTIVITY_NONE; 323fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville mDataConnectionState[i] = TelephonyManager.DATA_UNKNOWN; 32412312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu mVoiceActivationState[i] = TelephonyManager.SIM_ACTIVATION_STATE_UNKNOWN; 32512312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu mDataActivationState[i] = TelephonyManager.SIM_ACTIVATION_STATE_UNKNOWN; 326fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville mCallIncomingNumber[i] = ""; 327fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville mServiceState[i] = new ServiceState(); 328fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville mSignalStrength[i] = new SignalStrength(); 329fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville mMessageWaiting[i] = false; 330fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville mCallForwarding[i] = false; 331fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville mDataConnectionPossible[i] = false; 332fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville mDataConnectionReason[i] = ""; 333fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville mCellLocation[i] = new Bundle(); 334fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville mCellInfo.add(i, null); 33557b39e3efa35daf1e495a0e4f217c3276d691d1dYifan Bai mConnectedApns[i] = new ArrayList<String>(); 336fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville } 337fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville 3384ef8ec3a21da69091200aeebff80dbcde336709cDavid 'Digit' Turner // Note that location can be null for non-phone builds like 3394ef8ec3a21da69091200aeebff80dbcde336709cDavid 'Digit' Turner // like the generic one. 3404ef8ec3a21da69091200aeebff80dbcde336709cDavid 'Digit' Turner if (location != null) { 341fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville for (int i = 0; i < numPhones; i++) { 342fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville location.fillInNotifierBundle(mCellLocation[i]); 343fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville } 3444ef8ec3a21da69091200aeebff80dbcde336709cDavid 'Digit' Turner } 34516a16899505ec0a9ede5b76650bfb8817b3227c7Svet Ganov 34616a16899505ec0a9ede5b76650bfb8817b3227c7Svet Ganov mAppOps = mContext.getSystemService(AppOpsManager.class); 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 349a00271533f639c8ed36429c663889ac9f654bc72Svetoslav Ganov public void systemRunning() { 350a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville // Watch for interesting updates 351a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville final IntentFilter filter = new IntentFilter(); 352a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville filter.addAction(Intent.ACTION_USER_SWITCHED); 353a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville filter.addAction(Intent.ACTION_USER_REMOVED); 354fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville filter.addAction(TelephonyIntents.ACTION_DEFAULT_SUBSCRIPTION_CHANGED); 355f4cd25b2c867ad74f983f1bacae3925005685a69Wink Saville log("systemRunning register for intents"); 356a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville mContext.registerReceiver(mBroadcastReceiver, filter); 357a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville } 358a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville 359a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville @Override 36016a16899505ec0a9ede5b76650bfb8817b3227c7Svet Ganov public void addOnSubscriptionsChangedListener(String callingPackage, 361d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville IOnSubscriptionsChangedListener callback) { 362309b2f63f3265c341f6a43cbca2fb25f9c38109aFyodor Kupolov int callerUserId = UserHandle.getCallingUserId(); 363a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville if (VDBG) { 364309b2f63f3265c341f6a43cbca2fb25f9c38109aFyodor Kupolov log("listen oscl: E pkg=" + callingPackage + " myUserId=" + UserHandle.myUserId() 365309b2f63f3265c341f6a43cbca2fb25f9c38109aFyodor Kupolov + " callerUserId=" + callerUserId + " callback=" + callback 366a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville + " callback.asBinder=" + callback.asBinder()); 367a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville } 368a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville 3691cfd45701bca2be5ddabf9d523c8183a482fee00Amit Mahajan try { 370a9e72a7653d25ae1974dac3f1156d126c807e40cAmit Mahajan mContext.enforceCallingOrSelfPermission( 3711cfd45701bca2be5ddabf9d523c8183a482fee00Amit Mahajan android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, 3721cfd45701bca2be5ddabf9d523c8183a482fee00Amit Mahajan "addOnSubscriptionsChangedListener"); 373a9e72a7653d25ae1974dac3f1156d126c807e40cAmit Mahajan // SKIP checking for run-time permission since caller or self has PRIVILEGED permission 3741cfd45701bca2be5ddabf9d523c8183a482fee00Amit Mahajan } catch (SecurityException e) { 3751cfd45701bca2be5ddabf9d523c8183a482fee00Amit Mahajan mContext.enforceCallingOrSelfPermission( 3761cfd45701bca2be5ddabf9d523c8183a482fee00Amit Mahajan android.Manifest.permission.READ_PHONE_STATE, 3771cfd45701bca2be5ddabf9d523c8183a482fee00Amit Mahajan "addOnSubscriptionsChangedListener"); 37816a16899505ec0a9ede5b76650bfb8817b3227c7Svet Ganov 3791cfd45701bca2be5ddabf9d523c8183a482fee00Amit Mahajan if (mAppOps.noteOp(AppOpsManager.OP_READ_PHONE_STATE, Binder.getCallingUid(), 3801cfd45701bca2be5ddabf9d523c8183a482fee00Amit Mahajan callingPackage) != AppOpsManager.MODE_ALLOWED) { 3811cfd45701bca2be5ddabf9d523c8183a482fee00Amit Mahajan return; 3821cfd45701bca2be5ddabf9d523c8183a482fee00Amit Mahajan } 38316a16899505ec0a9ede5b76650bfb8817b3227c7Svet Ganov } 38416a16899505ec0a9ede5b76650bfb8817b3227c7Svet Ganov 385ac038a9ef3e352ddfe527ec9e053fcdc5b36a123Fyodor Kupolov Record r; 386a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville 387d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville synchronized (mRecords) { 388d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville // register 389d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville find_and_add: { 390d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville IBinder b = callback.asBinder(); 391d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville final int N = mRecords.size(); 392d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville for (int i = 0; i < N; i++) { 393d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville r = mRecords.get(i); 394d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville if (b == r.binder) { 395d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville break find_and_add; 396a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville } 3972d1ee982276f5dbd0e035778b731b48e4ef34515Wink Saville } 398d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville r = new Record(); 399d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville r.binder = b; 400d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville mRecords.add(r); 401d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville if (DBG) log("listen oscl: add new record"); 402baf21da1e17ef358632c078128d381b3be218a08Wink Saville } 4032d1ee982276f5dbd0e035778b731b48e4ef34515Wink Saville 404d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville r.onSubscriptionsChangedListenerCallback = callback; 40516a16899505ec0a9ede5b76650bfb8817b3227c7Svet Ganov r.callingPackage = callingPackage; 406309b2f63f3265c341f6a43cbca2fb25f9c38109aFyodor Kupolov r.callerUserId = callerUserId; 407d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville r.events = 0; 408309b2f63f3265c341f6a43cbca2fb25f9c38109aFyodor Kupolov r.canReadPhoneState = true; // permission has been enforced above 409d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville if (DBG) { 410d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville log("listen oscl: Register r=" + r); 411d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville } 412d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville // Always notify when registration occurs if there has been a notification. 413d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville if (hasNotifySubscriptionInfoChangedOccurred) { 414a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville try { 415d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville if (VDBG) log("listen oscl: send to r=" + r); 416d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville r.onSubscriptionsChangedListenerCallback.onSubscriptionsChanged(); 417d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville if (VDBG) log("listen oscl: sent to r=" + r); 418a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville } catch (RemoteException e) { 419d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville if (VDBG) log("listen oscl: remote exception sending to r=" + r + " e=" + e); 420a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville remove(r.binder); 421a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville } 422d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville } else { 423d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville log("listen oscl: hasNotifySubscriptionInfoChangedOccurred==false no callback"); 424a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville } 425a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville } 426a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville } 427a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville 428a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville @Override 429071743f0cbbfab36150db6ec945452579d02e8ddWink Saville public void removeOnSubscriptionsChangedListener(String pkgForDebug, 430d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville IOnSubscriptionsChangedListener callback) { 431d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville if (DBG) log("listen oscl: Unregister"); 432a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville remove(callback.asBinder()); 433a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville } 434a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville 435a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville @Override 436a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville public void notifySubscriptionInfoChanged() { 437a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville if (VDBG) log("notifySubscriptionInfoChanged:"); 438a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville synchronized (mRecords) { 439d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville if (!hasNotifySubscriptionInfoChangedOccurred) { 440d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville log("notifySubscriptionInfoChanged: first invocation mRecords.size=" 441d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville + mRecords.size()); 442d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville } 443d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville hasNotifySubscriptionInfoChangedOccurred = true; 444a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville mRemoveList.clear(); 445a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville for (Record r : mRecords) { 446d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville if (r.matchOnSubscriptionsChangedListener()) { 447a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville try { 448d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville if (VDBG) log("notifySubscriptionInfoChanged: call osc to r=" + r); 449d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville r.onSubscriptionsChangedListenerCallback.onSubscriptionsChanged(); 450d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville if (VDBG) log("notifySubscriptionInfoChanged: done osc to r=" + r); 451a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville } catch (RemoteException ex) { 452a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville if (VDBG) log("notifySubscriptionInfoChanged: RemoteException r=" + r); 453a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville mRemoveList.add(r.binder); 454a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville } 455a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville } 456a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville } 457a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville handleRemoveListLocked(); 458a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville } 459a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville } 460a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville 461a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville @Override 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void listen(String pkgForDebug, IPhoneStateListener callback, int events, 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean notifyNow) { 464d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville listenForSubscriber(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID, pkgForDebug, callback, 465d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville events, notifyNow); 466fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville } 467fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville 468fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville @Override 46963f03dd94c43c22f2c77306059b5748e5e1e0e3cWink Saville public void listenForSubscriber(int subId, String pkgForDebug, IPhoneStateListener callback, 470fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville int events, boolean notifyNow) { 47143c50293490ba7efb0f97a1e45b07c92aeafa61exinhe listen(pkgForDebug, callback, events, notifyNow, subId); 472fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville } 473fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville 47416a16899505ec0a9ede5b76650bfb8817b3227c7Svet Ganov private void listen(String callingPackage, IPhoneStateListener callback, int events, 47563f03dd94c43c22f2c77306059b5748e5e1e0e3cWink Saville boolean notifyNow, int subId) { 476309b2f63f3265c341f6a43cbca2fb25f9c38109aFyodor Kupolov int callerUserId = UserHandle.getCallingUserId(); 477e380b9866703355e4768a9ce163369b80842080cWink Saville if (VDBG) { 47816a16899505ec0a9ede5b76650bfb8817b3227c7Svet Ganov log("listen: E pkg=" + callingPackage + " events=0x" + Integer.toHexString(events) 479309b2f63f3265c341f6a43cbca2fb25f9c38109aFyodor Kupolov + " notifyNow=" + notifyNow + " subId=" + subId + " myUserId=" 480309b2f63f3265c341f6a43cbca2fb25f9c38109aFyodor Kupolov + UserHandle.myUserId() + " callerUserId=" + callerUserId); 481a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville } 48275c2c159ebad467d29401fb6cbb3f094a010073axinhe 48375c2c159ebad467d29401fb6cbb3f094a010073axinhe if (events != PhoneStateListener.LISTEN_NONE) { 48445515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh /* Checks permission and throws Security exception */ 48545515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh checkListenerPermission(events); 48616a16899505ec0a9ede5b76650bfb8817b3227c7Svet Ganov 487309b2f63f3265c341f6a43cbca2fb25f9c38109aFyodor Kupolov if ((events & ENFORCE_PHONE_STATE_PERMISSION_MASK) != 0) { 4881cfd45701bca2be5ddabf9d523c8183a482fee00Amit Mahajan try { 489a9e72a7653d25ae1974dac3f1156d126c807e40cAmit Mahajan mContext.enforceCallingOrSelfPermission( 4901cfd45701bca2be5ddabf9d523c8183a482fee00Amit Mahajan android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, null); 491a9e72a7653d25ae1974dac3f1156d126c807e40cAmit Mahajan // SKIP checking for run-time permission since caller or self has PRIVILEGED 492a9e72a7653d25ae1974dac3f1156d126c807e40cAmit Mahajan // permission 4931cfd45701bca2be5ddabf9d523c8183a482fee00Amit Mahajan } catch (SecurityException e) { 4941cfd45701bca2be5ddabf9d523c8183a482fee00Amit Mahajan if (mAppOps.noteOp(AppOpsManager.OP_READ_PHONE_STATE, Binder.getCallingUid(), 4951cfd45701bca2be5ddabf9d523c8183a482fee00Amit Mahajan callingPackage) != AppOpsManager.MODE_ALLOWED) { 4961cfd45701bca2be5ddabf9d523c8183a482fee00Amit Mahajan return; 4971cfd45701bca2be5ddabf9d523c8183a482fee00Amit Mahajan } 49816a16899505ec0a9ede5b76650bfb8817b3227c7Svet Ganov } 49916a16899505ec0a9ede5b76650bfb8817b3227c7Svet Ganov } 50016a16899505ec0a9ede5b76650bfb8817b3227c7Svet Ganov 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mRecords) { 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // register 503309b2f63f3265c341f6a43cbca2fb25f9c38109aFyodor Kupolov Record r; 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project find_and_add: { 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder b = callback.asBinder(); 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = mRecords.size(); 507e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville for (int i = 0; i < N; i++) { 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r = mRecords.get(i); 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (b == r.binder) { 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break find_and_add; 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r = new Record(); 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.binder = b; 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecords.add(r); 516e380b9866703355e4768a9ce163369b80842080cWink Saville if (DBG) log("listen: add new record"); 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 51843c50293490ba7efb0f97a1e45b07c92aeafa61exinhe 51975c2c159ebad467d29401fb6cbb3f094a010073axinhe r.callback = callback; 52016a16899505ec0a9ede5b76650bfb8817b3227c7Svet Ganov r.callingPackage = callingPackage; 521309b2f63f3265c341f6a43cbca2fb25f9c38109aFyodor Kupolov r.callerUserId = callerUserId; 522309b2f63f3265c341f6a43cbca2fb25f9c38109aFyodor Kupolov boolean isPhoneStateEvent = (events & (CHECK_PHONE_STATE_PERMISSION_MASK 523309b2f63f3265c341f6a43cbca2fb25f9c38109aFyodor Kupolov | ENFORCE_PHONE_STATE_PERMISSION_MASK)) != 0; 524309b2f63f3265c341f6a43cbca2fb25f9c38109aFyodor Kupolov r.canReadPhoneState = isPhoneStateEvent && canReadPhoneState(callingPackage); 52575c2c159ebad467d29401fb6cbb3f094a010073axinhe // Legacy applications pass SubscriptionManager.DEFAULT_SUB_ID, 52675c2c159ebad467d29401fb6cbb3f094a010073axinhe // force all illegal subId to SubscriptionManager.DEFAULT_SUB_ID 527a54bf6583380cf328b9858d942b4c387c6163f0fWink Saville if (!SubscriptionManager.isValidSubscriptionId(subId)) { 528d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville r.subId = SubscriptionManager.DEFAULT_SUBSCRIPTION_ID; 52975c2c159ebad467d29401fb6cbb3f094a010073axinhe } else {//APP specify subID 53075c2c159ebad467d29401fb6cbb3f094a010073axinhe r.subId = subId; 53175c2c159ebad467d29401fb6cbb3f094a010073axinhe } 53275c2c159ebad467d29401fb6cbb3f094a010073axinhe r.phoneId = SubscriptionManager.getPhoneId(r.subId); 53375c2c159ebad467d29401fb6cbb3f094a010073axinhe 53443c50293490ba7efb0f97a1e45b07c92aeafa61exinhe int phoneId = r.phoneId; 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.events = events; 536e380b9866703355e4768a9ce163369b80842080cWink Saville if (DBG) { 53775c2c159ebad467d29401fb6cbb3f094a010073axinhe log("listen: Register r=" + r + " r.subId=" + r.subId + " phoneId=" + phoneId); 538e380b9866703355e4768a9ce163369b80842080cWink Saville } 539fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville if (notifyNow && validatePhoneId(phoneId)) { 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((events & PhoneStateListener.LISTEN_SERVICE_STATE) != 0) { 541163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato try { 542e380b9866703355e4768a9ce163369b80842080cWink Saville if (VDBG) log("listen: call onSSC state=" + mServiceState[phoneId]); 543fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville r.callback.onServiceStateChanged( 544fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville new ServiceState(mServiceState[phoneId])); 545163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato } catch (RemoteException ex) { 546163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato remove(r.binder); 547163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato } 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((events & PhoneStateListener.LISTEN_SIGNAL_STRENGTH) != 0) { 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 551fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville int gsmSignalStrength = mSignalStrength[phoneId] 552fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville .getGsmSignalStrength(); 553e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville r.callback.onSignalStrengthChanged((gsmSignalStrength == 99 ? -1 554e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville : gsmSignalStrength)); 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException ex) { 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remove(r.binder); 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((events & PhoneStateListener.LISTEN_MESSAGE_WAITING_INDICATOR) != 0) { 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 561fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville r.callback.onMessageWaitingIndicatorChanged( 562fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville mMessageWaiting[phoneId]); 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException ex) { 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remove(r.binder); 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((events & PhoneStateListener.LISTEN_CALL_FORWARDING_INDICATOR) != 0) { 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 569fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville r.callback.onCallForwardingIndicatorChanged( 570fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville mCallForwarding[phoneId]); 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException ex) { 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remove(r.binder); 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 575a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville if (validateEventsAndUserLocked(r, PhoneStateListener.LISTEN_CELL_LOCATION)) { 576163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato try { 577f4cd25b2c867ad74f983f1bacae3925005685a69Wink Saville if (DBG_LOC) log("listen: mCellLocation = " 578fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville + mCellLocation[phoneId]); 579fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville r.callback.onCellLocationChanged( 580fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville new Bundle(mCellLocation[phoneId])); 581163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato } catch (RemoteException ex) { 582163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato remove(r.binder); 583163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato } 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((events & PhoneStateListener.LISTEN_CALL_STATE) != 0) { 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 587fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville r.callback.onCallStateChanged(mCallState[phoneId], 588309b2f63f3265c341f6a43cbca2fb25f9c38109aFyodor Kupolov getCallIncomingNumber(r, phoneId)); 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException ex) { 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remove(r.binder); 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((events & PhoneStateListener.LISTEN_DATA_CONNECTION_STATE) != 0) { 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 595fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville r.callback.onDataConnectionStateChanged(mDataConnectionState[phoneId], 596fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville mDataConnectionNetworkType[phoneId]); 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException ex) { 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remove(r.binder); 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((events & PhoneStateListener.LISTEN_DATA_ACTIVITY) != 0) { 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 603fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville r.callback.onDataActivity(mDataActivity[phoneId]); 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException ex) { 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remove(r.binder); 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 608e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville if ((events & PhoneStateListener.LISTEN_SIGNAL_STRENGTHS) != 0) { 609e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville try { 610fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville r.callback.onSignalStrengthsChanged(mSignalStrength[phoneId]); 611e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville } catch (RemoteException ex) { 612e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville remove(r.binder); 613e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville } 614e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville } 615fd2d01302781af91d77557a99874111a4fee8365Wink Saville if ((events & PhoneStateListener.LISTEN_OTASP_CHANGED) != 0) { 616fd2d01302781af91d77557a99874111a4fee8365Wink Saville try { 617fd2d01302781af91d77557a99874111a4fee8365Wink Saville r.callback.onOtaspChanged(mOtaspMode); 618fd2d01302781af91d77557a99874111a4fee8365Wink Saville } catch (RemoteException ex) { 619fd2d01302781af91d77557a99874111a4fee8365Wink Saville remove(r.binder); 620fd2d01302781af91d77557a99874111a4fee8365Wink Saville } 621fd2d01302781af91d77557a99874111a4fee8365Wink Saville } 622a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville if (validateEventsAndUserLocked(r, PhoneStateListener.LISTEN_CELL_INFO)) { 623963db55d59a170f4b17ff907c96615a19ef6fe17John Wang try { 624f4cd25b2c867ad74f983f1bacae3925005685a69Wink Saville if (DBG_LOC) log("listen: mCellInfo[" + phoneId + "] = " 625fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville + mCellInfo.get(phoneId)); 626fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville r.callback.onCellInfoChanged(mCellInfo.get(phoneId)); 627963db55d59a170f4b17ff907c96615a19ef6fe17John Wang } catch (RemoteException ex) { 628963db55d59a170f4b17ff907c96615a19ef6fe17John Wang remove(r.binder); 629963db55d59a170f4b17ff907c96615a19ef6fe17John Wang } 630963db55d59a170f4b17ff907c96615a19ef6fe17John Wang } 631c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela if ((events & PhoneStateListener.LISTEN_PRECISE_CALL_STATE) != 0) { 632c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela try { 633c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela r.callback.onPreciseCallStateChanged(mPreciseCallState); 634c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela } catch (RemoteException ex) { 635c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela remove(r.binder); 636c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela } 637c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela } 638c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela if ((events & PhoneStateListener.LISTEN_PRECISE_DATA_CONNECTION_STATE) != 0) { 639c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela try { 640c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela r.callback.onPreciseDataConnectionStateChanged( 641c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela mPreciseDataConnectionState); 642c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela } catch (RemoteException ex) { 643c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela remove(r.binder); 644c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela } 645c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela } 6461f45264dd6b874d72ed901a2213c779d42d321c1Andrew Flynn if ((events & PhoneStateListener.LISTEN_CARRIER_NETWORK_CHANGE) != 0) { 6471f45264dd6b874d72ed901a2213c779d42d321c1Andrew Flynn try { 6481f45264dd6b874d72ed901a2213c779d42d321c1Andrew Flynn r.callback.onCarrierNetworkChange(mCarrierNetworkChangeState); 6491f45264dd6b874d72ed901a2213c779d42d321c1Andrew Flynn } catch (RemoteException ex) { 6501f45264dd6b874d72ed901a2213c779d42d321c1Andrew Flynn remove(r.binder); 6511f45264dd6b874d72ed901a2213c779d42d321c1Andrew Flynn } 6521f45264dd6b874d72ed901a2213c779d42d321c1Andrew Flynn } 65312312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu if ((events & PhoneStateListener.LISTEN_VOICE_ACTIVATION_STATE) !=0) { 65412312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu try { 65512312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu r.callback.onVoiceActivationStateChanged(mVoiceActivationState[phoneId]); 65612312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu } catch (RemoteException ex) { 65712312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu remove(r.binder); 65812312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu } 65912312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu } 66012312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu if ((events & PhoneStateListener.LISTEN_DATA_ACTIVATION_STATE) !=0) { 66112312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu try { 66212312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu r.callback.onDataActivationStateChanged(mDataActivationState[phoneId]); 66312312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu } catch (RemoteException ex) { 66412312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu remove(r.binder); 66512312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu } 66612312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu } 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 67075c2c159ebad467d29401fb6cbb3f094a010073axinhe if(DBG) log("listen: Unregister"); 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project remove(callback.asBinder()); 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 675309b2f63f3265c341f6a43cbca2fb25f9c38109aFyodor Kupolov private boolean canReadPhoneState(String callingPackage) { 676a9e72a7653d25ae1974dac3f1156d126c807e40cAmit Mahajan if (mContext.checkCallingOrSelfPermission( 6771cfd45701bca2be5ddabf9d523c8183a482fee00Amit Mahajan android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) == 6781cfd45701bca2be5ddabf9d523c8183a482fee00Amit Mahajan PackageManager.PERMISSION_GRANTED) { 679a9e72a7653d25ae1974dac3f1156d126c807e40cAmit Mahajan // SKIP checking for run-time permission since caller or self has PRIVILEGED permission 6801cfd45701bca2be5ddabf9d523c8183a482fee00Amit Mahajan return true; 6811cfd45701bca2be5ddabf9d523c8183a482fee00Amit Mahajan } 682309b2f63f3265c341f6a43cbca2fb25f9c38109aFyodor Kupolov boolean canReadPhoneState = mContext.checkCallingOrSelfPermission( 683309b2f63f3265c341f6a43cbca2fb25f9c38109aFyodor Kupolov android.Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED; 684309b2f63f3265c341f6a43cbca2fb25f9c38109aFyodor Kupolov if (canReadPhoneState && 685309b2f63f3265c341f6a43cbca2fb25f9c38109aFyodor Kupolov mAppOps.noteOp(AppOpsManager.OP_READ_PHONE_STATE, Binder.getCallingUid(), 686309b2f63f3265c341f6a43cbca2fb25f9c38109aFyodor Kupolov callingPackage) != AppOpsManager.MODE_ALLOWED) { 687309b2f63f3265c341f6a43cbca2fb25f9c38109aFyodor Kupolov return false; 688309b2f63f3265c341f6a43cbca2fb25f9c38109aFyodor Kupolov } 689309b2f63f3265c341f6a43cbca2fb25f9c38109aFyodor Kupolov return canReadPhoneState; 690309b2f63f3265c341f6a43cbca2fb25f9c38109aFyodor Kupolov } 691309b2f63f3265c341f6a43cbca2fb25f9c38109aFyodor Kupolov 692309b2f63f3265c341f6a43cbca2fb25f9c38109aFyodor Kupolov private String getCallIncomingNumber(Record record, int phoneId) { 693309b2f63f3265c341f6a43cbca2fb25f9c38109aFyodor Kupolov // Hide the number if record's process has no READ_PHONE_STATE permission 694309b2f63f3265c341f6a43cbca2fb25f9c38109aFyodor Kupolov return record.canReadPhoneState ? mCallIncomingNumber[phoneId] : ""; 695309b2f63f3265c341f6a43cbca2fb25f9c38109aFyodor Kupolov } 696309b2f63f3265c341f6a43cbca2fb25f9c38109aFyodor Kupolov 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void remove(IBinder binder) { 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mRecords) { 699e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville final int recordCount = mRecords.size(); 700e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville for (int i = 0; i < recordCount; i++) { 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mRecords.get(i).binder == binder) { 702ac11ae91c7c926e792a35eb66e71e9f3b5cf4f93xinhe if (DBG) { 703ac11ae91c7c926e792a35eb66e71e9f3b5cf4f93xinhe Record r = mRecords.get(i); 70416a16899505ec0a9ede5b76650bfb8817b3227c7Svet Ganov log("remove: binder=" + binder + "r.callingPackage" + r.callingPackage 705ac11ae91c7c926e792a35eb66e71e9f3b5cf4f93xinhe + "r.callback" + r.callback); 706ac11ae91c7c926e792a35eb66e71e9f3b5cf4f93xinhe } 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRecords.remove(i); 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void notifyCallState(int state, String incomingNumber) { 71545515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh if (!checkNotifyPermission("notifyCallState()")) { 716ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project return; 717ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 71843c50293490ba7efb0f97a1e45b07c92aeafa61exinhe 71943c50293490ba7efb0f97a1e45b07c92aeafa61exinhe if (VDBG) { 72043c50293490ba7efb0f97a1e45b07c92aeafa61exinhe log("notifyCallState: state=" + state + " incomingNumber=" + incomingNumber); 72143c50293490ba7efb0f97a1e45b07c92aeafa61exinhe } 72243c50293490ba7efb0f97a1e45b07c92aeafa61exinhe 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mRecords) { 72402648a4b8422733ed401f07edf8e426318bb2f8dRobert Greenwalt for (Record r : mRecords) { 725a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville if (r.matchPhoneStateListenerEvent(PhoneStateListener.LISTEN_CALL_STATE) && 726d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville (r.subId == SubscriptionManager.DEFAULT_SUBSCRIPTION_ID)) { 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 728309b2f63f3265c341f6a43cbca2fb25f9c38109aFyodor Kupolov String incomingNumberOrEmpty = r.canReadPhoneState ? incomingNumber : ""; 729309b2f63f3265c341f6a43cbca2fb25f9c38109aFyodor Kupolov r.callback.onCallStateChanged(state, incomingNumberOrEmpty); 7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException ex) { 731163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato mRemoveList.add(r.binder); 7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 735163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato handleRemoveListLocked(); 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 737f7e59c1f618d20b79df6e936b9daedaa7c1b4d3dShishir Agrawal 738f7e59c1f618d20b79df6e936b9daedaa7c1b4d3dShishir Agrawal // Called only by Telecomm to communicate call state across different phone accounts. So 739f7e59c1f618d20b79df6e936b9daedaa7c1b4d3dShishir Agrawal // there is no need to add a valid subId or slotId. 740d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville broadcastCallStateChanged(state, incomingNumber, 741f7e59c1f618d20b79df6e936b9daedaa7c1b4d3dShishir Agrawal SubscriptionManager.INVALID_PHONE_INDEX, 74261a3ab090f4b1edf0cb2c4ceae585a54ab613337Sharvil Nanavati SubscriptionManager.INVALID_SUBSCRIPTION_ID); 743fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville } 744fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville 745f7e59c1f618d20b79df6e936b9daedaa7c1b4d3dShishir Agrawal public void notifyCallStateForPhoneId(int phoneId, int subId, int state, 746f7e59c1f618d20b79df6e936b9daedaa7c1b4d3dShishir Agrawal String incomingNumber) { 747fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville if (!checkNotifyPermission("notifyCallState()")) { 748fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville return; 749fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville } 750e380b9866703355e4768a9ce163369b80842080cWink Saville if (VDBG) { 751f7e59c1f618d20b79df6e936b9daedaa7c1b4d3dShishir Agrawal log("notifyCallStateForPhoneId: subId=" + subId 752fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville + " state=" + state + " incomingNumber=" + incomingNumber); 753fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville } 754fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville synchronized (mRecords) { 755fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville if (validatePhoneId(phoneId)) { 756fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville mCallState[phoneId] = state; 757fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville mCallIncomingNumber[phoneId] = incomingNumber; 758fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville for (Record r : mRecords) { 759a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville if (r.matchPhoneStateListenerEvent(PhoneStateListener.LISTEN_CALL_STATE) && 76043c50293490ba7efb0f97a1e45b07c92aeafa61exinhe (r.subId == subId) && 761d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville (r.subId != SubscriptionManager.DEFAULT_SUBSCRIPTION_ID)) { 762fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville try { 763309b2f63f3265c341f6a43cbca2fb25f9c38109aFyodor Kupolov String incomingNumberOrEmpty = getCallIncomingNumber(r, phoneId); 764309b2f63f3265c341f6a43cbca2fb25f9c38109aFyodor Kupolov r.callback.onCallStateChanged(state, incomingNumberOrEmpty); 765fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville } catch (RemoteException ex) { 766fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville mRemoveList.add(r.binder); 767fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville } 768fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville } 769fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville } 770fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville } 771fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville handleRemoveListLocked(); 772fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville } 773f7e59c1f618d20b79df6e936b9daedaa7c1b4d3dShishir Agrawal broadcastCallStateChanged(state, incomingNumber, phoneId, subId); 7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 77663f03dd94c43c22f2c77306059b5748e5e1e0e3cWink Saville public void notifyServiceStateForPhoneId(int phoneId, int subId, ServiceState state) { 77745515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh if (!checkNotifyPermission("notifyServiceState()")){ 778ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project return; 779e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville } 78043c50293490ba7efb0f97a1e45b07c92aeafa61exinhe 7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mRecords) { 782d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yu String str = "notifyServiceStateForSubscriber: subId=" + subId + " phoneId=" + phoneId 783d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yu + " state=" + state; 784e380b9866703355e4768a9ce163369b80842080cWink Saville if (VDBG) { 785d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yu log(str); 78647d8d1b0a8641a1c346da39f5052ae5aa845d117Wink Saville } 787d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yu mLocalLog.log(str); 788fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville if (validatePhoneId(phoneId)) { 789fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville mServiceState[phoneId] = state; 79047d8d1b0a8641a1c346da39f5052ae5aa845d117Wink Saville 791fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville for (Record r : mRecords) { 792e380b9866703355e4768a9ce163369b80842080cWink Saville if (VDBG) { 793bc0272754df7a2fb71bf709a2a8a7c852ee69e5cWink Saville log("notifyServiceStateForSubscriber: r=" + r + " subId=" + subId 794e380b9866703355e4768a9ce163369b80842080cWink Saville + " phoneId=" + phoneId + " state=" + state); 795e380b9866703355e4768a9ce163369b80842080cWink Saville } 796a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville if (r.matchPhoneStateListenerEvent(PhoneStateListener.LISTEN_SERVICE_STATE) && 7978b79fb6065370100c5a9e9b08458d932048dbb91xinhe idMatch(r.subId, subId, phoneId)) { 798fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville try { 799e380b9866703355e4768a9ce163369b80842080cWink Saville if (DBG) { 800bc0272754df7a2fb71bf709a2a8a7c852ee69e5cWink Saville log("notifyServiceStateForSubscriber: callback.onSSC r=" + r 801e380b9866703355e4768a9ce163369b80842080cWink Saville + " subId=" + subId + " phoneId=" + phoneId 802e380b9866703355e4768a9ce163369b80842080cWink Saville + " state=" + state); 803e380b9866703355e4768a9ce163369b80842080cWink Saville } 804fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville r.callback.onServiceStateChanged(new ServiceState(state)); 805fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville } catch (RemoteException ex) { 806fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville mRemoveList.add(r.binder); 807fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville } 808163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato } 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 810fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville } else { 811bc0272754df7a2fb71bf709a2a8a7c852ee69e5cWink Saville log("notifyServiceStateForSubscriber: INVALID phoneId=" + phoneId); 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 813163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato handleRemoveListLocked(); 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 815f7e59c1f618d20b79df6e936b9daedaa7c1b4d3dShishir Agrawal broadcastServiceStateChanged(state, phoneId, subId); 816fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville } 817fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville 81812312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu public void notifySimActivationStateChangedForPhoneId(int phoneId, int subId, 81912312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu int activationType, int activationState) { 82012312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu if (!checkNotifyPermission("notifySimActivationState()")){ 82112312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu return; 82212312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu } 82312312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu if (VDBG) { 82412312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu log("notifySimActivationStateForPhoneId: subId=" + subId + " phoneId=" + phoneId 82512312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu + "type=" + activationType + " state=" + activationState); 82612312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu } 82712312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu synchronized (mRecords) { 82812312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu if (validatePhoneId(phoneId)) { 82912312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu switch (activationType) { 83012312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu case PhoneConstants.SIM_ACTIVATION_TYPE_VOICE: 83112312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu mVoiceActivationState[phoneId] = activationState; 83212312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu break; 83312312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu case PhoneConstants.SIM_ACTIVATION_TYPE_DATA: 83412312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu mDataActivationState[phoneId] = activationState; 83512312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu break; 83612312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu default: 83712312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu return; 83812312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu } 83912312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu for (Record r : mRecords) { 84012312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu if (VDBG) { 84112312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu log("notifySimActivationStateForPhoneId: r=" + r + " subId=" + subId 84212312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu + " phoneId=" + phoneId + "type=" + activationType 84312312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu + " state=" + activationState); 84412312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu } 84512312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu try { 84612312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu if ((activationType == PhoneConstants.SIM_ACTIVATION_TYPE_VOICE) && 84712312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu r.matchPhoneStateListenerEvent( 84812312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu PhoneStateListener.LISTEN_VOICE_ACTIVATION_STATE) && 84912312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu idMatch(r.subId, subId, phoneId)) { 85012312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu if (DBG) { 85112312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu log("notifyVoiceActivationStateForPhoneId: callback.onVASC r=" + r 85212312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu + " subId=" + subId + " phoneId=" + phoneId 85312312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu + " state=" + activationState); 85412312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu } 85512312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu r.callback.onVoiceActivationStateChanged(activationState); 85612312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu } 85712312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu if ((activationType == PhoneConstants.SIM_ACTIVATION_TYPE_DATA) && 85812312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu r.matchPhoneStateListenerEvent( 85912312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu PhoneStateListener.LISTEN_DATA_ACTIVATION_STATE) && 86012312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu idMatch(r.subId, subId, phoneId)) { 86112312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu if (DBG) { 86212312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu log("notifyDataActivationStateForPhoneId: callback.onDASC r=" + r 86312312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu + " subId=" + subId + " phoneId=" + phoneId 86412312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu + " state=" + activationState); 86512312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu } 86612312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu r.callback.onDataActivationStateChanged(activationState); 86712312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu } 86812312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu } catch (RemoteException ex) { 86912312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu mRemoveList.add(r.binder); 87012312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu } 87112312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu } 87212312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu } else { 87312312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu log("notifySimActivationStateForPhoneId: INVALID phoneId=" + phoneId); 87412312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu } 87512312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu handleRemoveListLocked(); 87612312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu } 87712312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu } 87812312f6d758ab0fcd1b5a1c7c885cf4997098402fionaxu 879f7e59c1f618d20b79df6e936b9daedaa7c1b4d3dShishir Agrawal public void notifySignalStrengthForPhoneId(int phoneId, int subId, 880f7e59c1f618d20b79df6e936b9daedaa7c1b4d3dShishir Agrawal SignalStrength signalStrength) { 88145515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh if (!checkNotifyPermission("notifySignalStrength()")) { 882ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project return; 883e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville } 8841466a9c16c2e3bf2a230028d4ac644134cf7ae15Amit Mahajan if (VDBG) { 885f7e59c1f618d20b79df6e936b9daedaa7c1b4d3dShishir Agrawal log("notifySignalStrengthForPhoneId: subId=" + subId 886f7e59c1f618d20b79df6e936b9daedaa7c1b4d3dShishir Agrawal +" phoneId=" + phoneId + " signalStrength=" + signalStrength); 8871466a9c16c2e3bf2a230028d4ac644134cf7ae15Amit Mahajan } 888f7e59c1f618d20b79df6e936b9daedaa7c1b4d3dShishir Agrawal 8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mRecords) { 890fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville if (validatePhoneId(phoneId)) { 891f7e59c1f618d20b79df6e936b9daedaa7c1b4d3dShishir Agrawal if (VDBG) log("notifySignalStrengthForPhoneId: valid phoneId=" + phoneId); 892fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville mSignalStrength[phoneId] = signalStrength; 893fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville for (Record r : mRecords) { 8941466a9c16c2e3bf2a230028d4ac644134cf7ae15Amit Mahajan if (VDBG) { 895f7e59c1f618d20b79df6e936b9daedaa7c1b4d3dShishir Agrawal log("notifySignalStrengthForPhoneId: r=" + r + " subId=" + subId 8961466a9c16c2e3bf2a230028d4ac644134cf7ae15Amit Mahajan + " phoneId=" + phoneId + " ss=" + signalStrength); 8971466a9c16c2e3bf2a230028d4ac644134cf7ae15Amit Mahajan } 898a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville if (r.matchPhoneStateListenerEvent( 899a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville PhoneStateListener.LISTEN_SIGNAL_STRENGTHS) && 9008b79fb6065370100c5a9e9b08458d932048dbb91xinhe idMatch(r.subId, subId, phoneId)) { 901fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville try { 9021466a9c16c2e3bf2a230028d4ac644134cf7ae15Amit Mahajan if (DBG) { 903f7e59c1f618d20b79df6e936b9daedaa7c1b4d3dShishir Agrawal log("notifySignalStrengthForPhoneId: callback.onSsS r=" + r 9041466a9c16c2e3bf2a230028d4ac644134cf7ae15Amit Mahajan + " subId=" + subId + " phoneId=" + phoneId 9051466a9c16c2e3bf2a230028d4ac644134cf7ae15Amit Mahajan + " ss=" + signalStrength); 9061466a9c16c2e3bf2a230028d4ac644134cf7ae15Amit Mahajan } 907fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville r.callback.onSignalStrengthsChanged(new SignalStrength(signalStrength)); 908fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville } catch (RemoteException ex) { 909fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville mRemoveList.add(r.binder); 910fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville } 911163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato } 912a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville if (r.matchPhoneStateListenerEvent(PhoneStateListener.LISTEN_SIGNAL_STRENGTH) && 9138b79fb6065370100c5a9e9b08458d932048dbb91xinhe idMatch(r.subId, subId, phoneId)){ 914fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville try { 915fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville int gsmSignalStrength = signalStrength.getGsmSignalStrength(); 916f4cd25b2c867ad74f983f1bacae3925005685a69Wink Saville int ss = (gsmSignalStrength == 99 ? -1 : gsmSignalStrength); 9171466a9c16c2e3bf2a230028d4ac644134cf7ae15Amit Mahajan if (DBG) { 918f7e59c1f618d20b79df6e936b9daedaa7c1b4d3dShishir Agrawal log("notifySignalStrengthForPhoneId: callback.onSS r=" + r 9191466a9c16c2e3bf2a230028d4ac644134cf7ae15Amit Mahajan + " subId=" + subId + " phoneId=" + phoneId 9201466a9c16c2e3bf2a230028d4ac644134cf7ae15Amit Mahajan + " gsmSS=" + gsmSignalStrength + " ss=" + ss); 9211466a9c16c2e3bf2a230028d4ac644134cf7ae15Amit Mahajan } 922f4cd25b2c867ad74f983f1bacae3925005685a69Wink Saville r.callback.onSignalStrengthChanged(ss); 923fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville } catch (RemoteException ex) { 924fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville mRemoveList.add(r.binder); 925fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville } 9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 928f4cd25b2c867ad74f983f1bacae3925005685a69Wink Saville } else { 929f7e59c1f618d20b79df6e936b9daedaa7c1b4d3dShishir Agrawal log("notifySignalStrengthForPhoneId: invalid phoneId=" + phoneId); 9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 931163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato handleRemoveListLocked(); 9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 933f7e59c1f618d20b79df6e936b9daedaa7c1b4d3dShishir Agrawal broadcastSignalStrengthChanged(signalStrength, phoneId, subId); 9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9361f45264dd6b874d72ed901a2213c779d42d321c1Andrew Flynn @Override 9371f45264dd6b874d72ed901a2213c779d42d321c1Andrew Flynn public void notifyCarrierNetworkChange(boolean active) { 938ceaed68b074bd341ed9b5f13ff9cc69e3f533999Andrew Flynn enforceNotifyPermissionOrCarrierPrivilege("notifyCarrierNetworkChange()"); 939ceaed68b074bd341ed9b5f13ff9cc69e3f533999Andrew Flynn 9401f45264dd6b874d72ed901a2213c779d42d321c1Andrew Flynn if (VDBG) { 9411f45264dd6b874d72ed901a2213c779d42d321c1Andrew Flynn log("notifyCarrierNetworkChange: active=" + active); 9421f45264dd6b874d72ed901a2213c779d42d321c1Andrew Flynn } 9431f45264dd6b874d72ed901a2213c779d42d321c1Andrew Flynn 9441f45264dd6b874d72ed901a2213c779d42d321c1Andrew Flynn synchronized (mRecords) { 9451f45264dd6b874d72ed901a2213c779d42d321c1Andrew Flynn mCarrierNetworkChangeState = active; 9461f45264dd6b874d72ed901a2213c779d42d321c1Andrew Flynn for (Record r : mRecords) { 9471f45264dd6b874d72ed901a2213c779d42d321c1Andrew Flynn if (r.matchPhoneStateListenerEvent( 9481f45264dd6b874d72ed901a2213c779d42d321c1Andrew Flynn PhoneStateListener.LISTEN_CARRIER_NETWORK_CHANGE)) { 9491f45264dd6b874d72ed901a2213c779d42d321c1Andrew Flynn try { 9501f45264dd6b874d72ed901a2213c779d42d321c1Andrew Flynn r.callback.onCarrierNetworkChange(active); 9511f45264dd6b874d72ed901a2213c779d42d321c1Andrew Flynn } catch (RemoteException ex) { 9521f45264dd6b874d72ed901a2213c779d42d321c1Andrew Flynn mRemoveList.add(r.binder); 9531f45264dd6b874d72ed901a2213c779d42d321c1Andrew Flynn } 9541f45264dd6b874d72ed901a2213c779d42d321c1Andrew Flynn } 9551f45264dd6b874d72ed901a2213c779d42d321c1Andrew Flynn } 9561f45264dd6b874d72ed901a2213c779d42d321c1Andrew Flynn handleRemoveListLocked(); 9571f45264dd6b874d72ed901a2213c779d42d321c1Andrew Flynn } 9581f45264dd6b874d72ed901a2213c779d42d321c1Andrew Flynn } 9591f45264dd6b874d72ed901a2213c779d42d321c1Andrew Flynn 960b208a24cf521401912cfce16fce550a995cf1250Wink Saville public void notifyCellInfo(List<CellInfo> cellInfo) { 961d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville notifyCellInfoForSubscriber(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID, cellInfo); 962fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville } 963fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville 96463f03dd94c43c22f2c77306059b5748e5e1e0e3cWink Saville public void notifyCellInfoForSubscriber(int subId, List<CellInfo> cellInfo) { 965963db55d59a170f4b17ff907c96615a19ef6fe17John Wang if (!checkNotifyPermission("notifyCellInfo()")) { 966963db55d59a170f4b17ff907c96615a19ef6fe17John Wang return; 967963db55d59a170f4b17ff907c96615a19ef6fe17John Wang } 968fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville if (VDBG) { 969bc0272754df7a2fb71bf709a2a8a7c852ee69e5cWink Saville log("notifyCellInfoForSubscriber: subId=" + subId 970fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville + " cellInfo=" + cellInfo); 971fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville } 972963db55d59a170f4b17ff907c96615a19ef6fe17John Wang 973963db55d59a170f4b17ff907c96615a19ef6fe17John Wang synchronized (mRecords) { 974fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville int phoneId = SubscriptionManager.getPhoneId(subId); 975fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville if (validatePhoneId(phoneId)) { 976fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville mCellInfo.set(phoneId, cellInfo); 977fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville for (Record r : mRecords) { 97843c50293490ba7efb0f97a1e45b07c92aeafa61exinhe if (validateEventsAndUserLocked(r, PhoneStateListener.LISTEN_CELL_INFO) && 9798b79fb6065370100c5a9e9b08458d932048dbb91xinhe idMatch(r.subId, subId, phoneId)) { 980fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville try { 981fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville if (DBG_LOC) { 982f4cd25b2c867ad74f983f1bacae3925005685a69Wink Saville log("notifyCellInfo: mCellInfo=" + cellInfo + " r=" + r); 983fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville } 984fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville r.callback.onCellInfoChanged(cellInfo); 985fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville } catch (RemoteException ex) { 986fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville mRemoveList.add(r.binder); 987a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville } 988963db55d59a170f4b17ff907c96615a19ef6fe17John Wang } 989963db55d59a170f4b17ff907c96615a19ef6fe17John Wang } 990963db55d59a170f4b17ff907c96615a19ef6fe17John Wang } 991963db55d59a170f4b17ff907c96615a19ef6fe17John Wang handleRemoveListLocked(); 992963db55d59a170f4b17ff907c96615a19ef6fe17John Wang } 993963db55d59a170f4b17ff907c96615a19ef6fe17John Wang } 994963db55d59a170f4b17ff907c96615a19ef6fe17John Wang 99543c50293490ba7efb0f97a1e45b07c92aeafa61exinhe @Override 99663f03dd94c43c22f2c77306059b5748e5e1e0e3cWink Saville public void notifyMessageWaitingChangedForPhoneId(int phoneId, int subId, boolean mwi) { 99745515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh if (!checkNotifyPermission("notifyMessageWaitingChanged()")) { 998ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project return; 999e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville } 1000fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville if (VDBG) { 100143c50293490ba7efb0f97a1e45b07c92aeafa61exinhe log("notifyMessageWaitingChangedForSubscriberPhoneID: subId=" + phoneId 1002fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville + " mwi=" + mwi); 1003fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville } 10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mRecords) { 1005fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville if (validatePhoneId(phoneId)) { 1006fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville mMessageWaiting[phoneId] = mwi; 1007fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville for (Record r : mRecords) { 1008a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville if (r.matchPhoneStateListenerEvent( 1009a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville PhoneStateListener.LISTEN_MESSAGE_WAITING_INDICATOR) && 10108b79fb6065370100c5a9e9b08458d932048dbb91xinhe idMatch(r.subId, subId, phoneId)) { 1011fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville try { 1012fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville r.callback.onMessageWaitingIndicatorChanged(mwi); 1013fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville } catch (RemoteException ex) { 1014fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville mRemoveList.add(r.binder); 1015fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville } 10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1019163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato handleRemoveListLocked(); 10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void notifyCallForwardingChanged(boolean cfi) { 1024d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville notifyCallForwardingChangedForSubscriber(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID, cfi); 1025fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville } 1026fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville 102763f03dd94c43c22f2c77306059b5748e5e1e0e3cWink Saville public void notifyCallForwardingChangedForSubscriber(int subId, boolean cfi) { 102845515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh if (!checkNotifyPermission("notifyCallForwardingChanged()")) { 1029ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project return; 1030e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville } 1031fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville if (VDBG) { 1032bc0272754df7a2fb71bf709a2a8a7c852ee69e5cWink Saville log("notifyCallForwardingChangedForSubscriber: subId=" + subId 1033fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville + " cfi=" + cfi); 1034fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville } 10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mRecords) { 1036fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville int phoneId = SubscriptionManager.getPhoneId(subId); 1037fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville if (validatePhoneId(phoneId)) { 1038fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville mCallForwarding[phoneId] = cfi; 1039fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville for (Record r : mRecords) { 1040a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville if (r.matchPhoneStateListenerEvent( 1041a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville PhoneStateListener.LISTEN_CALL_FORWARDING_INDICATOR) && 10428b79fb6065370100c5a9e9b08458d932048dbb91xinhe idMatch(r.subId, subId, phoneId)) { 1043fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville try { 1044fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville r.callback.onCallForwardingIndicatorChanged(cfi); 1045fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville } catch (RemoteException ex) { 1046fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville mRemoveList.add(r.binder); 1047fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville } 10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1051163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato handleRemoveListLocked(); 10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void notifyDataActivity(int state) { 1056d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville notifyDataActivityForSubscriber(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID, state); 1057fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville } 1058fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville 105963f03dd94c43c22f2c77306059b5748e5e1e0e3cWink Saville public void notifyDataActivityForSubscriber(int subId, int state) { 106045515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh if (!checkNotifyPermission("notifyDataActivity()" )) { 1061ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project return; 1062e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville } 10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mRecords) { 1064fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville int phoneId = SubscriptionManager.getPhoneId(subId); 1065d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville if (validatePhoneId(phoneId)) { 1066d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville mDataActivity[phoneId] = state; 1067d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville for (Record r : mRecords) { 10689071ced8b09db7485ff341b32ec366f58637ac68xu.peng // Notify by correct subId. 10699071ced8b09db7485ff341b32ec366f58637ac68xu.peng if (r.matchPhoneStateListenerEvent(PhoneStateListener.LISTEN_DATA_ACTIVITY) && 10709071ced8b09db7485ff341b32ec366f58637ac68xu.peng idMatch(r.subId, subId, phoneId)) { 1071d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville try { 1072d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville r.callback.onDataActivity(state); 1073d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville } catch (RemoteException ex) { 1074d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville mRemoveList.add(r.binder); 1075d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville } 10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1079163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato handleRemoveListLocked(); 10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 108345515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh public void notifyDataConnection(int state, boolean isDataConnectivityPossible, 108437e65ebb7eb932e1a144b1cab262e11ca5fd109bRobert Greenwalt String reason, String apn, String apnType, LinkProperties linkProperties, 1085f9cb86aebe9647e0fe0137fc198ba16c017445c6Robert Greenwalt NetworkCapabilities networkCapabilities, int networkType, boolean roaming) { 1086d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville notifyDataConnectionForSubscriber(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID, state, 108743c50293490ba7efb0f97a1e45b07c92aeafa61exinhe isDataConnectivityPossible,reason, apn, apnType, linkProperties, 1088fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville networkCapabilities, networkType, roaming); 1089fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville } 1090fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville 109163f03dd94c43c22f2c77306059b5748e5e1e0e3cWink Saville public void notifyDataConnectionForSubscriber(int subId, int state, 1092fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville boolean isDataConnectivityPossible, String reason, String apn, String apnType, 1093fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville LinkProperties linkProperties, NetworkCapabilities networkCapabilities, 1094fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville int networkType, boolean roaming) { 109545515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh if (!checkNotifyPermission("notifyDataConnection()" )) { 1096ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project return; 1097e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville } 1098fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville if (VDBG) { 1099bc0272754df7a2fb71bf709a2a8a7c852ee69e5cWink Saville log("notifyDataConnectionForSubscriber: subId=" + subId 1100fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville + " state=" + state + " isDataConnectivityPossible=" + isDataConnectivityPossible 1101fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville + " reason='" + reason 1102a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville + "' apn='" + apn + "' apnType=" + apnType + " networkType=" + networkType 1103ac11ae91c7c926e792a35eb66e71e9f3b5cf4f93xinhe + " mRecords.size()=" + mRecords.size()); 1104c9acde9aa6cf21598640aeebb7d908f1926a48ddWink Saville } 11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mRecords) { 1106fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville int phoneId = SubscriptionManager.getPhoneId(subId); 1107d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville if (validatePhoneId(phoneId)) { 1108d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville boolean modified = false; 1109d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville if (state == TelephonyManager.DATA_CONNECTED) { 111057b39e3efa35daf1e495a0e4f217c3276d691d1dYifan Bai if (!mConnectedApns[phoneId].contains(apnType)) { 111157b39e3efa35daf1e495a0e4f217c3276d691d1dYifan Bai mConnectedApns[phoneId].add(apnType); 1112d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville if (mDataConnectionState[phoneId] != state) { 1113d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville mDataConnectionState[phoneId] = state; 1114d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville modified = true; 1115d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville } 11168e7e0a9fd5c377294bfe2e09fca9b7551871f3c2Robert Greenwalt } 1117d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville } else { 111857b39e3efa35daf1e495a0e4f217c3276d691d1dYifan Bai if (mConnectedApns[phoneId].remove(apnType)) { 111957b39e3efa35daf1e495a0e4f217c3276d691d1dYifan Bai if (mConnectedApns[phoneId].isEmpty()) { 1120d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville mDataConnectionState[phoneId] = state; 1121d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville modified = true; 1122d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville } else { 1123d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville // leave mDataConnectionState as is and 1124d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville // send out the new status for the APN in question. 1125d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville } 1126baf21da1e17ef358632c078128d381b3be218a08Wink Saville } 1127c9acde9aa6cf21598640aeebb7d908f1926a48ddWink Saville } 1128d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville mDataConnectionPossible[phoneId] = isDataConnectivityPossible; 1129d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville mDataConnectionReason[phoneId] = reason; 1130d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville mDataConnectionLinkProperties[phoneId] = linkProperties; 1131d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville mDataConnectionNetworkCapabilities[phoneId] = networkCapabilities; 1132d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville if (mDataConnectionNetworkType[phoneId] != networkType) { 1133d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville mDataConnectionNetworkType[phoneId] = networkType; 1134d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville // need to tell registered listeners about the new network type 1135d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville modified = true; 11362d1ee982276f5dbd0e035778b731b48e4ef34515Wink Saville } 1137d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville if (modified) { 1138d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yu String str = "onDataConnectionStateChanged(" + mDataConnectionState[phoneId] 1139d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yu + ", " + mDataConnectionNetworkType[phoneId] + ")"; 1140d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yu log(str); 1141d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yu mLocalLog.log(str); 1142d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville for (Record r : mRecords) { 1143d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville if (r.matchPhoneStateListenerEvent( 1144d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville PhoneStateListener.LISTEN_DATA_CONNECTION_STATE) && 1145d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville idMatch(r.subId, subId, phoneId)) { 1146d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville try { 1147d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yu if (DBG) { 1148d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yu log("Notify data connection state changed on sub: " + subId); 1149d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yu } 1150d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yu r.callback.onDataConnectionStateChanged( 1151d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yu mDataConnectionState[phoneId], 1152d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville mDataConnectionNetworkType[phoneId]); 1153d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville } catch (RemoteException ex) { 1154d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville mRemoveList.add(r.binder); 1155d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville } 1156d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville } 1157d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville } 1158d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville handleRemoveListLocked(); 1159d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville } 1160d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville mPreciseDataConnectionState = new PreciseDataConnectionState(state, networkType, 1161d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville apnType, apn, reason, linkProperties, ""); 116202648a4b8422733ed401f07edf8e426318bb2f8dRobert Greenwalt for (Record r : mRecords) { 1163a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville if (r.matchPhoneStateListenerEvent( 1164d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville PhoneStateListener.LISTEN_PRECISE_DATA_CONNECTION_STATE)) { 116502648a4b8422733ed401f07edf8e426318bb2f8dRobert Greenwalt try { 1166d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yu r.callback.onPreciseDataConnectionStateChanged( 1167d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yu mPreciseDataConnectionState); 116802648a4b8422733ed401f07edf8e426318bb2f8dRobert Greenwalt } catch (RemoteException ex) { 1169163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato mRemoveList.add(r.binder); 117002648a4b8422733ed401f07edf8e426318bb2f8dRobert Greenwalt } 11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1173c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela } 1174c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela handleRemoveListLocked(); 11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1176e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville broadcastDataConnectionStateChanged(state, isDataConnectivityPossible, reason, apn, 1177fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville apnType, linkProperties, networkCapabilities, roaming, subId); 1178c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela broadcastPreciseDataConnectionStateChanged(state, networkType, apnType, apn, reason, 1179c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela linkProperties, ""); 11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 118202648a4b8422733ed401f07edf8e426318bb2f8dRobert Greenwalt public void notifyDataConnectionFailed(String reason, String apnType) { 1183d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville notifyDataConnectionFailedForSubscriber(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID, 118443c50293490ba7efb0f97a1e45b07c92aeafa61exinhe reason, apnType); 1185fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville } 1186fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville 118763f03dd94c43c22f2c77306059b5748e5e1e0e3cWink Saville public void notifyDataConnectionFailedForSubscriber(int subId, 1188fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville String reason, String apnType) { 118945515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh if (!checkNotifyPermission("notifyDataConnectionFailed()")) { 1190ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project return; 1191e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville } 1192fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville if (VDBG) { 1193bc0272754df7a2fb71bf709a2a8a7c852ee69e5cWink Saville log("notifyDataConnectionFailedForSubscriber: subId=" + subId 1194fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville + " reason=" + reason + " apnType=" + apnType); 1195fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville } 11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mRecords) { 1197c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela mPreciseDataConnectionState = new PreciseDataConnectionState( 1198c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela TelephonyManager.DATA_UNKNOWN,TelephonyManager.NETWORK_TYPE_UNKNOWN, 1199c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela apnType, "", reason, null, ""); 1200c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela for (Record r : mRecords) { 1201a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville if (r.matchPhoneStateListenerEvent( 1202a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville PhoneStateListener.LISTEN_PRECISE_DATA_CONNECTION_STATE)) { 1203c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela try { 1204c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela r.callback.onPreciseDataConnectionStateChanged(mPreciseDataConnectionState); 1205c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela } catch (RemoteException ex) { 1206c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela mRemoveList.add(r.binder); 1207c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela } 12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1210c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela handleRemoveListLocked(); 12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1212fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville broadcastDataConnectionFailed(reason, apnType, subId); 1213c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela broadcastPreciseDataConnectionStateChanged(TelephonyManager.DATA_UNKNOWN, 1214c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela TelephonyManager.NETWORK_TYPE_UNKNOWN, apnType, "", reason, null, ""); 12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void notifyCellLocation(Bundle cellLocation) { 1218d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville notifyCellLocationForSubscriber(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID, cellLocation); 1219fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville } 1220fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville 122163f03dd94c43c22f2c77306059b5748e5e1e0e3cWink Saville public void notifyCellLocationForSubscriber(int subId, Bundle cellLocation) { 1222bc0272754df7a2fb71bf709a2a8a7c852ee69e5cWink Saville log("notifyCellLocationForSubscriber: subId=" + subId 1223fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville + " cellLocation=" + cellLocation); 122445515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh if (!checkNotifyPermission("notifyCellLocation()")) { 1225ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project return; 1226e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville } 1227fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville if (VDBG) { 1228bc0272754df7a2fb71bf709a2a8a7c852ee69e5cWink Saville log("notifyCellLocationForSubscriber: subId=" + subId 1229fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville + " cellLocation=" + cellLocation); 1230fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville } 12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mRecords) { 1232fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville int phoneId = SubscriptionManager.getPhoneId(subId); 1233fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville if (validatePhoneId(phoneId)) { 1234fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville mCellLocation[phoneId] = cellLocation; 1235fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville for (Record r : mRecords) { 123643c50293490ba7efb0f97a1e45b07c92aeafa61exinhe if (validateEventsAndUserLocked(r, PhoneStateListener.LISTEN_CELL_LOCATION) && 12378b79fb6065370100c5a9e9b08458d932048dbb91xinhe idMatch(r.subId, subId, phoneId)) { 1238fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville try { 1239fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville if (DBG_LOC) { 1240f4cd25b2c867ad74f983f1bacae3925005685a69Wink Saville log("notifyCellLocation: cellLocation=" + cellLocation 1241fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville + " r=" + r); 1242fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville } 1243fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville r.callback.onCellLocationChanged(new Bundle(cellLocation)); 1244fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville } catch (RemoteException ex) { 1245fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville mRemoveList.add(r.binder); 1246a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville } 1247163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato } 12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1250163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato handleRemoveListLocked(); 1251e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville } 1252e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville } 12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1254fd2d01302781af91d77557a99874111a4fee8365Wink Saville public void notifyOtaspChanged(int otaspMode) { 1255fd2d01302781af91d77557a99874111a4fee8365Wink Saville if (!checkNotifyPermission("notifyOtaspChanged()" )) { 1256fd2d01302781af91d77557a99874111a4fee8365Wink Saville return; 1257fd2d01302781af91d77557a99874111a4fee8365Wink Saville } 1258fd2d01302781af91d77557a99874111a4fee8365Wink Saville synchronized (mRecords) { 1259fd2d01302781af91d77557a99874111a4fee8365Wink Saville mOtaspMode = otaspMode; 1260fd2d01302781af91d77557a99874111a4fee8365Wink Saville for (Record r : mRecords) { 1261a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville if (r.matchPhoneStateListenerEvent(PhoneStateListener.LISTEN_OTASP_CHANGED)) { 1262fd2d01302781af91d77557a99874111a4fee8365Wink Saville try { 1263fd2d01302781af91d77557a99874111a4fee8365Wink Saville r.callback.onOtaspChanged(otaspMode); 1264fd2d01302781af91d77557a99874111a4fee8365Wink Saville } catch (RemoteException ex) { 1265fd2d01302781af91d77557a99874111a4fee8365Wink Saville mRemoveList.add(r.binder); 1266fd2d01302781af91d77557a99874111a4fee8365Wink Saville } 1267fd2d01302781af91d77557a99874111a4fee8365Wink Saville } 1268fd2d01302781af91d77557a99874111a4fee8365Wink Saville } 1269fd2d01302781af91d77557a99874111a4fee8365Wink Saville handleRemoveListLocked(); 1270fd2d01302781af91d77557a99874111a4fee8365Wink Saville } 1271fd2d01302781af91d77557a99874111a4fee8365Wink Saville } 1272fd2d01302781af91d77557a99874111a4fee8365Wink Saville 1273c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela public void notifyPreciseCallState(int ringingCallState, int foregroundCallState, 1274c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela int backgroundCallState) { 1275c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela if (!checkNotifyPermission("notifyPreciseCallState()")) { 1276c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela return; 1277c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela } 1278c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela synchronized (mRecords) { 1279c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela mRingingCallState = ringingCallState; 1280c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela mForegroundCallState = foregroundCallState; 1281c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela mBackgroundCallState = backgroundCallState; 1282c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela mPreciseCallState = new PreciseCallState(ringingCallState, foregroundCallState, 1283c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela backgroundCallState, 1284c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela DisconnectCause.NOT_VALID, 1285c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela PreciseDisconnectCause.NOT_VALID); 1286c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela for (Record r : mRecords) { 1287a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville if (r.matchPhoneStateListenerEvent(PhoneStateListener.LISTEN_PRECISE_CALL_STATE)) { 1288c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela try { 1289c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela r.callback.onPreciseCallStateChanged(mPreciseCallState); 1290c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela } catch (RemoteException ex) { 1291c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela mRemoveList.add(r.binder); 1292c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela } 1293c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela } 1294c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela } 1295c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela handleRemoveListLocked(); 1296c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela } 1297c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela broadcastPreciseCallStateChanged(ringingCallState, foregroundCallState, backgroundCallState, 1298c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela DisconnectCause.NOT_VALID, 1299c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela PreciseDisconnectCause.NOT_VALID); 1300c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela } 1301c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela 1302c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela public void notifyDisconnectCause(int disconnectCause, int preciseDisconnectCause) { 1303c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela if (!checkNotifyPermission("notifyDisconnectCause()")) { 1304c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela return; 1305c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela } 1306c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela synchronized (mRecords) { 1307c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela mPreciseCallState = new PreciseCallState(mRingingCallState, mForegroundCallState, 1308c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela mBackgroundCallState, disconnectCause, preciseDisconnectCause); 1309c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela for (Record r : mRecords) { 1310a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville if (r.matchPhoneStateListenerEvent(PhoneStateListener.LISTEN_PRECISE_CALL_STATE)) { 1311c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela try { 1312c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela r.callback.onPreciseCallStateChanged(mPreciseCallState); 1313c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela } catch (RemoteException ex) { 1314c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela mRemoveList.add(r.binder); 1315c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela } 1316c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela } 1317c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela } 1318c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela handleRemoveListLocked(); 1319c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela } 1320c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela broadcastPreciseCallStateChanged(mRingingCallState, mForegroundCallState, 1321c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela mBackgroundCallState, disconnectCause, preciseDisconnectCause); 1322c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela } 1323c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela 1324c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela public void notifyPreciseDataConnectionFailed(String reason, String apnType, 1325c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela String apn, String failCause) { 1326c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela if (!checkNotifyPermission("notifyPreciseDataConnectionFailed()")) { 1327c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela return; 1328c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela } 1329c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela synchronized (mRecords) { 1330c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela mPreciseDataConnectionState = new PreciseDataConnectionState( 1331c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela TelephonyManager.DATA_UNKNOWN, TelephonyManager.NETWORK_TYPE_UNKNOWN, 1332c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela apnType, apn, reason, null, failCause); 1333c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela for (Record r : mRecords) { 1334a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville if (r.matchPhoneStateListenerEvent( 1335a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville PhoneStateListener.LISTEN_PRECISE_DATA_CONNECTION_STATE)) { 1336c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela try { 1337c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela r.callback.onPreciseDataConnectionStateChanged(mPreciseDataConnectionState); 1338c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela } catch (RemoteException ex) { 1339c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela mRemoveList.add(r.binder); 1340c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela } 1341c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela } 1342c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela } 1343c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela handleRemoveListLocked(); 1344c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela } 1345c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela broadcastPreciseDataConnectionStateChanged(TelephonyManager.DATA_UNKNOWN, 1346c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela TelephonyManager.NETWORK_TYPE_UNKNOWN, apnType, apn, reason, null, failCause); 1347c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela } 1348c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela 1349fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville public void notifyVoLteServiceStateChanged(VoLteServiceState lteState) { 1350fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville if (!checkNotifyPermission("notifyVoLteServiceStateChanged()")) { 1351fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville return; 1352fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville } 1353fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville synchronized (mRecords) { 1354fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville mVoLteServiceState = lteState; 1355fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville for (Record r : mRecords) { 1356a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville if (r.matchPhoneStateListenerEvent(PhoneStateListener.LISTEN_VOLTE_STATE)) { 1357fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville try { 1358fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville r.callback.onVoLteServiceStateChanged( 1359fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville new VoLteServiceState(mVoLteServiceState)); 1360fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville } catch (RemoteException ex) { 1361fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville mRemoveList.add(r.binder); 1362fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville } 1363fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville } 1364fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville } 1365fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville handleRemoveListLocked(); 1366fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville } 1367fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville } 1368fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville 136963f03dd94c43c22f2c77306059b5748e5e1e0e3cWink Saville public void notifyOemHookRawEventForSubscriber(int subId, byte[] rawData) { 1370485f2095f8ba695b88331c01a2de468b5616a5d7New Author Steven Liu if (!checkNotifyPermission("notifyOemHookRawEventForSubscriber")) { 1371485f2095f8ba695b88331c01a2de468b5616a5d7New Author Steven Liu return; 1372485f2095f8ba695b88331c01a2de468b5616a5d7New Author Steven Liu } 1373485f2095f8ba695b88331c01a2de468b5616a5d7New Author Steven Liu 1374485f2095f8ba695b88331c01a2de468b5616a5d7New Author Steven Liu synchronized (mRecords) { 1375485f2095f8ba695b88331c01a2de468b5616a5d7New Author Steven Liu for (Record r : mRecords) { 1376485f2095f8ba695b88331c01a2de468b5616a5d7New Author Steven Liu if (VDBG) { 1377485f2095f8ba695b88331c01a2de468b5616a5d7New Author Steven Liu log("notifyOemHookRawEventForSubscriber: r=" + r + " subId=" + subId); 1378485f2095f8ba695b88331c01a2de468b5616a5d7New Author Steven Liu } 1379a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville if ((r.matchPhoneStateListenerEvent( 1380a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville PhoneStateListener.LISTEN_OEM_HOOK_RAW_EVENT)) && 1381485f2095f8ba695b88331c01a2de468b5616a5d7New Author Steven Liu ((r.subId == subId) || 1382d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville (r.subId == SubscriptionManager.DEFAULT_SUBSCRIPTION_ID))) { 1383485f2095f8ba695b88331c01a2de468b5616a5d7New Author Steven Liu try { 1384485f2095f8ba695b88331c01a2de468b5616a5d7New Author Steven Liu r.callback.onOemHookRawEvent(rawData); 1385485f2095f8ba695b88331c01a2de468b5616a5d7New Author Steven Liu } catch (RemoteException ex) { 1386485f2095f8ba695b88331c01a2de468b5616a5d7New Author Steven Liu mRemoveList.add(r.binder); 1387485f2095f8ba695b88331c01a2de468b5616a5d7New Author Steven Liu } 1388485f2095f8ba695b88331c01a2de468b5616a5d7New Author Steven Liu } 1389485f2095f8ba695b88331c01a2de468b5616a5d7New Author Steven Liu } 1390485f2095f8ba695b88331c01a2de468b5616a5d7New Author Steven Liu handleRemoveListLocked(); 1391485f2095f8ba695b88331c01a2de468b5616a5d7New Author Steven Liu } 1392485f2095f8ba695b88331c01a2de468b5616a5d7New Author Steven Liu } 1393485f2095f8ba695b88331c01a2de468b5616a5d7New Author Steven Liu 13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1395d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yu public void dump(FileDescriptor fd, PrintWriter writer, String[] args) { 1396d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yu final IndentingPrintWriter pw = new IndentingPrintWriter(writer, " "); 1397d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yu 1398fe9a53bc45fd0124a876dc0a49680aaf86641d3eJeff Sharkey if (!DumpUtils.checkDumpPermission(mContext, TAG, pw)) return; 1399d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yu 14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mRecords) { 1401e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville final int recordCount = mRecords.size(); 14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println("last known state:"); 1403d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yu pw.increaseIndent(); 14042f32ac25e94b9451f9004c8a5679762d3fdd9acdSandeep Gutta for (int i = 0; i < TelephonyManager.getDefault().getPhoneCount(); i++) { 1405d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yu pw.println("Phone Id=" + i); 1406d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yu pw.increaseIndent(); 1407d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yu pw.println("mCallState=" + mCallState[i]); 1408d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yu pw.println("mCallIncomingNumber=" + mCallIncomingNumber[i]); 1409d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yu pw.println("mServiceState=" + mServiceState[i]); 1410d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yu pw.println("mVoiceActivationState= " + mVoiceActivationState[i]); 1411d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yu pw.println("mDataActivationState= " + mDataActivationState[i]); 1412d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yu pw.println("mSignalStrength=" + mSignalStrength[i]); 1413d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yu pw.println("mMessageWaiting=" + mMessageWaiting[i]); 1414d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yu pw.println("mCallForwarding=" + mCallForwarding[i]); 1415d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yu pw.println("mDataActivity=" + mDataActivity[i]); 1416d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yu pw.println("mDataConnectionState=" + mDataConnectionState[i]); 1417d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yu pw.println("mDataConnectionPossible=" + mDataConnectionPossible[i]); 1418d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yu pw.println("mDataConnectionReason=" + mDataConnectionReason[i]); 1419d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yu pw.println("mDataConnectionLinkProperties=" + mDataConnectionLinkProperties[i]); 1420d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yu pw.println("mDataConnectionNetworkCapabilities=" + 14212f32ac25e94b9451f9004c8a5679762d3fdd9acdSandeep Gutta mDataConnectionNetworkCapabilities[i]); 1422d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yu pw.println("mCellLocation=" + mCellLocation[i]); 1423d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yu pw.println("mCellInfo=" + mCellInfo.get(i)); 1424d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yu pw.decreaseIndent(); 14252f32ac25e94b9451f9004c8a5679762d3fdd9acdSandeep Gutta } 1426d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yu pw.println("mConnectedApns=" + Arrays.toString(mConnectedApns)); 1427d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yu pw.println("mPreciseDataConnectionState=" + mPreciseDataConnectionState); 1428d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yu pw.println("mPreciseCallState=" + mPreciseCallState); 1429d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yu pw.println("mCarrierNetworkChangeState=" + mCarrierNetworkChangeState); 1430d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yu pw.println("mRingingCallState=" + mRingingCallState); 1431d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yu pw.println("mForegroundCallState=" + mForegroundCallState); 1432d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yu pw.println("mBackgroundCallState=" + mBackgroundCallState); 1433d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yu pw.println("mVoLteServiceState=" + mVoLteServiceState); 1434d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yu 1435d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yu pw.decreaseIndent(); 1436d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yu 1437d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yu pw.println("local logs:"); 1438d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yu pw.increaseIndent(); 1439d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yu mLocalLog.dump(fd, pw, args); 1440d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yu pw.decreaseIndent(); 1441e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville pw.println("registrations: count=" + recordCount); 1442d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yu pw.increaseIndent(); 144302648a4b8422733ed401f07edf8e426318bb2f8dRobert Greenwalt for (Record r : mRecords) { 1444d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yu pw.println(r); 14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1446d19b6ae9c6a77bd691c5b6bce000dfa84dd4f7a3Jack Yu pw.decreaseIndent(); 14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // 14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the legacy intent broadcasting 14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // 14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1454f7e59c1f618d20b79df6e936b9daedaa7c1b4d3dShishir Agrawal private void broadcastServiceStateChanged(ServiceState state, int phoneId, int subId) { 1455fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville long ident = Binder.clearCallingIdentity(); 1456fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville try { 1457fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville mBatteryStats.notePhoneState(state.getState()); 1458fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville } catch (RemoteException re) { 1459fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville // Can't do much 1460fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville } finally { 1461fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville Binder.restoreCallingIdentity(ident); 1462fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville } 1463fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville 14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent intent = new Intent(TelephonyIntents.ACTION_SERVICE_STATE_CHANGED); 146542a386b7717300bf6d75cbd3b4f7ad00f294be0dChristopher Tate intent.addFlags(Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND); 14669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Bundle data = new Bundle(); 14679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project state.fillInNotifierBundle(data); 14689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent.putExtras(data); 1469fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville // Pass the subscription along with the intent. 1470fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville intent.putExtra(PhoneConstants.SUBSCRIPTION_KEY, subId); 1471f7e59c1f618d20b79df6e936b9daedaa7c1b4d3dShishir Agrawal intent.putExtra(PhoneConstants.SLOT_KEY, phoneId); 14725ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn mContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL); 14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1475f7e59c1f618d20b79df6e936b9daedaa7c1b4d3dShishir Agrawal private void broadcastSignalStrengthChanged(SignalStrength signalStrength, int phoneId, 1476f7e59c1f618d20b79df6e936b9daedaa7c1b4d3dShishir Agrawal int subId) { 1477627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn long ident = Binder.clearCallingIdentity(); 1478627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn try { 1479e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville mBatteryStats.notePhoneSignalStrength(signalStrength); 1480627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } catch (RemoteException e) { 1481e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville /* The remote entity disappeared, we can safely ignore the exception. */ 1482627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } finally { 1483627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn Binder.restoreCallingIdentity(ident); 1484627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 1485e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville 14869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent intent = new Intent(TelephonyIntents.ACTION_SIGNAL_STRENGTH_CHANGED); 1487e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville Bundle data = new Bundle(); 1488e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville signalStrength.fillInNotifierBundle(data); 1489e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville intent.putExtras(data); 1490fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville intent.putExtra(PhoneConstants.SUBSCRIPTION_KEY, subId); 1491f7e59c1f618d20b79df6e936b9daedaa7c1b4d3dShishir Agrawal intent.putExtra(PhoneConstants.SLOT_KEY, phoneId); 14925ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn mContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL); 14939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 149561a3ab090f4b1edf0cb2c4ceae585a54ab613337Sharvil Nanavati /** 149661a3ab090f4b1edf0cb2c4ceae585a54ab613337Sharvil Nanavati * Broadcasts an intent notifying apps of a phone state change. {@code subId} can be 149761a3ab090f4b1edf0cb2c4ceae585a54ab613337Sharvil Nanavati * a valid subId, in which case this function fires a subId-specific intent, or it 149861a3ab090f4b1edf0cb2c4ceae585a54ab613337Sharvil Nanavati * can be {@code SubscriptionManager.INVALID_SUBSCRIPTION_ID}, in which case we send 149961a3ab090f4b1edf0cb2c4ceae585a54ab613337Sharvil Nanavati * a global state change broadcast ({@code TelephonyManager.ACTION_PHONE_STATE_CHANGED}). 150061a3ab090f4b1edf0cb2c4ceae585a54ab613337Sharvil Nanavati */ 1501f7e59c1f618d20b79df6e936b9daedaa7c1b4d3dShishir Agrawal private void broadcastCallStateChanged(int state, String incomingNumber, int phoneId, 1502f7e59c1f618d20b79df6e936b9daedaa7c1b4d3dShishir Agrawal int subId) { 15039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long ident = Binder.clearCallingIdentity(); 15049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 15059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (state == TelephonyManager.CALL_STATE_IDLE) { 15069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBatteryStats.notePhoneOff(); 15079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 15089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBatteryStats.notePhoneOn(); 15099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 1511e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville /* The remote entity disappeared, we can safely ignore the exception. */ 15129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 15139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.restoreCallingIdentity(ident); 15149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1515e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville 15169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent intent = new Intent(TelephonyManager.ACTION_PHONE_STATE_CHANGED); 1517a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville intent.putExtra(PhoneConstants.STATE_KEY, 15185a0618ead121b258204c19b97c37cb85d4ad0856Nathan Harold PhoneConstantConversions.convertCallState(state).toString()); 15199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!TextUtils.isEmpty(incomingNumber)) { 15209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent.putExtra(TelephonyManager.EXTRA_INCOMING_NUMBER, incomingNumber); 15219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 152261a3ab090f4b1edf0cb2c4ceae585a54ab613337Sharvil Nanavati 152361a3ab090f4b1edf0cb2c4ceae585a54ab613337Sharvil Nanavati // If a valid subId was specified, we should fire off a subId-specific state 152461a3ab090f4b1edf0cb2c4ceae585a54ab613337Sharvil Nanavati // change intent and include the subId. 152561a3ab090f4b1edf0cb2c4ceae585a54ab613337Sharvil Nanavati if (subId != SubscriptionManager.INVALID_SUBSCRIPTION_ID) { 152661a3ab090f4b1edf0cb2c4ceae585a54ab613337Sharvil Nanavati intent.setAction(PhoneConstants.ACTION_SUBSCRIPTION_PHONE_STATE_CHANGED); 152761a3ab090f4b1edf0cb2c4ceae585a54ab613337Sharvil Nanavati intent.putExtra(PhoneConstants.SUBSCRIPTION_KEY, subId); 152861a3ab090f4b1edf0cb2c4ceae585a54ab613337Sharvil Nanavati } 1529f7e59c1f618d20b79df6e936b9daedaa7c1b4d3dShishir Agrawal // If the phoneId is invalid, the broadcast is for overall call state. 1530f7e59c1f618d20b79df6e936b9daedaa7c1b4d3dShishir Agrawal if (phoneId != SubscriptionManager.INVALID_PHONE_INDEX) { 1531f7e59c1f618d20b79df6e936b9daedaa7c1b4d3dShishir Agrawal intent.putExtra(PhoneConstants.SLOT_KEY, phoneId); 1532f7e59c1f618d20b79df6e936b9daedaa7c1b4d3dShishir Agrawal } 153361a3ab090f4b1edf0cb2c4ceae585a54ab613337Sharvil Nanavati 153451de96af1a4678b035f964747a82f9891821aee1Brad Ebinger // Wakeup apps for the (SUBSCRIPTION_)PHONE_STATE broadcast. 153551de96af1a4678b035f964747a82f9891821aee1Brad Ebinger intent.addFlags(Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND); 153651de96af1a4678b035f964747a82f9891821aee1Brad Ebinger 15371cfd45701bca2be5ddabf9d523c8183a482fee00Amit Mahajan // Send broadcast twice, once for apps that have PRIVILEGED permission and once for those 15381cfd45701bca2be5ddabf9d523c8183a482fee00Amit Mahajan // that have the runtime one 15391cfd45701bca2be5ddabf9d523c8183a482fee00Amit Mahajan mContext.sendBroadcastAsUser(intent, UserHandle.ALL, 15401cfd45701bca2be5ddabf9d523c8183a482fee00Amit Mahajan android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE); 15415ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn mContext.sendBroadcastAsUser(intent, UserHandle.ALL, 154216a16899505ec0a9ede5b76650bfb8817b3227c7Svet Ganov android.Manifest.permission.READ_PHONE_STATE, 154316a16899505ec0a9ede5b76650bfb8817b3227c7Svet Ganov AppOpsManager.OP_READ_PHONE_STATE); 15449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 154642acef37339afe6ac608c842f1637870ee9c4f6cRobert Greenwalt private void broadcastDataConnectionStateChanged(int state, 154742acef37339afe6ac608c842f1637870ee9c4f6cRobert Greenwalt boolean isDataConnectivityPossible, 1548f61101f6266be243c481d163b95e65d67b8d1669Wink Saville String reason, String apn, String apnType, LinkProperties linkProperties, 154963f03dd94c43c22f2c77306059b5748e5e1e0e3cWink Saville NetworkCapabilities networkCapabilities, boolean roaming, int subId) { 1550627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn // Note: not reporting to the battery stats service here, because the 1551627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn // status bar takes care of that after taking into account all of the 1552627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn // required info. 15539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent intent = new Intent(TelephonyIntents.ACTION_ANY_DATA_CONNECTION_STATE_CHANGED); 1554a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville intent.putExtra(PhoneConstants.STATE_KEY, 15555a0618ead121b258204c19b97c37cb85d4ad0856Nathan Harold PhoneConstantConversions.convertDataState(state).toString()); 15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!isDataConnectivityPossible) { 1557a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville intent.putExtra(PhoneConstants.NETWORK_UNAVAILABLE_KEY, true); 15589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (reason != null) { 1560a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville intent.putExtra(PhoneConstants.STATE_CHANGE_REASON_KEY, reason); 15619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 156237e65ebb7eb932e1a144b1cab262e11ca5fd109bRobert Greenwalt if (linkProperties != null) { 1563a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville intent.putExtra(PhoneConstants.DATA_LINK_PROPERTIES_KEY, linkProperties); 1564ed5d7d17c9e9837ce7a6a10698cce9f6e4101acdIrfan Sheriff String iface = linkProperties.getInterfaceName(); 156547f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt if (iface != null) { 1566a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville intent.putExtra(PhoneConstants.DATA_IFACE_NAME_KEY, iface); 156747f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt } 156847f69fe2999e46004f2f2463b70d38de9ff7079aRobert Greenwalt } 1569f9cb86aebe9647e0fe0137fc198ba16c017445c6Robert Greenwalt if (networkCapabilities != null) { 1570f9cb86aebe9647e0fe0137fc198ba16c017445c6Robert Greenwalt intent.putExtra(PhoneConstants.DATA_NETWORK_CAPABILITIES_KEY, networkCapabilities); 1571f61101f6266be243c481d163b95e65d67b8d1669Wink Saville } 1572a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville if (roaming) intent.putExtra(PhoneConstants.DATA_NETWORK_ROAMING_KEY, true); 1573a6d4248e21bd62a51ac4aaadaa67fdb55b666d98Robert Greenwalt 1574a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville intent.putExtra(PhoneConstants.DATA_APN_KEY, apn); 1575a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville intent.putExtra(PhoneConstants.DATA_APN_TYPE_KEY, apnType); 1576fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville intent.putExtra(PhoneConstants.SUBSCRIPTION_KEY, subId); 15775ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn mContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL); 15789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1580fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville private void broadcastDataConnectionFailed(String reason, String apnType, 158163f03dd94c43c22f2c77306059b5748e5e1e0e3cWink Saville int subId) { 15829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent intent = new Intent(TelephonyIntents.ACTION_DATA_CONNECTION_FAILED); 1583a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville intent.putExtra(PhoneConstants.FAILURE_REASON_KEY, reason); 1584a639b311e93ad14d9ee5c2b2c215ed2d86c32d2aWink Saville intent.putExtra(PhoneConstants.DATA_APN_TYPE_KEY, apnType); 1585fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville intent.putExtra(PhoneConstants.SUBSCRIPTION_KEY, subId); 15865ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn mContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL); 15879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1588e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville 1589c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela private void broadcastPreciseCallStateChanged(int ringingCallState, int foregroundCallState, 1590c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela int backgroundCallState, int disconnectCause, int preciseDisconnectCause) { 1591c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela Intent intent = new Intent(TelephonyManager.ACTION_PRECISE_CALL_STATE_CHANGED); 1592c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela intent.putExtra(TelephonyManager.EXTRA_RINGING_CALL_STATE, ringingCallState); 1593c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela intent.putExtra(TelephonyManager.EXTRA_FOREGROUND_CALL_STATE, foregroundCallState); 1594c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela intent.putExtra(TelephonyManager.EXTRA_BACKGROUND_CALL_STATE, backgroundCallState); 1595c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela intent.putExtra(TelephonyManager.EXTRA_DISCONNECT_CAUSE, disconnectCause); 1596c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela intent.putExtra(TelephonyManager.EXTRA_PRECISE_DISCONNECT_CAUSE, preciseDisconnectCause); 1597c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela mContext.sendBroadcastAsUser(intent, UserHandle.ALL, 1598c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela android.Manifest.permission.READ_PRECISE_PHONE_STATE); 1599c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela } 1600c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela 1601c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela private void broadcastPreciseDataConnectionStateChanged(int state, int networkType, 1602d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville String apnType, String apn, String reason, LinkProperties linkProperties, 1603d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville String failCause) { 1604c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela Intent intent = new Intent(TelephonyManager.ACTION_PRECISE_DATA_CONNECTION_STATE_CHANGED); 1605c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela intent.putExtra(PhoneConstants.STATE_KEY, state); 1606c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela intent.putExtra(PhoneConstants.DATA_NETWORK_TYPE_KEY, networkType); 1607c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela if (reason != null) intent.putExtra(PhoneConstants.STATE_CHANGE_REASON_KEY, reason); 1608c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela if (apnType != null) intent.putExtra(PhoneConstants.DATA_APN_TYPE_KEY, apnType); 1609c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela if (apn != null) intent.putExtra(PhoneConstants.DATA_APN_KEY, apn); 1610d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville if (linkProperties != null) { 1611d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville intent.putExtra(PhoneConstants.DATA_LINK_PROPERTIES_KEY,linkProperties); 1612d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville } 1613c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela if (failCause != null) intent.putExtra(PhoneConstants.DATA_FAILURE_CAUSE_KEY, failCause); 1614c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela 1615c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela mContext.sendBroadcastAsUser(intent, UserHandle.ALL, 1616c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela android.Manifest.permission.READ_PRECISE_PHONE_STATE); 1617c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela } 1618c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela 1619ceaed68b074bd341ed9b5f13ff9cc69e3f533999Andrew Flynn private void enforceNotifyPermissionOrCarrierPrivilege(String method) { 1620ceaed68b074bd341ed9b5f13ff9cc69e3f533999Andrew Flynn if (checkNotifyPermission()) { 1621ceaed68b074bd341ed9b5f13ff9cc69e3f533999Andrew Flynn return; 16221f45264dd6b874d72ed901a2213c779d42d321c1Andrew Flynn } 16231f45264dd6b874d72ed901a2213c779d42d321c1Andrew Flynn 1624ceaed68b074bd341ed9b5f13ff9cc69e3f533999Andrew Flynn enforceCarrierPrivilege(); 16251f45264dd6b874d72ed901a2213c779d42d321c1Andrew Flynn } 16261f45264dd6b874d72ed901a2213c779d42d321c1Andrew Flynn 162745515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh private boolean checkNotifyPermission(String method) { 16281f45264dd6b874d72ed901a2213c779d42d321c1Andrew Flynn if (checkNotifyPermission()) { 1629ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project return true; 1630ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 1631ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project String msg = "Modify Phone State Permission Denial: " + method + " from pid=" 1632e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville + Binder.getCallingPid() + ", uid=" + Binder.getCallingUid(); 1633f4cd25b2c867ad74f983f1bacae3925005685a69Wink Saville if (DBG) log(msg); 1634ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project return false; 1635ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 163645515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh 16371f45264dd6b874d72ed901a2213c779d42d321c1Andrew Flynn private boolean checkNotifyPermission() { 16381f45264dd6b874d72ed901a2213c779d42d321c1Andrew Flynn return mContext.checkCallingOrSelfPermission(android.Manifest.permission.MODIFY_PHONE_STATE) 16391f45264dd6b874d72ed901a2213c779d42d321c1Andrew Flynn == PackageManager.PERMISSION_GRANTED; 16401f45264dd6b874d72ed901a2213c779d42d321c1Andrew Flynn } 16411f45264dd6b874d72ed901a2213c779d42d321c1Andrew Flynn 1642ceaed68b074bd341ed9b5f13ff9cc69e3f533999Andrew Flynn private void enforceCarrierPrivilege() { 16431f45264dd6b874d72ed901a2213c779d42d321c1Andrew Flynn TelephonyManager tm = TelephonyManager.getDefault(); 16441f45264dd6b874d72ed901a2213c779d42d321c1Andrew Flynn String[] pkgs = mContext.getPackageManager().getPackagesForUid(Binder.getCallingUid()); 16451f45264dd6b874d72ed901a2213c779d42d321c1Andrew Flynn for (String pkg : pkgs) { 16461f45264dd6b874d72ed901a2213c779d42d321c1Andrew Flynn if (tm.checkCarrierPrivilegesForPackage(pkg) == 16471f45264dd6b874d72ed901a2213c779d42d321c1Andrew Flynn TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS) { 1648ceaed68b074bd341ed9b5f13ff9cc69e3f533999Andrew Flynn return; 16491f45264dd6b874d72ed901a2213c779d42d321c1Andrew Flynn } 16501f45264dd6b874d72ed901a2213c779d42d321c1Andrew Flynn } 16511f45264dd6b874d72ed901a2213c779d42d321c1Andrew Flynn 1652ceaed68b074bd341ed9b5f13ff9cc69e3f533999Andrew Flynn String msg = "Carrier Privilege Permission Denial: from pid=" + Binder.getCallingPid() 1653ceaed68b074bd341ed9b5f13ff9cc69e3f533999Andrew Flynn + ", uid=" + Binder.getCallingUid(); 1654ceaed68b074bd341ed9b5f13ff9cc69e3f533999Andrew Flynn if (DBG) log(msg); 1655ceaed68b074bd341ed9b5f13ff9cc69e3f533999Andrew Flynn throw new SecurityException(msg); 16561f45264dd6b874d72ed901a2213c779d42d321c1Andrew Flynn } 16571f45264dd6b874d72ed901a2213c779d42d321c1Andrew Flynn 165845515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh private void checkListenerPermission(int events) { 165945515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh if ((events & PhoneStateListener.LISTEN_CELL_LOCATION) != 0) { 166045515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh mContext.enforceCallingOrSelfPermission( 166145515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh android.Manifest.permission.ACCESS_COARSE_LOCATION, null); 166245515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh 166345515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh } 166445515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh 1665963db55d59a170f4b17ff907c96615a19ef6fe17John Wang if ((events & PhoneStateListener.LISTEN_CELL_INFO) != 0) { 1666963db55d59a170f4b17ff907c96615a19ef6fe17John Wang mContext.enforceCallingOrSelfPermission( 1667963db55d59a170f4b17ff907c96615a19ef6fe17John Wang android.Manifest.permission.ACCESS_COARSE_LOCATION, null); 1668963db55d59a170f4b17ff907c96615a19ef6fe17John Wang 1669963db55d59a170f4b17ff907c96615a19ef6fe17John Wang } 1670963db55d59a170f4b17ff907c96615a19ef6fe17John Wang 1671309b2f63f3265c341f6a43cbca2fb25f9c38109aFyodor Kupolov if ((events & ENFORCE_PHONE_STATE_PERMISSION_MASK) != 0) { 16721cfd45701bca2be5ddabf9d523c8183a482fee00Amit Mahajan try { 1673a9e72a7653d25ae1974dac3f1156d126c807e40cAmit Mahajan mContext.enforceCallingOrSelfPermission( 16741cfd45701bca2be5ddabf9d523c8183a482fee00Amit Mahajan android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, null); 1675a9e72a7653d25ae1974dac3f1156d126c807e40cAmit Mahajan // SKIP checking for run-time permission since caller or self has PRIVILEGED 1676a9e72a7653d25ae1974dac3f1156d126c807e40cAmit Mahajan // permission 16771cfd45701bca2be5ddabf9d523c8183a482fee00Amit Mahajan } catch (SecurityException e) { 16781cfd45701bca2be5ddabf9d523c8183a482fee00Amit Mahajan mContext.enforceCallingOrSelfPermission( 16791cfd45701bca2be5ddabf9d523c8183a482fee00Amit Mahajan android.Manifest.permission.READ_PHONE_STATE, null); 16801cfd45701bca2be5ddabf9d523c8183a482fee00Amit Mahajan } 168145515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh } 1682c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela 1683c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela if ((events & PRECISE_PHONE_STATE_PERMISSION_MASK) != 0) { 1684c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela mContext.enforceCallingOrSelfPermission( 1685c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela android.Manifest.permission.READ_PRECISE_PHONE_STATE, null); 1686c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela 1687c5ac15a3e11c03951e269b243674858411204b67Antonio Marín Cerezuela } 1688485f2095f8ba695b88331c01a2de468b5616a5d7New Author Steven Liu 1689485f2095f8ba695b88331c01a2de468b5616a5d7New Author Steven Liu if ((events & PhoneStateListener.LISTEN_OEM_HOOK_RAW_EVENT) != 0) { 1690485f2095f8ba695b88331c01a2de468b5616a5d7New Author Steven Liu mContext.enforceCallingOrSelfPermission( 1691485f2095f8ba695b88331c01a2de468b5616a5d7New Author Steven Liu android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, null); 1692485f2095f8ba695b88331c01a2de468b5616a5d7New Author Steven Liu } 169345515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh } 1694163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato 1695163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato private void handleRemoveListLocked() { 1696a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville int size = mRemoveList.size(); 1697a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville if (VDBG) log("handleRemoveListLocked: mRemoveList.size()=" + size); 1698a374c3d03b28f135cdfba2cadf6fe6f03ac010bdWink Saville if (size > 0) { 1699163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato for (IBinder b: mRemoveList) { 1700163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato remove(b); 1701163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato } 1702163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato mRemoveList.clear(); 1703163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato } 1704163d8d972b8b78979310fd31dcb17fe237d27533Joe Onorato } 1705a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville 1706a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville private boolean validateEventsAndUserLocked(Record r, int events) { 1707a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville int foregroundUser; 1708a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville long callingIdentity = Binder.clearCallingIdentity(); 1709a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville boolean valid = false; 1710a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville try { 1711a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville foregroundUser = ActivityManager.getCurrentUser(); 1712309b2f63f3265c341f6a43cbca2fb25f9c38109aFyodor Kupolov valid = r.callerUserId == foregroundUser && r.matchPhoneStateListenerEvent(events); 1713a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville if (DBG | DBG_LOC) { 1714f4cd25b2c867ad74f983f1bacae3925005685a69Wink Saville log("validateEventsAndUserLocked: valid=" + valid 1715309b2f63f3265c341f6a43cbca2fb25f9c38109aFyodor Kupolov + " r.callerUserId=" + r.callerUserId + " foregroundUser=" + foregroundUser 1716a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville + " r.events=" + r.events + " events=" + events); 1717a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville } 1718a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville } finally { 1719a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville Binder.restoreCallingIdentity(callingIdentity); 1720a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville } 1721a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville return valid; 1722a12a7b3d3d8fc8678411295df4d001447b33a994Wink Saville } 1723fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville 1724fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville private boolean validatePhoneId(int phoneId) { 1725fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville boolean valid = (phoneId >= 0) && (phoneId < mNumPhones); 1726f4cd25b2c867ad74f983f1bacae3925005685a69Wink Saville if (VDBG) log("validatePhoneId: " + valid); 1727fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville return valid; 1728fb40dd4d00bd3361b2535bc866e6c21eadc52558Wink Saville } 1729f4cd25b2c867ad74f983f1bacae3925005685a69Wink Saville 1730f4cd25b2c867ad74f983f1bacae3925005685a69Wink Saville private static void log(String s) { 1731f4cd25b2c867ad74f983f1bacae3925005685a69Wink Saville Rlog.d(TAG, s); 1732f4cd25b2c867ad74f983f1bacae3925005685a69Wink Saville } 173347d8d1b0a8641a1c346da39f5052ae5aa845d117Wink Saville 17348b79fb6065370100c5a9e9b08458d932048dbb91xinhe boolean idMatch(int rSubId, int subId, int phoneId) { 1735ac11ae91c7c926e792a35eb66e71e9f3b5cf4f93xinhe 1736ac11ae91c7c926e792a35eb66e71e9f3b5cf4f93xinhe if(subId < 0) { 1737ac11ae91c7c926e792a35eb66e71e9f3b5cf4f93xinhe // Invalid case, we need compare phoneId with default one. 1738ac11ae91c7c926e792a35eb66e71e9f3b5cf4f93xinhe return (mDefaultPhoneId == phoneId); 1739ac11ae91c7c926e792a35eb66e71e9f3b5cf4f93xinhe } 1740d09c4cad65c708f2c4810d24295456708a2000d2Wink Saville if(rSubId == SubscriptionManager.DEFAULT_SUBSCRIPTION_ID) { 1741e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe return (subId == mDefaultSubId); 1742e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe } else { 1743e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe return (rSubId == subId); 1744e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe } 1745e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe } 1746e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe 1747e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe private void checkPossibleMissNotify(Record r, int phoneId) { 1748e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe int events = r.events; 1749e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe 1750e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe if ((events & PhoneStateListener.LISTEN_SERVICE_STATE) != 0) { 1751e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe try { 1752e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe if (VDBG) log("checkPossibleMissNotify: onServiceStateChanged state=" + 1753e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe mServiceState[phoneId]); 1754e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe r.callback.onServiceStateChanged( 1755e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe new ServiceState(mServiceState[phoneId])); 1756e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe } catch (RemoteException ex) { 1757a33cf075fa13c29d702d6b0a2aa2ae1323c60d73Etan Cohen mRemoveList.add(r.binder); 1758e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe } 1759e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe } 1760e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe 1761e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe if ((events & PhoneStateListener.LISTEN_SIGNAL_STRENGTHS) != 0) { 1762e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe try { 1763e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe SignalStrength signalStrength = mSignalStrength[phoneId]; 1764e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe if (DBG) { 1765e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe log("checkPossibleMissNotify: onSignalStrengthsChanged SS=" + signalStrength); 1766e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe } 1767e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe r.callback.onSignalStrengthsChanged(new SignalStrength(signalStrength)); 1768e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe } catch (RemoteException ex) { 1769e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe mRemoveList.add(r.binder); 1770e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe } 1771e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe } 1772e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe 1773e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe if ((events & PhoneStateListener.LISTEN_SIGNAL_STRENGTH) != 0) { 1774e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe try { 1775e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe int gsmSignalStrength = mSignalStrength[phoneId] 1776e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe .getGsmSignalStrength(); 1777e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe if (DBG) { 1778e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe log("checkPossibleMissNotify: onSignalStrengthChanged SS=" + 1779e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe gsmSignalStrength); 1780e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe } 1781e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe r.callback.onSignalStrengthChanged((gsmSignalStrength == 99 ? -1 1782e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe : gsmSignalStrength)); 1783e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe } catch (RemoteException ex) { 1784a33cf075fa13c29d702d6b0a2aa2ae1323c60d73Etan Cohen mRemoveList.add(r.binder); 1785e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe } 1786e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe } 1787e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe 1788e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe if (validateEventsAndUserLocked(r, PhoneStateListener.LISTEN_CELL_INFO)) { 1789e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe try { 1790e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe if (DBG_LOC) { 1791e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe log("checkPossibleMissNotify: onCellInfoChanged[" + phoneId + "] = " 1792e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe + mCellInfo.get(phoneId)); 1793e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe } 1794e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe r.callback.onCellInfoChanged(mCellInfo.get(phoneId)); 1795e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe } catch (RemoteException ex) { 1796a33cf075fa13c29d702d6b0a2aa2ae1323c60d73Etan Cohen mRemoveList.add(r.binder); 1797e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe } 1798e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe } 1799e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe 1800e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe if ((events & PhoneStateListener.LISTEN_MESSAGE_WAITING_INDICATOR) != 0) { 1801e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe try { 1802e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe if (VDBG) { 1803e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe log("checkPossibleMissNotify: onMessageWaitingIndicatorChanged phoneId=" 1804e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe + phoneId + " mwi=" + mMessageWaiting[phoneId]); 1805e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe } 1806e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe r.callback.onMessageWaitingIndicatorChanged( 1807e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe mMessageWaiting[phoneId]); 1808e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe } catch (RemoteException ex) { 1809a33cf075fa13c29d702d6b0a2aa2ae1323c60d73Etan Cohen mRemoveList.add(r.binder); 1810e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe } 1811e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe } 1812e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe 1813e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe if ((events & PhoneStateListener.LISTEN_CALL_FORWARDING_INDICATOR) != 0) { 1814e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe try { 1815e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe if (VDBG) { 1816e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe log("checkPossibleMissNotify: onCallForwardingIndicatorChanged phoneId=" 1817e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe + phoneId + " cfi=" + mCallForwarding[phoneId]); 1818e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe } 1819e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe r.callback.onCallForwardingIndicatorChanged( 1820e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe mCallForwarding[phoneId]); 1821e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe } catch (RemoteException ex) { 1822a33cf075fa13c29d702d6b0a2aa2ae1323c60d73Etan Cohen mRemoveList.add(r.binder); 1823e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe } 1824e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe } 1825e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe 1826e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe if (validateEventsAndUserLocked(r, PhoneStateListener.LISTEN_CELL_LOCATION)) { 1827e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe try { 1828e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe if (DBG_LOC) log("checkPossibleMissNotify: onCellLocationChanged mCellLocation = " 1829e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe + mCellLocation[phoneId]); 1830e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe r.callback.onCellLocationChanged(new Bundle(mCellLocation[phoneId])); 1831e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe } catch (RemoteException ex) { 1832e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe mRemoveList.add(r.binder); 1833e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe } 1834e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe } 1835e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe 1836e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe if ((events & PhoneStateListener.LISTEN_DATA_CONNECTION_STATE) != 0) { 1837e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe try { 1838e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe if (DBG) { 1839e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe log("checkPossibleMissNotify: onDataConnectionStateChanged(mDataConnectionState" 1840e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe + "=" + mDataConnectionState[phoneId] 1841e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe + ", mDataConnectionNetworkType=" + mDataConnectionNetworkType[phoneId] 1842e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe + ")"); 1843e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe } 1844e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe r.callback.onDataConnectionStateChanged(mDataConnectionState[phoneId], 1845e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe mDataConnectionNetworkType[phoneId]); 1846e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe } catch (RemoteException ex) { 1847a33cf075fa13c29d702d6b0a2aa2ae1323c60d73Etan Cohen mRemoveList.add(r.binder); 1848e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe } 1849e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe } 1850e9f1640b6bb3f10d6c94f05774bcfaa788bea55cxinhe } 18519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1852