2 * Copyright (c) 2020 Samsung Electronics Co., Ltd. All rights reserved.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 #include <app_common.h>
18 #include <service_app.h>
20 #include <app_event.h>
21 #include <device/battery.h>
24 #include <app_preference.h>
31 #include "receiver_preference.h"
32 #include "sticker_info.h"
36 static bool app_create(void *data)
38 /* Hook to take necessary actions before main event loop starts
39 Initialize UI resources and application's data
40 If this function returns true, the main loop of application starts
41 If this function returns false, the application is terminated */
45 char log_path[PATH_MAX];
46 char *data_path = NULL;
47 data_path = app_get_shared_data_path();
48 snprintf(log_path, sizeof(log_path), "%s/log", data_path);
53 if (access(log_path, F_OK) != 0) {
54 if (mkdir(log_path, 0755) == -1) {
55 LOGE("directory create error");
59 create_sticker_provider_handle();
64 static bool check_battery_condition()
66 int battery_percentage = 0;
69 // check battery percentage
70 ret = device_battery_get_percent(&battery_percentage);
71 if (ret != DEVICE_ERROR_NONE)
73 LOGW("No sync. Failed to get battery percent. error : %d", ret);
77 LOGI("battery percent : %d", battery_percentage);
78 if (battery_percentage >= MINIMUM_BATTERY)
82 LOGI("No sync due to insufficient battery");
87 static bool check_sync_time_condition()
89 double last_sync_time;
93 #ifdef VCONFKEY_STICKER_SUPPORTED_FEATURE
94 // Check whether oobe has been done
95 if (vconf_get_int(VCONFKEY_STICKER_SUPPORTED_FEATURE, &feature_flag) == 0 && feature_flag > 0)
97 if (preference_get_double(LAST_SYNC_TIME, &last_sync_time) != PREFERENCE_ERROR_NONE)
99 LOGD("Can't get last sync time.");
104 double timediff = ecore_time_unix_get() - last_sync_time;
105 LOGD("current time : %.3f, last_sync_time : %.3f, diff : %.3f", ecore_time_unix_get(), last_sync_time, timediff);
107 if (timediff > MAX_WAIT_TIME) {
108 LOGD("Starting manual synchronization");
110 request_show_sync_notification();
113 if (timediff > SYNC_INTERVAL)
123 #endif /* VCONFKEY_STICKER_SUPPORTED_FEATURE */
128 bool check_rw_mount()
130 char *data_path = NULL;
131 bool rw_mount = false;
132 data_path = app_get_shared_data_path();
133 if (!data_path) return false;
135 if (access(data_path, R_OK) == 0)
141 SECURE_LOGE("Can't access rw storage\n");
147 static void app_control(app_control_h app_control, void *data)
149 /* Handle the launch request. */
150 char* request = NULL;
153 char* operation = NULL;
154 char* event_value = NULL;
156 const char *event_uri = "event://tizen.system.event.battery_charger_status";
159 if (!check_rw_mount())
163 int ret = app_control_get_operation(app_control, &operation);
164 if (ret == APP_CONTROL_ERROR_NONE) {
165 LOGD("operation: %s", operation);
171 if (strcmp(operation, APP_CONTROL_OPERATION_LAUNCH_ON_EVENT) == 0)
173 ret = app_control_get_uri(app_control, &uri);
174 if (ret == APP_CONTROL_ERROR_NONE && uri)
176 if (strncmp(uri, event_uri, strlen(event_uri) + 1) == 0)
178 ret = app_control_get_extra_data(app_control, "battery_charger_status", &event_value);
179 if (ret == APP_CONTROL_ERROR_NONE && event_value)
181 if (string(event_value) == "connected")
183 if (!is_init_sap()) {
184 if (check_sync_time_condition()) {
185 if (check_battery_condition()) {
186 LOGD("Starting auto synchronization");
188 request_sticker_feature();
193 if (!get_job_progress())
201 LOGD("continue doing current job");
212 LOGW("Failed to get operation. error : %d", ret);
216 res = app_control_get_extra_data(app_control, "request", &request);
217 if (APP_CONTROL_ERROR_NONE == res && NULL != request) {
218 if (strcmp(request, "sync") == 0) {
219 bool param_error = false;
220 if (app_control_get_extra_data(app_control, "mode", &mode) != APP_CONTROL_ERROR_NONE) {
221 LOGE("No given mode");
225 if (app_control_get_extra_data(app_control, "type", &type) != APP_CONTROL_ERROR_NONE) {
226 LOGE("No given type");
230 LOGI("[sync request] mode : %s, type : %s", mode, type);
235 if (!is_init_sap()) {
237 request_all_sticker_data(mode, type);
241 else if (strcmp(request, "oobe") == 0) {
243 request_sticker_feature();
247 LOGW("Unknown command : %s", request);
256 if (NULL != operation)
269 static void app_terminate(void *data)
271 /* Release all resources. */
273 destroy_sticker_provider_handle();
277 int main(int argc, char *argv[])
281 service_app_lifecycle_callback_s event_callback;
282 memset(&event_callback, 0x0, sizeof(service_app_lifecycle_callback_s));
284 event_callback.create = (service_app_create_cb)app_create;
285 event_callback.terminate = (service_app_terminate_cb)app_terminate;
286 event_callback.app_control = (service_app_control_cb)app_control;
288 ret = service_app_main(argc, argv, &event_callback, NULL);
289 if (ret != APP_ERROR_NONE) {
290 LOGE("app_main() is failed. err = %d", ret);