1 /* 2 * Copyright (C) 2016 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.server.telecom.tests; 18 19 import android.os.Bundle; 20 import android.telecom.Call; 21 import android.telecom.Conference; 22 import android.telecom.Connection; 23 import android.telecom.InCallService; 24 import android.telecom.ParcelableCall; 25 import android.test.suitebuilder.annotation.LargeTest; 26 import android.test.suitebuilder.annotation.MediumTest; 27 28 import java.util.ArrayList; 29 import java.util.Arrays; 30 31 /** 32 * Tests the {@link Connection} and {@link Call} extras functionality. 33 */ 34 public class CallExtrasTest extends TelecomSystemTest { 35 36 public final static String EXTRA_KEY_STR = "STRINGKEY"; 37 public final static String EXTRA_KEY_STR2 = "BLAHTEST"; 38 public final static String EXTRA_KEY_INT = "INTKEY"; 39 public final static String EXTRA_KEY_BOOL = "BOOLKEY"; 40 public final static String EXTRA_VALUE_STR = "socks"; 41 public final static String EXTRA_VALUE2_STR = "mozzarella"; 42 public final static int EXTRA_VALUE_INT = 1234; 43 44 /** 45 * Tests setting extras on the connection side and ensuring they are propagated through to 46 * the InCallService. 47 * 48 * @throws Exception 49 */ 50 @MediumTest 51 public void testCsPutExtras() throws Exception { 52 // Get a call up and running. 53 IdPair ids = startAndMakeActiveIncomingCall("650-555-1212", 54 mPhoneAccountA0.getAccountHandle(), mConnectionServiceFixtureA); 55 56 // Communicate extras from the ConnectionService to the InCallService. 57 Bundle extras = new Bundle(); 58 extras.putString(EXTRA_KEY_STR, EXTRA_VALUE_STR); 59 extras.putInt(EXTRA_KEY_INT, EXTRA_VALUE_INT); 60 61 Connection connection = mConnectionServiceFixtureA.mLatestConnection; 62 connection.putExtras(extras); 63 mInCallServiceFixtureX.waitForUpdate(); 64 assertTrue(mInCallServiceFixtureX.getCall(ids.mCallId).getExtras().containsKey( 65 EXTRA_KEY_STR)); 66 assertTrue(mInCallServiceFixtureX.getCall(ids.mCallId).getExtras().containsKey( 67 EXTRA_KEY_INT)); 68 } 69 70 /** 71 * Tests setting extras on the connection side and ensuring they are propagated through to 72 * the InCallService. 73 * 74 * @throws Exception 75 */ 76 @MediumTest 77 public void testCsPutBooleanExtra() throws Exception { 78 // Get a call up and running. 79 IdPair ids = startAndMakeActiveIncomingCall("650-555-1212", 80 mPhoneAccountA0.getAccountHandle(), mConnectionServiceFixtureA); 81 82 Connection connection = mConnectionServiceFixtureA.mLatestConnection; 83 connection.putExtra(EXTRA_KEY_BOOL, true); 84 mInCallServiceFixtureX.waitForUpdate(); 85 assertTrue(mInCallServiceFixtureX.getCall(ids.mCallId).getExtras() 86 .containsKey(EXTRA_KEY_BOOL)); 87 assertTrue( 88 mInCallServiceFixtureX.getCall(ids.mCallId).getExtras().getBoolean(EXTRA_KEY_BOOL)); 89 } 90 91 /** 92 * Tests setting extras on the connection side and ensuring they are propagated through to 93 * the InCallService. 94 * 95 * @throws Exception 96 */ 97 @MediumTest 98 public void testCsPutIntExtra() throws Exception { 99 // Get a call up and running. 100 IdPair ids = startAndMakeActiveIncomingCall("650-555-1212", 101 mPhoneAccountA0.getAccountHandle(), mConnectionServiceFixtureA); 102 103 Connection connection = mConnectionServiceFixtureA.mLatestConnection; 104 connection.putExtra(EXTRA_KEY_INT, EXTRA_VALUE_INT); 105 mInCallServiceFixtureX.waitForUpdate(); 106 assertTrue( 107 mInCallServiceFixtureX.getCall(ids.mCallId).getExtras().containsKey(EXTRA_KEY_INT)); 108 assertEquals(EXTRA_VALUE_INT, 109 mInCallServiceFixtureX.getCall(ids.mCallId).getExtras().getInt(EXTRA_KEY_INT)); 110 } 111 112 /** 113 * Tests setting extras on the connection side and ensuring they are propagated through to 114 * the InCallService. 115 * 116 * @throws Exception 117 */ 118 @MediumTest 119 public void testCsPutStringExtra() throws Exception { 120 // Get a call up and running. 121 IdPair ids = startAndMakeActiveIncomingCall("650-555-1212", 122 mPhoneAccountA0.getAccountHandle(), mConnectionServiceFixtureA); 123 124 Connection connection = mConnectionServiceFixtureA.mLatestConnection; 125 connection.putExtra(EXTRA_KEY_STR, EXTRA_VALUE_STR); 126 127 mInCallServiceFixtureX.waitForUpdate(); 128 assertTrue( 129 mInCallServiceFixtureX.getCall(ids.mCallId).getExtras().containsKey(EXTRA_KEY_STR)); 130 assertEquals(EXTRA_VALUE_STR, 131 mInCallServiceFixtureX.getCall(ids.mCallId).getExtras().getString(EXTRA_KEY_STR)); 132 } 133 134 /** 135 * Tests remove extras on the connection side and ensuring the removal is reflected in the 136 * InCallService. 137 * 138 * @throws Exception 139 */ 140 @MediumTest 141 public void testCsRemoveExtra() throws Exception { 142 // Get a call up and running."STRING" 143 IdPair ids = startAndMakeActiveIncomingCall("650-555-1212", 144 mPhoneAccountA0.getAccountHandle(), mConnectionServiceFixtureA); 145 146 // Add something. 147 Connection connection = mConnectionServiceFixtureA.mLatestConnection; 148 connection.putExtra(EXTRA_KEY_STR2, EXTRA_VALUE_STR); 149 connection.putExtra(EXTRA_KEY_STR, EXTRA_VALUE_STR); 150 mInCallServiceFixtureX.waitForUpdate(); 151 assertTrue( 152 mInCallServiceFixtureX.getCall(ids.mCallId).getExtras().containsKey(EXTRA_KEY_STR)); 153 assertEquals(EXTRA_VALUE_STR, 154 mInCallServiceFixtureX.getCall(ids.mCallId).getExtras().getString(EXTRA_KEY_STR)); 155 156 // Take it away. 157 connection.removeExtras(new ArrayList<String>(Arrays.asList(EXTRA_KEY_STR))); 158 mInCallServiceFixtureX.waitForUpdate(); 159 assertFalse( 160 mInCallServiceFixtureX.getCall(ids.mCallId).getExtras().containsKey(EXTRA_KEY_STR)); 161 assertTrue(mInCallServiceFixtureX.getCall(ids.mCallId).getExtras() 162 .containsKey(EXTRA_KEY_STR2)); 163 } 164 165 /** 166 * Tests putting a new value for an existing extras key. 167 * 168 * @throws Exception 169 */ 170 @MediumTest 171 public void testCsUpdateExisting() throws Exception { 172 // Get a call up and running. 173 IdPair ids = startAndMakeActiveIncomingCall("650-555-1212", 174 mPhoneAccountA0.getAccountHandle(), mConnectionServiceFixtureA); 175 176 Connection connection = mConnectionServiceFixtureA.mLatestConnection; 177 178 // Communicate extras from the ConnectionService to the InCallService. 179 Bundle extras = new Bundle(); 180 extras.putString(EXTRA_KEY_STR, EXTRA_VALUE_STR); 181 extras.putInt(EXTRA_KEY_INT, EXTRA_VALUE_INT); 182 connection.putExtras(extras); 183 mInCallServiceFixtureX.waitForUpdate(); 184 assertTrue( 185 mInCallServiceFixtureX.getCall(ids.mCallId).getExtras().containsKey(EXTRA_KEY_STR)); 186 assertTrue( 187 mInCallServiceFixtureX.getCall(ids.mCallId).getExtras().containsKey(EXTRA_KEY_INT)); 188 189 connection.putExtra(EXTRA_KEY_STR, EXTRA_VALUE2_STR); 190 mInCallServiceFixtureX.waitForUpdate(); 191 assertEquals(EXTRA_VALUE2_STR, 192 mInCallServiceFixtureX.getCall(ids.mCallId).getExtras().getString(EXTRA_KEY_STR)); 193 assertTrue( 194 mInCallServiceFixtureX.getCall(ids.mCallId).getExtras().containsKey(EXTRA_KEY_INT)); 195 } 196 197 /** 198 * Tests ability of the deprecated setExtras method to detect changes to the extras bundle 199 * and merge these changes into the telecom extras. The old setExtras worked by just replacing 200 * the entire extras bundle, so we need to ensure that we can properly handle cases where an 201 * API user has added or removed items from the extras, but still gracefully merge this into the 202 * extras maintained for the connection. 203 * 204 * @throws Exception 205 */ 206 @MediumTest 207 public void testCsSetExtras() throws Exception { 208 // Get a call up and running. 209 IdPair ids = startAndMakeActiveIncomingCall("650-555-1212", 210 mPhoneAccountA0.getAccountHandle(), mConnectionServiceFixtureA); 211 212 Connection connection = mConnectionServiceFixtureA.mLatestConnection; 213 214 // Set the initial bundle. 215 Bundle extras = new Bundle(); 216 extras.putString(EXTRA_KEY_STR, EXTRA_VALUE_STR); 217 extras.putInt(EXTRA_KEY_INT, EXTRA_VALUE_INT); 218 connection.setExtras(extras); 219 mInCallServiceFixtureX.waitForUpdate(); 220 assertTrue( 221 mInCallServiceFixtureX.getCall(ids.mCallId).getExtras().containsKey(EXTRA_KEY_STR)); 222 assertTrue( 223 mInCallServiceFixtureX.getCall(ids.mCallId).getExtras().containsKey(EXTRA_KEY_INT)); 224 225 // Modify the initial bundle to add a value and remove another. 226 extras.putString(EXTRA_KEY_STR2, EXTRA_VALUE2_STR); 227 extras.remove(EXTRA_KEY_STR); 228 connection.setExtras(extras); 229 mInCallServiceFixtureX.waitForUpdate(); 230 assertFalse( 231 mInCallServiceFixtureX.getCall(ids.mCallId).getExtras().containsKey(EXTRA_KEY_STR)); 232 assertTrue( 233 mInCallServiceFixtureX.getCall(ids.mCallId).getExtras().containsKey(EXTRA_KEY_INT)); 234 assertTrue( 235 mInCallServiceFixtureX.getCall(ids.mCallId).getExtras() 236 .containsKey(EXTRA_KEY_STR2)); 237 } 238 239 /** 240 * Tests that additions to the extras via an {@link InCallService} are propagated back down to 241 * the {@link Connection}. 242 * 243 * @throws Exception 244 */ 245 @MediumTest 246 public void testICSPutExtras() throws Exception { 247 Bundle extras = new Bundle(); 248 extras.putString(EXTRA_KEY_STR, EXTRA_VALUE_STR); 249 extras.putInt(EXTRA_KEY_INT, EXTRA_VALUE_INT); 250 251 // Get a call up and running. 252 IdPair ids = startAndMakeActiveIncomingCall("650-555-1212", 253 mPhoneAccountA0.getAccountHandle(), mConnectionServiceFixtureA); 254 mInCallServiceFixtureX.mInCallAdapter.putExtras(ids.mCallId, extras); 255 mConnectionServiceFixtureA.waitForExtras(); 256 257 Connection connection = mConnectionServiceFixtureA.mLatestConnection; 258 assertNotNull(connection); 259 Bundle connectionExtras = connection.getExtras(); 260 assertTrue(connectionExtras.containsKey(EXTRA_KEY_STR)); 261 assertEquals(EXTRA_VALUE_STR, extras.getString(EXTRA_KEY_STR)); 262 assertTrue(connectionExtras.containsKey(EXTRA_KEY_INT)); 263 assertEquals(EXTRA_VALUE_INT, extras.getInt(EXTRA_KEY_INT)); 264 } 265 266 /** 267 * A bi-directional test of the extras. Tests setting extras from both the ConnectionService 268 * and InCall side and ensuring the bundles are merged appropriately. 269 * 270 * @throws Exception 271 */ 272 @LargeTest 273 public void testExtrasBidirectional() throws Exception { 274 // Get a call up and running. 275 IdPair ids = startAndMakeActiveIncomingCall("650-555-1212", 276 mPhoneAccountA0.getAccountHandle(), mConnectionServiceFixtureA); 277 278 Connection connection = mConnectionServiceFixtureA.mLatestConnection; 279 280 // Set the initial bundle. 281 Bundle someExtras = new Bundle(); 282 someExtras.putString(EXTRA_KEY_STR, EXTRA_VALUE_STR); 283 someExtras.putInt(EXTRA_KEY_INT, EXTRA_VALUE_INT); 284 connection.setExtras(someExtras); 285 mInCallServiceFixtureX.waitForUpdate(); 286 assertTrue( 287 mInCallServiceFixtureX.getCall(ids.mCallId).getExtras().containsKey(EXTRA_KEY_STR)); 288 assertTrue( 289 mInCallServiceFixtureX.getCall(ids.mCallId).getExtras().containsKey(EXTRA_KEY_INT)); 290 291 // From the InCall side, add another key 292 Bundle someMoreExtras = new Bundle(); 293 someMoreExtras.putBoolean(EXTRA_KEY_BOOL, true); 294 mInCallServiceFixtureX.mInCallAdapter.putExtras(ids.mCallId, someMoreExtras); 295 mConnectionServiceFixtureA.waitForExtras(); 296 Bundle connectionExtras = connection.getExtras(); 297 assertTrue(connectionExtras.containsKey(EXTRA_KEY_STR)); 298 assertTrue(connectionExtras.containsKey(EXTRA_KEY_INT)); 299 assertTrue(connectionExtras.containsKey(EXTRA_KEY_BOOL)); 300 301 // Modify the initial bundle to add a value and remove another. 302 someExtras.putString(EXTRA_KEY_STR2, EXTRA_VALUE2_STR); 303 someExtras.remove(EXTRA_KEY_STR); 304 connection.setExtras(someExtras); 305 mInCallServiceFixtureX.waitForUpdate(); 306 assertFalse( 307 mInCallServiceFixtureX.getCall(ids.mCallId).getExtras().containsKey(EXTRA_KEY_STR)); 308 assertTrue( 309 mInCallServiceFixtureX.getCall(ids.mCallId).getExtras().containsKey(EXTRA_KEY_INT)); 310 assertTrue( 311 mInCallServiceFixtureX.getCall(ids.mCallId).getExtras() 312 .containsKey(EXTRA_KEY_STR2)); 313 assertTrue( 314 mInCallServiceFixtureX.getCall(ids.mCallId).getExtras() 315 .containsKey(EXTRA_KEY_BOOL)); 316 } 317 318 /** 319 * Similar to {@link #testCsSetExtras()}, tests to ensure the existing setExtras functionality 320 * is maintained. 321 * 322 * @throws Exception 323 */ 324 @LargeTest 325 public void testConferenceSetExtras() throws Exception { 326 ParcelableCall call = makeConferenceCall(); 327 String conferenceId = call.getId(); 328 329 Conference conference = mConnectionServiceFixtureA.mLatestConference; 330 assertNotNull(conference); 331 332 Bundle someExtras = new Bundle(); 333 someExtras.putString(EXTRA_KEY_STR, EXTRA_VALUE_STR); 334 someExtras.putInt(EXTRA_KEY_INT, EXTRA_VALUE_INT); 335 conference.setExtras(someExtras); 336 337 mInCallServiceFixtureX.waitForUpdate(); 338 assertTrue( 339 mInCallServiceFixtureX.getCall(conferenceId).getExtras() 340 .containsKey(EXTRA_KEY_STR)); 341 assertTrue( 342 mInCallServiceFixtureX.getCall(conferenceId).getExtras() 343 .containsKey(EXTRA_KEY_INT)); 344 345 someExtras.putString(EXTRA_KEY_STR2, EXTRA_VALUE2_STR); 346 someExtras.remove(EXTRA_KEY_INT); 347 conference.setExtras(someExtras); 348 349 mInCallServiceFixtureX.waitForUpdate(); 350 assertTrue( 351 mInCallServiceFixtureX.getCall(conferenceId).getExtras() 352 .containsKey(EXTRA_KEY_STR)); 353 assertFalse( 354 mInCallServiceFixtureX.getCall(conferenceId).getExtras() 355 .containsKey(EXTRA_KEY_INT)); 356 assertTrue( 357 mInCallServiceFixtureX.getCall(conferenceId).getExtras() 358 .containsKey(EXTRA_KEY_STR2)); 359 } 360 361 /** 362 * Tests putExtras for conferences. 363 * 364 * @throws Exception 365 */ 366 @LargeTest 367 public void testConferenceExtraOperations() throws Exception { 368 ParcelableCall call = makeConferenceCall(); 369 String conferenceId = call.getId(); 370 Conference conference = mConnectionServiceFixtureA.mLatestConference; 371 assertNotNull(conference); 372 373 conference.putExtra(EXTRA_KEY_STR, EXTRA_VALUE_STR); 374 conference.putExtra(EXTRA_KEY_INT, EXTRA_VALUE_INT); 375 conference.putExtra(EXTRA_KEY_BOOL, true); 376 mInCallServiceFixtureX.waitForUpdate(); 377 378 assertTrue(mInCallServiceFixtureX.getCall(conferenceId).getExtras() 379 .containsKey(EXTRA_KEY_STR)); 380 assertEquals(EXTRA_VALUE_STR, 381 mInCallServiceFixtureX.getCall(conferenceId).getExtras().get(EXTRA_KEY_STR)); 382 assertTrue( 383 mInCallServiceFixtureX.getCall(conferenceId).getExtras() 384 .containsKey(EXTRA_KEY_INT)); 385 assertEquals(EXTRA_VALUE_INT, 386 mInCallServiceFixtureX.getCall(conferenceId).getExtras().get(EXTRA_KEY_INT)); 387 assertEquals(true, 388 mInCallServiceFixtureX.getCall(conferenceId).getExtras().get(EXTRA_KEY_BOOL)); 389 390 conference.removeExtras(new ArrayList<String>(Arrays.asList(EXTRA_KEY_STR))); 391 mInCallServiceFixtureX.waitForUpdate(); 392 assertFalse(mInCallServiceFixtureX.getCall(conferenceId).getExtras() 393 .containsKey(EXTRA_KEY_STR)); 394 } 395 396 /** 397 * Tests communication of extras from an InCallService to a Conference. 398 * 399 * @throws Exception 400 */ 401 @LargeTest 402 public void testConferenceICS() throws Exception { 403 ParcelableCall call = makeConferenceCall(); 404 String conferenceId = call.getId(); 405 Conference conference = mConnectionServiceFixtureA.mLatestConference; 406 407 Bundle someExtras = new Bundle(); 408 someExtras.putString(EXTRA_KEY_STR, EXTRA_VALUE_STR); 409 mInCallServiceFixtureX.mInCallAdapter.putExtras(conferenceId, someExtras); 410 mConnectionServiceFixtureA.waitForExtras(); 411 412 Bundle conferenceExtras = conference.getExtras(); 413 assertTrue(conferenceExtras.containsKey(EXTRA_KEY_STR)); 414 415 Bundle someMoreExtras = new Bundle(); 416 someMoreExtras.putString(EXTRA_KEY_STR2, EXTRA_VALUE_STR); 417 someMoreExtras.putInt(EXTRA_KEY_INT, EXTRA_VALUE_INT); 418 someMoreExtras.putBoolean(EXTRA_KEY_BOOL, true); 419 mInCallServiceFixtureX.mInCallAdapter.putExtras(conferenceId, someMoreExtras); 420 mConnectionServiceFixtureA.waitForExtras(); 421 conferenceExtras = conference.getExtras(); 422 assertTrue(conferenceExtras.containsKey(EXTRA_KEY_STR)); 423 assertTrue(conferenceExtras.containsKey(EXTRA_KEY_STR2)); 424 assertTrue(conferenceExtras.containsKey(EXTRA_KEY_INT)); 425 assertTrue(conferenceExtras.containsKey(EXTRA_KEY_BOOL)); 426 427 mInCallServiceFixtureX.mInCallAdapter.removeExtras(conferenceId, 428 new ArrayList<String>(Arrays.asList(EXTRA_KEY_STR))); 429 mConnectionServiceFixtureA.waitForExtras(); 430 conferenceExtras = conference.getExtras(); 431 assertFalse(conferenceExtras.containsKey(EXTRA_KEY_STR)); 432 } 433 } 434