blob: 251bfbc0ad272ba631f7f54dd22e452b3b3fde19 [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;
Sreekanth Badidac888e192018-02-05 17:18:40 +010038import android.os.Build;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080039import android.os.Bundle;
40import android.os.Handler;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080041import android.os.Message;
Nathan Harolddaea8be2018-06-05 14:02:35 -070042import android.provider.Settings;
Meng Wang586741c2017-04-26 15:02:51 -070043import android.telephony.CarrierConfigManager;
Fan Zhangc7162cd2018-06-18 15:21:41 -070044import android.telephony.CellIdentityCdma;
45import android.telephony.CellIdentityGsm;
46import android.telephony.CellIdentityLte;
47import android.telephony.CellIdentityWcdma;
Wink Saville79bff2a2012-06-01 14:37:21 -070048import android.telephony.CellInfo;
Nathan Haroldcea413a2015-11-23 15:48:10 -080049import android.telephony.CellInfoCdma;
50import android.telephony.CellInfoGsm;
51import android.telephony.CellInfoLte;
52import android.telephony.CellInfoWcdma;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080053import android.telephony.CellLocation;
Nathan Haroldcea413a2015-11-23 15:48:10 -080054import android.telephony.CellSignalStrengthCdma;
55import android.telephony.CellSignalStrengthGsm;
56import android.telephony.CellSignalStrengthLte;
57import android.telephony.CellSignalStrengthWcdma;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080058import android.telephony.PhoneStateListener;
Nathan Harold433ca442018-04-23 18:20:43 -070059import android.telephony.PhysicalChannelConfig;
Fan Zhangc7162cd2018-06-18 15:21:41 -070060import android.telephony.PreciseCallState;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080061import android.telephony.ServiceState;
Nathan Harold2b77d742016-03-19 13:22:10 -070062import android.telephony.SignalStrength;
Nathan Haroldcea413a2015-11-23 15:48:10 -080063import android.telephony.SubscriptionManager;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080064import android.telephony.TelephonyManager;
jsh534f5ae2009-09-24 09:19:22 -070065import android.telephony.cdma.CdmaCellLocation;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080066import android.telephony.gsm.GsmCellLocation;
Nathan Harold6e16fdf2018-04-17 17:01:32 -070067import android.text.TextUtils;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080068import android.util.Log;
69import android.view.Menu;
70import android.view.MenuItem;
71import android.view.View;
72import android.view.View.OnClickListener;
73import android.widget.AdapterView;
74import android.widget.ArrayAdapter;
75import android.widget.Button;
Nathan Harold2b77d742016-03-19 13:22:10 -070076import android.widget.CompoundButton;
77import android.widget.CompoundButton.OnCheckedChangeListener;
Jason Monk39b46742015-09-10 15:52:51 -040078import android.widget.EditText;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080079import android.widget.Spinner;
Nathan Harold2b77d742016-03-19 13:22:10 -070080import android.widget.Switch;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080081import android.widget.TextView;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080082
Fan Zhang23f8d592018-08-28 15:11:40 -070083import androidx.appcompat.app.AlertDialog;
84
Jason Monk39b46742015-09-10 15:52:51 -040085import com.android.ims.ImsConfig;
86import com.android.ims.ImsException;
87import com.android.ims.ImsManager;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080088import com.android.internal.telephony.Phone;
89import com.android.internal.telephony.PhoneFactory;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080090
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080091import java.io.IOException;
Jason Monk39b46742015-09-10 15:52:51 -040092import java.net.HttpURLConnection;
93import java.net.URL;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080094import java.util.List;
95
96public class RadioInfo extends Activity {
Nathan Harold2b77d742016-03-19 13:22:10 -070097 private static final String TAG = "RadioInfo";
johnwang342101a2009-09-23 16:22:34 -070098
Nathan Harold2b77d742016-03-19 13:22:10 -070099 private static final String[] mPreferredNetworkLabels = {
100 "WCDMA preferred",
101 "GSM only",
102 "WCDMA only",
103 "GSM auto (PRL)",
104 "CDMA auto (PRL)",
105 "CDMA only",
106 "EvDo only",
107 "Global auto (PRL)",
108 "LTE/CDMA auto (PRL)",
109 "LTE/UMTS auto (PRL)",
110 "LTE/CDMA/UMTS auto (PRL)",
111 "LTE only",
112 "LTE/WCDMA",
113 "TD-SCDMA only",
114 "TD-SCDMA/WCDMA",
115 "LTE/TD-SCDMA",
116 "TD-SCDMA/GSM",
117 "TD-SCDMA/UMTS",
118 "LTE/TD-SCDMA/WCDMA",
119 "LTE/TD-SCDMA/UMTS",
120 "TD-SCDMA/CDMA/UMTS",
121 "Global/TD-SCDMA",
122 "Unknown"
123 };
124
125
126 private static final int CELL_INFO_LIST_RATE_DISABLED = Integer.MAX_VALUE;
127 private static final int CELL_INFO_LIST_RATE_MAX = 0;
128
Nathan Harold12e1f552016-06-17 13:55:38 -0700129
130 private static final int IMS_VOLTE_PROVISIONED_CONFIG_ID =
131 ImsConfig.ConfigConstants.VLT_SETTING_ENABLED;
132
133 private static final int IMS_VT_PROVISIONED_CONFIG_ID =
134 ImsConfig.ConfigConstants.LVC_SETTING_ENABLED;
135
136 private static final int IMS_WFC_PROVISIONED_CONFIG_ID =
137 ImsConfig.ConfigConstants.VOICE_OVER_WIFI_SETTING_ENABLED;
138
Meng Wang586741c2017-04-26 15:02:51 -0700139 private static final int EAB_PROVISIONED_CONFIG_ID =
140 ImsConfig.ConfigConstants.EAB_SETTING_ENABLED;
141
Nathan Harold2b77d742016-03-19 13:22:10 -0700142 //Values in must match mCellInfoRefreshRates
143 private static final String[] mCellInfoRefreshRateLabels = {
144 "Disabled",
145 "Immediate",
146 "Min 5s",
147 "Min 10s",
148 "Min 60s"
149 };
150
151 //Values in seconds, must match mCellInfoRefreshRateLabels
152 private static final int mCellInfoRefreshRates[] = {
153 CELL_INFO_LIST_RATE_DISABLED,
154 CELL_INFO_LIST_RATE_MAX,
155 5000,
156 10000,
157 60000
158 };
159
160 private void log(String s) {
161 Log.d(TAG, s);
162 }
163
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800164 private static final int EVENT_CFI_CHANGED = 302;
165
166 private static final int EVENT_QUERY_PREFERRED_TYPE_DONE = 1000;
167 private static final int EVENT_SET_PREFERRED_TYPE_DONE = 1001;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800168 private static final int EVENT_QUERY_SMSC_DONE = 1005;
169 private static final int EVENT_UPDATE_SMSC_DONE = 1006;
170
171 private static final int MENU_ITEM_SELECT_BAND = 0;
172 private static final int MENU_ITEM_VIEW_ADN = 1;
173 private static final int MENU_ITEM_VIEW_FDN = 2;
174 private static final int MENU_ITEM_VIEW_SDN = 3;
Nathan Harolde272c202016-10-27 13:45:00 -0700175 private static final int MENU_ITEM_GET_IMS_STATUS = 4;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800176 private static final int MENU_ITEM_TOGGLE_DATA = 5;
Tammo Spalinka5f4c8f2009-10-15 20:08:58 +0800177
Wink Savillec3886682009-04-02 11:00:56 -0700178 private TextView mDeviceId; //DeviceId is the IMEI in GSM and the MEID in CDMA
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800179 private TextView number;
Meng Wang9053f172017-06-23 16:02:14 -0700180 private TextView mSubscriberId;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800181 private TextView callState;
182 private TextView operatorName;
183 private TextView roamingState;
184 private TextView gsmState;
185 private TextView gprsState;
Nathan Harold2b77d742016-03-19 13:22:10 -0700186 private TextView voiceNetwork;
187 private TextView dataNetwork;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800188 private TextView dBm;
189 private TextView mMwi;
190 private TextView mCfi;
191 private TextView mLocation;
Wink Saville79bff2a2012-06-01 14:37:21 -0700192 private TextView mCellInfo;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800193 private TextView sent;
194 private TextView received;
Nathan Haroldcea413a2015-11-23 15:48:10 -0800195 private TextView mPingHostnameV4;
196 private TextView mPingHostnameV6;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800197 private TextView mHttpClientTest;
Nathan Harold433ca442018-04-23 18:20:43 -0700198 private TextView mPhyChanConfig;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800199 private TextView dnsCheckState;
Nathan Haroldf10ea322018-04-24 13:31:07 -0700200 private TextView mDownlinkKbps;
201 private TextView mUplinkKbps;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800202 private EditText smsc;
Nathan Harold2b77d742016-03-19 13:22:10 -0700203 private Switch radioPowerOnSwitch;
204 private Button cellInfoRefreshRateButton;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800205 private Button dnsCheckToggleButton;
206 private Button pingTestButton;
207 private Button updateSmscButton;
208 private Button refreshSmscButton;
Tammo Spalinka5f4c8f2009-10-15 20:08:58 +0800209 private Button oemInfoButton;
Youhan Wangfd781e92016-12-16 15:53:16 -0800210 private Button carrierProvisioningButton;
211 private Button triggercarrierProvisioningButton;
Nathan Harold12e1f552016-06-17 13:55:38 -0700212 private Switch imsVolteProvisionedSwitch;
213 private Switch imsVtProvisionedSwitch;
214 private Switch imsWfcProvisionedSwitch;
Meng Wang586741c2017-04-26 15:02:51 -0700215 private Switch eabProvisionedSwitch;
Naina Nallurid1b57f62019-01-08 15:19:58 -0800216 private Switch cbrsDataSwitch;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800217 private Spinner preferredNetworkType;
Nathan Harold2b77d742016-03-19 13:22:10 -0700218 private Spinner cellInfoRefreshRateSpinner;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800219
Nathan Haroldf10ea322018-04-24 13:31:07 -0700220 private ConnectivityManager mConnectivityManager;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800221 private TelephonyManager mTelephonyManager;
Nathan Haroldcea413a2015-11-23 15:48:10 -0800222 private ImsManager mImsManager = null;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800223 private Phone phone = null;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800224
Nathan Haroldcea413a2015-11-23 15:48:10 -0800225 private String mPingHostnameResultV4;
226 private String mPingHostnameResultV6;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800227 private String mHttpClientTestResult;
228 private boolean mMwiValue = false;
229 private boolean mCfiValue = false;
Nathan Haroldcea413a2015-11-23 15:48:10 -0800230
231 private List<CellInfo> mCellInfoResult = null;
232 private CellLocation mCellLocationResult = null;
Nathan Haroldcea413a2015-11-23 15:48:10 -0800233
234 private int mPreferredNetworkTypeResult;
Nathan Harold2b77d742016-03-19 13:22:10 -0700235 private int mCellInfoRefreshRateIndex;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800236
Nathan Haroldf10ea322018-04-24 13:31:07 -0700237 private final NetworkRequest mDefaultNetworkRequest = new NetworkRequest.Builder()
238 .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
239 .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
240 .build();
241
242 private final NetworkCallback mNetworkCallback = new NetworkCallback() {
243 public void onCapabilitiesChanged(Network n, NetworkCapabilities nc) {
244 int dlbw = nc.getLinkDownstreamBandwidthKbps();
245 int ulbw = nc.getLinkUpstreamBandwidthKbps();
246 updateBandwidths(dlbw, ulbw);
247 }
248 };
249
Nathan Harold2b77d742016-03-19 13:22:10 -0700250 private final PhoneStateListener mPhoneStateListener = new PhoneStateListener() {
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800251 @Override
252 public void onDataConnectionStateChanged(int state) {
253 updateDataState();
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800254 updateNetworkType();
255 }
256
257 @Override
258 public void onDataActivity(int direction) {
259 updateDataStats2();
260 }
261
262 @Override
Nathan Harold2b77d742016-03-19 13:22:10 -0700263 public void onCallStateChanged(int state, String incomingNumber) {
264 updateNetworkType();
265 updatePhoneState(state);
266 }
267
268 @Override
269 public void onPreciseCallStateChanged(PreciseCallState preciseState) {
270 updateNetworkType();
271 }
272
273 @Override
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800274 public void onCellLocationChanged(CellLocation location) {
275 updateLocation(location);
276 }
277
278 @Override
279 public void onMessageWaitingIndicatorChanged(boolean mwi) {
280 mMwiValue = mwi;
281 updateMessageWaiting();
282 }
283
284 @Override
285 public void onCallForwardingIndicatorChanged(boolean cfi) {
286 mCfiValue = cfi;
287 updateCallRedirect();
288 }
Wink Saville79bff2a2012-06-01 14:37:21 -0700289
290 @Override
291 public void onCellInfoChanged(List<CellInfo> arrayCi) {
Wink Savillebf471282013-04-05 15:04:05 -0700292 log("onCellInfoChanged: arrayCi=" + arrayCi);
Nathan Haroldcea413a2015-11-23 15:48:10 -0800293 mCellInfoResult = arrayCi;
294 updateCellInfo(mCellInfoResult);
Wink Saville79bff2a2012-06-01 14:37:21 -0700295 }
Wink Saville4f0d8812014-04-15 22:05:24 -0700296
297 @Override
Nathan Harold2b77d742016-03-19 13:22:10 -0700298 public void onSignalStrengthsChanged(SignalStrength signalStrength) {
299 log("onSignalStrengthChanged: SignalStrength=" +signalStrength);
300 updateSignalStrength(signalStrength);
301 }
302
303 @Override
304 public void onServiceStateChanged(ServiceState serviceState) {
305 log("onServiceStateChanged: ServiceState=" + serviceState);
306 updateServiceState(serviceState);
307 updateRadioPowerState();
308 updateNetworkType();
Nathan Harold12e1f552016-06-17 13:55:38 -0700309 updateImsProvisionedState();
Nathan Harold2b77d742016-03-19 13:22:10 -0700310 }
Nathan Harold433ca442018-04-23 18:20:43 -0700311
312 @Override
313 public void onPhysicalChannelConfigurationChanged(
314 List<PhysicalChannelConfig> configs) {
315 updatePhysicalChannelConfiguration(configs);
316 }
317
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800318 };
319
Nathan Harold433ca442018-04-23 18:20:43 -0700320 private void updatePhysicalChannelConfiguration(List<PhysicalChannelConfig> configs) {
321 StringBuilder sb = new StringBuilder();
322 String div = "";
323 sb.append("{");
324 if (configs != null) {
325 for(PhysicalChannelConfig c : configs) {
326 sb.append(div).append(c);
327 div = ",";
328 }
329 }
330 sb.append("}");
331 mPhyChanConfig.setText(sb.toString());
332 }
333
Nathan Haroldcea413a2015-11-23 15:48:10 -0800334 private void updatePreferredNetworkType(int type) {
335 if (type >= mPreferredNetworkLabels.length || type < 0) {
336 log("EVENT_QUERY_PREFERRED_TYPE_DONE: unknown " +
337 "type=" + type);
338 type = mPreferredNetworkLabels.length - 1; //set to Unknown
339 }
340 mPreferredNetworkTypeResult = type;
341
342 preferredNetworkType.setSelection(mPreferredNetworkTypeResult, true);
343 }
344
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800345 private Handler mHandler = new Handler() {
Nathan Haroldcea413a2015-11-23 15:48:10 -0800346 @Override
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800347 public void handleMessage(Message msg) {
348 AsyncResult ar;
349 switch (msg.what) {
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800350 case EVENT_QUERY_PREFERRED_TYPE_DONE:
351 ar= (AsyncResult) msg.obj;
Nathan Haroldcea413a2015-11-23 15:48:10 -0800352 if (ar.exception == null && ar.result != null) {
353 updatePreferredNetworkType(((int[])ar.result)[0]);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800354 } else {
Nathan Haroldcea413a2015-11-23 15:48:10 -0800355 //In case of an exception, we will set this to unknown
356 updatePreferredNetworkType(mPreferredNetworkLabels.length-1);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800357 }
358 break;
359 case EVENT_SET_PREFERRED_TYPE_DONE:
360 ar= (AsyncResult) msg.obj;
361 if (ar.exception != null) {
Nathan Harolded38afa2016-04-13 00:29:30 -0700362 log("Set preferred network type failed.");
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800363 }
364 break;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800365 case EVENT_QUERY_SMSC_DONE:
366 ar= (AsyncResult) msg.obj;
367 if (ar.exception != null) {
368 smsc.setText("refresh error");
369 } else {
jsh21dd4072009-05-12 11:26:55 -0700370 smsc.setText((String)ar.result);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800371 }
372 break;
373 case EVENT_UPDATE_SMSC_DONE:
374 updateSmscButton.setEnabled(true);
375 ar= (AsyncResult) msg.obj;
376 if (ar.exception != null) {
377 smsc.setText("update error");
378 }
379 break;
380 default:
Nathan Haroldcea413a2015-11-23 15:48:10 -0800381 super.handleMessage(msg);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800382 break;
383
384 }
385 }
386 };
387
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800388 @Override
389 public void onCreate(Bundle icicle) {
390 super.onCreate(icicle);
fionaxub54cb2d2016-09-22 15:01:05 -0700391 if (!android.os.Process.myUserHandle().isSystem()) {
392 Log.e(TAG, "Not run from system user, don't do anything.");
393 finish();
394 return;
395 }
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800396
397 setContentView(R.layout.radio_info);
398
Nathan Haroldcea413a2015-11-23 15:48:10 -0800399 log("Started onCreate");
400
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800401 mTelephonyManager = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
Nathan Haroldf10ea322018-04-24 13:31:07 -0700402 mConnectivityManager = (ConnectivityManager)getSystemService(CONNECTIVITY_SERVICE);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800403 phone = PhoneFactory.getDefaultPhone();
404
Nathan Haroldcea413a2015-11-23 15:48:10 -0800405 //TODO: Need to update this if the default phoneId changes?
406 // Better to have an instance per phone?
407 mImsManager = ImsManager.getInstance(getApplicationContext(),
408 SubscriptionManager.getDefaultVoicePhoneId());
409
Meng Wang9053f172017-06-23 16:02:14 -0700410 mDeviceId = (TextView) findViewById(R.id.imei);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800411 number = (TextView) findViewById(R.id.number);
Meng Wang9053f172017-06-23 16:02:14 -0700412 mSubscriberId = (TextView) findViewById(R.id.imsi);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800413 callState = (TextView) findViewById(R.id.call);
414 operatorName = (TextView) findViewById(R.id.operator);
415 roamingState = (TextView) findViewById(R.id.roaming);
416 gsmState = (TextView) findViewById(R.id.gsm);
417 gprsState = (TextView) findViewById(R.id.gprs);
Nathan Harold2b77d742016-03-19 13:22:10 -0700418 voiceNetwork = (TextView) findViewById(R.id.voice_network);
419 dataNetwork = (TextView) findViewById(R.id.data_network);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800420 dBm = (TextView) findViewById(R.id.dbm);
421 mMwi = (TextView) findViewById(R.id.mwi);
422 mCfi = (TextView) findViewById(R.id.cfi);
423 mLocation = (TextView) findViewById(R.id.location);
Wink Saville79bff2a2012-06-01 14:37:21 -0700424 mCellInfo = (TextView) findViewById(R.id.cellinfo);
Nathan Haroldcea413a2015-11-23 15:48:10 -0800425 mCellInfo.setTypeface(Typeface.MONOSPACE);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800426
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800427 sent = (TextView) findViewById(R.id.sent);
428 received = (TextView) findViewById(R.id.received);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800429 smsc = (EditText) findViewById(R.id.smsc);
430 dnsCheckState = (TextView) findViewById(R.id.dnsCheckState);
Nathan Haroldcea413a2015-11-23 15:48:10 -0800431 mPingHostnameV4 = (TextView) findViewById(R.id.pingHostnameV4);
432 mPingHostnameV6 = (TextView) findViewById(R.id.pingHostnameV6);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800433 mHttpClientTest = (TextView) findViewById(R.id.httpClientTest);
434
Nathan Harold433ca442018-04-23 18:20:43 -0700435 mPhyChanConfig = (TextView) findViewById(R.id.phy_chan_config);
436
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800437 preferredNetworkType = (Spinner) findViewById(R.id.preferredNetworkType);
438 ArrayAdapter<String> adapter = new ArrayAdapter<String> (this,
439 android.R.layout.simple_spinner_item, mPreferredNetworkLabels);
johnwang342101a2009-09-23 16:22:34 -0700440 adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800441 preferredNetworkType.setAdapter(adapter);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800442
Nathan Harold2b77d742016-03-19 13:22:10 -0700443 cellInfoRefreshRateSpinner = (Spinner) findViewById(R.id.cell_info_rate_select);
444 ArrayAdapter<String> cellInfoAdapter = new ArrayAdapter<String>(this,
445 android.R.layout.simple_spinner_item, mCellInfoRefreshRateLabels);
446 cellInfoAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
447 cellInfoRefreshRateSpinner.setAdapter(cellInfoAdapter);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800448
Nathan Harold12e1f552016-06-17 13:55:38 -0700449 imsVolteProvisionedSwitch = (Switch) findViewById(R.id.volte_provisioned_switch);
450 imsVtProvisionedSwitch = (Switch) findViewById(R.id.vt_provisioned_switch);
451 imsWfcProvisionedSwitch = (Switch) findViewById(R.id.wfc_provisioned_switch);
Meng Wang69439b52017-05-01 08:31:14 -0700452 eabProvisionedSwitch = (Switch) findViewById(R.id.eab_provisioned_switch);
Wink Savillebf471282013-04-05 15:04:05 -0700453
Naina Nallurid1b57f62019-01-08 15:19:58 -0800454 cbrsDataSwitch = (Switch) findViewById(R.id.cbrs_data_switch);
455 cbrsDataSwitch.setVisibility(isCbrsSupported() ? View.VISIBLE : View.GONE);
456
Nathan Harold2b77d742016-03-19 13:22:10 -0700457 radioPowerOnSwitch = (Switch) findViewById(R.id.radio_power);
Wink Saville426fc662011-09-25 14:39:02 -0700458
Nathan Haroldf10ea322018-04-24 13:31:07 -0700459 mDownlinkKbps = (TextView) findViewById(R.id.dl_kbps);
460 mUplinkKbps = (TextView) findViewById(R.id.ul_kbps);
461 updateBandwidths(0, 0);
462
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800463 pingTestButton = (Button) findViewById(R.id.ping_test);
464 pingTestButton.setOnClickListener(mPingButtonHandler);
465 updateSmscButton = (Button) findViewById(R.id.update_smsc);
466 updateSmscButton.setOnClickListener(mUpdateSmscButtonHandler);
467 refreshSmscButton = (Button) findViewById(R.id.refresh_smsc);
468 refreshSmscButton.setOnClickListener(mRefreshSmscButtonHandler);
469 dnsCheckToggleButton = (Button) findViewById(R.id.dns_check_toggle);
470 dnsCheckToggleButton.setOnClickListener(mDnsCheckButtonHandler);
Youhan Wangfd781e92016-12-16 15:53:16 -0800471 carrierProvisioningButton = (Button) findViewById(R.id.carrier_provisioning);
472 carrierProvisioningButton.setOnClickListener(mCarrierProvisioningButtonHandler);
473 triggercarrierProvisioningButton = (Button) findViewById(R.id.trigger_carrier_provisioning);
474 triggercarrierProvisioningButton.setOnClickListener(
475 mTriggerCarrierProvisioningButtonHandler);
johnwang342101a2009-09-23 16:22:34 -0700476
Tammo Spalinka5f4c8f2009-10-15 20:08:58 +0800477 oemInfoButton = (Button) findViewById(R.id.oem_info);
478 oemInfoButton.setOnClickListener(mOemInfoButtonHandler);
479 PackageManager pm = getPackageManager();
480 Intent oemInfoIntent = new Intent("com.android.settings.OEM_RADIO_INFO");
481 List<ResolveInfo> oemInfoIntentList = pm.queryIntentActivities(oemInfoIntent, 0);
482 if (oemInfoIntentList.size() == 0) {
483 oemInfoButton.setEnabled(false);
484 }
485
Nathan Harolded38afa2016-04-13 00:29:30 -0700486 mCellInfoRefreshRateIndex = 0; //disabled
Nathan Haroldcea413a2015-11-23 15:48:10 -0800487 mPreferredNetworkTypeResult = mPreferredNetworkLabels.length - 1; //Unknown
488
489 //FIXME: Replace with TelephonyManager call
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800490 phone.getPreferredNetworkType(
491 mHandler.obtainMessage(EVENT_QUERY_PREFERRED_TYPE_DONE));
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800492
Nathan Haroldcea413a2015-11-23 15:48:10 -0800493 restoreFromBundle(icicle);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800494 }
495
496 @Override
497 protected void onResume() {
498 super.onResume();
499
Nathan Haroldcea413a2015-11-23 15:48:10 -0800500 log("Started onResume");
501
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800502 updateMessageWaiting();
503 updateCallRedirect();
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800504 updateDataState();
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800505 updateDataStats2();
Nathan Harold2b77d742016-03-19 13:22:10 -0700506 updateRadioPowerState();
Nathan Harold12e1f552016-06-17 13:55:38 -0700507 updateImsProvisionedState();
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800508 updateProperties();
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800509 updateDnsCheckState();
Nathan Harold2b77d742016-03-19 13:22:10 -0700510 updateNetworkType();
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800511
Nathan Haroldcea413a2015-11-23 15:48:10 -0800512 updateLocation(mCellLocationResult);
513 updateCellInfo(mCellInfoResult);
514
515 mPingHostnameV4.setText(mPingHostnameResultV4);
516 mPingHostnameV6.setText(mPingHostnameResultV6);
517 mHttpClientTest.setText(mHttpClientTestResult);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800518
Nathan Harold2b77d742016-03-19 13:22:10 -0700519 cellInfoRefreshRateSpinner.setOnItemSelectedListener(mCellInfoRefreshRateHandler);
Nathan Harolded38afa2016-04-13 00:29:30 -0700520 //set selection after registering listener to force update
521 cellInfoRefreshRateSpinner.setSelection(mCellInfoRefreshRateIndex);
522
523 //set selection before registering to prevent update
524 preferredNetworkType.setSelection(mPreferredNetworkTypeResult, true);
Nathan Harold2b77d742016-03-19 13:22:10 -0700525 preferredNetworkType.setOnItemSelectedListener(mPreferredNetworkHandler);
Nathan Harolded38afa2016-04-13 00:29:30 -0700526
Nathan Harold2b77d742016-03-19 13:22:10 -0700527 radioPowerOnSwitch.setOnCheckedChangeListener(mRadioPowerOnChangeListener);
Nathan Harold12e1f552016-06-17 13:55:38 -0700528 imsVolteProvisionedSwitch.setOnCheckedChangeListener(mImsVolteCheckedChangeListener);
529 imsVtProvisionedSwitch.setOnCheckedChangeListener(mImsVtCheckedChangeListener);
530 imsWfcProvisionedSwitch.setOnCheckedChangeListener(mImsWfcCheckedChangeListener);
Meng Wang586741c2017-04-26 15:02:51 -0700531 eabProvisionedSwitch.setOnCheckedChangeListener(mEabCheckedChangeListener);
Nathan Harold2b77d742016-03-19 13:22:10 -0700532
Naina Nallurid1b57f62019-01-08 15:19:58 -0800533 if (isCbrsSupported()) {
534 cbrsDataSwitch.setChecked(getCbrsDataState());
535 cbrsDataSwitch.setOnCheckedChangeListener(mCbrsDataSwitchChangeListener);
536 }
537
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800538 mTelephonyManager.listen(mPhoneStateListener,
Nathan Harold2b77d742016-03-19 13:22:10 -0700539 PhoneStateListener.LISTEN_CALL_STATE
540 //b/27803938 - RadioInfo currently cannot read PRECISE_CALL_STATE
541 // | PhoneStateListener.LISTEN_PRECISE_CALL_STATE
542 | PhoneStateListener.LISTEN_DATA_CONNECTION_STATE
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800543 | PhoneStateListener.LISTEN_DATA_ACTIVITY
544 | PhoneStateListener.LISTEN_CELL_LOCATION
545 | PhoneStateListener.LISTEN_MESSAGE_WAITING_INDICATOR
Wink Saville79bff2a2012-06-01 14:37:21 -0700546 | PhoneStateListener.LISTEN_CALL_FORWARDING_INDICATOR
Wink Saville4f0d8812014-04-15 22:05:24 -0700547 | PhoneStateListener.LISTEN_CELL_INFO
Nathan Harold2b77d742016-03-19 13:22:10 -0700548 | PhoneStateListener.LISTEN_SERVICE_STATE
549 | PhoneStateListener.LISTEN_SIGNAL_STRENGTHS
Nathan Harold433ca442018-04-23 18:20:43 -0700550 | PhoneStateListener.LISTEN_PHYSICAL_CHANNEL_CONFIGURATION);
Nathan Harolded38afa2016-04-13 00:29:30 -0700551
Nathan Haroldf10ea322018-04-24 13:31:07 -0700552 mConnectivityManager.registerNetworkCallback(
553 mDefaultNetworkRequest, mNetworkCallback, mHandler);
554
Nathan Harolded38afa2016-04-13 00:29:30 -0700555 smsc.clearFocus();
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800556 }
557
558 @Override
Nathan Haroldcea413a2015-11-23 15:48:10 -0800559 protected void onPause() {
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800560 super.onPause();
561
Wink Savillebf471282013-04-05 15:04:05 -0700562 log("onPause: unregister phone & data intents");
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800563
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800564 mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE);
Sooraj Sasindran5cce06b2016-08-18 15:49:49 -0700565 mTelephonyManager.setCellInfoListRate(CELL_INFO_LIST_RATE_DISABLED);
Nathan Haroldf10ea322018-04-24 13:31:07 -0700566 mConnectivityManager.unregisterNetworkCallback(mNetworkCallback);
567
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800568 }
569
Nathan Haroldcea413a2015-11-23 15:48:10 -0800570 private void restoreFromBundle(Bundle b) {
Nathan Harolde272c202016-10-27 13:45:00 -0700571 if(b == null) {
Nathan Haroldcea413a2015-11-23 15:48:10 -0800572 return;
573 }
574
575 mPingHostnameResultV4 = b.getString("mPingHostnameResultV4","");
576 mPingHostnameResultV6 = b.getString("mPingHostnameResultV6","");
577 mHttpClientTestResult = b.getString("mHttpClientTestResult","");
578
579 mPingHostnameV4.setText(mPingHostnameResultV4);
580 mPingHostnameV6.setText(mPingHostnameResultV6);
581 mHttpClientTest.setText(mHttpClientTestResult);
582
Nathan Harold2b77d742016-03-19 13:22:10 -0700583 mPreferredNetworkTypeResult = b.getInt("mPreferredNetworkTypeResult",
584 mPreferredNetworkLabels.length - 1);
585
586 mCellInfoRefreshRateIndex = b.getInt("mCellInfoRefreshRateIndex", 0);
Nathan Haroldcea413a2015-11-23 15:48:10 -0800587 }
588
589 @Override
590 protected void onSaveInstanceState(Bundle outState) {
591 outState.putString("mPingHostnameResultV4", mPingHostnameResultV4);
592 outState.putString("mPingHostnameResultV6", mPingHostnameResultV6);
593 outState.putString("mHttpClientTestResult", mHttpClientTestResult);
Nathan Harold2b77d742016-03-19 13:22:10 -0700594
Nathan Haroldcea413a2015-11-23 15:48:10 -0800595 outState.putInt("mPreferredNetworkTypeResult", mPreferredNetworkTypeResult);
Nathan Harold2b77d742016-03-19 13:22:10 -0700596 outState.putInt("mCellInfoRefreshRateIndex", mCellInfoRefreshRateIndex);
597
Nathan Haroldcea413a2015-11-23 15:48:10 -0800598 }
599
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800600 @Override
601 public boolean onCreateOptionsMenu(Menu menu) {
Wink Savillec3886682009-04-02 11:00:56 -0700602 menu.add(0, MENU_ITEM_SELECT_BAND, 0, R.string.radio_info_band_mode_label)
603 .setOnMenuItemClickListener(mSelectBandCallback)
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800604 .setAlphabeticShortcut('b');
605 menu.add(1, MENU_ITEM_VIEW_ADN, 0,
606 R.string.radioInfo_menu_viewADN).setOnMenuItemClickListener(mViewADNCallback);
607 menu.add(1, MENU_ITEM_VIEW_FDN, 0,
608 R.string.radioInfo_menu_viewFDN).setOnMenuItemClickListener(mViewFDNCallback);
609 menu.add(1, MENU_ITEM_VIEW_SDN, 0,
610 R.string.radioInfo_menu_viewSDN).setOnMenuItemClickListener(mViewSDNCallback);
Nathan Harolde272c202016-10-27 13:45:00 -0700611 menu.add(1, MENU_ITEM_GET_IMS_STATUS,
612 0, R.string.radioInfo_menu_getIMS).setOnMenuItemClickListener(mGetImsStatus);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800613 menu.add(1, MENU_ITEM_TOGGLE_DATA,
Nathan Harold2b77d742016-03-19 13:22:10 -0700614 0, R.string.radio_info_data_connection_disable).setOnMenuItemClickListener(mToggleData);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800615 return true;
616 }
617
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800618 @Override
Wink Savillec3886682009-04-02 11:00:56 -0700619 public boolean onPrepareOptionsMenu(Menu menu) {
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800620 // Get the TOGGLE DATA menu item in the right state.
621 MenuItem item = menu.findItem(MENU_ITEM_TOGGLE_DATA);
622 int state = mTelephonyManager.getDataState();
623 boolean visible = true;
624
625 switch (state) {
626 case TelephonyManager.DATA_CONNECTED:
627 case TelephonyManager.DATA_SUSPENDED:
Nathan Harold2b77d742016-03-19 13:22:10 -0700628 item.setTitle(R.string.radio_info_data_connection_disable);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800629 break;
630 case TelephonyManager.DATA_DISCONNECTED:
Nathan Harold2b77d742016-03-19 13:22:10 -0700631 item.setTitle(R.string.radio_info_data_connection_enable);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800632 break;
633 default:
634 visible = false;
635 break;
636 }
637 item.setVisible(visible);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800638 return true;
639 }
640
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800641 private void updateDnsCheckState() {
Nathan Haroldcea413a2015-11-23 15:48:10 -0800642 //FIXME: Replace with a TelephonyManager call
Mike Lockwood5304c7e2009-04-05 11:37:45 -0700643 dnsCheckState.setText(phone.isDnsCheckDisabled() ?
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800644 "0.0.0.0 allowed" :"0.0.0.0 not allowed");
645 }
Wink Savillee2a14e32009-05-29 14:06:30 -0700646
Nathan Haroldf10ea322018-04-24 13:31:07 -0700647 private void updateBandwidths(int dlbw, int ulbw) {
648 dlbw = (dlbw < 0 || dlbw == Integer.MAX_VALUE) ? -1 : dlbw;
649 ulbw = (ulbw < 0 || ulbw == Integer.MAX_VALUE) ? -1 : ulbw;
650 mDownlinkKbps.setText(String.format("%-5d", dlbw));
651 mUplinkKbps.setText(String.format("%-5d", ulbw));
652 }
653
654
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800655 private final void
Nathan Harold2b77d742016-03-19 13:22:10 -0700656 updateSignalStrength(SignalStrength signalStrength) {
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800657 Resources r = getResources();
658
Nathan Harold2b77d742016-03-19 13:22:10 -0700659 int signalDbm = signalStrength.getDbm();
Wink Savillee2a14e32009-05-29 14:06:30 -0700660
Nathan Harold2b77d742016-03-19 13:22:10 -0700661 int signalAsu = signalStrength.getAsuLevel();
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800662
663 if (-1 == signalAsu) signalAsu = 0;
664
665 dBm.setText(String.valueOf(signalDbm) + " "
666 + r.getString(R.string.radioInfo_display_dbm) + " "
667 + String.valueOf(signalAsu) + " "
668 + r.getString(R.string.radioInfo_display_asu));
669 }
670
671 private final void updateLocation(CellLocation location) {
jsh534f5ae2009-09-24 09:19:22 -0700672 Resources r = getResources();
Wink Savillec3886682009-04-02 11:00:56 -0700673 if (location instanceof GsmCellLocation) {
674 GsmCellLocation loc = (GsmCellLocation)location;
jsh534f5ae2009-09-24 09:19:22 -0700675 int lac = loc.getLac();
676 int cid = loc.getCid();
677 mLocation.setText(r.getString(R.string.radioInfo_lac) + " = "
678 + ((lac == -1) ? "unknown" : Integer.toHexString(lac))
679 + " "
680 + r.getString(R.string.radioInfo_cid) + " = "
681 + ((cid == -1) ? "unknown" : Integer.toHexString(cid)));
682 } else if (location instanceof CdmaCellLocation) {
683 CdmaCellLocation loc = (CdmaCellLocation)location;
684 int bid = loc.getBaseStationId();
685 int sid = loc.getSystemId();
686 int nid = loc.getNetworkId();
687 int lat = loc.getBaseStationLatitude();
688 int lon = loc.getBaseStationLongitude();
689 mLocation.setText("BID = "
690 + ((bid == -1) ? "unknown" : Integer.toHexString(bid))
691 + " "
692 + "SID = "
693 + ((sid == -1) ? "unknown" : Integer.toHexString(sid))
694 + " "
695 + "NID = "
696 + ((nid == -1) ? "unknown" : Integer.toHexString(nid))
697 + "\n"
698 + "LAT = "
699 + ((lat == -1) ? "unknown" : Integer.toHexString(lat))
700 + " "
701 + "LONG = "
702 + ((lon == -1) ? "unknown" : Integer.toHexString(lon)));
703 } else {
704 mLocation.setText("unknown");
Wink Savillec3886682009-04-02 11:00:56 -0700705 }
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800706
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800707
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800708 }
709
Nathan Haroldcea413a2015-11-23 15:48:10 -0800710 private final String getCellInfoDisplayString(int i) {
711 return (i != Integer.MAX_VALUE) ? Integer.toString(i) : "";
712 }
713
714 private final String getCellInfoDisplayString(long i) {
715 return (i != Long.MAX_VALUE) ? Long.toString(i) : "";
716 }
717
Nathan Harold6e16fdf2018-04-17 17:01:32 -0700718 private final String getConnectionStatusString(CellInfo ci) {
719 String regStr = "";
720 String connStatStr = "";
721 String connector = "";
722
723 if (ci.isRegistered()) {
724 regStr = "R";
725 }
726 switch (ci.getCellConnectionStatus()) {
727 case CellInfo.CONNECTION_PRIMARY_SERVING: connStatStr = "P"; break;
728 case CellInfo.CONNECTION_SECONDARY_SERVING: connStatStr = "S"; break;
729 case CellInfo.CONNECTION_NONE: connStatStr = "N"; break;
730 case CellInfo.CONNECTION_UNKNOWN: /* Field is unsupported */ break;
731 default: break;
732 }
733 if (!TextUtils.isEmpty(regStr) && !TextUtils.isEmpty(connStatStr)) {
734 connector = "+";
735 }
736
737 return regStr + connector + connStatStr;
738 }
739
Nathan Haroldcea413a2015-11-23 15:48:10 -0800740 private final String buildCdmaInfoString(CellInfoCdma ci) {
741 CellIdentityCdma cidCdma = ci.getCellIdentity();
742 CellSignalStrengthCdma ssCdma = ci.getCellSignalStrength();
743
744 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 -0700745 getConnectionStatusString(ci),
Nathan Haroldcea413a2015-11-23 15:48:10 -0800746 getCellInfoDisplayString(cidCdma.getSystemId()),
747 getCellInfoDisplayString(cidCdma.getNetworkId()),
748 getCellInfoDisplayString(cidCdma.getBasestationId()),
749 getCellInfoDisplayString(ssCdma.getCdmaDbm()),
750 getCellInfoDisplayString(ssCdma.getCdmaEcio()),
751 getCellInfoDisplayString(ssCdma.getEvdoDbm()),
752 getCellInfoDisplayString(ssCdma.getEvdoEcio()),
753 getCellInfoDisplayString(ssCdma.getEvdoSnr()));
754 }
755
756 private final String buildGsmInfoString(CellInfoGsm ci) {
757 CellIdentityGsm cidGsm = ci.getCellIdentity();
758 CellSignalStrengthGsm ssGsm = ci.getCellSignalStrength();
759
Nathan Harold2b77d742016-03-19 13:22:10 -0700760 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 -0700761 getConnectionStatusString(ci),
Nathan Haroldcea413a2015-11-23 15:48:10 -0800762 getCellInfoDisplayString(cidGsm.getMcc()),
763 getCellInfoDisplayString(cidGsm.getMnc()),
764 getCellInfoDisplayString(cidGsm.getLac()),
765 getCellInfoDisplayString(cidGsm.getCid()),
Nathan Harold2b77d742016-03-19 13:22:10 -0700766 getCellInfoDisplayString(cidGsm.getArfcn()),
767 getCellInfoDisplayString(cidGsm.getBsic()),
Nathan Haroldcea413a2015-11-23 15:48:10 -0800768 getCellInfoDisplayString(ssGsm.getDbm()));
769 }
770
771 private final String buildLteInfoString(CellInfoLte ci) {
772 CellIdentityLte cidLte = ci.getCellIdentity();
773 CellSignalStrengthLte ssLte = ci.getCellSignalStrength();
774
775 return String.format(
Nathan Harold6e16fdf2018-04-17 17:01:32 -0700776 "%-3.3s %-3.3s %-3.3s %-5.5s %-5.5s %-3.3s %-6.6s %-2.2s %-4.4s %-4.4s %-2.2s\n",
777 getConnectionStatusString(ci),
Nathan Haroldcea413a2015-11-23 15:48:10 -0800778 getCellInfoDisplayString(cidLte.getMcc()),
779 getCellInfoDisplayString(cidLte.getMnc()),
780 getCellInfoDisplayString(cidLte.getTac()),
781 getCellInfoDisplayString(cidLte.getCi()),
782 getCellInfoDisplayString(cidLte.getPci()),
Nathan Harold2b77d742016-03-19 13:22:10 -0700783 getCellInfoDisplayString(cidLte.getEarfcn()),
Nathan Harold6e16fdf2018-04-17 17:01:32 -0700784 getCellInfoDisplayString(cidLte.getBandwidth()),
Nathan Haroldcea413a2015-11-23 15:48:10 -0800785 getCellInfoDisplayString(ssLte.getDbm()),
786 getCellInfoDisplayString(ssLte.getRsrq()),
787 getCellInfoDisplayString(ssLte.getTimingAdvance()));
788 }
789
790 private final String buildWcdmaInfoString(CellInfoWcdma ci) {
791 CellIdentityWcdma cidWcdma = ci.getCellIdentity();
792 CellSignalStrengthWcdma ssWcdma = ci.getCellSignalStrength();
793
Nathan Harold2b77d742016-03-19 13:22:10 -0700794 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 -0700795 getConnectionStatusString(ci),
Nathan Haroldcea413a2015-11-23 15:48:10 -0800796 getCellInfoDisplayString(cidWcdma.getMcc()),
797 getCellInfoDisplayString(cidWcdma.getMnc()),
798 getCellInfoDisplayString(cidWcdma.getLac()),
799 getCellInfoDisplayString(cidWcdma.getCid()),
Nathan Harold2b77d742016-03-19 13:22:10 -0700800 getCellInfoDisplayString(cidWcdma.getUarfcn()),
Nathan Haroldcea413a2015-11-23 15:48:10 -0800801 getCellInfoDisplayString(cidWcdma.getPsc()),
802 getCellInfoDisplayString(ssWcdma.getDbm()));
803 }
804
805 private final String buildCellInfoString(List<CellInfo> arrayCi) {
806 String value = new String();
807 StringBuilder cdmaCells = new StringBuilder(),
808 gsmCells = new StringBuilder(),
809 lteCells = new StringBuilder(),
810 wcdmaCells = new StringBuilder();
811
812 if (arrayCi != null) {
813 for (CellInfo ci : arrayCi) {
814
815 if (ci instanceof CellInfoLte) {
816 lteCells.append(buildLteInfoString((CellInfoLte) ci));
817 } else if (ci instanceof CellInfoWcdma) {
818 wcdmaCells.append(buildWcdmaInfoString((CellInfoWcdma) ci));
819 } else if (ci instanceof CellInfoGsm) {
820 gsmCells.append(buildGsmInfoString((CellInfoGsm) ci));
821 } else if (ci instanceof CellInfoCdma) {
822 cdmaCells.append(buildCdmaInfoString((CellInfoCdma) ci));
Wink Saville79bff2a2012-06-01 14:37:21 -0700823 }
824 }
Nathan Haroldcea413a2015-11-23 15:48:10 -0800825 if (lteCells.length() != 0) {
826 value += String.format(
Nathan Harold6e16fdf2018-04-17 17:01:32 -0700827 "LTE\n%-3.3s %-3.3s %-3.3s %-5.5s %-5.5s %-3.3s"
828 + " %-6.6s %-2.2s %-4.4s %-4.4s %-2.2s\n",
829 "SRV", "MCC", "MNC", "TAC", "CID", "PCI",
830 "EARFCN", "BW", "RSRP", "RSRQ", "TA");
Nathan Haroldcea413a2015-11-23 15:48:10 -0800831 value += lteCells.toString();
832 }
833 if (wcdmaCells.length() != 0) {
Nathan Harold6e16fdf2018-04-17 17:01:32 -0700834 value += String.format(
835 "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 -0700836 "SRV", "MCC", "MNC", "LAC", "CID", "UARFCN", "PSC", "RSCP");
Nathan Haroldcea413a2015-11-23 15:48:10 -0800837 value += wcdmaCells.toString();
838 }
839 if (gsmCells.length() != 0) {
Nathan Harold6e16fdf2018-04-17 17:01:32 -0700840 value += String.format(
841 "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 -0700842 "SRV", "MCC", "MNC", "LAC", "CID", "ARFCN", "BSIC", "RSSI");
Nathan Haroldcea413a2015-11-23 15:48:10 -0800843 value += gsmCells.toString();
844 }
845 if (cdmaCells.length() != 0) {
846 value += String.format(
847 "CDMA/EVDO\n%-3.3s %-5.5s %-5.5s %-5.5s %-6.6s %-6.6s %-6.6s %-6.6s %-5.5s\n",
848 "SRV", "SID", "NID", "BSID", "C-RSSI", "C-ECIO", "E-RSSI", "E-ECIO", "E-SNR");
849 value += cdmaCells.toString();
850 }
851 } else {
852 value ="unknown";
Wink Saville79bff2a2012-06-01 14:37:21 -0700853 }
Nathan Haroldcea413a2015-11-23 15:48:10 -0800854
855 return value.toString();
856 }
857
858 private final void updateCellInfo(List<CellInfo> arrayCi) {
859 mCellInfo.setText(buildCellInfoString(arrayCi));
Wink Saville79bff2a2012-06-01 14:37:21 -0700860 }
861
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800862 private final void
863 updateMessageWaiting() {
864 mMwi.setText(String.valueOf(mMwiValue));
865 }
866
867 private final void
868 updateCallRedirect() {
869 mCfi.setText(String.valueOf(mCfiValue));
870 }
871
872
873 private final void
Nathan Harold2b77d742016-03-19 13:22:10 -0700874 updateServiceState(ServiceState serviceState) {
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800875 int state = serviceState.getState();
876 Resources r = getResources();
877 String display = r.getString(R.string.radioInfo_unknown);
johnwang342101a2009-09-23 16:22:34 -0700878
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800879 switch (state) {
880 case ServiceState.STATE_IN_SERVICE:
881 display = r.getString(R.string.radioInfo_service_in);
882 break;
883 case ServiceState.STATE_OUT_OF_SERVICE:
884 case ServiceState.STATE_EMERGENCY_ONLY:
885 display = r.getString(R.string.radioInfo_service_emergency);
886 break;
887 case ServiceState.STATE_POWER_OFF:
888 display = r.getString(R.string.radioInfo_service_off);
889 break;
890 }
johnwang342101a2009-09-23 16:22:34 -0700891
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800892 gsmState.setText(display);
johnwang342101a2009-09-23 16:22:34 -0700893
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800894 if (serviceState.getRoaming()) {
895 roamingState.setText(R.string.radioInfo_roaming_in);
896 } else {
897 roamingState.setText(R.string.radioInfo_roaming_not);
898 }
899
900 operatorName.setText(serviceState.getOperatorAlphaLong());
901 }
902
903 private final void
Nathan Harold2b77d742016-03-19 13:22:10 -0700904 updatePhoneState(int state) {
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800905 Resources r = getResources();
906 String display = r.getString(R.string.radioInfo_unknown);
907
908 switch (state) {
Nathan Harold2b77d742016-03-19 13:22:10 -0700909 case TelephonyManager.CALL_STATE_IDLE:
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800910 display = r.getString(R.string.radioInfo_phone_idle);
911 break;
Nathan Harold2b77d742016-03-19 13:22:10 -0700912 case TelephonyManager.CALL_STATE_RINGING:
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800913 display = r.getString(R.string.radioInfo_phone_ringing);
914 break;
Nathan Harold2b77d742016-03-19 13:22:10 -0700915 case TelephonyManager.CALL_STATE_OFFHOOK:
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800916 display = r.getString(R.string.radioInfo_phone_offhook);
917 break;
918 }
919
920 callState.setText(display);
921 }
922
923 private final void
924 updateDataState() {
925 int state = mTelephonyManager.getDataState();
926 Resources r = getResources();
927 String display = r.getString(R.string.radioInfo_unknown);
928
929 switch (state) {
930 case TelephonyManager.DATA_CONNECTED:
931 display = r.getString(R.string.radioInfo_data_connected);
932 break;
933 case TelephonyManager.DATA_CONNECTING:
934 display = r.getString(R.string.radioInfo_data_connecting);
935 break;
936 case TelephonyManager.DATA_DISCONNECTED:
937 display = r.getString(R.string.radioInfo_data_disconnected);
938 break;
939 case TelephonyManager.DATA_SUSPENDED:
940 display = r.getString(R.string.radioInfo_data_suspended);
941 break;
942 }
johnwang342101a2009-09-23 16:22:34 -0700943
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800944 gprsState.setText(display);
945 }
946
947 private final void updateNetworkType() {
Nathan Harolde272c202016-10-27 13:45:00 -0700948 if(phone != null) {
Nathan Harold2b77d742016-03-19 13:22:10 -0700949 ServiceState ss = phone.getServiceState();
950 dataNetwork.setText(ServiceState.rilRadioTechnologyToString(
951 phone.getServiceState().getRilDataRadioTechnology()));
952 voiceNetwork.setText(ServiceState.rilRadioTechnologyToString(
953 phone.getServiceState().getRilVoiceRadioTechnology()));
954 }
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800955 }
956
957 private final void
958 updateProperties() {
959 String s;
960 Resources r = getResources();
961
962 s = phone.getDeviceId();
johnwang342101a2009-09-23 16:22:34 -0700963 if (s == null) s = r.getString(R.string.radioInfo_unknown);
Wink Savillec3886682009-04-02 11:00:56 -0700964 mDeviceId.setText(s);
johnwang342101a2009-09-23 16:22:34 -0700965
Meng Wang9053f172017-06-23 16:02:14 -0700966 s = phone.getSubscriberId();
967 if (s == null) s = r.getString(R.string.radioInfo_unknown);
968 mSubscriberId.setText(s);
969
Nathan Haroldcea413a2015-11-23 15:48:10 -0800970 //FIXME: Replace with a TelephonyManager call
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800971 s = phone.getLine1Number();
johnwang342101a2009-09-23 16:22:34 -0700972 if (s == null) s = r.getString(R.string.radioInfo_unknown);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800973 number.setText(s);
974 }
975
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800976 private final void updateDataStats2() {
977 Resources r = getResources();
978
Jeff Sharkey93029862011-05-27 18:26:15 -0700979 long txPackets = TrafficStats.getMobileTxPackets();
980 long rxPackets = TrafficStats.getMobileRxPackets();
981 long txBytes = TrafficStats.getMobileTxBytes();
982 long rxBytes = TrafficStats.getMobileRxBytes();
johnwang342101a2009-09-23 16:22:34 -0700983
Jeff Sharkey93029862011-05-27 18:26:15 -0700984 String packets = r.getString(R.string.radioInfo_display_packets);
985 String bytes = r.getString(R.string.radioInfo_display_bytes);
johnwang342101a2009-09-23 16:22:34 -0700986
Jeff Sharkey93029862011-05-27 18:26:15 -0700987 sent.setText(txPackets + " " + packets + ", " + txBytes + " " + bytes);
988 received.setText(rxPackets + " " + packets + ", " + rxBytes + " " + bytes);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800989 }
990
991 /**
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800992 * Ping a host name
993 */
994 private final void pingHostname() {
995 try {
Nathan Haroldcea413a2015-11-23 15:48:10 -0800996 try {
997 Process p4 = Runtime.getRuntime().exec("ping -c 1 www.google.com");
998 int status4 = p4.waitFor();
999 if (status4 == 0) {
1000 mPingHostnameResultV4 = "Pass";
1001 } else {
1002 mPingHostnameResultV4 = String.format("Fail(%d)", status4);
1003 }
1004 } catch (IOException e) {
1005 mPingHostnameResultV4 = "Fail: IOException";
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001006 }
Nathan Haroldcea413a2015-11-23 15:48:10 -08001007 try {
1008 Process p6 = Runtime.getRuntime().exec("ping6 -c 1 www.google.com");
1009 int status6 = p6.waitFor();
1010 if (status6 == 0) {
1011 mPingHostnameResultV6 = "Pass";
1012 } else {
1013 mPingHostnameResultV6 = String.format("Fail(%d)", status6);
1014 }
1015 } catch (IOException e) {
1016 mPingHostnameResultV6 = "Fail: IOException";
1017 }
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001018 } catch (InterruptedException e) {
Nathan Haroldcea413a2015-11-23 15:48:10 -08001019 mPingHostnameResultV4 = mPingHostnameResultV6 = "Fail: InterruptedException";
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001020 }
1021 }
1022
1023 /**
1024 * This function checks for basic functionality of HTTP Client.
1025 */
1026 private void httpClientTest() {
Narayan Kamathf25627c2014-12-12 13:53:28 +00001027 HttpURLConnection urlConnection = null;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001028 try {
Narayan Kamathf25627c2014-12-12 13:53:28 +00001029 // TODO: Hardcoded for now, make it UI configurable
Alex Klyubinb0090232015-04-02 11:08:51 -07001030 URL url = new URL("https://www.google.com");
Narayan Kamathf25627c2014-12-12 13:53:28 +00001031 urlConnection = (HttpURLConnection) url.openConnection();
1032 if (urlConnection.getResponseCode() == 200) {
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001033 mHttpClientTestResult = "Pass";
1034 } else {
Narayan Kamathf25627c2014-12-12 13:53:28 +00001035 mHttpClientTestResult = "Fail: Code: " + urlConnection.getResponseMessage();
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001036 }
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001037 } catch (IOException e) {
1038 mHttpClientTestResult = "Fail: IOException";
Narayan Kamathf25627c2014-12-12 13:53:28 +00001039 } finally {
1040 if (urlConnection != null) {
1041 urlConnection.disconnect();
1042 }
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001043 }
1044 }
1045
1046 private void refreshSmsc() {
Nathan Haroldcea413a2015-11-23 15:48:10 -08001047 //FIXME: Replace with a TelephonyManager call
jsh21dd4072009-05-12 11:26:55 -07001048 phone.getSmscAddress(mHandler.obtainMessage(EVENT_QUERY_SMSC_DONE));
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001049 }
1050
Nathan Haroldcea413a2015-11-23 15:48:10 -08001051 private final void updateAllCellInfo() {
1052
1053 mCellInfo.setText("");
Nathan Haroldcea413a2015-11-23 15:48:10 -08001054 mLocation.setText("");
1055
1056 final Runnable updateAllCellInfoResults = new Runnable() {
1057 public void run() {
Nathan Haroldcea413a2015-11-23 15:48:10 -08001058 updateLocation(mCellLocationResult);
1059 updateCellInfo(mCellInfoResult);
1060 }
1061 };
1062
1063 Thread locThread = new Thread() {
1064 @Override
1065 public void run() {
1066 mCellInfoResult = mTelephonyManager.getAllCellInfo();
1067 mCellLocationResult = mTelephonyManager.getCellLocation();
Nathan Haroldcea413a2015-11-23 15:48:10 -08001068
1069 mHandler.post(updateAllCellInfoResults);
1070 }
1071 };
1072 locThread.start();
1073 }
1074
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001075 private final void updatePingState() {
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001076 // Set all to unknown since the threads will take a few secs to update.
Nathan Haroldcea413a2015-11-23 15:48:10 -08001077 mPingHostnameResultV4 = getResources().getString(R.string.radioInfo_unknown);
1078 mPingHostnameResultV6 = getResources().getString(R.string.radioInfo_unknown);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001079 mHttpClientTestResult = getResources().getString(R.string.radioInfo_unknown);
1080
Nathan Haroldcea413a2015-11-23 15:48:10 -08001081 mPingHostnameV4.setText(mPingHostnameResultV4);
1082 mPingHostnameV6.setText(mPingHostnameResultV6);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001083 mHttpClientTest.setText(mHttpClientTestResult);
1084
1085 final Runnable updatePingResults = new Runnable() {
1086 public void run() {
Nathan Haroldcea413a2015-11-23 15:48:10 -08001087 mPingHostnameV4.setText(mPingHostnameResultV4);
1088 mPingHostnameV6.setText(mPingHostnameResultV6);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001089 mHttpClientTest.setText(mHttpClientTestResult);
1090 }
1091 };
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001092
1093 Thread hostname = new Thread() {
1094 @Override
1095 public void run() {
1096 pingHostname();
Nathan Haroldcea413a2015-11-23 15:48:10 -08001097 mHandler.post(updatePingResults);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001098 }
1099 };
1100 hostname.start();
1101
1102 Thread httpClient = new Thread() {
1103 @Override
1104 public void run() {
1105 httpClientTest();
Nathan Haroldcea413a2015-11-23 15:48:10 -08001106 mHandler.post(updatePingResults);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001107 }
1108 };
1109 httpClient.start();
1110 }
1111
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001112 private MenuItem.OnMenuItemClickListener mViewADNCallback = new MenuItem.OnMenuItemClickListener() {
1113 public boolean onMenuItemClick(MenuItem item) {
1114 Intent intent = new Intent(Intent.ACTION_VIEW);
1115 // XXX We need to specify the component here because if we don't
1116 // the activity manager will try to resolve the type by calling
1117 // the content provider, which causes it to be loaded in a process
1118 // other than the Dialer process, which causes a lot of stuff to
1119 // break.
1120 intent.setClassName("com.android.phone",
1121 "com.android.phone.SimContacts");
1122 startActivity(intent);
1123 return true;
1124 }
1125 };
1126
1127 private MenuItem.OnMenuItemClickListener mViewFDNCallback = new MenuItem.OnMenuItemClickListener() {
1128 public boolean onMenuItemClick(MenuItem item) {
1129 Intent intent = new Intent(Intent.ACTION_VIEW);
1130 // XXX We need to specify the component here because if we don't
1131 // the activity manager will try to resolve the type by calling
1132 // the content provider, which causes it to be loaded in a process
1133 // other than the Dialer process, which causes a lot of stuff to
1134 // break.
1135 intent.setClassName("com.android.phone",
Andrew Leeda90d682014-10-31 13:12:20 -07001136 "com.android.phone.settings.fdn.FdnList");
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001137 startActivity(intent);
1138 return true;
1139 }
1140 };
1141
1142 private MenuItem.OnMenuItemClickListener mViewSDNCallback = new MenuItem.OnMenuItemClickListener() {
1143 public boolean onMenuItemClick(MenuItem item) {
1144 Intent intent = new Intent(
Wink Savillec3886682009-04-02 11:00:56 -07001145 Intent.ACTION_VIEW, Uri.parse("content://icc/sdn"));
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001146 // XXX We need to specify the component here because if we don't
1147 // the activity manager will try to resolve the type by calling
1148 // the content provider, which causes it to be loaded in a process
1149 // other than the Dialer process, which causes a lot of stuff to
1150 // break.
1151 intent.setClassName("com.android.phone",
1152 "com.android.phone.ADNList");
1153 startActivity(intent);
1154 return true;
1155 }
1156 };
1157
Nathan Harolde272c202016-10-27 13:45:00 -07001158 private MenuItem.OnMenuItemClickListener mGetImsStatus = new MenuItem.OnMenuItemClickListener() {
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001159 public boolean onMenuItemClick(MenuItem item) {
Nathan Harolde272c202016-10-27 13:45:00 -07001160 boolean isImsRegistered = phone.isImsRegistered();
1161 boolean availableVolte = phone.isVolteEnabled();
1162 boolean availableWfc = phone.isWifiCallingEnabled();
1163 boolean availableVt = phone.isVideoEnabled();
1164 boolean availableUt = phone.isUtEnabled();
1165
1166 final String imsRegString = isImsRegistered ?
1167 getString(R.string.radio_info_ims_reg_status_registered) :
1168 getString(R.string.radio_info_ims_reg_status_not_registered);
1169
1170 final String available = getString(R.string.radio_info_ims_feature_status_available);
1171 final String unavailable = getString(
1172 R.string.radio_info_ims_feature_status_unavailable);
1173
1174 String imsStatus = getString(R.string.radio_info_ims_reg_status,
1175 imsRegString,
1176 availableVolte ? available : unavailable,
1177 availableWfc ? available : unavailable,
1178 availableVt ? available : unavailable,
1179 availableUt ? available : unavailable);
1180
1181 AlertDialog imsDialog = new AlertDialog.Builder(RadioInfo.this)
1182 .setMessage(imsStatus)
1183 .setTitle(getString(R.string.radio_info_ims_reg_status_title))
1184 .create();
1185
1186 imsDialog.show();
1187
Tammo Spalinka5f4c8f2009-10-15 20:08:58 +08001188 return true;
1189 }
1190 };
1191
1192 private MenuItem.OnMenuItemClickListener mSelectBandCallback = new MenuItem.OnMenuItemClickListener() {
1193 public boolean onMenuItemClick(MenuItem item) {
1194 Intent intent = new Intent();
1195 intent.setClass(RadioInfo.this, BandMode.class);
1196 startActivity(intent);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001197 return true;
1198 }
1199 };
johnwang342101a2009-09-23 16:22:34 -07001200
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001201 private MenuItem.OnMenuItemClickListener mToggleData = new MenuItem.OnMenuItemClickListener() {
1202 public boolean onMenuItemClick(MenuItem item) {
1203 int state = mTelephonyManager.getDataState();
1204 switch (state) {
1205 case TelephonyManager.DATA_CONNECTED:
Jack Yu50972ed2018-12-13 11:51:20 -08001206 mTelephonyManager.setDataEnabled(false);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001207 break;
1208 case TelephonyManager.DATA_DISCONNECTED:
Jack Yu50972ed2018-12-13 11:51:20 -08001209 mTelephonyManager.setDataEnabled(true);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001210 break;
1211 default:
1212 // do nothing
1213 break;
1214 }
1215 return true;
1216 }
1217 };
1218
Nathan Harold2b77d742016-03-19 13:22:10 -07001219 private boolean isRadioOn() {
1220 //FIXME: Replace with a TelephonyManager call
1221 return phone.getServiceState().getState() != ServiceState.STATE_POWER_OFF;
1222 }
1223
1224 private void updateRadioPowerState() {
1225 //delightful hack to prevent on-checked-changed calls from
1226 //actually forcing the radio preference to its transient/current value.
1227 radioPowerOnSwitch.setOnCheckedChangeListener(null);
1228 radioPowerOnSwitch.setChecked(isRadioOn());
1229 radioPowerOnSwitch.setOnCheckedChangeListener(mRadioPowerOnChangeListener);
1230 }
1231
Nathan Harolde272c202016-10-27 13:45:00 -07001232 void setImsVolteProvisionedState(boolean state) {
Nathan Harold12e1f552016-06-17 13:55:38 -07001233 Log.d(TAG, "setImsVolteProvisioned state: " + ((state)? "on":"off"));
Nathan Harolde272c202016-10-27 13:45:00 -07001234 setImsConfigProvisionedState(IMS_VOLTE_PROVISIONED_CONFIG_ID, state);
Nathan Harold12e1f552016-06-17 13:55:38 -07001235 }
1236
Nathan Harolde272c202016-10-27 13:45:00 -07001237 void setImsVtProvisionedState(boolean state) {
Nathan Harold12e1f552016-06-17 13:55:38 -07001238 Log.d(TAG, "setImsVtProvisioned() state: " + ((state)? "on":"off"));
Nathan Harolde272c202016-10-27 13:45:00 -07001239 setImsConfigProvisionedState(IMS_VT_PROVISIONED_CONFIG_ID, state);
Nathan Harold12e1f552016-06-17 13:55:38 -07001240 }
1241
Nathan Harolde272c202016-10-27 13:45:00 -07001242 void setImsWfcProvisionedState(boolean state) {
Nathan Harold12e1f552016-06-17 13:55:38 -07001243 Log.d(TAG, "setImsWfcProvisioned() state: " + ((state)? "on":"off"));
Nathan Harolde272c202016-10-27 13:45:00 -07001244 setImsConfigProvisionedState(IMS_WFC_PROVISIONED_CONFIG_ID, state);
Nathan Harold12e1f552016-06-17 13:55:38 -07001245 }
1246
Meng Wang586741c2017-04-26 15:02:51 -07001247 void setEabProvisionedState(boolean state) {
1248 Log.d(TAG, "setEabProvisioned() state: " + ((state)? "on":"off"));
1249 setImsConfigProvisionedState(EAB_PROVISIONED_CONFIG_ID, state);
1250 }
1251
Nathan Harolde272c202016-10-27 13:45:00 -07001252 void setImsConfigProvisionedState(int configItem, boolean state) {
Nathan Harold12e1f552016-06-17 13:55:38 -07001253 if (phone != null && mImsManager != null) {
Philip P. Moltmann5c449ae2017-02-14 12:43:02 -08001254 QueuedWork.queue(new Runnable() {
Nathan Harold12e1f552016-06-17 13:55:38 -07001255 public void run() {
1256 try {
1257 mImsManager.getConfigInterface().setProvisionedValue(
1258 configItem,
1259 state? 1 : 0);
1260 } catch (ImsException e) {
1261 Log.e(TAG, "setImsConfigProvisioned() exception:", e);
1262 }
1263 }
Philip P. Moltmann5c449ae2017-02-14 12:43:02 -08001264 }, false);
Nathan Harold12e1f552016-06-17 13:55:38 -07001265 }
1266 }
1267
Nathan Harold2b77d742016-03-19 13:22:10 -07001268 OnCheckedChangeListener mRadioPowerOnChangeListener = new OnCheckedChangeListener() {
1269 @Override
1270 public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
1271 log("toggle radio power: currently " + (isRadioOn()?"on":"off"));
1272 phone.setRadioPower(isChecked);
1273 }
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001274 };
1275
Nathan Harold12e1f552016-06-17 13:55:38 -07001276 private boolean isImsVolteProvisioned() {
Nathan Harold2b77d742016-03-19 13:22:10 -07001277 if (phone != null && mImsManager != null) {
1278 return mImsManager.isVolteEnabledByPlatform(phone.getContext())
1279 && mImsManager.isVolteProvisionedOnDevice(phone.getContext());
Pavel Zhamaitsiakcb267a62015-01-21 18:25:14 -08001280 }
1281 return false;
1282 }
1283
Nathan Harold12e1f552016-06-17 13:55:38 -07001284 OnCheckedChangeListener mImsVolteCheckedChangeListener = new OnCheckedChangeListener() {
Wink Saville426fc662011-09-25 14:39:02 -07001285 @Override
Nathan Harold2b77d742016-03-19 13:22:10 -07001286 public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
Nathan Harold12e1f552016-06-17 13:55:38 -07001287 setImsVolteProvisionedState(isChecked);
Nathan Harolde272c202016-10-27 13:45:00 -07001288 }
Wink Saville426fc662011-09-25 14:39:02 -07001289 };
1290
Nathan Harold12e1f552016-06-17 13:55:38 -07001291 private boolean isImsVtProvisioned() {
1292 if (phone != null && mImsManager != null) {
1293 return mImsManager.isVtEnabledByPlatform(phone.getContext())
1294 && mImsManager.isVtProvisionedOnDevice(phone.getContext());
1295 }
1296 return false;
1297 }
1298
1299 OnCheckedChangeListener mImsVtCheckedChangeListener = new OnCheckedChangeListener() {
1300 @Override
1301 public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
1302 setImsVtProvisionedState(isChecked);
Nathan Harolde272c202016-10-27 13:45:00 -07001303 }
Nathan Harold12e1f552016-06-17 13:55:38 -07001304 };
1305
1306 private boolean isImsWfcProvisioned() {
1307 if (phone != null && mImsManager != null) {
1308 return mImsManager.isWfcEnabledByPlatform(phone.getContext())
1309 && mImsManager.isWfcProvisionedOnDevice(phone.getContext());
1310 }
1311 return false;
1312 }
1313
1314 OnCheckedChangeListener mImsWfcCheckedChangeListener = new OnCheckedChangeListener() {
1315 @Override
1316 public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
1317 setImsWfcProvisionedState(isChecked);
Nathan Harolde272c202016-10-27 13:45:00 -07001318 }
Nathan Harold12e1f552016-06-17 13:55:38 -07001319 };
1320
Meng Wang586741c2017-04-26 15:02:51 -07001321 private boolean isEabProvisioned() {
1322 return isFeatureProvisioned(EAB_PROVISIONED_CONFIG_ID, false);
1323 }
1324
1325 OnCheckedChangeListener mEabCheckedChangeListener = new OnCheckedChangeListener() {
1326 @Override
1327 public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
1328 setEabProvisionedState(isChecked);
1329 }
1330 };
1331
1332 private boolean isFeatureProvisioned(int featureId, boolean defaultValue) {
1333 boolean provisioned = defaultValue;
1334 if (mImsManager != null) {
1335 try {
1336 ImsConfig imsConfig = mImsManager.getConfigInterface();
1337 if (imsConfig != null) {
1338 provisioned =
1339 (imsConfig.getProvisionedValue(featureId)
1340 == ImsConfig.FeatureValueConstants.ON);
1341 }
1342 } catch (ImsException ex) {
1343 Log.e(TAG, "isFeatureProvisioned() exception:", ex);
1344 }
1345 }
1346
1347 log("isFeatureProvisioned() featureId=" + featureId + " provisioned=" + provisioned);
1348 return provisioned;
1349 }
1350
1351 private static boolean isEabEnabledByPlatform(Context context) {
1352 if (context != null) {
1353 CarrierConfigManager configManager = (CarrierConfigManager)
1354 context.getSystemService(Context.CARRIER_CONFIG_SERVICE);
1355 if (configManager != null && configManager.getConfig().getBoolean(
1356 CarrierConfigManager.KEY_USE_RCS_PRESENCE_BOOL)) {
1357 return true;
1358 }
1359 }
1360 return false;
1361 }
1362
Nathan Harold12e1f552016-06-17 13:55:38 -07001363 private void updateImsProvisionedState() {
1364 log("updateImsProvisionedState isImsVolteProvisioned()=" + isImsVolteProvisioned());
Nathan Harold2b77d742016-03-19 13:22:10 -07001365 //delightful hack to prevent on-checked-changed calls from
1366 //actually forcing the ims provisioning to its transient/current value.
Nathan Harold12e1f552016-06-17 13:55:38 -07001367 imsVolteProvisionedSwitch.setOnCheckedChangeListener(null);
1368 imsVolteProvisionedSwitch.setChecked(isImsVolteProvisioned());
1369 imsVolteProvisionedSwitch.setOnCheckedChangeListener(mImsVolteCheckedChangeListener);
Sreekanth Badidac888e192018-02-05 17:18:40 +01001370 imsVolteProvisionedSwitch.setEnabled(!Build.IS_USER
1371 && mImsManager.isVolteEnabledByPlatform(phone.getContext()));
Nathan Harold12e1f552016-06-17 13:55:38 -07001372
1373 imsVtProvisionedSwitch.setOnCheckedChangeListener(null);
1374 imsVtProvisionedSwitch.setChecked(isImsVtProvisioned());
1375 imsVtProvisionedSwitch.setOnCheckedChangeListener(mImsVtCheckedChangeListener);
Sreekanth Badidac888e192018-02-05 17:18:40 +01001376 imsVtProvisionedSwitch.setEnabled(!Build.IS_USER
1377 && mImsManager.isVtEnabledByPlatform(phone.getContext()));
Nathan Harold12e1f552016-06-17 13:55:38 -07001378
1379 imsWfcProvisionedSwitch.setOnCheckedChangeListener(null);
1380 imsWfcProvisionedSwitch.setChecked(isImsWfcProvisioned());
1381 imsWfcProvisionedSwitch.setOnCheckedChangeListener(mImsWfcCheckedChangeListener);
Sreekanth Badidac888e192018-02-05 17:18:40 +01001382 imsWfcProvisionedSwitch.setEnabled(!Build.IS_USER
1383 && mImsManager.isWfcEnabledByPlatform(phone.getContext()));
Meng Wang586741c2017-04-26 15:02:51 -07001384
1385 eabProvisionedSwitch.setOnCheckedChangeListener(null);
1386 eabProvisionedSwitch.setChecked(isEabProvisioned());
1387 eabProvisionedSwitch.setOnCheckedChangeListener(mEabCheckedChangeListener);
Sreekanth Badidac888e192018-02-05 17:18:40 +01001388 eabProvisionedSwitch.setEnabled(!Build.IS_USER
1389 && isEabEnabledByPlatform(phone.getContext()));
Wink Saville426fc662011-09-25 14:39:02 -07001390 }
1391
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001392 OnClickListener mDnsCheckButtonHandler = new OnClickListener() {
1393 public void onClick(View v) {
Nathan Haroldcea413a2015-11-23 15:48:10 -08001394 //FIXME: Replace with a TelephonyManager call
Wink Savillec3886682009-04-02 11:00:56 -07001395 phone.disableDnsCheck(!phone.isDnsCheckDisabled());
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001396 updateDnsCheckState();
1397 }
1398 };
johnwang342101a2009-09-23 16:22:34 -07001399
Tammo Spalinka5f4c8f2009-10-15 20:08:58 +08001400 OnClickListener mOemInfoButtonHandler = new OnClickListener() {
1401 public void onClick(View v) {
1402 Intent intent = new Intent("com.android.settings.OEM_RADIO_INFO");
1403 try {
1404 startActivity(intent);
1405 } catch (android.content.ActivityNotFoundException ex) {
Wink Savillebf471282013-04-05 15:04:05 -07001406 log("OEM-specific Info/Settings Activity Not Found : " + ex);
Tammo Spalinka5f4c8f2009-10-15 20:08:58 +08001407 // If the activity does not exist, there are no OEM
1408 // settings, and so we can just do nothing...
1409 }
1410 }
1411 };
1412
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001413 OnClickListener mPingButtonHandler = new OnClickListener() {
1414 public void onClick(View v) {
1415 updatePingState();
1416 }
1417 };
1418
1419 OnClickListener mUpdateSmscButtonHandler = new OnClickListener() {
1420 public void onClick(View v) {
1421 updateSmscButton.setEnabled(false);
jsh21dd4072009-05-12 11:26:55 -07001422 phone.setSmscAddress(smsc.getText().toString(),
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001423 mHandler.obtainMessage(EVENT_UPDATE_SMSC_DONE));
1424 }
1425 };
1426
1427 OnClickListener mRefreshSmscButtonHandler = new OnClickListener() {
1428 public void onClick(View v) {
1429 refreshSmsc();
1430 }
1431 };
1432
Youhan Wangfd781e92016-12-16 15:53:16 -08001433 OnClickListener mCarrierProvisioningButtonHandler = new OnClickListener() {
1434 public void onClick(View v) {
Meng Wanga04449b2017-08-03 14:34:35 -07001435 final Intent intent = new Intent("com.android.settings.CARRIER_PROVISIONING");
1436 final ComponentName serviceComponent = ComponentName.unflattenFromString(
1437 "com.android.omadm.service/.DMIntentReceiver");
Youhan Wangfd781e92016-12-16 15:53:16 -08001438 intent.setComponent(serviceComponent);
Meng Wanga04449b2017-08-03 14:34:35 -07001439 sendBroadcast(intent);
Youhan Wangfd781e92016-12-16 15:53:16 -08001440 }
1441 };
1442
1443 OnClickListener mTriggerCarrierProvisioningButtonHandler = new OnClickListener() {
1444 public void onClick(View v) {
Meng Wanga04449b2017-08-03 14:34:35 -07001445 final Intent intent = new Intent("com.android.settings.TRIGGER_CARRIER_PROVISIONING");
1446 final ComponentName serviceComponent = ComponentName.unflattenFromString(
1447 "com.android.omadm.service/.DMIntentReceiver");
Youhan Wangfd781e92016-12-16 15:53:16 -08001448 intent.setComponent(serviceComponent);
Meng Wanga04449b2017-08-03 14:34:35 -07001449 sendBroadcast(intent);
Youhan Wangfd781e92016-12-16 15:53:16 -08001450 }
1451 };
1452
Nathan Haroldcea413a2015-11-23 15:48:10 -08001453 AdapterView.OnItemSelectedListener mPreferredNetworkHandler =
1454 new AdapterView.OnItemSelectedListener() {
1455
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001456 public void onItemSelected(AdapterView parent, View v, int pos, long id) {
Nathan Haroldcea413a2015-11-23 15:48:10 -08001457 if (mPreferredNetworkTypeResult != pos && pos >= 0
1458 && pos <= mPreferredNetworkLabels.length - 2) {
1459 mPreferredNetworkTypeResult = pos;
Nathan Harolddaea8be2018-06-05 14:02:35 -07001460
1461 // TODO: Possibly migrate this to TelephonyManager.setPreferredNetworkType()
1462 // which today still has some issues (mostly that the "set" is conditional
1463 // on a successful modem call, which is not what we want). Instead we always
1464 // want this setting to be set, so that if the radio hiccups and this setting
1465 // is for some reason unsuccessful, future calls to the radio will reflect
1466 // the users's preference which is set here.
1467 final int subId = phone.getSubId();
1468 if (SubscriptionManager.isUsableSubIdValue(subId)) {
1469 Settings.Global.putInt(phone.getContext().getContentResolver(),
1470 PREFERRED_NETWORK_MODE + subId, mPreferredNetworkTypeResult);
1471 }
1472 log("Calling setPreferredNetworkType(" + mPreferredNetworkTypeResult + ")");
Nathan Haroldcea413a2015-11-23 15:48:10 -08001473 Message msg = mHandler.obtainMessage(EVENT_SET_PREFERRED_TYPE_DONE);
1474 phone.setPreferredNetworkType(mPreferredNetworkTypeResult, msg);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001475 }
1476 }
1477
1478 public void onNothingSelected(AdapterView parent) {
1479 }
1480 };
1481
Nathan Harold2b77d742016-03-19 13:22:10 -07001482 AdapterView.OnItemSelectedListener mCellInfoRefreshRateHandler =
1483 new AdapterView.OnItemSelectedListener() {
Wink Savillebf471282013-04-05 15:04:05 -07001484
Nathan Harold2b77d742016-03-19 13:22:10 -07001485 public void onItemSelected(AdapterView parent, View v, int pos, long id) {
1486 mCellInfoRefreshRateIndex = pos;
Sooraj Sasindran5cce06b2016-08-18 15:49:49 -07001487 mTelephonyManager.setCellInfoListRate(mCellInfoRefreshRates[pos]);
Nathan Harold2b77d742016-03-19 13:22:10 -07001488 updateAllCellInfo();
1489 }
1490
1491 public void onNothingSelected(AdapterView parent) {
1492 }
1493 };
1494
Naina Nallurid1b57f62019-01-08 15:19:58 -08001495 boolean isCbrsSupported() {
1496 return getResources().getBoolean(
1497 com.android.internal.R.bool.config_cbrs_supported);
1498 }
1499
1500 void updateCbrsDataState(boolean state) {
1501 Log.d(TAG, "setCbrsDataSwitchState() state:" + ((state)? "on":"off"));
1502 if (mTelephonyManager != null) {
1503 QueuedWork.queue(new Runnable() {
1504 public void run() {
1505 mTelephonyManager.setOpportunisticNetworkState(state);
1506 cbrsDataSwitch.setChecked(getCbrsDataState());
1507 }
1508 }, false);
1509 }
1510 }
1511
1512 boolean getCbrsDataState() {
1513 boolean state = false;
1514 if (mTelephonyManager != null) {
1515 state = mTelephonyManager.isOpportunisticNetworkEnabled();
1516 }
1517 Log.d(TAG, "getCbrsDataState() state:" +((state)? "on":"off"));
1518 return state;
1519 }
1520
1521 OnCheckedChangeListener mCbrsDataSwitchChangeListener = new OnCheckedChangeListener() {
1522 @Override
1523 public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
1524 updateCbrsDataState(isChecked);
1525 }
1526 };
1527
1528
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001529}