private Task RequestBluetoothAsync()

in src/Covi.iOS/Features/Bluetooth/PlatformInitializer.cs [135:170]


        private Task<PermissionStatus> RequestBluetoothAsync()
        {
            var manager = new CBCentralManager();
            var tcs = new TaskCompletionSource<PermissionStatus>(manager);
            manager.UpdatedState += StatusCollback;

            return tcs.Task.ReturnInTimeoutAsync(PermissionStatus.Unknown, PermissionTimeout);

            void StatusCollback(object sender, EventArgs e)
            {
                var state = manager.State;
                manager.UpdatedState -= StatusCollback;

                var result = PermissionStatus.Unknown;
                switch (state)
                {
                    case CBCentralManagerState.PoweredOff:
                    case CBCentralManagerState.Unsupported:
                        result = PermissionStatus.Disabled;
                        break;
                    case CBCentralManagerState.PoweredOn:
                        result = PermissionStatus.Granted;
                        break;
                    case CBCentralManagerState.Unauthorized:
                        result = PermissionStatus.Denied;
                        break;
                    case CBCentralManagerState.Resetting:
                    default:
                        result = PermissionStatus.Unknown;
                        break;
                }
                manager.Dispose();
                manager = null;
                tcs.SetResult(result);
            }
        }