Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 28f89d40 authored by Daniel Sandler's avatar Daniel Sandler
Browse files

Fix the crazy RSSI icons.

Codepaths for wifi and mobile were contaminating one
another's data, which is fine when you're only showing one
at a time, but not so good in the general case.

Bug: 3481508
Bug: 5159559
Bug: 5161130
Bug: 5163206
Change-Id: I64e6f5ebd07a5b0777e7296b1c210195431e4ce6
parent f2452b99
Loading
Loading
Loading
Loading
+58 −11
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.systemui.statusbar;

import android.content.Context;
import android.util.AttributeSet;
import android.util.Slog;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
@@ -32,8 +33,16 @@ public class SignalClusterView
        extends LinearLayout 
        implements NetworkController.SignalCluster {

    static final boolean DEBUG = false;
    static final String TAG = "SignalClusterView";
    
    NetworkController mNC;

    private boolean mWifiVisible = false;
    private int mWifiStrengthId = 0, mWifiActivityId = 0;
    private boolean mMobileVisible = false;
    private int mMobileStrengthId = 0, mMobileActivityId = 0, mMobileTypeId = 0;

    ViewGroup mWifiGroup, mMobileGroup;
    ImageView mWifi, mMobile, mWifiActivity, mMobileActivity, mMobileType;

@@ -50,6 +59,7 @@ public class SignalClusterView
    }

    public void setNetworkController(NetworkController nc) {
        if (DEBUG) Slog.d(TAG, "NetworkController=" + nc);
        mNC = nc;
    }

@@ -64,37 +74,74 @@ public class SignalClusterView
        mMobile         = (ImageView) findViewById(R.id.mobile_signal);
        mMobileActivity = (ImageView) findViewById(R.id.mobile_inout);
        mMobileType     = (ImageView) findViewById(R.id.mobile_type);

        apply();
    }

    @Override
    protected void onDetachedFromWindow() {
        mWifiGroup      = null;
        mWifi           = null;
        mWifiActivity   = null;
        mMobileGroup    = null;
        mMobile         = null;
        mMobileActivity = null;
        mMobileType     = null;

        super.onDetachedFromWindow();
    }

    public void setWifiIndicators(boolean visible, int strengthIcon, int activityIcon) {
        mWifiVisible = visible;
        mWifiStrengthId = strengthIcon;
        mWifiActivityId = activityIcon;

        apply();
    }

    public void setMobileDataIndicators(boolean visible, int strengthIcon, int activityIcon,
            int typeIcon) {
        mMobileVisible = visible;
        mMobileStrengthId = strengthIcon;
        mMobileActivityId = activityIcon;
        mMobileTypeId = typeIcon;

        apply();
    }

    // Run after each indicator change.
    private void apply() {
        if (mWifiGroup == null) return;

        if (visible) {
        if (mWifiVisible) {
            mWifiGroup.setVisibility(View.VISIBLE);
            mWifi.setImageResource(strengthIcon);
            mWifiActivity.setImageResource(activityIcon);
            mWifi.setImageResource(mWifiStrengthId);
            mWifiActivity.setImageResource(mWifiActivityId);
        } else {
            mWifiGroup.setVisibility(View.GONE);
        }
    }

    public void setMobileDataIndicators(boolean visible, int strengthIcon, int activityIcon,
            int typeIcon) {
        if (mMobileGroup == null) return;
        if (DEBUG) Slog.d(TAG,
                String.format("wifi: %s sig=%d act=%d",
                    (mWifiVisible ? "VISIBLE" : "GONE"),
                    mWifiStrengthId, mWifiActivityId));

        if (visible) {
        if (mMobileVisible) {
            mMobileGroup.setVisibility(View.VISIBLE);
            mMobile.setImageResource(strengthIcon);
            mMobileActivity.setImageResource(activityIcon);
            mMobileType.setImageResource(typeIcon);
            mMobile.setImageResource(mMobileStrengthId);
            mMobileActivity.setImageResource(mMobileActivityId);
            mMobileType.setImageResource(mMobileTypeId);
        } else {
            mMobileGroup.setVisibility(View.GONE);
        }

        if (DEBUG) Slog.d(TAG,
                String.format("mobile: %s sig=%d act=%d typ=%d",
                    (mMobileVisible ? "VISIBLE" : "GONE"),
                    mMobileStrengthId, mMobileActivityId, mMobileTypeId));

        mMobileType.setVisibility(
                !mWifiVisible ? View.VISIBLE : View.GONE);
    }
}
+1 −0
Original line number Diff line number Diff line
@@ -348,6 +348,7 @@ public class PhoneStatusBar extends StatusBar {
        final SignalClusterView signalCluster = 
                (SignalClusterView)sb.findViewById(R.id.signal_cluster);
        mNetworkController.addSignalCluster(signalCluster);
        signalCluster.setNetworkController(mNetworkController);

        // Recents Panel
        updateRecentsPanel();
+80 −62
Original line number Diff line number Diff line
@@ -79,11 +79,11 @@ public class NetworkController extends BroadcastReceiver {
    String mNetworkNameDefault;
    String mNetworkNameSeparator;
    int mPhoneSignalIconId;
    int mDataDirectionIconId;
    int mDataDirectionOverlayIconId;
    int mDataDirectionIconId; // data + data direction on phones
    int mDataSignalIconId;
    int mDataTypeIconId;
    boolean mDataActive;
    int mMobileActivityIconId; // overlay arrows for data direction

    String mContentDescriptionPhoneSignal;
    String mContentDescriptionWifi;
@@ -97,6 +97,7 @@ public class NetworkController extends BroadcastReceiver {
    int mWifiLevel;
    String mWifiSsid;
    int mWifiIconId = 0;
    int mWifiActivityIconId = 0; // overlay arrows for wifi direction
    int mWifiActivity = WifiManager.DATA_ACTIVITY_NONE;

    // bluetooth
@@ -221,8 +222,17 @@ public class NetworkController extends BroadcastReceiver {
        mLabelViews.add(v);
    }

    public void addSignalCluster(SignalCluster v) {
        mSignalClusters.add(v);
    public void addSignalCluster(SignalCluster cluster) {
        mSignalClusters.add(cluster);
        cluster.setWifiIndicators(
                mWifiEnabled,
                mWifiIconId,
                mWifiActivityIconId);
        cluster.setMobileDataIndicators(
                hasMobileDataFeature(),
                mPhoneSignalIconId,
                mMobileActivityIconId,
                mDataTypeIconId);
    }

    public void setStackedMode(boolean stacked) {
@@ -670,7 +680,7 @@ public class NetworkController extends BroadcastReceiver {
            if (mDataAndWifiStacked) {
                mWifiIconId = 0;
            } else {
                mWifiIconId = WifiIcons.WIFI_SIGNAL_STRENGTH[0][0];
                mWifiIconId = mWifiEnabled ? WifiIcons.WIFI_SIGNAL_STRENGTH[0][0] : 0;
            }
            mContentDescriptionWifi = mContext.getString(R.string.accessibility_no_wifi);
        }
@@ -735,85 +745,93 @@ public class NetworkController extends BroadcastReceiver {

    // ===== Update the views =======================================================

    // figure out what to show- there should be one connected network or nothing
    // General order of preference is: wifi, 3G than bluetooth. This might vary by product.
    void refreshViews() {
        Context context = mContext;

        int combinedSignalIconId;
        int dataDirectionOverlayIconId = 0,
            wifiActivityIconId = 0,
            mobileActivityIconId = 0;
        int dataTypeIconId;
        String label;
        int combinedSignalIconId = 0;
        int combinedActivityIconId = 0;
        String label = "";
        int N;

        if (mDataConnected) {
            label = mNetworkName;
            combinedSignalIconId = mDataSignalIconId;
            switch (mDataActivity) {
                case TelephonyManager.DATA_ACTIVITY_IN:
                    mMobileActivityIconId = R.drawable.stat_sys_signal_in;
                    break;
                case TelephonyManager.DATA_ACTIVITY_OUT:
                    mMobileActivityIconId = R.drawable.stat_sys_signal_out;
                    break;
                case TelephonyManager.DATA_ACTIVITY_INOUT:
                    mMobileActivityIconId = R.drawable.stat_sys_signal_inout;
                    break;
                default:
                    mMobileActivityIconId = 0;
                    break;
            }

            combinedActivityIconId = mMobileActivityIconId;
            combinedSignalIconId = mDataSignalIconId; // set by updateDataIcon()
            mContentDescriptionCombinedSignal = mContentDescriptionDataType;
        }
        
        if (mWifiConnected) {
            if (mWifiSsid == null) {
                label = context.getString(R.string.status_bar_settings_signal_meter_wifi_nossid);
                mWifiActivityIconId = 0; // no wifis, no bits
            } else {
                label = mWifiSsid;
                switch (mWifiActivity) {
                    case WifiManager.DATA_ACTIVITY_IN:
                        dataDirectionOverlayIconId = R.drawable.stat_sys_wifi_in;
                        mWifiActivityIconId = R.drawable.stat_sys_wifi_in;
                        break;
                    case WifiManager.DATA_ACTIVITY_OUT:
                        dataDirectionOverlayIconId = R.drawable.stat_sys_wifi_out;
                        mWifiActivityIconId = R.drawable.stat_sys_wifi_out;
                        break;
                    case WifiManager.DATA_ACTIVITY_INOUT:
                        dataDirectionOverlayIconId = R.drawable.stat_sys_wifi_inout;
                        mWifiActivityIconId = R.drawable.stat_sys_wifi_inout;
                        break;
                    case WifiManager.DATA_ACTIVITY_NONE:
                        break;
                }
                wifiActivityIconId = dataDirectionOverlayIconId;
            }
            combinedSignalIconId = mWifiIconId;

            combinedActivityIconId = mWifiActivityIconId;
            combinedSignalIconId = mWifiIconId; // set by updateWifiIcons()
            mContentDescriptionCombinedSignal = mContentDescriptionWifi;
            dataTypeIconId = 0;
        } else if (mDataConnected) {
            label = mNetworkName;
            combinedSignalIconId = mDataSignalIconId;
            switch (mDataActivity) {
                case TelephonyManager.DATA_ACTIVITY_IN:
                    dataDirectionOverlayIconId = R.drawable.stat_sys_signal_in;
                    break;
                case TelephonyManager.DATA_ACTIVITY_OUT:
                    dataDirectionOverlayIconId = R.drawable.stat_sys_signal_out;
                    break;
                case TelephonyManager.DATA_ACTIVITY_INOUT:
                    dataDirectionOverlayIconId = R.drawable.stat_sys_signal_inout;
                    break;
                default:
                    dataDirectionOverlayIconId = 0;
                    break;
        }
            mobileActivityIconId = dataDirectionOverlayIconId;
            combinedSignalIconId = mDataSignalIconId;
            mContentDescriptionCombinedSignal = mContentDescriptionDataType;
            dataTypeIconId = mDataTypeIconId;
        } else if (mBluetoothTethered) {

        if (mBluetoothTethered) {
            label = mContext.getString(R.string.bluetooth_tethered);
            combinedSignalIconId = mBluetoothTetherIconId;
            mContentDescriptionCombinedSignal = mContext.getString(
                    R.string.accessibility_bluetooth_tether);
            dataTypeIconId = 0;
        } else if (mAirplaneMode &&
        }
        
        if (mAirplaneMode &&
                (mServiceState == null || (!hasService() && !mServiceState.isEmergencyOnly()))) {
            // Only display the flight-mode icon if not in "emergency calls only" mode.
            label = context.getString(R.string.status_bar_settings_signal_meter_disconnected);
            combinedSignalIconId = R.drawable.stat_sys_signal_flightmode;
            mContentDescriptionCombinedSignal = mContext.getString(
                    R.string.accessibility_airplane_mode);
            dataTypeIconId = R.drawable.stat_sys_signal_flightmode; // was 0;
        } else {
            
            // look again; your radios are now airplanes
            mPhoneSignalIconId = mDataSignalIconId = R.drawable.stat_sys_signal_flightmode;
            mDataTypeIconId = 0;

            combinedSignalIconId = mDataSignalIconId;
        }
        else if (!mDataConnected && !mWifiConnected && !mBluetoothTethered) {
            // pretty much totally disconnected

            label = context.getString(R.string.status_bar_settings_signal_meter_disconnected);
            // On devices without mobile radios, we want to show the wifi icon
            combinedSignalIconId =
                hasMobileDataFeature() ? mDataSignalIconId : mWifiIconId;
            mContentDescriptionCombinedSignal = hasMobileDataFeature()
                ? mContentDescriptionDataType : mContentDescriptionWifi;
            dataTypeIconId = 0;
            mDataTypeIconId = 0;
        }

        if (DEBUG) {
@@ -825,7 +843,7 @@ public class NetworkController extends BroadcastReceiver {
                    + " combinedSignalIconId=0x"
                    + Integer.toHexString(combinedSignalIconId)
                    + "/" + getResourceName(combinedSignalIconId)
                    + " dataDirectionOverlayIconId=0x" + Integer.toHexString(dataDirectionOverlayIconId)
                    + " combinedActivityIconId=0x" + Integer.toHexString(combinedActivityIconId)
                    + " mAirplaneMode=" + mAirplaneMode
                    + " mDataActivity=" + mDataActivity
                    + " mPhoneSignalIconId=0x" + Integer.toHexString(mPhoneSignalIconId)
@@ -837,21 +855,21 @@ public class NetworkController extends BroadcastReceiver {
        }

        if (mLastPhoneSignalIconId          != mPhoneSignalIconId
         || mLastDataDirectionOverlayIconId != dataDirectionOverlayIconId
         || mLastDataDirectionOverlayIconId != combinedActivityIconId
         || mLastWifiIconId                 != mWifiIconId
         || mLastDataTypeIconId             != dataTypeIconId)
         || mLastDataTypeIconId             != mDataTypeIconId)
        {
            // NB: the mLast*s will be updated later
            for (SignalCluster cluster : mSignalClusters) {
                cluster.setWifiIndicators(
                        mWifiEnabled,
                        mWifiIconId,
                        wifiActivityIconId);
                        mWifiActivityIconId);
                cluster.setMobileDataIndicators(
                        hasMobileDataFeature(),
                        mPhoneSignalIconId,
                        mobileActivityIconId,
                        dataTypeIconId);
                        mMobileActivityIconId,
                        mDataTypeIconId);
            }
        }

@@ -905,35 +923,35 @@ public class NetworkController extends BroadcastReceiver {
        }

        // the data network type overlay
        if (mLastDataTypeIconId != dataTypeIconId) {
            mLastDataTypeIconId = dataTypeIconId;
        if (mLastDataTypeIconId != mDataTypeIconId) {
            mLastDataTypeIconId = mDataTypeIconId;
            N = mDataTypeIconViews.size();
            for (int i=0; i<N; i++) {
                final ImageView v = mDataTypeIconViews.get(i);
                if (dataTypeIconId == 0) {
                if (mDataTypeIconId == 0) {
                    v.setVisibility(View.INVISIBLE);
                } else {
                    v.setVisibility(View.VISIBLE);
                    v.setImageResource(dataTypeIconId);
                    v.setImageResource(mDataTypeIconId);
                    v.setContentDescription(mContentDescriptionDataType);
                }
            }
        }

        // the data direction overlay
        if (mLastDataDirectionOverlayIconId != dataDirectionOverlayIconId) {
        if (mLastDataDirectionOverlayIconId != combinedActivityIconId) {
            if (DEBUG) {
                Slog.d(TAG, "changing data overlay icon id to " + dataDirectionOverlayIconId);
                Slog.d(TAG, "changing data overlay icon id to " + combinedActivityIconId);
            }
            mLastDataDirectionOverlayIconId = dataDirectionOverlayIconId;
            mLastDataDirectionOverlayIconId = combinedActivityIconId;
            N = mDataDirectionOverlayIconViews.size();
            for (int i=0; i<N; i++) {
                final ImageView v = mDataDirectionOverlayIconViews.get(i);
                if (dataDirectionOverlayIconId == 0) {
                if (combinedActivityIconId == 0) {
                    v.setVisibility(View.INVISIBLE);
                } else {
                    v.setVisibility(View.VISIBLE);
                    v.setImageResource(dataDirectionOverlayIconId);
                    v.setImageResource(combinedActivityIconId);
                    v.setContentDescription(mContentDescriptionDataType);
                }
            }