From 8f71b80d206d072a105f1e22396d06bdbcc4f6c3 Mon Sep 17 00:00:00 2001 From: Uladzislau Petrushkevich Date: Mon, 15 Sep 2025 22:50:27 +0200 Subject: [PATCH 1/3] Improvement - No need for additional button creation if data is unchanged --- .../uhabits/activities/habits/list/views/ButtonPanelView.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/ButtonPanelView.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/ButtonPanelView.kt index 312617550..7214a3d12 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/ButtonPanelView.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/ButtonPanelView.kt @@ -36,12 +36,14 @@ abstract class ButtonPanelView( var buttonCount = 0 set(value) { + if (field == value) return field = value inflateButtons() } var dataOffset = 0 set(value) { + if (field == value) return field = value setupButtons() } From bef966bdfed4b0912d25646b20b9f5498444ee8d Mon Sep 17 00:00:00 2001 From: Uladzislau Petrushkevich Date: Mon, 15 Sep 2025 22:55:05 +0200 Subject: [PATCH 2/3] Improvement - do not allocate Paint() in onDraw for Checkmark/Number Button View --- .../habits/list/views/CheckmarkButtonView.kt | 9 ++++++++- .../habits/list/views/NumberButtonView.kt | 10 +++++++++- .../org/isoron/uhabits/utils/ViewExtensions.kt | 17 +++++++++++------ 3 files changed, 28 insertions(+), 8 deletions(-) diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkButtonView.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkButtonView.kt index cdd929b29..4d4c53154 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkButtonView.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkButtonView.kt @@ -135,6 +135,7 @@ class CheckmarkButtonView( private val bgColor = sres.getColor(R.attr.cardBgColor) private val lowContrastColor = sres.getColor(R.attr.contrast40) private val mediumContrastColor = sres.getColor(R.attr.contrast60) + private val pNotesIndicator = Paint() private val paint = TextPaint().apply { typeface = getFontAwesome() @@ -192,7 +193,13 @@ class CheckmarkButtonView( canvas.drawText(label, rect.centerX(), rect.centerY(), paint) } - drawNotesIndicator(canvas, color, em, notes) + drawNotesIndicator( + pNotesIndicator = pNotesIndicator, + canvas = canvas, + color = color, + size = em, + notes = notes, + ) } } } diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberButtonView.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberButtonView.kt index 24b36c186..959e9e1c2 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberButtonView.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberButtonView.kt @@ -145,6 +145,8 @@ class NumberButtonView( private val lowContrast: Int private val mediumContrast: Int + private val pNotesIndicator = Paint() + private val paint = TextPaint().apply { typeface = getFontAwesome() isAntiAlias = true @@ -234,7 +236,13 @@ class NumberButtonView( canvas.drawText(trimmedUnits, rect.centerX(), rect.centerY(), pUnit) } - drawNotesIndicator(canvas, color, em, notes) + drawNotesIndicator( + pNotesIndicator = pNotesIndicator, + canvas = canvas, + color = color, + size = em, + notes = notes, + ) } } } diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/utils/ViewExtensions.kt b/uhabits-android/src/main/java/org/isoron/uhabits/utils/ViewExtensions.kt index d5be78834..3d39093ff 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/utils/ViewExtensions.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/utils/ViewExtensions.kt @@ -210,13 +210,18 @@ fun View.sp(value: Float) = InterfaceUtils.spToPixels(context, value) fun View.dp(value: Float) = InterfaceUtils.dpToPixels(context, value) fun View.str(id: Int) = resources.getString(id) -fun View.drawNotesIndicator(canvas: Canvas, color: Int, size: Float, notes: String) { - val pNotesIndicator = Paint() +fun View.drawNotesIndicator( + pNotesIndicator: Paint, + canvas: Canvas, + color: Int, + size: Float, + notes: String, +) { + if (notes.isBlank()) return + pNotesIndicator.color = color - if (notes.isNotBlank()) { - val cy = 0.8f * size - canvas.drawCircle(width.toFloat() - cy, cy, 8f, pNotesIndicator) - } + val cy = 0.8f * size + canvas.drawCircle(width.toFloat() - cy, cy, 8f, pNotesIndicator) } val View.sres: StyledResources From 70342c8c6ca8373121ead4b810c45409248e42c8 Mon Sep 17 00:00:00 2001 From: Uladzislau Petrushkevich Date: Mon, 15 Sep 2025 23:10:07 +0200 Subject: [PATCH 3/3] Improvement - do not call notifyDataSetChanged when selection state is unchanged --- .../activities/habits/list/views/HabitCardListAdapter.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardListAdapter.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardListAdapter.kt index ac440b283..9f91834f9 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardListAdapter.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardListAdapter.kt @@ -70,6 +70,8 @@ class HabitCardListAdapter @Inject constructor( * Sets all items as not selected. */ override fun clearSelection() { + if (selected.isEmpty()) return + selected.clear() notifyDataSetChanged() observable.notifyListeners()