Skip to content

Commit a3e6b27

Browse files
authored
Merge pull request #62 from google-developer-training/main-e2e
WIP: Main e2e
2 parents 6ab9345 + 60c261a commit a3e6b27

17 files changed

Lines changed: 79 additions & 347 deletions

app/build.gradle.kts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,12 @@ plugins {
2121

2222
android {
2323
namespace = "com.example.reply"
24-
compileSdk = 33
24+
compileSdk = 34
2525

2626
defaultConfig {
2727
applicationId = "com.example.reply"
2828
minSdk = 24
29-
targetSdk = 33
29+
targetSdk = 34
3030
versionCode = 1
3131
versionName = "1.0"
3232

@@ -57,7 +57,7 @@ android {
5757
compose = true
5858
}
5959
composeOptions {
60-
kotlinCompilerExtensionVersion = "1.4.7"
60+
kotlinCompilerExtensionVersion = "1.5.4"
6161
}
6262
packaging {
6363
resources {
@@ -68,19 +68,19 @@ android {
6868

6969
dependencies {
7070

71-
implementation(platform("androidx.compose:compose-bom:2023.06.00"))
72-
implementation("androidx.activity:activity-compose:1.7.2")
71+
implementation(platform("androidx.compose:compose-bom:2023.10.01"))
72+
implementation("androidx.activity:activity-compose:1.8.1")
7373
implementation("androidx.compose.material:material-icons-extended")
7474
implementation("androidx.compose.material3:material3")
7575
implementation("androidx.compose.material3:material3-window-size-class")
7676
implementation("androidx.compose.ui:ui")
7777
implementation("androidx.compose.ui:ui-graphics")
7878
implementation("androidx.compose.ui:ui-tooling-preview")
79-
implementation("androidx.core:core-ktx:1.10.1")
79+
implementation("androidx.core:core-ktx:1.12.0")
8080
implementation("androidx.lifecycle:lifecycle-runtime-ktx:${rootProject.extra["lifecycle_version"]}")
8181
implementation("androidx.lifecycle:lifecycle-viewmodel-compose:${rootProject.extra["lifecycle_version"]}")
8282

83-
androidTestImplementation(platform("androidx.compose:compose-bom:2023.06.00"))
83+
androidTestImplementation(platform("androidx.compose:compose-bom:2023.10.01"))
8484
androidTestImplementation("androidx.compose.ui:ui-test-junit4")
8585
androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")
8686
androidTestImplementation("androidx.test.ext:junit:1.1.5")

app/src/main/java/com/example/reply/MainActivity.kt

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,20 @@ package com.example.reply
1818
import android.os.Bundle
1919
import androidx.activity.ComponentActivity
2020
import androidx.activity.compose.setContent
21+
import androidx.activity.enableEdgeToEdge
22+
import androidx.compose.foundation.layout.WindowInsets
23+
import androidx.compose.foundation.layout.asPaddingValues
24+
import androidx.compose.foundation.layout.calculateEndPadding
25+
import androidx.compose.foundation.layout.calculateStartPadding
26+
import androidx.compose.foundation.layout.padding
27+
import androidx.compose.foundation.layout.safeDrawing
2128
import androidx.compose.material3.Surface
2229
import androidx.compose.material3.windowsizeclass.ExperimentalMaterial3WindowSizeClassApi
2330
import androidx.compose.material3.windowsizeclass.WindowWidthSizeClass
2431
import androidx.compose.material3.windowsizeclass.calculateWindowSizeClass
2532
import androidx.compose.runtime.Composable
33+
import androidx.compose.ui.Modifier
34+
import androidx.compose.ui.platform.LocalLayoutDirection
2635
import androidx.compose.ui.tooling.preview.Preview
2736
import com.example.reply.ui.ReplyApp
2837
import com.example.reply.ui.theme.ReplyTheme
@@ -31,11 +40,21 @@ class MainActivity : ComponentActivity() {
3140

3241
@OptIn(ExperimentalMaterial3WindowSizeClassApi::class)
3342
override fun onCreate(savedInstanceState: Bundle?) {
43+
enableEdgeToEdge()
3444
super.onCreate(savedInstanceState)
3545

3646
setContent {
3747
ReplyTheme {
38-
Surface {
48+
val layoutDirection = LocalLayoutDirection.current
49+
Surface(
50+
modifier = Modifier
51+
.padding(
52+
start = WindowInsets.safeDrawing.asPaddingValues()
53+
.calculateStartPadding(layoutDirection),
54+
end = WindowInsets.safeDrawing.asPaddingValues()
55+
.calculateEndPadding(layoutDirection)
56+
)
57+
) {
3958
val windowSize = calculateWindowSizeClass(this)
4059

4160
ReplyApp(

app/src/main/java/com/example/reply/data/local/LocalAccountsDataProvider.kt

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,6 @@ import com.example.reply.data.Account
2525
object LocalAccountsDataProvider {
2626
val defaultAccount = Account(-1, -1, -1, -1, R.drawable.avatar_1)
2727

28-
val userAccount =
29-
Account(
30-
id = 1,
31-
firstName = R.string.account_1_first_name,
32-
lastName = R.string.account_1_last_name,
33-
email = R.string.account_1_email,
34-
avatar = R.drawable.avatar_10
35-
)
36-
3728
private val allUserContactAccounts = listOf(
3829
Account(
3930
id = 4L,

app/src/main/java/com/example/reply/ui/ReplyDetailsScreen.kt

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,16 @@ import androidx.compose.foundation.background
2121
import androidx.compose.foundation.layout.Arrangement
2222
import androidx.compose.foundation.layout.Box
2323
import androidx.compose.foundation.layout.Column
24+
import androidx.compose.foundation.layout.PaddingValues
2425
import androidx.compose.foundation.layout.Row
2526
import androidx.compose.foundation.layout.Spacer
27+
import androidx.compose.foundation.layout.WindowInsets
28+
import androidx.compose.foundation.layout.asPaddingValues
2629
import androidx.compose.foundation.layout.fillMaxSize
2730
import androidx.compose.foundation.layout.fillMaxWidth
2831
import androidx.compose.foundation.layout.height
2932
import androidx.compose.foundation.layout.padding
33+
import androidx.compose.foundation.layout.safeDrawing
3034
import androidx.compose.foundation.layout.size
3135
import androidx.compose.foundation.lazy.LazyColumn
3236
import androidx.compose.foundation.shape.CircleShape
@@ -63,11 +67,13 @@ fun ReplyDetailsScreen(
6367
}
6468
Box(modifier = modifier) {
6569
LazyColumn(
70+
contentPadding = PaddingValues(
71+
top = WindowInsets.safeDrawing.asPaddingValues().calculateTopPadding(),
72+
),
6673
modifier = Modifier
6774
.testTag(stringResource(R.string.details_screen))
6875
.fillMaxSize()
6976
.background(color = MaterialTheme.colorScheme.inverseOnSurface)
70-
.padding(top = dimensionResource(R.dimen.detail_card_list_padding_top))
7177
) {
7278
item {
7379
if (isFullScreen) {
@@ -76,7 +82,10 @@ fun ReplyDetailsScreen(
7682
replyUiState,
7783
Modifier
7884
.fillMaxWidth()
79-
.padding(bottom = dimensionResource(R.dimen.detail_topbar_padding_bottom))
85+
.padding(
86+
bottom = dimensionResource(R.dimen.detail_topbar_padding_bottom),
87+
top = dimensionResource(R.dimen.topbar_padding_vertical)
88+
)
8089
)
8190
}
8291
ReplyEmailDetailsCard(
@@ -86,7 +95,7 @@ fun ReplyDetailsScreen(
8695
modifier = if (isFullScreen) {
8796
Modifier.padding(horizontal = dimensionResource(R.dimen.detail_card_outer_padding_horizontal))
8897
} else {
89-
Modifier.padding(end = dimensionResource(R.dimen.detail_card_outer_padding_horizontal))
98+
Modifier
9099
}
91100
)
92101
}

app/src/main/java/com/example/reply/ui/ReplyHomeContent.kt

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,13 @@ import androidx.compose.foundation.layout.Arrangement
2222
import androidx.compose.foundation.layout.Box
2323
import androidx.compose.foundation.layout.Column
2424
import androidx.compose.foundation.layout.Row
25+
import androidx.compose.foundation.layout.WindowInsets
26+
import androidx.compose.foundation.layout.asPaddingValues
2527
import androidx.compose.foundation.layout.fillMaxWidth
2628
import androidx.compose.foundation.layout.padding
29+
import androidx.compose.foundation.layout.safeDrawing
2730
import androidx.compose.foundation.layout.size
31+
import androidx.compose.foundation.layout.statusBars
2832
import androidx.compose.foundation.lazy.LazyColumn
2933
import androidx.compose.foundation.lazy.items
3034
import androidx.compose.foundation.shape.CircleShape
@@ -58,6 +62,7 @@ fun ReplyListOnlyContent(
5862

5963
LazyColumn(
6064
modifier = modifier,
65+
contentPadding = WindowInsets.safeDrawing.asPaddingValues(),
6166
verticalArrangement = Arrangement.spacedBy(
6267
dimensionResource(R.dimen.email_list_item_vertical_spacing)
6368
)
@@ -88,14 +93,15 @@ fun ReplyListAndDetailContent(
8893
modifier: Modifier = Modifier
8994
) {
9095
val emails = replyUiState.currentMailboxEmails
91-
Row(modifier = modifier) {
96+
Row(
97+
modifier = modifier,
98+
horizontalArrangement = Arrangement.SpaceEvenly
99+
) {
92100
LazyColumn(
101+
contentPadding = WindowInsets.statusBars.asPaddingValues(),
93102
modifier = Modifier
94103
.weight(1f)
95-
.padding(
96-
end = dimensionResource(R.dimen.list_and_detail_list_padding_end),
97-
top = dimensionResource(R.dimen.list_and_detail_list_padding_top)
98-
),
104+
.padding(horizontal = dimensionResource(R.dimen.email_list_only_horizontal_padding)),
99105
verticalArrangement = Arrangement.spacedBy(
100106
dimensionResource(R.dimen.email_list_item_vertical_spacing)
101107
)
@@ -113,7 +119,9 @@ fun ReplyListAndDetailContent(
113119
val activity = LocalContext.current as Activity
114120
ReplyDetailsScreen(
115121
replyUiState = replyUiState,
116-
modifier = Modifier.weight(1f),
122+
modifier = Modifier
123+
.weight(1f)
124+
.padding(end = dimensionResource(R.dimen.email_list_only_horizontal_padding)),
117125
onBackPressed = { activity.finish() }
118126
)
119127
}

app/src/main/java/com/example/reply/ui/ReplyHomeScreen.kt

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import androidx.compose.foundation.layout.fillMaxSize
2626
import androidx.compose.foundation.layout.fillMaxWidth
2727
import androidx.compose.foundation.layout.padding
2828
import androidx.compose.foundation.layout.size
29+
import androidx.compose.foundation.layout.statusBarsPadding
2930
import androidx.compose.foundation.layout.width
3031
import androidx.compose.foundation.layout.wrapContentWidth
3132
import androidx.compose.material.icons.Icons
@@ -95,7 +96,10 @@ fun ReplyHomeScreen(
9596
val navigationDrawerContentDescription = stringResource(R.string.navigation_drawer)
9697
PermanentNavigationDrawer(
9798
drawerContent = {
98-
PermanentDrawerSheet(Modifier.width(dimensionResource(R.dimen.drawer_width))) {
99+
PermanentDrawerSheet(
100+
modifier = Modifier.width(dimensionResource(R.dimen.drawer_width)),
101+
drawerContainerColor = MaterialTheme.colorScheme.inverseOnSurface,
102+
) {
99103
NavigationDrawerContent(
100104
selectedDestination = replyUiState.currentMailbox,
101105
onTabPressed = onTabPressed,
@@ -117,7 +121,7 @@ fun ReplyHomeScreen(
117121
onTabPressed = onTabPressed,
118122
onEmailCardPressed = onEmailCardPressed,
119123
navigationItemContentList = navigationItemContentList,
120-
modifier = modifier
124+
modifier = modifier,
121125
)
122126
}
123127
} else {
@@ -129,7 +133,7 @@ fun ReplyHomeScreen(
129133
onTabPressed = onTabPressed,
130134
onEmailCardPressed = onEmailCardPressed,
131135
navigationItemContentList = navigationItemContentList,
132-
modifier = modifier
136+
modifier = modifier,
133137
)
134138
} else {
135139
ReplyDetailsScreen(
@@ -152,16 +156,16 @@ private fun ReplyAppContent(
152156
navigationItemContentList: List<NavigationItemContent>,
153157
modifier: Modifier = Modifier,
154158
) {
155-
Box(modifier = modifier) {
159+
Box(modifier = modifier)
160+
{
156161
Row(modifier = Modifier.fillMaxSize()) {
157162
AnimatedVisibility(visible = navigationType == ReplyNavigationType.NAVIGATION_RAIL) {
158163
val navigationRailContentDescription = stringResource(R.string.navigation_rail)
159164
ReplyNavigationRail(
160165
currentTab = replyUiState.currentMailbox,
161166
onTabPressed = onTabPressed,
162167
navigationItemContentList = navigationItemContentList,
163-
modifier = Modifier
164-
.testTag(navigationRailContentDescription)
168+
modifier = Modifier.testTag(navigationRailContentDescription)
165169
)
166170
}
167171
Column(
@@ -173,16 +177,17 @@ private fun ReplyAppContent(
173177
ReplyListAndDetailContent(
174178
replyUiState = replyUiState,
175179
onEmailCardPressed = onEmailCardPressed,
176-
modifier = Modifier.weight(1f),
180+
modifier = Modifier
181+
.statusBarsPadding()
182+
.weight(1f),
177183
)
178184
} else {
179185
ReplyListOnlyContent(
180186
replyUiState = replyUiState,
181187
onEmailCardPressed = onEmailCardPressed,
182-
modifier = Modifier.weight(1f)
183-
.padding(
184-
horizontal = dimensionResource(R.dimen.email_list_only_horizontal_padding)
185-
)
188+
modifier = Modifier
189+
.weight(1f)
190+
.padding(horizontal = dimensionResource(R.dimen.email_list_only_horizontal_padding))
186191
)
187192
}
188193
AnimatedVisibility(
@@ -299,8 +304,7 @@ private fun NavigationDrawerHeader(
299304
ReplyProfileImage(
300305
drawableResource = LocalAccountsDataProvider.defaultAccount.avatar,
301306
description = stringResource(id = R.string.profile),
302-
modifier = Modifier
303-
.size(dimensionResource(R.dimen.profile_image_size))
307+
modifier = Modifier.size(dimensionResource(R.dimen.profile_image_size))
304308
)
305309
}
306310
}

app/src/main/java/com/example/reply/ui/theme/Theme.kt

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,12 @@ import android.app.Activity
2020
import android.os.Build
2121
import androidx.compose.foundation.isSystemInDarkTheme
2222
import androidx.compose.material3.MaterialTheme
23-
import androidx.compose.material3.lightColorScheme
2423
import androidx.compose.material3.darkColorScheme
2524
import androidx.compose.material3.dynamicDarkColorScheme
2625
import androidx.compose.material3.dynamicLightColorScheme
26+
import androidx.compose.material3.lightColorScheme
2727
import androidx.compose.runtime.Composable
2828
import androidx.compose.runtime.SideEffect
29-
import androidx.compose.ui.graphics.toArgb
3029
import androidx.compose.ui.platform.LocalContext
3130
import androidx.compose.ui.platform.LocalView
3231
import androidx.core.view.WindowCompat
@@ -114,12 +113,12 @@ fun ReplyTheme(
114113
darkTheme -> DarkColorScheme
115114
else -> LightColorScheme
116115
}
116+
117117
val view = LocalView.current
118118
if (!view.isInEditMode) {
119119
SideEffect {
120120
val window = (view.context as Activity).window
121-
window.statusBarColor = colorScheme.primary.toArgb()
122-
WindowCompat.getInsetsController(window, view).isAppearanceLightStatusBars = darkTheme
121+
WindowCompat.getInsetsController(window, view).isAppearanceLightStatusBars = !darkTheme
123122
}
124123
}
125124

-345 KB
Binary file not shown.
-41.5 KB
Binary file not shown.

0 commit comments

Comments
 (0)