From c04b89e8b7ea3ba621a7ce2927d3fc42d1728724 Mon Sep 17 00:00:00 2001 From: Mykola Balan Date: Mon, 19 May 2025 13:59:21 +0300 Subject: [PATCH 01/20] Created a UI component for the core DownloadingProgressDialog --- design/api/current.api | 55 +++++++++ .../DownloadingProgressDialog.kt | 111 ++++++++++++++++++ .../models/DialogStyle.kt | 8 ++ .../models/ProgressBarColors.kt | 9 ++ .../models/ProgressBarStyle.kt | 12 ++ 5 files changed, 195 insertions(+) create mode 100644 design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/DownloadingProgressDialog.kt create mode 100644 design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/models/DialogStyle.kt create mode 100644 design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/models/ProgressBarColors.kt create mode 100644 design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/models/ProgressBarStyle.kt diff --git a/design/api/current.api b/design/api/current.api index 0e9da44d..77c81774 100644 --- a/design/api/current.api +++ b/design/api/current.api @@ -128,6 +128,61 @@ package com.urlaunched.android.design.ui.counter.ui { } +package com.urlaunched.android.design.ui.downloadingProgressDialog { + + public final class DownloadingProgressDialogKt { + method @androidx.compose.runtime.Composable public static void DownloadingProgressDialog(optional androidx.compose.ui.Modifier modifier, optional float progress, optional com.urlaunched.android.design.ui.downloadingProgressDialog.models.ProgressBarColors progressBarColors, optional com.urlaunched.android.design.ui.downloadingProgressDialog.models.ProgressBarStyle progressBarStyle, optional com.urlaunched.android.design.ui.downloadingProgressDialog.models.DialogStyle dialogStyle, optional kotlin.jvm.functions.Function0 progressText, optional kotlin.jvm.functions.Function0 title, optional kotlin.jvm.functions.Function0 description, optional kotlin.jvm.functions.Function0 definitionText, optional kotlin.jvm.functions.Function0 button); + method @androidx.compose.runtime.Composable @androidx.compose.ui.tooling.preview.Preview(showBackground=true) public static void DownloadingProgressDialogPreview(); + } + +} + +package com.urlaunched.android.design.ui.downloadingProgressDialog.models { + + public final class DialogStyle { + ctor public DialogStyle(optional float contentPadding); + method public float component1-D9Ej5fM(); + method public com.urlaunched.android.design.ui.downloadingProgressDialog.models.DialogStyle copy-0680j_4(float contentPadding); + method public float getContentPadding(); + property public final float contentPadding; + } + + public final class ProgressBarColors { + ctor public ProgressBarColors(optional java.util.List progressColors, optional long progressBackgroundColor, optional long backgroundDialogColor); + method public java.util.List component1(); + method public long component2-0d7_KjU(); + method public long component3-0d7_KjU(); + method public com.urlaunched.android.design.ui.downloadingProgressDialog.models.ProgressBarColors copy-WkMS-hQ(java.util.List progressColors, long progressBackgroundColor, long backgroundDialogColor); + method public long getBackgroundDialogColor(); + method public long getProgressBackgroundColor(); + method public java.util.List getProgressColors(); + property public final long backgroundDialogColor; + property public final long progressBackgroundColor; + property public final java.util.List progressColors; + } + + public final class ProgressBarStyle { + ctor public ProgressBarStyle(optional float progressBarMinWidth, optional float progressBarHeight, optional float progressBoxCornerRadius, optional float progressCornerRadius, optional float dialogCornerRadius); + method public float component1-D9Ej5fM(); + method public float component2-D9Ej5fM(); + method public float component3-D9Ej5fM(); + method public float component4-D9Ej5fM(); + method public float component5-D9Ej5fM(); + method public com.urlaunched.android.design.ui.downloadingProgressDialog.models.ProgressBarStyle copy-RyVG9vg(float progressBarMinWidth, float progressBarHeight, float progressBoxCornerRadius, float progressCornerRadius, float dialogCornerRadius); + method public float getDialogCornerRadius(); + method public float getProgressBarHeight(); + method public float getProgressBarMinWidth(); + method public float getProgressBoxCornerRadius(); + method public float getProgressCornerRadius(); + property public final float dialogCornerRadius; + property public final float progressBarHeight; + property public final float progressBarMinWidth; + property public final float progressBoxCornerRadius; + property public final float progressCornerRadius; + } + +} + package com.urlaunched.android.design.ui.expandabletext { public final class ExpandableTextKt { diff --git a/design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/DownloadingProgressDialog.kt b/design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/DownloadingProgressDialog.kt new file mode 100644 index 00000000..ab24bc3b --- /dev/null +++ b/design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/DownloadingProgressDialog.kt @@ -0,0 +1,111 @@ +package com.urlaunched.android.design.ui.downloadingProgressDialog + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.BoxWithConstraints +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.defaultMinSize +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.offset +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.BasicAlertDialog +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Brush +import androidx.compose.ui.graphics.SolidColor +import androidx.compose.ui.platform.LocalInspectionMode +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.compose.ui.window.DialogProperties +import com.urlaunched.android.design.resources.dimens.Dimens +import com.urlaunched.android.design.ui.downloadingProgressDialog.models.DialogStyle +import com.urlaunched.android.design.ui.downloadingProgressDialog.models.ProgressBarColors +import com.urlaunched.android.design.ui.downloadingProgressDialog.models.ProgressBarStyle + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun DownloadingProgressDialog( + modifier: Modifier = Modifier, + progress: Float = 0f, + progressBarColors: ProgressBarColors = ProgressBarColors(), + progressBarStyle: ProgressBarStyle = ProgressBarStyle(), + dialogStyle: DialogStyle = DialogStyle(), + progressText: @Composable () -> Unit = {}, + title: @Composable () -> Unit = {}, + description: @Composable () -> Unit = {}, + definitionText: @Composable () -> Unit = {}, + button: @Composable () -> Unit = {} +) { + BasicAlertDialog( + modifier = modifier + .padding(Dimens.spacingNormal) + .clip(RoundedCornerShape(progressBarStyle.dialogCornerRadius)) + .background(progressBarColors.backgroundDialogColor), + onDismissRequest = { + // Do nothing + }, + properties = DialogProperties(usePlatformDefaultWidth = LocalInspectionMode.current), + content = { + Box { + Column(modifier = Modifier.padding(dialogStyle.contentPadding)) { + description() + + title() + + BoxWithConstraints( + modifier = Modifier + .background( + progressBarColors.progressBackgroundColor, + RoundedCornerShape(progressBarStyle.progressCornerRadius) + ) + .height(progressBarStyle.progressBarHeight), + contentAlignment = Alignment.CenterStart + ) { + val currentWidth = + (maxWidth - Dimens.spacingLarge) * progress + Dimens.spacingLarge + + Box( + modifier = Modifier + .clip(RoundedCornerShape(progressBarStyle.progressBoxCornerRadius)) + .defaultMinSize(minWidth = Dimens.spacingLarge) + .height(progressBarStyle.progressBarHeight) + .background( + if (progressBarColors.progressColors.size > 1) { + Brush.horizontalGradient(progressBarColors.progressColors) + } else { + SolidColor(progressBarColors.progressColors.first()) + } + ) + .width(currentWidth) + ) + + Box( + modifier = Modifier + .fillMaxSize() + .offset(x = currentWidth - 32.dp), + contentAlignment = Alignment.CenterStart + ) { + progressText() + } + } + + definitionText() + + button() + } + } + } + ) +} + +@Preview(showBackground = true) +@Composable +fun DownloadingProgressDialogPreview() { + DownloadingProgressDialog() +} \ No newline at end of file diff --git a/design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/models/DialogStyle.kt b/design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/models/DialogStyle.kt new file mode 100644 index 00000000..16c6d710 --- /dev/null +++ b/design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/models/DialogStyle.kt @@ -0,0 +1,8 @@ +package com.urlaunched.android.design.ui.downloadingProgressDialog.models + +import androidx.compose.ui.unit.Dp +import com.urlaunched.android.design.resources.dimens.Dimens + +data class DialogStyle( + val contentPadding: Dp = Dimens.spacingNormal +) \ No newline at end of file diff --git a/design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/models/ProgressBarColors.kt b/design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/models/ProgressBarColors.kt new file mode 100644 index 00000000..164141f7 --- /dev/null +++ b/design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/models/ProgressBarColors.kt @@ -0,0 +1,9 @@ +package com.urlaunched.android.design.ui.downloadingProgressDialog.models + +import androidx.compose.ui.graphics.Color + +data class ProgressBarColors( + val progressColors: List = listOf(Color.Blue), + val progressBackgroundColor: Color = Color.Gray, + val backgroundDialogColor: Color = Color.White +) \ No newline at end of file diff --git a/design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/models/ProgressBarStyle.kt b/design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/models/ProgressBarStyle.kt new file mode 100644 index 00000000..bb071b66 --- /dev/null +++ b/design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/models/ProgressBarStyle.kt @@ -0,0 +1,12 @@ +package com.urlaunched.android.design.ui.downloadingProgressDialog.models + +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.dp + +data class ProgressBarStyle( + val progressBarMinWidth: Dp = 32.dp, + val progressBarHeight: Dp = 36.dp, + val progressBoxCornerRadius: Dp = 32.dp, + val progressCornerRadius: Dp = 32.dp, + val dialogCornerRadius: Dp = 24.dp +) \ No newline at end of file From 9a62df3b6000fc011ec320f2d57ad3875a0ae859 Mon Sep 17 00:00:00 2001 From: Khotych Mykola Date: Wed, 17 Sep 2025 18:39:52 +0300 Subject: [PATCH 02/20] Refactor DownloadingProgressDialog --- .../AdaptableProgressText.kt | 87 +++++ .../DownloadingProgressDialog.kt | 350 ++++++++++++++---- .../models/DialogStyle.kt | 8 - .../models/ProgressBarColors.kt | 9 - .../models/ProgressBarStyle.kt | 29 +- 5 files changed, 390 insertions(+), 93 deletions(-) create mode 100644 design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/AdaptableProgressText.kt delete mode 100644 design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/models/DialogStyle.kt delete mode 100644 design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/models/ProgressBarColors.kt diff --git a/design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/AdaptableProgressText.kt b/design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/AdaptableProgressText.kt new file mode 100644 index 00000000..7e35801c --- /dev/null +++ b/design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/AdaptableProgressText.kt @@ -0,0 +1,87 @@ +package com.urlaunched.android.design.ui.downloadingProgressDialog + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.size +import androidx.compose.material3.LocalTextStyle +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.drawWithCache +import androidx.compose.ui.graphics.BlendMode +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.layer.drawLayer +import androidx.compose.ui.text.TextLayoutResult +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp + +@Composable +fun AdaptableProgressText( + text: String, + modifier: Modifier = Modifier, + overflow: TextOverflow = TextOverflow.Clip, + softWrap: Boolean = true, + maxLines: Int = Int.MAX_VALUE, + minLines: Int = 1, + style: TextStyle = LocalTextStyle.current, + onTextLayout: ((TextLayoutResult) -> Unit)? = null +) { + Text( + text = text, + style = style, + color = Color.White, + overflow = overflow, + softWrap = softWrap, + maxLines = maxLines, + minLines = minLines, + onTextLayout = onTextLayout, + modifier = modifier.blendMode( + blendMode = BlendMode.Exclusion + ) + ) +} + +private fun Modifier.blendMode( + blendMode: BlendMode +): Modifier { + return this.drawWithCache { + val graphicsLayer = obtainGraphicsLayer() + graphicsLayer.apply { + record { + drawContent() + } + this.blendMode = blendMode + } + onDrawWithContent { + drawLayer(graphicsLayer) + } + } +} + +@Preview +@Composable +private fun AdaptableProgressTextPreview() { + Box( + contentAlignment = Alignment.Center + ) { + Row { + Box( + Modifier + .size(100.dp, 100.dp) + .background(Color.Yellow) + ) + Box( + Modifier + .size(100.dp, 100.dp) + .background(Color.Blue) + ) + } + AdaptableProgressText( + text = "ADOPTED TEXT TEST" + ) + } +} \ No newline at end of file diff --git a/design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/DownloadingProgressDialog.kt b/design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/DownloadingProgressDialog.kt index ab24bc3b..3e322aca 100644 --- a/design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/DownloadingProgressDialog.kt +++ b/design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/DownloadingProgressDialog.kt @@ -1,104 +1,274 @@ package com.urlaunched.android.design.ui.downloadingProgressDialog +import androidx.compose.foundation.Canvas import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.BoxWithConstraints +import androidx.compose.foundation.layout.BoxScope import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.defaultMinSize -import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.ColumnScope +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.offset import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.BasicAlertDialog import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Brush +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.Path +import androidx.compose.ui.graphics.Shape import androidx.compose.ui.graphics.SolidColor -import androidx.compose.ui.platform.LocalInspectionMode +import androidx.compose.ui.graphics.addOutline +import androidx.compose.ui.graphics.drawOutline +import androidx.compose.ui.graphics.drawscope.clipPath import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.dp import androidx.compose.ui.window.DialogProperties +import com.composables.core.androidx.annotation.FloatRange import com.urlaunched.android.design.resources.dimens.Dimens -import com.urlaunched.android.design.ui.downloadingProgressDialog.models.DialogStyle -import com.urlaunched.android.design.ui.downloadingProgressDialog.models.ProgressBarColors import com.urlaunched.android.design.ui.downloadingProgressDialog.models.ProgressBarStyle -@OptIn(ExperimentalMaterial3Api::class) +/** + * @see AdaptableProgressText + */ @Composable fun DownloadingProgressDialog( + @FloatRange(0.0, 1.0) + progress: Float, + downloaded: Float = progress, + total: Float = 1f, modifier: Modifier = Modifier, - progress: Float = 0f, - progressBarColors: ProgressBarColors = ProgressBarColors(), + onDismissRequest: () -> Unit = DoNothing, progressBarStyle: ProgressBarStyle = ProgressBarStyle(), - dialogStyle: DialogStyle = DialogStyle(), - progressText: @Composable () -> Unit = {}, - title: @Composable () -> Unit = {}, - description: @Composable () -> Unit = {}, - definitionText: @Composable () -> Unit = {}, - button: @Composable () -> Unit = {} + dialogContainerColor: Color = Color.White, + dialogContainerShape: Shape = RoundedCornerShape(Dimens.cornerRadiusLarge), + contentPadding: PaddingValues = PaddingValues(Dimens.spacingNormal), + dialogProperties: DialogProperties = DialogProperties(), + title: (@Composable ColumnScope.() -> Unit)? = null, + description: (@Composable ColumnScope.() -> Unit)? = null, + progressText: (@Composable BoxScope.() -> Unit)? = null, + supportingText: (@Composable (Float) -> Unit)? = null, + button: (@Composable ColumnScope.() -> Unit)? = null ) { - BasicAlertDialog( - modifier = modifier - .padding(Dimens.spacingNormal) - .clip(RoundedCornerShape(progressBarStyle.dialogCornerRadius)) - .background(progressBarColors.backgroundDialogColor), - onDismissRequest = { - // Do nothing + BaseDownloadingProgressDialog( + progress = progress, + total = total, + downloaded = downloaded, + modifier = modifier, + onDismissRequest = onDismissRequest, + progressBarStyle = progressBarStyle, + dialogProperties = dialogProperties, + dialogContainerColor = dialogContainerColor, + dialogContainerShape = dialogContainerShape, + contentPadding = contentPadding, + title = title?.let { titleContent -> + @Composable { + titleContent() + Spacer(modifier = Modifier.height(Dimens.spacingSmall)) + } + }, + description = description?.let { descriptionContent -> + @Composable { + descriptionContent() + Spacer(modifier = Modifier.height(Dimens.spacingBigSpecial)) + } + }, + progressText = progressText, + supportingText = if (supportingText != null) { + @Composable { value -> + Column { + Spacer(modifier = Modifier.height(Dimens.spacingTiny)) + supportingText(value) + } + } + } else { + null }, - properties = DialogProperties(usePlatformDefaultWidth = LocalInspectionMode.current), + button = button?.let { buttonContent -> + @Composable { + Column( + modifier = Modifier.fillMaxWidth(), + horizontalAlignment = Alignment.End + ) { + Spacer(modifier = Modifier.height(Dimens.spacingLarge)) + buttonContent() + } + } + } + ) +} + +/** + * @see AdaptableProgressText + */ +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun BaseDownloadingProgressDialog( + @FloatRange(0.0, 1.0) + progress: Float, + downloaded: Float = progress, + total: Float = 1f, + modifier: Modifier = Modifier, + onDismissRequest: () -> Unit = DoNothing, + progressBarStyle: ProgressBarStyle = ProgressBarStyle(), + dialogContainerColor: Color = Color.White, + dialogContainerShape: Shape = RoundedCornerShape(Dimens.cornerRadiusLarge), + contentPadding: PaddingValues = PaddingValues(Dimens.spacingNormal), + dialogProperties: DialogProperties = DialogProperties(), + title: (@Composable ColumnScope.() -> Unit)? = null, + description: (@Composable ColumnScope.() -> Unit)? = null, + progressText: (@Composable BoxScope.() -> Unit)? = null, + supportingText: (@Composable (Float) -> Unit)? = null, + button: (@Composable ColumnScope.() -> Unit)? = null +) { + BasicAlertDialog( + modifier = modifier, + onDismissRequest = onDismissRequest, + properties = dialogProperties, content = { - Box { - Column(modifier = Modifier.padding(dialogStyle.contentPadding)) { - description() + Column( + modifier = Modifier + .background( + color = dialogContainerColor, + shape = dialogContainerShape + ) + .padding(contentPadding) + ) { + title?.invoke(this@Column) - title() + description?.invoke(this@Column) - BoxWithConstraints( + Box( + contentAlignment = Alignment.Center + ) { + DownloadingProgressBar( modifier = Modifier - .background( - progressBarColors.progressBackgroundColor, - RoundedCornerShape(progressBarStyle.progressCornerRadius) - ) + .fillMaxWidth() .height(progressBarStyle.progressBarHeight), - contentAlignment = Alignment.CenterStart - ) { - val currentWidth = - (maxWidth - Dimens.spacingLarge) * progress + Dimens.spacingLarge - - Box( - modifier = Modifier - .clip(RoundedCornerShape(progressBarStyle.progressBoxCornerRadius)) - .defaultMinSize(minWidth = Dimens.spacingLarge) - .height(progressBarStyle.progressBarHeight) - .background( - if (progressBarColors.progressColors.size > 1) { - Brush.horizontalGradient(progressBarColors.progressColors) - } else { - SolidColor(progressBarColors.progressColors.first()) - } - ) - .width(currentWidth) - ) - - Box( - modifier = Modifier - .fillMaxSize() - .offset(x = currentWidth - 32.dp), - contentAlignment = Alignment.CenterStart - ) { - progressText() - } - } - - definitionText() - - button() + progress = progress, + trackShape = progressBarStyle.trackShape, + progressShape = progressBarStyle.progressShape, + progressBrush = progressBarStyle.progressBrush, + trackBrush = progressBarStyle.trackBrush + ) + + progressText?.invoke(this@Box) + } + + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween + ) { + supportingText?.invoke(downloaded) + supportingText?.invoke(total) } + + button?.invoke(this@Column) + } + } + ) +} + +@Composable +private fun DownloadingProgressBar( + progress: Float, + modifier: Modifier = Modifier, + trackShape: Shape, + progressShape: Shape, + trackBrush: Brush, + progressBrush: Brush, +) { + Canvas( + modifier = modifier + ) { + val trackOutline = trackShape.createOutline(size, layoutDirection, this) + drawOutline( + brush = trackBrush, + outline = trackOutline + ) + + val progressWidth = size.width * progress.coerceIn(0f, 1f) + val progressSize = size.copy(width = progressWidth) + val progressOutline = progressShape.createOutline(progressSize, layoutDirection, this) + + clipPath( + path = Path().apply { addOutline(trackOutline) } + ) { + drawOutline( + brush = progressBrush, + outline = progressOutline + ) + } + } +} + +private val DoNothing = {} + +@Preview(showBackground = true) +@Composable +private fun DownloadingProgressDialogGradientPreview() { + val progress = remember { 0.74f } + + DownloadingProgressDialog( + progress = progress, + progressBarStyle = ProgressBarStyle( + progressBrush = Brush.horizontalGradient( + 0f to Color.Yellow, + progress to Color.Blue + ), + trackBrush = SolidColor(Color.LightGray) + ) + ) +} + +@Preview(showBackground = true) +@Composable +private fun BaseDownloadingProgressDialogPreview() { + val totalValue = remember { 10f } + val progress = remember { 0.73f } + + BaseDownloadingProgressDialog( + progress = progress, + total = totalValue, + downloaded = progress * totalValue, + title = { + Text( + text = "Downloading file", + style = MaterialTheme.typography.headlineMedium + ) + }, + description = { + Text( + text = "The Adventures of Sherlock Holmes", + style = MaterialTheme.typography.bodyMedium + ) + }, + progressText = { + AdaptableProgressText( + text = "${progress * 100f}%" + ) + }, + supportingText = { value -> + Text( + text = "$value MB", + color = Color.Gray, + style = MaterialTheme.typography.bodySmall + ) + }, + button = { + TextButton( + onClick = {} + ) { + Text("Cancel") } } ) @@ -106,6 +276,44 @@ fun DownloadingProgressDialog( @Preview(showBackground = true) @Composable -fun DownloadingProgressDialogPreview() { - DownloadingProgressDialog() +private fun DownloadingProgressDialogPreview() { + val totalValue = remember { 10f } + val progress = remember { 0.5f } + + DownloadingProgressDialog( + progress = progress, + total = totalValue, + downloaded = progress * totalValue, + title = { + Text( + text = "Downloading file", + style = MaterialTheme.typography.headlineMedium + ) + }, + description = { + Text( + text = "The Adventures of Sherlock Holmes", + style = MaterialTheme.typography.bodyMedium + ) + }, + progressText = { + AdaptableProgressText( + text = "${progress * 100f}%" + ) + }, + supportingText = { value -> + Text( + text = "$value MB", + color = Color.Gray, + style = MaterialTheme.typography.bodySmall + ) + }, + button = { + TextButton( + onClick = {} + ) { + Text("Cancel") + } + } + ) } \ No newline at end of file diff --git a/design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/models/DialogStyle.kt b/design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/models/DialogStyle.kt deleted file mode 100644 index 16c6d710..00000000 --- a/design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/models/DialogStyle.kt +++ /dev/null @@ -1,8 +0,0 @@ -package com.urlaunched.android.design.ui.downloadingProgressDialog.models - -import androidx.compose.ui.unit.Dp -import com.urlaunched.android.design.resources.dimens.Dimens - -data class DialogStyle( - val contentPadding: Dp = Dimens.spacingNormal -) \ No newline at end of file diff --git a/design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/models/ProgressBarColors.kt b/design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/models/ProgressBarColors.kt deleted file mode 100644 index 164141f7..00000000 --- a/design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/models/ProgressBarColors.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.urlaunched.android.design.ui.downloadingProgressDialog.models - -import androidx.compose.ui.graphics.Color - -data class ProgressBarColors( - val progressColors: List = listOf(Color.Blue), - val progressBackgroundColor: Color = Color.Gray, - val backgroundDialogColor: Color = Color.White -) \ No newline at end of file diff --git a/design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/models/ProgressBarStyle.kt b/design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/models/ProgressBarStyle.kt index bb071b66..40e67dd5 100644 --- a/design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/models/ProgressBarStyle.kt +++ b/design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/models/ProgressBarStyle.kt @@ -1,12 +1,31 @@ package com.urlaunched.android.design.ui.downloadingProgressDialog.models +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.ui.graphics.Brush +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.Shape +import androidx.compose.ui.graphics.SolidColor import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp data class ProgressBarStyle( - val progressBarMinWidth: Dp = 32.dp, val progressBarHeight: Dp = 36.dp, - val progressBoxCornerRadius: Dp = 32.dp, - val progressCornerRadius: Dp = 32.dp, - val dialogCornerRadius: Dp = 24.dp -) \ No newline at end of file + val trackBrush: Brush, + val progressBrush: Brush, + val trackShape: Shape = CircleShape, + val progressShape: Shape = trackShape +) { + constructor( + progressBarHeight: Dp = 36.dp, + trackColor: Color = Color.LightGray, + progressColor: Color = Color.Blue, + trackShape: Shape = CircleShape, + progressShape: Shape = trackShape + ): this( + progressBarHeight = progressBarHeight, + trackBrush = SolidColor(trackColor), + progressBrush = SolidColor(progressColor), + trackShape = trackShape, + progressShape = progressShape + ) +} \ No newline at end of file From 3fcd3f521b4d51fc4f7f51c52d0fc532053c6e65 Mon Sep 17 00:00:00 2001 From: Khotych Mykola Date: Wed, 17 Sep 2025 18:48:41 +0300 Subject: [PATCH 03/20] Refactor DownloadingProgressDialog --- .../AdaptableProgressText.kt | 22 ++++++++----------- .../DownloadingProgressDialog.kt | 2 +- .../models/ProgressBarStyle.kt | 2 +- 3 files changed, 11 insertions(+), 15 deletions(-) diff --git a/design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/AdaptableProgressText.kt b/design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/AdaptableProgressText.kt index 7e35801c..a08b99df 100644 --- a/design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/AdaptableProgressText.kt +++ b/design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/AdaptableProgressText.kt @@ -45,20 +45,16 @@ fun AdaptableProgressText( ) } -private fun Modifier.blendMode( - blendMode: BlendMode -): Modifier { - return this.drawWithCache { - val graphicsLayer = obtainGraphicsLayer() - graphicsLayer.apply { - record { - drawContent() - } - this.blendMode = blendMode - } - onDrawWithContent { - drawLayer(graphicsLayer) +private fun Modifier.blendMode(blendMode: BlendMode): Modifier = this.drawWithCache { + val graphicsLayer = obtainGraphicsLayer() + graphicsLayer.apply { + record { + drawContent() } + this.blendMode = blendMode + } + onDrawWithContent { + drawLayer(graphicsLayer) } } diff --git a/design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/DownloadingProgressDialog.kt b/design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/DownloadingProgressDialog.kt index 3e322aca..94a3942d 100644 --- a/design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/DownloadingProgressDialog.kt +++ b/design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/DownloadingProgressDialog.kt @@ -185,7 +185,7 @@ private fun DownloadingProgressBar( trackShape: Shape, progressShape: Shape, trackBrush: Brush, - progressBrush: Brush, + progressBrush: Brush ) { Canvas( modifier = modifier diff --git a/design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/models/ProgressBarStyle.kt b/design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/models/ProgressBarStyle.kt index 40e67dd5..6f7b9dde 100644 --- a/design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/models/ProgressBarStyle.kt +++ b/design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/models/ProgressBarStyle.kt @@ -21,7 +21,7 @@ data class ProgressBarStyle( progressColor: Color = Color.Blue, trackShape: Shape = CircleShape, progressShape: Shape = trackShape - ): this( + ) : this( progressBarHeight = progressBarHeight, trackBrush = SolidColor(trackColor), progressBrush = SolidColor(progressColor), From a653a96e23945b961d25b885490d24136ba91c98 Mon Sep 17 00:00:00 2001 From: Khotych Mykola Date: Wed, 17 Sep 2025 18:50:53 +0300 Subject: [PATCH 04/20] Update api --- design/api/current.api | 59 +++++++++++++++--------------------------- 1 file changed, 21 insertions(+), 38 deletions(-) diff --git a/design/api/current.api b/design/api/current.api index 77c81774..b1708160 100644 --- a/design/api/current.api +++ b/design/api/current.api @@ -130,55 +130,38 @@ package com.urlaunched.android.design.ui.counter.ui { package com.urlaunched.android.design.ui.downloadingProgressDialog { + public final class AdaptableProgressTextKt { + method @androidx.compose.runtime.Composable public static void AdaptableProgressText(String text, optional androidx.compose.ui.Modifier modifier, optional int overflow, optional boolean softWrap, optional int maxLines, optional int minLines, optional androidx.compose.ui.text.TextStyle style, optional kotlin.jvm.functions.Function1? onTextLayout); + } + public final class DownloadingProgressDialogKt { - method @androidx.compose.runtime.Composable public static void DownloadingProgressDialog(optional androidx.compose.ui.Modifier modifier, optional float progress, optional com.urlaunched.android.design.ui.downloadingProgressDialog.models.ProgressBarColors progressBarColors, optional com.urlaunched.android.design.ui.downloadingProgressDialog.models.ProgressBarStyle progressBarStyle, optional com.urlaunched.android.design.ui.downloadingProgressDialog.models.DialogStyle dialogStyle, optional kotlin.jvm.functions.Function0 progressText, optional kotlin.jvm.functions.Function0 title, optional kotlin.jvm.functions.Function0 description, optional kotlin.jvm.functions.Function0 definitionText, optional kotlin.jvm.functions.Function0 button); - method @androidx.compose.runtime.Composable @androidx.compose.ui.tooling.preview.Preview(showBackground=true) public static void DownloadingProgressDialogPreview(); + method @androidx.compose.runtime.Composable public static void BaseDownloadingProgressDialog(@com.composables.core.androidx.annotation.FloatRange(from=0.0, to=1.0) float progress, optional float downloaded, optional float total, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0 onDismissRequest, optional com.urlaunched.android.design.ui.downloadingProgressDialog.models.ProgressBarStyle progressBarStyle, optional long dialogContainerColor, optional androidx.compose.ui.graphics.Shape dialogContainerShape, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.ui.window.DialogProperties dialogProperties, optional kotlin.jvm.functions.Function1? title, optional kotlin.jvm.functions.Function1? description, optional kotlin.jvm.functions.Function1? progressText, optional kotlin.jvm.functions.Function1? supportingText, optional kotlin.jvm.functions.Function1? button); + method @androidx.compose.runtime.Composable public static void DownloadingProgressDialog(@com.composables.core.androidx.annotation.FloatRange(from=0.0, to=1.0) float progress, optional float downloaded, optional float total, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0 onDismissRequest, optional com.urlaunched.android.design.ui.downloadingProgressDialog.models.ProgressBarStyle progressBarStyle, optional long dialogContainerColor, optional androidx.compose.ui.graphics.Shape dialogContainerShape, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.ui.window.DialogProperties dialogProperties, optional kotlin.jvm.functions.Function1? title, optional kotlin.jvm.functions.Function1? description, optional kotlin.jvm.functions.Function1? progressText, optional kotlin.jvm.functions.Function1? supportingText, optional kotlin.jvm.functions.Function1? button); } } package com.urlaunched.android.design.ui.downloadingProgressDialog.models { - public final class DialogStyle { - ctor public DialogStyle(optional float contentPadding); - method public float component1-D9Ej5fM(); - method public com.urlaunched.android.design.ui.downloadingProgressDialog.models.DialogStyle copy-0680j_4(float contentPadding); - method public float getContentPadding(); - property public final float contentPadding; - } - - public final class ProgressBarColors { - ctor public ProgressBarColors(optional java.util.List progressColors, optional long progressBackgroundColor, optional long backgroundDialogColor); - method public java.util.List component1(); - method public long component2-0d7_KjU(); - method public long component3-0d7_KjU(); - method public com.urlaunched.android.design.ui.downloadingProgressDialog.models.ProgressBarColors copy-WkMS-hQ(java.util.List progressColors, long progressBackgroundColor, long backgroundDialogColor); - method public long getBackgroundDialogColor(); - method public long getProgressBackgroundColor(); - method public java.util.List getProgressColors(); - property public final long backgroundDialogColor; - property public final long progressBackgroundColor; - property public final java.util.List progressColors; - } - public final class ProgressBarStyle { - ctor public ProgressBarStyle(optional float progressBarMinWidth, optional float progressBarHeight, optional float progressBoxCornerRadius, optional float progressCornerRadius, optional float dialogCornerRadius); + ctor public ProgressBarStyle(optional float progressBarHeight, androidx.compose.ui.graphics.Brush trackBrush, androidx.compose.ui.graphics.Brush progressBrush, optional androidx.compose.ui.graphics.Shape trackShape, optional androidx.compose.ui.graphics.Shape progressShape); + ctor public ProgressBarStyle(optional float progressBarHeight, optional long trackColor, optional long progressColor, optional androidx.compose.ui.graphics.Shape trackShape, optional androidx.compose.ui.graphics.Shape progressShape); method public float component1-D9Ej5fM(); - method public float component2-D9Ej5fM(); - method public float component3-D9Ej5fM(); - method public float component4-D9Ej5fM(); - method public float component5-D9Ej5fM(); - method public com.urlaunched.android.design.ui.downloadingProgressDialog.models.ProgressBarStyle copy-RyVG9vg(float progressBarMinWidth, float progressBarHeight, float progressBoxCornerRadius, float progressCornerRadius, float dialogCornerRadius); - method public float getDialogCornerRadius(); + method public androidx.compose.ui.graphics.Brush component2(); + method public androidx.compose.ui.graphics.Brush component3(); + method public androidx.compose.ui.graphics.Shape component4(); + method public androidx.compose.ui.graphics.Shape component5(); + method public com.urlaunched.android.design.ui.downloadingProgressDialog.models.ProgressBarStyle copy--orJrPs(float progressBarHeight, androidx.compose.ui.graphics.Brush trackBrush, androidx.compose.ui.graphics.Brush progressBrush, androidx.compose.ui.graphics.Shape trackShape, androidx.compose.ui.graphics.Shape progressShape); method public float getProgressBarHeight(); - method public float getProgressBarMinWidth(); - method public float getProgressBoxCornerRadius(); - method public float getProgressCornerRadius(); - property public final float dialogCornerRadius; + method public androidx.compose.ui.graphics.Brush getProgressBrush(); + method public androidx.compose.ui.graphics.Shape getProgressShape(); + method public androidx.compose.ui.graphics.Brush getTrackBrush(); + method public androidx.compose.ui.graphics.Shape getTrackShape(); property public final float progressBarHeight; - property public final float progressBarMinWidth; - property public final float progressBoxCornerRadius; - property public final float progressCornerRadius; + property public final androidx.compose.ui.graphics.Brush progressBrush; + property public final androidx.compose.ui.graphics.Shape progressShape; + property public final androidx.compose.ui.graphics.Brush trackBrush; + property public final androidx.compose.ui.graphics.Shape trackShape; } } From 9f470692f2ea6d69bb1a2aed5f58e2dcbe14b9bd Mon Sep 17 00:00:00 2001 From: Khotych Mykola Date: Wed, 17 Sep 2025 19:16:57 +0300 Subject: [PATCH 05/20] Move progress bar height into a constant --- .../constants/DownloadingProgressDialogDimens.kt | 7 +++++++ .../downloadingProgressDialog/models/ProgressBarStyle.kt | 6 +++--- 2 files changed, 10 insertions(+), 3 deletions(-) create mode 100644 design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/constants/DownloadingProgressDialogDimens.kt diff --git a/design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/constants/DownloadingProgressDialogDimens.kt b/design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/constants/DownloadingProgressDialogDimens.kt new file mode 100644 index 00000000..08e726de --- /dev/null +++ b/design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/constants/DownloadingProgressDialogDimens.kt @@ -0,0 +1,7 @@ +package com.urlaunched.android.design.ui.downloadingProgressDialog.constants + +import androidx.compose.ui.unit.dp + +internal object DownloadingProgressDialogDimens { + val defaultProgressBarHeight = 36.dp +} \ No newline at end of file diff --git a/design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/models/ProgressBarStyle.kt b/design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/models/ProgressBarStyle.kt index 6f7b9dde..ca3d1f65 100644 --- a/design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/models/ProgressBarStyle.kt +++ b/design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/models/ProgressBarStyle.kt @@ -6,17 +6,17 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Shape import androidx.compose.ui.graphics.SolidColor import androidx.compose.ui.unit.Dp -import androidx.compose.ui.unit.dp +import com.urlaunched.android.design.ui.downloadingProgressDialog.constants.DownloadingProgressDialogDimens data class ProgressBarStyle( - val progressBarHeight: Dp = 36.dp, + val progressBarHeight: Dp = DownloadingProgressDialogDimens.defaultProgressBarHeight, val trackBrush: Brush, val progressBrush: Brush, val trackShape: Shape = CircleShape, val progressShape: Shape = trackShape ) { constructor( - progressBarHeight: Dp = 36.dp, + progressBarHeight: Dp = DownloadingProgressDialogDimens.defaultProgressBarHeight, trackColor: Color = Color.LightGray, progressColor: Color = Color.Blue, trackShape: Shape = CircleShape, From 929c642ad4ee6abb7eae58aa854302eba074753b Mon Sep 17 00:00:00 2001 From: Khotych Mykola Date: Thu, 18 Sep 2025 13:31:08 +0300 Subject: [PATCH 06/20] Add progress text component --- .../design/ui/progresstext/ProgressText.kt | 115 ++++++++++++++++++ .../progresstext/models/ProgressDirection.kt | 40 ++++++ 2 files changed, 155 insertions(+) create mode 100644 design/src/main/java/com/urlaunched/android/design/ui/progresstext/ProgressText.kt create mode 100644 design/src/main/java/com/urlaunched/android/design/ui/progresstext/models/ProgressDirection.kt diff --git a/design/src/main/java/com/urlaunched/android/design/ui/progresstext/ProgressText.kt b/design/src/main/java/com/urlaunched/android/design/ui/progresstext/ProgressText.kt new file mode 100644 index 00000000..cc760cf8 --- /dev/null +++ b/design/src/main/java/com/urlaunched/android/design/ui/progresstext/ProgressText.kt @@ -0,0 +1,115 @@ +package com.urlaunched.android.design.ui.progresstext + +import androidx.annotation.FloatRange +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.material3.LocalTextStyle +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Brush +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalLayoutDirection +import androidx.compose.ui.text.TextLayoutResult +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.FontFamily +import androidx.compose.ui.text.font.FontStyle +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.text.style.TextDecoration +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.TextUnit +import androidx.compose.ui.unit.dp +import com.urlaunched.android.design.ui.progresstext.models.ProgressDirection + +@Composable +fun ProgressText( + text: String, + @FloatRange(0.0, 1.0) + progress: Float, + startColor: Color, + endColor: Color, + progressDirection: ProgressDirection = ProgressDirection.Horizontal, + modifier: Modifier = Modifier, + fontSize: TextUnit = TextUnit.Unspecified, + fontStyle: FontStyle? = null, + fontWeight: FontWeight? = null, + fontFamily: FontFamily? = null, + letterSpacing: TextUnit = TextUnit.Unspecified, + textDecoration: TextDecoration? = null, + textAlign: TextAlign? = null, + lineHeight: TextUnit = TextUnit.Unspecified, + overflow: TextOverflow = TextOverflow.Clip, + softWrap: Boolean = true, + maxLines: Int = Int.MAX_VALUE, + minLines: Int = 1, + onTextLayout: ((TextLayoutResult) -> Unit)? = null, + style: TextStyle = LocalTextStyle.current +) { + Text( + text = text, + overflow = overflow, + softWrap = softWrap, + maxLines = maxLines, + minLines = minLines, + fontSize = fontSize, + fontStyle = fontStyle, + fontFamily = fontFamily, + fontWeight = fontWeight, + letterSpacing = letterSpacing, + textDecoration = textDecoration, + onTextLayout = onTextLayout, + lineHeight = lineHeight, + textAlign = textAlign, + modifier = modifier, + style = style.copy( + brush = Brush.linearGradient( + colorStops = arrayOf( + 0f to startColor, + progress to startColor, + progress to endColor, + 1f to endColor + ), + start = progressDirection.getStartOffset(LocalLayoutDirection.current), + end = progressDirection.getEndOffset(LocalLayoutDirection.current) + ) + ) + ) +} + +@Preview +@Composable +private fun ProgressTextPreview() { + val progress = remember { 0.59f } + Box( + modifier = Modifier + .size(200.dp, 50.dp) + .clip(CircleShape) + .background(Color.LightGray) + ) { + Box( + Modifier + .fillMaxWidth(progress) + .fillMaxHeight() + .background(Color.Yellow) + ) + ProgressText( + text = "PROGRESS TEXT", + progress = progress, + startColor = Color.Red, + endColor = Color.Gray, + textAlign = TextAlign.Center, + modifier = Modifier + .fillMaxWidth() + .align(Alignment.Center) + ) + } +} \ No newline at end of file diff --git a/design/src/main/java/com/urlaunched/android/design/ui/progresstext/models/ProgressDirection.kt b/design/src/main/java/com/urlaunched/android/design/ui/progresstext/models/ProgressDirection.kt new file mode 100644 index 00000000..cc70fa3f --- /dev/null +++ b/design/src/main/java/com/urlaunched/android/design/ui/progresstext/models/ProgressDirection.kt @@ -0,0 +1,40 @@ +package com.urlaunched.android.design.ui.progresstext.models + +import androidx.compose.ui.geometry.Offset +import androidx.compose.ui.unit.LayoutDirection + +interface ProgressDirection { + fun getStartOffset(layoutDirection: LayoutDirection): Offset + fun getEndOffset(layoutDirection: LayoutDirection): Offset + + object Horizontal : ProgressDirection { + override fun getStartOffset(layoutDirection: LayoutDirection): Offset = when (layoutDirection) { + LayoutDirection.Ltr -> LeftToRight.getStartOffset(layoutDirection) + LayoutDirection.Rtl -> RightToLeft.getStartOffset(layoutDirection) + } + override fun getEndOffset(layoutDirection: LayoutDirection): Offset = when (layoutDirection) { + LayoutDirection.Ltr -> LeftToRight.getEndOffset(layoutDirection) + LayoutDirection.Rtl -> RightToLeft.getEndOffset(layoutDirection) + } + } + + object LeftToRight : ProgressDirection { + override fun getStartOffset(layoutDirection: LayoutDirection): Offset = Offset.Zero + override fun getEndOffset(layoutDirection: LayoutDirection): Offset = Offset(Float.POSITIVE_INFINITY, 0f) + } + + object RightToLeft : ProgressDirection { + override fun getStartOffset(layoutDirection: LayoutDirection): Offset = Offset(Float.POSITIVE_INFINITY, 0f) + override fun getEndOffset(layoutDirection: LayoutDirection): Offset = Offset.Zero + } + + object TopToBottom : ProgressDirection { + override fun getStartOffset(layoutDirection: LayoutDirection): Offset = Offset.Zero + override fun getEndOffset(layoutDirection: LayoutDirection): Offset = Offset(0f, Float.POSITIVE_INFINITY) + } + + object BottomToTop : ProgressDirection { + override fun getStartOffset(layoutDirection: LayoutDirection): Offset = Offset(0f, Float.POSITIVE_INFINITY) + override fun getEndOffset(layoutDirection: LayoutDirection): Offset = Offset.Zero + } +} \ No newline at end of file From e5016a21c42f9b5ae7619e02dd3f04d5a62a4d26 Mon Sep 17 00:00:00 2001 From: Khotych Mykola Date: Thu, 18 Sep 2025 13:35:28 +0300 Subject: [PATCH 07/20] Replace AdaptableProgressText with ProgressText for DownloadingProgressDialog --- .../AdaptableProgressText.kt | 83 ------------------- .../DownloadingProgressDialog.kt | 28 +++++-- 2 files changed, 22 insertions(+), 89 deletions(-) delete mode 100644 design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/AdaptableProgressText.kt diff --git a/design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/AdaptableProgressText.kt b/design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/AdaptableProgressText.kt deleted file mode 100644 index a08b99df..00000000 --- a/design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/AdaptableProgressText.kt +++ /dev/null @@ -1,83 +0,0 @@ -package com.urlaunched.android.design.ui.downloadingProgressDialog - -import androidx.compose.foundation.background -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.size -import androidx.compose.material3.LocalTextStyle -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.drawWithCache -import androidx.compose.ui.graphics.BlendMode -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.layer.drawLayer -import androidx.compose.ui.text.TextLayoutResult -import androidx.compose.ui.text.TextStyle -import androidx.compose.ui.text.style.TextOverflow -import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.dp - -@Composable -fun AdaptableProgressText( - text: String, - modifier: Modifier = Modifier, - overflow: TextOverflow = TextOverflow.Clip, - softWrap: Boolean = true, - maxLines: Int = Int.MAX_VALUE, - minLines: Int = 1, - style: TextStyle = LocalTextStyle.current, - onTextLayout: ((TextLayoutResult) -> Unit)? = null -) { - Text( - text = text, - style = style, - color = Color.White, - overflow = overflow, - softWrap = softWrap, - maxLines = maxLines, - minLines = minLines, - onTextLayout = onTextLayout, - modifier = modifier.blendMode( - blendMode = BlendMode.Exclusion - ) - ) -} - -private fun Modifier.blendMode(blendMode: BlendMode): Modifier = this.drawWithCache { - val graphicsLayer = obtainGraphicsLayer() - graphicsLayer.apply { - record { - drawContent() - } - this.blendMode = blendMode - } - onDrawWithContent { - drawLayer(graphicsLayer) - } -} - -@Preview -@Composable -private fun AdaptableProgressTextPreview() { - Box( - contentAlignment = Alignment.Center - ) { - Row { - Box( - Modifier - .size(100.dp, 100.dp) - .background(Color.Yellow) - ) - Box( - Modifier - .size(100.dp, 100.dp) - .background(Color.Blue) - ) - } - AdaptableProgressText( - text = "ADOPTED TEXT TEST" - ) - } -} \ No newline at end of file diff --git a/design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/DownloadingProgressDialog.kt b/design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/DownloadingProgressDialog.kt index 94a3942d..bea5bfeb 100644 --- a/design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/DownloadingProgressDialog.kt +++ b/design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/DownloadingProgressDialog.kt @@ -31,14 +31,16 @@ import androidx.compose.ui.graphics.SolidColor import androidx.compose.ui.graphics.addOutline import androidx.compose.ui.graphics.drawOutline import androidx.compose.ui.graphics.drawscope.clipPath +import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.window.DialogProperties import com.composables.core.androidx.annotation.FloatRange import com.urlaunched.android.design.resources.dimens.Dimens import com.urlaunched.android.design.ui.downloadingProgressDialog.models.ProgressBarStyle +import com.urlaunched.android.design.ui.progresstext.ProgressText /** - * @see AdaptableProgressText + * @see ProgressText */ @Composable fun DownloadingProgressDialog( @@ -108,7 +110,7 @@ fun DownloadingProgressDialog( } /** - * @see AdaptableProgressText + * @see ProgressText */ @OptIn(ExperimentalMaterial3Api::class) @Composable @@ -253,8 +255,15 @@ private fun BaseDownloadingProgressDialogPreview() { ) }, progressText = { - AdaptableProgressText( - text = "${progress * 100f}%" + ProgressText( + text = "${progress * 100f}%", + progress = progress, + startColor = Color.Yellow, + endColor = Color.Gray, + textAlign = TextAlign.Center, + modifier = Modifier + .fillMaxWidth() + .align(Alignment.Center) ) }, supportingText = { value -> @@ -297,8 +306,15 @@ private fun DownloadingProgressDialogPreview() { ) }, progressText = { - AdaptableProgressText( - text = "${progress * 100f}%" + ProgressText( + text = "${progress * 100f}%", + progress = progress, + startColor = Color.Yellow, + endColor = Color.Gray, + textAlign = TextAlign.Center, + modifier = Modifier + .fillMaxWidth() + .align(Alignment.Center) ) }, supportingText = { value -> From da2ab2a68c80be2d03668fd403fdeb869bed3296 Mon Sep 17 00:00:00 2001 From: Khotych Mykola Date: Thu, 18 Sep 2025 13:36:28 +0300 Subject: [PATCH 08/20] Rename downloadingProgressDialog package --- .../DownloadingProgressDialog.kt | 4 ++-- .../constants/DownloadingProgressDialogDimens.kt | 2 +- .../models/ProgressBarStyle.kt | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) rename design/src/main/java/com/urlaunched/android/design/ui/{downloadingProgressDialog => downloadingprogressdialog}/DownloadingProgressDialog.kt (98%) rename design/src/main/java/com/urlaunched/android/design/ui/{downloadingProgressDialog => downloadingprogressdialog}/constants/DownloadingProgressDialogDimens.kt (68%) rename design/src/main/java/com/urlaunched/android/design/ui/{downloadingProgressDialog => downloadingprogressdialog}/models/ProgressBarStyle.kt (89%) diff --git a/design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/DownloadingProgressDialog.kt b/design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/DownloadingProgressDialog.kt similarity index 98% rename from design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/DownloadingProgressDialog.kt rename to design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/DownloadingProgressDialog.kt index bea5bfeb..2bace515 100644 --- a/design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/DownloadingProgressDialog.kt +++ b/design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/DownloadingProgressDialog.kt @@ -1,4 +1,4 @@ -package com.urlaunched.android.design.ui.downloadingProgressDialog +package com.urlaunched.android.design.ui.downloadingprogressdialog import androidx.compose.foundation.Canvas import androidx.compose.foundation.background @@ -36,7 +36,7 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.window.DialogProperties import com.composables.core.androidx.annotation.FloatRange import com.urlaunched.android.design.resources.dimens.Dimens -import com.urlaunched.android.design.ui.downloadingProgressDialog.models.ProgressBarStyle +import com.urlaunched.android.design.ui.downloadingprogressdialog.models.ProgressBarStyle import com.urlaunched.android.design.ui.progresstext.ProgressText /** diff --git a/design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/constants/DownloadingProgressDialogDimens.kt b/design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/constants/DownloadingProgressDialogDimens.kt similarity index 68% rename from design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/constants/DownloadingProgressDialogDimens.kt rename to design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/constants/DownloadingProgressDialogDimens.kt index 08e726de..7be39b26 100644 --- a/design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/constants/DownloadingProgressDialogDimens.kt +++ b/design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/constants/DownloadingProgressDialogDimens.kt @@ -1,4 +1,4 @@ -package com.urlaunched.android.design.ui.downloadingProgressDialog.constants +package com.urlaunched.android.design.ui.downloadingprogressdialog.constants import androidx.compose.ui.unit.dp diff --git a/design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/models/ProgressBarStyle.kt b/design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/models/ProgressBarStyle.kt similarity index 89% rename from design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/models/ProgressBarStyle.kt rename to design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/models/ProgressBarStyle.kt index ca3d1f65..c8fb47d7 100644 --- a/design/src/main/java/com/urlaunched/android/design/ui/downloadingProgressDialog/models/ProgressBarStyle.kt +++ b/design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/models/ProgressBarStyle.kt @@ -1,4 +1,4 @@ -package com.urlaunched.android.design.ui.downloadingProgressDialog.models +package com.urlaunched.android.design.ui.downloadingprogressdialog.models import androidx.compose.foundation.shape.CircleShape import androidx.compose.ui.graphics.Brush @@ -6,7 +6,7 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Shape import androidx.compose.ui.graphics.SolidColor import androidx.compose.ui.unit.Dp -import com.urlaunched.android.design.ui.downloadingProgressDialog.constants.DownloadingProgressDialogDimens +import com.urlaunched.android.design.ui.downloadingprogressdialog.constants.DownloadingProgressDialogDimens data class ProgressBarStyle( val progressBarHeight: Dp = DownloadingProgressDialogDimens.defaultProgressBarHeight, From 50e46893be656213066a15b92ba46c2711a6118f Mon Sep 17 00:00:00 2001 From: Khotych Mykola Date: Thu, 18 Sep 2025 14:43:51 +0300 Subject: [PATCH 09/20] Add downloading progress bar component --- .../DownloadingProgressBar.kt | 298 ++++++++++++++++++ 1 file changed, 298 insertions(+) create mode 100644 design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/DownloadingProgressBar.kt diff --git a/design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/DownloadingProgressBar.kt b/design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/DownloadingProgressBar.kt new file mode 100644 index 00000000..a133f136 --- /dev/null +++ b/design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/DownloadingProgressBar.kt @@ -0,0 +1,298 @@ +package com.urlaunched.android.design.ui.downloadingprogressdialog + +import androidx.compose.animation.core.AnimationSpec +import androidx.compose.animation.core.animateFloatAsState +import androidx.compose.animation.core.tween +import androidx.compose.foundation.Canvas +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.BoxScope +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.RowScope +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableFloatStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Brush +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.Path +import androidx.compose.ui.graphics.Shape +import androidx.compose.ui.graphics.SolidColor +import androidx.compose.ui.graphics.addOutline +import androidx.compose.ui.graphics.drawOutline +import androidx.compose.ui.graphics.drawscope.clipPath +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.dp +import com.urlaunched.android.design.resources.dimens.Dimens +import com.urlaunched.android.design.ui.progresstext.ProgressText +import kotlinx.coroutines.delay +import kotlinx.coroutines.isActive + +@Composable +fun AnimatedDownloadingProgressBar( + progress: Float, + trackColor: Color, + progressColor: Color, + modifier: Modifier = Modifier, + downloaded: Float = progress, + total: Float = 1f, + progressBarHeight: Dp = Dimens.spacingLarge, + trackShape: Shape = CircleShape, + progressShape: Shape = trackShape, + animationSpec: AnimationSpec = tween(), + progressText: (@Composable BoxScope.(Float) -> Unit)? = null, + supportingText: (@Composable RowScope.(Float) -> Unit)? = null +) { + AnimatedDownloadingProgressBar( + progress = progress, + trackBrush = SolidColor(trackColor), + progressBrush = SolidColor(progressColor), + modifier = modifier, + downloaded = downloaded, + total = total, + progressBarHeight = progressBarHeight, + trackShape = trackShape, + progressShape = progressShape, + animationSpec = animationSpec, + progressText = progressText, + supportingText = supportingText + ) +} + +@Composable +fun AnimatedDownloadingProgressBar( + progress: Float, + trackBrush: Brush, + progressBrush: Brush, + modifier: Modifier = Modifier, + downloaded: Float = progress, + total: Float = 1f, + progressBarHeight: Dp = Dimens.spacingLarge, + trackShape: Shape = CircleShape, + progressShape: Shape = trackShape, + animationSpec: AnimationSpec = tween(), + progressText: (@Composable BoxScope.(Float) -> Unit)? = null, + supportingText: (@Composable RowScope.(Float) -> Unit)? = null +) { + val animatedProgress by animateFloatAsState( + targetValue = progress, + animationSpec = animationSpec + ) + val animatedDownloaded by animateFloatAsState( + targetValue = downloaded, + animationSpec = animationSpec + ) + + DownloadingProgressBar( + progress = animatedProgress, + trackBrush = trackBrush, + progressBrush = progressBrush, + modifier = modifier, + downloaded = animatedDownloaded, + total = total, + progressBarHeight = progressBarHeight, + trackShape = trackShape, + progressShape = progressShape, + progressText = progressText, + supportingText = supportingText + ) +} + +@Composable +fun DownloadingProgressBar( + progress: Float, + trackColor: Color, + progressColor: Color, + modifier: Modifier = Modifier, + downloaded: Float = progress, + total: Float = 1f, + progressBarHeight: Dp = Dimens.spacingLarge, + trackShape: Shape = CircleShape, + progressShape: Shape = trackShape, + progressText: (@Composable BoxScope.(Float) -> Unit)? = null, + supportingText: (@Composable RowScope.(Float) -> Unit)? = null +) { + DownloadingProgressBar( + progress = progress, + trackBrush = SolidColor(trackColor), + progressBrush = SolidColor(progressColor), + modifier = modifier, + downloaded = downloaded, + total = total, + progressBarHeight = progressBarHeight, + trackShape = trackShape, + progressShape = progressShape, + progressText = progressText, + supportingText = supportingText + ) +} + +@Composable +fun DownloadingProgressBar( + progress: Float, + trackBrush: Brush, + progressBrush: Brush, + modifier: Modifier = Modifier, + downloaded: Float = progress, + total: Float = 1f, + progressBarHeight: Dp = Dimens.spacingLarge, + trackShape: Shape = CircleShape, + progressShape: Shape = trackShape, + progressText: (@Composable BoxScope.(Float) -> Unit)? = null, + supportingText: (@Composable RowScope.(Float) -> Unit)? = null +) { + val safeProgress = progress.coerceIn(0f, 1f) + Column(modifier = modifier) { + Box( + contentAlignment = Alignment.Center + ) { + ProgressBar( + modifier = Modifier + .fillMaxWidth() + .height(progressBarHeight), + progress = safeProgress, + trackBrush = trackBrush, + progressBrush = progressBrush, + trackShape = trackShape, + progressShape = progressShape + ) + + progressText?.invoke(this@Box, safeProgress) + } + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween + ) { + supportingText?.invoke(this@Row, downloaded) + supportingText?.invoke(this@Row, total) + } + } +} + +@Composable +private fun ProgressBar( + progress: Float, + modifier: Modifier, + trackBrush: Brush, + progressBrush: Brush, + trackShape: Shape, + progressShape: Shape +) { + Canvas(modifier = modifier) { + val trackOutline = trackShape.createOutline(size, layoutDirection, this) + drawOutline( + brush = trackBrush, + outline = trackOutline + ) + + val progressWidth = size.width * progress + val progressSize = size.copy(width = progressWidth) + val progressOutline = progressShape.createOutline(progressSize, layoutDirection, this) + + clipPath( + path = Path().apply { addOutline(trackOutline) } + ) { + drawOutline( + brush = progressBrush, + outline = progressOutline + ) + } + } +} + +@Preview +@Composable +private fun GradientProgressBarPreview() { + val progress = remember { 0.6f } + DownloadingProgressBar( + progress = progress, + progressBarHeight = 50.dp, + progressBrush = Brush.horizontalGradient( + 0f to Color.Cyan, + progress to Color.Magenta + ), + trackBrush = SolidColor(Color.LightGray), + supportingText = { value -> + Text( + text = "$value MB", + color = Color.Gray, + style = MaterialTheme.typography.bodySmall, + modifier = Modifier.padding( + horizontal = Dimens.spacingSmall, + vertical = Dimens.spacingTinyHalf + ) + ) + } + ) +} + +@Preview +@Composable +private fun SolidProgressBarPreview() { + DownloadingProgressBar( + progress = 0.75f, + progressBarHeight = 50.dp, + progressColor = Color.Yellow, + trackColor = Color.LightGray + ) +} + +@Preview +@Composable +private fun AnimatedProgressBarPreview() { + var progress by remember { mutableFloatStateOf(0.33f) } + + LaunchedEffect(Unit) { + while (isActive) { + delay(1000) + if (progress < 1f) { + progress += 0.1f + } else { + progress = 0f + } + } + } + + AnimatedDownloadingProgressBar( + progress = progress, + progressBarHeight = 50.dp, + progressColor = Color.Red, + trackColor = Color.LightGray, + progressText = { animatedProgress -> + ProgressText( + text = "${"%.1f".format(animatedProgress * 100f)} %", + progress = animatedProgress, + startColor = Color.White, + endColor = Color.Gray, + textAlign = TextAlign.Center, + modifier = Modifier + .fillMaxWidth() + .align(Alignment.Center) + ) + }, + supportingText = { value -> + Text( + text = "${"%.2f".format(value)} MB", + color = Color.Gray, + style = MaterialTheme.typography.bodySmall, + modifier = Modifier.padding( + horizontal = Dimens.spacingSmall, + vertical = Dimens.spacingTinyHalf + ) + ) + } + ) +} \ No newline at end of file From 20117f00f88cf37b47f3fdf9bf454cd40f2c427c Mon Sep 17 00:00:00 2001 From: Khotych Mykola Date: Thu, 18 Sep 2025 14:54:09 +0300 Subject: [PATCH 10/20] Use DownloadingProgressBar in DownloadingProgressDialog --- .../DownloadingProgressDialog.kt | 115 +++--------------- 1 file changed, 18 insertions(+), 97 deletions(-) diff --git a/design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/DownloadingProgressDialog.kt b/design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/DownloadingProgressDialog.kt index 2bace515..d0d5af8e 100644 --- a/design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/DownloadingProgressDialog.kt +++ b/design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/DownloadingProgressDialog.kt @@ -1,14 +1,11 @@ package com.urlaunched.android.design.ui.downloadingprogressdialog -import androidx.compose.foundation.Canvas import androidx.compose.foundation.background -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.BoxScope import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.ColumnScope import androidx.compose.foundation.layout.PaddingValues -import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.RowScope import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height @@ -23,14 +20,8 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Brush import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.Path import androidx.compose.ui.graphics.Shape -import androidx.compose.ui.graphics.SolidColor -import androidx.compose.ui.graphics.addOutline -import androidx.compose.ui.graphics.drawOutline -import androidx.compose.ui.graphics.drawscope.clipPath import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.window.DialogProperties @@ -57,8 +48,8 @@ fun DownloadingProgressDialog( dialogProperties: DialogProperties = DialogProperties(), title: (@Composable ColumnScope.() -> Unit)? = null, description: (@Composable ColumnScope.() -> Unit)? = null, - progressText: (@Composable BoxScope.() -> Unit)? = null, - supportingText: (@Composable (Float) -> Unit)? = null, + progressText: (@Composable BoxScope.(Float) -> Unit)? = null, + supportingText: (@Composable RowScope.(Float) -> Unit)? = null, button: (@Composable ColumnScope.() -> Unit)? = null ) { BaseDownloadingProgressDialog( @@ -85,16 +76,7 @@ fun DownloadingProgressDialog( } }, progressText = progressText, - supportingText = if (supportingText != null) { - @Composable { value -> - Column { - Spacer(modifier = Modifier.height(Dimens.spacingTiny)) - supportingText(value) - } - } - } else { - null - }, + supportingText = supportingText, button = button?.let { buttonContent -> @Composable { Column( @@ -128,8 +110,8 @@ fun BaseDownloadingProgressDialog( dialogProperties: DialogProperties = DialogProperties(), title: (@Composable ColumnScope.() -> Unit)? = null, description: (@Composable ColumnScope.() -> Unit)? = null, - progressText: (@Composable BoxScope.() -> Unit)? = null, - supportingText: (@Composable (Float) -> Unit)? = null, + progressText: (@Composable BoxScope.(Float) -> Unit)? = null, + supportingText: (@Composable RowScope.(Float) -> Unit)? = null, button: (@Composable ColumnScope.() -> Unit)? = null ) { BasicAlertDialog( @@ -149,30 +131,19 @@ fun BaseDownloadingProgressDialog( description?.invoke(this@Column) - Box( - contentAlignment = Alignment.Center - ) { - DownloadingProgressBar( - modifier = Modifier - .fillMaxWidth() - .height(progressBarStyle.progressBarHeight), - progress = progress, - trackShape = progressBarStyle.trackShape, - progressShape = progressBarStyle.progressShape, - progressBrush = progressBarStyle.progressBrush, - trackBrush = progressBarStyle.trackBrush - ) - - progressText?.invoke(this@Box) - } - - Row( + DownloadingProgressBar( + progress = progress, + downloaded = downloaded, + total = total, modifier = Modifier.fillMaxWidth(), - horizontalArrangement = Arrangement.SpaceBetween - ) { - supportingText?.invoke(downloaded) - supportingText?.invoke(total) - } + progressBarHeight = progressBarStyle.progressBarHeight, + trackShape = progressBarStyle.trackShape, + progressShape = progressBarStyle.progressShape, + progressBrush = progressBarStyle.progressBrush, + trackBrush = progressBarStyle.trackBrush, + progressText = progressText, + supportingText = supportingText + ) button?.invoke(this@Column) } @@ -180,58 +151,8 @@ fun BaseDownloadingProgressDialog( ) } -@Composable -private fun DownloadingProgressBar( - progress: Float, - modifier: Modifier = Modifier, - trackShape: Shape, - progressShape: Shape, - trackBrush: Brush, - progressBrush: Brush -) { - Canvas( - modifier = modifier - ) { - val trackOutline = trackShape.createOutline(size, layoutDirection, this) - drawOutline( - brush = trackBrush, - outline = trackOutline - ) - - val progressWidth = size.width * progress.coerceIn(0f, 1f) - val progressSize = size.copy(width = progressWidth) - val progressOutline = progressShape.createOutline(progressSize, layoutDirection, this) - - clipPath( - path = Path().apply { addOutline(trackOutline) } - ) { - drawOutline( - brush = progressBrush, - outline = progressOutline - ) - } - } -} - private val DoNothing = {} -@Preview(showBackground = true) -@Composable -private fun DownloadingProgressDialogGradientPreview() { - val progress = remember { 0.74f } - - DownloadingProgressDialog( - progress = progress, - progressBarStyle = ProgressBarStyle( - progressBrush = Brush.horizontalGradient( - 0f to Color.Yellow, - progress to Color.Blue - ), - trackBrush = SolidColor(Color.LightGray) - ) - ) -} - @Preview(showBackground = true) @Composable private fun BaseDownloadingProgressDialogPreview() { From 68f42f2a13691bc49ddf48e57065b84d91de8d0f Mon Sep 17 00:00:00 2001 From: Khotych Mykola Date: Thu, 18 Sep 2025 14:57:19 +0300 Subject: [PATCH 11/20] Update api --- design/api/current.api | 64 +++++++++++++++++++++++++++++++++++++----- 1 file changed, 57 insertions(+), 7 deletions(-) diff --git a/design/api/current.api b/design/api/current.api index b1708160..a166cee3 100644 --- a/design/api/current.api +++ b/design/api/current.api @@ -128,20 +128,23 @@ package com.urlaunched.android.design.ui.counter.ui { } -package com.urlaunched.android.design.ui.downloadingProgressDialog { +package com.urlaunched.android.design.ui.downloadingprogressdialog { - public final class AdaptableProgressTextKt { - method @androidx.compose.runtime.Composable public static void AdaptableProgressText(String text, optional androidx.compose.ui.Modifier modifier, optional int overflow, optional boolean softWrap, optional int maxLines, optional int minLines, optional androidx.compose.ui.text.TextStyle style, optional kotlin.jvm.functions.Function1? onTextLayout); + public final class DownloadingProgressBarKt { + method @androidx.compose.runtime.Composable public static void AnimatedDownloadingProgressBar(float progress, androidx.compose.ui.graphics.Brush trackBrush, androidx.compose.ui.graphics.Brush progressBrush, optional androidx.compose.ui.Modifier modifier, optional float downloaded, optional float total, optional float progressBarHeight, optional androidx.compose.ui.graphics.Shape trackShape, optional androidx.compose.ui.graphics.Shape progressShape, optional androidx.compose.animation.core.AnimationSpec animationSpec, optional kotlin.jvm.functions.Function2? progressText, optional kotlin.jvm.functions.Function2? supportingText); + method @androidx.compose.runtime.Composable public static void AnimatedDownloadingProgressBar(float progress, long trackColor, long progressColor, optional androidx.compose.ui.Modifier modifier, optional float downloaded, optional float total, optional float progressBarHeight, optional androidx.compose.ui.graphics.Shape trackShape, optional androidx.compose.ui.graphics.Shape progressShape, optional androidx.compose.animation.core.AnimationSpec animationSpec, optional kotlin.jvm.functions.Function2? progressText, optional kotlin.jvm.functions.Function2? supportingText); + method @androidx.compose.runtime.Composable public static void DownloadingProgressBar(float progress, androidx.compose.ui.graphics.Brush trackBrush, androidx.compose.ui.graphics.Brush progressBrush, optional androidx.compose.ui.Modifier modifier, optional float downloaded, optional float total, optional float progressBarHeight, optional androidx.compose.ui.graphics.Shape trackShape, optional androidx.compose.ui.graphics.Shape progressShape, optional kotlin.jvm.functions.Function2? progressText, optional kotlin.jvm.functions.Function2? supportingText); + method @androidx.compose.runtime.Composable public static void DownloadingProgressBar(float progress, long trackColor, long progressColor, optional androidx.compose.ui.Modifier modifier, optional float downloaded, optional float total, optional float progressBarHeight, optional androidx.compose.ui.graphics.Shape trackShape, optional androidx.compose.ui.graphics.Shape progressShape, optional kotlin.jvm.functions.Function2? progressText, optional kotlin.jvm.functions.Function2? supportingText); } public final class DownloadingProgressDialogKt { - method @androidx.compose.runtime.Composable public static void BaseDownloadingProgressDialog(@com.composables.core.androidx.annotation.FloatRange(from=0.0, to=1.0) float progress, optional float downloaded, optional float total, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0 onDismissRequest, optional com.urlaunched.android.design.ui.downloadingProgressDialog.models.ProgressBarStyle progressBarStyle, optional long dialogContainerColor, optional androidx.compose.ui.graphics.Shape dialogContainerShape, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.ui.window.DialogProperties dialogProperties, optional kotlin.jvm.functions.Function1? title, optional kotlin.jvm.functions.Function1? description, optional kotlin.jvm.functions.Function1? progressText, optional kotlin.jvm.functions.Function1? supportingText, optional kotlin.jvm.functions.Function1? button); - method @androidx.compose.runtime.Composable public static void DownloadingProgressDialog(@com.composables.core.androidx.annotation.FloatRange(from=0.0, to=1.0) float progress, optional float downloaded, optional float total, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0 onDismissRequest, optional com.urlaunched.android.design.ui.downloadingProgressDialog.models.ProgressBarStyle progressBarStyle, optional long dialogContainerColor, optional androidx.compose.ui.graphics.Shape dialogContainerShape, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.ui.window.DialogProperties dialogProperties, optional kotlin.jvm.functions.Function1? title, optional kotlin.jvm.functions.Function1? description, optional kotlin.jvm.functions.Function1? progressText, optional kotlin.jvm.functions.Function1? supportingText, optional kotlin.jvm.functions.Function1? button); + method @androidx.compose.runtime.Composable public static void BaseDownloadingProgressDialog(@com.composables.core.androidx.annotation.FloatRange(from=0.0, to=1.0) float progress, optional float downloaded, optional float total, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0 onDismissRequest, optional com.urlaunched.android.design.ui.downloadingprogressdialog.models.ProgressBarStyle progressBarStyle, optional long dialogContainerColor, optional androidx.compose.ui.graphics.Shape dialogContainerShape, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.ui.window.DialogProperties dialogProperties, optional kotlin.jvm.functions.Function1? title, optional kotlin.jvm.functions.Function1? description, optional kotlin.jvm.functions.Function2? progressText, optional kotlin.jvm.functions.Function2? supportingText, optional kotlin.jvm.functions.Function1? button); + method @androidx.compose.runtime.Composable public static void DownloadingProgressDialog(@com.composables.core.androidx.annotation.FloatRange(from=0.0, to=1.0) float progress, optional float downloaded, optional float total, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0 onDismissRequest, optional com.urlaunched.android.design.ui.downloadingprogressdialog.models.ProgressBarStyle progressBarStyle, optional long dialogContainerColor, optional androidx.compose.ui.graphics.Shape dialogContainerShape, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.ui.window.DialogProperties dialogProperties, optional kotlin.jvm.functions.Function1? title, optional kotlin.jvm.functions.Function1? description, optional kotlin.jvm.functions.Function2? progressText, optional kotlin.jvm.functions.Function2? supportingText, optional kotlin.jvm.functions.Function1? button); } } -package com.urlaunched.android.design.ui.downloadingProgressDialog.models { +package com.urlaunched.android.design.ui.downloadingprogressdialog.models { public final class ProgressBarStyle { ctor public ProgressBarStyle(optional float progressBarHeight, androidx.compose.ui.graphics.Brush trackBrush, androidx.compose.ui.graphics.Brush progressBrush, optional androidx.compose.ui.graphics.Shape trackShape, optional androidx.compose.ui.graphics.Shape progressShape); @@ -151,7 +154,7 @@ package com.urlaunched.android.design.ui.downloadingProgressDialog.models { method public androidx.compose.ui.graphics.Brush component3(); method public androidx.compose.ui.graphics.Shape component4(); method public androidx.compose.ui.graphics.Shape component5(); - method public com.urlaunched.android.design.ui.downloadingProgressDialog.models.ProgressBarStyle copy--orJrPs(float progressBarHeight, androidx.compose.ui.graphics.Brush trackBrush, androidx.compose.ui.graphics.Brush progressBrush, androidx.compose.ui.graphics.Shape trackShape, androidx.compose.ui.graphics.Shape progressShape); + method public com.urlaunched.android.design.ui.downloadingprogressdialog.models.ProgressBarStyle copy--orJrPs(float progressBarHeight, androidx.compose.ui.graphics.Brush trackBrush, androidx.compose.ui.graphics.Brush progressBrush, androidx.compose.ui.graphics.Shape trackShape, androidx.compose.ui.graphics.Shape progressShape); method public float getProgressBarHeight(); method public androidx.compose.ui.graphics.Brush getProgressBrush(); method public androidx.compose.ui.graphics.Shape getProgressShape(); @@ -321,6 +324,53 @@ package com.urlaunched.android.design.ui.progressbarcontainer { } +package com.urlaunched.android.design.ui.progresstext { + + public final class ProgressTextKt { + method @androidx.compose.runtime.Composable public static void ProgressText(String text, @FloatRange(from=0.0, to=1.0) float progress, long startColor, long endColor, optional com.urlaunched.android.design.ui.progresstext.models.ProgressDirection progressDirection, optional androidx.compose.ui.Modifier modifier, optional long fontSize, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional long letterSpacing, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional long lineHeight, optional int overflow, optional boolean softWrap, optional int maxLines, optional int minLines, optional kotlin.jvm.functions.Function1? onTextLayout, optional androidx.compose.ui.text.TextStyle style); + } + +} + +package com.urlaunched.android.design.ui.progresstext.models { + + public interface ProgressDirection { + method public long getEndOffset(androidx.compose.ui.unit.LayoutDirection layoutDirection); + method public long getStartOffset(androidx.compose.ui.unit.LayoutDirection layoutDirection); + } + + public static final class ProgressDirection.BottomToTop implements com.urlaunched.android.design.ui.progresstext.models.ProgressDirection { + method public long getEndOffset(androidx.compose.ui.unit.LayoutDirection layoutDirection); + method public long getStartOffset(androidx.compose.ui.unit.LayoutDirection layoutDirection); + field public static final com.urlaunched.android.design.ui.progresstext.models.ProgressDirection.BottomToTop INSTANCE; + } + + public static final class ProgressDirection.Horizontal implements com.urlaunched.android.design.ui.progresstext.models.ProgressDirection { + method public long getEndOffset(androidx.compose.ui.unit.LayoutDirection layoutDirection); + method public long getStartOffset(androidx.compose.ui.unit.LayoutDirection layoutDirection); + field public static final com.urlaunched.android.design.ui.progresstext.models.ProgressDirection.Horizontal INSTANCE; + } + + public static final class ProgressDirection.LeftToRight implements com.urlaunched.android.design.ui.progresstext.models.ProgressDirection { + method public long getEndOffset(androidx.compose.ui.unit.LayoutDirection layoutDirection); + method public long getStartOffset(androidx.compose.ui.unit.LayoutDirection layoutDirection); + field public static final com.urlaunched.android.design.ui.progresstext.models.ProgressDirection.LeftToRight INSTANCE; + } + + public static final class ProgressDirection.RightToLeft implements com.urlaunched.android.design.ui.progresstext.models.ProgressDirection { + method public long getEndOffset(androidx.compose.ui.unit.LayoutDirection layoutDirection); + method public long getStartOffset(androidx.compose.ui.unit.LayoutDirection layoutDirection); + field public static final com.urlaunched.android.design.ui.progresstext.models.ProgressDirection.RightToLeft INSTANCE; + } + + public static final class ProgressDirection.TopToBottom implements com.urlaunched.android.design.ui.progresstext.models.ProgressDirection { + method public long getEndOffset(androidx.compose.ui.unit.LayoutDirection layoutDirection); + method public long getStartOffset(androidx.compose.ui.unit.LayoutDirection layoutDirection); + field public static final com.urlaunched.android.design.ui.progresstext.models.ProgressDirection.TopToBottom INSTANCE; + } + +} + package com.urlaunched.android.design.ui.pulltorefresh { public final class PullToRefreshBoxKt { From 8f64b9637c54652f8228af0823aa8c60f211245f Mon Sep 17 00:00:00 2001 From: Khotych Mykola Date: Thu, 18 Sep 2025 17:08:34 +0300 Subject: [PATCH 12/20] Clean up --- .../DownloadingProgressBar.kt | 13 +++++++++---- .../DownloadingProgressDialog.kt | 13 +++++++------ .../android/design/ui/progresstext/ProgressText.kt | 4 +++- 3 files changed, 19 insertions(+), 11 deletions(-) diff --git a/design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/DownloadingProgressBar.kt b/design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/DownloadingProgressBar.kt index a133f136..eb3673e7 100644 --- a/design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/DownloadingProgressBar.kt +++ b/design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/DownloadingProgressBar.kt @@ -43,10 +43,10 @@ import kotlinx.coroutines.isActive @Composable fun AnimatedDownloadingProgressBar( + modifier: Modifier = Modifier, progress: Float, trackColor: Color, progressColor: Color, - modifier: Modifier = Modifier, downloaded: Float = progress, total: Float = 1f, progressBarHeight: Dp = Dimens.spacingLarge, @@ -74,10 +74,10 @@ fun AnimatedDownloadingProgressBar( @Composable fun AnimatedDownloadingProgressBar( + modifier: Modifier = Modifier, progress: Float, trackBrush: Brush, progressBrush: Brush, - modifier: Modifier = Modifier, downloaded: Float = progress, total: Float = 1f, progressBarHeight: Dp = Dimens.spacingLarge, @@ -113,10 +113,10 @@ fun AnimatedDownloadingProgressBar( @Composable fun DownloadingProgressBar( + modifier: Modifier = Modifier, progress: Float, trackColor: Color, progressColor: Color, - modifier: Modifier = Modifier, downloaded: Float = progress, total: Float = 1f, progressBarHeight: Dp = Dimens.spacingLarge, @@ -142,10 +142,10 @@ fun DownloadingProgressBar( @Composable fun DownloadingProgressBar( + modifier: Modifier = Modifier, progress: Float, trackBrush: Brush, progressBrush: Brush, - modifier: Modifier = Modifier, downloaded: Float = progress, total: Float = 1f, progressBarHeight: Dp = Dimens.spacingLarge, @@ -155,6 +155,7 @@ fun DownloadingProgressBar( supportingText: (@Composable RowScope.(Float) -> Unit)? = null ) { val safeProgress = progress.coerceIn(0f, 1f) + Column(modifier = modifier) { Box( contentAlignment = Alignment.Center @@ -172,11 +173,13 @@ fun DownloadingProgressBar( progressText?.invoke(this@Box, safeProgress) } + Row( modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween ) { supportingText?.invoke(this@Row, downloaded) + supportingText?.invoke(this@Row, total) } } @@ -193,6 +196,7 @@ private fun ProgressBar( ) { Canvas(modifier = modifier) { val trackOutline = trackShape.createOutline(size, layoutDirection, this) + drawOutline( brush = trackBrush, outline = trackOutline @@ -217,6 +221,7 @@ private fun ProgressBar( @Composable private fun GradientProgressBarPreview() { val progress = remember { 0.6f } + DownloadingProgressBar( progress = progress, progressBarHeight = 50.dp, diff --git a/design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/DownloadingProgressDialog.kt b/design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/DownloadingProgressDialog.kt index d0d5af8e..3156629e 100644 --- a/design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/DownloadingProgressDialog.kt +++ b/design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/DownloadingProgressDialog.kt @@ -35,12 +35,12 @@ import com.urlaunched.android.design.ui.progresstext.ProgressText */ @Composable fun DownloadingProgressDialog( + modifier: Modifier = Modifier, @FloatRange(0.0, 1.0) progress: Float, downloaded: Float = progress, total: Float = 1f, - modifier: Modifier = Modifier, - onDismissRequest: () -> Unit = DoNothing, + onDismissRequest: () -> Unit = {}, progressBarStyle: ProgressBarStyle = ProgressBarStyle(), dialogContainerColor: Color = Color.White, dialogContainerShape: Shape = RoundedCornerShape(Dimens.cornerRadiusLarge), @@ -66,12 +66,14 @@ fun DownloadingProgressDialog( title = title?.let { titleContent -> @Composable { titleContent() + Spacer(modifier = Modifier.height(Dimens.spacingSmall)) } }, description = description?.let { descriptionContent -> @Composable { descriptionContent() + Spacer(modifier = Modifier.height(Dimens.spacingBigSpecial)) } }, @@ -84,6 +86,7 @@ fun DownloadingProgressDialog( horizontalAlignment = Alignment.End ) { Spacer(modifier = Modifier.height(Dimens.spacingLarge)) + buttonContent() } } @@ -97,12 +100,12 @@ fun DownloadingProgressDialog( @OptIn(ExperimentalMaterial3Api::class) @Composable fun BaseDownloadingProgressDialog( + modifier: Modifier = Modifier, @FloatRange(0.0, 1.0) progress: Float, downloaded: Float = progress, total: Float = 1f, - modifier: Modifier = Modifier, - onDismissRequest: () -> Unit = DoNothing, + onDismissRequest: () -> Unit = {}, progressBarStyle: ProgressBarStyle = ProgressBarStyle(), dialogContainerColor: Color = Color.White, dialogContainerShape: Shape = RoundedCornerShape(Dimens.cornerRadiusLarge), @@ -151,8 +154,6 @@ fun BaseDownloadingProgressDialog( ) } -private val DoNothing = {} - @Preview(showBackground = true) @Composable private fun BaseDownloadingProgressDialogPreview() { diff --git a/design/src/main/java/com/urlaunched/android/design/ui/progresstext/ProgressText.kt b/design/src/main/java/com/urlaunched/android/design/ui/progresstext/ProgressText.kt index cc760cf8..406bf6d8 100644 --- a/design/src/main/java/com/urlaunched/android/design/ui/progresstext/ProgressText.kt +++ b/design/src/main/java/com/urlaunched/android/design/ui/progresstext/ProgressText.kt @@ -32,13 +32,13 @@ import com.urlaunched.android.design.ui.progresstext.models.ProgressDirection @Composable fun ProgressText( + modifier: Modifier = Modifier, text: String, @FloatRange(0.0, 1.0) progress: Float, startColor: Color, endColor: Color, progressDirection: ProgressDirection = ProgressDirection.Horizontal, - modifier: Modifier = Modifier, fontSize: TextUnit = TextUnit.Unspecified, fontStyle: FontStyle? = null, fontWeight: FontWeight? = null, @@ -89,6 +89,7 @@ fun ProgressText( @Composable private fun ProgressTextPreview() { val progress = remember { 0.59f } + Box( modifier = Modifier .size(200.dp, 50.dp) @@ -101,6 +102,7 @@ private fun ProgressTextPreview() { .fillMaxHeight() .background(Color.Yellow) ) + ProgressText( text = "PROGRESS TEXT", progress = progress, From 1c5f6aa3753011f10d57e53a0b8baff4651d9d59 Mon Sep 17 00:00:00 2001 From: Khotych Mykola Date: Thu, 18 Sep 2025 17:12:58 +0300 Subject: [PATCH 13/20] Update api --- design/api/current.api | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/design/api/current.api b/design/api/current.api index a166cee3..3c939f6d 100644 --- a/design/api/current.api +++ b/design/api/current.api @@ -131,15 +131,15 @@ package com.urlaunched.android.design.ui.counter.ui { package com.urlaunched.android.design.ui.downloadingprogressdialog { public final class DownloadingProgressBarKt { - method @androidx.compose.runtime.Composable public static void AnimatedDownloadingProgressBar(float progress, androidx.compose.ui.graphics.Brush trackBrush, androidx.compose.ui.graphics.Brush progressBrush, optional androidx.compose.ui.Modifier modifier, optional float downloaded, optional float total, optional float progressBarHeight, optional androidx.compose.ui.graphics.Shape trackShape, optional androidx.compose.ui.graphics.Shape progressShape, optional androidx.compose.animation.core.AnimationSpec animationSpec, optional kotlin.jvm.functions.Function2? progressText, optional kotlin.jvm.functions.Function2? supportingText); - method @androidx.compose.runtime.Composable public static void AnimatedDownloadingProgressBar(float progress, long trackColor, long progressColor, optional androidx.compose.ui.Modifier modifier, optional float downloaded, optional float total, optional float progressBarHeight, optional androidx.compose.ui.graphics.Shape trackShape, optional androidx.compose.ui.graphics.Shape progressShape, optional androidx.compose.animation.core.AnimationSpec animationSpec, optional kotlin.jvm.functions.Function2? progressText, optional kotlin.jvm.functions.Function2? supportingText); - method @androidx.compose.runtime.Composable public static void DownloadingProgressBar(float progress, androidx.compose.ui.graphics.Brush trackBrush, androidx.compose.ui.graphics.Brush progressBrush, optional androidx.compose.ui.Modifier modifier, optional float downloaded, optional float total, optional float progressBarHeight, optional androidx.compose.ui.graphics.Shape trackShape, optional androidx.compose.ui.graphics.Shape progressShape, optional kotlin.jvm.functions.Function2? progressText, optional kotlin.jvm.functions.Function2? supportingText); - method @androidx.compose.runtime.Composable public static void DownloadingProgressBar(float progress, long trackColor, long progressColor, optional androidx.compose.ui.Modifier modifier, optional float downloaded, optional float total, optional float progressBarHeight, optional androidx.compose.ui.graphics.Shape trackShape, optional androidx.compose.ui.graphics.Shape progressShape, optional kotlin.jvm.functions.Function2? progressText, optional kotlin.jvm.functions.Function2? supportingText); + method @androidx.compose.runtime.Composable public static void AnimatedDownloadingProgressBar(optional androidx.compose.ui.Modifier modifier, float progress, androidx.compose.ui.graphics.Brush trackBrush, androidx.compose.ui.graphics.Brush progressBrush, optional float downloaded, optional float total, optional float progressBarHeight, optional androidx.compose.ui.graphics.Shape trackShape, optional androidx.compose.ui.graphics.Shape progressShape, optional androidx.compose.animation.core.AnimationSpec animationSpec, optional kotlin.jvm.functions.Function2? progressText, optional kotlin.jvm.functions.Function2? supportingText); + method @androidx.compose.runtime.Composable public static void AnimatedDownloadingProgressBar(optional androidx.compose.ui.Modifier modifier, float progress, long trackColor, long progressColor, optional float downloaded, optional float total, optional float progressBarHeight, optional androidx.compose.ui.graphics.Shape trackShape, optional androidx.compose.ui.graphics.Shape progressShape, optional androidx.compose.animation.core.AnimationSpec animationSpec, optional kotlin.jvm.functions.Function2? progressText, optional kotlin.jvm.functions.Function2? supportingText); + method @androidx.compose.runtime.Composable public static void DownloadingProgressBar(optional androidx.compose.ui.Modifier modifier, float progress, androidx.compose.ui.graphics.Brush trackBrush, androidx.compose.ui.graphics.Brush progressBrush, optional float downloaded, optional float total, optional float progressBarHeight, optional androidx.compose.ui.graphics.Shape trackShape, optional androidx.compose.ui.graphics.Shape progressShape, optional kotlin.jvm.functions.Function2? progressText, optional kotlin.jvm.functions.Function2? supportingText); + method @androidx.compose.runtime.Composable public static void DownloadingProgressBar(optional androidx.compose.ui.Modifier modifier, float progress, long trackColor, long progressColor, optional float downloaded, optional float total, optional float progressBarHeight, optional androidx.compose.ui.graphics.Shape trackShape, optional androidx.compose.ui.graphics.Shape progressShape, optional kotlin.jvm.functions.Function2? progressText, optional kotlin.jvm.functions.Function2? supportingText); } public final class DownloadingProgressDialogKt { - method @androidx.compose.runtime.Composable public static void BaseDownloadingProgressDialog(@com.composables.core.androidx.annotation.FloatRange(from=0.0, to=1.0) float progress, optional float downloaded, optional float total, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0 onDismissRequest, optional com.urlaunched.android.design.ui.downloadingprogressdialog.models.ProgressBarStyle progressBarStyle, optional long dialogContainerColor, optional androidx.compose.ui.graphics.Shape dialogContainerShape, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.ui.window.DialogProperties dialogProperties, optional kotlin.jvm.functions.Function1? title, optional kotlin.jvm.functions.Function1? description, optional kotlin.jvm.functions.Function2? progressText, optional kotlin.jvm.functions.Function2? supportingText, optional kotlin.jvm.functions.Function1? button); - method @androidx.compose.runtime.Composable public static void DownloadingProgressDialog(@com.composables.core.androidx.annotation.FloatRange(from=0.0, to=1.0) float progress, optional float downloaded, optional float total, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0 onDismissRequest, optional com.urlaunched.android.design.ui.downloadingprogressdialog.models.ProgressBarStyle progressBarStyle, optional long dialogContainerColor, optional androidx.compose.ui.graphics.Shape dialogContainerShape, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.ui.window.DialogProperties dialogProperties, optional kotlin.jvm.functions.Function1? title, optional kotlin.jvm.functions.Function1? description, optional kotlin.jvm.functions.Function2? progressText, optional kotlin.jvm.functions.Function2? supportingText, optional kotlin.jvm.functions.Function1? button); + method @androidx.compose.runtime.Composable public static void BaseDownloadingProgressDialog(optional androidx.compose.ui.Modifier modifier, @com.composables.core.androidx.annotation.FloatRange(from=0.0, to=1.0) float progress, optional float downloaded, optional float total, optional kotlin.jvm.functions.Function0 onDismissRequest, optional com.urlaunched.android.design.ui.downloadingprogressdialog.models.ProgressBarStyle progressBarStyle, optional long dialogContainerColor, optional androidx.compose.ui.graphics.Shape dialogContainerShape, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.ui.window.DialogProperties dialogProperties, optional kotlin.jvm.functions.Function1? title, optional kotlin.jvm.functions.Function1? description, optional kotlin.jvm.functions.Function2? progressText, optional kotlin.jvm.functions.Function2? supportingText, optional kotlin.jvm.functions.Function1? button); + method @androidx.compose.runtime.Composable public static void DownloadingProgressDialog(optional androidx.compose.ui.Modifier modifier, @com.composables.core.androidx.annotation.FloatRange(from=0.0, to=1.0) float progress, optional float downloaded, optional float total, optional kotlin.jvm.functions.Function0 onDismissRequest, optional com.urlaunched.android.design.ui.downloadingprogressdialog.models.ProgressBarStyle progressBarStyle, optional long dialogContainerColor, optional androidx.compose.ui.graphics.Shape dialogContainerShape, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.ui.window.DialogProperties dialogProperties, optional kotlin.jvm.functions.Function1? title, optional kotlin.jvm.functions.Function1? description, optional kotlin.jvm.functions.Function2? progressText, optional kotlin.jvm.functions.Function2? supportingText, optional kotlin.jvm.functions.Function1? button); } } @@ -327,7 +327,7 @@ package com.urlaunched.android.design.ui.progressbarcontainer { package com.urlaunched.android.design.ui.progresstext { public final class ProgressTextKt { - method @androidx.compose.runtime.Composable public static void ProgressText(String text, @FloatRange(from=0.0, to=1.0) float progress, long startColor, long endColor, optional com.urlaunched.android.design.ui.progresstext.models.ProgressDirection progressDirection, optional androidx.compose.ui.Modifier modifier, optional long fontSize, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional long letterSpacing, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional long lineHeight, optional int overflow, optional boolean softWrap, optional int maxLines, optional int minLines, optional kotlin.jvm.functions.Function1? onTextLayout, optional androidx.compose.ui.text.TextStyle style); + method @androidx.compose.runtime.Composable public static void ProgressText(optional androidx.compose.ui.Modifier modifier, String text, @FloatRange(from=0.0, to=1.0) float progress, long startColor, long endColor, optional com.urlaunched.android.design.ui.progresstext.models.ProgressDirection progressDirection, optional long fontSize, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional long letterSpacing, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional long lineHeight, optional int overflow, optional boolean softWrap, optional int maxLines, optional int minLines, optional kotlin.jvm.functions.Function1? onTextLayout, optional androidx.compose.ui.text.TextStyle style); } } From d4e930e727ae6db189d934a58973d248e77f65f0 Mon Sep 17 00:00:00 2001 From: Khotych Mykola Date: Mon, 22 Sep 2025 11:53:48 +0300 Subject: [PATCH 14/20] Make supporting text a single container --- .../DownloadingProgressBar.kt | 77 +++++++------------ .../DownloadingProgressDialog.kt | 59 +++++++------- 2 files changed, 56 insertions(+), 80 deletions(-) diff --git a/design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/DownloadingProgressBar.kt b/design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/DownloadingProgressBar.kt index eb3673e7..a08159f8 100644 --- a/design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/DownloadingProgressBar.kt +++ b/design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/DownloadingProgressBar.kt @@ -9,7 +9,6 @@ import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.BoxScope import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.RowScope import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding @@ -47,22 +46,18 @@ fun AnimatedDownloadingProgressBar( progress: Float, trackColor: Color, progressColor: Color, - downloaded: Float = progress, - total: Float = 1f, progressBarHeight: Dp = Dimens.spacingLarge, trackShape: Shape = CircleShape, progressShape: Shape = trackShape, animationSpec: AnimationSpec = tween(), progressText: (@Composable BoxScope.(Float) -> Unit)? = null, - supportingText: (@Composable RowScope.(Float) -> Unit)? = null + supportingText: (@Composable BoxScope.() -> Unit)? = null ) { AnimatedDownloadingProgressBar( progress = progress, trackBrush = SolidColor(trackColor), progressBrush = SolidColor(progressColor), modifier = modifier, - downloaded = downloaded, - total = total, progressBarHeight = progressBarHeight, trackShape = trackShape, progressShape = progressShape, @@ -78,31 +73,23 @@ fun AnimatedDownloadingProgressBar( progress: Float, trackBrush: Brush, progressBrush: Brush, - downloaded: Float = progress, - total: Float = 1f, progressBarHeight: Dp = Dimens.spacingLarge, trackShape: Shape = CircleShape, progressShape: Shape = trackShape, animationSpec: AnimationSpec = tween(), progressText: (@Composable BoxScope.(Float) -> Unit)? = null, - supportingText: (@Composable RowScope.(Float) -> Unit)? = null + supportingText: (@Composable BoxScope.() -> Unit)? = null ) { val animatedProgress by animateFloatAsState( targetValue = progress, animationSpec = animationSpec ) - val animatedDownloaded by animateFloatAsState( - targetValue = downloaded, - animationSpec = animationSpec - ) DownloadingProgressBar( progress = animatedProgress, trackBrush = trackBrush, progressBrush = progressBrush, modifier = modifier, - downloaded = animatedDownloaded, - total = total, progressBarHeight = progressBarHeight, trackShape = trackShape, progressShape = progressShape, @@ -117,21 +104,17 @@ fun DownloadingProgressBar( progress: Float, trackColor: Color, progressColor: Color, - downloaded: Float = progress, - total: Float = 1f, progressBarHeight: Dp = Dimens.spacingLarge, trackShape: Shape = CircleShape, progressShape: Shape = trackShape, progressText: (@Composable BoxScope.(Float) -> Unit)? = null, - supportingText: (@Composable RowScope.(Float) -> Unit)? = null + supportingText: (@Composable BoxScope.() -> Unit)? = null ) { DownloadingProgressBar( progress = progress, trackBrush = SolidColor(trackColor), progressBrush = SolidColor(progressColor), modifier = modifier, - downloaded = downloaded, - total = total, progressBarHeight = progressBarHeight, trackShape = trackShape, progressShape = progressShape, @@ -146,13 +129,11 @@ fun DownloadingProgressBar( progress: Float, trackBrush: Brush, progressBrush: Brush, - downloaded: Float = progress, - total: Float = 1f, progressBarHeight: Dp = Dimens.spacingLarge, trackShape: Shape = CircleShape, progressShape: Shape = trackShape, progressText: (@Composable BoxScope.(Float) -> Unit)? = null, - supportingText: (@Composable RowScope.(Float) -> Unit)? = null + supportingText: (@Composable BoxScope.() -> Unit)? = null ) { val safeProgress = progress.coerceIn(0f, 1f) @@ -174,13 +155,11 @@ fun DownloadingProgressBar( progressText?.invoke(this@Box, safeProgress) } - Row( - modifier = Modifier.fillMaxWidth(), - horizontalArrangement = Arrangement.SpaceBetween - ) { - supportingText?.invoke(this@Row, downloaded) - - supportingText?.invoke(this@Row, total) + supportingText?.let { textContent -> + Box( + modifier = Modifier.fillMaxWidth(), + content = textContent + ) } } } @@ -230,16 +209,23 @@ private fun GradientProgressBarPreview() { progress to Color.Magenta ), trackBrush = SolidColor(Color.LightGray), - supportingText = { value -> - Text( - text = "$value MB", - color = Color.Gray, - style = MaterialTheme.typography.bodySmall, - modifier = Modifier.padding( - horizontal = Dimens.spacingSmall, - vertical = Dimens.spacingTinyHalf - ) - ) + supportingText = { + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween + ) { + listOf(progress * 100f, 100f).forEach { value -> + Text( + text = "${"%.1f".format(value)} MB", + color = Color.Gray, + style = MaterialTheme.typography.bodySmall, + modifier = Modifier.padding( + horizontal = Dimens.spacingSmall, + vertical = Dimens.spacingTinyHalf + ) + ) + } + } } ) } @@ -287,17 +273,6 @@ private fun AnimatedProgressBarPreview() { .fillMaxWidth() .align(Alignment.Center) ) - }, - supportingText = { value -> - Text( - text = "${"%.2f".format(value)} MB", - color = Color.Gray, - style = MaterialTheme.typography.bodySmall, - modifier = Modifier.padding( - horizontal = Dimens.spacingSmall, - vertical = Dimens.spacingTinyHalf - ) - ) } ) } \ No newline at end of file diff --git a/design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/DownloadingProgressDialog.kt b/design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/DownloadingProgressDialog.kt index 3156629e..c3ba779b 100644 --- a/design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/DownloadingProgressDialog.kt +++ b/design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/DownloadingProgressDialog.kt @@ -1,11 +1,12 @@ package com.urlaunched.android.design.ui.downloadingprogressdialog import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.BoxScope import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.ColumnScope import androidx.compose.foundation.layout.PaddingValues -import androidx.compose.foundation.layout.RowScope +import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height @@ -38,8 +39,6 @@ fun DownloadingProgressDialog( modifier: Modifier = Modifier, @FloatRange(0.0, 1.0) progress: Float, - downloaded: Float = progress, - total: Float = 1f, onDismissRequest: () -> Unit = {}, progressBarStyle: ProgressBarStyle = ProgressBarStyle(), dialogContainerColor: Color = Color.White, @@ -49,13 +48,11 @@ fun DownloadingProgressDialog( title: (@Composable ColumnScope.() -> Unit)? = null, description: (@Composable ColumnScope.() -> Unit)? = null, progressText: (@Composable BoxScope.(Float) -> Unit)? = null, - supportingText: (@Composable RowScope.(Float) -> Unit)? = null, + supportingText: (@Composable BoxScope.() -> Unit)? = null, button: (@Composable ColumnScope.() -> Unit)? = null ) { BaseDownloadingProgressDialog( progress = progress, - total = total, - downloaded = downloaded, modifier = modifier, onDismissRequest = onDismissRequest, progressBarStyle = progressBarStyle, @@ -103,8 +100,6 @@ fun BaseDownloadingProgressDialog( modifier: Modifier = Modifier, @FloatRange(0.0, 1.0) progress: Float, - downloaded: Float = progress, - total: Float = 1f, onDismissRequest: () -> Unit = {}, progressBarStyle: ProgressBarStyle = ProgressBarStyle(), dialogContainerColor: Color = Color.White, @@ -114,7 +109,7 @@ fun BaseDownloadingProgressDialog( title: (@Composable ColumnScope.() -> Unit)? = null, description: (@Composable ColumnScope.() -> Unit)? = null, progressText: (@Composable BoxScope.(Float) -> Unit)? = null, - supportingText: (@Composable RowScope.(Float) -> Unit)? = null, + supportingText: (@Composable BoxScope.() -> Unit)? = null, button: (@Composable ColumnScope.() -> Unit)? = null ) { BasicAlertDialog( @@ -136,8 +131,6 @@ fun BaseDownloadingProgressDialog( DownloadingProgressBar( progress = progress, - downloaded = downloaded, - total = total, modifier = Modifier.fillMaxWidth(), progressBarHeight = progressBarStyle.progressBarHeight, trackShape = progressBarStyle.trackShape, @@ -157,13 +150,10 @@ fun BaseDownloadingProgressDialog( @Preview(showBackground = true) @Composable private fun BaseDownloadingProgressDialogPreview() { - val totalValue = remember { 10f } val progress = remember { 0.73f } BaseDownloadingProgressDialog( progress = progress, - total = totalValue, - downloaded = progress * totalValue, title = { Text( text = "Downloading file", @@ -188,12 +178,19 @@ private fun BaseDownloadingProgressDialogPreview() { .align(Alignment.Center) ) }, - supportingText = { value -> - Text( - text = "$value MB", - color = Color.Gray, - style = MaterialTheme.typography.bodySmall - ) + supportingText = { + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween + ) { + listOf(progress * 100, 100).forEach { value -> + Text( + text = "$value MB", + color = Color.Gray, + style = MaterialTheme.typography.bodySmall + ) + } + } }, button = { TextButton( @@ -208,13 +205,10 @@ private fun BaseDownloadingProgressDialogPreview() { @Preview(showBackground = true) @Composable private fun DownloadingProgressDialogPreview() { - val totalValue = remember { 10f } val progress = remember { 0.5f } DownloadingProgressDialog( progress = progress, - total = totalValue, - downloaded = progress * totalValue, title = { Text( text = "Downloading file", @@ -239,12 +233,19 @@ private fun DownloadingProgressDialogPreview() { .align(Alignment.Center) ) }, - supportingText = { value -> - Text( - text = "$value MB", - color = Color.Gray, - style = MaterialTheme.typography.bodySmall - ) + supportingText = { + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween + ) { + listOf(progress * 100, 100).forEach { value -> + Text( + text = "$value MB", + color = Color.Gray, + style = MaterialTheme.typography.bodySmall + ) + } + } }, button = { TextButton( From aae73916d97ddb7aafd5e6940b53b9d4cf9c94e6 Mon Sep 17 00:00:00 2001 From: Khotych Mykola Date: Mon, 22 Sep 2025 11:57:12 +0300 Subject: [PATCH 15/20] Remove progress from progressText lambda --- .../DownloadingProgressBar.kt | 14 +++++++++----- .../DownloadingProgressDialog.kt | 4 ++-- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/DownloadingProgressBar.kt b/design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/DownloadingProgressBar.kt index a08159f8..625c89f1 100644 --- a/design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/DownloadingProgressBar.kt +++ b/design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/DownloadingProgressBar.kt @@ -93,8 +93,12 @@ fun AnimatedDownloadingProgressBar( progressBarHeight = progressBarHeight, trackShape = trackShape, progressShape = progressShape, - progressText = progressText, - supportingText = supportingText + supportingText = supportingText, + progressText = progressText?.let { textContent -> + @Composable { + textContent(animatedProgress) + } + } ) } @@ -107,7 +111,7 @@ fun DownloadingProgressBar( progressBarHeight: Dp = Dimens.spacingLarge, trackShape: Shape = CircleShape, progressShape: Shape = trackShape, - progressText: (@Composable BoxScope.(Float) -> Unit)? = null, + progressText: (@Composable BoxScope.() -> Unit)? = null, supportingText: (@Composable BoxScope.() -> Unit)? = null ) { DownloadingProgressBar( @@ -132,7 +136,7 @@ fun DownloadingProgressBar( progressBarHeight: Dp = Dimens.spacingLarge, trackShape: Shape = CircleShape, progressShape: Shape = trackShape, - progressText: (@Composable BoxScope.(Float) -> Unit)? = null, + progressText: (@Composable BoxScope.() -> Unit)? = null, supportingText: (@Composable BoxScope.() -> Unit)? = null ) { val safeProgress = progress.coerceIn(0f, 1f) @@ -152,7 +156,7 @@ fun DownloadingProgressBar( progressShape = progressShape ) - progressText?.invoke(this@Box, safeProgress) + progressText?.invoke(this@Box) } supportingText?.let { textContent -> diff --git a/design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/DownloadingProgressDialog.kt b/design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/DownloadingProgressDialog.kt index c3ba779b..1b4adc97 100644 --- a/design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/DownloadingProgressDialog.kt +++ b/design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/DownloadingProgressDialog.kt @@ -47,7 +47,7 @@ fun DownloadingProgressDialog( dialogProperties: DialogProperties = DialogProperties(), title: (@Composable ColumnScope.() -> Unit)? = null, description: (@Composable ColumnScope.() -> Unit)? = null, - progressText: (@Composable BoxScope.(Float) -> Unit)? = null, + progressText: (@Composable BoxScope.() -> Unit)? = null, supportingText: (@Composable BoxScope.() -> Unit)? = null, button: (@Composable ColumnScope.() -> Unit)? = null ) { @@ -108,7 +108,7 @@ fun BaseDownloadingProgressDialog( dialogProperties: DialogProperties = DialogProperties(), title: (@Composable ColumnScope.() -> Unit)? = null, description: (@Composable ColumnScope.() -> Unit)? = null, - progressText: (@Composable BoxScope.(Float) -> Unit)? = null, + progressText: (@Composable BoxScope.() -> Unit)? = null, supportingText: (@Composable BoxScope.() -> Unit)? = null, button: (@Composable ColumnScope.() -> Unit)? = null ) { From 7befd71a82d8b55a8111205d6a00ff5f6ccb2fcb Mon Sep 17 00:00:00 2001 From: Khotych Mykola Date: Mon, 22 Sep 2025 12:23:37 +0300 Subject: [PATCH 16/20] Use FloatRange annotations for progress --- .../downloadingprogressdialog/DownloadingProgressBar.kt | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/DownloadingProgressBar.kt b/design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/DownloadingProgressBar.kt index 625c89f1..abd18aa7 100644 --- a/design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/DownloadingProgressBar.kt +++ b/design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/DownloadingProgressBar.kt @@ -1,5 +1,6 @@ package com.urlaunched.android.design.ui.downloadingprogressdialog +import androidx.annotation.FloatRange import androidx.compose.animation.core.AnimationSpec import androidx.compose.animation.core.animateFloatAsState import androidx.compose.animation.core.tween @@ -43,6 +44,7 @@ import kotlinx.coroutines.isActive @Composable fun AnimatedDownloadingProgressBar( modifier: Modifier = Modifier, + @FloatRange(0.0, 1.0) progress: Float, trackColor: Color, progressColor: Color, @@ -70,6 +72,7 @@ fun AnimatedDownloadingProgressBar( @Composable fun AnimatedDownloadingProgressBar( modifier: Modifier = Modifier, + @FloatRange(0.0, 1.0) progress: Float, trackBrush: Brush, progressBrush: Brush, @@ -105,6 +108,7 @@ fun AnimatedDownloadingProgressBar( @Composable fun DownloadingProgressBar( modifier: Modifier = Modifier, + @FloatRange(0.0, 1.0) progress: Float, trackColor: Color, progressColor: Color, @@ -130,6 +134,7 @@ fun DownloadingProgressBar( @Composable fun DownloadingProgressBar( modifier: Modifier = Modifier, + @FloatRange(0.0, 1.0) progress: Float, trackBrush: Brush, progressBrush: Brush, @@ -139,8 +144,6 @@ fun DownloadingProgressBar( progressText: (@Composable BoxScope.() -> Unit)? = null, supportingText: (@Composable BoxScope.() -> Unit)? = null ) { - val safeProgress = progress.coerceIn(0f, 1f) - Column(modifier = modifier) { Box( contentAlignment = Alignment.Center @@ -149,7 +152,7 @@ fun DownloadingProgressBar( modifier = Modifier .fillMaxWidth() .height(progressBarHeight), - progress = safeProgress, + progress = progress, trackBrush = trackBrush, progressBrush = progressBrush, trackShape = trackShape, From 88ba4c6ead79c696c9e1aacd3e8fd81df216db80 Mon Sep 17 00:00:00 2001 From: Khotych Mykola Date: Mon, 22 Sep 2025 12:29:58 +0300 Subject: [PATCH 17/20] Update api --- design/api/current.api | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/design/api/current.api b/design/api/current.api index 3c939f6d..ef385588 100644 --- a/design/api/current.api +++ b/design/api/current.api @@ -131,15 +131,15 @@ package com.urlaunched.android.design.ui.counter.ui { package com.urlaunched.android.design.ui.downloadingprogressdialog { public final class DownloadingProgressBarKt { - method @androidx.compose.runtime.Composable public static void AnimatedDownloadingProgressBar(optional androidx.compose.ui.Modifier modifier, float progress, androidx.compose.ui.graphics.Brush trackBrush, androidx.compose.ui.graphics.Brush progressBrush, optional float downloaded, optional float total, optional float progressBarHeight, optional androidx.compose.ui.graphics.Shape trackShape, optional androidx.compose.ui.graphics.Shape progressShape, optional androidx.compose.animation.core.AnimationSpec animationSpec, optional kotlin.jvm.functions.Function2? progressText, optional kotlin.jvm.functions.Function2? supportingText); - method @androidx.compose.runtime.Composable public static void AnimatedDownloadingProgressBar(optional androidx.compose.ui.Modifier modifier, float progress, long trackColor, long progressColor, optional float downloaded, optional float total, optional float progressBarHeight, optional androidx.compose.ui.graphics.Shape trackShape, optional androidx.compose.ui.graphics.Shape progressShape, optional androidx.compose.animation.core.AnimationSpec animationSpec, optional kotlin.jvm.functions.Function2? progressText, optional kotlin.jvm.functions.Function2? supportingText); - method @androidx.compose.runtime.Composable public static void DownloadingProgressBar(optional androidx.compose.ui.Modifier modifier, float progress, androidx.compose.ui.graphics.Brush trackBrush, androidx.compose.ui.graphics.Brush progressBrush, optional float downloaded, optional float total, optional float progressBarHeight, optional androidx.compose.ui.graphics.Shape trackShape, optional androidx.compose.ui.graphics.Shape progressShape, optional kotlin.jvm.functions.Function2? progressText, optional kotlin.jvm.functions.Function2? supportingText); - method @androidx.compose.runtime.Composable public static void DownloadingProgressBar(optional androidx.compose.ui.Modifier modifier, float progress, long trackColor, long progressColor, optional float downloaded, optional float total, optional float progressBarHeight, optional androidx.compose.ui.graphics.Shape trackShape, optional androidx.compose.ui.graphics.Shape progressShape, optional kotlin.jvm.functions.Function2? progressText, optional kotlin.jvm.functions.Function2? supportingText); + method @androidx.compose.runtime.Composable public static void AnimatedDownloadingProgressBar(optional androidx.compose.ui.Modifier modifier, @FloatRange(from=0.0, to=1.0) float progress, androidx.compose.ui.graphics.Brush trackBrush, androidx.compose.ui.graphics.Brush progressBrush, optional float progressBarHeight, optional androidx.compose.ui.graphics.Shape trackShape, optional androidx.compose.ui.graphics.Shape progressShape, optional androidx.compose.animation.core.AnimationSpec animationSpec, optional kotlin.jvm.functions.Function2? progressText, optional kotlin.jvm.functions.Function1? supportingText); + method @androidx.compose.runtime.Composable public static void AnimatedDownloadingProgressBar(optional androidx.compose.ui.Modifier modifier, @FloatRange(from=0.0, to=1.0) float progress, long trackColor, long progressColor, optional float progressBarHeight, optional androidx.compose.ui.graphics.Shape trackShape, optional androidx.compose.ui.graphics.Shape progressShape, optional androidx.compose.animation.core.AnimationSpec animationSpec, optional kotlin.jvm.functions.Function2? progressText, optional kotlin.jvm.functions.Function1? supportingText); + method @androidx.compose.runtime.Composable public static void DownloadingProgressBar(optional androidx.compose.ui.Modifier modifier, @FloatRange(from=0.0, to=1.0) float progress, androidx.compose.ui.graphics.Brush trackBrush, androidx.compose.ui.graphics.Brush progressBrush, optional float progressBarHeight, optional androidx.compose.ui.graphics.Shape trackShape, optional androidx.compose.ui.graphics.Shape progressShape, optional kotlin.jvm.functions.Function1? progressText, optional kotlin.jvm.functions.Function1? supportingText); + method @androidx.compose.runtime.Composable public static void DownloadingProgressBar(optional androidx.compose.ui.Modifier modifier, @FloatRange(from=0.0, to=1.0) float progress, long trackColor, long progressColor, optional float progressBarHeight, optional androidx.compose.ui.graphics.Shape trackShape, optional androidx.compose.ui.graphics.Shape progressShape, optional kotlin.jvm.functions.Function1? progressText, optional kotlin.jvm.functions.Function1? supportingText); } public final class DownloadingProgressDialogKt { - method @androidx.compose.runtime.Composable public static void BaseDownloadingProgressDialog(optional androidx.compose.ui.Modifier modifier, @com.composables.core.androidx.annotation.FloatRange(from=0.0, to=1.0) float progress, optional float downloaded, optional float total, optional kotlin.jvm.functions.Function0 onDismissRequest, optional com.urlaunched.android.design.ui.downloadingprogressdialog.models.ProgressBarStyle progressBarStyle, optional long dialogContainerColor, optional androidx.compose.ui.graphics.Shape dialogContainerShape, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.ui.window.DialogProperties dialogProperties, optional kotlin.jvm.functions.Function1? title, optional kotlin.jvm.functions.Function1? description, optional kotlin.jvm.functions.Function2? progressText, optional kotlin.jvm.functions.Function2? supportingText, optional kotlin.jvm.functions.Function1? button); - method @androidx.compose.runtime.Composable public static void DownloadingProgressDialog(optional androidx.compose.ui.Modifier modifier, @com.composables.core.androidx.annotation.FloatRange(from=0.0, to=1.0) float progress, optional float downloaded, optional float total, optional kotlin.jvm.functions.Function0 onDismissRequest, optional com.urlaunched.android.design.ui.downloadingprogressdialog.models.ProgressBarStyle progressBarStyle, optional long dialogContainerColor, optional androidx.compose.ui.graphics.Shape dialogContainerShape, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.ui.window.DialogProperties dialogProperties, optional kotlin.jvm.functions.Function1? title, optional kotlin.jvm.functions.Function1? description, optional kotlin.jvm.functions.Function2? progressText, optional kotlin.jvm.functions.Function2? supportingText, optional kotlin.jvm.functions.Function1? button); + method @androidx.compose.runtime.Composable public static void BaseDownloadingProgressDialog(optional androidx.compose.ui.Modifier modifier, @com.composables.core.androidx.annotation.FloatRange(from=0.0, to=1.0) float progress, optional kotlin.jvm.functions.Function0 onDismissRequest, optional com.urlaunched.android.design.ui.downloadingprogressdialog.models.ProgressBarStyle progressBarStyle, optional long dialogContainerColor, optional androidx.compose.ui.graphics.Shape dialogContainerShape, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.ui.window.DialogProperties dialogProperties, optional kotlin.jvm.functions.Function1? title, optional kotlin.jvm.functions.Function1? description, optional kotlin.jvm.functions.Function1? progressText, optional kotlin.jvm.functions.Function1? supportingText, optional kotlin.jvm.functions.Function1? button); + method @androidx.compose.runtime.Composable public static void DownloadingProgressDialog(optional androidx.compose.ui.Modifier modifier, @com.composables.core.androidx.annotation.FloatRange(from=0.0, to=1.0) float progress, optional kotlin.jvm.functions.Function0 onDismissRequest, optional com.urlaunched.android.design.ui.downloadingprogressdialog.models.ProgressBarStyle progressBarStyle, optional long dialogContainerColor, optional androidx.compose.ui.graphics.Shape dialogContainerShape, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.ui.window.DialogProperties dialogProperties, optional kotlin.jvm.functions.Function1? title, optional kotlin.jvm.functions.Function1? description, optional kotlin.jvm.functions.Function1? progressText, optional kotlin.jvm.functions.Function1? supportingText, optional kotlin.jvm.functions.Function1? button); } } From 5fd736f5f5de988141dda9fe27b069f5fd34e11b Mon Sep 17 00:00:00 2001 From: Khotych Mykola Date: Thu, 25 Sep 2025 18:33:02 +0300 Subject: [PATCH 18/20] Add progress animation --- design/api/current.api | 4 +- .../AnimateProgressAsState.kt | 43 +++++++++++++++++++ .../DownloadingProgressBar.kt | 15 ++----- 3 files changed, 48 insertions(+), 14 deletions(-) create mode 100644 design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/AnimateProgressAsState.kt diff --git a/design/api/current.api b/design/api/current.api index ef385588..c2f8aae5 100644 --- a/design/api/current.api +++ b/design/api/current.api @@ -131,8 +131,8 @@ package com.urlaunched.android.design.ui.counter.ui { package com.urlaunched.android.design.ui.downloadingprogressdialog { public final class DownloadingProgressBarKt { - method @androidx.compose.runtime.Composable public static void AnimatedDownloadingProgressBar(optional androidx.compose.ui.Modifier modifier, @FloatRange(from=0.0, to=1.0) float progress, androidx.compose.ui.graphics.Brush trackBrush, androidx.compose.ui.graphics.Brush progressBrush, optional float progressBarHeight, optional androidx.compose.ui.graphics.Shape trackShape, optional androidx.compose.ui.graphics.Shape progressShape, optional androidx.compose.animation.core.AnimationSpec animationSpec, optional kotlin.jvm.functions.Function2? progressText, optional kotlin.jvm.functions.Function1? supportingText); - method @androidx.compose.runtime.Composable public static void AnimatedDownloadingProgressBar(optional androidx.compose.ui.Modifier modifier, @FloatRange(from=0.0, to=1.0) float progress, long trackColor, long progressColor, optional float progressBarHeight, optional androidx.compose.ui.graphics.Shape trackShape, optional androidx.compose.ui.graphics.Shape progressShape, optional androidx.compose.animation.core.AnimationSpec animationSpec, optional kotlin.jvm.functions.Function2? progressText, optional kotlin.jvm.functions.Function1? supportingText); + method @androidx.compose.runtime.Composable public static void AnimatedDownloadingProgressBar(optional androidx.compose.ui.Modifier modifier, @FloatRange(from=0.0, to=1.0) float progress, androidx.compose.ui.graphics.Brush trackBrush, androidx.compose.ui.graphics.Brush progressBrush, optional float progressBarHeight, optional androidx.compose.ui.graphics.Shape trackShape, optional androidx.compose.ui.graphics.Shape progressShape, optional kotlin.jvm.functions.Function2? progressText, optional kotlin.jvm.functions.Function1? supportingText); + method @androidx.compose.runtime.Composable public static void AnimatedDownloadingProgressBar(optional androidx.compose.ui.Modifier modifier, @FloatRange(from=0.0, to=1.0) float progress, long trackColor, long progressColor, optional float progressBarHeight, optional androidx.compose.ui.graphics.Shape trackShape, optional androidx.compose.ui.graphics.Shape progressShape, optional kotlin.jvm.functions.Function2? progressText, optional kotlin.jvm.functions.Function1? supportingText); method @androidx.compose.runtime.Composable public static void DownloadingProgressBar(optional androidx.compose.ui.Modifier modifier, @FloatRange(from=0.0, to=1.0) float progress, androidx.compose.ui.graphics.Brush trackBrush, androidx.compose.ui.graphics.Brush progressBrush, optional float progressBarHeight, optional androidx.compose.ui.graphics.Shape trackShape, optional androidx.compose.ui.graphics.Shape progressShape, optional kotlin.jvm.functions.Function1? progressText, optional kotlin.jvm.functions.Function1? supportingText); method @androidx.compose.runtime.Composable public static void DownloadingProgressBar(optional androidx.compose.ui.Modifier modifier, @FloatRange(from=0.0, to=1.0) float progress, long trackColor, long progressColor, optional float progressBarHeight, optional androidx.compose.ui.graphics.Shape trackShape, optional androidx.compose.ui.graphics.Shape progressShape, optional kotlin.jvm.functions.Function1? progressText, optional kotlin.jvm.functions.Function1? supportingText); } diff --git a/design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/AnimateProgressAsState.kt b/design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/AnimateProgressAsState.kt new file mode 100644 index 00000000..908c90ce --- /dev/null +++ b/design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/AnimateProgressAsState.kt @@ -0,0 +1,43 @@ +package com.urlaunched.android.design.ui.downloadingprogressdialog + +import androidx.compose.animation.core.Animatable +import androidx.compose.animation.core.tween +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.State +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableLongStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.setValue +import kotlinx.coroutines.launch + +private const val MIN_ANIM_DURATION = 1 +private const val MAX_ANIM_DURATION = 700 + +@Composable +internal fun animateProgressAsState(progress: Float): State { + val coroutineScope = rememberCoroutineScope() + val animatedProgress = remember { Animatable(progress) } + var lastTimestamp by remember { mutableLongStateOf(System.currentTimeMillis()) } + + LaunchedEffect(progress) { + val now = System.currentTimeMillis() + val deltaT = (now - lastTimestamp).coerceAtLeast(MIN_ANIM_DURATION.toLong()) + + coroutineScope.launch { + animatedProgress.animateTo( + targetValue = progress, + animationSpec = tween( + durationMillis = deltaT.toInt().coerceIn( + minimumValue = MIN_ANIM_DURATION, + maximumValue = MAX_ANIM_DURATION + ) + ) + ) + } + + lastTimestamp = now + } + return animatedProgress.asState() +} \ No newline at end of file diff --git a/design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/DownloadingProgressBar.kt b/design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/DownloadingProgressBar.kt index abd18aa7..6b84cadc 100644 --- a/design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/DownloadingProgressBar.kt +++ b/design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/DownloadingProgressBar.kt @@ -1,9 +1,6 @@ package com.urlaunched.android.design.ui.downloadingprogressdialog import androidx.annotation.FloatRange -import androidx.compose.animation.core.AnimationSpec -import androidx.compose.animation.core.animateFloatAsState -import androidx.compose.animation.core.tween import androidx.compose.foundation.Canvas import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box @@ -51,7 +48,6 @@ fun AnimatedDownloadingProgressBar( progressBarHeight: Dp = Dimens.spacingLarge, trackShape: Shape = CircleShape, progressShape: Shape = trackShape, - animationSpec: AnimationSpec = tween(), progressText: (@Composable BoxScope.(Float) -> Unit)? = null, supportingText: (@Composable BoxScope.() -> Unit)? = null ) { @@ -63,7 +59,6 @@ fun AnimatedDownloadingProgressBar( progressBarHeight = progressBarHeight, trackShape = trackShape, progressShape = progressShape, - animationSpec = animationSpec, progressText = progressText, supportingText = supportingText ) @@ -79,14 +74,10 @@ fun AnimatedDownloadingProgressBar( progressBarHeight: Dp = Dimens.spacingLarge, trackShape: Shape = CircleShape, progressShape: Shape = trackShape, - animationSpec: AnimationSpec = tween(), progressText: (@Composable BoxScope.(Float) -> Unit)? = null, supportingText: (@Composable BoxScope.() -> Unit)? = null ) { - val animatedProgress by animateFloatAsState( - targetValue = progress, - animationSpec = animationSpec - ) + val animatedProgress by animateProgressAsState(progress = progress) DownloadingProgressBar( progress = animatedProgress, @@ -251,11 +242,11 @@ private fun SolidProgressBarPreview() { @Preview @Composable private fun AnimatedProgressBarPreview() { - var progress by remember { mutableFloatStateOf(0.33f) } + var progress by remember { mutableFloatStateOf(0f) } LaunchedEffect(Unit) { while (isActive) { - delay(1000) + delay(500) if (progress < 1f) { progress += 0.1f } else { From 76e7a2567ce397cd3ccd9b6b45d452f0b4cec775 Mon Sep 17 00:00:00 2001 From: Khotych Mykola Date: Thu, 2 Oct 2025 18:13:51 +0300 Subject: [PATCH 19/20] Move progress text inside of downloading progress bar --- design/api/current.api | 73 +++++-------------- .../DownloadingProgressBar.kt | 49 +++++++------ .../DownloadingProgressDialog.kt | 49 +++---------- .../ProgressText.kt | 6 +- .../models/ProgressDirection.kt | 12 +-- .../models/ProgressTextStyle.kt | 10 +++ 6 files changed, 78 insertions(+), 121 deletions(-) rename design/src/main/java/com/urlaunched/android/design/ui/{progresstext => downloadingprogressdialog}/ProgressText.kt (95%) rename design/src/main/java/com/urlaunched/android/design/ui/{progresstext => downloadingprogressdialog}/models/ProgressDirection.kt (86%) create mode 100644 design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/models/ProgressTextStyle.kt diff --git a/design/api/current.api b/design/api/current.api index c2f8aae5..886f1a42 100644 --- a/design/api/current.api +++ b/design/api/current.api @@ -131,15 +131,15 @@ package com.urlaunched.android.design.ui.counter.ui { package com.urlaunched.android.design.ui.downloadingprogressdialog { public final class DownloadingProgressBarKt { - method @androidx.compose.runtime.Composable public static void AnimatedDownloadingProgressBar(optional androidx.compose.ui.Modifier modifier, @FloatRange(from=0.0, to=1.0) float progress, androidx.compose.ui.graphics.Brush trackBrush, androidx.compose.ui.graphics.Brush progressBrush, optional float progressBarHeight, optional androidx.compose.ui.graphics.Shape trackShape, optional androidx.compose.ui.graphics.Shape progressShape, optional kotlin.jvm.functions.Function2? progressText, optional kotlin.jvm.functions.Function1? supportingText); - method @androidx.compose.runtime.Composable public static void AnimatedDownloadingProgressBar(optional androidx.compose.ui.Modifier modifier, @FloatRange(from=0.0, to=1.0) float progress, long trackColor, long progressColor, optional float progressBarHeight, optional androidx.compose.ui.graphics.Shape trackShape, optional androidx.compose.ui.graphics.Shape progressShape, optional kotlin.jvm.functions.Function2? progressText, optional kotlin.jvm.functions.Function1? supportingText); - method @androidx.compose.runtime.Composable public static void DownloadingProgressBar(optional androidx.compose.ui.Modifier modifier, @FloatRange(from=0.0, to=1.0) float progress, androidx.compose.ui.graphics.Brush trackBrush, androidx.compose.ui.graphics.Brush progressBrush, optional float progressBarHeight, optional androidx.compose.ui.graphics.Shape trackShape, optional androidx.compose.ui.graphics.Shape progressShape, optional kotlin.jvm.functions.Function1? progressText, optional kotlin.jvm.functions.Function1? supportingText); - method @androidx.compose.runtime.Composable public static void DownloadingProgressBar(optional androidx.compose.ui.Modifier modifier, @FloatRange(from=0.0, to=1.0) float progress, long trackColor, long progressColor, optional float progressBarHeight, optional androidx.compose.ui.graphics.Shape trackShape, optional androidx.compose.ui.graphics.Shape progressShape, optional kotlin.jvm.functions.Function1? progressText, optional kotlin.jvm.functions.Function1? supportingText); + method @androidx.compose.runtime.Composable public static void AnimatedDownloadingProgressBar(optional androidx.compose.ui.Modifier modifier, @FloatRange(from=0.0, to=1.0) float progress, androidx.compose.ui.graphics.Brush trackBrush, androidx.compose.ui.graphics.Brush progressBrush, optional float progressBarHeight, optional androidx.compose.ui.graphics.Shape trackShape, optional androidx.compose.ui.graphics.Shape progressShape, optional kotlin.jvm.functions.Function1? progressText, optional com.urlaunched.android.design.ui.downloadingprogressdialog.models.ProgressTextStyle progressTextStyle, optional kotlin.jvm.functions.Function1? supportingText); + method @androidx.compose.runtime.Composable public static void AnimatedDownloadingProgressBar(optional androidx.compose.ui.Modifier modifier, @FloatRange(from=0.0, to=1.0) float progress, long trackColor, long progressColor, optional float progressBarHeight, optional androidx.compose.ui.graphics.Shape trackShape, optional androidx.compose.ui.graphics.Shape progressShape, optional kotlin.jvm.functions.Function1? progressText, optional com.urlaunched.android.design.ui.downloadingprogressdialog.models.ProgressTextStyle progressTextStyle, optional kotlin.jvm.functions.Function1? supportingText); + method @androidx.compose.runtime.Composable public static void DownloadingProgressBar(optional androidx.compose.ui.Modifier modifier, @FloatRange(from=0.0, to=1.0) float progress, androidx.compose.ui.graphics.Brush trackBrush, androidx.compose.ui.graphics.Brush progressBrush, optional String? progressText, optional com.urlaunched.android.design.ui.downloadingprogressdialog.models.ProgressTextStyle progressTextStyle, optional float progressBarHeight, optional androidx.compose.ui.graphics.Shape trackShape, optional androidx.compose.ui.graphics.Shape progressShape, optional kotlin.jvm.functions.Function1? supportingText); + method @androidx.compose.runtime.Composable public static void DownloadingProgressBar(optional androidx.compose.ui.Modifier modifier, @FloatRange(from=0.0, to=1.0) float progress, long trackColor, long progressColor, optional String? progressText, optional com.urlaunched.android.design.ui.downloadingprogressdialog.models.ProgressTextStyle progressTextStyle, optional float progressBarHeight, optional androidx.compose.ui.graphics.Shape trackShape, optional androidx.compose.ui.graphics.Shape progressShape, optional kotlin.jvm.functions.Function1? supportingText); } public final class DownloadingProgressDialogKt { - method @androidx.compose.runtime.Composable public static void BaseDownloadingProgressDialog(optional androidx.compose.ui.Modifier modifier, @com.composables.core.androidx.annotation.FloatRange(from=0.0, to=1.0) float progress, optional kotlin.jvm.functions.Function0 onDismissRequest, optional com.urlaunched.android.design.ui.downloadingprogressdialog.models.ProgressBarStyle progressBarStyle, optional long dialogContainerColor, optional androidx.compose.ui.graphics.Shape dialogContainerShape, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.ui.window.DialogProperties dialogProperties, optional kotlin.jvm.functions.Function1? title, optional kotlin.jvm.functions.Function1? description, optional kotlin.jvm.functions.Function1? progressText, optional kotlin.jvm.functions.Function1? supportingText, optional kotlin.jvm.functions.Function1? button); - method @androidx.compose.runtime.Composable public static void DownloadingProgressDialog(optional androidx.compose.ui.Modifier modifier, @com.composables.core.androidx.annotation.FloatRange(from=0.0, to=1.0) float progress, optional kotlin.jvm.functions.Function0 onDismissRequest, optional com.urlaunched.android.design.ui.downloadingprogressdialog.models.ProgressBarStyle progressBarStyle, optional long dialogContainerColor, optional androidx.compose.ui.graphics.Shape dialogContainerShape, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.ui.window.DialogProperties dialogProperties, optional kotlin.jvm.functions.Function1? title, optional kotlin.jvm.functions.Function1? description, optional kotlin.jvm.functions.Function1? progressText, optional kotlin.jvm.functions.Function1? supportingText, optional kotlin.jvm.functions.Function1? button); + method @androidx.compose.runtime.Composable public static void BaseDownloadingProgressDialog(optional androidx.compose.ui.Modifier modifier, @com.composables.core.androidx.annotation.FloatRange(from=0.0, to=1.0) float progress, optional String? progressText, optional com.urlaunched.android.design.ui.downloadingprogressdialog.models.ProgressTextStyle progressTextStyle, optional com.urlaunched.android.design.ui.downloadingprogressdialog.models.ProgressBarStyle progressBarStyle, optional kotlin.jvm.functions.Function0 onDismissRequest, optional long dialogContainerColor, optional androidx.compose.ui.graphics.Shape dialogContainerShape, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.ui.window.DialogProperties dialogProperties, optional kotlin.jvm.functions.Function1? title, optional kotlin.jvm.functions.Function1? description, optional kotlin.jvm.functions.Function1? supportingText, optional kotlin.jvm.functions.Function1? button); + method @androidx.compose.runtime.Composable public static void DownloadingProgressDialog(optional androidx.compose.ui.Modifier modifier, @com.composables.core.androidx.annotation.FloatRange(from=0.0, to=1.0) float progress, optional String? progressText, optional com.urlaunched.android.design.ui.downloadingprogressdialog.models.ProgressTextStyle progressTextStyle, optional com.urlaunched.android.design.ui.downloadingprogressdialog.models.ProgressBarStyle progressBarStyle, optional long dialogContainerColor, optional kotlin.jvm.functions.Function0 onDismissRequest, optional androidx.compose.ui.graphics.Shape dialogContainerShape, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.ui.window.DialogProperties dialogProperties, optional kotlin.jvm.functions.Function1? title, optional kotlin.jvm.functions.Function1? description, optional kotlin.jvm.functions.Function1? supportingText, optional kotlin.jvm.functions.Function1? button); } } @@ -167,6 +167,20 @@ package com.urlaunched.android.design.ui.downloadingprogressdialog.models { property public final androidx.compose.ui.graphics.Shape trackShape; } + public final class ProgressTextStyle { + ctor public ProgressTextStyle(optional androidx.compose.ui.text.TextStyle textStyle, optional long startColor, optional long endColor); + method public androidx.compose.ui.text.TextStyle component1(); + method public long component2-0d7_KjU(); + method public long component3-0d7_KjU(); + method public com.urlaunched.android.design.ui.downloadingprogressdialog.models.ProgressTextStyle copy-WkMS-hQ(androidx.compose.ui.text.TextStyle textStyle, long startColor, long endColor); + method public long getEndColor(); + method public long getStartColor(); + method public androidx.compose.ui.text.TextStyle getTextStyle(); + property public final long endColor; + property public final long startColor; + property public final androidx.compose.ui.text.TextStyle textStyle; + } + } package com.urlaunched.android.design.ui.expandabletext { @@ -324,53 +338,6 @@ package com.urlaunched.android.design.ui.progressbarcontainer { } -package com.urlaunched.android.design.ui.progresstext { - - public final class ProgressTextKt { - method @androidx.compose.runtime.Composable public static void ProgressText(optional androidx.compose.ui.Modifier modifier, String text, @FloatRange(from=0.0, to=1.0) float progress, long startColor, long endColor, optional com.urlaunched.android.design.ui.progresstext.models.ProgressDirection progressDirection, optional long fontSize, optional androidx.compose.ui.text.font.FontStyle? fontStyle, optional androidx.compose.ui.text.font.FontWeight? fontWeight, optional androidx.compose.ui.text.font.FontFamily? fontFamily, optional long letterSpacing, optional androidx.compose.ui.text.style.TextDecoration? textDecoration, optional androidx.compose.ui.text.style.TextAlign? textAlign, optional long lineHeight, optional int overflow, optional boolean softWrap, optional int maxLines, optional int minLines, optional kotlin.jvm.functions.Function1? onTextLayout, optional androidx.compose.ui.text.TextStyle style); - } - -} - -package com.urlaunched.android.design.ui.progresstext.models { - - public interface ProgressDirection { - method public long getEndOffset(androidx.compose.ui.unit.LayoutDirection layoutDirection); - method public long getStartOffset(androidx.compose.ui.unit.LayoutDirection layoutDirection); - } - - public static final class ProgressDirection.BottomToTop implements com.urlaunched.android.design.ui.progresstext.models.ProgressDirection { - method public long getEndOffset(androidx.compose.ui.unit.LayoutDirection layoutDirection); - method public long getStartOffset(androidx.compose.ui.unit.LayoutDirection layoutDirection); - field public static final com.urlaunched.android.design.ui.progresstext.models.ProgressDirection.BottomToTop INSTANCE; - } - - public static final class ProgressDirection.Horizontal implements com.urlaunched.android.design.ui.progresstext.models.ProgressDirection { - method public long getEndOffset(androidx.compose.ui.unit.LayoutDirection layoutDirection); - method public long getStartOffset(androidx.compose.ui.unit.LayoutDirection layoutDirection); - field public static final com.urlaunched.android.design.ui.progresstext.models.ProgressDirection.Horizontal INSTANCE; - } - - public static final class ProgressDirection.LeftToRight implements com.urlaunched.android.design.ui.progresstext.models.ProgressDirection { - method public long getEndOffset(androidx.compose.ui.unit.LayoutDirection layoutDirection); - method public long getStartOffset(androidx.compose.ui.unit.LayoutDirection layoutDirection); - field public static final com.urlaunched.android.design.ui.progresstext.models.ProgressDirection.LeftToRight INSTANCE; - } - - public static final class ProgressDirection.RightToLeft implements com.urlaunched.android.design.ui.progresstext.models.ProgressDirection { - method public long getEndOffset(androidx.compose.ui.unit.LayoutDirection layoutDirection); - method public long getStartOffset(androidx.compose.ui.unit.LayoutDirection layoutDirection); - field public static final com.urlaunched.android.design.ui.progresstext.models.ProgressDirection.RightToLeft INSTANCE; - } - - public static final class ProgressDirection.TopToBottom implements com.urlaunched.android.design.ui.progresstext.models.ProgressDirection { - method public long getEndOffset(androidx.compose.ui.unit.LayoutDirection layoutDirection); - method public long getStartOffset(androidx.compose.ui.unit.LayoutDirection layoutDirection); - field public static final com.urlaunched.android.design.ui.progresstext.models.ProgressDirection.TopToBottom INSTANCE; - } - -} - package com.urlaunched.android.design.ui.pulltorefresh { public final class PullToRefreshBoxKt { diff --git a/design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/DownloadingProgressBar.kt b/design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/DownloadingProgressBar.kt index 6b84cadc..c2ff893c 100644 --- a/design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/DownloadingProgressBar.kt +++ b/design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/DownloadingProgressBar.kt @@ -34,7 +34,7 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import com.urlaunched.android.design.resources.dimens.Dimens -import com.urlaunched.android.design.ui.progresstext.ProgressText +import com.urlaunched.android.design.ui.downloadingprogressdialog.models.ProgressTextStyle import kotlinx.coroutines.delay import kotlinx.coroutines.isActive @@ -48,7 +48,8 @@ fun AnimatedDownloadingProgressBar( progressBarHeight: Dp = Dimens.spacingLarge, trackShape: Shape = CircleShape, progressShape: Shape = trackShape, - progressText: (@Composable BoxScope.(Float) -> Unit)? = null, + progressText: ((animatedProgress: Float) -> String)? = null, + progressTextStyle: ProgressTextStyle = ProgressTextStyle(), supportingText: (@Composable BoxScope.() -> Unit)? = null ) { AnimatedDownloadingProgressBar( @@ -60,6 +61,7 @@ fun AnimatedDownloadingProgressBar( trackShape = trackShape, progressShape = progressShape, progressText = progressText, + progressTextStyle = progressTextStyle, supportingText = supportingText ) } @@ -74,7 +76,8 @@ fun AnimatedDownloadingProgressBar( progressBarHeight: Dp = Dimens.spacingLarge, trackShape: Shape = CircleShape, progressShape: Shape = trackShape, - progressText: (@Composable BoxScope.(Float) -> Unit)? = null, + progressText: ((animatedProgress: Float) -> String)? = null, + progressTextStyle: ProgressTextStyle = ProgressTextStyle(), supportingText: (@Composable BoxScope.() -> Unit)? = null ) { val animatedProgress by animateProgressAsState(progress = progress) @@ -88,11 +91,8 @@ fun AnimatedDownloadingProgressBar( trackShape = trackShape, progressShape = progressShape, supportingText = supportingText, - progressText = progressText?.let { textContent -> - @Composable { - textContent(animatedProgress) - } - } + progressText = progressText?.invoke(animatedProgress), + progressTextStyle = progressTextStyle ) } @@ -103,10 +103,11 @@ fun DownloadingProgressBar( progress: Float, trackColor: Color, progressColor: Color, + progressText: String? = null, + progressTextStyle: ProgressTextStyle = ProgressTextStyle(), progressBarHeight: Dp = Dimens.spacingLarge, trackShape: Shape = CircleShape, progressShape: Shape = trackShape, - progressText: (@Composable BoxScope.() -> Unit)? = null, supportingText: (@Composable BoxScope.() -> Unit)? = null ) { DownloadingProgressBar( @@ -118,6 +119,7 @@ fun DownloadingProgressBar( trackShape = trackShape, progressShape = progressShape, progressText = progressText, + progressTextStyle = progressTextStyle, supportingText = supportingText ) } @@ -129,10 +131,11 @@ fun DownloadingProgressBar( progress: Float, trackBrush: Brush, progressBrush: Brush, + progressText: String? = null, + progressTextStyle: ProgressTextStyle = ProgressTextStyle(), progressBarHeight: Dp = Dimens.spacingLarge, trackShape: Shape = CircleShape, progressShape: Shape = trackShape, - progressText: (@Composable BoxScope.() -> Unit)? = null, supportingText: (@Composable BoxScope.() -> Unit)? = null ) { Column(modifier = modifier) { @@ -150,7 +153,18 @@ fun DownloadingProgressBar( progressShape = progressShape ) - progressText?.invoke(this@Box) + if (progressText != null) { + ProgressText( + text = progressText, + progress = progress, + startColor = progressTextStyle.startColor, + endColor = progressTextStyle.endColor, + textAlign = TextAlign.Center, + modifier = Modifier + .fillMaxWidth() + .align(Alignment.Center) + ) + } } supportingText?.let { textContent -> @@ -242,7 +256,7 @@ private fun SolidProgressBarPreview() { @Preview @Composable private fun AnimatedProgressBarPreview() { - var progress by remember { mutableFloatStateOf(0f) } + var progress by remember { mutableFloatStateOf(0.49f) } LaunchedEffect(Unit) { while (isActive) { @@ -261,16 +275,7 @@ private fun AnimatedProgressBarPreview() { progressColor = Color.Red, trackColor = Color.LightGray, progressText = { animatedProgress -> - ProgressText( - text = "${"%.1f".format(animatedProgress * 100f)} %", - progress = animatedProgress, - startColor = Color.White, - endColor = Color.Gray, - textAlign = TextAlign.Center, - modifier = Modifier - .fillMaxWidth() - .align(Alignment.Center) - ) + "${"%.1f".format(animatedProgress * 100f)} %" } ) } \ No newline at end of file diff --git a/design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/DownloadingProgressDialog.kt b/design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/DownloadingProgressDialog.kt index 1b4adc97..146fc853 100644 --- a/design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/DownloadingProgressDialog.kt +++ b/design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/DownloadingProgressDialog.kt @@ -23,31 +23,28 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Shape -import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.window.DialogProperties import com.composables.core.androidx.annotation.FloatRange import com.urlaunched.android.design.resources.dimens.Dimens import com.urlaunched.android.design.ui.downloadingprogressdialog.models.ProgressBarStyle -import com.urlaunched.android.design.ui.progresstext.ProgressText +import com.urlaunched.android.design.ui.downloadingprogressdialog.models.ProgressTextStyle -/** - * @see ProgressText - */ @Composable fun DownloadingProgressDialog( modifier: Modifier = Modifier, @FloatRange(0.0, 1.0) progress: Float, - onDismissRequest: () -> Unit = {}, + progressText: String? = null, + progressTextStyle: ProgressTextStyle = ProgressTextStyle(), progressBarStyle: ProgressBarStyle = ProgressBarStyle(), dialogContainerColor: Color = Color.White, + onDismissRequest: () -> Unit = {}, dialogContainerShape: Shape = RoundedCornerShape(Dimens.cornerRadiusLarge), contentPadding: PaddingValues = PaddingValues(Dimens.spacingNormal), dialogProperties: DialogProperties = DialogProperties(), title: (@Composable ColumnScope.() -> Unit)? = null, description: (@Composable ColumnScope.() -> Unit)? = null, - progressText: (@Composable BoxScope.() -> Unit)? = null, supportingText: (@Composable BoxScope.() -> Unit)? = null, button: (@Composable ColumnScope.() -> Unit)? = null ) { @@ -60,6 +57,8 @@ fun DownloadingProgressDialog( dialogContainerColor = dialogContainerColor, dialogContainerShape = dialogContainerShape, contentPadding = contentPadding, + progressText = progressText, + progressTextStyle = progressTextStyle, title = title?.let { titleContent -> @Composable { titleContent() @@ -74,7 +73,6 @@ fun DownloadingProgressDialog( Spacer(modifier = Modifier.height(Dimens.spacingBigSpecial)) } }, - progressText = progressText, supportingText = supportingText, button = button?.let { buttonContent -> @Composable { @@ -91,24 +89,22 @@ fun DownloadingProgressDialog( ) } -/** - * @see ProgressText - */ @OptIn(ExperimentalMaterial3Api::class) @Composable fun BaseDownloadingProgressDialog( modifier: Modifier = Modifier, @FloatRange(0.0, 1.0) progress: Float, - onDismissRequest: () -> Unit = {}, + progressText: String? = null, + progressTextStyle: ProgressTextStyle = ProgressTextStyle(), progressBarStyle: ProgressBarStyle = ProgressBarStyle(), + onDismissRequest: () -> Unit = {}, dialogContainerColor: Color = Color.White, dialogContainerShape: Shape = RoundedCornerShape(Dimens.cornerRadiusLarge), contentPadding: PaddingValues = PaddingValues(Dimens.spacingNormal), dialogProperties: DialogProperties = DialogProperties(), title: (@Composable ColumnScope.() -> Unit)? = null, description: (@Composable ColumnScope.() -> Unit)? = null, - progressText: (@Composable BoxScope.() -> Unit)? = null, supportingText: (@Composable BoxScope.() -> Unit)? = null, button: (@Composable ColumnScope.() -> Unit)? = null ) { @@ -138,6 +134,7 @@ fun BaseDownloadingProgressDialog( progressBrush = progressBarStyle.progressBrush, trackBrush = progressBarStyle.trackBrush, progressText = progressText, + progressTextStyle = progressTextStyle, supportingText = supportingText ) @@ -166,18 +163,7 @@ private fun BaseDownloadingProgressDialogPreview() { style = MaterialTheme.typography.bodyMedium ) }, - progressText = { - ProgressText( - text = "${progress * 100f}%", - progress = progress, - startColor = Color.Yellow, - endColor = Color.Gray, - textAlign = TextAlign.Center, - modifier = Modifier - .fillMaxWidth() - .align(Alignment.Center) - ) - }, + progressText = "${progress * 100f}%", supportingText = { Row( modifier = Modifier.fillMaxWidth(), @@ -221,18 +207,7 @@ private fun DownloadingProgressDialogPreview() { style = MaterialTheme.typography.bodyMedium ) }, - progressText = { - ProgressText( - text = "${progress * 100f}%", - progress = progress, - startColor = Color.Yellow, - endColor = Color.Gray, - textAlign = TextAlign.Center, - modifier = Modifier - .fillMaxWidth() - .align(Alignment.Center) - ) - }, + progressText = "${progress * 100f}%", supportingText = { Row( modifier = Modifier.fillMaxWidth(), diff --git a/design/src/main/java/com/urlaunched/android/design/ui/progresstext/ProgressText.kt b/design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/ProgressText.kt similarity index 95% rename from design/src/main/java/com/urlaunched/android/design/ui/progresstext/ProgressText.kt rename to design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/ProgressText.kt index 406bf6d8..00ad9470 100644 --- a/design/src/main/java/com/urlaunched/android/design/ui/progresstext/ProgressText.kt +++ b/design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/ProgressText.kt @@ -1,4 +1,4 @@ -package com.urlaunched.android.design.ui.progresstext +package com.urlaunched.android.design.ui.downloadingprogressdialog import androidx.annotation.FloatRange import androidx.compose.foundation.background @@ -28,10 +28,10 @@ import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.TextUnit import androidx.compose.ui.unit.dp -import com.urlaunched.android.design.ui.progresstext.models.ProgressDirection +import com.urlaunched.android.design.ui.downloadingprogressdialog.models.ProgressDirection @Composable -fun ProgressText( +internal fun ProgressText( modifier: Modifier = Modifier, text: String, @FloatRange(0.0, 1.0) diff --git a/design/src/main/java/com/urlaunched/android/design/ui/progresstext/models/ProgressDirection.kt b/design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/models/ProgressDirection.kt similarity index 86% rename from design/src/main/java/com/urlaunched/android/design/ui/progresstext/models/ProgressDirection.kt rename to design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/models/ProgressDirection.kt index cc70fa3f..2bab2fbd 100644 --- a/design/src/main/java/com/urlaunched/android/design/ui/progresstext/models/ProgressDirection.kt +++ b/design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/models/ProgressDirection.kt @@ -1,9 +1,9 @@ -package com.urlaunched.android.design.ui.progresstext.models +package com.urlaunched.android.design.ui.downloadingprogressdialog.models import androidx.compose.ui.geometry.Offset import androidx.compose.ui.unit.LayoutDirection -interface ProgressDirection { +internal interface ProgressDirection { fun getStartOffset(layoutDirection: LayoutDirection): Offset fun getEndOffset(layoutDirection: LayoutDirection): Offset @@ -19,22 +19,22 @@ interface ProgressDirection { } object LeftToRight : ProgressDirection { - override fun getStartOffset(layoutDirection: LayoutDirection): Offset = Offset.Zero + override fun getStartOffset(layoutDirection: LayoutDirection): Offset = Offset.Companion.Zero override fun getEndOffset(layoutDirection: LayoutDirection): Offset = Offset(Float.POSITIVE_INFINITY, 0f) } object RightToLeft : ProgressDirection { override fun getStartOffset(layoutDirection: LayoutDirection): Offset = Offset(Float.POSITIVE_INFINITY, 0f) - override fun getEndOffset(layoutDirection: LayoutDirection): Offset = Offset.Zero + override fun getEndOffset(layoutDirection: LayoutDirection): Offset = Offset.Companion.Zero } object TopToBottom : ProgressDirection { - override fun getStartOffset(layoutDirection: LayoutDirection): Offset = Offset.Zero + override fun getStartOffset(layoutDirection: LayoutDirection): Offset = Offset.Companion.Zero override fun getEndOffset(layoutDirection: LayoutDirection): Offset = Offset(0f, Float.POSITIVE_INFINITY) } object BottomToTop : ProgressDirection { override fun getStartOffset(layoutDirection: LayoutDirection): Offset = Offset(0f, Float.POSITIVE_INFINITY) - override fun getEndOffset(layoutDirection: LayoutDirection): Offset = Offset.Zero + override fun getEndOffset(layoutDirection: LayoutDirection): Offset = Offset.Companion.Zero } } \ No newline at end of file diff --git a/design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/models/ProgressTextStyle.kt b/design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/models/ProgressTextStyle.kt new file mode 100644 index 00000000..d7ec0a2e --- /dev/null +++ b/design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/models/ProgressTextStyle.kt @@ -0,0 +1,10 @@ +package com.urlaunched.android.design.ui.downloadingprogressdialog.models + +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.TextStyle + +data class ProgressTextStyle( + val textStyle: TextStyle = TextStyle(), + val startColor: Color = Color.White, + val endColor: Color = Color.Gray +) \ No newline at end of file From 3530b7408aa5a499ca35b3e1923be3fa62ecdb39 Mon Sep 17 00:00:00 2001 From: Khotych Mykola Date: Mon, 20 Oct 2025 16:47:49 +0300 Subject: [PATCH 20/20] Rename button to bottomContent --- design/api/current.api | 4 ++-- .../DownloadingProgressDialog.kt | 14 +++++++------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/design/api/current.api b/design/api/current.api index 886f1a42..71b2dfdd 100644 --- a/design/api/current.api +++ b/design/api/current.api @@ -138,8 +138,8 @@ package com.urlaunched.android.design.ui.downloadingprogressdialog { } public final class DownloadingProgressDialogKt { - method @androidx.compose.runtime.Composable public static void BaseDownloadingProgressDialog(optional androidx.compose.ui.Modifier modifier, @com.composables.core.androidx.annotation.FloatRange(from=0.0, to=1.0) float progress, optional String? progressText, optional com.urlaunched.android.design.ui.downloadingprogressdialog.models.ProgressTextStyle progressTextStyle, optional com.urlaunched.android.design.ui.downloadingprogressdialog.models.ProgressBarStyle progressBarStyle, optional kotlin.jvm.functions.Function0 onDismissRequest, optional long dialogContainerColor, optional androidx.compose.ui.graphics.Shape dialogContainerShape, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.ui.window.DialogProperties dialogProperties, optional kotlin.jvm.functions.Function1? title, optional kotlin.jvm.functions.Function1? description, optional kotlin.jvm.functions.Function1? supportingText, optional kotlin.jvm.functions.Function1? button); - method @androidx.compose.runtime.Composable public static void DownloadingProgressDialog(optional androidx.compose.ui.Modifier modifier, @com.composables.core.androidx.annotation.FloatRange(from=0.0, to=1.0) float progress, optional String? progressText, optional com.urlaunched.android.design.ui.downloadingprogressdialog.models.ProgressTextStyle progressTextStyle, optional com.urlaunched.android.design.ui.downloadingprogressdialog.models.ProgressBarStyle progressBarStyle, optional long dialogContainerColor, optional kotlin.jvm.functions.Function0 onDismissRequest, optional androidx.compose.ui.graphics.Shape dialogContainerShape, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.ui.window.DialogProperties dialogProperties, optional kotlin.jvm.functions.Function1? title, optional kotlin.jvm.functions.Function1? description, optional kotlin.jvm.functions.Function1? supportingText, optional kotlin.jvm.functions.Function1? button); + method @androidx.compose.runtime.Composable public static void BaseDownloadingProgressDialog(optional androidx.compose.ui.Modifier modifier, @com.composables.core.androidx.annotation.FloatRange(from=0.0, to=1.0) float progress, optional String? progressText, optional com.urlaunched.android.design.ui.downloadingprogressdialog.models.ProgressTextStyle progressTextStyle, optional com.urlaunched.android.design.ui.downloadingprogressdialog.models.ProgressBarStyle progressBarStyle, optional kotlin.jvm.functions.Function0 onDismissRequest, optional long dialogContainerColor, optional androidx.compose.ui.graphics.Shape dialogContainerShape, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.ui.window.DialogProperties dialogProperties, optional kotlin.jvm.functions.Function1? title, optional kotlin.jvm.functions.Function1? description, optional kotlin.jvm.functions.Function1? supportingText, optional kotlin.jvm.functions.Function1? bottomContent); + method @androidx.compose.runtime.Composable public static void DownloadingProgressDialog(optional androidx.compose.ui.Modifier modifier, @com.composables.core.androidx.annotation.FloatRange(from=0.0, to=1.0) float progress, optional String? progressText, optional com.urlaunched.android.design.ui.downloadingprogressdialog.models.ProgressTextStyle progressTextStyle, optional com.urlaunched.android.design.ui.downloadingprogressdialog.models.ProgressBarStyle progressBarStyle, optional long dialogContainerColor, optional kotlin.jvm.functions.Function0 onDismissRequest, optional androidx.compose.ui.graphics.Shape dialogContainerShape, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.ui.window.DialogProperties dialogProperties, optional kotlin.jvm.functions.Function1? title, optional kotlin.jvm.functions.Function1? description, optional kotlin.jvm.functions.Function1? supportingText, optional kotlin.jvm.functions.Function1? bottomContent); } } diff --git a/design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/DownloadingProgressDialog.kt b/design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/DownloadingProgressDialog.kt index 146fc853..cc3d4e79 100644 --- a/design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/DownloadingProgressDialog.kt +++ b/design/src/main/java/com/urlaunched/android/design/ui/downloadingprogressdialog/DownloadingProgressDialog.kt @@ -46,7 +46,7 @@ fun DownloadingProgressDialog( title: (@Composable ColumnScope.() -> Unit)? = null, description: (@Composable ColumnScope.() -> Unit)? = null, supportingText: (@Composable BoxScope.() -> Unit)? = null, - button: (@Composable ColumnScope.() -> Unit)? = null + bottomContent: (@Composable ColumnScope.() -> Unit)? = null ) { BaseDownloadingProgressDialog( progress = progress, @@ -74,7 +74,7 @@ fun DownloadingProgressDialog( } }, supportingText = supportingText, - button = button?.let { buttonContent -> + bottomContent = bottomContent?.let { bottomContent -> @Composable { Column( modifier = Modifier.fillMaxWidth(), @@ -82,7 +82,7 @@ fun DownloadingProgressDialog( ) { Spacer(modifier = Modifier.height(Dimens.spacingLarge)) - buttonContent() + bottomContent() } } } @@ -106,7 +106,7 @@ fun BaseDownloadingProgressDialog( title: (@Composable ColumnScope.() -> Unit)? = null, description: (@Composable ColumnScope.() -> Unit)? = null, supportingText: (@Composable BoxScope.() -> Unit)? = null, - button: (@Composable ColumnScope.() -> Unit)? = null + bottomContent: (@Composable ColumnScope.() -> Unit)? = null ) { BasicAlertDialog( modifier = modifier, @@ -138,7 +138,7 @@ fun BaseDownloadingProgressDialog( supportingText = supportingText ) - button?.invoke(this@Column) + bottomContent?.invoke(this@Column) } } ) @@ -178,7 +178,7 @@ private fun BaseDownloadingProgressDialogPreview() { } } }, - button = { + bottomContent = { TextButton( onClick = {} ) { @@ -222,7 +222,7 @@ private fun DownloadingProgressDialogPreview() { } } }, - button = { + bottomContent = { TextButton( onClick = {} ) {