return;
m_GroupList->merge(*frame.m_GroupList);
+ m_GroupList->sort();
m_GroupList->unique();
frame.m_GroupList = m_GroupList;
}
#define __PhoneNumberUtils_H__
#include <string>
+#include <list>
namespace Msg {
class PhoneNumberUtils {
static PhoneNumberUtils &getInst();
std::string getNormalizedNumber(const std::string &number) const;
+ bool addToBlocked(const std::string &number);
+ bool removeFromBlocked(const std::string &number);
+ std::list<std::string> getBlockedNumList() const;
+ bool isBlocked(const std::string &number);
+
private:
PhoneNumberUtils();
~PhoneNumberUtils();
using namespace Msg;
- PhoneNumberUtils &PhoneNumberUtils::getInst()
- {
- static PhoneNumberUtils inst;
- return inst;
- }
-
- std::string PhoneNumberUtils::getNormalizedNumber(const std::string &number) const
- {
- std::string res;
- char *normalizedNum = nullptr;
- phone_number_get_normalized_number(number.c_str(), &normalizedNum);
- if (normalizedNum)
- {
- res = normalizedNum;
- free(normalizedNum);
- }
- return res;
- }
+PhoneNumberUtils &PhoneNumberUtils::getInst()
+{
+ static PhoneNumberUtils inst;
+ return inst;
+}
+
+std::string PhoneNumberUtils::getNormalizedNumber(const std::string &number) const
+{
+ std::string res;
+ char *normalizedNum = nullptr;
+ phone_number_get_normalized_number(number.c_str(), &normalizedNum);
+ if (normalizedNum) {
+ res = normalizedNum;
+ free(normalizedNum);
+ }
+ if (res.empty())
+ res = number;
+
+ return res;
+}
PhoneNumberUtils::PhoneNumberUtils()
{
{
phone_number_disconnect();
}
+
+bool PhoneNumberUtils::addToBlocked(const std::string &number)
+{
+ if (number.empty())
+ return false;
+
+ bool res = false;
+
+ phone_number_blocking_rule_h rule = nullptr;
+ phone_number_blocking_rule_create(&rule);
+ if (rule) {
+ phone_number_blocking_rule_set_match_type(rule, PHONE_NUMBER_MATCH_TYPE_EXACTLY);
+ phone_number_blocking_rule_set_number(rule, number.c_str());
+ res = phone_number_add_blocking_rule(rule) == 0;
+ phone_number_blocking_rule_destroy(rule);
+ }
+
+ return res;
+}
+
+bool PhoneNumberUtils::removeFromBlocked(const std::string &number)
+{
+ if (number.empty())
+ return false;
+
+ bool res = false;
+ int count = 0;
+ phone_number_blocking_rule_h *rules = nullptr;
+ phone_number_get_blocking_rules_related(number.c_str(), &rules, &count);
+ if (rules) {
+ res = true;
+ for (int i = 0; i < count; ++i) {
+ res &= phone_number_remove_blocking_rule(rules[i]) == 0;
+ phone_number_blocking_rule_destroy(rules[i]);
+ }
+ free(rules);
+ }
+
+ return res;
+}
+
+std::list<std::string> PhoneNumberUtils::getBlockedNumList() const
+{
+ std::list<std::string> res;
+
+ phone_number_blocking_rule_h *rules = nullptr;
+ int length = 0;
+ phone_number_get_blocking_rules(0, 0, &rules, &length);
+ for (int i = 0; i < length; i++) {
+ phone_number_blocking_rule_h rule = rules[i];
+ if (rule) {
+ char *number = nullptr;
+ phone_number_blocking_rule_get_number(rule, &number);
+ if (number)
+ res.push_back(number);
+ free(number);
+ phone_number_blocking_rule_destroy(rule);
+ }
+ }
+
+ free(rules);
+ res.sort();
+ res.unique();
+
+ return res;
+}
+
+bool PhoneNumberUtils::isBlocked(const std::string &number)
+{
+ bool res = false;
+ phone_number_check_blocking(number.c_str(), &res);
+ return res;
+}
MoreOptionCb cb,
void *userData);
+ Eext_Object_Item *insertItemBefore(Eext_Object_Item *before,
+ const TText &mainText,
+ const std::string &imgGroupName,
+ MoreOptionCb cb,
+ void *userData);
+
+ Eext_Object_Item *insertItemBefore(Eext_Object_Item *before,
+ const TText &mainText,
+ Evas_Object *icon,
+ MoreOptionCb cb,
+ void *userData);
+
void removeItem(Eext_Object_Item *item);
void setDirection(Eext_More_Option_Direction direction);
void setOpened(bool opened);
return item;
}
+Eext_Object_Item *MoreOption::insertItemBefore(Eext_Object_Item *before,
+ const TText &mainText,
+ const std::string &imgGroupName,
+ MoreOptionCb cb,
+ void *userData)
+{
+ auto *item = eext_more_option_item_insert_before(getEo(), before);
+ prepareItem(item, mainText, imgGroupName, cb, userData);
+ return item;
+}
+
+Eext_Object_Item *MoreOption::insertItemBefore(Eext_Object_Item *before,
+ const TText &mainText,
+ Evas_Object *icon,
+ MoreOptionCb cb,
+ void *userData)
+{
+ auto *item = eext_more_option_item_insert_before(getEo(), before);
+ prepareItem(item, mainText, icon, cb, userData);
+ return item;
+}
+
Eext_Object_Item *MoreOption::prependItem(const TText &mainText,
const std::string &imgGroupName,
MoreOptionCb cb,
virtual ~ConvFrame();
void setThreadId(ThreadId id);
- void execCmd(const AppControlComposeRef &cmd);
void execCmd(const AppControlDefaultRef &cmd);
private:
// MoreOption:
void onReplyClicked(MoreOption &obj);
void onCallClicked(MoreOption &obj);
- void onSendMyLocationClicked(MoreOption &obj);
void onRecipientsClicked(MoreOption &obj);
void onBlockNumberClicked(MoreOption &obj);
void onUnblockNumberClicked(MoreOption &obj);
void updateDeleteViews();
void reply();
void updateMoreOption();
- void prepedItem(MorOptionItemType itemType);
+ void prependItem(MorOptionItemType itemType);
void removeItem(MorOptionItemType itemType);
+ void insertItemBefore(MorOptionItemType itemType, MorOptionItemType beforeType);
+ void updateBlockMoreOptionItem();
void navigateToReicpList();
void setMode(Mode mode);
#include "VoiceCall.h"
#include "NaviFrameController.h"
#include "RecipListFrame.h"
+#include "PhoneNumberUtils.h"
using namespace Msg;
}
}
-void ConvFrame::execCmd(const AppControlComposeRef &cmd)
-{
- // TODO: impl.
-}
-
void ConvFrame::execCmd(const AppControlDefaultRef &cmd)
{
// TODO: impl.
m_MoreOptionItemsInfo[MorOptionDelete] =
{nullptr, "WDS_MSG_OPT_DELETE_ABB", DELETEG_MORE_ICON, makeCbLast(&ConvFrame::onDeleteClicked)};
- prepedItem(MorOptionDelete);
- prepedItem(MorOptionRecip);
+ prependItem(MorOptionDelete);
+ prependItem(MorOptionRecip);
}
}
}
}
-void ConvFrame::prepedItem(MorOptionItemType itemType)
+void ConvFrame::prependItem(MorOptionItemType itemType)
{
+ removeItem(itemType);
MoreOptionItemInfo &info = m_MoreOptionItemsInfo[itemType];
if (!info.item)
info.item = m_pMoreOption->prependItem(msgt(info.strId), info.icon, info.cb, this);
}
}
+void ConvFrame::insertItemBefore(MorOptionItemType itemType, MorOptionItemType beforeType)
+{
+ Eext_Object_Item *before = m_MoreOptionItemsInfo[beforeType].item;
+ if (before) {
+ removeItem(itemType);
+ MoreOptionItemInfo &info = m_MoreOptionItemsInfo[itemType];
+ info.item = m_pMoreOption->insertItemBefore(before, msgt(info.strId), info.icon, info.cb, this);
+ } else {
+ MSG_LOG_ERROR("MorOptionItemType: ", beforeType, " is null");
+ }
+}
+
+void ConvFrame::updateBlockMoreOptionItem()
+{
+ removeItem(MorOptionBlock);
+ removeItem(MorOptionUnblock);
+ const Recipient &recip = m_pList->getRecip();
+ if (recip.isValid()) {
+ bool isBlocked = PhoneNumberUtils::getInst().isBlocked(recip.getAddress());
+ MorOptionItemType blockedType = isBlocked ? MorOptionUnblock : MorOptionBlock;
+ insertItemBefore(blockedType, MorOptionDelete);
+ }
+}
+
void ConvFrame::navigateToReicpList()
{
auto *frame = new RecipListFrame(getParent());
{
bool isValid = m_pList->getRecip().isValid();
if (isValid) {
- prepedItem(MorOptionCall);
- prepedItem(MorOptionReply);
+ prependItem(MorOptionCall);
+ prependItem(MorOptionReply);
} else {
removeItem(MorOptionReply);
removeItem(MorOptionCall);
}
+ updateBlockMoreOptionItem();
}
void ConvFrame::showNumberBlockUnblockPopup(bool isBlocked)
VoiceCall::launch(m_pList->getRecip().getAddress());
}
-void ConvFrame::onSendMyLocationClicked(MoreOption &obj)
-{
- MSG_LOG("");
-}
-
void ConvFrame::onRecipientsClicked(MoreOption &obj)
{
MSG_LOG("");
void ConvFrame::onBlockNumberClicked(MoreOption &obj)
{
MSG_LOG("");
- showNumberBlockUnblockPopup(true);
+ const Recipient &recip = m_pList->getRecip();
+ if (recip.isValid() && PhoneNumberUtils::getInst().addToBlocked(recip.getAddress())) {
+ showNumberBlockUnblockPopup(true);
+ updateBlockMoreOptionItem();
+ }
}
void ConvFrame::onUnblockNumberClicked(MoreOption &obj)
{
MSG_LOG("");
+ const Recipient &recip = m_pList->getRecip();
+ if (recip.isValid() && PhoneNumberUtils::getInst().removeFromBlocked(recip.getAddress())) {
+ showNumberBlockUnblockPopup(false);
+ updateBlockMoreOptionItem();
+ }
}
void ConvFrame::onDeleteClicked(MoreOption &obj)
<privilege>http://tizen.org/privilege/contact.read</privilege>
<privilege>http://tizen.org/privilege/mediastorage</privilege>
<privilege>http://tizen.org/privilege/externalstorage</privilege>
+ <privilege>http://tizen.org/privilege/blocknumber.write</privilege>
+ <privilege>http://tizen.org/privilege/blocknumber.read</privilege>
</privileges>
<feature name="http://tizen.org/feature/screen.size.normal">true</feature>
<feature name="http://tizen.org/feature/network.telephony">true</feature>