blob: ee20c586e9bea6c128cfaf7180faed488b61e8cc [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;
Nathan Harolde272c202016-10-27 13:45:00 -070023import android.app.AlertDialog;
Pavel Zhamaitsiakcb267a62015-01-21 18:25:14 -080024import android.app.QueuedWork;
Youhan Wangfd781e92016-12-16 15:53:16 -080025import android.content.ComponentName;
Meng Wang586741c2017-04-26 15:02:51 -070026import android.content.Context;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080027import android.content.Intent;
Tammo Spalinka5f4c8f2009-10-15 20:08:58 +080028import android.content.pm.PackageManager;
29import android.content.pm.ResolveInfo;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080030import android.content.res.Resources;
Nathan Haroldcea413a2015-11-23 15:48:10 -080031import android.graphics.Typeface;
Nathan Haroldf10ea322018-04-24 13:31:07 -070032import android.net.ConnectivityManager;
33import android.net.Network;
34import android.net.NetworkCapabilities;
35import android.net.NetworkRequest;
Jeff Sharkey93029862011-05-27 18:26:15 -070036import android.net.TrafficStats;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080037import android.net.Uri;
38import android.os.AsyncResult;
39import 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 Zhangde117042018-09-04 13:52:15 -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 Zhangde117042018-09-04 13:52:15 -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
Jason Monk39b46742015-09-10 15:52:51 -040083import com.android.ims.ImsConfig;
84import com.android.ims.ImsException;
85import com.android.ims.ImsManager;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080086import com.android.internal.telephony.Phone;
87import com.android.internal.telephony.PhoneFactory;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080088
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080089import java.io.IOException;
Jason Monk39b46742015-09-10 15:52:51 -040090import java.net.HttpURLConnection;
91import java.net.URL;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080092import java.util.List;
93
94public class RadioInfo extends Activity {
Nathan Harold2b77d742016-03-19 13:22:10 -070095 private static final String TAG = "RadioInfo";
johnwang342101a2009-09-23 16:22:34 -070096
Nathan Harold2b77d742016-03-19 13:22:10 -070097 private static final String[] mPreferredNetworkLabels = {
98 "WCDMA preferred",
99 "GSM only",
100 "WCDMA only",
101 "GSM auto (PRL)",
102 "CDMA auto (PRL)",
103 "CDMA only",
104 "EvDo only",
105 "Global auto (PRL)",
106 "LTE/CDMA auto (PRL)",
107 "LTE/UMTS auto (PRL)",
108 "LTE/CDMA/UMTS auto (PRL)",
109 "LTE only",
110 "LTE/WCDMA",
111 "TD-SCDMA only",
112 "TD-SCDMA/WCDMA",
113 "LTE/TD-SCDMA",
114 "TD-SCDMA/GSM",
115 "TD-SCDMA/UMTS",
116 "LTE/TD-SCDMA/WCDMA",
117 "LTE/TD-SCDMA/UMTS",
118 "TD-SCDMA/CDMA/UMTS",
119 "Global/TD-SCDMA",
120 "Unknown"
121 };
122
123
124 private static final int CELL_INFO_LIST_RATE_DISABLED = Integer.MAX_VALUE;
125 private static final int CELL_INFO_LIST_RATE_MAX = 0;
126
Nathan Harold12e1f552016-06-17 13:55:38 -0700127
128 private static final int IMS_VOLTE_PROVISIONED_CONFIG_ID =
129 ImsConfig.ConfigConstants.VLT_SETTING_ENABLED;
130
131 private static final int IMS_VT_PROVISIONED_CONFIG_ID =
132 ImsConfig.ConfigConstants.LVC_SETTING_ENABLED;
133
134 private static final int IMS_WFC_PROVISIONED_CONFIG_ID =
135 ImsConfig.ConfigConstants.VOICE_OVER_WIFI_SETTING_ENABLED;
136
Meng Wang586741c2017-04-26 15:02:51 -0700137 private static final int EAB_PROVISIONED_CONFIG_ID =
138 ImsConfig.ConfigConstants.EAB_SETTING_ENABLED;
139
Nathan Harold2b77d742016-03-19 13:22:10 -0700140 //Values in must match mCellInfoRefreshRates
141 private static final String[] mCellInfoRefreshRateLabels = {
142 "Disabled",
143 "Immediate",
144 "Min 5s",
145 "Min 10s",
146 "Min 60s"
147 };
148
149 //Values in seconds, must match mCellInfoRefreshRateLabels
150 private static final int mCellInfoRefreshRates[] = {
151 CELL_INFO_LIST_RATE_DISABLED,
152 CELL_INFO_LIST_RATE_MAX,
153 5000,
154 10000,
155 60000
156 };
157
158 private void log(String s) {
159 Log.d(TAG, s);
160 }
161
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800162 private static final int EVENT_CFI_CHANGED = 302;
163
164 private static final int EVENT_QUERY_PREFERRED_TYPE_DONE = 1000;
165 private static final int EVENT_SET_PREFERRED_TYPE_DONE = 1001;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800166 private static final int EVENT_QUERY_SMSC_DONE = 1005;
167 private static final int EVENT_UPDATE_SMSC_DONE = 1006;
168
169 private static final int MENU_ITEM_SELECT_BAND = 0;
170 private static final int MENU_ITEM_VIEW_ADN = 1;
171 private static final int MENU_ITEM_VIEW_FDN = 2;
172 private static final int MENU_ITEM_VIEW_SDN = 3;
Nathan Harolde272c202016-10-27 13:45:00 -0700173 private static final int MENU_ITEM_GET_IMS_STATUS = 4;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800174 private static final int MENU_ITEM_TOGGLE_DATA = 5;
Tammo Spalinka5f4c8f2009-10-15 20:08:58 +0800175
Wink Savillec3886682009-04-02 11:00:56 -0700176 private TextView mDeviceId; //DeviceId is the IMEI in GSM and the MEID in CDMA
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800177 private TextView number;
Meng Wang9053f172017-06-23 16:02:14 -0700178 private TextView mSubscriberId;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800179 private TextView callState;
180 private TextView operatorName;
181 private TextView roamingState;
182 private TextView gsmState;
183 private TextView gprsState;
Nathan Harold2b77d742016-03-19 13:22:10 -0700184 private TextView voiceNetwork;
185 private TextView dataNetwork;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800186 private TextView dBm;
187 private TextView mMwi;
188 private TextView mCfi;
189 private TextView mLocation;
Wink Saville79bff2a2012-06-01 14:37:21 -0700190 private TextView mCellInfo;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800191 private TextView sent;
192 private TextView received;
Nathan Haroldcea413a2015-11-23 15:48:10 -0800193 private TextView mPingHostnameV4;
194 private TextView mPingHostnameV6;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800195 private TextView mHttpClientTest;
Nathan Harold433ca442018-04-23 18:20:43 -0700196 private TextView mPhyChanConfig;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800197 private TextView dnsCheckState;
Nathan Haroldf10ea322018-04-24 13:31:07 -0700198 private TextView mDownlinkKbps;
199 private TextView mUplinkKbps;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800200 private EditText smsc;
Nathan Harold2b77d742016-03-19 13:22:10 -0700201 private Switch radioPowerOnSwitch;
202 private Button cellInfoRefreshRateButton;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800203 private Button dnsCheckToggleButton;
204 private Button pingTestButton;
205 private Button updateSmscButton;
206 private Button refreshSmscButton;
Tammo Spalinka5f4c8f2009-10-15 20:08:58 +0800207 private Button oemInfoButton;
Youhan Wangfd781e92016-12-16 15:53:16 -0800208 private Button carrierProvisioningButton;
209 private Button triggercarrierProvisioningButton;
Nathan Harold12e1f552016-06-17 13:55:38 -0700210 private Switch imsVolteProvisionedSwitch;
211 private Switch imsVtProvisionedSwitch;
212 private Switch imsWfcProvisionedSwitch;
Meng Wang586741c2017-04-26 15:02:51 -0700213 private Switch eabProvisionedSwitch;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800214 private Spinner preferredNetworkType;
Nathan Harold2b77d742016-03-19 13:22:10 -0700215 private Spinner cellInfoRefreshRateSpinner;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800216
Nathan Haroldf10ea322018-04-24 13:31:07 -0700217 private ConnectivityManager mConnectivityManager;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800218 private TelephonyManager mTelephonyManager;
Nathan Haroldcea413a2015-11-23 15:48:10 -0800219 private ImsManager mImsManager = null;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800220 private Phone phone = null;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800221
Nathan Haroldcea413a2015-11-23 15:48:10 -0800222 private String mPingHostnameResultV4;
223 private String mPingHostnameResultV6;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800224 private String mHttpClientTestResult;
225 private boolean mMwiValue = false;
226 private boolean mCfiValue = false;
Nathan Haroldcea413a2015-11-23 15:48:10 -0800227
228 private List<CellInfo> mCellInfoResult = null;
229 private CellLocation mCellLocationResult = null;
Nathan Haroldcea413a2015-11-23 15:48:10 -0800230
231 private int mPreferredNetworkTypeResult;
Nathan Harold2b77d742016-03-19 13:22:10 -0700232 private int mCellInfoRefreshRateIndex;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800233
Nathan Haroldf10ea322018-04-24 13:31:07 -0700234 private final NetworkRequest mDefaultNetworkRequest = new NetworkRequest.Builder()
235 .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
236 .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
237 .build();
238
239 private final NetworkCallback mNetworkCallback = new NetworkCallback() {
240 public void onCapabilitiesChanged(Network n, NetworkCapabilities nc) {
241 int dlbw = nc.getLinkDownstreamBandwidthKbps();
242 int ulbw = nc.getLinkUpstreamBandwidthKbps();
243 updateBandwidths(dlbw, ulbw);
244 }
245 };
246
Nathan Harold2b77d742016-03-19 13:22:10 -0700247 private final PhoneStateListener mPhoneStateListener = new PhoneStateListener() {
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800248 @Override
249 public void onDataConnectionStateChanged(int state) {
250 updateDataState();
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800251 updateNetworkType();
252 }
253
254 @Override
255 public void onDataActivity(int direction) {
256 updateDataStats2();
257 }
258
259 @Override
Nathan Harold2b77d742016-03-19 13:22:10 -0700260 public void onCallStateChanged(int state, String incomingNumber) {
261 updateNetworkType();
262 updatePhoneState(state);
263 }
264
265 @Override
266 public void onPreciseCallStateChanged(PreciseCallState preciseState) {
267 updateNetworkType();
268 }
269
270 @Override
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800271 public void onCellLocationChanged(CellLocation location) {
272 updateLocation(location);
273 }
274
275 @Override
276 public void onMessageWaitingIndicatorChanged(boolean mwi) {
277 mMwiValue = mwi;
278 updateMessageWaiting();
279 }
280
281 @Override
282 public void onCallForwardingIndicatorChanged(boolean cfi) {
283 mCfiValue = cfi;
284 updateCallRedirect();
285 }
Wink Saville79bff2a2012-06-01 14:37:21 -0700286
287 @Override
288 public void onCellInfoChanged(List<CellInfo> arrayCi) {
Wink Savillebf471282013-04-05 15:04:05 -0700289 log("onCellInfoChanged: arrayCi=" + arrayCi);
Nathan Haroldcea413a2015-11-23 15:48:10 -0800290 mCellInfoResult = arrayCi;
291 updateCellInfo(mCellInfoResult);
Wink Saville79bff2a2012-06-01 14:37:21 -0700292 }
Wink Saville4f0d8812014-04-15 22:05:24 -0700293
294 @Override
Nathan Harold2b77d742016-03-19 13:22:10 -0700295 public void onSignalStrengthsChanged(SignalStrength signalStrength) {
296 log("onSignalStrengthChanged: SignalStrength=" +signalStrength);
297 updateSignalStrength(signalStrength);
298 }
299
300 @Override
301 public void onServiceStateChanged(ServiceState serviceState) {
302 log("onServiceStateChanged: ServiceState=" + serviceState);
303 updateServiceState(serviceState);
304 updateRadioPowerState();
305 updateNetworkType();
Nathan Harold12e1f552016-06-17 13:55:38 -0700306 updateImsProvisionedState();
Nathan Harold2b77d742016-03-19 13:22:10 -0700307 }
Nathan Harold433ca442018-04-23 18:20:43 -0700308
309 @Override
310 public void onPhysicalChannelConfigurationChanged(
311 List<PhysicalChannelConfig> configs) {
312 updatePhysicalChannelConfiguration(configs);
313 }
314
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800315 };
316
Nathan Harold433ca442018-04-23 18:20:43 -0700317 private void updatePhysicalChannelConfiguration(List<PhysicalChannelConfig> configs) {
318 StringBuilder sb = new StringBuilder();
319 String div = "";
320 sb.append("{");
321 if (configs != null) {
322 for(PhysicalChannelConfig c : configs) {
323 sb.append(div).append(c);
324 div = ",";
325 }
326 }
327 sb.append("}");
328 mPhyChanConfig.setText(sb.toString());
329 }
330
Nathan Haroldcea413a2015-11-23 15:48:10 -0800331 private void updatePreferredNetworkType(int type) {
332 if (type >= mPreferredNetworkLabels.length || type < 0) {
333 log("EVENT_QUERY_PREFERRED_TYPE_DONE: unknown " +
334 "type=" + type);
335 type = mPreferredNetworkLabels.length - 1; //set to Unknown
336 }
337 mPreferredNetworkTypeResult = type;
338
339 preferredNetworkType.setSelection(mPreferredNetworkTypeResult, true);
340 }
341
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800342 private Handler mHandler = new Handler() {
Nathan Haroldcea413a2015-11-23 15:48:10 -0800343 @Override
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800344 public void handleMessage(Message msg) {
345 AsyncResult ar;
346 switch (msg.what) {
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800347 case EVENT_QUERY_PREFERRED_TYPE_DONE:
348 ar= (AsyncResult) msg.obj;
Nathan Haroldcea413a2015-11-23 15:48:10 -0800349 if (ar.exception == null && ar.result != null) {
350 updatePreferredNetworkType(((int[])ar.result)[0]);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800351 } else {
Nathan Haroldcea413a2015-11-23 15:48:10 -0800352 //In case of an exception, we will set this to unknown
353 updatePreferredNetworkType(mPreferredNetworkLabels.length-1);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800354 }
355 break;
356 case EVENT_SET_PREFERRED_TYPE_DONE:
357 ar= (AsyncResult) msg.obj;
358 if (ar.exception != null) {
Nathan Harolded38afa2016-04-13 00:29:30 -0700359 log("Set preferred network type failed.");
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800360 }
361 break;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800362 case EVENT_QUERY_SMSC_DONE:
363 ar= (AsyncResult) msg.obj;
364 if (ar.exception != null) {
365 smsc.setText("refresh error");
366 } else {
jsh21dd4072009-05-12 11:26:55 -0700367 smsc.setText((String)ar.result);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800368 }
369 break;
370 case EVENT_UPDATE_SMSC_DONE:
371 updateSmscButton.setEnabled(true);
372 ar= (AsyncResult) msg.obj;
373 if (ar.exception != null) {
374 smsc.setText("update error");
375 }
376 break;
377 default:
Nathan Haroldcea413a2015-11-23 15:48:10 -0800378 super.handleMessage(msg);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800379 break;
380
381 }
382 }
383 };
384
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800385 @Override
386 public void onCreate(Bundle icicle) {
387 super.onCreate(icicle);
fionaxub54cb2d2016-09-22 15:01:05 -0700388 if (!android.os.Process.myUserHandle().isSystem()) {
389 Log.e(TAG, "Not run from system user, don't do anything.");
390 finish();
391 return;
392 }
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800393
394 setContentView(R.layout.radio_info);
395
Nathan Haroldcea413a2015-11-23 15:48:10 -0800396 log("Started onCreate");
397
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800398 mTelephonyManager = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
Nathan Haroldf10ea322018-04-24 13:31:07 -0700399 mConnectivityManager = (ConnectivityManager)getSystemService(CONNECTIVITY_SERVICE);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800400 phone = PhoneFactory.getDefaultPhone();
401
Nathan Haroldcea413a2015-11-23 15:48:10 -0800402 //TODO: Need to update this if the default phoneId changes?
403 // Better to have an instance per phone?
404 mImsManager = ImsManager.getInstance(getApplicationContext(),
405 SubscriptionManager.getDefaultVoicePhoneId());
406
Meng Wang9053f172017-06-23 16:02:14 -0700407 mDeviceId = (TextView) findViewById(R.id.imei);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800408 number = (TextView) findViewById(R.id.number);
Meng Wang9053f172017-06-23 16:02:14 -0700409 mSubscriberId = (TextView) findViewById(R.id.imsi);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800410 callState = (TextView) findViewById(R.id.call);
411 operatorName = (TextView) findViewById(R.id.operator);
412 roamingState = (TextView) findViewById(R.id.roaming);
413 gsmState = (TextView) findViewById(R.id.gsm);
414 gprsState = (TextView) findViewById(R.id.gprs);
Nathan Harold2b77d742016-03-19 13:22:10 -0700415 voiceNetwork = (TextView) findViewById(R.id.voice_network);
416 dataNetwork = (TextView) findViewById(R.id.data_network);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800417 dBm = (TextView) findViewById(R.id.dbm);
418 mMwi = (TextView) findViewById(R.id.mwi);
419 mCfi = (TextView) findViewById(R.id.cfi);
420 mLocation = (TextView) findViewById(R.id.location);
Wink Saville79bff2a2012-06-01 14:37:21 -0700421 mCellInfo = (TextView) findViewById(R.id.cellinfo);
Nathan Haroldcea413a2015-11-23 15:48:10 -0800422 mCellInfo.setTypeface(Typeface.MONOSPACE);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800423
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800424 sent = (TextView) findViewById(R.id.sent);
425 received = (TextView) findViewById(R.id.received);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800426 smsc = (EditText) findViewById(R.id.smsc);
427 dnsCheckState = (TextView) findViewById(R.id.dnsCheckState);
Nathan Haroldcea413a2015-11-23 15:48:10 -0800428 mPingHostnameV4 = (TextView) findViewById(R.id.pingHostnameV4);
429 mPingHostnameV6 = (TextView) findViewById(R.id.pingHostnameV6);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800430 mHttpClientTest = (TextView) findViewById(R.id.httpClientTest);
431
Nathan Harold433ca442018-04-23 18:20:43 -0700432 mPhyChanConfig = (TextView) findViewById(R.id.phy_chan_config);
433
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800434 preferredNetworkType = (Spinner) findViewById(R.id.preferredNetworkType);
435 ArrayAdapter<String> adapter = new ArrayAdapter<String> (this,
436 android.R.layout.simple_spinner_item, mPreferredNetworkLabels);
johnwang342101a2009-09-23 16:22:34 -0700437 adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800438 preferredNetworkType.setAdapter(adapter);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800439
Nathan Harold2b77d742016-03-19 13:22:10 -0700440 cellInfoRefreshRateSpinner = (Spinner) findViewById(R.id.cell_info_rate_select);
441 ArrayAdapter<String> cellInfoAdapter = new ArrayAdapter<String>(this,
442 android.R.layout.simple_spinner_item, mCellInfoRefreshRateLabels);
443 cellInfoAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
444 cellInfoRefreshRateSpinner.setAdapter(cellInfoAdapter);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800445
Nathan Harold12e1f552016-06-17 13:55:38 -0700446 imsVolteProvisionedSwitch = (Switch) findViewById(R.id.volte_provisioned_switch);
447 imsVtProvisionedSwitch = (Switch) findViewById(R.id.vt_provisioned_switch);
448 imsWfcProvisionedSwitch = (Switch) findViewById(R.id.wfc_provisioned_switch);
Meng Wang69439b52017-05-01 08:31:14 -0700449 eabProvisionedSwitch = (Switch) findViewById(R.id.eab_provisioned_switch);
Wink Savillebf471282013-04-05 15:04:05 -0700450
Nathan Harold2b77d742016-03-19 13:22:10 -0700451 radioPowerOnSwitch = (Switch) findViewById(R.id.radio_power);
Wink Saville426fc662011-09-25 14:39:02 -0700452
Nathan Haroldf10ea322018-04-24 13:31:07 -0700453 mDownlinkKbps = (TextView) findViewById(R.id.dl_kbps);
454 mUplinkKbps = (TextView) findViewById(R.id.ul_kbps);
455 updateBandwidths(0, 0);
456
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800457 pingTestButton = (Button) findViewById(R.id.ping_test);
458 pingTestButton.setOnClickListener(mPingButtonHandler);
459 updateSmscButton = (Button) findViewById(R.id.update_smsc);
460 updateSmscButton.setOnClickListener(mUpdateSmscButtonHandler);
461 refreshSmscButton = (Button) findViewById(R.id.refresh_smsc);
462 refreshSmscButton.setOnClickListener(mRefreshSmscButtonHandler);
463 dnsCheckToggleButton = (Button) findViewById(R.id.dns_check_toggle);
464 dnsCheckToggleButton.setOnClickListener(mDnsCheckButtonHandler);
Youhan Wangfd781e92016-12-16 15:53:16 -0800465 carrierProvisioningButton = (Button) findViewById(R.id.carrier_provisioning);
466 carrierProvisioningButton.setOnClickListener(mCarrierProvisioningButtonHandler);
467 triggercarrierProvisioningButton = (Button) findViewById(R.id.trigger_carrier_provisioning);
468 triggercarrierProvisioningButton.setOnClickListener(
469 mTriggerCarrierProvisioningButtonHandler);
johnwang342101a2009-09-23 16:22:34 -0700470
Tammo Spalinka5f4c8f2009-10-15 20:08:58 +0800471 oemInfoButton = (Button) findViewById(R.id.oem_info);
472 oemInfoButton.setOnClickListener(mOemInfoButtonHandler);
473 PackageManager pm = getPackageManager();
474 Intent oemInfoIntent = new Intent("com.android.settings.OEM_RADIO_INFO");
475 List<ResolveInfo> oemInfoIntentList = pm.queryIntentActivities(oemInfoIntent, 0);
476 if (oemInfoIntentList.size() == 0) {
477 oemInfoButton.setEnabled(false);
478 }
479
Nathan Harolded38afa2016-04-13 00:29:30 -0700480 mCellInfoRefreshRateIndex = 0; //disabled
Nathan Haroldcea413a2015-11-23 15:48:10 -0800481 mPreferredNetworkTypeResult = mPreferredNetworkLabels.length - 1; //Unknown
482
483 //FIXME: Replace with TelephonyManager call
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800484 phone.getPreferredNetworkType(
485 mHandler.obtainMessage(EVENT_QUERY_PREFERRED_TYPE_DONE));
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800486
Nathan Haroldcea413a2015-11-23 15:48:10 -0800487 restoreFromBundle(icicle);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800488 }
489
490 @Override
491 protected void onResume() {
492 super.onResume();
493
Nathan Haroldcea413a2015-11-23 15:48:10 -0800494 log("Started onResume");
495
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800496 updateMessageWaiting();
497 updateCallRedirect();
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800498 updateDataState();
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800499 updateDataStats2();
Nathan Harold2b77d742016-03-19 13:22:10 -0700500 updateRadioPowerState();
Nathan Harold12e1f552016-06-17 13:55:38 -0700501 updateImsProvisionedState();
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800502 updateProperties();
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800503 updateDnsCheckState();
Nathan Harold2b77d742016-03-19 13:22:10 -0700504 updateNetworkType();
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800505
Nathan Haroldcea413a2015-11-23 15:48:10 -0800506 updateLocation(mCellLocationResult);
507 updateCellInfo(mCellInfoResult);
508
509 mPingHostnameV4.setText(mPingHostnameResultV4);
510 mPingHostnameV6.setText(mPingHostnameResultV6);
511 mHttpClientTest.setText(mHttpClientTestResult);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800512
Nathan Harold2b77d742016-03-19 13:22:10 -0700513 cellInfoRefreshRateSpinner.setOnItemSelectedListener(mCellInfoRefreshRateHandler);
Nathan Harolded38afa2016-04-13 00:29:30 -0700514 //set selection after registering listener to force update
515 cellInfoRefreshRateSpinner.setSelection(mCellInfoRefreshRateIndex);
516
517 //set selection before registering to prevent update
518 preferredNetworkType.setSelection(mPreferredNetworkTypeResult, true);
Nathan Harold2b77d742016-03-19 13:22:10 -0700519 preferredNetworkType.setOnItemSelectedListener(mPreferredNetworkHandler);
Nathan Harolded38afa2016-04-13 00:29:30 -0700520
Nathan Harold2b77d742016-03-19 13:22:10 -0700521 radioPowerOnSwitch.setOnCheckedChangeListener(mRadioPowerOnChangeListener);
Nathan Harold12e1f552016-06-17 13:55:38 -0700522 imsVolteProvisionedSwitch.setOnCheckedChangeListener(mImsVolteCheckedChangeListener);
523 imsVtProvisionedSwitch.setOnCheckedChangeListener(mImsVtCheckedChangeListener);
524 imsWfcProvisionedSwitch.setOnCheckedChangeListener(mImsWfcCheckedChangeListener);
Meng Wang586741c2017-04-26 15:02:51 -0700525 eabProvisionedSwitch.setOnCheckedChangeListener(mEabCheckedChangeListener);
Nathan Harold2b77d742016-03-19 13:22:10 -0700526
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800527 mTelephonyManager.listen(mPhoneStateListener,
Nathan Harold2b77d742016-03-19 13:22:10 -0700528 PhoneStateListener.LISTEN_CALL_STATE
529 //b/27803938 - RadioInfo currently cannot read PRECISE_CALL_STATE
530 // | PhoneStateListener.LISTEN_PRECISE_CALL_STATE
531 | PhoneStateListener.LISTEN_DATA_CONNECTION_STATE
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800532 | PhoneStateListener.LISTEN_DATA_ACTIVITY
533 | PhoneStateListener.LISTEN_CELL_LOCATION
534 | PhoneStateListener.LISTEN_MESSAGE_WAITING_INDICATOR
Wink Saville79bff2a2012-06-01 14:37:21 -0700535 | PhoneStateListener.LISTEN_CALL_FORWARDING_INDICATOR
Wink Saville4f0d8812014-04-15 22:05:24 -0700536 | PhoneStateListener.LISTEN_CELL_INFO
Nathan Harold2b77d742016-03-19 13:22:10 -0700537 | PhoneStateListener.LISTEN_SERVICE_STATE
538 | PhoneStateListener.LISTEN_SIGNAL_STRENGTHS
Nathan Harold433ca442018-04-23 18:20:43 -0700539 | PhoneStateListener.LISTEN_PHYSICAL_CHANNEL_CONFIGURATION);
Nathan Harolded38afa2016-04-13 00:29:30 -0700540
Nathan Haroldf10ea322018-04-24 13:31:07 -0700541 mConnectivityManager.registerNetworkCallback(
542 mDefaultNetworkRequest, mNetworkCallback, mHandler);
543
Nathan Harolded38afa2016-04-13 00:29:30 -0700544 smsc.clearFocus();
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800545 }
546
547 @Override
Nathan Haroldcea413a2015-11-23 15:48:10 -0800548 protected void onPause() {
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800549 super.onPause();
550
Wink Savillebf471282013-04-05 15:04:05 -0700551 log("onPause: unregister phone & data intents");
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800552
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800553 mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE);
Sooraj Sasindran5cce06b2016-08-18 15:49:49 -0700554 mTelephonyManager.setCellInfoListRate(CELL_INFO_LIST_RATE_DISABLED);
Nathan Haroldf10ea322018-04-24 13:31:07 -0700555 mConnectivityManager.unregisterNetworkCallback(mNetworkCallback);
556
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800557 }
558
Nathan Haroldcea413a2015-11-23 15:48:10 -0800559 private void restoreFromBundle(Bundle b) {
Nathan Harolde272c202016-10-27 13:45:00 -0700560 if(b == null) {
Nathan Haroldcea413a2015-11-23 15:48:10 -0800561 return;
562 }
563
564 mPingHostnameResultV4 = b.getString("mPingHostnameResultV4","");
565 mPingHostnameResultV6 = b.getString("mPingHostnameResultV6","");
566 mHttpClientTestResult = b.getString("mHttpClientTestResult","");
567
568 mPingHostnameV4.setText(mPingHostnameResultV4);
569 mPingHostnameV6.setText(mPingHostnameResultV6);
570 mHttpClientTest.setText(mHttpClientTestResult);
571
Nathan Harold2b77d742016-03-19 13:22:10 -0700572 mPreferredNetworkTypeResult = b.getInt("mPreferredNetworkTypeResult",
573 mPreferredNetworkLabels.length - 1);
574
575 mCellInfoRefreshRateIndex = b.getInt("mCellInfoRefreshRateIndex", 0);
Nathan Haroldcea413a2015-11-23 15:48:10 -0800576 }
577
578 @Override
579 protected void onSaveInstanceState(Bundle outState) {
580 outState.putString("mPingHostnameResultV4", mPingHostnameResultV4);
581 outState.putString("mPingHostnameResultV6", mPingHostnameResultV6);
582 outState.putString("mHttpClientTestResult", mHttpClientTestResult);
Nathan Harold2b77d742016-03-19 13:22:10 -0700583
Nathan Haroldcea413a2015-11-23 15:48:10 -0800584 outState.putInt("mPreferredNetworkTypeResult", mPreferredNetworkTypeResult);
Nathan Harold2b77d742016-03-19 13:22:10 -0700585 outState.putInt("mCellInfoRefreshRateIndex", mCellInfoRefreshRateIndex);
586
Nathan Haroldcea413a2015-11-23 15:48:10 -0800587 }
588
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800589 @Override
590 public boolean onCreateOptionsMenu(Menu menu) {
Wink Savillec3886682009-04-02 11:00:56 -0700591 menu.add(0, MENU_ITEM_SELECT_BAND, 0, R.string.radio_info_band_mode_label)
592 .setOnMenuItemClickListener(mSelectBandCallback)
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800593 .setAlphabeticShortcut('b');
594 menu.add(1, MENU_ITEM_VIEW_ADN, 0,
595 R.string.radioInfo_menu_viewADN).setOnMenuItemClickListener(mViewADNCallback);
596 menu.add(1, MENU_ITEM_VIEW_FDN, 0,
597 R.string.radioInfo_menu_viewFDN).setOnMenuItemClickListener(mViewFDNCallback);
598 menu.add(1, MENU_ITEM_VIEW_SDN, 0,
599 R.string.radioInfo_menu_viewSDN).setOnMenuItemClickListener(mViewSDNCallback);
Nathan Harolde272c202016-10-27 13:45:00 -0700600 menu.add(1, MENU_ITEM_GET_IMS_STATUS,
601 0, R.string.radioInfo_menu_getIMS).setOnMenuItemClickListener(mGetImsStatus);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800602 menu.add(1, MENU_ITEM_TOGGLE_DATA,
Nathan Harold2b77d742016-03-19 13:22:10 -0700603 0, R.string.radio_info_data_connection_disable).setOnMenuItemClickListener(mToggleData);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800604 return true;
605 }
606
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800607 @Override
Wink Savillec3886682009-04-02 11:00:56 -0700608 public boolean onPrepareOptionsMenu(Menu menu) {
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800609 // Get the TOGGLE DATA menu item in the right state.
610 MenuItem item = menu.findItem(MENU_ITEM_TOGGLE_DATA);
611 int state = mTelephonyManager.getDataState();
612 boolean visible = true;
613
614 switch (state) {
615 case TelephonyManager.DATA_CONNECTED:
616 case TelephonyManager.DATA_SUSPENDED:
Nathan Harold2b77d742016-03-19 13:22:10 -0700617 item.setTitle(R.string.radio_info_data_connection_disable);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800618 break;
619 case TelephonyManager.DATA_DISCONNECTED:
Nathan Harold2b77d742016-03-19 13:22:10 -0700620 item.setTitle(R.string.radio_info_data_connection_enable);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800621 break;
622 default:
623 visible = false;
624 break;
625 }
626 item.setVisible(visible);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800627 return true;
628 }
629
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800630 private void updateDnsCheckState() {
Nathan Haroldcea413a2015-11-23 15:48:10 -0800631 //FIXME: Replace with a TelephonyManager call
Mike Lockwood5304c7e2009-04-05 11:37:45 -0700632 dnsCheckState.setText(phone.isDnsCheckDisabled() ?
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800633 "0.0.0.0 allowed" :"0.0.0.0 not allowed");
634 }
Wink Savillee2a14e32009-05-29 14:06:30 -0700635
Nathan Haroldf10ea322018-04-24 13:31:07 -0700636 private void updateBandwidths(int dlbw, int ulbw) {
637 dlbw = (dlbw < 0 || dlbw == Integer.MAX_VALUE) ? -1 : dlbw;
638 ulbw = (ulbw < 0 || ulbw == Integer.MAX_VALUE) ? -1 : ulbw;
639 mDownlinkKbps.setText(String.format("%-5d", dlbw));
640 mUplinkKbps.setText(String.format("%-5d", ulbw));
641 }
642
643
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800644 private final void
Nathan Harold2b77d742016-03-19 13:22:10 -0700645 updateSignalStrength(SignalStrength signalStrength) {
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800646 Resources r = getResources();
647
Nathan Harold2b77d742016-03-19 13:22:10 -0700648 int signalDbm = signalStrength.getDbm();
Wink Savillee2a14e32009-05-29 14:06:30 -0700649
Nathan Harold2b77d742016-03-19 13:22:10 -0700650 int signalAsu = signalStrength.getAsuLevel();
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800651
652 if (-1 == signalAsu) signalAsu = 0;
653
654 dBm.setText(String.valueOf(signalDbm) + " "
655 + r.getString(R.string.radioInfo_display_dbm) + " "
656 + String.valueOf(signalAsu) + " "
657 + r.getString(R.string.radioInfo_display_asu));
658 }
659
660 private final void updateLocation(CellLocation location) {
jsh534f5ae2009-09-24 09:19:22 -0700661 Resources r = getResources();
Wink Savillec3886682009-04-02 11:00:56 -0700662 if (location instanceof GsmCellLocation) {
663 GsmCellLocation loc = (GsmCellLocation)location;
jsh534f5ae2009-09-24 09:19:22 -0700664 int lac = loc.getLac();
665 int cid = loc.getCid();
666 mLocation.setText(r.getString(R.string.radioInfo_lac) + " = "
667 + ((lac == -1) ? "unknown" : Integer.toHexString(lac))
668 + " "
669 + r.getString(R.string.radioInfo_cid) + " = "
670 + ((cid == -1) ? "unknown" : Integer.toHexString(cid)));
671 } else if (location instanceof CdmaCellLocation) {
672 CdmaCellLocation loc = (CdmaCellLocation)location;
673 int bid = loc.getBaseStationId();
674 int sid = loc.getSystemId();
675 int nid = loc.getNetworkId();
676 int lat = loc.getBaseStationLatitude();
677 int lon = loc.getBaseStationLongitude();
678 mLocation.setText("BID = "
679 + ((bid == -1) ? "unknown" : Integer.toHexString(bid))
680 + " "
681 + "SID = "
682 + ((sid == -1) ? "unknown" : Integer.toHexString(sid))
683 + " "
684 + "NID = "
685 + ((nid == -1) ? "unknown" : Integer.toHexString(nid))
686 + "\n"
687 + "LAT = "
688 + ((lat == -1) ? "unknown" : Integer.toHexString(lat))
689 + " "
690 + "LONG = "
691 + ((lon == -1) ? "unknown" : Integer.toHexString(lon)));
692 } else {
693 mLocation.setText("unknown");
Wink Savillec3886682009-04-02 11:00:56 -0700694 }
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800695
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800696
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800697 }
698
Nathan Haroldcea413a2015-11-23 15:48:10 -0800699 private final String getCellInfoDisplayString(int i) {
700 return (i != Integer.MAX_VALUE) ? Integer.toString(i) : "";
701 }
702
703 private final String getCellInfoDisplayString(long i) {
704 return (i != Long.MAX_VALUE) ? Long.toString(i) : "";
705 }
706
Nathan Harold6e16fdf2018-04-17 17:01:32 -0700707 private final String getConnectionStatusString(CellInfo ci) {
708 String regStr = "";
709 String connStatStr = "";
710 String connector = "";
711
712 if (ci.isRegistered()) {
713 regStr = "R";
714 }
715 switch (ci.getCellConnectionStatus()) {
716 case CellInfo.CONNECTION_PRIMARY_SERVING: connStatStr = "P"; break;
717 case CellInfo.CONNECTION_SECONDARY_SERVING: connStatStr = "S"; break;
718 case CellInfo.CONNECTION_NONE: connStatStr = "N"; break;
719 case CellInfo.CONNECTION_UNKNOWN: /* Field is unsupported */ break;
720 default: break;
721 }
722 if (!TextUtils.isEmpty(regStr) && !TextUtils.isEmpty(connStatStr)) {
723 connector = "+";
724 }
725
726 return regStr + connector + connStatStr;
727 }
728
Nathan Haroldcea413a2015-11-23 15:48:10 -0800729 private final String buildCdmaInfoString(CellInfoCdma ci) {
730 CellIdentityCdma cidCdma = ci.getCellIdentity();
731 CellSignalStrengthCdma ssCdma = ci.getCellSignalStrength();
732
733 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 -0700734 getConnectionStatusString(ci),
Nathan Haroldcea413a2015-11-23 15:48:10 -0800735 getCellInfoDisplayString(cidCdma.getSystemId()),
736 getCellInfoDisplayString(cidCdma.getNetworkId()),
737 getCellInfoDisplayString(cidCdma.getBasestationId()),
738 getCellInfoDisplayString(ssCdma.getCdmaDbm()),
739 getCellInfoDisplayString(ssCdma.getCdmaEcio()),
740 getCellInfoDisplayString(ssCdma.getEvdoDbm()),
741 getCellInfoDisplayString(ssCdma.getEvdoEcio()),
742 getCellInfoDisplayString(ssCdma.getEvdoSnr()));
743 }
744
745 private final String buildGsmInfoString(CellInfoGsm ci) {
746 CellIdentityGsm cidGsm = ci.getCellIdentity();
747 CellSignalStrengthGsm ssGsm = ci.getCellSignalStrength();
748
Nathan Harold2b77d742016-03-19 13:22:10 -0700749 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 -0700750 getConnectionStatusString(ci),
Nathan Haroldcea413a2015-11-23 15:48:10 -0800751 getCellInfoDisplayString(cidGsm.getMcc()),
752 getCellInfoDisplayString(cidGsm.getMnc()),
753 getCellInfoDisplayString(cidGsm.getLac()),
754 getCellInfoDisplayString(cidGsm.getCid()),
Nathan Harold2b77d742016-03-19 13:22:10 -0700755 getCellInfoDisplayString(cidGsm.getArfcn()),
756 getCellInfoDisplayString(cidGsm.getBsic()),
Nathan Haroldcea413a2015-11-23 15:48:10 -0800757 getCellInfoDisplayString(ssGsm.getDbm()));
758 }
759
760 private final String buildLteInfoString(CellInfoLte ci) {
761 CellIdentityLte cidLte = ci.getCellIdentity();
762 CellSignalStrengthLte ssLte = ci.getCellSignalStrength();
763
764 return String.format(
Nathan Harold6e16fdf2018-04-17 17:01:32 -0700765 "%-3.3s %-3.3s %-3.3s %-5.5s %-5.5s %-3.3s %-6.6s %-2.2s %-4.4s %-4.4s %-2.2s\n",
766 getConnectionStatusString(ci),
Nathan Haroldcea413a2015-11-23 15:48:10 -0800767 getCellInfoDisplayString(cidLte.getMcc()),
768 getCellInfoDisplayString(cidLte.getMnc()),
769 getCellInfoDisplayString(cidLte.getTac()),
770 getCellInfoDisplayString(cidLte.getCi()),
771 getCellInfoDisplayString(cidLte.getPci()),
Nathan Harold2b77d742016-03-19 13:22:10 -0700772 getCellInfoDisplayString(cidLte.getEarfcn()),
Nathan Harold6e16fdf2018-04-17 17:01:32 -0700773 getCellInfoDisplayString(cidLte.getBandwidth()),
Nathan Haroldcea413a2015-11-23 15:48:10 -0800774 getCellInfoDisplayString(ssLte.getDbm()),
775 getCellInfoDisplayString(ssLte.getRsrq()),
776 getCellInfoDisplayString(ssLte.getTimingAdvance()));
777 }
778
779 private final String buildWcdmaInfoString(CellInfoWcdma ci) {
780 CellIdentityWcdma cidWcdma = ci.getCellIdentity();
781 CellSignalStrengthWcdma ssWcdma = ci.getCellSignalStrength();
782
Nathan Harold2b77d742016-03-19 13:22:10 -0700783 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 -0700784 getConnectionStatusString(ci),
Nathan Haroldcea413a2015-11-23 15:48:10 -0800785 getCellInfoDisplayString(cidWcdma.getMcc()),
786 getCellInfoDisplayString(cidWcdma.getMnc()),
787 getCellInfoDisplayString(cidWcdma.getLac()),
788 getCellInfoDisplayString(cidWcdma.getCid()),
Nathan Harold2b77d742016-03-19 13:22:10 -0700789 getCellInfoDisplayString(cidWcdma.getUarfcn()),
Nathan Haroldcea413a2015-11-23 15:48:10 -0800790 getCellInfoDisplayString(cidWcdma.getPsc()),
791 getCellInfoDisplayString(ssWcdma.getDbm()));
792 }
793
794 private final String buildCellInfoString(List<CellInfo> arrayCi) {
795 String value = new String();
796 StringBuilder cdmaCells = new StringBuilder(),
797 gsmCells = new StringBuilder(),
798 lteCells = new StringBuilder(),
799 wcdmaCells = new StringBuilder();
800
801 if (arrayCi != null) {
802 for (CellInfo ci : arrayCi) {
803
804 if (ci instanceof CellInfoLte) {
805 lteCells.append(buildLteInfoString((CellInfoLte) ci));
806 } else if (ci instanceof CellInfoWcdma) {
807 wcdmaCells.append(buildWcdmaInfoString((CellInfoWcdma) ci));
808 } else if (ci instanceof CellInfoGsm) {
809 gsmCells.append(buildGsmInfoString((CellInfoGsm) ci));
810 } else if (ci instanceof CellInfoCdma) {
811 cdmaCells.append(buildCdmaInfoString((CellInfoCdma) ci));
Wink Saville79bff2a2012-06-01 14:37:21 -0700812 }
813 }
Nathan Haroldcea413a2015-11-23 15:48:10 -0800814 if (lteCells.length() != 0) {
815 value += String.format(
Nathan Harold6e16fdf2018-04-17 17:01:32 -0700816 "LTE\n%-3.3s %-3.3s %-3.3s %-5.5s %-5.5s %-3.3s"
817 + " %-6.6s %-2.2s %-4.4s %-4.4s %-2.2s\n",
818 "SRV", "MCC", "MNC", "TAC", "CID", "PCI",
819 "EARFCN", "BW", "RSRP", "RSRQ", "TA");
Nathan Haroldcea413a2015-11-23 15:48:10 -0800820 value += lteCells.toString();
821 }
822 if (wcdmaCells.length() != 0) {
Nathan Harold6e16fdf2018-04-17 17:01:32 -0700823 value += String.format(
824 "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 -0700825 "SRV", "MCC", "MNC", "LAC", "CID", "UARFCN", "PSC", "RSCP");
Nathan Haroldcea413a2015-11-23 15:48:10 -0800826 value += wcdmaCells.toString();
827 }
828 if (gsmCells.length() != 0) {
Nathan Harold6e16fdf2018-04-17 17:01:32 -0700829 value += String.format(
830 "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 -0700831 "SRV", "MCC", "MNC", "LAC", "CID", "ARFCN", "BSIC", "RSSI");
Nathan Haroldcea413a2015-11-23 15:48:10 -0800832 value += gsmCells.toString();
833 }
834 if (cdmaCells.length() != 0) {
835 value += String.format(
836 "CDMA/EVDO\n%-3.3s %-5.5s %-5.5s %-5.5s %-6.6s %-6.6s %-6.6s %-6.6s %-5.5s\n",
837 "SRV", "SID", "NID", "BSID", "C-RSSI", "C-ECIO", "E-RSSI", "E-ECIO", "E-SNR");
838 value += cdmaCells.toString();
839 }
840 } else {
841 value ="unknown";
Wink Saville79bff2a2012-06-01 14:37:21 -0700842 }
Nathan Haroldcea413a2015-11-23 15:48:10 -0800843
844 return value.toString();
845 }
846
847 private final void updateCellInfo(List<CellInfo> arrayCi) {
848 mCellInfo.setText(buildCellInfoString(arrayCi));
Wink Saville79bff2a2012-06-01 14:37:21 -0700849 }
850
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800851 private final void
852 updateMessageWaiting() {
853 mMwi.setText(String.valueOf(mMwiValue));
854 }
855
856 private final void
857 updateCallRedirect() {
858 mCfi.setText(String.valueOf(mCfiValue));
859 }
860
861
862 private final void
Nathan Harold2b77d742016-03-19 13:22:10 -0700863 updateServiceState(ServiceState serviceState) {
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800864 int state = serviceState.getState();
865 Resources r = getResources();
866 String display = r.getString(R.string.radioInfo_unknown);
johnwang342101a2009-09-23 16:22:34 -0700867
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800868 switch (state) {
869 case ServiceState.STATE_IN_SERVICE:
870 display = r.getString(R.string.radioInfo_service_in);
871 break;
872 case ServiceState.STATE_OUT_OF_SERVICE:
873 case ServiceState.STATE_EMERGENCY_ONLY:
874 display = r.getString(R.string.radioInfo_service_emergency);
875 break;
876 case ServiceState.STATE_POWER_OFF:
877 display = r.getString(R.string.radioInfo_service_off);
878 break;
879 }
johnwang342101a2009-09-23 16:22:34 -0700880
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800881 gsmState.setText(display);
johnwang342101a2009-09-23 16:22:34 -0700882
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800883 if (serviceState.getRoaming()) {
884 roamingState.setText(R.string.radioInfo_roaming_in);
885 } else {
886 roamingState.setText(R.string.radioInfo_roaming_not);
887 }
888
889 operatorName.setText(serviceState.getOperatorAlphaLong());
890 }
891
892 private final void
Nathan Harold2b77d742016-03-19 13:22:10 -0700893 updatePhoneState(int state) {
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800894 Resources r = getResources();
895 String display = r.getString(R.string.radioInfo_unknown);
896
897 switch (state) {
Nathan Harold2b77d742016-03-19 13:22:10 -0700898 case TelephonyManager.CALL_STATE_IDLE:
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800899 display = r.getString(R.string.radioInfo_phone_idle);
900 break;
Nathan Harold2b77d742016-03-19 13:22:10 -0700901 case TelephonyManager.CALL_STATE_RINGING:
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800902 display = r.getString(R.string.radioInfo_phone_ringing);
903 break;
Nathan Harold2b77d742016-03-19 13:22:10 -0700904 case TelephonyManager.CALL_STATE_OFFHOOK:
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800905 display = r.getString(R.string.radioInfo_phone_offhook);
906 break;
907 }
908
909 callState.setText(display);
910 }
911
912 private final void
913 updateDataState() {
914 int state = mTelephonyManager.getDataState();
915 Resources r = getResources();
916 String display = r.getString(R.string.radioInfo_unknown);
917
918 switch (state) {
919 case TelephonyManager.DATA_CONNECTED:
920 display = r.getString(R.string.radioInfo_data_connected);
921 break;
922 case TelephonyManager.DATA_CONNECTING:
923 display = r.getString(R.string.radioInfo_data_connecting);
924 break;
925 case TelephonyManager.DATA_DISCONNECTED:
926 display = r.getString(R.string.radioInfo_data_disconnected);
927 break;
928 case TelephonyManager.DATA_SUSPENDED:
929 display = r.getString(R.string.radioInfo_data_suspended);
930 break;
931 }
johnwang342101a2009-09-23 16:22:34 -0700932
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800933 gprsState.setText(display);
934 }
935
936 private final void updateNetworkType() {
Nathan Harolde272c202016-10-27 13:45:00 -0700937 if(phone != null) {
Nathan Harold2b77d742016-03-19 13:22:10 -0700938 ServiceState ss = phone.getServiceState();
939 dataNetwork.setText(ServiceState.rilRadioTechnologyToString(
940 phone.getServiceState().getRilDataRadioTechnology()));
941 voiceNetwork.setText(ServiceState.rilRadioTechnologyToString(
942 phone.getServiceState().getRilVoiceRadioTechnology()));
943 }
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800944 }
945
946 private final void
947 updateProperties() {
948 String s;
949 Resources r = getResources();
950
951 s = phone.getDeviceId();
johnwang342101a2009-09-23 16:22:34 -0700952 if (s == null) s = r.getString(R.string.radioInfo_unknown);
Wink Savillec3886682009-04-02 11:00:56 -0700953 mDeviceId.setText(s);
johnwang342101a2009-09-23 16:22:34 -0700954
Meng Wang9053f172017-06-23 16:02:14 -0700955 s = phone.getSubscriberId();
956 if (s == null) s = r.getString(R.string.radioInfo_unknown);
957 mSubscriberId.setText(s);
958
Nathan Haroldcea413a2015-11-23 15:48:10 -0800959 //FIXME: Replace with a TelephonyManager call
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800960 s = phone.getLine1Number();
johnwang342101a2009-09-23 16:22:34 -0700961 if (s == null) s = r.getString(R.string.radioInfo_unknown);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800962 number.setText(s);
963 }
964
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800965 private final void updateDataStats2() {
966 Resources r = getResources();
967
Jeff Sharkey93029862011-05-27 18:26:15 -0700968 long txPackets = TrafficStats.getMobileTxPackets();
969 long rxPackets = TrafficStats.getMobileRxPackets();
970 long txBytes = TrafficStats.getMobileTxBytes();
971 long rxBytes = TrafficStats.getMobileRxBytes();
johnwang342101a2009-09-23 16:22:34 -0700972
Jeff Sharkey93029862011-05-27 18:26:15 -0700973 String packets = r.getString(R.string.radioInfo_display_packets);
974 String bytes = r.getString(R.string.radioInfo_display_bytes);
johnwang342101a2009-09-23 16:22:34 -0700975
Jeff Sharkey93029862011-05-27 18:26:15 -0700976 sent.setText(txPackets + " " + packets + ", " + txBytes + " " + bytes);
977 received.setText(rxPackets + " " + packets + ", " + rxBytes + " " + bytes);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800978 }
979
980 /**
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800981 * Ping a host name
982 */
983 private final void pingHostname() {
984 try {
Nathan Haroldcea413a2015-11-23 15:48:10 -0800985 try {
986 Process p4 = Runtime.getRuntime().exec("ping -c 1 www.google.com");
987 int status4 = p4.waitFor();
988 if (status4 == 0) {
989 mPingHostnameResultV4 = "Pass";
990 } else {
991 mPingHostnameResultV4 = String.format("Fail(%d)", status4);
992 }
993 } catch (IOException e) {
994 mPingHostnameResultV4 = "Fail: IOException";
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800995 }
Nathan Haroldcea413a2015-11-23 15:48:10 -0800996 try {
997 Process p6 = Runtime.getRuntime().exec("ping6 -c 1 www.google.com");
998 int status6 = p6.waitFor();
999 if (status6 == 0) {
1000 mPingHostnameResultV6 = "Pass";
1001 } else {
1002 mPingHostnameResultV6 = String.format("Fail(%d)", status6);
1003 }
1004 } catch (IOException e) {
1005 mPingHostnameResultV6 = "Fail: IOException";
1006 }
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001007 } catch (InterruptedException e) {
Nathan Haroldcea413a2015-11-23 15:48:10 -08001008 mPingHostnameResultV4 = mPingHostnameResultV6 = "Fail: InterruptedException";
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001009 }
1010 }
1011
1012 /**
1013 * This function checks for basic functionality of HTTP Client.
1014 */
1015 private void httpClientTest() {
Narayan Kamathf25627c2014-12-12 13:53:28 +00001016 HttpURLConnection urlConnection = null;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001017 try {
Narayan Kamathf25627c2014-12-12 13:53:28 +00001018 // TODO: Hardcoded for now, make it UI configurable
Alex Klyubinb0090232015-04-02 11:08:51 -07001019 URL url = new URL("https://www.google.com");
Narayan Kamathf25627c2014-12-12 13:53:28 +00001020 urlConnection = (HttpURLConnection) url.openConnection();
1021 if (urlConnection.getResponseCode() == 200) {
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001022 mHttpClientTestResult = "Pass";
1023 } else {
Narayan Kamathf25627c2014-12-12 13:53:28 +00001024 mHttpClientTestResult = "Fail: Code: " + urlConnection.getResponseMessage();
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001025 }
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001026 } catch (IOException e) {
1027 mHttpClientTestResult = "Fail: IOException";
Narayan Kamathf25627c2014-12-12 13:53:28 +00001028 } finally {
1029 if (urlConnection != null) {
1030 urlConnection.disconnect();
1031 }
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001032 }
1033 }
1034
1035 private void refreshSmsc() {
Nathan Haroldcea413a2015-11-23 15:48:10 -08001036 //FIXME: Replace with a TelephonyManager call
jsh21dd4072009-05-12 11:26:55 -07001037 phone.getSmscAddress(mHandler.obtainMessage(EVENT_QUERY_SMSC_DONE));
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001038 }
1039
Nathan Haroldcea413a2015-11-23 15:48:10 -08001040 private final void updateAllCellInfo() {
1041
1042 mCellInfo.setText("");
Nathan Haroldcea413a2015-11-23 15:48:10 -08001043 mLocation.setText("");
1044
1045 final Runnable updateAllCellInfoResults = new Runnable() {
1046 public void run() {
Nathan Haroldcea413a2015-11-23 15:48:10 -08001047 updateLocation(mCellLocationResult);
1048 updateCellInfo(mCellInfoResult);
1049 }
1050 };
1051
1052 Thread locThread = new Thread() {
1053 @Override
1054 public void run() {
1055 mCellInfoResult = mTelephonyManager.getAllCellInfo();
1056 mCellLocationResult = mTelephonyManager.getCellLocation();
Nathan Haroldcea413a2015-11-23 15:48:10 -08001057
1058 mHandler.post(updateAllCellInfoResults);
1059 }
1060 };
1061 locThread.start();
1062 }
1063
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001064 private final void updatePingState() {
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001065 // Set all to unknown since the threads will take a few secs to update.
Nathan Haroldcea413a2015-11-23 15:48:10 -08001066 mPingHostnameResultV4 = getResources().getString(R.string.radioInfo_unknown);
1067 mPingHostnameResultV6 = getResources().getString(R.string.radioInfo_unknown);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001068 mHttpClientTestResult = getResources().getString(R.string.radioInfo_unknown);
1069
Nathan Haroldcea413a2015-11-23 15:48:10 -08001070 mPingHostnameV4.setText(mPingHostnameResultV4);
1071 mPingHostnameV6.setText(mPingHostnameResultV6);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001072 mHttpClientTest.setText(mHttpClientTestResult);
1073
1074 final Runnable updatePingResults = new Runnable() {
1075 public void run() {
Nathan Haroldcea413a2015-11-23 15:48:10 -08001076 mPingHostnameV4.setText(mPingHostnameResultV4);
1077 mPingHostnameV6.setText(mPingHostnameResultV6);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001078 mHttpClientTest.setText(mHttpClientTestResult);
1079 }
1080 };
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001081
1082 Thread hostname = new Thread() {
1083 @Override
1084 public void run() {
1085 pingHostname();
Nathan Haroldcea413a2015-11-23 15:48:10 -08001086 mHandler.post(updatePingResults);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001087 }
1088 };
1089 hostname.start();
1090
1091 Thread httpClient = new Thread() {
1092 @Override
1093 public void run() {
1094 httpClientTest();
Nathan Haroldcea413a2015-11-23 15:48:10 -08001095 mHandler.post(updatePingResults);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001096 }
1097 };
1098 httpClient.start();
1099 }
1100
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001101 private MenuItem.OnMenuItemClickListener mViewADNCallback = new MenuItem.OnMenuItemClickListener() {
1102 public boolean onMenuItemClick(MenuItem item) {
1103 Intent intent = new Intent(Intent.ACTION_VIEW);
1104 // XXX We need to specify the component here because if we don't
1105 // the activity manager will try to resolve the type by calling
1106 // the content provider, which causes it to be loaded in a process
1107 // other than the Dialer process, which causes a lot of stuff to
1108 // break.
1109 intent.setClassName("com.android.phone",
1110 "com.android.phone.SimContacts");
1111 startActivity(intent);
1112 return true;
1113 }
1114 };
1115
1116 private MenuItem.OnMenuItemClickListener mViewFDNCallback = new MenuItem.OnMenuItemClickListener() {
1117 public boolean onMenuItemClick(MenuItem item) {
1118 Intent intent = new Intent(Intent.ACTION_VIEW);
1119 // XXX We need to specify the component here because if we don't
1120 // the activity manager will try to resolve the type by calling
1121 // the content provider, which causes it to be loaded in a process
1122 // other than the Dialer process, which causes a lot of stuff to
1123 // break.
1124 intent.setClassName("com.android.phone",
Andrew Leeda90d682014-10-31 13:12:20 -07001125 "com.android.phone.settings.fdn.FdnList");
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001126 startActivity(intent);
1127 return true;
1128 }
1129 };
1130
1131 private MenuItem.OnMenuItemClickListener mViewSDNCallback = new MenuItem.OnMenuItemClickListener() {
1132 public boolean onMenuItemClick(MenuItem item) {
1133 Intent intent = new Intent(
Wink Savillec3886682009-04-02 11:00:56 -07001134 Intent.ACTION_VIEW, Uri.parse("content://icc/sdn"));
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001135 // XXX We need to specify the component here because if we don't
1136 // the activity manager will try to resolve the type by calling
1137 // the content provider, which causes it to be loaded in a process
1138 // other than the Dialer process, which causes a lot of stuff to
1139 // break.
1140 intent.setClassName("com.android.phone",
1141 "com.android.phone.ADNList");
1142 startActivity(intent);
1143 return true;
1144 }
1145 };
1146
Nathan Harolde272c202016-10-27 13:45:00 -07001147 private MenuItem.OnMenuItemClickListener mGetImsStatus = new MenuItem.OnMenuItemClickListener() {
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001148 public boolean onMenuItemClick(MenuItem item) {
Nathan Harolde272c202016-10-27 13:45:00 -07001149 boolean isImsRegistered = phone.isImsRegistered();
1150 boolean availableVolte = phone.isVolteEnabled();
1151 boolean availableWfc = phone.isWifiCallingEnabled();
1152 boolean availableVt = phone.isVideoEnabled();
1153 boolean availableUt = phone.isUtEnabled();
1154
1155 final String imsRegString = isImsRegistered ?
1156 getString(R.string.radio_info_ims_reg_status_registered) :
1157 getString(R.string.radio_info_ims_reg_status_not_registered);
1158
1159 final String available = getString(R.string.radio_info_ims_feature_status_available);
1160 final String unavailable = getString(
1161 R.string.radio_info_ims_feature_status_unavailable);
1162
1163 String imsStatus = getString(R.string.radio_info_ims_reg_status,
1164 imsRegString,
1165 availableVolte ? available : unavailable,
1166 availableWfc ? available : unavailable,
1167 availableVt ? available : unavailable,
1168 availableUt ? available : unavailable);
1169
1170 AlertDialog imsDialog = new AlertDialog.Builder(RadioInfo.this)
1171 .setMessage(imsStatus)
1172 .setTitle(getString(R.string.radio_info_ims_reg_status_title))
1173 .create();
1174
1175 imsDialog.show();
1176
Tammo Spalinka5f4c8f2009-10-15 20:08:58 +08001177 return true;
1178 }
1179 };
1180
1181 private MenuItem.OnMenuItemClickListener mSelectBandCallback = new MenuItem.OnMenuItemClickListener() {
1182 public boolean onMenuItemClick(MenuItem item) {
1183 Intent intent = new Intent();
1184 intent.setClass(RadioInfo.this, BandMode.class);
1185 startActivity(intent);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001186 return true;
1187 }
1188 };
johnwang342101a2009-09-23 16:22:34 -07001189
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001190 private MenuItem.OnMenuItemClickListener mToggleData = new MenuItem.OnMenuItemClickListener() {
1191 public boolean onMenuItemClick(MenuItem item) {
1192 int state = mTelephonyManager.getDataState();
1193 switch (state) {
1194 case TelephonyManager.DATA_CONNECTED:
Nathan Haroldcea413a2015-11-23 15:48:10 -08001195 //FIXME: Replace with a TelephonyManager call
Malcolm Chenf612f592017-11-29 18:01:25 -08001196 phone.setUserDataEnabled(false);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001197 break;
1198 case TelephonyManager.DATA_DISCONNECTED:
Nathan Haroldcea413a2015-11-23 15:48:10 -08001199 //FIXME: Replace with a TelephonyManager call
Malcolm Chenf612f592017-11-29 18:01:25 -08001200 phone.setUserDataEnabled(true);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001201 break;
1202 default:
1203 // do nothing
1204 break;
1205 }
1206 return true;
1207 }
1208 };
1209
Nathan Harold2b77d742016-03-19 13:22:10 -07001210 private boolean isRadioOn() {
1211 //FIXME: Replace with a TelephonyManager call
1212 return phone.getServiceState().getState() != ServiceState.STATE_POWER_OFF;
1213 }
1214
1215 private void updateRadioPowerState() {
1216 //delightful hack to prevent on-checked-changed calls from
1217 //actually forcing the radio preference to its transient/current value.
1218 radioPowerOnSwitch.setOnCheckedChangeListener(null);
1219 radioPowerOnSwitch.setChecked(isRadioOn());
1220 radioPowerOnSwitch.setOnCheckedChangeListener(mRadioPowerOnChangeListener);
1221 }
1222
Nathan Harolde272c202016-10-27 13:45:00 -07001223 void setImsVolteProvisionedState(boolean state) {
Nathan Harold12e1f552016-06-17 13:55:38 -07001224 Log.d(TAG, "setImsVolteProvisioned state: " + ((state)? "on":"off"));
Nathan Harolde272c202016-10-27 13:45:00 -07001225 setImsConfigProvisionedState(IMS_VOLTE_PROVISIONED_CONFIG_ID, state);
Nathan Harold12e1f552016-06-17 13:55:38 -07001226 }
1227
Nathan Harolde272c202016-10-27 13:45:00 -07001228 void setImsVtProvisionedState(boolean state) {
Nathan Harold12e1f552016-06-17 13:55:38 -07001229 Log.d(TAG, "setImsVtProvisioned() state: " + ((state)? "on":"off"));
Nathan Harolde272c202016-10-27 13:45:00 -07001230 setImsConfigProvisionedState(IMS_VT_PROVISIONED_CONFIG_ID, state);
Nathan Harold12e1f552016-06-17 13:55:38 -07001231 }
1232
Nathan Harolde272c202016-10-27 13:45:00 -07001233 void setImsWfcProvisionedState(boolean state) {
Nathan Harold12e1f552016-06-17 13:55:38 -07001234 Log.d(TAG, "setImsWfcProvisioned() state: " + ((state)? "on":"off"));
Nathan Harolde272c202016-10-27 13:45:00 -07001235 setImsConfigProvisionedState(IMS_WFC_PROVISIONED_CONFIG_ID, state);
Nathan Harold12e1f552016-06-17 13:55:38 -07001236 }
1237
Meng Wang586741c2017-04-26 15:02:51 -07001238 void setEabProvisionedState(boolean state) {
1239 Log.d(TAG, "setEabProvisioned() state: " + ((state)? "on":"off"));
1240 setImsConfigProvisionedState(EAB_PROVISIONED_CONFIG_ID, state);
1241 }
1242
Nathan Harolde272c202016-10-27 13:45:00 -07001243 void setImsConfigProvisionedState(int configItem, boolean state) {
Nathan Harold12e1f552016-06-17 13:55:38 -07001244 if (phone != null && mImsManager != null) {
Philip P. Moltmann5c449ae2017-02-14 12:43:02 -08001245 QueuedWork.queue(new Runnable() {
Nathan Harold12e1f552016-06-17 13:55:38 -07001246 public void run() {
1247 try {
1248 mImsManager.getConfigInterface().setProvisionedValue(
1249 configItem,
1250 state? 1 : 0);
1251 } catch (ImsException e) {
1252 Log.e(TAG, "setImsConfigProvisioned() exception:", e);
1253 }
1254 }
Philip P. Moltmann5c449ae2017-02-14 12:43:02 -08001255 }, false);
Nathan Harold12e1f552016-06-17 13:55:38 -07001256 }
1257 }
1258
Nathan Harold2b77d742016-03-19 13:22:10 -07001259 OnCheckedChangeListener mRadioPowerOnChangeListener = new OnCheckedChangeListener() {
1260 @Override
1261 public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
1262 log("toggle radio power: currently " + (isRadioOn()?"on":"off"));
1263 phone.setRadioPower(isChecked);
1264 }
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001265 };
1266
Nathan Harold12e1f552016-06-17 13:55:38 -07001267 private boolean isImsVolteProvisioned() {
Nathan Harold2b77d742016-03-19 13:22:10 -07001268 if (phone != null && mImsManager != null) {
1269 return mImsManager.isVolteEnabledByPlatform(phone.getContext())
1270 && mImsManager.isVolteProvisionedOnDevice(phone.getContext());
Pavel Zhamaitsiakcb267a62015-01-21 18:25:14 -08001271 }
1272 return false;
1273 }
1274
Nathan Harold12e1f552016-06-17 13:55:38 -07001275 OnCheckedChangeListener mImsVolteCheckedChangeListener = new OnCheckedChangeListener() {
Wink Saville426fc662011-09-25 14:39:02 -07001276 @Override
Nathan Harold2b77d742016-03-19 13:22:10 -07001277 public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
Nathan Harold12e1f552016-06-17 13:55:38 -07001278 setImsVolteProvisionedState(isChecked);
Nathan Harolde272c202016-10-27 13:45:00 -07001279 }
Wink Saville426fc662011-09-25 14:39:02 -07001280 };
1281
Nathan Harold12e1f552016-06-17 13:55:38 -07001282 private boolean isImsVtProvisioned() {
1283 if (phone != null && mImsManager != null) {
1284 return mImsManager.isVtEnabledByPlatform(phone.getContext())
1285 && mImsManager.isVtProvisionedOnDevice(phone.getContext());
1286 }
1287 return false;
1288 }
1289
1290 OnCheckedChangeListener mImsVtCheckedChangeListener = new OnCheckedChangeListener() {
1291 @Override
1292 public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
1293 setImsVtProvisionedState(isChecked);
Nathan Harolde272c202016-10-27 13:45:00 -07001294 }
Nathan Harold12e1f552016-06-17 13:55:38 -07001295 };
1296
1297 private boolean isImsWfcProvisioned() {
1298 if (phone != null && mImsManager != null) {
1299 return mImsManager.isWfcEnabledByPlatform(phone.getContext())
1300 && mImsManager.isWfcProvisionedOnDevice(phone.getContext());
1301 }
1302 return false;
1303 }
1304
1305 OnCheckedChangeListener mImsWfcCheckedChangeListener = new OnCheckedChangeListener() {
1306 @Override
1307 public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
1308 setImsWfcProvisionedState(isChecked);
Nathan Harolde272c202016-10-27 13:45:00 -07001309 }
Nathan Harold12e1f552016-06-17 13:55:38 -07001310 };
1311
Meng Wang586741c2017-04-26 15:02:51 -07001312 private boolean isEabProvisioned() {
1313 return isFeatureProvisioned(EAB_PROVISIONED_CONFIG_ID, false);
1314 }
1315
1316 OnCheckedChangeListener mEabCheckedChangeListener = new OnCheckedChangeListener() {
1317 @Override
1318 public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
1319 setEabProvisionedState(isChecked);
1320 }
1321 };
1322
1323 private boolean isFeatureProvisioned(int featureId, boolean defaultValue) {
1324 boolean provisioned = defaultValue;
1325 if (mImsManager != null) {
1326 try {
1327 ImsConfig imsConfig = mImsManager.getConfigInterface();
1328 if (imsConfig != null) {
1329 provisioned =
1330 (imsConfig.getProvisionedValue(featureId)
1331 == ImsConfig.FeatureValueConstants.ON);
1332 }
1333 } catch (ImsException ex) {
1334 Log.e(TAG, "isFeatureProvisioned() exception:", ex);
1335 }
1336 }
1337
1338 log("isFeatureProvisioned() featureId=" + featureId + " provisioned=" + provisioned);
1339 return provisioned;
1340 }
1341
1342 private static boolean isEabEnabledByPlatform(Context context) {
1343 if (context != null) {
1344 CarrierConfigManager configManager = (CarrierConfigManager)
1345 context.getSystemService(Context.CARRIER_CONFIG_SERVICE);
1346 if (configManager != null && configManager.getConfig().getBoolean(
1347 CarrierConfigManager.KEY_USE_RCS_PRESENCE_BOOL)) {
1348 return true;
1349 }
1350 }
1351 return false;
1352 }
1353
Nathan Harold12e1f552016-06-17 13:55:38 -07001354 private void updateImsProvisionedState() {
1355 log("updateImsProvisionedState isImsVolteProvisioned()=" + isImsVolteProvisioned());
Nathan Harold2b77d742016-03-19 13:22:10 -07001356 //delightful hack to prevent on-checked-changed calls from
1357 //actually forcing the ims provisioning to its transient/current value.
Nathan Harold12e1f552016-06-17 13:55:38 -07001358 imsVolteProvisionedSwitch.setOnCheckedChangeListener(null);
1359 imsVolteProvisionedSwitch.setChecked(isImsVolteProvisioned());
1360 imsVolteProvisionedSwitch.setOnCheckedChangeListener(mImsVolteCheckedChangeListener);
Nathan Harold6dc15e92016-10-28 11:45:59 -07001361 imsVolteProvisionedSwitch.setEnabled(
1362 mImsManager.isVolteEnabledByPlatform(phone.getContext()));
Nathan Harold12e1f552016-06-17 13:55:38 -07001363
1364 imsVtProvisionedSwitch.setOnCheckedChangeListener(null);
1365 imsVtProvisionedSwitch.setChecked(isImsVtProvisioned());
1366 imsVtProvisionedSwitch.setOnCheckedChangeListener(mImsVtCheckedChangeListener);
Nathan Harold6dc15e92016-10-28 11:45:59 -07001367 imsVtProvisionedSwitch.setEnabled(
1368 mImsManager.isVtEnabledByPlatform(phone.getContext()));
Nathan Harold12e1f552016-06-17 13:55:38 -07001369
1370 imsWfcProvisionedSwitch.setOnCheckedChangeListener(null);
1371 imsWfcProvisionedSwitch.setChecked(isImsWfcProvisioned());
1372 imsWfcProvisionedSwitch.setOnCheckedChangeListener(mImsWfcCheckedChangeListener);
Nathan Harold6dc15e92016-10-28 11:45:59 -07001373 imsWfcProvisionedSwitch.setEnabled(
1374 mImsManager.isWfcEnabledByPlatform(phone.getContext()));
Meng Wang586741c2017-04-26 15:02:51 -07001375
1376 eabProvisionedSwitch.setOnCheckedChangeListener(null);
1377 eabProvisionedSwitch.setChecked(isEabProvisioned());
1378 eabProvisionedSwitch.setOnCheckedChangeListener(mEabCheckedChangeListener);
1379 eabProvisionedSwitch.setEnabled(isEabEnabledByPlatform(phone.getContext()));
Wink Saville426fc662011-09-25 14:39:02 -07001380 }
1381
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001382 OnClickListener mDnsCheckButtonHandler = new OnClickListener() {
1383 public void onClick(View v) {
Nathan Haroldcea413a2015-11-23 15:48:10 -08001384 //FIXME: Replace with a TelephonyManager call
Wink Savillec3886682009-04-02 11:00:56 -07001385 phone.disableDnsCheck(!phone.isDnsCheckDisabled());
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001386 updateDnsCheckState();
1387 }
1388 };
johnwang342101a2009-09-23 16:22:34 -07001389
Tammo Spalinka5f4c8f2009-10-15 20:08:58 +08001390 OnClickListener mOemInfoButtonHandler = new OnClickListener() {
1391 public void onClick(View v) {
1392 Intent intent = new Intent("com.android.settings.OEM_RADIO_INFO");
1393 try {
1394 startActivity(intent);
1395 } catch (android.content.ActivityNotFoundException ex) {
Wink Savillebf471282013-04-05 15:04:05 -07001396 log("OEM-specific Info/Settings Activity Not Found : " + ex);
Tammo Spalinka5f4c8f2009-10-15 20:08:58 +08001397 // If the activity does not exist, there are no OEM
1398 // settings, and so we can just do nothing...
1399 }
1400 }
1401 };
1402
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001403 OnClickListener mPingButtonHandler = new OnClickListener() {
1404 public void onClick(View v) {
1405 updatePingState();
1406 }
1407 };
1408
1409 OnClickListener mUpdateSmscButtonHandler = new OnClickListener() {
1410 public void onClick(View v) {
1411 updateSmscButton.setEnabled(false);
jsh21dd4072009-05-12 11:26:55 -07001412 phone.setSmscAddress(smsc.getText().toString(),
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001413 mHandler.obtainMessage(EVENT_UPDATE_SMSC_DONE));
1414 }
1415 };
1416
1417 OnClickListener mRefreshSmscButtonHandler = new OnClickListener() {
1418 public void onClick(View v) {
1419 refreshSmsc();
1420 }
1421 };
1422
Youhan Wangfd781e92016-12-16 15:53:16 -08001423 OnClickListener mCarrierProvisioningButtonHandler = new OnClickListener() {
1424 public void onClick(View v) {
Meng Wanga04449b2017-08-03 14:34:35 -07001425 final Intent intent = new Intent("com.android.settings.CARRIER_PROVISIONING");
1426 final ComponentName serviceComponent = ComponentName.unflattenFromString(
1427 "com.android.omadm.service/.DMIntentReceiver");
Youhan Wangfd781e92016-12-16 15:53:16 -08001428 intent.setComponent(serviceComponent);
Meng Wanga04449b2017-08-03 14:34:35 -07001429 sendBroadcast(intent);
Youhan Wangfd781e92016-12-16 15:53:16 -08001430 }
1431 };
1432
1433 OnClickListener mTriggerCarrierProvisioningButtonHandler = new OnClickListener() {
1434 public void onClick(View v) {
Meng Wanga04449b2017-08-03 14:34:35 -07001435 final Intent intent = new Intent("com.android.settings.TRIGGER_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
Nathan Haroldcea413a2015-11-23 15:48:10 -08001443 AdapterView.OnItemSelectedListener mPreferredNetworkHandler =
1444 new AdapterView.OnItemSelectedListener() {
1445
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001446 public void onItemSelected(AdapterView parent, View v, int pos, long id) {
Nathan Haroldcea413a2015-11-23 15:48:10 -08001447 if (mPreferredNetworkTypeResult != pos && pos >= 0
1448 && pos <= mPreferredNetworkLabels.length - 2) {
1449 mPreferredNetworkTypeResult = pos;
Nathan Harolddaea8be2018-06-05 14:02:35 -07001450
1451 // TODO: Possibly migrate this to TelephonyManager.setPreferredNetworkType()
1452 // which today still has some issues (mostly that the "set" is conditional
1453 // on a successful modem call, which is not what we want). Instead we always
1454 // want this setting to be set, so that if the radio hiccups and this setting
1455 // is for some reason unsuccessful, future calls to the radio will reflect
1456 // the users's preference which is set here.
1457 final int subId = phone.getSubId();
1458 if (SubscriptionManager.isUsableSubIdValue(subId)) {
1459 Settings.Global.putInt(phone.getContext().getContentResolver(),
1460 PREFERRED_NETWORK_MODE + subId, mPreferredNetworkTypeResult);
1461 }
1462 log("Calling setPreferredNetworkType(" + mPreferredNetworkTypeResult + ")");
Nathan Haroldcea413a2015-11-23 15:48:10 -08001463 Message msg = mHandler.obtainMessage(EVENT_SET_PREFERRED_TYPE_DONE);
1464 phone.setPreferredNetworkType(mPreferredNetworkTypeResult, msg);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001465 }
1466 }
1467
1468 public void onNothingSelected(AdapterView parent) {
1469 }
1470 };
1471
Nathan Harold2b77d742016-03-19 13:22:10 -07001472 AdapterView.OnItemSelectedListener mCellInfoRefreshRateHandler =
1473 new AdapterView.OnItemSelectedListener() {
Wink Savillebf471282013-04-05 15:04:05 -07001474
Nathan Harold2b77d742016-03-19 13:22:10 -07001475 public void onItemSelected(AdapterView parent, View v, int pos, long id) {
1476 mCellInfoRefreshRateIndex = pos;
Sooraj Sasindran5cce06b2016-08-18 15:49:49 -07001477 mTelephonyManager.setCellInfoListRate(mCellInfoRefreshRates[pos]);
Nathan Harold2b77d742016-03-19 13:22:10 -07001478 updateAllCellInfo();
1479 }
1480
1481 public void onNothingSelected(AdapterView parent) {
1482 }
1483 };
1484
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001485}