Skip to content

Commit ab7d1a4

Browse files
authored
Added ConnectivityWidget connecting animation & refactored gesturesDisabled function. (#337)
1 parent 7ee52b5 commit ab7d1a4

File tree

7 files changed

+116
-73
lines changed

7 files changed

+116
-73
lines changed
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.shifthackz.aisdv1.core.extensions
2+
3+
import androidx.compose.foundation.clickable
4+
import androidx.compose.foundation.interaction.MutableInteractionSource
5+
import androidx.compose.material3.LocalTextStyle
6+
import androidx.compose.runtime.Composable
7+
import androidx.compose.runtime.remember
8+
import androidx.compose.ui.Modifier
9+
import androidx.compose.ui.platform.LocalDensity
10+
import androidx.compose.ui.text.TextStyle
11+
import androidx.compose.ui.text.rememberTextMeasurer
12+
import androidx.compose.ui.unit.Dp
13+
import com.shifthackz.aisdv1.core.common.extensions.EmptyLambda
14+
15+
@Composable
16+
fun Modifier.gesturesDisabled() = clickable(
17+
indication = null,
18+
interactionSource = remember { MutableInteractionSource() },
19+
onClick = EmptyLambda
20+
)
21+
22+
@Composable
23+
fun measureTextWidth(text: String, style: TextStyle = LocalTextStyle.current): Dp {
24+
val textMeasurer = rememberTextMeasurer()
25+
val widthInPixels = textMeasurer.measure(text, style).size.width
26+
return with(LocalDensity.current) { widthInPixels.toDp() }
27+
}

core/ui/src/main/java/com/shifthackz/aisdv1/core/extensions/GestureExtensions.kt

Lines changed: 0 additions & 24 deletions
This file was deleted.

presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/page/FormPageContent.kt

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
package com.shifthackz.aisdv1.presentation.screen.onboarding.page
22

33
import androidx.compose.animation.core.tween
4-
import androidx.compose.foundation.clickable
5-
import androidx.compose.foundation.interaction.MutableInteractionSource
64
import androidx.compose.foundation.layout.Box
75
import androidx.compose.foundation.layout.Column
86
import androidx.compose.foundation.layout.Spacer
@@ -14,14 +12,13 @@ import androidx.compose.material3.Text
1412
import androidx.compose.runtime.Composable
1513
import androidx.compose.runtime.CompositionLocalProvider
1614
import androidx.compose.runtime.DisposableEffect
17-
import androidx.compose.runtime.remember
1815
import androidx.compose.runtime.rememberCoroutineScope
1916
import androidx.compose.ui.Alignment
2017
import androidx.compose.ui.Modifier
2118
import androidx.compose.ui.platform.LocalDensity
2219
import androidx.compose.ui.text.style.TextAlign
2320
import androidx.compose.ui.unit.sp
24-
import com.shifthackz.aisdv1.core.common.extensions.EmptyLambda
21+
import com.shifthackz.aisdv1.core.extensions.gesturesDisabled
2522
import com.shifthackz.aisdv1.presentation.screen.onboarding.buildOnBoardingText
2623
import com.shifthackz.aisdv1.presentation.screen.onboarding.onBoardingDensity
2724
import com.shifthackz.aisdv1.presentation.screen.onboarding.onBoardingPhoneAspectRatio
@@ -74,11 +71,7 @@ fun FormPageContent(
7471
Box(
7572
modifier = Modifier
7673
.aspectRatio(onBoardingPhoneAspectRatio)
77-
.clickable(
78-
indication = null,
79-
interactionSource = remember { MutableInteractionSource() },
80-
onClick = EmptyLambda
81-
),
74+
.gesturesDisabled(),
8275
)
8376
}
8477
}

presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/page/LocalDiffusionPageContent.kt

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
package com.shifthackz.aisdv1.presentation.screen.onboarding.page
22

33
import androidx.compose.foundation.background
4-
import androidx.compose.foundation.clickable
5-
import androidx.compose.foundation.interaction.MutableInteractionSource
64
import androidx.compose.foundation.layout.Box
75
import androidx.compose.foundation.layout.Column
86
import androidx.compose.foundation.layout.Spacer
@@ -12,15 +10,14 @@ import androidx.compose.foundation.layout.fillMaxWidth
1210
import androidx.compose.material3.Text
1311
import androidx.compose.runtime.Composable
1412
import androidx.compose.runtime.CompositionLocalProvider
15-
import androidx.compose.runtime.remember
1613
import androidx.compose.ui.Alignment
1714
import androidx.compose.ui.Modifier
1815
import androidx.compose.ui.graphics.Color
1916
import androidx.compose.ui.platform.LocalDensity
2017
import androidx.compose.ui.text.font.FontWeight
2118
import androidx.compose.ui.text.style.TextAlign
2219
import androidx.compose.ui.unit.sp
23-
import com.shifthackz.aisdv1.core.common.extensions.EmptyLambda
20+
import com.shifthackz.aisdv1.core.extensions.gesturesDisabled
2421
import com.shifthackz.aisdv1.domain.entity.ServerSource
2522
import com.shifthackz.aisdv1.presentation.screen.onboarding.buildOnBoardingText
2623
import com.shifthackz.aisdv1.presentation.screen.onboarding.onBoardingDensity
@@ -73,11 +70,7 @@ fun LocalDiffusionPageContent(
7370
modifier = localModifier
7471
.fillMaxWidth()
7572
.background(Color.Black.copy(alpha = 0.7f))
76-
.clickable(
77-
indication = null,
78-
interactionSource = remember { MutableInteractionSource() },
79-
onClick = EmptyLambda
80-
),
73+
.gesturesDisabled(),
8174
contentAlignment = Alignment.Center,
8275
) {
8376
Box(

presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/page/LookAndFeelPageContent.kt

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package com.shifthackz.aisdv1.presentation.screen.onboarding.page
22

3-
import androidx.compose.foundation.clickable
4-
import androidx.compose.foundation.interaction.MutableInteractionSource
53
import androidx.compose.foundation.layout.Box
64
import androidx.compose.foundation.layout.Column
75
import androidx.compose.foundation.layout.Spacer
@@ -23,7 +21,7 @@ import androidx.compose.ui.platform.LocalDensity
2321
import androidx.compose.ui.text.font.FontWeight
2422
import androidx.compose.ui.text.style.TextAlign
2523
import androidx.compose.ui.unit.sp
26-
import com.shifthackz.aisdv1.core.common.extensions.EmptyLambda
24+
import com.shifthackz.aisdv1.core.extensions.gesturesDisabled
2725
import com.shifthackz.aisdv1.domain.entity.ColorToken
2826
import com.shifthackz.aisdv1.domain.entity.DarkThemeToken
2927
import com.shifthackz.aisdv1.domain.entity.Grid
@@ -95,11 +93,7 @@ fun LookAndFeelPageContent(
9593
Box(
9694
modifier = Modifier
9795
.aspectRatio(onBoardingPhoneAspectRatio)
98-
.clickable(
99-
indication = null,
100-
interactionSource = remember { MutableInteractionSource() },
101-
onClick = EmptyLambda
102-
),
96+
.gesturesDisabled(),
10397
)
10498
}
10599
}

presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/page/ProvidersPageContent.kt

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package com.shifthackz.aisdv1.presentation.screen.onboarding.page
22

3-
import androidx.compose.foundation.clickable
4-
import androidx.compose.foundation.interaction.MutableInteractionSource
53
import androidx.compose.foundation.layout.Box
64
import androidx.compose.foundation.layout.Column
75
import androidx.compose.foundation.layout.Spacer
@@ -23,7 +21,7 @@ import androidx.compose.ui.platform.LocalDensity
2321
import androidx.compose.ui.text.font.FontWeight
2422
import androidx.compose.ui.text.style.TextAlign
2523
import androidx.compose.ui.unit.sp
26-
import com.shifthackz.aisdv1.core.common.extensions.EmptyLambda
24+
import com.shifthackz.aisdv1.core.extensions.gesturesDisabled
2725
import com.shifthackz.aisdv1.domain.entity.ServerSource
2826
import com.shifthackz.aisdv1.presentation.screen.onboarding.buildOnBoardingText
2927
import com.shifthackz.aisdv1.presentation.screen.onboarding.onBoardingDensity
@@ -72,11 +70,7 @@ fun ProviderPageContent(
7270
Box(
7371
modifier = Modifier
7472
.aspectRatio(onBoardingPhoneAspectRatio)
75-
.clickable(
76-
indication = null,
77-
interactionSource = remember { MutableInteractionSource() },
78-
onClick = EmptyLambda
79-
),
73+
.gesturesDisabled(),
8074
)
8175
}
8276
}

presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/connectivity/ConnectivityComposable.kt

Lines changed: 81 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,33 @@
11
package com.shifthackz.aisdv1.presentation.widget.connectivity
22

33
import androidx.compose.animation.AnimatedVisibility
4-
import androidx.compose.foundation.background
4+
import androidx.compose.animation.core.LinearEasing
5+
import androidx.compose.animation.core.RepeatMode
6+
import androidx.compose.animation.core.animateFloat
7+
import androidx.compose.animation.core.infiniteRepeatable
8+
import androidx.compose.animation.core.rememberInfiniteTransition
9+
import androidx.compose.animation.core.tween
510
import androidx.compose.foundation.layout.Column
611
import androidx.compose.foundation.layout.fillMaxWidth
712
import androidx.compose.foundation.layout.padding
8-
import androidx.compose.foundation.shape.RoundedCornerShape
913
import androidx.compose.material3.Text
1014
import androidx.compose.runtime.Composable
15+
import androidx.compose.runtime.getValue
1116
import androidx.compose.ui.Alignment
1217
import androidx.compose.ui.Modifier
18+
import androidx.compose.ui.draw.drawWithCache
19+
import androidx.compose.ui.geometry.CornerRadius
20+
import androidx.compose.ui.geometry.Offset
21+
import androidx.compose.ui.graphics.Brush
22+
import androidx.compose.ui.graphics.Color
23+
import androidx.compose.ui.graphics.TileMode
24+
import androidx.compose.ui.platform.LocalDensity
1325
import androidx.compose.ui.res.stringResource
1426
import androidx.compose.ui.tooling.preview.Preview
1527
import androidx.compose.ui.unit.dp
16-
import com.shifthackz.android.core.mvi.MviComponent
28+
import com.shifthackz.aisdv1.core.extensions.measureTextWidth
1729
import com.shifthackz.aisdv1.presentation.theme.colors
30+
import com.shifthackz.android.core.mvi.MviComponent
1831
import com.shifthackz.catppuccin.palette.Catppuccin
1932
import org.koin.androidx.compose.koinViewModel
2033
import com.shifthackz.aisdv1.core.localization.R as LocalizationR
@@ -35,27 +48,80 @@ private fun ConnectivityWidgetState(
3548
modifier: Modifier = Modifier,
3649
state: ConnectivityState,
3750
) {
51+
val text = stringResource(
52+
id = when (state) {
53+
is ConnectivityState.Connected -> LocalizationR.string.status_connected
54+
is ConnectivityState.Disconnected -> LocalizationR.string.status_disconnected
55+
is ConnectivityState.Uninitialized -> LocalizationR.string.status_communicating
56+
}
57+
)
58+
val infiniteTransition = rememberInfiniteTransition(label = "background")
59+
val targetOffset = with(LocalDensity.current) {
60+
measureTextWidth(text = text).toPx()
61+
}
62+
63+
val offset by infiniteTransition.animateFloat(
64+
initialValue = 0f,
65+
targetValue = targetOffset,
66+
animationSpec = infiniteRepeatable(
67+
animation = tween(durationMillis = 1500, easing = LinearEasing),
68+
repeatMode = RepeatMode.Reverse
69+
),
70+
label = "offset",
71+
)
3872
AnimatedVisibility(visible = state.enabled) {
3973
val uiColor = when (state) {
40-
is ConnectivityState.Connected -> colors(light = Catppuccin.Latte.Green, dark = Catppuccin.Frappe.Green)
41-
is ConnectivityState.Disconnected -> colors(light = Catppuccin.Latte.Red, dark = Catppuccin.Frappe.Red)
42-
is ConnectivityState.Uninitialized -> colors(light = Catppuccin.Latte.Lavender, dark = Catppuccin.Frappe.Lavender)
74+
is ConnectivityState.Connected -> colors(
75+
light = Catppuccin.Latte.Green,
76+
dark = Catppuccin.Frappe.Green
77+
)
78+
79+
is ConnectivityState.Disconnected -> colors(
80+
light = Catppuccin.Latte.Red,
81+
dark = Catppuccin.Frappe.Red
82+
)
83+
84+
is ConnectivityState.Uninitialized -> colors(
85+
light = Catppuccin.Latte.Lavender,
86+
dark = Catppuccin.Frappe.Lavender
87+
)
4388
}
4489
Column(
45-
modifier = modifier.padding(top = 4.dp),
90+
modifier = modifier
91+
.padding(top = 4.dp),
4692
horizontalAlignment = Alignment.CenterHorizontally,
4793
) {
4894
Text(
4995
modifier = Modifier
50-
.background(uiColor, shape = RoundedCornerShape(8.dp))
51-
.padding(vertical = 4.dp, horizontal = 16.dp),
52-
text = stringResource(
53-
id = when (state) {
54-
is ConnectivityState.Connected -> LocalizationR.string.status_connected
55-
is ConnectivityState.Disconnected -> LocalizationR.string.status_disconnected
56-
is ConnectivityState.Uninitialized -> LocalizationR.string.status_communicating
96+
.drawWithCache {
97+
val brushSize = 40f
98+
val brushDefault = Brush.linearGradient(
99+
colors = listOf(uiColor, uiColor)
100+
)
101+
val brushAnimated = Brush.linearGradient(
102+
colors = listOf(
103+
Color.Transparent,
104+
Color.White.copy(alpha = 0.5f),
105+
Color.Transparent,
106+
),
107+
start = Offset(offset, offset),
108+
end = Offset(offset + brushSize, offset + brushSize),
109+
tileMode = TileMode.Clamp,
110+
)
111+
onDrawBehind {
112+
drawRoundRect(
113+
cornerRadius = CornerRadius(8.dp.toPx()),
114+
brush = brushDefault,
115+
)
116+
if (state !is ConnectivityState.Uninitialized) return@onDrawBehind
117+
drawRoundRect(
118+
cornerRadius = CornerRadius(8.dp.toPx()),
119+
brush = brushAnimated,
120+
)
121+
}
57122
}
58-
),
123+
.padding(vertical = 4.dp, horizontal = 16.dp),
124+
text = text,
59125
color = colors(light = Catppuccin.Latte.Base, dark = Catppuccin.Frappe.Base)
60126
)
61127
}

0 commit comments

Comments
 (0)