Reinstate landing chat animation

This commit is contained in:
Andrew 2024-06-04 23:17:00 +09:30
parent d331df6334
commit d0ebd3533b

View File

@ -3,18 +3,33 @@ package org.thoughtcrime.securesms.onboarding
import android.content.Intent import android.content.Intent
import android.net.Uri import android.net.Uri
import android.os.Bundle import android.os.Bundle
import androidx.annotation.StringRes
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.core.tween
import androidx.compose.animation.fadeIn
import androidx.compose.animation.slideInVertically
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.ColumnScope
import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.width
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.MaterialTheme import androidx.compose.material.MaterialTheme
import androidx.compose.material.Text import androidx.compose.material.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
@ -25,6 +40,7 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import kotlinx.coroutines.delay
import network.loki.messenger.R import network.loki.messenger.R
import org.session.libsession.utilities.TextSecurePreferences import org.session.libsession.utilities.TextSecurePreferences
import org.thoughtcrime.securesms.BaseActionBarActivity import org.thoughtcrime.securesms.BaseActionBarActivity
@ -40,9 +56,21 @@ import org.thoughtcrime.securesms.ui.OutlineButton
import org.thoughtcrime.securesms.ui.PreviewTheme import org.thoughtcrime.securesms.ui.PreviewTheme
import org.thoughtcrime.securesms.ui.ThemeResPreviewParameterProvider import org.thoughtcrime.securesms.ui.ThemeResPreviewParameterProvider
import org.thoughtcrime.securesms.ui.classicDarkColors import org.thoughtcrime.securesms.ui.classicDarkColors
import org.thoughtcrime.securesms.ui.contentDescription
import org.thoughtcrime.securesms.ui.session_accent import org.thoughtcrime.securesms.ui.session_accent
import org.thoughtcrime.securesms.util.setUpActionBarSessionLogo import org.thoughtcrime.securesms.util.setUpActionBarSessionLogo
import kotlin.time.Duration.Companion.milliseconds
private data class TextData(
@StringRes val stringId: Int,
val isOutgoing: Boolean = false
)
private val MESSAGES = listOf(
TextData(R.string.onboardingBubbleWelcomeToSession),
TextData(R.string.onboardingBubbleSessionIsEngineered, isOutgoing = true),
TextData(R.string.onboardingBubbleNoPhoneNumber),
TextData(R.string.onboardingBubbleCreatingAnAccountIsEasy, isOutgoing = true)
)
class LandingActivity : BaseActionBarActivity() { class LandingActivity : BaseActionBarActivity() {
@ -75,19 +103,51 @@ class LandingActivity : BaseActionBarActivity() {
} }
} }
@OptIn(ExperimentalFoundationApi::class)
@Composable @Composable
private fun LandingScreen() { private fun LandingScreen() {
var count by remember { mutableStateOf(0) }
val listState = rememberLazyListState()
LaunchedEffect(Unit) {
delay(500.milliseconds)
while(count < MESSAGES.size) {
count += 1
listState.animateScrollToItem(0.coerceAtLeast((count - 1)))
delay(1500L)
}
}
Column(modifier = Modifier.padding(horizontal = 36.dp)) { Column(modifier = Modifier.padding(horizontal = 36.dp)) {
Spacer(modifier = Modifier.weight(1f)) Spacer(modifier = Modifier.weight(1f))
Text(stringResource(R.string.onboardingBubblePrivacyInYourPocket), modifier = Modifier.align(Alignment.CenterHorizontally), style = MaterialTheme.typography.h4, textAlign = TextAlign.Center) Text(
stringResource(R.string.onboardingBubblePrivacyInYourPocket),
modifier = Modifier.align(Alignment.CenterHorizontally),
style = MaterialTheme.typography.h4,
textAlign = TextAlign.Center
)
Spacer(modifier = Modifier.height(24.dp)) Spacer(modifier = Modifier.height(24.dp))
IncomingText(stringResource(R.string.onboardingBubbleWelcomeToSession))
Spacer(modifier = Modifier.height(14.dp)) LazyColumn(
OutgoingText(stringResource(R.string.onboardingBubbleSessionIsEngineered)) state = listState,
Spacer(modifier = Modifier.height(14.dp)) modifier = Modifier
IncomingText(stringResource(R.string.onboardingBubbleNoPhoneNumber)) .fillMaxWidth()
Spacer(modifier = Modifier.height(14.dp)) .weight(1f),
OutgoingText(stringResource(R.string.onboardingBubbleCreatingAnAccountIsEasy)) verticalArrangement = Arrangement.spacedBy(16.dp)
) {
items(
MESSAGES.take(count),
key = { it.stringId }
) { item ->
MessageText(
stringResource(item.stringId),
item.isOutgoing,
modifier = Modifier.animateItemPlacement()
)
}
}
Spacer(modifier = Modifier.weight(1f)) Spacer(modifier = Modifier.weight(1f))
OutlineButton( OutlineButton(
@ -139,21 +199,29 @@ class LandingActivity : BaseActionBarActivity() {
} }
@Composable @Composable
private fun IncomingText(text: String) { private fun MessageText(text: String, isOutgoing: Boolean, modifier: Modifier) {
if (isOutgoing) OutgoingText(text, modifier) else IncomingText(text, modifier)
}
@Composable
private fun IncomingText(text: String, modifier: Modifier) {
ChatText( ChatText(
text, text,
color = classicDarkColors[2] color = classicDarkColors[2],
modifier = modifier
) )
} }
@Composable @Composable
private fun ColumnScope.OutgoingText(text: String) { private fun OutgoingText(text: String, modifier: Modifier) {
ChatText( Box(modifier = modifier then Modifier.fillMaxWidth()) {
text, ChatText(
color = session_accent, text,
textColor = MaterialTheme.colors.primary, color = session_accent,
modifier = Modifier.align(Alignment.End) textColor = MaterialTheme.colors.primary,
) modifier = Modifier.align(Alignment.TopEnd)
)
}
} }
@Composable @Composable