diff options
author | Jerome Gaillard <jgaillard@google.com> | 2022-07-20 17:02:44 +0100 |
---|---|---|
committer | Jerome Gaillard <jgaillard@google.com> | 2022-07-21 18:54:09 +0000 |
commit | 1e92ea50aab5a601b5d433b01db8071f7fa999bd (patch) | |
tree | c1d74144fdd20fbfc503f012ab5b358b28b4925e /designer | |
parent | 5391921ca9ffa1ec49568f8b7818c6599c351766 (diff) | |
download | idea-1e92ea50aab5a601b5d433b01db8071f7fa999bd.tar.gz |
Use severity from inspection for Visual Lint rules
Through the Inspections settings panel, users can change the severity of
a Visual Lint rule. This makes sure that the issue panel uses the
severity chosen by the user for each rule.
Bug: 239493475
Test: Tests updated
Change-Id: I03cc208fcaca2def0b0f669d87d346d52d87487f
Diffstat (limited to 'designer')
5 files changed, 35 insertions, 14 deletions
diff --git a/designer/src/com/android/tools/idea/common/error/DesignerCommonIssueNode.kt b/designer/src/com/android/tools/idea/common/error/DesignerCommonIssueNode.kt index 9006fbecc70..cf02050ed88 100644 --- a/designer/src/com/android/tools/idea/common/error/DesignerCommonIssueNode.kt +++ b/designer/src/com/android/tools/idea/common/error/DesignerCommonIssueNode.kt @@ -22,6 +22,7 @@ import com.android.tools.idea.uibuilder.visual.VisualizationToolWindowFactory import com.android.tools.idea.uibuilder.visual.visuallint.VisualLintRenderIssue import com.android.tools.idea.uibuilder.visual.visuallint.isVisualLintErrorSuppressed import com.google.common.collect.Ordering +import com.intellij.codeHighlighting.HighlightDisplayLevel import com.intellij.icons.AllIcons import com.intellij.ide.projectView.PresentationData import com.intellij.ide.projectView.impl.CompoundIconProvider @@ -255,8 +256,7 @@ open class IssueNode(val file: VirtualFile?, val issue: Issue, parent: DesignerC override fun updatePresentation(presentation: PresentationData) { val nodeDisplayText: String = createNodeDisplayText() - val severity = issue.severity - val icon = if (severity.myVal >= HighlightSeverity.ERROR.myVal) StudioIcons.Common.ERROR else StudioIcons.Common.WARNING + val icon = HighlightDisplayLevel.find(issue.severity).icon presentation.setIcon(icon) presentation.addText(nodeDisplayText, SimpleTextAttributes.REGULAR_ATTRIBUTES) diff --git a/designer/src/com/android/tools/idea/uibuilder/visual/visuallint/VisualLintAnalyzer.kt b/designer/src/com/android/tools/idea/uibuilder/visual/visuallint/VisualLintAnalyzer.kt index 8707fa9179c..b37104ca281 100644 --- a/designer/src/com/android/tools/idea/uibuilder/visual/visuallint/VisualLintAnalyzer.kt +++ b/designer/src/com/android/tools/idea/uibuilder/visual/visuallint/VisualLintAnalyzer.kt @@ -39,12 +39,13 @@ abstract class VisualLintAnalyzer { /** * Analyze the given [RenderResult] for visual lint issues and return found [VisualLintRenderIssue]s */ - fun analyze(renderResult: RenderResult, model: NlModel, runningInBackground: Boolean): List<VisualLintRenderIssue> { + fun analyze(renderResult: RenderResult, model: NlModel, severity: HighlightSeverity, + runningInBackground: Boolean): List<VisualLintRenderIssue> { if (runningInBackground && !backgroundEnabled) { return emptyList() } val issueContents = findIssues(renderResult, model) - return issueContents.map { createIssue(it, model) }.toList() + return issueContents.map { createIssue(it, model, severity) }.toList() } abstract fun findIssues(renderResult: RenderResult, model: NlModel): List<VisualLintIssueContent> @@ -60,12 +61,12 @@ abstract class VisualLintAnalyzer { } /** Create [VisualLintRenderIssue] for the given [VisualLintIssueContent]. */ - private fun createIssue(content: VisualLintIssueContent, model: NlModel): VisualLintRenderIssue { + private fun createIssue(content: VisualLintIssueContent, model: NlModel, severity: HighlightSeverity): VisualLintRenderIssue { val component = componentFromViewInfo(content.view, model) VisualLintUsageTracker.getInstance().trackIssueCreation(type, model.facet) return VisualLintRenderIssue.builder() .summary(content.message) - .severity(HighlightSeverity.WARNING) + .severity(severity) .model(model) .components(if (component == null) mutableListOf() else mutableListOf(component)) .contentDescriptionProvider(content.descriptionProvider) diff --git a/designer/src/com/android/tools/idea/uibuilder/visual/visuallint/VisualLintService.kt b/designer/src/com/android/tools/idea/uibuilder/visual/visuallint/VisualLintService.kt index 4b373b01513..372d922d59f 100644 --- a/designer/src/com/android/tools/idea/uibuilder/visual/visuallint/VisualLintService.kt +++ b/designer/src/com/android/tools/idea/uibuilder/visual/visuallint/VisualLintService.kt @@ -42,6 +42,7 @@ import com.android.tools.idea.uibuilder.visual.visuallint.analyzers.WearMarginAn import com.google.common.annotations.VisibleForTesting import com.intellij.codeInsight.daemon.HighlightDisplayKey import com.intellij.codeInspection.InspectionProfile +import com.intellij.lang.annotation.HighlightSeverity import com.intellij.openapi.components.Service import com.intellij.openapi.project.Project import com.intellij.openapi.util.Disposer @@ -65,7 +66,7 @@ private val visualLintAnalyzerExecutorService = AppExecutorUtil.createBoundedApp * Service that runs visual lints */ @Service -class VisualLintService(project: Project) { +class VisualLintService(val project: Project) { companion object { @JvmStatic @@ -186,7 +187,7 @@ class VisualLintService(project: Project) { runAnalyzers(adaptiveAnalyzers, result, model, runningInBackground) if (VisualLintErrorType.LOCALE_TEXT !in ignoredTypes) { LocaleAnalyzer(baseConfigIssues).let { - issueProvider.addAllIssues(it.type, it.analyze(result, model, runningInBackground)) + issueProvider.addAllIssues(it.type, it.analyze(result, model, getSeverity(it.type), runningInBackground)) } } if (StudioFlags.NELE_ATF_IN_VISUAL_LINT.get() && VisualLintErrorType.ATF !in ignoredTypes) { @@ -200,10 +201,16 @@ class VisualLintService(project: Project) { model: NlModel, runningInBackground: Boolean) { analyzers.filter { !ignoredTypes.contains(it.type) }.forEach { - val issues = it.analyze(result, model, runningInBackground) + val issues = it.analyze(result, model, getSeverity(it.type), runningInBackground) issueProvider.addAllIssues(it.type, issues) } } + + private fun getSeverity(type: VisualLintErrorType): HighlightSeverity { + val key = HighlightDisplayKey.find(type.shortName) + return key?.let { InspectionProfileManager.getInstance(project).currentProfile.getErrorLevel(it, null).severity } + ?: HighlightSeverity.WARNING + } } /** diff --git a/designer/testSrc/com/android/tools/idea/common/error/IssueNodeTest.kt b/designer/testSrc/com/android/tools/idea/common/error/IssueNodeTest.kt index ad4e183633a..6373005df17 100644 --- a/designer/testSrc/com/android/tools/idea/common/error/IssueNodeTest.kt +++ b/designer/testSrc/com/android/tools/idea/common/error/IssueNodeTest.kt @@ -16,6 +16,7 @@ package com.android.tools.idea.common.error import com.android.tools.idea.testing.AndroidProjectRule +import com.intellij.codeHighlighting.HighlightDisplayLevel import com.intellij.ide.projectView.PresentationData import com.intellij.lang.annotation.HighlightSeverity import com.intellij.notebook.editor.BackedVirtualFile @@ -23,7 +24,6 @@ import com.intellij.openapi.fileEditor.OpenFileDescriptor import com.intellij.openapi.vfs.VirtualFile import com.intellij.testFramework.LightVirtualFile import com.intellij.ui.SimpleTextAttributes -import icons.StudioIcons import junit.framework.Assert import org.junit.Rule import org.junit.Test @@ -77,7 +77,7 @@ class IssueNodeTest { node.update() val expected = PresentationData() - expected.setIcon(StudioIcons.Common.WARNING) + expected.setIcon(HighlightDisplayLevel.find(HighlightSeverity.INFORMATION).icon) expected.addText("Test summary", SimpleTextAttributes.REGULAR_ATTRIBUTES) expected.tooltip = "Test summary" diff --git a/designer/testSrc/com/android/tools/idea/uibuilder/visual/visuallint/VisualLintAnalysisTest.kt b/designer/testSrc/com/android/tools/idea/uibuilder/visual/visuallint/VisualLintAnalysisTest.kt index eb06adc8c65..4c4adc40ba4 100644 --- a/designer/testSrc/com/android/tools/idea/uibuilder/visual/visuallint/VisualLintAnalysisTest.kt +++ b/designer/testSrc/com/android/tools/idea/uibuilder/visual/visuallint/VisualLintAnalysisTest.kt @@ -32,9 +32,12 @@ import com.android.tools.idea.uibuilder.visual.visuallint.analyzers.LongTextAnal import com.android.tools.idea.uibuilder.visual.visuallint.analyzers.OverlapAnalyzerInspection import com.android.tools.idea.uibuilder.visual.visuallint.analyzers.TextFieldSizeAnalyzerInspection import com.android.tools.idea.uibuilder.visual.visuallint.analyzers.WearMarginAnalyzerInspection +import com.intellij.codeHighlighting.HighlightDisplayLevel +import com.intellij.codeInsight.daemon.HighlightDisplayKey import com.intellij.lang.annotation.HighlightSeverity import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.vfs.VirtualFile +import com.intellij.profile.codeInspection.InspectionProfileManager import com.intellij.psi.xml.XmlFile import org.jetbrains.android.facet.AndroidFacet import org.junit.After @@ -44,7 +47,6 @@ import org.junit.Test import kotlin.test.assertEquals import kotlin.test.assertNotEquals import kotlin.test.assertNotNull -import kotlin.test.assertNull import kotlin.test.fail class VisualLintAnalysisTest { @@ -60,6 +62,8 @@ class VisualLintAnalysisTest { TextFieldSizeAnalyzerInspection, OverlapAnalyzerInspection, LongTextAnalyzerInspection, ButtonSizeAnalyzerInspection, WearMarginAnalyzerInspection) projectRule.fixture.enableInspections(*visualLintInspections) + InspectionProfileManager.getInstance(projectRule.project).currentProfile.setErrorLevel( + HighlightDisplayKey.find(VisualLintErrorType.BOUNDS.shortName), HighlightDisplayLevel.ERROR, projectRule.project) } @After @@ -103,7 +107,6 @@ class VisualLintAnalysisTest { issues.forEach { assertEquals("Visual Lint Issue", it.category) - assertEquals(HighlightSeverity.WARNING, it.severity) when ((it as VisualLintRenderIssue).type) { VisualLintErrorType.OVERLAP -> { assertEquals(3, it.models.size) @@ -112,6 +115,7 @@ class VisualLintAnalysisTest { "Content of text_dashboard <TextView> is partially covered by imageView <ImageView> in 3 preview configurations." + "<BR/>This may affect text readability. Fix this issue by adjusting widget positioning.", it.description) + assertEquals(HighlightSeverity.WARNING, it.severity) } VisualLintErrorType.BOTTOM_NAV -> { assertEquals(3, it.models.size) @@ -123,6 +127,7 @@ class VisualLintAnalysisTest { "<A HREF=\"https://material.io/components/navigation-drawer/android\">navigation drawer</A> for breakpoints >= 600dp.", it.description) assertNotNull(it.hyperlinkListener) + assertEquals(HighlightSeverity.WARNING, it.severity) } VisualLintErrorType.LONG_TEXT -> { assertEquals(2, it.models.size) @@ -134,6 +139,7 @@ class VisualLintAnalysisTest { "breakpoints >= 600dp.", it.description) assertNotNull(it.hyperlinkListener) + assertEquals(HighlightSeverity.WARNING, it.severity) } VisualLintErrorType.BOUNDS -> { assertEquals(2, it.models.size) @@ -142,6 +148,7 @@ class VisualLintAnalysisTest { "ImageView is partially hidden in layout because it is not contained within the bounds of its parent in 2 preview " + "configurations.<BR/>Fix this issue by adjusting the size or position of ImageView.", it.description) + assertEquals(HighlightSeverity.ERROR, it.severity) } VisualLintErrorType.BUTTON_SIZE -> { assertEquals(4, it.models.size) @@ -150,6 +157,7 @@ class VisualLintAnalysisTest { "The button Button is wider than 320dp in 4 preview configurations." + "<BR/>Material Design recommends buttons to be no wider than 320dp", it.description) + assertEquals(HighlightSeverity.WARNING, it.severity) } VisualLintErrorType.TEXT_FIELD_SIZE -> { assertEquals(3, it.models.size) @@ -158,6 +166,7 @@ class VisualLintAnalysisTest { "The text field EditText is wider than 488dp in 3 preview configurations." + "<BR/>Material Design recommends text fields to be no wider than 488dp", it.description) + assertEquals(HighlightSeverity.WARNING, it.severity) } else -> fail("Unexpected visual lint error") } @@ -198,7 +207,6 @@ class VisualLintAnalysisTest { assertEquals(5, wearIssues.size) wearIssues.forEach { assertEquals("Visual Lint Issue", it.category) - assertEquals(HighlightSeverity.WARNING, it.severity) when (it.components.first().id) { "image_view" -> { assertEquals(3, it.models.size) @@ -207,6 +215,7 @@ class VisualLintAnalysisTest { "In 3 preview configurations, the view ImageView is closer to the side of the device than the recommended amount.<BR/>" + "It is recommended that, for Wear OS layouts, margins should be at least 2.5% for square devices, and 5.2% for round devices.", it.description) + assertEquals(HighlightSeverity.WARNING, it.severity) } "textview1" -> { assertEquals(4, it.models.size) @@ -215,6 +224,7 @@ class VisualLintAnalysisTest { "In 4 preview configurations, the view TextView is closer to the side of the device than the recommended amount.<BR/>" + "It is recommended that, for Wear OS layouts, margins should be at least 2.5% for square devices, and 5.2% for round devices.", it.description) + assertEquals(HighlightSeverity.WARNING, it.severity) } "textview2" -> { assertEquals(1, it.models.size) @@ -223,6 +233,7 @@ class VisualLintAnalysisTest { "In a preview configuration, the view TextView is closer to the side of the device than the recommended amount.<BR/>" + "It is recommended that, for Wear OS layouts, margins should be at least 2.5% for square devices, and 5.2% for round devices.", it.description) + assertEquals(HighlightSeverity.WARNING, it.severity) } "textview3" -> { assertEquals(3, it.models.size) @@ -231,6 +242,7 @@ class VisualLintAnalysisTest { "In 3 preview configurations, the view TextView is closer to the side of the device than the recommended amount.<BR/>" + "It is recommended that, for Wear OS layouts, margins should be at least 2.5% for square devices, and 5.2% for round devices.", it.description) + assertEquals(HighlightSeverity.WARNING, it.severity) } "textview4" -> { assertEquals(1, it.models.size) @@ -239,6 +251,7 @@ class VisualLintAnalysisTest { "In a preview configuration, the view TextView is closer to the side of the device than the recommended amount.<BR/>" + "It is recommended that, for Wear OS layouts, margins should be at least 2.5% for square devices, and 5.2% for round devices.", it.description) + assertEquals(HighlightSeverity.WARNING, it.severity) } } } |