From: Radoslaw Czerski Date: Thu, 27 Oct 2016 10:48:08 +0000 (+0200) Subject: World Clock: Time updating implemented X-Git-Tag: submit/tizen/20161113.192141~6 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=1de98eee1cbf6c0459c263371da84a8dbc814479;p=profile%2Fmobile%2Fapps%2Fnative%2Fclock.git World Clock: Time updating implemented Change-Id: I0b34ba3d1b9106ab7da69e405eadddab22d8f9b2 Signed-off-by: Radoslaw Czerski --- diff --git a/clock/inc/Utils/WorldClock.h b/clock/inc/Utils/WorldClock.h index 0280d0d..f1d1c50 100644 --- a/clock/inc/Utils/WorldClock.h +++ b/clock/inc/Utils/WorldClock.h @@ -32,6 +32,12 @@ namespace utils { */ std::string GetTimezoneDiffDescription(int local_timezone_offset, int timezone_offset); +/** + * @brief Retrieves seconds to the next exact minute(e.g. for 15:33:44:200 the returned is 15,800) + * + * @return seconds to round minute + */ +double GetSecondsToNextExactMinute(); } #endif /* _CLOCK_UTILS_WORLDCLOCK_H_ */ diff --git a/clock/inc/View/WorldClockDeleteItemsView.h b/clock/inc/View/WorldClockDeleteItemsView.h index 767b0c5..984ff0e 100644 --- a/clock/inc/View/WorldClockDeleteItemsView.h +++ b/clock/inc/View/WorldClockDeleteItemsView.h @@ -132,6 +132,11 @@ namespace view { Evas_Object *select_all_checkbox_; /** + * @brief Timer for time and date updating + */ + Ecore_Timer *timer_; + + /** * @brief Item class for the main content genlist */ static Elm_Genlist_Item_Class world_clock_delete_view_itc_; @@ -235,6 +240,13 @@ namespace view { * @brief Emits LIST_ITEM_CLICKED signal and toggle checkbox state. */ static void ItemSelectToggle(void *data, Evas_Object *obj, void *event_info); + + /** + * @brief Timer callback for time updates. + * @param data user data + * @return EINA_BOOL to allow next invocation of callback, EINA_FALSE otherwise + */ + static Eina_Bool TimeUpdateCb(void *data); }; } /* view */ diff --git a/clock/inc/View/WorldClockReorderView.h b/clock/inc/View/WorldClockReorderView.h index fe1c61e..6670a0a 100644 --- a/clock/inc/View/WorldClockReorderView.h +++ b/clock/inc/View/WorldClockReorderView.h @@ -102,6 +102,11 @@ namespace view { static Elm_Genlist_Item_Class world_clock_reorder_items_view_itc_; /** + * @brief Timer for time and date updating + */ + Ecore_Timer *timer_; + + /** * @brief list of signals */ std::vector> signals_ @@ -171,6 +176,13 @@ namespace view { * @remarks Invoked by clicking BACK naviframe button or back hardware key */ static void OnBackButtonClicked(void *data, Evas_Object *obj, void *event_info); + + /** + * @brief Timer callback for time updates. + * @param data user data + * @return EINA_BOOL to allow next invocation of callback, EINA_FALSE otherwise + */ + static Eina_Bool TimeUpdateCb(void *data); }; } /* view */ diff --git a/clock/inc/View/WorldClockView.h b/clock/inc/View/WorldClockView.h index b9eb067..260cab5 100644 --- a/clock/inc/View/WorldClockView.h +++ b/clock/inc/View/WorldClockView.h @@ -36,6 +36,7 @@ namespace view { CUSTOM_LIST_ITEM_CLICKED, CUSTOM_LIST_ITEM_ADD, + CUSTOM_LIST_UPDATE_REQUEST, MAX }; @@ -54,6 +55,7 @@ namespace view { }; WorldClockView(ui::IView &main); + ~WorldClockView(); Evas_Object *GetEvasObject(){return world_clock_main_;}; @@ -124,6 +126,13 @@ namespace view { static void AddLocationReplayCb(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data); + /** + * @brief Timer callback for time updates. + * @param data user data + * @return EINA_BOOL to allow next invocation of callback, EINA_FALSE otherwise + */ + static Eina_Bool TimeUpdateCb(void *data); + void SetItemLastClicked(const model::Location *location); void SetItemToAdd(model::Location *l); void EmitSignal(view::WorldClockSignals signal); @@ -142,6 +151,11 @@ namespace view { const model::Location *item_last_clicked_; const model::Location *item_to_add_; + /** + * @brief Timer for time and date updating + */ + Ecore_Timer *timer_; + std::vector> signals = std::vector>((int)WorldClockSignals::MAX, nullptr); }; diff --git a/clock/src/Presenter/WorldClockPresenter.cpp b/clock/src/Presenter/WorldClockPresenter.cpp index c7ca481..461d607 100644 --- a/clock/src/Presenter/WorldClockPresenter.cpp +++ b/clock/src/Presenter/WorldClockPresenter.cpp @@ -40,12 +40,14 @@ WorldClockPresenter::WorldClockPresenter(WorldClockView *view, WorldClock *model WorldClockSignals::CUSTOM_LIST_ITEM_CLICKED); view_->RegisterSignal(std::bind(&WorldClockPresenter::OnItemAdded, this), WorldClockSignals::CUSTOM_LIST_ITEM_ADD); + view_->RegisterSignal(std::bind(&WorldClockPresenter::OnMapViewUpdateRequest, this), + WorldClockSignals::CUSTOM_LIST_UPDATE_REQUEST); view_->RegisterSignal(std::bind(&WorldClockPresenter::OnMoreButtonClicked, this), WorldClockSignals::BUTTON_MORE_CLICKED); view_->RegisterSignal(std::bind(&WorldClockPresenter::OnMoreDeleteButtonClicked, this), WorldClockSignals::BUTTON_MORE_DELETE_CLICKED); view_->RegisterSignal(std::bind(&WorldClockPresenter::OnMoreReorderButtonClicked, this), - WorldClockSignals::BUTTON_MORE_REORDER_CLICKED); + WorldClockSignals::BUTTON_MORE_REORDER_CLICKED); model_->RegisterSignalHandler(WorldClock::ParameterSignalType::USER_LOCATION_REMOVED, std::bind(&WorldClockPresenter::OnItemDeleted, this, _1)); @@ -53,7 +55,7 @@ WorldClockPresenter::WorldClockPresenter(WorldClockView *view, WorldClock *model model_->RegisterSignalHandler(WorldClock::SignalType::CUSTOM_LIST_CHANGED, std::bind(&WorldClockPresenter::OnCustomListChanged, this)); - view_->UpdateMapAndTimezoneDetails(model_->GetCurrentTimezone()); + OnMapViewUpdateRequest(); for (auto it = model_->user_locations_.begin(); it != model_->user_locations_.end(); it++) view_->AppendItemToCustomList(*it); @@ -76,13 +78,13 @@ void WorldClockPresenter::UpdateEmptyListBackground() void WorldClockPresenter::OnLeftArrowButtonClicked() { model_->MoveCurrentTimezone(model::WorldClock::LEFT); - view_->UpdateMapAndTimezoneDetails(model_->GetCurrentTimezone()); + OnMapViewUpdateRequest(); } void WorldClockPresenter::OnRightArrowButtonClicked() { model_->MoveCurrentTimezone(model::WorldClock::RIGHT); - view_->UpdateMapAndTimezoneDetails(model_->GetCurrentTimezone()); + OnMapViewUpdateRequest(); } void WorldClockPresenter::OnCustomListItemClicked() @@ -90,7 +92,7 @@ void WorldClockPresenter::OnCustomListItemClicked() const model::Location *location = view_->GetLastClickedItem(); model_->SetCurrentTimezone(model_->GetTimezoneByOffset(location->gmt_offset_)); - view_->UpdateMapAndTimezoneDetails(model_->GetCurrentTimezone()); + OnMapViewUpdateRequest(); } @@ -123,7 +125,7 @@ void WorldClockPresenter::OnItemAdded() } model_->SetCurrentTimezone(t); - view_->UpdateMapAndTimezoneDetails(model_->GetCurrentTimezone()); + OnMapViewUpdateRequest(); view_->AppendItemToCustomList(l); } else { view_->PostItemExistMessage(); diff --git a/clock/src/Utils/WorldClock.cpp b/clock/src/Utils/WorldClock.cpp index a72297d..59a8750 100644 --- a/clock/src/Utils/WorldClock.cpp +++ b/clock/src/Utils/WorldClock.cpp @@ -16,6 +16,7 @@ #include #include "Utils/WorldClock.h" +#include "Utils/Time.h" namespace utils { // local_timezone_offset and timezone_offset should be relative to GMT @@ -51,4 +52,14 @@ std::string GetTimezoneDiffDescription(int local_timezone_offset, int timezone_o return relative; } + +double GetSecondsToNextExactMinute() +{ + Time t = Time::Now(); + double s = t.GetSecond(); + double ms = t.GetMilliSec(); + double diff = 60 - s - (ms / 1000); + return diff; +} + } /* utils */ diff --git a/clock/src/View/WorldClockDeleteItemsView.cpp b/clock/src/View/WorldClockDeleteItemsView.cpp index 2b869a1..5f25839 100644 --- a/clock/src/View/WorldClockDeleteItemsView.cpp +++ b/clock/src/View/WorldClockDeleteItemsView.cpp @@ -17,6 +17,8 @@ #include #include #include +#include + #include "View/WorldClockDeleteItemsView.h" #include "Internal/WorldClockDefs.h" #include "Model/Location.h" @@ -230,8 +232,20 @@ Evas_Object *WorldClockDeleteItemsView::GetEvasObject() return content_; } +Eina_Bool WorldClockDeleteItemsView::TimeUpdateCb(void *data) +{ + WorldClockDeleteItemsView *view = static_cast(data); + elm_genlist_realized_items_update(view->content_); + + ecore_timer_interval_set(view->timer_, utils::GetSecondsToNextExactMinute()); + + return EINA_TRUE; +} + void WorldClockDeleteItemsView::CreateContent(Evas_Object *parent) { + double time_delta; + elm_object_item_style_set(navi_item_, "basic"); static bool extension_init = false; @@ -268,6 +282,11 @@ void WorldClockDeleteItemsView::CreateContent(Evas_Object *parent) elm_object_item_part_content_set(navi_item_, "title_right_btn", right_button_); elm_object_item_content_set(navi_item_, content_); + time_delta = utils::GetSecondsToNextExactMinute(); + + timer_ = ecore_timer_add(time_delta, WorldClockDeleteItemsView::TimeUpdateCb, this); + if (!timer_) + FAT("Unable to create timer!"); CreateSelectAll(); } @@ -308,6 +327,7 @@ void WorldClockDeleteItemsView::CreateSelectAll() void WorldClockDeleteItemsView::DestroyContent() { + ecore_timer_del(timer_); evas_object_del(content_); evas_object_del(left_button_); evas_object_del(right_button_); diff --git a/clock/src/View/WorldClockReorderView.cpp b/clock/src/View/WorldClockReorderView.cpp index d3d8710..5d13d4b 100644 --- a/clock/src/View/WorldClockReorderView.cpp +++ b/clock/src/View/WorldClockReorderView.cpp @@ -104,9 +104,20 @@ void WorldClockReorderView::AppendItems( } } +Eina_Bool WorldClockReorderView::TimeUpdateCb(void *data) +{ + WorldClockReorderView *view = static_cast(data); + elm_genlist_realized_items_update(view->content_); + + ecore_timer_interval_set(view->timer_, utils::GetSecondsToNextExactMinute()); + + return EINA_TRUE; +} void WorldClockReorderView::CreateContent(Evas_Object *parent) { + double time_delta; + elm_object_item_style_set(navi_item_, "basic"); static bool extension_init = false; @@ -137,10 +148,17 @@ void WorldClockReorderView::CreateContent(Evas_Object *parent) elm_object_item_content_set(navi_item_, content_); evas_object_smart_callback_add(content_, "moved" , OnListReordered, this); + + time_delta = utils::GetSecondsToNextExactMinute(); + + timer_ = ecore_timer_add(time_delta, WorldClockReorderView::TimeUpdateCb, this); + if (!timer_) + FAT("Unable to create timer!"); } void WorldClockReorderView::DestroyContent() { + ecore_timer_del(timer_); evas_object_del(content_); evas_object_del(left_button_); } diff --git a/clock/src/View/WorldClockView.cpp b/clock/src/View/WorldClockView.cpp index 3b79507..3f29455 100644 --- a/clock/src/View/WorldClockView.cpp +++ b/clock/src/View/WorldClockView.cpp @@ -226,8 +226,21 @@ void message_cb(void *data, Evas_Object *obj, Edje_Message_Type type, int id, vo } } +Eina_Bool WorldClockView::TimeUpdateCb(void *data) +{ + WorldClockView *view = static_cast(data); + elm_genlist_realized_items_update(view->custom_locations_list_); + view->EmitSignal(view::WorldClockSignals::CUSTOM_LIST_UPDATE_REQUEST); + + ecore_timer_interval_set(view->timer_, utils::GetSecondsToNextExactMinute()); + + return EINA_TRUE; +} + WorldClockView::WorldClockView(ui::IView &main) { + double time_delta; + world_clock_main_ = elm_layout_add(main.GetEvasObject()); evas_object_size_hint_align_set(world_clock_main_, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_weight_set(world_clock_main_, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); @@ -264,8 +277,18 @@ WorldClockView::WorldClockView(ui::IView &main) elm_layout_signal_callback_add(world_clock_, "timezone,go,right", "main.world.map:arrow.right", ChangeTimezoneCb, static_cast(this)); + + time_delta = utils::GetSecondsToNextExactMinute(); + + timer_ = ecore_timer_add(time_delta, WorldClockView::TimeUpdateCb, this); + if (!timer_) + FAT("Unable to create timer!"); } +WorldClockView::~WorldClockView() +{ + ecore_timer_del(timer_); +} void WorldClockView::MoreButtonClicked(void *data, Evas_Object *obj, void *info) {