using Plugin.BLE.Abstractions.Contracts; using System; using System.Threading.Tasks; namespace TINK.Services.BluetoothLock { public static class StateChecker { /// /// Get current bluetooth state /// /// See https://github.com/xabre/xamarin-bluetooth-le/issues/112#issuecomment-380994887. /// Crossplatform bluetooth implementation object /// BluetoothState public static Task GetBluetoothState(this IBluetoothLE ble) { var tcs = new TaskCompletionSource(); if (ble.State != BluetoothState.Unknown) { // If we can detect state out of box just returning in tcs.SetResult(ble.State); } else { // Otherwise let's setup dynamic event handler and wait for first state update EventHandler handler = null; handler = (o, e) => { ble.StateChanged -= handler; // and return it as our state // we can have an 'Unknown' check here, but in normal situation it should never occur tcs.SetResult(e.NewState); }; ble.StateChanged += handler; } return tcs.Task; } } }