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)
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, 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 (void)app_control_destroy(app_control);
140 ret = app_control_send_launch_request(app_control, NULL, NULL);
141 if (ret != APP_CONTROL_ERROR_NONE)
142 _E("Failed to send launch request");
144 (void)app_control_destroy(app_control);
147 static void storage_browse(const struct popup_ops *ops)
149 unload_simple_popup(ops);
150 launch_app(EXT_MYFILES);
151 terminate_if_no_popup();
154 static void camera_browse(const struct popup_ops *ops)
156 unload_simple_popup(ops);
157 launch_app(EXT_GALLERY);
158 terminate_if_no_popup();
161 static void storage_unmount(const struct popup_ops *ops)
166 unload_simple_popup(ops);
168 param[0] = removed_path;
170 ret = broadcast_dbus_signal(DEVICED_PATH_USBHOST,
171 DEVICED_IFACE_USBHOST,
172 SIGNAL_NAME_UNMOUNT, "s", param);
174 _E("FAIL: broadcast_dbus_signal()");
176 memset(removed_path, 0, sizeof(removed_path));
178 terminate_if_no_popup();
181 static int storage_mounted_launch(bundle *b, const struct popup_ops *ops)
184 struct object_ops *obj;
190 ret = get_object_by_ops(ops, &obj);
192 _E("Failed to get object (%d)", ret);
196 path = (char *)bundle_get_val(obj->b, USB_MOUNT_PATH);
198 _E("Failed to get mount path");
202 _I("USB storage mount path (%s)", path);
203 snprintf(added_path, sizeof(added_path), "%s", path);
207 static int unmount_storage_launch(bundle *b, const struct popup_ops *ops)
210 struct object_ops *obj;
216 ret = get_object_by_ops(ops, &obj);
217 _D("ops = %s obj = %s", ops, obj);
219 _E("Failed to get object (%d)", ret);
223 path = (char *)bundle_get_val(obj->b, USB_MOUNT_PATH);
225 _E("Failed to get mount path");
229 remove_otg_popup(&storage_mounted_ops, path);
231 snprintf(removed_path, sizeof(removed_path), "%s", path);
235 static int storage_unmounted(bundle *b, const struct popup_ops *ops)
242 path = (char *)bundle_get_val(b, USB_MOUNT_PATH);
244 _E("Failed to get mount path");
248 remove_otg_popup(&storage_mounted_ops, path);
249 remove_otg_popup(&unmount_storage_ops, path);
251 terminate_if_no_popup();
255 static int camera_removed(bundle *b, const struct popup_ops *ops)
257 remove_otg_popup(&camera_added_ops, NULL);
258 terminate_if_no_popup();
262 static const struct popup_ops storage_mounted_ops = {
263 .name = "usbotg_storage_mounted",
264 .pattern = FEEDBACK_PATTERN_LOWBATT,
265 .show = load_simple_popup,
266 .title = "IDS_ST_BODY_USB_STORAGE_ABB",
267 .content = "IDS_USB_BODY_BROWSE_STORAGE_CONNECTED_VIA_USB_Q",
268 .left_text = "IDS_COM_SK_CANCEL",
269 .right_text = "IDS_BT_SK_BROWSE",
270 .right = storage_browse,
271 .pre = storage_mounted_launch,
274 static const struct popup_ops storage_unmounted_ops = {
275 .name = "usbotg_storage_unmounted",
276 .show = storage_unmounted,
279 static const struct popup_ops unmount_storage_ops = {
280 .name = "usbotg_unmount_storage",
281 .show = load_simple_popup,
282 .title = "IDS_ST_BODY_USB_STORAGE_ABB",
283 .content = "IDS_COM_POP_UNMOUNT_USB_MASS_STORAGE_BEFORE_REMOVING_TO_AVOID_DATA_LOSS",
284 .left_text = "IDS_COM_SK_CANCEL",
285 .right_text = "IDS_USB_BUTTON_UNMOUNT",
286 .right = storage_unmount,
287 .pre = unmount_storage_launch,
290 static const struct popup_ops camera_added_ops = {
291 .name = "usbotg_camera_added",
292 .pattern = FEEDBACK_PATTERN_LOWBATT,
293 .show = load_simple_popup,
294 .title = "IDS_CAM_HEADER_CAMERA_M_APPLICATION",
295 .content = "IDS_USB_BODY_BROWSE_CAMERA_CONNECTED_VIA_USB_Q",
296 .left_text = "IDS_COM_SK_CANCEL",
297 .right_text = "IDS_BT_SK_BROWSE",
298 .right = camera_browse,
301 static const struct popup_ops camera_removed_ops = {
302 .name = "usbotg_camera_removed",
303 .show = camera_removed,
306 static const struct popup_ops storage_mount_failed_ops = {
307 .name = "usbotg_storage_mount_failed",
308 .pattern = FEEDBACK_PATTERN_LOWBATT,
309 .show = load_simple_popup,
310 .title = "IDS_COM_HEADER_ATTENTION",
311 .content = "IDS_COM_BODY_USB_STORAGE_BLANK_OR_HAS_UNSUPPORTED_FILE_SYSTEM",
312 .left_text = "IDS_COM_SK_OK",
315 static const struct popup_ops storage_removed_unsafe_ops = {
316 .name = "usbotg_storage_removed_unsafe",
317 .show = load_simple_popup,
318 .title = "IDS_COM_HEADER_ATTENTION",
319 .content = "IDS_COM_POP_USB_MASS_STORAGE_UNEXPECTEDLY_REMOVED",
320 .left_text = "IDS_COM_SK_OK",
324 /* Constructor to register mount_failed button */
325 static __attribute__ ((constructor)) void usbotg_register_popup(void)
327 register_popup(&storage_mounted_ops);
328 register_popup(&storage_unmounted_ops);
329 register_popup(&unmount_storage_ops);
330 register_popup(&camera_added_ops);
331 register_popup(&camera_removed_ops);
332 register_popup(&storage_mount_failed_ops);
333 register_popup(&storage_removed_unsafe_ops);