static stc_callback_ret_e _get_restrictions_cb(stc_error_e result,
stc_restriction_info_h info, void *user_data);
-static void _initialize_limits(Data_Limits_T *limits);
+static void _initialize_cycle(Data_Limits_T *limits);
+static void _read_all_stat_cycles(void);
+static void _set_stats_time_frame_from_cycle(Data_Limits_T *limits);
static Eina_Bool _delayed_timer_cb(void *data);
static bool sim_total_stats_checked = false;
static bool wifi_restrictions_checked = false;
static bool sim_restrictions_checked = false;
+static bool all_stat_cycles_checked = false;
static Ecore_Timer *periodic_update_timer = NULL;
static void _lang_changed(app_event_info_h event_info, void *data)
data_usage_app_item_t *item = NULL;
bool tmp = false;
+ if (!all_stat_cycles_checked) {
+ _read_all_stat_cycles();
+ all_stat_cycles_checked = true;
+ }
+
if (!sim_total_stats_checked) {
ad.sim_1_limits.total_data_used = 0;
ad.sim_2_limits.total_data_used = 0;
+
tmp = get_sim_total_stats(ad.stc, _total_stats_cb);
if (tmp)
sim_total_stats_checked = true;
if (!wifi_total_stats_checked) {
ad.wifi_limits.total_data_used = 0;
+
tmp = get_wifi_total_stats(ad.stc, _total_stats_cb);
if (tmp)
wifi_total_stats_checked = true;
sim_total_stats_checked = false;
wifi_restrictions_checked = false;
sim_restrictions_checked = false;
+ all_stat_cycles_checked = false;
periodic_update_timer = ecore_timer_add(0.2, _delayed_timer_cb, NULL);
if (!periodic_update_timer)
_count_available_sim_cards(ad);
}
- _initialize_limits(&ad->sim_1_limits);
- _initialize_limits(&ad->sim_2_limits);
- _initialize_limits(&ad->wifi_limits);
+ _read_all_stat_cycles();
+
ret = stc_initialize(&ad->stc);
if (ret != STC_ERROR_NONE) {
SETTING_TRACE_ERROR("stc_initialize() error: %s", get_error_message(ret));
return STC_CALLBACK_CONTINUE;
}
-static void _initialize_limits(Data_Limits_T *limits)
+static void _initialize_cycle(Data_Limits_T *limits)
{
limits->custom_mode_interval = 0;
limits->cycle_mode = CYCLE_MODE_MONTHLY;
limits->cycle_start = 1;
}
+static void _read_all_stat_cycles(void)
+{
+ _initialize_cycle(&ad.sim_1_limits);
+ _initialize_cycle(&ad.sim_2_limits);
+ _initialize_cycle(&ad.wifi_limits);
+
+ if (!read_sim_1_cycle_mode((int *)&(ad.sim_1_limits.cycle_mode)))
+ SETTING_TRACE_ERROR("sim1 cycle mode read error");
+
+ read_sim_1_cycle_start(&(ad.sim_1_limits.cycle_start));
+ read_sim_1_cycle_interval(&(ad.sim_1_limits.custom_mode_interval));
+
+ if (!read_sim_2_cycle_mode((int *)&(ad.sim_2_limits.cycle_mode)))
+ SETTING_TRACE_ERROR("sim2 cycle mode read error");
+
+ read_sim_2_cycle_start(&(ad.sim_2_limits.cycle_start));
+ read_sim_2_cycle_interval(&(ad.sim_2_limits.custom_mode_interval));
+
+ if (!read_wifi_cycle_mode((int *)&(ad.wifi_limits.cycle_mode)))
+ SETTING_TRACE_ERROR("wifi cycle mode read error");
+
+ read_wifi_cycle_start(&(ad.wifi_limits.cycle_start));
+ read_wifi_cycle_interval(&(ad.wifi_limits.custom_mode_interval));
+
+ _set_stats_time_frame_from_cycle(&ad.sim_1_limits);
+ _set_stats_time_frame_from_cycle(&ad.sim_2_limits);
+ _set_stats_time_frame_from_cycle(&ad.wifi_limits);
+}
+
+static void _set_stats_time_frame_from_cycle(Data_Limits_T *limits)
+{
+ time_t now = 0;
+ long long custom_cycles_reminder = 0;
+ struct tm tm_past_delta = {0,};
+ struct tm tm_future_delta = {0,};
+ time(&now);
+ struct tm *tm_now = localtime(&now);
+ tm_now->tm_sec = 1;
+ tm_now->tm_min = 0;
+ tm_now->tm_hour = 0;
+ tm_past_delta = *tm_now;
+ tm_future_delta = *tm_now;
+
+ switch (limits->cycle_mode) {
+ case CYCLE_MODE_MONTHLY:
+ tm_past_delta.tm_mday = limits->cycle_start;
+ if (tm_now->tm_mday >= limits->cycle_start) {
+ tm_future_delta.tm_mon++;
+ tm_future_delta.tm_mday = limits->cycle_start;
+ } else {
+ tm_past_delta.tm_mon--;
+ tm_future_delta.tm_mday = limits->cycle_start;
+ }
+ break;
+ case CYCLE_MODE_WEEKLY:
+ tm_now->tm_wday--;
+ if (tm_now->tm_wday < 0)
+ tm_now->tm_wday = 6;
+ if (tm_now->tm_wday >= limits->cycle_start) {
+ tm_past_delta.tm_mday -= (tm_now->tm_wday + 1 - limits->cycle_start);
+ tm_future_delta.tm_mday += (7 + limits->cycle_start - tm_now->tm_wday);
+ } else {
+ tm_past_delta.tm_mday -= (7 + tm_now->tm_wday - limits->cycle_start);
+ tm_future_delta.tm_mday += (limits->cycle_start - tm_now->tm_wday);
+ }
+ break;
+ case CYCLE_MODE_DAILY:
+ tm_future_delta.tm_sec = 59;
+ tm_future_delta.tm_min = 59;
+ tm_future_delta.tm_hour = 23;
+ break;
+ case CYCLE_MODE_CUSTOM:
+ if (limits->custom_mode_interval <= 0) {
+ SETTING_TRACE_ERROR("Error: custom mode interval is %d",
+ limits->custom_mode_interval);
+ return;
+ }
+ custom_cycles_reminder = (now - (time_t)limits->cycle_start) %
+ (limits->custom_mode_interval * 24 * 60 * 60);
+ limits->interval_from = now - custom_cycles_reminder;
+ limits->interval_to = limits->interval_from +
+ (((time_t)limits->custom_mode_interval) * 24 * 60 * 60);
+ return;
+ default:
+ return;
+ }
+
+ limits->interval_from = mktime(&tm_past_delta);
+ limits->interval_to = mktime(&tm_future_delta);
+}