SipConnectionBase.java revision 22d85a8e3a575a6d01d2c788587971657dfe20c6
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 com.android.internal.telephony.Call;
200825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.Connection;
210825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.Phone;
220825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.PhoneConstants;
230825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.UUSInfo;
240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
250825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.SystemClock;
2699c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Savilleimport android.telephony.Rlog;
270825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.telephony.PhoneNumberUtils;
280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
290825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleabstract class SipConnectionBase extends Connection {
30cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    private static final String LOG_TAG = "SipConnBase";
31f1ac06f0498ec7cb7489c835bcd2eed568b5f6a6Wink Saville    private static final boolean DBG = true;
32f1ac06f0498ec7cb7489c835bcd2eed568b5f6a6Wink Saville    private static final boolean VDBG = true; // STOPSHIP if true
330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    private String mPostDialString;      // outgoing calls only
3522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    private int mNextPostDialChar;       // index into postDialString
360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /*
370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * These time/timespan values are based on System.currentTimeMillis(),
380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * i.e., "wall clock" time.
390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
4022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    private long mCreateTime;
4122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    private long mConnectTime;
4222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    private long mDisconnectTime;
430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /*
450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * These time/timespan values are based on SystemClock.elapsedRealTime(),
460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * i.e., time since boot.  They are appropriate for comparison and
470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * calculating deltas.
480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
4922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    private long mConnectTimeReal;
5022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    private long mDuration = -1L;
5122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    private long mHoldingStartTime;  // The time when the Connection last transitioned
520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            // into HOLDING
530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private DisconnectCause mCause = DisconnectCause.NOT_DISCONNECTED;
5522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    private PostDialState mPostDialState = PostDialState.NOT_STARTED;
560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    SipConnectionBase(String dialString) {
58f1ac06f0498ec7cb7489c835bcd2eed568b5f6a6Wink Saville        if (DBG) log("SipConnectionBase: ctor dialString=" + dialString);
5922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mPostDialString = PhoneNumberUtils.extractPostDialPortion(dialString);
600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCreateTime = System.currentTimeMillis();
620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected void setState(Call.State state) {
65f1ac06f0498ec7cb7489c835bcd2eed568b5f6a6Wink Saville        if (DBG) log("setState: state=" + state);
660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        switch (state) {
670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case ACTIVE:
6822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                if (mConnectTime == 0) {
6922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mConnectTimeReal = SystemClock.elapsedRealtime();
7022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mConnectTime = System.currentTimeMillis();
710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case DISCONNECTED:
7422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mDuration = getDurationMillis();
7522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mDisconnectTime = System.currentTimeMillis();
760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case HOLDING:
7822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mHoldingStartTime = SystemClock.elapsedRealtime();
790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
80cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            default:
81cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                // Ignore
82cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                break;
830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public long getCreateTime() {
8822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (VDBG) log("getCreateTime: ret=" + mCreateTime);
8922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        return mCreateTime;
900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public long getConnectTime() {
9422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (VDBG) log("getConnectTime: ret=" + mConnectTime);
9522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        return mConnectTime;
960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public long getDisconnectTime() {
10022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (VDBG) log("getDisconnectTime: ret=" + mDisconnectTime);
10122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        return mDisconnectTime;
1020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
1050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public long getDurationMillis() {
106f1ac06f0498ec7cb7489c835bcd2eed568b5f6a6Wink Saville        long dur;
10722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (mConnectTimeReal == 0) {
108f1ac06f0498ec7cb7489c835bcd2eed568b5f6a6Wink Saville            dur = 0;
10922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        } else if (mDuration < 0) {
11022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            dur = SystemClock.elapsedRealtime() - mConnectTimeReal;
1110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
11222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            dur = mDuration;
1130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
114f1ac06f0498ec7cb7489c835bcd2eed568b5f6a6Wink Saville        if (VDBG) log("getDurationMillis: ret=" + dur);
115f1ac06f0498ec7cb7489c835bcd2eed568b5f6a6Wink Saville        return dur;
1160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
1190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public long getHoldDurationMillis() {
120f1ac06f0498ec7cb7489c835bcd2eed568b5f6a6Wink Saville        long dur;
1210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (getState() != Call.State.HOLDING) {
1220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // If not holding, return 0
123f1ac06f0498ec7cb7489c835bcd2eed568b5f6a6Wink Saville            dur = 0;
1240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
12522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            dur = SystemClock.elapsedRealtime() - mHoldingStartTime;
1260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
127f1ac06f0498ec7cb7489c835bcd2eed568b5f6a6Wink Saville        if (VDBG) log("getHoldDurationMillis: ret=" + dur);
128f1ac06f0498ec7cb7489c835bcd2eed568b5f6a6Wink Saville        return dur;
1290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
1320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public DisconnectCause getDisconnectCause() {
133f1ac06f0498ec7cb7489c835bcd2eed568b5f6a6Wink Saville        if (VDBG) log("getDisconnectCause: ret=" + mCause);
1340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mCause;
1350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    void setDisconnectCause(DisconnectCause cause) {
138f1ac06f0498ec7cb7489c835bcd2eed568b5f6a6Wink Saville        if (DBG) log("setDisconnectCause: prev=" + mCause + " new=" + cause);
1390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCause = cause;
1400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
1430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public PostDialState getPostDialState() {
14422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (VDBG) log("getPostDialState: ret=" + mPostDialState);
14522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        return mPostDialState;
1460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
1490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void proceedAfterWaitChar() {
150f1ac06f0498ec7cb7489c835bcd2eed568b5f6a6Wink Saville        if (DBG) log("proceedAfterWaitChar: ignore");
1510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
1540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void proceedAfterWildChar(String str) {
155f1ac06f0498ec7cb7489c835bcd2eed568b5f6a6Wink Saville        if (DBG) log("proceedAfterWildChar: ignore");
1560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
1590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void cancelPostDial() {
160f1ac06f0498ec7cb7489c835bcd2eed568b5f6a6Wink Saville        if (DBG) log("cancelPostDial: ignore");
1610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected abstract Phone getPhone();
1640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
1660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getRemainingPostDialString() {
16722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (mPostDialState == PostDialState.CANCELLED
16822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            || mPostDialState == PostDialState.COMPLETE
16922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            || mPostDialString == null
17022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            || mPostDialString.length() <= mNextPostDialChar) {
171f1ac06f0498ec7cb7489c835bcd2eed568b5f6a6Wink Saville            if (DBG) log("getRemaingPostDialString: ret empty string");
1720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return "";
1730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
17522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        return mPostDialString.substring(mNextPostDialChar);
1760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void log(String msg) {
179f1ac06f0498ec7cb7489c835bcd2eed568b5f6a6Wink Saville        Rlog.d(LOG_TAG, msg);
1800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
1830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public int getNumberPresentation() {
1840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // TODO: add PRESENTATION_URL
185f1ac06f0498ec7cb7489c835bcd2eed568b5f6a6Wink Saville        if (VDBG) log("getNumberPresentation: ret=PRESENTATION_ALLOWED");
1860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return PhoneConstants.PRESENTATION_ALLOWED;
1870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
1900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public UUSInfo getUUSInfo() {
1910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // FIXME: what's this for SIP?
192f1ac06f0498ec7cb7489c835bcd2eed568b5f6a6Wink Saville        if (VDBG) log("getUUSInfo: ? ret=null");
1930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return null;
1940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville}
196