private void SetupMobileApi() { var library = Locator.Current.GetService<Library>(); this.Log().Info("Remote control is {0}", this.coreSettings.EnableRemoteControl ? "enabled" : "disabled"); this.Log().Info("Port is set to {0}", this.coreSettings.Port); IObservable<MobileApi> apiChanged = this.coreSettings.WhenAnyValue(x => x.Port).DistinctUntilChanged() .CombineLatest(this.coreSettings.WhenAnyValue(x => x.EnableRemoteControl), Tuple.Create) .Do(_ => { if (this.mobileApi != null) { this.mobileApi.Dispose(); this.mobileApi = null; } }) .Where(x => x.Item2) .Select(x => x.Item1) .Select(x => new MobileApi(x, library)).Publish(null).RefCount().Where(x => x != null); apiChanged.Subscribe(x => { this.mobileApi = x; x.SendBroadcastAsync(); x.StartClientDiscovery(); }); IConnectableObservable<IReadOnlyList<MobileClient>> connectedClients = apiChanged.Select(x => x.ConnectedClients).Switch().Publish(new List<MobileClient>()); connectedClients.Connect(); IConnectableObservable<bool> isPortOccupied = apiChanged.Select(x => x.IsPortOccupied).Switch().Publish(false); isPortOccupied.Connect(); var apiStats = new MobileApiInfo(connectedClients, isPortOccupied); Locator.CurrentMutable.RegisterConstant(apiStats, typeof(MobileApiInfo)); }
private void SetupMobileApi() { var coreSettings = this.kernel.Get<CoreSettings>(); var library = this.kernel.Get<Library>(); this.Log().Info("Remote control is {0}", coreSettings.EnableRemoteControl ? "enabled" : "disabled"); this.Log().Info("Port is set to {0}", coreSettings.Port); IObservable<MobileApi> apiChanged = coreSettings.WhenAnyValue(x => x.Port).DistinctUntilChanged() .CombineLatest(coreSettings.WhenAnyValue(x => x.EnableRemoteControl), Tuple.Create) .Where(x => x.Item2) .Select(x => x.Item1) .Do(_ => { if (this.mobileApi != null) { this.mobileApi.Dispose(); } }) .Select(x => new MobileApi(x, library)).Publish(null).RefCount().Where(x => x != null); apiChanged.Subscribe(x => { this.mobileApi = x; x.SendBroadcastAsync(); x.StartClientDiscovery(); }); IConnectableObservable<int> connectedClients = apiChanged.Select(x => x.ConnectedClients).Switch().Publish(0); connectedClients.Connect(); IConnectableObservable<bool> isPortOccupied = apiChanged.Select(x => x.IsPortOccupied).Switch().Publish(false); isPortOccupied.Connect(); var apiStats = new MobileApiInfo(connectedClients, isPortOccupied); this.kernel.Bind<MobileApiInfo>().ToConstant(apiStats); coreSettings.WhenAnyValue(x => x.EnableRemoteControl) .Where(x => !x && this.mobileApi != null) .Subscribe(x => this.mobileApi.Dispose()); }