SipConnectionBase.java revision b7b7a62112b79571adf74372c5f5366fd62d0031
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) {
59f1ac06f0498ec7cb7489c835bcd2eed568b5f6a6Wink Saville        if (DBG) log("SipConnectionBase: ctor dialString=" + dialString);
6022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mPostDialString = PhoneNumberUtils.extractPostDialPortion(dialString);
610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
6222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        mCreateTime = System.currentTimeMillis();
630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected void setState(Call.State state) {
66f1ac06f0498ec7cb7489c835bcd2eed568b5f6a6Wink Saville        if (DBG) log("setState: state=" + state);
670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        switch (state) {
680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case ACTIVE:
6922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                if (mConnectTime == 0) {
7022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mConnectTimeReal = SystemClock.elapsedRealtime();
7122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                    mConnectTime = System.currentTimeMillis();
720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case DISCONNECTED:
7522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mDuration = getDurationMillis();
7622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mDisconnectTime = System.currentTimeMillis();
770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case HOLDING:
7922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville                mHoldingStartTime = SystemClock.elapsedRealtime();
800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
81cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville            default:
82cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                // Ignore
83cbaa45bbf2cab852b6c9c3a887e9f803d4e857eaWink Saville                break;
840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public long getCreateTime() {
8922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (VDBG) log("getCreateTime: ret=" + mCreateTime);
9022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        return mCreateTime;
910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public long getConnectTime() {
9522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (VDBG) log("getConnectTime: ret=" + mConnectTime);
9622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        return mConnectTime;
970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
1000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public long getDisconnectTime() {
10122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (VDBG) log("getDisconnectTime: ret=" + mDisconnectTime);
10222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        return mDisconnectTime;
1030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
1060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public long getDurationMillis() {
107f1ac06f0498ec7cb7489c835bcd2eed568b5f6a6Wink Saville        long dur;
10822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (mConnectTimeReal == 0) {
109f1ac06f0498ec7cb7489c835bcd2eed568b5f6a6Wink Saville            dur = 0;
11022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        } else if (mDuration < 0) {
11122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            dur = SystemClock.elapsedRealtime() - mConnectTimeReal;
1120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
11322d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            dur = mDuration;
1140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
115f1ac06f0498ec7cb7489c835bcd2eed568b5f6a6Wink Saville        if (VDBG) log("getDurationMillis: ret=" + dur);
116f1ac06f0498ec7cb7489c835bcd2eed568b5f6a6Wink Saville        return dur;
1170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
1200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public long getHoldDurationMillis() {
121f1ac06f0498ec7cb7489c835bcd2eed568b5f6a6Wink Saville        long dur;
1220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (getState() != Call.State.HOLDING) {
1230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // If not holding, return 0
124f1ac06f0498ec7cb7489c835bcd2eed568b5f6a6Wink Saville            dur = 0;
1250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
12622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            dur = SystemClock.elapsedRealtime() - mHoldingStartTime;
1270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
128f1ac06f0498ec7cb7489c835bcd2eed568b5f6a6Wink Saville        if (VDBG) log("getHoldDurationMillis: ret=" + dur);
129f1ac06f0498ec7cb7489c835bcd2eed568b5f6a6Wink Saville        return dur;
1300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
133b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen    public int getDisconnectCause() {
134f1ac06f0498ec7cb7489c835bcd2eed568b5f6a6Wink Saville        if (VDBG) log("getDisconnectCause: ret=" + mCause);
1350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mCause;
1360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
138b7b7a62112b79571adf74372c5f5366fd62d0031Anders Kristensen    void setDisconnectCause(int cause) {
139f1ac06f0498ec7cb7489c835bcd2eed568b5f6a6Wink Saville        if (DBG) log("setDisconnectCause: prev=" + mCause + " new=" + cause);
1400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCause = cause;
1410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
1440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public PostDialState getPostDialState() {
14522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (VDBG) log("getPostDialState: ret=" + mPostDialState);
14622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        return mPostDialState;
1470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
1500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void proceedAfterWaitChar() {
151f1ac06f0498ec7cb7489c835bcd2eed568b5f6a6Wink Saville        if (DBG) log("proceedAfterWaitChar: ignore");
1520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
1550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void proceedAfterWildChar(String str) {
156f1ac06f0498ec7cb7489c835bcd2eed568b5f6a6Wink Saville        if (DBG) log("proceedAfterWildChar: ignore");
1570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
1600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void cancelPostDial() {
161f1ac06f0498ec7cb7489c835bcd2eed568b5f6a6Wink Saville        if (DBG) log("cancelPostDial: ignore");
1620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected abstract Phone getPhone();
1650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
1670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getRemainingPostDialString() {
16822d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        if (mPostDialState == PostDialState.CANCELLED
16922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            || mPostDialState == PostDialState.COMPLETE
17022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            || mPostDialString == null
17122d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville            || mPostDialString.length() <= mNextPostDialChar) {
172f1ac06f0498ec7cb7489c835bcd2eed568b5f6a6Wink Saville            if (DBG) log("getRemaingPostDialString: ret empty string");
1730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return "";
1740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
17622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville        return mPostDialString.substring(mNextPostDialChar);
1770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void log(String msg) {
180f1ac06f0498ec7cb7489c835bcd2eed568b5f6a6Wink Saville        Rlog.d(LOG_TAG, msg);
1810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
1840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public int getNumberPresentation() {
1850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // TODO: add PRESENTATION_URL
186f1ac06f0498ec7cb7489c835bcd2eed568b5f6a6Wink Saville        if (VDBG) log("getNumberPresentation: ret=PRESENTATION_ALLOWED");
1870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return PhoneConstants.PRESENTATION_ALLOWED;
1880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
1910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public UUSInfo getUUSInfo() {
1920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // FIXME: what's this for SIP?
193f1ac06f0498ec7cb7489c835bcd2eed568b5f6a6Wink Saville        if (VDBG) log("getUUSInfo: ? ret=null");
1940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return null;
1950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1960742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela
1970742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela    @Override
1980742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela    public int getPreciseDisconnectCause() {
1990742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela        return 0;
2000742246233c3f03f864d23e52d89e1845d994701Antonio Marín Cerezuela    }
2010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville}
202