Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,8 @@ class MainActivity : ComponentActivity() {
variantViewModel.username = username
variantViewModel.password = password
},
onToggleFiltering = { toggle -> variantViewModel.toggleFiltering(toggle) },
onUpdateFilterText = { text -> variantViewModel.updateFilterText(text) },
)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,8 @@ fun HomeView(
username: String,
password: String,
onLoadDirectory: (String, Boolean) -> Unit,
onToggleFiltering: (Boolean) -> Unit,
onUpdateFilterText: (String) -> Unit,
onDownloadFile: (String, String) -> Unit,
onReadComicBook: (ComicBook?) -> Unit,
onSetSelectionMode: (Boolean) -> Unit,
Expand Down Expand Up @@ -128,6 +130,8 @@ fun HomeView(
onLoadDirectory = { path, reload -> onLoadDirectory(path, reload) },
onDownloadFile = { path, filename -> onDownloadFile(path, filename) },
modifier = Modifier.fillMaxSize(),
onToggleFiltering = onToggleFiltering,
onUpdateFilterText = onUpdateFilterText,
)

AppDestination.SETTINGS ->
Expand All @@ -139,8 +143,8 @@ fun HomeView(
Log.info(
TAG,
"Updating server settings: address=${address} username=${username} password=${
password.first()
}*****",
password.first()
}*****",
)
onSaveSettings(address, username, password)
currentDestination = AppDestination.COMICS
Expand All @@ -160,14 +164,16 @@ fun HomeViewPreview() {
HomeView(
COMIC_BOOK_LIST.get(0),
COMIC_BOOK_LIST,
BrowsingState("", "", "", listOf(), listOf()),
BrowsingState("", "", false, "", "", listOf(), listOf()),
false,
false,
listOf(),
"http://www.comixedproject.org:7171",
"reader@comixedproject.org",
"my!password",
onLoadDirectory = { _, _ -> },
onToggleFiltering = {},
onUpdateFilterText = {},
onDownloadFile = { _, _ -> },
onReadComicBook = { _ -> },
onSetSelectionMode = { _ -> },
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,14 +29,12 @@ import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.pluralStringResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import org.comixedproject.variant.android.COMIC_BOOK_LIST
import org.comixedproject.variant.android.R
import org.comixedproject.variant.android.VariantTheme
import org.comixedproject.variant.model.library.ComicBook
import org.comixedproject.variant.platform.Log

private val TAG = "ComicBookListView"

Expand All @@ -55,26 +53,21 @@ fun ComicBookListView(
)
},
content = { padding ->
if (comicBookList.isEmpty()) {
Log.debug(TAG, "No comics to display")
Text(stringResource(R.string.emptyComicListText))
} else {
LazyVerticalStaggeredGrid(
columns = StaggeredGridCells.Adaptive(minSize = 128.dp),
verticalItemSpacing = 4.dp,
horizontalArrangement = Arrangement.spacedBy(4.dp),
content = {
items(comicBookList) { comicBook ->
ComicBookListItemView(
comicBook,
selectionList.contains(comicBook.path),
onClick = { onClick(it) },
)
}
},
modifier = modifier.padding(padding),
)
}
LazyVerticalStaggeredGrid(
columns = StaggeredGridCells.Adaptive(minSize = 128.dp),
verticalItemSpacing = 4.dp,
horizontalArrangement = Arrangement.spacedBy(4.dp),
content = {
items(comicBookList) { comicBook ->
ComicBookListItemView(
comicBook,
selectionList.contains(comicBook.path),
onClick = { onClick(it) },
)
}
},
modifier = modifier.padding(padding),
)
},
modifier = modifier.padding(8.dp),
)
Expand All @@ -85,3 +78,9 @@ fun ComicBookListView(
fun ComicBookListViewPreview() {
VariantTheme { ComicBookListView(COMIC_BOOK_LIST, emptyList(), onClick = {}) }
}

@Composable
@Preview
fun ComicBookListViewPreviewWithOneComics() {
VariantTheme { ComicBookListView(listOf(COMIC_BOOK_LIST[0]), emptyList(), onClick = {}) }
}
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ fun ComicBookViewPreview() {

@Composable
@Preview
fun ComicBookViewWithSelectionsPreview() {
fun ComicBookViewPreviewWithSelections() {
VariantTheme {
ComicBookView(
COMIC_BOOK_LIST,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,14 +30,17 @@ import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.material3.TextField
import androidx.compose.material3.pulltorefresh.PullToRefreshBox
import androidx.compose.material3.pulltorefresh.rememberPullToRefreshState
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.intl.Locale
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.text.toLowerCase
import androidx.compose.ui.tooling.preview.Preview
import org.comixedproject.variant.android.DIRECTORY_LIST
import org.comixedproject.variant.android.R
Expand All @@ -49,18 +52,27 @@ import org.comixedproject.variant.platform.Log

private const val TAG = "BrowseServerView"

fun checkFiltering(filterText: String, entry: DirectoryEntry): Boolean {
return entry.title.toLowerCase(Locale.current).contains(filterText) ||
entry.filename.toLowerCase(Locale.current).contains(filterText)
}

@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun BrowseServerView(
path: String,
title: String,
parentPath: String,
filtering: Boolean,
filterText: String,
contents: List<DirectoryEntry>,
comicBookList: List<ComicBook>,
downloadingState: List<DownloadingState>,
loading: Boolean,
onLoadDirectory: (String, Boolean) -> Unit,
onDownloadFile: (String, String) -> Unit,
onToggleFiltering: (Boolean) -> Unit,
onUpdateFilterText: (String) -> Unit,
modifier: Modifier = Modifier,
) {
val pullToRefreshState = rememberPullToRefreshState()
Expand All @@ -78,19 +90,45 @@ fun BrowseServerView(
Icon(painterResource(R.drawable.ic_back), contentDescription = parentPath)
}

val displayedTitle =
when (title.isEmpty()) {
false -> title
true -> stringResource(R.string.rootDirectoryTitle)
}
if (filtering) {
TextField(
value = filterText,
placeholder = { Text(stringResource(R.string.filter_list_placeholder)) },
maxLines = 1,
onValueChange = { text ->
Log.debug(TAG, "Filter text=${text}")
onUpdateFilterText(text)
},
modifier = Modifier.weight(1f),
)
} else {
val displayedTitle =
when (title.isEmpty()) {
false -> title
true -> stringResource(R.string.rootDirectoryTitle)
}

Text(
displayedTitle,
maxLines = 1,
overflow = TextOverflow.Ellipsis,
style = MaterialTheme.typography.headlineMedium,
modifier = Modifier.weight(1f),
)
}

Text(
"${displayedTitle} [${downloadingState.size}]",
maxLines = 1,
overflow = TextOverflow.Ellipsis,
style = MaterialTheme.typography.headlineMedium,
modifier = Modifier.weight(1f),
)
IconButton(
onClick = {
Log.debug(TAG, "Toggle filtering")
onToggleFiltering(!filtering)
},
enabled = !parentPath.isEmpty(),
) {
Icon(
painterResource(R.drawable.ic_filter_text),
contentDescription = stringResource(R.string.filter_list),
)
}
}
},
content = { padding ->
Expand All @@ -100,7 +138,11 @@ fun BrowseServerView(
onRefresh = { onLoadDirectory(path, true) },
content = {
LazyColumn(modifier = Modifier.padding(padding).fillMaxWidth()) {
items(contents) { entry ->
items(
contents.filter {
!filtering || checkFiltering(filterText.toLowerCase(Locale.current), it)
}
) { entry ->
when (entry.isDirectory) {
true ->
DirectoryItemView(
Expand Down Expand Up @@ -128,56 +170,92 @@ fun BrowseServerView(

@Composable
@Preview
fun BrowseServerViewPreviewDirectories() {
fun BrowseServerViewPreviewWithFiles() {
var directory = DIRECTORY_LIST.filter { it.isDirectory }.first()
VariantTheme {
BrowseServerView(
"http://www.comixedproject.org:7171",
directory.title,
directory.parent,
false,
"",
DIRECTORY_LIST.filter { !it.isDirectory },
emptyList(),
emptyList(),
false,
onLoadDirectory = { _, _ -> },
onDownloadFile = { _, _ -> },
onToggleFiltering = {},
onUpdateFilterText = {},
)
}
}

@Composable
@Preview
fun BrowseServerViewPreviewWithDirectories() {
VariantTheme {
BrowseServerView(
"http://www.comixedproject.org:7171",
"",
"",
false,
"",
DIRECTORY_LIST.filter { it.isDirectory },
emptyList(),
emptyList(),
false,
onLoadDirectory = { _, _ -> },
onDownloadFile = { _, _ -> },
onToggleFiltering = {},
onUpdateFilterText = {},
)
}
}

@Composable
@Preview
fun BrowseServerViewPreviewFiles() {
fun BrowseServerViewPreviewRefreshing() {
val directory = DIRECTORY_LIST.get(0)
VariantTheme {
BrowseServerView(
"http://www.comixedproject.org:7171",
directory.title,
directory.parent,
false,
"",
DIRECTORY_LIST.filter { !it.isDirectory },
emptyList(),
emptyList(),
false,
true,
onLoadDirectory = { _, _ -> },
onDownloadFile = { _, _ -> },
onToggleFiltering = {},
onUpdateFilterText = {},
)
}
}

@Composable
@Preview
fun BrowseServerViewPreviewRefreshing() {
fun BrowseServerViewPreviewFiltering() {
val directory = DIRECTORY_LIST.get(0)
val filterText = directory.title.substring(0, 3)
VariantTheme {
BrowseServerView(
"http://www.comixedproject.org:7171",
directory.title,
directory.parent,
DIRECTORY_LIST.filter { !it.isDirectory },
true,
filterText,
DIRECTORY_LIST,
emptyList(),
emptyList(),
true,
onLoadDirectory = { _, _ -> },
onDownloadFile = { _, _ -> },
onToggleFiltering = {},
onUpdateFilterText = {},
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,19 +35,25 @@ fun ServerView(
loading: Boolean,
onLoadDirectory: (String, Boolean) -> Unit,
onDownloadFile: (String, String) -> Unit,
onToggleFiltering: (Boolean) -> Unit,
onUpdateFilterText: (String) -> Unit,
modifier: Modifier = Modifier,
) {
BrowseServerView(
browsingState.currentPath,
browsingState.title,
browsingState.parentPath,
browsingState.filtering,
browsingState.filterText,
browsingState.contents,
comicBookList,
browsingState.downloadingState,
loading,
modifier = modifier,
onLoadDirectory = { path, reload -> onLoadDirectory(path, reload) },
onDownloadFile = { path, filename -> onDownloadFile(path, filename) },
onToggleFiltering = onToggleFiltering,
onUpdateFilterText = onUpdateFilterText,
)
}

Expand All @@ -56,11 +62,13 @@ fun ServerView(
fun ServerViewPreview() {
VariantTheme {
ServerView(
BrowsingState("", "", "", listOf(), listOf()),
BrowsingState("", "", false, "", "", listOf(), listOf()),
COMIC_BOOK_LIST,
false,
onLoadDirectory = { _, _ -> },
onDownloadFile = { _, _ -> },
onToggleFiltering = {},
onUpdateFilterText = {},
)
}
}
Loading