Merge pull request #6045 from bg172/showOverallDurationInPlaylist
show overall duration of videos in playlist
This commit is contained in:
commit
3c0a200f7b
|
@ -89,6 +89,9 @@ public class PlaylistFragment extends BaseListInfoFragment<StreamInfoItem, Playl
|
|||
|
||||
private MenuItem playlistBookmarkButton;
|
||||
|
||||
private long streamCount;
|
||||
private long playlistOverallDurationSeconds;
|
||||
|
||||
public static PlaylistFragment getInstance(final int serviceId, final String url,
|
||||
final String name) {
|
||||
final PlaylistFragment instance = new PlaylistFragment();
|
||||
|
@ -277,6 +280,12 @@ public class PlaylistFragment extends BaseListInfoFragment<StreamInfoItem, Playl
|
|||
animate(headerBinding.uploaderLayout, false, 200);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handleNextItems(final ListExtractor.InfoItemsPage result) {
|
||||
super.handleNextItems(result);
|
||||
setStreamCountAndOverallDuration(result.getItems(), !result.hasNextPage());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handleResult(@NonNull final PlaylistInfo result) {
|
||||
super.handleResult(result);
|
||||
|
@ -322,8 +331,8 @@ public class PlaylistFragment extends BaseListInfoFragment<StreamInfoItem, Playl
|
|||
.into(headerBinding.uploaderAvatarView);
|
||||
}
|
||||
|
||||
headerBinding.playlistStreamCount.setText(Localization
|
||||
.localizeStreamCount(getContext(), result.getStreamCount()));
|
||||
streamCount = result.getStreamCount();
|
||||
setStreamCountAndOverallDuration(result.getRelatedItems(), !result.hasNextPage());
|
||||
|
||||
final Description description = result.getDescription();
|
||||
if (description != null && description != Description.EMPTY_DESCRIPTION
|
||||
|
@ -486,4 +495,20 @@ public class PlaylistFragment extends BaseListInfoFragment<StreamInfoItem, Playl
|
|||
playlistBookmarkButton.setIcon(drawable);
|
||||
playlistBookmarkButton.setTitle(titleRes);
|
||||
}
|
||||
|
||||
private void setStreamCountAndOverallDuration(final List<StreamInfoItem> list,
|
||||
final boolean isDurationComplete) {
|
||||
if (activity != null && headerBinding != null) {
|
||||
playlistOverallDurationSeconds += list.stream()
|
||||
.mapToLong(x -> x.getDuration())
|
||||
.sum();
|
||||
headerBinding.playlistStreamCount.setText(
|
||||
Localization.concatenateStrings(
|
||||
Localization.localizeStreamCount(activity, streamCount),
|
||||
Localization.getDurationString(playlistOverallDurationSeconds,
|
||||
isDurationComplete))
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -502,7 +502,7 @@ public class LocalPlaylistFragment extends BaseLocalListFragment<List<PlaylistSt
|
|||
}
|
||||
|
||||
final long videoCount = itemListAdapter.getItemsList().size();
|
||||
setVideoCount(videoCount);
|
||||
setStreamCountAndOverallDuration(itemListAdapter.getItemsList());
|
||||
if (videoCount == 0) {
|
||||
showEmptyState();
|
||||
}
|
||||
|
@ -532,7 +532,7 @@ public class LocalPlaylistFragment extends BaseLocalListFragment<List<PlaylistSt
|
|||
itemsList.getLayoutManager().onRestoreInstanceState(itemsListState);
|
||||
itemsListState = null;
|
||||
}
|
||||
setVideoCount(itemListAdapter.getItemsList().size());
|
||||
setStreamCountAndOverallDuration(itemListAdapter.getItemsList());
|
||||
|
||||
PlayButtonHelper.initPlaylistControlClickListener(activity, playlistControlBinding, this);
|
||||
|
||||
|
@ -665,7 +665,7 @@ public class LocalPlaylistFragment extends BaseLocalListFragment<List<PlaylistSt
|
|||
.subscribe(itemsToKeep -> {
|
||||
itemListAdapter.clearStreamItemList();
|
||||
itemListAdapter.addItems(itemsToKeep);
|
||||
setVideoCount(itemListAdapter.getItemsList().size());
|
||||
setStreamCountAndOverallDuration(itemListAdapter.getItemsList());
|
||||
saveChanges();
|
||||
|
||||
hideLoading();
|
||||
|
@ -684,7 +684,7 @@ public class LocalPlaylistFragment extends BaseLocalListFragment<List<PlaylistSt
|
|||
updateThumbnailUrl();
|
||||
}
|
||||
|
||||
setVideoCount(itemListAdapter.getItemsList().size());
|
||||
setStreamCountAndOverallDuration(itemListAdapter.getItemsList());
|
||||
saveChanges();
|
||||
}
|
||||
|
||||
|
@ -855,10 +855,20 @@ public class LocalPlaylistFragment extends BaseLocalListFragment<List<PlaylistSt
|
|||
this.name = !TextUtils.isEmpty(title) ? title : "";
|
||||
}
|
||||
|
||||
private void setVideoCount(final long count) {
|
||||
private void setStreamCountAndOverallDuration(final ArrayList<LocalItem> itemsList) {
|
||||
if (activity != null && headerBinding != null) {
|
||||
headerBinding.playlistStreamCount.setText(Localization
|
||||
.localizeStreamCount(activity, count));
|
||||
final long streamCount = itemsList.size();
|
||||
final long playlistOverallDurationSeconds = itemsList.stream()
|
||||
.filter(PlaylistStreamEntry.class::isInstance)
|
||||
.map(PlaylistStreamEntry.class::cast)
|
||||
.map(PlaylistStreamEntry::getStreamEntity)
|
||||
.mapToLong(StreamEntity::getDuration)
|
||||
.sum();
|
||||
headerBinding.playlistStreamCount.setText(
|
||||
Localization.concatenateStrings(
|
||||
Localization.localizeStreamCount(activity, streamCount),
|
||||
Localization.getDurationString(playlistOverallDurationSeconds))
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -238,7 +238,25 @@ public final class Localization {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a readable text for a duration in the format {@code days:hours:minutes:seconds}.
|
||||
* Prepended zeros are removed.
|
||||
* @param duration the duration in seconds
|
||||
* @return a formatted duration String or {@code 0:00} if the duration is zero.
|
||||
*/
|
||||
public static String getDurationString(final long duration) {
|
||||
return getDurationString(duration, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a readable text for a duration in the format {@code days:hours:minutes:seconds+}.
|
||||
* Prepended zeros are removed. If the given duration is incomplete, a plus is appended to the
|
||||
* duration string.
|
||||
* @param duration the duration in seconds
|
||||
* @param isDurationComplete whether the given duration is complete or whether info is missing
|
||||
* @return a formatted duration String or {@code 0:00} if the duration is zero.
|
||||
*/
|
||||
public static String getDurationString(final long duration, final boolean isDurationComplete) {
|
||||
final String output;
|
||||
|
||||
final long days = duration / (24 * 60 * 60L); /* greater than a day */
|
||||
|
@ -256,7 +274,8 @@ public final class Localization {
|
|||
} else {
|
||||
output = String.format(Locale.US, "%d:%02d", minutes, seconds);
|
||||
}
|
||||
return output;
|
||||
final String durationPostfix = isDurationComplete ? "" : "+";
|
||||
return output + durationPostfix;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Reference in New Issue