package com.googlecode.android_scripting.facade; import android.app.Service; import android.content.Context; import android.os.Bundle; import android.telephony.PhoneStateListener; import android.telephony.SignalStrength; import android.telephony.TelephonyManager; import com.googlecode.android_scripting.MainThread; import com.googlecode.android_scripting.jsonrpc.RpcReceiver; import com.googlecode.android_scripting.rpc.Rpc; import com.googlecode.android_scripting.rpc.RpcMinSdk; import com.googlecode.android_scripting.rpc.RpcStartEvent; import com.googlecode.android_scripting.rpc.RpcStopEvent; import java.util.concurrent.Callable; /** * Exposes SignalStrength functionality. * * @author Joerg Zieren (joerg.zieren@gmail.com) */ @RpcMinSdk(7) public class SignalStrengthFacade extends RpcReceiver { private final Service mService; private final TelephonyManager mTelephonyManager; private final EventFacade mEventFacade; private final PhoneStateListener mPhoneStateListener; private Bundle mSignalStrengths; public SignalStrengthFacade(FacadeManager manager) { super(manager); mService = manager.getService(); mEventFacade = manager.getReceiver(EventFacade.class); mTelephonyManager = (TelephonyManager) manager.getService().getSystemService(Context.TELEPHONY_SERVICE); mPhoneStateListener = MainThread.run(mService, new Callable<PhoneStateListener>() { @Override public PhoneStateListener call() throws Exception { return new PhoneStateListener() { @Override public void onSignalStrengthsChanged(SignalStrength signalStrength) { mSignalStrengths = new Bundle(); mSignalStrengths.putInt("gsm_signal_strength", signalStrength.getGsmSignalStrength()); mSignalStrengths.putInt("gsm_bit_error_rate", signalStrength.getGsmBitErrorRate()); mSignalStrengths.putInt("cdma_dbm", signalStrength.getCdmaDbm()); mSignalStrengths.putInt("cdma_ecio", signalStrength.getCdmaEcio()); mSignalStrengths.putInt("evdo_dbm", signalStrength.getEvdoDbm()); mSignalStrengths.putInt("evdo_ecio", signalStrength.getEvdoEcio()); mEventFacade.postEvent("signal_strengths", mSignalStrengths.clone()); } }; } }); } @Rpc(description = "Starts tracking signal strengths.") @RpcStartEvent("signal_strengths") public void startTrackingSignalStrengths() { mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS); } @Rpc(description = "Returns the current signal strengths.", returns = "A map of \"gsm_signal_strength\"") public Bundle readSignalStrengths() { return mSignalStrengths; } @Rpc(description = "Stops tracking signal strength.") @RpcStopEvent("signal_strengths") public void stopTrackingSignalStrengths() { mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE); } @Override public void shutdown() { stopTrackingSignalStrengths(); } }