Skip to content
This repository was archived by the owner on Oct 18, 2024. It is now read-only.

Commit 96340f8

Browse files
committed
fix(xml-inflater): limit GridLayout to 'rowCount * columnCount' children (fixes #982)
1 parent ad96309 commit 96340f8

File tree

2 files changed

+29
-7
lines changed

2 files changed

+29
-7
lines changed
Binary file not shown.

xml-inflater/src/main/java/com/itsaky/androidide/inflater/internal/adapters/GridLayoutAdapter.kt

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ import com.itsaky.androidide.annotations.inflater.ViewAdapter
2222
import com.itsaky.androidide.annotations.uidesigner.IncludeInDesigner
2323
import com.itsaky.androidide.annotations.uidesigner.IncludeInDesigner.Group.LAYOUTS
2424
import com.itsaky.androidide.inflater.AttributeHandlerScope
25+
import com.itsaky.androidide.inflater.IView
26+
import com.itsaky.androidide.inflater.IViewGroup
2527
import com.itsaky.androidide.inflater.models.UiWidget
2628
import com.itsaky.androidide.resources.R.drawable
2729
import com.itsaky.androidide.resources.R.string
@@ -34,21 +36,41 @@ import com.itsaky.androidide.resources.R.string
3436
@ViewAdapter(GridLayout::class)
3537
@IncludeInDesigner(group = LAYOUTS)
3638
open class GridLayoutAdapter<T : GridLayout> : ViewGroupAdapter<T>() {
37-
override fun createAttrHandlers(create: (String, AttributeHandlerScope<T>.() -> Unit) -> Unit) {
39+
40+
override fun createAttrHandlers(
41+
create: (String, AttributeHandlerScope<T>.() -> Unit) -> Unit
42+
) {
3843
super.createAttrHandlers(create)
3944
create("alignmentMode") { view.alignmentMode = parseAlignmentMode(value) }
40-
create("columnCount") { view.columnCount = parseInteger(value, Int.MIN_VALUE) }
41-
create("columnOrderPreserved") { view.isColumnOrderPreserved = parseBoolean(value) }
45+
create("columnCount") {
46+
view.columnCount = parseInteger(value, Int.MIN_VALUE)
47+
}
48+
create("columnOrderPreserved") {
49+
view.isColumnOrderPreserved = parseBoolean(value)
50+
}
4251
create("orientation") { view.orientation = parseOrientation(value) }
4352
create("rowCount") { view.rowCount = parseInteger(value, Int.MIN_VALUE) }
44-
create("rowOrderPreserved") { view.isRowOrderPreserved = parseBoolean(value) }
53+
create("rowOrderPreserved") {
54+
view.isRowOrderPreserved = parseBoolean(value)
55+
}
4556
create("useDefaultMargins") { view.useDefaultMargins = parseBoolean(value) }
4657
}
4758

4859
override fun createUiWidgets(): List<UiWidget> {
49-
return listOf(
50-
UiWidget(GridLayout::class.java, string.widget_grid_layout, drawable.ic_widget_grid_layout)
51-
)
60+
return listOf(UiWidget(GridLayout::class.java, string.widget_grid_layout,
61+
drawable.ic_widget_grid_layout))
62+
}
63+
64+
override fun canAcceptChild(view: IViewGroup, child: IView?, name: String
65+
): Boolean {
66+
(view.view as GridLayout).run {
67+
if (childCount >= rowCount * columnCount) {
68+
// the maximum number of child views has been reached
69+
// no more views can be added
70+
return false
71+
}
72+
}
73+
return super.canAcceptChild(view, child, name)
5274
}
5375

5476
protected open fun parseOrientation(value: String): Int {

0 commit comments

Comments
 (0)