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


package com.example.monika

import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Add
import androidx.compose.material.icons.filled.Menu
import androidx.compose.material.icons.filled.Send
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.input.KeyboardCapitalization
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.google.ai.client.generativeai.GenerativeModel
import kotlinx.coroutines.launch

data class ChatMessage(val text: String, val isUser: Boolean)

class MainActivity : ComponentActivity() {

    // Вставь свой ключ в кавычки ниже
    private val modelName = "gemini-pro"
    private val apiKey = "AIzaSy..." 

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        
        val generativeModel = GenerativeModel(modelName, apiKey)

        setContent {
            MaterialTheme {
                val drawerState = rememberDrawerState(initialValue = DrawerValue.Closed)
                val scope = rememberCoroutineScope()
                var mainInputText by remember { mutableStateOf("") }
                val messages = remember { mutableStateListOf<ChatMessage>() }
                var isChatStarted by remember { mutableStateOf(false) }

                ModalNavigationDrawer(
                    drawerState = drawerState,
                    drawerContent = {
                        ModalDrawerSheet {
                            Column(modifier = Modifier.padding(16.dp)) {
                                Text("Меню", fontSize = 20.sp, fontWeight = FontWeight.Bold)
                            }
                        }
                    }
                ) {
                    Scaffold(
                        topBar = {
                            Box(modifier = Modifier.fillMaxWidth().padding(16.dp)) {
                                IconButton(onClick = { scope.launch { drawerState.open() } }) {
                                    Icon(Icons.Default.Menu, contentDescription = "Меню")
                                }
                                Text("Monika", fontSize = 20.sp, fontWeight = FontWeight.Bold, modifier = Modifier.align(Alignment.Center))
                            }
                        }
                    ) { paddingValues ->
                        Column(modifier = Modifier.fillMaxSize().padding(paddingValues).padding(16.dp)) {
                            
                            if (!isChatStarted) {
                                Text("Здравствуйте!", fontSize = 42.sp, fontWeight = FontWeight.Bold, color = Color.Black)
                                Text("Начнем общение?", fontSize = 18.sp, fontWeight = FontWeight.W600, color = Color.Gray)
                            }

                            LazyColumn(modifier = Modifier.weight(1f).fillMaxWidth()) {
                                items(messages) { msg ->
                                    Box(modifier = Modifier.fillMaxWidth().padding(4.dp), contentAlignment = if (msg.isUser) Alignment.CenterEnd else Alignment.CenterStart) {
                                        Text(
                                            text = msg.text,
                                            modifier = Modifier.background(if (msg.isUser) Color.LightGray else Color(0xFFE0E0E0), RoundedCornerShape(12.dp)).padding(12.dp)
                                        )
                                    }
                                }
                            }

                            Row(modifier = Modifier.fillMaxWidth().padding(top = 8.dp), verticalAlignment = Alignment.CenterVertically) {
                                IconButton(onClick = { /* Логика фото */ }) {
                                    Icon(Icons.Default.Add, contentDescription = "Прикрепить")
                                }
                                OutlinedTextField(
                                    value = mainInputText,
                                    onValueChange = { mainInputText = it },
                                    modifier = Modifier.weight(1f),
                                    placeholder = { Text("Спросить Монику....") },
                                    shape = RoundedCornerShape(25.dp),
                                    keyboardOptions = KeyboardOptions(capitalization = KeyboardCapitalization.Sentences, autoCorrect = true),
                                    singleLine = true
                                )
                                Spacer(modifier = Modifier.width(8.dp))
                                IconButton(onClick = {
                                    if (mainInputText.isNotBlank()) {
                                        isChatStarted = true
                                        val userText = mainInputText
                                        messages.add(ChatMessage(userText, true))
                                        mainInputText = ""
                                        
                                        scope.launch {
                                            try {
                                                val response = generativeModel.generateContent(userText)
                                                messages.add(ChatMessage(response.text ?: "...", false))
                                            } catch (e: Exception) {
                                                messages.add(ChatMessage("Ошибка соединения", false))
                                            }
                                        }
                                    }
                                }) {
                                    Icon(Icons.Default.Send, contentDescription = "Отправить")
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}