diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-10 18:07:22 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-10 18:07:22 +0000 |
commit | c04dcc2e7d834218ef2d4194331e383402495ae1 (patch) | |
tree | 7333e38d10d75386e60f336b80c2443c1166031d /xbmc/guilib/GUIKeyboardFactory.cpp | |
parent | Initial commit. (diff) | |
download | kodi-c04dcc2e7d834218ef2d4194331e383402495ae1.tar.xz kodi-c04dcc2e7d834218ef2d4194331e383402495ae1.zip |
Adding upstream version 2:20.4+dfsg.upstream/2%20.4+dfsg
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'xbmc/guilib/GUIKeyboardFactory.cpp')
-rw-r--r-- | xbmc/guilib/GUIKeyboardFactory.cpp | 239 |
1 files changed, 239 insertions, 0 deletions
diff --git a/xbmc/guilib/GUIKeyboardFactory.cpp b/xbmc/guilib/GUIKeyboardFactory.cpp new file mode 100644 index 0000000..fbf7a22 --- /dev/null +++ b/xbmc/guilib/GUIKeyboardFactory.cpp @@ -0,0 +1,239 @@ +/* + * Copyright (C) 2005-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 "ServiceBroker.h" +#include "GUIComponent.h" +#include "messaging/ApplicationMessenger.h" +#include "LocalizeStrings.h" +#include "GUIKeyboardFactory.h" +#include "GUIUserMessages.h" +#include "GUIWindowManager.h" +#include "messaging/helpers/DialogOKHelper.h" +#include "settings/Settings.h" +#include "settings/SettingsComponent.h" +#include "utils/Digest.h" +#include "utils/StringUtils.h" +#include "utils/Variant.h" + +#include "dialogs/GUIDialogKeyboardGeneric.h" +#if defined(TARGET_DARWIN_EMBEDDED) +#include "dialogs/GUIDialogKeyboardTouch.h" + +#include "platform/darwin/ios-common/DarwinEmbedKeyboard.h" +#endif + +using namespace KODI::MESSAGING; +using KODI::UTILITY::CDigest; + +CGUIKeyboard *CGUIKeyboardFactory::g_activeKeyboard = NULL; +FILTERING CGUIKeyboardFactory::m_filtering = FILTERING_NONE; + +CGUIKeyboardFactory::CGUIKeyboardFactory(void) = default; + +CGUIKeyboardFactory::~CGUIKeyboardFactory(void) = default; + +void CGUIKeyboardFactory::keyTypedCB(CGUIKeyboard *ref, const std::string &typedString) +{ + if(ref) + { + // send our search message in safe way (only the active window needs it) + CGUIMessage message(GUI_MSG_NOTIFY_ALL, ref->GetWindowId(), 0); + switch(m_filtering) + { + case FILTERING_SEARCH: + message.SetParam1(GUI_MSG_SEARCH_UPDATE); + message.SetStringParam(typedString); + CServiceBroker::GetAppMessenger()->SendGUIMessage( + message, CServiceBroker::GetGUI()->GetWindowManager().GetActiveWindow()); + break; + case FILTERING_CURRENT: + message.SetParam1(GUI_MSG_FILTER_ITEMS); + message.SetStringParam(typedString); + CServiceBroker::GetAppMessenger()->SendGUIMessage(message); + break; + case FILTERING_NONE: + break; + } + ref->resetAutoCloseTimer(); + } +} + +bool CGUIKeyboardFactory::SendTextToActiveKeyboard(const std::string &aTextString, bool closeKeyboard /* = false */) +{ + if (!g_activeKeyboard) + return false; + return g_activeKeyboard->SetTextToKeyboard(aTextString, closeKeyboard); +} + + +// Show keyboard with initial value (aTextString) and replace with result string. +// Returns: true - successful display and input (empty result may return true or false depending on parameter) +// false - unsuccessful display of the keyboard or cancelled editing +bool CGUIKeyboardFactory::ShowAndGetInput(std::string& aTextString, + const CVariant& heading, + bool allowEmptyResult, + bool hiddenInput /* = false */, + unsigned int autoCloseMs /* = 0 */) +{ + bool confirmed = false; + //heading can be a string or a localization id + std::string headingStr; + if (heading.isString()) + headingStr = heading.asString(); + else if (heading.isInteger() && heading.asInteger()) + headingStr = g_localizeStrings.Get((uint32_t)heading.asInteger()); + + bool useKodiKeyboard = true; +#if defined(TARGET_DARWIN_EMBEDDED) +#if defined(TARGET_DARWIN_TVOS) + useKodiKeyboard = CServiceBroker::GetSettingsComponent()->GetSettings()->GetBool( + CSettings::SETTING_INPUT_TVOSUSEKODIKEYBOARD); +#else + useKodiKeyboard = CDarwinEmbedKeyboard::hasExternalKeyboard(); +#endif // defined(TARGET_DARWIN_TVOS) +#endif + + auto& winManager = CServiceBroker::GetGUI()->GetWindowManager(); + CGUIKeyboard* kb = nullptr; + if (useKodiKeyboard) + kb = winManager.GetWindow<CGUIDialogKeyboardGeneric>(WINDOW_DIALOG_KEYBOARD); +#if defined(TARGET_DARWIN_EMBEDDED) + else + kb = winManager.GetWindow<CGUIDialogKeyboardTouch>(WINDOW_DIALOG_KEYBOARD_TOUCH); +#endif // defined(TARGET_DARWIN_EMBEDDED) + + if (kb) + { + g_activeKeyboard = kb; + kb->startAutoCloseTimer(autoCloseMs); + confirmed = kb->ShowAndGetInput(keyTypedCB, aTextString, aTextString, headingStr, hiddenInput); + g_activeKeyboard = NULL; + } + + if (confirmed) + { + if (!allowEmptyResult && aTextString.empty()) + confirmed = false; + } + + return confirmed; +} + +bool CGUIKeyboardFactory::ShowAndGetInput(std::string& aTextString, bool allowEmptyResult, unsigned int autoCloseMs /* = 0 */) +{ + return ShowAndGetInput(aTextString, CVariant{""}, allowEmptyResult, false, autoCloseMs); +} + +// Shows keyboard and prompts for a password. +// Differs from ShowAndVerifyNewPassword() in that no second verification is necessary. +bool CGUIKeyboardFactory::ShowAndGetNewPassword(std::string& newPassword, + const CVariant& heading, + bool allowEmpty, + unsigned int autoCloseMs /* = 0 */) +{ + return ShowAndGetInput(newPassword, heading, allowEmpty, true, autoCloseMs); +} + +// Shows keyboard and prompts for a password. +// Differs from ShowAndVerifyNewPassword() in that no second verification is necessary. +bool CGUIKeyboardFactory::ShowAndGetNewPassword(std::string& newPassword, unsigned int autoCloseMs /* = 0 */) +{ + return ShowAndGetNewPassword(newPassword, 12340, false, autoCloseMs); +} + +bool CGUIKeyboardFactory::ShowAndGetFilter(std::string &filter, bool searching, unsigned int autoCloseMs /* = 0 */) +{ + m_filtering = searching ? FILTERING_SEARCH : FILTERING_CURRENT; + bool ret = ShowAndGetInput(filter, searching ? 16017 : 16028, true, false, autoCloseMs); + m_filtering = FILTERING_NONE; + return ret; +} + + +// \brief Show keyboard twice to get and confirm a user-entered password string. +// \param newPassword Overwritten with user input if return=true. +// \param heading Heading to display +// \param allowEmpty Whether a blank password is valid or not. +// \return true if successful display and user input entry/re-entry. false if unsuccessful display, no user input, or canceled editing. +bool CGUIKeyboardFactory::ShowAndVerifyNewPassword(std::string& newPassword, + const CVariant& heading, + bool allowEmpty, + unsigned int autoCloseMs /* = 0 */) +{ + // Prompt user for password input + std::string userInput; + if (!ShowAndGetInput(userInput, heading, allowEmpty, true, autoCloseMs)) + { // user cancelled, or invalid input + return false; + } + // success - verify the password + std::string checkInput; + if (!ShowAndGetInput(checkInput, 12341, allowEmpty, true, autoCloseMs)) + { // user cancelled, or invalid input + return false; + } + // check the password + if (checkInput == userInput) + { + newPassword = CDigest::Calculate(CDigest::Type::MD5, userInput); + return true; + } + HELPERS::ShowOKDialogText(CVariant{12341}, CVariant{12344}); + return false; +} + +// \brief Show keyboard twice to get and confirm a user-entered password string. +// \param strNewPassword Overwritten with user input if return=true. +// \return true if successful display and user input entry/re-entry. false if unsuccessful display, no user input, or canceled editing. +bool CGUIKeyboardFactory::ShowAndVerifyNewPassword(std::string& newPassword, unsigned int autoCloseMs /* = 0 */) +{ + const std::string& heading = g_localizeStrings.Get(12340); + return ShowAndVerifyNewPassword(newPassword, heading, false, autoCloseMs); +} + +// \brief Show keyboard and verify user input against strPassword. +// \param strPassword Value to compare against user input. +// \param dlgHeading String shown on dialog title. Converts to localized string if contains a positive integer. +// \param iRetries If greater than 0, shows "Incorrect password, %d retries left" on dialog line 2, else line 2 is blank. +// \return 0 if successful display and user input. 1 if unsuccessful input. -1 if no user input or canceled editing. +int CGUIKeyboardFactory::ShowAndVerifyPassword(std::string& strPassword, const std::string& strHeading, int iRetries, unsigned int autoCloseMs /* = 0 */) +{ + std::string strHeadingTemp; + if (1 > iRetries && strHeading.size()) + strHeadingTemp = strHeading; + else + strHeadingTemp = + StringUtils::Format("{} - {} {}", g_localizeStrings.Get(12326), + CServiceBroker::GetSettingsComponent()->GetSettings()->GetInt( + CSettings::SETTING_MASTERLOCK_MAXRETRIES) - + iRetries, + g_localizeStrings.Get(12343)); + + std::string strUserInput; + //! @todo GUI Setting to enable disable this feature y/n? + if (!ShowAndGetInput(strUserInput, strHeadingTemp, false, true, autoCloseMs)) //bool hiddenInput = false/true ? + return -1; // user canceled out + + if (!strPassword.empty()) + { + std::string md5pword2 = CDigest::Calculate(CDigest::Type::MD5, strUserInput); + if (StringUtils::EqualsNoCase(strPassword, md5pword2)) + return 0; // user entered correct password + else return 1; // user must have entered an incorrect password + } + else + { + if (!strUserInput.empty()) + { + strPassword = CDigest::Calculate(CDigest::Type::MD5, strUserInput); + return 0; // user entered correct password + } + else return 1; + } +} + |