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

Commit 392d3cb1 authored by Ugo Yu's avatar Ugo Yu Committed by William Escande
Browse files

Register metadata listener when bonding

Register metadata listener in bonded state could create a race condition
between the Wear OS setup wizard and the companion manager.
Move to bonding state instead to make sure the listener is ready before
any matadata change happens.

Bug: 263323082
Bug: 261861278
Test: atest CompanionDeviceManagerTest
Change-Id: I2a641c1df696e6d44d23a21f348945c44cd563f6
(cherry picked from commit 04f2498c551536cdd525955b4c77cc7a6183def3)
parent 285a78bc
Loading
Loading
Loading
Loading
+28 −3
Original line number Diff line number Diff line
@@ -193,6 +193,7 @@ public class CompanionManager {
                            + device + " " + e);
                }
            }
            mMetadataListeningDevices.clear();

            SharedPreferences.Editor pref = getCompanionPreferences().edit();
            pref.putString(COMPANION_DEVICE_KEY, mCompanionDevice.getAddress());
@@ -217,25 +218,49 @@ public class CompanionManager {
                // We already have the companion device, do not care bond state change any more.
                return;
            }
            if (state == BluetoothDevice.BOND_BONDED) {
            switch (state) {
                case BluetoothDevice.BOND_BONDING:
                    registerMetadataListener(device);
                    break;
                case BluetoothDevice.BOND_NONE:
                    removeMetadataListener(device);
                    break;
                default:
                    break;
            }
        }
    }

    private void registerMetadataListener(BluetoothDevice device) {
        synchronized (mMetadataListeningDevices) {
            Log.d(TAG, "register metadata listener: " + device);
            try {
                mAdapter.addOnMetadataChangedListener(
                        device, mAdapterService.getMainExecutor(), mMetadataListener);
            } catch (IllegalArgumentException e) {
                Log.e(TAG, "failed to unregister metadata listener for "
                Log.e(TAG, "failed to register metadata listener for "
                        + device + " " + e);
            }
            mMetadataListeningDevices.add(device);
        }
    }

    private void removeMetadataListener(BluetoothDevice device) {
        synchronized (mMetadataListeningDevices) {
            if (!mMetadataListeningDevices.contains(device)) return;

            Log.d(TAG, "remove metadata listener: " + device);
            try {
                mAdapter.removeOnMetadataChangedListener(device, mMetadataListener);
            } catch (IllegalArgumentException e) {
                Log.e(TAG, "failed to unregister metadata listener for "
                        + device + " " + e);
            }
            mMetadataListeningDevices.remove(device);
        }
    }


    /**
     * Method to get the stored companion device
     *