f4436da4a5ee6776ce0a10bee7810dfb22c40ab0
[idea/community.git] / platform / platform-impl / src / com / intellij / openapi / updateSettings / impl / UpdateCheckerComponent.java
1 /*
2  * Copyright 2000-2015 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.intellij.openapi.updateSettings.impl;
17
18 import com.intellij.ide.AppLifecycleListener;
19 import com.intellij.ide.IdeBundle;
20 import com.intellij.notification.NotificationType;
21 import com.intellij.openapi.application.Application;
22 import com.intellij.openapi.application.ApplicationInfo;
23 import com.intellij.openapi.application.ModalityState;
24 import com.intellij.openapi.components.ApplicationComponent;
25 import com.intellij.openapi.updateSettings.impl.pluginsAdvertisement.PluginsAdvertiser;
26 import com.intellij.openapi.util.Disposer;
27 import com.intellij.openapi.util.Ref;
28 import com.intellij.openapi.util.text.StringUtil;
29 import com.intellij.util.Alarm;
30 import com.intellij.util.net.NetUtils;
31 import com.intellij.util.text.DateFormatUtil;
32 import org.jetbrains.annotations.NotNull;
33
34 /**
35  * @author yole
36  */
37 public class UpdateCheckerComponent implements ApplicationComponent {
38   private static final long CHECK_INTERVAL = DateFormatUtil.DAY;
39
40   private final Alarm myCheckForUpdatesAlarm = new Alarm(Alarm.ThreadToUse.SHARED_THREAD);
41   private final Runnable myCheckRunnable = new Runnable() {
42     @Override
43     public void run() {
44       UpdateChecker.updateAndShowResult().doWhenDone(new Runnable() {
45         @Override
46         public void run() {
47           queueNextCheck(CHECK_INTERVAL);
48         }
49       });
50     }
51   };
52   private final UpdateSettings mySettings;
53
54   public UpdateCheckerComponent(@NotNull Application app, @NotNull UpdateSettings settings) {
55     mySettings = settings;
56
57     if (mySettings.SECURE_CONNECTION && !NetUtils.isSniEnabled()) {
58       app.invokeLater(new Runnable() {
59         @Override
60         public void run() {
61           String title = IdeBundle.message("update.notifications.title");
62           String message = IdeBundle.message("update.sni.disabled.notification");
63           UpdateChecker.NOTIFICATIONS.createNotification(title, message, NotificationType.ERROR, null).notify(null);
64         }
65       }, ModalityState.NON_MODAL);
66     }
67
68     scheduleOnStartCheck(app);
69   }
70
71   @Override
72   public void initComponent() {
73     PluginsAdvertiser.ensureDeleted();
74   }
75
76   private void scheduleOnStartCheck(@NotNull Application app) {
77     if (!mySettings.CHECK_NEEDED || mySettings.SECURE_CONNECTION && !NetUtils.isSniEnabled()) {
78       return;
79     }
80
81     app.getMessageBus().connect(app).subscribe(AppLifecycleListener.TOPIC, new AppLifecycleListener.Adapter() {
82       @Override
83       public void appFrameCreated(String[] commandLineArgs, @NotNull Ref<Boolean> willOpenProject) {
84         String currentBuild = ApplicationInfo.getInstance().getBuild().asString();
85         long timeToNextCheck = mySettings.LAST_TIME_CHECKED + CHECK_INTERVAL - System.currentTimeMillis();
86
87         if (StringUtil.compareVersionNumbers(mySettings.LAST_BUILD_CHECKED, currentBuild) < 0 || timeToNextCheck <= 0) {
88           myCheckRunnable.run();
89         }
90         else {
91           queueNextCheck(timeToNextCheck);
92         }
93       }
94     });
95   }
96
97   private void queueNextCheck(long interval) {
98     myCheckForUpdatesAlarm.addRequest(myCheckRunnable, interval);
99   }
100
101   @Override
102   public void disposeComponent() {
103     Disposer.dispose(myCheckForUpdatesAlarm);
104   }
105
106   @NotNull
107   @Override
108   public String getComponentName() {
109     return "UpdateCheckerComponent";
110   }
111
112   public void queueNextCheck() {
113     queueNextCheck(CHECK_INTERVAL);
114   }
115
116   public void cancelChecks() {
117     myCheckForUpdatesAlarm.cancelAllRequests();
118   }
119 }