Skip to content

Commit 325bc1b

Browse files
committed
Refactor Search and Favorites widget layout calculations to stabilize column and row counts against small size variations.
1 parent 9c1c6d0 commit 325bc1b

17 files changed

+14
-700
lines changed

app/src/main/java/com/duckduckgo/widget/SearchAndFavoritesGridCalculator.kt

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,17 +31,20 @@ class SearchAndFavoritesGridCalculator {
3131
val margins = context.resources.getDimension(CommonR.dimen.searchWidgetFavoriteMargin).toDp()
3232
val item = context.resources.getDimension(CommonR.dimen.searchWidgetFavoriteItemContainerWidth).toDp()
3333
val divider = context.resources.getDimension(CommonR.dimen.searchWidgetFavoritesHorizontalSpacing).toDp()
34+
35+
// Buffer to prevent column count from changing with small size variations.
36+
val sizeBuffer = 8
3437
var n = 2
3538
var totalSize = (n * item) + ((n - 1) * divider) + (margins * 2)
3639

3740
logcat(INFO) { "SearchAndFavoritesWidget width n:$n $totalSize vs $width" }
38-
while (totalSize <= width) {
41+
while (totalSize + sizeBuffer <= width) {
3942
++n
4043
totalSize = (n * item) + ((n - 1) * divider) + (margins * 2)
4144
logcat(INFO) { "SearchAndFavoritesWidget width n:$n $totalSize vs $width" }
4245
}
4346

44-
return WIDGET_COLUMNS_MIN.coerceAtLeast(n - 1).coerceAtMost(limitColumns)
47+
return (n - 1).coerceIn(WIDGET_COLUMNS_MIN, limitColumns)
4548
}
4649

4750
fun calculateRows(
@@ -53,20 +56,20 @@ class SearchAndFavoritesGridCalculator {
5356
(context.resources.getDimension(CommonR.dimen.searchWidgetPadding).toDp() * 2)
5457
val item = context.resources.getDimension(CommonR.dimen.searchWidgetFavoriteItemContainerHeight).toDp()
5558
val divider = context.resources.getDimension(CommonR.dimen.searchWidgetFavoritesVerticalSpacing).toDp()
59+
60+
// Buffer to prevent row count from changing with small size variations.
61+
val sizeBuffer = 8
5662
var n = 1
5763
var totalSize = searchBar + (n * item) + ((n - 1) * divider) + margins
5864

5965
logcat(INFO) { "SearchAndFavoritesWidget height n:$n $totalSize vs $height" }
60-
while (totalSize <= height) {
66+
while (totalSize + sizeBuffer <= height) {
6167
++n
6268
totalSize = searchBar + (n * item) + ((n - 1) * divider) + margins
6369
logcat(INFO) { "SearchAndFavoritesWidget height n:$n $totalSize vs $height" }
6470
}
6571

66-
var rows = n - 1
67-
rows = WIDGET_ROWS_MIN.coerceAtLeast(rows)
68-
rows = WIDGET_ROWS_MAX.coerceAtMost(rows)
69-
return rows
72+
return (n - 1).coerceIn(WIDGET_ROWS_MIN, WIDGET_ROWS_MAX)
7073
}
7174

7275
companion object {

app/src/main/java/com/duckduckgo/widget/SearchAndFavoritesWidget.kt

Lines changed: 4 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ class SearchAndFavoritesWidget : AppWidgetProvider() {
153153
logcat(INFO) { "SearchAndFavoritesWidget theme for $appWidgetId is $widgetTheme" }
154154

155155
val (columns, rows) = getCurrentWidgetSize(context, appWidgetManager.getAppWidgetOptions(appWidgetId), newOptions)
156-
layoutId = getLayoutThemed(columns, widgetTheme)
156+
layoutId = getLayoutThemed(widgetTheme)
157157

158158
withContext(dispatchers.io()) {
159159
widgetPrefs.storeWidgetSize(appWidgetId, columns, rows)
@@ -177,41 +177,12 @@ class SearchAndFavoritesWidget : AppWidgetProvider() {
177177
}
178178

179179
private fun getLayoutThemed(
180-
numColumns: Int,
181180
theme: WidgetTheme,
182181
): Int {
183-
// numcolumns method is not available for remoteViews. We rely on different xml to use different values on that attribute
184182
return when (theme) {
185-
WidgetTheme.LIGHT -> {
186-
when (numColumns) {
187-
2 -> R.layout.search_favorites_widget_light_col2
188-
3 -> R.layout.search_favorites_widget_light_col3
189-
4 -> R.layout.search_favorites_widget_light_col4
190-
5 -> R.layout.search_favorites_widget_light_col5
191-
6 -> R.layout.search_favorites_widget_light_col6
192-
else -> R.layout.search_favorites_widget_light_auto
193-
}
194-
}
195-
WidgetTheme.DARK -> {
196-
when (numColumns) {
197-
2 -> R.layout.search_favorites_widget_dark_col2
198-
3 -> R.layout.search_favorites_widget_dark_col3
199-
4 -> R.layout.search_favorites_widget_dark_col4
200-
5 -> R.layout.search_favorites_widget_dark_col5
201-
6 -> R.layout.search_favorites_widget_dark_col6
202-
else -> R.layout.search_favorites_widget_dark_auto
203-
}
204-
}
205-
WidgetTheme.SYSTEM_DEFAULT -> {
206-
when (numColumns) {
207-
2 -> R.layout.search_favorites_widget_daynight_col2
208-
3 -> R.layout.search_favorites_widget_daynight_col3
209-
4 -> R.layout.search_favorites_widget_daynight_col4
210-
5 -> R.layout.search_favorites_widget_daynight_col5
211-
6 -> R.layout.search_favorites_widget_daynight_col6
212-
else -> R.layout.search_favorites_widget_daynight_auto
213-
}
214-
}
183+
WidgetTheme.LIGHT -> R.layout.search_favorites_widget_light_auto
184+
WidgetTheme.DARK -> R.layout.search_favorites_widget_dark_auto
185+
WidgetTheme.SYSTEM_DEFAULT -> R.layout.search_favorites_widget_daynight_auto
215186
}
216187
}
217188

app/src/main/res/layout/search_favorites_widget_dark_col2.xml

Lines changed: 0 additions & 44 deletions
This file was deleted.

app/src/main/res/layout/search_favorites_widget_dark_col3.xml

Lines changed: 0 additions & 44 deletions
This file was deleted.

app/src/main/res/layout/search_favorites_widget_dark_col4.xml

Lines changed: 0 additions & 44 deletions
This file was deleted.

app/src/main/res/layout/search_favorites_widget_dark_col5.xml

Lines changed: 0 additions & 44 deletions
This file was deleted.

app/src/main/res/layout/search_favorites_widget_dark_col6.xml

Lines changed: 0 additions & 44 deletions
This file was deleted.

app/src/main/res/layout/search_favorites_widget_daynight_col2.xml

Lines changed: 0 additions & 44 deletions
This file was deleted.

0 commit comments

Comments
 (0)