diff --git a/app/release/app-release.aab b/app/release/app-release.aab new file mode 100644 index 00000000..d8036538 Binary files /dev/null and b/app/release/app-release.aab differ diff --git a/app/src/main/java/com/pwhs/quickmem/presentation/app/classes/detail/ClassDetailScreen.kt b/app/src/main/java/com/pwhs/quickmem/presentation/app/classes/detail/ClassDetailScreen.kt index ce378421..ccaa912f 100644 --- a/app/src/main/java/com/pwhs/quickmem/presentation/app/classes/detail/ClassDetailScreen.kt +++ b/app/src/main/java/com/pwhs/quickmem/presentation/app/classes/detail/ClassDetailScreen.kt @@ -67,7 +67,6 @@ import com.ramcosta.composedestinations.navigation.DestinationsNavigator import com.ramcosta.composedestinations.result.NavResult import com.ramcosta.composedestinations.result.ResultBackNavigator import com.ramcosta.composedestinations.result.ResultRecipient -import timber.log.Timber import com.pwhs.quickmem.R import com.pwhs.quickmem.presentation.ads.BannerAds @@ -443,7 +442,7 @@ fun ClassDetail( ClassDetailEnums.FOLDERS.index -> FoldersTabScreen( modifier = Modifier.fillMaxSize(), onAddFoldersClicked = onNavigateAddFolder, - folder = folders, + folders = folders, onFolderItemClicked = onFolderItemClicked, isOwner = isOwner, onDeleteFolderClicked = onDeleteFolderClick @@ -451,7 +450,7 @@ fun ClassDetail( ClassDetailEnums.MEMBERS.index -> MembersTabScreen( modifier = Modifier.fillMaxSize(), - member = members, + members = members, onMembersItemClicked = { onNavigateToUserDetail(it.id) }, diff --git a/app/src/main/java/com/pwhs/quickmem/presentation/app/classes/detail/folders/FoldersTabScreen.kt b/app/src/main/java/com/pwhs/quickmem/presentation/app/classes/detail/folders/FoldersTabScreen.kt index dd3a1e57..4b522877 100644 --- a/app/src/main/java/com/pwhs/quickmem/presentation/app/classes/detail/folders/FoldersTabScreen.kt +++ b/app/src/main/java/com/pwhs/quickmem/presentation/app/classes/detail/folders/FoldersTabScreen.kt @@ -1,17 +1,28 @@ package com.pwhs.quickmem.presentation.app.classes.detail.folders +import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items +import androidx.compose.material3.MaterialTheme.typography +import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment.Companion.CenterHorizontally import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.pwhs.quickmem.R import com.pwhs.quickmem.domain.model.folder.GetFolderResponseModel import com.pwhs.quickmem.presentation.app.classes.detail.component.ClassDetailEmptyItems +import com.pwhs.quickmem.presentation.app.library.component.SearchTextField import com.pwhs.quickmem.presentation.app.library.folder.component.FolderItem import com.pwhs.quickmem.ui.theme.QuickMemTheme @@ -19,13 +30,20 @@ import com.pwhs.quickmem.ui.theme.QuickMemTheme fun FoldersTabScreen( modifier: Modifier = Modifier, isOwner: Boolean, - folder: List = emptyList(), + folders: List = emptyList(), onAddFoldersClicked: () -> Unit = {}, onFolderItemClicked: (GetFolderResponseModel) -> Unit = {}, onDeleteFolderClicked: (String) -> Unit = {} ) { + var searchQuery by remember { mutableStateOf("") } + + val filterFolders = folders.filter { + searchQuery.trim().takeIf { query -> query.isNotEmpty() }?.let { query -> + it.title.contains(query, ignoreCase = true) + } != false + } when { - folder.isEmpty() -> { + folders.isEmpty() -> { ClassDetailEmptyItems( modifier = modifier, title = stringResource(R.string.txt_this_class_has_no_folders), @@ -40,7 +58,15 @@ fun FoldersTabScreen( LazyColumn( modifier = modifier, ) { - items(items = folder, key = { it.id }) { folders -> + item { + SearchTextField( + modifier = Modifier.padding(horizontal = 16.dp), + searchQuery = searchQuery, + onSearchQueryChange = { searchQuery = it }, + placeholder = stringResource(R.string.txt_search_folders), + ) + } + items(items = filterFolders, key = { it.id }) { folders -> FolderItem( modifier = Modifier.padding(horizontal = 16.dp), title = folders.title, @@ -54,6 +80,22 @@ fun FoldersTabScreen( isOwner = isOwner ) } + item { + if (filterFolders.isEmpty() && searchQuery.trim().isNotEmpty()) { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(16.dp), + horizontalAlignment = CenterHorizontally + ) { + Text( + text = stringResource(R.string.txt_no_folders_found), + style = typography.bodyLarge, + textAlign = TextAlign.Center + ) + } + } + } item { Spacer(modifier = Modifier.padding(60.dp)) } diff --git a/app/src/main/java/com/pwhs/quickmem/presentation/app/classes/detail/members/MembersTabScreen.kt b/app/src/main/java/com/pwhs/quickmem/presentation/app/classes/detail/members/MembersTabScreen.kt index 8af078f6..23707ae6 100644 --- a/app/src/main/java/com/pwhs/quickmem/presentation/app/classes/detail/members/MembersTabScreen.kt +++ b/app/src/main/java/com/pwhs/quickmem/presentation/app/classes/detail/members/MembersTabScreen.kt @@ -1,31 +1,49 @@ package com.pwhs.quickmem.presentation.app.classes.detail.members +import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items +import androidx.compose.material3.MaterialTheme.typography +import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment.Companion.CenterHorizontally import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.pwhs.quickmem.R import com.pwhs.quickmem.domain.model.users.ClassMemberModel import com.pwhs.quickmem.presentation.app.classes.detail.component.ClassDetailEmpty import com.pwhs.quickmem.presentation.app.classes.detail.members.component.ClassMemberItem +import com.pwhs.quickmem.presentation.app.library.component.SearchTextField import com.pwhs.quickmem.ui.theme.QuickMemTheme @Composable fun MembersTabScreen( modifier: Modifier = Modifier, isOwner: Boolean, - member: List = emptyList(), + members: List = emptyList(), onMembersItemClicked: (ClassMemberModel) -> Unit = {}, onAddMembersClicked: () -> Unit = {}, onDeletedClicked: (String) -> Unit = {} ) { + var searchQuery by remember { mutableStateOf("") } + + val filterMembers = members.filter { + searchQuery.trim().takeIf { query -> query.isNotEmpty() }?.let { query -> + it.username.contains(query, ignoreCase = true) + } != false + } when { - member.isEmpty() -> { + members.isEmpty() -> { ClassDetailEmpty( modifier = modifier, title = stringResource(R.string.txt_this_class_has_no_members), @@ -40,7 +58,15 @@ fun MembersTabScreen( LazyColumn( modifier = modifier, ) { - items(items = member, key = { it.id }) { member -> + item { + SearchTextField( + modifier = Modifier.padding(horizontal = 16.dp), + searchQuery = searchQuery, + onSearchQueryChange = { searchQuery = it }, + placeholder = stringResource(R.string.txt_search_folders), + ) + } + items(items = filterMembers, key = { it.id }) { member -> ClassMemberItem( modifier = Modifier.padding(horizontal = 16.dp), classMemberModel = member, @@ -49,6 +75,22 @@ fun MembersTabScreen( onDeleteClicked = onDeletedClicked, ) } + item { + if (filterMembers.isEmpty() && searchQuery.trim().isNotEmpty()) { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(16.dp), + horizontalAlignment = CenterHorizontally + ) { + Text( + text = stringResource(R.string.txt_no_members_found), + style = typography.bodyLarge, + textAlign = TextAlign.Center + ) + } + } + } item { Spacer(modifier = Modifier.padding(60.dp)) } diff --git a/app/src/main/java/com/pwhs/quickmem/presentation/app/classes/detail/study_sets/StudySetsTabScreen.kt b/app/src/main/java/com/pwhs/quickmem/presentation/app/classes/detail/study_sets/StudySetsTabScreen.kt index d46e4a09..a79924a2 100644 --- a/app/src/main/java/com/pwhs/quickmem/presentation/app/classes/detail/study_sets/StudySetsTabScreen.kt +++ b/app/src/main/java/com/pwhs/quickmem/presentation/app/classes/detail/study_sets/StudySetsTabScreen.kt @@ -1,17 +1,28 @@ package com.pwhs.quickmem.presentation.app.classes.detail.study_sets +import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items +import androidx.compose.material3.MaterialTheme.typography +import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment.Companion.CenterHorizontally import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.pwhs.quickmem.R import com.pwhs.quickmem.domain.model.study_set.GetStudySetResponseModel import com.pwhs.quickmem.presentation.app.classes.detail.component.ClassDetailEmptyItems +import com.pwhs.quickmem.presentation.app.library.component.SearchTextField import com.pwhs.quickmem.presentation.app.library.study_set.component.StudySetItem import com.pwhs.quickmem.ui.theme.QuickMemTheme @@ -24,11 +35,18 @@ fun StudySetsTabScreen( onStudySetItemClicked: (GetStudySetResponseModel) -> Unit = {}, onDeleteStudySetClicked: (String) -> Unit = {} ) { + var searchQuery by remember { mutableStateOf("") } + + val filterStudySets = studySets.filter { + searchQuery.trim().takeIf { query -> query.isNotEmpty() }?.let { query -> + it.title.contains(query, ignoreCase = true) + } != false + } when { studySets.isEmpty() -> { ClassDetailEmptyItems( modifier = modifier, - title = stringResource(R.string.txt_this_class_has_no_sets), + title = stringResource(R.string.txt_this_class_has_no_study_sets), subtitle = stringResource(R.string.txt_add_flashcard_sets_to_share_them_with_your_class), buttonTitle = stringResource(R.string.txt_add_study_sets), onAddClick = onAddStudySetClicked, @@ -40,7 +58,15 @@ fun StudySetsTabScreen( LazyColumn( modifier = modifier, ) { - items(items = studySets, key = { it.id }) { studySet -> + item { + SearchTextField( + modifier = Modifier.padding(horizontal = 16.dp), + searchQuery = searchQuery, + onSearchQueryChange = { searchQuery = it }, + placeholder = stringResource(R.string.txt_search_study_sets), + ) + } + items(items = filterStudySets, key = { it.id }) { studySet -> StudySetItem( modifier = Modifier.padding(horizontal = 16.dp), studySet = studySet, @@ -51,6 +77,22 @@ fun StudySetsTabScreen( } ) } + item { + if (filterStudySets.isEmpty() && searchQuery.trim().isNotEmpty()) { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(16.dp), + horizontalAlignment = CenterHorizontally + ) { + Text( + text = stringResource(R.string.txt_no_study_sets_found), + style = typography.bodyLarge, + textAlign = TextAlign.Center + ) + } + } + } item { Spacer(modifier = Modifier.padding(60.dp)) } diff --git a/app/src/main/java/com/pwhs/quickmem/presentation/app/folder/detail/FolderDetailScreen.kt b/app/src/main/java/com/pwhs/quickmem/presentation/app/folder/detail/FolderDetailScreen.kt index c068c47e..80508037 100644 --- a/app/src/main/java/com/pwhs/quickmem/presentation/app/folder/detail/FolderDetailScreen.kt +++ b/app/src/main/java/com/pwhs/quickmem/presentation/app/folder/detail/FolderDetailScreen.kt @@ -55,9 +55,7 @@ import com.ramcosta.composedestinations.generated.destinations.EditFolderScreenD import com.ramcosta.composedestinations.generated.destinations.FlipFlashCardScreenDestination import com.ramcosta.composedestinations.generated.destinations.LearnByQuizScreenDestination import com.ramcosta.composedestinations.generated.destinations.LearnByTrueFalseScreenDestination -import com.ramcosta.composedestinations.generated.destinations.LearnByTrueFalseScreenDestination.invoke import com.ramcosta.composedestinations.generated.destinations.LearnByWriteScreenDestination -import com.ramcosta.composedestinations.generated.destinations.LearnByWriteScreenDestination.invoke import com.ramcosta.composedestinations.generated.destinations.ReportScreenDestination import com.ramcosta.composedestinations.generated.destinations.StudySetDetailScreenDestination import com.ramcosta.composedestinations.generated.destinations.UserDetailScreenDestination diff --git a/app/src/main/java/com/pwhs/quickmem/presentation/app/folder/detail/component/FolderDetailStudySetList.kt b/app/src/main/java/com/pwhs/quickmem/presentation/app/folder/detail/component/FolderDetailStudySetList.kt index 8cb3eb27..5c6f1b09 100644 --- a/app/src/main/java/com/pwhs/quickmem/presentation/app/folder/detail/component/FolderDetailStudySetList.kt +++ b/app/src/main/java/com/pwhs/quickmem/presentation/app/folder/detail/component/FolderDetailStudySetList.kt @@ -5,6 +5,7 @@ import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items @@ -17,6 +18,10 @@ import androidx.compose.material3.MaterialTheme.typography import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment.Companion.CenterHorizontally import androidx.compose.ui.Alignment.Companion.CenterVertically import androidx.compose.ui.Modifier @@ -30,6 +35,7 @@ import com.pwhs.quickmem.domain.model.color.ColorModel import com.pwhs.quickmem.domain.model.study_set.GetStudySetResponseModel import com.pwhs.quickmem.domain.model.subject.SubjectModel import com.pwhs.quickmem.domain.model.users.UserResponseModel +import com.pwhs.quickmem.presentation.app.library.component.SearchTextField import com.pwhs.quickmem.presentation.app.library.study_set.component.StudySetItem import com.pwhs.quickmem.ui.theme.QuickMemTheme @@ -41,6 +47,13 @@ fun FolderDetailStudySetList( onStudySetClick: (String) -> Unit = {}, onAddFlashCardClick: () -> Unit = {}, ) { + var searchQuery by remember { mutableStateOf("") } + + val filterStudySets = studySets.filter { + searchQuery.trim().takeIf { query -> query.isNotEmpty() }?.let { query -> + it.title.contains(query, ignoreCase = true) + } != false + } Box(modifier = modifier) { when { studySets.isEmpty() -> { @@ -48,6 +61,7 @@ fun FolderDetailStudySetList( horizontalAlignment = CenterHorizontally, verticalArrangement = Arrangement.Center, modifier = Modifier + .fillMaxWidth() .padding(top = 100.dp) ) { Text( @@ -89,12 +103,35 @@ fun FolderDetailStudySetList( LazyColumn( horizontalAlignment = CenterHorizontally, ) { - items(items = studySets, key = { it.id }) { studySet -> + item { + SearchTextField( + searchQuery = searchQuery, + onSearchQueryChange = { searchQuery = it }, + placeholder = stringResource(R.string.txt_search_study_sets), + ) + } + items(items = filterStudySets, key = { it.id }) { studySet -> StudySetItem( studySet = studySet, onStudySetClick = { onStudySetClick(studySet.id) } ) } + item { + if (filterStudySets.isEmpty() && searchQuery.trim().isNotEmpty()) { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(16.dp), + horizontalAlignment = CenterHorizontally + ) { + Text( + text = stringResource(R.string.txt_no_study_sets_found), + style = typography.bodyLarge, + textAlign = TextAlign.Center + ) + } + } + } item { Spacer(modifier = Modifier.padding(60.dp)) } diff --git a/app/src/main/java/com/pwhs/quickmem/presentation/app/library/LibraryScreen.kt b/app/src/main/java/com/pwhs/quickmem/presentation/app/library/LibraryScreen.kt index ee2982f4..755cf2d7 100644 --- a/app/src/main/java/com/pwhs/quickmem/presentation/app/library/LibraryScreen.kt +++ b/app/src/main/java/com/pwhs/quickmem/presentation/app/library/LibraryScreen.kt @@ -24,7 +24,6 @@ import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableIntStateOf -import androidx.compose.runtime.remember import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier @@ -52,7 +51,6 @@ import com.ramcosta.composedestinations.generated.destinations.StudySetDetailScr import com.ramcosta.composedestinations.navigation.DestinationsNavigator import com.ramcosta.composedestinations.result.NavResult import com.ramcosta.composedestinations.result.ResultRecipient -import timber.log.Timber @Composable @Destination @@ -70,7 +68,6 @@ fun LibraryScreen( resultStudySetDetail.onNavResult { result -> when (result) { NavResult.Canceled -> { - Timber.d("StudySetDetailScreen was canceled") } is NavResult.Value -> { @@ -84,7 +81,6 @@ fun LibraryScreen( resultClassDetail.onNavResult { result -> when (result) { NavResult.Canceled -> { - Timber.d("ClassDetailScreen was canceled") } is NavResult.Value -> { @@ -98,7 +94,6 @@ fun LibraryScreen( resultFolderDetail.onNavResult { result -> when (result) { NavResult.Canceled -> { - Timber.d("FolderDetailScreen was canceled") } is NavResult.Value -> { diff --git a/app/src/main/java/com/pwhs/quickmem/presentation/app/library/classes/ListClassesScreen.kt b/app/src/main/java/com/pwhs/quickmem/presentation/app/library/classes/ListClassesScreen.kt index 0a26013e..a7e551fd 100644 --- a/app/src/main/java/com/pwhs/quickmem/presentation/app/library/classes/ListClassesScreen.kt +++ b/app/src/main/java/com/pwhs/quickmem/presentation/app/library/classes/ListClassesScreen.kt @@ -58,7 +58,7 @@ fun ListClassesScreen( val filterClass = classes.filter { searchQuery.trim().takeIf { query -> query.isNotEmpty() }?.let { query -> it.title.contains(query, ignoreCase = true) - } ?: true + } != false } Scaffold( modifier = modifier.fillMaxSize(), diff --git a/app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/detail/material/MaterialTabScreen.kt b/app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/detail/material/MaterialTabScreen.kt index 08469faa..0bfa0e78 100644 --- a/app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/detail/material/MaterialTabScreen.kt +++ b/app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/detail/material/MaterialTabScreen.kt @@ -376,7 +376,7 @@ fun MaterialTabScreen( modifier = Modifier.padding(16.dp) ) Text( - text = hint, + text = hint.takeIf { it.isNotEmpty() } ?: stringResource(R.string.txt_no_hint), style = typography.bodyMedium.copy( color = colorScheme.onSurface, ), @@ -404,7 +404,8 @@ fun MaterialTabScreen( modifier = Modifier.padding(16.dp) ) Text( - text = explanation, + text = explanation.takeIf { it.isNotEmpty() } + ?: stringResource(R.string.txt_no_explanation), style = typography.bodyMedium.copy( color = colorScheme.onSurface, ), diff --git a/app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/studies/write/LearnByWriteScreen.kt b/app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/studies/write/LearnByWriteScreen.kt index 199d3049..c84864f9 100644 --- a/app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/studies/write/LearnByWriteScreen.kt +++ b/app/src/main/java/com/pwhs/quickmem/presentation/app/study_set/studies/write/LearnByWriteScreen.kt @@ -196,6 +196,9 @@ fun LearnByWrite( } } var isDontKnowButtonVisible by remember { mutableStateOf(false) } + val revealCount = remember { mutableIntStateOf(0) } + val maxRevealCount = writeQuestion?.term?.length ?: 0 + val revealedIndices = remember { mutableSetOf() } LaunchedEffect(writeQuestion) { isDontKnowButtonVisible = false @@ -393,6 +396,8 @@ fun LearnByWrite( debounceJob?.cancel() debounceJob = scope.launch { delay(500) + revealCount.intValue = 0 + revealedIndices.clear() onSubmitAnswer( writeQuestion?.id ?: "", WriteStatus.SKIPPED, @@ -469,6 +474,8 @@ fun LearnByWrite( debounceJob?.cancel() debounceJob = scope.launch { delay(500) + revealCount.intValue = 0 + revealedIndices.clear() if (userAnswer.isNotEmpty() && isAnswerCorrect( userAnswer, writeQuestion?.term ?: "" @@ -538,9 +545,6 @@ fun LearnByWrite( } ) } - val revealCount = remember { mutableIntStateOf(0) } - val maxRevealCount = writeQuestion?.term?.length ?: 0 - val revealedIndices = remember { mutableSetOf() } fun generateHint(answer: String, revealCount: Int): String { val indices = answer.indices.filter { answer[it] != ' ' && it !in revealedIndices } @@ -677,7 +681,7 @@ fun LearnByWrite( Button( onClick = { if (revealCount.intValue < maxRevealCount) { - revealCount.value += 1 + revealCount.intValue += 1 } }, enabled = revealCount.intValue < maxRevealCount, diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index e96c9752..21b806ac 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -320,7 +320,7 @@ Thêm thành viên để chia sẻ với lớp của bạn. Thêm thành viên Thêm bộ học mới vào lớp - Lớp này chưa có bộ học nào + Lớp này chưa có bộ học nào Thêm các bộ flashcard để chia sẻ với lớp của bạn. Thêm bộ học Thành viên @@ -623,4 +623,7 @@ Vui lòng nhập từ khóa để tìm kiếm hình ảnh Nhập từ thư viện Tìm kiếm hình ảnh + Thẻ chưa có gợi ý + Thẻ chưa có giải thích + Không tìm thấy thành viên nào \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index eeca2994..cd2489ba 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -322,7 +322,7 @@ Add members to share them with your class. Add Members Add new study set to class - This class has no sets + This class has no study sets Add flashcard sets to share them with your class. Add study sets Members @@ -626,4 +626,7 @@ Please enter a keyword to search images Import from gallery Search image + No hint + No explanation + No members found \ No newline at end of file