Skip to content

Commit 076f63d

Browse files
Extract string, refactor ItemList
1 parent 07cd1d4 commit 076f63d

4 files changed

Lines changed: 41 additions & 53 deletions

File tree

app/src/main/java/org/schabi/newpipe/ui/components/items/ItemList.kt

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
package org.schabi.newpipe.ui.components.items
22

33
import androidx.compose.foundation.lazy.LazyColumn
4-
import androidx.compose.foundation.lazy.LazyListScope
54
import androidx.compose.foundation.lazy.grid.GridCells
6-
import androidx.compose.foundation.lazy.grid.LazyGridScope
5+
import androidx.compose.foundation.lazy.grid.GridItemSpan
76
import androidx.compose.foundation.lazy.grid.LazyVerticalGrid
87
import androidx.compose.foundation.lazy.grid.rememberLazyGridState
98
import androidx.compose.foundation.lazy.rememberLazyListState
@@ -19,6 +18,7 @@ import androidx.compose.ui.platform.LocalContext
1918
import androidx.compose.ui.platform.rememberNestedScrollInteropConnection
2019
import androidx.compose.ui.res.stringResource
2120
import androidx.compose.ui.unit.dp
21+
import androidx.paging.LoadState
2222
import androidx.paging.compose.LazyPagingItems
2323
import androidx.preference.PreferenceManager
2424
import androidx.window.core.layout.WindowWidthSizeClass
@@ -35,15 +35,16 @@ import org.schabi.newpipe.ui.components.items.playlist.PlaylistListItem
3535
import org.schabi.newpipe.ui.components.items.stream.StreamCardItem
3636
import org.schabi.newpipe.ui.components.items.stream.StreamGridItem
3737
import org.schabi.newpipe.ui.components.items.stream.StreamListItem
38+
import org.schabi.newpipe.ui.emptystate.EmptyStateComposable
39+
import org.schabi.newpipe.ui.emptystate.EmptyStateSpec
3840
import org.schabi.newpipe.util.DependentPreferenceHelper
3941
import org.schabi.newpipe.util.NavigationHelper
4042

4143
@Composable
4244
fun ItemList(
4345
items: LazyPagingItems<out InfoItem>,
4446
mode: ItemViewMode = determineItemViewMode(),
45-
gridHeader: LazyGridScope.() -> Unit = {},
46-
listHeader: LazyListScope.() -> Unit = {}
47+
header: @Composable () -> Unit = {}
4748
) {
4849
val context = LocalContext.current
4950
val onClick = remember {
@@ -76,7 +77,9 @@ fun ItemList(
7677
val showProgress = DependentPreferenceHelper.getPositionsInListsEnabled(context)
7778
val nestedScrollModifier = Modifier.nestedScroll(rememberNestedScrollInteropConnection())
7879

79-
if (mode == ItemViewMode.GRID) {
80+
if (items.loadState.refresh is LoadState.NotLoading && items.itemCount == 0) {
81+
EmptyStateComposable(EmptyStateSpec.NoVideos)
82+
} else if (mode == ItemViewMode.GRID) {
8083
val gridState = rememberLazyGridState()
8184

8285
LazyVerticalGridScrollbar(state = gridState, settings = defaultThemedScrollbarSettings()) {
@@ -85,7 +88,9 @@ fun ItemList(
8588
val minSize = if (isCompact) 150.dp else 250.dp
8689

8790
LazyVerticalGrid(state = gridState, columns = GridCells.Adaptive(minSize)) {
88-
gridHeader()
91+
item(span = { GridItemSpan(maxLineSpan) }) {
92+
header()
93+
}
8994

9095
items(items.itemCount) {
9196
val item = items[it]!!
@@ -104,7 +109,9 @@ fun ItemList(
104109

105110
LazyColumnThemedScrollbar(state = state) {
106111
LazyColumn(modifier = nestedScrollModifier, state = state) {
107-
listHeader()
112+
item {
113+
header()
114+
}
108115

109116
items(items.itemCount) {
110117
val item = items[it]!!

app/src/main/java/org/schabi/newpipe/ui/components/video/RelatedItems.kt

Lines changed: 21 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,6 @@ import org.schabi.newpipe.extractor.stream.StreamType
3030
import org.schabi.newpipe.info_list.ItemViewMode
3131
import org.schabi.newpipe.ui.components.items.ItemList
3232
import org.schabi.newpipe.ui.components.items.stream.StreamInfoItem
33-
import org.schabi.newpipe.ui.emptystate.EmptyStateComposable
34-
import org.schabi.newpipe.ui.emptystate.EmptyStateSpec
3533
import org.schabi.newpipe.ui.theme.AppTheme
3634
import org.schabi.newpipe.util.NO_SERVICE_ID
3735

@@ -47,37 +45,30 @@ fun RelatedItems(info: StreamInfo) {
4745
ItemList(
4846
items = flowOf(PagingData.from(info.relatedItems)).collectAsLazyPagingItems(),
4947
mode = ItemViewMode.LIST,
50-
listHeader = {
51-
item {
48+
header = {
49+
Row(
50+
modifier = Modifier
51+
.fillMaxWidth()
52+
.padding(start = 12.dp, end = 12.dp),
53+
horizontalArrangement = Arrangement.SpaceBetween,
54+
verticalAlignment = Alignment.CenterVertically,
55+
) {
56+
Text(text = stringResource(R.string.auto_queue_description))
57+
5258
Row(
53-
modifier = Modifier
54-
.fillMaxWidth()
55-
.padding(start = 12.dp, end = 12.dp),
56-
horizontalArrangement = Arrangement.SpaceBetween,
57-
verticalAlignment = Alignment.CenterVertically,
59+
horizontalArrangement = Arrangement.spacedBy(4.dp),
60+
verticalAlignment = Alignment.CenterVertically
5861
) {
59-
Text(text = stringResource(R.string.auto_queue_description))
60-
61-
Row(
62-
horizontalArrangement = Arrangement.spacedBy(4.dp),
63-
verticalAlignment = Alignment.CenterVertically
64-
) {
65-
Text(text = stringResource(R.string.auto_queue_toggle))
66-
Switch(
67-
checked = isAutoQueueEnabled,
68-
onCheckedChange = {
69-
isAutoQueueEnabled = it
70-
sharedPreferences.edit {
71-
putBoolean(key, it)
72-
}
62+
Text(text = stringResource(R.string.auto_queue_toggle))
63+
Switch(
64+
checked = isAutoQueueEnabled,
65+
onCheckedChange = {
66+
isAutoQueueEnabled = it
67+
sharedPreferences.edit {
68+
putBoolean(key, it)
7369
}
74-
)
75-
}
76-
}
77-
}
78-
if (info.relatedItems.isEmpty()) {
79-
item {
80-
EmptyStateComposable(EmptyStateSpec.NoVideos)
70+
}
71+
)
8172
}
8273
}
8374
}

app/src/main/java/org/schabi/newpipe/ui/screens/PlaylistScreen.kt

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,21 @@
11
package org.schabi.newpipe.ui.screens
22

33
import android.content.res.Configuration
4-
import androidx.compose.foundation.lazy.grid.GridItemSpan
54
import androidx.compose.material3.MaterialTheme
65
import androidx.compose.material3.Surface
76
import androidx.compose.runtime.Composable
87
import androidx.compose.runtime.derivedStateOf
98
import androidx.compose.runtime.getValue
109
import androidx.compose.runtime.remember
10+
import androidx.compose.ui.res.stringResource
1111
import androidx.compose.ui.tooling.preview.Preview
1212
import androidx.lifecycle.compose.collectAsStateWithLifecycle
1313
import androidx.lifecycle.viewmodel.compose.viewModel
1414
import androidx.paging.PagingData
1515
import androidx.paging.compose.collectAsLazyPagingItems
1616
import kotlinx.coroutines.flow.Flow
1717
import kotlinx.coroutines.flow.flowOf
18+
import org.schabi.newpipe.R
1819
import org.schabi.newpipe.extractor.stream.Description
1920
import org.schabi.newpipe.extractor.stream.StreamInfoItem
2021
import org.schabi.newpipe.extractor.stream.StreamType
@@ -52,23 +53,11 @@ private fun PlaylistScreen(
5253
// items can be loaded.
5354
val totalDuration by remember {
5455
derivedStateOf {
55-
streams.itemSnapshotList.sumOf { it!!.duration }
56+
streams.itemSnapshotList.sumOf { it?.duration ?: 0 }
5657
}
5758
}
5859

59-
ItemList(
60-
items = streams,
61-
gridHeader = {
62-
item(span = { GridItemSpan(maxLineSpan) }) {
63-
PlaylistHeader(info, totalDuration)
64-
}
65-
},
66-
listHeader = {
67-
item {
68-
PlaylistHeader(info, totalDuration)
69-
}
70-
}
71-
)
60+
ItemList(streams, header = { PlaylistHeader(info, totalDuration) })
7261
}
7362

7463
is Resource.Loading -> {
@@ -79,7 +68,7 @@ private fun PlaylistScreen(
7968
// TODO use error panel instead
8069
EmptyStateComposable(
8170
EmptyStateSpec.DisabledComments.copy(
82-
descriptionText = { "Could not load streams" }
71+
descriptionText = { stringResource(R.string.error_unable_to_load_streams) },
8372
)
8473
)
8574
}

app/src/main/res/values/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -859,6 +859,7 @@
859859
<string name="import_settings_vulnerable_format">The settings in the export being imported use a vulnerable format that was deprecated since NewPipe 0.27.0. Make sure the export being imported is from a trusted source, and prefer using only exports obtained from NewPipe 0.27.0 or newer in the future. Support for importing settings in this vulnerable format will soon be removed completely, and then old versions of NewPipe will not be able to import settings of exports from new versions anymore.</string>
860860
<string name="auto_queue_description">Next</string>
861861
<string name="newpipe_extractor_description">NewPipeExtractor is a library for extracting things from streaming sites. It is a core component of NewPipe, but could be used independently.</string>
862+
<string name="error_unable_to_load_streams">Could not load streams</string>
862863
<plurals name="comments">
863864
<item quantity="one">%d comment</item>
864865
<item quantity="other">%d comments</item>

0 commit comments

Comments
 (0)