diff --git a/common/src/main/java/com/liskovsoft/smartyoutubetv2/common/app/presenters/BrowsePresenter.java b/common/src/main/java/com/liskovsoft/smartyoutubetv2/common/app/presenters/BrowsePresenter.java index 675f4a05f5..04da0752ca 100644 --- a/common/src/main/java/com/liskovsoft/smartyoutubetv2/common/app/presenters/BrowsePresenter.java +++ b/common/src/main/java/com/liskovsoft/smartyoutubetv2/common/app/presenters/BrowsePresenter.java @@ -2,12 +2,15 @@ import android.annotation.SuppressLint; import android.content.Context; +import android.os.Handler; +import android.os.Looper; import android.text.TextUtils; import androidx.annotation.Nullable; import com.liskovsoft.mediaserviceinterfaces.oauth.Account; import com.liskovsoft.mediaserviceinterfaces.data.MediaGroup; +import com.liskovsoft.mediaserviceinterfaces.data.MediaItem; import com.liskovsoft.sharedutils.helpers.Helpers; import com.liskovsoft.sharedutils.locale.LocaleUtility; import com.liskovsoft.sharedutils.mylogger.Log; @@ -42,6 +45,7 @@ import com.liskovsoft.smartyoutubetv2.common.prefs.AccountsData; import com.liskovsoft.smartyoutubetv2.common.prefs.BlockedChannelData; import com.liskovsoft.smartyoutubetv2.common.prefs.MainUIData; +import com.liskovsoft.smartyoutubetv2.common.prefs.NewVideoCounterData; import com.liskovsoft.smartyoutubetv2.common.prefs.PlayerTweaksData; import com.liskovsoft.smartyoutubetv2.common.utils.Utils; @@ -76,6 +80,15 @@ public class BrowsePresenter extends BasePresenter implements Sectio private long mLastUpdateTimeMs = -1; private int mBootSectionIndex; private int mBootstrapSectionId = -1; + // New video counter fields + private final Handler mCounterResetHandler = new Handler(Looper.getMainLooper()); + private Runnable mCounterResetRunnable; + private Runnable mCounterRefreshRunnable; + // Map: sectionId -> newest known video data (String: timestamp_videoId) from RSS feed + private final Map mCurrentNewestVideoData = new HashMap<>(); + private final Map mPinnedChannelIds = new HashMap<>(); // sectionId -> channelId + private final Map mOriginalTitles = new HashMap<>(); // sectionId -> original title (without counter) + private final List mCounterActions = new ArrayList<>(); private BrowsePresenter(Context context) { super(context); @@ -125,6 +138,18 @@ public void onViewInitialized() { int selectedSectionIndex = findSectionIndex(mCurrentSection != null ? mCurrentSection.getId() : mBootstrapSectionId); mBootstrapSectionId = -1; getView().selectSection(selectedSectionIndex != -1 ? selectedSectionIndex : mBootSectionIndex, true); + + // Start recurring 20-minute counter fetch + if (mCounterRefreshRunnable == null) { + mCounterRefreshRunnable = new Runnable() { + @Override + public void run() { + fetchNewVideoCounts(); + mCounterResetHandler.postDelayed(this, 20 * 60 * 1_000); + } + }; + mCounterResetHandler.postDelayed(mCounterRefreshRunnable, 20 * 60 * 1_000); + } } @Override @@ -292,6 +317,8 @@ public void updateSections() { initPinnedData(); refreshSections(); + + fetchNewVideoCounts(); } private void refreshSections() { @@ -407,6 +434,11 @@ private void updateCategoryType(int categoryId, int categoryType) { @Override public void onViewDestroyed() { super.onViewDestroyed(); + RxHelper.disposeActions(mCounterActions); + if (mCounterRefreshRunnable != null) { + mCounterResetHandler.removeCallbacks(mCounterRefreshRunnable); + mCounterRefreshRunnable = null; + } disposeActions(); saveSelectedItems(); } @@ -496,6 +528,24 @@ public void onSectionFocused(int sectionId) { mCurrentVideo = null; // fast scroll through the sections (fix empty selected item) updateCurrentSection(); restoreSelectedItems(); // Don't place anywhere else + + // Cancel any pending counter reset + if (mCounterResetRunnable != null) { + mCounterResetHandler.removeCallbacks(mCounterResetRunnable); + mCounterResetRunnable = null; + } + + // Start counter reset timer for pinned channel sections + if (getMainUIData().isNewVideoCounterEnabled() && mCurrentSection != null && isPinnedId(mCurrentSection.getId())) { + final int focusedSectionId = sectionId; + mCounterResetRunnable = () -> { + // Only reset if still on the same section + if (mCurrentSection != null && mCurrentSection.getId() == focusedSectionId) { + resetNewVideoCounter(focusedSectionId); + } + }; + mCounterResetHandler.postDelayed(mCounterResetRunnable, 5_000); + } } @Override @@ -575,6 +625,9 @@ public void pinItem(Video item) { mSections.add(newSection); } getView().addSection(-1, newSection); + + // Immediately fetch baseline or counter for the newly pinned channel + fetchNewVideoCounts(); } public void pinItem(String title, int resId, ErrorFragmentData data) { @@ -1224,4 +1277,172 @@ private void appendLocalHistory(VideoGroup videoGroup) { videoGroup.add(0, state.video); } } + + // ==================== New Video Counter ==================== + + private void fetchNewVideoCounts() { + if (getContext() == null) { + return; + } + + boolean isEnabled = getMainUIData().isNewVideoCounterEnabled(); + + if (!isEnabled) { + return; + } + + // Stop any currently running background counters so we don't duplicate + RxHelper.disposeActions(mCounterActions); + + NewVideoCounterData counterData = NewVideoCounterData.instance(getContext()); + + // Collect pinned channel sections and their channel IDs + mPinnedChannelIds.clear(); + mOriginalTitles.clear(); + mCurrentNewestVideoData.clear(); + + for (BrowseSection section : mSections) { + boolean isPinned = isPinnedId(section.getId()); + boolean isVideo = section.getData() instanceof Video; + if (isPinned && isVideo) { + Video item = (Video) section.getData(); + boolean hasChan = item.hasChannel(); + + String cleanTitle = section.getTitle(); + if (cleanTitle != null) { + cleanTitle = cleanTitle.replaceFirst("^\\(\\d+\\)\\s+", ""); + } + + if (hasChan) { + mPinnedChannelIds.put(section.getId(), item.channelId); + mOriginalTitles.put(section.getId(), cleanTitle); + } else if (item.channelId != null && !item.channelId.isEmpty()) { + // Fallback just in case hasChannel() requires something else + mPinnedChannelIds.put(section.getId(), item.channelId); + mOriginalTitles.put(section.getId(), cleanTitle); + } + } + } + + if (mPinnedChannelIds.isEmpty()) { + return; + } + + // Fetch RSS for each pinned channel sequentially to avoid rate limiting + for (Map.Entry entry : mPinnedChannelIds.entrySet()) { + int sectionId = entry.getKey(); + String channelId = entry.getValue(); + + Disposable action = getContentService().getRssFeedObserve(channelId) + .subscribeOn(io.reactivex.schedulers.Schedulers.io()) + .observeOn(io.reactivex.android.schedulers.AndroidSchedulers.mainThread()) + .subscribe( + mediaGroup -> { + if (mediaGroup == null || getView() == null) { + return; + } + + List items = mediaGroup.getMediaItems(); + if (items == null || items.isEmpty()) { + return; + } + + String newestFetchedData = items.get(0).getPublishedDate() + "_" + items.get(0).getVideoId(); + mCurrentNewestVideoData.put(sectionId, newestFetchedData); + + String lastKnownData = counterData.getLastKnownVideoData(sectionId); + + if (lastKnownData == null) { + // First time: store baseline, no counter shown + counterData.setLastKnownVideoData(sectionId, newestFetchedData); + } else { + int underscoreIdx = lastKnownData.indexOf('_'); + long lastDate = 0; + String lastId = ""; + + if (underscoreIdx > 0) { + try { lastDate = Long.parseLong(lastKnownData.substring(0, underscoreIdx)); } catch (Exception ignored) {} + lastId = lastKnownData.substring(underscoreIdx + 1); + } else { + lastId = lastKnownData; // Fallback for backward compatibility + } + + int newVideoCount = 0; + boolean found = false; + for (int i = 0; i < items.size(); i++) { + if (lastId.equals(items.get(i).getVideoId())) { + newVideoCount = i; + found = true; + break; + } + } + + // If previous newest video is not in the feed at all (e.g., deleted or 16+ new videos), + // fallback to counting videos with a newer timestamp. + if (!found) { + newVideoCount = 0; + for (MediaItem item : items) { + if (item.getPublishedDate() > lastDate) { + newVideoCount++; + } + } + + // If timestamp is missing/broken, default to max items + if (newVideoCount == 0 && lastDate > 0) { + // It wasn't found, but timestamps are older? Probably a deleted video that was + // the only new one. So it should be 0. + } else if (newVideoCount == 0) { + newVideoCount = items.size(); + } + } + + updateSectionTitleWithCounter(sectionId, newVideoCount); + } + }, + error -> Log.e(TAG, "onError fetching RSS for counter " + channelId, error) + ); + + mCounterActions.add(action); + } + } + + private void updateSectionTitleWithCounter(int sectionId, int newCount) { + if (getView() == null) { + return; + } + + BrowseSection section = findSectionById(sectionId); + + if (section == null) { + return; + } + + String originalTitle = mOriginalTitles.get(sectionId); + if (originalTitle == null) { + originalTitle = section.getTitle(); + } + + if (newCount > 0) { + section.setTitle("(" + newCount + ") " + originalTitle); + } else { + section.setTitle(originalTitle); + } + + getView().updateSectionTitle(section); + } + + private void resetNewVideoCounter(int sectionId) { + if (getContext() == null) { + return; + } + + NewVideoCounterData counterData = NewVideoCounterData.instance(getContext()); + String currentNewestData = mCurrentNewestVideoData.get(sectionId); + + if (currentNewestData != null) { + counterData.setLastKnownVideoData(sectionId, currentNewestData); + } + + updateSectionTitleWithCounter(sectionId, 0); + } } diff --git a/common/src/main/java/com/liskovsoft/smartyoutubetv2/common/app/presenters/settings/MainUISettingsPresenter.java b/common/src/main/java/com/liskovsoft/smartyoutubetv2/common/app/presenters/settings/MainUISettingsPresenter.java index 6ef806f3cd..07cbc9c6a0 100644 --- a/common/src/main/java/com/liskovsoft/smartyoutubetv2/common/app/presenters/settings/MainUISettingsPresenter.java +++ b/common/src/main/java/com/liskovsoft/smartyoutubetv2/common/app/presenters/settings/MainUISettingsPresenter.java @@ -341,6 +341,13 @@ private void appendMiscCategory(AppDialogPresenter settingsPresenter) { }, mMainUIData.isPinnedChannelRowsEnabled())); + options.add(UiOptionItem.from(getContext().getString(R.string.new_video_counter), + optionItem -> { + mMainUIData.setNewVideoCounterEnabled(optionItem.isSelected()); + mRestartApp = true; + }, + mMainUIData.isNewVideoCounterEnabled())); + options.add(UiOptionItem.from(getContext().getString(R.string.playlists_rows), optionItem -> { mMainUIData.setPlaylistsStyle(optionItem.isSelected() ? MainUIData.PLAYLISTS_STYLE_ROWS : MainUIData.PLAYLISTS_STYLE_GRID); diff --git a/common/src/main/java/com/liskovsoft/smartyoutubetv2/common/app/views/BrowseView.java b/common/src/main/java/com/liskovsoft/smartyoutubetv2/common/app/views/BrowseView.java index 5211cce3d9..e9c514cff1 100644 --- a/common/src/main/java/com/liskovsoft/smartyoutubetv2/common/app/views/BrowseView.java +++ b/common/src/main/java/com/liskovsoft/smartyoutubetv2/common/app/views/BrowseView.java @@ -14,6 +14,7 @@ public interface BrowseView { void updateSection(VideoGroup group); void updateSection(SettingsGroup group); void clearSection(BrowseSection section); + void updateSectionTitle(BrowseSection section); void selectSectionItem(int index); void selectSectionItem(Video item); void showError(ErrorFragmentData data); diff --git a/common/src/main/java/com/liskovsoft/smartyoutubetv2/common/prefs/MainUIData.java b/common/src/main/java/com/liskovsoft/smartyoutubetv2/common/prefs/MainUIData.java index 1dca0880d1..f0351e42ce 100644 --- a/common/src/main/java/com/liskovsoft/smartyoutubetv2/common/prefs/MainUIData.java +++ b/common/src/main/java/com/liskovsoft/smartyoutubetv2/common/prefs/MainUIData.java @@ -114,6 +114,7 @@ public class MainUIData extends DataChangeBase implements ProfileChangeListener private int mCardPreviewType; private final Runnable mPersistStateInt = this::persistStateInt; private boolean mIsUnlocalizedTitlesEnabled; + private boolean mIsNewVideoCounterEnabled; private MainUIData(Context context) { mContext = context; @@ -354,6 +355,15 @@ public void setUnlocalizedTitlesEnabled(boolean enabled) { persistState(); } + public boolean isNewVideoCounterEnabled() { + return mIsNewVideoCounterEnabled; + } + + public void setNewVideoCounterEnabled(boolean enabled) { + mIsNewVideoCounterEnabled = enabled; + persistState(); + } + private void initColorSchemes() { mColorSchemes.add(new ColorScheme( R.string.color_scheme_teal, @@ -427,6 +437,7 @@ private void restoreState() { mIsPinnedChannelRowsEnabled = Helpers.parseBoolean(split, 20, true); mCardPreviewType = Helpers.parseInt(split, 21, CARD_PREVIEW_DISABLED); mIsUnlocalizedTitlesEnabled = Helpers.parseBoolean(split, 22, false); + mIsNewVideoCounterEnabled = Helpers.parseBoolean(split, 23, false); int idx = -1; for (Long menuItem : MENU_ITEM_DEFAULT_ORDER) { @@ -470,7 +481,7 @@ private void persistStateInt() { mIsUploadsOldLookEnabled, mIsUploadsAutoLoadEnabled, mCardTextScrollSpeed, mMenuItems, mTopButtons, null, mThumbQuality, mIsCardMultilineSubtitleEnabled, Helpers.mergeList(mMenuItemsOrdered), mIsChannelsFilterEnabled, mIsChannelSearchBarEnabled, mIsPinnedChannelRowsEnabled, mCardPreviewType, - mIsUnlocalizedTitlesEnabled)); + mIsUnlocalizedTitlesEnabled, mIsNewVideoCounterEnabled)); } public static class ColorScheme { diff --git a/common/src/main/java/com/liskovsoft/smartyoutubetv2/common/prefs/NewVideoCounterData.java b/common/src/main/java/com/liskovsoft/smartyoutubetv2/common/prefs/NewVideoCounterData.java new file mode 100644 index 0000000000..063b9bc5c5 --- /dev/null +++ b/common/src/main/java/com/liskovsoft/smartyoutubetv2/common/prefs/NewVideoCounterData.java @@ -0,0 +1,64 @@ +package com.liskovsoft.smartyoutubetv2.common.prefs; + +import android.annotation.SuppressLint; +import android.content.Context; + +import com.liskovsoft.sharedutils.helpers.Helpers; +import com.liskovsoft.smartyoutubetv2.common.prefs.AppPrefs.ProfileChangeListener; + +import java.util.HashMap; +import java.util.Map; + +public class NewVideoCounterData implements ProfileChangeListener { + private static final String NEW_VIDEO_COUNTER_DATA = "new_video_counter_data"; + @SuppressLint("StaticFieldLeak") + private static NewVideoCounterData sInstance; + private final AppPrefs mPrefs; + // Map: sectionId -> last known video data (timestamp_videoId) + private Map mLastKnownVideoData = new HashMap<>(); + + private NewVideoCounterData(Context context) { + mPrefs = AppPrefs.instance(context); + mPrefs.addListener(this); + restoreState(); + } + + public static NewVideoCounterData instance(Context context) { + if (sInstance == null) { + sInstance = new NewVideoCounterData(context.getApplicationContext()); + } + + return sInstance; + } + + public String getLastKnownVideoData(int sectionId) { + return mLastKnownVideoData.get(sectionId); + } + + public void setLastKnownVideoData(int sectionId, String videoData) { + if (videoData != null) { + mLastKnownVideoData.put(sectionId, videoData); + persistState(); + } + } + + public void removeChannel(int sectionId) { + mLastKnownVideoData.remove(sectionId); + persistState(); + } + + private void restoreState() { + String data = mPrefs.getProfileData(NEW_VIDEO_COUNTER_DATA); + + mLastKnownVideoData = Helpers.parseMap(data, Helpers::parseInt, val -> val); + } + + private void persistState() { + mPrefs.setProfileData(NEW_VIDEO_COUNTER_DATA, Helpers.mergeMap(mLastKnownVideoData)); + } + + @Override + public void onProfileChanged() { + restoreState(); + } +} diff --git a/common/src/main/res/values-ar/strings.xml b/common/src/main/res/values-ar/strings.xml index 61b9e6efbe..075c8f1757 100644 --- a/common/src/main/res/values-ar/strings.xml +++ b/common/src/main/res/values-ar/strings.xml @@ -717,4 +717,5 @@ مرة واحدة يوميًا مرة واحدة أسبوعيًا مرة واحدة شهريًا + عرض عداد الفيديوهات الجديدة على القنوات المثبتة diff --git a/common/src/main/res/values-az/strings.xml b/common/src/main/res/values-az/strings.xml index 60e86cd269..22efff7a8b 100644 --- a/common/src/main/res/values-az/strings.xml +++ b/common/src/main/res/values-az/strings.xml @@ -692,4 +692,5 @@ Daxil et Qapalı Altyazıları deaktiv edin Qapalı Altyazıları aktivləşdirin + Saxlanmış kanallarda yeni video sayğacını göstər diff --git a/common/src/main/res/values-bg/strings.xml b/common/src/main/res/values-bg/strings.xml index eb7509502f..87a4bb771a 100644 --- a/common/src/main/res/values-bg/strings.xml +++ b/common/src/main/res/values-bg/strings.xml @@ -594,4 +594,5 @@ Деактивиране на историята на търсенето Отключване на формати с висок битрейт 1080p vp9 Отключване на формати mp4a с висок битрейт + Показване на брояч за нови видеоклипове на закачени канали diff --git a/common/src/main/res/values-ca/strings.xml b/common/src/main/res/values-ca/strings.xml index 0c69998fc9..46e2c98c70 100644 --- a/common/src/main/res/values-ca/strings.xml +++ b/common/src/main/res/values-ca/strings.xml @@ -505,4 +505,5 @@ Amaga els curts de la tendència Desactiva l\'historial Activeu l\'historial + Mostra el comptador de vídeos nous als canals fixats diff --git a/common/src/main/res/values-cs/strings.xml b/common/src/main/res/values-cs/strings.xml index c6f3134279..079e81ca1d 100644 --- a/common/src/main/res/values-cs/strings.xml +++ b/common/src/main/res/values-cs/strings.xml @@ -729,6 +729,7 @@ Kanál odblokován Blokované kanály Žádné blokované kanály + Zobrazit počítadlo nových videí u připnutých kanálů diff --git a/common/src/main/res/values-da/strings.xml b/common/src/main/res/values-da/strings.xml index d00d5aa981..998a4ed003 100644 --- a/common/src/main/res/values-da/strings.xml +++ b/common/src/main/res/values-da/strings.xml @@ -710,4 +710,5 @@ Ikke-lokaliserede videotitler Skaler ikke video til at passe dialog Deaktiver autokorrektion under indtastning + Vis tæller for nye videoer på fastgjorte kanaler diff --git a/common/src/main/res/values-de/strings.xml b/common/src/main/res/values-de/strings.xml index 78112f1c47..fb85896d63 100644 --- a/common/src/main/res/values-de/strings.xml +++ b/common/src/main/res/values-de/strings.xml @@ -729,4 +729,5 @@ Blockierung aufgehoben Blockierte Kanäle Keine blockierten Kanäle + Zähler für neue Videos bei angehefteten Kanälen anzeigen diff --git a/common/src/main/res/values-el/strings.xml b/common/src/main/res/values-el/strings.xml index 4e7beb856e..cfdcdb511f 100644 --- a/common/src/main/res/values-el/strings.xml +++ b/common/src/main/res/values-el/strings.xml @@ -721,4 +721,5 @@ Μη μεταφρασμένοι τίτλοι Διάλογος \"μη γίνεται προασαρμογή βίντεο για ταίριασμα\" Απενεργοποίηση αυτόματης διόρθωσης κατά την πληκτρολόγηση κειμένου + Εμφάνιση μετρητή νέων βίντεο στα καρφιτσωμένα κανάλια diff --git a/common/src/main/res/values-es/strings.xml b/common/src/main/res/values-es/strings.xml index a37d9819df..6c07daa773 100644 --- a/common/src/main/res/values-es/strings.xml +++ b/common/src/main/res/values-es/strings.xml @@ -717,4 +717,5 @@ Canal desbloqueado Canales bloqueados No hay canales bloqueados + Mostrar contador de vídeos nuevos en canales fijados diff --git a/common/src/main/res/values-et/strings.xml b/common/src/main/res/values-et/strings.xml index 393f095760..fda716d622 100644 --- a/common/src/main/res/values-et/strings.xml +++ b/common/src/main/res/values-et/strings.xml @@ -618,4 +618,5 @@ Keela ajalugu kaugjuhtimise kasutamisel Klaviatuuri kuvamise parandamine klahvivajutusega OK (G20s ja teised) Midagi ei leitud + Kuva kinnitatud kanalite uute videote loendur diff --git a/common/src/main/res/values-fa-rIR/strings.xml b/common/src/main/res/values-fa-rIR/strings.xml index 074d5121fe..62aff43979 100644 --- a/common/src/main/res/values-fa-rIR/strings.xml +++ b/common/src/main/res/values-fa-rIR/strings.xml @@ -694,4 +694,5 @@ مرتب‌سازی منوی زمینه تمرکز صوتی (مکث در صورت شناسایی سایر پخش‌کننده‌ها) اعلان محتوای پولی + نمایش شمارنده ویدیوهای جدید در کانال‌های ثابت شده diff --git a/common/src/main/res/values-fi/strings.xml b/common/src/main/res/values-fi/strings.xml index eb92c7300f..9331365929 100644 --- a/common/src/main/res/values-fi/strings.xml +++ b/common/src/main/res/values-fi/strings.xml @@ -723,4 +723,5 @@ Ei estettyjä kanavia Äänen keston venytys Pitää äänen luonnollisena nopeutta vaihdettaessa. Saattaa heikentää suorituskykyä merkittävästi joillakin laitteilla. + Näytä uusien videoiden laskuri kiinnitetyissä kanavissa diff --git a/common/src/main/res/values-fr/strings.xml b/common/src/main/res/values-fr/strings.xml index 07f27e31b8..df11161c31 100644 --- a/common/src/main/res/values-fr/strings.xml +++ b/common/src/main/res/values-fr/strings.xml @@ -728,4 +728,5 @@ Retiré de la liste noire Chaînes sur liste noire Aucune chaîne sur liste noire + Afficher le compteur de nouvelles vidéos sur les chaînes épinglées diff --git a/common/src/main/res/values-gl-rES/strings.xml b/common/src/main/res/values-gl-rES/strings.xml index 29e2e81f82..94ac62eccd 100644 --- a/common/src/main/res/values-gl-rES/strings.xml +++ b/common/src/main/res/values-gl-rES/strings.xml @@ -710,4 +710,5 @@ Non redimensionar o vídeo para axustalo ao diálogo Desactivar a autocorrección ao escribir texto Suxestións desprazables horizontalmente + Amosar o contador de vídeos novos nas canles fixadas diff --git a/common/src/main/res/values-he/strings.xml b/common/src/main/res/values-he/strings.xml index 6e99fc62b3..8545334a8d 100644 --- a/common/src/main/res/values-he/strings.xml +++ b/common/src/main/res/values-he/strings.xml @@ -698,4 +698,5 @@ So, make a copy of values-he and name it values-iw. Keep both in your structure. הסרטונים שלי מיקוד שמע (השהה אם זוהו נגנים אחרים) התראת תוכן בתשלום + הצג מונה סרטונים חדשים בערוצים מוצמדים diff --git a/common/src/main/res/values-hi/strings.xml b/common/src/main/res/values-hi/strings.xml index d2cdf86d4e..4cb519135e 100644 --- a/common/src/main/res/values-hi/strings.xml +++ b/common/src/main/res/values-hi/strings.xml @@ -570,4 +570,5 @@ शॉर्ट्स उच्च बिटरेट 1080p VP9 प्रारूप अनलॉक करें उच्च बिटरेट mp4a प्रारूप अनलॉक करें + पिन किए गए चैनलों पर नए वीडियो काउंटर दिखाएं diff --git a/common/src/main/res/values-hr/strings.xml b/common/src/main/res/values-hr/strings.xml index afe616d7d0..3f1a2a02e5 100644 --- a/common/src/main/res/values-hr/strings.xml +++ b/common/src/main/res/values-hr/strings.xml @@ -495,4 +495,5 @@ Podržani načini Učitavanje… Sakrij strujanja iz Pretplata + Prikaži brojač novih videa na prikvačenim kanalima diff --git a/common/src/main/res/values-hu/strings.xml b/common/src/main/res/values-hu/strings.xml index 5bcec5b517..5658a11eb9 100644 --- a/common/src/main/res/values-hu/strings.xml +++ b/common/src/main/res/values-hu/strings.xml @@ -712,4 +712,5 @@ Az automatikus javítás letiltása szöveg beírása közben Vízszintesen görgetett Javaslatok Minden beállítás törlése! + Új videók számlálójának megjelenítése a rögzített csatornákon diff --git a/common/src/main/res/values-in/strings.xml b/common/src/main/res/values-in/strings.xml index 82d00f610d..ce53ac4041 100644 --- a/common/src/main/res/values-in/strings.xml +++ b/common/src/main/res/values-in/strings.xml @@ -683,4 +683,5 @@ Vidio tanpa suara Vidio dengan suara Pratinjau kartu + Tampilkan penghitung video baru di channel yang disematkan diff --git a/common/src/main/res/values-it/strings.xml b/common/src/main/res/values-it/strings.xml index da11c57291..d15cc2ed0b 100644 --- a/common/src/main/res/values-it/strings.xml +++ b/common/src/main/res/values-it/strings.xml @@ -724,4 +724,5 @@ Canale sbloccato Canali bloccati Nessun canale bloccato + Mostra contatore nuovi video sui canali bloccati diff --git a/common/src/main/res/values-iw/strings.xml b/common/src/main/res/values-iw/strings.xml index 6e99fc62b3..8545334a8d 100644 --- a/common/src/main/res/values-iw/strings.xml +++ b/common/src/main/res/values-iw/strings.xml @@ -698,4 +698,5 @@ So, make a copy of values-he and name it values-iw. Keep both in your structure. הסרטונים שלי מיקוד שמע (השהה אם זוהו נגנים אחרים) התראת תוכן בתשלום + הצג מונה סרטונים חדשים בערוצים מוצמדים diff --git a/common/src/main/res/values-ja/strings.xml b/common/src/main/res/values-ja/strings.xml index b1520d1c80..453ca07f5e 100644 --- a/common/src/main/res/values-ja/strings.xml +++ b/common/src/main/res/values-ja/strings.xml @@ -719,4 +719,5 @@ ブロックを解除しました ブロックしたチャンネル ブロックしたチャンネルはありません + 固定されたチャンネルに新しい動画のカウンターを表示 diff --git a/common/src/main/res/values-ko/strings.xml b/common/src/main/res/values-ko/strings.xml index 9d2530b768..d715bdc01d 100644 --- a/common/src/main/res/values-ko/strings.xml +++ b/common/src/main/res/values-ko/strings.xml @@ -714,4 +714,5 @@ 차단 해제됨 차단된 채널 차단된 채널 없음 + 고정된 채널에 새 동영상 카운터 표시 diff --git a/common/src/main/res/values-lt/strings.xml b/common/src/main/res/values-lt/strings.xml index fdb47a218c..d22fc47e33 100644 --- a/common/src/main/res/values-lt/strings.xml +++ b/common/src/main/res/values-lt/strings.xml @@ -411,4 +411,5 @@ Pradedant leisti vaizdo įrašą netikrinti, ar kodekas yra palaikomas. Gali padėti, jei programinėje įrangoje yra klaidų. Naudoti programinį vaizdo dekoderį Gali atkurti beveik bet kurį vaizdo įrašą, bet atkūrimo sparta yra labai maža. + Rodyti naujų vaizdo įrašų skaitiklį prisegtuose kanaluose diff --git a/common/src/main/res/values-lv/strings.xml b/common/src/main/res/values-lv/strings.xml index d8472a0cb0..a21b10ed71 100644 --- a/common/src/main/res/values-lv/strings.xml +++ b/common/src/main/res/values-lv/strings.xml @@ -119,4 +119,5 @@ Jauns saturs Alfabētiski Pēdējais skatītais + Rādīt jaunu video skaitītāju piespraustos kanālos \ No newline at end of file diff --git a/common/src/main/res/values-mo/strings.xml b/common/src/main/res/values-mo/strings.xml index ffc44e7dec..4080fd65e6 100644 --- a/common/src/main/res/values-mo/strings.xml +++ b/common/src/main/res/values-mo/strings.xml @@ -127,4 +127,5 @@ Show clock Show remaining time Open channel videos + Afișați contorul de videoclipuri noi pe canalele fixate \ No newline at end of file diff --git a/common/src/main/res/values-nb/strings.xml b/common/src/main/res/values-nb/strings.xml index a9967a4517..fe894726e5 100644 --- a/common/src/main/res/values-nb/strings.xml +++ b/common/src/main/res/values-nb/strings.xml @@ -707,4 +707,5 @@ Forhåndsvisning av kort Ikke-lokaliserte videotitler Ikke endre størrelsen på videoen for å passe i dialogboksen + Vis teller for nye videoer på festede kanaler \ No newline at end of file diff --git a/common/src/main/res/values-nl/strings.xml b/common/src/main/res/values-nl/strings.xml index e08c677829..7ae2ac2656 100644 --- a/common/src/main/res/values-nl/strings.xml +++ b/common/src/main/res/values-nl/strings.xml @@ -717,4 +717,5 @@ Foutopsporingsinformatie Audio-tijdverlenging Behoudt de natuurlijke stem bij het veranderen van de snelheid. Kan de prestaties op sommige apparaten aanzienlijk verminderen. + Toon teller voor nieuwe video\u2019s op vastgezette kanalen diff --git a/common/src/main/res/values-pl/strings.xml b/common/src/main/res/values-pl/strings.xml index dac8631fec..1faeda6270 100644 --- a/common/src/main/res/values-pl/strings.xml +++ b/common/src/main/res/values-pl/strings.xml @@ -729,4 +729,5 @@ Kanał odblokowany Zablokowane kanały Brak zablokowanych kanałów + Pokaż licznik nowych filmów na przypiętych kanałach diff --git a/common/src/main/res/values-pt-rBR/strings.xml b/common/src/main/res/values-pt-rBR/strings.xml index 46a1d8bb31..e2273753e7 100644 --- a/common/src/main/res/values-pt-rBR/strings.xml +++ b/common/src/main/res/values-pt-rBR/strings.xml @@ -728,4 +728,5 @@ Canal desbloqueado Canais bloqueados Nenhum canal bloqueado + Mostrar contador de novos vídeos nos canais fixados diff --git a/common/src/main/res/values-pt-rPT/strings.xml b/common/src/main/res/values-pt-rPT/strings.xml index 1bbd589f92..b2183a1312 100644 --- a/common/src/main/res/values-pt-rPT/strings.xml +++ b/common/src/main/res/values-pt-rPT/strings.xml @@ -728,4 +728,5 @@ Canal desbloqueado Canais bloqueados Nenhum canal bloqueado + Mostrar contador de novos vídeos nos canais afixados diff --git a/common/src/main/res/values-ro/strings.xml b/common/src/main/res/values-ro/strings.xml index 66d6e9cb7f..fc7bb42911 100644 --- a/common/src/main/res/values-ro/strings.xml +++ b/common/src/main/res/values-ro/strings.xml @@ -665,4 +665,5 @@ Copie de rezervă locală Copie de rezervă automată (o dată pe zi) Redă lista de redare sau videoclipurile canalului în ordine inversă + Afișare contor videoclipuri noi pe canalele fixate diff --git a/common/src/main/res/values-ru/strings.xml b/common/src/main/res/values-ru/strings.xml index 468a7dcd7e..f2c21e1b59 100644 --- a/common/src/main/res/values-ru/strings.xml +++ b/common/src/main/res/values-ru/strings.xml @@ -721,4 +721,5 @@ Нет заблокированных каналов Растяжение аудио во времени Сохраняет естественное звучание голоса при изменении скорости. Может значительно снизить производительность на некоторых устройствах. + Показывать счётчик новых видео на закреплённых каналах diff --git a/common/src/main/res/values-sk/strings.xml b/common/src/main/res/values-sk/strings.xml index f5cbe82472..96f98115aa 100644 --- a/common/src/main/res/values-sk/strings.xml +++ b/common/src/main/res/values-sk/strings.xml @@ -729,4 +729,5 @@ Kanál odblokovaný Zablokované kanály Žiadne zablokované kanály + Zobraziť počítadlo nových videí na pripnutých kanáloch diff --git a/common/src/main/res/values-sl/strings.xml b/common/src/main/res/values-sl/strings.xml index 63dac045aa..e374c51ede 100644 --- a/common/src/main/res/values-sl/strings.xml +++ b/common/src/main/res/values-sl/strings.xml @@ -296,4 +296,5 @@ Dodaj na seznam predvajanja Samodejno prikaži tipkovnico + Prikaži števec novih videoposnetkov na pripetih kanalih diff --git a/common/src/main/res/values-sq/strings.xml b/common/src/main/res/values-sq/strings.xml index 6db896ffc3..589b164421 100644 --- a/common/src/main/res/values-sq/strings.xml +++ b/common/src/main/res/values-sq/strings.xml @@ -710,4 +710,5 @@ Do ta fshish %s përgjithmonë? Kalo te kapitulli tjetër duke klikuar mbi njoftimin Sugjerime të lëvizura horizontalisht + Shfaq numëruesin e videove të reja në kanalet e gozhduara diff --git a/common/src/main/res/values-sr/strings.xml b/common/src/main/res/values-sr/strings.xml index 61b8eb6ffb..673a35a600 100644 --- a/common/src/main/res/values-sr/strings.xml +++ b/common/src/main/res/values-sr/strings.xml @@ -711,4 +711,5 @@ Не мењај величину видеа да би се уклопио у дијалог Онемогући аутоматско исправљање приликом куцања текста Хоризонтално померани предлози + Прикажи бројач нових видео снимака на закаченим каналима diff --git a/common/src/main/res/values-sv/strings.xml b/common/src/main/res/values-sv/strings.xml index c8f9c8fbea..3303f43cce 100644 --- a/common/src/main/res/values-sv/strings.xml +++ b/common/src/main/res/values-sv/strings.xml @@ -721,4 +721,5 @@ En gång om dagen En gång i veckan En gång i månaden + Visa räknare för nya videor på fästa kanaler diff --git a/common/src/main/res/values-te/strings.xml b/common/src/main/res/values-te/strings.xml index 46938deb5a..f776f9da97 100644 --- a/common/src/main/res/values-te/strings.xml +++ b/common/src/main/res/values-te/strings.xml @@ -214,4 +214,5 @@ ఇష్టపడే నవీకరణ మూలం + పిన్ చేసిన ఛానెల్‌లలో కొత్త వీడియో కౌంటర్‌ను చూపించు \ No newline at end of file diff --git a/common/src/main/res/values-th/strings.xml b/common/src/main/res/values-th/strings.xml index f491d4bc05..2c37174cb6 100644 --- a/common/src/main/res/values-th/strings.xml +++ b/common/src/main/res/values-th/strings.xml @@ -323,4 +323,5 @@ อัปเดตข้อผิดพลาด ซ่อน shorts จากประวัติการเข้าชม Disable screensaver + แสดงตัวนับวิดีโอใหม่บนช่องที่ปักหมุด diff --git a/common/src/main/res/values-tr/strings.xml b/common/src/main/res/values-tr/strings.xml index 5fa009a4bf..937cf9db9d 100644 --- a/common/src/main/res/values-tr/strings.xml +++ b/common/src/main/res/values-tr/strings.xml @@ -731,4 +731,5 @@ Engellenmiş kanal yok Ses zaman esnetme Hız değiştirildiğinde sesi doğal tutar. Bazı cihazlarda performansı önemli ölçüde düşürebilir. + Sabitlenmiş kanallarda yeni video sayacını göster diff --git a/common/src/main/res/values-uk/strings.xml b/common/src/main/res/values-uk/strings.xml index 083fa1b934..85bbe50c30 100644 --- a/common/src/main/res/values-uk/strings.xml +++ b/common/src/main/res/values-uk/strings.xml @@ -719,4 +719,5 @@ Немає заблокованих каналів Розтягування аудіо в часі Зберігає природний голос при зміні швидкості. Може суттєво знизити продуктивність на деяких пристроях. + Показувати лічильник нових відео на закріплених каналах diff --git a/common/src/main/res/values-vi/strings.xml b/common/src/main/res/values-vi/strings.xml index 3aa0517bde..6b7dab84f0 100644 --- a/common/src/main/res/values-vi/strings.xml +++ b/common/src/main/res/values-vi/strings.xml @@ -720,4 +720,5 @@ Đã bỏ chặn kênh Kênh đã chặn Không có kênh nào bị chặn + Hiển thị bộ đếm video mới trên kênh được ghim diff --git a/common/src/main/res/values-zh-rTW/strings.xml b/common/src/main/res/values-zh-rTW/strings.xml index a07d7e29b0..8d8f09eb1f 100644 --- a/common/src/main/res/values-zh-rTW/strings.xml +++ b/common/src/main/res/values-zh-rTW/strings.xml @@ -729,4 +729,5 @@ 已解除封鎖 封鎖的頻道 沒有封鎖的頻道 + 在釘選頻道上顯示新影片計數器 \ No newline at end of file diff --git a/common/src/main/res/values-zh/strings.xml b/common/src/main/res/values-zh/strings.xml index 3358f8cfd4..05c5440e8c 100644 --- a/common/src/main/res/values-zh/strings.xml +++ b/common/src/main/res/values-zh/strings.xml @@ -709,4 +709,5 @@ 已从黑名单移除 黑名单频道 没有拉黑的频道 + 在置顶频道上显示新视频计数器 diff --git a/common/src/main/res/values/strings.xml b/common/src/main/res/values/strings.xml index 313f027b90..bcb3ae20ec 100644 --- a/common/src/main/res/values/strings.xml +++ b/common/src/main/res/values/strings.xml @@ -675,6 +675,7 @@ Fullscreen mode (without system bars) Show only the player if the video is opened outside of the app Show pinned channel as rows + Show new videos counter on pinned channels Prefer Google DNS Prefer IPv4 DNS Could fix situations when the app isn\'t working at all.\nNote. May cause hangs and crashes (especially on Android 8 devices or Dune HD) diff --git a/leanback-1.0.0/src/main/java/androidx/leanback/widget/HeaderItem.java b/leanback-1.0.0/src/main/java/androidx/leanback/widget/HeaderItem.java index 0325060a57..78631a6ae5 100644 --- a/leanback-1.0.0/src/main/java/androidx/leanback/widget/HeaderItem.java +++ b/leanback-1.0.0/src/main/java/androidx/leanback/widget/HeaderItem.java @@ -22,7 +22,7 @@ public class HeaderItem { private final long mId; - private final String mName; + private String mName; private CharSequence mDescription; private CharSequence mContentDescription; @@ -55,6 +55,13 @@ public final String getName() { return mName; } + /** + * Sets the name of this header item. + */ + public void setName(String name) { + mName = name; + } + /** * Returns optional content description for the HeaderItem. When it is null, {@link #getName()} * should be used for the content description. diff --git a/smarttubetv/src/main/java/com/liskovsoft/smartyoutubetv2/tv/ui/browse/BrowseFragment.java b/smarttubetv/src/main/java/com/liskovsoft/smartyoutubetv2/tv/ui/browse/BrowseFragment.java index 019dd54e30..fa1716d728 100644 --- a/smarttubetv/src/main/java/com/liskovsoft/smartyoutubetv2/tv/ui/browse/BrowseFragment.java +++ b/smarttubetv/src/main/java/com/liskovsoft/smartyoutubetv2/tv/ui/browse/BrowseFragment.java @@ -23,6 +23,7 @@ import androidx.leanback.widget.TitleHelper; import com.liskovsoft.sharedutils.helpers.Helpers; import com.liskovsoft.smartyoutubetv2.common.app.models.data.BrowseSection; +import com.liskovsoft.smartyoutubetv2.tv.ui.browse.SectionHeaderItem; import com.liskovsoft.smartyoutubetv2.common.app.models.data.SettingsGroup; import com.liskovsoft.smartyoutubetv2.common.app.models.data.Video; import com.liskovsoft.smartyoutubetv2.common.app.models.data.VideoGroup; @@ -435,6 +436,22 @@ public void clearSection(BrowseSection section) { mSectionFragmentFactory.clearCurrentFragment(); } + @Override + public void updateSectionTitle(BrowseSection section) { + if (section == null) { + return; + } + + for (int i = 0; i < mSectionRowAdapter.size(); i++) { + PageRow row = (PageRow) mSectionRowAdapter.get(i); + if (row.getHeaderItem().getId() == section.getId()) { + row.getHeaderItem().setName(section.getTitle()); + mSectionRowAdapter.notifyArrayItemRangeChanged(i, 1); + break; + } + } + } + @Override public void onDestroyView() { mSectionFragmentFactory.cleanup();