public StartTimeEntryViewModel( ITimeService timeService, ITogglDataSource dataSource, IUserPreferences userPreferences, IOnboardingStorage onboardingStorage, IInteractorFactory interactorFactory, INavigationService navigationService, IAnalyticsService analyticsService, ISchedulerProvider schedulerProvider, IRxActionFactory rxActionFactory) : base(navigationService) { Ensure.Argument.IsNotNull(dataSource, nameof(dataSource)); Ensure.Argument.IsNotNull(timeService, nameof(timeService)); Ensure.Argument.IsNotNull(userPreferences, nameof(userPreferences)); Ensure.Argument.IsNotNull(interactorFactory, nameof(interactorFactory)); Ensure.Argument.IsNotNull(onboardingStorage, nameof(onboardingStorage)); Ensure.Argument.IsNotNull(analyticsService, nameof(analyticsService)); Ensure.Argument.IsNotNull(schedulerProvider, nameof(schedulerProvider)); Ensure.Argument.IsNotNull(rxActionFactory, nameof(rxActionFactory)); this.timeService = timeService; this.userPreferences = userPreferences; this.interactorFactory = interactorFactory; this.analyticsService = analyticsService; this.schedulerProvider = schedulerProvider; DataSource = dataSource; OnboardingStorage = onboardingStorage; TextFieldInfo = textFieldInfo.AsDriver(schedulerProvider); IsBillable = isBillable.AsDriver(schedulerProvider); IsSuggestingTags = isSuggestingTags.AsDriver(schedulerProvider); IsSuggestingProjects = isSuggestingProjects.AsDriver(schedulerProvider); IsBillableAvailable = isBillableAvailable.AsDriver(schedulerProvider); DisplayedTime = displayedTime .Select(time => time.ToFormattedString(DurationFormat.Improved)) .AsDriver(schedulerProvider); Done = rxActionFactory.FromObservable <IThreadSafeTimeEntry>(done); DurationTapped = rxActionFactory.FromAction(durationTapped); ToggleBillable = rxActionFactory.FromAction(toggleBillable); SetStartDate = rxActionFactory.FromAsync(setStartDate); ChangeTime = rxActionFactory.FromAsync(changeTime); ToggleTagSuggestions = rxActionFactory.FromAction(toggleTagSuggestions); ToggleProjectSuggestions = rxActionFactory.FromAction(toggleProjectSuggestions); SelectSuggestion = rxActionFactory.FromAsync <AutocompleteSuggestion>(selectSuggestion); SetRunningTime = rxActionFactory.FromAction <TimeSpan>(setRunningTime); ToggleTasks = rxActionFactory.FromAction <ProjectSuggestion>(toggleTasks); SetTextSpans = rxActionFactory.FromAction <IImmutableList <ISpan> >(setTextSpans); var queryByType = queryByTypeSubject .AsObservable() .SelectMany(type => interactorFactory.GetAutocompleteSuggestions(new QueryInfo("", type)).Execute()); var queryByText = textFieldInfo .SelectMany(setBillableValues) .Select(QueryInfo.ParseFieldInfo) .Do(onParsedQuery) .ObserveOn(schedulerProvider.BackgroundScheduler) .SelectMany(query => interactorFactory.GetAutocompleteSuggestions(query).Execute()); Suggestions = Observable.Merge(queryByText, queryByType) .Select(filter) .Select(group) .CombineLatest(expandedProjects, (groups, _) => groups) .Select(toCollections) .Select(addStaticElements) .AsDriver(schedulerProvider); }