update providers_config.json models and refactor IntroFlow.kt UI

This commit is contained in:
jonasgaudian
2026-02-15 20:53:21 +01:00
parent f4fcffe90a
commit 7d18f8eb04
4 changed files with 103 additions and 106 deletions

View File

@@ -58,17 +58,17 @@
"websiteUrl": "https://platform.openai.com/",
"isCustom": false,
"models": [
{
"modelId": "gpt-5.2",
"displayName": "GPT-5.2",
"provider": "openai",
"description": "Balanced performance with enhanced reasoning and creativity."
},
{
"modelId": "gpt-5.1-instant",
"displayName": "GPT-5.1 Instant",
"provider": "openai",
"description": "The standard high-speed efficiency model replacing older 'Nano' tiers."
},
{
"modelId": "gpt-5-nano",
"displayName": "GPT-5 Nano",
"provider": "openai",
"description": "Fast and cheap model sufficient for most tasks."
}
]
},
@@ -120,15 +120,15 @@
"key": "gemini",
"displayName": "Google Gemini",
"baseUrl": "https://generativelanguage.googleapis.com/",
"endpoint": "v1beta/models/gemini-3-flash-preview:generateContent",
"endpoint": "v1beta/models/gemini-2.5-pro:generateContent",
"websiteUrl": "https://ai.google/",
"isCustom": false,
"models": [
{
"modelId": "gemini-3-flash-preview",
"displayName": "Gemini 3 Flash",
"modelId": "gemini-2.5-pro",
"displayName": "Gemini 2.5 Pro",
"provider": "gemini",
"description": "Current default: Massive context, grounded, and extremely fast."
"description": "Stable release: State-of-the-art reasoning with 1M context."
},
{
"modelId": "gemini-3-pro-preview",
@@ -155,12 +155,6 @@
"websiteUrl": "https://groq.com/",
"isCustom": false,
"models": [
{
"modelId": "llama-4-scout-17b",
"displayName": "Llama 4 Scout",
"provider": "groq",
"description": "Powerful Llama 4 model running at extreme speed."
},
{
"modelId": "meta-llama/llama-4-maverick",
"displayName": "Llama 4 Maverick",
@@ -216,10 +210,10 @@
"description": "World's fastest inference (2000+ tokens/sec) on Wafer-Scale Engines."
},
{
"modelId": "llama3.1-8b",
"displayName": "Llama 3.1 8B",
"modelId": "llama-4-scout",
"displayName": "Llama 4 Scout",
"provider": "cerebras",
"description": "Instant speed for simple tasks."
"description": "High-quality 17B active param model running at 2,600 tokens/sec."
}
]
},
@@ -238,10 +232,10 @@
"description": "Hosted via the Hugging Face serverless router (Free tier limits apply)."
},
{
"modelId": "microsoft/Phi-3.5-mini-instruct",
"displayName": "Phi 3.5 Mini",
"modelId": "Qwen/Qwen2.5-72B-Instruct",
"displayName": "Qwen 2.5 72B",
"provider": "huggingface",
"description": "Highly capable small model from Microsoft."
"description": "High-quality open model with excellent reasoning and multilingual capabilities."
}
]
}

View File

@@ -5,11 +5,9 @@ import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.ExperimentalLayoutApi
import androidx.compose.foundation.layout.FlowRow
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
@@ -42,82 +40,89 @@ import eu.gaudian.translator.view.composable.AppIcons
import eu.gaudian.translator.view.composable.PrimaryButton
import kotlinx.coroutines.launch
@OptIn(ExperimentalLayoutApi::class)
@Composable
fun IntroNavHost(onIntroFinished: () -> Unit) {
val pages = listOf(
IntroPageData(
title = stringResource(R.string.intro_title_welcome),
description = stringResource(R.string.intro_desc_welcome),
content = { IconContent(iconRes = R.drawable.ic_intro_welcome) }
),
IntroPageData(
title = stringResource(R.string.intro_title_ai_assistant),
description = stringResource(R.string.intro_desc_ai_assistant),
content = {
Column(horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.spacedBy(4.dp)) {
IconContent(iconRes = R.drawable.ic_intro_ai_agents)
FlowRow(horizontalArrangement = Arrangement.spacedBy(4.dp, Alignment.CenterHorizontally), verticalArrangement = Arrangement.spacedBy(2.dp), modifier = Modifier.fillMaxWidth()) {
SuggestionChip(onClick = { }, label = { Text(stringResource(R.string.text_mistral)) })
SuggestionChip(onClick = { }, label = { Text(stringResource(R.string.text_your_own_ai)) })
SuggestionChip(onClick = { }, label = { Text(stringResource(R.string.text_openai)) })
SuggestionChip(onClick = { }, label = { Text(stringResource(R.string.text_claude)) })
SuggestionChip(onClick = { }, label = { Text(stringResource(R.string.text_gemini)) })
SuggestionChip(onClick = { }, label = { Text(stringResource(R.string.text_deepseek)) })
SuggestionChip(onClick = { }, label = { Text(stringResource(R.string.text_openrouter)) })
SuggestionChip(onClick = { }, label = { Text(stringResource(R.string.text_and_many_more)) })
IntroPageData(
title = stringResource(R.string.intro_title_welcome),
description = stringResource(R.string.intro_desc_welcome),
content = { IconContent(iconRes = R.drawable.ic_intro_welcome) }
),
IntroPageData(
title = stringResource(R.string.intro_title_ai_assistant),
description = stringResource(R.string.intro_desc_ai_assistant),
content = {
Column(
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.spacedBy(4.dp)
) {
IconContent(iconRes = R.drawable.ic_intro_ai_agents)
FlowRow(
horizontalArrangement = Arrangement.spacedBy(4.dp, Alignment.CenterHorizontally),
verticalArrangement = Arrangement.spacedBy(2.dp),
modifier = Modifier.fillMaxWidth()
) {
SuggestionChip(onClick = { }, label = { Text(stringResource(R.string.text_mistral)) })
SuggestionChip(onClick = { }, label = { Text(stringResource(R.string.text_your_own_ai)) })
SuggestionChip(onClick = { }, label = { Text(stringResource(R.string.text_openai)) })
SuggestionChip(onClick = { }, label = { Text(stringResource(R.string.text_claude)) })
SuggestionChip(onClick = { }, label = { Text(stringResource(R.string.text_gemini)) })
SuggestionChip(onClick = { }, label = { Text(stringResource(R.string.text_deepseek)) })
SuggestionChip(onClick = { }, label = { Text(stringResource(R.string.text_openrouter)) })
SuggestionChip(onClick = { }, label = { Text(stringResource(R.string.text_and_many_more)) })
}
}
}
),
IntroPageData(
title = stringResource(R.string.intro_title_dictionary_translator),
description = stringResource(R.string.intro_desc_dictionary_translator),
content = { IconContent(iconRes = R.drawable.ic_intro_lookup) }
}
),
IntroPageData(
title = stringResource(R.string.intro_title_dictionary_translator),
description = stringResource(R.string.intro_desc_dictionary_translator),
content = { IconContent(iconRes = R.drawable.ic_intro_lookup) }
),
IntroPageData(
title = stringResource(R.string.intro_title_flashcards),
description = stringResource(R.string.intro_desc_flashcards),
content = { FlashcardTopicsPreview() }
),
IntroPageData(
title = stringResource(R.string.intro_title_practice),
description = stringResource(R.string.intro_desc_practice),
content = { IconContent(iconRes = R.drawable.ic_inro_practice) }
),
IntroPageData(
title = stringResource(R.string.intro_title_learning_journey),
description = stringResource(R.string.intro_desc_learning_journey),
content = { IconContent(iconRes = R.drawable.ic_intro_learning_journey)}
),
IntroPageData(
title = stringResource(R.string.intro_title_categories),
description = stringResource(R.string.intro_desc_categories),
content = { IconContent(iconRes = R.drawable.ic_intro_categories) }
),
IntroPageData(
title = stringResource(R.string.intro_title_progress),
description = stringResource(R.string.intro_desc_progress),
content = { IconContent(iconRes = R.drawable.ic_intro_track_progress) }
),
IntroPageData(
),
IntroPageData(
title = stringResource(R.string.intro_title_flashcards),
description = stringResource(R.string.intro_desc_flashcards),
content = { FlashcardTopicsPreview() }
),
IntroPageData(
title = stringResource(R.string.intro_title_practice),
description = stringResource(R.string.intro_desc_practice),
content = { IconContent(iconRes = R.drawable.ic_inro_practice) }
),
IntroPageData(
title = stringResource(R.string.intro_title_learning_journey),
description = stringResource(R.string.intro_desc_learning_journey),
content = { IconContent(iconRes = R.drawable.ic_intro_learning_journey) }
),
IntroPageData(
title = stringResource(R.string.intro_title_categories),
description = stringResource(R.string.intro_desc_categories),
content = { IconContent(iconRes = R.drawable.ic_intro_categories) }
),
IntroPageData(
title = stringResource(R.string.intro_title_progress),
description = stringResource(R.string.intro_desc_progress),
content = { IconContent(iconRes = R.drawable.ic_intro_track_progress) }
),
IntroPageData(
title = stringResource(R.string.intro_need_help),
description = stringResource(R.string.intro_if_you_need_help_you),
content = { IconContent(iconRes = R.drawable.ic_intro_help) }
),
IntroPageData(
title = stringResource(R.string.intro_title_beta),
description = stringResource(R.string.intro_desc_beta),
content = { IconContent(iconRes = R.drawable.ic_icon_construction) }
),
IntroPageData(
title = stringResource(R.string.intro_title_all_set),
description = stringResource(R.string.intro_desc_all_set),
content = { IconContent(iconRes = R.drawable.ic_intro_robot) }
)
),
IntroPageData(
title = stringResource(R.string.intro_title_beta),
description = stringResource(R.string.intro_desc_beta),
content = { IconContent(iconRes = R.drawable.ic_icon_construction) }
),
IntroPageData(
title = stringResource(R.string.intro_title_all_set),
description = stringResource(R.string.intro_desc_all_set),
content = { IconContent(iconRes = R.drawable.ic_intro_robot) }
)
)
val pagerState = rememberPagerState(pageCount = { pages.size })
val scope = rememberCoroutineScope()
@@ -128,7 +133,6 @@ fun IntroNavHost(onIntroFinished: () -> Unit) {
.statusBarsPadding()
.padding(horizontal = 16.dp, vertical = 8.dp)
) {
// Full-width Skip intro button aligned to end but sized like primary (fillMaxWidth)
eu.gaudian.translator.view.composable.SecondaryButton(
onClick = { onIntroFinished() },
text = stringResource(R.string.intro_skip),
@@ -145,7 +149,9 @@ fun IntroNavHost(onIntroFinished: () -> Unit) {
) {
HorizontalPager(
state = pagerState,
modifier = Modifier.weight(1f)
modifier = Modifier
.fillMaxWidth()
.weight(1f)
) { pageIndex ->
IntroPage(pageData = pages[pageIndex])
}
@@ -170,7 +176,7 @@ fun IntroNavHost(onIntroFinished: () -> Unit) {
}
},
text = if (pagerState.currentPage < pages.size - 1) stringResource(R.string.next) else stringResource(R.string.get_started),
icon = if (pagerState.currentPage < pages.size - 1)AppIcons.ArrowForwardNoChevron else null,
icon = if (pagerState.currentPage < pages.size - 1) AppIcons.ArrowForwardNoChevron else null,
modifier = Modifier.fillMaxWidth()
)
}
@@ -189,9 +195,9 @@ private fun IntroPage(pageData: IntroPageData) {
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.spacedBy(24.dp, Alignment.CenterVertically),
modifier = Modifier
.fillMaxHeight()
.fillMaxSize() // Fixed: This was previously fillMaxHeight()
.padding(horizontal = 16.dp)
.verticalScroll(rememberScrollState()) // Allow scrolling for larger hint content
.verticalScroll(rememberScrollState())
) {
Column(horizontalAlignment = Alignment.CenterHorizontally) {
Text(
@@ -234,15 +240,14 @@ private fun PagerIndicator(pageCount: Int, currentPage: Int) {
@Composable
private fun IconContent(iconRes: Int) {
Box(modifier = Modifier.clip(RoundedCornerShape(16.dp))) {
Icon(
painter = painterResource(id = iconRes),
contentDescription = null,
tint = Color.Unspecified,
modifier = Modifier.size(250.dp)
)
Icon(
painter = painterResource(id = iconRes),
contentDescription = null,
tint = Color.Unspecified,
modifier = Modifier.size(250.dp)
)
}
}
}
@Composable
private fun FlashcardTopicsPreview() {

View File

@@ -6,7 +6,6 @@ import androidx.compose.foundation.BorderStroke
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.ExperimentalLayoutApi
import androidx.compose.foundation.layout.FlowRow
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
@@ -391,7 +390,6 @@ private fun ExerciseTypeSelector(
onTypeSelected: (VocabularyExerciseType) -> Unit,
) {
// Using FlowRow for a more flexible layout that wraps to the next line if needed
@OptIn(ExperimentalLayoutApi::class)
FlowRow(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.spacedBy(12.dp, Alignment.CenterHorizontally),