Загрузка данных
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.shape.RoundedCornerShape
import androidx.compose.material.icons.Icons
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.unit.dp
import androidx.compose.ui.unit.sp
import com.google.ai.client.generativeai.GenerativeModel
import kotlinx.coroutines.launch
class MainActivity : ComponentActivity() {
private val modelName = "gemini-1.5-flash"
private val apiKey = "ТВОЙ_КЛЮЧ_СЮДА" // Вставь свой ключ
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("") }
var statusText by remember { mutableStateOf("") }
ModalNavigationDrawer(
drawerState = drawerState,
drawerContent = {
ModalDrawerSheet {
Column(modifier = Modifier.padding(16.dp)) {
Text("Меню", fontSize = 20.sp, fontWeight = FontWeight.Bold)
Spacer(modifier = Modifier.height(16.dp))
NavigationDrawerItem(
label = { Text("Создать новый чат") },
selected = false,
onClick = { scope.launch { drawerState.close() } }
)
}
}
}
) {
Scaffold(
topBar = {
Box(modifier = Modifier.fillMaxWidth().padding(16.dp)) {
IconButton(onClick = { scope.launch { drawerState.open() } }, modifier = Modifier.align(Alignment.CenterStart)) {
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)) {
Text("Здравствуйте!", fontSize = 42.sp, fontWeight = FontWeight.Bold, color = Color.Black)
Text("Начнем общение?", fontSize = 18.sp, color = Color.Gray)
Text(text = statusText, color = Color.Gray, fontSize = 14.sp)
Spacer(modifier = Modifier.weight(1f))
Row(modifier = Modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically) {
// Кастомное поле ввода
Box(
modifier = Modifier
.weight(1f)
.background(Color(0xFFF0F0F0), RoundedCornerShape(25.dp))
.padding(horizontal = 16.dp, vertical = 8.dp)
) {
if (mainInputText.isEmpty()) {
Text("Спросить Монику....", color = Color.Gray, modifier = Modifier.padding(8.dp))
}
TextField(
value = mainInputText,
onValueChange = { mainInputText = it },
colors = TextFieldDefaults.colors(
focusedContainerColor = Color.Transparent,
unfocusedContainerColor = Color.Transparent,
focusedIndicatorColor = Color.Transparent,
unfocusedIndicatorColor = Color.Transparent
),
modifier = Modifier.fillMaxWidth()
)
}
Spacer(modifier = Modifier.width(8.dp))
IconButton(onClick = {
if (mainInputText.isNotBlank()) {
scope.launch {
statusText = "пишу ответ...."
try {
val response = generativeModel.generateContent(mainInputText)
statusText = "Ответ: ${response.text}"
} catch (e: Exception) {
statusText = "Ошибка: ${e.message}"
}
}
}
}) {
Icon(Icons.Default.Send, contentDescription = "Отправить")
}
}
}
}
}
}
}
}
}