From 6c103027ed866b526e7ee794e363af8e88f64418 Mon Sep 17 00:00:00 2001 From: Helin Shiah Date: Fri, 13 Sep 2024 10:14:07 -0700 Subject: [PATCH 1/3] Add notification during initialization --- .../src/io/flutter/FlutterInitializer.java | 48 ++++++++++++++++++- .../src/io/flutter/sdk/FlutterSdkVersion.java | 8 ++++ .../io/flutter/settings/FlutterSettings.java | 14 ++++++ 3 files changed, 68 insertions(+), 2 deletions(-) diff --git a/flutter-idea/src/io/flutter/FlutterInitializer.java b/flutter-idea/src/io/flutter/FlutterInitializer.java index 07c18a2dd6..314c844f7b 100644 --- a/flutter-idea/src/io/flutter/FlutterInitializer.java +++ b/flutter-idea/src/io/flutter/FlutterInitializer.java @@ -10,6 +10,7 @@ import com.google.gson.JsonPrimitive; import com.intellij.ProjectTopics; import com.intellij.ide.BrowserUtil; +import com.intellij.ide.browsers.BrowserLauncher; import com.intellij.ide.plugins.IdeaPluginDescriptor; import com.intellij.ide.plugins.PluginManagerCore; import com.intellij.ide.ui.UISettingsListener; @@ -31,8 +32,11 @@ import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.startup.StartupActivity; import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.openapi.wm.ToolWindow; +import com.intellij.openapi.wm.ToolWindowManager; import com.intellij.util.messages.MessageBusConnection; import com.jetbrains.lang.dart.analyzer.DartAnalysisServerService; +import com.jetbrains.lang.dart.ide.errorTreeView.DartProblemsView; import com.jetbrains.lang.dart.ide.toolingDaemon.DartToolingDaemonService; import de.roderick.weberknecht.WebSocketException; import io.flutter.analytics.Analytics; @@ -59,6 +63,7 @@ import io.flutter.run.daemon.DeviceService; import io.flutter.sdk.FlutterPluginsLibraryManager; import io.flutter.sdk.FlutterSdk; +import io.flutter.sdk.FlutterSdkVersion; import io.flutter.settings.FlutterSettings; import io.flutter.survey.FlutterSurveyNotifications; import io.flutter.utils.FlutterModuleUtils; @@ -215,6 +220,9 @@ public void moduleAdded(@NotNull Project project, @NotNull Module module) { // Initialize notifications for theme changes. setUpThemeChangeNotifications(project); + // Send unsupported SDK notifications if relevant. + checkSdkVersionNotification(project); + setUpDtdAnalytics(project); // Initialize analytics. @@ -276,8 +284,7 @@ private void setUpDtdAnalytics(Project project) { t1.start(); } - private void setUpThemeChangeNotifications(Project project) { - if (project == null) return; + private void setUpThemeChangeNotifications(@NotNull Project project) { FlutterSdk sdk = FlutterSdk.getFlutterSdk(project); if (sdk == null || !sdk.getVersion().canUseDtd()) return; Thread t1 = new Thread(() -> { @@ -350,6 +357,43 @@ private void sendThemeChangedEvent(@NotNull Project project) { }, 1, TimeUnit.SECONDS); } + private void checkSdkVersionNotification(@NotNull Project project) { + FlutterSdk sdk = FlutterSdk.getFlutterSdk(project); + if (sdk == null) return; + final FlutterSdkVersion version = sdk.getVersion(); + + if (!version.sdkIsSupported() && version.getVersionText() != null) { + final FlutterSettings settings = FlutterSettings.getInstance(); + if (settings == null || settings.isSdkVersionOutdatedWarningAcknowledged(version.getVersionText())) return; + + ApplicationManager.getApplication().invokeLater(() -> { + final Notification notification = new Notification("flutter-sdk", + "Flutter SDK requires update", + "Support for v" + + version.getVersionText() + + " of the Flutter SDK will be removed in an upcoming release of the Flutter plugin. Consider updating to a more recent Flutter SDK", + NotificationType.WARNING); + notification.addAction(new AnAction("More Info") { + @Override + public void actionPerformed(@NotNull AnActionEvent event) { + BrowserLauncher.getInstance().browse("https://www.google.com", null); + settings.setSdkVersionOutdatedWarningAcknowledged(version.getVersionText(), true); + notification.expire(); + } + }); + + notification.addAction(new AnAction("I understand") { + @Override + public void actionPerformed(@NotNull AnActionEvent event) { + settings.setSdkVersionOutdatedWarningAcknowledged(version.getVersionText(), true); + notification.expire(); + } + }); + Notifications.Bus.notify(notification, project); + }); + } + } + private static void enableAnalytics(@NotNull Project project) { ToolWindowTracker.track(project, getAnalytics()); DartAnalysisServerService.getInstance(project).addAnalysisServerListener(FlutterAnalysisServerListener.getInstance(project)); diff --git a/flutter-idea/src/io/flutter/sdk/FlutterSdkVersion.java b/flutter-idea/src/io/flutter/sdk/FlutterSdkVersion.java index 3ce09c14fa..6761de39c5 100644 --- a/flutter-idea/src/io/flutter/sdk/FlutterSdkVersion.java +++ b/flutter-idea/src/io/flutter/sdk/FlutterSdkVersion.java @@ -117,6 +117,10 @@ public class FlutterSdkVersion implements Comparable { @NotNull private static final FlutterSdkVersion MIN_SUPPORTS_DTD = new FlutterSdkVersion("3.22.0"); + @NotNull + //private static final FlutterSdkVersion MIN_SDK_SUPPORTED = new FlutterSdkVersion("3.10.0"); + private static final FlutterSdkVersion MIN_SDK_SUPPORTED = new FlutterSdkVersion("3.30.0"); + @Nullable private final Version version; @Nullable @@ -294,6 +298,10 @@ public boolean canUseDtd() { return version != null && this.compareTo(MIN_SUPPORTS_DTD) >= 0; } + public boolean sdkIsSupported() { + return version != null && this.compareTo(MIN_SDK_SUPPORTED) >= 0; + } + public boolean isValid() { return version != null; } diff --git a/flutter-idea/src/io/flutter/settings/FlutterSettings.java b/flutter-idea/src/io/flutter/settings/FlutterSettings.java index 199792b893..9088427d27 100644 --- a/flutter-idea/src/io/flutter/settings/FlutterSettings.java +++ b/flutter-idea/src/io/flutter/settings/FlutterSettings.java @@ -12,6 +12,7 @@ import com.intellij.util.EventDispatcher; import com.jetbrains.lang.dart.analyzer.DartClosingLabelManager; import io.flutter.analytics.Analytics; +import io.flutter.sdk.FlutterSdkVersion; import java.util.EventListener; @@ -34,6 +35,7 @@ public class FlutterSettings { private static final String fontPackagesKey = "io.flutter.fontPackages"; private static final String allowTestsInSourcesRootKey = "io.flutter.allowTestsInSources"; private static final String showBazelIosRunNotificationKey = "io.flutter.hideBazelIosRunNotification"; + private static final String sdkVersionOutdatedWarningAcknowledgedKey = "io.flutter.sdkVersionOutdatedWarningAcknowledged"; // TODO(helin24): This is to change the embedded browser setting back to true only once for Big Sur users. If we // switch to enabling the embedded browser for everyone, then delete this key. @@ -381,4 +383,16 @@ public void setShowBazelIosRunNotification(boolean value) { getPropertiesComponent().setValue(showBazelIosRunNotificationKey, value, true); fireEvent(); } + + public boolean isSdkVersionOutdatedWarningAcknowledged(String versionText) { + return getPropertiesComponent().getBoolean(getSdkVersionKey(versionText)); + } + + public void setSdkVersionOutdatedWarningAcknowledged(String versionText, boolean value) { + getPropertiesComponent().setValue(getSdkVersionKey(versionText), value); + } + + private String getSdkVersionKey(String versionText) { + return sdkVersionOutdatedWarningAcknowledgedKey + "_" + versionText; + } } From e3e3111b56ff42c29d5fde760db64c675efea9c4 Mon Sep 17 00:00:00 2001 From: Helin Shiah Date: Fri, 13 Sep 2024 10:18:39 -0700 Subject: [PATCH 2/3] Add TODOs to update later --- flutter-idea/src/io/flutter/FlutterInitializer.java | 1 + flutter-idea/src/io/flutter/sdk/FlutterSdkVersion.java | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/flutter-idea/src/io/flutter/FlutterInitializer.java b/flutter-idea/src/io/flutter/FlutterInitializer.java index 314c844f7b..9dd810e363 100644 --- a/flutter-idea/src/io/flutter/FlutterInitializer.java +++ b/flutter-idea/src/io/flutter/FlutterInitializer.java @@ -376,6 +376,7 @@ private void checkSdkVersionNotification(@NotNull Project project) { notification.addAction(new AnAction("More Info") { @Override public void actionPerformed(@NotNull AnActionEvent event) { + // TODO(helin24): Update with informational URL. BrowserLauncher.getInstance().browse("https://www.google.com", null); settings.setSdkVersionOutdatedWarningAcknowledged(version.getVersionText(), true); notification.expire(); diff --git a/flutter-idea/src/io/flutter/sdk/FlutterSdkVersion.java b/flutter-idea/src/io/flutter/sdk/FlutterSdkVersion.java index 6761de39c5..de0adbece2 100644 --- a/flutter-idea/src/io/flutter/sdk/FlutterSdkVersion.java +++ b/flutter-idea/src/io/flutter/sdk/FlutterSdkVersion.java @@ -118,8 +118,8 @@ public class FlutterSdkVersion implements Comparable { private static final FlutterSdkVersion MIN_SUPPORTS_DTD = new FlutterSdkVersion("3.22.0"); @NotNull - //private static final FlutterSdkVersion MIN_SDK_SUPPORTED = new FlutterSdkVersion("3.10.0"); - private static final FlutterSdkVersion MIN_SDK_SUPPORTED = new FlutterSdkVersion("3.30.0"); + // TODO(helin24): Update with the right version. + private static final FlutterSdkVersion MIN_SDK_SUPPORTED = new FlutterSdkVersion("3.10.0"); @Nullable private final Version version; From 5d96fae2b14e860b4e9371019dd7373e7c063113 Mon Sep 17 00:00:00 2001 From: Helin Shiah Date: Fri, 4 Oct 2024 13:32:44 -0700 Subject: [PATCH 3/3] Make min supported a low version number until update --- flutter-idea/src/io/flutter/sdk/FlutterSdkVersion.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flutter-idea/src/io/flutter/sdk/FlutterSdkVersion.java b/flutter-idea/src/io/flutter/sdk/FlutterSdkVersion.java index de0adbece2..dfd2e90293 100644 --- a/flutter-idea/src/io/flutter/sdk/FlutterSdkVersion.java +++ b/flutter-idea/src/io/flutter/sdk/FlutterSdkVersion.java @@ -119,7 +119,7 @@ public class FlutterSdkVersion implements Comparable { @NotNull // TODO(helin24): Update with the right version. - private static final FlutterSdkVersion MIN_SDK_SUPPORTED = new FlutterSdkVersion("3.10.0"); + private static final FlutterSdkVersion MIN_SDK_SUPPORTED = new FlutterSdkVersion("0.0.1"); @Nullable private final Version version;