Changes registering alarm tick from relative to absolute 08/228408/2
authorInkyun Kil <inkyun.kil@samsung.com>
Mon, 23 Mar 2020 01:48:57 +0000 (10:48 +0900)
committerInkyun Kil <inkyun.kil@samsung.com>
Thu, 26 Mar 2020 07:52:42 +0000 (16:52 +0900)
Change-Id: I6fbe54cc549f5b131fced0fafdd7bb49464389db
Signed-off-by: Inkyun Kil <inkyun.kil@samsung.com>
appcore_ui_app_ambient/src/ui_app_ambient.c

index f621a53..6fa1817 100644 (file)
@@ -100,13 +100,22 @@ static int __alarm_cb(alarm_id_t id, void *data)
        return 0;
 }
 
-static int __get_ambient_tick_offset(ui_app_ambient_update_period_e period)
+static alarm_entry_t* __get_ambient_tick_alarm(ui_app_ambient_update_period_e period)
 {
        struct timespec current_time;
        struct tm cur_tm;
+       struct tm next_tm;
        int offset = 0;
        int remain_min;
        int minute_base;
+       int ret;
+       time_t next;
+       alarm_entry_t *alarm_info = NULL;
+       alarm_date_t date = {0};
+
+       alarm_info = alarmmgr_create_alarm();
+       if (!alarm_info)
+               return NULL;
 
        clock_gettime(CLOCK_REALTIME, &current_time);
 
@@ -130,13 +139,42 @@ static int __get_ambient_tick_offset(ui_app_ambient_update_period_e period)
                break;
        }
 
-       return offset;
+       next = current_time.tv_sec + offset;
+       localtime_r(&next, &next_tm);
+
+       date.year = next_tm.tm_year + 1900;
+       date.month = next_tm.tm_mon + 1;
+       date.day = next_tm.tm_mday;
+       date.hour = next_tm.tm_hour;
+       date.min = next_tm.tm_min;
+       date.sec = next_tm.tm_sec;
+
+       alarmmgr_set_type(alarm_info, ALARM_TYPE_VOLATILE);
+
+       ret = alarmmgr_set_time(alarm_info, date);
+       if (ret != ALARMMGR_RESULT_SUCCESS) {
+               LOGE("Failed to alarmmgr_set_time : %d", ret);
+               alarmmgr_free_alarm(alarm_info);
+               return NULL;
+       }
+
+       ret = alarmmgr_set_repeat_mode(alarm_info, ALARM_REPEAT_MODE_REPEAT,
+               ambient_tick_type_infos[period].interval);
+       if (ret != ALARMMGR_RESULT_SUCCESS) {
+               LOGE("Failed to alarmmgr_set_time : %d", ret);
+               alarmmgr_free_alarm(alarm_info);
+               return NULL;
+       }
+
+       LOGD("Next alarm tick [%d:%d:%d]", date.hour, date.min, date.sec);
+       return alarm_info;
 }
 
 static int __set_ambient_tick_cb()
 {
        int r;
-       int offset_sec = 0;
+       char appid_buf[APPID_BUFFER_MAX] = {0, };
+       alarm_entry_t *alarm_info = NULL;
 
        if (ambient_lifecycle.period_type == UI_APP_AMBIENT_UPDATE_NONE &&
                        ambient_lifecycle.alarm_id == 0) {
@@ -144,18 +182,29 @@ static int __set_ambient_tick_cb()
                ambient_lifecycle.period_type = UI_APP_AMBIENT_UPDATE_FIFTEEN_MINUTES;
        }
 
-       offset_sec = __get_ambient_tick_offset(ambient_lifecycle.period_type);
-       LOGD("next time offset: %d[type:%d]", offset_sec, ambient_lifecycle.period_type);
+       alarm_info = __get_ambient_tick_alarm(ambient_lifecycle.period_type);
+       if (!alarm_info)
+               return -1;
+
+       alarmmgr_set_cb(__alarm_cb, ambient_lifecycle.user_data);
 
        __alarm_init();
-       r = alarmmgr_add_alarm_withcb(ALARM_TYPE_VOLATILE, offset_sec,
-               ambient_tick_type_infos[ambient_lifecycle.period_type].interval,
-               __alarm_cb, ambient_lifecycle.user_data, &ambient_lifecycle.alarm_id);
+
+       if (aul_app_get_appid_bypid(
+               getpid(), appid_buf, sizeof(appid_buf)) != AUL_R_OK) {
+               LOGE("Failed to get appid (%d)", getpid());
+               alarmmgr_free_alarm(alarm_info);
+               return -1;
+       }
+
+       r = alarmmgr_add_alarm_with_localtime(alarm_info, appid_buf,
+               &ambient_lifecycle.alarm_id);
        if (r < 0)
-               LOGE("fail to alarmmgr_add_alarm_withcb : error_code : %d", r);
+               LOGE("fail to alarmmgr_add_alarm_with_localtime : error_code : %d", r);
 
        ambient_lifecycle.frame_updated(ambient_lifecycle.user_data);
 
+       alarmmgr_free_alarm(alarm_info);
        return r;
 }