Merge commit 'f9ca318a3d2aceaf5c9e54610073a9017442be9b' into HEAD
diff --git a/res/layout/preference_linearcolor.xml b/res/layout/preference_linearcolor.xml
index d3a2603..754558d 100644
--- a/res/layout/preference_linearcolor.xml
+++ b/res/layout/preference_linearcolor.xml
@@ -19,7 +19,7 @@
         android:layout_height="?android:attr/listPreferredItemHeight"
         android:paddingEnd="?android:attr/scrollbarSize">
     <com.android.settings.applications.LinearColorBar
-        android:id="@+android:id/linear_color_bar"
+        android:id="@+id/linear_color_bar"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:layout_marginTop="16dp"
diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java
index a8d0e8f..b9e729c 100644
--- a/src/com/android/settings/Utils.java
+++ b/src/com/android/settings/Utils.java
@@ -345,9 +345,7 @@
      * @param context the application context
      * @return the formatted and newline-separated IP addresses, or null if none.
      */
-    public static String getDefaultIpAddresses(Context context) {
-        ConnectivityManager cm = (ConnectivityManager)
-                context.getSystemService(Context.CONNECTIVITY_SERVICE);
+    public static String getDefaultIpAddresses(ConnectivityManager cm) {
         LinkProperties prop = cm.getActiveLinkProperties();
         return formatIpAddresses(prop);
     }
diff --git a/src/com/android/settings/applications/ManageApplications.java b/src/com/android/settings/applications/ManageApplications.java
index aa10c9e..0a1dcb1 100644
--- a/src/com/android/settings/applications/ManageApplications.java
+++ b/src/com/android/settings/applications/ManageApplications.java
@@ -1085,6 +1085,7 @@
             mOptionsMenu.findItem(SHOW_RUNNING_SERVICES).setVisible(showingBackground);
             mOptionsMenu.findItem(SHOW_BACKGROUND_PROCESSES).setVisible(!showingBackground);
             mOptionsMenu.findItem(RESET_APP_PREFERENCES).setVisible(false);
+            mShowBackground = showingBackground;
         } else {
             mOptionsMenu.findItem(SORT_ORDER_ALPHA).setVisible(mSortOrder != SORT_ORDER_ALPHA);
             mOptionsMenu.findItem(SORT_ORDER_SIZE).setVisible(mSortOrder != SORT_ORDER_SIZE);
diff --git a/src/com/android/settings/applications/RunningProcessesView.java b/src/com/android/settings/applications/RunningProcessesView.java
index 52c4841..8eb0496 100644
--- a/src/com/android/settings/applications/RunningProcessesView.java
+++ b/src/com/android/settings/applications/RunningProcessesView.java
@@ -434,6 +434,9 @@
             @Override
             public void onClick(View v) {
                 mAdapter.setShowBackground(true);
+                if (mOwner != null) {
+                    mOwner.getActivity().invalidateOptionsMenu();
+                }
             }
         });
         mForegroundProcessText = (TextView)findViewById(R.id.foregroundText);
@@ -441,6 +444,9 @@
             @Override
             public void onClick(View v) {
                 mAdapter.setShowBackground(false);
+                if (mOwner != null) {
+                    mOwner.getActivity().invalidateOptionsMenu();
+                }
             }
         });
 
diff --git a/src/com/android/settings/deviceinfo/Status.java b/src/com/android/settings/deviceinfo/Status.java
index 6a15027..b27b241 100644
--- a/src/com/android/settings/deviceinfo/Status.java
+++ b/src/com/android/settings/deviceinfo/Status.java
@@ -47,6 +47,7 @@
 import com.android.internal.telephony.PhoneConstants;
 import com.android.internal.telephony.PhoneFactory;
 import com.android.internal.telephony.PhoneStateIntentReceiver;
+import com.android.internal.util.ArrayUtils;
 import com.android.settings.R;
 import com.android.settings.Utils;
 
@@ -117,23 +118,41 @@
     static final String CB_AREA_INFO_SENDER_PERMISSION =
             "android.permission.RECEIVE_EMERGENCY_BROADCAST";
 
+    // Broadcasts to listen to for connectivity changes.
+    private static final String[] CONNECTIVITY_INTENTS = {
+            BluetoothAdapter.ACTION_STATE_CHANGED,
+            ConnectivityManager.CONNECTIVITY_ACTION_IMMEDIATE,
+            WifiManager.LINK_CONFIGURATION_CHANGED_ACTION,
+            WifiManager.NETWORK_STATE_CHANGED_ACTION,
+    };
+
     private static final int EVENT_SIGNAL_STRENGTH_CHANGED = 200;
     private static final int EVENT_SERVICE_STATE_CHANGED = 300;
 
     private static final int EVENT_UPDATE_STATS = 500;
 
+    private static final int EVENT_UPDATE_CONNECTIVITY = 600;
+
+    private ConnectivityManager mCM;
     private TelephonyManager mTelephonyManager;
+    private WifiManager mWifiManager;
+
     private Phone mPhone = null;
     private PhoneStateIntentReceiver mPhoneStateReceiver;
     private Resources mRes;
-    private Preference mSignalStrength;
-    private Preference mUptime;
     private boolean mShowLatestAreaInfo;
 
-    private String sUnknown;
+    private String mUnknown;
+    private String mUnavailable;
 
+    private Preference mSignalStrength;
+    private Preference mUptime;
     private Preference mBatteryStatus;
     private Preference mBatteryLevel;
+    private Preference mBtAddress;
+    private Preference mIpAddress;
+    private Preference mWifiMacAddress;
+    private Preference mWimaxMacAddress;
 
     private Handler mHandler;
 
@@ -165,6 +184,10 @@
                     status.updateTimes();
                     sendEmptyMessageDelayed(EVENT_UPDATE_STATS, 1000);
                     break;
+
+                case EVENT_UPDATE_CONNECTIVITY:
+                    status.updateConnectivity();
+                    break;
             }
         }
     }
@@ -207,20 +230,47 @@
         }
     };
 
+    private IntentFilter mConnectivityIntentFilter;
+    private final BroadcastReceiver mConnectivityReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            String action = intent.getAction();
+            if (ArrayUtils.contains(CONNECTIVITY_INTENTS, action)) {
+                mHandler.sendEmptyMessage(EVENT_UPDATE_CONNECTIVITY);
+            }
+        }
+    };
+
+    private boolean hasBluetooth() {
+        return BluetoothAdapter.getDefaultAdapter() != null;
+    }
+
+    private boolean hasWimax() {
+        return  mCM.getNetworkInfo(ConnectivityManager.TYPE_WIMAX) != null;
+    }
+
     @Override
     protected void onCreate(Bundle icicle) {
         super.onCreate(icicle);
 
         mHandler = new MyHandler(this);
 
+        mCM = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
         mTelephonyManager = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
+        mWifiManager = (WifiManager) getSystemService(WIFI_SERVICE);
 
         addPreferencesFromResource(R.xml.device_info_status);
         mBatteryLevel = findPreference(KEY_BATTERY_LEVEL);
         mBatteryStatus = findPreference(KEY_BATTERY_STATUS);
+        mBtAddress = findPreference(KEY_BT_ADDRESS);
+        mWifiMacAddress = findPreference(KEY_WIFI_MAC_ADDRESS);
+        mWimaxMacAddress = findPreference(KEY_WIMAX_MAC_ADDRESS);
+        mIpAddress = findPreference(KEY_IP_ADDRESS);
 
         mRes = getResources();
-        sUnknown = mRes.getString(R.string.device_info_default);
+        mUnknown = mRes.getString(R.string.device_info_default);
+        mUnavailable = mRes.getString(R.string.status_unavailable);
+
         if (UserHandle.myUserId() == UserHandle.USER_OWNER) {
             mPhone = PhoneFactory.getDefaultPhone();
         }
@@ -291,10 +341,22 @@
             }
         }
 
-        setWimaxStatus();
-        setWifiStatus();
-        setBtStatus();
-        setIpAddressStatus();
+        if (!hasBluetooth()) {
+            getPreferenceScreen().removePreference(mBtAddress);
+            mBtAddress = null;
+        }
+
+        if (!hasWimax()) {
+            getPreferenceScreen().removePreference(mWimaxMacAddress);
+            mWimaxMacAddress = null;
+        }
+
+        mConnectivityIntentFilter = new IntentFilter();
+        for (String intent: CONNECTIVITY_INTENTS) {
+             mConnectivityIntentFilter.addAction(intent);
+        }
+
+        updateConnectivity();
 
         String serial = Build.SERIAL;
         if (serial != null && !serial.equals("")) {
@@ -325,6 +387,8 @@
                         CB_AREA_INFO_SENDER_PERMISSION);
             }
         }
+        registerReceiver(mConnectivityReceiver, mConnectivityIntentFilter,
+                         android.Manifest.permission.CHANGE_NETWORK_STATE, null);
         registerReceiver(mBatteryInfoReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
         mHandler.sendEmptyMessage(EVENT_UPDATE_STATS);
     }
@@ -341,6 +405,7 @@
             unregisterReceiver(mAreaInfoReceiver);
         }
         unregisterReceiver(mBatteryInfoReceiver);
+        unregisterReceiver(mConnectivityReceiver);
         mHandler.removeMessages(EVENT_UPDATE_STATS);
     }
 
@@ -371,7 +436,7 @@
 
     private void setSummaryText(String preference, String text) {
             if (TextUtils.isEmpty(text)) {
-               text = sUnknown;
+               text = mUnknown;
              }
              // some preferences may be missing
              if (findPreference(preference) != null) {
@@ -474,55 +539,47 @@
     }
 
     private void setWimaxStatus() {
-        ConnectivityManager cm = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
-        NetworkInfo ni = cm.getNetworkInfo(ConnectivityManager.TYPE_WIMAX);
-
-        if (ni == null) {
-            PreferenceScreen root = getPreferenceScreen();
-            Preference ps = (Preference) findPreference(KEY_WIMAX_MAC_ADDRESS);
-            if (ps != null) root.removePreference(ps);
-        } else {
-            Preference wimaxMacAddressPref = findPreference(KEY_WIMAX_MAC_ADDRESS);
-            String macAddress = SystemProperties.get("net.wimax.mac.address",
-                    getString(R.string.status_unavailable));
-            wimaxMacAddressPref.setSummary(macAddress);
+        if (mWimaxMacAddress != null) {
+            String macAddress = SystemProperties.get("net.wimax.mac.address", mUnavailable);
+            mWimaxMacAddress.setSummary(macAddress);
         }
     }
+
     private void setWifiStatus() {
-        WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE);
-        WifiInfo wifiInfo = wifiManager.getConnectionInfo();
-
-        Preference wifiMacAddressPref = findPreference(KEY_WIFI_MAC_ADDRESS);
-
+        WifiInfo wifiInfo = mWifiManager.getConnectionInfo();
         String macAddress = wifiInfo == null ? null : wifiInfo.getMacAddress();
-        wifiMacAddressPref.setSummary(!TextUtils.isEmpty(macAddress) ? macAddress
-                : getString(R.string.status_unavailable));
+        mWifiMacAddress.setSummary(!TextUtils.isEmpty(macAddress) ? macAddress : mUnavailable);
     }
 
     private void setIpAddressStatus() {
-        Preference ipAddressPref = findPreference(KEY_IP_ADDRESS);
-        String ipAddress = Utils.getDefaultIpAddresses(this);
+        String ipAddress = Utils.getDefaultIpAddresses(this.mCM);
         if (ipAddress != null) {
-            ipAddressPref.setSummary(ipAddress);
+            mIpAddress.setSummary(ipAddress);
         } else {
-            ipAddressPref.setSummary(getString(R.string.status_unavailable));
+            mIpAddress.setSummary(mUnavailable);
         }
     }
 
     private void setBtStatus() {
         BluetoothAdapter bluetooth = BluetoothAdapter.getDefaultAdapter();
-        Preference btAddressPref = findPreference(KEY_BT_ADDRESS);
-
-        if (bluetooth == null) {
-            // device not BT capable
-            getPreferenceScreen().removePreference(btAddressPref);
-        } else {
+        if (bluetooth != null && mBtAddress != null) {
             String address = bluetooth.isEnabled() ? bluetooth.getAddress() : null;
-            btAddressPref.setSummary(!TextUtils.isEmpty(address) ? address
-                    : getString(R.string.status_unavailable));
+            if (!TextUtils.isEmpty(address)) {
+               // Convert the address to lowercase for consistency with the wifi MAC address.
+                mBtAddress.setSummary(address.toLowerCase());
+            } else {
+                mBtAddress.setSummary(mUnavailable);
+            }
         }
     }
 
+    void updateConnectivity() {
+        setWimaxStatus();
+        setWifiStatus();
+        setBtStatus();
+        setIpAddressStatus();
+    }
+
     void updateTimes() {
         long at = SystemClock.uptimeMillis() / 1000;
         long ut = SystemClock.elapsedRealtime() / 1000;
diff --git a/src/com/android/settings/wifi/AdvancedWifiSettings.java b/src/com/android/settings/wifi/AdvancedWifiSettings.java
index 7663058..bbcd50d 100644
--- a/src/com/android/settings/wifi/AdvancedWifiSettings.java
+++ b/src/com/android/settings/wifi/AdvancedWifiSettings.java
@@ -16,8 +16,10 @@
 
 package com.android.settings.wifi;
 
+import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
+import android.content.IntentFilter;
 import android.net.wifi.WifiInfo;
 import android.net.wifi.WifiManager;
 import android.net.wifi.WifiWatchdogStateMachine;
@@ -53,6 +55,18 @@
 
     private WifiManager mWifiManager;
 
+    private IntentFilter mFilter;
+    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            String action = intent.getAction();
+            if (action.equals(WifiManager.LINK_CONFIGURATION_CHANGED_ACTION) ||
+                action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {
+                refreshWifiInfo();
+            }
+        }
+    };
+
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
@@ -63,15 +77,26 @@
     public void onActivityCreated(Bundle savedInstanceState) {
         super.onActivityCreated(savedInstanceState);
         mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
+        mFilter = new IntentFilter();
+        mFilter.addAction(WifiManager.LINK_CONFIGURATION_CHANGED_ACTION);
+        mFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
     }
 
     @Override
     public void onResume() {
         super.onResume();
         initPreferences();
+        getActivity().registerReceiver(mReceiver, mFilter,
+                android.Manifest.permission.CHANGE_NETWORK_STATE, null);
         refreshWifiInfo();
     }
 
+    @Override
+    public void onPause() {
+        super.onPause();
+        getActivity().unregisterReceiver(mReceiver);
+    }
+
     private void initPreferences() {
         CheckBoxPreference notifyOpenNetworks =
             (CheckBoxPreference) findPreference(KEY_NOTIFY_OPEN_NETWORKS);