From a0e8b2e083073097d606cfc0edb0a740db534f88 Mon Sep 17 00:00:00 2001 From: "L(a)iteral-Shift" <260316181+Cellulose-Type-C@users.noreply.github.com> Date: Sat, 21 Mar 2026 11:06:49 +0530 Subject: [PATCH] Use contrast background for history date headers --- .../org/schabi/newpipe/database/LocalItem.kt | 4 +- .../database/history/model/DateHeaderItem.kt | 11 +++++ .../newpipe/local/LocalItemListAdapter.java | 37 ++++++++++++++++- .../history/StatisticsPlaylistFragment.java | 41 +++++++++++++++++-- .../LocalStatisticStreamItemHolder.java | 6 +-- .../main/res/layout/list_date_header_item.xml | 10 +++++ 6 files changed, 99 insertions(+), 10 deletions(-) create mode 100644 app/src/main/java/org/schabi/newpipe/database/history/model/DateHeaderItem.kt create mode 100644 app/src/main/res/layout/list_date_header_item.xml diff --git a/app/src/main/java/org/schabi/newpipe/database/LocalItem.kt b/app/src/main/java/org/schabi/newpipe/database/LocalItem.kt index 944b247bff..b917c7e7c8 100644 --- a/app/src/main/java/org/schabi/newpipe/database/LocalItem.kt +++ b/app/src/main/java/org/schabi/newpipe/database/LocalItem.kt @@ -14,6 +14,8 @@ interface LocalItem { PLAYLIST_REMOTE_ITEM, PLAYLIST_STREAM_ITEM, - STATISTIC_STREAM_ITEM + STATISTIC_STREAM_ITEM, + + DATE_HEADER } } diff --git a/app/src/main/java/org/schabi/newpipe/database/history/model/DateHeaderItem.kt b/app/src/main/java/org/schabi/newpipe/database/history/model/DateHeaderItem.kt new file mode 100644 index 0000000000..0e40a97c60 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/database/history/model/DateHeaderItem.kt @@ -0,0 +1,11 @@ +package org.schabi.newpipe.database.history.model + +import java.time.LocalDate +import org.schabi.newpipe.database.LocalItem + +data class DateHeaderItem( + val date: LocalDate +) : LocalItem { + override val localItemType: LocalItem.LocalItemType + get() = LocalItem.LocalItemType.DATE_HEADER +} diff --git a/app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java b/app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java index 6bbe536e3d..dff93ad978 100644 --- a/app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java +++ b/app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java @@ -2,15 +2,19 @@ import android.content.Context; import android.util.Log; +import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.RecyclerView; +import org.schabi.newpipe.R; import org.schabi.newpipe.database.LocalItem; +import org.schabi.newpipe.database.history.model.DateHeaderItem; import org.schabi.newpipe.database.stream.model.StreamStateEntity; import org.schabi.newpipe.info_list.ItemViewMode; import org.schabi.newpipe.local.history.HistoryRecordManager; @@ -66,6 +70,8 @@ public class LocalItemListAdapter extends RecyclerView.Adapter processResult(final List results) { + private List processResult(final List results) { final Comparator comparator; switch (sortMode) { case LAST_PLAYED: @@ -77,8 +79,26 @@ private List processResult(final List(results); + } + + final List itemsWithHeaders = new ArrayList<>(results.size()); + LocalDate lastDate = null; + + for (final StreamStatisticsEntry entry : results) { + final LocalDate entryDate = entry.getLatestAccessDate().toLocalDate(); + if (!entryDate.equals(lastDate)) { + itemsWithHeaders.add(new DateHeaderItem(entryDate)); + lastDate = entryDate; + } + itemsWithHeaders.add(entry); + } + + return itemsWithHeaders; } /////////////////////////////////////////////////////////////////////////// @@ -314,7 +334,22 @@ private void toggleSortMode() { } private PlayQueue getPlayQueueStartingAt(final StreamStatisticsEntry infoItem) { - return getPlayQueue(Math.max(itemListAdapter.getItemsList().indexOf(infoItem), 0)); + if (itemListAdapter == null) { + return new SinglePlayQueue(Collections.emptyList(), 0); + } + + final List items = itemListAdapter.getItemsList(); + int streamIndex = 0; + for (final LocalItem item : items) { + if (item == infoItem) { + break; + } + if (item instanceof StreamStatisticsEntry) { + streamIndex++; + } + } + + return getPlayQueue(streamIndex); } private void showInfoItemDialog(final StreamStatisticsEntry item) { diff --git a/app/src/main/java/org/schabi/newpipe/local/holder/LocalStatisticStreamItemHolder.java b/app/src/main/java/org/schabi/newpipe/local/holder/LocalStatisticStreamItemHolder.java index f26a76ad9f..8d47e3a092 100644 --- a/app/src/main/java/org/schabi/newpipe/local/holder/LocalStatisticStreamItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/local/holder/LocalStatisticStreamItemHolder.java @@ -69,12 +69,10 @@ public LocalStatisticStreamItemHolder(final LocalItemBuilder itemBuilder, itemProgressView = itemView.findViewById(R.id.itemProgressView); } - private String getStreamInfoDetailLine(final StreamStatisticsEntry entry, - final DateTimeFormatter dateTimeFormatter) { + private String getStreamInfoDetailLine(final StreamStatisticsEntry entry) { return Localization.concatenateStrings( // watchCount Localization.shortViewCount(itemBuilder.getContext(), entry.getWatchCount()), - dateTimeFormatter.format(entry.getLatestAccessDate()), // serviceName ServiceHelper.getNameOfServiceById(entry.getStreamEntity().getServiceId())); } @@ -113,7 +111,7 @@ public void updateFromItem(final LocalItem localItem, } if (itemAdditionalDetails != null) { - itemAdditionalDetails.setText(getStreamInfoDetailLine(item, dateTimeFormatter)); + itemAdditionalDetails.setText(getStreamInfoDetailLine(item)); } // Default thumbnail is shown on error, while loading and if the url is empty diff --git a/app/src/main/res/layout/list_date_header_item.xml b/app/src/main/res/layout/list_date_header_item.xml new file mode 100644 index 0000000000..e60cf25bea --- /dev/null +++ b/app/src/main/res/layout/list_date_header_item.xml @@ -0,0 +1,10 @@ + +