Skip to content
2 changes: 1 addition & 1 deletion composeApp/src/androidMain/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
-->

<resources>
<string name="app_name">heron</string>
<string name="app_name">Heron</string>
<string name="http_bluesky_app_intent_filter">BlueSky</string>
<string name="https_bluesky_app_intent_filter">BlueSky</string>
<string name="at_proto_deep_link_intent_filter">BlueSky</string>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ import dev.zacsweers.metro.Inject
import kotlinx.coroutines.async
import kotlinx.coroutines.awaitAll
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.flowOf
Expand All @@ -56,6 +57,8 @@ import sh.christian.ozone.api.Did
interface AuthRepository {
val isSignedIn: Flow<Boolean>

val isGuest: Flow<Boolean>

val signedInUser: Flow<Profile?>

fun isSignedInProfile(id: ProfileId): Flow<Boolean>
Expand Down Expand Up @@ -87,6 +90,13 @@ internal class AuthTokenRepository(
savedStateDataSource.signedInAuth.map {
it != null
}
.distinctUntilChanged()

override val isGuest: Flow<Boolean> =
savedStateDataSource.savedState.map { savedState ->
savedState.auth is SavedState.AuthTokens.Guest
}
.distinctUntilChanged()

override val signedInUser: Flow<Profile?> =
savedStateDataSource.singleSessionFlow { signedInProfileId ->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ internal class OfflineUserDataRepository @Inject constructor(
override val navigation: Flow<SavedState.Navigation>
get() = savedStateDataSource.savedState
.map { it.navigation }
.distinctUntilChanged()

override suspend fun persistNavigationState(
navigation: SavedState.Navigation,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ import androidx.compose.ui.unit.dp
import com.tunjid.heron.data.core.models.Notification
import com.tunjid.heron.data.core.models.Profile
import com.tunjid.heron.timeline.ui.TimeDelta
import com.tunjid.heron.ui.UiTokens.LikeRed
import com.tunjid.heron.ui.text.CommonStrings
import com.tunjid.treenav.compose.MovableElementSharedTransitionScope
import heron.ui.core.generated.resources.notifications_liked_your_post
Expand Down Expand Up @@ -69,7 +70,7 @@ fun LikeRow(
icon = {
Icon(
painter = rememberVectorPainter(Icons.Rounded.Favorite),
tint = Color.Red,
tint = LikeRed,
contentDescription = stringResource(
when (notification) {
is Notification.Liked.Post -> CommonStrings.notifications_liked_your_post_description
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ import androidx.compose.ui.unit.dp
import com.tunjid.heron.data.core.models.Notification
import com.tunjid.heron.data.core.models.Profile
import com.tunjid.heron.timeline.ui.TimeDelta
import com.tunjid.heron.ui.UiTokens.RepostGreen
import com.tunjid.heron.ui.text.CommonStrings
import com.tunjid.treenav.compose.MovableElementSharedTransitionScope
import heron.ui.core.generated.resources.notifications_multiple_reposted_your_post
Expand Down Expand Up @@ -69,7 +70,7 @@ fun RepostRow(
icon = {
Icon(
painter = rememberVectorPainter(Icons.Rounded.Repeat),
tint = Color.Green,
tint = RepostGreen,
contentDescription = stringResource(
when (notification) {
is Notification.Reposted.Post -> CommonStrings.notifications_reposted_your_post_description
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ import androidx.compose.ui.unit.dp
import com.tunjid.heron.data.core.models.Notification
import com.tunjid.heron.data.core.models.Profile
import com.tunjid.heron.timeline.ui.TimeDelta
import com.tunjid.heron.ui.UiTokens.BookmarkBlue
import com.tunjid.heron.ui.text.CommonStrings
import com.tunjid.treenav.compose.MovableElementSharedTransitionScope
import heron.ui.core.generated.resources.notifications_multiple_post_subscription
Expand Down Expand Up @@ -66,7 +67,7 @@ fun SubscribedRow(
icon = {
Icon(
painter = rememberVectorPainter(Icons.Rounded.FiberNew),
tint = Color.Red,
tint = BookmarkBlue,
contentDescription = stringResource(CommonStrings.notifications_post_subscription_description),
)
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,15 +16,10 @@

package com.tunjid.heron.settings.ui

import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.Palette
import androidx.compose.material3.Switch
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import com.tunjid.heron.data.core.models.Preferences
import heron.feature.settings.generated.resources.Res
Expand Down Expand Up @@ -53,33 +48,17 @@ fun AppearanceItem(
title = stringResource(Res.string.appearance),
icon = Icons.Rounded.Palette,
) {
Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically,
) {
Text(
text = stringResource(Res.string.use_dynamic_theming),
)
Switch(
checked = signedInProfilePreferences.useDynamicTheming,
onCheckedChange = setDynamicThemingPreference,
enabled = isDynamicThemingSupported,
)
}
Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.SpaceBetween,
verticalAlignment = Alignment.CenterVertically,
) {
Text(
text = stringResource(Res.string.use_compact_navigation),
)
Switch(
checked = signedInProfilePreferences.useCompactNavigation,
onCheckedChange = setCompactNavigation,
enabled = isCompactNavigationSupported,
)
}
SettingsToggleItem(
text = stringResource(Res.string.use_dynamic_theming),
enabled = isDynamicThemingSupported,
checked = signedInProfilePreferences.useDynamicTheming,
onCheckedChange = setDynamicThemingPreference,
)
SettingsToggleItem(
text = stringResource(Res.string.use_compact_navigation),
enabled = isCompactNavigationSupported,
checked = signedInProfilePreferences.useCompactNavigation,
onCheckedChange = setCompactNavigation,
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.ExpandLess
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Switch
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
Expand Down Expand Up @@ -155,6 +156,30 @@ fun ExpandableSettingsItemRow(
}
}

@Composable
fun SettingsToggleItem(
text: String,
enabled: Boolean,
checked: Boolean,
onCheckedChange: (Boolean) -> Unit,
) {
Row(
modifier = Modifier.fillMaxWidth(),
verticalAlignment = Alignment.CenterVertically,
) {
Text(
text = text,
)
Spacer(Modifier.weight(1f))
Spacer(Modifier.width(16.dp))
Switch(
enabled = enabled,
checked = checked,
onCheckedChange = onCheckedChange,
)
}
}

private val EnterTransition = fadeIn() + slideInVertically { -it }
private val ExitTransition =
shrinkOut { IntSize(it.width, 0) } + slideOutVertically { -it } + fadeOut()
Original file line number Diff line number Diff line change
Expand Up @@ -496,12 +496,13 @@ private fun forceSignOutMutations(
): Flow<Mutation<MultiStackNav>> =
combine(
authRepository.isSignedIn,
authRepository.isGuest,
userDataRepository.navigation,
::Pair,
::Triple,
)
.filter { (isSignedIn, navigation) ->
.filter { (isSignedIn, isGuest, navigation) ->
// No auth token and is displaying main navigation
!isSignedIn && navigation != EmptyNavigation
!isSignedIn && !isGuest && navigation != EmptyNavigation
}
.mapLatestToMutation {
when (stacks[currentIndex].name) {
Expand Down
6 changes: 6 additions & 0 deletions ui/core/src/commonMain/kotlin/com/tunjid/heron/ui/Tokens.kt
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,12 @@ object UiTokens {

val appBarButtonSize = 40.dp

val LikeRed: Color = Color(0xFFE0245E)

val RepostGreen: Color = Color(0xFF17BF63)

val BookmarkBlue: Color = Color(0xFF1D9BF0)

const val appBarSharedElementOverlayZIndex = 12f

val statusBarHeight: Dp
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,9 @@

package com.tunjid.heron.timeline.ui.post

import androidx.compose.animation.animateColorAsState
import androidx.compose.animation.core.animateDpAsState
import androidx.compose.animation.core.tween
import androidx.compose.foundation.clickable
import androidx.compose.foundation.gestures.Orientation
import androidx.compose.foundation.interaction.MutableInteractionSource
Expand Down Expand Up @@ -78,6 +80,9 @@ import com.tunjid.heron.timeline.ui.PostAction
import com.tunjid.heron.timeline.ui.post.PostInteractionButton.Companion.icon
import com.tunjid.heron.timeline.ui.post.PostInteractionButton.Companion.stringResource
import com.tunjid.heron.timeline.utilities.format
import com.tunjid.heron.ui.UiTokens.BookmarkBlue
import com.tunjid.heron.ui.UiTokens.LikeRed
import com.tunjid.heron.ui.UiTokens.RepostGreen
import com.tunjid.heron.ui.UiTokens.withDim
import com.tunjid.heron.ui.sheets.BottomSheetScope
import com.tunjid.heron.ui.sheets.BottomSheetScope.Companion.ModalBottomSheet
Expand Down Expand Up @@ -203,20 +208,23 @@ private inline fun PostInteractionsButtons(
PostInteractionButton.Bookmark -> ""
PostInteractionButton.MoreOptions -> ""
},
tint = when (button) {
PostInteractionButton.Comment -> MaterialTheme.colorScheme.outline
PostInteractionButton.Like ->
if (post.viewerStats?.likeUri != null) LikeRed
else MaterialTheme.colorScheme.outline

PostInteractionButton.Repost ->
if (post.viewerStats?.repostUri != null) RepostGreen
else MaterialTheme.colorScheme.outline
PostInteractionButton.Bookmark ->
if (post.viewerStats.isBookmarked) BookmarkBlue
else MaterialTheme.colorScheme.outline
PostInteractionButton.MoreOptions -> MaterialTheme.colorScheme.outline
},
tint = animateColorAsState(
targetValue = when (button) {
PostInteractionButton.Comment -> MaterialTheme.colorScheme.outline
PostInteractionButton.Like ->
if (post.viewerStats?.likeUri != null) LikeRed
else MaterialTheme.colorScheme.outline

PostInteractionButton.Repost ->
if (post.viewerStats?.repostUri != null) RepostGreen
else MaterialTheme.colorScheme.outline
PostInteractionButton.Bookmark ->
if (post.viewerStats.isBookmarked) BookmarkBlue
else MaterialTheme.colorScheme.outline
PostInteractionButton.MoreOptions -> MaterialTheme.colorScheme.outline
},
animationSpec = ColorTween,
).value,
enabled = when (button) {
PostInteractionButton.Bookmark -> true
PostInteractionButton.Comment -> post.viewerStats.canReply
Expand Down Expand Up @@ -533,9 +541,7 @@ private fun PostInteractionsBottomSheet(
}
}

private val LikeRed = Color(0xFFE0245E)
private val RepostGreen = Color(0xFF17BF63)
private val BookmarkBlue = Color(0xFF1D9BF0)
private val ColorTween = tween<Color>(durationMillis = 100)

private val Timeline.Presentation.postInteractionArrangement: Arrangement.Horizontal
get() = when (this) {
Expand Down
Loading