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

Commit ec52c98d authored by Robert Greenwalt's avatar Robert Greenwalt Committed by Android Git Automerger
Browse files

am 0727a865: Merge "Add network condition reporting." into gingerbread

Merge commit '0727a865' into gingerbread-plus-aosp

* commit '0727a865':
  Add network condition reporting.
parents c2eff4a7 0727a865
Loading
Loading
Loading
Loading
+21 −1
Original line number Diff line number Diff line
@@ -105,6 +105,14 @@ public class ConnectivityManager
     * it with {@link android.content.Intent#getStringExtra(String)}.
     */
    public static final String EXTRA_EXTRA_INFO = "extraInfo";
    /**
     * The lookup key for an int that provides information about
     * our connection to the internet at large.  0 indicates no connection,
     * 100 indicates a great connection.  Retrieve it with
     * {@link android.content.Intent@getIntExtra(String)}.
     * {@hide}
     */
    public static final String EXTRA_INET_CONDITION = "inetCondition";

    /**
     * Broadcast Action: The setting for background data usage has changed
@@ -549,4 +557,16 @@ public class ConnectivityManager
            return TETHER_ERROR_SERVICE_UNAVAIL;
        }
    }

    /**
     * @param networkType The type of network you want to report on
     * @param percentage The quality of the connection 0 is bad, 100 is good
     * {@hide}
     */
    public void reportInetCondition(int networkType, int percentage) {
        try {
            mService.reportInetCondition(networkType, percentage);
        } catch (RemoteException e) {
        }
    }
}
+2 −0
Original line number Diff line number Diff line
@@ -74,4 +74,6 @@ interface IConnectivityManager
    String[] getTetherableUsbRegexs();

    String[] getTetherableWifiRegexs();

    void reportInetCondition(int networkType, int percentage);
}
+9 −0
Original line number Diff line number Diff line
@@ -63,6 +63,15 @@ public abstract class NetworkStateTracker extends Handler {
    public static final int EVENT_ROAMING_CHANGED = 5;
    public static final int EVENT_NETWORK_SUBTYPE_CHANGED = 6;
    public static final int EVENT_RESTORE_DEFAULT_NETWORK = 7;
    /**
     * arg1: network type
     * arg2: condition (0 bad, 100 good)
     */
    public static final int EVENT_INET_CONDITION_CHANGE = 8;
    /**
     * arg1: network type
     */
    public static final int EVENT_INET_CONDITION_HOLD_END = 9;

    public NetworkStateTracker(Context context,
            Handler target,
+15 −0
Original line number Diff line number Diff line
@@ -3427,6 +3427,21 @@ public final class Settings {
        public static final String DOWNLOAD_MAX_BYTES_OVER_MOBILE =
                "download_manager_max_bytes_over_mobile";

        /**
         * ms during which to consume extra events related to Inet connection condition
         * after a transtion to fully-connected
         * @hide
         */
        public static final String INET_CONDITION_DEBOUNCE_UP_DELAY =
                "inet_condition_debounce_up_delay";

        /**
         * ms during which to consume extra events related to Inet connection condtion
         * after a transtion to partly-connected
         * @hide
         */
        public static final String INET_CONDITION_DEBOUNCE_DOWN_DELAY =
                "inet_condition_debounce_down_delay";

        /**
         * @hide
+122 −72
Original line number Diff line number Diff line
@@ -36,6 +36,7 @@ import android.location.LocationManager;
import android.media.AudioManager;
import android.media.Ringtone;
import android.media.RingtoneManager;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.Uri;
import android.net.wifi.WifiManager;
@@ -91,6 +92,8 @@ public class StatusBarPolicy {

    private static final int AM_PM_STYLE = AM_PM_STYLE_GONE;

    private static final int INET_CONDITION_THRESHOLD = 50;

    private final Context mContext;
    private final StatusBarManager mService;
    private final Handler mHandler = new StatusBarHandler();
@@ -232,41 +235,61 @@ public class StatusBarPolicy {
    };

    //***** Data connection icons
    private int[] mDataIconList = sDataNetType_g;
    private int[] mDataIconList = sDataNetType_g[0];
    //GSM/UMTS
    private static final int[] sDataNetType_g = new int[] {
            R.drawable.stat_sys_data_connected_g,
    private static final int[][] sDataNetType_g = {
            { R.drawable.stat_sys_data_connected_g,
              R.drawable.stat_sys_data_in_g,
              R.drawable.stat_sys_data_out_g,
            R.drawable.stat_sys_data_inandout_g,
              R.drawable.stat_sys_data_inandout_g },
            { R.drawable.stat_sys_roaming_cdma_0,
              R.drawable.stat_sys_roaming_cdma_0,
              R.drawable.stat_sys_roaming_cdma_0,
              R.drawable.stat_sys_roaming_cdma_0 }
        };
    private static final int[] sDataNetType_3g = new int[] {
            R.drawable.stat_sys_data_connected_3g,
    private static final int[][] sDataNetType_3g = {
            { R.drawable.stat_sys_data_connected_3g,
              R.drawable.stat_sys_data_in_3g,
              R.drawable.stat_sys_data_out_3g,
            R.drawable.stat_sys_data_inandout_3g,
              R.drawable.stat_sys_data_inandout_3g },
            { R.drawable.stat_sys_roaming_cdma_0,
              R.drawable.stat_sys_roaming_cdma_0,
              R.drawable.stat_sys_roaming_cdma_0,
              R.drawable.stat_sys_roaming_cdma_0 }
        };
    private static final int[] sDataNetType_e = new int[] {
            R.drawable.stat_sys_data_connected_e,
    private static final int[][] sDataNetType_e = {
            { R.drawable.stat_sys_data_connected_e,
              R.drawable.stat_sys_data_in_e,
              R.drawable.stat_sys_data_out_e,
            R.drawable.stat_sys_data_inandout_e,
              R.drawable.stat_sys_data_inandout_e },
            { R.drawable.stat_sys_roaming_cdma_0,
              R.drawable.stat_sys_roaming_cdma_0,
              R.drawable.stat_sys_roaming_cdma_0,
              R.drawable.stat_sys_roaming_cdma_0 }
        };
    //3.5G
    private static final int[] sDataNetType_h = new int[] {
            R.drawable.stat_sys_data_connected_h,
    private static final int[][] sDataNetType_h = {
            { R.drawable.stat_sys_data_connected_h,
              R.drawable.stat_sys_data_in_h,
              R.drawable.stat_sys_data_out_h,
            R.drawable.stat_sys_data_inandout_h,
              R.drawable.stat_sys_data_inandout_h },
            { R.drawable.stat_sys_roaming_cdma_0,
              R.drawable.stat_sys_roaming_cdma_0,
              R.drawable.stat_sys_roaming_cdma_0,
              R.drawable.stat_sys_roaming_cdma_0 }
    };

    //CDMA
    // Use 3G icons for EVDO data and 1x icons for 1XRTT data
    private static final int[] sDataNetType_1x = new int[] {
        R.drawable.stat_sys_data_connected_1x,
    private static final int[][] sDataNetType_1x = {
            { R.drawable.stat_sys_data_connected_1x,
              R.drawable.stat_sys_data_in_1x,
              R.drawable.stat_sys_data_out_1x,
        R.drawable.stat_sys_data_inandout_1x,
              R.drawable.stat_sys_data_inandout_1x },
            { R.drawable.stat_sys_roaming_cdma_0,
              R.drawable.stat_sys_roaming_cdma_0,
              R.drawable.stat_sys_roaming_cdma_0,
              R.drawable.stat_sys_roaming_cdma_0 }
            };

    // Assume it's all good unless we hear otherwise.  We don't always seem
@@ -292,17 +315,22 @@ public class StatusBarPolicy {
    private boolean mBluetoothEnabled;

    // wifi
    private static final int[] sWifiSignalImages = new int[] {
            R.drawable.stat_sys_wifi_signal_1,
    private static final int[][] sWifiSignalImages = {
            { R.drawable.stat_sys_wifi_signal_1,
              R.drawable.stat_sys_wifi_signal_2,
              R.drawable.stat_sys_wifi_signal_3,
            R.drawable.stat_sys_wifi_signal_4,
              R.drawable.stat_sys_wifi_signal_4 },
            { R.drawable.stat_sys_data_in_e,
              R.drawable.stat_sys_data_in_e,
              R.drawable.stat_sys_data_in_e,
              R.drawable.stat_sys_data_in_e }
        };
    private static final int sWifiTemporarilyNotConnectedImage =
            R.drawable.stat_sys_wifi_signal_0;

    private int mLastWifiSignalLevel = -1;
    private boolean mIsWifiConnected = false;
    private int mLastWifiInetConnectivityState = 0;

    // sync state
    // If sync is active the SyncActive icon is displayed. If sync is not active but
@@ -353,6 +381,10 @@ public class StatusBarPolicy {
            else if (action.equals(TtyIntent.TTY_ENABLED_CHANGE_ACTION)) {
                updateTTY(intent);
            }
            else if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
                // TODO - stop using other means to get wifi/mobile info
                updateConnectivity(intent);
            }
        }
    };

@@ -389,7 +421,7 @@ public class StatusBarPolicy {
        mService.setIconVisibility("data_connection", false);

        // wifi
        mService.setIcon("wifi", sWifiSignalImages[0], 0);
        mService.setIcon("wifi", sWifiSignalImages[0][0], 0);
        mService.setIconVisibility("wifi", false);
        // wifi will get updated by the sticky intents

@@ -456,6 +488,7 @@ public class StatusBarPolicy {
        filter.addAction(LocationManager.GPS_FIX_CHANGE_ACTION);
        filter.addAction(TelephonyIntents.ACTION_SIM_STATE_CHANGED);
        filter.addAction(TtyIntent.TTY_ENABLED_CHANGE_ACTION);
        filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
        mContext.registerReceiver(mIntentReceiver, filter, null, mHandler);

        // load config to determine if to distinguish Hspa data icon
@@ -659,6 +692,50 @@ public class StatusBarPolicy {
        }
    }

    private void updateConnectivity(Intent intent) {
        NetworkInfo info = (NetworkInfo)(intent.getParcelableExtra(
                ConnectivityManager.EXTRA_NETWORK_INFO));
        int connectionStatus = intent.getIntExtra(ConnectivityManager.EXTRA_INET_CONDITION, 0);
        Slog.d(TAG, "got CONNECTIVITY_ACTION - info=" + info + ", status = " + connectionStatus);
        if (info.isConnected() == false) return;

        switch (info.getType()) {
        case ConnectivityManager.TYPE_MOBILE:
            if (info.isConnected()) {
                updateDataNetType(info.getSubtype(), connectionStatus);
                updateDataIcon();
            }
            break;
        case ConnectivityManager.TYPE_WIFI:
            if (info.isConnected()) {
                mIsWifiConnected = true;
                mLastWifiInetConnectivityState =
                        (connectionStatus > INET_CONDITION_THRESHOLD ? 1 : 0);
                int iconId;
                if (mLastWifiSignalLevel == -1) {
                    iconId = sWifiSignalImages[mLastWifiInetConnectivityState][0];
                } else {
                    iconId = sWifiSignalImages[mLastWifiInetConnectivityState]
                            [mLastWifiSignalLevel];
                }

                mService.setIcon("wifi", iconId, 0);
                // Show the icon since wi-fi is connected
                mService.setIconVisibility("wifi", true);
            } else {
                mLastWifiSignalLevel = -1;
                mIsWifiConnected = false;
                mLastWifiInetConnectivityState = 0;
                int iconId = sWifiSignalImages[0][0];

                mService.setIcon("wifi", iconId, 0);
                // Hide the icon since we're not connected
                mService.setIconVisibility("wifi", false);
            }
            break;
        }
    }

    private PhoneStateListener mPhoneStateListener = new PhoneStateListener() {
        @Override
        public void onSignalStrengthsChanged(SignalStrength signalStrength) {
@@ -686,7 +763,7 @@ public class StatusBarPolicy {
        @Override
        public void onDataConnectionStateChanged(int state, int networkType) {
            mDataState = state;
            updateDataNetType(networkType);
            updateDataNetType(networkType, 0);
            updateDataIcon();
        }

@@ -848,37 +925,38 @@ public class StatusBarPolicy {
        return (levelEvdoDbm < levelEvdoSnr) ? levelEvdoDbm : levelEvdoSnr;
    }

    private final void updateDataNetType(int net) {
    private final void updateDataNetType(int net, int inetCondition) {
        int connected = (inetCondition > INET_CONDITION_THRESHOLD ? 1 : 0);
        switch (net) {
        case TelephonyManager.NETWORK_TYPE_EDGE:
            mDataIconList = sDataNetType_e;
            mDataIconList = sDataNetType_e[connected];
            break;
        case TelephonyManager.NETWORK_TYPE_UMTS:
            mDataIconList = sDataNetType_3g;
            mDataIconList = sDataNetType_3g[connected];
            break;
        case TelephonyManager.NETWORK_TYPE_HSDPA:
        case TelephonyManager.NETWORK_TYPE_HSUPA:
        case TelephonyManager.NETWORK_TYPE_HSPA:
            if (mHspaDataDistinguishable) {
                mDataIconList = sDataNetType_h;
                mDataIconList = sDataNetType_h[connected];
            } else {
                mDataIconList = sDataNetType_3g;
                mDataIconList = sDataNetType_3g[connected];
            }
            break;
        case TelephonyManager.NETWORK_TYPE_CDMA:
            // display 1xRTT for IS95A/B
            mDataIconList = this.sDataNetType_1x;
            mDataIconList = sDataNetType_1x[connected];
            break;
        case TelephonyManager.NETWORK_TYPE_1xRTT:
            mDataIconList = this.sDataNetType_1x;
            mDataIconList = sDataNetType_1x[connected];
            break;
        case TelephonyManager.NETWORK_TYPE_EVDO_0: //fall through
        case TelephonyManager.NETWORK_TYPE_EVDO_A:
        case TelephonyManager.NETWORK_TYPE_EVDO_B:
            mDataIconList = sDataNetType_3g;
            mDataIconList = sDataNetType_3g[connected];
            break;
        default:
            mDataIconList = sDataNetType_g;
            mDataIconList = sDataNetType_g[connected];
        break;
        }
    }
@@ -1019,34 +1097,6 @@ public class StatusBarPolicy {
            if (!enabled) {
                mService.setIconVisibility("wifi", false);
            }
        } else if (action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {

            final NetworkInfo networkInfo = (NetworkInfo)
                    intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);

            int iconId;
            if (networkInfo != null && networkInfo.isConnected()) {
                mIsWifiConnected = true;
                if (mLastWifiSignalLevel == -1) {
                    iconId = sWifiSignalImages[0];
                } else {
                    iconId = sWifiSignalImages[mLastWifiSignalLevel];
                }

                mService.setIcon("wifi", iconId, 0);
                // Show the icon since wi-fi is connected
                mService.setIconVisibility("wifi", true);

            } else {
                mLastWifiSignalLevel = -1;
                mIsWifiConnected = false;
                iconId = sWifiSignalImages[0];

                mService.setIcon("wifi", iconId, 0);
                // Hide the icon since we're not connected
                mService.setIconVisibility("wifi", false);
            }

        } else if (action.equals(WifiManager.RSSI_CHANGED_ACTION)) {
            int iconId;
            final int newRssi = intent.getIntExtra(WifiManager.EXTRA_NEW_RSSI, -200);
@@ -1055,7 +1105,7 @@ public class StatusBarPolicy {
            if (newSignalLevel != mLastWifiSignalLevel) {
                mLastWifiSignalLevel = newSignalLevel;
                if (mIsWifiConnected) {
                    iconId = sWifiSignalImages[newSignalLevel];
                    iconId = sWifiSignalImages[mLastWifiInetConnectivityState][newSignalLevel];
                } else {
                    iconId = sWifiTemporarilyNotConnectedImage;
                }
Loading