1616
1717package com.mapcode.onboarding
1818
19- import androidx.compose.foundation.Image
2019import androidx.compose.foundation.layout.*
2120import androidx.compose.foundation.rememberScrollState
2221import androidx.compose.foundation.verticalScroll
@@ -30,11 +29,7 @@ import androidx.compose.ui.Modifier
3029import androidx.compose.ui.draw.alpha
3130import androidx.compose.ui.graphics.Color
3231import androidx.compose.ui.graphics.lerp
33- import androidx.compose.ui.layout.ContentScale
34- import androidx.compose.ui.platform.LocalUriHandler
35- import androidx.compose.ui.res.painterResource
3632import androidx.compose.ui.res.stringResource
37- import androidx.compose.ui.text.buildAnnotatedString
3833import androidx.compose.ui.text.font.FontWeight
3934import androidx.compose.ui.text.style.TextAlign
4035import androidx.compose.ui.tooling.preview.Devices
@@ -63,21 +58,27 @@ import kotlin.math.absoluteValue
6358fun OnboardingScreen (
6459 modifier : Modifier = Modifier ,
6560 viewModel : AppViewModel ,
66- navigator : DestinationsNavigator
61+ navigator : DestinationsNavigator ,
62+ layoutType : OnboardingScreenLayoutType = OnboardingScreenLayoutType .Vertical
6763) {
6864 OnboardingScreen (
6965 modifier = modifier,
7066 onFinishOnboarding = {
7167 viewModel.onFinishOnboarding()
7268 navigator.navigate(MapScreenDestination .route)
7369 navigator.popBackStack()
74- }
70+ },
71+ layoutType = layoutType
7572 )
7673}
7774
7875@OptIn(ExperimentalPagerApi ::class )
7976@Composable
80- private fun OnboardingScreen (modifier : Modifier = Modifier , onFinishOnboarding : () -> Unit ) {
77+ private fun OnboardingScreen (
78+ modifier : Modifier = Modifier ,
79+ onFinishOnboarding : () -> Unit ,
80+ layoutType : OnboardingScreenLayoutType
81+ ) {
8182 val pagerState = rememberPagerState()
8283 val pageColors = pageColors(pagerState.currentPage)
8384
@@ -92,22 +93,8 @@ private fun OnboardingScreen(modifier: Modifier = Modifier, onFinishOnboarding:
9293 .fillMaxSize()
9394 .systemBarsPadding()
9495 ) {
95- val pageModifier = Modifier
96- .padding(start = 32 .dp, end = 32 .dp, top = 16 .dp)
97- .fillMaxSize()
98-
9996 Box (modifier = Modifier .weight(1f )) {
100- HorizontalPager (
101- modifier = Modifier .fillMaxWidth(),
102- count = 2 ,
103- userScrollEnabled = true ,
104- state = pagerState
105- ) { page ->
106- when (page) {
107- 0 -> WelcomePage (modifier = pageModifier, pageColors = pageColors)
108- 1 -> TerritoriesPage (modifier = pageModifier, pageColors = pageColors)
109- }
110- }
97+ Pager (state = pagerState, layoutType = layoutType)
11198
11299 TextButton (
113100 modifier = Modifier
@@ -133,6 +120,49 @@ private fun OnboardingScreen(modifier: Modifier = Modifier, onFinishOnboarding:
133120 }
134121}
135122
123+ @OptIn(ExperimentalPagerApi ::class )
124+ @Composable
125+ private fun Pager (state : PagerState , layoutType : OnboardingScreenLayoutType ) {
126+ val pageModifier = Modifier
127+ .padding(start = 32 .dp, end = 32 .dp, top = 16 .dp)
128+ .fillMaxSize()
129+
130+ val pageColors = pageColors(state.currentPage)
131+
132+ HorizontalPager (
133+ modifier = Modifier .fillMaxWidth(),
134+ count = 2 ,
135+ userScrollEnabled = true ,
136+ state = state
137+ ) { page ->
138+ when (layoutType) {
139+ OnboardingScreenLayoutType .Vertical ->
140+ when (page) {
141+ 0 -> WelcomePageVertical (
142+ modifier = pageModifier,
143+ pageColors = pageColors
144+ )
145+ 1 -> TerritoriesPage (
146+ modifier = pageModifier,
147+ pageColors = pageColors
148+ )
149+ }
150+
151+ OnboardingScreenLayoutType .Horizontal ->
152+ when (page) {
153+ 0 -> WelcomePageHorizontal (
154+ modifier = pageModifier,
155+ pageColors = pageColors
156+ )
157+ 1 -> TerritoriesPage (
158+ modifier = pageModifier,
159+ pageColors = pageColors
160+ )
161+ }
162+ }
163+ }
164+ }
165+
136166@Composable
137167private fun calculatePageColor (currentPage : Int , pageOffset : Float ): Color {
138168 val currentPageColor = pageColors(currentPage).background
@@ -150,7 +180,11 @@ private fun calculatePageColor(currentPage: Int, pageOffset: Float): Color {
150180@Composable
151181private fun OnboardingScreenPreview () {
152182 MapcodeTheme {
153- OnboardingScreen (modifier = Modifier .fillMaxSize(), onFinishOnboarding = {})
183+ OnboardingScreen (
184+ modifier = Modifier .fillMaxSize(),
185+ onFinishOnboarding = {},
186+ layoutType = OnboardingScreenLayoutType .Vertical
187+ )
154188 }
155189}
156190
@@ -236,91 +270,6 @@ private fun PreviousPageButton(modifier: Modifier = Modifier, onClick: () -> Uni
236270 }
237271}
238272
239- @Composable
240- private fun PageButton (modifier : Modifier , pageColors : PageColors , onClick : () -> Unit ) {
241- val contentColor = MaterialTheme .colors.contentColorFor(pageColors.backgroundDark)
242-
243- val buttonColors = ButtonDefaults .buttonColors(
244- backgroundColor = pageColors.backgroundDark,
245- contentColor = contentColor
246- )
247-
248- Button (
249- modifier = modifier,
250- onClick = onClick,
251- colors = buttonColors
252- ) {
253- Text (stringResource(R .string.onboarding_welcome_page_learn_more_button))
254- }
255- }
256-
257- @Composable
258- private fun WelcomePage (modifier : Modifier , pageColors : PageColors ) {
259- Column (modifier) {
260- Image (
261- modifier = Modifier
262- .align(Alignment .CenterHorizontally )
263- .weight(0.3f ),
264- painter = painterResource(R .mipmap.ic_launcher_foreground),
265- contentDescription = null ,
266- contentScale = ContentScale .FillHeight
267- )
268-
269- Text (
270- modifier = Modifier
271- .fillMaxWidth()
272- .weight(0.1f ),
273- text = stringResource(R .string.onboarding_welcome_page_title),
274- style = MaterialTheme .typography.h4,
275- textAlign = TextAlign .Center ,
276- color = pageColors.foreground
277- )
278-
279- Column (
280- modifier = Modifier
281- .weight(0.4f )
282- .verticalScroll(state = rememberScrollState())
283- ) {
284- val text = buildAnnotatedString {
285- pushStyle(
286- MaterialTheme .typography.subtitle1
287- .copy(fontWeight = FontWeight .W600 , color = pageColors.foreground)
288- .toSpanStyle()
289- )
290- append(stringResource(R .string.onboarding_welcome_page_text_1))
291- pop()
292-
293- append(" \n\n " )
294-
295- val normalTextColor = MaterialTheme .colors.contentColorFor(pageColors.background)
296- val normalTextStyle =
297- MaterialTheme .typography.body1.copy(color = normalTextColor).toSpanStyle()
298-
299- pushStyle(normalTextStyle)
300- append(stringResource(R .string.onboarding_welcome_page_text_2))
301- pop()
302- }
303-
304- Text (
305- modifier = Modifier .fillMaxWidth(),
306- text = text,
307- style = MaterialTheme .typography.body1
308- )
309- }
310-
311- Spacer (Modifier .height(16 .dp))
312-
313- val learnMoreUrl = stringResource(R .string.onboarding_welcome_page_learn_more_url)
314- val uriHandler = LocalUriHandler .current
315-
316- PageButton (
317- modifier = Modifier .align(Alignment .CenterHorizontally ),
318- pageColors = pageColors,
319- onClick = { uriHandler.openUri(learnMoreUrl) }
320- )
321- }
322- }
323-
324273@Composable
325274private fun TerritoriesPage (modifier : Modifier , pageColors : PageColors ) {
326275 Column (modifier) {
@@ -378,6 +327,21 @@ private fun TerritoriesPagePreview() {
378327 }
379328}
380329
330+ @Preview(widthDp = 800 , heightDp = 300 )
331+ @Composable
332+ private fun TerritoriesPageLandscapePreview () {
333+ MapcodeTheme {
334+ Surface (color = pageColors(1 ).background) {
335+ TerritoriesPage (
336+ modifier = Modifier
337+ .fillMaxSize()
338+ .padding(16 .dp),
339+ pageColors = pageColors(1 )
340+ )
341+ }
342+ }
343+ }
344+
381345@Composable
382346private fun TerritoriesPageButtons (modifier : Modifier = Modifier , pageColors : PageColors ) {
383347 val mapcodes: List <Mapcode > = remember { MapcodeUtils .GoogleHqMapcodes () }
0 commit comments