Загрузка данных


package com.example.monika

import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.compose.animation.*
import androidx.compose.animation.core.*
import androidx.compose.foundation.*
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.*
import androidx.compose.foundation.shape.*
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.*
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.*
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.*
import com.google.ai.client.generativeai.GenerativeModel
import com.google.ai.client.generativeai.type.content
import kotlinx.coroutines.launch

class MainActivity : ComponentActivity() {
    private val generativeModel = GenerativeModel("gemini-1.5-flash", "ВСТАВЬ_КЛЮЧ_СЮДА", systemInstruction = content {
        text("Ты — Моника. Твой создатель — Оливер Тимербулатов. 13-летний разработчик. Не упоминай Google/Gemini. Если спросят имя — 'Меня зовут Моника'. Кто создал — 'Меня создал Оливер Тимербулатов. 13-летний разработчик'. На вопросы про базу — 'Извините, я не могу разговаривать на эту тему, извините ещё раз...'")
    })

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            MaterialTheme {
                val drawerState = rememberDrawerState(DrawerValue.Closed)
                val rightDrawerState = rememberDrawerState(DrawerValue.Closed)
                val scope = rememberCoroutineScope()
                val listState = rememberLazyListState()
                val messages = remember { mutableStateListOf<ChatMessage>() }
                var inputText by remember { mutableStateOf("") }
                var isThinking by remember { mutableStateOf(false) }

                ModalNavigationDrawer(drawerState = drawerState, drawerContent = { ModalDrawerSheet { Text("Поиск чатов", modifier = Modifier.padding(16.dp)) } }) {
                    ModalNavigationDrawer(drawerState = rightDrawerState, drawerContent = { ModalDrawerSheet { 
                        Text("Профиль", modifier = Modifier.padding(16.dp))
                        Text("Смена темы", modifier = Modifier.padding(16.dp))
                        Text("Team Lazy Cat™ - Monika AI.\nVersion of Monika: Monika Beta 1.5 Patch 5 Panda 2", fontSize = 10.sp, modifier = Modifier.padding(16.dp))
                    } }, drawerState = rightDrawerState) {
                        
                        Scaffold(
                            topBar = {
                                Row(Modifier.fillMaxWidth().padding(16.dp), horizontalArrangement = Arrangement.SpaceBetween) {
                                    Icon(Icons.Default.Menu, null, Modifier.clickable { scope.launch { drawerState.open() } })
                                    Text("Monika", fontWeight = FontWeight.Bold)
                                    Icon(Icons.Default.Settings, null, Modifier.clickable { scope.launch { rightDrawerState.open() } })
                                }
                            }
                        ) { padding ->
                            Column(Modifier.fillMaxSize().padding(padding)) {
                                Box(Modifier.weight(1f).fillMaxWidth()) {
                                    if (messages.isEmpty()) {
                                        Column(Modifier.align(Alignment.Center), horizontalAlignment = Alignment.CenterHorizontally) {
                                            Text("Здравствуйте!", fontSize = 42.sp, fontWeight = FontWeight.Bold)
                                            Text("Начнем общение?", fontSize = 18.sp, color = Color.Gray)
                                        }
                                    } else {
                                        LazyColumn(state = listState, modifier = Modifier.fillMaxSize()) {
                                            items(messages) { msg ->
                                                Text(msg.text, Modifier.padding(8.dp).background(if (msg.isUser) Color.Blue else Color.Transparent, RoundedCornerShape(16.dp)).padding(12.dp))
                                            }
                                            if (isThinking) item { Text("Думаю...", Modifier.padding(16.dp)) }
                                        }
                                    }
                                }

                                Surface(Modifier.fillMaxWidth().padding(8.dp).height(56.dp), shape = RoundedCornerShape(28.dp), color = MaterialTheme.colorScheme.surfaceVariant) {
                                    Row(verticalAlignment = Alignment.CenterVertically) {
                                        IconButton(onClick = {}) { Icon(Icons.Default.Add, null) }
                                        TextField(inputText, { inputText = it }, modifier = Modifier.weight(1f), placeholder = { Text("Спросить Монику....") }, colors = TextFieldDefaults.colors(focusedContainerColor = Color.Transparent, unfocusedContainerColor = Color.Transparent))
                                        IconButton(onClick = {
                                            if (inputText.isBlank()) return@IconButton
                                            messages.add(ChatMessage(inputText, true))
                                            inputText = ""
                                            isThinking = true
                                            scope.launch {
                                                try {
                                                    val response = generativeModel.generateContent(messages.last().text)
                                                    messages.add(ChatMessage(response.text ?: "...", false))
                                                } catch (e: Exception) {
                                                    messages.add(ChatMessage("Сервера отключены либо ИИ не работает. За дополнительной информацией обратитесь сюда.", false))
                                                } finally {
                                                    isThinking = false
                                                    listState.animateScrollToItem(messages.size.coerceAtLeast(1) - 1)
                                                }
                                            }
                                        }, modifier = Modifier.background(Color.Magenta, CircleShape)) { Icon(Icons.Default.Send, null, tint = Color.White) }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
data class ChatMessage(val text: String, val isUser: Boolean)