4 * Copyright (c) 2016 Samsung Electronics Co., Ltd. All rights reserved.
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
20 #include "popup-common.h"
22 #include <app_control.h>
25 #define MYFILES_APPNAME "org.tizen.myfile"
26 #define GALLERY_APPNAME "org.tizen.gallery"
28 #define USB_MOUNT_ROOT_PATH "/opt/storage"
29 #define USB_MOUNT_PATH "_DEVICE_PATH_"
33 #define DEVICED_PATH "/Org/Tizen/System/DeviceD"
34 #define DEVICED_IFACE "org.tizen.system.deviced"
35 #define DEVICED_PATH_USBHOST DEVICED_PATH"/Usbhost"
36 #define DEVICED_IFACE_USBHOST DEVICED_IFACE".Usbhost"
37 #define SIGNAL_NAME_UNMOUNT "unmount_storage"
39 static char added_path[BUF_MAX];
40 static char removed_path[BUF_MAX];
47 static const struct popup_ops storage_mounted_ops;
48 static const struct popup_ops unmount_storage_ops;
49 static const struct popup_ops camera_added_ops;
50 static const struct popup_ops storage_mount_failed_ops;
51 static const struct popup_ops storage_removed_unsafe_ops;
53 static void remove_otg_popup(const struct popup_ops *ops, char *path)
56 char *popup_path = NULL;
58 if (ops == &storage_mounted_ops)
59 popup_path = added_path;
60 else if (ops == &unmount_storage_ops)
61 popup_path = removed_path;
68 len = strlen(popup_path);
69 if (len != strlen(path))
71 if (strncmp(popup_path, path, len))
75 unload_simple_popup(ops);
78 static void set_myfiles_param(bundle *b)
83 if (strlen(added_path) > 0)
84 appsvc_add_data(b, "path", added_path);
86 appsvc_add_data(b, "path", USB_MOUNT_ROOT_PATH);
87 appsvc_set_pkgname(b, MYFILES_APPNAME);
90 static void set_gallery_param(bundle *b)
94 appsvc_add_data(b, "album-id", "GALLERY_ALBUM_PTP_ID");
95 appsvc_set_pkgname(b, GALLERY_APPNAME);
98 static struct ext_app_type {
100 void (*set_param)(bundle *b);
102 { EXT_MYFILES , set_myfiles_param },
103 { EXT_GALLERY , set_gallery_param },
106 static void launch_app(int type)
108 app_control_h app_control;
110 int ret = -1, i, type_len;
112 type_len = ARRAY_SIZE(app_type);
113 for (i = 0 ; i < ARRAY_SIZE(app_type) ; i++) {
114 if (type == app_type[i].type)
118 _E("Invalid type(%d).", type);
122 ret = app_control_create(&app_control);
123 if (ret != APP_CONTROL_ERROR_NONE)
127 ret = app_control_set_app_id(app_control, MYFILES_APPNAME);
129 ret = app_control_set_app_id(app_control, GALLERY_APPNAME);
131 _E("No matched type(%d).", type);
135 if (ret != APP_CONTROL_ERROR_NONE) {
136 _E("Failed to set app id.");
140 ret = app_control_send_launch_request(app_control, NULL, NULL);
141 if (ret != APP_CONTROL_ERROR_NONE)
142 _E("Fail to send launch request.");
146 (void)app_control_destroy(app_control);
151 static void storage_browse(const struct popup_ops *ops)
153 unload_simple_popup(ops);
154 launch_app(EXT_MYFILES);
155 terminate_if_no_popup();
158 static void camera_browse(const struct popup_ops *ops)
160 unload_simple_popup(ops);
161 launch_app(EXT_GALLERY);
162 terminate_if_no_popup();
165 static void storage_unmount(const struct popup_ops *ops)
170 unload_simple_popup(ops);
172 param[0] = removed_path;
174 ret = broadcast_dbus_signal(DEVICED_PATH_USBHOST,
175 DEVICED_IFACE_USBHOST,
176 SIGNAL_NAME_UNMOUNT, "s", param);
178 _E("Failed to broadcast_dbus_signal().");
180 memset(removed_path, 0, sizeof(removed_path));
182 terminate_if_no_popup();
185 static int storage_mounted_launch(bundle *b, const struct popup_ops *ops)
192 path = (char *)bundle_get_val(b, USB_MOUNT_PATH);
194 _E("Failed to get mount path.");
198 _I("USB storage mount path(%s).", path);
199 snprintf(added_path, sizeof(added_path), "%s", path);
203 static int unmount_storage_launch(bundle *b, const struct popup_ops *ops)
210 path = (char *)bundle_get_val(b, USB_MOUNT_PATH);
212 _E("Failed to get mount path.");
216 remove_otg_popup(&storage_mounted_ops, path);
218 snprintf(removed_path, sizeof(removed_path), "%s", path);
222 static int storage_unmounted(bundle *b, const struct popup_ops *ops)
229 path = (char *)bundle_get_val(b, USB_MOUNT_PATH);
231 _E("Failed to get mount path.");
235 remove_otg_popup(&storage_mounted_ops, path);
236 remove_otg_popup(&unmount_storage_ops, path);
238 terminate_if_no_popup();
242 static int camera_removed(bundle *b, const struct popup_ops *ops)
244 remove_otg_popup(&camera_added_ops, NULL);
245 terminate_if_no_popup();
249 static const struct popup_ops storage_mounted_ops = {
250 .name = "usbotg_storage_mounted",
251 .pattern = FEEDBACK_PATTERN_LOWBATT,
252 .show = load_simple_popup,
253 .title = "IDS_ST_BODY_USB_STORAGE_ABB",
254 .content = "IDS_USB_BODY_BROWSE_STORAGE_CONNECTED_VIA_USB_Q",
255 .left_text = "IDS_COM_SK_CANCEL",
256 .right_text = "IDS_BT_SK_BROWSE",
257 .right = storage_browse,
258 .pre = storage_mounted_launch,
261 static const struct popup_ops storage_unmounted_ops = {
262 .name = "usbotg_storage_unmounted",
263 .show = storage_unmounted,
266 static const struct popup_ops unmount_storage_ops = {
267 .name = "usbotg_unmount_storage",
268 .show = load_simple_popup,
269 .title = "IDS_ST_BODY_USB_STORAGE_ABB",
270 .content = "IDS_COM_POP_UNMOUNT_USB_MASS_STORAGE_BEFORE_REMOVING_TO_AVOID_DATA_LOSS",
271 .left_text = "IDS_COM_SK_CANCEL",
272 .right_text = "IDS_USB_BUTTON_UNMOUNT",
273 .right = storage_unmount,
274 .pre = unmount_storage_launch,
277 static const struct popup_ops camera_added_ops = {
278 .name = "usbotg_camera_added",
279 .pattern = FEEDBACK_PATTERN_LOWBATT,
280 .show = load_simple_popup,
281 .title = "IDS_CAM_HEADER_CAMERA_M_APPLICATION",
282 .content = "IDS_USB_BODY_BROWSE_CAMERA_CONNECTED_VIA_USB_Q",
283 .left_text = "IDS_COM_SK_CANCEL",
284 .right_text = "IDS_BT_SK_BROWSE",
285 .right = camera_browse,
288 static const struct popup_ops camera_removed_ops = {
289 .name = "usbotg_camera_removed",
290 .show = camera_removed,
293 static const struct popup_ops storage_mount_failed_ops = {
294 .name = "usbotg_storage_mount_failed",
295 .pattern = FEEDBACK_PATTERN_LOWBATT,
296 .show = load_simple_popup,
297 .title = "IDS_COM_HEADER_ATTENTION",
298 .content = "IDS_COM_BODY_USB_STORAGE_BLANK_OR_HAS_UNSUPPORTED_FILE_SYSTEM",
299 .left_text = "IDS_COM_SK_OK",
302 static const struct popup_ops storage_removed_unsafe_ops = {
303 .name = "usbotg_storage_removed_unsafe",
304 .show = load_simple_popup,
305 .title = "IDS_COM_HEADER_ATTENTION",
306 .content = "IDS_COM_POP_USB_MASS_STORAGE_UNEXPECTEDLY_REMOVED",
307 .left_text = "IDS_COM_SK_OK",
311 /* Constructor to register mount_failed button */
312 static __attribute__ ((constructor)) void usbotg_register_popup(void)
314 register_popup(&storage_mounted_ops);
315 register_popup(&storage_unmounted_ops);
316 register_popup(&unmount_storage_ops);
317 register_popup(&camera_added_ops);
318 register_popup(&camera_removed_ops);
319 register_popup(&storage_mount_failed_ops);
320 register_popup(&storage_removed_unsafe_ops);