diff --git a/app/src/main/java/com/tomhempel/coordinatorapp/ui/components/CoordinatorBrand.kt b/app/src/main/java/com/tomhempel/coordinatorapp/ui/components/CoordinatorBrand.kt new file mode 100644 index 0000000..0ddfb14 --- /dev/null +++ b/app/src/main/java/com/tomhempel/coordinatorapp/ui/components/CoordinatorBrand.kt @@ -0,0 +1,136 @@ +package com.tomhempel.coordinatorapp.ui.components + +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.Row +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Brush +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.res.vectorResource +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.dp +import com.tomhempel.coordinatorapp.R + +@Composable +fun CoordinatorMarkIcon( + modifier: Modifier = Modifier, + size: Dp = 24.dp, + contentDescription: String? = null, +) { + Icon( + imageVector = ImageVector.vectorResource(R.drawable.ic_coordinator_mark), + contentDescription = contentDescription, + tint = MaterialTheme.colorScheme.primary, + modifier = modifier.size(size), + ) +} + +@Composable +fun CoordinatorBrandBadge( + modifier: Modifier = Modifier, + size: Dp = 72.dp, + iconSize: Dp = 40.dp, +) { + val scheme = MaterialTheme.colorScheme + Box( + modifier = modifier + .size(size) + .clip(RoundedCornerShape(22.dp)) + .background( + Brush.linearGradient( + colors = listOf( + scheme.primary, + scheme.primary.copy(alpha = 0.82f), + scheme.primaryContainer, + ), + ), + ), + contentAlignment = Alignment.Center, + ) { + Icon( + imageVector = ImageVector.vectorResource(R.drawable.ic_coordinator_mark), + contentDescription = null, + tint = scheme.onPrimary, + modifier = Modifier.size(iconSize), + ) + } +} + +@Composable +fun CoordinatorBrandHeader( + modifier: Modifier = Modifier, + subtitle: String = "Coordinator tools", + badgeSize: Dp = 72.dp, +) { + val scheme = MaterialTheme.colorScheme + Column( + modifier = modifier, + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(14.dp), + ) { + CoordinatorBrandBadge(size = badgeSize) + Column( + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(6.dp), + ) { + Text( + text = "NAT-AS Coordinator", + style = MaterialTheme.typography.headlineMedium, + fontWeight = FontWeight.Bold, + color = scheme.onBackground, + ) + Text( + text = subtitle, + style = MaterialTheme.typography.bodyLarge, + color = scheme.onSurfaceVariant, + ) + } + } +} + +@Composable +fun CoordinatorAppBarTitle( + title: String, + subtitle: String, + modifier: Modifier = Modifier, +) { + val scheme = MaterialTheme.colorScheme + Row( + modifier = modifier, + horizontalArrangement = Arrangement.spacedBy(12.dp), + verticalAlignment = Alignment.CenterVertically, + ) { + Box( + modifier = Modifier + .size(36.dp) + .clip(CircleShape) + .background(scheme.primaryContainer), + contentAlignment = Alignment.Center, + ) { + CoordinatorMarkIcon(size = 20.dp) + } + Column { + Text( + text = title, + fontWeight = FontWeight.SemiBold, + ) + Text( + text = subtitle, + style = MaterialTheme.typography.bodySmall, + color = scheme.onSurfaceVariant, + ) + } + } +} diff --git a/app/src/main/java/com/tomhempel/coordinatorapp/ui/counselors/CounselorsScreen.kt b/app/src/main/java/com/tomhempel/coordinatorapp/ui/counselors/CounselorsScreen.kt index 7de4eaf..377f2c2 100644 --- a/app/src/main/java/com/tomhempel/coordinatorapp/ui/counselors/CounselorsScreen.kt +++ b/app/src/main/java/com/tomhempel/coordinatorapp/ui/counselors/CounselorsScreen.kt @@ -49,6 +49,7 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.input.PasswordVisualTransformation import androidx.compose.ui.unit.dp import com.tomhempel.coordinatorapp.data.CounselorUser +import com.tomhempel.coordinatorapp.ui.components.CoordinatorAppBarTitle import com.tomhempel.coordinatorapp.ui.components.CoordinatorBackground import com.tomhempel.coordinatorapp.ui.components.gridColumnCount import com.tomhempel.coordinatorapp.ui.components.gridContentPadding @@ -99,14 +100,10 @@ fun SessionManagementScreen( } }, title = { - Column { - Text("Session management", fontWeight = FontWeight.SemiBold) - Text( - text = "$username · ${formatRole(role)}", - style = MaterialTheme.typography.bodySmall, - color = MaterialTheme.colorScheme.onSurfaceVariant, - ) - } + CoordinatorAppBarTitle( + title = "Session management", + subtitle = "$username · ${formatRole(role)}", + ) }, actions = { IconButton(onClick = onRefresh, enabled = !isRefreshing) { @@ -293,7 +290,7 @@ private fun ResetPasswordDialog( text = { Column(verticalArrangement = Arrangement.spacedBy(12.dp)) { Text( - text = "Set a new temporary password for ${counselor.username}. They must change it when signing in to the field app.", + text = "Set a new temporary password for ${counselor.username}. They must change it when signing in to the NAT-AS App.", style = MaterialTheme.typography.bodyMedium, ) diff --git a/app/src/main/java/com/tomhempel/coordinatorapp/ui/home/HomeScreen.kt b/app/src/main/java/com/tomhempel/coordinatorapp/ui/home/HomeScreen.kt index abab68e..15af93a 100644 --- a/app/src/main/java/com/tomhempel/coordinatorapp/ui/home/HomeScreen.kt +++ b/app/src/main/java/com/tomhempel/coordinatorapp/ui/home/HomeScreen.kt @@ -26,6 +26,7 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp +import com.tomhempel.coordinatorapp.ui.components.CoordinatorAppBarTitle import com.tomhempel.coordinatorapp.ui.components.CoordinatorBackground import com.tomhempel.coordinatorapp.ui.components.FeatureTile import com.tomhempel.coordinatorapp.ui.components.gridColumnCount @@ -67,17 +68,10 @@ fun HomeScreen( topBar = { TopAppBar( title = { - Column { - Text( - text = "NAT-AS Coordinator", - fontWeight = FontWeight.SemiBold, - ) - Text( - text = "$username · ${formatRole(role)}", - style = MaterialTheme.typography.bodySmall, - color = MaterialTheme.colorScheme.onSurfaceVariant, - ) - } + CoordinatorAppBarTitle( + title = "NAT-AS Coordinator", + subtitle = "$username · ${formatRole(role)}", + ) }, actions = { IconButton(onClick = onLogout) { diff --git a/app/src/main/java/com/tomhempel/coordinatorapp/ui/login/LoginScreen.kt b/app/src/main/java/com/tomhempel/coordinatorapp/ui/login/LoginScreen.kt index 8965b00..1092c3a 100644 --- a/app/src/main/java/com/tomhempel/coordinatorapp/ui/login/LoginScreen.kt +++ b/app/src/main/java/com/tomhempel/coordinatorapp/ui/login/LoginScreen.kt @@ -33,6 +33,8 @@ import androidx.compose.ui.text.input.PasswordVisualTransformation import androidx.compose.ui.unit.dp import com.tomhempel.coordinatorapp.ui.components.AuthCard import com.tomhempel.coordinatorapp.ui.components.CoordinatorBackground +import com.tomhempel.coordinatorapp.ui.components.CoordinatorBrandBadge +import com.tomhempel.coordinatorapp.ui.components.CoordinatorBrandHeader import com.tomhempel.coordinatorapp.ui.components.ResponsiveContent @Composable @@ -62,17 +64,8 @@ fun LoginScreen( .verticalScroll(rememberScrollState()), horizontalAlignment = Alignment.CenterHorizontally, ) { - Text( - text = "NAT-AS Coordinator", - style = MaterialTheme.typography.headlineMedium, - fontWeight = FontWeight.Bold, - color = MaterialTheme.colorScheme.onBackground, - ) - Text( - text = "Supervisor and admin tools", - style = MaterialTheme.typography.bodyLarge, - color = MaterialTheme.colorScheme.onSurfaceVariant, - modifier = Modifier.padding(top = 8.dp, bottom = 28.dp), + CoordinatorBrandHeader( + modifier = Modifier.padding(bottom = 28.dp), ) AuthCard { @@ -149,7 +142,7 @@ fun LoginScreen( Spacer(modifier = Modifier.height(20.dp)) Text( - text = "Counselors sign in through the field app.", + text = "Counselors sign in through the NAT-AS App.", style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurfaceVariant, ) @@ -185,7 +178,13 @@ fun ChangePasswordScreen( modifier = Modifier .fillMaxWidth() .verticalScroll(rememberScrollState()), + horizontalAlignment = Alignment.CenterHorizontally, ) { + CoordinatorBrandBadge( + size = 56.dp, + iconSize = 30.dp, + modifier = Modifier.padding(bottom = 20.dp), + ) AuthCard { Text( text = "Choose a new password", diff --git a/app/src/main/res/drawable/ic_coordinator_mark.xml b/app/src/main/res/drawable/ic_coordinator_mark.xml new file mode 100644 index 0000000..5d7b258 --- /dev/null +++ b/app/src/main/res/drawable/ic_coordinator_mark.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml index 07d5da9..7086652 100644 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -1,170 +1,25 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml index 2b068d1..c2ffdc6 100644 --- a/app/src/main/res/drawable/ic_launcher_foreground.xml +++ b/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -1,30 +1,42 @@ - - - - - - - - - \ No newline at end of file + android:pathData="M54,30c8.84,0 16,7.16 16,16s-7.16,16 -16,16 -16,-7.16 -16,-16 7.16,-16 16,-16z" /> + + + + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 83b743a..589a066 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,3 +1,3 @@ - CoordinatorApp + NAT-AS Coordinator \ No newline at end of file