package com.android.systemui.statusbar.policy; import java.lang.ref.WeakReference; import com.android.internal.telephony.PhoneStateIntentReceiver; import android.R.integer; import android.content.ContentResolver; import android.content.Context; import android.content.res.Resources; import android.database.ContentObserver; import android.os.Handler; import android.os.Message; import android.provider.Settings; import android.telephony.PhoneStateListener; import android.telephony.ServiceState; import android.telephony.SignalStrength; import android.telephony.TelephonyManager; import android.text.Spannable; import android.text.SpannableStringBuilder; import android.text.style.CharacterStyle; import android.text.style.RelativeSizeSpan; import android.util.AttributeSet; import android.util.Log; import android.view.View; import android.widget.TextView; public class SignalText extends TextView { private static final String TAG = "SignalText"; int dBm = 0; int ASU = 0; private SignalStrength signal; private boolean mAttached; private boolean mInAirplaneMode; private static final int STYLE_HIDE = 0; private static final int STYLE_SHOW = 1; private static final int STYLE_SHOW_DBM = 2; private static final int EVENT_SIGNAL_STRENGTH_CHANGED = 200; private int style; private Handler mHandler; private Context mContext; protected int mSignalColor = com.android.internal.R.color.holo_blue_light; private PhoneStateIntentReceiver mPhoneStateReceiver; private SignalText mSignalText; private static class MyHandler extends Handler { private WeakReference<SignalText> mSignalText; public MyHandler(SignalText activity) { mSignalText = new WeakReference<SignalText>(activity); } @Override public void handleMessage(Message msg) { SignalText st = mSignalText.get(); if (st == null) { return; } if (msg.what == EVENT_SIGNAL_STRENGTH_CHANGED) { st.updateSignalStrength(); } } } public SignalText(Context context) { this(context, null); } public SignalText(Context context, AttributeSet attrs) { this(context, attrs, 0); } public SignalText(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); mContext = context; } @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); if (!mAttached) { mAttached = true; mHandler = new MyHandler(this); SettingsObserver settingsObserver = new SettingsObserver(mHandler); settingsObserver.observe(); mPhoneStateReceiver = new PhoneStateIntentReceiver(mContext, mHandler); mPhoneStateReceiver.notifySignalStrength(EVENT_SIGNAL_STRENGTH_CHANGED); mPhoneStateReceiver.registerIntent(); updateSettings(); } } @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); if (mAttached) { mAttached = false; mPhoneStateReceiver.unregisterIntent(); } } class SettingsObserver extends ContentObserver { SettingsObserver(Handler handler) { super(handler); } void observe() { ContentResolver resolver = mContext.getContentResolver(); resolver.registerContentObserver( Settings.System.getUriFor(Settings.System.STATUSBAR_SIGNAL_TEXT), false, this); resolver.registerContentObserver( Settings.System.getUriFor(Settings.System.STATUSBAR_SIGNAL_TEXT_COLOR), false, this); } @Override public void onChange(boolean selfChange) { updateSettings(); } } private void updateSettings() { ContentResolver resolver = getContext().getContentResolver(); mSignalColor = Settings.System.getInt(resolver, Settings.System.STATUSBAR_SIGNAL_TEXT_COLOR, 0xFF33B5E5); if (mSignalColor == Integer.MIN_VALUE) { // flag to reset the color mSignalColor = 0xFF33B5E5; } setTextColor(mSignalColor); updateSignalText(); } public void updateSignalStrength() { dBm = mPhoneStateReceiver.getSignalStrengthDbm(); if (-1 == dBm) dBm = 0; ASU = mPhoneStateReceiver.getSignalStrengthLevelAsu(); if (-1 == ASU) ASU = 0; updateSignalText(); } private void updateSignalText() { style = Settings.System.getInt(getContext().getContentResolver(), Settings.System.STATUSBAR_SIGNAL_TEXT, STYLE_HIDE); if (style == STYLE_SHOW) { String result = Integer.toString(dBm); setText(result + " "); } else if (style == STYLE_SHOW_DBM) { String result = Integer.toString(dBm) + " dBm "; SpannableStringBuilder formatted = new SpannableStringBuilder(result); int start = result.indexOf("d"); CharacterStyle style = new RelativeSizeSpan(0.7f); formatted.setSpan(style, start, start + 3, Spannable.SPAN_EXCLUSIVE_INCLUSIVE); setText(formatted); } } }