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 60 SipConnectionBase(String dialString) { 61 this.dialString = dialString; 62 63 postDialString = PhoneNumberUtils.extractPostDialPortion(dialString); 64 65 isIncoming = false; 66 createTime = System.currentTimeMillis(); 67 } 68 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 88 public long getCreateTime() { 89 return createTime; 90 } 91 92 @Override 93 public long getConnectTime() { 94 return connectTime; 95 } 96 97 @Override 98 public long getDisconnectTime() { 99 return disconnectTime; 100 } 101 102 @Override 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 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 124 public DisconnectCause getDisconnectCause() { 125 return mCause; 126 } 127 128 void setDisconnectCause(DisconnectCause cause) { 129 mCause = cause; 130 } 131 132 @Override 133 public PostDialState getPostDialState() { 134 return postDialState; 135 } 136 137 @Override 138 public void proceedAfterWaitChar() { 139 // TODO 140 } 141 142 @Override 143 public void proceedAfterWildChar(String str) { 144 // TODO 145 } 146 147 @Override 148 public void cancelPostDial() { 149 // TODO 150 } 151 152 protected abstract Phone getPhone(); 153 154 @Override 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 166 private void log(String msg) { 167 Log.d(LOG_TAG, "[SipConn] " + msg); 168 } 169 170 @Override 171 public int getNumberPresentation() { 172 // TODO: add PRESENTATION_URL 173 return Connection.PRESENTATION_ALLOWED; 174 } 175 176 @Override 177 public UUSInfo getUUSInfo() { 178 // FIXME: what's this for SIP? 179 return null; 180 } 181 } 182