From 1cfe6457d05eb649efc93a9d688ee339cab71deb Mon Sep 17 00:00:00 2001 From: Jaime Wren Date: Tue, 29 Apr 2025 19:35:51 -0700 Subject: [PATCH] New notification to nudge users to try Gemini in Android Studio --- .../src/io/flutter/FlutterInitializer.java | 45 +++++++++++++++++++ .../io/flutter/settings/FlutterSettings.java | 9 ++++ 2 files changed, 54 insertions(+) diff --git a/flutter-idea/src/io/flutter/FlutterInitializer.java b/flutter-idea/src/io/flutter/FlutterInitializer.java index 3497a1046..614d009e0 100644 --- a/flutter-idea/src/io/flutter/FlutterInitializer.java +++ b/flutter-idea/src/io/flutter/FlutterInitializer.java @@ -7,6 +7,7 @@ import com.google.gson.JsonObject; import com.google.gson.JsonPrimitive; +import com.intellij.ide.browsers.BrowserLauncher; import com.intellij.ide.plugins.PluginManagerCore; import com.intellij.ide.ui.UISettingsListener; import com.intellij.notification.*; @@ -52,6 +53,7 @@ import io.flutter.view.FlutterViewFactory; import org.jetbrains.annotations.NotNull; +import java.time.LocalDate; import java.util.List; import java.util.concurrent.ExecutionException; import java.util.concurrent.Executors; @@ -181,6 +183,8 @@ public void moduleAdded(@NotNull Project project, @NotNull Module module) { // Send unsupported SDK notifications if relevant. checkSdkVersionNotification(project); + showAndroidStudioBotNotification(project); + setUpDtdAnalytics(project); } @@ -317,6 +321,47 @@ public void actionPerformed(@NotNull AnActionEvent event) { } } + private void showAndroidStudioBotNotification(@NotNull Project project) { + // Return if not a Flutter project + FlutterSdk sdk = FlutterSdk.getFlutterSdk(project); + if (sdk == null) return; + + // Return if not in Android Studio + if (!FlutterUtils.isAndroidStudio()) return; + + // Return if notification has been shown already + final FlutterSettings settings = FlutterSettings.getInstance(); + if (settings == null || settings.isAndroidStudioBotAcknowledged()) return; + + // Return if the current date is not after May 16th, 2025 + LocalDate targetLocalDate = LocalDate.of(2025, 5, 16); + LocalDate nowLocalDate = LocalDate.now(); + if (nowLocalDate.isBefore(targetLocalDate)) return; + + ApplicationManager.getApplication().invokeLater(() -> { + final Notification notification = new Notification(FlutterMessages.FLUTTER_NOTIFICATION_GROUP_ID, + "Try Gemini in Android Studio", + "", + NotificationType.INFORMATION); + notification.addAction(new AnAction("More Info") { + @Override + public void actionPerformed(@NotNull AnActionEvent event) { + BrowserLauncher.getInstance().browse("https://developer.android.com/gemini-in-android", null); + settings.setAndroidStudioBotAcknowledgedKey(true); + notification.expire(); + } + }); + notification.addAction(new AnAction("Dismiss") { + @Override + public void actionPerformed(@NotNull AnActionEvent event) { + settings.setAndroidStudioBotAcknowledgedKey(true); + notification.expire(); + } + }); + Notifications.Bus.notify(notification, project); + }); + } + private void initializeToolWindows(@NotNull Project project) { // Start watching for Flutter debug active events. FlutterViewFactory.init(project); diff --git a/flutter-idea/src/io/flutter/settings/FlutterSettings.java b/flutter-idea/src/io/flutter/settings/FlutterSettings.java index 8dd02c476..3b72c0880 100644 --- a/flutter-idea/src/io/flutter/settings/FlutterSettings.java +++ b/flutter-idea/src/io/flutter/settings/FlutterSettings.java @@ -35,6 +35,7 @@ public class FlutterSettings { private static final String allowTestsInSourcesRootKey = "io.flutter.allowTestsInSources"; private static final String showBazelIosRunNotificationKey = "io.flutter.hideBazelIosRunNotification"; private static final String sdkVersionOutdatedWarningAcknowledgedKey = "io.flutter.sdkVersionOutdatedWarningAcknowledged"; + private static final String androidStudioBotAcknowledgedKey = "io.flutter.androidStudioBotAcknowledgedKey"; // 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. @@ -317,4 +318,12 @@ public void setSdkVersionOutdatedWarningAcknowledged(String versionText, boolean private String getSdkVersionKey(String versionText) { return sdkVersionOutdatedWarningAcknowledgedKey + "_" + versionText; } + + public boolean isAndroidStudioBotAcknowledged() { + return getPropertiesComponent().getBoolean(androidStudioBotAcknowledgedKey, false); + } + + public void setAndroidStudioBotAcknowledgedKey(boolean value) { + getPropertiesComponent().setValue(androidStudioBotAcknowledgedKey, value); + } }