• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2010 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.internal.telephony.sip;
18 
19 import com.android.internal.telephony.Call;
20 import com.android.internal.telephony.Connection;
21 import com.android.internal.telephony.Phone;
22 import com.android.internal.telephony.UUSInfo;
23 
24 import android.net.sip.SipAudioCall;
25 import android.os.SystemClock;
26 import android.util.Log;
27 import android.telephony.PhoneNumberUtils;
28 
29 abstract class SipConnectionBase extends Connection {
30     private static final String LOG_TAG = "SIP_CONN";
31 
32     private SipAudioCall mSipAudioCall;
33 
34     private String dialString;          // outgoing calls only
35     private String postDialString;      // outgoing calls only
36     private int nextPostDialChar;       // index into postDialString
37     private boolean isIncoming;
38 
39     /*
40      * These time/timespan values are based on System.currentTimeMillis(),
41      * i.e., "wall clock" time.
42      */
43     private long createTime;
44     private long connectTime;
45     private long disconnectTime;
46 
47     /*
48      * These time/timespan values are based on SystemClock.elapsedRealTime(),
49      * i.e., time since boot.  They are appropriate for comparison and
50      * calculating deltas.
51      */
52     private long connectTimeReal;
53     private long duration = -1L;
54     private long holdingStartTime;  // The time when the Connection last transitioned
55                             // into HOLDING
56 
57     private DisconnectCause mCause = DisconnectCause.NOT_DISCONNECTED;
58     private PostDialState postDialState = PostDialState.NOT_STARTED;
59 
SipConnectionBase(String dialString)60     SipConnectionBase(String dialString) {
61         this.dialString = dialString;
62 
63         postDialString = PhoneNumberUtils.extractPostDialPortion(dialString);
64 
65         isIncoming = false;
66         createTime = System.currentTimeMillis();
67     }
68 
setState(Call.State state)69     protected void setState(Call.State state) {
70         switch (state) {
71             case ACTIVE:
72                 if (connectTime == 0) {
73                     connectTimeReal = SystemClock.elapsedRealtime();
74                     connectTime = System.currentTimeMillis();
75                 }
76                 break;
77             case DISCONNECTED:
78                 duration = getDurationMillis();
79                 disconnectTime = System.currentTimeMillis();
80                 break;
81             case HOLDING:
82                 holdingStartTime = SystemClock.elapsedRealtime();
83                 break;
84         }
85     }
86 
87     @Override
getCreateTime()88     public long getCreateTime() {
89         return createTime;
90     }
91 
92     @Override
getConnectTime()93     public long getConnectTime() {
94         return connectTime;
95     }
96 
97     @Override
getDisconnectTime()98     public long getDisconnectTime() {
99         return disconnectTime;
100     }
101 
102     @Override
getDurationMillis()103     public long getDurationMillis() {
104         if (connectTimeReal == 0) {
105             return 0;
106         } else if (duration < 0) {
107             return SystemClock.elapsedRealtime() - connectTimeReal;
108         } else {
109             return duration;
110         }
111     }
112 
113     @Override
getHoldDurationMillis()114     public long getHoldDurationMillis() {
115         if (getState() != Call.State.HOLDING) {
116             // If not holding, return 0
117             return 0;
118         } else {
119             return SystemClock.elapsedRealtime() - holdingStartTime;
120         }
121     }
122 
123     @Override
getDisconnectCause()124     public DisconnectCause getDisconnectCause() {
125         return mCause;
126     }
127 
setDisconnectCause(DisconnectCause cause)128     void setDisconnectCause(DisconnectCause cause) {
129         mCause = cause;
130     }
131 
132     @Override
getPostDialState()133     public PostDialState getPostDialState() {
134         return postDialState;
135     }
136 
137     @Override
proceedAfterWaitChar()138     public void proceedAfterWaitChar() {
139         // TODO
140     }
141 
142     @Override
proceedAfterWildChar(String str)143     public void proceedAfterWildChar(String str) {
144         // TODO
145     }
146 
147     @Override
cancelPostDial()148     public void cancelPostDial() {
149         // TODO
150     }
151 
getPhone()152     protected abstract Phone getPhone();
153 
154     @Override
getRemainingPostDialString()155     public String getRemainingPostDialString() {
156         if (postDialState == PostDialState.CANCELLED
157             || postDialState == PostDialState.COMPLETE
158             || postDialString == null
159             || postDialString.length() <= nextPostDialChar) {
160             return "";
161         }
162 
163         return postDialString.substring(nextPostDialChar);
164     }
165 
log(String msg)166     private void log(String msg) {
167         Log.d(LOG_TAG, "[SipConn] " + msg);
168     }
169 
170     @Override
getNumberPresentation()171     public int getNumberPresentation() {
172         // TODO: add PRESENTATION_URL
173         return Connection.PRESENTATION_ALLOWED;
174     }
175 
176     @Override
getUUSInfo()177     public UUSInfo getUUSInfo() {
178         // FIXME: what's this for SIP?
179         return null;
180     }
181 }
182