diff options
Diffstat (limited to 'xbmc/pvr/guilib/guiinfo/PVRGUITimerInfo.cpp')
-rw-r--r-- | xbmc/pvr/guilib/guiinfo/PVRGUITimerInfo.cpp | 270 |
1 files changed, 270 insertions, 0 deletions
diff --git a/xbmc/pvr/guilib/guiinfo/PVRGUITimerInfo.cpp b/xbmc/pvr/guilib/guiinfo/PVRGUITimerInfo.cpp new file mode 100644 index 0000000..24a468a --- /dev/null +++ b/xbmc/pvr/guilib/guiinfo/PVRGUITimerInfo.cpp @@ -0,0 +1,270 @@ +/* + * Copyright (C) 2012-2018 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +#include "PVRGUITimerInfo.h" + +#include "ServiceBroker.h" +#include "guilib/LocalizeStrings.h" +#include "pvr/PVRManager.h" +#include "pvr/timers/PVRTimerInfoTag.h" +#include "pvr/timers/PVRTimers.h" +#include "settings/AdvancedSettings.h" +#include "settings/SettingsComponent.h" +#include "utils/StringUtils.h" + +#include <memory> +#include <mutex> +#include <string> +#include <vector> + +using namespace PVR; + +CPVRGUITimerInfo::CPVRGUITimerInfo() +{ + ResetProperties(); +} + +void CPVRGUITimerInfo::ResetProperties() +{ + std::unique_lock<CCriticalSection> lock(m_critSection); + m_strActiveTimerTitle.clear(); + m_strActiveTimerChannelName.clear(); + m_strActiveTimerChannelIcon.clear(); + m_strActiveTimerTime.clear(); + m_strNextTimerInfo.clear(); + m_strNextRecordingTitle.clear(); + m_strNextRecordingChannelName.clear(); + m_strNextRecordingChannelIcon.clear(); + m_strNextRecordingTime.clear(); + m_iTimerAmount = 0; + m_iRecordingTimerAmount = 0; + m_iTimerInfoToggleStart = {}; + m_iTimerInfoToggleCurrent = 0; +} + +bool CPVRGUITimerInfo::TimerInfoToggle() +{ + std::unique_lock<CCriticalSection> lock(m_critSection); + if (m_iTimerInfoToggleStart.time_since_epoch().count() == 0) + { + m_iTimerInfoToggleStart = std::chrono::steady_clock::now(); + m_iTimerInfoToggleCurrent = 0; + return true; + } + + auto now = std::chrono::steady_clock::now(); + auto duration = + std::chrono::duration_cast<std::chrono::milliseconds>(now - m_iTimerInfoToggleStart); + + if (duration.count() > + CServiceBroker::GetSettingsComponent()->GetAdvancedSettings()->m_iPVRInfoToggleInterval) + { + unsigned int iPrevious = m_iTimerInfoToggleCurrent; + unsigned int iBoundary = m_iRecordingTimerAmount > 0 ? m_iRecordingTimerAmount : m_iTimerAmount; + if (++m_iTimerInfoToggleCurrent > iBoundary - 1) + m_iTimerInfoToggleCurrent = 0; + + if (m_iTimerInfoToggleCurrent != iPrevious) + { + m_iTimerInfoToggleStart = std::chrono::steady_clock::now(); + return true; + } + } + + return false; +} + +void CPVRGUITimerInfo::UpdateTimersToggle() +{ + if (!TimerInfoToggle()) + return; + + std::string strActiveTimerTitle; + std::string strActiveTimerChannelName; + std::string strActiveTimerChannelIcon; + std::string strActiveTimerTime; + + /* safe to fetch these unlocked, since they're updated from the same thread as this one */ + if (m_iRecordingTimerAmount > 0) + { + std::vector<std::shared_ptr<CPVRTimerInfoTag>> activeTags = GetActiveRecordings(); + if (m_iTimerInfoToggleCurrent < activeTags.size()) + { + const std::shared_ptr<CPVRTimerInfoTag> tag = activeTags.at(m_iTimerInfoToggleCurrent); + strActiveTimerTitle = tag->Title(); + strActiveTimerChannelName = tag->ChannelName(); + strActiveTimerChannelIcon = tag->ChannelIcon(); + strActiveTimerTime = tag->StartAsLocalTime().GetAsLocalizedDateTime(false, false); + } + } + + std::unique_lock<CCriticalSection> lock(m_critSection); + m_strActiveTimerTitle = strActiveTimerTitle; + m_strActiveTimerChannelName = strActiveTimerChannelName; + m_strActiveTimerChannelIcon = strActiveTimerChannelIcon; + m_strActiveTimerTime = strActiveTimerTime; +} + +void CPVRGUITimerInfo::UpdateTimersCache() +{ + int iTimerAmount = AmountActiveTimers(); + int iRecordingTimerAmount = AmountActiveRecordings(); + + { + std::unique_lock<CCriticalSection> lock(m_critSection); + m_iTimerAmount = iTimerAmount; + m_iRecordingTimerAmount = iRecordingTimerAmount; + m_iTimerInfoToggleStart = {}; + } + + UpdateTimersToggle(); +} + +void CPVRGUITimerInfo::UpdateNextTimer() +{ + std::string strNextRecordingTitle; + std::string strNextRecordingChannelName; + std::string strNextRecordingChannelIcon; + std::string strNextRecordingTime; + std::string strNextTimerInfo; + + const std::shared_ptr<CPVRTimerInfoTag> timer = GetNextActiveTimer(); + if (timer) + { + strNextRecordingTitle = timer->Title(); + strNextRecordingChannelName = timer->ChannelName(); + strNextRecordingChannelIcon = timer->ChannelIcon(); + strNextRecordingTime = timer->StartAsLocalTime().GetAsLocalizedDateTime(false, false); + + strNextTimerInfo = StringUtils::Format("{} {} {} {}", g_localizeStrings.Get(19106), + timer->StartAsLocalTime().GetAsLocalizedDate(true), + g_localizeStrings.Get(19107), + timer->StartAsLocalTime().GetAsLocalizedTime("", false)); + } + + std::unique_lock<CCriticalSection> lock(m_critSection); + m_strNextRecordingTitle = strNextRecordingTitle; + m_strNextRecordingChannelName = strNextRecordingChannelName; + m_strNextRecordingChannelIcon = strNextRecordingChannelIcon; + m_strNextRecordingTime = strNextRecordingTime; + m_strNextTimerInfo = strNextTimerInfo; +} + +const std::string& CPVRGUITimerInfo::GetActiveTimerTitle() const +{ + std::unique_lock<CCriticalSection> lock(m_critSection); + return m_strActiveTimerTitle; +} + +const std::string& CPVRGUITimerInfo::GetActiveTimerChannelName() const +{ + std::unique_lock<CCriticalSection> lock(m_critSection); + return m_strActiveTimerChannelName; +} + +const std::string& CPVRGUITimerInfo::GetActiveTimerChannelIcon() const +{ + std::unique_lock<CCriticalSection> lock(m_critSection); + return m_strActiveTimerChannelIcon; +} + +const std::string& CPVRGUITimerInfo::GetActiveTimerDateTime() const +{ + std::unique_lock<CCriticalSection> lock(m_critSection); + return m_strActiveTimerTime; +} + +const std::string& CPVRGUITimerInfo::GetNextTimerTitle() const +{ + std::unique_lock<CCriticalSection> lock(m_critSection); + return m_strNextRecordingTitle; +} + +const std::string& CPVRGUITimerInfo::GetNextTimerChannelName() const +{ + std::unique_lock<CCriticalSection> lock(m_critSection); + return m_strNextRecordingChannelName; +} + +const std::string& CPVRGUITimerInfo::GetNextTimerChannelIcon() const +{ + std::unique_lock<CCriticalSection> lock(m_critSection); + return m_strNextRecordingChannelIcon; +} + +const std::string& CPVRGUITimerInfo::GetNextTimerDateTime() const +{ + std::unique_lock<CCriticalSection> lock(m_critSection); + return m_strNextRecordingTime; +} + +const std::string& CPVRGUITimerInfo::GetNextTimer() const +{ + std::unique_lock<CCriticalSection> lock(m_critSection); + return m_strNextTimerInfo; +} + +int CPVRGUIAnyTimerInfo::AmountActiveTimers() +{ + return CServiceBroker::GetPVRManager().Timers()->AmountActiveTimers(); +} + +int CPVRGUIAnyTimerInfo::AmountActiveRecordings() +{ + return CServiceBroker::GetPVRManager().Timers()->AmountActiveRecordings(); +} + +std::vector<std::shared_ptr<CPVRTimerInfoTag>> CPVRGUIAnyTimerInfo::GetActiveRecordings() +{ + return CServiceBroker::GetPVRManager().Timers()->GetActiveRecordings(); +} + +std::shared_ptr<CPVRTimerInfoTag> CPVRGUIAnyTimerInfo::GetNextActiveTimer() +{ + return CServiceBroker::GetPVRManager().Timers()->GetNextActiveTimer(); +} + +int CPVRGUITVTimerInfo::AmountActiveTimers() +{ + return CServiceBroker::GetPVRManager().Timers()->AmountActiveTVTimers(); +} + +int CPVRGUITVTimerInfo::AmountActiveRecordings() +{ + return CServiceBroker::GetPVRManager().Timers()->AmountActiveTVRecordings(); +} + +std::vector<std::shared_ptr<CPVRTimerInfoTag>> CPVRGUITVTimerInfo::GetActiveRecordings() +{ + return CServiceBroker::GetPVRManager().Timers()->GetActiveTVRecordings(); +} + +std::shared_ptr<CPVRTimerInfoTag> CPVRGUITVTimerInfo::GetNextActiveTimer() +{ + return CServiceBroker::GetPVRManager().Timers()->GetNextActiveTVTimer(); +} + +int CPVRGUIRadioTimerInfo::AmountActiveTimers() +{ + return CServiceBroker::GetPVRManager().Timers()->AmountActiveRadioTimers(); +} + +int CPVRGUIRadioTimerInfo::AmountActiveRecordings() +{ + return CServiceBroker::GetPVRManager().Timers()->AmountActiveRadioRecordings(); +} + +std::vector<std::shared_ptr<CPVRTimerInfoTag>> CPVRGUIRadioTimerInfo::GetActiveRecordings() +{ + return CServiceBroker::GetPVRManager().Timers()->GetActiveRadioRecordings(); +} + +std::shared_ptr<CPVRTimerInfoTag> CPVRGUIRadioTimerInfo::GetNextActiveTimer() +{ + return CServiceBroker::GetPVRManager().Timers()->GetNextActiveRadioTimer(); +} |