SipConnectionBase.java revision c2b66d57e16623dffc2fe6d02ded4f24c014b6c8
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;
26b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensenimport android.telephony.DisconnectCause;
2799c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Savilleimport android.telephony.Rlog;
280825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.telephony.PhoneNumberUtils;
290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
300825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleabstract class SipConnectionBase extends Connection {
31cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville    private static final String LOG_TAG = "SipConnBase";
32f1ac06f0498ec7cb7489c835bcd2eed568b5f6a6Wink Saville    private static final boolean DBG = true;
33ff4e317d24f0d23bdc0f306d53ddc51f2f1ecf6aWink Saville    private static final boolean VDBG = false; // STOPSHIP if true
340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
3522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    private String mPostDialString;      // outgoing calls only
3622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    private int mNextPostDialChar;       // index into postDialString
370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /*
380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * These time/timespan values are based on System.currentTimeMillis(),
390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * i.e., "wall clock" time.
400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
4122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    private long mCreateTime;
4222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    private long mConnectTime;
4322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    private long mDisconnectTime;
440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /*
460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * These time/timespan values are based on SystemClock.elapsedRealTime(),
470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * i.e., time since boot.  They are appropriate for comparison and
480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * calculating deltas.
490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
5022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    private long mConnectTimeReal;
5122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    private long mDuration = -1L;
5222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    private long mHoldingStartTime;  // The time when the Connection last transitioned
530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            // into HOLDING
540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
55b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen    private int mCause = DisconnectCause.NOT_DISCONNECTED;
5622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville    private PostDialState mPostDialState = PostDialState.NOT_STARTED;
570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    SipConnectionBase(String dialString) {
59c2b66d57e16623dffc2fe6d02ded4f24c014b6c8Amit Mahajan        super(PhoneConstants.PHONE_TYPE_SIP);
60f1ac06f0498ec7cb7489c835bcd2eed568b5f6a6Wink Saville        if (DBG) log("SipConnectionBase: ctor dialString=" + dialString);
6122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mPostDialString = PhoneNumberUtils.extractPostDialPortion(dialString);
620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCreateTime = System.currentTimeMillis();
640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected void setState(Call.State state) {
67f1ac06f0498ec7cb7489c835bcd2eed568b5f6a6Wink Saville        if (DBG) log("setState: state=" + state);
680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        switch (state) {
690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case ACTIVE:
7022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                if (mConnectTime == 0) {
7122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mConnectTimeReal = SystemClock.elapsedRealtime();
7222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mConnectTime = System.currentTimeMillis();
730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case DISCONNECTED:
7622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mDuration = getDurationMillis();
7722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mDisconnectTime = System.currentTimeMillis();
780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case HOLDING:
8022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mHoldingStartTime = SystemClock.elapsedRealtime();
810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
82cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            default:
83cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                // Ignore
84cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                break;
850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public long getCreateTime() {
9022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (VDBG) log("getCreateTime: ret=" + mCreateTime);
9122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        return mCreateTime;
920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public long getConnectTime() {
9622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (VDBG) log("getConnectTime: ret=" + mConnectTime);
9722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        return mConnectTime;
980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
1010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public long getDisconnectTime() {
10222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (VDBG) log("getDisconnectTime: ret=" + mDisconnectTime);
10322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        return mDisconnectTime;
1040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
1070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public long getDurationMillis() {
108f1ac06f0498ec7cb7489c835bcd2eed568b5f6a6Wink Saville        long dur;
10922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (mConnectTimeReal == 0) {
110f1ac06f0498ec7cb7489c835bcd2eed568b5f6a6Wink Saville            dur = 0;
11122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        } else if (mDuration < 0) {
11222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            dur = SystemClock.elapsedRealtime() - mConnectTimeReal;
1130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
11422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            dur = mDuration;
1150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
116f1ac06f0498ec7cb7489c835bcd2eed568b5f6a6Wink Saville        if (VDBG) log("getDurationMillis: ret=" + dur);
117f1ac06f0498ec7cb7489c835bcd2eed568b5f6a6Wink Saville        return dur;
1180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
1210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public long getHoldDurationMillis() {
122f1ac06f0498ec7cb7489c835bcd2eed568b5f6a6Wink Saville        long dur;
1230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (getState() != Call.State.HOLDING) {
1240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // If not holding, return 0
125f1ac06f0498ec7cb7489c835bcd2eed568b5f6a6Wink Saville            dur = 0;
1260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
12722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            dur = SystemClock.elapsedRealtime() - mHoldingStartTime;
1280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
129f1ac06f0498ec7cb7489c835bcd2eed568b5f6a6Wink Saville        if (VDBG) log("getHoldDurationMillis: ret=" + dur);
130f1ac06f0498ec7cb7489c835bcd2eed568b5f6a6Wink Saville        return dur;
1310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
134b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen    public int getDisconnectCause() {
135f1ac06f0498ec7cb7489c835bcd2eed568b5f6a6Wink Saville        if (VDBG) log("getDisconnectCause: ret=" + mCause);
1360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mCause;
1370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
139b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen    void setDisconnectCause(int cause) {
140f1ac06f0498ec7cb7489c835bcd2eed568b5f6a6Wink Saville        if (DBG) log("setDisconnectCause: prev=" + mCause + " new=" + cause);
1410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCause = cause;
1420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
14533cfb500a7cf192adfc5ca06792fe3847073b6c1Chao Liu    public String getVendorDisconnectCause() {
14633cfb500a7cf192adfc5ca06792fe3847073b6c1Chao Liu      return null;
14733cfb500a7cf192adfc5ca06792fe3847073b6c1Chao Liu    }
14833cfb500a7cf192adfc5ca06792fe3847073b6c1Chao Liu
14933cfb500a7cf192adfc5ca06792fe3847073b6c1Chao Liu    @Override
1500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public PostDialState getPostDialState() {
15122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (VDBG) log("getPostDialState: ret=" + mPostDialState);
15222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        return mPostDialState;
1530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
1560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void proceedAfterWaitChar() {
157f1ac06f0498ec7cb7489c835bcd2eed568b5f6a6Wink Saville        if (DBG) log("proceedAfterWaitChar: ignore");
1580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
1610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void proceedAfterWildChar(String str) {
162f1ac06f0498ec7cb7489c835bcd2eed568b5f6a6Wink Saville        if (DBG) log("proceedAfterWildChar: ignore");
1630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
1660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void cancelPostDial() {
167f1ac06f0498ec7cb7489c835bcd2eed568b5f6a6Wink Saville        if (DBG) log("cancelPostDial: ignore");
1680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected abstract Phone getPhone();
1710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
1730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getRemainingPostDialString() {
17422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (mPostDialState == PostDialState.CANCELLED
17522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            || mPostDialState == PostDialState.COMPLETE
17622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            || mPostDialString == null
17722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            || mPostDialString.length() <= mNextPostDialChar) {
178f1ac06f0498ec7cb7489c835bcd2eed568b5f6a6Wink Saville            if (DBG) log("getRemaingPostDialString: ret empty string");
1790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return "";
1800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
18222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        return mPostDialString.substring(mNextPostDialChar);
1830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void log(String msg) {
186f1ac06f0498ec7cb7489c835bcd2eed568b5f6a6Wink Saville        Rlog.d(LOG_TAG, msg);
1870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
1900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public int getNumberPresentation() {
1910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // TODO: add PRESENTATION_URL
192f1ac06f0498ec7cb7489c835bcd2eed568b5f6a6Wink Saville        if (VDBG) log("getNumberPresentation: ret=PRESENTATION_ALLOWED");
1930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return PhoneConstants.PRESENTATION_ALLOWED;
1940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
1970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public UUSInfo getUUSInfo() {
1980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // FIXME: what's this for SIP?
199f1ac06f0498ec7cb7489c835bcd2eed568b5f6a6Wink Saville        if (VDBG) log("getUUSInfo: ? ret=null");
2000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return null;
2010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
2020742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela
2030742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela    @Override
2040742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela    public int getPreciseDisconnectCause() {
2050742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela        return 0;
2060742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela    }
207a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
208a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    @Override
209a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public long getHoldingStartTime() {
210a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        return mHoldingStartTime;
211a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
212a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
213a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    @Override
214a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public long getConnectTimeReal() {
215a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        return mConnectTimeReal;
216a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
217a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
218a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    @Override
219a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public Connection getOrigConnection() {
220a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        return null;
221a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
222a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville
223a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    @Override
224a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    public boolean isMultiparty() {
225a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville        return false;
226a8467dd0c524787104b1ccdddc5e8af10ba729edWink Saville    }
2270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville}
228