Enhance OnboardingScreen with smoother pager swipes and add pulse animation to Rosetta logo
- Implemented custom fling behavior for HorizontalPager to improve swipe experience. - Added pulse animation effect to the Rosetta logo on the onboarding screen for better visual appeal. - Updated the layout and animation specifications to enhance user interaction and aesthetics.
This commit is contained in:
@@ -23,12 +23,16 @@ import androidx.compose.ui.unit.sp
|
||||
import com.rosetta.messenger.data.AccountManager
|
||||
import com.rosetta.messenger.data.DecryptedAccount
|
||||
import com.rosetta.messenger.data.PreferencesManager
|
||||
import com.rosetta.messenger.ui.auth.AccountInfo
|
||||
import com.rosetta.messenger.ui.auth.AuthFlow
|
||||
import com.rosetta.messenger.ui.chats.Chat
|
||||
import com.rosetta.messenger.ui.chats.ChatsListScreen
|
||||
import com.rosetta.messenger.ui.onboarding.OnboardingScreen
|
||||
import com.rosetta.messenger.ui.splash.SplashScreen
|
||||
import com.rosetta.messenger.ui.theme.RosettaAndroidTheme
|
||||
import kotlinx.coroutines.flow.first
|
||||
import kotlinx.coroutines.launch
|
||||
import java.util.*
|
||||
|
||||
class MainActivity : ComponentActivity() {
|
||||
private lateinit var preferencesManager: PreferencesManager
|
||||
@@ -49,11 +53,31 @@ class MainActivity : ComponentActivity() {
|
||||
var showOnboarding by remember { mutableStateOf(true) }
|
||||
var hasExistingAccount by remember { mutableStateOf<Boolean?>(null) }
|
||||
var currentAccount by remember { mutableStateOf<DecryptedAccount?>(null) }
|
||||
var accountInfoList by remember { mutableStateOf<List<AccountInfo>>(emptyList()) }
|
||||
|
||||
// Check for existing accounts
|
||||
// Check for existing accounts and build AccountInfo list
|
||||
LaunchedEffect(Unit) {
|
||||
val accounts = accountManager.getAllAccounts()
|
||||
hasExistingAccount = accounts.isNotEmpty()
|
||||
accountInfoList = accounts.map { account ->
|
||||
val shortKey = account.publicKey.take(7)
|
||||
val displayName = account.name ?: shortKey
|
||||
val initials = displayName.trim().split(Regex("\\s+"))
|
||||
.filter { it.isNotEmpty() }
|
||||
.let { words ->
|
||||
when {
|
||||
words.isEmpty() -> "??"
|
||||
words.size == 1 -> words[0].take(2).uppercase()
|
||||
else -> "${words[0].first()}${words[1].first()}".uppercase()
|
||||
}
|
||||
}
|
||||
AccountInfo(
|
||||
id = account.publicKey,
|
||||
name = displayName,
|
||||
initials = initials,
|
||||
publicKey = account.publicKey
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
// Wait for initial load
|
||||
@@ -112,15 +136,46 @@ class MainActivity : ComponentActivity() {
|
||||
AuthFlow(
|
||||
isDarkTheme = isDarkTheme,
|
||||
hasExistingAccount = screen == "auth_unlock",
|
||||
accounts = accountInfoList,
|
||||
onAuthComplete = { account ->
|
||||
currentAccount = account
|
||||
hasExistingAccount = true
|
||||
// Reload accounts list
|
||||
scope.launch {
|
||||
val accounts = accountManager.getAllAccounts()
|
||||
accountInfoList = accounts.map { acc ->
|
||||
val shortKey = acc.publicKey.take(7)
|
||||
val displayName = acc.name ?: shortKey
|
||||
val initials = displayName.trim().split(Regex("\\s+"))
|
||||
.filter { it.isNotEmpty() }
|
||||
.let { words ->
|
||||
when {
|
||||
words.isEmpty() -> "??"
|
||||
words.size == 1 -> words[0].take(2).uppercase()
|
||||
else -> "${words[0].first()}${words[1].first()}".uppercase()
|
||||
}
|
||||
}
|
||||
AccountInfo(
|
||||
id = acc.publicKey,
|
||||
name = displayName,
|
||||
initials = initials,
|
||||
publicKey = acc.publicKey
|
||||
)
|
||||
}
|
||||
}
|
||||
},
|
||||
onLogout = {
|
||||
scope.launch {
|
||||
accountManager.logout()
|
||||
currentAccount = null
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
"main" -> {
|
||||
MainScreen(
|
||||
account = currentAccount,
|
||||
isDarkTheme = isDarkTheme,
|
||||
onLogout = {
|
||||
scope.launch {
|
||||
accountManager.logout()
|
||||
@@ -140,17 +195,54 @@ class MainActivity : ComponentActivity() {
|
||||
@Composable
|
||||
fun MainScreen(
|
||||
account: DecryptedAccount? = null,
|
||||
isDarkTheme: Boolean = true,
|
||||
onLogout: () -> Unit = {}
|
||||
) {
|
||||
Box(
|
||||
modifier = Modifier.fillMaxSize(),
|
||||
contentAlignment = Alignment.Center
|
||||
) {
|
||||
Text(
|
||||
text = "Welcome to Rosetta! 🚀\n\nYou're logged in!",
|
||||
fontSize = 24.sp,
|
||||
fontWeight = FontWeight.Bold,
|
||||
color = MaterialTheme.colorScheme.onBackground
|
||||
// Demo chats for now
|
||||
val demoChats = remember {
|
||||
listOf(
|
||||
Chat(
|
||||
id = "1",
|
||||
name = "Alice Johnson",
|
||||
lastMessage = "Hey! How are you doing?",
|
||||
lastMessageTime = Date(),
|
||||
unreadCount = 2,
|
||||
isOnline = true,
|
||||
publicKey = "alice_key_123"
|
||||
),
|
||||
Chat(
|
||||
id = "2",
|
||||
name = "Bob Smith",
|
||||
lastMessage = "See you tomorrow!",
|
||||
lastMessageTime = Date(System.currentTimeMillis() - 3600000),
|
||||
unreadCount = 0,
|
||||
isOnline = false,
|
||||
publicKey = "bob_key_456"
|
||||
),
|
||||
Chat(
|
||||
id = "3",
|
||||
name = "Team Rosetta",
|
||||
lastMessage = "Great work everyone! 🎉",
|
||||
lastMessageTime = Date(System.currentTimeMillis() - 86400000),
|
||||
unreadCount = 5,
|
||||
isOnline = true,
|
||||
publicKey = "team_key_789"
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
ChatsListScreen(
|
||||
isDarkTheme = isDarkTheme,
|
||||
chats = demoChats,
|
||||
onChatClick = { chat ->
|
||||
// TODO: Navigate to chat detail
|
||||
},
|
||||
onNewChat = {
|
||||
// TODO: Show new chat screen
|
||||
},
|
||||
onProfileClick = onLogout, // For now, logout on profile click
|
||||
onSavedMessagesClick = {
|
||||
// TODO: Navigate to saved messages
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user