* @brief Create action item.
* @param[in] group Log group for display
*/
- ActionItem(Model::LogGroup *group);
- virtual ~ActionItem();
+ explicit ActionItem(Model::LogGroup *group);
+ virtual ~ActionItem() override;
+
+ /**
+ * @brief Update log and item fields.
+ * @param[in] group Log group for display
+ */
+ void updateGroup(Model::LogGroup *group);
protected:
/**
* @brief Create basic info item.
* @param[in] group Log group for display
*/
- BasicInfoItem(Model::LogGroup *group);
-
- /**
- * @brief Destroy basic info item.
- */
+ explicit BasicInfoItem(Model::LogGroup *group);
virtual ~BasicInfoItem() override;
/**
*/
void setBackCallback(BackCallback callback);
+ /**
+ * @brief Update log and item fields.
+ * @param[in] group Log group for display
+ */
+ void updateGroup(Model::LogGroup *group);
+
protected:
/**
* @see GenlistItem::getItemClass()
#include "Logs/Model/LogGroup.h"
#include "Ux/SelectView.h"
+#include "Logs/Model/NumberLogProvider.h"
namespace Ui
{
public:
/**
* @brief Create log details view.
- * @param[in] group Log group
+ * @param[in] number Number
*/
- DetailsView(Model::LogGroup *group);
+ explicit DetailsView(const char *number);
private:
- virtual ~DetailsView() override;
virtual Evas_Object *onCreate(Evas_Object *parent) override;
virtual void onCreated() override;
virtual void onMenuPressed() override;
void fillGenList();
void insertBasicInfoItem();
void insertActionItem();
- void insertLogGroupItem();
+ void insertLogGroupList();
+ void insertLogGroupItem(Model::LogGroup *group);
+ void insertLogDetailItems(Model::LogGroup *group);
void insertLogDetailItem(Model::Log *log);
- void insertLogDetailItems();
+
+ List::LogGroupItem *getLastGroupItem();
+ void setLastGroupItem(List::LogGroupItem *groupItem);
bool onSelected(Ux::SelectResults results);
bool onCanceled();
- void onGroupChanged(int type);
+
+ void onLogGroupInserted(Model::LogGroup *group);
+ void onGroupChanged(Model::LogGroup *group, List::LogGroupItem *groupItem, int type);
void onLogAdded(Model::Log *log);
void onLogRemoved(LogDetailItem *logItem);
Model::LogGroup *m_Group;
+ Model::NumberLogProvider m_LogProvider;
Ui::Genlist *m_Genlist;
BasicInfoItem *m_BasicInfoItem;
ActionItem *m_ActionItem;
- List::LogGroupItem *m_GroupItem;
- Model::LogGroup::ChangeCbHandle m_GroupChangeCbHandle;
+ List::LogGroupItem *m_LastGroupItem;
};
}
}
*/
void updateContactRecord();
/**
- * @return Remove log from database
+ * @brief Remove log from database
*/
void remove();
+ /**
+ * @brief Called when Log is destroyed
+ */
+ void onDestroy();
private:
contacts_record_h getContactRecord();
*/
static bool compareDate(const tm &firstDate, const tm &secondDate);
+ protected:
+ virtual bool shouldGroupLogs(Log &log, Log &prevLog);
+ virtual contacts_filter_h getFilter();
+
private:
void fillList();
size_t fillGroupList(LogIterator begin, LogIterator end);
- bool shouldGroupLogs(Log &log, Log &prevLog);
bool mergeGroup(GroupIterator group);
LogIterator updateLogs();
void updateGroups(LogIterator newBegin, LogIterator newEnd);
- contacts_filter_h getFilter();
contacts_list_h fetchLogList();
void onLogsChanged(const char *viewUri);
--- /dev/null
+/*
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef LOGS_MODEL_NUMBER_LOG_PROVIDER_H
+#define LOGS_MODEL_NUMBER_LOG_PROVIDER_H
+
+#include "Logs/Model/LogProvider.h"
+
+namespace Logs
+{
+ namespace Model
+ {
+ /**
+ * @brief Provides list of logs by number
+ */
+ class NumberLogProvider : public LogProvider
+ {
+ public:
+ /**
+ * @brief Create Number log provider.
+ * @param[in] number Log number
+ */
+ explicit NumberLogProvider(std::string number);
+
+ private:
+ virtual contacts_filter_h getFilter() override;
+ virtual bool shouldGroupLogs(Log &log, Log &prevLog) override;
+
+ std::string m_Number;
+ };
+ }
+}
+
+#endif /* LOGS_MODEL_NUMBER_LOG_PROVIDER_H */
}
ActionItem::ActionItem(LogGroup *group)
- : m_Group(group)
+ : m_Group(group)
{
m_Log = m_Group->getLogList().back();
m_GroupChangeCbHandle = m_Group->addChangeCallback(std::bind(&ActionItem::onGroupChanged, this, _1));
}
}
+void ActionItem::updateGroup(LogGroup *group)
+{
+ m_Group = group;
+ if (m_Group) {
+ m_Log = m_Group->getLogList().back();
+ m_GroupChangeCbHandle = m_Group->addChangeCallback(std::bind(&ActionItem::onGroupChanged, this, _1));
+ elm_genlist_item_fields_update(getObjectItem(), PART_NUMBER_TYPE, ELM_GENLIST_ITEM_FIELD_TEXT);
+ }
+}
+
Elm_Genlist_Item_Class *ActionItem::getItemClass() const
{
static Elm_Genlist_Item_Class itc = createItemClass(LOGS_DETAILS_ACTION_ITEM_STYLE);
void ActionItem::onGroupChanged(int type)
{
- if (type & LogGroup::ChangeRemoved) {
- m_Group = nullptr;
- delete this;
- } else {
+ if (!(type & LogGroup::ChangeRemoved)) {
m_Log = m_Group->getLogList().back();
elm_genlist_item_fields_update(getObjectItem(), PART_NUMBER_TYPE, ELM_GENLIST_ITEM_FIELD_TEXT);
}
}
}
+
void BasicInfoItem::setBackCallback(BackCallback callback)
{
m_OnBackPressed = std::move(callback);
}
+void BasicInfoItem::updateGroup(LogGroup *group)
+{
+ m_Group = group;
+ if (m_Group) {
+ m_Log = m_Group->getLogList().back();
+ m_GroupChangeCbHandle = m_Group->addChangeCallback(std::bind(&BasicInfoItem::onGroupChanged, this, _1));
+ }
+}
+
Elm_Genlist_Item_Class *BasicInfoItem::getItemClass() const
{
static Elm_Genlist_Item_Class itc = createItemClass(LOGS_DETAILS_ITEM_STYLE);
void BasicInfoItem::onGroupChanged(int type)
{
- if (type & LogGroup::ChangeRemoved) {
- m_Group = nullptr;
- delete this;
- } else {
+ if (!(type & LogGroup::ChangeRemoved)) {
m_Log = m_Group->getLogList().back();
if (type & LogGroup::ChangePerson) {
elm_genlist_item_fields_update(getObjectItem(), STATE_SAVED, ELM_GENLIST_ITEM_FIELD_STATE);
}
}
}
+
using namespace Ux;
using namespace std::placeholders;
-DetailsView::DetailsView(LogGroup *group)
- : m_Group(group), m_Genlist(nullptr), m_BasicInfoItem(nullptr), m_ActionItem(nullptr),
- m_GroupItem(nullptr)
+DetailsView::DetailsView(const char *number)
+ : m_Group(nullptr)
+ , m_LogProvider(number)
+ , m_Genlist(nullptr)
+ , m_BasicInfoItem(nullptr)
+ , m_ActionItem(nullptr)
+ , m_LastGroupItem(nullptr)
{
auto strings = Common::getSelectViewStrings();
strings.buttonDone = "IDS_TPLATFORM_ACBUTTON_DELETE_ABB";
setSelectCallback(std::bind(&DetailsView::onSelected, this, _1));
setCancelCallback(std::bind(&DetailsView::onCanceled, this));
- m_Group->setLogAddCallback(std::bind(&DetailsView::onLogAdded, this, _1));
- m_GroupChangeCbHandle = m_Group->addChangeCallback(std::bind(&DetailsView::onGroupChanged, this, _1));
-}
-
-DetailsView::~DetailsView()
-{
- if (m_Group) {
- for (auto &log : m_Group->getLogList()) {
- log->unsetRemoveCallback();
- }
- m_Group->unsetLogAddCallback();
- m_Group->removeChangeCallback(m_GroupChangeCbHandle);
- }
}
Evas_Object *DetailsView::onCreate(Evas_Object *parent)
void DetailsView::onCreated()
{
+ m_LogProvider.setInsertCallback(std::bind(&DetailsView::onLogGroupInserted, this, _1));
+ m_Group = m_LogProvider.getLogGroupList().back().get();
fillGenList();
}
insertBasicInfoItem();
insertActionItem();
}
- insertLogGroupItem();
- insertLogDetailItems();
+ insertLogGroupList();
}
void DetailsView::insertBasicInfoItem()
elm_genlist_item_select_mode_set(m_ActionItem->getObjectItem(), ELM_OBJECT_SELECT_MODE_NONE);
}
-void DetailsView::insertLogGroupItem()
+void DetailsView::insertLogGroupList()
+{
+ for (auto &&group : m_LogProvider.getLogGroupList()) {
+ insertLogGroupItem(group.get());
+ insertLogDetailItems(group.get());
+ }
+}
+
+void DetailsView::insertLogGroupItem(LogGroup *group)
+{
+ Log *log = group->getLogList().back();
+ LogGroupItem *groupItem = new LogGroupItem(log->getTime());
+ m_Genlist->insert(groupItem, nullptr, getLastGroupItem());
+ elm_genlist_item_select_mode_set(groupItem->getObjectItem(), ELM_OBJECT_SELECT_MODE_NONE);
+ setLastGroupItem(groupItem);
+ group->setLogAddCallback(std::bind(&DetailsView::onLogAdded, this, _1));
+ group->addChangeCallback(std::bind(&DetailsView::onGroupChanged, this, group, groupItem, _1));
+}
+
+void DetailsView::insertLogDetailItems(LogGroup *group)
{
- Log *log = m_Group->getLogList().back();
- m_GroupItem = new LogGroupItem(log->getTime());
- m_Genlist->insert(m_GroupItem);
- elm_genlist_item_select_mode_set(m_GroupItem->getObjectItem(), ELM_OBJECT_SELECT_MODE_NONE);
+ for (auto &log : group->getLogList()) {
+ insertLogDetailItem(log);
+ }
}
void DetailsView::insertLogDetailItem(Log *log)
{
LogDetailItem *logItem = new LogDetailItem(log);
- m_Genlist->insert(logItem, m_GroupItem, m_GroupItem, Ui::Genlist::After);
+ m_Genlist->insert(logItem, getLastGroupItem(), *getLastGroupItem()->begin());
log->setRemoveCallback(std::bind(&DetailsView::onLogRemoved, this, logItem));
addSelectItem(logItem);
}
-void DetailsView::insertLogDetailItems()
+LogGroupItem *DetailsView::getLastGroupItem()
{
- for (auto &log : m_Group->getLogList()) {
- insertLogDetailItem(log);
+ if (!m_LastGroupItem) {
+ for (auto &&item : *m_Genlist) {
+ if (((Ui::GenlistItem *)item)->isGroupItem()) {
+ setLastGroupItem(dynamic_cast<LogGroupItem *>(item));
+ break;
+ }
+ }
}
+
+ return m_LastGroupItem;
+}
+
+void DetailsView::setLastGroupItem(LogGroupItem *groupItem)
+{
+ if (m_LastGroupItem) {
+ m_LastGroupItem->setDestroyCallback(nullptr);
+ }
+
+ m_LastGroupItem = groupItem;
+ m_LastGroupItem->setDestroyCallback([this] {
+ m_LastGroupItem = nullptr;
+ });
}
bool DetailsView::onSelected(SelectResults results)
return false;
}
-void DetailsView::onGroupChanged(int type)
+void DetailsView::onLogGroupInserted(LogGroup *group)
+{
+ if (m_Genlist) {
+ insertLogGroupItem(group);
+ insertLogDetailItems(group);
+ }
+}
+
+void DetailsView::onGroupChanged(LogGroup *group, LogGroupItem *groupItem, int type)
{
if (type & LogGroup::ChangeRemoved) {
- getPage()->close();
- m_Group = nullptr;
+ if (m_LogProvider.getLogGroupList().empty()) {
+ m_BasicInfoItem->updateGroup(nullptr);
+ m_ActionItem->updateGroup(nullptr);
+ getPage()->close();
+ return;
+ }
+ delete groupItem;
+ if (m_Group == group) {
+ m_Group = m_LogProvider.getLogGroupList().back().get();
+ m_BasicInfoItem->updateGroup(m_Group);
+ m_ActionItem->updateGroup(m_Group);
+ }
}
}
{
removeSelectItem(logItem);
delete logItem;
+
}
if (!navigator) {
return;
}
-
- navigator->navigateTo(new DetailsView(getGroup()));
+ navigator->navigateTo(new DetailsView(getGroup()->getLogList().back()->getNumber()));
}
Evas_Object *LogItem::createThumbnail(Evas_Object *parent)
if (m_Group) {
m_Group->removeLog(this);
}
- if (m_OnRemoved) {
- m_OnRemoved();
- }
+
contacts_record_destroy(m_LogRecord, true);
if (m_ContactRecord) {
contacts_record_destroy(m_ContactRecord, true);
{
contacts_db_delete_record(_contacts_phone_log._uri, getId());
}
+
+void Log::onDestroy()
+{
+ if (m_OnRemoved) {
+ m_OnRemoved();
+ }
+}
m_InsertCallback = nullptr;
}
+bool LogProvider::compareDate(const tm &firstDate, const tm &secondDate)
+{
+ if (firstDate.tm_year == secondDate.tm_year &&
+ firstDate.tm_mon == secondDate.tm_mon &&
+ firstDate.tm_mday == secondDate.tm_mday) {
+ return true;
+ }
+ return false;
+}
+
+bool LogProvider::shouldGroupLogs(Log &log, Log &prevLog)
+{
+ int type = log.getType();
+ return (type == prevLog.getType()
+ && type != CONTACTS_PLOG_TYPE_VOICE_INCOMING_UNSEEN
+ && type != CONTACTS_PLOG_TYPE_VOICE_INCOMING_SEEN
+ && strcmp(log.getNumber(), prevLog.getNumber()) == 0
+ && compareDate(log.getTime(), prevLog.getTime()));
+}
+
+contacts_filter_h LogProvider::getFilter()
+{
+ contacts_filter_h filter = nullptr;
+ contacts_filter_create(_contacts_phone_log._uri, &filter);
+
+ contacts_filter_add_int(filter, _contacts_phone_log.log_type, CONTACTS_MATCH_GREATER_THAN_OR_EQUAL, CONTACTS_PLOG_TYPE_VOICE_INCOMING);
+ contacts_filter_add_operator(filter, CONTACTS_FILTER_OPERATOR_AND);
+ contacts_filter_add_int(filter, _contacts_phone_log.log_type, CONTACTS_MATCH_LESS_THAN_OR_EQUAL, CONTACTS_PLOG_TYPE_VIDEO_BLOCKED);
+
+ return filter;
+}
+
void LogProvider::fillList()
{
contacts_list_h list = fetchLogList();
return newGroupsCount;
}
-bool LogProvider::shouldGroupLogs(Log &log, Log &prevLog)
-{
- int type = log.getType();
- return (type == prevLog.getType()
- && type != CONTACTS_PLOG_TYPE_VOICE_INCOMING_UNSEEN
- && type != CONTACTS_PLOG_TYPE_VOICE_INCOMING_SEEN
- && strcmp(log.getNumber(), prevLog.getNumber()) == 0
- && compareDate(log.getTime(), prevLog.getTime()));
-}
-
-bool LogProvider::compareDate(const tm &firstDate, const tm &secondDate)
-{
- if (firstDate.tm_year == secondDate.tm_year &&
- firstDate.tm_mon == secondDate.tm_mon &&
- firstDate.tm_mday == secondDate.tm_mday) {
- return true;
- }
- return false;
-}
-
bool LogProvider::mergeGroup(GroupIterator group)
{
if (group == m_Groups.begin()) {
return false;
}
-contacts_filter_h LogProvider::getFilter()
-{
- contacts_filter_h filter = nullptr;
- contacts_filter_create(_contacts_phone_log._uri, &filter);
-
- contacts_filter_add_int(filter, _contacts_phone_log.log_type, CONTACTS_MATCH_GREATER_THAN_OR_EQUAL, CONTACTS_PLOG_TYPE_VOICE_INCOMING);
- contacts_filter_add_operator(filter, CONTACTS_FILTER_OPERATOR_AND);
- contacts_filter_add_int(filter, _contacts_phone_log.log_type, CONTACTS_MATCH_LESS_THAN_OR_EQUAL, CONTACTS_PLOG_TYPE_VIDEO_BLOCKED);
-
- return filter;
-}
-
-contacts_list_h LogProvider::fetchLogList()
-{
- contacts_list_h list = nullptr;
- contacts_query_h query = nullptr;
- contacts_filter_h filter = getFilter();
-
- contacts_query_create(_contacts_phone_log._uri, &query);
- contacts_query_set_filter(query, filter);
- contacts_query_set_sort(query, _contacts_phone_log.log_time, true);
- contacts_db_get_records_with_query(query, 0, 0, &list);
-
- contacts_filter_destroy(filter);
- contacts_query_destroy(query);
-
- return list;
-}
-
-void LogProvider::onLogsChanged(const char *viewUri)
-{
- LogIterator newBegin = updateLogs();
- updateGroups(newBegin, m_Logs.end());
-}
-
LogProvider::LogIterator LogProvider::updateLogs()
{
contacts_list_h list = fetchLogList();
Log *log = (Log *)(*oldIt);
if (id != log->getId()) {
+ log->onDestroy();
delete *oldIt;
oldIt = m_Logs.erase(oldIt);
} else {
}
while (oldIt != m_Logs.end()) {
+ ((Log *)*oldIt)->onDestroy();
delete *oldIt;
oldIt = m_Logs.erase(oldIt);
}
wasDeleted = false;
}
- (*updateIt)->onChange();
- updateIt = isEmpty ? m_Groups.erase(updateIt) : ++updateIt;
+ if (isEmpty) {
+ LogGroup *group = updateIt->release();
+ updateIt = m_Groups.erase(updateIt);
+ group->onChange();
+ delete group;
+ } else {
+ (*updateIt)->onChange();
+ ++updateIt;
+ }
+
--updateCount;
}
}
}
+contacts_list_h LogProvider::fetchLogList()
+{
+ contacts_list_h list = nullptr;
+ contacts_query_h query = nullptr;
+ contacts_filter_h filter = getFilter();
+
+ contacts_query_create(_contacts_phone_log._uri, &query);
+ contacts_query_set_filter(query, filter);
+ contacts_query_set_sort(query, _contacts_phone_log.log_time, true);
+ contacts_db_get_records_with_query(query, 0, 0, &list);
+
+ contacts_filter_destroy(filter);
+ contacts_query_destroy(query);
+
+ return list;
+}
+
+void LogProvider::onLogsChanged(const char *viewUri)
+{
+ LogIterator newBegin = updateLogs();
+ updateGroups(newBegin, m_Logs.end());
+}
+
void LogProvider::onContactChanged(const char *viewUri)
{
contacts_changed_e changeType;
contacts_list_destroy(list, true);
}
-
--- /dev/null
+/*
+ * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "Logs/Model/NumberLogProvider.h"
+
+using namespace Logs::Model;
+
+NumberLogProvider::NumberLogProvider(std::string number)
+ : m_Number(std::move(number))
+{
+}
+
+bool NumberLogProvider::shouldGroupLogs(Log &log, Log &prevLog)
+{
+ return compareDate(log.getTime(), prevLog.getTime());
+}
+
+contacts_filter_h NumberLogProvider::getFilter()
+{
+ contacts_filter_h filter = LogProvider::getFilter();
+ contacts_filter_add_operator(filter, CONTACTS_FILTER_OPERATOR_AND);
+ contacts_filter_add_str(filter, _contacts_phone_log.address, CONTACTS_MATCH_EXACTLY, m_Number.c_str());
+
+ return filter;
+}