package ru.omni_devel.cards import android.content.Intent import android.os.Bundle import android.widget.Toast import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge 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.PaddingValues import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.verticalScroll import androidx.compose.material3.Button import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateListOf import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalUriHandler import kotlinx.serialization.json.Json import ru.omni_devel.cards.ui.theme.OmniCardsTheme class MainActivity : ComponentActivity() { private lateinit var db: DbHelper private val cards = mutableStateListOf() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enableEdgeToEdge() db = DbHelper(this, null) setContent { OmniCardsTheme { Scaffold( modifier = Modifier.fillMaxSize() ) { innerPadding -> MainPage(innerPadding, cards, onDeleteCard = { cardId -> db.removeCard(cardId) cards.removeIf { it.id == cardId } }, getDbFun = { return@MainPage db }) } } } } override fun onResume() { super.onResume() cards.clear() cards.addAll(db.getCards()) } } @Composable fun MainPage( innerPadding: PaddingValues, cards: List, onDeleteCard: (Int) -> Unit, getDbFun: () -> DbHelper ) { val context = LocalContext.current val uriHandler = LocalUriHandler.current var isActionBarShowed by remember { mutableStateOf(false) } Box( modifier = Modifier.fillMaxSize() ) { Page( "OmniCards", innerPadding ) { Column( modifier = Modifier.verticalScroll(rememberScrollState()).padding(bottom = 64.dp).background(Color.Transparent).padding(top = 16.dp), verticalArrangement = Arrangement.spacedBy(8.dp) ) { if (cards.isEmpty()) { Text("Add new card to get started") } else { for (card in cards) { CardButton(card, onDeleteCard) } } } } if (isActionBarShowed) { Column( modifier = Modifier .align(Alignment.BottomEnd) .padding(innerPadding) .padding(16.dp) .background( MaterialTheme.colorScheme.inversePrimary, RoundedCornerShape(24.dp) ) .padding(16.dp) .fillMaxWidth() ) { FullWidthButton( onClick = { isActionBarShowed = false val intent = Intent(context, EditCardActivity::class.java) context.startActivity(intent) } ) { Text("Add card") } FullWidthButton( onClick = { Toast.makeText(context, "Sync in progress...", Toast.LENGTH_SHORT).show() sendToWatch(context, "/updateCards", Json.encodeToString(getDbFun().getCards())) { isSuccess -> if (isSuccess) { Toast.makeText(context, "Successfully synced!", Toast.LENGTH_SHORT).show() } else { Toast.makeText(context, "Sync failed! Please, check your connection", Toast.LENGTH_LONG).show() } } isActionBarShowed = false } ) { Text("Sync with WearOS") } FullWidthButton( onClick = { uriHandler.openUri("https://omni-devel.ru") } ) { Text("About author") } FullWidthButton( onClick = { isActionBarShowed = false } ) { Text(">") } } } else { Button( modifier = Modifier .align(Alignment.BottomEnd) .padding(innerPadding).padding(32.dp), onClick = { isActionBarShowed = true } ) { Text("<") } } } }