private Task RequestBluetoothAsync()

in src/Covi.iOS/Features/Bluetooth/PlatformInitializer.cs [252:298]


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

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

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

                var result = PermissionStatus.Unknown;
                switch (state)
                {
                    case CBPeripheralManagerState.PoweredOff:
                    case CBPeripheralManagerState.Unsupported:
                        result = PermissionStatus.Disabled;
                        break;
                    case CBPeripheralManagerState.PoweredOn:
                        result = PermissionStatus.Granted;
                        break;
                    case CBPeripheralManagerState.Unauthorized:
                        result = PermissionStatus.Denied;
                        break;
                    case CBPeripheralManagerState.Resetting:
                    default:
                        result = PermissionStatus.Unknown;
                        break;
                }

                switch (CBPeripheralManager.AuthorizationStatus)
                {
                    case CBPeripheralManagerAuthorizationStatus.Denied:
                    case CBPeripheralManagerAuthorizationStatus.NotDetermined:
                        result = PermissionStatus.Denied;
                        break;
                    case CBPeripheralManagerAuthorizationStatus.Restricted:
                        result = PermissionStatus.Restricted;
                        break;
                }
                manager.Dispose();
                manager = null;
                tcs.SetResult(result);
            }
        }