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

Commit fada88b8 authored by Omair Kamil's avatar Omair Kamil
Browse files

Actually prevent a repeated unregistration of mBatchAlarmReceiver.

Uses a AtomicReferences that is read and atomically set to null. Also moves it to the ScanNative inner class, and makes the rest of the ScanNative members final.

Note that there are other receivers in ScanManager that may be unregistered multiple times. In those cases the IllegalArgumentException is caught. We should consider changing that, because if cleanup is called multiple times there will be a bunch of errors logged which could cause issues to be mistriaged. But that is out of scope of this change.

Bug: 354303095
Fix: 354303095
Flag: EXEMPT, what isn't mechanical refactor is trivial
Test: atest ScanManagerTest, atest BumbleBluetoothTests
Change-Id: Ib3982c3a933459b77aa305f54517b527e55701c9
parent 02f06493
Loading
Loading
Loading
Loading
+13 −12
Original line number Diff line number Diff line
@@ -64,6 +64,7 @@ import java.util.Map;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicReference;

/** Class that handles Bluetooth LE scan related operations. */
public class ScanManager {
@@ -120,8 +121,6 @@ public class ScanManager {
    private final Context mContext;
    private final TransitionalScanHelper mScanHelper;
    private final AdapterService mAdapterService;
    private BroadcastReceiver mBatchAlarmReceiver;
    private boolean mBatchAlarmReceiverRegistered;
    private ScanNative mScanNative;
    private volatile ClientHandler mHandler;
    private BluetoothAdapterProxy mBluetoothAdapterProxy;
@@ -993,9 +992,12 @@ public class ScanManager {
        private final Set<Integer> mAllPassRegularClients = new HashSet<>();
        private final Set<Integer> mAllPassBatchClients = new HashSet<>();

        private AlarmManager mAlarmManager;
        private PendingIntent mBatchScanIntervalIntent;
        private ScanNativeInterface mNativeInterface;
        private final AtomicReference<BroadcastReceiver> mBatchAlarmReceiver =
                new AtomicReference<>();

        private final AlarmManager mAlarmManager;
        private final PendingIntent mBatchScanIntervalIntent;
        private final ScanNativeInterface mNativeInterface;

        ScanNative(TransitionalScanHelper scanHelper) {
            mNativeInterface = ScanObjectsFactory.getInstance().getScanNativeInterface();
@@ -1011,7 +1013,7 @@ public class ScanManager {
            IntentFilter filter = new IntentFilter();
            filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);
            filter.addAction(ACTION_REFRESH_BATCHED_SCAN);
            mBatchAlarmReceiver =
            mBatchAlarmReceiver.set(
                    new BroadcastReceiver() {
                        @Override
                        public void onReceive(Context context, Intent intent) {
@@ -1028,9 +1030,8 @@ public class ScanManager {
                                }
                            }
                        }
                    };
            mContext.registerReceiver(mBatchAlarmReceiver, filter);
            mBatchAlarmReceiverRegistered = true;
                    });
            mContext.registerReceiver(mBatchAlarmReceiver.get(), filter);
        }

        private void callbackDone(int scannerId, int status) {
@@ -1484,10 +1485,10 @@ public class ScanManager {
        void cleanup() {
            mAlarmManager.cancel(mBatchScanIntervalIntent);
            // Protect against multiple calls of cleanup.
            if (mBatchAlarmReceiverRegistered) {
                mContext.unregisterReceiver(mBatchAlarmReceiver);
            BroadcastReceiver receiver = mBatchAlarmReceiver.getAndSet(null);
            if (receiver != null) {
                mContext.unregisterReceiver(receiver);
            }
            mBatchAlarmReceiverRegistered = false;
            mNativeInterface.cleanup();
        }