From efce31546971f829717ea7a75f2c4df2dfe262e1 Mon Sep 17 00:00:00 2001 From: Helin Shiah Date: Thu, 9 Oct 2025 09:41:52 -0700 Subject: [PATCH 1/3] Open project view for flutter projects --- .../flutter/FlutterStudioStartupActivity.java | 39 +++++++++++++++++-- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/src/io/flutter/FlutterStudioStartupActivity.java b/src/io/flutter/FlutterStudioStartupActivity.java index b1ba7d6ed..27f82dedb 100644 --- a/src/io/flutter/FlutterStudioStartupActivity.java +++ b/src/io/flutter/FlutterStudioStartupActivity.java @@ -5,19 +5,32 @@ */ package io.flutter; +import com.intellij.ide.projectView.ProjectView; +import com.intellij.ide.util.PropertiesComponent; +import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ReadAction; +import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; +import com.intellij.openapi.wm.ToolWindow; +import com.intellij.openapi.wm.ToolWindowManager; +import com.intellij.ui.content.Content; +import com.intellij.ui.content.ContentManager; import com.intellij.util.concurrency.AppExecutorUtil; import io.flutter.android.AndroidModuleLibraryManager; import io.flutter.dart.FlutterDartAnalysisServer; +import io.flutter.logging.PluginLogger; import io.flutter.settings.FlutterSettings; -import io.flutter.utils.AddToAppUtils; -import io.flutter.utils.AndroidUtils; -import io.flutter.utils.GradleUtils; +import io.flutter.utils.*; import org.jetbrains.annotations.NotNull; public class FlutterStudioStartupActivity extends FlutterProjectActivity { + private static @NotNull Logger LOG = PluginLogger.createLogger(FlutterStudioStartupActivity.class); + private static final String IS_FIRST_OPEN_KEY = "io.flutter.project.isFirstOpen"; + private static final String PROJECT_VIEW_ID = "ProjectPane"; + private static Void doNonBlockingStartup(@NotNull Project project) { + LOG.info("Project " + project.getName() + ": Executing Studio startup"); + if (AndroidUtils.isAndroidProject(project)) { GradleUtils.addGradleListeners(project); } @@ -40,5 +53,25 @@ private static Void doNonBlockingStartup(@NotNull Project project) { public void executeProjectStartup(@NotNull Project project) { ReadAction.nonBlocking(() -> doNonBlockingStartup(project)).expireWith(FlutterDartAnalysisServer.getInstance(project)) .submit(AppExecutorUtil.getAppExecutorService()); + + if (!FlutterModuleUtils.declaresFlutter(project)) { + LOG.info("Project " + project.getName() + ": does not declare Flutter; exiting Studio startup before setting project view"); + return; + } + + // Set project tool window to show the project on first open (Android Studio sometimes opens android view instead). + PropertiesComponent properties = PropertiesComponent.getInstance(project); + if (properties == null) return; + if (!properties.isValueSet(IS_FIRST_OPEN_KEY)) { + OpenApiUtils.safeInvokeLater(() -> { + ProjectView projectView = ProjectView.getInstance(project); + if (projectView == null) return; + if (projectView.getPaneIds().contains(PROJECT_VIEW_ID)) { + LOG.info("Project " + project.getName() + ": Setting project tool window to be project view"); + projectView.changeView(PROJECT_VIEW_ID); + } + }); + properties.setValue(IS_FIRST_OPEN_KEY, "true"); + } } } From adf0e00cf3cf6a655ba5c922465de2d4c8516679 Mon Sep 17 00:00:00 2001 From: Helin Shiah Date: Thu, 9 Oct 2025 13:28:33 -0700 Subject: [PATCH 2/3] Fix dependencies --- src/io/flutter/FlutterStudioStartupActivity.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/io/flutter/FlutterStudioStartupActivity.java b/src/io/flutter/FlutterStudioStartupActivity.java index 27f82dedb..0fee8f390 100644 --- a/src/io/flutter/FlutterStudioStartupActivity.java +++ b/src/io/flutter/FlutterStudioStartupActivity.java @@ -7,20 +7,19 @@ import com.intellij.ide.projectView.ProjectView; import com.intellij.ide.util.PropertiesComponent; -import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ReadAction; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; -import com.intellij.openapi.wm.ToolWindow; -import com.intellij.openapi.wm.ToolWindowManager; -import com.intellij.ui.content.Content; -import com.intellij.ui.content.ContentManager; import com.intellij.util.concurrency.AppExecutorUtil; import io.flutter.android.AndroidModuleLibraryManager; import io.flutter.dart.FlutterDartAnalysisServer; import io.flutter.logging.PluginLogger; import io.flutter.settings.FlutterSettings; -import io.flutter.utils.*; +import io.flutter.utils.AddToAppUtils; +import io.flutter.utils.AndroidUtils; +import io.flutter.utils.FlutterModuleUtils; +import io.flutter.utils.GradleUtils; +import io.flutter.utils.OpenApiUtils; import org.jetbrains.annotations.NotNull; public class FlutterStudioStartupActivity extends FlutterProjectActivity { From 58d432e489b000384669362d9f9d057f8c4542ef Mon Sep 17 00:00:00 2001 From: Helin Shiah Date: Fri, 10 Oct 2025 08:49:32 -0700 Subject: [PATCH 3/3] Add comments and clean up messages --- src/io/flutter/FlutterStudioStartupActivity.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/io/flutter/FlutterStudioStartupActivity.java b/src/io/flutter/FlutterStudioStartupActivity.java index 0fee8f390..ca501d0ae 100644 --- a/src/io/flutter/FlutterStudioStartupActivity.java +++ b/src/io/flutter/FlutterStudioStartupActivity.java @@ -28,7 +28,7 @@ public class FlutterStudioStartupActivity extends FlutterProjectActivity { private static final String PROJECT_VIEW_ID = "ProjectPane"; private static Void doNonBlockingStartup(@NotNull Project project) { - LOG.info("Project " + project.getName() + ": Executing Studio startup"); + LOG.info("Project " + project.getName() + ": Executing non-blocking Studio startup"); if (AndroidUtils.isAndroidProject(project)) { GradleUtils.addGradleListeners(project); @@ -54,11 +54,15 @@ public void executeProjectStartup(@NotNull Project project) { .submit(AppExecutorUtil.getAppExecutorService()); if (!FlutterModuleUtils.declaresFlutter(project)) { - LOG.info("Project " + project.getName() + ": does not declare Flutter; exiting Studio startup before setting project view"); + LOG.info("Project " + project.getName() + ": does not declare Flutter; exiting Studio startup before checking project view"); return; } // Set project tool window to show the project on first open (Android Studio sometimes opens android view instead). + // See https://github.com/flutter/flutter-intellij/issues/8556. + // Note: After showing the project view, subsequent opens should go to the project view also. However, if the android subdirectory is + // opened, it seems the full project settings will be modified to open to the Android view instead. See + // https://github.com/flutter/flutter-intellij/pull/8573 for more details. PropertiesComponent properties = PropertiesComponent.getInstance(project); if (properties == null) return; if (!properties.isValueSet(IS_FIRST_OPEN_KEY)) { @@ -66,7 +70,7 @@ public void executeProjectStartup(@NotNull Project project) { ProjectView projectView = ProjectView.getInstance(project); if (projectView == null) return; if (projectView.getPaneIds().contains(PROJECT_VIEW_ID)) { - LOG.info("Project " + project.getName() + ": Setting project tool window to be project view"); + LOG.info("Project " + project.getName() + ": Setting project tool window to be project view on first open"); projectView.changeView(PROJECT_VIEW_ID); } });