프로젝트

일반

사용자정보

통계
| 브랜치(Branch): | 개정판:

markus / MarkusAutoUpdate / src / NetSparkle.UI.Avalonia / ViewModels / UpdateAvailableWindowViewModel.cs @ d8f5045e

이력 | 보기 | 이력해설 | 다운로드 (6.11 KB)

1
using NetSparkleUpdater.Enums;
2
using NetSparkleUpdater.UI.Avalonia.Helpers;
3
using NetSparkleUpdater.UI.Avalonia.Interfaces;
4
using System;
5
using System.Collections.Generic;
6
using System.Linq;
7
using System.Text;
8
using System.Threading;
9
using System.Windows.Input;
10

    
11
namespace NetSparkleUpdater.UI.Avalonia.ViewModels
12
{
13
    public class UpdateAvailableWindowViewModel : ChangeNotifier
14
    {
15
        private SparkleUpdater _sparkle;
16
        private List<AppCastItem> _updates;
17
        private ReleaseNotesGrabber _releaseNotesGrabber;
18

    
19
        private CancellationToken _cancellationToken;
20
        private CancellationTokenSource _cancellationTokenSource;
21

    
22
        private string _titleHeaderText;
23
        private string _infoText;
24

    
25
        private bool _isRemindMeLaterEnabled;
26
        private bool _isSkipEnabled;
27

    
28
        private bool _areReleaseNotesVisible;
29
        private bool _isRemindMeLaterVisible;
30
        private bool _isSkipVisible;
31

    
32
        private UpdateAvailableResult _userResponse;
33

    
34
        public UpdateAvailableWindowViewModel()
35
        {
36
            _updates = new List<AppCastItem>();
37
            _areReleaseNotesVisible = true;
38
            _isRemindMeLaterVisible = true;
39
            _isSkipVisible = true;
40
            _userResponse = UpdateAvailableResult.None;
41
        }
42

    
43
        public IReleaseNotesUpdater ReleaseNotesUpdater { get; set; }
44
        public IUserRespondedToUpdateCheck UserRespondedHandler { get; set; }
45

    
46
        public string TitleHeaderText
47
        {
48
            get => _titleHeaderText;
49
            set { _titleHeaderText = value; NotifyPropertyChanged(); }
50
        }
51

    
52
        public string InfoText
53
        {
54
            get => _infoText;
55
            set { _infoText = value; NotifyPropertyChanged(); }
56
        }
57

    
58
        public bool IsRemindMeLaterEnabled
59
        {
60
            get => _isRemindMeLaterEnabled;
61
            set { _isRemindMeLaterEnabled = value; NotifyPropertyChanged(); }
62
        }
63

    
64
        public bool IsSkipEnabled
65
        {
66
            get => _isSkipEnabled;
67
            set { _isSkipEnabled = value; NotifyPropertyChanged(); }
68
        }
69

    
70
        public List<AppCastItem> Updates
71
        {
72
            get => _updates;
73
        }
74

    
75
        public bool AreReleaseNotesVisible
76
        {
77
            get => _areReleaseNotesVisible;
78
            set { _areReleaseNotesVisible = value; NotifyPropertyChanged(); }
79
        }
80

    
81
        public bool IsRemindMeLaterVisible
82
        {
83
            get => _isRemindMeLaterVisible;
84
            set { _isRemindMeLaterVisible = value; NotifyPropertyChanged(); }
85
        }
86

    
87
        public bool IsSkipVisible
88
        {
89
            get => _isSkipVisible;
90
            set { _isSkipVisible = value; NotifyPropertyChanged(); }
91
        }
92

    
93
        public UpdateAvailableResult UserResponse
94
        {
95
            get => _userResponse;
96
        }
97

    
98
        public ICommand Skip => new RelayCommand(PerformSkip);
99
        public ICommand RemindMeLater => new RelayCommand(PerformRemindMeLater);
100
        public ICommand DownloadInstall => new RelayCommand(PerformDownloadInstall);
101

    
102
        public void PerformSkip()
103
        {
104
            SendResponse(UpdateAvailableResult.SkipUpdate);
105
        }
106
        public void PerformRemindMeLater()
107
        {
108
            SendResponse(UpdateAvailableResult.RemindMeLater);
109
        }
110
        public void PerformDownloadInstall()
111
        {
112
            SendResponse(UpdateAvailableResult.InstallUpdate);
113
        }
114

    
115
        private void SendResponse(UpdateAvailableResult response)
116
        {
117
            _userResponse = response;
118
            UserRespondedHandler?.UserRespondedToUpdateCheck(response);
119
            Cancel();
120
        }
121

    
122
        public void Initialize(SparkleUpdater sparkle, List<AppCastItem> items, bool isUpdateAlreadyDownloaded = false,
123
            string separatorTemplate = "", string headAddition = "")
124
        {
125
            _sparkle = sparkle;
126
            _updates = items;
127

    
128
            _releaseNotesGrabber = new ReleaseNotesGrabber(separatorTemplate, headAddition, sparkle);
129

    
130
            AppCastItem item = items.FirstOrDefault();
131

    
132
            // TODO: string translations
133
            TitleHeaderText = string.Format("A new version of {0} is available.", item?.AppName ?? "the application");
134
            var downloadInstallText = isUpdateAlreadyDownloaded ? "install" : "download";
135
            if (item != null)
136
            {
137
                var versionString = "";
138
                try
139
                {
140
                    // Use try/catch since Version constructor can throw an exception and we don't want to
141
                    // die just because the user has a malformed version string
142
                    Version versionObj = new Version(item.AppVersionInstalled);
143
                    versionString = NetSparkleUpdater.Utilities.GetVersionString(versionObj);
144
                }
145
                catch
146
                {
147
                    versionString = "?";
148
                }
149
                InfoText = string.Format("{0} {3} is now available (you have {1}). Would you like to {2} it now?", item.AppName, versionString,
150
                    downloadInstallText, item.Version);
151
            }
152
            else
153
            {
154
                InfoText = string.Format("Would you like to {0} it now?", downloadInstallText);
155
            }
156

    
157
            bool isUserMissingCriticalUpdate = items.Any(x => x.IsCriticalUpdate);
158
            IsRemindMeLaterEnabled = isUserMissingCriticalUpdate == false;
159
            IsSkipEnabled = isUserMissingCriticalUpdate == false;
160

    
161
            _cancellationTokenSource = new CancellationTokenSource();
162
            _cancellationToken = _cancellationTokenSource.Token;
163

    
164
            ReleaseNotesUpdater?.ShowReleaseNotes(_releaseNotesGrabber.GetLoadingText());
165
            LoadReleaseNotes(items);
166
        }
167

    
168
        private async void LoadReleaseNotes(List<AppCastItem> items)
169
        {
170
            AppCastItem latestVersion = items.OrderByDescending(p => p.Version).FirstOrDefault();
171
            string releaseNotes = await _releaseNotesGrabber.DownloadAllReleaseNotes(items, latestVersion, _cancellationToken);
172
            ReleaseNotesUpdater?.ShowReleaseNotes(releaseNotes);
173
        }
174

    
175
        public void Cancel()
176
        {
177
            _cancellationTokenSource?.Cancel();
178
        }
179
    }
180
}
클립보드 이미지 추가 (최대 크기: 500 MB)