summaryrefslogtreecommitdiff
path: root/ui/statistics
diff options
context:
space:
mode:
authorByteHamster <ByteHamster@users.noreply.github.com>2024-02-25 14:01:03 +0100
committerGitHub <noreply@github.com>2024-02-25 14:01:03 +0100
commit82c93bf7ee3d91395533068fdfe640dfa53113fe (patch)
tree83beaea8826b94adc181b9f3643e3b6a2c2fe603 /ui/statistics
parentef4af0d29d6742fe07e32971b55a1236f8ad08ab (diff)
downloadAntennaPod-82c93bf7ee3d91395533068fdfe640dfa53113fe.zip
Guess next episode release date (#6925)
Diffstat (limited to 'ui/statistics')
-rw-r--r--ui/statistics/src/main/java/de/danoeh/antennapod/ui/statistics/feed/FeedStatisticsFragment.java92
-rw-r--r--ui/statistics/src/main/res/layout/feed_statistics.xml31
2 files changed, 121 insertions, 2 deletions
diff --git a/ui/statistics/src/main/java/de/danoeh/antennapod/ui/statistics/feed/FeedStatisticsFragment.java b/ui/statistics/src/main/java/de/danoeh/antennapod/ui/statistics/feed/FeedStatisticsFragment.java
index 1aeeb8fa9..a7916ac5a 100644
--- a/ui/statistics/src/main/java/de/danoeh/antennapod/ui/statistics/feed/FeedStatisticsFragment.java
+++ b/ui/statistics/src/main/java/de/danoeh/antennapod/ui/statistics/feed/FeedStatisticsFragment.java
@@ -2,6 +2,7 @@ package de.danoeh.antennapod.ui.statistics.feed;
import android.os.Bundle;
import android.text.format.Formatter;
+import android.util.Pair;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -11,13 +12,23 @@ import androidx.fragment.app.Fragment;
import de.danoeh.antennapod.core.storage.DBReader;
import de.danoeh.antennapod.core.storage.StatisticsItem;
import de.danoeh.antennapod.core.util.Converter;
+import de.danoeh.antennapod.core.util.DateFormatter;
+import de.danoeh.antennapod.core.util.ReleaseScheduleGuesser;
+import de.danoeh.antennapod.model.feed.FeedItem;
+import de.danoeh.antennapod.model.feed.FeedItemFilter;
+import de.danoeh.antennapod.model.feed.SortOrder;
+import de.danoeh.antennapod.ui.statistics.R;
import de.danoeh.antennapod.ui.statistics.databinding.FeedStatisticsBinding;
import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;
+import java.util.ArrayList;
+import java.util.Calendar;
import java.util.Collections;
+import java.util.Date;
+import java.util.List;
import java.util.Locale;
public class FeedStatisticsFragment extends Fragment {
@@ -66,7 +77,17 @@ public class FeedStatisticsFragment extends Fragment {
for (StatisticsItem statisticsItem : statisticsData.feedTime) {
if (statisticsItem.feed.getId() == feedId) {
- return statisticsItem;
+ List<FeedItem> items = DBReader.getFeedItemList(statisticsItem.feed,
+ FeedItemFilter.unfiltered(), SortOrder.DATE_OLD_NEW);
+ List<Date> dates = new ArrayList<>();
+ for (FeedItem item : items) {
+ dates.add(item.getPubDate());
+ }
+ ReleaseScheduleGuesser.Guess guess = null;
+ if (dates.size() > 1) {
+ guess = ReleaseScheduleGuesser.performGuess(dates);
+ }
+ return new Pair<>(statisticsItem, guess);
}
}
return null;
@@ -76,13 +97,80 @@ public class FeedStatisticsFragment extends Fragment {
.subscribe(this::showStats, Throwable::printStackTrace);
}
- private void showStats(StatisticsItem s) {
+ private String getReadableDay(int day) {
+ switch (day) {
+ case Calendar.MONDAY:
+ return getString(R.string.release_schedule_monday);
+ case Calendar.TUESDAY:
+ return getString(R.string.release_schedule_tuesday);
+ case Calendar.WEDNESDAY:
+ return getString(R.string.release_schedule_wednesday);
+ case Calendar.THURSDAY:
+ return getString(R.string.release_schedule_thursday);
+ case Calendar.FRIDAY:
+ return getString(R.string.release_schedule_friday);
+ case Calendar.SATURDAY:
+ return getString(R.string.release_schedule_saturday);
+ case Calendar.SUNDAY:
+ return getString(R.string.release_schedule_sunday);
+ default:
+ return "error";
+ }
+ }
+
+ private String getReadableSchedule(ReleaseScheduleGuesser.Guess guess) {
+ switch (guess.schedule) {
+ case DAILY:
+ return getString(R.string.release_schedule_daily);
+ case WEEKDAYS:
+ return getString(R.string.release_schedule_weekdays);
+ case WEEKLY:
+ return getString(R.string.release_schedule_weekly) + ", " + getReadableDay(guess.days.get(0));
+ case BIWEEKLY:
+ return getString(R.string.release_schedule_biweekly) + ", " + getReadableDay(guess.days.get(0));
+ case MONTHLY:
+ return getString(R.string.release_schedule_monthly);
+ case FOURWEEKLY:
+ return getString(R.string.release_schedule_monthly) + ", " + getReadableDay(guess.days.get(0));
+ case SPECIFIC_DAYS:
+ StringBuilder days = new StringBuilder();
+ for (int i = 0; i < guess.days.size(); i++) {
+ if (i != 0) {
+ days.append(", ");
+ }
+ days.append(getReadableDay(guess.days.get(i)));
+ }
+ return days.toString();
+ default:
+ return getString(R.string.statistics_expected_next_episode_unknown);
+ }
+ }
+
+ private void showStats(Pair<StatisticsItem, ReleaseScheduleGuesser.Guess> p) {
+ StatisticsItem s = p.first;
viewBinding.startedTotalLabel.setText(String.format(Locale.getDefault(), "%d / %d",
s.episodesStarted, s.episodes));
viewBinding.timePlayedLabel.setText(Converter.shortLocalizedDuration(getContext(), s.timePlayed));
viewBinding.totalDurationLabel.setText(Converter.shortLocalizedDuration(getContext(), s.time));
viewBinding.onDeviceLabel.setText(String.format(Locale.getDefault(), "%d", s.episodesDownloadCount));
viewBinding.spaceUsedLabel.setText(Formatter.formatShortFileSize(getContext(), s.totalDownloadSize));
+
+ ReleaseScheduleGuesser.Guess guess = p.second;
+ if (!s.feed.getPreferences().getKeepUpdated()) {
+ viewBinding.expectedNextEpisodeLabel.setText(R.string.updates_disabled_label);
+ } else if (guess == null || guess.nextExpectedDate.getTime() <= new Date().getTime() - 7 * 24 * 3600000L) {
+ // More than 30 days delayed
+ viewBinding.expectedNextEpisodeLabel.setText(R.string.statistics_expected_next_episode_unknown);
+ } else {
+ String text = DateFormatter.formatAbbrev(getContext(), guess.nextExpectedDate);
+ if (guess.nextExpectedDate.getTime() <= new Date().getTime()) {
+ text = getString(R.string.statistics_expected_next_episode_any_day);
+ }
+ if (guess.schedule != ReleaseScheduleGuesser.Schedule.UNKNOWN) {
+ text += " (" + getReadableSchedule(guess) + ")";
+ }
+ viewBinding.expectedNextEpisodeLabel.setText(text);
+ }
}
@Override
diff --git a/ui/statistics/src/main/res/layout/feed_statistics.xml b/ui/statistics/src/main/res/layout/feed_statistics.xml
index 6b9a7fa4c..78630758f 100644
--- a/ui/statistics/src/main/res/layout/feed_statistics.xml
+++ b/ui/statistics/src/main/res/layout/feed_statistics.xml
@@ -11,12 +11,14 @@
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:layout_weight="1"
android:text="@string/statistics_episodes_started_total" />
<com.joanzapata.iconify.widget.IconTextView
android:id="@+id/startedTotalLabel"
android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:layout_weight="1"
android:layout_marginLeft="8dp"
android:layout_marginStart="8dp"
android:text="@string/wait_icon"
@@ -29,12 +31,14 @@
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:layout_weight="1"
android:text="@string/statistics_time_played" />
<com.joanzapata.iconify.widget.IconTextView
android:id="@+id/timePlayedLabel"
android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:layout_weight="1"
android:layout_marginLeft="8dp"
android:layout_marginStart="8dp"
android:text="@string/wait_icon"
@@ -48,12 +52,14 @@
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:layout_weight="1"
android:text="@string/statistics_total_duration" />
<com.joanzapata.iconify.widget.IconTextView
android:id="@+id/totalDurationLabel"
android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:layout_weight="1"
android:layout_marginLeft="8dp"
android:layout_marginStart="8dp"
android:text="@string/wait_icon"
@@ -66,12 +72,14 @@
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:layout_weight="1"
android:text="@string/statistics_episodes_on_device" />
<com.joanzapata.iconify.widget.IconTextView
android:id="@+id/onDeviceLabel"
android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:layout_weight="1"
android:layout_marginLeft="8dp"
android:layout_marginStart="8dp"
android:text="@string/wait_icon"
@@ -84,12 +92,14 @@
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:layout_weight="1"
android:text="@string/statistics_space_used" />
<com.joanzapata.iconify.widget.IconTextView
android:id="@+id/spaceUsedLabel"
android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:layout_weight="1"
android:layout_marginLeft="8dp"
android:layout_marginStart="8dp"
android:text="@string/wait_icon"
@@ -97,4 +107,25 @@
</TableRow>
+ <TableRow>
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:text="@string/statistics_expected_next_episode" />
+
+ <com.joanzapata.iconify.widget.IconTextView
+ android:id="@+id/expectedNextEpisodeLabel"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:layout_marginLeft="8dp"
+ android:layout_marginStart="8dp"
+ android:lines="2"
+ android:text="@string/wait_icon"
+ tools:text="Jan 1st (weekly)" />
+
+ </TableRow>
+
</TableLayout>