1 /* 2 * Copyright (C) 2007 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 GSMTestHandler.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.gsm; 18 19 import android.os.AsyncResult; 20 import android.os.Handler; 21 import android.os.Message; 22 import android.telephony.ServiceState; 23 import android.test.AndroidTestCase; 24 import android.test.PerformanceTestCase; 25 26 import android.telephony.DisconnectCause; 27 28 import com.android.internal.telephony.Call; 29 import com.android.internal.telephony.CallStateException; 30 import com.android.internal.telephony.Connection; 31 import com.android.internal.telephony.MmiCode; 32 import com.android.internal.telephony.Phone; 33 import com.android.internal.telephony.PhoneConstants; 34 import com.android.internal.telephony.gsm.CallFailCause; 35 import com.android.internal.telephony.gsm.GSMPhone; 36 import com.android.internal.telephony.gsm.GSMTestHandler; 37 import com.android.internal.telephony.gsm.GsmMmiCode; 38 import com.android.internal.telephony.gsm.SuppServiceNotification; 39 import com.android.internal.telephony.test.SimulatedRadioControl; 40 41 import java.util.List; 42 43 44 public class GSMPhoneTest extends AndroidTestCase implements PerformanceTestCase { 45 private SimulatedRadioControl mRadioControl; 46 private GSMPhone mGSMPhone; 47 private GSMTestHandler mGSMTestHandler; 48 private Handler mHandler; 49 50 private static final int EVENT_PHONE_STATE_CHANGED = 1; 51 private static final int EVENT_DISCONNECT = 2; 52 private static final int EVENT_RINGING = 3; 53 private static final int EVENT_CHANNEL_OPENED = 4; 54 private static final int EVENT_POST_DIAL = 5; 55 private static final int EVENT_DONE = 6; 56 private static final int EVENT_SSN = 7; 57 private static final int EVENT_MMI_INITIATE = 8; 58 private static final int EVENT_MMI_COMPLETE = 9; 59 private static final int EVENT_IN_SERVICE = 10; 60 private static final int SUPP_SERVICE_FAILED = 11; 61 private static final int SERVICE_STATE_CHANGED = 12; 62 private static final int EVENT_OEM_RIL_MESSAGE = 13; 63 public static final int ANY_MESSAGE = -1; 64 65 @Override 66 protected void setUp() throws Exception { 67 super.setUp(); 68 mGSMTestHandler = new GSMTestHandler(mContext); 69 70 mGSMTestHandler.start(); 71 synchronized (mGSMTestHandler) { 72 do { 73 mGSMTestHandler.wait(); 74 } while (mGSMTestHandler.getGSMPhone() == null); 75 } 76 77 mGSMPhone = mGSMTestHandler.getGSMPhone(); 78 mRadioControl = mGSMTestHandler.getSimulatedCommands(); 79 80 mHandler = mGSMTestHandler.getHandler(); 81 mGSMPhone.registerForPreciseCallStateChanged(mHandler, EVENT_PHONE_STATE_CHANGED, null); 82 mGSMPhone.registerForNewRingingConnection(mHandler, EVENT_RINGING, null); 83 mGSMPhone.registerForDisconnect(mHandler, EVENT_DISCONNECT, null); 84 85 mGSMPhone.setOnPostDialCharacter(mHandler, EVENT_POST_DIAL, null); 86 87 mGSMPhone.registerForSuppServiceNotification(mHandler, EVENT_SSN, null); 88 mGSMPhone.registerForMmiInitiate(mHandler, EVENT_MMI_INITIATE, null); 89 mGSMPhone.registerForMmiComplete(mHandler, EVENT_MMI_COMPLETE, null); 90 mGSMPhone.registerForSuppServiceFailed(mHandler, SUPP_SERVICE_FAILED, null); 91 92 mGSMPhone.registerForServiceStateChanged(mHandler, SERVICE_STATE_CHANGED, null); 93 94 // wait until we get phone in both voice and data service 95 Message msg; 96 ServiceState state; 97 98 do { 99 msg = mGSMTestHandler.waitForMessage(SERVICE_STATE_CHANGED); 100 assertNotNull("Message Time Out", msg); 101 state = (ServiceState) ((AsyncResult) msg.obj).result; 102 } while (state.getState() != ServiceState.STATE_IN_SERVICE); 103 } 104 105 @Override 106 protected void tearDown() throws Exception { 107 mRadioControl.shutdown(); 108 109 mGSMPhone.unregisterForPreciseCallStateChanged(mHandler); 110 mGSMPhone.unregisterForNewRingingConnection(mHandler); 111 mGSMPhone.unregisterForDisconnect(mHandler); 112 mGSMPhone.setOnPostDialCharacter(mHandler, 0, null); 113 mGSMPhone.unregisterForSuppServiceNotification(mHandler); 114 mGSMPhone.unregisterForMmiInitiate(mHandler); 115 mGSMPhone.unregisterForMmiComplete(mHandler); 116 117 mGSMPhone = null; 118 mRadioControl = null; 119 mHandler = null; 120 mGSMTestHandler.cleanup(); 121 122 super.tearDown(); 123 } 124 125 // These test can only be run once. 126 public int startPerformance(Intermediates intermediates) { 127 return 1; 128 } 129 130 public boolean isPerformanceOnly() { 131 return false; 132 } 133 134 135 //This test is causing the emulator screen to turn off. I don't understand 136 //why, but I'm removing it until we can figure it out. 137 public void brokenTestGeneral() throws Exception { 138 Connection cn; 139 Message msg; 140 AsyncResult ar; 141 142 // IDLE state 143 144 assertEquals(PhoneConstants.State.IDLE, mGSMPhone.getState()); 145 assertEquals(0, mGSMPhone.getRingingCall().getConnections().size()); 146 assertEquals(0, mGSMPhone.getForegroundCall().getConnections().size()); 147 assertEquals(0, mGSMPhone.getBackgroundCall().getConnections().size()); 148 149 assertEquals(Call.State.IDLE, mGSMPhone.getRingingCall().getState()); 150 assertEquals(Call.State.IDLE, mGSMPhone.getForegroundCall().getState()); 151 assertEquals(Call.State.IDLE, mGSMPhone.getBackgroundCall().getState()); 152 153 assertEquals(0, mGSMPhone.getForegroundCall().getEarliestCreateTime()); 154 assertEquals(0, mGSMPhone.getForegroundCall().getEarliestConnectTime()); 155 assertFalse(mGSMPhone.canConference()); 156 157 // One DIALING connection 158 159 mRadioControl.setAutoProgressConnectingCall(false); 160 161 mGSMPhone.dial("+13125551212"); 162 163 assertEquals(PhoneConstants.State.OFFHOOK, mGSMPhone.getState()); 164 165 msg = mGSMTestHandler.waitForMessage(EVENT_PHONE_STATE_CHANGED); 166 assertNotNull("Message Time Out", msg); 167 168 assertEquals(PhoneConstants.State.OFFHOOK, mGSMPhone.getState()); 169 assertEquals(Call.State.DIALING, mGSMPhone.getForegroundCall().getState()); 170 assertTrue(mGSMPhone.getForegroundCall().isDialingOrAlerting()); 171 172 /*do { 173 mGSMTestHandler.waitForMessage(ANY_MESSAGE); 174 } while (mGSMPhone.getForegroundCall().getConnections().size() == 0);*/ 175 176 assertEquals(0, mGSMPhone.getRingingCall().getConnections().size()); 177 assertEquals(1, mGSMPhone.getForegroundCall().getConnections().size()); 178 assertEquals(0, mGSMPhone.getBackgroundCall().getConnections().size()); 179 180 assertEquals(Call.State.IDLE, mGSMPhone.getRingingCall().getState()); 181 assertEquals(Call.State.DIALING, 182 mGSMPhone.getForegroundCall().getState()); 183 assertEquals(Call.State.IDLE, mGSMPhone.getBackgroundCall().getState()); 184 185 assertTrue(mGSMPhone.getForegroundCall().getEarliestCreateTime() > 0); 186 assertEquals(0, mGSMPhone.getForegroundCall().getEarliestConnectTime()); 187 188 cn = mGSMPhone.getForegroundCall().getConnections().get(0); 189 assertTrue(!cn.isIncoming()); 190 assertEquals(Connection.PostDialState.NOT_STARTED, cn.getPostDialState()); 191 192 assertEquals(DisconnectCause.NOT_DISCONNECTED, cn.getDisconnectCause()); 193 194 assertFalse(mGSMPhone.canConference()); 195 196 // One ALERTING connection 197 198 mRadioControl.progressConnectingCallState(); 199 200 do { 201 assertNotNull("Message Time Out", mGSMTestHandler.waitForMessage(ANY_MESSAGE)); 202 } 203 while (mGSMPhone.getForegroundCall().getState() != Call.State.ALERTING); 204 205 assertEquals(PhoneConstants.State.OFFHOOK, mGSMPhone.getState()); 206 assertTrue(mGSMPhone.getForegroundCall().isDialingOrAlerting()); 207 208 assertEquals(0, mGSMPhone.getRingingCall().getConnections().size()); 209 assertEquals(1, mGSMPhone.getForegroundCall().getConnections().size()); 210 assertEquals(0, mGSMPhone.getBackgroundCall().getConnections().size()); 211 212 assertEquals(Call.State.IDLE, mGSMPhone.getRingingCall().getState()); 213 assertEquals(Call.State.ALERTING, mGSMPhone.getForegroundCall().getState()); 214 assertEquals(Call.State.IDLE, mGSMPhone.getBackgroundCall().getState()); 215 216 assertTrue(mGSMPhone.getForegroundCall().getEarliestCreateTime() > 0); 217 assertEquals(0, mGSMPhone.getForegroundCall().getEarliestConnectTime()); 218 219 cn = mGSMPhone.getForegroundCall().getConnections().get(0); 220 assertTrue(!cn.isIncoming()); 221 assertEquals(Connection.PostDialState.NOT_STARTED, cn.getPostDialState()); 222 assertFalse(mGSMPhone.canConference()); 223 224 // One ACTIVE connection 225 226 mRadioControl.progressConnectingCallState(); 227 228 do { 229 assertNotNull("Message Time Out", mGSMTestHandler.waitForMessage(ANY_MESSAGE)); 230 } while (mGSMPhone.getForegroundCall().getState() != Call.State.ACTIVE); 231 232 assertEquals(PhoneConstants.State.OFFHOOK, mGSMPhone.getState()); 233 assertFalse(mGSMPhone.getForegroundCall().isDialingOrAlerting()); 234 235 assertEquals(0, mGSMPhone.getRingingCall().getConnections().size()); 236 assertEquals(1, mGSMPhone.getForegroundCall().getConnections().size()); 237 assertEquals(0, mGSMPhone.getBackgroundCall().getConnections().size()); 238 239 assertEquals(Call.State.IDLE, mGSMPhone.getRingingCall().getState()); 240 assertEquals(Call.State.ACTIVE, mGSMPhone.getForegroundCall().getState()); 241 assertEquals(Call.State.IDLE, mGSMPhone.getBackgroundCall().getState()); 242 243 assertTrue(mGSMPhone.getForegroundCall().getEarliestCreateTime() > 0); 244 assertTrue(mGSMPhone.getForegroundCall().getEarliestConnectTime() > 0); 245 246 cn = mGSMPhone.getForegroundCall().getConnections().get(0); 247 assertTrue(!cn.isIncoming()); 248 assertEquals(Connection.PostDialState.COMPLETE, cn.getPostDialState()); 249 assertFalse(mGSMPhone.canConference()); 250 251 // One disconnected connection 252 mGSMPhone.getForegroundCall().hangup(); 253 254 msg = mGSMTestHandler.waitForMessage(EVENT_DISCONNECT); 255 assertNotNull("Message Time Out", msg); 256 257 assertEquals(PhoneConstants.State.IDLE, mGSMPhone.getState()); 258 assertFalse(mGSMPhone.getForegroundCall().isDialingOrAlerting()); 259 260 assertEquals(0, mGSMPhone.getRingingCall().getConnections().size()); 261 assertEquals(1, mGSMPhone.getForegroundCall().getConnections().size()); 262 assertEquals(0, mGSMPhone.getBackgroundCall().getConnections().size()); 263 264 assertEquals(Call.State.IDLE, mGSMPhone.getRingingCall().getState()); 265 assertEquals(Call.State.DISCONNECTED, mGSMPhone.getForegroundCall().getState()); 266 assertEquals(Call.State.IDLE, mGSMPhone.getBackgroundCall().getState()); 267 268 assertTrue(mGSMPhone.getForegroundCall().getEarliestCreateTime() > 0); 269 assertTrue(mGSMPhone.getForegroundCall().getEarliestConnectTime() > 0); 270 271 assertFalse(mGSMPhone.canConference()); 272 273 cn = mGSMPhone.getForegroundCall().getEarliestConnection(); 274 275 assertEquals(Call.State.DISCONNECTED, cn.getState()); 276 277 // Back to idle state 278 279 mGSMPhone.clearDisconnected(); 280 281 assertEquals(PhoneConstants.State.IDLE, mGSMPhone.getState()); 282 assertFalse(mGSMPhone.getForegroundCall().isDialingOrAlerting()); 283 284 assertEquals(0, mGSMPhone.getRingingCall().getConnections().size()); 285 assertEquals(0, mGSMPhone.getForegroundCall().getConnections().size()); 286 assertEquals(0, mGSMPhone.getBackgroundCall().getConnections().size()); 287 288 assertEquals(Call.State.IDLE, mGSMPhone.getRingingCall().getState()); 289 assertEquals(Call.State.IDLE, mGSMPhone.getForegroundCall().getState()); 290 assertEquals(Call.State.IDLE, mGSMPhone.getBackgroundCall().getState()); 291 292 assertEquals(0, mGSMPhone.getForegroundCall().getEarliestCreateTime()); 293 assertEquals(0, mGSMPhone.getForegroundCall().getEarliestConnectTime()); 294 295 assertFalse(mGSMPhone.canConference()); 296 297 // cn left over from before phone.clearDisconnected(); 298 299 assertEquals(Call.State.DISCONNECTED, cn.getState()); 300 301 // One ringing (INCOMING) call 302 303 mRadioControl.triggerRing("18005551212"); 304 305 msg = mGSMTestHandler.waitForMessage(EVENT_RINGING); 306 assertNotNull("Message Time Out", msg); 307 308 assertEquals(PhoneConstants.State.RINGING, mGSMPhone.getState()); 309 assertTrue(mGSMPhone.getRingingCall().isRinging()); 310 311 ar = (AsyncResult) msg.obj; 312 cn = (Connection) ar.result; 313 assertTrue(cn.isRinging()); 314 assertEquals(mGSMPhone.getRingingCall(), cn.getCall()); 315 316 assertEquals(1, mGSMPhone.getRingingCall().getConnections().size()); 317 assertEquals(0, mGSMPhone.getForegroundCall().getConnections().size()); 318 assertEquals(0, mGSMPhone.getBackgroundCall().getConnections().size()); 319 320 assertEquals(Call.State.INCOMING, mGSMPhone.getRingingCall().getState()); 321 assertEquals(Call.State.IDLE, mGSMPhone.getForegroundCall().getState()); 322 assertEquals(Call.State.IDLE, mGSMPhone.getBackgroundCall().getState()); 323 324 assertTrue(mGSMPhone.getRingingCall().getEarliestCreateTime() > 0); 325 assertEquals(0, mGSMPhone.getRingingCall().getEarliestConnectTime()); 326 327 assertEquals(0, mGSMPhone.getForegroundCall().getEarliestCreateTime()); 328 assertEquals(0, mGSMPhone.getForegroundCall().getEarliestConnectTime()); 329 330 cn = mGSMPhone.getRingingCall().getConnections().get(0); 331 assertTrue(cn.isIncoming()); 332 assertEquals(Connection.PostDialState.NOT_STARTED, cn.getPostDialState()); 333 334 assertFalse(mGSMPhone.canConference()); 335 336 // One mobile terminated active call 337 mGSMPhone.acceptCall(); 338 339 do { 340 assertNotNull("Message Time Out", mGSMTestHandler.waitForMessage(ANY_MESSAGE)); 341 } while (mGSMPhone.getRingingCall().getConnections().size() == 1); 342 343 assertEquals(PhoneConstants.State.OFFHOOK, mGSMPhone.getState()); 344 assertFalse(mGSMPhone.getRingingCall().isRinging()); 345 346 assertEquals(0, mGSMPhone.getRingingCall().getConnections().size()); 347 assertEquals(1, mGSMPhone.getForegroundCall().getConnections().size()); 348 assertEquals(0, mGSMPhone.getBackgroundCall().getConnections().size()); 349 350 assertEquals(Call.State.IDLE, mGSMPhone.getRingingCall().getState()); 351 assertEquals(Call.State.ACTIVE, 352 mGSMPhone.getForegroundCall().getState()); 353 assertEquals(Call.State.IDLE, mGSMPhone.getBackgroundCall().getState()); 354 355 assertTrue(mGSMPhone.getForegroundCall().getEarliestCreateTime() > 0); 356 assertTrue(mGSMPhone.getForegroundCall().getEarliestConnectTime() > 0); 357 358 cn = mGSMPhone.getForegroundCall().getConnections().get(0); 359 assertTrue(cn.isIncoming()); 360 assertEquals(Connection.PostDialState.NOT_STARTED, cn.getPostDialState()); 361 362 assertFalse(mGSMPhone.canConference()); 363 364 // One disconnected (local hangup) call 365 366 try { 367 Connection conn; 368 conn = mGSMPhone.getForegroundCall().getConnections().get(0); 369 conn.hangup(); 370 } catch (CallStateException ex) { 371 ex.printStackTrace(); 372 fail("unexpected ex"); 373 } 374 375 msg = mGSMTestHandler.waitForMessage(EVENT_DISCONNECT); 376 assertNotNull("Message Time Out", msg); 377 378 assertEquals(PhoneConstants.State.IDLE, mGSMPhone.getState()); 379 assertFalse(mGSMPhone.getForegroundCall().isDialingOrAlerting()); 380 assertFalse(mGSMPhone.getRingingCall().isRinging()); 381 382 assertEquals(0, mGSMPhone.getRingingCall().getConnections().size()); 383 assertEquals(1, mGSMPhone.getForegroundCall().getConnections().size()); 384 assertEquals(0, mGSMPhone.getBackgroundCall().getConnections().size()); 385 386 assertEquals(Call.State.IDLE, mGSMPhone.getRingingCall().getState()); 387 assertEquals(Call.State.DISCONNECTED, 388 mGSMPhone.getForegroundCall().getState()); 389 assertEquals(Call.State.IDLE, mGSMPhone.getBackgroundCall().getState()); 390 391 assertTrue(mGSMPhone.getForegroundCall().getEarliestCreateTime() > 0); 392 assertTrue(mGSMPhone.getForegroundCall().getEarliestConnectTime() > 0); 393 394 cn = mGSMPhone.getForegroundCall().getEarliestConnection(); 395 396 assertEquals(Call.State.DISCONNECTED, cn.getState()); 397 398 assertEquals(DisconnectCause.LOCAL, cn.getDisconnectCause()); 399 400 assertFalse(mGSMPhone.canConference()); 401 402 // Back to idle state 403 404 mGSMPhone.clearDisconnected(); 405 406 assertFalse(mGSMPhone.getForegroundCall().isDialingOrAlerting()); 407 assertFalse(mGSMPhone.getRingingCall().isRinging()); 408 409 assertEquals(DisconnectCause.LOCAL, cn.getDisconnectCause()); 410 assertEquals(0, mGSMPhone.getForegroundCall().getConnections().size()); 411 assertEquals(PhoneConstants.State.IDLE, mGSMPhone.getState()); 412 413 assertEquals(0, mGSMPhone.getRingingCall().getConnections().size()); 414 assertEquals(0, mGSMPhone.getForegroundCall().getConnections().size()); 415 assertEquals(0, mGSMPhone.getBackgroundCall().getConnections().size()); 416 417 assertEquals(Call.State.IDLE, mGSMPhone.getRingingCall().getState()); 418 assertEquals(Call.State.IDLE, mGSMPhone.getForegroundCall().getState()); 419 assertEquals(Call.State.IDLE, mGSMPhone.getBackgroundCall().getState()); 420 421 assertEquals(0, mGSMPhone.getForegroundCall().getEarliestCreateTime()); 422 assertEquals(0, mGSMPhone.getForegroundCall().getEarliestConnectTime()); 423 424 assertFalse(mGSMPhone.canConference()); 425 426 // cn left over from before phone.clearDisconnected(); 427 428 assertEquals(Call.State.DISCONNECTED, cn.getState()); 429 430 // One ringing call 431 432 mRadioControl.triggerRing("18005551212"); 433 434 do { 435 assertNotNull("Message Time Out", mGSMTestHandler.waitForMessage(ANY_MESSAGE)); 436 } while (mGSMPhone.getRingingCall().getConnections().isEmpty()); 437 438 assertEquals(PhoneConstants.State.RINGING, mGSMPhone.getState()); 439 assertFalse(mGSMPhone.getForegroundCall().isDialingOrAlerting()); 440 assertTrue(mGSMPhone.getRingingCall().isRinging()); 441 442 assertEquals(1, mGSMPhone.getRingingCall().getConnections().size()); 443 assertEquals(0, mGSMPhone.getForegroundCall().getConnections().size()); 444 assertEquals(0, mGSMPhone.getBackgroundCall().getConnections().size()); 445 446 assertEquals(Call.State.INCOMING, mGSMPhone.getRingingCall().getState()); 447 assertEquals(Call.State.IDLE, mGSMPhone.getForegroundCall().getState()); 448 assertEquals(Call.State.IDLE, mGSMPhone.getBackgroundCall().getState()); 449 450 assertTrue(mGSMPhone.getRingingCall().getEarliestCreateTime() > 0); 451 assertEquals(0, mGSMPhone.getRingingCall().getEarliestConnectTime()); 452 453 assertEquals(0, mGSMPhone.getForegroundCall().getEarliestCreateTime()); 454 assertEquals(0, mGSMPhone.getForegroundCall().getEarliestConnectTime()); 455 456 assertFalse(mGSMPhone.canConference()); 457 458 // One rejected call 459 mGSMPhone.rejectCall(); 460 461 do { 462 assertNotNull("Message Time Out", mGSMTestHandler.waitForMessage(ANY_MESSAGE)); 463 } while (mGSMPhone.getState() != PhoneConstants.State.IDLE); 464 465 assertFalse(mGSMPhone.getForegroundCall().isDialingOrAlerting()); 466 assertFalse(mGSMPhone.getRingingCall().isRinging()); 467 468 assertEquals(1, mGSMPhone.getRingingCall().getConnections().size()); 469 assertEquals(0, mGSMPhone.getForegroundCall().getConnections().size()); 470 assertEquals(0, mGSMPhone.getBackgroundCall().getConnections().size()); 471 472 assertEquals(Call.State.DISCONNECTED, mGSMPhone.getRingingCall().getState()); 473 assertEquals(Call.State.IDLE, mGSMPhone.getForegroundCall().getState()); 474 assertEquals(Call.State.IDLE, mGSMPhone.getBackgroundCall().getState()); 475 476 assertTrue(mGSMPhone.getRingingCall().getEarliestCreateTime() > 0); 477 assertEquals(0, mGSMPhone.getRingingCall().getEarliestConnectTime()); 478 479 assertEquals(0, mGSMPhone.getForegroundCall().getEarliestCreateTime()); 480 assertEquals(0, mGSMPhone.getForegroundCall().getEarliestConnectTime()); 481 482 cn = mGSMPhone.getRingingCall().getEarliestConnection(); 483 assertEquals(Call.State.DISCONNECTED, cn.getState()); 484 485 assertEquals(DisconnectCause.INCOMING_MISSED, cn.getDisconnectCause()); 486 487 assertFalse(mGSMPhone.canConference()); 488 489 // Back to idle state 490 491 mGSMPhone.clearDisconnected(); 492 493 assertEquals(DisconnectCause.INCOMING_MISSED, cn.getDisconnectCause()); 494 assertEquals(0, mGSMPhone.getForegroundCall().getConnections().size()); 495 assertEquals(PhoneConstants.State.IDLE, mGSMPhone.getState()); 496 497 assertEquals(0, mGSMPhone.getRingingCall().getConnections().size()); 498 assertEquals(0, mGSMPhone.getForegroundCall().getConnections().size()); 499 assertEquals(0, mGSMPhone.getBackgroundCall().getConnections().size()); 500 501 assertEquals(Call.State.IDLE, mGSMPhone.getRingingCall().getState()); 502 assertEquals(Call.State.IDLE, mGSMPhone.getForegroundCall().getState()); 503 assertEquals(Call.State.IDLE, mGSMPhone.getBackgroundCall().getState()); 504 505 assertEquals(0, mGSMPhone.getForegroundCall().getEarliestCreateTime()); 506 assertEquals(0, mGSMPhone.getForegroundCall().getEarliestConnectTime()); 507 508 assertFalse(mGSMPhone.canConference()); 509 assertEquals(Call.State.DISCONNECTED, cn.getState()); 510 511 // One ringing call 512 513 mRadioControl.triggerRing("18005551212"); 514 515 do { 516 assertNotNull("Message Time Out", mGSMTestHandler.waitForMessage(ANY_MESSAGE)); 517 } while (mGSMPhone.getRingingCall().getConnections().isEmpty()); 518 519 assertEquals(PhoneConstants.State.RINGING, mGSMPhone.getState()); 520 assertFalse(mGSMPhone.getForegroundCall().isDialingOrAlerting()); 521 assertTrue(mGSMPhone.getRingingCall().isRinging()); 522 523 cn = mGSMPhone.getRingingCall().getEarliestConnection(); 524 525 // Ringing call disconnects 526 527 mRadioControl.triggerHangupForeground(); 528 529 do { 530 assertNotNull("Message Time Out", mGSMTestHandler.waitForMessage(ANY_MESSAGE)); 531 } while (mGSMPhone.getState() != PhoneConstants.State.IDLE); 532 533 assertEquals(DisconnectCause.INCOMING_MISSED, cn.getDisconnectCause()); 534 535 // One Ringing Call 536 537 mRadioControl.triggerRing("18005551212"); 538 539 do { 540 assertNotNull("Message Time Out", mGSMTestHandler.waitForMessage(ANY_MESSAGE)); 541 } while (mGSMPhone.getState() != PhoneConstants.State.RINGING); 542 543 544 cn = mGSMPhone.getRingingCall().getEarliestConnection(); 545 546 // One answered call 547 mGSMPhone.acceptCall(); 548 549 do { 550 assertNotNull("Message Time Out", mGSMTestHandler.waitForMessage(ANY_MESSAGE)); 551 } while (mGSMPhone.getState() != PhoneConstants.State.OFFHOOK); 552 553 assertEquals(Call.State.ACTIVE, mGSMPhone.getForegroundCall().getState()); 554 assertEquals(Call.State.IDLE, mGSMPhone.getBackgroundCall().getState()); 555 556 // one holding call 557 mGSMPhone.switchHoldingAndActive(); 558 559 do { 560 assertNotNull("Message Time Out", mGSMTestHandler.waitForMessage(ANY_MESSAGE)); 561 } while (mGSMPhone.getBackgroundCall().getState() == Call.State.IDLE); 562 563 564 assertEquals(Call.State.IDLE, mGSMPhone.getForegroundCall().getState()); 565 assertEquals(Call.State.HOLDING, mGSMPhone.getBackgroundCall().getState()); 566 567 // one active call 568 mGSMPhone.switchHoldingAndActive(); 569 570 do { 571 assertNotNull("Message Time Out", mGSMTestHandler.waitForMessage(ANY_MESSAGE)); 572 } 573 while (mGSMPhone.getBackgroundCall().getState() == Call.State.HOLDING); 574 575 assertEquals(Call.State.ACTIVE, mGSMPhone.getForegroundCall().getState()); 576 assertEquals(Call.State.IDLE, mGSMPhone.getBackgroundCall().getState()); 577 578 // One disconnected call in the foreground slot 579 580 mRadioControl.triggerHangupAll(); 581 582 do { 583 assertNotNull("Message Time Out", mGSMTestHandler.waitForMessage(ANY_MESSAGE)); 584 } while (mGSMPhone.getState() != PhoneConstants.State.IDLE); 585 586 assertEquals(Call.State.DISCONNECTED, mGSMPhone.getForegroundCall().getState()); 587 assertEquals(DisconnectCause.NORMAL, cn.getDisconnectCause()); 588 589 // Test missed calls 590 591 mRadioControl.triggerRing("18005551212"); 592 593 do { 594 assertNotNull("Message Time Out", mGSMTestHandler.waitForMessage(ANY_MESSAGE)); 595 } while (mGSMPhone.getState() != PhoneConstants.State.RINGING); 596 597 mGSMPhone.rejectCall(); 598 599 do { 600 assertNotNull("Message Time Out", mGSMTestHandler.waitForMessage(ANY_MESSAGE)); 601 } while (msg.what != EVENT_DISCONNECT); 602 603 ar = (AsyncResult) msg.obj; 604 cn = (Connection) ar.result; 605 606 assertEquals(DisconnectCause.INCOMING_MISSED, cn.getDisconnectCause()); 607 assertEquals(PhoneConstants.State.IDLE, mGSMPhone.getState()); 608 assertEquals(Call.State.DISCONNECTED, mGSMPhone.getRingingCall().getState()); 609 610 // Test incoming not missed calls 611 612 mRadioControl.triggerRing("18005551212"); 613 614 do { 615 assertNotNull("Message Time Out", mGSMTestHandler.waitForMessage(ANY_MESSAGE)); 616 } while (mGSMPhone.getState() != PhoneConstants.State.RINGING); 617 618 cn = mGSMPhone.getRingingCall().getEarliestConnection(); 619 620 mGSMPhone.acceptCall(); 621 622 do { 623 assertNotNull("Message Time Out", mGSMTestHandler.waitForMessage(ANY_MESSAGE)); 624 } while (mGSMPhone.getState() != PhoneConstants.State.OFFHOOK); 625 626 assertEquals(DisconnectCause.NOT_DISCONNECTED, cn.getDisconnectCause()); 627 assertEquals(Call.State.IDLE, mGSMPhone.getRingingCall().getState()); 628 assertEquals(Call.State.ACTIVE, mGSMPhone.getForegroundCall().getState()); 629 630 try { 631 mGSMPhone.getForegroundCall().hangup(); 632 } catch (CallStateException ex) { 633 ex.printStackTrace(); 634 fail("unexpected ex"); 635 } 636 637 do { 638 assertNotNull("Message Time Out", mGSMTestHandler.waitForMessage(ANY_MESSAGE)); 639 } while (mGSMPhone.getForegroundCall().getState() 640 != Call.State.DISCONNECTED); 641 642 assertEquals(DisconnectCause.LOCAL, cn.getDisconnectCause()); 643 644 // 645 // Test held and hangup held calls 646 // 647 648 // One ALERTING call 649 mGSMPhone.dial("+13125551212"); 650 651 do { 652 assertNotNull("Message Time Out", mGSMTestHandler.waitForMessage(ANY_MESSAGE)); 653 } while (mGSMPhone.getState() != PhoneConstants.State.OFFHOOK); 654 655 assertTrue(mGSMPhone.getForegroundCall().isDialingOrAlerting()); 656 657 mRadioControl.progressConnectingCallState(); 658 mRadioControl.progressConnectingCallState(); 659 660 // One ACTIVE call 661 662 do { 663 assertNotNull("Message Time Out", mGSMTestHandler.waitForMessage(ANY_MESSAGE)); 664 } while (mGSMPhone.getForegroundCall().getState() != Call.State.ACTIVE); 665 666 assertFalse(mGSMPhone.getForegroundCall().isDialingOrAlerting()); 667 668 // One ACTIVE call, one ringing call 669 670 mRadioControl.triggerRing("18005551212"); 671 672 do { 673 assertNotNull("Message Time Out", mGSMTestHandler.waitForMessage(ANY_MESSAGE)); 674 } while (mGSMPhone.getState() != PhoneConstants.State.RINGING); 675 676 assertFalse(mGSMPhone.getForegroundCall().isDialingOrAlerting()); 677 assertTrue(mGSMPhone.getRingingCall().isRinging()); 678 679 // One HOLDING call, one ACTIVE call 680 mGSMPhone.acceptCall(); 681 682 do { 683 assertNotNull("Message Time Out", mGSMTestHandler.waitForMessage(ANY_MESSAGE)); 684 } while (mGSMPhone.getState() != PhoneConstants.State.OFFHOOK); 685 686 assertFalse(mGSMPhone.getForegroundCall().isDialingOrAlerting()); 687 688 assertEquals(Call.State.IDLE, mGSMPhone.getRingingCall().getState()); 689 assertEquals(Call.State.ACTIVE, mGSMPhone.getForegroundCall().getState()); 690 assertEquals(Call.State.HOLDING, mGSMPhone.getBackgroundCall().getState()); 691 assertTrue(mGSMPhone.canConference()); 692 693 // Conference the two 694 mGSMPhone.conference(); 695 696 do { 697 assertNotNull("Message Time Out", mGSMTestHandler.waitForMessage(ANY_MESSAGE)); 698 } while (mGSMPhone.getBackgroundCall().getState() != Call.State.IDLE); 699 700 assertFalse(mGSMPhone.getForegroundCall().isDialingOrAlerting()); 701 702 assertEquals(Call.State.IDLE, mGSMPhone.getRingingCall().getState()); 703 assertEquals(Call.State.ACTIVE, mGSMPhone.getForegroundCall().getState()); 704 assertTrue(mGSMPhone.getForegroundCall().isMultiparty()); 705 assertFalse(mGSMPhone.canConference()); 706 707 // Hold the multiparty call 708 mGSMPhone.switchHoldingAndActive(); 709 710 do { 711 assertNotNull("Message Time Out", mGSMTestHandler.waitForMessage(ANY_MESSAGE)); 712 } 713 while (mGSMPhone.getBackgroundCall().getState() != Call.State.HOLDING); 714 715 assertEquals(Call.State.IDLE, mGSMPhone.getRingingCall().getState()); 716 assertEquals(Call.State.IDLE, mGSMPhone.getForegroundCall().getState()); 717 assertTrue(mGSMPhone.getBackgroundCall().isMultiparty()); 718 assertFalse(mGSMPhone.canConference()); 719 720 // Multiparty call on hold, call waiting added 721 722 mRadioControl.triggerRing("18005558355"); 723 724 do { 725 assertNotNull("Message Time Out", mGSMTestHandler.waitForMessage(ANY_MESSAGE)); 726 } while (mGSMPhone.getState() != PhoneConstants.State.RINGING); 727 728 assertFalse(mGSMPhone.getForegroundCall().isDialingOrAlerting()); 729 assertTrue(mGSMPhone.getRingingCall().isRinging()); 730 731 assertEquals(Call.State.IDLE, mGSMPhone.getForegroundCall().getState()); 732 assertEquals(Call.State.HOLDING, mGSMPhone.getBackgroundCall().getState()); 733 assertTrue(mGSMPhone.getBackgroundCall().isMultiparty()); 734 assertEquals(Call.State.WAITING, mGSMPhone.getRingingCall().getState()); 735 assertFalse(mGSMPhone.canConference()); 736 737 // Hangup conference call, ringing call still around 738 mGSMPhone.getBackgroundCall().hangup(); 739 740 do { 741 assertNotNull("Message Time Out", mGSMTestHandler.waitForMessage(ANY_MESSAGE)); 742 } while (mGSMPhone.getBackgroundCall().getState() != Call.State.DISCONNECTED); 743 744 assertEquals(PhoneConstants.State.RINGING, mGSMPhone.getState()); 745 assertEquals(Call.State.DISCONNECTED, mGSMPhone.getBackgroundCall().getState()); 746 747 assertFalse(mGSMPhone.getForegroundCall().isDialingOrAlerting()); 748 assertTrue(mGSMPhone.getRingingCall().isRinging()); 749 750 // Reject waiting call 751 mGSMPhone.rejectCall(); 752 753 do { 754 assertNotNull("Message Time Out", mGSMTestHandler.waitForMessage(ANY_MESSAGE)); 755 } while (mGSMPhone.getState() != PhoneConstants.State.IDLE); 756 757 assertFalse(mGSMPhone.getForegroundCall().isDialingOrAlerting()); 758 assertFalse(mGSMPhone.getRingingCall().isRinging()); 759 } 760 761 public void testOutgoingCallFailImmediately() throws Exception { 762 Message msg; 763 764 // Test outgoing call fail-immediately edge case 765 // This happens when a call terminated before ever appearing in a 766 // call list 767 // This should land the immediately-failing call in the 768 // ForegroundCall list as an IDLE call 769 mRadioControl.setNextDialFailImmediately(true); 770 771 Connection cn = mGSMPhone.dial("+13125551212"); 772 773 msg = mGSMTestHandler.waitForMessage(EVENT_DISCONNECT); 774 assertNotNull("Message Time Out", msg); 775 assertEquals(PhoneConstants.State.IDLE, mGSMPhone.getState()); 776 777 assertEquals(DisconnectCause.NORMAL, cn.getDisconnectCause()); 778 779 assertEquals(0, mGSMPhone.getRingingCall().getConnections().size()); 780 assertEquals(1, mGSMPhone.getForegroundCall().getConnections().size()); 781 assertEquals(0, mGSMPhone.getBackgroundCall().getConnections().size()); 782 783 assertEquals(Call.State.IDLE, mGSMPhone.getRingingCall().getState()); 784 assertEquals(Call.State.DISCONNECTED, mGSMPhone.getForegroundCall().getState()); 785 assertEquals(Call.State.IDLE, mGSMPhone.getBackgroundCall().getState()); 786 787 assertTrue(mGSMPhone.getForegroundCall().getEarliestCreateTime() > 0); 788 assertEquals(0, mGSMPhone.getForegroundCall().getEarliestConnectTime()); 789 } 790 791 public void testHangupOnOutgoing() throws Exception { 792 Connection cn; 793 Message msg; 794 795 mRadioControl.setAutoProgressConnectingCall(false); 796 797 // Test 1: local hangup in "DIALING" state 798 mGSMPhone.dial("+13125551212"); 799 800 do { 801 assertNotNull("Message Time Out", mGSMTestHandler.waitForMessage(ANY_MESSAGE)); 802 } 803 while (mGSMPhone.getForegroundCall().getState() != Call.State.DIALING); 804 805 cn = mGSMPhone.getForegroundCall().getEarliestConnection(); 806 807 mGSMPhone.getForegroundCall().hangup(); 808 809 msg = mGSMTestHandler.waitForMessage(EVENT_DISCONNECT); 810 assertNotNull("Message Time Out", msg); 811 assertEquals(PhoneConstants.State.IDLE, mGSMPhone.getState()); 812 813 assertEquals(Call.State.DISCONNECTED, mGSMPhone.getForegroundCall().getState()); 814 assertEquals(DisconnectCause.LOCAL, cn.getDisconnectCause()); 815 816 // Test 2: local hangup in "ALERTING" state 817 mGSMPhone.dial("+13125551212"); 818 819 do { 820 assertNotNull("Message Time Out", mGSMTestHandler.waitForMessage(ANY_MESSAGE)); 821 } while (mGSMPhone.getState() != PhoneConstants.State.OFFHOOK); 822 823 mRadioControl.progressConnectingCallState(); 824 825 do { 826 assertNotNull("Message Time Out", mGSMTestHandler.waitForMessage(ANY_MESSAGE)); 827 } 828 while (mGSMPhone.getForegroundCall().getState() != Call.State.ALERTING); 829 830 cn = mGSMPhone.getForegroundCall().getEarliestConnection(); 831 832 mGSMPhone.getForegroundCall().hangup(); 833 834 msg = mGSMTestHandler.waitForMessage(EVENT_DISCONNECT); 835 assertNotNull("Message Time Out", msg); 836 837 assertEquals(PhoneConstants.State.IDLE, mGSMPhone.getState()); 838 839 assertEquals(Call.State.DISCONNECTED, mGSMPhone.getForegroundCall().getState()); 840 assertEquals(DisconnectCause.LOCAL, cn.getDisconnectCause()); 841 842 // Test 3: local immediate hangup before GSM index is 843 // assigned (CallTracker.hangupPendingMO case) 844 845 mRadioControl.pauseResponses(); 846 847 cn = mGSMPhone.dial("+13125551212"); 848 849 cn.hangup(); 850 851 mRadioControl.resumeResponses(); 852 853 msg = mGSMTestHandler.waitForMessage(EVENT_DISCONNECT); 854 assertNotNull("Message Time Out", msg); 855 assertEquals(PhoneConstants.State.IDLE, mGSMPhone.getState()); 856 857 assertEquals(Call.State.DISCONNECTED, mGSMPhone.getForegroundCall().getState()); 858 859 assertEquals(DisconnectCause.LOCAL, 860 mGSMPhone.getForegroundCall().getEarliestConnection().getDisconnectCause()); 861 } 862 863 public void testHangupOnChannelClose() throws Exception { 864 mGSMPhone.dial("+13125551212"); 865 866 do { 867 assertNotNull("Message Time Out", mGSMTestHandler.waitForMessage(ANY_MESSAGE)); 868 } while (mGSMPhone.getForegroundCall().getConnections().isEmpty()); 869 870 mRadioControl.shutdown(); 871 872 do { 873 assertNotNull("Message Time Out", mGSMTestHandler.waitForMessage(ANY_MESSAGE)); 874 mGSMPhone.clearDisconnected(); 875 } while (!mGSMPhone.getForegroundCall().getConnections().isEmpty()); 876 } 877 878 public void testIncallMmiCallDeflection() throws Exception { 879 Message msg; 880 881 // establish an active call 882 mGSMPhone.dial("+13125551212"); 883 884 do { 885 mRadioControl.progressConnectingCallState(); 886 assertNotNull("Message Time Out", mGSMTestHandler.waitForMessage(ANY_MESSAGE)); 887 } while (mGSMPhone.getForegroundCall().getState() != Call.State.ACTIVE); 888 889 assertEquals(Call.State.ACTIVE, mGSMPhone.getForegroundCall().getState()); 890 assertEquals(Call.State.IDLE, mGSMPhone.getBackgroundCall().getState()); 891 892 // establish a ringing (WAITING) call 893 894 mRadioControl.triggerRing("18005551212"); 895 896 msg = mGSMTestHandler.waitForMessage(EVENT_RINGING); 897 assertNotNull("Message Time Out", msg); 898 899 assertEquals(PhoneConstants.State.RINGING, mGSMPhone.getState()); 900 assertTrue(mGSMPhone.getRingingCall().isRinging()); 901 assertEquals(Call.State.WAITING, mGSMPhone.getRingingCall().getState()); 902 assertEquals(Call.State.ACTIVE, mGSMPhone.getForegroundCall().getState()); 903 assertEquals(Call.State.IDLE, mGSMPhone.getBackgroundCall().getState()); 904 905 // Simulate entering 0 followed by SEND: release all held calls 906 // or sets UDUB for a waiting call. 907 mGSMPhone.handleInCallMmiCommands("0"); 908 909 do { 910 assertNotNull("Message Time Out", mGSMTestHandler.waitForMessage(ANY_MESSAGE)); 911 } while (mGSMPhone.getRingingCall().getState() == Call.State.WAITING); 912 913 assertEquals(PhoneConstants.State.OFFHOOK, mGSMPhone.getState()); 914 assertFalse(mGSMPhone.getRingingCall().isRinging()); 915 assertEquals(Call.State.DISCONNECTED, mGSMPhone.getRingingCall().getState()); 916 assertEquals(Call.State.ACTIVE, mGSMPhone.getForegroundCall().getState()); 917 assertEquals(Call.State.IDLE, mGSMPhone.getBackgroundCall().getState()); 918 919 // change the active call to holding call 920 mGSMPhone.switchHoldingAndActive(); 921 922 do { 923 assertNotNull("Message Time Out", mGSMTestHandler.waitForMessage(ANY_MESSAGE)); 924 } while (mGSMPhone.getBackgroundCall().getState() == Call.State.IDLE); 925 926 927 assertEquals(Call.State.IDLE, mGSMPhone.getForegroundCall().getState()); 928 assertEquals(Call.State.HOLDING, mGSMPhone.getBackgroundCall().getState()); 929 930 // Simulate entering 0 followed by SEND: release all held calls 931 // or sets UDUB for a waiting call. 932 mGSMPhone.handleInCallMmiCommands("0"); 933 934 do { 935 assertNotNull("Message Time Out", mGSMTestHandler.waitForMessage(ANY_MESSAGE)); 936 } while (mGSMPhone.getBackgroundCall().getState() == Call.State.HOLDING); 937 938 assertEquals(PhoneConstants.State.IDLE, mGSMPhone.getState()); 939 assertEquals(Call.State.IDLE, mGSMPhone.getForegroundCall().getState()); 940 assertEquals(Call.State.DISCONNECTED, mGSMPhone.getBackgroundCall().getState()); 941 } 942 943 public void testIncallMmiCallWaiting() throws Exception { 944 Message msg; 945 946 // establish an active call 947 mGSMPhone.dial("+13125551212"); 948 949 do { 950 mRadioControl.progressConnectingCallState(); 951 assertNotNull("Message Time Out", mGSMTestHandler.waitForMessage(ANY_MESSAGE)); 952 } while (mGSMPhone.getForegroundCall().getState() != Call.State.ACTIVE); 953 954 assertEquals(Call.State.ACTIVE, mGSMPhone.getForegroundCall().getState()); 955 assertEquals(Call.State.IDLE, mGSMPhone.getBackgroundCall().getState()); 956 957 // establish a ringing (WAITING) call 958 959 mRadioControl.triggerRing("18005551212"); 960 961 do { 962 msg = mGSMTestHandler.waitForMessage(ANY_MESSAGE); 963 assertNotNull("Message Time Out", msg); 964 } while (msg.what != EVENT_RINGING); 965 966 assertEquals(PhoneConstants.State.RINGING, mGSMPhone.getState()); 967 assertTrue(mGSMPhone.getRingingCall().isRinging()); 968 assertEquals(Call.State.WAITING, mGSMPhone.getRingingCall().getState()); 969 assertEquals(Call.State.ACTIVE, mGSMPhone.getForegroundCall().getState()); 970 assertEquals(Call.State.IDLE, mGSMPhone.getBackgroundCall().getState()); 971 972 // Simulate entering 1 followed by SEND: release all active calls 973 // (if any exist) and accepts the other (held or waiting) call. 974 975 mGSMPhone.handleInCallMmiCommands("1"); 976 977 do { 978 assertNotNull("Message Time Out", mGSMTestHandler.waitForMessage(ANY_MESSAGE)); 979 } while (mGSMPhone.getRingingCall().getState() == Call.State.WAITING); 980 981 assertEquals(PhoneConstants.State.OFFHOOK, mGSMPhone.getState()); 982 assertFalse(mGSMPhone.getRingingCall().isRinging()); 983 assertEquals(Call.State.IDLE, mGSMPhone.getRingingCall().getState()); 984 assertEquals(Call.State.ACTIVE, mGSMPhone.getForegroundCall().getState()); 985 assertEquals("18005551212", 986 mGSMPhone.getForegroundCall().getConnections().get(0).getAddress()); 987 988 // change the active call to holding call 989 mGSMPhone.switchHoldingAndActive(); 990 991 do { 992 assertNotNull("Message Time Out", mGSMTestHandler.waitForMessage(ANY_MESSAGE)); 993 } while (mGSMPhone.getBackgroundCall().getState() == Call.State.IDLE); 994 995 assertEquals(Call.State.IDLE, mGSMPhone.getForegroundCall().getState()); 996 assertEquals(Call.State.HOLDING, mGSMPhone.getBackgroundCall().getState()); 997 998 // Simulate entering 1 followed by SEND: release all active calls 999 // (if any exist) and accepts the other (held or waiting) call. 1000 mGSMPhone.handleInCallMmiCommands("1"); 1001 1002 do { 1003 assertNotNull("Message Time Out", mGSMTestHandler.waitForMessage(ANY_MESSAGE)); 1004 } while (mGSMPhone.getBackgroundCall().getState() != Call.State.IDLE); 1005 1006 assertEquals(PhoneConstants.State.OFFHOOK, mGSMPhone.getState()); 1007 assertEquals(Call.State.ACTIVE, mGSMPhone.getForegroundCall().getState()); 1008 assertEquals(Call.State.IDLE, mGSMPhone.getBackgroundCall().getState()); 1009 assertEquals("18005551212", 1010 mGSMPhone.getForegroundCall().getConnections().get(0).getAddress()); 1011 1012 // at this point, the active call with number==18005551212 should 1013 // have the gsm index of 2 1014 1015 mRadioControl.triggerRing("16505550100"); 1016 1017 msg = mGSMTestHandler.waitForMessage(EVENT_RINGING); 1018 assertNotNull("Message Time Out", msg); 1019 1020 assertEquals(PhoneConstants.State.RINGING, mGSMPhone.getState()); 1021 assertTrue(mGSMPhone.getRingingCall().isRinging()); 1022 assertEquals(Call.State.WAITING, mGSMPhone.getRingingCall().getState()); 1023 assertEquals(Call.State.ACTIVE, mGSMPhone.getForegroundCall().getState()); 1024 assertEquals(Call.State.IDLE, mGSMPhone.getBackgroundCall().getState()); 1025 1026 // Simulate entering "12" followed by SEND: release the call with 1027 // gsm index equals to 2. 1028 mGSMPhone.handleInCallMmiCommands("12"); 1029 1030 do { 1031 assertNotNull("Message Time Out", mGSMTestHandler.waitForMessage(ANY_MESSAGE)); 1032 } while (mGSMPhone.getForegroundCall().getState() == Call.State.ACTIVE); 1033 1034 assertEquals(PhoneConstants.State.RINGING, mGSMPhone.getState()); 1035 assertTrue(mGSMPhone.getRingingCall().isRinging()); 1036 assertEquals(Call.State.WAITING, mGSMPhone.getRingingCall().getState()); 1037 assertEquals(Call.State.DISCONNECTED, mGSMPhone.getForegroundCall().getState()); 1038 assertEquals(Call.State.IDLE, mGSMPhone.getBackgroundCall().getState()); 1039 1040 mGSMPhone.acceptCall(); 1041 1042 do { 1043 assertNotNull("Message Time Out", mGSMTestHandler.waitForMessage(ANY_MESSAGE)); 1044 } while (mGSMPhone.getState() != PhoneConstants.State.OFFHOOK); 1045 1046 assertEquals(PhoneConstants.State.OFFHOOK, mGSMPhone.getState()); 1047 assertFalse(mGSMPhone.getRingingCall().isRinging()); 1048 assertEquals(Call.State.IDLE, mGSMPhone.getRingingCall().getState()); 1049 assertEquals(Call.State.ACTIVE, mGSMPhone.getForegroundCall().getState()); 1050 assertEquals(Call.State.IDLE, mGSMPhone.getBackgroundCall().getState()); 1051 1052 // at this point, the call with number==16505550100 should 1053 // have the gsm index of 1 1054 mGSMPhone.dial("+13125551212"); 1055 1056 do { 1057 mRadioControl.progressConnectingCallState(); 1058 assertNotNull("Message Time Out", mGSMTestHandler.waitForMessage(ANY_MESSAGE)); 1059 } while (mGSMPhone.getForegroundCall().getState() != Call.State.ACTIVE || 1060 mGSMPhone.getBackgroundCall().getState() != Call.State.HOLDING); 1061 1062 assertEquals(Call.State.ACTIVE, mGSMPhone.getForegroundCall().getState()); 1063 assertEquals(Call.State.HOLDING, mGSMPhone.getBackgroundCall().getState()); 1064 1065 // at this point, the active call with number==13125551212 should 1066 // have the gsm index of 2 1067 1068 // Simulate entering "11" followed by SEND: release the call with 1069 // gsm index equals to 1. This should not be allowed, and a 1070 // Supplementary Service notification must be received. 1071 mGSMPhone.handleInCallMmiCommands("11"); 1072 1073 msg = mGSMTestHandler.waitForMessage(SUPP_SERVICE_FAILED); 1074 assertNotNull("Message Time Out", msg); 1075 assertFalse("IncallMmiCallWaiting: command should not work on holding call", msg == null); 1076 1077 // Simulate entering "12" followed by SEND: release the call with 1078 // gsm index equals to 2. 1079 mGSMPhone.handleInCallMmiCommands("12"); 1080 1081 do { 1082 assertNotNull("Message Time Out", mGSMTestHandler.waitForMessage(ANY_MESSAGE)); 1083 } while (mGSMPhone.getForegroundCall().getState() == Call.State.ACTIVE); 1084 1085 assertEquals(Call.State.DISCONNECTED, mGSMPhone.getForegroundCall().getState()); 1086 assertEquals(Call.State.HOLDING, mGSMPhone.getBackgroundCall().getState()); 1087 1088 // Simulate entering 1 followed by SEND: release all active calls 1089 // (if any exist) and accepts the other (held or waiting) call. 1090 mGSMPhone.handleInCallMmiCommands("1"); 1091 1092 do { 1093 assertNotNull("Message Time Out", mGSMTestHandler.waitForMessage(ANY_MESSAGE)); 1094 } while (mGSMPhone.getBackgroundCall().getState() != Call.State.IDLE); 1095 1096 assertEquals(PhoneConstants.State.OFFHOOK, mGSMPhone.getState()); 1097 assertEquals(Call.State.ACTIVE, mGSMPhone.getForegroundCall().getState()); 1098 assertEquals(Call.State.IDLE, mGSMPhone.getBackgroundCall().getState()); 1099 assertEquals("16505550100", 1100 mGSMPhone.getForegroundCall().getConnections().get(0).getAddress()); 1101 1102 // Simulate entering "11" followed by SEND: release the call with 1103 // gsm index equals to 1. 1104 mGSMPhone.handleInCallMmiCommands("11"); 1105 1106 do { 1107 assertNotNull("Message Time Out", mGSMTestHandler.waitForMessage(ANY_MESSAGE)); 1108 } while (mGSMPhone.getForegroundCall().getState() == Call.State.ACTIVE); 1109 1110 assertEquals(Call.State.DISCONNECTED, mGSMPhone.getForegroundCall().getState()); 1111 assertEquals(Call.State.IDLE, mGSMPhone.getBackgroundCall().getState()); 1112 } 1113 1114 public void testIncallMmiCallHold() throws Exception { 1115 Message msg; 1116 1117 // establish an active call 1118 mGSMPhone.dial("13125551212"); 1119 1120 do { 1121 mRadioControl.progressConnectingCallState(); 1122 assertNotNull("Message Time Out", mGSMTestHandler.waitForMessage(ANY_MESSAGE)); 1123 } while (mGSMPhone.getForegroundCall().getState() != Call.State.ACTIVE); 1124 1125 assertEquals(Call.State.ACTIVE, mGSMPhone.getForegroundCall().getState()); 1126 assertEquals(Call.State.IDLE, mGSMPhone.getBackgroundCall().getState()); 1127 1128 // establish a ringing (WAITING) call 1129 1130 mRadioControl.triggerRing("18005551212"); 1131 1132 msg = mGSMTestHandler.waitForMessage(EVENT_RINGING); 1133 assertNotNull("Message Time Out", msg); 1134 1135 assertEquals(PhoneConstants.State.RINGING, mGSMPhone.getState()); 1136 assertTrue(mGSMPhone.getRingingCall().isRinging()); 1137 assertEquals(Call.State.WAITING, mGSMPhone.getRingingCall().getState()); 1138 assertEquals(Call.State.ACTIVE, mGSMPhone.getForegroundCall().getState()); 1139 assertEquals(Call.State.IDLE, mGSMPhone.getBackgroundCall().getState()); 1140 1141 // simulate entering 2 followed by SEND: place all active calls 1142 // (if any exist) on hold and accepts the other (held or waiting) 1143 // call 1144 1145 mGSMPhone.handleInCallMmiCommands("2"); 1146 1147 do { 1148 assertNotNull("Message Time Out", mGSMTestHandler.waitForMessage(ANY_MESSAGE)); 1149 } while (mGSMPhone.getRingingCall().getState() == Call.State.WAITING); 1150 1151 1152 assertFalse(mGSMPhone.getRingingCall().isRinging()); 1153 assertEquals(PhoneConstants.State.OFFHOOK, mGSMPhone.getState()); 1154 assertEquals(Call.State.IDLE, mGSMPhone.getRingingCall().getState()); 1155 assertEquals(Call.State.ACTIVE, 1156 mGSMPhone.getForegroundCall().getState()); 1157 assertEquals("18005551212", 1158 mGSMPhone.getForegroundCall().getConnections().get(0).getAddress()); 1159 assertEquals(Call.State.HOLDING, mGSMPhone.getBackgroundCall().getState()); 1160 assertEquals("13125551212", 1161 mGSMPhone.getBackgroundCall().getConnections().get(0).getAddress()); 1162 1163 // swap the active and holding calls 1164 mGSMPhone.handleInCallMmiCommands("2"); 1165 1166 msg = mGSMTestHandler.waitForMessage(EVENT_PHONE_STATE_CHANGED); 1167 assertNotNull("Message Time Out", msg); 1168 1169 assertEquals(Call.State.ACTIVE, mGSMPhone.getForegroundCall().getState()); 1170 assertEquals("13125551212", 1171 mGSMPhone.getForegroundCall().getConnections().get(0).getAddress()); 1172 assertEquals(Call.State.HOLDING, mGSMPhone.getBackgroundCall().getState()); 1173 assertEquals("18005551212", 1174 mGSMPhone.getBackgroundCall().getConnections().get(0).getAddress()); 1175 1176 // merge the calls 1177 mGSMPhone.conference(); 1178 1179 do { 1180 assertNotNull("Message Time Out", mGSMTestHandler.waitForMessage(ANY_MESSAGE)); 1181 } while (mGSMPhone.getBackgroundCall().getState() != Call.State.IDLE); 1182 1183 assertEquals(Call.State.ACTIVE, mGSMPhone.getForegroundCall().getState()); 1184 assertEquals(Call.State.IDLE, mGSMPhone.getBackgroundCall().getState()); 1185 assertEquals(2, mGSMPhone.getForegroundCall().getConnections().size()); 1186 1187 // at this point, we have an active conference call, with 1188 // call(1) = 13125551212 and call(2) = 18005551212 1189 1190 // Simulate entering "23" followed by SEND: places all active call 1191 // on hold except call 3. This should fail and a supplementary service 1192 // failed notification should be received. 1193 1194 mGSMPhone.handleInCallMmiCommands("23"); 1195 1196 msg = mGSMTestHandler.waitForMessage(SUPP_SERVICE_FAILED); 1197 assertNotNull("Message Time Out", msg); 1198 assertFalse("IncallMmiCallHold: separate should have failed!", msg == null); 1199 1200 // Simulate entering "21" followed by SEND: places all active call 1201 // on hold except call 1. 1202 mGSMPhone.handleInCallMmiCommands("21"); 1203 1204 do { 1205 assertNotNull("Message Time Out", mGSMTestHandler.waitForMessage(ANY_MESSAGE)); 1206 } while (mGSMPhone.getBackgroundCall().getState() == Call.State.IDLE); 1207 1208 assertEquals(Call.State.ACTIVE, mGSMPhone.getForegroundCall().getState()); 1209 assertEquals("13125551212", 1210 mGSMPhone.getForegroundCall().getConnections().get(0).getAddress()); 1211 assertEquals(Call.State.HOLDING, mGSMPhone.getBackgroundCall().getState()); 1212 assertEquals("18005551212", 1213 mGSMPhone.getBackgroundCall().getConnections().get(0).getAddress()); 1214 } 1215 1216 public void testIncallMmiMultipartyServices() throws Exception { 1217 // establish an active call 1218 mGSMPhone.dial("13125551212"); 1219 1220 do { 1221 mRadioControl.progressConnectingCallState(); 1222 assertNotNull("Message Time Out", mGSMTestHandler.waitForMessage(ANY_MESSAGE)); 1223 } while (mGSMPhone.getForegroundCall().getState() != Call.State.ACTIVE); 1224 1225 assertEquals(Call.State.ACTIVE, mGSMPhone.getForegroundCall().getState()); 1226 assertEquals(Call.State.IDLE, mGSMPhone.getBackgroundCall().getState()); 1227 1228 // dial another call 1229 mGSMPhone.dial("18005551212"); 1230 1231 do { 1232 mRadioControl.progressConnectingCallState(); 1233 assertNotNull("Message Time Out", mGSMTestHandler.waitForMessage(ANY_MESSAGE)); 1234 } while (mGSMPhone.getForegroundCall().getState() != Call.State.ACTIVE); 1235 1236 assertEquals(Call.State.ACTIVE, mGSMPhone.getForegroundCall().getState()); 1237 assertEquals(Call.State.HOLDING, mGSMPhone.getBackgroundCall().getState()); 1238 1239 mGSMPhone.handleInCallMmiCommands("3"); 1240 1241 do { 1242 assertNotNull("Message Time Out", mGSMTestHandler.waitForMessage(ANY_MESSAGE)); 1243 } while (mGSMPhone.getBackgroundCall().getState() != Call.State.IDLE); 1244 1245 assertEquals(PhoneConstants.State.OFFHOOK, mGSMPhone.getState()); 1246 assertEquals(Call.State.ACTIVE, mGSMPhone.getForegroundCall().getState()); 1247 assertEquals("18005551212", 1248 mGSMPhone.getForegroundCall().getConnections().get(0).getAddress()); 1249 assertEquals("13125551212", 1250 mGSMPhone.getForegroundCall().getConnections().get(1).getAddress()); 1251 assertEquals(Call.State.IDLE, mGSMPhone.getBackgroundCall().getState()); 1252 } 1253 1254 public void testCallIndex() throws Exception { 1255 Message msg; 1256 1257 // establish the first call 1258 mGSMPhone.dial("16505550100"); 1259 1260 do { 1261 mRadioControl.progressConnectingCallState(); 1262 assertNotNull("Message Time Out", mGSMTestHandler.waitForMessage(ANY_MESSAGE)); 1263 } while (mGSMPhone.getForegroundCall().getState() != Call.State.ACTIVE); 1264 1265 assertEquals(Call.State.ACTIVE, mGSMPhone.getForegroundCall().getState()); 1266 assertEquals(Call.State.IDLE, mGSMPhone.getBackgroundCall().getState()); 1267 1268 String baseNumber = "1650555010"; 1269 1270 for (int i = 1; i < 6; i++) { 1271 String number = baseNumber + i; 1272 1273 mGSMPhone.dial(number); 1274 1275 do { 1276 mRadioControl.progressConnectingCallState(); 1277 assertNotNull("Message Time Out", mGSMTestHandler.waitForMessage(ANY_MESSAGE)); 1278 } while (mGSMPhone.getForegroundCall().getState() != Call.State.ACTIVE); 1279 1280 assertEquals(Call.State.ACTIVE, mGSMPhone.getForegroundCall().getState()); 1281 assertEquals(Call.State.HOLDING, mGSMPhone.getBackgroundCall().getState()); 1282 1283 if (mGSMPhone.getBackgroundCall().getConnections().size() >= 5) { 1284 break; 1285 } 1286 1287 mGSMPhone.conference(); 1288 1289 do { 1290 assertNotNull("Message Time Out", mGSMTestHandler.waitForMessage(ANY_MESSAGE)); 1291 } while (mGSMPhone.getBackgroundCall().getState() != Call.State.IDLE); 1292 1293 assertEquals(Call.State.ACTIVE, mGSMPhone.getForegroundCall().getState()); 1294 assertEquals(Call.State.IDLE, mGSMPhone.getBackgroundCall().getState()); 1295 } 1296 1297 assertEquals(Call.State.ACTIVE, mGSMPhone.getForegroundCall().getState()); 1298 assertEquals("16505550105", 1299 mGSMPhone.getForegroundCall().getConnections().get(0).getAddress()); 1300 assertEquals(Call.State.HOLDING, mGSMPhone.getBackgroundCall().getState()); 1301 1302 // create an incoming call, this call should have the call index 1303 // of 7 1304 mRadioControl.triggerRing("18005551212"); 1305 1306 msg = mGSMTestHandler.waitForMessage(EVENT_RINGING); 1307 assertNotNull("Message Time Out", msg); 1308 1309 assertEquals(PhoneConstants.State.RINGING, mGSMPhone.getState()); 1310 assertTrue(mGSMPhone.getRingingCall().isRinging()); 1311 assertEquals(Call.State.WAITING, mGSMPhone.getRingingCall().getState()); 1312 assertEquals(Call.State.ACTIVE, mGSMPhone.getForegroundCall().getState()); 1313 assertEquals(Call.State.HOLDING, mGSMPhone.getBackgroundCall().getState()); 1314 1315 // hangup the background call and accept the ringing call 1316 mGSMPhone.getBackgroundCall().hangup(); 1317 mGSMPhone.acceptCall(); 1318 1319 do { 1320 assertNotNull("Message Time Out", mGSMTestHandler.waitForMessage(ANY_MESSAGE)); 1321 } while (mGSMPhone.getRingingCall().getState() != Call.State.IDLE); 1322 1323 assertEquals(Call.State.ACTIVE, mGSMPhone.getForegroundCall().getState()); 1324 assertEquals("18005551212", 1325 mGSMPhone.getForegroundCall().getConnections().get(0).getAddress()); 1326 assertEquals(Call.State.HOLDING, mGSMPhone.getBackgroundCall().getState()); 1327 assertEquals("16505550105", 1328 mGSMPhone.getBackgroundCall().getConnections().get(0).getAddress()); 1329 1330 mGSMPhone.handleInCallMmiCommands("17"); 1331 1332 do { 1333 assertNotNull("Message Time Out", mGSMTestHandler.waitForMessage(ANY_MESSAGE)); 1334 } while (mGSMPhone.getForegroundCall().getState() == Call.State.ACTIVE); 1335 1336 assertEquals(Call.State.DISCONNECTED, mGSMPhone.getForegroundCall().getState()); 1337 assertEquals(Call.State.HOLDING, mGSMPhone.getBackgroundCall().getState()); 1338 assertEquals("16505550105", 1339 mGSMPhone.getBackgroundCall().getConnections().get(0). 1340 getAddress()); 1341 1342 mGSMPhone.handleInCallMmiCommands("1"); 1343 1344 do { 1345 assertNotNull("Message Time Out", mGSMTestHandler.waitForMessage(ANY_MESSAGE)); 1346 } while (mGSMPhone.getForegroundCall().getState() != Call.State.ACTIVE); 1347 1348 assertEquals(Call.State.ACTIVE, mGSMPhone.getForegroundCall().getState()); 1349 assertEquals(Call.State.IDLE, mGSMPhone.getBackgroundCall().getState()); 1350 1351 mGSMPhone.handleInCallMmiCommands("16"); 1352 1353 do { 1354 assertNotNull("Message Time Out", mGSMTestHandler.waitForMessage(ANY_MESSAGE)); 1355 } while (mGSMPhone.getForegroundCall().getState() == Call.State.ACTIVE); 1356 1357 assertEquals(Call.State.DISCONNECTED, mGSMPhone.getForegroundCall().getState()); 1358 assertEquals(Call.State.IDLE, mGSMPhone.getBackgroundCall().getState()); 1359 } 1360 1361 public void testPostDialSequences() throws Exception { 1362 Message msg; 1363 AsyncResult ar; 1364 Connection cn; 1365 1366 mGSMPhone.dial("+13125551212,1234;5N8xx"); 1367 1368 msg = mGSMTestHandler.waitForMessage(EVENT_POST_DIAL); 1369 assertNotNull("Message Time Out", msg); 1370 ar = (AsyncResult) (msg.obj); 1371 cn = (Connection) (ar.result); 1372 assertEquals(',', msg.arg1); 1373 assertEquals("1234;5N8", cn.getRemainingPostDialString()); 1374 1375 1376 msg = mGSMTestHandler.waitForMessage(EVENT_POST_DIAL); 1377 assertNotNull("Message Time Out", msg); 1378 assertEquals('1', msg.arg1); 1379 ar = (AsyncResult) (msg.obj); 1380 assertEquals(Connection.PostDialState.STARTED, ar.userObj); 1381 1382 1383 msg = mGSMTestHandler.waitForMessage(EVENT_POST_DIAL); 1384 assertNotNull("Message Time Out", msg); 1385 assertEquals('2', msg.arg1); 1386 ar = (AsyncResult) (msg.obj); 1387 assertEquals(Connection.PostDialState.STARTED, ar.userObj); 1388 1389 1390 msg = mGSMTestHandler.waitForMessage(EVENT_POST_DIAL); 1391 assertNotNull("Message Time Out", msg); 1392 assertEquals('3', msg.arg1); 1393 ar = (AsyncResult) (msg.obj); 1394 assertEquals(Connection.PostDialState.STARTED, ar.userObj); 1395 1396 1397 msg = mGSMTestHandler.waitForMessage(EVENT_POST_DIAL); 1398 assertNotNull("Message Time Out", msg); 1399 assertEquals('4', msg.arg1); 1400 ar = (AsyncResult) (msg.obj); 1401 assertEquals(Connection.PostDialState.STARTED, ar.userObj); 1402 1403 1404 msg = mGSMTestHandler.waitForMessage(EVENT_POST_DIAL); 1405 assertNotNull("Message Time Out", msg); 1406 assertEquals(';', msg.arg1); 1407 ar = (AsyncResult) (msg.obj); 1408 cn = (Connection) (ar.result); 1409 assertEquals(Connection.PostDialState.WAIT, cn.getPostDialState()); 1410 assertEquals(Connection.PostDialState.WAIT, ar.userObj); 1411 cn.proceedAfterWaitChar(); 1412 1413 1414 msg = mGSMTestHandler.waitForMessage(EVENT_POST_DIAL); 1415 assertNotNull("Message Time Out", msg); 1416 assertEquals('5', msg.arg1); 1417 ar = (AsyncResult) (msg.obj); 1418 assertEquals(Connection.PostDialState.STARTED, ar.userObj); 1419 1420 1421 msg = mGSMTestHandler.waitForMessage(EVENT_POST_DIAL); 1422 assertEquals('N', msg.arg1); 1423 ar = (AsyncResult) (msg.obj); 1424 cn = (Connection) (ar.result); 1425 assertEquals(Connection.PostDialState.WILD, cn.getPostDialState()); 1426 assertEquals(Connection.PostDialState.WILD, ar.userObj); 1427 cn.proceedAfterWildChar(",6;7"); 1428 1429 1430 msg = mGSMTestHandler.waitForMessage(EVENT_POST_DIAL); 1431 assertNotNull("Message Time Out", msg); 1432 ar = (AsyncResult) (msg.obj); 1433 cn = (Connection) (ar.result); 1434 assertEquals(',', msg.arg1); 1435 assertEquals("6;78", cn.getRemainingPostDialString()); 1436 1437 msg = mGSMTestHandler.waitForMessage(EVENT_POST_DIAL); 1438 assertNotNull("Message Time Out", msg); 1439 assertEquals('6', msg.arg1); 1440 ar = (AsyncResult) (msg.obj); 1441 assertEquals(Connection.PostDialState.STARTED, ar.userObj); 1442 1443 msg = mGSMTestHandler.waitForMessage(EVENT_POST_DIAL); 1444 assertNotNull("Message Time Out", msg); 1445 assertEquals(';', msg.arg1); 1446 ar = (AsyncResult) (msg.obj); 1447 cn = (Connection) (ar.result); 1448 assertEquals(Connection.PostDialState.WAIT, cn.getPostDialState()); 1449 assertEquals(Connection.PostDialState.WAIT, ar.userObj); 1450 cn.proceedAfterWaitChar(); 1451 1452 msg = mGSMTestHandler.waitForMessage(EVENT_POST_DIAL); 1453 assertNotNull("Message Time Out", msg); 1454 assertEquals('7', msg.arg1); 1455 ar = (AsyncResult) (msg.obj); 1456 assertEquals(Connection.PostDialState.STARTED, ar.userObj); 1457 1458 msg = mGSMTestHandler.waitForMessage(EVENT_POST_DIAL); 1459 assertNotNull("Message Time Out", msg); 1460 assertEquals('8', msg.arg1); 1461 ar = (AsyncResult) (msg.obj); 1462 assertEquals(Connection.PostDialState.STARTED, ar.userObj); 1463 1464 // Bogus chars at end should be ignored 1465 msg = mGSMTestHandler.waitForMessage(EVENT_POST_DIAL); 1466 assertNotNull("Message Time Out", msg); 1467 assertEquals(0, msg.arg1); 1468 ar = (AsyncResult) (msg.obj); 1469 cn = (Connection) (ar.result); 1470 assertEquals(Connection.PostDialState.COMPLETE, 1471 cn.getPostDialState()); 1472 assertEquals(Connection.PostDialState.COMPLETE, ar.userObj); 1473 } 1474 1475 public void testPostDialCancel() throws Exception { 1476 Message msg; 1477 AsyncResult ar; 1478 Connection cn; 1479 1480 mGSMPhone.dial("+13125551212,N"); 1481 mRadioControl.progressConnectingToActive(); 1482 1483 mRadioControl.progressConnectingToActive(); 1484 1485 msg = mGSMTestHandler.waitForMessage(EVENT_POST_DIAL); 1486 assertNotNull("Message Time Out", msg); 1487 assertEquals(',', msg.arg1); 1488 1489 msg = mGSMTestHandler.waitForMessage(EVENT_POST_DIAL); 1490 assertEquals('N', msg.arg1); 1491 ar = (AsyncResult) (msg.obj); 1492 cn = (Connection) (ar.result); 1493 assertEquals(Connection.PostDialState.WILD, cn.getPostDialState()); 1494 cn.cancelPostDial(); 1495 1496 assertEquals(Connection.PostDialState.CANCELLED, cn.getPostDialState()); 1497 } 1498 1499 public void testOutgoingCallFail() throws Exception { 1500 Message msg; 1501 /* 1502 * normal clearing 1503 */ 1504 1505 mRadioControl.setNextCallFailCause(CallFailCause.NORMAL_CLEARING); 1506 mRadioControl.setAutoProgressConnectingCall(false); 1507 1508 Connection cn = mGSMPhone.dial("+13125551212"); 1509 1510 mRadioControl.progressConnectingCallState(); 1511 1512 // I'm just progressing the call state to 1513 // ensure getCurrentCalls() gets processed... 1514 // Normally these failure conditions would happen in DIALING 1515 // not ALERTING 1516 do { 1517 assertNotNull("Message Time Out", mGSMTestHandler.waitForMessage(ANY_MESSAGE)); 1518 } while (cn.getState() == Call.State.DIALING); 1519 1520 1521 mRadioControl.triggerHangupAll(); 1522 msg = mGSMTestHandler.waitForMessage(EVENT_DISCONNECT); 1523 assertNotNull("Message Time Out", msg); 1524 assertEquals(PhoneConstants.State.IDLE, mGSMPhone.getState()); 1525 1526 assertEquals(DisconnectCause.NORMAL, cn.getDisconnectCause()); 1527 1528 assertEquals(0, mGSMPhone.getRingingCall().getConnections().size()); 1529 assertEquals(1, mGSMPhone.getForegroundCall().getConnections().size()); 1530 assertEquals(0, mGSMPhone.getBackgroundCall().getConnections().size()); 1531 1532 assertEquals(Call.State.IDLE, mGSMPhone.getRingingCall().getState()); 1533 assertEquals(Call.State.DISCONNECTED, mGSMPhone.getForegroundCall().getState()); 1534 assertEquals(Call.State.IDLE, mGSMPhone.getBackgroundCall().getState()); 1535 1536 assertTrue(mGSMPhone.getForegroundCall().getEarliestCreateTime() > 0); 1537 assertEquals(0, mGSMPhone.getForegroundCall().getEarliestConnectTime()); 1538 1539 /* 1540 * busy 1541 */ 1542 1543 mRadioControl.setNextCallFailCause(CallFailCause.USER_BUSY); 1544 mRadioControl.setAutoProgressConnectingCall(false); 1545 1546 cn = mGSMPhone.dial("+13125551212"); 1547 1548 mRadioControl.progressConnectingCallState(); 1549 1550 // I'm just progressing the call state to 1551 // ensure getCurrentCalls() gets processed... 1552 // Normally these failure conditions would happen in DIALING 1553 // not ALERTING 1554 do { 1555 assertNotNull("Message Time Out", mGSMTestHandler.waitForMessage(ANY_MESSAGE)); 1556 } while (cn.getState() == Call.State.DIALING); 1557 1558 1559 mRadioControl.triggerHangupAll(); 1560 msg = mGSMTestHandler.waitForMessage(EVENT_DISCONNECT); 1561 assertNotNull("Message Time Out", msg); 1562 assertEquals(PhoneConstants.State.IDLE, mGSMPhone.getState()); 1563 1564 assertEquals(DisconnectCause.BUSY, cn.getDisconnectCause()); 1565 1566 assertEquals(0, mGSMPhone.getRingingCall().getConnections().size()); 1567 assertEquals(1, mGSMPhone.getForegroundCall().getConnections().size()); 1568 assertEquals(0, mGSMPhone.getBackgroundCall().getConnections().size()); 1569 1570 assertEquals(Call.State.IDLE, mGSMPhone.getRingingCall().getState()); 1571 assertEquals(Call.State.DISCONNECTED, 1572 mGSMPhone.getForegroundCall().getState()); 1573 assertEquals(Call.State.IDLE, mGSMPhone.getBackgroundCall().getState()); 1574 1575 assertTrue(mGSMPhone.getForegroundCall().getEarliestCreateTime() > 0); 1576 assertEquals(0, mGSMPhone.getForegroundCall().getEarliestConnectTime()); 1577 1578 /* 1579 * congestion 1580 */ 1581 1582 mRadioControl.setNextCallFailCause(CallFailCause.NO_CIRCUIT_AVAIL); 1583 mRadioControl.setAutoProgressConnectingCall(false); 1584 1585 cn = mGSMPhone.dial("+13125551212"); 1586 1587 mRadioControl.progressConnectingCallState(); 1588 1589 // I'm just progressing the call state to 1590 // ensure getCurrentCalls() gets processed... 1591 // Normally these failure conditions would happen in DIALING 1592 // not ALERTING 1593 do { 1594 msg = mGSMTestHandler.waitForMessage(ANY_MESSAGE); 1595 assertNotNull("Message Time Out", msg); 1596 } while (cn.getState() == Call.State.DIALING); 1597 1598 1599 mRadioControl.triggerHangupAll(); 1600 1601 // Unlike the while loops above, this one waits 1602 // for a "phone state changed" message back to "idle" 1603 do { 1604 msg = mGSMTestHandler.waitForMessage(ANY_MESSAGE); 1605 assertNotNull("Message Time Out", msg); 1606 } while (!(msg.what == EVENT_PHONE_STATE_CHANGED 1607 && mGSMPhone.getState() == PhoneConstants.State.IDLE)); 1608 1609 assertEquals(PhoneConstants.State.IDLE, mGSMPhone.getState()); 1610 1611 assertEquals(DisconnectCause.CONGESTION, cn.getDisconnectCause()); 1612 1613 assertEquals(0, mGSMPhone.getRingingCall().getConnections().size()); 1614 assertEquals(1, mGSMPhone.getForegroundCall().getConnections().size()); 1615 assertEquals(0, mGSMPhone.getBackgroundCall().getConnections().size()); 1616 1617 assertEquals(Call.State.IDLE, mGSMPhone.getRingingCall().getState()); 1618 assertEquals(Call.State.DISCONNECTED, mGSMPhone.getForegroundCall().getState()); 1619 assertEquals(Call.State.IDLE, mGSMPhone.getBackgroundCall().getState()); 1620 1621 assertTrue(mGSMPhone.getForegroundCall().getEarliestCreateTime() > 0); 1622 assertEquals(0, mGSMPhone.getForegroundCall().getEarliestConnectTime()); 1623 } 1624 1625 public void testSSNotification() throws Exception { 1626 // MO 1627 runTest(0, SuppServiceNotification.MO_CODE_UNCONDITIONAL_CF_ACTIVE); 1628 runTest(0, SuppServiceNotification.MO_CODE_CALL_IS_WAITING); 1629 runTest(0, SuppServiceNotification.MO_CODE_CALL_DEFLECTED); 1630 1631 // MT 1632 runTest(1, SuppServiceNotification.MT_CODE_FORWARDED_CALL); 1633 runTest(1, SuppServiceNotification.MT_CODE_CALL_CONNECTED_ECT); 1634 runTest(1, SuppServiceNotification.MT_CODE_ADDITIONAL_CALL_FORWARDED); 1635 } 1636 1637 private void runTest(int type, int code) { 1638 Message msg; 1639 1640 mRadioControl.triggerSsn(type, code); 1641 1642 msg = mGSMTestHandler.waitForMessage(EVENT_SSN); 1643 assertNotNull("Message Time Out", msg); 1644 AsyncResult ar = (AsyncResult) msg.obj; 1645 1646 assertNull(ar.exception); 1647 1648 SuppServiceNotification notification = 1649 (SuppServiceNotification) ar.result; 1650 1651 assertEquals(type, notification.notificationType); 1652 assertEquals(code, notification.code); 1653 } 1654 1655 public void testUssd() throws Exception { 1656 // Quick hack to work around a race condition in this test: 1657 // We may initiate a USSD MMI before GSMPhone receives its initial 1658 // GSMTestHandler.EVENT_RADIO_OFF_OR_NOT_AVAILABLE event. When the phone sees this 1659 // event, it will cancel the just issued USSD MMI, which we don't 1660 // want. So sleep a little first. 1661 try { 1662 Thread.sleep(1000); 1663 } catch (InterruptedException ex) { 1664 // do nothing 1665 } 1666 1667 verifyNormal(); 1668 verifyCancel(); 1669 varifyNetworkInitiated(); 1670 } 1671 1672 private void varifyNetworkInitiated() { 1673 Message msg; 1674 AsyncResult ar; 1675 MmiCode mmi; 1676 1677 // Receive an incoming NOTIFY 1678 mRadioControl.triggerIncomingUssd("0", "NOTIFY message"); 1679 msg = mGSMTestHandler.waitForMessage(EVENT_MMI_COMPLETE); 1680 assertNotNull("Message Time Out", msg); 1681 ar = (AsyncResult) msg.obj; 1682 mmi = (MmiCode) ar.result; 1683 1684 assertFalse(mmi.isUssdRequest()); 1685 1686 // Receive a REQUEST and send response 1687 mRadioControl.triggerIncomingUssd("1", "REQUEST Message"); 1688 msg = mGSMTestHandler.waitForMessage(EVENT_MMI_COMPLETE); 1689 assertNotNull("Message Time Out", msg); 1690 ar = (AsyncResult) msg.obj; 1691 mmi = (MmiCode) ar.result; 1692 1693 assertTrue(mmi.isUssdRequest()); 1694 1695 mGSMPhone.sendUssdResponse("## TEST: TEST_GSMPhone responding..."); 1696 msg = mGSMTestHandler.waitForMessage(EVENT_MMI_INITIATE); 1697 assertNotNull("Message Time Out", msg); 1698 ar = (AsyncResult) msg.obj; 1699 mmi = (MmiCode) ar.result; 1700 1701 GsmMmiCode gsmMmi = (GsmMmiCode) mmi; 1702 assertTrue(gsmMmi.isPendingUSSD()); 1703 msg = mGSMTestHandler.waitForMessage(EVENT_MMI_COMPLETE); 1704 assertNotNull("Message Time Out", msg); 1705 ar = (AsyncResult) msg.obj; 1706 mmi = (MmiCode) ar.result; 1707 1708 assertNull(ar.exception); 1709 assertFalse(mmi.isUssdRequest()); 1710 1711 // Receive a REQUEST and cancel 1712 mRadioControl.triggerIncomingUssd("1", "REQUEST Message"); 1713 msg = mGSMTestHandler.waitForMessage(EVENT_MMI_COMPLETE); 1714 assertNotNull("Message Time Out", msg); 1715 ar = (AsyncResult) msg.obj; 1716 mmi = (MmiCode) ar.result; 1717 1718 assertTrue(mmi.isUssdRequest()); 1719 1720 mmi.cancel(); 1721 msg = mGSMTestHandler.waitForMessage(EVENT_MMI_COMPLETE); 1722 assertNotNull("Message Time Out", msg); 1723 1724 ar = (AsyncResult) msg.obj; 1725 mmi = (MmiCode) ar.result; 1726 1727 assertNull(ar.exception); 1728 assertEquals(MmiCode.State.CANCELLED, mmi.getState()); 1729 1730 List mmiList = mGSMPhone.getPendingMmiCodes(); 1731 assertEquals(0, mmiList.size()); 1732 } 1733 1734 private void verifyNormal() throws CallStateException { 1735 Message msg; 1736 AsyncResult ar; 1737 MmiCode mmi; 1738 1739 mGSMPhone.dial("#646#"); 1740 1741 msg = mGSMTestHandler.waitForMessage(EVENT_MMI_INITIATE); 1742 assertNotNull("Message Time Out", msg); 1743 1744 msg = mGSMTestHandler.waitForMessage(EVENT_MMI_COMPLETE); 1745 assertNotNull("Message Time Out", msg); 1746 1747 ar = (AsyncResult) msg.obj; 1748 mmi = (MmiCode) ar.result; 1749 assertEquals(MmiCode.State.COMPLETE, mmi.getState()); 1750 } 1751 1752 1753 private void verifyCancel() throws CallStateException { 1754 /** 1755 * This case makes an assumption that dial() will add the USSD 1756 * to the "pending MMI codes" list before it returns. This seems 1757 * like reasonable semantics. It also assumes that the USSD 1758 * request in question won't complete until we get back to the 1759 * event loop, thus cancel() is safe. 1760 */ 1761 Message msg; 1762 1763 mGSMPhone.dial("#646#"); 1764 1765 List<? extends MmiCode> pendingMmis = mGSMPhone.getPendingMmiCodes(); 1766 1767 assertEquals(1, pendingMmis.size()); 1768 1769 MmiCode mmi = pendingMmis.get(0); 1770 assertTrue(mmi.isCancelable()); 1771 mmi.cancel(); 1772 1773 msg = mGSMTestHandler.waitForMessage(EVENT_MMI_INITIATE); 1774 assertNotNull("Message Time Out", msg); 1775 1776 msg = mGSMTestHandler.waitForMessage(EVENT_MMI_COMPLETE); 1777 assertNotNull("Message Time Out", msg); 1778 1779 AsyncResult ar = (AsyncResult) msg.obj; 1780 mmi = (MmiCode) ar.result; 1781 1782 assertEquals(MmiCode.State.CANCELLED, mmi.getState()); 1783 } 1784 1785 public void testRilHooks() throws Exception { 1786 // 1787 // These test cases all assume the RIL OEM hooks 1788 // just echo back their input 1789 // 1790 1791 Message msg; 1792 AsyncResult ar; 1793 1794 // null byte array 1795 1796 mGSMPhone.invokeOemRilRequestRaw(null, mHandler.obtainMessage(EVENT_OEM_RIL_MESSAGE)); 1797 1798 msg = mGSMTestHandler.waitForMessage(EVENT_OEM_RIL_MESSAGE); 1799 assertNotNull("Message Time Out", msg); 1800 1801 ar = ((AsyncResult) msg.obj); 1802 1803 assertNull(ar.result); 1804 assertNull(ar.exception); 1805 1806 // empty byte array 1807 1808 mGSMPhone.invokeOemRilRequestRaw(new byte[0], mHandler.obtainMessage(EVENT_OEM_RIL_MESSAGE)); 1809 1810 msg = mGSMTestHandler.waitForMessage(EVENT_OEM_RIL_MESSAGE); 1811 assertNotNull("Message Time Out", msg); 1812 1813 ar = ((AsyncResult) msg.obj); 1814 1815 assertEquals(0, ((byte[]) (ar.result)).length); 1816 assertNull(ar.exception); 1817 1818 // byte array with data 1819 1820 mGSMPhone.invokeOemRilRequestRaw("Hello".getBytes("utf-8"), 1821 mHandler.obtainMessage(EVENT_OEM_RIL_MESSAGE)); 1822 1823 msg = mGSMTestHandler.waitForMessage(EVENT_OEM_RIL_MESSAGE); 1824 assertNotNull("Message Time Out", msg); 1825 1826 ar = ((AsyncResult) msg.obj); 1827 1828 assertEquals("Hello", new String(((byte[]) (ar.result)), "utf-8")); 1829 assertNull(ar.exception); 1830 1831 // null strings 1832 1833 mGSMPhone.invokeOemRilRequestStrings(null, mHandler.obtainMessage(EVENT_OEM_RIL_MESSAGE)); 1834 1835 msg = mGSMTestHandler.waitForMessage(EVENT_OEM_RIL_MESSAGE); 1836 assertNotNull("Message Time Out", msg); 1837 1838 ar = ((AsyncResult) msg.obj); 1839 1840 assertNull(ar.result); 1841 assertNull(ar.exception); 1842 1843 // empty byte array 1844 1845 mGSMPhone.invokeOemRilRequestStrings(new String[0], 1846 mHandler.obtainMessage(EVENT_OEM_RIL_MESSAGE)); 1847 1848 msg = mGSMTestHandler.waitForMessage(EVENT_OEM_RIL_MESSAGE); 1849 assertNotNull("Message Time Out", msg); 1850 1851 ar = ((AsyncResult) msg.obj); 1852 1853 assertEquals(0, ((String[]) (ar.result)).length); 1854 assertNull(ar.exception); 1855 1856 // Strings with data 1857 1858 String s[] = new String[1]; 1859 1860 s[0] = "Hello"; 1861 1862 mGSMPhone.invokeOemRilRequestStrings(s, mHandler.obtainMessage(EVENT_OEM_RIL_MESSAGE)); 1863 1864 msg = mGSMTestHandler.waitForMessage(EVENT_OEM_RIL_MESSAGE); 1865 assertNotNull("Message Time Out", msg); 1866 1867 ar = ((AsyncResult) msg.obj); 1868 1869 assertEquals("Hello", ((String[]) (ar.result))[0]); 1870 assertEquals(1, ((String[]) (ar.result)).length); 1871 assertNull(ar.exception); 1872 } 1873 1874 public void testMmi() throws Exception { 1875 mRadioControl.setAutoProgressConnectingCall(false); 1876 1877 // "valid" MMI sequences 1878 runValidMmi("*#67#", false); 1879 runValidMmi("##43*11#", false); 1880 runValidMmi("#33*1234*11#", false); 1881 runValidMmi("*21*6505551234**5#", false); 1882 runValidMmi("**03**1234*4321*4321#", false); 1883 // pound string 1884 runValidMmi("5308234092307540923#", true); 1885 // short code 1886 runValidMmi("22", true); 1887 // as part of call setup 1888 runValidMmiWithConnect("*31#6505551234"); 1889 1890 // invalid MMI sequences 1891 runNotMmi("6505551234"); 1892 runNotMmi("1234#*12#34566654"); 1893 runNotMmi("*#*#12#*"); 1894 } 1895 1896 private void runValidMmi(String dialString, boolean cancelable) throws CallStateException { 1897 Connection c = mGSMPhone.dial(dialString); 1898 assertNull(c); 1899 Message msg = mGSMTestHandler.waitForMessage(EVENT_MMI_INITIATE); 1900 assertNotNull("Message Time Out", msg); 1901 // Should not be cancelable. 1902 AsyncResult ar = (AsyncResult) msg.obj; 1903 MmiCode mmi = (MmiCode) ar.result; 1904 assertEquals(cancelable, mmi.isCancelable()); 1905 1906 msg = mGSMTestHandler.waitForMessage(EVENT_MMI_COMPLETE); 1907 assertNotNull("Message Time Out", msg); 1908 } 1909 1910 private void runValidMmiWithConnect(String dialString) throws CallStateException { 1911 mRadioControl.pauseResponses(); 1912 1913 Connection c = mGSMPhone.dial(dialString); 1914 assertNotNull(c); 1915 1916 hangup(c); 1917 } 1918 1919 private void hangup(Connection cn) throws CallStateException { 1920 cn.hangup(); 1921 1922 mRadioControl.resumeResponses(); 1923 assertNotNull(mGSMTestHandler.waitForMessage(EVENT_DISCONNECT)); 1924 1925 } 1926 1927 private void runNotMmi(String dialString) throws CallStateException { 1928 mRadioControl.pauseResponses(); 1929 1930 Connection c = mGSMPhone.dial(dialString); 1931 assertNotNull(c); 1932 1933 hangup(c); 1934 } 1935 } 1936