public DownloadVM( IDiversityServiceClient Service, IConnectivityService Connectivity, IFieldDataService Storage, IKeyMappingService Mappings, EventHierarchyLoader HierarchyLoader, [Dispatcher] IScheduler Dispatcher ) { this.Service = Service; this.Connectivity = Connectivity; this.Storage = Storage; this.Mappings = Mappings; this.HierarchyLoader = HierarchyLoader; QueryResult = new ReactiveCollection<Event>(); _IsOnlineAvailable = Connectivity.Status().Select(s => s == ConnectionStatus.Wifi).Do(_ => { this.GetType(); }, ex => { }, () => { }) .ToProperty(this, x => x.IsOnlineAvailable); SearchEvents = new ReactiveAsyncCommand(this.WhenAny(x => x.IsOnlineAvailable, x => x.Value)); SearchEvents.ShowInFlightNotification(Notifications, DiversityResources.Download_SearchingEvents); SearchEvents.ThrownExceptions .ShowServiceErrorNotifications(Notifications) .ShowErrorNotifications(Notifications) .Subscribe(); SearchEvents .RegisterAsyncObservable(query => Service.GetEventsByLocality(query as string ?? string.Empty) .TakeUntil(this.OnDeactivation()) ) .Do(_ => QueryResult.Clear()) .Subscribe(QueryResult.AddRange); CancelDownload = new ReactiveCommand(); DownloadElement = new ReactiveAsyncCommand(this.WhenAny(x => x.IsOnlineAvailable, x => x.Value)); DownloadElement.ThrownExceptions .ShowServiceErrorNotifications(Notifications) .ShowErrorNotifications(Notifications) .Subscribe(); DownloadElement .RegisterAsyncObservable(ev => IfNotDownloadedYet(ev as Event) .Select(HierarchyLoader.downloadAndStoreDependencies) .SelectMany(dl => dl.TakeUntil(CancelDownload)) .Scan(0, (acc, _) => ++acc) .Do(_ElementsDownloadedSubject.OnNext) ); _IsDownloading = DownloadElement.ItemsInflight .Select(x => x > 0) .ToProperty(this, x => x.IsDownloading); this.OnDeactivation() .Subscribe(_ => Messenger.SendMessage(EventMessage.Default, MessageContracts.INIT)); _ElementsDownloadedSubject = new Subject<int>(); _ElementsDownloaded = _ElementsDownloadedSubject.ToProperty(this, x => x.ElementsDownloaded, 0, Dispatcher); }
public RefreshVocabularyTask( IVocabularyService Vocabulary, IDiversityServiceClient Repository, INotificationService Notification ) { this.Vocabulary = Vocabulary; this.Repository = Repository; this.Notification = Notification; }
public EventHierarchyLoader( IDiversityServiceClient Service, IFieldDataService Storage, IKeyMappingService Mappings, [ThreadPool] IScheduler ThreadPool ) { this.Service = Service; this.Storage = Storage; this.Mappings = Mappings; this.ThreadPool = ThreadPool; }
public SetupVM( ISettingsService Settings, IConnectivityService Connectivity, [Dispatcher] IScheduler Dispatcher, IDiversityServiceClient Repository ) { this.Repository = Repository; this.Settings = Settings; // On First Page Visit (App Launch) // If There already is a configuration (Settings) // Go To Home Page this.FirstActivation() .SelectMany(_ => Settings.CurrentSettings()) .Select(x => (x != null) ? Page.Home : Page.SetupWelcome) .ToMessage(Messenger); _IsOnlineAvailable = this.ObservableToProperty(Connectivity.WifiAvailable(), x => x.IsOnlineAvailable, false, Dispatcher); // Show current login data in case of Reset Settings.SettingsObservable() .Subscribe(SetLogin); // Command To begin Setup this.ShowLogin = new ReactiveCommand(); ShowLogin.Select(_ => Page.SetupLogin) .ToMessage(Messenger); // Command Condition var userPassAndWifi = Observable.CombineLatest( Connectivity.WifiAvailable(), this.WhenAny(x => x.UserName, x => x.GetValue()).Select(string.IsNullOrWhiteSpace), this.WhenAny(x => x.Password, x => x.GetValue()).Select(string.IsNullOrWhiteSpace), (wifi, a, b) => wifi & !(a | b)); // Command and Errorhandling this.GetRepositories = new ReactiveAsyncCommand(userPassAndWifi); GetRepositories.ShowInFlightNotification(Notifications, DiversityResources.Setup_Info_ValidatingLogin); GetRepositories.ThrownExceptions .ShowServiceErrorNotifications(Notifications) .ShowErrorNotifications(Notifications) .Subscribe(); var loginAndRepo = GetRepositories.RegisterAsyncObservable(GetRepositoriesObservable).Publish().PermaRef(); // Page Navigation if Login Successful // i.e. Any repositories have been returned loginAndRepo .Snd() .Subscribe(NavigateOrNotifyInvalidCredentials); // Repo Selection this.Database = new ListSelectionHelper<string>(Dispatcher); loginAndRepo .Select(t => t.Item2) .Merge(EmptyProjectsOnLoginStart()) .Subscribe(Database.ItemsObserver); // Settings Propagation LatestLogin = loginAndRepo .Fst() .MostRecent(null) .GetEnumerator(); // Command Condition var repoSelected = Database.SelectedItemObservable .Select(repo => repo != NoRepo) .AndNoItemsInFlight(GetRepositories); // Command and Errorhandling this.GetProjects = new ReactiveAsyncCommand(repoSelected); GetProjects.ShowInFlightNotification(Notifications, DiversityResources.Setup_Info_GettingProjects); GetProjects.ThrownExceptions .ShowServiceErrorNotifications(Notifications) .ShowErrorNotifications(Notifications) .Subscribe(); var loginAndProjects = GetProjects.RegisterAsyncObservable(GetProjectsObservable).Publish().PermaRef(); // Page Navigation loginAndProjects .Select(_ => Page.SetupProject) .ToMessage(Messenger); // Project Selection Project = new ListSelectionHelper<Project>(Dispatcher); loginAndProjects .Snd() .Merge( EmptyReposOnRepoChange() ) .Subscribe(Project.ItemsObserver); // Settings Propagation LatestLoginWithRepo = loginAndProjects .Fst() .MostRecent(null) .GetEnumerator(); // Command Condition var projectSelected = Project.SelectedItemObservable .Select(p => p != NoProject) .AndNoItemsInFlight(GetProjects); // Command and Errorhandling this.GetProfile = new ReactiveAsyncCommand(projectSelected); GetProfile.ShowInFlightNotification(Notifications, DiversityResources.Setup_Info_GettingProfile); GetProfile.ThrownExceptions .ShowServiceErrorNotifications(Notifications) .ShowErrorNotifications(Notifications) .Subscribe(); var loginWithProfile = GetProfile.RegisterAsyncObservable(GetProfileObservable).Publish().PermaRef(); // Page Navigation loginWithProfile .Select(_ => Page.SetupGPS) .ToMessage(Messenger); // Settings Propagation LatestLoginWithProfile = loginWithProfile .MostRecent(null) .GetEnumerator(); // Command And Page Navigation this.Save = new ReactiveAsyncCommand(); Save.RegisterAsyncObservable(SaveSettings) .Select(_ => Page.SetupVocabulary) .ToMessage(Messenger); }
public TaxonManagementVM( IConnectivityService Connectivity, ITaxonService Taxa, IDiversityServiceClient Service, INotificationService Notification ) { this.Connectivity = Connectivity; this.Service = Service; this.Taxa = Taxa; this.Notification = Notification; _IsOnlineAvailable = this.ObservableToProperty(Connectivity.WifiAvailable(), x => x.IsOnlineAvailable); var localLists = this.FirstActivation() .SelectMany(_ => Taxa.getTaxonSelections() .ToObservable(ThreadPoolScheduler.Instance) .Select(list => new TaxonListVM(list))) .Publish(); LocalLists = localLists .ObserveOnDispatcher() .CreateCollection(); var onlineLists = localLists .IgnoreElements() //only download lists once the local ones are loaded .Concat(Observable.Return(null as TaxonListVM)) .CombineLatest(this.OnActivation(), (_, _2) => _2) .CheckConnectivity(Connectivity, Notification) .SelectMany(_ => { return Service.GetTaxonLists() .DisplayProgress(Notification, DiversityResources.TaxonManagement_State_DownloadingLists) .TakeUntil(this.OnDeactivation()); }) .ObserveOnDispatcher() .SelectMany(lists => lists.Where(list => !LocalLists.Any(loc => loc.Model == list)) // Filter lists already present locally .Select(list => new TaxonListVM(list)) ) .Publish(); PersonalLists = onlineLists.Where(vm => !vm.Model.IsPublicList) .CreateCollection(); PublicLists = onlineLists.Where(vm => vm.Model.IsPublicList) .CreateCollection(); onlineLists.Connect(); localLists.Connect(); Select = new ReactiveCommand<TaxonListVM>(vm => !vm.IsSelected && !vm.IsDownloading); Select.Subscribe(taxonlist => { foreach (var list in LocalLists) { if (list.Model.TaxonomicGroup == taxonlist.Model.TaxonomicGroup) list.Model.IsSelected = false; } Taxa.selectTaxonList(taxonlist.Model); }); Download = new ReactiveCommand<TaxonListVM>(vm => !vm.IsDownloading); Download .CheckConnectivity(Connectivity, Notification) .Subscribe(taxonlist => { if (Taxa.getTaxonTableFreeCount() > 0) { CurrentPivot = Pivot.Local; taxonlist.IsDownloading = true; makeListLocal(taxonlist); DownloadTaxonList(taxonlist) .DisplayProgress(Notification, DiversityResources.TaxonManagement_State_DownloadingList) .ObserveOnDispatcher() .ShowServiceErrorNotifications(Notification) .Subscribe(_ => { //Download Succeeded taxonlist.IsDownloading = false; if (Select.CanExecute(taxonlist)) Select.Execute(taxonlist); }, _ => //Download Failed { taxonlist.IsDownloading = false; removeLocalList(taxonlist); }, () => { }); } }); Delete = new ReactiveCommand<TaxonListVM>(vm => !vm.IsDownloading); Delete .Subscribe(taxonlist => { removeLocalList(taxonlist); }); Refresh = new ReactiveCommand<TaxonListVM>(vm => !vm.IsDownloading); Refresh .Subscribe(taxonlist => { if (Delete.CanExecute(taxonlist)) //Deletes synchronously Delete.Execute(taxonlist); if (Download.CanExecute(taxonlist)) Download.Execute(taxonlist); }); //Download all only on Personal pivot var canDownloadAll = this.WhenAny(x => x.CurrentPivot, x => x.GetValue()) .Select(p => p == Pivot.Personal) .CombineLatest(Connectivity.WifiAvailable(), (p, wi) => p && wi); DownloadAll = new ReactiveCommand(canDownloadAll, initialCondition: false); DownloadAll .SelectMany(_ => PersonalLists.ToArray()) .Where(vm => Download.CanExecute(vm)) .Subscribe(Download.Execute); }