import
androidx.compose.foundation.BorderStroke
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.fillMaxWidth
import
androidx.compose.foundation.layout.padding
import
androidx.compose.foundation.layout.size
import
androidx.compose.foundation.layout.width
import
androidx.compose.foundation.lazy.LazyRow
import
androidx.compose.foundation.lazy.items
import
androidx.compose.foundation.rememberScrollState
import
androidx.compose.foundation.shape.CircleShape
import
androidx.compose.foundation.shape.RoundedCornerShape
import
androidx.compose.foundation.verticalScroll
import
androidx.compose.material3.Divider
import
androidx.compose.material3.ExperimentalMaterial3Api
import
androidx.compose.material3.Icon
import
androidx.compose.material3.IconButton
import
androidx.compose.material3.MaterialTheme
import
androidx.compose.material3.Scaffold
import
androidx.compose.material3.Surface
import
androidx.compose.material3.Text
import
androidx.compose.material3.TopAppBar
import
androidx.compose.material3.TopAppBarDefaults
import
androidx.compose.runtime.Composable
import
androidx.compose.ui.Alignment
import
androidx.compose.ui.ExperimentalComposeUiApi
import
androidx.compose.ui.Modifier
import
androidx.compose.ui.draw.clip
import
androidx.compose.ui.graphics.Color
import
androidx.compose.ui.res.painterResource
import
androidx.compose.ui.res.stringResource
import
androidx.compose.ui.semantics.semantics
import
androidx.compose.ui.semantics.testTagsAsResourceId
import
androidx.compose.ui.text.style.TextOverflow
import
androidx.compose.ui.unit.dp
const
val username =
"damahecode"
const
val my_description =
"A group of simple, open source Android apps without ads and unnecessary permissions, with materials design UI."
val profilePopularList = listOf(
ProfilePopularList(
"Jetpack-Compose-UI"
,
"A Collection on all Jetpack compose UI Layouts and Demo screens to see it's potential"
,
"25"
,
"Kotlin"
),
ProfilePopularList(
"Leaf-Explorer"
,
"File Manager, File Sharing & Music Player App for Android"
,
"9"
,
"Kotlin"
),
ProfilePopularList(
"DayNight-Theme"
,
"A Material Design-based Theme Management System for Android Jetpack Compose."
,
"45"
,
"Kotlin"
)
)
val imageTextList = listOf(
ImageTextList(ImageVectorIcon(MyIcons.Location),
"Bharat/India"
),
ImageTextList(ImageVectorIcon(MyIcons.Email),
"damahecode@gmail.com"
),
ImageTextList(ImageVectorIcon(MyIcons.AccountBox),
"100 followers"
)
)
val moreOptionsList = listOf(
FeatureList(
"Edit Profile"
, ImageVectorIcon(MyIcons.Edit),
""
),
FeatureList(
"Manage Account"
, ImageVectorIcon(MyIcons.AccountBox),
""
),
FeatureList(
"Privacy Policy"
, DrawableResourceIcon(MyIcons.Policy),
""
),
FeatureList(
"About"
, ImageVectorIcon(MyIcons.Info),
""
),
FeatureList(
"Help & Feedback"
, DrawableResourceIcon(MyIcons.Android_Head),
""
),
FeatureList(
"Share 'Damahe Code'"
, ImageVectorIcon(MyIcons.Share),
""
),
)
@OptIn
(
ExperimentalComposeUiApi::
class
,
ExperimentalMaterial3Api::
class
)
@Composable
fun ProfileScreen(onGoBack: () -> Unit) {
Scaffold(
modifier = Modifier.semantics {
testTagsAsResourceId =
true
},
containerColor = Color.Transparent,
contentColor = MaterialTheme.colorScheme.onBackground,
topBar = {
TopAppBar(
title = {
Text(text = stringResource(id = R.string.txt_profile))
},
navigationIcon = {
IconButton(onClick = onGoBack) {
Icon(MyIcons.ArrowBack, contentDescription =
"Back"
)
}
},
actions = {
IconButton(onClick = { }) {
Icon(MyIcons.Search, contentDescription =
"Search"
)
}
IconButton(onClick = { }) {
Icon(MyIcons.MoreVert, contentDescription =
"More"
)
}
},
colors = TopAppBarDefaults.centerAlignedTopAppBarColors(
containerColor = Color.Transparent,
),
)
}
) { padding ->
ProfileContent(
modifier = Modifier
.verticalScroll(rememberScrollState())
.padding(padding)
) {
TopProfileLayout()
MainProfileContent()
FooterContent()
}
}
}
@Composable
fun ProfileContent(
modifier: Modifier = Modifier,
content:
@Composable
() -> Unit
) {
Column(modifier) {
content()
}
}
@OptIn
(ExperimentalLayoutApi::
class
)
@Composable
fun TopProfileLayout() {
Surface(
modifier = Modifier
.fillMaxWidth()
.padding(
12
.dp),
shape = RoundedCornerShape(
8
),
) {
Column(modifier = Modifier.padding(
10
.dp)) {
Row(
modifier = Modifier.padding(vertical =
5
.dp),
verticalAlignment = Alignment.CenterVertically,
) {
Icon(
painter = painterResource(id = DrawableResourceIcon(MyIcons.AppIcon).id),
contentDescription =
null
,
modifier = Modifier
.clip(CircleShape)
.size(
60
.dp)
)
Column(
modifier = Modifier
.padding(horizontal =
8
.dp)
.weight(1f)
) {
Text(
text = stringResource(id = R.string.app_name),
style = MaterialTheme.typography.titleLarge
)
Text(
text = username,
style = MaterialTheme.typography.labelMedium,
overflow = TextOverflow.Ellipsis,
)
}
}
Text(
modifier = Modifier.padding(vertical =
5
.dp),
text = my_description,
style = MaterialTheme.typography.bodySmall,
)
FlowRow(modifier = Modifier.padding(vertical =
5
.dp)) {
imageTextList.forEach {
ImageTextContent(
modifier = Modifier.padding(vertical =
5
.dp),
icon = {
when (it.icon) {
is ImageVectorIcon -> Icon(
imageVector = it.icon.imageVector,
contentDescription =
null
,
modifier = Modifier
.size(
20
.dp)
)
is DrawableResourceIcon -> Icon(
painter = painterResource(id = it.icon.id),
contentDescription =
null
,
modifier = Modifier
.size(
20
.dp)
)
}
},
text = {
Text(
text = it.text,
style = MaterialTheme.typography.labelLarge,
)
}
)
}
}
}
}
}
@Composable
fun ImageTextContent(
icon:
@Composable
() -> Unit,
text:
@Composable
() -> Unit,
modifier: Modifier = Modifier
) {
Row(
modifier,
verticalAlignment = Alignment.CenterVertically,
) {
icon()
Spacer(modifier = Modifier.width(
5
.dp))
text()
Spacer(modifier = Modifier.width(
10
.dp))
}
}
@Composable
fun MainProfileContent() {
Surface(
modifier = Modifier
.fillMaxWidth()
.padding(
12
.dp),
shape = RoundedCornerShape(
8
),
) {
Column(modifier = Modifier.padding(
5
.dp)) {
Text(
modifier = Modifier
.padding(
10
.dp),
text =
"Popular"
,
style = MaterialTheme.typography.titleMedium,
)
PopularContentList()
Divider(modifier = Modifier.padding(vertical =
15
.dp))
GitContentItem(
modifier = Modifier.padding(vertical =
2
.dp),
icon = {
Icon(
imageVector = ImageVectorIcon(MyIcons.List).imageVector,
contentDescription =
null
,
modifier = Modifier
.size(
40
.dp)
.padding(
6
.dp)
)
},
text = {
Text(
text =
"Repositories"
,
style = MaterialTheme.typography.labelLarge,
)
},
endItem = {
Text(
modifier = Modifier.padding(
5
.dp),
text =
"24"
)
}
)
GitContentItem(
modifier = Modifier.padding(vertical =
2
.dp),
icon = {
Icon(
imageVector = ImageVectorIcon(MyIcons.Star).imageVector,
contentDescription =
null
,
modifier = Modifier
.size(
40
.dp)
.padding(
6
.dp)
)
},
text = {
Text(
text =
"Starred"
,
style = MaterialTheme.typography.labelLarge,
)
},
endItem = {
Text(
modifier = Modifier.padding(
5
.dp),
text =
"60"
)
}
)
}
}
}
@Composable
fun PopularContentList() {
LazyRow {
items(
items = profilePopularList,
itemContent = {
Surface(
modifier = Modifier
.width(
250
.dp)
.padding(
5
.dp),
shape = RoundedCornerShape(
8
),
border = BorderStroke(
0.1
.dp, MaterialTheme.colorScheme.outline)
) {
Column(modifier = Modifier.padding(
5
.dp)) {
Row(
modifier = Modifier.padding(vertical =
5
.dp),
verticalAlignment = Alignment.CenterVertically,
) {
Icon(
painter = painterResource(id = DrawableResourceIcon(MyIcons.AppIcon).id),
contentDescription =
null
,
modifier = Modifier
.clip(CircleShape)
.size(
20
.dp)
)
Spacer(modifier = Modifier.width(
5
.dp))
Text(
text = it.name,
style = MaterialTheme.typography.titleSmall,
)
}
Text(
modifier = Modifier.padding(vertical =
5
.dp),
text = it.description,
style = MaterialTheme.typography.bodySmall, maxLines =
2
,
)
Row(
modifier = Modifier.padding(vertical =
5
.dp),
verticalAlignment = Alignment.CenterVertically,
) {
ImageTextContent(
modifier = Modifier.padding(vertical =
5
.dp),
icon = {
Icon(
imageVector = ImageVectorIcon(MyIcons.Star).imageVector,
contentDescription =
null
,
modifier = Modifier
.clip(CircleShape)
.size(
15
.dp)
)
},
text = {
Text(
text = it.star,
style = MaterialTheme.typography.labelLarge,
)
}
)
Spacer(modifier = Modifier.width(
5
.dp))
ImageTextContent(
modifier = Modifier.padding(vertical =
5
.dp),
icon = {
Icon(
painter = painterResource(id = DrawableResourceIcon(MyIcons.AppIcon).id),
contentDescription =
null
,
modifier = Modifier
.clip(CircleShape)
.size(
10
.dp)
)
},
text = {
Text(
text = it.language,
style = MaterialTheme.typography.labelLarge,
)
}
)
}
}
}
}
)
}
}
@Composable
fun GitContentItem(
modifier: Modifier = Modifier,
icon:
@Composable
() -> Unit,
text:
@Composable
() -> Unit,
endItem:
@Composable
() -> Unit,
) {
Row(
modifier,
verticalAlignment = Alignment.CenterVertically,
) {
icon()
Column(
modifier = Modifier
.padding(horizontal =
5
.dp)
.weight(1f)
) {
text()
}
endItem()
}
}
@Composable
fun FooterContent() {
Surface(
modifier = Modifier
.fillMaxWidth()
.padding(
12
.dp),
shape = RoundedCornerShape(
8
),
) {
Column(modifier = Modifier.padding(
5
.dp)) {
Text(
modifier = Modifier
.padding(
10
.dp),
text = stringResource(id = R.string.txt_more_options),
style = MaterialTheme.typography.titleMedium,
)
moreOptionsList.forEach {
MoreOptionsComp(it)
}
}
}
}
@Composable
fun MoreOptionsComp(
featureList: FeatureList,
) {
Row(
modifier = Modifier.padding(
5
.dp),
verticalAlignment = Alignment.CenterVertically,
) {
when (featureList.listIcon) {
is ImageVectorIcon -> Icon(
imageVector = featureList.listIcon.imageVector,
contentDescription =
null
,
modifier = Modifier
.size(
40
.dp)
.padding(
6
.dp)
)
is DrawableResourceIcon -> Icon(
painter = painterResource(id = featureList.listIcon.id),
contentDescription =
null
,
modifier = Modifier
.size(
40
.dp)
.padding(
6
.dp)
)
}
Column(
modifier = Modifier
.padding(horizontal =
4
.dp)
.weight(1f)
) {
Text(
text = featureList.name,
style = MaterialTheme.typography.labelLarge
)
}
Icon(
imageVector = MyIcons.KeyboardArrowRight,
contentDescription =
null
,
modifier = Modifier.padding(
4
.dp)
)
}
}