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

Commit 5a5dab03 authored by William Escande's avatar William Escande Committed by Gerrit Code Review
Browse files

Merge "Add delay runnable for bluetooth with airplane on/off many times"

parents 20577fbe 203a3ef8
Loading
Loading
Loading
Loading
+51 −0
Original line number Diff line number Diff line
@@ -384,8 +384,50 @@ public class BluetoothManagerService extends IBluetoothManager.Stub {
        return false;
    }

    final Runnable mOnAirplaneModeChangedRunnable = () -> {
        onAirplaneModeChanged();
    };

    @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED)
    public void onAirplaneModeChanged() {
        if (mHandler != null) {
            int delayAirplaneMs = 0;
            int state = getState();
            Log.d(TAG, "onAirplaneModeChanged state : " + BluetoothAdapter.nameForState(state)
                + ", isAirplaneModeOn() : " + isAirplaneModeOn());
            if (mHandler.hasCallbacks(mOnAirplaneModeChangedRunnable)) {
                mHandler.removeCallbacks(mOnAirplaneModeChangedRunnable);
            }
            /** If only LE mode with airplane on, should disable le, and turn off airplane
             *  should not turn on le.
             */
            if (state == BluetoothAdapter.STATE_BLE_ON && isBluetoothPersistedStateOn()) {
                delayAirplaneMs = SERVICE_RESTART_TIME_MS;
            } if (state != BluetoothAdapter.STATE_ON && state != BluetoothAdapter.STATE_OFF
                && state != BluetoothAdapter.STATE_BLE_ON) {
                // If Bluetooth is turning state, should handle airplane event after delay
                delayAirplaneMs = ADD_PROXY_DELAY_MS;
            } else if (mHandler.hasMessages(MESSAGE_ENABLE)
                || mHandler.hasMessages(MESSAGE_DISABLE)
                || mHandler.hasMessages(MESSAGE_HANDLE_ENABLE_DELAYED)
                || mHandler.hasMessages(MESSAGE_HANDLE_DISABLE_DELAYED)
                || mHandler.hasMessages(MESSAGE_RESTART_BLUETOOTH_SERVICE)
                || mHandler.hasMessages(MESSAGE_TIMEOUT_BIND)
                || mHandler.hasMessages(MESSAGE_BIND_PROFILE_SERVICE)) {
                // If Bluetooth restarting, should handle airplane event after delay
                delayAirplaneMs = SERVICE_RESTART_TIME_MS;
            }
            if (delayAirplaneMs > 0) {
                Log.d(TAG, "onAirplaneModeChanged delay MS : " + delayAirplaneMs);
                mHandler.postDelayed(mOnAirplaneModeChangedRunnable, delayAirplaneMs);
                return;
            }
        }
        handleAirplaneModeChanged();
    }

    @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED)
    private void handleAirplaneModeChanged() {
        synchronized (this) {
            if (isBluetoothPersistedStateOn()) {
                if (isAirplaneModeOn()) {
@@ -2969,6 +3011,11 @@ public class BluetoothManagerService extends IBluetoothManager.Stub {
    })
    private void recoverBluetoothServiceFromError(boolean clearBle) {
        Log.e(TAG, "recoverBluetoothServiceFromError");
        boolean repeatAirplaneRunnable = false;
        if (mHandler.hasCallbacks(mOnAirplaneModeChangedRunnable)) {
            mHandler.removeCallbacks(mOnAirplaneModeChangedRunnable);
            repeatAirplaneRunnable = true;
        }
        try {
            mBluetoothLock.readLock().lock();
            if (mBluetooth != null) {
@@ -3016,6 +3063,10 @@ public class BluetoothManagerService extends IBluetoothManager.Stub {
        // Send a Bluetooth Restart message to reenable bluetooth
        Message restartMsg = mHandler.obtainMessage(MESSAGE_RESTART_BLUETOOTH_SERVICE);
        mHandler.sendMessageDelayed(restartMsg, ERROR_RESTART_TIME_MS);

        if (repeatAirplaneRunnable) {
            mHandler.postDelayed(mOnAirplaneModeChangedRunnable, ERROR_RESTART_TIME_MS);
        }
    }

    private boolean isBluetoothDisallowed() {