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