#pragma warning disable RECS0165 // Asynchronous methods should return a Task instead of void
        protected override async void OnInitialize()
#pragma warning restore RECS0165 // Asynchronous methods should return a Task instead of void
        {
            try
            {
                if (_hasLoaded)
                {
                    return;
                }

                Observable.FromEventPattern <EventArgs>(_configService, "SettingsChanged")
                .ObserveOnDispatcher()
                .Subscribe(eventPattern => ListViewMode = ((AppConfiguration)eventPattern.Sender).DefaultToTileViewForLocalSource ? ListViewMode.Tile : ListViewMode.Standard);

                await LoadPackages();

                Observable.FromEventPattern <PropertyChangedEventArgs>(this, "PropertyChanged")
                .Where(
                    eventPattern =>
                    eventPattern.EventArgs.PropertyName == nameof(MatchWord) ||
                    eventPattern.EventArgs.PropertyName == nameof(SearchQuery) ||
                    eventPattern.EventArgs.PropertyName == nameof(ShowOnlyPackagesWithUpdate))
                .ObserveOnDispatcher()
                .Subscribe(eventPattern => PackageSource.Refresh());

                Observable.FromEventPattern <PropertyChangedEventArgs>(this, "PropertyChanged")
                .Where(eventPattern => eventPattern.EventArgs.PropertyName == nameof(ListViewMode))
                .ObserveOnDispatcher()
                .Subscribe(eventPattern =>
                {
                    if (ListViewMode == ListViewMode.Tile)
                    {
                        // reset custom sorting for now
                        var listColView = PackageSource as ListCollectionView;
                        if (listColView != null)
                        {
                            listColView.CustomSort = null;
                        }
                    }
                });

                _hasLoaded = true;

                var chocoPackage = _packages.FirstOrDefault(p => p.Id.ToLower() == "chocolatey");
                if (chocoPackage != null && chocoPackage.CanUpdate)
                {
#pragma warning disable CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed
                    _progressService.ShowMessageAsync(Resources.LocalSourceViewModel_Chocolatey, Resources.LocalSourceViewModel_UpdateAvailableForChocolatey)
                    .ConfigureAwait(false);
#pragma warning restore CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed
                }
            }
            catch (Exception ex)
            {
                Logger.Fatal("Local source control view model failed to load.", ex);
                throw;
            }
        }
        private async Task LoadPackages()
        {
            if (IsLoading)
            {
                return;
            }

            IsLoading = true;

            IsShowOnlyPackagesWithUpdateEnabled = false;

            try
            {
                _packages.Clear();
                Packages.Clear();

                var packages = (await _chocolateyService.GetInstalledPackages())
                               .Select(Mapper.Map <IPackageViewModel>).ToList();

                foreach (var packageViewModel in packages)
                {
                    _packages.Add(packageViewModel);
                    Packages.Add(packageViewModel);
                }

                FirstLoadIncomplete = false;

                var updates = await _chocolateyService.GetOutdatedPackages();

                foreach (var update in updates)
                {
                    await _eventAggregator.PublishOnUIThreadAsync(new PackageHasUpdateMessage(update.Id, update.Version));
                }

                PackageSource.Refresh();
            }
            catch (ConnectionClosedException)
            {
                Logger.Warning("Threw connection closed message while processing load packages.");
            }
            catch (Exception ex)
            {
                Logger.Fatal("Packages failed to load", ex);
                throw;
            }
            finally
            {
                IsLoading = false;

                IsShowOnlyPackagesWithUpdateEnabled = true;
            }
        }
예제 #3
0
        public async Task HandleAsync(PackageChangedMessage message, CancellationToken cancellationToken)
#endif
        {
            switch (message.ChangeType)
            {
            case PackageChangeType.Pinned:
                PackageSource.Refresh();
                break;

            case PackageChangeType.Unpinned:
                if (message.Package.SourceType != chocolatey.infrastructure.app.domain.SourceType.normal)
                {
                    PackageSource.Refresh();
                }
                else
                {
                    // Local file system
                    var package = Packages.First(p => p.Id == message.Id);
                    if (package.LatestVersion != null)
                    {
                        PackageSource.Refresh();
                    }
                    else
                    {
                        var outOfDatePackages =
                            await _chocolateyService.GetOutdatedPackages(package.IsPrerelease, package.Id, false);

                        foreach (var update in outOfDatePackages)
                        {
                            await _eventAggregator.PublishOnUIThreadAsync(new PackageHasUpdateMessage(update.Id, update.Version));
                        }

                        PackageSource.Refresh();
                    }
                }
                break;

            case PackageChangeType.Uninstalled:
                Packages.Remove(Packages.First(p => p.Id == message.Id));
                break;

            default:
                await LoadPackages();

                break;
            }
        }
예제 #4
0
        private async Task CheckOutdated(bool forceCheckForOutdated)
        {
            IsLoading = true;

            try
            {
                var updates = await _chocolateyService.GetOutdatedPackages(false, null, forceCheckForOutdated);

                // Use a list of task for correct async loop
                var listOfTasks = updates.Select(update => _eventAggregator.PublishOnUIThreadAsync(new PackageHasUpdateMessage(update.Id, update.Version))).ToList();
                await Task.WhenAll(listOfTasks);

                PackageSource.Refresh();
            }
            catch (ConnectionClosedException)
            {
                Logger.Warning("Threw connection closed message while processing load packages.");
            }
            catch (Exception ex)
            {
                Logger.Fatal("Packages failed to load", ex);
                throw;
            }
            finally
            {
                IsLoading = false;

                // Only enable the "Show only outdated packages" when it makes sense.
                // It does not make sense to enable the checkbox when we haven't checked for
                // outdated packages. We should only enable the checkbox here when: (or)
                // 1. the "Prevent Automated Outdated Packages Check" is disabled
                // 2. forced a check for outdated packages.
                IsShowOnlyPackagesWithUpdateEnabled = !_configService.GetAppConfiguration().PreventAutomatedOutdatedPackagesCheck || forceCheckForOutdated;

                // Force invalidating the command stuff.
                // This helps us to prevent disabled buttons after executing this routine.
                // But IMO it has something to do with Caliburn.
                CommandManager.InvalidateRequerySuggested();
            }
        }
        public async Task Handle(PackageChangedMessage message)
        {
            switch (message.ChangeType)
            {
            case PackageChangeType.Pinned:
                PackageSource.Refresh();
                break;

            case PackageChangeType.Unpinned:
                var package = Packages.First(p => p.Id == message.Id);
                if (package.LatestVersion != null)
                {
                    PackageSource.Refresh();
                }
                else
                {
                    var outOfDatePackages =
                        await _chocolateyService.GetOutdatedPackages(package.IsPrerelease, package.Id);

                    foreach (var update in outOfDatePackages)
                    {
                        await _eventAggregator.PublishOnUIThreadAsync(new PackageHasUpdateMessage(update.Id, update.Version));
                    }

                    PackageSource.Refresh();
                }

                break;

            case PackageChangeType.Uninstalled:
                Packages.Remove(Packages.First(p => p.Id == message.Id));
                break;

            default:
                await LoadPackages();

                break;
            }
        }
예제 #6
0
#pragma warning disable RECS0165 // Asynchronous methods should return a Task instead of void
        protected override async void OnInitialize()
#pragma warning restore RECS0165 // Asynchronous methods should return a Task instead of void
        {
            try
            {
                if (_hasLoaded)
                {
                    return;
                }

                await LoadPackages();

                Observable.FromEventPattern <PropertyChangedEventArgs>(this, "PropertyChanged")
                .Where(
                    eventPattern =>
                    eventPattern.EventArgs.PropertyName == "MatchWord" ||
                    eventPattern.EventArgs.PropertyName == "SearchQuery" ||
                    eventPattern.EventArgs.PropertyName == "ShowOnlyPackagesWithUpdate")
                .ObserveOnDispatcher()
                .Subscribe(eventPattern => PackageSource.Refresh());

                _hasLoaded = true;

                var chocoPackage = _packages.FirstOrDefault(p => p.Id.ToLower() == "chocolatey");
                if (chocoPackage != null && chocoPackage.CanUpdate)
                {
#pragma warning disable CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed
                    _progressService.ShowMessageAsync(Resources.LocalSourceViewModel_Chocolatey, Resources.LocalSourceViewModel_UpdateAvailableForChocolatey)
                    .ConfigureAwait(false);
#pragma warning restore CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed
                }
            }
            catch (Exception ex)
            {
                Logger.Fatal("Local source control view model failed to load.", ex);
                throw;
            }
        }
예제 #7
0
#pragma warning disable RECS0165 // Asynchronous methods should return a Task instead of void
        protected override async void OnInitialize()
#pragma warning restore RECS0165 // Asynchronous methods should return a Task instead of void
        {
            try
            {
                if (HasLoaded)
                {
                    return;
                }

                ListViewMode = _configService.GetEffectiveConfiguration().DefaultToTileViewForLocalSource ?? true ? ListViewMode.Tile : ListViewMode.Standard;
                ShowAdditionalPackageInformation = _configService.GetEffectiveConfiguration().ShowAdditionalPackageInformation ?? false;

                Observable.FromEventPattern <EventArgs>(_configService, "SettingsChanged")
                .ObserveOnDispatcher()
                .Subscribe(eventPattern =>
                {
                    var appConfig = (AppConfiguration)eventPattern.Sender;

                    ListViewMode = appConfig.DefaultToTileViewForLocalSource ?? false
                                ? ListViewMode.Tile
                                : ListViewMode.Standard;
                    ShowAdditionalPackageInformation = appConfig.ShowAdditionalPackageInformation ?? false;
                });

                await LoadPackages();

                Observable.FromEventPattern <PropertyChangedEventArgs>(this, "PropertyChanged")
                .Where(
                    eventPattern =>
                    eventPattern.EventArgs.PropertyName == nameof(MatchWord) ||
                    eventPattern.EventArgs.PropertyName == nameof(SearchQuery) ||
                    eventPattern.EventArgs.PropertyName == nameof(ShowOnlyPackagesWithUpdate))
                .ObserveOnDispatcher()
                .Subscribe(eventPattern => PackageSource.Refresh());

                Observable.FromEventPattern <PropertyChangedEventArgs>(this, "PropertyChanged")
                .Where(eventPattern => eventPattern.EventArgs.PropertyName == nameof(ListViewMode))
                .ObserveOnDispatcher()
                .Subscribe(eventPattern =>
                {
                    if (ListViewMode == ListViewMode.Tile)
                    {
                        // reset custom sorting for now
                        var listColView = PackageSource as ListCollectionView;
                        if (listColView != null)
                        {
                            listColView.CustomSort = null;
                        }
                    }
                });

                HasLoaded = true;

                var chocoPackage = _packages.FirstOrDefault(p => p.Id.ToLower() == "chocolatey");
                if (chocoPackage != null && chocoPackage.CanUpdate)
                {
                    await _dialogService.ShowMessageAsync(
                        L(nameof(Resources.LocalSourceViewModel_Chocolatey)),
                        L(nameof(Resources.LocalSourceViewModel_UpdateAvailableForChocolatey)))
                    .ConfigureAwait(false);
                }
            }
            catch (Exception ex)
            {
                Logger.Fatal("Local source control view model failed to load.", ex);
                throw;
            }
        }