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

Commit 333d3105 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
Merged-In: I2a641c1df696e6d44d23a21f348945c44cd563f6
(cherry picked from commit 392d3cb1)
parent c2a1703f
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
     *