diff --git a/src/io/flutter/FlutterStudioStartupActivity.java b/src/io/flutter/FlutterStudioStartupActivity.java index b1ba7d6ed..ca501d0ae 100644 --- a/src/io/flutter/FlutterStudioStartupActivity.java +++ b/src/io/flutter/FlutterStudioStartupActivity.java @@ -5,19 +5,31 @@ */ package io.flutter; +import com.intellij.ide.projectView.ProjectView; +import com.intellij.ide.util.PropertiesComponent; import com.intellij.openapi.application.ReadAction; +import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; 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.FlutterModuleUtils; import io.flutter.utils.GradleUtils; +import io.flutter.utils.OpenApiUtils; 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 non-blocking Studio startup"); + if (AndroidUtils.isAndroidProject(project)) { GradleUtils.addGradleListeners(project); } @@ -40,5 +52,29 @@ 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 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)) { + 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 on first open"); + projectView.changeView(PROJECT_VIEW_ID); + } + }); + properties.setValue(IS_FIRST_OPEN_KEY, "true"); + } } }