[terminal] IDEA-348915 Show feedback notification after disabling the New Terminal

Not depending on the number of executed commands.

GitOrigin-RevId: dc3960460e2a579ae375be6dc2e18a8d9e9c0d6d
This commit is contained in:
Konstantin Hudyakov
2024-03-22 11:47:22 +00:00
committed by intellij-monorepo-bot
parent c48a18367f
commit cc7d1687da
5 changed files with 45 additions and 2 deletions
@@ -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:
feedback.system.info.commands.number=Executed commands number:
feedback.system.info.moment=Feedback moment:
@@ -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());
@@ -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()
}
@@ -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<BlockTerminalUsageData>(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
}
@@ -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<Boolean> = 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 {