diff --git a/app/build.gradle b/app/build.gradle index bdbc4b7..e13d3cb 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -19,8 +19,8 @@ android { applicationId "com.digiventure.ventnote" minSdk 21 targetSdk 34 - versionCode 40 - versionName "1.0.7" + versionCode 41 + versionName "1.0.8" testInstrumentationRunner "com.digiventure.utils.CustomTestRunner" vectorDrawables { @@ -88,7 +88,7 @@ dependencies { implementation "androidx.compose.ui:ui:1.7.4" implementation "androidx.compose.ui:ui-tooling-preview:1.7.4" - implementation "androidx.compose.material3:material3:1.3.0" + implementation "androidx.compose.material3:material3:1.3.1" // Lifecycle Livedata implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.6" diff --git a/app/schemas/com.digiventure.ventnote.config.NoteDatabase/1.json b/app/schemas/com.digiventure.ventnote.config.NoteDatabase/1.json new file mode 100644 index 0000000..a364617 --- /dev/null +++ b/app/schemas/com.digiventure.ventnote.config.NoteDatabase/1.json @@ -0,0 +1,58 @@ +{ + "formatVersion": 1, + "database": { + "version": 1, + "identityHash": "5ba0c0c61835cab478078d95b4bcb861", + "entities": [ + { + "tableName": "note_table", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `title` TEXT NOT NULL, `note` TEXT NOT NULL, `created_at` INTEGER NOT NULL, `updated_at` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "note", + "columnName": "note", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "createdAt", + "columnName": "created_at", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "updatedAt", + "columnName": "updated_at", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + } + ], + "views": [], + "setupQueries": [ + "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '5ba0c0c61835cab478078d95b4bcb861')" + ] + } +} \ No newline at end of file diff --git a/app/schemas/com.digiventure.ventnote.config.NoteDatabase/2.json b/app/schemas/com.digiventure.ventnote.config.NoteDatabase/2.json new file mode 100644 index 0000000..b5116af --- /dev/null +++ b/app/schemas/com.digiventure.ventnote.config.NoteDatabase/2.json @@ -0,0 +1,58 @@ +{ + "formatVersion": 1, + "database": { + "version": 2, + "identityHash": "5ba0c0c61835cab478078d95b4bcb861", + "entities": [ + { + "tableName": "note_table", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `title` TEXT NOT NULL, `note` TEXT NOT NULL, `created_at` INTEGER NOT NULL, `updated_at` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "note", + "columnName": "note", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "createdAt", + "columnName": "created_at", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "updatedAt", + "columnName": "updated_at", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + } + ], + "views": [], + "setupQueries": [ + "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '5ba0c0c61835cab478078d95b4bcb861')" + ] + } +} \ No newline at end of file diff --git a/app/src/main/java/com/digiventure/ventnote/MainActivity.kt b/app/src/main/java/com/digiventure/ventnote/MainActivity.kt index 4fdb79b..36d36c2 100644 --- a/app/src/main/java/com/digiventure/ventnote/MainActivity.kt +++ b/app/src/main/java/com/digiventure/ventnote/MainActivity.kt @@ -5,13 +5,20 @@ import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge import androidx.compose.foundation.layout.safeDrawingPadding +import androidx.compose.material3.DrawerValue import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.SnackbarHostState import androidx.compose.material3.Surface +import androidx.compose.material3.rememberDrawerState +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.navigation.compose.rememberNavController import com.digiventure.ventnote.components.dialog.TextDialog +import com.digiventure.ventnote.feature.notes.components.drawer.NavDrawer import com.digiventure.ventnote.navigation.NavGraph +import com.digiventure.ventnote.navigation.PageNavigation import com.digiventure.ventnote.ui.theme.VentNoteTheme import com.google.android.play.core.appupdate.AppUpdateManager import com.google.android.play.core.appupdate.AppUpdateManagerFactory @@ -21,6 +28,7 @@ import com.google.android.play.core.install.model.AppUpdateType.IMMEDIATE import com.google.android.play.core.install.model.InstallStatus import com.google.android.play.core.install.model.UpdateAvailability import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.launch @AndroidEntryPoint class MainActivity : ComponentActivity() { @@ -44,12 +52,36 @@ class MainActivity : ComponentActivity() { setContent { VentNoteTheme { + val navController = rememberNavController() + val navigationActions = remember(navController) { + PageNavigation(navController) + } + + val drawerState = rememberDrawerState(DrawerValue.Closed) + + val coroutineScope = rememberCoroutineScope() + + val snackBarHostState = remember { SnackbarHostState() } + Surface( modifier = Modifier.safeDrawingPadding(), color = MaterialTheme.colorScheme.primary, contentColor = MaterialTheme.colorScheme.secondary ) { - NavGraph(navHostController = rememberNavController()) + NavDrawer( + drawerState = drawerState, + onError = { + + }, + onBackupPressed = { + navigationActions.navigateToBackupPage() + }, + content = { + NavGraph(navHostController = navController, openDrawer = { + coroutineScope.launch { drawerState.open() } + }) + }, + ) TextDialog( isOpened = isDialogShowed, @@ -76,9 +108,11 @@ class MainActivity : ComponentActivity() { // and request user confirmation to restart the app. showDialogForCompleteUpdate() } + InstallStatus.INSTALLED -> { appUpdateManager.unregisterListener(installStateUpdatedListener) } + else -> {} } } @@ -98,11 +132,17 @@ class MainActivity : ComponentActivity() { val updateTypes = arrayOf(AppUpdateType.FLEXIBLE, IMMEDIATE) for (type in updateTypes) { if (it.isUpdateTypeAllowed(type)) { - appUpdateManager.startUpdateFlowForResult(it, type, this, REQUEST_UPDATE_CODE) + appUpdateManager.startUpdateFlowForResult( + it, + type, + this, + REQUEST_UPDATE_CODE + ) break } } } + else -> {} } } diff --git a/app/src/main/java/com/digiventure/ventnote/config/NoteDatabase.kt b/app/src/main/java/com/digiventure/ventnote/config/NoteDatabase.kt index 124ba6a..68ec959 100644 --- a/app/src/main/java/com/digiventure/ventnote/config/NoteDatabase.kt +++ b/app/src/main/java/com/digiventure/ventnote/config/NoteDatabase.kt @@ -1,6 +1,7 @@ package com.digiventure.ventnote.config import android.content.Context +import androidx.room.AutoMigration import androidx.room.Database import androidx.room.Room import androidx.room.RoomDatabase @@ -25,8 +26,11 @@ object DateConverters { @Database( entities = [NoteModel::class], - version = 1, - exportSchema = true + version = 2, + exportSchema = true, + autoMigrations = [ + AutoMigration (from = 1, to = 2) + ] ) @TypeConverters(DateConverters::class) abstract class NoteDatabase: RoomDatabase() { diff --git a/app/src/main/java/com/digiventure/ventnote/feature/note_creation/NoteCreationPage.kt b/app/src/main/java/com/digiventure/ventnote/feature/note_creation/NoteCreationPage.kt index ebe52fe..9368485 100644 --- a/app/src/main/java/com/digiventure/ventnote/feature/note_creation/NoteCreationPage.kt +++ b/app/src/main/java/com/digiventure/ventnote/feature/note_creation/NoteCreationPage.kt @@ -1,7 +1,6 @@ package com.digiventure.ventnote.feature.note_creation import android.content.pm.ActivityInfo -import android.view.ViewTreeObserver import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize @@ -24,7 +23,6 @@ import androidx.compose.material3.TextFieldDefaults import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.rememberTopAppBarState import androidx.compose.runtime.Composable -import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope @@ -32,7 +30,6 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.RectangleShape import androidx.compose.ui.input.nestedscroll.nestedScroll -import androidx.compose.ui.platform.LocalView import androidx.compose.ui.res.stringResource import androidx.compose.ui.semantics.contentDescription import androidx.compose.ui.semantics.semantics @@ -40,7 +37,6 @@ import androidx.compose.ui.semantics.testTag import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.hilt.navigation.compose.hiltViewModel import androidx.navigation.NavHostController @@ -111,29 +107,6 @@ fun NoteCreationPage( val scrollBehavior = TopAppBarDefaults.enterAlwaysScrollBehavior(appBarState) val rememberedScrollBehavior = remember { scrollBehavior } - val view = LocalView.current - val keyboardHeight = remember { mutableStateOf(0.dp) } - - val viewTreeObserver = remember { view.viewTreeObserver } - val onGlobalLayoutListener = remember { - ViewTreeObserver.OnGlobalLayoutListener { - val rect = android.graphics.Rect().apply { - view.getWindowVisibleDisplayFrame(this) - } - val keyboardHeightNew = view.rootView.height - rect.bottom - if (keyboardHeightNew.dp != keyboardHeight.value) { - keyboardHeight.value = keyboardHeightNew.dp - } - } - } - - DisposableEffect(view) { - viewTreeObserver.addOnGlobalLayoutListener(onGlobalLayoutListener) - onDispose { - viewTreeObserver.removeOnGlobalLayoutListener(onGlobalLayoutListener) - } - } - Scaffold( topBar = { NoteCreationAppBar( @@ -171,7 +144,6 @@ fun NoteCreationPage( .fillMaxWidth() .fillMaxSize() .verticalScroll(rememberScrollState()) - .padding(bottom = keyboardHeight.value) ) { TextField( value = viewModel.titleText.value, diff --git a/app/src/main/java/com/digiventure/ventnote/feature/note_detail/NoteDetailPage.kt b/app/src/main/java/com/digiventure/ventnote/feature/note_detail/NoteDetailPage.kt index 652cfe0..3becdbe 100644 --- a/app/src/main/java/com/digiventure/ventnote/feature/note_detail/NoteDetailPage.kt +++ b/app/src/main/java/com/digiventure/ventnote/feature/note_detail/NoteDetailPage.kt @@ -2,7 +2,6 @@ package com.digiventure.ventnote.feature.note_detail import android.content.pm.ActivityInfo import android.net.Uri -import android.view.ViewTreeObserver import androidx.activity.compose.BackHandler import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -28,7 +27,6 @@ import androidx.compose.material3.TextFieldDefaults import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.rememberTopAppBarState import androidx.compose.runtime.Composable -import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.livedata.observeAsState import androidx.compose.runtime.mutableStateOf @@ -39,7 +37,6 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.RectangleShape import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.platform.LocalFocusManager -import androidx.compose.ui.platform.LocalView import androidx.compose.ui.res.stringResource import androidx.compose.ui.semantics.contentDescription import androidx.compose.ui.semantics.semantics @@ -47,7 +44,6 @@ import androidx.compose.ui.semantics.testTag import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.hilt.navigation.compose.hiltViewModel import androidx.navigation.NavHostController @@ -61,7 +57,7 @@ import com.digiventure.ventnote.feature.note_detail.components.NoteDetailAppBar import com.digiventure.ventnote.feature.note_detail.viewmodel.NoteDetailPageBaseVM import com.digiventure.ventnote.feature.note_detail.viewmodel.NoteDetailPageMockVM import com.digiventure.ventnote.feature.note_detail.viewmodel.NoteDetailPageVM -import com.digiventure.ventnote.navigation.Route +import com.digiventure.ventnote.navigation.PageNavigation import com.google.gson.Gson import kotlinx.coroutines.launch @@ -76,6 +72,10 @@ fun NoteDetailPage( ) { LockScreenOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) + val navigationActions = remember(navHostController) { + PageNavigation(navHostController) + } + // String resource val titleTextField = "${stringResource(R.string.title_textField)}-$TAG" val bodyTextField = "${stringResource(R.string.body_textField)}-$TAG" @@ -173,36 +173,15 @@ fun NoteDetailPage( val scrollBehavior = TopAppBarDefaults.enterAlwaysScrollBehavior(appBarState) val rememberedScrollBehavior = remember { scrollBehavior } - val view = LocalView.current - val keyboardHeight = remember { mutableStateOf(0.dp) } - - val viewTreeObserver = remember { view.viewTreeObserver } - val onGlobalLayoutListener = remember { - ViewTreeObserver.OnGlobalLayoutListener { - val rect = android.graphics.Rect().apply { - view.getWindowVisibleDisplayFrame(this) - } - val keyboardHeightNew = view.rootView.height - rect.bottom - if (keyboardHeightNew.dp != keyboardHeight.value) { - keyboardHeight.value = keyboardHeightNew.dp - } - } - } - - DisposableEffect(view) { - viewTreeObserver.addOnGlobalLayoutListener(onGlobalLayoutListener) - onDispose { - viewTreeObserver.removeOnGlobalLayoutListener(onGlobalLayoutListener) - } - } - Scaffold( topBar = { NoteDetailAppBar( isEditing = isEditingState, descriptionTextLength = viewModel.descriptionText.value.length, onBackPressed = { - navHostController.popBackStack() + scope.launch { + navigationActions.navigateToNotesPage() + } }, onClosePressed = { cancelDialogState.value = true @@ -213,7 +192,8 @@ fun NoteDetailPage( scrollBehavior = rememberedScrollBehavior, onSharePressed = { val json = Uri.encode(Gson().toJson(data)) - navHostController.navigate("${Route.SharePreviewPage.routeName}/${json}") + navigationActions.navigateToSharePage(json) + } ) }, @@ -252,7 +232,6 @@ fun NoteDetailPage( .fillMaxWidth() .fillMaxSize() .verticalScroll(rememberScrollState()) - .padding(bottom = keyboardHeight.value) ) { TitleTextField(viewModel, isEditingState, titleTextField, titleInput) DescriptionTextField(viewModel, isEditingState, bodyTextField, bodyInput) diff --git a/app/src/main/java/com/digiventure/ventnote/feature/notes/NotesPage.kt b/app/src/main/java/com/digiventure/ventnote/feature/notes/NotesPage.kt index 5351b64..5078f57 100644 --- a/app/src/main/java/com/digiventure/ventnote/feature/notes/NotesPage.kt +++ b/app/src/main/java/com/digiventure/ventnote/feature/notes/NotesPage.kt @@ -10,7 +10,6 @@ import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Add -import androidx.compose.material3.DrawerValue import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExtendedFloatingActionButton import androidx.compose.material3.Icon @@ -19,7 +18,6 @@ import androidx.compose.material3.Scaffold import androidx.compose.material3.SnackbarHost import androidx.compose.material3.SnackbarHostState import androidx.compose.material3.Text -import androidx.compose.material3.rememberDrawerState import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect @@ -44,33 +42,39 @@ import com.digiventure.ventnote.commons.TestTags import com.digiventure.ventnote.components.LockScreenOrientation import com.digiventure.ventnote.components.dialog.LoadingDialog import com.digiventure.ventnote.components.dialog.TextDialog -import com.digiventure.ventnote.data.persistence.NoteModel -import com.digiventure.ventnote.feature.notes.components.drawer.NavDrawer import com.digiventure.ventnote.feature.notes.components.item.NotesItem import com.digiventure.ventnote.feature.notes.components.navbar.NotesAppBar import com.digiventure.ventnote.feature.notes.components.sheets.FilterSheet import com.digiventure.ventnote.feature.notes.viewmodel.NotesPageBaseVM import com.digiventure.ventnote.feature.notes.viewmodel.NotesPageMockVM import com.digiventure.ventnote.feature.notes.viewmodel.NotesPageVM -import com.digiventure.ventnote.navigation.Route +import com.digiventure.ventnote.navigation.PageNavigation import kotlinx.coroutines.launch @OptIn(ExperimentalMaterial3Api::class) @Composable fun NotesPage( navHostController: NavHostController, - viewModel: NotesPageBaseVM = hiltViewModel() + viewModel: NotesPageBaseVM = hiltViewModel(), + openDrawer: () -> Unit ) { LockScreenOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) + val navigationActions = remember(navHostController) { + PageNavigation(navHostController) + } + val noteListState = viewModel.noteList.observeAsState() val loadingState = viewModel.loader.observeAsState() - val drawerState = rememberDrawerState(DrawerValue.Closed) val scope = rememberCoroutineScope() val snackBarHostState = remember { SnackbarHostState() } - val filteredNoteListState = remember { mutableStateOf>(listOf()) } + val filteredNotes = remember(noteListState.value, viewModel.searchedTitleText.value) { + noteListState.value?.getOrNull()?.filter { note -> + note.title.contains(viewModel.searchedTitleText.value, true) + } ?: listOf() + } val loadingDialog = remember { mutableStateOf(false) } val deleteDialog = remember { mutableStateOf(false) } @@ -95,12 +99,6 @@ fun NotesPage( } } - LaunchedEffect(noteListState.value, viewModel.searchedTitleText.value) { - filteredNoteListState.value = noteListState.value?.getOrNull()?.filter { note -> - note.title.contains(viewModel.searchedTitleText.value, true) - } ?: listOf() - } - LaunchedEffect(key1 = loadingState.value) { loadingDialog.value = (loadingState.value == true) } @@ -131,132 +129,114 @@ fun NotesPage( } } - NavDrawer( - drawerState = drawerState, - onError = { - scope.launch { - snackBarHostState.showSnackbar( - message = it, - withDismissAction = true - ) - } - }, - onBackupPressed = { - navHostController.navigate(Route.BackupPage.routeName) - }, - content = { - Scaffold( - topBar = { - NotesAppBar( - isMarking = viewModel.isMarking.value, - markedNoteListSize = viewModel.markedNoteList.size, - isSearching = viewModel.isSearching.value, - searchedTitle = viewModel.searchedTitleText.value, - toggleDrawerCallback = { - scope.launch { - drawerState.open() - } - }, - selectAllCallback = { - viewModel.noteList.value?.getOrNull().let { - if (it != null) viewModel.markAllNote(it) - } - }, - unSelectAllCallback = { - viewModel.unMarkAllNote() - }, - onSearchValueChange = { - viewModel.searchedTitleText.value = it - }, - closeMarkingCallback = { - viewModel.closeMarkingEvent() - }, - searchCallback = { - viewModel.isSearching.value = true - viewModel.searchedTitleText.value = "" - }, - sortCallback = { - openBottomSheet.value = true - }, - deleteCallback = { - deleteDialog.value = true - }, - closeSearchCallback = { - viewModel.closeSearchEvent() - } - ) + Scaffold( + topBar = { + NotesAppBar( + isMarking = viewModel.isMarking.value, + markedNoteListSize = viewModel.markedNoteList.size, + isSearching = viewModel.isSearching.value, + searchedTitle = viewModel.searchedTitleText.value, + toggleDrawerCallback = { + openDrawer() + }, + selectAllCallback = { + viewModel.noteList.value?.getOrNull().let { + if (it != null) viewModel.markAllNote(it) + } + }, + unSelectAllCallback = { + viewModel.unMarkAllNote() + }, + onSearchValueChange = { + viewModel.searchedTitleText.value = it + }, + closeMarkingCallback = { + viewModel.closeMarkingEvent() }, - snackbarHost = { SnackbarHost(snackBarHostState) }, - floatingActionButton = { - ExtendedFloatingActionButton( - onClick = { - viewModel.closeMarkingEvent() - viewModel.closeSearchEvent() + searchCallback = { + viewModel.isSearching.value = true + viewModel.searchedTitleText.value = "" + }, + sortCallback = { + openBottomSheet.value = true + }, + deleteCallback = { + deleteDialog.value = true + }, + closeSearchCallback = { + viewModel.closeSearchEvent() + } + ) + }, + snackbarHost = { SnackbarHost(snackBarHostState) }, + floatingActionButton = { + ExtendedFloatingActionButton( + onClick = { + viewModel.closeMarkingEvent() + viewModel.closeSearchEvent() - navHostController.navigate(Route.NoteCreationPage.routeName) - }, - modifier = Modifier.semantics { - testTag = TestTags.ADD_NOTE_FAB - }, - text = { - Text(stringResource(R.string.add), fontSize = 16.sp, fontWeight = FontWeight.Medium) - }, - icon = { - Icon( - imageVector = Icons.Filled.Add, - contentDescription = stringResource(R.string.fab) - ) - }, - containerColor = MaterialTheme.colorScheme.primary, - contentColor = MaterialTheme.colorScheme.onPrimary + navigationActions.navigateToCreatePage() + }, + modifier = Modifier.semantics { + testTag = TestTags.ADD_NOTE_FAB + }, + text = { + Text(stringResource(R.string.add), fontSize = 16.sp, fontWeight = FontWeight.Medium) + }, + icon = { + Icon( + imageVector = Icons.Filled.Add, + contentDescription = stringResource(R.string.fab) ) }, - content = { contentPadding -> - Box(modifier = Modifier.padding(contentPadding)) { - LazyColumn( - modifier = Modifier - .fillMaxSize() - .semantics { testTag = TestTags.NOTE_RV }, - verticalArrangement = Arrangement.spacedBy(16.dp), - contentPadding = PaddingValues( - top = 24.dp, - bottom = 96.dp - ) - ) { - items(items = filteredNoteListState.value) { - Box(Modifier.padding(start = 16.dp, end = 16.dp)) { - NotesItem( - isMarking = viewModel.isMarking.value, - isMarked = it in viewModel.markedNoteList, - data = it, - onClick = { - if (viewModel.isMarking.value) { - viewModel.addToMarkedNoteList(it) - } else { - viewModel.closeMarkingEvent() - viewModel.closeSearchEvent() + containerColor = MaterialTheme.colorScheme.primary, + contentColor = MaterialTheme.colorScheme.onPrimary + ) + }, + content = { contentPadding -> + Box(modifier = Modifier.padding(contentPadding)) { + LazyColumn( + modifier = Modifier + .fillMaxSize() + .semantics { testTag = TestTags.NOTE_RV }, + verticalArrangement = Arrangement.spacedBy(16.dp), + contentPadding = PaddingValues( + top = 24.dp, + bottom = 96.dp + ) + ) { + items(items = filteredNotes) { + Box(Modifier.padding(start = 16.dp, end = 16.dp)) { + NotesItem( + isMarking = viewModel.isMarking.value, + isMarked = it in viewModel.markedNoteList, + data = it, + onClick = { + if (viewModel.isMarking.value) { + viewModel.addToMarkedNoteList(it) + } else { + viewModel.closeMarkingEvent() + viewModel.closeSearchEvent() - navHostController.navigate("${Route.NoteDetailPage.routeName}/${it.id}") - } - }, - onLongClick = { - if (!viewModel.isMarking.value) { - viewModel.isMarking.value = true - } - viewModel.addToMarkedNoteList(it) - }, - onCheckClick = { - viewModel.addToMarkedNoteList(it) - } - ) + navigationActions.navigateToDetailPage(it.id) + } + }, + onLongClick = { + if (!viewModel.isMarking.value) { + viewModel.isMarking.value = true + } + viewModel.addToMarkedNoteList(it) + }, + onCheckClick = { + viewModel.addToMarkedNoteList(it) } - } + ) } } - }, - modifier = Modifier.semantics { testTag = TestTags.NOTES_PAGE } - ) - } + } + } + }, + modifier = Modifier.semantics { testTag = TestTags.NOTES_PAGE } ) LoadingDialog(isOpened = loadingDialog.value, onDismissCallback = { loadingDialog.value = false }, @@ -279,5 +259,7 @@ fun NotesPagePreview() { NotesPage( navHostController = rememberNavController(), viewModel = NotesPageMockVM() - ) + ) { + + } } \ No newline at end of file diff --git a/app/src/main/java/com/digiventure/ventnote/feature/notes/components/drawer/NavigationDrawer.kt b/app/src/main/java/com/digiventure/ventnote/feature/notes/components/drawer/NavigationDrawer.kt index fded3fd..58f353a 100644 --- a/app/src/main/java/com/digiventure/ventnote/feature/notes/components/drawer/NavigationDrawer.kt +++ b/app/src/main/java/com/digiventure/ventnote/feature/notes/components/drawer/NavigationDrawer.kt @@ -22,6 +22,7 @@ import androidx.compose.material.icons.filled.ColorLens import androidx.compose.material.icons.filled.Shop import androidx.compose.material.icons.filled.Star import androidx.compose.material.icons.filled.Update +import androidx.compose.material3.DrawerDefaults import androidx.compose.material3.DrawerState import androidx.compose.material3.DrawerValue import androidx.compose.material3.Icon @@ -41,7 +42,6 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.RectangleShape import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalContext @@ -122,12 +122,12 @@ fun NavDrawer( ModalNavigationDrawer(drawerState = drawerState, drawerContent = { ModalDrawerSheet( - drawerShape = RectangleShape, + drawerShape = DrawerDefaults.shape, drawerContainerColor = MaterialTheme.colorScheme.background, modifier = Modifier .fillMaxHeight() .padding(0.dp) - .width(screenWidth - 50.dp) + .width(screenWidth - 60.dp) ) { SectionTitle(title = stringResource(id = R.string.about_us)) diff --git a/app/src/main/java/com/digiventure/ventnote/navigation/NavGraph.kt b/app/src/main/java/com/digiventure/ventnote/navigation/NavGraph.kt index 22689c4..81cec3f 100644 --- a/app/src/main/java/com/digiventure/ventnote/navigation/NavGraph.kt +++ b/app/src/main/java/com/digiventure/ventnote/navigation/NavGraph.kt @@ -14,13 +14,13 @@ import com.digiventure.ventnote.feature.notes.NotesPage import com.digiventure.ventnote.feature.share_preview.SharePreviewPage @Composable -fun NavGraph(navHostController: NavHostController) { +fun NavGraph(navHostController: NavHostController, openDrawer: () -> Unit) { NavHost( navController = navHostController, - startDestination = Route.NotesPage.routeName + startDestination = Route.NotesPage.routeName, ) { composable(Route.NotesPage.routeName) { - NotesPage(navHostController = navHostController) + NotesPage(navHostController = navHostController, openDrawer = openDrawer) } composable( route = "${Route.NoteDetailPage.routeName}/{noteId}", diff --git a/app/src/main/java/com/digiventure/ventnote/navigation/PageNavigation.kt b/app/src/main/java/com/digiventure/ventnote/navigation/PageNavigation.kt new file mode 100644 index 0000000..ccc2587 --- /dev/null +++ b/app/src/main/java/com/digiventure/ventnote/navigation/PageNavigation.kt @@ -0,0 +1,52 @@ +package com.digiventure.ventnote.navigation + +import androidx.navigation.NavGraph.Companion.findStartDestination +import androidx.navigation.NavHostController + +class PageNavigation(navController: NavHostController) { + val navigateToBackupPage: () -> Unit = { + navController.navigate(Route.BackupPage.routeName) { + popUpTo(navController.graph.findStartDestination().id) { + saveState = true + } + launchSingleTop = true + restoreState = true + } + } + val navigateToDetailPage: (noteId: Int) -> Unit = { noteId -> + val routeName = "${Route.NoteDetailPage.routeName}/${noteId}" + navController.navigate(routeName) { + popUpTo(navController.graph.findStartDestination().id) { + saveState = true + } + launchSingleTop = true + restoreState = true + } + } + val navigateToCreatePage: () -> Unit = { + navController.navigate(Route.NoteCreationPage.routeName) { + popUpTo(navController.graph.findStartDestination().id) { + saveState = true + } + launchSingleTop = true + restoreState = true + } + } + val navigateToNotesPage: () -> Unit = { + navController.navigate(Route.NotesPage.routeName) { + popUpTo(navController.graph.findStartDestination().id) { + inclusive = true + } + } + } + val navigateToSharePage: (noteJson: String) -> Unit = { noteJson -> + val routeName = "${Route.SharePreviewPage.routeName}/${noteJson}" + navController.navigate(routeName) { + popUpTo(navController.graph.findStartDestination().id) { + saveState = true + } + launchSingleTop = true + restoreState = true + } + } +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 5c0ffb0..3a2a720 100644 --- a/gradle.properties +++ b/gradle.properties @@ -10,7 +10,7 @@ org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 -XX:+UseParallelGC # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects - org.gradle.parallel=true +org.gradle.parallel=true # AndroidX package structure to make it clearer which packages are bundled with the # Android operating system, and which are packaged with your app's APK # https://developer.android.com/topic/libraries/support-library/androidx-rn