blob: 880f3fee9b5959536da0ec6fc4e53af0fa425aba [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
19import android.app.Activity;
Nathan Harolde272c202016-10-27 13:45:00 -070020import android.app.AlertDialog;
21import android.app.Dialog;
Pavel Zhamaitsiakcb267a62015-01-21 18:25:14 -080022import android.app.QueuedWork;
Youhan Wangfd781e92016-12-16 15:53:16 -080023import android.content.ComponentName;
Meng Wang586741c2017-04-26 15:02:51 -070024import android.content.Context;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080025import android.content.Intent;
Tammo Spalinka5f4c8f2009-10-15 20:08:58 +080026import android.content.pm.PackageManager;
27import android.content.pm.ResolveInfo;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080028import android.content.res.Resources;
Nathan Haroldcea413a2015-11-23 15:48:10 -080029import android.graphics.Typeface;
Jeff Sharkey93029862011-05-27 18:26:15 -070030import android.net.TrafficStats;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080031import android.net.Uri;
32import android.os.AsyncResult;
33import android.os.Bundle;
34import android.os.Handler;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080035import android.os.Message;
Meng Wang586741c2017-04-26 15:02:51 -070036import android.telephony.CarrierConfigManager;
Wink Saville79bff2a2012-06-01 14:37:21 -070037import android.telephony.CellInfo;
Nathan Haroldcea413a2015-11-23 15:48:10 -080038import android.telephony.CellInfoCdma;
39import android.telephony.CellInfoGsm;
40import android.telephony.CellInfoLte;
41import android.telephony.CellInfoWcdma;
42import android.telephony.CellIdentityCdma;
43import android.telephony.CellIdentityGsm;
44import android.telephony.CellIdentityLte;
45import android.telephony.CellIdentityWcdma;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080046import android.telephony.CellLocation;
Nathan Haroldcea413a2015-11-23 15:48:10 -080047import android.telephony.CellSignalStrengthCdma;
48import android.telephony.CellSignalStrengthGsm;
49import android.telephony.CellSignalStrengthLte;
50import android.telephony.CellSignalStrengthWcdma;
Wink Saville4f0d8812014-04-15 22:05:24 -070051import android.telephony.DataConnectionRealTimeInfo;
Jason Monk39b46742015-09-10 15:52:51 -040052import android.telephony.NeighboringCellInfo;
Nathan Harold2b77d742016-03-19 13:22:10 -070053import android.telephony.PreciseCallState;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080054import android.telephony.PhoneStateListener;
55import android.telephony.ServiceState;
Nathan Harold2b77d742016-03-19 13:22:10 -070056import android.telephony.SignalStrength;
Nathan Haroldcea413a2015-11-23 15:48:10 -080057import android.telephony.SubscriptionManager;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080058import android.telephony.TelephonyManager;
jsh534f5ae2009-09-24 09:19:22 -070059import android.telephony.cdma.CdmaCellLocation;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080060import android.telephony.gsm.GsmCellLocation;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080061import android.util.Log;
62import android.view.Menu;
63import android.view.MenuItem;
64import android.view.View;
65import android.view.View.OnClickListener;
66import android.widget.AdapterView;
67import android.widget.ArrayAdapter;
68import android.widget.Button;
Nathan Harold2b77d742016-03-19 13:22:10 -070069import android.widget.CompoundButton;
70import android.widget.CompoundButton.OnCheckedChangeListener;
Jason Monk39b46742015-09-10 15:52:51 -040071import android.widget.EditText;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080072import android.widget.Spinner;
Nathan Harold2b77d742016-03-19 13:22:10 -070073import android.widget.Switch;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080074import android.widget.TextView;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080075
Jason Monk39b46742015-09-10 15:52:51 -040076import com.android.ims.ImsConfig;
77import com.android.ims.ImsException;
78import com.android.ims.ImsManager;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080079import com.android.internal.telephony.Phone;
Wink Saville55434042012-06-14 12:33:43 -070080import com.android.internal.telephony.PhoneConstants;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080081import com.android.internal.telephony.PhoneFactory;
Nathan Haroldcea413a2015-11-23 15:48:10 -080082import com.android.internal.telephony.RILConstants;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080083import com.android.internal.telephony.TelephonyProperties;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080084
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080085import java.io.IOException;
Jason Monk39b46742015-09-10 15:52:51 -040086import java.net.HttpURLConnection;
87import java.net.URL;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -080088import java.net.UnknownHostException;
89import java.util.ArrayList;
90import java.util.List;
91
92public class RadioInfo extends Activity {
Nathan Harold2b77d742016-03-19 13:22:10 -070093 private static final String TAG = "RadioInfo";
johnwang342101a2009-09-23 16:22:34 -070094
Nathan Harold2b77d742016-03-19 13:22:10 -070095 private static final String[] mPreferredNetworkLabels = {
96 "WCDMA preferred",
97 "GSM only",
98 "WCDMA only",
99 "GSM auto (PRL)",
100 "CDMA auto (PRL)",
101 "CDMA only",
102 "EvDo only",
103 "Global auto (PRL)",
104 "LTE/CDMA auto (PRL)",
105 "LTE/UMTS auto (PRL)",
106 "LTE/CDMA/UMTS auto (PRL)",
107 "LTE only",
108 "LTE/WCDMA",
109 "TD-SCDMA only",
110 "TD-SCDMA/WCDMA",
111 "LTE/TD-SCDMA",
112 "TD-SCDMA/GSM",
113 "TD-SCDMA/UMTS",
114 "LTE/TD-SCDMA/WCDMA",
115 "LTE/TD-SCDMA/UMTS",
116 "TD-SCDMA/CDMA/UMTS",
117 "Global/TD-SCDMA",
118 "Unknown"
119 };
120
121
122 private static final int CELL_INFO_LIST_RATE_DISABLED = Integer.MAX_VALUE;
123 private static final int CELL_INFO_LIST_RATE_MAX = 0;
124
Nathan Harold12e1f552016-06-17 13:55:38 -0700125
126 private static final int IMS_VOLTE_PROVISIONED_CONFIG_ID =
127 ImsConfig.ConfigConstants.VLT_SETTING_ENABLED;
128
129 private static final int IMS_VT_PROVISIONED_CONFIG_ID =
130 ImsConfig.ConfigConstants.LVC_SETTING_ENABLED;
131
132 private static final int IMS_WFC_PROVISIONED_CONFIG_ID =
133 ImsConfig.ConfigConstants.VOICE_OVER_WIFI_SETTING_ENABLED;
134
Meng Wang586741c2017-04-26 15:02:51 -0700135 private static final int EAB_PROVISIONED_CONFIG_ID =
136 ImsConfig.ConfigConstants.EAB_SETTING_ENABLED;
137
Nathan Harold2b77d742016-03-19 13:22:10 -0700138 //Values in must match mCellInfoRefreshRates
139 private static final String[] mCellInfoRefreshRateLabels = {
140 "Disabled",
141 "Immediate",
142 "Min 5s",
143 "Min 10s",
144 "Min 60s"
145 };
146
147 //Values in seconds, must match mCellInfoRefreshRateLabels
148 private static final int mCellInfoRefreshRates[] = {
149 CELL_INFO_LIST_RATE_DISABLED,
150 CELL_INFO_LIST_RATE_MAX,
151 5000,
152 10000,
153 60000
154 };
155
156 private void log(String s) {
157 Log.d(TAG, s);
158 }
159
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800160 private static final int EVENT_CFI_CHANGED = 302;
161
162 private static final int EVENT_QUERY_PREFERRED_TYPE_DONE = 1000;
163 private static final int EVENT_SET_PREFERRED_TYPE_DONE = 1001;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800164 private static final int EVENT_QUERY_SMSC_DONE = 1005;
165 private static final int EVENT_UPDATE_SMSC_DONE = 1006;
166
167 private static final int MENU_ITEM_SELECT_BAND = 0;
168 private static final int MENU_ITEM_VIEW_ADN = 1;
169 private static final int MENU_ITEM_VIEW_FDN = 2;
170 private static final int MENU_ITEM_VIEW_SDN = 3;
Nathan Harolde272c202016-10-27 13:45:00 -0700171 private static final int MENU_ITEM_GET_IMS_STATUS = 4;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800172 private static final int MENU_ITEM_TOGGLE_DATA = 5;
Tammo Spalinka5f4c8f2009-10-15 20:08:58 +0800173
Wink Savillec3886682009-04-02 11:00:56 -0700174 private TextView mDeviceId; //DeviceId is the IMEI in GSM and the MEID in CDMA
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800175 private TextView number;
176 private TextView callState;
177 private TextView operatorName;
178 private TextView roamingState;
179 private TextView gsmState;
180 private TextView gprsState;
Nathan Harold2b77d742016-03-19 13:22:10 -0700181 private TextView voiceNetwork;
182 private TextView dataNetwork;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800183 private TextView dBm;
184 private TextView mMwi;
185 private TextView mCfi;
186 private TextView mLocation;
187 private TextView mNeighboringCids;
Wink Saville79bff2a2012-06-01 14:37:21 -0700188 private TextView mCellInfo;
Wink Saville4f0d8812014-04-15 22:05:24 -0700189 private TextView mDcRtInfoTv;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800190 private TextView sent;
191 private TextView received;
Nathan Haroldcea413a2015-11-23 15:48:10 -0800192 private TextView mPingHostnameV4;
193 private TextView mPingHostnameV6;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800194 private TextView mHttpClientTest;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800195 private TextView dnsCheckState;
196 private EditText smsc;
Nathan Harold2b77d742016-03-19 13:22:10 -0700197 private Switch radioPowerOnSwitch;
198 private Button cellInfoRefreshRateButton;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800199 private Button dnsCheckToggleButton;
200 private Button pingTestButton;
201 private Button updateSmscButton;
202 private Button refreshSmscButton;
Tammo Spalinka5f4c8f2009-10-15 20:08:58 +0800203 private Button oemInfoButton;
Youhan Wangfd781e92016-12-16 15:53:16 -0800204 private Button carrierProvisioningButton;
205 private Button triggercarrierProvisioningButton;
Nathan Harold12e1f552016-06-17 13:55:38 -0700206 private Switch imsVolteProvisionedSwitch;
207 private Switch imsVtProvisionedSwitch;
208 private Switch imsWfcProvisionedSwitch;
Meng Wang586741c2017-04-26 15:02:51 -0700209 private Switch eabProvisionedSwitch;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800210 private Spinner preferredNetworkType;
Nathan Harold2b77d742016-03-19 13:22:10 -0700211 private Spinner cellInfoRefreshRateSpinner;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800212
213 private TelephonyManager mTelephonyManager;
Nathan Haroldcea413a2015-11-23 15:48:10 -0800214 private ImsManager mImsManager = null;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800215 private Phone phone = null;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800216
Nathan Haroldcea413a2015-11-23 15:48:10 -0800217 private String mPingHostnameResultV4;
218 private String mPingHostnameResultV6;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800219 private String mHttpClientTestResult;
220 private boolean mMwiValue = false;
221 private boolean mCfiValue = false;
Nathan Haroldcea413a2015-11-23 15:48:10 -0800222
223 private List<CellInfo> mCellInfoResult = null;
224 private CellLocation mCellLocationResult = null;
225 private List<NeighboringCellInfo> mNeighboringCellResult = null;
226
227 private int mPreferredNetworkTypeResult;
Nathan Harold2b77d742016-03-19 13:22:10 -0700228 private int mCellInfoRefreshRateIndex;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800229
Nathan Harold2b77d742016-03-19 13:22:10 -0700230 private final PhoneStateListener mPhoneStateListener = new PhoneStateListener() {
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800231 @Override
232 public void onDataConnectionStateChanged(int state) {
233 updateDataState();
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800234 updateNetworkType();
235 }
236
237 @Override
238 public void onDataActivity(int direction) {
239 updateDataStats2();
240 }
241
242 @Override
Nathan Harold2b77d742016-03-19 13:22:10 -0700243 public void onCallStateChanged(int state, String incomingNumber) {
244 updateNetworkType();
245 updatePhoneState(state);
246 }
247
248 @Override
249 public void onPreciseCallStateChanged(PreciseCallState preciseState) {
250 updateNetworkType();
251 }
252
253 @Override
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800254 public void onCellLocationChanged(CellLocation location) {
255 updateLocation(location);
256 }
257
258 @Override
259 public void onMessageWaitingIndicatorChanged(boolean mwi) {
260 mMwiValue = mwi;
261 updateMessageWaiting();
262 }
263
264 @Override
265 public void onCallForwardingIndicatorChanged(boolean cfi) {
266 mCfiValue = cfi;
267 updateCallRedirect();
268 }
Wink Saville79bff2a2012-06-01 14:37:21 -0700269
270 @Override
271 public void onCellInfoChanged(List<CellInfo> arrayCi) {
Wink Savillebf471282013-04-05 15:04:05 -0700272 log("onCellInfoChanged: arrayCi=" + arrayCi);
Nathan Haroldcea413a2015-11-23 15:48:10 -0800273 mCellInfoResult = arrayCi;
274 updateCellInfo(mCellInfoResult);
Wink Saville79bff2a2012-06-01 14:37:21 -0700275 }
Wink Saville4f0d8812014-04-15 22:05:24 -0700276
277 @Override
278 public void onDataConnectionRealTimeInfoChanged(DataConnectionRealTimeInfo dcRtInfo) {
279 log("onDataConnectionRealTimeInfoChanged: dcRtInfo=" + dcRtInfo);
280 updateDcRtInfoTv(dcRtInfo);
281 }
Nathan Harold2b77d742016-03-19 13:22:10 -0700282
283 @Override
284 public void onSignalStrengthsChanged(SignalStrength signalStrength) {
285 log("onSignalStrengthChanged: SignalStrength=" +signalStrength);
286 updateSignalStrength(signalStrength);
287 }
288
289 @Override
290 public void onServiceStateChanged(ServiceState serviceState) {
291 log("onServiceStateChanged: ServiceState=" + serviceState);
292 updateServiceState(serviceState);
293 updateRadioPowerState();
294 updateNetworkType();
Nathan Harold12e1f552016-06-17 13:55:38 -0700295 updateImsProvisionedState();
Nathan Harold2b77d742016-03-19 13:22:10 -0700296 }
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800297 };
298
Nathan Haroldcea413a2015-11-23 15:48:10 -0800299 private void updatePreferredNetworkType(int type) {
300 if (type >= mPreferredNetworkLabels.length || type < 0) {
301 log("EVENT_QUERY_PREFERRED_TYPE_DONE: unknown " +
302 "type=" + type);
303 type = mPreferredNetworkLabels.length - 1; //set to Unknown
304 }
305 mPreferredNetworkTypeResult = type;
306
307 preferredNetworkType.setSelection(mPreferredNetworkTypeResult, true);
308 }
309
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800310 private Handler mHandler = new Handler() {
Nathan Haroldcea413a2015-11-23 15:48:10 -0800311 @Override
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800312 public void handleMessage(Message msg) {
313 AsyncResult ar;
314 switch (msg.what) {
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800315 case EVENT_QUERY_PREFERRED_TYPE_DONE:
316 ar= (AsyncResult) msg.obj;
Nathan Haroldcea413a2015-11-23 15:48:10 -0800317 if (ar.exception == null && ar.result != null) {
318 updatePreferredNetworkType(((int[])ar.result)[0]);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800319 } else {
Nathan Haroldcea413a2015-11-23 15:48:10 -0800320 //In case of an exception, we will set this to unknown
321 updatePreferredNetworkType(mPreferredNetworkLabels.length-1);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800322 }
323 break;
324 case EVENT_SET_PREFERRED_TYPE_DONE:
325 ar= (AsyncResult) msg.obj;
326 if (ar.exception != null) {
Nathan Harolded38afa2016-04-13 00:29:30 -0700327 log("Set preferred network type failed.");
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800328 }
329 break;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800330 case EVENT_QUERY_SMSC_DONE:
331 ar= (AsyncResult) msg.obj;
332 if (ar.exception != null) {
333 smsc.setText("refresh error");
334 } else {
jsh21dd4072009-05-12 11:26:55 -0700335 smsc.setText((String)ar.result);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800336 }
337 break;
338 case EVENT_UPDATE_SMSC_DONE:
339 updateSmscButton.setEnabled(true);
340 ar= (AsyncResult) msg.obj;
341 if (ar.exception != null) {
342 smsc.setText("update error");
343 }
344 break;
345 default:
Nathan Haroldcea413a2015-11-23 15:48:10 -0800346 super.handleMessage(msg);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800347 break;
348
349 }
350 }
351 };
352
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800353 @Override
354 public void onCreate(Bundle icicle) {
355 super.onCreate(icicle);
fionaxub54cb2d2016-09-22 15:01:05 -0700356 if (!android.os.Process.myUserHandle().isSystem()) {
357 Log.e(TAG, "Not run from system user, don't do anything.");
358 finish();
359 return;
360 }
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800361
362 setContentView(R.layout.radio_info);
363
Nathan Haroldcea413a2015-11-23 15:48:10 -0800364 log("Started onCreate");
365
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800366 mTelephonyManager = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
367 phone = PhoneFactory.getDefaultPhone();
368
Nathan Haroldcea413a2015-11-23 15:48:10 -0800369 //TODO: Need to update this if the default phoneId changes?
370 // Better to have an instance per phone?
371 mImsManager = ImsManager.getInstance(getApplicationContext(),
372 SubscriptionManager.getDefaultVoicePhoneId());
373
Wink Savillec3886682009-04-02 11:00:56 -0700374 mDeviceId= (TextView) findViewById(R.id.imei);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800375 number = (TextView) findViewById(R.id.number);
376 callState = (TextView) findViewById(R.id.call);
377 operatorName = (TextView) findViewById(R.id.operator);
378 roamingState = (TextView) findViewById(R.id.roaming);
379 gsmState = (TextView) findViewById(R.id.gsm);
380 gprsState = (TextView) findViewById(R.id.gprs);
Nathan Harold2b77d742016-03-19 13:22:10 -0700381 voiceNetwork = (TextView) findViewById(R.id.voice_network);
382 dataNetwork = (TextView) findViewById(R.id.data_network);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800383 dBm = (TextView) findViewById(R.id.dbm);
384 mMwi = (TextView) findViewById(R.id.mwi);
385 mCfi = (TextView) findViewById(R.id.cfi);
386 mLocation = (TextView) findViewById(R.id.location);
387 mNeighboringCids = (TextView) findViewById(R.id.neighboring);
Wink Saville79bff2a2012-06-01 14:37:21 -0700388 mCellInfo = (TextView) findViewById(R.id.cellinfo);
Nathan Haroldcea413a2015-11-23 15:48:10 -0800389 mCellInfo.setTypeface(Typeface.MONOSPACE);
Wink Saville4f0d8812014-04-15 22:05:24 -0700390 mDcRtInfoTv = (TextView) findViewById(R.id.dcrtinfo);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800391
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800392 sent = (TextView) findViewById(R.id.sent);
393 received = (TextView) findViewById(R.id.received);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800394 smsc = (EditText) findViewById(R.id.smsc);
395 dnsCheckState = (TextView) findViewById(R.id.dnsCheckState);
Nathan Haroldcea413a2015-11-23 15:48:10 -0800396 mPingHostnameV4 = (TextView) findViewById(R.id.pingHostnameV4);
397 mPingHostnameV6 = (TextView) findViewById(R.id.pingHostnameV6);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800398 mHttpClientTest = (TextView) findViewById(R.id.httpClientTest);
399
400 preferredNetworkType = (Spinner) findViewById(R.id.preferredNetworkType);
401 ArrayAdapter<String> adapter = new ArrayAdapter<String> (this,
402 android.R.layout.simple_spinner_item, mPreferredNetworkLabels);
johnwang342101a2009-09-23 16:22:34 -0700403 adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800404 preferredNetworkType.setAdapter(adapter);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800405
Nathan Harold2b77d742016-03-19 13:22:10 -0700406 cellInfoRefreshRateSpinner = (Spinner) findViewById(R.id.cell_info_rate_select);
407 ArrayAdapter<String> cellInfoAdapter = new ArrayAdapter<String>(this,
408 android.R.layout.simple_spinner_item, mCellInfoRefreshRateLabels);
409 cellInfoAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
410 cellInfoRefreshRateSpinner.setAdapter(cellInfoAdapter);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800411
Nathan Harold12e1f552016-06-17 13:55:38 -0700412 imsVolteProvisionedSwitch = (Switch) findViewById(R.id.volte_provisioned_switch);
413 imsVtProvisionedSwitch = (Switch) findViewById(R.id.vt_provisioned_switch);
414 imsWfcProvisionedSwitch = (Switch) findViewById(R.id.wfc_provisioned_switch);
Meng Wang586741c2017-04-26 15:02:51 -0700415 eabProvisionedSwitch = (Switch) findViewById(R.id.wfc_provisioned_switch);
Wink Savillebf471282013-04-05 15:04:05 -0700416
Nathan Harold2b77d742016-03-19 13:22:10 -0700417 radioPowerOnSwitch = (Switch) findViewById(R.id.radio_power);
Wink Saville426fc662011-09-25 14:39:02 -0700418
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800419 pingTestButton = (Button) findViewById(R.id.ping_test);
420 pingTestButton.setOnClickListener(mPingButtonHandler);
421 updateSmscButton = (Button) findViewById(R.id.update_smsc);
422 updateSmscButton.setOnClickListener(mUpdateSmscButtonHandler);
423 refreshSmscButton = (Button) findViewById(R.id.refresh_smsc);
424 refreshSmscButton.setOnClickListener(mRefreshSmscButtonHandler);
425 dnsCheckToggleButton = (Button) findViewById(R.id.dns_check_toggle);
426 dnsCheckToggleButton.setOnClickListener(mDnsCheckButtonHandler);
Youhan Wangfd781e92016-12-16 15:53:16 -0800427 carrierProvisioningButton = (Button) findViewById(R.id.carrier_provisioning);
428 carrierProvisioningButton.setOnClickListener(mCarrierProvisioningButtonHandler);
429 triggercarrierProvisioningButton = (Button) findViewById(R.id.trigger_carrier_provisioning);
430 triggercarrierProvisioningButton.setOnClickListener(
431 mTriggerCarrierProvisioningButtonHandler);
johnwang342101a2009-09-23 16:22:34 -0700432
Tammo Spalinka5f4c8f2009-10-15 20:08:58 +0800433 oemInfoButton = (Button) findViewById(R.id.oem_info);
434 oemInfoButton.setOnClickListener(mOemInfoButtonHandler);
435 PackageManager pm = getPackageManager();
436 Intent oemInfoIntent = new Intent("com.android.settings.OEM_RADIO_INFO");
437 List<ResolveInfo> oemInfoIntentList = pm.queryIntentActivities(oemInfoIntent, 0);
438 if (oemInfoIntentList.size() == 0) {
439 oemInfoButton.setEnabled(false);
440 }
441
Nathan Harolded38afa2016-04-13 00:29:30 -0700442 mCellInfoRefreshRateIndex = 0; //disabled
Nathan Haroldcea413a2015-11-23 15:48:10 -0800443 mPreferredNetworkTypeResult = mPreferredNetworkLabels.length - 1; //Unknown
444
445 //FIXME: Replace with TelephonyManager call
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800446 phone.getPreferredNetworkType(
447 mHandler.obtainMessage(EVENT_QUERY_PREFERRED_TYPE_DONE));
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800448
Nathan Haroldcea413a2015-11-23 15:48:10 -0800449 restoreFromBundle(icicle);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800450 }
451
452 @Override
453 protected void onResume() {
454 super.onResume();
455
Nathan Haroldcea413a2015-11-23 15:48:10 -0800456 log("Started onResume");
457
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800458 updateMessageWaiting();
459 updateCallRedirect();
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800460 updateDataState();
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800461 updateDataStats2();
Nathan Harold2b77d742016-03-19 13:22:10 -0700462 updateRadioPowerState();
Nathan Harold12e1f552016-06-17 13:55:38 -0700463 updateImsProvisionedState();
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800464 updateProperties();
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800465 updateDnsCheckState();
Nathan Harold2b77d742016-03-19 13:22:10 -0700466 updateNetworkType();
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800467
Nathan Haroldcea413a2015-11-23 15:48:10 -0800468 updateNeighboringCids(mNeighboringCellResult);
469 updateLocation(mCellLocationResult);
470 updateCellInfo(mCellInfoResult);
471
472 mPingHostnameV4.setText(mPingHostnameResultV4);
473 mPingHostnameV6.setText(mPingHostnameResultV6);
474 mHttpClientTest.setText(mHttpClientTestResult);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800475
Nathan Harold2b77d742016-03-19 13:22:10 -0700476 cellInfoRefreshRateSpinner.setOnItemSelectedListener(mCellInfoRefreshRateHandler);
Nathan Harolded38afa2016-04-13 00:29:30 -0700477 //set selection after registering listener to force update
478 cellInfoRefreshRateSpinner.setSelection(mCellInfoRefreshRateIndex);
479
480 //set selection before registering to prevent update
481 preferredNetworkType.setSelection(mPreferredNetworkTypeResult, true);
Nathan Harold2b77d742016-03-19 13:22:10 -0700482 preferredNetworkType.setOnItemSelectedListener(mPreferredNetworkHandler);
Nathan Harolded38afa2016-04-13 00:29:30 -0700483
Nathan Harold2b77d742016-03-19 13:22:10 -0700484 radioPowerOnSwitch.setOnCheckedChangeListener(mRadioPowerOnChangeListener);
Nathan Harold12e1f552016-06-17 13:55:38 -0700485 imsVolteProvisionedSwitch.setOnCheckedChangeListener(mImsVolteCheckedChangeListener);
486 imsVtProvisionedSwitch.setOnCheckedChangeListener(mImsVtCheckedChangeListener);
487 imsWfcProvisionedSwitch.setOnCheckedChangeListener(mImsWfcCheckedChangeListener);
Meng Wang586741c2017-04-26 15:02:51 -0700488 eabProvisionedSwitch.setOnCheckedChangeListener(mEabCheckedChangeListener);
Nathan Harold2b77d742016-03-19 13:22:10 -0700489
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800490 mTelephonyManager.listen(mPhoneStateListener,
Nathan Harold2b77d742016-03-19 13:22:10 -0700491 PhoneStateListener.LISTEN_CALL_STATE
492 //b/27803938 - RadioInfo currently cannot read PRECISE_CALL_STATE
493 // | PhoneStateListener.LISTEN_PRECISE_CALL_STATE
494 | PhoneStateListener.LISTEN_DATA_CONNECTION_STATE
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800495 | PhoneStateListener.LISTEN_DATA_ACTIVITY
496 | PhoneStateListener.LISTEN_CELL_LOCATION
497 | PhoneStateListener.LISTEN_MESSAGE_WAITING_INDICATOR
Wink Saville79bff2a2012-06-01 14:37:21 -0700498 | PhoneStateListener.LISTEN_CALL_FORWARDING_INDICATOR
Wink Saville4f0d8812014-04-15 22:05:24 -0700499 | PhoneStateListener.LISTEN_CELL_INFO
Nathan Harold2b77d742016-03-19 13:22:10 -0700500 | PhoneStateListener.LISTEN_SERVICE_STATE
501 | PhoneStateListener.LISTEN_SIGNAL_STRENGTHS
Wink Saville4f0d8812014-04-15 22:05:24 -0700502 | PhoneStateListener.LISTEN_DATA_CONNECTION_REAL_TIME_INFO);
Nathan Harolded38afa2016-04-13 00:29:30 -0700503
504 smsc.clearFocus();
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800505 }
506
507 @Override
Nathan Haroldcea413a2015-11-23 15:48:10 -0800508 protected void onPause() {
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800509 super.onPause();
510
Wink Savillebf471282013-04-05 15:04:05 -0700511 log("onPause: unregister phone & data intents");
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800512
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800513 mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE);
Sooraj Sasindran5cce06b2016-08-18 15:49:49 -0700514 mTelephonyManager.setCellInfoListRate(CELL_INFO_LIST_RATE_DISABLED);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800515 }
516
Nathan Haroldcea413a2015-11-23 15:48:10 -0800517 private void restoreFromBundle(Bundle b) {
Nathan Harolde272c202016-10-27 13:45:00 -0700518 if(b == null) {
Nathan Haroldcea413a2015-11-23 15:48:10 -0800519 return;
520 }
521
522 mPingHostnameResultV4 = b.getString("mPingHostnameResultV4","");
523 mPingHostnameResultV6 = b.getString("mPingHostnameResultV6","");
524 mHttpClientTestResult = b.getString("mHttpClientTestResult","");
525
526 mPingHostnameV4.setText(mPingHostnameResultV4);
527 mPingHostnameV6.setText(mPingHostnameResultV6);
528 mHttpClientTest.setText(mHttpClientTestResult);
529
Nathan Harold2b77d742016-03-19 13:22:10 -0700530 mPreferredNetworkTypeResult = b.getInt("mPreferredNetworkTypeResult",
531 mPreferredNetworkLabels.length - 1);
532
533 mCellInfoRefreshRateIndex = b.getInt("mCellInfoRefreshRateIndex", 0);
Nathan Haroldcea413a2015-11-23 15:48:10 -0800534 }
535
536 @Override
537 protected void onSaveInstanceState(Bundle outState) {
538 outState.putString("mPingHostnameResultV4", mPingHostnameResultV4);
539 outState.putString("mPingHostnameResultV6", mPingHostnameResultV6);
540 outState.putString("mHttpClientTestResult", mHttpClientTestResult);
Nathan Harold2b77d742016-03-19 13:22:10 -0700541
Nathan Haroldcea413a2015-11-23 15:48:10 -0800542 outState.putInt("mPreferredNetworkTypeResult", mPreferredNetworkTypeResult);
Nathan Harold2b77d742016-03-19 13:22:10 -0700543 outState.putInt("mCellInfoRefreshRateIndex", mCellInfoRefreshRateIndex);
544
Nathan Haroldcea413a2015-11-23 15:48:10 -0800545 }
546
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800547 @Override
548 public boolean onCreateOptionsMenu(Menu menu) {
Wink Savillec3886682009-04-02 11:00:56 -0700549 menu.add(0, MENU_ITEM_SELECT_BAND, 0, R.string.radio_info_band_mode_label)
550 .setOnMenuItemClickListener(mSelectBandCallback)
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800551 .setAlphabeticShortcut('b');
552 menu.add(1, MENU_ITEM_VIEW_ADN, 0,
553 R.string.radioInfo_menu_viewADN).setOnMenuItemClickListener(mViewADNCallback);
554 menu.add(1, MENU_ITEM_VIEW_FDN, 0,
555 R.string.radioInfo_menu_viewFDN).setOnMenuItemClickListener(mViewFDNCallback);
556 menu.add(1, MENU_ITEM_VIEW_SDN, 0,
557 R.string.radioInfo_menu_viewSDN).setOnMenuItemClickListener(mViewSDNCallback);
Nathan Harolde272c202016-10-27 13:45:00 -0700558 menu.add(1, MENU_ITEM_GET_IMS_STATUS,
559 0, R.string.radioInfo_menu_getIMS).setOnMenuItemClickListener(mGetImsStatus);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800560 menu.add(1, MENU_ITEM_TOGGLE_DATA,
Nathan Harold2b77d742016-03-19 13:22:10 -0700561 0, R.string.radio_info_data_connection_disable).setOnMenuItemClickListener(mToggleData);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800562 return true;
563 }
564
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800565 @Override
Wink Savillec3886682009-04-02 11:00:56 -0700566 public boolean onPrepareOptionsMenu(Menu menu) {
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800567 // Get the TOGGLE DATA menu item in the right state.
568 MenuItem item = menu.findItem(MENU_ITEM_TOGGLE_DATA);
569 int state = mTelephonyManager.getDataState();
570 boolean visible = true;
571
572 switch (state) {
573 case TelephonyManager.DATA_CONNECTED:
574 case TelephonyManager.DATA_SUSPENDED:
Nathan Harold2b77d742016-03-19 13:22:10 -0700575 item.setTitle(R.string.radio_info_data_connection_disable);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800576 break;
577 case TelephonyManager.DATA_DISCONNECTED:
Nathan Harold2b77d742016-03-19 13:22:10 -0700578 item.setTitle(R.string.radio_info_data_connection_enable);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800579 break;
580 default:
581 visible = false;
582 break;
583 }
584 item.setVisible(visible);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800585 return true;
586 }
587
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800588 private void updateDnsCheckState() {
Nathan Haroldcea413a2015-11-23 15:48:10 -0800589 //FIXME: Replace with a TelephonyManager call
Mike Lockwood5304c7e2009-04-05 11:37:45 -0700590 dnsCheckState.setText(phone.isDnsCheckDisabled() ?
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800591 "0.0.0.0 allowed" :"0.0.0.0 not allowed");
592 }
Wink Savillee2a14e32009-05-29 14:06:30 -0700593
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800594 private final void
Nathan Harold2b77d742016-03-19 13:22:10 -0700595 updateSignalStrength(SignalStrength signalStrength) {
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800596 Resources r = getResources();
597
Nathan Harold2b77d742016-03-19 13:22:10 -0700598 int signalDbm = signalStrength.getDbm();
Wink Savillee2a14e32009-05-29 14:06:30 -0700599
Nathan Harold2b77d742016-03-19 13:22:10 -0700600 int signalAsu = signalStrength.getAsuLevel();
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800601
602 if (-1 == signalAsu) signalAsu = 0;
603
604 dBm.setText(String.valueOf(signalDbm) + " "
605 + r.getString(R.string.radioInfo_display_dbm) + " "
606 + String.valueOf(signalAsu) + " "
607 + r.getString(R.string.radioInfo_display_asu));
608 }
609
610 private final void updateLocation(CellLocation location) {
jsh534f5ae2009-09-24 09:19:22 -0700611 Resources r = getResources();
Wink Savillec3886682009-04-02 11:00:56 -0700612 if (location instanceof GsmCellLocation) {
613 GsmCellLocation loc = (GsmCellLocation)location;
jsh534f5ae2009-09-24 09:19:22 -0700614 int lac = loc.getLac();
615 int cid = loc.getCid();
616 mLocation.setText(r.getString(R.string.radioInfo_lac) + " = "
617 + ((lac == -1) ? "unknown" : Integer.toHexString(lac))
618 + " "
619 + r.getString(R.string.radioInfo_cid) + " = "
620 + ((cid == -1) ? "unknown" : Integer.toHexString(cid)));
621 } else if (location instanceof CdmaCellLocation) {
622 CdmaCellLocation loc = (CdmaCellLocation)location;
623 int bid = loc.getBaseStationId();
624 int sid = loc.getSystemId();
625 int nid = loc.getNetworkId();
626 int lat = loc.getBaseStationLatitude();
627 int lon = loc.getBaseStationLongitude();
628 mLocation.setText("BID = "
629 + ((bid == -1) ? "unknown" : Integer.toHexString(bid))
630 + " "
631 + "SID = "
632 + ((sid == -1) ? "unknown" : Integer.toHexString(sid))
633 + " "
634 + "NID = "
635 + ((nid == -1) ? "unknown" : Integer.toHexString(nid))
636 + "\n"
637 + "LAT = "
638 + ((lat == -1) ? "unknown" : Integer.toHexString(lat))
639 + " "
640 + "LONG = "
641 + ((lon == -1) ? "unknown" : Integer.toHexString(lon)));
642 } else {
643 mLocation.setText("unknown");
Wink Savillec3886682009-04-02 11:00:56 -0700644 }
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800645
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800646
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800647 }
648
Nathan Haroldcea413a2015-11-23 15:48:10 -0800649 private final void updateNeighboringCids(List<NeighboringCellInfo> cids) {
johnwangf02c65f2009-09-25 17:26:54 -0700650 StringBuilder sb = new StringBuilder();
651
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800652 if (cids != null) {
Nathan Harolde272c202016-10-27 13:45:00 -0700653 if (cids.isEmpty()) {
johnwangf02c65f2009-09-25 17:26:54 -0700654 sb.append("no neighboring cells");
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800655 } else {
656 for (NeighboringCellInfo cell : cids) {
johnwangf02c65f2009-09-25 17:26:54 -0700657 sb.append(cell.toString()).append(" ");
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800658 }
659 }
660 } else {
johnwangf02c65f2009-09-25 17:26:54 -0700661 sb.append("unknown");
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800662 }
johnwangf02c65f2009-09-25 17:26:54 -0700663 mNeighboringCids.setText(sb.toString());
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800664 }
665
Nathan Haroldcea413a2015-11-23 15:48:10 -0800666 private final String getCellInfoDisplayString(int i) {
667 return (i != Integer.MAX_VALUE) ? Integer.toString(i) : "";
668 }
669
670 private final String getCellInfoDisplayString(long i) {
671 return (i != Long.MAX_VALUE) ? Long.toString(i) : "";
672 }
673
674 private final String buildCdmaInfoString(CellInfoCdma ci) {
675 CellIdentityCdma cidCdma = ci.getCellIdentity();
676 CellSignalStrengthCdma ssCdma = ci.getCellSignalStrength();
677
678 return String.format("%-3.3s %-5.5s %-5.5s %-5.5s %-6.6s %-6.6s %-6.6s %-6.6s %-5.5s",
679 ci.isRegistered() ? "S " : " ",
680 getCellInfoDisplayString(cidCdma.getSystemId()),
681 getCellInfoDisplayString(cidCdma.getNetworkId()),
682 getCellInfoDisplayString(cidCdma.getBasestationId()),
683 getCellInfoDisplayString(ssCdma.getCdmaDbm()),
684 getCellInfoDisplayString(ssCdma.getCdmaEcio()),
685 getCellInfoDisplayString(ssCdma.getEvdoDbm()),
686 getCellInfoDisplayString(ssCdma.getEvdoEcio()),
687 getCellInfoDisplayString(ssCdma.getEvdoSnr()));
688 }
689
690 private final String buildGsmInfoString(CellInfoGsm ci) {
691 CellIdentityGsm cidGsm = ci.getCellIdentity();
692 CellSignalStrengthGsm ssGsm = ci.getCellSignalStrength();
693
Nathan Harold2b77d742016-03-19 13:22:10 -0700694 return String.format("%-3.3s %-3.3s %-3.3s %-5.5s %-5.5s %-6.6s %-4.4s %-4.4s\n",
Nathan Haroldcea413a2015-11-23 15:48:10 -0800695 ci.isRegistered() ? "S " : " ",
696 getCellInfoDisplayString(cidGsm.getMcc()),
697 getCellInfoDisplayString(cidGsm.getMnc()),
698 getCellInfoDisplayString(cidGsm.getLac()),
699 getCellInfoDisplayString(cidGsm.getCid()),
Nathan Harold2b77d742016-03-19 13:22:10 -0700700 getCellInfoDisplayString(cidGsm.getArfcn()),
701 getCellInfoDisplayString(cidGsm.getBsic()),
Nathan Haroldcea413a2015-11-23 15:48:10 -0800702 getCellInfoDisplayString(ssGsm.getDbm()));
703 }
704
705 private final String buildLteInfoString(CellInfoLte ci) {
706 CellIdentityLte cidLte = ci.getCellIdentity();
707 CellSignalStrengthLte ssLte = ci.getCellSignalStrength();
708
709 return String.format(
Nathan Harold2b77d742016-03-19 13:22:10 -0700710 "%-3.3s %-3.3s %-3.3s %-5.5s %-5.5s %-3.3s %-6.6s %-4.4s %-4.4s %-2.2s\n",
Nathan Haroldcea413a2015-11-23 15:48:10 -0800711 ci.isRegistered() ? "S " : " ",
712 getCellInfoDisplayString(cidLte.getMcc()),
713 getCellInfoDisplayString(cidLte.getMnc()),
714 getCellInfoDisplayString(cidLte.getTac()),
715 getCellInfoDisplayString(cidLte.getCi()),
716 getCellInfoDisplayString(cidLte.getPci()),
Nathan Harold2b77d742016-03-19 13:22:10 -0700717 getCellInfoDisplayString(cidLte.getEarfcn()),
Nathan Haroldcea413a2015-11-23 15:48:10 -0800718 getCellInfoDisplayString(ssLte.getDbm()),
719 getCellInfoDisplayString(ssLte.getRsrq()),
720 getCellInfoDisplayString(ssLte.getTimingAdvance()));
721 }
722
723 private final String buildWcdmaInfoString(CellInfoWcdma ci) {
724 CellIdentityWcdma cidWcdma = ci.getCellIdentity();
725 CellSignalStrengthWcdma ssWcdma = ci.getCellSignalStrength();
726
Nathan Harold2b77d742016-03-19 13:22:10 -0700727 return String.format("%-3.3s %-3.3s %-3.3s %-5.5s %-5.5s %-6.6s %-3.3s %-4.4s\n",
Nathan Haroldcea413a2015-11-23 15:48:10 -0800728 ci.isRegistered() ? "S " : " ",
729 getCellInfoDisplayString(cidWcdma.getMcc()),
730 getCellInfoDisplayString(cidWcdma.getMnc()),
731 getCellInfoDisplayString(cidWcdma.getLac()),
732 getCellInfoDisplayString(cidWcdma.getCid()),
Nathan Harold2b77d742016-03-19 13:22:10 -0700733 getCellInfoDisplayString(cidWcdma.getUarfcn()),
Nathan Haroldcea413a2015-11-23 15:48:10 -0800734 getCellInfoDisplayString(cidWcdma.getPsc()),
735 getCellInfoDisplayString(ssWcdma.getDbm()));
736 }
737
738 private final String buildCellInfoString(List<CellInfo> arrayCi) {
739 String value = new String();
740 StringBuilder cdmaCells = new StringBuilder(),
741 gsmCells = new StringBuilder(),
742 lteCells = new StringBuilder(),
743 wcdmaCells = new StringBuilder();
744
745 if (arrayCi != null) {
746 for (CellInfo ci : arrayCi) {
747
748 if (ci instanceof CellInfoLte) {
749 lteCells.append(buildLteInfoString((CellInfoLte) ci));
750 } else if (ci instanceof CellInfoWcdma) {
751 wcdmaCells.append(buildWcdmaInfoString((CellInfoWcdma) ci));
752 } else if (ci instanceof CellInfoGsm) {
753 gsmCells.append(buildGsmInfoString((CellInfoGsm) ci));
754 } else if (ci instanceof CellInfoCdma) {
755 cdmaCells.append(buildCdmaInfoString((CellInfoCdma) ci));
Wink Saville79bff2a2012-06-01 14:37:21 -0700756 }
757 }
Nathan Haroldcea413a2015-11-23 15:48:10 -0800758 if (lteCells.length() != 0) {
759 value += String.format(
Nathan Harold2b77d742016-03-19 13:22:10 -0700760 "LTE\n%-3.3s %-3.3s %-3.3s %-5.5s %-5.5s %-3.3s %-6.6s %-4.4s %-4.4s %-2.2s\n",
761 "SRV", "MCC", "MNC", "TAC", "CID", "PCI", "EARFCN", "RSRP", "RSRQ", "TA");
Nathan Haroldcea413a2015-11-23 15:48:10 -0800762 value += lteCells.toString();
763 }
764 if (wcdmaCells.length() != 0) {
Nathan Harold2b77d742016-03-19 13:22:10 -0700765 value += String.format("WCDMA\n%-3.3s %-3.3s %-3.3s %-5.5s %-5.5s %-6.6s %-3.3s %-4.4s\n",
766 "SRV", "MCC", "MNC", "LAC", "CID", "UARFCN", "PSC", "RSCP");
Nathan Haroldcea413a2015-11-23 15:48:10 -0800767 value += wcdmaCells.toString();
768 }
769 if (gsmCells.length() != 0) {
Nathan Harold2b77d742016-03-19 13:22:10 -0700770 value += String.format("GSM\n%-3.3s %-3.3s %-3.3s %-5.5s %-5.5s %-6.6s %-4.4s %-4.4s\n",
771 "SRV", "MCC", "MNC", "LAC", "CID", "ARFCN", "BSIC", "RSSI");
Nathan Haroldcea413a2015-11-23 15:48:10 -0800772 value += gsmCells.toString();
773 }
774 if (cdmaCells.length() != 0) {
775 value += String.format(
776 "CDMA/EVDO\n%-3.3s %-5.5s %-5.5s %-5.5s %-6.6s %-6.6s %-6.6s %-6.6s %-5.5s\n",
777 "SRV", "SID", "NID", "BSID", "C-RSSI", "C-ECIO", "E-RSSI", "E-ECIO", "E-SNR");
778 value += cdmaCells.toString();
779 }
780 } else {
781 value ="unknown";
Wink Saville79bff2a2012-06-01 14:37:21 -0700782 }
Nathan Haroldcea413a2015-11-23 15:48:10 -0800783
784 return value.toString();
785 }
786
787 private final void updateCellInfo(List<CellInfo> arrayCi) {
788 mCellInfo.setText(buildCellInfoString(arrayCi));
Wink Saville79bff2a2012-06-01 14:37:21 -0700789 }
790
Wink Saville4f0d8812014-04-15 22:05:24 -0700791 private final void updateDcRtInfoTv(DataConnectionRealTimeInfo dcRtInfo) {
792 mDcRtInfoTv.setText(dcRtInfo.toString());
793 }
794
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800795 private final void
796 updateMessageWaiting() {
797 mMwi.setText(String.valueOf(mMwiValue));
798 }
799
800 private final void
801 updateCallRedirect() {
802 mCfi.setText(String.valueOf(mCfiValue));
803 }
804
805
806 private final void
Nathan Harold2b77d742016-03-19 13:22:10 -0700807 updateServiceState(ServiceState serviceState) {
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800808 int state = serviceState.getState();
809 Resources r = getResources();
810 String display = r.getString(R.string.radioInfo_unknown);
johnwang342101a2009-09-23 16:22:34 -0700811
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800812 switch (state) {
813 case ServiceState.STATE_IN_SERVICE:
814 display = r.getString(R.string.radioInfo_service_in);
815 break;
816 case ServiceState.STATE_OUT_OF_SERVICE:
817 case ServiceState.STATE_EMERGENCY_ONLY:
818 display = r.getString(R.string.radioInfo_service_emergency);
819 break;
820 case ServiceState.STATE_POWER_OFF:
821 display = r.getString(R.string.radioInfo_service_off);
822 break;
823 }
johnwang342101a2009-09-23 16:22:34 -0700824
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800825 gsmState.setText(display);
johnwang342101a2009-09-23 16:22:34 -0700826
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800827 if (serviceState.getRoaming()) {
828 roamingState.setText(R.string.radioInfo_roaming_in);
829 } else {
830 roamingState.setText(R.string.radioInfo_roaming_not);
831 }
832
833 operatorName.setText(serviceState.getOperatorAlphaLong());
834 }
835
836 private final void
Nathan Harold2b77d742016-03-19 13:22:10 -0700837 updatePhoneState(int state) {
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800838 Resources r = getResources();
839 String display = r.getString(R.string.radioInfo_unknown);
840
841 switch (state) {
Nathan Harold2b77d742016-03-19 13:22:10 -0700842 case TelephonyManager.CALL_STATE_IDLE:
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800843 display = r.getString(R.string.radioInfo_phone_idle);
844 break;
Nathan Harold2b77d742016-03-19 13:22:10 -0700845 case TelephonyManager.CALL_STATE_RINGING:
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800846 display = r.getString(R.string.radioInfo_phone_ringing);
847 break;
Nathan Harold2b77d742016-03-19 13:22:10 -0700848 case TelephonyManager.CALL_STATE_OFFHOOK:
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800849 display = r.getString(R.string.radioInfo_phone_offhook);
850 break;
851 }
852
853 callState.setText(display);
854 }
855
856 private final void
857 updateDataState() {
858 int state = mTelephonyManager.getDataState();
859 Resources r = getResources();
860 String display = r.getString(R.string.radioInfo_unknown);
861
862 switch (state) {
863 case TelephonyManager.DATA_CONNECTED:
864 display = r.getString(R.string.radioInfo_data_connected);
865 break;
866 case TelephonyManager.DATA_CONNECTING:
867 display = r.getString(R.string.radioInfo_data_connecting);
868 break;
869 case TelephonyManager.DATA_DISCONNECTED:
870 display = r.getString(R.string.radioInfo_data_disconnected);
871 break;
872 case TelephonyManager.DATA_SUSPENDED:
873 display = r.getString(R.string.radioInfo_data_suspended);
874 break;
875 }
johnwang342101a2009-09-23 16:22:34 -0700876
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800877 gprsState.setText(display);
878 }
879
880 private final void updateNetworkType() {
Nathan Harolde272c202016-10-27 13:45:00 -0700881 if(phone != null) {
Nathan Harold2b77d742016-03-19 13:22:10 -0700882 ServiceState ss = phone.getServiceState();
883 dataNetwork.setText(ServiceState.rilRadioTechnologyToString(
884 phone.getServiceState().getRilDataRadioTechnology()));
885 voiceNetwork.setText(ServiceState.rilRadioTechnologyToString(
886 phone.getServiceState().getRilVoiceRadioTechnology()));
887 }
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800888 }
889
890 private final void
891 updateProperties() {
892 String s;
893 Resources r = getResources();
894
895 s = phone.getDeviceId();
johnwang342101a2009-09-23 16:22:34 -0700896 if (s == null) s = r.getString(R.string.radioInfo_unknown);
Wink Savillec3886682009-04-02 11:00:56 -0700897 mDeviceId.setText(s);
johnwang342101a2009-09-23 16:22:34 -0700898
Nathan Haroldcea413a2015-11-23 15:48:10 -0800899 //FIXME: Replace with a TelephonyManager call
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800900 s = phone.getLine1Number();
johnwang342101a2009-09-23 16:22:34 -0700901 if (s == null) s = r.getString(R.string.radioInfo_unknown);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800902 number.setText(s);
903 }
904
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800905 private final void updateDataStats2() {
906 Resources r = getResources();
907
Jeff Sharkey93029862011-05-27 18:26:15 -0700908 long txPackets = TrafficStats.getMobileTxPackets();
909 long rxPackets = TrafficStats.getMobileRxPackets();
910 long txBytes = TrafficStats.getMobileTxBytes();
911 long rxBytes = TrafficStats.getMobileRxBytes();
johnwang342101a2009-09-23 16:22:34 -0700912
Jeff Sharkey93029862011-05-27 18:26:15 -0700913 String packets = r.getString(R.string.radioInfo_display_packets);
914 String bytes = r.getString(R.string.radioInfo_display_bytes);
johnwang342101a2009-09-23 16:22:34 -0700915
Jeff Sharkey93029862011-05-27 18:26:15 -0700916 sent.setText(txPackets + " " + packets + ", " + txBytes + " " + bytes);
917 received.setText(rxPackets + " " + packets + ", " + rxBytes + " " + bytes);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800918 }
919
920 /**
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800921 * Ping a host name
922 */
923 private final void pingHostname() {
924 try {
Nathan Haroldcea413a2015-11-23 15:48:10 -0800925 try {
926 Process p4 = Runtime.getRuntime().exec("ping -c 1 www.google.com");
927 int status4 = p4.waitFor();
928 if (status4 == 0) {
929 mPingHostnameResultV4 = "Pass";
930 } else {
931 mPingHostnameResultV4 = String.format("Fail(%d)", status4);
932 }
933 } catch (IOException e) {
934 mPingHostnameResultV4 = "Fail: IOException";
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800935 }
Nathan Haroldcea413a2015-11-23 15:48:10 -0800936 try {
937 Process p6 = Runtime.getRuntime().exec("ping6 -c 1 www.google.com");
938 int status6 = p6.waitFor();
939 if (status6 == 0) {
940 mPingHostnameResultV6 = "Pass";
941 } else {
942 mPingHostnameResultV6 = String.format("Fail(%d)", status6);
943 }
944 } catch (IOException e) {
945 mPingHostnameResultV6 = "Fail: IOException";
946 }
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800947 } catch (InterruptedException e) {
Nathan Haroldcea413a2015-11-23 15:48:10 -0800948 mPingHostnameResultV4 = mPingHostnameResultV6 = "Fail: InterruptedException";
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800949 }
950 }
951
952 /**
953 * This function checks for basic functionality of HTTP Client.
954 */
955 private void httpClientTest() {
Narayan Kamathf25627c2014-12-12 13:53:28 +0000956 HttpURLConnection urlConnection = null;
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800957 try {
Narayan Kamathf25627c2014-12-12 13:53:28 +0000958 // TODO: Hardcoded for now, make it UI configurable
Alex Klyubinb0090232015-04-02 11:08:51 -0700959 URL url = new URL("https://www.google.com");
Narayan Kamathf25627c2014-12-12 13:53:28 +0000960 urlConnection = (HttpURLConnection) url.openConnection();
961 if (urlConnection.getResponseCode() == 200) {
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800962 mHttpClientTestResult = "Pass";
963 } else {
Narayan Kamathf25627c2014-12-12 13:53:28 +0000964 mHttpClientTestResult = "Fail: Code: " + urlConnection.getResponseMessage();
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800965 }
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800966 } catch (IOException e) {
967 mHttpClientTestResult = "Fail: IOException";
Narayan Kamathf25627c2014-12-12 13:53:28 +0000968 } finally {
969 if (urlConnection != null) {
970 urlConnection.disconnect();
971 }
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800972 }
973 }
974
975 private void refreshSmsc() {
Nathan Haroldcea413a2015-11-23 15:48:10 -0800976 //FIXME: Replace with a TelephonyManager call
jsh21dd4072009-05-12 11:26:55 -0700977 phone.getSmscAddress(mHandler.obtainMessage(EVENT_QUERY_SMSC_DONE));
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -0800978 }
979
Nathan Haroldcea413a2015-11-23 15:48:10 -0800980 private final void updateAllCellInfo() {
981
982 mCellInfo.setText("");
983 mNeighboringCids.setText("");
984 mLocation.setText("");
985
986 final Runnable updateAllCellInfoResults = new Runnable() {
987 public void run() {
988 updateNeighboringCids(mNeighboringCellResult);
989 updateLocation(mCellLocationResult);
990 updateCellInfo(mCellInfoResult);
991 }
992 };
993
994 Thread locThread = new Thread() {
995 @Override
996 public void run() {
997 mCellInfoResult = mTelephonyManager.getAllCellInfo();
998 mCellLocationResult = mTelephonyManager.getCellLocation();
999 mNeighboringCellResult = mTelephonyManager.getNeighboringCellInfo();
1000
1001 mHandler.post(updateAllCellInfoResults);
1002 }
1003 };
1004 locThread.start();
1005 }
1006
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001007 private final void updatePingState() {
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001008 // Set all to unknown since the threads will take a few secs to update.
Nathan Haroldcea413a2015-11-23 15:48:10 -08001009 mPingHostnameResultV4 = getResources().getString(R.string.radioInfo_unknown);
1010 mPingHostnameResultV6 = getResources().getString(R.string.radioInfo_unknown);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001011 mHttpClientTestResult = getResources().getString(R.string.radioInfo_unknown);
1012
Nathan Haroldcea413a2015-11-23 15:48:10 -08001013 mPingHostnameV4.setText(mPingHostnameResultV4);
1014 mPingHostnameV6.setText(mPingHostnameResultV6);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001015 mHttpClientTest.setText(mHttpClientTestResult);
1016
1017 final Runnable updatePingResults = new Runnable() {
1018 public void run() {
Nathan Haroldcea413a2015-11-23 15:48:10 -08001019 mPingHostnameV4.setText(mPingHostnameResultV4);
1020 mPingHostnameV6.setText(mPingHostnameResultV6);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001021 mHttpClientTest.setText(mHttpClientTestResult);
1022 }
1023 };
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001024
1025 Thread hostname = new Thread() {
1026 @Override
1027 public void run() {
1028 pingHostname();
Nathan Haroldcea413a2015-11-23 15:48:10 -08001029 mHandler.post(updatePingResults);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001030 }
1031 };
1032 hostname.start();
1033
1034 Thread httpClient = new Thread() {
1035 @Override
1036 public void run() {
1037 httpClientTest();
Nathan Haroldcea413a2015-11-23 15:48:10 -08001038 mHandler.post(updatePingResults);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001039 }
1040 };
1041 httpClient.start();
1042 }
1043
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001044 private MenuItem.OnMenuItemClickListener mViewADNCallback = new MenuItem.OnMenuItemClickListener() {
1045 public boolean onMenuItemClick(MenuItem item) {
1046 Intent intent = new Intent(Intent.ACTION_VIEW);
1047 // XXX We need to specify the component here because if we don't
1048 // the activity manager will try to resolve the type by calling
1049 // the content provider, which causes it to be loaded in a process
1050 // other than the Dialer process, which causes a lot of stuff to
1051 // break.
1052 intent.setClassName("com.android.phone",
1053 "com.android.phone.SimContacts");
1054 startActivity(intent);
1055 return true;
1056 }
1057 };
1058
1059 private MenuItem.OnMenuItemClickListener mViewFDNCallback = new MenuItem.OnMenuItemClickListener() {
1060 public boolean onMenuItemClick(MenuItem item) {
1061 Intent intent = new Intent(Intent.ACTION_VIEW);
1062 // XXX We need to specify the component here because if we don't
1063 // the activity manager will try to resolve the type by calling
1064 // the content provider, which causes it to be loaded in a process
1065 // other than the Dialer process, which causes a lot of stuff to
1066 // break.
1067 intent.setClassName("com.android.phone",
Andrew Leeda90d682014-10-31 13:12:20 -07001068 "com.android.phone.settings.fdn.FdnList");
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001069 startActivity(intent);
1070 return true;
1071 }
1072 };
1073
1074 private MenuItem.OnMenuItemClickListener mViewSDNCallback = new MenuItem.OnMenuItemClickListener() {
1075 public boolean onMenuItemClick(MenuItem item) {
1076 Intent intent = new Intent(
Wink Savillec3886682009-04-02 11:00:56 -07001077 Intent.ACTION_VIEW, Uri.parse("content://icc/sdn"));
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001078 // XXX We need to specify the component here because if we don't
1079 // the activity manager will try to resolve the type by calling
1080 // the content provider, which causes it to be loaded in a process
1081 // other than the Dialer process, which causes a lot of stuff to
1082 // break.
1083 intent.setClassName("com.android.phone",
1084 "com.android.phone.ADNList");
1085 startActivity(intent);
1086 return true;
1087 }
1088 };
1089
Nathan Harolde272c202016-10-27 13:45:00 -07001090 private MenuItem.OnMenuItemClickListener mGetImsStatus = new MenuItem.OnMenuItemClickListener() {
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001091 public boolean onMenuItemClick(MenuItem item) {
Nathan Harolde272c202016-10-27 13:45:00 -07001092 boolean isImsRegistered = phone.isImsRegistered();
1093 boolean availableVolte = phone.isVolteEnabled();
1094 boolean availableWfc = phone.isWifiCallingEnabled();
1095 boolean availableVt = phone.isVideoEnabled();
1096 boolean availableUt = phone.isUtEnabled();
1097
1098 final String imsRegString = isImsRegistered ?
1099 getString(R.string.radio_info_ims_reg_status_registered) :
1100 getString(R.string.radio_info_ims_reg_status_not_registered);
1101
1102 final String available = getString(R.string.radio_info_ims_feature_status_available);
1103 final String unavailable = getString(
1104 R.string.radio_info_ims_feature_status_unavailable);
1105
1106 String imsStatus = getString(R.string.radio_info_ims_reg_status,
1107 imsRegString,
1108 availableVolte ? available : unavailable,
1109 availableWfc ? available : unavailable,
1110 availableVt ? available : unavailable,
1111 availableUt ? available : unavailable);
1112
1113 AlertDialog imsDialog = new AlertDialog.Builder(RadioInfo.this)
1114 .setMessage(imsStatus)
1115 .setTitle(getString(R.string.radio_info_ims_reg_status_title))
1116 .create();
1117
1118 imsDialog.show();
1119
Tammo Spalinka5f4c8f2009-10-15 20:08:58 +08001120 return true;
1121 }
1122 };
1123
1124 private MenuItem.OnMenuItemClickListener mSelectBandCallback = new MenuItem.OnMenuItemClickListener() {
1125 public boolean onMenuItemClick(MenuItem item) {
1126 Intent intent = new Intent();
1127 intent.setClass(RadioInfo.this, BandMode.class);
1128 startActivity(intent);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001129 return true;
1130 }
1131 };
johnwang342101a2009-09-23 16:22:34 -07001132
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001133 private MenuItem.OnMenuItemClickListener mToggleData = new MenuItem.OnMenuItemClickListener() {
1134 public boolean onMenuItemClick(MenuItem item) {
1135 int state = mTelephonyManager.getDataState();
1136 switch (state) {
1137 case TelephonyManager.DATA_CONNECTED:
Nathan Haroldcea413a2015-11-23 15:48:10 -08001138 //FIXME: Replace with a TelephonyManager call
Robert Greenwalt0d4c5002014-05-21 20:02:32 -07001139 phone.setDataEnabled(false);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001140 break;
1141 case TelephonyManager.DATA_DISCONNECTED:
Nathan Haroldcea413a2015-11-23 15:48:10 -08001142 //FIXME: Replace with a TelephonyManager call
Robert Greenwalt0d4c5002014-05-21 20:02:32 -07001143 phone.setDataEnabled(true);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001144 break;
1145 default:
1146 // do nothing
1147 break;
1148 }
1149 return true;
1150 }
1151 };
1152
Nathan Harold2b77d742016-03-19 13:22:10 -07001153 private boolean isRadioOn() {
1154 //FIXME: Replace with a TelephonyManager call
1155 return phone.getServiceState().getState() != ServiceState.STATE_POWER_OFF;
1156 }
1157
1158 private void updateRadioPowerState() {
1159 //delightful hack to prevent on-checked-changed calls from
1160 //actually forcing the radio preference to its transient/current value.
1161 radioPowerOnSwitch.setOnCheckedChangeListener(null);
1162 radioPowerOnSwitch.setChecked(isRadioOn());
1163 radioPowerOnSwitch.setOnCheckedChangeListener(mRadioPowerOnChangeListener);
1164 }
1165
Nathan Harolde272c202016-10-27 13:45:00 -07001166 void setImsVolteProvisionedState(boolean state) {
Nathan Harold12e1f552016-06-17 13:55:38 -07001167 Log.d(TAG, "setImsVolteProvisioned state: " + ((state)? "on":"off"));
Nathan Harolde272c202016-10-27 13:45:00 -07001168 setImsConfigProvisionedState(IMS_VOLTE_PROVISIONED_CONFIG_ID, state);
Nathan Harold12e1f552016-06-17 13:55:38 -07001169 }
1170
Nathan Harolde272c202016-10-27 13:45:00 -07001171 void setImsVtProvisionedState(boolean state) {
Nathan Harold12e1f552016-06-17 13:55:38 -07001172 Log.d(TAG, "setImsVtProvisioned() state: " + ((state)? "on":"off"));
Nathan Harolde272c202016-10-27 13:45:00 -07001173 setImsConfigProvisionedState(IMS_VT_PROVISIONED_CONFIG_ID, state);
Nathan Harold12e1f552016-06-17 13:55:38 -07001174 }
1175
Nathan Harolde272c202016-10-27 13:45:00 -07001176 void setImsWfcProvisionedState(boolean state) {
Nathan Harold12e1f552016-06-17 13:55:38 -07001177 Log.d(TAG, "setImsWfcProvisioned() state: " + ((state)? "on":"off"));
Nathan Harolde272c202016-10-27 13:45:00 -07001178 setImsConfigProvisionedState(IMS_WFC_PROVISIONED_CONFIG_ID, state);
Nathan Harold12e1f552016-06-17 13:55:38 -07001179 }
1180
Meng Wang586741c2017-04-26 15:02:51 -07001181 void setEabProvisionedState(boolean state) {
1182 Log.d(TAG, "setEabProvisioned() state: " + ((state)? "on":"off"));
1183 setImsConfigProvisionedState(EAB_PROVISIONED_CONFIG_ID, state);
1184 }
1185
Nathan Harolde272c202016-10-27 13:45:00 -07001186 void setImsConfigProvisionedState(int configItem, boolean state) {
Nathan Harold12e1f552016-06-17 13:55:38 -07001187 if (phone != null && mImsManager != null) {
Philip P. Moltmann5c449ae2017-02-14 12:43:02 -08001188 QueuedWork.queue(new Runnable() {
Nathan Harold12e1f552016-06-17 13:55:38 -07001189 public void run() {
1190 try {
1191 mImsManager.getConfigInterface().setProvisionedValue(
1192 configItem,
1193 state? 1 : 0);
1194 } catch (ImsException e) {
1195 Log.e(TAG, "setImsConfigProvisioned() exception:", e);
1196 }
1197 }
Philip P. Moltmann5c449ae2017-02-14 12:43:02 -08001198 }, false);
Nathan Harold12e1f552016-06-17 13:55:38 -07001199 }
1200 }
1201
Nathan Harold2b77d742016-03-19 13:22:10 -07001202 OnCheckedChangeListener mRadioPowerOnChangeListener = new OnCheckedChangeListener() {
1203 @Override
1204 public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
1205 log("toggle radio power: currently " + (isRadioOn()?"on":"off"));
1206 phone.setRadioPower(isChecked);
1207 }
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001208 };
1209
Nathan Harold12e1f552016-06-17 13:55:38 -07001210 private boolean isImsVolteProvisioned() {
Nathan Harold2b77d742016-03-19 13:22:10 -07001211 if (phone != null && mImsManager != null) {
1212 return mImsManager.isVolteEnabledByPlatform(phone.getContext())
1213 && mImsManager.isVolteProvisionedOnDevice(phone.getContext());
Pavel Zhamaitsiakcb267a62015-01-21 18:25:14 -08001214 }
1215 return false;
1216 }
1217
Nathan Harold12e1f552016-06-17 13:55:38 -07001218 OnCheckedChangeListener mImsVolteCheckedChangeListener = new OnCheckedChangeListener() {
Wink Saville426fc662011-09-25 14:39:02 -07001219 @Override
Nathan Harold2b77d742016-03-19 13:22:10 -07001220 public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
Nathan Harold12e1f552016-06-17 13:55:38 -07001221 setImsVolteProvisionedState(isChecked);
Nathan Harolde272c202016-10-27 13:45:00 -07001222 }
Wink Saville426fc662011-09-25 14:39:02 -07001223 };
1224
Nathan Harold12e1f552016-06-17 13:55:38 -07001225 private boolean isImsVtProvisioned() {
1226 if (phone != null && mImsManager != null) {
1227 return mImsManager.isVtEnabledByPlatform(phone.getContext())
1228 && mImsManager.isVtProvisionedOnDevice(phone.getContext());
1229 }
1230 return false;
1231 }
1232
1233 OnCheckedChangeListener mImsVtCheckedChangeListener = new OnCheckedChangeListener() {
1234 @Override
1235 public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
1236 setImsVtProvisionedState(isChecked);
Nathan Harolde272c202016-10-27 13:45:00 -07001237 }
Nathan Harold12e1f552016-06-17 13:55:38 -07001238 };
1239
1240 private boolean isImsWfcProvisioned() {
1241 if (phone != null && mImsManager != null) {
1242 return mImsManager.isWfcEnabledByPlatform(phone.getContext())
1243 && mImsManager.isWfcProvisionedOnDevice(phone.getContext());
1244 }
1245 return false;
1246 }
1247
1248 OnCheckedChangeListener mImsWfcCheckedChangeListener = new OnCheckedChangeListener() {
1249 @Override
1250 public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
1251 setImsWfcProvisionedState(isChecked);
Nathan Harolde272c202016-10-27 13:45:00 -07001252 }
Nathan Harold12e1f552016-06-17 13:55:38 -07001253 };
1254
Meng Wang586741c2017-04-26 15:02:51 -07001255 private boolean isEabProvisioned() {
1256 return isFeatureProvisioned(EAB_PROVISIONED_CONFIG_ID, false);
1257 }
1258
1259 OnCheckedChangeListener mEabCheckedChangeListener = new OnCheckedChangeListener() {
1260 @Override
1261 public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
1262 setEabProvisionedState(isChecked);
1263 }
1264 };
1265
1266 private boolean isFeatureProvisioned(int featureId, boolean defaultValue) {
1267 boolean provisioned = defaultValue;
1268 if (mImsManager != null) {
1269 try {
1270 ImsConfig imsConfig = mImsManager.getConfigInterface();
1271 if (imsConfig != null) {
1272 provisioned =
1273 (imsConfig.getProvisionedValue(featureId)
1274 == ImsConfig.FeatureValueConstants.ON);
1275 }
1276 } catch (ImsException ex) {
1277 Log.e(TAG, "isFeatureProvisioned() exception:", ex);
1278 }
1279 }
1280
1281 log("isFeatureProvisioned() featureId=" + featureId + " provisioned=" + provisioned);
1282 return provisioned;
1283 }
1284
1285 private static boolean isEabEnabledByPlatform(Context context) {
1286 if (context != null) {
1287 CarrierConfigManager configManager = (CarrierConfigManager)
1288 context.getSystemService(Context.CARRIER_CONFIG_SERVICE);
1289 if (configManager != null && configManager.getConfig().getBoolean(
1290 CarrierConfigManager.KEY_USE_RCS_PRESENCE_BOOL)) {
1291 return true;
1292 }
1293 }
1294 return false;
1295 }
1296
Nathan Harold12e1f552016-06-17 13:55:38 -07001297 private void updateImsProvisionedState() {
1298 log("updateImsProvisionedState isImsVolteProvisioned()=" + isImsVolteProvisioned());
Nathan Harold2b77d742016-03-19 13:22:10 -07001299 //delightful hack to prevent on-checked-changed calls from
1300 //actually forcing the ims provisioning to its transient/current value.
Nathan Harold12e1f552016-06-17 13:55:38 -07001301 imsVolteProvisionedSwitch.setOnCheckedChangeListener(null);
1302 imsVolteProvisionedSwitch.setChecked(isImsVolteProvisioned());
1303 imsVolteProvisionedSwitch.setOnCheckedChangeListener(mImsVolteCheckedChangeListener);
Nathan Harold6dc15e92016-10-28 11:45:59 -07001304 imsVolteProvisionedSwitch.setEnabled(
1305 mImsManager.isVolteEnabledByPlatform(phone.getContext()));
Nathan Harold12e1f552016-06-17 13:55:38 -07001306
1307 imsVtProvisionedSwitch.setOnCheckedChangeListener(null);
1308 imsVtProvisionedSwitch.setChecked(isImsVtProvisioned());
1309 imsVtProvisionedSwitch.setOnCheckedChangeListener(mImsVtCheckedChangeListener);
Nathan Harold6dc15e92016-10-28 11:45:59 -07001310 imsVtProvisionedSwitch.setEnabled(
1311 mImsManager.isVtEnabledByPlatform(phone.getContext()));
Nathan Harold12e1f552016-06-17 13:55:38 -07001312
1313 imsWfcProvisionedSwitch.setOnCheckedChangeListener(null);
1314 imsWfcProvisionedSwitch.setChecked(isImsWfcProvisioned());
1315 imsWfcProvisionedSwitch.setOnCheckedChangeListener(mImsWfcCheckedChangeListener);
Nathan Harold6dc15e92016-10-28 11:45:59 -07001316 imsWfcProvisionedSwitch.setEnabled(
1317 mImsManager.isWfcEnabledByPlatform(phone.getContext()));
Meng Wang586741c2017-04-26 15:02:51 -07001318
1319 eabProvisionedSwitch.setOnCheckedChangeListener(null);
1320 eabProvisionedSwitch.setChecked(isEabProvisioned());
1321 eabProvisionedSwitch.setOnCheckedChangeListener(mEabCheckedChangeListener);
1322 eabProvisionedSwitch.setEnabled(isEabEnabledByPlatform(phone.getContext()));
Wink Saville426fc662011-09-25 14:39:02 -07001323 }
1324
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001325 OnClickListener mDnsCheckButtonHandler = new OnClickListener() {
1326 public void onClick(View v) {
Nathan Haroldcea413a2015-11-23 15:48:10 -08001327 //FIXME: Replace with a TelephonyManager call
Wink Savillec3886682009-04-02 11:00:56 -07001328 phone.disableDnsCheck(!phone.isDnsCheckDisabled());
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001329 updateDnsCheckState();
1330 }
1331 };
johnwang342101a2009-09-23 16:22:34 -07001332
Tammo Spalinka5f4c8f2009-10-15 20:08:58 +08001333 OnClickListener mOemInfoButtonHandler = new OnClickListener() {
1334 public void onClick(View v) {
1335 Intent intent = new Intent("com.android.settings.OEM_RADIO_INFO");
1336 try {
1337 startActivity(intent);
1338 } catch (android.content.ActivityNotFoundException ex) {
Wink Savillebf471282013-04-05 15:04:05 -07001339 log("OEM-specific Info/Settings Activity Not Found : " + ex);
Tammo Spalinka5f4c8f2009-10-15 20:08:58 +08001340 // If the activity does not exist, there are no OEM
1341 // settings, and so we can just do nothing...
1342 }
1343 }
1344 };
1345
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001346 OnClickListener mPingButtonHandler = new OnClickListener() {
1347 public void onClick(View v) {
1348 updatePingState();
1349 }
1350 };
1351
1352 OnClickListener mUpdateSmscButtonHandler = new OnClickListener() {
1353 public void onClick(View v) {
1354 updateSmscButton.setEnabled(false);
jsh21dd4072009-05-12 11:26:55 -07001355 phone.setSmscAddress(smsc.getText().toString(),
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001356 mHandler.obtainMessage(EVENT_UPDATE_SMSC_DONE));
1357 }
1358 };
1359
1360 OnClickListener mRefreshSmscButtonHandler = new OnClickListener() {
1361 public void onClick(View v) {
1362 refreshSmsc();
1363 }
1364 };
1365
Youhan Wangfd781e92016-12-16 15:53:16 -08001366 OnClickListener mCarrierProvisioningButtonHandler = new OnClickListener() {
1367 public void onClick(View v) {
1368 final Intent intent = new Intent();
1369 final ComponentName serviceComponent = new ComponentName("com.android.omadm.service",
1370 "DMIntentReceiver");
1371 intent.setComponent(serviceComponent);
1372 intent.setAction("com.android.settings.CARRIER_PROVISIONING");
1373 getApplicationContext().sendBroadcast(
1374 intent, android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE);
1375 }
1376 };
1377
1378 OnClickListener mTriggerCarrierProvisioningButtonHandler = new OnClickListener() {
1379 public void onClick(View v) {
1380 final Intent intent = new Intent();
1381 final ComponentName serviceComponent = new ComponentName("com.android.omadm.service",
1382 "DMIntentReceiver");
1383 intent.setComponent(serviceComponent);
1384 intent.setAction("com.android.settings.TRIGGER_CARRIER_PROVISIONING");
1385 getApplicationContext().sendBroadcast(
1386 intent, android.Manifest.permission.MODIFY_PHONE_STATE);
1387 }
1388 };
1389
Nathan Haroldcea413a2015-11-23 15:48:10 -08001390 AdapterView.OnItemSelectedListener mPreferredNetworkHandler =
1391 new AdapterView.OnItemSelectedListener() {
1392
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001393 public void onItemSelected(AdapterView parent, View v, int pos, long id) {
Nathan Haroldcea413a2015-11-23 15:48:10 -08001394 if (mPreferredNetworkTypeResult != pos && pos >= 0
1395 && pos <= mPreferredNetworkLabels.length - 2) {
1396 mPreferredNetworkTypeResult = pos;
1397 Message msg = mHandler.obtainMessage(EVENT_SET_PREFERRED_TYPE_DONE);
1398 phone.setPreferredNetworkType(mPreferredNetworkTypeResult, msg);
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001399 }
1400 }
1401
1402 public void onNothingSelected(AdapterView parent) {
1403 }
1404 };
1405
Nathan Harold2b77d742016-03-19 13:22:10 -07001406 AdapterView.OnItemSelectedListener mCellInfoRefreshRateHandler =
1407 new AdapterView.OnItemSelectedListener() {
Wink Savillebf471282013-04-05 15:04:05 -07001408
Nathan Harold2b77d742016-03-19 13:22:10 -07001409 public void onItemSelected(AdapterView parent, View v, int pos, long id) {
1410 mCellInfoRefreshRateIndex = pos;
Sooraj Sasindran5cce06b2016-08-18 15:49:49 -07001411 mTelephonyManager.setCellInfoListRate(mCellInfoRefreshRates[pos]);
Nathan Harold2b77d742016-03-19 13:22:10 -07001412 updateAllCellInfo();
1413 }
1414
1415 public void onNothingSelected(AdapterView parent) {
1416 }
1417 };
1418
The Android Open Source Projectafc4ab22009-03-03 19:32:34 -08001419}