package interdroid.swan.sensors.impl; import interdroid.swan.R; import interdroid.swan.sensors.AbstractConfigurationActivity; import interdroid.swan.sensors.AbstractSwanSensor; import android.os.Bundle; import android.telephony.PhoneStateListener; import android.telephony.SignalStrength; import android.telephony.TelephonyManager; import android.util.Log; public class SignalStrengthSensor extends AbstractSwanSensor { private static final String TAG = "SignalStrengthSensor"; /** * The configuration activity for this sensor. * * @author nick <palmer@cs.vu.nl> * */ public static class ConfigurationActivity extends AbstractConfigurationActivity { @Override public final int getPreferencesXML() { return R.xml.gsm_preferences; } } /** * The gsm signal strength field. */ public static final String GSM_SIGNAL_STRENGTH_FIELD = "gsm_signal_strength"; /** * Is this a gsm or cdma reading? */ public static final String IS_GSM_FIELD = "is_gsm"; /** * The gsm bit error rate field. */ public static final String GSM_BIT_ERROR_RATE_FIELD = "gsm_bit_error_rate"; /** * The cdma dbm field. */ public static final String CDMA_DBM_FIELD = "cdma_dbm"; /** * The cdma EC/IO value in dB*10 */ public static final String CDMA_ECIO_FIELD = "cdma_ecio"; /** * The evdo dbm field. */ public static final String EVDO_DBM_FIELD = "evdo_dbm"; /** * The evdo EC/IO value in dB*10 */ public static final String EVDO_ECIO_FIELD = "evdo_ecio"; /** * The evdo signal to noise field. */ public static final String EVDO_SNR_FIELD = "evdo_snr"; /** * The telephony manager. */ private TelephonyManager telephonyManager; /** * The phone state listener we use. */ private PhoneStateListener phoneStateListener = new PhoneStateListener() { @Override public void onSignalStrengthsChanged(SignalStrength signalStrength) { long now = System.currentTimeMillis(); if (signalStrength.isGsm()) { Log.d(TAG, "GSM Signal Strength: " + signalStrength.getGsmSignalStrength() + ", " + signalStrength.getGsmBitErrorRate()); } else { Log.d(TAG, "CDMA Signal Strength: " + signalStrength.getCdmaDbm() + ", " + signalStrength.getCdmaEcio()); } putValueTrimSize(IS_GSM_FIELD, null, now, signalStrength.isGsm()); putValueTrimSize(GSM_SIGNAL_STRENGTH_FIELD, null, now, signalStrength.getGsmSignalStrength()); putValueTrimSize(GSM_BIT_ERROR_RATE_FIELD, null, now, signalStrength.getGsmBitErrorRate()); putValueTrimSize(CDMA_DBM_FIELD, null, now, signalStrength.getCdmaDbm()); putValueTrimSize(CDMA_ECIO_FIELD, null, now, signalStrength.getCdmaEcio()); putValueTrimSize(EVDO_DBM_FIELD, null, now, signalStrength.getEvdoDbm()); putValueTrimSize(EVDO_ECIO_FIELD, null, now, signalStrength.getEvdoEcio()); putValueTrimSize(EVDO_SNR_FIELD, null, now, signalStrength.getEvdoSnr()); } }; @Override public final String[] getValuePaths() { return new String[] { IS_GSM_FIELD, GSM_SIGNAL_STRENGTH_FIELD, GSM_BIT_ERROR_RATE_FIELD, CDMA_DBM_FIELD, CDMA_ECIO_FIELD, EVDO_DBM_FIELD, EVDO_ECIO_FIELD, EVDO_SNR_FIELD }; } @Override public final void initDefaultConfiguration(Bundle defaults) { } @Override public final void onConnected() { SENSOR_NAME = "Signal Strength Sensor"; } @Override public final void register(final String id, final String valuePath, final Bundle configuration) { if (registeredConfigurations.size() == 1) { telephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE); telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS); } } @Override public final void unregister(final String id) { if (registeredConfigurations.size() == 0) { telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_NONE); } } @Override public final void onDestroySensor() { super.onDestroySensor(); } }