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