diff --git a/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/XmlCompletionProvider.kt b/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/XmlCompletionProvider.kt
index ebf3b0572..e47658d9a 100644
--- a/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/XmlCompletionProvider.kt
+++ b/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/XmlCompletionProvider.kt
@@ -28,10 +28,12 @@ import com.itsaky.androidide.lsp.models.CompletionResult
import com.itsaky.androidide.lsp.models.CompletionResult.Companion.EMPTY
import com.itsaky.androidide.lsp.xml.providers.completion.IXmlCompletionProvider
import com.itsaky.androidide.lsp.xml.providers.completion.layout.LayoutAttributeCompletionProvider
+import com.itsaky.androidide.lsp.xml.providers.completion.layout.LayoutAttributeValueCompletionProvider
import com.itsaky.androidide.lsp.xml.providers.completion.layout.LayoutTagCompletionProvider
import com.itsaky.androidide.lsp.xml.utils.XmlUtils
import com.itsaky.androidide.lsp.xml.utils.XmlUtils.NodeType
import com.itsaky.androidide.lsp.xml.utils.XmlUtils.NodeType.ATTRIBUTE
+import com.itsaky.androidide.lsp.xml.utils.XmlUtils.NodeType.ATTRIBUTE_VALUE
import com.itsaky.androidide.lsp.xml.utils.XmlUtils.NodeType.TAG
import com.itsaky.androidide.lsp.xml.utils.XmlUtils.NodeType.UNKNOWN
import com.itsaky.androidide.utils.CharSequenceReader
@@ -122,6 +124,7 @@ class XmlCompletionProvider(settings: IServerSettings) :
return when (type) {
TAG -> LayoutTagCompletionProvider()
ATTRIBUTE -> LayoutAttributeCompletionProvider()
+ ATTRIBUTE_VALUE -> LayoutAttributeValueCompletionProvider()
else -> null
}
}
diff --git a/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/completion/layout/LayoutAttributeValueCompletionProvider.kt b/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/completion/layout/LayoutAttributeValueCompletionProvider.kt
new file mode 100644
index 000000000..502137c55
--- /dev/null
+++ b/lsp/xml/src/main/java/com/itsaky/androidide/lsp/xml/providers/completion/layout/LayoutAttributeValueCompletionProvider.kt
@@ -0,0 +1,92 @@
+/*
+ * This file is part of AndroidIDE.
+ *
+ * AndroidIDE is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * AndroidIDE is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with AndroidIDE. If not, see .
+ */
+
+package com.itsaky.androidide.lsp.xml.providers.completion.layout
+
+import com.android.aaptcompiler.AaptResourceType.ATTR
+import com.android.aaptcompiler.AttributeResource
+import com.android.aaptcompiler.ConfigDescription
+import com.android.aaptcompiler.ResourcePathData
+import com.itsaky.androidide.lookup.Lookup
+import com.itsaky.androidide.lsp.models.CompletionItem
+import com.itsaky.androidide.lsp.models.CompletionItem.Companion.matchLevel
+import com.itsaky.androidide.lsp.models.CompletionParams
+import com.itsaky.androidide.lsp.models.CompletionResult
+import com.itsaky.androidide.lsp.models.CompletionResult.Companion.EMPTY
+import com.itsaky.androidide.lsp.models.MatchLevel.NO_MATCH
+import com.itsaky.androidide.lsp.xml.utils.XmlUtils.NodeType
+import com.itsaky.androidide.utils.ILogger
+import com.itsaky.androidide.xml.resources.ResourceTableRegistry
+import org.eclipse.lemminx.dom.DOMDocument
+
+/**
+ * Provides completions for attribute value in layout XML files.
+ *
+ * @author Akash Yadav
+ */
+class LayoutAttributeValueCompletionProvider : LayoutCompletionProvider() {
+
+ private val log = ILogger.newInstance("AttributeValueCompletions")
+
+ override fun doComplete(
+ params: CompletionParams,
+ pathData: ResourcePathData,
+ document: DOMDocument,
+ type: NodeType,
+ prefix: String
+ ): CompletionResult {
+ val attr = document.findAttrAt(params.position.requireIndex())
+ val attrName =
+ attr?.localName
+ ?: run {
+ log.warn("Cannot find attribute at index ${params.position.index}")
+ return EMPTY
+ }
+
+ val attrs =
+ Lookup.DEFAULT.lookup(ResourceTableRegistry.COMPLETION_FRAMEWORK_RES_LOOKUP_KEY)
+ ?.findPackage("android")
+ ?.findGroup(ATTR)
+ ?: run {
+ log.warn("Cannot get attributes list from resource table")
+ return EMPTY
+ }
+
+ val entry =
+ attrs.findEntry(attrName)?.findValue(ConfigDescription())?.value
+ ?: run {
+ log.warn("Cannot find entry for attribute: $attrName")
+ return EMPTY
+ }
+
+ if (entry !is AttributeResource) {
+ return EMPTY
+ }
+
+ val list = mutableListOf()
+ for (symbol in entry.symbols) {
+ val matchLevel = matchLevel(symbol.symbol.name.entry!!, prefix)
+ if (matchLevel == NO_MATCH && prefix.isNotEmpty()) {
+ continue
+ }
+
+ list.add(createAttrValueCompletionItem(attrName, symbol.symbol.name.entry!!, matchLevel))
+ }
+
+ return CompletionResult(list)
+ }
+}
diff --git a/tests/test-home/.androidide/init/model.jar b/tests/test-home/.androidide/init/model.jar
index 9309d8f20..743072bfe 100644
Binary files a/tests/test-home/.androidide/init/model.jar and b/tests/test-home/.androidide/init/model.jar differ