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
17package com.android.ims;
18
19import android.content.Context;
20import android.os.RemoteException;
21import android.telephony.Rlog;
22
23import com.android.ims.ImsConfigListener;
24import com.android.ims.ImsReasonInfo;
25import 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 */
35public 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