ImsConfig.java revision e0b0ddebe63d31ea31d48d4d647778b9035b18f0
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 * Provides APIs to get/set the IMS service feature/capability/parameters.
28 * The config items include:
29 * 1) Items provisioned by the operator.
30 * 2) Items configured by user. Mainly service feature class.
31 *
32 * @hide
33 */
34public class ImsConfig {
35    private static final String TAG = "ImsConfig";
36    private boolean DBG = true;
37    private final IImsConfig miConfig;
38    private Context mContext;
39
40    /**
41    * Defines IMS service/capability feature constants.
42    */
43    public static class FeatureConstants {
44        public static final int FEATURE_TYPE_UNKNOWN = -1;
45
46        /**
47         * FEATURE_TYPE_VOLTE supports features defined in 3GPP and
48         * GSMA IR.92 over LTE.
49         */
50        public static final int FEATURE_TYPE_VOICE_OVER_LTE = 0;
51
52        /**
53         * FEATURE_TYPE_LVC supports features defined in 3GPP and
54         * GSMA IR.94 over LTE.
55         */
56        public static final int FEATURE_TYPE_VIDEO_OVER_LTE = 1;
57
58        /**
59         * FEATURE_TYPE_VOICE_OVER_WIFI supports features defined in 3GPP and
60         * GSMA IR.92 over WiFi.
61         */
62        public static final int FEATURE_TYPE_VOICE_OVER_WIFI = 2;
63
64        /**
65         * FEATURE_TYPE_VIDEO_OVER_WIFI supports features defined in 3GPP and
66         * GSMA IR.94 over WiFi.
67         */
68        public static final int FEATURE_TYPE_VIDEO_OVER_WIFI = 3;
69    }
70
71    /**
72    * Defines IMS service/capability parameters.
73    */
74    public static class ConfigConstants {
75
76        // Define IMS config items
77        public static final int CONFIG_START = 0;
78
79        // Define operator provisioned config items
80        public static final int PROVISIONED_CONFIG_START = CONFIG_START;
81
82        /**
83         * AMR CODEC Mode Value set, 0-7 in comma separated sequence.
84         * Value is in String format.
85         */
86        public static final int VOCODER_AMRMODESET = CONFIG_START;
87
88        /**
89         * Wide Band AMR CODEC Mode Value set,0-7 in comma separated sequence.
90         * Value is in String format.
91         */
92        public static final int VOCODER_AMRWBMODESET = 1;
93
94        /**
95         * SIP Session Timer value (seconds).
96         * Value is in Integer format.
97         */
98        public static final int SIP_SESSION_TIMER = 2;
99
100        /**
101         * Minimum SIP Session Expiration Timer in (seconds).
102         * Value is in Integer format.
103         */
104        public static final int MIN_SE = 3;
105
106        /**
107         * SIP_INVITE cancellation time out value (in milliseconds). Integer format.
108         * Value is in Integer format.
109         */
110        public static final int CANCELLATION_TIMER = 4;
111
112        /**
113         * Delay time when an iRAT transition from eHRPD/HRPD/1xRTT to LTE.
114         * Value is in Integer format.
115         */
116        public static final int TDELAY = 5;
117
118        /**
119         * Silent redial status of Enabled (True), or Disabled (False).
120         * Value is in Integer format.
121         */
122        public static final int SILENT_REDIAL_ENABLE = 6;
123
124        /**
125         * SIP T1 timer value in milliseconds. See RFC 3261 for define.
126         * Value is in Integer format.
127         */
128        public static final int SIP_T1_TIMER = 7;
129
130        /**
131         * SIP T2 timer value in milliseconds.  See RFC 3261 for define.
132         * Value is in Integer format.
133         */
134        public static final int SIP_T2_TIMER  = 8;
135
136         /**
137         * SIP TF timer value in milliseconds.  See RFC 3261 for define.
138         * Value is in Integer format.
139         */
140        public static final int SIP_TF_TIMER = 9;
141
142        /**
143         * VoLTE status for VLT/s status of Enabled (1), or Disabled (0).
144         * Value is in Integer format.
145         */
146        public static final int VLT_SETTING_ENABLED = 10;
147
148        /**
149         * VoLTE status for LVC/s status of Enabled (1), or Disabled (0).
150         * Value is in Integer format.
151         */
152        public static final int LVC_SETTING_ENABLED = 11;
153        /**
154         * Domain Name for the device to populate the request URI for REGISTRATION.
155         * Value is in String format.
156         */
157        public static final int DOMAIN_NAME = 12;
158         /**
159         * Device Outgoing SMS based on either 3GPP or 3GPP2 standards.
160         * Value is in Integer format. 3GPP2(0), 3GPP(1)
161         */
162        public static final int SMS_FORMAT = 13;
163         /**
164         * Turns IMS ON/OFF on the device.
165         * Value is in Integer format. ON (1), OFF(0).
166         */
167        public static final int SMS_OVER_IP = 14;
168        /**
169         * Requested expiration for Published Online availability.
170         * Value is in Integer format.
171         */
172        public static final int PUBLISH_TIMER = 15;
173        /**
174         * Requested expiration for Published Offline availability.
175         * Value is in Integer format.
176         */
177        public static final int PUBLISH_TIMER_EXTENDED = 16;
178        /**
179         * Period of time the capability information of the  contact is cached on handset.
180         * Value is in Integer format.
181         */
182        public static final int CAPABILITIES_CACHE_EXPIRATION = 17;
183        /**
184         * Peiod of time the availability information of a contact is cached on device.
185         * Value is in Integer format.
186         */
187        public static final int AVAILABILITY_CACHE_EXPIRATION = 18;
188        /**
189         * Interval between successive capabilities polling.
190         * Value is in Integer format.
191         */
192        public static final int CAPABILITIES_POLL_INTERVAL = 19;
193        /**
194         * Minimum time between two published messages from the device.
195         * Value is in Integer format.
196         */
197        public static final int SOURCE_THROTTLE_PUBLISH = 20;
198        /**
199         * The Maximum number of MDNs contained in one Request Contained List.
200         * Value is in Integer format.
201         */
202        public static final int MAX_NUMENTRIES_IN_RCL = 21;
203        /**
204         * Expiration timer for subscription of a Request Contained List, used in capability polling.
205         * Value is in Integer format.
206         */
207        public static final int CAPAB_POLL_LIST_SUB_EXP = 22;
208        /**
209         * Applies compression to LIST Subscription.
210         * Value is in Integer format. Enable (1), Disable(0).
211         */
212        public static final int GZIP_FLAG = 23;
213        /**
214         * VOLTE Status for EAB/s status of Enabled (1), or Disabled (0).
215         * Value is in Integer format.
216         */
217        public static final int EAB_SETTING_ENABLED = 24;
218        /**
219         * Wi-Fi calling roaming status.
220         * Value is in Integer format. ON (1), OFF(0).
221         */
222        public static final int VOICE_OVER_WIFI_ROAMING = 25;
223        /**
224         * Wi-Fi calling modem - WfcModeFeatureValueConstants.
225         * Value is in Integer format.
226         */
227        public static final int VOICE_OVER_WIFI_MODE = 26;
228
229        // Expand the operator config items as needed here, need to change
230        // PROVISIONED_CONFIG_END after that.
231        public static final int PROVISIONED_CONFIG_END = VOICE_OVER_WIFI_MODE;
232
233        // Expand the operator config items as needed here.
234    }
235
236    /**
237    * Defines IMS set operation status.
238    */
239    public static class OperationStatusConstants {
240        public static final int UNKNOWN = -1;
241        public static final int SUCCESS = 0;
242        public static final int FAILED =  1;
243        public static final int UNSUPPORTED_CAUSE_NONE = 2;
244        public static final int UNSUPPORTED_CAUSE_RAT = 3;
245        public static final int UNSUPPORTED_CAUSE_DISABLED = 4;
246    }
247
248    /**
249     * Defines IMS get operation values.
250     */
251    public static class OperationValuesConstants {
252        /**
253         * Values related to Video Quality
254         */
255        public static final int VIDEO_QUALITY_UNKNOWN = -1;
256        public static final int VIDEO_QUALITY_LOW = 0;
257        public static final int VIDEO_QUALITY_HIGH = 1;
258    }
259
260   /**
261    * Defines IMS feature value.
262    */
263    public static class FeatureValueConstants {
264        public static final int OFF = 0;
265        public static final int ON = 1;
266    }
267
268    /**
269     * Defines IMS feature value.
270     */
271    public static class WfcModeFeatureValueConstants {
272        public static final int WIFI_ONLY = 0;
273        public static final int CELLULAR_PREFERRED = 1;
274        public static final int WIFI_PREFERRED = 2;
275    }
276
277    public ImsConfig(IImsConfig iconfig, Context context) {
278        if (DBG) Rlog.d(TAG, "ImsConfig creates");
279        miConfig = iconfig;
280        mContext = context;
281    }
282
283    /**
284     * Gets the provisioned value for IMS service/capabilities parameters used by IMS stack.
285     * This function should not be called from the mainthread as it could block the
286     * mainthread.
287     *
288     * @param item, as defined in com.android.ims.ImsConfig#ConfigConstants.
289     * @return the value in Integer format.
290     *
291     * @throws ImsException if calling the IMS service results in an error.
292     */
293    public int getProvisionedValue(int item) throws ImsException {
294        int ret = 0;
295        try {
296            ret = miConfig.getProvisionedValue(item);
297        }  catch (RemoteException e) {
298            throw new ImsException("getValue()", e,
299                    ImsReasonInfo.CODE_LOCAL_SERVICE_UNAVAILABLE);
300        }
301        if (DBG) Rlog.d(TAG, "getProvisionedValue(): item = " + item + ", ret =" + ret);
302
303        return ret;
304    }
305
306    /**
307     * Gets the provisioned value for IMS service/capabilities parameters used by IMS stack.
308     * This function should not be called from the mainthread as it could block the
309     * mainthread.
310     *
311     * @param item, as defined in com.android.ims.ImsConfig#ConfigConstants.
312     * @return value in String format.
313     *
314     * @throws ImsException if calling the IMS service results in an error.
315     */
316    public String getProvisionedStringValue(int item) throws ImsException {
317        String ret = "Unknown";
318        try {
319            ret = miConfig.getProvisionedStringValue(item);
320        }  catch (RemoteException e) {
321            throw new ImsException("getProvisionedStringValue()", e,
322                    ImsReasonInfo.CODE_LOCAL_SERVICE_UNAVAILABLE);
323        }
324        if (DBG) Rlog.d(TAG, "getProvisionedStringValue(): item = " + item + ", ret =" + ret);
325
326        return ret;
327    }
328
329    /**
330     * Sets the value for IMS service/capabilities parameters by
331     * the operator device management entity.
332     * This function should not be called from main thread as it could block
333     * mainthread.
334     *
335     * @param item, as defined in com.android.ims.ImsConfig#ConfigConstants.
336     * @param value in Integer format.
337     * @return as defined in com.android.ims.ImsConfig#OperationStatusConstants
338     *
339     * @throws ImsException if calling the IMS service results in an error.
340     */
341    public int setProvisionedValue(int item, int value)
342            throws ImsException {
343        int ret = ImsConfig.OperationStatusConstants.UNKNOWN;
344        if (DBG) {
345            Rlog.d(TAG, "setProvisionedValue(): item = " + item +
346                    "value = " + value);
347        }
348        try {
349            ret = miConfig.setProvisionedValue(item, value);
350        }  catch (RemoteException e) {
351            throw new ImsException("setProvisionedValue()", e,
352                    ImsReasonInfo.CODE_LOCAL_SERVICE_UNAVAILABLE);
353        }
354        if (DBG) {
355            Rlog.d(TAG, "setProvisionedValue(): item = " + item +
356                    " value = " + value + " ret = " + ret);
357        }
358        return ret;
359    }
360
361    /**
362     * Sets the value for IMS service/capabilities parameters by
363     * the operator device management entity.
364     * This function should not be called from main thread as it could block
365     * mainthread.
366     *
367     * @param item, as defined in com.android.ims.ImsConfig#ConfigConstants.
368     * @param value in String format.
369     * @return as defined in com.android.ims.ImsConfig#OperationStatusConstants
370     *
371     * @throws ImsException if calling the IMS service results in an error.
372     */
373    public int setProvisionedStringValue(int item, String value)
374            throws ImsException {
375        int ret = ImsConfig.OperationStatusConstants.UNKNOWN;
376        try {
377            ret = miConfig.setProvisionedStringValue(item, value);
378        }  catch (RemoteException e) {
379            throw new ImsException("setProvisionedStringValue()", e,
380                    ImsReasonInfo.CODE_LOCAL_SERVICE_UNAVAILABLE);
381        }
382        if (DBG) {
383            Rlog.d(TAG, "setProvisionedStringValue(): item = " + item +
384                    ", value =" + value);
385        }
386        return ret;
387    }
388
389    /**
390     * Gets the value for IMS feature item for specified network type.
391     *
392     * @param feature, defined as in FeatureConstants.
393     * @param network, defined as in android.telephony.TelephonyManager#NETWORK_TYPE_XXX.
394     * @param listener, provided to be notified for the feature on/off status.
395     * @return void
396     *
397     * @throws ImsException if calling the IMS service results in an error.
398     */
399    public void getFeatureValue(int feature, int network,
400            ImsConfigListener listener) throws ImsException {
401        if (DBG) {
402            Rlog.d(TAG, "getFeatureValue: feature = " + feature + ", network =" + network +
403                    ", listener =" + listener);
404        }
405        try {
406            miConfig.getFeatureValue(feature, network, listener);
407        } catch (RemoteException e) {
408            throw new ImsException("getFeatureValue()", e,
409                    ImsReasonInfo.CODE_LOCAL_SERVICE_UNAVAILABLE);
410        }
411    }
412
413    /**
414     * Sets the value for IMS feature item for specified network type.
415     *
416     * @param feature, as defined in FeatureConstants.
417     * @param network, as defined in android.telephony.TelephonyManager#NETWORK_TYPE_XXX.
418     * @param value, as defined in FeatureValueConstants.
419     * @param listener, provided if caller needs to be notified for set result.
420     * @return void
421     *
422     * @throws ImsException if calling the IMS service results in an error.
423     */
424    public void setFeatureValue(int feature, int network, int value,
425            ImsConfigListener listener) throws ImsException {
426        if (DBG) {
427            Rlog.d(TAG, "setFeatureValue: feature = " + feature + ", network =" + network +
428                    ", value =" + value + ", listener =" + listener);
429        }
430        try {
431            miConfig.setFeatureValue(feature, network, value, listener);
432        } catch (RemoteException e) {
433            throw new ImsException("setFeatureValue()", e,
434                    ImsReasonInfo.CODE_LOCAL_SERVICE_UNAVAILABLE);
435        }
436    }
437
438    /**
439     * Gets the value for IMS Volte provisioned.
440     * It should be the same as operator provisioned value if applies.
441     *
442     * @return boolean
443     *
444     * @throws ImsException if calling the IMS service results in an error.
445     */
446    public boolean getVolteProvisioned() throws ImsException {
447        try {
448           return miConfig.getVolteProvisioned();
449        } catch (RemoteException e) {
450            throw new ImsException("getVolteProvisioned()", e,
451                    ImsReasonInfo.CODE_LOCAL_SERVICE_UNAVAILABLE);
452        }
453    }
454
455    /**
456     * Gets the value for IMS feature item for video call quality.
457     *
458     * @param listener, provided if caller needs to be notified for set result.
459     * @return void
460     *
461     * @throws ImsException if calling the IMS service results in an error.
462     */
463    public void getVideoQuality(ImsConfigListener listener) throws ImsException {
464        try {
465            miConfig.getVideoQuality(listener);
466        } catch (RemoteException e) {
467            throw new ImsException("getVideoQuality()", e,
468                    ImsReasonInfo.CODE_LOCAL_SERVICE_UNAVAILABLE);
469        }
470    }
471
472    /**
473     * Sets the value for IMS feature item video quality.
474     *
475     * @param quality, defines the value of video quality.
476     * @param listener, provided if caller needs to be notified for set result.
477     * @return void
478     *
479     * @throws ImsException if calling the IMS service results in an error.
480     */
481     public void setVideoQuality(int quality, ImsConfigListener listener) throws ImsException {
482        try {
483            miConfig.setVideoQuality(quality, listener);
484        } catch (RemoteException e) {
485            throw new ImsException("setVideoQuality()", e,
486                    ImsReasonInfo.CODE_LOCAL_SERVICE_UNAVAILABLE);
487        }
488     }
489}
490