Загрузка данных
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 = "Отправить")
}
}
}
}
}
}
}
}
}