#define APP_APP_CONTROL_REQUEST_H
#include "App/AppControl.h"
+#include "Utils/Range.h"
+
#include <string>
#include <vector>
AppControl EXPORT_API requestCallSettings();
/**
- * @brief Request message composer
- * @param[in] scheme URI scheme (e.g. sms:, mmsto: or mailto:)
- * @param[in] to Message recipient
- * @param[in] subject Message subject
- * @param[in] text Message text
+ * @brief Request message or email composer for single recipient.
+ * @param[in] scheme URI scheme (e.g. sms: or mmsto: for message, mailto: for email)
+ * @param[in] to Recipient
+ * @param[in] subject Subject
+ * @param[in] text Text
+ * @return AppControl wrapper
+ */
+ AppControl EXPORT_API requestComposer(const char *scheme, const char *to,
+ const char *subject = nullptr, const char *text = nullptr);
+
+ /**
+ * @brief Request message or email composer for multiple recipients.
+ * @param[in] scheme URI scheme (e.g. sms: or mmsto: for message, mailto: for email)
+ * @param[in] recipients Multiple recipients
+ * @param[in] subject Subject
+ * @param[in] text Text
* @return AppControl wrapper
*/
- AppControl EXPORT_API requestMessageComposer(const char *scheme, const char *to,
+ AppControl EXPORT_API requestComposer(const char *scheme, Utils::Range<const char **> recipients,
const char *subject = nullptr, const char *text = nullptr);
/**
return AppControl(APP_CONTROL_OPERATION_SETTING_CALL, nullptr);
}
-AppControl App::requestMessageComposer(const char *scheme, const char *to,
+AppControl App::requestComposer(const char *scheme, const char *to,
const char *subject, const char *text)
{
- AppControl request(APP_CONTROL_OPERATION_COMPOSE, nullptr,
- std::string(scheme).append(to).c_str());
+ std::string uri = scheme;
+ if (to) {
+ uri.append(to);
+ }
+ AppControl request(APP_CONTROL_OPERATION_COMPOSE, nullptr, uri.c_str());
request.addExtra(APP_CONTROL_DATA_TITLE, subject);
request.addExtra(APP_CONTROL_DATA_TEXT, text);
return request;
}
+AppControl App::requestComposer(const char *scheme, Utils::Range<const char **> recipients,
+ const char *subject, const char *text)
+{
+ AppControl request = requestComposer(scheme, nullptr, subject, text);
+ request.addExtra(APP_CONTROL_DATA_TO, recipients.begin(), recipients.count());
+ return request;
+}
+
AppControl App::requestCameraImage()
{
return AppControl(APP_CONTROL_OPERATION_CREATE_CONTENT, APP_CONTROL_MIME_IMAGE);
void NavigatorPage::setExpanded(bool isExpanded)
{
setTitleVisibility(isExpanded);
- if (m_Navigator) {
+ if (m_Navigator && m_Navigator->getPage()) {
m_Navigator->getPage()->setTitleVisibility(!isExpanded);
}
}
namespace Groups
{
class AddMembersItem;
- class NameItem;
- class RingtoneItem;
namespace Model
{
Ui::Genlist *m_Genlist;
AddMembersItem *m_AddMembersItem;
- NameItem *m_NameItem;
- RingtoneItem *m_RingtoneItem;
};
}
}
{
namespace Groups
{
+ namespace Model
+ {
+ class MembersProvider;
+ }
+
/**
* @brief Group members list view.
*/
/**
* @brief Create members list view.
* @param[in] groupId Group id
+ * @param[in] provider Group provider
*/
- MembersListView(int groupId);
+ MembersListView(int groupId, Model::MembersProvider *provider);
private:
+ enum EditType {
+ EditAdd,
+ EditRemove,
+ };
+
+ enum ComposerType {
+ ComposerMessage,
+ ComposerEmail
+ };
+
virtual void onPageAttached(Ui::NavigatorPage *page) override;
virtual void onMenuPressed() override;
virtual void onUpdateFinished() override;
std::string getTitle() const;
+ void onAddSelected();
+ void onRemoveSelected();
+ bool onRemoveFinished();
+
+ void onMembersSelected(Ux::SelectResults results, EditType type);
+ void onSendSelected(ComposerType composerType);
+ bool onRecipientsSelected(Ux::SelectResults results, ComposerType type);
+
int m_GroupId;
};
}
* @brief Constructor.
* @param[in] groupId Group id
* @param[in] mode Members mode
+ * @param[in] type Fiter type
*/
- explicit MembersProvider(int groupId, Mode mode = ModeDefault);
+ explicit MembersProvider(int groupId, Mode mode = ModeDefault,
+ int type = FilterNone);
virtual ~MembersProvider() override;
private:
contacts_list_h getMembersList() const;
- void onChanged(const char *uri);
void onGroupChanged(const char *uri);
int m_GroupId;
Mode m_Mode;
- int m_DbVersion;
int m_GroupDbVersion;
};
}
#include "Ui/GenItem.h"
-#include <string>
+#include <contacts.h>
namespace Ui
{
/**
* @brief Genlist item representing group's name item
- * @param[in] name value that will be set to entry
+ * @param[in] record Group's record
*/
- NameItem(std::string name = "");
+ NameItem(contacts_record_h record);
/**
* @brief Set item filled callback.
*/
void setFilledCallback(FilledCallback callback);
- /**
- * @return group name
- */
- const std::string &getName() const;
-
private:
virtual Elm_Genlist_Item_Class *getItemClass() const override;
virtual char *getText(Evas_Object *parent, const char *part) override;
void onChanged(Evas_Object *entry, void *eventInfo);
- std::string m_Name;
+ contacts_record_h m_Record;
FilledCallback m_OnFilled;
};
}
#include "App/AppControl.h"
-#include <string>
+#include <contacts.h>
namespace Contacts
{
{
public:
/**
- * @return ringtone path
+ * @brief Create group's ringtone item
+ * @param[in] record Group's record
*/
- const std::string &getPath() const;
+ RingtoneItem(contacts_record_h record);
private:
virtual Elm_Genlist_Item_Class *getItemClass() const override;
app_control_result_e result);
App::AppControl m_AppControl;
- std::string m_Path;
+ contacts_record_h m_Record;
};
}
}
void setAddButtonVisibility(bool isVisible);
/**
- * @brief Set help text for no content layout.
+ * @brief Set help text for no content layout
* @param[in] text Help text
*/
void setNoContentHelpText(const char *text);
Model::PersonProvider *getProvider() const;
/**
- * @brief Called when updating is finished.
+ * @brief Called when updating is finished
*/
virtual void onUpdateFinished();
+ /**
+ * @return True if list is empty, false - otherwise
+ */
+ bool isListEmpty();
+
private:
struct Section
{
using namespace Contacts::List;
AddMembersItem::AddMembersItem(int groupId)
- : m_GroupId(groupId), m_Count(0)
+ : m_GroupId(groupId)
{
+ m_Count = getMembersCount(m_GroupId);
}
const std::vector<int> &AddMembersItem::getMemberIdList() const
#include "Contacts/Groups/MembersListView.h"
#include "Contacts/Groups/Model/Queries.h"
+#include "Contacts/Groups/Model/MembersProvider.h"
#include "Ui/Navigator.h"
-#include "Utils/Logger.h"
#define BUFFER_SIZE 1024
return;
}
- navigator->navigateTo(new MembersListView(m_Group.getId()));
+ navigator->navigateTo(new MembersListView(m_Group.getId(),
+ new MembersProvider(m_Group.getId())));
}
if (changes & Group::ChangedName) {
item->pop();
insertItem(item);
+ } else {
+ item->update(changes);
}
}
#include "Contacts/Groups/InputView.h"
-#include "Common/Database/RecordIterator.h"
-#include "Common/Database/RecordUtils.h"
#include "Contacts/Groups/AddMembersItem.h"
#include "Contacts/Groups/NameItem.h"
#include "Contacts/Groups/RingtoneItem.h"
#include "GroupItemLayout.h"
#include "App/Path.h"
+#include "Common/Database/RecordUtils.h"
#include "Ui/Genlist.h"
#include "Utils/Callback.h"
#include <app_i18n.h>
#include <notification.h>
+using namespace Common::Database;
using namespace Contacts::Groups;
using namespace Contacts::Groups::Model;
-using namespace Common::Database;
InputView::InputView(int id)
: m_Id(id), m_CancelButton(nullptr), m_DoneButton(nullptr), m_Genlist(nullptr),
- m_AddMembersItem(nullptr), m_NameItem(nullptr), m_RingtoneItem(nullptr)
+ m_AddMembersItem(nullptr)
{
if (m_Id) {
contacts_db_get_record(_contacts_group._uri, m_Id, &m_Record);
m_Genlist = new Ui::Genlist();
m_Genlist->create(parent);
- m_NameItem = new NameItem();
- m_NameItem->setFilledCallback(std::bind(&InputView::onNameFilled, this, std::placeholders::_1));
- m_Genlist->insert(m_NameItem);
+ NameItem *nameItem = new NameItem(m_Record);
+ nameItem->setFilledCallback(std::bind(&InputView::onNameFilled, this, std::placeholders::_1));
+ m_Genlist->insert(nameItem);
m_AddMembersItem = new AddMembersItem(m_Id);
m_Genlist->insert(m_AddMembersItem);
- m_RingtoneItem = new RingtoneItem();
- m_Genlist->insert(m_RingtoneItem);
+ m_Genlist->insert(new RingtoneItem(m_Record));
return m_Genlist->getEvasObject();
}
contacts_filter_h filter = nullptr;
contacts_filter_create(_contacts_group._uri, &filter);
contacts_filter_add_str(filter, _contacts_group.name,
- CONTACTS_MATCH_EXACTLY, m_NameItem->getName().c_str());
+ CONTACTS_MATCH_EXACTLY, getRecordStr(m_Record, _contacts_group.name));
+
+ if (m_Id) {
+ contacts_filter_add_operator(filter, CONTACTS_FILTER_OPERATOR_AND);
+ contacts_filter_add_int(filter, _contacts_group.id, CONTACTS_MATCH_NOT_EQUAL, m_Id);
+ }
contacts_query_h query = nullptr;
contacts_query_create(_contacts_group._uri, &query);
int count = 0;
contacts_db_get_count_with_query(query, &count);
contacts_query_destroy(query);
+
return count != 0;
}
void InputView::save()
{
- contacts_record_set_str(m_Record, _contacts_group.name,
- m_NameItem->getName().c_str());
- contacts_record_set_str(m_Record, _contacts_group.ringtone_path,
- m_RingtoneItem->getPath().c_str());
-
if (!m_Id) {
contacts_db_insert_record(m_Record, &m_Id);
-
- for (auto &&contactId : m_AddMembersItem->getMemberIdList()) {
- contacts_group_add_contact(m_Id, contactId);
- }
+ }
+ for (auto &&contactId : m_AddMembersItem->getMemberIdList()) {
+ contacts_group_add_contact(m_Id, contactId);
}
contacts_db_update_record(m_Record);
#include "Contacts/Groups/MembersListView.h"
-#include "Contacts/Groups/Model/Queries.h"
+#include "Contacts/Common/ContactSelectTypes.h"
+#include "Contacts/Groups/InputView.h"
#include "Contacts/Groups/Model/MembersProvider.h"
+#include "App/AppControlRequest.h"
#include "Common/Database/RecordUtils.h"
+#include "Ui/Menu.h"
+#include "Ui/Navigator.h"
+#include "Ui/ProcessPopup.h"
+#include "Utils/Thread.h"
#define BUFFER_SIZE 1024
+using namespace Common::Database;
using namespace Contacts::Groups;
+using namespace Contacts::Groups::Model;
using namespace Contacts::List;
+using namespace Ui;
+using namespace Ux;
+using namespace std::placeholders;
-MembersListView::MembersListView(int groupId)
- : ListView(new Model::MembersProvider(groupId)), m_GroupId(groupId)
+namespace
+{
+ struct ComposerData {
+ int type;
+ contacts_person_property_e propertyType;
+ const char *uri;
+ unsigned int propertyId;
+ const char *scheme;
+ } composerData[] = {
+ /*ComposerMessage = */ { Contacts::FilterNumber, CONTACTS_PERSON_PROPERTY_NUMBER,
+ _contacts_number._uri, _contacts_number.number, "sms:" },
+ /*ComposerEmail = */ { Contacts::FilterEmail, CONTACTS_PERSON_PROPERTY_EMAIL,
+ _contacts_email._uri, _contacts_email.email, "mailto:" }
+ };
+}
+
+MembersListView::MembersListView(int groupId, Model::MembersProvider *provider)
+ : ListView(provider), m_GroupId(groupId)
{
setAddButtonVisibility(false);
setNoContentHelpText("IDS_PB_BODY_AFTER_YOU_ADD_CONTACTS_THEY_WILL_BE_SHOWN_HERE");
}
}
-void MembersListView::onPageAttached(Ui::NavigatorPage *page)
+void MembersListView::onPageAttached(NavigatorPage *page)
{
- if (getSelectMode() == Ux::SelectNone) {
+ if (getSelectMode() == SelectNone) {
page->setTitle(getTitle().c_str());
+ } else {
+ SelectView::onPageAttached(page);
}
}
void MembersListView::onMenuPressed()
{
+ if (getSelectMode() != SelectNone) {
+ return;
+ }
+
+ Menu *menu = new Menu();
+ menu->create(getEvasObject());
+
+ menu->addItem("IDS_PB_OPT_EDIT", [this] {
+ getNavigator()->navigateTo(new InputView(m_GroupId));
+ });
+
+ menu->addItem("IDS_PB_OPT_ADD", std::bind(&MembersListView::onAddSelected, this));
+
+ if (!isListEmpty()) {
+ menu->addItem("IDS_PB_OPT_REMOVE",
+ std::bind(&MembersListView::onRemoveSelected, this));
+ menu->addItem("IDS_PB_OPT_SEND_MESSAGE_ABB2",
+ std::bind(&MembersListView::onSendSelected, this, ComposerMessage));
+ menu->addItem("IDS_PB_OPT_SEND_EMAIL",
+ std::bind(&MembersListView::onSendSelected, this, ComposerEmail));
+ }
+
+ menu->show();
}
void MembersListView::onUpdateFinished()
{
ListView::onUpdateFinished();
- if (getSelectMode() == Ux::SelectNone) {
+ if (getSelectMode() == SelectNone) {
getPage()->setTitle(getTitle().c_str());
}
}
{
contacts_record_h record = nullptr;
contacts_db_get_record(_contacts_group._uri, m_GroupId, &record);
- const char *name = Common::Database::getRecordStr(record, _contacts_group.name);
+ const char *name = getRecordStr(record, _contacts_group.name);
char title[BUFFER_SIZE] = { 0, };
int count = getProvider()->getDataList().size();
contacts_record_destroy(record, true);
return std::string(title);
}
+
+void MembersListView::onAddSelected()
+{
+ ListView *view = new ListView(new Model::MembersProvider(m_GroupId,
+ Model::MembersProvider::ModeExclude));
+ view->setSelectMode(SelectMulti);
+ view->setNoContentHelpText("");
+ view->setSectionVisibility(ListView::SectionFavorites, false);
+
+ view->setSelectCallback([this, view](SelectResults results) {
+ auto popup = ProcessPopup::create(view->getEvasObject(), "IDS_PB_TPOP_PROCESSING_ING");
+ new Utils::Thread(std::bind(&MembersListView::onMembersSelected, this, std::move(results), EditAdd),
+ [view, popup] {
+ popup->close();
+ view->getPage()->close();
+ });
+ return false;
+ });
+
+ getNavigator()->navigateTo(view);
+}
+
+void MembersListView::onRemoveSelected()
+{
+ setSelectMode(SelectMulti);
+ setCancelCallback(std::bind(&MembersListView::onRemoveFinished, this));
+
+ setSelectCallback([this](SelectResults results) {
+ auto popup = ProcessPopup::create(getEvasObject(), "IDS_PB_TPOP_PROCESSING_ING");
+ new Utils::Thread(std::bind(&MembersListView::onMembersSelected, this, std::move(results), EditRemove),
+ [this, popup] {
+ popup->close();
+ onRemoveFinished();
+ });
+ return false;
+ });
+}
+
+bool MembersListView::onRemoveFinished()
+{
+ setSelectMode(SelectNone);
+ getPage()->setTitleVisibility(true);
+ getPage()->setTitle(getTitle().c_str());
+ setCancelCallback(nullptr);
+ setSelectCallback(nullptr);
+ return false;
+}
+
+void MembersListView::onMembersSelected(SelectResults results, EditType type)
+{
+ contacts_connect_on_thread();
+ for (auto &&result : results) {
+ contacts_record_h record = nullptr;
+ contacts_db_get_record(_contacts_person._uri, result.value.id, &record);
+ if (type == EditAdd) {
+ contacts_group_add_contact(m_GroupId, getRecordInt(record,
+ _contacts_person.display_contact_id));
+ } else {
+ contacts_group_remove_contact(m_GroupId, getRecordInt(record,
+ _contacts_person.display_contact_id));
+ }
+ contacts_record_destroy(record, true);
+ }
+ contacts_disconnect_on_thread();
+}
+
+void MembersListView::onSendSelected(ComposerType composerType)
+{
+ MembersListView *view = new MembersListView(m_GroupId, new MembersProvider(m_GroupId,
+ MembersProvider::ModeDefault, composerData[composerType].type));
+ view->setSelectMode(SelectMulti);
+ view->setNoContentHelpText("");
+ view->setSelectCallback(std::bind(&MembersListView::onRecipientsSelected,
+ this, _1, composerType));
+
+ getNavigator()->navigateTo(view);
+}
+
+bool MembersListView::onRecipientsSelected(SelectResults results, ComposerType type)
+{
+ int length = results.size();
+ std::vector<std::string> recipientsString(length);
+ std::vector<const char *> recipients(length);
+
+ int index = 0;
+ for (auto &&result : results) {
+ int id = 0;
+ contacts_person_get_default_property(composerData[type].propertyType,
+ result.value.id, &id);
+
+ contacts_record_h record = nullptr;
+ contacts_db_get_record(composerData[type].uri, id, &record);
+
+ if (const char *recipient = getRecordStr(record, composerData[type].propertyId)) {
+ recipientsString[index] = recipient;
+ recipients[index] = recipientsString[index].c_str();
+ ++index;
+ }
+
+ contacts_record_destroy(record, true);
+ }
+
+ App::AppControl request = App::requestComposer(composerData[type].scheme,
+ { recipients.data(), recipients.size() });
+ request.launch();
+ request.detach();
+
+ return true;
+}
};
}
-MembersProvider::MembersProvider(int groupId, Mode mode)
- : m_GroupId(groupId), m_Mode(mode)
+MembersProvider::MembersProvider(int groupId, Mode mode, int type)
+ : PersonProvider(type), m_GroupId(groupId), m_Mode(mode)
{
- contacts_db_get_current_version(&m_DbVersion);
- m_GroupDbVersion = m_DbVersion;
- contacts_db_add_changed_cb(_contacts_group_relation._uri,
- makeCallbackWithLastParam(&MembersProvider::onChanged), this);
+ contacts_db_get_current_version(&m_GroupDbVersion);
contacts_db_add_changed_cb(_contacts_group._uri,
makeCallbackWithLastParam(&MembersProvider::onGroupChanged), this);
}
MembersProvider::~MembersProvider()
{
- contacts_db_remove_changed_cb(_contacts_group_relation._uri,
- makeCallbackWithLastParam(&MembersProvider::onChanged), this);
contacts_db_remove_changed_cb(_contacts_group._uri,
makeCallbackWithLastParam(&MembersProvider::onGroupChanged), this);
}
return nullptr;
}
- contacts_filter_h filter = nullptr;
- contacts_filter_create(_contacts_person._uri, &filter);
+ contacts_filter_h filter = PersonProvider::getFilter();
+ if (filter) {
+ contacts_filter_add_operator(filter, CONTACTS_FILTER_OPERATOR_AND);
+ } else {
+ contacts_filter_create(_contacts_person._uri, &filter);
+ }
+
if (m_Mode == ModeExclude) {
contacts_filter_add_bool(filter, _contacts_person.is_favorite, false);
contacts_filter_add_operator(filter, CONTACTS_FILTER_OPERATOR_AND);
return list;
}
-void MembersProvider::onChanged(const char *uri)
-{
- contacts_list_h changes = nullptr;
- contacts_db_get_changes_by_version(_contacts_grouprel_updated_info._uri, 0,
- m_DbVersion, &changes, &m_DbVersion);
- bool isChanged = false;
-
- for (auto &&record : makeRange(changes)) {
- if (getRecordInt(record, _contacts_grouprel_updated_info.group_id) != m_GroupId) {
- continue;
- }
-
- int contactId = getRecordInt(record, _contacts_grouprel_updated_info.contact_id);
- int changeType = getRecordInt(record, _contacts_grouprel_updated_info.type);
- switch (changeType) {
- case CONTACTS_CHANGE_INSERTED:
- insertPerson(getPersonRecord(contactId, ContactId));
- break;
-
- case CONTACTS_CHANGE_DELETED:
- auto personIt = findPerson(contactId, ContactId);
- if (personIt != getDataList().end()) {
- deletePerson(personIt);
- }
- break;
- }
- isChanged = true;
- }
- contacts_list_destroy(changes, true);
-
- if (isChanged) {
- onUpdateFinished();
- }
-}
-
void MembersProvider::onGroupChanged(const char *uri)
{
contacts_list_h changes = nullptr;
#include "GroupItemLayout.h"
+#include "Common/Database/RecordUtils.h"
#include "Ui/Editfield.h"
#include "Utils/Callback.h"
#include <app_i18n.h>
+using namespace Common::Database;
using namespace Contacts::Groups;
-NameItem::NameItem(std::string name)
- : m_Name(name)
+NameItem::NameItem(contacts_record_h record)
+ : m_Record(record)
{
}
-const std::string &NameItem::getName() const
-{
- return m_Name;
-}
-
void NameItem::setFilledCallback(FilledCallback callback)
{
m_OnFilled = std::move(callback);
{
if (strcmp(part, PART_GROUP_NAME_VALUE) == 0) {
Ui::Editfield *edit = Ui::Editfield::create(parent, "IDS_PB_MBODY_GROUP_NAME_ABB");
- char *name = elm_entry_utf8_to_markup(m_Name.c_str());
+ char *name = elm_entry_utf8_to_markup(getRecordStr(m_Record, _contacts_group.name));
elm_entry_entry_set(edit->getEntry(), name);
free(name);
evas_object_smart_callback_add(edit->getEntry(), "changed",
void NameItem::onChanged(Evas_Object *entry, void *eventInfo)
{
char *text = elm_entry_markup_to_utf8(elm_entry_entry_get(entry));
- m_Name = text ? text : "";
+ contacts_record_set_str(m_Record, _contacts_group.name, text ? text : "");
free(text);
m_OnFilled(!elm_entry_is_empty(entry));
#include "Contacts/Groups/RingtoneItem.h"
#include "App/AppControlRequest.h"
+#include "Common/Database/RecordUtils.h"
#include "Utils/Callback.h"
#include "Utils/Logger.h"
#include <app_i18n.h>
#include <system_settings.h>
+using namespace Common::Database;
using namespace Contacts::Groups;
-const std::string &RingtoneItem::getPath() const
+RingtoneItem::RingtoneItem(contacts_record_h record)
+ : m_Record(record)
{
- return m_Path;
}
Elm_Genlist_Item_Class *RingtoneItem::getItemClass() const
char *RingtoneItem::getRingtonePath() const
{
char *value = nullptr;
- if (!m_Path.empty()) {
- value = strdup(m_Path.c_str());
+ const char *path = getRecordStr(m_Record, _contacts_group.ringtone_path);
+ if (path) {
+ value = strdup(path);
} else {
char *defaultValue = nullptr;
system_settings_get_value_string(SYSTEM_SETTINGS_KEY_INCOMING_CALL_RINGTONE, &defaultValue);
char *path = nullptr;
int err = app_control_get_extra_data(reply, "result", &path);
WARN_IF_ERR(err, "app_control_get_extra_data() failed.");
- m_Path = path ? path : "";
+ contacts_record_set_str(m_Record, _contacts_group.ringtone_path, path ? path : "");
free(path);
}
elm_index_level_go(m_Index, 0);
}
+bool ListView::isListEmpty()
+{
+ return m_IsEmpty;
+}
+
Evas_Object *ListView::onCreate(Evas_Object *parent)
{
Evas_Object *layout = elm_layout_add(parent);
if (!m_Entry->getNumber().empty()) {
menu->addItem("IDS_KPD_OPT_SEND_MESSAGE_ABB", [this] {
- m_AppControl = App::requestMessageComposer("sms:", m_Entry->getNumber().c_str());
+ m_AppControl = App::requestComposer("sms:", m_Entry->getNumber().c_str());
m_AppControl.launch();
});
menu->addItem("IDS_KPD_OPT_ADD_2_SECOND_PAUSE_ABB", [this] {