10825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/*
20825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Copyright (C) 2006 The Android Open Source Project
30825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
40825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Licensed under the Apache License, Version 2.0 (the "License");
50825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * you may not use this file except in compliance with the License.
60825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * You may obtain a copy of the License at
70825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
80825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *      http://www.apache.org/licenses/LICENSE-2.0
90825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *
100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Unless required by applicable law or agreed to in writing, software
110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * distributed under the License is distributed on an "AS IS" BASIS,
120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * See the License for the specific language governing permissions and
140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * limitations under the License.
150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */
160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
170825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepackage com.android.internal.telephony;
180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
190825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.net.LinkProperties;
2096cce86cf08e37e0f09ed5057b1196e26b302743Robert Greenwaltimport android.net.NetworkCapabilities;
210825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.Bundle;
220825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.RemoteException;
230825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.ServiceManager;
240825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.telephony.CellInfo;
25a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.telephony.Rlog;
26a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.telephony.VoLteServiceState;
270825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.telephony.ServiceState;
28a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport android.telephony.SubscriptionManager;
290825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.telephony.TelephonyManager;
300742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuelaimport android.telephony.PreciseCallState;
310742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuelaimport android.telephony.DisconnectCause;
320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
33a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.internal.telephony.Call;
34a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.internal.telephony.CallManager;
35a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.internal.telephony.Phone;
360825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.ITelephonyRegistry;
37a8467dd0c524787104b1ccdddc5e8af10ba729edWink Savilleimport com.android.internal.telephony.PhoneConstants;
380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
39ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Savilleimport java.util.List;
40ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville
410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/**
420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * broadcast intents
430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */
440825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepublic class DefaultPhoneNotifier implements PhoneNotifier {
45d2c79d28884203ad4f13ebdf443b3899d56b93d6Wink Saville    private static final String LOG_TAG = "DefaultPhoneNotifier";
46d2c79d28884203ad4f13ebdf443b3899d56b93d6Wink Saville    private static final boolean DBG = false; // STOPSHIP if true
470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
48a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    protected ITelephonyRegistry mRegistry;
490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
50ec6e2f9f13bac23cdfa0de0a56826b21050b6487fionaxu    public DefaultPhoneNotifier() {
510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mRegistry = ITelephonyRegistry.Stub.asInterface(ServiceManager.getService(
520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    "telephony.registry"));
530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
55cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void notifyPhoneState(Phone sender) {
570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Call ringingCall = sender.getRingingCall();
58b237a11044ed842d2865ff8c8716befb06b6ca25Wink Saville        int subId = sender.getSubId();
59bd3158360ca73324921350a1c61336af7f9c6d8dShishir Agrawal        int phoneId = sender.getPhoneId();
600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String incomingNumber = "";
61bd3158360ca73324921350a1c61336af7f9c6d8dShishir Agrawal        if (ringingCall != null && ringingCall.getEarliestConnection() != null) {
620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            incomingNumber = ringingCall.getEarliestConnection().getAddress();
630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        try {
657961ac2c8d2e50d879bc6d5b272b7d972a335c0eAdam Lesinski            if (mRegistry != null) {
66bd3158360ca73324921350a1c61336af7f9c6d8dShishir Agrawal                  mRegistry.notifyCallStateForPhoneId(phoneId, subId,
67a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                        convertCallState(sender.getState()), incomingNumber);
68a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            }
69a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        } catch (RemoteException ex) {
70a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            // system process is dead
71a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        }
720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
74cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void notifyServiceState(Phone sender) {
760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        ServiceState ss = sender.getServiceState();
77d1a60dfe521f376e3500946d5371f126dbd36767xinhe        int phoneId = sender.getPhoneId();
78b237a11044ed842d2865ff8c8716befb06b6ca25Wink Saville        int subId = sender.getSubId();
79d1a60dfe521f376e3500946d5371f126dbd36767xinhe
80a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        Rlog.d(LOG_TAG, "nofityServiceState: mRegistry=" + mRegistry + " ss=" + ss
81d1a60dfe521f376e3500946d5371f126dbd36767xinhe                + " sender=" + sender + " phondId=" + phoneId + " subId=" + subId);
820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (ss == null) {
830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            ss = new ServiceState();
840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            ss.setStateOutOfService();
850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        try {
877961ac2c8d2e50d879bc6d5b272b7d972a335c0eAdam Lesinski            if (mRegistry != null) {
88d1a60dfe521f376e3500946d5371f126dbd36767xinhe                mRegistry.notifyServiceStateForPhoneId(phoneId, subId, ss);
897961ac2c8d2e50d879bc6d5b272b7d972a335c0eAdam Lesinski            }
900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } catch (RemoteException ex) {
910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // system process is dead
920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
95cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void notifySignalStrength(Phone sender) {
97bd3158360ca73324921350a1c61336af7f9c6d8dShishir Agrawal        int phoneId = sender.getPhoneId();
98b237a11044ed842d2865ff8c8716befb06b6ca25Wink Saville        int subId = sender.getSubId();
991a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        if (DBG) {
1001a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            // too chatty to log constantly
1011a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu            Rlog.d(LOG_TAG, "notifySignalStrength: mRegistry=" + mRegistry
1021a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu                    + " ss=" + sender.getSignalStrength() + " sender=" + sender);
1031a87ab3d7170d618f048c4f5af8c7504a587aaa5Jack Yu        }
1040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        try {
1057961ac2c8d2e50d879bc6d5b272b7d972a335c0eAdam Lesinski            if (mRegistry != null) {
106bd3158360ca73324921350a1c61336af7f9c6d8dShishir Agrawal                mRegistry.notifySignalStrengthForPhoneId(phoneId, subId,
107bd3158360ca73324921350a1c61336af7f9c6d8dShishir Agrawal                        sender.getSignalStrength());
1087961ac2c8d2e50d879bc6d5b272b7d972a335c0eAdam Lesinski            }
1090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } catch (RemoteException ex) {
1100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // system process is dead
1110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
114cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
1150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void notifyMessageWaitingChanged(Phone sender) {
116d1a60dfe521f376e3500946d5371f126dbd36767xinhe        int phoneId = sender.getPhoneId();
117b237a11044ed842d2865ff8c8716befb06b6ca25Wink Saville        int subId = sender.getSubId();
118d1a60dfe521f376e3500946d5371f126dbd36767xinhe
1190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        try {
1207961ac2c8d2e50d879bc6d5b272b7d972a335c0eAdam Lesinski            if (mRegistry != null) {
121d1a60dfe521f376e3500946d5371f126dbd36767xinhe                mRegistry.notifyMessageWaitingChangedForPhoneId(phoneId, subId,
122a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                        sender.getMessageWaitingIndicator());
1237961ac2c8d2e50d879bc6d5b272b7d972a335c0eAdam Lesinski            }
1240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } catch (RemoteException ex) {
1250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // system process is dead
1260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
129cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
1300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void notifyCallForwardingChanged(Phone sender) {
131b237a11044ed842d2865ff8c8716befb06b6ca25Wink Saville        int subId = sender.getSubId();
1320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        try {
1337961ac2c8d2e50d879bc6d5b272b7d972a335c0eAdam Lesinski            if (mRegistry != null) {
1346a5ef38e6ae3d3a3ad90ae180388fe85de0495a2Wink Saville                mRegistry.notifyCallForwardingChangedForSubscriber(subId,
135a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                        sender.getCallForwardingIndicator());
1367961ac2c8d2e50d879bc6d5b272b7d972a335c0eAdam Lesinski            }
1370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } catch (RemoteException ex) {
1380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // system process is dead
1390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
142cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
1430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void notifyDataActivity(Phone sender) {
144b237a11044ed842d2865ff8c8716befb06b6ca25Wink Saville        int subId = sender.getSubId();
1450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        try {
1467961ac2c8d2e50d879bc6d5b272b7d972a335c0eAdam Lesinski            if (mRegistry != null) {
1476a5ef38e6ae3d3a3ad90ae180388fe85de0495a2Wink Saville                mRegistry.notifyDataActivityForSubscriber(subId,
148a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                        convertDataActivityState(sender.getDataActivityState()));
1497961ac2c8d2e50d879bc6d5b272b7d972a335c0eAdam Lesinski            }
1500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } catch (RemoteException ex) {
1510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // system process is dead
1520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
155cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
1560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void notifyDataConnection(Phone sender, String reason, String apnType,
1570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            PhoneConstants.DataState state) {
1580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        doNotifyDataConnection(sender, reason, apnType, state);
1590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void doNotifyDataConnection(Phone sender, String reason, String apnType,
1620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            PhoneConstants.DataState state) {
163b237a11044ed842d2865ff8c8716befb06b6ca25Wink Saville        int subId = sender.getSubId();
164960c250fc2afee078852df1f37a887cec848ec5dShishir Agrawal        long dds = SubscriptionManager.getDefaultDataSubscriptionId();
165d2c79d28884203ad4f13ebdf443b3899d56b93d6Wink Saville        if (DBG) log("subId = " + subId + ", DDS = " + dds);
166a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
1670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // TODO
1680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // use apnType as the key to which connection we're talking about.
1690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // pass apnType back up to fetch particular for this one.
1700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        TelephonyManager telephony = TelephonyManager.getDefault();
1710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        LinkProperties linkProperties = null;
17296cce86cf08e37e0f09ed5057b1196e26b302743Robert Greenwalt        NetworkCapabilities networkCapabilities = null;
1730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        boolean roaming = false;
1740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (state == PhoneConstants.DataState.CONNECTED) {
1760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            linkProperties = sender.getLinkProperties(apnType);
17796cce86cf08e37e0f09ed5057b1196e26b302743Robert Greenwalt            networkCapabilities = sender.getNetworkCapabilities(apnType);
1780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        ServiceState ss = sender.getServiceState();
180ffdf8ce51e37e5e45791c9ea11604aa00dffc88eJing Zhao        if (ss != null) roaming = ss.getDataRoaming();
1810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        try {
1837961ac2c8d2e50d879bc6d5b272b7d972a335c0eAdam Lesinski            if (mRegistry != null) {
1846a5ef38e6ae3d3a3ad90ae180388fe85de0495a2Wink Saville                mRegistry.notifyDataConnectionForSubscriber(subId,
185a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    convertDataState(state),
186a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    sender.isDataConnectivityPossible(apnType), reason,
187a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    sender.getActiveApnHost(apnType),
188a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    apnType,
189a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    linkProperties,
190a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    networkCapabilities,
1910470315f0ad74e6bf756824cf1cdf62f85feaeabStuart Scott                    ((telephony!=null) ? telephony.getDataNetworkType(subId) :
192a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    TelephonyManager.NETWORK_TYPE_UNKNOWN),
193a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville                    roaming);
1947961ac2c8d2e50d879bc6d5b272b7d972a335c0eAdam Lesinski            }
1950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } catch (RemoteException ex) {
1960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // system process is dead
1970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
200cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
2010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void notifyDataConnectionFailed(Phone sender, String reason, String apnType) {
202b237a11044ed842d2865ff8c8716befb06b6ca25Wink Saville        int subId = sender.getSubId();
2030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        try {
2047961ac2c8d2e50d879bc6d5b272b7d972a335c0eAdam Lesinski            if (mRegistry != null) {
2056a5ef38e6ae3d3a3ad90ae180388fe85de0495a2Wink Saville                mRegistry.notifyDataConnectionFailedForSubscriber(subId, reason, apnType);
2067961ac2c8d2e50d879bc6d5b272b7d972a335c0eAdam Lesinski            }
2070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } catch (RemoteException ex) {
2080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // system process is dead
2090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
2100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
212cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
2130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void notifyCellLocation(Phone sender) {
214b237a11044ed842d2865ff8c8716befb06b6ca25Wink Saville        int subId = sender.getSubId();
2150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Bundle data = new Bundle();
2160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        sender.getCellLocation().fillInNotifierBundle(data);
2170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        try {
2187961ac2c8d2e50d879bc6d5b272b7d972a335c0eAdam Lesinski            if (mRegistry != null) {
2196a5ef38e6ae3d3a3ad90ae180388fe85de0495a2Wink Saville                mRegistry.notifyCellLocationForSubscriber(subId, data);
2207961ac2c8d2e50d879bc6d5b272b7d972a335c0eAdam Lesinski            }
2210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } catch (RemoteException ex) {
2220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // system process is dead
2230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
2240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
226cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
227ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville    public void notifyCellInfo(Phone sender, List<CellInfo> cellInfo) {
228b237a11044ed842d2865ff8c8716befb06b6ca25Wink Saville        int subId = sender.getSubId();
2290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        try {
2307961ac2c8d2e50d879bc6d5b272b7d972a335c0eAdam Lesinski            if (mRegistry != null) {
2316a5ef38e6ae3d3a3ad90ae180388fe85de0495a2Wink Saville                mRegistry.notifyCellInfoForSubscriber(subId, cellInfo);
2327961ac2c8d2e50d879bc6d5b272b7d972a335c0eAdam Lesinski            }
2330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } catch (RemoteException ex) {
2340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
2360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
238cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    @Override
2390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void notifyOtaspChanged(Phone sender, int otaspMode) {
240a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        // FIXME: subId?
2410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        try {
2427961ac2c8d2e50d879bc6d5b272b7d972a335c0eAdam Lesinski            if (mRegistry != null) {
2437961ac2c8d2e50d879bc6d5b272b7d972a335c0eAdam Lesinski                mRegistry.notifyOtaspChanged(otaspMode);
2447961ac2c8d2e50d879bc6d5b272b7d972a335c0eAdam Lesinski            }
2450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } catch (RemoteException ex) {
2460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // system process is dead
2470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
2480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2500742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela    public void notifyPreciseCallState(Phone sender) {
251a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        // FIXME: subId?
2520742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela        Call ringingCall = sender.getRingingCall();
2530742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela        Call foregroundCall = sender.getForegroundCall();
2540742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela        Call backgroundCall = sender.getBackgroundCall();
2550742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela        if (ringingCall != null && foregroundCall != null && backgroundCall != null) {
2560742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela            try {
2570742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela                mRegistry.notifyPreciseCallState(
2580742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela                        convertPreciseCallState(ringingCall.getState()),
2590742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela                        convertPreciseCallState(foregroundCall.getState()),
2600742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela                        convertPreciseCallState(backgroundCall.getState()));
2610742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela            } catch (RemoteException ex) {
2620742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela                // system process is dead
2630742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela            }
2640742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela        }
2650742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela    }
2660742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela
267b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen    public void notifyDisconnectCause(int cause, int preciseCause) {
268a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        // FIXME: subId?
2690742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela        try {
270b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen            mRegistry.notifyDisconnectCause(cause, preciseCause);
2710742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela        } catch (RemoteException ex) {
2720742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela            // system process is dead
2730742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela        }
2740742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela    }
2750742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela
2760742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela    public void notifyPreciseDataConnectionFailed(Phone sender, String reason, String apnType,
2770742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela            String apn, String failCause) {
278a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        // FIXME: subId?
2790742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela        try {
2800742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela            mRegistry.notifyPreciseDataConnectionFailed(reason, apnType, apn, failCause);
2810742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela        } catch (RemoteException ex) {
2820742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela            // system process is dead
2830742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela        }
2840742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela    }
2850742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela
286a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    @Override
287a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public void notifyVoLteServiceStateChanged(Phone sender, VoLteServiceState lteState) {
288a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        // FIXME: subID
289a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        try {
290a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            mRegistry.notifyVoLteServiceStateChanged(lteState);
291a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        } catch (RemoteException ex) {
292a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville            // system process is dead
293a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        }
294a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
295a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
296110eda521d7a40ffcb09f31fd02d3d65a10cdcc3New Author Steven Liu    @Override
297b237a11044ed842d2865ff8c8716befb06b6ca25Wink Saville    public void notifyOemHookRawEventForSubscriber(int subId, byte[] rawData) {
298110eda521d7a40ffcb09f31fd02d3d65a10cdcc3New Author Steven Liu        try {
299110eda521d7a40ffcb09f31fd02d3d65a10cdcc3New Author Steven Liu            mRegistry.notifyOemHookRawEventForSubscriber(subId, rawData);
300110eda521d7a40ffcb09f31fd02d3d65a10cdcc3New Author Steven Liu        } catch (RemoteException ex) {
301110eda521d7a40ffcb09f31fd02d3d65a10cdcc3New Author Steven Liu            // system process is dead
302110eda521d7a40ffcb09f31fd02d3d65a10cdcc3New Author Steven Liu        }
303110eda521d7a40ffcb09f31fd02d3d65a10cdcc3New Author Steven Liu    }
304110eda521d7a40ffcb09f31fd02d3d65a10cdcc3New Author Steven Liu
3050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
306cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     * Convert the {@link PhoneConstants.State} enum into the TelephonyManager.CALL_STATE_*
307cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     * constants for the public API.
3080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
3090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static int convertCallState(PhoneConstants.State state) {
3100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        switch (state) {
3110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case RINGING:
3120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                return TelephonyManager.CALL_STATE_RINGING;
3130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case OFFHOOK:
3140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                return TelephonyManager.CALL_STATE_OFFHOOK;
3150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            default:
3160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                return TelephonyManager.CALL_STATE_IDLE;
3170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
3180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
321cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     * Convert the TelephonyManager.CALL_STATE_* constants into the
322cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     * {@link PhoneConstants.State} enum for the public API.
3230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
3240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static PhoneConstants.State convertCallState(int state) {
3250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        switch (state) {
3260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case TelephonyManager.CALL_STATE_RINGING:
3270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                return PhoneConstants.State.RINGING;
3280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case TelephonyManager.CALL_STATE_OFFHOOK:
3290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                return PhoneConstants.State.OFFHOOK;
3300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            default:
3310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                return PhoneConstants.State.IDLE;
3320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
3330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
336cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     * Convert the {@link PhoneConstants.DataState} enum into the TelephonyManager.DATA_* constants
3370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * for the public API.
3380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
3390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static int convertDataState(PhoneConstants.DataState state) {
3400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        switch (state) {
3410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case CONNECTING:
3420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                return TelephonyManager.DATA_CONNECTING;
3430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case CONNECTED:
3440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                return TelephonyManager.DATA_CONNECTED;
3450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case SUSPENDED:
3460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                return TelephonyManager.DATA_SUSPENDED;
3470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            default:
3480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                return TelephonyManager.DATA_DISCONNECTED;
3490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
3500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
353cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     * Convert the TelephonyManager.DATA_* constants into {@link PhoneConstants.DataState} enum
3540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * for the public API.
3550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
3560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static PhoneConstants.DataState convertDataState(int state) {
3570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        switch (state) {
3580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case TelephonyManager.DATA_CONNECTING:
3590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                return PhoneConstants.DataState.CONNECTING;
3600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case TelephonyManager.DATA_CONNECTED:
3610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                return PhoneConstants.DataState.CONNECTED;
3620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case TelephonyManager.DATA_SUSPENDED:
3630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                return PhoneConstants.DataState.SUSPENDED;
3640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            default:
3650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                return PhoneConstants.DataState.DISCONNECTED;
3660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
3670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
370cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville     * Convert the {@link Phone.DataActivityState} enum into the TelephonyManager.DATA_* constants
3710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * for the public API.
3720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
3730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public static int convertDataActivityState(Phone.DataActivityState state) {
3740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        switch (state) {
3750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case DATAIN:
3760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                return TelephonyManager.DATA_ACTIVITY_IN;
3770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case DATAOUT:
3780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                return TelephonyManager.DATA_ACTIVITY_OUT;
3790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case DATAINANDOUT:
3800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                return TelephonyManager.DATA_ACTIVITY_INOUT;
3810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case DORMANT:
3820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                return TelephonyManager.DATA_ACTIVITY_DORMANT;
3830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            default:
3840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                return TelephonyManager.DATA_ACTIVITY_NONE;
3850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
3860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
389e36f59c8a17246eb7924ba1d2bf70f6a2eead1e2Amit Mahajan     * Convert the {@link Call.State} enum into the PreciseCallState.PRECISE_CALL_STATE_* constants
3900742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela     * for the public API.
3910742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela     */
3920742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela    public static int convertPreciseCallState(Call.State state) {
3930742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela        switch (state) {
3940742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela            case ACTIVE:
3950742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela                return PreciseCallState.PRECISE_CALL_STATE_ACTIVE;
3960742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela            case HOLDING:
3970742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela                return PreciseCallState.PRECISE_CALL_STATE_HOLDING;
3980742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela            case DIALING:
3990742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela                return PreciseCallState.PRECISE_CALL_STATE_DIALING;
4000742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela            case ALERTING:
4010742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela                return PreciseCallState.PRECISE_CALL_STATE_ALERTING;
4020742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela            case INCOMING:
4030742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela                return PreciseCallState.PRECISE_CALL_STATE_INCOMING;
4040742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela            case WAITING:
4050742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela                return PreciseCallState.PRECISE_CALL_STATE_WAITING;
4060742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela            case DISCONNECTED:
4070742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela                return PreciseCallState.PRECISE_CALL_STATE_DISCONNECTED;
4080742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela            case DISCONNECTING:
4090742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela                return PreciseCallState.PRECISE_CALL_STATE_DISCONNECTING;
4100742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela            default:
4110742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela                return PreciseCallState.PRECISE_CALL_STATE_IDLE;
4120742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela        }
4130742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela    }
4140742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela
415d2c79d28884203ad4f13ebdf443b3899d56b93d6Wink Saville    private void log(String s) {
416d2c79d28884203ad4f13ebdf443b3899d56b93d6Wink Saville        Rlog.d(LOG_TAG, s);
417d2c79d28884203ad4f13ebdf443b3899d56b93d6Wink Saville    }
4180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville}
419