AlarmProvider: add lazy sync of database 59/110059/2
authorLukasz Stanislawski <l.stanislaws@samsung.com>
Thu, 12 Jan 2017 16:09:41 +0000 (17:09 +0100)
committerLukasz Stanislawski <l.stanislaws@samsung.com>
Thu, 19 Jan 2017 15:28:36 +0000 (16:28 +0100)
use ecore_idler_enterer to trigger sync of database.

Change-Id: I8a7a0abfbc39fe8f69718588bdafb608c111d476

clock/inc/Model/AlarmProvider.h
clock/src/Model/AlarmProvider.cpp

index 79df47e6825a0730839966a5bf2be2e4f226fa72..102c4b6ae2b5f6f5735582995aaca31820fd7c1b 100644 (file)
@@ -23,6 +23,7 @@
 
 #include <vector>
 #include <functional>
+#include <Ecore.h>
 
 namespace model {
        /**
@@ -46,10 +47,14 @@ namespace model {
                        model::AlarmList& GetAlarms();
                private:
                        model::AlarmList alarms_;
+                       Ecore_Idler *idler_job_;
 
                        void Sync();
                        void ScheduleSync();
                        bool HasActiveAlarms();
+                       static Eina_Bool IdlerCallback(void *data);
+                       void AlarmListChanged(model::AlarmList::Iterator it);
+                       std::vector<utils::Connection> connections_;
        };
 } /* model */
 
index 012fd57597c523272a660f9f965f5cefeb93b244..18e49b131ed885749b4deaaeaa836b82a23f8b0a 100644 (file)
@@ -27,8 +27,9 @@ const int MAX_ALARMS  = 20;
 
 using namespace model;
 using namespace utils;
+using std::placeholders::_1;
 
-AlarmProvider::AlarmProvider()
+AlarmProvider::AlarmProvider() : idler_job_(nullptr)
 {
        BinaryFileReader reader(TizenAppUtils::GetResourcePath(TizenAppUtils::APP_DIR_DATA, DATABASE_FILE));
 
@@ -36,11 +37,19 @@ AlarmProvider::AlarmProvider()
 
        if (HasActiveAlarms())
                Notifier::GetInstance().AlarmNotiPost();
+
+       connections_.push_back(alarms_.OnAdded.Connect(
+                               std::bind(&AlarmProvider::AlarmListChanged, this, _1)));
+       connections_.push_back(alarms_.OnRemoved.Connect(
+                               std::bind(&AlarmProvider::AlarmListChanged, this, _1)));
+       connections_.push_back(alarms_.OnReplaced.Connect(
+                               std::bind(&AlarmProvider::AlarmListChanged, this, _1)));
 }
 
 AlarmProvider::~AlarmProvider()
 {
        Sync();
+       if (idler_job_) ecore_idler_del(idler_job_);
 }
 
 void AlarmProvider::Sync()
@@ -75,5 +84,20 @@ AlarmList& AlarmProvider::GetAlarms()
 
 void AlarmProvider::ScheduleSync()
 {
-       Sync();
+       if (idler_job_) return;
+       idler_job_ = ecore_idle_enterer_add(AlarmProvider::IdlerCallback, this);
+}
+
+Eina_Bool AlarmProvider::IdlerCallback(void *data)
+{
+       AlarmProvider *provider = static_cast<AlarmProvider*>(data);
+       provider->idler_job_ = nullptr;
+       provider->Sync();
+
+       return EINA_FALSE;
+}
+
+void AlarmProvider::AlarmListChanged(model::AlarmList::Iterator it)
+{
+       ScheduleSync();
 }