TizenRefApp-5707 Implement Log View(Main View) 45/59545/7
authorIryna Ferenchak <i.ferenchak@samsung.com>
Thu, 18 Feb 2016 08:34:19 +0000 (10:34 +0200)
committerIryna Ferenchak <i.ferenchak@samsung.com>
Thu, 18 Feb 2016 09:00:23 +0000 (11:00 +0200)
Change-Id: I01dea46afd6f9687b6a996585e32145d2322db29
Signed-off-by: Iryna Ferenchak <i.ferenchak@samsung.com>
lib-logs/inc/Logs/List/LogItem.h
lib-logs/inc/Logs/List/LogsView.h [new file with mode: 0644]
lib-logs/inc/Logs/Model/LogProvider.h
lib-logs/src/Logs/List/LogItem.cpp
lib-logs/src/Logs/List/LogsView.cpp [new file with mode: 0644]
lib-logs/src/Logs/Model/LogProvider.cpp

index 3c79f6d..ac4d0c6 100644 (file)
@@ -28,6 +28,15 @@ namespace Logs
        }
        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:
@@ -37,26 +46,17 @@ namespace Logs
                        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
@@ -83,7 +83,7 @@ namespace Logs
 
                        DeleteCallback m_OnDelete;
                        Model::LogGroup *m_Group;
-                       Mode m_Mode;
+                       ItemMode m_Mode;
                };
        }
 }
diff --git a/lib-logs/inc/Logs/List/LogsView.h b/lib-logs/inc/Logs/List/LogsView.h
new file mode 100644 (file)
index 0000000..afab303
--- /dev/null
@@ -0,0 +1,70 @@
+/*
+ * 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 */
index 842d250..449817b 100644 (file)
@@ -19,6 +19,7 @@
 #define LOGS_MODEL_LOG_PROVIDER_H
 
 #include <contacts.h>
+#include <time.h>
 #include <memory>
 #include <set>
 
@@ -71,6 +72,7 @@ namespace Logs
                         */
                        enum FilterType
                        {
+                               FilterNone,
                                FilterAll,
                                FilterMissed
                        };
@@ -102,10 +104,19 @@ namespace Logs
                         */
                        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);
index b2d43d3..058e975 100644 (file)
@@ -50,13 +50,13 @@ namespace
        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);
@@ -77,7 +77,6 @@ char *LogItem::getText(Evas_Object *parent, const char *part)
        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");
@@ -108,7 +107,7 @@ Evas_Object *LogItem::getContent(Evas_Object *parent, const char *part)
        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);
diff --git a/lib-logs/src/Logs/List/LogsView.cpp b/lib-logs/src/Logs/List/LogsView.cpp
new file mode 100644 (file)
index 0000000..57b3041
--- /dev/null
@@ -0,0 +1,135 @@
+/*
+ * 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;
+}
index 3d049f1..2242192 100644 (file)
@@ -88,8 +88,20 @@ void LogProvider::fillGroupList(LogList &logList, LogGroupList &logGroupList)
 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)
@@ -230,7 +242,10 @@ void LogProvider::addNewLogs(LogIterator &newIt, LogList &newLogList)
                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;