blob: 18c83f465a721614421e112d7a9182131385af49 [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;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800216 private Spinner preferredNetworkType;
Nathan Harold2b77d742016-03-19 13:22:10 -0700217 private Spinner cellInfoRefreshRateSpinner;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800218
Nathan Haroldf10ea322018-04-24 13:31:07 -0700219 private ConnectivityManager mConnectivityManager;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800220 private TelephonyManager mTelephonyManager;
Nathan Haroldcea413a2015-11-23 15:48:10 -0800221 private ImsManager mImsManager = null;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800222 private Phone phone = null;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800223
Nathan Haroldcea413a2015-11-23 15:48:10 -0800224 private String mPingHostnameResultV4;
225 private String mPingHostnameResultV6;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800226 private String mHttpClientTestResult;
227 private boolean mMwiValue = false;
228 private boolean mCfiValue = false;
Nathan Haroldcea413a2015-11-23 15:48:10 -0800229
230 private List<CellInfo> mCellInfoResult = null;
231 private CellLocation mCellLocationResult = null;
Nathan Haroldcea413a2015-11-23 15:48:10 -0800232
233 private int mPreferredNetworkTypeResult;
Nathan Harold2b77d742016-03-19 13:22:10 -0700234 private int mCellInfoRefreshRateIndex;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800235
Nathan Haroldf10ea322018-04-24 13:31:07 -0700236 private final NetworkRequest mDefaultNetworkRequest = new NetworkRequest.Builder()
237 .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
238 .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
239 .build();
240
241 private final NetworkCallback mNetworkCallback = new NetworkCallback() {
242 public void onCapabilitiesChanged(Network n, NetworkCapabilities nc) {
243 int dlbw = nc.getLinkDownstreamBandwidthKbps();
244 int ulbw = nc.getLinkUpstreamBandwidthKbps();
245 updateBandwidths(dlbw, ulbw);
246 }
247 };
248
Nathan Harold2b77d742016-03-19 13:22:10 -0700249 private final PhoneStateListener mPhoneStateListener = new PhoneStateListener() {
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800250 @Override
251 public void onDataConnectionStateChanged(int state) {
252 updateDataState();
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800253 updateNetworkType();
254 }
255
256 @Override
257 public void onDataActivity(int direction) {
258 updateDataStats2();
259 }
260
261 @Override
Nathan Harold2b77d742016-03-19 13:22:10 -0700262 public void onCallStateChanged(int state, String incomingNumber) {
263 updateNetworkType();
264 updatePhoneState(state);
265 }
266
267 @Override
268 public void onPreciseCallStateChanged(PreciseCallState preciseState) {
269 updateNetworkType();
270 }
271
272 @Override
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800273 public void onCellLocationChanged(CellLocation location) {
274 updateLocation(location);
275 }
276
277 @Override
278 public void onMessageWaitingIndicatorChanged(boolean mwi) {
279 mMwiValue = mwi;
280 updateMessageWaiting();
281 }
282
283 @Override
284 public void onCallForwardingIndicatorChanged(boolean cfi) {
285 mCfiValue = cfi;
286 updateCallRedirect();
287 }
Wink Saville79bff2a2012-06-01 14:37:21 -0700288
289 @Override
290 public void onCellInfoChanged(List<CellInfo> arrayCi) {
Wink Savillebf471282013-04-05 15:04:05 -0700291 log("onCellInfoChanged: arrayCi=" + arrayCi);
Nathan Haroldcea413a2015-11-23 15:48:10 -0800292 mCellInfoResult = arrayCi;
293 updateCellInfo(mCellInfoResult);
Wink Saville79bff2a2012-06-01 14:37:21 -0700294 }
Wink Saville4f0d8812014-04-15 22:05:24 -0700295
296 @Override
Nathan Harold2b77d742016-03-19 13:22:10 -0700297 public void onSignalStrengthsChanged(SignalStrength signalStrength) {
298 log("onSignalStrengthChanged: SignalStrength=" +signalStrength);
299 updateSignalStrength(signalStrength);
300 }
301
302 @Override
303 public void onServiceStateChanged(ServiceState serviceState) {
304 log("onServiceStateChanged: ServiceState=" + serviceState);
305 updateServiceState(serviceState);
306 updateRadioPowerState();
307 updateNetworkType();
Nathan Harold12e1f552016-06-17 13:55:38 -0700308 updateImsProvisionedState();
Nathan Harold2b77d742016-03-19 13:22:10 -0700309 }
Nathan Harold433ca442018-04-23 18:20:43 -0700310
311 @Override
312 public void onPhysicalChannelConfigurationChanged(
313 List<PhysicalChannelConfig> configs) {
314 updatePhysicalChannelConfiguration(configs);
315 }
316
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800317 };
318
Nathan Harold433ca442018-04-23 18:20:43 -0700319 private void updatePhysicalChannelConfiguration(List<PhysicalChannelConfig> configs) {
320 StringBuilder sb = new StringBuilder();
321 String div = "";
322 sb.append("{");
323 if (configs != null) {
324 for(PhysicalChannelConfig c : configs) {
325 sb.append(div).append(c);
326 div = ",";
327 }
328 }
329 sb.append("}");
330 mPhyChanConfig.setText(sb.toString());
331 }
332
Nathan Haroldcea413a2015-11-23 15:48:10 -0800333 private void updatePreferredNetworkType(int type) {
334 if (type >= mPreferredNetworkLabels.length || type < 0) {
335 log("EVENT_QUERY_PREFERRED_TYPE_DONE: unknown " +
336 "type=" + type);
337 type = mPreferredNetworkLabels.length - 1; //set to Unknown
338 }
339 mPreferredNetworkTypeResult = type;
340
341 preferredNetworkType.setSelection(mPreferredNetworkTypeResult, true);
342 }
343
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800344 private Handler mHandler = new Handler() {
Nathan Haroldcea413a2015-11-23 15:48:10 -0800345 @Override
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800346 public void handleMessage(Message msg) {
347 AsyncResult ar;
348 switch (msg.what) {
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800349 case EVENT_QUERY_PREFERRED_TYPE_DONE:
350 ar= (AsyncResult) msg.obj;
Nathan Haroldcea413a2015-11-23 15:48:10 -0800351 if (ar.exception == null && ar.result != null) {
352 updatePreferredNetworkType(((int[])ar.result)[0]);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800353 } else {
Nathan Haroldcea413a2015-11-23 15:48:10 -0800354 //In case of an exception, we will set this to unknown
355 updatePreferredNetworkType(mPreferredNetworkLabels.length-1);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800356 }
357 break;
358 case EVENT_SET_PREFERRED_TYPE_DONE:
359 ar= (AsyncResult) msg.obj;
360 if (ar.exception != null) {
Nathan Harolded38afa2016-04-13 00:29:30 -0700361 log("Set preferred network type failed.");
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800362 }
363 break;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800364 case EVENT_QUERY_SMSC_DONE:
365 ar= (AsyncResult) msg.obj;
366 if (ar.exception != null) {
367 smsc.setText("refresh error");
368 } else {
jsh21dd4072009-05-12 11:26:55 -0700369 smsc.setText((String)ar.result);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800370 }
371 break;
372 case EVENT_UPDATE_SMSC_DONE:
373 updateSmscButton.setEnabled(true);
374 ar= (AsyncResult) msg.obj;
375 if (ar.exception != null) {
376 smsc.setText("update error");
377 }
378 break;
379 default:
Nathan Haroldcea413a2015-11-23 15:48:10 -0800380 super.handleMessage(msg);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800381 break;
382
383 }
384 }
385 };
386
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800387 @Override
388 public void onCreate(Bundle icicle) {
389 super.onCreate(icicle);
fionaxub54cb2d2016-09-22 15:01:05 -0700390 if (!android.os.Process.myUserHandle().isSystem()) {
391 Log.e(TAG, "Not run from system user, don't do anything.");
392 finish();
393 return;
394 }
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800395
396 setContentView(R.layout.radio_info);
397
Nathan Haroldcea413a2015-11-23 15:48:10 -0800398 log("Started onCreate");
399
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800400 mTelephonyManager = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
Nathan Haroldf10ea322018-04-24 13:31:07 -0700401 mConnectivityManager = (ConnectivityManager)getSystemService(CONNECTIVITY_SERVICE);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800402 phone = PhoneFactory.getDefaultPhone();
403
Nathan Haroldcea413a2015-11-23 15:48:10 -0800404 //TODO: Need to update this if the default phoneId changes?
405 // Better to have an instance per phone?
406 mImsManager = ImsManager.getInstance(getApplicationContext(),
407 SubscriptionManager.getDefaultVoicePhoneId());
408
Meng Wang9053f172017-06-23 16:02:14 -0700409 mDeviceId = (TextView) findViewById(R.id.imei);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800410 number = (TextView) findViewById(R.id.number);
Meng Wang9053f172017-06-23 16:02:14 -0700411 mSubscriberId = (TextView) findViewById(R.id.imsi);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800412 callState = (TextView) findViewById(R.id.call);
413 operatorName = (TextView) findViewById(R.id.operator);
414 roamingState = (TextView) findViewById(R.id.roaming);
415 gsmState = (TextView) findViewById(R.id.gsm);
416 gprsState = (TextView) findViewById(R.id.gprs);
Nathan Harold2b77d742016-03-19 13:22:10 -0700417 voiceNetwork = (TextView) findViewById(R.id.voice_network);
418 dataNetwork = (TextView) findViewById(R.id.data_network);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800419 dBm = (TextView) findViewById(R.id.dbm);
420 mMwi = (TextView) findViewById(R.id.mwi);
421 mCfi = (TextView) findViewById(R.id.cfi);
422 mLocation = (TextView) findViewById(R.id.location);
Wink Saville79bff2a2012-06-01 14:37:21 -0700423 mCellInfo = (TextView) findViewById(R.id.cellinfo);
Nathan Haroldcea413a2015-11-23 15:48:10 -0800424 mCellInfo.setTypeface(Typeface.MONOSPACE);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800425
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800426 sent = (TextView) findViewById(R.id.sent);
427 received = (TextView) findViewById(R.id.received);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800428 smsc = (EditText) findViewById(R.id.smsc);
429 dnsCheckState = (TextView) findViewById(R.id.dnsCheckState);
Nathan Haroldcea413a2015-11-23 15:48:10 -0800430 mPingHostnameV4 = (TextView) findViewById(R.id.pingHostnameV4);
431 mPingHostnameV6 = (TextView) findViewById(R.id.pingHostnameV6);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800432 mHttpClientTest = (TextView) findViewById(R.id.httpClientTest);
433
Nathan Harold433ca442018-04-23 18:20:43 -0700434 mPhyChanConfig = (TextView) findViewById(R.id.phy_chan_config);
435
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800436 preferredNetworkType = (Spinner) findViewById(R.id.preferredNetworkType);
437 ArrayAdapter<String> adapter = new ArrayAdapter<String> (this,
438 android.R.layout.simple_spinner_item, mPreferredNetworkLabels);
johnwang342101a2009-09-23 16:22:34 -0700439 adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800440 preferredNetworkType.setAdapter(adapter);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800441
Nathan Harold2b77d742016-03-19 13:22:10 -0700442 cellInfoRefreshRateSpinner = (Spinner) findViewById(R.id.cell_info_rate_select);
443 ArrayAdapter<String> cellInfoAdapter = new ArrayAdapter<String>(this,
444 android.R.layout.simple_spinner_item, mCellInfoRefreshRateLabels);
445 cellInfoAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
446 cellInfoRefreshRateSpinner.setAdapter(cellInfoAdapter);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800447
Nathan Harold12e1f552016-06-17 13:55:38 -0700448 imsVolteProvisionedSwitch = (Switch) findViewById(R.id.volte_provisioned_switch);
449 imsVtProvisionedSwitch = (Switch) findViewById(R.id.vt_provisioned_switch);
450 imsWfcProvisionedSwitch = (Switch) findViewById(R.id.wfc_provisioned_switch);
Meng Wang69439b52017-05-01 08:31:14 -0700451 eabProvisionedSwitch = (Switch) findViewById(R.id.eab_provisioned_switch);
Wink Savillebf471282013-04-05 15:04:05 -0700452
Nathan Harold2b77d742016-03-19 13:22:10 -0700453 radioPowerOnSwitch = (Switch) findViewById(R.id.radio_power);
Wink Saville426fc662011-09-25 14:39:02 -0700454
Nathan Haroldf10ea322018-04-24 13:31:07 -0700455 mDownlinkKbps = (TextView) findViewById(R.id.dl_kbps);
456 mUplinkKbps = (TextView) findViewById(R.id.ul_kbps);
457 updateBandwidths(0, 0);
458
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800459 pingTestButton = (Button) findViewById(R.id.ping_test);
460 pingTestButton.setOnClickListener(mPingButtonHandler);
461 updateSmscButton = (Button) findViewById(R.id.update_smsc);
462 updateSmscButton.setOnClickListener(mUpdateSmscButtonHandler);
463 refreshSmscButton = (Button) findViewById(R.id.refresh_smsc);
464 refreshSmscButton.setOnClickListener(mRefreshSmscButtonHandler);
465 dnsCheckToggleButton = (Button) findViewById(R.id.dns_check_toggle);
466 dnsCheckToggleButton.setOnClickListener(mDnsCheckButtonHandler);
Youhan Wangfd781e92016-12-16 15:53:16 -0800467 carrierProvisioningButton = (Button) findViewById(R.id.carrier_provisioning);
468 carrierProvisioningButton.setOnClickListener(mCarrierProvisioningButtonHandler);
469 triggercarrierProvisioningButton = (Button) findViewById(R.id.trigger_carrier_provisioning);
470 triggercarrierProvisioningButton.setOnClickListener(
471 mTriggerCarrierProvisioningButtonHandler);
johnwang342101a2009-09-23 16:22:34 -0700472
Tammo Spalinka5f4c8f2009-10-15 20:08:58 +0800473 oemInfoButton = (Button) findViewById(R.id.oem_info);
474 oemInfoButton.setOnClickListener(mOemInfoButtonHandler);
475 PackageManager pm = getPackageManager();
476 Intent oemInfoIntent = new Intent("com.android.settings.OEM_RADIO_INFO");
477 List<ResolveInfo> oemInfoIntentList = pm.queryIntentActivities(oemInfoIntent, 0);
478 if (oemInfoIntentList.size() == 0) {
479 oemInfoButton.setEnabled(false);
480 }
481
Nathan Harolded38afa2016-04-13 00:29:30 -0700482 mCellInfoRefreshRateIndex = 0; //disabled
Nathan Haroldcea413a2015-11-23 15:48:10 -0800483 mPreferredNetworkTypeResult = mPreferredNetworkLabels.length - 1; //Unknown
484
485 //FIXME: Replace with TelephonyManager call
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800486 phone.getPreferredNetworkType(
487 mHandler.obtainMessage(EVENT_QUERY_PREFERRED_TYPE_DONE));
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800488
Nathan Haroldcea413a2015-11-23 15:48:10 -0800489 restoreFromBundle(icicle);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800490 }
491
492 @Override
493 protected void onResume() {
494 super.onResume();
495
Nathan Haroldcea413a2015-11-23 15:48:10 -0800496 log("Started onResume");
497
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800498 updateMessageWaiting();
499 updateCallRedirect();
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800500 updateDataState();
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800501 updateDataStats2();
Nathan Harold2b77d742016-03-19 13:22:10 -0700502 updateRadioPowerState();
Nathan Harold12e1f552016-06-17 13:55:38 -0700503 updateImsProvisionedState();
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800504 updateProperties();
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800505 updateDnsCheckState();
Nathan Harold2b77d742016-03-19 13:22:10 -0700506 updateNetworkType();
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800507
Nathan Haroldcea413a2015-11-23 15:48:10 -0800508 updateLocation(mCellLocationResult);
509 updateCellInfo(mCellInfoResult);
510
511 mPingHostnameV4.setText(mPingHostnameResultV4);
512 mPingHostnameV6.setText(mPingHostnameResultV6);
513 mHttpClientTest.setText(mHttpClientTestResult);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800514
Nathan Harold2b77d742016-03-19 13:22:10 -0700515 cellInfoRefreshRateSpinner.setOnItemSelectedListener(mCellInfoRefreshRateHandler);
Nathan Harolded38afa2016-04-13 00:29:30 -0700516 //set selection after registering listener to force update
517 cellInfoRefreshRateSpinner.setSelection(mCellInfoRefreshRateIndex);
518
519 //set selection before registering to prevent update
520 preferredNetworkType.setSelection(mPreferredNetworkTypeResult, true);
Nathan Harold2b77d742016-03-19 13:22:10 -0700521 preferredNetworkType.setOnItemSelectedListener(mPreferredNetworkHandler);
Nathan Harolded38afa2016-04-13 00:29:30 -0700522
Nathan Harold2b77d742016-03-19 13:22:10 -0700523 radioPowerOnSwitch.setOnCheckedChangeListener(mRadioPowerOnChangeListener);
Nathan Harold12e1f552016-06-17 13:55:38 -0700524 imsVolteProvisionedSwitch.setOnCheckedChangeListener(mImsVolteCheckedChangeListener);
525 imsVtProvisionedSwitch.setOnCheckedChangeListener(mImsVtCheckedChangeListener);
526 imsWfcProvisionedSwitch.setOnCheckedChangeListener(mImsWfcCheckedChangeListener);
Meng Wang586741c2017-04-26 15:02:51 -0700527 eabProvisionedSwitch.setOnCheckedChangeListener(mEabCheckedChangeListener);
Nathan Harold2b77d742016-03-19 13:22:10 -0700528
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800529 mTelephonyManager.listen(mPhoneStateListener,
Nathan Harold2b77d742016-03-19 13:22:10 -0700530 PhoneStateListener.LISTEN_CALL_STATE
531 //b/27803938 - RadioInfo currently cannot read PRECISE_CALL_STATE
532 // | PhoneStateListener.LISTEN_PRECISE_CALL_STATE
533 | PhoneStateListener.LISTEN_DATA_CONNECTION_STATE
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800534 | PhoneStateListener.LISTEN_DATA_ACTIVITY
535 | PhoneStateListener.LISTEN_CELL_LOCATION
536 | PhoneStateListener.LISTEN_MESSAGE_WAITING_INDICATOR
Wink Saville79bff2a2012-06-01 14:37:21 -0700537 | PhoneStateListener.LISTEN_CALL_FORWARDING_INDICATOR
Wink Saville4f0d8812014-04-15 22:05:24 -0700538 | PhoneStateListener.LISTEN_CELL_INFO
Nathan Harold2b77d742016-03-19 13:22:10 -0700539 | PhoneStateListener.LISTEN_SERVICE_STATE
540 | PhoneStateListener.LISTEN_SIGNAL_STRENGTHS
Nathan Harold433ca442018-04-23 18:20:43 -0700541 | PhoneStateListener.LISTEN_PHYSICAL_CHANNEL_CONFIGURATION);
Nathan Harolded38afa2016-04-13 00:29:30 -0700542
Nathan Haroldf10ea322018-04-24 13:31:07 -0700543 mConnectivityManager.registerNetworkCallback(
544 mDefaultNetworkRequest, mNetworkCallback, mHandler);
545
Nathan Harolded38afa2016-04-13 00:29:30 -0700546 smsc.clearFocus();
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800547 }
548
549 @Override
Nathan Haroldcea413a2015-11-23 15:48:10 -0800550 protected void onPause() {
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800551 super.onPause();
552
Wink Savillebf471282013-04-05 15:04:05 -0700553 log("onPause: unregister phone & data intents");
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800554
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800555 mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE);
Sooraj Sasindran5cce06b2016-08-18 15:49:49 -0700556 mTelephonyManager.setCellInfoListRate(CELL_INFO_LIST_RATE_DISABLED);
Nathan Haroldf10ea322018-04-24 13:31:07 -0700557 mConnectivityManager.unregisterNetworkCallback(mNetworkCallback);
558
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800559 }
560
Nathan Haroldcea413a2015-11-23 15:48:10 -0800561 private void restoreFromBundle(Bundle b) {
Nathan Harolde272c202016-10-27 13:45:00 -0700562 if(b == null) {
Nathan Haroldcea413a2015-11-23 15:48:10 -0800563 return;
564 }
565
566 mPingHostnameResultV4 = b.getString("mPingHostnameResultV4","");
567 mPingHostnameResultV6 = b.getString("mPingHostnameResultV6","");
568 mHttpClientTestResult = b.getString("mHttpClientTestResult","");
569
570 mPingHostnameV4.setText(mPingHostnameResultV4);
571 mPingHostnameV6.setText(mPingHostnameResultV6);
572 mHttpClientTest.setText(mHttpClientTestResult);
573
Nathan Harold2b77d742016-03-19 13:22:10 -0700574 mPreferredNetworkTypeResult = b.getInt("mPreferredNetworkTypeResult",
575 mPreferredNetworkLabels.length - 1);
576
577 mCellInfoRefreshRateIndex = b.getInt("mCellInfoRefreshRateIndex", 0);
Nathan Haroldcea413a2015-11-23 15:48:10 -0800578 }
579
580 @Override
581 protected void onSaveInstanceState(Bundle outState) {
582 outState.putString("mPingHostnameResultV4", mPingHostnameResultV4);
583 outState.putString("mPingHostnameResultV6", mPingHostnameResultV6);
584 outState.putString("mHttpClientTestResult", mHttpClientTestResult);
Nathan Harold2b77d742016-03-19 13:22:10 -0700585
Nathan Haroldcea413a2015-11-23 15:48:10 -0800586 outState.putInt("mPreferredNetworkTypeResult", mPreferredNetworkTypeResult);
Nathan Harold2b77d742016-03-19 13:22:10 -0700587 outState.putInt("mCellInfoRefreshRateIndex", mCellInfoRefreshRateIndex);
588
Nathan Haroldcea413a2015-11-23 15:48:10 -0800589 }
590
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800591 @Override
592 public boolean onCreateOptionsMenu(Menu menu) {
Wink Savillec3886682009-04-02 11:00:56 -0700593 menu.add(0, MENU_ITEM_SELECT_BAND, 0, R.string.radio_info_band_mode_label)
594 .setOnMenuItemClickListener(mSelectBandCallback)
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800595 .setAlphabeticShortcut('b');
596 menu.add(1, MENU_ITEM_VIEW_ADN, 0,
597 R.string.radioInfo_menu_viewADN).setOnMenuItemClickListener(mViewADNCallback);
598 menu.add(1, MENU_ITEM_VIEW_FDN, 0,
599 R.string.radioInfo_menu_viewFDN).setOnMenuItemClickListener(mViewFDNCallback);
600 menu.add(1, MENU_ITEM_VIEW_SDN, 0,
601 R.string.radioInfo_menu_viewSDN).setOnMenuItemClickListener(mViewSDNCallback);
Nathan Harolde272c202016-10-27 13:45:00 -0700602 menu.add(1, MENU_ITEM_GET_IMS_STATUS,
603 0, R.string.radioInfo_menu_getIMS).setOnMenuItemClickListener(mGetImsStatus);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800604 menu.add(1, MENU_ITEM_TOGGLE_DATA,
Nathan Harold2b77d742016-03-19 13:22:10 -0700605 0, R.string.radio_info_data_connection_disable).setOnMenuItemClickListener(mToggleData);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800606 return true;
607 }
608
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800609 @Override
Wink Savillec3886682009-04-02 11:00:56 -0700610 public boolean onPrepareOptionsMenu(Menu menu) {
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800611 // Get the TOGGLE DATA menu item in the right state.
612 MenuItem item = menu.findItem(MENU_ITEM_TOGGLE_DATA);
613 int state = mTelephonyManager.getDataState();
614 boolean visible = true;
615
616 switch (state) {
617 case TelephonyManager.DATA_CONNECTED:
618 case TelephonyManager.DATA_SUSPENDED:
Nathan Harold2b77d742016-03-19 13:22:10 -0700619 item.setTitle(R.string.radio_info_data_connection_disable);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800620 break;
621 case TelephonyManager.DATA_DISCONNECTED:
Nathan Harold2b77d742016-03-19 13:22:10 -0700622 item.setTitle(R.string.radio_info_data_connection_enable);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800623 break;
624 default:
625 visible = false;
626 break;
627 }
628 item.setVisible(visible);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800629 return true;
630 }
631
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800632 private void updateDnsCheckState() {
Nathan Haroldcea413a2015-11-23 15:48:10 -0800633 //FIXME: Replace with a TelephonyManager call
Mike Lockwood5304c7e2009-04-05 11:37:45 -0700634 dnsCheckState.setText(phone.isDnsCheckDisabled() ?
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800635 "0.0.0.0 allowed" :"0.0.0.0 not allowed");
636 }
Wink Savillee2a14e32009-05-29 14:06:30 -0700637
Nathan Haroldf10ea322018-04-24 13:31:07 -0700638 private void updateBandwidths(int dlbw, int ulbw) {
639 dlbw = (dlbw < 0 || dlbw == Integer.MAX_VALUE) ? -1 : dlbw;
640 ulbw = (ulbw < 0 || ulbw == Integer.MAX_VALUE) ? -1 : ulbw;
641 mDownlinkKbps.setText(String.format("%-5d", dlbw));
642 mUplinkKbps.setText(String.format("%-5d", ulbw));
643 }
644
645
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800646 private final void
Nathan Harold2b77d742016-03-19 13:22:10 -0700647 updateSignalStrength(SignalStrength signalStrength) {
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800648 Resources r = getResources();
649
Nathan Harold2b77d742016-03-19 13:22:10 -0700650 int signalDbm = signalStrength.getDbm();
Wink Savillee2a14e32009-05-29 14:06:30 -0700651
Nathan Harold2b77d742016-03-19 13:22:10 -0700652 int signalAsu = signalStrength.getAsuLevel();
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800653
654 if (-1 == signalAsu) signalAsu = 0;
655
656 dBm.setText(String.valueOf(signalDbm) + " "
657 + r.getString(R.string.radioInfo_display_dbm) + " "
658 + String.valueOf(signalAsu) + " "
659 + r.getString(R.string.radioInfo_display_asu));
660 }
661
662 private final void updateLocation(CellLocation location) {
jsh534f5ae2009-09-24 09:19:22 -0700663 Resources r = getResources();
Wink Savillec3886682009-04-02 11:00:56 -0700664 if (location instanceof GsmCellLocation) {
665 GsmCellLocation loc = (GsmCellLocation)location;
jsh534f5ae2009-09-24 09:19:22 -0700666 int lac = loc.getLac();
667 int cid = loc.getCid();
668 mLocation.setText(r.getString(R.string.radioInfo_lac) + " = "
669 + ((lac == -1) ? "unknown" : Integer.toHexString(lac))
670 + " "
671 + r.getString(R.string.radioInfo_cid) + " = "
672 + ((cid == -1) ? "unknown" : Integer.toHexString(cid)));
673 } else if (location instanceof CdmaCellLocation) {
674 CdmaCellLocation loc = (CdmaCellLocation)location;
675 int bid = loc.getBaseStationId();
676 int sid = loc.getSystemId();
677 int nid = loc.getNetworkId();
678 int lat = loc.getBaseStationLatitude();
679 int lon = loc.getBaseStationLongitude();
680 mLocation.setText("BID = "
681 + ((bid == -1) ? "unknown" : Integer.toHexString(bid))
682 + " "
683 + "SID = "
684 + ((sid == -1) ? "unknown" : Integer.toHexString(sid))
685 + " "
686 + "NID = "
687 + ((nid == -1) ? "unknown" : Integer.toHexString(nid))
688 + "\n"
689 + "LAT = "
690 + ((lat == -1) ? "unknown" : Integer.toHexString(lat))
691 + " "
692 + "LONG = "
693 + ((lon == -1) ? "unknown" : Integer.toHexString(lon)));
694 } else {
695 mLocation.setText("unknown");
Wink Savillec3886682009-04-02 11:00:56 -0700696 }
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800697
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800698
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800699 }
700
Nathan Haroldcea413a2015-11-23 15:48:10 -0800701 private final String getCellInfoDisplayString(int i) {
702 return (i != Integer.MAX_VALUE) ? Integer.toString(i) : "";
703 }
704
705 private final String getCellInfoDisplayString(long i) {
706 return (i != Long.MAX_VALUE) ? Long.toString(i) : "";
707 }
708
Nathan Harold6e16fdf2018-04-17 17:01:32 -0700709 private final String getConnectionStatusString(CellInfo ci) {
710 String regStr = "";
711 String connStatStr = "";
712 String connector = "";
713
714 if (ci.isRegistered()) {
715 regStr = "R";
716 }
717 switch (ci.getCellConnectionStatus()) {
718 case CellInfo.CONNECTION_PRIMARY_SERVING: connStatStr = "P"; break;
719 case CellInfo.CONNECTION_SECONDARY_SERVING: connStatStr = "S"; break;
720 case CellInfo.CONNECTION_NONE: connStatStr = "N"; break;
721 case CellInfo.CONNECTION_UNKNOWN: /* Field is unsupported */ break;
722 default: break;
723 }
724 if (!TextUtils.isEmpty(regStr) && !TextUtils.isEmpty(connStatStr)) {
725 connector = "+";
726 }
727
728 return regStr + connector + connStatStr;
729 }
730
Nathan Haroldcea413a2015-11-23 15:48:10 -0800731 private final String buildCdmaInfoString(CellInfoCdma ci) {
732 CellIdentityCdma cidCdma = ci.getCellIdentity();
733 CellSignalStrengthCdma ssCdma = ci.getCellSignalStrength();
734
735 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 -0700736 getConnectionStatusString(ci),
Nathan Haroldcea413a2015-11-23 15:48:10 -0800737 getCellInfoDisplayString(cidCdma.getSystemId()),
738 getCellInfoDisplayString(cidCdma.getNetworkId()),
739 getCellInfoDisplayString(cidCdma.getBasestationId()),
740 getCellInfoDisplayString(ssCdma.getCdmaDbm()),
741 getCellInfoDisplayString(ssCdma.getCdmaEcio()),
742 getCellInfoDisplayString(ssCdma.getEvdoDbm()),
743 getCellInfoDisplayString(ssCdma.getEvdoEcio()),
744 getCellInfoDisplayString(ssCdma.getEvdoSnr()));
745 }
746
747 private final String buildGsmInfoString(CellInfoGsm ci) {
748 CellIdentityGsm cidGsm = ci.getCellIdentity();
749 CellSignalStrengthGsm ssGsm = ci.getCellSignalStrength();
750
Nathan Harold2b77d742016-03-19 13:22:10 -0700751 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 -0700752 getConnectionStatusString(ci),
Nathan Haroldcea413a2015-11-23 15:48:10 -0800753 getCellInfoDisplayString(cidGsm.getMcc()),
754 getCellInfoDisplayString(cidGsm.getMnc()),
755 getCellInfoDisplayString(cidGsm.getLac()),
756 getCellInfoDisplayString(cidGsm.getCid()),
Nathan Harold2b77d742016-03-19 13:22:10 -0700757 getCellInfoDisplayString(cidGsm.getArfcn()),
758 getCellInfoDisplayString(cidGsm.getBsic()),
Nathan Haroldcea413a2015-11-23 15:48:10 -0800759 getCellInfoDisplayString(ssGsm.getDbm()));
760 }
761
762 private final String buildLteInfoString(CellInfoLte ci) {
763 CellIdentityLte cidLte = ci.getCellIdentity();
764 CellSignalStrengthLte ssLte = ci.getCellSignalStrength();
765
766 return String.format(
Nathan Harold6e16fdf2018-04-17 17:01:32 -0700767 "%-3.3s %-3.3s %-3.3s %-5.5s %-5.5s %-3.3s %-6.6s %-2.2s %-4.4s %-4.4s %-2.2s\n",
768 getConnectionStatusString(ci),
Nathan Haroldcea413a2015-11-23 15:48:10 -0800769 getCellInfoDisplayString(cidLte.getMcc()),
770 getCellInfoDisplayString(cidLte.getMnc()),
771 getCellInfoDisplayString(cidLte.getTac()),
772 getCellInfoDisplayString(cidLte.getCi()),
773 getCellInfoDisplayString(cidLte.getPci()),
Nathan Harold2b77d742016-03-19 13:22:10 -0700774 getCellInfoDisplayString(cidLte.getEarfcn()),
Nathan Harold6e16fdf2018-04-17 17:01:32 -0700775 getCellInfoDisplayString(cidLte.getBandwidth()),
Nathan Haroldcea413a2015-11-23 15:48:10 -0800776 getCellInfoDisplayString(ssLte.getDbm()),
777 getCellInfoDisplayString(ssLte.getRsrq()),
778 getCellInfoDisplayString(ssLte.getTimingAdvance()));
779 }
780
781 private final String buildWcdmaInfoString(CellInfoWcdma ci) {
782 CellIdentityWcdma cidWcdma = ci.getCellIdentity();
783 CellSignalStrengthWcdma ssWcdma = ci.getCellSignalStrength();
784
Nathan Harold2b77d742016-03-19 13:22:10 -0700785 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 -0700786 getConnectionStatusString(ci),
Nathan Haroldcea413a2015-11-23 15:48:10 -0800787 getCellInfoDisplayString(cidWcdma.getMcc()),
788 getCellInfoDisplayString(cidWcdma.getMnc()),
789 getCellInfoDisplayString(cidWcdma.getLac()),
790 getCellInfoDisplayString(cidWcdma.getCid()),
Nathan Harold2b77d742016-03-19 13:22:10 -0700791 getCellInfoDisplayString(cidWcdma.getUarfcn()),
Nathan Haroldcea413a2015-11-23 15:48:10 -0800792 getCellInfoDisplayString(cidWcdma.getPsc()),
793 getCellInfoDisplayString(ssWcdma.getDbm()));
794 }
795
796 private final String buildCellInfoString(List<CellInfo> arrayCi) {
797 String value = new String();
798 StringBuilder cdmaCells = new StringBuilder(),
799 gsmCells = new StringBuilder(),
800 lteCells = new StringBuilder(),
801 wcdmaCells = new StringBuilder();
802
803 if (arrayCi != null) {
804 for (CellInfo ci : arrayCi) {
805
806 if (ci instanceof CellInfoLte) {
807 lteCells.append(buildLteInfoString((CellInfoLte) ci));
808 } else if (ci instanceof CellInfoWcdma) {
809 wcdmaCells.append(buildWcdmaInfoString((CellInfoWcdma) ci));
810 } else if (ci instanceof CellInfoGsm) {
811 gsmCells.append(buildGsmInfoString((CellInfoGsm) ci));
812 } else if (ci instanceof CellInfoCdma) {
813 cdmaCells.append(buildCdmaInfoString((CellInfoCdma) ci));
Wink Saville79bff2a2012-06-01 14:37:21 -0700814 }
815 }
Nathan Haroldcea413a2015-11-23 15:48:10 -0800816 if (lteCells.length() != 0) {
817 value += String.format(
Nathan Harold6e16fdf2018-04-17 17:01:32 -0700818 "LTE\n%-3.3s %-3.3s %-3.3s %-5.5s %-5.5s %-3.3s"
819 + " %-6.6s %-2.2s %-4.4s %-4.4s %-2.2s\n",
820 "SRV", "MCC", "MNC", "TAC", "CID", "PCI",
821 "EARFCN", "BW", "RSRP", "RSRQ", "TA");
Nathan Haroldcea413a2015-11-23 15:48:10 -0800822 value += lteCells.toString();
823 }
824 if (wcdmaCells.length() != 0) {
Nathan Harold6e16fdf2018-04-17 17:01:32 -0700825 value += String.format(
826 "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 -0700827 "SRV", "MCC", "MNC", "LAC", "CID", "UARFCN", "PSC", "RSCP");
Nathan Haroldcea413a2015-11-23 15:48:10 -0800828 value += wcdmaCells.toString();
829 }
830 if (gsmCells.length() != 0) {
Nathan Harold6e16fdf2018-04-17 17:01:32 -0700831 value += String.format(
832 "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 -0700833 "SRV", "MCC", "MNC", "LAC", "CID", "ARFCN", "BSIC", "RSSI");
Nathan Haroldcea413a2015-11-23 15:48:10 -0800834 value += gsmCells.toString();
835 }
836 if (cdmaCells.length() != 0) {
837 value += String.format(
838 "CDMA/EVDO\n%-3.3s %-5.5s %-5.5s %-5.5s %-6.6s %-6.6s %-6.6s %-6.6s %-5.5s\n",
839 "SRV", "SID", "NID", "BSID", "C-RSSI", "C-ECIO", "E-RSSI", "E-ECIO", "E-SNR");
840 value += cdmaCells.toString();
841 }
842 } else {
843 value ="unknown";
Wink Saville79bff2a2012-06-01 14:37:21 -0700844 }
Nathan Haroldcea413a2015-11-23 15:48:10 -0800845
846 return value.toString();
847 }
848
849 private final void updateCellInfo(List<CellInfo> arrayCi) {
850 mCellInfo.setText(buildCellInfoString(arrayCi));
Wink Saville79bff2a2012-06-01 14:37:21 -0700851 }
852
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800853 private final void
854 updateMessageWaiting() {
855 mMwi.setText(String.valueOf(mMwiValue));
856 }
857
858 private final void
859 updateCallRedirect() {
860 mCfi.setText(String.valueOf(mCfiValue));
861 }
862
863
864 private final void
Nathan Harold2b77d742016-03-19 13:22:10 -0700865 updateServiceState(ServiceState serviceState) {
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800866 int state = serviceState.getState();
867 Resources r = getResources();
868 String display = r.getString(R.string.radioInfo_unknown);
johnwang342101a2009-09-23 16:22:34 -0700869
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800870 switch (state) {
871 case ServiceState.STATE_IN_SERVICE:
872 display = r.getString(R.string.radioInfo_service_in);
873 break;
874 case ServiceState.STATE_OUT_OF_SERVICE:
875 case ServiceState.STATE_EMERGENCY_ONLY:
876 display = r.getString(R.string.radioInfo_service_emergency);
877 break;
878 case ServiceState.STATE_POWER_OFF:
879 display = r.getString(R.string.radioInfo_service_off);
880 break;
881 }
johnwang342101a2009-09-23 16:22:34 -0700882
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800883 gsmState.setText(display);
johnwang342101a2009-09-23 16:22:34 -0700884
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800885 if (serviceState.getRoaming()) {
886 roamingState.setText(R.string.radioInfo_roaming_in);
887 } else {
888 roamingState.setText(R.string.radioInfo_roaming_not);
889 }
890
891 operatorName.setText(serviceState.getOperatorAlphaLong());
892 }
893
894 private final void
Nathan Harold2b77d742016-03-19 13:22:10 -0700895 updatePhoneState(int state) {
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800896 Resources r = getResources();
897 String display = r.getString(R.string.radioInfo_unknown);
898
899 switch (state) {
Nathan Harold2b77d742016-03-19 13:22:10 -0700900 case TelephonyManager.CALL_STATE_IDLE:
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800901 display = r.getString(R.string.radioInfo_phone_idle);
902 break;
Nathan Harold2b77d742016-03-19 13:22:10 -0700903 case TelephonyManager.CALL_STATE_RINGING:
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800904 display = r.getString(R.string.radioInfo_phone_ringing);
905 break;
Nathan Harold2b77d742016-03-19 13:22:10 -0700906 case TelephonyManager.CALL_STATE_OFFHOOK:
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800907 display = r.getString(R.string.radioInfo_phone_offhook);
908 break;
909 }
910
911 callState.setText(display);
912 }
913
914 private final void
915 updateDataState() {
916 int state = mTelephonyManager.getDataState();
917 Resources r = getResources();
918 String display = r.getString(R.string.radioInfo_unknown);
919
920 switch (state) {
921 case TelephonyManager.DATA_CONNECTED:
922 display = r.getString(R.string.radioInfo_data_connected);
923 break;
924 case TelephonyManager.DATA_CONNECTING:
925 display = r.getString(R.string.radioInfo_data_connecting);
926 break;
927 case TelephonyManager.DATA_DISCONNECTED:
928 display = r.getString(R.string.radioInfo_data_disconnected);
929 break;
930 case TelephonyManager.DATA_SUSPENDED:
931 display = r.getString(R.string.radioInfo_data_suspended);
932 break;
933 }
johnwang342101a2009-09-23 16:22:34 -0700934
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800935 gprsState.setText(display);
936 }
937
938 private final void updateNetworkType() {
Nathan Harolde272c202016-10-27 13:45:00 -0700939 if(phone != null) {
Nathan Harold2b77d742016-03-19 13:22:10 -0700940 ServiceState ss = phone.getServiceState();
941 dataNetwork.setText(ServiceState.rilRadioTechnologyToString(
942 phone.getServiceState().getRilDataRadioTechnology()));
943 voiceNetwork.setText(ServiceState.rilRadioTechnologyToString(
944 phone.getServiceState().getRilVoiceRadioTechnology()));
945 }
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800946 }
947
948 private final void
949 updateProperties() {
950 String s;
951 Resources r = getResources();
952
953 s = phone.getDeviceId();
johnwang342101a2009-09-23 16:22:34 -0700954 if (s == null) s = r.getString(R.string.radioInfo_unknown);
Wink Savillec3886682009-04-02 11:00:56 -0700955 mDeviceId.setText(s);
johnwang342101a2009-09-23 16:22:34 -0700956
Meng Wang9053f172017-06-23 16:02:14 -0700957 s = phone.getSubscriberId();
958 if (s == null) s = r.getString(R.string.radioInfo_unknown);
959 mSubscriberId.setText(s);
960
Nathan Haroldcea413a2015-11-23 15:48:10 -0800961 //FIXME: Replace with a TelephonyManager call
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800962 s = phone.getLine1Number();
johnwang342101a2009-09-23 16:22:34 -0700963 if (s == null) s = r.getString(R.string.radioInfo_unknown);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800964 number.setText(s);
965 }
966
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800967 private final void updateDataStats2() {
968 Resources r = getResources();
969
Jeff Sharkey93029862011-05-27 18:26:15 -0700970 long txPackets = TrafficStats.getMobileTxPackets();
971 long rxPackets = TrafficStats.getMobileRxPackets();
972 long txBytes = TrafficStats.getMobileTxBytes();
973 long rxBytes = TrafficStats.getMobileRxBytes();
johnwang342101a2009-09-23 16:22:34 -0700974
Jeff Sharkey93029862011-05-27 18:26:15 -0700975 String packets = r.getString(R.string.radioInfo_display_packets);
976 String bytes = r.getString(R.string.radioInfo_display_bytes);
johnwang342101a2009-09-23 16:22:34 -0700977
Jeff Sharkey93029862011-05-27 18:26:15 -0700978 sent.setText(txPackets + " " + packets + ", " + txBytes + " " + bytes);
979 received.setText(rxPackets + " " + packets + ", " + rxBytes + " " + bytes);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800980 }
981
982 /**
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800983 * Ping a host name
984 */
985 private final void pingHostname() {
986 try {
Nathan Haroldcea413a2015-11-23 15:48:10 -0800987 try {
988 Process p4 = Runtime.getRuntime().exec("ping -c 1 www.google.com");
989 int status4 = p4.waitFor();
990 if (status4 == 0) {
991 mPingHostnameResultV4 = "Pass";
992 } else {
993 mPingHostnameResultV4 = String.format("Fail(%d)", status4);
994 }
995 } catch (IOException e) {
996 mPingHostnameResultV4 = "Fail: IOException";
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800997 }
Nathan Haroldcea413a2015-11-23 15:48:10 -0800998 try {
999 Process p6 = Runtime.getRuntime().exec("ping6 -c 1 www.google.com");
1000 int status6 = p6.waitFor();
1001 if (status6 == 0) {
1002 mPingHostnameResultV6 = "Pass";
1003 } else {
1004 mPingHostnameResultV6 = String.format("Fail(%d)", status6);
1005 }
1006 } catch (IOException e) {
1007 mPingHostnameResultV6 = "Fail: IOException";
1008 }
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001009 } catch (InterruptedException e) {
Nathan Haroldcea413a2015-11-23 15:48:10 -08001010 mPingHostnameResultV4 = mPingHostnameResultV6 = "Fail: InterruptedException";
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001011 }
1012 }
1013
1014 /**
1015 * This function checks for basic functionality of HTTP Client.
1016 */
1017 private void httpClientTest() {
Narayan Kamathf25627c2014-12-12 13:53:28 +00001018 HttpURLConnection urlConnection = null;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001019 try {
Narayan Kamathf25627c2014-12-12 13:53:28 +00001020 // TODO: Hardcoded for now, make it UI configurable
Alex Klyubinb0090232015-04-02 11:08:51 -07001021 URL url = new URL("https://www.google.com");
Narayan Kamathf25627c2014-12-12 13:53:28 +00001022 urlConnection = (HttpURLConnection) url.openConnection();
1023 if (urlConnection.getResponseCode() == 200) {
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001024 mHttpClientTestResult = "Pass";
1025 } else {
Narayan Kamathf25627c2014-12-12 13:53:28 +00001026 mHttpClientTestResult = "Fail: Code: " + urlConnection.getResponseMessage();
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001027 }
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001028 } catch (IOException e) {
1029 mHttpClientTestResult = "Fail: IOException";
Narayan Kamathf25627c2014-12-12 13:53:28 +00001030 } finally {
1031 if (urlConnection != null) {
1032 urlConnection.disconnect();
1033 }
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001034 }
1035 }
1036
1037 private void refreshSmsc() {
Nathan Haroldcea413a2015-11-23 15:48:10 -08001038 //FIXME: Replace with a TelephonyManager call
jsh21dd4072009-05-12 11:26:55 -07001039 phone.getSmscAddress(mHandler.obtainMessage(EVENT_QUERY_SMSC_DONE));
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001040 }
1041
Nathan Haroldcea413a2015-11-23 15:48:10 -08001042 private final void updateAllCellInfo() {
1043
1044 mCellInfo.setText("");
Nathan Haroldcea413a2015-11-23 15:48:10 -08001045 mLocation.setText("");
1046
1047 final Runnable updateAllCellInfoResults = new Runnable() {
1048 public void run() {
Nathan Haroldcea413a2015-11-23 15:48:10 -08001049 updateLocation(mCellLocationResult);
1050 updateCellInfo(mCellInfoResult);
1051 }
1052 };
1053
1054 Thread locThread = new Thread() {
1055 @Override
1056 public void run() {
1057 mCellInfoResult = mTelephonyManager.getAllCellInfo();
1058 mCellLocationResult = mTelephonyManager.getCellLocation();
Nathan Haroldcea413a2015-11-23 15:48:10 -08001059
1060 mHandler.post(updateAllCellInfoResults);
1061 }
1062 };
1063 locThread.start();
1064 }
1065
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001066 private final void updatePingState() {
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001067 // Set all to unknown since the threads will take a few secs to update.
Nathan Haroldcea413a2015-11-23 15:48:10 -08001068 mPingHostnameResultV4 = getResources().getString(R.string.radioInfo_unknown);
1069 mPingHostnameResultV6 = getResources().getString(R.string.radioInfo_unknown);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001070 mHttpClientTestResult = getResources().getString(R.string.radioInfo_unknown);
1071
Nathan Haroldcea413a2015-11-23 15:48:10 -08001072 mPingHostnameV4.setText(mPingHostnameResultV4);
1073 mPingHostnameV6.setText(mPingHostnameResultV6);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001074 mHttpClientTest.setText(mHttpClientTestResult);
1075
1076 final Runnable updatePingResults = new Runnable() {
1077 public void run() {
Nathan Haroldcea413a2015-11-23 15:48:10 -08001078 mPingHostnameV4.setText(mPingHostnameResultV4);
1079 mPingHostnameV6.setText(mPingHostnameResultV6);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001080 mHttpClientTest.setText(mHttpClientTestResult);
1081 }
1082 };
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001083
1084 Thread hostname = new Thread() {
1085 @Override
1086 public void run() {
1087 pingHostname();
Nathan Haroldcea413a2015-11-23 15:48:10 -08001088 mHandler.post(updatePingResults);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001089 }
1090 };
1091 hostname.start();
1092
1093 Thread httpClient = new Thread() {
1094 @Override
1095 public void run() {
1096 httpClientTest();
Nathan Haroldcea413a2015-11-23 15:48:10 -08001097 mHandler.post(updatePingResults);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001098 }
1099 };
1100 httpClient.start();
1101 }
1102
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001103 private MenuItem.OnMenuItemClickListener mViewADNCallback = new MenuItem.OnMenuItemClickListener() {
1104 public boolean onMenuItemClick(MenuItem item) {
1105 Intent intent = new Intent(Intent.ACTION_VIEW);
1106 // XXX We need to specify the component here because if we don't
1107 // the activity manager will try to resolve the type by calling
1108 // the content provider, which causes it to be loaded in a process
1109 // other than the Dialer process, which causes a lot of stuff to
1110 // break.
1111 intent.setClassName("com.android.phone",
1112 "com.android.phone.SimContacts");
1113 startActivity(intent);
1114 return true;
1115 }
1116 };
1117
1118 private MenuItem.OnMenuItemClickListener mViewFDNCallback = new MenuItem.OnMenuItemClickListener() {
1119 public boolean onMenuItemClick(MenuItem item) {
1120 Intent intent = new Intent(Intent.ACTION_VIEW);
1121 // XXX We need to specify the component here because if we don't
1122 // the activity manager will try to resolve the type by calling
1123 // the content provider, which causes it to be loaded in a process
1124 // other than the Dialer process, which causes a lot of stuff to
1125 // break.
1126 intent.setClassName("com.android.phone",
Andrew Leeda90d682014-10-31 13:12:20 -07001127 "com.android.phone.settings.fdn.FdnList");
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001128 startActivity(intent);
1129 return true;
1130 }
1131 };
1132
1133 private MenuItem.OnMenuItemClickListener mViewSDNCallback = new MenuItem.OnMenuItemClickListener() {
1134 public boolean onMenuItemClick(MenuItem item) {
1135 Intent intent = new Intent(
Wink Savillec3886682009-04-02 11:00:56 -07001136 Intent.ACTION_VIEW, Uri.parse("content://icc/sdn"));
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001137 // XXX We need to specify the component here because if we don't
1138 // the activity manager will try to resolve the type by calling
1139 // the content provider, which causes it to be loaded in a process
1140 // other than the Dialer process, which causes a lot of stuff to
1141 // break.
1142 intent.setClassName("com.android.phone",
1143 "com.android.phone.ADNList");
1144 startActivity(intent);
1145 return true;
1146 }
1147 };
1148
Nathan Harolde272c202016-10-27 13:45:00 -07001149 private MenuItem.OnMenuItemClickListener mGetImsStatus = new MenuItem.OnMenuItemClickListener() {
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001150 public boolean onMenuItemClick(MenuItem item) {
Nathan Harolde272c202016-10-27 13:45:00 -07001151 boolean isImsRegistered = phone.isImsRegistered();
1152 boolean availableVolte = phone.isVolteEnabled();
1153 boolean availableWfc = phone.isWifiCallingEnabled();
1154 boolean availableVt = phone.isVideoEnabled();
1155 boolean availableUt = phone.isUtEnabled();
1156
1157 final String imsRegString = isImsRegistered ?
1158 getString(R.string.radio_info_ims_reg_status_registered) :
1159 getString(R.string.radio_info_ims_reg_status_not_registered);
1160
1161 final String available = getString(R.string.radio_info_ims_feature_status_available);
1162 final String unavailable = getString(
1163 R.string.radio_info_ims_feature_status_unavailable);
1164
1165 String imsStatus = getString(R.string.radio_info_ims_reg_status,
1166 imsRegString,
1167 availableVolte ? available : unavailable,
1168 availableWfc ? available : unavailable,
1169 availableVt ? available : unavailable,
1170 availableUt ? available : unavailable);
1171
1172 AlertDialog imsDialog = new AlertDialog.Builder(RadioInfo.this)
1173 .setMessage(imsStatus)
1174 .setTitle(getString(R.string.radio_info_ims_reg_status_title))
1175 .create();
1176
1177 imsDialog.show();
1178
Tammo Spalinka5f4c8f2009-10-15 20:08:58 +08001179 return true;
1180 }
1181 };
1182
1183 private MenuItem.OnMenuItemClickListener mSelectBandCallback = new MenuItem.OnMenuItemClickListener() {
1184 public boolean onMenuItemClick(MenuItem item) {
1185 Intent intent = new Intent();
1186 intent.setClass(RadioInfo.this, BandMode.class);
1187 startActivity(intent);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001188 return true;
1189 }
1190 };
johnwang342101a2009-09-23 16:22:34 -07001191
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001192 private MenuItem.OnMenuItemClickListener mToggleData = new MenuItem.OnMenuItemClickListener() {
1193 public boolean onMenuItemClick(MenuItem item) {
1194 int state = mTelephonyManager.getDataState();
1195 switch (state) {
1196 case TelephonyManager.DATA_CONNECTED:
Nathan Haroldcea413a2015-11-23 15:48:10 -08001197 //FIXME: Replace with a TelephonyManager call
Malcolm Chenf612f592017-11-29 18:01:25 -08001198 phone.setUserDataEnabled(false);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001199 break;
1200 case TelephonyManager.DATA_DISCONNECTED:
Nathan Haroldcea413a2015-11-23 15:48:10 -08001201 //FIXME: Replace with a TelephonyManager call
Malcolm Chenf612f592017-11-29 18:01:25 -08001202 phone.setUserDataEnabled(true);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001203 break;
1204 default:
1205 // do nothing
1206 break;
1207 }
1208 return true;
1209 }
1210 };
1211
Nathan Harold2b77d742016-03-19 13:22:10 -07001212 private boolean isRadioOn() {
1213 //FIXME: Replace with a TelephonyManager call
1214 return phone.getServiceState().getState() != ServiceState.STATE_POWER_OFF;
1215 }
1216
1217 private void updateRadioPowerState() {
1218 //delightful hack to prevent on-checked-changed calls from
1219 //actually forcing the radio preference to its transient/current value.
1220 radioPowerOnSwitch.setOnCheckedChangeListener(null);
1221 radioPowerOnSwitch.setChecked(isRadioOn());
1222 radioPowerOnSwitch.setOnCheckedChangeListener(mRadioPowerOnChangeListener);
1223 }
1224
Nathan Harolde272c202016-10-27 13:45:00 -07001225 void setImsVolteProvisionedState(boolean state) {
Nathan Harold12e1f552016-06-17 13:55:38 -07001226 Log.d(TAG, "setImsVolteProvisioned state: " + ((state)? "on":"off"));
Nathan Harolde272c202016-10-27 13:45:00 -07001227 setImsConfigProvisionedState(IMS_VOLTE_PROVISIONED_CONFIG_ID, state);
Nathan Harold12e1f552016-06-17 13:55:38 -07001228 }
1229
Nathan Harolde272c202016-10-27 13:45:00 -07001230 void setImsVtProvisionedState(boolean state) {
Nathan Harold12e1f552016-06-17 13:55:38 -07001231 Log.d(TAG, "setImsVtProvisioned() state: " + ((state)? "on":"off"));
Nathan Harolde272c202016-10-27 13:45:00 -07001232 setImsConfigProvisionedState(IMS_VT_PROVISIONED_CONFIG_ID, state);
Nathan Harold12e1f552016-06-17 13:55:38 -07001233 }
1234
Nathan Harolde272c202016-10-27 13:45:00 -07001235 void setImsWfcProvisionedState(boolean state) {
Nathan Harold12e1f552016-06-17 13:55:38 -07001236 Log.d(TAG, "setImsWfcProvisioned() state: " + ((state)? "on":"off"));
Nathan Harolde272c202016-10-27 13:45:00 -07001237 setImsConfigProvisionedState(IMS_WFC_PROVISIONED_CONFIG_ID, state);
Nathan Harold12e1f552016-06-17 13:55:38 -07001238 }
1239
Meng Wang586741c2017-04-26 15:02:51 -07001240 void setEabProvisionedState(boolean state) {
1241 Log.d(TAG, "setEabProvisioned() state: " + ((state)? "on":"off"));
1242 setImsConfigProvisionedState(EAB_PROVISIONED_CONFIG_ID, state);
1243 }
1244
Nathan Harolde272c202016-10-27 13:45:00 -07001245 void setImsConfigProvisionedState(int configItem, boolean state) {
Nathan Harold12e1f552016-06-17 13:55:38 -07001246 if (phone != null && mImsManager != null) {
Philip P. Moltmann5c449ae2017-02-14 12:43:02 -08001247 QueuedWork.queue(new Runnable() {
Nathan Harold12e1f552016-06-17 13:55:38 -07001248 public void run() {
1249 try {
1250 mImsManager.getConfigInterface().setProvisionedValue(
1251 configItem,
1252 state? 1 : 0);
1253 } catch (ImsException e) {
1254 Log.e(TAG, "setImsConfigProvisioned() exception:", e);
1255 }
1256 }
Philip P. Moltmann5c449ae2017-02-14 12:43:02 -08001257 }, false);
Nathan Harold12e1f552016-06-17 13:55:38 -07001258 }
1259 }
1260
Nathan Harold2b77d742016-03-19 13:22:10 -07001261 OnCheckedChangeListener mRadioPowerOnChangeListener = new OnCheckedChangeListener() {
1262 @Override
1263 public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
1264 log("toggle radio power: currently " + (isRadioOn()?"on":"off"));
1265 phone.setRadioPower(isChecked);
1266 }
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001267 };
1268
Nathan Harold12e1f552016-06-17 13:55:38 -07001269 private boolean isImsVolteProvisioned() {
Nathan Harold2b77d742016-03-19 13:22:10 -07001270 if (phone != null && mImsManager != null) {
1271 return mImsManager.isVolteEnabledByPlatform(phone.getContext())
1272 && mImsManager.isVolteProvisionedOnDevice(phone.getContext());
Pavel Zhamaitsiakcb267a62015-01-21 18:25:14 -08001273 }
1274 return false;
1275 }
1276
Nathan Harold12e1f552016-06-17 13:55:38 -07001277 OnCheckedChangeListener mImsVolteCheckedChangeListener = new OnCheckedChangeListener() {
Wink Saville426fc662011-09-25 14:39:02 -07001278 @Override
Nathan Harold2b77d742016-03-19 13:22:10 -07001279 public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
Nathan Harold12e1f552016-06-17 13:55:38 -07001280 setImsVolteProvisionedState(isChecked);
Nathan Harolde272c202016-10-27 13:45:00 -07001281 }
Wink Saville426fc662011-09-25 14:39:02 -07001282 };
1283
Nathan Harold12e1f552016-06-17 13:55:38 -07001284 private boolean isImsVtProvisioned() {
1285 if (phone != null && mImsManager != null) {
1286 return mImsManager.isVtEnabledByPlatform(phone.getContext())
1287 && mImsManager.isVtProvisionedOnDevice(phone.getContext());
1288 }
1289 return false;
1290 }
1291
1292 OnCheckedChangeListener mImsVtCheckedChangeListener = new OnCheckedChangeListener() {
1293 @Override
1294 public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
1295 setImsVtProvisionedState(isChecked);
Nathan Harolde272c202016-10-27 13:45:00 -07001296 }
Nathan Harold12e1f552016-06-17 13:55:38 -07001297 };
1298
1299 private boolean isImsWfcProvisioned() {
1300 if (phone != null && mImsManager != null) {
1301 return mImsManager.isWfcEnabledByPlatform(phone.getContext())
1302 && mImsManager.isWfcProvisionedOnDevice(phone.getContext());
1303 }
1304 return false;
1305 }
1306
1307 OnCheckedChangeListener mImsWfcCheckedChangeListener = new OnCheckedChangeListener() {
1308 @Override
1309 public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
1310 setImsWfcProvisionedState(isChecked);
Nathan Harolde272c202016-10-27 13:45:00 -07001311 }
Nathan Harold12e1f552016-06-17 13:55:38 -07001312 };
1313
Meng Wang586741c2017-04-26 15:02:51 -07001314 private boolean isEabProvisioned() {
1315 return isFeatureProvisioned(EAB_PROVISIONED_CONFIG_ID, false);
1316 }
1317
1318 OnCheckedChangeListener mEabCheckedChangeListener = new OnCheckedChangeListener() {
1319 @Override
1320 public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
1321 setEabProvisionedState(isChecked);
1322 }
1323 };
1324
1325 private boolean isFeatureProvisioned(int featureId, boolean defaultValue) {
1326 boolean provisioned = defaultValue;
1327 if (mImsManager != null) {
1328 try {
1329 ImsConfig imsConfig = mImsManager.getConfigInterface();
1330 if (imsConfig != null) {
1331 provisioned =
1332 (imsConfig.getProvisionedValue(featureId)
1333 == ImsConfig.FeatureValueConstants.ON);
1334 }
1335 } catch (ImsException ex) {
1336 Log.e(TAG, "isFeatureProvisioned() exception:", ex);
1337 }
1338 }
1339
1340 log("isFeatureProvisioned() featureId=" + featureId + " provisioned=" + provisioned);
1341 return provisioned;
1342 }
1343
1344 private static boolean isEabEnabledByPlatform(Context context) {
1345 if (context != null) {
1346 CarrierConfigManager configManager = (CarrierConfigManager)
1347 context.getSystemService(Context.CARRIER_CONFIG_SERVICE);
1348 if (configManager != null && configManager.getConfig().getBoolean(
1349 CarrierConfigManager.KEY_USE_RCS_PRESENCE_BOOL)) {
1350 return true;
1351 }
1352 }
1353 return false;
1354 }
1355
Nathan Harold12e1f552016-06-17 13:55:38 -07001356 private void updateImsProvisionedState() {
1357 log("updateImsProvisionedState isImsVolteProvisioned()=" + isImsVolteProvisioned());
Nathan Harold2b77d742016-03-19 13:22:10 -07001358 //delightful hack to prevent on-checked-changed calls from
1359 //actually forcing the ims provisioning to its transient/current value.
Nathan Harold12e1f552016-06-17 13:55:38 -07001360 imsVolteProvisionedSwitch.setOnCheckedChangeListener(null);
1361 imsVolteProvisionedSwitch.setChecked(isImsVolteProvisioned());
1362 imsVolteProvisionedSwitch.setOnCheckedChangeListener(mImsVolteCheckedChangeListener);
Sreekanth Badidac888e192018-02-05 17:18:40 +01001363 imsVolteProvisionedSwitch.setEnabled(!Build.IS_USER
1364 && mImsManager.isVolteEnabledByPlatform(phone.getContext()));
Nathan Harold12e1f552016-06-17 13:55:38 -07001365
1366 imsVtProvisionedSwitch.setOnCheckedChangeListener(null);
1367 imsVtProvisionedSwitch.setChecked(isImsVtProvisioned());
1368 imsVtProvisionedSwitch.setOnCheckedChangeListener(mImsVtCheckedChangeListener);
Sreekanth Badidac888e192018-02-05 17:18:40 +01001369 imsVtProvisionedSwitch.setEnabled(!Build.IS_USER
1370 && mImsManager.isVtEnabledByPlatform(phone.getContext()));
Nathan Harold12e1f552016-06-17 13:55:38 -07001371
1372 imsWfcProvisionedSwitch.setOnCheckedChangeListener(null);
1373 imsWfcProvisionedSwitch.setChecked(isImsWfcProvisioned());
1374 imsWfcProvisionedSwitch.setOnCheckedChangeListener(mImsWfcCheckedChangeListener);
Sreekanth Badidac888e192018-02-05 17:18:40 +01001375 imsWfcProvisionedSwitch.setEnabled(!Build.IS_USER
1376 && mImsManager.isWfcEnabledByPlatform(phone.getContext()));
Meng Wang586741c2017-04-26 15:02:51 -07001377
1378 eabProvisionedSwitch.setOnCheckedChangeListener(null);
1379 eabProvisionedSwitch.setChecked(isEabProvisioned());
1380 eabProvisionedSwitch.setOnCheckedChangeListener(mEabCheckedChangeListener);
Sreekanth Badidac888e192018-02-05 17:18:40 +01001381 eabProvisionedSwitch.setEnabled(!Build.IS_USER
1382 && isEabEnabledByPlatform(phone.getContext()));
Wink Saville426fc662011-09-25 14:39:02 -07001383 }
1384
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001385 OnClickListener mDnsCheckButtonHandler = new OnClickListener() {
1386 public void onClick(View v) {
Nathan Haroldcea413a2015-11-23 15:48:10 -08001387 //FIXME: Replace with a TelephonyManager call
Wink Savillec3886682009-04-02 11:00:56 -07001388 phone.disableDnsCheck(!phone.isDnsCheckDisabled());
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001389 updateDnsCheckState();
1390 }
1391 };
johnwang342101a2009-09-23 16:22:34 -07001392
Tammo Spalinka5f4c8f2009-10-15 20:08:58 +08001393 OnClickListener mOemInfoButtonHandler = new OnClickListener() {
1394 public void onClick(View v) {
1395 Intent intent = new Intent("com.android.settings.OEM_RADIO_INFO");
1396 try {
1397 startActivity(intent);
1398 } catch (android.content.ActivityNotFoundException ex) {
Wink Savillebf471282013-04-05 15:04:05 -07001399 log("OEM-specific Info/Settings Activity Not Found : " + ex);
Tammo Spalinka5f4c8f2009-10-15 20:08:58 +08001400 // If the activity does not exist, there are no OEM
1401 // settings, and so we can just do nothing...
1402 }
1403 }
1404 };
1405
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001406 OnClickListener mPingButtonHandler = new OnClickListener() {
1407 public void onClick(View v) {
1408 updatePingState();
1409 }
1410 };
1411
1412 OnClickListener mUpdateSmscButtonHandler = new OnClickListener() {
1413 public void onClick(View v) {
1414 updateSmscButton.setEnabled(false);
jsh21dd4072009-05-12 11:26:55 -07001415 phone.setSmscAddress(smsc.getText().toString(),
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001416 mHandler.obtainMessage(EVENT_UPDATE_SMSC_DONE));
1417 }
1418 };
1419
1420 OnClickListener mRefreshSmscButtonHandler = new OnClickListener() {
1421 public void onClick(View v) {
1422 refreshSmsc();
1423 }
1424 };
1425
Youhan Wangfd781e92016-12-16 15:53:16 -08001426 OnClickListener mCarrierProvisioningButtonHandler = new OnClickListener() {
1427 public void onClick(View v) {
Meng Wanga04449b2017-08-03 14:34:35 -07001428 final Intent intent = new Intent("com.android.settings.CARRIER_PROVISIONING");
1429 final ComponentName serviceComponent = ComponentName.unflattenFromString(
1430 "com.android.omadm.service/.DMIntentReceiver");
Youhan Wangfd781e92016-12-16 15:53:16 -08001431 intent.setComponent(serviceComponent);
Meng Wanga04449b2017-08-03 14:34:35 -07001432 sendBroadcast(intent);
Youhan Wangfd781e92016-12-16 15:53:16 -08001433 }
1434 };
1435
1436 OnClickListener mTriggerCarrierProvisioningButtonHandler = new OnClickListener() {
1437 public void onClick(View v) {
Meng Wanga04449b2017-08-03 14:34:35 -07001438 final Intent intent = new Intent("com.android.settings.TRIGGER_CARRIER_PROVISIONING");
1439 final ComponentName serviceComponent = ComponentName.unflattenFromString(
1440 "com.android.omadm.service/.DMIntentReceiver");
Youhan Wangfd781e92016-12-16 15:53:16 -08001441 intent.setComponent(serviceComponent);
Meng Wanga04449b2017-08-03 14:34:35 -07001442 sendBroadcast(intent);
Youhan Wangfd781e92016-12-16 15:53:16 -08001443 }
1444 };
1445
Nathan Haroldcea413a2015-11-23 15:48:10 -08001446 AdapterView.OnItemSelectedListener mPreferredNetworkHandler =
1447 new AdapterView.OnItemSelectedListener() {
1448
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001449 public void onItemSelected(AdapterView parent, View v, int pos, long id) {
Nathan Haroldcea413a2015-11-23 15:48:10 -08001450 if (mPreferredNetworkTypeResult != pos && pos >= 0
1451 && pos <= mPreferredNetworkLabels.length - 2) {
1452 mPreferredNetworkTypeResult = pos;
Nathan Harolddaea8be2018-06-05 14:02:35 -07001453
1454 // TODO: Possibly migrate this to TelephonyManager.setPreferredNetworkType()
1455 // which today still has some issues (mostly that the "set" is conditional
1456 // on a successful modem call, which is not what we want). Instead we always
1457 // want this setting to be set, so that if the radio hiccups and this setting
1458 // is for some reason unsuccessful, future calls to the radio will reflect
1459 // the users's preference which is set here.
1460 final int subId = phone.getSubId();
1461 if (SubscriptionManager.isUsableSubIdValue(subId)) {
1462 Settings.Global.putInt(phone.getContext().getContentResolver(),
1463 PREFERRED_NETWORK_MODE + subId, mPreferredNetworkTypeResult);
1464 }
1465 log("Calling setPreferredNetworkType(" + mPreferredNetworkTypeResult + ")");
Nathan Haroldcea413a2015-11-23 15:48:10 -08001466 Message msg = mHandler.obtainMessage(EVENT_SET_PREFERRED_TYPE_DONE);
1467 phone.setPreferredNetworkType(mPreferredNetworkTypeResult, msg);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001468 }
1469 }
1470
1471 public void onNothingSelected(AdapterView parent) {
1472 }
1473 };
1474
Nathan Harold2b77d742016-03-19 13:22:10 -07001475 AdapterView.OnItemSelectedListener mCellInfoRefreshRateHandler =
1476 new AdapterView.OnItemSelectedListener() {
Wink Savillebf471282013-04-05 15:04:05 -07001477
Nathan Harold2b77d742016-03-19 13:22:10 -07001478 public void onItemSelected(AdapterView parent, View v, int pos, long id) {
1479 mCellInfoRefreshRateIndex = pos;
Sooraj Sasindran5cce06b2016-08-18 15:49:49 -07001480 mTelephonyManager.setCellInfoListRate(mCellInfoRefreshRates[pos]);
Nathan Harold2b77d742016-03-19 13:22:10 -07001481 updateAllCellInfo();
1482 }
1483
1484 public void onNothingSelected(AdapterView parent) {
1485 }
1486 };
1487
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001488}