protected override async void OnStartup(StartupEventArgs e) { base.OnStartup(e); _keeper = new AppKeeper(e); if (!_keeper.Start()) { this.Shutdown(0); // This shutdown is expected behavior. return; } _controller = new AppController(_keeper); await _controller.InitiateAsync(); //this.MainWindow = new MainWindow(); //this.MainWindow.Show(); }
public AppController(AppKeeper keeper, IWlanWorker worker) { this._keeper = keeper ?? throw new ArgumentNullException(nameof(keeper)); Profiles = new ObservableCollection <ProfileItem>(); BindingOperations.EnableCollectionSynchronization(Profiles, _profilesLock); NotifyIconContainer = new NotifyIconContainer(); NotifyIconContainer.MouseLeftButtonClick += OnMainWindowShowRequested; NotifyIconContainer.MouseRightButtonClick += OnMenuWindowShowRequested; this._worker = worker; IsUpdating = new BooleanNotifier(); IsWorking = new BooleanNotifier(); ShowUpdatingTime(); // For debug ShowWorkingTime(); // For debug RushesRescan = new ReactiveProperty <bool>() .AddTo(this.Subscription); EngagesPriority = Settings.Current.ToReactivePropertyAsSynchronized(x => x.EngagesPriority) .AddTo(this.Subscription); EngagesPriority .Subscribe(_ => SetNotifyIconText()) .AddTo(this.Subscription); #region Update RescanTimer = new ReactiveTimer(TimeSpan.FromSeconds(Settings.Current.RescanInterval)) .AddTo(this.Subscription); RescanCommand = IsUpdating .Inverse() .ObserveOnUIDispatcher() // This is for thread access by ReactiveCommand. .ToReactiveCommand(); RescanCommand .Merge(EngagesPriority.Where(x => x).Select(x => x as object)) .Merge(RescanTimer.Select(x => x as object)) .Subscribe(async _ => await ScanNetworkAsync()) .AddTo(this.Subscription); Settings.Current .ObserveProperty(x => x.RescanInterval) .Subscribe(rescanInterval => RescanTimer.Interval = TimeSpan.FromSeconds(rescanInterval)) .AddTo(this.Subscription); RushesRescan .Subscribe(rushesRescan => { if (rushesRescan) { RescanTimer.Start(); } else { RescanTimer.Stop(); } SetNotifyIconText(); }) .AddTo(this.Subscription); var networkRefreshed = Observable.FromEventPattern( h => _worker.NetworkRefreshed += h, h => _worker.NetworkRefreshed -= h); var availabilityChanged = Observable.FromEventPattern( h => _worker.AvailabilityChanged += h, h => _worker.AvailabilityChanged -= h); var interfaceChanged = Observable.FromEventPattern( h => _worker.InterfaceChanged += h, h => _worker.InterfaceChanged -= h); var connectionChanged = Observable.FromEventPattern( h => _worker.ConnectionChanged += h, h => _worker.ConnectionChanged -= h); var profileChanged = Observable.FromEventPattern( h => _worker.ProfileChanged += h, h => _worker.ProfileChanged -= h); Observable.Merge(networkRefreshed, availabilityChanged, interfaceChanged, connectionChanged, profileChanged) .Throttle(TimeSpan.FromMilliseconds(100)) .Subscribe(async _ => { if (RushesRescan.Value) { RescanTimer.Start(TimeSpan.FromSeconds(Settings.Current.RescanInterval)); // Wait for due time. } await LoadProfilesAsync(); }) .AddTo(this.Subscription); #endregion #region Close CloseCommand = new ReactiveProperty <bool>(true) .ToReactiveCommand(); CloseCommand .Subscribe(_ => _current.Shutdown()) .AddTo(this.Subscription); #endregion }
public AppController(AppKeeper keeper) : this(keeper, //new MockWorker() ?? //new NetshWorker() ?? (IWlanWorker) new NativeWifiWorker()) { }