Skip to content

Commit 7348015

Browse files
committed
Reuse OudsAlertStatus in list items, progress indicators and tags
1 parent cf87c2c commit 7348015

5 files changed

Lines changed: 83 additions & 106 deletions

File tree

core/src/main/java/com/orange/ouds/core/component/OudsAlert.kt

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -55,26 +55,30 @@ internal sealed class OudsAlertStatus(
5555

5656
class Warning(
5757
defaultIconPainterProvider: (@Composable (OudsAlertStatus) -> Painter?) = { getDefaultIconPainter(it) },
58-
defaultIconContentDescriptionProvider: (@Composable (OudsAlertStatus) -> String) = { stringResource(R.string.core_common_warning_a11y) }
59-
) :
60-
OudsAlertStatus(defaultIconPainterProvider, defaultIconContentDescriptionProvider)
58+
defaultIconContentDescriptionProvider: (@Composable (OudsAlertStatus) -> String) = { stringResource(R.string.core_common_warning_a11y) },
59+
val layeredTintedPainter: Boolean = true
60+
) : OudsAlertStatus(defaultIconPainterProvider, defaultIconContentDescriptionProvider)
6161

6262
companion object {
6363

6464
@Composable
65-
protected fun getDefaultIconPainter(status: OudsAlertStatus): Painter? {
65+
internal fun getDefaultIconPainter(status: OudsAlertStatus): Painter? {
6666
return when (status) {
6767
is Negative -> painterResource(OudsTheme.drawableResources.component.alert.importantFill)
6868
is Positive -> painterResource(OudsTheme.drawableResources.component.alert.tickConfirmationFill)
6969
is Info -> painterResource(OudsTheme.drawableResources.component.alert.infoFill)
7070
is Warning -> {
71-
val iconTokens = OudsTheme.componentsTokens.icon
72-
LayeredTintedPainter(
73-
backPainter = painterResource(id = OudsTheme.drawableResources.component.alert.warningExternalShape),
74-
backPainterColor = iconTokens.colorContentStatusWarningExternalShape.value,
75-
frontPainter = painterResource(id = OudsTheme.drawableResources.component.alert.warningInternalShape),
76-
frontPainterColor = iconTokens.colorContentStatusWarningInternalShape.value
77-
)
71+
if (!status.layeredTintedPainter) {
72+
painterResource(id = OudsTheme.drawableResources.component.alert.warningExternalShape)
73+
} else {
74+
val iconTokens = OudsTheme.componentsTokens.icon
75+
LayeredTintedPainter(
76+
backPainter = painterResource(id = OudsTheme.drawableResources.component.alert.warningExternalShape),
77+
backPainterColor = iconTokens.colorContentStatusWarningExternalShape.value,
78+
frontPainter = painterResource(id = OudsTheme.drawableResources.component.alert.warningInternalShape),
79+
frontPainterColor = iconTokens.colorContentStatusWarningInternalShape.value
80+
)
81+
}
7882
}
7983
is Accent,
8084
is Neutral -> null
@@ -97,14 +101,14 @@ internal sealed class OudsAlertStatus(
97101
/**
98102
* The asset color associated with this status.
99103
*/
100-
val assetColor
104+
val assetColor: Color
101105
@Composable
102106
get() = with(OudsTheme.colorScheme.content) {
103107
when (this@OudsAlertStatus) {
104108
is Neutral -> default
105109
is Accent -> status.accent
106110
is Positive -> status.positive
107-
is Warning -> Color.Unspecified
111+
is Warning -> if (layeredTintedPainter) Color.Unspecified else status.warning
108112
is Negative -> status.negative
109113
is Info -> status.info
110114
}

core/src/main/java/com/orange/ouds/core/component/OudsListItem.kt

Lines changed: 25 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,6 @@ import com.orange.ouds.core.theme.OudsTheme
6767
import com.orange.ouds.core.theme.takeUnlessHairline
6868
import com.orange.ouds.core.theme.value
6969
import com.orange.ouds.core.utilities.CheckerboardPainter
70-
import com.orange.ouds.core.utilities.LayeredTintedPainter
7170
import com.orange.ouds.core.utilities.OudsPreview
7271
import com.orange.ouds.core.utilities.OudsPreviewDevice
7372
import com.orange.ouds.core.utilities.OudsPreviewLightDark
@@ -725,41 +724,34 @@ enum class OudsListItemIconSize {
725724
}
726725

727726
internal enum class OudsListItemIconStatus(
728-
val painterProvider: @Composable () -> Painter,
729727
val contentDescriptionProvider: (@Composable () -> String) = { "" }
730728
) {
731-
Negative(
732-
{ painterResource(OudsTheme.drawableResources.component.alert.importantFill) },
733-
{ stringResource(R.string.core_common_error_a11y) }
734-
),
735-
736-
Positive({ painterResource(OudsTheme.drawableResources.component.alert.tickConfirmationFill) }),
737-
738-
Info({ painterResource(OudsTheme.drawableResources.component.alert.infoFill) }),
739-
740-
Warning(
741-
{
742-
val iconTokens = OudsTheme.components.icon
743-
LayeredTintedPainter(
744-
backPainter = painterResource(id = OudsTheme.drawableResources.component.alert.warningExternalShape),
745-
backPainterColor = iconTokens.color.content.status.warning.externalShape,
746-
frontPainter = painterResource(id = OudsTheme.drawableResources.component.alert.warningInternalShape),
747-
frontPainterColor = iconTokens.color.content.status.warning.internalShape
748-
)
749-
},
750-
{ stringResource(R.string.core_common_warning_a11y) }
751-
);
729+
Negative({ stringResource(R.string.core_common_error_a11y) }),
752730

753-
val tint
731+
Positive,
732+
733+
Info,
734+
735+
Warning({ stringResource(R.string.core_common_warning_a11y) });
736+
737+
private fun toAlertStatus(): OudsAlertStatus {
738+
return when (this) {
739+
Negative -> OudsAlertStatus.Negative()
740+
Positive -> OudsAlertStatus.Positive()
741+
Info -> OudsAlertStatus.Info()
742+
Warning -> OudsAlertStatus.Warning()
743+
}
744+
}
745+
746+
val painter: Painter
754747
@Composable
755-
get() = with(OudsTheme.colorScheme.content) {
756-
when (this@OudsListItemIconStatus) {
757-
Positive -> status.positive
758-
Warning -> Color.Unspecified
759-
Negative -> status.negative
760-
Info -> status.info
761-
}
748+
get() = OudsAlertStatus.getDefaultIconPainter(toAlertStatus()).orElse {
749+
error("No painter for status ${this::class.simpleName}")
762750
}
751+
752+
val tint
753+
@Composable
754+
get() = toAlertStatus().assetColor
763755
}
764756

765757
/**
@@ -978,7 +970,7 @@ sealed interface OudsListItemLeading : OudsListItemLeadingTrailing {
978970
) : this({ bitmap as Any }, { contentDescription }, tinted, size, null)
979971

980972
private constructor(size: OudsListItemIconSize, status: OudsListItemIconStatus) : this(
981-
{ status.painterProvider() },
973+
{ status.painter },
982974
{ status.contentDescriptionProvider() },
983975
true,
984976
size,
@@ -1160,7 +1152,7 @@ sealed interface OudsListItemTrailing : OudsListItemLeadingTrailing {
11601152
) : this({ bitmap as Any }, { contentDescription }, tinted, size, null)
11611153

11621154
private constructor(size: OudsListItemIconSize, status: OudsListItemIconStatus) : this(
1163-
{ status.painterProvider() },
1155+
{ status.painter },
11641156
{ status.contentDescriptionProvider() },
11651157
true,
11661158
size,

core/src/main/java/com/orange/ouds/core/component/OudsProgressIndicator.kt

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -67,21 +67,23 @@ enum class OudsProgressIndicatorStatus {
6767
* Use when the process involves caution, validation, or potentially disruptive actions.
6868
*/
6969
Warning;
70-
70+
7171
/**
7272
* The color associated with this status.
7373
*/
7474
@Composable
7575
fun color(): Color {
76-
return with(OudsTheme.colorScheme.content) {
77-
when (this@OudsProgressIndicatorStatus) {
78-
Neutral -> default
79-
Accent -> status.accent
80-
Negative -> status.negative
81-
Positive -> status.positive
82-
Info -> status.info
83-
Warning -> status.warning
84-
}
76+
return toAlertStatus().assetColor
77+
}
78+
79+
private fun toAlertStatus(): OudsAlertStatus {
80+
return when (this) {
81+
Negative -> OudsAlertStatus.Negative()
82+
Positive -> OudsAlertStatus.Positive()
83+
Info -> OudsAlertStatus.Info()
84+
Warning -> OudsAlertStatus.Warning(layeredTintedPainter = false)
85+
Accent -> OudsAlertStatus.Accent()
86+
Neutral -> OudsAlertStatus.Neutral()
8587
}
8688
}
8789
}

core/src/main/java/com/orange/ouds/core/component/OudsSmallListItem.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,7 @@ sealed interface OudsSmallListItemLeading : OudsListItemLeadingTrailing {
241241
) : this({ bitmap }, { contentDescription }, tinted, null)
242242

243243
private constructor(status: OudsListItemIconStatus) : this(
244-
{ status.painterProvider() },
244+
{ status.painter },
245245
{ status.contentDescriptionProvider() },
246246
true,
247247
status
@@ -393,7 +393,7 @@ sealed interface OudsSmallListItemTrailing : OudsListItemLeadingTrailing {
393393
bitmap: ImageBitmap, contentDescription: String, tinted: Boolean = true
394394
) : this({ bitmap }, { contentDescription }, tinted, null)
395395

396-
private constructor(status: OudsListItemIconStatus) : this(status.painterProvider, status.contentDescriptionProvider, true, status)
396+
private constructor(status: OudsListItemIconStatus) : this({ status.painter }, status.contentDescriptionProvider, true, status)
397397

398398
/**
399399
* Creates an instance of [OudsSmallListItemTrailing.Icon] representing an info status.

core/src/main/java/com/orange/ouds/core/component/OudsTag.kt

Lines changed: 27 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ import androidx.compose.ui.graphics.StrokeCap
3636
import androidx.compose.ui.graphics.painter.Painter
3737
import androidx.compose.ui.graphics.vector.ImageVector
3838
import androidx.compose.ui.platform.LocalConfiguration
39-
import androidx.compose.ui.res.painterResource
4039
import androidx.compose.ui.res.stringResource
4140
import androidx.compose.ui.semantics.hideFromAccessibility
4241
import androidx.compose.ui.semantics.semantics
@@ -54,7 +53,6 @@ import com.orange.ouds.core.extensions.iconSize
5453
import com.orange.ouds.core.theme.OudsTheme
5554
import com.orange.ouds.core.theme.value
5655
import com.orange.ouds.core.utilities.CheckedContent
57-
import com.orange.ouds.core.utilities.LayeredTintedPainter
5856
import com.orange.ouds.core.utilities.OudsPreview
5957
import com.orange.ouds.core.utilities.OudsPreviewLightDark
6058
import com.orange.ouds.core.utilities.PreviewGrid
@@ -174,7 +172,7 @@ fun OudsTag(
174172
}
175173
.padding(all = assetPadding),
176174
extraParameters = OudsTagAsset.ExtraParameters(
177-
tint = assetColor(status = status, appearance = appearance, enabled = enabled, isBullet = isBulletAsset),
175+
tint = assetColor(status = status, appearance = appearance, enabled = enabled),
178176
status = status,
179177
appearance = appearance,
180178
enabled = enabled
@@ -260,22 +258,13 @@ private fun backgroundColor(status: OudsTagStatus, appearance: OudsTagAppearance
260258
}
261259

262260
@Composable
263-
private fun assetColor(status: OudsTagStatus, appearance: OudsTagAppearance, enabled: Boolean, isBullet: Boolean): Color {
261+
private fun assetColor(status: OudsTagStatus, appearance: OudsTagAppearance, enabled: Boolean): Color {
264262
return when (appearance) {
265263
OudsTagAppearance.Emphasized -> contentColor(status = status, appearance = appearance, hasLoader = false, enabled = enabled)
266-
OudsTagAppearance.Muted -> when {
267-
!enabled -> OudsTheme.colorScheme.content.onAction.disabled
268-
!isBullet && status is OudsTagStatus.Warning -> Color.Unspecified // Case of two colors icon. Colors are managed by the `LayeredTintedPainter`.
269-
else -> with(OudsTheme.colorScheme.content) {
270-
when (status) {
271-
is OudsTagStatus.Accent -> this.status.accent
272-
is OudsTagStatus.Info -> this.status.info
273-
is OudsTagStatus.Negative -> this.status.negative
274-
is OudsTagStatus.Neutral -> default
275-
is OudsTagStatus.Positive -> this.status.positive
276-
is OudsTagStatus.Warning -> this.status.warning
277-
}
278-
}
264+
OudsTagAppearance.Muted -> if (!enabled) {
265+
OudsTheme.colorScheme.content.onAction.disabled
266+
} else {
267+
status.toAlertStatus(appearance, enabled).assetColor
279268
}
280269
}
281270
}
@@ -510,9 +499,7 @@ sealed interface OudsTagAsset : OudsPolymorphicComponentContent {
510499
OudsTagAsset.ExtraParameters::class.java,
511500
{ icon ->
512501
with(icon.extraParameters) {
513-
status.getDefaultIconPainter(appearance, enabled).orElse {
514-
error("No default icon for status ${status::class.simpleName}")
515-
}
502+
status.getPainter(appearance = appearance, enabled = enabled)
516503
}
517504
},
518505
{ icon -> icon.extraParameters.status.defaultIconContentDescription }
@@ -564,13 +551,31 @@ enum class OudsTagSize {
564551
*/
565552
sealed class OudsTagStatus(val asset: OudsTagAsset? = null) {
566553

567-
@Composable
568-
internal open fun getDefaultIconPainter(appearance: OudsTagAppearance, enabled: Boolean): Painter? = null
554+
internal fun toAlertStatus(appearance: OudsTagAppearance, enabled: Boolean): OudsAlertStatus {
555+
return when (this) {
556+
is Neutral -> OudsAlertStatus.Neutral()
557+
is Accent -> OudsAlertStatus.Accent()
558+
is Positive -> OudsAlertStatus.Positive()
559+
is Warning -> {
560+
val layeredTintedPainter = appearance != OudsTagAppearance.Emphasized && enabled && asset !is OudsTagAsset.Bullet
561+
OudsAlertStatus.Warning(layeredTintedPainter = layeredTintedPainter)
562+
}
563+
is Negative -> OudsAlertStatus.Negative()
564+
is Info -> OudsAlertStatus.Info()
565+
}
566+
}
569567

570568
internal open val defaultIconContentDescription: String
571569
@Composable
572570
get() = ""
573571

572+
@Composable
573+
internal fun getPainter(appearance: OudsTagAppearance, enabled: Boolean): Painter {
574+
return OudsAlertStatus.getDefaultIconPainter(status = toAlertStatus(appearance, enabled)).orElse {
575+
error("No painter for status ${this::class.simpleName}")
576+
}
577+
}
578+
574579
/**
575580
* Default or inactive status. Used for standard labels, categories, or when no specific status needs to be communicated.
576581
* Its [asset] can be an [OudsTagAsset.Bullet], an [OudsTagAsset.Icon] or `null` if no asset is needed.
@@ -633,10 +638,6 @@ sealed class OudsTagStatus(val asset: OudsTagAsset? = null) {
633638
* Creates an instance of [OudsTagStatus.Positive] with no asset.
634639
*/
635640
constructor() : this(null)
636-
637-
@Composable
638-
override fun getDefaultIconPainter(appearance: OudsTagAppearance, enabled: Boolean) =
639-
painterResource(OudsTheme.drawableResources.component.alert.tickConfirmationFill)
640641
}
641642

642643
/**
@@ -658,10 +659,6 @@ sealed class OudsTagStatus(val asset: OudsTagAsset? = null) {
658659
* Creates an instance of [OudsTagStatus.Info] with no asset.
659660
*/
660661
constructor() : this(null)
661-
662-
@Composable
663-
override fun getDefaultIconPainter(appearance: OudsTagAppearance, enabled: Boolean) =
664-
painterResource(OudsTheme.drawableResources.component.alert.infoFill)
665662
}
666663

667664
/**
@@ -684,20 +681,6 @@ sealed class OudsTagStatus(val asset: OudsTagAsset? = null) {
684681
*/
685682
constructor() : this(null)
686683

687-
@Composable
688-
override fun getDefaultIconPainter(appearance: OudsTagAppearance, enabled: Boolean): Painter {
689-
val iconTokens = OudsTheme.componentsTokens.icon
690-
return when {
691-
appearance == OudsTagAppearance.Emphasized || !enabled -> painterResource(id = OudsTheme.drawableResources.component.alert.warningExternalShape)
692-
else -> LayeredTintedPainter(
693-
backPainter = painterResource(id = OudsTheme.drawableResources.component.alert.warningExternalShape),
694-
backPainterColor = iconTokens.colorContentStatusWarningExternalShape.value,
695-
frontPainter = painterResource(id = OudsTheme.drawableResources.component.alert.warningInternalShape),
696-
frontPainterColor = iconTokens.colorContentStatusWarningInternalShape.value
697-
)
698-
}
699-
}
700-
701684
override val defaultIconContentDescription
702685
@Composable
703686
get() = stringResource(id = R.string.core_common_warning_a11y)
@@ -723,10 +706,6 @@ sealed class OudsTagStatus(val asset: OudsTagAsset? = null) {
723706
*/
724707
constructor() : this(null)
725708

726-
@Composable
727-
override fun getDefaultIconPainter(appearance: OudsTagAppearance, enabled: Boolean) =
728-
painterResource(OudsTheme.drawableResources.component.alert.importantFill)
729-
730709
override val defaultIconContentDescription
731710
@Composable
732711
get() = stringResource(id = R.string.core_common_error_a11y)

0 commit comments

Comments
 (0)