From 6c80a054a6e84e306c774e8b6a1081248d0ed82c Mon Sep 17 00:00:00 2001 From: Tim Johnson Date: Fri, 8 May 2026 10:03:33 -0400 Subject: [PATCH 01/22] Add Surface box to end of tools layout for personalization --- .../ui/dashboard/tools/ToolsLayout.kt | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/app/src/main/kotlin/org/cru/godtools/ui/dashboard/tools/ToolsLayout.kt b/app/src/main/kotlin/org/cru/godtools/ui/dashboard/tools/ToolsLayout.kt index 1fa39facec..ef438241d5 100644 --- a/app/src/main/kotlin/org/cru/godtools/ui/dashboard/tools/ToolsLayout.kt +++ b/app/src/main/kotlin/org/cru/godtools/ui/dashboard/tools/ToolsLayout.kt @@ -15,6 +15,7 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.material3.SegmentedButton import androidx.compose.material3.SegmentedButtonDefaults import androidx.compose.material3.SingleChoiceSegmentedButtonRow +import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect @@ -23,6 +24,7 @@ import androidx.compose.runtime.rememberUpdatedState import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import com.slack.circuit.codegen.annotations.CircuitInject import dagger.hilt.components.SingletonComponent @@ -121,6 +123,28 @@ internal fun ToolsLayout(state: UiState, modifier: Modifier = Modifier) { .padding(bottom = 16.dp, horizontal = MARGIN_TOOLS_LAYOUT_HORIZONTAL) ) } + + item("localization-settings-box", "localization-settings-box") { + Surface( + color = MaterialTheme.colorScheme.primaryContainer, + modifier = Modifier + .fillMaxWidth() + ) { + Column( + modifier = Modifier.padding(32.dp) + ) { + Text( + text = stringResource(R.string.country_settings_subtitle_header), + fontWeight = FontWeight.Bold, + style = MaterialTheme.typography.bodyMedium + ) + Text( + text = stringResource(R.string.country_settings_subtitle_body), + style = MaterialTheme.typography.bodySmall + ) + } + } + } } } From 395a54f0261f4f42adc16e706325514f2e90f1ec Mon Sep 17 00:00:00 2001 From: Tim Johnson Date: Fri, 8 May 2026 11:55:07 -0400 Subject: [PATCH 02/22] Create and insert localizations settings box for tools and lessons pages; lessons WIP --- .../ui/dashboard/LocalizationSettingsBox.kt | 57 +++++++++++++++++++ .../ui/dashboard/tools/ToolsLayout.kt | 27 +++------ .../ui/dashboard/tools/ToolsPresenter.kt | 3 + app/src/main/res/values/strings_dashboard.xml | 3 + 4 files changed, 71 insertions(+), 19 deletions(-) create mode 100644 app/src/main/kotlin/org/cru/godtools/ui/dashboard/LocalizationSettingsBox.kt diff --git a/app/src/main/kotlin/org/cru/godtools/ui/dashboard/LocalizationSettingsBox.kt b/app/src/main/kotlin/org/cru/godtools/ui/dashboard/LocalizationSettingsBox.kt new file mode 100644 index 0000000000..e9b886b4dd --- /dev/null +++ b/app/src/main/kotlin/org/cru/godtools/ui/dashboard/LocalizationSettingsBox.kt @@ -0,0 +1,57 @@ +package org.cru.godtools.ui.dashboard + +import androidx.annotation.StringRes +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Button +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import org.cru.godtools.R + +@Composable +fun LocalizationSettingsBox( + @StringRes title: Int, + @StringRes description: Int, + onClickSettings: () -> Unit, + modifier: Modifier = Modifier, +) { + Surface( + color = MaterialTheme.colorScheme.primaryContainer, + modifier = modifier.fillMaxWidth(), + ) { + Column(modifier = Modifier.padding(32.dp)) { + Text( + text = stringResource(title), + fontWeight = FontWeight.Bold, + style = MaterialTheme.typography.bodyLarge, + color = MaterialTheme.colorScheme.onSurface, + ) + Text( + text = stringResource(description), + style = MaterialTheme.typography.bodySmall, + color = MaterialTheme.colorScheme.onSurface, + ) + Row( + modifier = Modifier + .fillMaxWidth() + .padding(top = 8.dp), + horizontalArrangement = Arrangement.Center, + ) { + Button( + onClick = onClickSettings, + ) { + Text(stringResource(R.string.dashboard_section_localization_box_button)) + } + } + } + } +} diff --git a/app/src/main/kotlin/org/cru/godtools/ui/dashboard/tools/ToolsLayout.kt b/app/src/main/kotlin/org/cru/godtools/ui/dashboard/tools/ToolsLayout.kt index ef438241d5..5351cd8dbd 100644 --- a/app/src/main/kotlin/org/cru/godtools/ui/dashboard/tools/ToolsLayout.kt +++ b/app/src/main/kotlin/org/cru/godtools/ui/dashboard/tools/ToolsLayout.kt @@ -3,6 +3,7 @@ package org.cru.godtools.ui.dashboard.tools import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.wrapContentWidth @@ -10,6 +11,7 @@ import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyRow import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.rememberLazyListState +import androidx.compose.material3.Button import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.MaterialTheme import androidx.compose.material3.SegmentedButton @@ -32,6 +34,7 @@ import org.ccci.gto.android.common.compose.foundation.layout.padding import org.cru.godtools.R import org.cru.godtools.base.ui.circuit.screen.dashboard.page.ToolsScreen import org.cru.godtools.ui.banner.Banners +import org.cru.godtools.ui.dashboard.LocalizationSettingsBox import org.cru.godtools.ui.dashboard.tools.ToolsPresenter.UiEvent import org.cru.godtools.ui.dashboard.tools.ToolsPresenter.UiState import org.cru.godtools.ui.tools.SquareToolCard @@ -125,25 +128,11 @@ internal fun ToolsLayout(state: UiState, modifier: Modifier = Modifier) { } item("localization-settings-box", "localization-settings-box") { - Surface( - color = MaterialTheme.colorScheme.primaryContainer, - modifier = Modifier - .fillMaxWidth() - ) { - Column( - modifier = Modifier.padding(32.dp) - ) { - Text( - text = stringResource(R.string.country_settings_subtitle_header), - fontWeight = FontWeight.Bold, - style = MaterialTheme.typography.bodyMedium - ) - Text( - text = stringResource(R.string.country_settings_subtitle_body), - style = MaterialTheme.typography.bodySmall - ) - } - } + LocalizationSettingsBox( + title = R.string.dashboard_tools_section_personalized_localization_title, + description = R.string.dashboard_tools_section_personalized_localization_text, + onClickSettings = { state.eventSink(UiEvent.OpenLocalizationSettings) } + ) } } } diff --git a/app/src/main/kotlin/org/cru/godtools/ui/dashboard/tools/ToolsPresenter.kt b/app/src/main/kotlin/org/cru/godtools/ui/dashboard/tools/ToolsPresenter.kt index da2eccb9d9..1d698fe95f 100644 --- a/app/src/main/kotlin/org/cru/godtools/ui/dashboard/tools/ToolsPresenter.kt +++ b/app/src/main/kotlin/org/cru/godtools/ui/dashboard/tools/ToolsPresenter.kt @@ -43,6 +43,7 @@ import org.cru.godtools.ui.dashboard.SyncTaskRegistry.Companion.syncTaskRegistry import org.cru.godtools.ui.dashboard.tools.ToolFiltersStateProducer.Filters import org.cru.godtools.ui.dashboard.tools.ToolsPresenter.UiState import org.cru.godtools.ui.dashboard.tools.ToolsPresenter.UiState.Mode +import org.cru.godtools.ui.settings.country.CountrySettingsScreen import org.cru.godtools.ui.tooldetails.ToolDetailsScreen import org.cru.godtools.ui.tools.ToolCardPresenter import org.cru.godtools.ui.tools.ToolCardPresenter.ToolCardEvent @@ -79,6 +80,7 @@ class ToolsPresenter @AssistedInject internal constructor( sealed interface UiEvent : CircuitUiEvent { data class ChangeMode(val mode: Mode) : UiEvent + data object OpenLocalizationSettings : UiEvent } // endregion UiState / UiEvent @@ -120,6 +122,7 @@ class ToolsPresenter @AssistedInject internal constructor( ) { when (it) { is UiEvent.ChangeMode -> mode = it.mode + is UiEvent.OpenLocalizationSettings -> navigator.goTo(CountrySettingsScreen) } } } diff --git a/app/src/main/res/values/strings_dashboard.xml b/app/src/main/res/values/strings_dashboard.xml index 51486d7454..51f76eaa6e 100644 --- a/app/src/main/res/values/strings_dashboard.xml +++ b/app/src/main/res/values/strings_dashboard.xml @@ -83,6 +83,9 @@ An online version can be found at https://knowgod.com/ All Tools Featured Here are some tools we thought you might like + Displaying localized Tools list + The tools shown in your Personalized Tools page are selected based on your Language and Localization setting. You can alter this by editing your setting. + Change Localization Settings From 7a21b4862b5e0bb07394358449825534a8e93c45 Mon Sep 17 00:00:00 2001 From: Tim Johnson Date: Fri, 8 May 2026 16:53:38 -0400 Subject: [PATCH 03/22] Add string resources for lessons layout personalization --- app/src/main/res/values/strings_dashboard.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/res/values/strings_dashboard.xml b/app/src/main/res/values/strings_dashboard.xml index 51f76eaa6e..82e4902e8e 100644 --- a/app/src/main/res/values/strings_dashboard.xml +++ b/app/src/main/res/values/strings_dashboard.xml @@ -49,6 +49,8 @@ An online version can be found at https://knowgod.com/ Completed %1$d%% Complete + Displaying localized Lessons list + The lessons shown on this page are based on your Localization setting. You can alter this at any time. From 2c19b7ddea42700b15e33066bffdcff57f54350e Mon Sep 17 00:00:00 2001 From: Tim Johnson Date: Fri, 8 May 2026 16:54:24 -0400 Subject: [PATCH 04/22] Add UiEvent for going to localization settings from lesson layout --- .../org/cru/godtools/ui/dashboard/lessons/LessonsPresenter.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/main/kotlin/org/cru/godtools/ui/dashboard/lessons/LessonsPresenter.kt b/app/src/main/kotlin/org/cru/godtools/ui/dashboard/lessons/LessonsPresenter.kt index 8fdb399832..579692cb83 100644 --- a/app/src/main/kotlin/org/cru/godtools/ui/dashboard/lessons/LessonsPresenter.kt +++ b/app/src/main/kotlin/org/cru/godtools/ui/dashboard/lessons/LessonsPresenter.kt @@ -54,6 +54,8 @@ import org.cru.godtools.sync.GodToolsSyncService import org.cru.godtools.ui.dashboard.SyncTaskRegistry.Companion.syncTaskRegistry import org.cru.godtools.ui.dashboard.filters.FilterMenu import org.cru.godtools.ui.dashboard.lessons.LessonsPresenter.UiState +import org.cru.godtools.ui.dashboard.tools.ToolsPresenter +import org.cru.godtools.ui.settings.country.CountrySettingsScreen import org.cru.godtools.ui.tools.ToolCardPresenter import org.cru.godtools.ui.tools.ToolCardPresenter.ToolCardEvent import org.cru.godtools.util.createToolIntent @@ -89,6 +91,7 @@ class LessonsPresenter @AssistedInject internal constructor( internal sealed interface UiEvent : CircuitUiEvent { data class ChangeMode(val mode: UiState.Mode) : UiEvent + data object OpenLocalizationSettings : UiEvent } // endregion UiState / UiEvent @@ -114,6 +117,7 @@ class LessonsPresenter @AssistedInject internal constructor( ) { when (it) { is UiEvent.ChangeMode -> mode = it.mode + is UiEvent.OpenLocalizationSettings -> navigator.goTo(CountrySettingsScreen) } } } From 36181b3179317347a88139618daa0520cd04a066 Mon Sep 17 00:00:00 2001 From: Tim Johnson Date: Fri, 8 May 2026 16:55:51 -0400 Subject: [PATCH 05/22] Add locationSettingsBox to lessons layout; Make padding similar to tools layout --- .../ui/dashboard/lessons/LessonsLayout.kt | 26 ++++++++++++++----- 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/app/src/main/kotlin/org/cru/godtools/ui/dashboard/lessons/LessonsLayout.kt b/app/src/main/kotlin/org/cru/godtools/ui/dashboard/lessons/LessonsLayout.kt index 4dd655489e..6f26c34872 100644 --- a/app/src/main/kotlin/org/cru/godtools/ui/dashboard/lessons/LessonsLayout.kt +++ b/app/src/main/kotlin/org/cru/godtools/ui/dashboard/lessons/LessonsLayout.kt @@ -1,7 +1,6 @@ package org.cru.godtools.ui.dashboard.lessons import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.wrapContentWidth @@ -20,16 +19,20 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import com.slack.circuit.codegen.annotations.CircuitInject import dagger.hilt.components.SingletonComponent +import org.ccci.gto.android.common.compose.foundation.layout.padding import org.cru.godtools.R import org.cru.godtools.base.ui.circuit.screen.dashboard.page.LessonsScreen +import org.cru.godtools.ui.dashboard.LocalizationSettingsBox import org.cru.godtools.ui.dashboard.lessons.LessonsPresenter.UiEvent import org.cru.godtools.ui.dashboard.lessons.LessonsPresenter.UiState import org.cru.godtools.ui.tools.LessonToolCard +internal val MARGIN_LESSONS_LAYOUT_HORIZONTAL = 16.dp + @Composable @CircuitInject(LessonsScreen::class, SingletonComponent::class) internal fun LessonsLayout(state: UiState, modifier: Modifier = Modifier) { - LazyColumn(contentPadding = PaddingValues(start = 16.dp, end = 16.dp, bottom = 16.dp), modifier = modifier) { + LazyColumn(modifier = modifier) { if (state.isPersonalizationEnabled) { item("mode-toggle", "mode-toggle") { PersonalizationToggle( @@ -42,9 +45,12 @@ internal fun LessonsLayout(state: UiState, modifier: Modifier = Modifier) { } item("header", "header") { - LessonsHeader(state.mode, modifier = Modifier.padding(top = 16.dp)) - HorizontalDivider(modifier = Modifier.padding(vertical = 12.dp)) - LessonFilters(state) + LessonsHeader( + state.mode, + modifier = Modifier.padding(top = 16.dp, bottom = 16.dp, horizontal = MARGIN_LESSONS_LAYOUT_HORIZONTAL) + ) + HorizontalDivider(modifier = Modifier.padding(horizontal = MARGIN_LESSONS_LAYOUT_HORIZONTAL)) + LessonFilters(state, modifier.padding(vertical = 16.dp, horizontal = MARGIN_LESSONS_LAYOUT_HORIZONTAL)) } items(state.lessons, { it.toolCode.orEmpty() }, { "lesson" }) { toolState -> @@ -54,7 +60,15 @@ internal fun LessonsLayout(state: UiState, modifier: Modifier = Modifier) { showProgress = true, modifier = Modifier .animateItem() - .padding(top = 16.dp) + .padding(bottom = 16.dp, horizontal = MARGIN_LESSONS_LAYOUT_HORIZONTAL) + ) + } + + item("localization-settings-box", "localization-settings-box") { + LocalizationSettingsBox( + title = R.string.dashboard_lessons_section_personalized_localization_title, + description = R.string.dashboard_lessons_section_personalized_localization_text, + onClickSettings = { state.eventSink(UiEvent.OpenLocalizationSettings) } ) } } From 549484651fee716c7bfad271d0fd2cea249b258b Mon Sep 17 00:00:00 2001 From: Tim Johnson Date: Fri, 8 May 2026 16:56:21 -0400 Subject: [PATCH 06/22] Remove unused imports --- .../org/cru/godtools/ui/dashboard/lessons/LessonsPresenter.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/kotlin/org/cru/godtools/ui/dashboard/lessons/LessonsPresenter.kt b/app/src/main/kotlin/org/cru/godtools/ui/dashboard/lessons/LessonsPresenter.kt index 579692cb83..58924ec3cd 100644 --- a/app/src/main/kotlin/org/cru/godtools/ui/dashboard/lessons/LessonsPresenter.kt +++ b/app/src/main/kotlin/org/cru/godtools/ui/dashboard/lessons/LessonsPresenter.kt @@ -54,7 +54,6 @@ import org.cru.godtools.sync.GodToolsSyncService import org.cru.godtools.ui.dashboard.SyncTaskRegistry.Companion.syncTaskRegistry import org.cru.godtools.ui.dashboard.filters.FilterMenu import org.cru.godtools.ui.dashboard.lessons.LessonsPresenter.UiState -import org.cru.godtools.ui.dashboard.tools.ToolsPresenter import org.cru.godtools.ui.settings.country.CountrySettingsScreen import org.cru.godtools.ui.tools.ToolCardPresenter import org.cru.godtools.ui.tools.ToolCardPresenter.ToolCardEvent From 8a9b2c8a8b895270c15b5ab7cb1c82574121f0cb Mon Sep 17 00:00:00 2001 From: Tim Johnson Date: Fri, 8 May 2026 16:57:54 -0400 Subject: [PATCH 07/22] Remove unnecessary Row composable for center alignment; Remove unused imports and style declarations --- .../ui/dashboard/LocalizationSettingsBox.kt | 25 +++++++------------ 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/app/src/main/kotlin/org/cru/godtools/ui/dashboard/LocalizationSettingsBox.kt b/app/src/main/kotlin/org/cru/godtools/ui/dashboard/LocalizationSettingsBox.kt index e9b886b4dd..bf832b434d 100644 --- a/app/src/main/kotlin/org/cru/godtools/ui/dashboard/LocalizationSettingsBox.kt +++ b/app/src/main/kotlin/org/cru/godtools/ui/dashboard/LocalizationSettingsBox.kt @@ -1,9 +1,7 @@ package org.cru.godtools.ui.dashboard import androidx.annotation.StringRes -import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.material3.Button @@ -11,6 +9,7 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight @@ -28,29 +27,23 @@ fun LocalizationSettingsBox( color = MaterialTheme.colorScheme.primaryContainer, modifier = modifier.fillMaxWidth(), ) { - Column(modifier = Modifier.padding(32.dp)) { + Column(modifier = Modifier.padding(16.dp)) { Text( text = stringResource(title), fontWeight = FontWeight.Bold, - style = MaterialTheme.typography.bodyLarge, - color = MaterialTheme.colorScheme.onSurface, + style = MaterialTheme.typography.bodyLarge ) Text( text = stringResource(description), - style = MaterialTheme.typography.bodySmall, - color = MaterialTheme.colorScheme.onSurface, + style = MaterialTheme.typography.bodySmall ) - Row( + Button( + onClick = onClickSettings, modifier = Modifier - .fillMaxWidth() - .padding(top = 8.dp), - horizontalArrangement = Arrangement.Center, + .align(Alignment.CenterHorizontally) + .padding(top = 8.dp) ) { - Button( - onClick = onClickSettings, - ) { - Text(stringResource(R.string.dashboard_section_localization_box_button)) - } + Text(stringResource(R.string.dashboard_section_localization_box_button)) } } } From 4bf1afe1da266a169cfde1631028e537691977b8 Mon Sep 17 00:00:00 2001 From: Tim Johnson Date: Fri, 8 May 2026 16:59:09 -0400 Subject: [PATCH 08/22] Remove unused imports --- .../kotlin/org/cru/godtools/ui/dashboard/tools/ToolsLayout.kt | 4 ---- 1 file changed, 4 deletions(-) diff --git a/app/src/main/kotlin/org/cru/godtools/ui/dashboard/tools/ToolsLayout.kt b/app/src/main/kotlin/org/cru/godtools/ui/dashboard/tools/ToolsLayout.kt index 5351cd8dbd..357d03acb4 100644 --- a/app/src/main/kotlin/org/cru/godtools/ui/dashboard/tools/ToolsLayout.kt +++ b/app/src/main/kotlin/org/cru/godtools/ui/dashboard/tools/ToolsLayout.kt @@ -3,7 +3,6 @@ package org.cru.godtools.ui.dashboard.tools import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues -import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.wrapContentWidth @@ -11,13 +10,11 @@ import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyRow import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.rememberLazyListState -import androidx.compose.material3.Button import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.MaterialTheme import androidx.compose.material3.SegmentedButton import androidx.compose.material3.SegmentedButtonDefaults import androidx.compose.material3.SingleChoiceSegmentedButtonRow -import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect @@ -26,7 +23,6 @@ import androidx.compose.runtime.rememberUpdatedState import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import com.slack.circuit.codegen.annotations.CircuitInject import dagger.hilt.components.SingletonComponent From 361f26753b5ef72c7bac96dd1c951cc588b6d4fd Mon Sep 17 00:00:00 2001 From: Tim Johnson Date: Fri, 8 May 2026 17:03:02 -0400 Subject: [PATCH 09/22] Gate the localization settings banner based on the isPersonalizationEnabled flag --- .../godtools/ui/dashboard/lessons/LessonsLayout.kt | 14 ++++++++------ .../cru/godtools/ui/dashboard/tools/ToolsLayout.kt | 14 ++++++++------ 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/app/src/main/kotlin/org/cru/godtools/ui/dashboard/lessons/LessonsLayout.kt b/app/src/main/kotlin/org/cru/godtools/ui/dashboard/lessons/LessonsLayout.kt index 6f26c34872..0dbbbd6b6f 100644 --- a/app/src/main/kotlin/org/cru/godtools/ui/dashboard/lessons/LessonsLayout.kt +++ b/app/src/main/kotlin/org/cru/godtools/ui/dashboard/lessons/LessonsLayout.kt @@ -64,12 +64,14 @@ internal fun LessonsLayout(state: UiState, modifier: Modifier = Modifier) { ) } - item("localization-settings-box", "localization-settings-box") { - LocalizationSettingsBox( - title = R.string.dashboard_lessons_section_personalized_localization_title, - description = R.string.dashboard_lessons_section_personalized_localization_text, - onClickSettings = { state.eventSink(UiEvent.OpenLocalizationSettings) } - ) + if (state.isPersonalizationEnabled) { + item("localization-settings-box", "localization-settings-box") { + LocalizationSettingsBox( + title = R.string.dashboard_lessons_section_personalized_localization_title, + description = R.string.dashboard_lessons_section_personalized_localization_text, + onClickSettings = { state.eventSink(UiEvent.OpenLocalizationSettings) } + ) + } } } } diff --git a/app/src/main/kotlin/org/cru/godtools/ui/dashboard/tools/ToolsLayout.kt b/app/src/main/kotlin/org/cru/godtools/ui/dashboard/tools/ToolsLayout.kt index 357d03acb4..a708da3786 100644 --- a/app/src/main/kotlin/org/cru/godtools/ui/dashboard/tools/ToolsLayout.kt +++ b/app/src/main/kotlin/org/cru/godtools/ui/dashboard/tools/ToolsLayout.kt @@ -123,12 +123,14 @@ internal fun ToolsLayout(state: UiState, modifier: Modifier = Modifier) { ) } - item("localization-settings-box", "localization-settings-box") { - LocalizationSettingsBox( - title = R.string.dashboard_tools_section_personalized_localization_title, - description = R.string.dashboard_tools_section_personalized_localization_text, - onClickSettings = { state.eventSink(UiEvent.OpenLocalizationSettings) } - ) + if (state.isPersonalizationEnabled) { + item("localization-settings-box", "localization-settings-box") { + LocalizationSettingsBox( + title = R.string.dashboard_tools_section_personalized_localization_title, + description = R.string.dashboard_tools_section_personalized_localization_text, + onClickSettings = { state.eventSink(UiEvent.OpenLocalizationSettings) } + ) + } } } } From 6efb509e5054cbb27d5294481b6de105d136ca1c Mon Sep 17 00:00:00 2001 From: Tim Johnson Date: Fri, 8 May 2026 17:08:05 -0400 Subject: [PATCH 10/22] Minor lint fix --- .../org/cru/godtools/ui/dashboard/lessons/LessonsLayout.kt | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/app/src/main/kotlin/org/cru/godtools/ui/dashboard/lessons/LessonsLayout.kt b/app/src/main/kotlin/org/cru/godtools/ui/dashboard/lessons/LessonsLayout.kt index 0dbbbd6b6f..9541b3624d 100644 --- a/app/src/main/kotlin/org/cru/godtools/ui/dashboard/lessons/LessonsLayout.kt +++ b/app/src/main/kotlin/org/cru/godtools/ui/dashboard/lessons/LessonsLayout.kt @@ -47,10 +47,13 @@ internal fun LessonsLayout(state: UiState, modifier: Modifier = Modifier) { item("header", "header") { LessonsHeader( state.mode, - modifier = Modifier.padding(top = 16.dp, bottom = 16.dp, horizontal = MARGIN_LESSONS_LAYOUT_HORIZONTAL) + Modifier.padding(top = 16.dp, bottom = 16.dp, horizontal = MARGIN_LESSONS_LAYOUT_HORIZONTAL) ) HorizontalDivider(modifier = Modifier.padding(horizontal = MARGIN_LESSONS_LAYOUT_HORIZONTAL)) - LessonFilters(state, modifier.padding(vertical = 16.dp, horizontal = MARGIN_LESSONS_LAYOUT_HORIZONTAL)) + LessonFilters( + state, + modifier = Modifier.padding(vertical = 16.dp, horizontal = MARGIN_LESSONS_LAYOUT_HORIZONTAL) + ) } items(state.lessons, { it.toolCode.orEmpty() }, { "lesson" }) { toolState -> From 020a67c2a0a5e694321446b729a6ad282ec98e1c Mon Sep 17 00:00:00 2001 From: Tim Johnson Date: Fri, 8 May 2026 17:11:39 -0400 Subject: [PATCH 11/22] Make localizationSettingsBox internal following lessons and tools layout convention --- .../org/cru/godtools/ui/dashboard/LocalizationSettingsBox.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/kotlin/org/cru/godtools/ui/dashboard/LocalizationSettingsBox.kt b/app/src/main/kotlin/org/cru/godtools/ui/dashboard/LocalizationSettingsBox.kt index bf832b434d..c040224208 100644 --- a/app/src/main/kotlin/org/cru/godtools/ui/dashboard/LocalizationSettingsBox.kt +++ b/app/src/main/kotlin/org/cru/godtools/ui/dashboard/LocalizationSettingsBox.kt @@ -17,7 +17,7 @@ import androidx.compose.ui.unit.dp import org.cru.godtools.R @Composable -fun LocalizationSettingsBox( +internal fun LocalizationSettingsBox( @StringRes title: Int, @StringRes description: Int, onClickSettings: () -> Unit, From 8ef1933ec5470fecdc8b7938c30100168a3c64cd Mon Sep 17 00:00:00 2001 From: Tim Johnson Date: Tue, 12 May 2026 13:51:04 -0400 Subject: [PATCH 12/22] Revert erroneous padding changes and correct personalization if statement --- .../ui/dashboard/lessons/LessonsLayout.kt | 25 +++++++++++-------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/app/src/main/kotlin/org/cru/godtools/ui/dashboard/lessons/LessonsLayout.kt b/app/src/main/kotlin/org/cru/godtools/ui/dashboard/lessons/LessonsLayout.kt index 9541b3624d..7984689ccd 100644 --- a/app/src/main/kotlin/org/cru/godtools/ui/dashboard/lessons/LessonsLayout.kt +++ b/app/src/main/kotlin/org/cru/godtools/ui/dashboard/lessons/LessonsLayout.kt @@ -1,7 +1,9 @@ package org.cru.godtools.ui.dashboard.lessons import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.wrapContentWidth import androidx.compose.foundation.lazy.LazyColumn @@ -45,15 +47,14 @@ internal fun LessonsLayout(state: UiState, modifier: Modifier = Modifier) { } item("header", "header") { - LessonsHeader( - state.mode, - Modifier.padding(top = 16.dp, bottom = 16.dp, horizontal = MARGIN_LESSONS_LAYOUT_HORIZONTAL) - ) - HorizontalDivider(modifier = Modifier.padding(horizontal = MARGIN_LESSONS_LAYOUT_HORIZONTAL)) - LessonFilters( - state, - modifier = Modifier.padding(vertical = 16.dp, horizontal = MARGIN_LESSONS_LAYOUT_HORIZONTAL) + LessonsHeader(state.mode, Modifier.padding(top = 16.dp, horizontal = MARGIN_LESSONS_LAYOUT_HORIZONTAL)) + HorizontalDivider( + modifier = Modifier.padding( + vertical = 12.dp, + horizontal = MARGIN_LESSONS_LAYOUT_HORIZONTAL + ) ) + LessonFilters(state, modifier = Modifier.padding(horizontal = MARGIN_LESSONS_LAYOUT_HORIZONTAL)) } items(state.lessons, { it.toolCode.orEmpty() }, { "lesson" }) { toolState -> @@ -63,11 +64,15 @@ internal fun LessonsLayout(state: UiState, modifier: Modifier = Modifier) { showProgress = true, modifier = Modifier .animateItem() - .padding(bottom = 16.dp, horizontal = MARGIN_LESSONS_LAYOUT_HORIZONTAL) + .padding(top = 16.dp, horizontal = MARGIN_LESSONS_LAYOUT_HORIZONTAL) ) } - if (state.isPersonalizationEnabled) { + item("spacer", "spacer") { + Spacer(modifier = Modifier.height(16.dp)) + } + + if (state.mode == UiState.Mode.PERSONALIZATION) { item("localization-settings-box", "localization-settings-box") { LocalizationSettingsBox( title = R.string.dashboard_lessons_section_personalized_localization_title, From 9054ca16802d2a2c3dcc0ee7812e6d3ca4361107 Mon Sep 17 00:00:00 2001 From: Tim Johnson Date: Tue, 12 May 2026 13:51:46 -0400 Subject: [PATCH 13/22] Correct personalization if statement for personalization settings box --- .../kotlin/org/cru/godtools/ui/dashboard/tools/ToolsLayout.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/kotlin/org/cru/godtools/ui/dashboard/tools/ToolsLayout.kt b/app/src/main/kotlin/org/cru/godtools/ui/dashboard/tools/ToolsLayout.kt index a708da3786..93f8292280 100644 --- a/app/src/main/kotlin/org/cru/godtools/ui/dashboard/tools/ToolsLayout.kt +++ b/app/src/main/kotlin/org/cru/godtools/ui/dashboard/tools/ToolsLayout.kt @@ -123,7 +123,7 @@ internal fun ToolsLayout(state: UiState, modifier: Modifier = Modifier) { ) } - if (state.isPersonalizationEnabled) { + if (state.mode == UiState.Mode.PERSONALIZATION) { item("localization-settings-box", "localization-settings-box") { LocalizationSettingsBox( title = R.string.dashboard_tools_section_personalized_localization_title, From 4b9b9b41293c5a3e9a3e11a25d34ce6b4364d7ee Mon Sep 17 00:00:00 2001 From: Tim Johnson Date: Tue, 12 May 2026 13:54:26 -0400 Subject: [PATCH 14/22] Add snapshot tests for lessons and tools localization settings box --- .../dashboard/DashboardLayoutPaparazziTest.kt | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/app/src/testDebug/kotlin/org/cru/godtools/ui/dashboard/DashboardLayoutPaparazziTest.kt b/app/src/testDebug/kotlin/org/cru/godtools/ui/dashboard/DashboardLayoutPaparazziTest.kt index 13739919fd..5befbe7864 100644 --- a/app/src/testDebug/kotlin/org/cru/godtools/ui/dashboard/DashboardLayoutPaparazziTest.kt +++ b/app/src/testDebug/kotlin/org/cru/godtools/ui/dashboard/DashboardLayoutPaparazziTest.kt @@ -194,6 +194,17 @@ class DashboardLayoutPaparazziTest( snapshotDashboardLayout(state.copy(initialPage = ToolsScreen)) } + @Test + fun `ToolsLayout() - Personalization - Localization Settings Box`() { + assumeTrue(locale == null) + toolsState = toolsState.copy( + mode = ToolsPresenter.UiState.Mode.PERSONALIZATION, + spotlightTools = emptyList(), + tools = emptyList(), + ) + snapshotDashboardLayout(state.copy(initialPage = ToolsScreen)) + } + @Test fun `ToolsLayout() - No Personalization`() { assumeTrue(locale == null) @@ -303,6 +314,16 @@ class DashboardLayoutPaparazziTest( snapshotDashboardLayout(state.copy(initialPage = LessonsScreen)) } + @Test + fun `LessonsLayout() - Personalization - Localization Settings Box`() { + assumeTrue(locale == null) + lessonsState = lessonsState.copy( + mode = LessonsPresenter.UiState.Mode.PERSONALIZATION, + lessons = emptyList(), + ) + snapshotDashboardLayout(state.copy(initialPage = LessonsScreen)) + } + @Test fun `LessonsLayout() - Personalization Disabled`() { lessonsState = lessonsState.copy(isPersonalizationEnabled = false) From dfdbc539f4b8fa39ae242d4731c759e62f58e0b5 Mon Sep 17 00:00:00 2001 From: tjohnson009 Date: Tue, 12 May 2026 18:31:06 +0000 Subject: [PATCH 15/22] Record updated snapshots --- ...ttings_Box[Nexus_5,locale=null,NIGHT,NO_ACCESSIBILITY].png | 3 +++ ...ttings_Box[Nexus_5,locale=null,NOTNIGHT,ACCESSIBILITY].png | 3 +++ ...ngs_Box[Nexus_5,locale=null,NOTNIGHT,NO_ACCESSIBILITY].png | 3 +++ ...gs_Box[Pixel_6_Pro,locale=null,NIGHT,NO_ACCESSIBILITY].png | 3 +++ ...Box[Pixel_6_Pro,locale=null,NOTNIGHT,NO_ACCESSIBILITY].png | 3 +++ ...ttings_Box[Nexus_5,locale=null,NIGHT,NO_ACCESSIBILITY].png | 3 +++ ...ttings_Box[Nexus_5,locale=null,NOTNIGHT,ACCESSIBILITY].png | 3 +++ ...ngs_Box[Nexus_5,locale=null,NOTNIGHT,NO_ACCESSIBILITY].png | 3 +++ ...gs_Box[Pixel_6_Pro,locale=null,NIGHT,NO_ACCESSIBILITY].png | 3 +++ ...Box[Pixel_6_Pro,locale=null,NOTNIGHT,NO_ACCESSIBILITY].png | 3 +++ ..._Tools[Pixel_6_Pro,locale=null,NIGHT,NO_ACCESSIBILITY].png | 4 ++-- ...ols[Pixel_6_Pro,locale=null,NOTNIGHT,NO_ACCESSIBILITY].png | 4 ++-- 12 files changed, 34 insertions(+), 4 deletions(-) create mode 100644 app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_LessonsLayout()_-_Personalization_-_Localization_Settings_Box[Nexus_5,locale=null,NIGHT,NO_ACCESSIBILITY].png create mode 100644 app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_LessonsLayout()_-_Personalization_-_Localization_Settings_Box[Nexus_5,locale=null,NOTNIGHT,ACCESSIBILITY].png create mode 100644 app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_LessonsLayout()_-_Personalization_-_Localization_Settings_Box[Nexus_5,locale=null,NOTNIGHT,NO_ACCESSIBILITY].png create mode 100644 app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_LessonsLayout()_-_Personalization_-_Localization_Settings_Box[Pixel_6_Pro,locale=null,NIGHT,NO_ACCESSIBILITY].png create mode 100644 app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_LessonsLayout()_-_Personalization_-_Localization_Settings_Box[Pixel_6_Pro,locale=null,NOTNIGHT,NO_ACCESSIBILITY].png create mode 100644 app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_ToolsLayout()_-_Personalization_-_Localization_Settings_Box[Nexus_5,locale=null,NIGHT,NO_ACCESSIBILITY].png create mode 100644 app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_ToolsLayout()_-_Personalization_-_Localization_Settings_Box[Nexus_5,locale=null,NOTNIGHT,ACCESSIBILITY].png create mode 100644 app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_ToolsLayout()_-_Personalization_-_Localization_Settings_Box[Nexus_5,locale=null,NOTNIGHT,NO_ACCESSIBILITY].png create mode 100644 app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_ToolsLayout()_-_Personalization_-_Localization_Settings_Box[Pixel_6_Pro,locale=null,NIGHT,NO_ACCESSIBILITY].png create mode 100644 app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_ToolsLayout()_-_Personalization_-_Localization_Settings_Box[Pixel_6_Pro,locale=null,NOTNIGHT,NO_ACCESSIBILITY].png diff --git a/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_LessonsLayout()_-_Personalization_-_Localization_Settings_Box[Nexus_5,locale=null,NIGHT,NO_ACCESSIBILITY].png b/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_LessonsLayout()_-_Personalization_-_Localization_Settings_Box[Nexus_5,locale=null,NIGHT,NO_ACCESSIBILITY].png new file mode 100644 index 0000000000..ff90d0807e --- /dev/null +++ b/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_LessonsLayout()_-_Personalization_-_Localization_Settings_Box[Nexus_5,locale=null,NIGHT,NO_ACCESSIBILITY].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:88037b43364778a17ea541a5a9ff91f18dab4ca7ec23f8c78af9a4d84ffe1491 +size 59923 diff --git a/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_LessonsLayout()_-_Personalization_-_Localization_Settings_Box[Nexus_5,locale=null,NOTNIGHT,ACCESSIBILITY].png b/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_LessonsLayout()_-_Personalization_-_Localization_Settings_Box[Nexus_5,locale=null,NOTNIGHT,ACCESSIBILITY].png new file mode 100644 index 0000000000..1b47fb2801 --- /dev/null +++ b/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_LessonsLayout()_-_Personalization_-_Localization_Settings_Box[Nexus_5,locale=null,NOTNIGHT,ACCESSIBILITY].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6e6c69f37ea620d68a34459e12ac4ea49e703c8b0082d2dfea8562ab7bc02263 +size 146077 diff --git a/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_LessonsLayout()_-_Personalization_-_Localization_Settings_Box[Nexus_5,locale=null,NOTNIGHT,NO_ACCESSIBILITY].png b/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_LessonsLayout()_-_Personalization_-_Localization_Settings_Box[Nexus_5,locale=null,NOTNIGHT,NO_ACCESSIBILITY].png new file mode 100644 index 0000000000..c33044e913 --- /dev/null +++ b/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_LessonsLayout()_-_Personalization_-_Localization_Settings_Box[Nexus_5,locale=null,NOTNIGHT,NO_ACCESSIBILITY].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:db0c7e87e5f3f182c6fdde7f067a5a258448d3cd6eda17bedb729c8b4a8e3af1 +size 58623 diff --git a/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_LessonsLayout()_-_Personalization_-_Localization_Settings_Box[Pixel_6_Pro,locale=null,NIGHT,NO_ACCESSIBILITY].png b/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_LessonsLayout()_-_Personalization_-_Localization_Settings_Box[Pixel_6_Pro,locale=null,NIGHT,NO_ACCESSIBILITY].png new file mode 100644 index 0000000000..f1c79d68eb --- /dev/null +++ b/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_LessonsLayout()_-_Personalization_-_Localization_Settings_Box[Pixel_6_Pro,locale=null,NIGHT,NO_ACCESSIBILITY].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b64905c8817b7182ca5e99aea6db85661b4af3207012c2e6f9d94b4c2ec6b081 +size 44690 diff --git a/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_LessonsLayout()_-_Personalization_-_Localization_Settings_Box[Pixel_6_Pro,locale=null,NOTNIGHT,NO_ACCESSIBILITY].png b/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_LessonsLayout()_-_Personalization_-_Localization_Settings_Box[Pixel_6_Pro,locale=null,NOTNIGHT,NO_ACCESSIBILITY].png new file mode 100644 index 0000000000..2203013141 --- /dev/null +++ b/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_LessonsLayout()_-_Personalization_-_Localization_Settings_Box[Pixel_6_Pro,locale=null,NOTNIGHT,NO_ACCESSIBILITY].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cad7865b6949418356558a50675fb14d2c4aed2c69f6f1d91429663ae9f9cc16 +size 43957 diff --git a/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_ToolsLayout()_-_Personalization_-_Localization_Settings_Box[Nexus_5,locale=null,NIGHT,NO_ACCESSIBILITY].png b/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_ToolsLayout()_-_Personalization_-_Localization_Settings_Box[Nexus_5,locale=null,NIGHT,NO_ACCESSIBILITY].png new file mode 100644 index 0000000000..bfb94106db --- /dev/null +++ b/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_ToolsLayout()_-_Personalization_-_Localization_Settings_Box[Nexus_5,locale=null,NIGHT,NO_ACCESSIBILITY].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2b61990b52f911bc8a5a5fa53786486e4fb252d167b3c88df20d3c6088c2c898 +size 69438 diff --git a/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_ToolsLayout()_-_Personalization_-_Localization_Settings_Box[Nexus_5,locale=null,NOTNIGHT,ACCESSIBILITY].png b/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_ToolsLayout()_-_Personalization_-_Localization_Settings_Box[Nexus_5,locale=null,NOTNIGHT,ACCESSIBILITY].png new file mode 100644 index 0000000000..00b72e388a --- /dev/null +++ b/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_ToolsLayout()_-_Personalization_-_Localization_Settings_Box[Nexus_5,locale=null,NOTNIGHT,ACCESSIBILITY].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b5223c77950ff1d1a83c1674d52ec37cdf95042e8ef2faa0241ffb4cedb3b4b0 +size 157046 diff --git a/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_ToolsLayout()_-_Personalization_-_Localization_Settings_Box[Nexus_5,locale=null,NOTNIGHT,NO_ACCESSIBILITY].png b/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_ToolsLayout()_-_Personalization_-_Localization_Settings_Box[Nexus_5,locale=null,NOTNIGHT,NO_ACCESSIBILITY].png new file mode 100644 index 0000000000..3309f4a252 --- /dev/null +++ b/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_ToolsLayout()_-_Personalization_-_Localization_Settings_Box[Nexus_5,locale=null,NOTNIGHT,NO_ACCESSIBILITY].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1d4a9cf501ece687a5ab2363f40fdcaaaf83298b12ae75cdc57cad10a635d321 +size 68049 diff --git a/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_ToolsLayout()_-_Personalization_-_Localization_Settings_Box[Pixel_6_Pro,locale=null,NIGHT,NO_ACCESSIBILITY].png b/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_ToolsLayout()_-_Personalization_-_Localization_Settings_Box[Pixel_6_Pro,locale=null,NIGHT,NO_ACCESSIBILITY].png new file mode 100644 index 0000000000..5e3c7be9e5 --- /dev/null +++ b/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_ToolsLayout()_-_Personalization_-_Localization_Settings_Box[Pixel_6_Pro,locale=null,NIGHT,NO_ACCESSIBILITY].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2825c6736d960c1a01f5f7f839271dfcd4b78eb4f50fcf9f0f68d0070e5e93b1 +size 51644 diff --git a/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_ToolsLayout()_-_Personalization_-_Localization_Settings_Box[Pixel_6_Pro,locale=null,NOTNIGHT,NO_ACCESSIBILITY].png b/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_ToolsLayout()_-_Personalization_-_Localization_Settings_Box[Pixel_6_Pro,locale=null,NOTNIGHT,NO_ACCESSIBILITY].png new file mode 100644 index 0000000000..943d5b9cf3 --- /dev/null +++ b/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_ToolsLayout()_-_Personalization_-_Localization_Settings_Box[Pixel_6_Pro,locale=null,NOTNIGHT,NO_ACCESSIBILITY].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:581d1ee0bd2c7f5170fd8252e06c4bd3421199fe952e53cab7fb0063d958fd8e +size 50638 diff --git a/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_ToolsLayout()_-_Personalization_-_No_Tools[Pixel_6_Pro,locale=null,NIGHT,NO_ACCESSIBILITY].png b/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_ToolsLayout()_-_Personalization_-_No_Tools[Pixel_6_Pro,locale=null,NIGHT,NO_ACCESSIBILITY].png index 4e81bb320e..9b791c270a 100644 --- a/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_ToolsLayout()_-_Personalization_-_No_Tools[Pixel_6_Pro,locale=null,NIGHT,NO_ACCESSIBILITY].png +++ b/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_ToolsLayout()_-_Personalization_-_No_Tools[Pixel_6_Pro,locale=null,NIGHT,NO_ACCESSIBILITY].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:cd0395f220bd21cbfc50a9bfd758c4bae1f359748802942bcf58e939fa361f48 -size 64070 +oid sha256:75327f0afc1d9e0e38eb3601131b9c513f3f2a72660620099eefe89dbdfc3f96 +size 83602 diff --git a/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_ToolsLayout()_-_Personalization_-_No_Tools[Pixel_6_Pro,locale=null,NOTNIGHT,NO_ACCESSIBILITY].png b/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_ToolsLayout()_-_Personalization_-_No_Tools[Pixel_6_Pro,locale=null,NOTNIGHT,NO_ACCESSIBILITY].png index b4e6a8d05d..df713a50c1 100644 --- a/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_ToolsLayout()_-_Personalization_-_No_Tools[Pixel_6_Pro,locale=null,NOTNIGHT,NO_ACCESSIBILITY].png +++ b/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_ToolsLayout()_-_Personalization_-_No_Tools[Pixel_6_Pro,locale=null,NOTNIGHT,NO_ACCESSIBILITY].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9586615ef859302a0e04da4cf4abfe510a7e6e7b616710241a1c23d351d42685 -size 64336 +oid sha256:f91a6b47f6726f443ba0066dfae4f9f219fe2e82956b5f766c984ffabf94708a +size 83134 From 6b2b9b4e5f90f61045dc39105644fcc23cb67735 Mon Sep 17 00:00:00 2001 From: Tim Johnson Date: Tue, 12 May 2026 15:52:54 -0400 Subject: [PATCH 16/22] Retrigger CI From f83b56213709d1eafa9e67577cb7165b9cce0fb0 Mon Sep 17 00:00:00 2001 From: Tim Johnson <62769082+tjohnson009@users.noreply.github.com> Date: Tue, 12 May 2026 19:49:53 -0400 Subject: [PATCH 17/22] Update modifier line to single line Co-authored-by: Daniel Frett --- .../org/cru/godtools/ui/dashboard/lessons/LessonsLayout.kt | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/app/src/main/kotlin/org/cru/godtools/ui/dashboard/lessons/LessonsLayout.kt b/app/src/main/kotlin/org/cru/godtools/ui/dashboard/lessons/LessonsLayout.kt index 7984689ccd..b0af1c808b 100644 --- a/app/src/main/kotlin/org/cru/godtools/ui/dashboard/lessons/LessonsLayout.kt +++ b/app/src/main/kotlin/org/cru/godtools/ui/dashboard/lessons/LessonsLayout.kt @@ -49,10 +49,7 @@ internal fun LessonsLayout(state: UiState, modifier: Modifier = Modifier) { item("header", "header") { LessonsHeader(state.mode, Modifier.padding(top = 16.dp, horizontal = MARGIN_LESSONS_LAYOUT_HORIZONTAL)) HorizontalDivider( - modifier = Modifier.padding( - vertical = 12.dp, - horizontal = MARGIN_LESSONS_LAYOUT_HORIZONTAL - ) + modifier = Modifier.padding(vertical = 12.dp, horizontal = MARGIN_LESSONS_LAYOUT_HORIZONTAL) ) LessonFilters(state, modifier = Modifier.padding(horizontal = MARGIN_LESSONS_LAYOUT_HORIZONTAL)) } From 41ac74ee6cda862dc9988f6d17fd68adb7c1ab5c Mon Sep 17 00:00:00 2001 From: Tim Johnson Date: Fri, 15 May 2026 11:02:47 -0400 Subject: [PATCH 18/22] Add a custom vertical arrangement to LazyColumn to pin localization to the bottom --- .../ui/dashboard/lessons/LessonsLayout.kt | 23 ++++++++++++++++++- .../ui/dashboard/tools/ToolsLayout.kt | 23 ++++++++++++++++++- 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/app/src/main/kotlin/org/cru/godtools/ui/dashboard/lessons/LessonsLayout.kt b/app/src/main/kotlin/org/cru/godtools/ui/dashboard/lessons/LessonsLayout.kt index b0af1c808b..3c66f456a4 100644 --- a/app/src/main/kotlin/org/cru/godtools/ui/dashboard/lessons/LessonsLayout.kt +++ b/app/src/main/kotlin/org/cru/godtools/ui/dashboard/lessons/LessonsLayout.kt @@ -1,7 +1,9 @@ package org.cru.godtools.ui.dashboard.lessons +import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding @@ -15,9 +17,11 @@ import androidx.compose.material3.SegmentedButtonDefaults import androidx.compose.material3.SingleChoiceSegmentedButtonRow import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.Density import androidx.compose.ui.unit.dp import com.slack.circuit.codegen.annotations.CircuitInject import dagger.hilt.components.SingletonComponent @@ -34,7 +38,24 @@ internal val MARGIN_LESSONS_LAYOUT_HORIZONTAL = 16.dp @Composable @CircuitInject(LessonsScreen::class, SingletonComponent::class) internal fun LessonsLayout(state: UiState, modifier: Modifier = Modifier) { - LazyColumn(modifier = modifier) { + LazyColumn( + verticalArrangement = remember { + object : Arrangement.Vertical { + override fun Density.arrange(totalSize: Int, sizes: IntArray, outPositions: IntArray) { + var currentOffset = 0 + sizes.forEachIndexed { index, size -> + if (index == sizes.lastIndex) { + outPositions[index] = maxOf(currentOffset, totalSize - size) + } else { + outPositions[index] = currentOffset + currentOffset += size + } + } + } + } + }, + modifier = modifier.fillMaxHeight() + ) { if (state.isPersonalizationEnabled) { item("mode-toggle", "mode-toggle") { PersonalizationToggle( diff --git a/app/src/main/kotlin/org/cru/godtools/ui/dashboard/tools/ToolsLayout.kt b/app/src/main/kotlin/org/cru/godtools/ui/dashboard/tools/ToolsLayout.kt index 93f8292280..31caa866c3 100644 --- a/app/src/main/kotlin/org/cru/godtools/ui/dashboard/tools/ToolsLayout.kt +++ b/app/src/main/kotlin/org/cru/godtools/ui/dashboard/tools/ToolsLayout.kt @@ -3,6 +3,7 @@ package org.cru.godtools.ui.dashboard.tools import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.wrapContentWidth @@ -19,10 +20,12 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember import androidx.compose.runtime.rememberUpdatedState import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.Density import androidx.compose.ui.unit.dp import com.slack.circuit.codegen.annotations.CircuitInject import dagger.hilt.components.SingletonComponent @@ -48,7 +51,25 @@ internal fun ToolsLayout(state: UiState, modifier: Modifier = Modifier) { val columnState = rememberLazyListState() LaunchedEffect(state.banner?.type) { if (state.banner != null) columnState.animateScrollToItem(0) } - LazyColumn(state = columnState, modifier = modifier) { + LazyColumn( + state = columnState, + verticalArrangement = remember { + object : Arrangement.Vertical { + override fun Density.arrange(totalSize: Int, sizes: IntArray, outPositions: IntArray) { + var currentOffset = 0 + sizes.forEachIndexed { index, size -> + if (index == sizes.lastIndex) { + outPositions[index] = maxOf(currentOffset, totalSize - size) + } else { + outPositions[index] = currentOffset + currentOffset += size + } + } + } + } + }, + modifier = modifier.fillMaxHeight() + ) { if (!state.dataLoaded) return@LazyColumn item("banners", "banners") { From 5c4996799492ebfacff24d8d568bd4e9f7451aac Mon Sep 17 00:00:00 2001 From: tjohnson009 Date: Fri, 15 May 2026 15:29:47 +0000 Subject: [PATCH 19/22] Record updated snapshots --- ...ttings_Box[Nexus_5,locale=null,NIGHT,NO_ACCESSIBILITY].png | 4 ++-- ...ttings_Box[Nexus_5,locale=null,NOTNIGHT,ACCESSIBILITY].png | 4 ++-- ...ngs_Box[Nexus_5,locale=null,NOTNIGHT,NO_ACCESSIBILITY].png | 4 ++-- ...gs_Box[Pixel_6_Pro,locale=null,NIGHT,NO_ACCESSIBILITY].png | 4 ++-- ...Box[Pixel_6_Pro,locale=null,NOTNIGHT,NO_ACCESSIBILITY].png | 4 ++-- ...ttings_Box[Nexus_5,locale=null,NIGHT,NO_ACCESSIBILITY].png | 4 ++-- ...ttings_Box[Nexus_5,locale=null,NOTNIGHT,ACCESSIBILITY].png | 4 ++-- ...ngs_Box[Nexus_5,locale=null,NOTNIGHT,NO_ACCESSIBILITY].png | 4 ++-- ...gs_Box[Pixel_6_Pro,locale=null,NIGHT,NO_ACCESSIBILITY].png | 4 ++-- ...Box[Pixel_6_Pro,locale=null,NOTNIGHT,NO_ACCESSIBILITY].png | 4 ++-- 10 files changed, 20 insertions(+), 20 deletions(-) diff --git a/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_LessonsLayout()_-_Personalization_-_Localization_Settings_Box[Nexus_5,locale=null,NIGHT,NO_ACCESSIBILITY].png b/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_LessonsLayout()_-_Personalization_-_Localization_Settings_Box[Nexus_5,locale=null,NIGHT,NO_ACCESSIBILITY].png index ff90d0807e..9cc80b6a77 100644 --- a/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_LessonsLayout()_-_Personalization_-_Localization_Settings_Box[Nexus_5,locale=null,NIGHT,NO_ACCESSIBILITY].png +++ b/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_LessonsLayout()_-_Personalization_-_Localization_Settings_Box[Nexus_5,locale=null,NIGHT,NO_ACCESSIBILITY].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:88037b43364778a17ea541a5a9ff91f18dab4ca7ec23f8c78af9a4d84ffe1491 -size 59923 +oid sha256:223de3c1d5283869ac730cca95788b6a1122921036e5722eb1e32370c6362987 +size 60043 diff --git a/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_LessonsLayout()_-_Personalization_-_Localization_Settings_Box[Nexus_5,locale=null,NOTNIGHT,ACCESSIBILITY].png b/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_LessonsLayout()_-_Personalization_-_Localization_Settings_Box[Nexus_5,locale=null,NOTNIGHT,ACCESSIBILITY].png index 1b47fb2801..a511a406c4 100644 --- a/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_LessonsLayout()_-_Personalization_-_Localization_Settings_Box[Nexus_5,locale=null,NOTNIGHT,ACCESSIBILITY].png +++ b/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_LessonsLayout()_-_Personalization_-_Localization_Settings_Box[Nexus_5,locale=null,NOTNIGHT,ACCESSIBILITY].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6e6c69f37ea620d68a34459e12ac4ea49e703c8b0082d2dfea8562ab7bc02263 -size 146077 +oid sha256:50f9c12981aacf04a2e7fb0909121a0ff9d0338a7570bdcab1fd4f16f35c84ca +size 146395 diff --git a/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_LessonsLayout()_-_Personalization_-_Localization_Settings_Box[Nexus_5,locale=null,NOTNIGHT,NO_ACCESSIBILITY].png b/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_LessonsLayout()_-_Personalization_-_Localization_Settings_Box[Nexus_5,locale=null,NOTNIGHT,NO_ACCESSIBILITY].png index c33044e913..96827beb39 100644 --- a/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_LessonsLayout()_-_Personalization_-_Localization_Settings_Box[Nexus_5,locale=null,NOTNIGHT,NO_ACCESSIBILITY].png +++ b/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_LessonsLayout()_-_Personalization_-_Localization_Settings_Box[Nexus_5,locale=null,NOTNIGHT,NO_ACCESSIBILITY].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:db0c7e87e5f3f182c6fdde7f067a5a258448d3cd6eda17bedb729c8b4a8e3af1 -size 58623 +oid sha256:3a547c724078ef2096d3e4df4ee724f29bfc31f5259b2b7b78c6d253f0010463 +size 58701 diff --git a/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_LessonsLayout()_-_Personalization_-_Localization_Settings_Box[Pixel_6_Pro,locale=null,NIGHT,NO_ACCESSIBILITY].png b/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_LessonsLayout()_-_Personalization_-_Localization_Settings_Box[Pixel_6_Pro,locale=null,NIGHT,NO_ACCESSIBILITY].png index f1c79d68eb..9c5685063c 100644 --- a/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_LessonsLayout()_-_Personalization_-_Localization_Settings_Box[Pixel_6_Pro,locale=null,NIGHT,NO_ACCESSIBILITY].png +++ b/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_LessonsLayout()_-_Personalization_-_Localization_Settings_Box[Pixel_6_Pro,locale=null,NIGHT,NO_ACCESSIBILITY].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b64905c8817b7182ca5e99aea6db85661b4af3207012c2e6f9d94b4c2ec6b081 -size 44690 +oid sha256:586eb4f58f275a668f82efec023468ee3917a494dd3a3aa7bd90f9f696b3f396 +size 44577 diff --git a/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_LessonsLayout()_-_Personalization_-_Localization_Settings_Box[Pixel_6_Pro,locale=null,NOTNIGHT,NO_ACCESSIBILITY].png b/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_LessonsLayout()_-_Personalization_-_Localization_Settings_Box[Pixel_6_Pro,locale=null,NOTNIGHT,NO_ACCESSIBILITY].png index 2203013141..8275c7c9ed 100644 --- a/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_LessonsLayout()_-_Personalization_-_Localization_Settings_Box[Pixel_6_Pro,locale=null,NOTNIGHT,NO_ACCESSIBILITY].png +++ b/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_LessonsLayout()_-_Personalization_-_Localization_Settings_Box[Pixel_6_Pro,locale=null,NOTNIGHT,NO_ACCESSIBILITY].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:cad7865b6949418356558a50675fb14d2c4aed2c69f6f1d91429663ae9f9cc16 -size 43957 +oid sha256:8eb692fd567ca51706f0edaece89c52551cd8e0c15f61e6fe7404779e28ec4d0 +size 43721 diff --git a/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_ToolsLayout()_-_Personalization_-_Localization_Settings_Box[Nexus_5,locale=null,NIGHT,NO_ACCESSIBILITY].png b/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_ToolsLayout()_-_Personalization_-_Localization_Settings_Box[Nexus_5,locale=null,NIGHT,NO_ACCESSIBILITY].png index bfb94106db..c1c483d12a 100644 --- a/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_ToolsLayout()_-_Personalization_-_Localization_Settings_Box[Nexus_5,locale=null,NIGHT,NO_ACCESSIBILITY].png +++ b/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_ToolsLayout()_-_Personalization_-_Localization_Settings_Box[Nexus_5,locale=null,NIGHT,NO_ACCESSIBILITY].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2b61990b52f911bc8a5a5fa53786486e4fb252d167b3c88df20d3c6088c2c898 -size 69438 +oid sha256:06fa331a198dc5acf0b458d070e3c047a549670b0210960117a35f12e572ff2f +size 69913 diff --git a/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_ToolsLayout()_-_Personalization_-_Localization_Settings_Box[Nexus_5,locale=null,NOTNIGHT,ACCESSIBILITY].png b/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_ToolsLayout()_-_Personalization_-_Localization_Settings_Box[Nexus_5,locale=null,NOTNIGHT,ACCESSIBILITY].png index 00b72e388a..90e4413809 100644 --- a/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_ToolsLayout()_-_Personalization_-_Localization_Settings_Box[Nexus_5,locale=null,NOTNIGHT,ACCESSIBILITY].png +++ b/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_ToolsLayout()_-_Personalization_-_Localization_Settings_Box[Nexus_5,locale=null,NOTNIGHT,ACCESSIBILITY].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b5223c77950ff1d1a83c1674d52ec37cdf95042e8ef2faa0241ffb4cedb3b4b0 -size 157046 +oid sha256:edd797205e5a38f4bedc083b692724d09da10c346811a7c29ce8c90a63d06ae7 +size 156915 diff --git a/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_ToolsLayout()_-_Personalization_-_Localization_Settings_Box[Nexus_5,locale=null,NOTNIGHT,NO_ACCESSIBILITY].png b/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_ToolsLayout()_-_Personalization_-_Localization_Settings_Box[Nexus_5,locale=null,NOTNIGHT,NO_ACCESSIBILITY].png index 3309f4a252..9033e87ddb 100644 --- a/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_ToolsLayout()_-_Personalization_-_Localization_Settings_Box[Nexus_5,locale=null,NOTNIGHT,NO_ACCESSIBILITY].png +++ b/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_ToolsLayout()_-_Personalization_-_Localization_Settings_Box[Nexus_5,locale=null,NOTNIGHT,NO_ACCESSIBILITY].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1d4a9cf501ece687a5ab2363f40fdcaaaf83298b12ae75cdc57cad10a635d321 -size 68049 +oid sha256:279c8dca72575095e1063919122111353447063c7f8f16d5a485ea9de31e9453 +size 68679 diff --git a/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_ToolsLayout()_-_Personalization_-_Localization_Settings_Box[Pixel_6_Pro,locale=null,NIGHT,NO_ACCESSIBILITY].png b/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_ToolsLayout()_-_Personalization_-_Localization_Settings_Box[Pixel_6_Pro,locale=null,NIGHT,NO_ACCESSIBILITY].png index 5e3c7be9e5..b57f142691 100644 --- a/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_ToolsLayout()_-_Personalization_-_Localization_Settings_Box[Pixel_6_Pro,locale=null,NIGHT,NO_ACCESSIBILITY].png +++ b/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_ToolsLayout()_-_Personalization_-_Localization_Settings_Box[Pixel_6_Pro,locale=null,NIGHT,NO_ACCESSIBILITY].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2825c6736d960c1a01f5f7f839271dfcd4b78eb4f50fcf9f0f68d0070e5e93b1 -size 51644 +oid sha256:e52c076fdbf7202bd61e14029b879dcd806054f14e28c8b4031a0b7d6acb74cf +size 51646 diff --git a/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_ToolsLayout()_-_Personalization_-_Localization_Settings_Box[Pixel_6_Pro,locale=null,NOTNIGHT,NO_ACCESSIBILITY].png b/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_ToolsLayout()_-_Personalization_-_Localization_Settings_Box[Pixel_6_Pro,locale=null,NOTNIGHT,NO_ACCESSIBILITY].png index 943d5b9cf3..1a2a078167 100644 --- a/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_ToolsLayout()_-_Personalization_-_Localization_Settings_Box[Pixel_6_Pro,locale=null,NOTNIGHT,NO_ACCESSIBILITY].png +++ b/app/src/test/snapshots/images/org.cru.godtools.ui.dashboard_DashboardLayoutPaparazziTest_ToolsLayout()_-_Personalization_-_Localization_Settings_Box[Pixel_6_Pro,locale=null,NOTNIGHT,NO_ACCESSIBILITY].png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:581d1ee0bd2c7f5170fd8252e06c4bd3421199fe952e53cab7fb0063d958fd8e -size 50638 +oid sha256:c27c28af55a1caa04349fd632e200fffbb4c9f0a3fc1763fc9217301e85c5573 +size 50577 From ee5daf1125cdb67f1dc032a67904f7f78574b459 Mon Sep 17 00:00:00 2001 From: Tim Johnson Date: Tue, 12 May 2026 15:52:54 -0400 Subject: [PATCH 20/22] Retrigger CI From 13f52e6fdfcdab8609e6786e188549c91fc469dd Mon Sep 17 00:00:00 2001 From: Tim Johnson Date: Fri, 15 May 2026 16:41:46 -0400 Subject: [PATCH 21/22] Bring in rememberPinLastArrangement composable to both tools and lessons --- .../ui/dashboard/lessons/LessonsLayout.kt | 24 +++++++------------ .../ui/dashboard/tools/ToolsLayout.kt | 24 ++++++------------- 2 files changed, 15 insertions(+), 33 deletions(-) diff --git a/app/src/main/kotlin/org/cru/godtools/ui/dashboard/lessons/LessonsLayout.kt b/app/src/main/kotlin/org/cru/godtools/ui/dashboard/lessons/LessonsLayout.kt index 3c66f456a4..c760769989 100644 --- a/app/src/main/kotlin/org/cru/godtools/ui/dashboard/lessons/LessonsLayout.kt +++ b/app/src/main/kotlin/org/cru/godtools/ui/dashboard/lessons/LessonsLayout.kt @@ -21,7 +21,6 @@ import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource -import androidx.compose.ui.unit.Density import androidx.compose.ui.unit.dp import com.slack.circuit.codegen.annotations.CircuitInject import dagger.hilt.components.SingletonComponent @@ -31,6 +30,7 @@ import org.cru.godtools.base.ui.circuit.screen.dashboard.page.LessonsScreen import org.cru.godtools.ui.dashboard.LocalizationSettingsBox import org.cru.godtools.ui.dashboard.lessons.LessonsPresenter.UiEvent import org.cru.godtools.ui.dashboard.lessons.LessonsPresenter.UiState +import org.cru.godtools.ui.dashboard.rememberPinLastItemBottomArrangement import org.cru.godtools.ui.tools.LessonToolCard internal val MARGIN_LESSONS_LAYOUT_HORIZONTAL = 16.dp @@ -38,22 +38,14 @@ internal val MARGIN_LESSONS_LAYOUT_HORIZONTAL = 16.dp @Composable @CircuitInject(LessonsScreen::class, SingletonComponent::class) internal fun LessonsLayout(state: UiState, modifier: Modifier = Modifier) { + val verticalArrangement = if (state.mode == UiState.Mode.PERSONALIZATION) { + rememberPinLastItemBottomArrangement(state.lessons.size) + } else { + Arrangement.Top + } + LazyColumn( - verticalArrangement = remember { - object : Arrangement.Vertical { - override fun Density.arrange(totalSize: Int, sizes: IntArray, outPositions: IntArray) { - var currentOffset = 0 - sizes.forEachIndexed { index, size -> - if (index == sizes.lastIndex) { - outPositions[index] = maxOf(currentOffset, totalSize - size) - } else { - outPositions[index] = currentOffset - currentOffset += size - } - } - } - } - }, + verticalArrangement = remember { verticalArrangement }, modifier = modifier.fillMaxHeight() ) { if (state.isPersonalizationEnabled) { diff --git a/app/src/main/kotlin/org/cru/godtools/ui/dashboard/tools/ToolsLayout.kt b/app/src/main/kotlin/org/cru/godtools/ui/dashboard/tools/ToolsLayout.kt index 31caa866c3..45878dd718 100644 --- a/app/src/main/kotlin/org/cru/godtools/ui/dashboard/tools/ToolsLayout.kt +++ b/app/src/main/kotlin/org/cru/godtools/ui/dashboard/tools/ToolsLayout.kt @@ -20,12 +20,10 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue -import androidx.compose.runtime.remember import androidx.compose.runtime.rememberUpdatedState import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource -import androidx.compose.ui.unit.Density import androidx.compose.ui.unit.dp import com.slack.circuit.codegen.annotations.CircuitInject import dagger.hilt.components.SingletonComponent @@ -34,6 +32,7 @@ import org.cru.godtools.R import org.cru.godtools.base.ui.circuit.screen.dashboard.page.ToolsScreen import org.cru.godtools.ui.banner.Banners import org.cru.godtools.ui.dashboard.LocalizationSettingsBox +import org.cru.godtools.ui.dashboard.rememberPinLastItemBottomArrangement import org.cru.godtools.ui.dashboard.tools.ToolsPresenter.UiEvent import org.cru.godtools.ui.dashboard.tools.ToolsPresenter.UiState import org.cru.godtools.ui.tools.SquareToolCard @@ -50,24 +49,15 @@ internal fun ToolsLayout(state: UiState, modifier: Modifier = Modifier) { val columnState = rememberLazyListState() LaunchedEffect(state.banner?.type) { if (state.banner != null) columnState.animateScrollToItem(0) } + val verticalArrangement = if (state.mode == UiState.Mode.PERSONALIZATION) { + rememberPinLastItemBottomArrangement(state.tools.size) + } else { + Arrangement.Top + } LazyColumn( state = columnState, - verticalArrangement = remember { - object : Arrangement.Vertical { - override fun Density.arrange(totalSize: Int, sizes: IntArray, outPositions: IntArray) { - var currentOffset = 0 - sizes.forEachIndexed { index, size -> - if (index == sizes.lastIndex) { - outPositions[index] = maxOf(currentOffset, totalSize - size) - } else { - outPositions[index] = currentOffset - currentOffset += size - } - } - } - } - }, + verticalArrangement = verticalArrangement, modifier = modifier.fillMaxHeight() ) { if (!state.dataLoaded) return@LazyColumn From 3843f36a4340c1a2b463c650abfa5d6fb2cf6138 Mon Sep 17 00:00:00 2001 From: Tim Johnson Date: Fri, 15 May 2026 16:42:40 -0400 Subject: [PATCH 22/22] Create rememberPinLastItemBottomArrangement composable for reuse in tools and lessons --- .../dashboard/PinLastItemBottomArrangement.kt | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 app/src/main/kotlin/org/cru/godtools/ui/dashboard/PinLastItemBottomArrangement.kt diff --git a/app/src/main/kotlin/org/cru/godtools/ui/dashboard/PinLastItemBottomArrangement.kt b/app/src/main/kotlin/org/cru/godtools/ui/dashboard/PinLastItemBottomArrangement.kt new file mode 100644 index 0000000000..6ced6818e1 --- /dev/null +++ b/app/src/main/kotlin/org/cru/godtools/ui/dashboard/PinLastItemBottomArrangement.kt @@ -0,0 +1,23 @@ +package org.cru.godtools.ui.dashboard + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.unit.Density + +@Composable +internal fun rememberPinLastItemBottomArrangement(items: Int): Arrangement.Vertical = remember(items) { + object : Arrangement.Vertical { + override fun Density.arrange(totalSize: Int, sizes: IntArray, outPositions: IntArray) { + var currentOffset = 0 + sizes.forEachIndexed { index, size -> + if (index == sizes.lastIndex) { + outPositions[index] = maxOf(currentOffset, totalSize - size) + } else { + outPositions[index] = currentOffset + currentOffset += size + } + } + } + } +}