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 STLOGI("battery percent : %d", battery_percentage);
85 if (battery_percentage >= MINIMUM_BATTERY)
89 STLOGI("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 process_request(app_control_h app_control, char *request)
159 if (strcmp(request, "sync") == 0) {
160 bool param_error = false;
161 if (app_control_get_extra_data(app_control, "mode", &mode) != APP_CONTROL_ERROR_NONE) {
162 STLOGE("No given mode");
166 if (app_control_get_extra_data(app_control, "type", &type) != APP_CONTROL_ERROR_NONE) {
167 STLOGE("No given type");
171 STLOGI("[sync request] mode : %s, type : %s", mode, type);
176 if (!is_init_sap()) {
178 request_all_sticker_data(mode, type);
182 else if (strcmp(request, "oobe") == 0) {
184 request_sticker_feature();
187 STLOGW("Unknown command : %s", request);
188 if (!is_init_sap()) {
201 static void process_auto_sync()
204 STLOGD("continue doing current job");
208 if (check_sync_time_condition()) {
209 if (check_battery_condition()) {
210 STLOGD("Starting auto synchronization");
212 if (get_receive_sticker_feature()) {
213 STLOGI("Already sticker feature is received");
216 request_sticker_feature();
222 STLOGI("The status of battery is low");
223 if (!get_job_progress()) {
230 if (!get_job_progress()) {
237 static void get_sticker_feature()
239 if (get_receive_sticker_feature()) {
240 STLOGI("Already sticker feature is received");
247 #ifdef VCONFKEY_STICKER_SUPPORTED_FEATURE
248 // Check whether oobe has been done
249 int feature_flag = 0;
250 if (vconf_get_int(VCONFKEY_STICKER_SUPPORTED_FEATURE, &feature_flag) == 0 && feature_flag == 0) {
251 STLOGD("Request to get sticker feature");
253 request_sticker_feature();
262 static void app_control(app_control_h app_control, void *data)
264 /* Handle the launch request. */
265 char* request = NULL;
266 char* operation = NULL;
267 char* event_value = NULL;
269 const char *event_uri = "event://tizen.system.event.battery_charger_status";
272 if (!check_rw_mount())
276 int ret = app_control_get_operation(app_control, &operation);
277 if (ret != APP_CONTROL_ERROR_NONE) {
278 STLOGW("Failed to get operation. error : %d", ret);
282 STLOGD("operation: %s", operation);
288 if (strcmp(operation, APP_CONTROL_OPERATION_LAUNCH_ON_EVENT) == 0)
290 ret = app_control_get_uri(app_control, &uri);
291 if (ret == APP_CONTROL_ERROR_NONE && uri)
293 if (strncmp(uri, event_uri, strlen(event_uri) + 1) == 0)
295 ret = app_control_get_extra_data(app_control, "battery_charger_status", &event_value);
296 if (ret == APP_CONTROL_ERROR_NONE && event_value)
298 if (string(event_value) == "connected")
300 STLOGI("The charger state is connected");
309 else if (strcmp(operation, APP_CONTROL_OPERATION_DEFAULT) == 0) {
310 res = app_control_get_extra_data(app_control, "request", &request);
311 STLOGD("get extra data result : %d, request : %s", res, request);
312 if (APP_CONTROL_ERROR_NONE == res && NULL != request) {
313 process_request(app_control, request);
317 get_sticker_feature();
322 if (NULL != operation)
329 static void app_terminate(void *data)
331 /* Release all resources. */
333 destroy_sticker_provider_handle();
337 int main(int argc, char *argv[])
341 service_app_lifecycle_callback_s event_callback;
342 memset(&event_callback, 0x0, sizeof(service_app_lifecycle_callback_s));
344 event_callback.create = (service_app_create_cb)app_create;
345 event_callback.terminate = (service_app_terminate_cb)app_terminate;
346 event_callback.app_control = (service_app_control_cb)app_control;
348 ret = service_app_main(argc, argv, &event_callback, NULL);
349 if (ret != APP_ERROR_NONE) {
350 STLOGE("app_main() is failed. err = %d", ret);