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

Commit f4b73aa1 authored by Manu Viswanadhan's avatar Manu Viswanadhan Committed by Gerrit - the friendly Code Review server
Browse files

Fix broadcast receiver leak by creating seperate Profile B.R.

Create seperate broadcast receiver for profile intents, such
that broadcast receiver for adapter state intents is always
active. Unregister the profile receiver when BT is turned OFF
to remove leaks.

Change-Id: Id1db747c61bb2dd33515ac45cdc2059844d3e4f5
CRs-Fixed: 1082441
parent dd4b9521
Loading
Loading
Loading
Loading
+23 −7
Original line number Diff line number Diff line
@@ -107,25 +107,21 @@ public final class BluetoothEventManager {
        addHandler(Intent.ACTION_DOCK_EVENT, new DockEventHandler());

        mContext.registerReceiver(mBroadcastReceiver, mAdapterIntentFilter, null, mReceiverHandler);
        mContext.registerReceiver(mProfileBroadcastReceiver, mProfileIntentFilter, null, mReceiverHandler);
    }

    void registerProfileIntentReceiver() {
        mContext.registerReceiver(mBroadcastReceiver, mProfileIntentFilter, null, mReceiverHandler);
        mContext.registerReceiver(mProfileBroadcastReceiver, mProfileIntentFilter, null, mReceiverHandler);
    }

    public void setReceiverHandler(android.os.Handler handler) {
        mContext.unregisterReceiver(mBroadcastReceiver);
        mContext.unregisterReceiver(mProfileBroadcastReceiver);
        mReceiverHandler = handler;
        mContext.registerReceiver(mBroadcastReceiver, mAdapterIntentFilter, null, mReceiverHandler);
        registerProfileIntentReceiver();
    }

    public void setDefaultReceiverHandler() {
        mContext.unregisterReceiver(mBroadcastReceiver);
        mContext.registerReceiver(mBroadcastReceiver, mAdapterIntentFilter, null, mReceiverHandler);
        registerProfileIntentReceiver();
    }

    /** Register to start receiving callbacks for Bluetooth events. */
    public void registerCallback(BluetoothCallback callback) {
        synchronized (mCallbacks) {
@@ -154,11 +150,31 @@ public final class BluetoothEventManager {
        }
    };

    private final BroadcastReceiver mProfileBroadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            BluetoothDevice device = intent
                    .getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

            Handler handler = mHandlerMap.get(action);
            if (handler != null) {
                handler.onReceive(context, intent, device);
            }
        }
    };

    private class AdapterStateChangedHandler implements Handler {
        public void onReceive(Context context, Intent intent,
                BluetoothDevice device) {
            int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE,
                                    BluetoothAdapter.ERROR);
            // Reregister Profile Broadcast Receiver as part of TURN OFF
            if (state == BluetoothAdapter.STATE_OFF)
            {
                context.unregisterReceiver(mProfileBroadcastReceiver);
                registerProfileIntentReceiver();
            }
            // update local profiles and get paired devices
            mLocalAdapter.setBluetoothStateInt(state);
            // send callback to update UI and possibly start scanning
+1 −1
Original line number Diff line number Diff line
@@ -237,7 +237,7 @@ public final class LocalBluetoothProfileManager {
                "Warning: PBAP Client profile was previously added but the UUID is now missing.");
        }

        mEventManager.setDefaultReceiverHandler();
        mEventManager.registerProfileIntentReceiver();

        // There is no local SDP record for HID and Settings app doesn't control PBAP Server.
    }