Skip to content

Commit c69b73b

Browse files
Merge pull request android#386 from JoseAlcerreca/jetchat_alpha12
[Jetchat] Updates to alpha12
2 parents 93d354d + 283ff4e commit c69b73b

File tree

17 files changed

+124
-94
lines changed

17 files changed

+124
-94
lines changed

Jetchat/app/build.gradle

+7
Original file line numberDiff line numberDiff line change
@@ -92,9 +92,12 @@ dependencies {
9292
implementation Libs.Kotlin.stdlib
9393
implementation Libs.Coroutines.android
9494

95+
96+
implementation Libs.AndroidX.Activity.activityCompose
9597
implementation Libs.AndroidX.coreKtx
9698
implementation Libs.AndroidX.appcompat
9799
implementation Libs.AndroidX.Lifecycle.livedata
100+
implementation Libs.AndroidX.Lifecycle.viewModelCompose
98101
implementation Libs.AndroidX.Navigation.fragment
99102
implementation Libs.AndroidX.Navigation.uiKtx
100103
implementation Libs.material
@@ -116,4 +119,8 @@ dependencies {
116119
androidTestImplementation Libs.AndroidX.Test.rules
117120
androidTestImplementation Libs.AndroidX.Test.Ext.junit
118121
androidTestImplementation Libs.AndroidX.Compose.uiTest
122+
123+
// FIXME: Temporary for alpha12
124+
androidTestImplementation Libs.AndroidX.Activity.activityCompose
125+
119126
}

Jetchat/app/src/androidTest/java/com/example/compose/jetchat/ConversationTest.kt

+6-5
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package com.example.compose.jetchat
1818

19+
import androidx.activity.ComponentActivity
1920
import androidx.compose.runtime.Providers
2021
import androidx.compose.runtime.collectAsState
2122
import androidx.compose.ui.geometry.Offset
@@ -28,12 +29,12 @@ import androidx.compose.ui.test.onNodeWithText
2829
import androidx.compose.ui.test.performClick
2930
import androidx.compose.ui.test.performGesture
3031
import androidx.compose.ui.test.swipe
31-
import com.example.compose.jetchat.conversation.AmbientBackPressedDispatcher
3232
import com.example.compose.jetchat.conversation.ConversationContent
3333
import com.example.compose.jetchat.conversation.ConversationTestTag
34+
import com.example.compose.jetchat.conversation.LocalBackPressedDispatcher
3435
import com.example.compose.jetchat.data.exampleUiState
3536
import com.example.compose.jetchat.theme.JetchatTheme
36-
import dev.chrisbanes.accompanist.insets.AmbientWindowInsets
37+
import dev.chrisbanes.accompanist.insets.LocalWindowInsets
3738
import dev.chrisbanes.accompanist.insets.WindowInsets
3839
import kotlinx.coroutines.flow.MutableStateFlow
3940
import org.junit.Before
@@ -46,7 +47,7 @@ import org.junit.Test
4647
class ConversationTest {
4748

4849
@get:Rule
49-
val composeTestRule = createAndroidComposeRule<NavActivity>()
50+
val composeTestRule = createAndroidComposeRule<ComponentActivity>()
5051

5152
private val themeIsDark = MutableStateFlow(false)
5253

@@ -59,8 +60,8 @@ class ConversationTest {
5960
composeTestRule.setContent {
6061
val onBackPressedDispatcher = composeTestRule.activity.onBackPressedDispatcher
6162
Providers(
62-
AmbientBackPressedDispatcher provides onBackPressedDispatcher,
63-
AmbientWindowInsets provides windowInsets
63+
LocalBackPressedDispatcher provides onBackPressedDispatcher,
64+
LocalWindowInsets provides windowInsets
6465
) {
6566
JetchatTheme(isDarkTheme = themeIsDark.collectAsState(false).value) {
6667
ConversationContent(

Jetchat/app/src/androidTest/java/com/example/compose/jetchat/UserInputTest.kt

+4-4
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,12 @@ import androidx.compose.ui.test.onNodeWithText
3333
import androidx.compose.ui.test.performClick
3434
import androidx.compose.ui.test.performTextInput
3535
import androidx.test.espresso.Espresso
36-
import com.example.compose.jetchat.conversation.AmbientBackPressedDispatcher
3736
import com.example.compose.jetchat.conversation.ConversationContent
3837
import com.example.compose.jetchat.conversation.KeyboardShownKey
38+
import com.example.compose.jetchat.conversation.LocalBackPressedDispatcher
3939
import com.example.compose.jetchat.data.exampleUiState
4040
import com.example.compose.jetchat.theme.JetchatTheme
41-
import dev.chrisbanes.accompanist.insets.AmbientWindowInsets
41+
import dev.chrisbanes.accompanist.insets.LocalWindowInsets
4242
import dev.chrisbanes.accompanist.insets.WindowInsets
4343
import org.junit.Before
4444
import org.junit.Ignore
@@ -65,8 +65,8 @@ class UserInputTest {
6565
val onBackPressedDispatcher = composeTestRule.activity.onBackPressedDispatcher
6666
composeTestRule.setContent {
6767
Providers(
68-
AmbientBackPressedDispatcher provides onBackPressedDispatcher,
69-
AmbientWindowInsets provides windowInsets,
68+
LocalBackPressedDispatcher provides onBackPressedDispatcher,
69+
LocalWindowInsets provides windowInsets,
7070
) {
7171
JetchatTheme {
7272
ConversationContent(

Jetchat/app/src/main/java/com/example/compose/jetchat/NavActivity.kt

+25-4
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,25 @@
1717
package com.example.compose.jetchat
1818

1919
import android.os.Bundle
20+
import androidx.activity.compose.setContent
2021
import androidx.activity.viewModels
2122
import androidx.appcompat.app.AppCompatActivity
2223
import androidx.compose.material.rememberScaffoldState
2324
import androidx.compose.runtime.Providers
2425
import androidx.compose.runtime.livedata.observeAsState
25-
import androidx.compose.ui.platform.setContent
26+
import androidx.compose.runtime.remember
27+
import androidx.compose.ui.node.Ref
28+
import androidx.compose.ui.platform.LocalView
29+
import androidx.compose.ui.platform.compositionContext
30+
import androidx.compose.ui.platform.findViewTreeCompositionContext
2631
import androidx.compose.ui.viewinterop.AndroidViewBinding
2732
import androidx.core.os.bundleOf
2833
import androidx.core.view.WindowCompat
2934
import androidx.navigation.findNavController
35+
import androidx.viewbinding.ViewBinding
3036
import com.example.compose.jetchat.components.JetchatScaffold
31-
import com.example.compose.jetchat.conversation.AmbientBackPressedDispatcher
3237
import com.example.compose.jetchat.conversation.BackPressHandler
38+
import com.example.compose.jetchat.conversation.LocalBackPressedDispatcher
3339
import com.example.compose.jetchat.databinding.ContentMainBinding
3440
import dev.chrisbanes.accompanist.insets.ProvideWindowInsets
3541

@@ -50,7 +56,7 @@ class NavActivity : AppCompatActivity() {
5056
// Provide WindowInsets to our content. We don't want to consume them, so that
5157
// they keep being pass down the view hierarchy (since we're using fragments).
5258
ProvideWindowInsets(consumeWindowInsets = false) {
53-
Providers(AmbientBackPressedDispatcher provides this.onBackPressedDispatcher) {
59+
Providers(LocalBackPressedDispatcher provides this.onBackPressedDispatcher) {
5460
val scaffoldState = rememberScaffoldState()
5561

5662
val openDrawerEvent = viewModel.drawerShouldBeOpened.observeAsState()
@@ -82,8 +88,23 @@ class NavActivity : AppCompatActivity() {
8288
scaffoldState.drawerState.close()
8389
}
8490
) {
91+
// Workaround for b/178174718 and b/179181757
8592
// Inflate the XML layout using View Binding:
86-
AndroidViewBinding(ContentMainBinding::inflate)
93+
val bindingRef = remember { Ref<ViewBinding>() }
94+
val currentView = LocalView.current
95+
96+
AndroidViewBinding({ inflater, parent, attachToParent ->
97+
if (bindingRef.value == null) {
98+
val binding: ViewBinding =
99+
ContentMainBinding.inflate(inflater, parent, attachToParent)
100+
bindingRef.value = binding
101+
binding.root.compositionContext =
102+
currentView.findViewTreeCompositionContext()
103+
}
104+
bindingRef.value as ViewBinding
105+
})
106+
// End of workaround for b/178174718
107+
// AndroidViewBinding(ContentMainBinding::inflate)
87108
}
88109
}
89110
}

Jetchat/app/src/main/java/com/example/compose/jetchat/components/BaseLineHeightModifier.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,9 @@ data class BaselineHeightModifier(
5252
val firstBaseline = textPlaceable[FirstBaseline]
5353
val lastBaseline = textPlaceable[LastBaseline]
5454

55-
val height = heightFromBaseline.toIntPx() + lastBaseline - firstBaseline
55+
val height = heightFromBaseline.roundToPx() + lastBaseline - firstBaseline
5656
return layout(constraints.maxWidth, height) {
57-
val topY = heightFromBaseline.toIntPx() - firstBaseline
57+
val topY = heightFromBaseline.roundToPx() - firstBaseline
5858
textPlaceable.place(0, topY)
5959
}
6060
}

Jetchat/app/src/main/java/com/example/compose/jetchat/components/JetchatAppBar.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ import androidx.compose.material.TopAppBar
3030
import androidx.compose.runtime.Composable
3131
import androidx.compose.ui.Modifier
3232
import androidx.compose.ui.graphics.Color
33+
import androidx.compose.ui.res.painterResource
3334
import androidx.compose.ui.res.stringResource
34-
import androidx.compose.ui.res.vectorResource
3535
import androidx.compose.ui.tooling.preview.Preview
3636
import androidx.compose.ui.unit.dp
3737
import com.example.compose.jetchat.R
@@ -64,7 +64,7 @@ fun JetchatAppBar(
6464
title = { Row { title() } }, // https://issuetracker.google.com/168793068
6565
navigationIcon = {
6666
Image(
67-
imageVector = vectorResource(id = R.drawable.ic_jetchat),
67+
painter = painterResource(id = R.drawable.ic_jetchat),
6868
contentDescription = stringResource(id = R.string.back),
6969
modifier = Modifier
7070
.clickable(onClick = onNavIconPressed)

Jetchat/app/src/main/java/com/example/compose/jetchat/components/JetchatDrawer.kt

+11-12
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,11 @@ import androidx.compose.foundation.layout.preferredHeight
3030
import androidx.compose.foundation.layout.preferredSize
3131
import androidx.compose.foundation.layout.preferredWidth
3232
import androidx.compose.foundation.shape.CircleShape
33-
import androidx.compose.material.AmbientContentAlpha
34-
import androidx.compose.material.AmbientContentColor
3533
import androidx.compose.material.ContentAlpha
3634
import androidx.compose.material.Divider
3735
import androidx.compose.material.Icon
36+
import androidx.compose.material.LocalContentAlpha
37+
import androidx.compose.material.LocalContentColor
3838
import androidx.compose.material.MaterialTheme
3939
import androidx.compose.material.Surface
4040
import androidx.compose.material.Text
@@ -44,8 +44,7 @@ import androidx.compose.ui.Alignment.Companion.CenterVertically
4444
import androidx.compose.ui.Modifier
4545
import androidx.compose.ui.draw.clip
4646
import androidx.compose.ui.layout.ContentScale
47-
import androidx.compose.ui.res.imageResource
48-
import androidx.compose.ui.res.vectorResource
47+
import androidx.compose.ui.res.painterResource
4948
import androidx.compose.ui.tooling.preview.Preview
5049
import androidx.compose.ui.unit.dp
5150
import com.example.compose.jetchat.R
@@ -75,20 +74,20 @@ fun ColumnScope.JetchatDrawer(onProfileClicked: (String) -> Unit, onChatClicked:
7574
private fun DrawerHeader() {
7675
Row(modifier = Modifier.padding(16.dp), verticalAlignment = CenterVertically) {
7776
Image(
78-
vectorResource(id = R.drawable.ic_jetchat),
77+
painter = painterResource(id = R.drawable.ic_jetchat),
7978
contentDescription = null,
8079
modifier = Modifier.preferredSize(24.dp)
8180
)
8281
Image(
83-
vectorResource(id = R.drawable.jetchat_logo),
82+
painter = painterResource(id = R.drawable.jetchat_logo),
8483
contentDescription = null,
8584
modifier = Modifier.padding(start = 8.dp)
8685
)
8786
}
8887
}
8988
@Composable
9089
private fun DrawerItemHeader(text: String) {
91-
Providers(AmbientContentAlpha provides ContentAlpha.medium) {
90+
Providers(LocalContentAlpha provides ContentAlpha.medium) {
9291
Text(text, style = MaterialTheme.typography.caption, modifier = Modifier.padding(16.dp))
9392
}
9493
}
@@ -116,16 +115,16 @@ private fun ChatItem(text: String, selected: Boolean, onChatClicked: () -> Unit)
116115
MaterialTheme.colors.onSurface.copy(alpha = ContentAlpha.medium)
117116
}
118117
Icon(
119-
vectorResource(id = R.drawable.ic_jetchat),
118+
painter = painterResource(id = R.drawable.ic_jetchat),
120119
tint = iconTint,
121120
modifier = Modifier.padding(8.dp),
122121
contentDescription = null
123122
)
124-
Providers(AmbientContentAlpha provides ContentAlpha.medium) {
123+
Providers(LocalContentAlpha provides ContentAlpha.medium) {
125124
Text(
126125
text,
127126
style = MaterialTheme.typography.body2,
128-
color = if (selected) MaterialTheme.colors.primary else AmbientContentColor.current,
127+
color = if (selected) MaterialTheme.colors.primary else LocalContentColor.current,
129128
modifier = Modifier.padding(8.dp)
130129
)
131130
}
@@ -143,11 +142,11 @@ private fun ProfileItem(text: String, @DrawableRes profilePic: Int?, onProfileCl
143142
.clickable(onClick = onProfileClicked),
144143
verticalAlignment = CenterVertically
145144
) {
146-
Providers(AmbientContentAlpha provides ContentAlpha.medium) {
145+
Providers(LocalContentAlpha provides ContentAlpha.medium) {
147146
val widthPaddingModifier = Modifier.preferredWidth(24.dp).padding(8.dp)
148147
if (profilePic != null) {
149148
Image(
150-
imageResource(id = profilePic),
149+
painter = painterResource(id = profilePic),
151150
modifier = widthPaddingModifier.then(Modifier.clip(CircleShape)),
152151
contentScale = ContentScale.Crop,
153152
contentDescription = null

Jetchat/app/src/main/java/com/example/compose/jetchat/conversation/BackHandler.kt

+8-8
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,16 @@ package com.example.compose.jetchat.conversation
1818

1919
import androidx.activity.OnBackPressedCallback
2020
import androidx.activity.OnBackPressedDispatcher
21-
import androidx.compose.runtime.Ambient
2221
import androidx.compose.runtime.Composable
22+
import androidx.compose.runtime.CompositionLocal
2323
import androidx.compose.runtime.DisposableEffect
2424
import androidx.compose.runtime.getValue
2525
import androidx.compose.runtime.remember
2626
import androidx.compose.runtime.rememberUpdatedState
27-
import androidx.compose.runtime.staticAmbientOf
27+
import androidx.compose.runtime.staticCompositionLocalOf
2828

2929
/**
30-
* This [Composable] can be used with a [AmbientBackPressedDispatcher] to intercept a back press.
30+
* This [Composable] can be used with a [LocalBackPressedDispatcher] to intercept a back press.
3131
*
3232
* @param onBackPressed (Event) What to do when back is intercepted
3333
*
@@ -46,7 +46,7 @@ fun BackPressHandler(onBackPressed: () -> Unit) {
4646
}
4747
}
4848

49-
val backDispatcher = AmbientBackPressedDispatcher.current
49+
val backDispatcher = LocalBackPressedDispatcher.current
5050

5151
// Whenever there's a new dispatcher set up the callback
5252
DisposableEffect(backDispatcher) {
@@ -59,13 +59,13 @@ fun BackPressHandler(onBackPressed: () -> Unit) {
5959
}
6060

6161
/**
62-
* This [Ambient] is used to provide an [OnBackPressedDispatcher]:
62+
* This [CompositionLocal] is used to provide an [OnBackPressedDispatcher]:
6363
*
6464
* ```
65-
* Providers(AmbientBackPressedDispatcher provides requireActivity().onBackPressedDispatcher) { }
65+
* Providers(LocalBackPressedDispatcher provides requireActivity().onBackPressedDispatcher) { }
6666
* ```
6767
*
6868
* and setting up the callbacks with [BackPressHandler].
6969
*/
70-
val AmbientBackPressedDispatcher =
71-
staticAmbientOf<OnBackPressedDispatcher> { error("No Back Dispatcher provided") }
70+
val LocalBackPressedDispatcher =
71+
staticCompositionLocalOf<OnBackPressedDispatcher> { error("No Back Dispatcher provided") }

0 commit comments

Comments
 (0)