1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
|
/*
* Copyright (C) 2015 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.telephony;
import com.android.internal.telephony.ICarrierConfigLoader;
import android.annotation.SystemApi;
import android.content.Context;
import android.os.Bundle;
import android.os.RemoteException;
import android.os.ServiceManager;
/**
* Provides access to telephony configuration values that are carrier-specific.
* <p>
* Users should obtain an instance of this class by calling
* {@code mContext.getSystemService(Context.CARRIER_CONFIG_SERVICE);}
* </p>
*
* @see Context#getSystemService
* @see Context#CARRIER_CONFIG_SERVICE
*/
public class CarrierConfigManager {
/**
* @hide
*/
public CarrierConfigManager() {
}
/**
* This intent is broadcast by the system when carrier config changes.
*/
public static final String
ACTION_CARRIER_CONFIG_CHANGED = "android.telephony.action.CARRIER_CONFIG_CHANGED";
/**
* Flag specifying whether VoLTE should be available for carrier, independent of carrier
* provisioning. If false: hard disabled. If true: then depends on carrier provisioning,
* availability, etc.
*/
public static final String BOOL_CARRIER_VOLTE_AVAILABLE = "bool_carrier_volte_available";
/**
* Flag specifying whether VoLTE availability is based on provisioning.
*/
public static final String BOOL_CARRIER_VOLTE_PROVISIONED = "bool_carrier_volte_provisioned";
/**
* Flag specifying whether VoLTE TTY is supported.
*/
public static final String BOOL_CARRIER_VOLTE_TTY_SUPPORTED
= "bool_carrier_volte_tty_supported";
/**
* Show APN Settings for some CDMA carriers.
*/
public static final String BOOL_SHOW_APN_SETTING_CDMA = "bool_show_apn_setting_cdma";
/**
* If Voice Radio Technology is RIL_RADIO_TECHNOLOGY_LTE:14 or RIL_RADIO_TECHNOLOGY_UNKNOWN:0
* this is the value that should be used instead. A configuration value of
* RIL_RADIO_TECHNOLOGY_UNKNOWN:0 means there is no replacement value and that the default
* assumption for phone type (GSM) should be used.
*/
public static final String INT_VOLTE_REPLACEMENT_RAT = "int_volte_replacement_rat";
/* The following 3 fields are related to carrier visual voicemail. */
/**
* The carrier number MO sms messages are sent to.
*
* @hide
*/
@SystemApi
public static final String STRING_VVM_DESTINATION_NUMBER = "string_vvm_destination_number";
/**
* The port through which the MO sms messages are sent through.
*
* @hide
*/
@SystemApi
public static final String SHORT_VVM_PORT_NUMBER = "string_vvm_port_number";
/**
* The type of visual voicemail protocol the carrier adheres to (see below).
*
* @hide
*/
@SystemApi
public static final String STRING_VVM_TYPE = "string_vvm_type";
/* Visual voicemail protocols */
/**
* The OMTP protocol.
*
* @hide
*/
@SystemApi
public static final String VVM_TYPE_OMTP = "vvm_type_omtp";
private final static String TAG = "CarrierConfigManager";
/** The default value for every variable. */
private final static Bundle sDefaults;
static {
sDefaults = new Bundle();
sDefaults.putBoolean(BOOL_CARRIER_VOLTE_AVAILABLE, false);
sDefaults.putBoolean(BOOL_CARRIER_VOLTE_PROVISIONED, false);
sDefaults.putBoolean(BOOL_CARRIER_VOLTE_TTY_SUPPORTED, true);
sDefaults.putBoolean(BOOL_SHOW_APN_SETTING_CDMA, false);
sDefaults.putInt(INT_VOLTE_REPLACEMENT_RAT, 0);
}
/**
* Gets the configuration values for a particular subscription, which is associated with a
* specific SIM card. If an invalid subId is used, the returned config will contain default
* values.
*
* @param subId the subscription ID, normally obtained from {@link SubscriptionManager}.
* @return A {@link Bundle} containing the config for the given subId, or default values for an
* invalid subId.
*/
public Bundle getConfigForSubId(int subId) {
try {
return getICarrierConfigLoader().getConfigForSubId(subId);
} catch (RemoteException ex) {
Rlog.e(TAG, "Error getting config for subId " + Integer.toString(subId) + ": "
+ ex.toString());
} catch (NullPointerException ex) {
Rlog.e(TAG, "Error getting config for subId " + Integer.toString(subId) + ": "
+ ex.toString());
}
return null;
}
/**
* Gets the configuration values for the default subscription.
*
* @see #getConfigForSubId
*/
public Bundle getConfig() {
return getConfigForSubId(SubscriptionManager.getDefaultSubId());
}
/**
* Calling this method triggers telephony services to fetch the current carrier configuration.
* <p>
* Normally this does not need to be called because the platform reloads config on its own. Call
* this method if your app wants to update config at an arbitrary moment.
* </p>
* <p>
* This method returns before the reload has completed, and
* {@link android.service.carrier.CarrierConfigService#onLoadConfig} will be called from an
* arbitrary thread.
* </p>
*/
public void reloadCarrierConfigForSubId(int subId) {
try {
getICarrierConfigLoader().reloadCarrierConfigForSubId(subId);
} catch (RemoteException ex) {
Rlog.e(TAG, "Error reloading config for subId=" + subId + ": " + ex.toString());
} catch (NullPointerException ex) {
Rlog.e(TAG, "Error reloading config for subId=" + subId + ": " + ex.toString());
}
}
/**
* Request the carrier config loader to update the cofig for phoneId.
*
* Depending on simState, the config may be cleared or loaded from config app.
* This is only used by SubscriptionInfoUpdater.
*
* @hide
*/
@SystemApi
public void updateConfigForPhoneId(int phoneId, String simState) {
try {
getICarrierConfigLoader().updateConfigForPhoneId(phoneId, simState);
} catch (RemoteException ex) {
Rlog.e(TAG, "Error updating config for phoneId=" + phoneId + ": " + ex.toString());
} catch (NullPointerException ex) {
Rlog.e(TAG, "Error updating config for phoneId=" + phoneId + ": " + ex.toString());
}
}
/**
* Returns a bundle with the default value for every supported configuration variable.
*
* @hide
*/
@SystemApi
public static Bundle getDefaultConfig() {
return sDefaults;
}
/** @hide */
private ICarrierConfigLoader getICarrierConfigLoader() {
return ICarrierConfigLoader.Stub
.asInterface(ServiceManager.getService(Context.CARRIER_CONFIG_SERVICE));
}
}
|