~aleteoryx/muditaos

68096b80265da252fc287dac9c22c93767762556 — Pawel Olejniczak 4 years ago 76dfa98
[EGD-7656] Fix implementation of the rich text tokens in phonebook

When creating contact with duplicated number,
the confirmation popup was showing incorrect information due to
incorrect fulfilling with contact data.
M image/assets/lang/Deutsch.json => image/assets/lang/Deutsch.json +2 -2
@@ 491,8 491,8 @@
  "app_phonebook_contact_no_name": "Kein Name",
  "app_phonebook_contact_information": "Information",
  "app_phonebook_ice_contacts_title": "ICE-Kontakte",
  "app_phonebook_duplicate_numbers": "Die Nummer $CONTACT_SPEED_DIAL$ wurde \n $CONTACT_NAME$ zugewiesen. Ersetzen?",
  "app_phonebook_duplicate_speed_dial_title": "Kurzwahltaste ($CONTACT_SPEED_DIAL$)",
  "app_phonebook_duplicate_speed_dial": "<text>Die Nummer <token>$CONTACT_SPEED_DIAL$</token> wurde \n <token>$CONTACT_FORMATTED_NAME$</token>zugewiesen. Ersetzen?</text>",
  "app_phonebook_duplicate_speed_dial_title": "<text>Kurzwahltaste (<token>$CONTACT_SPEED_DIAL$</token>)</text>",
  "app_phonebook_options_edit": "Kontakte ändern",
  "app_phonebook_options_block": "Blockieren",
  "app_phonebook_options_block_confirm": "Diesen Kontakt blockieren?",

M image/assets/lang/English.json => image/assets/lang/English.json +3 -6
@@ 109,7 109,6 @@
  "app_alarm_clock_repeat_week_days": "Weekdays",
  "app_alarm_clock_repeat_custom": "Custom",
  "app_alarm_clock_no_alarms_information": "<text align='center' color='9'>No alarms yet.<p>Press <b>left arrow</b> to add new.</p></text>",
  "app_alarm_clock_options_title": "Options",
  "app_alarm_clock_options_edit": "Edit",
  "app_alarm_clock_options_delete": "Delete",
  "app_alarm_clock_options_turn_off_all_alarms": "Turn off all alarms",


@@ 341,7 340,6 @@
  "app_settings_display_wallpaper_clock": "Clock",
  "app_settings_display_wallpaper_quotes": "Quotes",
  "app_settings_display_wallpaper_edit_quotes": "Edit quotes",
  "app_settings_display_wallpaper_quotes_options": "Options",
  "app_settings_display_wallpaper_quotes_edit": "Edit quote",
  "app_settings_display_wallpaper_quotes_delete": "Delete quote",
  "app_settings_display_wallpaper_quotes_new": "New quote",


@@ 453,7 451,6 @@
  "phone_lock_configure": "Configure passcode",
  "app_settings_security_usb_passcode": "USB security",
  "app_settings_apn_settings_no_apns": "<text align='center' color='9'>No APNs yet.<p>Press <b>left arrow</b> to add new.</p></text>",
  "app_settings_apn_options": "Options",
  "app_settings_apn_options_delete": "Delete",
  "app_settings_apn_options_edit": "Edit",
  "app_settings_apn_options_set_as_default": "Set as default",


@@ 495,9 492,9 @@
  "app_phonebook_contact_information": "Information",
  "app_phonebook_ice_contacts_title": "Emergency Contacts",
  "app_phonebook_favourite_contacts_title": "Favourite Contacts",
  "app_phonebook_duplicate_numbers": "Number $CONTACT_SPEED_DIAL$ is assigned to \n $CONTACT_NAME$. Replace it?",
  "app_phonebook_duplicate_speed_dial_title": "Speed dial key ($CONTACT_SPEED_DIAL$)",
  "app_phonebook_options_title": "Options",
  "app_phonebook_duplicate_numbers": "<text>This number is assigned to \n <token>$CONTACT_FORMATTED_NAME$</token>. Replace it?</text>",
  "app_phonebook_duplicate_speed_dial": "<text>Number <token>$CONTACT_SPEED_DIAL$</token> is assigned to \n <token>$CONTACT_FORMATTED_NAME$</token>. Replace it?</text>",
  "app_phonebook_duplicate_speed_dial_title": "<text>Speed dial key (<token>$CONTACT_SPEED_DIAL$</token>)</text>",
  "app_phonebook_options_edit": "Edit contact",
  "app_phonebook_options_block": "Block",
  "app_phonebook_options_block_confirm": "Block this contact?",

M image/assets/lang/Espanol.json => image/assets/lang/Espanol.json +2 -2
@@ 491,8 491,8 @@
  "app_phonebook_contact_no_name": "sin nombre",
  "app_phonebook_contact_information": "Información",
  "app_phonebook_ice_contacts_title": "Contactos de emergencia",
  "app_phonebook_duplicate_numbers": "El número $CONTACT_SPEED_DIAL$ está asignado a \n $CONTACT_NAME$. ¿Reemplazarlo?",
  "app_phonebook_duplicate_speed_dial_title": "Tecla de marcación rápida ($CONTACT_SPEED_DIAL$)",
  "app_phonebook_duplicate_speed_dial": "<text>El número <token>$CONTACT_SPEED_DIAL$</token> está asignado a \n <token>$CONTACT_FORMATTED_NAME$</token>. ¿Reemplazarlo?</text>",
  "app_phonebook_duplicate_speed_dial_title": "<text>Tecla de marcación rápida (<token>$CONTACT_SPEED_DIAL$</token>)</text>",
  "app_phonebook_options_edit": "Editar contacto",
  "app_phonebook_options_block": "Bloquear",
  "app_phonebook_options_block_confirm": "¿Bloquear este contacto?",

M image/assets/lang/Francais.json => image/assets/lang/Francais.json +2 -2
@@ 460,8 460,8 @@
  "app_phonebook_contact_no_name": "pas de nom",
  "app_phonebook_contact_information": "Information",
  "app_phonebook_ice_contacts_title": "Contacts d'urgence",
  "app_phonebook_duplicate_numbers": "Ces numéros appartiennent à\n$CONTACT_NAME$. Voulez-vous\ncréer un nouveau contact?",
  "app_phonebook_duplicate_speed_dial_title": "Touche de numérotation rapide ($CONTACT_SPEED_DIAL$)",
  "app_phonebook_duplicate_numbers": "<text>Ces numéros appartiennent à \n <token>$CONTACT_FORMATTED_NAME$</token>. Voulez-vous\ncréer un nouveau contact</text>",
  "app_phonebook_duplicate_speed_dial_title": "<text>Touche de numérotation rapide (<token>$CONTACT_SPEED_DIAL$</token>)</text>",
  "app_phonebook_options_edit": "Modifier le contact",
  "app_phonebook_options_block": "Bloquer",
  "app_phonebook_options_block_confirm": "Voulez-vous vraiment\nbloquer ce contact?",

M image/assets/lang/Polski.json => image/assets/lang/Polski.json +3 -2
@@ 506,8 506,9 @@
  "app_phonebook_contact_information": "Informacje",
  "app_phonebook_ice_contacts_title": "Kontakty ICE",
  "app_phonebook_favourite_contacts_title": "Ulubione Kontakty",
  "app_phonebook_duplicate_numbers": "Numer $CONTACT_SPEED_DIAL$ jest przypisany do: \n $CONTACT_NAME$. Zastąpić?",
  "app_phonebook_duplicate_speed_dial_title": "Klawisz szybkiego wybierania ($CONTACT_SPEED_DIAL$)",
  "app_phonebook_duplicate_numbers": "<text>Ten numer jest przypisany do \n <token>$CONTACT_FORMATTED_NAME$</token>. Zastąpić?</text>",
  "app_phonebook_duplicate_speed_dial": "<text>Numer <token>$CONTACT_SPEED_DIAL$</token> jest przypisany do \n <token>$CONTACT_FORMATTED_NAME$</token>. Zastąpić?</text>",
  "app_phonebook_duplicate_speed_dial_title": "<text>Klawisz szybkiego wybierania (<token>$CONTACT_SPEED_DIAL$</token>)</text>",
  "app_phonebook_options_edit": "Edytuj kontakt",
  "app_phonebook_new_add_to_fav": "Dodaj do ulubionych",
  "app_phonebook_options_block": "Blokuj",

M image/assets/lang/Svenska.json => image/assets/lang/Svenska.json +2 -2
@@ 377,8 377,8 @@
  "app_phonebook_contact_no_name": "inget namn",
  "app_phonebook_contact_information": "Information",
  "app_phonebook_ice_contacts_title": "ICE-kontakter vid olycka",
  "app_phonebook_duplicate_numbers": "Nummer $CONTACT_SPEED_DIAL$ är inställt att ringa \n $CONTACT_NAME$. Vill du ändra det?",
  "app_phonebook_duplicate_speed_dial_title": "Förvalsnummer ($CONTACT_SPEED_DIAL$)",
  "app_phonebook_duplicate_speed_dial": "<text>Nummer <token>$CONTACT_SPEED_DIAL$</token> är inställt att ringa \n <token>$CONTACT_FORMATTED_NAME$</token>. Vill du ändra det?</text>",
  "app_phonebook_duplicate_speed_dial_title": "<text>Förvalsnummer (<token>$CONTACT_SPEED_DIAL$</token>)</text>",
  "app_phonebook_options_edit": "Redigera kontakt",
  "app_phonebook_options_block": "Blockera",
  "app_phonebook_options_block_confirm": "Blockera den här kontakten?",

M module-apps/application-phonebook/CMakeLists.txt => module-apps/application-phonebook/CMakeLists.txt +0 -1
@@ 14,7 14,6 @@ target_include_directories(application-phonebook
target_sources(application-phonebook
    PRIVATE
        ApplicationPhonebook.cpp
        data/PhonebookUtils.cpp
        models/ContactDetailsModel.cpp
        models/NewContactModel.cpp
        models/PhonebookModel.cpp

D module-apps/application-phonebook/data/PhonebookUtils.cpp => module-apps/application-phonebook/data/PhonebookUtils.cpp +0 -20
@@ 1,20 0,0 @@
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include "PhonebookUtils.hpp"

namespace phonebookUtils
{
    void fillContactData(std::string &data, ContactRecord &contact)
    {
        utils::findAndReplaceAll(data, "$CONTACT_PRIMARY_NAME$", contact.primaryName);
        utils::findAndReplaceAll(data, "$CONTACT_ALTERNATIVE_NAME$", contact.alternativeName);
        utils::findAndReplaceAll(
            data, "$CONTACT_NAME$", contact.getFormattedName(ContactRecord::NameFormatType::Title));
        utils::findAndReplaceAll(
            data, "$CONTACT_NUMBER1$", (contact.numbers.size() == 1) ? contact.numbers[0].number.getEntered() : "");
        utils::findAndReplaceAll(
            data, "$CONTACT_NUMBER2$", (contact.numbers.size() == 2) ? contact.numbers[1].number.getEntered() : "");
        utils::findAndReplaceAll(data, "$CONTACT_SPEED_DIAL$", contact.speeddial);
    }
} // namespace phonebookUtils

D module-apps/application-phonebook/data/PhonebookUtils.hpp => module-apps/application-phonebook/data/PhonebookUtils.hpp +0 -12
@@ 1,12 0,0 @@
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#pragma once

#include <ContactRecord.hpp>
#include <Utils.hpp>

namespace phonebookUtils
{
    void fillContactData(std::string &data, ContactRecord &contact);
} // namespace phonebookUtils

M module-apps/application-phonebook/windows/PhonebookNamecardOptions.cpp => module-apps/application-phonebook/windows/PhonebookNamecardOptions.cpp +0 -1
@@ 5,7 5,6 @@
#include "PhonebookNamecardOptions.hpp"
#include "application-phonebook/ApplicationPhonebook.hpp"
#include "application-phonebook/data/PhonebookItemData.hpp"
#include "application-phonebook/data/PhonebookUtils.hpp"
#include "application-messages/data/SMSdata.hpp"

namespace gui

M module-apps/application-phonebook/windows/PhonebookNewContact.cpp => module-apps/application-phonebook/windows/PhonebookNewContact.cpp +44 -34
@@ 5,7 5,6 @@

#include "DialogMetadata.hpp"
#include "application-phonebook/ApplicationPhonebook.hpp"
#include "application-phonebook/data/PhonebookUtils.hpp"

#include <Dialog.hpp>
#include <service-db/DBServiceAPI.hpp>


@@ 199,21 198,27 @@ namespace gui
        auto matchedContact   = DBServiceAPI::MatchContactByPhoneNumber(application, duplicatedNumber);
        auto oldContactRecord = (matchedContact != nullptr) ? *matchedContact : ContactRecord{};

        std::string duplicatedNumberPhrase = utils::translate("app_phonebook_duplicate_numbers");
        phonebookUtils::fillContactData(duplicatedNumberPhrase, oldContactRecord);

        auto metaData = std::make_unique<gui::DialogMetadataMessage>(gui::DialogMetadata{
            duplicatedNumber.getFormatted(), "info_big_circle_W_G", duplicatedNumberPhrase, "", [=]() -> bool {
                if (contactAction == ContactAction::Add) {
                    contact->ID = oldContactRecord.ID;
                }
                if (!DBServiceAPI::ContactUpdate(application, *contact)) {
                    LOG_ERROR("Contact id=%" PRIu32 " update failed", contact->ID);
                    return false;
                }
                application->switchWindow(gui::name::window::main_window);
                return true;
            }});
        auto metaData = std::make_unique<gui::DialogMetadataMessage>(
            gui::DialogMetadata{duplicatedNumber.getFormatted(),
                                "info_big_circle_W_G",
                                text::RichTextParser()
                                    .parse(utils::translate("app_phonebook_duplicate_numbers"),
                                           nullptr,
                                           gui::text::RichTextParser::TokenMap(
                                               {{"$CONTACT_FORMATTED_NAME$", oldContactRecord.getFormattedName()}}))
                                    ->getText(),
                                "",
                                [=]() -> bool {
                                    if (contactAction == ContactAction::Add) {
                                        contact->ID = oldContactRecord.ID;
                                    }
                                    if (!DBServiceAPI::ContactUpdate(application, *contact)) {
                                        LOG_ERROR("Contact id=%" PRIu32 " update failed", contact->ID);
                                        return false;
                                    }
                                    application->switchWindow(gui::name::window::main_window);
                                    return true;
                                }});
        application->switchWindow(gui::window::name::dialog_yes_no, std::move(metaData));
    }



@@ 226,24 231,29 @@ namespace gui
            contact->ID = oldContactRecord.ID;
        }

        std::string duplicatedSpeedDialPhrase = utils::translate("app_phonebook_duplicate_numbers");
        phonebookUtils::fillContactData(duplicatedSpeedDialPhrase, oldContactRecord);
        std::string duplicatedSpeedDialTitle = utils::translate("app_phonebook_duplicate_speed_dial_title");
        phonebookUtils::fillContactData(duplicatedSpeedDialTitle, oldContactRecord);

        auto metaData = std::make_unique<gui::DialogMetadataMessage>(
            gui::DialogMetadata{duplicatedSpeedDialTitle,
                                "phonebook_empty_grey_circle_speed_dial",
                                duplicatedSpeedDialPhrase,
                                contact->speeddial,
                                [=]() -> bool {
                                    if (!DBServiceAPI::ContactUpdate(application, *contact)) {
                                        LOG_ERROR("Contact id=%" PRIu32 " update failed", contact->ID);
                                        return false;
                                    }
                                    application->switchWindow(gui::name::window::main_window);
                                    return true;
                                }});
        auto metaData = std::make_unique<gui::DialogMetadataMessage>(gui::DialogMetadata{
            text::RichTextParser()
                .parse(utils::translate("app_phonebook_duplicate_speed_dial_title"),
                       nullptr,
                       gui::text::RichTextParser::TokenMap(
                           {{"$CONTACT_SPEED_DIAL$", oldContactRecord.speeddial},
                            {"$CONTACT_FORMATTED_NAME$", oldContactRecord.getFormattedName()}}))
                ->getText(),
            "phonebook_empty_grey_circle_speed_dial",
            text::RichTextParser()
                .parse(utils::translate("app_phonebook_duplicate_speed_dial"),
                       nullptr,
                       gui::text::RichTextParser::TokenMap({{"$CONTACT_SPEED_DIAL$", oldContactRecord.speeddial}}))
                ->getText(),
            contact->speeddial,
            [=]() -> bool {
                if (!DBServiceAPI::ContactUpdate(application, *contact)) {
                    LOG_ERROR("Contact id=%" PRIu32 " update failed", contact->ID);
                    return false;
                }
                application->switchWindow(gui::name::window::main_window);
                return true;
            }});
        application->switchWindow(gui::window::name::dialog_yes_no_icon_txt, std::move(metaData));
    }


M module-apps/apps-common/locks/windows/LockInputWindow.cpp => module-apps/apps-common/locks/windows/LockInputWindow.cpp +1 -2
@@ 143,8 143,7 @@ namespace gui
        case TextType::Title: {
            header->setTitleVisibility(true);
            if (!tokens.empty()) {
                TextFormat format(FontManager::getInstance().getFont(style::window::font::medium));
                setTitle(text::RichTextParser().parse(utils::translate(value), &format, std::move(tokens))->getText());
                setTitle(text::RichTextParser().parse(utils::translate(value), nullptr, std::move(tokens))->getText());
            }
            else {
                setTitle(utils::translate(value));

M module-gui/gui/widgets/RichTextParser.cpp => module-gui/gui/widgets/RichTextParser.cpp +3 -3
@@ 523,13 523,13 @@ namespace gui::text
        -> std::unique_ptr<TextDocument>
    {
        log_parser("parsing: %s", text.c_str());
        if (text.empty() || base_style == nullptr) {
            log_parser("no: %s", text.empty() ? "text" : "base style");
        if (text.empty()) {
            log_parser("no: %s", "text");
            return nullptr;
        }

        pugi::xml_document doc;
        walker walker(*base_style, std::move(tokenMap));
        walker walker(base_style == nullptr ? nullptr : *base_style, std::move(tokenMap));

        doc.load_string(text.c_str());
        doc.traverse(walker);