CarrierConfigManager.java revision a4f2da398837c5eaec5dec13c29e13af3f7185e3
15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/*
25460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * Copyright (C) 2015 The Android Open Source Project
35460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *
45460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * Licensed under the Apache License, Version 2.0 (the "License");
55460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * you may not use this file except in compliance with the License.
65460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * You may obtain a copy of the License at
75460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *
85460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao *      http://www.apache.org/licenses/LICENSE-2.0
937b74a387bb3993387029859c2d9d051c41c724eStephen Hines *
1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines * Unless required by applicable law or agreed to in writing, software
1137b74a387bb3993387029859c2d9d051c41c724eStephen Hines * distributed under the License is distributed on an "AS IS" BASIS,
125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao * See the License for the specific language governing permissions and
1422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao * limitations under the License.
1537b74a387bb3993387029859c2d9d051c41c724eStephen Hines */
165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaopackage android.telephony;
1837b74a387bb3993387029859c2d9d051c41c724eStephen Hines
1937b74a387bb3993387029859c2d9d051c41c724eStephen Hinesimport com.android.internal.telephony.ICarrierConfigLoader;
2037b74a387bb3993387029859c2d9d051c41c724eStephen Hines
2137b74a387bb3993387029859c2d9d051c41c724eStephen Hinesimport android.annotation.NonNull;
2237b74a387bb3993387029859c2d9d051c41c724eStephen Hinesimport android.annotation.Nullable;
2337b74a387bb3993387029859c2d9d051c41c724eStephen Hinesimport android.annotation.SystemApi;
2437b74a387bb3993387029859c2d9d051c41c724eStephen Hinesimport android.content.Context;
2537b74a387bb3993387029859c2d9d051c41c724eStephen Hinesimport android.os.PersistableBundle;
2637b74a387bb3993387029859c2d9d051c41c724eStephen Hinesimport android.os.RemoteException;
2737b74a387bb3993387029859c2d9d051c41c724eStephen Hinesimport android.os.ServiceManager;
2837b74a387bb3993387029859c2d9d051c41c724eStephen Hines
2937b74a387bb3993387029859c2d9d051c41c724eStephen Hines/**
3037b74a387bb3993387029859c2d9d051c41c724eStephen Hines * Provides access to telephony configuration values that are carrier-specific.
3137b74a387bb3993387029859c2d9d051c41c724eStephen Hines * <p>
3237b74a387bb3993387029859c2d9d051c41c724eStephen Hines * Users should obtain an instance of this class by calling
3337b74a387bb3993387029859c2d9d051c41c724eStephen Hines * {@code mContext.getSystemService(Context.CARRIER_CONFIG_SERVICE);}
3437b74a387bb3993387029859c2d9d051c41c724eStephen Hines * </p>
3537b74a387bb3993387029859c2d9d051c41c724eStephen Hines *
3637b74a387bb3993387029859c2d9d051c41c724eStephen Hines * @see Context#getSystemService
3737b74a387bb3993387029859c2d9d051c41c724eStephen Hines * @see Context#CARRIER_CONFIG_SERVICE
3837b74a387bb3993387029859c2d9d051c41c724eStephen Hines */
3937b74a387bb3993387029859c2d9d051c41c724eStephen Hinespublic class CarrierConfigManager {
4037b74a387bb3993387029859c2d9d051c41c724eStephen Hines    private final static String TAG = "CarrierConfigManager";
4137b74a387bb3993387029859c2d9d051c41c724eStephen Hines
4237b74a387bb3993387029859c2d9d051c41c724eStephen Hines    /**
4337b74a387bb3993387029859c2d9d051c41c724eStephen Hines     * @hide
4437b74a387bb3993387029859c2d9d051c41c724eStephen Hines     */
4537b74a387bb3993387029859c2d9d051c41c724eStephen Hines    public CarrierConfigManager() {
4637b74a387bb3993387029859c2d9d051c41c724eStephen Hines    }
4737b74a387bb3993387029859c2d9d051c41c724eStephen Hines
4837b74a387bb3993387029859c2d9d051c41c724eStephen Hines    /**
4937b74a387bb3993387029859c2d9d051c41c724eStephen Hines     * This intent is broadcast by the system when carrier config changes.
5037b74a387bb3993387029859c2d9d051c41c724eStephen Hines     */
5137b74a387bb3993387029859c2d9d051c41c724eStephen Hines    public static final String
5237b74a387bb3993387029859c2d9d051c41c724eStephen Hines            ACTION_CARRIER_CONFIG_CHANGED = "android.telephony.action.CARRIER_CONFIG_CHANGED";
5337b74a387bb3993387029859c2d9d051c41c724eStephen Hines
5437b74a387bb3993387029859c2d9d051c41c724eStephen Hines    // Below are the keys used in carrier config bundles. To add a new variable, define the key and
5537b74a387bb3993387029859c2d9d051c41c724eStephen Hines    // give it a default value in sDefaults. If you need to ship a per-network override in the
5637b74a387bb3993387029859c2d9d051c41c724eStephen Hines    // system image, that can be added in packages/apps/CarrierConfig.
5737b74a387bb3993387029859c2d9d051c41c724eStephen Hines
5837b74a387bb3993387029859c2d9d051c41c724eStephen Hines    /**
5937b74a387bb3993387029859c2d9d051c41c724eStephen Hines     * Flag indicating whether the Phone app should ignore EVENT_SIM_NETWORK_LOCKED
6037b74a387bb3993387029859c2d9d051c41c724eStephen Hines     * events from the Sim.
6137b74a387bb3993387029859c2d9d051c41c724eStephen Hines     * If true, this will prevent the IccNetworkDepersonalizationPanel from being shown, and
6237b74a387bb3993387029859c2d9d051c41c724eStephen Hines     * effectively disable the "Sim network lock" feature.
6337b74a387bb3993387029859c2d9d051c41c724eStephen Hines     */
645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    public static final String
655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao            KEY_IGNORE_SIM_NETWORK_LOCKED_EVENTS_BOOL = "ignore_sim_network_locked_events_bool";
6637b74a387bb3993387029859c2d9d051c41c724eStephen Hines
6737b74a387bb3993387029859c2d9d051c41c724eStephen Hines    /**
6837b74a387bb3993387029859c2d9d051c41c724eStephen Hines     * Flag indicating whether the Phone app should provide a "Dismiss" button on the SIM network
6937b74a387bb3993387029859c2d9d051c41c724eStephen Hines     * unlock screen. The default value is true. If set to false, there will be *no way* to dismiss
7037b74a387bb3993387029859c2d9d051c41c724eStephen Hines     * the SIM network unlock screen if you don't enter the correct unlock code. (One important
7137b74a387bb3993387029859c2d9d051c41c724eStephen Hines     * consequence: there will be no way to make an Emergency Call if your SIM is network-locked and
7237b74a387bb3993387029859c2d9d051c41c724eStephen Hines     * you don't know the PIN.)
7337b74a387bb3993387029859c2d9d051c41c724eStephen Hines     */
7437b74a387bb3993387029859c2d9d051c41c724eStephen Hines    public static final String
7537b74a387bb3993387029859c2d9d051c41c724eStephen Hines            KEY_SIM_NETWORK_UNLOCK_ALLOW_DISMISS_BOOL = "sim_network_unlock_allow_dismiss_bool";
7622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
770dea6bc96bb52346737966839ac68644f7939f58Stephen Hines    /** Flag indicating if the phone is a world phone */
785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    public static final String KEY_WORLD_PHONE_BOOL = "world_phone_bool";
795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    /**
815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao     * If true, enable vibration (haptic feedback) for key presses in the EmergencyDialer activity.
8237b74a387bb3993387029859c2d9d051c41c724eStephen Hines     * The pattern is set on a per-platform basis using config_virtualKeyVibePattern. To be
8337b74a387bb3993387029859c2d9d051c41c724eStephen Hines     * consistent with the regular Dialer, this value should agree with the corresponding values
8437b74a387bb3993387029859c2d9d051c41c724eStephen Hines     * from config.xml under apps/Contacts.
8537b74a387bb3993387029859c2d9d051c41c724eStephen Hines     */
8637b74a387bb3993387029859c2d9d051c41c724eStephen Hines    public static final String
8737b74a387bb3993387029859c2d9d051c41c724eStephen Hines            KEY_ENABLE_DIALER_KEY_VIBRATION_BOOL = "enable_dialer_key_vibration_bool";
8837b74a387bb3993387029859c2d9d051c41c724eStephen Hines
8937b74a387bb3993387029859c2d9d051c41c724eStephen Hines    /** Flag indicating if dtmf tone type is enabled */
9037b74a387bb3993387029859c2d9d051c41c724eStephen Hines    public static final String KEY_DTMF_TYPE_ENABLED_BOOL = "dtmf_type_enabled_bool";
9137b74a387bb3993387029859c2d9d051c41c724eStephen Hines
9237b74a387bb3993387029859c2d9d051c41c724eStephen Hines    /** Flag indicating if auto retry is enabled */
9337b74a387bb3993387029859c2d9d051c41c724eStephen Hines    public static final String KEY_AUTO_RETRY_ENABLED_BOOL = "auto_retry_enabled_bool";
9437b74a387bb3993387029859c2d9d051c41c724eStephen Hines
9537b74a387bb3993387029859c2d9d051c41c724eStephen Hines    /**
9637b74a387bb3993387029859c2d9d051c41c724eStephen Hines     * Determine whether we want to play local DTMF tones in a call, or just let the radio/BP handle
9737b74a387bb3993387029859c2d9d051c41c724eStephen Hines     * playing of the tones.
9837b74a387bb3993387029859c2d9d051c41c724eStephen Hines     */
9937b74a387bb3993387029859c2d9d051c41c724eStephen Hines    public static final String KEY_ALLOW_LOCAL_DTMF_TONES_BOOL = "allow_local_dtmf_tones_bool";
10037b74a387bb3993387029859c2d9d051c41c724eStephen Hines
10137b74a387bb3993387029859c2d9d051c41c724eStephen Hines    /**
10237b74a387bb3993387029859c2d9d051c41c724eStephen Hines     * If true, show an onscreen "Dial" button in the dialer. In practice this is used on all
10337b74a387bb3993387029859c2d9d051c41c724eStephen Hines     * platforms, even the ones with hard SEND/END keys, but for maximum flexibility it's controlled
10437b74a387bb3993387029859c2d9d051c41c724eStephen Hines     * by a flag here (which can be overridden on a per-product basis.)
10537b74a387bb3993387029859c2d9d051c41c724eStephen Hines     */
10637b74a387bb3993387029859c2d9d051c41c724eStephen Hines    public static final String KEY_SHOW_ONSCREEN_DIAL_BUTTON_BOOL = "show_onscreen_dial_button_bool";
10737b74a387bb3993387029859c2d9d051c41c724eStephen Hines
10837b74a387bb3993387029859c2d9d051c41c724eStephen Hines    /** Determines if device implements a noise suppression device for in call audio. */
10937b74a387bb3993387029859c2d9d051c41c724eStephen Hines    public static final String
11037b74a387bb3993387029859c2d9d051c41c724eStephen Hines            KEY_HAS_IN_CALL_NOISE_SUPPRESSION_BOOL = "has_in_call_noise_suppression_bool";
11137b74a387bb3993387029859c2d9d051c41c724eStephen Hines
11237b74a387bb3993387029859c2d9d051c41c724eStephen Hines    /**
11337b74a387bb3993387029859c2d9d051c41c724eStephen Hines     * Determines if the current device should allow emergency numbers to be logged in the Call Log.
11437b74a387bb3993387029859c2d9d051c41c724eStephen Hines     * (Some carriers require that emergency calls *not* be logged, presumably to avoid the risk of
11537b74a387bb3993387029859c2d9d051c41c724eStephen Hines     * accidental redialing from the call log UI. This is a good idea, so the default here is
11637b74a387bb3993387029859c2d9d051c41c724eStephen Hines     * false.)
11737b74a387bb3993387029859c2d9d051c41c724eStephen Hines     */
11837b74a387bb3993387029859c2d9d051c41c724eStephen Hines    public static final String
11937b74a387bb3993387029859c2d9d051c41c724eStephen Hines            KEY_ALLOW_EMERGENCY_NUMBERS_IN_CALL_LOG_BOOL = "allow_emergency_numbers_in_call_log_bool";
12037b74a387bb3993387029859c2d9d051c41c724eStephen Hines
12137b74a387bb3993387029859c2d9d051c41c724eStephen Hines    /** If true, removes the Voice Privacy option from Call Settings */
12237b74a387bb3993387029859c2d9d051c41c724eStephen Hines    public static final String KEY_VOICE_PRIVACY_DISABLE_UI_BOOL = "voice_privacy_disable_ui_bool";
12337b74a387bb3993387029859c2d9d051c41c724eStephen Hines
12437b74a387bb3993387029859c2d9d051c41c724eStephen Hines    /** Control whether users can reach the carrier portions of Cellular Network Settings. */
12537b74a387bb3993387029859c2d9d051c41c724eStephen Hines    public static final String
12637b74a387bb3993387029859c2d9d051c41c724eStephen Hines            KEY_HIDE_CARRIER_NETWORK_SETTINGS_BOOL = "hide_carrier_network_settings_bool";
12737b74a387bb3993387029859c2d9d051c41c724eStephen Hines
12837b74a387bb3993387029859c2d9d051c41c724eStephen Hines    /** Control whether users can reach the SIM lock settings. */
12937b74a387bb3993387029859c2d9d051c41c724eStephen Hines    public static final String
13037b74a387bb3993387029859c2d9d051c41c724eStephen Hines            KEY_HIDE_SIM_LOCK_SETTINGS_BOOL = "hide_sim_lock_settings_bool";
13137b74a387bb3993387029859c2d9d051c41c724eStephen Hines
13237b74a387bb3993387029859c2d9d051c41c724eStephen Hines    /** Control whether users can edit APNs in Settings. */
13337b74a387bb3993387029859c2d9d051c41c724eStephen Hines    public static final String KEY_APN_EXPAND_BOOL = "apn_expand_bool";
13437b74a387bb3993387029859c2d9d051c41c724eStephen Hines
1355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    /** Control whether users can choose a network operator. */
1365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    public static final String KEY_OPERATOR_SELECTION_EXPAND_BOOL = "operator_selection_expand_bool";
13737b74a387bb3993387029859c2d9d051c41c724eStephen Hines
13837b74a387bb3993387029859c2d9d051c41c724eStephen Hines    /** Used in Cellular Network Settings for preferred network type. */
13937b74a387bb3993387029859c2d9d051c41c724eStephen Hines    public static final String KEY_PREFER_2G_BOOL = "prefer_2g_bool";
14037b74a387bb3993387029859c2d9d051c41c724eStephen Hines
14137b74a387bb3993387029859c2d9d051c41c724eStephen Hines    /** Show cdma network mode choices 1x, 3G, global etc. */
14237b74a387bb3993387029859c2d9d051c41c724eStephen Hines    public static final String KEY_SHOW_CDMA_CHOICES_BOOL = "show_cdma_choices_bool";
14337b74a387bb3993387029859c2d9d051c41c724eStephen Hines
144551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines    /** CDMA activation goes through HFA */
1455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    public static final String KEY_USE_HFA_FOR_PROVISIONING_BOOL = "use_hfa_for_provisioning_bool";
1465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
14737b74a387bb3993387029859c2d9d051c41c724eStephen Hines    /**
14837b74a387bb3993387029859c2d9d051c41c724eStephen Hines     * CDMA activation goes through OTASP.
14937b74a387bb3993387029859c2d9d051c41c724eStephen Hines     * <p>
15037b74a387bb3993387029859c2d9d051c41c724eStephen Hines     * TODO: This should be combined with config_use_hfa_for_provisioning and implemented as an enum
15137b74a387bb3993387029859c2d9d051c41c724eStephen Hines     * (NONE, HFA, OTASP).
152d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao     */
15337b74a387bb3993387029859c2d9d051c41c724eStephen Hines    public static final String KEY_USE_OTASP_FOR_PROVISIONING_BOOL = "use_otasp_for_provisioning_bool";
15437b74a387bb3993387029859c2d9d051c41c724eStephen Hines
15537b74a387bb3993387029859c2d9d051c41c724eStephen Hines    /** Display carrier settings menu if true */
15637b74a387bb3993387029859c2d9d051c41c724eStephen Hines    public static final String KEY_CARRIER_SETTINGS_ENABLE_BOOL = "carrier_settings_enable_bool";
15737b74a387bb3993387029859c2d9d051c41c724eStephen Hines
15837b74a387bb3993387029859c2d9d051c41c724eStephen Hines    /** Does not display additional call seting for IMS phone based on GSM Phone */
15937b74a387bb3993387029859c2d9d051c41c724eStephen Hines    public static final String KEY_ADDITIONAL_CALL_SETTING_BOOL = "additional_call_setting_bool";
16037b74a387bb3993387029859c2d9d051c41c724eStephen Hines
16137b74a387bb3993387029859c2d9d051c41c724eStephen Hines    /** Show APN Settings for some CDMA carriers */
16237b74a387bb3993387029859c2d9d051c41c724eStephen Hines    public static final String KEY_SHOW_APN_SETTING_CDMA_BOOL = "show_apn_setting_cdma_bool";
16337b74a387bb3993387029859c2d9d051c41c724eStephen Hines
16437b74a387bb3993387029859c2d9d051c41c724eStephen Hines    /** After a CDMA conference call is merged, the swap button should be displayed. */
16537b74a387bb3993387029859c2d9d051c41c724eStephen Hines    public static final String KEY_SUPPORT_SWAP_AFTER_MERGE_BOOL = "support_swap_after_merge_bool";
16637b74a387bb3993387029859c2d9d051c41c724eStephen Hines
1675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    /**
1685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao     * Determine whether the voicemail notification is persistent in the notification bar. If true,
16937b74a387bb3993387029859c2d9d051c41c724eStephen Hines     * the voicemail notifications cannot be dismissed from the notification bar.
17037b74a387bb3993387029859c2d9d051c41c724eStephen Hines     */
17137b74a387bb3993387029859c2d9d051c41c724eStephen Hines    public static final String
17237b74a387bb3993387029859c2d9d051c41c724eStephen Hines            KEY_VOICEMAIL_NOTIFICATION_PERSISTENT_BOOL = "voicemail_notification_persistent_bool";
17337b74a387bb3993387029859c2d9d051c41c724eStephen Hines
17437b74a387bb3993387029859c2d9d051c41c724eStephen Hines    /** For IMS video over LTE calls, determines whether video pause signalling is supported. */
17537b74a387bb3993387029859c2d9d051c41c724eStephen Hines    public static final String
17637b74a387bb3993387029859c2d9d051c41c724eStephen Hines            KEY_SUPPORT_PAUSE_IMS_VIDEO_CALLS_BOOL = "support_pause_ims_video_calls_bool";
17737b74a387bb3993387029859c2d9d051c41c724eStephen Hines
17837b74a387bb3993387029859c2d9d051c41c724eStephen Hines    /**
17937b74a387bb3993387029859c2d9d051c41c724eStephen Hines     * Disables dialing "*228" (OTASP provisioning) on CDMA carriers where it is not supported or is
18037b74a387bb3993387029859c2d9d051c41c724eStephen Hines     * potentially harmful by locking the SIM to 3G.
18137b74a387bb3993387029859c2d9d051c41c724eStephen Hines     */
18237b74a387bb3993387029859c2d9d051c41c724eStephen Hines    public static final String
18337b74a387bb3993387029859c2d9d051c41c724eStephen Hines            KEY_DISABLE_CDMA_ACTIVATION_CODE_BOOL = "disable_cdma_activation_code_bool";
18437b74a387bb3993387029859c2d9d051c41c724eStephen Hines
18537b74a387bb3993387029859c2d9d051c41c724eStephen Hines   /**
18637b74a387bb3993387029859c2d9d051c41c724eStephen Hines     * Override the platform's notion of a network operator being considered roaming.
18737b74a387bb3993387029859c2d9d051c41c724eStephen Hines     * Value is string array of MCCMNCs to be considered roaming for 3GPP RATs.
18837b74a387bb3993387029859c2d9d051c41c724eStephen Hines     */
18937b74a387bb3993387029859c2d9d051c41c724eStephen Hines    public static final String
19037b74a387bb3993387029859c2d9d051c41c724eStephen Hines            KEY_GSM_ROAMING_NETWORKS_STRING_ARRAY = "gsm_roaming_networks_string_array";
19137b74a387bb3993387029859c2d9d051c41c724eStephen Hines
19237b74a387bb3993387029859c2d9d051c41c724eStephen Hines    /**
19337b74a387bb3993387029859c2d9d051c41c724eStephen Hines     * Override the platform's notion of a network operator being considered not roaming.
19437b74a387bb3993387029859c2d9d051c41c724eStephen Hines     * Value is string array of MCCMNCs to be considered not roaming for 3GPP RATs.
19537b74a387bb3993387029859c2d9d051c41c724eStephen Hines     */
19637b74a387bb3993387029859c2d9d051c41c724eStephen Hines    public static final String
19737b74a387bb3993387029859c2d9d051c41c724eStephen Hines            KEY_GSM_NONROAMING_NETWORKS_STRING_ARRAY = "gsm_nonroaming_networks_string_array";
19837b74a387bb3993387029859c2d9d051c41c724eStephen Hines
19937b74a387bb3993387029859c2d9d051c41c724eStephen Hines    /**
20037b74a387bb3993387029859c2d9d051c41c724eStephen Hines     * Override the platform's notion of a network operator being considered roaming.
20137b74a387bb3993387029859c2d9d051c41c724eStephen Hines     * Value is string array of SIDs to be considered roaming for 3GPP2 RATs.
20237b74a387bb3993387029859c2d9d051c41c724eStephen Hines     */
20337b74a387bb3993387029859c2d9d051c41c724eStephen Hines    public static final String
20437b74a387bb3993387029859c2d9d051c41c724eStephen Hines            KEY_CDMA_ROAMING_NETWORKS_STRING_ARRAY = "cdma_roaming_networks_string_array";
20537b74a387bb3993387029859c2d9d051c41c724eStephen Hines
20637b74a387bb3993387029859c2d9d051c41c724eStephen Hines    /**
20737b74a387bb3993387029859c2d9d051c41c724eStephen Hines     * Override the platform's notion of a network operator being considered non roaming.
20837b74a387bb3993387029859c2d9d051c41c724eStephen Hines     * Value is string array of SIDs to be considered not roaming for 3GPP2 RATs.
20937b74a387bb3993387029859c2d9d051c41c724eStephen Hines     */
21037b74a387bb3993387029859c2d9d051c41c724eStephen Hines    public static final String
21137b74a387bb3993387029859c2d9d051c41c724eStephen Hines            KEY_CDMA_NONROAMING_NETWORKS_STRING_ARRAY = "cdma_nonroaming_networks_string_array";
21237b74a387bb3993387029859c2d9d051c41c724eStephen Hines
21337b74a387bb3993387029859c2d9d051c41c724eStephen Hines    /**
21437b74a387bb3993387029859c2d9d051c41c724eStephen Hines     * Override the platform's notion of a network operator being considered non roaming.
21537b74a387bb3993387029859c2d9d051c41c724eStephen Hines     * If true all networks are considered as home network a.k.a non-roaming.  When false,
21637b74a387bb3993387029859c2d9d051c41c724eStephen Hines     * the 2 pairs of CMDA and GSM roaming/non-roaming arrays are consulted.
21737b74a387bb3993387029859c2d9d051c41c724eStephen Hines     *
21837b74a387bb3993387029859c2d9d051c41c724eStephen Hines     * @see KEY_GSM_ROAMING_NETWORKS_STRING_ARRAY
21937b74a387bb3993387029859c2d9d051c41c724eStephen Hines     * @see KEY_GSM_NONROAMING_NETWORKS_STRING_ARRAY
22037b74a387bb3993387029859c2d9d051c41c724eStephen Hines     * @see KEY_CDMA_ROAMING_NETWORKS_STRING_ARRAY
22137b74a387bb3993387029859c2d9d051c41c724eStephen Hines     * @see KEY_CDMA_NONROAMING_NETWORKS_STRING_ARRAY
22237b74a387bb3993387029859c2d9d051c41c724eStephen Hines     */
22337b74a387bb3993387029859c2d9d051c41c724eStephen Hines    public static final String
22422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao            KEY_FORCE_HOME_NETWORK_BOOL = "force_home_network_bool";
22522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
22637b74a387bb3993387029859c2d9d051c41c724eStephen Hines    /**
22737b74a387bb3993387029859c2d9d051c41c724eStephen Hines     * Flag specifying whether VoLTE should be available for carrier, independent of carrier
22837b74a387bb3993387029859c2d9d051c41c724eStephen Hines     * provisioning. If false: hard disabled. If true: then depends on carrier provisioning,
22937b74a387bb3993387029859c2d9d051c41c724eStephen Hines     * availability, etc.
23037b74a387bb3993387029859c2d9d051c41c724eStephen Hines     */
23137b74a387bb3993387029859c2d9d051c41c724eStephen Hines    public static final String KEY_CARRIER_VOLTE_AVAILABLE_BOOL = "carrier_volte_available_bool";
23222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
23322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    /**
23422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao     * Flag specifying whether video telephony is available for carrier. If false: hard disabled.
2355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao     * If true: then depends on carrier provisioning, availability, etc.
2365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao     */
23737b74a387bb3993387029859c2d9d051c41c724eStephen Hines    public static final String KEY_CARRIER_VT_AVAILABLE_BOOL = "carrier_vt_available_bool";
238
239    /**
240     * Flag specifying whether WFC over IMS should be available for carrier: independent of
241     * carrier provisioning. If false: hard disabled. If true: then depends on carrier
242     * provisioning, availability etc.
243     */
244    public static final String KEY_CARRIER_WFC_IMS_AVAILABLE_BOOL = "carrier_wfc_ims_available_bool";
245
246    /** Flag specifying whether provisioning is required for VOLTE. */
247    public static final String KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL
248            = "carrier_volte_provisioning_required_bool";
249
250    /** Flag specifying whether VoLTE TTY is supported. */
251    public static final String KEY_CARRIER_VOLTE_TTY_SUPPORTED_BOOL
252            = "carrier_volte_tty_supported_bool";
253
254    /**
255     * Flag specifying whether IMS service can be turned off. If false then the service will not be
256     * turned-off completely, but individual features can be disabled.
257     */
258    public static final String KEY_CARRIER_ALLOW_TURNOFF_IMS_BOOL
259            = "carrier_allow_turnoff_ims_bool";
260
261    /**
262     * If Voice Radio Technology is RIL_RADIO_TECHNOLOGY_LTE:14 or RIL_RADIO_TECHNOLOGY_UNKNOWN:0
263     * this is the value that should be used instead. A configuration value of
264     * RIL_RADIO_TECHNOLOGY_UNKNOWN:0 means there is no replacement value and that the default
265     * assumption for phone type (GSM) should be used.
266     */
267    public static final String KEY_VOLTE_REPLACEMENT_RAT_INT = "volte_replacement_rat_int";
268
269    /**
270     * The default sim call manager to use when the default dialer doesn't implement one. A sim call
271     * manager can control and route outgoing and incoming phone calls, even if they're placed
272     * using another connection service (PSTN, for example).
273     */
274    public static final String KEY_DEFAULT_SIM_CALL_MANAGER_STRING = "default_sim_call_manager_string";
275
276    /**
277     * The default flag specifying whether ETWS/CMAS test setting is forcibly disabled in
278     * Settings->More->Emergency broadcasts menu even though developer options is turned on.
279     * @hide
280     */
281    public static final String KEY_CARRIER_FORCE_DISABLE_ETWS_CMAS_TEST_BOOL =
282            "carrier_force_disable_etws_cmas_test_bool";
283
284    /* The following 3 fields are related to carrier visual voicemail. */
285
286    /**
287     * The carrier number mobile outgoing (MO) sms messages are sent to.
288     */
289    public static final String KEY_VVM_DESTINATION_NUMBER_STRING = "vvm_destination_number_string";
290
291    /**
292     * The port through which the mobile outgoing (MO) sms messages are sent through.
293     */
294    public static final String KEY_VVM_PORT_NUMBER_INT = "vvm_port_number_int";
295
296    /**
297     * The type of visual voicemail protocol the carrier adheres to. See {@link TelephonyManager}
298     * for possible values. For example {@link TelephonyManager#VVM_TYPE_OMTP}.
299     */
300    public static final String KEY_VVM_TYPE_STRING = "vvm_type_string";
301
302    /**
303     * The package name of the carrier's visual voicemail app to ensure that dialer visual voicemail
304     * and carrier visual voicemail are not active at the same time.
305     */
306    public static final String KEY_CARRIER_VVM_PACKAGE_NAME_STRING = "carrier_vvm_package_name_string";
307
308    /**
309     * Flag specifying whether an additional (client initiated) intent needs to be sent on System
310     * update
311     * @hide
312     */
313    public static final String KEY_CI_ACTION_ON_SYS_UPDATE_BOOL = "ci_action_on_sys_update_bool";
314
315    /**
316     * Intent to be sent for the additional action on System update
317     * @hide
318     */
319    public static final String KEY_CI_ACTION_ON_SYS_UPDATE_INTENT_STRING =
320            "ci_action_on_sys_update_intent_string";
321
322    /**
323     * Extra to be included in the intent sent for additional action on System update
324     * @hide
325     */
326    public static final String KEY_CI_ACTION_ON_SYS_UPDATE_EXTRA_STRING =
327            "ci_action_on_sys_update_extra_string";
328
329    /**
330     * Value of extra included in intent sent for additional action on System update
331     * @hide
332     */
333    public static final String KEY_CI_ACTION_ON_SYS_UPDATE_EXTRA_VAL_STRING =
334            "ci_action_on_sys_update_extra_val_string";
335
336    /**
337     * If this is true, the SIM card (through Customer Service Profile EF file) will be able to
338     * prevent manual operator selection. If false, this SIM setting will be ignored and manual
339     * operator selection will always be available. See CPHS4_2.WW6, CPHS B.4.7.1 for more
340     * information
341     */
342    public static final String KEY_CSP_ENABLED_BOOL = "csp_enabled_bool";
343
344    // These variables are used by the MMS service and exposed through another API, {@link
345    // SmsManager}. The variable names and string values are copied from there.
346    public static final String KEY_MMS_ALIAS_ENABLED_BOOL = "aliasEnabled";
347    public static final String KEY_MMS_ALLOW_ATTACH_AUDIO_BOOL = "allowAttachAudio";
348    public static final String KEY_MMS_APPEND_TRANSACTION_ID_BOOL = "enabledTransID";
349    public static final String KEY_MMS_GROUP_MMS_ENABLED_BOOL = "enableGroupMms";
350    public static final String KEY_MMS_MMS_DELIVERY_REPORT_ENABLED_BOOL = "enableMMSDeliveryReports";
351    public static final String KEY_MMS_MMS_ENABLED_BOOL = "enabledMMS";
352    public static final String KEY_MMS_MMS_READ_REPORT_ENABLED_BOOL = "enableMMSReadReports";
353    public static final String KEY_MMS_MULTIPART_SMS_ENABLED_BOOL = "enableMultipartSMS";
354    public static final String KEY_MMS_NOTIFY_WAP_MMSC_ENABLED_BOOL = "enabledNotifyWapMMSC";
355    public static final String KEY_MMS_SEND_MULTIPART_SMS_AS_SEPARATE_MESSAGES_BOOL = "sendMultipartSmsAsSeparateMessages";
356    public static final String KEY_MMS_SHOW_CELL_BROADCAST_APP_LINKS_BOOL = "config_cellBroadcastAppLinks";
357    public static final String KEY_MMS_SMS_DELIVERY_REPORT_ENABLED_BOOL = "enableSMSDeliveryReports";
358    public static final String KEY_MMS_SUPPORT_HTTP_CHARSET_HEADER_BOOL = "supportHttpCharsetHeader";
359    public static final String KEY_MMS_SUPPORT_MMS_CONTENT_DISPOSITION_BOOL = "supportMmsContentDisposition";
360    public static final String KEY_MMS_ALIAS_MAX_CHARS_INT = "aliasMaxChars";
361    public static final String KEY_MMS_ALIAS_MIN_CHARS_INT = "aliasMinChars";
362    public static final String KEY_MMS_HTTP_SOCKET_TIMEOUT_INT = "httpSocketTimeout";
363    public static final String KEY_MMS_MAX_IMAGE_HEIGHT_INT = "maxImageHeight";
364    public static final String KEY_MMS_MAX_IMAGE_WIDTH_INT = "maxImageWidth";
365    public static final String KEY_MMS_MAX_MESSAGE_SIZE_INT = "maxMessageSize";
366    public static final String KEY_MMS_MESSAGE_TEXT_MAX_SIZE_INT = "maxMessageTextSize";
367    public static final String KEY_MMS_RECIPIENT_LIMIT_INT = "recipientLimit";
368    public static final String KEY_MMS_SMS_TO_MMS_TEXT_LENGTH_THRESHOLD_INT = "smsToMmsTextLengthThreshold";
369    public static final String KEY_MMS_SMS_TO_MMS_TEXT_THRESHOLD_INT = "smsToMmsTextThreshold";
370    public static final String KEY_MMS_SUBJECT_MAX_LENGTH_INT = "maxSubjectLength";
371    public static final String KEY_MMS_EMAIL_GATEWAY_NUMBER_STRING = "emailGatewayNumber";
372    public static final String KEY_MMS_HTTP_PARAMS_STRING = "httpParams";
373    public static final String KEY_MMS_NAI_SUFFIX_STRING = "naiSuffix";
374    public static final String KEY_MMS_UA_PROF_TAG_NAME_STRING = "uaProfTagName";
375    public static final String KEY_MMS_UA_PROF_URL_STRING = "uaProfUrl";
376    public static final String KEY_MMS_USER_AGENT_STRING = "userAgent";
377
378    /** The default value for every variable. */
379    private final static PersistableBundle sDefaults;
380
381    static {
382        sDefaults = new PersistableBundle();
383        sDefaults.putBoolean(KEY_ADDITIONAL_CALL_SETTING_BOOL, true);
384        sDefaults.putBoolean(KEY_ALLOW_EMERGENCY_NUMBERS_IN_CALL_LOG_BOOL, false);
385        sDefaults.putBoolean(KEY_ALLOW_LOCAL_DTMF_TONES_BOOL, true);
386        sDefaults.putBoolean(KEY_APN_EXPAND_BOOL, true);
387        sDefaults.putBoolean(KEY_AUTO_RETRY_ENABLED_BOOL, false);
388        sDefaults.putBoolean(KEY_CARRIER_SETTINGS_ENABLE_BOOL, false);
389        sDefaults.putBoolean(KEY_CARRIER_VOLTE_AVAILABLE_BOOL, false);
390        sDefaults.putBoolean(KEY_CARRIER_VT_AVAILABLE_BOOL, false);
391        sDefaults.putBoolean(KEY_CARRIER_WFC_IMS_AVAILABLE_BOOL, false);
392        sDefaults.putBoolean(KEY_CARRIER_FORCE_DISABLE_ETWS_CMAS_TEST_BOOL, false);
393        sDefaults.putBoolean(KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL, false);
394        sDefaults.putBoolean(KEY_CARRIER_VOLTE_TTY_SUPPORTED_BOOL, true);
395        sDefaults.putBoolean(KEY_CARRIER_ALLOW_TURNOFF_IMS_BOOL, true);
396        sDefaults.putBoolean(KEY_DISABLE_CDMA_ACTIVATION_CODE_BOOL, false);
397        sDefaults.putBoolean(KEY_DTMF_TYPE_ENABLED_BOOL, false);
398        sDefaults.putBoolean(KEY_ENABLE_DIALER_KEY_VIBRATION_BOOL, true);
399        sDefaults.putBoolean(KEY_HAS_IN_CALL_NOISE_SUPPRESSION_BOOL, false);
400        sDefaults.putBoolean(KEY_HIDE_CARRIER_NETWORK_SETTINGS_BOOL, false);
401        sDefaults.putBoolean(KEY_HIDE_SIM_LOCK_SETTINGS_BOOL, false);
402        sDefaults.putBoolean(KEY_IGNORE_SIM_NETWORK_LOCKED_EVENTS_BOOL, false);
403        sDefaults.putBoolean(KEY_OPERATOR_SELECTION_EXPAND_BOOL, true);
404        sDefaults.putBoolean(KEY_PREFER_2G_BOOL, true);
405        sDefaults.putBoolean(KEY_SHOW_APN_SETTING_CDMA_BOOL, false);
406        sDefaults.putBoolean(KEY_SHOW_CDMA_CHOICES_BOOL, false);
407        sDefaults.putBoolean(KEY_SHOW_ONSCREEN_DIAL_BUTTON_BOOL, true);
408        sDefaults.putBoolean(KEY_SIM_NETWORK_UNLOCK_ALLOW_DISMISS_BOOL, true);
409        sDefaults.putBoolean(KEY_SUPPORT_PAUSE_IMS_VIDEO_CALLS_BOOL, true);
410        sDefaults.putBoolean(KEY_SUPPORT_SWAP_AFTER_MERGE_BOOL, true);
411        sDefaults.putBoolean(KEY_USE_HFA_FOR_PROVISIONING_BOOL, false);
412        sDefaults.putBoolean(KEY_USE_OTASP_FOR_PROVISIONING_BOOL, false);
413        sDefaults.putBoolean(KEY_VOICEMAIL_NOTIFICATION_PERSISTENT_BOOL, false);
414        sDefaults.putBoolean(KEY_VOICE_PRIVACY_DISABLE_UI_BOOL, false);
415        sDefaults.putBoolean(KEY_WORLD_PHONE_BOOL, false);
416        sDefaults.putInt(KEY_VOLTE_REPLACEMENT_RAT_INT, 0);
417        sDefaults.putString(KEY_DEFAULT_SIM_CALL_MANAGER_STRING, "");
418        sDefaults.putString(KEY_VVM_DESTINATION_NUMBER_STRING, "");
419        sDefaults.putInt(KEY_VVM_PORT_NUMBER_INT, 0);
420        sDefaults.putString(KEY_VVM_TYPE_STRING, "");
421        sDefaults.putString(KEY_CARRIER_VVM_PACKAGE_NAME_STRING, "");
422        sDefaults.putBoolean(KEY_CI_ACTION_ON_SYS_UPDATE_BOOL, false);
423        sDefaults.putString(KEY_CI_ACTION_ON_SYS_UPDATE_INTENT_STRING, "");
424        sDefaults.putString(KEY_CI_ACTION_ON_SYS_UPDATE_EXTRA_STRING, "");
425        sDefaults.putString(KEY_CI_ACTION_ON_SYS_UPDATE_EXTRA_VAL_STRING, "");
426        sDefaults.putBoolean(KEY_CSP_ENABLED_BOOL, false);
427
428        sDefaults.putStringArray(KEY_GSM_ROAMING_NETWORKS_STRING_ARRAY, null);
429        sDefaults.putStringArray(KEY_GSM_NONROAMING_NETWORKS_STRING_ARRAY, null);
430        sDefaults.putStringArray(KEY_CDMA_ROAMING_NETWORKS_STRING_ARRAY, null);
431        sDefaults.putStringArray(KEY_CDMA_NONROAMING_NETWORKS_STRING_ARRAY, null);
432        sDefaults.putBoolean(KEY_FORCE_HOME_NETWORK_BOOL, false);
433
434        // MMS defaults
435        sDefaults.putBoolean(KEY_MMS_ALIAS_ENABLED_BOOL, false);
436        sDefaults.putBoolean(KEY_MMS_ALLOW_ATTACH_AUDIO_BOOL, true);
437        sDefaults.putBoolean(KEY_MMS_APPEND_TRANSACTION_ID_BOOL, false);
438        sDefaults.putBoolean(KEY_MMS_GROUP_MMS_ENABLED_BOOL, true);
439        sDefaults.putBoolean(KEY_MMS_MMS_DELIVERY_REPORT_ENABLED_BOOL, false);
440        sDefaults.putBoolean(KEY_MMS_MMS_ENABLED_BOOL, true);
441        sDefaults.putBoolean(KEY_MMS_MMS_READ_REPORT_ENABLED_BOOL, false);
442        sDefaults.putBoolean(KEY_MMS_MULTIPART_SMS_ENABLED_BOOL, true);
443        sDefaults.putBoolean(KEY_MMS_NOTIFY_WAP_MMSC_ENABLED_BOOL, false);
444        sDefaults.putBoolean(KEY_MMS_SEND_MULTIPART_SMS_AS_SEPARATE_MESSAGES_BOOL, false);
445        sDefaults.putBoolean(KEY_MMS_SHOW_CELL_BROADCAST_APP_LINKS_BOOL, true);
446        sDefaults.putBoolean(KEY_MMS_SMS_DELIVERY_REPORT_ENABLED_BOOL, true);
447        sDefaults.putBoolean(KEY_MMS_SUPPORT_HTTP_CHARSET_HEADER_BOOL, false);
448        sDefaults.putBoolean(KEY_MMS_SUPPORT_MMS_CONTENT_DISPOSITION_BOOL, true);
449        sDefaults.putInt(KEY_MMS_ALIAS_MAX_CHARS_INT, 48);
450        sDefaults.putInt(KEY_MMS_ALIAS_MIN_CHARS_INT, 2);
451        sDefaults.putInt(KEY_MMS_HTTP_SOCKET_TIMEOUT_INT, 60 * 1000);
452        sDefaults.putInt(KEY_MMS_MAX_IMAGE_HEIGHT_INT, 480);
453        sDefaults.putInt(KEY_MMS_MAX_IMAGE_WIDTH_INT, 640);
454        sDefaults.putInt(KEY_MMS_MAX_MESSAGE_SIZE_INT, 300 * 1024);
455        sDefaults.putInt(KEY_MMS_MESSAGE_TEXT_MAX_SIZE_INT, -1);
456        sDefaults.putInt(KEY_MMS_RECIPIENT_LIMIT_INT, Integer.MAX_VALUE);
457        sDefaults.putInt(KEY_MMS_SMS_TO_MMS_TEXT_LENGTH_THRESHOLD_INT, -1);
458        sDefaults.putInt(KEY_MMS_SMS_TO_MMS_TEXT_THRESHOLD_INT, -1);
459        sDefaults.putInt(KEY_MMS_SUBJECT_MAX_LENGTH_INT, 40);
460        sDefaults.putString(KEY_MMS_EMAIL_GATEWAY_NUMBER_STRING, "");
461        sDefaults.putString(KEY_MMS_HTTP_PARAMS_STRING, "");
462        sDefaults.putString(KEY_MMS_NAI_SUFFIX_STRING, "");
463        sDefaults.putString(KEY_MMS_UA_PROF_TAG_NAME_STRING, "x-wap-profile");
464        sDefaults.putString(KEY_MMS_UA_PROF_URL_STRING, "");
465        sDefaults.putString(KEY_MMS_USER_AGENT_STRING, "");
466    }
467
468    /**
469     * Gets the configuration values for a particular subscription, which is associated with a
470     * specific SIM card. If an invalid subId is used, the returned config will contain default
471     * values.
472     *
473     * <p>Requires Permission:
474     * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
475     *
476     * @param subId the subscription ID, normally obtained from {@link SubscriptionManager}.
477     * @return A {@link PersistableBundle} containing the config for the given subId, or default
478     *         values for an invalid subId.
479     */
480    @Nullable
481    public PersistableBundle getConfigForSubId(int subId) {
482        try {
483            return getICarrierConfigLoader().getConfigForSubId(subId);
484        } catch (RemoteException ex) {
485            Rlog.e(TAG, "Error getting config for subId " + Integer.toString(subId) + ": "
486                    + ex.toString());
487        } catch (NullPointerException ex) {
488            Rlog.e(TAG, "Error getting config for subId " + Integer.toString(subId) + ": "
489                    + ex.toString());
490        }
491        return null;
492    }
493
494    /**
495     * Gets the configuration values for the default subscription.
496     *
497     * <p>Requires Permission:
498     * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
499     *
500     * @see #getConfigForSubId
501     */
502    @Nullable
503    public PersistableBundle getConfig() {
504        return getConfigForSubId(SubscriptionManager.getDefaultSubId());
505    }
506
507    /**
508     * Calling this method triggers telephony services to fetch the current carrier configuration.
509     * <p>
510     * Normally this does not need to be called because the platform reloads config on its own.
511     * This should be called by a carrier service app if it wants to update config at an arbitrary
512     * moment.
513     * </p>
514     * <p>Requires that the calling app has carrier privileges.
515     * @see #hasCarrierPrivileges
516     * <p>
517     * This method returns before the reload has completed, and
518     * {@link android.service.carrier.CarrierService#onLoadConfig} will be called from an
519     * arbitrary thread.
520     * </p>
521     */
522    public void notifyConfigChangedForSubId(int subId) {
523        try {
524            getICarrierConfigLoader().notifyConfigChangedForSubId(subId);
525        } catch (RemoteException ex) {
526            Rlog.e(TAG, "Error reloading config for subId=" + subId + ": " + ex.toString());
527        } catch (NullPointerException ex) {
528            Rlog.e(TAG, "Error reloading config for subId=" + subId + ": " + ex.toString());
529        }
530    }
531
532    /**
533     * Request the carrier config loader to update the cofig for phoneId.
534     * <p>
535     * Depending on simState, the config may be cleared or loaded from config app. This is only used
536     * by SubscriptionInfoUpdater.
537     * </p>
538     *
539     * @hide
540     */
541    @SystemApi
542    public void updateConfigForPhoneId(int phoneId, String simState) {
543        try {
544            getICarrierConfigLoader().updateConfigForPhoneId(phoneId, simState);
545        } catch (RemoteException ex) {
546            Rlog.e(TAG, "Error updating config for phoneId=" + phoneId + ": " + ex.toString());
547        } catch (NullPointerException ex) {
548            Rlog.e(TAG, "Error updating config for phoneId=" + phoneId + ": " + ex.toString());
549        }
550    }
551
552    /**
553     * Returns a new bundle with the default value for every supported configuration variable.
554     *
555     * @hide
556     */
557    @NonNull
558    @SystemApi
559    public static PersistableBundle getDefaultConfig() {
560        return new PersistableBundle(sDefaults);
561    }
562
563    /** @hide */
564    private ICarrierConfigLoader getICarrierConfigLoader() {
565        return ICarrierConfigLoader.Stub
566                .asInterface(ServiceManager.getService(Context.CARRIER_CONFIG_SERVICE));
567    }
568}
569