blob: b47ecd720a52e5541c6d523ad6faeda702e2c8d5 [file] [log] [blame]
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001/*
2 * Copyright (C) 2006 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.settings;
18
Nathan Haroldf10ea322018-04-24 13:31:07 -070019import static android.net.ConnectivityManager.NetworkCallback;
Nathan Harolddaea8be2018-06-05 14:02:35 -070020import static android.provider.Settings.Global.PREFERRED_NETWORK_MODE;
Nathan Haroldf10ea322018-04-24 13:31:07 -070021
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080022import android.app.Activity;
Pavel Zhamaitsiakcb267a62015-01-21 18:25:14 -080023import android.app.QueuedWork;
Youhan Wangfd781e92016-12-16 15:53:16 -080024import android.content.ComponentName;
Meng Wang586741c2017-04-26 15:02:51 -070025import android.content.Context;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080026import android.content.Intent;
Tammo Spalinka5f4c8f2009-10-15 20:08:58 +080027import android.content.pm.PackageManager;
28import android.content.pm.ResolveInfo;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080029import android.content.res.Resources;
Nathan Haroldcea413a2015-11-23 15:48:10 -080030import android.graphics.Typeface;
Nathan Haroldf10ea322018-04-24 13:31:07 -070031import android.net.ConnectivityManager;
32import android.net.Network;
33import android.net.NetworkCapabilities;
34import android.net.NetworkRequest;
Jeff Sharkey93029862011-05-27 18:26:15 -070035import android.net.TrafficStats;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080036import android.net.Uri;
37import android.os.AsyncResult;
38import android.os.Bundle;
39import android.os.Handler;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080040import android.os.Message;
Nathan Harolddaea8be2018-06-05 14:02:35 -070041import android.provider.Settings;
Meng Wang586741c2017-04-26 15:02:51 -070042import android.telephony.CarrierConfigManager;
Fan Zhangc7162cd2018-06-18 15:21:41 -070043import android.telephony.CellIdentityCdma;
44import android.telephony.CellIdentityGsm;
45import android.telephony.CellIdentityLte;
46import android.telephony.CellIdentityWcdma;
Wink Saville79bff2a2012-06-01 14:37:21 -070047import android.telephony.CellInfo;
Nathan Haroldcea413a2015-11-23 15:48:10 -080048import android.telephony.CellInfoCdma;
49import android.telephony.CellInfoGsm;
50import android.telephony.CellInfoLte;
51import android.telephony.CellInfoWcdma;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080052import android.telephony.CellLocation;
Nathan Haroldcea413a2015-11-23 15:48:10 -080053import android.telephony.CellSignalStrengthCdma;
54import android.telephony.CellSignalStrengthGsm;
55import android.telephony.CellSignalStrengthLte;
56import android.telephony.CellSignalStrengthWcdma;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080057import android.telephony.PhoneStateListener;
Nathan Harold433ca442018-04-23 18:20:43 -070058import android.telephony.PhysicalChannelConfig;
Fan Zhangc7162cd2018-06-18 15:21:41 -070059import android.telephony.PreciseCallState;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080060import android.telephony.ServiceState;
Nathan Harold2b77d742016-03-19 13:22:10 -070061import android.telephony.SignalStrength;
Nathan Haroldcea413a2015-11-23 15:48:10 -080062import android.telephony.SubscriptionManager;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080063import android.telephony.TelephonyManager;
jsh534f5ae2009-09-24 09:19:22 -070064import android.telephony.cdma.CdmaCellLocation;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080065import android.telephony.gsm.GsmCellLocation;
Nathan Harold6e16fdf2018-04-17 17:01:32 -070066import android.text.TextUtils;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080067import android.util.Log;
68import android.view.Menu;
69import android.view.MenuItem;
70import android.view.View;
71import android.view.View.OnClickListener;
72import android.widget.AdapterView;
73import android.widget.ArrayAdapter;
74import android.widget.Button;
Nathan Harold2b77d742016-03-19 13:22:10 -070075import android.widget.CompoundButton;
76import android.widget.CompoundButton.OnCheckedChangeListener;
Jason Monk39b46742015-09-10 15:52:51 -040077import android.widget.EditText;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080078import android.widget.Spinner;
Nathan Harold2b77d742016-03-19 13:22:10 -070079import android.widget.Switch;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080080import android.widget.TextView;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080081
Fan Zhang23f8d592018-08-28 15:11:40 -070082import androidx.appcompat.app.AlertDialog;
83
Jason Monk39b46742015-09-10 15:52:51 -040084import com.android.ims.ImsConfig;
85import com.android.ims.ImsException;
86import com.android.ims.ImsManager;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080087import com.android.internal.telephony.Phone;
88import com.android.internal.telephony.PhoneFactory;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080089
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080090import java.io.IOException;
Jason Monk39b46742015-09-10 15:52:51 -040091import java.net.HttpURLConnection;
92import java.net.URL;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080093import java.util.List;
94
95public class RadioInfo extends Activity {
Nathan Harold2b77d742016-03-19 13:22:10 -070096 private static final String TAG = "RadioInfo";
johnwang342101a2009-09-23 16:22:34 -070097
Nathan Harold2b77d742016-03-19 13:22:10 -070098 private static final String[] mPreferredNetworkLabels = {
99 "WCDMA preferred",
100 "GSM only",
101 "WCDMA only",
102 "GSM auto (PRL)",
103 "CDMA auto (PRL)",
104 "CDMA only",
105 "EvDo only",
106 "Global auto (PRL)",
107 "LTE/CDMA auto (PRL)",
108 "LTE/UMTS auto (PRL)",
109 "LTE/CDMA/UMTS auto (PRL)",
110 "LTE only",
111 "LTE/WCDMA",
112 "TD-SCDMA only",
113 "TD-SCDMA/WCDMA",
114 "LTE/TD-SCDMA",
115 "TD-SCDMA/GSM",
116 "TD-SCDMA/UMTS",
117 "LTE/TD-SCDMA/WCDMA",
118 "LTE/TD-SCDMA/UMTS",
119 "TD-SCDMA/CDMA/UMTS",
120 "Global/TD-SCDMA",
121 "Unknown"
122 };
123
124
125 private static final int CELL_INFO_LIST_RATE_DISABLED = Integer.MAX_VALUE;
126 private static final int CELL_INFO_LIST_RATE_MAX = 0;
127
Nathan Harold12e1f552016-06-17 13:55:38 -0700128
129 private static final int IMS_VOLTE_PROVISIONED_CONFIG_ID =
130 ImsConfig.ConfigConstants.VLT_SETTING_ENABLED;
131
132 private static final int IMS_VT_PROVISIONED_CONFIG_ID =
133 ImsConfig.ConfigConstants.LVC_SETTING_ENABLED;
134
135 private static final int IMS_WFC_PROVISIONED_CONFIG_ID =
136 ImsConfig.ConfigConstants.VOICE_OVER_WIFI_SETTING_ENABLED;
137
Meng Wang586741c2017-04-26 15:02:51 -0700138 private static final int EAB_PROVISIONED_CONFIG_ID =
139 ImsConfig.ConfigConstants.EAB_SETTING_ENABLED;
140
Nathan Harold2b77d742016-03-19 13:22:10 -0700141 //Values in must match mCellInfoRefreshRates
142 private static final String[] mCellInfoRefreshRateLabels = {
143 "Disabled",
144 "Immediate",
145 "Min 5s",
146 "Min 10s",
147 "Min 60s"
148 };
149
150 //Values in seconds, must match mCellInfoRefreshRateLabels
151 private static final int mCellInfoRefreshRates[] = {
152 CELL_INFO_LIST_RATE_DISABLED,
153 CELL_INFO_LIST_RATE_MAX,
154 5000,
155 10000,
156 60000
157 };
158
159 private void log(String s) {
160 Log.d(TAG, s);
161 }
162
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800163 private static final int EVENT_CFI_CHANGED = 302;
164
165 private static final int EVENT_QUERY_PREFERRED_TYPE_DONE = 1000;
166 private static final int EVENT_SET_PREFERRED_TYPE_DONE = 1001;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800167 private static final int EVENT_QUERY_SMSC_DONE = 1005;
168 private static final int EVENT_UPDATE_SMSC_DONE = 1006;
169
170 private static final int MENU_ITEM_SELECT_BAND = 0;
171 private static final int MENU_ITEM_VIEW_ADN = 1;
172 private static final int MENU_ITEM_VIEW_FDN = 2;
173 private static final int MENU_ITEM_VIEW_SDN = 3;
Nathan Harolde272c202016-10-27 13:45:00 -0700174 private static final int MENU_ITEM_GET_IMS_STATUS = 4;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800175 private static final int MENU_ITEM_TOGGLE_DATA = 5;
Tammo Spalinka5f4c8f2009-10-15 20:08:58 +0800176
Wink Savillec3886682009-04-02 11:00:56 -0700177 private TextView mDeviceId; //DeviceId is the IMEI in GSM and the MEID in CDMA
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800178 private TextView number;
Meng Wang9053f172017-06-23 16:02:14 -0700179 private TextView mSubscriberId;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800180 private TextView callState;
181 private TextView operatorName;
182 private TextView roamingState;
183 private TextView gsmState;
184 private TextView gprsState;
Nathan Harold2b77d742016-03-19 13:22:10 -0700185 private TextView voiceNetwork;
186 private TextView dataNetwork;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800187 private TextView dBm;
188 private TextView mMwi;
189 private TextView mCfi;
190 private TextView mLocation;
Wink Saville79bff2a2012-06-01 14:37:21 -0700191 private TextView mCellInfo;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800192 private TextView sent;
193 private TextView received;
Nathan Haroldcea413a2015-11-23 15:48:10 -0800194 private TextView mPingHostnameV4;
195 private TextView mPingHostnameV6;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800196 private TextView mHttpClientTest;
Nathan Harold433ca442018-04-23 18:20:43 -0700197 private TextView mPhyChanConfig;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800198 private TextView dnsCheckState;
Nathan Haroldf10ea322018-04-24 13:31:07 -0700199 private TextView mDownlinkKbps;
200 private TextView mUplinkKbps;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800201 private EditText smsc;
Nathan Harold2b77d742016-03-19 13:22:10 -0700202 private Switch radioPowerOnSwitch;
203 private Button cellInfoRefreshRateButton;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800204 private Button dnsCheckToggleButton;
205 private Button pingTestButton;
206 private Button updateSmscButton;
207 private Button refreshSmscButton;
Tammo Spalinka5f4c8f2009-10-15 20:08:58 +0800208 private Button oemInfoButton;
Youhan Wangfd781e92016-12-16 15:53:16 -0800209 private Button carrierProvisioningButton;
210 private Button triggercarrierProvisioningButton;
Nathan Harold12e1f552016-06-17 13:55:38 -0700211 private Switch imsVolteProvisionedSwitch;
212 private Switch imsVtProvisionedSwitch;
213 private Switch imsWfcProvisionedSwitch;
Meng Wang586741c2017-04-26 15:02:51 -0700214 private Switch eabProvisionedSwitch;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800215 private Spinner preferredNetworkType;
Nathan Harold2b77d742016-03-19 13:22:10 -0700216 private Spinner cellInfoRefreshRateSpinner;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800217
Nathan Haroldf10ea322018-04-24 13:31:07 -0700218 private ConnectivityManager mConnectivityManager;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800219 private TelephonyManager mTelephonyManager;
Nathan Haroldcea413a2015-11-23 15:48:10 -0800220 private ImsManager mImsManager = null;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800221 private Phone phone = null;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800222
Nathan Haroldcea413a2015-11-23 15:48:10 -0800223 private String mPingHostnameResultV4;
224 private String mPingHostnameResultV6;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800225 private String mHttpClientTestResult;
226 private boolean mMwiValue = false;
227 private boolean mCfiValue = false;
Nathan Haroldcea413a2015-11-23 15:48:10 -0800228
229 private List<CellInfo> mCellInfoResult = null;
230 private CellLocation mCellLocationResult = null;
Nathan Haroldcea413a2015-11-23 15:48:10 -0800231
232 private int mPreferredNetworkTypeResult;
Nathan Harold2b77d742016-03-19 13:22:10 -0700233 private int mCellInfoRefreshRateIndex;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800234
Nathan Haroldf10ea322018-04-24 13:31:07 -0700235 private final NetworkRequest mDefaultNetworkRequest = new NetworkRequest.Builder()
236 .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
237 .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
238 .build();
239
240 private final NetworkCallback mNetworkCallback = new NetworkCallback() {
241 public void onCapabilitiesChanged(Network n, NetworkCapabilities nc) {
242 int dlbw = nc.getLinkDownstreamBandwidthKbps();
243 int ulbw = nc.getLinkUpstreamBandwidthKbps();
244 updateBandwidths(dlbw, ulbw);
245 }
246 };
247
Nathan Harold2b77d742016-03-19 13:22:10 -0700248 private final PhoneStateListener mPhoneStateListener = new PhoneStateListener() {
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800249 @Override
250 public void onDataConnectionStateChanged(int state) {
251 updateDataState();
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800252 updateNetworkType();
253 }
254
255 @Override
256 public void onDataActivity(int direction) {
257 updateDataStats2();
258 }
259
260 @Override
Nathan Harold2b77d742016-03-19 13:22:10 -0700261 public void onCallStateChanged(int state, String incomingNumber) {
262 updateNetworkType();
263 updatePhoneState(state);
264 }
265
266 @Override
267 public void onPreciseCallStateChanged(PreciseCallState preciseState) {
268 updateNetworkType();
269 }
270
271 @Override
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800272 public void onCellLocationChanged(CellLocation location) {
273 updateLocation(location);
274 }
275
276 @Override
277 public void onMessageWaitingIndicatorChanged(boolean mwi) {
278 mMwiValue = mwi;
279 updateMessageWaiting();
280 }
281
282 @Override
283 public void onCallForwardingIndicatorChanged(boolean cfi) {
284 mCfiValue = cfi;
285 updateCallRedirect();
286 }
Wink Saville79bff2a2012-06-01 14:37:21 -0700287
288 @Override
289 public void onCellInfoChanged(List<CellInfo> arrayCi) {
Wink Savillebf471282013-04-05 15:04:05 -0700290 log("onCellInfoChanged: arrayCi=" + arrayCi);
Nathan Haroldcea413a2015-11-23 15:48:10 -0800291 mCellInfoResult = arrayCi;
292 updateCellInfo(mCellInfoResult);
Wink Saville79bff2a2012-06-01 14:37:21 -0700293 }
Wink Saville4f0d8812014-04-15 22:05:24 -0700294
295 @Override
Nathan Harold2b77d742016-03-19 13:22:10 -0700296 public void onSignalStrengthsChanged(SignalStrength signalStrength) {
297 log("onSignalStrengthChanged: SignalStrength=" +signalStrength);
298 updateSignalStrength(signalStrength);
299 }
300
301 @Override
302 public void onServiceStateChanged(ServiceState serviceState) {
303 log("onServiceStateChanged: ServiceState=" + serviceState);
304 updateServiceState(serviceState);
305 updateRadioPowerState();
306 updateNetworkType();
Nathan Harold12e1f552016-06-17 13:55:38 -0700307 updateImsProvisionedState();
Nathan Harold2b77d742016-03-19 13:22:10 -0700308 }
Nathan Harold433ca442018-04-23 18:20:43 -0700309
310 @Override
311 public void onPhysicalChannelConfigurationChanged(
312 List<PhysicalChannelConfig> configs) {
313 updatePhysicalChannelConfiguration(configs);
314 }
315
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800316 };
317
Nathan Harold433ca442018-04-23 18:20:43 -0700318 private void updatePhysicalChannelConfiguration(List<PhysicalChannelConfig> configs) {
319 StringBuilder sb = new StringBuilder();
320 String div = "";
321 sb.append("{");
322 if (configs != null) {
323 for(PhysicalChannelConfig c : configs) {
324 sb.append(div).append(c);
325 div = ",";
326 }
327 }
328 sb.append("}");
329 mPhyChanConfig.setText(sb.toString());
330 }
331
Nathan Haroldcea413a2015-11-23 15:48:10 -0800332 private void updatePreferredNetworkType(int type) {
333 if (type >= mPreferredNetworkLabels.length || type < 0) {
334 log("EVENT_QUERY_PREFERRED_TYPE_DONE: unknown " +
335 "type=" + type);
336 type = mPreferredNetworkLabels.length - 1; //set to Unknown
337 }
338 mPreferredNetworkTypeResult = type;
339
340 preferredNetworkType.setSelection(mPreferredNetworkTypeResult, true);
341 }
342
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800343 private Handler mHandler = new Handler() {
Nathan Haroldcea413a2015-11-23 15:48:10 -0800344 @Override
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800345 public void handleMessage(Message msg) {
346 AsyncResult ar;
347 switch (msg.what) {
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800348 case EVENT_QUERY_PREFERRED_TYPE_DONE:
349 ar= (AsyncResult) msg.obj;
Nathan Haroldcea413a2015-11-23 15:48:10 -0800350 if (ar.exception == null && ar.result != null) {
351 updatePreferredNetworkType(((int[])ar.result)[0]);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800352 } else {
Nathan Haroldcea413a2015-11-23 15:48:10 -0800353 //In case of an exception, we will set this to unknown
354 updatePreferredNetworkType(mPreferredNetworkLabels.length-1);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800355 }
356 break;
357 case EVENT_SET_PREFERRED_TYPE_DONE:
358 ar= (AsyncResult) msg.obj;
359 if (ar.exception != null) {
Nathan Harolded38afa2016-04-13 00:29:30 -0700360 log("Set preferred network type failed.");
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800361 }
362 break;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800363 case EVENT_QUERY_SMSC_DONE:
364 ar= (AsyncResult) msg.obj;
365 if (ar.exception != null) {
366 smsc.setText("refresh error");
367 } else {
jsh21dd4072009-05-12 11:26:55 -0700368 smsc.setText((String)ar.result);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800369 }
370 break;
371 case EVENT_UPDATE_SMSC_DONE:
372 updateSmscButton.setEnabled(true);
373 ar= (AsyncResult) msg.obj;
374 if (ar.exception != null) {
375 smsc.setText("update error");
376 }
377 break;
378 default:
Nathan Haroldcea413a2015-11-23 15:48:10 -0800379 super.handleMessage(msg);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800380 break;
381
382 }
383 }
384 };
385
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800386 @Override
387 public void onCreate(Bundle icicle) {
388 super.onCreate(icicle);
fionaxub54cb2d2016-09-22 15:01:05 -0700389 if (!android.os.Process.myUserHandle().isSystem()) {
390 Log.e(TAG, "Not run from system user, don't do anything.");
391 finish();
392 return;
393 }
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800394
395 setContentView(R.layout.radio_info);
396
Nathan Haroldcea413a2015-11-23 15:48:10 -0800397 log("Started onCreate");
398
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800399 mTelephonyManager = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
Nathan Haroldf10ea322018-04-24 13:31:07 -0700400 mConnectivityManager = (ConnectivityManager)getSystemService(CONNECTIVITY_SERVICE);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800401 phone = PhoneFactory.getDefaultPhone();
402
Nathan Haroldcea413a2015-11-23 15:48:10 -0800403 //TODO: Need to update this if the default phoneId changes?
404 // Better to have an instance per phone?
405 mImsManager = ImsManager.getInstance(getApplicationContext(),
406 SubscriptionManager.getDefaultVoicePhoneId());
407
Meng Wang9053f172017-06-23 16:02:14 -0700408 mDeviceId = (TextView) findViewById(R.id.imei);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800409 number = (TextView) findViewById(R.id.number);
Meng Wang9053f172017-06-23 16:02:14 -0700410 mSubscriberId = (TextView) findViewById(R.id.imsi);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800411 callState = (TextView) findViewById(R.id.call);
412 operatorName = (TextView) findViewById(R.id.operator);
413 roamingState = (TextView) findViewById(R.id.roaming);
414 gsmState = (TextView) findViewById(R.id.gsm);
415 gprsState = (TextView) findViewById(R.id.gprs);
Nathan Harold2b77d742016-03-19 13:22:10 -0700416 voiceNetwork = (TextView) findViewById(R.id.voice_network);
417 dataNetwork = (TextView) findViewById(R.id.data_network);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800418 dBm = (TextView) findViewById(R.id.dbm);
419 mMwi = (TextView) findViewById(R.id.mwi);
420 mCfi = (TextView) findViewById(R.id.cfi);
421 mLocation = (TextView) findViewById(R.id.location);
Wink Saville79bff2a2012-06-01 14:37:21 -0700422 mCellInfo = (TextView) findViewById(R.id.cellinfo);
Nathan Haroldcea413a2015-11-23 15:48:10 -0800423 mCellInfo.setTypeface(Typeface.MONOSPACE);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800424
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800425 sent = (TextView) findViewById(R.id.sent);
426 received = (TextView) findViewById(R.id.received);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800427 smsc = (EditText) findViewById(R.id.smsc);
428 dnsCheckState = (TextView) findViewById(R.id.dnsCheckState);
Nathan Haroldcea413a2015-11-23 15:48:10 -0800429 mPingHostnameV4 = (TextView) findViewById(R.id.pingHostnameV4);
430 mPingHostnameV6 = (TextView) findViewById(R.id.pingHostnameV6);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800431 mHttpClientTest = (TextView) findViewById(R.id.httpClientTest);
432
Nathan Harold433ca442018-04-23 18:20:43 -0700433 mPhyChanConfig = (TextView) findViewById(R.id.phy_chan_config);
434
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800435 preferredNetworkType = (Spinner) findViewById(R.id.preferredNetworkType);
436 ArrayAdapter<String> adapter = new ArrayAdapter<String> (this,
437 android.R.layout.simple_spinner_item, mPreferredNetworkLabels);
johnwang342101a2009-09-23 16:22:34 -0700438 adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800439 preferredNetworkType.setAdapter(adapter);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800440
Nathan Harold2b77d742016-03-19 13:22:10 -0700441 cellInfoRefreshRateSpinner = (Spinner) findViewById(R.id.cell_info_rate_select);
442 ArrayAdapter<String> cellInfoAdapter = new ArrayAdapter<String>(this,
443 android.R.layout.simple_spinner_item, mCellInfoRefreshRateLabels);
444 cellInfoAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
445 cellInfoRefreshRateSpinner.setAdapter(cellInfoAdapter);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800446
Nathan Harold12e1f552016-06-17 13:55:38 -0700447 imsVolteProvisionedSwitch = (Switch) findViewById(R.id.volte_provisioned_switch);
448 imsVtProvisionedSwitch = (Switch) findViewById(R.id.vt_provisioned_switch);
449 imsWfcProvisionedSwitch = (Switch) findViewById(R.id.wfc_provisioned_switch);
Meng Wang69439b52017-05-01 08:31:14 -0700450 eabProvisionedSwitch = (Switch) findViewById(R.id.eab_provisioned_switch);
Wink Savillebf471282013-04-05 15:04:05 -0700451
Nathan Harold2b77d742016-03-19 13:22:10 -0700452 radioPowerOnSwitch = (Switch) findViewById(R.id.radio_power);
Wink Saville426fc662011-09-25 14:39:02 -0700453
Nathan Haroldf10ea322018-04-24 13:31:07 -0700454 mDownlinkKbps = (TextView) findViewById(R.id.dl_kbps);
455 mUplinkKbps = (TextView) findViewById(R.id.ul_kbps);
456 updateBandwidths(0, 0);
457
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800458 pingTestButton = (Button) findViewById(R.id.ping_test);
459 pingTestButton.setOnClickListener(mPingButtonHandler);
460 updateSmscButton = (Button) findViewById(R.id.update_smsc);
461 updateSmscButton.setOnClickListener(mUpdateSmscButtonHandler);
462 refreshSmscButton = (Button) findViewById(R.id.refresh_smsc);
463 refreshSmscButton.setOnClickListener(mRefreshSmscButtonHandler);
464 dnsCheckToggleButton = (Button) findViewById(R.id.dns_check_toggle);
465 dnsCheckToggleButton.setOnClickListener(mDnsCheckButtonHandler);
Youhan Wangfd781e92016-12-16 15:53:16 -0800466 carrierProvisioningButton = (Button) findViewById(R.id.carrier_provisioning);
467 carrierProvisioningButton.setOnClickListener(mCarrierProvisioningButtonHandler);
468 triggercarrierProvisioningButton = (Button) findViewById(R.id.trigger_carrier_provisioning);
469 triggercarrierProvisioningButton.setOnClickListener(
470 mTriggerCarrierProvisioningButtonHandler);
johnwang342101a2009-09-23 16:22:34 -0700471
Tammo Spalinka5f4c8f2009-10-15 20:08:58 +0800472 oemInfoButton = (Button) findViewById(R.id.oem_info);
473 oemInfoButton.setOnClickListener(mOemInfoButtonHandler);
474 PackageManager pm = getPackageManager();
475 Intent oemInfoIntent = new Intent("com.android.settings.OEM_RADIO_INFO");
476 List<ResolveInfo> oemInfoIntentList = pm.queryIntentActivities(oemInfoIntent, 0);
477 if (oemInfoIntentList.size() == 0) {
478 oemInfoButton.setEnabled(false);
479 }
480
Nathan Harolded38afa2016-04-13 00:29:30 -0700481 mCellInfoRefreshRateIndex = 0; //disabled
Nathan Haroldcea413a2015-11-23 15:48:10 -0800482 mPreferredNetworkTypeResult = mPreferredNetworkLabels.length - 1; //Unknown
483
484 //FIXME: Replace with TelephonyManager call
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800485 phone.getPreferredNetworkType(
486 mHandler.obtainMessage(EVENT_QUERY_PREFERRED_TYPE_DONE));
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800487
Nathan Haroldcea413a2015-11-23 15:48:10 -0800488 restoreFromBundle(icicle);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800489 }
490
491 @Override
492 protected void onResume() {
493 super.onResume();
494
Nathan Haroldcea413a2015-11-23 15:48:10 -0800495 log("Started onResume");
496
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800497 updateMessageWaiting();
498 updateCallRedirect();
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800499 updateDataState();
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800500 updateDataStats2();
Nathan Harold2b77d742016-03-19 13:22:10 -0700501 updateRadioPowerState();
Nathan Harold12e1f552016-06-17 13:55:38 -0700502 updateImsProvisionedState();
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800503 updateProperties();
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800504 updateDnsCheckState();
Nathan Harold2b77d742016-03-19 13:22:10 -0700505 updateNetworkType();
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800506
Nathan Haroldcea413a2015-11-23 15:48:10 -0800507 updateLocation(mCellLocationResult);
508 updateCellInfo(mCellInfoResult);
509
510 mPingHostnameV4.setText(mPingHostnameResultV4);
511 mPingHostnameV6.setText(mPingHostnameResultV6);
512 mHttpClientTest.setText(mHttpClientTestResult);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800513
Nathan Harold2b77d742016-03-19 13:22:10 -0700514 cellInfoRefreshRateSpinner.setOnItemSelectedListener(mCellInfoRefreshRateHandler);
Nathan Harolded38afa2016-04-13 00:29:30 -0700515 //set selection after registering listener to force update
516 cellInfoRefreshRateSpinner.setSelection(mCellInfoRefreshRateIndex);
517
518 //set selection before registering to prevent update
519 preferredNetworkType.setSelection(mPreferredNetworkTypeResult, true);
Nathan Harold2b77d742016-03-19 13:22:10 -0700520 preferredNetworkType.setOnItemSelectedListener(mPreferredNetworkHandler);
Nathan Harolded38afa2016-04-13 00:29:30 -0700521
Nathan Harold2b77d742016-03-19 13:22:10 -0700522 radioPowerOnSwitch.setOnCheckedChangeListener(mRadioPowerOnChangeListener);
Nathan Harold12e1f552016-06-17 13:55:38 -0700523 imsVolteProvisionedSwitch.setOnCheckedChangeListener(mImsVolteCheckedChangeListener);
524 imsVtProvisionedSwitch.setOnCheckedChangeListener(mImsVtCheckedChangeListener);
525 imsWfcProvisionedSwitch.setOnCheckedChangeListener(mImsWfcCheckedChangeListener);
Meng Wang586741c2017-04-26 15:02:51 -0700526 eabProvisionedSwitch.setOnCheckedChangeListener(mEabCheckedChangeListener);
Nathan Harold2b77d742016-03-19 13:22:10 -0700527
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800528 mTelephonyManager.listen(mPhoneStateListener,
Nathan Harold2b77d742016-03-19 13:22:10 -0700529 PhoneStateListener.LISTEN_CALL_STATE
530 //b/27803938 - RadioInfo currently cannot read PRECISE_CALL_STATE
531 // | PhoneStateListener.LISTEN_PRECISE_CALL_STATE
532 | PhoneStateListener.LISTEN_DATA_CONNECTION_STATE
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800533 | PhoneStateListener.LISTEN_DATA_ACTIVITY
534 | PhoneStateListener.LISTEN_CELL_LOCATION
535 | PhoneStateListener.LISTEN_MESSAGE_WAITING_INDICATOR
Wink Saville79bff2a2012-06-01 14:37:21 -0700536 | PhoneStateListener.LISTEN_CALL_FORWARDING_INDICATOR
Wink Saville4f0d8812014-04-15 22:05:24 -0700537 | PhoneStateListener.LISTEN_CELL_INFO
Nathan Harold2b77d742016-03-19 13:22:10 -0700538 | PhoneStateListener.LISTEN_SERVICE_STATE
539 | PhoneStateListener.LISTEN_SIGNAL_STRENGTHS
Nathan Harold433ca442018-04-23 18:20:43 -0700540 | PhoneStateListener.LISTEN_PHYSICAL_CHANNEL_CONFIGURATION);
Nathan Harolded38afa2016-04-13 00:29:30 -0700541
Nathan Haroldf10ea322018-04-24 13:31:07 -0700542 mConnectivityManager.registerNetworkCallback(
543 mDefaultNetworkRequest, mNetworkCallback, mHandler);
544
Nathan Harolded38afa2016-04-13 00:29:30 -0700545 smsc.clearFocus();
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800546 }
547
548 @Override
Nathan Haroldcea413a2015-11-23 15:48:10 -0800549 protected void onPause() {
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800550 super.onPause();
551
Wink Savillebf471282013-04-05 15:04:05 -0700552 log("onPause: unregister phone & data intents");
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800553
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800554 mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE);
Sooraj Sasindran5cce06b2016-08-18 15:49:49 -0700555 mTelephonyManager.setCellInfoListRate(CELL_INFO_LIST_RATE_DISABLED);
Nathan Haroldf10ea322018-04-24 13:31:07 -0700556 mConnectivityManager.unregisterNetworkCallback(mNetworkCallback);
557
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800558 }
559
Nathan Haroldcea413a2015-11-23 15:48:10 -0800560 private void restoreFromBundle(Bundle b) {
Nathan Harolde272c202016-10-27 13:45:00 -0700561 if(b == null) {
Nathan Haroldcea413a2015-11-23 15:48:10 -0800562 return;
563 }
564
565 mPingHostnameResultV4 = b.getString("mPingHostnameResultV4","");
566 mPingHostnameResultV6 = b.getString("mPingHostnameResultV6","");
567 mHttpClientTestResult = b.getString("mHttpClientTestResult","");
568
569 mPingHostnameV4.setText(mPingHostnameResultV4);
570 mPingHostnameV6.setText(mPingHostnameResultV6);
571 mHttpClientTest.setText(mHttpClientTestResult);
572
Nathan Harold2b77d742016-03-19 13:22:10 -0700573 mPreferredNetworkTypeResult = b.getInt("mPreferredNetworkTypeResult",
574 mPreferredNetworkLabels.length - 1);
575
576 mCellInfoRefreshRateIndex = b.getInt("mCellInfoRefreshRateIndex", 0);
Nathan Haroldcea413a2015-11-23 15:48:10 -0800577 }
578
579 @Override
580 protected void onSaveInstanceState(Bundle outState) {
581 outState.putString("mPingHostnameResultV4", mPingHostnameResultV4);
582 outState.putString("mPingHostnameResultV6", mPingHostnameResultV6);
583 outState.putString("mHttpClientTestResult", mHttpClientTestResult);
Nathan Harold2b77d742016-03-19 13:22:10 -0700584
Nathan Haroldcea413a2015-11-23 15:48:10 -0800585 outState.putInt("mPreferredNetworkTypeResult", mPreferredNetworkTypeResult);
Nathan Harold2b77d742016-03-19 13:22:10 -0700586 outState.putInt("mCellInfoRefreshRateIndex", mCellInfoRefreshRateIndex);
587
Nathan Haroldcea413a2015-11-23 15:48:10 -0800588 }
589
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800590 @Override
591 public boolean onCreateOptionsMenu(Menu menu) {
Wink Savillec3886682009-04-02 11:00:56 -0700592 menu.add(0, MENU_ITEM_SELECT_BAND, 0, R.string.radio_info_band_mode_label)
593 .setOnMenuItemClickListener(mSelectBandCallback)
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800594 .setAlphabeticShortcut('b');
595 menu.add(1, MENU_ITEM_VIEW_ADN, 0,
596 R.string.radioInfo_menu_viewADN).setOnMenuItemClickListener(mViewADNCallback);
597 menu.add(1, MENU_ITEM_VIEW_FDN, 0,
598 R.string.radioInfo_menu_viewFDN).setOnMenuItemClickListener(mViewFDNCallback);
599 menu.add(1, MENU_ITEM_VIEW_SDN, 0,
600 R.string.radioInfo_menu_viewSDN).setOnMenuItemClickListener(mViewSDNCallback);
Nathan Harolde272c202016-10-27 13:45:00 -0700601 menu.add(1, MENU_ITEM_GET_IMS_STATUS,
602 0, R.string.radioInfo_menu_getIMS).setOnMenuItemClickListener(mGetImsStatus);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800603 menu.add(1, MENU_ITEM_TOGGLE_DATA,
Nathan Harold2b77d742016-03-19 13:22:10 -0700604 0, R.string.radio_info_data_connection_disable).setOnMenuItemClickListener(mToggleData);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800605 return true;
606 }
607
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800608 @Override
Wink Savillec3886682009-04-02 11:00:56 -0700609 public boolean onPrepareOptionsMenu(Menu menu) {
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800610 // Get the TOGGLE DATA menu item in the right state.
611 MenuItem item = menu.findItem(MENU_ITEM_TOGGLE_DATA);
612 int state = mTelephonyManager.getDataState();
613 boolean visible = true;
614
615 switch (state) {
616 case TelephonyManager.DATA_CONNECTED:
617 case TelephonyManager.DATA_SUSPENDED:
Nathan Harold2b77d742016-03-19 13:22:10 -0700618 item.setTitle(R.string.radio_info_data_connection_disable);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800619 break;
620 case TelephonyManager.DATA_DISCONNECTED:
Nathan Harold2b77d742016-03-19 13:22:10 -0700621 item.setTitle(R.string.radio_info_data_connection_enable);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800622 break;
623 default:
624 visible = false;
625 break;
626 }
627 item.setVisible(visible);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800628 return true;
629 }
630
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800631 private void updateDnsCheckState() {
Nathan Haroldcea413a2015-11-23 15:48:10 -0800632 //FIXME: Replace with a TelephonyManager call
Mike Lockwood5304c7e2009-04-05 11:37:45 -0700633 dnsCheckState.setText(phone.isDnsCheckDisabled() ?
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800634 "0.0.0.0 allowed" :"0.0.0.0 not allowed");
635 }
Wink Savillee2a14e32009-05-29 14:06:30 -0700636
Nathan Haroldf10ea322018-04-24 13:31:07 -0700637 private void updateBandwidths(int dlbw, int ulbw) {
638 dlbw = (dlbw < 0 || dlbw == Integer.MAX_VALUE) ? -1 : dlbw;
639 ulbw = (ulbw < 0 || ulbw == Integer.MAX_VALUE) ? -1 : ulbw;
640 mDownlinkKbps.setText(String.format("%-5d", dlbw));
641 mUplinkKbps.setText(String.format("%-5d", ulbw));
642 }
643
644
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800645 private final void
Nathan Harold2b77d742016-03-19 13:22:10 -0700646 updateSignalStrength(SignalStrength signalStrength) {
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800647 Resources r = getResources();
648
Nathan Harold2b77d742016-03-19 13:22:10 -0700649 int signalDbm = signalStrength.getDbm();
Wink Savillee2a14e32009-05-29 14:06:30 -0700650
Nathan Harold2b77d742016-03-19 13:22:10 -0700651 int signalAsu = signalStrength.getAsuLevel();
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800652
653 if (-1 == signalAsu) signalAsu = 0;
654
655 dBm.setText(String.valueOf(signalDbm) + " "
656 + r.getString(R.string.radioInfo_display_dbm) + " "
657 + String.valueOf(signalAsu) + " "
658 + r.getString(R.string.radioInfo_display_asu));
659 }
660
661 private final void updateLocation(CellLocation location) {
jsh534f5ae2009-09-24 09:19:22 -0700662 Resources r = getResources();
Wink Savillec3886682009-04-02 11:00:56 -0700663 if (location instanceof GsmCellLocation) {
664 GsmCellLocation loc = (GsmCellLocation)location;
jsh534f5ae2009-09-24 09:19:22 -0700665 int lac = loc.getLac();
666 int cid = loc.getCid();
667 mLocation.setText(r.getString(R.string.radioInfo_lac) + " = "
668 + ((lac == -1) ? "unknown" : Integer.toHexString(lac))
669 + " "
670 + r.getString(R.string.radioInfo_cid) + " = "
671 + ((cid == -1) ? "unknown" : Integer.toHexString(cid)));
672 } else if (location instanceof CdmaCellLocation) {
673 CdmaCellLocation loc = (CdmaCellLocation)location;
674 int bid = loc.getBaseStationId();
675 int sid = loc.getSystemId();
676 int nid = loc.getNetworkId();
677 int lat = loc.getBaseStationLatitude();
678 int lon = loc.getBaseStationLongitude();
679 mLocation.setText("BID = "
680 + ((bid == -1) ? "unknown" : Integer.toHexString(bid))
681 + " "
682 + "SID = "
683 + ((sid == -1) ? "unknown" : Integer.toHexString(sid))
684 + " "
685 + "NID = "
686 + ((nid == -1) ? "unknown" : Integer.toHexString(nid))
687 + "\n"
688 + "LAT = "
689 + ((lat == -1) ? "unknown" : Integer.toHexString(lat))
690 + " "
691 + "LONG = "
692 + ((lon == -1) ? "unknown" : Integer.toHexString(lon)));
693 } else {
694 mLocation.setText("unknown");
Wink Savillec3886682009-04-02 11:00:56 -0700695 }
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800696
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800697
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800698 }
699
Nathan Haroldcea413a2015-11-23 15:48:10 -0800700 private final String getCellInfoDisplayString(int i) {
701 return (i != Integer.MAX_VALUE) ? Integer.toString(i) : "";
702 }
703
704 private final String getCellInfoDisplayString(long i) {
705 return (i != Long.MAX_VALUE) ? Long.toString(i) : "";
706 }
707
Nathan Harold6e16fdf2018-04-17 17:01:32 -0700708 private final String getConnectionStatusString(CellInfo ci) {
709 String regStr = "";
710 String connStatStr = "";
711 String connector = "";
712
713 if (ci.isRegistered()) {
714 regStr = "R";
715 }
716 switch (ci.getCellConnectionStatus()) {
717 case CellInfo.CONNECTION_PRIMARY_SERVING: connStatStr = "P"; break;
718 case CellInfo.CONNECTION_SECONDARY_SERVING: connStatStr = "S"; break;
719 case CellInfo.CONNECTION_NONE: connStatStr = "N"; break;
720 case CellInfo.CONNECTION_UNKNOWN: /* Field is unsupported */ break;
721 default: break;
722 }
723 if (!TextUtils.isEmpty(regStr) && !TextUtils.isEmpty(connStatStr)) {
724 connector = "+";
725 }
726
727 return regStr + connector + connStatStr;
728 }
729
Nathan Haroldcea413a2015-11-23 15:48:10 -0800730 private final String buildCdmaInfoString(CellInfoCdma ci) {
731 CellIdentityCdma cidCdma = ci.getCellIdentity();
732 CellSignalStrengthCdma ssCdma = ci.getCellSignalStrength();
733
734 return String.format("%-3.3s %-5.5s %-5.5s %-5.5s %-6.6s %-6.6s %-6.6s %-6.6s %-5.5s",
Nathan Harold6e16fdf2018-04-17 17:01:32 -0700735 getConnectionStatusString(ci),
Nathan Haroldcea413a2015-11-23 15:48:10 -0800736 getCellInfoDisplayString(cidCdma.getSystemId()),
737 getCellInfoDisplayString(cidCdma.getNetworkId()),
738 getCellInfoDisplayString(cidCdma.getBasestationId()),
739 getCellInfoDisplayString(ssCdma.getCdmaDbm()),
740 getCellInfoDisplayString(ssCdma.getCdmaEcio()),
741 getCellInfoDisplayString(ssCdma.getEvdoDbm()),
742 getCellInfoDisplayString(ssCdma.getEvdoEcio()),
743 getCellInfoDisplayString(ssCdma.getEvdoSnr()));
744 }
745
746 private final String buildGsmInfoString(CellInfoGsm ci) {
747 CellIdentityGsm cidGsm = ci.getCellIdentity();
748 CellSignalStrengthGsm ssGsm = ci.getCellSignalStrength();
749
Nathan Harold2b77d742016-03-19 13:22:10 -0700750 return String.format("%-3.3s %-3.3s %-3.3s %-5.5s %-5.5s %-6.6s %-4.4s %-4.4s\n",
Nathan Harold6e16fdf2018-04-17 17:01:32 -0700751 getConnectionStatusString(ci),
Nathan Haroldcea413a2015-11-23 15:48:10 -0800752 getCellInfoDisplayString(cidGsm.getMcc()),
753 getCellInfoDisplayString(cidGsm.getMnc()),
754 getCellInfoDisplayString(cidGsm.getLac()),
755 getCellInfoDisplayString(cidGsm.getCid()),
Nathan Harold2b77d742016-03-19 13:22:10 -0700756 getCellInfoDisplayString(cidGsm.getArfcn()),
757 getCellInfoDisplayString(cidGsm.getBsic()),
Nathan Haroldcea413a2015-11-23 15:48:10 -0800758 getCellInfoDisplayString(ssGsm.getDbm()));
759 }
760
761 private final String buildLteInfoString(CellInfoLte ci) {
762 CellIdentityLte cidLte = ci.getCellIdentity();
763 CellSignalStrengthLte ssLte = ci.getCellSignalStrength();
764
765 return String.format(
Nathan Harold6e16fdf2018-04-17 17:01:32 -0700766 "%-3.3s %-3.3s %-3.3s %-5.5s %-5.5s %-3.3s %-6.6s %-2.2s %-4.4s %-4.4s %-2.2s\n",
767 getConnectionStatusString(ci),
Nathan Haroldcea413a2015-11-23 15:48:10 -0800768 getCellInfoDisplayString(cidLte.getMcc()),
769 getCellInfoDisplayString(cidLte.getMnc()),
770 getCellInfoDisplayString(cidLte.getTac()),
771 getCellInfoDisplayString(cidLte.getCi()),
772 getCellInfoDisplayString(cidLte.getPci()),
Nathan Harold2b77d742016-03-19 13:22:10 -0700773 getCellInfoDisplayString(cidLte.getEarfcn()),
Nathan Harold6e16fdf2018-04-17 17:01:32 -0700774 getCellInfoDisplayString(cidLte.getBandwidth()),
Nathan Haroldcea413a2015-11-23 15:48:10 -0800775 getCellInfoDisplayString(ssLte.getDbm()),
776 getCellInfoDisplayString(ssLte.getRsrq()),
777 getCellInfoDisplayString(ssLte.getTimingAdvance()));
778 }
779
780 private final String buildWcdmaInfoString(CellInfoWcdma ci) {
781 CellIdentityWcdma cidWcdma = ci.getCellIdentity();
782 CellSignalStrengthWcdma ssWcdma = ci.getCellSignalStrength();
783
Nathan Harold2b77d742016-03-19 13:22:10 -0700784 return String.format("%-3.3s %-3.3s %-3.3s %-5.5s %-5.5s %-6.6s %-3.3s %-4.4s\n",
Nathan Harold6e16fdf2018-04-17 17:01:32 -0700785 getConnectionStatusString(ci),
Nathan Haroldcea413a2015-11-23 15:48:10 -0800786 getCellInfoDisplayString(cidWcdma.getMcc()),
787 getCellInfoDisplayString(cidWcdma.getMnc()),
788 getCellInfoDisplayString(cidWcdma.getLac()),
789 getCellInfoDisplayString(cidWcdma.getCid()),
Nathan Harold2b77d742016-03-19 13:22:10 -0700790 getCellInfoDisplayString(cidWcdma.getUarfcn()),
Nathan Haroldcea413a2015-11-23 15:48:10 -0800791 getCellInfoDisplayString(cidWcdma.getPsc()),
792 getCellInfoDisplayString(ssWcdma.getDbm()));
793 }
794
795 private final String buildCellInfoString(List<CellInfo> arrayCi) {
796 String value = new String();
797 StringBuilder cdmaCells = new StringBuilder(),
798 gsmCells = new StringBuilder(),
799 lteCells = new StringBuilder(),
800 wcdmaCells = new StringBuilder();
801
802 if (arrayCi != null) {
803 for (CellInfo ci : arrayCi) {
804
805 if (ci instanceof CellInfoLte) {
806 lteCells.append(buildLteInfoString((CellInfoLte) ci));
807 } else if (ci instanceof CellInfoWcdma) {
808 wcdmaCells.append(buildWcdmaInfoString((CellInfoWcdma) ci));
809 } else if (ci instanceof CellInfoGsm) {
810 gsmCells.append(buildGsmInfoString((CellInfoGsm) ci));
811 } else if (ci instanceof CellInfoCdma) {
812 cdmaCells.append(buildCdmaInfoString((CellInfoCdma) ci));
Wink Saville79bff2a2012-06-01 14:37:21 -0700813 }
814 }
Nathan Haroldcea413a2015-11-23 15:48:10 -0800815 if (lteCells.length() != 0) {
816 value += String.format(
Nathan Harold6e16fdf2018-04-17 17:01:32 -0700817 "LTE\n%-3.3s %-3.3s %-3.3s %-5.5s %-5.5s %-3.3s"
818 + " %-6.6s %-2.2s %-4.4s %-4.4s %-2.2s\n",
819 "SRV", "MCC", "MNC", "TAC", "CID", "PCI",
820 "EARFCN", "BW", "RSRP", "RSRQ", "TA");
Nathan Haroldcea413a2015-11-23 15:48:10 -0800821 value += lteCells.toString();
822 }
823 if (wcdmaCells.length() != 0) {
Nathan Harold6e16fdf2018-04-17 17:01:32 -0700824 value += String.format(
825 "WCDMA\n%-3.3s %-3.3s %-3.3s %-5.5s %-5.5s %-6.6s %-3.3s %-4.4s\n",
Nathan Harold2b77d742016-03-19 13:22:10 -0700826 "SRV", "MCC", "MNC", "LAC", "CID", "UARFCN", "PSC", "RSCP");
Nathan Haroldcea413a2015-11-23 15:48:10 -0800827 value += wcdmaCells.toString();
828 }
829 if (gsmCells.length() != 0) {
Nathan Harold6e16fdf2018-04-17 17:01:32 -0700830 value += String.format(
831 "GSM\n%-3.3s %-3.3s %-3.3s %-5.5s %-5.5s %-6.6s %-4.4s %-4.4s\n",
Nathan Harold2b77d742016-03-19 13:22:10 -0700832 "SRV", "MCC", "MNC", "LAC", "CID", "ARFCN", "BSIC", "RSSI");
Nathan Haroldcea413a2015-11-23 15:48:10 -0800833 value += gsmCells.toString();
834 }
835 if (cdmaCells.length() != 0) {
836 value += String.format(
837 "CDMA/EVDO\n%-3.3s %-5.5s %-5.5s %-5.5s %-6.6s %-6.6s %-6.6s %-6.6s %-5.5s\n",
838 "SRV", "SID", "NID", "BSID", "C-RSSI", "C-ECIO", "E-RSSI", "E-ECIO", "E-SNR");
839 value += cdmaCells.toString();
840 }
841 } else {
842 value ="unknown";
Wink Saville79bff2a2012-06-01 14:37:21 -0700843 }
Nathan Haroldcea413a2015-11-23 15:48:10 -0800844
845 return value.toString();
846 }
847
848 private final void updateCellInfo(List<CellInfo> arrayCi) {
849 mCellInfo.setText(buildCellInfoString(arrayCi));
Wink Saville79bff2a2012-06-01 14:37:21 -0700850 }
851
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800852 private final void
853 updateMessageWaiting() {
854 mMwi.setText(String.valueOf(mMwiValue));
855 }
856
857 private final void
858 updateCallRedirect() {
859 mCfi.setText(String.valueOf(mCfiValue));
860 }
861
862
863 private final void
Nathan Harold2b77d742016-03-19 13:22:10 -0700864 updateServiceState(ServiceState serviceState) {
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800865 int state = serviceState.getState();
866 Resources r = getResources();
867 String display = r.getString(R.string.radioInfo_unknown);
johnwang342101a2009-09-23 16:22:34 -0700868
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800869 switch (state) {
870 case ServiceState.STATE_IN_SERVICE:
871 display = r.getString(R.string.radioInfo_service_in);
872 break;
873 case ServiceState.STATE_OUT_OF_SERVICE:
874 case ServiceState.STATE_EMERGENCY_ONLY:
875 display = r.getString(R.string.radioInfo_service_emergency);
876 break;
877 case ServiceState.STATE_POWER_OFF:
878 display = r.getString(R.string.radioInfo_service_off);
879 break;
880 }
johnwang342101a2009-09-23 16:22:34 -0700881
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800882 gsmState.setText(display);
johnwang342101a2009-09-23 16:22:34 -0700883
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800884 if (serviceState.getRoaming()) {
885 roamingState.setText(R.string.radioInfo_roaming_in);
886 } else {
887 roamingState.setText(R.string.radioInfo_roaming_not);
888 }
889
890 operatorName.setText(serviceState.getOperatorAlphaLong());
891 }
892
893 private final void
Nathan Harold2b77d742016-03-19 13:22:10 -0700894 updatePhoneState(int state) {
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800895 Resources r = getResources();
896 String display = r.getString(R.string.radioInfo_unknown);
897
898 switch (state) {
Nathan Harold2b77d742016-03-19 13:22:10 -0700899 case TelephonyManager.CALL_STATE_IDLE:
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800900 display = r.getString(R.string.radioInfo_phone_idle);
901 break;
Nathan Harold2b77d742016-03-19 13:22:10 -0700902 case TelephonyManager.CALL_STATE_RINGING:
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800903 display = r.getString(R.string.radioInfo_phone_ringing);
904 break;
Nathan Harold2b77d742016-03-19 13:22:10 -0700905 case TelephonyManager.CALL_STATE_OFFHOOK:
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800906 display = r.getString(R.string.radioInfo_phone_offhook);
907 break;
908 }
909
910 callState.setText(display);
911 }
912
913 private final void
914 updateDataState() {
915 int state = mTelephonyManager.getDataState();
916 Resources r = getResources();
917 String display = r.getString(R.string.radioInfo_unknown);
918
919 switch (state) {
920 case TelephonyManager.DATA_CONNECTED:
921 display = r.getString(R.string.radioInfo_data_connected);
922 break;
923 case TelephonyManager.DATA_CONNECTING:
924 display = r.getString(R.string.radioInfo_data_connecting);
925 break;
926 case TelephonyManager.DATA_DISCONNECTED:
927 display = r.getString(R.string.radioInfo_data_disconnected);
928 break;
929 case TelephonyManager.DATA_SUSPENDED:
930 display = r.getString(R.string.radioInfo_data_suspended);
931 break;
932 }
johnwang342101a2009-09-23 16:22:34 -0700933
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800934 gprsState.setText(display);
935 }
936
937 private final void updateNetworkType() {
Nathan Harolde272c202016-10-27 13:45:00 -0700938 if(phone != null) {
Nathan Harold2b77d742016-03-19 13:22:10 -0700939 ServiceState ss = phone.getServiceState();
940 dataNetwork.setText(ServiceState.rilRadioTechnologyToString(
941 phone.getServiceState().getRilDataRadioTechnology()));
942 voiceNetwork.setText(ServiceState.rilRadioTechnologyToString(
943 phone.getServiceState().getRilVoiceRadioTechnology()));
944 }
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800945 }
946
947 private final void
948 updateProperties() {
949 String s;
950 Resources r = getResources();
951
952 s = phone.getDeviceId();
johnwang342101a2009-09-23 16:22:34 -0700953 if (s == null) s = r.getString(R.string.radioInfo_unknown);
Wink Savillec3886682009-04-02 11:00:56 -0700954 mDeviceId.setText(s);
johnwang342101a2009-09-23 16:22:34 -0700955
Meng Wang9053f172017-06-23 16:02:14 -0700956 s = phone.getSubscriberId();
957 if (s == null) s = r.getString(R.string.radioInfo_unknown);
958 mSubscriberId.setText(s);
959
Nathan Haroldcea413a2015-11-23 15:48:10 -0800960 //FIXME: Replace with a TelephonyManager call
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800961 s = phone.getLine1Number();
johnwang342101a2009-09-23 16:22:34 -0700962 if (s == null) s = r.getString(R.string.radioInfo_unknown);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800963 number.setText(s);
964 }
965
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800966 private final void updateDataStats2() {
967 Resources r = getResources();
968
Jeff Sharkey93029862011-05-27 18:26:15 -0700969 long txPackets = TrafficStats.getMobileTxPackets();
970 long rxPackets = TrafficStats.getMobileRxPackets();
971 long txBytes = TrafficStats.getMobileTxBytes();
972 long rxBytes = TrafficStats.getMobileRxBytes();
johnwang342101a2009-09-23 16:22:34 -0700973
Jeff Sharkey93029862011-05-27 18:26:15 -0700974 String packets = r.getString(R.string.radioInfo_display_packets);
975 String bytes = r.getString(R.string.radioInfo_display_bytes);
johnwang342101a2009-09-23 16:22:34 -0700976
Jeff Sharkey93029862011-05-27 18:26:15 -0700977 sent.setText(txPackets + " " + packets + ", " + txBytes + " " + bytes);
978 received.setText(rxPackets + " " + packets + ", " + rxBytes + " " + bytes);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800979 }
980
981 /**
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800982 * Ping a host name
983 */
984 private final void pingHostname() {
985 try {
Nathan Haroldcea413a2015-11-23 15:48:10 -0800986 try {
987 Process p4 = Runtime.getRuntime().exec("ping -c 1 www.google.com");
988 int status4 = p4.waitFor();
989 if (status4 == 0) {
990 mPingHostnameResultV4 = "Pass";
991 } else {
992 mPingHostnameResultV4 = String.format("Fail(%d)", status4);
993 }
994 } catch (IOException e) {
995 mPingHostnameResultV4 = "Fail: IOException";
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800996 }
Nathan Haroldcea413a2015-11-23 15:48:10 -0800997 try {
998 Process p6 = Runtime.getRuntime().exec("ping6 -c 1 www.google.com");
999 int status6 = p6.waitFor();
1000 if (status6 == 0) {
1001 mPingHostnameResultV6 = "Pass";
1002 } else {
1003 mPingHostnameResultV6 = String.format("Fail(%d)", status6);
1004 }
1005 } catch (IOException e) {
1006 mPingHostnameResultV6 = "Fail: IOException";
1007 }
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001008 } catch (InterruptedException e) {
Nathan Haroldcea413a2015-11-23 15:48:10 -08001009 mPingHostnameResultV4 = mPingHostnameResultV6 = "Fail: InterruptedException";
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001010 }
1011 }
1012
1013 /**
1014 * This function checks for basic functionality of HTTP Client.
1015 */
1016 private void httpClientTest() {
Narayan Kamathf25627c2014-12-12 13:53:28 +00001017 HttpURLConnection urlConnection = null;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001018 try {
Narayan Kamathf25627c2014-12-12 13:53:28 +00001019 // TODO: Hardcoded for now, make it UI configurable
Alex Klyubinb0090232015-04-02 11:08:51 -07001020 URL url = new URL("https://www.google.com");
Narayan Kamathf25627c2014-12-12 13:53:28 +00001021 urlConnection = (HttpURLConnection) url.openConnection();
1022 if (urlConnection.getResponseCode() == 200) {
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001023 mHttpClientTestResult = "Pass";
1024 } else {
Narayan Kamathf25627c2014-12-12 13:53:28 +00001025 mHttpClientTestResult = "Fail: Code: " + urlConnection.getResponseMessage();
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001026 }
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001027 } catch (IOException e) {
1028 mHttpClientTestResult = "Fail: IOException";
Narayan Kamathf25627c2014-12-12 13:53:28 +00001029 } finally {
1030 if (urlConnection != null) {
1031 urlConnection.disconnect();
1032 }
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001033 }
1034 }
1035
1036 private void refreshSmsc() {
Nathan Haroldcea413a2015-11-23 15:48:10 -08001037 //FIXME: Replace with a TelephonyManager call
jsh21dd4072009-05-12 11:26:55 -07001038 phone.getSmscAddress(mHandler.obtainMessage(EVENT_QUERY_SMSC_DONE));
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001039 }
1040
Nathan Haroldcea413a2015-11-23 15:48:10 -08001041 private final void updateAllCellInfo() {
1042
1043 mCellInfo.setText("");
Nathan Haroldcea413a2015-11-23 15:48:10 -08001044 mLocation.setText("");
1045
1046 final Runnable updateAllCellInfoResults = new Runnable() {
1047 public void run() {
Nathan Haroldcea413a2015-11-23 15:48:10 -08001048 updateLocation(mCellLocationResult);
1049 updateCellInfo(mCellInfoResult);
1050 }
1051 };
1052
1053 Thread locThread = new Thread() {
1054 @Override
1055 public void run() {
1056 mCellInfoResult = mTelephonyManager.getAllCellInfo();
1057 mCellLocationResult = mTelephonyManager.getCellLocation();
Nathan Haroldcea413a2015-11-23 15:48:10 -08001058
1059 mHandler.post(updateAllCellInfoResults);
1060 }
1061 };
1062 locThread.start();
1063 }
1064
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001065 private final void updatePingState() {
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001066 // Set all to unknown since the threads will take a few secs to update.
Nathan Haroldcea413a2015-11-23 15:48:10 -08001067 mPingHostnameResultV4 = getResources().getString(R.string.radioInfo_unknown);
1068 mPingHostnameResultV6 = getResources().getString(R.string.radioInfo_unknown);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001069 mHttpClientTestResult = getResources().getString(R.string.radioInfo_unknown);
1070
Nathan Haroldcea413a2015-11-23 15:48:10 -08001071 mPingHostnameV4.setText(mPingHostnameResultV4);
1072 mPingHostnameV6.setText(mPingHostnameResultV6);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001073 mHttpClientTest.setText(mHttpClientTestResult);
1074
1075 final Runnable updatePingResults = new Runnable() {
1076 public void run() {
Nathan Haroldcea413a2015-11-23 15:48:10 -08001077 mPingHostnameV4.setText(mPingHostnameResultV4);
1078 mPingHostnameV6.setText(mPingHostnameResultV6);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001079 mHttpClientTest.setText(mHttpClientTestResult);
1080 }
1081 };
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001082
1083 Thread hostname = new Thread() {
1084 @Override
1085 public void run() {
1086 pingHostname();
Nathan Haroldcea413a2015-11-23 15:48:10 -08001087 mHandler.post(updatePingResults);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001088 }
1089 };
1090 hostname.start();
1091
1092 Thread httpClient = new Thread() {
1093 @Override
1094 public void run() {
1095 httpClientTest();
Nathan Haroldcea413a2015-11-23 15:48:10 -08001096 mHandler.post(updatePingResults);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001097 }
1098 };
1099 httpClient.start();
1100 }
1101
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001102 private MenuItem.OnMenuItemClickListener mViewADNCallback = new MenuItem.OnMenuItemClickListener() {
1103 public boolean onMenuItemClick(MenuItem item) {
1104 Intent intent = new Intent(Intent.ACTION_VIEW);
1105 // XXX We need to specify the component here because if we don't
1106 // the activity manager will try to resolve the type by calling
1107 // the content provider, which causes it to be loaded in a process
1108 // other than the Dialer process, which causes a lot of stuff to
1109 // break.
1110 intent.setClassName("com.android.phone",
1111 "com.android.phone.SimContacts");
1112 startActivity(intent);
1113 return true;
1114 }
1115 };
1116
1117 private MenuItem.OnMenuItemClickListener mViewFDNCallback = new MenuItem.OnMenuItemClickListener() {
1118 public boolean onMenuItemClick(MenuItem item) {
1119 Intent intent = new Intent(Intent.ACTION_VIEW);
1120 // XXX We need to specify the component here because if we don't
1121 // the activity manager will try to resolve the type by calling
1122 // the content provider, which causes it to be loaded in a process
1123 // other than the Dialer process, which causes a lot of stuff to
1124 // break.
1125 intent.setClassName("com.android.phone",
Andrew Leeda90d682014-10-31 13:12:20 -07001126 "com.android.phone.settings.fdn.FdnList");
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001127 startActivity(intent);
1128 return true;
1129 }
1130 };
1131
1132 private MenuItem.OnMenuItemClickListener mViewSDNCallback = new MenuItem.OnMenuItemClickListener() {
1133 public boolean onMenuItemClick(MenuItem item) {
1134 Intent intent = new Intent(
Wink Savillec3886682009-04-02 11:00:56 -07001135 Intent.ACTION_VIEW, Uri.parse("content://icc/sdn"));
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001136 // XXX We need to specify the component here because if we don't
1137 // the activity manager will try to resolve the type by calling
1138 // the content provider, which causes it to be loaded in a process
1139 // other than the Dialer process, which causes a lot of stuff to
1140 // break.
1141 intent.setClassName("com.android.phone",
1142 "com.android.phone.ADNList");
1143 startActivity(intent);
1144 return true;
1145 }
1146 };
1147
Nathan Harolde272c202016-10-27 13:45:00 -07001148 private MenuItem.OnMenuItemClickListener mGetImsStatus = new MenuItem.OnMenuItemClickListener() {
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001149 public boolean onMenuItemClick(MenuItem item) {
Nathan Harolde272c202016-10-27 13:45:00 -07001150 boolean isImsRegistered = phone.isImsRegistered();
1151 boolean availableVolte = phone.isVolteEnabled();
1152 boolean availableWfc = phone.isWifiCallingEnabled();
1153 boolean availableVt = phone.isVideoEnabled();
1154 boolean availableUt = phone.isUtEnabled();
1155
1156 final String imsRegString = isImsRegistered ?
1157 getString(R.string.radio_info_ims_reg_status_registered) :
1158 getString(R.string.radio_info_ims_reg_status_not_registered);
1159
1160 final String available = getString(R.string.radio_info_ims_feature_status_available);
1161 final String unavailable = getString(
1162 R.string.radio_info_ims_feature_status_unavailable);
1163
1164 String imsStatus = getString(R.string.radio_info_ims_reg_status,
1165 imsRegString,
1166 availableVolte ? available : unavailable,
1167 availableWfc ? available : unavailable,
1168 availableVt ? available : unavailable,
1169 availableUt ? available : unavailable);
1170
1171 AlertDialog imsDialog = new AlertDialog.Builder(RadioInfo.this)
1172 .setMessage(imsStatus)
1173 .setTitle(getString(R.string.radio_info_ims_reg_status_title))
1174 .create();
1175
1176 imsDialog.show();
1177
Tammo Spalinka5f4c8f2009-10-15 20:08:58 +08001178 return true;
1179 }
1180 };
1181
1182 private MenuItem.OnMenuItemClickListener mSelectBandCallback = new MenuItem.OnMenuItemClickListener() {
1183 public boolean onMenuItemClick(MenuItem item) {
1184 Intent intent = new Intent();
1185 intent.setClass(RadioInfo.this, BandMode.class);
1186 startActivity(intent);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001187 return true;
1188 }
1189 };
johnwang342101a2009-09-23 16:22:34 -07001190
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001191 private MenuItem.OnMenuItemClickListener mToggleData = new MenuItem.OnMenuItemClickListener() {
1192 public boolean onMenuItemClick(MenuItem item) {
1193 int state = mTelephonyManager.getDataState();
1194 switch (state) {
1195 case TelephonyManager.DATA_CONNECTED:
Nathan Haroldcea413a2015-11-23 15:48:10 -08001196 //FIXME: Replace with a TelephonyManager call
Malcolm Chenf612f592017-11-29 18:01:25 -08001197 phone.setUserDataEnabled(false);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001198 break;
1199 case TelephonyManager.DATA_DISCONNECTED:
Nathan Haroldcea413a2015-11-23 15:48:10 -08001200 //FIXME: Replace with a TelephonyManager call
Malcolm Chenf612f592017-11-29 18:01:25 -08001201 phone.setUserDataEnabled(true);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001202 break;
1203 default:
1204 // do nothing
1205 break;
1206 }
1207 return true;
1208 }
1209 };
1210
Nathan Harold2b77d742016-03-19 13:22:10 -07001211 private boolean isRadioOn() {
1212 //FIXME: Replace with a TelephonyManager call
1213 return phone.getServiceState().getState() != ServiceState.STATE_POWER_OFF;
1214 }
1215
1216 private void updateRadioPowerState() {
1217 //delightful hack to prevent on-checked-changed calls from
1218 //actually forcing the radio preference to its transient/current value.
1219 radioPowerOnSwitch.setOnCheckedChangeListener(null);
1220 radioPowerOnSwitch.setChecked(isRadioOn());
1221 radioPowerOnSwitch.setOnCheckedChangeListener(mRadioPowerOnChangeListener);
1222 }
1223
Nathan Harolde272c202016-10-27 13:45:00 -07001224 void setImsVolteProvisionedState(boolean state) {
Nathan Harold12e1f552016-06-17 13:55:38 -07001225 Log.d(TAG, "setImsVolteProvisioned state: " + ((state)? "on":"off"));
Nathan Harolde272c202016-10-27 13:45:00 -07001226 setImsConfigProvisionedState(IMS_VOLTE_PROVISIONED_CONFIG_ID, state);
Nathan Harold12e1f552016-06-17 13:55:38 -07001227 }
1228
Nathan Harolde272c202016-10-27 13:45:00 -07001229 void setImsVtProvisionedState(boolean state) {
Nathan Harold12e1f552016-06-17 13:55:38 -07001230 Log.d(TAG, "setImsVtProvisioned() state: " + ((state)? "on":"off"));
Nathan Harolde272c202016-10-27 13:45:00 -07001231 setImsConfigProvisionedState(IMS_VT_PROVISIONED_CONFIG_ID, state);
Nathan Harold12e1f552016-06-17 13:55:38 -07001232 }
1233
Nathan Harolde272c202016-10-27 13:45:00 -07001234 void setImsWfcProvisionedState(boolean state) {
Nathan Harold12e1f552016-06-17 13:55:38 -07001235 Log.d(TAG, "setImsWfcProvisioned() state: " + ((state)? "on":"off"));
Nathan Harolde272c202016-10-27 13:45:00 -07001236 setImsConfigProvisionedState(IMS_WFC_PROVISIONED_CONFIG_ID, state);
Nathan Harold12e1f552016-06-17 13:55:38 -07001237 }
1238
Meng Wang586741c2017-04-26 15:02:51 -07001239 void setEabProvisionedState(boolean state) {
1240 Log.d(TAG, "setEabProvisioned() state: " + ((state)? "on":"off"));
1241 setImsConfigProvisionedState(EAB_PROVISIONED_CONFIG_ID, state);
1242 }
1243
Nathan Harolde272c202016-10-27 13:45:00 -07001244 void setImsConfigProvisionedState(int configItem, boolean state) {
Nathan Harold12e1f552016-06-17 13:55:38 -07001245 if (phone != null && mImsManager != null) {
Philip P. Moltmann5c449ae2017-02-14 12:43:02 -08001246 QueuedWork.queue(new Runnable() {
Nathan Harold12e1f552016-06-17 13:55:38 -07001247 public void run() {
1248 try {
1249 mImsManager.getConfigInterface().setProvisionedValue(
1250 configItem,
1251 state? 1 : 0);
1252 } catch (ImsException e) {
1253 Log.e(TAG, "setImsConfigProvisioned() exception:", e);
1254 }
1255 }
Philip P. Moltmann5c449ae2017-02-14 12:43:02 -08001256 }, false);
Nathan Harold12e1f552016-06-17 13:55:38 -07001257 }
1258 }
1259
Nathan Harold2b77d742016-03-19 13:22:10 -07001260 OnCheckedChangeListener mRadioPowerOnChangeListener = new OnCheckedChangeListener() {
1261 @Override
1262 public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
1263 log("toggle radio power: currently " + (isRadioOn()?"on":"off"));
1264 phone.setRadioPower(isChecked);
1265 }
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001266 };
1267
Nathan Harold12e1f552016-06-17 13:55:38 -07001268 private boolean isImsVolteProvisioned() {
Nathan Harold2b77d742016-03-19 13:22:10 -07001269 if (phone != null && mImsManager != null) {
1270 return mImsManager.isVolteEnabledByPlatform(phone.getContext())
1271 && mImsManager.isVolteProvisionedOnDevice(phone.getContext());
Pavel Zhamaitsiakcb267a62015-01-21 18:25:14 -08001272 }
1273 return false;
1274 }
1275
Nathan Harold12e1f552016-06-17 13:55:38 -07001276 OnCheckedChangeListener mImsVolteCheckedChangeListener = new OnCheckedChangeListener() {
Wink Saville426fc662011-09-25 14:39:02 -07001277 @Override
Nathan Harold2b77d742016-03-19 13:22:10 -07001278 public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
Nathan Harold12e1f552016-06-17 13:55:38 -07001279 setImsVolteProvisionedState(isChecked);
Nathan Harolde272c202016-10-27 13:45:00 -07001280 }
Wink Saville426fc662011-09-25 14:39:02 -07001281 };
1282
Nathan Harold12e1f552016-06-17 13:55:38 -07001283 private boolean isImsVtProvisioned() {
1284 if (phone != null && mImsManager != null) {
1285 return mImsManager.isVtEnabledByPlatform(phone.getContext())
1286 && mImsManager.isVtProvisionedOnDevice(phone.getContext());
1287 }
1288 return false;
1289 }
1290
1291 OnCheckedChangeListener mImsVtCheckedChangeListener = new OnCheckedChangeListener() {
1292 @Override
1293 public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
1294 setImsVtProvisionedState(isChecked);
Nathan Harolde272c202016-10-27 13:45:00 -07001295 }
Nathan Harold12e1f552016-06-17 13:55:38 -07001296 };
1297
1298 private boolean isImsWfcProvisioned() {
1299 if (phone != null && mImsManager != null) {
1300 return mImsManager.isWfcEnabledByPlatform(phone.getContext())
1301 && mImsManager.isWfcProvisionedOnDevice(phone.getContext());
1302 }
1303 return false;
1304 }
1305
1306 OnCheckedChangeListener mImsWfcCheckedChangeListener = new OnCheckedChangeListener() {
1307 @Override
1308 public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
1309 setImsWfcProvisionedState(isChecked);
Nathan Harolde272c202016-10-27 13:45:00 -07001310 }
Nathan Harold12e1f552016-06-17 13:55:38 -07001311 };
1312
Meng Wang586741c2017-04-26 15:02:51 -07001313 private boolean isEabProvisioned() {
1314 return isFeatureProvisioned(EAB_PROVISIONED_CONFIG_ID, false);
1315 }
1316
1317 OnCheckedChangeListener mEabCheckedChangeListener = new OnCheckedChangeListener() {
1318 @Override
1319 public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
1320 setEabProvisionedState(isChecked);
1321 }
1322 };
1323
1324 private boolean isFeatureProvisioned(int featureId, boolean defaultValue) {
1325 boolean provisioned = defaultValue;
1326 if (mImsManager != null) {
1327 try {
1328 ImsConfig imsConfig = mImsManager.getConfigInterface();
1329 if (imsConfig != null) {
1330 provisioned =
1331 (imsConfig.getProvisionedValue(featureId)
1332 == ImsConfig.FeatureValueConstants.ON);
1333 }
1334 } catch (ImsException ex) {
1335 Log.e(TAG, "isFeatureProvisioned() exception:", ex);
1336 }
1337 }
1338
1339 log("isFeatureProvisioned() featureId=" + featureId + " provisioned=" + provisioned);
1340 return provisioned;
1341 }
1342
1343 private static boolean isEabEnabledByPlatform(Context context) {
1344 if (context != null) {
1345 CarrierConfigManager configManager = (CarrierConfigManager)
1346 context.getSystemService(Context.CARRIER_CONFIG_SERVICE);
1347 if (configManager != null && configManager.getConfig().getBoolean(
1348 CarrierConfigManager.KEY_USE_RCS_PRESENCE_BOOL)) {
1349 return true;
1350 }
1351 }
1352 return false;
1353 }
1354
Nathan Harold12e1f552016-06-17 13:55:38 -07001355 private void updateImsProvisionedState() {
1356 log("updateImsProvisionedState isImsVolteProvisioned()=" + isImsVolteProvisioned());
Nathan Harold2b77d742016-03-19 13:22:10 -07001357 //delightful hack to prevent on-checked-changed calls from
1358 //actually forcing the ims provisioning to its transient/current value.
Nathan Harold12e1f552016-06-17 13:55:38 -07001359 imsVolteProvisionedSwitch.setOnCheckedChangeListener(null);
1360 imsVolteProvisionedSwitch.setChecked(isImsVolteProvisioned());
1361 imsVolteProvisionedSwitch.setOnCheckedChangeListener(mImsVolteCheckedChangeListener);
Nathan Harold6dc15e92016-10-28 11:45:59 -07001362 imsVolteProvisionedSwitch.setEnabled(
1363 mImsManager.isVolteEnabledByPlatform(phone.getContext()));
Nathan Harold12e1f552016-06-17 13:55:38 -07001364
1365 imsVtProvisionedSwitch.setOnCheckedChangeListener(null);
1366 imsVtProvisionedSwitch.setChecked(isImsVtProvisioned());
1367 imsVtProvisionedSwitch.setOnCheckedChangeListener(mImsVtCheckedChangeListener);
Nathan Harold6dc15e92016-10-28 11:45:59 -07001368 imsVtProvisionedSwitch.setEnabled(
1369 mImsManager.isVtEnabledByPlatform(phone.getContext()));
Nathan Harold12e1f552016-06-17 13:55:38 -07001370
1371 imsWfcProvisionedSwitch.setOnCheckedChangeListener(null);
1372 imsWfcProvisionedSwitch.setChecked(isImsWfcProvisioned());
1373 imsWfcProvisionedSwitch.setOnCheckedChangeListener(mImsWfcCheckedChangeListener);
Nathan Harold6dc15e92016-10-28 11:45:59 -07001374 imsWfcProvisionedSwitch.setEnabled(
1375 mImsManager.isWfcEnabledByPlatform(phone.getContext()));
Meng Wang586741c2017-04-26 15:02:51 -07001376
1377 eabProvisionedSwitch.setOnCheckedChangeListener(null);
1378 eabProvisionedSwitch.setChecked(isEabProvisioned());
1379 eabProvisionedSwitch.setOnCheckedChangeListener(mEabCheckedChangeListener);
1380 eabProvisionedSwitch.setEnabled(isEabEnabledByPlatform(phone.getContext()));
Wink Saville426fc662011-09-25 14:39:02 -07001381 }
1382
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001383 OnClickListener mDnsCheckButtonHandler = new OnClickListener() {
1384 public void onClick(View v) {
Nathan Haroldcea413a2015-11-23 15:48:10 -08001385 //FIXME: Replace with a TelephonyManager call
Wink Savillec3886682009-04-02 11:00:56 -07001386 phone.disableDnsCheck(!phone.isDnsCheckDisabled());
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001387 updateDnsCheckState();
1388 }
1389 };
johnwang342101a2009-09-23 16:22:34 -07001390
Tammo Spalinka5f4c8f2009-10-15 20:08:58 +08001391 OnClickListener mOemInfoButtonHandler = new OnClickListener() {
1392 public void onClick(View v) {
1393 Intent intent = new Intent("com.android.settings.OEM_RADIO_INFO");
1394 try {
1395 startActivity(intent);
1396 } catch (android.content.ActivityNotFoundException ex) {
Wink Savillebf471282013-04-05 15:04:05 -07001397 log("OEM-specific Info/Settings Activity Not Found : " + ex);
Tammo Spalinka5f4c8f2009-10-15 20:08:58 +08001398 // If the activity does not exist, there are no OEM
1399 // settings, and so we can just do nothing...
1400 }
1401 }
1402 };
1403
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001404 OnClickListener mPingButtonHandler = new OnClickListener() {
1405 public void onClick(View v) {
1406 updatePingState();
1407 }
1408 };
1409
1410 OnClickListener mUpdateSmscButtonHandler = new OnClickListener() {
1411 public void onClick(View v) {
1412 updateSmscButton.setEnabled(false);
jsh21dd4072009-05-12 11:26:55 -07001413 phone.setSmscAddress(smsc.getText().toString(),
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001414 mHandler.obtainMessage(EVENT_UPDATE_SMSC_DONE));
1415 }
1416 };
1417
1418 OnClickListener mRefreshSmscButtonHandler = new OnClickListener() {
1419 public void onClick(View v) {
1420 refreshSmsc();
1421 }
1422 };
1423
Youhan Wangfd781e92016-12-16 15:53:16 -08001424 OnClickListener mCarrierProvisioningButtonHandler = new OnClickListener() {
1425 public void onClick(View v) {
Meng Wanga04449b2017-08-03 14:34:35 -07001426 final Intent intent = new Intent("com.android.settings.CARRIER_PROVISIONING");
1427 final ComponentName serviceComponent = ComponentName.unflattenFromString(
1428 "com.android.omadm.service/.DMIntentReceiver");
Youhan Wangfd781e92016-12-16 15:53:16 -08001429 intent.setComponent(serviceComponent);
Meng Wanga04449b2017-08-03 14:34:35 -07001430 sendBroadcast(intent);
Youhan Wangfd781e92016-12-16 15:53:16 -08001431 }
1432 };
1433
1434 OnClickListener mTriggerCarrierProvisioningButtonHandler = new OnClickListener() {
1435 public void onClick(View v) {
Meng Wanga04449b2017-08-03 14:34:35 -07001436 final Intent intent = new Intent("com.android.settings.TRIGGER_CARRIER_PROVISIONING");
1437 final ComponentName serviceComponent = ComponentName.unflattenFromString(
1438 "com.android.omadm.service/.DMIntentReceiver");
Youhan Wangfd781e92016-12-16 15:53:16 -08001439 intent.setComponent(serviceComponent);
Meng Wanga04449b2017-08-03 14:34:35 -07001440 sendBroadcast(intent);
Youhan Wangfd781e92016-12-16 15:53:16 -08001441 }
1442 };
1443
Nathan Haroldcea413a2015-11-23 15:48:10 -08001444 AdapterView.OnItemSelectedListener mPreferredNetworkHandler =
1445 new AdapterView.OnItemSelectedListener() {
1446
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001447 public void onItemSelected(AdapterView parent, View v, int pos, long id) {
Nathan Haroldcea413a2015-11-23 15:48:10 -08001448 if (mPreferredNetworkTypeResult != pos && pos >= 0
1449 && pos <= mPreferredNetworkLabels.length - 2) {
1450 mPreferredNetworkTypeResult = pos;
Nathan Harolddaea8be2018-06-05 14:02:35 -07001451
1452 // TODO: Possibly migrate this to TelephonyManager.setPreferredNetworkType()
1453 // which today still has some issues (mostly that the "set" is conditional
1454 // on a successful modem call, which is not what we want). Instead we always
1455 // want this setting to be set, so that if the radio hiccups and this setting
1456 // is for some reason unsuccessful, future calls to the radio will reflect
1457 // the users's preference which is set here.
1458 final int subId = phone.getSubId();
1459 if (SubscriptionManager.isUsableSubIdValue(subId)) {
1460 Settings.Global.putInt(phone.getContext().getContentResolver(),
1461 PREFERRED_NETWORK_MODE + subId, mPreferredNetworkTypeResult);
1462 }
1463 log("Calling setPreferredNetworkType(" + mPreferredNetworkTypeResult + ")");
Nathan Haroldcea413a2015-11-23 15:48:10 -08001464 Message msg = mHandler.obtainMessage(EVENT_SET_PREFERRED_TYPE_DONE);
1465 phone.setPreferredNetworkType(mPreferredNetworkTypeResult, msg);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001466 }
1467 }
1468
1469 public void onNothingSelected(AdapterView parent) {
1470 }
1471 };
1472
Nathan Harold2b77d742016-03-19 13:22:10 -07001473 AdapterView.OnItemSelectedListener mCellInfoRefreshRateHandler =
1474 new AdapterView.OnItemSelectedListener() {
Wink Savillebf471282013-04-05 15:04:05 -07001475
Nathan Harold2b77d742016-03-19 13:22:10 -07001476 public void onItemSelected(AdapterView parent, View v, int pos, long id) {
1477 mCellInfoRefreshRateIndex = pos;
Sooraj Sasindran5cce06b2016-08-18 15:49:49 -07001478 mTelephonyManager.setCellInfoListRate(mCellInfoRefreshRates[pos]);
Nathan Harold2b77d742016-03-19 13:22:10 -07001479 updateAllCellInfo();
1480 }
1481
1482 public void onNothingSelected(AdapterView parent) {
1483 }
1484 };
1485
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001486}