diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index ecbcabf..7326790 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -13,7 +13,7 @@ android:theme="@style/Theme.NotesDemoApp" tools:targetApi="31"> diff --git a/app/src/main/java/com/sjaindl/notesdemoapp/MainActivity.kt b/app/src/main/java/com/sjaindl/notesdemoapp/MainActivity.kt deleted file mode 100644 index f91cf92..0000000 --- a/app/src/main/java/com/sjaindl/notesdemoapp/MainActivity.kt +++ /dev/null @@ -1,26 +0,0 @@ -package com.sjaindl.notesdemoapp - -import android.os.Bundle -import androidx.activity.ComponentActivity -import androidx.activity.compose.setContent -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Surface -import androidx.compose.ui.Modifier -import com.sjaindl.notesdemoapp.ui.theme.NotesDemoAppTheme - -class MainActivity : ComponentActivity() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContent { - NotesDemoAppTheme { - Surface( - modifier = Modifier.fillMaxSize(), - color = MaterialTheme.colorScheme.background - ) { - NotesScreen() - } - } - } - } -} diff --git a/app/src/main/java/com/sjaindl/notesdemoapp/NotesViewModel.kt b/app/src/main/java/com/sjaindl/notesdemoapp/NotesViewModel.kt deleted file mode 100644 index 1ced06a..0000000 --- a/app/src/main/java/com/sjaindl/notesdemoapp/NotesViewModel.kt +++ /dev/null @@ -1,65 +0,0 @@ -package com.sjaindl.notesdemoapp - -import android.content.Context -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider -import androidx.lifecycle.viewModelScope -import com.sjaindl.notesdemoapp.model.Note -import com.sjaindl.notesdemoapp.model.ShareType -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.asStateFlow -import kotlinx.coroutines.launch - -class NotesViewModel( - private val shareableNotesManager: ShareableNotesManager, - private val unshareableNotesManager: UnshareableNotesManager, -): ViewModel() { - private val _notes = MutableStateFlow>(emptyList()) - val notes = _notes.asStateFlow() - - fun loadNotes() = viewModelScope.launch { - _notes.value = shareableNotesManager.load() + unshareableNotesManager.load() - } - - fun addNote(note: Note) { - viewModelScope.launch { - if (note.shareType == ShareType.Shareable) { - shareableNotesManager.save(note = note) - } else { - unshareableNotesManager.save(note = note) - } - } - _notes.value += note - } - - fun deleteNote(note: Note) { - viewModelScope.launch { - if (note.shareType == ShareType.Shareable) { - shareableNotesManager.delete(note = note) - } else { - unshareableNotesManager.delete(note = note) - } - } - _notes.value -= note - } - - fun share(note: Note) { - shareableNotesManager.share(note = note) - } - - class NotesViewModelFactory( - private val context: Context, - ) : - ViewModelProvider.NewInstanceFactory() { - override fun create(modelClass: Class): T { - return NotesViewModel( - shareableNotesManager = ShareableNotesManager( - context = context, - ), - unshareableNotesManager = UnshareableNotesManager( - context = context, - ), - ) as T - } - } -} diff --git a/app/src/main/java/com/sjaindl/notesdemoapp/ShareableNotesManager.kt b/app/src/main/java/com/sjaindl/notesdemoapp/ShareableNotesManager.kt deleted file mode 100644 index e6d81b7..0000000 --- a/app/src/main/java/com/sjaindl/notesdemoapp/ShareableNotesManager.kt +++ /dev/null @@ -1,127 +0,0 @@ -package com.sjaindl.notesdemoapp - -import android.content.Context -import android.content.Intent -import androidx.core.content.ContextCompat -import androidx.room.Room -import com.sjaindl.notesdemoapp.db.AppDatabase -import com.sjaindl.notesdemoapp.db.NoteEntity -import com.sjaindl.notesdemoapp.model.Note -import com.sjaindl.notesdemoapp.model.ShareType -import kotlinx.serialization.encodeToString -import kotlinx.serialization.json.Json -import java.io.File - -class ShareableNotesManager( - private val context: Context, -): NoteAction { - - private val database by lazy { - Room.databaseBuilder( - context = context, - klass = AppDatabase::class.java, - name = "database-notes", - ).build() - } - - override fun share(note: Note) { - val sendIntent: Intent = Intent().apply { - action = Intent.ACTION_SEND - putExtra(Intent.EXTRA_TEXT, "${note.title}\n${note.text}") - type = "text/plain" - } - - val shareIntent = Intent.createChooser(sendIntent, null) - ContextCompat.startActivity(context, shareIntent, null) - } - - override suspend fun load(): List { - val notes = readFromFiles() + readFromDatabase() - return notes.filter { - it.shareType == ShareType.Shareable - } - } - - override suspend fun save(note: Note) { - if (note is Note.DatabaseNote) { - saveToDatabase(note = note) - } else { - saveToFile(note = note) - } - } - - override suspend fun delete(note: Note) { - if (note is Note.DatabaseNote) { - deleteFromDatabase(note = note) - } else { - deleteFromFile(noteId = note.id) - } - } - - private fun saveToFile(note: Note) { - val fileNote = note as? Note.FileNote ?: return - - val dir = context.getDir("notes", Context.MODE_PRIVATE) - val filename = "${note.id}.json" - val fileContent = Json.encodeToString(fileNote) - val file = File(dir, filename) - - file.outputStream().use { - it.write(fileContent.toByteArray()) - } - } - - private suspend fun saveToDatabase(note: Note) { - val entity = NoteEntity( - note.id, - note.shareType, - note.title, - note.text, - ) - - database.notesDao().insertAll(entity) - } - - private fun deleteFromFile(noteId: String) { - val dir = context.getDir("notes", Context.MODE_PRIVATE) - val filename = "${noteId}.json" - val file = File(dir, filename) - file.delete() - } - - private suspend fun deleteFromDatabase(note: Note) { - val entity = NoteEntity( - id = note.id, - type = note.shareType, - title = note.title, - text = note.text, - ) - - database.notesDao().delete(entity) - } - - private fun readFromFiles(): List { - val files = context.getDir("notes", Context.MODE_PRIVATE).listFiles() - - return files?.map { file -> - val json = file.bufferedReader().useLines { lines -> - lines.fold("") { some, text -> - "$some\n$text" - } - } - - Json.decodeFromString(json) - } ?: emptyList() - } - - private suspend fun readFromDatabase(): List { - return database.notesDao().getAll().map { - Note.DatabaseNote( - id = it.id, - shareType = it.type, - title = it.title, - text = it.text, - ) - } - } -} diff --git a/app/src/main/java/com/sjaindl/notesdemoapp/UnshareableNotesManager.kt b/app/src/main/java/com/sjaindl/notesdemoapp/UnshareableNotesManager.kt deleted file mode 100644 index 06a2a28..0000000 --- a/app/src/main/java/com/sjaindl/notesdemoapp/UnshareableNotesManager.kt +++ /dev/null @@ -1,118 +0,0 @@ -package com.sjaindl.notesdemoapp - -import android.content.Context -import androidx.room.Room -import com.sjaindl.notesdemoapp.db.AppDatabase -import com.sjaindl.notesdemoapp.db.NoteEntity -import com.sjaindl.notesdemoapp.model.Note -import com.sjaindl.notesdemoapp.model.ShareType -import kotlinx.serialization.encodeToString -import kotlinx.serialization.json.Json -import java.io.File - -class UnshareableNotesManager( - private val context: Context, -): NoteAction { - - private val database by lazy { - Room.databaseBuilder( - context = context, - klass = AppDatabase::class.java, - name = "database-notes", - ).build() - } - - override fun share(note: Note) { - // Not supported - } - - override suspend fun load(): List { - val notes = readFromFiles() + readFromDatabase() - return notes.filter { - it.shareType == ShareType.Unshareable - } - } - - override suspend fun save(note: Note) { - if (note is Note.DatabaseNote) { - saveToDatabase(note = note) - } else { - saveToFile(note = note) - } - } - - override suspend fun delete(note: Note) { - if (note is Note.DatabaseNote) { - deleteFromDatabase(note = note) - } else { - deleteFromFile(noteId = note.id) - } - } - - private fun saveToFile(note: Note) { - val fileNote = note as? Note.FileNote ?: return - - val dir = context.getDir("notes", Context.MODE_PRIVATE) - val filename = "${note.id}.json" - val fileContent = Json.encodeToString(fileNote) - val file = File(dir, filename) - - file.outputStream().use { - it.write(fileContent.toByteArray()) - } - } - - private suspend fun saveToDatabase(note: Note) { - val entity = NoteEntity( - note.id, - note.shareType, - note.title, - note.text, - ) - - database.notesDao().insertAll(entity) - } - - private fun deleteFromFile(noteId: String) { - val dir = context.getDir("notes", Context.MODE_PRIVATE) - val filename = "${noteId}.json" - val file = File(dir, filename) - file.delete() - } - - private suspend fun deleteFromDatabase(note: Note) { - val entity = NoteEntity( - id = note.id, - type = note.shareType, - title = note.title, - text = note.text, - ) - - database.notesDao().delete(entity) - } - - private fun readFromFiles(): List { - val files = context.getDir("notes", Context.MODE_PRIVATE).listFiles() - - return files?.map { file -> - val json = file.bufferedReader().useLines { lines -> - lines.fold("") { some, text -> - "$some\n$text" - } - } - - Json.decodeFromString(json) - } ?: emptyList() - } - - private suspend fun readFromDatabase(): List { - return database.notesDao().getAll().map { - Note.DatabaseNote( - id = it.id, - shareType = it.type, - title = it.title, - text = it.text, - ) - } - } -} diff --git a/app/src/main/java/com/sjaindl/notesdemoapp/controller/MainActivity.kt b/app/src/main/java/com/sjaindl/notesdemoapp/controller/MainActivity.kt new file mode 100644 index 0000000..9b310e8 --- /dev/null +++ b/app/src/main/java/com/sjaindl/notesdemoapp/controller/MainActivity.kt @@ -0,0 +1,112 @@ +package com.sjaindl.notesdemoapp.controller + +import android.os.Bundle +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.ui.Modifier +import androidx.lifecycle.lifecycleScope +import androidx.room.Room +import com.sjaindl.notesdemoapp.model.db.AppDatabase +import com.sjaindl.notesdemoapp.model.Note +import com.sjaindl.notesdemoapp.model.persistence.NotesDatabasePersistence +import com.sjaindl.notesdemoapp.model.persistence.NotesFilePersistence +import com.sjaindl.notesdemoapp.model.sharing.NotesManager +import com.sjaindl.notesdemoapp.view.theme.NotesDemoAppTheme +import com.sjaindl.notesdemoapp.view.NotesScreen +import kotlinx.coroutines.launch + +class MainActivity : ComponentActivity() { + private val database by lazy { + Room.databaseBuilder( + context = this, + klass = AppDatabase::class.java, + name = "database-notes", + ).build() + } + + private val notesManager by lazy { + NotesManager( + context = this, + ) + } + + private val filePersistence by lazy { + NotesFilePersistence( + context = this, + ) + } + + private val databasePersistence by lazy { + NotesDatabasePersistence( + database = database, + ) + } + + private var notes: MutableList = mutableListOf() + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + setContent() + } + + private fun setContent() { + setContent { + NotesDemoAppTheme { + Surface( + modifier = Modifier.fillMaxSize(), + color = MaterialTheme.colorScheme.background + ) { + NotesScreen( + notes = notes, + onLoadNotes = ::loadNotes, + onAddNote = ::addNote, + onDeleteNote = ::deleteNote, + onShareNote = ::share, + ) + } + } + } + } + + private fun loadNotes() = lifecycleScope.launch { + notes.apply { + clear() + addAll(filePersistence.load()) + addAll(databasePersistence.load()) + } + + setContent() + } + + private fun addNote(note: Note) { + lifecycleScope.launch { + when(note) { + is Note.FileNote -> filePersistence.save(note = note) + is Note.DatabaseNote -> databasePersistence.save(note = note) + } + } + notes += note + + setContent() + } + + private fun deleteNote(note: Note) { + lifecycleScope.launch { + when(note) { + is Note.FileNote -> filePersistence.delete(note = note) + is Note.DatabaseNote -> databasePersistence.delete(note = note) + } + } + notes -= note + + setContent() + } + + private fun share(note: Note) { + notesManager.share(note = note) + } +} diff --git a/app/src/main/java/com/sjaindl/notesdemoapp/model/Note.kt b/app/src/main/java/com/sjaindl/notesdemoapp/model/Note.kt index 255c8ad..6ab9fef 100644 --- a/app/src/main/java/com/sjaindl/notesdemoapp/model/Note.kt +++ b/app/src/main/java/com/sjaindl/notesdemoapp/model/Note.kt @@ -1,6 +1,8 @@ package com.sjaindl.notesdemoapp.model import kotlinx.serialization.Serializable +import kotlin.contracts.ExperimentalContracts +import kotlin.contracts.contract @Serializable sealed interface Note { @@ -25,3 +27,19 @@ sealed interface Note { override val text: String, ) : Note } + +@OptIn(ExperimentalContracts::class) +fun Note.isFileNote(): Boolean { + contract { + returns(true) implies (this@isFileNote is Note.FileNote) + } + return this is Note.FileNote +} + +@OptIn(ExperimentalContracts::class) +fun Note.isDatabaseNote(): Boolean { + contract { + returns(true) implies (this@isDatabaseNote is Note.DatabaseNote) + } + return this is Note.DatabaseNote +} diff --git a/app/src/main/java/com/sjaindl/notesdemoapp/db/AppDatabase.kt b/app/src/main/java/com/sjaindl/notesdemoapp/model/db/AppDatabase.kt similarity index 83% rename from app/src/main/java/com/sjaindl/notesdemoapp/db/AppDatabase.kt rename to app/src/main/java/com/sjaindl/notesdemoapp/model/db/AppDatabase.kt index d7a83d6..6f86dd4 100644 --- a/app/src/main/java/com/sjaindl/notesdemoapp/db/AppDatabase.kt +++ b/app/src/main/java/com/sjaindl/notesdemoapp/model/db/AppDatabase.kt @@ -1,4 +1,4 @@ -package com.sjaindl.notesdemoapp.db +package com.sjaindl.notesdemoapp.model.db import androidx.room.Database import androidx.room.RoomDatabase diff --git a/app/src/main/java/com/sjaindl/notesdemoapp/db/NoteEntity.kt b/app/src/main/java/com/sjaindl/notesdemoapp/model/db/NoteEntity.kt similarity index 85% rename from app/src/main/java/com/sjaindl/notesdemoapp/db/NoteEntity.kt rename to app/src/main/java/com/sjaindl/notesdemoapp/model/db/NoteEntity.kt index c392d1c..e97d30f 100644 --- a/app/src/main/java/com/sjaindl/notesdemoapp/db/NoteEntity.kt +++ b/app/src/main/java/com/sjaindl/notesdemoapp/model/db/NoteEntity.kt @@ -1,4 +1,4 @@ -package com.sjaindl.notesdemoapp.db +package com.sjaindl.notesdemoapp.model.db import androidx.room.Entity import androidx.room.PrimaryKey diff --git a/app/src/main/java/com/sjaindl/notesdemoapp/db/NotesDao.kt b/app/src/main/java/com/sjaindl/notesdemoapp/model/db/NotesDao.kt similarity index 88% rename from app/src/main/java/com/sjaindl/notesdemoapp/db/NotesDao.kt rename to app/src/main/java/com/sjaindl/notesdemoapp/model/db/NotesDao.kt index b7d12ed..bb034ec 100644 --- a/app/src/main/java/com/sjaindl/notesdemoapp/db/NotesDao.kt +++ b/app/src/main/java/com/sjaindl/notesdemoapp/model/db/NotesDao.kt @@ -1,4 +1,4 @@ -package com.sjaindl.notesdemoapp.db +package com.sjaindl.notesdemoapp.model.db import androidx.room.Dao import androidx.room.Delete diff --git a/app/src/main/java/com/sjaindl/notesdemoapp/model/persistence/NotesDatabasePersistence.kt b/app/src/main/java/com/sjaindl/notesdemoapp/model/persistence/NotesDatabasePersistence.kt new file mode 100644 index 0000000..63cb3d0 --- /dev/null +++ b/app/src/main/java/com/sjaindl/notesdemoapp/model/persistence/NotesDatabasePersistence.kt @@ -0,0 +1,61 @@ +package com.sjaindl.notesdemoapp.model.persistence + +import com.sjaindl.notesdemoapp.model.db.AppDatabase +import com.sjaindl.notesdemoapp.model.db.NoteEntity +import com.sjaindl.notesdemoapp.model.Note +import com.sjaindl.notesdemoapp.model.Note.DatabaseNote + +class NotesDatabasePersistence( + private val database: AppDatabase, +): NotesPersistence { + + override suspend fun load(): List { + val notes = read() + return notes.sortedBy { + it.shareType + } + } + + override suspend fun save(note: Note) { + require(note is DatabaseNote) + saveNote(note = note) + } + + override suspend fun delete(note: Note) { + require(note is DatabaseNote) + deleteNote(note = note) + } + + private suspend fun saveNote(note: DatabaseNote) { + val entity = NoteEntity( + note.id, + note.shareType, + note.title, + note.text, + ) + + database.notesDao().insertAll(entity) + } + + private suspend fun deleteNote(note: DatabaseNote) { + val entity = NoteEntity( + id = note.id, + type = note.shareType, + title = note.title, + text = note.text, + ) + + database.notesDao().delete(entity) + } + + private suspend fun read(): List { + return database.notesDao().getAll().map { + DatabaseNote( + id = it.id, + shareType = it.type, + title = it.title, + text = it.text, + ) + } + } +} diff --git a/app/src/main/java/com/sjaindl/notesdemoapp/model/persistence/NotesFilePersistence.kt b/app/src/main/java/com/sjaindl/notesdemoapp/model/persistence/NotesFilePersistence.kt new file mode 100644 index 0000000..68ec6e9 --- /dev/null +++ b/app/src/main/java/com/sjaindl/notesdemoapp/model/persistence/NotesFilePersistence.kt @@ -0,0 +1,62 @@ +package com.sjaindl.notesdemoapp.model.persistence + +import android.content.Context +import com.sjaindl.notesdemoapp.model.Note +import com.sjaindl.notesdemoapp.model.Note.FileNote +import kotlinx.serialization.encodeToString +import kotlinx.serialization.json.Json +import java.io.File + +class NotesFilePersistence( + private val context: Context, +): NotesPersistence { + + override suspend fun load(): List { + val notes = read() + return notes.sortedBy { + it.shareType + } + } + + override suspend fun save(note: Note) { + require(note is FileNote) + saveNote(note = note) + } + + override suspend fun delete(note: Note) { + require(note is FileNote) + delete(noteId = note.id) + } + + private fun saveNote(note: FileNote) { + val dir = context.getDir("notes", Context.MODE_PRIVATE) + val filename = "${note.id}.json" + val fileContent = Json.encodeToString(note) + val file = File(dir, filename) + + file.outputStream().use { + it.write(fileContent.toByteArray()) + } + } + + private fun delete(noteId: String) { + val dir = context.getDir("notes", Context.MODE_PRIVATE) + val filename = "${noteId}.json" + val file = File(dir, filename) + file.delete() + } + + private fun read(): List { + val files = context.getDir("notes", Context.MODE_PRIVATE).listFiles() + + return files?.map { file -> + val json = file.bufferedReader().useLines { lines -> + lines.fold("") { some, text -> + "$some\n$text" + } + } + + Json.decodeFromString(json) + } ?: emptyList() + } +} diff --git a/app/src/main/java/com/sjaindl/notesdemoapp/NoteAction.kt b/app/src/main/java/com/sjaindl/notesdemoapp/model/persistence/NotesPersistence.kt similarity index 64% rename from app/src/main/java/com/sjaindl/notesdemoapp/NoteAction.kt rename to app/src/main/java/com/sjaindl/notesdemoapp/model/persistence/NotesPersistence.kt index a6eb256..f359b5f 100644 --- a/app/src/main/java/com/sjaindl/notesdemoapp/NoteAction.kt +++ b/app/src/main/java/com/sjaindl/notesdemoapp/model/persistence/NotesPersistence.kt @@ -1,10 +1,12 @@ -package com.sjaindl.notesdemoapp +package com.sjaindl.notesdemoapp.model.persistence import com.sjaindl.notesdemoapp.model.Note -interface NoteAction { - fun share(note: Note) +interface NotesPersistence { + suspend fun load(): List + suspend fun save(note: Note) + suspend fun delete(note: Note) } diff --git a/app/src/main/java/com/sjaindl/notesdemoapp/model/sharing/NoteShareAction.kt b/app/src/main/java/com/sjaindl/notesdemoapp/model/sharing/NoteShareAction.kt new file mode 100644 index 0000000..8967671 --- /dev/null +++ b/app/src/main/java/com/sjaindl/notesdemoapp/model/sharing/NoteShareAction.kt @@ -0,0 +1,7 @@ +package com.sjaindl.notesdemoapp.model.sharing + +import com.sjaindl.notesdemoapp.model.Note + +interface NoteShareAction { + fun share(note: Note) +} diff --git a/app/src/main/java/com/sjaindl/notesdemoapp/model/sharing/NotesManager.kt b/app/src/main/java/com/sjaindl/notesdemoapp/model/sharing/NotesManager.kt new file mode 100644 index 0000000..5d39f75 --- /dev/null +++ b/app/src/main/java/com/sjaindl/notesdemoapp/model/sharing/NotesManager.kt @@ -0,0 +1,25 @@ +package com.sjaindl.notesdemoapp.model.sharing + +import android.content.Context +import android.content.Intent +import androidx.core.content.ContextCompat +import com.sjaindl.notesdemoapp.model.Note +import com.sjaindl.notesdemoapp.model.ShareType + +class NotesManager( + private val context: Context, +): NoteShareAction { + + override fun share(note: Note) { + if (note.shareType == ShareType.Unshareable) return + + val sendIntent: Intent = Intent().apply { + action = Intent.ACTION_SEND + putExtra(Intent.EXTRA_TEXT, "${note.title}\n${note.text}") + type = "text/plain" + } + + val shareIntent = Intent.createChooser(sendIntent, null) + ContextCompat.startActivity(context, shareIntent, null) + } +} diff --git a/app/src/main/java/com/sjaindl/notesdemoapp/AddNoteScreen.kt b/app/src/main/java/com/sjaindl/notesdemoapp/view/AddNoteScreen.kt similarity index 98% rename from app/src/main/java/com/sjaindl/notesdemoapp/AddNoteScreen.kt rename to app/src/main/java/com/sjaindl/notesdemoapp/view/AddNoteScreen.kt index 14c039f..ae91844 100644 --- a/app/src/main/java/com/sjaindl/notesdemoapp/AddNoteScreen.kt +++ b/app/src/main/java/com/sjaindl/notesdemoapp/view/AddNoteScreen.kt @@ -1,4 +1,4 @@ -package com.sjaindl.notesdemoapp +package com.sjaindl.notesdemoapp.view import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column @@ -28,6 +28,7 @@ import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import com.sjaindl.notesdemoapp.R import com.sjaindl.notesdemoapp.model.Note import com.sjaindl.notesdemoapp.model.ShareType import kotlin.random.Random diff --git a/app/src/main/java/com/sjaindl/notesdemoapp/NotesAppBar.kt b/app/src/main/java/com/sjaindl/notesdemoapp/view/NotesAppBar.kt similarity index 91% rename from app/src/main/java/com/sjaindl/notesdemoapp/NotesAppBar.kt rename to app/src/main/java/com/sjaindl/notesdemoapp/view/NotesAppBar.kt index 838b73a..845ce32 100644 --- a/app/src/main/java/com/sjaindl/notesdemoapp/NotesAppBar.kt +++ b/app/src/main/java/com/sjaindl/notesdemoapp/view/NotesAppBar.kt @@ -1,4 +1,4 @@ -package com.sjaindl.notesdemoapp +package com.sjaindl.notesdemoapp.view import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.ArrowBack @@ -13,7 +13,8 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview -import com.sjaindl.notesdemoapp.ui.theme.NotesDemoAppTheme +import com.sjaindl.notesdemoapp.R +import com.sjaindl.notesdemoapp.view.theme.NotesDemoAppTheme @OptIn(ExperimentalMaterial3Api::class) @Composable diff --git a/app/src/main/java/com/sjaindl/notesdemoapp/NotesScreen.kt b/app/src/main/java/com/sjaindl/notesdemoapp/view/NotesScreen.kt similarity index 67% rename from app/src/main/java/com/sjaindl/notesdemoapp/NotesScreen.kt rename to app/src/main/java/com/sjaindl/notesdemoapp/view/NotesScreen.kt index bef9f28..901899e 100644 --- a/app/src/main/java/com/sjaindl/notesdemoapp/NotesScreen.kt +++ b/app/src/main/java/com/sjaindl/notesdemoapp/view/NotesScreen.kt @@ -1,4 +1,4 @@ -package com.sjaindl.notesdemoapp +package com.sjaindl.notesdemoapp.view import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn @@ -13,39 +13,38 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier -import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.tooling.preview.Preview -import androidx.lifecycle.viewmodel.compose.viewModel -import com.sjaindl.notesdemoapp.ui.theme.NotesDemoAppTheme +import com.sjaindl.notesdemoapp.model.Note +import com.sjaindl.notesdemoapp.model.ShareType +import com.sjaindl.notesdemoapp.view.theme.NotesDemoAppTheme @Composable fun NotesScreen( + notes: List, modifier: Modifier = Modifier, - viewModel: NotesViewModel = viewModel( - factory = NotesViewModel.NotesViewModelFactory(LocalContext.current) - ) + onLoadNotes: () -> Unit, + onAddNote: (Note) -> Unit, + onDeleteNote: (Note) -> Unit, + onShareNote: (Note) -> Unit, ) { var addNote by remember { mutableStateOf(false) } LaunchedEffect(key1 = Unit) { - viewModel.loadNotes() + onLoadNotes() } - val notes = viewModel.notes.collectAsState() - if (addNote) { AddNoteScreen( modifier = modifier, onAddNote = { - viewModel.addNote(note = it) + onAddNote(it) }, navigateUp = { addNote = false @@ -73,14 +72,14 @@ fun NotesScreen( LazyColumn( modifier = Modifier.padding(padding), ) { - items(notes.value) { note -> + items(notes) { note -> SingleNote( note = note, onDelete = { - viewModel.deleteNote(note = note) + onDeleteNote(note) }, onShare = { - viewModel.share(note = note) + onShareNote(note) }, ) } @@ -94,6 +93,25 @@ fun NotesScreen( @Composable fun NotesScreenPreview() { NotesDemoAppTheme { - NotesScreen() + NotesScreen( + notes = listOf( + Note.FileNote( + id = "id", + shareType = ShareType.Shareable, + title = "file note title", + text = "text", + ), + Note.DatabaseNote( + id = "id", + shareType = ShareType.Unshareable, + title = "database note title", + text = "text", + ), + ), + onLoadNotes = {}, + onAddNote = {}, + onDeleteNote = {}, + onShareNote = {}, + ) } } diff --git a/app/src/main/java/com/sjaindl/notesdemoapp/SingleNote.kt b/app/src/main/java/com/sjaindl/notesdemoapp/view/SingleNote.kt similarity index 97% rename from app/src/main/java/com/sjaindl/notesdemoapp/SingleNote.kt rename to app/src/main/java/com/sjaindl/notesdemoapp/view/SingleNote.kt index 6a5a639..35114f4 100644 --- a/app/src/main/java/com/sjaindl/notesdemoapp/SingleNote.kt +++ b/app/src/main/java/com/sjaindl/notesdemoapp/view/SingleNote.kt @@ -1,4 +1,4 @@ -package com.sjaindl.notesdemoapp +package com.sjaindl.notesdemoapp.view import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box @@ -25,7 +25,7 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.sjaindl.notesdemoapp.model.Note import com.sjaindl.notesdemoapp.model.ShareType -import com.sjaindl.notesdemoapp.ui.theme.NotesDemoAppTheme +import com.sjaindl.notesdemoapp.view.theme.NotesDemoAppTheme @Composable fun SingleNote( diff --git a/app/src/main/java/com/sjaindl/notesdemoapp/ui/theme/Color.kt b/app/src/main/java/com/sjaindl/notesdemoapp/view/theme/Color.kt similarity index 84% rename from app/src/main/java/com/sjaindl/notesdemoapp/ui/theme/Color.kt rename to app/src/main/java/com/sjaindl/notesdemoapp/view/theme/Color.kt index c0c104e..36fb59f 100644 --- a/app/src/main/java/com/sjaindl/notesdemoapp/ui/theme/Color.kt +++ b/app/src/main/java/com/sjaindl/notesdemoapp/view/theme/Color.kt @@ -1,4 +1,4 @@ -package com.sjaindl.notesdemoapp.ui.theme +package com.sjaindl.notesdemoapp.view.theme import androidx.compose.ui.graphics.Color diff --git a/app/src/main/java/com/sjaindl/notesdemoapp/ui/theme/Theme.kt b/app/src/main/java/com/sjaindl/notesdemoapp/view/theme/Theme.kt similarity index 98% rename from app/src/main/java/com/sjaindl/notesdemoapp/ui/theme/Theme.kt rename to app/src/main/java/com/sjaindl/notesdemoapp/view/theme/Theme.kt index b2e0b7a..9433826 100644 --- a/app/src/main/java/com/sjaindl/notesdemoapp/ui/theme/Theme.kt +++ b/app/src/main/java/com/sjaindl/notesdemoapp/view/theme/Theme.kt @@ -1,4 +1,4 @@ -package com.sjaindl.notesdemoapp.ui.theme +package com.sjaindl.notesdemoapp.view.theme import android.app.Activity import android.os.Build diff --git a/app/src/main/java/com/sjaindl/notesdemoapp/ui/theme/Type.kt b/app/src/main/java/com/sjaindl/notesdemoapp/view/theme/Type.kt similarity index 95% rename from app/src/main/java/com/sjaindl/notesdemoapp/ui/theme/Type.kt rename to app/src/main/java/com/sjaindl/notesdemoapp/view/theme/Type.kt index 5bfdb5b..9b9e917 100644 --- a/app/src/main/java/com/sjaindl/notesdemoapp/ui/theme/Type.kt +++ b/app/src/main/java/com/sjaindl/notesdemoapp/view/theme/Type.kt @@ -1,4 +1,4 @@ -package com.sjaindl.notesdemoapp.ui.theme +package com.sjaindl.notesdemoapp.view.theme import androidx.compose.material3.Typography import androidx.compose.ui.text.TextStyle