1 /* 2 * Copyright (c) 2014 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.ims; 18 19 import android.content.Context; 20 import android.os.RemoteException; 21 import android.telephony.Rlog; 22 23 import com.android.ims.ImsConfigListener; 24 import com.android.ims.ImsReasonInfo; 25 import com.android.ims.internal.IImsConfig; 26 27 /** 28 * Provides APIs to get/set the IMS service feature/capability/parameters. 29 * The config items include: 30 * 1) Items provisioned by the operator. 31 * 2) Items configured by user. Mainly service feature class. 32 * 33 * @hide 34 */ 35 public class ImsConfig { 36 private static final String TAG = "ImsConfig"; 37 private boolean DBG = true; 38 private final IImsConfig miConfig; 39 private Context mContext; 40 41 /** 42 * Broadcast action: the feature enable status was changed 43 * 44 * @hide 45 */ 46 public static final String ACTION_IMS_FEATURE_CHANGED = 47 "com.android.intent.action.IMS_FEATURE_CHANGED"; 48 49 /** 50 * Broadcast action: the configuration was changed 51 * 52 * @hide 53 */ 54 public static final String ACTION_IMS_CONFIG_CHANGED = 55 "com.android.intent.action.IMS_CONFIG_CHANGED"; 56 57 /** 58 * Extra parameter "item" of intent ACTION_IMS_FEATURE_CHANGED and ACTION_IMS_CONFIG_CHANGED. 59 * It is the value of FeatureConstants or ConfigConstants. 60 * 61 * @hide 62 */ 63 public static final String EXTRA_CHANGED_ITEM = "item"; 64 65 /** 66 * Extra parameter "value" of intent ACTION_IMS_FEATURE_CHANGED and ACTION_IMS_CONFIG_CHANGED. 67 * It is the new value of "item". 68 * 69 * @hide 70 */ 71 public static final String EXTRA_NEW_VALUE = "value"; 72 73 /** 74 * Defines IMS service/capability feature constants. 75 */ 76 public static class FeatureConstants { 77 public static final int FEATURE_TYPE_UNKNOWN = -1; 78 79 /** 80 * FEATURE_TYPE_VOLTE supports features defined in 3GPP and 81 * GSMA IR.92 over LTE. 82 */ 83 public static final int FEATURE_TYPE_VOICE_OVER_LTE = 0; 84 85 /** 86 * FEATURE_TYPE_LVC supports features defined in 3GPP and 87 * GSMA IR.94 over LTE. 88 */ 89 public static final int FEATURE_TYPE_VIDEO_OVER_LTE = 1; 90 91 /** 92 * FEATURE_TYPE_VOICE_OVER_WIFI supports features defined in 3GPP and 93 * GSMA IR.92 over WiFi. 94 */ 95 public static final int FEATURE_TYPE_VOICE_OVER_WIFI = 2; 96 97 /** 98 * FEATURE_TYPE_VIDEO_OVER_WIFI supports features defined in 3GPP and 99 * GSMA IR.94 over WiFi. 100 */ 101 public static final int FEATURE_TYPE_VIDEO_OVER_WIFI = 3; 102 103 /** 104 * FEATURE_TYPE_UT supports features defined in 3GPP and 105 * GSMA IR.92 over LTE. 106 */ 107 public static final int FEATURE_TYPE_UT_OVER_LTE = 4; 108 109 /** 110 * FEATURE_TYPE_UT_OVER_WIFI supports features defined in 3GPP and 111 * GSMA IR.92 over WiFi. 112 */ 113 public static final int FEATURE_TYPE_UT_OVER_WIFI = 5; 114 } 115 116 /** 117 * Defines IMS service/capability parameters. 118 */ 119 public static class ConfigConstants { 120 121 // Define IMS config items 122 public static final int CONFIG_START = 0; 123 124 // Define operator provisioned config items 125 public static final int PROVISIONED_CONFIG_START = CONFIG_START; 126 127 /** 128 * AMR CODEC Mode Value set, 0-7 in comma separated sequence. 129 * Value is in String format. 130 */ 131 public static final int VOCODER_AMRMODESET = CONFIG_START; 132 133 /** 134 * Wide Band AMR CODEC Mode Value set,0-7 in comma separated sequence. 135 * Value is in String format. 136 */ 137 public static final int VOCODER_AMRWBMODESET = 1; 138 139 /** 140 * SIP Session Timer value (seconds). 141 * Value is in Integer format. 142 */ 143 public static final int SIP_SESSION_TIMER = 2; 144 145 /** 146 * Minimum SIP Session Expiration Timer in (seconds). 147 * Value is in Integer format. 148 */ 149 public static final int MIN_SE = 3; 150 151 /** 152 * SIP_INVITE cancellation time out value (in milliseconds). Integer format. 153 * Value is in Integer format. 154 */ 155 public static final int CANCELLATION_TIMER = 4; 156 157 /** 158 * Delay time when an iRAT transition from eHRPD/HRPD/1xRTT to LTE. 159 * Value is in Integer format. 160 */ 161 public static final int TDELAY = 5; 162 163 /** 164 * Silent redial status of Enabled (True), or Disabled (False). 165 * Value is in Integer format. 166 */ 167 public static final int SILENT_REDIAL_ENABLE = 6; 168 169 /** 170 * SIP T1 timer value in milliseconds. See RFC 3261 for define. 171 * Value is in Integer format. 172 */ 173 public static final int SIP_T1_TIMER = 7; 174 175 /** 176 * SIP T2 timer value in milliseconds. See RFC 3261 for define. 177 * Value is in Integer format. 178 */ 179 public static final int SIP_T2_TIMER = 8; 180 181 /** 182 * SIP TF timer value in milliseconds. See RFC 3261 for define. 183 * Value is in Integer format. 184 */ 185 public static final int SIP_TF_TIMER = 9; 186 187 /** 188 * VoLTE status for VLT/s status of Enabled (1), or Disabled (0). 189 * Value is in Integer format. 190 */ 191 public static final int VLT_SETTING_ENABLED = 10; 192 193 /** 194 * VoLTE status for LVC/s status of Enabled (1), or Disabled (0). 195 * Value is in Integer format. 196 */ 197 public static final int LVC_SETTING_ENABLED = 11; 198 /** 199 * Domain Name for the device to populate the request URI for REGISTRATION. 200 * Value is in String format. 201 */ 202 public static final int DOMAIN_NAME = 12; 203 /** 204 * Device Outgoing SMS based on either 3GPP or 3GPP2 standards. 205 * Value is in Integer format. 3GPP2(0), 3GPP(1) 206 */ 207 public static final int SMS_FORMAT = 13; 208 /** 209 * Turns IMS ON/OFF on the device. 210 * Value is in Integer format. ON (1), OFF(0). 211 */ 212 public static final int SMS_OVER_IP = 14; 213 /** 214 * Requested expiration for Published Online availability. 215 * Value is in Integer format. 216 */ 217 public static final int PUBLISH_TIMER = 15; 218 /** 219 * Requested expiration for Published Offline availability. 220 * Value is in Integer format. 221 */ 222 public static final int PUBLISH_TIMER_EXTENDED = 16; 223 /** 224 * 225 * Value is in Integer format. 226 */ 227 public static final int CAPABILITY_DISCOVERY_ENABLED = 17; 228 /** 229 * Period of time the capability information of the contact is cached on handset. 230 * Value is in Integer format. 231 */ 232 public static final int CAPABILITIES_CACHE_EXPIRATION = 18; 233 /** 234 * Peiod of time the availability information of a contact is cached on device. 235 * Value is in Integer format. 236 */ 237 public static final int AVAILABILITY_CACHE_EXPIRATION = 19; 238 /** 239 * Interval between successive capabilities polling. 240 * Value is in Integer format. 241 */ 242 public static final int CAPABILITIES_POLL_INTERVAL = 20; 243 /** 244 * Minimum time between two published messages from the device. 245 * Value is in Integer format. 246 */ 247 public static final int SOURCE_THROTTLE_PUBLISH = 21; 248 /** 249 * The Maximum number of MDNs contained in one Request Contained List. 250 * Value is in Integer format. 251 */ 252 public static final int MAX_NUMENTRIES_IN_RCL = 22; 253 /** 254 * Expiration timer for subscription of a Request Contained List, used in capability polling. 255 * Value is in Integer format. 256 */ 257 public static final int CAPAB_POLL_LIST_SUB_EXP = 23; 258 /** 259 * Applies compression to LIST Subscription. 260 * Value is in Integer format. Enable (1), Disable(0). 261 */ 262 public static final int GZIP_FLAG = 24; 263 /** 264 * VOLTE Status for EAB/s status of Enabled (1), or Disabled (0). 265 * Value is in Integer format. 266 */ 267 public static final int EAB_SETTING_ENABLED = 25; 268 /** 269 * Wi-Fi calling roaming status. 270 * Value is in Integer format. ON (1), OFF(0). 271 */ 272 public static final int VOICE_OVER_WIFI_ROAMING = 26; 273 /** 274 * Wi-Fi calling modem - WfcModeFeatureValueConstants. 275 * Value is in Integer format. 276 */ 277 public static final int VOICE_OVER_WIFI_MODE = 27; 278 /** 279 * VOLTE Status for voice over wifi status of Enabled (1), or Disabled (0). 280 * Value is in Integer format. 281 */ 282 public static final int VOICE_OVER_WIFI_SETTING_ENABLED = 28; 283 /** 284 * Mobile data enabled. 285 * Value is in Integer format. On (1), OFF(0). 286 */ 287 public static final int MOBILE_DATA_ENABLED = 29; 288 /** 289 * VoLTE user opted in status. 290 * Value is in Integer format. Opted-in (1) Opted-out (0). 291 */ 292 public static final int VOLTE_USER_OPT_IN_STATUS = 30; 293 /** 294 * Proxy for Call Session Control Function(P-CSCF) address for Local-BreakOut(LBO). 295 * Value is in String format. 296 */ 297 public static final int LBO_PCSCF_ADDRESS = 31; 298 /** 299 * Keep Alive Enabled for SIP. 300 * Value is in Integer format. On(1), OFF(0). 301 */ 302 public static final int KEEP_ALIVE_ENABLED = 32; 303 /** 304 * Registration retry Base Time value in seconds. 305 * Value is in Integer format. 306 */ 307 public static final int REGISTRATION_RETRY_BASE_TIME_SEC = 33; 308 /** 309 * Registration retry Max Time value in seconds. 310 * Value is in Integer format. 311 */ 312 public static final int REGISTRATION_RETRY_MAX_TIME_SEC = 34; 313 /** 314 * Smallest RTP port for speech codec. 315 * Value is in integer format. 316 */ 317 public static final int SPEECH_START_PORT = 35; 318 /** 319 * Largest RTP port for speech code. 320 * Value is in Integer format. 321 */ 322 public static final int SPEECH_END_PORT = 36; 323 /** 324 * SIP Timer A's value in milliseconds. Timer A is the INVITE request 325 * retransmit interval, for UDP only. 326 * Value is in Integer format. 327 */ 328 public static final int SIP_INVITE_REQ_RETX_INTERVAL_MSEC = 37; 329 /** 330 * SIP Timer B's value in milliseconds. Timer B is the wait time for 331 * INVITE message to be acknowledged. 332 * Value is in Integer format. 333 */ 334 public static final int SIP_INVITE_RSP_WAIT_TIME_MSEC = 38; 335 /** 336 * SIP Timer D's value in milliseconds. Timer D is the wait time for 337 * response retransmits of the invite client transactions. 338 * Value is in Integer format. 339 */ 340 public static final int SIP_INVITE_RSP_RETX_WAIT_TIME_MSEC = 39; 341 /** 342 * SIP Timer E's value in milliseconds. Timer E is the value Non-INVITE 343 * request retransmit interval, for UDP only. 344 * Value is in Integer format. 345 */ 346 public static final int SIP_NON_INVITE_REQ_RETX_INTERVAL_MSEC = 40; 347 /** 348 * SIP Timer F's value in milliseconds. Timer F is the Non-INVITE transaction 349 * timeout timer. 350 * Value is in Integer format. 351 */ 352 public static final int SIP_NON_INVITE_TXN_TIMEOUT_TIMER_MSEC = 41; 353 /** 354 * SIP Timer G's value in milliseconds. Timer G is the value of INVITE response 355 * retransmit interval. 356 * Value is in Integer format. 357 */ 358 public static final int SIP_INVITE_RSP_RETX_INTERVAL_MSEC = 42; 359 /** 360 * SIP Timer H's value in milliseconds. Timer H is the value of wait time for 361 * ACK receipt. 362 * Value is in Integer format. 363 */ 364 public static final int SIP_ACK_RECEIPT_WAIT_TIME_MSEC = 43; 365 /** 366 * SIP Timer I's value in milliseconds. Timer I is the value of wait time for 367 * ACK retransmits. 368 * Value is in Integer format. 369 */ 370 public static final int SIP_ACK_RETX_WAIT_TIME_MSEC = 44; 371 /** 372 * SIP Timer J's value in milliseconds. Timer J is the value of wait time for 373 * non-invite request retransmission. 374 * Value is in Integer format. 375 */ 376 public static final int SIP_NON_INVITE_REQ_RETX_WAIT_TIME_MSEC = 45; 377 /** 378 * SIP Timer K's value in milliseconds. Timer K is the value of wait time for 379 * non-invite response retransmits. 380 * Value is in Integer format. 381 */ 382 public static final int SIP_NON_INVITE_RSP_RETX_WAIT_TIME_MSEC = 46; 383 /** 384 * AMR WB octet aligned dynamic payload type. 385 * Value is in Integer format. 386 */ 387 public static final int AMR_WB_OCTET_ALIGNED_PT = 47; 388 /** 389 * AMR WB bandwidth efficient payload type. 390 * Value is in Integer format. 391 */ 392 public static final int AMR_WB_BANDWIDTH_EFFICIENT_PT = 48; 393 /** 394 * AMR octet aligned dynamic payload type. 395 * Value is in Integer format. 396 */ 397 public static final int AMR_OCTET_ALIGNED_PT = 49; 398 /** 399 * AMR bandwidth efficient payload type. 400 * Value is in Integer format. 401 */ 402 public static final int AMR_BANDWIDTH_EFFICIENT_PT = 50; 403 /** 404 * DTMF WB payload type. 405 * Value is in Integer format. 406 */ 407 public static final int DTMF_WB_PT = 51; 408 /** 409 * DTMF NB payload type. 410 * Value is in Integer format. 411 */ 412 public static final int DTMF_NB_PT = 52; 413 /** 414 * AMR Default encoding mode. 415 * Value is in Integer format. 416 */ 417 public static final int AMR_DEFAULT_MODE = 53; 418 /** 419 * SMS Public Service Identity. 420 * Value is in String format. 421 */ 422 public static final int SMS_PSI = 54; 423 /** 424 * Video Quality - VideoQualityFeatureValuesConstants. 425 * Value is in Integer format. 426 */ 427 public static final int VIDEO_QUALITY = 55; 428 /** 429 * LTE threshold. 430 * Handover from LTE to WiFi if LTE < THLTE1 and WiFi >= VOWT_A. 431 */ 432 public static final int TH_LTE1 = 56; 433 /** 434 * LTE threshold. 435 * Handover from WiFi to LTE if LTE >= THLTE3 or (WiFi < VOWT_B and LTE >= THLTE2). 436 */ 437 public static final int TH_LTE2 = 57; 438 /** 439 * LTE threshold. 440 * Handover from WiFi to LTE if LTE >= THLTE3 or (WiFi < VOWT_B and LTE >= THLTE2). 441 */ 442 public static final int TH_LTE3 = 58; 443 /** 444 * 1x threshold. 445 * Handover from 1x to WiFi if 1x < TH1x 446 */ 447 public static final int TH_1x = 59; 448 /** 449 * WiFi threshold. 450 * Handover from LTE to WiFi if LTE < THLTE1 and WiFi >= VOWT_A. 451 */ 452 public static final int VOWT_A = 60; 453 /** 454 * WiFi threshold. 455 * Handover from WiFi to LTE if LTE >= THLTE3 or (WiFi < VOWT_B and LTE >= THLTE2). 456 */ 457 public static final int VOWT_B = 61; 458 /** 459 * LTE ePDG timer. 460 * Device shall not handover back to LTE until the T_ePDG_LTE timer expires. 461 */ 462 public static final int T_EPDG_LTE = 62; 463 /** 464 * WiFi ePDG timer. 465 * Device shall not handover back to WiFi until the T_ePDG_WiFi timer expires. 466 */ 467 public static final int T_EPDG_WIFI = 63; 468 /** 469 * 1x ePDG timer. 470 * Device shall not re-register on 1x until the T_ePDG_1x timer expires. 471 */ 472 public static final int T_EPDG_1X = 64; 473 /** 474 * MultiEndpoint status: Enabled (1), or Disabled (0). 475 * Value is in Integer format. 476 */ 477 public static final int VICE_SETTING_ENABLED = 65; 478 479 // Expand the operator config items as needed here, need to change 480 // PROVISIONED_CONFIG_END after that. 481 public static final int PROVISIONED_CONFIG_END = VICE_SETTING_ENABLED; 482 483 // Expand the operator config items as needed here. 484 } 485 486 /** 487 * Defines IMS set operation status. 488 */ 489 public static class OperationStatusConstants { 490 public static final int UNKNOWN = -1; 491 public static final int SUCCESS = 0; 492 public static final int FAILED = 1; 493 public static final int UNSUPPORTED_CAUSE_NONE = 2; 494 public static final int UNSUPPORTED_CAUSE_RAT = 3; 495 public static final int UNSUPPORTED_CAUSE_DISABLED = 4; 496 } 497 498 /** 499 * Defines IMS get operation values. 500 */ 501 public static class OperationValuesConstants { 502 /** 503 * Values related to Video Quality 504 */ 505 public static final int VIDEO_QUALITY_UNKNOWN = -1; 506 public static final int VIDEO_QUALITY_LOW = 0; 507 public static final int VIDEO_QUALITY_HIGH = 1; 508 } 509 510 /** 511 * Defines IMS video quality feature value. 512 */ 513 public static class VideoQualityFeatureValuesConstants { 514 public static final int LOW = 0; 515 public static final int HIGH = 1; 516 } 517 518 /** 519 * Defines IMS feature value. 520 */ 521 public static class FeatureValueConstants { 522 public static final int OFF = 0; 523 public static final int ON = 1; 524 } 525 526 /** 527 * Defines IMS feature value. 528 */ 529 public static class WfcModeFeatureValueConstants { 530 public static final int WIFI_ONLY = 0; 531 public static final int CELLULAR_PREFERRED = 1; 532 public static final int WIFI_PREFERRED = 2; 533 } 534 535 public ImsConfig(IImsConfig iconfig, Context context) { 536 if (DBG) Rlog.d(TAG, "ImsConfig creates"); 537 miConfig = iconfig; 538 mContext = context; 539 } 540 541 /** 542 * Gets the provisioned value for IMS service/capabilities parameters used by IMS stack. 543 * This function should not be called from the mainthread as it could block the 544 * mainthread. 545 * 546 * @param item, as defined in com.android.ims.ImsConfig#ConfigConstants. 547 * @return the value in Integer format. 548 * 549 * @throws ImsException if calling the IMS service results in an error. 550 */ 551 public int getProvisionedValue(int item) throws ImsException { 552 int ret = 0; 553 try { 554 ret = miConfig.getProvisionedValue(item); 555 } catch (RemoteException e) { 556 throw new ImsException("getValue()", e, 557 ImsReasonInfo.CODE_LOCAL_SERVICE_UNAVAILABLE); 558 } 559 if (DBG) Rlog.d(TAG, "getProvisionedValue(): item = " + item + ", ret =" + ret); 560 561 return ret; 562 } 563 564 /** 565 * Gets the provisioned value for IMS service/capabilities parameters used by IMS stack. 566 * This function should not be called from the mainthread as it could block the 567 * mainthread. 568 * 569 * @param item, as defined in com.android.ims.ImsConfig#ConfigConstants. 570 * @return value in String format. 571 * 572 * @throws ImsException if calling the IMS service results in an error. 573 */ 574 public String getProvisionedStringValue(int item) throws ImsException { 575 String ret = "Unknown"; 576 try { 577 ret = miConfig.getProvisionedStringValue(item); 578 } catch (RemoteException e) { 579 throw new ImsException("getProvisionedStringValue()", e, 580 ImsReasonInfo.CODE_LOCAL_SERVICE_UNAVAILABLE); 581 } 582 if (DBG) Rlog.d(TAG, "getProvisionedStringValue(): item = " + item + ", ret =" + ret); 583 584 return ret; 585 } 586 587 /** 588 * Sets the value for IMS service/capabilities parameters by 589 * the operator device management entity. 590 * This function should not be called from main thread as it could block 591 * mainthread. 592 * 593 * @param item, as defined in com.android.ims.ImsConfig#ConfigConstants. 594 * @param value in Integer format. 595 * @return as defined in com.android.ims.ImsConfig#OperationStatusConstants 596 * 597 * @throws ImsException if calling the IMS service results in an error. 598 */ 599 public int setProvisionedValue(int item, int value) 600 throws ImsException { 601 int ret = ImsConfig.OperationStatusConstants.UNKNOWN; 602 if (DBG) { 603 Rlog.d(TAG, "setProvisionedValue(): item = " + item + 604 "value = " + value); 605 } 606 try { 607 ret = miConfig.setProvisionedValue(item, value); 608 } catch (RemoteException e) { 609 throw new ImsException("setProvisionedValue()", e, 610 ImsReasonInfo.CODE_LOCAL_SERVICE_UNAVAILABLE); 611 } 612 if (DBG) { 613 Rlog.d(TAG, "setProvisionedValue(): item = " + item + 614 " value = " + value + " ret = " + ret); 615 } 616 return ret; 617 } 618 619 /** 620 * Sets the value for IMS service/capabilities parameters by 621 * the operator device management entity. 622 * This function should not be called from main thread as it could block 623 * mainthread. 624 * 625 * @param item, as defined in com.android.ims.ImsConfig#ConfigConstants. 626 * @param value in String format. 627 * @return as defined in com.android.ims.ImsConfig#OperationStatusConstants 628 * 629 * @throws ImsException if calling the IMS service results in an error. 630 */ 631 public int setProvisionedStringValue(int item, String value) 632 throws ImsException { 633 int ret = ImsConfig.OperationStatusConstants.UNKNOWN; 634 try { 635 ret = miConfig.setProvisionedStringValue(item, value); 636 } catch (RemoteException e) { 637 throw new ImsException("setProvisionedStringValue()", e, 638 ImsReasonInfo.CODE_LOCAL_SERVICE_UNAVAILABLE); 639 } 640 if (DBG) { 641 Rlog.d(TAG, "setProvisionedStringValue(): item = " + item + 642 ", value =" + value); 643 } 644 return ret; 645 } 646 647 /** 648 * Gets the value for IMS feature item for specified network type. 649 * 650 * @param feature, defined as in FeatureConstants. 651 * @param network, defined as in android.telephony.TelephonyManager#NETWORK_TYPE_XXX. 652 * @param listener, provided to be notified for the feature on/off status. 653 * @return void 654 * 655 * @throws ImsException if calling the IMS service results in an error. 656 */ 657 public void getFeatureValue(int feature, int network, 658 ImsConfigListener listener) throws ImsException { 659 if (DBG) { 660 Rlog.d(TAG, "getFeatureValue: feature = " + feature + ", network =" + network + 661 ", listener =" + listener); 662 } 663 try { 664 miConfig.getFeatureValue(feature, network, listener); 665 } catch (RemoteException e) { 666 throw new ImsException("getFeatureValue()", e, 667 ImsReasonInfo.CODE_LOCAL_SERVICE_UNAVAILABLE); 668 } 669 } 670 671 /** 672 * Sets the value for IMS feature item for specified network type. 673 * 674 * @param feature, as defined in FeatureConstants. 675 * @param network, as defined in android.telephony.TelephonyManager#NETWORK_TYPE_XXX. 676 * @param value, as defined in FeatureValueConstants. 677 * @param listener, provided if caller needs to be notified for set result. 678 * @return void 679 * 680 * @throws ImsException if calling the IMS service results in an error. 681 */ 682 public void setFeatureValue(int feature, int network, int value, 683 ImsConfigListener listener) throws ImsException { 684 if (DBG) { 685 Rlog.d(TAG, "setFeatureValue: feature = " + feature + ", network =" + network + 686 ", value =" + value + ", listener =" + listener); 687 } 688 try { 689 miConfig.setFeatureValue(feature, network, value, listener); 690 } catch (RemoteException e) { 691 throw new ImsException("setFeatureValue()", e, 692 ImsReasonInfo.CODE_LOCAL_SERVICE_UNAVAILABLE); 693 } 694 } 695 } 696