package com.android.systemui.statusbar.policy; import android.R.integer; import android.content.BroadcastReceiver; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.res.Resources; import android.database.ContentObserver; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; import android.os.Handler; import android.os.Message; import android.provider.Settings; 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 WifiText extends TextView { private static final String TAG = "WiFiText"; private int mRssi; private boolean mAttached; private boolean mInAirplaneMode; private static final int STYLE_HIDE = 0; private static final int STYLE_SHOW = 1; private int style; private Handler mHandler; private Context mContext; private WifiManager mWifiManager; protected int mSignalColor = com.android.internal.R.color.holo_blue_light; public WifiText(Context context) { this(context, null); } public WifiText(Context context, AttributeSet attrs) { this(context, attrs, 0); } public WifiText(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); mContext = context; } public BroadcastReceiver rssiReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { mRssi = mWifiManager.getConnectionInfo().getRssi(); Log.d(TAG, "RSSI changed"); updateSignalText(); } }; @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); if (!mAttached) { mAttached = true; mHandler = new Handler(); SettingsObserver settingsObserver = new SettingsObserver(mHandler); settingsObserver.observe(); mWifiManager = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE); mContext.registerReceiver(rssiReceiver, new IntentFilter(WifiManager.RSSI_CHANGED_ACTION)); updateSettings(); } } @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); if (mAttached) { mAttached = false; mContext.unregisterReceiver(rssiReceiver); } } class SettingsObserver extends ContentObserver { SettingsObserver(Handler handler) { super(handler); } void observe() { ContentResolver resolver = mContext.getContentResolver(); resolver.registerContentObserver( Settings.System.getUriFor(Settings.System.STATUSBAR_WIFI_SIGNAL_TEXT), false, this); resolver.registerContentObserver( Settings.System.getUriFor(Settings.System.STATUSBAR_WIFI_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_WIFI_SIGNAL_TEXT_COLOR, 0xFF33B5E5); if (mSignalColor == Integer.MIN_VALUE) { // flag to reset the color mSignalColor = 0xFF33B5E5; } setTextColor(mSignalColor); updateSignalText(); } private void updateSignalText() { style = Settings.System.getInt(getContext().getContentResolver(), Settings.System.STATUSBAR_WIFI_SIGNAL_TEXT, STYLE_HIDE); if (style == STYLE_SHOW) { String result = Integer.toString(mRssi); setText(result + " "); } } }