Skip to content

Commit bb25862

Browse files
authored
Add notification when SDK is unsupported (#7650)
Analogous to Dart-Code/Dart-Code#5257
1 parent acbd1bb commit bb25862

File tree

3 files changed

+69
-2
lines changed

3 files changed

+69
-2
lines changed

flutter-idea/src/io/flutter/FlutterInitializer.java

Lines changed: 47 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import com.google.gson.JsonPrimitive;
1111
import com.intellij.ProjectTopics;
1212
import com.intellij.ide.BrowserUtil;
13+
import com.intellij.ide.browsers.BrowserLauncher;
1314
import com.intellij.ide.plugins.IdeaPluginDescriptor;
1415
import com.intellij.ide.plugins.PluginManagerCore;
1516
import com.intellij.ide.ui.UISettingsListener;
@@ -31,8 +32,11 @@
3132
import com.intellij.openapi.roots.ProjectRootManager;
3233
import com.intellij.openapi.startup.StartupActivity;
3334
import com.intellij.openapi.vfs.VirtualFile;
35+
import com.intellij.openapi.wm.ToolWindow;
36+
import com.intellij.openapi.wm.ToolWindowManager;
3437
import com.intellij.util.messages.MessageBusConnection;
3538
import com.jetbrains.lang.dart.analyzer.DartAnalysisServerService;
39+
import com.jetbrains.lang.dart.ide.errorTreeView.DartProblemsView;
3640
import com.jetbrains.lang.dart.ide.toolingDaemon.DartToolingDaemonService;
3741
import de.roderick.weberknecht.WebSocketException;
3842
import io.flutter.analytics.Analytics;
@@ -59,6 +63,7 @@
5963
import io.flutter.run.daemon.DeviceService;
6064
import io.flutter.sdk.FlutterPluginsLibraryManager;
6165
import io.flutter.sdk.FlutterSdk;
66+
import io.flutter.sdk.FlutterSdkVersion;
6267
import io.flutter.settings.FlutterSettings;
6368
import io.flutter.survey.FlutterSurveyNotifications;
6469
import io.flutter.utils.FlutterModuleUtils;
@@ -215,6 +220,9 @@ public void moduleAdded(@NotNull Project project, @NotNull Module module) {
215220
// Initialize notifications for theme changes.
216221
setUpThemeChangeNotifications(project);
217222

223+
// Send unsupported SDK notifications if relevant.
224+
checkSdkVersionNotification(project);
225+
218226
setUpDtdAnalytics(project);
219227

220228
// Initialize analytics.
@@ -276,8 +284,7 @@ private void setUpDtdAnalytics(Project project) {
276284
t1.start();
277285
}
278286

279-
private void setUpThemeChangeNotifications(Project project) {
280-
if (project == null) return;
287+
private void setUpThemeChangeNotifications(@NotNull Project project) {
281288
FlutterSdk sdk = FlutterSdk.getFlutterSdk(project);
282289
if (sdk == null || !sdk.getVersion().canUseDtd()) return;
283290
Thread t1 = new Thread(() -> {
@@ -354,6 +361,44 @@ private void sendThemeChangedEvent(@NotNull Project project) {
354361
}, 1, TimeUnit.SECONDS);
355362
}
356363

364+
private void checkSdkVersionNotification(@NotNull Project project) {
365+
FlutterSdk sdk = FlutterSdk.getFlutterSdk(project);
366+
if (sdk == null) return;
367+
final FlutterSdkVersion version = sdk.getVersion();
368+
369+
if (!version.sdkIsSupported() && version.getVersionText() != null) {
370+
final FlutterSettings settings = FlutterSettings.getInstance();
371+
if (settings == null || settings.isSdkVersionOutdatedWarningAcknowledged(version.getVersionText())) return;
372+
373+
ApplicationManager.getApplication().invokeLater(() -> {
374+
final Notification notification = new Notification("flutter-sdk",
375+
"Flutter SDK requires update",
376+
"Support for v" +
377+
version.getVersionText() +
378+
" of the Flutter SDK will be removed in an upcoming release of the Flutter plugin. Consider updating to a more recent Flutter SDK",
379+
NotificationType.WARNING);
380+
notification.addAction(new AnAction("More Info") {
381+
@Override
382+
public void actionPerformed(@NotNull AnActionEvent event) {
383+
// TODO(helin24): Update with informational URL.
384+
BrowserLauncher.getInstance().browse("https://www.google.com", null);
385+
settings.setSdkVersionOutdatedWarningAcknowledged(version.getVersionText(), true);
386+
notification.expire();
387+
}
388+
});
389+
390+
notification.addAction(new AnAction("I understand") {
391+
@Override
392+
public void actionPerformed(@NotNull AnActionEvent event) {
393+
settings.setSdkVersionOutdatedWarningAcknowledged(version.getVersionText(), true);
394+
notification.expire();
395+
}
396+
});
397+
Notifications.Bus.notify(notification, project);
398+
});
399+
}
400+
}
401+
357402
private static void enableAnalytics(@NotNull Project project) {
358403
ToolWindowTracker.track(project, getAnalytics());
359404
DartAnalysisServerService.getInstance(project).addAnalysisServerListener(FlutterAnalysisServerListener.getInstance(project));

flutter-idea/src/io/flutter/sdk/FlutterSdkVersion.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,10 @@ public class FlutterSdkVersion implements Comparable<FlutterSdkVersion> {
117117
@NotNull
118118
private static final FlutterSdkVersion MIN_SUPPORTS_DTD = new FlutterSdkVersion("3.22.0");
119119

120+
@NotNull
121+
// TODO(helin24): Update with the right version.
122+
private static final FlutterSdkVersion MIN_SDK_SUPPORTED = new FlutterSdkVersion("0.0.1");
123+
120124
@Nullable
121125
private final Version version;
122126
@Nullable
@@ -294,6 +298,10 @@ public boolean canUseDtd() {
294298
return version != null && this.compareTo(MIN_SUPPORTS_DTD) >= 0;
295299
}
296300

301+
public boolean sdkIsSupported() {
302+
return version != null && this.compareTo(MIN_SDK_SUPPORTED) >= 0;
303+
}
304+
297305
public boolean isValid() {
298306
return version != null;
299307
}

flutter-idea/src/io/flutter/settings/FlutterSettings.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import com.intellij.util.EventDispatcher;
1313
import com.jetbrains.lang.dart.analyzer.DartClosingLabelManager;
1414
import io.flutter.analytics.Analytics;
15+
import io.flutter.sdk.FlutterSdkVersion;
1516

1617
import java.util.EventListener;
1718

@@ -34,6 +35,7 @@ public class FlutterSettings {
3435
private static final String fontPackagesKey = "io.flutter.fontPackages";
3536
private static final String allowTestsInSourcesRootKey = "io.flutter.allowTestsInSources";
3637
private static final String showBazelIosRunNotificationKey = "io.flutter.hideBazelIosRunNotification";
38+
private static final String sdkVersionOutdatedWarningAcknowledgedKey = "io.flutter.sdkVersionOutdatedWarningAcknowledged";
3739

3840
// TODO(helin24): This is to change the embedded browser setting back to true only once for Big Sur users. If we
3941
// switch to enabling the embedded browser for everyone, then delete this key.
@@ -381,4 +383,16 @@ public void setShowBazelIosRunNotification(boolean value) {
381383
getPropertiesComponent().setValue(showBazelIosRunNotificationKey, value, true);
382384
fireEvent();
383385
}
386+
387+
public boolean isSdkVersionOutdatedWarningAcknowledged(String versionText) {
388+
return getPropertiesComponent().getBoolean(getSdkVersionKey(versionText));
389+
}
390+
391+
public void setSdkVersionOutdatedWarningAcknowledged(String versionText, boolean value) {
392+
getPropertiesComponent().setValue(getSdkVersionKey(versionText), value);
393+
}
394+
395+
private String getSdkVersionKey(String versionText) {
396+
return sdkVersionOutdatedWarningAcknowledgedKey + "_" + versionText;
397+
}
384398
}

0 commit comments

Comments
 (0)