IDEA-136855 (warning message clarified)
[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.SystemInfo;
29 import com.intellij.openapi.util.text.StringUtil;
30 import com.intellij.util.Alarm;
31 import com.intellij.util.net.NetUtils;
32 import com.intellij.util.text.DateFormatUtil;
33 import org.jetbrains.annotations.NotNull;
34
35 /**
36  * @author yole
37  */
38 public class UpdateCheckerComponent implements ApplicationComponent {
39   private static final long CHECK_INTERVAL = DateFormatUtil.DAY;
40
41   private final Alarm myCheckForUpdatesAlarm = new Alarm(Alarm.ThreadToUse.SHARED_THREAD);
42   private final Runnable myCheckRunnable = new Runnable() {
43     @Override
44     public void run() {
45       UpdateChecker.updateAndShowResult().doWhenDone(new Runnable() {
46         @Override
47         public void run() {
48           queueNextCheck(CHECK_INTERVAL);
49         }
50       });
51     }
52   };
53   private final UpdateSettings mySettings;
54
55   public UpdateCheckerComponent(@NotNull Application app, @NotNull UpdateSettings settings) {
56     mySettings = settings;
57
58     if (mySettings.SECURE_CONNECTION && !NetUtils.isSniEnabled()) {
59       app.invokeLater(new Runnable() {
60         @Override
61         public void run() {
62           String title = IdeBundle.message("update.notifications.title");
63           boolean tooOld = !SystemInfo.isJavaVersionAtLeast("1.7");
64           String message = IdeBundle.message(tooOld ? "update.sni.not.available.notification" : "update.sni.disabled.notification");
65           UpdateChecker.NOTIFICATIONS.createNotification(title, message, NotificationType.ERROR, null).notify(null);
66         }
67       }, ModalityState.NON_MODAL);
68     }
69
70     scheduleOnStartCheck(app);
71   }
72
73   @Override
74   public void initComponent() {
75     PluginsAdvertiser.ensureDeleted();
76   }
77
78   private void scheduleOnStartCheck(@NotNull Application app) {
79     if (!mySettings.CHECK_NEEDED || mySettings.SECURE_CONNECTION && !NetUtils.isSniEnabled()) {
80       return;
81     }
82
83     app.getMessageBus().connect(app).subscribe(AppLifecycleListener.TOPIC, new AppLifecycleListener.Adapter() {
84       @Override
85       public void appFrameCreated(String[] commandLineArgs, @NotNull Ref<Boolean> willOpenProject) {
86         String currentBuild = ApplicationInfo.getInstance().getBuild().asString();
87         long timeToNextCheck = mySettings.LAST_TIME_CHECKED + CHECK_INTERVAL - System.currentTimeMillis();
88
89         if (StringUtil.compareVersionNumbers(mySettings.LAST_BUILD_CHECKED, currentBuild) < 0 || timeToNextCheck <= 0) {
90           myCheckRunnable.run();
91         }
92         else {
93           queueNextCheck(timeToNextCheck);
94         }
95       }
96     });
97   }
98
99   private void queueNextCheck(long interval) {
100     myCheckForUpdatesAlarm.addRequest(myCheckRunnable, interval);
101   }
102
103   @Override
104   public void disposeComponent() {
105     Disposer.dispose(myCheckForUpdatesAlarm);
106   }
107
108   @NotNull
109   @Override
110   public String getComponentName() {
111     return "UpdateCheckerComponent";
112   }
113
114   public void queueNextCheck() {
115     queueNextCheck(CHECK_INTERVAL);
116   }
117
118   public void cancelChecks() {
119     myCheckForUpdatesAlarm.cancelAllRequests();
120   }
121 }