b572b18b3f05de0193005af2428d60f671bdfa97
[android/platform/frameworks/opt/net/ims.git] / src / java / com / android / ims / ImsConfig.java
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 }