Skip to content

Commit

Permalink
Merge pull request #62 from google-developer-training/main-e2e
Browse files Browse the repository at this point in the history
WIP: Main e2e
  • Loading branch information
android-dev-lxl authored May 7, 2024
2 parents 6ab9345 + 60c261a commit a3e6b27
Show file tree
Hide file tree
Showing 17 changed files with 79 additions and 347 deletions.
14 changes: 7 additions & 7 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,12 @@ plugins {

android {
namespace = "com.example.reply"
compileSdk = 33
compileSdk = 34

defaultConfig {
applicationId = "com.example.reply"
minSdk = 24
targetSdk = 33
targetSdk = 34
versionCode = 1
versionName = "1.0"

Expand Down Expand Up @@ -57,7 +57,7 @@ android {
compose = true
}
composeOptions {
kotlinCompilerExtensionVersion = "1.4.7"
kotlinCompilerExtensionVersion = "1.5.4"
}
packaging {
resources {
Expand All @@ -68,19 +68,19 @@ android {

dependencies {

implementation(platform("androidx.compose:compose-bom:2023.06.00"))
implementation("androidx.activity:activity-compose:1.7.2")
implementation(platform("androidx.compose:compose-bom:2023.10.01"))
implementation("androidx.activity:activity-compose:1.8.1")
implementation("androidx.compose.material:material-icons-extended")
implementation("androidx.compose.material3:material3")
implementation("androidx.compose.material3:material3-window-size-class")
implementation("androidx.compose.ui:ui")
implementation("androidx.compose.ui:ui-graphics")
implementation("androidx.compose.ui:ui-tooling-preview")
implementation("androidx.core:core-ktx:1.10.1")
implementation("androidx.core:core-ktx:1.12.0")
implementation("androidx.lifecycle:lifecycle-runtime-ktx:${rootProject.extra["lifecycle_version"]}")
implementation("androidx.lifecycle:lifecycle-viewmodel-compose:${rootProject.extra["lifecycle_version"]}")

androidTestImplementation(platform("androidx.compose:compose-bom:2023.06.00"))
androidTestImplementation(platform("androidx.compose:compose-bom:2023.10.01"))
androidTestImplementation("androidx.compose.ui:ui-test-junit4")
androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")
androidTestImplementation("androidx.test.ext:junit:1.1.5")
Expand Down
21 changes: 20 additions & 1 deletion app/src/main/java/com/example/reply/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,20 @@ package com.example.reply
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.asPaddingValues
import androidx.compose.foundation.layout.calculateEndPadding
import androidx.compose.foundation.layout.calculateStartPadding
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.safeDrawing
import androidx.compose.material3.Surface
import androidx.compose.material3.windowsizeclass.ExperimentalMaterial3WindowSizeClassApi
import androidx.compose.material3.windowsizeclass.WindowWidthSizeClass
import androidx.compose.material3.windowsizeclass.calculateWindowSizeClass
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalLayoutDirection
import androidx.compose.ui.tooling.preview.Preview
import com.example.reply.ui.ReplyApp
import com.example.reply.ui.theme.ReplyTheme
Expand All @@ -31,11 +40,21 @@ class MainActivity : ComponentActivity() {

@OptIn(ExperimentalMaterial3WindowSizeClassApi::class)
override fun onCreate(savedInstanceState: Bundle?) {
enableEdgeToEdge()
super.onCreate(savedInstanceState)

setContent {
ReplyTheme {
Surface {
val layoutDirection = LocalLayoutDirection.current
Surface(
modifier = Modifier
.padding(
start = WindowInsets.safeDrawing.asPaddingValues()
.calculateStartPadding(layoutDirection),
end = WindowInsets.safeDrawing.asPaddingValues()
.calculateEndPadding(layoutDirection)
)
) {
val windowSize = calculateWindowSizeClass(this)

ReplyApp(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,15 +25,6 @@ import com.example.reply.data.Account
object LocalAccountsDataProvider {
val defaultAccount = Account(-1, -1, -1, -1, R.drawable.avatar_1)

val userAccount =
Account(
id = 1,
firstName = R.string.account_1_first_name,
lastName = R.string.account_1_last_name,
email = R.string.account_1_email,
avatar = R.drawable.avatar_10
)

private val allUserContactAccounts = listOf(
Account(
id = 4L,
Expand Down
15 changes: 12 additions & 3 deletions app/src/main/java/com/example/reply/ui/ReplyDetailsScreen.kt
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,16 @@ 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.PaddingValues
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.asPaddingValues
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.safeDrawing
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.shape.CircleShape
Expand Down Expand Up @@ -63,11 +67,13 @@ fun ReplyDetailsScreen(
}
Box(modifier = modifier) {
LazyColumn(
contentPadding = PaddingValues(
top = WindowInsets.safeDrawing.asPaddingValues().calculateTopPadding(),
),
modifier = Modifier
.testTag(stringResource(R.string.details_screen))
.fillMaxSize()
.background(color = MaterialTheme.colorScheme.inverseOnSurface)
.padding(top = dimensionResource(R.dimen.detail_card_list_padding_top))
) {
item {
if (isFullScreen) {
Expand All @@ -76,7 +82,10 @@ fun ReplyDetailsScreen(
replyUiState,
Modifier
.fillMaxWidth()
.padding(bottom = dimensionResource(R.dimen.detail_topbar_padding_bottom))
.padding(
bottom = dimensionResource(R.dimen.detail_topbar_padding_bottom),
top = dimensionResource(R.dimen.topbar_padding_vertical)
)
)
}
ReplyEmailDetailsCard(
Expand All @@ -86,7 +95,7 @@ fun ReplyDetailsScreen(
modifier = if (isFullScreen) {
Modifier.padding(horizontal = dimensionResource(R.dimen.detail_card_outer_padding_horizontal))
} else {
Modifier.padding(end = dimensionResource(R.dimen.detail_card_outer_padding_horizontal))
Modifier
}
)
}
Expand Down
20 changes: 14 additions & 6 deletions app/src/main/java/com/example/reply/ui/ReplyHomeContent.kt
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,13 @@ 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.WindowInsets
import androidx.compose.foundation.layout.asPaddingValues
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.safeDrawing
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.statusBars
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.shape.CircleShape
Expand Down Expand Up @@ -58,6 +62,7 @@ fun ReplyListOnlyContent(

LazyColumn(
modifier = modifier,
contentPadding = WindowInsets.safeDrawing.asPaddingValues(),
verticalArrangement = Arrangement.spacedBy(
dimensionResource(R.dimen.email_list_item_vertical_spacing)
)
Expand Down Expand Up @@ -88,14 +93,15 @@ fun ReplyListAndDetailContent(
modifier: Modifier = Modifier
) {
val emails = replyUiState.currentMailboxEmails
Row(modifier = modifier) {
Row(
modifier = modifier,
horizontalArrangement = Arrangement.SpaceEvenly
) {
LazyColumn(
contentPadding = WindowInsets.statusBars.asPaddingValues(),
modifier = Modifier
.weight(1f)
.padding(
end = dimensionResource(R.dimen.list_and_detail_list_padding_end),
top = dimensionResource(R.dimen.list_and_detail_list_padding_top)
),
.padding(horizontal = dimensionResource(R.dimen.email_list_only_horizontal_padding)),
verticalArrangement = Arrangement.spacedBy(
dimensionResource(R.dimen.email_list_item_vertical_spacing)
)
Expand All @@ -113,7 +119,9 @@ fun ReplyListAndDetailContent(
val activity = LocalContext.current as Activity
ReplyDetailsScreen(
replyUiState = replyUiState,
modifier = Modifier.weight(1f),
modifier = Modifier
.weight(1f)
.padding(end = dimensionResource(R.dimen.email_list_only_horizontal_padding)),
onBackPressed = { activity.finish() }
)
}
Expand Down
30 changes: 17 additions & 13 deletions app/src/main/java/com/example/reply/ui/ReplyHomeScreen.kt
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.statusBarsPadding
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.layout.wrapContentWidth
import androidx.compose.material.icons.Icons
Expand Down Expand Up @@ -95,7 +96,10 @@ fun ReplyHomeScreen(
val navigationDrawerContentDescription = stringResource(R.string.navigation_drawer)
PermanentNavigationDrawer(
drawerContent = {
PermanentDrawerSheet(Modifier.width(dimensionResource(R.dimen.drawer_width))) {
PermanentDrawerSheet(
modifier = Modifier.width(dimensionResource(R.dimen.drawer_width)),
drawerContainerColor = MaterialTheme.colorScheme.inverseOnSurface,
) {
NavigationDrawerContent(
selectedDestination = replyUiState.currentMailbox,
onTabPressed = onTabPressed,
Expand All @@ -117,7 +121,7 @@ fun ReplyHomeScreen(
onTabPressed = onTabPressed,
onEmailCardPressed = onEmailCardPressed,
navigationItemContentList = navigationItemContentList,
modifier = modifier
modifier = modifier,
)
}
} else {
Expand All @@ -129,7 +133,7 @@ fun ReplyHomeScreen(
onTabPressed = onTabPressed,
onEmailCardPressed = onEmailCardPressed,
navigationItemContentList = navigationItemContentList,
modifier = modifier
modifier = modifier,
)
} else {
ReplyDetailsScreen(
Expand All @@ -152,16 +156,16 @@ private fun ReplyAppContent(
navigationItemContentList: List<NavigationItemContent>,
modifier: Modifier = Modifier,
) {
Box(modifier = modifier) {
Box(modifier = modifier)
{
Row(modifier = Modifier.fillMaxSize()) {
AnimatedVisibility(visible = navigationType == ReplyNavigationType.NAVIGATION_RAIL) {
val navigationRailContentDescription = stringResource(R.string.navigation_rail)
ReplyNavigationRail(
currentTab = replyUiState.currentMailbox,
onTabPressed = onTabPressed,
navigationItemContentList = navigationItemContentList,
modifier = Modifier
.testTag(navigationRailContentDescription)
modifier = Modifier.testTag(navigationRailContentDescription)
)
}
Column(
Expand All @@ -173,16 +177,17 @@ private fun ReplyAppContent(
ReplyListAndDetailContent(
replyUiState = replyUiState,
onEmailCardPressed = onEmailCardPressed,
modifier = Modifier.weight(1f),
modifier = Modifier
.statusBarsPadding()
.weight(1f),
)
} else {
ReplyListOnlyContent(
replyUiState = replyUiState,
onEmailCardPressed = onEmailCardPressed,
modifier = Modifier.weight(1f)
.padding(
horizontal = dimensionResource(R.dimen.email_list_only_horizontal_padding)
)
modifier = Modifier
.weight(1f)
.padding(horizontal = dimensionResource(R.dimen.email_list_only_horizontal_padding))
)
}
AnimatedVisibility(
Expand Down Expand Up @@ -299,8 +304,7 @@ private fun NavigationDrawerHeader(
ReplyProfileImage(
drawableResource = LocalAccountsDataProvider.defaultAccount.avatar,
description = stringResource(id = R.string.profile),
modifier = Modifier
.size(dimensionResource(R.dimen.profile_image_size))
modifier = Modifier.size(dimensionResource(R.dimen.profile_image_size))
)
}
}
Expand Down
7 changes: 3 additions & 4 deletions app/src/main/java/com/example/reply/ui/theme/Theme.kt
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,12 @@ import android.app.Activity
import android.os.Build
import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.lightColorScheme
import androidx.compose.material3.darkColorScheme
import androidx.compose.material3.dynamicDarkColorScheme
import androidx.compose.material3.dynamicLightColorScheme
import androidx.compose.material3.lightColorScheme
import androidx.compose.runtime.Composable
import androidx.compose.runtime.SideEffect
import androidx.compose.ui.graphics.toArgb
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalView
import androidx.core.view.WindowCompat
Expand Down Expand Up @@ -114,12 +113,12 @@ fun ReplyTheme(
darkTheme -> DarkColorScheme
else -> LightColorScheme
}

val view = LocalView.current
if (!view.isInEditMode) {
SideEffect {
val window = (view.context as Activity).window
window.statusBarColor = colorScheme.primary.toArgb()
WindowCompat.getInsetsController(window, view).isAppearanceLightStatusBars = darkTheme
WindowCompat.getInsetsController(window, view).isAppearanceLightStatusBars = !darkTheme
}
}

Expand Down
Binary file removed app/src/main/res/drawable/avatar_10.jpg
Binary file not shown.
Binary file removed app/src/main/res/drawable/avatar_9.jpg
Binary file not shown.
Loading

0 comments on commit a3e6b27

Please sign in to comment.