Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • barysole/ackee-test-task
1 result
Show changes
package cz.fel.barysole.ackeetesttask.ui.uielement.main
import android.annotation.SuppressLint
import androidx.compose.animation.Crossfade
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.padding
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Search
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.runtime.Composable
import androidx.compose.runtime.MutableState
import androidx.compose.runtime.mutableStateOf
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.shadow
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import cz.fel.barysole.ackeetesttask.R
import cz.fel.barysole.ackeetesttask.ui.screen.Screen
import cz.fel.barysole.ackeetesttask.ui.screen.ScreenAction
import cz.fel.barysole.ackeetesttask.ui.uielement.charactersearch.MySearchBar
//Main screen contains the TopAppBar and other functions, which are experimental and are likely to change or to be removed in the future.
//But in the small test app it looks nice, i guess.
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun MyTopAppBar(
selectedScreen: MutableState<Screen>,
selectedScreen: Screen,
onActionClick: (ScreenAction) -> Unit,
isFavoriteIconEnabled: Boolean = false,
barTitle: String = "",
// Can be modified internally
isSearchBarShowing: MutableState<Boolean>,
onScreenSelected: (Screen, List<Any>?) -> Unit
onSelectScreen: (Screen, List<Any>?) -> Unit
) {
if (selectedScreen.value.showTopAppBar == true) {
// showing iff isSearchBarShowing is true
if (selectedScreen.showTopAppBar) {
Crossfade(targetState = isSearchBarShowing.value) { showSearchBar ->
when (showSearchBar) {
true -> MySearchBar(isSearchBarShowing, onScreenSelected)
// showing iff isSearchBarShowing is true
true -> MySearchBar(isSearchBarShowing, onSelectScreen)
false -> TopAppBar(
modifier = Modifier.shadow(16.dp),
navigationIcon = {
if (selectedScreen.value!!.isBackButtonShowing) {
if (selectedScreen.isBackButtonShowing) {
Icon(
painterResource(R.drawable.baseline_arrow_back_ios_new_24),
modifier = Modifier
.clickable { onScreenSelected(Screen.Previous, null) }
.clickable { onSelectScreen(Screen.Previous, null) }
.padding(horizontal = 8.dp),
contentDescription = "Arrow back icon"
contentDescription = stringResource(R.string.arrow_back_icon_description)
)
}
},
title = {
Text(
//there is no null in the screenWithTopAppBarList
text = if (selectedScreen.value.nameResId != null) stringResource(
selectedScreen.value.nameResId ?: R.string.empty_string
text = if (selectedScreen.nameResId != null) stringResource(
selectedScreen.nameResId
) else barTitle,
maxLines = 1,
overflow = TextOverflow.Ellipsis
)
},
actions = {
ActionButtons(
selectedScreen.value!!.actionList,
TopBarActionButtons(
actionButtonList = selectedScreen.actionList,
onActionClick,
isFavoriteIconEnabled,
onSearchBarClick = { isSearchBarShowing.value = true }
......@@ -80,33 +79,13 @@ fun MyTopAppBar(
}
}
@SuppressLint("UnrememberedMutableState")
@Preview
@Composable
fun ActionButtons(
actionButtonList: List<ScreenAction>,
onActionClick: (ScreenAction) -> Unit,
isFavoriteIconEnabled: Boolean = false,
onSearchBarClick: () -> Unit = {}
) {
for (screenAction in actionButtonList) {
if (screenAction == ScreenAction.SearchCharacterScreenAction) {
IconButton(onClick = {
onActionClick(ScreenAction.SearchCharacterScreenAction)
onSearchBarClick()
}) {
Icon(
imageVector = Icons.Default.Search,
contentDescription = "Search button"
)
}
} else if (screenAction == ScreenAction.AddToFavoriteScreenAction) {
IconButton(onClick = { onActionClick(ScreenAction.AddToFavoriteScreenAction) }) {
Icon(
painter = if (isFavoriteIconEnabled) painterResource(R.drawable.baseline_star_24) else painterResource(
R.drawable.baseline_star_outline_24
),
contentDescription = "Favorite button"
)
}
}
}
fun MyTopAppBarPreview() {
MyTopAppBar(
Screen.Characters,
{},
isSearchBarShowing = mutableStateOf(false),
onSelectScreen = { _, _ -> })
}
\ No newline at end of file
package cz.fel.barysole.ackeetesttask.ui.uielement.main
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Search
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.runtime.Composable
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import cz.fel.barysole.ackeetesttask.R
import cz.fel.barysole.ackeetesttask.ui.screen.ScreenAction
@Composable
fun TopBarActionButtons(
actionButtonList: List<ScreenAction>,
onActionClick: (ScreenAction) -> Unit,
isFavoriteIconEnabled: Boolean = false,
onSearchBarClick: () -> Unit = {}
) {
for (screenAction in actionButtonList) {
if (screenAction == ScreenAction.SearchCharacterScreenAction) {
IconButton(
onClick = {
onActionClick(ScreenAction.SearchCharacterScreenAction)
onSearchBarClick()
}) {
Icon(
imageVector = Icons.Default.Search,
contentDescription = stringResource(R.string.search_button_description)
)
}
} else if (screenAction == ScreenAction.AddToFavoriteScreenAction) {
IconButton(onClick = { onActionClick(ScreenAction.AddToFavoriteScreenAction) }) {
Icon(
painter = if (isFavoriteIconEnabled) painterResource(R.drawable.baseline_star_24) else painterResource(
R.drawable.baseline_star_outline_24
),
contentDescription = stringResource(R.string.favorite_button_description),
tint = Color.Blue
)
}
}
}
}
\ No newline at end of file
......@@ -4,4 +4,19 @@
<string name="characters">Characters</string>
<string name="favorite">Favorite</string>
<string name="character_detail">Character Detail</string>
<string name="search_button_description">Search button</string>
<string name="favorite_button_description">Favorite button</string>
<string name="search_bar_placeholder">Start enter a name…</string>
<string name="arrow_back_icon_description">Arrow back icon</string>
<string name="close_icon_description">Close icon</string>
<string name="data_cannot_be_loaded_error">Data cannot be loaded!</string>
<string name="reload_text">Reload</string>
<string name="no_favorite_characters_text">There is no favorite characters yet.</string>
<string name="character_image_description">Character image</string>
<string name="name_field_title">Name</string>
<string name="status_field_title">Status</string>
<string name="type_field_title">Type</string>
<string name="gender_field_title">Gender</string>
<string name="origin_field_title">Origin</string>
<string name="location_field_title">Location</string>
</resources>
\ No newline at end of file