10825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/*
20825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Copyright (C) 2010 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.sip;
180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
190825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.content.Context;
200825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.net.LinkProperties;
210825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.AsyncResult;
220825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.Handler;
230825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.Message;
240825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.Registrant;
250825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.RegistrantList;
260825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.SystemProperties;
27ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Savilleimport android.telephony.CellInfo;
280825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.telephony.CellLocation;
290825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.telephony.ServiceState;
300825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.telephony.SignalStrength;
310825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.util.Log;
320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
330825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.Call;
340825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.CallStateException;
350825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.Connection;
360825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.DataConnection;
370825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.IccCard;
380825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.IccFileHandler;
390825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.IccPhoneBookInterfaceManager;
400825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.IccSmsInterfaceManager;
410825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.MmiCode;
420825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.OperatorInfo;
430825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.Phone;
440825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.PhoneBase;
450825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.PhoneConstants;
460825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.PhoneNotifier;
470825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.PhoneSubInfo;
480825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.TelephonyProperties;
490825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.UUSInfo;
500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
510825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.ArrayList;
520825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.util.List;
530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
540825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleabstract class SipPhoneBase extends PhoneBase {
550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static final String LOG_TAG = "SipPhone";
560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private RegistrantList mRingbackRegistrants = new RegistrantList();
580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private PhoneConstants.State state = PhoneConstants.State.IDLE;
590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public SipPhoneBase(Context context, PhoneNotifier notifier) {
610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        super(notifier, context, new SipCommandInterface(context), false);
620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public abstract Call getForegroundCall();
650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public abstract Call getBackgroundCall();
670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public abstract Call getRingingCall();
690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public Connection dial(String dialString, UUSInfo uusInfo)
710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            throws CallStateException {
720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // ignore UUSInfo
730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return dial(dialString);
740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    void migrateFrom(SipPhoneBase from) {
770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        migrate(mRingbackRegistrants, from.mRingbackRegistrants);
780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        migrate(mPreciseCallStateRegistrants, from.mPreciseCallStateRegistrants);
790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        migrate(mNewRingingConnectionRegistrants, from.mNewRingingConnectionRegistrants);
800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        migrate(mIncomingRingRegistrants, from.mIncomingRingRegistrants);
810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        migrate(mDisconnectRegistrants, from.mDisconnectRegistrants);
820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        migrate(mServiceStateRegistrants, from.mServiceStateRegistrants);
830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        migrate(mMmiCompleteRegistrants, from.mMmiCompleteRegistrants);
840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        migrate(mMmiRegistrants, from.mMmiRegistrants);
850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        migrate(mUnknownConnectionRegistrants, from.mUnknownConnectionRegistrants);
860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        migrate(mSuppServiceFailedRegistrants, from.mSuppServiceFailedRegistrants);
870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    static void migrate(RegistrantList to, RegistrantList from) {
900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        from.removeCleared();
910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        for (int i = 0, n = from.size(); i < n; i++) {
920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            to.add((Registrant) from.get(i));
930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void registerForRingbackTone(Handler h, int what, Object obj) {
980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mRingbackRegistrants.addUnique(h, what, obj);
990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
1020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void unregisterForRingbackTone(Handler h) {
1030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mRingbackRegistrants.remove(h);
1040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected void startRingbackTone() {
1070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        AsyncResult result = new AsyncResult(null, Boolean.TRUE, null);
1080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mRingbackRegistrants.notifyRegistrants(result);
1090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected void stopRingbackTone() {
1120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        AsyncResult result = new AsyncResult(null, Boolean.FALSE, null);
1130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mRingbackRegistrants.notifyRegistrants(result);
1140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public ServiceState getServiceState() {
1170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // FIXME: we may need to provide this when data connectivity is lost
1180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // or when server is down
1190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        ServiceState s = new ServiceState();
1200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        s.setState(ServiceState.STATE_IN_SERVICE);
1210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return s;
1220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
124ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville    /**
125ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville     * @return all available cell information or null if none.
126ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville     */
127ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville    @Override
128ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville    public List<CellInfo> getAllCellInfo() {
129ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville        return getServiceStateTracker().getAllCellInfo();
130ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville    }
131ef1d4bff9bbf7d967dbcace73f08910e14e367d0Wink Saville
1320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public CellLocation getCellLocation() {
1330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return null;
1340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public PhoneConstants.State getState() {
1370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return state;
1380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public int getPhoneType() {
1410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return PhoneConstants.PHONE_TYPE_SIP;
1420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public SignalStrength getSignalStrength() {
1450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return new SignalStrength();
1460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean getMessageWaitingIndicator() {
1490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return false;
1500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean getCallForwardingIndicator() {
1530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return false;
1540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public List<? extends MmiCode> getPendingMmiCodes() {
1570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return new ArrayList<MmiCode>(0);
1580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public PhoneConstants.DataState getDataConnectionState() {
1610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return PhoneConstants.DataState.DISCONNECTED;
1620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public PhoneConstants.DataState getDataConnectionState(String apnType) {
1650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return PhoneConstants.DataState.DISCONNECTED;
1660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public DataActivityState getDataActivityState() {
1690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return DataActivityState.NONE;
1700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
1730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Notify any interested party of a Phone state change {@link Phone.State}
1740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    void notifyPhoneStateChanged() {
1760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mNotifier.notifyPhoneState(this);
1770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /**
1800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Notify registrants of a change in the call state. This notifies changes in {@link Call.State}
1810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * Use this when changes in the precise call state are needed, else use notifyPhoneStateChanged.
1820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
1830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    void notifyPreciseCallStateChanged() {
1840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        /* we'd love it if this was package-scoped*/
1850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        super.notifyPreciseCallStateChangedP();
1860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    void notifyNewRingingConnection(Connection c) {
1890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        super.notifyNewRingingConnectionP(c);
1900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    void notifyDisconnect(Connection cn) {
1930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mDisconnectRegistrants.notifyResult(cn);
1940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    void notifyUnknownConnection() {
1970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mUnknownConnectionRegistrants.notifyResult(this);
1980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    void notifySuppServiceFailed(SuppService code) {
2010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mSuppServiceFailedRegistrants.notifyResult(code);
2020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    void notifyServiceStateChanged(ServiceState ss) {
2050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        super.notifyServiceStateChangedP(ss);
2060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void notifyCallForwardingIndicator() {
2090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mNotifier.notifyCallForwardingChanged(this);
2100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean canDial() {
2130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        int serviceState = getServiceState().getState();
2140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Log.v(LOG_TAG, "canDial(): serviceState = " + serviceState);
2150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (serviceState == ServiceState.STATE_POWER_OFF) return false;
2160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        String disableCall = SystemProperties.get(
2180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                TelephonyProperties.PROPERTY_DISABLE_CALL, "false");
2190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Log.v(LOG_TAG, "canDial(): disableCall = " + disableCall);
2200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (disableCall.equals("true")) return false;
2210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Log.v(LOG_TAG, "canDial(): ringingCall: " + getRingingCall().getState());
2230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Log.v(LOG_TAG, "canDial(): foregndCall: " + getForegroundCall().getState());
2240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Log.v(LOG_TAG, "canDial(): backgndCall: " + getBackgroundCall().getState());
2250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return !getRingingCall().isRinging()
2260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                && (!getForegroundCall().getState().isAlive()
2270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    || !getBackgroundCall().getState().isAlive());
2280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean handleInCallMmiCommands(String dialString)
2310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            throws CallStateException {
2320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return false;
2330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    boolean isInCall() {
2360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Call.State foregroundCallState = getForegroundCall().getState();
2370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Call.State backgroundCallState = getBackgroundCall().getState();
2380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Call.State ringingCallState = getRingingCall().getState();
2390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville       return (foregroundCallState.isAlive() || backgroundCallState.isAlive()
2410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            || ringingCallState.isAlive());
2420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean handlePinMmi(String dialString) {
2450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return false;
2460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void sendUssdResponse(String ussdMessge) {
2490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void registerForSuppServiceNotification(
2520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            Handler h, int what, Object obj) {
2530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void unregisterForSuppServiceNotification(Handler h) {
2560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void setRadioPower(boolean power) {
2590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getVoiceMailNumber() {
2620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return null;
2630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getVoiceMailAlphaTag() {
2660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return null;
2670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getDeviceId() {
2700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return null;
2710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getDeviceSvn() {
2740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return null;
2750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getImei() {
2780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return null;
2790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getEsn() {
2820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Log.e(LOG_TAG, "[SipPhone] getEsn() is a CDMA method");
2830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return "0";
2840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getMeid() {
2870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Log.e(LOG_TAG, "[SipPhone] getMeid() is a CDMA method");
2880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return "0";
2890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getSubscriberId() {
2920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return null;
2930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getIccSerialNumber() {
2960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return null;
2970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
2990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getLine1Number() {
3000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return null;
3010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getLine1AlphaTag() {
3040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return null;
3050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void setLine1Number(String alphaTag, String number, Message onComplete) {
3080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // FIXME: what to reply for SIP?
3090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        AsyncResult.forMessage(onComplete, null, null);
3100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        onComplete.sendToTarget();
3110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void setVoiceMailNumber(String alphaTag, String voiceMailNumber,
3140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            Message onComplete) {
3150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // FIXME: what to reply for SIP?
3160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        AsyncResult.forMessage(onComplete, null, null);
3170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        onComplete.sendToTarget();
3180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void getCallForwardingOption(int commandInterfaceCFReason, Message onComplete) {
3210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void setCallForwardingOption(int commandInterfaceCFAction,
3240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            int commandInterfaceCFReason, String dialingNumber,
3250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            int timerSeconds, Message onComplete) {
3260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void getOutgoingCallerIdDisplay(Message onComplete) {
3290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // FIXME: what to reply?
3300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        AsyncResult.forMessage(onComplete, null, null);
3310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        onComplete.sendToTarget();
3320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void setOutgoingCallerIdDisplay(int commandInterfaceCLIRMode,
3350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                                           Message onComplete) {
3360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // FIXME: what's this for SIP?
3370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        AsyncResult.forMessage(onComplete, null, null);
3380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        onComplete.sendToTarget();
3390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void getCallWaiting(Message onComplete) {
3420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        AsyncResult.forMessage(onComplete, null, null);
3430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        onComplete.sendToTarget();
3440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void setCallWaiting(boolean enable, Message onComplete) {
3470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Log.e(LOG_TAG, "call waiting not supported");
3480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean getIccRecordsLoaded() {
3510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return false;
3520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public IccCard getIccCard() {
3550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return null;
3560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void getAvailableNetworks(Message response) {
3590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void setNetworkSelectionModeAutomatic(Message response) {
3620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void selectNetworkManually(
3650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            OperatorInfo network,
3660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            Message response) {
3670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void getNeighboringCids(Message response) {
3700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void setOnPostDialCharacter(Handler h, int what, Object obj) {
3730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void getDataCallList(Message response) {
3760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public List<DataConnection> getCurrentDataConnectionList () {
3790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return null;
3800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void updateServiceLocation() {
3830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void enableLocationUpdates() {
3860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void disableLocationUpdates() {
3890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean getDataRoamingEnabled() {
3920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return false;
3930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void setDataRoamingEnabled(boolean enable) {
3960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
3970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean enableDataConnectivity() {
3990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return false;
4000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean disableDataConnectivity() {
4030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return false;
4040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean isDataConnectivityPossible() {
4070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return false;
4080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    boolean updateCurrentCarrierInProvider() {
4110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return false;
4120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void saveClirSetting(int commandInterfaceCLIRMode) {
4150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public PhoneSubInfo getPhoneSubInfo(){
4180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return null;
4190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public IccSmsInterfaceManager getIccSmsInterfaceManager(){
4220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return null;
4230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public IccPhoneBookInterfaceManager getIccPhoneBookInterfaceManager(){
4260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return null;
4270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public IccFileHandler getIccFileHandler(){
4300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return null;
4310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void activateCellBroadcastSms(int activate, Message response) {
4340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Log.e(LOG_TAG, "Error! This functionality is not implemented for SIP.");
4350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void getCellBroadcastSmsConfig(Message response) {
4380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Log.e(LOG_TAG, "Error! This functionality is not implemented for SIP.");
4390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void setCellBroadcastSmsConfig(int[] configValuesArray, Message response){
4420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Log.e(LOG_TAG, "Error! This functionality is not implemented for SIP.");
4430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    //@Override
4460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public boolean needsOtaServiceProvisioning() {
4470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // FIXME: what's this for SIP?
4480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return false;
4490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    //@Override
4520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public LinkProperties getLinkProperties(String apnType) {
4530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // FIXME: what's this for SIP?
4540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return null;
4550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
4560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    void updatePhoneState() {
4580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        PhoneConstants.State oldState = state;
4590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (getRingingCall().isRinging()) {
4610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            state = PhoneConstants.State.RINGING;
4620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else if (getForegroundCall().isIdle()
4630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                && getBackgroundCall().isIdle()) {
4640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            state = PhoneConstants.State.IDLE;
4650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
4660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            state = PhoneConstants.State.OFFHOOK;
4670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
4680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
4690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (state != oldState) {
4700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            Log.d(LOG_TAG, " ^^^ new phone state: " + state);
4710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            notifyPhoneStateChanged();
4720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
4730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
474e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka
475e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka    @Override
476e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka    protected void onUpdateIccAvailability() {
477e0e2ebb5a50e580cbe6957dcafb3495a2d0a27f2Alex Yakavenka    }
4780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville}
479