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


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")
            }
        }
    }
}