Skip to content

Compose language list design #5375

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 37 commits into from
Apr 14, 2025
Merged
Show file tree
Hide file tree
Changes from 15 commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
7db688c
- adds Compose LanguagesListActivity
Williamrai Feb 28, 2025
b76506c
- Adds SearchTopAppBar
Williamrai Feb 28, 2025
cf0d8fd
- adds SearchEmptyView
Williamrai Feb 28, 2025
b5ef9d0
Merge branch 'main' into compose-language-list
Williamrai Feb 28, 2025
f03bde3
Merge branch 'main' into compose-language-list
Williamrai Mar 3, 2025
b47f857
- adds WikiTopAppBarWithSearch which is similar to the top app bar wi…
Williamrai Mar 3, 2025
102f67e
Merge branch 'main' into compose-language-list
Williamrai Mar 4, 2025
e045cf5
- code fixes
Williamrai Mar 4, 2025
5c49ed8
- removal of LanguagesListActivity.kt and its related codes
Williamrai Mar 4, 2025
5046f8f
- adds actions to SearchTopAppBar
Williamrai Mar 4, 2025
9320595
- fixes theme issue
Williamrai Mar 4, 2025
916de24
Merge branch 'main' into compose-language-list
Williamrai Mar 4, 2025
bde7cb5
Merge branch 'main' into compose-language-list-design
Williamrai Mar 5, 2025
630c1c0
Merge branch 'main' into compose-language-list-design
Williamrai Mar 7, 2025
a9f41ff
Merge branch 'main' into compose-language-list-design
cooltey Mar 13, 2025
d7e5527
Merge branch 'main' into compose-language-list-design
Williamrai Mar 14, 2025
90661b5
- code fixes
Williamrai Mar 14, 2025
1bfbe1f
Merge remote-tracking branch 'origin/compose-language-list-design' in…
Williamrai Mar 14, 2025
7ee4da1
- removed crash.txt
Williamrai Mar 14, 2025
471cc38
Merge branch 'main' into compose-language-list-design
Williamrai Mar 17, 2025
2f28f05
Merge branch 'main' into compose-language-list-design
cooltey Mar 18, 2025
a389773
Merge branch 'main' into compose-language-list-design
Williamrai Mar 19, 2025
ec44c07
Merge branch 'main' into compose-language-list-design
Williamrai Mar 20, 2025
d2b95a3
Merge branch 'main' into compose-language-list-design
Williamrai Mar 21, 2025
a9e0d0c
- adds wikiErrorView and consolidate data loading into one function
Williamrai Mar 21, 2025
c7ae0b4
Merge branch 'main' into compose-language-list-design
Williamrai Mar 26, 2025
80bed68
Compose Language List experimentation (#5446)
Williamrai Apr 1, 2025
46751bf
Merge branch 'main' into compose-language-list-design
Williamrai Apr 2, 2025
2424f00
- creates a generic sealed interface for compose ui state
Williamrai Apr 2, 2025
89df9e7
Merge branch 'main' into compose-language-list-design
cooltey Apr 3, 2025
7d8097f
Merge branch 'main' into compose-language-list-design
cooltey Apr 3, 2025
cedb342
Merge branch 'main' into compose-language-list-design
cooltey Apr 4, 2025
91a67e5
Merge branch 'main' into compose-language-list-design
cooltey Apr 10, 2025
d536bfa
Merge branch 'main' into compose-language-list-design
cooltey Apr 11, 2025
8b098e1
Merge branch 'main' into compose-language-list-design
Williamrai Apr 14, 2025
0e5ca12
- uses generic SearchEmptyView
Williamrai Apr 14, 2025
b96fa59
Merge branch 'main' into compose-language-list-design
Williamrai Apr 14, 2025
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
6 changes: 2 additions & 4 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -152,10 +152,8 @@
android:theme="@style/AppTheme.ActionBar"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize" />
<activity
android:name=".language.LanguagesListActivity"
android:label="@string/languages_list_activity_title"
android:theme="@style/AppTheme.ActionBar"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize" />
android:name=".language.addLanguagesList.AddLanguagesListActivity"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize"/>
<activity
android:name=".suggestededits.SuggestionsActivity"
android:launchMode="singleTask"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
package org.wikipedia.compose.components

import androidx.compose.foundation.layout.RowScope
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.ArrowBack
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.OutlinedTextField
import androidx.compose.material3.OutlinedTextFieldDefaults
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.focus.FocusRequester
import androidx.compose.ui.focus.focusRequester
import androidx.compose.ui.graphics.Color
import org.wikipedia.compose.theme.WikipediaTheme

@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun SearchTopAppBar(
modifier: Modifier = Modifier,
searchQuery: String,
placeHolderTitle: String,
onSearchQueryChange: (String) -> Unit,
onBackButtonClick: () -> Unit,
actions: @Composable RowScope.() -> Unit = {},
) {
val focusRequester = remember { FocusRequester() }
TopAppBar(
modifier = modifier
.fillMaxWidth()
.focusRequester(focusRequester),
title = {
OutlinedTextField(
value = searchQuery,
onValueChange = onSearchQueryChange,
placeholder = {
Text(placeHolderTitle)
},
colors = OutlinedTextFieldDefaults.colors(
unfocusedBorderColor = Color.Transparent,
focusedBorderColor = Color.Transparent,
focusedTextColor = WikipediaTheme.colors.primaryColor,
cursorColor = WikipediaTheme.colors.primaryColor
)
)
},
navigationIcon = {
IconButton(onClick = onBackButtonClick) {
Icon(
imageVector = Icons.AutoMirrored.Filled.ArrowBack,
contentDescription = null,
tint = WikipediaTheme.colors.primaryColor
)
}
},
actions = actions,
colors = TopAppBarDefaults.topAppBarColors(
containerColor = WikipediaTheme.colors.paperColor,
titleContentColor = WikipediaTheme.colors.primaryColor
),
)

LaunchedEffect(Unit) {
focusRequester.requestFocus()
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package org.wikipedia.compose.components

import androidx.compose.foundation.layout.RowScope
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.ArrowBack
import androidx.compose.material3.ExperimentalMaterial3Api
Expand All @@ -26,7 +27,8 @@ fun WikiTopAppBar(
onNavigationClick: (() -> Unit),
titleStyle: TextStyle = WikipediaTheme.typography.h1.copy(lineHeight = 24.sp),
elevation: Dp = 0.dp,
modifier: Modifier = Modifier
modifier: Modifier = Modifier,
actions: @Composable RowScope.() -> Unit = {},
) {
val navigationIcon = Icons.AutoMirrored.Filled.ArrowBack
val backgroundColor = WikipediaTheme.colors.paperColor
Expand All @@ -52,6 +54,7 @@ fun WikiTopAppBar(
containerColor = backgroundColor,
titleContentColor = WikipediaTheme.colors.primaryColor
),
actions = actions,
modifier = modifier.shadow(elevation = elevation)
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
package org.wikipedia.compose.components

import androidx.compose.animation.AnimatedContent
import androidx.compose.animation.core.FastOutSlowInEasing
import androidx.compose.animation.core.LinearEasing
import androidx.compose.animation.core.tween
import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut
import androidx.compose.animation.togetherWith
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.Clear
import androidx.compose.material.icons.outlined.Search
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import org.wikipedia.compose.theme.WikipediaTheme

enum class TopAppBarState {
SEARCH,
NORMAL
}

/**
* @param appBarTitle the title to be displayed in the top app bar
* @param placeHolderTitle the placeholder title displayed on the search app bar
* @param searchQuery the query text to be shown in the input field.
* @param onSearchQueryChange the callback that is triggered when the users updates the text.
* An updated text comes as a parameter of the callback
* @param onBackButtonClick the callback that is triggered when user taps the back arrow
*/
@Composable
fun WikiTopAppBarWithSearch(
appBarTitle: String,
placeHolderTitle: String,
searchQuery: String,
onSearchQueryChange: (String) -> Unit,
onBackButtonClick: () -> Unit,
) {
var currentState by remember { mutableStateOf(TopAppBarState.NORMAL) }

// Simple animation when switching states
val enterTransition = fadeIn(
animationSpec = tween(
durationMillis = 200,
easing = LinearEasing
)
)

val exitTransition = fadeOut(
animationSpec = tween(
durationMillis = 150,
easing = FastOutSlowInEasing
)
)

AnimatedContent(
targetState = currentState,
transitionSpec = {
enterTransition.togetherWith(exitTransition)
},
content = { state ->
when (state) {
TopAppBarState.SEARCH -> {
SearchTopAppBar(
searchQuery = searchQuery,
onSearchQueryChange = {
onSearchQueryChange(it)
},
placeHolderTitle = placeHolderTitle,
onBackButtonClick = {
onSearchQueryChange("")
currentState = TopAppBarState.NORMAL
},
actions = {
if (searchQuery.isNotEmpty()) {
IconButton(
onClick = {
onSearchQueryChange("")
currentState = TopAppBarState.NORMAL
},
content = {
Icon(
imageVector = Icons.Outlined.Clear,
contentDescription = null,
tint = WikipediaTheme.colors.placeholderColor
)
}
)
}
}
)
}
TopAppBarState.NORMAL -> {
WikiTopAppBar(
title = appBarTitle,
onNavigationClick = onBackButtonClick,
actions = {
IconButton(
onClick = {
currentState = TopAppBarState.SEARCH
},
content = {
Icon(
imageVector = Icons.Outlined.Search,
contentDescription = null,
tint = WikipediaTheme.colors.primaryColor
)
}
)
}
)
}
}
}
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,11 @@ val Typography = WikipediaTypography(
fontSize = 12.sp,
lineHeight = 18.sp
),
p = TextStyle(
fontFamily = FontFamily.SansSerif,
fontSize = 16.sp,
lineHeight = 24.sp
),
button = TextStyle(
fontFamily = FontFamily.SansSerif,
fontWeight = FontWeight.Medium,
Expand Down
Loading
Loading