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

Commit 60525c82 authored by Irfan Sheriff's avatar Irfan Sheriff Committed by Android (Google) Code Review
Browse files

Merge "Use BluetoothAdapter broadcast for coex settings" into honeycomb

parents cd3676e7 65eaec88
Loading
Loading
Loading
Loading
+5 −9
Original line number Diff line number Diff line
@@ -20,10 +20,7 @@ import android.app.AlarmManager;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.bluetooth.BluetoothA2dp;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothProfile;
import android.content.BroadcastReceiver;
import android.content.ContentResolver;
import android.content.Context;
@@ -91,7 +88,6 @@ public class WifiService extends IWifiManager.Stub {

    private AlarmManager mAlarmManager;
    private PendingIntent mIdleIntent;
    private BluetoothA2dp mBluetoothA2dp;
    private static final int IDLE_REQUEST = 0;
    private boolean mScreenOff;
    private boolean mDeviceIdle;
@@ -943,10 +939,10 @@ public class WifiService extends IWifiManager.Stub {
                    mAlarmManager.set(AlarmManager.RTC_WAKEUP, triggerTime, mIdleIntent);
                }
                mPluggedType = pluggedType;
            } else if (action.equals(BluetoothA2dp.ACTION_PLAYING_STATE_CHANGED)) {
                int state = intent.getIntExtra(BluetoothProfile.EXTRA_STATE,
                                               BluetoothA2dp.STATE_NOT_PLAYING);
                mWifiStateMachine.setBluetoothScanMode(state == BluetoothA2dp.STATE_PLAYING);
            } else if (action.equals(BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED)) {
                int state = intent.getIntExtra(BluetoothAdapter.EXTRA_CONNECTION_STATE,
                        BluetoothAdapter.STATE_DISCONNECTED);
                mWifiStateMachine.sendBluetoothAdapterStateChange(state);
            }
        }

@@ -1048,7 +1044,7 @@ public class WifiService extends IWifiManager.Stub {
        intentFilter.addAction(Intent.ACTION_SCREEN_OFF);
        intentFilter.addAction(Intent.ACTION_BATTERY_CHANGED);
        intentFilter.addAction(ACTION_DEVICE_IDLE);
        intentFilter.addAction(BluetoothA2dp.ACTION_PLAYING_STATE_CHANGED);
        intentFilter.addAction(BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED);
        mContext.registerReceiver(mReceiver, intentFilter);
    }

+21 −132
Original line number Diff line number Diff line
@@ -62,11 +62,7 @@ import android.util.EventLog;
import android.util.Log;
import android.util.Slog;
import android.app.backup.IBackupManager;
import android.bluetooth.BluetoothA2dp;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothHeadset;
import android.bluetooth.BluetoothProfile;
import android.content.BroadcastReceiver;
import android.content.Intent;
import android.content.Context;
@@ -120,6 +116,8 @@ public class WifiStateMachine extends HierarchicalStateMachine {
    private int mReconnectCount = 0;
    private boolean mIsScanMode = false;

    private boolean mBluetoothConnectionActive = false;

    /**
     * Interval in milliseconds between polling for RSSI
     * and linkspeed information
@@ -138,16 +136,6 @@ public class WifiStateMachine extends HierarchicalStateMachine {

    private int mSupplicantRestartCount = 0;

    /**
     * Instance of the bluetooth headset helper. This needs to be created
     * early because there is a delay before it actually 'connects', as
     * noted by its javadoc. If we check before it is connected, it will be
     * in an error state and we will not disable coexistence.
     */
    private BluetoothHeadset mBluetoothHeadset;

    private BluetoothA2dp mBluetoothA2dp;

    private LinkProperties mLinkProperties;

    // Wakelock held during wifi start/stop and driver load/unload
@@ -186,10 +174,6 @@ public class WifiStateMachine extends HierarchicalStateMachine {
    static final int CMD_UNLOAD_DRIVER_SUCCESS            = 5;
    /* Indicates driver unload failed */
    static final int CMD_UNLOAD_DRIVER_FAILURE            = 6;
    /* Set bluetooth headset proxy */
    static final int CMD_SET_BLUETOOTH_HEADSET_PROXY      = 7;
    /* Set bluetooth A2dp proxy */
    static final int CMD_SET_BLUETOOTH_A2DP_PROXY         = 8;

    /* Start the supplicant */
    static final int CMD_START_SUPPLICANT                 = 11;
@@ -209,6 +193,7 @@ public class WifiStateMachine extends HierarchicalStateMachine {
    /* Stop the soft access point */
    static final int CMD_STOP_AP                          = 22;

    static final int CMD_BLUETOOTH_ADAPTER_STATE_CHANGE   = 23;

    /* Supplicant events */
    /* Connection to supplicant established */
@@ -277,17 +262,6 @@ public class WifiStateMachine extends HierarchicalStateMachine {
     * - DTIM wake up settings
     */
    static final int CMD_SET_HIGH_PERF_MODE               = 77;
    /* Set bluetooth co-existence
     * BLUETOOTH_COEXISTENCE_MODE_ENABLED
     * BLUETOOTH_COEXISTENCE_MODE_DISABLED
     * BLUETOOTH_COEXISTENCE_MODE_SENSE
     */
    static final int CMD_SET_BLUETOOTH_COEXISTENCE        = 78;
    /* Enable/disable bluetooth scan mode
     * true(1)
     * false(0)
     */
    static final int CMD_SET_BLUETOOTH_SCAN_MODE          = 79;
    /* Set the country code */
    static final int CMD_SET_COUNTRY_CODE                 = 80;
    /* Request connectivity manager wake lock before driver stop */
@@ -476,15 +450,7 @@ public class WifiStateMachine extends HierarchicalStateMachine {
        mInterfaceName = SystemProperties.get("wifi.interface", "tiwlan0");
        mSupplicantStateTracker = new SupplicantStateTracker(context, this, getHandler());
        mWpsStateMachine = new WpsStateMachine(context, this, getHandler());

        mLinkProperties = new LinkProperties();
        BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
        if (adapter != null) {
            adapter.getProfileProxy(mContext, mBluetoothProfileServiceListener,
                                    BluetoothProfile.A2DP);
            adapter.getProfileProxy(mContext, mBluetoothProfileServiceListener,
                                    BluetoothProfile.HEADSET);
        }

        mNetworkInfo.setIsAvailable(false);
        mLinkProperties.clear();
@@ -914,26 +880,10 @@ public class WifiStateMachine extends HierarchicalStateMachine {
    }

    /**
     * Set bluetooth coex mode:
     *
     * @param mode
     *  BLUETOOTH_COEXISTENCE_MODE_ENABLED
     *  BLUETOOTH_COEXISTENCE_MODE_DISABLED
     *  BLUETOOTH_COEXISTENCE_MODE_SENSE
     * Send a message indicating bluetooth adapter connection state changed
     */
    public void setBluetoothCoexistenceMode(int mode) {
        sendMessage(obtainMessage(CMD_SET_BLUETOOTH_COEXISTENCE, mode, 0));
    }

    /**
     * Enable or disable Bluetooth coexistence scan mode. When this mode is on,
     * some of the low-level scan parameters used by the driver are changed to
     * reduce interference with A2DP streaming.
     *
     * @param isBluetoothPlaying whether to enable or disable this mode
     */
    public void setBluetoothScanMode(boolean isBluetoothPlaying) {
        sendMessage(obtainMessage(CMD_SET_BLUETOOTH_SCAN_MODE, isBluetoothPlaying ? 1 : 0, 0));
    public void sendBluetoothAdapterStateChange(int state) {
        sendMessage(obtainMessage(CMD_BLUETOOTH_ADAPTER_STATE_CHANGE, state, 0));
    }

    /**
@@ -1312,54 +1262,6 @@ public class WifiStateMachine extends HierarchicalStateMachine {
                                      DEFAULT_MAX_DHCP_RETRIES);
    }

    /**
     * Whether to disable coexistence mode while obtaining IP address. We
     * disable coexistence if the headset indicates that there are no
     * connected devices. If we have not got an indication of the service
     * connection yet, we go ahead with disabling coexistence mode.
     *
     * @return Whether to disable coexistence mode.
     */
    private boolean shouldDisableCoexistenceMode() {
        if (mBluetoothHeadset == null) return true;
        List<BluetoothDevice> devices = mBluetoothHeadset.getConnectedDevices();
        return (devices.size() != 0 ? false : true);
    }

    private void checkIsBluetoothPlaying() {
        boolean isBluetoothPlaying = false;
        if (mBluetoothA2dp != null) {
            List<BluetoothDevice> connected = mBluetoothA2dp.getConnectedDevices();

            for (BluetoothDevice device : connected) {
                if (mBluetoothA2dp.isA2dpPlaying(device)) {
                    isBluetoothPlaying = true;
                    break;
                }
            }
        }
        setBluetoothScanMode(isBluetoothPlaying);
    }

    private BluetoothProfile.ServiceListener mBluetoothProfileServiceListener =
        new BluetoothProfile.ServiceListener() {
        public void onServiceConnected(int profile, BluetoothProfile proxy) {
                if (profile == BluetoothProfile.HEADSET) {
                    sendMessage(CMD_SET_BLUETOOTH_HEADSET_PROXY, proxy);
                } else if (profile == BluetoothProfile.A2DP) {
                    sendMessage(CMD_SET_BLUETOOTH_A2DP_PROXY, proxy);
                }
        }

        public void onServiceDisconnected(int profile) {
                if (profile == BluetoothProfile.HEADSET) {
                    sendMessage(CMD_SET_BLUETOOTH_HEADSET_PROXY, null);
                } else if (profile == BluetoothProfile.A2DP) {
                    sendMessage(CMD_SET_BLUETOOTH_A2DP_PROXY, null);
                }
        }
    };

    private void sendScanResultsAvailableBroadcast() {
        Intent intent = new Intent(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
        intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
@@ -1562,11 +1464,9 @@ public class WifiStateMachine extends HierarchicalStateMachine {
        public boolean processMessage(Message message) {
            if (DBG) Log.d(TAG, getName() + message.toString() + "\n");
            switch (message.what) {
                case CMD_SET_BLUETOOTH_HEADSET_PROXY:
                    mBluetoothHeadset = (BluetoothHeadset) message.obj;
                    break;
                case CMD_SET_BLUETOOTH_A2DP_PROXY:
                    mBluetoothA2dp = (BluetoothA2dp) message.obj;
                case CMD_BLUETOOTH_ADAPTER_STATE_CHANGE:
                    mBluetoothConnectionActive = (message.arg1 !=
                            BluetoothAdapter.STATE_DISCONNECTED);
                    break;
                    /* Synchronous call returns */
                case CMD_PING_SUPPLICANT:
@@ -1610,8 +1510,6 @@ public class WifiStateMachine extends HierarchicalStateMachine {
                case CMD_SET_SCAN_MODE:
                case CMD_SET_SCAN_TYPE:
                case CMD_SET_HIGH_PERF_MODE:
                case CMD_SET_BLUETOOTH_COEXISTENCE:
                case CMD_SET_BLUETOOTH_SCAN_MODE:
                case CMD_SET_COUNTRY_CODE:
                case CMD_SET_FREQUENCY_BAND:
                case CMD_REQUEST_CM_WAKELOCK:
@@ -1722,8 +1620,6 @@ public class WifiStateMachine extends HierarchicalStateMachine {
                case CMD_SET_SCAN_MODE:
                case CMD_SET_SCAN_TYPE:
                case CMD_SET_HIGH_PERF_MODE:
                case CMD_SET_BLUETOOTH_COEXISTENCE:
                case CMD_SET_BLUETOOTH_SCAN_MODE:
                case CMD_SET_COUNTRY_CODE:
                case CMD_SET_FREQUENCY_BAND:
                case CMD_START_PACKET_FILTERING:
@@ -1850,8 +1746,6 @@ public class WifiStateMachine extends HierarchicalStateMachine {
                case CMD_SET_SCAN_MODE:
                case CMD_SET_SCAN_TYPE:
                case CMD_SET_HIGH_PERF_MODE:
                case CMD_SET_BLUETOOTH_COEXISTENCE:
                case CMD_SET_BLUETOOTH_SCAN_MODE:
                case CMD_SET_COUNTRY_CODE:
                case CMD_SET_FREQUENCY_BAND:
                case CMD_START_PACKET_FILTERING:
@@ -1930,8 +1824,6 @@ public class WifiStateMachine extends HierarchicalStateMachine {
                    //TODO: initialize and fix multicast filtering
                    //mWM.initializeMulticastFiltering();

                    checkIsBluetoothPlaying();

                    sendSupplicantConnectionChangedBroadcast(true);
                    transitionTo(mDriverStartedState);
                    break;
@@ -1960,8 +1852,6 @@ public class WifiStateMachine extends HierarchicalStateMachine {
                case CMD_SET_SCAN_MODE:
                case CMD_SET_SCAN_TYPE:
                case CMD_SET_HIGH_PERF_MODE:
                case CMD_SET_BLUETOOTH_COEXISTENCE:
                case CMD_SET_BLUETOOTH_SCAN_MODE:
                case CMD_SET_COUNTRY_CODE:
                case CMD_SET_FREQUENCY_BAND:
                case CMD_START_PACKET_FILTERING:
@@ -2116,8 +2006,6 @@ public class WifiStateMachine extends HierarchicalStateMachine {
                case CMD_SET_SCAN_MODE:
                case CMD_SET_SCAN_TYPE:
                case CMD_SET_HIGH_PERF_MODE:
                case CMD_SET_BLUETOOTH_COEXISTENCE:
                case CMD_SET_BLUETOOTH_SCAN_MODE:
                case CMD_SET_COUNTRY_CODE:
                case CMD_SET_FREQUENCY_BAND:
                case CMD_START_PACKET_FILTERING:
@@ -2154,8 +2042,6 @@ public class WifiStateMachine extends HierarchicalStateMachine {
                case PASSWORD_MAY_BE_INCORRECT_EVENT:
                case CMD_SET_SCAN_TYPE:
                case CMD_SET_HIGH_PERF_MODE:
                case CMD_SET_BLUETOOTH_COEXISTENCE:
                case CMD_SET_BLUETOOTH_SCAN_MODE:
                case CMD_SET_COUNTRY_CODE:
                case CMD_SET_FREQUENCY_BAND:
                case CMD_START_PACKET_FILTERING:
@@ -2183,6 +2069,12 @@ public class WifiStateMachine extends HierarchicalStateMachine {
            mIsRunning = true;
            updateBatteryWorkSource(null);

            /**
             * Enable bluetooth coexistence scan mode when bluetooth connection is active.
             * When this mode is on, some of the low-level scan parameters used by the
             * driver are changed to reduce interference with bluetooth
             */
            WifiNative.setBluetoothCoexistenceScanModeCommand(mBluetoothConnectionActive);
            /* set country code */
            setCountryCode();
            /* set frequency band of operation */
@@ -2219,12 +2111,6 @@ public class WifiStateMachine extends HierarchicalStateMachine {
                case CMD_SET_HIGH_PERF_MODE:
                    setHighPerfModeEnabledNative(message.arg1 == 1);
                    break;
                case CMD_SET_BLUETOOTH_COEXISTENCE:
                    WifiNative.setBluetoothCoexistenceModeCommand(message.arg1);
                    break;
                case CMD_SET_BLUETOOTH_SCAN_MODE:
                    WifiNative.setBluetoothCoexistenceScanModeCommand(message.arg1 == 1);
                    break;
                case CMD_SET_COUNTRY_CODE:
                    String country = (String) message.obj;
                    Log.d(TAG, "set country code " + country);
@@ -2243,6 +2129,11 @@ public class WifiStateMachine extends HierarchicalStateMachine {
                        Log.e(TAG, "Failed to set frequency band " + band);
                    }
                    break;
                case CMD_BLUETOOTH_ADAPTER_STATE_CHANGE:
                    mBluetoothConnectionActive = (message.arg1 !=
                            BluetoothAdapter.STATE_DISCONNECTED);
                    WifiNative.setBluetoothCoexistenceScanModeCommand(mBluetoothConnectionActive);
                    break;
                case CMD_STOP_DRIVER:
                    mWakeLock.acquire();
                    WifiNative.stopDriverCommand();
@@ -2290,8 +2181,6 @@ public class WifiStateMachine extends HierarchicalStateMachine {
                case CMD_STOP_DRIVER:
                case CMD_SET_SCAN_TYPE:
                case CMD_SET_HIGH_PERF_MODE:
                case CMD_SET_BLUETOOTH_COEXISTENCE:
                case CMD_SET_BLUETOOTH_SCAN_MODE:
                case CMD_SET_COUNTRY_CODE:
                case CMD_SET_FREQUENCY_BAND:
                case CMD_START_PACKET_FILTERING:
@@ -2490,7 +2379,7 @@ public class WifiStateMachine extends HierarchicalStateMachine {
                mModifiedBluetoothCoexistenceMode = false;
                mPowerMode = POWER_MODE_AUTO;

                if (shouldDisableCoexistenceMode()) {
                if (!mBluetoothConnectionActive) {
                    /*
                     * There are problems setting the Wi-Fi driver's power
                     * mode to active when bluetooth coexistence mode is