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 check_rw_mount();
38 static bool app_create(void *data)
40 /* Hook to take necessary actions before main event loop starts
41 Initialize UI resources and application's data
42 If this function returns true, the main loop of application starts
43 If this function returns false, the application is terminated */
45 if (!check_rw_mount()) {
52 char log_path[PATH_MAX];
53 char *data_path = NULL;
54 data_path = app_get_shared_data_path();
55 snprintf(log_path, sizeof(log_path), "%s/log", data_path);
60 if (access(log_path, F_OK) != 0) {
61 if (mkdir(log_path, 0755) == -1) {
62 STLOGE("directory create error");
66 create_sticker_provider_handle();
71 static bool check_battery_condition()
73 int battery_percentage = 0;
76 // check battery percentage
77 ret = device_battery_get_percent(&battery_percentage);
78 if (ret != DEVICE_ERROR_NONE)
80 STLOGW("No sync. Failed to get battery percent. error : %d", ret);
84 LOGI("battery percent : %d", battery_percentage);
85 if (battery_percentage >= MINIMUM_BATTERY)
89 LOGI("No sync due to insufficient battery");
94 static bool check_sync_time_condition()
96 double last_sync_time;
100 #ifdef VCONFKEY_STICKER_SUPPORTED_FEATURE
101 // Check whether oobe has been done
102 if (vconf_get_int(VCONFKEY_STICKER_SUPPORTED_FEATURE, &feature_flag) == 0 && feature_flag > 0)
104 if (preference_get_double(LAST_SYNC_TIME, &last_sync_time) != PREFERENCE_ERROR_NONE)
106 STLOGD("Can't get last sync time.");
111 double timediff = ecore_time_unix_get() - last_sync_time;
112 STLOGD("current time : %.3f, last_sync_time : %.3f, diff : %.3f", ecore_time_unix_get(), last_sync_time, timediff);
114 if (timediff > MAX_WAIT_TIME) {
115 STLOGD("Starting manual synchronization");
117 request_show_sync_notification();
120 if (timediff > SYNC_INTERVAL)
130 #endif /* VCONFKEY_STICKER_SUPPORTED_FEATURE */
135 bool check_rw_mount()
137 char *data_path = NULL;
138 bool rw_mount = false;
139 data_path = app_get_shared_data_path();
140 if (!data_path) return false;
142 if (access(data_path, R_OK) == 0)
148 SECURE_LOGE("Can't access rw storage\n");
154 static void app_control(app_control_h app_control, void *data)
156 /* Handle the launch request. */
157 char* request = NULL;
160 char* operation = NULL;
161 char* event_value = NULL;
163 const char *event_uri = "event://tizen.system.event.battery_charger_status";
166 if (!check_rw_mount())
170 int ret = app_control_get_operation(app_control, &operation);
171 if (ret == APP_CONTROL_ERROR_NONE) {
172 STLOGD("operation: %s", operation);
178 if (strcmp(operation, APP_CONTROL_OPERATION_LAUNCH_ON_EVENT) == 0)
180 ret = app_control_get_uri(app_control, &uri);
181 if (ret == APP_CONTROL_ERROR_NONE && uri)
183 if (strncmp(uri, event_uri, strlen(event_uri) + 1) == 0)
185 ret = app_control_get_extra_data(app_control, "battery_charger_status", &event_value);
186 if (ret == APP_CONTROL_ERROR_NONE && event_value)
188 if (string(event_value) == "connected")
190 if (!is_init_sap()) {
191 if (check_sync_time_condition()) {
192 if (check_battery_condition()) {
193 STLOGD("Starting auto synchronization");
195 request_sticker_feature();
200 if (!get_job_progress())
208 STLOGD("continue doing current job");
217 else if (strcmp(operation, APP_CONTROL_OPERATION_DEFAULT) == 0) {
218 #ifdef VCONFKEY_STICKER_SUPPORTED_FEATURE
219 // Check whether oobe has been done
220 int feature_flag = 0;
221 if (vconf_get_int(VCONFKEY_STICKER_SUPPORTED_FEATURE, &feature_flag) == 0 && feature_flag == 0) {
222 STLOGD("Request to get sticker feature");
224 request_sticker_feature();
234 STLOGW("Failed to get operation. error : %d", ret);
238 res = app_control_get_extra_data(app_control, "request", &request);
239 if (APP_CONTROL_ERROR_NONE == res && NULL != request) {
240 if (strcmp(request, "sync") == 0) {
241 bool param_error = false;
242 if (app_control_get_extra_data(app_control, "mode", &mode) != APP_CONTROL_ERROR_NONE) {
243 STLOGE("No given mode");
247 if (app_control_get_extra_data(app_control, "type", &type) != APP_CONTROL_ERROR_NONE) {
248 STLOGE("No given type");
252 LOGI("[sync request] mode : %s, type : %s", mode, type);
257 if (!is_init_sap()) {
259 request_all_sticker_data(mode, type);
263 else if (strcmp(request, "oobe") == 0) {
265 request_sticker_feature();
269 STLOGW("Unknown command : %s", request);
278 if (NULL != operation)
291 static void app_terminate(void *data)
293 /* Release all resources. */
295 destroy_sticker_provider_handle();
299 int main(int argc, char *argv[])
303 service_app_lifecycle_callback_s event_callback;
304 memset(&event_callback, 0x0, sizeof(service_app_lifecycle_callback_s));
306 event_callback.create = (service_app_create_cb)app_create;
307 event_callback.terminate = (service_app_terminate_cb)app_terminate;
308 event_callback.app_control = (service_app_control_cb)app_control;
310 ret = service_app_main(argc, argv, &event_callback, NULL);
311 if (ret != APP_ERROR_NONE) {
312 STLOGE("app_main() is failed. err = %d", ret);