Merge "Call showInputMethodPicker instead of showInputMethodSubtypePicker"
diff --git a/res/drawable-hdpi/app_settings.png b/res/drawable-hdpi/app_settings.png
deleted file mode 100644
index 68b6ec6..0000000
--- a/res/drawable-hdpi/app_settings.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_appwidget_settings_brightness_mid.png b/res/drawable-hdpi/ic_appwidget_settings_brightness_mid.png
deleted file mode 100644
index c258d1c..0000000
--- a/res/drawable-hdpi/ic_appwidget_settings_brightness_mid.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_menu_filter_settings.png b/res/drawable-hdpi/ic_menu_filter_settings.png
deleted file mode 100644
index fde4749..0000000
--- a/res/drawable-hdpi/ic_menu_filter_settings.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_popup_brightness.png b/res/drawable-hdpi/ic_popup_brightness.png
deleted file mode 100644
index a68b44f..0000000
--- a/res/drawable-hdpi/ic_popup_brightness.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_settings_search.png b/res/drawable-hdpi/ic_settings_search.png
deleted file mode 100755
index ec07f37..0000000
--- a/res/drawable-hdpi/ic_settings_search.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/app_settings.png b/res/drawable-mdpi/app_settings.png
deleted file mode 100644
index ed23bbf..0000000
--- a/res/drawable-mdpi/app_settings.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_appwidget_settings_brightness_mid.png b/res/drawable-mdpi/ic_appwidget_settings_brightness_mid.png
deleted file mode 100644
index 5ffef7a..0000000
--- a/res/drawable-mdpi/ic_appwidget_settings_brightness_mid.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_menu_filter_settings.png b/res/drawable-mdpi/ic_menu_filter_settings.png
deleted file mode 100644
index bc1e51a..0000000
--- a/res/drawable-mdpi/ic_menu_filter_settings.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_popup_brightness.png b/res/drawable-mdpi/ic_popup_brightness.png
deleted file mode 100755
index e9172a6..0000000
--- a/res/drawable-mdpi/ic_popup_brightness.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_settings_search.png b/res/drawable-mdpi/ic_settings_search.png
deleted file mode 100755
index 8e13de3..0000000
--- a/res/drawable-mdpi/ic_settings_search.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/lock_anim_00.png b/res/drawable-mdpi/lock_anim_00.png
deleted file mode 100644
index afdda8b..0000000
--- a/res/drawable-mdpi/lock_anim_00.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/lock_anim_02.png b/res/drawable-mdpi/lock_anim_02.png
deleted file mode 100644
index 0542b1d..0000000
--- a/res/drawable-mdpi/lock_anim_02.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/lock_anim_04.png b/res/drawable-mdpi/lock_anim_04.png
deleted file mode 100644
index a3ca629..0000000
--- a/res/drawable-mdpi/lock_anim_04.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/lock_anim_06.png b/res/drawable-mdpi/lock_anim_06.png
deleted file mode 100644
index 90205a6..0000000
--- a/res/drawable-mdpi/lock_anim_06.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/lock_anim_08.png b/res/drawable-mdpi/lock_anim_08.png
deleted file mode 100644
index af7cd28..0000000
--- a/res/drawable-mdpi/lock_anim_08.png
+++ /dev/null
Binary files differ
diff --git a/src/com/android/settings/bluetooth/CachedBluetoothDevice.java b/src/com/android/settings/bluetooth/CachedBluetoothDevice.java
index bfd2e99..63c3d27 100644
--- a/src/com/android/settings/bluetooth/CachedBluetoothDevice.java
+++ b/src/com/android/settings/bluetooth/CachedBluetoothDevice.java
@@ -25,6 +25,7 @@
 import android.bluetooth.BluetoothAdapter;
 import android.bluetooth.BluetoothClass;
 import android.bluetooth.BluetoothDevice;
+import android.bluetooth.BluetoothUuid;
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.res.Resources;
@@ -584,42 +585,12 @@
 
         if (DEBUG) {
             Log.e(TAG, "updating profiles for " + mDevice.getName());
-
-            boolean printUuids = true;
             BluetoothClass bluetoothClass = mDevice.getBluetoothClass();
 
-            if (bluetoothClass != null) {
-                if (bluetoothClass.doesClassMatch(BluetoothClass.PROFILE_HEADSET) !=
-                    mProfiles.contains(Profile.HEADSET)) {
-                    Log.v(TAG, "headset classbits != uuid");
-                    printUuids = true;
-                }
-
-                if (bluetoothClass.doesClassMatch(BluetoothClass.PROFILE_A2DP) !=
-                    mProfiles.contains(Profile.A2DP)) {
-                    Log.v(TAG, "a2dp classbits != uuid");
-                    printUuids = true;
-                }
-
-                if (bluetoothClass.doesClassMatch(BluetoothClass.PROFILE_OPP) !=
-                    mProfiles.contains(Profile.OPP)) {
-                    Log.v(TAG, "opp classbits != uuid");
-                    printUuids = true;
-                }
-
-                if (bluetoothClass.doesClassMatch(BluetoothClass.PROFILE_HID) !=
-                    mProfiles.contains(Profile.HID)) {
-                    Log.v(TAG, "hid classbits != uuid");
-                    printUuids = true;
-                }
-            }
-
-            if (printUuids) {
-                if (bluetoothClass != null) Log.v(TAG, "Class: " + bluetoothClass.toString());
-                Log.v(TAG, "UUID:");
-                for (int i = 0; i < uuids.length; i++) {
-                    Log.v(TAG, "  " + uuids[i]);
-                }
+            if (bluetoothClass != null) Log.v(TAG, "Class: " + bluetoothClass.toString());
+            Log.v(TAG, "UUID:");
+            for (int i = 0; i < uuids.length; i++) {
+                Log.v(TAG, "  " + uuids[i]);
             }
         }
         return true;
diff --git a/src/com/android/settings/bluetooth/LocalBluetoothManager.java b/src/com/android/settings/bluetooth/LocalBluetoothManager.java
index 07d3931..88fa87f 100644
--- a/src/com/android/settings/bluetooth/LocalBluetoothManager.java
+++ b/src/com/android/settings/bluetooth/LocalBluetoothManager.java
@@ -26,13 +26,13 @@
 import android.bluetooth.BluetoothProfile;
 import android.content.Context;
 import android.content.SharedPreferences;
+import android.os.ParcelUuid;
 import android.util.Config;
 import android.util.Log;
 import android.widget.Toast;
 
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Set;
 
 // TODO: have some notion of shutting down.  Maybe a minute after they leave BT settings?
 /**
@@ -48,7 +48,6 @@
 
     /** Singleton instance. */
     private static LocalBluetoothManager sInstance;
-    private boolean mInitialized;
 
     private Context mContext;
     /** If a BT-related activity is in the foreground, this will be it. */
@@ -89,22 +88,17 @@
         synchronized (LocalBluetoothManager.class) {
             if (sInstance == null) {
                 sInstance = new LocalBluetoothManager();
+                if (!sInstance.init(context)) {
+                    return null;
+                }
+                LocalBluetoothProfileManager.init(sInstance);
             }
 
-            if (!sInstance.init(context)) {
-                return null;
-            }
-
-            LocalBluetoothProfileManager.init(sInstance);
-
             return sInstance;
         }
     }
 
     private boolean init(Context context) {
-        if (mInitialized) return true;
-        mInitialized = true;
-
         // This will be around as long as this process is
         mContext = context.getApplicationContext();
 
@@ -226,6 +220,12 @@
 
     void setBluetoothStateInt(int state) {
         mState = state;
+
+        if (state == BluetoothAdapter.STATE_ON) {
+            ParcelUuid[] uuids = mAdapter.getUuids();
+            LocalBluetoothProfileManager.updateLocalProfiles(getInstance(mContext), uuids);
+        }
+
         if (state == BluetoothAdapter.STATE_ON ||
             state == BluetoothAdapter.STATE_OFF) {
             mCachedDeviceManager.onBluetoothStateChanged(state ==
diff --git a/src/com/android/settings/bluetooth/LocalBluetoothProfileManager.java b/src/com/android/settings/bluetooth/LocalBluetoothProfileManager.java
index a01fdec..aa3bf38 100644
--- a/src/com/android/settings/bluetooth/LocalBluetoothProfileManager.java
+++ b/src/com/android/settings/bluetooth/LocalBluetoothProfileManager.java
@@ -121,6 +121,30 @@
         }
     }
 
+    // TODO(): Combine the init and updateLocalProfiles codes.
+    // init can get called from various paths, it makes no sense to add and then delete.
+    public static void updateLocalProfiles(LocalBluetoothManager localManager, ParcelUuid[] uuids) {
+        if (!BluetoothUuid.containsAnyUuid(uuids, HEADSET_PROFILE_UUIDS)) {
+            sProfileMap.remove(Profile.HEADSET);
+        }
+
+        if (BluetoothUuid.containsAnyUuid(uuids, A2DP_PROFILE_UUIDS)) {
+            sProfileMap.remove(Profile.A2DP);
+        }
+
+        if (BluetoothUuid.containsAnyUuid(uuids, OPP_PROFILE_UUIDS)) {
+            sProfileMap.remove(Profile.OPP);
+        }
+
+        if (BluetoothUuid.containsAnyUuid(uuids, HID_PROFILE_UUIDS)) {
+            sProfileMap.remove(Profile.HID);
+        }
+
+        if (BluetoothUuid.containsAnyUuid(uuids, PANU_PROFILE_UUIDS)) {
+            sProfileMap.remove(Profile.PAN);
+        }
+    }
+
     private static LinkedList<ServiceListener> mServiceListeners =
             new LinkedList<ServiceListener>();
 
@@ -171,23 +195,28 @@
             return;
         }
 
-        if (BluetoothUuid.containsAnyUuid(uuids, HEADSET_PROFILE_UUIDS)) {
+        if (BluetoothUuid.containsAnyUuid(uuids, HEADSET_PROFILE_UUIDS) &&
+            sProfileMap.containsKey(Profile.HEADSET)) {
             profiles.add(Profile.HEADSET);
         }
 
-        if (BluetoothUuid.containsAnyUuid(uuids, A2DP_PROFILE_UUIDS)) {
+        if (BluetoothUuid.containsAnyUuid(uuids, A2DP_PROFILE_UUIDS) &&
+            sProfileMap.containsKey(Profile.A2DP)) {
             profiles.add(Profile.A2DP);
         }
 
-        if (BluetoothUuid.containsAnyUuid(uuids, OPP_PROFILE_UUIDS)) {
+        if (BluetoothUuid.containsAnyUuid(uuids, OPP_PROFILE_UUIDS) &&
+            sProfileMap.containsKey(Profile.OPP)) {
             profiles.add(Profile.OPP);
         }
 
-        if (BluetoothUuid.containsAnyUuid(uuids, HID_PROFILE_UUIDS)) {
+        if (BluetoothUuid.containsAnyUuid(uuids, HID_PROFILE_UUIDS) &&
+            sProfileMap.containsKey(Profile.HID)) {
             profiles.add(Profile.HID);
         }
 
-        if (BluetoothUuid.containsAnyUuid(uuids, PANU_PROFILE_UUIDS)) {
+        if (BluetoothUuid.containsAnyUuid(uuids, PANU_PROFILE_UUIDS) &&
+            sProfileMap.containsKey(Profile.PAN)) {
             profiles.add(Profile.PAN);
         }
     }
diff --git a/src/com/android/settings/wifi/AccessPoint.java b/src/com/android/settings/wifi/AccessPoint.java
index c932978..774ac58 100644
--- a/src/com/android/settings/wifi/AccessPoint.java
+++ b/src/com/android/settings/wifi/AccessPoint.java
@@ -35,33 +35,6 @@
     private static final int[] STATE_SECURED = {R.attr.state_encrypted};
     private static final int[] STATE_NONE = {};
 
-    public static final class Comparater
-            implements Comparator<AccessPoint> {
-        @Override
-        public int compare(AccessPoint accessPoint1, AccessPoint accessPoint2) {
-            // Active one goes first.
-            if (accessPoint1.mInfo != accessPoint2.mInfo) {
-                return (accessPoint1.mInfo != null) ? -1 : 1;
-            }
-
-            // Reachable one goes before unreachable one.
-            if ((accessPoint1.mRssi ^ accessPoint2.mRssi) < 0) {
-                return (accessPoint1.mRssi != Integer.MAX_VALUE) ? -1 : 1;
-            }
-            // Configured one goes before unconfigured one.
-            if ((accessPoint1.networkId ^ accessPoint2.networkId) < 0) {
-                return (accessPoint1.networkId != -1) ? -1 : 1;
-            }
-            // Sort by signal strength.
-            int difference = WifiManager.compareSignalLevel(
-                    accessPoint2.mRssi, accessPoint1.mRssi);
-            if (difference != 0) {
-                return difference;
-            }
-            // Sort by ssid.
-            return accessPoint1.ssid.compareToIgnoreCase(accessPoint2.ssid);
-        }
-    }
 
     static final int SECURITY_NONE = 0;
     static final int SECURITY_WEP = 1;
@@ -140,6 +113,33 @@
         super.onBindView(view);
     }
 
+    @Override
+    public int compareTo(Preference preference) {
+        if (!(preference instanceof AccessPoint)) {
+            return 1;
+        }
+        AccessPoint other = (AccessPoint) preference;
+        // Active one goes first.
+        if (mInfo != other.mInfo) {
+            return (mInfo != null) ? -1 : 1;
+        }
+        // Reachable one goes before unreachable one.
+        if ((mRssi ^ other.mRssi) < 0) {
+            return (mRssi != Integer.MAX_VALUE) ? -1 : 1;
+        }
+        // Configured one goes before unconfigured one.
+        if ((networkId ^ other.networkId) < 0) {
+            return (networkId != -1) ? -1 : 1;
+        }
+        // Sort by signal strength.
+        int difference = WifiManager.compareSignalLevel(other.mRssi, mRssi);
+        if (difference != 0) {
+            return difference;
+        }
+        // Sort by ssid.
+        return ssid.compareToIgnoreCase(other.ssid);
+    }
+
 
     boolean update(ScanResult result) {
         // We do not call refresh() since this is called before onBindView().
diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java
index 1f7a1da..ff4f390 100644
--- a/src/com/android/settings/wifi/WifiSettings.java
+++ b/src/com/android/settings/wifi/WifiSettings.java
@@ -56,9 +56,10 @@
 import android.widget.AdapterView.AdapterContextMenuInfo;
 import android.widget.Toast;
 
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
-import java.util.TreeSet;
+import java.util.concurrent.atomic.AtomicBoolean;
 
 /**
  * This currently provides three types of UI.
@@ -95,6 +96,8 @@
     private DetailedState mLastState;
     private WifiInfo mLastInfo;
 
+    private AtomicBoolean mConnected = new AtomicBoolean(false);
+
     private int mKeyStoreNetworkId = INVALID_NETWORK_ID;
 
     private WifiDialog mDialog;
@@ -184,7 +187,7 @@
         final ProgressCategoryBase preference =
                 (ProgressCategoryBase) findPreference("access_points");
         mAccessPoints = preference;
-        mAccessPoints.setOrderingAsAdded(true);
+        mAccessPoints.setOrderingAsAdded(false);
         mAddNetwork = findPreference("add_network");
 
         registerForContextMenu(getListView());
@@ -379,8 +382,7 @@
     }
 
     private Collection<AccessPoint> constructAccessPoints() {
-        Collection<AccessPoint> accessPoints =
-                new TreeSet<AccessPoint>(new AccessPoint.Comparater());
+        Collection<AccessPoint> accessPoints = new ArrayList<AccessPoint>();
 
         final List<WifiConfiguration> configs = mWifiManager.getConfiguredNetworks();
         if (configs != null) {
@@ -424,11 +426,20 @@
                 WifiManager.SUPPLICANT_CONFIG_CHANGED_ACTION.equals(action)) {
                 updateAccessPoints();
         } else if (WifiManager.SUPPLICANT_STATE_CHANGED_ACTION.equals(action)) {
-            updateConnectionState(WifiInfo.getDetailedStateOf((SupplicantState)
-                    intent.getParcelableExtra(WifiManager.EXTRA_NEW_STATE)));
+            //Ignore supplicant state changes when network is connected
+            //TODO: we should deprecate SUPPLICANT_STATE_CHANGED_ACTION and
+            //introduce a broadcast that combines the supplicant and network
+            //network state change events so the apps dont have to worry about
+            //ignoring supplicant state change when network is connected
+            //to get more fine grained information.
+            if (!mConnected.get()) {
+                updateConnectionState(WifiInfo.getDetailedStateOf((SupplicantState)
+                        intent.getParcelableExtra(WifiManager.EXTRA_NEW_STATE)));
+            }
         } else if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(action)) {
             NetworkInfo info = (NetworkInfo) intent.getParcelableExtra(
                     WifiManager.EXTRA_NETWORK_INFO);
+            mConnected.set(info.isConnected());
             changeNextButtonState(info.isConnected());
             updateConnectionState(info.getDetailedState());
         } else if (WifiManager.RSSI_CHANGED_ACTION.equals(action)) {