Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 14 additions & 4 deletions .claude/skills/record-screenshots/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -97,16 +97,26 @@ If there are multiple candidates at any step, show them and ask the user which c

### 7. Apply the snapshot changes locally

Stage the snapshot files from the remote commit:
The CI commit may add new snapshots, delete old ones (e.g. when a package was renamed), or both. Handle all cases:

```bash
# Get the list of files changed by the screenshot commit
# Get the full diff between local HEAD and the remote screenshot commit
git diff --name-only HEAD origin/<branch>
git diff --name-status HEAD origin/<branch>
```

For files marked **A** (added) or **M** (modified) — stage them at the remote version:
```bash
git checkout origin/<branch> -- <file> [<file> ...]
```

# Stage those files at the remote version
git checkout origin/<branch> -- $(git diff --name-only HEAD origin/<branch>)
For files marked **D** (deleted) — remove them:
```bash
git rm <file> [<file> ...]
```

Do not use a single `git checkout origin/<branch> -- $(git diff --name-only ...)` shortcut, as it cannot handle deletions (checking out a deleted file would re-create it instead of removing it).

### 8. Create a fixup commit

```bash
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.cru.godtools.ui.languages
package org.cru.godtools.ui.common

import androidx.compose.foundation.layout.Column
import androidx.compose.material3.HorizontalDivider
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.cru.godtools.ui.languages
package org.cru.godtools.ui.common

import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.cru.godtools.ui.languages
package org.cru.godtools.ui.common

import androidx.compose.foundation.text.InlineTextContent
import androidx.compose.foundation.text.appendInlineContent
Expand All @@ -17,7 +17,7 @@ import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.text.withStyle
import androidx.compose.ui.unit.sp

private const val LANGUAGE_NAME_GAP = "[gap]"
private const val NAME_GAP = "[gap]"

@Composable
internal fun LocalizedName(name: String, secondName: String, modifier: Modifier = Modifier) {
Expand All @@ -28,15 +28,15 @@ internal fun LocalizedName(name: String, secondName: String, modifier: Modifier
remember(name, secondName, color, secondNameColor) {
buildAnnotatedString {
withStyle(SpanStyle(color = color)) { append(name) }
appendInlineContent(LANGUAGE_NAME_GAP, " ")
appendInlineContent(NAME_GAP, " ")
withStyle(SpanStyle(color = secondNameColor)) { append(secondName) }
}
},
maxLines = 1,
overflow = TextOverflow.Ellipsis,
inlineContent = remember {
mapOf(
LANGUAGE_NAME_GAP to InlineTextContent(
NAME_GAP to InlineTextContent(
Placeholder(
width = 8.sp,
height = 1.sp,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import org.cru.godtools.R
import org.cru.godtools.base.LocalAppLanguage
import org.cru.godtools.ui.common.LanguageName
import org.cru.godtools.ui.dashboard.filters.LazyFilterMenu
import org.cru.godtools.ui.languages.LanguageName

@Composable
@OptIn(ExperimentalLayoutApi::class)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,11 @@ import org.cru.godtools.R
import org.cru.godtools.base.LocalAppLanguage
import org.cru.godtools.base.ui.util.getToolCategoryName
import org.cru.godtools.model.Language
import org.cru.godtools.ui.common.LanguageName
import org.cru.godtools.ui.dashboard.filters.FilterMenu
import org.cru.godtools.ui.dashboard.filters.FilterMenuItem
import org.cru.godtools.ui.dashboard.filters.LazyFilterMenu
import org.cru.godtools.ui.dashboard.tools.ToolFiltersStateProducer.Filters
import org.cru.godtools.ui.languages.LanguageName
import org.jetbrains.annotations.VisibleForTesting

private val DROPDOWN_MAX_HEIGHT = 700.dp
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,9 +68,9 @@ import org.cru.godtools.ui.account.delete.DeleteAccountScreen
import org.cru.godtools.ui.account.startAccountActivity
import org.cru.godtools.ui.drawer.DrawerMenuScreen.Event
import org.cru.godtools.ui.drawer.DrawerMenuScreen.State
import org.cru.godtools.ui.languages.LanguageSettingsScreen
import org.cru.godtools.ui.languages.country.CountrySettingsScreen
import org.cru.godtools.ui.login.startLoginActivity
import org.cru.godtools.ui.settings.country.CountrySettingsScreen
import org.cru.godtools.ui.settings.language.LanguageSettingsScreen

@Composable
fun DrawerMenuLayout(
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.cru.godtools.ui.languages.country
package org.cru.godtools.ui.settings.country

import androidx.compose.material3.AlertDialog
import androidx.compose.material3.ExperimentalMaterial3Api
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.cru.godtools.ui.languages.country
package org.cru.godtools.ui.settings.country

import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
Expand Down Expand Up @@ -44,9 +44,9 @@ import kotlinx.coroutines.launch
import org.ccci.gto.android.common.compose.foundation.layout.padding
import org.cru.godtools.R
import org.cru.godtools.base.ui.theme.GodToolsTheme
import org.cru.godtools.ui.languages.LocalizedName
import org.cru.godtools.ui.languages.country.CountrySettingsPresenter.UiEvent
import org.cru.godtools.ui.languages.country.CountrySettingsPresenter.UiState
import org.cru.godtools.ui.common.LocalizedName
import org.cru.godtools.ui.settings.country.CountrySettingsPresenter.UiEvent
import org.cru.godtools.ui.settings.country.CountrySettingsPresenter.UiState

internal const val TEST_TAG_ACTION_BACK = "action_navigate_back"
internal const val TEST_TAG_CANCEL_SEARCH = "action_cancel_search"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.cru.godtools.ui.languages.country
package org.cru.godtools.ui.settings.country

import android.content.Context
import android.icu.text.LocaleDisplayNames
Expand All @@ -23,15 +23,13 @@ import dagger.assisted.AssistedInject
import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.components.SingletonComponent
import java.util.Locale
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.persistentListOf
import kotlinx.collections.immutable.toImmutableList
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.cru.godtools.base.Settings
import org.cru.godtools.base.util.getPrimaryCollator
import org.cru.godtools.ui.languages.country.CountrySettingsPresenter.UiState
import org.cru.godtools.ui.settings.country.CountrySettingsPresenter.UiState

class CountrySettingsPresenter @AssistedInject constructor(
@param:ApplicationContext private val context: Context,
Expand All @@ -40,7 +38,7 @@ class CountrySettingsPresenter @AssistedInject constructor(
) : Presenter<UiState> {
// what the screen needs to know
data class UiState(
val countries: List<CountryItem> = persistentListOf(),
val countries: List<CountryItem> = emptyList(),
val query: MutableState<String> = mutableStateOf(""),
val countryCode: String? = null,
val eventSink: (UiEvent) -> Unit = {},
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.cru.godtools.ui.languages.country
package org.cru.godtools.ui.settings.country

import com.slack.circuit.runtime.screen.Screen
import kotlinx.parcelize.Parcelize
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.cru.godtools.ui.languages
package org.cru.godtools.ui.settings.language

import android.net.Uri
import org.cru.godtools.BuildConfig.HOST_GODTOOLS_CUSTOM_URI
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.cru.godtools.ui.languages
package org.cru.godtools.ui.settings.language

import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.layout.fillMaxHeight
Expand Down Expand Up @@ -43,8 +43,9 @@ import org.cru.godtools.analytics.compose.RecordAnalyticsScreen
import org.cru.godtools.analytics.model.AnalyticsScreenEvent
import org.cru.godtools.base.ui.theme.GodToolsTheme
import org.cru.godtools.shared.analytics.AnalyticsScreenNames
import org.cru.godtools.ui.languages.LanguageSettingsPresenter.UiEvent
import org.cru.godtools.ui.languages.LanguageSettingsPresenter.UiState
import org.cru.godtools.ui.common.LanguageName
import org.cru.godtools.ui.settings.language.LanguageSettingsPresenter.UiEvent
import org.cru.godtools.ui.settings.language.LanguageSettingsPresenter.UiState

internal const val TEST_TAG_ACTION_BACK = "action_navigate_back"

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.cru.godtools.ui.languages
package org.cru.godtools.ui.settings.language

import dagger.Module
import dagger.Provides
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.cru.godtools.ui.languages
package org.cru.godtools.ui.settings.language

import android.content.Context
import androidx.compose.runtime.Composable
Expand All @@ -16,18 +16,15 @@ import dagger.assisted.AssistedInject
import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.components.SingletonComponent
import java.util.Locale
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.persistentListOf
import kotlinx.collections.immutable.toImmutableList
import kotlinx.coroutines.flow.combine
import org.ccci.gto.android.common.androidx.core.app.LocaleConfigCompat
import org.ccci.gto.android.common.androidx.core.os.asIterable
import org.cru.godtools.base.Settings
import org.cru.godtools.base.ui.circuit.screen.AppLanguageScreen
import org.cru.godtools.db.repository.LanguagesRepository
import org.cru.godtools.model.Language
import org.cru.godtools.ui.languages.LanguageSettingsPresenter.UiState
import org.cru.godtools.ui.languages.downloadable.DownloadableLanguagesScreen
import org.cru.godtools.ui.settings.language.LanguageSettingsPresenter.UiState
import org.cru.godtools.ui.settings.language.downloadable.DownloadableLanguagesScreen

class LanguageSettingsPresenter @AssistedInject constructor(
@param:ApplicationContext
Expand All @@ -39,11 +36,11 @@ class LanguageSettingsPresenter @AssistedInject constructor(
data class UiState(
val appLanguage: Locale,
val appLanguages: Int = 0,
val downloadedLanguages: ImmutableList<Language> = persistentListOf(),
val downloadedLanguages: List<Language> = emptyList(),
val eventSink: (UiEvent) -> Unit = {},
) : CircuitUiState

interface UiEvent : CircuitUiEvent {
sealed interface UiEvent : CircuitUiEvent {
data object NavigateUp : UiEvent
data object AppLanguage : UiEvent
data object DownloadableLanguages : UiEvent
Expand Down Expand Up @@ -75,9 +72,8 @@ class LanguageSettingsPresenter @AssistedInject constructor(
private fun produceDownloadedLanguagesState() = remember {
combine(languagesRepository.getPinnedLanguagesFlow(), settings.appLanguageFlow) { pinned, app ->
pinned.sortedWith(Language.displayNameComparator(context, app))
.toImmutableList()
}
}.collectAsState(persistentListOf())
}.collectAsState(emptyList())

@AssistedFactory
@CircuitInject(LanguageSettingsScreen::class, SingletonComponent::class)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.cru.godtools.ui.languages
package org.cru.godtools.ui.settings.language

import com.slack.circuit.runtime.screen.Screen
import kotlinx.parcelize.Parcelize
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.cru.godtools.ui.languages.app
package org.cru.godtools.ui.settings.language.app

import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
Expand Down Expand Up @@ -50,9 +50,9 @@ import org.ccci.gto.android.common.util.content.localize
import org.cru.godtools.R
import org.cru.godtools.base.ui.circuit.screen.AppLanguageScreen
import org.cru.godtools.base.ui.theme.GodToolsTheme
import org.cru.godtools.ui.languages.LanguageName
import org.cru.godtools.ui.languages.app.AppLanguagePresenter.UiEvent
import org.cru.godtools.ui.languages.app.AppLanguagePresenter.UiState
import org.cru.godtools.ui.common.LanguageName
import org.cru.godtools.ui.settings.language.app.AppLanguagePresenter.UiEvent
import org.cru.godtools.ui.settings.language.app.AppLanguagePresenter.UiState

internal const val TEST_TAG_ACTION_BACK = "action_navigate_back"
internal const val TEST_TAG_CANCEL_SEARCH = "action_cancel_search"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.cru.godtools.ui.languages.app
package org.cru.godtools.ui.settings.language.app

import android.content.Context
import androidx.compose.runtime.Composable
Expand All @@ -19,17 +19,14 @@ import dagger.assisted.AssistedInject
import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.components.SingletonComponent
import java.util.Locale
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.persistentListOf
import kotlinx.collections.immutable.toImmutableList
import org.ccci.gto.android.common.androidx.core.app.LocaleConfigCompat
import org.ccci.gto.android.common.androidx.core.os.asIterable
import org.cru.godtools.base.Settings
import org.cru.godtools.base.ui.circuit.screen.AppLanguageScreen
import org.cru.godtools.base.util.filterByDisplayAndNativeName
import org.cru.godtools.base.util.getDisplayName
import org.cru.godtools.base.util.getPrimaryCollator
import org.cru.godtools.ui.languages.app.AppLanguagePresenter.UiState
import org.cru.godtools.ui.settings.language.app.AppLanguagePresenter.UiState

class AppLanguagePresenter @AssistedInject constructor(
@param:ApplicationContext
Expand All @@ -38,7 +35,7 @@ class AppLanguagePresenter @AssistedInject constructor(
@Assisted private val navigator: Navigator,
) : Presenter<UiState> {
data class UiState(
val languages: ImmutableList<Locale> = persistentListOf(),
val languages: List<Locale> = emptyList(),
val languageQuery: MutableState<String> = mutableStateOf(""),
val selectedLanguage: Locale? = null,
val eventSink: (UiEvent) -> Unit = {}
Expand Down Expand Up @@ -90,7 +87,7 @@ class AppLanguagePresenter @AssistedInject constructor(
}

@Composable
private fun rememberLanguages(appLanguage: Locale, query: String): ImmutableList<Locale> {
private fun rememberLanguages(appLanguage: Locale, query: String): List<Locale> {
val languages = remember { LocaleConfigCompat.getSupportedLocales(context)?.asIterable() ?: emptyList() }
val sortedLanguages = remember(appLanguage) {
languages.sortedWith(
Expand All @@ -99,9 +96,7 @@ class AppLanguagePresenter @AssistedInject constructor(
}

return remember(sortedLanguages, appLanguage, query) {
sortedLanguages
.filterByDisplayAndNativeName(query, context, inLocale = appLanguage)
.toImmutableList()
sortedLanguages.filterByDisplayAndNativeName(query, context, inLocale = appLanguage)
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.cru.godtools.ui.languages.downloadable
package org.cru.godtools.ui.settings.language.downloadable

import androidx.activity.compose.BackHandler
import androidx.compose.foundation.clickable
Expand Down Expand Up @@ -44,10 +44,10 @@ import kotlinx.coroutines.launch
import org.ccci.gto.android.common.compose.foundation.layout.padding
import org.cru.godtools.R
import org.cru.godtools.base.ui.theme.GodToolsTheme
import org.cru.godtools.ui.languages.LanguageName
import org.cru.godtools.ui.languages.downloadable.DownloadableLanguagesScreen.UiState
import org.cru.godtools.ui.languages.downloadable.DownloadableLanguagesScreen.UiState.UiEvent
import org.cru.godtools.ui.languages.downloadable.DownloadableLanguagesScreen.UiState.UiLanguage
import org.cru.godtools.ui.common.LanguageName
import org.cru.godtools.ui.settings.language.downloadable.DownloadableLanguagesScreen.UiState
import org.cru.godtools.ui.settings.language.downloadable.DownloadableLanguagesScreen.UiState.UiEvent
import org.cru.godtools.ui.settings.language.downloadable.DownloadableLanguagesScreen.UiState.UiLanguage

internal const val TEST_TAG_NAVIGATE_UP = "navigateUp"
internal const val TEST_TAG_CANCEL_SEARCH = "cancelSearch"
Expand Down
Loading