}
namespace List
{
+ /**
+ * @brief Represents item mode
+ */
+ enum class ItemMode
+ {
+ Default, /*< Usual mode */
+ Pick /*< Mode with ability to select item */
+ };
+
class LogItem : public Ui::GenlistCheckItem
{
public:
typedef std::function<void(LogItem *item)> DeleteCallback;
/**
- * @brief Represents item mode
- */
- enum Mode
- {
- ModeDefault, /*< Usual mode */
- ModePick /*< Mode with ability to select item */
- };
-
- /**
* @brief Create log item
* @param[in] group Log group
* @param[in] mode Item mode
*/
- LogItem(Model::LogGroup *group, Mode mode);
+ LogItem(Model::LogGroup *group, ItemMode mode = ItemMode::Default);
/**
* @brief Set item mode
* @param[in] mode Item mode
*/
- void setMode(Mode mode);
+ void setMode(ItemMode mode);
/**
* @brief Set delete item callback
DeleteCallback m_OnDelete;
Model::LogGroup *m_Group;
- Mode m_Mode;
+ ItemMode m_Mode;
};
}
}
--- /dev/null
+/*
+ * Copyright (c) 2015 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_LIST_LOGS_VIEW_H
+#define LOGS_LIST_LOGS_VIEW_H
+
+#include "Ui/View.h"
+#include "Logs/Model/LogProvider.h"
+
+namespace Ui
+{
+ class Genlist;
+}
+
+namespace Logs
+{
+ namespace List
+ {
+ class LogGroupItem;
+ class LogItem;
+ enum class ItemMode;
+
+ /**
+ * @brief Logs list view
+ */
+ class EXPORT_API LogsView : public Ui::View
+ {
+ public:
+ /**
+ * @brief Create new log list view
+ * @param[in] filterType Defines how to filter log list
+ */
+ LogsView(Model::LogProvider::FilterType filterType = Model::LogProvider::FilterNone);
+
+ private:
+ virtual Evas_Object *onCreate(Evas_Object *parent) override;
+ virtual void onPageAttached() override;
+ virtual void onMenuPressed() override;
+
+ void fillGenlist();
+ void onLogInserted(Model::LogGroup *group);
+ LogGroupItem *insertLogItem(Model::LogGroup *group, LogGroupItem *groupItem);
+
+ LogGroupItem *createLogGroupItem(tm date);
+ LogItem *createLogItem(Model::LogGroup *group);
+
+ void setMode(ItemMode mode);
+
+ Model::LogProvider m_LogProvider;
+ Ui::Genlist *m_Genlist;
+ ItemMode m_Mode;
+ };
+ }
+}
+
+#endif /* LOGS_LIST_LOGS_VIEW_H */
#define LOGS_MODEL_LOG_PROVIDER_H
#include <contacts.h>
+#include <time.h>
#include <memory>
#include <set>
*/
enum FilterType
{
+ FilterNone,
FilterAll,
FilterMissed
};
*/
void unsetInsertCallback();
+ /**
+ * @brief Compare dates
+ * @param[in] firstDate First date
+ * @param[in] secondDate Second date
+ * @return true if dates are equal.
+ */
+ static bool compareDate(const tm &firstDate, const tm &secondDate);
+
private:
void fillList(LogList &logList);
void fillGroupList(LogList &logList, LogGroupList &logGroupList);
bool shouldGroupLogs(Log *log, LogGroup *prevLogGroup);
+
LogGroup *addLog(LogGroupList &logList, Log *log);
contacts_filter_h getFilter(FilterType filterType);
const std::string layoutPath = App::getResourcePath(LOG_ITEM_LAYOUT_EDJ);
}
-LogItem::LogItem(LogGroup *group, Mode mode)
+LogItem::LogItem(LogGroup *group, ItemMode mode)
:m_Group(group), m_Mode(mode)
{
setUpdateCallback();
}
-void LogItem::setMode(LogItem::Mode mode)
+void LogItem::setMode(ItemMode mode)
{
m_Mode = mode;
elm_genlist_item_fields_update(getObjectItem(), PART_END, ELM_GENLIST_ITEM_FIELD_CONTENT);
const Log *log = m_Group->getLogList().back();
const char *name = log->getName();
const char *number = log->getNumber();
-
if (name == nullptr) {
name = number;
number = _("IDS_LOGS_SBODY_UNSAVED_M_STATUS");
if (strcmp(part, PART_PERSON_THUMBNAIL) == 0) {
return createThumbnail(parent);
} else if (strcmp(part, PART_END) == 0) {
- if (m_Mode == ModePick) {
+ if (m_Mode == ItemMode::Pick) {
return GenlistCheckItem::getContent(parent, part);
} else {
return createIcon(parent, ICON_INFO);
--- /dev/null
+/*
+ * Copyright (c) 2015 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/List/LogsView.h"
+#include "Logs/List/LogGroupItem.h"
+#include "Logs/List/LogItem.h"
+
+#include "Ui/Genlist.h"
+#include "Ui/Menu.h"
+#include "Ui/Navigator.h"
+#include "Utils/Callback.h"
+#include "Utils/Logger.h"
+
+using namespace Logs::Model;
+using namespace Logs::List;
+using namespace std::placeholders;
+
+LogsView::LogsView(LogProvider::FilterType filterType)
+ : m_LogProvider(filterType),
+ m_Genlist(nullptr),
+ m_Mode(ItemMode::Default)
+{
+}
+
+Evas_Object *LogsView::onCreate(Evas_Object *parent)
+{
+ m_Genlist = new Ui::Genlist();
+ m_Genlist->create(parent);
+
+ fillGenlist();
+ m_LogProvider.setInsertCallback(std::bind(&LogsView::onLogInserted, this, _1));
+
+ return m_Genlist->getEvasObject();
+}
+
+void LogsView::onPageAttached()
+{
+ getPage()->setTitle("IDS_LOGS_ITAB3_LOGS");
+}
+
+void LogsView::onMenuPressed()
+{
+ if (m_Mode == ItemMode::Pick) {
+ return;
+ }
+
+ Ui::Menu *menu = new Ui::Menu();
+ menu->create(getEvasObject());
+
+ menu->addItem("IDS_CLOG_OPT_VIEW_BY", [this] {
+ /*
+ * TODO
+ */
+ });
+
+ menu->addItem("IDS_LOGS_OPT_DELETE", [this] {
+ LogsView *deleteView = new LogsView();
+ deleteView->setMode(ItemMode::Pick);
+ getNavigator()->navigateTo(deleteView);
+ });
+ menu->show();
+
+}
+
+void LogsView::fillGenlist()
+{
+ if (!m_LogProvider.getLogGroupList().empty()) {
+ LogGroupItem *groupItem = nullptr;
+
+ for (auto &&group : m_LogProvider.getLogGroupList()) {
+ groupItem = insertLogItem(group.get(), groupItem);
+ }
+ }
+}
+
+void LogsView::onLogInserted(LogGroup *group)
+{
+ LogGroupItem *groupItem = dynamic_cast<LogGroupItem *>(m_Genlist->getFirstItem());
+ groupItem = insertLogItem(group, groupItem);
+ groupItem->scrollTo(ELM_GENLIST_ITEM_SCROLLTO_TOP);
+}
+
+LogGroupItem *LogsView::insertLogItem(LogGroup *group, LogGroupItem *groupItem)
+{
+ Log *log = group->getLogList().back();
+
+ if (!groupItem || !LogProvider::compareDate(groupItem->getDate(), log->getTime())) {
+ groupItem = createLogGroupItem(log->getTime());
+ }
+ m_Genlist->insert(createLogItem(group), groupItem, (*groupItem->begin()));
+ return groupItem;
+}
+
+LogGroupItem *LogsView::createLogGroupItem(tm date)
+{
+ LogGroupItem *groupItem = new LogGroupItem(date);
+ m_Genlist->insert(groupItem, nullptr, nullptr, Ui::Genlist::After);
+ elm_genlist_item_select_mode_set(groupItem->getObjectItem(), ELM_OBJECT_SELECT_MODE_NONE);
+ return groupItem;
+}
+
+LogItem *LogsView::createLogItem(LogGroup *group)
+{
+ LogItem *item = new LogItem(group, m_Mode);
+
+ item->setDeleteCallback([this](LogItem *item) {
+ LogGroupItem *itemGroup = static_cast<LogGroupItem *>(item->getParentItem());
+ delete item;
+
+ if (itemGroup->empty()) {
+ delete itemGroup;
+ }
+ });
+
+ return item;
+}
+
+void LogsView::setMode(ItemMode mode)
+{
+ m_Mode = mode;
+}
bool LogProvider::shouldGroupLogs(Log *log, LogGroup *prevLogGroup)
{
Log *prevLog = prevLogGroup->getLogList().back();
+
return (log->getType() == prevLog->getType()
- && strcmp(log->getNumber(), prevLog->getNumber()) == 0);
+ && 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;
}
LogGroup *LogProvider::addLog(LogGroupList &logGroupList, Log *log)
LogGroup *newGroup = nullptr;
for (; newIt != newLogList.end(); ++newIt) {
newGroup = addLog(m_Groups, newIt->get());
+ m_Logs.push_back(std::move(*newIt));
+
if (newGroup) {
+ ++newIt;
break;
}
isChanged = true;