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 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();
199 if (!get_job_progress()) {
206 if (!get_job_progress()) {
213 STLOGD("continue doing current job");
222 else if (strcmp(operation, APP_CONTROL_OPERATION_DEFAULT) == 0) {
224 res = app_control_get_extra_data(app_control, "request", &request);
225 if (APP_CONTROL_ERROR_NONE == res && NULL != request) {
226 if (strcmp(request, "sync") == 0) {
227 bool param_error = false;
228 if (app_control_get_extra_data(app_control, "mode", &mode) != APP_CONTROL_ERROR_NONE) {
229 STLOGE("No given mode");
233 if (app_control_get_extra_data(app_control, "type", &type) != APP_CONTROL_ERROR_NONE) {
234 STLOGE("No given type");
238 STLOGI("[sync request] mode : %s, type : %s", mode, type);
243 if (!is_init_sap()) {
245 request_all_sticker_data(mode, type);
249 else if (strcmp(request, "oobe") == 0) {
251 request_sticker_feature();
254 STLOGW("Unknown command : %s", request);
255 if (!is_init_sap()) {
262 #ifdef VCONFKEY_STICKER_SUPPORTED_FEATURE
263 // Check whether oobe has been done
264 int feature_flag = 0;
265 if (vconf_get_int(VCONFKEY_STICKER_SUPPORTED_FEATURE, &feature_flag) == 0 && feature_flag == 0) {
266 STLOGD("Request to get sticker feature");
268 request_sticker_feature();
279 STLOGW("Failed to get operation. error : %d", ret);
283 if (NULL != operation)
296 static void app_terminate(void *data)
298 /* Release all resources. */
300 destroy_sticker_provider_handle();
304 int main(int argc, char *argv[])
308 service_app_lifecycle_callback_s event_callback;
309 memset(&event_callback, 0x0, sizeof(service_app_lifecycle_callback_s));
311 event_callback.create = (service_app_create_cb)app_create;
312 event_callback.terminate = (service_app_terminate_cb)app_terminate;
313 event_callback.app_control = (service_app_control_cb)app_control;
315 ret = service_app_main(argc, argv, &event_callback, NULL);
316 if (ret != APP_ERROR_NONE) {
317 STLOGE("app_main() is failed. err = %d", ret);