Загрузка данных
package com.example.myapplication
import android.content.Context
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.*
import androidx.compose.foundation.shape.RoundedCornerShape
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.platform.LocalContext
import androidx.compose.ui.unit.dp
import androidx.core.content.edit
import java.text.SimpleDateFormat
import java.util.*
val Green = Color(0xFF4CAF50)
val Bg = Color(0xFFF2F2F2)
//////////////// MAIN //////////////////
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent { App() }
}
}
//////////////// STORAGE //////////////////
data class Note(val title: String, val text: String, val date: String)
object NotesStorage {
private const val PREFS = "notes_prefs"
private const val KEY = "notes"
fun save(context: Context, notes: List<Note>) {
val data = notes.joinToString("|||") {
"${it.title};;${it.text};;${it.date}"
}
context.getSharedPreferences(PREFS, Context.MODE_PRIVATE)
.edit { putString(KEY, data) }
}
fun load(context: Context): List<Note> {
val data = context.getSharedPreferences(PREFS, Context.MODE_PRIVATE)
.getString(KEY, null) ?: return emptyList()
return data.split("|||").mapNotNull {
val p = it.split(";;")
if (p.size == 3) Note(p[0], p[1], p[2]) else null
}
}
}
//////////////// APP //////////////////
@Composable
fun App() {
val ctx = LocalContext.current
var screen by remember { mutableStateOf("login") }
var isDark by remember { mutableStateOf(false) }
var lang by remember { mutableStateOf("ru") }
MaterialTheme(
colorScheme = if (isDark) darkColorScheme(
primary = Green,
background = Color(0xFF121212),
surface = Color(0xFF1E1E1E),
onBackground = Color.White,
onSurface = Color.White
) else lightColorScheme(
primary = Green,
background = Bg,
surface = Color.White,
onBackground = Color.Black,
onSurface = Color.Black
)
) {
when (screen) {
"login" -> LoginScreen(
lang,
onLogin = { screen = "notes" },
onGoRegister = { screen = "register" }
)
"register" -> RegisterScreen(
lang,
onRegister = { screen = "notes" },
onBack = { screen = "login" }
)
"notes" -> NotesScreen(
lang,
onOpenSettings = { screen = "settings" }
)
"settings" -> SettingsScreen(
lang,
isDark,
onBack = { screen = "notes" },
onThemeChange = { isDark = it },
onLangChange = { lang = it },
onLogout = { screen = "login" }
)
}
}
}
//////////////// LOGIN //////////////////
@Composable
fun LoginScreen(lang: String, onLogin: () -> Unit, onGoRegister: () -> Unit) {
var u by remember { mutableStateOf("") }
var p by remember { mutableStateOf("") }
Surface(Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background) {
Column(Modifier.padding(24.dp), verticalArrangement = Arrangement.Center) {
Text(if (lang == "ru") "Вход" else "Login")
OutlinedTextField(u, { u = it }, label = { Text("Login") })
OutlinedTextField(p, { p = it }, label = { Text("Password") })
Button(onClick = onLogin) {
Text("Login")
}
TextButton(onClick = onGoRegister) {
Text("Register")
}
}
}
}
//////////////// REGISTER //////////////////
@Composable
fun RegisterScreen(lang: String, onRegister: () -> Unit, onBack: () -> Unit) {
var u by remember { mutableStateOf("") }
var p by remember { mutableStateOf("") }
var p2 by remember { mutableStateOf("") }
Surface(Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background) {
Column(Modifier.padding(16.dp)) {
Text(if (lang == "ru") "Регистрация" else "Register")
OutlinedTextField(u, { u = it }, label = { Text("Login") })
OutlinedTextField(p, { p = it }, label = { Text("Password") })
OutlinedTextField(p2, { p2 = it }, label = { Text("Repeat") })
Button(onClick = onRegister) {
Text("Create")
}
TextButton(onClick = onBack) {
Text("Back")
}
}
}
}
//////////////// NOTES //////////////////
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun NotesScreen(lang: String, onOpenSettings: () -> Unit) {
val ctx = LocalContext.current
var notes by remember { mutableStateOf(NotesStorage.load(ctx)) }
var showAdd by remember { mutableStateOf(false) }
Scaffold(
topBar = {
TopAppBar(
title = { Text("Notes") },
actions = {
IconButton(onClick = onOpenSettings) {
Icon(Icons.Default.Settings, null)
}
}
)
},
floatingActionButton = {
FloatingActionButton(onClick = { showAdd = true }) {
Icon(Icons.Default.Add, null)
}
}
) { padding ->
LazyColumn(Modifier.padding(padding)) {
itemsIndexed(notes) { index, note ->
Card(Modifier.padding(8.dp)) {
Column(Modifier.padding(16.dp)) {
Text(note.title)
Text(note.text)
IconButton(onClick = {
notes = notes.toMutableList().also { it.removeAt(index) }
NotesStorage.save(ctx, notes)
}) {
Icon(Icons.Default.Delete, null)
}
}
}
}
}
}
if (showAdd) {
var title by remember { mutableStateOf("") }
var text by remember { mutableStateOf("") }
AlertDialog(
onDismissRequest = { showAdd = false },
confirmButton = {
Button(onClick = {
val date = SimpleDateFormat("dd.MM.yyyy", Locale.getDefault()).format(Date())
notes = notes + Note(title, text, date)
NotesStorage.save(ctx, notes)
showAdd = false
}) {
Text("Add")
}
},
dismissButton = {
TextButton(onClick = { showAdd = false }) {
Text("Cancel")
}
},
title = { Text("New note") },
text = {
Column {
OutlinedTextField(title, { title = it }, label = { Text("Title") })
OutlinedTextField(text, { text = it }, label = { Text("Text") })
}
}
)
}
}
//////////////// SETTINGS //////////////////
@Composable
fun SettingsScreen(
lang: String,
dark: Boolean,
onBack: () -> Unit,
onThemeChange: (Boolean) -> Unit,
onLangChange: (String) -> Unit,
onLogout: () -> Unit
) {
Surface(Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background) {
Column(Modifier.padding(16.dp)) {
Text("Settings")
Row {
Text("Dark mode")
Switch(dark, onThemeChange)
}
Row {
Text("RU", Modifier.clickable { onLangChange("ru") })
Spacer(Modifier.width(16.dp))
Text("EN", Modifier.clickable { onLangChange("en") })
}
Button(onClick = onLogout) {
Text("Logout")
}
}
}
}