summaryrefslogtreecommitdiff
path: root/designer
diff options
context:
space:
mode:
authorJerome Gaillard <jgaillard@google.com>2022-07-20 17:02:44 +0100
committerJerome Gaillard <jgaillard@google.com>2022-07-21 18:54:09 +0000
commit1e92ea50aab5a601b5d433b01db8071f7fa999bd (patch)
treec1d74144fdd20fbfc503f012ab5b358b28b4925e /designer
parent5391921ca9ffa1ec49568f8b7818c6599c351766 (diff)
downloadidea-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')
-rw-r--r--designer/src/com/android/tools/idea/common/error/DesignerCommonIssueNode.kt4
-rw-r--r--designer/src/com/android/tools/idea/uibuilder/visual/visuallint/VisualLintAnalyzer.kt9
-rw-r--r--designer/src/com/android/tools/idea/uibuilder/visual/visuallint/VisualLintService.kt13
-rw-r--r--designer/testSrc/com/android/tools/idea/common/error/IssueNodeTest.kt4
-rw-r--r--designer/testSrc/com/android/tools/idea/uibuilder/visual/visuallint/VisualLintAnalysisTest.kt19
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 &lt;TextView> is partially covered by imageView &lt;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)
}
}
}