/* * Copyright (C) 2011 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.wireless.tests; import com.android.tradefed.device.DeviceNotAvailableException; import com.android.tradefed.device.ITestDevice; import com.android.tradefed.log.LogUtil.CLog; import com.android.tradefed.util.IRunUtil; import com.android.tradefed.util.RunUtil; /** Helper class to get device radio settings */ public class RadioHelper { private static final String[] PING_SERVER_LIST = { "www.google.com", "www.facebook.com", "www.bing.com", "www.ask.com", "www.yahoo.com" }; private static final int RETRY_ATTEMPTS = 3; private static final int ACTIVATION_WAITING_TIME = 5 * 60 * 1000; // 5 minutes; private static final String WIFI_ONLY = "wifi-only"; /* Maximum time to wait for device to connect to data network */ public static final int MAX_DATA_SETUP_TIME = 3 * 60 * 1000; // 3 minutes private ITestDevice mDevice; RadioHelper(ITestDevice device) { mDevice = device; } /** Gets the {@link IRunUtil} instance to use. */ IRunUtil getRunUtil() { return RunUtil.getDefault(); } /** Get phone type 0 - None, 1 - GSM, 2 - CDMA */ private String getPhoneType() throws DeviceNotAvailableException { return mDevice.getProperty("gsm.current.phone-type"); } /** Get sim state */ private String getSimState() throws DeviceNotAvailableException { return mDevice.getProperty("gsm.sim.state"); } /** * Verify whether a device is a CDMA only device * * @return true for CDMA only device, false for GSM or LTE device * @throws DeviceNotAvailableException */ public boolean isCdmaDevice() throws DeviceNotAvailableException { // Wait 30 seconds for SIM to load getRunUtil().sleep(30 * 1000); String phoneType = null; String simState = null; for (int i = 0; i < RETRY_ATTEMPTS && (phoneType == null || simState == null); i++) { phoneType = getPhoneType(); simState = getSimState(); CLog.d("phonetype: %s", phoneType); CLog.d("gsm.sim.state: %s", simState); RunUtil.getDefault().sleep(5 * 1000); } if (phoneType == null || simState == null) { CLog.d("Error: phoneType or simState is null."); return false; } if ((phoneType.compareToIgnoreCase("2") == 0) && (simState.compareToIgnoreCase("UNKNOWN") == 0)) { // GSM device as phoneType "1" // LTE device should have SIM state set to "READY" CLog.d("it is a CDMA device, return true"); return true; } return false; } /** Verify whether a device is a Wi-Fi only device (e.g. Wingray) */ public boolean isWifiOnlyDevice() throws DeviceNotAvailableException { return mDevice.getProperty("ro.carrier").contains(WIFI_ONLY); } public void resetBootComplete() throws DeviceNotAvailableException { mDevice.executeShellCommand("setprop dev.bootcomplete 0"); } public boolean pingTest() throws DeviceNotAvailableException { String failString = "ping: unknown host"; // assume the chance that all servers are down is very small for (int i = 0; i < PING_SERVER_LIST.length; i++) { String host = PING_SERVER_LIST[i]; CLog.d("Start ping test, ping %s", host); String res = mDevice.executeShellCommand("ping -c 10 -w 100 " + host); if (!res.contains(failString)) { return true; } } return false; } /** * Activate a device if it is needed. * * @return true if the activation is successful. * @throws DeviceNotAvailableException */ public boolean radioActivation() throws DeviceNotAvailableException { if (isWifiOnlyDevice()) { return true; } if (!isCdmaDevice()) { // for GSM device and LTE device CLog.d("not a CDMA device, no need to activiate the device"); return true; } else if (pingTest()) { // for CDMA device which has been activiated (e.g. no radio updates) CLog.d("CDMA device has been activated."); return true; } // Activate a CDMA device which doesn't have data connection yet for (int i = 0; i < RETRY_ATTEMPTS; i++) { mDevice.executeShellCommand("radiooptions 8 *22899"); long startTime = System.currentTimeMillis(); while ((System.currentTimeMillis() - startTime) < ACTIVATION_WAITING_TIME) { getRunUtil().sleep(30 * 1000); if (pingTest()) { return true; } } } return false; } /** * Wait for device data setup * * @return true if data setup succeeded, false otherwise */ public boolean waitForDataSetup() throws DeviceNotAvailableException { long startTime = System.currentTimeMillis(); while ((System.currentTimeMillis() - startTime) < MAX_DATA_SETUP_TIME) { getRunUtil().sleep(30 * 1000); if (pingTest()) { return true; } } return false; } }