diff --git a/plugins/terminal/resources/messages/TerminalBundle.properties b/plugins/terminal/resources/messages/TerminalBundle.properties index b02583398223..9d73fd062f47 100644 --- a/plugins/terminal/resources/messages/TerminalBundle.properties +++ b/plugins/terminal/resources/messages/TerminalBundle.properties @@ -107,4 +107,5 @@ feedback.dialog.rating.performance=Performance: feedback.dialog.other=Is there anything else you'd like to share? feedback.dialog.other.placeholder=For example, missing features or vice versa, what you particularly like. feedback.system.info.shell=Most used shell: -feedback.system.info.commands.number=Executed commands number: \ No newline at end of file +feedback.system.info.commands.number=Executed commands number: +feedback.system.info.moment=Feedback moment: \ No newline at end of file diff --git a/plugins/terminal/src/org/jetbrains/plugins/terminal/TerminalSettingsPanel.java b/plugins/terminal/src/org/jetbrains/plugins/terminal/TerminalSettingsPanel.java index 1d1bf123eae1..49373f238804 100644 --- a/plugins/terminal/src/org/jetbrains/plugins/terminal/TerminalSettingsPanel.java +++ b/plugins/terminal/src/org/jetbrains/plugins/terminal/TerminalSettingsPanel.java @@ -6,6 +6,8 @@ import com.intellij.execution.configurations.PathEnvironmentVariableUtil; import com.intellij.icons.AllIcons; import com.intellij.ide.DataManager; import com.intellij.ide.impl.TrustedProjects; +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory; import com.intellij.openapi.options.Configurable; import com.intellij.openapi.options.ConfigurationException; @@ -35,6 +37,7 @@ import com.intellij.util.concurrency.EdtExecutorService; import com.intellij.util.ui.SwingHelper; import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NotNull; +import org.jetbrains.plugins.terminal.exp.feedback.BlockTerminalFeedbackSurveyKt; import org.jetbrains.plugins.terminal.fus.BlockTerminalSwitchPlace; import org.jetbrains.plugins.terminal.fus.TerminalUsageTriggerCollector; @@ -192,6 +195,11 @@ public final class TerminalSettingsPanel { blockTerminalSetting.setValue(myNewUiCheckbox.isSelected()); TerminalUsageTriggerCollector.triggerBlockTerminalSwitched$intellij_terminal(myProject, myNewUiCheckbox.isSelected(), BlockTerminalSwitchPlace.SETTINGS); + if (!myNewUiCheckbox.isSelected()) { + ApplicationManager.getApplication().invokeLater(() -> { + BlockTerminalFeedbackSurveyKt.showBlockTerminalFeedbackNotification(myProject); + }, ModalityState.nonModal()); + } } myProjectOptionsProvider.setStartingDirectory(myStartDirectoryField.getText()); myProjectOptionsProvider.setShellPath(myShellPathField.getText()); diff --git a/plugins/terminal/src/org/jetbrains/plugins/terminal/action/EnableBlockTerminalUiAction.kt b/plugins/terminal/src/org/jetbrains/plugins/terminal/action/EnableBlockTerminalUiAction.kt index fa17b788d701..a87749ecb01c 100644 --- a/plugins/terminal/src/org/jetbrains/plugins/terminal/action/EnableBlockTerminalUiAction.kt +++ b/plugins/terminal/src/org/jetbrains/plugins/terminal/action/EnableBlockTerminalUiAction.kt @@ -11,6 +11,7 @@ import com.intellij.ui.ExperimentalUI import org.jetbrains.plugins.terminal.LocalBlockTerminalRunner import org.jetbrains.plugins.terminal.TerminalBundle import org.jetbrains.plugins.terminal.TerminalToolWindowManager +import org.jetbrains.plugins.terminal.exp.feedback.showBlockTerminalFeedbackNotification import org.jetbrains.plugins.terminal.fus.BlockTerminalSwitchPlace import org.jetbrains.plugins.terminal.fus.TerminalUsageTriggerCollector @@ -23,6 +24,9 @@ class EnableBlockTerminalUiAction : DumbAwareToggleAction(TerminalBundle.message Registry.get(LocalBlockTerminalRunner.BLOCK_TERMINAL_REGISTRY).setValue(state) val project = e.project!! TerminalUsageTriggerCollector.triggerBlockTerminalSwitched(project, state, BlockTerminalSwitchPlace.TOOLWINDOW_OPTIONS) + if (!state) { + showBlockTerminalFeedbackNotification(project) + } TerminalToolWindowManager.getInstance(project).createNewSession() } diff --git a/plugins/terminal/src/org/jetbrains/plugins/terminal/exp/feedback/BlockTerminalFeedbackDialog.kt b/plugins/terminal/src/org/jetbrains/plugins/terminal/exp/feedback/BlockTerminalFeedbackDialog.kt index e5b113e251d0..ed040b880918 100644 --- a/plugins/terminal/src/org/jetbrains/plugins/terminal/exp/feedback/BlockTerminalFeedbackDialog.kt +++ b/plugins/terminal/src/org/jetbrains/plugins/terminal/exp/feedback/BlockTerminalFeedbackDialog.kt @@ -14,6 +14,8 @@ import kotlinx.serialization.json.JsonElement import kotlinx.serialization.json.encodeToJsonElement import org.jetbrains.plugins.terminal.TerminalBundle import org.jetbrains.plugins.terminal.exp.TerminalUsageLocalStorage +import org.jetbrains.plugins.terminal.exp.feedback.BlockTerminalFeedbackMoment.AFTER_USAGE +import org.jetbrains.plugins.terminal.exp.feedback.BlockTerminalFeedbackMoment.ON_DISABLING internal class BlockTerminalFeedbackDialog(project: Project, forTest: Boolean) : BlockBasedFeedbackDialog(project, forTest) { override val myFeedbackReportId: String = "new_terminal" @@ -22,13 +24,16 @@ internal class BlockTerminalFeedbackDialog(project: Project, forTest: Boolean) : override val mySystemInfoData: BlockTerminalUsageData by lazy { val usageStorage = TerminalUsageLocalStorage.getInstance() + BlockTerminalUsageData( mostUsedShell = usageStorage.mostUsedShell, executedCommandsNumber = usageStorage.executedCommandsNumber, + feedbackMoment = if (myProject!!.getUserData(BLOCK_TERMINAL_DISABLING) == true) ON_DISABLING else AFTER_USAGE, systemInfo = CommonFeedbackSystemData.getCurrentData() ) } + @Suppress("HardCodedStringLiteral") override val myShowFeedbackSystemInfoDialog: () -> Unit = { showFeedbackSystemInfoDialog(myProject, mySystemInfoData.systemInfo) { row(TerminalBundle.message("feedback.system.info.shell")) { @@ -37,6 +42,9 @@ internal class BlockTerminalFeedbackDialog(project: Project, forTest: Boolean) : row(TerminalBundle.message("feedback.system.info.commands.number")) { label(mySystemInfoData.executedCommandsNumber.toString()) } + row(TerminalBundle.message("feedback.system.info.moment")) { + label(mySystemInfoData.feedbackMoment.toString()) + } } } @@ -65,6 +73,7 @@ internal class BlockTerminalFeedbackDialog(project: Project, forTest: Boolean) : internal data class BlockTerminalUsageData( @NlsSafe val mostUsedShell: String, val executedCommandsNumber: Int, + val feedbackMoment: BlockTerminalFeedbackMoment, val systemInfo: CommonFeedbackSystemData ) : SystemDataJsonSerializable { override fun serializeToJson(json: Json): JsonElement { @@ -76,6 +85,12 @@ internal data class BlockTerminalUsageData( appendLine(mostUsedShell) appendLine(TerminalBundle.message("feedback.system.info.commands.number")) appendLine(executedCommandsNumber) + appendLine(TerminalBundle.message("feedback.system.info.moment")) + appendLine(feedbackMoment.toString()) append(systemInfo.toString()) } +} + +internal enum class BlockTerminalFeedbackMoment { + ON_DISABLING, AFTER_USAGE } \ No newline at end of file diff --git a/plugins/terminal/src/org/jetbrains/plugins/terminal/exp/feedback/BlockTerminalFeedbackSurvey.kt b/plugins/terminal/src/org/jetbrains/plugins/terminal/exp/feedback/BlockTerminalFeedbackSurvey.kt index 9c4a95e1a600..c3d68983bf27 100644 --- a/plugins/terminal/src/org/jetbrains/plugins/terminal/exp/feedback/BlockTerminalFeedbackSurvey.kt +++ b/plugins/terminal/src/org/jetbrains/plugins/terminal/exp/feedback/BlockTerminalFeedbackSurvey.kt @@ -2,18 +2,31 @@ package org.jetbrains.plugins.terminal.exp.feedback import com.intellij.openapi.project.Project +import com.intellij.openapi.util.Key import com.intellij.platform.feedback.FeedbackSurvey import com.intellij.platform.feedback.FeedbackSurveyType import com.intellij.platform.feedback.InIdeFeedbackSurveyConfig import com.intellij.platform.feedback.InIdeFeedbackSurveyType import com.intellij.platform.feedback.dialog.BlockBasedFeedbackDialog import com.intellij.platform.feedback.dialog.SystemDataJsonSerializable +import com.intellij.platform.feedback.impl.OnDemandFeedbackResolver import com.intellij.platform.feedback.impl.notification.RequestFeedbackNotification import com.intellij.util.PlatformUtils import kotlinx.datetime.LocalDate import org.jetbrains.plugins.terminal.TerminalBundle import org.jetbrains.plugins.terminal.exp.TerminalUsageLocalStorage +/** Used to indicate that we are trying to show the feedback notification after block terminal is disabled */ +internal val BLOCK_TERMINAL_DISABLING: Key = Key.create("BlockTerminalDisabling") + +internal fun showBlockTerminalFeedbackNotification(project: Project) { + project.putUserData(BLOCK_TERMINAL_DISABLING, true) + val shown = OnDemandFeedbackResolver.getInstance().showFeedbackNotification(BlockTerminalFeedbackSurvey::class, project) + if (!shown) { + project.putUserData(BLOCK_TERMINAL_DISABLING, null) + } +} + internal class BlockTerminalFeedbackSurvey : FeedbackSurvey() { override val feedbackSurveyType: FeedbackSurveyType<*> = InIdeFeedbackSurveyType(BlockTerminalSurveyConfig()) } @@ -38,7 +51,9 @@ internal class BlockTerminalSurveyConfig : InIdeFeedbackSurveyConfig { override fun checkExtraConditionSatisfied(project: Project): Boolean { val usageStorage = TerminalUsageLocalStorage.getInstance() - return !usageStorage.state.feedbackNotificationShown && usageStorage.executedCommandsNumber >= 15 + return !usageStorage.state.feedbackNotificationShown && + // show notification if user executed enough commands or if block terminal is being disabled + (usageStorage.executedCommandsNumber >= 15 || usageStorage.executedCommandsNumber > 0 && project.getUserData(BLOCK_TERMINAL_DISABLING) == true) } override fun createNotification(project: Project, forTest: Boolean): RequestFeedbackNotification {