Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
225 changes: 225 additions & 0 deletions design/api/current.api

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.urlaunched.android.design.ui.player.models

import androidx.compose.ui.graphics.Color

data class AudioPlayButtonColor(
val buttonColor: Color = Color.White,
val circularProgressColor: Color = Color.White
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.urlaunched.android.design.ui.player.models

data class AudioPlayButtonConstants(
val playButtonProgressSizeFraction: Float = 0.5f,
val audioPlayButtonIconAnimationLabel: String = "PlayButtonIconAnimation"
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.urlaunched.android.design.ui.player.models

import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp

data class AudioPlayButtonDimens(
val buttonSize: Dp = 64.dp
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.urlaunched.android.design.ui.player.models

import androidx.compose.ui.graphics.Color

data class AudioSliderColor(
val thumbColor: Color = Color.White,
val activeTrackColor: Color = Color.White,
val inactiveTrackColor: Color = Color.White,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.urlaunched.android.design.ui.player.models

import androidx.compose.ui.unit.Dp
import com.urlaunched.android.design.resources.dimens.Dimens

data class AudioSliderDimens(
val sliderThumbTrackGapSize: Dp = Dimens.zeroDp,
val sliderTrackInsideCornerSize: Dp = Dimens.zeroDp,
val sliderTrackHeight: Dp = Dimens.spacingTiny,
val sliderTrackHorizontalPadding: Dp = Dimens.spacingSmall
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.urlaunched.android.design.ui.player.models

enum class AudioStateType {
PAUSE,
PLAYING,
BUFFERING
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.urlaunched.android.design.ui.player.models

import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier

data class BottomBarItem(
val title: String,
val onClick: () -> Unit,
val icon: @Composable () -> Unit,
val modifier: Modifier = Modifier,
val enabled: Boolean = true
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.urlaunched.android.design.ui.player.models

import androidx.compose.ui.graphics.Color

data class BottomItemColors(
val background: Color = Color.White,
val enabledTextColor: Color = Color.Gray,
val disabledTextColor: Color = Color.White
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.urlaunched.android.design.ui.player.models

import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import com.urlaunched.android.design.resources.dimens.Dimens

data class BottomItemDimens(
val actionItemWidth: Dp = 53.dp,
val actionItemHeight: Dp = Dimens.spacingLarge,
val columnClip: Dp = Dimens.cornerRadiusNormalSpecial
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.urlaunched.android.design.ui.player.models

import androidx.compose.ui.unit.Dp
import com.urlaunched.android.design.resources.dimens.Dimens

data class BottomPanelDimens(
val rowHorizontalPadding: Dp = Dimens.spacingNormalSpecial,
val rowVerticalPadding: Dp = Dimens.spacingBigSpecial,
val horizontalArrangementPadding: Dp = Dimens.spacingNormalSpecial
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.urlaunched.android.design.ui.player.models

import androidx.compose.ui.graphics.Color

data class MiniPlayerColors(
val background: Color = Color.White,
val textColor: Color = Color.White,
val leadingLineColor: Color = Color.White,
val trailingLineColor: Color = Color.White
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.urlaunched.android.design.ui.player.models

data class MiniPlayerConstants(
val defaultFadeInDuration: Int = 220,
val defaultFadeInDelay: Int = 90,
val defaultFadeOutDuration: Int = 90,
val chapterNameAnimationLabel: String = "ChapterNameAnimation",
val emptyString: String = ""
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.urlaunched.android.design.ui.player.models

import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp

data class MiniPlayerDimens(
val sliderHalfHeightOffset: Dp = 14.dp,
val audioSliderHeight: Dp = 30.dp
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.urlaunched.android.design.ui.player.models

import androidx.compose.ui.unit.Dp
import com.urlaunched.android.design.resources.dimens.Dimens

data class PlayerDimens(
val horizontalDimens: Dp = Dimens.spacingNormalSpecial,
val verticalDimens: Dp = Dimens.zeroDp
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.urlaunched.android.design.ui.player.models

import androidx.compose.ui.graphics.Color

data class PlayerWrapperBottomColor(
val backGround: Color = Color.White
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.urlaunched.android.design.ui.player.models

import androidx.compose.ui.unit.Dp
import com.urlaunched.android.design.resources.dimens.Dimens

data class PlayerWrapperBottomDimens(
val topStartShape: Dp = Dimens.cornerRadiusNormal,
val topEndShape: Dp = Dimens.cornerRadiusNormal
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package com.urlaunched.android.design.ui.player.ui

import androidx.compose.animation.AnimatedContent
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material3.CircularProgressIndicator
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.Color
import com.urlaunched.android.design.ui.player.models.AudioPlayButtonConstants
import com.urlaunched.android.design.ui.player.models.AudioPlayButtonDimens
import com.urlaunched.android.design.ui.player.models.AudioPlayButtonColor
import com.urlaunched.android.design.ui.player.models.AudioStateType

@Composable
internal fun AudioPlayButton(
modifier: Modifier = Modifier,
audioState: Any,
audioPlayButtonDimens: AudioPlayButtonDimens = AudioPlayButtonDimens(),
audioPlayButtonColor: AudioPlayButtonColor = AudioPlayButtonColor(),
audioPlayButtonConstants: AudioPlayButtonConstants = AudioPlayButtonConstants(),
onClick: () -> Unit,
playingButton: @Composable () -> Unit,
pauseButton: @Composable () -> Unit
) {
Box(
modifier = modifier
.clip(CircleShape)
.clickable(onClick = onClick)
.size(audioPlayButtonDimens.buttonSize)
.background(
color = audioPlayButtonColor.buttonColor,
shape = CircleShape
),
contentAlignment = Alignment.Center
) {
AnimatedContent(
targetState = audioState,
contentAlignment = Alignment.Center,
label = audioPlayButtonConstants.audioPlayButtonIconAnimationLabel
) { state ->
val name = (state as? Enum<*>)?.name

when (name) {
AudioStateType.PAUSE.name -> playingButton()

AudioStateType.PLAYING.name -> pauseButton()

AudioStateType.BUFFERING.name -> CircularProgressIndicator(
modifier = Modifier.fillMaxSize(audioPlayButtonConstants.playButtonProgressSizeFraction),
trackColor = Color.Transparent,
color = audioPlayButtonColor.circularProgressColor
)
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.urlaunched.android.design.ui.player.ui

import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.height
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import com.urlaunched.android.design.resources.dimens.Dimens

@Composable
internal fun AudioPlayerTrackDetails(
modifier: Modifier = Modifier,
audioTrackDetails: @Composable () -> Unit,
) {
Column(
modifier = modifier,
verticalArrangement = Arrangement.Top,
horizontalAlignment = Alignment.CenterHorizontally
) {
Spacer(modifier = Modifier.height(Dimens.spacingTinyHalf))

audioTrackDetails()

Spacer(modifier = Modifier.height(Dimens.spacingBigSpecial))
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
package com.urlaunched.android.design.ui.player.ui

import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.offset
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Slider
import androidx.compose.material3.SliderDefaults
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.IntOffset
import com.urlaunched.android.design.resources.dimens.Dimens
import com.urlaunched.android.design.ui.player.models.AudioSliderDimens
import com.urlaunched.android.design.ui.player.models.AudioSliderColor
import kotlin.math.roundToInt

@OptIn(ExperimentalMaterial3Api::class)
@Composable
internal fun AudioSlider(
modifier: Modifier = Modifier,
audioProgress: Float,
audioSliderDimens: AudioSliderDimens = AudioSliderDimens(),
audioSliderColor: AudioSliderColor = AudioSliderColor(),
audioSliderOnValueChange: (Float) -> Unit,
thumb: @Composable () -> Unit,
currentPositionText: @Composable () -> Unit,
timeLeftText: @Composable () -> Unit
) {
Slider(
modifier = modifier,
value = audioProgress,
onValueChange = audioSliderOnValueChange,
colors = SliderDefaults.colors(
thumbColor = audioSliderColor.thumbColor,
activeTrackColor = audioSliderColor.activeTrackColor,
inactiveTrackColor = audioSliderColor.inactiveTrackColor
),
thumb = {
thumb()
},
track = { sliderState ->
SliderDefaults.Track(
modifier = Modifier.height(audioSliderDimens.sliderTrackHeight),
colors = SliderDefaults.colors(
thumbColor = audioSliderColor.thumbColor,
activeTrackColor = audioSliderColor.activeTrackColor,
inactiveTrackColor = audioSliderColor.inactiveTrackColor
),
enabled = true,
sliderState = sliderState,
thumbTrackGapSize = audioSliderDimens.sliderThumbTrackGapSize,
trackInsideCornerSize = audioSliderDimens.sliderTrackInsideCornerSize,
drawStopIndicator = null
)
}
)

Row(
modifier = Modifier
.offset {
IntOffset(
x = 0,
y = -Dimens.spacingNormalSpecial
.toPx()
.roundToInt()
)
}
.padding(horizontal = Dimens.spacingNormal)
) {
currentPositionText()

Spacer(modifier = Modifier.weight(1f))

timeLeftText()
}
}
Loading