From 084c665421502b13271e94bd0a342b0ddbbaa7ca Mon Sep 17 00:00:00 2001 From: Jaikumar Ganesh Date: Mon, 7 Dec 2009 10:58:18 -0800 Subject: [PATCH] Fix updating Bluetooth icon on status bar and for Wifi. Status bar uses the SINK_STATE_CHANGE intent to determine the icon. This intent also has the device. Thus, we can get this intent for any device and we update the icon wrongly. The same problem is with Wifi. This was not commonly observed till now, but with the car dock changes its easy to reproduce as we can get an incoming connection from the car's bluetooth system. For Wifi, this will cause coexistance issues especially with desk docks. Dr No: Eastham Bug: 2133530 --- .../java/com/android/server/WifiService.java | 29 ++++++++++++------- .../server/status/StatusBarPolicy.java | 21 +++++++------- 2 files changed, 29 insertions(+), 21 deletions(-) diff --git a/services/java/com/android/server/WifiService.java b/services/java/com/android/server/WifiService.java index 32ad6c616055b..b29e7693ffae4 100644 --- a/services/java/com/android/server/WifiService.java +++ b/services/java/com/android/server/WifiService.java @@ -25,6 +25,7 @@ import static android.net.wifi.WifiManager.WIFI_STATE_UNKNOWN; import android.app.AlarmManager; import android.app.PendingIntent; import android.bluetooth.BluetoothA2dp; +import android.bluetooth.BluetoothDevice; import android.content.BroadcastReceiver; import android.content.ContentResolver; import android.content.Context; @@ -62,6 +63,7 @@ import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.regex.Pattern; import java.io.FileDescriptor; import java.io.PrintWriter; @@ -109,7 +111,7 @@ public class WifiService extends IWifiManager.Stub { private int mMulticastDisabled; private final IBatteryStats mBatteryStats; - + /** * See {@link Settings.Gservices#WIFI_IDLE_MS}. This is the default value if a * Settings.Gservices value is not present. This timeout value is chosen as @@ -161,7 +163,7 @@ public class WifiService extends IWifiManager.Stub { * Last UID that asked to enable WIFI. */ private int mLastEnableUid = Process.myUid(); - + /** * Number of allowed radio frequency channels in various regulatory domains. * This list is sufficient for 802.11b/g networks (2.4GHz range). @@ -176,7 +178,7 @@ public class WifiService extends IWifiManager.Stub { mWifiStateTracker = tracker; mWifiStateTracker.enableRssiPolling(true); mBatteryStats = BatteryStatsService.getService(); - + mScanResultCache = new LinkedHashMap( SCAN_RESULT_CACHE_SIZE, 0.75f, true) { /* @@ -395,7 +397,7 @@ public class WifiService extends IWifiManager.Stub { } finally { Binder.restoreCallingIdentity(ident); } - + // Update state mWifiState = wifiState; @@ -1365,11 +1367,16 @@ public class WifiService extends IWifiManager.Stub { } mPluggedType = pluggedType; } else if (action.equals(BluetoothA2dp.ACTION_SINK_STATE_CHANGED)) { - boolean isBluetoothPlaying = - intent.getIntExtra( - BluetoothA2dp.EXTRA_SINK_STATE, - BluetoothA2dp.STATE_DISCONNECTED) == BluetoothA2dp.STATE_PLAYING; + BluetoothA2dp a2dp = new BluetoothA2dp(mContext); + Set sinks = a2dp.getConnectedSinks(); + boolean isBluetoothPlaying = false; + for (BluetoothDevice sink : sinks) { + if (a2dp.getSinkState(sink) == BluetoothA2dp.STATE_PLAYING) { + isBluetoothPlaying = true; + } + } mWifiStateTracker.setBluetoothScanMode(isBluetoothPlaying); + } else { return; } @@ -1381,7 +1388,7 @@ public class WifiService extends IWifiManager.Stub { * Determines whether the Wi-Fi chipset should stay awake or be put to * sleep. Looks at the setting for the sleep policy and the current * conditions. - * + * * @see #shouldDeviceStayAwake(int, int) */ private boolean shouldWifiStayAwake(int stayAwakeConditions, int pluggedType) { @@ -1400,7 +1407,7 @@ public class WifiService extends IWifiManager.Stub { return shouldDeviceStayAwake(stayAwakeConditions, pluggedType); } } - + /** * Determine whether the bit value corresponding to {@code pluggedType} is set in * the bit string {@code stayAwakeConditions}. Because a {@code pluggedType} value @@ -1489,7 +1496,7 @@ public class WifiService extends IWifiManager.Stub { intentFilter.addAction(BluetoothA2dp.ACTION_SINK_STATE_CHANGED); mContext.registerReceiver(mReceiver, intentFilter); } - + private boolean isAirplaneSensitive() { String airplaneModeRadios = Settings.System.getString(mContext.getContentResolver(), Settings.System.AIRPLANE_MODE_RADIOS); diff --git a/services/java/com/android/server/status/StatusBarPolicy.java b/services/java/com/android/server/status/StatusBarPolicy.java index 2b9d18f436e4a..bee0930ed871d 100644 --- a/services/java/com/android/server/status/StatusBarPolicy.java +++ b/services/java/com/android/server/status/StatusBarPolicy.java @@ -283,7 +283,7 @@ public class StatusBarPolicy { private IBinder mBluetoothIcon; private IconData mBluetoothData; private int mBluetoothHeadsetState; - private int mBluetoothA2dpState; + private boolean mBluetoothA2dpConnected; private int mBluetoothPbapState; private boolean mBluetoothEnabled; @@ -455,7 +455,7 @@ public class StatusBarPolicy { } else { mBluetoothEnabled = false; } - mBluetoothA2dpState = BluetoothA2dp.STATE_DISCONNECTED; + mBluetoothA2dpConnected = false; mBluetoothHeadsetState = BluetoothHeadset.STATE_DISCONNECTED; mBluetoothPbapState = BluetoothPbap.STATE_DISCONNECTED; mService.setIconVisibility(mBluetoothIcon, mBluetoothEnabled); @@ -636,12 +636,12 @@ public class StatusBarPolicy { int flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE | WindowManager.LayoutParams.FLAG_DIM_BEHIND; - + if (!mContext.getResources().getBoolean( com.android.internal.R.bool.config_sf_slowBlur)) { flags |= WindowManager.LayoutParams.FLAG_BLUR_BEHIND; } - + WindowManager.LayoutParams lp = new WindowManager.LayoutParams( ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, @@ -1083,7 +1083,6 @@ public class StatusBarPolicy { private final void updateBluetooth(Intent intent) { int iconId = com.android.internal.R.drawable.stat_sys_data_bluetooth; - String action = intent.getAction(); if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED)) { int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR); @@ -1092,8 +1091,12 @@ public class StatusBarPolicy { mBluetoothHeadsetState = intent.getIntExtra(BluetoothHeadset.EXTRA_STATE, BluetoothHeadset.STATE_ERROR); } else if (action.equals(BluetoothA2dp.ACTION_SINK_STATE_CHANGED)) { - mBluetoothA2dpState = intent.getIntExtra(BluetoothA2dp.EXTRA_SINK_STATE, - BluetoothA2dp.STATE_DISCONNECTED); + BluetoothA2dp a2dp = new BluetoothA2dp(mContext); + if (a2dp.getConnectedSinks().size() != 0) { + mBluetoothA2dpConnected = true; + } else { + mBluetoothA2dpConnected = false; + } } else if (action.equals(BluetoothPbap.PBAP_STATE_CHANGED_ACTION)) { mBluetoothPbapState = intent.getIntExtra(BluetoothPbap.PBAP_STATE, BluetoothPbap.STATE_DISCONNECTED); @@ -1101,9 +1104,7 @@ public class StatusBarPolicy { return; } - if (mBluetoothHeadsetState == BluetoothHeadset.STATE_CONNECTED || - mBluetoothA2dpState == BluetoothA2dp.STATE_CONNECTED || - mBluetoothA2dpState == BluetoothA2dp.STATE_PLAYING || + if (mBluetoothHeadsetState == BluetoothHeadset.STATE_CONNECTED || mBluetoothA2dpConnected || mBluetoothPbapState == BluetoothPbap.STATE_CONNECTED) { iconId = com.android.internal.R.drawable.stat_sys_data_bluetooth_connected; }