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.net.sip.SipAudioCall;
260825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.SystemClock;
270825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.util.Log;
280825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.telephony.PhoneNumberUtils;
290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
300825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleabstract class SipConnectionBase extends Connection {
310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private static final String LOG_TAG = "SIP_CONN";
320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private SipAudioCall mSipAudioCall;
340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private String dialString;          // outgoing calls only
360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private String postDialString;      // outgoing calls only
370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private int nextPostDialChar;       // index into postDialString
380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private boolean isIncoming;
390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /*
410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * These time/timespan values are based on System.currentTimeMillis(),
420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * i.e., "wall clock" time.
430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private long createTime;
450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private long connectTime;
460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private long disconnectTime;
470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    /*
490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * These time/timespan values are based on SystemClock.elapsedRealTime(),
500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * i.e., time since boot.  They are appropriate for comparison and
510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     * calculating deltas.
520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville     */
530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private long connectTimeReal;
540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private long duration = -1L;
550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private long holdingStartTime;  // The time when the Connection last transitioned
560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                            // into HOLDING
570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private DisconnectCause mCause = DisconnectCause.NOT_DISCONNECTED;
590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private PostDialState postDialState = PostDialState.NOT_STARTED;
600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    SipConnectionBase(String dialString) {
620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        this.dialString = dialString;
630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        postDialString = PhoneNumberUtils.extractPostDialPortion(dialString);
650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        isIncoming = false;
670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        createTime = System.currentTimeMillis();
680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected void setState(Call.State state) {
710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        switch (state) {
720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case ACTIVE:
730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                if (connectTime == 0) {
740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    connectTimeReal = SystemClock.elapsedRealtime();
750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                    connectTime = System.currentTimeMillis();
760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                }
770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case DISCONNECTED:
790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                duration = getDurationMillis();
800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                disconnectTime = System.currentTimeMillis();
810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            case HOLDING:
830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                holdingStartTime = SystemClock.elapsedRealtime();
840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville                break;
850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public long getCreateTime() {
900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return createTime;
910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public long getConnectTime() {
950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return connectTime;
960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public long getDisconnectTime() {
1000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return disconnectTime;
1010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
1040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public long getDurationMillis() {
1050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (connectTimeReal == 0) {
1060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return 0;
1070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else if (duration < 0) {
1080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return SystemClock.elapsedRealtime() - connectTimeReal;
1090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
1100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return duration;
1110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
1150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public long getHoldDurationMillis() {
1160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (getState() != Call.State.HOLDING) {
1170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            // If not holding, return 0
1180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return 0;
1190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        } else {
1200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return SystemClock.elapsedRealtime() - holdingStartTime;
1210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
1250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public DisconnectCause getDisconnectCause() {
1260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return mCause;
1270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    void setDisconnectCause(DisconnectCause cause) {
1300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        mCause = cause;
1310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
1340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public PostDialState getPostDialState() {
1350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return postDialState;
1360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
1390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void proceedAfterWaitChar() {
1400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // TODO
1410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
1440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void proceedAfterWildChar(String str) {
1450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // TODO
1460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
1490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public void cancelPostDial() {
1500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // TODO
1510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    protected abstract Phone getPhone();
1540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
1560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public String getRemainingPostDialString() {
1570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        if (postDialState == PostDialState.CANCELLED
1580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            || postDialState == PostDialState.COMPLETE
1590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            || postDialString == null
1600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            || postDialString.length() <= nextPostDialChar) {
1610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville            return "";
1620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        }
1630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return postDialString.substring(nextPostDialChar);
1650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    private void log(String msg) {
1680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        Log.d(LOG_TAG, "[SipConn] " + msg);
1690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
1720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public int getNumberPresentation() {
1730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // TODO: add PRESENTATION_URL
1740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return PhoneConstants.PRESENTATION_ALLOWED;
1750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville
1770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    @Override
1780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    public UUSInfo getUUSInfo() {
1790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        // FIXME: what's this for SIP?
1800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville        return null;
1810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville    }
1820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville}
183