2 * Copyright (C) 2005-2018 Team Kodi
3 * This file is part of Kodi - https://kodi.tv
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 * See LICENSES/README.md for more information.
8 #include "AddonStatusHandler.h"
10 #include "ServiceBroker.h"
11 #include "addons/AddonManager.h"
12 #include "addons/IAddonManagerCallback.h"
13 #include "addons/addoninfo/AddonInfo.h"
14 #include "addons/gui/GUIDialogAddonSettings.h"
15 #include "dialogs/GUIDialogKaiToast.h"
16 #include "dialogs/GUIDialogYesNo.h"
17 #include "guilib/GUIComponent.h"
18 #include "guilib/GUIWindowManager.h"
19 #include "messaging/ApplicationMessenger.h"
20 #include "messaging/helpers/DialogOKHelper.h"
21 #include "utils/StringUtils.h"
22 #include "utils/Variant.h"
23 #include "utils/log.h"
28 using namespace KODI::MESSAGING
;
33 /**********************************************************
34 * CAddonStatusHandler - AddOn Status Report Class
36 * Used to inform the user about occurred errors and
37 * changes inside Add-on's, and ask him what to do.
41 CCriticalSection
CAddonStatusHandler::m_critSection
;
43 CAddonStatusHandler::CAddonStatusHandler(const std::string
& addonID
,
44 AddonInstanceId instanceId
,
47 : CThread(("AddonStatus " + std::to_string(instanceId
) + "@" + addonID
).c_str()),
48 m_instanceId(instanceId
)
50 //! @todo The status handled CAddonStatusHandler by is related to the class, not the instance
51 //! having CAddonMgr construct an instance makes no sense
52 if (!CServiceBroker::GetAddonMgr().GetAddon(addonID
, m_addon
, OnlyEnabled::CHOICE_YES
))
56 "Called Add-on status handler for '{}' of clientName:{}, clientID:{}, instanceID:{} "
58 status
, m_addon
->Name(), m_addon
->ID(), m_instanceId
, sameThread
? "yes" : "no");
72 CAddonStatusHandler::~CAddonStatusHandler()
77 void CAddonStatusHandler::OnStartup()
79 SetPriority(ThreadPriority::LOWEST
);
82 void CAddonStatusHandler::OnExit()
86 void CAddonStatusHandler::Process()
88 std::unique_lock
<CCriticalSection
> lock(m_critSection
);
90 std::string heading
= StringUtils::Format(
91 "{}: {}", CAddonInfo::TranslateType(m_addon
->Type(), true), m_addon
->Name());
93 /* Request to restart the AddOn and data structures need updated */
94 if (m_status
== ADDON_STATUS_NEED_RESTART
)
96 HELPERS::ShowOKDialogLines(CVariant
{heading
}, CVariant
{24074});
97 CServiceBroker::GetAddonMgr()
98 .GetCallbackForType(m_addon
->Type())
99 ->RequestRestart(m_addon
->ID(), m_instanceId
, true);
101 /* Some required settings are missing/invalid */
102 else if (m_status
== ADDON_STATUS_NEED_SETTINGS
)
104 CGUIDialogYesNo
* pDialogYesNo
= CServiceBroker::GetGUI()->GetWindowManager().GetWindow
<CGUIDialogYesNo
>(WINDOW_DIALOG_YES_NO
);
105 if (!pDialogYesNo
) return;
107 pDialogYesNo
->SetHeading(CVariant
{heading
});
108 pDialogYesNo
->SetLine(1, CVariant
{24070});
109 pDialogYesNo
->SetLine(2, CVariant
{24072});
110 pDialogYesNo
->Open();
112 if (!pDialogYesNo
->IsConfirmed()) return;
114 if (!m_addon
->HasSettings(m_instanceId
))
117 if (CGUIDialogAddonSettings::ShowForAddon(m_addon
))
119 //! @todo Doesn't dialogaddonsettings save these automatically? It should do this.
120 m_addon
->SaveSettings(m_instanceId
);
121 CServiceBroker::GetAddonMgr()
122 .GetCallbackForType(m_addon
->Type())
123 ->RequestRestart(m_addon
->ID(), m_instanceId
, true);
129 } /*namespace ADDON*/