Skip to content

Commit 0cb4bdc

Browse files
authored
feat: Update my kSuite button color (#323)
2 parents d071e66 + 6dbcfeb commit 0cb4bdc

File tree

11 files changed

+99
-99
lines changed

11 files changed

+99
-99
lines changed

MyKSuite/src/main/java/com/infomaniak/core/myksuite/ui/components/MyKSuiteChips.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
package com.infomaniak.core.myksuite.ui.components
1919

2020
import android.content.res.Configuration
21+
import androidx.annotation.ColorInt
2122
import androidx.annotation.DrawableRes
2223
import androidx.annotation.StringRes
2324
import androidx.compose.foundation.Image
@@ -40,7 +41,7 @@ import com.infomaniak.core.myksuite.ui.theme.Margin
4041
import com.infomaniak.core.myksuite.ui.theme.MyKSuiteTheme
4142

4243
@Composable
43-
fun MyKSuiteChip(modifier: Modifier = Modifier, tier: MyKSuiteTier, backgroundColor: Int? = null) {
44+
fun MyKSuiteChip(modifier: Modifier = Modifier, tier: MyKSuiteTier, @ColorInt backgroundColor: Int? = null) {
4445
Image(
4546
modifier = modifier
4647
.background(

MyKSuite/src/main/java/com/infomaniak/core/myksuite/ui/components/MyKSuitePrimaryButton.kt

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,11 @@ import android.content.res.Configuration
2121
import androidx.compose.foundation.layout.Arrangement
2222
import androidx.compose.foundation.layout.Column
2323
import androidx.compose.foundation.layout.height
24-
import androidx.compose.material3.Button
25-
import androidx.compose.material3.Surface
26-
import androidx.compose.material3.Text
24+
import androidx.compose.material3.*
2725
import androidx.compose.runtime.Composable
2826
import androidx.compose.ui.Modifier
2927
import androidx.compose.ui.graphics.Shape
3028
import androidx.compose.ui.tooling.preview.Preview
31-
import com.infomaniak.core.myksuite.ui.screens.components.MyKSuiteButtonColors
3229
import com.infomaniak.core.myksuite.ui.screens.components.MyKSuiteButtonType
3330
import com.infomaniak.core.myksuite.ui.theme.Dimens
3431
import com.infomaniak.core.myksuite.ui.theme.Margin
@@ -39,13 +36,15 @@ import com.infomaniak.core.myksuite.ui.theme.Typography
3936
internal fun MyKSuitePrimaryButton(
4037
modifier: Modifier = Modifier,
4138
text: String,
42-
colors: @Composable () -> MyKSuiteButtonColors,
4339
shape: Shape,
4440
onClick: () -> Unit,
4541
) {
4642
Button(
4743
modifier = modifier.height(Dimens.buttonHeight),
48-
colors = colors().buttonColors(),
44+
colors = ButtonDefaults.buttonColors(
45+
containerColor = MaterialTheme.colorScheme.primary,
46+
contentColor = MaterialTheme.colorScheme.onPrimary,
47+
),
4948
shape = shape,
5049
onClick = onClick,
5150
) {
@@ -63,13 +62,11 @@ private fun Preview() {
6362
MyKSuitePrimaryButton(
6463
text = "Lorem",
6564
shape = MyKSuiteButtonType.Mail.shape,
66-
colors = MyKSuiteButtonType.Mail.colors,
6765
onClick = {},
6866
)
6967
MyKSuitePrimaryButton(
7068
text = "Close",
7169
shape = MyKSuiteButtonType.Drive.shape,
72-
colors = MyKSuiteButtonType.Drive.colors,
7370
onClick = {},
7471
)
7572
}

MyKSuite/src/main/java/com/infomaniak/core/myksuite/ui/screens/MyKSuiteDashboardScreen.kt

Lines changed: 28 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,9 @@ import com.infomaniak.core.myksuite.R
4141
import com.infomaniak.core.myksuite.ui.components.*
4242
import com.infomaniak.core.myksuite.ui.network.ApiRoutes
4343
import com.infomaniak.core.myksuite.ui.screens.components.*
44-
import com.infomaniak.core.myksuite.ui.theme.*
44+
import com.infomaniak.core.myksuite.ui.theme.Dimens
45+
import com.infomaniak.core.myksuite.ui.theme.LocalMyKSuiteColors
46+
import com.infomaniak.core.myksuite.ui.theme.Margin
4547
import com.infomaniak.core.myksuite.ui.theme.Typography
4648
import com.infomaniak.core.useravatar.AvatarData
4749
import com.infomaniak.core.useravatar.exposed.UserAvatar
@@ -52,34 +54,32 @@ import java.util.Date
5254

5355
@Composable
5456
fun MyKSuiteDashboardScreen(dashboardScreenData: () -> MyKSuiteDashboardScreenData, onClose: () -> Unit = {}) {
55-
MyKSuiteTheme {
56-
Scaffold(
57-
topBar = { TopAppBar(onClose) },
58-
containerColor = LocalMyKSuiteColors.current.onPrimaryButton,
59-
) { paddingValues ->
60-
Box(
61-
Modifier
62-
.fillMaxHeight()
63-
.verticalScroll(rememberScrollState()),
64-
) {
65-
Image(
66-
modifier = Modifier
67-
.fillMaxWidth()
68-
.fillMaxHeight(0.45f),
69-
contentScale = ContentScale.FillBounds,
70-
imageVector = ImageVector.vectorResource(R.drawable.illu_dashboard_background),
71-
contentDescription = null,
72-
)
73-
Column(Modifier.padding(paddingValues), verticalArrangement = Arrangement.spacedBy(Margin.Large)) {
74-
val paddedModifier = Modifier.padding(horizontal = Margin.Medium)
75-
SubscriptionInfoCard(paddedModifier, dashboardScreenData)
57+
Scaffold(
58+
topBar = { TopAppBar(onClose) },
59+
containerColor = LocalMyKSuiteColors.current.onPrimaryButton,
60+
) { paddingValues ->
61+
Box(
62+
Modifier
63+
.fillMaxHeight()
64+
.verticalScroll(rememberScrollState()),
65+
) {
66+
Image(
67+
modifier = Modifier
68+
.fillMaxWidth()
69+
.fillMaxHeight(0.45f),
70+
contentScale = ContentScale.FillBounds,
71+
imageVector = ImageVector.vectorResource(R.drawable.illu_dashboard_background),
72+
contentDescription = null,
73+
)
74+
Column(Modifier.padding(paddingValues), verticalArrangement = Arrangement.spacedBy(Margin.Large)) {
75+
val paddedModifier = Modifier.padding(horizontal = Margin.Medium)
76+
SubscriptionInfoCard(paddedModifier, dashboardScreenData)
7677

77-
if (dashboardScreenData().myKSuiteTier == MyKSuiteTier.Free) {
78-
// TODO: Add this line when we'll have In-app payments
79-
// MyKSuitePlusPromotionCard(paddedModifier) {}
80-
} else {
81-
AdvantagesCard(paddedModifier)
82-
}
78+
if (dashboardScreenData().myKSuiteTier == MyKSuiteTier.Free) {
79+
// TODO: Add this line when we'll have In-app payments
80+
// MyKSuitePlusPromotionCard(paddedModifier) {}
81+
} else {
82+
AdvantagesCard(paddedModifier)
8383
}
8484
}
8585
}
@@ -237,12 +237,6 @@ private fun MyKSuitePlusPromotionCard(modifier: Modifier = Modifier, onButtonCli
237237
MyKSuitePrimaryButton(
238238
modifier = Modifier.fillMaxWidth(),
239239
text = stringResource(R.string.myKSuiteDashboardFreeTrialButton),
240-
colors = {
241-
MyKSuiteButtonColors(
242-
containerColor = localColors.primaryButton,
243-
contentColor = localColors.onPrimaryButton,
244-
)
245-
},
246240
shape = RoundedCornerShape(Dimens.largeCornerRadius),
247241
onClick = onButtonClicked,
248242
)

MyKSuite/src/main/java/com/infomaniak/core/myksuite/ui/screens/MyKSuiteUpgradeBottomSheet.kt

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,8 @@ fun MyKSuiteUpgradeBottomSheet(
5151
sheetState: SheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true),
5252
onDismissRequest: () -> Unit,
5353
) {
54-
MyKSuiteTheme {
55-
ModalBottomSheet(onDismissRequest, modifier, sheetState) {
56-
UpgradeBottomSheetContent(app, onDismissRequest)
57-
}
54+
ModalBottomSheet(onDismissRequest, modifier, sheetState) {
55+
UpgradeBottomSheetContent(app, onDismissRequest)
5856
}
5957
}
6058

@@ -103,7 +101,6 @@ private fun UpgradeBottomSheetContent(app: KSuiteApp, onButtonClicked: () -> Uni
103101
MyKSuitePrimaryButton(
104102
modifier = paddedModifier.fillMaxWidth(),
105103
text = stringResource(R.string.buttonClose),
106-
colors = app.buttonStyle.colors,
107104
shape = app.buttonStyle.shape,
108105
onClick = onButtonClicked,
109106
)

MyKSuite/src/main/java/com/infomaniak/core/myksuite/ui/screens/components/MyKSuiteButtonType.kt

Lines changed: 3 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -18,43 +18,11 @@
1818
package com.infomaniak.core.myksuite.ui.screens.components
1919

2020
import androidx.compose.foundation.shape.RoundedCornerShape
21-
import androidx.compose.material3.ButtonColors
22-
import androidx.compose.material3.ButtonDefaults
23-
import androidx.compose.runtime.Composable
24-
import androidx.compose.ui.graphics.Color
2521
import androidx.compose.ui.graphics.Shape
2622
import androidx.compose.ui.unit.dp
2723
import com.infomaniak.core.myksuite.ui.theme.Dimens
28-
import com.infomaniak.core.myksuite.ui.theme.LocalMyKSuiteColors
2924

30-
internal enum class MyKSuiteButtonType(val colors: @Composable () -> MyKSuiteButtonColors, val shape: Shape) {
31-
Mail(
32-
colors = {
33-
val localColors = LocalMyKSuiteColors.current
34-
MyKSuiteButtonColors(
35-
containerColor = localColors.mailButton,
36-
contentColor = localColors.onMailButton,
37-
)
38-
},
39-
shape = RoundedCornerShape(Dimens.largeCornerRadius),
40-
),
41-
Drive(
42-
colors = {
43-
val localColors = LocalMyKSuiteColors.current
44-
MyKSuiteButtonColors(
45-
containerColor = localColors.primaryButton,
46-
contentColor = localColors.onPrimaryButton,
47-
)
48-
},
49-
shape = RoundedCornerShape(10.dp),
50-
),
51-
}
52-
53-
internal data class MyKSuiteButtonColors(val containerColor: Color, val contentColor: Color) {
54-
55-
@Composable
56-
fun buttonColors(): ButtonColors = ButtonDefaults.buttonColors(
57-
containerColor = containerColor,
58-
contentColor = contentColor,
59-
)
25+
internal enum class MyKSuiteButtonType(val shape: Shape) {
26+
Mail(shape = RoundedCornerShape(Dimens.largeCornerRadius)),
27+
Drive(shape = RoundedCornerShape(10.dp)),
6028
}

MyKSuite/src/main/java/com/infomaniak/core/myksuite/ui/theme/ColorsDark.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,9 @@ private const val onMailButton = 0xFF3F0018
3434
private const val mail = 0xFFF2357A
3535
private const val drive = 0xFF5C89F7
3636

37-
internal val DarkColorScheme = darkColorScheme(
37+
internal fun getDarkColorScheme(primaryColor: Color, onPrimaryColor: Color) = darkColorScheme(
38+
primary = primaryColor,
39+
onPrimary = onPrimaryColor,
3840
onSurfaceVariant = Color(rabbit), // Used for bottom sheet drag handle
3941
surfaceContainerLow = Color(bat), // Used for bottom sheet backgrounds
4042
surfaceContainerHighest = Color(bat), // Used for Card backgrounds

MyKSuite/src/main/java/com/infomaniak/core/myksuite/ui/theme/ColorsLight.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,9 @@ private const val onMailButton = 0xFFFEF8F7
4141
private const val mail = 0xFFF2357A
4242
private const val drive = 0xFF5C89F7
4343

44-
internal val LightColorScheme = lightColorScheme(
44+
internal fun getLightColorScheme(primaryColor: Color, onPrimaryColor: Color) = lightColorScheme(
45+
primary = primaryColor,
46+
onPrimary = onPrimaryColor,
4547
onSurfaceVariant = Color(mouse), // Used for bottom sheet drag handle
4648
surfaceContainerLow = Color(white), // Used for bottom sheet backgrounds
4749
surfaceContainerHighest = Color(sky), // Used for Card backgrounds

MyKSuite/src/main/java/com/infomaniak/core/myksuite/ui/theme/Theme.kt

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,41 @@
1717
*/
1818
package com.infomaniak.core.myksuite.ui.theme
1919

20+
import android.content.Context
21+
import androidx.annotation.AttrRes
2022
import androidx.compose.foundation.isSystemInDarkTheme
2123
import androidx.compose.material3.LocalTextStyle
2224
import androidx.compose.material3.MaterialTheme
2325
import androidx.compose.runtime.*
2426
import androidx.compose.ui.graphics.Color
27+
import androidx.compose.ui.platform.LocalContext
28+
import com.google.android.material.color.MaterialColors
29+
import com.google.android.material.R as RMaterial
2530

2631
internal val LocalMyKSuiteColors: ProvidableCompositionLocal<MyKSuiteColors> = staticCompositionLocalOf { MyKSuiteColors() }
2732

33+
/**
34+
* This theme should be used in any XML View's wrapper class, as it uses the XML material attributes
35+
*/
36+
@Composable
37+
internal fun MyKSuiteXMLTheme(content: @Composable () -> Unit) {
38+
val context = LocalContext.current
39+
MyKSuiteTheme(
40+
primaryColor = getMaterialColor(context, RMaterial.attr.colorPrimary),
41+
onPrimaryColor = getMaterialColor(context, RMaterial.attr.colorOnPrimary),
42+
content = content,
43+
)
44+
}
45+
46+
/**
47+
* Basic theme to use if the components are called from Compose
48+
*/
2849
@Composable
29-
internal fun MyKSuiteTheme(content: @Composable () -> Unit) {
50+
internal fun MyKSuiteTheme(
51+
primaryColor: Color = MaterialTheme.colorScheme.primary,
52+
onPrimaryColor: Color = MaterialTheme.colorScheme.onPrimary,
53+
content: @Composable () -> Unit,
54+
) {
3055
val isDarkTheme = isSystemInDarkTheme()
3156
val customColors = if (isDarkTheme) MyKSuiteDarkColors else MyKSuiteLightColors
3257

@@ -35,7 +60,11 @@ internal fun MyKSuiteTheme(content: @Composable () -> Unit) {
3560
LocalMyKSuiteColors provides customColors,
3661
) {
3762
MaterialTheme(
38-
colorScheme = if (isDarkTheme) DarkColorScheme else LightColorScheme,
63+
colorScheme = if (isDarkTheme) {
64+
getDarkColorScheme(primaryColor, onPrimaryColor)
65+
} else {
66+
getLightColorScheme(primaryColor, onPrimaryColor)
67+
},
3968
content = content,
4069
)
4170
}
@@ -60,3 +89,5 @@ internal data class MyKSuiteColors(
6089
val iconColor: Color = Color.Unspecified,
6190
val cardBorderColor: Color = Color.Unspecified,
6291
)
92+
93+
private fun getMaterialColor(context: Context, @AttrRes colorId: Int) = Color(MaterialColors.getColor(context, colorId, 0))

MyKSuite/src/main/java/com/infomaniak/core/myksuite/ui/views/BaseMyKSuiteChipView.kt

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,13 @@ package com.infomaniak.core.myksuite.ui.views
1919

2020
import android.content.Context
2121
import android.util.AttributeSet
22+
import androidx.annotation.ColorInt
2223
import androidx.compose.runtime.Composable
2324
import androidx.compose.ui.platform.AbstractComposeView
24-
import androidx.core.content.res.ResourcesCompat
2525
import com.infomaniak.core.myksuite.R
2626
import com.infomaniak.core.myksuite.ui.components.MyKSuiteChip
2727
import com.infomaniak.core.myksuite.ui.components.MyKSuiteTier
28-
import com.infomaniak.core.myksuite.ui.theme.MyKSuiteTheme
28+
import com.infomaniak.core.myksuite.ui.theme.MyKSuiteXMLTheme
2929

3030
abstract class BaseMyKSuiteChipView @JvmOverloads constructor(
3131
context: Context,
@@ -34,18 +34,20 @@ abstract class BaseMyKSuiteChipView @JvmOverloads constructor(
3434
val tier: MyKSuiteTier,
3535
) : AbstractComposeView(context, attrs, defStyleAttr) {
3636

37-
private var backgroundColor: Int = ResourcesCompat.ID_NULL
37+
@ColorInt
38+
private var backgroundColor: Int? = null
3839

3940
init {
4041
context.obtainStyledAttributes(attrs, R.styleable.BaseMyKSuiteChipView, defStyleAttr, 0).apply {
41-
backgroundColor = getInt(R.styleable.BaseMyKSuiteChipView_backgroundColor, ResourcesCompat.ID_NULL)
42+
backgroundColor = getColor(R.styleable.BaseMyKSuiteChipView_backgroundColor, 0).takeIf {
43+
hasValue(R.styleable.BaseMyKSuiteChipView_backgroundColor)
44+
}
4245
recycle()
4346
}
4447
}
4548

4649
@Composable
4750
override fun Content() {
48-
val colorRes = if (backgroundColor == ResourcesCompat.ID_NULL) null else backgroundColor
49-
MyKSuiteTheme { MyKSuiteChip(tier = tier, backgroundColor = colorRes) }
51+
MyKSuiteXMLTheme { MyKSuiteChip(tier = tier, backgroundColor = backgroundColor) }
5052
}
5153
}

MyKSuite/src/main/java/com/infomaniak/core/myksuite/ui/views/MyKSuiteDashboardFragment.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import androidx.navigation.fragment.findNavController
2828
import androidx.navigation.fragment.navArgs
2929
import com.infomaniak.core.myksuite.ui.screens.MyKSuiteDashboardScreen
3030
import com.infomaniak.core.myksuite.ui.screens.MyKSuiteDashboardScreenData
31+
import com.infomaniak.core.myksuite.ui.theme.MyKSuiteXMLTheme
3132

3233
open class MyKSuiteDashboardFragment : Fragment() {
3334

@@ -41,11 +42,13 @@ open class MyKSuiteDashboardFragment : Fragment() {
4142
return ComposeView(requireContext()).apply {
4243
composeView = this
4344
setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed)
44-
setContent { MyKSuiteDashboardScreen(dashboardScreenData = { navigationArgs.dashboardData }, onClose = onClose) }
45+
resetContent(navigationArgs.dashboardData)
4546
}
4647
}
4748

4849
protected fun resetContent(dashboardData: MyKSuiteDashboardScreenData) {
49-
composeView?.setContent { MyKSuiteDashboardScreen(dashboardScreenData = { dashboardData }, onClose = onClose) }
50+
composeView?.setContent {
51+
MyKSuiteXMLTheme { MyKSuiteDashboardScreen(dashboardScreenData = { dashboardData }, onClose = onClose) }
52+
}
5053
}
5154
}

0 commit comments

Comments
 (0)