fix(xml-inflater,uidesigner): exclude unsupported view adapters from adapters index

This commit is contained in:
Akash Yadav
2023-02-11 21:54:27 +05:30
parent 40d128d76e
commit 25a76e9a1c
7 changed files with 26 additions and 8 deletions
+1
View File
@@ -27,6 +27,7 @@ dependencies {
implementation(projects.annotations)
implementation(libs.androidx.annotation)
implementation(libs.common.javapoet)
implementation(libs.common.ksp)
}
@@ -17,6 +17,7 @@
package com.itsaky.androidide.annotations.ksp.inflater
import androidx.annotation.RequiresApi
import com.google.devtools.ksp.KspExperimental
import com.google.devtools.ksp.getAnnotationsByType
import com.google.devtools.ksp.isAnnotationPresent
@@ -187,6 +188,11 @@ class ViewAdapterIndexGenerator(private val logger: KSPLogger) {
result
}
} else null
val requiresApi =
if (sym.isAnnotationPresent(RequiresApi::class))
sym.getAnnotationsByType(RequiresApi::class).iterator().next()
else null
val viewName = getViewName(viewAdapter)
val moduleNs = getModuleNs(viewAdapter)
@@ -195,6 +201,12 @@ class ViewAdapterIndexGenerator(private val logger: KSPLogger) {
val viewTypeName =
ClassName.get(viewName.substringBeforeLast('.'), viewName.substringAfterLast('.'))
requiresApi?.let { annotation ->
val api = if (annotation.value == 1) annotation.api else annotation.value
val androidBuild = ClassName.get("android.os", "Build")
block.beginControlFlow("if(\$T.VERSION.SDK_INT >= \$L)", androidBuild, api)
}
block.addStatement(
"final var adapter = new \$T()",
ParameterizedTypeName.get(adapterTypeName, viewTypeName)
@@ -213,6 +225,8 @@ class ViewAdapterIndexGenerator(private val logger: KSPLogger) {
)
}
requiresApi?.let { block.endControlFlow() }
indexAddStatements.add("{\n")
indexAddStatements.indent()
indexAddStatements.add(block.build())
@@ -238,7 +252,7 @@ class ViewAdapterIndexGenerator(private val logger: KSPLogger) {
)
indexClassBuilder.addStaticBlock(indexAddStatements.build())
OutputStreamWriter(out).use {
val file = JavaFile.builder(INDEX_PACKAGE_NAME, indexClassBuilder.build())
file.build().writeTo(it)
@@ -256,11 +270,11 @@ class ViewAdapterIndexGenerator(private val logger: KSPLogger) {
}
private fun getViewType(viewAdapter: KSAnnotation) =
(getViewAdapterArg(viewAdapter, "forView") as KSType)
(getAnnotationArg(viewAdapter, "forView") as KSType)
private fun getModuleNs(viewAdapter: KSAnnotation) =
(getViewAdapterArg(viewAdapter, "moduleNamespace") as String)
(getAnnotationArg(viewAdapter, "moduleNamespace") as String)
private fun getViewAdapterArg(viewAdapter: KSAnnotation, arg: String) =
private fun getAnnotationArg(viewAdapter: KSAnnotation, arg: String) =
viewAdapter.arguments.first { it.name!!.asString() == arg }.value
}
@@ -20,7 +20,10 @@
package com.itsaky.androidide.inflater.internal.adapters
import android.graphics.BlendMode
import android.os.Build
import android.os.Build.VERSION_CODES
import android.widget.AnalogClock
import androidx.annotation.RequiresApi
import com.itsaky.androidide.annotations.uidesigner.IncludeInDesigner
import com.itsaky.androidide.annotations.uidesigner.IncludeInDesigner.Group.WIDGETS
import com.itsaky.androidide.inflater.AttributeHandlerScope
@@ -35,6 +38,7 @@ import com.itsaky.androidide.resources.R.string
*/
@com.itsaky.androidide.annotations.inflater.ViewAdapter(AnalogClock::class)
@IncludeInDesigner(group = WIDGETS)
@RequiresApi(VERSION_CODES.S)
open class AnalogClockAdapter<T : AnalogClock> : ViewAdapter<T>() {
override fun createAttrHandlers(create: (String, AttributeHandlerScope<T>.() -> Unit) -> Unit) {
@@ -36,7 +36,7 @@ import com.itsaky.androidide.resources.R.string
open class ChronometerAdapter<T : Chronometer> : TextViewAdapter<T>() {
override fun createAttrHandlers(create: (String, AttributeHandlerScope<T>.() -> Unit) -> Unit) {
super.createAttrHandlers(create)
create("countDown") { view.setCountDown(parseBoolean(value)) }
create("countDown") { view.isCountDown = parseBoolean(value) }
create("format") { view.format = parseString(value) }
}
@@ -31,7 +31,7 @@ import com.itsaky.androidide.resources.R.string
*/
@com.itsaky.androidide.annotations.inflater.ViewAdapter(Space::class)
@IncludeInDesigner(group = WIDGETS)
open class SpaceAdapter : ViewAdapter<Space>() {
open class SpaceAdapter<@Suppress("FINAL_UPPER_BOUND") T : Space> : ViewAdapter<T>() {
override fun createUiWidgets(): List<UiWidget> {
return listOf(UiWidget(Space::class.java, string.widget_space, drawable.ic_widget_space))
}
@@ -29,7 +29,6 @@ import com.itsaky.androidide.annotations.uidesigner.IncludeInDesigner.Group.WIDG
import com.itsaky.androidide.inflater.AttributeHandlerScope
import com.itsaky.androidide.inflater.IView
import com.itsaky.androidide.inflater.models.UiWidget
import com.itsaky.androidide.inflater.utils.newAttribute
import com.itsaky.androidide.resources.R
import java.util.regex.Pattern
@@ -36,7 +36,7 @@ import com.itsaky.androidide.resources.R.string
open class ViewFlipperAdapter<T : ViewFlipper> : ViewAnimatorAdapter<T>() {
override fun createAttrHandlers(create: (String, AttributeHandlerScope<T>.() -> Unit) -> Unit) {
super.createAttrHandlers(create)
create("autoStart") { view.setAutoStart(parseBoolean(value)) }
create("autoStart") { view.isAutoStart = parseBoolean(value) }
create("flipInterval") { view.flipInterval = parseInteger(value) }
}