--- /dev/null
+CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
+PROJECT(gallery C)
+
+SET(RSRC_DIR res)
+
+SET(EDC_DIR white_theme/edc)
+SET(IMG_DIR white_theme/edc/images)
+SET(SOUND_DIR white_theme/edc/sounds)
+SET(IMG_EDC_DIR white_theme/images_edc)
+
+SET(SRCS src/gallery.c
+ src/features/gl-albums.c
+ src/features/gl-albums-edit.c
+ src/features/gl-albums-new.c
+ src/features/gl-albums-sel.c
+ src/features/gl-thumbs.c
+ src/features/gl-thumbs-edit.c
+ src/features/gl-thumbs-sel.c
+ src/features/gl-tags.c
+ src/features/gl-tags-edit.c
+ src/features/gl-tags-new.c
+ src/features/gl-tags-rename.c
+ src/features/gl-albums-rename.c
+ src/widget/gl-button.c
+ src/widget/gl-controlbar.c
+ src/widget/gl-editfield.c
+ src/widget/gl-nocontents.c
+ src/widget/gl-notify.c
+ src/widget/gl-popup.c
+ src/widget/gl-ctxpopup.c
+ src/widget/gl-progressbar.c
+ src/widget/gl-rotate-bg.c
+ src/widget/gl-tile.c
+ src/widget/gl-thumb.c
+ src/util/gl-debug.c
+ src/util/gl-fs.c
+ src/util/gl-ui-util.c
+ src/util/gl-ext-exec.c
+ src/util/gl-ext-ug-load.c
+ src/util/gl-util.c
+ src/util/gl-drm.c
+ src/util/gl-thread-util.c
+ src/util/gl-lang.c
+ src/util/gl-exif.c
+ src/data/gl-data-type.c
+ src/data/gl-data.c
+ src/data/gl-data-util.c
+ src/data/gl-local-data.c
+)
+
+SET(VENDOR "tizen")
+SET(PACKAGE ${PROJECT_NAME})
+SET(PKGNAME "org.${VENDOR}.gallery")
+SET(PREFIX ${CMAKE_INSTALL_PREFIX})
+SET(BINDIR "${PREFIX}/bin")
+SET(RESDIR "${PREFIX}/res")
+SET(DATADIR "${PREFIX}/data")
+SET(LOCALEDIR "${RESDIR}/locale")
+SET(ICONDIR "/usr/share/icons/default/small")
+SET(EDJDIR "${RESDIR}/edje")
+
+IF("${CMAKE_BUILD_TYPE}" STREQUAL "")
+ SET(CMAKE_BUILD_TYPE "Release")
+ENDIF("${CMAKE_BUILD_TYPE}" STREQUAL "")
+MESSAGE("Build type: ${CMAKE_BUILD_TYPE}")
+
+INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include)
+INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include/data)
+INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include/util)
+INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include/widget)
+INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include/features)
+
+INCLUDE(FindPkgConfig)
+pkg_check_modules(pkgs REQUIRED
+ capi-content-media-content
+ drm-client
+ ui-gadget-1
+ elementary
+ ecore-imf
+ ecore-x
+ eina
+ evas
+ edje
+ vconf
+ ecore
+ ecore-file
+ ecore-input
+ dlog
+ glib-2.0
+ gthread-2.0
+ capi-appfw-application
+ capi-appfw-app-manager
+ haptic
+ utilX
+ notification
+)
+
+FOREACH(flag ${pkgs_CFLAGS})
+ SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}")
+ENDFOREACH(flag)
+
+SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}")
+SET(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -fPIC")
+SET(CMAKE_C_FLAGS_DEBUG "-O0 -g -fpie")
+SET(CMAKE_C_FLAGS_RELEASE "-O2 -fpie")
+
+FIND_PROGRAM(UNAME NAMES uname)
+EXEC_PROGRAM("${UNAME}" ARGS "-m" OUTPUT_VARIABLE "ARCH")
+IF("${ARCH}" MATCHES "arm")
+ ADD_DEFINITIONS("-DTARGET")
+ MESSAGE("add -DTARGET")
+ENDIF("${ARCH}" MATCHES "arm")
+
+ADD_DEFINITIONS("-DVENDOR=\"${VENDOR}\"")
+ADD_DEFINITIONS("-DPACKAGE=\"${PACKAGE}\"")
+ADD_DEFINITIONS("-DPACKAGE_NAME=\"${PKGNAME}\"")
+ADD_DEFINITIONS("-DPREFIX=\"${PREFIX}\"")
+ADD_DEFINITIONS("-DRESDIR=\"${RESDIR}\"")
+ADD_DEFINITIONS("-DDATADIR=\"${DATADIR}\"")
+ADD_DEFINITIONS("-DLOCALEDIR=\"${LOCALEDIR}\"")
+ADD_DEFINITIONS("-DICONDIR=\"${ICONDIR}\"")
+ADD_DEFINITIONS("-DEDJDIR=\"${EDJDIR}\"")
+
+ADD_DEFINITIONS("-D_USE_DLOG_")
+ADD_DEFINITIONS("-D_USE_ROTATE_BG")
+ADD_DEFINITIONS("-D_RENAME_ALBUM_SENSITIVE")
+SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--as-needed -pie")
+SET(CMAKE_LDFLAGS "-Wl,-zdefs" )
+
+ADD_EXECUTABLE(${PROJECT_NAME} ${SRCS})
+
+TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${pkgs_LDFLAGS} -lstdc++ )
+
+ADD_CUSTOM_COMMAND(OUTPUT gallery.edj
+ COMMAND edje_cc -id ${CMAKE_SOURCE_DIR}/${RSRC_DIR}/${IMG_DIR}
+ -sd ${CMAKE_SOURCE_DIR}/${RSRC_DIR}/${SOUND_DIR}
+ ${CMAKE_SOURCE_DIR}/${RSRC_DIR}/${EDC_DIR}/gallery.edc ${CMAKE_BINARY_DIR}/gallery.edj
+ DEPENDS ${CMAKE_SOURCE_DIR}/${RSRC_DIR}/${EDC_DIR}/gallery.edc
+)
+
+ADD_CUSTOM_COMMAND(OUTPUT gl-images.edj
+ COMMAND edje_cc -id ${CMAKE_SOURCE_DIR}/${RSRC_DIR}/${IMG_EDC_DIR}
+ ${CMAKE_SOURCE_DIR}/${RSRC_DIR}/${IMG_EDC_DIR}/gl-images.edc ${CMAKE_BINARY_DIR}/gl-images.edj
+ DEPENDS ${CMAKE_SOURCE_DIR}/${RSRC_DIR}/${IMG_EDC_DIR}/gl-images.edc
+)
+
+ADD_CUSTOM_TARGET(edj_build DEPENDS gallery.edj gl-images.edj)
+
+ADD_DEPENDENCIES(${PROJECT_NAME} edj_build)
+
+INSTALL(TARGETS ${PROJECT_NAME} DESTINATION ${BINDIR})
+INSTALL(FILES ${CMAKE_BINARY_DIR}/gallery.edj DESTINATION ${EDJDIR})
+INSTALL(FILES ${CMAKE_BINARY_DIR}/gl-images.edj DESTINATION ${EDJDIR})
+
+# install manifest file & icon
+INSTALL(FILES ${CMAKE_BINARY_DIR}/${PKGNAME}.xml DESTINATION /usr/share/packages)
+INSTALL(FILES ${CMAKE_SOURCE_DIR}/${RSRC_DIR}/icon/${PKGNAME}.png DESTINATION ${ICONDIR})
+
+INSTALL(DIRECTORY ${CMAKE_SOURCE_DIR}/res/white_theme/images DESTINATION ${RESDIR})
+
+# install content shortcut uri file
+INSTALL(FILES ${CMAKE_SOURCE_DIR}/${RSRC_DIR}/gallery.uri DESTINATION /usr/share/miregex)
+
+# install application HOME directory
+INSTALL(DIRECTORY DESTINATION /opt/usr/apps/${PKGNAME}/data)
+
+# Share APP mo files with Gallery UG
+SET(GALLERY_UG_PROJECT_NAME ug-gallery-efl)
+
+# install smack rule file
+INSTALL(FILES ${CMAKE_SOURCE_DIR}/org.tizen.gallery.rule DESTINATION /etc/smack/accesses.d)
+
+# install ug smack include file
+INSTALL(FILES ${CMAKE_SOURCE_DIR}/ug.gallery-efl.include DESTINATION /etc/smack/accesses2.d)
+
+# i18n
+ADD_SUBDIRECTORY(res/po)
+
+# UG
+ADD_SUBDIRECTORY(ug/ug-gallery-efl)
+
--- /dev/null
+1. make the build directory
+
+ ex)
+
+ $ mkdir build
+
+
+2. change the working directory to the build directory
+
+ ex)
+
+ $ cd build
+
+
+3. run 'cmake'
+
+ $ cmake ${SOURCE_DIR} -DCMAKE_INSTALL_PREFIX=/opt/apps/@@PKGNAME@@
+
+ ex)
+
+ $ cmake .. -DCMAKE_INSTALL_PREFIX=/opt/apps/@@PKGNAME@@
+
+ or
+
+ $ cmake ..
+
+
+4. make & make install
+
+ ex)
+
+ $ make -j 2 && make install
+
--- /dev/null
+Flora License
+
+Version 1.1, April, 2013
+
+http://floralicense.org/license/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+"License" shall mean the terms and conditions for use, reproduction,
+and distribution as defined by Sections 1 through 9 of this document.
+
+"Licensor" shall mean the copyright owner or entity authorized by
+the copyright owner that is granting the License.
+
+"Legal Entity" shall mean the union of the acting entity and
+all other entities that control, are controlled by, or are
+under common control with that entity. For the purposes of
+this definition, "control" means (i) the power, direct or indirect,
+to cause the direction or management of such entity,
+whether by contract or otherwise, or (ii) ownership of fifty percent (50%)
+or more of the outstanding shares, or (iii) beneficial ownership of
+such entity.
+
+"You" (or "Your") shall mean an individual or Legal Entity
+exercising permissions granted by this License.
+
+"Source" form shall mean the preferred form for making modifications,
+including but not limited to software source code, documentation source,
+and configuration files.
+
+"Object" form shall mean any form resulting from mechanical
+transformation or translation of a Source form, including but
+not limited to compiled object code, generated documentation,
+and conversions to other media types.
+
+"Work" shall mean the work of authorship, whether in Source or Object form,
+made available under the License, as indicated by a copyright notice
+that is included in or attached to the work (an example is provided
+in the Appendix below).
+
+"Derivative Works" shall mean any work, whether in Source or Object form,
+that is based on (or derived from) the Work and for which the editorial
+revisions, annotations, elaborations, or other modifications represent,
+as a whole, an original work of authorship. For the purposes of this License,
+Derivative Works shall not include works that remain separable from,
+or merely link (or bind by name) to the interfaces of, the Work and
+Derivative Works thereof.
+
+"Contribution" shall mean any work of authorship, including the original
+version of the Work and any modifications or additions to that Work or
+Derivative Works thereof, that is intentionally submitted to Licensor
+for inclusion in the Work by the copyright owner or by an individual or
+Legal Entity authorized to submit on behalf of the copyright owner.
+For the purposes of this definition, "submitted" means any form of
+electronic, verbal, or written communication sent to the Licensor or
+its representatives, including but not limited to communication on
+electronic mailing lists, source code control systems, and issue
+tracking systems that are managed by, or on behalf of, the Licensor
+for the purpose of discussing and improving the Work, but excluding
+communication that is conspicuously marked or otherwise designated
+in writing by the copyright owner as "Not a Contribution."
+
+"Contributor" shall mean Licensor and any individual or Legal Entity
+on behalf of whom a Contribution has been received by Licensor and
+subsequently incorporated within the Work.
+
+"Tizen Certified Platform" shall mean a software platform that complies
+with the standards set forth in the Tizen Compliance Specification
+and passes the Tizen Compliance Tests as defined from time to time
+by the Tizen Technical Steering Group and certified by the Tizen
+Association or its designated agent.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+this License, each Contributor hereby grants to You a perpetual,
+worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+copyright license to reproduce, prepare Derivative Works of,
+publicly display, publicly perform, sublicense, and distribute the
+Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+this License, each Contributor hereby grants to You a perpetual,
+worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+(except as stated in this section) patent license to make, have made,
+use, offer to sell, sell, import, and otherwise transfer the Work
+solely as incorporated into a Tizen Certified Platform, where such
+license applies only to those patent claims licensable by such
+Contributor that are necessarily infringed by their Contribution(s)
+alone or by combination of their Contribution(s) with the Work solely
+as incorporated into a Tizen Certified Platform to which such
+Contribution(s) was submitted. If You institute patent litigation
+against any entity (including a cross-claim or counterclaim
+in a lawsuit) alleging that the Work or a Contribution incorporated
+within the Work constitutes direct or contributory patent infringement,
+then any patent licenses granted to You under this License for that
+Work shall terminate as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+Work or Derivative Works thereof pursuant to the copyright license
+above, in any medium, with or without modifications, and in Source or
+Object form, provided that You meet the following conditions:
+
+ 1. You must give any other recipients of the Work or Derivative Works
+ a copy of this License; and
+ 2. You must cause any modified files to carry prominent notices stating
+ that You changed the files; and
+ 3. You must retain, in the Source form of any Derivative Works that
+ You distribute, all copyright, patent, trademark, and attribution
+ notices from the Source form of the Work, excluding those notices
+ that do not pertain to any part of the Derivative Works; and
+ 4. If the Work includes a "NOTICE" text file as part of its distribution,
+ then any Derivative Works that You distribute must include a readable
+ copy of the attribution notices contained within such NOTICE file,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works, in at least one of the following places:
+ within a NOTICE text file distributed as part of the Derivative Works;
+ within the Source form or documentation, if provided along with the
+ Derivative Works; or, within a display generated by the Derivative Works,
+ if and wherever such third-party notices normally appear.
+ The contents of the NOTICE file are for informational purposes only
+ and do not modify the License. You may add Your own attribution notices
+ within Derivative Works that You distribute, alongside or as an addendum
+ to the NOTICE text from the Work, provided that such additional attribution
+ notices cannot be construed as modifying the License. You may add Your own
+ copyright statement to Your modifications and may provide additional or
+ different license terms and conditions for use, reproduction, or
+ distribution of Your modifications, or for any such Derivative Works
+ as a whole, provided Your use, reproduction, and distribution of
+ the Work otherwise complies with the conditions stated in this License
+ and your own copyright statement or terms and conditions do not conflict
+ the conditions stated in the License including section 3.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+any Contribution intentionally submitted for inclusion in the Work
+by You to the Licensor shall be under the terms and conditions of
+this License, without any additional terms or conditions.
+Notwithstanding the above, nothing herein shall supersede or modify
+the terms of any separate license agreement you may have executed
+with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+names, trademarks, service marks, or product names of the Licensor,
+except as required for reasonable and customary use in describing the
+origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+agreed to in writing, Licensor provides the Work (and each
+Contributor provides its Contributions) on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+implied, including, without limitation, any warranties or conditions
+of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+PARTICULAR PURPOSE. You are solely responsible for determining the
+appropriateness of using or redistributing the Work and assume any
+risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+whether in tort (including negligence), contract, or otherwise,
+unless required by applicable law (such as deliberate and grossly
+negligent acts) or agreed to in writing, shall any Contributor be
+liable to You for damages, including any direct, indirect, special,
+incidental, or consequential damages of any character arising as a
+result of this License or out of the use or inability to use the
+Work (including but not limited to damages for loss of goodwill,
+work stoppage, computer failure or malfunction, or any and all
+other commercial damages or losses), even if such Contributor
+has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+the Work or Derivative Works thereof, You may choose to offer,
+and charge a fee for, acceptance of support, warranty, indemnity,
+or other liability obligations and/or rights consistent with this
+License. However, in accepting such obligations, You may act only
+on Your own behalf and on Your sole responsibility, not on behalf
+of any other Contributor, and only if You agree to indemnify,
+defend, and hold each Contributor harmless for any liability
+incurred by, or claims asserted against, such Contributor by reason
+of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Flora License to your work
+
+To apply the Flora License to your work, attach the following
+boilerplate notice, with the fields enclosed by brackets "[]"
+replaced with your own identifying information. (Don't include
+the brackets!) The text should be enclosed in the appropriate
+comment syntax for the file format. We also recommend that a
+file or class name and description of purpose be included on the
+same "printed page" as the copyright notice for easier
+identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Flora License, Version 1.1 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://floralicense.org/license/
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
--- /dev/null
+Copyright (c) 2012 Samsung Electronics Co., Ltd. All rights reserved.\r
+Except as noted, this software is licensed under Flora License, Version 1.1.\r
+Please, see the LICENSE.Flora file for Flora License, Version 1.1 terms and conditions.\r
+\r
--- /dev/null
+/*\r
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd\r
+ *\r
+ * Licensed under the Flora License, Version 1.1 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://floralicense.org/license/\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+#ifndef _GL_DATA_TYPE_H_\r
+#define _GL_DATA_TYPE_H_\r
+\r
+#include <stdlib.h>\r
+#include <media_content_type.h>\r
+#include <media_filter.h>\r
+#include <media_image.h>\r
+#include <media_video.h>\r
+#include <media_tag.h>\r
+#include <media_folder.h>\r
+#include <media_info.h>\r
+#include <eina_list.h>\r
+\r
+#ifdef _cplusplus\r
+extern "C"\r
+{\r
+#endif\r
+\r
+\r
+#define GL_FREEIF(ptr) \\r
+ do { \\r
+ if(ptr != NULL) \\r
+ { \\r
+ free(ptr); \\r
+ ptr = NULL; \\r
+ } \\r
+ } while (0)\r
+\r
+#define GL_FREE(ptr) \\r
+ do { \\r
+ free(ptr); \\r
+ ptr = NULL; \\r
+ } while (0)\r
+\r
+#define GL_TYPE_ALBUM (0x55551)\r
+#define GL_TYPE_TAG (0x55552)\r
+#define GL_TYPE_MEDIA (0x55553)\r
+\r
+typedef enum {\r
+ GL_STORE_T_PHONE = 0, /**< Stored only in phone */\r
+ GL_STORE_T_MMC, /**< Stored only in MMC */\r
+ GL_STORE_T_ALL, /**< Stored only in All albums album */\r
+} gl_store_type_e;\r
+\r
+\r
+typedef struct _gl_album_t gl_album_s;\r
+typedef struct _gl_media_t gl_media_s;\r
+typedef struct _gl_image_t gl_image_s;\r
+typedef struct _gl_video_t gl_video_s;\r
+typedef struct _gl_tag_t gl_tag_s;\r
+\r
+struct _gl_album_t {\r
+ int gtype; /*self-defination type, when free this struct space, use it*/\r
+ media_folder_h folder_h; /*the handle of operating this folder*/\r
+ char *uuid; /*folder UUID*/\r
+ char *display_name; /*album name*/\r
+ char *path; /*the full path of this folder*/\r
+ int type; /*storage type*/\r
+ time_t mtime; /*modified time*/\r
+ int count; /*the media count in this folder*/\r
+ void *_reserved; /*reserved*/\r
+};\r
+\r
+struct _gl_media_t {\r
+ int gtype; /*self-defination type, when free this struct space, use it*/\r
+ media_info_h media_h; /*the handle of operating this media*/\r
+ char *uuid; /*meida id*/\r
+ int type; /*meida type, image or video*/\r
+ char *thumb_url; /*the thumbnail full path of this meida file*/\r
+ char *file_url; /*the full path of this meida file*/\r
+ time_t mtime; /*modified time*/\r
+ char *album_uuid; /*folder UUID*/\r
+ char *display_name; /*item name*/\r
+ bool favorite; /*favorite level*/\r
+\r
+ char *ext;\r
+\r
+ union {\r
+ gl_image_s *image_info; /*image information*/\r
+ gl_video_s *video_info; /*video information*/\r
+ };\r
+\r
+ void *_reserved; /*reserved*/\r
+};\r
+\r
+struct _gl_image_t {\r
+ char *media_uuid; /*media uuid*/\r
+ image_meta_h image_h; /*the handle of operating this image*/\r
+ int orientation; /*the orientation of this image*/\r
+\r
+ void *_reserved; /*reserved*/\r
+};\r
+\r
+struct _gl_video_t {\r
+ char *media_uuid; /*media uuid*/\r
+ video_meta_h video_h; /*the handle of operating this video*/\r
+ char *title; /*the title of video*/\r
+ time_t last_played_pos; /*the last played position*/\r
+ int duration; /*the duration of this video*/\r
+ int bookmarks; /*whether exist bookmarks*/\r
+\r
+ void *_reserved; /*reserved*/\r
+};\r
+\r
+struct _gl_tag_t {\r
+ int gtype; /*self-defination type, when free this struct space, use it*/\r
+ media_tag_h tag_h; /*the handle of operating this tag */\r
+ int _id; /*tag id */\r
+ char *tag_name; /*tag name */\r
+ int count; /*the media count included into this tag*/\r
+\r
+ void *_reserved; /*reserved*/\r
+};\r
+\r
+int _gl_data_type_new_tag(gl_tag_s **t_item);\r
+int _gl_data_type_new_album(gl_album_s **album);\r
+\r
+int _gl_data_type_free_tag_list(Eina_List **list);\r
+int _gl_data_type_free_glitem(void **item);\r
+\r
+#ifdef _cplusplus\r
+}\r
+#endif\r
+\r
+\r
+#endif /* _GL_DATA_TYPE_H_ */\r
+\r
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _GL_DATA_UTIL_H_
+#define _GL_DATA_UTIL_H_
+
+#include <eina_list.h>
+#include <glib.h>
+#include <Elementary.h>
+#include "gl-data.h"
+
+#ifdef _cplusplus
+extern "C"
+{
+#endif
+
+bool _gl_data_util_get_file_dir_name(const char *file_path, char *filename,
+ char *dir_name, char *dir_path);
+gl_item *_gl_data_util_calloc_gitem(void);
+int _gl_data_util_free_gitem(gl_item *gitem);
+gl_cluster *_gl_data_util_calloc_gcluster(void);
+int _gl_data_util_free_gcluster(gl_cluster *gcluster);
+gl_cluster *_gl_data_util_new_gcluster_all(void *data, int count);
+gl_cluster_list *_gl_data_util_calloc_cluster_list(void);
+gl_tag *_gl_data_util_calloc_gtag(void);
+int _gl_data_util_free_gtag(gl_tag *gtag);
+int _gl_data_util_clear_gtype_item_list(Eina_List **elist);
+int _gl_data_util_clear_item_list(Eina_List **elist);
+int _gl_data_util_get_selected_cluster_id_list(void *data,
+ Eina_List **sel_id_list);
+int _gl_data_util_get_selected_item_id_list(void *data,
+ Eina_List **sel_id_list);
+bool _gl_data_util_check_selected_id(Eina_List **sel_id_list, const char *id);
+int _gl_data_util_free_selected_id_list(Eina_List **sel_id_list);
+int _gl_data_util_check_album_selected_files(gl_cluster *album, int *drm_cnt,
+ int *img_cnt, int *sel_cnt);
+int _gl_data_util_check_tag_selected_files(void *data, int *drm_cnt,
+ int *img_cnt, int *sel_cnt);
+int _gl_data_util_free_tag_list(void *data);
+gl_tag *_gl_data_util_get_favor_tag(void *data);
+
+#ifdef _cplusplus
+}
+#endif
+#endif /* _GL_DATA_UTIL_H_ */
+
--- /dev/null
+/*\r
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd\r
+ *\r
+ * Licensed under the Flora License, Version 1.1 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://floralicense.org/license/\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+#ifndef _GL_DATA_H_\r
+#define _GL_DATA_H_\r
+\r
+#include <eina_list.h>\r
+#include <glib.h>\r
+#include <Elementary.h>\r
+#include "gl-local-data.h"\r
+\r
+#ifdef _cplusplus\r
+extern "C"\r
+{\r
+#endif\r
+\r
+/* Specified ID for customed items, which don't exist in DB */\r
+#define GL_TAG_FAVORITES_ID 0\r
+#define GL_ALBUM_ALL_ID "GALLERY_ALBUM_ALL_ALBUMS_ID"\r
+\r
+#define GL_MAX_BYTES_FOR_CHAR 3\r
+#define GL_FILE_PATH_LEN_MAX (4095 * GL_MAX_BYTES_FOR_CHAR + 1)\r
+#define GL_FILE_NAME_LEN_MAX (255 * GL_MAX_BYTES_FOR_CHAR + 1)\r
+#define GL_DIR_PATH_LEN_MAX GL_FILE_PATH_LEN_MAX\r
+#define GL_ARRAY_LEN_MAX 256\r
+#define GL_FILE_EXT_LEN_MAX 256\r
+#define GL_FIRST_VIEW_START_POS 0\r
+#define GL_FIRST_VIEW_END_POS 47 //27 /*maybe 2 pages(=48 medias) is better, especially select album then drag up immediately */\r
+#define GL_GET_UNTIL_LAST_RECORD 65536 //-1 /* Fixme: Do not use 65536. */\r
+#define GL_GET_ALL_RECORDS -1\r
+#define GL_GET_ONE_RECORDS 1\r
+#define GL_GET_ALL_RECORDS_ID NULL\r
+#define GL_JPEG_FILE_EXT "jpg"\r
+\r
+typedef enum\r
+{\r
+ GL_CATEGORY_NONE,\r
+ GL_CATEGORY_FOLDER,\r
+ GL_CATEGORY_FAVORITES,\r
+ GL_CATEGORY_MAX\r
+} gl_cate_type;\r
+\r
+typedef enum{\r
+ GL_SORT_BY_NONE, /**< No Sort */\r
+ GL_SORT_BY_NAME_DESC, /**< Sort by display name descending */\r
+ GL_SORT_BY_NAME_ASC, /**< Sort by display name ascending */\r
+ GL_SORT_BY_DATE_DESC, /**< Sort by modified_date descending */\r
+ GL_SORT_BY_DATE_ASC, /**< Sort by modified_date ascending */\r
+} gl_sort_type_e;\r
+\r
+typedef struct\r
+{\r
+ gl_album_s *cluster;\r
+ int index;\r
+ Elm_Object_Item *item;\r
+ bool checked;\r
+\r
+ void *ad; /* Save ad to prevent use global variable */\r
+ void *_reserved;\r
+} gl_cluster;\r
+\r
+typedef struct\r
+{\r
+ Eina_List *clist;\r
+ /* Editable albums count */\r
+ int edit_cnt;\r
+} gl_cluster_list;\r
+\r
+typedef enum\r
+{\r
+ GL_ICON_NORMAL,\r
+ GL_ICON_EXPIRED_DRM,\r
+ GL_ICON_CORRUPTED_FILE\r
+}gl_icon_type;\r
+\r
+typedef struct _gl_item\r
+{\r
+ gl_media_s *item;\r
+ Elm_Object_Item *elm_item;\r
+ Evas_Object *check_obj;\r
+ bool checked;\r
+ int sequence;\r
+ int store_type;\r
+ void *ad; /* Save ad to prevent use global variable */\r
+ void *_reserved;\r
+} gl_item;\r
+\r
+typedef struct\r
+{\r
+ gl_tag_s *tag;\r
+ Elm_Object_Item *item;\r
+ Evas_Object *check_obj;\r
+ bool checked;\r
+ bool cover_set;\r
+ void *ad; /* Save ad to prevent use global variable */\r
+ void *_reserved;\r
+} gl_tag;\r
+\r
+bool _gl_data_get_cluster_list(void *data);\r
+int _gl_data_update_cluster_list(void *data);\r
+int _gl_data_get_cluster_by_id(void *data, const char *cluster_id,\r
+ gl_cluster **cluster);\r
+int _gl_data_get_cluster_by_path(void *data, const char *path,\r
+ gl_cluster **cluster);\r
+int _gl_data_get_item_cnt(void *data, const char *cluster_id, bool b_favor,\r
+ int album_type, int *item_cnt);\r
+int _gl_data_update_item_cnt(gl_cluster *album);\r
+int _gl_data_update_item_list(void *data);\r
+int _gl_data_get_item_list(void *data, gl_cate_type mode, gl_cluster *album,\r
+ int start_pos, int end_pos);\r
+bool _gl_data_is_item_cnt_zero(void *data, media_content_type_e type);\r
+int _gl_data_get_first_item(void *data, media_content_type_e type,\r
+ gl_item **fitem, bool b_selected);\r
+int _gl_data_clear_default_item_list(void *data);\r
+int _gl_data_get_item_list_without_tag(void *data, gl_cluster *album,\r
+ const char *tag_name, int start_pos,\r
+ int end_pos);\r
+int _gl_data_update_item_list_without_tag(void *data, gl_cluster *album,\r
+ const char *tag_name);\r
+int _gl_data_get_first_several_favor_items(void *data, gl_item *items[],\r
+ int *item_count,\r
+ media_content_order_e sort_type);\r
+int _gl_data_get_first_several_items(gl_cluster *album, gl_item *items[],\r
+ int *item_count,\r
+ media_content_order_e sort_type);\r
+int _gl_data_destroy_item(gl_item *gitem);\r
+int _gl_data_get_item_by_index(void *data, int idx, bool select_mode,\r
+ gl_item **gitem);\r
+int _gl_data_get_orig_item_by_index(void *data, gl_item **gitem, int idx);\r
+int _gl_data_item_list_remove(void *data, gl_item *gitem);\r
+int _gl_data_remove_item(gl_item * gitem);\r
+int _gl_data_selected_list_append(void *data, gl_item *gitem);\r
+int _gl_data_selected_list_remove(void *data, gl_item *gitem);\r
+gl_item *_gl_data_selected_list_get_nth(void *data, int idx);\r
+int _gl_data_selected_list_finalize(void *data);\r
+int _gl_data_selected_list_count(void *data);\r
+bool _gl_data_is_albums_selected_empty(void *data);\r
+int _gl_data_get_albums_selected_files_path_str(void *data, gchar sep_c,\r
+ char **path_str, int *sel_cnt);\r
+int _gl_data_get_albums_selected_cnt(void *data);\r
+int _gl_data_albums_selected_list_append(void *data, gl_cluster *item);\r
+int _gl_data_albums_selected_list_remove(void *data, gl_cluster *item);\r
+int _gl_data_finalize_albums_selected_list(void *data);\r
+bool _gl_data_check_update(void *data, bool b_all);\r
+int _gl_data_init();\r
+int _gl_data_finalize(void *data);\r
+gl_cluster *_gl_data_new_cluster(void);\r
+bool _gl_data_is_root_path(const char *path);\r
+bool _gl_data_is_default_album(const char *match_folder, gl_album_s *album);\r
+int _gl_data_get_tag_by_index(void *data, gl_tag **tag, int idx);\r
+int _gl_data_get_first_several_tag_items(void *data, unsigned tag_id,\r
+ gl_item *items[], int *item_count);\r
+bool _gl_data_is_in_tag_list(void *data, const char *tagname);\r
+int _gl_data_get_tag_count_all(void *data);\r
+int _gl_data_get_tag_list(void *data, Eina_List **elist);\r
+int _gl_data_update_tag_list(void *data, Eina_List **elist);\r
+int _gl_data_tags_list_remove(void *data, gl_tag *gtag);\r
+int _gl_data_get_tag_by_id(void *data, int tag_id, gl_tag **gtag);\r
+int _gl_data_get_item_list_tagname(void *data, unsigned int tag_id,\r
+ bool with_meta, Eina_List ** elist);\r
+int _gl_data_tags_selected_list_append(void *data, gl_tag *gtag);\r
+int _gl_data_tags_selected_list_remove(void *data, gl_tag *gtag);\r
+int _gl_data_finalize_tags_selected_list(void *data);\r
+int _gl_data_get_tags_selected_cnt(void *data);\r
+bool _gl_data_is_tags_selected_empty(void *data);\r
+int _gl_data_get_tags_selected_files_path_str(void *data, gchar sep_c,\r
+ char **path_str, int *sel_cnt);\r
+int _gl_data_delete_media(void *data, gl_media_s *media_item);\r
+int _gl_data_create_thumb(gl_item *gitem, media_thumbnail_completed_cb callback,\r
+ void *user_data);\r
+\r
+#ifdef _cplusplus\r
+}\r
+#endif\r
+#endif /* _GL_DATA_H_ */\r
--- /dev/null
+/*\r
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd\r
+ *\r
+ * Licensed under the Flora License, Version 1.1 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://floralicense.org/license/\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+#ifndef _GL_LOCAL_DATA_H_\r
+#define _GL_LOCAL_DATA_H_\r
+\r
+#include "gl-data-type.h"\r
+\r
+#ifdef _cplusplus\r
+extern "C"\r
+{\r
+#endif\r
+\r
+\r
+/*MEDIA_TYPE 0-image, 1-video, 2-sound, 3-music*/\r
+#define GL_CONDITION_IMAGE_VIDEO "(MEDIA_TYPE=0 OR MEDIA_TYPE=1)"\r
+#define GL_CONDITION_WITHOUT_TAG "((MEDIA_TYPE=0 OR MEDIA_TYPE=1) AND (media_uuid NOT IN (SELECT media_uuid FROM tag_map WHERE tag_id=%d)))"\r
+#define GL_CONDITION_WITHOUT_FAVOURITE "((MEDIA_TYPE=0 OR MEDIA_TYPE=1) AND (FAVOURITE=0))"\r
+#define GL_CONDITION_IMAGE "(MEDIA_TYPE=0)"\r
+#define GL_CONDITION_VIDEO "(MEDIA_TYPE=1)"\r
+#define GL_CONDITION_TAG_NAME "(TAG_NAME=\'%s\')"\r
+/**< 0-not favourite, 1-favourite*/\r
+#define GL_CONDITION_FAV_IMAGE_VIDEO "((MEDIA_TYPE=0 OR MEDIA_TYPE=1) AND MEDIA_FAVORITE=1)"\r
+#define GL_CONDITION_TAG NULL\r
+\r
+\r
+#define CONDITION_LENGTH 200\r
+#define KEYWORD_LENGTH 20\r
+\r
+typedef struct _gl_filter_t gl_filter_s;\r
+\r
+struct _gl_filter_t {\r
+ char cond[CONDITION_LENGTH]; /*set media type or favorite type, or other query statement*/\r
+ media_content_collation_e collate_type; /*collate type*/\r
+ media_content_order_e sort_type; /*sort type*/\r
+ char sort_keyword[KEYWORD_LENGTH]; /*sort keyword*/\r
+ int offset; /*offset*/\r
+ int count; /*count*/\r
+ bool with_meta; /*whether get image or video info*/\r
+};\r
+\r
+int _gl_local_data_connect(void);\r
+int _gl_local_data_disconnect(void);\r
+int _gl_local_data_get_album_by_path(char *path, gl_album_s **album);\r
+int _gl_local_data_get_album_list(gl_filter_s *condition, Eina_List **elist);\r
+int _gl_local_data_get_media_by_path(const char *path, gl_media_s **mitem);\r
+int _gl_local_data_get_media_count(const char *cluster_id, gl_filter_s *condition,\r
+ int *item_cnt);\r
+int _gl_local_data_get_all_media_count(gl_filter_s *filter, int *item_cnt);\r
+int _gl_local_data_get_album_media_list(gl_filter_s *condition,\r
+ const char *album_id, Eina_List **elist);\r
+int _gl_local_data_get_all_albums_media_list(gl_filter_s *condition,\r
+ Eina_List **elist);\r
+int _gl_local_data_get_album_media_list_without_tag(gl_filter_s *condition,\r
+ const char *album_id,\r
+ const char *tag_name,\r
+ Eina_List **elist);\r
+int _gl_local_data_get_media_count_wichout_tag(int tag_id, char *album_uuid);\r
+int _gl_local_data_get_all_albums_media_list_without_tag(gl_filter_s *condition,\r
+ const char *tag_name,\r
+ Eina_List **elist);\r
+int _gl_local_data_get_tag_list(gl_filter_s *condition, Eina_List **elist);\r
+int _gl_local_data_get_tag_list_by_media_id(gl_filter_s *condition,\r
+ const char *media_id,\r
+ Eina_List **elist);\r
+int _gl_local_data_get_tag_media_count(int tag_id, gl_filter_s *condtion,\r
+ int *item_cnt);\r
+int _gl_local_data_get_tag_media_list(unsigned int tag_id,\r
+ gl_filter_s *condition,\r
+ Eina_List **elist);\r
+int _gl_local_data_add_tag(const char *tagname, const char *media_uuid);\r
+int _gl_local_data_delete_tag(gl_tag_s *tag);\r
+int _gl_local_data_remove_tag(gl_tag_s *tag, const char *media_uuid);\r
+int _gl_local_data_set_favorite(gl_media_s *item, bool favor);\r
+int _gl_local_data_delete_album(const char *album_uuid);\r
+int _gl_local_data_add_media(const char *file_url, media_info_h *info);\r
+int _gl_local_data_get_thumb(gl_media_s *mitem, char **thumb);\r
+int _gl_local_data_move_media(gl_media_s *mitem, const char *dst);\r
+\r
+#ifdef _cplusplus\r
+}\r
+#endif\r
+\r
+\r
+#endif\r
+\r
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _GL_ALBUMS_EDIT_H_
+#define _GL_ALBUMS_EDIT_H_
+
+#include <Elementary.h>
+#include "gallery.h"
+
+int _gl_albums_edit_create_view(void *data);
+int _gl_albums_edit_update_view(void *data);
+int _gl_albums_edit_pop_view(void *data);
+int _gl_albums_edit_share(void *data, const char *label);
+int _gl_albums_edit_update_lang(void *data);
+
+#endif
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _GL_ALBUMS_NEW_H_
+#define _GL_ALBUMS_NEW_H_
+
+#include <Elementary.h>
+#include "gallery.h"
+
+int _gl_albums_new_create_view(void *data);
+int _gl_albums_new_pop_view(void *data);
+int _gl_albums_new_process(void *data, bool b_enter);
+
+#endif
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+#ifndef _GL_ALBUMS_RENAME_H_
+#define _GL_ALBUMS_RENAME_H_
+
+#include <Elementary.h>
+#include "gallery.h"
+
+int _gl_albums_rename_create_view(void *data, gl_cluster *album);
+int _gl_albums_rename_update_view(void *data);
+int _gl_albums_rename_pop_view(void *data);
+int _gl_albums_rename_process(void *data, bool b_enter);
+int _gl_albums_rename_update_lang(void *data);
+
+#endif
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _GL_ALBUMS_SEL_H_
+#define _GL_ALBUMS_SEL_H_
+
+#include <Elementary.h>
+#include "gallery.h"
+
+int _gl_albums_sel_create_view(void *data);
+int _gl_albums_sel_update_view(void *data);
+int _gl_albums_sel_pop_view(void *data);
+int _gl_albums_sel_update_lang(void *data);
+
+#endif
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _GL_ALBUMS_H_
+#define _GL_ALBUMS_H_
+
+#include <Elementary.h>
+#include "gallery.h"
+
+Evas_Object *_gl_albums_add_gengrid(void *data, Evas_Object *parent);
+Evas_Object *gl_albums_create_view(void *data, Evas_Object * parent);
+int gl_albums_update_view(void *data);
+int _gl_albums_create_items(void *data, Evas_Object *parent);
+int gl_albums_sel_album(gl_cluster * album_item);
+int gl_albums_update_items(void *data);
+int gl_albums_comeback_from_view(void *data);
+int gl_albums_change_to_view(void *data);
+int gl_albums_remove_nocontents(void *data);
+int gl_albums_free_cover_thumbs(void *data);
+int gl_albums_free_data(void *data);
+int _gl_albums_reset_view(void *data, const char *uuid, const char *aul_type);
+
+#endif /* _GL_ALBUMS_H_ */
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _GL_TAGS_EDIT_H_
+#define _GL_TAGS_EDIT_H_
+
+#include <Elementary.h>
+#include "gallery.h"
+
+int _gl_tags_edit_create_view(void *data);
+int _gl_tags_edit_pop_view(void *data);
+int _gl_tags_edit_share(void *data, const char *label);
+int _gl_tags_edit_update_lang(void *data);
+
+#endif
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _GL_TAGS_NEW_H_
+#define _GL_TAGS_NEW_H_
+
+#include <Elementary.h>
+#include "gallery.h"
+
+int _gl_tags_new_create_view(void *data);
+int _gl_tags_new_pop_view(void *data);
+int _gl_tags_new_process(void *data, bool b_enter);
+
+#endif
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _GL_TAGS_RENAME_H_
+#define _GL_TAGS_RENAME_H_
+
+#include <Elementary.h>
+#include "gallery.h"
+
+int _gl_tags_rename_create_view(void *data, gl_tag *gtag);
+int _gl_tags_rename_process(void *data);
+
+#endif
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _GL_TAGS_H_
+#define _GL_TAGS_H_
+
+#include <Elementary.h>
+#include "gallery.h"
+
+int _gl_tags_add_btns(void *data);
+int gl_tag_unset_rename(void *data);
+Evas_Object *gl_tag_create_view(void *data, Evas_Object * parent);
+int gl_tag_update_view(void *data);
+int _gl_tag_comeback_from_view(void *data);
+bool _gl_tags_sel_home_tag(void *data, const char *tag_id);
+int _gl_tags_reset_view(void *data, const char *tag_id, const char *aul_type);
+const char *_gl_tags_get_current_tag_name(void *data);
+int _gl_tags_del(void *data);
+int _gl_tags_update_lang(void *data);
+
+#endif /* _GL_TAGS_H_ */
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _GL_THUMB_EDIT_H_
+#define _GL_THUMB_EDIT_H_
+
+#include <Elementary.h>
+#include "gallery.h"
+
+int _gl_thumbs_edit_add_btns(void *data, Evas_Object *parent,
+ Elm_Object_Item *nf_it);
+int _gl_thumbs_edit_create_view(void *data);
+int _gl_thumbs_edit_pop_view(void *data);
+int _gl_thumbs_edit_update_lang(void *data);
+
+#endif
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _GL_THUMB_SEL_H_
+#define _GL_THUMB_SEL_H_
+
+#include <Elementary.h>
+#include "gallery.h"
+
+int _gl_thumbs_sel_create_view(void *data, gl_cluster *album_item);
+int _gl_thumbs_sel_pop_view(void *data);
+int _gl_thumbs_sel_update_lang(void *data);
+
+#endif
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _GL_GRIDVIEW_H_
+#define _GL_GRIDVIEW_H_
+
+#include <Elementary.h>
+#include "gallery.h"
+
+
+typedef enum _gl_thumb_mode {
+ GL_THUMB_ALL,
+ GL_THUMB_IMAGES,
+ GL_THUMB_VIDEOS,
+ GL_THUMB_ALBUMS,
+} gl_thumb_mode;
+
+void _gl_thumbs_mouse_down(void *data, Evas *e, Evas_Object *obj,
+ void *event_info);
+void _gl_thumbs_mouse_up(void *data, Evas *e, Evas_Object *obj,
+ void *event_info);
+Evas_Object *_gl_thumbs_add_grid(void *data, Evas_Object *parent,
+ gl_thumb_mode mode, bool b_use_idler);
+int _gl_thumbs_show_edit_view(void *data);
+int _gl_thumbs_show_view(void *data);
+Eina_Bool _gl_thumbs_update_view(void *data);
+int _gl_thumbs_create_view(void *data, int nf_mode, char *title, bool b_idler,
+ Evas_Smart_Cb func);
+int _gl_thumbs_update_count(void *data, int new_cnt);
+bool _gl_thumbs_get_view(void *data, Evas_Object **view);
+int _gl_thumbs_set_nocontents(void *data, Evas_Object *noc);
+int _gl_thumbs_set_size(void *data, Evas_Object *gridview);
+int _gl_thumbs_clear_cbs(Evas_Object *grid);
+int _gl_thumbs_delete_view(void *data);
+int _gl_thumbs_update_size(void *data, Evas_Object *view);
+int _gl_thumbs_del_append_idler(void *data);
+
+#endif /* _GL_GRIDVIEW_H_ */
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _GALLERY_H_
+#define _GALLERY_H_
+
+#include <Elementary.h>
+#include <Ecore_X.h>
+#include <pthread.h>
+#include <app.h>
+#include <ui-gadget.h>
+#include "gl-data.h"
+#include <haptic.h>
+
+#ifdef _cplusplus
+extern "C"
+{
+#endif
+
+#if !defined(APPDIR)
+# define APPDIR "/usr/apps/org.tizen.gallery"
+#endif
+
+#if !defined(PACKAGE)
+# define PACKAGE "gallery"
+#endif
+
+#if !defined(LOCALEDIR)
+# define LOCALEDIR APPDIR"/res/locale"
+#endif
+
+#if !defined(EDJDIR)
+# define EDJDIR APPDIR"/res/edje"
+#endif
+
+#if !defined(IMAGEDIR)
+# define IMAGEDIR APPDIR"/res/images/"
+#endif
+
+#define PKGNAME_GALLERY "org.tizen.gallery"
+
+/******** EDJ File path ********/
+
+#define GL_EDJ_FILE EDJDIR "/" PACKAGE ".edj"
+
+/******** Groups name ********/
+
+#define GL_GRP_CONTROLBAR "gallery/controlbar"
+#define GL_GRP_CONTROLBAR_LY "gallery/controlbar_layout"
+#define GL_GRP_PHOTOFRAME "photoframe"
+
+/******* Part name ***********/
+
+#define GL_NAVIFRAME_PREV_BTN "prev_btn"
+#define GL_NAVIFRAME_TITLE_PREV_BTN "title_prev_btn"
+#define GL_NAVIFRAME_TITLE_RIGHT_BTN "title_right_btn"
+#define GL_NAVIFRAME_TITLE_BTN1 "title_toolbar_button1"
+
+#define GL_NAVIFRAME_BTN1 "toolbar_button1"
+#define GL_NAVIFRAME_BTN2 "toolbar_button2"
+#define GL_NAVIFRAME_MORE "toolbar_more_btn"
+
+
+#define GL_POPUP_TEXT "title,text"
+#define GL_NOCONTENTS_TEXT "elm.text"
+#define GL_GRID_TEXT "elm.text"
+
+#define GL_IMF_ON "virtualkeypad,state,on"
+#define GL_IMF_OFF "virtualkeypad,state,off"
+
+/******** Style name ********/
+
+#define GL_CLASS_GENGRID "gengrid"
+#define GL_BUTTON_STYLE_RENAME "rename"
+#define GL_BUTTON_STYLE_NAVI_MORE "naviframe/more/default"
+#define GL_BUTTON_STYLE_NAVI_TITLE "naviframe/title/default"
+#define GL_BUTTON_STYLE_NAVI_TITLE_PLUS "naviframe/title/icon/plus"
+/* TMP: use Done to replace Edit */
+#define GL_BUTTON_STYLE_NAVI_TOOLBAR "naviframe/toolbar/default"
+#define GL_BUTTON_STYLE_NAVI_MORE "naviframe/more/default"
+#define GL_BUTTON_STYLE_NAVI_TOOLBAR_LEFT "naviframe/toolbar/left"
+#define GL_BUTTON_STYLE_NAVI_TOOLBAR_RIGHT "naviframe/toolbar/right"
+
+#define GL_BUTTON_STYLE_SWEEP "sweep"
+#define GL_BUTTON_STYLE_SWEEP_DELETE "sweep/delete"
+/* Button object style of previous button of naviframe */
+#define GL_BUTTON_STYLE_NAVI_PRE "naviframe/back_btn/default"
+
+#define GL_CHECKBOX_STYLE_GRID "gallery/grid"
+#define GL_CHECKBOX_STYLE_DEFAULT "gallery/default"
+#define GL_GENLIST_STYLE_DEFAULT GL_CHECKBOX_STYLE_DEFAULT
+
+#define GL_GENLIST_ITEM_STYLE_SWEEP2_TAG "mode/gallery/slide2_tag"
+
+#define GL_NF_ANI_TABBAR "tabbar"
+
+/******** String ********/
+
+#define GL_SEPERATOR_BT '?'
+/* MIME type */
+#define GL_MIME_IMAGE_ALL "image/*"
+#define GL_MIME_VIDEO_ALL "video/*"
+/* For local album */
+#define GL_AUL_ALBUM "album"
+#define GL_AUL_TAG "tag"
+/*From live-gallery opening album tab request*/
+#define GL_ALBUM_UUID_DEFAULT "default"
+
+/******** Numerical value ********/
+
+/* Window width and height */
+#define GL_WIN_WIDTH 720
+#define GL_WIN_HEIGHT 1280
+
+#define GL_ALBUM_COVER_THUMB_NUM 1
+/* Normal albums cover have maximum 4 thumbnails */
+#define GL_ALBUM_COVER_THUMB_NUM_SEC 4
+
+/* Size of thumbnails in gridview */
+#define GL_GRID_ITEM_SIZE_W 178
+#define GL_GRID_ITEM_SIZE_H 193
+/* Thumbnail would be enlarged if medias count is less than 7 */
+#define GL_GRID_ITEM_ZOOM_LEVEL_02 2
+#define GL_GRID_ITEM_ZOOM_LEVEL_02_CNT 6
+
+/* String length of mtye item id */
+#define GL_MTYPE_ITEN_ID_LEN_MAX 37
+
+/* String length of album name */
+#define GL_ALBUM_NAME_LEN_MAX GL_FILE_NAME_LEN_MAX
+
+#define GL_DATE_INFO_LEN_MAX 256
+#define GL_POPUP_DESC_LEN_MAX 256
+#define GL_EXT_STR_COUNT_LEN 20
+
+/* Maximum number of entry string, 255 Chars of album name (linux system) */
+#define GL_ENTRY_STR_CHAR_MAX 255
+/* Maximum length of entry string, 255 Bytes of tag name */
+#define GL_ENTRY_STR_LEN_MAX (GL_ARRAY_LEN_MAX - 1)
+
+/* 1s=1000ms */
+#define GL_TIME_MSEC_PER_SEC 1000
+/*1s = 1000000us*/
+#define GL_TIME_USEC_PER_SEC 1000000L
+/* 1ms=1000us */
+#define GL_TIME_USEC_PER_MSEC 1000
+/* 1min=60s */
+#define GL_TIME_SEC_PER_MIN 60
+/* 1h=60min */
+#define GL_TIME_MIN_PER_HOUR 60
+/* 1h=(60x60)s */
+#define GL_TIME_SEC_PER_HOUR (GL_TIME_MIN_PER_HOUR * GL_TIME_SEC_PER_MIN)
+
+/* itoa length max ----> 1(sign) + 10(2^31) + 1(NULL) */
+#define GL_INTERGER_LEN_MAX 12
+
+#define GL_ERROR_BUF_LEN 1024
+
+/* File system related String definition */
+#define GL_ROOT_PATH_PHONE "/opt/usr/media"
+#define GL_ROOT_PATH_MMC "/opt/storage/sdcard"
+#define GL_DEFAULT_PATH_IMAGES "/Images and videos"
+#define GL_DATA_FOLDER_PATH "/opt/usr/apps/"PKGNAME_GALLERY"/data"
+
+#define GL_NAVIFRAME_OBJ_DATA_KEY "gl_naviframe_data_key"
+
+/******** Enumeration ********/
+
+typedef enum _gl_aul_launch_type
+{
+ GL_AUL_T_NONE,
+ GL_AUL_T_SELECT_ONE,
+ GL_AUL_T_SELECT_MULTIPLE,
+ GL_AUL_T_SELECT_SETAS,
+ GL_AUL_T_SELECT_ALBUM,
+ GL_AUL_T_VIEW_ALBUM,
+} gl_aul_launch_type;
+
+typedef enum {
+ GL_AUL_SETAS_T_NONE,
+ GL_AUL_SETAS_T_WALLPAPER,
+ GL_AUL_SETAS_T_CROP_WALLPAPER,
+ GL_AUL_SETAS_T_CALLER_ID,
+} gl_aul_setas_type;
+
+typedef enum _gl_aul_file_type
+{
+ GL_AUL_FILE_T_NONE,
+ GL_AUL_FILE_T_IMAGE,
+ GL_AUL_FILE_T_VIDEO,
+ GL_AUL_FILE_T_ALL,
+} gl_aul_file_type;
+
+typedef enum _gl_view_mode
+{
+ GL_VIEW_NONE,
+ GL_VIEW_ALBUMS,
+ GL_VIEW_ALBUMS_EDIT,
+ GL_VIEW_ALBUMS_RENAME,
+ GL_VIEW_ALBUMS_SELECT,
+ GL_VIEW_TAGS,
+ GL_VIEW_TAGS_EDIT,
+ GL_VIEW_THUMBS,
+ GL_VIEW_THUMBS_EDIT,
+ GL_VIEW_THUMBS_SELECT,
+} gl_view_mode;
+
+typedef enum _gl_app_exit_mode
+{
+ GL_APP_EXIT_NONE,
+ GL_APP_EXIT_MASS_STORAGE,
+} gl_app_exit_mode;
+
+typedef enum _gl_entry_mode
+{
+ GL_ENTRY_NONE,
+ GL_ENTRY_NEW_ALBUM,
+ GL_ENTRY_RENAME_ALBUM,
+ GL_ENTRY_NEW_TAG,
+ GL_ENTRY_RENAME_TAG,
+} gl_entry_mode;
+
+/* Grid view created for different thumbnails view types */
+typedef enum _gl_gird_t gl_grid_t_e;
+enum _gl_gird_t {
+ GL_GRID_T_NONE,
+ GL_GRID_T_LOCAL,
+ GL_GRID_T_ALLALBUMS,
+ GL_GRID_T_TAGS,
+};
+
+/******** Structure ********/
+
+typedef struct
+{
+ Evas_Object *ctrlbar_ly;
+ Evas_Object *ctrlbar_edit_view;
+ Evas_Object *ctrlbar_edit_ly;
+ Evas_Object *ctrlbar;
+ /* Layout of albums view/tags view */
+ Evas_Object *ctrlbar_view_ly;
+ /* Naviframe item pushed to stack */
+ Elm_Object_Item *nf_it;
+ Elm_Object_Item *nf_it_edit;
+ int tab_mode; /* State of controlbar item: Albums, Tags */
+ int rotate_mode; /* Save rotation mode of normal view */
+} gl_ctrl_info;
+
+typedef struct
+{
+ Elm_Genlist_Item_Class taglic; /* Genlist item class of tags list view */
+ /* Genlist item class of tags list view for sweep */
+ Elm_Genlist_Item_Class sweeplic;
+ Evas_Object *tags_view; /* Tags view object */
+ Evas_Object *conformant;
+ /* Edit item state */
+ bool b_edit_disable;
+ Elm_Object_Item *rename_item; /* Save genlist item in rename mode */
+ Eina_List *tags_elist; /* List of all tags */
+ Eina_List *selected_tags_elist; /* List of all selected tags */
+ int tags_cnt; /* Media items count append to listview */
+ gl_tag *current_tag; /* 1. Select tag to show medias */
+ /* 2. Select tag for rename */
+
+ /* Tag_name of selected tag or newly created one */
+ char new_tag_name[GL_ALBUM_NAME_LEN_MAX];
+ /*True: it's favourites tag */
+ bool b_favor_tag;
+} gl_tag_info;
+
+typedef struct
+{
+ Evas_Coord x;
+ Evas_Coord y;
+ bool b_pressed;
+} gl_grid_touch_info;
+
+typedef struct
+{
+ Elm_Gengrid_Item_Class thumbgic; /* Gengrid item class of thumbnails view */
+ Evas_Object *navi_content_edit_view;
+ Evas_Object *navi_content_edit_ly;
+ Evas_Object *navi_content_ly;
+ /* Thumbnail selection view for Add tag to photo */
+ Evas_Object *select_view;
+ Evas_Object *select_view_ly;
+ Evas_Object *all_grid_view;
+ Evas_Object *all_grid_nocontents;
+ bool b_slideshow_disable;
+ Evas_Object *slideshow_btn;
+ /* Edit */
+ Evas_Object *edit_btn;
+ /* Naviframe item pushed to stack */
+ Elm_Object_Item *nf_it;
+ Elm_Object_Item *nf_it_edit;
+ Elm_Object_Item *nf_it_select;
+ gl_grid_touch_info grid_touch_info; /* Added for shrink effect while select thumbnail */
+ /* It's thumbnails icon size, not grid item size */
+ int icon_size;
+ Ecore_Idler *grid_append_idler; /* Use idler to append other medias to gridview */
+ /* if album contains more than (GL_FIRST_VIEW_END_POS+1) medias */
+ /* 1. Indicate view mode(All/Images/Videos) of thumbnails view */
+ /* 2. Set types for creating nocontents view */
+ int view_mode;
+ int thumbs_cnt; /* Media items count appended to gridview */
+ int updated_thumbs_cnt; /* Media items count appended to gridview while refreshing */
+ bool back_to_normal; /* When back from edit mode, reset checkbox state */
+
+ gl_grid_t_e grid_type;
+} gl_grid_info;
+
+typedef struct
+{
+ bool app_called_by_me; /* Indicates if any application invoked by Gallery */
+ ui_gadget_h ug_called_by_me;
+ int ug_type;
+ int iv_type;
+ void *ug_login_data;
+ int sort_type; /* Types: wminfo_media_sort_type; pass it to imageviewer */
+ ui_gadget_h gallery_ug_called_by_me; /* The gallery-ug called by Gallery for appcontrol */
+} gl_ug_info;
+
+typedef struct
+{
+ Elm_Gengrid_Item_Class albumgic; /* Gengrid item class of albums view */
+ Evas_Object *albums_view; /* Albums view object */
+ Evas_Object *albums_nocontents; /* Nocontents object */
+ /* Albums view object for Add tag to photo */
+ Evas_Object *select_view;
+ /* Albums view layout object for Add tag to photo */
+ Evas_Object *select_view_ly;
+
+ /* Edit item state */
+ bool b_edit_disable;
+ gl_item *cover_thumbs[GL_ALBUM_COVER_THUMB_NUM]; /* Media items of album cover */
+ gl_cluster *current_album; /* Album selected for showing thumbnails view/list view */
+ /* Album selected for rename/open locked album */
+ gl_cluster *selected_album;
+ /* Save destination album id while move/save */
+ char *path;
+ char new_album_name[GL_ALBUM_NAME_LEN_MAX];
+ Eina_List *selected_albums_elist; /* List of all selected albums */
+ gl_cluster_list *cluster_list; /* List of all albums */
+ int albums_cnt; /* Albums count appended to gridview */
+ int album_medias_cnt; /* Media items count of a album, it is showed in album cover */
+ bool update_albums_list; /* Flag indicate to update albums list when back to normal view. */
+ /* 1. MMC Inserted/Removed in thumbnails edit mode; */
+ char dest_folder[GL_DIR_PATH_LEN_MAX]; /* The full path of destination album of movement */
+ bool move_new_album; /* True: move medias to album newly created, */
+ /* False: move to album already created */
+ /* Variables below are related to gallery launching */
+ service_h recv_service; /* The service received when app_reset */
+ bool gallery_launched;
+ /* Launching from shotcut(album added to home) */
+ bool aul_launch_by_mime;
+ int aul_launch_type;
+ int aul_file_type;
+ int aul_setas_type;
+ bool b_show_drm;
+ char *aul_id;
+ char *aul_type;
+ char* aul_homescreen_path;
+ char* aul_lockscreen_path;
+ char* aul_callid_size;
+ char* aul_callid_path;
+
+ Ecore_Idler *create_albums_idler; /* Use idler to append albums to albums view */
+ /* Use idler to activate window when launching Gallery UG */
+ Ecore_Idler *activate_win_idler;
+ Elm_Object_Item *nf_it_select;
+} gl_album_info;
+
+typedef struct
+{
+ Evas_Object *editfield;
+ Evas_Object *imf_entry;
+ Ecore_IMF_Context *imf_context;
+
+ /* Type: gl_entry_mode; Indicate usage of entry */
+ int entry_mode;
+ /* Button 'Done' in new album/tag view */
+ Evas_Object *done_btn;
+ Elm_Object_Item *nf_it;
+ /* Handle for play vibration */
+ int haptic_handle;
+ /* Timer for closing vibration */
+ Ecore_Timer *vibration_timer;
+ haptic_device_h *device_handle;
+ haptic_effect_h *effect_handle;
+} gl_entry_info;
+
+typedef struct
+{
+ Elm_Genlist_Item_Class popuplit; /* Genlist item class of list view in popupinfo.popup */
+ Evas_Object *popup;
+ int popup_mode;
+ /* Selectioninfo popup layout */
+ Evas_Object *selinfo_ly;
+ Ecore_Timer *del_timer;
+} gl_popup_info;
+
+typedef struct {
+ Eina_List *medias_elist; /* List of all selected medias of a album/tag/marker */
+ int images_cnt; /* Images count selected */
+ int drms_cnt; /* DRM files count selected */
+ int jpeg_cnt; /* JEPG files count selected */
+ /* All media count */
+ int sel_cnt;
+ /* Timer for adding frequency when clicking select-all */
+ Ecore_Timer *selall_timer;
+ /* Checkbox state of select-all */
+ Eina_Bool ck_state;
+} gl_selected_info;
+
+typedef struct {
+ Evas_Object *pbar_popup;
+ Evas_Object *pbar;
+ Evas_Object *status_label;
+ /**
+ * After progressbar showed completely, use timer to
+ * emit next signal to write pipe to continue to operate medias.
+ */
+ Ecore_Timer *start_thread_timer;
+ /**
+ * After thread operation done, use idler to
+ * delete progressbar after it's showed completely(status is 100%).
+ */
+ Ecore_Idler *del_pbar_idler;
+ Ecore_Pipe *sync_pipe; /* Pipe for communication between main and child thread */
+ pthread_mutex_t pbar_lock; /* Lock for state of 'Cancel' button */
+ pthread_mutex_t refresh_lock; /* Lock for progressbar refreshing */
+ pthread_cond_t refresh_cond; /* Condition for progressbar refreshing */
+ int refresh_flag; /* Indicates progressbar updated or not while moving or deleting */
+ int pbar_cancel; /* State of 'Cancel' button on progressbar popup */
+ /* Medias count already operated */
+ int finished_cnt;
+} gl_pbar_info;
+
+typedef struct
+{
+ Evas_Object *win;
+ double win_scale;
+ Evas_Object *main_layout;
+ Evas_Object *naviframe;
+ Evas_Object *bg;
+ Evas_Object *ctxpopup;
+ int rotate_mode; /* Type: appcore_rm; Indicate rotation mode of whole application */
+ int view_mode; /* Type: gl_view_mode; Indicate view mode of whole application */
+ bool reentrant;
+ /* Mouse down event handle */
+ Ecore_Event_Handler *keydown_handler;
+ /* Font type change event handle */
+ Ecore_Event_Handler *font_handler;
+ int all_medias_cnt;
+ time_t last_mtime;
+ Eina_List *medias_elist; /* List of all medias of a album/tag/marker */
+ int medias_cnt; /* Count of all medias of a album/tag/marker */
+ int medias_op_type; /* Type: Move or Delete medias */
+ int mmc_state; /* MMC state(Inserted, Removed) */
+ Ecore_Job *rename_album_job;
+ bool home_key;
+} gl_main_info;
+
+struct _gl_appdata
+{
+ gl_main_info maininfo;
+ gl_ctrl_info ctrlinfo; /* Global variables about controlbar */
+ gl_album_info albuminfo; /* Global variables about albums view */
+ gl_tag_info taginfo; /* Global variables about tags view */
+ gl_grid_info gridinfo; /* Global variables about thumbnails view */
+ gl_entry_info entryinfo; /* Global variables about entry */
+ gl_popup_info popupinfo; /* Global variables about popup */
+ gl_pbar_info pbarinfo; /* Global variables about progressbar */
+ gl_ug_info uginfo; /* Global variables about ug */
+ gl_selected_info selectedinfo; /* Global variables about files selected */
+};
+
+typedef struct _gl_appdata gl_appdata;
+
+int gallery_reset_app(void *data);
+
+#ifdef _cplusplus
+}
+#endif
+
+#endif /* _GALLERY_H_ */
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _GL_DEBUG_H_
+#define _GL_DEBUG_H_
+
+#include <dlog.h>
+#include <assert.h>
+#include <stdio.h>
+
+#ifdef _cplusplus
+extern "C"
+{
+#endif
+
+#ifdef LOG_TAG
+#undef LOG_TAG
+#endif
+
+
+#define LOG_TAG "GALLERY"
+#define LOG_TAG_LAUNCH "GALLERY_LAUNCH"
+
+/* anci c color type */
+#define FONT_COLOR_RESET "\033[0m"
+#define FONT_COLOR_RED "\033[31m"
+#define FONT_COLOR_GREEN "\033[32m"
+#define FONT_COLOR_YELLOW "\033[33m"
+#define FONT_COLOR_BLUE "\033[34m"
+#define FONT_COLOR_PURPLE "\033[35m"
+#define FONT_COLOR_CYAN "\033[36m"
+#define FONT_COLOR_GRAY "\033[37m"
+
+#ifdef _USE_LOG_FILE_
+FILE *g_log_fp;
+#endif // _USE_LOG_FILE_
+
+#ifdef _USE_LOG_FILE_
+
+#define gl_dbg(fmt,arg...) fprintf(g_log_fp, "[%s: %d]" fmt "\n", __FUNCTION__, __LINE__, ##arg)
+
+#elif defined _USE_DLOG_
+
+#define gl_dbg(fmt, arg...) LOGD("[%s : %d] " fmt "\n", __FUNCTION__, __LINE__, ##arg)
+#define gl_dbgW(fmt, arg...) LOGW(FONT_COLOR_GREEN"[%s : %d] " fmt "\n"FONT_COLOR_RESET, __FUNCTION__, __LINE__, ##arg)
+#define gl_dbgE(fmt, arg...) LOGE(FONT_COLOR_RED"[%s : %d] " fmt "\n"FONT_COLOR_RESET, __FUNCTION__, __LINE__, ##arg)
+
+typedef struct {
+ const char *fname;
+ int nline;
+ const char *szcategory;
+} debug_msg_type;
+
+void _custom_debug_msg(debug_msg_type *debug_msg, const char *msg, ...);
+
+#define __LAUNCH_TEST_LOG(szCat, ...) \
+ do { \
+ if (1) \
+ { \
+ static debug_msg_type msg______unique______name___ = { \
+ __FILE__, \
+ __LINE__, \
+ szCat, \
+ }; \
+ _custom_debug_msg(&msg______unique______name___, ##__VA_ARGS__); \
+ } \
+ } while(0)
+
+#define gl_dbg_launch(...) __LAUNCH_TEST_LOG(LOG_TAG_LAUNCH, ##__VA_ARGS__)
+
+
+#elif defined _USE_LOG_CONSOLE_
+
+#define gl_dbg(fmt,arg...) fprintf(stdout, "[%s: %d]" fmt "\n", __FUNCTION__, __LINE__, ##arg)
+#define gl_dbgW(fmt, arg...) fprintf(stdout, "[%s : %d] " fmt "\n", __FUNCTION__, __LINE__, ##arg)
+#define gl_dbgE(fmt, arg...) fprintf(stdout, "[%s : %d] " fmt "\n", __FUNCTION__, __LINE__, ##arg)
+
+#else
+
+#define gl_dbg(fmt,arg...)
+#define gl_dbgW(fmt, arg...)
+#define gl_dbgE(fmt, arg...)
+#endif
+
+//void gl_init_debug_handler (const char *appname);
+//void gl_close_debug_handler();
+
+#include <time.h>
+#include <sys/time.h>
+
+//long gl_get_debug_time(void);
+//void gl_reset_debug_time(void);
+//void gl_print_debug_time(char* time_string);
+void gl_print_debug_time_ex(long start, long end, const char *func_name, char *time_string);
+
+
+
+#define gl_retm_if(expr, fmt, arg...) do { \
+ if(expr) { \
+ gl_dbgE(fmt, ##arg); \
+ gl_dbgE("(%s) -> %s() return", #expr, __FUNCTION__); \
+ return; \
+ } \
+} while (0)
+
+#define gl_retvm_if(expr, val, fmt, arg...) do { \
+ if(expr) { \
+ gl_dbgE(fmt, ##arg); \
+ gl_dbgE("(%s) -> %s() return", #expr, __FUNCTION__); \
+ return (val); \
+ } \
+} while (0)
+
+#define GL_CHECK_EXCEP(expr) do { \
+ if(!(expr)) { \
+ gl_dbgE("Critical ERROR ########################################## Check below item.");\
+ goto gl_exception;\
+ } \
+} while (0)
+
+#define GL_CHECK_VAL(expr, val) gl_retvm_if(!(expr), val, "Invalid parameter, return ERROR code!")
+#define GL_CHECK_NULL(expr) gl_retvm_if(!(expr), NULL, "Invalid parameter, return NULL!")
+#define GL_CHECK_FALSE(expr) gl_retvm_if(!(expr), false, "Invalid parameter, return FALSE!")
+#define GL_CHECK_CANCEL(expr) gl_retvm_if(!(expr), ECORE_CALLBACK_CANCEL, "Invalid parameter, return ECORE_CALLBACK_CANCEL!")
+#define GL_CHECK(expr) gl_retm_if(!(expr), "Invalid parameter, return!")
+
+#define gl_assert(expr) do { \
+ if(!(expr)) { \
+ gl_dbgE("Critical ERROR ########################################## Check below item.");\
+ assert(false); \
+ } \
+} while (0)
+
+#ifdef _cplusplus
+}
+#endif
+
+#endif /* _GL_DEBUG_H_ */
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _GL_DRM_H_
+#define _GL_DRM_H_
+
+#include <drm_client.h>
+#include <drm_client_types.h>
+
+Eina_Bool gl_drm_is_drm_file(const char *file_path);
+Eina_Bool gl_drm_check_valid_ro(const char *file_path,
+ drm_permission_type_e permType);
+char *gl_drm_get_file_path(void *item);
+int gl_drm_get_permtype(int gitem_type);
+
+#endif /* _GL_DRM_H_ */
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifdef _USE_ROTATE_BG
+
+#ifndef _GL_EXIF_H_
+#define _GL_EXIF_H_
+
+#include <stdbool.h>
+#include <stdio.h>
+
+#ifdef _cplusplus
+extern "C"
+{
+#endif
+
+/*
+Orientation - angle
+1 - 0
+3 - 180
+6 - 90
+8 - 270
+*/
+typedef enum _gl_orientation_rot_t gl_orientation_rot_e;
+
+enum _gl_orientation_rot_t {
+ GL_ORIENTATION_ROT_ERR = 0,
+ GL_ORIENTATION_ROT_0 = 1,
+ GL_ORIENTATION_ROT_180 = 3,
+ GL_ORIENTATION_ROT_90 = 6,
+ GL_ORIENTATION_ROT_270 = 8,
+};
+bool _gl_exif_check_img_type(char *file_path);
+int _gl_exif_get_orientation(char *file_path, unsigned int *orientation);
+int _gl_exif_set_orientation(char *file_path, unsigned int orientation);
+int _gl_exif_get_rotated_orientation(unsigned int orientation, bool b_left);
+
+#ifdef _cplusplus
+}
+#endif
+
+#endif /* _GL_EXIF_H_ */
+
+#endif
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _GL_EXT_EXEC_H_
+#define _GL_EXT_EXEC_H_
+
+typedef enum
+{
+ GL_LAUNCH_FAIL,
+ GL_LAUNCH_SUCCESS
+} gl_launch_status;
+
+typedef enum
+{
+ GL_APP_NONE = -1,
+ GL_APP_VIDEOPLAYER,
+} gl_ext_app_type;
+
+int gl_ext_exec(void *data, gl_ext_app_type type);
+int _gl_ext_load_camera(void);
+
+#endif /* _GL_EXT_EXEC_H_ */
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _GL_EXT_UG_LOAD_H_
+#define _GL_EXT_UG_LOAD_H_
+
+#include <ui-gadget.h>
+#include "gl-data.h"
+
+typedef enum
+{
+ GL_UG_FAIL,
+ GL_UG_SUCCESS
+} gl_ug_load_status;
+
+typedef enum
+{
+ GL_UG_MSG,
+ GL_UG_EMAIL,
+ GL_UG_BT,
+ GL_UG_IMAGEVIEWER,
+ GL_UG_CNT,
+} gl_ext_ug_type;
+
+typedef enum
+{
+ GL_UG_IV,
+ /*Invoke imageviewer to slideshow on local album */
+ GL_UG_IV_SLIDESHOW,
+ /*Invoke imageviewer to slideshow selected files */
+ GL_UG_IV_SLIDESHOW_SELECTED,
+ GL_UG_IV_CNT,
+} gl_ext_iv_type;
+
+int gl_ext_load_ug(void *data, gl_ext_ug_type type);
+int gl_ext_load_iv_ug(void *data, gl_item *item, gl_ext_iv_type type);
+int gl_ext_load_gallery_ug(void *data);
+int gl_ext_destroy_gallery_ug(void *data);
+
+#endif /* _GL_EXT_UG_LOAD_H_ */
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _GL_FS_H_
+#define _GL_FS_H_
+
+#include <stdio.h>
+#include <stdbool.h>
+#include <string.h>
+#include <stdlib.h>
+#include <dirent.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <linux/fs.h>
+#include <Eina.h>
+#include <glib.h>
+
+typedef struct _gl_node_info_t gl_node_info_s;
+struct _gl_node_info_t {
+ /* Parent path */
+ char *path;
+ /* File/folder name */
+ char *name;
+ /* Modified time */
+ time_t mtime;
+ /* File size / folder's content size */
+ long long size;
+};
+
+int _gl_fs_get_file_stat(const char *filename, gl_node_info_s **node);
+long long _gl_fs_get_folder_size(char *path);
+int _gl_fs_rm_folder(char *path, long long cut_size, long long max_size,
+ unsigned int expired_time);
+#ifdef _RENAME_ALBUM_SENSITIVE
+bool _gl_fs_check_name_case(char *dir, char *exist_name);
+#endif
+bool _gl_fs_is_low_memory(unsigned long long total_size);
+bool _gl_fs_get_ext(const char *file_path, char *file_ext, char *new_path);
+Eina_Bool _gl_fs_move(const char *src, const char *dst);
+char *_gl_fs_get_unique_full_path(char *file_path, char *ext);
+bool _gl_fs_validate_name(const char *new_name);
+int _gl_fs_get_default_folder(char *path);
+bool _gl_fs_mkdir(const char *path);
+
+#endif
+
--- /dev/null
+/*\r
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd\r
+ *\r
+ * Licensed under the Flora License, Version 1.1 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://floralicense.org/license/\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+#ifndef _GL_ICONS_H_\r
+#define _GL_ICONS_H_\r
+\r
+#include "gallery.h"\r
+\r
+/******** Image path ********/\r
+#define GL_DEFAULT_THUMB_ICON IMAGEDIR"T01_Nocontents_broken.png"\r
+#define GL_DB_DEFAULT_THUMB "/opt/usr/data/file-manager-service/.thumb/thumb_default.png"\r
+\r
+#define GL_DEFAULT_TAG_COVER IMAGEDIR"gallery_tag_default_thumbnail.png"\r
+#define GL_TAG_FAVORITES_THUMB IMAGEDIR"gallery_tag_favorites_thumbnail.png"\r
+#define GL_CBAR_ICON_ADD IMAGEDIR"T01_controlbar_icon_add.png"\r
+\r
+#define GL_CTRL_ICON_ALBUMS IMAGEDIR"T01_controlbar_icon_albums.png"\r
+#define GL_CTRL_ICON_TAGS IMAGEDIR"T01_controlbar_icon_tag.png"\r
+\r
+/******** Image group in EDC file ********/\r
+\r
+#define GL_IMAGES_EDJ_FILE EDJDIR"/gl-images.edj"\r
+\r
+#define GL_LOCK_ICON "T01_icon_lock.png"\r
+#define GL_THUMB_FAVOR_ICON "T01_icon_thumbnail_favorite.png"\r
+#define Gl_VIDEO_PLAY_ICON "T01_btn_thumbnail_play.png"\r
+#define GL_THUMB_BOOKMARK "T01_icon_thumbnail_bookmark.png"\r
+#define GL_LIST_BOOKMARK "T01_list_icon_bookmark.png"\r
+\r
+#endif\r
+\r
--- /dev/null
+/*\r
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd\r
+ *\r
+ * Licensed under the Flora License, Version 1.1 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://floralicense.org/license/\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+#ifndef _GL_LANG_H_\r
+#define _GL_LANG_H_\r
+\r
+#include "gallery.h"\r
+\r
+#ifdef _cplusplus\r
+extern "C"\r
+{\r
+#endif\r
+\r
+int _gl_lang_update(void *data);\r
+int _gl_lang_update_thumb_edit_button(void *data, Elm_Object_Item *nf_it);\r
+\r
+#ifdef _cplusplus\r
+}\r
+#endif\r
+\r
+\r
+#endif\r
+\r
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* This header file includes all multi language strings which need display */
+#ifndef _GL_STRINGS_H_
+#define _GL_STRINGS_H_
+
+#ifdef _cplusplus
+extern "C"
+{
+#endif
+
+/* hard code strings and already translated strings in gallery po files */
+#define GL_ALBUM_ALL_NAME _("IDS_MEDIABR_BODY_ALL_ALBUMS")
+#define GL_ALBUM_DEFAULT_NAME _("Camera")
+#define GL_ALBUM_DOWNLOAD_NAME _("Downloads")
+#define GL_STR_UNDER_IMPLEMENTATION _("Under Implementation!")
+#define GL_STR_CTRL_ITEM_TAGS _("IDS_MEDIABR_BODY_TAGS")
+
+#define GL_STR_EDIT dgettext("sys_string", "IDS_COM_BODY_EDIT")
+#define GL_STR_DOWNLOAD dgettext("sys_string", "IDS_COM_SK_DOWNLOAD")
+#define GL_STR_SLIDESHOW _("IDS_MEDIABR_BUTTON_SLIDE_SHOW")
+
+#define GL_STR_INVALID_INPUT_PARAMETER _("IDS_MEDIABR_POP_INVALID_INPUT_PARAMETER")
+#define GL_STR_ENTRY_IS_EMPTY _("IDS_MEDIABR_POP_ENTRY_IS_EMPTY")
+#define GL_STR_SAME_NAME_ALREADY_IN_USE _("IDS_MEDIABR_POP_SAME_NAME_ALREADY_IN_USE")
+
+#define GL_STR_UNABLE_tO_RENAME _("IDS_MEDIABR_POP_UNABLE_TO_RENAME")
+#define GL_STR_NO_ALBUMS_SELECTED _("IDS_MEDIABR_POP_NO_ALBUMS_SELECTED")
+#define GL_STR_NO_TAGS_SELECTED _("IDS_MEDIABR_POP_NO_TAGS_SELECTED")
+#define GL_STR_SELECT_ALBUM _("IDS_MEDIABR_HEADER_SELECT_ALBUM")
+#define GL_STR_SELECT_TAGS _("IDS_MEDIABR_BODY_SELECT_TAGS")
+#define GL_STR_SELECT_ITEM _("IDS_MEDIABR_HEADER_SELECT_ITEM")
+#define GL_STR_NO_ALBUMS _("IDS_MEDIABR_BODY_NO_ALBUMS")
+#define GL_STR_NO_TAGS _("IDS_MEDIABR_POP_NO_TAGS")
+
+#define GL_STR_EMPTY _("")
+#define GL_ALBUM_PHOME_ROOT_NAME _("IDS_MEDIABR_POP_NO_NAME")
+
+#ifdef _USE_ROTATE_BG
+#define GL_STR_ROTATE_LEFT _("IDS_MEDIABR_OPT_ROTATE_LEFT")
+#define GL_STR_ROTATE_RIGHT _("IDS_MEDIABR_OPT_ROTATE_RIGHT")
+#define GL_STR_ROTATING _("Rotating")
+#define GL_STR_ROTATED _("Rotated")
+#endif
+
+#define GL_STR_RETRY_Q _("IDS_MEDIABR_POP_RETRY_Q")
+#define GL_STR_CREATE_TAG _("IDS_MEDIABR_OPT_CREATE_TAG")
+#define GL_STR_RENAME_TAG dgettext("sys_string", "IDS_COM_BODY_CHANGE_NAME")
+#define GL_STR_CREATE_ALBUM _("IDS_MEDIABR_OPT_CREATE_ALBUM")
+
+/* system strings which are included in sys-string-0 po files */
+#define GL_STR_CAMERA dgettext("sys_string", "IDS_COM_BODY_CAMERA")
+#define GL_STR_DOWNLOADS dgettext("sys_string", "IDS_COM_BODY_DOWNLOADS")
+#define GL_STR_NO_FAVOR_VIDEOS dgettext("sys_string", "IDS_COM_BODY_NO_VIDEOS")
+#define GL_STR_NO_FAVOR_IMAGES dgettext("sys_string", "IDS_COM_BODY_NO_IMAGES")
+#define GL_STR_NO_FAVOR_ITEMS dgettext("sys_string", "IDS_COM_BODY_NO_ITEMS")
+#define GL_TAG_FAVORITES_NAME dgettext("sys_string", "IDS_COM_BODY_FAVOURITES")
+#define GL_ALBUM_IMAGES_NAME dgettext("sys_string", "IDS_COM_BODY_IMAGES")
+#define GL_ALBUM_VIDEOS_NAME dgettext("sys_string", "IDS_COM_BODY_VIDEOS")
+#define GL_STR_MOVE dgettext("sys_string", "IDS_COM_BODY_MOVE")
+#define GL_STR_SHARE dgettext("sys_string", "IDS_COM_BUTTON_SHARE")
+#define GL_STR_CANCEL dgettext("sys_string", "IDS_COM_SK_CANCEL")
+#define GL_STR_CLOSE dgettext("sys_string", "IDS_COM_BODY_CLOSE")
+#define GL_STR_DELETE dgettext("sys_string", "IDS_COM_OPT_DELETE")
+#define GL_STR_DONE dgettext("sys_string", "IDS_COM_SK_DONE")
+#define GL_STR_CTRL_ITEM_ALBUMS dgettext("sys_string", "IDS_COM_BODY_ALBUMS")
+#define GL_SHARE_MESSAGE dgettext("sys_string", "IDS_COM_BODY_MESSAGE")
+#define GL_SHARE_EMAIL dgettext("sys_string", "IDS_COM_BODY_EMAIL")
+#define GL_SHARE_BLUETOOTH dgettext("sys_string", "IDS_COM_BODY_BLUETOOTH")
+#define GL_STR_NO_ITEMS dgettext("sys_string", "IDS_COM_BODY_NO_ITEMS")
+#define GL_STR_NO_IMAGES dgettext("sys_string", "IDS_COM_BODY_NO_IMAGES")
+#define GL_STR_NO_CONTENTS dgettext("sys_string", "IDS_COM_BODY_NO_CONTENTS")
+#define GL_STR_DELETED dgettext("sys_string", "IDS_COM_POP_DELETED")
+#define GL_STR_REMOVED dgettext("sys_string", "IDS_COM_POP_REMOVED")
+#define GL_STR_REMOVE dgettext("sys_string", "IDS_COM_SK_REMOVE")
+#define GL_STR_ALL dgettext("sys_string", "IDS_COM_BODY_ALL")
+#define GL_STR_IMAGES dgettext("sys_string", "IDS_COM_BODY_IMAGES")
+#define GL_STR_VIDEOS dgettext("sys_string", "IDS_COM_BODY_VIDEOS")
+#define GL_STR_YES dgettext("sys_string", "IDS_COM_SK_YES")
+#define GL_STR_NO dgettext("sys_string", "IDS_COM_SK_NO")
+#define GL_STR_DELETE_COMFIRMATION dgettext("sys_string", "IDS_COM_POP_DELETE_Q")
+#define GL_STR_OK dgettext("sys_string", "IDS_COM_SK_OK")
+#define GL_STR_ADD dgettext("sys_string", "IDS_COM_SK_ADD")
+#define GL_STR_ADD_TAG dgettext("sys_string", "IDS_COM_OPT_ADD_TAG")
+#define GL_STR_SELECTED dgettext("sys_string", "IDS_COM_POP_SELECTED")
+#define GL_STR_CHNAGE_NAME dgettext("sys_string", "IDS_COM_BODY_CHANGE_NAME")
+#define GL_STR_NO_VIDEOS dgettext("sys_string", "IDS_COM_BODY_NO_VIDEOS")
+#define GL_STR_ADDED dgettext("sys_string", "IDS_COM_POP_ADDED")
+#define GL_STR_MOVED dgettext("sys_string", "IDS_COM_POP_MOVED")
+#define GL_STR_DELETING dgettext("sys_string", "IDS_COM_POP_DELETING")
+#define GL_STR_MOVING dgettext("sys_string", "IDS_COM_POP_MOVING")
+#define GL_STR_RENAME dgettext("sys_string", "IDS_COM_SK_RENAME")
+#define GL_STR_SELECT_ALL dgettext("sys_string", "IDS_COM_BODY_SELECT_ALL")
+#define GL_STR_NO_FILES_SELECTED dgettext("sys_string", "IDS_COM_POP_NO_FILES_SELECTED")
+#define GL_STR_APPLICATION_NOT_INSTALLED dgettext("sys_string", "IDS_COM_BODY_APPLICATION_NOT_INSTALLED")
+
+#ifdef _cplusplus
+}
+#endif
+#endif
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _GL_THREAD_UTIL_H_
+#define _GL_THREAD_UTIL_H_
+typedef enum
+{
+ GL_PB_CANCEL_NONE, /* Initial state */
+ GL_PB_CANCEL_NORMAL, /* Moving or deleting is in process */
+ GL_PB_CANCEL_BUTTON, /* Cancel button tapped while moving or deleting */
+ GL_PB_CANCEL_MMC, /* MMC removed, src album or dest album vanished while moving or deleting */
+ GL_PB_CANCEL_ERROR, /* Error happened while moving or deleting */
+ GL_PB_CANCEL_RESET, /* Reset gallery while moving or deleting */
+} gl_pb_cancel_mode;
+
+int gl_thread_emit_next_signal(void *data);
+int gl_thread_wait_next_signal(void *data);
+int gl_thread_set_cancel_state(void *data, int val);
+int gl_thread_get_cancel_state(void *data, int *val);
+void gl_thread_write_pipe(void *data, int finished_cnt, int popup_op);
+int gl_thread_gen_data_thread(void *data);
+int gl_thread_destroy_lock(void *data);
+int gl_thread_init_lock(void *data);
+
+#endif /* _GL_THREAD_UTIL_H_ */
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _GL_UI_UTIL_H_
+#define _GL_UI_UTIL_H_
+
+#include "gallery.h"
+#include "gl-icons.h"
+
+#ifdef _cplusplus
+extern "C"
+{
+#endif
+
+#define _EDJ(o) elm_layout_edje_get(o)
+#define _GET_ICON(_path) \
+ ((1 == ecore_file_exists(_path) && (ecore_file_size(_path) > 0)) ? _path : GL_DEFAULT_THUMB_ICON)
+
+/* Signals used in Gallery's views */
+#define GL_SIGNAL_VIEW_SELALL_SHOW "selectall_show"
+#define GL_SIGNAL_VIEW_SELALL_HIDE "selectall_hide"
+#define GL_SIGNAL_VIEW_SELALL_TAG "selectall_show_tag"
+#define GL_SIGNAL_VIEW_DEFAULT "elm,swallow_view,state,default"
+#define GL_SIGNAL_VIEW_EDIT "elm,swallow_view,state,edit"
+#define GL_SIGNAL_VIEW_MOVEUP "elm,swallow_view,state,moveup"
+#define GL_SIGNAL_VIEW_TABBAR_BG_HIDE "elm,tabbar_bg,state,hide"
+#define GL_SIGNAL_VIEW_TABBAR_BG_SHOW_PORT "elm,tabbar_bg,state,show_port"
+#define GL_SIGNAL_VIEW_TABBAR_BG_SHOW_LAND "elm,tabbar_bg,state,show_land"
+#define GL_SIGNAL_VIEW_TABBAR_DEFAULT "elm,tabbar,state,default"
+#define GL_SIGNAL_VIEW_TABBAR_LAND "elm,tabbar,state,landscape"
+
+#define GL_TRANS_FINISHED "transition,finished"
+
+typedef enum
+{
+ GL_NAVI_ALBUMS,
+ GL_NAVI_ALBUMS_EDIT,
+ GL_NAVI_ALBUMS_RENAME,
+ GL_NAVI_ALBUMS_NEW,
+ GL_NAVI_ALBUMS_SELECT,
+ GL_NAVI_TAGS,
+ GL_NAVI_TAGS_EDIT,
+ GL_NAVI_TAGS_NEW,
+ GL_NAVI_TAGS_RENAME,
+ GL_NAVI_THUMBS,
+ GL_NAVI_THUMBS_WEB,
+ GL_NAVI_THUMBS_DOWNLOAD,
+ GL_NAVI_THUMBS_EDIT,
+ GL_NAVI_THUMBS_SELECT,
+} gl_navi_mode;
+
+typedef enum
+{
+ GL_POPUP_SHARE_MESSAGE,
+ GL_POPUP_SHARE_EMAIL,
+ GL_POPUP_SHARE_BT,
+ GL_POPUP_SHARE_NUM,
+} gl_popup_share_item;
+
+typedef enum {
+ GL_POPUP_MOVE_TAG_MOVE,
+ GL_POPUP_MOVE_TAG_TAG,
+ GL_POPUP_MOVE_TAG_NUM,
+} gl_popup_move_tag_item;
+
+typedef enum _gl_ui_albums_btn_t gl_ui_albums_btn_e;
+
+enum _gl_ui_albums_btn_t {
+ GL_UI_ALBUMS_FIRST,
+ GL_UI_ALBUMS_REMAKE,
+};
+
+typedef struct _ctx_share_table
+{
+ gl_popup_share_item item;
+ const char *label;
+} gl_popup_share_tbl;
+
+typedef struct _ctx_mv_tag_table {
+ gl_popup_move_tag_item item;
+ const char *label;
+} gl_popup_mv_tag_tbl;
+
+Evas_Object *gl_ui_create_main_ly(Evas_Object *parent);
+Evas_Object *gl_ui_create_naviframe(Evas_Object *parent);
+int gl_ui_set_navi_title_visible(void *data, bool b_visible);
+int gl_ui_create_title_and_push(void *data, Evas_Object *parent,
+ Evas_Object *obj, gl_navi_mode mode, char *title);
+Evas_Object *gl_ui_load_edj(Evas_Object * parent, const char *file, const char *group);
+Evas_Object *_gl_ui_get_view_layout(void *data, int view_mode);
+int _gl_ui_update_selall(void *data, int all_cnt, int selected_cnt);
+int gl_ui_update_select_widgets(void *data);
+int gl_ui_show_selall(void *data);
+int _gl_ui_pop_to_thumb(void *data);
+int _gl_ui_disable_slideshow(void *data, bool b_disable);
+int _gl_ui_show_add_btn(void *data);
+int _gl_ui_clear_btns(void *data);
+int _gl_ui_add_btns_albums(void *data, int type);
+int _gl_ui_add_conform_cbs(Evas_Object *naviframe);
+int _gl_ui_del_conform_cbs(Evas_Object *naviframe);
+int _gl_ui_disable_btn(Evas_Object *btn);
+int _gl_ui_enable_btn(Evas_Object *btn);
+int _gl_ui_disable_each_btn(Elm_Object_Item *nf_it, bool b_more, bool b_btn1,
+ bool b_btn2);
+int _gl_ui_disable_btns(Elm_Object_Item *nf_it, bool b_disable);
+Evas_Object *_gl_ui_get_btn(void *data, Elm_Object_Item *nf_it,
+ const char *part);
+void _gl_ui_slideshow_cb(void *data, Evas_Object *obj, void *event_info);
+void _gl_ui_edit_cb(void *data, Evas_Object *obj, void *event_info);
+int _gl_ui_set_btns_text(Elm_Object_Item *nf_it, char *btn_text, char *btn_text2);
+int _gl_ui_reset_scroller_pos(Evas_Object *obj);
+int _gl_ui_del_scroller_pos(Evas_Object *obj);
+int _gl_ui_save_scroller_pos(Evas_Object *obj);
+int _gl_ui_restore_scroller_pos(Evas_Object *obj);
+
+#ifdef _cplusplus
+}
+#endif
+
+#endif // end of _GL_UI_UTIL_H_
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _GL_UTIL_H_
+#define _GL_UTIL_H_
+
+#include "gl-data.h"
+#include "gallery.h"
+
+/* File system related String definition */
+
+#define GL_HOME_ALBUM_COVER_NUM 1
+
+#define GL_FILE_EXISTS(path) \
+ (path && (1 == ecore_file_exists(path)) && (ecore_file_size(path) > 0))
+#define GL_ICON_SET_FILE(icon, img) \
+ elm_image_file_set(icon, GL_IMAGES_EDJ_FILE, img)
+
+#define GL_IF_DEL_TIMER(timer) if(timer){ecore_timer_del(timer); timer = NULL;}
+#define GL_IF_DEL_IDLER(idler) if(idler){ecore_idler_del(idler); idler = NULL;}
+#define GL_IF_DEL_OBJ(obj) if(obj){evas_object_del(obj); obj = NULL;}
+
+typedef enum
+{
+ GL_MMC_STATE_NONE,
+ GL_MMC_STATE_ADDED,
+ GL_MMC_STATE_ADDED_MOVING, /* Move medias to MMC or from MMC */
+ GL_MMC_STATE_ADDING_MOVING, /* Insert MMC while operate medias */
+ GL_MMC_STATE_REMOVED,
+ GL_MMC_STATE_REMOVED_MOVING, /* Remove MMC while move medias to MMC or from MMC */
+} gl_mmc_state_mode;
+
+typedef enum
+{
+ GL_UPDATE_VIEW_NONE,
+ GL_UPDATE_VIEW_NORMAL,
+ GL_UPDATE_VIEW_MMC_REMOVED, /* Update view when MMC removed */
+ GL_UPDATE_VIEW_MMC_ADDED, /* Update view when MMC inserted */
+} gl_update_view_mode;
+
+typedef enum
+{
+ GL_MEDIA_OP_NONE,
+ GL_MEDIA_OP_MOVE,
+ GL_MEDIA_OP_DELETE,
+ /* Add tag to media */
+ GL_MEDIA_OP_ADD_TAG,
+ /* Remove tag from media */
+ GL_MEDIA_OP_REMOVE_TAG,
+#ifdef _USE_ROTATE_BG
+ GL_MEDIA_OP_ROTATING_LEFT,
+ GL_MEDIA_OP_ROTATING_RIGHT,
+#endif
+} gl_media_op_mode;
+
+typedef enum
+{
+ GL_POPUP_OP_NONE,
+ GL_POPUP_OP_SAME_ALBUM,
+ GL_POPUP_OP_DUPLICATED_NAME,
+ GL_POPUP_OP_PROTECTED_FILE,
+} gl_popup_op_mode;
+
+typedef enum
+{
+ GL_SHARE_NONE,
+ GL_SHARE_DRM, /* DRM file selected, disable share option */
+ GL_SHARE_IMAGE_ONE, /* One image selection */
+ GL_SHARE_IMAGE_ONE_JPEG, /* One jpeg image selection */
+ GL_SHARE_IMAGE_MULTI, /* Multiple images selection */
+ GL_SHARE_IMAGE_MULTI_JPEG, /* Multiple jpeg images selection */
+ GL_SHARE_IMAGE_VIDEO, /* Image(s) and Video(s) selection */
+ GL_SHARE_VIDEO_ONE, /* One video selection */
+ GL_SHARE_VIDEO_MULTI, /* Multiple videos selection */
+} gl_share_mode;
+
+typedef enum
+{
+ GL_INVALID_NONE,
+ GL_INVALID_NEW_ENTRY,
+ GL_INVALID_NEW_ENTRY_NOC, /* Show nocontents view */
+ GL_INVALID_NEW_TAG_VIDEO,
+} gl_invalid_mode;
+
+int gl_get_view_mode(void *data);
+int gl_set_view_mode(void *data, int mode);
+int _gl_use_thread_operate_medias(void *data, char *pbar_title, int all_cnt,
+ int op_type);
+int _gl_move_media_thumb(gl_item * gitem, char *new_dir_name,
+ bool is_full_path, int *popup_op);
+int _gl_move_media(gl_item *gitem, char *new_dir_name, bool is_full_path);
+int gl_move_selected(void *data);
+int gl_move_to_album(void *data);
+int gl_move_root_album(void* data, gl_cluster* cur_album, char* dest_path);
+int gl_update_move_view(void *data);
+int gl_del_medias(void *data);
+int gl_del_selected(void *data);
+int gl_update_del_view(void *data);
+int _gl_get_selected_paths(void *data, gchar sep_c, char **path_str,
+ int *sel_cnt);
+int _gl_share_load(void *data, const char *label);
+int gl_share_select_item(void *data, const char *label);
+int gl_add_to_tag(void *data, const char *tagname);
+int gl_add_tag(void *data, gl_tag * gtag);
+int gl_add_tag_to_selected(void *data);
+int gl_update_add_tag_view(void *data);
+int gl_remove_tag_items(void *data);
+int gl_remove_tag_from_selected(void *data);
+int gl_update_remove_tag_view(void *data);
+int gl_check_mmc_state(void *data, char *dest_folder);
+int gl_del_albums(void *data);
+int gl_refresh_albums_list(void *data);
+int gl_reg_db_update_noti(void *data);
+int gl_dereg_db_update_noti(void);
+void gl_set_mmc_notifd(int fd);
+Eina_Bool gl_update_view(void *data, int mode);
+int gl_get_selected_files_path_str(void *data, gchar sep_c, char **path_str,
+ int *sel_cnt);
+int gl_make_new_album(const char *name);
+bool gl_check_gallery_empty(void* data);
+bool gl_is_rotation_locked(void);
+bool gl_is_image_valid(void *data, char *filepath);
+#ifdef _USE_ROTATE_BG
+int _gl_rotate_images(void *data, bool b_left);
+int _gl_rotate_selected(void *data, int op_type);
+int _gl_update_rotate_view(void *data);
+#endif
+int _gl_slideshow(void *data);
+int gl_get_entry_text(Evas_Object * entry, char *entry_text, int len_max);
+int gl_set_entry_text(Evas_Object *entry, char *entry_text);
+int _gl_get_valid_album_name(void *data, char* album_name, bool b_new,
+ bool b_enter);
+char* _gl_get_i18n_album_name(gl_cluster *album);
+int _gl_get_valid_tag_name(void *data, char* tag_name, bool b_new, bool b_enter);
+int gl_get_share_mode(void *data);
+int gl_del_invalid_widgets(void *data, int invalid_m);
+int _gl_destroy_ctrl_edit_view(void *data);
+int _gl_destroy_thumbs_edit_view(void *data);
+int gl_destroy_thumbs_view(void *data);
+int gl_pop_to_ctrlbar_ly(void *data, bool b_update_albums_list);
+int gl_play_vibration(void *data);
+char *_gl_get_duration_string(unsigned int v_dur);
+gl_icon_type _gl_get_icon_type(gl_item *git);
+
+#endif /* _GL_UTIL_H_ */
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _GL_BUTTON_H_
+#define _GL_BUTTON_H_
+
+#include <Elementary.h>
+#include "gallery.h"
+
+/**< Evas smart objects' "smart callback" function signature */
+typedef void (*But_Smart_Cb) (void *data, Evas_Object *obj, void *event_info);
+
+Evas_Object *_gl_but_create_but(Evas_Object *parent, const char *icon,
+ const char *text, const char *style,
+ But_Smart_Cb cb_func, const void *data);
+Evas_Object *_gl_but_create_but_popup(Evas_Object *parent, const char *text,
+ But_Smart_Cb cb_func, const void *data);
+
+#endif /* _GL_BUTTON_H_ */
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _GL_CONTROLBAR_H_
+#define _GL_CONTROLBAR_H_
+
+#include <Elementary.h>
+#include "gallery.h"
+
+#define GL_CBAR_OCCUPIED_PBAR 4
+#define GL_CBAR_OCCUPIED_SEGMENT 4
+
+typedef enum _gl_ctrl_tab_mode
+{
+ GL_CTRL_TAB_ALBUMS,
+ GL_CTRL_TAB_TAGS,
+ GL_CTRL_TAB_CNT,
+} gl_ctrl_tab_mode;
+
+void _gl_ctrl_segment_change_cb(void *data, Evas_Object *obj, void *event_info);
+Evas_Object *gl_ctrl_create_ctrlbar_view(Evas_Object * parent);
+Evas_Object *gl_ctrl_create_ctrlbar_ly(Evas_Object *parent);
+Evas_Object *gl_ctrl_create_ctrlbar(void *data, int mode);
+int gl_ctrl_disable_tab_event(void *data, bool disabled);
+int _gl_ctrl_sel_tabbar_item(void *data, const char *aul_type);
+int _gl_ctrl_show_tabbar(void *data, bool b_show);
+bool gl_ctrl_rotate_ctrlbar(void *data, int mode);
+int gl_ctrl_disable_ctrlbar(void *data, bool disabled);
+int _gl_ctrl_disable_btn(void *data, bool disabled, int mode);
+int _gl_ctrl_disable_btns(void *data, Elm_Object_Item *nf_it, bool b_disable);
+
+#endif /* _GL_CONTROLBAR_H_ */
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _GL_CTXPOPUP_H_
+#define _GL_CTXPOPUP_H_
+
+typedef int (*ctx_append_cb) (void *data, Evas_Object *parent);
+
+int _gl_ctxpopup_create(void *data, Evas_Object *but, ctx_append_cb append_cb);
+int _gl_ctxpopup_del(void *data);
+int _gl_ctxpopup_create_albums(void *data, Evas_Object *but);
+int _gl_ctxpopup_create_thumbs(void *data, Evas_Object *but);
+int _gl_ctxpopup_create_share(void *data, Evas_Object *but);
+int _gl_ctxpopup_create_move(void *data);
+int _gl_ctxpopup_create_addtag(void *data);
+
+#endif
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _GL_EDITFIELD_H_
+#define _GL_EDITFIELD_H_
+
+#include "gallery.h"
+
+#ifdef _cplusplus
+extern "C"
+{
+#endif
+
+Evas_Object *_gl_editfield_create(void *data, Evas_Object *parent,
+ char *default_label);
+Evas_Object *_gl_editfield_create_genlist(void *data, Evas_Object *parent,
+ char *label);
+int _gl_editfield_hide_imf(void *data);
+int _gl_editfield_show_imf(void *data);
+int _gl_editfield_destroy_imf(void *data);
+
+
+#ifdef _cplusplus
+}
+#endif
+
+#endif // end of _GL_EDITFIELD_H_
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _GL_NOCONTENTS_H_
+#define _GL_NOCONTENTS_H_
+
+#include "gallery.h"
+
+#ifdef _cplusplus
+extern "C"
+{
+#endif
+
+Evas_Object *_gl_nocontents_create(void *data);
+bool _gl_nocontents_update_label(Evas_Object *noc, const char *new_label);
+bool _gl_nocontents_show(void *data);
+
+#ifdef _cplusplus
+}
+#endif
+
+#endif // end of _GL_NOCONTENTS_H_
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _GL_NOTIFY_H_
+#define _GL_NOTIFY_H_
+
+#include "gallery.h"
+
+#ifdef _cplusplus
+extern "C"
+{
+#endif
+
+int _gl_notify_create_notiinfo(void *data, const char *text);
+int _gl_notify_create_selinfo(void *data, Evas_Object *parent,
+ Elm_Object_Item *nf_it, int all_cnt,
+ int selected_cnt, bool b_update);
+int _gl_notify_destroy_selinfo(void *data);
+int _gl_notify_update_lang(void *data, int cnt, int view_mode);
+
+#ifdef _cplusplus
+}
+#endif
+
+#endif // end of _GL_NOTIFY_H_
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _GL_POPUP_H_
+#define _GL_POPUP_H_
+
+#define GL_MOVE_TAG_MOVE GL_STR_MOVE
+#define GL_MOVE_TAG_TAG GL_STR_ADD_TAG
+#define GL_POPUP_STRING_MAX 256
+
+typedef enum _gl_popup_mode {
+ GL_POPUP_NOBUT,
+ GL_POPUP_NOBUT_MOV_DEL,
+ GL_POPUP_NOBUT_APPEXIT,
+ GL_POPUP_ALBUM_NEW_EMPTY,
+ GL_POPUP_ALBUM_NEW_DUPLICATE,
+ GL_POPUP_ALBUM_NEW_INVALID,
+ GL_POPUP_ALBUM_RENAME_EMPTY,
+ GL_POPUP_ALBUM_RENAME_DUPLICATE,
+ GL_POPUP_ALBUM_RENAME_INVALID,
+ GL_POPUP_ALBUM_DELETE,
+ GL_POPUP_TAG_DELETE,
+ GL_POPUP_TAG_NEW_EMPTY,
+ GL_POPUP_TAG_RENAEM_EMPTY,
+ GL_POPUP_TAG_RENAME_DUPLICATE,
+} gl_popup_mode;
+
+int gl_popup_create_albums_del_popup(void *data);
+int gl_popup_create_tag_del_popup(void *data);
+int gl_popup_create_popup(void *data, gl_popup_mode mode, char *desc);
+
+#endif /* _GL_POPUP_H_ */
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _GL_PROGRESSBAR_H_
+#define _GL_PROGRESSBAR_H_
+
+/* Font style for show label of popup */
+#define GL_FONT_STYLE_POP_S "<color=#000000FF><font=SLP:style=Medium text_class=slp><font_size=42>"
+#define GL_FONT_STYLE_POP_E "</font_size></font></color>"
+
+int gl_pb_make_thread_pbar(void *data, Evas_Object * parent, char *title);
+int gl_pb_refresh_thread_pbar(void *data, int cur_cnt, int total_cnt);
+int gl_pb_del_pbar(void *data);
+
+#endif /* _GL_PROGRESSBAR_H_ */
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifdef _USE_ROTATE_BG
+
+#ifndef _GL_ROTATE_BG_H_
+#define _GL_ROTATE_BG_H_
+
+#include "gallery.h"
+
+Evas_Object *_gl_rotate_bg_add(Evas_Object *parent);
+int _gl_rotate_bg_set_file(Evas_Object *bg, const char *file, int w, int h);
+int _gl_rotate_bg_rotate_image(Evas_Object *bg, unsigned int orient);
+int _gl_rotate_bg_add_image(Evas_Object *bg, int w, int h);
+int _gl_rotate_bg_set_image_file(Evas_Object *bg, const char *file);
+
+#endif
+
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _GL_THUMB_H_
+#define _GL_THUMB_H_
+
+#define GL_GENGRID_ITEM_STYLE_THUMBNAIL "gallery/thumbnail_view"
+#define GL_THUMB_ICON "elm.swallow.icon"
+#define GL_THUMB_CHECKBOX "elm.swallow.end"
+
+Evas_Object *_gl_thumb_show_part_icon_image(Evas_Object *obj, char *path,
+ int orient, bool b_favor,
+ bool is_expired_drm, int item_size);
+Evas_Object *_gl_thumb_show_part_icon_video(Evas_Object *obj, char *path,
+ unsigned int v_dur, int bk_len,
+ bool b_favor, bool is_expired_drm,
+ int item_size);
+Evas_Object *_gl_thumb_show_part_checkbox(Evas_Object *obj, bool checked,
+ Evas_Smart_Cb func, const void *data);
+Evas_Object *_gl_thumb_add_gengrid(Evas_Object *parent);
+int _gl_thumb_update_gengrid(Evas_Object *view);
+int _gl_thumb_set_size(void *data, Evas_Object *view, int count, int *size);
+
+#endif
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _GL_TILE_H_
+#define _GL_TILE_H_
+
+#include "gl-data.h"
+
+#define GL_TILE_THUMB_1 1
+#define GL_TILE_THUMB_2 2
+#define GL_TILE_THUMB_3 3
+#define GL_TILE_THUMB_5 5
+#define GL_TILE_THUMB_6 6
+
+#define GT_TILE_ONLYICON "elm.swallow.onlyicon"
+#define GT_TILE_ICON "elm.swallow.icon"
+#define GT_TILE_LABEL "label_bg"
+#define GL_TILE_CHECKBOX "elm.swallow.end"
+#define GL_TILE_CHECKBOX_GRID "elm.swallow.check_grid"
+#define GL_TILE_RENAME "elm.swallow.rename"
+
+#define GL_GENGRID_STYLE_ALBUM_VIEW "gallery/albums_view"
+#define GL_GENGRID_STYLE_ALBUM_EDIT_VIEW "gallery/albums_edit_view"
+
+/* Size of album icon */
+#define GL_TILE_SIZE 318
+/* Size of table padding */
+#define GL_TILE_PAD 3
+#define GL_TILE_PAD_2 2
+/* Pure size of album icon; value: 196 */
+#define GL_TILER_ICON_S (GL_TILE_SIZE - 2 * GL_TILE_PAD)
+/**
+* Album icon is set by elm_table,
+* it's divided into 3x3, 9 grids, each grid size is 64
+*/
+#define GL_TILE_GRID_S 102
+/* value: 130 */
+#define GL_TILE_2X_GRID_S (GL_TILER_ICON_S - GL_TILE_GRID_S - GL_TILE_PAD)
+
+typedef int (*bg_file_set_cb) (Evas_Object *bg, void *data);
+
+Evas_Object *_gl_tile_show_part_icon(Evas_Object *obj, const char *part,
+ int length, double scale,
+ bg_file_set_cb func, void **data);
+Evas_Object *_gl_tile_show_part_label(Evas_Object *obj, int index,
+ bool b_default);
+Evas_Object *_gl_tile_show_part_checkbox_grid(Evas_Object *obj, bool checked,
+ Evas_Smart_Cb func,
+ const void *data);
+Evas_Object *_gl_tile_show_part_checkbox(Evas_Object *obj, bool checked,
+ Evas_Smart_Cb func, const void *data);
+Evas_Object *_gl_tile_show_part_rename(Evas_Object *obj, Evas_Smart_Cb func,
+ const void *data);
+int _gl_tile_get_mtime(time_t *mtime1, time_t *mtime2, char *buf, int max_len);
+Evas_Object *_gl_tile_add_gengrid(void *data, Evas_Object *parent);
+
+
+#endif
--- /dev/null
+<manifest>
+ <define>
+ <domain name="org.tizen.gallery" />
+ </define>
+ <assign>
+ <filesystem path="/usr/share/icons/default/small/org.tizen.gallery.png" label="_" />
+ <filesystem path="/usr/share/applications/org.tizen.gallery.desktop" label="_" />
+ <filesystem path="/usr/apps/org.tizen.gallery/res/script/image/*" label="_" />
+ <filesystem path="/opt/usr/apps/org.tizen.gallery/data/.web_media.db*" label="org.tizen.gallery::web-media.db"/>
+ <filesystem path="/opt/usr/apps/org.tizen.gallery/data/.gallery_media.db*" label="org.tizen.gallery::gallery-media.db"/>
+ <filesystem path="/opt/usr/apps/org.tizen.gallery/data/.face.db*" label="org.tizen.gallery::face-svc.db"/>
+ </assign>
+ <request>
+ <domain name="org.tizen.gallery" />
+ </request>
+</manifest>
--- /dev/null
+org.tizen.gallery system::vconf rwxat
+org.tizen.gallery system::home rwxat
+org.tizen.gallery system::media rwxat
+org.tizen.gallery system::homedir rwxat
+org.tizen.gallery system::share rwxat
+org.tizen.gallery dali rwxat
+org.tizen.gallery pulseaudio rwxat
+org.tizen.gallery sys-assert::core rwxat
+org.tizen.gallery device::hwcodec rw---
+org.tizen.gallery device::video rw---
+org.tizen.gallery device::camera rw---
+org.tizen.gallery system::crash -wx--
+org.tizen.gallery system::use_internet rwxat
+org.tizen.gallery libaccounts-svc::db rw---
+org.tizen.gallery pkgmgr::db rw---
+org.tizen.gallery ail::db rw---
+org.tizen.gallery media-data::db rw---
+org.tizen.gallery app-svc::db rw---
+org.tizen.gallery email-service::db rw---
+org.tizen.gallery cloud-content-sync::db rw---
+org.tizen.gallery org.tizen.gallery::web-media.db rwx--
+org.tizen.gallery org.tizen.gallery::gallery-media.db rwx--
+org.tizen.gallery org.tizen.gallery::face-svc.db rwx--
+org.tizen.gallery notification::db rw---
+org.tizen.gallery org.tizen.indicator rwx--
+org.tizen.gallery org.tizen.image-editor rwx--
+org.tizen.gallery org.tizen.email rwx--
+org.tizen.gallery org.tizen.message rwx--
+org.tizen.gallery org.tizen.camera-app rw---
+org.tizen.gallery org.tizen.group-cast rw---
+org.tizen.gallery org.tizen.cluster-home rwx--
+org.tizen.gallery org.tizen.gallery-service rwx--
+org.tizen.gallery org.tizen.smemo rwx--
+org.tizen.gallery org.tizen.contacts rwx--
+org.tizen.gallery org.tizen.setting rwx--
+org.tizen.gallery download-provider rw---
+org.tizen.gallery wifi_direct_manager rw---
+org.tizen.gallery power_manager rwx--
+org.tizen.gallery email-service rwx--
+org.tizen.gallery contacts-service rwx--
+org.tizen.gallery media-server rwx--
+org.tizen.gallery sound_server rwx--
+org.tizen.gallery system-server rwxa-
+org.tizen.gallery mdm-server rwx--
+org.tizen.gallery xorg rwx--
+org.tizen.gallery isf rwx--
+org.tizen.gallery immvibed rwx--
+org.tizen.gallery dbus rwxat
+org.tizen.gallery data-provider-master rw---
+org.tizen.gallery data-provider-master::shortcut rw---
+org.tizen.gallery data-provider-master::shortcut.livebox -w---
+org.tizen.gallery data-provider-master::notification rw---
+org.tizen.gallery smemo r-x--
+org.tizen.gallery crash-worker r-x--
+org.tizen.gallery msg-service rwx--
+org.tizen.gallery webkit2-efl r-x--
+org.tizen.gallery ug-image-viewer-efl rwxat
+org.tizen.gallery net.wifi-qs rwx--
+org.tizen.gallery sys-assert::info -wx--
+org.tizen.gallery allshare::svc rwx--
+org.tizen.gallery cloud-content-sync rwx--
+org.tizen.gallery drmfw rw---
+org.tizen.gallery deviced rwxa-
+org.tizen.gallery xorg::screencapture r----
+org.tizen.gallery contacts-service::db rwx--
+org.tizen.gallery device::app_logging -w---
+org.tizen.gallery csc-manager rwx--
+org.tizen.gallery org.tizen.gallery rwxa-
+org.tizen.gallery ims-service::db rw---
+org.tizen.gallery system::vconf_inhouse rwxat
+org.tizen.gallery system::vconf_setting rwxat
+org.tizen.gallery system::vconf_system rw---
+e17 org.tizen.gallery rw---
+media-server org.tizen.gallery -w---
+org.tizen.gallery contacts-service::svc rw---
+org.tizen.gallery contacts-service::phonelog rw---
+org.tizen.gallery msg-service::read rw---
+org.tizen.gallery msg-service::write rw---
+org.tizen.gallery msg-service::wappush rw---
+org.tizen.gallery telephony_framework::api_manager r----
+org.tizen.gallery telephony_framework::api_modem -w---
+org.tizen.gallery cbhm rwx--
+org.tizen.gallery data-provider-master::utility rw---
+org.tizen.gallery net-config r-x--
+org.tizen.gallery pkgmgr r----
+org.tizen.gallery efreet r-x--
+org.tizen.gallery org.tizen.myfile rw---
+org.tizen.gallery ug-email-viewer-efl rwx--
+org.tizen.gallery ug-email-docsearch-efl --x--
+org.tizen.gallery camera-external-engine rw---
+org.tizen.gallery system::vconf_inouse r----
+org.tizen.gallery system::vconf_privacy r----
+org.tizen.gallery system::vconf_multimedia rw---
+org.tizen.gallery system::vconf_network rw---
+org.tizen.gallery system::vconf_misc r----
+aul org.tizen.gallery rwx--
+isf org.tizen.gallery r-x--
+org.tizen.gallery-service org.tizen.gallery rwx--
+org.tizen.cluster-home ug-image-viewer-efl r-x--
+org.tizen.lockscreen ug-image-viewer-efl r-x--
+org.tizen.gallery smemo::db rw---
+org.tizen.gallery org.tizen.browser rw---
+org.tizen.gallery org.tizen.calendar rwx--
+org.tizen.gallery calendar-service rwx--
+org.tizen.gallery device::sys_logging -w---
+org.tizen.gallery data-provider-master::badge rw---
+org.tizen.gallery resman::db rw---
+org.tizen.gallery map-efl rwxat
+org.tizen.gallery ug-email-composer-efl rwxat
+org.tizen.gallery ui-gadget::client --x--
+org.tizen.gallery secure-storage::pkcs12 r----
+org.tizen.gallery email-service::write rw---
+org.tizen.gallery calendar-service::svc rw---
+org.tizen.app-tray org.tizen.gallery r-x--
+org.tizen.gallery ug_bluetooth r-x--
+org.tizen.gallery syspopup::db rwx--
+org.tizen.gallery bt-service::admin -w---
+org.tizen.gallery bt-service::gap -w---
+org.tizen.gallery bt-service::manager -w---
+org.tizen.gallery system::app_logging -w---
+org.tizen.gallery svi-data rwxat
+org.tizen.gallery org.tizen.volume rwx--
+org.tizen.gallery org.tizen.setting::default-resources r-x--
+org.tizen.gallery device::mdnie rw---
+org.tizen.gallery pkgmer::db r----
+org.tizen.gallery stt-server rwx--
+org.tizen.gallery tts-server rwx--
+org.tizen.gallery ug-camera-efl rwxat
+org.tizen.gallery vcs-server rwx--
+org.tizen.gallery image-filter-d::db rw---
+org.tizen.gallery location_fw::db rw---
+org.tizen.gallery org.tizen.svoice rwx--
+org.tizen.gallery org.tizen.dropbox r-x--
+org.tizen.gallery org.tizen.facebook r-x--
+org.tizen.gallery oma-ds-agent rwx--
+oma-ds-agent org.tizen.gallery rwx--
+org.tizen.gallery oma-ds-agent::cfg rwxat
+org.tizen.setting org.tizen.gallery r-x--
+org.tizen.setting oma-ds-agent::cfg rwx--
+system::use_internet oma-ds-agent rwx--
+oma-ds-agent system::use_internet rwx--
+org.tizen.gallery syslogd rwx--
+org.tizen.gallery e17 r----
+org.tizen.gallery dlogutil r-x--
+org.tizen.gallery telephony_framework r-x--
+org.tizen.gallery aul r-x--
+org.tizen.gallery ode r-x--
+org.tizen.gallery sensor-framework r-x--
+org.tizen.gallery secure-storage r-x--
+org.tizen.gallery starter r-x--
+org.tizen.gallery osp-app-service r-x--
+org.tizen.gallery osp-security-service r-x--
+org.tizen.gallery osp-channel-service r-x--
+org.tizen.gallery org.tizen.app-tray r-x--
+org.tizen.gallery org.tizen.quickpanel r-x--
+org.tizen.gallery connman rwx--
+org.tizen.gallery mobicore-daemon r-x--
+org.tizen.gallery alarm-server rwx--
+org.tizen.gallery brcm_daemon r-x--
+org.tizen.gallery resman r-x--
+org.tizen.gallery osp-connectivity-service rwx--
+org.tizen.gallery push-service rwx--
+org.tizen.gallery eas-engine rwx--
+org.tizen.gallery org.tizen.data-provider-slave rwx--
+org.tizen.gallery org.tizen.data-provider-slave rwx--
+org.tizen.gallery usb-server rwx--
+org.tizen.gallery mtp-responder rwx--
+org.tizen.gallery sdbd rwx--
+ui-gadget::client oma-ds-agent::svc rw---
+org.tizen.gallery data-provider-master::notification.client -w---
+org.tizen.gallery samsung-account-front r-x--
+org.tizen.gallery worldclock::db rw---
+org.tizen.gallery thumb-server r----
+org.tizen.gallery data-provider-master::shortcut.shortcut -w---
+context-service org.tizen.gallery r-x--
+org.tizen.gallery location_fw::client rwx--
+org.tizen.gallery org.tizen.smartsearch --x--
+org.tizen.gallery ug-map-efl rwxat
+system::use_internet org.tizen.gallery -w---
+org.tizen.gallery obexd r-x--
+org.tizen.gallery org.tizen.fileshare-service rwxat
+org.tizen.fileshare-service org.tizen.gallery r-x--
+org.tizen.gallery nfc-manager rwx--
+org.tizen.gallery nfc-manager::p2p rwx--
+org.tizen.gallery nfc-manager::admin rwx--
+org.tizen.gallery ug-setting-gallery-efl rwxat
+org.tizen.gallery org.tizen.music-player --x--
+org.tizen.cluster-home org.tizen.gallery r-x--
+org.tizen.gallery phone-misc::db rw---
+org.tizen.gallery msg-service::db rw---
+org.tizen.gallery ug-msg-viewer-efl rwxat
+org.tizen.data-provider-slave org.tizen.gallery rwx--
+org.tizen.contacts org.tizen.gallery rwx--
+org.tizen.camera-app org.tizen.gallery rwx--
+org.tizen.email org.tizen.gallery rwx--
+org.tizen.music-player org.tizen.gallery rw---
+org.tizen.dailybriefing-agent org.tizen.gallery --x--
+org.tizen.volume org.tizen.gallery --x--
+org.tizen.quickpanel org.tizen.gallery r-x--
+org.tizen.lockscreen org.tizen.gallery r-x--
+org.tizen.indicator org.tizen.gallery rwx--
+webkit2-efl org.tizen.gallery --x--
+nfc-share-service org.tizen.gallery rw---
+net.wifi-qs org.tizen.gallery --x--
+org.tizen.data-provider-slave media-data::db rwx--
+org.tizen.data-provider-slave media-server rwx--
+org.tizen.data-provider-slave download-provider r----
+org.tizen.data-provider-slave cloud-content-sync r-x--
+org.tizen.data-provider-slave drmfw rwx--
+org.tizen.data-provider-slave org.tizen.gallery::face-svc.db rw---
+org.tizen.data-provider-slave org.tizen.gallery::web-media.db rw---
+org.tizen.data-provider-slave org.tizen.gallery::gallery-media.db rw---
+org.tizen.add-viewer org.tizen.gallery rwx--
+org.tizen.gallery org.tizen.browser::vconf_public rw---
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns="http://tizen.org/ns/packages" package="org.tizen.gallery" version="1.1.25-1" install-location="internal-only">
+ <label>Gallery</label>
+ <author email="jiansong.jin@samsung.com" href="www.samsung.com">Jiansong Jin</author>
+ <description>Gallery</description>
+ <ui-application type="capp" multiple="false" taskmanage="true" nodisplay="false" exec="/usr/apps/org.tizen.gallery/bin/gallery" appid="org.tizen.gallery">
+ <icon>org.tizen.gallery.png</icon>
+ <label>Gallery</label>
+ <label xml:lang="hy-am">Պատկերասրահ</label>
+ <label xml:lang="az-az">Qalereya</label>
+ <label xml:lang="eu-es">Galeria</label>
+ <label xml:lang="bg-bg">Галерия</label>
+ <label xml:lang="ca-es">Galeria</label>
+ <label xml:lang="zh-cn">相册</label>
+ <label xml:lang="zh-hk">媒體瀏覽器</label>
+ <label xml:lang="zh-tw">媒體瀏覽器</label>
+ <label xml:lang="hr-hr">Album</label>
+ <label xml:lang="cs-cz">Galerie</label>
+ <label xml:lang="da-dk">Galleri</label>
+ <label xml:lang="nl-nl">Galerij</label>
+ <label xml:lang="en-gb">Gallery</label>
+ <label xml:lang="en-us">Gallery</label>
+ <label xml:lang="et-ee">Galerii</label>
+ <label xml:lang="fi-fi">Galleria</label>
+ <label xml:lang="fr-fr">Galerie</label>
+ <label xml:lang="gl-es">Galería</label>
+ <label xml:lang="ka-ge">გალერეა</label>
+ <label xml:lang="de-de">Galerie</label>
+ <label xml:lang="el-gr">Συλλογή</label>
+ <label xml:lang="hu-hu">Galéria</label>
+ <label xml:lang="is-is">Gallerí</label>
+ <label xml:lang="ga-ie">Gailearaí</label>
+ <label xml:lang="it-it">Galleria</label>
+ <label xml:lang="ja-jp">ギャラリー</label>
+ <label xml:lang="kk-kz">Галерея</label>
+ <label xml:lang="ko-kr">갤러리</label>
+ <label xml:lang="lv-lv">Galerija</label>
+ <label xml:lang="lt-lt">Galerija</label>
+ <label xml:lang="mk-mk">Галерија</label>
+ <label xml:lang="nb-no">Galleri</label>
+ <label xml:lang="pl-pl">Galeria</label>
+ <label xml:lang="pt-pt">Galeria</label>
+ <label xml:lang="pt-br">Galeria</label>
+ <label xml:lang="ro-ro">Galerie</label>
+ <label xml:lang="ru-ru">Галерея</label>
+ <label xml:lang="sr-rs">Galerija</label>
+ <label xml:lang="sk-sk">Galéria</label>
+ <label xml:lang="sl-si">Galerija</label>
+ <label xml:lang="es-es">Galería</label>
+ <label xml:lang="es-us">Galería</label>
+ <label xml:lang="sv-se">Galleri</label>
+ <label xml:lang="tr-tr">Galeri</label>
+ <label xml:lang="uk-ua">Галерея</label>
+ <label xml:lang="uz-uz">Galereya</label>
+ <label xml:lang="ar-ae">ﺎﺴﺗﻭﺪﻳﻭ</label>
+ <label xml:lang="zh-sg">画廊</label>
+ <label xml:lang="hi-in">गैलरी</label>
+ <label xml:lang="en-ph">Gallery</label>
+ <label xml:lang="fr-ca">Galerie</label>
+ <application-service>
+ <operation name="http://tizen.org/appcontrol/operation/view"/>
+ </application-service>
+ <application-service>
+ <operation name="http://tizen.org/appcontrol/operation/wallpaper"/>
+ </application-service>
+ <application-service>
+ <operation name="http://tizen.org/appcontrol/operation/pick"/>
+ </application-service>
+ <application-service>
+ <operation name="http://tizen.org/appcontrol/operation/pick"/>
+ <mime name="image/*"/>
+ <mime name="video/*"/>
+ </application-service>
+ </ui-application>
+</manifest>
--- /dev/null
+%define _optdir /opt/usr
+%define _usrdir /usr
+%define _appdir %{_usrdir}/apps
+%define _appdatadir %{_optdir}/apps
+%define _ugdir %{_usrdir}/ug
+
+Name: org.tizen.gallery
+Summary: org.tizen.gallery UX
+Version: 1.1.48
+Release: 1
+Group: Applications
+License: Flora-1.1
+Source0: %{name}-%{version}.tar.gz
+BuildRequires: cmake
+BuildRequires: gettext-tools
+BuildRequires: edje-tools
+BuildRequires: pkgconfig(capi-content-media-content)
+BuildRequires: pkgconfig(drm-client)
+BuildRequires: pkgconfig(ui-gadget-1)
+BuildRequires: pkgconfig(elementary)
+BuildRequires: pkgconfig(ecore-imf)
+BuildRequires: pkgconfig(ecore-x)
+BuildRequires: pkgconfig(eina)
+BuildRequires: pkgconfig(evas)
+BuildRequires: pkgconfig(edje)
+BuildRequires: pkgconfig(ecore)
+BuildRequires: pkgconfig(ecore-file)
+BuildRequires: pkgconfig(ecore-input)
+BuildRequires: pkgconfig(vconf)
+BuildRequires: pkgconfig(dlog)
+BuildRequires: pkgconfig(glib-2.0)
+BuildRequires: pkgconfig(gthread-2.0)
+BuildRequires: pkgconfig(capi-appfw-application)
+BuildRequires: pkgconfig(capi-appfw-app-manager)
+BuildRequires: pkgconfig(haptic)
+BuildRequires: pkgconfig(utilX)
+BuildRequires: pkgconfig(notification)
+
+Requires: media-server ug-image-viewer-efl
+
+%description
+Description: org.tizen.gallery UX
+
+%package -n ug-gallery-efl
+Summary: gallery UG
+Group: TO_BE/FILLED_IN
+
+%description -n ug-gallery-efl
+Description: gallery UG
+
+%prep
+%setup -q
+
+%build
+
+%ifarch %{arm}
+CXXFLAGS+=" -D_ARCH_ARM_ -mfpu=neon -mfloat-abi=softfp"
+%endif
+
+cmake . -DCMAKE_INSTALL_PREFIX=%{_appdir}/org.tizen.gallery
+
+make %{?jobs:-j%jobs}
+
+%install
+rm -rf %{buildroot}
+mkdir -p %{buildroot}/usr/share/license
+cp LICENSE.Flora %{buildroot}/usr/share/license/org.tizen.gallery
+cp LICENSE.Flora %{buildroot}/usr/share/license/ug-gallery-efl
+
+%make_install
+
+%post
+chown -R 5000:5000 %{_appdatadir}/org.tizen.gallery/data
+%postun
+
+%post -n ug-gallery-efl
+mkdir -p /usr/ug/bin/
+ln -sf /usr/bin/ug-client /usr/ug/bin/gallery-efl
+%postun -n ug-gallery-efl
+
+%files -n org.tizen.gallery
+%manifest org.tizen.gallery.manifest
+%defattr(-,root,root,-)
+%{_appdir}/org.tizen.gallery/bin/*
+%{_appdir}/org.tizen.gallery/res/locale/*
+/usr/share/icons/default/small/*
+%{_appdir}/org.tizen.gallery/res/images/*
+%{_appdir}/org.tizen.gallery/res/edje/*
+%{_appdatadir}/org.tizen.gallery/data
+/usr/share/packages/org.tizen.gallery.xml
+/usr/share/miregex/*
+/etc/smack/accesses.d/org.tizen.gallery.rule
+/usr/share/license/org.tizen.gallery
+
+%files -n ug-gallery-efl
+%manifest ug-gallery-efl.manifest
+%defattr(-,root,root,-)
+%{_ugdir}/lib/libug-gallery-efl.so*
+%{_ugdir}/res/edje/gallery-efl/*
+%{_ugdir}/res/images/gallery-efl/*
+%{_ugdir}/res/locale/*/*/ug-gallery*.mo
+/usr/share/packages/ug-gallery-efl.xml
+/etc/smack/accesses2.d/ug.gallery-efl.include
+/usr/share/license/ug-gallery-efl
--- /dev/null
+(^( )*gallery:)([a-zA-Z0-9]+)
+Gallery Album Shortcut Internal
--- /dev/null
+# for i18n
+
+SET(POFILES ar.po az.po bg.po ca.po cs.po da.po de_DE.po el_GR.po en.po
+ en_PH.po en_US.po es_ES.po es_MX.po et.po eu.po fi.po fr_CA.po fr_FR.po
+ ga.po gl.po hi.po hr.po hu.po hy.po is.po it_IT.po ja_JP.po ka.po kk.po
+ ko_KR.po lt.po lv.po mk.po nb.po nl_NL.po pl.po pt_BR.po pt_PT.po ro.po
+ ru_RU.po sk.po sl.po sr.po sv.po tr_TR.po uk.po uz.po zh_CN.po zh_HK.po
+ zh_SG.po zh_TW.po)
+
+SET(MSGFMT "/usr/bin/msgfmt")
+
+FOREACH(pofile ${POFILES})
+ SET(pofile ${CMAKE_CURRENT_SOURCE_DIR}/${pofile})
+ MESSAGE("PO: ${pofile}")
+ GET_FILENAME_COMPONENT(absPofile ${pofile} ABSOLUTE)
+ GET_FILENAME_COMPONENT(lang ${absPofile} NAME_WE)
+ SET(moFile ${CMAKE_CURRENT_BINARY_DIR}/${lang}.mo)
+ ADD_CUSTOM_COMMAND(
+ OUTPUT ${moFile}
+ COMMAND ${MSGFMT} -o ${moFile} ${absPofile}
+ DEPENDS ${absPofile}
+ )
+ INSTALL(FILES ${moFile} DESTINATION res/locale/${lang}/LC_MESSAGES RENAME ${PROJECT_NAME}.mo)
+#Share mo files with Gallery UG.
+ INSTALL(FILES ${moFile} DESTINATION /usr/ug/res/locale/${lang}/LC_MESSAGES RENAME ${GALLERY_UG_PROJECT_NAME}.mo)
+ SET(moFiles ${moFiles} ${moFile})
+ENDFOREACH(pofile)
+
+MESSAGE(".mo files: ${moFiles}")
+ADD_CUSTOM_TARGET(po ALL DEPENDS ${moFiles})
--- /dev/null
+# List of source files containing translatable strings.
+../src/gallery.c
+../src/features/gl-albums.c
+../src/features/gl-gridview.c
+../src/features/gl-listview.c
+../src/features/gl-places-footsteps.c
+../src/features/gl-places.c
+../src/features/gl-tags.c
+../src/features/gl-webalbum.c
+../src/widget/gl-button.c
+../src/widget/gl-controlbar.c
+../src/widget/gl-nocontents.c
+../src/widget/gl-popup.c
+../src/widget/gl-progressbar.c
+../src/util/gl-2d-util.c
+../src/util/gl-allshare-util.c
+../src/util/gl-db-handler.c
+../src/util/gl-debug.c
+../src/util/gl-ext-exec.c
+../src/util/gl-ext-ug-load.c
+../src/util/gl-net-if.c
+../src/util/gl-ptp-util.c
+../src/util/gl-share-login.c
+../src/util/gl-sns-util.c
+../src/util/gl-ta.c
+../src/util/gl-thread-util.c
+../src/util/gl-ui-util.c
+../src/util/gl-util.c
--- /dev/null
+msgid "IDS_MEDIABR_BODY_TAGS"
+msgstr "البطاقات"
+
+msgid "IDS_MEDIABR_BODY_ALL_ALBUMS"
+msgstr "كافة الألبومات"
+
+msgid "IDS_MEDIABR_BUTTON_ALBUMS"
+msgstr "الألبومات"
+
+msgid "IDS_MEDIABR_BODY_NO_ALBUMS"
+msgstr "لا توجد ألبومات"
+
+msgid "IDS_MEDIABR_BODY_SELECT_TAGS"
+msgstr "تحديد العلامات"
+
+msgid "IDS_MEDIABR_OPT_CREATE_ALBUM"
+msgstr "إنشاء ألبوم"
+
+msgid "IDS_MEDIABR_POP_UNABLE_TO_RENAME"
+msgstr "غير قادر على تغيير الاسم. جاري استخدام الملف"
+
+msgid "IDS_MEDIABR_POP_NO_NAME"
+msgstr "لا يوجد اسم"
+
+msgid "IDS_MEDIABR_POP_NO_ALBUMS_SELECTED"
+msgstr "لا توجد ألبومات محددة"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS_SELECTED"
+msgstr "لم يتم تحديد أية علامات"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ITEM"
+msgstr "اختيار عنصر"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ALBUM"
+msgstr "تحديد ألبوم"
+
+msgid "IDS_MEDIABR_POP_RETRY_Q"
+msgstr "هل تريد إعادة المحاولة؟"
+
+msgid "IDS_MEDIABR_POP_SAME_NAME_ALREADY_IN_USE"
+msgstr "نفس الاسم مستخدم مسبقا"
+
+msgid "IDS_MEDIABR_POP_ENTRY_IS_EMPTY"
+msgstr "المدخل خالي"
+
+msgid "IDS_MEDIABR_POP_INVALID_INPUT_PARAMETER"
+msgstr "متغير إدخال غير صحيح"
+
+msgid "IDS_MEDIABR_OPT_CREATE_TAG"
+msgstr "إنشاء ع."
+
+msgid "IDS_MEDIABR_POP_NO_TAGS"
+msgstr "لا توجد علامات"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_LEFT"
+msgstr "تدوير لليسار"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_RIGHT"
+msgstr "تدوير لليمين"
+
+msgid "IDS_MEDIABR_BUTTON_SLIDE_SHOW"
+msgstr "عرض شرائح"
+
--- /dev/null
+msgid "IDS_MEDIABR_BODY_TAGS"
+msgstr "Yarlıklar"
+
+msgid "IDS_MEDIABR_BODY_ALL_ALBUMS"
+msgstr "Bütün albomlar"
+
+msgid "IDS_MEDIABR_BUTTON_ALBUMS"
+msgstr "Albomlar"
+
+msgid "IDS_MEDIABR_BODY_NO_ALBUMS"
+msgstr "Albom yoxdur"
+
+msgid "IDS_MEDIABR_BODY_SELECT_TAGS"
+msgstr "Etiketləri seç"
+
+msgid "IDS_MEDIABR_OPT_CREATE_ALBUM"
+msgstr "Albom yaradın"
+
+msgid "IDS_MEDIABR_POP_UNABLE_TO_RENAME"
+msgstr "Yenidən adlandırmaq mümkün deyildir"
+
+msgid "IDS_MEDIABR_POP_NO_NAME"
+msgstr "Ad yoxdur"
+
+msgid "IDS_MEDIABR_POP_NO_ALBUMS_SELECTED"
+msgstr "Albom seçilməyib"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS_SELECTED"
+msgstr "Heç bir etiket seçilməyib"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ITEM"
+msgstr "Element seç"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ALBUM"
+msgstr "Albom seç"
+
+msgid "IDS_MEDIABR_POP_RETRY_Q"
+msgstr "Yenidən cəhd edilsin?"
+
+msgid "IDS_MEDIABR_POP_SAME_NAME_ALREADY_IN_USE"
+msgstr "Eyni ad hazırda istifadə edilir"
+
+msgid "IDS_MEDIABR_POP_ENTRY_IS_EMPTY"
+msgstr "Boş qeyd"
+
+msgid "IDS_MEDIABR_POP_INVALID_INPUT_PARAMETER"
+msgstr "Yanlış daxiletmə parametrləri"
+
+msgid "IDS_MEDIABR_OPT_CREATE_TAG"
+msgstr "Et.yaradın"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS"
+msgstr "Etiket yoxdur"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_LEFT"
+msgstr "Sola döndər"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_RIGHT"
+msgstr "Sağa döndər"
+
+msgid "IDS_MEDIABR_BUTTON_SLIDE_SHOW"
+msgstr "Slyd nmyşi"
+
--- /dev/null
+msgid "IDS_MEDIABR_BODY_TAGS"
+msgstr "Тагове"
+
+msgid "IDS_MEDIABR_BODY_ALL_ALBUMS"
+msgstr "Всички албуми"
+
+msgid "IDS_MEDIABR_BUTTON_ALBUMS"
+msgstr "Албуми"
+
+msgid "IDS_MEDIABR_BODY_NO_ALBUMS"
+msgstr "Няма албуми"
+
+msgid "IDS_MEDIABR_BODY_SELECT_TAGS"
+msgstr "Изберете тагове"
+
+msgid "IDS_MEDIABR_OPT_CREATE_ALBUM"
+msgstr "Създаване на албум"
+
+msgid "IDS_MEDIABR_POP_UNABLE_TO_RENAME"
+msgstr "Не може да се преименува"
+
+msgid "IDS_MEDIABR_POP_NO_NAME"
+msgstr "Без име"
+
+msgid "IDS_MEDIABR_POP_NO_ALBUMS_SELECTED"
+msgstr "Не са избрани албуми"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS_SELECTED"
+msgstr "Няма избрани тагове"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ITEM"
+msgstr "Изберете елемент"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ALBUM"
+msgstr "Избор на албум"
+
+msgid "IDS_MEDIABR_POP_RETRY_Q"
+msgstr "Повторен опит?"
+
+msgid "IDS_MEDIABR_POP_SAME_NAME_ALREADY_IN_USE"
+msgstr "Такова име вече се използва"
+
+msgid "IDS_MEDIABR_POP_ENTRY_IS_EMPTY"
+msgstr "Празен запис"
+
+msgid "IDS_MEDIABR_POP_INVALID_INPUT_PARAMETER"
+msgstr "Невалиден параметър на входа"
+
+msgid "IDS_MEDIABR_OPT_CREATE_TAG"
+msgstr "Създ. таг"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS"
+msgstr "Без тагове"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_LEFT"
+msgstr "Завъртане наляво"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_RIGHT"
+msgstr "Завъртане надясно"
+
+msgid "IDS_MEDIABR_BUTTON_SLIDE_SHOW"
+msgstr "Слайдшоу"
+
--- /dev/null
+msgid "IDS_MEDIABR_BODY_TAGS"
+msgstr "Etiquetes"
+
+msgid "IDS_MEDIABR_BODY_ALL_ALBUMS"
+msgstr "Tots els àlbums"
+
+msgid "IDS_MEDIABR_BUTTON_ALBUMS"
+msgstr "Àlbums"
+
+msgid "IDS_MEDIABR_BODY_NO_ALBUMS"
+msgstr "Cap àlbum"
+
+msgid "IDS_MEDIABR_BODY_SELECT_TAGS"
+msgstr "Seleccionar etiquetes"
+
+msgid "IDS_MEDIABR_OPT_CREATE_ALBUM"
+msgstr "Crear àlbum"
+
+msgid "IDS_MEDIABR_POP_UNABLE_TO_RENAME"
+msgstr "No es pot canviar nom"
+
+msgid "IDS_MEDIABR_POP_NO_NAME"
+msgstr "Sense nom"
+
+msgid "IDS_MEDIABR_POP_NO_ALBUMS_SELECTED"
+msgstr "Sense àlbums seleccionats"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS_SELECTED"
+msgstr "No s'ha seleccionat cap etiqueta"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ITEM"
+msgstr "Seleccionar element"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ALBUM"
+msgstr "Seleccionar àlbum"
+
+msgid "IDS_MEDIABR_POP_RETRY_Q"
+msgstr "Tornar-ho a intentar?"
+
+msgid "IDS_MEDIABR_POP_SAME_NAME_ALREADY_IN_USE"
+msgstr "El mateix nom ja està en ús"
+
+msgid "IDS_MEDIABR_POP_ENTRY_IS_EMPTY"
+msgstr "L'entrada és buida"
+
+msgid "IDS_MEDIABR_POP_INVALID_INPUT_PARAMETER"
+msgstr "Paràmetre d'entrada no vàlid"
+
+msgid "IDS_MEDIABR_OPT_CREATE_TAG"
+msgstr "Crear etiq"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS"
+msgstr "Sense etiquetes"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_LEFT"
+msgstr "Girar cap a l'esquerra"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_RIGHT"
+msgstr "Girar cap a la dreta"
+
+msgid "IDS_MEDIABR_BUTTON_SLIDE_SHOW"
+msgstr "Diaposit"
+
--- /dev/null
+msgid "IDS_MEDIABR_BODY_TAGS"
+msgstr "Značky"
+
+msgid "IDS_MEDIABR_BODY_ALL_ALBUMS"
+msgstr "Všechna alba"
+
+msgid "IDS_MEDIABR_BUTTON_ALBUMS"
+msgstr "Alba"
+
+msgid "IDS_MEDIABR_BODY_NO_ALBUMS"
+msgstr "Žádná alba"
+
+msgid "IDS_MEDIABR_BODY_SELECT_TAGS"
+msgstr "Vyberte značky"
+
+msgid "IDS_MEDIABR_OPT_CREATE_ALBUM"
+msgstr "Vytvořit album"
+
+msgid "IDS_MEDIABR_POP_UNABLE_TO_RENAME"
+msgstr "Nelze přejmenovat"
+
+msgid "IDS_MEDIABR_POP_NO_NAME"
+msgstr "Žádný název"
+
+msgid "IDS_MEDIABR_POP_NO_ALBUMS_SELECTED"
+msgstr "Nejsou vybrána žádná alba"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS_SELECTED"
+msgstr "Nejsou vybrány žádné značky"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ITEM"
+msgstr "Vybrat položku"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ALBUM"
+msgstr "Vybrat album"
+
+msgid "IDS_MEDIABR_POP_RETRY_Q"
+msgstr "Opakovat?"
+
+msgid "IDS_MEDIABR_POP_SAME_NAME_ALREADY_IN_USE"
+msgstr "Stejný název je již použit"
+
+msgid "IDS_MEDIABR_POP_ENTRY_IS_EMPTY"
+msgstr "Prázdná položka"
+
+msgid "IDS_MEDIABR_POP_INVALID_INPUT_PARAMETER"
+msgstr "Chybný vstupní parametr"
+
+msgid "IDS_MEDIABR_OPT_CREATE_TAG"
+msgstr "Vytv. zn."
+
+msgid "IDS_MEDIABR_POP_NO_TAGS"
+msgstr "Žádné značky"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_LEFT"
+msgstr "Otočit doleva"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_RIGHT"
+msgstr "Otočit doprava"
+
+msgid "IDS_MEDIABR_BUTTON_SLIDE_SHOW"
+msgstr "Prezent."
+
--- /dev/null
+msgid "IDS_MEDIABR_BODY_TAGS"
+msgstr "Tags"
+
+msgid "IDS_MEDIABR_BODY_ALL_ALBUMS"
+msgstr "Alle album"
+
+msgid "IDS_MEDIABR_BUTTON_ALBUMS"
+msgstr "Albums"
+
+msgid "IDS_MEDIABR_BODY_NO_ALBUMS"
+msgstr "Ingen album"
+
+msgid "IDS_MEDIABR_BODY_SELECT_TAGS"
+msgstr "Vælg koder"
+
+msgid "IDS_MEDIABR_OPT_CREATE_ALBUM"
+msgstr "Opret album"
+
+msgid "IDS_MEDIABR_POP_UNABLE_TO_RENAME"
+msgstr "Kunne ikke omdøbe"
+
+msgid "IDS_MEDIABR_POP_NO_NAME"
+msgstr "Intet navn"
+
+msgid "IDS_MEDIABR_POP_NO_ALBUMS_SELECTED"
+msgstr "Ingen valgte album"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS_SELECTED"
+msgstr "Der er ikke valgt nogen koder"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ITEM"
+msgstr "Vælg element"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ALBUM"
+msgstr "Vælg album"
+
+msgid "IDS_MEDIABR_POP_RETRY_Q"
+msgstr "Prøv igen?"
+
+msgid "IDS_MEDIABR_POP_SAME_NAME_ALREADY_IN_USE"
+msgstr "Det samme navn er allerede i brug"
+
+msgid "IDS_MEDIABR_POP_ENTRY_IS_EMPTY"
+msgstr "Posten er tom"
+
+msgid "IDS_MEDIABR_POP_INVALID_INPUT_PARAMETER"
+msgstr "Ugyldigt inputparameter"
+
+msgid "IDS_MEDIABR_OPT_CREATE_TAG"
+msgstr "Opret kode"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS"
+msgstr "Ingen tags"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_LEFT"
+msgstr "Rotér mod uret"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_RIGHT"
+msgstr "Rotér med uret"
+
+msgid "IDS_MEDIABR_BUTTON_SLIDE_SHOW"
+msgstr "Diasshow"
+
--- /dev/null
+msgid "IDS_MEDIABR_BODY_TAGS"
+msgstr "Tags"
+
+msgid "IDS_MEDIABR_BODY_ALL_ALBUMS"
+msgstr "Alle Alben"
+
+msgid "IDS_MEDIABR_BUTTON_ALBUMS"
+msgstr "Alben"
+
+msgid "IDS_MEDIABR_BODY_NO_ALBUMS"
+msgstr "Keine Alben"
+
+msgid "IDS_MEDIABR_BODY_SELECT_TAGS"
+msgstr "Tags auswählen"
+
+msgid "IDS_MEDIABR_OPT_CREATE_ALBUM"
+msgstr "Album erstellen"
+
+msgid "IDS_MEDIABR_POP_UNABLE_TO_RENAME"
+msgstr "Umbenennen nicht möglich"
+
+msgid "IDS_MEDIABR_POP_NO_NAME"
+msgstr "Kein Name"
+
+msgid "IDS_MEDIABR_POP_NO_ALBUMS_SELECTED"
+msgstr "Keine Alben ausgewählt."
+
+msgid "IDS_MEDIABR_POP_NO_TAGS_SELECTED"
+msgstr "Keine Tags ausgewählt"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ITEM"
+msgstr "Element auswählen"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ALBUM"
+msgstr "Album auswählen"
+
+msgid "IDS_MEDIABR_POP_RETRY_Q"
+msgstr "Erneut versuchen?"
+
+msgid "IDS_MEDIABR_POP_SAME_NAME_ALREADY_IN_USE"
+msgstr "Derselbe Name wird bereits verwendet"
+
+msgid "IDS_MEDIABR_POP_ENTRY_IS_EMPTY"
+msgstr "Eintrag ist leer"
+
+msgid "IDS_MEDIABR_POP_INVALID_INPUT_PARAMETER"
+msgstr "Ungültiger Eingabeparameter"
+
+msgid "IDS_MEDIABR_OPT_CREATE_TAG"
+msgstr "Tag erst."
+
+msgid "IDS_MEDIABR_POP_NO_TAGS"
+msgstr "Keine Markierungen"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_LEFT"
+msgstr "Nach links drehen"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_RIGHT"
+msgstr "Nach rechts drehen"
+
+msgid "IDS_MEDIABR_BUTTON_SLIDE_SHOW"
+msgstr "Diashow"
+
--- /dev/null
+msgid "IDS_MEDIABR_BODY_TAGS"
+msgstr "Ετικέτες"
+
+msgid "IDS_MEDIABR_BODY_ALL_ALBUMS"
+msgstr "Όλα τα άλμπουμ"
+
+msgid "IDS_MEDIABR_BUTTON_ALBUMS"
+msgstr "Άλμπουμ"
+
+msgid "IDS_MEDIABR_BODY_NO_ALBUMS"
+msgstr "Δεν υπάρχουν άλμπουμ"
+
+msgid "IDS_MEDIABR_BODY_SELECT_TAGS"
+msgstr "Επιλέξτε ετικέτα"
+
+msgid "IDS_MEDIABR_OPT_CREATE_ALBUM"
+msgstr "Δημιουργία άλμπουμ"
+
+msgid "IDS_MEDIABR_POP_UNABLE_TO_RENAME"
+msgstr "Δεν είναι δυνατή η μετονομασία"
+
+msgid "IDS_MEDIABR_POP_NO_NAME"
+msgstr "Κανένα όνομα"
+
+msgid "IDS_MEDIABR_POP_NO_ALBUMS_SELECTED"
+msgstr "Δεν έχουν επιλεγεί άλμπουμ"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS_SELECTED"
+msgstr "Δεν έχουν επιλεγεί ετικέτες"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ITEM"
+msgstr "Επιλογή στοιχείου"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ALBUM"
+msgstr "Επιλογή άλμπουμ"
+
+msgid "IDS_MEDIABR_POP_RETRY_Q"
+msgstr "Επανάληψη;"
+
+msgid "IDS_MEDIABR_POP_SAME_NAME_ALREADY_IN_USE"
+msgstr "Το όνομα χρησιμοποιείται ήδη"
+
+msgid "IDS_MEDIABR_POP_ENTRY_IS_EMPTY"
+msgstr "Κενή καταχώρηση"
+
+msgid "IDS_MEDIABR_POP_INVALID_INPUT_PARAMETER"
+msgstr "Μη έγκυρη παράμετρος δεδομένων εισόδου"
+
+msgid "IDS_MEDIABR_OPT_CREATE_TAG"
+msgstr "Δημ. ετικ."
+
+msgid "IDS_MEDIABR_POP_NO_TAGS"
+msgstr "Δεν υπάρχουν ετικέτες"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_LEFT"
+msgstr "Περιστροφή προς τα αριστερά"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_RIGHT"
+msgstr "Περιστροφή προς τα δεξιά"
+
+msgid "IDS_MEDIABR_BUTTON_SLIDE_SHOW"
+msgstr "Παρ/σίαση"
+
--- /dev/null
+msgid "IDS_MEDIABR_BODY_TAGS"
+msgstr "Tags"
+
+msgid "IDS_MEDIABR_BODY_ALL_ALBUMS"
+msgstr "All albums"
+
+msgid "IDS_MEDIABR_BUTTON_ALBUMS"
+msgstr "Albums"
+
+msgid "IDS_MEDIABR_BODY_NO_ALBUMS"
+msgstr "No albums"
+
+msgid "IDS_MEDIABR_BODY_SELECT_TAGS"
+msgstr "Select tags"
+
+msgid "IDS_MEDIABR_OPT_CREATE_ALBUM"
+msgstr "Create album"
+
+msgid "IDS_MEDIABR_POP_UNABLE_TO_RENAME"
+msgstr "Unable to rename"
+
+msgid "IDS_MEDIABR_POP_NO_NAME"
+msgstr "No name"
+
+msgid "IDS_MEDIABR_POP_NO_ALBUMS_SELECTED"
+msgstr "No albums selected"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS_SELECTED"
+msgstr "No tags selected"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ITEM"
+msgstr "Select item"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ALBUM"
+msgstr "Select album"
+
+msgid "IDS_MEDIABR_POP_RETRY_Q"
+msgstr "Retry?"
+
+msgid "IDS_MEDIABR_POP_SAME_NAME_ALREADY_IN_USE"
+msgstr "Same name already in use"
+
+msgid "IDS_MEDIABR_POP_ENTRY_IS_EMPTY"
+msgstr "Entry is empty"
+
+msgid "IDS_MEDIABR_POP_INVALID_INPUT_PARAMETER"
+msgstr "Invalid input parameter"
+
+msgid "IDS_MEDIABR_OPT_CREATE_TAG"
+msgstr "Create tag"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS"
+msgstr "No tags"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_LEFT"
+msgstr "Rotate left"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_RIGHT"
+msgstr "Rotate right"
+
+msgid "IDS_MEDIABR_BUTTON_SLIDE_SHOW"
+msgstr "Slide show"
+
--- /dev/null
+msgid "IDS_MEDIABR_BODY_TAGS"
+msgstr "Tags"
+
+msgid "IDS_MEDIABR_BODY_ALL_ALBUMS"
+msgstr "All albums"
+
+msgid "IDS_MEDIABR_BUTTON_ALBUMS"
+msgstr "Albums"
+
+msgid "IDS_MEDIABR_BODY_NO_ALBUMS"
+msgstr "No albums"
+
+msgid "IDS_MEDIABR_BODY_SELECT_TAGS"
+msgstr "Select tags"
+
+msgid "IDS_MEDIABR_OPT_CREATE_ALBUM"
+msgstr "Create album"
+
+msgid "IDS_MEDIABR_POP_UNABLE_TO_RENAME"
+msgstr "Unable to rename"
+
+msgid "IDS_MEDIABR_POP_NO_NAME"
+msgstr "No name"
+
+msgid "IDS_MEDIABR_POP_NO_ALBUMS_SELECTED"
+msgstr "No albums selected"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS_SELECTED"
+msgstr "No tags selected"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ITEM"
+msgstr "Select item"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ALBUM"
+msgstr "Select album"
+
+msgid "IDS_MEDIABR_POP_RETRY_Q"
+msgstr "Retry?"
+
+msgid "IDS_MEDIABR_POP_SAME_NAME_ALREADY_IN_USE"
+msgstr "Same name already in use"
+
+msgid "IDS_MEDIABR_POP_ENTRY_IS_EMPTY"
+msgstr "Phone contact is empty"
+
+msgid "IDS_MEDIABR_POP_INVALID_INPUT_PARAMETER"
+msgstr "Invalid input parameter"
+
+msgid "IDS_MEDIABR_OPT_CREATE_TAG"
+msgstr "Create tag"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS"
+msgstr "No tags"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_LEFT"
+msgstr "Rotate left"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_RIGHT"
+msgstr "Rotate right"
+
+msgid "IDS_MEDIABR_BUTTON_SLIDE_SHOW"
+msgstr "Slide show"
+
--- /dev/null
+msgid "IDS_MEDIABR_BODY_TAGS"
+msgstr "Tags"
+
+msgid "IDS_MEDIABR_BODY_ALL_ALBUMS"
+msgstr "All albums"
+
+msgid "IDS_MEDIABR_BUTTON_ALBUMS"
+msgstr "Albums"
+
+msgid "IDS_MEDIABR_BODY_NO_ALBUMS"
+msgstr "No albums"
+
+msgid "IDS_MEDIABR_BODY_SELECT_TAGS"
+msgstr "Select tags"
+
+msgid "IDS_MEDIABR_OPT_CREATE_ALBUM"
+msgstr "Create album"
+
+msgid "IDS_MEDIABR_POP_UNABLE_TO_RENAME"
+msgstr "Unable to rename"
+
+msgid "IDS_MEDIABR_POP_NO_NAME"
+msgstr "No name"
+
+msgid "IDS_MEDIABR_POP_NO_ALBUMS_SELECTED"
+msgstr "No albums selected"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS_SELECTED"
+msgstr "No tags selected"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ITEM"
+msgstr "Select item"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ALBUM"
+msgstr "Select album"
+
+msgid "IDS_MEDIABR_POP_RETRY_Q"
+msgstr "Retry?"
+
+msgid "IDS_MEDIABR_POP_SAME_NAME_ALREADY_IN_USE"
+msgstr "Same name already in use"
+
+msgid "IDS_MEDIABR_POP_ENTRY_IS_EMPTY"
+msgstr "Entry is empty"
+
+msgid "IDS_MEDIABR_POP_INVALID_INPUT_PARAMETER"
+msgstr "Invalid input parameter"
+
+msgid "IDS_MEDIABR_OPT_CREATE_TAG"
+msgstr "Create tag"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS"
+msgstr "No tags"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_LEFT"
+msgstr "Rotate left"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_RIGHT"
+msgstr "Rotate right"
+
+msgid "IDS_MEDIABR_BUTTON_SLIDE_SHOW"
+msgstr "Slide show"
+
--- /dev/null
+msgid "IDS_MEDIABR_BODY_TAGS"
+msgstr "Etiquetas"
+
+msgid "IDS_MEDIABR_BODY_ALL_ALBUMS"
+msgstr "Todos los álbumes"
+
+msgid "IDS_MEDIABR_BUTTON_ALBUMS"
+msgstr "Álbumes"
+
+msgid "IDS_MEDIABR_BODY_NO_ALBUMS"
+msgstr "No hay álbumes"
+
+msgid "IDS_MEDIABR_BODY_SELECT_TAGS"
+msgstr "Seleccionar etiquetas"
+
+msgid "IDS_MEDIABR_OPT_CREATE_ALBUM"
+msgstr "Crear álbum"
+
+msgid "IDS_MEDIABR_POP_UNABLE_TO_RENAME"
+msgstr "Imposible cambiar el nombre"
+
+msgid "IDS_MEDIABR_POP_NO_NAME"
+msgstr "Sin nombre"
+
+msgid "IDS_MEDIABR_POP_NO_ALBUMS_SELECTED"
+msgstr "No hay álbumes seleccionados"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS_SELECTED"
+msgstr "No hay etiquetas seleccionadas"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ITEM"
+msgstr "Seleccionar elemento"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ALBUM"
+msgstr "Seleccionar álbum"
+
+msgid "IDS_MEDIABR_POP_RETRY_Q"
+msgstr "¿Volver a intentar?"
+
+msgid "IDS_MEDIABR_POP_SAME_NAME_ALREADY_IN_USE"
+msgstr "El mismo nombre ya está en uso"
+
+msgid "IDS_MEDIABR_POP_ENTRY_IS_EMPTY"
+msgstr "Entrada vacía"
+
+msgid "IDS_MEDIABR_POP_INVALID_INPUT_PARAMETER"
+msgstr "Parámetro de entrada no válido"
+
+msgid "IDS_MEDIABR_OPT_CREATE_TAG"
+msgstr "Crear etiq"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS"
+msgstr "Sin etiquetas"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_LEFT"
+msgstr "Girar a la izquierda"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_RIGHT"
+msgstr "Girar a la derecha"
+
+msgid "IDS_MEDIABR_BUTTON_SLIDE_SHOW"
+msgstr "Pres diap"
+
--- /dev/null
+msgid "IDS_MEDIABR_BODY_TAGS"
+msgstr "Etiquetas"
+
+msgid "IDS_MEDIABR_BODY_ALL_ALBUMS"
+msgstr "Todos los álbumes"
+
+msgid "IDS_MEDIABR_BUTTON_ALBUMS"
+msgstr "Álbumes"
+
+msgid "IDS_MEDIABR_BODY_NO_ALBUMS"
+msgstr "No hay álbumes"
+
+msgid "IDS_MEDIABR_BODY_SELECT_TAGS"
+msgstr "Seleccionar etiquetas"
+
+msgid "IDS_MEDIABR_OPT_CREATE_ALBUM"
+msgstr "Crear álbum"
+
+msgid "IDS_MEDIABR_POP_UNABLE_TO_RENAME"
+msgstr "No se puede renombrar"
+
+msgid "IDS_MEDIABR_POP_NO_NAME"
+msgstr "Sin nombre"
+
+msgid "IDS_MEDIABR_POP_NO_ALBUMS_SELECTED"
+msgstr "No hay álbumes seleccionados"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS_SELECTED"
+msgstr "No hay etiquetas seleccionadas"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ITEM"
+msgstr "Seleccionar elemento"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ALBUM"
+msgstr "Seleccionar álbum"
+
+msgid "IDS_MEDIABR_POP_RETRY_Q"
+msgstr "¿Volver a intentar?"
+
+msgid "IDS_MEDIABR_POP_SAME_NAME_ALREADY_IN_USE"
+msgstr "Ya existe ese nombre"
+
+msgid "IDS_MEDIABR_POP_ENTRY_IS_EMPTY"
+msgstr "Entrada vacía"
+
+msgid "IDS_MEDIABR_POP_INVALID_INPUT_PARAMETER"
+msgstr "Parámetro de entrada no válido"
+
+msgid "IDS_MEDIABR_OPT_CREATE_TAG"
+msgstr "Crear etiq"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS"
+msgstr "Sin etiquetas"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_LEFT"
+msgstr "Girar a la izquierda"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_RIGHT"
+msgstr "Girar a la derecha"
+
+msgid "IDS_MEDIABR_BUTTON_SLIDE_SHOW"
+msgstr "Pres diap"
+
--- /dev/null
+msgid "IDS_MEDIABR_BODY_TAGS"
+msgstr "Sildid"
+
+msgid "IDS_MEDIABR_BODY_ALL_ALBUMS"
+msgstr "Kõik albumid"
+
+msgid "IDS_MEDIABR_BUTTON_ALBUMS"
+msgstr "Albumid"
+
+msgid "IDS_MEDIABR_BODY_NO_ALBUMS"
+msgstr "Albumid puuduvad"
+
+msgid "IDS_MEDIABR_BODY_SELECT_TAGS"
+msgstr "Vali silte"
+
+msgid "IDS_MEDIABR_OPT_CREATE_ALBUM"
+msgstr "Loo album"
+
+msgid "IDS_MEDIABR_POP_UNABLE_TO_RENAME"
+msgstr "Ei saa ümber nimetada"
+
+msgid "IDS_MEDIABR_POP_NO_NAME"
+msgstr "Nimi puudub"
+
+msgid "IDS_MEDIABR_POP_NO_ALBUMS_SELECTED"
+msgstr "Ühtegi albumit pole valitud"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS_SELECTED"
+msgstr "Silte ei ole valitud"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ITEM"
+msgstr "Vali üksus"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ALBUM"
+msgstr "Valige album"
+
+msgid "IDS_MEDIABR_POP_RETRY_Q"
+msgstr "Proovi uuesti?"
+
+msgid "IDS_MEDIABR_POP_SAME_NAME_ALREADY_IN_USE"
+msgstr "See nimi on juba kasutusel"
+
+msgid "IDS_MEDIABR_POP_ENTRY_IS_EMPTY"
+msgstr "Kirje on tühi"
+
+msgid "IDS_MEDIABR_POP_INVALID_INPUT_PARAMETER"
+msgstr "Vigane sisestusparameeter"
+
+msgid "IDS_MEDIABR_OPT_CREATE_TAG"
+msgstr "Loo silt"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS"
+msgstr "Silte pole"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_LEFT"
+msgstr "Pööra vasakule"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_RIGHT"
+msgstr "Pööra paremale"
+
+msgid "IDS_MEDIABR_BUTTON_SLIDE_SHOW"
+msgstr "Slaidis."
+
--- /dev/null
+msgid "IDS_MEDIABR_BODY_TAGS"
+msgstr "Etiketak"
+
+msgid "IDS_MEDIABR_BODY_ALL_ALBUMS"
+msgstr "Album guztiak"
+
+msgid "IDS_MEDIABR_BUTTON_ALBUMS"
+msgstr "Albumak"
+
+msgid "IDS_MEDIABR_BODY_NO_ALBUMS"
+msgstr "Albumik ez"
+
+msgid "IDS_MEDIABR_BODY_SELECT_TAGS"
+msgstr "Aukeratu etiketak"
+
+msgid "IDS_MEDIABR_OPT_CREATE_ALBUM"
+msgstr "Albuma sortu"
+
+msgid "IDS_MEDIABR_POP_UNABLE_TO_RENAME"
+msgstr "Ezin da berrizendatu"
+
+msgid "IDS_MEDIABR_POP_NO_NAME"
+msgstr "Izenik gabe"
+
+msgid "IDS_MEDIABR_POP_NO_ALBUMS_SELECTED"
+msgstr "Ez da albumik aukeratu"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS_SELECTED"
+msgstr "Ez da etiketarik aukeratu"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ITEM"
+msgstr "Elementua aukeratu"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ALBUM"
+msgstr "Aukeratu albuma"
+
+msgid "IDS_MEDIABR_POP_RETRY_Q"
+msgstr "Berriz saiatu?"
+
+msgid "IDS_MEDIABR_POP_SAME_NAME_ALREADY_IN_USE"
+msgstr "Izen bera dagoeneko erabiltzen"
+
+msgid "IDS_MEDIABR_POP_ENTRY_IS_EMPTY"
+msgstr "Sarrera hutsik dago"
+
+msgid "IDS_MEDIABR_POP_INVALID_INPUT_PARAMETER"
+msgstr "Sarrera parametro baliogabea"
+
+msgid "IDS_MEDIABR_OPT_CREATE_TAG"
+msgstr "Sor. etik."
+
+msgid "IDS_MEDIABR_POP_NO_TAGS"
+msgstr "Etiketarik ez"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_LEFT"
+msgstr "Ezkerrera biratu"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_RIGHT"
+msgstr "Eskuinera biratu"
+
+msgid "IDS_MEDIABR_BUTTON_SLIDE_SHOW"
+msgstr "Erakusketa"
+
--- /dev/null
+msgid "IDS_MEDIABR_BODY_TAGS"
+msgstr "Tunnisteet"
+
+msgid "IDS_MEDIABR_BODY_ALL_ALBUMS"
+msgstr "Kaikki albumit"
+
+msgid "IDS_MEDIABR_BUTTON_ALBUMS"
+msgstr "Albumit"
+
+msgid "IDS_MEDIABR_BODY_NO_ALBUMS"
+msgstr "Ei albumeita"
+
+msgid "IDS_MEDIABR_BODY_SELECT_TAGS"
+msgstr "Valitse tunnisteet"
+
+msgid "IDS_MEDIABR_OPT_CREATE_ALBUM"
+msgstr "Luo albumi"
+
+msgid "IDS_MEDIABR_POP_UNABLE_TO_RENAME"
+msgstr "Ei voi nimetä uudelleen"
+
+msgid "IDS_MEDIABR_POP_NO_NAME"
+msgstr "Ei nimeä"
+
+msgid "IDS_MEDIABR_POP_NO_ALBUMS_SELECTED"
+msgstr "Albumeita ei ole valittu"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS_SELECTED"
+msgstr "Tunnisteita ei ole valittu"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ITEM"
+msgstr "Valitse kohde"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ALBUM"
+msgstr "Valitse albumi"
+
+msgid "IDS_MEDIABR_POP_RETRY_Q"
+msgstr "Yritetäänkö uudelleen?"
+
+msgid "IDS_MEDIABR_POP_SAME_NAME_ALREADY_IN_USE"
+msgstr "Sama nimi on jo käytössä"
+
+msgid "IDS_MEDIABR_POP_ENTRY_IS_EMPTY"
+msgstr "Tyhjä tieto"
+
+msgid "IDS_MEDIABR_POP_INVALID_INPUT_PARAMETER"
+msgstr "Virheellinen syöteparametri"
+
+msgid "IDS_MEDIABR_OPT_CREATE_TAG"
+msgstr "Luo tunn."
+
+msgid "IDS_MEDIABR_POP_NO_TAGS"
+msgstr "Ei tunnisteita"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_LEFT"
+msgstr "Kierrä vastapäivään"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_RIGHT"
+msgstr "Kierrä myötäpäivään"
+
+msgid "IDS_MEDIABR_BUTTON_SLIDE_SHOW"
+msgstr "Diaesitys"
+
--- /dev/null
+msgid "IDS_MEDIABR_BODY_TAGS"
+msgstr "Libellés"
+
+msgid "IDS_MEDIABR_BODY_ALL_ALBUMS"
+msgstr "Tous les albums"
+
+msgid "IDS_MEDIABR_BUTTON_ALBUMS"
+msgstr "Albums"
+
+msgid "IDS_MEDIABR_BODY_NO_ALBUMS"
+msgstr "Aucun album"
+
+msgid "IDS_MEDIABR_BODY_SELECT_TAGS"
+msgstr "Sélectionner libellés"
+
+msgid "IDS_MEDIABR_OPT_CREATE_ALBUM"
+msgstr "Créer un album"
+
+msgid "IDS_MEDIABR_POP_UNABLE_TO_RENAME"
+msgstr "Impossible de renommer l'élément"
+
+msgid "IDS_MEDIABR_POP_NO_NAME"
+msgstr "Aucun nom"
+
+msgid "IDS_MEDIABR_POP_NO_ALBUMS_SELECTED"
+msgstr "Aucun album sélectionné"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS_SELECTED"
+msgstr "Aucun libellé sélectionné"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ITEM"
+msgstr "Sélectionner un élément"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ALBUM"
+msgstr "Sélectionner un album"
+
+msgid "IDS_MEDIABR_POP_RETRY_Q"
+msgstr "Réessayer?"
+
+msgid "IDS_MEDIABR_POP_SAME_NAME_ALREADY_IN_USE"
+msgstr "Nom déjà utilisé"
+
+msgid "IDS_MEDIABR_POP_ENTRY_IS_EMPTY"
+msgstr "Entrée vide"
+
+msgid "IDS_MEDIABR_POP_INVALID_INPUT_PARAMETER"
+msgstr "Paramètre d'entrée non valide"
+
+msgid "IDS_MEDIABR_OPT_CREATE_TAG"
+msgstr "Nv libellé"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS"
+msgstr "Aucun libellé"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_LEFT"
+msgstr "Pivoter vers la gauche"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_RIGHT"
+msgstr "Pivoter vers la droite"
+
+msgid "IDS_MEDIABR_BUTTON_SLIDE_SHOW"
+msgstr "Diaporama"
+
--- /dev/null
+msgid "IDS_MEDIABR_BODY_TAGS"
+msgstr "Libellés"
+
+msgid "IDS_MEDIABR_BODY_ALL_ALBUMS"
+msgstr "Tous les albums"
+
+msgid "IDS_MEDIABR_BUTTON_ALBUMS"
+msgstr "Albums"
+
+msgid "IDS_MEDIABR_BODY_NO_ALBUMS"
+msgstr "Aucun album"
+
+msgid "IDS_MEDIABR_BODY_SELECT_TAGS"
+msgstr "Sélectionner libellés"
+
+msgid "IDS_MEDIABR_OPT_CREATE_ALBUM"
+msgstr "Créer un album"
+
+msgid "IDS_MEDIABR_POP_UNABLE_TO_RENAME"
+msgstr "Impossible de renommer l'élément"
+
+msgid "IDS_MEDIABR_POP_NO_NAME"
+msgstr "Aucun nom"
+
+msgid "IDS_MEDIABR_POP_NO_ALBUMS_SELECTED"
+msgstr "Aucun album sélectionné"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS_SELECTED"
+msgstr "Aucun libellé sélectionné"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ITEM"
+msgstr "Sélectionner un élément"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ALBUM"
+msgstr "Sélectionner un album"
+
+msgid "IDS_MEDIABR_POP_RETRY_Q"
+msgstr "Réessayer ?"
+
+msgid "IDS_MEDIABR_POP_SAME_NAME_ALREADY_IN_USE"
+msgstr "Nom déjà utilisé"
+
+msgid "IDS_MEDIABR_POP_ENTRY_IS_EMPTY"
+msgstr "Entrée vide"
+
+msgid "IDS_MEDIABR_POP_INVALID_INPUT_PARAMETER"
+msgstr "Paramètre d'entrée non valide"
+
+msgid "IDS_MEDIABR_OPT_CREATE_TAG"
+msgstr "Nv libellé"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS"
+msgstr "Aucun tag"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_LEFT"
+msgstr "Rotation à gauche"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_RIGHT"
+msgstr "Rotation à droite"
+
+msgid "IDS_MEDIABR_BUTTON_SLIDE_SHOW"
+msgstr "Diaporama"
+
--- /dev/null
+msgid "IDS_MEDIABR_BODY_TAGS"
+msgstr "Clibeanna"
+
+msgid "IDS_MEDIABR_BODY_ALL_ALBUMS"
+msgstr "Gach albam"
+
+msgid "IDS_MEDIABR_BUTTON_ALBUMS"
+msgstr "Albaim"
+
+msgid "IDS_MEDIABR_BODY_NO_ALBUMS"
+msgstr "Níl albaim ann"
+
+msgid "IDS_MEDIABR_BODY_SELECT_TAGS"
+msgstr "Roghnaigh clibeanna"
+
+msgid "IDS_MEDIABR_OPT_CREATE_ALBUM"
+msgstr "Déan albam"
+
+msgid "IDS_MEDIABR_POP_UNABLE_TO_RENAME"
+msgstr "Ní féidir athainmniú"
+
+msgid "IDS_MEDIABR_POP_NO_NAME"
+msgstr "Níl ainm ann"
+
+msgid "IDS_MEDIABR_POP_NO_ALBUMS_SELECTED"
+msgstr "Níor roghnaíodh albam"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS_SELECTED"
+msgstr "Níl clib roghnaithe"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ITEM"
+msgstr "Roghnaigh mír"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ALBUM"
+msgstr "Roghnaigh albam"
+
+msgid "IDS_MEDIABR_POP_RETRY_Q"
+msgstr "Atriail?"
+
+msgid "IDS_MEDIABR_POP_SAME_NAME_ALREADY_IN_USE"
+msgstr "Ainm céanna in úsáid cheana"
+
+msgid "IDS_MEDIABR_POP_ENTRY_IS_EMPTY"
+msgstr "Tá an iontráil folamh"
+
+msgid "IDS_MEDIABR_POP_INVALID_INPUT_PARAMETER"
+msgstr "Paraiméadar ionchuir neamhbhailí"
+
+msgid "IDS_MEDIABR_OPT_CREATE_TAG"
+msgstr "Déan clib"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS"
+msgstr "Níl clibeanna ann"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_LEFT"
+msgstr "Rothlaigh ar chlé"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_RIGHT"
+msgstr "Rothlaigh ar dheis"
+
+msgid "IDS_MEDIABR_BUTTON_SLIDE_SHOW"
+msgstr "Sleamhnán"
+
--- /dev/null
+msgid "IDS_MEDIABR_BODY_TAGS"
+msgstr "Etiquetas"
+
+msgid "IDS_MEDIABR_BODY_ALL_ALBUMS"
+msgstr "Todos os álbums"
+
+msgid "IDS_MEDIABR_BUTTON_ALBUMS"
+msgstr "Álbums"
+
+msgid "IDS_MEDIABR_BODY_NO_ALBUMS"
+msgstr "Non hai álbums"
+
+msgid "IDS_MEDIABR_BODY_SELECT_TAGS"
+msgstr "Seleccionar etiquetas"
+
+msgid "IDS_MEDIABR_OPT_CREATE_ALBUM"
+msgstr "Crear álbum"
+
+msgid "IDS_MEDIABR_POP_UNABLE_TO_RENAME"
+msgstr "Non se pode cambiar o nome"
+
+msgid "IDS_MEDIABR_POP_NO_NAME"
+msgstr "Sen nome"
+
+msgid "IDS_MEDIABR_POP_NO_ALBUMS_SELECTED"
+msgstr "Non hai ningún álbum seleccionado"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS_SELECTED"
+msgstr "Non hai etiquetas seleccionadas"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ITEM"
+msgstr "Seleccionar elemento"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ALBUM"
+msgstr "Seleccionar álbum"
+
+msgid "IDS_MEDIABR_POP_RETRY_Q"
+msgstr "Volver intentar?"
+
+msgid "IDS_MEDIABR_POP_SAME_NAME_ALREADY_IN_USE"
+msgstr "Este nome xa está en uso"
+
+msgid "IDS_MEDIABR_POP_ENTRY_IS_EMPTY"
+msgstr "A entrada está baleira"
+
+msgid "IDS_MEDIABR_POP_INVALID_INPUT_PARAMETER"
+msgstr "Parámetro de entrada non válido"
+
+msgid "IDS_MEDIABR_OPT_CREATE_TAG"
+msgstr "Crear etiq"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS"
+msgstr "Ningunha etiqueta"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_LEFT"
+msgstr "Xirar á esquerda"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_RIGHT"
+msgstr "Xirar á dereita"
+
+msgid "IDS_MEDIABR_BUTTON_SLIDE_SHOW"
+msgstr "Diapos"
+
--- /dev/null
+msgid "IDS_MEDIABR_BODY_TAGS"
+msgstr "टैग्स"
+
+msgid "IDS_MEDIABR_BODY_ALL_ALBUMS"
+msgstr "सभी एलबम्स"
+
+msgid "IDS_MEDIABR_BUTTON_ALBUMS"
+msgstr "अल्बम्स"
+
+msgid "IDS_MEDIABR_BODY_NO_ALBUMS"
+msgstr "कोई एल्बम नहीं"
+
+msgid "IDS_MEDIABR_BODY_SELECT_TAGS"
+msgstr "टैग्स चुनें"
+
+msgid "IDS_MEDIABR_OPT_CREATE_ALBUM"
+msgstr "अल्बम बनाएँ"
+
+msgid "IDS_MEDIABR_POP_UNABLE_TO_RENAME"
+msgstr "नाम बदलने में अक्षम"
+
+msgid "IDS_MEDIABR_POP_NO_NAME"
+msgstr "नाम नहीं"
+
+msgid "IDS_MEDIABR_POP_NO_ALBUMS_SELECTED"
+msgstr "कोई अल्बम चुना नहीं गया"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS_SELECTED"
+msgstr "कोई टैग्स चुने नहीं"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ITEM"
+msgstr "मद चुनें"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ALBUM"
+msgstr "एल्बम चुनें"
+
+msgid "IDS_MEDIABR_POP_RETRY_Q"
+msgstr "पुनः प्रयास करें?"
+
+msgid "IDS_MEDIABR_POP_SAME_NAME_ALREADY_IN_USE"
+msgstr "ऐसा ही नाम पहले से इस्तेमाल में है"
+
+msgid "IDS_MEDIABR_POP_ENTRY_IS_EMPTY"
+msgstr "प्रविष्टि खाली है"
+
+msgid "IDS_MEDIABR_POP_INVALID_INPUT_PARAMETER"
+msgstr "अमान्य इनपुट पैरामीटर"
+
+msgid "IDS_MEDIABR_OPT_CREATE_TAG"
+msgstr "टैग बनाएँ"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS"
+msgstr "कोई टैग्स नहीं"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_LEFT"
+msgstr "बाएँ घुमाएँ"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_RIGHT"
+msgstr "दाएँ घुमाएँ"
+
+msgid "IDS_MEDIABR_BUTTON_SLIDE_SHOW"
+msgstr "स्लाइड शो"
+
--- /dev/null
+msgid "IDS_MEDIABR_BODY_TAGS"
+msgstr "Oznake"
+
+msgid "IDS_MEDIABR_BODY_ALL_ALBUMS"
+msgstr "Svi albumi"
+
+msgid "IDS_MEDIABR_BUTTON_ALBUMS"
+msgstr "Albumi"
+
+msgid "IDS_MEDIABR_BODY_NO_ALBUMS"
+msgstr "Nema albuma"
+
+msgid "IDS_MEDIABR_BODY_SELECT_TAGS"
+msgstr "Odaberite oznake"
+
+msgid "IDS_MEDIABR_OPT_CREATE_ALBUM"
+msgstr "Novi album"
+
+msgid "IDS_MEDIABR_POP_UNABLE_TO_RENAME"
+msgstr "Nemoguće preimenovati"
+
+msgid "IDS_MEDIABR_POP_NO_NAME"
+msgstr "Nema imena"
+
+msgid "IDS_MEDIABR_POP_NO_ALBUMS_SELECTED"
+msgstr "Nema odabranih albuma"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS_SELECTED"
+msgstr "Nema odabranih oznaka"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ITEM"
+msgstr "Odaberite stavku"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ALBUM"
+msgstr "Odaberi album"
+
+msgid "IDS_MEDIABR_POP_RETRY_Q"
+msgstr "Ponoviti?"
+
+msgid "IDS_MEDIABR_POP_SAME_NAME_ALREADY_IN_USE"
+msgstr "Već postoji isto ime"
+
+msgid "IDS_MEDIABR_POP_ENTRY_IS_EMPTY"
+msgstr "Unos prazan"
+
+msgid "IDS_MEDIABR_POP_INVALID_INPUT_PARAMETER"
+msgstr "Neispravan ulazni parametar"
+
+msgid "IDS_MEDIABR_OPT_CREATE_TAG"
+msgstr "Nova oznaka"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS"
+msgstr "Nema oznaka"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_LEFT"
+msgstr "Rotiraj ulijevo"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_RIGHT"
+msgstr "Rotiraj udesno"
+
+msgid "IDS_MEDIABR_BUTTON_SLIDE_SHOW"
+msgstr "Prezentacija"
+
--- /dev/null
+msgid "IDS_MEDIABR_BODY_TAGS"
+msgstr "Címkék"
+
+msgid "IDS_MEDIABR_BODY_ALL_ALBUMS"
+msgstr "Összes album"
+
+msgid "IDS_MEDIABR_BUTTON_ALBUMS"
+msgstr "Albumok"
+
+msgid "IDS_MEDIABR_BODY_NO_ALBUMS"
+msgstr "Nincs album"
+
+msgid "IDS_MEDIABR_BODY_SELECT_TAGS"
+msgstr "Jelöljön ki címkéket"
+
+msgid "IDS_MEDIABR_OPT_CREATE_ALBUM"
+msgstr "Album létrehozása"
+
+msgid "IDS_MEDIABR_POP_UNABLE_TO_RENAME"
+msgstr "Nem lehet átnevezni"
+
+msgid "IDS_MEDIABR_POP_NO_NAME"
+msgstr "Nincs név"
+
+msgid "IDS_MEDIABR_POP_NO_ALBUMS_SELECTED"
+msgstr "Nincs kijelölt album"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS_SELECTED"
+msgstr "Nincs kiválasztott címke"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ITEM"
+msgstr "Elem kiválasztása"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ALBUM"
+msgstr "Album kiválasztása"
+
+msgid "IDS_MEDIABR_POP_RETRY_Q"
+msgstr "Újra próbálkozik?"
+
+msgid "IDS_MEDIABR_POP_SAME_NAME_ALREADY_IN_USE"
+msgstr "Már van ilyen név"
+
+msgid "IDS_MEDIABR_POP_ENTRY_IS_EMPTY"
+msgstr "A bejegyzés üres"
+
+msgid "IDS_MEDIABR_POP_INVALID_INPUT_PARAMETER"
+msgstr "Érvénytelen bemeneti paraméter"
+
+msgid "IDS_MEDIABR_OPT_CREATE_TAG"
+msgstr "Létrehozás"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS"
+msgstr "Nincs címke"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_LEFT"
+msgstr "Forgatás balra"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_RIGHT"
+msgstr "Forgatás jobbra"
+
+msgid "IDS_MEDIABR_BUTTON_SLIDE_SHOW"
+msgstr "Diavet."
+
--- /dev/null
+msgid "IDS_MEDIABR_BODY_TAGS"
+msgstr "Հայտանիշեր"
+
+msgid "IDS_MEDIABR_BODY_ALL_ALBUMS"
+msgstr "Բոլոր ալբոմները"
+
+msgid "IDS_MEDIABR_BUTTON_ALBUMS"
+msgstr "Ալբոմներ"
+
+msgid "IDS_MEDIABR_BODY_NO_ALBUMS"
+msgstr "Ալբոմներ չկան"
+
+msgid "IDS_MEDIABR_BODY_SELECT_TAGS"
+msgstr "Ընտրել հատկորոշիչներ"
+
+msgid "IDS_MEDIABR_OPT_CREATE_ALBUM"
+msgstr "Ստեղծել ալբոմ"
+
+msgid "IDS_MEDIABR_POP_UNABLE_TO_RENAME"
+msgstr "Հնարավոր չէ վերանվանել"
+
+msgid "IDS_MEDIABR_POP_NO_NAME"
+msgstr "Անուն չկա"
+
+msgid "IDS_MEDIABR_POP_NO_ALBUMS_SELECTED"
+msgstr "Ոչ մի ալբոմ չի ընտրվել"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS_SELECTED"
+msgstr "Հատկորոշիչներ չեն ընտրվել"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ITEM"
+msgstr "Ընտրել տարրը"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ALBUM"
+msgstr "Ընտրել ալբոմ"
+
+msgid "IDS_MEDIABR_POP_RETRY_Q"
+msgstr "Կրկին փորձե՞լ"
+
+msgid "IDS_MEDIABR_POP_SAME_NAME_ALREADY_IN_USE"
+msgstr "Նույն անունն արդեն օգտագործվում է"
+
+msgid "IDS_MEDIABR_POP_ENTRY_IS_EMPTY"
+msgstr "Գրառումը դատարկ է"
+
+msgid "IDS_MEDIABR_POP_INVALID_INPUT_PARAMETER"
+msgstr "Անվավեր ներածված պարամետր"
+
+msgid "IDS_MEDIABR_OPT_CREATE_TAG"
+msgstr "Ստեղծ պիտկ"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS"
+msgstr "Հատկորոշիչներ չկան"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_LEFT"
+msgstr "Պտտել ձախ"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_RIGHT"
+msgstr "Պտտել աջ"
+
+msgid "IDS_MEDIABR_BUTTON_SLIDE_SHOW"
+msgstr "Սլյդ շոու"
+
--- /dev/null
+msgid "IDS_MEDIABR_BODY_TAGS"
+msgstr "Merki"
+
+msgid "IDS_MEDIABR_BODY_ALL_ALBUMS"
+msgstr "Allar plötur"
+
+msgid "IDS_MEDIABR_BUTTON_ALBUMS"
+msgstr "Möppur"
+
+msgid "IDS_MEDIABR_BODY_NO_ALBUMS"
+msgstr "Engar möppur"
+
+msgid "IDS_MEDIABR_BODY_SELECT_TAGS"
+msgstr "Velja merki"
+
+msgid "IDS_MEDIABR_OPT_CREATE_ALBUM"
+msgstr "Búa til albúm"
+
+msgid "IDS_MEDIABR_POP_UNABLE_TO_RENAME"
+msgstr "Mistókst að breyta heiti"
+
+msgid "IDS_MEDIABR_POP_NO_NAME"
+msgstr "Ekkert heiti"
+
+msgid "IDS_MEDIABR_POP_NO_ALBUMS_SELECTED"
+msgstr "Engar plötur valdar"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS_SELECTED"
+msgstr "Engin merki valin"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ITEM"
+msgstr "Velja hlut"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ALBUM"
+msgstr "Velja plötu"
+
+msgid "IDS_MEDIABR_POP_RETRY_Q"
+msgstr "Reyna aftur"
+
+msgid "IDS_MEDIABR_POP_SAME_NAME_ALREADY_IN_USE"
+msgstr "Þetta heiti er þegar í notkun"
+
+msgid "IDS_MEDIABR_POP_ENTRY_IS_EMPTY"
+msgstr "Færsla er tóm"
+
+msgid "IDS_MEDIABR_POP_INVALID_INPUT_PARAMETER"
+msgstr "Ógild ílagsfæribreyta"
+
+msgid "IDS_MEDIABR_OPT_CREATE_TAG"
+msgstr "Búa til"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS"
+msgstr "Engin merki"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_LEFT"
+msgstr "Snúið til vinstri"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_RIGHT"
+msgstr "Snúið til hægri"
+
+msgid "IDS_MEDIABR_BUTTON_SLIDE_SHOW"
+msgstr "Skyggnur"
+
--- /dev/null
+msgid "IDS_MEDIABR_BODY_TAGS"
+msgstr "Tag"
+
+msgid "IDS_MEDIABR_BODY_ALL_ALBUMS"
+msgstr "Tutti gli album"
+
+msgid "IDS_MEDIABR_BUTTON_ALBUMS"
+msgstr "Album"
+
+msgid "IDS_MEDIABR_BODY_NO_ALBUMS"
+msgstr "Nessun album"
+
+msgid "IDS_MEDIABR_BODY_SELECT_TAGS"
+msgstr "Seleziona tag"
+
+msgid "IDS_MEDIABR_OPT_CREATE_ALBUM"
+msgstr "Crea album"
+
+msgid "IDS_MEDIABR_POP_UNABLE_TO_RENAME"
+msgstr "Impossibile rinominare"
+
+msgid "IDS_MEDIABR_POP_NO_NAME"
+msgstr "Nessun nome"
+
+msgid "IDS_MEDIABR_POP_NO_ALBUMS_SELECTED"
+msgstr "Nessun album selezionato"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS_SELECTED"
+msgstr "Nessun tag selezionato"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ITEM"
+msgstr "Seleziona elemento"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ALBUM"
+msgstr "Seleziona album"
+
+msgid "IDS_MEDIABR_POP_RETRY_Q"
+msgstr "Riprovare?"
+
+msgid "IDS_MEDIABR_POP_SAME_NAME_ALREADY_IN_USE"
+msgstr "Stesso nome già in uso"
+
+msgid "IDS_MEDIABR_POP_ENTRY_IS_EMPTY"
+msgstr "Voce vuota"
+
+msgid "IDS_MEDIABR_POP_INVALID_INPUT_PARAMETER"
+msgstr "Parametro inserimento non valido"
+
+msgid "IDS_MEDIABR_OPT_CREATE_TAG"
+msgstr "Crea tag"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS"
+msgstr "Nessun tag"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_LEFT"
+msgstr "Ruota a sinistra"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_RIGHT"
+msgstr "Ruota a destra"
+
+msgid "IDS_MEDIABR_BUTTON_SLIDE_SHOW"
+msgstr "Present."
+
--- /dev/null
+msgid "IDS_MEDIABR_BODY_TAGS"
+msgstr "タグ"
+
+msgid "IDS_MEDIABR_BODY_ALL_ALBUMS"
+msgstr "全アルバム"
+
+msgid "IDS_MEDIABR_BUTTON_ALBUMS"
+msgstr "アルバム"
+
+msgid "IDS_MEDIABR_BODY_NO_ALBUMS"
+msgstr "アルバムがありません。"
+
+msgid "IDS_MEDIABR_BODY_SELECT_TAGS"
+msgstr "タグを選択"
+
+msgid "IDS_MEDIABR_OPT_CREATE_ALBUM"
+msgstr "アルバム作成"
+
+msgid "IDS_MEDIABR_POP_UNABLE_TO_RENAME"
+msgstr "名前を変更できません。"
+
+msgid "IDS_MEDIABR_POP_NO_NAME"
+msgstr "名前なし"
+
+msgid "IDS_MEDIABR_POP_NO_ALBUMS_SELECTED"
+msgstr "アルバムが選択されていません。"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS_SELECTED"
+msgstr "タグが選択されていません"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ITEM"
+msgstr "アイテムを選択"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ALBUM"
+msgstr "アルバムを選択"
+
+msgid "IDS_MEDIABR_POP_RETRY_Q"
+msgstr "やり直しますか?"
+
+msgid "IDS_MEDIABR_POP_SAME_NAME_ALREADY_IN_USE"
+msgstr "同じ名前が既に使用されています"
+
+msgid "IDS_MEDIABR_POP_ENTRY_IS_EMPTY"
+msgstr "入力されていません。"
+
+msgid "IDS_MEDIABR_POP_INVALID_INPUT_PARAMETER"
+msgstr "入力パラメータが無効です。"
+
+msgid "IDS_MEDIABR_OPT_CREATE_TAG"
+msgstr "タグ作成"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS"
+msgstr "タグがありません。"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_LEFT"
+msgstr "左に回転"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_RIGHT"
+msgstr "右に回転"
+
+msgid "IDS_MEDIABR_BUTTON_SLIDE_SHOW"
+msgstr "スライドショー"
+
--- /dev/null
+msgid "IDS_MEDIABR_BODY_TAGS"
+msgstr "ტეგები"
+
+msgid "IDS_MEDIABR_BODY_ALL_ALBUMS"
+msgstr "ყველა ალბომი"
+
+msgid "IDS_MEDIABR_BUTTON_ALBUMS"
+msgstr "ალბომები"
+
+msgid "IDS_MEDIABR_BODY_NO_ALBUMS"
+msgstr "ალბომები არ არის"
+
+msgid "IDS_MEDIABR_BODY_SELECT_TAGS"
+msgstr "ჩანართების არჩევა"
+
+msgid "IDS_MEDIABR_OPT_CREATE_ALBUM"
+msgstr "ალბომის შექმნა"
+
+msgid "IDS_MEDIABR_POP_UNABLE_TO_RENAME"
+msgstr "სახელს ვერ შეცვლით"
+
+msgid "IDS_MEDIABR_POP_NO_NAME"
+msgstr "უსახელო"
+
+msgid "IDS_MEDIABR_POP_NO_ALBUMS_SELECTED"
+msgstr "ალბომი არ არის არჩეული"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS_SELECTED"
+msgstr "ჩანართები არ არის არჩეული"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ITEM"
+msgstr "ელემენტის არჩევა"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ALBUM"
+msgstr "ალბომის არჩევა"
+
+msgid "IDS_MEDIABR_POP_RETRY_Q"
+msgstr "თავიდან ვცადო?"
+
+msgid "IDS_MEDIABR_POP_SAME_NAME_ALREADY_IN_USE"
+msgstr "იგივე სახელი უკვე გამოყენებულია"
+
+msgid "IDS_MEDIABR_POP_ENTRY_IS_EMPTY"
+msgstr "ცარიელი ჩანაწ."
+
+msgid "IDS_MEDIABR_POP_INVALID_INPUT_PARAMETER"
+msgstr "შეყვანილი პარამეტრი არასწორია"
+
+msgid "IDS_MEDIABR_OPT_CREATE_TAG"
+msgstr "ჩან.შექმნა"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS"
+msgstr "იარლიყები არაა"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_LEFT"
+msgstr "მარცხნივ მოტრიალება"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_RIGHT"
+msgstr "მარჯვნივ მოტრიალება"
+
+msgid "IDS_MEDIABR_BUTTON_SLIDE_SHOW"
+msgstr "სლაიდ–შოუ"
+
--- /dev/null
+msgid "IDS_MEDIABR_BODY_TAGS"
+msgstr "Белгілер"
+
+msgid "IDS_MEDIABR_BODY_ALL_ALBUMS"
+msgstr "Барлық альбомдар"
+
+msgid "IDS_MEDIABR_BUTTON_ALBUMS"
+msgstr "Альбомдар"
+
+msgid "IDS_MEDIABR_BODY_NO_ALBUMS"
+msgstr "Альбомдар жоқ"
+
+msgid "IDS_MEDIABR_BODY_SELECT_TAGS"
+msgstr "Тегтерді таңдау"
+
+msgid "IDS_MEDIABR_OPT_CREATE_ALBUM"
+msgstr "Альбом жасау"
+
+msgid "IDS_MEDIABR_POP_UNABLE_TO_RENAME"
+msgstr "Атын өзгерту мүмкін емес"
+
+msgid "IDS_MEDIABR_POP_NO_NAME"
+msgstr "Ондай есім жоқ"
+
+msgid "IDS_MEDIABR_POP_NO_ALBUMS_SELECTED"
+msgstr "Альбомдар таңдалмады"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS_SELECTED"
+msgstr "Ешқандай тег таңдалмады"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ITEM"
+msgstr "Элемент таңдау"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ALBUM"
+msgstr "Альбом таңдау"
+
+msgid "IDS_MEDIABR_POP_RETRY_Q"
+msgstr "Қайталау керек пе?"
+
+msgid "IDS_MEDIABR_POP_SAME_NAME_ALREADY_IN_USE"
+msgstr "Мұндай атау қолданыста бар"
+
+msgid "IDS_MEDIABR_POP_ENTRY_IS_EMPTY"
+msgstr "Енгізбе бос"
+
+msgid "IDS_MEDIABR_POP_INVALID_INPUT_PARAMETER"
+msgstr "Жарамсыз енгізу өлшемі"
+
+msgid "IDS_MEDIABR_OPT_CREATE_TAG"
+msgstr "Тег жасау"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS"
+msgstr "Тегтер жоқ"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_LEFT"
+msgstr "Солға бұру"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_RIGHT"
+msgstr "Оңға бұру"
+
+msgid "IDS_MEDIABR_BUTTON_SLIDE_SHOW"
+msgstr "Слайдшоу"
+
--- /dev/null
+msgid "IDS_MEDIABR_BODY_TAGS"
+msgstr "태그"
+
+msgid "IDS_MEDIABR_BODY_ALL_ALBUMS"
+msgstr "모든 앨범"
+
+msgid "IDS_MEDIABR_BUTTON_ALBUMS"
+msgstr "앨범"
+
+msgid "IDS_MEDIABR_BODY_NO_ALBUMS"
+msgstr "앨범이 없습니다"
+
+msgid "IDS_MEDIABR_BODY_SELECT_TAGS"
+msgstr "태그를 선택하세요"
+
+msgid "IDS_MEDIABR_OPT_CREATE_ALBUM"
+msgstr "앨범 추가"
+
+msgid "IDS_MEDIABR_POP_UNABLE_TO_RENAME"
+msgstr "이름을 변경할 수 없습니다"
+
+msgid "IDS_MEDIABR_POP_NO_NAME"
+msgstr "이름이 없습니다"
+
+msgid "IDS_MEDIABR_POP_NO_ALBUMS_SELECTED"
+msgstr "선택된 앨범이 없습니다"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS_SELECTED"
+msgstr "선택된 태그가 없습니다"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ITEM"
+msgstr "항목 선택"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ALBUM"
+msgstr "앨범 선택"
+
+msgid "IDS_MEDIABR_POP_RETRY_Q"
+msgstr "다시 시도할까요?"
+
+msgid "IDS_MEDIABR_POP_SAME_NAME_ALREADY_IN_USE"
+msgstr "사용 중인 이름입니다"
+
+msgid "IDS_MEDIABR_POP_ENTRY_IS_EMPTY"
+msgstr "입력된 내용이 없습니다"
+
+msgid "IDS_MEDIABR_POP_INVALID_INPUT_PARAMETER"
+msgstr "입력값이 바르지 않습니다"
+
+msgid "IDS_MEDIABR_OPT_CREATE_TAG"
+msgstr "태그 추가"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS"
+msgstr "태그 없음"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_LEFT"
+msgstr "왼쪽으로 회전"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_RIGHT"
+msgstr "오른쪽으로 회전"
+
+msgid "IDS_MEDIABR_BUTTON_SLIDE_SHOW"
+msgstr "슬라이드쇼"
+
--- /dev/null
+msgid "IDS_MEDIABR_BODY_TAGS"
+msgstr "Žymos"
+
+msgid "IDS_MEDIABR_BODY_ALL_ALBUMS"
+msgstr "Visi albumai"
+
+msgid "IDS_MEDIABR_BUTTON_ALBUMS"
+msgstr "Albumai"
+
+msgid "IDS_MEDIABR_BODY_NO_ALBUMS"
+msgstr "Albumų nėra"
+
+msgid "IDS_MEDIABR_BODY_SELECT_TAGS"
+msgstr "Pasirinkti žymas"
+
+msgid "IDS_MEDIABR_OPT_CREATE_ALBUM"
+msgstr "Sukurti albumą"
+
+msgid "IDS_MEDIABR_POP_UNABLE_TO_RENAME"
+msgstr "Neįmanoma pervardinti"
+
+msgid "IDS_MEDIABR_POP_NO_NAME"
+msgstr "Nėra vardo"
+
+msgid "IDS_MEDIABR_POP_NO_ALBUMS_SELECTED"
+msgstr "Nėra pasirinktų albumų"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS_SELECTED"
+msgstr "Nėra pasirinktų žymų"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ITEM"
+msgstr "Pasirinkti elementą"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ALBUM"
+msgstr "Pasirinkti albumą"
+
+msgid "IDS_MEDIABR_POP_RETRY_Q"
+msgstr "Bandyti dar kartą?"
+
+msgid "IDS_MEDIABR_POP_SAME_NAME_ALREADY_IN_USE"
+msgstr "Toks pavadinimas jau yra"
+
+msgid "IDS_MEDIABR_POP_ENTRY_IS_EMPTY"
+msgstr "Įrašas tuščias"
+
+msgid "IDS_MEDIABR_POP_INVALID_INPUT_PARAMETER"
+msgstr "Netinkami įvestų duomenų nustatymai"
+
+msgid "IDS_MEDIABR_OPT_CREATE_TAG"
+msgstr "Kurti žymą"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS"
+msgstr "Žymų nėra"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_LEFT"
+msgstr "Sukti į kairę"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_RIGHT"
+msgstr "Sukti į dešinę"
+
+msgid "IDS_MEDIABR_BUTTON_SLIDE_SHOW"
+msgstr "Skaid.rod."
+
--- /dev/null
+msgid "IDS_MEDIABR_BODY_TAGS"
+msgstr "Atzīmes"
+
+msgid "IDS_MEDIABR_BODY_ALL_ALBUMS"
+msgstr "Visi albumi"
+
+msgid "IDS_MEDIABR_BUTTON_ALBUMS"
+msgstr "Albumi"
+
+msgid "IDS_MEDIABR_BODY_NO_ALBUMS"
+msgstr "Nav albumu"
+
+msgid "IDS_MEDIABR_BODY_SELECT_TAGS"
+msgstr "Izvēlēties atzīmes"
+
+msgid "IDS_MEDIABR_OPT_CREATE_ALBUM"
+msgstr "Izveidot albumu"
+
+msgid "IDS_MEDIABR_POP_UNABLE_TO_RENAME"
+msgstr "Nevar pārdēvēt"
+
+msgid "IDS_MEDIABR_POP_NO_NAME"
+msgstr "Nav vārda"
+
+msgid "IDS_MEDIABR_POP_NO_ALBUMS_SELECTED"
+msgstr "Nav izvēlēts neviens albums"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS_SELECTED"
+msgstr "Nav izvēlēta neviena atzīme"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ITEM"
+msgstr "Izvēlieties vienumu"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ALBUM"
+msgstr "Izvēlēties albumu"
+
+msgid "IDS_MEDIABR_POP_RETRY_Q"
+msgstr "Vai mēģināt vēlreiz?"
+
+msgid "IDS_MEDIABR_POP_SAME_NAME_ALREADY_IN_USE"
+msgstr "Šāds nosaukums jau tiek lietots"
+
+msgid "IDS_MEDIABR_POP_ENTRY_IS_EMPTY"
+msgstr "Ieraksts nav norādīts"
+
+msgid "IDS_MEDIABR_POP_INVALID_INPUT_PARAMETER"
+msgstr "Nederīgs ievades parametrs"
+
+msgid "IDS_MEDIABR_OPT_CREATE_TAG"
+msgstr "Izv. atz."
+
+msgid "IDS_MEDIABR_POP_NO_TAGS"
+msgstr "Nav atzīmju"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_LEFT"
+msgstr "Pagriezt pa kreisi"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_RIGHT"
+msgstr "Pagriezt pa labi"
+
+msgid "IDS_MEDIABR_BUTTON_SLIDE_SHOW"
+msgstr "Slaidrāde"
+
--- /dev/null
+msgid "IDS_MEDIABR_BODY_TAGS"
+msgstr "Ознаки"
+
+msgid "IDS_MEDIABR_BODY_ALL_ALBUMS"
+msgstr "Сите албуми"
+
+msgid "IDS_MEDIABR_BUTTON_ALBUMS"
+msgstr "Албуми"
+
+msgid "IDS_MEDIABR_BODY_NO_ALBUMS"
+msgstr "Нема албуми"
+
+msgid "IDS_MEDIABR_BODY_SELECT_TAGS"
+msgstr "Изберете ознаки"
+
+msgid "IDS_MEDIABR_OPT_CREATE_ALBUM"
+msgstr "Нов албум"
+
+msgid "IDS_MEDIABR_POP_UNABLE_TO_RENAME"
+msgstr "Не може да се преименува"
+
+msgid "IDS_MEDIABR_POP_NO_NAME"
+msgstr "Нема име"
+
+msgid "IDS_MEDIABR_POP_NO_ALBUMS_SELECTED"
+msgstr "Не се избрани албуми"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS_SELECTED"
+msgstr "Нема избрано ознаки"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ITEM"
+msgstr "Избери запис"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ALBUM"
+msgstr "Избери албум"
+
+msgid "IDS_MEDIABR_POP_RETRY_Q"
+msgstr "Повторен обид?"
+
+msgid "IDS_MEDIABR_POP_SAME_NAME_ALREADY_IN_USE"
+msgstr "Истото име веќе се користи"
+
+msgid "IDS_MEDIABR_POP_ENTRY_IS_EMPTY"
+msgstr "Записот е празен"
+
+msgid "IDS_MEDIABR_POP_INVALID_INPUT_PARAMETER"
+msgstr "Неважечки влезен параметар"
+
+msgid "IDS_MEDIABR_OPT_CREATE_TAG"
+msgstr "Напр.озн."
+
+msgid "IDS_MEDIABR_POP_NO_TAGS"
+msgstr "Нема ознаки"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_LEFT"
+msgstr "Ротирај лево"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_RIGHT"
+msgstr "Ротирај десно"
+
+msgid "IDS_MEDIABR_BUTTON_SLIDE_SHOW"
+msgstr "Слајдови"
+
--- /dev/null
+msgid "IDS_MEDIABR_BODY_TAGS"
+msgstr "Tagger"
+
+msgid "IDS_MEDIABR_BODY_ALL_ALBUMS"
+msgstr "Alle album"
+
+msgid "IDS_MEDIABR_BUTTON_ALBUMS"
+msgstr "Album"
+
+msgid "IDS_MEDIABR_BODY_NO_ALBUMS"
+msgstr "Ingen album"
+
+msgid "IDS_MEDIABR_BODY_SELECT_TAGS"
+msgstr "Velg tagger"
+
+msgid "IDS_MEDIABR_OPT_CREATE_ALBUM"
+msgstr "Lag album"
+
+msgid "IDS_MEDIABR_POP_UNABLE_TO_RENAME"
+msgstr "Kan ikke gi nytt navn"
+
+msgid "IDS_MEDIABR_POP_NO_NAME"
+msgstr "Ingen navn"
+
+msgid "IDS_MEDIABR_POP_NO_ALBUMS_SELECTED"
+msgstr "Ingen album valgt"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS_SELECTED"
+msgstr "Ingen tagger valgt"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ITEM"
+msgstr "Velg objekt"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ALBUM"
+msgstr "Velg album"
+
+msgid "IDS_MEDIABR_POP_RETRY_Q"
+msgstr "Prøve på nytt?"
+
+msgid "IDS_MEDIABR_POP_SAME_NAME_ALREADY_IN_USE"
+msgstr "Samme navn allerede i bruk"
+
+msgid "IDS_MEDIABR_POP_ENTRY_IS_EMPTY"
+msgstr "Oppføringen er tom"
+
+msgid "IDS_MEDIABR_POP_INVALID_INPUT_PARAMETER"
+msgstr "Ugyldig inndataparameter"
+
+msgid "IDS_MEDIABR_OPT_CREATE_TAG"
+msgstr "Oppr. tagg"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS"
+msgstr "Ingen tagger"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_LEFT"
+msgstr "Roter mot klokken"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_RIGHT"
+msgstr "Roter med klokken"
+
+msgid "IDS_MEDIABR_BUTTON_SLIDE_SHOW"
+msgstr "Bildevisn"
+
--- /dev/null
+msgid "IDS_MEDIABR_BODY_TAGS"
+msgstr "Tags"
+
+msgid "IDS_MEDIABR_BODY_ALL_ALBUMS"
+msgstr "Alle albums"
+
+msgid "IDS_MEDIABR_BUTTON_ALBUMS"
+msgstr "Albums"
+
+msgid "IDS_MEDIABR_BODY_NO_ALBUMS"
+msgstr "Geen albums"
+
+msgid "IDS_MEDIABR_BODY_SELECT_TAGS"
+msgstr "Tags selecteren"
+
+msgid "IDS_MEDIABR_OPT_CREATE_ALBUM"
+msgstr "Album maken"
+
+msgid "IDS_MEDIABR_POP_UNABLE_TO_RENAME"
+msgstr "Kan de naam niet wijzigen"
+
+msgid "IDS_MEDIABR_POP_NO_NAME"
+msgstr "Geen naam"
+
+msgid "IDS_MEDIABR_POP_NO_ALBUMS_SELECTED"
+msgstr "Geen albums geselecteerd"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS_SELECTED"
+msgstr "Geen tags geselecteerd"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ITEM"
+msgstr "Item selecteren"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ALBUM"
+msgstr "Album selecteren"
+
+msgid "IDS_MEDIABR_POP_RETRY_Q"
+msgstr "Opnieuw?"
+
+msgid "IDS_MEDIABR_POP_SAME_NAME_ALREADY_IN_USE"
+msgstr "Naam is al in gebruik"
+
+msgid "IDS_MEDIABR_POP_ENTRY_IS_EMPTY"
+msgstr "Geen gegevens"
+
+msgid "IDS_MEDIABR_POP_INVALID_INPUT_PARAMETER"
+msgstr "Ongeldige invoerparameter"
+
+msgid "IDS_MEDIABR_OPT_CREATE_TAG"
+msgstr "Tag maken"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS"
+msgstr "Geen tags"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_LEFT"
+msgstr "Linksom draaien"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_RIGHT"
+msgstr "Rechtsom draaien"
+
+msgid "IDS_MEDIABR_BUTTON_SLIDE_SHOW"
+msgstr "Diashow"
+
--- /dev/null
+msgid "IDS_MEDIABR_BODY_TAGS"
+msgstr "Etykiety"
+
+msgid "IDS_MEDIABR_BODY_ALL_ALBUMS"
+msgstr "Wszystkie albumy"
+
+msgid "IDS_MEDIABR_BUTTON_ALBUMS"
+msgstr "Albumy"
+
+msgid "IDS_MEDIABR_BODY_NO_ALBUMS"
+msgstr "Brak albumów"
+
+msgid "IDS_MEDIABR_BODY_SELECT_TAGS"
+msgstr "Wybierz etykiety"
+
+msgid "IDS_MEDIABR_OPT_CREATE_ALBUM"
+msgstr "Utwórz album"
+
+msgid "IDS_MEDIABR_POP_UNABLE_TO_RENAME"
+msgstr "Nie można zmienić nazwy"
+
+msgid "IDS_MEDIABR_POP_NO_NAME"
+msgstr "Bez nazwy"
+
+msgid "IDS_MEDIABR_POP_NO_ALBUMS_SELECTED"
+msgstr "Nie wybrano albumów"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS_SELECTED"
+msgstr "Nie wybrano etykiet"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ITEM"
+msgstr "Wybierz element"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ALBUM"
+msgstr "Wybierz album"
+
+msgid "IDS_MEDIABR_POP_RETRY_Q"
+msgstr "Spróbować ponownie?"
+
+msgid "IDS_MEDIABR_POP_SAME_NAME_ALREADY_IN_USE"
+msgstr "Ta sama nazwa jest już w użyciu"
+
+msgid "IDS_MEDIABR_POP_ENTRY_IS_EMPTY"
+msgstr "Wpis jest pusty"
+
+msgid "IDS_MEDIABR_POP_INVALID_INPUT_PARAMETER"
+msgstr "Nieprawidłowy parametr wejściowy"
+
+msgid "IDS_MEDIABR_OPT_CREATE_TAG"
+msgstr "Utw.etyk."
+
+msgid "IDS_MEDIABR_POP_NO_TAGS"
+msgstr "Brak etykiet"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_LEFT"
+msgstr "Obróć w lewo"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_RIGHT"
+msgstr "Obróć w prawo"
+
+msgid "IDS_MEDIABR_BUTTON_SLIDE_SHOW"
+msgstr "Pok. slajd"
+
--- /dev/null
+msgid "IDS_MEDIABR_BODY_TAGS"
+msgstr "Marcas"
+
+msgid "IDS_MEDIABR_BODY_ALL_ALBUMS"
+msgstr "Todos os álbuns"
+
+msgid "IDS_MEDIABR_BUTTON_ALBUMS"
+msgstr "Álbuns"
+
+msgid "IDS_MEDIABR_BODY_NO_ALBUMS"
+msgstr "Nenhum álbum"
+
+msgid "IDS_MEDIABR_BODY_SELECT_TAGS"
+msgstr "Selecionar tags"
+
+msgid "IDS_MEDIABR_OPT_CREATE_ALBUM"
+msgstr "Criar álbum"
+
+msgid "IDS_MEDIABR_POP_UNABLE_TO_RENAME"
+msgstr "Impossível renomear"
+
+msgid "IDS_MEDIABR_POP_NO_NAME"
+msgstr "Sem nome"
+
+msgid "IDS_MEDIABR_POP_NO_ALBUMS_SELECTED"
+msgstr "Nenhum álbum selecionado"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS_SELECTED"
+msgstr "Nenhuma das etiquetas selecionadas"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ITEM"
+msgstr "Selecionar item"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ALBUM"
+msgstr "Selecionar álbum"
+
+msgid "IDS_MEDIABR_POP_RETRY_Q"
+msgstr "Repetir?"
+
+msgid "IDS_MEDIABR_POP_SAME_NAME_ALREADY_IN_USE"
+msgstr "O mesmo nome já está sendo utilizado"
+
+msgid "IDS_MEDIABR_POP_ENTRY_IS_EMPTY"
+msgstr "Entrada vazia"
+
+msgid "IDS_MEDIABR_POP_INVALID_INPUT_PARAMETER"
+msgstr "Parâmetro de entrada inválido"
+
+msgid "IDS_MEDIABR_OPT_CREATE_TAG"
+msgstr "Criar tag"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS"
+msgstr "Sem marcas"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_LEFT"
+msgstr "Girar para a esquerda"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_RIGHT"
+msgstr "Girar para a direita"
+
+msgid "IDS_MEDIABR_BUTTON_SLIDE_SHOW"
+msgstr "Ver slides"
+
--- /dev/null
+msgid "IDS_MEDIABR_BODY_TAGS"
+msgstr "Etiquetas"
+
+msgid "IDS_MEDIABR_BODY_ALL_ALBUMS"
+msgstr "Todos os álbuns"
+
+msgid "IDS_MEDIABR_BUTTON_ALBUMS"
+msgstr "Álbuns"
+
+msgid "IDS_MEDIABR_BODY_NO_ALBUMS"
+msgstr "Nenhuns álbuns"
+
+msgid "IDS_MEDIABR_BODY_SELECT_TAGS"
+msgstr "Seleccionar etiquetas"
+
+msgid "IDS_MEDIABR_OPT_CREATE_ALBUM"
+msgstr "Criar álbum"
+
+msgid "IDS_MEDIABR_POP_UNABLE_TO_RENAME"
+msgstr "Impossível mudar nome"
+
+msgid "IDS_MEDIABR_POP_NO_NAME"
+msgstr "Sem nome"
+
+msgid "IDS_MEDIABR_POP_NO_ALBUMS_SELECTED"
+msgstr "Nenhuns álbuns seleccionados"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS_SELECTED"
+msgstr "Nenhumas etiquetas seleccionadas"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ITEM"
+msgstr "Seleccionar item"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ALBUM"
+msgstr "Seleccionar álbum"
+
+msgid "IDS_MEDIABR_POP_RETRY_Q"
+msgstr "Tentar novamente?"
+
+msgid "IDS_MEDIABR_POP_SAME_NAME_ALREADY_IN_USE"
+msgstr "Já está a ser utilizado o mesmo nome"
+
+msgid "IDS_MEDIABR_POP_ENTRY_IS_EMPTY"
+msgstr "Entrada vazia"
+
+msgid "IDS_MEDIABR_POP_INVALID_INPUT_PARAMETER"
+msgstr "Parâmetro de entrada inválido"
+
+msgid "IDS_MEDIABR_OPT_CREATE_TAG"
+msgstr "Criar etiq."
+
+msgid "IDS_MEDIABR_POP_NO_TAGS"
+msgstr "Sem etiquetas"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_LEFT"
+msgstr "Rodar para a esquerda"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_RIGHT"
+msgstr "Rodar para a direita"
+
+msgid "IDS_MEDIABR_BUTTON_SLIDE_SHOW"
+msgstr "Diaporama"
+
--- /dev/null
+msgid "IDS_MEDIABR_BODY_TAGS"
+msgstr "Etichete"
+
+msgid "IDS_MEDIABR_BODY_ALL_ALBUMS"
+msgstr "Toate albumele"
+
+msgid "IDS_MEDIABR_BUTTON_ALBUMS"
+msgstr "Albume"
+
+msgid "IDS_MEDIABR_BODY_NO_ALBUMS"
+msgstr "Nu există albume"
+
+msgid "IDS_MEDIABR_BODY_SELECT_TAGS"
+msgstr "Selectare etichete"
+
+msgid "IDS_MEDIABR_OPT_CREATE_ALBUM"
+msgstr "Creare album"
+
+msgid "IDS_MEDIABR_POP_UNABLE_TO_RENAME"
+msgstr "Imposibil de redenumit"
+
+msgid "IDS_MEDIABR_POP_NO_NAME"
+msgstr "Nici un nume"
+
+msgid "IDS_MEDIABR_POP_NO_ALBUMS_SELECTED"
+msgstr "Nu sunt albume selectate"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS_SELECTED"
+msgstr "Nu a fost selectată nicio etichetă"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ITEM"
+msgstr "Selectaţi elementul"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ALBUM"
+msgstr "Selectare album"
+
+msgid "IDS_MEDIABR_POP_RETRY_Q"
+msgstr "Reîncercaţi?"
+
+msgid "IDS_MEDIABR_POP_SAME_NAME_ALREADY_IN_USE"
+msgstr "Acelaşi nume deja în uz"
+
+msgid "IDS_MEDIABR_POP_ENTRY_IS_EMPTY"
+msgstr "Locaţie liberă"
+
+msgid "IDS_MEDIABR_POP_INVALID_INPUT_PARAMETER"
+msgstr "Parametru de intrare incorect"
+
+msgid "IDS_MEDIABR_OPT_CREATE_TAG"
+msgstr "Creare"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS"
+msgstr "Nicio etichetă"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_LEFT"
+msgstr "Rotire stânga"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_RIGHT"
+msgstr "Rotire dreapta"
+
+msgid "IDS_MEDIABR_BUTTON_SLIDE_SHOW"
+msgstr "Ex. diap."
+
--- /dev/null
+msgid "IDS_MEDIABR_BODY_TAGS"
+msgstr "Метки"
+
+msgid "IDS_MEDIABR_BODY_ALL_ALBUMS"
+msgstr "Все альбомы"
+
+msgid "IDS_MEDIABR_BUTTON_ALBUMS"
+msgstr "Альбомы"
+
+msgid "IDS_MEDIABR_BODY_NO_ALBUMS"
+msgstr "Нет альбомов"
+
+msgid "IDS_MEDIABR_BODY_SELECT_TAGS"
+msgstr "Выберите теги"
+
+msgid "IDS_MEDIABR_OPT_CREATE_ALBUM"
+msgstr "Создать альбом"
+
+msgid "IDS_MEDIABR_POP_UNABLE_TO_RENAME"
+msgstr "Невозможно переименовать"
+
+msgid "IDS_MEDIABR_POP_NO_NAME"
+msgstr "Нет имени"
+
+msgid "IDS_MEDIABR_POP_NO_ALBUMS_SELECTED"
+msgstr "Альбомы не выбраны"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS_SELECTED"
+msgstr "Не выбраны метки"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ITEM"
+msgstr "Выберите элемент"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ALBUM"
+msgstr "Выберите альбом"
+
+msgid "IDS_MEDIABR_POP_RETRY_Q"
+msgstr "Повторить?"
+
+msgid "IDS_MEDIABR_POP_SAME_NAME_ALREADY_IN_USE"
+msgstr "Имя уже используется"
+
+msgid "IDS_MEDIABR_POP_ENTRY_IS_EMPTY"
+msgstr "Пустая запись"
+
+msgid "IDS_MEDIABR_POP_INVALID_INPUT_PARAMETER"
+msgstr "Неверные параметры ввода"
+
+msgid "IDS_MEDIABR_OPT_CREATE_TAG"
+msgstr "Создать метку"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS"
+msgstr "Нет меток"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_LEFT"
+msgstr "Повернуть влево"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_RIGHT"
+msgstr "Повернуть вправо"
+
+msgid "IDS_MEDIABR_BUTTON_SLIDE_SHOW"
+msgstr "Слайд-шоу"
+
--- /dev/null
+msgid "IDS_MEDIABR_BODY_TAGS"
+msgstr "Značky"
+
+msgid "IDS_MEDIABR_BODY_ALL_ALBUMS"
+msgstr "Všetky albumy"
+
+msgid "IDS_MEDIABR_BUTTON_ALBUMS"
+msgstr "Albumy"
+
+msgid "IDS_MEDIABR_BODY_NO_ALBUMS"
+msgstr "Žiadne albumy"
+
+msgid "IDS_MEDIABR_BODY_SELECT_TAGS"
+msgstr "Vybrať značky"
+
+msgid "IDS_MEDIABR_OPT_CREATE_ALBUM"
+msgstr "Vytvoriť album"
+
+msgid "IDS_MEDIABR_POP_UNABLE_TO_RENAME"
+msgstr "Nedá sa premenovať"
+
+msgid "IDS_MEDIABR_POP_NO_NAME"
+msgstr "Žiadny názov"
+
+msgid "IDS_MEDIABR_POP_NO_ALBUMS_SELECTED"
+msgstr "Nie sú vybraté žiadne albumy"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS_SELECTED"
+msgstr "Žiadne vybraté značky"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ITEM"
+msgstr "Vybrať položku"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ALBUM"
+msgstr "Vybrať album"
+
+msgid "IDS_MEDIABR_POP_RETRY_Q"
+msgstr "Opakovať?"
+
+msgid "IDS_MEDIABR_POP_SAME_NAME_ALREADY_IN_USE"
+msgstr "Rovnaký názov sa už používa"
+
+msgid "IDS_MEDIABR_POP_ENTRY_IS_EMPTY"
+msgstr "Prázdna položka"
+
+msgid "IDS_MEDIABR_POP_INVALID_INPUT_PARAMETER"
+msgstr "Neplatný vstupný parameter"
+
+msgid "IDS_MEDIABR_OPT_CREATE_TAG"
+msgstr "Vytv. zn."
+
+msgid "IDS_MEDIABR_POP_NO_TAGS"
+msgstr "Žiadne značky"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_LEFT"
+msgstr "Otočiť doľava"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_RIGHT"
+msgstr "Otočiť doprava"
+
+msgid "IDS_MEDIABR_BUTTON_SLIDE_SHOW"
+msgstr "Prezent."
+
--- /dev/null
+msgid "IDS_MEDIABR_BODY_TAGS"
+msgstr "Oznake"
+
+msgid "IDS_MEDIABR_BODY_ALL_ALBUMS"
+msgstr "Vsi albumi"
+
+msgid "IDS_MEDIABR_BUTTON_ALBUMS"
+msgstr "Albumi"
+
+msgid "IDS_MEDIABR_BODY_NO_ALBUMS"
+msgstr "Ni albumov"
+
+msgid "IDS_MEDIABR_BODY_SELECT_TAGS"
+msgstr "Izberi oznake"
+
+msgid "IDS_MEDIABR_OPT_CREATE_ALBUM"
+msgstr "Ustvari album"
+
+msgid "IDS_MEDIABR_POP_UNABLE_TO_RENAME"
+msgstr "Ni mogoče preimenovati"
+
+msgid "IDS_MEDIABR_POP_NO_NAME"
+msgstr "Brez imena"
+
+msgid "IDS_MEDIABR_POP_NO_ALBUMS_SELECTED"
+msgstr "Ni izbranih albumov"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS_SELECTED"
+msgstr "Ni izbranih oznak"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ITEM"
+msgstr "Izberi predmet"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ALBUM"
+msgstr "Izberite album"
+
+msgid "IDS_MEDIABR_POP_RETRY_Q"
+msgstr "Poskusim znova?"
+
+msgid "IDS_MEDIABR_POP_SAME_NAME_ALREADY_IN_USE"
+msgstr "XXX se že uporablja"
+
+msgid "IDS_MEDIABR_POP_ENTRY_IS_EMPTY"
+msgstr "Prazen vnos"
+
+msgid "IDS_MEDIABR_POP_INVALID_INPUT_PARAMETER"
+msgstr "Neveljaven vhodni parameter"
+
+msgid "IDS_MEDIABR_OPT_CREATE_TAG"
+msgstr "Ustv. ozn."
+
+msgid "IDS_MEDIABR_POP_NO_TAGS"
+msgstr "Brez oznak"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_LEFT"
+msgstr "Zavrti v levo"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_RIGHT"
+msgstr "Zavrti v desno"
+
+msgid "IDS_MEDIABR_BUTTON_SLIDE_SHOW"
+msgstr "Diaproj."
+
--- /dev/null
+msgid "IDS_MEDIABR_BODY_TAGS"
+msgstr "Oznake"
+
+msgid "IDS_MEDIABR_BODY_ALL_ALBUMS"
+msgstr "Svi albumi"
+
+msgid "IDS_MEDIABR_BUTTON_ALBUMS"
+msgstr "Albumi"
+
+msgid "IDS_MEDIABR_BODY_NO_ALBUMS"
+msgstr "Nema albuma"
+
+msgid "IDS_MEDIABR_BODY_SELECT_TAGS"
+msgstr "Izaberi oznake"
+
+msgid "IDS_MEDIABR_OPT_CREATE_ALBUM"
+msgstr "Kreiraj album"
+
+msgid "IDS_MEDIABR_POP_UNABLE_TO_RENAME"
+msgstr "Nemoguće preimenovati"
+
+msgid "IDS_MEDIABR_POP_NO_NAME"
+msgstr "Nema imena"
+
+msgid "IDS_MEDIABR_POP_NO_ALBUMS_SELECTED"
+msgstr "Albumi nisu izabrani"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS_SELECTED"
+msgstr "Nema izabranih oznaka"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ITEM"
+msgstr "Izaberi objekat"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ALBUM"
+msgstr "Izaberi album"
+
+msgid "IDS_MEDIABR_POP_RETRY_Q"
+msgstr "Ponovi?"
+
+msgid "IDS_MEDIABR_POP_SAME_NAME_ALREADY_IN_USE"
+msgstr "Taj naziv je već u upotrebi"
+
+msgid "IDS_MEDIABR_POP_ENTRY_IS_EMPTY"
+msgstr "Unos je prazan"
+
+msgid "IDS_MEDIABR_POP_INVALID_INPUT_PARAMETER"
+msgstr "Neispravan ulazni parametar"
+
+msgid "IDS_MEDIABR_OPT_CREATE_TAG"
+msgstr "Označi"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS"
+msgstr "Bez oznaka"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_LEFT"
+msgstr "Rotiraj ulevo"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_RIGHT"
+msgstr "Rotiraj udesno"
+
+msgid "IDS_MEDIABR_BUTTON_SLIDE_SHOW"
+msgstr "Slajd-šou"
+
--- /dev/null
+msgid "IDS_MEDIABR_BODY_TAGS"
+msgstr "Taggar"
+
+msgid "IDS_MEDIABR_BODY_ALL_ALBUMS"
+msgstr "Alla album"
+
+msgid "IDS_MEDIABR_BUTTON_ALBUMS"
+msgstr "Album"
+
+msgid "IDS_MEDIABR_BODY_NO_ALBUMS"
+msgstr "Inga album"
+
+msgid "IDS_MEDIABR_BODY_SELECT_TAGS"
+msgstr "Välj taggar"
+
+msgid "IDS_MEDIABR_OPT_CREATE_ALBUM"
+msgstr "Skapa album"
+
+msgid "IDS_MEDIABR_POP_UNABLE_TO_RENAME"
+msgstr "Kan inte byta namn"
+
+msgid "IDS_MEDIABR_POP_NO_NAME"
+msgstr "Inget namn"
+
+msgid "IDS_MEDIABR_POP_NO_ALBUMS_SELECTED"
+msgstr "Inga valda album"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS_SELECTED"
+msgstr "Inga valda taggar"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ITEM"
+msgstr "Välj objekt"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ALBUM"
+msgstr "Välj album"
+
+msgid "IDS_MEDIABR_POP_RETRY_Q"
+msgstr "Försök igen?"
+
+msgid "IDS_MEDIABR_POP_SAME_NAME_ALREADY_IN_USE"
+msgstr "Detta namn används redan"
+
+msgid "IDS_MEDIABR_POP_ENTRY_IS_EMPTY"
+msgstr "Posten är tom"
+
+msgid "IDS_MEDIABR_POP_INVALID_INPUT_PARAMETER"
+msgstr "Felaktig indataparameter"
+
+msgid "IDS_MEDIABR_OPT_CREATE_TAG"
+msgstr "Skapa tagg"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS"
+msgstr "Inga taggar"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_LEFT"
+msgstr "Rotera moturs"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_RIGHT"
+msgstr "Rotera medurs"
+
+msgid "IDS_MEDIABR_BUTTON_SLIDE_SHOW"
+msgstr "Bildspel"
+
--- /dev/null
+msgid "IDS_MEDIABR_BODY_TAGS"
+msgstr "Etiketler"
+
+msgid "IDS_MEDIABR_BODY_ALL_ALBUMS"
+msgstr "Tüm albümler"
+
+msgid "IDS_MEDIABR_BUTTON_ALBUMS"
+msgstr "Albümler"
+
+msgid "IDS_MEDIABR_BODY_NO_ALBUMS"
+msgstr "Albüm yok"
+
+msgid "IDS_MEDIABR_BODY_SELECT_TAGS"
+msgstr "İmleri seçin"
+
+msgid "IDS_MEDIABR_OPT_CREATE_ALBUM"
+msgstr "Albüm oluştur"
+
+msgid "IDS_MEDIABR_POP_UNABLE_TO_RENAME"
+msgstr "Yeniden adlandırılamıyor. Dosya kullanımda."
+
+msgid "IDS_MEDIABR_POP_NO_NAME"
+msgstr "İsim yok"
+
+msgid "IDS_MEDIABR_POP_NO_ALBUMS_SELECTED"
+msgstr "Albüm seçilmedi"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS_SELECTED"
+msgstr "İm seçili değil"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ITEM"
+msgstr "Öğe seç"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ALBUM"
+msgstr "Albüm seç"
+
+msgid "IDS_MEDIABR_POP_RETRY_Q"
+msgstr "Tekrar denensin mi?"
+
+msgid "IDS_MEDIABR_POP_SAME_NAME_ALREADY_IN_USE"
+msgstr "İsim zaten kullanımda"
+
+msgid "IDS_MEDIABR_POP_ENTRY_IS_EMPTY"
+msgstr "Girdi yok"
+
+msgid "IDS_MEDIABR_POP_INVALID_INPUT_PARAMETER"
+msgstr "Geçersiz giriş parametresi"
+
+msgid "IDS_MEDIABR_OPT_CREATE_TAG"
+msgstr "İm oluştur"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS"
+msgstr "Etiket yok"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_LEFT"
+msgstr "Saat yönünün tersine döndür"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_RIGHT"
+msgstr "Saat yönünde döndür"
+
+msgid "IDS_MEDIABR_BUTTON_SLIDE_SHOW"
+msgstr "Slayt şov"
+
--- /dev/null
+msgid "IDS_MEDIABR_BODY_TAGS"
+msgstr "Теги"
+
+msgid "IDS_MEDIABR_BODY_ALL_ALBUMS"
+msgstr "Усі альбоми"
+
+msgid "IDS_MEDIABR_BUTTON_ALBUMS"
+msgstr "Альбоми"
+
+msgid "IDS_MEDIABR_BODY_NO_ALBUMS"
+msgstr "Немає альбомів"
+
+msgid "IDS_MEDIABR_BODY_SELECT_TAGS"
+msgstr "Виберіть теги"
+
+msgid "IDS_MEDIABR_OPT_CREATE_ALBUM"
+msgstr "Створити альбом"
+
+msgid "IDS_MEDIABR_POP_UNABLE_TO_RENAME"
+msgstr "Неможливо перейменувати"
+
+msgid "IDS_MEDIABR_POP_NO_NAME"
+msgstr "Немає імені"
+
+msgid "IDS_MEDIABR_POP_NO_ALBUMS_SELECTED"
+msgstr "Не вибрано альбомів"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS_SELECTED"
+msgstr "Не вибрано тегів"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ITEM"
+msgstr "Виберіть елемент"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ALBUM"
+msgstr "Вибір альбому"
+
+msgid "IDS_MEDIABR_POP_RETRY_Q"
+msgstr "Повторити?"
+
+msgid "IDS_MEDIABR_POP_SAME_NAME_ALREADY_IN_USE"
+msgstr "Ім’я вже використовується"
+
+msgid "IDS_MEDIABR_POP_ENTRY_IS_EMPTY"
+msgstr "Запис порожній"
+
+msgid "IDS_MEDIABR_POP_INVALID_INPUT_PARAMETER"
+msgstr "Неправильний вхідний параметр"
+
+msgid "IDS_MEDIABR_OPT_CREATE_TAG"
+msgstr "Створ. тег"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS"
+msgstr "Без тегів"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_LEFT"
+msgstr "Обернути ліворуч"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_RIGHT"
+msgstr "Обернути праворуч"
+
+msgid "IDS_MEDIABR_BUTTON_SLIDE_SHOW"
+msgstr "Слайд-шоу"
+
--- /dev/null
+#!/bin/sh
+
+PACKAGE=gallery
+SRCROOT=..
+POTFILES=POTFILES.in
+
+#ALL_LINGUAS= am az be ca cs da de el en_CA en_GB es et fi fr hr hu it ja ko lv mk ml ms nb ne nl pa pl pt pt_BR ru rw sk sl sr sr@Latn sv ta tr uk vi zh_CN zh_TW
+ALL_LINGUAS="en_US en_GB ja ko zh_CN"
+
+XGETTEXT=/usr/bin/xgettext
+MSGMERGE=/usr/bin/msgmerge
+
+echo -n "Make ${PACKAGE}.pot "
+if [ ! -e $POTFILES ] ; then
+ echo "$POTFILES not found"
+ exit 1
+fi
+
+$XGETTEXT --default-domain=${PACKAGE} --directory=${SRCROOT} \
+ --add-comments --keyword=_ --keyword=N_ --files-from=$POTFILES
+if [ $? -ne 0 ]; then
+ echo "xgettext error"
+ exit 1
+fi
+
+if [ ! -f ${PACKAGE}.po ]; then
+ echo "No such file: ${PACKAGE}.po"
+ exit 1
+fi
+
+rm -f ${PACKAGE}.pot && mv ${PACKAGE}.po ${PACKAGE}.pot
+echo "done"
+
+for LANG in $ALL_LINGUAS; do
+ echo "$LANG : "
+
+ if [ ! -e $LANG.po ] ; then
+ sed 's/CHARSET/UTF-8/g' ${PACKAGE}.pot > ${LANG}.po
+ echo "${LANG}.po created"
+ else
+ if $MSGMERGE ${LANG}.po ${PACKAGE}.pot -o ${LANG}.new.po ; then
+ if cmp ${LANG}.po ${LANG}.new.po > /dev/null 2>&1; then
+ rm -f ${LANG}.new.po
+ else
+ if mv -f ${LANG}.new.po ${LANG}.po; then
+ echo ""
+ else
+ echo "msgmerge for $LANG.po failed: cannot move $LANG.new.po to $LANG.po" 1>&2
+ rm -f ${LANG}.new.po
+ exit 1
+ fi
+ fi
+ else
+ echo "msgmerge for $LANG failed!"
+ rm -f ${LANG}.new.po
+ fi
+ fi
+ echo ""
+done
+
--- /dev/null
+msgid "IDS_MEDIABR_BODY_TAGS"
+msgstr "Teglar"
+
+msgid "IDS_MEDIABR_BODY_ALL_ALBUMS"
+msgstr "Barcha albomlar"
+
+msgid "IDS_MEDIABR_BUTTON_ALBUMS"
+msgstr "Albom"
+
+msgid "IDS_MEDIABR_BODY_NO_ALBUMS"
+msgstr "Albomlar yo‘q"
+
+msgid "IDS_MEDIABR_BODY_SELECT_TAGS"
+msgstr "Teglarni tanlang"
+
+msgid "IDS_MEDIABR_OPT_CREATE_ALBUM"
+msgstr "Albom yaratish"
+
+msgid "IDS_MEDIABR_POP_UNABLE_TO_RENAME"
+msgstr "Nomini o‘zgartirib bo‘lmaydi"
+
+msgid "IDS_MEDIABR_POP_NO_NAME"
+msgstr "Nom yo‘q"
+
+msgid "IDS_MEDIABR_POP_NO_ALBUMS_SELECTED"
+msgstr "Albom tanlanmagan"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS_SELECTED"
+msgstr "Hech qanday teg tanlanmagan"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ITEM"
+msgstr "Element tanlang"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ALBUM"
+msgstr "Albom tanlash"
+
+msgid "IDS_MEDIABR_POP_RETRY_Q"
+msgstr "Qayta urinib ko‘rilsinmi?"
+
+msgid "IDS_MEDIABR_POP_SAME_NAME_ALREADY_IN_USE"
+msgstr "Bunday nom avvaldan ishlatilmoqda"
+
+msgid "IDS_MEDIABR_POP_ENTRY_IS_EMPTY"
+msgstr "Kiritish bo‘sh"
+
+msgid "IDS_MEDIABR_POP_INVALID_INPUT_PARAMETER"
+msgstr "Noto‘g‘ri kiritish parametri"
+
+msgid "IDS_MEDIABR_OPT_CREATE_TAG"
+msgstr "Teg yarat"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS"
+msgstr "Teglar yo‘q"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_LEFT"
+msgstr "Chapga aylantir."
+
+msgid "IDS_MEDIABR_OPT_ROTATE_RIGHT"
+msgstr "O‘ngga aylantir."
+
+msgid "IDS_MEDIABR_BUTTON_SLIDE_SHOW"
+msgstr "Slayd-shou"
+
--- /dev/null
+msgid "IDS_MEDIABR_BODY_TAGS"
+msgstr "标签"
+
+msgid "IDS_MEDIABR_BODY_ALL_ALBUMS"
+msgstr "所有相册"
+
+msgid "IDS_MEDIABR_BUTTON_ALBUMS"
+msgstr "专辑"
+
+msgid "IDS_MEDIABR_BODY_NO_ALBUMS"
+msgstr "沒有专辑"
+
+msgid "IDS_MEDIABR_BODY_SELECT_TAGS"
+msgstr "选择标签"
+
+msgid "IDS_MEDIABR_OPT_CREATE_ALBUM"
+msgstr "新建相册"
+
+msgid "IDS_MEDIABR_POP_UNABLE_TO_RENAME"
+msgstr "无法重命名"
+
+msgid "IDS_MEDIABR_POP_NO_NAME"
+msgstr "无名称"
+
+msgid "IDS_MEDIABR_POP_NO_ALBUMS_SELECTED"
+msgstr "未选择音乐库"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS_SELECTED"
+msgstr "没有选择标签"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ITEM"
+msgstr "选择项目"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ALBUM"
+msgstr "选择相册"
+
+msgid "IDS_MEDIABR_POP_RETRY_Q"
+msgstr "重试?"
+
+msgid "IDS_MEDIABR_POP_SAME_NAME_ALREADY_IN_USE"
+msgstr "相同名字已使用"
+
+msgid "IDS_MEDIABR_POP_ENTRY_IS_EMPTY"
+msgstr "空记录"
+
+msgid "IDS_MEDIABR_POP_INVALID_INPUT_PARAMETER"
+msgstr "输入参数无效"
+
+msgid "IDS_MEDIABR_OPT_CREATE_TAG"
+msgstr "创建标签"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS"
+msgstr "无标签"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_LEFT"
+msgstr "向左旋转"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_RIGHT"
+msgstr "向右旋转"
+
+msgid "IDS_MEDIABR_BUTTON_SLIDE_SHOW"
+msgstr "幻灯片"
+
--- /dev/null
+msgid "IDS_MEDIABR_BODY_TAGS"
+msgstr "標籤"
+
+msgid "IDS_MEDIABR_BODY_ALL_ALBUMS"
+msgstr "全部專輯"
+
+msgid "IDS_MEDIABR_BUTTON_ALBUMS"
+msgstr "專輯"
+
+msgid "IDS_MEDIABR_BODY_NO_ALBUMS"
+msgstr "無專輯"
+
+msgid "IDS_MEDIABR_BODY_SELECT_TAGS"
+msgstr "選擇標籤"
+
+msgid "IDS_MEDIABR_OPT_CREATE_ALBUM"
+msgstr "建立相簿"
+
+msgid "IDS_MEDIABR_POP_UNABLE_TO_RENAME"
+msgstr "無法重新命名"
+
+msgid "IDS_MEDIABR_POP_NO_NAME"
+msgstr "無名稱"
+
+msgid "IDS_MEDIABR_POP_NO_ALBUMS_SELECTED"
+msgstr "未選擇專輯"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS_SELECTED"
+msgstr "標籤未選取"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ITEM"
+msgstr "選擇項目"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ALBUM"
+msgstr "選擇專輯"
+
+msgid "IDS_MEDIABR_POP_RETRY_Q"
+msgstr "要重試嗎?"
+
+msgid "IDS_MEDIABR_POP_SAME_NAME_ALREADY_IN_USE"
+msgstr "相同名稱已被使用"
+
+msgid "IDS_MEDIABR_POP_ENTRY_IS_EMPTY"
+msgstr "空白記錄"
+
+msgid "IDS_MEDIABR_POP_INVALID_INPUT_PARAMETER"
+msgstr "輸入參數無效"
+
+msgid "IDS_MEDIABR_OPT_CREATE_TAG"
+msgstr "建立標籤"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS"
+msgstr "無標籤"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_LEFT"
+msgstr "左轉"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_RIGHT"
+msgstr "右轉"
+
+msgid "IDS_MEDIABR_BUTTON_SLIDE_SHOW"
+msgstr "投影片放映"
+
--- /dev/null
+msgid "IDS_MEDIABR_BODY_TAGS"
+msgstr "标签"
+
+msgid "IDS_MEDIABR_BODY_ALL_ALBUMS"
+msgstr "所有相册"
+
+msgid "IDS_MEDIABR_BUTTON_ALBUMS"
+msgstr "相册"
+
+msgid "IDS_MEDIABR_BODY_NO_ALBUMS"
+msgstr "无相册"
+
+msgid "IDS_MEDIABR_BODY_SELECT_TAGS"
+msgstr "选择标签"
+
+msgid "IDS_MEDIABR_OPT_CREATE_ALBUM"
+msgstr "新建相册"
+
+msgid "IDS_MEDIABR_POP_UNABLE_TO_RENAME"
+msgstr "无法重命名"
+
+msgid "IDS_MEDIABR_POP_NO_NAME"
+msgstr "无名称"
+
+msgid "IDS_MEDIABR_POP_NO_ALBUMS_SELECTED"
+msgstr "未选择音乐库"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS_SELECTED"
+msgstr "没有选择标签"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ITEM"
+msgstr "选择项目"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ALBUM"
+msgstr "选择音乐库"
+
+msgid "IDS_MEDIABR_POP_RETRY_Q"
+msgstr "重试?"
+
+msgid "IDS_MEDIABR_POP_SAME_NAME_ALREADY_IN_USE"
+msgstr "相同名称已在使用"
+
+msgid "IDS_MEDIABR_POP_ENTRY_IS_EMPTY"
+msgstr "空记录"
+
+msgid "IDS_MEDIABR_POP_INVALID_INPUT_PARAMETER"
+msgstr "输入参数无效"
+
+msgid "IDS_MEDIABR_OPT_CREATE_TAG"
+msgstr "创建标签"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS"
+msgstr "无标签"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_LEFT"
+msgstr "向左旋转"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_RIGHT"
+msgstr "向右旋转"
+
+msgid "IDS_MEDIABR_BUTTON_SLIDE_SHOW"
+msgstr "幻灯片"
+
--- /dev/null
+msgid "IDS_MEDIABR_BODY_TAGS"
+msgstr "標籤"
+
+msgid "IDS_MEDIABR_BODY_ALL_ALBUMS"
+msgstr "所有相簿"
+
+msgid "IDS_MEDIABR_BUTTON_ALBUMS"
+msgstr "相簿"
+
+msgid "IDS_MEDIABR_BODY_NO_ALBUMS"
+msgstr "無專輯"
+
+msgid "IDS_MEDIABR_BODY_SELECT_TAGS"
+msgstr "選擇關鍵字"
+
+msgid "IDS_MEDIABR_OPT_CREATE_ALBUM"
+msgstr "建立專輯"
+
+msgid "IDS_MEDIABR_POP_UNABLE_TO_RENAME"
+msgstr "無法重新命名"
+
+msgid "IDS_MEDIABR_POP_NO_NAME"
+msgstr "無姓名"
+
+msgid "IDS_MEDIABR_POP_NO_ALBUMS_SELECTED"
+msgstr "未選擇相簿"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS_SELECTED"
+msgstr "沒有選擇標籤"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ITEM"
+msgstr "選擇項目"
+
+msgid "IDS_MEDIABR_HEADER_SELECT_ALBUM"
+msgstr "選擇專輯"
+
+msgid "IDS_MEDIABR_POP_RETRY_Q"
+msgstr "要重試嗎?"
+
+msgid "IDS_MEDIABR_POP_SAME_NAME_ALREADY_IN_USE"
+msgstr "相同名稱已在使用中"
+
+msgid "IDS_MEDIABR_POP_ENTRY_IS_EMPTY"
+msgstr "項目為空"
+
+msgid "IDS_MEDIABR_POP_INVALID_INPUT_PARAMETER"
+msgstr "輸入參數無效"
+
+msgid "IDS_MEDIABR_OPT_CREATE_TAG"
+msgstr "建立標籤"
+
+msgid "IDS_MEDIABR_POP_NO_TAGS"
+msgstr "無標籤"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_LEFT"
+msgstr "向左旋轉"
+
+msgid "IDS_MEDIABR_OPT_ROTATE_RIGHT"
+msgstr "向右旋轉"
+
+msgid "IDS_MEDIABR_BUTTON_SLIDE_SHOW"
+msgstr "投影片放映"
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* Definition of image path used in edc file */
+
+/* gl-nocontents.edc */
+#define GALLERY_EDC_IMAGE_NOCONTENTS_PIC "T01_Nocontents_picture.png"
+
+/* gl-gengrid-item-albums.edc */
+#define GALLERY_EDC_IMAGE_MAIN_FOLDER_BG "T01_main_folder_bg.png"
+
+/* gl-gengrid-item-thumbview.edc */
+#define GALLERY_EDC_IMAGE_BUTTON_PLAY "T01_btn_play.png"
+
+/* gallery.edc */
+#define GALLERY_EDC_IMAGE_CONTROL_TABBAR_BG "00_winset_title_tabbar_bg.png"
+
+#define GALLERY_EDC_SOUND_TOUCH_30MS "S_Touch_30ms.wav"
+
+/* gl-check.edc */
+#define GALLERY_EDC_IMAGE_CHECK_BG "T01_checkbox.png"
+#define GALLERY_EDC_IMAGE_CHECK_ALBUM_BG "T01_album_checkbox.png"
+#define GALLERY_EDC_IMAGE_CHECK_BG_DIM "00_check_bg_dim.png"
+#define GALLERY_EDC_IMAGE_CHECK_BG_CHECKING "T01_check.png"
+#define GALLERY_EDC_IMAGE_CHECK_ALBUM_BG_CHECKING "T01_album_checkbox_check.png"
+#define GALLERY_EDC_IMAGE_CHECK_GRID "T01_grid_select_check.png"
+
+/* gl-entry.edc */
+#define GALLERY_EDC_IMAGE_EDITFIELD_CLEAR "00_EditField_clear.png"
+#define GALLERY_EDC_IMAGE_EDITFIELD_CLEAR_PRESS "00_EditField_clear_press.png"
+#define GALLERY_EDC_IMAGE_SEARCH_INPUT_FIELD_BG "00_search_input_field_bg.png"
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define FONT_ROM "SLP:style=Roman"
+#define FONT_MED "SLP:style=Medium"
+#define INDICATOR_H 27
+#define NAVI_H 67
+#define GALLERY_EDC_COLOR_THEME_GRAY 91 91 91 255
+#define GALLERY_EDC_COLOR_BG 248 246 239 255
+#define ENTRY_H 112
+#define ENTRY_MAX_W 1280
+#define CONTROLBAR_LARGE_HEIGHT_INC 117
+#define CONTROLBAR_SMALL_HEIGHT_INC 98
+/* Set select all bg color same as genlist */
+#define GENLIST_SELECT_ALL_BG_COLOR 220 218 211 255
+#define SELECT_ALL_BG_COLOR GENLIST_SELECT_ALL_BG_COLOR
+#define NAVIFRAME_TITLE_BG_COLOR_INC 248 246 239 255
+#define GENLIST_PART_BOTTOM_LINE_COLOR_VIDEO 82 82 82 255
+#define SELINFO_H 48
+
+#include "gallery-edc-res.h"
+
+collections {
+#include "gl-genlist-item-tags.edc"
+#include "gl-genlist-sweep.edc"
+#include "gl-gengrid-item-thumbview.edc"
+#include "gl-gengrid-item-albums.edc"
+#include "gl-check.edc"
+#include "gl-nocontents.edc"
+#include "gl-entry.edc"
+
+ group {
+ name: "gallery/controlbar_layout";
+ parts {
+ part {
+ name: "background";
+ type, RECT;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; offset: 0 0; }
+ rel2 { relative: 1.0 1.0; offset: -1 -1; }
+ color: GALLERY_EDC_COLOR_BG;
+ }
+
+ }
+ part {
+ name: "elm.swallow.tabbar";
+ type: SWALLOW;
+ mouse_events: 1;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ min: 0 CONTROLBAR_LARGE_HEIGHT_INC;
+ fixed: 1 1;
+ align: 0.5 0.0;
+ rel1 { relative: 0.0 0.0;}
+ rel2 { relative: 1.0 0.0;}
+ }
+ description {
+ state: "landscape" 0.0;
+ inherit: "default" 0.0;
+ min: 0 CONTROLBAR_SMALL_HEIGHT_INC;
+ }
+ description {
+ state: "hide" 0.0;
+ inherit: "default" 0.0;
+ min: 0 0;
+ max: 0 0;
+ visible: 0;
+ }
+#ifdef _USE_DALI
+ description {
+ state: "default_invisible" 0.0;
+ min: 0 CONTROLBAR_LARGE_HEIGHT_INC;
+ fixed: 1 1;
+ align: 0.5 0.0;
+ rel1 { relative: 0.0 0.0;}
+ rel2 { relative: 1.0 0.0;}
+ visible: 0;
+ }
+ description {
+ state: "landscape_invisible" 0.0;
+ inherit: "default" 0.0;
+ min: 0 CONTROLBAR_SMALL_HEIGHT_INC;
+ visible: 0;
+ }
+#endif
+ }
+ part {
+ name: "elm.swallow.content";
+ type: SWALLOW;
+ mouse_events: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 1.0; to: "elm.swallow.tabbar"; }
+ rel2 { relative: 1.0 1.0; }
+ }
+ description {
+ /* Tabbar hide, enlarge size to cover tabbar region */
+ state: "fullscreen" 0.0;
+ rel1 { relative: 0.0 0.0; }
+ rel2 { relative: 1.0 1.0; }
+ }
+ }
+ }
+ programs
+ {
+ program {
+ name: "tabbar_default";
+ signal: "elm,tabbar,state,default";
+ source: "elm";
+ transition: DECELERATE 0.5;
+ script {
+ set_state(PART:"elm.swallow.tabbar", "default", 0.0);
+ set_state(PART:"elm.swallow.content", "default", 0.0);
+ }
+ }
+ program {
+ name: "tabbar_landscape";
+ signal: "elm,tabbar,state,landscape";
+ source: "elm";
+ script {
+ set_state(PART:"elm.swallow.tabbar", "landscape", 0.0);
+ set_state(PART:"elm.swallow.content", "default", 0.0);
+ }
+ }
+ program {
+ name: "tabbar_hide";
+ signal: "elm,tabbar,state,hide";
+ source: "elm";
+ script {
+ set_state(PART:"elm.swallow.tabbar", "hide", 0.0);
+ set_state(PART:"elm.swallow.content", "fullscreen", 0.0);
+ }
+ }
+ }
+ }
+
+ group {
+ name: "gallery/controlbar";
+ parts {
+ part {
+ name: "background";
+ type, RECT;
+ mouse_events: 0;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; offset: 0 0; }
+ rel2 { relative: 1.0 1.0; offset: -1 -1; }
+ color: 0 0 0 0 ;
+ }
+
+ }
+ part {
+ name: "elm.tabbar.bg";
+ //type: IMAGE;
+ type: RECT;
+ mouse_events: 0;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ min: 0 0;
+ fixed: 1 1;
+ align: 0.5 0.0;
+ rel1 { relative: 0.0 0.0;}
+ rel2 { relative: 1.0 0.0;}
+ //image.normal: GALLERY_EDC_IMAGE_CONTROL_TABBAR_BG;
+ color: NAVIFRAME_TITLE_BG_COLOR_INC;
+ }
+ description {
+ state: "show_port" 0.0;
+ inherit: "default" 0.0;
+ min: 0 CONTROLBAR_LARGE_HEIGHT_INC;
+ }
+ description {
+ state: "show_land" 0.0;
+ inherit: "default" 0.0;
+ min: 0 CONTROLBAR_SMALL_HEIGHT_INC;
+ }
+ }
+ part {
+ name: "selectall_bg";
+ type: RECT;
+ mouse_events: 1;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ min: 0 112;
+ fixed: 0 1;
+ align: 0.5 0.0;
+ rel1 { relative: 0.0 1.0; to: "elm.tabbar.bg"; }
+ rel2 { relative: 1.0 1.0; to: "elm.tabbar.bg"; }
+ color: 0 0 0 0;
+ }
+ description {
+ state: "visible" 0.0;
+ inherit: "default" 0.0;
+ color: SELECT_ALL_BG_COLOR;
+ }
+ description {
+ state: "visible_tag" 0.0;
+ inherit: "default" 0.0;
+ min: 0 TAG_ITEM_H;
+ color: SELECT_ALL_BG_COLOR;
+ }
+ }
+ part {
+ name: "selectall_bottom_line";
+ type: RECT;
+ mouse_events: 1;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ min: 0 2;
+ fixed: 0 1;
+ align: 0.5 0.0;
+ rel1 { relative: 0.0 1.0; to: "selectall_bg"; }
+ rel2 { relative: 1.0 0.0; to: "background"; }
+ color: 0 0 0 0;
+ }
+ description {
+ state: "visible" 0.0;
+ inherit: "default" 0.0;
+ color: GENLIST_PART_BOTTOM_LINE_COLOR_VIDEO;
+ }
+ description {
+ state: "visible_tag" 0.0;
+ inherit: "default" 0.0;
+ color: GENLIST_PART_BOTTOM_LINE_COLOR_TAG;
+
+ }
+ }
+ part {
+ name: "selectall_check_leftpadding";
+ type: RECT;
+ mouse_events: 0;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ min: 16 0;
+ fixed: 1 0;
+ align: 0.0 0.0;
+
+ color: 0 0 0 255;
+ visible: 0;
+ rel1 { relative: 0.0 0.0; to: "selectall_bg"; }
+ rel2 { relative: 0.0 1.0; to: "selectall_bg"; }
+ }
+ description {
+ state: "visible" 0.0;
+ inherit: "default" 0.0;
+
+ }
+
+ }
+
+ part {
+ name: "selectall_check";
+ type: SWALLOW;
+ mouse_events: 1;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ align: 0.0 0.5;
+ fixed: 1 1;
+ min: 42 42;
+ rel1 { relative: 1.0 0.0; to: "selectall_check_leftpadding"; }
+ rel2 { relative: 1.0 1.0; to: "selectall_check_leftpadding"; }
+ visible : 0;
+
+ }
+ description {
+ state: "visible" 0.0;
+ inherit: "default" 0.0;
+ visible: 1;
+ }
+
+ }
+
+ part {
+ name: "selectall_check_rightpadding";
+ type: RECT;
+ mouse_events: 0;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ min: 16 0;
+ fixed: 1 0;
+ align: 0.0 0.0;
+ color: 0 0 0 0;
+ rel1 { relative: 1.0 0.0; to: "selectall_check"; }
+ rel2 { relative: 1.0 1.0; to: "selectall_check"; }
+ visible: 0;
+ }
+ description {
+ state: "visible" 0.0;
+ inherit: "default" 0.0;
+ visible: 1;
+ }
+
+ }
+
+ part {
+ name: "selectall_text";
+ type: TEXT;
+ mouse_events: 0;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ align: 0.0 0.5;
+ rel1 { relative: 1.0 0.0; to: "selectall_check_rightpadding"; }
+ rel2 { relative: 1.0 1.0; to: "selectall_bg"; }
+ color: 0 0 0 255;
+ text {
+ font: "SLP:style=Medium";
+ text_class: "slp";
+ size: 44;
+ text: "";
+ align: 0.0 0.5;
+ }
+ visible: 0;
+ }
+ description {
+ state: "visible" 0.0;
+ inherit: "default" 0.0;
+ visible: 1;
+ }
+ }
+
+ part {
+ name: "selectall_inner";
+ type: RECT;
+ mouse_events: 0;
+ scale: 1;
+
+ description {
+ state: "defalut" 0.0;
+ min: 0 1;
+ fixed: 0 1;
+ align: 0.5 0.0;
+ rel1 { relative: 0.0 1.0; to: "selectall_bg"; }
+ rel2 { relative: 1.0 1.0; to: "selectall_bottom_line"; }
+ color: 90 90 90 0;
+ }
+ description {
+ state: "visible" 0.0;
+ inherit: "default" 0.0;
+ }
+ }
+ part {
+ name: "contents";
+ type: SWALLOW;
+ mouse_events: 1;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 1.0; to: "elm.tabbar.bg"; }
+ rel2 { relative: 1.0 1.0; }
+ }
+ description {
+ state: "edit" 0.0;
+ rel1 { relative: 0.0 1.0; to: "selectall_inner"; }
+ rel2 { relative: 1.0 1.0; }
+ }
+ }
+ part {
+ name: "elm.swallow.view";
+ type: SWALLOW;
+ mouse_events: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; }
+ rel2 { relative: 1.0 1.0; }
+ }
+ description {
+ state: "edit" 0.0;
+ rel1 { relative: 0.0 1.0; to: "selectall_inner"; }
+ rel2 { relative: 1.0 1.0; }
+ }
+ description { //normal thumbnails view for 2d effect
+ state: "thumb_edit_2d" 0.0;
+ //min: 480 800-115;
+ //align: 0.5 1.0;
+ rel1 { relative: 0.0 0.0; offset: 0 55; }
+ rel2 { relative: 1.0 1.0;}
+ }
+ description { //move edit view up while selectioninfo shown
+ state: "moveup" 0.0;
+ rel1 { relative: 0.0 1.0; to: "selectall_inner"; }
+ rel2 { relative: 1.0 0.0; to: "elm.swallow.selinfo"; }
+
+ }
+ }
+ part {
+ name: "elm.swallow.selinfo";
+ type: SWALLOW;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ min: 0 SELINFO_H; // bottom padding size for selectioninfo
+ fixed: 0 1;
+ align: 0.5 1.0;
+ rel1 { relative: 0.0 1.0; }
+ rel2 { relative: 1.0 1.0; }
+ visible: 0;
+ }
+ description { state: "show" 0.0;
+ inherit: "default" 0.0;
+ visible: 1;
+ }
+ }
+ part {
+ name: "elm.swallow.weblist_view";
+ type: SWALLOW;
+ mouse_events: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0;}
+ rel2 { relative: 1.0 1.0;}
+ }
+ }
+ }
+
+ programs
+ {
+ program {
+ name: "swallow_view_default";
+ signal: "elm,swallow_view,state,default";
+ source: "elm";
+ script {
+ set_state(PART:"elm.swallow.view", "default", 0.0);
+ }
+ }
+ program {
+ name: "swallow_view_edit";
+ signal: "elm,swallow_view,state,edit";
+ source: "elm";
+ script {
+ set_state(PART:"elm.swallow.view", "edit", 0.0);
+ set_state(PART:"elm.swallow.selinfo", "default", 0.0);
+ }
+ }
+ program {
+ name: "selectall_show_after";
+ action: STATE_SET "visible" 0.0;
+ target: "selectall_check_leftpadding";
+ target: "selectall_check";
+ target: "selectall_check_rightpadding";
+ target: "selectall_text";
+ target: "selectall_inner";
+ }
+ program {
+ name: "selectall_show";
+ signal: "selectall_show";
+ source: "elm";
+ action: STATE_SET "visible" 0.0;
+ target: "selectall_bg";
+ target: "selectall_bottom_line";
+ after: "selectall_show_after";
+ }
+ program {
+ name: "selectall_show_tag";
+ signal: "selectall_show_tag";
+ source: "elm";
+ action: STATE_SET "visible_tag" 0.0;
+ target: "selectall_bg";
+ target: "selectall_bottom_line";
+ after: "selectall_show_after";
+ }
+ program {
+ name: "selectall_show_web";
+ signal: "selectall_show_web";
+ source: "elm";
+ action: STATE_SET "visible_web" 0.0;
+ target: "selectall_bottom_line";
+ after: "selectall_show_after";
+ }
+ program {
+ name: "selectall_hide";
+ signal: "selectall_hide";
+ source: "elm";
+ action: STATE_SET "default" 0.0;
+ target: "selectall_bg";
+ target: "selectall_bottom_line";
+ target: "selectall_check_leftpadding";
+ target: "selectall_check";
+ target: "selectall_check_rightpadding";
+ target: "selectall_text";
+ target: "selectall_inner";
+ }
+ //emit signal to set checkbox state in .c codes
+ program { name: "selectall_bg_click2";
+ signal: "mouse,clicked,1";
+ source: "selectall_bg";
+ action: SIGNAL_EMIT "elm,action,click" "selectall_bg";
+ }
+ program {
+ name: "swallow_view_thumb_edit_2d";
+ signal: "elm,swallow_view,state,thumb_edit_2d";
+ source: "elm";
+ script {
+ set_state(PART:"elm.swallow.view", "thumb_edit_2d", 0.0);
+ set_state(PART:"elm.swallow.selinfo", "default", 0.0);
+ }
+ }
+ program {
+ name: "swallow_view_moveup";
+ signal: "elm,swallow_view,state,moveup";
+ source: "elm";
+ script {
+ set_state(PART:"elm.swallow.view", "moveup", 0.0);
+ set_state(PART:"elm.swallow.selinfo", "show", 0.0);
+ }
+ }
+ program {
+ name: "tabbar_bg_default";
+ signal: "elm,tabbar_bg,state,hide";
+ source: "elm";
+ script {
+ set_state(PART:"elm.tabbar.bg", "default", 0.0);
+ }
+ }
+ program {
+ name: "tabbar_bg_show_port";
+ signal: "elm,tabbar_bg,state,show_port";
+ source: "elm";
+ script {
+ set_state(PART:"elm.tabbar.bg", "show_port", 0.0);
+ }
+ }
+ program {
+ name: "tabbar_bg_show_land";
+ signal: "elm,tabbar_bg,state,show_land";
+ source: "elm";
+ script {
+ set_state(PART:"elm.tabbar.bg", "show_land", 0.0);
+ }
+ }
+ }
+ }
+ group { name: "gl_bg_layout";
+ parts {
+ part { name: "bg";
+ type: RECT;
+ mouse_events: 0;
+ description { state: "default" 0.0;
+ color: 0 0 0 45;
+ }
+ }
+ part { name: "elm.swallow.image";
+ type: SWALLOW;
+ description { state: "default" 0.0;
+ }
+ }
+ }
+ }
+}
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define CHECK_STYLE_DEFAULT_BG_NORMAL_MIN_MAX_INC 60 60
+
+#define CHECK_DEFAULT_TEXT_NORMAL_COLOR_INC 255 255 255 255
+#define CHECK_DEFAULT_TEXT_PRESSED_COLOR_INC 255 255 255 255
+#define CHECK_DEFAULT_TEXT_DISABLED_COLOR_INC 136 136 136 136
+
+////////////////////////////////////////////////////////////////////////////////////////
+//
+// check default textblock style
+//
+///////////////////////////////////////////////////////////////////////////////////////
+ styles {
+ style { name: "check_label_textblock_style";
+ base: "font=SLP:style=Roman text_class=slp font_size=32 color=#ffffff wrap=char";
+ tag: "br" "\n";
+ tag: "ps" "ps";
+ tag: "hilight" "+ font=SLP:style=Bold text_class=slp";
+ tag: "b" "+ font=SLP:style=Bold text_class=slp";
+ tag: "whitecolor" "+ color=#ffffff";
+ tag: "tab" "\t";
+ }
+ }
+
+#define CHECK_STATE_DEFAULT 0
+#define CHECK_STATE_VISIBLE 1
+#define CHECK_STATE_DISABLED_VISIBLE 2
+#define CHECK_STATE_DISABLED 3
+
+////////////////////////////////////////////////////////////////////////////////
+#define CHECK_STYLE_DEFAULT(style_name, image_bg, image_checking, min_width, min_height) \
+ group { name: "elm/check/base/"style_name; \
+ images { \
+ image: image_bg COMP; \
+ image: GALLERY_EDC_IMAGE_CHECK_BG_DIM COMP; \
+ image: image_checking COMP; \
+ } \
+ script { \
+ public check_state = CHECK_STATE_DEFAULT; \
+ } \
+ parts { \
+ part { name: "back_bg"; \
+ type: RECT; \
+ scale: 1; \
+ description { state: "default" 0.0; \
+ rel2.relative: 0.0 1.0; \
+ align: 0 0.5; \
+ min: min_width min_height; \
+ fixed: 1 0; \
+ color: 0 0 0 0; \
+ } \
+ } \
+ part { name: "bg"; \
+ mouse_events: 0; \
+ scale: 1; \
+ description { state: "default" 0.0; \
+ min: CHECK_STYLE_DEFAULT_BG_NORMAL_MIN_MAX_INC; \
+ max: CHECK_STYLE_DEFAULT_BG_NORMAL_MIN_MAX_INC; \
+ fixed: 1 1; \
+ rel1.to: "back_bg"; \
+ rel2.to: "back_bg"; \
+ image.normal: image_bg; \
+ fill.smooth : 0; \
+ } \
+ description { state: "disabled" 0.0; \
+ inherit: "default" 0.0; \
+ image.normal: GALLERY_EDC_IMAGE_CHECK_BG_DIM; \
+ fill.smooth : 0; \
+ } \
+ } \
+ part { name: "check"; \
+ mouse_events: 0; \
+ scale: 1; \
+ description { state: "default" 0.0; \
+ rel1.to: "bg"; \
+ rel2.to: "bg"; \
+ visible: 0; \
+ image.normal: image_checking; \
+ } \
+ description { state: "visible" 0.0; \
+ inherit: "default" 0.0; \
+ visible: 1; \
+ } \
+ description { state: "disabled_visible" 0.0; \
+ inherit: "default" 0.0; \
+ visible: 1; \
+ } \
+ } \
+ part { name: "elm.swallow.content"; \
+ type: SWALLOW; \
+ description { state: "default" 0.0; \
+ fixed: 1 0; \
+ visible: 0; \
+ color: 255 255 255 255; \
+ align: 0.0 0.5; \
+ rel1 { \
+ to_x: "bg"; \
+ relative: 1.0 0.0; \
+ offset: 1 1; \
+ } \
+ rel2 { \
+ to_x: "bg"; \
+ relative: 1.0 1.0; \
+ offset: 2 -2; \
+ } \
+ } \
+ description { state: "visible" 0.0; \
+ inherit: "default" 0.0; \
+ fixed: 1 1; \
+ visible: 1; \
+ aspect: 1.0 1.0; \
+ aspect_preference: VERTICAL; \
+ } \
+ description { state: "disabled" 0.0; \
+ inherit: "default" 0.0; \
+ color: 128 128 128 128; \
+ } \
+ description { state: "disabled_visible" 0.0; \
+ inherit: "default" 0.0; \
+ color: 128 128 128 128; \
+ fixed: 1 1; \
+ visible: 1; \
+ aspect: 1.0 1.0; \
+ } \
+ } \
+ part { name: "elm.text"; \
+ type: TEXTBLOCK; \
+ mouse_events: 0; \
+ scale: 1; \
+ description { state: "default" 0.0; \
+ visible: 0; \
+ fixed: 0 1; \
+ rel1 { \
+ relative: 1.0 0.5; \
+ offset: 1 1; \
+ to_x: "elm.swallow.content"; \
+ } \
+ rel2 { \
+ relative: 1.0 0.5; \
+ offset: -2 -2; \
+ } \
+ align: 0.0 0.5; \
+ text { \
+ style: "check_label_textblock_style"; \
+ min: 0 0; \
+ } \
+ color: CHECK_DEFAULT_TEXT_NORMAL_COLOR_INC; \
+ } \
+ description { state: "visible" 0.0; \
+ inherit: "default" 0.0; \
+ visible: 1; \
+ text.min: 1 1; \
+ } \
+ description { state: "disabled" 0.0; \
+ inherit: "default" 0.0; \
+ } \
+ description { state: "disabled_visible" 0.0; \
+ inherit: "default" 0.0; \
+ visible: 1; \
+ text.min: 1 1; \
+ color: CHECK_DEFAULT_TEXT_DISABLED_COLOR_INC; \
+ } \
+ } \
+ part { name: "events1"; \
+ type: RECT; \
+ ignore_flags: ON_HOLD; \
+ description { state: "default" 0.0; \
+ color: 0 0 0 0; \
+ } \
+ } \
+ part { name: "events2"; \
+ type: RECT; \
+ repeat_events: 1; \
+ description { state: "default" 0.0; \
+ color: 0 0 0 0; \
+ } \
+ } \
+ part { name: "disabler"; \
+ type: RECT; \
+ description { state: "default" 0.0; \
+ color: 0 0 0 0; \
+ visible: 0; \
+ } \
+ description { state: "disabled" 0.0; \
+ inherit: "default" 0.0; \
+ visible: 1; \
+ } \
+ } \
+ } \
+ programs { \
+ program { name: "click"; \
+ signal: "mouse,clicked,1"; \
+ source: "events1"; \
+ action: SIGNAL_EMIT "elm,action,check,toggle" ""; \
+ } \
+ program { name: "check_on"; \
+ signal: "elm,state,check,on"; \
+ source: "elm"; \
+ script { \
+ set_int(check_state, CHECK_STATE_VISIBLE); \
+ set_state(PART:"check", "visible", 0.0); \
+ } \
+ } \
+ program { name: "check_off"; \
+ signal: "elm,state,check,off"; \
+ source: "elm"; \
+ action: STATE_SET "default" 0.0; \
+ target: "check"; \
+ script { \
+ if (get_int(check_state) == CHECK_STATE_VISIBLE) \
+ { \
+ set_int(check_state, CHECK_STATE_DEFAULT); \
+ set_state(PART:"check", "default", 0.0); \
+ } \
+ } \
+ } \
+ program { name: "text_show"; \
+ signal: "elm,state,text,visible"; \
+ source: "elm"; \
+ action: STATE_SET "visible" 0.0; \
+ target: "elm.text"; \
+ } \
+ program { name: "text_hide"; \
+ signal: "elm,state,text,hidden"; \
+ source: "elm"; \
+ action: STATE_SET "default" 0.0; \
+ target: "elm.text"; \
+ } \
+ program { name: "icon_show"; \
+ signal: "elm,state,icon,visible"; \
+ source: "elm"; \
+ action: STATE_SET "visible" 0.0; \
+ target: "elm.swallow.content"; \
+ } \
+ program { name: "icon_hide"; \
+ signal: "elm,state,icon,hidden"; \
+ source: "elm"; \
+ action: STATE_SET "default" 0.0; \
+ target: "elm.swallow.content"; \
+ } \
+ program { name: "disable"; \
+ signal: "elm,state,disabled"; \
+ source: "elm"; \
+ action: STATE_SET "disabled" 0.0; \
+ target: "disabler"; \
+ target: "bg"; \
+ after: "disable_text"; \
+ } \
+ program { name: "disable_text"; \
+ script { \
+ new st[31]; \
+ new Float:vl; \
+ get_state(PART:"elm.text", st, 30, vl); \
+ if (!strcmp(st, "visible")) \
+ set_state(PART:"elm.text", "disabled_visible", 0.0); \
+ else \
+ set_state(PART:"elm.text", "disabled", 0.0); \
+ get_state(PART:"elm.swallow.content", st, 30, vl); \
+ if (!strcmp(st, "visible")) \
+ set_state(PART:"elm.swallow.content", "disabled_visible", 0.0); \
+ else \
+ set_state(PART:"elm.swallow.content", "disabled", 0.0); \
+ get_state(PART:"check", st, 30, vl); \
+ if (!strcmp(st, "visible")) \
+ { \
+ set_state(PART:"check", "disabled_visible", 0.0); \
+ set_int(check_state, CHECK_STATE_DISABLED_VISIBLE); \
+ } \
+ } \
+ } \
+ program { name: "enable"; \
+ signal: "elm,state,enabled"; \
+ source: "elm"; \
+ action: STATE_SET "default" 0.0; \
+ target: "disabler"; \
+ target: "bg"; \
+ after: "enable_text"; \
+ } \
+ program { name: "enable_text"; \
+ script { \
+ new st[31]; \
+ new Float:vl; \
+ get_state(PART:"elm.text", st, 30, vl); \
+ if (!strcmp(st, "disabled_visible")) \
+ set_state(PART:"elm.text", "visible", 0.0); \
+ else \
+ set_state(PART:"elm.text", "default", 0.0); \
+ get_state(PART:"elm.swallow.content", st, 30, vl); \
+ if (!strcmp(st, "visible")) \
+ set_state(PART:"elm.swallow.content", "visible", 0.0); \
+ else \
+ set_state(PART:"elm.swallow.content", "default", 0.0); \
+ get_state(PART:"check", st, 30, vl); \
+ if (!strcmp(st, "disabled_visible")) \
+ { \
+ set_state(PART:"check", "visible", 0.0); \
+ set_int(check_state, CHECK_STATE_VISIBLE); \
+ } \
+ else \
+ set_int(check_state, CHECK_STATE_DEFAULT); \
+ } \
+ } \
+ } \
+ }
+
+////////////////////////////////////////////////////////////////////////////////
+ CHECK_STYLE_DEFAULT("gallery/default", GALLERY_EDC_IMAGE_CHECK_BG, GALLERY_EDC_IMAGE_CHECK_BG_CHECKING, 42, 42)
+
+////////////////////////////////////////////////////////////////////////////////
+ CHECK_STYLE_DEFAULT("gallery/album", GALLERY_EDC_IMAGE_CHECK_ALBUM_BG, GALLERY_EDC_IMAGE_CHECK_ALBUM_BG_CHECKING, 60, 60)
+
+////////////////////////////////////////////////////////////////////////////////
+#define CHECK_STYLE_GRID(style_name, image_grid, width, height) \
+ group { name: "elm/check/base/"style_name; \
+ images.image: image_grid COMP; \
+ parts { \
+ part { name: "bg"; \
+ type: RECT; \
+ scale: 1; \
+ description { state: "default" 0.0; \
+ color: 0 0 0 0; \
+ } \
+ description { state: "pressed" 0.0; \
+ inherit: "default" 0.0; \
+ } \
+ description { state: "disabled" 0.0; \
+ inherit: "default" 0.0; \
+ visible: 0; \
+ } \
+ } \
+ part { name: "icon_bg_img"; \
+ type: RECT; \
+ mouse_events: 0; \
+ scale : 1; \
+ description { \
+ color: 0 0 0 0; \
+ rel1 { relative: GAP_W/W (GAP_H+1)/H;} \
+ rel2 { relative: (W-GAP_W)/W 1;} \
+ } \
+ } \
+ part { name: "icon_bg"; \
+ type: RECT; \
+ description { state: "default" 0.0; \
+ color: 0 0 0 0; \
+ rel1 { relative: 0 0; to: "icon_bg_img"; } \
+ rel2 { relative: 1 1; to: "icon_bg_img"; } \
+ } \
+ } \
+ part { name: "bg2"; \
+ type: RECT; \
+ mouse_events: 0; \
+ scale: 1; \
+ description { state: "default" 0.0; \
+ rel1.to: "icon_bg"; \
+ rel2.to: "icon_bg"; \
+ align: 0.5 0.5; \
+ min: width height; \
+ max: width height; \
+ color: 0 0 0 0; \
+ } \
+ description { state: "pressed" 0.0; \
+ inherit: "default" 0.0; \
+ } \
+ description { state: "disabled" 0.0; \
+ inherit: "default" 0.0; \
+ visible: 0; \
+ } \
+ } \
+ part { name: "selected_bg"; \
+ type: RECT; \
+ scale: 1; \
+ description { state: "default" 0.0; \
+ rel1.to: "icon_bg"; \
+ rel2.to: "icon_bg"; \
+ color: 0 0 0 0; \
+ visible: 0; \
+ } \
+ description { state: "visible" 0.0; \
+ inherit: "default" 0.0; \
+ color: 0 0 0 153; \
+ visible: 1; \
+ } \
+ } \
+ part { name: "check"; \
+ mouse_events: 0; \
+ scale: 1; \
+ description { state: "default" 0.0; \
+ rel1.to: "bg2"; \
+ rel2.to: "bg2"; \
+ visible: 0; \
+ image.normal: image_grid; \
+ } \
+ description { state: "visible" 0.0; \
+ inherit: "default" 0.0; \
+ visible: 1; \
+ } \
+ description { state: "pressed" 0.0; \
+ inherit: "default" 0.0; \
+ visible: 1; \
+ } \
+ description { state: "disabled_visible" 0.0; \
+ inherit: "default" 0.0; \
+ visible: 1; \
+ } \
+ } \
+ part { name: "elm.swallow.content"; \
+ type: SWALLOW; \
+ description { \
+ state: "default" 0.0; \
+ fixed: 1 0; \
+ visible: 0; \
+ color: 255 255 255 255; \
+ align: 0.0 0.5; \
+ rel1 { \
+ to_x: "bg2"; \
+ relative: 1.0 0.0; \
+ offset: 1 1; \
+ } \
+ rel2 { \
+ to_x: "bg2"; \
+ relative: 1.0 1.0; \
+ offset: 2 -2; \
+ } \
+ } \
+ description { state: "visible" 0.0; \
+ inherit: "default" 0.0; \
+ fixed: 1 1; \
+ visible: 1; \
+ aspect: 1.0 1.0; \
+ aspect_preference: VERTICAL; \
+ } \
+ description { state: "disabled" 0.0; \
+ inherit: "default" 0.0; \
+ color: 128 128 128 128; \
+ } \
+ description { state: "disabled_visible" 0.0; \
+ inherit: "default" 0.0; \
+ color: 128 128 128 128; \
+ fixed: 1 1; \
+ visible: 1; \
+ aspect: 1.0 1.0; \
+ } \
+ } \
+ part { name: "elm.text"; \
+ type: TEXTBLOCK; \
+ mouse_events: 0; \
+ scale: 1; \
+ description { state: "default" 0.0; \
+ visible: 0; \
+ fixed: 0 1; \
+ rel1 { \
+ relative: 1.0 0.5; \
+ offset: 1 1; \
+ to_x: "elm.swallow.content"; \
+ } \
+ rel2 { \
+ relative: 1.0 0.5; \
+ offset: -2 -2; \
+ } \
+ color: 255 255 255 255; \
+ align: 0.0 0.5; \
+ text { \
+ style: "check_label_textblock_style"; \
+ min: 0 0; \
+ } \
+ color: CHECK_DEFAULT_TEXT_NORMAL_COLOR_INC; \
+ } \
+ description { state: "visible" 0.0; \
+ inherit: "default" 0.0; \
+ visible: 1; \
+ text.min: 1 1; \
+ } \
+ description { state: "disabled" 0.0; \
+ inherit: "default" 0.0; \
+ } \
+ description { state: "disabled_visible" 0.0; \
+ inherit: "default" 0.0; \
+ visible: 1; \
+ text.min: 1 1; \
+ color: CHECK_DEFAULT_TEXT_DISABLED_COLOR_INC; \
+ } \
+ } \
+ part { name: "events"; \
+ type: RECT; \
+ ignore_flags: ON_HOLD; \
+ description { state: "default" 0.0; \
+ color: 0 0 0 0; \
+ } \
+ } \
+ part { name: "disabler"; \
+ type: RECT; \
+ description { state: "default" 0.0; \
+ color: 0 0 0 0; \
+ visible: 0; \
+ } \
+ description { state: "disabled" 0.0; \
+ inherit: "default" 0.0; \
+ visible: 1; \
+ } \
+ } \
+ } \
+ programs { \
+ program { name: "click"; \
+ signal: "mouse,up,1"; \
+ source: "events"; \
+ action: SIGNAL_EMIT "elm,action,check,toggle" ""; \
+ after: "bg_normal"; \
+ } \
+ program { name: "bg_normal"; \
+ script { \
+ set_state(PART:"bg", "default", 0.0); \
+ set_state(PART:"bg2", "default", 0.0); \
+ } \
+ } \
+ program { name: "mouseout"; \
+ signal: "mouse,out"; \
+ source: "events"; \
+ after: "bg_check_normal"; \
+ } \
+ program { name: "bg_check_normal"; \
+ script { \
+ new st[31]; \
+ new Float:vl; \
+ get_state(PART:"check", st, 30, vl); \
+ if (!strcmp(st, "pressed")) \
+ set_state(PART:"check", "visible", 0.0); \
+ set_state(PART:"bg", "default", 0.0); \
+ set_state(PART:"bg2", "default", 0.0); \
+ } \
+ } \
+ program { name: "pressed"; \
+ signal: "mouse,down,1"; \
+ source: "events"; \
+ script { \
+ new st[31]; \
+ new Float:vl; \
+ get_state(PART:"check", st, 30, vl); \
+ if (!strcmp(st, "visible")) \
+ set_state(PART:"check", "pressed", 0.0); \
+ set_state(PART:"bg", "pressed", 0.0); \
+ set_state(PART:"bg2", "pressed", 0.0); \
+ } \
+ } \
+ program { name: "check_on"; \
+ signal: "elm,state,check,on"; \
+ source: "elm"; \
+ action: STATE_SET "visible" 0.0; \
+ target: "check"; \
+ target: "selected_bg"; \
+ } \
+ program { name: "check_off"; \
+ signal: "elm,state,check,off"; \
+ source: "elm"; \
+ action: STATE_SET "default" 0.0; \
+ target: "check"; \
+ target: "selected_bg"; \
+ } \
+ program { name: "text_show"; \
+ signal: "elm,state,text,visible"; \
+ source: "elm"; \
+ action: STATE_SET "visible" 0.0; \
+ target: "elm.text"; \
+ } \
+ program { name: "text_hide"; \
+ signal: "elm,state,text,hidden"; \
+ source: "elm"; \
+ action: STATE_SET "default" 0.0; \
+ target: "elm.text"; \
+ } \
+ program { name: "icon_show"; \
+ signal: "elm,state,icon,visible"; \
+ source: "elm"; \
+ action: STATE_SET "visible" 0.0; \
+ target: "elm.swallow.content"; \
+ } \
+ program { name: "icon_hide"; \
+ signal: "elm,state,icon,hidden"; \
+ source: "elm"; \
+ action: STATE_SET "default" 0.0; \
+ target: "elm.swallow.content"; \
+ } \
+ program { name: "disable"; \
+ signal: "elm,state,disabled"; \
+ source: "elm"; \
+ action: STATE_SET "disabled" 0.0; \
+ target: "disabler"; \
+ target: "bg"; \
+ target: "bg2"; \
+ after: "disable_text"; \
+ } \
+ program { name: "disable_text"; \
+ script { \
+ new st[31]; \
+ new Float:vl; \
+ get_state(PART:"elm.text", st, 30, vl); \
+ if (!strcmp(st, "visible")) \
+ set_state(PART:"elm.text", "disabled_visible", 0.0); \
+ else \
+ set_state(PART:"elm.text", "disabled", 0.0); \
+ get_state(PART:"elm.swallow.content", st, 30, vl); \
+ if (!strcmp(st, "visible")) \
+ set_state(PART:"elm.swallow.content", "disabled_visible", 0.0); \
+ else \
+ set_state(PART:"elm.swallow.content", "disabled", 0.0); \
+ get_state(PART:"check", st, 30, vl); \
+ if (!strcmp(st, "visible")) \
+ set_state(PART:"check", "disabled_visible", 0.0); \
+ } \
+ } \
+ program { name: "enable"; \
+ signal: "elm,state,enabled"; \
+ source: "elm"; \
+ action: STATE_SET "default" 0.0; \
+ target: "disabler"; \
+ target: "bg"; \
+ target: "bg2"; \
+ after: "enable_text"; \
+ } \
+ program { name: "enable_text"; \
+ script { \
+ new st[31]; \
+ new Float:vl; \
+ get_state(PART:"elm.text", st, 30, vl); \
+ if (!strcmp(st, "disabled_visible")) \
+ set_state(PART:"elm.text", "visible", 0.0); \
+ else \
+ set_state(PART:"elm.text", "default", 0.0); \
+ get_state(PART:"elm.swallow.content", st, 30, vl); \
+ if (!strcmp(st, "visible")) \
+ set_state(PART:"elm.swallow.content", "visible", 0.0); \
+ else \
+ set_state(PART:"elm.swallow.content", "default", 0.0); \
+ get_state(PART:"check", st, 30, vl); \
+ if (!strcmp(st, "disabled_visible")) \
+ set_state(PART:"check", "visible", 0.0); \
+ } \
+ } \
+ } \
+ }
+
+////////////////////////////////////////////////////////////////////////////////
+ CHECK_STYLE_GRID("gallery/grid", GALLERY_EDC_IMAGE_CHECK_GRID, 64, 64)
+
+////////////////////////////////////////////////////////////////////////////////
+ group { name: "elm/check/base/gallery/album/grid";
+ parts {
+ part { name: "bg";
+ type: RECT;
+ scale: 1;
+ description { state: "default" 0.0;
+ color: 0 0 0 0;
+ }
+ description { state: "pressed" 0.0;
+ inherit: "default" 0.0;
+ }
+ description { state: "disabled" 0.0;
+ inherit: "default" 0.0;
+ visible: 0;
+ }
+ }
+ part { name: "bg2";
+ type: RECT;
+ mouse_events: 0;
+ scale: 1;
+ description { state: "default" 0.0;
+ rel1.to: "bg";
+ rel2.to: "bg";
+ align: 0.5 0.5;
+ min: 40 40;
+ max: 40 40;
+ color: 0 0 0 0;
+ }
+ description { state: "pressed" 0.0;
+ inherit: "default" 0.0;
+ }
+ description { state: "disabled" 0.0;
+ inherit: "default" 0.0;
+ visible: 0;
+ }
+ }
+ part { name: "selected_bg";
+ type: RECT;
+ scale: 1;
+ description { state: "default" 0.0;
+ rel1.to: "bg";
+ rel2.to: "bg";
+ color: 0 0 0 0;
+ visible: 0;
+ }
+ description { state: "visible" 0.0;
+ inherit: "default" 0.0;
+ color: 0 0 0 153;
+ visible: 1;
+ }
+ }
+ part { name: "check";
+ type: RECT;
+ mouse_events: 0;
+ scale: 1;
+ description { state: "default" 0.0;
+ rel1.to: "bg2";
+ rel2.to: "bg2";
+ color: 0 0 0 0;
+ visible: 0;
+ }
+ description { state: "visible" 0.0;
+ inherit: "default" 0.0;
+ }
+ description { state: "pressed" 0.0;
+ inherit: "default" 0.0;
+ }
+ description { state: "disabled_visible" 0.0;
+ inherit: "default" 0.0;
+ }
+ }
+ part { name: "elm.swallow.content";
+ type: SWALLOW;
+ description {
+ state: "default" 0.0;
+ fixed: 1 0;
+ visible: 0;
+ color: 255 255 255 255;
+ align: 0.0 0.5;
+ rel1 {
+ to_x: "bg2";
+ relative: 1.0 0.0;
+ offset: 1 1;
+ }
+ rel2 {
+ to_x: "bg2";
+ relative: 1.0 1.0;
+ offset: 2 -2;
+ }
+ }
+ description { state: "visible" 0.0;
+ inherit: "default" 0.0;
+ fixed: 1 1;
+ visible: 1;
+ aspect: 1.0 1.0;
+ aspect_preference: VERTICAL;
+ }
+ description { state: "disabled" 0.0;
+ inherit: "default" 0.0;
+ color: 128 128 128 128;
+ }
+ description { state: "disabled_visible" 0.0;
+ inherit: "default" 0.0;
+ color: 128 128 128 128;
+ fixed: 1 1;
+ visible: 1;
+ aspect: 1.0 1.0;
+ }
+ }
+ part { name: "elm.text";
+ type: TEXTBLOCK;
+ mouse_events: 0;
+ scale: 1;
+ description { state: "default" 0.0;
+ visible: 0;
+ fixed: 0 1;
+ rel1 {
+ relative: 1.0 0.5;
+ offset: 1 1;
+ to_x: "elm.swallow.content";
+ }
+ rel2 {
+ relative: 1.0 0.5;
+ offset: -2 -2;
+ }
+ color: 255 255 255 255;
+ align: 0.0 0.5;
+ text {
+ style: "check_label_textblock_style";
+ min: 0 0;
+ }
+ color: CHECK_DEFAULT_TEXT_NORMAL_COLOR_INC;
+ }
+ description { state: "visible" 0.0;
+ inherit: "default" 0.0;
+ visible: 1;
+ text.min: 1 1;
+ }
+ description { state: "disabled" 0.0;
+ inherit: "default" 0.0;
+ }
+ description { state: "disabled_visible" 0.0;
+ inherit: "default" 0.0;
+ visible: 1;
+ text.min: 1 1;
+ color: CHECK_DEFAULT_TEXT_DISABLED_COLOR_INC;
+ }
+ }
+ part { name: "events";
+ type: RECT;
+ ignore_flags: ON_HOLD;
+ description { state: "default" 0.0;
+ color: 0 0 0 0;
+ }
+ }
+ part { name: "disabler";
+ type: RECT;
+ description { state: "default" 0.0;
+ color: 0 0 0 0;
+ visible: 0;
+ }
+ description { state: "disabled" 0.0;
+ inherit: "default" 0.0;
+ visible: 1;
+ }
+ }
+ }
+ programs {
+ program { name: "click";
+ signal: "mouse,up,1";
+ source: "events";
+ action: SIGNAL_EMIT "elm,action,check,toggle" "";
+ after: "bg_normal";
+ }
+ program { name: "bg_normal";
+ script {
+ set_state(PART:"bg", "default", 0.0);
+ set_state(PART:"bg2", "default", 0.0);
+ }
+ }
+ program { name: "mouseout";
+ signal: "mouse,out";
+ source: "events";
+ after: "bg_check_normal";
+ }
+ program { name: "bg_check_normal";
+ script {
+ new st[31];
+ new Float:vl;
+ get_state(PART:"check", st, 30, vl);
+ if (!strcmp(st, "pressed"))
+ set_state(PART:"check", "visible", 0.0);
+ set_state(PART:"bg", "default", 0.0);
+ set_state(PART:"bg2", "default", 0.0);
+ }
+ }
+ program { name: "pressed";
+ signal: "mouse,down,1";
+ source: "events";
+ script {
+ new st[31];
+ new Float:vl;
+ get_state(PART:"check", st, 30, vl);
+ if (!strcmp(st, "visible"))
+ set_state(PART:"check", "pressed", 0.0);
+ set_state(PART:"bg", "pressed", 0.0);
+ set_state(PART:"bg2", "pressed", 0.0);
+ }
+ }
+ program { name: "check_on";
+ signal: "elm,state,check,on";
+ source: "elm";
+ action: STATE_SET "visible" 0.0;
+ target: "check";
+ target: "selected_bg";
+ }
+ program { name: "check_off";
+ signal: "elm,state,check,off";
+ source: "elm";
+ action: STATE_SET "default" 0.0;
+ target: "check";
+ target: "selected_bg";
+ }
+ program { name: "text_show";
+ signal: "elm,state,text,visible";
+ source: "elm";
+ action: STATE_SET "visible" 0.0;
+ target: "elm.text";
+ }
+ program { name: "text_hide";
+ signal: "elm,state,text,hidden";
+ source: "elm";
+ action: STATE_SET "default" 0.0;
+ target: "elm.text";
+ }
+ program { name: "icon_show";
+ signal: "elm,state,icon,visible";
+ source: "elm";
+ action: STATE_SET "visible" 0.0;
+ target: "elm.swallow.content";
+ }
+ program { name: "icon_hide";
+ signal: "elm,state,icon,hidden";
+ source: "elm";
+ action: STATE_SET "default" 0.0;
+ target: "elm.swallow.content";
+ }
+ program { name: "disable";
+ signal: "elm,state,disabled";
+ source: "elm";
+ action: STATE_SET "disabled" 0.0;
+ target: "disabler";
+ target: "bg";
+ target: "bg2";
+ after: "disable_text";
+ }
+ program { name: "disable_text";
+ script {
+ new st[31];
+ new Float:vl;
+ get_state(PART:"elm.text", st, 30, vl);
+ if (!strcmp(st, "visible"))
+ set_state(PART:"elm.text", "disabled_visible", 0.0);
+ else
+ set_state(PART:"elm.text", "disabled", 0.0);
+ get_state(PART:"elm.swallow.content", st, 30, vl);
+ if (!strcmp(st, "visible"))
+ set_state(PART:"elm.swallow.content", "disabled_visible", 0.0);
+ else
+ set_state(PART:"elm.swallow.content", "disabled", 0.0);
+ get_state(PART:"check", st, 30, vl);
+ if (!strcmp(st, "visible"))
+ set_state(PART:"check", "disabled_visible", 0.0);
+ }
+ }
+ program { name: "enable";
+ signal: "elm,state,enabled";
+ source: "elm";
+ action: STATE_SET "default" 0.0;
+ target: "disabler";
+ target: "bg";
+ target: "bg2";
+ after: "enable_text";
+ }
+ program { name: "enable_text";
+ script {
+ new st[31];
+ new Float:vl;
+ get_state(PART:"elm.text", st, 30, vl);
+ if (!strcmp(st, "disabled_visible"))
+ set_state(PART:"elm.text", "visible", 0.0);
+ else
+ set_state(PART:"elm.text", "default", 0.0);
+ get_state(PART:"elm.swallow.content", st, 30, vl);
+ if (!strcmp(st, "visible"))
+ set_state(PART:"elm.swallow.content", "visible", 0.0);
+ else
+ set_state(PART:"elm.swallow.content", "default", 0.0);
+ get_state(PART:"check", st, 30, vl);
+ if (!strcmp(st, "disabled_visible"))
+ set_state(PART:"check", "visible", 0.0);
+ }
+ }
+ }
+ }
+
+#undef CHECK_STATE_DEFAULT
+#undef CHECK_STATE_VISIBLE
+#undef CHECK_STATE_DISABLED_VISIBLE
+#undef CHECK_STATE_DISABLED
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+/* Refer to: "elm/layout/searchbar/cancel_button" */
+
+#define ENTRY_TEXT_SIZE_INC 44
+
+#define EDITFIELD_TITLE_SIZE_INC 32
+#define EDITFIELD_TITLE_COLOR_INC 124 124 124 255
+#define EDITFIELD_GUIDE_TEXT_COLOR_INC 144 169 199 255
+
+#define SEARCHBAR_BACKGROUND_COLOR_INC 215 225 232 255
+#define SEARCHBAR_CANCEL_BUTTON_W_INC 134
+#define SEARCHBAR_CANCEL_BUTTON_WITH_PADDING_W_INC 150
+#define SEARCHBAR_CANCEL_BUTTON_WITH_DOUBLE_PADDING_W_INC 166
+#define SEARCHBAR_TOP_PADDING_INC 18
+#define SEARCHBAR_BOTTOM_PADDING_INC 18
+#define SEARCHBAR_HEIGHT_INC 74
+#define SEARCHBAR_LEFT_PADDING_INC 16
+#define SEARCHBAR_RIGHT_PADDING_INC 16
+#define SEARCHBAR_INPUTFIELD_BORDER_INC 6 6 6 6
+#define SEARCHBAR_LEFT_ICON_PADDING_INC 0
+#define SEARCHBAR_ICON_MIN_W_INC 42
+#define SEARCHBAR_ICON_MIN_H_INC 42
+#define SEARCHBAR_LEFT_PADDING_SEARCHFIELD_INC 16
+#define SEARCHBAR_RIGHT_PADDING_SEARCHFIELD_INC 8
+#define SEARCHBAR_SEARCH_TEXTFIELD_H_INC 60
+
+#define EDITFIELD_SEARCHBAR_TOP1_SINGLE_INC 6
+#define EDITFIELD_SEARCHBAR_TOP1_MULTI_INC 10
+#define EDITFIELD_SEARCHBAR_TOP2_INC 10
+#define EDITFIELD_SEARCHBAR_LEFT1_INC 0
+#define EDITFIELD_SEARCHBAR_LEFT2_INC 0
+#define EDITFIELD_SEARCHBAR_RIGHT1_ERASER_SHOW_INC 56
+#define EDITFIELD_SEARCHBAR_RIGHT2_INC 5
+#define EDITFIELD_SEARCHBAR_BOTTOM1_SINGLE_INC 8
+#define EDITFIELD_SEARCHBAR_BOTTOM1_MULTI_INC 2
+#define EDITFIELD_SEARCHBAR_BOTTOM2_SINGLE_INC 16
+#define EDITFIELD_SEARCHBAR_BOTTOM2_MULTI_INC 2
+#define EDITFIELD_SEARCHBAR_BOTTOM3_SINGLE_INC 50
+#define EDITFIELD_SEARCHBAR_BOTTOM3_MULTI_INC 50
+
+#define EDITFIELD_SEARCHBAR_ERASER_MINW_INC 38
+#define EDITFIELD_SEARCHBAR_ERASER_MINH_INC 38
+#define EDITFIELD_SEARCHBAR_ERASER_EVENT_MINW_INC 38
+#define EDITFIELD_SEARCHBAR_ERASER_EVENT_MINH_INC 50
+
+group { name: "elm/layout/searchbar/gallery";
+ images {
+ image: GALLERY_EDC_IMAGE_EDITFIELD_CLEAR COMP;
+ image: GALLERY_EDC_IMAGE_EDITFIELD_CLEAR_PRESS COMP;
+ image: GALLERY_EDC_IMAGE_SEARCH_INPUT_FIELD_BG COMP;
+ }
+ parts {
+ part { name: "top_padding_rect";
+ type: RECT;
+ scale: 1;
+ description { state: "default" 0.0;
+ visible: 1;
+ min: 0 SEARCHBAR_TOP_PADDING_INC;
+ fixed: 0 1;
+ align: 0 0;
+ color: SEARCHBAR_BACKGROUND_COLOR_INC;
+ rel2.relative: 1.0 0.0;
+ }
+ }
+ part { name: "bottom_padding_rect";
+ type: RECT;
+ scale: 1;
+ description { state: "default" 0.0;
+ visible: 1;
+ min: 0 SEARCHBAR_BOTTOM_PADDING_INC;
+ fixed: 0 1;
+ align: 0 1;
+ color: SEARCHBAR_BACKGROUND_COLOR_INC;
+ rel1.relative: 0.0 1.0;
+ }
+ }
+ part { name: "base_bg";
+ type: RECT;
+ scale: 1;
+ description { state: "default" 0.0;
+ visible: 0;
+ min: 0 SEARCHBAR_HEIGHT_INC;
+ align: 0 0.5;
+ fixed: 0 1;
+ rel1 {
+ relative: 0.0 1.0;
+ to: "top_padding_rect";
+ }
+ rel2 {
+ relative: 1.0 0.0;
+ to: "bottom_padding_rect";
+ }
+ }
+ }
+ part { name: "left_padding_rect";
+ type: RECT;
+ scale: 1;
+ description { state: "default" 0.0;
+ visible: 1;
+ min: SEARCHBAR_LEFT_PADDING_INC 0;
+ fixed: 1 0;
+ align: 0 0;
+ rel2.relative: 0.0 1.0;
+ color: SEARCHBAR_BACKGROUND_COLOR_INC;
+ }
+ }
+ part { name: "right_padding_rect";
+ type: RECT;
+ scale: 1;
+ description { state: "default" 0.0;
+ visible: 1;
+ min: SEARCHBAR_RIGHT_PADDING_INC 0;
+ fixed: 1 0;
+ align: 1 0;
+ rel1.relative: 1.0 0.0;
+ color: SEARCHBAR_BACKGROUND_COLOR_INC;
+ }
+ }
+ part { name: "right_field_and_btn_padding_rect";
+ type: RECT;
+ scale: 1;
+ description { state: "default" 0.0;
+ visible: 1;
+ min: SEARCHBAR_CANCEL_BUTTON_WITH_DOUBLE_PADDING_W_INC 0;
+ fixed: 1 0;
+ align: 1 0;
+ rel1.relative: 1.0 0.0;
+ color: SEARCHBAR_BACKGROUND_COLOR_INC;
+ }
+ }
+ part { name: "right_btn_padding_rect";
+ type: RECT;
+ scale: 1;
+ description { state: "default" 0.0;
+ visible: 1;
+ min: SEARCHBAR_CANCEL_BUTTON_WITH_PADDING_W_INC 0;
+ fixed: 1 0;
+ align: 1 0;
+ rel1.relative: 1.0 0.0;
+ color: SEARCHBAR_BACKGROUND_COLOR_INC;
+ }
+ }
+ part { name: "inputfield_rect";
+ type: IMAGE;
+ scale: 1;
+ description { state: "default" 0.0;
+ align: 0.0 0.5;
+ rel1 {
+ relative: 1.0 0.0;
+ to_x: "left_padding_rect";
+ to_y: "base_bg";
+ }
+ rel2 {
+ relative: 0.0 1.0;
+ to_x: "right_padding_rect";
+ to_y: "base_bg";
+ }
+ image {
+ normal: GALLERY_EDC_IMAGE_SEARCH_INPUT_FIELD_BG;
+ border: SEARCHBAR_INPUTFIELD_BORDER_INC;
+ }
+ }
+ description { state: "in" 0.0;
+ inherit: "default" 0.0;
+ rel2.to_x: "right_field_and_btn_padding_rect";
+ }
+ }
+ part { name: "left_icon_padding_rect";
+ type: RECT;
+ scale: 1;
+ description { state: "default" 0.0;
+ visible: 0;
+ min: SEARCHBAR_LEFT_ICON_PADDING_INC 0;
+ fixed: 1 0;
+ align: 0 0;
+ rel1.to: "inputfield_rect";
+ rel2 {
+ relative: 0.0 1.0;
+ to: "inputfield_rect";
+ }
+ }
+ }
+ part { name: "left_padding_search_textfield";
+ type: RECT;
+ scale: 1;
+ description { state: "default" 0.0;
+ visible: 0;
+ min: SEARCHBAR_LEFT_PADDING_SEARCHFIELD_INC 0;
+ fixed: 1 0;
+ align: 0.0 0.5;
+ rel1 {
+ relative: 1.0 0.0;
+ to_x: "left_icon_padding_rect";
+ to_y: "inputfield_rect";
+ }
+ rel2 {
+ relative: 1.0 1.0;
+ to_x: "left_icon_padding_rect";
+ to_y: "inputfield_rect";
+ }
+ }
+ }
+ part { name: "right_padding_search_textfield";
+ type: RECT;
+ scale: 1;
+ description { state: "default" 0.0;
+ visible: 0;
+ min: SEARCHBAR_RIGHT_PADDING_SEARCHFIELD_INC 0;
+ fixed: 1 0;
+ align: 1.0 0.5;
+ rel1 {
+ relative: 1.0 0.0;
+ to: "inputfield_rect";
+ }
+ rel2 {
+ relative: 1.0 1.0;
+ to: "inputfield_rect";
+ }
+ }
+ }
+ part { name: "search_textfield";
+ type: RECT;
+ mouse_events: 1;
+ scale: 1;
+ ignore_flags: ON_HOLD;
+ description { state: "default" 0.0;
+ color: 0 0 0 0;
+ min: 0 SEARCHBAR_SEARCH_TEXTFIELD_H_INC;
+ fixed: 0 1;
+ align: 0.0 0.5;
+ rel1 {
+ relative: 1.0 0.0;
+ to: "left_padding_search_textfield";
+ }
+ rel2 {
+ relative: 0.0 1.0;
+ to: "right_padding_search_textfield";
+ }
+ }
+ }
+ part { name: "button_cancel";
+ type: SWALLOW;
+ mouse_events: 1;
+ scale: 1;
+ description { state: "default" 0.0;
+ visible: 0;
+ fixed: 1 1;
+ min: SEARCHBAR_CANCEL_BUTTON_W_INC 0;
+ align: 0.0 0.5;
+ state: "default" 0.0;
+ rel1 {
+ relative: 1.0 1.0;
+ to_x: "base_bg";
+ to_y: "top_padding_rect";
+ }
+ rel2 {
+ relative: 1.0 0.0;
+ to_x: "base_bg";
+ to_y: "bottom_padding_rect";
+ }
+ }
+ description { state: "in" 0.0;
+ visible:1;
+ min: SEARCHBAR_CANCEL_BUTTON_W_INC 0;
+ align: 1.0 0.5;
+ rel1 {
+ relative: 0.0 1.0;
+ to_x: "right_btn_padding_rect";
+ to_y: "top_padding_rect";
+ }
+ rel2 {
+ relative: 0.0 0.0;
+ to_x: "right_padding_rect";
+ to_y: "bottom_padding_rect";
+ }
+ }
+ }
+ part { name: "top1";
+ type: RECT;
+ scale: 1;
+ ignore_flags: ON_HOLD;
+ description { state: "default" 0.0;
+ visible: 0;
+ min: 0 EDITFIELD_SEARCHBAR_TOP1_SINGLE_INC;
+ fixed: 1 1;
+ rel1 {
+ relative: 0.0 0.0;
+ to: "search_textfield";
+ }
+ rel2 {
+ relative: 1.0 0.0;
+ to: "search_textfield";
+ }
+ align: 0.5 0;
+ }
+ description { state: "elm.text.show" 0.0;
+ inherit: "default" 0.0;
+ min: 0 EDITFIELD_SEARCHBAR_TOP1_MULTI_INC;
+ }
+ }
+ part { name: "top2";
+ type: RECT;
+ scale: 1;
+ ignore_flags: ON_HOLD;
+ description { state: "default" 0.0;
+ visible: 0;
+ min: 0 EDITFIELD_SEARCHBAR_TOP2_INC;
+ fixed: 1 1;
+ rel1 {
+ relative: 0.0 0.0;
+ to: "search_textfield";
+ }
+ rel2 {
+ relative: 1.0 0.0;
+ to: "search_textfield";
+ }
+ align: 0.5 0;
+ }
+ }
+ part { name: "left1";
+ type: RECT;
+ scale: 1;
+ ignore_flags: ON_HOLD;
+ description { state: "default" 0.0;
+ visible: 0;
+ min: EDITFIELD_SEARCHBAR_LEFT1_INC 0;
+ fixed: 1 1;
+ align: 0 0;
+ rel1 {
+ relative: 0.0 0.0;
+ to: "search_textfield";
+ }
+ rel2 {
+ relative: 0.0 1.0;
+ to: "search_textfield";
+ }
+ }
+ }
+ part { name: "left2";
+ type: RECT;
+ scale: 1;
+ ignore_flags: ON_HOLD;
+ description { state: "default" 0.0;
+ visible: 0;
+ min: EDITFIELD_SEARCHBAR_LEFT2_INC 0;
+ fixed: 1 1;
+ align: 0 0;
+ rel1 {
+ relative: 0.0 0.0;
+ to: "search_textfield";
+ }
+ rel2 {
+ relative: 0.0 1.0;
+ to: "search_textfield";
+ }
+ }
+ }
+ part { name: "right1";
+ type: RECT;
+ scale: 1;
+ ignore_flags: ON_HOLD;
+ description { state: "default" 0.0;
+ visible: 0;
+ min: EDITFIELD_SEARCHBAR_RIGHT1_ERASER_SHOW_INC 0;
+ fixed: 1 1;
+ align: 1 0;
+ rel1 {
+ relative: 1.0 0.0;
+ to: "search_textfield";
+ }
+ rel2.to: "search_textfield";
+ }
+ }
+ part { name: "right2";
+ type: RECT;
+ scale: 1;
+ ignore_flags: ON_HOLD;
+ description { state: "default" 0.0;
+ visible: 0;
+ min: EDITFIELD_SEARCHBAR_RIGHT2_INC 0;
+ fixed: 1 1;
+ align: 1 0;
+ rel1 {
+ relative: 1.0 0.0;
+ to: "search_textfield";
+ }
+ rel2.to: "search_textfield";
+ }
+ }
+ part { name: "bottom1";
+ type: RECT;
+ scale: 1;
+ ignore_flags: ON_HOLD;
+ description { state: "default" 0.0;
+ visible: 0;
+ min: 0 EDITFIELD_SEARCHBAR_BOTTOM1_SINGLE_INC;
+ fixed: 1 1;
+ align: 0 1;
+ rel1 {
+ relative: 0.0 1.0;
+ to: "search_textfield";
+ }
+ rel2.to: "search_textfield";
+ }
+ description { state: "elm.text.show" 0.0;
+ inherit: "default" 0.0;
+ min: 0 EDITFIELD_SEARCHBAR_BOTTOM1_MULTI_INC;
+ }
+ }
+ part { name: "bottom2";
+ type: RECT;
+ scale: 1;
+ ignore_flags: ON_HOLD;
+ description { state: "default" 0.0;
+ visible: 0;
+ min: 0 EDITFIELD_SEARCHBAR_BOTTOM2_SINGLE_INC;
+ fixed: 0 1;
+ rel1 {
+ relative: 0.0 1.0;
+ to: "search_textfield";
+ }
+ rel2.to: "search_textfield";
+ align: 0 1;
+ }
+ description { state: "elm.text.show" 0.0;
+ inherit: "default" 0.0;
+ min: 0 EDITFIELD_SEARCHBAR_BOTTOM2_MULTI_INC;
+ }
+ }
+ part { name: "bottom3";
+ type: RECT;
+ scale: 1;
+ ignore_flags: ON_HOLD;
+ description { state: "default" 0.0;
+ visible: 0;
+ min: 0 EDITFIELD_SEARCHBAR_BOTTOM3_SINGLE_INC;
+ fixed: 0 1;
+ rel1 {
+ relative: 0.0 1.0;
+ to: "search_textfield";
+ }
+ rel2.to: "search_textfield";
+ align: 0 1;
+ }
+ description { state: "elm.text.show" 0.0;
+ inherit: "default" 0.0;
+ min: 0 EDITFIELD_SEARCHBAR_BOTTOM3_MULTI_INC;
+ }
+ }
+ part { name: "elm.text";
+ type: TEXT;
+ scale: 1;
+ ignore_flags: ON_HOLD;
+ description { state: "default" 0.0;
+ visible: 0;
+ align: 0.0 0.0;
+ min: 0 34;
+ fixed: 1 1;
+ rel1 {
+ relative: 1.0 1.0;
+ to_x: "left2";
+ to_y: "top2";
+ }
+ rel2 {
+ relative: 1.0 1.0;
+ to_x: "left2";
+ to_y: "top2";
+ }
+ color: EDITFIELD_TITLE_COLOR_INC;
+ text {
+ font: "SLP:style=Medium";
+ size: EDITFIELD_TITLE_SIZE_INC;
+ min: 1 1;
+ align: 0.0 0.0;
+ text_class: "slp";
+ }
+ }
+ description { state: "elm.text.show" 0.0;
+ inherit: "default" 0.0;
+ visible: 1;
+ }
+ }
+ part { name: "elm.guidetext";
+ type: TEXT;
+ scale: 1;
+ ignore_flags: ON_HOLD;
+ description { state: "default" 0.0;
+ align: 0.0 0.0;
+ fixed: 1 1;
+ rel1.to: "elm.swallow.content";
+ rel2.to: "elm.swallow.content";
+ color: EDITFIELD_GUIDE_TEXT_COLOR_INC;
+ text {
+ font: "SLP:style=Roman";
+ size: ENTRY_TEXT_SIZE_INC;
+ min: 0 0;
+ align: 0.0 0.5;
+ text_class: "slp";
+ }
+ }
+ description { state: "hidden" 0.0;
+ inherit: "default" 0.0;
+ visible: 0;
+ }
+ }
+ part {
+ name: "elm.swallow.content";
+ type: SWALLOW;
+ scale: 1;
+ ignore_flags: ON_HOLD;
+ description { state: "default" 0.0;
+ min: 0 40;
+ rel1 {
+ relative : 1.0 1.0;
+ to_x: "left1";
+ to_y: "top1";
+ }
+ rel2 {
+ relative : 0.0 0.0;
+ to_x: "right1";
+ to_y: "bottom1";
+ }
+ align: 0.0 0.5;
+ }
+ }
+ part { name: "eraser_image";
+ scale: 1;
+ description { state: "default" 0.0;
+ visible: 0;
+ min: EDITFIELD_SEARCHBAR_ERASER_MINW_INC EDITFIELD_SEARCHBAR_ERASER_MINH_INC;
+ fixed: 1 1;
+ align: 1 0.5;
+ rel1 {
+ relative: 0.0 0.5;
+ to_x : "right2";
+ }
+ rel2 {
+ relative: 0.0 0.5;
+ to_x : "right2";
+ }
+ }
+ description { state: "elm.eraser.show" 0.0;
+ inherit: "default" 0.0;
+ visible: 1;
+ image {
+ normal: GALLERY_EDC_IMAGE_EDITFIELD_CLEAR;
+ border: 10 10 10 10;
+ border_scale: 1;
+ }
+ }
+ description {
+ state: "elm.eraser.pressed" 0.0;
+ inherit: "default" 0.0;
+ visible: 1;
+ image {
+ normal: GALLERY_EDC_IMAGE_EDITFIELD_CLEAR_PRESS;
+ border: 8 8 8 8;
+ border_scale: 1;
+ }
+ }
+ }
+ part { name: "eraser";
+ type: RECT;
+ scale: 1;
+ mouse_events: 1;
+ description { state: "default" 0.0;
+ visible: 0;
+ min: EDITFIELD_SEARCHBAR_ERASER_EVENT_MINW_INC EDITFIELD_SEARCHBAR_ERASER_EVENT_MINH_INC;
+ fixed: 1 1;
+ align: 1 0.5;
+ color: 0 0 0 0;
+ rel1 {
+ relative: 0.0 0.5;
+ to_x : "right2";
+ }
+ rel2 {
+ relative: 0.0 0.5;
+ to_x : "right2";
+ }
+ }
+ description { state: "elm.eraser.show" 0.0;
+ inherit: "default" 0.0;
+ visible: 1;
+ }
+ }
+ }
+ programs {
+ program {
+ name: "guidetext_show";
+ signal: "elm,state,guidetext,show";
+ source: "elm";
+ action: STATE_SET "default" 0.0;
+ target: "elm.guidetext";
+ }
+ program {
+ name: "guidetext_hide";
+ signal: "elm,state,guidetext,hide";
+ source: "elm";
+ action: STATE_SET "hidden" 0.0;
+ target: "elm.guidetext";
+ }
+ program {
+ name: "eraser_show";
+ signal: "elm,state,eraser,show";
+ source: "elm";
+ action: STATE_SET "elm.eraser.show" 0.0;
+ target: "eraser_image";
+ target: "eraser";
+ }
+ program {
+ name: "eraser_hide";
+ signal: "elm,state,eraser,hide";
+ source: "elm";
+ action: STATE_SET "default" 0.0;
+ target: "eraser_image";
+ target: "eraser";
+ }
+ program {
+ name: "label_show";
+ signal: "elm,state,title,show";
+ source: "elm";
+ action: STATE_SET "elm.text.show" 0.0;
+ target: "elm.text";
+ target: "top1";
+ target: "bottom1";
+ target: "bottom2";
+ target: "bottom3";
+ }
+ program {
+ name: "label_hide";
+ signal: "elm,state,title,hide";
+ source: "elm";
+ action: STATE_SET "default" 0.0;
+ target: "elm.text";
+ target: "top1";
+ target: "bottom1";
+ target: "bottom2";
+ target: "bottom3";
+ }
+ program {
+ name: "eraser_clicked";
+ signal: "mouse,clicked,1";
+ source: "eraser";
+ action: SIGNAL_EMIT "elm,eraser,clicked" "elm";
+ }
+ program {
+ name: "bg_clicked";
+ signal: "mouse,clicked,1";
+ source: "search_textfield";
+ action: SIGNAL_EMIT "elm,bg,clicked" "elm";
+ }
+ program { name: "cancel_in";
+ signal: "cancel,in";
+ source: "";
+ action: STATE_SET "in" 0.0;
+ target: "button_cancel";
+ target: "inputfield_rect";
+ transition: ACCELERATE 0.4;
+ }
+ program { name: "cancel_out";
+ signal: "cancel,out";
+ source: "";
+ action: STATE_SET "default" 0.0;
+ target: "button_cancel";
+ target: "inputfield_rect";
+ transition: ACCELERATE 0.4;
+ }
+ program { name: "cancel_show";
+ signal: "cancel,show";
+ source: "";
+ action: STATE_SET "in" 0.0;
+ target: "button_cancel";
+ target: "inputfield_rect";
+ }
+ program { name: "cancel_hide";
+ signal: "cancel,hide";
+ source: "";
+ action: STATE_SET "default" 0.0;
+ target: "button_cancel";
+ target: "inputfield_rect";
+ }
+ program {
+ name: "eraser_pressed";
+ signal: "mouse,down,1";
+ source: "eraser";
+ action: STATE_SET "elm.eraser.pressed" 0.0;
+ target: "eraser_image";
+ }
+ program {
+ name: "eraser_unpressed";
+ signal: "mouse,up,1";
+ source: "eraser";
+ action: STATE_SET "elm.eraser.show" 0.0;
+ target: "eraser_image";
+ }
+ }
+}
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* 14 + 334 + 10 */
+#define ALBUM_ITEM_W 358
+/* 26 + 334 */
+#define ALBUM_ITEM_H 360
+
+#define ALBUM_W 334
+#define ALBUM_H 334
+
+#define ALBUM_GAP_L 12
+#define ALBUM_GAP_R 12
+#define ALBUM_GAP_T 26
+
+#define ALBUM_ICON_W 318
+#define ALBUM_ICON_H 318
+
+#define ALBUM_ICON_GAP_L 8
+#define ALBUM_ICON_GAP_R 8
+#define ALBUM_ICON_GAP_B 16
+#define ALBUM_ICON_PAD 3
+
+#define ALBUM_TEXT_AREA_W 207
+#define ALBUM_TEXT_AREA_H 102
+#define ALBUM_TEXT_GAP_L 4
+#define ALBUM_TEXT_GAP_R 4
+#define ALBUM_TEXT_SNS_X 60
+#define ALBUM_TEXT_NAME_H 32
+#define ALBUM_TEXT_DATE_H 25
+#define ALBUM_PBAR_W 183
+#define ALBUM_PBAR_H 10
+#define ALBUM_PBAR_GAP_L 6
+#define ALBUM_PBAR_GAP_T 8
+
+#define ALBUM_SNS_ICON_W 32
+#define ALBUM_SNS_ICON_H 32
+
+#define ALBUM_RENAME_BTN_W 64
+#define ALBUM_RENAME_BTN_H 64
+
+#define ALBUM_CHECKBOX_W 60
+#define ALBUM_CHECKBOX_H 60
+#define ALBUM_CHECKBOX_GAP_L 1
+#define ALBUM_CHECKBOX_GAP_T 8
+
+#define ALBUM_ICON_BG_COLOR_INC 190 189 189 255
+
+group {
+ name: "elm/gengrid/item/gallery/albums_view/default";
+
+ data.item: "texts" "elm.text.name elm.text.date elm.text.count";
+ data.item: "contents" "elm.swallow.onlyicon label_bg";
+ images {
+ image: GALLERY_EDC_IMAGE_MAIN_FOLDER_BG COMP;
+ }
+
+ parts {
+ part {
+ name: "bg";
+ type: RECT;
+ description {
+ state: "default" 0.0;
+ color: 255 0 0 0;
+ rel1 { relative: 0.0 0.0; }
+ rel2 { relative: 1.0 1.0; }
+ }
+ }
+ part { name: "icon_bg_img";
+ type: IMAGE;
+ mouse_events: 1;
+ scale : 1;
+ description {
+ min : ALBUM_W ALBUM_H;
+ state: "default" 0.0;
+ image {
+ normal : GALLERY_EDC_IMAGE_MAIN_FOLDER_BG;
+ }
+ rel1 { relative: ALBUM_GAP_L/ALBUM_ITEM_W ALBUM_GAP_T/ALBUM_ITEM_H; to:"bg"; }
+ rel2 { relative: (ALBUM_ITEM_W-ALBUM_GAP_R-1)/ALBUM_ITEM_W 1.0; to:"bg"; }
+ }
+ }
+ part { name: "icon_bg";
+ type: RECT;
+ mouse_events: 1;
+ scale : 1;
+ description {
+ min : ALBUM_ICON_W ALBUM_ICON_H;
+ state: "default" 0.0;
+ color: ALBUM_ICON_BG_COLOR_INC;
+ rel1 { relative: ALBUM_ICON_GAP_L/ALBUM_ICON_W 0.0; to:"icon_bg_img"; }
+ rel2 { relative: (ALBUM_ICON_W-ALBUM_ICON_GAP_R+2)/ALBUM_ICON_W (ALBUM_ICON_H-ALBUM_ICON_GAP_B+2)/ALBUM_ICON_H; to:"icon_bg_img"; }
+ }
+ }
+ part {
+ name: "elm.swallow.onlyicon";
+ type: SWALLOW;
+ mouse_events: 1;
+ repeat_events: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: (ALBUM_ICON_PAD/ALBUM_ICON_W) (ALBUM_ICON_PAD/ALBUM_ICON_H); to: "icon_bg"; }
+ rel2 { relative: (ALBUM_ICON_W-ALBUM_ICON_PAD)/ALBUM_ICON_W (ALBUM_ICON_H-ALBUM_ICON_PAD)/ALBUM_ICON_H; to: "icon_bg"; }
+ }
+ }
+ part {
+ name: "label_bg";
+ type: SWALLOW;
+ mouse_events: 1;
+ repeat_events: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: (ALBUM_ICON_PAD/ALBUM_ICON_W) (ALBUM_ICON_PAD/ALBUM_ICON_H); offset: 0 0; to: "icon_bg"; }
+ rel2 { relative: ((ALBUM_ICON_PAD+ALBUM_TEXT_AREA_W-1)/ALBUM_ICON_W) ((ALBUM_ICON_PAD+ALBUM_TEXT_AREA_H-1)/ALBUM_ICON_H); offset: 0 0; to: "icon_bg"; }
+ }
+ }
+ part {
+ name: "edit_text_bg";
+ type: RECT;
+ mouse_events: 1;
+ repeat_events: 1;
+ description {
+ state: "default" 0.0;
+ visible: 0;
+ rel1 { relative: 0.0 0.0; to: "label_bg"; }
+ rel2 { relative: 1.0 1.0; to: "label_bg"; }
+ color: 100 100 100 100;
+ }
+ }
+ part {
+ name: "elm.text.date";
+ type: TEXT;
+ mouse_events: 1;
+ repeat_events: 1;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: ALBUM_TEXT_GAP_L/ALBUM_TEXT_AREA_W ALBUM_TEXT_NAME_H/ALBUM_TEXT_AREA_H; to: "label_bg"; }
+ rel2 { relative: (ALBUM_TEXT_AREA_W-ALBUM_TEXT_GAP_L-1)/ALBUM_TEXT_AREA_W (ALBUM_TEXT_NAME_H+ALBUM_TEXT_DATE_H-1)/ALBUM_TEXT_AREA_H; to: "label_bg"; }
+ color: 190 190 190 255;
+ text {
+ font: "SLP:style=Medium";
+ text_class: "slp";
+ size: 22;
+ align: 0.0 0.5;
+ }
+ }
+ }
+ part {
+ name: "elm.text.count";
+ type: TEXT;
+ mouse_events: 1;
+ repeat_events: 1;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ visible: 1;
+ rel1 { relative: ((ALBUM_TEXT_GAP_L+ALBUM_SNS_ICON_W+1)/ALBUM_TEXT_AREA_W) ALBUM_TEXT_SNS_X/ALBUM_TEXT_AREA_H; to: "label_bg"; }
+ rel2 { relative: (ALBUM_TEXT_AREA_W-ALBUM_TEXT_GAP_L-1)/ALBUM_TEXT_AREA_W 1.0; to: "label_bg"; }
+ color: 255 255 255 255;
+ text {
+ font: "SLP:style=Medium";
+ text_class: "slp";
+ size: 38;
+ align: 1.0 0.5;
+ }
+ }
+ }
+ part {
+ name: "elm.text.name";
+ type: TEXT;
+ mouse_events: 1;
+ repeat_events: 1;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: ALBUM_TEXT_GAP_L/ALBUM_TEXT_AREA_W 0.0; to: "label_bg"; }
+ rel2 { relative: (ALBUM_TEXT_AREA_W-ALBUM_TEXT_GAP_L-1)/ALBUM_TEXT_AREA_W (ALBUM_TEXT_NAME_H-1)/ALBUM_TEXT_AREA_H; to: "label_bg"; }
+ color: 255 255 255 255;
+ text {
+ font: "SLP:style=Medium";
+ text_class: "slp";
+ size: 28;
+ align: 0.0 0.5;
+ }
+ }
+ }
+ }
+}
+
+group {
+ name: "elm/gengrid/item/gallery/albums_edit_view/default";
+ data.item: "texts" "elm.text.name elm.text.date elm.text.count";
+ data.item: "contents" "elm.swallow.onlyicon elm.swallow.end elm.swallow.check_grid label_bg elm.swallow.rename";
+ images {
+ image: GALLERY_EDC_IMAGE_MAIN_FOLDER_BG COMP;
+ }
+
+ parts {
+ part {
+ name: "bg";
+ type: RECT;
+ description {
+ state: "default" 0.0;
+ color: 255 0 0 0;
+ rel1 { relative: 0.0 0.0; }
+ rel2 { relative: 1.0 1.0; }
+ }
+ }
+ part { name: "icon_bg_img";
+ type: IMAGE;
+ mouse_events: 1;
+ scale : 1;
+ description {
+ min : ALBUM_W ALBUM_H;
+ state: "default" 0.0;
+ image {
+ normal : GALLERY_EDC_IMAGE_MAIN_FOLDER_BG;
+ }
+ rel1 { relative: ALBUM_GAP_L/ALBUM_ITEM_W ALBUM_GAP_T/ALBUM_ITEM_H; to:"bg"; }
+ rel2 { relative: (ALBUM_ITEM_W-ALBUM_GAP_R-1)/ALBUM_ITEM_W 1.0; to:"bg"; }
+ }
+ }
+ part { name: "icon_bg";
+ type: RECT;
+ mouse_events: 1;
+ scale : 1;
+ description {
+ min : ALBUM_ICON_W ALBUM_ICON_H;
+ state: "default" 0.0;
+ color: ALBUM_ICON_BG_COLOR_INC;
+ rel1 { relative: ALBUM_ICON_GAP_L/ALBUM_ICON_W 0.0; to:"icon_bg_img"; }
+ rel2 { relative: (ALBUM_ICON_W-ALBUM_ICON_GAP_R+2)/ALBUM_ICON_W (ALBUM_ICON_H-ALBUM_ICON_GAP_B+2)/ALBUM_ICON_H; to:"icon_bg_img"; }
+ }
+ }
+ part {
+ name: "elm.swallow.onlyicon";
+ type: SWALLOW;
+ mouse_events: 1;
+ repeat_events: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: (ALBUM_ICON_PAD/ALBUM_ICON_W) (ALBUM_ICON_PAD/ALBUM_ICON_H); to: "icon_bg"; }
+ rel2 { relative: (ALBUM_ICON_W-ALBUM_ICON_PAD)/ALBUM_ICON_W (ALBUM_ICON_H-ALBUM_ICON_PAD)/ALBUM_ICON_H; to: "icon_bg"; }
+ }
+ }
+ part {
+ name: "label_bg";
+ type: SWALLOW;
+ mouse_events: 1;
+ repeat_events: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: (ALBUM_ICON_PAD/ALBUM_ICON_W) (ALBUM_ICON_PAD/ALBUM_ICON_H); offset: 0 0; to: "icon_bg"; }
+ rel2 { relative: ((ALBUM_ICON_PAD+ALBUM_TEXT_AREA_W-1)/ALBUM_ICON_W) ((ALBUM_ICON_PAD+ALBUM_TEXT_AREA_H-1)/ALBUM_ICON_H); offset: 0 0; to: "icon_bg"; }
+ }
+ }
+ part {
+ name: "edit_text_bg";
+ type: RECT;
+ mouse_events: 1;
+ repeat_events: 1;
+ description {
+ state: "default" 0.0;
+ visible: 0;
+ rel1 { relative: 0.0 0.0; to: "label_bg"; }
+ rel2 { relative: 1.0 1.0; to: "label_bg"; }
+ color: 100 100 100 100;
+ }
+ }
+ part {
+ name: "elm.text.date";
+ type: TEXT;
+ mouse_events: 1;
+ repeat_events: 1;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: ALBUM_TEXT_GAP_L/ALBUM_TEXT_AREA_W ALBUM_TEXT_NAME_H/ALBUM_TEXT_AREA_H; to: "label_bg"; }
+ rel2 { relative: (ALBUM_TEXT_AREA_W-ALBUM_TEXT_GAP_L-1)/ALBUM_TEXT_AREA_W (ALBUM_TEXT_NAME_H+ALBUM_TEXT_DATE_H-1)/ALBUM_TEXT_AREA_H; to: "label_bg"; }
+ color: 190 190 190 255;
+ text {
+ font: "SLP:style=Medium";
+ text_class: "slp";
+ size: 22;
+ align: 0.0 0.5;
+ }
+ }
+ }
+ part {
+ name: "elm.text.count";
+ type: TEXT;
+ mouse_events: 1;
+ repeat_events: 1;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ visible: 1;
+ rel1 { relative: ((ALBUM_TEXT_GAP_L+ALBUM_SNS_ICON_W+1)/ALBUM_TEXT_AREA_W) ALBUM_TEXT_SNS_X/ALBUM_TEXT_AREA_H; to: "label_bg"; }
+ rel2 { relative: (ALBUM_TEXT_AREA_W-ALBUM_TEXT_GAP_L-1)/ALBUM_TEXT_AREA_W 1.0; to: "label_bg"; }
+ color: 255 255 255 255;
+ text {
+ font: "SLP:style=Medium";
+ text_class: "slp";
+ size: 38;
+ align: 1.0 0.5;
+ }
+ }
+ }
+ part {
+ name: "elm.text.name";
+ type: TEXT;
+ mouse_events: 1;
+ repeat_events: 1;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: (ALBUM_TEXT_GAP_L+25)/ALBUM_TEXT_AREA_W 0.0; to: "label_bg"; }
+ rel2 { relative: (ALBUM_TEXT_AREA_W-ALBUM_TEXT_GAP_L-1)/ALBUM_TEXT_AREA_W (ALBUM_TEXT_NAME_H-1)/ALBUM_TEXT_AREA_H; to: "label_bg"; }
+ color: 255 255 255 255;
+ text {
+ font: "SLP:style=Medium";
+ text_class: "slp";
+ size: 28;
+ align: 0.0 0.5;
+ }
+ }
+ }
+ part {
+ name: "elm.swallow.rename";
+ type: SWALLOW;
+ description {
+ state: "default" 0.0;
+ min: ALBUM_RENAME_BTN_W ALBUM_RENAME_BTN_H;
+ max: ALBUM_RENAME_BTN_W ALBUM_RENAME_BTN_H;
+ rel1 { relative: (ALBUM_ICON_W-ALBUM_ICON_PAD-ALBUM_RENAME_BTN_W)/ALBUM_ICON_W (ALBUM_ICON_H-ALBUM_ICON_PAD-ALBUM_RENAME_BTN_H)/ALBUM_ICON_H); to:"icon_bg"; }
+ rel2 { relative: (ALBUM_ICON_W-ALBUM_ICON_PAD)/ALBUM_ICON_W (ALBUM_ICON_H-ALBUM_ICON_PAD)/ALBUM_ICON_H); to:"icon_bg"; }
+ }
+ }
+ part {
+ name: "elm.swallow.check_grid";
+ type: SWALLOW;
+ mouse_events: 1;
+ description {
+ state: "default" 0.0;
+ max : (ALBUM_ICON_W+2) (ALBUM_ICON_H+2);
+ rel1 { relative: (ALBUM_ICON_GAP_L-1)/ALBUM_ICON_W 0.0; to:"icon_bg_img"; }
+ rel2 { relative: (ALBUM_ICON_W-ALBUM_ICON_GAP_R+3)/ALBUM_ICON_W (ALBUM_ICON_H-ALBUM_ICON_GAP_B+4)/ALBUM_ICON_H; to:"icon_bg_img"; }
+ }
+ }
+ part {
+ name: "elm.swallow.end";
+ type: SWALLOW;
+ description {
+ state: "default" 0.0;
+ min: ALBUM_CHECKBOX_W ALBUM_CHECKBOX_H;
+ max: ALBUM_CHECKBOX_W ALBUM_CHECKBOX_H;
+ rel1 { relative: (ALBUM_CHECKBOX_GAP_L)/ALBUM_ITEM_W (ALBUM_CHECKBOX_GAP_T)/ALBUM_ITEM_H; to:"bg"; }
+ rel2 { relative: (ALBUM_CHECKBOX_GAP_L+ALBUM_CHECKBOX_W)/ALBUM_ITEM_W (ALBUM_CHECKBOX_GAP_T+ALBUM_CHECKBOX_H+1)/ALBUM_ITEM_H; to:"bg"; }
+ }
+ }
+ }
+}
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* Grid item background size W: 10+158+10; H: 24+158 */
+#define W 178
+#define H 193
+#define GAP_W 2
+#define GAP_H 18
+
+/* Favourites icon boundary size */
+#define FAVOR_ICON_W 30
+#define FAVOR_ICON_H 30
+
+group {
+ name: "elm/gengrid/item/gallery/thumbnail_view/default";
+
+ data.item: "contents" "elm.swallow.icon elm.swallow.end";
+
+ parts {
+ part {
+ name: "bg";
+ type: RECT;
+ description {
+ state: "default" 0.0;
+ color: 0 0 0 0;
+ rel1 { relative: 0.0 0.0; offset: 0 0;}
+ rel2 { relative: 1.0 1.0; offset: 0 0;}
+ }
+ }
+ part {
+ name: "icon_bg";
+ type: RECT;
+ scale : 1;
+ description {
+ state: "default" 0.0;
+ align: 0.5 0.5;
+ visible: 0;
+ color: 0 0 0 0;
+ rel1 { relative: 0.0 0.0;to:"bg"; }
+ rel2 { relative: 1.0 1.0;to:"bg"; }
+
+ }
+ }
+
+ part {
+ name: "elm.swallow.icon";
+ type: SWALLOW;
+ mouse_events: 1;
+ description {
+ state: "default" 0.0;
+ color: 0 0 0 0;
+ rel1 { relative: 0.0 0.0; to: "icon_bg"; }
+ rel2 { relative: 1.0 1.0; to: "icon_bg"; }
+ }
+ }
+ part {
+ name: "elm.swallow.end";
+ type: SWALLOW;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to: "elm.swallow.icon"; }
+ rel2 { relative: 1.0 1.0; to: "elm.swallow.icon"; }
+ }
+ }
+ }
+
+ programs {
+ program {
+ name: "movedonw_bg";
+ signal: "movedown,bg,show";
+ source: "bg";
+ action: STATE_SET "move_down" 0.0;
+ target: "bg";
+ }
+ }
+}
+
+
+
+
+group
+{
+ name: "elm/gengrid/photoframe/default_layout";
+
+ parts {
+ part {
+ name: "bg";
+ type: RECT;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0;}
+ rel2 { relative: 1.0 1.0;}
+ color: 0 0 0 0;
+ }
+ description {
+ state: "shrink" 0.0;
+ rel1 { relative: 0.03 0.03;}
+ rel2 { relative: 0.97 0.97;}
+ color: 0 0 0 0;
+ }
+ }
+ part {
+ name: "elm.swallow.icon";
+ type: SWALLOW;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: GAP_W/W (GAP_H+1)/H;}
+ rel2 { relative: (W-GAP_W)/W 1;}
+ }
+ }
+ }
+
+ programs {
+ program {
+ name: "mouse_down_shrink";
+ signal: "mouse,down,shrink";
+ source: "bg";
+ action: STATE_SET "shrink" 0.0;
+ target: "bg";
+ //after: "expand";
+ transition: LINEAR 0.1;
+ }
+ program {
+ name: "mouse_up_expand";
+ signal: "mouse,up,expand";
+ source: "bg";
+ action: STATE_SET "default" 0.0;
+ target: "bg";
+ transition: LINEAR 0.05;
+ after: "shrink,expand,done,icon";
+ }
+
+ program {
+ name: "shrink";
+ signal: "shrink";
+ source: "bg";
+ action: STATE_SET "shrink" 0.0;
+ target: "bg";
+ after: "expand";
+ transition: LINEAR 0.1;
+ }
+ program {
+ name: "expand";
+ action: STATE_SET "default" 0.0;
+ target: "bg";
+ transition: LINEAR 0.05;
+ after: "shrink,expand,done,icon";
+ }
+ program {
+ name: "shrink,expand,done,icon";
+ action: SIGNAL_EMIT "shrink,expand,done" "bg";
+ }
+ }
+}
+
+group
+{
+ name: "elm/gengrid/photoframe/default_layout_favor";
+
+ parts {
+ part {
+ name: "bg";
+ type: RECT;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0;}
+ rel2 { relative: 1.0 1.0;}
+ color: 0 0 0 0;
+ }
+ description {
+ state: "shrink" 0.0;
+ rel1 { relative: 0.03 0.03;}
+ rel2 { relative: 0.97 0.97;}
+ color: 0 0 0 0;
+ }
+ }
+ part {
+ name: "elm.swallow.icon";
+ type: SWALLOW;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: GAP_W/W (GAP_H+1)/H;}
+ rel2 { relative: (W-GAP_W)/W 1;}
+ }
+ }
+#ifdef _USE_FAVOR_AND_BOOKMARK_ICON
+ part {
+ name: "elm.swallow.favoricon";
+ type: SWALLOW;
+ mouse_events: 0;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ align: 0.5 0.5;
+ rel1 { relative: GAP_W/W (H-FAVOR_ICON_H+1)/H;}
+ rel2 { relative: (FAVOR_ICON_W+GAP_W)/W 1;}
+ }
+ }
+#endif
+ }
+
+ programs {
+ program {
+ name: "mouse_down_shrink";
+ signal: "mouse,down,shrink";
+ source: "bg";
+ action: STATE_SET "shrink" 0.0;
+ target: "bg";
+ //after: "expand";
+ transition: LINEAR 0.1;
+ }
+ program {
+ name: "mouse_up_expand";
+ signal: "mouse,up,expand";
+ source: "bg";
+ action: STATE_SET "default" 0.0;
+ target: "bg";
+ transition: LINEAR 0.05;
+ after: "shrink,expand,done,icon";
+ }
+
+ program {
+ name: "shrink";
+ signal: "shrink";
+ source: "bg";
+ action: STATE_SET "shrink" 0.0;
+ target: "bg";
+ after: "expand";
+ transition: LINEAR 0.1;
+ }
+ program {
+ name: "expand";
+ action: STATE_SET "default" 0.0;
+ target: "bg";
+ transition: LINEAR 0.05;
+ after: "shrink,expand,done,icon";
+ }
+ program {
+ name: "shrink,expand,done,icon";
+ action: SIGNAL_EMIT "shrink,expand,done" "bg";
+ }
+ }
+}
+
+group
+{
+ name: "elm/gengrid/photoframe/default_layout_video";
+ images {
+ image: GALLERY_EDC_IMAGE_BUTTON_PLAY COMP;
+ }
+
+ parts {
+ part {
+ name: "bg";
+ type: RECT;
+ mouse_events: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0;}
+ rel2 { relative: 1.0 1.0;}
+ color: 0 0 0 0;
+ }
+ description {
+ state: "shrink" 0.0;
+ rel1 { relative: 0.03 0.03;}
+ rel2 { relative: 0.97 0.97;}
+ color: 0 0 0 0;
+ }
+ }
+ part {
+ name: "elm.swallow.icon";
+ type: SWALLOW;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: GAP_W/W (GAP_H+1)/H;}
+ rel2 { relative: (W-GAP_W)/W 1;}
+ }
+ }
+ part {
+ name: "elm.videoicon_bg";
+ type: RECT;
+ mouse_events: 0;
+ scale : 1;
+ description {
+ state: "default" 0.0;
+ color: 0 0 0 130;
+ align: 1.0 0.0;
+ rel1 { relative: GAP_W/W (H-FAVOR_ICON_H+1)/H;}
+ rel2 { relative: (FAVOR_ICON_W+GAP_W)/W 1;}
+ }
+ }
+ part {
+ name: "elm.text.bg";
+ type: RECT;
+ mouse_events: 0;
+ scale : 1;
+ description {
+ state: "default" 0.0;
+ color: 0 0 0 130;
+ align: 0.0 1.0;
+ rel1 { relative: 1 0; to: "elm.videoicon_bg";}
+ rel2 { relative: (W-GAP_W)/W 1; to_y: "elm.videoicon_bg";}
+ }
+ }
+ part {
+ name: "elm.swallow.videoicon";
+ type: IMAGE;
+ mouse_events: 0;
+ repeat_events: 0;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ align: 0.5 0.5;
+ aspect: 1.0 1.0;
+ rel1 { relative: 0 0; to: "elm.videoicon_bg";}
+ rel2 { relative: 1 1; to: "elm.videoicon_bg";}
+ image.normal: GALLERY_EDC_IMAGE_BUTTON_PLAY;
+ }
+ }
+ part {
+ name: "elm.text";
+ type: TEXT;
+ mouse_events: 1;
+ repeat_events: 1;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ align: 0.0 1.0;
+ rel1 { relative: 0.0 0.0; to: "elm.text.bg"; }
+ rel2 { relative: 1.0 1.0; to: "elm.text.bg"; }
+ color: 255 255 255 255;
+ text {
+ font: "SLP:style=Bold";
+ text_class: "slp";
+ size: 26;
+ align: 0.9 0.5;
+ }
+ }
+ }
+ }
+ programs {
+ program {
+ name: "mouse_down_shrink";
+ signal: "mouse,down,shrink";
+ source: "bg";
+ action: STATE_SET "shrink" 0.0;
+ target: "bg";
+ //after: "expand";
+ transition: LINEAR 0.1;
+ }
+ program {
+ name: "mouse_up_expand";
+ signal: "mouse,up,expand";
+ source: "bg";
+ action: STATE_SET "default" 0.0;
+ target: "bg";
+ transition: LINEAR 0.05;
+ after: "shrink,expand,done,icon";
+ }
+
+ program {
+ name: "shrink";
+ signal: "shrink";
+ source: "bg";
+ action: STATE_SET "shrink" 0.0;
+ target: "bg";
+ after: "expand";
+ transition: LINEAR 0.1;
+ }
+ program {
+ name: "expand";
+ action: STATE_SET "default" 0.0;
+ target: "bg";
+ transition: LINEAR 0.05;
+ after: "shrink,expand,done,icon";
+ }
+ program {
+ name: "shrink,expand,done,icon";
+ action: SIGNAL_EMIT "shrink,expand,done" "bg";
+ }
+ }
+}
+
+group
+{
+ name: "elm/gengrid/photoframe/default_layout_video_favor";
+ images {
+ image: GALLERY_EDC_IMAGE_BUTTON_PLAY COMP;
+ }
+
+ parts {
+ part {
+ name: "bg";
+ type: RECT;
+ mouse_events: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0;}
+ rel2 { relative: 1.0 1.0;}
+ color: 0 0 0 0;
+ }
+ description {
+ state: "shrink" 0.0;
+ rel1 { relative: 0.03 0.03;}
+ rel2 { relative: 0.97 0.97;}
+ color: 0 0 0 0;
+ }
+ }
+ part {
+ name: "elm.swallow.icon";
+ type: SWALLOW;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: GAP_W/W (GAP_H+1)/H;}
+ rel2 { relative: (W-GAP_W)/W 1;}
+ }
+ }
+ part {
+ name: "elm.videoicon_bg";
+ type: RECT;
+ mouse_events: 0;
+ scale : 1;
+ description {
+ state: "default" 0.0;
+ color: 0 0 0 130;
+ align: 1.0 0.0;
+ rel1 { relative: GAP_W/W (H-FAVOR_ICON_H+1)/H;}
+ rel2 { relative: (FAVOR_ICON_W+GAP_W)/W 1;}
+ }
+ }
+#ifdef _USE_FAVOR_AND_BOOKMARK_ICON
+ part {
+ name: "favoricon_bg";
+ type: RECT;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ color: 0 0 0 130;
+ align: 1.0 0.0;
+ rel1 { relative: 1 0; to: "elm.videoicon_bg";}
+ rel2 { relative: (FAVOR_ICON_W*2+GAP_W)/W 1; to_y: "elm.videoicon_bg";}
+ }
+ }
+#endif
+ part {
+ name: "elm.text.bg";
+ type: RECT;
+ mouse_events: 0;
+ scale : 1;
+ description {
+ state: "default" 0.0;
+ color: 0 0 0 130;
+ align: 0.0 1.0;
+#ifdef _USE_FAVOR_AND_BOOKMARK_ICON
+ rel1 { relative: 1 0; to: "favoricon_bg";}
+#else
+ rel1 { relative: 1 0; to: "elm.videoicon_bg";}
+#endif
+ rel2 { relative: (W-GAP_W)/W 1; to_y: "elm.videoicon_bg";}
+ }
+ }
+ part {
+ name: "elm.swallow.videoicon";
+ type: IMAGE;
+ mouse_events: 0;
+ repeat_events: 0;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ align: 0.5 0.5;
+ aspect: 1.0 1.0;
+ rel1 { relative: 0 0; to: "elm.videoicon_bg";}
+ rel2 { relative: 1 1; to: "elm.videoicon_bg";}
+ image.normal: GALLERY_EDC_IMAGE_BUTTON_PLAY;
+ }
+ }
+ part {
+ name: "elm.text";
+ type: TEXT;
+ mouse_events: 1;
+ repeat_events: 1;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ align: 0.0 1.0;
+ rel1 { relative: 0.0 0.0; to: "elm.text.bg"; }
+ rel2 { relative: 1.0 1.0; to: "elm.text.bg"; }
+ color: 255 255 255 255;
+ text {
+ font: "SLP:style=Bold";
+ text_class: "slp";
+ size: 26;
+ align: 0.9 0.5;
+ }
+ }
+ }
+#ifdef _USE_FAVOR_AND_BOOKMARK_ICON
+ part {
+ name: "elm.swallow.favoricon";
+ type: SWALLOW;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ align: 0.5 0.5;
+ rel1 { relative: 0.0 0.0; to: "favoricon_bg"; }
+ rel2 { relative: 1.0 1.0; to: "favoricon_bg"; }
+ }
+ }
+#endif
+ }
+ programs {
+ program {
+ name: "mouse_down_shrink";
+ signal: "mouse,down,shrink";
+ source: "bg";
+ action: STATE_SET "shrink" 0.0;
+ target: "bg";
+ //after: "expand";
+ transition: LINEAR 0.1;
+ }
+ program {
+ name: "mouse_up_expand";
+ signal: "mouse,up,expand";
+ source: "bg";
+ action: STATE_SET "default" 0.0;
+ target: "bg";
+ transition: LINEAR 0.05;
+ after: "shrink,expand,done,icon";
+ }
+
+ program {
+ name: "shrink";
+ signal: "shrink";
+ source: "bg";
+ action: STATE_SET "shrink" 0.0;
+ target: "bg";
+ after: "expand";
+ transition: LINEAR 0.1;
+ }
+ program {
+ name: "expand";
+ action: STATE_SET "default" 0.0;
+ target: "bg";
+ transition: LINEAR 0.05;
+ after: "shrink,expand,done,icon";
+ }
+ program {
+ name: "shrink,expand,done,icon";
+ action: SIGNAL_EMIT "shrink,expand,done" "bg";
+ }
+ }
+}
+
+group
+{
+ name: "elm/gengrid/photoframe/default_layout_video_bookmark";
+ images {
+ image: GALLERY_EDC_IMAGE_BUTTON_PLAY COMP;
+ }
+
+ parts {
+ part {
+ name: "bg";
+ type: RECT;
+ mouse_events: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0;}
+ rel2 { relative: 1.0 1.0;}
+ color: 0 0 0 0;
+ }
+ description {
+ state: "shrink" 0.0;
+ rel1 { relative: 0.03 0.03;}
+ rel2 { relative: 0.97 0.97;}
+ color: 0 0 0 0;
+ }
+ }
+ part {
+ name: "elm.swallow.icon";
+ type: SWALLOW;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: GAP_W/W (GAP_H+1)/H;}
+ rel2 { relative: (W-GAP_W)/W 1;}
+ }
+ }
+ part {
+ name: "elm.videoicon_bg";
+ type: RECT;
+ mouse_events: 0;
+ scale : 1;
+ description {
+ state: "default" 0.0;
+ color: 0 0 0 130;
+ align: 1.0 0.0;
+ rel1 { relative: GAP_W/W (H-FAVOR_ICON_H+1)/H;}
+ rel2 { relative: (FAVOR_ICON_W+GAP_W)/W 1;}
+ }
+ }
+#ifdef _USE_FAVOR_AND_BOOKMARK_ICON
+ part {
+ name: "bookmarkicon_bg";
+ type: RECT;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ color: 0 0 0 130;
+ align: 1.0 0.0;
+ rel1 { relative: 1 0; to: "elm.videoicon_bg";}
+ rel2 { relative: (FAVOR_ICON_W*2+GAP_W)/W 1; to_y: "elm.videoicon_bg";}
+ }
+ }
+#endif
+ part {
+ name: "elm.text.bg";
+ type: RECT;
+ mouse_events: 0;
+ scale : 1;
+ description {
+ state: "default" 0.0;
+ color: 0 0 0 130;
+ align: 0.0 1.0;
+#ifdef _USE_FAVOR_AND_BOOKMARK_ICON
+ rel1 { relative: 1 0; to: "bookmarkicon_bg";}
+#else
+ rel1 { relative: 1 0; to: "elm.videoicon_bg";}
+#endif
+ rel2 { relative: (W-GAP_W)/W 1; to_y: "elm.videoicon_bg";}
+ }
+ }
+ part {
+ name: "elm.swallow.videoicon";
+ type: IMAGE;
+ mouse_events: 0;
+ repeat_events: 0;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ align: 0.5 0.5;
+ aspect: 1.0 1.0;
+ rel1 { relative: 0 0; to: "elm.videoicon_bg";}
+ rel2 { relative: 1 1; to: "elm.videoicon_bg";}
+ image.normal: GALLERY_EDC_IMAGE_BUTTON_PLAY;
+ }
+ }
+ part {
+ name: "elm.text";
+ type: TEXT;
+ mouse_events: 1;
+ repeat_events: 1;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ align: 0.0 1.0;
+ rel1 { relative: 0.0 0.0; to: "elm.text.bg"; }
+ rel2 { relative: 1.0 1.0; to: "elm.text.bg"; }
+ color: 255 255 255 255;
+ text {
+ font: "SLP:style=Bold";
+ text_class: "slp";
+ size: 26;
+ align: 0.9 0.5;
+ }
+ }
+ }
+#ifdef _USE_FAVOR_AND_BOOKMARK_ICON
+ part {
+ name: "elm.swallow.bookmarkicon";
+ type: SWALLOW;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ align: 0.5 0.5;
+ visible: 1;
+ rel1 { relative: 0.0 0.0; to: "bookmarkicon_bg"; }
+ rel2 { relative: 1.0 1.0; to: "bookmarkicon_bg"; }
+ }
+ }
+#endif
+ }
+ programs {
+ program {
+ name: "mouse_down_shrink";
+ signal: "mouse,down,shrink";
+ source: "bg";
+ action: STATE_SET "shrink" 0.0;
+ target: "bg";
+ //after: "expand";
+ transition: LINEAR 0.1;
+ }
+ program {
+ name: "mouse_up_expand";
+ signal: "mouse,up,expand";
+ source: "bg";
+ action: STATE_SET "default" 0.0;
+ target: "bg";
+ transition: LINEAR 0.05;
+ after: "shrink,expand,done,icon";
+ }
+
+ program {
+ name: "shrink";
+ signal: "shrink";
+ source: "bg";
+ action: STATE_SET "shrink" 0.0;
+ target: "bg";
+ after: "expand";
+ transition: LINEAR 0.1;
+ }
+ program {
+ name: "expand";
+ action: STATE_SET "default" 0.0;
+ target: "bg";
+ transition: LINEAR 0.05;
+ after: "shrink,expand,done,icon";
+ }
+ program {
+ name: "shrink,expand,done,icon";
+ action: SIGNAL_EMIT "shrink,expand,done" "bg";
+ }
+ }
+}
+
+group
+{
+ name: "elm/gengrid/photoframe/default_layout_video_favor_bookmark";
+ images {
+ image: GALLERY_EDC_IMAGE_BUTTON_PLAY COMP;
+ }
+
+ parts {
+ part {
+ name: "bg";
+ type: RECT;
+ mouse_events: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0;}
+ rel2 { relative: 1.0 1.0;}
+ color: 0 0 0 0;
+ }
+ description {
+ state: "shrink" 0.0;
+ rel1 { relative: 0.03 0.03;}
+ rel2 { relative: 0.97 0.97;}
+ color: 0 0 0 0;
+ }
+ }
+ part {
+ name: "elm.swallow.icon";
+ type: SWALLOW;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: GAP_W/W (GAP_H+1)/H;}
+ rel2 { relative: (W-GAP_W)/W 1;}
+ }
+ }
+ part {
+ name: "elm.videoicon_bg";
+ type: RECT;
+ mouse_events: 0;
+ scale : 1;
+ description {
+ state: "default" 0.0;
+ color: 0 0 0 130;
+ align: 1.0 0.0;
+ rel1 { relative: GAP_W/W (H-FAVOR_ICON_H+1)/H;}
+ rel2 { relative: (FAVOR_ICON_W+GAP_W)/W 1;}
+ }
+ }
+#ifdef _USE_FAVOR_AND_BOOKMARK_ICON
+ part {
+ name: "favoricon_bg";
+ type: RECT;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ color: 0 0 0 130;
+ align: 1.0 0.0;
+ rel1 { relative: 1 0; to: "elm.videoicon_bg";}
+ rel2 { relative: (FAVOR_ICON_W*2+GAP_W)/W 1; to_y: "elm.videoicon_bg";}
+ }
+ }
+ part {
+ name: "bookmarkicon_bg";
+ type: RECT;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ color: 0 0 0 130;
+ align: 1.0 0.0;
+ rel1 { relative: 1 0; to: "favoricon_bg";}
+ rel2 { relative: (FAVOR_ICON_W*3+GAP_W)/W 1; to_y: "elm.videoicon_bg";}
+ }
+#endif
+ part {
+ name: "elm.text.bg";
+ type: RECT;
+ mouse_events: 0;
+ scale : 1;
+ description {
+ state: "default" 0.0;
+ color: 0 0 0 130;
+ align: 0.0 1.0;
+#ifdef _USE_FAVOR_AND_BOOKMARK_ICON
+ rel1 { relative: 1 0; to: "bookmarkicon_bg";}
+#else
+ rel1 { relative: 1 0; to: "elm.videoicon_bg";}
+#endif
+ rel2 { relative: (W-GAP_W)/W 1; to_y: "elm.videoicon_bg";}
+ }
+ }
+ part {
+ name: "elm.swallow.videoicon";
+ type: IMAGE;
+ mouse_events: 0;
+ repeat_events: 0;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ align: 0.5 0.5;
+ aspect: 1.0 1.0;
+ rel1 { relative: 0 0; to: "elm.videoicon_bg";}
+ rel2 { relative: 1 1; to: "elm.videoicon_bg";}
+ image.normal: GALLERY_EDC_IMAGE_BUTTON_PLAY;
+ }
+ }
+ part {
+ name: "elm.text";
+ type: TEXT;
+ mouse_events: 1;
+ repeat_events: 1;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ align: 0.0 1.0;
+ rel1 { relative: 0.0 0.0; to: "elm.text.bg"; }
+ rel2 { relative: 1.0 1.0; to: "elm.text.bg"; }
+ color: 255 255 255 255;
+ text {
+ font: "SLP:style=Bold";
+ text_class: "slp";
+ size: 26;
+ align: 0.9 0.5;
+ }
+ }
+ }
+#ifdef _USE_FAVOR_AND_BOOKMARK_ICON
+ part {
+ name: "elm.swallow.favoricon";
+ type: SWALLOW;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ align: 0.5 0.5;
+ rel1 { relative: 0.0 0.0; to: "favoricon_bg"; }
+ rel2 { relative: 1.0 1.0; to: "favoricon_bg"; }
+ }
+ }
+ part {
+ name: "elm.swallow.bookmarkicon";
+ type: SWALLOW;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ align: 0.5 0.5;
+ visible: 1;
+ rel1 { relative: 0.0 0.0; to: "bookmarkicon_bg"; }
+ rel2 { relative: 1.0 1.0; to: "bookmarkicon_bg"; }
+ }
+ }
+#endif
+ }
+ programs {
+ program {
+ name: "mouse_down_shrink";
+ signal: "mouse,down,shrink";
+ source: "bg";
+ action: STATE_SET "shrink" 0.0;
+ target: "bg";
+ //after: "expand";
+ transition: LINEAR 0.1;
+ }
+ program {
+ name: "mouse_up_expand";
+ signal: "mouse,up,expand";
+ source: "bg";
+ action: STATE_SET "default" 0.0;
+ target: "bg";
+ transition: LINEAR 0.05;
+ after: "shrink,expand,done,icon";
+ }
+
+ program {
+ name: "shrink";
+ signal: "shrink";
+ source: "bg";
+ action: STATE_SET "shrink" 0.0;
+ target: "bg";
+ after: "expand";
+ transition: LINEAR 0.1;
+ }
+ program {
+ name: "expand";
+ action: STATE_SET "default" 0.0;
+ target: "bg";
+ transition: LINEAR 0.05;
+ after: "shrink,expand,done,icon";
+ }
+ program {
+ name: "shrink,expand,done,icon";
+ action: SIGNAL_EMIT "shrink,expand,done" "bg";
+ }
+ }
+}
+
+/*106+2*/
+#define ZOOMED_W 108
+/*106+10*/
+#define ZOOMED_H 116
+
+#define ZOOMED_GAP_H 10
+#define ZOOMED_GAP_W 2
+
+group
+{
+ name: "elm/gengrid/photoframe/zoomed_default_layout";
+
+ parts {
+ part {
+ name: "bg";
+ type: RECT;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0;}
+ rel2 { relative: 1.0 1.0;}
+ color: 0 0 0 0;
+ }
+ description {
+ state: "shrink" 0.0;
+ rel1 { relative: 0.03 0.03;}
+ rel2 { relative: 0.97 0.97;}
+ color: 0 0 0 0;
+ }
+ }
+
+ part {
+ name: "elm.swallow.icon";
+ type: SWALLOW;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0 0;}
+ rel2 { relative: (ZOOMED_W-ZOOMED_GAP_W)/ZOOMED_W (ZOOMED_H-ZOOMED_GAP_H)/ZOOMED_H;}
+ }
+ }
+ }
+
+ programs {
+
+ program {
+ name: "mouse_down_shrink";
+ signal: "mouse,down,shrink";
+ source: "bg";
+ action: STATE_SET "shrink" 0.0;
+ target: "bg";
+ transition: LINEAR 0.1;
+ }
+ program {
+ name: "mouse_up_expand";
+ signal: "mouse,up,expand";
+ source: "bg";
+ action: STATE_SET "default" 0.0;
+ target: "bg";
+ transition: LINEAR 0.05;
+ after: "shrink,expand,done,icon";
+ }
+
+ program {
+ name: "shrink";
+ signal: "shrink";
+ source: "bg";
+ action: STATE_SET "shrink" 0.0;
+ target: "bg";
+ after: "expand";
+ transition: LINEAR 0.1;
+ }
+ program {
+ name: "expand";
+ action: STATE_SET "default" 0.0;
+ target: "bg";
+ transition: LINEAR 0.05;
+ after: "shrink,expand,done,icon";
+ }
+ program {
+ name: "shrink,expand,done,icon";
+ action: SIGNAL_EMIT "shrink,expand,done" "bg";
+ }
+ }
+}
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define GENLIST_LIST_BG_COLOR GALLERY_EDC_COLOR_BG
+#define GENLIST_LIST_PRESS_COLOR 87 135 194 255
+#define GENLIST_PART_BOTTOM_LINE_INC 169 169 169 255
+#define GENLIST_PART_DISCLIP_COLOR_INC 255 255 255 110 // alpha was 64
+#define GENLIST_PART_BOTTOM_LINE_COLOR_TAG 169 169 169 255
+
+#define GENLIST_PART_BASE( param_item_height ) \
+ part { name: "base"; \
+ type: RECT; \
+ repeat_events: 1; \
+ scale: 1; \
+ description { state: "default" 0.0; \
+ min: 0 param_item_height; \
+ color: 0 0 0 0; \
+ } \
+ }
+
+#define GENLIST_PART_BASE_SWEEP_COLOR( param_item_height ) \
+ part { name: "base"; \
+ type: RECT; \
+ repeat_events: 1; \
+ scale: 1; \
+ description { state: "default" 0.0; \
+ min: 0 param_item_height; \
+ color: GENLIST_LIST_BG_COLOR; \
+ } \
+ }
+
+#define GENLIST_PART_BG_IMAGE \
+ part { name: "bg_image"; \
+ type: RECT; \
+ clip_to: "disclip"; \
+ mouse_events: 0; \
+ description { state: "default" 0.0; \
+ color: GENLIST_LIST_BG_COLOR; \
+ } \
+ description { state: "selected" 0.0; \
+ inherit: "default" 0.0; \
+ color: GENLIST_LIST_PRESS_COLOR; \
+ } \
+ }
+
+#define GENLIST_PART_BOTTOM_LINE_TAG \
+ part { name: "bottom_line"; \
+ type: RECT; \
+ clip_to: "disclip"; \
+ mouse_events: 0; \
+ description { state: "default" 0.0; \
+ min: 0 1; \
+ fixed: 0 1; \
+ visible: 1; \
+ color: GENLIST_PART_BOTTOM_LINE_COLOR_TAG; \
+ rel1 { \
+ relative: 0.0 1.0; \
+ offset: 0 -1; \
+ } \
+ } \
+ }
+
+#define GENLIST_PART_PADDING_TOP( param_padding_size ) \
+ part { name: "elm.padding.top"; \
+ type: RECT; \
+ scale: 1; \
+ description { \
+ state: "default" 0.0; \
+ min: 0 param_padding_size; \
+ fixed: 0 1; \
+ visible: 0; \
+ rel2.relative: 1.0 0.0; \
+ align: 0.0 0.0; \
+ } \
+ }
+
+#define GENLIST_PART_PADDING_BOTTOM( param_padding_size ) \
+ part { name: "elm.padding.bottom"; \
+ type: RECT; \
+ scale: 1; \
+ description { \
+ state: "default" 0.0; \
+ min: 0 param_padding_size; \
+ fixed: 0 1; \
+ visible: 0; \
+ rel1.relative: 0.0 1.0; \
+ align: 0.0 1.0; \
+ } \
+ }
+
+#define GENLIST_PART_PADDING_LEFT( param_padding_size ) \
+ part { name: "elm.padding.left"; \
+ type: RECT; \
+ scale: 1; \
+ description { \
+ state: "default" 0.0; \
+ min: param_padding_size 0; \
+ fixed: 1 0; \
+ visible: 0; \
+ rel2.relative: 0.0 1.0; \
+ align: 0.0 0.0; \
+ } \
+ }
+
+#define GENLIST_PART_PADDING_RIGHT( param_padding_size ) \
+ part { name: "elm.padding.right"; \
+ type: RECT; \
+ scale: 1; \
+ description { state: "default" 0.0; \
+ min: param_padding_size 0; \
+ fixed: 1 0; \
+ visible: 0; \
+ rel1.relative: 1.0 0.0; \
+ align: 1.0 0.0; \
+ } \
+ }
+
+#define GENLIST_PART_DISCLIP \
+ part { name: "disclip"; \
+ type: RECT; \
+ description { state: "default" 0.0; \
+ } \
+ description { state: "disabled" 0.0; \
+ inherit: "default" 0.0; \
+ color: GENLIST_PART_DISCLIP_COLOR_INC; \
+ } \
+ }
+
+
+#define TAG_COLOR_GAP 190 189 189 255
+#define TAG_COLOR_TITLE 0 0 0 255
+#define TAG_COLOR_COUNT 124 124 124 255
+#define TAG_COLOR_RENAME_BG 255 255 255 255
+#define TAG_FONT_TITLE 44
+#define TAG_FONT_COUNT 32
+
+#define TAG_ITEM_H 128
+#define TAG_PAD_L 16
+#define TAG_PAD_R 16
+#define TAG_PAD_ICON_R 16
+#define TAG_PAD_ICON_L 16
+#define TAG_PAD_RENAME_BTN_L 16
+#define TAG_ICON_BG_W 112
+#define TAG_ICON_BG_H 112
+#define TAG_INTER 2
+#define TAG_CHECKBOX_W 42
+#define TAG_CHECKBOX_H 42
+#define TAG_RENAME_BTN_W 64
+#define TAG_RENAME_BTN_H 64
+#define TAG_TITLE_H 64
+#define TAG_DURATION_H 48
+#define TAG_DURATION_W 72
+#define TAG_RENAME_BG_H 112
+
+// genlist for tags view
+group { name: "elm/genlist/item/tags_list/gallery/default";
+ alias: "elm/genlist/item_odd/tags_list/gallery/default";
+
+ data.item: "stacking" "above";
+ data.item: "selectraise" "on";
+ data.item: "texts" "elm.text.title elm.text.tag_count";
+ data.item: "contents" "elm.icon";
+ data.item: "flips" "elm.flip.content";
+ parts {
+ GENLIST_PART_BASE_SWEEP_COLOR( TAG_ITEM_H )
+ GENLIST_PART_BG_IMAGE
+ GENLIST_PART_BOTTOM_LINE_TAG
+ GENLIST_PART_PADDING_LEFT( TAG_PAD_L )
+ GENLIST_PART_PADDING_RIGHT( TAG_PAD_R )
+
+ part { name: "elm.padding.icon.right";
+ type: RECT;
+ scale: 1;
+ description { state: "default" 0.0;
+ min: TAG_PAD_ICON_R 0;
+ fixed: 1 0;
+ rel1 {
+ relative: 1.0 0.0;
+ to_x: "elm.icon";
+ }
+ rel2 {
+ relative: 1.0 1.0;
+ offset: 0 0;
+ to_x: "elm.icon";
+ }
+ color: 0 0 0 0;
+ align: 0.0 0.0;
+ }
+ }
+ part { name: "icon_bg";
+ clip_to: "disclip";
+ type: RECT;
+ scale: 1;
+ description { state: "default" 0.0;
+ min: TAG_ICON_BG_W TAG_ICON_BG_H;
+ max: TAG_ICON_BG_W TAG_ICON_BG_H;
+ fixed: 1 1;
+ align: 0.0 0.5;
+ color: TAG_COLOR_GAP;
+ rel1 {
+ relative: 1.0 0.0;
+ to_x: "elm.padding.left";
+ }
+ rel2 {
+ relative: 1.0 1.0;
+ offset: 0 0;
+ to_x: "elm.padding.left";
+ }
+ }
+ description { state: "flip_enabled" 0.0;
+ inherit: "default" 0.0;
+ }
+ }
+//tag thumbnail
+ part { name: "elm.icon";
+ clip_to: "disclip";
+ type: SWALLOW;
+ scale: 1;
+ description { state: "default" 0.0;
+ fixed: 1 1;
+ align: 0.5 0.5;
+ rel1 {
+ relative: TAG_INTER/TAG_ICON_BG_W TAG_INTER/TAG_ICON_BG_H;
+ to: "icon_bg";
+ }
+ rel2 {
+ relative: (TAG_ICON_BG_W-TAG_INTER+1)/TAG_ICON_BG_W (TAG_ICON_BG_H-TAG_INTER+1)/TAG_ICON_BG_H;
+ to: "icon_bg";
+ }
+ }
+ }
+//tag name
+ part { name: "elm.text.title";
+ clip_to: "disclip";
+ type: TEXT;
+ mouse_events: 0;
+ scale: 1;
+ description { state: "default" 0.0;
+ min: 0 TAG_TITLE_H;
+ fixed: 0 1;
+ align: 0.0 0.5;
+ rel1 {
+ relative: 1.0 0.0;
+ to_x: "elm.padding.icon.right";
+ }
+ rel2 {
+ relative: 0.0 1.0;
+ offset: 0 0;
+ to_x: "elm.text.tag_count";
+ }
+ color: TAG_COLOR_TITLE;
+ text {
+ font: "SLP:style=Regular";
+ text_class: "slp";
+ size: TAG_FONT_TITLE;
+ min: 0 1;
+ align: 0.0 0.5;
+ }
+ }
+ description { state: "flip_enabled" 0.0;
+ inherit: "default" 0.0;
+ visible: 0;
+ }
+ description { state: "selected" 0.0;
+ inherit: "default" 0.0;
+ color: 255 255 255 255;
+ }
+ }
+
+//tag count
+ part { name: "elm.text.tag_count";
+ clip_to: "disclip";
+ type: TEXT;
+ mouse_events: 0;
+ scale: 1;
+ description { state: "default" 0.0;
+ min: TAG_DURATION_W TAG_DURATION_H;
+ max: TAG_DURATION_W TAG_DURATION_H;
+ fixed: 1 0;
+ align: 1.0 0.5;
+ rel1 {
+ relative: 0.0 0.0;
+ to_x: "elm.padding.right";
+ }
+ rel2 {
+ relative: 0.0 1.0;
+ to_x: "elm.padding.right";
+ }
+ color: TAG_COLOR_COUNT;
+ text {
+ font: "SLP:style=Bold";
+ text_class: "slp";
+ size: TAG_FONT_COUNT;
+ min: 0 1;
+ align: 1.0 0.5;
+ }
+ }
+ description { state: "selected" 0.0;
+ inherit: "default" 0.0;
+ color: TAG_COLOR_COUNT;
+ }
+ description { state: "flip_enabled" 0.0;
+ inherit: "default" 0.0;
+ visible: 0;
+ }
+ }
+ part { name: "elm.flip.content.bg";
+ clip_to: "disclip";
+ type: RECT;
+ mouse_events: 1;
+ scale: 1;
+ description { state: "default" 0.0;
+ visible: 0;
+ min: 0 TAG_RENAME_BG_H;
+ fixed: 0 1;
+ align: 0 0.5;
+ color: TAG_COLOR_RENAME_BG;
+ rel1 {
+ relative: 1.0 0.0;
+ offset: 50 0;
+ to_x: "elm.padding.icon.right";
+ to_y: "icon_bg";
+ }
+ rel2 {
+ relative: 0.0 1.0;
+ offset: -50 0;
+ to_x: "elm.padding.right";
+ to_y: "icon_bg";
+ }
+ }
+ description { state: "flip_enabled" 0.0;
+ visible: 1;
+ min: 0 TAG_RENAME_BG_H;
+ fixed: 0 1;
+ align: 0 0.5;
+ color: TAG_COLOR_RENAME_BG;
+ rel1 {
+ relative: 1.0 0.0;
+ to_x: "elm.padding.icon.right";
+ to_y: "icon_bg";
+ }
+ rel2 {
+ relative: 0.0 1.0;
+ offset: 0 0;
+ to_x: "elm.padding.right";
+ to_y: "icon_bg";
+ }
+ }
+ }
+
+ part { name: "elm.flip.content";
+ clip_to: "disclip";
+ type: SWALLOW;
+ mouse_events: 1;
+ scale: 1;
+ description { state: "default" 0.0;
+ visible: 0;
+ min: 0 TAG_RENAME_BG_H;
+ fixed: 0 1;
+ align: 0 0.5;
+ rel1 {
+ relative: 1.0 0.0;
+ offset: 50 0;
+ to_x: "elm.padding.icon.right";
+ to_y: "icon_bg";
+ }
+ rel2 {
+ relative: 0.0 1.0;
+ offset: -50 0;
+ to_x: "elm.padding.right";
+ to_y: "icon_bg";
+ }
+ }
+ description { state: "flip_enabled" 0.0;
+ visible: 1;
+ min: 0 TAG_RENAME_BG_H;
+ fixed: 0 1;
+ align: 0 0.5;
+ rel1 {
+ relative: 1.0 0.0;
+ offset: 5 0;
+ to_x: "elm.padding.icon.right";
+ to_y: "icon_bg";
+ }
+ rel2 {
+ relative: 0.0 1.0;
+ offset: -5 0;
+ to_x: "elm.padding.right";
+ to_y: "icon_bg";
+ }
+ }
+ }
+
+ GENLIST_PART_DISCLIP
+ }
+ programs {
+ program { name: "go_active";
+ signal: "elm,state,selected";
+ source: "elm";
+ script {
+ new st[31];
+ new Float:vl;
+ get_state(PART:"elm.flip.content", st, 30, vl);
+ if (!strcmp(st, "default"))
+ {
+ set_state(PART:"bg_image", "selected", 0.0);
+ set_state(PART:"elm.text.tag_count", "selected", 0.0);
+ set_state(PART:"elm.text.title", "selected", 0.0);
+ }
+ }
+ //action: STATE_SET "selected" 0.0;
+ //target: "bg_image";
+ //target: "elm.text.tag_count";
+ }
+ program { name: "go_passive";
+ signal: "elm,state,unselected";
+ source: "elm";
+ action: STATE_SET "default" 0.0;
+ target: "bg_image";
+ target: "elm.text.tag_count";
+ target: "elm.text.title";
+ transition: LINEAR 0.1;
+ }
+ program { name: "go_disabled";
+ signal: "elm,state,disabled";
+ source: "elm";
+ action: STATE_SET "disabled" 0.0;
+ target: "disclip";
+ }
+ program { name: "go_enabled";
+ signal: "elm,state,enabled";
+ source: "elm";
+ action: STATE_SET "default" 0.0;
+ target: "disclip";
+ }
+ program { name: "flip_enabled";
+ signal: "elm,state,flip,enabled";
+ source: "elm";
+ action: STATE_SET "flip_enabled" 0.0;
+ target: "elm.text.tag_count";
+ target: "elm.text.title";
+ after: "enable_flip_mode_next";
+ }
+ program { name: "enable_flip_mode_next";
+ action: STATE_SET "flip_enabled" 0.0;
+ transition: DECELERATE 0.5;
+ target: "icon_bg";
+ target: "elm.flip.content.bg";
+ target: "elm.flip.content";
+ }
+ program { name: "flip_disabled";
+ signal: "elm,state,flip,disabled";
+ source: "elm";
+ action: STATE_SET "default" 0.0;
+ target: "elm.flip.content";
+ target: "elm.flip.content.bg";
+ after: "disable_flip_mode_next";
+ }
+ program { name: "disable_flip_mode_next";
+ action: STATE_SET "default" 0.0;
+ transition: DECELERATE 0.5;
+ target: "elm.text.tag_count";
+ target: "elm.text.title";
+ target: "icon_bg";
+ }
+ }
+}
+
+// genlist for tags edit view
+group { name: "elm/genlist/item/tags_list_edit/gallery/default";
+ alias: "elm/genlist/item_odd/tags_list_edit/gallery/default";
+
+ data.item: "stacking" "above";
+ data.item: "selectraise" "on";
+ data.item: "texts" "elm.text.title elm.text.tag_count";
+ data.item: "contents" "elm.icon elm.swallow.checkbox elm.swallow.rename";
+ data.item: "flips" "elm.flip.content";
+ parts {
+ GENLIST_PART_BASE( TAG_ITEM_H )
+ GENLIST_PART_BG_IMAGE
+ GENLIST_PART_BOTTOM_LINE_TAG
+ GENLIST_PART_PADDING_LEFT( TAG_PAD_L )
+ GENLIST_PART_PADDING_RIGHT( TAG_PAD_R )
+
+//checkbox
+ part { name: "elm.swallow.checkbox";
+ clip_to: "disclip";
+ type: SWALLOW;
+ scale: 1;
+ description { state: "default" 0.0;
+ min: TAG_CHECKBOX_W TAG_CHECKBOX_H;
+ max: TAG_CHECKBOX_W TAG_CHECKBOX_H;
+ fixed: 1 1;
+ align: 0.0 0.5;
+ rel1 {
+ relative: 1.0 0.0;
+ to_x: "elm.padding.left";
+ }
+ rel2 {
+ relative: 1.0 1.0;
+ offset: 0 0;
+ to_x: "elm.padding.left";
+ }
+ }
+ description { state: "flip_enabled" 0.0;
+ inherit: "default" 0.0;
+ visible: 0;
+ }
+ }
+ part { name: "elm.padding.icon.left";
+ type: RECT;
+ scale: 1;
+ description { state: "default" 0.0;
+ min: TAG_PAD_ICON_L 0;
+ fixed: 1 0;
+ rel1 {
+ relative: 1.0 0.0;
+ to_x: "elm.swallow.checkbox";
+ }
+ rel2 {
+ relative: 1.0 1.0;
+ offset: 0 0;
+ to_x: "elm.swallow.checkbox";
+ }
+ color: 0 0 0 0;
+ align: 0.0 0.0;
+ }
+ }
+ part { name: "elm.padding.icon.right";
+ type: RECT;
+ scale: 1;
+ description { state: "default" 0.0;
+ min: TAG_PAD_ICON_R 0;
+ fixed: 1 0;
+ rel1 {
+ relative: 1.0 0.0;
+ to_x: "elm.icon";
+ }
+ rel2 {
+ relative: 1.0 1.0;
+ offset: 0 0;
+ to_x: "elm.icon";
+ }
+ color: 0 0 0 0;
+ align: 0.0 0.0;
+ }
+ }
+ part { name: "icon_bg";
+ clip_to: "disclip";
+ type: RECT;
+ scale: 1;
+ description { state: "default" 0.0;
+ min: TAG_ICON_BG_W TAG_ICON_BG_H;
+ max: TAG_ICON_BG_W TAG_ICON_BG_H;
+ fixed: 1 1;
+ align: 0.0 0.5;
+ color: TAG_COLOR_GAP;
+ rel1 {
+ relative: 1.0 0.0;
+ to_x: "elm.padding.icon.left";
+ }
+ rel2 {
+ relative: 1.0 1.0;
+ to_x: "elm.padding.icon.left";
+ }
+ }
+ description { state: "flip_enabled" 0.0;
+ inherit: "default" 0.0;
+ rel1 {
+ relative: 1.0 0.0;
+ to_x: "elm.padding.left";
+ }
+ rel2 {
+ relative: 1.0 1.0;
+ to_x: "elm.padding.left";
+ }
+ }
+ }
+//tag thumbnail
+ part { name: "elm.icon";
+ clip_to: "disclip";
+ type: SWALLOW;
+ scale: 1;
+ description { state: "default" 0.0;
+ fixed: 1 1;
+ align: 0.5 0.5;
+ rel1 {
+ relative: TAG_INTER/TAG_ICON_BG_W TAG_INTER/TAG_ICON_BG_H;
+ to: "icon_bg";
+ }
+ rel2 {
+ relative: (TAG_ICON_BG_W-TAG_INTER+1)/TAG_ICON_BG_W (TAG_ICON_BG_H-TAG_INTER+1)/TAG_ICON_BG_H;
+ to: "icon_bg";
+ }
+ }
+ }
+//tag name
+ part { name: "elm.text.title";
+ clip_to: "disclip";
+ type: TEXT;
+ mouse_events: 0;
+ scale: 1;
+ description { state: "default" 0.0;
+ min: 0 TAG_TITLE_H;
+ fixed: 0 1;
+ align: 0.0 0.5;
+ rel1 {
+ relative: 1.0 0.0;
+ to_x: "elm.padding.icon.right";
+ }
+ rel2 {
+ relative: 0.0 1.0;
+ offset: 0 0;
+ to_x: "elm.text.tag_count";
+ }
+ color: TAG_COLOR_TITLE;
+ text {
+ font: "SLP:style=Regular";
+ text_class: "slp";
+ size: TAG_FONT_TITLE;
+ min: 0 1;
+ align: 0.0 0.5;
+ }
+ }
+ description { state: "flip_enabled" 0.0;
+ inherit: "default" 0.0;
+ visible: 0;
+ }
+ description { state: "selected" 0.0;
+ inherit: "default" 0.0;
+ color: 255 255 255 255;
+ }
+ }
+
+//rename button
+ part { name: "elm.swallow.rename";
+ clip_to: "disclip";
+ type: SWALLOW;
+ scale: 1;
+ description { state: "default" 0.0;
+ min: TAG_RENAME_BTN_W TAG_RENAME_BTN_H;
+ max: TAG_RENAME_BTN_W TAG_RENAME_BTN_H;
+ fixed: 1 0;
+ align: 1.0 0.5;
+ rel1 {
+ relative: 0.0 0.0;
+ to_x: "elm.padding.right";
+ }
+ rel2 {
+ relative: 0.0 1.0;
+ to_x: "elm.padding.right";
+ }
+ }
+ description { state: "flip_enabled" 0.0;
+ inherit: "default" 0.0;
+ visible: 0;
+ }
+ }
+ part { name: "elm.padding.rename.left";
+ type: RECT;
+ scale: 1;
+ description { state: "default" 0.0;
+ min: TAG_PAD_RENAME_BTN_L 0;
+ fixed: 1 0;
+ visible: 0;
+ rel1 {
+ relative: 0.0 0.0;
+ to_x: "elm.swallow.rename";
+ }
+ rel2 {
+ relative: 0.0 1.0;
+ to_x: "elm.swallow.rename";
+ }
+ align: 1.0 0.0;
+ }
+ }
+//tag count
+ part { name: "elm.text.tag_count";
+ clip_to: "disclip";
+ type: TEXT;
+ mouse_events: 0;
+ scale: 1;
+ description { state: "default" 0.0;
+ min: TAG_DURATION_W TAG_DURATION_H;
+ max: TAG_DURATION_W TAG_DURATION_H;
+ fixed: 1 0;
+ align: 1.0 0.5;
+ rel1 {
+ relative: 0.0 0.0;
+ to_x: "elm.padding.rename.left";
+ }
+ rel2 {
+ relative: 0.0 1.0;
+ to_x: "elm.padding.rename.left";
+ }
+ color: TAG_COLOR_COUNT;
+ text {
+ font: "SLP:style=Bold";
+ text_class: "slp";
+ size: TAG_FONT_COUNT;
+ min: 0 1;
+ align: 1.0 0.5;
+ }
+ }
+ description { state: "selected" 0.0;
+ inherit: "default" 0.0;
+ color: TAG_COLOR_COUNT;
+ }
+ description { state: "flip_enabled" 0.0;
+ inherit: "default" 0.0;
+ visible: 0;
+ }
+ }
+ part { name: "elm.flip.content.bg";
+ clip_to: "disclip";
+ type: RECT;
+ mouse_events: 1;
+ scale: 1;
+ description { state: "default" 0.0;
+ visible: 0;
+ min: 0 TAG_RENAME_BG_H;
+ fixed: 0 1;
+ align: 0 0.5;
+ color: TAG_COLOR_RENAME_BG;
+ rel1 {
+ relative: 1.0 0.0;
+ to_x: "elm.padding.icon.right";
+ to_y: "icon_bg";
+ }
+ rel2 {
+ relative: 0.0 1.0;
+ offset: 0 0;
+ to_x: "elm.swallow.rename";
+ to_y: "icon_bg";
+ }
+ }
+ description { state: "flip_enabled" 0.0;
+ inherit: "default" 0.0;
+ visible: 1;
+ rel2 {
+ relative: 0.0 1.0;
+ offset: 0 0;
+ to_x: "elm.padding.right";
+ to_y: "icon_bg";
+ }
+ }
+ }
+
+ part { name: "elm.flip.content";
+ clip_to: "disclip";
+ type: SWALLOW;
+ mouse_events: 1;
+ scale: 1;
+ description { state: "default" 0.0;
+ visible: 0;
+ min: 0 TAG_RENAME_BG_H;
+ fixed: 0 1;
+ align: 0 0.5;
+ rel1 {
+ relative: 1.0 0.0;
+ offset: 5 0;
+ to_x: "elm.padding.icon.right";
+ to_y: "icon_bg";
+ }
+ rel2 {
+ relative: 0.0 1.0;
+ offset: -5 0;
+ to_x: "elm.swallow.rename";
+ to_y: "icon_bg";
+ }
+ }
+ description { state: "flip_enabled" 0.0;
+ inherit: "default" 0.0;
+ visible: 1;
+ rel2 {
+ relative: 0.0 1.0;
+ offset: 0 0;
+ to_x: "elm.padding.right";
+ to_y: "icon_bg";
+ }
+ }
+ }
+ GENLIST_PART_DISCLIP
+ }
+ programs {
+ program { name: "go_active";
+ signal: "elm,state,selected";
+ source: "elm";
+ script {
+ new st[31];
+ new Float:vl;
+ get_state(PART:"elm.flip.content", st, 30, vl);
+ if (!strcmp(st, "default"))
+ {
+ set_state(PART:"bg_image", "selected", 0.0);
+ set_state(PART:"elm.text.tag_count", "selected", 0.0);
+ set_state(PART:"elm.text.title", "selected", 0.0);
+ }
+ }
+ //action: STATE_SET "selected" 0.0;
+ //target: "bg_image";
+ //target: "elm.text.tag_count";
+ }
+ program { name: "go_passive";
+ signal: "elm,state,unselected";
+ source: "elm";
+ action: STATE_SET "default" 0.0;
+ target: "bg_image";
+ target: "elm.text.title";
+ target: "elm.text.tag_count";
+ transition: LINEAR 0.1;
+ }
+ program { name: "go_disabled";
+ signal: "elm,state,disabled";
+ source: "elm";
+ action: STATE_SET "disabled" 0.0;
+ target: "disclip";
+ }
+ program { name: "go_enabled";
+ signal: "elm,state,enabled";
+ source: "elm";
+ action: STATE_SET "default" 0.0;
+ target: "disclip";
+ }
+ program { name: "flip_enabled";
+ signal: "elm,state,flip,enabled";
+ source: "elm";
+ action: STATE_SET "flip_enabled" 0.0;
+ target: "elm.text.tag_count";
+ target: "elm.text.title";
+ after: "enable_flip_mode_next";
+ }
+ program { name: "enable_flip_mode_next";
+ action: STATE_SET "flip_enabled" 0.0;
+ transition: DECELERATE 0.5;
+ target: "elm.swallow.checkbox";
+ target: "elm.swallow.rename";
+ target: "icon_bg";
+ target: "elm.flip.content.bg";
+ target: "elm.flip.content";
+ }
+ program { name: "flip_disabled";
+ signal: "elm,state,flip,disabled";
+ source: "elm";
+ action: STATE_SET "default" 0.0;
+ target: "elm.flip.content";
+ target: "elm.flip.content.bg";
+ after: "disable_flip_mode_next";
+ }
+ program { name: "disable_flip_mode_next";
+ action: STATE_SET "default" 0.0;
+ transition: DECELERATE 0.5;
+ target: "elm.swallow.rename";
+ target: "elm.text.tag_count";
+ target: "elm.text.title";
+ target: "icon_bg";
+ target: "elm.swallow.checkbox";
+ }
+ }
+}
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define GENLIST_HEIGHT_113_INC 113
+#define GENLIST_HEIGHT_129_INC TAG_ITEM_H
+
+#define GENLIST_PADDING_6_INC 6
+#define GENLIST_PADDING_11_INC 11
+#define GENLIST_PADDING_13_INC 13
+#define GENLIST_PADDING_16_INC 16
+
+#define GENLIST_FONT_32_INC 32
+#define GENLIST_FONT_44_INC 44
+
+#define GENLIST_SIZE_13_INC 13
+#define GENLIST_SIZE_16_INC 16
+#define GENLIST_SIZE_45_INC 45
+#define GENLIST_SIZE_56_INC 56
+#define GENLIST_SIZE_57_INC 57
+#define GENLIST_SIZE_SLIDE_60_INC 60
+#define GENLIST_SIZE_SLIDE_165_INC 165
+#define GENLIST_SIZE_SLIDE_220_INC 220
+#define GENLIST_SIZE_390_INC 390
+
+#define GENLIST_TREESIZE_32_INC 32
+
+#define GENLIST_PART_SLIDE_TEXT_COLOR_INC 0 0 0 255
+
+#define GENLIST_SWEEP_BG_COLOR_INC GENLIST_LIST_BG_COLOR
+
+#define SWEEP_ICON_112_W 112
+#define SWEEP_INTER_2_W 2
+#define SWEEP_COLOR_GAP 190 189 189 255
+
+ group { name: "elm/genlist/item/mode/gallery/slide2_tag/default";
+ alias: "elm/genlist/item_odd/mode/gallery/slide2_tag/default";
+ alias: "elm/genlist/item_compress/mode/gallery/slide2_tag/default";
+ alias: "elm/genlist/item_compress_odd/mode/gallery/slide2_tag/default";
+ data.item: "stacking" "above";
+ data.item: "selectraise" "on";
+ data.item: "texts" "elm.slide.text.1";
+ data.item: "contents" "elm.slide.swallow.1 elm.slide.swallow.2 elm.slide.icon";
+ data.item: "mode_part" "elm.swallow.origin";
+ data.item: "treesize" "GENLIST_TREESIZE_32_INC";
+
+ parts {
+ part { name: "base";
+ type: RECT;
+ clip_to: "disclip";
+ scale: 1;
+ description { state: "default" 0.0;
+ min: 0 GENLIST_HEIGHT_129_INC;
+ color: GENLIST_SWEEP_BG_COLOR_INC;
+ }
+ }
+ part { name: "bottom_line";
+ type: RECT;
+ clip_to: "disclip";
+ mouse_events: 0;
+ description { state: "default" 0.0;
+ min: 0 1;
+ fixed: 0 1;
+ visible: 1;
+ color: GENLIST_PART_BOTTOM_LINE_INC;
+ rel1 {
+ relative: 0.0 1.0;
+ offset: 0 -1;
+ to: "base";
+ }
+ rel2.to: "base";
+ }
+ }
+ part { name: "base.padding.left";
+ type: RECT;
+ clip_to: "disclip";
+ mouse_events: 0;
+ scale: 1;
+ description { state: "default" 0.0;
+ min: GENLIST_SIZE_16_INC 0;
+ fixed: 1 0;
+ visible: 0;
+ align: 0 0.5;
+ rel1.to: "base";
+ rel2 {
+ relative: 0 1;
+ to: "base";
+ }
+ }
+ }
+ part { name: "base.padding.right";
+ type: RECT;
+ clip_to: "disclip";
+ mouse_events: 0;
+ scale: 1;
+ description { state: "default" 0.0;
+ min: GENLIST_SIZE_16_INC 0;
+ fixed: 1 0;
+ visible: 0;
+ align: 1 0.5;
+ rel1 {
+ relative: 1 0;
+ to: "base";
+ }
+ rel2.to: "base";
+ }
+ }
+ part { name: "base.padding.icon";
+ type: RECT;
+ clip_to: "disclip";
+ mouse_events: 0;
+ scale: 1;
+ description { state: "default" 0.0;
+ min: SWEEP_ICON_112_W 0;
+ fixed: 1 0;
+ visible: 0;
+ align: 1 0.5;
+ rel1.to: "base.padding.right";
+ rel2 {
+ relative: 0 1;
+ to: "base.padding.right";
+ }
+ }
+ }
+ part { name: "base.padding.icon.left";
+ type: RECT;
+ clip_to: "disclip";
+ mouse_events: 0;
+ scale: 1;
+ description { state: "default" 0.0;
+ min: GENLIST_SIZE_16_INC 0;
+ fixed: 1 0;
+ visible: 0;
+ align: 1 0.5;
+ rel1.to: "base.padding.icon";
+ rel2 {
+ relative: 0 1;
+ to: "base.padding.icon";
+ }
+ }
+ }
+ part { name: "base.padding.bottom";
+ type: RECT;
+ clip_to: "disclip";
+ mouse_events: 0;
+ scale: 1;
+ description { state: "default" 0.0;
+ min: 0 GENLIST_PADDING_11_INC;
+ fixed: 0 1;
+ visible: 0;
+ align: 0.5 1;
+ rel1 {
+ relative: 0 1;
+ to: "base";
+ }
+ rel2 {
+ relative: 1 1;
+ to: "base";
+ }
+ }
+ }
+ part { name: "elm.slide.text.1";
+ type: TEXT;
+ clip_to: "disclip";
+ mouse_events: 0;
+ scale: 1;
+ description { state: "default" 0.0;
+ min: 0 GENLIST_SIZE_56_INC;
+ fixed: 0 1;
+ align: 0.5 0;
+ rel1 {
+ relative: 1 0;
+ to_x: "base.padding.left";
+ to_y: "base";
+ }
+ rel2 {
+ relative: 0 0;
+ to_x: "base.padding.icon.left";
+ to_y: "base";
+ }
+ color: GENLIST_PART_SLIDE_TEXT_COLOR_INC;
+ text {
+ font: "SLP:style=Roman";
+ text_class: "slp";
+ size: GENLIST_FONT_32_INC;
+ min: 0 1;
+ align: 0.5 0.5;
+ }
+ }
+ }
+ part { name: "base.padding.center";
+ type: RECT;
+ clip_to: "disclip";
+ mouse_events: 0;
+ scale: 1;
+ description { state: "default" 0.0;
+ min: GENLIST_SIZE_16_INC 0;
+ fixed: 1 0;
+ visible: 0;
+ align: 0.5 0.5;
+ rel1 {
+ relative: 0.5 0;
+ to_x: "elm.slide.text.1";
+ to_y: "base";
+ }
+ rel2 {
+ relative: 0.5 1;
+ to_x: "elm.slide.text.1";
+ to_y: "base";
+ }
+ }
+ }
+ part { name: "elm.slide.swallow.1";
+ type: SWALLOW;
+ clip_to: "disclip";
+ description { state: "default" 0.0;
+ rel1 {
+ relative: 1 1;
+ to_x: "base.padding.left";
+ to_y: "elm.slide.text.1";
+ }
+ rel2 {
+ relative: 0 0;
+ to_x: "base.padding.center";
+ to_y: "base.padding.bottom";
+ }
+ }
+ }
+ part { name: "elm.slide.swallow.2";
+ type: SWALLOW;
+ clip_to: "disclip";
+ description { state: "default" 0.0;
+ rel1 {
+ relative: 1 1;
+ to_x: "base.padding.center";
+ to_y: "elm.slide.text.1";
+ }
+ rel2 {
+ relative: 0 0;
+ to_x: "base.padding.icon.left";
+ to_y: "base.padding.bottom";
+ }
+ }
+ }
+
+ part { name: "elm.slide.icon_bg";
+ clip_to: "disclip";
+ type: RECT;
+ scale: 1;
+ description { state: "default" 0.0;
+ min: TAG_ICON_BG_W TAG_ICON_BG_H;
+ max: TAG_ICON_BG_W TAG_ICON_BG_H;
+ fixed: 1 1;
+ align: 0.0 0.5;
+ color: SWEEP_COLOR_GAP;
+ rel1 {
+ relative: 0.0 0.0;
+ to: "base.padding.icon";
+ }
+ rel2 {
+ relative: 1.0 1.0;
+ offset: 0 0;
+ to: "base.padding.icon";
+ }
+ }
+ }
+ part { name: "elm.slide.icon";
+ clip_to: "disclip";
+ type: SWALLOW;
+ scale: 1;
+ description { state: "default" 0.0;
+ fixed: 1 1;
+ align: 0.5 0.5;
+ rel1 {
+ relative: SWEEP_INTER_2_W/SWEEP_ICON_112_W SWEEP_INTER_2_W/SWEEP_ICON_112_W;
+ to: "elm.slide.icon_bg";
+ }
+ rel2 {
+ relative: (SWEEP_ICON_112_W-SWEEP_INTER_2_W+1)/SWEEP_ICON_112_W (SWEEP_ICON_112_W-SWEEP_INTER_2_W+1)/SWEEP_ICON_112_W;
+ to: "elm.slide.icon_bg";
+ }
+ }
+ }
+ // Transparent part between base parts and slidable parts
+ part { name: "event_block_layer";
+ type: RECT;
+ clip_to: "disclip";
+ mouse_events: 1;
+ description { state: "default" 0.0;
+ rel1.to: "base";
+ rel2.to: "base";
+ color: 0 0 0 0;
+ }
+ description { state: "repeat_events" 0.0;
+ inherit: "default" 0.0;
+ visible: 0;
+ }
+ }
+ // Swallow part for original genlist item style
+ part { name: "elm.swallow.origin";
+ clip_to: "disclip";
+ type: SWALLOW;
+ description { state: "default" 0.0;
+ }
+ description { state: "slide" 0.0;
+ inherit: "default" 0.0;
+ rel1.relative: 1 0;
+ rel2.relative: 2 1;
+ }
+ }
+ part { name: "disclip";
+ type: RECT;
+ description { state: "default" 0.0;
+ rel1.to: "base";
+ rel2.to: "base";
+ }
+ description { state: "disabled" 0.0;
+ inherit: "default" 0.0;
+ color: GENLIST_PART_DISCLIP_COLOR_INC;
+ }
+ }
+ }
+ programs {
+ program {
+ name: "slide_right";
+ signal: "elm,state,slide,active";
+ source: "elm";
+ action: STATE_SET "slide" 0.0;
+ target: "elm.swallow.origin";
+ transition: ACCELERATE 0.5;
+ after: "unblock_event";
+ }
+ program {
+ name: "unblock_event";
+ action: STATE_SET "repeat_events" 0.0;
+ target: "event_block_layer";
+ }
+ program {
+ name: "slide_left";
+ signal: "elm,state,slide,passive";
+ source: "elm";
+ action: STATE_SET "default" 0.0;
+ target: "event_block_layer";
+ after: "slide_left2";
+ }
+ program {
+ name: "slide_left2";
+ action: STATE_SET "default" 0.0;
+ target: "elm.swallow.origin";
+ transition: DECELERATE 0.5;
+ after: "slide_left_finished";
+ }
+ program {
+ name: "slide_left_finished";
+ action: SIGNAL_EMIT "elm,state,slide,passive,finished" "elm";
+ }
+ }
+ }
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define NOCONTENT_TEXT_BLOCK_TEXT_SIZE_INC 32
+#define NOCONTENT_TEXT_BLOCK_STYLE_COLOR_INC 173 170 165 255
+
+ group {
+ name: "elm/layout/nocontents/gallery";
+ styles{
+ style { name: "nocontent_style";
+ base: "font=SLP:style=Roman text_class=slp font_size="NOCONTENT_TEXT_BLOCK_TEXT_SIZE_INC" align=center color=#ffffff wrap=word";
+ tag: "br" "\n";
+ tag: "hilight" "+ font=SLP:style=Bold text_class=slp";
+ tag: "b" "+ font=SLP:style=Bold text_class=slp";
+ tag: "tab" "\t";
+ }
+ }
+ images {
+ image: GALLERY_EDC_IMAGE_NOCONTENTS_PIC COMP;
+ }
+ parts {
+ part { name: "bg";
+ scale: 1;
+ type: RECT;
+ description { state: "default" 0.0;
+ visible: 1;
+ rel1 { relative: 0.0 0.0;}
+ rel2 { relative: 1.0 1.0;}
+ color: 0 0 0 0;
+ }
+ }
+ part { name: "nocontents.image";
+ description { state: "default" 0.0;
+ visible: 1;
+ align: 0.5 0.0;
+ rel1 { relative: 203/720 296/1016; to: "bg";}
+ rel2 { relative: (203+314)/720 (296+310)/1016; to: "bg";}
+ image {
+ normal: GALLERY_EDC_IMAGE_NOCONTENTS_PIC;
+ border: 1 1 1 1;
+ border_scale: 1;
+ }
+ aspect: 1.0 1.0;
+ aspect_preference: BOTH;
+ }
+ }
+ part { name: "middle.padding";
+ scale: 1;
+ type: RECT;
+ description { state: "default" 0.0;
+ visible: 0;
+ align: 0.5 0.0;
+ rel1 { relative: 0.0 1.0; to_y: "nocontents.image";}
+ rel2 { relative: 1.0 (296+310+54)/1016; to: "bg";}
+ }
+ }
+ part { name: "elm.text";
+ type: TEXTBLOCK;
+ description { state: "default" 0.0;
+ fixed: 0 1;
+ align: 0.5 0.0;
+ visible: 1;
+ rel1 { relative: 0.0 1.0; to_x: "bg"; to_y: "middle.padding";}
+ rel2 { relative: 1.0 1.0; to: "bg";}
+ color: NOCONTENT_TEXT_BLOCK_STYLE_COLOR_INC;
+ text {
+ style: "nocontent_style";
+ align: 0.5 0.5;
+ min: 0 0;
+ max: 0 1;
+ }
+ }
+ }
+ }
+ }
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+ #define RESOURCE_IMAGE( FILE_NAME ) \
+ group { \
+ name: FILE_NAME; \
+ images.image: FILE_NAME COMP; \
+ parts { \
+ part { name: "image"; \
+ description { \
+ state: "default" 0.0; \
+ image.normal: FILE_NAME; \
+ aspect: 1 1; \
+ aspect_preference: BOTH; \
+ } \
+ } \
+ } \
+ }
+
+#define RESOURCE_IMAGE_LOSSY( FILE_NAME ) \
+ group { \
+ name: FILE_NAME; \
+ images.image: FILE_NAME LOSSY 85; \
+ parts { \
+ part { name: "image"; \
+ description { \
+ state: "default" 0.0; \
+ image.normal: FILE_NAME; \
+ aspect: 1 1; \
+ aspect_preference: BOTH; \
+ } \
+ } \
+ } \
+ }
+
+collections {
+ RESOURCE_IMAGE("T01_icon_lock.png");
+ RESOURCE_IMAGE("T01_icon_thumbnail_favorite.png");
+
+ RESOURCE_IMAGE("T01_btn_thumbnail_play.png");
+ RESOURCE_IMAGE("T01_icon_thumbnail_bookmark.png");
+ RESOURCE_IMAGE("T01_list_icon_bookmark.png");
+}
+
--- /dev/null
+/*\r
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd\r
+ *\r
+ * Licensed under the Flora License, Version 1.1 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://floralicense.org/license/\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+#include <media_info.h>\r
+#include "gl-data-type.h"\r
+#include "gl-debug.h"\r
+int _gl_data_type_new_tag(gl_tag_s **t_item)\r
+{\r
+ GL_CHECK_VAL(t_item, -1);\r
+ gl_tag_s *tmp_item = (gl_tag_s *)calloc(1, sizeof(gl_tag_s));\r
+ GL_CHECK_VAL(tmp_item, -1);\r
+ tmp_item->gtype = GL_TYPE_TAG;\r
+ *t_item = tmp_item;\r
+ return 0;\r
+}\r
+int _gl_data_type_new_album(gl_album_s **album)\r
+{\r
+ GL_CHECK_VAL(album, -1);\r
+ gl_album_s *tmp_item = (gl_album_s *)calloc(1, sizeof(gl_album_s));\r
+ GL_CHECK_VAL(tmp_item, -1);\r
+ tmp_item->gtype = GL_TYPE_ALBUM;\r
+ *album = tmp_item;\r
+ return 0;\r
+}\r
+\r
+\r
+static int __gl_data_type_free_media(gl_media_s **item)\r
+{\r
+ GL_CHECK_VAL(item, -1);\r
+ GL_CHECK_VAL(*item, -1);\r
+ gl_media_s *tmp_item = *item;\r
+\r
+ /* For local medias */\r
+ if (tmp_item->media_h) {\r
+ media_info_destroy(tmp_item->media_h);\r
+ tmp_item->media_h = NULL;\r
+ }\r
+\r
+ GL_FREEIF(tmp_item->uuid);\r
+ GL_FREEIF(tmp_item->thumb_url);\r
+ GL_FREEIF(tmp_item->file_url);\r
+ GL_FREEIF(tmp_item->album_uuid);\r
+ GL_FREEIF(tmp_item->display_name);\r
+ GL_FREEIF(tmp_item->ext);\r
+\r
+ if (MEDIA_CONTENT_TYPE_IMAGE == tmp_item->type &&\r
+ tmp_item->image_info) {\r
+ /* For local medias */\r
+ if (tmp_item->image_info->image_h) {\r
+ image_meta_destroy(tmp_item->image_info->image_h);\r
+ tmp_item->image_info->image_h = NULL;\r
+ }\r
+\r
+ GL_FREEIF(tmp_item->image_info->media_uuid);\r
+ GL_FREE(tmp_item->image_info);\r
+ } else if (MEDIA_CONTENT_TYPE_VIDEO == tmp_item->type &&\r
+ tmp_item->video_info) {\r
+ /* For local medias */\r
+ if (tmp_item->video_info->video_h) {\r
+ video_meta_destroy(tmp_item->video_info->video_h);\r
+ tmp_item->video_info->video_h = NULL;\r
+ }\r
+\r
+ GL_FREEIF(tmp_item->video_info->media_uuid);\r
+ GL_FREEIF(tmp_item->video_info->title);\r
+ }\r
+\r
+ GL_FREE(tmp_item);\r
+ *item = NULL;\r
+ return 0;\r
+}\r
+\r
+static int __gl_data_type_free_tag(gl_tag_s **t_item)\r
+{\r
+ GL_CHECK_VAL(t_item, -1);\r
+ GL_CHECK_VAL(*t_item, -1);\r
+ gl_tag_s *tmp_item = *t_item;\r
+ GL_FREEIF(tmp_item->tag_name);\r
+ if (tmp_item->tag_h)\r
+ media_tag_destroy(tmp_item->tag_h);\r
+ GL_FREE(tmp_item);\r
+ *t_item = NULL;\r
+ return 0;\r
+}\r
+\r
+int _gl_data_type_free_tag_list(Eina_List **list)\r
+{\r
+ GL_CHECK_VAL(list, -1);\r
+ GL_CHECK_VAL(*list, -1);\r
+ gl_tag_s *item = NULL;\r
+ Eina_List *tmp_list = *list;\r
+ EINA_LIST_FREE(tmp_list, item) {\r
+ if (item)\r
+ __gl_data_type_free_tag(&item);\r
+ }\r
+ eina_list_free(*list);\r
+ *list = NULL;\r
+ return 0;\r
+}\r
+\r
+static int __gl_data_type_free_album(gl_album_s **album)\r
+{\r
+ GL_CHECK_VAL(album, -1);\r
+ GL_CHECK_VAL(*album, -1);\r
+ gl_album_s *tmp_album = *album;\r
+\r
+ GL_FREEIF(tmp_album->uuid);\r
+ GL_FREEIF(tmp_album->display_name);\r
+ GL_FREEIF(tmp_album->path);\r
+\r
+ if (tmp_album->folder_h)\r
+ media_folder_destroy(tmp_album->folder_h);\r
+ GL_FREE(tmp_album);\r
+ *album = NULL;\r
+ return 0;\r
+}\r
+\r
+int _gl_data_type_free_glitem(void **item)\r
+{\r
+ GL_CHECK_VAL(item, -1);\r
+ GL_CHECK_VAL(*item, -1);\r
+ int ret = -1;\r
+\r
+ if(((gl_album_s *)*item)->gtype == GL_TYPE_ALBUM)\r
+ ret = __gl_data_type_free_album((gl_album_s **)item);\r
+ else if (((gl_tag_s *)*item)->gtype == GL_TYPE_TAG)\r
+ ret = __gl_data_type_free_tag((gl_tag_s **)item);\r
+ else if (((gl_media_s *)*item)->gtype == GL_TYPE_MEDIA)\r
+ ret = __gl_data_type_free_media((gl_media_s **)item);\r
+\r
+ if (ret < 0)\r
+ return -1;\r
+ else\r
+ return 0;\r
+}\r
+\r
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <errno.h>
+#include <media_info.h>
+#include <string.h>
+#include "gl-data-util.h"
+#include "gl-controlbar.h"
+#include "gallery.h"
+#include "gl-debug.h"
+#include "gl-drm.h"
+#include "gl-util.h"
+#include "gl-strings.h"
+#include "gl-data-type.h"
+
+bool _gl_data_util_get_file_dir_name(const char *file_path, char *filename,
+ char *dir_name, char *dir_path)
+{
+ GL_CHECK_FALSE(file_path);
+ gint i = 0;
+ gint count = 0;
+ for (i = strlen(file_path); i >= 0; i--) {
+ if (file_path[i] != '\0') {
+ count++;
+ }
+ if (file_path[i] == '/') {
+ if (filename != NULL) {
+ memcpy(filename, &file_path[i + 1], --count);
+ *(filename + count) = '\0';
+ gl_dbg("File Name = %s", filename);
+ }
+ if (dir_path != NULL) {
+ memcpy(dir_path, &file_path[0], i);
+ *(dir_path + i) = '\0';
+ gl_dbg("Directory Name = %s", dir_path);
+ }
+ if (dir_name != NULL) {
+ count = 0;
+ for (--i; i >= 0; i--) {
+ count++;
+ if (file_path[i] == '/') {
+ memcpy(dir_name, &file_path[i + 1], --count);
+ *(dir_name + count) = '\0';
+ gl_dbg("Directory Name = %s", dir_name);
+ count = 0;
+ return true;
+ }
+ }
+ }
+ return true;
+ }
+ }
+
+ return false;
+}
+
+/*
+* create a gl_item
+*/
+gl_item *_gl_data_util_calloc_gitem(void)
+{
+ gl_item *gitem = (gl_item *)calloc(1, sizeof(gl_item));
+ GL_CHECK_NULL(gitem);
+ return gitem;
+}
+
+int _gl_data_util_free_gitem(gl_item *gitem)
+{
+ GL_CHECK_VAL(gitem, -1);
+ if (gitem->item) {
+ _gl_data_type_free_glitem((void **)&(gitem->item));
+ gitem->item = NULL;
+ }
+
+ GL_FREEIF(gitem->_reserved);
+ GL_FREE(gitem);
+ return 0;
+}
+
+gl_cluster *_gl_data_util_calloc_gcluster(void)
+{
+ gl_cluster *gcluster = (gl_cluster *)calloc(1, sizeof(gl_cluster));
+ GL_CHECK_NULL(gcluster);
+ return gcluster;
+}
+
+int _gl_data_util_free_gcluster(gl_cluster *gcluster)
+{
+ GL_CHECK_VAL(gcluster, -1);
+ if (gcluster->cluster) {
+ _gl_data_type_free_glitem((void **)&(gcluster->cluster));
+ gcluster->cluster = NULL;
+ }
+
+ GL_FREEIF(gcluster->_reserved);
+ GL_FREE(gcluster);
+ return 0;
+}
+
+gl_cluster *_gl_data_util_new_gcluster_all(void *data, int count)
+{
+ gl_dbg("");
+ GL_CHECK_NULL(data);
+ gl_cluster *gcluster = NULL;
+ gl_album_s *mcluster = NULL;
+
+ gcluster = _gl_data_util_calloc_gcluster();
+ GL_CHECK_NULL(gcluster);
+
+ _gl_data_type_new_album(&mcluster);
+ if (mcluster == NULL) {
+ GL_FREE(gcluster);
+ return NULL;
+ }
+
+ mcluster->uuid = strdup(GL_ALBUM_ALL_ID);
+ mcluster->count = count;
+ mcluster->type = GL_STORE_T_ALL;
+ mcluster->display_name = strdup(GL_ALBUM_ALL_NAME);
+ gcluster->ad = data;
+ gcluster->cluster = mcluster;
+ return gcluster;
+}
+
+gl_cluster_list *_gl_data_util_calloc_cluster_list(void)
+{
+ gl_cluster_list *clus_list = (gl_cluster_list *)calloc(1,
+ sizeof(gl_cluster_list));
+ GL_CHECK_NULL(clus_list);
+ return clus_list;
+}
+
+/*
+* create a gl_tag
+*/
+gl_tag *_gl_data_util_calloc_gtag(void)
+{
+ gl_tag *gtag = (gl_tag *)calloc(1, sizeof(gl_tag));
+ GL_CHECK_NULL(gtag);
+ return gtag;
+}
+
+/*
+* destroy a gl_tag
+*/
+int _gl_data_util_free_gtag(gl_tag *gtag)
+{
+ GL_CHECK_VAL(gtag, -1);
+ GL_CHECK_VAL(gtag->tag, -1);
+
+ _gl_data_type_free_glitem((void **)&(gtag->tag));
+ gtag->tag = NULL;
+ GL_FREE(gtag);
+ return 0;
+}
+
+/* Clear eina_list got from DB */
+int _gl_data_util_clear_gtype_item_list(Eina_List **elist)
+{
+ void *current = NULL;
+
+ if (elist && *elist) {
+ gl_dbg("Clear gtype items list");
+ EINA_LIST_FREE(*elist, current) {
+ if (current) {
+ _gl_data_type_free_glitem((void **)¤t);
+ current = NULL;
+ }
+ }
+ *elist = NULL;
+ }
+
+ return 0;
+}
+
+int _gl_data_util_clear_item_list(Eina_List **elist)
+{
+ GL_CHECK_VAL(elist, -1);
+ gl_item *current = NULL;
+ if (*elist) {
+ gl_dbg("Clear elist");
+ EINA_LIST_FREE(*elist, current) {
+ _gl_data_util_free_gitem(current);
+ current = NULL;
+ }
+ *elist = NULL;
+ }
+
+ return 0;
+
+}
+
+int _gl_data_util_get_selected_cluster_id_list(void *data,
+ Eina_List **sel_id_list)
+{
+ GL_CHECK_VAL(sel_id_list, -1);
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ GL_CHECK_VAL(ad->albuminfo.selected_albums_elist, -1);
+ gl_cluster *gcluster = NULL;
+ char *item_id = NULL;
+
+ /* Save ID of selected clusters */
+ EINA_LIST_FREE(ad->albuminfo.selected_albums_elist, gcluster) {
+ if (gcluster && gcluster->cluster && gcluster->cluster->uuid) {
+ item_id = strdup(gcluster->cluster->uuid);
+ *sel_id_list = eina_list_append(*sel_id_list,
+ (void *)item_id);
+ }
+ }
+ return 0;
+}
+
+int _gl_data_util_get_selected_item_id_list(void *data,
+ Eina_List **sel_id_list)
+{
+ GL_CHECK_VAL(sel_id_list, -1);
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ GL_CHECK_VAL(ad->selectedinfo.medias_elist, -1);
+ gl_item *gitem = NULL;
+ char *item_id = NULL;
+
+ /* Save ID of selected items */
+ EINA_LIST_FREE(ad->selectedinfo.medias_elist, gitem) {
+ if (gitem && gitem->item && gitem->item->uuid) {
+ item_id = strdup(gitem->item->uuid);
+ *sel_id_list = eina_list_append(*sel_id_list,
+ (void *)item_id);
+ }
+ }
+ return 0;
+}
+
+/* Check ID is in the list or not */
+bool _gl_data_util_check_selected_id(Eina_List **sel_id_list, const char *id)
+{
+ GL_CHECK_FALSE(sel_id_list);
+ Eina_List *tmp_elist = NULL;
+ void *p_id = NULL;
+ GL_CHECK_FALSE(id);
+
+ if (eina_list_count(*sel_id_list) == 0) {
+ gl_dbgE("sel_id_list is empty!");
+ return false;
+ }
+
+ EINA_LIST_FOREACH(*sel_id_list, tmp_elist, p_id) {
+ if (p_id == NULL) {
+ gl_dbgE("Invalid p_id!");
+ continue;
+ }
+ /* Get next one if they wasn't equal */
+ if (g_strcmp0(id, (char *)p_id)) {
+ p_id = NULL;
+ continue;
+ }
+ *sel_id_list = eina_list_remove(*sel_id_list, p_id);
+ GL_FREE(p_id);
+ return true;
+ }
+ return false;
+}
+
+/* Free list of selected IDs */
+int _gl_data_util_free_selected_id_list(Eina_List **sel_id_list)
+{
+ GL_CHECK_VAL(sel_id_list, -1);
+ if (*sel_id_list == NULL) {
+ gl_dbg("sel_id_list is empty!");
+ return -1;
+ }
+
+ void *p_id = NULL;
+ EINA_LIST_FREE(*sel_id_list, p_id) {
+ if (p_id == NULL) {
+ gl_dbgE("Invalid p_id!");
+ continue;
+ }
+ GL_FREE(p_id);
+ }
+ *sel_id_list = NULL;
+ return 0;
+}
+
+int _gl_data_util_check_album_selected_files(gl_cluster *album, int *drm_cnt,
+ int *img_cnt, int *sel_cnt)
+{
+ GL_CHECK_VAL(album, -1);
+ GL_CHECK_VAL(album->cluster, -1);
+ GL_CHECK_VAL(album->cluster->uuid, -1);
+ GL_CHECK_VAL(album->ad, -1);
+ int _sel_cnt = 0;
+ int _img_cnt = 0;
+ int _drm_cnt = 0;
+ int err = -1;
+ Eina_List *itemlist = NULL;
+ gl_filter_s filter;
+
+ memset(&filter, 0x00, sizeof(gl_filter_s));
+ g_strlcpy(filter.cond, GL_CONDITION_IMAGE_VIDEO, CONDITION_LENGTH);
+ filter.sort_type = MEDIA_CONTENT_ORDER_DESC;
+ filter.collate_type = MEDIA_CONTENT_COLLATE_NOCASE;
+ g_strlcpy(filter.sort_keyword, MEDIA_MODIFIED_TIME, KEYWORD_LENGTH);
+ filter.offset = GL_GET_ALL_RECORDS;
+ filter.count = GL_GET_ALL_RECORDS;
+ filter.with_meta = false;
+
+ if (album->cluster->type == GL_STORE_T_ALL) {
+ gl_dbg("All albums");
+ err = _gl_local_data_get_all_albums_media_list(&filter,
+ &itemlist);
+ } else if (album->cluster->type == GL_STORE_T_PHONE ||
+ album->cluster->type == GL_STORE_T_MMC) {
+ gl_dbg("Local album");
+ err = _gl_local_data_get_album_media_list(&filter,
+ album->cluster->uuid,
+ &itemlist);
+ } else {
+ gl_dbgE("Wrong cluster type!");
+ return -1;
+ }
+
+ if ((err == 0) && (itemlist != NULL)) {
+ gl_media_s *item = NULL;
+ EINA_LIST_FREE(itemlist, item) {
+ if (item == NULL || item->uuid == NULL) {
+ gl_dbgE("Invalid item!");
+ continue;
+ }
+
+ _sel_cnt++;
+ if (album->cluster->type == GL_STORE_T_PHONE ||
+ album->cluster->type == GL_STORE_T_MMC ||
+ album->cluster->type == GL_STORE_T_ALL) {
+ if (item->type == MEDIA_CONTENT_TYPE_IMAGE)
+ _img_cnt++;
+ /* Update selected DRM files count */
+ if (gl_drm_is_drm_file(item->file_url))
+ _drm_cnt++;
+ } else {
+ /* Checkme: now only image supported for web */
+ _img_cnt++;
+ }
+ item = NULL;
+ }
+ }
+ gl_dbg("Selected items count: %d, image count: %d, drm count: %d.",
+ _sel_cnt, _img_cnt, _drm_cnt);
+ if (sel_cnt)
+ *sel_cnt = _sel_cnt;
+ if (drm_cnt)
+ *drm_cnt = _drm_cnt;
+ if (img_cnt)
+ *img_cnt = _img_cnt;
+ return 0;
+}
+
+int _gl_data_util_check_tag_selected_files(void *data, int *drm_cnt,
+ int *img_cnt, int *sel_cnt)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ GL_CHECK_VAL(ad->taginfo.selected_tags_elist, -1);
+ GString *selected_path_list = g_string_new(NULL);
+ gl_tag *gtag = NULL;
+ Eina_List *l = NULL;
+ int err = -1;
+ Eina_List *itemlist = NULL;
+ int _sel_cnt = 0;
+ int _img_cnt = 0;
+ int _drm_cnt = 0;
+
+ gl_filter_s filter;
+ memset(&filter, 0x00, sizeof(gl_filter_s));
+ g_strlcpy(filter.cond, GL_CONDITION_IMAGE_VIDEO, CONDITION_LENGTH);
+ filter.sort_type = MEDIA_CONTENT_ORDER_DESC;
+ filter.collate_type = MEDIA_CONTENT_COLLATE_NOCASE;
+ g_strlcpy(filter.sort_keyword, MEDIA_MODIFIED_TIME, KEYWORD_LENGTH);
+ filter.offset = GL_GET_ALL_RECORDS;
+ filter.count = GL_GET_ALL_RECORDS;
+ filter.with_meta = true;
+
+ EINA_LIST_FOREACH(ad->taginfo.selected_tags_elist, l, gtag) {
+ if (gtag == NULL || gtag->tag == NULL ||
+ gtag->tag->tag_name == NULL) {
+ if (selected_path_list) {
+ g_string_free(selected_path_list, true);
+ selected_path_list = NULL;
+ }
+ return -1;
+ }
+
+ err = _gl_local_data_get_tag_media_list(gtag->tag->_id, &filter,
+ &itemlist);
+
+ if ((err == 0) && (itemlist != NULL)) {
+ gl_media_s *item = NULL;
+ EINA_LIST_FREE(itemlist, item) {
+ if (item == NULL || item->uuid == NULL) {
+ gl_dbgE("Invalid item!");
+ continue;
+ }
+
+ if (strstr(selected_path_list->str, item->file_url)) {
+ gl_dbgW("Already counted!");
+ continue;
+ }
+
+ _sel_cnt++;
+
+ if (item->type == MEDIA_CONTENT_TYPE_IMAGE)
+ _img_cnt++;
+ /* Update selected DRM files count */
+ if (gl_drm_is_drm_file(item->file_url))
+ _drm_cnt++;
+
+ g_string_append(selected_path_list, item->file_url);
+ g_string_append_c(selected_path_list, '?');
+ item = NULL;
+ }
+ }
+ }
+
+ g_string_free(selected_path_list, true);
+
+ gl_dbg("Selected items count: %d, image count: %d, drm count: %d.",
+ _sel_cnt, _img_cnt, _drm_cnt);
+ if (sel_cnt)
+ *sel_cnt = _sel_cnt;
+ if (drm_cnt)
+ *drm_cnt = _drm_cnt;
+ if (img_cnt)
+ *img_cnt = _img_cnt;
+ return 0;
+}
+
+/*
+* free tag list.
+*/
+int _gl_data_util_free_tag_list(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+
+ if (ad->taginfo.tags_elist) {
+ gl_tag *gtag = NULL;
+ Eina_List *tags_list = ad->taginfo.tags_elist;
+ EINA_LIST_FREE(tags_list, gtag) {
+ if (gtag) {
+ _gl_data_util_free_gtag(gtag);
+ gtag = NULL;
+ }
+ }
+
+ ad->taginfo.tags_elist = NULL;
+ }
+
+ return 0;
+}
+
+/*
+* get favorites tag from libmedia-info
+*/
+gl_tag *_gl_data_util_get_favor_tag(void *data)
+{
+ gl_dbg("");
+ GL_CHECK_NULL(data);
+ gl_appdata *ad = (gl_appdata *)data;
+ /* add favorites tag */
+ gl_tag_s *favor_tag = NULL;
+
+ _gl_data_type_new_tag(&favor_tag);
+ GL_CHECK_NULL(favor_tag);
+ favor_tag->tag_name = strdup(GL_TAG_FAVORITES_NAME);
+ favor_tag->_id = GL_TAG_FAVORITES_ID;
+ favor_tag->gtype = 0;
+
+ gl_tag *favor_gtag = _gl_data_util_calloc_gtag();
+ if (!favor_gtag) {
+ gl_dbgE("_gl_data_util_calloc_gtag() failed!");
+ _gl_data_type_free_glitem((void **)&favor_tag);
+ return NULL;
+ }
+ favor_gtag->tag = favor_tag;
+
+ /* Get favorites item count */
+ int item_count = 0;
+ int err = _gl_data_get_item_cnt(ad, GL_GET_ALL_RECORDS_ID, true,
+ GL_STORE_T_PHONE, &item_count);
+ if (err == 0) {
+ favor_tag->count = item_count;
+ } else {
+ gl_dbgE("_gl_data_get_item_cnt failed!");
+ favor_tag->count = 0;
+ }
+ gl_dbg("===Tag [Favourites] has %d item(s)", favor_tag->count);
+
+ return favor_gtag;
+}
+
--- /dev/null
+/*\r
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd\r
+ *\r
+ * Licensed under the Flora License, Version 1.1 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://floralicense.org/license/\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+#include <errno.h>\r
+#include <media_info.h>\r
+#include <string.h>\r
+#include "gl-data.h"\r
+#include "gl-data-util.h"\r
+#include "gl-controlbar.h"\r
+#include "gallery.h"\r
+#include "gl-debug.h"\r
+#include "gl-drm.h"\r
+#include "gl-util.h"\r
+#include "gl-strings.h"\r
+#include "gl-icons.h"\r
+#include "gl-exif.h"\r
+\r
+static int __gl_data_clear_cluster_list(void *data, bool b_force)\r
+{\r
+ GL_CHECK_VAL(data, -1);\r
+ gl_appdata *ad = (gl_appdata *)data;\r
+ gl_cluster *current = NULL;\r
+ Eina_List *tmp_list = NULL;\r
+\r
+ // 2011.1.3 han - To reset current album when clear cluster list.\r
+ ad->albuminfo.current_album = NULL;\r
+\r
+ if (ad->albuminfo.cluster_list) {\r
+ if (ad->albuminfo.cluster_list->clist) {\r
+ tmp_list = ad->albuminfo.cluster_list->clist;\r
+\r
+ EINA_LIST_FREE(tmp_list, current) {\r
+ if (current) {\r
+ _gl_data_util_free_gcluster(current);\r
+ current = NULL;\r
+ }\r
+ }\r
+ ad->albuminfo.cluster_list->clist = NULL;\r
+ }\r
+\r
+ if (b_force) {\r
+ GL_FREE(ad->albuminfo.cluster_list);\r
+ }\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+static int __gl_data_get_cluster_list(void *data, bool b_update)\r
+{\r
+ GL_CHECK_VAL(data, -1);\r
+ gl_appdata *ad = (gl_appdata *)data;\r
+ int length = 0;\r
+ int all_item_cnt = 0;\r
+ Eina_List *item_list = NULL;\r
+ gl_album_s *f_data = NULL;\r
+ gl_cluster *default_album = NULL;\r
+ int err = -1;\r
+ int edit_album_cnt = 0;\r
+ gl_filter_s filter;\r
+ gl_album_s *new_mc = NULL;\r
+ Eina_List *sel_id_list = NULL;\r
+ bool b_selected = false;\r
+ char new_mc_id[GL_MTYPE_ITEN_ID_LEN_MAX] = { 0, };\r
+ char sel_id[GL_MTYPE_ITEN_ID_LEN_MAX] = { 0, };\r
+ gl_dbg("");\r
+\r
+ memset(&filter, 0x00, sizeof(gl_filter_s));\r
+\r
+ if (b_update) {\r
+ gl_dbg("Update mode.");\r
+ gl_cluster *album_item = ad->albuminfo.selected_album;\r
+ if (album_item && album_item->cluster &&\r
+ album_item->cluster->uuid) {\r
+ g_strlcpy(sel_id, album_item->cluster->uuid,\r
+ GL_MTYPE_ITEN_ID_LEN_MAX);\r
+ gl_dbg("Save selected album ID: %s.", sel_id);\r
+ }\r
+ ad->albuminfo.selected_album = NULL;\r
+ /* Get selected cluster IDs list */\r
+ _gl_data_util_get_selected_cluster_id_list(ad, &sel_id_list);\r
+ /* Free old list */\r
+ _gl_data_finalize_albums_selected_list(ad);\r
+ /* Clear cluster list */\r
+ __gl_data_clear_cluster_list(ad, false);\r
+ }\r
+\r
+\r
+ //ad->new_album_name is the cluster name of newly created album\r
+ //in moving medias to new album case.\r
+ if (strlen(ad->albuminfo.new_album_name)) {\r
+ memset(ad->albuminfo.new_album_name, 0x00, GL_ALBUM_NAME_LEN_MAX);\r
+ //get gl_media_s from DB via folder full path(URL).\r
+ err = _gl_local_data_get_album_by_path(ad->albuminfo.dest_folder,\r
+ &new_mc);\r
+ if (err != 0) {\r
+ gl_dbgE("Faild to get album[%d]!", err);\r
+ } else if (new_mc->count == 0) {\r
+ //media records of this cluster havn't been inserted to DB.\r
+ //save the cluster ID.\r
+ //update cluster item count while refresh albums view in _gl_albums_get_label().\r
+ gl_dbg("Get newly created gl_media_s, url: %s.",\r
+ ad->albuminfo.dest_folder);\r
+ g_strlcpy(new_mc_id, new_mc->uuid,\r
+ GL_MTYPE_ITEN_ID_LEN_MAX);\r
+ _gl_data_type_free_glitem((void **)&new_mc);\r
+ }\r
+ }\r
+\r
+ //get real albums\r
+ memset(filter.cond, 0x00, CONDITION_LENGTH);\r
+ filter.sort_type = MEDIA_CONTENT_ORDER_ASC;\r
+ g_strlcpy(filter.sort_keyword, FOLDER_NAME, KEYWORD_LENGTH);\r
+ filter.collate_type = MEDIA_CONTENT_COLLATE_NOCASE;\r
+ filter.offset = GL_GET_ALL_RECORDS;\r
+ filter.count = GL_GET_ALL_RECORDS;\r
+ filter.with_meta = false;\r
+\r
+ gl_dbg("Get_album_list:start");\r
+ err = _gl_local_data_get_album_list(&filter, &item_list);\r
+ gl_dbg("Get_album_list:end, %d", err);\r
+ if (err != 0) {\r
+ gl_dbg("No record!");\r
+ ad->albuminfo.cluster_list->clist = NULL;\r
+ if (item_list)\r
+ _gl_data_util_clear_gtype_item_list(&item_list);\r
+ }\r
+\r
+ gl_cluster *gcluster = NULL;\r
+ EINA_LIST_FREE(item_list, f_data) {\r
+ if (f_data == NULL || f_data->uuid == NULL) {\r
+ gl_dbgE("Invalid gl_media_s!");\r
+ continue;\r
+ }\r
+ gl_dbg("folder id: %s.", f_data->uuid);\r
+\r
+ /**\r
+ * To skip MMC albums if MMC already unmounted,\r
+ * in case of delay updating in DB.\r
+ */\r
+ if ((ad->maininfo.mmc_state == GL_MMC_STATE_REMOVED_MOVING ||\r
+ ad->maininfo.mmc_state == GL_MMC_STATE_REMOVED) &&\r
+ f_data->type == GL_STORE_T_MMC) {\r
+ gl_dbgW("MMC was unmounted, skip MMC album!");\r
+ _gl_data_type_free_glitem((void **)&f_data);\r
+ continue;\r
+ }\r
+\r
+ if (f_data->type == GL_STORE_T_PHONE ||\r
+ f_data->type == GL_STORE_T_MMC) {\r
+ if (f_data->count == 0) {\r
+ if (!g_strcmp0(f_data->uuid, new_mc_id)) {\r
+ /* append the newly created cluster to list */\r
+ gl_dbg("empty local album, but it's newly created...");\r
+ } else {\r
+ /* Skip empty album */\r
+ gl_dbg("empty local album, skipping it...");\r
+ _gl_data_type_free_glitem((void **)&f_data);\r
+ continue;\r
+ }\r
+ }\r
+ all_item_cnt += f_data->count;\r
+ }\r
+\r
+ gcluster = NULL;\r
+ gcluster = _gl_data_new_cluster();\r
+ if (gcluster == NULL) {\r
+ gl_dbgE("_gl_data_new_cluster failed!");\r
+ _gl_data_type_free_glitem((void **)&f_data);\r
+ continue;\r
+ }\r
+\r
+ gcluster->ad = ad;\r
+ gcluster->cluster = f_data;\r
+\r
+ length += f_data->count;\r
+\r
+ if (_gl_data_is_default_album(GL_ALBUM_DEFAULT_NAME, f_data)) {\r
+ /**\r
+ * Default album: Camera Shot\r
+ * Now Camera Shot is located in Phone.\r
+ * If user can determine the location of default album,\r
+ * here we should get the path and check it's in Phone or MMC.\r
+ */\r
+ default_album = gcluster;\r
+ ad->albuminfo.cluster_list->clist = eina_list_prepend(ad->albuminfo.cluster_list->clist,\r
+ gcluster);\r
+ } else if (_gl_data_is_default_album(GL_ALBUM_DOWNLOAD_NAME, f_data)) {\r
+ if (default_album)\r
+ ad->albuminfo.cluster_list->clist = eina_list_append_relative(ad->albuminfo.cluster_list->clist,\r
+ gcluster, default_album);\r
+ else\r
+ ad->albuminfo.cluster_list->clist = eina_list_prepend(ad->albuminfo.cluster_list->clist,\r
+ gcluster);\r
+ }else {\r
+ ad->albuminfo.cluster_list->clist = eina_list_append(ad->albuminfo.cluster_list->clist,\r
+ gcluster);\r
+ }\r
+ /* Default album 'Camera shots' showed in edit view */\r
+ edit_album_cnt++;\r
+\r
+ if (sel_id_list) {\r
+ b_selected = _gl_data_util_check_selected_id(&sel_id_list,\r
+ f_data->uuid);\r
+ if (b_selected) {\r
+ b_selected = false;\r
+ /* Set checkbox state */\r
+ gcluster->checked = true;\r
+ /* Append gcluster to selected list */\r
+ _gl_data_albums_selected_list_append(ad, gcluster);\r
+ }\r
+ }\r
+ if (strlen(sel_id) > 0 && !g_strcmp0(sel_id, f_data->uuid)) {\r
+ gl_dbgW("Found selected_album.");\r
+ ad->albuminfo.selected_album = gcluster;\r
+ }\r
+ }\r
+\r
+ /* Clear list of selected ID */\r
+ if (sel_id_list) {\r
+ b_selected = _gl_data_util_check_selected_id(&sel_id_list,\r
+ GL_ALBUM_ALL_ID);\r
+ _gl_data_util_free_selected_id_list(&sel_id_list);\r
+ }\r
+\r
+ ad->albuminfo.cluster_list->edit_cnt = edit_album_cnt;\r
+ /**\r
+ * add "all" album, only inclduing local albums temporarily,\r
+ */\r
+ if (all_item_cnt) {\r
+ /* Create "All albums" album if any local file exists */\r
+ gcluster = _gl_data_util_new_gcluster_all(ad, all_item_cnt);\r
+ if (gcluster == NULL) {\r
+ gl_dbgE("_gl_data_util_new_gcluster_all failed!");\r
+ __gl_data_clear_cluster_list(ad, false);\r
+ return -1;\r
+ }\r
+ if (b_selected) {\r
+ b_selected = false;\r
+ /* Set checkbox state */\r
+ gcluster->checked = true;\r
+ /* Append gcluster to selected list */\r
+ _gl_data_albums_selected_list_append(ad, gcluster);\r
+ }\r
+\r
+ if (default_album)\r
+ ad->albuminfo.cluster_list->clist = eina_list_append_relative(ad->albuminfo.cluster_list->clist,\r
+ gcluster, default_album);\r
+ else\r
+ ad->albuminfo.cluster_list->clist = eina_list_prepend(ad->albuminfo.cluster_list->clist,\r
+ gcluster);\r
+ default_album = gcluster;\r
+\r
+ /* Get latest item for saving lastest modified time */\r
+ Eina_List *item_list = NULL;\r
+ memset(&filter, 0x00, sizeof(gl_filter_s));\r
+ gl_media_s *mitem = NULL;\r
+ g_strlcpy(filter.cond, GL_CONDITION_IMAGE_VIDEO,\r
+ CONDITION_LENGTH);\r
+ filter.sort_type = MEDIA_CONTENT_ORDER_DESC;\r
+ filter.collate_type = MEDIA_CONTENT_COLLATE_NOCASE;\r
+ g_strlcpy(filter.sort_keyword, MEDIA_MODIFIED_TIME,\r
+ KEYWORD_LENGTH);\r
+ filter.offset = GL_FIRST_VIEW_START_POS;\r
+ filter.count = GL_GET_ONE_RECORDS;\r
+ filter.with_meta = false;\r
+\r
+ _gl_local_data_get_all_albums_media_list(&filter, &item_list);\r
+ if (item_list) {\r
+ gl_dbg("list length is %d", eina_list_count(item_list));\r
+ mitem = eina_list_nth(item_list, 0);\r
+ if (mitem) {\r
+ ad->maininfo.last_mtime = mitem->mtime;\r
+ _gl_data_type_free_glitem((void **)&mitem);\r
+ }\r
+ eina_list_free(item_list);\r
+ }\r
+ ad->maininfo.all_medias_cnt = all_item_cnt;\r
+ }\r
+\r
+ gl_dbg("Cluster Done.");\r
+ return length;\r
+}\r
+\r
+gl_cluster *_gl_data_new_cluster(void)\r
+{\r
+ return _gl_data_util_calloc_gcluster();\r
+}\r
+\r
+/*\r
+* Check it's default album[Camera shot] or not\r
+*/\r
+bool _gl_data_is_default_album(const char *match_folder, gl_album_s *album)\r
+{\r
+ GL_CHECK_FALSE(album);\r
+ GL_CHECK_FALSE(album->display_name);\r
+ GL_CHECK_FALSE(album->uuid);\r
+ GL_CHECK_FALSE(match_folder);\r
+\r
+ /* Name is 'Camera shot and' folder locates in Phone */\r
+ if (!g_strcmp0(album->display_name, match_folder) &&\r
+ album->type == GL_STORE_T_PHONE) {\r
+ char parent_path[GL_DIR_PATH_LEN_MAX] = { 0, };\r
+\r
+ gl_dbg("Full path: %s", album->path);\r
+\r
+ _gl_data_util_get_file_dir_name(album->path, NULL, NULL,\r
+ parent_path);\r
+ gl_dbg("Parent path: %s.", parent_path);\r
+\r
+ /* And parent folder is Phone root path, it's default folder */\r
+ return (g_strcmp0(parent_path, GL_ROOT_PATH_PHONE) == 0);\r
+ }\r
+\r
+ return false;\r
+}\r
+\r
+int _gl_data_clear_default_item_list(void *data)\r
+{\r
+ GL_CHECK_VAL(data, -1);\r
+ gl_appdata *ad = (gl_appdata *)data;\r
+\r
+ _gl_data_util_clear_item_list(&(ad->maininfo.medias_elist));\r
+\r
+ return 0;\r
+}\r
+\r
+bool _gl_data_get_cluster_list(void *data)\r
+{\r
+ GL_CHECK_FALSE(data);\r
+ gl_appdata *ad = (gl_appdata *)data;\r
+ int n_entire_items = 0;\r
+\r
+ __gl_data_clear_cluster_list(ad, true);\r
+\r
+ ad->albuminfo.cluster_list = _gl_data_util_calloc_cluster_list();\r
+ GL_CHECK_FALSE(ad->albuminfo.cluster_list);\r
+ n_entire_items = __gl_data_get_cluster_list(ad, false);\r
+ if (n_entire_items <= 0) //if error code is returned, negative value is possible\r
+ {\r
+ return false;\r
+ }\r
+ gl_dbg("cluster-length:%d", n_entire_items);\r
+\r
+ return true;\r
+}\r
+\r
+int _gl_data_update_cluster_list(void *data)\r
+{\r
+ GL_CHECK_VAL(data, -1);\r
+ gl_appdata *ad = (gl_appdata *)data;\r
+ int len = 0;\r
+\r
+ len = __gl_data_get_cluster_list(ad, true);\r
+ gl_dbg("Cluster list length: %d.", len);\r
+ if (len <= 0)\r
+ return -1;\r
+\r
+ return 0;\r
+}\r
+\r
+int _gl_data_get_cluster_by_id(void *data, const char *cluster_id,\r
+ gl_cluster **cluster)\r
+{\r
+ GL_CHECK_VAL(data, -1);\r
+ GL_CHECK_VAL(cluster, -1);\r
+ GL_CHECK_VAL(cluster_id, -1);\r
+ gl_appdata *ad = (gl_appdata *)data;\r
+ int i = 0;\r
+ gl_cluster *current = NULL;\r
+\r
+ *cluster = NULL;\r
+\r
+ GL_CHECK_VAL(ad->albuminfo.cluster_list, -1);\r
+ int length = eina_list_count(ad->albuminfo.cluster_list->clist);\r
+ gl_dbg("album length: %d, current album id: %s", length, cluster_id);\r
+\r
+ for (i = 0; i < length; i++) {\r
+ current = eina_list_nth(ad->albuminfo.cluster_list->clist, i);\r
+ if (current && current->cluster && current->cluster->uuid) {\r
+ gl_dbg("cluster : %s", current->cluster->display_name);\r
+ } else {\r
+ gl_dbgE("cluster is NULL");\r
+ break;\r
+ }\r
+\r
+ if (!g_strcmp0(current->cluster->uuid, cluster_id)) {\r
+ *cluster = current;\r
+ gl_dbgW("Found!");\r
+ return 0;\r
+ }\r
+ }\r
+ return -1;\r
+}\r
+\r
+int _gl_data_get_cluster_by_path(void *data, const char *path,\r
+ gl_cluster **cluster)\r
+{\r
+ GL_CHECK_VAL(data, -1);\r
+ GL_CHECK_VAL(cluster, -1);\r
+ GL_CHECK_VAL(path, -1);\r
+ gl_appdata *ad = (gl_appdata *)data;\r
+ int i = 0;\r
+ gl_cluster *current = NULL;\r
+\r
+ *cluster = NULL;\r
+\r
+ GL_CHECK_VAL(ad->albuminfo.cluster_list, -1);\r
+ int length = eina_list_count(ad->albuminfo.cluster_list->clist);\r
+ gl_dbg("album length: %d, path: %s", length, path);\r
+\r
+ for (i = 0; i < length; i++) {\r
+ current = eina_list_nth(ad->albuminfo.cluster_list->clist, i);\r
+ if (current && current->cluster && current->cluster->path) {\r
+ gl_dbg("cluster : %s", current->cluster->display_name);\r
+ } else {\r
+ gl_dbgE("cluster is NULL");\r
+ continue;\r
+ }\r
+\r
+ if (!g_strcmp0(current->cluster->path, path)) {\r
+ *cluster = current;\r
+ gl_dbgW("Found!");\r
+ return 0;\r
+ }\r
+ }\r
+ return -1;\r
+}\r
+\r
+/*\r
+* get tag by index from tags_elist.\r
+*/\r
+int _gl_data_get_tag_by_index(void *data, gl_tag **tag, int idx)\r
+{\r
+ GL_CHECK_VAL(tag, -1);\r
+ GL_CHECK_VAL(data, -1);\r
+ gl_appdata *ad = (gl_appdata *)data;\r
+\r
+ *tag = eina_list_nth(ad->taginfo.tags_elist, idx);\r
+ if (*tag == NULL)\r
+ return -1;\r
+\r
+ return 0;\r
+}\r
+\r
+/*\r
+* check whether some tag already in tags list.\r
+*/\r
+bool _gl_data_is_in_tag_list(void *data, const char *tagname)\r
+{\r
+ GL_CHECK_FALSE(tagname);\r
+ GL_CHECK_FALSE(data);\r
+ gl_appdata *ad = (gl_appdata *)data;\r
+ GL_CHECK_FALSE(ad->taginfo.tags_elist);\r
+ gl_dbg("");\r
+\r
+ Eina_List *tmp_elist = NULL;\r
+ gl_tag *mtag = NULL;\r
+ Eina_List *tags_list = ad->taginfo.tags_elist;\r
+ EINA_LIST_FOREACH(tags_list, tmp_elist, mtag) {\r
+ if (mtag && mtag->tag) {\r
+ if (mtag->tag->tag_name &&\r
+ (g_strcmp0(mtag->tag->tag_name, tagname) == 0)) {\r
+ //debug msg\r
+ gl_dbg("Tag already exists--found tag %s***",\r
+ mtag->tag->tag_name);\r
+ return true;\r
+ }\r
+ mtag = NULL;\r
+ }\r
+ }\r
+\r
+ gl_dbg("A new tag %s +++", tagname);\r
+\r
+ return false;\r
+}\r
+\r
+/*\r
+* get all count of tags list\r
+* 0 returned if tags_elist doesn't exist.\r
+*/\r
+int _gl_data_get_tag_count_all(void *data)\r
+{\r
+ GL_CHECK_VAL(data, -1);\r
+ gl_appdata *ad = (gl_appdata *)data;\r
+\r
+ if (ad->taginfo.tags_elist)\r
+ return eina_list_count(ad->taginfo.tags_elist);\r
+ else\r
+ return 0;\r
+}\r
+\r
+/*\r
+* get all tags from database via media service,\r
+* tag list(param: elist) would be returned to caller, and also saved as tags_list.\r
+*/\r
+int _gl_data_get_tag_list(void *data, Eina_List **elist)\r
+{\r
+ GL_CHECK_VAL(data, -1);\r
+ gl_appdata *ad = (gl_appdata *)data;\r
+ Eina_List *taglist = NULL;\r
+ int err = -1;\r
+ gl_dbg("");\r
+\r
+ _gl_data_util_free_tag_list(ad);\r
+\r
+ gl_tag *favor_gtag = _gl_data_util_get_favor_tag(ad);\r
+ if (favor_gtag == NULL) {\r
+ gl_dbgE("_gl_data_util_get_favor_tag failed!");\r
+ if (elist)\r
+ *elist = NULL;\r
+ return -1;\r
+ }\r
+ favor_gtag->ad = ad;\r
+ ad->taginfo.tags_elist = eina_list_append(ad->taginfo.tags_elist,\r
+ favor_gtag);\r
+\r
+ gl_filter_s filter;\r
+ memset(&filter, 0x00, sizeof(gl_filter_s));\r
+ filter.sort_type = MEDIA_CONTENT_ORDER_ASC;\r
+ g_strlcpy(filter.sort_keyword, TAG_NAME, KEYWORD_LENGTH);\r
+ filter.collate_type = MEDIA_CONTENT_COLLATE_NOCASE;\r
+ filter.offset = GL_GET_ALL_RECORDS;\r
+ filter.count = GL_GET_ALL_RECORDS;\r
+ filter.with_meta = false;\r
+ err = _gl_local_data_get_tag_list(&filter, &taglist);\r
+ if ((err != 0) || (taglist == NULL)) {\r
+ gl_dbgE("(err != 0) || (taglist == NULL)");\r
+ if (taglist)\r
+ _gl_data_util_clear_gtype_item_list(&taglist);\r
+\r
+ if (elist)\r
+ *elist = ad->taginfo.tags_elist;\r
+\r
+ return err;\r
+ }\r
+\r
+ gl_tag_s *mtag = NULL;\r
+ gl_tag *gtag = NULL;\r
+ EINA_LIST_FREE(taglist, mtag) {\r
+ if (mtag == NULL) {\r
+ gl_dbgE("Invalid mtag!");\r
+ continue;\r
+ }\r
+ gtag = _gl_data_util_calloc_gtag();\r
+ if (gtag == NULL) {\r
+ gl_dbgE("_gl_data_util_calloc_gtag failed!");\r
+ _gl_data_type_free_glitem((void **)&mtag);\r
+ continue;\r
+ }\r
+\r
+ gtag->ad = ad;\r
+ gtag->tag = mtag;\r
+ ad->taginfo.tags_elist = eina_list_append(ad->taginfo.tags_elist,\r
+ gtag);\r
+ }\r
+\r
+ if (elist)\r
+ *elist = ad->taginfo.tags_elist;\r
+\r
+ return err;\r
+}\r
+\r
+int _gl_data_update_tag_list(void *data, Eina_List **elist)\r
+{\r
+ GL_CHECK_VAL(data, -1);\r
+ gl_appdata *ad = (gl_appdata *)data;\r
+ Eina_List *taglist = NULL;\r
+ int err = -1;\r
+ char current_tag_name[GL_ALBUM_NAME_LEN_MAX] = { 0, };\r
+ gl_tag *current_tag = ad->taginfo.current_tag;\r
+ bool b_reset = false;\r
+ gl_dbg("");\r
+ /* Save current tag name */\r
+ if (current_tag && current_tag->tag && current_tag->tag->tag_name) {\r
+ gl_dbg("Current tag: %s", current_tag->tag->tag_name);\r
+ b_reset = true;\r
+ g_strlcpy(current_tag_name, current_tag->tag->tag_name,\r
+ sizeof(current_tag_name));\r
+ }\r
+ /* Set current_tag NULL */\r
+ ad->taginfo.current_tag = NULL;\r
+ /* Clear old tag list */\r
+ _gl_data_util_free_tag_list(ad);\r
+ /* Add favourites tag */\r
+ gl_tag *favor_gtag = _gl_data_util_get_favor_tag(ad);\r
+ if (favor_gtag == NULL || favor_gtag->tag == NULL) {\r
+ gl_dbgE("_gl_data_util_get_favor_tag failed!");\r
+ if (elist)\r
+ *elist = NULL;\r
+ if (favor_gtag)\r
+ _gl_data_util_free_gtag(favor_gtag);\r
+ return -1;\r
+ }\r
+ if (b_reset && favor_gtag->tag->tag_name &&\r
+ !g_strcmp0(favor_gtag->tag->tag_name, current_tag_name)) {\r
+ gl_dbg("Current tag reset.");\r
+ b_reset = false;\r
+ ad->taginfo.current_tag = favor_gtag;\r
+ }\r
+ favor_gtag->ad = ad;\r
+ ad->taginfo.tags_elist = eina_list_append(ad->taginfo.tags_elist,\r
+ favor_gtag);\r
+\r
+ /* Get normal tags from DB */\r
+ gl_filter_s filter;\r
+ memset(&filter, 0x00, sizeof(gl_filter_s));\r
+ filter.sort_type = MEDIA_CONTENT_ORDER_ASC;\r
+ g_strlcpy(filter.sort_keyword, TAG_NAME, KEYWORD_LENGTH);\r
+ filter.collate_type = MEDIA_CONTENT_COLLATE_NOCASE;\r
+ filter.count = GL_GET_ALL_RECORDS;\r
+ filter.offset = GL_GET_ALL_RECORDS;\r
+ filter.with_meta = false;\r
+ err = _gl_local_data_get_tag_list(&filter, &taglist);\r
+ if ((err != 0) || (taglist == NULL)) {\r
+ gl_dbgE("(err != 0) || (taglist == NULL)");\r
+ if (taglist)\r
+ _gl_data_util_clear_gtype_item_list(&taglist);\r
+\r
+ if (elist)\r
+ *elist = ad->taginfo.tags_elist;\r
+\r
+ return err;\r
+ }\r
+\r
+ gl_tag_s *mtag = NULL;\r
+ gl_tag *gtag = NULL;\r
+ EINA_LIST_FREE(taglist, mtag) {\r
+ if (mtag == NULL) {\r
+ gl_dbgE("Invalid mtag!");\r
+ continue;\r
+ }\r
+ gtag = _gl_data_util_calloc_gtag();\r
+ if (gtag == NULL) {\r
+ gl_dbgE("_gl_data_util_calloc_gtag failed!");\r
+ _gl_data_type_free_glitem((void **)&mtag);\r
+ continue;\r
+ }\r
+ if (b_reset && !g_strcmp0(mtag->tag_name, current_tag_name)) {\r
+ gl_dbg("Current tag reset.");\r
+ b_reset = false;\r
+ ad->taginfo.current_tag = gtag;\r
+ }\r
+ gtag->ad = ad;\r
+ gtag->tag = mtag;\r
+ ad->taginfo.tags_elist = eina_list_append(ad->taginfo.tags_elist,\r
+ gtag);\r
+ }\r
+\r
+ if (elist)\r
+ *elist = ad->taginfo.tags_elist;\r
+\r
+ return err;\r
+}\r
+\r
+/*\r
+* remove tag from tags_elist\r
+*/\r
+int _gl_data_tags_list_remove(void *data, gl_tag *gtag)\r
+{\r
+ gl_dbg("");\r
+ GL_CHECK_VAL(gtag, -1);\r
+ GL_CHECK_VAL(gtag->tag, -1);\r
+ GL_CHECK_VAL(gtag->tag->tag_name, -1);\r
+ GL_CHECK_VAL(data, -1);\r
+ gl_appdata *ad = (gl_appdata *)data;\r
+ gl_tag *current = NULL;\r
+ Eina_List *l = NULL;\r
+\r
+ Eina_List *tags_list = ad->taginfo.tags_elist;\r
+ EINA_LIST_FOREACH(tags_list, l, current) {\r
+ if (!current || !current->tag || !current->tag->tag_name) {\r
+ gl_dbgE("NULL tag, continue...");\r
+ continue;\r
+ }\r
+ if (gtag->tag->_id == current->tag->_id){\r
+ gl_dbg("Found!");\r
+ tags_list = eina_list_remove(tags_list, current);\r
+ ad->taginfo.tags_elist = tags_list;\r
+ _gl_local_data_delete_tag(gtag->tag);\r
+ _gl_data_util_free_gtag(gtag);\r
+ break;\r
+ }\r
+ current = NULL;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+int _gl_data_get_tag_by_id(void *data, int tag_id, gl_tag **gtag)\r
+{\r
+ GL_CHECK_VAL(data, -1);\r
+ GL_CHECK_VAL(gtag, -1);\r
+ gl_appdata *ad = (gl_appdata *)data;\r
+ int i = 0;\r
+ gl_tag *current = NULL;\r
+\r
+ *gtag = NULL;\r
+\r
+ GL_CHECK_VAL(ad->taginfo.tags_elist, -1);\r
+ int length = eina_list_count(ad->taginfo.tags_elist);\r
+ gl_dbg("Tag length: %d, current tag ID: %d", length, tag_id);\r
+\r
+ for (i = 0; i < length; i++) {\r
+ current = eina_list_nth(ad->taginfo.tags_elist, i);\r
+ if (current && current->tag) {\r
+ gl_dbg("Tag: %s", current->tag->tag_name);\r
+ } else {\r
+ gl_dbgE("Tag is NULL");\r
+ break;\r
+ }\r
+\r
+ if (current->tag->_id == tag_id) {\r
+ *gtag = current;\r
+ gl_dbgW("Found!");\r
+ return 0;\r
+ }\r
+ }\r
+ return 0;\r
+}\r
+\r
+/*\r
+* get media item list belongs to some tagname(param: tag_name).\r
+* media item list(param: elist) would be returned to caller, and also saved as ad->media_elist.\r
+*/\r
+int _gl_data_get_item_list_tagname(void *data, unsigned int tag_id,\r
+ bool with_meta, Eina_List ** elist)\r
+{\r
+ GL_CHECK_VAL(data, -1);\r
+ gl_appdata *ad = (gl_appdata *)data;\r
+ gl_dbg("");\r
+ Eina_List *itemlist = NULL;\r
+ int err = -1;\r
+\r
+ _gl_data_clear_default_item_list(ad); //free item list got previously.\r
+\r
+ gl_filter_s filter;\r
+ memset(&filter,0x00,sizeof(gl_filter_s));\r
+ filter.sort_type = MEDIA_CONTENT_ORDER_ASC;\r
+ g_strlcpy(filter.sort_keyword, MEDIA_DISPLAY_NAME, KEYWORD_LENGTH);\r
+ filter.collate_type = MEDIA_CONTENT_COLLATE_NOCASE;\r
+ filter.offset = GL_GET_ALL_RECORDS;\r
+ filter.count = GL_GET_ALL_RECORDS;\r
+ filter.with_meta = true;\r
+ ad->uginfo.sort_type = filter.sort_type; // Media-svc: ORDER BY tag_name ASC;\r
+\r
+ err = _gl_local_data_get_tag_media_list(tag_id, &filter, &itemlist);\r
+ if ((err == 0) && (itemlist != NULL)) {\r
+ gl_media_s *item = NULL;\r
+ gl_item *gitem = NULL;\r
+ EINA_LIST_FREE(itemlist, item) {\r
+ if (item) {\r
+ gitem = _gl_data_util_calloc_gitem();\r
+ if (gitem == NULL) {\r
+ gl_dbgE("_gl_data_util_calloc_gitem() failed");\r
+ _gl_data_type_free_glitem((void **)&item);\r
+ continue;\r
+ }\r
+\r
+ gitem->ad = ad;\r
+ gitem->item = item;\r
+ ad->maininfo.medias_elist = eina_list_append(ad->maininfo.medias_elist, gitem);\r
+ item = NULL;\r
+ gitem = NULL;\r
+ }\r
+ }\r
+\r
+ if (elist)\r
+ *elist = ad->maininfo.medias_elist;\r
+\r
+ ad->maininfo.medias_cnt = eina_list_count(ad->maininfo.medias_elist);\r
+ } else {\r
+ ad->maininfo.medias_cnt = 0;\r
+ if (itemlist)\r
+ _gl_data_util_clear_gtype_item_list(&itemlist);\r
+ if (elist)\r
+ *elist = NULL;\r
+ }\r
+\r
+ //gl_dbg("DB all count : %d, ad->media_elist=%p", ad->media_cnt, ad->media_elist);\r
+ return err;\r
+}\r
+\r
+int _gl_data_get_first_several_tag_items(void *data, unsigned tag_id,\r
+ gl_item *items[], int *item_count)\r
+{\r
+ GL_CHECK_VAL(item_count, -1);\r
+ GL_CHECK_VAL(items, -1);\r
+ GL_CHECK_VAL(data, -1);\r
+ Eina_List *itemlist = NULL;\r
+ gl_media_s *item = NULL;\r
+ gl_item *gitem = NULL;\r
+ int result_cnt = 0;\r
+ int err = -1;\r
+\r
+ gl_filter_s filter;\r
+ memset(&filter,0x00,sizeof(gl_filter_s));\r
+ filter.sort_type = MEDIA_CONTENT_ORDER_ASC;\r
+ g_strlcpy(filter.sort_keyword, MEDIA_DISPLAY_NAME, KEYWORD_LENGTH);\r
+ filter.collate_type = MEDIA_CONTENT_COLLATE_NOCASE;\r
+ filter.offset = GL_FIRST_VIEW_START_POS;\r
+ filter.count = *item_count;\r
+ filter.with_meta = true;\r
+\r
+ //get a media items' list who are included to the same tag with 'tag_name'.\r
+ err = _gl_local_data_get_tag_media_list(tag_id, &filter, &itemlist);\r
+ if (err != 0 || itemlist == NULL) {\r
+ gl_dbg("Failed to get tag medias[%d]!", err);\r
+ *item_count = 0;\r
+ if (itemlist)\r
+ _gl_data_util_clear_gtype_item_list(&itemlist);\r
+ return -1;\r
+ }\r
+\r
+ EINA_LIST_FREE(itemlist, item) {\r
+ if (item == NULL) {\r
+ gl_dbgE("Invalid gl_media_s!");\r
+ continue;\r
+ }\r
+ result_cnt++;\r
+ if(result_cnt <= *item_count) {\r
+ gitem = NULL;\r
+ gitem = _gl_data_util_calloc_gitem();\r
+ if (gitem == NULL) {\r
+ gl_dbgE("_gl_data_util_calloc_gitem failed!");\r
+ _gl_data_type_free_glitem((void **)&item);\r
+ result_cnt--;\r
+ continue;\r
+ }\r
+ gitem->item = item;\r
+ items[result_cnt-1] = gitem;\r
+ } else {\r
+ _gl_data_type_free_glitem((void **)&item);\r
+ }\r
+ item = NULL;\r
+ }\r
+\r
+ if(*item_count > result_cnt)\r
+ *item_count = result_cnt;\r
+\r
+ //gl_dbg("count=%d", *item_count);\r
+ return 0;\r
+}\r
+/*\r
+* append tag to tags_selected_elist\r
+*/\r
+int _gl_data_tags_selected_list_append(void *data, gl_tag *gtag)\r
+{\r
+ GL_CHECK_VAL(gtag, -1);\r
+ GL_CHECK_VAL(gtag->tag, -1);\r
+ GL_CHECK_VAL(data, -1);\r
+ gl_appdata *ad = (gl_appdata *)data;\r
+\r
+ ad->taginfo.selected_tags_elist = eina_list_append(ad->taginfo.selected_tags_elist,\r
+ gtag);\r
+ _gl_data_util_check_tag_selected_files(data,\r
+ &(ad->selectedinfo.drms_cnt),\r
+ &(ad->selectedinfo.images_cnt),\r
+ &(ad->selectedinfo.sel_cnt));\r
+\r
+ return 0;\r
+}\r
+\r
+/*\r
+* append album to selected_albums_elist\r
+*/\r
+int _gl_data_albums_selected_list_append(void *data, gl_cluster *item)\r
+{\r
+ GL_CHECK_VAL(item, -1);\r
+ GL_CHECK_VAL(item->cluster, -1);\r
+ GL_CHECK_VAL(data, -1);\r
+ gl_appdata *ad = (gl_appdata *)data;\r
+ int drm_cnt = 0;\r
+ int img_cnt = 0;\r
+ int sel_cnt = 0;\r
+\r
+ _gl_data_util_check_album_selected_files(item, &drm_cnt, &img_cnt,\r
+ &sel_cnt);\r
+\r
+ ad->selectedinfo.images_cnt = ad->selectedinfo.images_cnt + img_cnt;\r
+ ad->selectedinfo.drms_cnt = ad->selectedinfo.drms_cnt + drm_cnt;\r
+ ad->selectedinfo.sel_cnt = ad->selectedinfo.sel_cnt + sel_cnt;\r
+ ad->albuminfo.selected_albums_elist = eina_list_append(ad->albuminfo.selected_albums_elist, item);\r
+\r
+ return 0;\r
+}\r
+\r
+/*\r
+* remove tag from tags_selected_elist\r
+*/\r
+int _gl_data_tags_selected_list_remove(void *data, gl_tag *gtag)\r
+{\r
+ GL_CHECK_VAL(gtag, -1);\r
+ GL_CHECK_VAL(gtag->tag, -1);\r
+ GL_CHECK_VAL(gtag->tag->tag_name, -1);\r
+ GL_CHECK_VAL(data, -1);\r
+ gl_appdata *ad = (gl_appdata *)data;\r
+ gl_tag *current = NULL;\r
+ Eina_List *l = NULL;\r
+\r
+ Eina_List *tags_list = ad->taginfo.selected_tags_elist;\r
+ EINA_LIST_FOREACH(tags_list, l, current)\r
+ {\r
+ if (!current || !current->tag) {\r
+ gl_dbg("NULL tag in selected list, continue...");\r
+ continue;\r
+ }\r
+ if (gtag->tag->_id == current->tag->_id) {\r
+ ad->taginfo.selected_tags_elist = eina_list_remove(ad->taginfo.selected_tags_elist,\r
+ current);\r
+ _gl_data_util_check_tag_selected_files(data,\r
+ &(ad->selectedinfo.drms_cnt),\r
+ &(ad->selectedinfo.images_cnt),\r
+ &(ad->selectedinfo.sel_cnt));\r
+ break;\r
+ }\r
+ current = NULL;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+/*\r
+* free tags_selected_elist\r
+*/\r
+int _gl_data_finalize_tags_selected_list(void *data)\r
+{\r
+ GL_CHECK_VAL(data, -1);\r
+ gl_appdata *ad = (gl_appdata *)data;\r
+ gl_tag *gtag = NULL;\r
+\r
+ Eina_List *tags_list = ad->taginfo.selected_tags_elist;\r
+ EINA_LIST_FREE(tags_list, gtag)\r
+ {\r
+ if (gtag)\r
+ gtag->checked = false;\r
+ }\r
+\r
+ ad->taginfo.selected_tags_elist = NULL;\r
+ return 0;\r
+}\r
+\r
+/*\r
+* return selected tags list count\r
+*/\r
+int _gl_data_get_tags_selected_cnt(void *data)\r
+{\r
+ GL_CHECK_VAL(data, -1);\r
+ gl_appdata *ad = (gl_appdata *)data;\r
+ if (ad->taginfo.selected_tags_elist)\r
+ {\r
+ return eina_list_count(ad->taginfo.selected_tags_elist);\r
+ }\r
+ else\r
+ {\r
+ return 0;\r
+ }\r
+}\r
+\r
+bool _gl_data_is_tags_selected_empty(void *data)\r
+{\r
+ GL_CHECK_VAL(data, 1);\r
+ gl_appdata *ad = (gl_appdata *)data;\r
+ gl_tag *gtag = NULL;\r
+\r
+ Eina_List *l = NULL;\r
+ EINA_LIST_FOREACH(ad->taginfo.selected_tags_elist, l, gtag) {\r
+ if (gtag && gtag->tag && gtag->tag->count)\r
+ return false;\r
+ gtag = NULL;\r
+ }\r
+\r
+ return true;\r
+}\r
+\r
+int _gl_data_get_tags_selected_files_path_str(void *data, gchar sep_c,\r
+ char **path_str, int *sel_cnt)\r
+{\r
+ GL_CHECK_VAL(path_str, -1);\r
+ GL_CHECK_VAL(data, -1);\r
+ gl_appdata *ad = (gl_appdata *)data;\r
+ GL_CHECK_VAL(ad->taginfo.selected_tags_elist, -1);\r
+ GString *selected_path_list = g_string_new(NULL);\r
+ gl_tag *gtag = NULL;\r
+ int selected_item_cnt = 0;\r
+ Eina_List *l = NULL;\r
+ int err = -1;\r
+ Eina_List *itemlist = NULL;\r
+\r
+ gl_filter_s filter;\r
+ memset(&filter,0x00,sizeof(gl_filter_s));\r
+ g_strlcpy(filter.cond, GL_CONDITION_IMAGE_VIDEO, CONDITION_LENGTH);\r
+ filter.sort_type = MEDIA_CONTENT_ORDER_ASC;\r
+ g_strlcpy(filter.sort_keyword, MEDIA_DISPLAY_NAME, KEYWORD_LENGTH);\r
+ filter.collate_type = MEDIA_CONTENT_COLLATE_NOCASE;\r
+ filter.offset = GL_GET_ALL_RECORDS;\r
+ filter.count = GL_GET_ALL_RECORDS;\r
+ filter.with_meta = true;\r
+\r
+ EINA_LIST_FOREACH(ad->taginfo.selected_tags_elist, l, gtag) {\r
+ if (gtag == NULL || gtag->tag == NULL ||\r
+ gtag->tag->tag_name == NULL) {\r
+ if (selected_path_list) {\r
+ g_string_free(selected_path_list, true);\r
+ selected_path_list = NULL;\r
+ }\r
+ return -1;\r
+ }\r
+\r
+ err = _gl_local_data_get_tag_media_list(gtag->tag->_id, &filter,\r
+ &itemlist);\r
+ if ((err == 0) && (itemlist != NULL)) {\r
+ gl_media_s *item = NULL;\r
+ EINA_LIST_FREE(itemlist, item) {\r
+ if (item == NULL || item->uuid == NULL) {\r
+ gl_dbgE("Invalid item!");\r
+ continue;\r
+ }\r
+\r
+ if (strstr(selected_path_list->str, item->file_url)) {\r
+ gl_dbgW("Already appended!");\r
+ continue;\r
+ }\r
+\r
+ selected_item_cnt++;\r
+ g_string_append(selected_path_list, item->file_url);\r
+ g_string_append_c(selected_path_list, sep_c);\r
+ item = NULL;\r
+ }\r
+ }\r
+ }\r
+ gl_dbg("Selected items count: %d.", selected_item_cnt);\r
+ if (sel_cnt)\r
+ *sel_cnt = selected_item_cnt;\r
+ int len = strlen(selected_path_list->str);\r
+ g_string_truncate(selected_path_list, len - 1);\r
+ /**\r
+ * Frees the memory allocated for the GString.\r
+ * If free_segment is true it also frees the character data.\r
+ * If it's false, the caller gains ownership of the buffer\r
+ * and must free it after use with g_free().\r
+ */\r
+ *path_str = g_string_free(selected_path_list, false);\r
+ GL_CHECK_VAL(*path_str, -1);\r
+ gl_dbg("Total string:\n\n\t>>@@:> %s <:@@<<\n", *path_str);\r
+ return 0;\r
+}\r
+\r
+/**\r
+* Get medias count of album or favourites tag.\r
+* b_favor, True: it's favourites tag, False: it's album.\r
+*/\r
+int _gl_data_get_item_cnt(void *data, const char *cluster_id, bool b_favor,\r
+ int album_type, int *item_cnt)\r
+{\r
+ GL_CHECK_VAL(item_cnt, -1);\r
+ GL_CHECK_VAL(data, -1);\r
+ int err = -1;\r
+ gl_dbg("cluster_id: %s, b_favor: %d.", cluster_id, b_favor);\r
+\r
+ gl_filter_s filter;\r
+ memset(&filter,0x00,sizeof(gl_filter_s));\r
+ g_strlcpy(filter.cond, GL_CONDITION_IMAGE_VIDEO, CONDITION_LENGTH);\r
+ filter.sort_type = MEDIA_CONTENT_ORDER_DESC;\r
+ g_strlcpy(filter.sort_keyword, MEDIA_MODIFIED_TIME, KEYWORD_LENGTH);\r
+ filter.collate_type = MEDIA_CONTENT_COLLATE_NOCASE;\r
+ filter.offset = GL_GET_ALL_RECORDS;\r
+ filter.count = GL_GET_ALL_RECORDS;\r
+ filter.with_meta = false;\r
+\r
+ if (b_favor) {\r
+ /* It's favourites tag */\r
+ g_strlcpy(filter.cond, GL_CONDITION_FAV_IMAGE_VIDEO,\r
+ CONDITION_LENGTH);\r
+ err = _gl_local_data_get_all_media_count(&filter, item_cnt);\r
+ } else {\r
+ GL_CHECK_VAL(cluster_id, -1);\r
+ if (album_type == GL_STORE_T_PHONE ||\r
+ album_type == GL_STORE_T_MMC) {\r
+ /*It's normal album*/\r
+ err = _gl_local_data_get_media_count(cluster_id, &filter,\r
+ item_cnt);\r
+ } else if (album_type == GL_STORE_T_ALL) {\r
+ /* All albums */\r
+ gl_dbg("All albums media count.");\r
+ err = _gl_local_data_get_all_media_count(&filter, item_cnt);\r
+ } else {\r
+ gl_dbgE("Invalid cluster_id!");\r
+ return -1;\r
+ }\r
+ }\r
+\r
+ if (err < 0) {\r
+ gl_dbg("Failed to get item count[err: %d]!", err);\r
+ return -1;\r
+ }\r
+\r
+ gl_dbg("Item count: %d.", *item_cnt);\r
+ return 0;\r
+}\r
+\r
+int _gl_data_update_item_cnt(gl_cluster *album)\r
+{\r
+ GL_CHECK_VAL(album, -1);\r
+ GL_CHECK_VAL(album->cluster, -1);\r
+ int item_count = 0;\r
+ int err = -1;\r
+ GL_CHECK_VAL(album->cluster->uuid, -1);\r
+ err = _gl_data_get_item_cnt(album->ad, album->cluster->uuid, false,\r
+ album->cluster->type, &item_count);\r
+ if (err != 0) {\r
+ gl_dbg("_gl_data_get_item_cnt failed!");\r
+ album->cluster->count = 0;\r
+ return -1;\r
+ }\r
+\r
+ gl_dbg("Media count: old=%d, new=%d", album->cluster->count,\r
+ item_count);\r
+ album->cluster->count = item_count;\r
+\r
+ return 0;\r
+}\r
+\r
+int _gl_data_get_item_list(void *data, gl_cate_type mode, gl_cluster *album,\r
+ int start_pos, int end_pos)\r
+{\r
+ GL_CHECK_VAL(data, -1);\r
+ gl_appdata *ad = (gl_appdata *)data;\r
+ Eina_List *itemlist = NULL;\r
+ int err = -1;\r
+ int store_type = GL_STORE_T_PHONE;\r
+ gl_filter_s filter;\r
+\r
+ memset(&filter, 0x00, sizeof(gl_filter_s));\r
+ g_strlcpy(filter.cond, GL_CONDITION_IMAGE_VIDEO, CONDITION_LENGTH);\r
+ filter.sort_type = MEDIA_CONTENT_ORDER_DESC;\r
+ g_strlcpy(filter.sort_keyword, MEDIA_MODIFIED_TIME, KEYWORD_LENGTH);\r
+ filter.collate_type = MEDIA_CONTENT_COLLATE_NOCASE;\r
+ filter.offset = start_pos;\r
+ filter.count = end_pos - start_pos + 1;\r
+ filter.with_meta = true;\r
+\r
+ /* get file-type from service when launched by appcontrol */\r
+ if (ad->albuminfo.aul_launch_type == GL_AUL_T_VIEW_ALBUM) {\r
+ if (ad->albuminfo.aul_file_type == GL_AUL_FILE_T_IMAGE) {\r
+ g_strlcpy(filter.cond, GL_CONDITION_IMAGE,\r
+ CONDITION_LENGTH);\r
+ } else if (ad->albuminfo.aul_file_type == GL_AUL_FILE_T_VIDEO) {\r
+ g_strlcpy(filter.cond, GL_CONDITION_VIDEO,\r
+ CONDITION_LENGTH);\r
+ }\r
+ }\r
+\r
+ if (mode == GL_CATEGORY_FOLDER) {\r
+ GL_CHECK_VAL(album, -1);\r
+ GL_CHECK_VAL(album->cluster, -1);\r
+ gl_dbg("db_get_item_list--folder category; start_pos[%d], end_pos[%d]\n",\r
+ start_pos, end_pos);\r
+\r
+ GL_CHECK_VAL(album->cluster->uuid, -1);\r
+ store_type = album->cluster->type;\r
+\r
+ /* Real album */\r
+ if (store_type == GL_STORE_T_PHONE ||\r
+ store_type == GL_STORE_T_MMC) {\r
+ ad->uginfo.sort_type = filter.sort_type;\r
+\r
+ if (start_pos == (GL_FIRST_VIEW_END_POS + 1) &&\r
+ end_pos == GL_GET_UNTIL_LAST_RECORD) {\r
+ /* Keep medias_elist and medias_cnt unchanged */\r
+ gl_dbg("Gridview append idler; Keep medias_elist unchanged.");\r
+ } else {\r
+ /*Clear item list before new one got */\r
+ _gl_data_clear_default_item_list(ad);\r
+ }\r
+ err = _gl_local_data_get_album_media_list(&filter,\r
+ album->cluster->uuid,\r
+ &itemlist);\r
+ } else if (store_type == GL_STORE_T_ALL) {\r
+ /* Get "All" album medias */\r
+ gl_dbg("db_get_item_list--all media\n");\r
+ ad->uginfo.sort_type = filter.sort_type;\r
+\r
+ if (start_pos == (GL_FIRST_VIEW_END_POS + 1) &&\r
+ end_pos == GL_GET_UNTIL_LAST_RECORD) {\r
+ /* Keep medias_elist and medias_cnt unchanged */\r
+ gl_dbg("Gridview append idler; Keep medias_elist unchanged.");\r
+ } else {\r
+ /* Clear item list before new one got */\r
+ _gl_data_clear_default_item_list(ad);\r
+ }\r
+\r
+ err = _gl_local_data_get_all_albums_media_list(&filter,\r
+ &itemlist);\r
+ } else {\r
+ gl_dbgE("Wrong cluster type!");\r
+ return -1;\r
+ }\r
+ } else if (mode == GL_CATEGORY_FAVORITES) {\r
+ _gl_data_clear_default_item_list(ad);\r
+\r
+ g_strlcpy(filter.cond, GL_CONDITION_FAV_IMAGE_VIDEO,\r
+ CONDITION_LENGTH);\r
+ filter.offset = GL_GET_ALL_RECORDS;\r
+ filter.count = GL_GET_ALL_RECORDS;\r
+ filter.with_meta = true;\r
+\r
+ ad->uginfo.sort_type = filter.sort_type;\r
+\r
+ err = _gl_local_data_get_all_albums_media_list(&filter,\r
+ &itemlist);\r
+ } else {\r
+ gl_dbg("View by: %d, undefined till now", mode);\r
+ }\r
+\r
+ gl_dbg("Error code: %d", err);\r
+ if ((err == 0) && (itemlist != NULL)) {\r
+ gl_media_s *item = NULL;\r
+ gl_item *gitem = NULL;\r
+ EINA_LIST_FREE(itemlist, item) {\r
+ if (item == NULL || item->uuid == NULL) {\r
+ gl_dbgE("Invalid item!");\r
+ continue;\r
+ }\r
+\r
+ gitem = _gl_data_util_calloc_gitem();\r
+ if (gitem == NULL) {\r
+ gl_dbgE("_gl_data_util_calloc_gitem failed!");\r
+ _gl_data_type_free_glitem((void **)&item);\r
+ continue;\r
+ }\r
+\r
+ gitem->ad = ad;\r
+ gitem->item = item;\r
+ gitem->store_type = store_type;\r
+ ad->maininfo.medias_elist = eina_list_append(ad->maininfo.medias_elist,\r
+ gitem);\r
+ item = NULL;\r
+ gitem = NULL;\r
+ }\r
+ ad->maininfo.medias_cnt = eina_list_count(ad->maininfo.medias_elist);\r
+ gl_dbg("View by: %d, ad->maininfo.medias_elist=%p", mode, ad->maininfo.medias_elist);\r
+ } else {\r
+ ad->maininfo.medias_cnt = 0;\r
+ if (start_pos == (GL_FIRST_VIEW_END_POS + 1) &&\r
+ end_pos == GL_GET_UNTIL_LAST_RECORD) {\r
+ /* Keep medias_elist and medias_cnt unchanged */\r
+ ad->maininfo.medias_cnt = eina_list_count(ad->maininfo.medias_elist);\r
+ gl_dbg("Gridview append idler; View by: %d, ad->maininfo.medias_elist=%p",\r
+ mode, ad->maininfo.medias_elist);\r
+ } else {\r
+ ad->maininfo.medias_elist = NULL;\r
+ }\r
+ if (itemlist)\r
+ _gl_data_util_clear_gtype_item_list(&itemlist);\r
+ }\r
+\r
+ gl_dbg("DB all count : %d", ad->maininfo.medias_cnt);\r
+ return err;\r
+}\r
+\r
+int _gl_data_update_item_list(void *data)\r
+{\r
+ GL_CHECK_VAL(data, -1);\r
+ gl_appdata *ad = (gl_appdata *)data;\r
+ Eina_List *itemlist = NULL;\r
+ int err = -1;\r
+ int view_mode = gl_get_view_mode(ad);\r
+ Eina_List *sel_id_list = NULL;\r
+ gl_item *gitem = NULL;\r
+ int store_type = GL_STORE_T_PHONE;\r
+ gl_filter_s filter;\r
+\r
+ memset(&filter, 0x00, sizeof(gl_filter_s));\r
+ g_strlcpy(filter.cond, GL_CONDITION_IMAGE_VIDEO, CONDITION_LENGTH);\r
+ filter.sort_type = MEDIA_CONTENT_ORDER_DESC;\r
+ g_strlcpy(filter.sort_keyword, MEDIA_MODIFIED_TIME, KEYWORD_LENGTH);\r
+ filter.collate_type = MEDIA_CONTENT_COLLATE_NOCASE;\r
+ filter.offset = GL_GET_ALL_RECORDS;\r
+ filter.count = GL_GET_ALL_RECORDS;\r
+ filter.with_meta = true;\r
+\r
+ if (view_mode == GL_VIEW_THUMBS_EDIT ||\r
+ view_mode == GL_VIEW_THUMBS_SELECT) {\r
+ gl_dbg("Edit view.");\r
+ /* Get ID list of selected items */\r
+ _gl_data_util_get_selected_item_id_list(ad, &sel_id_list);\r
+ /* Free old list */\r
+ _gl_data_selected_list_finalize(ad);\r
+ }\r
+\r
+ /* In albums tab, or album select view from tag, current album is available */\r
+ if (ad->ctrlinfo.tab_mode == GL_CTRL_TAB_ALBUMS ||\r
+ view_mode == GL_VIEW_THUMBS_SELECT) {\r
+ gl_cluster *cur_album = ad->albuminfo.current_album;\r
+ GL_CHECK_VAL(cur_album, -1);\r
+ GL_CHECK_VAL(cur_album->cluster, -1);\r
+ GL_CHECK_VAL(cur_album->cluster->uuid, -1);\r
+ store_type = cur_album->cluster->type;\r
+\r
+ ad->uginfo.sort_type = filter.sort_type;\r
+ /* Clear item list before new one got */\r
+ _gl_data_clear_default_item_list(ad);\r
+\r
+ if (store_type == GL_STORE_T_ALL) {\r
+ gl_dbg("All albums medias");\r
+ err = _gl_local_data_get_all_albums_media_list(&filter,\r
+ &itemlist);\r
+ } else {\r
+ gl_dbg("Local album medias");\r
+ err = _gl_local_data_get_album_media_list(&filter,\r
+ cur_album->cluster->uuid,\r
+ &itemlist);\r
+ }\r
+ } else if (ad->ctrlinfo.tab_mode == GL_CTRL_TAB_TAGS) {\r
+ /* Set current tag */\r
+ gl_tag *cur_tag = ad->taginfo.current_tag;\r
+ GL_CHECK_VAL(cur_tag, -1);\r
+ GL_CHECK_VAL(cur_tag->tag, -1);\r
+ /* get favorites tag */\r
+ if (cur_tag->tag->_id == GL_TAG_FAVORITES_ID) {\r
+ gl_dbg("Favourites tag medias");\r
+ /* Clear item list before new one got */\r
+ _gl_data_clear_default_item_list(ad);\r
+ g_strlcpy(filter.cond, GL_CONDITION_FAV_IMAGE_VIDEO,\r
+ CONDITION_LENGTH);\r
+\r
+ ad->uginfo.sort_type = filter.sort_type;\r
+\r
+ err = _gl_local_data_get_all_albums_media_list(&filter,\r
+ &itemlist);\r
+ } else {\r
+ gl_dbg("Normal tag medias");\r
+ _gl_data_clear_default_item_list(ad);\r
+ filter.sort_type = MEDIA_CONTENT_ORDER_ASC;\r
+ g_strlcpy(filter.sort_keyword, MEDIA_DISPLAY_NAME,\r
+ KEYWORD_LENGTH);\r
+ ad->uginfo.sort_type = filter.sort_type;\r
+\r
+ err = _gl_local_data_get_tag_media_list(cur_tag->tag->_id,\r
+ &filter,\r
+ &itemlist);\r
+ }\r
+ }\r
+\r
+ gl_dbg("Error code: %d", err);\r
+ if ((err != 0) || (itemlist == NULL)) {\r
+ gl_dbgE("(err != 0) || (itemlist == NULL)");\r
+ ad->maininfo.medias_cnt = 0;\r
+ ad->maininfo.medias_elist = NULL;\r
+ /* Clear list of selected ID */\r
+ if (sel_id_list) {\r
+ eina_list_free(sel_id_list);\r
+ sel_id_list = NULL;\r
+ }\r
+\r
+ if (itemlist)\r
+ _gl_data_util_clear_gtype_item_list(&itemlist);\r
+\r
+ return err;\r
+ }\r
+\r
+ bool b_selected = false;\r
+ gl_media_s *item = NULL;\r
+ Eina_List *medias_elist = NULL;\r
+ EINA_LIST_FREE(itemlist, item) {\r
+ if (item == NULL || item->uuid == NULL) {\r
+ gl_dbgE("Invalid item!");\r
+ continue;\r
+ }\r
+ gitem = _gl_data_util_calloc_gitem();\r
+ if (gitem == NULL) {\r
+ gl_dbgE("_gl_data_util_calloc_gitem failed!");\r
+ _gl_data_type_free_glitem((void **)&item);\r
+ continue;\r
+ }\r
+ gitem->ad = ad;\r
+ gitem->item = item;\r
+ gitem->store_type = store_type;\r
+\r
+ /* Append item to medias_elist */\r
+ medias_elist = eina_list_append(ad->maininfo.medias_elist,\r
+ gitem);\r
+ ad->maininfo.medias_elist = medias_elist;\r
+\r
+ if (sel_id_list) {\r
+ b_selected = _gl_data_util_check_selected_id(&sel_id_list,\r
+ item->uuid);\r
+ if (b_selected) {\r
+ b_selected = false;\r
+ /* Set checkbox state */\r
+ gitem->checked = true;\r
+ /* Append gitem to selected list */\r
+ _gl_data_selected_list_append(ad, gitem);\r
+ }\r
+ }\r
+ }\r
+\r
+ /* Clear list of selected ID */\r
+ if (sel_id_list)\r
+ _gl_data_util_free_selected_id_list(&sel_id_list);\r
+\r
+ ad->maininfo.medias_cnt = eina_list_count(ad->maininfo.medias_elist);\r
+ gl_dbg("All medias count:%d.", ad->maininfo.medias_cnt);\r
+ return err;\r
+}\r
+\r
+int _gl_data_get_item_list_without_tag(void *data, gl_cluster *album,\r
+ const char *tag_name, int start_pos,\r
+ int end_pos)\r
+{\r
+ GL_CHECK_VAL(tag_name, -1);\r
+ GL_CHECK_VAL(album, -1);\r
+ GL_CHECK_VAL(album->cluster, -1);\r
+ GL_CHECK_VAL(album->cluster->uuid, -1);\r
+ GL_CHECK_VAL(data, -1);\r
+ gl_appdata *ad = (gl_appdata *)data;\r
+ Eina_List *itemlist = NULL;\r
+ int err = -1;\r
+ gl_filter_s filter;\r
+\r
+ memset(&filter,0x00,sizeof(gl_filter_s));\r
+ if (ad->taginfo.current_tag && ad->taginfo.current_tag->tag &&\r
+ ad->taginfo.current_tag->tag->_id == GL_TAG_FAVORITES_ID)\r
+ g_strlcpy(filter.cond, GL_CONDITION_WITHOUT_FAVOURITE, CONDITION_LENGTH);\r
+ else\r
+ g_strlcpy(filter.cond, GL_CONDITION_IMAGE_VIDEO, CONDITION_LENGTH);\r
+ filter.sort_type = MEDIA_CONTENT_ORDER_DESC;\r
+ g_strlcpy(filter.sort_keyword, MEDIA_MODIFIED_TIME, KEYWORD_LENGTH);\r
+ filter.collate_type = MEDIA_CONTENT_COLLATE_NOCASE;\r
+ filter.offset = start_pos;\r
+ filter.count = end_pos - start_pos + 1;\r
+ filter.with_meta = true;\r
+\r
+ gl_dbg("tag_name[%s], start_pos[%d], end_pos[%d]", tag_name, start_pos,\r
+ end_pos);\r
+\r
+ /* Real album */\r
+ if (album->cluster->type == GL_STORE_T_PHONE ||\r
+ album->cluster->type == GL_STORE_T_MMC) {\r
+ if (start_pos == (GL_FIRST_VIEW_END_POS + 1) &&\r
+ end_pos == GL_GET_UNTIL_LAST_RECORD) {\r
+ /* Keep medias_elist and medias_cnt unchanged */\r
+ gl_dbg("Gridview append idler; Keep medias_elist unchanged.");\r
+ } else {\r
+ /*Clear item list before new one got */\r
+ _gl_data_clear_default_item_list(ad);\r
+ }\r
+\r
+ err = _gl_local_data_get_album_media_list_without_tag(&filter,\r
+ album->cluster->uuid,\r
+ tag_name,\r
+ &itemlist);\r
+ } else if (album->cluster->type == GL_STORE_T_ALL) {\r
+ /* All albums */\r
+ gl_dbg("All albums medias");\r
+ if (start_pos == (GL_FIRST_VIEW_END_POS + 1) &&\r
+ end_pos == GL_GET_UNTIL_LAST_RECORD) {\r
+ /* Keep medias_elist and medias_cnt unchanged */\r
+ gl_dbg("Gridview append idler; Keep medias_elist unchanged.");\r
+ } else {\r
+ /* Clear item list before new one got */\r
+ _gl_data_clear_default_item_list(ad);\r
+ }\r
+\r
+ err = _gl_local_data_get_all_albums_media_list_without_tag(&filter,\r
+ tag_name,\r
+ &itemlist);\r
+ } else {\r
+ gl_dbgE("Wrong album type!");\r
+ return -1;\r
+ }\r
+\r
+ gl_dbg("Error code: %d", err);\r
+ if ((err == 0) && (itemlist != NULL)) {\r
+ gl_media_s *item = NULL;\r
+ gl_item *gitem = NULL;\r
+ EINA_LIST_FREE(itemlist, item) {\r
+ if (item == NULL || item->uuid == NULL) {\r
+ gl_dbgE("Invalid item!");\r
+ continue;\r
+ }\r
+\r
+ gitem = _gl_data_util_calloc_gitem();\r
+ if (gitem == NULL) {\r
+ gl_dbgE("_gl_data_util_calloc_gitem failed!");\r
+ _gl_data_type_free_glitem((void **)&item);\r
+ continue;\r
+ }\r
+\r
+ gitem->ad = ad;\r
+ gitem->item = item;\r
+ gitem->store_type = album->cluster->type;\r
+ ad->maininfo.medias_elist = eina_list_append(ad->maininfo.medias_elist,\r
+ gitem);\r
+ item = NULL;\r
+ gitem = NULL;\r
+ }\r
+\r
+ ad->maininfo.medias_cnt = eina_list_count(ad->maininfo.medias_elist);\r
+ gl_dbg("medias_elist=%p", ad->maininfo.medias_elist);\r
+ } else {\r
+ ad->maininfo.medias_cnt = 0;\r
+ if (start_pos == (GL_FIRST_VIEW_END_POS + 1) &&\r
+ end_pos == GL_GET_UNTIL_LAST_RECORD) {\r
+ /* Keep medias_elist and medias_cnt unchanged */\r
+ ad->maininfo.medias_cnt = eina_list_count(ad->maininfo.medias_elist);\r
+ gl_dbg("Gridview append idler; medias_elist=%p",\r
+ ad->maininfo.medias_elist);\r
+ } else {\r
+ ad->maininfo.medias_elist = NULL;\r
+ }\r
+ if (itemlist)\r
+ _gl_data_util_clear_gtype_item_list(&itemlist);\r
+ }\r
+\r
+ gl_dbg("All count: %d", ad->maininfo.medias_cnt);\r
+ return err;\r
+}\r
+\r
+int _gl_data_update_item_list_without_tag(void *data, gl_cluster *album,\r
+ const char *tag_name)\r
+{\r
+ GL_CHECK_VAL(tag_name, -1);\r
+ GL_CHECK_VAL(album, -1);\r
+ GL_CHECK_VAL(album->cluster, -1);\r
+ GL_CHECK_VAL(album->cluster->uuid, -1);\r
+ GL_CHECK_VAL(data, -1);\r
+ gl_appdata *ad = (gl_appdata *)data;\r
+ Eina_List *itemlist = NULL;\r
+ int err = -1;\r
+ Eina_List *sel_id_list = NULL;\r
+ gl_item *gitem = NULL;\r
+ gl_filter_s filter;\r
+\r
+ memset(&filter, 0x00, sizeof(gl_filter_s));\r
+ g_strlcpy(filter.cond, GL_CONDITION_IMAGE_VIDEO, CONDITION_LENGTH);\r
+ filter.sort_type = MEDIA_CONTENT_ORDER_DESC;\r
+ g_strlcpy(filter.sort_keyword, MEDIA_MODIFIED_TIME, KEYWORD_LENGTH);\r
+ filter.collate_type = MEDIA_CONTENT_COLLATE_NOCASE;\r
+ filter.offset = GL_GET_ALL_RECORDS;\r
+ filter.count = GL_GET_ALL_RECORDS;\r
+ filter.with_meta = true;\r
+\r
+ /* Get ID list of selected items */\r
+ _gl_data_util_get_selected_item_id_list(ad, &sel_id_list);\r
+ /* Free old list */\r
+ _gl_data_selected_list_finalize(ad);\r
+\r
+ /* Clear item list before new one got */\r
+ _gl_data_clear_default_item_list(ad);\r
+\r
+ /* Real album */\r
+ if (album->cluster->type == GL_STORE_T_PHONE ||\r
+ album->cluster->type == GL_STORE_T_MMC) {\r
+ err = _gl_local_data_get_album_media_list_without_tag(&filter,\r
+ album->cluster->uuid,\r
+ tag_name,\r
+ &itemlist);\r
+ } else if (album->cluster->type == GL_STORE_T_ALL) {\r
+ /* All albums */\r
+ gl_dbg("All albums medias");\r
+ err = _gl_local_data_get_all_albums_media_list_without_tag(&filter,\r
+ tag_name,\r
+ &itemlist);\r
+ } else {\r
+ gl_dbgE("Wrong album type!");\r
+ return -1;\r
+ }\r
+\r
+ gl_dbg("Error code: %d", err);\r
+ if ((err != 0) || (itemlist == NULL)) {\r
+ gl_dbgE("(err != 0) || (itemlist == NULL)");\r
+ ad->maininfo.medias_cnt = 0;\r
+ ad->maininfo.medias_elist = NULL;\r
+ /* Clear list of selected ID */\r
+ if (sel_id_list) {\r
+ eina_list_free(sel_id_list);\r
+ sel_id_list = NULL;\r
+ }\r
+\r
+ if (itemlist)\r
+ _gl_data_util_clear_gtype_item_list(&itemlist);\r
+\r
+ return err;\r
+ }\r
+\r
+ bool b_selected = false;\r
+ gl_media_s *item = NULL;\r
+ Eina_List *medias_elist = NULL;\r
+ EINA_LIST_FREE(itemlist, item) {\r
+ if (item == NULL || item->uuid == NULL) {\r
+ gl_dbgE("Invalid item!");\r
+ continue;\r
+ }\r
+ gitem = _gl_data_util_calloc_gitem();\r
+ if (gitem == NULL) {\r
+ gl_dbgE("_gl_data_util_calloc_gitem failed!");\r
+ _gl_data_type_free_glitem((void **)&item);\r
+ continue;\r
+ }\r
+ gitem->ad = ad;\r
+ gitem->item = item;\r
+ gitem->store_type = album->cluster->type;\r
+\r
+ /* Append item to medias_elist */\r
+ medias_elist = eina_list_append(ad->maininfo.medias_elist,\r
+ gitem);\r
+ ad->maininfo.medias_elist = medias_elist;\r
+\r
+ if (sel_id_list) {\r
+ b_selected = _gl_data_util_check_selected_id(&sel_id_list,\r
+ item->uuid);\r
+ if (b_selected) {\r
+ b_selected = false;\r
+ /* Set checkbox state */\r
+ gitem->checked = true;\r
+ /* Append gitem to selected list */\r
+ _gl_data_selected_list_append(ad, gitem);\r
+ }\r
+ }\r
+ }\r
+\r
+ /* Clear list of selected ID */\r
+ if (sel_id_list)\r
+ _gl_data_util_free_selected_id_list(&sel_id_list);\r
+\r
+ ad->maininfo.medias_cnt = eina_list_count(ad->maininfo.medias_elist);\r
+ gl_dbg("All medias count:%d.", ad->maininfo.medias_cnt);\r
+ return err;\r
+}\r
+\r
+int _gl_data_get_first_several_favor_items(void *data, gl_item *items[],\r
+ int *item_count,\r
+ media_content_order_e sort_type)\r
+{\r
+ GL_CHECK_VAL(items, -1);\r
+ GL_CHECK_VAL(item_count, -1);\r
+ GL_CHECK_VAL(data, -1);\r
+ Eina_List *itemlist = NULL;\r
+ gl_media_s *item = NULL;\r
+ gl_item *gitem = NULL;\r
+ int result_cnt = 0;\r
+ int err = -1;\r
+ //gl_dbg("");\r
+\r
+ gl_filter_s filter;\r
+ memset(&filter, 0x00, sizeof(gl_filter_s));\r
+ g_strlcpy(filter.cond, GL_CONDITION_FAV_IMAGE_VIDEO, CONDITION_LENGTH);\r
+ filter.sort_type = sort_type;\r
+ g_strlcpy(filter.sort_keyword, MEDIA_MODIFIED_TIME, KEYWORD_LENGTH);\r
+ filter.collate_type = MEDIA_CONTENT_COLLATE_NOCASE;\r
+ filter.offset = GL_FIRST_VIEW_START_POS;\r
+ filter.count = *item_count;\r
+ filter.with_meta = false;\r
+\r
+ err = _gl_local_data_get_all_albums_media_list(&filter, &itemlist);\r
+ if (err != 0 || itemlist == NULL) {\r
+ gl_dbg("Failed to get all medias[%d]!", err);\r
+ *item_count = 0;\r
+ if (itemlist)\r
+ _gl_data_util_clear_gtype_item_list(&itemlist);\r
+ return -1;\r
+ }\r
+\r
+ EINA_LIST_FREE(itemlist, item) {\r
+ if (item == NULL) {\r
+ gl_dbgE("Invalid gl_media_s!");\r
+ continue;\r
+ }\r
+ result_cnt++;\r
+ if(result_cnt <= *item_count) {\r
+ gitem = NULL;\r
+ gitem = _gl_data_util_calloc_gitem();\r
+ if (gitem == NULL) {\r
+ gl_dbgE("_gl_data_util_calloc_gitem failed!");\r
+ _gl_data_type_free_glitem((void **)&item);\r
+ result_cnt--;\r
+ continue;\r
+ }\r
+ gitem->item = item;\r
+ items[result_cnt-1] = gitem;\r
+ } else {\r
+ _gl_data_type_free_glitem((void **)&item);\r
+ }\r
+ item = NULL;\r
+ }\r
+\r
+ if(*item_count > result_cnt)\r
+ *item_count = result_cnt;\r
+\r
+ //gl_dbg("count=%d", *item_count);\r
+ return 0;\r
+}\r
+\r
+int _gl_data_get_first_several_items(gl_cluster *album, gl_item *items[],\r
+ int *item_count,\r
+ media_content_order_e sort_type)\r
+{\r
+ GL_CHECK_VAL(items, -1);\r
+ GL_CHECK_VAL(item_count, -1);\r
+ GL_CHECK_VAL(album, -1);\r
+ GL_CHECK_VAL(album->cluster, -1);\r
+ GL_CHECK_VAL(album->cluster->uuid, -1);\r
+ GL_CHECK_VAL(album->ad, -1);\r
+ gl_appdata *ad = (gl_appdata *)album->ad;\r
+ Eina_List *item_list = NULL;\r
+ int result_cnt = 0;\r
+ gl_media_s *item = NULL;\r
+ gl_item *gitem = NULL;\r
+ int err = -1;\r
+\r
+ if (*item_count <= 0)\r
+ return 0;\r
+\r
+ gl_filter_s filter;\r
+ memset(&filter, 0x00, sizeof(gl_filter_s));\r
+ if (ad->taginfo.current_tag && ad->taginfo.current_tag->tag) {\r
+ if (ad->taginfo.current_tag->tag->_id == GL_TAG_FAVORITES_ID)\r
+ g_strlcpy(filter.cond, GL_CONDITION_WITHOUT_FAVOURITE,\r
+ CONDITION_LENGTH);\r
+ else\r
+ snprintf(filter.cond, CONDITION_LENGTH,\r
+ GL_CONDITION_WITHOUT_TAG,\r
+ ad->taginfo.current_tag->tag->_id);\r
+ } else {\r
+ g_strlcpy(filter.cond, GL_CONDITION_IMAGE_VIDEO, CONDITION_LENGTH);\r
+ }\r
+ filter.sort_type = sort_type;\r
+ g_strlcpy(filter.sort_keyword, MEDIA_MODIFIED_TIME, KEYWORD_LENGTH);\r
+ filter.collate_type = MEDIA_CONTENT_COLLATE_NOCASE;\r
+ filter.offset = GL_FIRST_VIEW_START_POS;\r
+ filter.count = *item_count;\r
+ filter.with_meta = false;\r
+\r
+ if (album->cluster->type == GL_STORE_T_PHONE ||\r
+ album->cluster->type == GL_STORE_T_MMC) {\r
+ /* real album */\r
+ err = _gl_local_data_get_album_media_list(&filter,\r
+ album->cluster->uuid,\r
+ &item_list);\r
+ if (err != 0 || item_list == NULL) {\r
+ gl_dbgE("Get album medias failed[%d]", err);\r
+ *item_count = 0;\r
+ if (item_list)\r
+ _gl_data_util_clear_gtype_item_list(&item_list);\r
+ return -1;\r
+ }\r
+\r
+ EINA_LIST_FREE(item_list, item) {\r
+ if (item == NULL) {\r
+ gl_dbgE("Invalid gl_media_s!");\r
+ continue;\r
+ }\r
+ result_cnt++;\r
+ if(result_cnt <= *item_count) {\r
+ gitem = NULL;\r
+ gitem = _gl_data_util_calloc_gitem();\r
+ if (gitem == NULL) {\r
+ gl_dbgE("_gl_data_util_calloc_gitem failed!");\r
+ _gl_data_type_free_glitem((void **)&item);\r
+ result_cnt--;\r
+ continue;\r
+ }\r
+ gitem->item = item;\r
+ items[result_cnt-1] = gitem;\r
+ } else {\r
+ _gl_data_type_free_glitem((void **)&item);\r
+ }\r
+ item = NULL;\r
+ }\r
+\r
+ if(*item_count > result_cnt)\r
+ *item_count = result_cnt;\r
+ } else if (album->cluster->type == GL_STORE_T_ALL) {\r
+ /* add "All" album */\r
+ gl_dbg("db_get_item_list--all media\n");\r
+ /* use new api to get all local files, mmc status checking would be done in new apis */\r
+ err = _gl_local_data_get_all_albums_media_list(&filter,\r
+ &item_list);\r
+ if (err != 0 || item_list == NULL) {\r
+ gl_dbgE("Failed to get all medias[%d]!", err);\r
+ *item_count = 0;\r
+ if (item_list)\r
+ _gl_data_util_clear_gtype_item_list(&item_list);\r
+\r
+ return -1;\r
+ }\r
+\r
+ EINA_LIST_FREE(item_list, item) {\r
+ if (item == NULL) {\r
+ gl_dbgE("Invalid gl_media_s!");\r
+ continue;\r
+ }\r
+ result_cnt++;\r
+ if(result_cnt <= *item_count) {\r
+ gitem = NULL;\r
+ gitem = _gl_data_util_calloc_gitem();\r
+ if (gitem == NULL) {\r
+ gl_dbgE("_gl_data_util_calloc_gitem failed!");\r
+ _gl_data_type_free_glitem((void **)&item);\r
+ result_cnt--;\r
+ continue;\r
+ }\r
+ gitem->item = item;\r
+ gitem->store_type = album->cluster->type;\r
+ items[result_cnt-1] = gitem;\r
+ } else {\r
+ _gl_data_type_free_glitem((void **)&item);\r
+ }\r
+ item = NULL;\r
+ }\r
+\r
+ if(*item_count > result_cnt)\r
+ *item_count = result_cnt;\r
+ } else {\r
+ gl_dbgE("Wrong cluster type!");\r
+ return -1;\r
+ }\r
+\r
+ if (*item_count) {\r
+ gl_dbg("first %d items for this album(%s)",\r
+ *item_count, album->cluster->display_name);\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+bool _gl_data_is_item_cnt_zero(void *data, media_content_type_e type)\r
+{\r
+ GL_CHECK_VAL(data, false);\r
+ gl_appdata *ad = (gl_appdata *)data;\r
+ int i = 0;\r
+ gl_item *gitem = NULL;\r
+\r
+ /* Get all medias count of current album */\r
+ int all_cnt = ad->maininfo.medias_cnt;\r
+ for (i = 1; i <= all_cnt; i++) {\r
+ _gl_data_get_item_by_index(ad, i, false, &gitem);\r
+ if (gitem && gitem->item) {\r
+ if (gitem->item->type == type) {\r
+ return false;\r
+ }\r
+ }\r
+ }\r
+\r
+ gl_dbg(" item_cnt = 0 ");\r
+ return true;\r
+}\r
+\r
+int _gl_data_get_first_item(void *data, media_content_type_e type,\r
+ gl_item **fitem, bool b_selected)\r
+{\r
+ GL_CHECK_VAL(data, -1);\r
+ gl_appdata *ad = (gl_appdata *)data;\r
+ int i = 0;\r
+ gl_item *gitem = NULL;\r
+\r
+ /* Get first item for 'All' */\r
+ if (type == MEDIA_CONTENT_TYPE_OTHERS) {\r
+ _gl_data_get_item_by_index(ad, 1, b_selected, &gitem);\r
+ *fitem = gitem;\r
+ return 0;\r
+ }\r
+\r
+ /* Get first item for "Images" or "Videos" */\r
+ for (i = 1; i <= ad->maininfo.medias_cnt; i++) {\r
+ _gl_data_get_item_by_index(ad, i, b_selected, &gitem);\r
+ if (gitem && gitem->item && gitem->item->type == type) {\r
+ *fitem = gitem;\r
+ return 0;\r
+ }\r
+ }\r
+\r
+ gl_dbgW("Not found!");\r
+ return -1;\r
+}\r
+\r
+int _gl_data_destroy_item(gl_item *gitem)\r
+{\r
+ GL_CHECK_VAL(gitem, -1);\r
+ GL_CHECK_VAL(gitem->item, -1);\r
+ _gl_data_util_free_gitem(gitem);\r
+ return 0;\r
+}\r
+\r
+/**\r
+* select_mode: true, get item from selected_media_elist; false, get item from media_elist.\r
+*/\r
+int _gl_data_get_item_by_index(void *data, int idx, bool select_mode,\r
+ gl_item **gitem)\r
+{\r
+ GL_CHECK_VAL(data, -1);\r
+ gl_appdata *ad = (gl_appdata *)data;\r
+\r
+ if (!select_mode) {\r
+ if (idx > ad->maininfo.medias_cnt) {\r
+ gl_dbg("db_get_item_by_index(%d) is failed, ad->maininfo.medias_cnt=%d\n",\r
+ idx, ad->maininfo.medias_cnt); //test\r
+ *gitem = NULL;\r
+ return -1;\r
+ }\r
+\r
+ *gitem = eina_list_nth(ad->maininfo.medias_elist, idx - 1);\r
+ } else {\r
+ Eina_List *sel_list = ad->selectedinfo.medias_elist;\r
+ *gitem = (gl_item *) eina_list_nth(sel_list, --idx);\r
+ }\r
+ return 0;\r
+}\r
+\r
+int _gl_data_get_orig_item_by_index(void *data, gl_item **gitem, int idx)\r
+{\r
+ GL_CHECK_VAL(data, -1);\r
+ gl_appdata *ad = (gl_appdata *)data;\r
+\r
+ if (idx > ad->maininfo.medias_cnt)\r
+ {\r
+ gl_dbg("_gl_data_get_orig_item_by_index(%d) is failed(>media_cnt-%d)\n",\r
+ idx, ad->maininfo.medias_cnt); //test\r
+ *gitem = NULL;\r
+ return -1;\r
+ }\r
+\r
+ *gitem = eina_list_nth(ad->maininfo.medias_elist, idx - 1);\r
+\r
+ return 0;\r
+}\r
+\r
+int _gl_data_item_list_remove(void *data, gl_item *gitem)\r
+{\r
+ GL_CHECK_VAL(gitem, -1);\r
+ GL_CHECK_VAL(gitem->item, -1);\r
+ GL_CHECK_VAL(gitem->item->uuid, -1);\r
+ GL_CHECK_VAL(data, -1);\r
+ gl_appdata *ad = (gl_appdata *)data;\r
+ gl_item *current = NULL;\r
+ Eina_List *l = NULL;\r
+\r
+ Eina_List *media_elist = ad->maininfo.medias_elist;\r
+ EINA_LIST_FOREACH(media_elist, l, current) {\r
+ if (current == NULL || current->item == NULL ||\r
+ current->item->uuid == NULL) {\r
+ gl_dbgE("Invalid gitem!");\r
+ continue;\r
+ }\r
+\r
+ if (!g_strcmp0(current->item->uuid, gitem->item->uuid)) {\r
+ ad->maininfo.medias_elist = eina_list_remove(ad->maininfo.medias_elist,\r
+ current);\r
+ ad->maininfo.medias_cnt--;\r
+ _gl_data_destroy_item(current);\r
+ break;\r
+ }\r
+ current = NULL;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+/* Remove file from DB and file system */\r
+int _gl_data_remove_item(gl_item *gitem)\r
+{\r
+ GL_CHECK_VAL(gitem, -1);\r
+ GL_CHECK_VAL(gitem->item, -1);\r
+ GL_CHECK_VAL(gitem->item->uuid, -1);\r
+ int ret = -1;\r
+\r
+ /* Delete record from DB then delete media from file system */\r
+ ret = media_info_delete_from_db(gitem->item->uuid);\r
+ if (ret != 0) {\r
+ gl_dbgE("media_info_delete_from_db failed[%d]!", ret);\r
+ return -1;\r
+ }\r
+\r
+ if (!ecore_file_unlink(gitem->item->file_url)) {\r
+ char *error_msg = calloc(1, GL_ARRAY_LEN_MAX);\r
+ GL_CHECK_VAL(error_msg, -1);\r
+ gl_dbgE("ecore_file_unlink failed[Err:%s]!",\r
+ strerror_r(errno, error_msg, GL_ARRAY_LEN_MAX));\r
+ GL_FREE(error_msg);\r
+ return -1;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+gl_item *_gl_data_selected_list_get_nth(void *data, int idx)\r
+{\r
+ GL_CHECK_NULL(data);\r
+ gl_appdata *ad = (gl_appdata *)data;\r
+\r
+ return eina_list_nth(ad->selectedinfo.medias_elist, idx);\r
+}\r
+\r
+int _gl_data_selected_list_append(void *data, gl_item *gitem)\r
+{\r
+ GL_CHECK_VAL(gitem, -1);\r
+ GL_CHECK_VAL(gitem->item, -1);\r
+ GL_CHECK_VAL(data, -1);\r
+ gl_appdata *ad = (gl_appdata *)data;\r
+\r
+ /* Update selected images count */\r
+ if (gitem->item->type == MEDIA_CONTENT_TYPE_IMAGE) {\r
+ ad->selectedinfo.images_cnt++;\r
+#ifdef _USE_ROTATE_BG\r
+ gl_dbg("Ext: %s", gitem->item->ext);\r
+ if (gitem->item->ext &&\r
+ !strcasecmp(gitem->item->ext, GL_JPEG_FILE_EXT)) {\r
+ unsigned int orientation = 1;\r
+ if(_gl_exif_get_orientation(gitem->item->file_url, &orientation) == 0)\r
+ ad->selectedinfo.jpeg_cnt++;\r
+ }\r
+#endif\r
+ }\r
+\r
+ /* Update selected DRM files count */\r
+ if (gl_drm_is_drm_file(gitem->item->file_url))\r
+ ad->selectedinfo.drms_cnt++;\r
+\r
+ Eina_List *sel_list = ad->selectedinfo.medias_elist;\r
+ sel_list = eina_list_append(sel_list, gitem);\r
+ ad->selectedinfo.medias_elist = sel_list;\r
+ return 0;\r
+}\r
+\r
+int _gl_data_selected_list_remove(void *data, gl_item *gitem)\r
+{\r
+ GL_CHECK_VAL(gitem, -1);\r
+ GL_CHECK_VAL(gitem->item, -1);\r
+ GL_CHECK_VAL(gitem->item->uuid, -1);\r
+ GL_CHECK_VAL(data, -1);\r
+ gl_appdata *ad = (gl_appdata *)data;\r
+ gl_item *current = NULL;\r
+ Eina_List *l = NULL;\r
+\r
+ Eina_List *sel_list = ad->selectedinfo.medias_elist;\r
+ EINA_LIST_FOREACH(sel_list, l, current) {\r
+ if (current == NULL || current->item == NULL ||\r
+ current->item->uuid == NULL) {\r
+ gl_dbgE("Invalid gitem!");\r
+ continue;\r
+ }\r
+ if (!g_strcmp0(current->item->uuid, gitem->item->uuid)) {\r
+ /* Update selected images count */\r
+ if (current->item->type == MEDIA_CONTENT_TYPE_IMAGE &&\r
+ ad->selectedinfo.images_cnt > 0) {\r
+ ad->selectedinfo.images_cnt--;\r
+#ifdef _USE_ROTATE_BG\r
+ if (gitem->item->ext &&\r
+ !strcasecmp(gitem->item->ext,GL_JPEG_FILE_EXT) &&\r
+ ad->selectedinfo.jpeg_cnt > 0) {\r
+ unsigned int orientation = 1;\r
+ if(_gl_exif_get_orientation(gitem->item->file_url, &orientation) == 0)\r
+ ad->selectedinfo.jpeg_cnt--;\r
+ }\r
+#endif\r
+ }\r
+\r
+ /* Update selected DRM files count */\r
+ if (gl_drm_is_drm_file(gitem->item->file_url) &&\r
+ ad->selectedinfo.drms_cnt > 0)\r
+ ad->selectedinfo.drms_cnt--;\r
+\r
+ sel_list = eina_list_remove(sel_list, current);\r
+ ad->selectedinfo.medias_elist = sel_list;\r
+ break;\r
+ }\r
+ current = NULL;\r
+ }\r
+ return 0;\r
+}\r
+\r
+int _gl_data_selected_list_finalize(void *data)\r
+{\r
+ GL_CHECK_VAL(data, -1);\r
+ gl_appdata *ad = (gl_appdata *)data;\r
+ gl_item *gitem = NULL;\r
+\r
+ Eina_List *sel_list = ad->selectedinfo.medias_elist;\r
+ EINA_LIST_FREE(sel_list, gitem) {\r
+ if (gitem)\r
+ gitem->checked = false;\r
+ }\r
+\r
+ ad->selectedinfo.medias_elist = NULL;\r
+ ad->selectedinfo.images_cnt = 0;\r
+ ad->selectedinfo.drms_cnt = 0;\r
+#ifdef _USE_ROTATE_BG\r
+ ad->selectedinfo.jpeg_cnt = 0;\r
+#endif\r
+ return 0;\r
+}\r
+\r
+int _gl_data_selected_list_count(void *data)\r
+{\r
+ GL_CHECK_VAL(data, -1);\r
+ gl_appdata *ad = (gl_appdata *)data;\r
+\r
+ return eina_list_count(ad->selectedinfo.medias_elist);\r
+}\r
+\r
+bool _gl_data_is_root_path(const char *path)\r
+{\r
+ if (path == NULL)\r
+ return false;\r
+\r
+ if (!g_strcmp0(GL_ROOT_PATH_PHONE, path) ||\r
+ !g_strcmp0(GL_ROOT_PATH_MMC, path)) {\r
+ gl_dbg("Root path: %s", path);\r
+ return true;\r
+ }\r
+\r
+ return false;\r
+}\r
+\r
+bool _gl_data_is_albums_selected_empty(void *data)\r
+{\r
+ GL_CHECK_VAL(data, 1);\r
+ gl_appdata *ad = (gl_appdata *)data;\r
+ gl_cluster *album = NULL;\r
+\r
+ Eina_List *l = NULL;\r
+ EINA_LIST_FOREACH(ad->albuminfo.selected_albums_elist, l, album) {\r
+ if (album && album->cluster && album->cluster->count)\r
+ return false;\r
+ album = NULL;\r
+ }\r
+\r
+ return true;\r
+}\r
+\r
+/**\r
+ * If 'All albums' selected for share, only append files contained in 'All albums';\r
+ * If both local albums and web albums selected, 'Share' item should be disabled.\r
+ */\r
+int _gl_data_get_albums_selected_files_path_str(void *data, gchar sep_c,\r
+ char **path_str, int *sel_cnt)\r
+{\r
+ GL_CHECK_VAL(path_str, -1);\r
+ GL_CHECK_VAL(data, -1);\r
+ gl_appdata *ad = (gl_appdata *)data;\r
+ GL_CHECK_VAL(ad->albuminfo.selected_albums_elist, -1);\r
+ GString *selected_path_list = g_string_new(NULL);\r
+ gl_cluster *album = NULL;\r
+ int selected_item_cnt = 0;\r
+ Eina_List *l = NULL;\r
+ int err = -1;\r
+ Eina_List *itemlist = NULL;\r
+\r
+ gl_filter_s filter;\r
+ memset(&filter, 0x00, sizeof(gl_filter_s));\r
+ g_strlcpy(filter.cond, GL_CONDITION_IMAGE_VIDEO, CONDITION_LENGTH);\r
+ filter.sort_type = MEDIA_CONTENT_ORDER_DESC;\r
+ g_strlcpy(filter.sort_keyword, MEDIA_MODIFIED_TIME, KEYWORD_LENGTH);\r
+ filter.collate_type = MEDIA_CONTENT_COLLATE_NOCASE;\r
+ filter.offset = GL_GET_ALL_RECORDS;\r
+ filter.count = GL_GET_ALL_RECORDS;\r
+ filter.with_meta = false;\r
+\r
+ EINA_LIST_FOREACH(ad->albuminfo.selected_albums_elist, l, album) {\r
+ if (album == NULL || album->cluster == NULL ||\r
+ album->cluster->uuid == NULL) {\r
+ if (selected_path_list) {\r
+ g_string_free(selected_path_list, true);\r
+ selected_path_list = NULL;\r
+ }\r
+ return -1;\r
+ }\r
+ if (album->cluster->type == GL_STORE_T_ALL) {\r
+ gl_dbg("All albums");\r
+ err = _gl_local_data_get_all_albums_media_list(&filter,\r
+ &itemlist);\r
+ /**\r
+ *Clear previous appended path,\r
+ * replaced with All albums content\r
+ */\r
+ if (selected_path_list && selected_path_list->str) {\r
+ gl_dbgW("Free previous path string!");\r
+ g_string_free(selected_path_list, true);\r
+ selected_path_list = g_string_new(NULL);\r
+ selected_item_cnt = 0;\r
+ }\r
+ } else if (album->cluster->type == GL_STORE_T_PHONE ||\r
+ album->cluster->type == GL_STORE_T_MMC) {\r
+ gl_dbg("Local album");\r
+ err = _gl_local_data_get_album_media_list(&filter,\r
+ album->cluster->uuid,\r
+ &itemlist);\r
+ } else {\r
+ gl_dbgE("Wrong cluster type!");\r
+ return -1;\r
+ }\r
+\r
+ if ((err == 0) && (itemlist != NULL)) {\r
+ gl_media_s *item = NULL;\r
+ EINA_LIST_FREE(itemlist, item) {\r
+ if (item == NULL || item->uuid == NULL) {\r
+ gl_dbgE("Invalid item!");\r
+ continue;\r
+ }\r
+\r
+ selected_item_cnt++;\r
+ g_string_append(selected_path_list, item->file_url);\r
+ g_string_append_c(selected_path_list, sep_c);\r
+ item = NULL;\r
+ }\r
+\r
+ /* Break for look if 'All albums' appended */\r
+ if (album->cluster->type == GL_STORE_T_ALL) {\r
+ gl_dbg("Appent All albums content.");\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ gl_dbg("Selected items count: %d.", selected_item_cnt);\r
+ if (sel_cnt)\r
+ *sel_cnt = selected_item_cnt;\r
+ int len = strlen(selected_path_list->str);\r
+ g_string_truncate(selected_path_list, len - 1);\r
+ /**\r
+ * Frees the memory allocated for the GString.\r
+ * If free_segment is true it also frees the character data.\r
+ * If it's false, the caller gains ownership of the buffer\r
+ * and must free it after use with g_free().\r
+ */\r
+ *path_str = g_string_free(selected_path_list, false);\r
+ GL_CHECK_VAL(*path_str, -1);\r
+ gl_dbg("Total string:\n\n\t>>@@:> %s <:@@<<\n", *path_str);\r
+ return 0;\r
+}\r
+\r
+int _gl_data_get_albums_selected_cnt(void *data)\r
+{\r
+ GL_CHECK_VAL(data, -1);\r
+ gl_appdata *ad = (gl_appdata *)data;\r
+\r
+ return eina_list_count(ad->albuminfo.selected_albums_elist);\r
+}\r
+\r
+int _gl_data_albums_selected_list_remove(void *data, gl_cluster *item)\r
+{\r
+ GL_CHECK_VAL(item, -1);\r
+ GL_CHECK_VAL(item->cluster, -1);\r
+ GL_CHECK_VAL(item->cluster->uuid, -1);\r
+ GL_CHECK_VAL(data, -1);\r
+ gl_appdata *ad = (gl_appdata *)data;\r
+ gl_cluster *current = NULL;\r
+ Eina_List *l = NULL;\r
+\r
+ Eina_List *sel_list = ad->albuminfo.selected_albums_elist;\r
+ EINA_LIST_FOREACH(sel_list, l, current) {\r
+ if (current == NULL || current->cluster == NULL ||\r
+ current->cluster->uuid == NULL) {\r
+ gl_dbgE("Invalid gcluster!");\r
+ continue;\r
+ }\r
+\r
+ if (!g_strcmp0(current->cluster->uuid, item->cluster->uuid)) {\r
+ int drm_cnt = 0;\r
+ int img_cnt = 0;\r
+ int sel_cnt = 0;\r
+\r
+ _gl_data_util_check_album_selected_files(item, &drm_cnt,\r
+ &img_cnt,\r
+ &sel_cnt);\r
+\r
+ ad->selectedinfo.images_cnt = ad->selectedinfo.images_cnt - img_cnt;\r
+ ad->selectedinfo.drms_cnt = ad->selectedinfo.drms_cnt - drm_cnt;\r
+ ad->selectedinfo.sel_cnt = ad->selectedinfo.sel_cnt - sel_cnt;\r
+\r
+ ad->albuminfo.selected_albums_elist = eina_list_remove(ad->albuminfo.selected_albums_elist,\r
+ current);\r
+ break;\r
+ }\r
+ current = NULL;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+int _gl_data_finalize_albums_selected_list(void *data)\r
+{\r
+ GL_CHECK_VAL(data, -1);\r
+ gl_appdata *ad = (gl_appdata *)data;\r
+ gl_cluster *item = NULL;\r
+\r
+ Eina_List *sel_list = ad->albuminfo.selected_albums_elist;\r
+ EINA_LIST_FREE(sel_list, item) {\r
+ if (item)\r
+ item->checked = false;\r
+ }\r
+\r
+ ad->selectedinfo.images_cnt = 0;\r
+ ad->selectedinfo.drms_cnt = 0;\r
+ ad->selectedinfo.sel_cnt = 0;\r
+ ad->albuminfo.selected_albums_elist = NULL;\r
+ return 0;\r
+}\r
+\r
+bool _gl_data_check_update(void *data, bool b_all)\r
+{\r
+ GL_CHECK_FALSE(data);\r
+ gl_appdata *ad = (gl_appdata *)data;\r
+ int err = -1;\r
+ Eina_List *item_list = NULL;\r
+ gl_media_s *mitem = NULL;\r
+ int cnt = 0;\r
+ gl_item *gitem = NULL;\r
+\r
+ gl_filter_s filter;\r
+ memset(&filter, 0x00, sizeof(gl_filter_s));\r
+ g_strlcpy(filter.cond, GL_CONDITION_IMAGE_VIDEO, CONDITION_LENGTH);\r
+ filter.sort_type = MEDIA_CONTENT_ORDER_DESC;\r
+ g_strlcpy(filter.sort_keyword, MEDIA_MODIFIED_TIME, KEYWORD_LENGTH);\r
+ filter.collate_type = MEDIA_CONTENT_COLLATE_NOCASE;\r
+ filter.with_meta = false;\r
+ filter.offset = GL_FIRST_VIEW_START_POS;\r
+ filter.count = GL_GET_ONE_RECORDS;\r
+\r
+ if (b_all) {\r
+ /* Get latest item */\r
+ err = _gl_local_data_get_all_albums_media_list(&filter,\r
+ &item_list);\r
+ if (err != 0 || item_list == NULL)\r
+ goto DB_NEED_UPDATE;\r
+\r
+ mitem = eina_list_nth(item_list, 0);\r
+ /* Compare modified time */\r
+ if (mitem == NULL || mitem->mtime != ad->maininfo.last_mtime)\r
+ goto DB_NEED_UPDATE;\r
+\r
+ /* Get all medias count */\r
+ err = _gl_data_get_item_cnt(ad, GL_ALBUM_ALL_ID, false,\r
+ GL_STORE_T_ALL, &cnt);\r
+ if (err != 0)\r
+ goto DB_NEED_UPDATE;\r
+\r
+ /* Compare medias count */\r
+ if (cnt != ad->maininfo.all_medias_cnt)\r
+ goto DB_NEED_UPDATE;\r
+ } else {\r
+ if (ad->ctrlinfo.tab_mode == GL_CTRL_TAB_TAGS) {\r
+ gl_tag *cur_tag = ad->taginfo.current_tag;\r
+ if (cur_tag == NULL || cur_tag->tag == NULL)\r
+ goto DB_NEED_UPDATE;\r
+\r
+ /* Get all medias count */\r
+ if (cur_tag->tag->_id == GL_TAG_FAVORITES_ID)\r
+ err = _gl_data_get_item_cnt(ad,\r
+ GL_GET_ALL_RECORDS_ID,\r
+ true,\r
+ GL_STORE_T_PHONE,\r
+ &cnt);\r
+ else\r
+ err = _gl_local_data_get_tag_media_count(cur_tag->tag->_id,\r
+ &filter,\r
+ &cnt);\r
+ if (err != 0)\r
+ goto DB_NEED_UPDATE;\r
+ /* Compare medias count */\r
+ if (cnt != ad->maininfo.medias_cnt)\r
+ goto DB_NEED_UPDATE;\r
+ } else {\r
+ gitem = eina_list_nth(ad->maininfo.medias_elist, 0);\r
+ if (gitem == NULL || gitem->item == NULL)\r
+ goto DB_NEED_UPDATE;\r
+\r
+ gl_cluster *cur_album = ad->albuminfo.current_album;\r
+ if (cur_album == NULL || cur_album->cluster == NULL ||\r
+ cur_album->cluster->uuid == NULL)\r
+ goto DB_NEED_UPDATE;\r
+\r
+ /* Get latest item */\r
+ if (cur_album->cluster->type == GL_STORE_T_ALL) {\r
+ err = _gl_local_data_get_all_albums_media_list(&filter,\r
+ &item_list);\r
+ } else if (cur_album->cluster->type == GL_STORE_T_PHONE ||\r
+ cur_album->cluster->type == GL_STORE_T_MMC) {\r
+ err = _gl_local_data_get_album_media_list(&filter,\r
+ cur_album->cluster->uuid,\r
+ &item_list);\r
+ } else {\r
+ gl_dbgE("Wrong cluster type!");\r
+ return false;\r
+ }\r
+\r
+ if (err != 0)\r
+ goto DB_NEED_UPDATE;\r
+\r
+ mitem = eina_list_nth(item_list, 0);\r
+ /* Compare modified time */\r
+ if (mitem == NULL || mitem->mtime != gitem->item->mtime)\r
+ goto DB_NEED_UPDATE;\r
+\r
+ /* Get all medias count */\r
+ err = _gl_data_get_item_cnt(ad, cur_album->cluster->uuid,\r
+ false,\r
+ cur_album->cluster->type,\r
+ &cnt);\r
+ if (err != 0)\r
+ goto DB_NEED_UPDATE;\r
+\r
+ /* Compare medias count */\r
+ if (cnt != ad->maininfo.medias_cnt)\r
+ goto DB_NEED_UPDATE;\r
+ }\r
+ }\r
+\r
+ mitem = NULL;\r
+ EINA_LIST_FREE(item_list, mitem) {\r
+ _gl_data_type_free_glitem((void **)&mitem);\r
+ mitem = NULL;\r
+ }\r
+ return false;\r
+\r
+ DB_NEED_UPDATE:\r
+ mitem = NULL;\r
+ EINA_LIST_FREE(item_list, mitem) {\r
+ _gl_data_type_free_glitem((void **)&mitem);\r
+ mitem = NULL;\r
+ }\r
+ gl_dbgW("Need to update data and view!");\r
+ return true;\r
+}\r
+\r
+int _gl_data_init()\r
+{\r
+ int err = _gl_local_data_connect();\r
+ if (err != 0)\r
+ gl_dbgE("Connect to media-content DB failed!");\r
+\r
+ return err;\r
+}\r
+\r
+int _gl_data_finalize(void *data)\r
+{\r
+ GL_CHECK_VAL(data, -1);\r
+ gl_appdata *ad = (gl_appdata *)data;\r
+\r
+ __gl_data_clear_cluster_list(ad, true);\r
+ _gl_data_clear_default_item_list(ad);\r
+\r
+ _gl_data_util_free_tag_list(ad);\r
+\r
+ int err = _gl_local_data_disconnect();\r
+ if (err != 0)\r
+ gl_dbgE("Disconnect with media-content DB failed!");\r
+\r
+ return err;\r
+}\r
+\r
+int _gl_data_delete_media(void *data, gl_media_s *media_item)\r
+{\r
+ GL_CHECK_VAL(media_item, -1);\r
+ int ret = -1;\r
+\r
+ if (media_item->gtype == GL_TYPE_MEDIA)\r
+ ret = media_info_delete_from_db(media_item->uuid);\r
+ return ret;\r
+}\r
+\r
+/* Creates a thumbnail image for given the media, asynchronously */\r
+int _gl_data_create_thumb(gl_item *gitem, media_thumbnail_completed_cb callback,\r
+ void *user_data)\r
+{\r
+ GL_CHECK_VAL(gitem, -1);\r
+ GL_CHECK_VAL(gitem->item, -1);\r
+ GL_CHECK_VAL(gitem->item->media_h, -1);\r
+ int ret = -1;\r
+ gl_dbg("File[%s]", gitem->item->file_url);\r
+\r
+ ret = media_info_create_thumbnail(gitem->item->media_h, callback,\r
+ user_data);\r
+ if (ret != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Failed to create thumbnail!");\r
+ return -1;\r
+ }\r
+ return 0;\r
+}\r
+\r
--- /dev/null
+/*\r
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd\r
+ *\r
+ * Licensed under the Flora License, Version 1.1 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://floralicense.org/license/\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+#include <media_content.h>\r
+#include <string.h>\r
+#include <glib.h>\r
+#include "gl-local-data.h"\r
+#include "gl-debug.h"\r
+#include "gl-data.h"\r
+\r
+typedef struct _gl_transfer_data_t gl_transfer_data_s;\r
+typedef struct _gl_foreach_data_t gl_foreach_data_s;\r
+\r
+struct _gl_transfer_data_t {\r
+ void **userdata;\r
+ filter_h filter;\r
+ char *album_id;\r
+ bool with_meta;\r
+};\r
+\r
+struct _gl_foreach_data_t {\r
+ void **userdata;\r
+ filter_h filter;\r
+ char *album_id;\r
+ char *tag_name;\r
+ bool with_meta;\r
+};\r
+\r
+static int __gl_local_data_create_filter(gl_filter_s *condition, filter_h *filter)\r
+{\r
+ GL_CHECK_VAL(filter, -1);\r
+ GL_CHECK_VAL(condition, -1);\r
+ int ret = -1;\r
+ filter_h tmp_filter = NULL;\r
+ ret = media_filter_create(&tmp_filter);\r
+ if(ret != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Fail to create filter");\r
+ return -1;\r
+ }\r
+\r
+ if (strlen(condition->cond) > 0) {\r
+ ret = media_filter_set_condition(tmp_filter, condition->cond,\r
+ condition->collate_type);\r
+ if(ret != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Fail to set condition");\r
+ goto GL_LOCAL_FAILED;\r
+ }\r
+ }\r
+\r
+ if (strlen(condition->sort_keyword) > 0) {\r
+ ret = media_filter_set_order(tmp_filter, condition->sort_type,\r
+ condition->sort_keyword,\r
+ condition->collate_type);\r
+ if(ret != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Fail to set order");\r
+ goto GL_LOCAL_FAILED;\r
+ }\r
+ }\r
+\r
+ if (condition->offset != -1 && condition->count != -1 &&\r
+ condition->count > 0) {\r
+ ret = media_filter_set_offset(tmp_filter, condition->offset,\r
+ condition->count);\r
+ if(ret != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Fail to set offset");\r
+ goto GL_LOCAL_FAILED;\r
+ }\r
+ }\r
+\r
+ *filter = tmp_filter;\r
+ return 0;\r
+\r
+ GL_LOCAL_FAILED:\r
+\r
+ if (tmp_filter) {\r
+ media_filter_destroy(tmp_filter);\r
+ tmp_filter = NULL;\r
+ *filter = NULL;\r
+ }\r
+ return -1;\r
+}\r
+\r
+static int __gl_local_data_destroy_filter(filter_h filter)\r
+{\r
+ GL_CHECK_VAL(filter, -1);\r
+ if (media_filter_destroy(filter) != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Failed to destroy filter!");\r
+ return -1;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+static bool __gl_local_data_get_album_list_cb(media_folder_h folder,\r
+ void *data)\r
+{\r
+ GL_CHECK_FALSE(data);\r
+ gl_transfer_data_s *tmp_data = (gl_transfer_data_s *)data;\r
+ GL_CHECK_FALSE(tmp_data->userdata);\r
+ GL_CHECK_FALSE(tmp_data->filter);\r
+ GL_CHECK_FALSE(folder);\r
+\r
+ Eina_List **elist = (Eina_List **)(tmp_data->userdata);\r
+ gl_album_s *album = NULL;\r
+\r
+ album = (gl_album_s *)calloc(1, sizeof(gl_album_s));\r
+ GL_CHECK_FALSE(album);\r
+ album->gtype = GL_TYPE_ALBUM;\r
+\r
+ if (media_folder_clone(&(album->folder_h), folder) != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Clone folder handle failed!");\r
+ goto GL_LOCAL_FAILED;\r
+ }\r
+\r
+ if (media_folder_get_folder_id(folder, &(album->uuid)) != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Get folder id failed!");\r
+ goto GL_LOCAL_FAILED;\r
+ }\r
+\r
+ if (media_folder_get_modified_time(folder, &(album->mtime)) != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Get modified time failed!");\r
+ goto GL_LOCAL_FAILED;\r
+ }\r
+\r
+ if (media_folder_get_storage_type(folder, (media_content_storage_e *)&(album->type)) != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Get storage type failed!");\r
+ goto GL_LOCAL_FAILED;\r
+ }\r
+\r
+ if (media_folder_get_name(folder, &(album->display_name)) != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Get folder name failed!");\r
+ goto GL_LOCAL_FAILED;\r
+ }\r
+\r
+ if (media_folder_get_path(folder, &(album->path)) != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Get folder name failed!");\r
+ goto GL_LOCAL_FAILED;\r
+ }\r
+\r
+ if (media_folder_get_media_count_from_db(album->uuid, tmp_data->filter, &(album->count)) != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Failed to get count[uuid: %s]", album->uuid);\r
+ goto GL_LOCAL_FAILED;\r
+ }\r
+\r
+ *elist = eina_list_append(*elist, album);\r
+\r
+ return true;\r
+\r
+ GL_LOCAL_FAILED:\r
+\r
+ _gl_data_type_free_glitem((void **)(&album));\r
+ return false;\r
+}\r
+\r
+static bool __gl_local_data_get_media_list_cb(media_info_h media, void *data)\r
+{\r
+ GL_CHECK_FALSE(data);\r
+ gl_transfer_data_s *tmp_data = (gl_transfer_data_s *)data;\r
+ GL_CHECK_FALSE(tmp_data->userdata);\r
+ GL_CHECK_FALSE(media);\r
+ gl_media_s *item = NULL;\r
+ gl_image_s *image_info = NULL;\r
+ gl_video_s *video_info = NULL;\r
+ image_meta_h image_handle = NULL;\r
+ video_meta_h video_handle = NULL;\r
+ char *ext = NULL;\r
+\r
+ int ret = -1;\r
+ Eina_List **elist = (Eina_List **)(tmp_data->userdata);\r
+\r
+ item = (gl_media_s *)calloc(1, sizeof(gl_media_s));\r
+ GL_CHECK_FALSE(item);\r
+ item->gtype = GL_TYPE_MEDIA;\r
+\r
+ if (media_info_clone(&(item->media_h), media) != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Clone media handle failed!");\r
+ goto GL_LOCAL_FAILED;\r
+ }\r
+\r
+ if (media_info_get_media_id(media, &(item->uuid)) != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Get media id failed!");\r
+ goto GL_LOCAL_FAILED;\r
+ }\r
+\r
+ if (media_info_get_display_name(media, &(item->display_name)) != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Get media display name failed!");\r
+ goto GL_LOCAL_FAILED;\r
+ }\r
+\r
+ if (media_info_get_file_path(media, &(item->file_url)) != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Get media file path failed!");\r
+ goto GL_LOCAL_FAILED;\r
+ }\r
+\r
+ if (media_info_get_media_type(media, (media_content_type_e *)&(item->type)) != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Get media type failed!");\r
+ goto GL_LOCAL_FAILED;\r
+ }\r
+ if (media_info_get_thumbnail_path(media, &(item->thumb_url)) != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Get media thumbnail path failed!");\r
+ goto GL_LOCAL_FAILED;\r
+ }\r
+ gl_dbg("thumb_url: %s", item->thumb_url);\r
+ if (media_info_get_modified_time(media, &(item->mtime)) != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Get media modified time failed!");\r
+ goto GL_LOCAL_FAILED;\r
+ }\r
+ if (media_info_get_favorite(media, &(item->favorite)) != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Get media rating failed!");\r
+ goto GL_LOCAL_FAILED;\r
+ }\r
+ /* Without meta */\r
+ if (!tmp_data->with_meta)\r
+ goto GL_LOCAL_SUCCESS;\r
+\r
+ if (item->type == MEDIA_CONTENT_TYPE_IMAGE) {\r
+ ret = media_info_get_image(media, &image_handle);\r
+ if (ret != MEDIA_CONTENT_ERROR_NONE || image_handle == NULL) {\r
+ gl_dbgE("Failed to get image handle[%d]!", ret);\r
+ goto GL_LOCAL_FAILED;\r
+ }\r
+\r
+ image_info = (gl_image_s *)calloc(1, sizeof(gl_image_s));\r
+ if (NULL == image_info){\r
+ gl_dbgE("Failed to calloc!");\r
+ goto GL_LOCAL_FAILED;\r
+ }\r
+ item->image_info = image_info;\r
+\r
+ if (image_meta_clone(&(image_info->image_h), image_handle) != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Clone image handle failed!");\r
+ goto GL_LOCAL_FAILED;\r
+ }\r
+\r
+ if (image_meta_get_media_id(image_handle, &(image_info->media_uuid)) != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Get image id failed!");\r
+ goto GL_LOCAL_FAILED;\r
+ }\r
+\r
+ if (image_meta_get_orientation(image_handle, (media_content_orientation_e *)&(image_info->orientation)) != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Get image orientation failed!");\r
+ goto GL_LOCAL_FAILED;\r
+ }\r
+\r
+ if (image_meta_destroy(image_handle) != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Destroy image handle failed!");\r
+ goto GL_LOCAL_FAILED;\r
+ }\r
+ } else if (item->type == MEDIA_CONTENT_TYPE_VIDEO) {\r
+ ret = media_info_get_video(media, &video_handle);\r
+ if (ret != MEDIA_CONTENT_ERROR_NONE || video_handle == NULL) {\r
+ gl_dbgE("Failed to get video handle[%d]!", ret);\r
+ goto GL_LOCAL_FAILED;\r
+ }\r
+\r
+ video_info = (gl_video_s *)calloc(1, sizeof(gl_video_s));\r
+ if (NULL == video_info) {\r
+ gl_dbgE("Failed to calloc!");\r
+ goto GL_LOCAL_FAILED;\r
+ }\r
+ item->video_info = video_info;\r
+\r
+ if (video_meta_clone(&(video_info->video_h), video_handle) != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Clone video handle failed!");\r
+ goto GL_LOCAL_FAILED;\r
+ }\r
+\r
+ if (video_meta_get_media_id(video_handle, &(video_info->media_uuid)) != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Get video id failed!");\r
+ goto GL_LOCAL_FAILED;\r
+ }\r
+\r
+ if (video_meta_get_title(video_handle, &(video_info->title)) != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Get video title failed!");\r
+ goto GL_LOCAL_FAILED;\r
+ }\r
+\r
+ if (video_meta_get_duration(video_handle, &(video_info->duration)) != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Get video duration failed!");\r
+ goto GL_LOCAL_FAILED;\r
+ }\r
+\r
+ if (video_meta_get_played_time(video_handle, &(video_info->last_played_pos)) != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Get video last played position failed!");\r
+ goto GL_LOCAL_FAILED;\r
+ }\r
+\r
+ if (video_meta_destroy(video_handle) != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Destroy video handle failed!");\r
+ goto GL_LOCAL_FAILED;\r
+ }\r
+\r
+ /* Get bookmark elist in case of video */\r
+ if (video_info->media_uuid) {\r
+ video_info->bookmarks = 0;\r
+ int count = 0;\r
+ ret = media_info_get_bookmark_count_from_db(video_info->media_uuid,\r
+ NULL,\r
+ &count);\r
+ if (ret != MEDIA_CONTENT_ERROR_NONE)\r
+ gl_dbgE("Failed to get bookmark[%d]", ret);\r
+ else\r
+ video_info->bookmarks = count;\r
+ }\r
+ } else {\r
+ gl_dbgE("Wrong media type[%d]!", item->type);\r
+ }\r
+\r
+ GL_LOCAL_SUCCESS:\r
+\r
+ /* Get extension */\r
+ ext = strrchr(item->file_url, '.');\r
+ if (ext)\r
+ item->ext = strdup(ext + 1);\r
+ else\r
+ gl_dbgE("Extension is NULL!");\r
+\r
+ /* Save album uuid */\r
+ if (tmp_data->album_id)\r
+ item->album_uuid = strdup(tmp_data->album_id);\r
+ else\r
+ item->album_uuid = NULL;\r
+\r
+ *elist = eina_list_append(*elist, item);\r
+ return true;\r
+\r
+ GL_LOCAL_FAILED:\r
+\r
+ if (image_handle)\r
+ image_meta_destroy(image_handle);\r
+ if (video_handle)\r
+ video_meta_destroy(video_handle);\r
+\r
+ _gl_data_type_free_glitem((void **)(&item));\r
+ return false;\r
+}\r
+\r
+static bool __gl_local_data_get_tag_list_cb(media_tag_h tag_handle, void* data)\r
+{\r
+ GL_CHECK_FALSE(data);\r
+ gl_transfer_data_s *tmp_data = (gl_transfer_data_s *)data;\r
+ GL_CHECK_FALSE(tmp_data->userdata);\r
+ Eina_List **elist = (Eina_List **)(tmp_data->userdata);\r
+ GL_CHECK_FALSE(tag_handle);\r
+\r
+ gl_tag_s *t_item = (gl_tag_s *)calloc(1, sizeof(gl_tag_s));\r
+ GL_CHECK_FALSE(t_item);\r
+ t_item->gtype = GL_TYPE_TAG;\r
+\r
+ if (media_tag_clone(&(t_item->tag_h), tag_handle) != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Clone tag handle failed!");\r
+ goto GL_LOCAL_FAILED;\r
+ }\r
+\r
+ if (media_tag_get_tag_id(tag_handle, &(t_item->_id)) != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Get tag id failed!");\r
+ goto GL_LOCAL_FAILED;\r
+ }\r
+\r
+ if (media_tag_get_name(tag_handle, &(t_item->tag_name)) != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Get tag name failed!");\r
+ goto GL_LOCAL_FAILED;\r
+ }\r
+\r
+ if (tmp_data->filter &&\r
+ media_tag_get_media_count_from_db(t_item->_id, tmp_data->filter, &(t_item->count)) != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Get tag meida count failed!");\r
+ goto GL_LOCAL_FAILED;\r
+ }\r
+\r
+ *elist = eina_list_append(*elist, t_item);\r
+ return true;\r
+\r
+ GL_LOCAL_FAILED:\r
+\r
+ _gl_data_type_free_glitem((void **)(&t_item));\r
+ return false;\r
+}\r
+\r
+static int __gl_local_data_get_tag_list_by_media_id_without_tag(gl_filter_s *condition,\r
+ const char *media_id,\r
+ Eina_List **elist)\r
+{\r
+ GL_CHECK_VAL(elist, -1);\r
+ GL_CHECK_VAL(condition, -1);\r
+ int ret = -1;\r
+ filter_h filter = NULL;\r
+\r
+ ret = __gl_local_data_create_filter(condition, &filter);\r
+ if (ret != 0) {\r
+ gl_dbgE("Create filter failed!");\r
+ return -1;\r
+ }\r
+\r
+ gl_transfer_data_s tran_data;\r
+ memset(&tran_data, 0x00, sizeof(gl_transfer_data_s));\r
+ tran_data.userdata = (void **)elist;\r
+ tran_data.filter = NULL;\r
+ tran_data.album_id = NULL;\r
+ tran_data.with_meta = false;\r
+\r
+ gl_dbg("Get tags by media id without tag--start");\r
+ ret = media_info_foreach_tag_from_db(media_id, filter,\r
+ __gl_local_data_get_tag_list_cb,\r
+ &tran_data);\r
+ gl_dbg("Get tags by media id without tag--over");\r
+\r
+ __gl_local_data_destroy_filter(filter);\r
+\r
+ if (ret != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Failed to get tags[%d]!", ret);\r
+ return -1;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+static bool __gl_local_data_get_media_list_without_tag_cb(media_info_h media,\r
+ void *data)\r
+{\r
+ GL_CHECK_FALSE(data);\r
+ gl_foreach_data_s *fe_data = (gl_foreach_data_s*)data;\r
+ GL_CHECK_FALSE(fe_data->userdata);\r
+ GL_CHECK_FALSE(media);\r
+ gl_media_s *item = NULL;\r
+ gl_image_s *image_info = NULL;\r
+ gl_video_s *video_info = NULL;\r
+ image_meta_h image_handle = NULL;\r
+ video_meta_h video_handle = NULL;\r
+ char *ext = NULL;\r
+ char *uuid;\r
+\r
+ /* Get media uuid first */\r
+ if (media_info_get_media_id(media, &uuid) != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Get media id failed!");\r
+ goto GL_LOCAL_FAILED;\r
+ }\r
+\r
+ Eina_List *taglist = NULL;\r
+ int err = -1;\r
+ gl_dbg("UUID: %s", uuid);\r
+ gl_filter_s filter;\r
+ memset(&filter, 0x00, sizeof(gl_filter_s));\r
+ filter.sort_type = MEDIA_CONTENT_ORDER_ASC;\r
+ g_strlcpy(filter.sort_keyword, TAG_NAME, KEYWORD_LENGTH);\r
+ /* Check media is tagged with current tag_name or not */\r
+ snprintf(filter.cond, CONDITION_LENGTH,\r
+ GL_CONDITION_IMAGE_VIDEO" AND "GL_CONDITION_TAG_NAME,\r
+ fe_data->tag_name);\r
+ filter.collate_type = MEDIA_CONTENT_COLLATE_NOCASE;\r
+\r
+ err = __gl_local_data_get_tag_list_by_media_id_without_tag(&filter, uuid,\r
+ &taglist);\r
+\r
+ if (taglist) {\r
+ gl_dbgW("Media tagged!");\r
+ GL_FREEIF(uuid);\r
+ /* If media tagged, then skip it and get next */\r
+ return true;\r
+ }\r
+\r
+ int ret = -1;\r
+ Eina_List **elist = (Eina_List **)(fe_data->userdata);\r
+\r
+ item = (gl_media_s *)calloc(1, sizeof(gl_media_s));\r
+ GL_CHECK_FALSE(item);\r
+ item->gtype = GL_TYPE_MEDIA;\r
+\r
+ if (media_info_clone(&(item->media_h), media) != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Clone media handle failed!");\r
+ goto GL_LOCAL_FAILED;\r
+ }\r
+\r
+ item->uuid = uuid;\r
+\r
+ if (media_info_get_display_name(media, &(item->display_name)) != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Get media display name failed!");\r
+ goto GL_LOCAL_FAILED;\r
+ }\r
+\r
+ if (media_info_get_file_path(media, &(item->file_url)) != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Get media file path failed!");\r
+ goto GL_LOCAL_FAILED;\r
+ }\r
+\r
+ if (media_info_get_media_type(media, (media_content_type_e *)&(item->type)) != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Get media type failed!");\r
+ goto GL_LOCAL_FAILED;\r
+ }\r
+ if (media_info_get_thumbnail_path(media, &(item->thumb_url)) != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Get media thumbnail path failed!");\r
+ goto GL_LOCAL_FAILED;\r
+ }\r
+ gl_dbg("thumb_url: %s", item->thumb_url);\r
+ if (media_info_get_modified_time(media, &(item->mtime)) != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Get media modified time failed!");\r
+ goto GL_LOCAL_FAILED;\r
+ }\r
+ if (media_info_get_favorite(media, &(item->favorite)) != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Get media rating failed!");\r
+ goto GL_LOCAL_FAILED;\r
+ }\r
+\r
+ /* Without meta */\r
+ if (!fe_data->with_meta)\r
+ goto GL_LOCAL_SUCCESS;\r
+\r
+ if (item->type == MEDIA_CONTENT_TYPE_IMAGE) {\r
+ ret = media_info_get_image(media, &image_handle);\r
+ if (ret != MEDIA_CONTENT_ERROR_NONE || image_handle == NULL) {\r
+ gl_dbgE("Failed to get image handle[%d]!", ret);\r
+ goto GL_LOCAL_FAILED;\r
+ }\r
+\r
+ image_info = (gl_image_s *)calloc(1, sizeof(gl_image_s));\r
+ if (NULL == image_info){\r
+ gl_dbgE("Failed to calloc!");\r
+ goto GL_LOCAL_FAILED;\r
+ }\r
+ item->image_info = image_info;\r
+\r
+ if (image_meta_clone(&(image_info->image_h), image_handle) != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Clone image handle failed!");\r
+ goto GL_LOCAL_FAILED;\r
+ }\r
+\r
+ if (image_meta_get_media_id(image_handle, &(image_info->media_uuid)) != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Get image id failed!");\r
+ goto GL_LOCAL_FAILED;\r
+ }\r
+\r
+ if (image_meta_get_orientation(image_handle, (media_content_orientation_e *)&(image_info->orientation)) != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Get image orientation failed!");\r
+ goto GL_LOCAL_FAILED;\r
+ }\r
+\r
+ if (image_meta_destroy(image_handle) != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Destroy image handle failed!");\r
+ goto GL_LOCAL_FAILED;\r
+ }\r
+ } else if (item->type == MEDIA_CONTENT_TYPE_VIDEO) {\r
+ ret = media_info_get_video(media, &video_handle);\r
+ if (ret != MEDIA_CONTENT_ERROR_NONE || video_handle == NULL) {\r
+ gl_dbgE("Failed to get video handle[%d]!", ret);\r
+ goto GL_LOCAL_FAILED;\r
+ }\r
+\r
+ video_info = (gl_video_s *)calloc(1, sizeof(gl_video_s));\r
+ if (NULL == video_info) {\r
+ gl_dbgE("Failed to calloc!");\r
+ goto GL_LOCAL_FAILED;\r
+ }\r
+ item->video_info = video_info;\r
+\r
+ if (video_meta_clone(&(video_info->video_h), video_handle) != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Clone video handle failed!");\r
+ goto GL_LOCAL_FAILED;\r
+ }\r
+\r
+ if (video_meta_get_media_id(video_handle, &(video_info->media_uuid)) != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Get video id failed!");\r
+ goto GL_LOCAL_FAILED;\r
+ }\r
+\r
+ if (video_meta_get_title(video_handle, &(video_info->title)) != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Get video title failed!");\r
+ goto GL_LOCAL_FAILED;\r
+ }\r
+\r
+ if (video_meta_get_duration(video_handle, &(video_info->duration)) != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Get video duration failed!");\r
+ goto GL_LOCAL_FAILED;\r
+ }\r
+\r
+ if (video_meta_get_played_time(video_handle, &(video_info->last_played_pos)) != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Get video last played position failed!");\r
+ goto GL_LOCAL_FAILED;\r
+ }\r
+\r
+ if (video_meta_destroy(video_handle) != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Destroy video handle failed!");\r
+ goto GL_LOCAL_FAILED;\r
+ }\r
+\r
+ /* Get bookmark elist in case of video */\r
+ if (video_info->media_uuid) {\r
+ video_info->bookmarks = 0;\r
+ int count = 0;\r
+ ret = media_info_get_bookmark_count_from_db(video_info->media_uuid,\r
+ NULL,\r
+ &count);\r
+ if (ret != MEDIA_CONTENT_ERROR_NONE)\r
+ gl_dbgE("Failed to get bookmark[%d]", ret);\r
+ else\r
+ video_info->bookmarks = count;\r
+ }\r
+ } else {\r
+ gl_dbgE("Wrong media type[%d]!", item->type);\r
+ }\r
+\r
+ GL_LOCAL_SUCCESS:\r
+\r
+ /* Get extension */\r
+ ext = strrchr(item->file_url, '.');\r
+ if (ext)\r
+ item->ext = strdup(ext + 1);\r
+ else\r
+ gl_dbgE("Extension is NULL!");\r
+\r
+ /* Save album uuid */\r
+ if (fe_data->album_id)\r
+ item->album_uuid = strdup(fe_data->album_id);\r
+ else\r
+ item->album_uuid = NULL;\r
+\r
+ *elist = eina_list_append(*elist, item);\r
+ return true;\r
+\r
+ GL_LOCAL_FAILED:\r
+\r
+ if (image_handle)\r
+ image_meta_destroy(image_handle);\r
+ if (video_handle)\r
+ video_meta_destroy(video_handle);\r
+\r
+ _gl_data_type_free_glitem((void **)(&item));\r
+ return false;\r
+}\r
+\r
+/* Connect to media-content database */\r
+int _gl_local_data_connect(void)\r
+{\r
+ int ret = -1;\r
+ ret = media_content_connect();\r
+ if(ret == MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbg("DB connection is success");\r
+ return 0;\r
+ } else {\r
+ gl_dbgE("DB connection is failed[%d]!", ret);\r
+ return -1;\r
+ }\r
+}\r
+\r
+/* Disconnect from media-content database */\r
+int _gl_local_data_disconnect(void)\r
+{\r
+ int ret = -1;\r
+ ret = media_content_disconnect();\r
+ if(ret == MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbg("DB disconnection is success");\r
+ return 0;\r
+ } else {\r
+ gl_dbgE("DB disconnection is failed[%d]!", ret);\r
+ return -1;\r
+ }\r
+}\r
+\r
+int _gl_local_data_get_album_by_path(char *path, gl_album_s **album)\r
+{\r
+ GL_CHECK_VAL(path, -1);\r
+ GL_CHECK_VAL(album, -1);\r
+ int ret = -1;\r
+ Eina_List *list = NULL;\r
+ gl_filter_s condition;\r
+ gl_album_s *_item = NULL;\r
+ int i = 0;\r
+\r
+ if (strlen(path) <=0) {\r
+ gl_dbgE("Invalid path!");\r
+ return -1;\r
+ }\r
+ gl_dbg("path: %s", path);\r
+\r
+ memset(&condition, 0x00, sizeof(gl_filter_s));\r
+ g_strlcpy(condition.cond, GL_CONDITION_IMAGE_VIDEO, CONDITION_LENGTH);\r
+ g_strlcpy(condition.sort_keyword, MEDIA_MODIFIED_TIME, KEYWORD_LENGTH);\r
+ condition.collate_type = MEDIA_CONTENT_COLLATE_NOCASE;\r
+ condition.sort_type = MEDIA_CONTENT_ORDER_DESC;\r
+ condition.offset = -1;\r
+ condition.count = -1;\r
+ condition.with_meta = false;\r
+\r
+ snprintf(condition.cond, CONDITION_LENGTH,\r
+ "(%s=0 OR %s=1) AND %s=\'%s\'", MEDIA_TYPE, MEDIA_TYPE,\r
+ FOLDER_PATH, path);\r
+\r
+ ret = _gl_local_data_get_album_list(&condition, &list);\r
+ if (ret != 0 || NULL == list) {\r
+ gl_dbgE("Failed to get album list[%d]!", ret);\r
+ ret = -1;\r
+ } else if (NULL != list) {\r
+ *album = eina_list_nth(list, 0);\r
+ i = 1;\r
+ ret = 0;\r
+ }\r
+\r
+ /* Free other items */\r
+ if (list) {\r
+ int len = eina_list_count(list);\r
+ gl_dbg("len: %d", len);\r
+\r
+ for(; i < len; i++) {\r
+ _item = eina_list_nth(list, i);\r
+ _gl_data_type_free_glitem((void **)(&_item));\r
+ }\r
+\r
+ eina_list_free(list);\r
+ }\r
+\r
+ return ret;\r
+}\r
+\r
+int _gl_local_data_get_album_list(gl_filter_s *condition, Eina_List **elist)\r
+{\r
+ GL_CHECK_VAL(elist, -1);\r
+ GL_CHECK_VAL(condition, -1);\r
+ int ret = -1;\r
+ filter_h filter = NULL;\r
+\r
+ ret = __gl_local_data_create_filter(condition, &filter);\r
+ if (ret != 0) {\r
+ gl_dbgE("Create filter failed[%d]!", ret);\r
+ return -1;\r
+ }\r
+\r
+ filter_h media_filter = NULL;\r
+ gl_filter_s media_condition;\r
+ memset(&media_condition, 0x00, sizeof(gl_filter_s));\r
+ g_strlcpy(media_condition.cond, GL_CONDITION_IMAGE_VIDEO,\r
+ CONDITION_LENGTH);\r
+ media_condition.sort_type = MEDIA_CONTENT_ORDER_DESC;\r
+ g_strlcpy(media_condition.sort_keyword, MEDIA_MODIFIED_TIME,\r
+ KEYWORD_LENGTH);\r
+ media_condition.collate_type = MEDIA_CONTENT_COLLATE_NOCASE;\r
+ media_condition.offset = -1;\r
+ media_condition.count = -1;\r
+ media_condition.with_meta = false;\r
+\r
+ ret = __gl_local_data_create_filter(&media_condition, &media_filter);\r
+ if (ret != 0) {\r
+ __gl_local_data_destroy_filter(filter);\r
+ gl_dbgE("Create filter failed[%d]!", ret);\r
+ return -1;\r
+ }\r
+\r
+ gl_transfer_data_s tran_data;\r
+ memset(&tran_data, 0x00, sizeof(gl_transfer_data_s));\r
+ tran_data.userdata = (void **)elist;\r
+ tran_data.filter = media_filter;\r
+ tran_data.album_id = NULL;\r
+ tran_data.with_meta = false;\r
+\r
+ gl_dbg("Get folders--start");\r
+ ret = media_folder_foreach_folder_from_db(filter,\r
+ __gl_local_data_get_album_list_cb,\r
+ &tran_data);\r
+ gl_dbg("Get folders---over");\r
+\r
+ __gl_local_data_destroy_filter(media_filter);\r
+ __gl_local_data_destroy_filter(filter);\r
+\r
+ if (ret != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Failed to get all folders[%d]!", ret);\r
+ return -1;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+int _gl_local_data_get_media_by_path(const char *path, gl_media_s **mitem)\r
+{\r
+ GL_CHECK_VAL(mitem, -1);\r
+ GL_CHECK_VAL(path, -1);\r
+ int ret = -1;\r
+ Eina_List *list = NULL;\r
+ gl_filter_s condition;\r
+ gl_media_s *_mitem = NULL;\r
+ int i = 0;\r
+\r
+ if (strlen(path) <=0) {\r
+ gl_dbgE("Invalid path!");\r
+ return -1;\r
+ }\r
+ gl_dbg("path: %s", path);\r
+\r
+ memset(&condition, 0x00, sizeof(gl_filter_s));\r
+ g_strlcpy(condition.cond, GL_CONDITION_IMAGE_VIDEO, CONDITION_LENGTH);\r
+ g_strlcpy(condition.sort_keyword, MEDIA_MODIFIED_TIME, KEYWORD_LENGTH);\r
+ condition.collate_type = MEDIA_CONTENT_COLLATE_NOCASE;\r
+ condition.sort_type = MEDIA_CONTENT_ORDER_DESC;\r
+ condition.offset = -1;\r
+ condition.count = -1;\r
+ condition.with_meta = true;\r
+\r
+ snprintf(condition.cond, CONDITION_LENGTH,\r
+ "(%s=0 OR %s=1) AND %s=\'%s\'", MEDIA_TYPE, MEDIA_TYPE,\r
+ MEDIA_PATH, path);\r
+ ret = _gl_local_data_get_all_albums_media_list(&condition, &list);\r
+ if (ret != 0 || NULL == list) {\r
+ gl_dbgE("Failed to get all albums[%d]!", ret);\r
+ ret = -1;\r
+ } else if (NULL != list) {\r
+ *mitem = eina_list_nth(list, 0);\r
+ i = 1;\r
+ ret = 0;\r
+ }\r
+\r
+ /* Free other items */\r
+ if (list) {\r
+ int len = eina_list_count(list);\r
+ gl_dbg("len: %d", len);\r
+\r
+ for(; i < len; i++) {\r
+ _mitem = eina_list_nth(list, i);\r
+ _gl_data_type_free_glitem((void **)(&_mitem));\r
+ }\r
+\r
+ eina_list_free(list);\r
+ }\r
+\r
+ return ret;\r
+}\r
+\r
+int _gl_local_data_get_media_count(const char *cluster_id, gl_filter_s *condition,\r
+ int *item_cnt)\r
+{\r
+ GL_CHECK_VAL(cluster_id, -1);\r
+ GL_CHECK_VAL(condition, -1);\r
+ GL_CHECK_VAL(item_cnt, -1);\r
+ int ret = -1;\r
+ filter_h filter = NULL;\r
+\r
+ ret = __gl_local_data_create_filter(condition, &filter);\r
+ if (ret != 0) {\r
+ gl_dbgE("Create filter failed[%d]!", ret);\r
+ return -1;\r
+ }\r
+\r
+ gl_dbg("Get media count--start");\r
+ ret = media_folder_get_media_count_from_db(cluster_id, filter, item_cnt);\r
+ gl_dbg("Get media count---over");\r
+\r
+ __gl_local_data_destroy_filter(filter);\r
+\r
+ if (ret != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Failed to get media count[%d]!", ret);\r
+ return -1;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+int _gl_local_data_get_all_media_count(gl_filter_s *condtion, int *item_cnt)\r
+{\r
+ GL_CHECK_VAL(condtion, -1);\r
+ GL_CHECK_VAL(item_cnt, -1);\r
+ int ret = -1;\r
+ filter_h filter = NULL;\r
+\r
+ ret = __gl_local_data_create_filter(condtion, &filter);\r
+ if (ret != 0) {\r
+ gl_dbgE("Create filter failed[%d]!", ret);\r
+ return -1;\r
+ }\r
+\r
+ gl_dbg("Get media count--start");\r
+ ret = media_info_get_media_count_from_db(filter, item_cnt);\r
+ gl_dbg("Get media count---over");\r
+\r
+ __gl_local_data_destroy_filter(filter);\r
+\r
+ if (ret != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Failed to get media count[%d]", ret);\r
+ return -1;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+int _gl_local_data_get_album_media_list(gl_filter_s *condition,\r
+ const char *album_id, Eina_List **elist)\r
+{\r
+ GL_CHECK_VAL(elist, -1);\r
+ GL_CHECK_VAL(album_id, -1);\r
+ GL_CHECK_VAL(condition, -1);\r
+ gl_dbg("album id: %s", album_id);\r
+\r
+ int ret = -1;\r
+ filter_h filter = NULL;\r
+ ret = __gl_local_data_create_filter(condition, &filter);\r
+ if (ret != 0) {\r
+ gl_dbgE("Create filter failed!");\r
+ return -1;\r
+ }\r
+\r
+ gl_transfer_data_s tran_data;\r
+ memset(&tran_data, 0x00, sizeof(gl_transfer_data_s));\r
+ tran_data.userdata = (void **)elist;\r
+ tran_data.filter = NULL;\r
+ tran_data.album_id = (char *)album_id;\r
+ tran_data.with_meta = condition->with_meta;\r
+\r
+ gl_dbg("Get medias--start");\r
+ ret = media_folder_foreach_media_from_db(album_id, filter,\r
+ __gl_local_data_get_media_list_cb,\r
+ &tran_data);\r
+ gl_dbg("Get medias--start");\r
+\r
+ __gl_local_data_destroy_filter(filter);\r
+\r
+ if (ret != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Failed to get medias[%d]!", ret);\r
+ return -1;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+int _gl_local_data_get_all_albums_media_list(gl_filter_s *condition,\r
+ Eina_List **elist)\r
+{\r
+ GL_CHECK_VAL(elist, -1);\r
+ GL_CHECK_VAL(condition, -1);\r
+ int ret = -1;\r
+ filter_h filter = NULL;\r
+\r
+ ret = __gl_local_data_create_filter(condition, &filter);\r
+ if (ret != 0) {\r
+ gl_dbgE("Create filter failed!");\r
+ return -1;\r
+ }\r
+\r
+ gl_transfer_data_s tran_data;\r
+ memset(&tran_data, 0x00, sizeof(gl_transfer_data_s));\r
+ tran_data.userdata = (void **)elist;\r
+ tran_data.filter = NULL;\r
+ tran_data.album_id = NULL;\r
+ tran_data.with_meta = condition->with_meta;\r
+\r
+ gl_dbg("Get all medias--start");\r
+ ret = media_info_foreach_media_from_db(filter,\r
+ __gl_local_data_get_media_list_cb,\r
+ &tran_data);\r
+ gl_dbg("Get all medias--over");\r
+\r
+ __gl_local_data_destroy_filter(filter);\r
+\r
+ if (ret != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Failed to get medias[%d]!", ret);\r
+ return -1;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+int _gl_local_data_get_media_count_wichout_tag(int tag_id, char *album_uuid)\r
+{\r
+ GL_CHECK_VAL(album_uuid, -1);\r
+ int ret = -1;\r
+ filter_h filter = NULL;\r
+ int item_cnt = 0;\r
+\r
+ gl_filter_s condtion;\r
+ memset(&condtion, 0x00, sizeof(gl_filter_s));\r
+ if (tag_id == GL_TAG_FAVORITES_ID)\r
+ snprintf(condtion.cond, CONDITION_LENGTH,\r
+ GL_CONDITION_WITHOUT_FAVOURITE);\r
+ else\r
+ snprintf(condtion.cond, CONDITION_LENGTH,\r
+ GL_CONDITION_WITHOUT_TAG, tag_id);\r
+ condtion.sort_type = MEDIA_CONTENT_ORDER_DESC;\r
+ g_strlcpy(condtion.sort_keyword, MEDIA_MODIFIED_TIME,\r
+ KEYWORD_LENGTH);\r
+ condtion.collate_type = MEDIA_CONTENT_COLLATE_NOCASE;\r
+ condtion.offset = -1;\r
+ condtion.count = -1;\r
+ condtion.with_meta = false;\r
+\r
+ ret = __gl_local_data_create_filter(&condtion, &filter);\r
+ if (ret != 0) {\r
+ gl_dbgE("Create filter failed[%d]!", ret);\r
+ return -1;\r
+ }\r
+\r
+ gl_dbg("Get media count--start");\r
+ if (!g_strcmp0(album_uuid, GL_ALBUM_ALL_ID))\r
+ ret = media_info_get_media_count_from_db(filter, &item_cnt);\r
+ else\r
+ ret = media_folder_get_media_count_from_db(album_uuid, filter, &item_cnt);\r
+\r
+ if (ret != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Failed to get count[uuid: %s]", album_uuid);\r
+ item_cnt = 0;\r
+ }\r
+ gl_dbg("Get media count---over");\r
+\r
+ __gl_local_data_destroy_filter(filter);\r
+\r
+ return item_cnt;\r
+}\r
+\r
+int _gl_local_data_get_album_media_list_without_tag(gl_filter_s *condition,\r
+ const char *album_id,\r
+ const char *tag_name,\r
+ Eina_List **elist)\r
+{\r
+ GL_CHECK_VAL(elist, -1);\r
+ GL_CHECK_VAL(album_id, -1);\r
+ GL_CHECK_VAL(condition, -1);\r
+ gl_dbg("album id: %s, tag_name: %s", album_id, tag_name);\r
+\r
+ int ret = -1;\r
+ filter_h filter = NULL;\r
+ ret = __gl_local_data_create_filter(condition, &filter);\r
+ if (ret != 0) {\r
+ gl_dbgE("Create filter failed!");\r
+ return -1;\r
+ }\r
+\r
+ gl_foreach_data_s fe_data;\r
+ memset(&fe_data, 0x00, sizeof(gl_foreach_data_s));\r
+ fe_data.userdata = (void **)elist;\r
+ fe_data.filter = NULL;\r
+ fe_data.album_id = (char *)album_id;\r
+ fe_data.tag_name = (char *)tag_name;\r
+ fe_data.with_meta = condition->with_meta;\r
+\r
+ gl_dbg("Get medias without tag--start");\r
+ ret = media_folder_foreach_media_from_db(album_id, filter,\r
+ __gl_local_data_get_media_list_without_tag_cb,\r
+ &fe_data);\r
+ gl_dbg("Get medias without tag--over");\r
+\r
+ __gl_local_data_destroy_filter(filter);\r
+\r
+ if (ret != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Failed to get medias[%d]!", ret);\r
+ return -1;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+int _gl_local_data_get_all_albums_media_list_without_tag(gl_filter_s *condition,\r
+ const char *tag_name,\r
+ Eina_List **elist)\r
+{\r
+ GL_CHECK_VAL(elist, -1);\r
+ GL_CHECK_VAL(condition, -1);\r
+ int ret = -1;\r
+ filter_h filter = NULL;\r
+ gl_dbg("tag_name: %s", tag_name);\r
+\r
+ ret = __gl_local_data_create_filter(condition, &filter);\r
+ if (ret != 0) {\r
+ gl_dbgE("Create filter failed!");\r
+ return -1;\r
+ }\r
+\r
+ gl_foreach_data_s fe_data;\r
+ memset(&fe_data, 0x00, sizeof(gl_foreach_data_s));\r
+ fe_data.userdata = (void **)elist;\r
+ fe_data.filter = NULL;\r
+ fe_data.album_id = NULL;\r
+ fe_data.tag_name = (char *)tag_name;\r
+ fe_data.with_meta = condition->with_meta;\r
+\r
+ gl_dbg("Get all medias without tag--start");\r
+ ret = media_info_foreach_media_from_db(filter,\r
+ __gl_local_data_get_media_list_without_tag_cb,\r
+ &fe_data);\r
+ gl_dbg("Get all medias without tag--over");\r
+\r
+ __gl_local_data_destroy_filter(filter);\r
+\r
+ if (ret != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Failed to get medias[%d]!", ret);\r
+ return -1;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+int _gl_local_data_get_tag_list(gl_filter_s *condition, Eina_List **elist)\r
+{\r
+ GL_CHECK_VAL(elist, -1);\r
+ GL_CHECK_VAL(condition, -1);\r
+ int ret = -1;\r
+ filter_h filter = NULL;\r
+\r
+ ret = __gl_local_data_create_filter(condition, &filter);\r
+ if (ret != 0) {\r
+ gl_dbgE("Create filter failed");\r
+ return -1;\r
+ }\r
+\r
+ filter_h media_filter = NULL;\r
+ gl_filter_s media_condition;\r
+ memset(&media_condition,0x00,sizeof(gl_filter_s));\r
+ g_strlcpy(media_condition.cond, GL_CONDITION_IMAGE_VIDEO,\r
+ CONDITION_LENGTH);\r
+ media_condition.sort_type = MEDIA_CONTENT_ORDER_DESC;\r
+ g_strlcpy(media_condition.sort_keyword, MEDIA_MODIFIED_TIME,\r
+ KEYWORD_LENGTH);\r
+ media_condition.collate_type = MEDIA_CONTENT_COLLATE_NOCASE;\r
+ media_condition.offset = -1;\r
+ media_condition.count = -1;\r
+ media_condition.with_meta = false;\r
+\r
+ ret = __gl_local_data_create_filter(&media_condition, &media_filter);\r
+ if (ret != 0) {\r
+ gl_dbgE("Create filter failed!");\r
+ __gl_local_data_destroy_filter(filter);\r
+ return -1;\r
+ }\r
+\r
+ gl_transfer_data_s tran_data;\r
+ memset(&tran_data, 0x00, sizeof(gl_transfer_data_s));\r
+ tran_data.userdata = (void **)elist;\r
+ tran_data.filter = media_filter;\r
+ tran_data.album_id = NULL;\r
+ tran_data.with_meta = false;\r
+\r
+ gl_dbg("Get tags--start");\r
+ ret = media_tag_foreach_tag_from_db(filter, __gl_local_data_get_tag_list_cb,\r
+ &tran_data);\r
+ gl_dbg("Get tags--over");\r
+\r
+ __gl_local_data_destroy_filter(media_filter);\r
+ __gl_local_data_destroy_filter(filter);\r
+\r
+ if (ret != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Failed to get tags[%d]!", ret);\r
+ return -1;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+int _gl_local_data_get_tag_list_by_media_id(gl_filter_s *condition,\r
+ const char *media_id,\r
+ Eina_List **elist)\r
+{\r
+ GL_CHECK_VAL(elist, -1);\r
+ GL_CHECK_VAL(condition, -1);\r
+ int ret = -1;\r
+ filter_h filter = NULL;\r
+\r
+ ret = __gl_local_data_create_filter(condition, &filter);\r
+ if (ret != 0) {\r
+ gl_dbgE("Create filter failed!");\r
+ return -1;\r
+ }\r
+\r
+ gl_transfer_data_s tran_data;\r
+ memset(&tran_data, 0x00, sizeof(gl_transfer_data_s));\r
+ tran_data.userdata = (void **)elist;\r
+ tran_data.filter = NULL;\r
+ tran_data.album_id = NULL;\r
+ tran_data.with_meta = false;\r
+\r
+ gl_dbg("Get tags--start");\r
+ ret = media_info_foreach_tag_from_db(media_id, filter,\r
+ __gl_local_data_get_tag_list_cb,\r
+ &tran_data);\r
+ gl_dbg("Get tags--over");\r
+\r
+ __gl_local_data_destroy_filter(filter);\r
+\r
+ if (ret != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Failed to get tags[%d]!", ret);\r
+ return -1;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+int _gl_local_data_get_tag_media_count(int tag_id, gl_filter_s *condtion,\r
+ int *item_cnt)\r
+{\r
+ GL_CHECK_VAL(condtion, -1);\r
+ GL_CHECK_VAL(item_cnt, -1);\r
+ int ret = -1;\r
+ filter_h filter = NULL;\r
+\r
+ ret = __gl_local_data_create_filter(condtion, &filter);\r
+ if (ret != 0) {\r
+ gl_dbgE("Create filter failed!");\r
+ return -1;\r
+ }\r
+\r
+ gl_dbg("Get media count--start");\r
+ ret = media_tag_get_media_count_from_db(tag_id, filter, item_cnt);\r
+ gl_dbg("Get media count--start");\r
+\r
+ __gl_local_data_destroy_filter(filter);\r
+\r
+ if (ret != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Failed to get media count[%d]!", ret);\r
+ return -1;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+int _gl_local_data_get_tag_media_list(unsigned int tag_id,\r
+ gl_filter_s *condition,\r
+ Eina_List **elist)\r
+{\r
+ GL_CHECK_VAL(elist, -1);\r
+ GL_CHECK_VAL(condition, -1);\r
+ int ret = -1;\r
+ filter_h filter = NULL;\r
+\r
+ ret = __gl_local_data_create_filter(condition, &filter);\r
+ if (ret != 0) {\r
+ gl_dbgE("Create filter failed!");\r
+ return -1;\r
+ }\r
+\r
+ gl_transfer_data_s tran_data;\r
+ memset(&tran_data, 0x00, sizeof(gl_transfer_data_s));\r
+ tran_data.userdata = (void **)elist;\r
+ tran_data.filter = NULL;\r
+ tran_data.album_id = NULL;\r
+ tran_data.with_meta = condition->with_meta;\r
+\r
+ gl_dbg("Get tag medias--start");\r
+ ret = media_tag_foreach_media_from_db(tag_id, filter,\r
+ __gl_local_data_get_media_list_cb,\r
+ &tran_data);\r
+ gl_dbg("Get tag medias--over");\r
+\r
+ __gl_local_data_destroy_filter(filter);\r
+\r
+ if (ret != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Failed to get tag media[%d]!", ret);\r
+ return -1;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+int _gl_local_data_add_tag(const char *tagname, const char *media_uuid)\r
+{\r
+ GL_CHECK_VAL(tagname, -1);\r
+ int ret = -1;\r
+ Eina_List *list = NULL;\r
+ media_tag_h tag_h = NULL;\r
+ gl_filter_s tag_condition;\r
+\r
+ memset(&tag_condition, 0x00, sizeof(gl_filter_s));\r
+ tag_condition.sort_type = MEDIA_CONTENT_ORDER_ASC;\r
+ g_strlcpy(tag_condition.sort_keyword, TAG_NAME, KEYWORD_LENGTH);\r
+ tag_condition.collate_type = MEDIA_CONTENT_COLLATE_NOCASE;\r
+ tag_condition.offset = -1;\r
+ tag_condition.count = -1;\r
+ tag_condition.with_meta = false;\r
+\r
+ /* Check tag exits or not */\r
+ _gl_local_data_get_tag_list(&tag_condition, &list);\r
+ bool is_exist = false;\r
+ if (list) {\r
+ Eina_List *tmp = NULL;\r
+ gl_tag_s *t_item = NULL;\r
+ EINA_LIST_FOREACH(list, tmp, t_item) {\r
+ if (!g_strcmp0(t_item->tag_name, tagname)) {\r
+ tag_h = t_item->tag_h;\r
+ is_exist = true;\r
+ gl_dbgW("Found!");\r
+ break;\r
+ }\r
+ }\r
+ }\r
+\r
+ /* Add new tag to DB */\r
+ if (!is_exist) {\r
+ ret = media_tag_insert_to_db(tagname, &tag_h);\r
+ if (ret != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Failed to add new tag[%d]!", ret);\r
+ ret = -1;\r
+ goto GL_LOCAL_FAILED;\r
+ }\r
+ }\r
+\r
+ if (tag_h && media_uuid) {\r
+ gl_dbg("media_uuid: %s", media_uuid);\r
+ ret = media_tag_add_media(tag_h, media_uuid);\r
+ if (ret != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Add tag to media failed[%d]!", ret);\r
+ ret = -1;\r
+ goto GL_LOCAL_FAILED;\r
+ }\r
+\r
+ ret = media_tag_update_to_db(tag_h);\r
+ if (ret != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Update tag to DB failed[%d]!", ret);\r
+ ret = -1;\r
+ goto GL_LOCAL_FAILED;\r
+ }\r
+ } else {\r
+ gl_dbgE("Invalid tag handle or uuid!");\r
+ ret = -1;\r
+ goto GL_LOCAL_FAILED;\r
+ }\r
+\r
+ ret = 0;\r
+\r
+ GL_LOCAL_FAILED:\r
+\r
+ /* Free new tag handle */\r
+ if (!is_exist)\r
+ media_tag_destroy(tag_h);\r
+ _gl_data_type_free_tag_list(&list);\r
+ return ret;\r
+}\r
+\r
+int _gl_local_data_delete_tag(gl_tag_s *tag)\r
+{\r
+ GL_CHECK_VAL(tag, -1);\r
+ GL_CHECK_VAL(tag->_id, -1);\r
+ int ret = -1;\r
+\r
+ ret = media_tag_delete_from_db(tag->_id);\r
+ if (ret != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Delete tag failed[%d]!", ret);\r
+ return -1;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+int _gl_local_data_remove_tag(gl_tag_s *tag, const char *media_uuid)\r
+{\r
+ GL_CHECK_VAL(tag, -1);\r
+ GL_CHECK_VAL(tag->tag_h, -1);\r
+ GL_CHECK_VAL(media_uuid, -1);\r
+ int ret = -1;\r
+\r
+ ret = media_tag_remove_media(tag->tag_h, media_uuid);\r
+ if (ret != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Remove tag failed[%d]!", ret);\r
+ return -1;\r
+ }\r
+\r
+ ret = media_tag_update_to_db(tag->tag_h);\r
+ if (ret != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Update tag to DB failed[%d]!", ret);\r
+ return -1;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+int _gl_local_data_set_favorite(gl_media_s *item, bool favor)\r
+{\r
+ GL_CHECK_VAL(item, -1);\r
+ GL_CHECK_VAL(item->media_h, -1);\r
+ gl_dbg("favor: %d", favor);\r
+\r
+ int ret = -1;\r
+ ret = media_info_set_favorite(item->media_h, favor);\r
+ if (ret != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Set tag favorite failed[%d]!", ret);\r
+ return -1;\r
+ }\r
+\r
+ ret = media_info_update_to_db(item->media_h);\r
+ if (ret != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Update tag to DB failed[%d]!", ret);\r
+ return -1;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+int _gl_local_data_delete_album(const char *album_uuid)\r
+{\r
+ GL_CHECK_VAL(album_uuid, -1);\r
+ gl_filter_s filter;\r
+ int ret = -1;\r
+\r
+ memset(&filter, 0x00, sizeof(gl_filter_s));\r
+ g_strlcpy(filter.cond, GL_CONDITION_IMAGE_VIDEO, CONDITION_LENGTH);\r
+ filter.sort_type = MEDIA_CONTENT_ORDER_DESC;\r
+ filter.collate_type = MEDIA_CONTENT_COLLATE_NOCASE;\r
+ g_strlcpy(filter.sort_keyword, MEDIA_MODIFIED_TIME, KEYWORD_LENGTH);\r
+ filter.offset = -1;\r
+ filter.count = -1;\r
+ filter.with_meta = false;\r
+\r
+ Eina_List *itemlist = NULL;\r
+ gl_media_s *item = NULL;\r
+\r
+ ret = _gl_local_data_get_album_media_list(&filter, album_uuid,\r
+ &itemlist);\r
+ if (ret != 0) {\r
+ gl_dbgE("Get album medias failed[%d]!", ret);\r
+ return -1;\r
+ }\r
+\r
+ EINA_LIST_FREE(itemlist, item) {\r
+ if (item == NULL) {\r
+ gl_dbgE("Invalid item!");\r
+ continue;\r
+ }\r
+\r
+ media_info_delete_from_db(item->uuid);\r
+ _gl_data_type_free_glitem((void **)&item);\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+int _gl_local_data_add_media(const char *file_url, media_info_h *info)\r
+{\r
+ GL_CHECK_VAL(file_url, -1);\r
+ int ret = -1;\r
+ media_info_h item = NULL;\r
+ gl_dbg("file_url is %s", file_url);\r
+\r
+ ret = media_info_insert_to_db(file_url, &item);\r
+ if (ret != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Failed to insert media to DB[%d]!", ret);\r
+ if (item)\r
+ media_info_destroy(item);\r
+ return -1;\r
+ }\r
+\r
+ if (info) {\r
+ *info = item;\r
+ } else {\r
+ gl_dbgW("Destroy media_info item!");\r
+ media_info_destroy(item);\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+int _gl_local_data_get_thumb(gl_media_s *mitem, char **thumb)\r
+{\r
+ GL_CHECK_VAL(mitem, -1);\r
+ GL_CHECK_VAL(mitem->media_h, -1);\r
+\r
+ if (media_info_get_thumbnail_path(mitem->media_h, thumb) != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Get media thumbnail path failed!");\r
+ return -1;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+int _gl_local_data_move_media(gl_media_s *mitem, const char *dst)\r
+{\r
+ GL_CHECK_VAL(dst, -1);\r
+ GL_CHECK_VAL(mitem, -1);\r
+ GL_CHECK_VAL(mitem->media_h, -1);\r
+\r
+ if (media_info_move_to_db(mitem->media_h, dst) != MEDIA_CONTENT_ERROR_NONE) {\r
+ gl_dbgE("Move media thumbnail failed!");\r
+ return -1;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <errno.h>
+#include "gallery.h"
+#include "gl-albums.h"
+#include "gl-albums-edit.h"
+#include "gl-debug.h"
+#include "gl-strings.h"
+#include "gl-ui-util.h"
+#include "gl-util.h"
+#include "gl-data.h"
+#include "gl-icons.h"
+#include "gl-controlbar.h"
+#include "gl-ctxpopup.h"
+#include "gl-button.h"
+#include "gl-notify.h"
+#include "gl-popup.h"
+
+static void __gl_albums_edit_trans_finished_cb(void *data, Evas_Object *obj,
+ void *event_info)
+{
+ GL_CHECK(data);
+ gl_appdata *ad = (gl_appdata *)data;
+ int view_mode = gl_get_view_mode(ad);
+ gl_dbgW("view_mode: %d", view_mode);
+ evas_object_smart_callback_del(obj, GL_TRANS_FINISHED,
+ __gl_albums_edit_trans_finished_cb);
+
+ /* Clear previous view after animation finished */
+ if (view_mode == GL_VIEW_ALBUMS_EDIT)
+ elm_gengrid_clear(ad->albuminfo.albums_view);
+ else
+ gl_dbgE("Wrong view mode!");
+}
+
+/* callback after user tap Cancel button in option header in edit view */
+static void __gl_albums_edit_cancel_cb(void *data, Evas_Object *obj,
+ void *event_info)
+{
+ GL_CHECK(data);
+ GL_CHECK(obj);
+ gl_dbg("");
+ /* Disable item when it is clicked to prevent it is called for many times */
+ if (_gl_albums_edit_pop_view(data) == 0)
+ _gl_ui_disable_btn(obj);
+}
+
+static void __gl_albums_edit_del_cb(void *data, Evas_Object *obj,
+ void *event_info)
+{
+ GL_CHECK(data);
+ gl_dbg("");
+
+ if ((gl_get_view_mode(data) == GL_VIEW_ALBUMS_EDIT)) {
+ if (_gl_data_get_albums_selected_cnt(data) == 0) {
+ gl_dbgW("No albums selected!");
+ gl_popup_create_popup(data, GL_POPUP_NOBUT,
+ GL_STR_NO_ALBUMS_SELECTED);
+ return;
+ }
+ gl_popup_create_albums_del_popup(data);
+ } else {
+ gl_dbgE("Unknow mode!");
+ }
+}
+
+static void __gl_albums_edit_share_cb(void *data, Evas_Object *obj,
+ void *event_info)
+{
+ GL_CHECK(data);
+ gl_appdata *ad = (gl_appdata *)data;
+ gl_dbg("");
+
+ if (ad->uginfo.ug_called_by_me || ad->uginfo.app_called_by_me) {
+ gl_dbgW("UG or APP is already loaded!");
+ return;
+ }
+
+ int view_mode = gl_get_view_mode(ad);
+ int cnt = 0;
+ if (view_mode == GL_VIEW_ALBUMS_EDIT) {
+ cnt = _gl_data_get_albums_selected_cnt(ad);
+ if (cnt == 0) {
+ gl_dbgW("No albums selected!");
+ gl_popup_create_popup(ad, GL_POPUP_NOBUT,
+ GL_STR_NO_ALBUMS_SELECTED);
+ return;
+ }
+ /* Check albums are empty */
+ if (_gl_data_is_albums_selected_empty(ad)) {
+ gl_dbgW("No thumbs selected!");
+ gl_popup_create_popup(ad, GL_POPUP_NOBUT,
+ GL_STR_NO_FILES_SELECTED);
+ return;
+ }
+ _gl_ctxpopup_create_share(data, obj);
+ } else {
+ gl_dbgE("Unknow mode!");
+ }
+}
+
+/**
+ * Use naviframe api to push albums edit view to stack.
+ * @param obj is the content to be pushed.
+ */
+static int __gl_albums_edit_push_view(void *data, Evas_Object *parent,
+ Evas_Object *obj)
+{
+ gl_dbg("GL_NAVI_ALBUMS_EDIT");
+ GL_CHECK_VAL(obj, -1);
+ GL_CHECK_VAL(parent, -1);
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ Elm_Object_Item *nf_it = NULL;
+
+ /* Add transition finished callback */
+ evas_object_smart_callback_add(parent, GL_TRANS_FINISHED,
+ __gl_albums_edit_trans_finished_cb,
+ data);
+ Evas_Object *end_btn = NULL;
+ end_btn = _gl_but_create_but(parent, NULL, NULL,
+ GL_BUTTON_STYLE_NAVI_PRE,
+ __gl_albums_edit_cancel_cb, data);
+ GL_CHECK_VAL(end_btn, -1);
+ /* Push to stack */
+ nf_it = elm_naviframe_item_push(parent, NULL, end_btn, NULL, obj,
+ GL_NF_ANI_TABBAR);
+ ad->ctrlinfo.nf_it_edit = nf_it;
+ elm_naviframe_item_title_visible_set(nf_it, EINA_FALSE);
+
+ Evas_Object *btn = NULL;
+ /* Delete */
+ btn = _gl_but_create_but(parent, NULL, GL_STR_DELETE,
+ GL_BUTTON_STYLE_NAVI_TOOLBAR_RIGHT,
+ __gl_albums_edit_del_cb, data);
+ GL_CHECK_VAL(btn, -1);
+ elm_object_item_part_content_set(nf_it, GL_NAVIFRAME_BTN2, btn);
+ _gl_ui_disable_btn(btn);
+ /* Share */
+ btn = _gl_but_create_but(parent, NULL, GL_STR_SHARE,
+ GL_BUTTON_STYLE_NAVI_TOOLBAR_LEFT,
+ __gl_albums_edit_share_cb, data);
+ GL_CHECK_VAL(btn, -1);
+ elm_object_item_part_content_set(nf_it, GL_NAVIFRAME_BTN1, btn);
+ _gl_ui_disable_btn(btn);
+ return 0;
+}
+
+int _gl_albums_edit_create_view(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ GL_CHECK_VAL(ad->maininfo.naviframe, -1);
+
+ gl_set_view_mode(ad, GL_VIEW_ALBUMS_EDIT);
+
+ ad->ctrlinfo.ctrlbar_edit_ly = gl_ctrl_create_ctrlbar_view(ad->maininfo.naviframe);
+ GL_CHECK_VAL(ad->ctrlinfo.ctrlbar_edit_ly, -1);
+ ad->ctrlinfo.ctrlbar_edit_view = gl_albums_create_view(ad,
+ ad->ctrlinfo.ctrlbar_edit_ly);
+ if (ad->ctrlinfo.ctrlbar_edit_view == NULL) {
+ gl_dbgE("Failed to create view!");
+ evas_object_del(ad->ctrlinfo.ctrlbar_edit_ly);
+ ad->ctrlinfo.ctrlbar_edit_ly = NULL;
+ return -1;
+ }
+ elm_object_part_content_set(ad->ctrlinfo.ctrlbar_edit_ly,
+ "elm.swallow.view",
+ ad->ctrlinfo.ctrlbar_edit_view);
+ edje_object_signal_emit(_EDJ(ad->ctrlinfo.ctrlbar_edit_ly),
+ GL_SIGNAL_VIEW_EDIT, "elm");
+ /* Display 'Select all' widget */
+ gl_ui_show_selall(ad);
+ __gl_albums_edit_push_view(ad, ad->maininfo.naviframe,
+ ad->ctrlinfo.ctrlbar_edit_ly);
+ return 0;
+}
+
+int _gl_albums_edit_update_view(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ gl_dbg("");
+
+ _gl_data_update_cluster_list(data);
+
+ if (gl_check_gallery_empty(data) ||
+ ad->albuminfo.cluster_list->edit_cnt == 0) {
+ /* Remove invalid widgets */
+ gl_del_invalid_widgets(data, GL_INVALID_NONE);
+
+ gl_dbgW("None editable albums, show albums view!");
+ _gl_albums_edit_pop_view(data);
+ return 0;
+ }
+
+ int sel_cnt = _gl_data_get_albums_selected_cnt(data);
+ int invalid_m = GL_INVALID_NONE;
+ /* Album selected for rename was deleted */
+ if (sel_cnt == 0) {
+ /* None albums selected */
+ gl_dbgW("None albums selected!");
+ /* Disable control bar buttons */
+ _gl_ctrl_disable_btns(data, ad->ctrlinfo.nf_it_edit, true);
+ /* Remove invalid widgets */
+ gl_del_invalid_widgets(data, invalid_m);
+ }
+
+ /* Update edit view, other update view in cancel callback */
+ _gl_albums_create_items(data, ad->ctrlinfo.ctrlbar_edit_view);
+ gl_ctrl_rotate_ctrlbar(data, GL_VIEW_ALBUMS_EDIT);
+ /* Display selectioninfo */
+ _gl_notify_create_selinfo(data, ad->ctrlinfo.ctrlbar_edit_ly,
+ ad->ctrlinfo.nf_it_edit,
+ ad->albuminfo.albums_cnt, sel_cnt, true);
+ return 0;
+}
+
+int _gl_albums_edit_pop_view(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+
+ ad->albuminfo.selected_album = NULL;
+
+ elm_naviframe_item_pop_to(ad->ctrlinfo.nf_it);
+
+ _gl_destroy_ctrl_edit_view(data);
+
+ _gl_data_finalize_albums_selected_list(data);
+ /**
+ * after back to albums view from albums edit view,
+ * option header should be defaultly closed
+ */
+
+ _gl_data_get_cluster_list(data);
+ GL_CHECK_VAL(ad->albuminfo.cluster_list, -1);
+
+ gl_albums_change_to_view(data);
+ _gl_notify_destroy_selinfo(data);
+ if (gl_check_gallery_empty(data)) {
+ gl_ctrl_disable_ctrlbar(data, true);
+ _gl_ctrl_disable_btn(data, true, GL_NAVI_ALBUMS);
+ } else {
+ gl_ctrl_disable_ctrlbar(data, false);
+ if (ad->albuminfo.cluster_list->edit_cnt == 0) {
+ gl_dbg("None editable albums, disable items.");
+ _gl_ctrl_disable_btn(data, true, GL_NAVI_ALBUMS);
+ }
+ }
+
+ gl_ctrl_rotate_ctrlbar(data, GL_VIEW_ALBUMS);
+ return 0;
+}
+
+/* Share album's content */
+int _gl_albums_edit_share(void *data, const char *label)
+{
+ GL_CHECK_VAL(label, -1);
+ GL_CHECK_VAL(data, -1);
+ gl_dbg("label : %s ", label);
+
+ int cnt = _gl_data_get_albums_selected_cnt(data);
+ gl_dbg("Selected album(s) count: %d.", cnt);
+ if (cnt < 1) {
+ gl_dbgE("None album selected!");
+ gl_popup_create_popup(data, GL_POPUP_NOBUT,
+ GL_STR_NO_ALBUMS_SELECTED);
+ return -1;
+ }
+ if (_gl_data_is_albums_selected_empty(data)) {
+ gl_dbgE("None thumb selected!");
+ gl_popup_create_popup(data, GL_POPUP_NOBUT,
+ GL_STR_NO_FILES_SELECTED);
+ return -1;
+ }
+
+ return _gl_share_load(data, label);
+}
+
+int _gl_albums_edit_update_lang(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ GL_CHECK_VAL(ad->ctrlinfo.nf_it_edit, -1);
+
+ /*Reset select info text*/
+ int cnt = _gl_data_get_albums_selected_cnt(ad);
+ _gl_notify_update_lang(ad, cnt, GL_VIEW_ALBUMS_EDIT);
+
+ if (ad->popupinfo.popup) {
+ if (ad->popupinfo.popup_mode == GL_POPUP_ALBUM_DELETE)
+ gl_popup_create_albums_del_popup(data);
+ else if (ad->popupinfo.popup_mode == GL_POPUP_NOBUT)
+ gl_popup_create_popup(ad, GL_POPUP_NOBUT,
+ GL_STR_NO_ALBUMS_SELECTED);
+ }
+
+ /*Album view or 3D normal view*/
+ _gl_ui_set_btns_text(ad->ctrlinfo.nf_it_edit, GL_STR_SHARE,
+ GL_STR_DELETE);
+ return 0;
+}
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "gl-debug.h"
+#include "gl-fs.h"
+#include "gl-albums-new.h"
+#include "gl-albums.h"
+#include "gl-ui-util.h"
+#include "gl-util.h"
+#include "gl-data.h"
+#include "gl-controlbar.h"
+#include "gl-editfield.h"
+#include "gl-button.h"
+#include "gl-popup.h"
+#include "gl-strings.h"
+#include "gl-fs.h"
+
+static void __gl_albums_new_cancel_cb(void *data, Evas_Object *obj,
+ void *event_info)
+{
+ GL_CHECK(obj);
+ GL_CHECK(data);
+ gl_dbg("");
+ /* Delete callback when it is clicked to prevent it is called for many times */
+ evas_object_smart_callback_del(obj, "clicked",
+ __gl_albums_new_cancel_cb);
+ _gl_albums_new_pop_view(data);
+}
+
+static void __gl_albums_new_done_cb(void *data, Evas_Object *obj,
+ void *event_info)
+{
+ GL_CHECK(obj);
+ GL_CHECK(data);
+ gl_dbg("");
+ /* Delete callback when it is clicked to prevent it is called for many times */
+ if (_gl_albums_new_process(data, false) == 0)
+ evas_object_smart_callback_del(obj, "clicked",
+ __gl_albums_new_done_cb);
+}
+
+/**
+ * Use naviframe api to push new album view to stack.
+ * @param obj is the content to be pushed.
+ */
+static int __gl_albums_new_push_view(void *data, Evas_Object *parent,
+ Evas_Object *obj, char *title)
+{
+ gl_dbg("GL_NAVI_ALBUMS_NEW");
+ GL_CHECK_VAL(obj, -1);
+ GL_CHECK_VAL(parent, -1);
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ Elm_Object_Item *nf_it = NULL;
+ Evas_Object *done_btn = NULL;
+ Evas_Object *cancel_btn = NULL;
+ Evas_Object *end_btn = NULL;
+
+ end_btn = _gl_but_create_but(parent, NULL, NULL,
+ GL_BUTTON_STYLE_NAVI_PRE,
+ __gl_albums_new_cancel_cb, data);
+ GL_CHECK_VAL(end_btn, -1);
+
+ nf_it = elm_naviframe_item_push(parent, title, end_btn, NULL, obj,
+ NULL);
+ ad->entryinfo.nf_it = nf_it;
+ /* Add 'Cancel' button */
+ cancel_btn = _gl_but_create_but(parent, NULL, NULL,
+ GL_BUTTON_STYLE_NAVI_PRE,
+ __gl_albums_new_cancel_cb, data);
+ GL_CHECK_VAL(cancel_btn, -1);
+ elm_object_item_part_content_set(nf_it, GL_NAVIFRAME_TITLE_PREV_BTN,
+ cancel_btn);
+ /* Add 'Done' button */
+ done_btn = _gl_but_create_but(parent, NULL, GL_STR_DONE,
+ GL_BUTTON_STYLE_NAVI_TITLE,
+ __gl_albums_new_done_cb, data);
+ GL_CHECK_VAL(done_btn, -1);
+ elm_object_item_part_content_set(nf_it, GL_NAVIFRAME_BTN1, done_btn);
+ ad->entryinfo.done_btn = done_btn;
+
+ /* Add callbacks to show/hide title toolbar */
+ _gl_ui_add_conform_cbs(parent);
+ return 0;
+}
+
+int _gl_albums_new_create_view(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ GL_CHECK_VAL(ad->maininfo.naviframe, -1);
+ Evas_Object *editfield_ly = NULL;
+ gl_dbg("");
+
+ ad->entryinfo.entry_mode = GL_ENTRY_NEW_ALBUM;
+ editfield_ly = gl_ctrl_create_ctrlbar_view(ad->maininfo.naviframe);
+ GL_CHECK_VAL(data, -1);
+ Evas_Object *entry = _gl_editfield_create(ad, editfield_ly, NULL);
+ if (entry == NULL) {
+ gl_dbgE("Failed to add entry!");
+ evas_object_del(editfield_ly);
+ ad->entryinfo.entry_mode = GL_ENTRY_NONE;
+ return -1;
+ }
+ elm_object_part_content_set(editfield_ly, "elm.swallow.view", entry);
+ edje_object_signal_emit(_EDJ(editfield_ly), GL_SIGNAL_VIEW_DEFAULT,
+ "elm");
+ __gl_albums_new_push_view(ad, ad->maininfo.naviframe, editfield_ly,
+ GL_STR_CREATE_ALBUM);
+ _gl_editfield_show_imf(ad);
+ return 0;
+}
+
+int _gl_albums_new_pop_view(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ gl_dbg("");
+
+ elm_naviframe_item_pop(ad->maininfo.naviframe);
+ _gl_editfield_destroy_imf(ad);
+
+ gl_ui_update_select_widgets(ad);
+
+ return 0;
+}
+
+/*
+* @param b_enter
+* True: Enter key on Keyboard pressed, False: Button Done clicked
+*/
+int _gl_albums_new_process(void *data, bool b_enter)
+{
+ gl_dbg("b_enter: %d", b_enter);
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+
+ if (ad->entryinfo.editfield == NULL) {
+ gl_dbgE("Edit filed is NULL");
+ goto NEW_ALBUM_FAILED;
+ }
+
+ if (ad->entryinfo.imf_context)
+ ecore_imf_context_input_panel_hide(ad->entryinfo.imf_context);
+
+ Evas_Object *entry = ad->entryinfo.imf_entry;
+ char name[GL_ALBUM_NAME_LEN_MAX] = { 0, };
+
+ /* Get utf8 format string */
+ if (gl_get_entry_text(entry, name, GL_ALBUM_NAME_LEN_MAX) != 0) {
+ gl_dbgE("Get entry text failed!");
+ goto NEW_ALBUM_FAILED;
+ }
+
+ /* Get valid name */
+ if (_gl_get_valid_album_name(ad, name, true, b_enter) != 0) {
+ if (b_enter)
+ _gl_editfield_hide_imf(ad);
+ return -1;
+ }
+ gl_dbg("Valid album name: %s", name);
+
+ /* Check whether the new folder exist */
+ char new_path[GL_DIR_PATH_LEN_MAX] = { 0, };
+ char parent[GL_DIR_PATH_LEN_MAX] = { 0, };
+
+ /* Get default images new_path, make new album under it */
+ if (_gl_fs_get_default_folder(parent) != 0) {
+ gl_dbgE("Failed to get default image dir new_path!");
+ goto NEW_ALBUM_FAILED;
+ }
+
+ /* Make dir full new_path of new album */
+ snprintf(new_path, GL_DIR_PATH_LEN_MAX, "%s/%s", parent, name);
+ gl_dbg("New dir new_path: %s", new_path);
+#ifdef _RENAME_ALBUM_SENSITIVE
+ if (_gl_fs_check_name_case(new_path, name))
+#endif
+ {
+ memset(new_path, 0x00, GL_DIR_PATH_LEN_MAX);
+ snprintf(new_path, GL_DIR_PATH_LEN_MAX, "%s/%s", parent, name);
+ gl_dbg("New dir new_path: %s", new_path);
+ int res = ecore_file_dir_is_empty(new_path);
+ /**
+ * If dir is empty, 1 is returned,
+ * if it contains at least 1 file, 0 is returned.
+ * On failure, -1 is returned.
+ */
+ gl_dbg("ecore_file_dir_is_empty return value: %d", res);
+ if (res == 0) {
+ char *popup_desc;
+ popup_desc = (char*)calloc(GL_POPUP_STRING_MAX,
+ sizeof(char));
+ if (popup_desc == NULL) {
+ gl_dbgE("memory allocation fail!");
+ return -1;
+ }
+
+ snprintf(popup_desc, GL_POPUP_STRING_MAX, "%s.<br>%s",
+ GL_STR_SAME_NAME_ALREADY_IN_USE,
+ GL_STR_RETRY_Q);
+ popup_desc[strlen(popup_desc)] = '\0';
+ gl_popup_create_popup(ad, GL_POPUP_ALBUM_NEW_DUPLICATE,
+ popup_desc);
+ GL_FREE(popup_desc);
+ gl_dbgW("New folder already exists!");
+ return -1;
+ }
+ }
+
+ /* Save new album name */
+ char* new_album = ad->albuminfo.new_album_name;
+ g_strlcpy(new_album, name, GL_ALBUM_NAME_LEN_MAX);
+ new_album[GL_ALBUM_NAME_LEN_MAX - 1] = '\0';
+ _gl_editfield_destroy_imf(ad);
+
+ /* Move/Save files to dest album */
+ gl_move_to_album(ad);
+ return 0;
+
+ NEW_ALBUM_FAILED:
+ _gl_albums_new_pop_view(ad);
+ return -1;
+}
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "gl-debug.h"
+#include "gl-fs.h"
+#include "gl-albums-rename.h"
+#include "gl-albums.h"
+#include "gl-albums-edit.h"
+#include "gl-ui-util.h"
+#include "gl-util.h"
+#include "gl-controlbar.h"
+#include "gl-editfield.h"
+#include "gl-button.h"
+#include "gl-popup.h"
+#include "gl-strings.h"
+#include "gl-fs.h"
+
+static void __gl_albums_rename_trans_finished_cb(void *data, Evas_Object *obj,
+ void *event_info)
+{
+ GL_CHECK(data);
+ gl_appdata *ad = (gl_appdata *)data;
+ int view_mode = gl_get_view_mode(ad);
+ gl_dbgW("view_mode: %d", view_mode);
+
+ evas_object_smart_callback_del(obj, GL_TRANS_FINISHED,
+ __gl_albums_rename_trans_finished_cb);
+
+ /* Clear previous view after animation finished */
+ if (view_mode == GL_VIEW_ALBUMS_RENAME)
+ elm_gengrid_clear(ad->ctrlinfo.ctrlbar_edit_view);
+ else
+ gl_dbgE("Wrong view mode!");
+}
+
+static void __gl_albums_rename_cancel_cb(void *data, Evas_Object *obj,
+ void *event_info)
+{
+ GL_CHECK(obj);
+ GL_CHECK(data);
+ gl_dbg("");
+ /* Delete callback when it is clicked to prevent it is called for many times */
+ evas_object_smart_callback_del(obj, "clicked",
+ __gl_albums_rename_cancel_cb);
+ _gl_albums_rename_pop_view(data);
+}
+
+static void __gl_albums_rename_done_cb(void *data, Evas_Object *obj,
+ void *event_info)
+{
+ GL_CHECK(obj);
+ GL_CHECK(data);
+ gl_dbg("");
+ /* Delete callback when it is clicked to prevent it is called for many times*/
+ if (_gl_albums_rename_process(data, false) == 0)
+ evas_object_smart_callback_del(obj, "clicked",
+ __gl_albums_rename_done_cb);
+}
+
+/**
+ * Use naviframe api to push albums rename view to stack.
+ * @param obj is the content to be pushed.
+ */
+static int __gl_albums_rename_push_view(void *data, Evas_Object *parent,
+ Evas_Object *obj, char *title)
+{
+ gl_dbg("GL_NAVI_ALBUMS_RENAME");
+ GL_CHECK_VAL(obj, -1);
+ GL_CHECK_VAL(parent, -1);
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ Elm_Object_Item *nf_it = NULL;
+ Evas_Object *done_btn = NULL;
+ Evas_Object *end_btn = NULL;
+
+ _gl_ctrl_show_tabbar(ad, false);
+
+ /* Add transition finished callback */
+ evas_object_smart_callback_add(parent, GL_TRANS_FINISHED,
+ __gl_albums_rename_trans_finished_cb,
+ data);
+ end_btn = _gl_but_create_but(parent, NULL, NULL,
+ GL_BUTTON_STYLE_NAVI_PRE,
+ __gl_albums_rename_cancel_cb, data);
+ GL_CHECK_VAL(end_btn, -1);
+
+ nf_it = elm_naviframe_item_push(parent, title, end_btn, NULL, obj,
+ NULL);
+ /* Add 'Done' button */
+ done_btn = _gl_but_create_but(parent, NULL, GL_STR_DONE,
+ GL_BUTTON_STYLE_NAVI_TOOLBAR,
+ __gl_albums_rename_done_cb, data);
+ GL_CHECK_VAL(done_btn, -1);
+ elm_object_item_part_content_set(nf_it, GL_NAVIFRAME_BTN1, done_btn);
+ ad->entryinfo.done_btn = done_btn;
+ ad->entryinfo.nf_it = nf_it;
+
+ /* Add callbacks to show/hide title toolbar */
+ _gl_ui_add_conform_cbs(parent);
+ return 0;
+}
+
+int _gl_albums_rename_create_view(void *data, gl_cluster *album)
+{
+ GL_CHECK_VAL(album, -1);
+ GL_CHECK_VAL(album->cluster, -1);
+ GL_CHECK_VAL(album->cluster->display_name, -1);
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ GL_CHECK_VAL(ad->maininfo.naviframe, -1);
+ Evas_Object *editfield_ly = NULL;
+ int view_mode = gl_get_view_mode(data);
+ gl_dbg("");
+
+ if(ad->maininfo.rename_album_job) {
+ ecore_job_del(ad->maininfo.rename_album_job);
+ ad->maininfo.rename_album_job = NULL;
+ }
+ if (view_mode != GL_VIEW_ALBUMS_EDIT) {
+ gl_dbgE("Unexpected view mode(%d)!", view_mode);
+ return -1;
+ }
+
+ gl_set_view_mode(data, GL_VIEW_ALBUMS_RENAME);
+ ad->entryinfo.entry_mode = GL_ENTRY_RENAME_ALBUM;
+
+ editfield_ly = gl_ctrl_create_ctrlbar_view(ad->maininfo.naviframe);
+ GL_CHECK_VAL(editfield_ly, -1);
+ Evas_Object *entry = _gl_editfield_create(data, editfield_ly,
+ album->cluster->display_name);
+ if (entry == NULL) {
+ gl_dbgE("Failed to add entry!");
+ gl_set_view_mode(data, view_mode);
+ ad->entryinfo.entry_mode = GL_ENTRY_NONE;
+ evas_object_del(editfield_ly);
+ return -1;
+ }
+
+ elm_object_part_content_set(editfield_ly, "elm.swallow.view", entry);
+ edje_object_signal_emit(_EDJ(editfield_ly), GL_SIGNAL_VIEW_DEFAULT,
+ "elm");
+ __gl_albums_rename_push_view(data, ad->maininfo.naviframe, editfield_ly,
+ GL_STR_CHNAGE_NAME);
+ _gl_editfield_show_imf(data);
+ return 0;
+}
+
+int _gl_albums_rename_update_view(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ gl_dbg("");
+
+ _gl_data_update_cluster_list(data);
+
+ if (gl_check_gallery_empty(data) ||
+ ad->albuminfo.cluster_list->edit_cnt == 0) {
+ /* Remove invalid widgets */
+ gl_del_invalid_widgets(data, GL_INVALID_NONE);
+
+ gl_dbgW("None editable albums, show albums view!");
+ _gl_albums_edit_pop_view(data);
+ return 0;
+ }
+
+ /* Album selected for rename was deleted */
+ if (ad->albuminfo.selected_album == NULL) {
+ gl_dbgW("Rename invalid album!");
+ /* Remove rename view */
+ _gl_albums_rename_pop_view(data);
+ return 0;
+ }
+
+ /* Cluster list updated, clear view */
+ elm_gengrid_clear(ad->ctrlinfo.ctrlbar_edit_view);
+ return 0;
+}
+
+int _gl_albums_rename_pop_view(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ GL_CHECK_VAL(ad->maininfo.naviframe, -1);
+ gl_dbg("");
+
+ /* Hide title from animation */
+ gl_ui_set_navi_title_visible(data, EINA_FALSE);
+ ad->albuminfo.selected_album = NULL;
+ gl_set_view_mode(data, GL_VIEW_ALBUMS_EDIT);
+ /* manually popup view after rename album */
+ elm_naviframe_item_pop(ad->maininfo.naviframe);
+ /* Recover the previous UI */
+ gl_ctrl_rotate_ctrlbar(data, GL_VIEW_ALBUMS_EDIT);
+ _gl_editfield_destroy_imf(data);
+ /* Update edit view */
+ gl_albums_update_items(data);
+ return 0;
+}
+
+/*
+* @param b_enter
+* True: Enter key on Keyboard pressed, False: Button Done clicked
+*/
+int _gl_albums_rename_process(void *data, bool b_enter)
+{
+ gl_dbg("b_enter: %d", b_enter);
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ bool b_root_path = false;
+ gl_cluster *album_item = NULL;
+
+ if (gl_get_view_mode(ad) != GL_VIEW_ALBUMS_RENAME) {
+ gl_dbgE("View mode is wrong!");
+ goto RENAME_FAILED;
+ }
+
+ album_item = ad->albuminfo.selected_album;
+ if (album_item == NULL || album_item->cluster == NULL ||
+ album_item->cluster->uuid == NULL) {
+ gl_dbgE("selected_album is NULL!");
+ goto RENAME_FAILED;
+ }
+
+ char name[GL_FILE_NAME_LEN_MAX] = { 0, };
+ /* Get utf8 format string */
+ int ret = -1;
+ ret = gl_get_entry_text(ad->entryinfo.imf_entry, name,
+ GL_FILE_NAME_LEN_MAX);
+ if (ret != 0) {
+ gl_dbgE("Get entry text failed!");
+ goto RENAME_FAILED;
+ }
+
+ /* Get valid name */
+ if (_gl_get_valid_album_name(ad, name, false, b_enter) != 0) {
+ if (b_enter)
+ _gl_editfield_hide_imf(ad);
+ return -1;
+ }
+
+ gl_dbg("Valid album name: %s", name);
+ /* Get src folder path */
+ char old_path[GL_DIR_PATH_LEN_MAX] = { 0, };
+ if (album_item->cluster->path) {
+ g_strlcpy(old_path, album_item->cluster->path,
+ GL_DIR_PATH_LEN_MAX);
+ gl_dbg("Src folder: %s", old_path);
+ if (_gl_data_is_root_path(old_path)) {
+ /**
+ * Root path, couldn't rename root path,
+ * make the new dest folder
+ * and move all files for root path to it.
+ */
+ gl_dbg("Rename [No Name] album's name.");
+ b_root_path = true;
+ }
+ } else {
+ gl_dbgE("gl_db_get_folder_fullpath failed(%d)!", ret);
+ goto RENAME_FAILED;
+ }
+
+ /* Get dest folder path */
+ char new_path[GL_DIR_PATH_LEN_MAX] = { 0, };
+ char parent[GL_DIR_PATH_LEN_MAX] = { 0, };
+
+ if (b_root_path) {
+ /* Get default images path, make dest foler under it */
+ char default_path[GL_DIR_PATH_LEN_MAX] = { 0, };
+ if (_gl_fs_get_default_folder(default_path) != 0) {
+ gl_dbgW("Failed to get default images path!");
+ goto RENAME_FAILED;
+ }
+
+ snprintf(new_path, GL_DIR_PATH_LEN_MAX, "%s/%s", default_path,
+ name);
+ new_path[strlen(new_path)] = '\0';
+ g_strlcpy(parent, default_path, GL_DIR_PATH_LEN_MAX);
+ } else {
+ g_strlcpy(new_path, old_path, GL_DIR_PATH_LEN_MAX);
+ g_strlcpy(parent, old_path, GL_DIR_PATH_LEN_MAX);
+
+ int i = 0;
+ int length = strlen(old_path);
+ for (i = length; i >= 0; i--) {
+ if (new_path[i] == '/') {
+ gl_dbg("length=%d, i=%d", length, i);
+ /* Path like "/root/abc/" */
+ if (i == length - 1)
+ continue;
+ memcpy(&new_path[i + 1], name, strlen(name));
+ new_path[i + 1 + strlen(name)] = '\0';
+ parent[i] = '\0';
+ break;
+ }
+ }
+ }
+
+ gl_dbg("Dest folder: %s", new_path);
+#ifdef _RENAME_ALBUM_SENSITIVE
+ if (!strcasecmp(old_path, new_path))
+#else
+ if (!g_strcmp0(old_path, new_path))
+#endif
+ {
+ gl_dbgW("Same as current name!");
+ goto RENAME_FAILED;
+ }
+
+ /**
+ * If dir is empty, 1 is returned,
+ * if it contains at least 1 file, 0 is returned.
+ * On failure, -1 is returned.
+ */
+#ifdef _RENAME_ALBUM_SENSITIVE
+ if (_gl_fs_check_name_case(new_path, name))
+#endif
+ {
+ memset(new_path, 0x00, GL_DIR_PATH_LEN_MAX);
+ snprintf(new_path, GL_DIR_PATH_LEN_MAX, "%s/%s", parent, name);
+ gl_dbg("New dir path: %s", new_path);
+ int res = ecore_file_dir_is_empty(new_path);
+ gl_dbg("ecore_file_dir_is_empty return value: %d", res);
+ if (res == 0) {
+ char *popup_desc;
+ popup_desc = (char*)calloc(GL_POPUP_STRING_MAX,
+ sizeof(char));
+ if (popup_desc == NULL) {
+ gl_dbgE("memory allocation fail!");
+ return -1;
+ }
+
+ snprintf(popup_desc, GL_POPUP_STRING_MAX, "%s.<br>%s",
+ GL_STR_SAME_NAME_ALREADY_IN_USE, GL_STR_RETRY_Q);
+ popup_desc[strlen(popup_desc)] = '\0';
+ gl_popup_create_popup(ad, GL_POPUP_ALBUM_RENAME_DUPLICATE,
+ popup_desc);
+ GL_FREE(popup_desc);
+ gl_dbgW("New folder already exists!");
+ return -1;
+ }
+ }
+
+ if (b_root_path) {
+ /**
+ * Case 1: Rename virtual album 'No Name'.
+ * It couldn't be done by updating album record in DB directly.
+ * Cuz it would change the folder path of all folder records,
+ * to make them invalid.
+ *
+ * Create new folder under default images path,
+ * Move all medias under root path to new folder.
+ */
+ if (gl_make_new_album(name) != 0) {
+ gl_popup_create_popup(ad, GL_POPUP_NOBUT,
+ GL_STR_UNABLE_tO_RENAME);
+ gl_dbgE("Failed to make a new directory!");
+ goto RENAME_FAILED;
+ }
+
+ /* Move medias from 'No Name' album to new album */
+ if (gl_move_root_album(ad, album_item, new_path) != 0) {
+ gl_dbg("gl_move_root_album failed!");
+ gl_popup_create_popup(ad, GL_POPUP_NOBUT,
+ GL_STR_UNABLE_tO_RENAME);
+ goto RENAME_FAILED;
+ } else {
+ gl_dbg("New album added, update albums list.");
+ ad->albuminfo.selected_album = NULL;
+ _gl_data_update_cluster_list(ad);
+ }
+ } else {
+ /**
+ * Case 2: Rename normal album. Update album record in DB.
+ */
+ media_folder_set_name(album_item->cluster->folder_h, name);
+ ret = media_folder_update_to_db(album_item->cluster->folder_h);
+ if (ret < 0) {
+ gl_dbg("media_folder_set_name failed (%d)!", ret);
+ goto RENAME_FAILED;
+ }
+
+ /**
+ * Change folder name in file system
+ * for some special name, DB update success, but file mv failed.
+ * So, do this first.
+ */
+ if (ecore_file_exists(old_path)) {
+ if (!ecore_file_mv(old_path, new_path))
+ gl_dbg("ecore_file_mv failed!");
+ } else {
+ gl_dbgW("Source folder path doesn't exist!");
+ }
+ }
+ /* Update memory */
+ if (!b_root_path) {
+ GL_FREEIF(album_item->cluster->display_name);
+ album_item->cluster->display_name = strdup(name);
+ }
+
+ if (album_item->cluster->path) {
+ free(album_item->cluster->path);
+ album_item->cluster->path = strdup(new_path);
+ }
+
+ _gl_albums_rename_pop_view(ad);
+ return 0;
+
+ RENAME_FAILED:
+ _gl_albums_rename_pop_view(ad);
+ return -1;
+}
+
+int _gl_albums_rename_update_lang(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ GL_CHECK_VAL(ad->entryinfo.nf_it, -1);
+
+ elm_object_item_text_set(ad->entryinfo.nf_it, GL_STR_CHNAGE_NAME);
+ if (ad->popupinfo.popup) {
+ char *popup_desc = (char*)calloc(GL_POPUP_STRING_MAX,
+ sizeof(char));
+ snprintf(popup_desc, GL_POPUP_STRING_MAX, "%s.<br>%s",
+ GL_STR_SAME_NAME_ALREADY_IN_USE, GL_STR_RETRY_Q);
+ popup_desc[strlen(popup_desc)] = '\0';
+ gl_popup_create_popup(ad, GL_POPUP_ALBUM_RENAME_DUPLICATE,
+ popup_desc);
+ GL_FREE(popup_desc);
+ }
+
+ return 0;
+}
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "gl-debug.h"
+#include "gl-albums-sel.h"
+#include "gl-ui-util.h"
+#include "gl-util.h"
+#include "gl-data.h"
+#include "gl-controlbar.h"
+#include "gl-button.h"
+#include "gl-nocontents.h"
+#include "gl-notify.h"
+#include "gl-strings.h"
+#include "gl-albums.h"
+#include "gl-tags.h"
+#include "gl-thumbs.h"
+
+static void __gl_albums_sel_trans_finished_cb(void *data, Evas_Object *obj,
+ void *event_info)
+{
+ GL_CHECK(data);
+ gl_appdata *ad = (gl_appdata *)data;
+ int view_mode = gl_get_view_mode(ad);
+ gl_dbgW("view_mode: %d", view_mode);
+ evas_object_smart_callback_del(obj, GL_TRANS_FINISHED,
+ __gl_albums_sel_trans_finished_cb);
+
+ /* Clear previous view after animation finished */
+ if (view_mode == GL_VIEW_ALBUMS_SELECT) {
+ if (ad->gridinfo.all_grid_nocontents == NULL)
+ elm_gengrid_clear(ad->gridinfo.all_grid_view);
+ } else {
+ gl_dbgE("Wrong view mode!");
+ }
+}
+
+/* callback after user tap Cancel button in option header in select album view */
+static void __gl_albums_sel_cancel_cb(void *data, Evas_Object *obj,
+ void *event_info)
+{
+ GL_CHECK(obj);
+ GL_CHECK(data);
+ gl_dbg("");
+ /* Disable item when it is clicked to prevent it is called for many times */
+ if (_gl_albums_sel_pop_view(data) == 0)
+ _gl_ui_disable_btn(obj);
+}
+
+/**
+ * Use naviframe api to push new album view to stack.
+ * @param obj is the content to be pushed.
+ */
+static int __gl_albums_sel_push_view(void *data, Evas_Object *parent,
+ Evas_Object *obj, char *title)
+{
+ gl_dbg("GL_NAVI_ALBUMS_SELECT");
+ GL_CHECK_VAL(obj, -1);
+ GL_CHECK_VAL(parent, -1);
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ Elm_Object_Item *nf_it = NULL;
+
+ /* Add transition finished callback */
+ evas_object_smart_callback_add(parent, GL_TRANS_FINISHED,
+ __gl_albums_sel_trans_finished_cb, data);
+ Evas_Object *end_btn = NULL;
+ end_btn = _gl_but_create_but(parent, NULL, NULL,
+ GL_BUTTON_STYLE_NAVI_PRE,
+ __gl_albums_sel_cancel_cb, data);
+ GL_CHECK_VAL(end_btn, -1);
+ /* Push to stack */
+ nf_it = elm_naviframe_item_push(parent, title, end_btn, NULL, obj,
+ NULL);
+ ad->albuminfo.nf_it_select = nf_it;
+ return 0;
+}
+
+/* Free data after layout deleted */
+static void __gl_albums_sel_delete_layout_cb(void *data, Evas *e,
+ Evas_Object *obj, void *ei)
+{
+ gl_dbg("Delete layout ---");
+ GL_CHECK(data);
+ gl_appdata *ad = (gl_appdata *)data;
+ _gl_ui_del_scroller_pos(ad->albuminfo.select_view);
+ gl_dbg("Delete layout +++");
+}
+
+int _gl_albums_sel_create_view(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ GL_CHECK_VAL(ad->maininfo.naviframe, -1);
+ gl_dbg("");
+
+ /* Create tags view layout for Select album */
+ Evas_Object *layout = NULL;
+ layout = gl_ctrl_create_ctrlbar_view(ad->maininfo.naviframe);
+ GL_CHECK_VAL(layout, -1);
+ evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND,
+ EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ /* Register delete callback */
+ evas_object_event_callback_add(layout, EVAS_CALLBACK_DEL,
+ __gl_albums_sel_delete_layout_cb, data);
+ /* Save view mode */
+ int pre_view_m = gl_get_view_mode(data);
+ /* Set view mode of Select album */
+ gl_set_view_mode(data, GL_VIEW_ALBUMS_SELECT);
+ Evas_Object *view = NULL;
+ /* Get latest cluster list */
+ _gl_data_get_cluster_list(data);
+ /* Create tags view for Select album */
+ view = gl_albums_create_view(data, layout);
+ if (view == NULL) {
+ evas_object_del(layout);
+ /* Reset view mode */
+ gl_set_view_mode(data, pre_view_m);
+ return -1;
+ }
+
+ /* Set view to layout */
+ elm_object_part_content_set(layout, "elm.swallow.view", view);
+ __gl_albums_sel_push_view(data, ad->maininfo.naviframe, layout,
+ GL_STR_SELECT_ALBUM);
+ /* Send signal to show different layout */
+ edje_object_signal_emit(_EDJ(layout), GL_SIGNAL_VIEW_DEFAULT, "elm");
+ /* Save pointer of View and Layout */
+ ad->albuminfo.select_view = view;
+ ad->albuminfo.select_view_ly = layout;
+ gl_dbg("Done");
+ return 0;
+}
+
+int _gl_albums_sel_update_view(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+
+ /* Update albums list */
+ gl_refresh_albums_list(data);
+ /* Append griditems */
+ _gl_albums_create_items(data, ad->albuminfo.select_view);
+
+ if (ad->albuminfo.albums_cnt == 0) {
+ gl_dbgE("None albums for selection!");
+ GL_CHECK_VAL(ad->taginfo.current_tag, -1);
+ gl_tag *cur_tag = ad->taginfo.current_tag;
+ GL_CHECK_VAL(cur_tag->tag, -1);
+ /* Update item list */
+ if (cur_tag->tag->_id == GL_TAG_FAVORITES_ID)
+ _gl_data_get_item_list(data, GL_CATEGORY_FAVORITES,
+ NULL, GL_GET_ALL_RECORDS,
+ GL_GET_ALL_RECORDS);
+ else
+ _gl_data_get_item_list_tagname(data, cur_tag->tag->_id,
+ true, NULL);
+ if (ad->maininfo.medias_cnt == 0) {
+ ad->albuminfo.select_view = NULL;
+ ad->albuminfo.select_view_ly = NULL;
+ ad->albuminfo.nf_it_select = NULL;
+ /* Show tags view */
+ gl_dbg("Change to tags view");
+ _gl_tag_comeback_from_view(data);
+
+ elm_naviframe_item_pop_to(ad->ctrlinfo.nf_it);
+ if (!_gl_data_get_tag_count_all(data))
+ _gl_ctrl_disable_btn(data, true, GL_NAVI_TAGS);
+ return 0;
+ }
+ /* change to previous view */
+ _gl_albums_sel_pop_view(data);
+ }
+ return 0;
+}
+
+/* callback after user tap Cancel button in option header in select album view */
+int _gl_albums_sel_pop_view(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+
+ /* Popup naviframe item */
+ elm_naviframe_item_pop_to(ad->gridinfo.nf_it);
+ ad->albuminfo.select_view = NULL;
+ ad->albuminfo.select_view_ly = NULL;
+ ad->albuminfo.nf_it_select = NULL;
+
+ GL_CHECK_VAL(ad->taginfo.current_tag, -1);
+ /* Update new medias list */
+ gl_dbg("Update items list");
+ if (ad->taginfo.current_tag->tag->_id == GL_TAG_FAVORITES_ID)
+ _gl_data_get_item_list(ad, GL_CATEGORY_FAVORITES, NULL,
+ GL_GET_ALL_RECORDS, GL_GET_ALL_RECORDS);
+ else
+ _gl_data_get_item_list_tagname(ad,
+ ad->taginfo.current_tag->tag->_id,
+ true, NULL);
+
+ /* Reset view mode and update edit view */
+ gl_set_view_mode(ad, GL_VIEW_THUMBS);
+ if (_gl_thumbs_show_view(ad) != 0) {
+ _gl_nocontents_show(ad);
+ _gl_notify_destroy_selinfo(ad);
+ }
+ return 0;
+}
+
+int _gl_albums_sel_update_lang(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ GL_CHECK_VAL(ad->albuminfo.nf_it_select, -1);
+ gl_dbg("");
+ elm_object_item_text_set(ad->albuminfo.nf_it_select,
+ GL_STR_SELECT_ALBUM);
+ return 0;
+}
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "gl-debug.h"
+#include "gl-albums.h"
+#include "gl-thumbs.h"
+#include "gl-controlbar.h"
+#include "gl-ui-util.h"
+#include "gl-util.h"
+#include "gl-drm.h"
+#include "gl-button.h"
+#include "gl-data.h"
+#include "gl-popup.h"
+#include "gl-progressbar.h"
+#include "gl-tags.h"
+#include "gl-tile.h"
+#include "gl-thumbs-sel.h"
+#include "gl-thumbs-edit.h"
+#include "gl-albums-sel.h"
+#include "gl-albums-edit.h"
+#include "gl-albums-rename.h"
+#include "gl-strings.h"
+#include "gl-nocontents.h"
+#include "gl-notify.h"
+#ifdef _USE_ROTATE_BG
+#include "gl-rotate-bg.h"
+#include "gl-exif.h"
+#endif
+
+void _gl_albums_realized(void *data, Evas_Object *obj, void *event_info)
+{
+ gl_dbg_launch(" realized");
+}
+
+static void _gl_albums_comeback_from_view_cb(void *data, Evas_Object *obj,
+ void *event_info)
+{
+ GL_CHECK(data);
+ gl_appdata *ad = (gl_appdata *)data;
+ gl_dbg("");
+
+ /* Delete callback when it is clicked to prevent it is called for many times */
+ evas_object_smart_callback_del(obj, "clicked",
+ _gl_albums_comeback_from_view_cb);
+
+ /* Hide title from animation */
+ gl_ui_set_navi_title_visible(ad, EINA_FALSE);
+ ad->albuminfo.aul_launch_type = GL_AUL_T_NONE;
+ if (_gl_data_check_update(ad, true))
+ gl_refresh_albums_list(ad);
+
+ gl_albums_comeback_from_view(ad);
+
+ _gl_ctrl_disable_btn(ad, false, GL_NAVI_ALBUMS);
+}
+
+/**
+* @Brif Update checkbox state and album cover and update selectioninfo.
+*
+* @Param data gl_appdata.
+* @Param album_item album item.
+* @Param check_obj object of checkbox.
+* @Param b_ck_box true: Checkbox selection, false: album cover selection.
+*/
+static int _gl_albums_update_check_state(void *data,
+ gl_cluster *album_item,
+ Evas_Object *check_obj, bool b_ck_box)
+{
+ GL_CHECK_VAL(album_item, -1);
+ GL_CHECK_VAL(album_item->cluster, -1);
+ GL_CHECK_VAL(album_item->cluster->uuid, -1);
+ GL_CHECK_VAL(check_obj, -1);
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ gl_dbg("Select checkbox[1]/album_cover[0]: %d.", b_ck_box);
+
+ /* Update state of checkbox */
+ album_item->checked = !album_item->checked;
+ gl_dbg("album (%s) check state: %d", album_item->cluster->display_name,
+ album_item->checked);
+
+ /**
+ * If album cover selected, update checkbox icon manually,
+ * If checkbox selected, its icon is updated by system automatically.
+ */
+ Evas_Object *ck = NULL;
+ if (b_ck_box == false)
+ ck = elm_object_item_part_content_get(album_item->item,
+ GL_TILE_CHECKBOX);
+ else
+ ck = elm_object_item_part_content_get(album_item->item,
+ GL_TILE_CHECKBOX_GRID);
+ elm_check_state_set(ck, album_item->checked);
+
+ if (album_item->checked) {
+ gl_dbg("Append:%s, id:%s", album_item->cluster->display_name,
+ album_item->cluster->uuid);
+ _gl_data_albums_selected_list_append(ad, album_item);
+ } else {
+ gl_dbg("Remove:%s, id:%s", album_item->cluster->display_name,
+ album_item->cluster->uuid);
+ _gl_data_albums_selected_list_remove(ad, album_item);
+ }
+
+ /* Display selectioninfo */
+ int cnt = _gl_data_get_albums_selected_cnt(ad);
+ _gl_notify_create_selinfo(ad, ad->ctrlinfo.ctrlbar_edit_ly,
+ ad->ctrlinfo.nf_it_edit,
+ ad->albuminfo.albums_cnt, cnt, false);
+ return 0;
+}
+
+static void _gl_albums_check_changed(void *data, Evas_Object *obj,
+ void *event_info)
+{
+ GL_CHECK(obj);
+ GL_CHECK(data);
+ gl_cluster *album_item = (gl_cluster *)data;
+ GL_CHECK(album_item->ad);
+ gl_appdata *ad = (gl_appdata *)album_item->ad;
+ gl_dbg("");
+
+ if (gl_get_view_mode(ad) != GL_VIEW_ALBUMS_EDIT) {
+ gl_dbgE("Wrong view mode!");
+ return;
+ }
+
+ /* Checkbox selected, b_ck_box=true */
+ _gl_albums_update_check_state(ad, album_item, obj, true);
+}
+
+static void _gl_albums_check_grid_changed(void *data, Evas_Object *obj,
+ void *event_info)
+{
+ GL_CHECK(obj);
+ GL_CHECK(data);
+ gl_cluster *album_item = (gl_cluster *)data;
+ GL_CHECK(album_item->ad);
+ gl_appdata *ad = (gl_appdata *)album_item->ad;
+ gl_dbg("");
+
+ if (gl_get_view_mode(ad) != GL_VIEW_ALBUMS_EDIT) {
+ gl_dbgE("Wrong view mode!");
+ return;
+ } else {
+ /* gl_dbg("EditMode"); */
+ }
+
+ /* Grid checkbox selected, b_ck_box=false */
+ _gl_albums_update_check_state(ad, album_item, obj, false);
+}
+
+/* Callback of album item selection */
+static void __gl_albums_sel_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ GL_CHECK(data);
+ gl_cluster *album_item = (gl_cluster *)data;
+ GL_CHECK(album_item->cluster);
+ GL_CHECK(album_item->ad);
+ gl_appdata *ad = (gl_appdata *)album_item->ad;
+ int view_mode = gl_get_view_mode(ad);
+
+ gl_dbg("view mode: %d.", view_mode);
+ if (view_mode != GL_VIEW_ALBUMS_EDIT) {
+ if (album_item->cluster->count == 0) {
+ gl_dbgW("Empty album, return!");
+ return;
+ }
+ _gl_ui_save_scroller_pos(obj);
+ gl_albums_sel_album(album_item);
+ }
+}
+
+static void __gl_albums_rename_job_cb(void *data)
+{
+ GL_CHECK(data);
+ gl_cluster *album = (gl_cluster *)data;
+ GL_CHECK(album->ad);
+ gl_appdata *ad = (gl_appdata *)album->ad;
+ /* save album selected for rename */
+ if (_gl_albums_rename_create_view(album->ad, album) == 0)
+ ad->albuminfo.selected_album = album;
+}
+
+static void _gl_albums_rename_btn_cb(void *data, Evas_Object *obj,
+ void *event_info)
+{
+ gl_dbg("");
+ GL_CHECK(data);
+ gl_cluster *album_item = (gl_cluster *)data;
+ gl_appdata *ad = (gl_appdata *)album_item->ad;
+
+ /* Return if album selected */
+ if (!album_item->checked) {
+ gl_dbgW("Album checked!");
+ return;
+ }
+
+ /* Album cover selected, b_ck_box=false, deselect checkbox */
+ Evas_Object *ck = NULL;
+ ck = elm_object_item_part_content_get(album_item->item,
+ GL_TILE_CHECKBOX);
+ _gl_albums_update_check_state(ad, album_item, ck, false);
+ _gl_ui_save_scroller_pos(ad->albuminfo.albums_view);
+ if(ad->maininfo.rename_album_job) {
+ ecore_job_del(ad->maininfo.rename_album_job);
+ ad->maininfo.rename_album_job = NULL;
+ }
+ ad->maininfo.rename_album_job = ecore_job_add(__gl_albums_rename_job_cb,
+ album_item);
+}
+
+static char *__gl_albums_get_text(void *data, Evas_Object *obj, const char *part)
+{
+ GL_CHECK_NULL(part);
+ GL_CHECK_NULL(strlen(part));
+ GL_CHECK_NULL(data);
+ gl_cluster *album_item = (gl_cluster *)data;
+ GL_CHECK_NULL(album_item->cluster);
+ GL_CHECK_NULL(album_item->cluster->display_name);
+ GL_CHECK_NULL(album_item->cluster->uuid);
+ GL_CHECK_NULL(album_item->ad);
+ gl_appdata *ad = (gl_appdata *)album_item->ad;
+ char buf[GL_ALBUM_NAME_LEN_MAX] = { 0, };
+
+ if (!g_strcmp0(part, "elm.text.name")) {
+ gl_dbg_launch(" text.name");
+ gl_dbg("text.name");
+ if (_gl_data_is_root_path(album_item->cluster->path)) {
+ snprintf(buf, sizeof(buf), "%s",
+ GL_ALBUM_PHOME_ROOT_NAME);
+ } else if (album_item->cluster->display_name &&
+ strlen(album_item->cluster->display_name)) {
+ char *new_name = _gl_get_i18n_album_name(album_item);
+ snprintf(buf, sizeof(buf), "%s", new_name);
+ } else {
+ gl_dbgE("Album name[%s] is wrong!",
+ album_item->cluster->display_name);
+ }
+ } else if (!g_strcmp0(part, "elm.text.date")) {
+ int i = 0;
+ int item_count = GL_ALBUM_COVER_THUMB_NUM;
+ gl_item **items1 = ad->albuminfo.cover_thumbs;
+ gl_albums_free_cover_thumbs(ad);
+
+ _gl_data_get_first_several_items(album_item, items1, &item_count,
+ MEDIA_CONTENT_ORDER_DESC);
+ if (item_count <= 0) {
+ gl_dbg("Empty album...");
+ ad->albuminfo.album_medias_cnt = 0;
+ return NULL;
+ }
+
+ ad->albuminfo.album_medias_cnt = item_count;
+ if (items1[0] == NULL || items1[0]->item == NULL) {
+ gl_dbgE("[Error] Invalid item!");
+ ad->albuminfo.album_medias_cnt = 0;
+ return NULL;
+ }
+
+ item_count = 1;
+ gl_item *items2[1];
+ int sort_t = MEDIA_CONTENT_ORDER_ASC;
+ memset(items2, 0x00, item_count * sizeof(int));
+ _gl_data_get_first_several_items(album_item,
+ items2, &item_count,
+ sort_t);
+
+ if (item_count <= 0) {
+ gl_dbg("Empty album...");
+ return NULL;
+ }
+
+ if (items2[0] == NULL || items2[0]->item == NULL) {
+ gl_dbgE("Invalid items2[0]!");
+ ad->albuminfo.album_medias_cnt = 0;
+ return NULL;
+ }
+ _gl_tile_get_mtime((time_t *)&(items1[0]->item->mtime),
+ (time_t *)&(items2[0]->item->mtime),
+ buf, GL_ALBUM_NAME_LEN_MAX);
+
+ for (i = 0; i < item_count; i++) {
+ _gl_data_destroy_item(items2[i]);
+ items2[i] = NULL;
+ }
+ } else if (!g_strcmp0(part, "elm.text.count")) {
+ int count = 0;
+ if (ad->taginfo.current_tag && ad->taginfo.current_tag->tag) {
+ int tag_id = ad->taginfo.current_tag->tag->_id;
+ count = _gl_local_data_get_media_count_wichout_tag(tag_id,
+ album_item->cluster->uuid);
+ } else {
+ _gl_data_update_item_cnt(album_item);
+ count = album_item->cluster->count;
+ }
+
+ snprintf(buf, sizeof(buf), "%d", count);
+ }
+
+ return strdup(buf);
+
+}
+
+static int __gl_albums_set_bg_file(Evas_Object *bg, void *data)
+{
+ gl_item *git = (gl_item *)data;
+ char *bg_path = GL_DEFAULT_THUMB_ICON;
+ gl_icon_type ret_val = -1;
+
+ if (git == NULL || git->item == NULL) {
+ gl_dbgE("Invalid item :%p", git);
+ goto GL_ALBUMS_FAILED;
+ }
+
+ /* Is it DRM file? Has a valid RO? */
+ if(_gl_get_icon_type(git) == GL_ICON_EXPIRED_DRM) {
+ gl_dbgW("Expired DRM!");
+ goto GL_ALBUMS_FAILED;
+ }
+
+ ret_val= 0;
+ bg_path = _GET_ICON(git->item->thumb_url);
+
+ GL_ALBUMS_FAILED:
+
+#ifdef _USE_ROTATE_BG
+ _gl_rotate_bg_set_image_file(bg, bg_path);
+#else
+ elm_bg_file_set(bg, bg_path, NULL);
+#endif
+
+ return ret_val;
+}
+
+static Evas_Object *__gl_albums_get_content(void *data, Evas_Object *obj, const char *part)
+{
+ GL_CHECK_NULL(part);
+ GL_CHECK_NULL(strlen(part));
+ GL_CHECK_NULL(data);
+ gl_cluster *album_item = (gl_cluster *)data;
+ GL_CHECK_NULL(album_item->cluster);
+ GL_CHECK_NULL(album_item->ad);
+ gl_appdata *ad = (gl_appdata *)album_item->ad;
+ GL_CHECK_NULL(album_item->cluster->uuid);
+ int view_mode = gl_get_view_mode(ad);
+
+ if (view_mode != GL_VIEW_ALBUMS &&
+ view_mode != GL_VIEW_ALBUMS_EDIT &&
+ view_mode != GL_VIEW_ALBUMS_SELECT)
+ return NULL;
+
+ Evas_Object *_obj = NULL;
+ if (!g_strcmp0(part, GT_TILE_ONLYICON)) {
+ _obj = _gl_tile_show_part_icon(obj, part,
+ ad->albuminfo.album_medias_cnt,
+ ad->maininfo.win_scale,
+ __gl_albums_set_bg_file,
+ (void **)ad->albuminfo.cover_thumbs);
+ } else if (!g_strcmp0(part, GT_TILE_LABEL)) {
+ /**
+ * for "All albums" and "Camera shots", their colors should be
+ * 25:25:25 by new gui
+ */
+ bool b_default = false;
+ if (album_item->cluster->type == GL_STORE_T_ALL ||
+ _gl_data_is_default_album(GL_ALBUM_DEFAULT_NAME, album_item->cluster))
+ b_default = true;
+ _obj = _gl_tile_show_part_label(obj, album_item->index,
+ b_default);
+
+ gl_dbg_launch(" content");
+ if (ad->albuminfo.album_medias_cnt <= 0)
+ gl_dbg("Empty album");
+ } else if (!g_strcmp0(part, GL_TILE_CHECKBOX_GRID) &&
+ view_mode == GL_VIEW_ALBUMS_EDIT) {
+ _obj = _gl_tile_show_part_checkbox_grid(obj, album_item->checked,
+ _gl_albums_check_grid_changed,
+ data);
+ } else if (!g_strcmp0(part, GL_TILE_CHECKBOX) &&
+ view_mode == GL_VIEW_ALBUMS_EDIT) {
+ _obj = _gl_tile_show_part_checkbox(obj, album_item->checked,
+ _gl_albums_check_changed,
+ data);
+ } else if (!g_strcmp0(part, GL_TILE_RENAME) &&
+ view_mode == GL_VIEW_ALBUMS_EDIT) {
+ /**
+ * Fixme: In My Files app, it's unable to rename
+ * 'My video clips', 'Wallpapers' and 'My photo clips'.
+ * Maybe we need to remove rename button
+ * from these three albums cover.
+ */
+
+ /**
+ * Don't add rename button to 'All' and Web albums
+ * and 'Camera shot'[default album]
+ */
+ if (album_item->cluster->type == GL_STORE_T_ALL ||
+ _gl_data_is_default_album(GL_ALBUM_DEFAULT_NAME, album_item->cluster))
+ return NULL;
+
+ _obj = _gl_tile_show_part_rename(obj, _gl_albums_rename_btn_cb,
+ data);
+ }
+
+ return _obj;
+}
+
+int _gl_albums_create_items(void *data, Evas_Object *parent)
+{
+ GL_CHECK_VAL(parent, -1);
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ int i = 0;
+ gl_cluster *album_item = NULL;
+ int length = 0;
+ gl_dbg("");
+
+ gl_ctrl_disable_tab_event(ad, true);
+
+ if (elm_gengrid_items_count(parent) > 0) {
+ /* Save scroller position before clearing gengrid */
+ _gl_ui_save_scroller_pos(parent);
+ /* Clear albums view */
+ elm_gengrid_clear(parent);
+ }
+
+ if (gl_get_view_mode(ad) == GL_VIEW_ALBUMS_EDIT)
+ ad->albuminfo.albumgic.item_style = GL_GENGRID_STYLE_ALBUM_EDIT_VIEW;
+ else
+ ad->albuminfo.albumgic.item_style = GL_GENGRID_STYLE_ALBUM_VIEW;
+ ad->albuminfo.albumgic.func.text_get = __gl_albums_get_text;
+ ad->albuminfo.albumgic.func.content_get = __gl_albums_get_content;
+
+ GL_CHECK_VAL(ad->albuminfo.cluster_list, -1);
+ GL_CHECK_VAL(ad->albuminfo.cluster_list->clist, -1);
+ Eina_List *clist = ad->albuminfo.cluster_list->clist;
+ length = eina_list_count(clist);
+ gl_dbg("Albums length: %d", length);
+ const char *al_id = NULL;
+ Elm_Gengrid_Item_Class *pgic = &(ad->albuminfo.albumgic);
+ int item_cnt = 0;
+
+ gl_dbg_launch(" for:elm_gengrid_item_append:start");
+ for (i = 0; i < length; i++) {
+ album_item = eina_list_nth(clist, i);
+ GL_CHECK_VAL(album_item, -1);
+ GL_CHECK_VAL(album_item->cluster, -1);
+ GL_CHECK_VAL(album_item->cluster->display_name, -1);
+ GL_CHECK_VAL(album_item->cluster->uuid, -1);
+ al_id = album_item->cluster->uuid;
+ if (ad->maininfo.view_mode == GL_VIEW_ALBUMS_EDIT &&
+ !g_strcmp0(al_id, GL_ALBUM_ALL_ID))
+ continue;
+ if (ad->taginfo.current_tag && ad->taginfo.current_tag->tag) {
+ int tag_id = ad->taginfo.current_tag->tag->_id;
+ if (_gl_local_data_get_media_count_wichout_tag(tag_id, album_item->cluster->uuid) < 1)
+ continue;
+ }
+
+ album_item->item = elm_gengrid_item_append(parent, pgic,
+ album_item,
+ __gl_albums_sel_cb,
+ album_item);
+ album_item->index = item_cnt;
+ item_cnt++;
+ gl_dbg("Append[%s], id=%s.", album_item->cluster->display_name,
+ al_id);
+ }
+ gl_dbg_launch(" for:elm_gengrid_item_append:end");
+
+ /* Restore previous position of scroller */
+ _gl_ui_restore_scroller_pos(parent);
+ ad->albuminfo.albums_cnt = item_cnt;
+
+ gl_ctrl_disable_tab_event(ad, false);
+
+ return 0;
+}
+
+static int __gl_albums_reset_view(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ int view_mode = gl_get_view_mode(ad);
+ gl_dbg("view_mode: %d", view_mode);
+
+ if (view_mode != GL_VIEW_ALBUMS &&
+ view_mode != GL_VIEW_ALBUMS_EDIT &&
+ view_mode != GL_VIEW_ALBUMS_RENAME) {
+ gl_dbg("Change to albums view");
+ gl_destroy_thumbs_view(ad);
+ gl_refresh_albums_list(ad);
+ gl_albums_comeback_from_view(ad);
+ } else if (view_mode == GL_VIEW_ALBUMS_EDIT ||
+ view_mode == GL_VIEW_ALBUMS_RENAME) {
+ gl_del_invalid_widgets(ad, GL_INVALID_NONE);
+ _gl_albums_edit_pop_view(ad);
+ }
+
+ return 0;
+}
+
+int gl_albums_sel_album(gl_cluster *album_item)
+{
+ GL_CHECK_VAL(album_item, -1);
+ GL_CHECK_VAL(album_item->cluster, -1);
+ GL_CHECK_VAL(album_item->cluster->uuid, -1);
+ GL_CHECK_VAL(album_item->ad, -1);
+ gl_appdata *ad = (gl_appdata *)album_item->ad;
+ GL_CHECK_VAL(ad->albuminfo.cluster_list, -1);
+ GL_CHECK_VAL(ad->albuminfo.cluster_list->clist, -1);
+ int view_mode = gl_get_view_mode(ad);
+
+ if (view_mode == GL_VIEW_ALBUMS) {
+ gl_dbg("View mode!");
+ } else if (view_mode == GL_VIEW_ALBUMS_SELECT) {
+ gl_dbg("Select mode!");
+ _gl_thumbs_sel_create_view(ad, album_item);
+ return 0;
+ } else {
+ gl_dbgW("Wrong view mode");
+ return -1;
+ }
+ char *al_na = _gl_get_i18n_album_name(album_item);
+ gl_dbg("current %s album, id=%s", al_na, album_item->cluster->uuid);
+ ad->albuminfo.current_album = album_item;
+ _gl_data_get_item_list(ad, GL_CATEGORY_FOLDER, album_item,
+ GL_FIRST_VIEW_START_POS, GL_FIRST_VIEW_END_POS);
+
+ gl_navi_mode mode = GL_NAVI_THUMBS;
+ if (_gl_data_is_root_path(album_item->cluster->path)) {
+ /* check root case */
+ al_na = GL_ALBUM_PHOME_ROOT_NAME;
+ } else if (ad->albuminfo.aul_launch_type == GL_AUL_T_VIEW_ALBUM) {
+ /* launch by appcontrol */
+ if (ad->albuminfo.aul_file_type == GL_AUL_FILE_T_IMAGE)
+ al_na = GL_ALBUM_IMAGES_NAME;
+ else if (ad->albuminfo.aul_file_type == GL_AUL_FILE_T_VIDEO)
+ al_na = GL_ALBUM_VIDEOS_NAME;
+ else if (al_na == NULL)
+ al_na = GL_ALBUM_ALL_NAME;
+ }
+
+ _gl_thumbs_create_view(ad, mode, al_na, true,
+ _gl_albums_comeback_from_view_cb);
+
+ /* Checkme: clear albums view for animation effect pause issue */
+ elm_gengrid_clear(ad->albuminfo.albums_view);
+ gl_dbg("albums_view 0x%x cleared", ad->albuminfo.albums_view);
+ gl_dbg("Done albums selected");
+ return 0;
+}
+
+Evas_Object *_gl_albums_add_gengrid(void *data, Evas_Object *parent)
+{
+ GL_CHECK_NULL(parent);
+ GL_CHECK_NULL(data);
+ Evas_Object *grid = _gl_tile_add_gengrid(data, parent);
+ evas_object_smart_callback_add(grid, "realized", _gl_albums_realized,
+ data);
+ evas_object_show(grid);
+ _gl_ui_reset_scroller_pos(grid);
+ return grid;
+}
+
+Evas_Object *gl_albums_create_view(void *data, Evas_Object *parent)
+{
+ GL_CHECK_NULL(parent);
+ GL_CHECK_NULL(data);
+ gl_appdata *ad = (gl_appdata *)data;
+ GL_CHECK_NULL(ad->albuminfo.cluster_list);
+ gl_dbg("");
+ gl_dbg_launch(" gl_albums_create_view:start");
+
+ gl_albums_free_cover_thumbs(ad);
+ memset(ad->albuminfo.cover_thumbs, 0x00,
+ GL_ALBUM_COVER_THUMB_NUM * sizeof(int));
+ ad->albuminfo.album_medias_cnt = 0;
+ ad->albuminfo.albums_cnt = 0;
+
+ Evas_Object *grid = _gl_albums_add_gengrid(data, parent);
+ GL_CHECK_NULL(grid);
+
+ if (ad->maininfo.view_mode != GL_VIEW_THUMBS)
+ _gl_albums_create_items(ad, grid);
+
+ int view_mode = gl_get_view_mode(ad);
+ gl_dbg("view_mode: %d", view_mode);
+ if (view_mode == GL_VIEW_ALBUMS_SELECT) {
+ if (ad->albuminfo.albums_cnt == 0) {
+ gl_dbgE("None albums!");
+ _gl_ui_del_scroller_pos(grid);
+ evas_object_del(grid);
+ grid = _gl_nocontents_create(ad);
+ } else {
+ evas_object_show(grid);
+ }
+ return grid;
+ }
+
+ /* show no contents none album exists */
+ if (gl_check_gallery_empty(ad)) {
+ _gl_ui_del_scroller_pos(grid);
+ evas_object_del(grid);
+ grid = NULL;
+
+ /* Set the grid view mode for creating nocontents view */
+ ad->gridinfo.view_mode = GL_THUMB_ALBUMS;
+ Evas_Object *noc = _gl_nocontents_create(ad);
+ evas_object_show(noc);
+ ad->albuminfo.albums_nocontents = noc;
+
+ return noc;
+ } else {
+ ad->albuminfo.albums_nocontents = NULL;
+ }
+
+ gl_dbg("gl_albums_create_view:done");
+ gl_dbg_launch(" gl_albums_create_view:end");
+
+ return grid;
+}
+
+/* From thumbnails view to albums view */
+int gl_albums_comeback_from_view(void *data)
+{
+ gl_dbg("");
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+
+ gl_set_view_mode(ad, GL_VIEW_ALBUMS);
+ gl_ctrl_rotate_ctrlbar(ad, GL_VIEW_ALBUMS);
+
+ _gl_thumbs_delete_view(ad);
+
+ ad->albuminfo.current_album = NULL;
+ gl_albums_update_items(ad);
+ return 0;
+}
+
+/* From albums edit view to albums view */
+int gl_albums_change_to_view(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ GL_CHECK_VAL(ad->albuminfo.cluster_list, -1);
+ gl_dbg("");
+
+ ad->albuminfo.albums_cnt = 0;
+ GL_CHECK_VAL(ad->albuminfo.albums_view, -1);
+ gl_set_view_mode(ad, GL_VIEW_ALBUMS);
+ /* changed to show no contents if needed */
+ if (gl_check_gallery_empty(ad)) {
+ if (ad->albuminfo.albums_view) {
+ _gl_ui_del_scroller_pos(ad->albuminfo.albums_view);
+ evas_object_del(ad->albuminfo.albums_view);
+ }
+
+ /* Set the grid view mode for creating nocontents view */
+ ad->gridinfo.view_mode = GL_THUMB_ALBUMS;
+ Evas_Object *noc = _gl_nocontents_create(ad);
+ ad->albuminfo.albums_nocontents = noc;
+ ad->albuminfo.albums_view = noc;
+ evas_object_show(noc);
+
+ Evas_Object *old_view = NULL;
+ old_view = elm_object_part_content_unset(ad->ctrlinfo.ctrlbar_view_ly,
+ "contents");
+ _gl_ui_del_scroller_pos(old_view);
+ evas_object_del(old_view);
+ elm_object_part_content_set(ad->ctrlinfo.ctrlbar_view_ly,
+ "contents", noc);
+ } else {
+ _gl_albums_create_items(ad, ad->albuminfo.albums_view);
+ }
+
+ return 0;
+}
+
+/* Update albums view */
+int gl_albums_update_items(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ GL_CHECK_VAL(ad->albuminfo.cluster_list, -1);
+ int view_mode = gl_get_view_mode(ad);
+ ad->albuminfo.albums_cnt = 0;
+ gl_dbg("");
+ /* Changed to show no contents if needed */
+ if (gl_check_gallery_empty(ad)) {
+ /* Set the grid view mode for creating nocontents view */
+ ad->gridinfo.view_mode = GL_THUMB_ALBUMS;
+ _gl_ui_del_scroller_pos(ad->albuminfo.albums_view);
+ evas_object_del(ad->albuminfo.albums_view);
+
+ Evas_Object *noc = _gl_nocontents_create(ad);
+ ad->albuminfo.albums_nocontents = noc;
+ ad->albuminfo.albums_view = noc;
+ evas_object_show(noc);
+
+ Evas_Object *old_view = NULL;
+ old_view = elm_object_part_content_unset(ad->ctrlinfo.ctrlbar_view_ly,
+ "contents");
+ _gl_ui_del_scroller_pos(old_view);
+ evas_object_del(old_view);
+ elm_object_part_content_set(ad->ctrlinfo.ctrlbar_view_ly,
+ "contents", noc);
+ } else {
+ if (view_mode == GL_VIEW_ALBUMS_EDIT) {
+ _gl_albums_create_items(ad,
+ ad->ctrlinfo.ctrlbar_edit_view);
+ /* Display selectioninfo */
+ int cnt = _gl_data_get_albums_selected_cnt(ad);
+ _gl_notify_create_selinfo(ad,
+ ad->ctrlinfo.ctrlbar_edit_ly,
+ ad->ctrlinfo.nf_it_edit,
+ ad->albuminfo.albums_cnt, cnt,
+ true);
+ } else {
+ if (ad->albuminfo.albums_nocontents) {
+ /**
+ * current view is nocontents,
+ * unset it first then create albums view.
+ */
+ gl_albums_remove_nocontents(ad);
+ } else {
+ Evas_Object *al_view = NULL;
+ al_view = ad->albuminfo.albums_view;
+ _gl_albums_create_items(ad, al_view);
+ }
+ }
+ }
+
+ return 0;
+}
+
+/* Update albums list and refresh albums view, remove invalid widgets */
+int gl_albums_update_view(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ int view_mode = gl_get_view_mode(ad);
+ gl_dbg("view_mode: %d.", view_mode);
+
+ gl_albums_free_cover_thumbs(ad);
+ memset(ad->albuminfo.cover_thumbs, 0x00,
+ GL_ALBUM_COVER_THUMB_NUM * sizeof(int));
+ ad->albuminfo.albums_cnt = 0;
+
+ if (view_mode == GL_VIEW_ALBUMS) {
+ /* Update albums list*/
+ gl_refresh_albums_list(ad);
+
+ /* Only newly downloaded web album */
+ if (ad->albuminfo.albums_nocontents) {
+ gl_albums_remove_nocontents(ad);
+ } else if (!gl_check_gallery_empty(ad)) {
+ _gl_albums_create_items(ad, ad->albuminfo.albums_view);
+ if (ad->albuminfo.cluster_list->edit_cnt)
+ _gl_ctrl_disable_btn(ad, false, GL_NAVI_ALBUMS);
+ else
+ _gl_ctrl_disable_btn(ad, true, GL_NAVI_ALBUMS);
+ } else {
+ gl_dbg("View is empty.");
+ gl_albums_update_items(ad);
+ _gl_ctrl_disable_btn(ad, true, GL_NAVI_ALBUMS);
+ gl_ctrl_disable_ctrlbar(ad, true);
+ }
+ } else if (view_mode == GL_VIEW_ALBUMS_EDIT) {
+ _gl_albums_edit_update_view(data);
+ } else if (view_mode == GL_VIEW_ALBUMS_RENAME) {
+ _gl_albums_rename_update_view(data);
+ } else if (view_mode == GL_VIEW_ALBUMS_SELECT) {
+ /* Update albums selection view */
+ _gl_albums_sel_update_view(data);
+ }
+ return 0;
+}
+
+/**
+* Remove nocontents view and show albums view.
+* Case 1, gallery is empty->home key tapped
+* ->take photos with camera->back to gallery;
+*/
+int gl_albums_remove_nocontents(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ Evas_Object *view = NULL;
+ gl_dbg("");
+
+ if (ad->albuminfo.albums_nocontents && !gl_check_gallery_empty(ad)) {
+ gl_dbg("Remove nocontents view then create albums view.");
+ evas_object_del(ad->albuminfo.albums_nocontents);
+ ad->albuminfo.albums_nocontents = NULL;
+
+ view = gl_albums_create_view(ad, ad->maininfo.naviframe);
+ elm_object_part_content_set(ad->ctrlinfo.ctrlbar_view_ly,
+ "contents", view);
+ evas_object_show(view);
+ ad->albuminfo.albums_view = view;
+
+ _gl_ctrl_disable_btn(ad, false, GL_NAVI_ALBUMS);
+ gl_ctrl_disable_ctrlbar(ad, false);
+ } else if (ad->albuminfo.albums_nocontents) {
+ gl_dbg("Gallery is empty!");
+ bool b_update = false;
+ b_update = _gl_nocontents_update_label(ad->albuminfo.albums_nocontents,
+ GL_STR_NO_ALBUMS);
+ /* Update toolbar state */
+ if (b_update)
+ _gl_ctrl_disable_btn(ad, false, GL_NAVI_ALBUMS);
+ } else {
+ gl_dbg("Nocontents was removed!");
+ }
+
+ return 0;
+}
+
+int gl_albums_free_cover_thumbs(void *data)
+{
+ gl_dbg("");
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ int i = 0;
+
+ for (i = 0; i < GL_ALBUM_COVER_THUMB_NUM; i++) {
+ if (ad->albuminfo.cover_thumbs[i]) {
+ _gl_data_destroy_item(ad->albuminfo.cover_thumbs[i]);
+ ad->albuminfo.cover_thumbs[i] = NULL;
+ }
+ }
+
+ return 0;
+}
+
+/* Free resources allocated for albums view */
+int gl_albums_free_data(void *data)
+{
+ gl_dbg("");
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+
+ gl_albums_free_cover_thumbs(data);
+ GL_FREEIF(ad->albuminfo.path);
+ return 0;
+}
+
+int _gl_albums_reset_view(void *data, const char *uuid, const char *aul_type)
+{
+ GL_CHECK_VAL(aul_type, -1);
+ GL_CHECK_VAL(uuid, -1);
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ int view_mode = gl_get_view_mode(ad);
+
+ if (!g_strcmp0(aul_type, GL_AUL_ALBUM) &&
+ g_strcmp0(uuid, GL_ALBUM_UUID_DEFAULT)) {
+ gl_cluster *album = ad->albuminfo.current_album;
+ if (album && album->cluster && album->cluster->uuid) {
+ bool b_cur_album_exists = false;
+ if (!g_strcmp0(album->cluster->uuid, uuid)) {
+ int its_cnt = 0;
+ int ret = -1;
+ ret = _gl_data_get_item_cnt(ad, uuid, false,
+ album->cluster->type,
+ &its_cnt);
+ if (ret != 0 || its_cnt == 0)
+ gl_dbgE("Empty current album!");
+ else
+ b_cur_album_exists = true;
+ }
+
+ /* Current album exists and it's not empty */
+ if (b_cur_album_exists) {
+ gl_dbg("Current album, update view");
+ if (view_mode == GL_VIEW_THUMBS_EDIT) {
+ gl_del_invalid_widgets(ad, GL_INVALID_NONE);
+ /* Set flag to update albums list */
+ ad->albuminfo.update_albums_list = true;
+ _gl_thumbs_edit_pop_view(ad);
+ } else {
+ gl_update_view(ad, GL_UPDATE_VIEW_NORMAL);
+ }
+
+ return -1;
+ }
+ }
+
+ __gl_albums_reset_view(ad);
+ } else {
+ __gl_albums_reset_view(ad);
+
+ _gl_ctrl_sel_tabbar_item(ad, aul_type);
+ }
+
+ return 0;
+}
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <errno.h>
+#include "gl-tags.h"
+#include "gl-tags-edit.h"
+#include "gl-debug.h"
+#include "gl-strings.h"
+#include "gl-ui-util.h"
+#include "gl-util.h"
+#include "gl-data.h"
+#include "gl-icons.h"
+#include "gl-controlbar.h"
+#include "gl-ctxpopup.h"
+#include "gl-button.h"
+#include "gl-notify.h"
+#include "gl-popup.h"
+
+/*
+* delete selected tags from tags list view.
+*/
+static int __gl_tags_edit_del(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ gl_tag *gtag = NULL;
+ int cnt = _gl_data_get_tags_selected_cnt(ad);
+ int i = 0;
+ gl_dbg("");
+
+ Eina_List *selected_list = ad->taginfo.selected_tags_elist;
+ if ((selected_list == NULL) || (cnt == 0)) {
+ gl_dbgE("tags selected list is empty!");
+ return -1;
+ }
+
+ gl_dbg("selected list length=%d", cnt);
+ for (i = 0; i < cnt; i++) {
+ gtag = eina_list_nth(selected_list, i);
+ if (gtag && gtag->tag) {
+ gl_dbg("tag name: %s", gtag->tag->tag_name);
+ _gl_local_data_delete_tag(gtag->tag);
+ }
+ }
+
+ /* update the tags view */
+ _gl_tags_edit_pop_view(ad);
+ /* add notification */
+ _gl_notify_create_notiinfo(ad, GL_STR_DELETED);
+ return 0;
+}
+
+static void __gl_tags_edit_trans_finished_cb(void *data, Evas_Object *obj,
+ void *event_info)
+{
+ GL_CHECK(data);
+ gl_appdata *ad = (gl_appdata *)data;
+ int view_mode = gl_get_view_mode(ad);
+ gl_dbgW("view_mode: %d", view_mode);
+ evas_object_smart_callback_del(obj, GL_TRANS_FINISHED,
+ __gl_tags_edit_trans_finished_cb);
+
+ /* Clear previous view after animation finished */
+ if (view_mode == GL_VIEW_TAGS_EDIT)
+ elm_genlist_clear(ad->taginfo.tags_view);
+ else
+ gl_dbgE("Wrong view mode!");
+}
+
+static void __gl_tags_edit_cancel_cb(void *data, Evas_Object *obj,
+ void *event_info)
+{
+ GL_CHECK(obj);
+ GL_CHECK(data);
+ gl_dbg("");
+ /* Disable item when it is clicked to prevent it is called for many times */
+ if (_gl_tags_edit_pop_view(data) == 0)
+ _gl_ui_disable_btn(obj);
+}
+
+static void __gl_tags_edit_del_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ GL_CHECK(data);
+ int view_mode = gl_get_view_mode(data);
+ gl_dbg("");
+
+ if (view_mode == GL_VIEW_TAGS_EDIT) {
+ if (_gl_data_get_tags_selected_cnt(data) == 0) {
+ gl_dbg("No tags selected, return!");
+ gl_popup_create_popup(data, GL_POPUP_NOBUT,
+ GL_STR_NO_TAGS_SELECTED);
+ return;
+ }
+
+ __gl_tags_edit_del(data);
+ } else {
+ gl_dbgE("Unkonw mode!");
+ }
+}
+
+static void __gl_tags_edit_share_cb(void *data, Evas_Object *obj,
+ void *event_info)
+{
+ GL_CHECK(data);
+ gl_appdata *ad = (gl_appdata *)data;
+ gl_dbg("");
+
+ if (ad->uginfo.ug_called_by_me || ad->uginfo.app_called_by_me) {
+ gl_dbgW("UG or APP is already loaded!");
+ return;
+ }
+
+ int view_mode = gl_get_view_mode(ad);
+ if (view_mode == GL_VIEW_TAGS_EDIT) {
+ if (_gl_data_get_tags_selected_cnt(ad) == 0) {
+ gl_dbg("No tags selected, return!");
+ gl_popup_create_popup(ad, GL_POPUP_NOBUT,
+ GL_STR_NO_TAGS_SELECTED);
+ return;
+ }
+ /* Check tags are empty */
+ if (_gl_data_is_tags_selected_empty(ad)) {
+ gl_dbg("No thumbs selected, return!");
+ gl_popup_create_popup(ad, GL_POPUP_NOBUT,
+ GL_STR_NO_FILES_SELECTED);
+ return;
+ }
+ } else {
+ gl_dbgE("Unknow mode!");
+ return;
+ }
+
+ _gl_ctxpopup_create_share(data, obj);
+}
+
+/**
+ * Use naviframe api to push tags eidt view to stack.
+ * @param obj is the content to be pushed.
+ */
+static int __gl_tags_edit_push_view(void *data, Evas_Object *parent,
+ Evas_Object *obj)
+{
+ gl_dbg("GL_NAVI_TAGS_EDIT");
+ GL_CHECK_VAL(obj, -1);
+ GL_CHECK_VAL(parent, -1);
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ Elm_Object_Item *nf_it = NULL;
+
+ /* Add transition finished callback */
+ evas_object_smart_callback_add(parent, GL_TRANS_FINISHED,
+ __gl_tags_edit_trans_finished_cb, ad);
+ Evas_Object *end_btn = NULL;
+ end_btn = _gl_but_create_but(parent, NULL, NULL,
+ GL_BUTTON_STYLE_NAVI_PRE,
+ __gl_tags_edit_cancel_cb, ad);
+ GL_CHECK_VAL(end_btn, -1);
+ /* Push to stack */
+ nf_it = elm_naviframe_item_push(parent, NULL, end_btn, NULL, obj,
+ GL_NF_ANI_TABBAR);
+ elm_naviframe_item_title_visible_set(nf_it, EINA_FALSE);
+ ad->ctrlinfo.nf_it_edit = nf_it;
+
+ Evas_Object *btn = NULL;
+ /* Delete */
+ btn = _gl_but_create_but(parent, NULL, GL_STR_DELETE,
+ GL_BUTTON_STYLE_NAVI_TOOLBAR_RIGHT,
+ __gl_tags_edit_del_cb, data);
+ GL_CHECK_VAL(btn, -1);
+ elm_object_item_part_content_set(nf_it, GL_NAVIFRAME_BTN2, btn);
+ _gl_ui_disable_btn(btn);
+ /* Share */
+ btn = _gl_but_create_but(parent, NULL, GL_STR_SHARE,
+ GL_BUTTON_STYLE_NAVI_TOOLBAR_LEFT,
+ __gl_tags_edit_share_cb, data);
+ GL_CHECK_VAL(btn, -1);
+ elm_object_item_part_content_set(nf_it, GL_NAVIFRAME_BTN1, btn);
+ _gl_ui_disable_btn(btn);
+
+ return 0;
+}
+
+int _gl_tags_edit_create_view(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ GL_CHECK_VAL(ad->maininfo.naviframe, -1);
+ Evas_Object *layout = NULL;
+ Evas_Object *view = NULL;
+
+ gl_set_view_mode(data, GL_VIEW_TAGS_EDIT);
+
+ layout = gl_ctrl_create_ctrlbar_view(ad->maininfo.naviframe);
+ GL_CHECK_VAL(layout, -1);
+
+ view = gl_tag_create_view(ad, layout);
+ if (view == NULL) {
+ gl_dbgE("Failed to create tags edit view!");
+ evas_object_del(layout);
+ return -1;
+ }
+
+ evas_object_show(view);
+ elm_object_part_content_set(layout, "elm.swallow.view", view);
+ edje_object_signal_emit(_EDJ(layout), GL_SIGNAL_VIEW_EDIT, "elm");
+
+ ad->ctrlinfo.ctrlbar_edit_ly = layout;
+ ad->ctrlinfo.ctrlbar_edit_view = view;
+
+ gl_ui_show_selall(ad);
+ __gl_tags_edit_push_view(ad, ad->maininfo.naviframe, layout);
+ return 0;
+}
+
+int _gl_tags_edit_pop_view(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ GL_CHECK_VAL(ad->maininfo.naviframe, -1);
+
+ elm_naviframe_item_pop(ad->maininfo.naviframe);
+
+ gl_tag_unset_rename(data);
+ _gl_destroy_ctrl_edit_view(data);
+
+ /* Set current gtag NULL for rename */
+ ad->taginfo.current_tag = NULL;
+ _gl_data_finalize_tags_selected_list(data);
+
+ gl_set_view_mode(data, GL_VIEW_TAGS);
+ gl_tag_update_view(data);
+
+ if (_gl_data_get_tag_count_all(data) <= 1) {
+ _gl_ctrl_disable_btn(data, true, GL_NAVI_TAGS);
+ }
+ _gl_notify_destroy_selinfo(data);
+ return 0;
+}
+
+/* Share tag's content */
+int _gl_tags_edit_share(void *data, const char *label)
+{
+ GL_CHECK_VAL(label, -1);
+ GL_CHECK_VAL(data, -1);
+ gl_dbg("label : %s ", label);
+
+ int cnt = _gl_data_get_tags_selected_cnt(data);
+ gl_dbg("Selected tag(s) count: %d.", cnt);
+ if (cnt < 1) {
+ gl_dbgE("None tag selected!");
+ gl_popup_create_popup(data, GL_POPUP_NOBUT,
+ GL_STR_NO_TAGS_SELECTED);
+ return -1;
+ }
+ if (_gl_data_is_tags_selected_empty(data)) {
+ gl_dbgE("None thumb selected!");
+ gl_popup_create_popup(data, GL_POPUP_NOBUT,
+ GL_STR_NO_FILES_SELECTED);
+ return -1;
+ }
+
+ return _gl_share_load(data, label);
+}
+
+int _gl_tags_edit_update_lang(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ GL_CHECK_VAL(ad->ctrlinfo.nf_it_edit, -1);
+
+ /*Reset select info text*/
+ int cnt = _gl_data_get_tags_selected_cnt(ad);
+ _gl_notify_update_lang(ad, cnt, GL_VIEW_TAGS_EDIT);
+
+ if (ad->popupinfo.popup) {
+ if (ad->popupinfo.popup_mode == GL_POPUP_NOBUT)
+ gl_popup_create_popup(ad, GL_POPUP_NOBUT,
+ GL_STR_NO_FILES_SELECTED);
+ else if (ad->popupinfo.popup_mode == GL_POPUP_NOBUT)
+ gl_popup_create_popup(ad, GL_POPUP_NOBUT,
+ GL_STR_NO_TAGS_SELECTED);
+ }
+
+ _gl_ui_set_btns_text(ad->ctrlinfo.nf_it_edit, GL_STR_SHARE,
+ GL_STR_DELETE);
+ return 0;
+}
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "gl-debug.h"
+#include "gl-tags-new.h"
+#include "gl-tags.h"
+#include "gl-ui-util.h"
+#include "gl-util.h"
+#include "gl-data.h"
+#include "gl-controlbar.h"
+#include "gl-editfield.h"
+#include "gl-button.h"
+#include "gl-strings.h"
+
+static void __gl_tags_new_cancel_cb(void *data, Evas_Object *obj,
+ void *event_info)
+{
+ GL_CHECK(obj);
+ GL_CHECK(data);
+ gl_dbg("");
+ /* Delete callback when it is clicked to prevent it is called for many times */
+ evas_object_smart_callback_del(obj, "clicked", __gl_tags_new_cancel_cb);
+ _gl_tags_new_pop_view(data);
+}
+
+static void __gl_tags_new_done_cb(void *data, Evas_Object *obj,
+ void *event_info)
+{
+ GL_CHECK(obj);
+ GL_CHECK(data);
+ gl_dbg("");
+ /* Delete callback when it is clicked to prevent it is called for many times */
+ if (_gl_tags_new_process(data, false) == 0)
+ evas_object_smart_callback_del(obj, "clicked",
+ __gl_tags_new_done_cb);
+}
+
+/**
+ * Use naviframe api to push new tag view to stack.
+ * @param obj is the content to be pushed.
+ */
+static int __gl_tags_new_push_view(void *data, Evas_Object *parent,
+ Evas_Object *obj, char *title)
+{
+ gl_dbg("GL_NAVI_TAGS_NEW");
+ GL_CHECK_VAL(obj, -1);
+ GL_CHECK_VAL(parent, -1);
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ Elm_Object_Item *nf_it = NULL;
+ Evas_Object *done_btn = NULL;
+ Evas_Object *cancel_btn = NULL;
+ Evas_Object *end_btn = NULL;
+
+ if (gl_get_view_mode(ad) != GL_VIEW_ALBUMS)
+ _gl_ctrl_show_tabbar(ad, false);
+
+ end_btn = _gl_but_create_but(parent, NULL, NULL,
+ GL_BUTTON_STYLE_NAVI_PRE,
+ __gl_tags_new_cancel_cb, data);
+ GL_CHECK_VAL(end_btn, -1);
+
+ nf_it = elm_naviframe_item_push(parent, title, end_btn, NULL, obj,
+ NULL);
+ ad->entryinfo.nf_it = nf_it;
+ /* Add 'Cancel' button */
+ cancel_btn = _gl_but_create_but(parent, NULL, NULL,
+ GL_BUTTON_STYLE_NAVI_PRE,
+ __gl_tags_new_cancel_cb, data);
+ GL_CHECK_VAL(cancel_btn, -1);
+ elm_object_item_part_content_set(nf_it, GL_NAVIFRAME_TITLE_PREV_BTN,
+ cancel_btn);
+ /* Add 'Done' button */
+ done_btn = _gl_but_create_but(parent, NULL, GL_STR_DONE,
+ GL_BUTTON_STYLE_NAVI_TOOLBAR,
+ __gl_tags_new_done_cb, data);
+ GL_CHECK_VAL(done_btn, -1);
+ elm_object_item_part_content_set(nf_it, GL_NAVIFRAME_BTN1, done_btn);
+ ad->entryinfo.done_btn = done_btn;
+
+ /* Add callbacks to show/hide title toolbar */
+ _gl_ui_add_conform_cbs(parent);
+ return 0;
+}
+
+/*
+* create a new tag
+*/
+int _gl_tags_new_create_view(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ GL_CHECK_VAL(ad->maininfo.naviframe, -1);
+ Evas_Object *editfield_ly = NULL;
+ gl_dbg("");
+
+ ad->entryinfo.entry_mode = GL_ENTRY_NEW_TAG;
+
+ editfield_ly = gl_ctrl_create_ctrlbar_view(ad->maininfo.naviframe);
+ GL_CHECK_VAL(editfield_ly, -1);
+ Evas_Object *entry = _gl_editfield_create(ad, editfield_ly, NULL);
+ if (entry == NULL) {
+ gl_dbgE("Failed to add entry!");
+ ad->entryinfo.entry_mode = GL_ENTRY_NONE;
+ evas_object_del(entry);
+ return -1;
+ }
+ elm_object_part_content_set(editfield_ly, "elm.swallow.view", entry);
+ edje_object_signal_emit(_EDJ(editfield_ly), GL_SIGNAL_VIEW_DEFAULT,
+ "elm");
+ __gl_tags_new_push_view(ad, ad->maininfo.naviframe, editfield_ly,
+ GL_STR_CREATE_TAG);
+ _gl_editfield_show_imf(ad);
+ return 0;
+}
+
+/*
+* cancel adding a new tag.
+*/
+int _gl_tags_new_pop_view(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ gl_dbg("");
+
+ int view_m = gl_get_view_mode(ad);
+ /* in tags list view case */
+ if (view_m == GL_VIEW_TAGS) {
+ /* Hide title from animation */
+ gl_ui_set_navi_title_visible(ad, EINA_FALSE);
+ elm_naviframe_item_pop(ad->maininfo.naviframe);
+ _gl_editfield_destroy_imf(ad);
+ /* Rotate bottom toolbar+tabbar */
+ gl_ctrl_rotate_ctrlbar(ad, GL_VIEW_TAGS);
+ /* Recover the previous UI */
+ gl_tag_update_view(ad);
+ } else {
+ elm_naviframe_item_pop(ad->maininfo.naviframe);
+ _gl_editfield_destroy_imf(ad);
+ gl_ui_update_select_widgets(ad);
+ }
+ return 0;
+}
+
+/*
+* After adding a new tag, then move selected items to this newly created tag.
+*
+* @param b_enter
+* True: Enter key on Keyboard pressed, False: Button Done clicked
+*/
+int _gl_tags_new_process(void *data, bool b_enter)
+{
+ gl_dbg("b_enter: %d", b_enter);
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+
+ if (ad->entryinfo.editfield == NULL) {
+ gl_dbgE("Editfield is NULL!");
+ goto NEW_TAG_FAILED;
+ }
+
+ if (ad->entryinfo.imf_context)
+ ecore_imf_context_input_panel_hide(ad->entryinfo.imf_context);
+
+ Evas_Object *entry = ad->entryinfo.imf_entry;
+ char tname[GL_ARRAY_LEN_MAX] = { 0, };
+
+ /* Get utf8 format string */
+ if (gl_get_entry_text(entry, tname, GL_ARRAY_LEN_MAX) != 0) {
+ gl_dbgE("Get entry text failed!");
+ goto NEW_TAG_FAILED;
+ }
+
+ /* Get valid name */
+ if (_gl_get_valid_tag_name(ad, tname, true, b_enter) != 0) {
+ if (b_enter)
+ _gl_editfield_hide_imf(ad);
+ return -1;
+ }
+ gl_dbg("Valid tag name: %s", tname);
+
+ _gl_editfield_destroy_imf(ad);
+ /* Add selected items to new tag */
+ gl_add_to_tag(ad, tname);
+ return 0;
+
+ NEW_TAG_FAILED:
+ _gl_tags_new_pop_view(ad);
+ return -1;
+}
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "gl-debug.h"
+#include "gl-tags-rename.h"
+#include "gl-tags.h"
+#include "gl-tags-new.h"
+#include "gl-ui-util.h"
+#include "gl-util.h"
+#include "gl-controlbar.h"
+#include "gl-editfield.h"
+#include "gl-button.h"
+#include "gl-popup.h"
+#include "gl-strings.h"
+
+static void __gl_tags_rename_cancel_cb(void *data, Evas_Object *obj,
+ void *event_info)
+{
+ GL_CHECK(obj);
+ GL_CHECK(data);
+ gl_dbg("");
+ /* Delete callback when it is clicked to prevent it is called for many times */
+ evas_object_smart_callback_del(obj, "clicked",
+ __gl_tags_rename_cancel_cb);
+
+ _gl_tags_new_pop_view(data);
+}
+
+static void __gl_tags_rename_done_cb(void *data, Evas_Object *obj,
+ void *event_info)
+{
+ GL_CHECK(obj);
+ GL_CHECK(data);
+ gl_dbg("");
+ /* Delete callback when it is clicked to prevent it is called for many times */
+ if (_gl_tags_rename_process(data) == 0)
+ evas_object_smart_callback_del(obj, "clicked",
+ __gl_tags_rename_done_cb);
+}
+
+/**
+ * Use naviframe api to push new tag view to stack.
+ * @param obj is the content to be pushed.
+ */
+static int __gl_tags_rename_push_view(void *data, Evas_Object *parent,
+ Evas_Object *obj, char *title)
+{
+ gl_dbg("GL_NAVI_TAGS_NEW");
+ GL_CHECK_VAL(obj, -1);
+ GL_CHECK_VAL(parent, -1);
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ Elm_Object_Item *nf_it = NULL;
+ Evas_Object *done_btn = NULL;
+ Evas_Object *cancel_btn = NULL;
+ Evas_Object *end_btn = NULL;
+
+ if (gl_get_view_mode(ad) != GL_VIEW_ALBUMS)
+ _gl_ctrl_show_tabbar(ad, false);
+
+ end_btn = _gl_but_create_but(parent, NULL, NULL,
+ GL_BUTTON_STYLE_NAVI_PRE,
+ __gl_tags_rename_cancel_cb, data);
+ GL_CHECK_VAL(end_btn, -1);
+
+ nf_it = elm_naviframe_item_push(parent, title, end_btn, NULL, obj,
+ NULL);
+ ad->entryinfo.nf_it = nf_it;
+ /* Add 'Cancel' button */
+ cancel_btn = _gl_but_create_but(parent, NULL, NULL,
+ GL_BUTTON_STYLE_NAVI_PRE,
+ __gl_tags_rename_cancel_cb, data);
+ GL_CHECK_VAL(cancel_btn, -1);
+ elm_object_item_part_content_set(nf_it, GL_NAVIFRAME_TITLE_PREV_BTN,
+ cancel_btn);
+ /* Add 'Done' button */
+ done_btn = _gl_but_create_but(parent, NULL, GL_STR_DONE,
+ GL_BUTTON_STYLE_NAVI_TITLE,
+ __gl_tags_rename_done_cb, data);
+ GL_CHECK_VAL(done_btn, -1);
+ elm_object_item_part_content_set(nf_it, GL_NAVIFRAME_BTN1, done_btn);
+ ad->entryinfo.done_btn = done_btn;
+
+ /* Add callbacks to show/hide title toolbar */
+ _gl_ui_add_conform_cbs(parent);
+ return 0;
+}
+
+int _gl_tags_rename_create_view(void *data, gl_tag *gtag)
+{
+ GL_CHECK_VAL(gtag, -1);
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ GL_CHECK_VAL(ad->maininfo.naviframe, -1);
+ Evas_Object *editfield_ly = NULL;
+ gl_dbg("");
+
+ ad->entryinfo.entry_mode = GL_ENTRY_RENAME_TAG;
+
+ editfield_ly = gl_ctrl_create_ctrlbar_view(ad->maininfo.naviframe);
+ GL_CHECK_VAL(editfield_ly, -1);
+ Evas_Object *entry = _gl_editfield_create(ad, editfield_ly,
+ gtag->tag->tag_name);
+ if (entry == NULL) {
+ gl_dbgE("Failed to add entry!");
+ ad->entryinfo.entry_mode = GL_ENTRY_NONE;
+ evas_object_del(editfield_ly);
+ return -1;
+ }
+ elm_object_part_content_set(editfield_ly, "elm.swallow.view", entry);
+ edje_object_signal_emit(_EDJ(editfield_ly), GL_SIGNAL_VIEW_DEFAULT,
+ "elm");
+ __gl_tags_rename_push_view(ad, ad->maininfo.naviframe, editfield_ly,
+ GL_STR_RENAME_TAG);
+ _gl_editfield_show_imf(ad);
+ return 0;
+}
+
+int _gl_tags_rename_process(void *data)
+{
+ gl_dbg("");
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ gl_tag *gtag = ad->taginfo.current_tag;
+ char tname[GL_ARRAY_LEN_MAX] = { 0, };
+ int ret = 0;
+
+ if (gtag == NULL || gtag->item == NULL || gtag->tag->tag_name == NULL) {
+ gl_dbgE("Invalid gatag!");
+ ret = -1;
+ goto INVALID_TAG_NAME;
+ }
+ /* Get utf8 format string */
+ ret = gl_get_entry_text(ad->entryinfo.imf_entry, tname,
+ GL_ARRAY_LEN_MAX);
+ if (ret != 0) {
+ gl_dbgE("Get entry text failed!");
+ ret = -1;
+ goto INVALID_TAG_NAME;
+ }
+
+ /* Get valid name */
+ if (_gl_get_valid_tag_name(ad, tname, false, true) != 0){
+ ret = -1;
+ goto INVALID_TAG_NAME;
+ }
+ gl_dbg("Valid tag name: %s", tname);
+
+ if (g_strcmp0(gtag->tag->tag_name, tname)) {
+ /* Check whether the new tag same as other tag */
+ bool res = _gl_data_is_in_tag_list(ad, tname);
+ if (res) {
+ gl_popup_create_popup(ad, GL_POPUP_TAG_RENAME_DUPLICATE,
+ GL_STR_SAME_NAME_ALREADY_IN_USE);
+ gl_dbgW("New tag already exists!");
+ ret = -1;
+ goto INVALID_TAG_NAME;
+ }
+
+ /* Rename tag in libmedia-info */
+ media_tag_set_name(gtag->tag->tag_h, tname);
+ media_tag_update_to_db(gtag->tag->tag_h);
+ if (ret != MEDIA_CONTENT_ERROR_NONE) {
+ gl_dbgE("Update tag to DB failed[%d]!", ret);
+ ret = -1;
+ goto INVALID_TAG_NAME;
+ }
+ gl_dbg("Rename tag %s to %s", gtag->tag->tag_name, tname);
+ /* Update tag name in memory */
+ GL_FREEIF(gtag->tag->tag_name);
+ gtag->tag->tag_name = strdup(tname);
+ } else {
+ gl_dbgW("Same as current name!");
+ }
+
+ INVALID_TAG_NAME:
+
+ if (ad->entryinfo.nf_it) {
+ _gl_tags_new_pop_view(ad);
+ ad->taginfo.current_tag = NULL;
+ } else {
+ /* Unset rename mode */
+ gl_tag_unset_rename(ad);
+ }
+ _gl_editfield_destroy_imf(ad);
+
+ return ret;
+}
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "gl-tags.h"
+#include "gl-tags-edit.h"
+#include "gl-tags-new.h"
+#include "gl-tags-rename.h"
+#include "gl-debug.h"
+#include "gl-thumbs.h"
+#include "gl-thumbs-edit.h"
+#include "gl-controlbar.h"
+#include "gl-ui-util.h"
+#include "gl-util.h"
+#include "gl-popup.h"
+#include "gl-button.h"
+#include "gl-data.h"
+#include "gl-ext-ug-load.h"
+#include "gl-ext-exec.h"
+#include "gl-notify.h"
+#include "gl-ctxpopup.h"
+#include "gl-editfield.h"
+#include "gl-strings.h"
+#include "gl-icons.h"
+
+/* 112 -2x2 */
+#define GL_TAG_ICON_SIZE 108
+
+#define GL_GENLIST_ITEM_STYLE_TAGS "tags_list"
+#define GL_GENLIST_ITEM_STYLE_TAGS_EDIT "tags_list_edit"
+
+static char *__gl_tag_get_text(void *data, Evas_Object *obj, const char *part)
+{
+ GL_CHECK_NULL(obj);
+ GL_CHECK_NULL(part);
+ GL_CHECK_NULL(data);
+ gl_tag *gtag = (gl_tag *) data;
+ GL_CHECK_NULL(gtag->tag);
+ GL_CHECK_NULL(gtag->tag->tag_name);
+ char buf[GL_ARRAY_LEN_MAX] = { 0, };
+
+ if (!g_strcmp0(part, "elm.text.title") ||
+ !g_strcmp0(part, "elm.slide.text.1")) {
+ return strdup(gtag->tag->tag_name);
+ } else if (!g_strcmp0(part, "elm.text.tag_count")) {
+ snprintf(buf, sizeof(buf), "%d", (int)(gtag->tag->count));
+ return strdup(buf);
+ }
+ return NULL;
+}
+
+static void __gl_tag_rename1_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ GL_CHECK(data);
+ gl_tag *gtag = (gl_tag *) data;
+ GL_CHECK(gtag->ad);
+ gl_appdata *ad = (gl_appdata *)gtag->ad;
+ gl_dbg("");
+
+ gl_tag_unset_rename(ad);
+
+ if (gl_get_view_mode(ad) == GL_VIEW_TAGS) {
+ /* Mode item */
+ Elm_Object_Item *it = NULL;
+ it = (Elm_Object_Item *)elm_genlist_decorated_item_get(ad->taginfo.tags_view);
+ /* Finish genlist sweep*/
+ if (it) {
+ elm_genlist_item_decorate_mode_set(it, "slide", EINA_FALSE);
+ elm_genlist_item_select_mode_set(it, ELM_OBJECT_SELECT_MODE_DEFAULT);
+ }
+ }
+
+ if (gtag && gtag->item) {
+ gl_dbg("Valid tag item.");
+ /* Disable buttons in toolbar */
+ if (gl_get_view_mode(ad) == GL_VIEW_TAGS)
+ _gl_ctrl_disable_btns(ad, ad->ctrlinfo.nf_it, true);
+
+ elm_genlist_item_flip_set(gtag->item, EINA_TRUE);
+ /* Set current gtag for rename */
+ ad->taginfo.rename_item = gtag->item;
+ ad->taginfo.current_tag = gtag;
+ } else {
+ gl_dbgE("Invalid tag item.");
+ }
+}
+
+static void __gl_tag_rename2_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ GL_CHECK(data);
+ gl_tag *gtag = (gl_tag *)data;
+ GL_CHECK(gtag->ad);
+ gl_appdata *ad = (gl_appdata *)gtag->ad;
+ gl_dbg("");
+ ad->taginfo.current_tag = gtag;
+ _gl_tags_rename_create_view(gtag->ad, gtag);
+}
+
+static void _gl_tag_check_changed(void *data, Evas_Object *obj, void *event_info)
+{
+ GL_CHECK(obj);
+ GL_CHECK(data);
+ gl_tag *gtag = (gl_tag *) data;
+ GL_CHECK(gtag->ad);
+ gl_appdata *ad = (gl_appdata *)gtag->ad;
+ int view_mode = gl_get_view_mode(ad);
+ gl_dbg("");
+
+ if (view_mode != GL_VIEW_TAGS_EDIT) {
+ gl_dbg("ViewMode.%d. now return.", view_mode);
+ return;
+ } else {
+ gl_dbg("Edit Mode");
+ }
+
+ gl_tag_unset_rename(ad);
+
+ int cnt = 0;
+ Eina_Bool checked = elm_check_state_get(obj);;
+
+ gtag->checked = checked;
+ if (checked) {
+ gl_dbg("Append:%s", gtag->tag->tag_name);
+ _gl_data_tags_selected_list_append(ad, gtag);
+ } else {
+ gl_dbg("Remove:%s", gtag->tag->tag_name);
+ _gl_data_tags_selected_list_remove(ad, gtag);
+ }
+
+ cnt = _gl_data_get_tags_selected_cnt(ad);
+
+ /* Display selectioninfo */
+ _gl_notify_create_selinfo(ad, ad->ctrlinfo.ctrlbar_edit_ly,
+ ad->ctrlinfo.nf_it_edit, ad->taginfo.tags_cnt,
+ cnt, false);
+}
+
+static void __gl_tag_flick_left_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ elm_object_scroll_freeze_push(obj);
+}
+
+static void __gl_tag_flick_right_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ elm_object_scroll_freeze_push(obj);
+}
+
+static void __gl_tag_flick_stop_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ elm_object_scroll_freeze_pop(obj);
+}
+
+static void __gl_tag_set_sweep(void *data, Evas_Object *obj, void *event_info)
+{
+ gl_dbg("");
+ GL_CHECK(obj);
+ GL_CHECK(event_info);
+ GL_CHECK(data);
+ gl_appdata *ad = (gl_appdata *)data;
+ gl_tag *gtag = (gl_tag *)elm_object_item_data_get(event_info);
+ GL_CHECK(gtag);
+ GL_CHECK(gtag->tag);
+ if (gtag->tag->_id == GL_TAG_FAVORITES_ID) {
+ gl_dbgW("Favourites item");
+ return;
+ }
+ /* Disable sweep if in wrong view mode */
+ if (gl_get_view_mode(ad) != GL_VIEW_TAGS) {
+ gl_dbgE("Wrong view mode!");
+ return;
+ }
+ if (elm_genlist_item_flip_get(event_info)) {
+ gl_dbgW("In flip mode!");
+ return;
+ }
+ /* Unset rename item first */
+ if (ad->taginfo.rename_item) {
+ gl_dbg("Reset previous rename item first.");
+ gl_tag_unset_rename(ad);
+ }
+ /* Finish other swept item */
+ Elm_Object_Item *it = NULL;
+ it = (Elm_Object_Item *)elm_genlist_decorated_item_get(obj);
+ if (it && it != event_info) {
+ gl_dbg("Reset previous swept item first.");
+ elm_genlist_item_decorate_mode_set(it, "slide", EINA_FALSE);
+ elm_genlist_item_select_mode_set(it, ELM_OBJECT_SELECT_MODE_DEFAULT);
+ }
+ /* Start genlist sweep */
+ elm_genlist_item_decorate_mode_set(event_info, "slide", EINA_TRUE);
+ elm_genlist_item_select_mode_set(event_info, ELM_OBJECT_SELECT_MODE_NONE);
+}
+
+static void __gl_tag_unset_sweep(void *data, Evas_Object *obj, void *event_info)
+{
+ gl_dbg("");
+ GL_CHECK(obj);
+ GL_CHECK(event_info);
+ GL_CHECK(data);
+ gl_appdata *ad = (gl_appdata *)data;
+ gl_tag *gtag = (gl_tag *)elm_object_item_data_get(event_info);
+ GL_CHECK(gtag);
+ GL_CHECK(gtag->tag);
+ if (gtag->tag->_id == GL_TAG_FAVORITES_ID) {
+ gl_dbgW("Favourites item");
+ return;
+ }
+ /* Disable sweep if in wrong view mode */
+ if (gl_get_view_mode(ad) != GL_VIEW_TAGS) {
+ gl_dbgE("Wrong view mode!");
+ return;
+ }
+ if (elm_genlist_item_flip_get(event_info)) {
+ gl_dbgW("In flip mode!");
+ return;
+ }
+ /* Finish genlist sweep */
+ elm_genlist_item_decorate_mode_set(event_info, "slide", EINA_FALSE);
+ elm_genlist_item_select_mode_set(event_info, ELM_OBJECT_SELECT_MODE_DEFAULT);
+}
+
+static void __gl_tag_cancel_sweep(void *data, Evas_Object *obj, void *event_info)
+{
+ gl_dbg("");
+ GL_CHECK(obj);
+ /* Get sweeped item */
+ Elm_Object_Item *it = NULL;
+ it = (Elm_Object_Item *)elm_genlist_decorated_item_get(obj);
+ /* Finish genlist sweep */
+ if (it) {
+ elm_genlist_item_decorate_mode_set(it, "slide", EINA_FALSE);
+ elm_genlist_item_select_mode_set(it, ELM_OBJECT_SELECT_MODE_DEFAULT);
+ }
+}
+
+static void __gl_tag_del_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ gl_dbg("");
+ GL_CHECK(data);
+ gl_tag *gtag = (gl_tag *) data;
+ GL_CHECK(gtag->ad);
+ gl_appdata *ad = (gl_appdata *)gtag->ad;
+
+ if (gl_get_view_mode(ad) == GL_VIEW_TAGS) {
+ gl_popup_create_tag_del_popup(gtag);
+ return;
+ }
+}
+
+static Evas_Object *__gl_tag_get_content(void *data, Evas_Object *obj, const char *part)
+{
+ GL_CHECK_NULL(obj);
+ GL_CHECK_NULL(part);
+ GL_CHECK_NULL(data);
+ gl_tag *gtag = (gl_tag *) data;
+ GL_CHECK_NULL(gtag->tag);
+ GL_CHECK_NULL(gtag->tag->tag_name);
+ GL_CHECK_NULL(gtag->ad);
+ gl_appdata *ad = (gl_appdata *)gtag->ad;
+ //gl_dbg("[%s]", part);
+ //gl_dbg("gtag->tag == %p", gtag->tag);
+
+ if (!g_strcmp0(part, "elm.swallow.checkbox")) {
+ Evas_Object *ck = NULL;
+ if (gl_get_view_mode(ad) == GL_VIEW_TAGS_EDIT) {
+ ck = elm_check_add(obj);
+ GL_CHECK_NULL(ck);
+ evas_object_propagate_events_set(ck, EINA_FALSE);
+ gtag->check_obj = ck;
+ elm_check_state_set(ck, gtag->checked);
+
+ evas_object_smart_callback_add(ck, "changed",
+ _gl_tag_check_changed,
+ data);
+ evas_object_show(ck);
+ }
+
+ return ck;
+ } else if (!g_strcmp0(part, "elm.icon") || !g_strcmp0(part, "elm.slide.icon")) {
+ /*
+ * _gl_tag_icon_get() will be invoked twice for each tag item while create list view.
+ * So return NULL to prevent duplicated setting tag cover at the first time.
+ * Cause it takes much time(about 200ms for tag containing 1000 items) to get data from DB.
+ * Only return right cover at the second time.
+ */
+ if (gtag->cover_set == false && g_strcmp0(part, "elm.slide.icon")) {
+ //gl_dbg("Tag cover will be set next time.");
+ gtag->cover_set = true;
+ return NULL;
+ }
+
+ char image_path[GL_FILE_PATH_LEN_MAX] = { 0, };
+ gl_item *gl_tag_items[1];
+ int item_count = 1;
+
+ if (gtag->tag->_id == GL_TAG_FAVORITES_ID) {
+ /*
+ gl_tag_items[0] = NULL;
+ _gl_data_get_first_several_favor_items(ad, gl_tag_items,
+ &item_count,
+ MEDIA_CONTENT_ORDER_DESC);
+ if (gl_tag_items[0] && gl_tag_items[0]->item) {
+ g_strlcpy(image_path,
+ gl_tag_items[0]->item->thumb_url,
+ GL_FILE_PATH_LEN_MAX);
+ _gl_data_destroy_item(gl_tag_items[0]);
+ gl_tag_items[0] = NULL;
+ } else */{
+ g_strlcpy(image_path, GL_TAG_FAVORITES_THUMB,
+ GL_FILE_PATH_LEN_MAX);
+ }
+ } else if (gtag->tag->count == 0) {
+ g_strlcpy(image_path, GL_DEFAULT_TAG_COVER,
+ GL_FILE_PATH_LEN_MAX);
+ } else {
+ gl_tag_items[0] = NULL;
+ _gl_data_get_first_several_tag_items(ad,
+ gtag->tag->_id,
+ gl_tag_items,
+ &item_count);
+ if (gl_tag_items[0] && gl_tag_items[0]->item) {
+ g_strlcpy(image_path,
+ gl_tag_items[0]->item->thumb_url,
+ GL_FILE_PATH_LEN_MAX);
+ _gl_data_destroy_item(gl_tag_items[0]);
+ gl_tag_items[0] = NULL;
+ } else {
+ g_strlcpy(image_path, GL_DEFAULT_TAG_COVER,
+ GL_FILE_PATH_LEN_MAX);
+ }
+ }
+
+ Evas_Object *bg = elm_bg_add(obj);
+ GL_CHECK_NULL(bg);
+ elm_bg_load_size_set(bg, GL_TAG_ICON_SIZE, GL_TAG_ICON_SIZE);
+ elm_bg_file_set(bg, _GET_ICON(image_path), NULL);
+ evas_object_size_hint_max_set(bg, GL_TAG_ICON_SIZE,
+ GL_TAG_ICON_SIZE);
+ evas_object_size_hint_aspect_set(bg, EVAS_ASPECT_CONTROL_VERTICAL,
+ 1, 1);
+ evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND,
+ EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bg, EVAS_HINT_FILL,
+ EVAS_HINT_FILL);
+ return bg;
+ } else if (!g_strcmp0(part, "elm.swallow.rename")) {
+ Evas_Object *btn = NULL;
+ btn = _gl_but_create_but(obj, NULL, NULL,
+ GL_BUTTON_STYLE_RENAME,
+ __gl_tag_rename1_cb, data);
+ GL_CHECK_NULL(btn);
+ evas_object_propagate_events_set(btn, EINA_FALSE);
+ return btn;
+ } else if (!g_strcmp0(part, "elm.flip.content")) {
+ /* This is used when the flip mode is enabled. */
+ Evas_Object *edit_f = NULL;
+ ad->entryinfo.entry_mode = GL_ENTRY_RENAME_TAG;
+ edit_f = _gl_editfield_create_genlist(ad, obj,
+ gtag->tag->tag_name);
+ return edit_f;
+ } else if (!g_strcmp0(part, "elm.slide.swallow.1")) {
+ Evas_Object *rename_btn = NULL;
+ rename_btn = _gl_but_create_but(obj, NULL, GL_STR_RENAME,
+ GL_BUTTON_STYLE_SWEEP,
+ __gl_tag_rename2_cb, gtag);
+ GL_CHECK_NULL(rename_btn);
+ return rename_btn;
+ } else if (!g_strcmp0(part, "elm.slide.swallow.2")) {
+ Evas_Object *del_btn = NULL;
+ del_btn = _gl_but_create_but(obj, NULL, GL_STR_DELETE,
+ GL_BUTTON_STYLE_SWEEP_DELETE,
+ __gl_tag_del_cb, data);
+ GL_CHECK_NULL(del_btn);
+ return del_btn;
+ }
+
+ return NULL;
+}
+
+static void
+_gl_tag_list_sel(void *data, Evas_Object * obj, void *event_info)
+{
+ gl_dbg("");
+}
+
+/*
+* back to tags list view
+*/
+static void __gl_tags_comeback_from_view_cb(void *data, Evas_Object *obj,
+ void *event_info)
+{
+ GL_CHECK(data);
+ gl_appdata *ad = (gl_appdata *)data;
+ gl_dbg("");
+
+ /* Delete callback when it is clicked to prevent it is called for many times */
+ evas_object_smart_callback_del(obj, "clicked",
+ __gl_tags_comeback_from_view_cb);
+
+ /* Hide title from animation */
+ gl_ui_set_navi_title_visible(ad, EINA_FALSE);
+
+ /* Change to tags view */
+ _gl_tag_comeback_from_view(data);
+ _gl_ctrl_disable_btn(ad, false, GL_NAVI_TAGS);
+}
+
+/*
+* after tag selected, show medias of this tag.
+*/
+static int
+_gl_tag_show_thumbs(void *data, gl_tag * gtag)
+{
+ GL_CHECK_VAL(gtag, -1);
+ GL_CHECK_VAL(gtag->tag, -1);
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ gl_dbg("");
+
+ if (gl_get_view_mode(ad) != GL_VIEW_TAGS)
+ {
+ gl_dbg("EditMode.. now return.");
+ return -1;
+ }
+
+ gl_dbg("current tag %s , id=%d", gtag->tag->tag_name, gtag->tag->_id);
+
+ if (gtag->tag->_id == GL_TAG_FAVORITES_ID) // get favorites tag
+ _gl_data_get_item_list(ad, GL_CATEGORY_FAVORITES, NULL,
+ GL_GET_ALL_RECORDS, GL_GET_UNTIL_LAST_RECORD);
+ else // get normal tags
+ _gl_data_get_item_list_tagname(ad, gtag->tag->_id, true, NULL);
+
+ /* Set current tag */
+ ad->taginfo.current_tag = gtag;
+
+ _gl_thumbs_create_view(ad, GL_NAVI_THUMBS, gtag->tag->tag_name, false,
+ __gl_tags_comeback_from_view_cb);
+ gl_dbg("done _gl_tag_show_thumbs");
+ return 0;
+}
+
+/*
+* 1. Edit view mode, check checkbox if selected;
+* 2. Normal view moce, show thumbnails view of selected tag.
+*/
+static void _gl_tag_sel(void *data, Evas_Object *obj, void *event_info)
+{
+ GL_CHECK(obj);
+ GL_CHECK(data);
+ gl_tag *gtag = (gl_tag *) data;
+ GL_CHECK(gtag->ad);
+ gl_appdata *ad = (gl_appdata *)gtag->ad;
+ gl_dbg("");
+
+ Elm_Object_Item *gen_item = elm_genlist_selected_item_get(obj);
+ GL_CHECK(gen_item);
+ elm_genlist_item_selected_set(gen_item, EINA_FALSE);
+ if (elm_genlist_item_flip_get(gen_item))
+ return;
+
+ /* Save scroller position before clearing gengrid */
+ _gl_ui_save_scroller_pos(obj);
+ if (ad->taginfo.rename_item) {
+ gl_tag_unset_rename(ad);
+ return;
+ }
+
+ int cnt = 0;
+ int view_mode = gl_get_view_mode(ad);
+ gl_dbg("tag %s selected...", gtag->tag->tag_name);
+
+ if (view_mode == GL_VIEW_TAGS_EDIT) {
+ gtag->checked = !gtag->checked;
+ elm_check_state_set(gtag->check_obj, gtag->checked);
+
+ if (gtag->checked) {
+ gl_dbg("Append");
+ _gl_data_tags_selected_list_append(ad, gtag);
+ } else {
+ gl_dbg("Remove");
+ _gl_data_tags_selected_list_remove(ad, gtag);
+ }
+
+ cnt = _gl_data_get_tags_selected_cnt(ad);
+ /* Display selectioninfo */
+ _gl_notify_create_selinfo(ad, ad->ctrlinfo.ctrlbar_edit_ly,
+ ad->ctrlinfo.nf_it_edit,
+ ad->taginfo.tags_cnt, cnt, false);
+ } else {
+ _gl_tag_show_thumbs(ad, gtag);
+ }
+}
+
+// _gl_tag_list_drag_cb is called when the item is dragged
+static void
+_gl_tag_list_drag_cb(void *data, Evas_Object * obj, void *event_info)
+{
+ GL_CHECK(data);
+ gl_appdata *ad = (gl_appdata *)data;
+
+ gl_tag_unset_rename(ad);
+}
+
+static void _gl_tag_update_view(void *data, Evas_Object * obj, void *event_info)
+{
+ GL_CHECK(data);
+ gl_appdata *ad = (gl_appdata *)data;
+ Evas_Object *genlist = obj;
+ int item_cnt = 0;
+ Eina_List *tag_elist = NULL;
+ int view_mode = gl_get_view_mode(ad);
+ gl_dbg("view_mode: %d.", view_mode);
+
+ if (elm_genlist_items_count(genlist) > 0) {
+ /* Save scroller position before clearing gengrid */
+ _gl_ui_save_scroller_pos(genlist);
+ /* Clear old view */
+ elm_genlist_clear(genlist);
+ }
+
+ if (view_mode == GL_VIEW_TAGS) {
+ ad->taginfo.taglic.item_style = GL_GENLIST_ITEM_STYLE_TAGS;
+ _gl_data_get_tag_list(ad, &tag_elist);
+ } else {
+ ad->taginfo.taglic.item_style = GL_GENLIST_ITEM_STYLE_TAGS_EDIT;
+ tag_elist = ad->taginfo.tags_elist;
+ }
+
+ if (tag_elist == NULL) {
+ gl_dbgE("Invalid tag_elist!");
+ }
+
+ Eina_List *tmp_elist = NULL;
+ gl_tag *gtag = NULL;
+ Elm_Genlist_Item_Class *plic = NULL;
+ EINA_LIST_FOREACH(tag_elist, tmp_elist, gtag) {
+ if (gtag == NULL || gtag->tag == NULL) {
+ gl_dbgE("Invalid gtag!");
+ continue;
+ }
+
+ if (view_mode == GL_VIEW_TAGS_EDIT &&
+ gtag->tag->_id == GL_TAG_FAVORITES_ID) {
+ gl_dbg("Favorites tag, skipping in edit mode");
+ continue;
+ } else if (view_mode == GL_VIEW_TAGS_EDIT ||
+ gtag->tag->_id == GL_TAG_FAVORITES_ID) {
+ plic = &(ad->taginfo.taglic);
+ } else {
+ plic = &(ad->taginfo.sweeplic);
+ }
+
+ gl_dbg("===Append tag [%s]", gtag->tag->tag_name);
+ gtag->item = elm_genlist_item_append(genlist, plic,
+ (void *)gtag, NULL,
+ ELM_GENLIST_ITEM_NONE,
+ _gl_tag_sel, gtag);
+ item_cnt++;
+ }
+
+ /* Restore previous position of scroller */
+ _gl_ui_restore_scroller_pos(genlist);
+ ad->taginfo.tags_cnt = item_cnt;
+ evas_object_smart_callback_add(genlist, "selected", _gl_tag_list_sel,
+ NULL);
+}
+
+static int __gl_tags_reset_view(void *data, bool is_tag)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ int view_mode = gl_get_view_mode(data);
+ gl_dbg("view_mode: %d", view_mode);
+
+ /* Change to Tags view first */
+ if (view_mode != GL_VIEW_TAGS && view_mode != GL_VIEW_TAGS_EDIT) {
+ gl_destroy_thumbs_view(data);
+ _gl_tag_comeback_from_view(data);
+ } else if (view_mode == GL_VIEW_TAGS &&
+ ad->entryinfo.entry_mode == GL_ENTRY_NEW_TAG) {
+ gl_del_invalid_widgets(data, GL_INVALID_NEW_ENTRY);
+ } else if (view_mode == GL_VIEW_TAGS_EDIT) {
+ /* is_tag is false, clear edit would be done in view_change_cb of tabbar */
+ if (is_tag)
+ _gl_tags_edit_pop_view(data);
+ }
+
+ return 0;
+}
+
+static void __gl_tags_edit_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ GL_CHECK(data);
+ gl_appdata *ad = (gl_appdata *)data;
+
+ if (ad->uginfo.ug_called_by_me || ad->gridinfo.grid_append_idler) {
+ /**
+ * Prevent changed to edit view in wrong way.
+ * 1. When invoke imageviewer UG;
+ * 2. First show thumbnails view, use idler to append other medias.
+ */
+ gl_dbgW("UG invoked!");
+ return;
+ }
+ _gl_ctxpopup_del(data);
+
+ int view_mode = gl_get_view_mode(data);
+ gl_dbg("mode: %d", view_mode);
+ if (view_mode == GL_VIEW_TAGS)
+ _gl_tags_edit_create_view(data);
+ else
+ gl_dbgE("Wrong view mode!");
+}
+
+/*
+* In tags list view, when tap "add tag button" in title bar, show UI for adding tag.
+* Add a new tag to tags list.
+*/
+static void _gl_tags_create_tag_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ GL_CHECK(data);
+ gl_dbg("");
+ _gl_ctxpopup_del(data);
+ _gl_tags_new_create_view(data);
+}
+
+static int __gl_tags_ctxpopup_append(void *data, Evas_Object *parent)
+{
+ gl_dbg("");
+ GL_CHECK_VAL(parent, -1);
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+
+ /* Show edit item */
+ if (!ad->taginfo.b_edit_disable)
+ elm_ctxpopup_item_append(parent, GL_STR_EDIT, NULL,
+ __gl_tags_edit_cb, data);
+ elm_ctxpopup_item_append(parent, GL_STR_CREATE_TAG, NULL,
+ _gl_tags_create_tag_cb, data);
+ return 0;
+}
+
+static void __gl_tags_more_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ gl_dbg("more button clicked");
+ /* Add 'Edit' + 'Create tag' */
+ GL_CHECK(data);
+ _gl_ctxpopup_create(data, obj, __gl_tags_ctxpopup_append);
+}
+
+/**
+ * Launch camera
+ */
+static void __gl_tags_camera_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ GL_CHECK(data);
+ gl_dbg("");
+ _gl_ext_load_camera();
+}
+
+int _gl_tags_add_btns(void *data)
+{
+ gl_dbg("");
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ GL_CHECK_VAL(ad->maininfo.naviframe, -1);
+ GL_CHECK_VAL(ad->ctrlinfo.nf_it, -1);
+ Evas_Object *parent = ad->maininfo.naviframe;
+ Elm_Object_Item *nf_it = ad->ctrlinfo.nf_it;
+ Evas_Object *btn = NULL;
+
+ /* Remove btns */
+ _gl_ui_clear_btns(data);
+
+ /* More */
+ btn = _gl_but_create_but(parent, NULL, NULL,
+ GL_BUTTON_STYLE_NAVI_MORE,
+ __gl_tags_more_cb, data);
+ GL_CHECK_VAL(btn, -1);
+ elm_object_item_part_content_set(nf_it, GL_NAVIFRAME_MORE, btn);
+ /* not only favorites tag */
+ if (_gl_data_get_tag_count_all(ad) > 1)
+ ad->taginfo.b_edit_disable = false;
+ else
+ ad->taginfo.b_edit_disable = true;
+ /* Camera */
+ btn = _gl_but_create_but(parent, NULL, GL_STR_CAMERA,
+ GL_BUTTON_STYLE_NAVI_TOOLBAR,
+ __gl_tags_camera_cb, data);
+ GL_CHECK_VAL(btn, -1);
+ elm_object_item_part_content_set(nf_it, GL_NAVIFRAME_BTN1, btn);
+ return 0;
+}
+
+/* Unset rename mode if any item is in rename mode */
+int gl_tag_unset_rename(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ gl_dbg("");
+
+ _gl_editfield_destroy_imf(ad);
+
+ /* Enable buttons in toolbar */
+ if (gl_get_view_mode(ad) == GL_VIEW_TAGS)
+ _gl_ctrl_disable_btns(ad, ad->ctrlinfo.nf_it, false);
+
+ if (ad->taginfo.rename_item)
+ elm_genlist_item_flip_set(ad->taginfo.rename_item, EINA_FALSE);
+
+ ad->taginfo.rename_item = NULL;
+ /* Set current gtag NULL for rename */
+ ad->taginfo.current_tag = NULL;
+
+ return 0;
+}
+
+/* Free data after layout deleted */
+static void __gl_tags_delete_layout_cb(void *data, Evas *e, Evas_Object *obj,
+ void *ei)
+{
+ gl_dbg("Delete layout ---");
+ GL_CHECK(data);
+ gl_appdata *ad = (gl_appdata *)data;
+ _gl_ui_del_scroller_pos(ad->taginfo.tags_view);
+ gl_dbg("Delete layout +++");
+}
+
+Evas_Object *gl_tag_create_view(void *data, Evas_Object *parent)
+{
+ GL_CHECK_NULL(data);
+ gl_appdata *ad = (gl_appdata *)data;
+ Evas_Object *genlist = NULL;
+ int item_cnt = 0;
+ int view_mode = gl_get_view_mode(ad);
+ gl_dbg("");
+
+ ad->taginfo.rename_item = NULL;
+ /* Set current gtag NULL for rename */
+ ad->taginfo.current_tag = NULL;
+
+ if (view_mode == GL_VIEW_TAGS_EDIT) {
+ ad->taginfo.taglic.item_style = GL_GENLIST_ITEM_STYLE_TAGS_EDIT;
+ } else {
+ ad->taginfo.taglic.item_style = GL_GENLIST_ITEM_STYLE_TAGS;
+ /* Sweep class */
+ ad->taginfo.sweeplic.item_style = GL_GENLIST_ITEM_STYLE_TAGS;
+ ad->taginfo.sweeplic.decorate_item_style = GL_GENLIST_ITEM_STYLE_SWEEP2_TAG;
+ ad->taginfo.sweeplic.func.text_get = __gl_tag_get_text;
+ ad->taginfo.sweeplic.func.content_get = __gl_tag_get_content;
+ }
+ ad->taginfo.taglic.decorate_item_style = NULL;
+ ad->taginfo.taglic.decorate_all_item_style = NULL;
+ ad->taginfo.taglic.func.text_get = __gl_tag_get_text;
+ ad->taginfo.taglic.func.content_get = __gl_tag_get_content;
+ genlist = elm_genlist_add(parent);
+ elm_object_style_set(genlist, GL_GENLIST_STYLE_DEFAULT);
+ evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND,
+ EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(genlist, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ _gl_ui_reset_scroller_pos(genlist);
+
+ Eina_List *tag_elist = NULL;
+ _gl_data_get_tag_list(ad, &tag_elist);
+ GL_CHECK_NULL(tag_elist);
+
+ Eina_List *tmp_elist = NULL;
+ gl_tag *gtag = NULL;
+ Elm_Genlist_Item_Class *plic = NULL;
+ EINA_LIST_FOREACH(tag_elist, tmp_elist, gtag) {
+ if (!gtag || !gtag->tag) {
+ gl_dbgE("Invalid tag!");
+ continue;
+ }
+
+ if (view_mode == GL_VIEW_TAGS_EDIT &&
+ gtag->tag->_id == GL_TAG_FAVORITES_ID) {
+ gl_dbg("Favorites tag, skipping in edit mode");
+ continue;
+ } else if (view_mode == GL_VIEW_TAGS_EDIT ||
+ gtag->tag->_id == GL_TAG_FAVORITES_ID) {
+ plic = &(ad->taginfo.taglic);
+ } else {
+ plic = &(ad->taginfo.sweeplic);
+ }
+
+ gl_dbg("===Append tag [%s]", gtag->tag->tag_name);
+ gtag->item = elm_genlist_item_append(genlist, plic,
+ (void *)gtag, NULL,
+ ELM_GENLIST_ITEM_NONE,
+ _gl_tag_sel, gtag);
+ item_cnt++;
+ }
+
+ ad->taginfo.tags_cnt = item_cnt;
+ if (view_mode == GL_VIEW_TAGS_EDIT) {
+ evas_object_smart_callback_add(genlist, "drag,start,up",
+ _gl_tag_list_drag_cb, ad);
+ evas_object_smart_callback_add(genlist, "drag,start,down",
+ _gl_tag_list_drag_cb, ad);
+ } else {
+ /* Stop flicking(up/down direction) when sweep list item*/
+ evas_object_smart_callback_add(genlist, "drag,start,left",
+ __gl_tag_flick_left_cb, ad);
+ evas_object_smart_callback_add(genlist, "drag,start,right",
+ __gl_tag_flick_right_cb, ad);
+ evas_object_smart_callback_add(genlist, "drag,stop",
+ __gl_tag_flick_stop_cb, ad);
+ /* Add callback for sweeping */
+ evas_object_smart_callback_add(genlist, "drag,start,right",
+ __gl_tag_set_sweep, ad);
+ evas_object_smart_callback_add(genlist, "drag,start,left",
+ __gl_tag_unset_sweep, ad);
+ evas_object_smart_callback_add(genlist, "drag,start,up",
+ __gl_tag_cancel_sweep, ad);
+ evas_object_smart_callback_add(genlist, "drag,start,down",
+ __gl_tag_cancel_sweep, ad);
+ }
+
+ if (item_cnt > 0)
+ evas_object_smart_callback_add(genlist, "selected",
+ _gl_tag_list_sel, NULL);
+ else
+ gl_dbgE("Favorites tag would be displayed at least!");
+
+ /* Register delete callback */
+ evas_object_event_callback_add(parent, EVAS_CALLBACK_DEL,
+ __gl_tags_delete_layout_cb, data);
+
+ return genlist;
+}
+
+int gl_tag_update_view(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ int view_mode = gl_get_view_mode(ad);
+ Evas_Object *view_obj = NULL;
+ gl_dbg("view_mode: %d.", view_mode);
+
+ if (view_mode == GL_VIEW_TAGS) {
+ GL_CHECK_VAL(ad->taginfo.tags_view, -1);
+ view_obj = ad->taginfo.tags_view;
+ } else if (view_mode == GL_VIEW_TAGS_EDIT) {
+ GL_CHECK_VAL(ad->ctrlinfo.ctrlbar_edit_view, -1);
+ view_obj = ad->ctrlinfo.ctrlbar_edit_view;
+ }
+
+ _gl_tag_update_view(ad, view_obj, NULL);
+
+ return 0;
+}
+
+/*
+* back to tags list view
+*/
+int _gl_tag_comeback_from_view(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ gl_dbg("");
+
+ gl_ctrl_rotate_ctrlbar(ad, GL_VIEW_TAGS);
+ gl_set_view_mode(ad, GL_VIEW_TAGS);
+ ad->taginfo.current_tag = NULL;
+ gl_tag_update_view(ad);
+
+ _gl_thumbs_delete_view(ad);
+ gl_dbg("done");
+ return 0;
+}
+
+bool _gl_tags_sel_home_tag(void *data, const char *tag_id)
+{
+ GL_CHECK_FALSE(data);
+ gl_tag *gtag = NULL;
+ gl_dbg("");
+
+ if (tag_id == NULL) {
+ gl_dbgE("Invalid parameters!");
+ goto GL_TAGS_FAILED;
+ }
+
+ /* Find selected tag */
+ _gl_data_get_tag_by_id(data, atoi(tag_id), >ag);
+ if (gtag == NULL || gtag->tag == NULL || gtag->tag->tag_name == NULL) {
+ gl_dbgE("Tag doesn't exit!");
+ goto GL_TAGS_FAILED;
+ }
+ _gl_tag_show_thumbs(data, gtag);
+
+ return true;
+
+ GL_TAGS_FAILED:
+
+ gl_popup_create_popup(data, GL_POPUP_NOBUT_APPEXIT,
+ GL_STR_NO_TAGS);
+ /* Update tags view */
+ gl_tag_update_view(data);
+
+ return false;
+}
+
+int _gl_tags_reset_view(void *data, const char *tag_id, const char *aul_type)
+{
+ GL_CHECK_VAL(aul_type, -1);
+ GL_CHECK_VAL(tag_id, -1);
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+
+ if (!g_strcmp0(aul_type, GL_AUL_TAG)) {
+ gl_tag *gtag = ad->taginfo.current_tag;
+ if (gtag && gtag->tag && (gtag->tag->_id == atoi(tag_id))) {
+ gl_dbg("Current tag, update view");
+ int view_mode = gl_get_view_mode(data);
+ if (view_mode == GL_VIEW_THUMBS_EDIT) {
+ gl_del_invalid_widgets(data, GL_INVALID_NONE);
+ _gl_thumbs_edit_pop_view(data);
+ } else {
+ gl_update_view(data, GL_UPDATE_VIEW_NORMAL);
+ }
+ return -1;
+ }
+
+ __gl_tags_reset_view(data, true);
+ } else {
+ __gl_tags_reset_view(data, false);
+
+ _gl_ctrl_sel_tabbar_item(data, aul_type);
+ }
+
+ return 0;
+}
+
+const char *_gl_tags_get_current_tag_name(void *data)
+{
+ GL_CHECK_FALSE(data);
+ gl_appdata *ad = (gl_appdata *)data;
+ GL_CHECK_FALSE(ad->taginfo.current_tag);
+ GL_CHECK_FALSE(ad->taginfo.current_tag->tag);
+ GL_CHECK_FALSE(ad->taginfo.current_tag->tag->tag_name);
+
+ return ad->taginfo.current_tag->tag->tag_name;
+}
+
+/* Delete one tag item in normal view */
+int _gl_tags_del(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_tag *gtag = (gl_tag *)data;
+ GL_CHECK_VAL(gtag->ad, -1);
+ gl_appdata *ad = (gl_appdata *)gtag->ad;
+ GL_CHECK_VAL(ad->taginfo.tags_view, -1);
+ gl_dbg("");
+
+ /* Mode item */
+ Elm_Object_Item *it = NULL;
+ it = (Elm_Object_Item *)elm_genlist_decorated_item_get(ad->taginfo.tags_view);
+ /* Finish genlist sweep*/
+ if (it) {
+ elm_genlist_item_decorate_mode_set(it, "slide", EINA_FALSE);
+ elm_genlist_item_select_mode_set(it, ELM_OBJECT_SELECT_MODE_ALWAYS);
+ }
+
+ GL_CHECK_VAL(gtag->item, -1);
+ elm_object_item_del(gtag->item);
+ /* Remove tag from list, destroy it and remove its record from DB */
+ _gl_data_tags_list_remove(ad, gtag);
+ /* Disable edit item if only 'favourites' item exits */
+ if (_gl_data_get_tag_count_all(ad) <= 1) {
+ _gl_ctrl_disable_btn(ad, true, GL_NAVI_TAGS);
+ }
+ /* Add notification */
+ _gl_notify_create_notiinfo(ad, GL_STR_DELETED);
+ return 0;
+}
+
+int _gl_tags_update_lang(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ gl_tag_update_view(ad);
+ GL_CHECK_VAL(ad->ctrlinfo.nf_it, -1);
+ _gl_ui_set_btns_text(ad->ctrlinfo.nf_it, GL_STR_CAMERA, NULL);
+ return 0;
+}
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "gl-thumbs-edit.h"
+#include "gl-thumbs.h"
+#include "gl-debug.h"
+#include "gl-strings.h"
+#include "gl-ui-util.h"
+#include "gl-util.h"
+#include "gl-data.h"
+#include "gl-icons.h"
+#include "gl-controlbar.h"
+#include "gl-ctxpopup.h"
+#include "gl-button.h"
+#include "gl-notify.h"
+#include "gl-popup.h"
+#include "gl-lang.h"
+#include "gl-ext-exec.h"
+#include "gl-ext-ug-load.h"
+#include "gl-fs.h"
+
+static void __gl_thumbs_edit_trans_finished_cb(void *data, Evas_Object *obj,
+ void *event_info)
+{
+ GL_CHECK(data);
+ gl_appdata *ad = (gl_appdata *)data;
+ int view_mode = gl_get_view_mode(ad);
+ gl_dbgW("view_mode: %d", view_mode);
+ evas_object_smart_callback_del(obj, GL_TRANS_FINISHED,
+ __gl_thumbs_edit_trans_finished_cb);
+
+ /* Clear previous view after animation finished */
+ if (view_mode == GL_VIEW_THUMBS_EDIT) {
+ if (ad->entryinfo.entry_mode != GL_ENTRY_NONE)
+ return;
+ elm_gengrid_clear(ad->gridinfo.all_grid_view);
+ } else {
+ gl_dbgE("Wrong view mode!");
+ }
+}
+
+/* callback after user tap Cancel button in option header in edit view */
+static void __gl_thumbs_edit_cancel_cb(void *data, Evas_Object *obj,
+ void *event_info)
+{
+ GL_CHECK(data);
+ GL_CHECK(obj);
+ gl_dbg("");
+ /* Disable item when it is clicked to prevent it is called for many times */
+ if (_gl_thumbs_edit_pop_view(data) == 0)
+ _gl_ui_disable_btn(obj);
+}
+
+static void __gl_thumbs_edit_share_cb(void *data, Evas_Object *obj,
+ void *event_info)
+{
+ GL_CHECK(data);
+ gl_appdata *ad = (gl_appdata *)data;
+ gl_dbg("");
+
+ if (ad->uginfo.ug_called_by_me || ad->uginfo.app_called_by_me) {
+ gl_dbgW("UG or APP is already loaded!");
+ return;
+ }
+
+ int view_mode = gl_get_view_mode(ad);
+ int cnt = 0;
+ if (view_mode == GL_VIEW_THUMBS_EDIT) {
+ cnt = _gl_data_selected_list_count(ad);
+ if (cnt == 0) {
+ gl_dbg("No thumbs selected, return!");
+ gl_popup_create_popup(ad, GL_POPUP_NOBUT,
+ GL_STR_NO_FILES_SELECTED);
+ return;
+ }
+ } else {
+ gl_dbgE("Unknow mode!");
+ return;
+ }
+
+ _gl_ctxpopup_create_share(data, obj);
+}
+
+static void __gl_thumbs_edit_addtag_cb(void *data, Evas_Object *obj,
+ void *event_info)
+{
+ GL_CHECK(data);
+ gl_appdata *ad = (gl_appdata *)data;
+ gl_dbg("");
+
+ if (ad->uginfo.ug_called_by_me || ad->uginfo.app_called_by_me) {
+ gl_dbgW("UG or APP is already loaded!");
+ return;
+ }
+ _gl_ctxpopup_del(data);
+
+ int view_mode = gl_get_view_mode(ad);
+ if (view_mode == GL_VIEW_THUMBS_EDIT) {
+ if (_gl_data_selected_list_count(ad) == 0) {
+ gl_dbg("No thumbs selected, return!");
+ gl_popup_create_popup(ad, GL_POPUP_NOBUT,
+ GL_STR_NO_FILES_SELECTED);
+ return;
+ }
+ } else {
+ gl_dbgW("Unknow mode!");
+ return;
+ }
+
+ _gl_ctxpopup_create_addtag(ad);
+}
+
+/* move media to album in edit view */
+static void __gl_thumbs_edit_move_cb(void *data, Evas_Object *obj,
+ void *event_info)
+{
+ GL_CHECK(data);
+ _gl_ctxpopup_del(data);
+ gl_appdata *ad = (gl_appdata *)data;
+ int view_mode = gl_get_view_mode(data);
+ gl_dbg("");
+
+ if (ad->uginfo.ug_called_by_me || ad->uginfo.app_called_by_me) {
+ gl_dbgW("UG or APP is already loaded!");
+ return;
+ }
+
+ if (view_mode == GL_VIEW_THUMBS_EDIT) {
+ if (_gl_data_selected_list_count(data) == 0) {
+ gl_dbgW("No thumbs selected!");
+ gl_popup_create_popup(data, GL_POPUP_NOBUT,
+ GL_STR_NO_FILES_SELECTED);
+ return;
+ }
+
+ _gl_ctxpopup_create_move(data);
+ } else {
+ gl_dbgE("Unknow mode!");
+ }
+}
+
+#ifdef _USE_ROTATE_BG
+static void __gl_thumbs_edit_rotate_left_cb(void *data, Evas_Object *obj,
+ void *event_info)
+{
+ GL_CHECK(data);
+ if (_gl_data_selected_list_count(data) == 0) {
+ gl_dbgW("No thumbs selected!");
+ gl_popup_create_popup(data, GL_POPUP_NOBUT,
+ GL_STR_NO_FILES_SELECTED);
+ return;
+ }
+ _gl_ctxpopup_del(data);
+ _gl_rotate_images(data, true);
+}
+
+static void __gl_thumbs_edit_rotate_right_cb(void *data, Evas_Object *obj,
+ void *event_info)
+{
+ GL_CHECK(data);
+ if (_gl_data_selected_list_count(data) == 0) {
+ gl_dbgW("No thumbs selected!");
+ gl_popup_create_popup(data, GL_POPUP_NOBUT,
+ GL_STR_NO_FILES_SELECTED);
+ return;
+ }
+ _gl_ctxpopup_del(data);
+ _gl_rotate_images(data, false);
+}
+#endif
+
+static int __gl_thumbs_edit_ctxpopup_append(void *data, Evas_Object *parent)
+{
+ gl_dbg("");
+ GL_CHECK_VAL(parent, -1);
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+
+ if (ad->ctrlinfo.tab_mode != GL_CTRL_TAB_TAGS) {
+ elm_ctxpopup_item_append(parent, GL_STR_ADD_TAG, NULL,
+ __gl_thumbs_edit_addtag_cb, data);
+ if (ad->ctrlinfo.tab_mode == GL_CTRL_TAB_ALBUMS)
+ elm_ctxpopup_item_append(parent, GL_STR_MOVE, NULL,
+ __gl_thumbs_edit_move_cb,
+ data);
+ }
+
+ if (!ad->gridinfo.b_slideshow_disable)
+ elm_ctxpopup_item_append(parent, GL_STR_SLIDESHOW, NULL,
+ _gl_ui_slideshow_cb, data);
+
+#ifdef _USE_ROTATE_BG
+ if (ad->gridinfo.view_mode != GL_THUMB_VIDEOS) {
+ int share_m = gl_get_share_mode(ad);
+ if (share_m == GL_SHARE_IMAGE_ONE_JPEG ||
+ share_m == GL_SHARE_IMAGE_MULTI_JPEG) {
+ gl_dbg("Enable more button");
+ elm_ctxpopup_item_append(parent, GL_STR_ROTATE_LEFT,
+ NULL,
+ __gl_thumbs_edit_rotate_left_cb,
+ data);
+ elm_ctxpopup_item_append(parent, GL_STR_ROTATE_RIGHT,
+ NULL,
+ __gl_thumbs_edit_rotate_right_cb,
+ data);
+ }
+ }
+#endif
+ return 0;
+}
+
+static void __gl_thumbs_edit_more_cb(void *data, Evas_Object *obj,
+ void *event_info)
+{
+ gl_dbg("more button clicked");
+ /* Add items */
+ GL_CHECK(data);
+ _gl_ctxpopup_create(data, obj, __gl_thumbs_edit_ctxpopup_append);
+}
+
+static void __gl_thumbs_edit_del_cb(void *data, Evas_Object *obj,
+ void *event_info)
+{
+ GL_CHECK(data);
+ gl_appdata *ad = (gl_appdata *)data;
+ gl_dbg("");
+
+ if (ad->uginfo.ug_called_by_me || ad->uginfo.app_called_by_me) {
+ gl_dbgW("UG or APP is already loaded!");
+ return;
+ }
+
+ int view_mode = gl_get_view_mode(ad);
+ if (view_mode == GL_VIEW_THUMBS_EDIT) {
+ int cnt = _gl_data_selected_list_count(ad);
+ if (cnt == 0)
+ {
+ gl_dbgW("No thumbs selected!");
+ gl_popup_create_popup(ad, GL_POPUP_NOBUT, GL_STR_NO_FILES_SELECTED);
+ return;
+ }
+
+ gl_del_medias(ad);
+ } else {
+ gl_dbgW("Unknow mode!");
+ }
+}
+
+static void __gl_thumbs_edit_remove_cb(void *data, Evas_Object *obj,
+ void *event_info)
+{
+ GL_CHECK(data);
+ gl_appdata *ad = (gl_appdata *)data;
+ gl_dbg("");
+
+ if (ad->uginfo.ug_called_by_me || ad->uginfo.app_called_by_me) {
+ gl_dbgW("UG or APP is already loaded!");
+ return;
+ }
+
+ if (_gl_data_selected_list_count(ad) == 0) {
+ gl_dbgW("No thumbs selected!");
+ gl_popup_create_popup(ad, GL_POPUP_NOBUT,
+ GL_STR_NO_FILES_SELECTED);
+ return;
+ }
+
+ int view_mode = gl_get_view_mode(ad);
+ if (view_mode == GL_VIEW_THUMBS_EDIT) {
+ if (ad->ctrlinfo.tab_mode == GL_CTRL_TAB_TAGS)
+ gl_remove_tag_items(data);
+ } else {
+ gl_dbgE("Unkonw mode!");
+ }
+}
+
+/**
+ * Use naviframe api to push thumbnails eidt view to stack.
+ * @param obj is the content to be pushed.
+ */
+static int __gl_thumbs_edit_push_view(void *data, Evas_Object *parent,
+ Evas_Object *obj, char *title)
+{
+ gl_dbg("GL_NAVI_THUMBS_EDIT");
+ GL_CHECK_VAL(obj, -1);
+ GL_CHECK_VAL(parent, -1);
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ Elm_Object_Item *nf_it = NULL;
+
+ /* Add transition finished callback */
+ evas_object_smart_callback_add(parent, GL_TRANS_FINISHED,
+ __gl_thumbs_edit_trans_finished_cb,
+ data);
+ Evas_Object *end_btn = NULL;
+ end_btn = _gl_but_create_but(parent, NULL, NULL,
+ GL_BUTTON_STYLE_NAVI_PRE,
+ __gl_thumbs_edit_cancel_cb, data);
+ GL_CHECK_VAL(end_btn, -1);
+ /* Push to stack */
+ nf_it = elm_naviframe_item_push(parent, title, end_btn, NULL, obj, NULL);
+ ad->gridinfo.nf_it_edit = nf_it;
+
+ return _gl_thumbs_edit_add_btns(data, parent, nf_it);
+}
+
+int _gl_thumbs_edit_add_btns(void *data, Evas_Object *parent,
+ Elm_Object_Item *nf_it)
+{
+ GL_CHECK_VAL(nf_it, -1);
+ GL_CHECK_VAL(parent, -1);
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ Evas_Object *btn = NULL;
+
+ /* Remove slideshow button */
+ _gl_ui_disable_slideshow(ad, true);
+
+ /* More */
+ btn = _gl_but_create_but(parent, NULL, NULL,
+ GL_BUTTON_STYLE_NAVI_MORE,
+ __gl_thumbs_edit_more_cb,
+ data);
+ GL_CHECK_VAL(btn, -1);
+ elm_object_item_part_content_set(nf_it,
+ GL_NAVIFRAME_MORE,
+ btn);
+ _gl_ui_disable_btn(btn);
+ /* Delete */
+ if (ad->ctrlinfo.tab_mode == GL_CTRL_TAB_ALBUMS)
+ btn = _gl_but_create_but(parent, NULL, GL_STR_DELETE,
+ GL_BUTTON_STYLE_NAVI_TOOLBAR_RIGHT,
+ __gl_thumbs_edit_del_cb, data);
+ else /* Remove */
+ btn = _gl_but_create_but(parent, NULL, GL_STR_REMOVE,
+ GL_BUTTON_STYLE_NAVI_TOOLBAR_RIGHT,
+ __gl_thumbs_edit_remove_cb,
+ data);
+ GL_CHECK_VAL(btn, -1);
+ elm_object_item_part_content_set(nf_it, GL_NAVIFRAME_BTN2, btn);
+ _gl_ui_disable_btn(btn);
+ /* Share */
+ btn = _gl_but_create_but(parent, NULL, GL_STR_SHARE,
+ GL_BUTTON_STYLE_NAVI_TOOLBAR_LEFT,
+ __gl_thumbs_edit_share_cb, data);
+ GL_CHECK_VAL(btn, -1);
+ elm_object_item_part_content_set(nf_it, GL_NAVIFRAME_BTN1, btn);
+ _gl_ui_disable_btn(btn);
+
+ return 0;
+}
+
+int _gl_thumbs_edit_create_view(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ if (ad->uginfo.ug_called_by_me || ad->gridinfo.grid_append_idler) {
+ /**
+ * Prevent changed to edit view in wrong way.
+ * 1. When invoke imageviewer UG;
+ * 2. First show thumbnails view, use idler to append other medias.
+ */
+ gl_dbg("UG invoked or appending gridview.");
+ return -1;
+ }
+ _gl_ctxpopup_del(data);
+
+ int view_mode = gl_get_view_mode(data);
+ gl_dbg("mode: %d", view_mode);
+ if (view_mode == GL_VIEW_THUMBS_EDIT) {
+ /* Fixme: maybe we should disable edit button until grid append idler is done */
+ /**
+ * Happen in quickly tap edit button,
+ * it will invoke edit_cb several time
+ * and push some unuseful views.
+ */
+ gl_dbg("Already in edit mode, return.");
+ return -1;
+ }
+
+ Evas_Object *layout = NULL;
+ layout = gl_ctrl_create_ctrlbar_view(ad->maininfo.naviframe);
+ GL_CHECK_VAL(layout, -1);
+ evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND,
+ EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ ad->gridinfo.navi_content_edit_ly = layout;
+
+ Evas_Object *view = NULL;
+
+ gl_set_view_mode(ad, GL_VIEW_THUMBS_EDIT);
+ if (ad->gridinfo.view_mode == GL_THUMB_ALL)
+ view = _gl_thumbs_add_grid(ad, layout, GL_THUMB_ALL,
+ false);
+ else if (ad->gridinfo.view_mode == GL_THUMB_VIDEOS)
+ view = _gl_thumbs_add_grid(ad, layout, GL_THUMB_VIDEOS,
+ false);
+ else
+ view = _gl_thumbs_add_grid(ad, layout, GL_THUMB_IMAGES,
+ false);
+
+ if (view == NULL) {
+ gl_dbgE("View creation failed!");
+ evas_object_del(layout);
+ ad->gridinfo.navi_content_edit_ly = NULL;
+ return -1;
+ }
+
+ ad->gridinfo.navi_content_edit_view = view;
+
+ elm_object_part_content_set(layout, "elm.swallow.view", view);
+ __gl_thumbs_edit_push_view(ad, ad->maininfo.naviframe, layout,
+ GL_STR_SELECT_ITEM);
+ edje_object_signal_emit(_EDJ(layout), GL_SIGNAL_VIEW_EDIT, "elm");
+ gl_ui_show_selall(ad);
+ gl_dbg("Done");
+ return 0;
+}
+
+int _gl_thumbs_edit_pop_view(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+
+ elm_naviframe_item_pop_to(ad->gridinfo.nf_it);
+
+ _gl_destroy_thumbs_edit_view(data);
+ _gl_data_selected_list_finalize(data);
+
+ gl_set_view_mode(data, GL_VIEW_THUMBS);
+
+ if (ad->albuminfo.update_albums_list) {
+ /*
+ * Update albums list if MMC added/removed,
+ * or save web files to local album.
+ */
+ ad->albuminfo.update_albums_list = false;
+ gl_refresh_albums_list(data);
+ }
+
+ _gl_thumbs_show_view(data);
+ _gl_notify_destroy_selinfo(data);
+ return 0;
+}
+
+int _gl_thumbs_edit_update_lang(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ GL_CHECK_VAL(ad->gridinfo.nf_it_edit, -1);
+
+ elm_object_item_text_set(ad->gridinfo.nf_it_edit, GL_STR_SELECT_ITEM);
+
+ int cnt = _gl_data_selected_list_count(ad);
+ _gl_notify_update_lang(ad, cnt, GL_VIEW_THUMBS_EDIT);
+
+ if (ad->popupinfo.popup){
+ if (ad->popupinfo.popup_mode == GL_POPUP_NOBUT)
+ gl_popup_create_popup(ad, GL_POPUP_NOBUT,
+ GL_STR_NO_FILES_SELECTED);
+ }
+
+ if (ad->entryinfo.nf_it) {
+ if (GL_ENTRY_NEW_ALBUM == ad->entryinfo.entry_mode)
+ elm_object_item_text_set(ad->entryinfo.nf_it,
+ GL_STR_CREATE_ALBUM);
+ else if (GL_ENTRY_NEW_TAG == ad->entryinfo.entry_mode)
+ elm_object_item_text_set(ad->entryinfo.nf_it,
+ GL_STR_CREATE_TAG);
+ }
+
+ _gl_lang_update_thumb_edit_button(ad, ad->gridinfo.nf_it_edit);
+ return 0;
+}
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "gl-debug.h"
+#include "gl-thumbs-sel.h"
+#include "gl-albums-sel.h"
+#include "gl-tags.h"
+#include "gl-ui-util.h"
+#include "gl-util.h"
+#include "gl-data.h"
+#include "gl-controlbar.h"
+#include "gl-button.h"
+#include "gl-nocontents.h"
+#include "gl-popup.h"
+#include "gl-notify.h"
+#include "gl-strings.h"
+#include "gl-thumbs.h"
+
+static void __gl_thumbs_sel_trans_finished_cb(void *data, Evas_Object *obj,
+ void *event_info)
+{
+ GL_CHECK(data);
+ gl_appdata *ad = (gl_appdata *)data;
+ int view_mode = gl_get_view_mode(ad);
+ gl_dbgW("view_mode: %d", view_mode);
+ evas_object_smart_callback_del(obj, GL_TRANS_FINISHED,
+ __gl_thumbs_sel_trans_finished_cb);
+
+ /* Clear previous view after animation finished */
+ if (view_mode == GL_VIEW_THUMBS_SELECT)
+ elm_gengrid_clear(ad->albuminfo.select_view);
+ else
+ gl_dbgE("Wrong view mode!");
+}
+
+static void __gl_thumbs_sel_cancel_cb(void *data, Evas_Object *obj,
+ void *event_info)
+{
+ GL_CHECK(obj);
+ GL_CHECK(data);
+ gl_dbg("");
+ /* Disable item when it is clicked to prevent it is called for many times */
+ if (_gl_thumbs_sel_pop_view(data) == 0)
+ _gl_ui_disable_btn(obj);
+}
+
+static void __gl_thumbs_sel_done_cb(void *data, Evas_Object *obj,
+ void *event_info)
+{
+ GL_CHECK(data);
+ gl_appdata *ad = (gl_appdata *)data;
+
+ /* Disable item when it is clicked to prevent it is called for many times */
+ _gl_ui_disable_btn(obj);
+
+ ad->albuminfo.current_album = NULL;
+
+ GL_CHECK(ad->taginfo.current_tag);
+ gl_add_tag(data, ad->taginfo.current_tag);
+}
+
+/**
+ * Use naviframe api to push thumbnails eidt view to stack.
+ * @param obj is the content to be pushed.
+ */
+static int __gl_thumbs_sel_push_view(void *data, Evas_Object *parent,
+ Evas_Object *obj, char *title)
+{
+ gl_dbg("GL_NAVI_THUMBS_SELECT");
+ GL_CHECK_VAL(obj, -1);
+ GL_CHECK_VAL(parent, -1);
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ Elm_Object_Item *nf_it = NULL;
+
+ /* Add transition finished callback */
+ evas_object_smart_callback_add(parent, GL_TRANS_FINISHED,
+ __gl_thumbs_sel_trans_finished_cb, data);
+ Evas_Object *end_btn = NULL;
+ end_btn = _gl_but_create_but(parent, NULL, NULL,
+ GL_BUTTON_STYLE_NAVI_PRE,
+ __gl_thumbs_sel_cancel_cb, data);
+ GL_CHECK_VAL(end_btn, -1);
+ /* Push to stack */
+ nf_it = elm_naviframe_item_push(parent, title, end_btn, NULL, obj,
+ NULL);
+ ad->gridinfo.nf_it_select = nf_it;
+
+ /* Done */
+ Evas_Object *btn = NULL;
+ btn = _gl_but_create_but(parent, NULL, GL_STR_DONE,
+ GL_BUTTON_STYLE_NAVI_TOOLBAR,
+ __gl_thumbs_sel_done_cb, data);
+ GL_CHECK_VAL(btn, -1);
+ elm_object_item_part_content_set(nf_it, GL_NAVIFRAME_BTN1, btn);
+ _gl_ui_disable_btn(btn);
+ return 0;
+}
+
+/* Free data after layout deleted */
+static void __gl_thumbs_sel_delete_layout_cb(void *data, Evas *e,
+ Evas_Object *obj, void *ei)
+{
+ gl_dbg("Delete layout ---");
+ GL_CHECK(data);
+ gl_appdata *ad = (gl_appdata *)data;
+ _gl_ui_del_scroller_pos(ad->gridinfo.select_view);
+ gl_dbg("Delete layout +++");
+}
+
+/**
+ * Album selected for adding tags to photo
+ */
+int _gl_thumbs_sel_create_view(void *data, gl_cluster *album_item)
+{
+ GL_CHECK_VAL(album_item, -1);
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+
+ /* Get items list without current tag */
+ _gl_data_get_item_list_without_tag(data, album_item,
+ _gl_tags_get_current_tag_name(ad),
+ GL_GET_ALL_RECORDS,
+ GL_GET_ALL_RECORDS);
+
+ if (ad->maininfo.medias_cnt <= 0) {
+ gl_dbgW("All medias are tagged!");
+ /* Add notification */
+ _gl_notify_create_notiinfo(data, GL_STR_ADDED);
+ return -1;
+ }
+
+ Evas_Object *layout = NULL;
+ /* Add layout */
+ layout = gl_ctrl_create_ctrlbar_view(ad->maininfo.naviframe);
+ GL_CHECK_VAL(layout, -1);
+ evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND,
+ EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ /* Register delete callback */
+ evas_object_event_callback_add(layout, EVAS_CALLBACK_DEL,
+ __gl_thumbs_sel_delete_layout_cb, data);
+ /* Save view mode */
+ int pre_view_m = gl_get_view_mode(data);
+ /* Set new view mode */
+ gl_set_view_mode(data, GL_VIEW_THUMBS_SELECT);
+ /* Save grid view mode */
+ int gridview_m = ad->gridinfo.view_mode;
+ /* Add view */
+ Evas_Object *view = NULL;
+ view = _gl_thumbs_add_grid(data, layout, GL_THUMB_ALL, false);
+ /* Restore grid view mode */
+ if (gridview_m != GL_THUMB_ALL)
+ ad->gridinfo.view_mode = gridview_m;
+ if (view == NULL) {
+ evas_object_del(layout);
+ gl_popup_create_popup(data, GL_POPUP_NOBUT, GL_STR_NO_ALBUMS);
+ /* Reset view mode */
+ gl_set_view_mode(data, pre_view_m);
+ return -1;
+ }
+
+ /* Set view to layout */
+ elm_object_part_content_set(layout, "elm.swallow.view", view);
+ /* Push view to naviframe */
+ __gl_thumbs_sel_push_view(data, ad->maininfo.naviframe, layout,
+ GL_STR_SELECT_ITEM);
+ edje_object_signal_emit(_EDJ(layout), GL_SIGNAL_VIEW_EDIT, "elm");
+ ad->gridinfo.select_view = view;
+ ad->gridinfo.select_view_ly = layout;
+
+ ad->albuminfo.current_album = album_item;
+
+ /* Show select all widget */
+ gl_ui_show_selall(ad);
+ gl_dbg("Done");
+ return 0;
+}
+
+int _gl_thumbs_sel_pop_view(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+
+ ad->albuminfo.current_album = NULL;
+ /* Clear selected list */
+ _gl_data_selected_list_finalize(data);
+ _gl_thumbs_clear_cbs(ad->gridinfo.select_view);
+ ad->gridinfo.select_view= NULL;
+ ad->gridinfo.select_view_ly= NULL;
+ /* Pop naviframe item*/
+ elm_naviframe_item_pop(ad->maininfo.naviframe);
+ /* Reset view mode */
+ gl_set_view_mode(data, GL_VIEW_ALBUMS_SELECT);
+ /* Update view */
+ _gl_albums_sel_update_view(data);
+ return 0;
+}
+
+int _gl_thumbs_sel_update_lang(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ GL_CHECK_VAL(ad->gridinfo.nf_it_select, -1);
+ gl_dbg("");
+ elm_object_item_text_set(ad->gridinfo.nf_it_select,
+ GL_STR_SELECT_ITEM);
+ int sel_cnt = _gl_data_selected_list_count(ad);
+ _gl_notify_update_lang(ad, sel_cnt, GL_VIEW_THUMBS_SELECT);
+ _gl_ui_set_btns_text(ad->gridinfo.nf_it_select, GL_STR_DONE, NULL);
+ return 0;
+}
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "gl-debug.h"
+#include "gl-thumbs.h"
+#include "gl-ui-util.h"
+#include "gl-util.h"
+#include "gl-drm.h"
+#include "gl-albums.h"
+#include "gl-data.h"
+#include "gl-ext-ug-load.h"
+#include "gl-ext-exec.h"
+#include "gl-controlbar.h"
+#include "gl-nocontents.h"
+#include "gl-notify.h"
+#include "gl-strings.h"
+#include "gl-icons.h"
+#include "gl-thumb.h"
+#ifdef _USE_ROTATE_BG
+#include "gl-exif.h"
+#endif
+
+/* Icon swallowed to part "elm.swallow.icon" */
+#define GL_GRID_TOUCH_RANGE 20
+typedef struct _gl_thumb_data_t gl_thumb_data_s;
+
+struct _gl_thumb_data_t{
+ void *ad;
+ gl_item *item;
+};
+
+static void __gl_thumbs_open_file(void *data)
+{
+ gl_dbg("");
+ GL_CHECK(data);
+ gl_item *gitem = (gl_item *)data;
+ GL_CHECK(gitem->item);
+ GL_CHECK(gitem->item->file_url);
+ GL_CHECK(strlen(gitem->item->file_url));
+ GL_CHECK(gitem->ad);
+ gl_appdata *ad = (gl_appdata *)gitem->ad;
+ int view_mode = gl_get_view_mode(ad);
+ if (view_mode != GL_VIEW_THUMBS) {
+ gl_dbgE("Error view mode!");
+ return;
+ }
+
+ if (ad->gridinfo.view_mode == GL_THUMB_VIDEOS) {
+ gl_dbg("Loading VIDEO-PLAYER");
+ gl_ext_exec(gitem, GL_APP_VIDEOPLAYER);
+ } else {
+ gl_dbg("Loading UG-IMAGE(VIDEO)-VIEWER");
+ gl_ext_load_iv_ug(ad, gitem, GL_UG_IV);
+ }
+}
+
+static void __gl_thumbs_sel_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ _gl_ui_save_scroller_pos(obj);
+ __gl_thumbs_open_file(data);
+}
+
+static void __gl_thumbs_longpressed(void *data, Evas_Object *obj,
+ void *event_info)
+{
+ GL_CHECK(event_info);
+ void *it_data = elm_object_item_data_get(event_info);
+ GL_CHECK(it_data);
+ gl_dbg("");
+ if (gl_get_view_mode(data) == GL_VIEW_THUMBS)
+ __gl_thumbs_open_file(it_data);
+}
+
+static void __gl_thumbs_check_changed(void *data, Evas_Object *obj,
+ void *event_info)
+{
+ GL_CHECK(obj);
+ GL_CHECK(data);
+ gl_item *gitem = (gl_item *) data;
+ GL_CHECK(gitem->ad);
+ gl_appdata *ad = (gl_appdata *)gitem->ad;
+ int view_mode = gl_get_view_mode(ad);
+ Evas_Object *view_ly = NULL;
+ Elm_Object_Item *nf_it = NULL;
+ gl_dbg("");
+
+ if (view_mode == GL_VIEW_THUMBS_EDIT) {
+ view_ly = ad->gridinfo.navi_content_edit_ly;
+ nf_it = ad->gridinfo.nf_it_edit;
+ } else if (view_mode == GL_VIEW_THUMBS_SELECT) {
+ view_ly = ad->gridinfo.select_view_ly;
+ nf_it = ad->gridinfo.nf_it_select;
+ } else {
+ return;
+ }
+
+
+ Eina_Bool checked = elm_check_state_get(obj);
+ gitem->checked = checked;
+ if (checked) {
+ gl_dbg("Append:%s", gitem->item->file_url);
+ _gl_data_selected_list_append(ad, gitem);
+ } else {
+ gl_dbg("Remove:%s", gitem->item->file_url);
+ _gl_data_selected_list_remove(ad, gitem);
+ }
+
+ /* Display selectioninfo */
+ int sel_cnt = _gl_data_selected_list_count(ad);
+ _gl_notify_create_selinfo(ad, view_ly, nf_it, ad->gridinfo.thumbs_cnt,
+ sel_cnt, false);
+}
+
+/* Only for local medias */
+static void __gl_thumbs_create_thumb_cb(media_content_error_e error,
+ const char *path, void *user_data)
+{
+ GL_CHECK(user_data);
+ gl_thumb_data_s *thumb_data = (gl_thumb_data_s *)user_data;
+ GL_CHECK(thumb_data->ad);
+ gl_appdata *ad = (gl_appdata *)thumb_data->ad;
+ gl_item *gitem = thumb_data->item;
+ GL_FREE(thumb_data);
+
+ if (gl_get_view_mode(ad) != GL_VIEW_THUMBS &&
+ gl_get_view_mode(ad) != GL_VIEW_THUMBS_EDIT)
+ return;
+
+ GL_CHECK(gitem);
+ GL_CHECK(gitem->item);
+ if (GL_FILE_EXISTS(path)) {
+ gl_dbg("Update item with new thumb path[%s]", path);
+ /* Update thumb path */
+ GL_FREEIF(gitem->item->thumb_url);
+ gitem->item->thumb_url = strdup(path);
+ elm_gengrid_item_update(gitem->elm_item);
+ } else {
+ gl_dbgE("Invalid thumb path!");
+ }
+}
+
+/* Use file to create new thumb if possible */
+static int __gl_thumbs_create_thumb(gl_item *gitem)
+{
+ GL_CHECK_VAL(gitem, -1);
+ GL_CHECK_VAL(gitem->item, -1);
+ GL_CHECK_VAL(gitem->item->file_url, -1);
+
+ if (GL_FILE_EXISTS(gitem->item->file_url)) {
+ gl_thumb_data_s *thumb_data = NULL;
+ thumb_data = (gl_thumb_data_s *)calloc(1, sizeof(gl_thumb_data_s));
+ GL_CHECK_VAL(thumb_data, -1);
+ thumb_data->ad = gitem->ad;
+ thumb_data->item = gitem;
+ _gl_data_create_thumb(gitem, __gl_thumbs_create_thumb_cb,
+ thumb_data);
+ return 0;
+ }
+ return -1;
+}
+
+static Evas_Object *__gl_thumbs_get_content(void *data, Evas_Object *obj,
+ const char *part)
+{
+ GL_CHECK_NULL(part);
+ GL_CHECK_NULL(strlen(part));
+ GL_CHECK_NULL(data);
+ gl_item *gitem = (gl_item *)data;
+ GL_CHECK_NULL(gitem->item);
+ GL_CHECK_NULL(gitem->ad);
+ gl_appdata *ad = (gl_appdata *)gitem->ad;
+ int view_mode = gl_get_view_mode(ad);
+ int item_size = ad->gridinfo.icon_size;
+ bool is_expired_drm = false;
+
+ if (!g_strcmp0(part, GL_THUMB_ICON)) {
+ Evas_Object *layout = NULL;
+ char *path = NULL;
+ char *drm_path = NULL;
+ unsigned int orient = 0;
+
+ /* Is it DRM file? Has a valid RO? */
+ if(_gl_get_icon_type(gitem) == GL_ICON_EXPIRED_DRM) {
+ path = GL_DEFAULT_THUMB_ICON;
+ is_expired_drm = true;
+ /* Only one photo in a (normal, not web) album */
+ } else if (ad->maininfo.medias_cnt < 2 &&
+ gitem->item->type == MEDIA_CONTENT_TYPE_IMAGE) {
+ if (!g_strcmp0(GL_DB_DEFAULT_THUMB, gitem->item->thumb_url)) {
+ path = GL_DEFAULT_THUMB_ICON;
+ } else {
+ drm_path = gl_drm_get_file_path(gitem);
+ path = _GET_ICON(drm_path);
+ if (gl_is_image_valid(ad, path) == false)
+ path = _GET_ICON(gitem->item->thumb_url);
+#ifdef _USE_ROTATE_BG
+ /* Rotate bg if it's created from original file */
+ if (!g_strcmp0(path, gitem->item->file_url))
+ _gl_exif_get_orientation(path, &orient);
+#endif
+ }
+ } else {
+ /* Use default image */
+ if (GL_FILE_EXISTS(gitem->item->thumb_url)) {
+ path = gitem->item->thumb_url;
+ } else {
+ path = GL_DEFAULT_THUMB_ICON;
+ __gl_thumbs_create_thumb(gitem);
+ }
+ }
+
+ if (gitem->item->type == MEDIA_CONTENT_TYPE_VIDEO) {
+ unsigned int v_dur = 0;
+ if (gitem->item->video_info) {
+ v_dur = gitem->item->video_info->duration;
+ }
+ int bk_len = 0;
+ if (gitem->item->video_info == NULL)
+ bk_len = 0;
+ else
+ bk_len = gitem->item->video_info->bookmarks;
+ layout = _gl_thumb_show_part_icon_video(obj, path,
+ v_dur, bk_len,
+ gitem->item->favorite,
+ is_expired_drm,
+ item_size);
+ } else {
+ layout = _gl_thumb_show_part_icon_image(obj, path,
+ orient,
+ gitem->item->favorite,
+ is_expired_drm,
+ item_size);
+ }
+
+ GL_FREEIF(drm_path);
+ return layout;
+ } else if (!g_strcmp0(part, GL_THUMB_CHECKBOX) &&
+ (view_mode == GL_VIEW_THUMBS_EDIT ||
+ view_mode == GL_VIEW_THUMBS_SELECT)) {
+ Evas_Object *ck = NULL;
+ ck = _gl_thumb_show_part_checkbox(obj, gitem->checked,
+ __gl_thumbs_check_changed,
+ data);
+ GL_CHECK_NULL(ck);
+
+ gitem->check_obj = ck;
+ return ck;
+ }
+
+ return NULL;
+}
+
+static int __gl_thumbs_set_type(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+
+ ad->gridinfo.grid_type = GL_GRID_T_NONE;;
+ if (ad->ctrlinfo.tab_mode == GL_CTRL_TAB_TAGS) {
+ ad->gridinfo.grid_type = GL_GRID_T_TAGS;
+ } else {
+ gl_cluster *cur_album = ad->albuminfo.current_album;
+ GL_CHECK_VAL(cur_album, -1);
+ GL_CHECK_VAL(cur_album->cluster, -1);
+
+ if (cur_album->cluster->type == GL_STORE_T_PHONE ||
+ cur_album->cluster->type == GL_STORE_T_MMC)
+ ad->gridinfo.grid_type = GL_GRID_T_LOCAL;
+ else if (cur_album->cluster->type == GL_STORE_T_ALL)
+ ad->gridinfo.grid_type = GL_GRID_T_ALLALBUMS;
+ else
+ gl_dbgE("Wrong cluster storage type!");
+ }
+ gl_dbg("Gridview type: %d", ad->gridinfo.grid_type);
+ return 0;
+}
+
+static bool __gl_thumbs_create_items(void *data, Evas_Object *parent)
+{
+ GL_CHECK_FALSE(data);
+ GL_CHECK_FALSE(parent);
+ gl_appdata *ad = (gl_appdata *)data;
+ int i = 0;
+ int item_cnt = 0;
+ gl_item *gitem = NULL;
+ int ret = -1;
+ /* Get all medias count of current album */
+ int cnt = ad->maininfo.medias_cnt;
+ gl_dbg("List count : %d gv_mode : %d", cnt, ad->gridinfo.view_mode);
+
+ ad->gridinfo.thumbgic.item_style = GL_GENGRID_ITEM_STYLE_THUMBNAIL;
+ ad->gridinfo.thumbgic.func.text_get = NULL;
+ ad->gridinfo.thumbgic.func.content_get = __gl_thumbs_get_content;
+
+ if (elm_gengrid_items_count(parent) > 0) {
+ /* Save scroller position before clearing gengrid */
+ _gl_ui_save_scroller_pos(parent);
+ elm_gengrid_clear(parent);
+ }
+
+ for (i = 1; i <= cnt; i++) {
+ _gl_data_get_item_by_index(ad, i, false, &gitem);
+ if (gitem == NULL || gitem->item == NULL ||
+ gitem->item->uuid == NULL) {
+ gl_dbgE("Invalid gitem. continue...");
+ continue;
+ }
+
+ /* For PTP Album, file_url is NULL untill the file is saved from camera */
+ if (!gitem->item->file_url) {
+ gl_dbg("file_url is invalid.");
+ ret = _gl_data_delete_media(ad, gitem->item);
+ if (ret != 0)
+ continue;
+ _gl_data_selected_list_remove(ad, gitem);
+ _gl_data_item_list_remove(ad, gitem);
+ cnt--;
+ i--;
+ gitem = NULL;
+ continue;
+ }
+
+ if (ad->gridinfo.back_to_normal) {
+ gitem->checked = false;
+ //gitem->check_obj = NULL;
+ }
+
+ if (ad->gridinfo.view_mode == GL_THUMB_IMAGES &&
+ gitem->item->type != MEDIA_CONTENT_TYPE_IMAGE)
+ continue;
+ if (ad->gridinfo.view_mode == GL_THUMB_VIDEOS &&
+ gitem->item->type != MEDIA_CONTENT_TYPE_VIDEO)
+ continue;
+ gitem->elm_item = elm_gengrid_item_append(parent,
+ &(ad->gridinfo.thumbgic),
+ gitem,
+ __gl_thumbs_sel_cb,
+ gitem);
+ item_cnt++;
+ gitem->sequence = item_cnt;
+
+ }
+
+ _gl_ui_restore_scroller_pos(parent);
+ ad->gridinfo.thumbs_cnt = item_cnt;
+ ad->gridinfo.back_to_normal = false;
+
+ if (item_cnt == 0)
+ return EINA_FALSE;
+ else
+ return EINA_TRUE;
+}
+
+/*
+* Set new view to all/image_grid_view.
+*
+* b_noc, true: it's nocontents view, false: normal view.
+*/
+static int __gl_thumbs_set_view(void *data, Evas_Object *view, bool b_noc)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ ad->gridinfo.all_grid_view = view;
+ if (b_noc)
+ _gl_thumbs_set_nocontents(ad, view);
+ else
+ _gl_thumbs_set_nocontents(ad, NULL);
+
+ return 0;
+}
+
+/*
+* When select album, show first (GL_FIRST_VIEW_END_POS+1) medias.
+* Then use idler to get other medias from DB and appened
+* them to gridview.
+* In order to reduce transit time of first show of thumbnails view.
+* Cause most of time is spent for getting records from DB,
+* so we get first (GL_FIRST_VIEW_END_POS+1) items and show thumbnails view,
+* it will accelerate view show.
+*/
+static int __gl_thumbs_idler_append_items(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ GL_CHECK_VAL(ad->albuminfo.current_album, -1);
+ GL_CHECK_VAL(ad->gridinfo.all_grid_view, -1);
+ int i = 0;
+ int item_cnt = 0;
+ gl_item *gitem = NULL;
+ /* Get all medias count of current album */
+ int cnt = ad->maininfo.medias_cnt;
+ int ret = -1;
+
+ gl_dbg("First view medias count: %d; girdview mode: %d",
+ cnt, ad->gridinfo.view_mode);
+ if (ad->maininfo.medias_cnt != (GL_FIRST_VIEW_END_POS + 1)) {
+ gl_dbg("No any more items, return!");
+ return -1;
+ }
+ /* Get other items from DB */
+ ret = _gl_data_get_item_list(ad, GL_CATEGORY_FOLDER,
+ ad->albuminfo.current_album,
+ (GL_FIRST_VIEW_END_POS + 1),
+ GL_GET_UNTIL_LAST_RECORD);
+ if (ret < 0) {
+ gl_dbgE("Get items list failed[%d]!", ret);
+ return ret;
+ }
+
+ cnt = ad->maininfo.medias_cnt;
+ gl_dbg("Grid view all medias count: %d", cnt);
+
+ if (ad->gridinfo.view_mode != GL_THUMB_ALL) {
+ /* Event gridview mode is wrong, we still need to get other records */
+ gl_dbg("Gridview mode is wrong, return!");
+ return -1;
+ }
+
+ /* From (GL_FIRST_VIEW_END_POS + 2)th item to last one */
+ i = GL_FIRST_VIEW_END_POS + 2;
+
+ for (; i <= cnt; i++) {
+ _gl_data_get_item_by_index(ad, i, false, &gitem);
+ if (gitem == NULL || gitem->item == NULL ||
+ gitem->item->uuid == NULL ) {
+ gl_dbgE("Invalid gitem, continue...");
+ continue;
+ }
+
+ if (!gitem->item->file_url) {
+ gl_dbg("file_url is invalid.");
+ _gl_data_delete_media(ad, gitem->item);
+ _gl_data_selected_list_remove(ad, gitem);
+ _gl_data_item_list_remove(ad, gitem);
+ cnt--;
+ i--;
+ gitem = NULL;
+ continue;
+ }
+
+ if (ad->gridinfo.view_mode == GL_THUMB_IMAGES &&
+ gitem->item->type != MEDIA_CONTENT_TYPE_IMAGE)
+ continue;
+ if (ad->gridinfo.view_mode == GL_THUMB_VIDEOS &&
+ gitem->item->type != MEDIA_CONTENT_TYPE_VIDEO)
+ continue;
+ gitem->elm_item = elm_gengrid_item_append(ad->gridinfo.all_grid_view,
+ &(ad->gridinfo.thumbgic),
+ gitem,
+ __gl_thumbs_sel_cb,
+ gitem);
+ item_cnt++;
+ gitem->sequence = item_cnt + GL_FIRST_VIEW_END_POS + 1;
+ }
+
+ gl_dbgW("\tUse idler to append other medias--Done!");
+ if (item_cnt == 0) {
+ return -1;
+ } else {
+ ad->gridinfo.thumbs_cnt = item_cnt + GL_FIRST_VIEW_END_POS + 1;
+ gl_dbg("All count appended: %d", ad->gridinfo.thumbs_cnt);
+ return 0;
+ }
+}
+
+static Eina_Bool __gl_thumbs_append_items_idler_cb(void *data)
+{
+ GL_CHECK_CANCEL(data);
+
+ /* Try to get other medias from DB and append them to gridview */
+ if (__gl_thumbs_idler_append_items(data) < 0) {
+ gl_dbgE("Failed to append grid items!");
+ } else {
+ gl_dbg("Successful to append grid items!");
+ }
+
+ /* Remove idler after all items appended */
+ _gl_thumbs_del_append_idler(data);
+
+ return ECORE_CALLBACK_CANCEL;
+}
+
+void _gl_thumbs_mouse_down(void *data, Evas *e, Evas_Object *obj,
+ void *event_info)
+{
+ GL_CHECK(obj);
+ GL_CHECK(event_info);
+ GL_CHECK(data);
+ gl_item *gitem = (gl_item *) data;
+ GL_CHECK(gitem->ad);
+ gl_appdata *ad = (gl_appdata *)gitem->ad;
+ Evas_Event_Mouse_Down *ev = (Evas_Event_Mouse_Down *) event_info;
+
+ ad->gridinfo.grid_touch_info.x = ev->output.x;
+ ad->gridinfo.grid_touch_info.y = ev->output.y;
+}
+
+void _gl_thumbs_mouse_up(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ GL_CHECK(data);
+ gl_item *gitem = (gl_item *) data;
+ GL_CHECK(gitem->ad);
+ gl_appdata *ad = (gl_appdata *)gitem->ad;
+
+ if (!event_info || !obj)
+ goto RET_WO_EXEC;
+
+ Evas_Event_Mouse_Up *ev = event_info;
+ if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD ||
+ ev->event_flags & EVAS_EVENT_FLAG_ON_SCROLL)
+ goto RET_WO_EXEC;
+
+ if ((abs(ad->gridinfo.grid_touch_info.x - ev->output.x) > GL_GRID_TOUCH_RANGE) ||
+ (abs(ad->gridinfo.grid_touch_info.y - ev->output.y) > GL_GRID_TOUCH_RANGE))
+ goto RET_WO_EXEC;
+
+ gl_dbg("");
+ __gl_thumbs_open_file(data);
+ return;
+
+ RET_WO_EXEC:
+ return;
+}
+
+Evas_Object *_gl_thumbs_add_grid(void *data, Evas_Object *parent,
+ gl_thumb_mode mode, bool b_use_idler)
+{
+ GL_CHECK_NULL(parent);
+ GL_CHECK_NULL(data);
+ gl_appdata *ad = (gl_appdata *)data;
+ Evas_Object *grid = NULL;
+ ad->gridinfo.view_mode = mode;
+ grid = _gl_thumb_add_gengrid(parent);
+ evas_object_smart_callback_add(grid, "realized", NULL, data);
+ evas_object_smart_callback_add(grid, "unrealized", NULL, data);
+ evas_object_smart_callback_add(grid, "longpressed",
+ __gl_thumbs_longpressed, data);
+
+ /* Set grid view type */
+ __gl_thumbs_set_type(ad);
+ _gl_ui_reset_scroller_pos(grid);
+
+ int view_mode = gl_get_view_mode(ad);
+
+ if (!__gl_thumbs_create_items(ad, grid)) {
+ _gl_ui_del_scroller_pos(grid);
+ evas_object_del(grid);
+ grid = NULL;
+ Evas_Object *noc = _gl_nocontents_create(ad);
+ _gl_thumbs_set_nocontents(ad, noc);
+ evas_object_show(noc);
+ return noc;
+ }
+
+ gl_dbg("thumbs_cnt : %d", ad->gridinfo.thumbs_cnt);
+ _gl_thumbs_set_size(ad, grid);
+ if (view_mode != GL_VIEW_THUMBS_SELECT)
+ _gl_thumbs_set_nocontents(ad, NULL);
+ evas_object_show(grid);
+
+ if (b_use_idler &&
+ ad->maininfo.medias_cnt == (GL_FIRST_VIEW_END_POS + 1)) {
+ gl_dbgW("\tUse idler to append other medias--Start");
+ /* Remove idler */
+ _gl_thumbs_del_append_idler(ad);
+ /* Add idler */
+ ad->gridinfo.grid_append_idler = ecore_idler_add(__gl_thumbs_append_items_idler_cb,
+ ad);
+ }
+
+ return grid;
+}
+
+int _gl_thumbs_show_edit_view(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ int view_mode = gl_get_view_mode(ad);
+ bool b_ret = false;
+ Evas_Object *view = NULL;
+ gl_dbg("view_mode: %d", view_mode);
+
+ if (view_mode == GL_VIEW_THUMBS_EDIT) {
+ view = ad->gridinfo.navi_content_edit_view;
+ } else if (view_mode == GL_VIEW_THUMBS_SELECT) {
+ view = ad->gridinfo.select_view;
+ } else {
+ gl_dbgE("Wrong view mode!");
+ return -1;
+ }
+ GL_CHECK_VAL(view, -1);
+ b_ret = __gl_thumbs_create_items(ad, view);
+ _gl_thumbs_set_size(ad, NULL);
+
+ if (!b_ret) {
+ gl_dbgE("Create items failed!");
+ return -1;
+ } else {
+ return 0;
+ }
+}
+
+int _gl_thumbs_show_view(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ int gridview_mode = ad->gridinfo.view_mode;
+ bool b_ret = false;
+ gl_dbg("gridview_mode: %d", gridview_mode);
+
+ if (ad->gridinfo.all_grid_view == NULL) {
+ gl_dbg("Error : Any gridview doesn't exist");
+ return -1;
+ }
+
+ /* Come back from edit mode, save state */
+ ad->gridinfo.back_to_normal = true;
+ b_ret = __gl_thumbs_create_items(ad,
+ ad->gridinfo.all_grid_view);
+ _gl_thumbs_set_size(ad, NULL);
+
+ if (!b_ret) {
+ gl_dbgE("Create items failed!");
+ return -1;
+ } else {
+ return 0;
+ }
+}
+
+Eina_Bool _gl_thumbs_update_view(void *data)
+{
+ GL_CHECK_FALSE(data);
+ gl_appdata *ad = (gl_appdata *)data;
+ Eina_Bool res = EINA_FALSE;
+ Evas_Object *gv = NULL;
+ int view_mode = gl_get_view_mode(ad);
+ bool b_view = false;
+ gl_dbg("");
+
+ if (view_mode == GL_VIEW_THUMBS_EDIT) {
+ gl_dbg("\n\nEdit_Mode\n");
+ gv = ad->gridinfo.navi_content_edit_view;
+ } else {
+ b_view = _gl_thumbs_get_view(ad, &gv);
+ GL_CHECK_FALSE(gv);
+ }
+ if (b_view) {
+ res = __gl_thumbs_create_items(ad, gv);
+ if (!res) {
+ gl_dbg("__gl_thumbs_create_items() return false...");
+ evas_object_hide(gv);
+ _gl_ui_del_scroller_pos(gv);
+ evas_object_del(gv);
+ __gl_thumbs_set_view(ad, NULL, false);
+ Evas_Object *noc = _gl_nocontents_create(ad);
+ evas_object_show(noc);
+ __gl_thumbs_set_view(ad, noc, true);
+
+ elm_object_part_content_unset(ad->gridinfo.navi_content_ly,
+ "elm.swallow.view");
+ elm_object_part_content_set(ad->gridinfo.navi_content_ly,
+ "elm.swallow.view", noc);
+ } else {
+ _gl_thumbs_set_size(ad, gv);
+ }
+ } else {
+ gl_dbg("Remove nocontents view.");
+ evas_object_hide(gv);
+ _gl_ui_del_scroller_pos(gv);
+ evas_object_del(gv);
+ __gl_thumbs_set_view(ad, NULL, false);
+ bool b_noc = false;
+ int view_m = ad->gridinfo.view_mode;
+
+ Evas_Object *view = NULL;
+ view = _gl_thumbs_add_grid(ad, ad->gridinfo.navi_content_ly,
+ view_m, false);
+ if (ad->gridinfo.all_grid_nocontents)
+ b_noc = true;
+
+ /* No nocotents removed, gridview created, enable edit button */
+ if (!b_noc) {
+ /* When nocontents removed from webalbum,
+ * it means this empty album was just refreshed
+ * to download photo from web, progressbr showed.
+ */
+ _gl_ctrl_disable_btn(ad, false, GL_NAVI_THUMBS);
+ }
+ __gl_thumbs_set_view(ad, view, b_noc);
+
+ elm_object_part_content_unset(ad->gridinfo.navi_content_ly,
+ "elm.swallow.view");
+ elm_object_part_content_set(ad->gridinfo.navi_content_ly,
+ "elm.swallow.view", view);
+ }
+
+ return res;
+}
+
+int _gl_thumbs_create_view(void *data, int nf_mode, char *title, bool b_idler,
+ Evas_Smart_Cb func)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ GL_CHECK_VAL(ad->maininfo.naviframe, -1);
+ Evas_Object *layout = NULL;
+ Evas_Object *view = NULL;
+
+ gl_set_view_mode(data, GL_VIEW_THUMBS);
+ layout = gl_ctrl_create_ctrlbar_view(ad->maininfo.naviframe);
+ GL_CHECK_VAL(layout, -1);
+ evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND,
+ EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ view = _gl_thumbs_add_grid(ad, layout, GL_THUMB_ALL, b_idler);
+ if (view == NULL) {
+ evas_object_del(layout);
+ gl_dbgE("Failed to add gridview!");
+ return -1;
+ }
+
+ elm_object_part_content_set(layout, "elm.swallow.view", view);
+ ad->gridinfo.all_grid_view = view;
+ ad->gridinfo.navi_content_ly = layout;
+
+ gl_ui_create_title_and_push(ad, ad->maininfo.naviframe, layout, nf_mode,
+ title);
+
+ Evas_Object *bk_btn = NULL;
+ bk_btn = elm_object_item_part_content_get(ad->gridinfo.nf_it,
+ GL_NAVIFRAME_PREV_BTN);
+ elm_object_style_set(bk_btn, GL_BUTTON_STYLE_NAVI_PRE);
+ evas_object_smart_callback_add(bk_btn, "clicked", func, ad);
+
+ edje_object_signal_emit(_EDJ(layout), GL_SIGNAL_VIEW_DEFAULT, "elm");
+ gl_dbg("Done");
+ return 0;
+}
+
+int _gl_thumbs_update_count(void *data, int new_cnt)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+
+ gl_dbg("gridview display item count=%d", new_cnt);
+ ad->gridinfo.updated_thumbs_cnt = new_cnt;
+
+ return 0;
+}
+
+/**
+* Get all/image_grid_view.
+*
+* True returned if it's normal view, if it's nocontents view return false.
+*/
+bool _gl_thumbs_get_view(void *data, Evas_Object **view)
+{
+ GL_CHECK_FALSE(data);
+ gl_appdata *ad = (gl_appdata *)data;
+ Evas_Object *gv = NULL;
+ bool b_view = false;
+
+ gv = ad->gridinfo.all_grid_view;
+ if (gv && ad->gridinfo.all_grid_nocontents == NULL)
+ b_view = true;
+
+ /* Nocontents */
+ if (!b_view)
+ gl_dbg("Previous view is Nocontents...");
+
+ /* Return view */
+ if (view)
+ *view = gv;
+
+ return b_view;
+}
+
+/* Assign new value to all/image_grid_nocontents */
+int _gl_thumbs_set_nocontents(void *data, Evas_Object *noc)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+
+ ad->gridinfo.all_grid_nocontents = noc;
+
+ return 0;
+}
+
+int _gl_thumbs_set_size(void *data, Evas_Object *gridview)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ int cnt = 0;
+ Evas_Object *gv = NULL;
+ int view_mode = gl_get_view_mode(ad);
+
+ if (gridview) {
+ gv = gridview;
+ } else {
+ bool b_view = false;
+ if (view_mode == GL_VIEW_THUMBS_EDIT) {
+ b_view = true;
+ gv = ad->gridinfo.navi_content_edit_view;
+ } else if (view_mode == GL_VIEW_THUMBS_SELECT) {
+ b_view = true;
+ gv = ad->gridinfo.select_view;
+ } else {
+ b_view = _gl_thumbs_get_view(ad, &gv);
+ }
+
+ if (!b_view || !gv) {
+ gl_dbgE("gridview is invalid!");
+ return -1;
+ }
+ }
+
+ if (ad->gridinfo.updated_thumbs_cnt <= 0) {
+ cnt = ad->gridinfo.thumbs_cnt;
+ } else {
+ cnt = ad->gridinfo.updated_thumbs_cnt;
+ ad->gridinfo.updated_thumbs_cnt = 0;
+ }
+
+ return _gl_thumb_set_size(ad, gv, cnt, &(ad->gridinfo.icon_size));
+}
+
+int _gl_thumbs_clear_cbs(Evas_Object *grid)
+{
+ GL_CHECK_VAL(grid, -1);
+ evas_object_smart_callback_del(grid, "longpressed",
+ __gl_thumbs_longpressed);
+ return 0;
+}
+
+int _gl_thumbs_delete_view(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+
+ /* Destroy idler */
+ _gl_thumbs_del_append_idler(data);
+
+ if (ad->gridinfo.all_grid_view != NULL) {
+ _gl_ui_del_scroller_pos(ad->gridinfo.all_grid_view);
+ _gl_thumbs_clear_cbs(ad->gridinfo.all_grid_view);
+ evas_object_del(ad->gridinfo.all_grid_view);
+ ad->gridinfo.all_grid_view = NULL;
+ }
+ ad->gridinfo.grid_type = GL_GRID_T_NONE;
+ ad->gridinfo.all_grid_nocontents = NULL;
+ ad->gridinfo.edit_btn = NULL;
+ return 0;
+}
+
+/* Update griditem size */
+int _gl_thumbs_update_size(void *data, Evas_Object *view)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ Evas_Object *_view = NULL;
+ int view_mode = gl_get_view_mode(ad);
+ gl_dbg("");
+
+ if (ad->gridinfo.thumbs_cnt <= GL_GRID_ITEM_ZOOM_LEVEL_02_CNT) {
+ gl_dbgW("Thumbs count is less than 7!");
+ return -1;
+ }
+
+ if (view) {
+ _view = view;
+ } else {
+ bool b_view = false;
+ if (view_mode == GL_VIEW_THUMBS_EDIT) {
+ b_view = true;
+ _view = ad->gridinfo.navi_content_edit_view;
+ } else if (view_mode == GL_VIEW_THUMBS_SELECT) {
+ b_view = true;
+ _view = ad->gridinfo.select_view;
+ } else {
+ b_view = _gl_thumbs_get_view(ad, &_view);
+ }
+
+ if (!b_view || !_view) {
+ gl_dbgE("gridview is invalid!");
+ return -1;
+ }
+ }
+
+ _gl_thumbs_set_size(data, _view);
+
+ _gl_thumb_update_gengrid(_view);
+
+ return 0;
+}
+
+int _gl_thumbs_del_append_idler(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+
+ if (ad->gridinfo.grid_append_idler) {
+ ecore_idler_del(ad->gridinfo.grid_append_idler);
+ ad->gridinfo.grid_append_idler = NULL;
+ }
+
+ return 0;
+}
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <Evas.h>
+#include <utilX.h> /* Key event */
+#include "gallery.h"
+#include "gl-debug.h"
+#include "gl-albums.h"
+#include "gl-thumbs.h"
+#include "gl-controlbar.h"
+#include "gl-ui-util.h"
+#include "gl-lang.h"
+#include "gl-util.h"
+#include "gl-data.h"
+#include "gl-ext-ug-load.h"
+#include "gl-ext-exec.h"
+#include "gl-tags.h"
+#include "gl-popup.h"
+#include "gl-ctxpopup.h"
+#include "gl-progressbar.h"
+#include "gl-editfield.h"
+#include "gl-notify.h"
+#include "gl-thread-util.h"
+#include "gl-strings.h"
+
+#define GL_BG_COLOR_R 248
+#define GL_BG_COLOR_G 246
+#define GL_BG_COLOR_B 239
+
+#define GL_BD_LAUNCH_TYPE "launch-type"
+#define GL_BD_ALBUM_ID "album-id"
+#define GL_BD_FILE_TYPE "file-type"
+#define GL_BD_DRM_TYPE "drm-type"
+#define GL_BD_SETAS_TYPE "setas-type"
+#define GL_BD_CALLERID_SIZE "callerid-size"
+#define GL_BD_CALLERID_PATH "callerid-path"
+#define GL_BD_HOMESCREEN_PATH "homescreen-path"
+#define GL_BD_LOCKSCREEN_PATH "lockscreen-path"
+#define GL_BD_SELECT_ALBUM "select-album"
+#define GL_BD_SELECT_ONE "select-one"
+#define GL_BD_SELECT_MULTIPLE "select-multiple"
+#define GL_BD_SELECT_SETAS "select-setas"
+#define GL_BD_FILE_TYPE_IMAGE "image"
+#define GL_BD_FILE_TYPE_VIDEO "video"
+#define GL_BD_FILE_TYPE_ALL "all"
+#define GL_BD_SETAS_WALLPALER "wallpaper"
+#define GL_BD_SETAS_CALLERID "callerid"
+#define GL_BD_SHOW_DRM_FILE "true"
+
+#define GL_BD_SELECTION_MODE "http://tizen.org/appcontrol/data/selection_mode"
+#define GL_BD_SELECTION_MODE_SINGLE "single"
+#define GL_BD_SELECTION_MODE_MULTI "multiple"
+
+#define GL_AUL_SEP ":"
+#define GL_SERVICE_OPERATION_WALLPAPER "http://tizen.org/appcontrol/operation/wallpaper"
+
+struct text_part {
+ char *part;
+ char *msgid;
+};
+
+static struct text_part main_txt[] = {
+ {"txt_title", "Application template",},
+ {"txt_mesg", "Click to exit",},
+};
+
+/* User-defined function */
+static int _gallery_init_app_svc(void *data);
+
+static void _gallery_win_del_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ gl_dbgW("_gallery_win_del_cb!!");
+ GL_CHECK(data);
+
+ elm_exit();
+}
+
+
+static int _gallery_update_ts(Evas_Object *eo, struct text_part *tp, int size)
+{
+ int i = 0;
+
+ if (eo == NULL || tp == NULL || size < 0) {
+ return -1;
+ }
+ for (i = 0; i < size; i++) {
+ if (tp[i].part && tp[i].msgid) {
+ edje_object_part_text_set(eo, tp[i].part,
+ tp[i].msgid);
+ }
+ }
+
+ return 0;
+}
+
+static void _gallery_lang_changed_cb(void *data)
+{
+ GL_CHECK(data);
+ gl_appdata *ad = (gl_appdata *)data;
+ GL_CHECK(ad->maininfo.main_layout);
+
+ _gallery_update_ts(elm_layout_edje_get(ad->maininfo.main_layout),
+ main_txt, sizeof(main_txt) / sizeof(main_txt[0]));
+ _gl_lang_update(data);
+}
+
+static Eina_Bool __gallery_key_down_cb(void *data, int type, void *event)
+{
+ if (!data) {
+ gl_dbgE("Invalid parameter!");
+ return ECORE_CALLBACK_PASS_ON;
+ }
+
+ gl_appdata *ad = (gl_appdata *)data;
+ ad->maininfo.home_key = false;
+ Ecore_Event_Key *key_event = (Ecore_Event_Key *)event;
+
+ if (!strcmp(key_event->keyname, KEY_END)) {
+ gl_dbgW("Bakc(End) key");
+ } else if (!strcmp(key_event->keyname, KEY_SELECT)) {
+ gl_dbgW("Home key");
+ ad->maininfo.home_key = true;
+ } else if (!strcmp(key_event->keyname, KEY_POWER)) {
+ gl_dbgW("Power key");
+ }
+
+ gl_dbg("Key down : %s", key_event->keyname);
+
+ return ECORE_CALLBACK_PASS_ON;
+}
+
+static void _gallery_low_battery_cb(void *data)
+{
+ gl_dbg("");
+
+ /* ug_send_event(UG_EVENT_LOW_BATTERY); */
+ /* 0 : default handler, 1:user handler */
+}
+
+/**
+ * Perform an UI update according to the given rotation angle.
+ * Do not call elm_win_rotation_set / elm_win_rotation_with_resize_set.
+ * ecore_evas has already called
+ * elm_win_rotation_set / elm_win_rotation_with_resize_set function.
+ *
+ * Please set NULL to app_device_orientation_cb member of app_event_callback_s structure.
+ * And don't use app_device_orientation_cb callback which is supported by capi
+*/
+static void __gallery_rot_changed_cb(void *data, Evas_Object *obj, void *event)
+{
+ GL_CHECK(data);
+ gl_appdata *ad = (gl_appdata *)data;
+ GL_CHECK(ad->maininfo.win);
+ /* changed_ang value is 0 90 180 270 */
+ int changed_ang = elm_win_rotation_get(ad->maininfo.win);
+ gl_dbg("New angle: %d, old angle: %d", changed_ang,
+ ad->maininfo.rotate_mode);
+ if (changed_ang == ad->maininfo.rotate_mode)
+ return;
+ else
+ ad->maininfo.rotate_mode = changed_ang;
+
+ enum ug_event evt = UG_EVENT_NONE;
+ /* Send event to UG */
+ switch (changed_ang) {
+ case APP_DEVICE_ORIENTATION_0:
+ evt = UG_EVENT_ROTATE_PORTRAIT;
+ break;
+ case APP_DEVICE_ORIENTATION_90:
+ evt = UG_EVENT_ROTATE_LANDSCAPE_UPSIDEDOWN;
+ break;
+ case APP_DEVICE_ORIENTATION_180:
+ evt = UG_EVENT_ROTATE_PORTRAIT_UPSIDEDOWN;
+ break;
+ case APP_DEVICE_ORIENTATION_270:
+ evt = UG_EVENT_ROTATE_LANDSCAPE;
+ break;
+ }
+ ug_send_event(evt);
+
+ int view_mode = gl_get_view_mode(ad);
+ if (ad->uginfo.ug_called_by_me) {
+ if (view_mode == GL_VIEW_ALBUMS){
+ gl_ctrl_rotate_ctrlbar(ad, GL_VIEW_NONE);
+ }
+ return;
+ }
+ gl_ctrl_rotate_ctrlbar(ad, GL_VIEW_NONE);
+}
+
+static Eina_Bool __gallery_prop_change(void *data, int ev_type, void *ev)
+{
+ GL_CHECK_FALSE(ev);
+ Ecore_X_Event_Window_Property *event = ev;
+
+ if (event->win != ecore_x_window_root_first_get())
+ return ECORE_CALLBACK_PASS_ON;
+
+ if (event->atom != ecore_x_atom_get("FONT_TYPE_change"))
+ return ECORE_CALLBACK_PASS_ON;
+
+ gl_dbg("Font is changed!(FONT_TYPE_change)");
+ /* Remove ctxpopup */
+ _gl_ctxpopup_del(data);
+
+ return ECORE_CALLBACK_PASS_ON;
+}
+
+void profile_changed_cb(void *data, Evas_Object * obj, void *event)
+{
+ const char *profile = elm_config_profile_get();
+
+ if (strcmp(profile, "desktop") == 0)
+ elm_win_indicator_mode_set (obj, ELM_WIN_INDICATOR_HIDE);
+ else
+ elm_win_indicator_mode_set (obj, ELM_WIN_INDICATOR_SHOW);
+}
+
+static Evas_Object *_gallery_create_win(void *data, const char *name)
+{
+ gl_dbg_launch(" _gallery_create_win:start");
+ GL_CHECK_NULL(name);
+ GL_CHECK_NULL(data);
+ gl_appdata *ad = (gl_appdata *)data;
+ Evas_Object *eo = NULL;
+
+ gl_dbg_launch(" elm_win_add:start");
+ eo = elm_win_add(NULL, name, ELM_WIN_BASIC);
+ gl_dbg_launch(" elm_win_add:end");
+ if (eo) {
+ /**
+ * Register a list of rotation angles that your application supports
+ *
+ * The window manager is going to decide rotation of application windows
+ * by referring the list of rotation angles.
+ * In this means if your application sets 0, 90 and 270 degrees to be the list of
+ * supported rotation angles, the window manager will not rotate your
+ * application window if the device is rotated 180 degrees
+ */
+ if (elm_win_wm_rotation_supported_get(eo)) {
+ const int rots[4] = { APP_DEVICE_ORIENTATION_0,
+ APP_DEVICE_ORIENTATION_90,
+ APP_DEVICE_ORIENTATION_180,
+ APP_DEVICE_ORIENTATION_270 };
+ gl_dbg("");
+ elm_win_wm_rotation_available_rotations_set(eo, rots, 4);
+ }
+ /* pass '-1' value to this API then it will unset preferred rotation angle */
+ elm_win_wm_rotation_preferred_rotation_set(eo, -1);
+
+ elm_win_autodel_set(eo, EINA_TRUE);
+ elm_win_title_set(eo, name);
+ evas_object_smart_callback_add(eo, "profile,changed",
+ profile_changed_cb, ad);
+ evas_object_smart_callback_add(eo, "delete,request",
+ _gallery_win_del_cb, ad);
+ evas_object_smart_callback_add(eo, "wm,rotation,changed",
+ __gallery_rot_changed_cb, data);
+ ad->maininfo.win_scale = elm_config_scale_get();
+ gl_dbg("main window scale: %f", ad->maininfo.win_scale);
+
+ /*register x window property change callback */
+ ecore_x_event_mask_set(ecore_x_window_root_first_get(),
+ ECORE_X_EVENT_MASK_WINDOW_PROPERTY);
+
+ ad->maininfo.font_handler = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_PROPERTY,
+ __gallery_prop_change,
+ evas_object_evas_get(eo));
+ }
+
+ gl_dbg("_gallery_create_win:done");
+ gl_dbg_launch(" _gallery_create_win:end");
+ return eo;
+}
+
+/* Parent is main window */
+static Evas_Object *_gallery_create_bg(Evas_Object *parent)
+{
+ gl_dbg_launch(" _gallery_create_bg:start");
+ GL_CHECK_NULL(parent);
+ Evas_Object *bg = NULL;
+
+ gl_dbg_launch(" elm_bg_add:start");
+ bg = elm_bg_add(parent);
+ gl_dbg_launch(" elm_bg_add:end");
+ /* Show special color of background */
+ elm_bg_color_set(bg, GL_BG_COLOR_R, GL_BG_COLOR_G, GL_BG_COLOR_B);
+ evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND,
+ EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bg, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_win_resize_object_add(parent, bg);
+ evas_object_show(bg);
+ gl_dbg_launch(" _gallery_create_bg:end");
+
+ return bg;
+}
+
+/* Parent is main window */
+static Evas_Object *_gallery_create_conform(Evas_Object *parent)
+{
+ gl_dbg_launch(" _gallery_create_conform:start");
+ GL_CHECK_NULL(parent);
+ Evas_Object *conform = NULL;
+
+ gl_dbg_launch(" elm_conformant_add:start");
+ conform = elm_conformant_add(parent);
+ gl_dbg_launch(" elm_conformant_add:end");
+
+ evas_object_size_hint_weight_set(conform, EVAS_HINT_EXPAND,
+ EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(conform, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_win_resize_object_add(parent, conform);
+ evas_object_show(conform);
+ gl_dbg_launch(" _gallery_create_conform:end");
+
+ return conform;
+}
+
+static int _gallery_create_view_ly(gl_appdata *ad)
+{
+ gl_dbg_launch(" _gallery_create_view_ly:start");
+ GL_CHECK_VAL(ad, -1);
+ GL_CHECK_VAL(ad->maininfo.naviframe, -1);
+ Evas_Object *cbar = NULL;
+
+ Evas_Object *layout = gl_ctrl_create_ctrlbar_view(ad->maininfo.naviframe);
+
+ ad->ctrlinfo.ctrlbar_view_ly = layout;
+
+ /* create controlbar downside */
+ cbar = gl_ctrl_create_ctrlbar(ad, GL_CTRL_TAB_ALBUMS);
+ elm_object_part_content_set(ad->ctrlinfo.ctrlbar_ly,
+ "elm.swallow.tabbar", cbar);
+ _gl_ctrl_show_tabbar(ad, true);
+ ad->ctrlinfo.ctrlbar = cbar;
+
+ gl_ui_create_title_and_push(ad, ad->maininfo.naviframe,
+ ad->ctrlinfo.ctrlbar_view_ly,
+ GL_NAVI_ALBUMS, GL_STR_CTRL_ITEM_ALBUMS);
+ gl_dbg_launch(" _gallery_create_view_ly:end");
+
+ return 0;
+}
+
+static Eina_Bool __gallery_activate_win_idler_cb(void *data)
+{
+ GL_CHECK_CANCEL(data);
+ gl_appdata *ad = (gl_appdata *)data;
+
+ gl_dbgW("elm_win_activate - start!");
+ elm_win_activate(ad->maininfo.win);
+ gl_dbgW("elm_win_activate - done!");
+
+ if (ad->albuminfo.activate_win_idler) {
+ ecore_idler_del(ad->albuminfo.activate_win_idler);
+ ad->albuminfo.activate_win_idler = NULL;
+ }
+
+ return ECORE_CALLBACK_CANCEL;
+}
+
+static Eina_Bool _gallery_create_albums_idler_cb(void *data)
+{
+ gl_dbg_launch(" _gallery_create_albums_idler_cb:start");
+ GL_CHECK_CANCEL(data);
+ gl_appdata *ad = (gl_appdata *)data;
+ gl_dbg("_gallery_create_albums_idler_cb:start");
+
+ gl_dbgW("\tIdler: gallery is launched!");
+
+ /* Initialize libmedia-info */
+ _gl_data_init();
+ gl_dbg("DB initialization:done");
+ /* Get cluster list from libmedia-info */
+ gl_dbg_launch(" _gl_data_get_cluster_list:start");
+ _gl_data_get_cluster_list(ad);
+ gl_dbg_launch(" _gl_data_get_cluster_list:end");
+ GL_CHECK_FALSE(ad->albuminfo.cluster_list);
+ gl_dbg("_gl_data_get_cluster_list:done");
+ /* Set view mode */
+ gl_set_view_mode(ad, GL_VIEW_ALBUMS);
+ /**
+ * Disbale 'edit' button if none editable albums
+ * (albums except 'All albums'/'Camera shot'/'AllShare') exist.
+ */
+ if (gl_check_gallery_empty(ad) ||
+ ad->albuminfo.cluster_list->edit_cnt == 0)
+ _gl_ctrl_disable_btn(ad, true, GL_NAVI_ALBUMS);
+ /* Update albums view, append items */
+ gl_albums_update_items(ad);
+
+ /**
+ * Disable control bar when none album exists.
+ * or File system is unmounted.
+ */
+ if (gl_check_gallery_empty(ad))
+ gl_ctrl_disable_ctrlbar(ad, true);
+ else
+ gl_ctrl_disable_ctrlbar(ad, false);
+
+ gl_dbg("_gallery_create_albums_idler_cb:done");
+
+ if (ad->albuminfo.create_albums_idler) {
+ ecore_idler_del(ad->albuminfo.create_albums_idler);
+ ad->albuminfo.create_albums_idler = NULL;
+ }
+
+ gl_dbg_launch(" _gallery_create_albums_idler_cb:end");
+ return ECORE_CALLBACK_CANCEL;
+}
+
+/**
+ * <layout>
+ * Elm_win
+ * |-> Elm_bg
+ * |-> Elm_conformant
+ * |-> Elm_layout(main_layout)
+ * |-> Elm_layout(ctrlbar_ly)
+ * |-> Elm_naviframe(naviframe)
+ * |-> Elm_layout(ctrlbar_view_ly)
+ * |-> Elm_gengrid(albums_view/tags_view/places_view/...)
+*/
+static int _gallery_init_view(gl_appdata *ad)
+{
+ gl_dbg_launch(" _gallery_init_view:start");
+ gl_dbg("");
+ GL_CHECK_VAL(ad, -1);
+ Evas_Object *ly = NULL;
+
+ /* Background. */
+ ad->maininfo.bg = _gallery_create_bg(ad->maininfo.win);
+ GL_CHECK_VAL(ad->maininfo.bg, -1);
+ /* Conformant. */
+ Evas_Object *conform = _gallery_create_conform(ad->maininfo.win);
+ GL_CHECK_VAL(conform, -1);
+ /* Set if this window is an illume conformant window */
+ elm_win_conformant_set(ad->maininfo.win, EINA_TRUE);
+ /* Base Layout */
+ ad->maininfo.main_layout = gl_ui_create_main_ly(conform);
+ GL_CHECK_VAL(ad->maininfo.main_layout, -1);
+ /* Set base layout to conformant */
+ elm_object_content_set(conform, ad->maininfo.main_layout);
+ /* Indicator */
+ elm_win_indicator_mode_set(ad->maininfo.win, ELM_WIN_INDICATOR_SHOW);
+ gl_dbg("gl_ui_create_main_ly: done");
+ /* Create control layout */
+ ly = gl_ctrl_create_ctrlbar_ly(ad->maininfo.main_layout);
+ GL_CHECK_VAL(ly, -1);
+ ad->ctrlinfo.ctrlbar_ly = ly;
+ /* Set control layout to main layout */
+ elm_object_part_content_set(ad->maininfo.main_layout,
+ "elm.swallow.content", ly);
+ /* Create Naviframe */
+ ad->maininfo.naviframe = gl_ui_create_naviframe(ad->ctrlinfo.ctrlbar_ly);
+ GL_CHECK_VAL(ad->maininfo.naviframe, -1);
+ /* Set Naviframe to control layout */
+ elm_object_part_content_set(ad->ctrlinfo.ctrlbar_ly,
+ "elm.swallow.content",
+ ad->maininfo.naviframe);
+
+ evas_object_data_set(ad->maininfo.naviframe, GL_NAVIFRAME_OBJ_DATA_KEY,
+ conform);
+
+ gl_dbg("gl_ctrl_create_ctrlbar_view: done");
+
+ /* Create view layout and Set view layout to Naviframe*/
+ _gallery_create_view_ly(ad);
+
+ /* Add albums view and append nothing */
+ Evas_Object *layout_inner = NULL;
+ layout_inner = _gl_albums_add_gengrid(ad, ad->ctrlinfo.ctrlbar_view_ly);
+ GL_CHECK_FALSE(layout_inner);
+ elm_object_part_content_set(ad->ctrlinfo.ctrlbar_view_ly, "contents",
+ layout_inner);
+ ad->albuminfo.albums_view = layout_inner;
+ ad->albuminfo.gallery_launched = true;
+
+ gl_dbg_launch(" _gallery_init_view:end");
+
+ return 0;
+}
+
+static bool _gallery_create(void *data)
+{
+ gl_dbg_launch("create:start");
+ gl_dbgW("==Create==");
+ GL_CHECK_FALSE(data);
+ gl_appdata *ad = (gl_appdata *)data;
+ ad->maininfo.reentrant = TRUE;
+ Evas_Object *win = NULL;
+
+ elm_theme_extension_add(NULL, GL_EDJ_FILE);
+
+ /* create window */
+ win = _gallery_create_win(ad, PACKAGE);
+ GL_CHECK_FALSE(win);
+ ad->maininfo.win = win;
+
+ /* initialize gallery view */
+ if (_gallery_init_view(ad) != 0) {
+ gl_dbgE("_gallery_init_view failed");
+ return false;
+ }
+ /* _gallery_lang_changed_cb(ad); */
+
+ gl_dbg_launch(" evas_object_show(win):start");
+ evas_object_show(win);
+ gl_dbg_launch(" evas_object_show(win):end");
+ gl_dbg("evas_object_show(win):done");
+ /* Register callbacks of DB update */
+ gl_dbg("system event cb:done");
+
+ gl_dbg_launch(" register callbacks:start");
+ gl_reg_db_update_noti(ad);
+ /* Register key down handler */
+ ad->maininfo.keydown_handler = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN,
+ __gallery_key_down_cb,
+ data);
+ gl_dbg_launch(" register callbacks:end");
+
+ if (ad->albuminfo.create_albums_idler == NULL) {
+ /* Use idler to load albums view */
+ Ecore_Idler *idl = NULL;
+ idl = ecore_idler_add(_gallery_create_albums_idler_cb, ad);
+ ad->albuminfo.create_albums_idler = idl;
+ gl_dbg("create_albums_idler added: 0x%x",
+ ad->albuminfo.create_albums_idler);
+ }
+ gl_dbg_launch("create:end");
+
+ return true;
+}
+
+static int _gallery_close_app(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+
+ if (ad->albuminfo.create_albums_idler) {
+ ecore_idler_del(ad->albuminfo.create_albums_idler);
+ ad->albuminfo.create_albums_idler = NULL;
+ }
+
+ if (ad->albuminfo.activate_win_idler) {
+ ecore_idler_del(ad->albuminfo.activate_win_idler);
+ ad->albuminfo.activate_win_idler = NULL;
+ }
+ /* Destroy idler */
+ _gl_thumbs_del_append_idler(ad);
+ /* destroy rename album job.*/
+ if(ad->maininfo.rename_album_job) {
+ ecore_job_del(ad->maininfo.rename_album_job);
+ ad->maininfo.rename_album_job = NULL;
+ }
+ /* Destroy vibration timer */
+ if (ad->entryinfo.vibration_timer) {
+ ecore_timer_del(ad->entryinfo.vibration_timer);
+ ad->entryinfo.vibration_timer = NULL;
+ }
+ /* Free Ecore_Pipe object created */
+ if (ad->pbarinfo.sync_pipe) {
+ ecore_pipe_del(ad->pbarinfo.sync_pipe);
+ ad->pbarinfo.sync_pipe = NULL;
+ }
+
+ if (ad->pbarinfo.start_thread_timer) {
+ ecore_timer_del(ad->pbarinfo.start_thread_timer);
+ ad->pbarinfo.start_thread_timer = NULL;
+ }
+
+ if (ad->pbarinfo.del_pbar_idler) {
+ ecore_idler_del(ad->pbarinfo.del_pbar_idler);
+ ad->pbarinfo.del_pbar_idler = NULL;
+ }
+
+ /* Destroy timer for removing popup */
+ if (ad->popupinfo.del_timer) {
+ ecore_timer_del(ad->popupinfo.del_timer);
+ ad->popupinfo.del_timer = NULL;
+ }
+
+ /* Remove down event handler */
+ if(ad->maininfo.keydown_handler) {
+ ecore_event_handler_del(ad->maininfo.keydown_handler);
+ ad->maininfo.keydown_handler = NULL;
+ }
+
+ /*Remove font type change event handler*/
+ if (ad->maininfo.font_handler) {
+ ecore_event_handler_del(ad->maininfo.font_handler);
+ ad->maininfo.font_handler = NULL;
+ }
+
+ /* Remove key data for confirmant */
+ evas_object_data_del(ad->maininfo.naviframe, GL_NAVIFRAME_OBJ_DATA_KEY);
+ /* Remove IMF */
+ _gl_editfield_destroy_imf(ad);
+
+ _gl_ctxpopup_del(ad);
+
+ /* Clear data about thumb callbacks */
+ _gl_destroy_thumbs_edit_view(ad);
+ if (ad->gridinfo.select_view)
+ _gl_thumbs_clear_cbs(ad->gridinfo.select_view);
+ _gl_thumbs_delete_view(ad);
+
+ /* DB update callback unregister. */
+ gl_dereg_db_update_noti();
+
+ /* Free memory allocated for appcontrol */
+ _gallery_init_app_svc(ad);
+
+ ug_destroy_all();
+#if 0
+ if (ad->maininfo.main_layout)
+ evas_object_del(ad->maininfo.main_layout);
+#endif
+/*BS launched after connecting to PC while Gallery open in mass storage mode.*/
+#if 0
+ if (ad->maininfo.win)
+ evas_object_del(ad->maininfo.win);
+#endif
+ gl_albums_free_data(data);
+
+ /* disconnet with libmedia-info */
+ _gl_data_finalize(ad);
+
+#ifdef _USE_SBESM
+ _gl_ext_deinitialize_sbeam(data);
+#endif
+
+ gl_dbgW("==Cleaning done==");
+
+ return 0;
+}
+
+static void _gallery_terminate(void *data)
+{
+ gl_dbgW("==Terminate==");
+ GL_CHECK(data);
+ _gallery_close_app(data);
+}
+
+static void _gallery_pause(void *data)
+{
+ gl_dbgW("==Pause==");
+ GL_CHECK(data);
+ gl_appdata *ad = (gl_appdata *)data;
+ ad->maininfo.reentrant = TRUE;
+
+ if (ad->maininfo.home_key) {
+ gl_ext_destroy_gallery_ug(ad);
+ ad->maininfo.home_key = false;
+ }
+
+ ug_pause();
+}
+
+static void _gallery_resume(void *data)
+{
+ gl_dbg_launch("resume:start");
+ gl_dbgW("==Resume==");
+ GL_CHECK(data);
+ gl_appdata *ad = (gl_appdata *)data;
+
+ ug_resume();
+ /* Video palyer was close when pause Gallery */
+ ad->uginfo.app_called_by_me = false;
+
+ /* Show cursor and IMF if not popup showed */
+ if (ad->entryinfo.editfield) {
+ if (ad->popupinfo.popup) {
+ gl_dbg("Hide Entry cursor and IMF");
+ _gl_editfield_hide_imf(ad);
+ } else {
+ gl_dbg("Show Entry cursor and IMF");
+ _gl_editfield_show_imf(ad);
+ }
+ }
+
+ /* Update view */
+ gl_update_view(ad, GL_UPDATE_VIEW_NORMAL);
+
+ gl_dbg_launch("resume:done");
+}
+static int __gallery_reset_app(void *data, const char *cluster_id,
+ const char *aul_type)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ GL_CHECK_VAL(ad->maininfo.win, -1);
+ int view_mode = gl_get_view_mode(ad);
+ gl_dbg("");
+
+ if (cluster_id == NULL || aul_type == NULL) {
+ gl_dbgE("Invalid aul parameters!");
+ goto GALLERY_RESET_FAILED;
+ }
+
+ if (ad->pbarinfo.sync_pipe) {
+ gl_dbgW("Cancel move/delete pthread/Pipe!");
+ /* Set cancel state to make child thread exit */
+ gl_thread_set_cancel_state(ad, GL_PB_CANCEL_RESET);
+ return -1;
+ }
+
+ if (view_mode == GL_VIEW_NONE) {
+ /* First launch gallery then show shortcut album/tag */
+ _gl_data_init();
+ gl_dbg("Launch gallery at the first time");
+ _gl_data_get_cluster_list(ad);
+ GL_CHECK_VAL(ad->albuminfo.cluster_list, -1);
+ /* Set view mode */
+ gl_set_view_mode(ad, GL_VIEW_ALBUMS);
+ /* Select tabbar item contains shortcut item */
+ _gl_ctrl_sel_tabbar_item(ad, aul_type);
+ } else if (ad->ctrlinfo.tab_mode == GL_CTRL_TAB_TAGS) {
+ gl_dbg("In Tags tab");
+ if (_gl_tags_reset_view(ad, cluster_id, aul_type) < 0)
+ goto GALLERY_RESET_FAILED;
+ } else {
+ gl_dbg("In Albums tab");
+ if (_gl_albums_reset_view(ad, cluster_id, aul_type) < 0)
+ goto GALLERY_RESET_FAILED;
+ }
+
+ if (g_strcmp0(cluster_id, GL_ALBUM_ALL_ID) == 0 &&
+ g_strcmp0(aul_type, GL_AUL_ALBUM) == 0)
+ goto GALLERY_RESET_SUCCESS;
+
+ /* Remove idler for other tabbar item */
+ if (ad->albuminfo.create_albums_idler) {
+ gl_dbgW("Remove album creation idler!");
+ ecore_idler_del(ad->albuminfo.create_albums_idler);
+ ad->albuminfo.create_albums_idler = NULL;
+ }
+
+ if (!g_strcmp0(aul_type, GL_AUL_TAG)) {
+ /* Show shortcut tag */
+ if (_gl_tags_sel_home_tag(ad, cluster_id) == false) {
+ /* Tag doesn't exist */
+ gl_dbgE("Tag(livepanel) doesn't exist!");
+ goto GALLERY_RESET_FAILED;
+ }
+ } else {
+ gl_dbgE("Wrong type!");
+ goto GALLERY_RESET_FAILED;
+ }
+ GALLERY_RESET_SUCCESS:
+ elm_win_activate(ad->maininfo.win);
+ return 0;
+
+ GALLERY_RESET_FAILED:
+ elm_win_activate(ad->maininfo.win);
+ return -1;
+}
+
+/* init appcontrol launch related global variables */
+static int _gallery_init_app_svc(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_dbg("");
+ gl_appdata *ad = (gl_appdata *)data;
+
+ ad->albuminfo.aul_launch_type = GL_AUL_T_NONE;
+ ad->albuminfo.aul_file_type = GL_AUL_FILE_T_NONE;
+ ad->albuminfo.aul_setas_type = GL_AUL_SETAS_T_NONE;
+ GL_FREEIF(ad->albuminfo.aul_id);
+ GL_FREEIF(ad->albuminfo.aul_type);
+ ad->albuminfo.aul_launch_by_mime = false;
+
+ if(ad->albuminfo.recv_service) {
+ service_destroy(ad->albuminfo.recv_service);
+ ad->albuminfo.recv_service = NULL;
+ }
+
+ GL_FREEIF(ad->albuminfo.aul_callid_size);
+ GL_FREEIF(ad->albuminfo.aul_callid_path);
+ GL_FREEIF(ad->albuminfo.aul_homescreen_path);
+ GL_FREEIF(ad->albuminfo.aul_lockscreen_path);
+ return 0;
+}
+
+static int __gallery_parse_contain_drm(void *data, service_h service)
+{
+ GL_CHECK_VAL(service, -1);
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ char *contain_drm = NULL;
+
+ ad->albuminfo.b_show_drm = false;
+ service_get_extra_data(service, GL_BD_DRM_TYPE, &contain_drm);
+ gl_dbg("DRM: %s", contain_drm);
+ if (contain_drm) {
+ if (!strcasecmp(contain_drm, GL_BD_SHOW_DRM_FILE))
+ ad->albuminfo.b_show_drm= true;
+ GL_FREE(contain_drm);
+ }
+
+ return 0;
+}
+
+static int __gallery_parse_launch_type(void *data, service_h service)
+{
+ GL_CHECK_VAL(service, -1);
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ gl_aul_launch_type launch_type = GL_AUL_T_NONE;
+ char *launch_type_str = NULL;
+ char *select_mode = NULL;
+ char *setas_type_str = NULL;
+ gl_dbg("");
+
+ /* get launch-type */
+ service_get_extra_data(service, GL_BD_SELECTION_MODE, &select_mode);
+ if (select_mode) {
+ if (!strcasecmp(select_mode, GL_BD_SELECTION_MODE_SINGLE)) {
+ ad->albuminfo.aul_launch_type = GL_AUL_T_SELECT_ONE;
+ GL_FREEIF(select_mode);
+ return 0;
+ } else if (!strcasecmp(select_mode, GL_BD_SELECTION_MODE_MULTI)) {
+ ad->albuminfo.aul_launch_type = GL_AUL_T_SELECT_MULTIPLE;
+ GL_FREEIF(select_mode);
+ return 0;
+ }
+ }
+ service_get_extra_data(service, GL_BD_LAUNCH_TYPE, &launch_type_str);
+ if (launch_type_str == NULL) {
+ gl_dbg("set to default launch type: select-one");
+ ad->albuminfo.aul_launch_type = GL_AUL_T_SELECT_ONE;
+ return 0;
+ } else {
+ gl_dbg("launch-type: %s", launch_type_str);
+ }
+
+ if(!strcasecmp(launch_type_str, GL_BD_SELECT_ALBUM)) {
+ launch_type = GL_AUL_T_SELECT_ALBUM;
+ } else if(!strcasecmp(launch_type_str, GL_BD_SELECT_ONE)) {
+ launch_type = GL_AUL_T_SELECT_ONE;
+ } else if(!strcasecmp(launch_type_str, GL_BD_SELECT_MULTIPLE)) {
+ launch_type = GL_AUL_T_SELECT_MULTIPLE;
+ } else if(!strcasecmp(launch_type_str, GL_BD_SELECT_SETAS)) {
+ launch_type = GL_AUL_T_SELECT_SETAS;
+
+ /* get setas-type */
+ service_get_extra_data(service, GL_BD_SETAS_TYPE, &setas_type_str);
+ if(setas_type_str == NULL) {
+ GL_FREE(launch_type_str);
+ return 0;
+ }
+ gl_dbg("setas-type: %s", setas_type_str);
+
+ gl_aul_setas_type setas_type = GL_AUL_SETAS_T_NONE;
+ char *path = NULL;
+ char *size = NULL;
+
+ if (!strcasecmp(setas_type_str, GL_BD_SETAS_WALLPALER)) {
+ setas_type = GL_AUL_SETAS_T_WALLPAPER;
+
+ /* get homscreen-path */
+ service_get_extra_data(service, GL_BD_HOMESCREEN_PATH,
+ &path);
+ if (path) {
+ gl_dbg("homescreen-path: %s", path);
+ ad->albuminfo.aul_homescreen_path = path;
+ path = NULL;
+ }
+ /* get lockscreen-path */
+ service_get_extra_data(service, GL_BD_LOCKSCREEN_PATH,
+ &path);
+ if (path) {
+ gl_dbg("lockscreen-path: %s", path);
+ ad->albuminfo.aul_lockscreen_path = path;
+ path = NULL;
+ }
+ } else if (!strcasecmp(setas_type_str, GL_BD_SETAS_CALLERID)) {
+ setas_type = GL_AUL_SETAS_T_CALLER_ID;
+ /* get callerid-size */
+ service_get_extra_data(service, GL_BD_CALLERID_SIZE,
+ &size);
+ if (size) {
+ gl_dbg("callerid-size: %s", size);
+ ad->albuminfo.aul_callid_size = size;
+ }
+ /* get callerid-path */
+ service_get_extra_data(service, GL_BD_CALLERID_PATH,
+ &path);
+ if (path) {
+ gl_dbg("callerid-path: %s", path);
+ ad->albuminfo.aul_callid_path = path;
+ }
+ }
+
+ ad->albuminfo.aul_setas_type = setas_type;
+ GL_FREE(setas_type_str);
+ }
+
+ ad->albuminfo.aul_launch_type = launch_type;
+ GL_FREE(launch_type_str);
+ return 0;
+}
+
+/* analysis parameters */
+static int __gallery_parse_param(void *data, service_h service)
+{
+ GL_CHECK_VAL(service, -1);
+ GL_CHECK_VAL(data, -1);
+ gl_dbg("");
+ gl_appdata *ad = (gl_appdata *)data;
+ char *operation = NULL;
+ char *uri = NULL;
+ char *mime = NULL;
+
+ /* init */
+ _gallery_init_app_svc(ad);
+
+ /* save current service handle */
+ service_clone(&ad->albuminfo.recv_service, service);
+
+ service_get_operation(service, &operation);
+ gl_dbg("operation: %s", operation);
+
+ service_get_uri(service, &uri);
+ if(uri) {
+ gl_dbg("uri: %s", uri);
+ char *str_pre = NULL;
+ char *str_suf = NULL;
+ str_pre = strtok_r(uri, GL_AUL_SEP, &str_suf);
+ gl_dbg("str_pre: %s, str_suf: %s", str_pre, str_suf);
+ GL_CHECK_VAL(str_pre, -1);
+ GL_CHECK_VAL(str_suf, -1);
+ str_pre = strtok_r(str_suf, GL_AUL_SEP, &str_suf);
+ gl_dbg("str_pre: %s, str_suf: %s", str_pre, str_suf);
+ GL_CHECK_VAL(str_pre, -1);
+ GL_CHECK_VAL(str_suf, -1);
+ ad->albuminfo.aul_id = strdup(str_suf);
+ ad->albuminfo.aul_type = strdup(str_pre);
+ ad->albuminfo.aul_launch_by_mime = true;
+ gl_dbg("Type: %s, ID: %s", ad->albuminfo.aul_type,
+ ad->albuminfo.aul_id);
+ return 0;
+ }
+
+ if(!strcasecmp(operation, SERVICE_OPERATION_DEFAULT)) {
+ return -1;
+ } else if (!strcasecmp(operation, SERVICE_OPERATION_VIEW)) {
+ /* OPERATION_VIEW */
+ ad->albuminfo.aul_launch_type = GL_AUL_T_VIEW_ALBUM;
+
+ /* get file-type from service */
+ char *file_type_str = NULL;
+ ad->albuminfo.aul_file_type = GL_AUL_FILE_T_ALL; /* default */
+ service_get_extra_data(service, GL_BD_FILE_TYPE, &file_type_str);
+ if(file_type_str) {
+ gl_dbg("file type: %s", file_type_str);
+ if (!g_strcmp0(file_type_str, GL_BD_FILE_TYPE_IMAGE)) {
+ ad->albuminfo.aul_file_type = GL_AUL_FILE_T_IMAGE;
+ } else if (!g_strcmp0(file_type_str, GL_BD_FILE_TYPE_VIDEO)) {
+ ad->albuminfo.aul_file_type = GL_AUL_FILE_T_VIDEO;
+ }
+ GL_FREE(file_type_str);
+ }
+ /* get album-id */
+ char *album_id_str = NULL;
+ service_get_extra_data(service, GL_BD_ALBUM_ID, &album_id_str);
+
+ if(album_id_str) {
+ gl_dbg("album-id: %s", album_id_str);
+ ad->albuminfo.aul_id = album_id_str;
+ } else {
+ gl_dbg("album-id is invalid, set to default (ALL)");
+ ad->albuminfo.aul_id = strdup(GL_ALBUM_ALL_ID);
+ }
+ /* To show album, so tabbar item must be Albums */
+ ad->albuminfo.aul_type = strdup(GL_AUL_ALBUM);
+ } else if (!strcasecmp(operation, SERVICE_OPERATION_PICK)) {
+ /* OPERATION_PICK */
+ /* get file-type from mime */
+ ad->albuminfo.aul_file_type = GL_AUL_FILE_T_ALL; /* default */
+ service_get_mime(service, &mime);
+ if(mime) {
+
+ gl_dbg("mime: %s", mime);
+ if (!g_strcmp0(mime, GL_MIME_IMAGE_ALL)) {
+ ad->albuminfo.aul_file_type = GL_AUL_FILE_T_IMAGE;
+ } else if (!g_strcmp0(mime, GL_MIME_VIDEO_ALL)) {
+ ad->albuminfo.aul_file_type = GL_AUL_FILE_T_VIDEO;
+ }
+ }
+
+ __gallery_parse_launch_type(ad, service);
+ __gallery_parse_contain_drm(ad, service);
+ } else if (!strcasecmp(operation, GL_SERVICE_OPERATION_WALLPAPER)) {
+ /* Wallpaper */
+ ad->albuminfo.aul_file_type = GL_AUL_FILE_T_IMAGE;
+ ad->albuminfo.aul_launch_type = GL_AUL_T_SELECT_SETAS;
+ /* The wallpaper doesn't need crop currently, but IV ug returns "crop_image_path" */
+ ad->albuminfo.aul_setas_type = GL_AUL_SETAS_T_CROP_WALLPAPER;
+ __gallery_parse_contain_drm(ad, service);
+
+ char *path = NULL;
+ service_get_extra_data(service, GL_BD_HOMESCREEN_PATH, &path);
+ if (path) {
+ gl_dbg("homescreen-path: %s", path);
+ ad->albuminfo.aul_homescreen_path = path;
+ }
+ }
+
+ return 0;
+}
+
+static void _gallery_reset(service_h service, void *data)
+{
+ gl_dbgW("==Reset==");
+ GL_CHECK(data);
+ gl_appdata *ad = (gl_appdata *)data;
+ GL_CHECK(ad->maininfo.win);
+
+ if (ad->maininfo.reentrant) {
+ ad->maininfo.reentrant = FALSE;
+ } else {
+ gl_dbgW("Gallery reentrant is not allowed, return!");
+ return;
+ }
+
+ /* Destroy gallery ug */
+ if (ad->uginfo.gallery_ug_called_by_me) {
+ gl_dbgW("Destroy Gallery UG launched, show App view!");
+ ug_destroy(ad->uginfo.gallery_ug_called_by_me);
+ ad->uginfo.gallery_ug_called_by_me = NULL;
+ }
+
+ /* Parse parameters */
+ if(__gallery_parse_param(data, service) != 0) {
+ if (ad->albuminfo.aul_launch_by_mime == false &&
+ ad->albuminfo.aul_launch_type == GL_AUL_T_NONE) {
+/*@@ 1. Launch Gallery from menu screen/Smart search app, albums view showed @@*/
+ int view_m = gl_get_view_mode(ad);
+ gl_dbg("view_m: %d", view_m);
+ /* Launch Gallery at the first time */
+ if (view_m == GL_VIEW_NONE) {
+ gl_dbg("Set view mode as GL_VIEW_ALBUMS");
+ gl_set_view_mode(ad, GL_VIEW_ALBUMS);
+ } else {
+ gl_dbg("Update view");
+ gl_update_view(ad, GL_UPDATE_VIEW_NORMAL);
+ }
+ } else {
+ gl_dbgE("Failed to parse parameters, update view!");
+ gl_update_view(ad, GL_UPDATE_VIEW_NORMAL);
+ }
+ elm_win_activate(ad->maininfo.win);
+ return;
+ }
+
+ if (ad->albuminfo.aul_launch_by_mime ||
+ ad->albuminfo.aul_launch_type == GL_AUL_T_VIEW_ALBUM) {
+/*@@ 2. Launch Gallery from live-magazine/shortcut(add to home) @@*/
+ __gallery_reset_app(data, ad->albuminfo.aul_id,
+ ad->albuminfo.aul_type);
+ } else {
+/*@@ 3. Load Gallery UG @@*/
+ gl_dbg("Start loading Gallery UG");
+ if (gl_ext_load_gallery_ug(ad) == GL_UG_SUCCESS) {
+ if (gl_get_view_mode(ad) == GL_VIEW_NONE) {
+ gl_dbg("elm_win_activate");
+ elm_win_activate(ad->maininfo.win);
+ } else {
+ if (ad->albuminfo.activate_win_idler) {
+ ecore_idler_del(ad->albuminfo.activate_win_idler);
+ ad->albuminfo.activate_win_idler = NULL;
+ }
+ /* To show UG faster then app */
+ Ecore_Idler *idler = NULL;
+ idler = ecore_idler_add(__gallery_activate_win_idler_cb,
+ ad);
+ ad->albuminfo.activate_win_idler = idler;
+ }
+ }
+ }
+}
+
+int gallery_reset_app(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ gl_dbg("Reset gallery[cluster ID: %s]", ad->albuminfo.aul_id);
+ return __gallery_reset_app(data, ad->albuminfo.aul_id,
+ ad->albuminfo.aul_type);
+}
+
+int main(int argc, char *argv[])
+{
+ gl_dbg_launch("main:start");
+ gl_dbgW("==Gallery==");
+ gl_appdata gl_ad;
+ int ret;
+
+ app_event_callback_s event_callback;
+
+ event_callback.create = _gallery_create;
+ event_callback.terminate = _gallery_terminate;
+ event_callback.pause = _gallery_pause;
+ event_callback.resume = _gallery_resume;
+ event_callback.service = _gallery_reset;
+ event_callback.low_memory = NULL;
+ event_callback.low_battery = _gallery_low_battery_cb;
+ event_callback.device_orientation = NULL;
+ event_callback.language_changed = _gallery_lang_changed_cb;
+ event_callback.region_format_changed = NULL;
+
+ /* Enable OpenGL */
+ setenv("ELM_ENGINE", "gl", 1);
+
+ memset(&gl_ad, 0x00, sizeof(gl_appdata));
+
+ ret = app_efl_main(&argc, &argv, &event_callback, &gl_ad);
+
+ gl_dbgW("==Gallery gone==");
+ gl_dbg_launch("main:done");
+ return ret;
+}
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <unistd.h>
+#include <string.h>
+
+#include "gl-debug.h"
+
+#ifdef _USE_LOG_FILE_
+#include <Ecore_File.h>
+static char _g_file_path[GL_FILE_PATH_LEN_MAX] = { 0, };
+#endif
+
+#ifdef _PERFORMANCE_CHECK_
+static long g_time_usec = 0L;
+#endif
+
+void _custom_debug_msg(debug_msg_type *debug_msg, const char *msg, ...)
+{
+ va_list va;
+
+#define DIRECORY_SPLITTER '/'
+ const char*pFileName = NULL;
+
+ pFileName = strrchr(debug_msg->fname, DIRECORY_SPLITTER);
+ pFileName = (NULL == pFileName)?debug_msg->fname:(pFileName+1);
+
+ va_start(va, msg);
+
+ static char buf[2048];
+ int i ;
+ //i = snprintf(buf, 2048, "[%s : %d] ", pFileName, debug_msg->nline);
+ i = snprintf(buf, 2048, "[%-16.16s : %5d] ", pFileName, debug_msg->nline);
+
+ vsnprintf( buf + i, 2048 - i, msg, va);
+
+ print_log(DLOG_DEBUG, debug_msg->szcategory, "%s", buf);
+
+ va_end(va);
+}
+
+#if 0
+void
+gl_init_debug_handler(const char *appname)
+{
+#ifdef _USE_LOG_FILE_
+ if (appname == NULL)
+ return;
+
+ memset(_g_file_path, 0x00, sizeof(_g_file_path));
+
+ //sprintf(_g_file_path, "/tmp/%s", appname);
+ snprintf(_g_file_path, sizeof(_g_file_path), "/tmp/%s", appname);
+ if (ecore_file_can_read(_g_file_path))
+ remove(_g_file_path);
+
+ g_log_fp = fopen(_g_file_path, "a");
+#elif defined _USE_DLOG_
+ //dlog_init(NULL);
+#endif
+}
+
+void
+gl_close_debug_handler()
+{
+#ifdef _USE_LOG_FILE_
+ if (g_log_fp != NULL)
+ fclose(g_log_fp);
+#elif defined _USE_DLOG_
+ //dlog_deinit(NULL);
+#endif
+}
+#endif
+
+#if 0
+long
+gl_get_debug_time(void)
+{
+#ifdef _PERFORMANCE_CHECK_
+ struct timeval time;
+ memset(&time,0x00,sizeof(struct timeval));
+ gettimeofday(&time, NULL);
+ return time.tv_sec * GL_TIME_USEC_PER_SEC + time.tv_usec;
+#else
+ return 0L;
+#endif
+}
+
+void
+gl_reset_debug_time(void)
+{
+#ifdef _PERFORMANCE_CHECK_
+ struct timeval time;
+ memset(&time,0x00,sizeof(struct timeval));
+ gettimeofday(&time, NULL);
+ g_time_usec = time.tv_sec * GL_TIME_USEC_PER_SEC + time.tv_usec;
+#endif
+}
+#endif
+
+#if 0
+void
+gl_print_debug_time(char *time_string)
+{
+#ifdef _PERFORMANCE_CHECK_
+ struct timeval time;
+ double totaltime = 0.0;
+ memset(&time,0x00,sizeof(struct timeval));
+ gettimeofday(&time, NULL);
+ totaltime = (double)(time.tv_sec * GL_TIME_USEC_PER_SEC + time.tv_usec - g_time_usec) / CLOCKS_PER_SEC;
+
+ gl_dbg("time [%s] : %f \n", time_string, totaltime);
+#endif
+}
+
+void
+mb_print_debug_time_ex(long start, long end, const char *func_name, char *time_string)
+{
+#ifdef _PERFORMANCE_CHECK_
+ double totaltime = 0.0;
+
+ totaltime = (double)(end - start) / CLOCKS_PER_SEC;
+
+ gl_dbg("time [%s: %s] : %f \n", func_name, time_string, totaltime);
+#endif
+}
+#endif
+
+/* EOF */
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <sys/stat.h>
+#include <fcntl.h>
+#include "gallery.h"
+#include "gl-debug.h"
+#include "gl-drm.h"
+#include "gl-icons.h"
+
+char *gl_drm_get_file_path(void *item)
+{
+ GL_CHECK_NULL(item);
+ gl_item *gitem = (gl_item *) item;
+ GL_CHECK_NULL(gitem->item);
+ GL_CHECK_NULL(gitem->item->file_url);
+ gl_dbg("filepath: %s", gitem->item->file_url);
+
+ if (gl_drm_is_drm_file(gitem->item->file_url))
+ return strdup(GL_DEFAULT_THUMB_ICON);
+ else
+ return strdup(gitem->item->file_url);
+}
+
+Eina_Bool gl_drm_is_drm_file(const char *file_path)
+{
+ GL_CHECK_FALSE(file_path);
+
+ drm_bool_type_e is_drm_file = DRM_UNKNOWN;
+ if (drm_is_drm_file(file_path, &is_drm_file) != DRM_RETURN_SUCCESS) {
+ gl_dbgE("drm_is_drm_file error");
+ return EINA_FALSE;
+ }
+
+ if (DRM_TRUE == is_drm_file)
+ return EINA_TRUE;
+ return EINA_FALSE;
+}
+
+int gl_drm_get_permtype(int gitem_type)
+{
+ switch(gitem_type) {
+ case MEDIA_CONTENT_TYPE_IMAGE:
+ return DRM_PERMISSION_TYPE_DISPLAY;
+ case MEDIA_CONTENT_TYPE_VIDEO:
+ return DRM_PERMISSION_TYPE_PLAY;
+ default:
+ return -1;
+ }
+}
+
+Eina_Bool gl_drm_check_valid_ro(const char *file_path,
+ drm_permission_type_e permType)
+{
+ GL_CHECK_FALSE(file_path);
+ gl_dbg("file_path: %s", file_path);
+ int ret = -1;
+
+ drm_license_status_e license_status = DRM_LICENSE_STATUS_UNDEFINED;
+ ret = drm_get_license_status(file_path, permType, &license_status);
+ if (DRM_RETURN_SUCCESS == ret &&
+ DRM_LICENSE_STATUS_VALID == license_status) {
+ return EINA_TRUE;
+ }
+ else {
+ gl_dbg("No valid ro, return %d", license_status);
+ return EINA_FALSE;
+ }
+}
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * The Exif specification defines an Orientation Tag to indicate the orientation of the
+ * camera relative to the captured scene. This can be used by the camera either to
+ * indicate the orientation automatically by an orientation sensor,
+ * or to allow the user to indicate the orientation manually by a menu switch,
+ * without actually transforming the image data itself.
+ * Here is an explanation given by TsuruZoh Tachibanaya in
+ * his description of the Exif file format:
+ *
+ * The orientation of the camera relative to the scene, when the image was captured.
+ * The relation of the '0th row' and '0th column' to visual position is shown as below.
+ *
+ * Value 0th Row 0th Column
+ * 1 top left side
+ * 2 top right side
+ * 3 bottom right side
+ * 4 bottom left side
+ * 5 left side top
+ * 6 right side top
+ * 7 right side bottom
+ * 8 left side bottom
+ *
+ * Read this table as follows (thanks to Peter Nielsen for clarifying this - see also below):
+ * Entry #6 in the table says that the 0th row in the stored image is the right side of
+ * the captured scene, and the 0th column in the stored image is the top side of
+ * the captured scene.
+ *
+ * Here is another description given by Adam M. Costello:
+ *
+ * For convenience, here is what the letter F would look like if it were tagged correctly
+ * and displayed by a program that ignores the orientation tag
+ * (thus showing the stored image):
+ *
+ * 1 2 3 4 5 6 7 8
+ *
+ * 888888 888888 88 88 8888888888 88 88 8888888888
+ * 88 88 88 88 88 88 88 88 88 88 88 88
+ * 8888 8888 8888 8888 88 8888888888 8888888888 88
+ * 88 88 88 88
+ * 88 88 888888 888888
+*/
+
+#ifdef _USE_ROTATE_BG
+
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <Elementary.h>
+#include "gl-exif.h"
+#include "gl-debug.h"
+#include "gallery.h"
+
+#define GL_EXIF_BUF_LEN_MAX 65536L
+#define GL_EXIF_BUF_TIME_LEN_MAX 20
+#define GL_EXIF_DEFAULT_YEAR 1900
+
+#define GL_EXIF_SOI 0xD8
+#define GL_EXIF_TAG 0xFF
+#define GL_EXIF_APP0 0xE0
+#define GL_EXIF_APP1 0xE1
+#define GL_EXIF_JFIF_00 0x00
+#define GL_EXIF_JFIF_01 0x01
+#define GL_EXIF_JFIF_02 0x02
+
+#define GL_EXIF_IFD_DATA_FORMAT_UNSIGNED_BYTE 1
+#define GL_EXIF_IFD_DATA_FORMAT_ASCII_STRINGS 1
+#define GL_EXIF_IFD_DATA_FORMAT_UNSIGNED_SHORT 2
+#define GL_EXIF_IFD_DATA_FORMAT_UNSIGNED_LONG 4
+#define GL_EXIF_IFD_DATA_FORMAT_UNSIGNED_RATIONAL 8
+#define GL_EXIF_IFD_DATA_FORMAT_SIGNED_BYTE 1
+#define GL_EXIF_IFD_DATA_FORMAT_UNDEFINED 1
+#define GL_EXIF_IFD_DATA_FORMAT_SIGNED_SHORT 2
+#define GL_EXIF_IFD_DATA_FORMAT_SIGNED_LONG 4
+#define GL_EXIF_IFD_DATA_FORMAT_SIGNED_RATIONAL 8
+#define GL_EXIF_IFD_DATA_FORMAT_SIGNED_FLOAT 4
+#define GL_EXIF_IFD_DATA_FORMAT_DOUBLE_FLOAT 8
+
+#define GL_EXI_TMP_JPEG_FILE GL_DATA_FOLDER_PATH"/.gallery_tmp_write_exif.jpg"
+
+/* Write one byte, testing for EOF */
+static int __gl_exif_write_1_byte(FILE *fd, int c)
+{
+ if (fputc(c, fd) < 0) {
+ gl_dbgE("fputc failed!");
+ return -1;
+ }
+
+ return 0;
+}
+
+/* Read one byte, testing for EOF */
+static int __gl_exif_read_1_byte(FILE *fd)
+{
+ int c = 0;
+
+ /* Return next input byte, or EOF if no more */
+ c = getc(fd);
+ if (c == EOF) {
+ gl_dbgE("Premature EOF in JPEG file!");
+ return -1;
+ }
+
+ return c;
+}
+
+/* Read 2 bytes, convert to unsigned int */
+/* All 2-byte quantities in JPEG markers are MSB first */
+static int __gl_exif_read_2_bytes(FILE *fd, unsigned int *len)
+{
+ int c1 = 0;
+ int c2 = 0;
+
+ /* Return next input byte, or EOF if no more */
+ c1 = getc(fd);
+ if (c1 == EOF) {
+ gl_dbgE("Premature EOF in JPEG file!");
+ return -1;
+ }
+
+ /* Return next input byte, or EOF if no more */
+ c2 = getc(fd);
+ if (c2 == EOF) {
+ gl_dbgE("Premature EOF in JPEG file!");
+ return -1;
+ }
+
+ if (len)
+ *len = (((unsigned int)c1) << 8) + ((unsigned int)c2);
+
+ return 0;
+}
+
+/* Add raw exif tag and data */
+static int __gl_exif_add_header(FILE *fd, unsigned int *orientation)
+{
+ GL_CHECK_VAL(orientation, -1);
+ GL_CHECK_VAL(fd, -1);
+ int i = 0;
+ int ret = -1;
+ char *time_buf = NULL;
+ unsigned int offset = 0;
+
+ /* raw EXIF header data */
+ const unsigned char exif1[] = {
+ GL_EXIF_TAG, GL_EXIF_SOI, GL_EXIF_TAG, GL_EXIF_APP1
+ };
+ /* Write File head, check for JPEG SOI + Exif APP1 */
+ for (i = 0; i < 4; i++) {
+ if (__gl_exif_write_1_byte(fd, exif1[i]) < 0)
+ goto GL_EXIF_FAILED;
+ }
+ /* SET the marker parameter length count */
+ /* Length includes itself, so must be at least 2
+ Following Exif data length must be at least 6; 30+36 bytes*/
+ const unsigned char exif2[] = { 0x00, 0x42 };
+ for (i = 0; i < 2; i++) {
+ if (__gl_exif_write_1_byte(fd, exif2[i]) < 0)
+ goto GL_EXIF_FAILED;
+ }
+
+ /* Write Exif head -- "Exif" */
+ const unsigned char exif3[] = { 0x45, 0x78, 0x69, 0x66, 0x00, 0x00 };
+ for (i = 0; i < 6; i++) {
+ if (__gl_exif_write_1_byte(fd, exif3[i]) < 0)
+ goto GL_EXIF_FAILED;
+ }
+
+ /* Set byte order and Tag Mark , "II(0x4949)" */
+ const unsigned char exif4[] = { 0x49, 0x49, 0x2A, 0x00 };
+ for (i = 0; i < 4; i++) {
+ if (__gl_exif_write_1_byte(fd, exif4[i]) < 0)
+ goto GL_EXIF_FAILED;
+ }
+ offset += 4;
+
+ /* Set first IFD offset (offset to IFD0) , II-08000000 */
+ const unsigned char exif5[] = { 0x08, 0x00, 0x00, 0x00 };
+ for (i = 0; i < 4; i++) {
+ if (__gl_exif_write_1_byte(fd, exif5[i]) < 0)
+ goto GL_EXIF_FAILED;
+ }
+ offset += 4;
+
+ /* IFD: Image File Directory */
+ /* Set the number of directory entries contained in this IFD, - EEEE ;
+ * 2 entry: orientation, data time */
+ const unsigned char exif6[] = { 0x02, 0x00 };
+ for (i = 0; i < 2; i++) {
+ if (__gl_exif_write_1_byte(fd, exif6[i]) < 0)
+ goto GL_EXIF_FAILED;
+ }
+ offset += 2;
+
+ /* Add Orientation Tag in IFD0; 0x0112 */
+ const unsigned char exif7[] = { 0x12, 0x01 };
+ for (i = 0; i < 2; i++) {
+ if (__gl_exif_write_1_byte(fd, exif7[i]) < 0)
+ goto GL_EXIF_FAILED;
+ }
+ offset += 2;
+
+ gl_dbg("Write: %d", *orientation);
+ const unsigned char exif8[] = { 0x03, 0x00, 0x01, 0x00, 0x00, 0x00 };
+ for (i = 0; i < 6; i++) {
+ if (__gl_exif_write_1_byte(fd, exif8[i]) < 0)
+ goto GL_EXIF_FAILED;
+ }
+ offset += 6;
+
+ /* Set the Orientation value */
+ if (__gl_exif_write_1_byte(fd, (unsigned char)(*orientation)) < 0)
+ goto GL_EXIF_FAILED;
+
+ const unsigned char exif9[] = { 0x00, 0x00, 0x00 };
+ for (i = 0; i < 3; i++) {
+ if (__gl_exif_write_1_byte(fd, exif9[i]) < 0)
+ goto GL_EXIF_FAILED;
+ }
+ offset += 4;
+
+ /* Add Data Time Tag in IFD0; 0x0132 */
+ const unsigned char exif10[] = { 0x32, 0x01 };
+ for (i = 0; i < 2; i++) {
+ if (__gl_exif_write_1_byte(fd, exif10[i]) < 0)
+ goto GL_EXIF_FAILED;
+ }
+ offset += 2;
+
+ /* Type: strings */
+ const unsigned char exif11[] = { 0x02, 0x00 };
+ for (i = 0; i < 2; i++) {
+ if (__gl_exif_write_1_byte(fd, exif11[i]) < 0)
+ goto GL_EXIF_FAILED;
+ }
+ offset += 2;
+
+ /* Data lengh, byte count */
+ const unsigned char exif12[] = { 0x14, 0x00, 0x00, 0x00 };
+ for (i = 0; i < 4; i++) {
+ if (__gl_exif_write_1_byte(fd, exif12[i]) < 0)
+ goto GL_EXIF_FAILED;
+ }
+ offset += 8;
+
+ /* 20 bytes larger than 4 bytes,
+ * so next 4 bytes is data offset start from "II"(0x4949)*/
+
+ gl_dbg("offset: %2X", offset + 8);
+ /* Too add data offset, plus 4 bytes self and plus 4 bytes IFD terminator */
+ if (__gl_exif_write_1_byte(fd, (unsigned char)(offset + 4)) < 0)
+ goto GL_EXIF_FAILED;
+
+ const unsigned char exif13[] = { 0x00, 0x00, 0x00 };
+ for (i = 0; i < 3; i++) {
+ if (__gl_exif_write_1_byte(fd, exif13[i]) < 0)
+ goto GL_EXIF_FAILED;
+ }
+
+ /*After last directory entry, there is a 4bytes of data('LLLLLLLL' at the chart),
+ * it means an offset to next IFD. If its value is '0x00000000',
+ * it means this is the last IFD and there is no linked IFD */
+ const unsigned char exif14[] = { 0x00, 0x00, 0x00, 0x00 };
+ for (i = 0; i < 4; i++) {
+ if (__gl_exif_write_1_byte(fd, exif14[i]) < 0)
+ goto GL_EXIF_FAILED;
+ }
+
+ /* Date Time of image was last modified.
+ * Data format is "YYYY:MM:DD HH:MM:SS"+0x00, total 20bytes
+ */
+ time_t t;
+ struct tm tms;
+ struct tm *tm;
+
+ t = time (NULL);
+ tm = localtime_r(&t, &tms);
+
+ time_buf = (char *)calloc(1, GL_EXIF_BUF_TIME_LEN_MAX);
+ if (time_buf == NULL) {
+ gl_dbgE("Faild to allocate memory!");
+ goto GL_EXIF_FAILED;
+ }
+ snprintf(time_buf, GL_EXIF_BUF_TIME_LEN_MAX,
+ "%04i:%02i:%02i %02i:%02i:%02i",
+ tm->tm_year + GL_EXIF_DEFAULT_YEAR, tm->tm_mon + 1,
+ tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec);
+
+ gl_dbg("time_buf: %s", time_buf);
+ if (fwrite(time_buf, 1, GL_EXIF_BUF_TIME_LEN_MAX, fd) != GL_EXIF_BUF_TIME_LEN_MAX) {
+ gl_dbgW("Write size are diff!");
+ goto GL_EXIF_FAILED;
+ }
+
+ ret = 0;
+
+ GL_EXIF_FAILED:
+
+ gl_dbg("All done");
+ GL_FREEIF(time_buf);
+ return ret;
+}
+
+/* Add exif to jfif , don't have exif */
+static int __gl_exif_add_exif_to_jfif(char *file_path, unsigned int *orientation)
+{
+ GL_CHECK_VAL(orientation, -1);
+ GL_CHECK_VAL(file_path, -1);
+ unsigned char tmp[GL_EXIF_BUF_LEN_MAX] = { 0, };
+ FILE *fd = NULL;
+ int ret = -1;
+
+ if ((fd = fopen(file_path, "rb+")) == NULL) {
+ gl_dbgE("Can't open %s!", file_path);
+ return -1;
+ }
+
+ char *tmp_file = GL_EXI_TMP_JPEG_FILE;
+ FILE *tmp_fd = NULL;
+ if ((tmp_fd = fopen(tmp_file, "wb+")) == NULL) {
+ gl_dbgE("Can't open %s!", tmp_file);
+ goto GL_EXIF_FAILED;
+ }
+
+ /* Add raw EXIF header data */
+ if (__gl_exif_add_header(tmp_fd, orientation) < 0)
+ goto GL_EXIF_FAILED;
+
+ size_t r_size = 0;
+ /* Remove start of JPEG image data section, 20 bytes */
+ r_size = fread(tmp, sizeof(char), 20, fd);
+
+ memset(tmp, 0x00, GL_EXIF_BUF_LEN_MAX);
+ /* Write JPEG image data to tmp file after EXIF header */
+ while ((r_size = fread(tmp, 1, sizeof(tmp), fd)) > 0) {
+ gl_dbg("r_size: %ld", r_size);
+ if (fwrite(tmp, 1, r_size, tmp_fd) != r_size)
+ gl_dbgW("Write and read size are diff!");
+
+ memset(tmp, 0x00, GL_EXIF_BUF_LEN_MAX);
+ }
+
+ fclose(fd);
+ fd = fopen(file_path, "wb");
+ if (!fd) {
+ gl_dbgE("Error creating file %s!", file_path);
+ goto GL_EXIF_FAILED;
+ }
+
+ memset(tmp, 0x00, GL_EXIF_BUF_LEN_MAX);
+ /* Write back tmp file after to JPEG image */
+ fseek(tmp_fd, 0, SEEK_SET);
+ while ((r_size = fread(tmp, 1, sizeof(tmp), tmp_fd)) > 0) {
+ gl_dbg("r_size: %ld", r_size);
+ if (fwrite(tmp, 1, r_size, fd) != r_size)
+ gl_dbgW("Write and read size are diff!");
+
+ memset(tmp, 0x00, GL_EXIF_BUF_LEN_MAX);
+ }
+
+ ret = 0;
+
+ GL_EXIF_FAILED:
+
+ if (fd)
+ fclose(fd);
+ if (tmp_fd)
+ fclose(tmp_fd);
+
+ /* Delete tmp file */
+ if (!ecore_file_unlink(tmp_file))
+ gl_dbgE("Delete file failed");
+
+ gl_dbg("All done");
+ return ret;
+}
+
+#if 0
+/* Add exif to jfif 1.00, to add exif for some cases */
+static int __gl_exif_rw_jfif_1dot00(char *file_path, unsigned int *orientation)
+{
+ GL_CHECK_VAL(orientation, -1);
+ GL_CHECK_VAL(file_path, -1);
+ unsigned char tmp[GL_EXIF_BUF_LEN_MAX] = { 0, };
+ FILE *fd = NULL;
+ int ret = -1;
+ int tmp_exif = -1;
+
+ if ((fd = fopen(file_path, "rb+")) == NULL) {
+ gl_dbgE("Can't open %s!", file_path);
+ return -1;
+ }
+
+ char *tmp_file = GL_EXI_TMP_JPEG_FILE;
+ FILE *tmp_fd = NULL;
+ if ((tmp_fd = fopen(tmp_file, "wb+")) == NULL) {
+ gl_dbgE("Can't open %s!", tmp_file);
+ goto GL_EXIF_FAILED;
+ }
+
+ /* Add raw EXIF header data */
+ if (__gl_exif_add_header(tmp_fd, orientation) < 0)
+ goto GL_EXIF_FAILED;
+
+ size_t r_size = 0;
+ /* Remove start of JPEG image data section, 20 bytes */
+ r_size = fread(tmp, sizeof(char), 20, fd);
+
+ memset(tmp, 0x00, GL_EXIF_BUF_LEN_MAX);
+ /* Write JPEG image data from first 0xFF to tmp file after EXIF header */
+ while ((r_size = fread(tmp, 1, sizeof(tmp), fd)) > 0) {
+ gl_dbg("r_size: %ld", r_size);
+ if (fwrite(tmp, 1, r_size, tmp_fd) != r_size)
+ gl_dbgW("Write and read size are diff!");
+
+ memset(tmp, 0x00, GL_EXIF_BUF_LEN_MAX);
+ }
+
+ fclose(fd);
+ fd = fopen(file_path, "wb");
+ if (!fd) {
+ gl_dbgE("Error creating file %s!", file_path);
+ goto GL_EXIF_FAILED;
+ }
+
+ memset(tmp, 0x00, GL_EXIF_BUF_LEN_MAX);
+ /* Write back tmp file after to JPEG image */
+ fseek(tmp_fd, 0, SEEK_SET);
+ while ((r_size = fread(tmp, 1, sizeof(tmp), tmp_fd)) > 0) {
+ gl_dbg("r_size: %ld", r_size);
+ if (fwrite(tmp, 1, r_size, fd) != r_size)
+ gl_dbgW("Write and read size are diff!");
+
+ memset(tmp, 0x00, GL_EXIF_BUF_LEN_MAX);
+ }
+
+ ret = 0;
+
+ GL_EXIF_FAILED:
+
+ if (fd)
+ fclose(fd);
+ if (tmp_fd)
+ fclose(tmp_fd);
+
+ /* Delete tmp file */
+ if (!ecore_file_unlink(tmp_file))
+ gl_dbgE("Delete file failed");
+
+ gl_dbg("All done");
+ return ret;
+}
+
+/* Add exif to jfif 1.01, older version, don't have exif */
+static int __gl_exif_rw_jfif_1dot01(char *file_path, unsigned int *orientation)
+{
+ GL_CHECK_VAL(orientation, -1);
+ GL_CHECK_VAL(file_path, -1);
+ unsigned char tmp[GL_EXIF_BUF_LEN_MAX] = { 0, };
+ FILE *fd = NULL;
+ int ret = -1;
+
+ if ((fd = fopen(file_path, "rb+")) == NULL) {
+ gl_dbgE("Can't open %s!", file_path);
+ return -1;
+ }
+
+ char *tmp_file = GL_EXI_TMP_JPEG_FILE;
+ FILE *tmp_fd = NULL;
+ if ((tmp_fd = fopen(tmp_file, "wb+")) == NULL) {
+ gl_dbgE("Can't open %s!", tmp_file);
+ goto GL_EXIF_FAILED;
+ }
+
+ /* Add raw EXIF header data */
+ if (__gl_exif_add_header(tmp_fd, orientation) < 0)
+ goto GL_EXIF_FAILED;
+
+ size_t r_size = 0;
+ /* Remove start of JPEG image data section, 20 bytes */
+ r_size = fread(tmp, sizeof(char), 20, fd);
+
+ memset(tmp, 0x00, GL_EXIF_BUF_LEN_MAX);
+ /* Write JPEG image data to tmp file after EXIF header */
+ while ((r_size = fread(tmp, 1, sizeof(tmp), fd)) > 0) {
+ gl_dbg("r_size: %ld", r_size);
+ if (fwrite(tmp, 1, r_size, tmp_fd) != r_size)
+ gl_dbgW("Write and read size are diff!");
+
+ memset(tmp, 0x00, GL_EXIF_BUF_LEN_MAX);
+ }
+
+ fclose(fd);
+ fd = fopen(file_path, "wb");
+ if (!fd) {
+ gl_dbgE("Error creating file %s!", file_path);
+ goto GL_EXIF_FAILED;
+ }
+
+ memset(tmp, 0x00, GL_EXIF_BUF_LEN_MAX);
+ /* Write back tmp file after to JPEG image */
+ fseek(tmp_fd, 0, SEEK_SET);
+ while ((r_size = fread(tmp, 1, sizeof(tmp), tmp_fd)) > 0) {
+ gl_dbg("r_size: %ld", r_size);
+ if (fwrite(tmp, 1, r_size, fd) != r_size)
+ gl_dbgW("Write and read size are diff!");
+
+ memset(tmp, 0x00, GL_EXIF_BUF_LEN_MAX);
+ }
+
+ ret = 0;
+
+ GL_EXIF_FAILED:
+
+ if (fd)
+ fclose(fd);
+ if (tmp_fd)
+ fclose(tmp_fd);
+
+ /* Delete tmp file */
+ if (!ecore_file_unlink(tmp_file))
+ gl_dbgE("Delete file failed");
+
+ gl_dbg("All done");
+ return ret;
+}
+
+/* Add exif to jfif 1.02, to add exif for some cases */
+static int __gl_exif_rw_jfif_1dot02(char *file_path, unsigned int *orientation)
+{
+ GL_CHECK_VAL(orientation, -1);
+ GL_CHECK_VAL(file_path, -1);
+ unsigned char tmp[GL_EXIF_BUF_LEN_MAX] = { 0, };
+ FILE *fd = NULL;
+ int ret = -1;
+ int tmp_exif = -1;
+
+ if ((fd = fopen(file_path, "rb+")) == NULL) {
+ gl_dbgE("Can't open %s!", file_path);
+ return -1;
+ }
+
+ char *tmp_file = GL_EXI_TMP_JPEG_FILE;
+ FILE *tmp_fd = NULL;
+ if ((tmp_fd = fopen(tmp_file, "wb+")) == NULL) {
+ gl_dbgE("Can't open %s!", tmp_file);
+ goto GL_EXIF_FAILED;
+ }
+
+ /* Add raw EXIF header data */
+ if (__gl_exif_add_header(tmp_fd, orientation) < 0)
+ goto GL_EXIF_FAILED;
+
+ size_t r_size = 0;
+ /* Remove start of JPEG image data section, 20 bytes */
+ r_size = fread(tmp, sizeof(char), 20, fd);
+ memset(tmp, 0x00, GL_EXIF_BUF_LEN_MAX);
+ /* Write JPEG image data from first 0xFF to tmp file after EXIF header */
+ while ((r_size = fread(tmp, 1, sizeof(tmp), fd)) > 0) {
+ gl_dbg("r_size: %ld", r_size);
+ if (fwrite(tmp, 1, r_size, tmp_fd) != r_size)
+ gl_dbgW("Write and read size are diff!");
+
+ memset(tmp, 0x00, GL_EXIF_BUF_LEN_MAX);
+ }
+
+ fclose(fd);
+ fd = fopen(file_path, "wb");
+ if (!fd) {
+ gl_dbgE("Error creating file %s!", file_path);
+ goto GL_EXIF_FAILED;
+ }
+
+ memset(tmp, 0x00, GL_EXIF_BUF_LEN_MAX);
+ /* Write back tmp file after to JPEG image */
+ fseek(tmp_fd, 0, SEEK_SET);
+ while ((r_size = fread(tmp, 1, sizeof(tmp), tmp_fd)) > 0) {
+ gl_dbg("r_size: %ld", r_size);
+ if (fwrite(tmp, 1, r_size, fd) != r_size)
+ gl_dbgW("Write and read size are diff!");
+
+ memset(tmp, 0x00, GL_EXIF_BUF_LEN_MAX);
+ }
+
+ ret = 0;
+
+ GL_EXIF_FAILED:
+
+ if (fd)
+ fclose(fd);
+ if (tmp_fd)
+ fclose(tmp_fd);
+ /* Delete tmp file */
+ if (!ecore_file_unlink(tmp_file))
+ gl_dbgE("Delete file failed");
+
+ gl_dbg("All done");
+ return ret;
+}
+#endif
+
+/* Add orientation tag to jpegs which have exif tag but do not have orientation tag: include jfif and exif*/
+static int __gl_exif_add_orientation_tag(char *file_path,
+ unsigned int *orientation){
+
+ GL_CHECK_VAL(orientation, -1);
+ GL_CHECK_VAL(file_path, -1);
+ unsigned char tmp[GL_EXIF_BUF_LEN_MAX] = { 0, };
+ FILE *fd = NULL;
+ int ret = -1;
+ int tmp_exif = -1;
+ int i = 0;
+ unsigned int length = 0;
+ bool is_motorola = false; /* Flag for byte order */
+ unsigned int offset = 0;
+ size_t r_size = 0;
+ const unsigned char ifd_data_format[13] = {
+ /*add 0 to ifd_data_format[0] ,for easy to use*/
+ 0,
+ GL_EXIF_IFD_DATA_FORMAT_UNSIGNED_BYTE,
+ GL_EXIF_IFD_DATA_FORMAT_ASCII_STRINGS,
+ GL_EXIF_IFD_DATA_FORMAT_UNSIGNED_SHORT,
+ GL_EXIF_IFD_DATA_FORMAT_UNSIGNED_LONG,
+ GL_EXIF_IFD_DATA_FORMAT_UNSIGNED_RATIONAL,
+ GL_EXIF_IFD_DATA_FORMAT_SIGNED_BYTE,
+ GL_EXIF_IFD_DATA_FORMAT_UNDEFINED,
+ GL_EXIF_IFD_DATA_FORMAT_SIGNED_SHORT,
+ GL_EXIF_IFD_DATA_FORMAT_SIGNED_LONG,
+ GL_EXIF_IFD_DATA_FORMAT_SIGNED_RATIONAL,
+ GL_EXIF_IFD_DATA_FORMAT_SIGNED_FLOAT,
+ GL_EXIF_IFD_DATA_FORMAT_DOUBLE_FLOAT
+
+ };
+
+ if ((fd = fopen(file_path, "rb+")) == NULL) {
+ gl_dbgE("Can't open %s!", file_path);
+ return -1;
+ }
+
+ char *tmp_file = GL_EXI_TMP_JPEG_FILE;
+ FILE *tmp_fd = NULL;
+ if ((tmp_fd = fopen(tmp_file, "wb+")) == NULL) {
+ gl_dbgE("Can't open %s!", tmp_file);
+ goto GL_EXIF_FAILED;
+ }
+ /* Find APP1 */
+ bool b_tag_ff = false;
+ while(1){
+ tmp_exif = __gl_exif_read_1_byte(fd);
+ if (tmp_exif < 0)
+ goto GL_EXIF_FAILED;
+
+ /*copy data from jpeg to tmp_fd (from "FF D8" to " FF E1",because those data we needn't modify)*/
+ if (__gl_exif_write_1_byte(tmp_fd, tmp_exif) < 0)
+ goto GL_EXIF_FAILED;
+
+ tmp[0] = (unsigned char)tmp_exif;
+
+ gl_dbg("- %02X", tmp[0]);
+ if (!b_tag_ff) {
+ /* Get first tag */
+ if (tmp[0] == GL_EXIF_TAG) {
+ gl_dbgW("0xFF!");
+ b_tag_ff = true;
+ }
+ continue;
+ }
+
+ /* Get APP1 */
+ if (tmp[0] == GL_EXIF_APP1) {
+ gl_dbgW("Exif in APP1!");
+ break;
+ } else {
+ gl_dbgW("0x%02X!",tmp[0]);
+ b_tag_ff = false;
+ }
+ }
+
+ /* Get the marker parameter length count */
+ if (__gl_exif_read_2_bytes(fd, &length) < 0)
+ goto GL_EXIF_FAILED;
+ gl_dbg("length: %d", length);
+ /* Length includes itself, so must be at least 2
+ Following Exif data length must be at least 6 */
+ if (length < 8) {
+ gl_dbgE("length < 8");
+ goto GL_EXIF_FAILED;
+ }
+ /*modify the marker parameter length, orientation tag is 12*/
+ length += 12;
+ gl_dbgW("modified length: %d", length);
+ tmp[0] =( length >> 8 )& 0xff ;
+ tmp[1] = length & 0xff ;
+ for(i = 0; i < 2; i++){
+ if (__gl_exif_write_1_byte(tmp_fd, tmp[i]) < 0)
+ goto GL_EXIF_FAILED;
+ }
+
+ for (i = 0; i < 6; i++) {
+ tmp_exif = __gl_exif_read_1_byte(fd);
+ if (tmp_exif < 0)
+ goto GL_EXIF_FAILED;
+
+ tmp[i] = (unsigned char)tmp_exif;
+ gl_dbg("- %02X", tmp[i]);
+ if (__gl_exif_write_1_byte(tmp_fd, tmp[i]) < 0)
+ goto GL_EXIF_FAILED;
+ }
+ if (tmp[0] == 0x45 && tmp[1] == 0x78 && tmp[2] == 0x69 && tmp[3] == 0x66 &&
+ tmp[4] == 0x00 && tmp[5] == 0x00) {
+ gl_dbgW("Met Exif!");
+ } else {
+ gl_dbgW("Not met Exif!");
+ goto GL_EXIF_FAILED;
+ }
+ /* Read Exif body */
+ for (i = 0; i < 4; i++) {
+ tmp_exif = __gl_exif_read_1_byte(fd);
+ if (tmp_exif < 0)
+ goto GL_EXIF_FAILED;
+ tmp[i] = (unsigned char)tmp_exif;
+ if (__gl_exif_write_1_byte(tmp_fd, tmp[i]) < 0)
+ goto GL_EXIF_FAILED;
+ }
+
+ /* Check byte order and Tag Mark , "II(0x4949)" or "MM(0x4d4d)" */
+ if (tmp[0] == 0x49 && tmp[1] == 0x49 && tmp[2] == 0x2A &&
+ tmp[3] == 0x00) {
+ gl_dbg("Intel");
+ is_motorola = false;
+ } else if (tmp[0] == 0x4D && tmp[1] == 0x4D && tmp[2] == 0x00 &&
+ tmp[3] == 0x2A) {
+ gl_dbg("Motorola");
+ is_motorola = true;
+ } else {
+ goto GL_EXIF_FAILED;
+ }
+
+ for (i = 0; i < 4; i++) {
+ tmp_exif = __gl_exif_read_1_byte(fd);
+ if (tmp_exif < 0)
+ goto GL_EXIF_FAILED;
+
+ tmp[i] = (unsigned char)tmp_exif;
+ gl_dbg("- %02X", tmp[i]);
+ if (__gl_exif_write_1_byte(tmp_fd, tmp[i]) < 0)
+ goto GL_EXIF_FAILED;
+ }
+
+ /* Get first IFD offset (offset to IFD0) , MM-08000000, II-00000008 */
+ if (is_motorola) {
+ if (tmp[0] != 0 && tmp[1] != 0)
+ goto GL_EXIF_FAILED;
+ offset = tmp[2];
+ offset <<= 8;
+ offset += tmp[3];
+ } else {
+ if (tmp[3] != 0 && tmp[2] != 0)
+ goto GL_EXIF_FAILED;
+ offset = tmp[1];
+ offset <<= 8;
+ offset += tmp[0];
+ }
+ gl_dbg("offset: %d", offset);
+ /*if offset >8, copy data from there to IFD start position*/
+ if(offset > 8){
+ for (i = 0; i < (offset - 8); i++) {
+ tmp_exif = __gl_exif_read_1_byte(fd);
+ if (tmp_exif < 0)
+ goto GL_EXIF_FAILED;
+
+ tmp[i] = (unsigned char)tmp_exif;
+ gl_dbg("- %02X", tmp[i]);
+ if (__gl_exif_write_1_byte(tmp_fd, tmp[i]) < 0)
+ goto GL_EXIF_FAILED;
+ }
+ }
+
+ /* IFD: Image File Directory */
+ /* Get the number of directory entries contained in this IFD, - 2 bytes, EE */
+ unsigned int tags_cnt = 0;
+ for (i = 0; i < 2; i++) {
+ tmp_exif = __gl_exif_read_1_byte(fd);
+ if (tmp_exif < 0)
+ goto GL_EXIF_FAILED;
+
+ tmp[i] = (unsigned char)tmp_exif;
+ }
+ if (is_motorola) {
+ tags_cnt = tmp[0];
+ tags_cnt <<= 8;
+ tags_cnt += tmp[1];
+ } else {
+ tags_cnt = tmp[1];
+ tags_cnt <<= 8;
+ tags_cnt += tmp[0];
+ }
+ gl_dbg("tags_cnt: %d", tags_cnt);
+ /*modify tags num,add orientation tag */
+ tags_cnt += 1;
+ gl_dbg("modified tags_cnt: %d", tags_cnt);
+ if (is_motorola) {
+ tmp[0] = (tags_cnt >> 8) & 0xff;
+ tmp[1] = tags_cnt & 0xff;
+ } else {
+ tmp[0] = tags_cnt & 0xff;
+ tmp[1] = (tags_cnt >> 8) & 0xff;
+ }
+ for (i = 0; i < 2; i++) {
+ gl_dbg("modified- %02X", tmp[i]);
+ if (__gl_exif_write_1_byte(tmp_fd, tmp[i]) < 0)
+ goto GL_EXIF_FAILED;
+
+ }
+ /* Add Orientation Tag in IFD0 */
+ unsigned int tag_num = 0;
+ unsigned char orientation_tag[12] = { 0, };
+ bool b_found_position = false;
+ int j = 0;
+ unsigned int data_type = 0;
+ unsigned int unit_num = 0;
+ unsigned int data_length = 0;
+ unsigned int offset_value = 0;
+ /*initialize orientation_tag value*/
+ if (is_motorola) {
+ orientation_tag[0] = 0x01;
+ orientation_tag[1] = 0x12;
+
+ orientation_tag[2] = 0x00;
+ orientation_tag[3] = 0x03;
+
+ orientation_tag[4] = 0x00;
+ orientation_tag[5] = 0x00;
+ orientation_tag[6] = 0x00;
+ orientation_tag[7] = 0x01;
+
+ orientation_tag[8] = 0x00;
+ orientation_tag[9] = (unsigned char)(*orientation);
+ orientation_tag[10] = 0x00;
+ orientation_tag[11] = 0x00;
+
+ } else {
+ orientation_tag[0] = 0x12;
+ orientation_tag[1] = 0x01;
+ orientation_tag[2] = 0x03;
+ orientation_tag[3] = 0x00;
+ orientation_tag[4] = 0x01;
+ orientation_tag[5] = 0x00;
+ orientation_tag[6] = 0x00;
+ orientation_tag[7] = 0x00;
+ orientation_tag[8] = (unsigned char)(*orientation);
+ orientation_tag[9] = 0x00;
+ orientation_tag[10] = 0x00;
+ orientation_tag[11] = 0x00;
+ }
+ /*if there is no other tag, then only insert orientation_tag,don't go to the while(1)*/
+ if(tags_cnt == 1) {
+ for(j = 0; j < 12 ;j++){
+ gl_dbg("orientation_tag- %02X", orientation_tag[j]);
+ if (__gl_exif_write_1_byte(tmp_fd, orientation_tag[j]) < 0)
+ goto GL_EXIF_FAILED;
+ }
+
+ }
+ while(1){
+ if (--tags_cnt == 0) {
+ break;
+ }
+
+ /* Every directory entry size is 12 */
+ for (i = 0; i < 12; i++) {
+ tmp_exif = __gl_exif_read_1_byte(fd);
+ if (tmp_exif < 0)
+ goto GL_EXIF_FAILED;
+
+ tmp[i] = (unsigned char)tmp_exif;
+ }
+ /* Get Tag number */
+ if (is_motorola) {
+ tag_num = tmp[0];
+ tag_num <<= 8;
+ tag_num += tmp[1];
+ } else {
+ tag_num = tmp[1];
+ tag_num <<= 8;
+ tag_num += tmp[0];
+ }
+ gl_dbgW("tag num %02X!" , tag_num);
+ /* to find Orientation Tag position */
+ if (tag_num < 0x0112) {
+
+ } else if (tag_num > 0x0112){
+ if(!b_found_position){
+ for(j = 0; j < 12 ;j++){
+ gl_dbg("orientation_tag- %02X", orientation_tag[j]);
+ if (__gl_exif_write_1_byte(tmp_fd, orientation_tag[j]) < 0)
+ goto GL_EXIF_FAILED;
+ }
+ b_found_position = true;
+ }
+ if (is_motorola) {
+ data_type = tmp[2];
+ data_type <<= 8;
+ data_type += tmp[3];
+
+ unit_num = tmp[4];
+ unit_num <<= 8;
+ unit_num += tmp[5];
+ unit_num <<= 8;
+ unit_num += tmp[6];
+ unit_num <<= 8;
+ unit_num += tmp[7];
+ } else {
+ data_type = tmp[3];
+ data_type <<= 8;
+ data_type += tmp[2];
+
+ unit_num = tmp[7];
+ unit_num <<= 8;
+ unit_num += tmp[6];
+ unit_num <<= 8;
+ unit_num += tmp[5];
+ unit_num <<= 8;
+ unit_num += tmp[4];
+ }
+ gl_dbgW("data_type %02X!" , data_type);
+ gl_dbgW("unit_num %02X!" , unit_num);
+ if((data_type < 1) ||(data_type > 12)){
+ gl_dbgE("Wrong data type!");
+ goto GL_EXIF_FAILED;
+ }
+
+ data_length = ifd_data_format[data_type] * unit_num;
+ gl_dbgW("data_length %02X!" , data_length);
+ /*data_length >4 ,next 4 bytes store the offset, so need to modify the offset*/
+ if(data_length > 4){
+ if (is_motorola) {
+ offset_value = tmp[8];
+ offset_value <<= 8;
+ offset_value += tmp[9];
+ offset_value <<= 8;
+ offset_value += tmp[10];
+ offset_value <<= 8;
+ offset_value += tmp[11];
+ gl_dbgW("offset_value %02X!" , offset_value);
+ /*add orientation offset*/
+ offset_value += 12;
+ gl_dbgW("changed offset_value %02X!" , offset_value);
+ tmp[8] = (offset_value >> 24) & 0xff;
+ tmp[9] = (offset_value >> 16) & 0xff;
+ tmp[10] = (offset_value >> 8) & 0xff;
+ tmp[11] = offset_value & 0xff;
+ gl_dbg("tmp[8] %02X!" , tmp[8]);
+ gl_dbg("tmp[9] %02X!" , tmp[9]);
+ gl_dbg("tmp[10] %02X!" , tmp[10]);
+ gl_dbg("tmp[11] %02X!" , tmp[11]);
+ } else {
+ offset_value = tmp[11];
+ offset_value <<= 8;
+ offset_value += tmp[10];
+ offset_value <<= 8;
+ offset_value += tmp[9];
+ offset_value <<= 8;
+ offset_value += tmp[8];
+ gl_dbgW("offset_value %02X!" , offset_value);
+ /*add orientation offset*/
+ offset_value += 12;
+ gl_dbgW("changed offset_value %02X!" , offset_value);
+
+ tmp[11] = (offset_value >> 24) & 0xff;
+ tmp[10] = (offset_value >> 16) & 0xff;
+ tmp[9] = (offset_value >> 8) & 0xff;
+ tmp[8] = offset_value & 0xff;
+ gl_dbg("tmp[8] %02X!" , tmp[8]);
+ gl_dbg("tmp[9] %02X!" , tmp[9]);
+ gl_dbg("tmp[10] %02X!" , tmp[10]);
+ gl_dbg("tmp[11] %02X!" , tmp[11]);
+
+ }
+
+ }
+
+ }
+ for(i = 0; i < 12 ;i++){
+ gl_dbg("- %02X", tmp[i]);
+ if (__gl_exif_write_1_byte(tmp_fd,tmp[i]) < 0)
+ goto GL_EXIF_FAILED;
+
+ }
+ memset(tmp, 0x00, 12);
+
+ }
+ memset(tmp, 0x00, GL_EXIF_BUF_LEN_MAX);
+ /* Write JPEG image data to tmp file after EXIF header */
+ while ((r_size = fread(tmp, 1, sizeof(tmp), fd)) > 0) {
+ gl_dbg("r_size: %ld", r_size);
+ if (fwrite(tmp, 1, r_size, tmp_fd) != r_size)
+ gl_dbgW("Write and read size are diff!");
+
+ memset(tmp, 0x00, GL_EXIF_BUF_LEN_MAX);
+ }
+ fclose(fd);
+ fd = NULL;
+ fd = fopen(file_path, "wb");
+ if (!fd) {
+ gl_dbgE("Error creating file %s!", file_path);
+ goto GL_EXIF_FAILED;
+ }
+
+ memset(tmp, 0x00, GL_EXIF_BUF_LEN_MAX);
+ /* Write back tmp file after to JPEG image */
+ fseek(tmp_fd, 0, SEEK_SET);
+ while ((r_size = fread(tmp, 1, sizeof(tmp), tmp_fd)) > 0) {
+ gl_dbg("r_size: %ld", r_size);
+ if (fwrite(tmp, 1, r_size, fd) != r_size)
+ gl_dbgW("Write and read size are diff!");
+ memset(tmp, 0x00, GL_EXIF_BUF_LEN_MAX);
+ }
+
+ ret = 0;
+
+ GL_EXIF_FAILED:
+
+ if (fd){
+ fclose(fd);
+ fd = NULL;
+ }
+
+ if (tmp_fd){
+ fclose(tmp_fd);
+ tmp_fd = NULL;
+ }
+
+ /* Delete tmp file */
+ if (!ecore_file_unlink(tmp_file))
+ gl_dbgE("Delete file failed");
+
+ gl_dbg("All done");
+ return ret;
+}
+
+static int __gl_exif_rw_jfif(FILE *fd, char *file_path,
+ unsigned int *orientation, bool b_write)
+{
+ GL_CHECK_VAL(fd, -1);
+ GL_CHECK_VAL(file_path, -1);
+ GL_CHECK_VAL(orientation, -1);
+ unsigned char tmp[GL_EXIF_BUF_LEN_MAX] = { 0, };
+ int i = 0;
+ unsigned int length = 0;
+ int tmp_exif = -1;
+ bool is_motorola = false; /* Flag for byte order */
+ unsigned int offset = 0;
+ int ret = -1;
+ /*unsigned char version = 0x00; */
+
+ if (__gl_exif_read_2_bytes(fd, &length) < 0)
+ goto GL_EXIF_FAILED;
+ gl_dbg("length: %d", length);
+
+ for (i = 0; i < 5; i++) {
+ tmp_exif = __gl_exif_read_1_byte(fd);
+ if (tmp_exif < 0)
+ goto GL_EXIF_FAILED;
+ tmp[i] = (unsigned char)tmp_exif;
+ }
+
+ /* JFIF0 */
+ if (tmp[0] != 0x4A || tmp[1] != 0x46 || tmp[2] != 0x49 ||
+ tmp[3] != 0x46 || tmp[4] != 0x00) {
+ gl_dbgE("Not met Jfif!");
+ goto GL_EXIF_FAILED;
+ }
+
+ for (i = 0; i < 2; i++) {
+ tmp_exif = __gl_exif_read_1_byte(fd);
+ if (tmp_exif < 0)
+ goto GL_EXIF_FAILED;
+ tmp[i] = (unsigned char)tmp_exif;
+ }
+
+ /* Check JFIF version */
+ if (tmp[0] == 0x01 && tmp[1] == GL_EXIF_JFIF_00) {
+ gl_dbg("Jfif 1.00");
+ } else if (tmp[0] == 0x01 && tmp[1] == GL_EXIF_JFIF_01) {
+ gl_dbg("Jfif 1.01");
+ } else if (tmp[0] == 0x01 && tmp[1] == GL_EXIF_JFIF_02) {
+ gl_dbg("Jfif 1.02");
+ } else {
+ gl_dbgE("Unknow Jfif version[%d.%d]!", tmp[0], tmp[1]);
+ goto GL_EXIF_FAILED;
+ }
+
+ /* Save version */
+ /*version = tmp[1]; */
+
+ /* Find APP1 */
+ bool b_tag_ff = false;
+ while(1) {
+ tmp_exif = __gl_exif_read_1_byte(fd);
+ if (tmp_exif < 0)
+ goto GL_EXIF_FAILED;
+
+ tmp[0] = (unsigned char)tmp_exif;
+
+ gl_dbg("- %02X", tmp[0]);
+ if (!b_tag_ff) {
+ /* Get first tag */
+ if (tmp[0] == GL_EXIF_TAG) {
+ gl_dbgW("0xFF!");
+ b_tag_ff = true;
+ }
+ continue;
+ }
+
+ /* Get APP1 */
+ if (tmp[0] == GL_EXIF_APP1) {
+ gl_dbgW("Exif in APP1!");
+ break;
+ }
+
+ gl_dbgW("No Exif in APP1!");
+
+ /* Close file */
+ fclose(fd);
+ if (!b_write) {
+ /* Normal orientation = 0degree = 1 */
+ *orientation = 1;
+ return -1;
+ }
+ return __gl_exif_add_exif_to_jfif(file_path, orientation);
+#if 0
+ if (version == GL_EXIF_JFIF_00) {
+ return __gl_exif_rw_jfif_1dot00(file_path, orientation);
+ } else if (version == GL_EXIF_JFIF_01) {
+ return __gl_exif_rw_jfif_1dot01(file_path, orientation);
+ } else {
+ return __gl_exif_rw_jfif_1dot02(file_path, orientation);
+ }
+#endif
+ }
+
+ /* Find Exif */
+ while(1) {
+ for (i = 0; i < 6; i++) {
+ tmp_exif = __gl_exif_read_1_byte(fd);
+ if (tmp_exif < 0) {
+ gl_dbgW("Not met Exif!");
+ goto GL_EXIF_FAILED;
+ }
+
+ tmp[i] = (unsigned char)tmp_exif;
+ gl_dbg("- %02X", tmp[i]);
+ }
+ if (tmp[0] == 0x45 && tmp[1] == 0x78 && tmp[2] == 0x69 && tmp[3] == 0x66 &&
+ tmp[4] == 0x00 && tmp[5] == 0x00) {
+ gl_dbgW("Met Exif!");
+ break;
+ } else {
+ gl_dbg("Not met Exif!");
+ fseek(fd, -5, SEEK_CUR);
+ continue;
+ }
+ }
+
+ /* Read Exif body */
+ for (i = 0; i < 4; i++) {
+ tmp_exif = __gl_exif_read_1_byte(fd);
+ if (tmp_exif < 0)
+ goto GL_EXIF_FAILED;
+ tmp[i] = (unsigned char)tmp_exif;
+ }
+
+ /* Check byte order and Tag Mark , "II(0x4949)" or "MM(0x4d4d)" */
+ if (tmp[0] == 0x49 && tmp[1] == 0x49 && tmp[2] == 0x2A &&
+ tmp[3] == 0x00) {
+ gl_dbg("Intel");
+ is_motorola = false;
+ } else if (tmp[0] == 0x4D && tmp[1] == 0x4D && tmp[2] == 0x00 &&
+ tmp[3] == 0x2A) {
+ gl_dbg("Motorola");
+ is_motorola = true;
+ } else {
+ goto GL_EXIF_FAILED;
+ }
+
+ for (i = 0; i < 4; i++) {
+ tmp_exif = __gl_exif_read_1_byte(fd);
+ if (tmp_exif < 0)
+ goto GL_EXIF_FAILED;
+
+ tmp[i] = (unsigned char)tmp_exif;
+ gl_dbg("- %02X", tmp[i]);
+ }
+
+ /* Get first IFD offset (offset to IFD0) , MM-08000000, II-00000008 */
+ if (is_motorola) {
+ if (tmp[0] != 0 && tmp[1] != 0)
+ goto GL_EXIF_FAILED;
+ offset = tmp[2];
+ offset <<= 8;
+ offset += tmp[3];
+ } else {
+ if (tmp[3] != 0 && tmp[2] != 0)
+ goto GL_EXIF_FAILED;
+ offset = tmp[1];
+ offset <<= 8;
+ offset += tmp[0];
+ }
+ gl_dbg("offset: %d", offset);
+
+ /* IFD: Image File Directory */
+ /* Get the number of directory entries contained in this IFD, - 2 bytes, EE */
+ unsigned int tags_cnt = 0;
+ for (i = 0; i < 2; i++) {
+ tmp_exif = __gl_exif_read_1_byte(fd);
+ if (tmp_exif < 0)
+ goto GL_EXIF_FAILED;
+
+ tmp[i] = (unsigned char)tmp_exif;
+ }
+ if (is_motorola) {
+ tags_cnt = tmp[0];
+ tags_cnt <<= 8;
+ tags_cnt += tmp[1];
+ } else {
+ tags_cnt = tmp[1];
+ tags_cnt <<= 8;
+ tags_cnt += tmp[0];
+ }
+ gl_dbg("tags_cnt: %d", tags_cnt);
+ if (tags_cnt == 0) {
+ gl_dbgE("tags_cnt == 0,no found orientation tag!");
+ if (b_write) {
+ gl_dbgW("to add an orientation tag!");
+ fclose(fd);
+ fd = NULL;
+ return __gl_exif_add_orientation_tag(file_path, orientation);
+
+ } else{
+ /* Normal orientation = 0degree = 1 */
+ *orientation = 1;
+ ret = -1;
+ }
+ goto GL_EXIF_FAILED;
+ }
+
+ /* Search for Orientation Tag in IFD0 */
+ unsigned int tag_num = 0;
+ while (1) {
+ /* Every directory entry size is 12 */
+ for (i = 0; i < 12; i++) {
+ tmp_exif = __gl_exif_read_1_byte(fd);
+ if (tmp_exif < 0)
+ goto GL_EXIF_FAILED;
+
+ tmp[i] = (unsigned char)tmp_exif;
+ }
+ /* Get Tag number */
+ if (is_motorola) {
+ tag_num = tmp[0];
+ tag_num <<= 8;
+ tag_num += tmp[1];
+ } else {
+ tag_num = tmp[1];
+ tag_num <<= 8;
+ tag_num += tmp[0];
+ }
+ /* found Orientation Tag */
+ if (tag_num == 0x0112) {
+ gl_dbgW("Found orientation tag!");
+ break;
+ }
+ if (--tags_cnt == 0) {
+ gl_dbgW("tags_cnt == 0, no found orientation tag!");
+ if (b_write) {
+ gl_dbgW("to add an orientation tag!");
+ fclose(fd);
+ fd = NULL;
+ return __gl_exif_add_orientation_tag(file_path, orientation);
+
+ } else{
+ /* Normal orientation = 0degree = 1 */
+ *orientation = 1;
+ ret = -1;
+ }
+ goto GL_EXIF_FAILED;
+ }
+ }
+
+ /* |TT|ff|NNNN|DDDD| --- TT - 2 bytes, tag NO. ;ff - 2 bytes, data format
+ NNNN - 4 bytes, entry count; DDDD - 4 bytes Data value */
+ if (b_write) {
+ gl_dbg("Write: %d", *orientation);
+ /* Set the Orientation value */
+ if (is_motorola)
+ tmp[9] = (unsigned char)(*orientation);
+ else
+ tmp[8] = (unsigned char)(*orientation);
+
+ /* Move pointer back to the entry start point */
+ if (fseek(fd, -12, SEEK_CUR) < 0) {
+ gl_dbgE("fseek failed!");
+ goto GL_EXIF_FAILED;
+ }
+ fwrite(tmp, 1, 10, fd);
+ } else {
+ /* Get the Orientation value */
+ if (is_motorola) {
+ if (tmp[8] != 0) {
+ gl_dbgE("tmp[8] != 0");
+ goto GL_EXIF_FAILED;
+ }
+ *orientation = (unsigned int)tmp[9];
+ } else {
+ if (tmp[9] != 0) {
+ gl_dbgE("tmp[9] != 0");
+ goto GL_EXIF_FAILED;
+ }
+ *orientation = (unsigned int)tmp[8];
+ }
+ if (*orientation > 8) {
+ gl_dbgE("*orient > 8");
+ goto GL_EXIF_FAILED;
+ }
+ gl_dbg("Read: %d", *orientation);
+ }
+
+ ret = 0;
+
+ GL_EXIF_FAILED:
+
+ fclose(fd);
+ gl_dbg("All done");
+ return ret;
+}
+bool _gl_exif_check_img_type(char *file_path)
+{
+ GL_CHECK_VAL(file_path, -1);
+ int tmp_exif = -1;
+ unsigned int i = 0;
+ unsigned char exif_data[4] = { 0, };
+ FILE *fd = NULL;
+ bool ret = false;
+
+ if ((fd = fopen(file_path, "rb")) == NULL) {
+ gl_dbgE("Can't open %s!", file_path);
+ return -1;
+ }
+
+ /* Read File head, check for JPEG SOI + Exif APP1 */
+ for (i = 0; i < 4; i++) {
+ tmp_exif = __gl_exif_read_1_byte(fd);
+ if (tmp_exif < 0)
+ goto GL_EXIF_FAILED;
+
+ exif_data[i] = (unsigned char)tmp_exif;
+ }
+
+ if (exif_data[0] == GL_EXIF_TAG && exif_data[1] == GL_EXIF_SOI) {
+ gl_dbg("JPEG file");
+ } else {
+ gl_dbgE("Not a JPEG file!");
+ goto GL_EXIF_FAILED;
+ }
+
+ if (exif_data[2] == GL_EXIF_TAG && exif_data[3] == GL_EXIF_APP1) {
+ gl_dbgW("Exif in APP1!");
+ ret = true;
+ } else if (exif_data[2] == GL_EXIF_TAG &&
+ exif_data[3] == GL_EXIF_APP0) {
+ gl_dbgW("Jfif in APP0!");
+ ret = true;
+ } else {
+ gl_dbgE("Not a Exif in APP1 or Jiff in APP2[%d]!", exif_data[3]);
+ ret = false;
+ }
+ GL_EXIF_FAILED:
+
+ fclose(fd);
+ gl_dbg("");
+ return ret;
+}
+
+static int __gl_exif_rw_orient(char *file_path, unsigned int *orient, bool b_write)
+{
+ GL_CHECK_VAL(file_path, -1);
+ gl_dbg("b_write: %d", b_write);
+ unsigned int length = 0;
+ unsigned int i = 0;
+ bool is_motorola = false; /* Flag for byte order */
+ unsigned int offset = 0;
+ unsigned int jfif_offset = 0;
+ unsigned int tags_cnt = 0;
+ unsigned int tag_num = 0;
+ int tmp_exif = -1;
+ unsigned char exif_data[GL_EXIF_BUF_LEN_MAX] = { 0, };
+ FILE *fd = NULL;
+ int ret = -1;
+
+ if (b_write) {
+ if ((fd = fopen(file_path, "rb+")) == NULL) {
+ gl_dbgE("Can't open %s!", file_path);
+ return -1;
+ }
+ } else {
+ if ((fd = fopen(file_path, "rb")) == NULL) {
+ gl_dbgE("Can't open %s!", file_path);
+ return -1;
+ }
+ }
+
+ /* Read File head, check for JPEG SOI + Exif APP1 */
+ for (i = 0; i < 4; i++) {
+ tmp_exif = __gl_exif_read_1_byte(fd);
+ if (tmp_exif < 0)
+ goto GL_EXIF_FAILED;
+
+ exif_data[i] = (unsigned char)tmp_exif;
+ }
+
+ if (exif_data[0] == GL_EXIF_TAG && exif_data[1] == GL_EXIF_SOI) {
+ gl_dbg("JPEG file");
+ } else {
+ gl_dbgE("Not a JPEG file!");
+ goto GL_EXIF_FAILED;
+ }
+
+ if (exif_data[2] == GL_EXIF_TAG && exif_data[3] == GL_EXIF_APP1) {
+ gl_dbgW("Exif in APP1!");
+ } else if (exif_data[2] == GL_EXIF_TAG &&
+ exif_data[3] == GL_EXIF_APP0) {
+ gl_dbgW("Jfif in APP0!");
+ int ret = __gl_exif_rw_jfif(fd, file_path, orient, b_write);
+ return ret;
+ } else {
+ gl_dbgE("Not a Exif in APP1 or Jiff in APP2[%d]!", exif_data[3]);
+ goto GL_EXIF_FAILED;
+ }
+
+ /* Get the marker parameter length count */
+ if (__gl_exif_read_2_bytes(fd, &length) < 0)
+ goto GL_EXIF_FAILED;
+ gl_dbg("length: %d", length);
+ /* Length includes itself, so must be at least 2
+ Following Exif data length must be at least 6 */
+ if (length < 8) {
+ gl_dbgE("length < 8");
+ goto GL_EXIF_FAILED;
+ }
+ length -= 8;
+
+ /* Length of an IFD entry */
+ if (length < 12) {
+ gl_dbgE("length < 12");
+ goto GL_EXIF_FAILED;
+ }
+
+ /* Read Exif head, check for "Exif" */
+ for (i = 0; i < 6; i++) {
+ tmp_exif = __gl_exif_read_1_byte(fd);
+ if (tmp_exif < 0)
+ goto GL_EXIF_FAILED;
+
+ exif_data[i] = (unsigned char)tmp_exif;
+ gl_dbg("- %02X", exif_data[i]);
+ }
+
+ if (exif_data[0] != 0x45 || exif_data[1] != 0x78 ||
+ exif_data[2] != 0x69 || exif_data[3] != 0x66 ||
+ exif_data[4] != 0x00 || exif_data[5] != 0x00) {
+ gl_dbgE("Not met Exif!");
+ goto GL_EXIF_FAILED;
+ }
+
+ /* Read Exif body */
+ for (i = 0; i < length; i++) {
+ tmp_exif = __gl_exif_read_1_byte(fd);
+ if (tmp_exif < 0)
+ goto GL_EXIF_FAILED;
+ exif_data[i] = (unsigned char)tmp_exif;
+ }
+
+ /* Check byte order and Tag Mark , "II(0x4949)" or "MM(0x4d4d)" */
+ if (exif_data[0] == 0x49 && exif_data[1] == 0x49 &&
+ exif_data[2] == 0x2A && exif_data[3] == 0x00) {
+ gl_dbg("Intel");
+ is_motorola = false;
+ } else if (exif_data[0] == 0x4D && exif_data[1] == 0x4D &&
+ exif_data[2] == 0x00 && exif_data[3] == 0x2A) {
+ gl_dbg("Motorola");
+ is_motorola = true;
+ } else {
+ goto GL_EXIF_FAILED;
+ }
+
+ /* Get first IFD offset (offset to IFD0) , MM-00000008, II-08000000 */
+ if (is_motorola) {
+ if (exif_data[4] != 0 && exif_data[5] != 0)
+ goto GL_EXIF_FAILED;
+ offset = exif_data[6];
+ offset <<= 8;
+ offset += exif_data[7];
+ } else {
+ if (exif_data[7] != 0 && exif_data[6] != 0)
+ goto GL_EXIF_FAILED;
+ offset = exif_data[5];
+ offset <<= 8;
+ offset += exif_data[4];
+ }
+ /* check end of data segment */
+ if (offset > length - 2) {
+ gl_dbgE("offset > length - 2");
+ goto GL_EXIF_FAILED;
+ }
+
+ /* IFD: Image File Directory */
+ /* Get the number of directory entries contained in this IFD, - EEEE */
+ if (is_motorola) {
+ tags_cnt = exif_data[offset];
+ tags_cnt <<= 8;
+ tags_cnt += exif_data[offset+1];
+ } else {
+ tags_cnt = exif_data[offset+1];
+ tags_cnt <<= 8;
+ tags_cnt += exif_data[offset];
+ }
+ if (tags_cnt == 0) {
+ gl_dbgE("tags_cnt == 0 - 2");
+ goto GL_EXIF_FAILED;
+ }
+ offset += 2;
+
+ /* check end of data segment */
+ if (offset > length - 12) {
+ gl_dbgE("offset > length - 12");
+ goto GL_EXIF_FAILED;
+ }
+
+ /* Search for Orientation Tag in IFD0 */
+ while (1) {
+ /* Get Tag number */
+ if (is_motorola) {
+ tag_num = exif_data[offset];
+ tag_num <<= 8;
+ tag_num += exif_data[offset+1];
+ } else {
+ tag_num = exif_data[offset+1];
+ tag_num <<= 8;
+ tag_num += exif_data[offset];
+ }
+ /* found Orientation Tag */
+ if (tag_num == 0x0112) {
+ gl_dbgW("Found orientation tag!");
+ break;
+ }
+ if (--tags_cnt == 0) {
+ gl_dbgW("tags_cnt == 0, no found orientation tag!");
+ if (b_write) {
+ gl_dbgW("to add an orientation tag!");
+ fclose(fd);
+ fd = NULL;
+ return __gl_exif_add_orientation_tag(file_path, orient);
+
+ } else{
+ /* Normal orientation = 0degree = 1 */
+ *orient = 1;
+ ret = -1;
+ }
+ goto GL_EXIF_FAILED;
+ }
+
+ /* Every directory entry size is 12 */
+ offset += 12;
+ }
+
+ if (b_write) {
+ gl_dbg("Write: %d", *orient);
+ /* Set the Orientation value */
+ if (is_motorola)
+ exif_data[offset+9] = (unsigned char)(*orient);
+ else
+ exif_data[offset+8] = (unsigned char)(*orient);
+
+ if (fseek(fd, jfif_offset + (4 + 2 + 6 + 2) + offset, SEEK_SET) < 0) {
+ gl_dbgE("fseek failed!");
+ goto GL_EXIF_FAILED;
+ }
+ fwrite(exif_data + 2 + offset, 1, 10, fd);
+ } else {
+ /* Get the Orientation value */
+ if (is_motorola) {
+ if (exif_data[offset+8] != 0) {
+ gl_dbgE("exif_data[offset+8] != 0");
+ goto GL_EXIF_FAILED;
+ }
+ *orient = (unsigned int)exif_data[offset+9];
+ } else {
+ if (exif_data[offset+9] != 0) {
+ gl_dbgE("exif_data[offset+9] != 0");
+ goto GL_EXIF_FAILED;
+ }
+ *orient = (unsigned int)exif_data[offset+8];
+ }
+ if (*orient > 8) {
+ gl_dbgE("*orient > 8");
+ goto GL_EXIF_FAILED;
+ }
+ gl_dbg("Read: %d", *orient);
+ }
+
+ ret = 0;
+
+ GL_EXIF_FAILED:
+
+ fclose(fd);
+ gl_dbg("All done");
+ return ret;
+}
+
+int _gl_exif_get_orientation(char *file_path, unsigned int *orientation)
+{
+ GL_CHECK_VAL(orientation, -1);
+ GL_CHECK_VAL(file_path, -1);
+ gl_dbg("file_path: %s", file_path);
+
+ return __gl_exif_rw_orient(file_path, orientation, false);
+}
+
+int _gl_exif_set_orientation(char *file_path, unsigned int orientation)
+{
+ GL_CHECK_VAL(file_path, -1);
+ gl_dbg("file_path: %s", file_path);
+
+ return __gl_exif_rw_orient(file_path, &orientation, true);
+}
+
+int _gl_exif_get_rotated_orientation(unsigned int orientation, bool b_left)
+{
+ int rotated_orientataion;
+ gl_dbg("b_left: %d", b_left);
+
+ switch (orientation){
+ case GL_ORIENTATION_ROT_0:
+ /* true: 0 -> 270, false: 0 -> 90 */
+ if (b_left)
+ rotated_orientataion = GL_ORIENTATION_ROT_270;
+ else
+ rotated_orientataion = GL_ORIENTATION_ROT_90;
+ break;
+ case GL_ORIENTATION_ROT_90:
+ /* true: 90 -> 0, false: 90 -> 180 */
+ if (b_left)
+ rotated_orientataion = GL_ORIENTATION_ROT_0;
+ else
+ rotated_orientataion = GL_ORIENTATION_ROT_180;
+ break;
+ case GL_ORIENTATION_ROT_180:
+ /* true: 180 -> 90, false: 180 -> 270 */
+ if (b_left)
+ rotated_orientataion = GL_ORIENTATION_ROT_90;
+ else
+ rotated_orientataion = GL_ORIENTATION_ROT_270;
+ break;
+ case GL_ORIENTATION_ROT_270:
+ /* true: 270 -> 180, false: 270 -> 0 */
+ if (b_left)
+ rotated_orientataion = GL_ORIENTATION_ROT_180;
+ else
+ rotated_orientataion = GL_ORIENTATION_ROT_0;
+ break;
+ default:
+ gl_dbgE("Wrong oriectation: %d!", orientation);
+ /* true: 0 -> 270, false: 0 -> 90 */
+ if (b_left)
+ rotated_orientataion = GL_ORIENTATION_ROT_270;
+ else
+ rotated_orientataion = GL_ORIENTATION_ROT_90;
+ break;
+ }
+
+ gl_dbg("New orientation: %d", rotated_orientataion);
+ return rotated_orientataion;
+}
+
+#endif
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <Elementary.h>
+#include <app_manager.h>
+#include <vconf.h>
+#include <vconf-keys.h>
+#include "gl-drm.h"
+#include "gl-ext-exec.h"
+#include "gl-debug.h"
+#include "gallery.h"
+#include "gl-data.h"
+#include "gl-util.h"
+#include "gl-popup.h"
+#include "gl-controlbar.h"
+#include "gl-strings.h"
+
+#define GL_APP_PKG_VIDEOPLAYER "org.tizen.video-player"
+#define GL_APP_PKG_CAMERA "org.tizen.camera-app"
+
+#define GL_ARGV_VIDEO_LIST_TYPE "video_list_type"
+#define GL_ARGV_VIDEO_ALL_FOLDER_VIDEO "all_folder_video"
+#define GL_ARGV_VIDEO_FOLDER "folder"
+#define GL_ARGV_VIDEO_LIST_FAVORITE "favorite"
+#define GL_ARGV_VIDEO_TAG_VIDEO "tag_video"
+#define GL_ARGV_VIDEO_TAG_NAME "tag_name"
+
+#define GL_ARGV_VIDEO_ORDER_TYPE "order_type"
+#define GL_ARGV_VIDEO_ORDER_DATE_DESC "date_desc"
+#define GL_ARGV_VIDEO_START_POS "start_pos_time"
+
+#define GL_ARGV_VIDEO_LAUNCH_APP "launching_application"
+#define GL_ARGV_VIDEO_LAUNCH_GALLERY "gallery"
+
+#define GL_ARGV_PATH "path"
+
+//refer to imageviewer
+static int __gl_ext_launch_video_player(void *data, service_h service)
+{
+ GL_CHECK_VAL(service, -1);
+ GL_CHECK_VAL(data, -1);
+ gl_item *gitem = (gl_item *)data;
+ GL_CHECK_VAL(gitem->ad, -1);
+ gl_appdata *ad = (gl_appdata *)gitem->ad;
+ GL_CHECK_VAL(gitem->item, -1);
+ GL_CHECK_VAL(gitem->item->uuid, -1);
+ GL_CHECK_VAL(gitem->item->file_url, -1);
+
+ int last_pos = 0;
+ char last_pos_str[GL_INTERGER_LEN_MAX] = { 0, };
+
+ GL_CHECK_VAL(gitem->item->video_info, -1);
+ last_pos = gitem->item->video_info->last_played_pos;
+ eina_convert_itoa(last_pos, last_pos_str);
+ gl_dbg("last_pos : %d", last_pos);
+
+ const char *video_path = gitem->item->file_url;
+
+ bool file_is_drm = gl_drm_is_drm_file(video_path);
+
+ if (ad->ctrlinfo.tab_mode == GL_CTRL_TAB_TAGS) {
+ /* Tag view */
+ gl_dbg("Tags view");
+ gl_tag *current_tag = ad->taginfo.current_tag;
+ if (current_tag && current_tag->tag && current_tag->tag->tag_name) {
+ gl_dbg("Current tag: %s", current_tag->tag->tag_name);
+ if (current_tag->tag->_id == GL_TAG_FAVORITES_ID) {
+ gl_dbg("Favourite tag");
+ service_add_extra_data(service,
+ GL_ARGV_VIDEO_LIST_TYPE,
+ GL_ARGV_VIDEO_LIST_FAVORITE);
+ service_add_extra_data(service,
+ GL_ARGV_VIDEO_ORDER_TYPE,
+ GL_ARGV_VIDEO_ORDER_DATE_DESC);
+ service_add_extra_data(service,
+ GL_ARGV_VIDEO_LAUNCH_APP,
+ GL_ARGV_VIDEO_LAUNCH_GALLERY);
+ service_add_extra_data(service,
+ GL_ARGV_VIDEO_START_POS,
+ last_pos_str);
+ } else {
+ gl_dbg("Normal tag");
+ service_add_extra_data(service,
+ GL_ARGV_VIDEO_LIST_TYPE,
+ GL_ARGV_VIDEO_TAG_VIDEO);
+ service_add_extra_data(service,
+ GL_ARGV_VIDEO_TAG_NAME,
+ current_tag->tag->tag_name);
+ service_add_extra_data(service,
+ GL_ARGV_VIDEO_ORDER_TYPE,
+ GL_ARGV_VIDEO_ORDER_DATE_DESC);
+ service_add_extra_data(service,
+ GL_ARGV_VIDEO_LAUNCH_APP,
+ GL_ARGV_VIDEO_LAUNCH_GALLERY);
+ service_add_extra_data(service,
+ GL_ARGV_VIDEO_START_POS,
+ last_pos_str);
+ }
+ } else {
+ /* Fixme: return or not? */
+ gl_dbgE("Invalid current tag, return?");
+ }
+ } else {
+ /* Albums view */
+ gl_cluster *cur_cluster = ad->albuminfo.current_album;
+ if (cur_cluster && cur_cluster->cluster) {
+ gl_dbg("Album: %s", cur_cluster->cluster->display_name);
+ if (cur_cluster->cluster->type == GL_STORE_T_ALL) {
+ gl_dbg("All album");
+ service_add_extra_data(service,
+ GL_ARGV_VIDEO_LIST_TYPE,
+ GL_ARGV_VIDEO_ALL_FOLDER_VIDEO);
+ service_add_extra_data(service,
+ GL_ARGV_VIDEO_ORDER_TYPE,
+ GL_ARGV_VIDEO_ORDER_DATE_DESC);
+ service_add_extra_data(service,
+ GL_ARGV_VIDEO_LAUNCH_APP,
+ GL_ARGV_VIDEO_LAUNCH_GALLERY);
+ service_add_extra_data(service,
+ GL_ARGV_VIDEO_START_POS,
+ last_pos_str);
+ } else if (cur_cluster->cluster->type == GL_STORE_T_PHONE ||
+ cur_cluster->cluster->type == GL_STORE_T_MMC) {
+ gl_dbg("Real album");
+ service_add_extra_data(service,
+ GL_ARGV_VIDEO_LIST_TYPE,
+ GL_ARGV_VIDEO_FOLDER);
+ service_add_extra_data(service,
+ GL_ARGV_VIDEO_ORDER_TYPE,
+ GL_ARGV_VIDEO_ORDER_DATE_DESC);
+ service_add_extra_data(service,
+ GL_ARGV_VIDEO_LAUNCH_APP,
+ GL_ARGV_VIDEO_LAUNCH_GALLERY);
+ service_add_extra_data(service,
+ GL_ARGV_VIDEO_START_POS,
+ last_pos_str);
+ } else {
+ gl_dbg("Web album? Under construction...");
+ }
+ } else {
+ /* Fixme: return or not? */
+ gl_dbgE("Invalid current album, return?");
+ }
+ }
+
+ int ret = 0;
+ if (file_is_drm) {
+ gl_dbg("DRM file.");
+ service_add_extra_data(service, GL_ARGV_PATH, video_path);
+ service_set_operation(service, SERVICE_OPERATION_DEFAULT);
+ service_set_package(service, GL_APP_PKG_VIDEOPLAYER);
+ ret = service_send_launch_request(service, NULL, NULL);
+ } else {
+ gl_dbg("Not DRM file.");
+ service_add_extra_data(service, GL_ARGV_PATH, video_path);
+ service_set_operation(service, SERVICE_OPERATION_DEFAULT);
+ service_set_package(service, GL_APP_PKG_VIDEOPLAYER);
+ ret = service_send_launch_request(service, NULL, NULL);
+ }
+
+ if (ret == SERVICE_ERROR_NONE)
+ return 0;
+ else
+ return -1;
+}
+
+static int __gl_ext_compose_exec_cmd(void *data, gl_ext_app_type type,
+ char *path, char **pkg_name,
+ service_h service)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_dbg("type:%d, path:%s", type, path);
+
+ switch (type) {
+ case GL_APP_VIDEOPLAYER:
+ GL_CHECK_VAL(path, -1);
+ *pkg_name = GL_APP_PKG_VIDEOPLAYER;
+ break;
+ default:
+ *pkg_name = NULL;
+ }
+
+ return 0;
+}
+
+static void __gl_ext_service_reply_cb(service_h request, service_h reply,
+ service_result_e result, void *user_data)
+{
+ gl_dbg("");
+ switch(result) {
+ case SERVICE_RESULT_SUCCEEDED:
+ gl_dbg("SERVICE_RESULT_SUCCEEDED");
+ break;
+ case SERVICE_RESULT_FAILED:
+ gl_dbg("SERVICE_RESULT_FAILED");
+ break;
+ case SERVICE_RESULT_CANCELED:
+ gl_dbg("SERVICE_RESULT_CANCELED");
+ break;
+ default:
+ gl_dbgE("Unhandled value: %d!", result);
+ break;
+ }
+}
+
+static int __gl_ext_load(const char *operation, const char *pkg)
+{
+ gl_dbg("operation: %s, pkg: %s", operation, pkg);
+ int ret = -1;
+ int destroy_ret = -1;
+ service_h handle;
+
+ ret = service_create(&handle);
+ if(ret != SERVICE_ERROR_NONE) {
+ gl_dbgE("service_create failed[%d]!", ret);
+ return GL_LAUNCH_FAIL;
+ }
+
+ ret = service_set_operation(handle, operation);
+ if(ret != SERVICE_ERROR_NONE) {
+ gl_dbgE("service_set_operation [%s] failed[%d]!", operation,
+ ret);
+ goto GL_EXT_FAILED;
+ }
+
+ if(pkg) {
+ ret = service_set_package(handle, pkg);
+ if(ret != SERVICE_ERROR_NONE) {
+ gl_dbgE("service_set_package [%s] failed[%d]!", pkg,
+ ret);
+ goto GL_EXT_FAILED;
+ }
+ }
+
+ ret = service_send_launch_request(handle, __gl_ext_service_reply_cb,
+ NULL);
+ if(ret != SERVICE_ERROR_NONE) {
+ gl_dbgE("service_send_launch_request failed[%d]!", ret);
+ goto GL_EXT_FAILED;
+ }
+
+ GL_EXT_FAILED:
+ destroy_ret = service_destroy(handle);
+ if(destroy_ret != SERVICE_ERROR_NONE) {
+ gl_dbgE("service_destroy failed[%d]!", destroy_ret);
+ return GL_LAUNCH_FAIL;
+ }
+
+ return (ret == SERVICE_ERROR_NONE ? GL_LAUNCH_SUCCESS : GL_LAUNCH_FAIL);
+}
+
+int gl_ext_exec(void *data, gl_ext_app_type type)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_item *gitem = (gl_item *)data;
+ GL_CHECK_VAL(gitem->ad, -1);
+ gl_appdata *ad = (gl_appdata *)gitem->ad;
+ GL_CHECK_VAL(gitem->item, -1);
+ GL_CHECK_VAL(gitem->item->file_url, -1);
+ char *path = gitem->item->file_url;
+ service_h service = NULL;
+ char *pkg_name = NULL;
+
+ if (ad->uginfo.app_called_by_me) {
+ gl_dbgE("APP launched, return!");
+ return GL_LAUNCH_FAIL;
+ }
+
+ service_create(&service);
+ GL_CHECK_VAL(service, GL_LAUNCH_FAIL);
+
+ __gl_ext_compose_exec_cmd(ad, type, path, &pkg_name, service);
+ if (pkg_name == NULL) {
+ service_destroy(service);
+ return GL_LAUNCH_FAIL;
+ }
+
+ int ret = 0;
+ if (type == GL_APP_VIDEOPLAYER) {
+ if (path == NULL) {
+ service_destroy(service);
+ return GL_LAUNCH_FAIL;
+ }
+ if (__gl_ext_launch_video_player(data, service) != 0) {
+ service_destroy(service);
+ return GL_LAUNCH_FAIL;
+ }
+ } else {
+ service_set_operation(service, SERVICE_OPERATION_DEFAULT);
+ service_set_package(service, pkg_name);
+ ret = service_send_launch_request(service, NULL, NULL);
+ if (ret != SERVICE_ERROR_NONE) {
+ service_destroy(service);
+ gl_dbgE("service_send_launch_request failed[%d]!", ret);
+ return GL_LAUNCH_FAIL;
+ }
+ }
+
+ ret = service_destroy(service);
+ if (ret != SERVICE_ERROR_NONE) {
+ ad->uginfo.app_called_by_me = true;
+ return GL_LAUNCH_SUCCESS;
+ } else {
+ return GL_LAUNCH_FAIL;
+ }
+}
+
+/**
+ * Launching Camera application
+ */
+int _gl_ext_load_camera(void)
+{
+ gl_dbg("");
+ app_context_h app_context;
+
+ int ret = APP_MANAGER_ERROR_NONE;
+ ret = app_manager_get_app_context(GL_APP_PKG_CAMERA, &app_context);
+ if (ret == APP_MANAGER_ERROR_NONE) {
+ gl_dbg("Resume Camera");
+ app_manager_resume_app(app_context);
+ return GL_LAUNCH_SUCCESS;
+ } else if (ret == APP_MANAGER_ERROR_NO_SUCH_APP) {
+ gl_dbg("Launch Camera");
+ return __gl_ext_load(SERVICE_OPERATION_DEFAULT,
+ GL_APP_PKG_CAMERA);
+ }
+
+ gl_dbgE("Error case[%d]!", ret);
+ return GL_LAUNCH_FAIL;
+}
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <Elementary.h>
+#include <Ecore_X.h>
+#include "gl-ext-ug-load.h"
+#include "gl-debug.h"
+#include "gl-ui-util.h"
+#include "gl-util.h"
+#include "gl-albums.h"
+#include "gl-thumbs.h"
+#include "gallery.h"
+#include "gl-popup.h"
+#include "gl-strings.h"
+#include "gl-controlbar.h"
+#include "gl-editfield.h"
+
+#define GL_UG_PKG_MESSAGE "msg-composer-efl"
+#define GL_UG_PKG_EMAIL "email-composer-efl"
+#define GL_UG_PKG_IV "image-viewer-efl"
+#define GL_UG_PKG_BLUETOOTH "setting-bluetooth-efl"
+#define GL_UG_PKG_GALLERY "gallery-efl"
+
+#define GL_SEPERATOR_MAIL '\n'
+
+#define GL_ARGV_MSG_ATTACHFILE "ATTACHFILE"
+#define GL_ARGV_EMAIL_RUN_TYPE "RUN_TYPE"
+#define GL_ARGV_EMAIL_RUN_5 "5"
+#define GL_ARGV_EMAIL_ATTACHMENT "ATTACHMENT"
+#define GL_ARGV_BT_LAUNCH_TYPE "launch-type"
+#define GL_ARGV_BT_LAUNCH_SEND "send"
+#define GL_ARGV_BT_FILECOUNT "filecount"
+#define GL_ARGV_BT_FILES "files"
+
+#define GL_ARGV_IV_VIEW_MODE "View Mode"
+#define GL_ARGV_IV_VIEW_GALLERY "GALLERY"
+#define GL_ARGV_IV_VIEW_SLIDESHOW "SLIDESHOW"
+#define GL_ARGV_IV_PATH "Path"
+#define GL_ARGV_IV_INDEX "Index"
+#define GL_ARGV_IV_VIEW_BY "View By"
+#define GL_ARGV_IV_VIEW_BY_FOLER "By Folder"
+#define GL_ARGV_IV_VIEW_BY_ALL "All"
+#define GL_ARGV_IV_VIEW_BY_FAVOR "Favorites"
+#define GL_ARGV_IV_VIEW_BY_TAGS "Tags"
+#define GL_ARGV_IV_MEDIA_TYPE "Media type"
+#define GL_ARGV_IV_MEDIA_ALL "All"
+#define GL_ARGV_IV_MEDIA_IMAGE "Image"
+#define GL_ARGV_IV_MEDIA_VIDEO "Video"
+#define GL_ARGV_IV_TAG_NAME "Tag name"
+#define GL_ARGV_IV_ALBUM_INDEX "Album index"
+#define GL_ARGV_IV_SORT_BY "Sort By"
+#define GL_ARGV_IV_SORT_NAME "Name"
+#define GL_ARGV_IV_SORT_NAMEDESC "NameDesc"
+#define GL_ARGV_IV_SORT_DATE "Date"
+#define GL_ARGV_IV_SORT_DATEDESC "DateDesc"
+
+#define GL_ARGV_LAUNCH_TYPE "launch-type"
+#define GL_ARGV_FILE_TYPE "file-type"
+#define GL_ARGV_DRM_TYPE "drm-type"
+#define GL_ARGV_SETAS_TYPE "setas-type"
+#define GL_ARGV_CALLERID_SIZE "callerid-size"
+#define GL_ARGV_CALLERID_PATH "callerid-path"
+#define GL_ARGV_HOMESCREEN_PATH "homescreen-path"
+#define GL_ARGV_LOCKSCREEN_PATH "lockscreen-path"
+
+#define GL_ARGV_SETAS_WALLPALER "wallpaper"
+#define GL_ARGV_SETAS_CROP_WALLPALER "crop-wallpaper"
+#define GL_ARGV_SETAS_CALLERID "callerid"
+#define GL_ARGV_SELECT_ALBUM "select-album"
+#define GL_ARGV_SELECT_ONE "select-one"
+#define GL_ARGV_SELECT_MULTIPLE "select-multiple"
+#define GL_ARGV_SELECT_SETAS "select-setas"
+#define GL_ARGV_SELECT_RETURN_FOLDER_PATH "folder-path"
+#define GL_ARGV_SELECT_RETURN_COUNT "count"
+#define GL_ARGV_SELECT_RETURN_PATH "path"
+#define GL_ARGV_SETAS_RETURN_CROP_PATH "crop-image-path"
+#define GL_ARGV_SETAS_RETURN_PATH "image-path"
+#define GL_ARGV_FILE_TYPE_IMAGE "image"
+#define GL_ARGV_FILE_TYPE_VIDEO "video"
+#define GL_ARGV_FILE_TYPE_ALL "all"
+#define GL_ARGC_SELECTED_FILES "Selected index"
+#define GL_ARGV_IV_INDEX_VALUE "1"
+#define GL_ARGV_DRM_TRUE "true"
+
+#define GL_ARGV_SETAS_RETURN_HOMESCREEN_PATH_FROM_IV "homescreen_path"
+
+static void __gl_ext_destroy_ug(void *data)
+{
+ GL_CHECK(data);
+ gl_appdata *ad = (gl_appdata *)data;
+ GL_CHECK(ad->uginfo.ug_called_by_me);
+ int view_mode = gl_get_view_mode(data);
+ gl_dbg("View mode: %d", view_mode);
+
+ ug_destroy(ad->uginfo.ug_called_by_me);
+ ad->uginfo.ug_called_by_me = NULL;
+
+ bool is_slideshow = false;
+ if (ad->uginfo.ug_type == GL_UG_IMAGEVIEWER &&
+ ad->uginfo.iv_type != GL_UG_IV)
+ is_slideshow = true;
+ /* Clear type first */
+ ad->uginfo.ug_type = -1;
+ ad->uginfo.iv_type = -1;
+
+ /* Show cursor and IMF if not popup showed */
+ if (ad->entryinfo.editfield)
+ _gl_editfield_show_imf(ad);
+
+ /**
+ * If (1) view_mode is set as GL_VIEW_THUMBS in gridview,
+ * It means ug_called_by_me is ImageViewer UG.
+ */
+ if (view_mode == GL_VIEW_THUMBS) {
+ if (!is_slideshow)
+ gl_update_view(data, GL_UPDATE_VIEW_NORMAL);
+ }
+}
+
+static void __gl_ext_ug_layout_cb(ui_gadget_h ug, enum ug_mode mode, void *priv)
+{
+ gl_dbg("");
+ GL_CHECK(ug);
+ GL_CHECK(priv);
+
+ Evas_Object *base = NULL;
+ base = ug_get_layout(ug);
+ if (!base) {
+ gl_dbgE("ug_get_layout failed!");
+ ug_destroy(ug);
+ return;
+ }
+ gl_appdata *ad = (gl_appdata *)priv;
+
+ switch (mode) {
+ case UG_MODE_FULLVIEW:
+ evas_object_size_hint_weight_set(base, EVAS_HINT_EXPAND,
+ EVAS_HINT_EXPAND);
+ /* Disable effect when AUL, other show effect */
+ /* Disable effect according to IV for descresing launching time */
+ if((ad->albuminfo.aul_launch_type != GL_AUL_T_NONE &&
+ ad->albuminfo.aul_launch_type != GL_AUL_T_VIEW_ALBUM) ||
+ ad->uginfo.ug_type == GL_UG_IMAGEVIEWER) {
+ gl_dbg("No animation.");
+ ug_disable_effect(ug);
+ }
+ evas_object_show(base);
+ break;
+ default:
+ break;
+ }
+}
+
+static void __gl_ext_ug_result_cb(ui_gadget_h ug, service_h result, void *priv)
+{
+ GL_CHECK(priv);
+ gl_dbg("");
+}
+
+static void __gl_ext_ug_destroy_cb(ui_gadget_h ug, void *priv)
+{
+ GL_CHECK(priv);
+ gl_appdata *ad = (gl_appdata *)priv;
+ gl_dbg("");
+
+ if(ad->albuminfo.aul_launch_type == GL_AUL_T_NONE ||
+ ad->albuminfo.aul_launch_type == GL_AUL_T_VIEW_ALBUM) {
+ GL_CHECK(ad->uginfo.ug_called_by_me);
+ __gl_ext_destroy_ug(ad);
+ } else {
+ GL_CHECK(ug);
+ gl_dbg("Destroy Gallery UG directly.");
+ /* init launch-type after gallery-ug is closed */
+ ad->albuminfo.aul_launch_type = GL_AUL_T_NONE;
+
+ ug_destroy(ug);
+ ad->uginfo.gallery_ug_called_by_me = NULL;
+
+ elm_win_lower(ad->maininfo.win);
+ gl_dbg("Pause Gallery App.");
+ }
+}
+
+static char **__gl_ext_get_select_index(void *data, int *size)
+{
+ GL_CHECK_NULL(data);
+ gl_appdata *ad = (gl_appdata *)data;
+ GL_CHECK_NULL(ad->selectedinfo.medias_elist);
+ gl_item *current = NULL;
+ char *index = NULL;
+ int i = 0;
+ char **media_index = NULL;
+ int pos = 0;
+ int sel_cnt = _gl_data_selected_list_count(ad);
+
+ media_index = (char **)calloc(sel_cnt, sizeof(char *));
+ GL_CHECK_NULL(media_index);
+ gl_dbg("select media count: %d", sel_cnt);
+
+ for (i = 0; i < sel_cnt; ++i) {
+ _gl_data_get_item_by_index(ad, i+1, true, ¤t);
+ index = (char *)calloc(1, GL_INTERGER_LEN_MAX);
+ if (current == NULL || current->item == NULL || index == NULL) {
+ for (pos = 0; pos < i; ++pos) {
+ GL_FREEIF(media_index[pos]);
+ }
+
+ GL_FREEIF(index);
+ GL_FREE(media_index);
+ return NULL;
+ }
+ gl_dbg("Sequence: %d", current->sequence);
+ snprintf(index, GL_INTERGER_LEN_MAX, "%d",
+ current->sequence - 1);
+ media_index[i] = index;
+ index = NULL;
+ }
+
+ if (size)
+ *size = sel_cnt;
+
+ return media_index;
+}
+
+static int __gl_ext_add_sortby(service_h service, int sort)
+{
+ GL_CHECK_VAL(service, GL_UG_FAIL);
+
+ switch (sort) {
+ case GL_SORT_BY_NAME_DESC:
+ /* Sort by display name descending */
+ service_add_extra_data(service, GL_ARGV_IV_SORT_BY,
+ GL_ARGV_IV_SORT_NAMEDESC);
+ gl_dbg("Name descending");
+ break;
+ case GL_SORT_BY_NAME_ASC:
+ /* Sort by display name ascending */
+ service_add_extra_data(service, GL_ARGV_IV_SORT_BY,
+ GL_ARGV_IV_SORT_NAME);
+ gl_dbg("Name ascending");
+ break;
+ case GL_SORT_BY_DATE_DESC:
+ /* Sort by modified_date descending */
+ service_add_extra_data(service, GL_ARGV_IV_SORT_BY,
+ GL_ARGV_IV_SORT_DATEDESC);
+ gl_dbg("Date descending");
+ break;
+ case GL_SORT_BY_DATE_ASC:
+ /* Sort by modified_date ascending */
+ service_add_extra_data(service, GL_ARGV_IV_SORT_BY,
+ GL_ARGV_IV_SORT_DATE);
+ gl_dbg("Date ascending");
+ break;
+ default:
+ /* No Sort, use GL_SORT_BY_NAME_ASC */
+ service_add_extra_data(service, GL_ARGV_IV_SORT_BY,
+ GL_ARGV_IV_SORT_NAME);
+ gl_dbg("no sort, use default Name ascending");
+ break;
+ }
+ return 0;
+}
+
+/* Slideshow selected images */
+static int __gl_ext_slideshow_selected(void *data, service_h service)
+{
+ GL_CHECK_VAL(service, GL_UG_FAIL);
+ GL_CHECK_VAL(data, GL_UG_FAIL);
+ gl_appdata *ad = (gl_appdata *)data;
+ char **media_index = NULL;
+ int media_size = 0;
+
+ media_index = __gl_ext_get_select_index(ad, &media_size);
+ if (media_index == NULL) {
+ gl_dbgE("Invalid select index!");
+ return GL_UG_FAIL;
+ }
+ gl_dbg("Set selected medias, media_index[%p], size[%d]", media_index,
+ media_size);
+ service_add_extra_data_array(service, GL_ARGC_SELECTED_FILES,
+ (const char **)media_index, media_size);
+ /*free space of the medias index*/
+ int i = 0;
+ for (i = 0; i < media_size; ++i) {
+ GL_FREEIF(media_index[i]);
+ }
+ GL_FREE(media_index);
+ media_index = NULL;
+
+ service_add_extra_data(service, GL_ARGV_IV_INDEX,
+ GL_ARGV_IV_INDEX_VALUE);
+ return GL_UG_SUCCESS;
+}
+
+static int __gl_ext_set_thumbs_mode(void *data, service_h service, int type)
+{
+ GL_CHECK_VAL(service, GL_UG_FAIL);
+ GL_CHECK_VAL(data, GL_UG_FAIL);
+ gl_appdata *ad = (gl_appdata *)data;
+ int view_mode = gl_get_view_mode(ad);
+ gl_dbg("view_mode: %d", view_mode);
+
+ /* 2.0, Local file */
+ if (GL_UG_IV_SLIDESHOW == type ||
+ GL_UG_IV_SLIDESHOW_SELECTED == type)
+ service_add_extra_data(service, GL_ARGV_IV_VIEW_MODE,
+ GL_ARGV_IV_VIEW_SLIDESHOW);
+ else
+ service_add_extra_data(service, GL_ARGV_IV_VIEW_MODE,
+ GL_ARGV_IV_VIEW_GALLERY);
+
+ switch (view_mode) {
+ case GL_VIEW_THUMBS:
+ case GL_VIEW_THUMBS_EDIT:
+ /* Type according to different seg. */
+ if (ad->gridinfo.view_mode == GL_THUMB_IMAGES) {
+ service_add_extra_data(service, GL_ARGV_IV_MEDIA_TYPE,
+ GL_ARGV_IV_MEDIA_IMAGE);
+ gl_dbg("Media type: Image");
+ } else if (ad->gridinfo.view_mode == GL_THUMB_VIDEOS) {
+ service_add_extra_data(service, GL_ARGV_IV_MEDIA_TYPE,
+ GL_ARGV_IV_MEDIA_VIDEO);
+ gl_dbg("Media type: Video");
+ } else {
+ service_add_extra_data(service, GL_ARGV_IV_MEDIA_TYPE,
+ GL_ARGV_IV_MEDIA_ALL);
+ gl_dbg("Media type: All");
+ }
+ break;
+ default:
+ service_add_extra_data(service, GL_ARGV_IV_MEDIA_TYPE,
+ GL_ARGV_IV_MEDIA_ALL);
+ gl_dbg("Media type: All");
+ break;
+ }
+ return GL_UG_SUCCESS;
+}
+static int __gl_ext_albums_set_iv(void *data, service_h service, int type)
+{
+ GL_CHECK_VAL(service, GL_UG_FAIL);
+ GL_CHECK_VAL(data, GL_UG_FAIL);
+ gl_appdata *ad = (gl_appdata *)data;
+ GL_CHECK_VAL(ad->albuminfo.current_album, GL_UG_FAIL);
+ gl_cluster *cur_album = ad->albuminfo.current_album;
+ gl_dbg("type: %d", type);
+
+ /* 2.0, Local file */
+ if (__gl_ext_set_thumbs_mode(data, service, type) == GL_UG_FAIL)
+ return GL_UG_FAIL;
+
+ if (ad->gridinfo.grid_type == GL_GRID_T_ALLALBUMS) {
+ /* 2.1, 'All' album->thumbnails view */
+ service_add_extra_data(service, GL_ARGV_IV_VIEW_BY,
+ GL_ARGV_IV_VIEW_BY_ALL);
+ gl_dbg("View By: All");
+ } else {
+ /* 2.3, Other albums->thumbnails view */
+ service_add_extra_data(service, GL_ARGV_IV_VIEW_BY,
+ GL_ARGV_IV_VIEW_BY_FOLER);
+ gl_dbg("View By: By Folder");
+ }
+
+ if (cur_album->cluster && cur_album->cluster->uuid) {
+ gl_dbg("album id: %s", cur_album->cluster->uuid);
+ service_add_extra_data(service, GL_ARGV_IV_ALBUM_INDEX,
+ cur_album->cluster->uuid);
+ }
+ return GL_UG_SUCCESS;
+}
+
+static int __gl_ext_tags_set_iv(void *data, service_h service, int type)
+{
+ GL_CHECK_VAL(service, GL_UG_FAIL);
+ GL_CHECK_VAL(data, GL_UG_FAIL);
+ gl_appdata *ad = (gl_appdata *)data;
+ GL_CHECK_VAL(ad->taginfo.current_tag, GL_UG_FAIL);
+ gl_dbg("type: %d", type);
+
+ if (__gl_ext_set_thumbs_mode(data, service, type) == GL_UG_FAIL)
+ return GL_UG_FAIL;
+
+ /* 2.4, Tags->thumbnails view */
+ gl_tag *cur_tag = ad->taginfo.current_tag;
+ if (cur_tag->tag && cur_tag->tag->tag_name) {
+ if (cur_tag->tag->_id == GL_TAG_FAVORITES_ID) {
+ /* 2.4.1, Favourites tag->thumbnails view */
+ service_add_extra_data(service, GL_ARGV_IV_VIEW_BY,
+ GL_ARGV_IV_VIEW_BY_FAVOR);
+ gl_dbg("View By: Favorites");
+ } else {
+ /* 2.4.2, Normal tag->thumbnails view */
+ service_add_extra_data(service, GL_ARGV_IV_VIEW_BY,
+ GL_ARGV_IV_VIEW_BY_TAGS);
+ gl_dbg("View By: Tags");
+ }
+
+ service_add_extra_data(service, GL_ARGV_IV_TAG_NAME,
+ cur_tag->tag->tag_name);
+ } else {
+ gl_dbgE("Invalid tag!");
+ return GL_UG_FAIL;
+ }
+ return GL_UG_SUCCESS;
+}
+
+/* Invoke Imageviewer UG */
+int gl_ext_load_iv_ug(void *data, gl_item *item, gl_ext_iv_type type)
+{
+ GL_CHECK_VAL(item, GL_UG_FAIL);
+ GL_CHECK_VAL(item->item, GL_UG_FAIL);
+ GL_CHECK_VAL(data, GL_UG_FAIL);
+ gl_appdata *ad = (gl_appdata *)data;
+ GL_CHECK_VAL(ad->maininfo.win, GL_UG_FAIL);
+ Evas_Object *win = ad->maininfo.win;
+ struct ug_cbs cbs;
+ ui_gadget_h ug = NULL;
+ service_h service = NULL;
+ gl_dbg("type: %d", type);
+
+ if (ad->uginfo.ug_called_by_me) {
+ gl_dbgE("Already exits some UG called by me, type(%d)!", type);
+ return GL_UG_FAIL;
+ }
+
+ memset(&cbs, 0x00, sizeof(struct ug_cbs));
+ cbs.layout_cb = __gl_ext_ug_layout_cb;
+ cbs.result_cb = __gl_ext_ug_result_cb;
+ cbs.destroy_cb = __gl_ext_ug_destroy_cb;
+ cbs.priv = ad;
+
+ service_create(&service);
+ GL_CHECK_VAL(service, GL_UG_FAIL);
+
+ UG_INIT_EFL(win, UG_OPT_INDICATOR_ENABLE);
+ ad->uginfo.ug_type = GL_UG_IMAGEVIEWER;
+ ad->uginfo.iv_type = type;
+
+ int ret = GL_UG_FAIL;
+ switch (ad->ctrlinfo.tab_mode) {
+ case GL_CTRL_TAB_ALBUMS:
+ ret = __gl_ext_albums_set_iv(data, service, type);
+ break;
+ case GL_CTRL_TAB_TAGS:
+ ret = __gl_ext_tags_set_iv(data, service, type);
+ break;
+ default:
+ gl_dbgE("Wrong tab mode!");
+ }
+
+ if (ret == GL_UG_FAIL) {
+ gl_dbgW("Service data setting failed!");
+ service_destroy(service);
+ return GL_UG_FAIL;
+ }
+
+ service_add_extra_data(service, GL_ARGV_IV_PATH, item->item->file_url);
+
+ /* Sort by type */
+ __gl_ext_add_sortby(service, ad->uginfo.sort_type);
+
+ if (type == GL_UG_IV_SLIDESHOW_SELECTED) {
+ if (__gl_ext_slideshow_selected(ad, service) == GL_UG_FAIL) {
+ gl_dbgE("Failed to slideshow selected files!");
+ service_destroy(service);
+ return GL_UG_FAIL;
+ }
+ } else if (type == GL_UG_IV || type == GL_UG_IV_SLIDESHOW) {
+ char sequence_str[GL_INTERGER_LEN_MAX] = { 0, };
+ eina_convert_itoa(item->sequence, sequence_str);
+ gl_dbg("sequence : %s", sequence_str);
+ service_add_extra_data(service, GL_ARGV_IV_INDEX, sequence_str);
+ }
+
+ ug = ug_create(NULL, GL_UG_PKG_IV, UG_MODE_FULLVIEW, service, &cbs);
+ ad->uginfo.ug_called_by_me = ug;
+ service_destroy(service);
+
+ if (ug) {
+ return GL_UG_SUCCESS;
+ } else {
+ gl_dbgE("ug_create failed!");
+ return GL_UG_FAIL;
+ }
+}
+
+int gl_ext_load_ug(void *data, gl_ext_ug_type type)
+{
+ GL_CHECK_VAL(data, GL_UG_FAIL);
+ gl_appdata *ad = (gl_appdata *)data;
+ GL_CHECK_VAL(ad->maininfo.win, GL_UG_FAIL);
+ struct ug_cbs cbs;
+ ui_gadget_h ug = NULL;
+ service_h service = NULL;
+ Evas_Object *win = ad->maininfo.win;
+ int view_m = gl_get_view_mode(ad);
+ gl_dbg("view_m: %d", view_m);
+
+ if (ad->uginfo.ug_called_by_me) {
+ gl_dbg("Already exits some UG, Request type(%d)", type);
+ return GL_UG_FAIL;
+ }
+
+ ad->uginfo.ug_type = type;
+
+ memset(&cbs,0x00,sizeof(struct ug_cbs));
+ char *filepath_arg = NULL;
+
+ cbs.layout_cb = __gl_ext_ug_layout_cb;
+ cbs.result_cb = __gl_ext_ug_result_cb;
+ cbs.destroy_cb = __gl_ext_ug_destroy_cb;
+ cbs.priv = ad;
+
+ service_create(&service);
+ GL_CHECK_VAL(service, GL_UG_FAIL);
+
+ UG_INIT_EFL(win, UG_OPT_INDICATOR_ENABLE);
+
+ int sel_cnt = 0;
+ char count_arg[GL_EXT_STR_COUNT_LEN] = { 0, };
+ switch (type) {
+ case GL_UG_MSG:
+ _gl_get_selected_paths(ad, GL_SEPERATOR_MAIL, &filepath_arg,
+ NULL);
+ if(filepath_arg == NULL)
+ goto EXT_UG_FAILED;
+
+ service_add_extra_data(service, GL_ARGV_MSG_ATTACHFILE,
+ filepath_arg);
+
+ ug = ug_create(NULL, GL_UG_PKG_MESSAGE,
+ UG_MODE_FULLVIEW, service, &cbs);
+ break;
+ case GL_UG_EMAIL:
+ _gl_get_selected_paths(ad, GL_SEPERATOR_MAIL, &filepath_arg,
+ NULL);
+ if(filepath_arg == NULL)
+ goto EXT_UG_FAILED;
+
+ service_add_extra_data(service, GL_ARGV_EMAIL_RUN_TYPE,
+ GL_ARGV_EMAIL_RUN_5);
+ service_add_extra_data(service, GL_ARGV_EMAIL_ATTACHMENT,
+ filepath_arg);
+
+ ug = ug_create(NULL, GL_UG_PKG_EMAIL, UG_MODE_FULLVIEW,
+ service, &cbs);
+ break;
+ case GL_UG_BT:
+ _gl_get_selected_paths(ad, GL_SEPERATOR_BT, &filepath_arg,
+ &sel_cnt);
+ if(filepath_arg == NULL)
+ goto EXT_UG_FAILED;
+
+ service_add_extra_data(service, GL_ARGV_BT_LAUNCH_TYPE,
+ GL_ARGV_BT_LAUNCH_SEND);
+
+ snprintf(count_arg, sizeof(count_arg), "%d", sel_cnt);
+ service_add_extra_data(service, GL_ARGV_BT_FILECOUNT,
+ count_arg);
+
+ service_add_extra_data(service, GL_ARGV_BT_FILES, filepath_arg);
+
+ ug = ug_create(NULL, GL_UG_PKG_BLUETOOTH, UG_MODE_FULLVIEW,
+ service, &cbs);
+ break;
+ default:
+ gl_dbgE("Wrong UG type!");
+ goto EXT_UG_FAILED;
+ }
+
+ if (filepath_arg) {
+ g_free(filepath_arg);
+ filepath_arg = NULL;
+ }
+
+ ad->uginfo.ug_called_by_me = ug;
+ service_destroy(service);
+
+ if (ug) {
+ gl_dbgW("ug_create success!");
+ return GL_UG_SUCCESS;
+ } else {
+ gl_dbgE("ug_create failed!");
+ gl_popup_create_popup(ad, GL_POPUP_NOBUT,
+ GL_STR_APPLICATION_NOT_INSTALLED);
+ return GL_UG_FAIL;
+ }
+
+ EXT_UG_FAILED:
+
+ gl_dbgE("EXT_UG_FAILED!");
+ service_destroy(service);
+ return GL_UG_FAIL;
+}
+
+static void __gl_ext_gallery_ug_result_cb(ui_gadget_h ug, service_h result,
+ void *priv)
+{
+ GL_CHECK(priv);
+ gl_appdata *ad = (gl_appdata *)priv;
+ char *ret_str = NULL;
+ int service_ret = -1;
+ service_h service = ad->albuminfo.recv_service;
+ service_h reply = NULL;
+ bool b_reply = false;
+ gl_dbg("");
+
+ if (service_create(&reply) != SERVICE_ERROR_NONE) {
+ gl_dbgE("service_create failed!");
+ return;
+ }
+ GL_CHECK(reply);
+
+ switch(ad->albuminfo.aul_launch_type) {
+ case GL_AUL_T_SELECT_ALBUM:
+ service_get_extra_data(result,
+ GL_ARGV_SELECT_RETURN_FOLDER_PATH,
+ &ret_str);
+ if(ret_str) {
+ gl_dbg("return folder-path: %s", ret_str);
+ service_add_extra_data(reply, SERVICE_DATA_SELECTED,
+ ret_str);
+ GL_FREE(ret_str);
+ b_reply = true;
+ }
+ break;
+
+ case GL_AUL_T_SELECT_ONE:
+ service_get_extra_data(result, GL_ARGV_SELECT_RETURN_PATH,
+ &ret_str);
+ if(ret_str) {
+ gl_dbg("return path: %s", ret_str);
+ service_add_extra_data(reply, SERVICE_DATA_SELECTED,
+ ret_str);
+ GL_FREE(ret_str);
+ b_reply = true;
+ }
+ break;
+
+ case GL_AUL_T_SELECT_MULTIPLE:
+ service_get_extra_data(result, GL_ARGV_SELECT_RETURN_COUNT,
+ &ret_str);
+ if(ret_str) {
+ gl_dbg("return count: %s", ret_str);
+ service_add_extra_data(reply,
+ GL_ARGV_SELECT_RETURN_COUNT,
+ ret_str);
+ GL_FREE(ret_str);
+ b_reply = true;
+ }
+
+ service_get_extra_data(result, GL_ARGV_SELECT_RETURN_PATH,
+ &ret_str);
+ if(ret_str) {
+ gl_dbg("return path: %s", ret_str);
+ service_add_extra_data(reply, SERVICE_DATA_SELECTED,
+ ret_str);
+ GL_FREE(ret_str);
+ b_reply = true;
+ }
+ break;
+
+ case GL_AUL_T_SELECT_SETAS:
+ service_get_extra_data(result, GL_ARGV_SETAS_RETURN_PATH,
+ &ret_str);
+ if(ret_str) {
+ gl_dbg("return image-path: %s", ret_str);
+ service_add_extra_data(reply, GL_ARGV_SETAS_RETURN_PATH,
+ ret_str);
+ GL_FREE(ret_str);
+ b_reply = true;
+ }
+
+ /* When IV ug returns "crop_image_path" */
+ service_get_extra_data(result, GL_ARGV_SETAS_RETURN_CROP_PATH, &ret_str);
+ if (ret_str &&
+ (ad->albuminfo.aul_setas_type == GL_AUL_SETAS_T_CALLER_ID ||
+ ad->albuminfo.aul_setas_type == GL_AUL_SETAS_T_CROP_WALLPAPER)) {
+ gl_dbg("return image-path: %s", ret_str);
+ service_add_extra_data(reply,
+ GL_ARGV_SETAS_RETURN_CROP_PATH,
+ ret_str);
+ GL_FREE(ret_str);
+ b_reply = true;
+ }
+
+ /* When IV ug returns "homescreen_path" */
+ service_get_extra_data(result, GL_ARGV_SETAS_RETURN_HOMESCREEN_PATH_FROM_IV, &ret_str);
+ if (ret_str &&
+ ad->albuminfo.aul_setas_type == GL_AUL_SETAS_T_WALLPAPER) {
+ gl_dbg("return image-path: %s", ret_str);
+ service_add_extra_data(reply, GL_ARGV_SETAS_RETURN_HOMESCREEN_PATH_FROM_IV, ret_str);
+ GL_FREE(ret_str);
+ b_reply = true;
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ /* Send result to caller */
+ if(b_reply) {
+ service_ret = service_reply_to_launch_request(reply, service,
+ SERVICE_RESULT_SUCCEEDED);
+ } else {
+ gl_dbgE("service_get_extra_data failed!");
+ service_ret = service_reply_to_launch_request(reply, service,
+ SERVICE_RESULT_CANCELED);
+ }
+
+ service_destroy(reply);
+ if (service_ret != SERVICE_ERROR_NONE)
+ gl_dbgE("service_reply_to_launch_request failed!");
+}
+
+int gl_ext_load_gallery_ug(void *data)
+{
+ GL_CHECK_VAL(data, GL_UG_FAIL);
+ gl_appdata *ad = (gl_appdata *)data;
+ struct ug_cbs cbs;
+ ui_gadget_h ug = NULL;
+ service_h service = NULL;
+ Evas_Object *win = ad->maininfo.win;
+ int launch_type = 0;
+ int setas_type = 0;
+ int file_type = 0;
+ char *val = NULL;
+
+ if (ad->uginfo.gallery_ug_called_by_me) {
+ gl_dbgW("Gallery UG called by me, destroy it first!");
+ ug_destroy(ad->uginfo.gallery_ug_called_by_me);
+ ad->uginfo.gallery_ug_called_by_me = NULL;
+ }
+
+ memset(&cbs, 0x00, sizeof(struct ug_cbs));
+
+ cbs.layout_cb = __gl_ext_ug_layout_cb;
+ cbs.result_cb = __gl_ext_gallery_ug_result_cb;
+ cbs.destroy_cb = __gl_ext_ug_destroy_cb;
+ cbs.priv = ad;
+
+ service_create(&service);
+ GL_CHECK_VAL(service, GL_UG_FAIL);
+
+ UG_INIT_EFL(win, UG_OPT_INDICATOR_ENABLE);
+
+ /* add launch-type */
+ launch_type = ad->albuminfo.aul_launch_type;
+ gl_dbg("launch-type: %d", launch_type);
+ switch (launch_type) {
+ case GL_AUL_T_SELECT_ONE:
+ service_add_extra_data(service, GL_ARGV_LAUNCH_TYPE,
+ GL_ARGV_SELECT_ONE);
+ break;
+ case GL_AUL_T_SELECT_MULTIPLE:
+ service_add_extra_data(service, GL_ARGV_LAUNCH_TYPE,
+ GL_ARGV_SELECT_MULTIPLE);
+ break;
+ case GL_AUL_T_SELECT_SETAS:
+ service_add_extra_data(service, GL_ARGV_LAUNCH_TYPE,
+ GL_ARGV_SELECT_SETAS);
+
+ setas_type = ad->albuminfo.aul_setas_type;
+ gl_dbg("setas-type: %d", setas_type);
+ switch(setas_type) {
+ case GL_AUL_SETAS_T_WALLPAPER:
+ case GL_AUL_SETAS_T_CROP_WALLPAPER:
+ if (setas_type == GL_AUL_SETAS_T_WALLPAPER) {
+ service_add_extra_data(service,
+ GL_ARGV_SETAS_TYPE,
+ GL_ARGV_SETAS_WALLPALER);
+ } else if ( setas_type == GL_AUL_SETAS_T_CROP_WALLPAPER ) {
+ service_add_extra_data(service,
+ GL_ARGV_SETAS_TYPE,
+ GL_ARGV_SETAS_CROP_WALLPALER);
+ }
+ val = ad->albuminfo.aul_homescreen_path;
+ if(val) {
+ gl_dbg("homescreen-path: %s", val);
+ service_add_extra_data(service,
+ GL_ARGV_HOMESCREEN_PATH,
+ val);
+ }
+
+ val = ad->albuminfo.aul_lockscreen_path;
+ if(val) {
+ gl_dbg("lockscreen-path: %s", val);
+ service_add_extra_data(service,
+ GL_ARGV_LOCKSCREEN_PATH,
+ val);
+ }
+
+ break;
+ case GL_AUL_SETAS_T_CALLER_ID:
+ service_add_extra_data(service, GL_ARGV_SETAS_TYPE,
+ GL_ARGV_SETAS_CALLERID);
+ val = ad->albuminfo.aul_callid_size;
+ if(val) {
+ gl_dbg("callerid-size: %s", val);
+ service_add_extra_data(service,
+ GL_ARGV_CALLERID_SIZE,
+ val);
+ }
+
+ val = ad->albuminfo.aul_callid_path;
+ if(val) {
+ gl_dbg("callerid-path: %s", val);
+ service_add_extra_data(service,
+ GL_ARGV_CALLERID_PATH,
+ val);
+ }
+
+ break;
+ default:
+ gl_dbgE("Undefine mode!");
+ service_destroy(service);
+ return GL_UG_FAIL;
+ }
+
+ break;
+ case GL_AUL_T_SELECT_ALBUM:
+ service_add_extra_data(service, GL_ARGV_LAUNCH_TYPE,
+ GL_ARGV_SELECT_ALBUM);
+ break;
+ default:
+ gl_dbgE("Undefine mode!");
+ service_destroy(service);
+ return GL_UG_FAIL;
+ }
+
+ /* add file-type */
+ file_type = ad->albuminfo.aul_file_type;
+ gl_dbg("file-type: %d", file_type);
+ switch (file_type) {
+ case GL_AUL_FILE_T_IMAGE:
+ service_add_extra_data(service, GL_ARGV_FILE_TYPE,
+ GL_ARGV_FILE_TYPE_IMAGE);
+ break;
+ case GL_AUL_FILE_T_VIDEO:
+ service_add_extra_data(service, GL_ARGV_FILE_TYPE,
+ GL_ARGV_FILE_TYPE_VIDEO);
+ break;
+ case GL_AUL_FILE_T_ALL:
+ service_add_extra_data(service, GL_ARGV_FILE_TYPE,
+ GL_ARGV_FILE_TYPE_ALL);
+ break;
+ default:
+ gl_dbgE("Undefine mode!");
+ service_destroy(service);
+ return GL_UG_FAIL;
+ }
+ /* add whether contain drm file */
+ if (ad->albuminfo.b_show_drm)
+ service_add_extra_data(service, GL_ARGV_DRM_TYPE,
+ GL_ARGV_DRM_TRUE);
+
+ ug = ug_create(NULL, GL_UG_PKG_GALLERY, UG_MODE_FULLVIEW, service,
+ &cbs);
+ service_destroy(service);
+
+ gl_dbg("ug_create: %p.", ug);
+ ad->uginfo.gallery_ug_called_by_me = ug;
+ if (ug) {
+ Evas_Object *ug_ly = ug_get_layout(ug);
+ if (ug_ly) {
+ evas_object_raise(ug_ly);
+ } else {
+ gl_dbgE("ug_get_layout failed!");
+ return GL_UG_FAIL;
+ }
+ return GL_UG_SUCCESS;
+ } else {
+ gl_dbgE("ug_create failed!");
+ return GL_UG_FAIL;
+ }
+}
+
+int gl_ext_destroy_gallery_ug(void *data)
+{
+ GL_CHECK_VAL(data, GL_UG_FAIL);
+ gl_dbg("");
+ gl_appdata *ad = (gl_appdata *)data;
+
+ /* For select appcontrol, destory ug when HOME key is pressed */
+ if (ad->albuminfo.aul_launch_type != GL_AUL_T_NONE &&
+ ad->albuminfo.aul_launch_type != GL_AUL_T_VIEW_ALBUM &&
+ ad->uginfo.gallery_ug_called_by_me) {
+ gl_dbg("To destroy UG");
+ __gl_ext_ug_destroy_cb(ad->uginfo.gallery_ug_called_by_me, ad);
+ } else {
+ gl_dbg("AUL none");
+ }
+
+ return GL_UG_SUCCESS;
+}
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <sys/stat.h>
+#include <sys/statvfs.h>
+#include <errno.h>
+#include <glib/gprintf.h>
+#include <Elementary.h>
+#include "gl-fs.h"
+#include "gallery.h"
+#include "gl-debug.h"
+
+static int __gl_fs_free_node(gl_node_info_s *pnode)
+{
+ GL_CHECK_VAL(pnode, -1);
+ if (pnode->path) {
+ g_free(pnode->path);
+ pnode->path = NULL;
+ }
+ if (pnode->name) {
+ g_free(pnode->name);
+ pnode->name = NULL;
+ }
+ g_free(pnode);
+ return 0;
+}
+
+static int __gl_fs_clear_list(Eina_List **elist)
+{
+ GL_CHECK_VAL(elist, -1);
+ gl_node_info_s *pnode = NULL;
+ if (*elist) {
+ EINA_LIST_FREE(*elist, pnode) {
+ __gl_fs_free_node(pnode);
+ pnode = NULL;
+ }
+ *elist = NULL;
+ }
+ return 0;
+}
+
+/* Append bigger one, prepend smaller one, first node is oldest one */
+static int __gl_fs_compare(const void *data1, const void *data2)
+{
+ gl_node_info_s *pnode1 = (gl_node_info_s *)data1;
+ gl_node_info_s *pnode2 = (gl_node_info_s *)data2;
+
+ int ret = -(pnode1->mtime - pnode2->mtime);
+ gl_dbg("mtime1[%d], mtime2[%d], ret[%d]", pnode1->mtime, pnode2->mtime,
+ ret);
+ return ret;
+}
+
+static int __gl_fs_read_dir(char *path, Eina_List **dir_list,
+ Eina_List **file_list)
+{
+ GL_CHECK_VAL(file_list, -1);
+ GL_CHECK_VAL(dir_list, -1);
+ GL_CHECK_VAL(path, -1);
+
+ DIR *pdir = NULL;
+ struct dirent *ent = NULL;
+ int count = 0;
+ char *childpath = NULL;
+ int cp_len = 0;
+ gl_node_info_s *pnode = NULL;
+ int copiednum = 0;
+
+ pdir = opendir(path);
+ GL_CHECK_VAL(pdir, -1);
+
+ while ((ent = readdir(pdir)) != NULL) {
+ if (g_strcmp0(ent->d_name, ".") == 0 ||
+ g_strcmp0(ent->d_name, "..") == 0) {
+ continue;
+ }
+ /*only deal with dirs and regular files*/
+ if ((ent->d_type & DT_DIR) == 0 && (ent->d_type & DT_REG) == 0)
+ continue;
+
+ /*get date & size*/
+ cp_len = strlen(path) + 1 + strlen(ent->d_name) + 1;
+ childpath = g_new0(char, cp_len);
+ if (childpath == NULL)
+ continue;
+
+ copiednum = g_snprintf(childpath, cp_len, "%s/%s", path,
+ ent->d_name);
+ if (copiednum < 0) {
+ g_free(childpath);
+ childpath = NULL;
+ continue;
+ }
+
+ pnode = g_new0(gl_node_info_s, 1);
+ if (pnode == NULL) {
+ g_free(childpath);
+ childpath = NULL;
+ continue;
+ }
+ /*get path*/
+ pnode->path = g_strdup(path);
+ /*get name*/
+ pnode->name = g_strdup(ent->d_name);
+
+ if (_gl_fs_get_file_stat(childpath, &pnode) < 0) {
+ g_free(pnode);
+ pnode = NULL;
+ g_free(childpath);
+ childpath = NULL;
+ continue;
+ }
+ g_free(childpath);
+ childpath = NULL;
+
+ if (ent->d_type & DT_DIR)
+ *dir_list = eina_list_append(*dir_list, pnode);
+ else
+ *file_list = eina_list_append(*file_list, pnode);
+ count++;
+ }
+ closedir(pdir);
+
+ return 0;
+}
+
+static int __gl_fs_get_file_list(GString *folder_name, Eina_List **dir_list,
+ Eina_List **file_list)
+{
+ GL_CHECK_VAL(folder_name, -1);
+ GL_CHECK_VAL(folder_name->str, -1);
+ GL_CHECK_VAL(folder_name->len, -1);
+ return __gl_fs_read_dir(folder_name->str, dir_list, file_list);
+}
+
+/* Get sorted folders list by folder's modified time */
+static long long __gl_fs_sort_folders_by_mtime(char *path,
+ Eina_List **sorted_list)
+{
+ if (!ecore_file_is_dir(path)) {
+ gl_dbgE("Not a directory!");
+ return 0;
+ }
+
+ long long size = 0;
+ long long sub_size = 0;
+ GString *fullpath = g_string_new(path);
+ Eina_List *dir_list = NULL;
+ Eina_List *file_list = NULL;
+ int error_code = 0;
+ error_code = __gl_fs_get_file_list(fullpath, &dir_list, &file_list);
+
+ if (error_code == 0) {
+ int i = 0;
+ int dir_cnt = eina_list_count(dir_list);
+ int file_cnt = eina_list_count(file_list);
+ gl_node_info_s *pnode = NULL;
+ for (i = 0; i < file_cnt; i++) {
+ pnode = (gl_node_info_s *)eina_list_nth(file_list, i);
+ if (pnode == NULL) {
+ gl_dbgE("Invalid node!");
+ continue;
+ }
+ size += pnode->size;
+ pnode = NULL;
+ }
+ gl_dbg("file_cnt[%lld], size[%lld]", file_cnt, size);
+
+ i = 0;
+ pnode = NULL;
+ char *sub_folder = NULL;
+ gl_dbg("dir_cnt[%d]", dir_cnt);
+ for (i = 0; i < dir_cnt; i++) {
+ pnode = (gl_node_info_s *)eina_list_nth(dir_list, i);
+ if (pnode == NULL) {
+ gl_dbgE("Invalid node!");
+ continue;
+ }
+ sub_folder = g_strconcat(pnode->path, "/", pnode->name,
+ NULL);
+ if (sub_folder) {
+ gl_dbg("sub_folder[%s]", pnode->name);
+ sub_size = __gl_fs_sort_folders_by_mtime(sub_folder,
+ sorted_list);
+ pnode->size = sub_size;
+ size += sub_size;
+ gl_dbg("mtime[%d]", pnode->mtime);
+ *sorted_list = eina_list_sorted_insert(*sorted_list,
+ __gl_fs_compare,
+ pnode);
+ g_free(sub_folder);
+ sub_folder = NULL;
+ } else {
+ gl_dbgE("Invalid sub folder!");
+ }
+ pnode = NULL;
+ }
+ }
+
+ if (fullpath) {
+ g_string_free(fullpath, true);
+ fullpath = NULL;
+ }
+
+ if (file_list)
+ __gl_fs_clear_list(&file_list);
+
+ if (dir_list) {
+ eina_list_free(dir_list);
+ dir_list = NULL;
+ }
+
+ return size;
+}
+
+static unsigned long long __gl_fs_get_free_space(int state)
+{
+ struct statvfs info;
+ char *path = NULL;
+
+ if (state == GL_STORE_T_PHONE)
+ path = GL_ROOT_PATH_PHONE;
+ else if (state == GL_STORE_T_MMC)
+ path = GL_ROOT_PATH_MMC;
+ else
+ return 0;
+
+ if (-1 == statvfs(path, &info))
+ return 0;
+
+ return ((unsigned long long)(info.f_bsize)) * ((unsigned long long)(info.f_bavail));
+}
+
+int _gl_fs_get_file_stat(const char *filename, gl_node_info_s **node)
+{
+ struct stat statbuf;
+ GL_CHECK_VAL(node, -1);
+ GL_CHECK_VAL(*node, -1);
+ GL_CHECK_VAL(filename, -1);
+
+ if (stat(filename, &statbuf) == -1)
+ return -1;
+
+ /* total size, in bytes */
+ (*node)->size = statbuf.st_size;
+ (*node)->mtime = statbuf.st_mtime;
+ return 0;
+}
+
+long long _gl_fs_get_folder_size(char *path)
+{
+ if (!ecore_file_is_dir(path)) {
+ gl_dbgE("Not a directory!");
+ return 0;
+ }
+
+ long long size = 0;
+ long long sub_size = 0;
+ GString *fullpath = g_string_new(path);
+ Eina_List *file_list = NULL;
+ Eina_List *dir_list = NULL;
+ int error_code = 0;
+ error_code = __gl_fs_get_file_list(fullpath, &dir_list, &file_list);
+
+ if (error_code == 0) {
+ int i = 0;
+ int dir_cnt = eina_list_count(dir_list);
+ int file_cnt = eina_list_count(file_list);
+ gl_node_info_s *pnode = NULL;
+ for (i = 0; i < file_cnt; i++) {
+ pnode = (gl_node_info_s *)eina_list_nth(file_list, i);
+ if (pnode == NULL) {
+ gl_dbgE("Invalid node!");
+ continue;
+ }
+ size += pnode->size;
+ pnode = NULL;
+ }
+ gl_dbg("file_cnt[%d], size[%d]", file_cnt, size);
+
+ gl_dbg("dir_cnt[%d]", dir_cnt);
+ i = 0;
+ pnode = NULL;
+ char *sub_folder = NULL;
+ for (i = 0; i < dir_cnt; i++) {
+ pnode = (gl_node_info_s *)eina_list_nth(dir_list, i);
+ if (pnode == NULL) {
+ gl_dbgE("Invalid node!");
+ continue;
+ }
+ sub_folder = g_strconcat(pnode->path, "/", pnode->name,
+ NULL);
+ if (sub_folder) {
+ gl_dbg("sub_folder[%s]", pnode->name);
+ sub_size = _gl_fs_get_folder_size(sub_folder);
+ pnode->size = sub_size;
+ size += sub_size;
+ gl_dbg("mtime[%d]", pnode->mtime);
+ g_free(sub_folder);
+ sub_folder = NULL;
+ } else {
+ gl_dbgE("Invalid sub folder!");
+ }
+ pnode = NULL;
+ }
+ }
+
+ if (fullpath) {
+ g_string_free(fullpath, true);
+ fullpath = NULL;
+ }
+
+ if (file_list)
+ __gl_fs_clear_list(&file_list);
+
+ if (dir_list)
+ __gl_fs_clear_list(&dir_list);
+ return size;
+}
+
+int _gl_fs_rm_folder(char *path, long long cut_size, long long max_size,
+ unsigned int expired_time)
+{
+ GL_CHECK_VAL(path, -1);
+ gl_node_info_s *pnode = NULL;
+ Eina_List *dir_list = NULL;
+ Eina_List *l = NULL;
+ long long size = 0;
+ gl_dbg("Size cut/max[%lld/%lld]", cut_size, max_size);
+
+ size = __gl_fs_sort_folders_by_mtime(path, &dir_list);
+ GL_CHECK_VAL(dir_list, -1);
+
+ char *folder = NULL;
+ long long _cut_size = 0;
+ if (size > max_size)
+ _cut_size = size - max_size + cut_size;
+ else if (size + cut_size > max_size)
+ _cut_size = cut_size;
+ gl_dbg("Size cut/total[%lld/%lld]", _cut_size, size);
+
+ unsigned int current_t = 0;
+ struct timeval tv;
+ gettimeofday(&tv, NULL);
+ current_t = tv.tv_sec + tv.tv_usec / GL_TIME_USEC_PER_SEC;
+ gl_dbg("current time[%d], expired time[%d]", current_t, expired_time);
+ long long rm_size = 0;
+
+ EINA_LIST_FOREACH(dir_list, l, pnode) {
+ if (pnode == NULL || pnode->path == NULL || pnode->name == NULL)
+ continue;
+
+ /* Get full path of folder */
+ folder = g_strconcat(pnode->path, "/", pnode->name, NULL);
+ if (folder == NULL)
+ continue;
+
+ gl_dbg("mtime[%d], path[%s]", pnode->mtime, folder);
+ if (pnode->mtime + expired_time < current_t) {
+ /* Remove folder */
+ gl_dbgW("Remove!");
+ ecore_file_recursive_rm(folder);
+ g_free(folder);
+ folder = NULL;
+ rm_size += pnode->size;
+ continue;
+ } else if (_cut_size == 0 || rm_size >= _cut_size) {
+ gl_dbgW("Done!");
+ break;
+ }
+
+ /* Remove folder */
+ ecore_file_recursive_rm(folder);
+ g_free(folder);
+ folder = NULL;
+
+ gl_dbg("size[cut/dir]=%lld/%lld", _cut_size, pnode->size);
+ if (pnode->size >= _cut_size) {
+ gl_dbgW("Done!");
+ break;
+ }
+
+ pnode = NULL;
+ }
+ __gl_fs_clear_list(&dir_list);
+ return 0;
+}
+
+#ifdef _RENAME_ALBUM_SENSITIVE
+bool _gl_fs_check_name_case(char *dir, char *exist_name)
+{
+ GL_CHECK_FALSE(dir);
+ GL_CHECK_FALSE(exist_name);
+ gl_dbg("");
+
+ char dest_dir[GL_DIR_PATH_LEN_MAX] = {0};
+ char dest_filename[GL_FILE_NAME_LEN_MAX] = {0};
+ char *tmp = NULL;
+ tmp = strrchr(dir, '/');
+ if (tmp) {
+ g_strlcpy(dest_filename, tmp + 1, GL_FILE_NAME_LEN_MAX);
+ tmp[0] = '\0';
+ g_strlcpy(dest_dir, dir, GL_DIR_PATH_LEN_MAX);
+ tmp[0] = '/';
+ } else {
+ return false;
+ }
+
+ bool ret = false;
+ Eina_List *name_list = NULL;
+ if((name_list = ecore_file_ls(dest_dir)) == NULL) {
+ gl_dbgE("open dir failed!");
+ return false;
+ } else {
+ char *dir_name = NULL;
+ EINA_LIST_FREE(name_list, dir_name) {
+ if (dir_name &&
+ strcasecmp(dir_name, dest_filename) == 0) {
+ gl_dbg("Have same name directory");
+ ret = true;
+ memset(exist_name, 0x00, GL_ALBUM_NAME_LEN_MAX);
+ g_strlcpy(exist_name, dir_name,
+ GL_ALBUM_NAME_LEN_MAX);
+ break;
+ }
+ GL_FREEIF(dir_name);
+ }
+ }
+ return ret;
+}
+#endif
+
+bool _gl_fs_is_low_memory(unsigned long long total_size)
+{
+ unsigned long long free_size = __gl_fs_get_free_space(GL_STORE_T_PHONE);
+ if (total_size && free_size < total_size) {
+ gl_dbgE("Low memory: Free(%llu Byte) < required(%llu Byte)!",
+ free_size, total_size);
+ return true;
+ }
+
+ return false;
+}
+
+/*
+* return file extension, f.e. jpg; then return new path without ext.
+*/
+bool _gl_fs_get_ext(const char *file_path, char *file_ext, char *new_path)
+{
+ int i = 0;
+ for (i = strlen(file_path); i >= 0; i--) {
+ if ((file_path[i] == '.') && (i < GL_FILE_PATH_LEN_MAX)) {
+ g_strlcpy(file_ext, &file_path[i + 1], GL_FILE_EXT_LEN_MAX);
+ g_strlcpy(new_path, file_path, i + 1);
+ new_path[i] = '\0';
+ gl_dbg("path without extension :%s", new_path);
+ return true;
+ }
+
+ /* meet the dir. no ext */
+ if (file_path[i] == '/')
+ return true;
+ }
+ return true;
+}
+
+/* one copy of function "ecore_file_mv" from the file "ecore_file.c" for lock debugging */
+/*
+* Use gl_file_mv() to move medias to other album.
+* Media-server, which is different with libmedia-info, watches src and dest folder,
+* it updates libmedia-info DB asynchronously.
+* While move/copy mass data in My Files appliation,
+* After move/copy done in My files, check the dest folder in Gallery.
+* You'll find its content is changing.
+* gl_file_mv() operate libmedia-info DB synchronously, so it's faster than media-server.
+*/
+
+/*
+* stop using "rename" when moving from mmc to phone for correct db update.
+*/
+Eina_Bool _gl_fs_move(const char *src, const char *dst)
+{
+ GL_CHECK_FALSE(src);
+ GL_CHECK_FALSE(dst);
+
+ gl_dbg("\n\tSrc: %s\n\tDest: %s", src, dst);
+ /*
+ * From->To: MMC->MMC or Phone->Phone
+ */
+ if (rename(src, dst)) {
+ /*
+ * File cannot be moved directly because
+ * it resides on a different mount point.
+ */
+ if (errno == EXDEV) {
+ /*
+ * From->To: MMC->Phone or Phone->MMC
+ */
+ gl_dbgW("errno = EXDEV(%d): Cross-device link", errno);
+ struct stat st;
+
+ /*
+ * Make sure this is a regular file before
+ * we do anything fancy.
+ */
+ if (stat(src, &st) < 0) {
+ gl_dbgE("stat fail[%d]!", errno);
+ return EINA_FALSE;
+ }
+ if (S_ISREG(st.st_mode)) {
+ /*
+ * Copy to dst file
+ */
+ if (!ecore_file_cp(src, dst)) {
+ gl_dbgE("Copy file failed[%d]!", errno);
+ return EINA_FALSE;
+ }
+
+
+ /*
+ * Delete src file
+ */
+ if (!ecore_file_unlink(src))
+ gl_dbgE("Delete file failed[%d]!", errno);
+
+ /* Write file to filesystem immediately */
+ sync();
+ return EINA_TRUE;
+ }
+ gl_dbgE("S_ISREG fail[%d]!", errno);
+ return EINA_FALSE;
+ }
+
+ gl_dbgE("Fail[%d]!", errno);
+ return EINA_FALSE;
+ }
+ /* Write file to filesystem immediately */
+ sync();
+ return EINA_TRUE;
+}
+
+char *_gl_fs_get_unique_full_path(char *file_path, char *ext)
+{
+ char *file_name = file_path;
+ char *extension = ext;
+ char *final_path = NULL;
+ int final_path_len = 0;
+ int extension_len = 0;
+ int suffix_count = 0;
+ /* means suffix on file name. up to "_99999" */
+ const int max_suffix_count = 99999;
+ /* 1 means "_" */
+ int suffix_len = (int)log10(max_suffix_count + 1) + 1;
+
+ if (!file_path)
+ return NULL;
+
+ gl_dbg("file_path=[%s], ext=[%s]", file_path, ext);
+
+ if (extension)
+ extension_len = strlen(extension);
+
+ /* first 1 for ".", last 1 for NULL */
+ final_path_len = strlen(file_name) + 1 + suffix_len + extension_len + 1;
+
+ final_path = (char*)calloc(1, final_path_len);
+ if (!final_path) {
+ gl_dbgE("calloc failed!");
+ return NULL;
+ }
+
+ do {
+ /* e.g) /tmp/abc.jpg
+ * if there is no extension name, just make a file name without extension */
+ if (0 == extension_len) {
+ if (suffix_count == 0) {
+ snprintf(final_path, final_path_len, "%s",
+ file_name);
+ } else {
+ snprintf(final_path, final_path_len, "%s_%d",
+ file_name, suffix_count);
+ }
+ } else {
+ if (suffix_count == 0) {
+ snprintf(final_path, final_path_len, "%s.%s",
+ file_name, extension);
+ } else {
+ snprintf(final_path, final_path_len, "%s_%d.%s",
+ file_name, suffix_count, extension);
+ }
+ }
+
+ if (ecore_file_exists(final_path)) {
+ suffix_count++;
+ if (suffix_count > max_suffix_count) {
+ gl_dbgE("Max suffix count!");
+ GL_FREE(final_path);
+ break;
+ } else {
+ memset(final_path, 0x00, final_path_len);
+ continue;
+ }
+ }
+
+ break;
+ } while (1);
+
+ gl_dbg("Decided path = [%s]", final_path);
+ return final_path;
+}
+
+bool _gl_fs_validate_name(const char *new_name)
+{
+ GL_CHECK_FALSE(new_name);
+ char invalid_chars[] = { '/', '\\', ':', '*', '?', '"', '<', '>', '|', '\0' };
+ char *ptr = invalid_chars;
+
+ gl_dbg("new album name is %s\n", new_name);
+ while (*ptr != '\0')
+ {
+ gl_dbg("invalid character is %c", *ptr);
+ if (strchr(new_name, (*ptr)) != NULL)
+ {
+ return false;
+ }
+ ++ptr;
+ }
+
+ return true;
+}
+
+int _gl_fs_get_default_folder(char *path)
+{
+ int len = 0;
+ GL_CHECK_VAL(path, -1);
+
+ len = snprintf(path, GL_DIR_PATH_LEN_MAX, "%s",
+ GL_ROOT_PATH_PHONE);
+ if (len < 0) {
+ gl_dbgE("snprintf returns failure!");
+ return -1;
+ } else {
+ path[len] = '\0';
+ len = -1;
+ }
+
+ len = g_strlcat(path, GL_DEFAULT_PATH_IMAGES,
+ GL_DIR_PATH_LEN_MAX);
+ if (len >= GL_DIR_PATH_LEN_MAX) {
+ gl_dbgE("strlcat returns failure(%d)!", len);
+ return -1;
+ }
+ gl_dbg("Default images path: %s.", path);
+
+ return 0;
+}
+
+bool _gl_fs_mkdir(const char *path)
+{
+ GL_CHECK_FALSE(path);
+ struct stat st;
+ if (stat(path, &st) < 0) {
+ if (!ecore_file_mkpath(path)) {
+ gl_dbgE("Failed to mkdir!");
+ return false;
+ }
+ }
+ return true;
+}
+
--- /dev/null
+/*\r
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd\r
+ *\r
+ * Licensed under the Flora License, Version 1.1 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://floralicense.org/license/\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+#include "gallery.h"\r
+#include "gl-lang.h"\r
+#include "gl-strings.h"\r
+#include "gl-popup.h"\r
+#include "gl-ctxpopup.h"\r
+#include "gl-debug.h"\r
+#include "gl-tags.h"\r
+#include "gl-ui-util.h"\r
+#include "gl-util.h"\r
+#include "gl-progressbar.h"\r
+#include "gl-controlbar.h"\r
+#include "gl-notify.h"\r
+#include "gl-albums-sel.h"\r
+#include "gl-albums-edit.h"\r
+#include "gl-albums-rename.h"\r
+#include "gl-thumbs-sel.h"\r
+#include "gl-thumbs-edit.h"\r
+#include "gl-tags-edit.h"\r
+\r
+static int __gl_lang_update_all_albums_name(void *data);\r
+\r
+static int __gl_lang_update_tabbar(void *data)\r
+{\r
+ GL_CHECK_VAL(data, -1);\r
+ gl_appdata *ad = (gl_appdata *)data;\r
+ GL_CHECK_VAL(ad->ctrlinfo.ctrlbar, -1);\r
+ Evas_Object *ctrlbar = ad->ctrlinfo.ctrlbar;\r
+\r
+ /*Reset text for tabbar*/\r
+ Elm_Object_Item *item = NULL;\r
+ item = elm_toolbar_first_item_get(ctrlbar);\r
+ elm_object_item_text_set(item, GL_STR_CTRL_ITEM_ALBUMS);\r
+ char *tab_name = NULL;\r
+ int i = GL_CTRL_TAB_TAGS;\r
+ for (; i < GL_CTRL_TAB_CNT; ++i) {\r
+ item = elm_toolbar_item_next_get(item);\r
+ switch (i) {\r
+ case GL_CTRL_TAB_TAGS:\r
+ tab_name = GL_STR_CTRL_ITEM_TAGS;\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+ elm_object_item_text_set(item, tab_name);\r
+ }\r
+ return 0;\r
+}\r
+\r
+static int __gl_lang_update_albums(void *data)\r
+{\r
+ GL_CHECK_VAL(data, -1);\r
+ gl_appdata *ad = (gl_appdata *)data;\r
+ GL_CHECK_VAL(ad->ctrlinfo.nf_it, -1);\r
+\r
+ __gl_lang_update_tabbar(data);\r
+\r
+ /*Album view */\r
+ _gl_ui_set_btns_text(ad->ctrlinfo.nf_it, GL_STR_CAMERA, NULL);\r
+ __gl_lang_update_all_albums_name(ad);\r
+ return 0;\r
+}\r
+\r
+static int __gl_lang_update_thumb(void *data)\r
+{\r
+ GL_CHECK_VAL(data, -1);\r
+ gl_appdata *ad = (gl_appdata *)data;\r
+ GL_CHECK_VAL(ad->gridinfo.nf_it, -1);\r
+ char *title = NULL;\r
+ char *btn_text2 = GL_STR_SLIDESHOW;\r
+\r
+ switch (ad->ctrlinfo.tab_mode) {\r
+ case GL_CTRL_TAB_ALBUMS: {\r
+ GL_CHECK_VAL(ad->albuminfo.current_album, -1);\r
+ gl_cluster *album = ad->albuminfo.current_album;\r
+ GL_CHECK_VAL(album->cluster, -1);\r
+ title = _gl_get_i18n_album_name(album);\r
+ if (album->cluster->type == GL_STORE_T_ALL) {\r
+ title = GL_ALBUM_ALL_NAME;\r
+ } else if (album->cluster->type == GL_STORE_T_PHONE ||\r
+ album->cluster->type == GL_STORE_T_MMC) {\r
+ if (_gl_data_is_root_path(album->cluster->path)) {\r
+ /* check root case */\r
+ title = GL_ALBUM_PHOME_ROOT_NAME;\r
+ } else if (ad->albuminfo.aul_launch_type == GL_AUL_T_VIEW_ALBUM) {\r
+ /* launch by appcontrol */\r
+ if (ad->albuminfo.aul_file_type == GL_AUL_FILE_T_IMAGE)\r
+ title = GL_ALBUM_IMAGES_NAME;\r
+ else if (ad->albuminfo.aul_file_type == GL_AUL_FILE_T_VIDEO)\r
+ title = GL_ALBUM_VIDEOS_NAME;\r
+ else\r
+ title = GL_ALBUM_ALL_NAME;\r
+ }\r
+ }\r
+ break;\r
+ }\r
+ case GL_CTRL_TAB_TAGS: {\r
+ Evas_Object *btn = NULL;\r
+ btn = elm_object_item_part_content_get(ad->gridinfo.nf_it,\r
+ GL_NAVIFRAME_TITLE_RIGHT_BTN);\r
+ if (btn)\r
+ elm_object_text_set(btn, GL_STR_ADD);\r
+ gl_tag *gtag = ad->taginfo.current_tag;\r
+ if (gtag && gtag->tag &&\r
+ gtag->tag->_id == GL_TAG_FAVORITES_ID) {\r
+ GL_FREEIF(gtag->tag->tag_name);\r
+ gtag->tag->tag_name = strdup(GL_TAG_FAVORITES_NAME);\r
+ title = gtag->tag->tag_name;\r
+ }\r
+ break;\r
+ }\r
+ default:\r
+ gl_dbgE("Error tab mode!");\r
+ return -1;\r
+ }\r
+\r
+ _gl_ui_set_btns_text(ad->gridinfo.nf_it, GL_STR_EDIT, btn_text2);\r
+\r
+ if (title) {\r
+ elm_object_item_text_set(ad->gridinfo.nf_it, title);\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+static int __gl_lang_update_all_albums_name(void *data)\r
+{\r
+ GL_CHECK_VAL(data, -1);\r
+ gl_appdata *ad = (gl_appdata *)data;\r
+ gl_cluster *album = NULL;\r
+ Elm_Object_Item *first_it = NULL;\r
+ Elm_Object_Item *next_it = NULL;\r
+ Elm_Object_Item *last_it = NULL;\r
+ Evas_Object *album_view = NULL;\r
+\r
+ if (gl_get_view_mode(ad) == GL_VIEW_ALBUMS)\r
+ album_view = ad->albuminfo.albums_view;\r
+ else if (gl_get_view_mode(ad) == GL_VIEW_ALBUMS_EDIT)\r
+ album_view = ad->ctrlinfo.ctrlbar_edit_view;\r
+ GL_CHECK_VAL(album_view, -1);\r
+\r
+ first_it = elm_gengrid_first_item_get(album_view);\r
+ last_it = elm_gengrid_last_item_get(album_view);\r
+ while(first_it) {\r
+ album = (gl_cluster *)elm_object_item_data_get(first_it);\r
+ if (album == NULL) {\r
+ gl_dbgE("Invalid item data!");\r
+ continue;\r
+ }\r
+ if (!g_strcmp0(album->cluster->uuid, GL_ALBUM_ALL_ID)) {\r
+ GL_FREEIF(album->cluster->display_name);\r
+ album->cluster->display_name = strdup(GL_ALBUM_ALL_NAME);\r
+ elm_gengrid_item_update(first_it);\r
+ } else if (_gl_data_is_default_album(GL_ALBUM_DEFAULT_NAME, album->cluster) ||\r
+ _gl_data_is_default_album(GL_ALBUM_DOWNLOAD_NAME, album->cluster) ||\r
+ _gl_data_is_root_path(album->cluster->path)) {\r
+ elm_gengrid_item_update(first_it);\r
+ }\r
+ if (last_it == first_it) {\r
+ gl_dbg("Update done!");\r
+ break;\r
+ } else {\r
+ next_it = elm_gengrid_item_next_get(first_it);\r
+ first_it = next_it;\r
+ }\r
+ album = NULL;\r
+ }\r
+ return 0;\r
+}\r
+\r
+int _gl_lang_update_thumb_edit_button(void *data, Elm_Object_Item *nf_it)\r
+{\r
+ GL_CHECK_VAL(nf_it, -1);\r
+ GL_CHECK_VAL(data, -1);\r
+ gl_appdata *ad = (gl_appdata *)data;\r
+ char *btn_text = NULL;\r
+ char *btn_text2 = NULL;\r
+\r
+ btn_text = GL_STR_SHARE;\r
+ if (ad->ctrlinfo.tab_mode == GL_CTRL_TAB_ALBUMS)\r
+ btn_text2 = GL_STR_DELETE;\r
+ else\r
+ btn_text2 = GL_STR_REMOVE;\r
+\r
+ _gl_ui_set_btns_text(nf_it, btn_text, btn_text2);\r
+ return 0;\r
+}\r
+\r
+int _gl_lang_update(void *data)\r
+{\r
+ GL_CHECK_VAL(data, -1);\r
+ gl_appdata *ad = (gl_appdata *)data;\r
+ int view_mode = gl_get_view_mode(ad);\r
+\r
+ /* Remove ctxpopup */\r
+ _gl_ctxpopup_del(data);\r
+\r
+ __gl_lang_update_albums(data);\r
+ switch (view_mode) {\r
+ case GL_VIEW_ALBUMS:\r
+ break;\r
+ case GL_VIEW_ALBUMS_EDIT:\r
+ _gl_albums_edit_update_lang(data);\r
+ break;\r
+ case GL_VIEW_ALBUMS_RENAME:\r
+ _gl_albums_edit_update_lang(data);\r
+ _gl_albums_rename_update_lang(data);\r
+ break;\r
+ case GL_VIEW_ALBUMS_SELECT:\r
+ _gl_tags_update_lang(data);\r
+ __gl_lang_update_thumb(data);\r
+ _gl_albums_sel_update_lang(data);\r
+ break;\r
+ case GL_VIEW_TAGS:\r
+ _gl_tags_update_lang(data);\r
+ _gl_albums_rename_update_lang(data);\r
+ break;\r
+ case GL_VIEW_TAGS_EDIT:\r
+ _gl_tags_edit_update_lang(data);\r
+ break;\r
+ case GL_VIEW_THUMBS:\r
+ __gl_lang_update_thumb(data);\r
+ break;\r
+ case GL_VIEW_THUMBS_EDIT:\r
+ __gl_lang_update_thumb(data);\r
+ _gl_thumbs_edit_update_lang(data);\r
+ break;\r
+ case GL_VIEW_THUMBS_SELECT:\r
+ _gl_tags_update_lang(data);\r
+ __gl_lang_update_thumb(data);\r
+ _gl_albums_sel_update_lang(data);\r
+ _gl_thumbs_sel_update_lang(data);\r
+ break;\r
+ default:\r
+ gl_dbgW("Other view_mode[%d]", view_mode);\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <string.h>
+#include <Ecore_X.h>
+#include <glib.h>
+#include <linux/unistd.h>
+#include <pthread.h>
+#include "gl-thread-util.h"
+#include "gl-ui-util.h"
+#include "gl-util.h"
+#include "gl-debug.h"
+#include "gl-data.h"
+#include "gl-popup.h"
+#include "gl-progressbar.h"
+#include "gl-strings.h"
+
+#define GALLERY_MAGIC_MAIN_CONTEXT (0x1983cdaf)
+#define GALLERY_MAGIC_DETAIL_LIST_ITEM (0x1977abcd)
+#define GALLERY_MAGIC_PIPE_DATA (0x0716ffcc)
+
+#define GALLERY_MAGIC unsigned int __magic
+#define GALLERY_MAGIC_SET(d, m) (d)->__magic = (m)
+#define GALLERY_MAGIC_CHECK(d, m) ((d) && ((d)->__magic == (m)))
+
+typedef struct
+{
+ GALLERY_MAGIC;
+ int finished_cnt;
+ int state; /* 0: operation is over; 1: operation is in process */
+ int popup_op;
+} gl_thread_pipe_data;
+
+
+static pid_t
+_gl_thread_gettid(void)
+{
+ return syscall(__NR_gettid);
+}
+
+static int _gl_thread_operate_medias(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ int ret = -1;
+
+ switch (ad->maininfo.medias_op_type) {
+ case GL_MEDIA_OP_DELETE:
+ gl_dbg("Delete!");
+ ret = gl_del_selected(data);
+ break;
+ case GL_MEDIA_OP_MOVE:
+ gl_dbg("Move!");
+ ret = gl_move_selected(data);
+ break;
+ case GL_MEDIA_OP_ADD_TAG:
+ gl_dbg("Add tag to media!");
+ ret = gl_add_tag_to_selected(data);
+ break;
+ case GL_MEDIA_OP_REMOVE_TAG:
+ gl_dbg("Remove tag from media!");
+ ret = gl_remove_tag_from_selected(data);
+ break;
+#ifdef _USE_ROTATE_BG
+ case GL_MEDIA_OP_ROTATING_LEFT:
+ case GL_MEDIA_OP_ROTATING_RIGHT:
+ gl_dbg("Rotate!");
+ ret = _gl_rotate_selected(data, ad->maininfo.medias_op_type);
+ break;
+#endif
+ default:
+ gl_dbgE("Unknow media operation mode!");
+ break;
+ }
+
+ if (ret < 0) {
+ gl_dbgE("Operation failed!");
+ return -1;
+ }
+
+ return 0;
+}
+
+static int
+_gl_thread_update_view(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+
+ switch (ad->maininfo.medias_op_type) {
+ case GL_MEDIA_OP_DELETE:
+ gl_dbg("Delete!");
+ gl_update_del_view(data);
+ break;
+ case GL_MEDIA_OP_MOVE:
+ gl_dbg("Move!");
+ gl_update_move_view(data);
+ break;
+ case GL_MEDIA_OP_ADD_TAG:
+ gl_dbg("Add tag to media!");
+ gl_update_add_tag_view(data);
+ break;
+ case GL_MEDIA_OP_REMOVE_TAG:
+ gl_dbg("Remove tag from media!");
+ gl_update_remove_tag_view(data);
+ break;
+#ifdef _USE_ROTATE_BG
+ case GL_MEDIA_OP_ROTATING_LEFT:
+ case GL_MEDIA_OP_ROTATING_RIGHT:
+ gl_dbg("Rotate!");
+ _gl_update_rotate_view(data);
+ break;
+#endif
+ default:
+ gl_dbgE("Unknow media operation mode!");
+ break;
+ }
+
+ return 0;
+}
+
+static void *
+_gl_thread_data_thread(void *data)
+{
+ GL_CHECK_NULL(data);
+ gl_appdata *ad = (gl_appdata *)data;
+ int cancel_flag = 0;
+
+ gl_dbg("@@@@@@@@@@ :::: Child thread ID = %d :::: @@@@@@@@@@", _gl_thread_gettid());
+ /* Media movement/deleting operation/add tag/remove tag */
+ _gl_thread_operate_medias(data);
+ /* send finish signal */
+ gl_thread_pipe_data pipe_data;
+ memset(&pipe_data, 0x00, sizeof(gl_thread_pipe_data));
+ GALLERY_MAGIC_SET(&pipe_data, GALLERY_MAGIC_PIPE_DATA);
+ /* Set over state */
+ pipe_data.state = 0;
+ gl_thread_get_cancel_state(ad, &cancel_flag);
+
+ ecore_pipe_write(ad->pbarinfo.sync_pipe, &pipe_data, sizeof(gl_thread_pipe_data));
+
+ gl_dbg("@@@@@@@@@@ :::: Child thread done :::: @@@@@@@@@@");
+
+ return (void *)0;
+}
+
+static Eina_Bool _gl_thread_del_pbar_idler_cb(void *data)
+{
+ gl_dbg("Delete progressbar...");
+ GL_CHECK_CANCEL(data);
+ gl_appdata *ad = (gl_appdata *)data;
+ /* Reset pb_cancel */
+ gl_thread_set_cancel_state(ad, GL_PB_CANCEL_NONE);
+ /* Operation done, destroy progressbar */
+ gl_pb_del_pbar(ad);
+
+ /* Destroy lock */
+ gl_thread_destroy_lock(ad);
+
+ if (ad->pbarinfo.del_pbar_idler) {
+ ecore_idler_del(ad->pbarinfo.del_pbar_idler);
+ ad->pbarinfo.del_pbar_idler = NULL;
+ }
+ return ECORE_CALLBACK_CANCEL;
+}
+
+static void _gl_thread_pipe_cb(void *data, void *buffer, unsigned int nbyte)
+{
+ gl_dbg(":::::::::: Main thread ID = %d ::::::::::", _gl_thread_gettid());
+ GL_CHECK(data);
+ GL_CHECK(buffer);
+ gl_appdata *ad = (gl_appdata *)data;
+ gl_thread_pipe_data *p_pipe_data = (gl_thread_pipe_data *) buffer;
+ gl_dbg("Pipe state is %d", p_pipe_data->state);
+
+ if (!GALLERY_MAGIC_CHECK(p_pipe_data, GALLERY_MAGIC_PIPE_DATA)) {
+ gl_dbgE("##### :: Check p_pipe_data Magic failed :: #####");
+ return;
+ }
+
+ int cancel_flag = false;
+ gl_thread_get_cancel_state(ad, &cancel_flag);
+
+ if (p_pipe_data->popup_op)
+ {
+ if (p_pipe_data->state)
+ {
+ /* Check cancel_flag */
+ if (cancel_flag != GL_PB_CANCEL_NORMAL) {
+ gl_dbgE("Failed to kill thread, try again!");
+ gl_thread_emit_next_signal(ad);
+ return;
+ }
+
+ char msg[GL_FILE_PATH_LEN_MAX] = { 0, };
+ gl_item *cur_gitem = NULL;
+ /* Get selected media */
+ _gl_data_get_item_by_index(ad,
+ p_pipe_data->finished_cnt,
+ true, &cur_gitem);
+ GL_CHECK(cur_gitem);
+ GL_CHECK(cur_gitem->item);
+ GL_CHECK(cur_gitem->item->display_name);
+
+ if (p_pipe_data->popup_op == GL_POPUP_OP_SAME_ALBUM)
+ snprintf(msg, sizeof(msg),
+ "Cannot move %s to the same album!",
+ cur_gitem->item->display_name);
+ else if (p_pipe_data->popup_op == GL_POPUP_OP_DUPLICATED_NAME)
+ snprintf(msg, sizeof(msg),
+ "%s is duplicated, rename it!",
+ cur_gitem->item->display_name);
+ else if (p_pipe_data->popup_op == GL_POPUP_OP_PROTECTED_FILE)
+ snprintf(msg, sizeof(msg),
+ "Cannot removed protected file %s!",
+ cur_gitem->item->display_name);
+ gl_dbg("Popup description: %s", msg);
+ gl_popup_create_popup(ad, GL_POPUP_NOBUT_MOV_DEL, msg);
+ }
+ else if (ad->popupinfo.popup)
+ {
+ /*
+ * If p_pipe_data->state is equal to 0,
+ * it means thread should be destoryed.
+ */
+ evas_object_del(ad->popupinfo.popup);
+ ad->popupinfo.popup = NULL;
+ }
+ }
+
+ /* Update progressbar state */
+ int all_cnt = 0;
+ all_cnt = _gl_data_selected_list_count(ad);
+
+ if (p_pipe_data->state) {
+ /* Check cancel_flag */
+ if (cancel_flag != GL_PB_CANCEL_NORMAL) {
+ gl_dbgE("Failed to kill thread, try again!");
+ gl_thread_emit_next_signal(ad);
+ return;
+ }
+ /* 1. Moving/deleting is in porcess */
+ gl_pb_refresh_thread_pbar(ad, p_pipe_data->finished_cnt, all_cnt);
+ gl_dbg("@@@ finished/all = %d/%d, updating progressbar @@@",
+ p_pipe_data->finished_cnt, all_cnt);
+ /* Emit signal to notice child thread handle next media */
+ gl_dbg("Emit next signal...");
+ gl_thread_emit_next_signal(ad);
+ } else {
+ /* 2. Moving/deleting is over, show finished count */
+ gl_dbg("@@@ finished: %d, updating progressbar @@@",
+ ad->pbarinfo.finished_cnt);
+ gl_pb_refresh_thread_pbar(ad, ad->pbarinfo.finished_cnt,
+ ad->pbarinfo.finished_cnt);
+ ad->pbarinfo.finished_cnt = 0;
+ gl_dbg("@@@@@@@ :::: Pipe close && Update view :::: @@@@@@@");
+ int cancel_flag = false;
+ gl_thread_get_cancel_state(ad, &cancel_flag);
+
+ /* Use idler to delete progressbar to refresh status totally */
+ if (ad->pbarinfo.del_pbar_idler) {
+ ecore_idler_del(ad->pbarinfo.del_pbar_idler);
+ ad->pbarinfo.del_pbar_idler = NULL;
+ }
+ Ecore_Idler *idler= NULL;
+
+ idler = ecore_idler_add(_gl_thread_del_pbar_idler_cb,
+ ad);
+ ad->pbarinfo.del_pbar_idler = idler;
+
+ int mmc_state = ad->maininfo.mmc_state;
+ int op_type = ad->maininfo.medias_op_type;
+ gl_dbg("MMC state: %d, OP type: %d.", mmc_state, op_type);
+ /* Operate medias related to MMC while moving medias */
+ if (mmc_state == GL_MMC_STATE_REMOVED_MOVING) {
+ ad->maininfo.mmc_state = GL_MMC_STATE_REMOVED;
+
+ /**
+ * 1, Places: Add tag;
+ * 2, Tags: Add tag/remove tag;
+ * 3, Albums: Move/Delete/Add tag.
+ *
+ * Case 1: Source folder/tag/marker does exist, update view.
+ * Case 2: Source folder is MMC, and it vanished.
+ */
+ gl_cluster *cur_album = ad->albuminfo.current_album;
+ if (cur_album && cur_album->cluster &&
+ cur_album->cluster->type == GL_STORE_T_MMC) {
+ gl_dbgW("MMC removed, change to albums view!");
+ gl_pop_to_ctrlbar_ly(ad, true);
+ } else {
+ /* Update albums list when change to normal view */
+ if (op_type == GL_MEDIA_OP_ADD_TAG)
+ ad->albuminfo.update_albums_list = true;
+ _gl_thread_update_view(ad);
+ }
+ } else {
+ /* Operated files on MMC, reset MMC state */
+ if (mmc_state == GL_MMC_STATE_ADDED_MOVING) {
+ ad->maininfo.mmc_state = GL_MMC_STATE_ADDED;
+ } else if (mmc_state == GL_MMC_STATE_ADDING_MOVING) {
+ ad->maininfo.mmc_state = GL_MMC_STATE_ADDED;
+ /* Update albums list when change to normal view */
+ if (op_type == GL_MEDIA_OP_ADD_TAG)
+ ad->albuminfo.update_albums_list = true;
+ }
+ /* Refresh view */
+ _gl_thread_update_view(ad);
+ }
+
+ /* Free Ecore_Pipe object created */
+ if (ad->pbarinfo.sync_pipe) {
+ ecore_pipe_del(ad->pbarinfo.sync_pipe);
+ ad->pbarinfo.sync_pipe = NULL;
+ }
+
+ /* Set medias_op_type none to stop refreshing view*/
+ ad->maininfo.medias_op_type = GL_MEDIA_OP_NONE;
+ }
+}
+
+/*******************************************************
+** Prototype : gl_thread_emit_next_signal
+** Description : Emit signal to notice child thread handle next media.
+** Input : void *data
+** Output : None
+** Return Value :
+** Calls :
+** Called By :
+**
+** History :
+** 1.Date : 2011/06/10
+** Author : Samsung
+** Modification : Created function
+**
+*********************************************************/
+int
+gl_thread_emit_next_signal(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+
+ pthread_mutex_lock(&(ad->pbarinfo.refresh_lock));
+ gl_dbg("refresh_flag: %d.", ad->pbarinfo.refresh_flag);
+ if (ad->pbarinfo.refresh_flag == 0)
+ {
+ ad->pbarinfo.refresh_flag = 1;
+ pthread_cond_signal(&(ad->pbarinfo.refresh_cond));
+ }
+ pthread_mutex_unlock(&(ad->pbarinfo.refresh_lock));
+
+ return 0;
+}
+
+/*******************************************************
+** Prototype : gl_thread_wait_next_signal
+** Description : Wait start signal to handle next media.
+** Input : void *data
+** Output : None
+** Return Value :
+** Calls :
+** Called By :
+**
+** History :
+** 1.Date : 2011/06/10
+** Author : Samsung
+** Modification : Created function
+**
+*********************************************************/
+int
+gl_thread_wait_next_signal(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+
+ pthread_mutex_lock(&(ad->pbarinfo.refresh_lock));
+ gl_dbg("refresh_flag: %d.", ad->pbarinfo.refresh_flag);
+ while (ad->pbarinfo.refresh_flag == 0)
+ {
+ gl_dbg("Thread waiting...");
+ pthread_cond_wait(&(ad->pbarinfo.refresh_cond), &(ad->pbarinfo.refresh_lock));
+ }
+ ad->pbarinfo.refresh_flag = 0;
+ pthread_mutex_unlock(&(ad->pbarinfo.refresh_lock));
+
+ return 0;
+}
+
+/*******************************************************
+** Prototype : gl_thread_set_cancel_state
+** Description : Set the value of cancel flag.
+** Input : void *data
+** Input : int val
+** Output : None
+** Return Value :
+** Calls :
+** Called By :
+**
+** History :
+** 1.Date : 2011/06/10
+** Author : Samsung
+** Modification : Created function
+**
+*********************************************************/
+int
+gl_thread_set_cancel_state(void *data, int val)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+
+ pthread_mutex_lock(&(ad->pbarinfo.pbar_lock));
+ ad->pbarinfo.pbar_cancel = val;
+ pthread_mutex_unlock(&(ad->pbarinfo.pbar_lock));
+
+ return 0;
+}
+
+/*******************************************************
+** Prototype : gl_thread_get_cancel_state
+** Description : Get the value of cancel flag.
+** Input : void *data
+** Output : int* val
+** Return Value :
+** Calls :
+** Called By :
+**
+** History :
+** 1.Date : 2011/06/10
+** Author : Samsung
+** Modification : Created function
+**
+*********************************************************/
+int
+gl_thread_get_cancel_state(void *data, int *val)
+{
+ GL_CHECK_VAL(val, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+
+ pthread_mutex_lock(&(ad->pbarinfo.pbar_lock));
+ *val = ad->pbarinfo.pbar_cancel;
+ pthread_mutex_unlock(&(ad->pbarinfo.pbar_lock));
+
+ return 0;
+}
+
+
+/*******************************************************
+** Prototype : gl_thread_write_pipe
+** Description : Write date to pipe in order to make progressbar refreshed
+** Input : void *data
+** Input : int finished_cnt
+** Input : int popup_op
+** Output : None
+** Return Value :
+** Calls :
+** Called By :
+**
+** History :
+** 1.Date : 2011/06/10
+** Author : Samsung
+** Modification : Created function
+**
+*********************************************************/
+void
+gl_thread_write_pipe(void *data, int finished_cnt, int popup_op)
+{
+ GL_CHECK(data);
+ gl_appdata *ad = (gl_appdata *)data;
+ int cancel_flag = false;
+
+ gl_dbg("Wait next signal...");
+ gl_thread_wait_next_signal(ad);
+
+ gl_thread_pipe_data pipe_data;
+ memset(&pipe_data, 0x00, sizeof(gl_thread_pipe_data));
+ GALLERY_MAGIC_SET(&pipe_data, GALLERY_MAGIC_PIPE_DATA);
+
+ pipe_data.state = 1;
+ pipe_data.finished_cnt = finished_cnt;
+ pipe_data.popup_op = popup_op;
+
+ gl_thread_get_cancel_state(ad, &cancel_flag);
+
+ if (cancel_flag == GL_PB_CANCEL_BUTTON ||
+ cancel_flag == GL_PB_CANCEL_MMC ||
+ cancel_flag == GL_PB_CANCEL_ERROR ||
+ cancel_flag == GL_PB_CANCEL_RESET)
+ {
+ //send cancel signal through pipe
+ pipe_data.finished_cnt = -1;
+ /* Set over state */
+ pipe_data.state = 0;
+ ecore_pipe_write(ad->pbarinfo.sync_pipe, &pipe_data, sizeof(gl_thread_pipe_data));
+ //exit the child thread
+ if (cancel_flag == GL_PB_CANCEL_BUTTON)
+ {
+ gl_dbg("Cancel button tapped, child thread exit!");
+ }
+ else if (cancel_flag == GL_PB_CANCEL_MMC)
+ {
+ gl_dbg("MMC removed, child thread exit!");
+ }
+ else if (cancel_flag == GL_PB_CANCEL_ERROR)
+ {
+ gl_dbg("Error happened, child thread exit!");
+ }
+ else if (cancel_flag == GL_PB_CANCEL_RESET) {
+ gl_dbg("Reset gallery, child thread exit!");
+ }
+
+ pthread_exit((void *)1);
+ }
+ else
+ {
+ gl_dbg("Writing pipe...");
+ ecore_pipe_write(ad->pbarinfo.sync_pipe, &pipe_data, sizeof(gl_thread_pipe_data));
+ }
+}
+
+/*******************************************************
+** Prototype : gl_thread_gen_data_thread
+** Description : Create child thread for moving or deleting medias
+** Input : void *data
+** Output : None
+** Return Value :
+** Calls :
+** Called By :
+**
+** History :
+** 1.Date : 2011/06/10
+** Author : Samsung
+** Modification : Created function
+**
+*********************************************************/
+int
+gl_thread_gen_data_thread(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ pthread_t tid;
+ pthread_attr_t attr;
+ int ret = -1;
+
+ gl_dbg("Creating child thread.");
+ //add pipe for update progressbar status
+ ad->pbarinfo.sync_pipe = ecore_pipe_add(_gl_thread_pipe_cb, ad);
+ //initialize thread attributes
+ ret = pthread_attr_init(&attr);
+ if (ret == 0)
+ {
+ ret = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
+ if (ret == 0)
+ {
+ //create child thread
+ ret = pthread_create(&tid, &attr, _gl_thread_data_thread, ad);
+ if (ret != 0)
+ {
+ gl_dbgE("[Error] ##### :: pthread_create failed :: #####");
+ pthread_attr_destroy(&attr);
+ return -1;
+ }
+ }
+ }
+
+ gl_dbg("\n\n[Done] @@@@@@@@@@ :::: pthread_create successfull :::: @@@@@@@@@@\n");
+ pthread_attr_destroy(&attr);
+
+ return 0;
+}
+
+/*******************************************************
+** Prototype : gl_thread_destroy_lock
+** Description : Destroy mutex lock.
+** Input : void *data
+** Output : None
+** Return Value :
+** Calls :
+** Called By :
+**
+** History :
+** 1.Date : 2011/06/10
+** Author : Samsung
+** Modification : Created function
+**
+*********************************************************/
+int
+gl_thread_destroy_lock(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ gl_dbg("@@@@@@@@@@ :::: Destroy MUTEX :::: @@@@@@@@@@");
+
+ /**
+ * The variable below was accessed without holding a guarding lock.
+ * In a multithreaded environment, this can lead to a race condition.
+ * Add lock to prevent from RC.
+ */
+ pthread_mutex_lock(&(ad->pbarinfo.refresh_lock));
+ ad->pbarinfo.refresh_flag = 0;
+ pthread_mutex_unlock(&(ad->pbarinfo.refresh_lock));
+
+ pthread_cond_destroy(&(ad->pbarinfo.refresh_cond));
+ pthread_mutex_destroy(&(ad->pbarinfo.pbar_lock));
+ pthread_mutex_destroy(&(ad->pbarinfo.refresh_lock));
+
+ return 0;
+}
+
+/*******************************************************
+** Prototype : gl_thread_init_lock
+** Description : Initialize mutex lock
+** Input : void *data
+** Output : None
+** Return Value :
+** Calls :
+** Called By :
+**
+** History :
+** 1.Date : 2011/06/10
+** Author : Samsung
+** Modification : Created function
+**
+*********************************************************/
+int
+gl_thread_init_lock(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ gl_dbg("@@@@@@@@@@ :::: Initialize MUTEX :::: @@@@@@@@@@");
+
+ pthread_mutex_init(&(ad->pbarinfo.pbar_lock), NULL);
+ pthread_mutex_init(&(ad->pbarinfo.refresh_lock), NULL);
+ pthread_cond_init(&(ad->pbarinfo.refresh_cond), NULL);
+
+ /**
+ * The variable below was accessed without holding a guarding lock.
+ * In a multithreaded environment, this can lead to a race condition.
+ * Add lock to prevent from RC.
+ */
+ pthread_mutex_lock(&(ad->pbarinfo.refresh_lock));
+ ad->pbarinfo.refresh_flag = 0;
+ pthread_mutex_unlock(&(ad->pbarinfo.refresh_lock));
+
+ return 0;
+}
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <string.h>
+#include <Ecore_X.h>
+#include <glib.h>
+#include "gl-fs.h"
+#include "gl-ui-util.h"
+#include "gl-util.h"
+#include "gl-ext-ug-load.h"
+#include "gl-ext-exec.h"
+#include "gl-button.h"
+#include "gl-thumbs.h"
+#include "gl-controlbar.h"
+#include "gl-albums.h"
+#include "gl-debug.h"
+#include "gl-data.h"
+#include "gl-tags.h"
+#include "gl-thread-util.h"
+#include "gl-popup.h"
+#include "gl-ctxpopup.h"
+#include "gl-progressbar.h"
+#include "gl-albums-sel.h"
+#include "gl-albums-new.h"
+#include "gl-albums-edit.h"
+#include "gl-thumbs-edit.h"
+#include "gl-strings.h"
+#include "gl-icons.h"
+#include "gl-notify.h"
+
+#define GL_SELALL_TIMER_INT 0.5
+
+/**
+ * Launch camera
+ */
+static void __gl_ui_camera_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ GL_CHECK(data);
+ gl_dbg("");
+ _gl_ext_load_camera();
+}
+
+/* Use timer to prevent lockup when click select-all frequently */
+static Eina_Bool __gl_ui_selall_timer_cb(void *data)
+{
+ GL_CHECK_FALSE(data);
+ gl_appdata *ad = (gl_appdata *)data;
+ if (ad->selectedinfo.selall_timer) {
+ ecore_timer_del(ad->selectedinfo.selall_timer);
+ ad->selectedinfo.selall_timer = NULL;
+ }
+ return ECORE_CALLBACK_CANCEL;
+}
+
+/* Select-all checkbox selected/deselected */
+static void _gl_ui_selall_check_changed(void *data, Evas_Object *obj,
+ void *event_info)
+{
+ GL_CHECK(obj);
+ GL_CHECK(data);
+ gl_appdata *ad = (gl_appdata *)data;
+ int view_mode = gl_get_view_mode(ad);
+ gl_dbg("view_mode: %d.", view_mode);
+
+ if (ad->selectedinfo.selall_timer) {
+ gl_dbgW("Wait a sec!");
+ elm_check_state_set(obj, ad->selectedinfo.ck_state);
+ return;
+ }
+
+ ad->selectedinfo.selall_timer = ecore_timer_add(GL_SELALL_TIMER_INT,
+ __gl_ui_selall_timer_cb,
+ data);
+ int i = 0;
+ int item_cnt = 0;
+ int sel_all_cnt = 0;
+ Eina_Bool state = EINA_FALSE;
+ state = elm_check_state_get(obj);
+ gl_dbg("Checkbox state: %d.", state);
+ ad->selectedinfo.ck_state = state;
+
+ if (view_mode == GL_VIEW_TAGS_EDIT) {
+ item_cnt = _gl_data_get_tag_count_all(ad);
+ sel_all_cnt = item_cnt - 1; /* minus favorites tag */
+ gl_tag *gtag = NULL;
+
+ for (i = 0; i < item_cnt; i++) {
+ _gl_data_get_tag_by_index(ad, >ag, i);
+ if (!gtag || !gtag->tag)
+ continue;
+
+ if (gtag->checked == state ||
+ gtag->tag->_id == GL_TAG_FAVORITES_ID)
+ continue;
+
+ gtag->checked = state;
+ if (state == EINA_TRUE)
+ _gl_data_tags_selected_list_append(ad, gtag);
+ else
+ _gl_data_tags_selected_list_remove(ad, gtag);
+ }
+
+ /* Update all realized items */
+ elm_genlist_realized_items_update(ad->ctrlinfo.ctrlbar_edit_view);
+ } else if (view_mode == GL_VIEW_ALBUMS_EDIT) {
+ gl_cluster *album = NULL;
+ Elm_Object_Item *first_it = NULL;
+ Elm_Object_Item *next_it = NULL;
+ Elm_Object_Item *last_it = NULL;
+ first_it = elm_gengrid_first_item_get(ad->ctrlinfo.ctrlbar_edit_view);
+ last_it = elm_gengrid_last_item_get(ad->ctrlinfo.ctrlbar_edit_view);
+ while(first_it) {
+ /* Get data */
+ item_cnt++;
+ album = (gl_cluster *)elm_object_item_data_get(first_it);
+ if (album == NULL) {
+ gl_dbgE("Invalid item data!");
+ continue;
+ }
+
+ if (album->checked == state){
+ /* Get next item */
+ next_it = elm_gengrid_item_next_get(first_it);
+ first_it = next_it;
+ album = NULL;
+ continue;
+ }
+
+ /* Update checkbox state */
+ album->checked = state;
+ /* Update selected list */
+ if (state == EINA_TRUE)
+ _gl_data_albums_selected_list_append(ad, album);
+ else
+ _gl_data_albums_selected_list_remove(ad, album);
+ /* Update UI */
+ /* elm_gengrid_item_update(first_it); */
+
+ if (last_it == first_it) {
+ gl_dbg("Update done!");
+ break;
+ } else {
+ next_it = elm_gengrid_item_next_get(first_it);
+ first_it = next_it;
+ }
+ album = NULL;
+ }
+ /* Update all realized items */
+ elm_gengrid_realized_items_update(ad->ctrlinfo.ctrlbar_edit_view);
+ /* Update selected album count */
+ sel_all_cnt = item_cnt;
+ } else if (view_mode == GL_VIEW_THUMBS_SELECT) {
+ /* Get all medias count of current album */
+ gl_item *gitem = NULL;
+ item_cnt = ad->maininfo.medias_cnt;
+ sel_all_cnt = item_cnt;
+ for (i = 0; i < item_cnt; i++) {
+ _gl_data_get_item_by_index(ad, i + 1, false, &gitem);
+ GL_CHECK(gitem);
+ GL_CHECK(gitem->item);
+
+ if (gitem->checked == state)
+ continue;
+
+ gitem->checked = state;
+ /* elm_gengrid_item_update(gitem->elm_item); */
+
+ if (state == EINA_TRUE)
+ _gl_data_selected_list_append(ad, gitem);
+ else
+ _gl_data_selected_list_remove(ad, gitem);
+ }
+ /* Update all realized items */
+ elm_gengrid_realized_items_update(ad->gridinfo.select_view);
+ } else {
+ /* Get all medias count of current album */
+ item_cnt = ad->maininfo.medias_cnt;
+ sel_all_cnt = item_cnt;
+ int grid_mode = ad->gridinfo.view_mode;
+ media_content_type_e file_type = MEDIA_CONTENT_TYPE_IMAGE;
+ if (view_mode == GL_VIEW_THUMBS_EDIT) {
+ if (grid_mode == GL_THUMB_IMAGES) {
+ file_type = MEDIA_CONTENT_TYPE_IMAGE;
+ sel_all_cnt = 0;
+ } else if (grid_mode == GL_THUMB_VIDEOS) {
+ file_type = MEDIA_CONTENT_TYPE_VIDEO;
+ sel_all_cnt = 0;
+ }
+ }
+ gl_dbg("grid_mode=%d", grid_mode);
+ gl_item *gitem = NULL;
+ for (i = 0; i < item_cnt; i++) {
+ _gl_data_get_item_by_index(ad, i + 1, false, &gitem);
+ GL_CHECK(gitem);
+ GL_CHECK(gitem->item);
+
+ if (gitem->checked == state && grid_mode == GL_THUMB_ALL)
+ continue;
+
+ if (view_mode == GL_VIEW_THUMBS_EDIT) {
+ if ((grid_mode == GL_THUMB_IMAGES) ||
+ (grid_mode == GL_THUMB_VIDEOS)) {
+ if (gitem->item->type != file_type)
+ continue;
+
+ sel_all_cnt++;
+ if (gitem->checked == state)
+ continue;
+ }
+ }
+ gitem->checked = state;
+
+ if (state == EINA_TRUE)
+ _gl_data_selected_list_append(ad, gitem);
+ else
+ _gl_data_selected_list_remove(ad, gitem);
+
+ }
+ /* Update all realized items */
+ elm_gengrid_realized_items_update(ad->gridinfo.navi_content_edit_view);
+ }
+
+ /* Recreate selection info for both cases */
+ if (state == EINA_FALSE)
+ sel_all_cnt = 0;
+
+ if (view_mode == GL_VIEW_TAGS_EDIT ||
+ view_mode == GL_VIEW_ALBUMS_EDIT) {
+ _gl_notify_create_selinfo(ad, ad->ctrlinfo.ctrlbar_edit_ly,
+ ad->ctrlinfo.nf_it_edit, item_cnt,
+ sel_all_cnt, false);
+ if (view_mode == GL_VIEW_TAGS_EDIT)
+ gl_tag_unset_rename(ad);
+ } else if (view_mode == GL_VIEW_THUMBS_SELECT){
+ _gl_notify_create_selinfo(ad, ad->gridinfo.select_view_ly,
+ ad->gridinfo.nf_it_select, item_cnt,
+ sel_all_cnt, false);
+ } else {
+ _gl_notify_create_selinfo(ad, ad->gridinfo.navi_content_edit_ly,
+ ad->gridinfo.nf_it_edit, item_cnt,
+ sel_all_cnt, false);
+ }
+}
+
+/* Select-all background click, selected/deselected checkbox */
+static void _gl_ui_selall_bg_click_cb(void *data, Evas_Object *o,
+ const char *emission,
+ const char *source)
+{
+ GL_CHECK(data);
+ gl_appdata *ad = (gl_appdata *)data;
+ int view_mode = gl_get_view_mode(ad);
+ Evas_Object *ly = NULL;
+ gl_dbg("view_mode: %d.", view_mode);
+
+ if (ad->selectedinfo.selall_timer) {
+ gl_dbgW("Wait a sec!");
+ return;
+ }
+
+ ly = _gl_ui_get_view_layout(data, view_mode);
+ GL_CHECK(ly);
+
+ Evas_Object *check = elm_object_part_content_get(ly, "selectall_check");
+ if (check) {
+ Eina_Bool new_state = EINA_FALSE;
+ Eina_Bool ck_state = elm_check_state_get(check);
+ /* uncheck->check */
+ if (ck_state == EINA_FALSE)
+ new_state = EINA_TRUE;
+
+ elm_check_state_set(check, new_state);
+
+ _gl_ui_selall_check_changed(ad, check, NULL);
+ } else {
+ gl_dbgE("Get select all checkbox object failed!");
+ }
+}
+
+void _gl_ui_edit_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ GL_CHECK(data);
+ gl_appdata *ad = (gl_appdata *)data;
+ if (ad->uginfo.ug_called_by_me || ad->gridinfo.grid_append_idler) {
+ /**
+ * Prevent changed to edit view in wrong way.
+ * 1. When invoke imageviewer UG;
+ * 2. First show thumbnails view, use idler to append other medias.
+ */
+ gl_dbg("UG invoked or appending gridview.");
+ return;
+ }
+ _gl_ctxpopup_del(data);
+
+ int view_mode = gl_get_view_mode(data);
+ gl_dbg("mode: %d", view_mode);
+ if (view_mode == GL_VIEW_ALBUMS) {
+ _gl_albums_edit_create_view(data);
+ } else if (view_mode == GL_VIEW_THUMBS) {
+ _gl_thumbs_edit_create_view(data);
+ }
+}
+
+static void __gl_ui_add_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ GL_CHECK(data);
+ gl_appdata *ad = (gl_appdata *)data;
+ gl_dbg("");
+
+ if (ad->uginfo.ug_called_by_me || ad->uginfo.app_called_by_me) {
+ gl_dbgW("UG or APP is already loaded!");
+ return;
+ }
+
+ int view_mode = gl_get_view_mode(ad);
+ if (view_mode == GL_VIEW_THUMBS) {
+ /* Clear selected list */
+ _gl_notify_destroy_selinfo(ad);
+ /* Clear thumbnails edit view */
+
+ _gl_albums_sel_create_view(data);
+ } else {
+ gl_dbgE("Wrong view mode!");
+ }
+}
+
+Evas_Object *_gl_ui_get_view_layout(void *data, int view_mode)
+{
+ GL_CHECK_NULL(data);
+ gl_appdata *ad = (gl_appdata *)data;
+ Evas_Object *view_ly = NULL;
+
+ gl_dbg("view_mode: %d", view_mode);
+ switch (view_mode) {
+ case GL_VIEW_ALBUMS_EDIT:
+ case GL_VIEW_TAGS_EDIT:
+ view_ly = ad->ctrlinfo.ctrlbar_edit_ly;
+ break;
+ case GL_VIEW_THUMBS_EDIT:
+ view_ly = ad->gridinfo.navi_content_edit_ly;
+ break;
+ case GL_VIEW_THUMBS_SELECT:
+ view_ly = ad->gridinfo.select_view_ly;
+ break;
+ default:
+ gl_dbgE("Wrong view!");
+ return NULL;
+ }
+
+ return view_ly;
+}
+
+/**
+* Update checkbox state in select-all widget
+*/
+int _gl_ui_update_selall(void *data, int all_cnt, int selected_cnt)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ int i = 0;
+ gl_item *gitem = NULL;
+ int _all_cnt = 0;
+ int db_all_cnt = 0;
+ media_content_type_e file_type = MEDIA_CONTENT_TYPE_IMAGE;
+ int view_mode = gl_get_view_mode(ad);
+ Evas_Object *ly = NULL;
+
+ if (view_mode == GL_VIEW_THUMBS_EDIT) {
+ /* Get all medias count */
+ db_all_cnt = ad->maininfo.medias_cnt;
+ int grid_mode = ad->gridinfo.view_mode;
+ if (grid_mode == GL_THUMB_ALL) {
+ _all_cnt = db_all_cnt;
+ } else {
+ /* Get all count in diff segments */
+ if (grid_mode == GL_THUMB_IMAGES)
+ file_type = MEDIA_CONTENT_TYPE_IMAGE;
+ else if (grid_mode == GL_THUMB_VIDEOS)
+ file_type = MEDIA_CONTENT_TYPE_VIDEO;
+
+ for (i = 1; i <= db_all_cnt; i++) {
+ _gl_data_get_item_by_index(ad, i, false, &gitem);
+ if (gitem && gitem->item &&
+ (gitem->item->type == file_type))
+ _all_cnt++;
+ }
+ }
+ ly = ad->gridinfo.navi_content_edit_ly;
+ } else if (view_mode == GL_VIEW_THUMBS_SELECT) {
+ /* Get all medias count */
+ _all_cnt = ad->maininfo.medias_cnt;
+ ly = ad->gridinfo.select_view_ly;
+ } else if (view_mode == GL_VIEW_TAGS_EDIT) {
+ db_all_cnt = _gl_data_get_tag_count_all(ad);
+ /* Minus favorites tag, it's excluded in edit view . */
+ _all_cnt = db_all_cnt - 1;
+ ly = ad->ctrlinfo.ctrlbar_edit_ly;
+ } else if (view_mode == GL_VIEW_ALBUMS_EDIT) {
+ _all_cnt = ad->albuminfo.albums_cnt;
+ ly = ad->ctrlinfo.ctrlbar_edit_ly;
+ } else {
+ gl_dbg("Wrong view mode!");
+ return 0;
+ }
+
+ /**
+ * Set checkbox state
+ * except in albums edit view and selectioninfo view
+ */
+ gl_dbg("selected_cnt/_all_cnt = %d/%d", selected_cnt, _all_cnt);
+ Evas_Object *check = NULL;
+ Eina_Bool state = EINA_FALSE;
+ /* Set checkbox checked/unchecked */
+ if (selected_cnt == _all_cnt)
+ state = EINA_TRUE;
+ else
+ state = EINA_FALSE;
+
+ check = elm_object_part_content_get(ly, "selectall_check");
+ if (check)
+ elm_check_state_set(check, state);
+ return 0;
+}
+
+static void __gl_ui_albums_more_btn_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ gl_dbg("more button clicked");
+ /* Add 'Edit' + 'Add web album' */
+ GL_CHECK(data);
+ _gl_ctxpopup_create_albums(data, obj);
+}
+
+static void __gl_ui_thumbs_more_btn_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ gl_dbg("more button clicked");
+ /* Add 'Add to home' */
+ GL_CHECK(data);
+ _gl_ctxpopup_create_thumbs(data, obj);
+}
+
+/* pause gallery and change view to background after tap Back button in albums view */
+static void __gl_ui_lower_to_bg_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ GL_CHECK(data);
+
+ gl_appdata *ad = (gl_appdata *)data;
+ GL_CHECK(ad->maininfo.win);
+ gl_dbgW("Lower Gallery to background!");
+ elm_win_lower(ad->maininfo.win);
+}
+
+static void __gl_ui_trans_finished_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ GL_CHECK(data);
+ gl_appdata *ad = (gl_appdata *)data;
+ int view_mode = gl_get_view_mode(ad);
+ gl_dbgW("view_mode: %d", view_mode);
+ evas_object_smart_callback_del(obj, GL_TRANS_FINISHED,
+ __gl_ui_trans_finished_cb);
+
+ /* Clear previous view after animation finished */
+ if (view_mode == GL_VIEW_THUMBS) {
+ if (ad->ctrlinfo.tab_mode == GL_CTRL_TAB_ALBUMS)
+ elm_gengrid_clear(ad->albuminfo.albums_view);
+ else if (ad->ctrlinfo.tab_mode == GL_CTRL_TAB_TAGS)
+ elm_genlist_clear(ad->taginfo.tags_view);
+ } else {
+ gl_dbgE("Wrong view mode!");
+ }
+}
+
+static void __gl_ui_show_title_toolbar(void *data, Evas_Object *obj,
+ void *event_info)
+{
+ GL_CHECK(data);
+ gl_dbg("elm,state,sip,shown");
+ return;
+}
+
+static void __gl_ui_hide_title_toolbar(void *data, Evas_Object *obj,
+ void *event_info)
+{
+ GL_CHECK(data);
+ gl_dbg("elm,state,sip,hidden");
+ return;
+}
+
+void _gl_ui_slideshow_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ GL_CHECK(data);
+ _gl_ctxpopup_del(data);
+ _gl_slideshow(data);
+}
+
+/**
+ * Use naviframe api to push albums view to stack.
+ * @param obj is the content to be pushed.
+ */
+static int __gl_ui_push_view_albums(void *data, Evas_Object *parent,
+ Evas_Object *obj)
+{
+ gl_dbg("GL_NAVI_ALBUMS");
+ GL_CHECK_VAL(obj, -1);
+ GL_CHECK_VAL(parent, -1);
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ Elm_Object_Item *nf_it = NULL;
+ Evas_Object *end_btn = NULL;
+
+ /**
+ * add End button in navigation var first view in galery
+ * with style "naviframe/back_btn/gallery"
+ * so after tap this button,gallery is paused
+ * but change view to background
+ */
+ GL_CHECK_VAL(ad->maininfo.win, -1);
+ end_btn = _gl_but_create_but(parent, NULL, NULL,
+ GL_BUTTON_STYLE_NAVI_PRE,
+ __gl_ui_lower_to_bg_cb, ad);
+ GL_CHECK_VAL(end_btn, -1);
+ /* Push view to stack */
+ gl_dbg_launch(" elm_naviframe_item_push:start");
+ nf_it = elm_naviframe_item_push(parent, NULL, end_btn, NULL, obj,
+ GL_NF_ANI_TABBAR);
+ elm_naviframe_item_title_visible_set(nf_it, EINA_FALSE);
+ gl_dbg_launch(" elm_naviframe_item_push:end");
+ ad->ctrlinfo.nf_it = nf_it;
+
+ /* add buttons */
+ _gl_ui_add_btns_albums(ad, GL_UI_ALBUMS_FIRST);
+ return 0;
+}
+
+/**
+ * Use naviframe api to push thumbnails view to stack.
+ * @param obj is the content to be pushed.
+ */
+static int __gl_ui_push_view_thumbs(void *data, Evas_Object *parent,
+ Evas_Object *obj, char *title)
+{
+ gl_dbg("GL_NAVI_THUMBS");
+ GL_CHECK_VAL(obj, -1);
+ GL_CHECK_VAL(parent, -1);
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ Elm_Object_Item *nf_it = NULL;
+ bool b_add_slideshow = false;
+ bool b_add_more = false;
+
+ _gl_ctrl_show_tabbar(ad, false);
+
+ /* Add transition finished callback */
+ evas_object_smart_callback_add(parent, GL_TRANS_FINISHED,
+ __gl_ui_trans_finished_cb, ad);
+ /* Push to stack with basic transition */
+ nf_it = elm_naviframe_item_push(parent, title, NULL, NULL, obj,
+ NULL);
+ ad->gridinfo.nf_it = nf_it;
+
+ Evas_Object *btn = NULL;
+ /* Add Edit button */
+ btn = _gl_but_create_but(parent, NULL, GL_STR_EDIT,
+ GL_BUTTON_STYLE_NAVI_TOOLBAR_LEFT,
+ _gl_ui_edit_cb, data);
+ GL_CHECK_VAL(btn, -1);
+ ad->gridinfo.edit_btn = btn;
+ elm_object_item_part_content_set(nf_it, GL_NAVIFRAME_BTN1, btn);
+
+ gl_dbg("tab_mode: %d", ad->ctrlinfo.tab_mode);
+ switch (ad->ctrlinfo.tab_mode) {
+ case GL_CTRL_TAB_ALBUMS:
+ b_add_slideshow = true;
+ b_add_more = true;
+ break;
+ case GL_CTRL_TAB_TAGS:
+ b_add_slideshow = true;
+ b_add_more = true;
+ _gl_ui_show_add_btn(ad);
+ break;
+ default:
+ gl_dbgE("Wrong tab mode!");
+ return -1;
+ }
+
+ if (b_add_slideshow) {
+ /* Add slide show button */
+ gl_dbg("Add slideshow button");
+ btn = _gl_but_create_but(parent, NULL, GL_STR_SLIDESHOW,
+ GL_BUTTON_STYLE_NAVI_TOOLBAR_RIGHT,
+ _gl_ui_slideshow_cb, ad);
+ elm_object_item_part_content_set(nf_it, GL_NAVIFRAME_BTN2, btn);
+ ad->gridinfo.slideshow_btn = btn;
+ if(ad->maininfo.medias_cnt <= 0)
+ _gl_ui_disable_slideshow(ad, true);
+ }
+
+ if (b_add_more) {
+ /* More */
+ btn = _gl_but_create_but(parent, NULL, NULL,
+ GL_BUTTON_STYLE_NAVI_MORE,
+ __gl_ui_thumbs_more_btn_cb, data);
+ GL_CHECK_VAL(btn, -1);
+ elm_object_item_part_content_set(nf_it, GL_NAVIFRAME_MORE, btn);
+ if (ad->maininfo.medias_cnt <= 0)
+ _gl_ui_disable_btn(btn);
+ }
+
+ if (ad->maininfo.medias_cnt <= 0)
+ _gl_ui_disable_btn(ad->gridinfo.edit_btn);
+ return 0;
+}
+
+int _gl_ui_disable_slideshow(void *data, bool b_disable)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ int view_mode = gl_get_view_mode(ad);
+ gl_dbg("view_mode: %d, b_disable: %d", view_mode, b_disable);
+
+ if (view_mode == GL_VIEW_THUMBS)
+ elm_object_disabled_set(ad->gridinfo.slideshow_btn, b_disable);
+ else if (view_mode == GL_VIEW_THUMBS_EDIT)
+ ad->gridinfo.b_slideshow_disable = b_disable;
+ return 0;
+}
+
+/*
+ * @param b_add, true: add 'Add' button, unset 'Add' button otherwise.
+ */
+int _gl_ui_show_add_btn(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ Evas_Object *add_btn = NULL;
+ bool b_disable = false;
+ int err = -1;
+ int item_cnt = 0;
+ err = _gl_data_get_item_cnt(ad, GL_ALBUM_ALL_ID, false, GL_STORE_T_ALL,
+ &item_cnt);
+ if (err != 0 || item_cnt == 0) {
+ gl_dbg("None local albums, disable button.");
+ /* Disable button */
+ b_disable = true;
+ }
+ gl_dbg("b_disable: %d", b_disable);
+ add_btn = elm_object_item_part_content_get(ad->gridinfo.nf_it,
+ GL_NAVIFRAME_TITLE_RIGHT_BTN);
+ if (add_btn) {
+ elm_object_disabled_set(add_btn, b_disable);
+ return 0;
+ }
+ add_btn = _gl_but_create_but(ad->maininfo.naviframe, GL_CBAR_ICON_ADD,
+ NULL, GL_BUTTON_STYLE_NAVI_TITLE_PLUS,
+ __gl_ui_add_cb, ad);
+ GL_CHECK_VAL(add_btn, -1);
+ elm_object_disabled_set(add_btn, b_disable);
+ elm_object_item_part_content_set(ad->gridinfo.nf_it,
+ GL_NAVIFRAME_TITLE_RIGHT_BTN, add_btn);
+ return 0;
+}
+
+int _gl_ui_clear_btns(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ Evas_Object *btn = NULL;
+ gl_dbg("");
+
+ /* Remove more and camera */
+ btn = _gl_ui_get_btn(data, NULL, GL_NAVIFRAME_MORE);
+ if (btn) {
+ evas_object_del(btn);
+ btn = NULL;
+ }
+ btn = _gl_ui_get_btn(data, NULL, GL_NAVIFRAME_BTN1);
+ if (btn) {
+ evas_object_del(btn);
+ btn = NULL;
+ }
+ btn = _gl_ui_get_btn(data, NULL, GL_NAVIFRAME_BTN2);
+ if (btn) {
+ evas_object_del(btn);
+ btn = NULL;
+ }
+ return 0;
+}
+
+/**
+ * When push albums view for the first time, albums list is empty.
+ * After albums list got from DB then update edit item state.
+ * @param bool b_first, true, push albums view for the first time, enable edit item.
+ */
+int _gl_ui_add_btns_albums(void *data, int type)
+{
+ gl_dbg("type: %d", type);
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ GL_CHECK_VAL(ad->maininfo.naviframe, -1);
+ GL_CHECK_VAL(ad->ctrlinfo.nf_it, -1);
+ Evas_Object *parent = ad->maininfo.naviframe;
+ Elm_Object_Item *nf_it = ad->ctrlinfo.nf_it;
+ Evas_Object *btn = NULL;
+
+ /* Remove btns */
+ _gl_ui_clear_btns(data);
+ /* More */
+ btn = _gl_but_create_but(parent, NULL, NULL,
+ GL_BUTTON_STYLE_NAVI_MORE,
+ __gl_ui_albums_more_btn_cb, data);
+ GL_CHECK_VAL(btn, -1);
+ elm_object_item_part_content_set(nf_it, GL_NAVIFRAME_MORE, btn);
+ /* Camera */
+ btn = _gl_but_create_but(parent, NULL, GL_STR_CAMERA,
+ GL_BUTTON_STYLE_NAVI_TOOLBAR,
+ __gl_ui_camera_cb, data);
+ GL_CHECK_VAL(btn, -1);
+ elm_object_item_part_content_set(nf_it, GL_NAVIFRAME_BTN1, btn);
+
+ /* Disable items in exit mode */
+ if ((!gl_check_gallery_empty(ad) &&
+ ad->albuminfo.cluster_list->edit_cnt) ||
+ (type == GL_UI_ALBUMS_FIRST)) {
+ ad->albuminfo.b_edit_disable = false;
+ } else {
+ ad->albuminfo.b_edit_disable = true;
+ }
+
+ return 0;
+}
+
+int gl_ui_create_title_and_push(void *data, Evas_Object *parent,
+ Evas_Object *obj, gl_navi_mode mode, char *title)
+{
+ gl_dbg_launch(" gl_ui_create_title_and_push:start");
+ GL_CHECK_VAL(obj, -1);
+ GL_CHECK_VAL(parent, -1);
+ GL_CHECK_VAL(data, -1);
+
+ if (mode == GL_NAVI_ALBUMS)
+ __gl_ui_push_view_albums(data, parent, obj);
+ else if (mode == GL_NAVI_THUMBS)
+ __gl_ui_push_view_thumbs(data, parent, obj, title);
+ gl_dbg("Done");
+ gl_dbg_launch(" gl_ui_create_title_and_push:end");
+ return 0;
+}
+
+Evas_Object *
+gl_ui_load_edj(Evas_Object * parent, const char *file, const char *group)
+{
+ Evas_Object *eo = NULL;
+ int r = 0;
+
+ eo = elm_layout_add(parent);
+ if (eo)
+ {
+ r = elm_layout_file_set(eo, file, group);
+ if (!r)
+ {
+ evas_object_del(eo);
+ return NULL;
+ }
+
+ evas_object_size_hint_weight_set(eo, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(eo, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ }
+
+ return eo;
+}
+
+/* Remove selection and edit view then pop to normal thumbnail view */
+int _gl_ui_pop_to_thumb(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ /* Delete edit view and update thumbnail view */
+ _gl_thumbs_edit_pop_view(data);
+ return 0;
+}
+
+/**
+* Update checkbox state and add click signal to Select-all widget.
+* Show arrow button in thumbnails/list edit mode.
+*/
+int gl_ui_show_selall(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ int view_mode = gl_get_view_mode(ad);
+ Eina_Bool ck_state = EINA_FALSE;
+ Evas_Object *view_ly = NULL;
+ char *sig = GL_SIGNAL_VIEW_SELALL_SHOW;
+
+ gl_dbg("view_mode: %d.", view_mode);
+ if (view_mode == GL_VIEW_THUMBS_EDIT) {
+ view_ly = ad->gridinfo.navi_content_edit_ly;
+ if (ad->maininfo.medias_cnt == _gl_data_selected_list_count(ad))
+ ck_state = EINA_TRUE;
+ } else if (view_mode == GL_VIEW_THUMBS_SELECT) {
+ view_ly = ad->gridinfo.select_view_ly;
+ } else if (view_mode == GL_VIEW_TAGS_EDIT) {
+ /* in Tags view */
+ view_ly = ad->ctrlinfo.ctrlbar_edit_ly;
+ int cnt_all = _gl_data_get_tag_count_all(ad);
+ /* Check hidden item: "favorites" tag */
+ if (cnt_all == _gl_data_get_tags_selected_cnt(ad) + 1)
+ ck_state = EINA_TRUE;
+ sig = GL_SIGNAL_VIEW_SELALL_TAG;
+ } else if (view_mode == GL_VIEW_ALBUMS_EDIT) {
+ /* in Albums view */
+ view_ly = ad->ctrlinfo.ctrlbar_edit_ly;
+ if (ad->albuminfo.albums_cnt == _gl_data_get_albums_selected_cnt(ad))
+ ck_state = EINA_TRUE;
+ } else {
+ gl_dbgE("Wrong view!");
+ return -1;
+ }
+
+ const char *text = NULL;
+ text = edje_object_part_text_get(_EDJ(view_ly), "selectall_text");
+ if (text == NULL || g_strcmp0(text, GL_STR_SELECT_ALL))
+ edje_object_part_text_set(_EDJ(view_ly), "selectall_text",
+ GL_STR_SELECT_ALL);
+
+ Evas_Object *old_check = NULL;
+ old_check = elm_object_part_content_unset(view_ly, "selectall_check");
+ if (old_check)
+ evas_object_del(old_check);
+
+ Evas_Object *check = elm_check_add(view_ly);
+ evas_object_propagate_events_set(check, EINA_FALSE);
+ elm_check_state_set(check, ck_state);
+
+ elm_object_part_content_set(view_ly, "selectall_check", check);
+ evas_object_smart_callback_add(check, "changed",
+ _gl_ui_selall_check_changed, ad);
+ edje_object_signal_emit(_EDJ(view_ly), sig, "elm");
+
+ /* Add signal to select-all bg */
+ edje_object_signal_callback_del(_EDJ(view_ly), "elm,action,click",
+ "selectall_bg",
+ _gl_ui_selall_bg_click_cb);
+ edje_object_signal_callback_add(_EDJ(view_ly), "elm,action,click",
+ "selectall_bg",
+ _gl_ui_selall_bg_click_cb, ad);
+
+ return 0;
+}
+
+/* Update checkbox state of Select-all and selectioninfo */
+int gl_ui_update_select_widgets(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+
+ /* Update checkbox state of Select-all */
+ gl_ui_show_selall(ad);
+ /* Update selectioninfo */
+ int cnt = 0;
+ int sel_cnt = 0;
+ Evas_Object *layout = NULL;
+ Elm_Object_Item *nf_it = NULL;
+
+ cnt = ad->maininfo.medias_cnt;
+ sel_cnt = _gl_data_selected_list_count(ad);
+ layout = ad->gridinfo.navi_content_edit_ly;
+ nf_it = ad->gridinfo.nf_it_edit;
+ _gl_notify_create_selinfo(ad, layout, nf_it , cnt, sel_cnt, false);
+ return 0;
+}
+
+Evas_Object *gl_ui_create_main_ly(Evas_Object *parent)
+{
+ gl_dbg_launch(" gl_ui_create_main_ly:start");
+ GL_CHECK_NULL(parent);
+ Evas_Object *layout = NULL;
+
+ layout = elm_layout_add(parent);
+ GL_CHECK_NULL(layout);
+
+ /* Apply the layout style */
+ gl_dbg_launch(" elm_layout_theme_set:start");
+
+ const char *profile = elm_config_profile_get();
+ if (!g_strcmp0(profile, "mobile")) {
+ elm_layout_theme_set(layout, "layout", "application", "default");
+ } else if (!g_strcmp0(profile,"extension")) {
+ elm_layout_theme_set(layout, "layout", "application",
+ "noindicator");
+ }
+
+ gl_dbg_launch(" elm_layout_theme_set:end");
+ evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND,
+ EVAS_HINT_EXPAND);
+ evas_object_show(layout);
+ gl_dbg_launch(" gl_ui_create_main_ly:end");
+
+ return layout;
+}
+
+Evas_Object *gl_ui_create_naviframe(Evas_Object *parent)
+{
+ GL_CHECK_NULL(parent);
+ Evas_Object *navi_bar = NULL;
+ gl_dbg_launch(" gl_ui_create_naviframe:start");
+
+ navi_bar = elm_naviframe_add(parent);
+ gl_dbg("elm_naviframe_add:done");
+ evas_object_show(navi_bar);
+ gl_dbg_launch(" gl_ui_create_naviframe:end");
+
+ return navi_bar;
+}
+
+int gl_ui_set_navi_title_visible(void *data, bool b_visible)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ GL_CHECK_VAL(ad->maininfo.naviframe, -1);
+ Elm_Object_Item *it = NULL;
+ it = elm_naviframe_top_item_get(ad->maininfo.naviframe);
+ GL_CHECK_VAL(it, -1);
+ /* Hide title from animation */
+ elm_naviframe_item_title_visible_set(it, b_visible);
+ return 0;
+}
+
+int _gl_ui_add_conform_cbs(Evas_Object *naviframe)
+{
+ GL_CHECK_VAL(naviframe, -1);
+ Evas_Object *conform = NULL;
+
+ /* Get conformant */
+ conform = (Evas_Object *)evas_object_data_get(naviframe,
+ GL_NAVIFRAME_OBJ_DATA_KEY);
+ GL_CHECK_VAL(conform, -1);
+
+ evas_object_smart_callback_add(conform, GL_IMF_ON,
+ __gl_ui_show_title_toolbar, naviframe);
+ evas_object_smart_callback_add(conform, GL_IMF_OFF,
+ __gl_ui_hide_title_toolbar, naviframe);
+ return 0;
+}
+
+int _gl_ui_del_conform_cbs(Evas_Object *naviframe)
+{
+ GL_CHECK_VAL(naviframe, -1);
+ Evas_Object *conform = NULL;
+
+ /* Get conformant */
+ conform = (Evas_Object *)evas_object_data_get(naviframe,
+ GL_NAVIFRAME_OBJ_DATA_KEY);
+ GL_CHECK_VAL(conform, -1);
+
+ evas_object_smart_callback_del(conform, GL_IMF_ON,
+ __gl_ui_show_title_toolbar);
+ evas_object_smart_callback_del(conform, GL_IMF_OFF,
+ __gl_ui_hide_title_toolbar);
+ return 0;
+}
+
+int _gl_ui_disable_btn(Evas_Object *btn)
+{
+ if (btn)
+ elm_object_disabled_set(btn, EINA_TRUE);
+ return 0;
+}
+
+int _gl_ui_enable_btn(Evas_Object *btn)
+{
+ if(btn)
+ elm_object_disabled_set(btn, EINA_FALSE);
+ return 0;
+}
+
+/* Set each button(more/btn1/btn2) as each state respectively */
+int _gl_ui_disable_each_btn(Elm_Object_Item *nf_it, bool b_more, bool b_btn1,
+ bool b_btn2)
+{
+ GL_CHECK_VAL(nf_it, -1);
+ Evas_Object *btn = NULL;
+ gl_dbg("more/btn1/btn2 state: %d/%d/%d", b_more, b_btn1, b_btn2);
+ btn = elm_object_item_part_content_get(nf_it, GL_NAVIFRAME_MORE);
+ if (btn)
+ elm_object_disabled_set(btn, b_more);
+ btn = elm_object_item_part_content_get(nf_it, GL_NAVIFRAME_BTN1);
+ if (btn)
+ elm_object_disabled_set(btn, b_btn1);
+ btn = elm_object_item_part_content_get(nf_it, GL_NAVIFRAME_BTN2);
+ if (btn)
+ elm_object_disabled_set(btn, b_btn2);
+ return 0;
+}
+
+int _gl_ui_set_btns_text(Elm_Object_Item *nf_it, char *btn_text,
+ char *btn_text2)
+{
+ GL_CHECK_VAL(nf_it, -1);
+
+ Evas_Object *btn = NULL;
+ if (btn_text) {
+ btn = elm_object_item_part_content_get(nf_it, GL_NAVIFRAME_BTN1);
+ if (btn)
+ elm_object_text_set(btn, btn_text);
+ }
+ if (btn_text2) {
+ btn = elm_object_item_part_content_get(nf_it, GL_NAVIFRAME_BTN2);
+ if (btn)
+ elm_object_text_set(btn, btn_text2);
+ }
+ return 0;
+}
+
+/* Set all buttons(more/btn1/btn2) as same state */
+int _gl_ui_disable_btns(Elm_Object_Item *nf_it, bool b_disable)
+{
+ return _gl_ui_disable_each_btn(nf_it, b_disable, b_disable, b_disable);
+}
+
+/* Get button*/
+Evas_Object *_gl_ui_get_btn(void *data, Elm_Object_Item *nf_it,
+ const char *part)
+{
+ Elm_Object_Item *_nf_it = nf_it;
+
+ if (_nf_it == NULL) {
+ GL_CHECK_NULL(data);
+ gl_appdata *ad = (gl_appdata *)data;
+ _nf_it = elm_naviframe_top_item_get(ad->maininfo.naviframe);
+ GL_CHECK_NULL(_nf_it);
+ }
+
+ return elm_object_item_part_content_get(_nf_it, part);
+}
+
+int _gl_ui_reset_scroller_pos(Evas_Object *obj)
+{
+ GL_CHECK_VAL(obj, -1);
+ evas_object_data_set(obj, "prev_scroller_x", (void *)0);
+ evas_object_data_set(obj, "prev_scroller_y", (void *)0);
+ evas_object_data_set(obj, "prev_scroller_w", (void *)0);
+ evas_object_data_set(obj, "prev_scroller_h", (void *)0);
+ return 0;
+}
+
+int _gl_ui_del_scroller_pos(Evas_Object *obj)
+{
+ GL_CHECK_VAL(obj, -1);
+ evas_object_data_del(obj, "prev_scroller_x");
+ evas_object_data_del(obj, "prev_scroller_y");
+ evas_object_data_del(obj, "prev_scroller_w");
+ evas_object_data_del(obj, "prev_scroller_h");
+ return 0;
+}
+
+int _gl_ui_save_scroller_pos(Evas_Object *obj)
+{
+ GL_CHECK_VAL(obj, -1);
+ Evas_Coord x = 0;
+ Evas_Coord y = 0;
+ Evas_Coord w = 0;
+ Evas_Coord h = 0;
+
+ elm_scroller_region_get(obj, &x, &y, &w, &h);
+ gl_dbg("(%dx%d), (%dx%d)", x, y, w, h);
+ evas_object_data_set(obj, "prev_scroller_x", (void *)x);
+ evas_object_data_set(obj, "prev_scroller_y", (void *)y);
+ evas_object_data_set(obj, "prev_scroller_w", (void *)w);
+ evas_object_data_set(obj, "prev_scroller_h", (void *)h);
+ return 0;
+}
+
+int _gl_ui_restore_scroller_pos(Evas_Object *obj)
+{
+ GL_CHECK_VAL(obj, -1);
+ Evas_Coord x = 0;
+ Evas_Coord y = 0;
+ Evas_Coord w = 0;
+ Evas_Coord h = 0;
+
+ x = (Evas_Coord)evas_object_data_get(obj, "prev_scroller_x");
+ y = (Evas_Coord)evas_object_data_get(obj, "prev_scroller_y");
+ w = (Evas_Coord)evas_object_data_get(obj, "prev_scroller_w");
+ h = (Evas_Coord)evas_object_data_get(obj, "prev_scroller_h");
+ gl_dbg("(%dx%d), (%dx%d)", x, y, w, h);
+ if (w > 0 && h > 0)
+ elm_scroller_region_show(obj, x, y, w, h);
+ return 0;
+}
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <vconf.h>
+#include <vconf-keys.h>
+#include "gl-debug.h"
+#include "gallery.h"
+#include "gl-albums.h"
+#include "gl-thumbs.h"
+#include "gl-util.h"
+#include "gl-ui-util.h"
+#include "gl-controlbar.h"
+#include "gl-tags.h"
+#include "gl-thread-util.h"
+#include "gl-popup.h"
+#include "gl-ctxpopup.h"
+#include "gl-progressbar.h"
+#include "gl-ext-ug-load.h"
+#include "gl-ext-exec.h"
+#include "gl-tags-new.h"
+#include "gl-albums-sel.h"
+#include "gl-albums-edit.h"
+#include "gl-thumbs-sel.h"
+#include "gl-drm.h"
+#include "gl-nocontents.h"
+#include "gl-notify.h"
+#include "gl-editfield.h"
+#include "gl-strings.h"
+#include "gl-icons.h"
+#include "gl-data-type.h"
+#include "gl-fs.h"
+#ifdef _USE_ROTATE_BG
+#include "gl-exif.h"
+#endif
+
+#define GL_FILE_COPY_BUF_MAX 16384
+/* Time for displaying progressbar UI compeletely */
+#define GL_TIMER_INTERVAL_PBAR_SHOWED 0.5
+#define GL_TIMER_INTERVAL_VIBRATION 0.5
+#define GL_VIBRATION_DEVICE 0
+#define GL_VIBRATION_DURATION 500
+#ifdef _USE_ROTATE_BG
+#define GL_ROTATE_DELAY 0.25
+#endif
+
+static int __gl_refresh_albums_list(void *data, bool b_path, bool b_select);
+
+/* Use timer to show progressbar totally before write pipe */
+static Eina_Bool _gl_start_thread_op_timer_cb(void *data)
+{
+ gl_dbg("Emit START signal...");
+ GL_CHECK_CANCEL(data);
+ gl_appdata *ad = (gl_appdata *)data;
+ /* Emit signal to notice child thread to handle next item. */
+ gl_thread_emit_next_signal(ad);
+ if (ad->pbarinfo.start_thread_timer) {
+ ecore_timer_del(ad->pbarinfo.start_thread_timer);
+ ad->pbarinfo.start_thread_timer = NULL;
+ }
+ return ECORE_CALLBACK_CANCEL;
+}
+
+/**
+* Use thread to move/delete/add tag to/remove tag from medias
+* for displaying progrssabar UI
+*/
+int _gl_use_thread_operate_medias(void *data, char *pbar_title, int all_cnt,
+ int op_type)
+{
+ gl_dbg("all_cnt: %d, op_type: %d.", all_cnt, op_type);
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+
+ /* Initialize thread mutex lock */
+ gl_thread_init_lock(ad);
+ /* Make progressbar */
+ gl_pb_make_thread_pbar(ad, ad->maininfo.win, pbar_title);
+ /* Set pb_cancel, indicates thread operation is beginning */
+ gl_thread_set_cancel_state(ad, GL_PB_CANCEL_NORMAL);
+ /* Initialize progressbar */
+ gl_pb_refresh_thread_pbar(ad, 0, all_cnt);
+ /* Use timer to emit next signal to show progressbarbar totally */
+ if (ad->pbarinfo.start_thread_timer) {
+ ecore_timer_del(ad->pbarinfo.start_thread_timer);
+ ad->pbarinfo.start_thread_timer = NULL;
+ }
+ Ecore_Timer *timer = NULL;
+ timer = ecore_timer_add(GL_TIMER_INTERVAL_PBAR_SHOWED,
+ _gl_start_thread_op_timer_cb, ad);
+ ad->pbarinfo.start_thread_timer = timer;
+ /* Set media operation type */
+ ad->maininfo.medias_op_type = op_type;
+ /* Generate child thread */
+ gl_thread_gen_data_thread(ad);
+ return 0;
+}
+
+/*
+* remove selected items(media) from some tag.
+*/
+static int _gl_remove_tag_items(void *data, gl_tag * cur_tag)
+{
+ gl_dbg("");
+ GL_CHECK_VAL(cur_tag, -1);
+ GL_CHECK_VAL(cur_tag->tag, -1);
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+
+ /* Get all selected medias count */
+ int cnt = _gl_data_selected_list_count(ad);
+ if (cnt == 0) {
+ gl_dbg("No items selected, return!");
+ gl_popup_create_popup(ad, GL_POPUP_NOBUT,
+ GL_STR_NO_FILES_SELECTED);
+ return -1;
+ }
+
+ gl_dbg("Remove tag[%s] from medias.", cur_tag->tag->tag_name);
+ /* Check MMC state for cancel operation */
+ gl_check_mmc_state(ad, NULL);
+ gl_dbg("MMC state: %d.", ad->maininfo.mmc_state);
+ _gl_use_thread_operate_medias(ad, GL_STR_REMOVE, cnt,
+ GL_MEDIA_OP_REMOVE_TAG);
+ return 0;
+}
+
+static void _gl_db_update_noti_cb(keynode_t *key, void *data)
+{
+ GL_CHECK(data);
+ gl_appdata *ad = (gl_appdata *)data;
+ gl_dbgW("VCONFKEY_FILEMANAGER_DB_STATUS changed!");
+ int mmc_state = -1;
+
+ vconf_get_int(VCONFKEY_SYSMAN_MMC_STATUS, &mmc_state);
+
+ if (mmc_state == -1) {
+ gl_dbgE("Error when check MMC Status");
+ return;
+ }
+
+ if (mmc_state == VCONFKEY_SYSMAN_MMC_MOUNTED) {
+ gl_dbg("mmc_state[%d] : VCONFKEY_SYSMAN_MMC_MOUNTED", mmc_state);
+ if (ad->maininfo.mmc_state == GL_MMC_STATE_REMOVED)
+ ad->maininfo.mmc_state = GL_MMC_STATE_ADDING_MOVING;
+ else
+ ad->maininfo.mmc_state = GL_MMC_STATE_ADDED;
+
+ gl_update_view(ad, GL_UPDATE_VIEW_MMC_ADDED);
+ /* Remove ctxpopup */
+ _gl_ctxpopup_del(ad);
+ } else if (mmc_state == VCONFKEY_SYSMAN_MMC_REMOVED ||
+ mmc_state == VCONFKEY_SYSMAN_MMC_INSERTED_NOT_MOUNTED) {
+ gl_dbg("mmc_state[%d] : VCONFKEY_SYSMAN_MMC_REMOVED", mmc_state);
+ if (ad->maininfo.mmc_state == GL_MMC_STATE_ADDED_MOVING) {
+ /*
+ * Set pb_cancel status,
+ * indicates MMC removed while moving or deleting.
+ */
+ gl_thread_set_cancel_state(ad, GL_PB_CANCEL_MMC);
+ /* MMC moved while moving or deleting */
+ ad->maininfo.mmc_state = GL_MMC_STATE_REMOVED_MOVING;
+ } else if (ad->maininfo.mmc_state == GL_MMC_STATE_REMOVED_MOVING) {
+ gl_dbgW("View updated on GL_MMC_STATE_ADDED_MOVING");
+ return;
+ } else {
+ /* MMC is extracted */
+ ad->maininfo.mmc_state = GL_MMC_STATE_REMOVED;
+ }
+
+ gl_update_view(ad, GL_UPDATE_VIEW_MMC_REMOVED);
+ /* Remove ctxpopup */
+ _gl_ctxpopup_del(ad);
+ }
+}
+
+/**
+* @param: b_update_albums_list
+* True: Update albums list and medias list, then update normal view.
+* False: Get new medias for current view from DB
+* then update view to synchronize data with Myfile.
+* Use case:
+* Update edit gridview/listview.
+*/
+static int _gl_update_thumb_items(void *data, bool b_update_albums_list)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ int view_mode = gl_get_view_mode(ad);
+ bool b_edit_m = false;
+
+ gl_dbg("view_mode: %d, b_update_albums_list: %d.", view_mode,
+ b_update_albums_list);
+ if (view_mode == GL_VIEW_THUMBS_EDIT) {
+ gl_dbg("Edit view.");
+ b_edit_m = true;
+ }
+
+ /**
+ * 1, Update albums list and medias_elist,
+ * 2, Update medias_elist.
+ */
+ if (b_update_albums_list)
+ gl_refresh_albums_list(ad);
+ else
+ _gl_data_update_item_list(ad);
+
+ if (ad->maininfo.medias_cnt == 0) {
+ if (ad->ctrlinfo.tab_mode == GL_CTRL_TAB_TAGS) {
+ gl_dbgW("It's s empty tag!");
+ /* Remove invalid widgets */
+ gl_del_invalid_widgets(ad, GL_INVALID_NEW_ENTRY_NOC);
+ /* Show nocontents */
+ _gl_nocontents_show(ad);
+ return 0;
+ }
+ /* All items deleted, change to albms view */
+ gl_pop_to_ctrlbar_ly(ad, !b_update_albums_list);
+ } else {
+ if (_gl_nocontents_show(ad)) {
+ gl_dbg("none video/image, show nocontents");
+ /* Remove invalid widgets */
+ gl_del_invalid_widgets(ad, GL_INVALID_NEW_ENTRY_NOC);
+ } else if (view_mode == GL_VIEW_THUMBS) {
+ _gl_thumbs_update_view(ad);
+ } else if (view_mode == GL_VIEW_THUMBS_EDIT) {
+ _gl_thumbs_show_edit_view(ad);
+ }
+
+ /* Normal view, return */
+ if (!b_edit_m)
+ return 0;
+
+ /* Get selected medias count */
+ int sel_cnt = _gl_data_selected_list_count(ad);
+ /* Remove invalid widgets */
+ if (sel_cnt == 0)
+ gl_del_invalid_widgets(ad, GL_INVALID_NEW_ENTRY);
+
+ /* Display selectioninfo */
+ _gl_notify_create_selinfo(ad, ad->gridinfo.navi_content_edit_ly,
+ ad->gridinfo.nf_it_edit,
+ ad->maininfo.medias_cnt, sel_cnt,
+ true);
+
+ /**
+ * Update albums list when change to normal view.
+ * Maybe some empty albums exist.
+ */
+ if (ad->ctrlinfo.tab_mode == GL_CTRL_TAB_ALBUMS &&
+ !b_update_albums_list) {
+ gl_dbg("Update albums list when cancelled.");
+ ad->albuminfo.update_albums_list = true;
+ }
+ }
+
+ return 0;
+}
+
+/* Update in select thunb view for Tags */
+static int _gl_update_select_thumb_items(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ int view_mode = gl_get_view_mode(ad);
+
+ gl_dbg("view_mode: %d", view_mode);
+ if (view_mode != GL_VIEW_THUMBS_SELECT) {
+ gl_dbg("Not in Select view.");
+ return -1;
+ }
+
+#ifdef _USE_ROTATE_BG
+ __gl_refresh_albums_list(data, false, true);
+#else
+ /* Checkme: albums list is not updated */
+ _gl_data_update_item_list_without_tag(ad, ad->albuminfo.current_album,
+ _gl_tags_get_current_tag_name(ad));
+#endif
+
+ if (ad->maininfo.medias_cnt == 0) {
+ if (ad->gridinfo.select_view) {
+ _gl_thumbs_clear_cbs(ad->gridinfo.select_view);
+ ad->gridinfo.select_view = NULL;
+ }
+ ad->gridinfo.select_view_ly = NULL;
+ int err = -1;
+ int item_cnt = 0;
+ err = _gl_data_get_item_cnt(ad, GL_ALBUM_ALL_ID, false,
+ GL_STORE_T_ALL, &item_cnt);
+ /* Destroy select albums view */
+ if (err != 0 || item_cnt == 0) {
+ gl_dbg("None local albums.");
+ _gl_albums_sel_pop_view(ad);
+ } else {
+ gl_dbg("Empty album.");
+ _gl_thumbs_sel_pop_view(ad);
+ }
+ return 0;
+ } else {
+ _gl_thumbs_show_edit_view(ad);
+
+ /* Get selected medias count */
+ int sel_cnt = _gl_data_selected_list_count(ad);
+ /* Remove invalid widgets */
+ if (sel_cnt == 0)
+ gl_del_invalid_widgets(ad, GL_INVALID_NEW_ENTRY);
+
+ /* Display selectioninfo */
+ _gl_notify_create_selinfo(ad, ad->gridinfo.select_view_ly,
+ ad->gridinfo.nf_it_select,
+ ad->maininfo.medias_cnt, sel_cnt,
+ true);
+ }
+
+ return 0;
+}
+
+/* Check if there is any MMC file contained in select_medias_elist */
+static bool _gl_check_mmc_file_selected(void *data)
+{
+ gl_dbg("");
+ GL_CHECK_FALSE(data);
+ gl_appdata *ad = (gl_appdata *)data;
+ gl_item *gitem = NULL;
+ int i = 0;
+ int on_mmc = -1;
+ int cnt = _gl_data_selected_list_count(ad);
+ for (i = 0; i < cnt; i++) {
+ gitem = NULL;
+ on_mmc = -1;
+
+ gitem = _gl_data_selected_list_get_nth(ad, i);
+ /* File on MMC is selected */
+ if (gitem && gitem->item && gitem->item->file_url) {
+ on_mmc = strncmp(GL_ROOT_PATH_MMC,
+ gitem->item->file_url,
+ strlen(GL_ROOT_PATH_MMC));
+ if (on_mmc == 0)
+ return true;;
+ }
+ }
+ return false;
+}
+
+/* Stop vibrate device */
+static int _gl_stop_vibration(void *data)
+{
+ gl_dbg("");
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ GL_CHECK_VAL(ad->entryinfo.device_handle, -1);
+ GL_CHECK_VAL(ad->entryinfo.effect_handle, -1);
+ int ret = -1;
+
+ if (ad->entryinfo.haptic_handle >= 0) {
+ ret = haptic_stop_effect(*(ad->entryinfo.device_handle),
+ *(ad->entryinfo.effect_handle));
+ if (ret != 0)
+ gl_dbgE("haptic_stop_effect failed[%d]!", ret);
+
+ ad->entryinfo.haptic_handle = -1;
+ }
+ GL_FREEIF(ad->entryinfo.device_handle);
+ GL_FREEIF(ad->entryinfo.effect_handle);
+
+ return 0;
+}
+
+static Eina_Bool _gl_vibration_timer_cb(void *data)
+{
+ gl_dbg("");
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+
+ _gl_stop_vibration(data);
+
+ if (ad->entryinfo.vibration_timer) {
+ ecore_timer_del(ad->entryinfo.vibration_timer);
+ ad->entryinfo.vibration_timer = NULL;
+ }
+ return ECORE_CALLBACK_CANCEL;
+}
+
+/* Move thumbnail and file */
+static Eina_Bool __gl_file_mv(gl_item *gitem, const char *src, const char *dst)
+{
+ GL_CHECK_FALSE(src);
+ GL_CHECK_FALSE(dst);
+ GL_CHECK_FALSE(gitem);
+ /* Move thumb first */
+ if (_gl_fs_move(src, dst)) {
+ if (_gl_local_data_move_media(gitem->item, dst) < 0) {
+ gl_dbgE("Move media thumbnail failed!");
+ return EINA_FALSE;
+ }
+ return EINA_TRUE;
+ }
+ return EINA_FALSE;
+}
+
+#ifdef _USE_ROTATE_BG
+/* b_path == true, Use saved folder path to check cluster uuid
+ * b_select == true, Update albums in select view for tag adding
+ */
+static int __gl_refresh_albums_list(void *data, bool b_path, bool b_select)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ gl_cluster *current_album = ad->albuminfo.current_album;
+ char *uuid = NULL;
+ gl_cluster *current = NULL;
+ bool b_get_cur_album = false;
+ /* Albums list would be update, reset flag */
+ ad->albuminfo.update_albums_list = false;
+
+ uuid = calloc(1, GL_MTYPE_ITEN_ID_LEN_MAX);
+ GL_CHECK_VAL(uuid, -1);
+
+ /* Save cluster ID to set new current_album from new albums list */
+ if (current_album && current_album->cluster &&
+ current_album->cluster->uuid) {
+ g_strlcpy(uuid, current_album->cluster->uuid,
+ GL_MTYPE_ITEN_ID_LEN_MAX);
+ b_get_cur_album = true;
+ } else {
+ gl_dbg("None album selected, current album is unavailable.");
+ }
+
+ _gl_data_get_cluster_list(ad);
+ /* need to reset current album */
+ ad->albuminfo.current_album = NULL;
+
+ if (b_get_cur_album) {
+ if (b_path) {
+ gl_dbg("Path: %s", ad->albuminfo.dest_folder);
+ if (strlen(ad->albuminfo.dest_folder) > 0 &&
+ GL_FILE_EXISTS(ad->albuminfo.dest_folder)) {
+ gl_dbgW("Cluster record updated!");
+ _gl_data_get_cluster_by_path(ad,
+ ad->albuminfo.dest_folder,
+ ¤t);
+ } else {
+ gl_dbgE("Invalid folder path!");
+ _gl_data_get_cluster_by_id(ad, uuid, ¤t);
+ }
+ } else {
+ _gl_data_get_cluster_by_id(ad, uuid, ¤t);
+ }
+
+ if(current && current->cluster) {
+ ad->albuminfo.current_album = current;
+ gl_dbg("Reset current album: %s",
+ current->cluster->display_name);
+ if (b_select)
+ _gl_data_update_item_list_without_tag(ad,
+ current,
+ _gl_tags_get_current_tag_name(ad));
+ else
+ _gl_data_update_item_list(ad);
+ } else {
+ /* Clear items list if current album doesn't exist */
+ if (ad->selectedinfo.medias_elist)
+ _gl_data_selected_list_finalize(ad);
+ _gl_data_clear_default_item_list(ad);
+ ad->maininfo.medias_cnt = 0;
+ }
+ }
+
+ GL_FREEIF(uuid);
+ return 0;
+}
+
+#endif
+
+int gl_get_entry_text(Evas_Object * entry, char *entry_text, int len_max)
+{
+ gl_dbg("");
+ GL_CHECK_VAL(entry_text, -1);
+ GL_CHECK_VAL(entry, -1);
+
+ memset(entry_text, 0x00, len_max);
+
+ char *entry_str = (char *)elm_entry_entry_get(entry);
+ if (entry_str)
+ {
+ if (strlen(entry_str) == 0)
+ {
+ gl_dbg("Entry string is empty!");
+ }
+ else
+ {
+ char *entry_utf8 = elm_entry_markup_to_utf8(entry_str); // changes user input to utf-8 encoding format
+ if (entry_utf8 == NULL)
+ {
+ gl_dbgE("Make entry string to UTF8 failed!");
+ return -1;
+ }
+ else if (strlen(entry_utf8) == 0)
+ {
+ gl_dbg("Entry text is empty!");
+ }
+ else
+ {
+ g_strlcpy(entry_text, entry_utf8, len_max);
+ entry_text[len_max - 1] = '\0';
+ }
+
+ GL_FREE(entry_utf8);
+ }
+ }
+ else
+ {
+ gl_dbgE("Get entry string failed!");
+ return -1;
+ }
+
+ return 0;
+}
+
+/**
+* Change utf8 string to markup, then set it as entry text.
+* To fix special character "&" issue, to convert "&" to "&". f.e.
+* Myfiles->rename folder to AB&C->Gallery/Rename ->displayed as "AB"
+*/
+int gl_set_entry_text(Evas_Object *entry, char *entry_text)
+{
+ GL_CHECK_VAL(entry, -1);
+ char *entry_makeup = NULL;
+ gl_dbg("Entry UTF8 text: %s.", entry_text);
+
+ if (entry_text) {
+ entry_makeup = elm_entry_utf8_to_markup(entry_text);
+ if (entry_makeup == NULL) {
+ gl_dbgE("Make utf8 string to makeup failed!");
+ return -1;
+ }
+ gl_dbg("Entry makeup text: %s.", entry_makeup);
+ }
+ /* Empty string set if entry_makeup is NULL */
+ elm_entry_entry_set(entry, entry_makeup);
+
+ GL_FREEIF(entry_makeup);
+ return 0;
+}
+
+/**
+* Check album name is valid and remove unuseful characters
+* 1) not only includes space;
+* 2) contains invalid character;
+* 3) it's empty.
+*
+* @param b_new
+* true: add a new album ; false: rename a album.
+* @param b_enter
+* true: Enter key pressed ; false: Button Done clicked.
+*
+*/
+int _gl_get_valid_album_name(void *data, char* album_name, bool b_new,
+ bool b_enter)
+{
+ GL_CHECK_VAL(album_name, -1);
+ GL_CHECK_VAL(data, -1);
+ gl_appdata* ad = (gl_appdata*)data;
+ int mode = 0;
+ gl_dbg("Input album name: %s", album_name);
+ char *popup_desc;
+ popup_desc = (char*)calloc(GL_POPUP_STRING_MAX, sizeof(char));
+ if (popup_desc == NULL) {
+ gl_dbg("memory allocation fail");
+ return -1;
+ }
+ /* Check album name length */
+ if (strlen(album_name) == 0) {
+ gl_dbgW("Inserted text is empty!");
+ if (b_enter) {
+ gl_dbg("Enter key pressed.");
+ goto INVALID_ALBUM_NAME;
+ }
+
+ if (b_new)
+ mode = GL_POPUP_ALBUM_NEW_EMPTY;
+ else
+ mode = GL_POPUP_ALBUM_RENAME_EMPTY;
+ snprintf(popup_desc, GL_POPUP_STRING_MAX, "%s.<br>%s",
+ GL_STR_ENTRY_IS_EMPTY, GL_STR_RETRY_Q);
+ popup_desc[strlen(popup_desc)] = '\0';
+ gl_popup_create_popup(ad, mode, popup_desc);
+ goto INVALID_ALBUM_NAME;
+ }
+ gl_dbg("Inserted album name: %s, length: %d", album_name, strlen(album_name));
+
+ /* Removes leading and trailing whitespace */
+ g_strstrip((gchar*)album_name);
+ if (strlen(album_name) == 0) {
+ gl_dbgW("Album name includes only space!");
+ if (b_enter) {
+ gl_dbg("Enter key pressed.");
+ goto INVALID_ALBUM_NAME;
+ }
+
+ if (b_new)
+ mode = GL_POPUP_ALBUM_NEW_EMPTY;
+ else
+ mode = GL_POPUP_ALBUM_RENAME_EMPTY;
+ snprintf(popup_desc, GL_POPUP_STRING_MAX, "%s.<br>%s",
+ GL_STR_INVALID_INPUT_PARAMETER, GL_STR_RETRY_Q);
+ popup_desc[strlen(popup_desc)] = '\0';
+ gl_popup_create_popup(ad, mode, popup_desc);
+ goto INVALID_ALBUM_NAME;
+ }
+
+ /* Check if there is any invalid character in string */
+ if (_gl_fs_validate_name(album_name) == false) {
+ gl_dbgW("Album name includes invalid character!");
+ if (b_new)
+ mode = GL_POPUP_ALBUM_NEW_INVALID;
+ else
+ mode = GL_POPUP_ALBUM_RENAME_INVALID;
+ snprintf(popup_desc, GL_POPUP_STRING_MAX, "%s.<br>%s",
+ GL_STR_INVALID_INPUT_PARAMETER, GL_STR_RETRY_Q);
+ popup_desc[strlen(popup_desc)] = '\0';
+ gl_popup_create_popup(ad, mode, popup_desc);
+ goto INVALID_ALBUM_NAME;
+ }
+
+ GL_FREE(popup_desc);
+
+ return 0;
+
+ INVALID_ALBUM_NAME:
+ GL_FREE(popup_desc);
+ return -1;
+}
+
+/* *
+* In case of system folder, the displayed name should be translated into system language
+*
+* @param album
+* check album display name for getting proper translation
+*
+* @return
+* the translated album display name
+*/
+char *_gl_get_i18n_album_name(gl_cluster *album)
+{
+ GL_CHECK_NULL(album);
+ GL_CHECK_NULL(album->cluster);
+
+ if(_gl_data_is_default_album(GL_ALBUM_DEFAULT_NAME, album->cluster)) {
+ /* system folder name: Camera */
+ return GL_STR_CAMERA;
+ } else if(_gl_data_is_default_album(GL_ALBUM_DOWNLOAD_NAME, album->cluster)) {
+ /* system folder name: Downloads */
+ return GL_STR_DOWNLOADS;
+ } else if(!g_strcmp0(album->cluster->uuid, GL_ALBUM_ALL_ID)) {
+ GL_FREEIF(album->cluster->display_name);
+ album->cluster->display_name = strdup(GL_ALBUM_ALL_NAME);
+ return album->cluster->display_name;
+ } else {
+ /* if the folder is not a system folder, return itself */
+ return album->cluster->display_name;
+ }
+}
+
+/**
+* Check tag name is valid and remove unuseful characters
+* 1) not only includes space;
+* 2) it's empty.
+*
+* @param b_new
+* true: add a new tag ; false: rename a tag.
+*
+* @param b_enter
+* true: Enter key pressed ; false: Button Done clicked.
+*/
+int _gl_get_valid_tag_name(void *data, char* tag_name, bool b_new, bool b_enter)
+{
+ GL_CHECK_VAL(tag_name, -1);
+ GL_CHECK_VAL(data, -1);
+ gl_appdata* ad = (gl_appdata*)data;
+ int mode = 0;
+ gl_dbg("Input tag name: %s", tag_name);
+ char *popup_desc;
+ popup_desc = (char*)calloc(GL_POPUP_STRING_MAX, sizeof(char));
+ if (popup_desc == NULL) {
+ gl_dbg("memory allocation fail");
+ return -1;
+ }
+
+ /* Check tag name length */
+ if (strlen(tag_name) == 0) {
+ gl_dbgW("Inserted text is empty!");
+ if (b_enter) {
+ gl_dbg("Enter key pressed.");
+ goto INVALID_TAG_NAME;
+ }
+
+ if (b_new) {
+ mode = GL_POPUP_TAG_NEW_EMPTY;
+ snprintf(popup_desc, GL_POPUP_STRING_MAX, "%s.<br>%s",
+ GL_STR_ENTRY_IS_EMPTY, GL_STR_RETRY_Q);
+ } else {
+ mode = GL_POPUP_TAG_RENAEM_EMPTY;
+ snprintf(popup_desc, GL_POPUP_STRING_MAX, "%s",
+ GL_STR_ENTRY_IS_EMPTY);
+ }
+
+ popup_desc[strlen(popup_desc)] = '\0';
+ gl_popup_create_popup(ad, mode, popup_desc);
+ goto INVALID_TAG_NAME;
+ }
+ gl_dbg("Inserted tag name: %s, length: %d", tag_name, strlen(tag_name));
+
+ /* Removes leading and trailing whitespace */
+ g_strstrip((gchar*)tag_name);
+ if (strlen(tag_name) == 0) {
+ gl_dbgW("Tag name includes only space!");
+ if (b_enter) {
+ gl_dbg("Enter key pressed.");
+ goto INVALID_TAG_NAME;
+ }
+
+ if (b_new) {
+ mode = GL_POPUP_TAG_NEW_EMPTY;
+ snprintf(popup_desc, GL_POPUP_STRING_MAX, "%s.<br>%s",
+ GL_STR_ENTRY_IS_EMPTY, GL_STR_RETRY_Q);
+ } else {
+ mode = GL_POPUP_TAG_RENAEM_EMPTY;
+ snprintf(popup_desc, GL_POPUP_STRING_MAX, "%s",
+ GL_STR_ENTRY_IS_EMPTY);
+
+ }
+
+ popup_desc[strlen(popup_desc)] = '\0';
+ gl_popup_create_popup(ad, mode, popup_desc);
+ goto INVALID_TAG_NAME;
+ }
+
+ GL_FREE(popup_desc);
+ return 0;
+
+ INVALID_TAG_NAME:
+ GL_FREE(popup_desc);
+ return -1;
+}
+
+int gl_get_selected_files_path_str(void *data, gchar sep_c, char **path_str,
+ int *sel_cnt)
+{
+ GL_CHECK_VAL(path_str, -1);
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ GL_CHECK_VAL(ad->selectedinfo.medias_elist, -1);
+ GString *selected_path_list = g_string_new(NULL);
+ gl_item *current = NULL;
+ int selected_item_cnt = 0;
+ Eina_List *l = NULL;
+
+ EINA_LIST_FOREACH(ad->selectedinfo.medias_elist, l, current) {
+ if (current == NULL || current->item == NULL) {
+ if (selected_path_list) {
+ g_string_free(selected_path_list, true);
+ selected_path_list = NULL;
+ }
+ return -1;
+ }
+
+ if (strstr(selected_path_list->str, current->item->file_url)) {
+ gl_dbgW("Already appended!");
+ } else {
+ selected_item_cnt++;
+ g_string_append(selected_path_list,
+ current->item->file_url);
+ g_string_append_c(selected_path_list, sep_c);
+ }
+
+ }
+ gl_dbg("Selected items count: %d.", selected_item_cnt);
+ if (sel_cnt)
+ *sel_cnt = selected_item_cnt;
+ int len = strlen(selected_path_list->str);
+ g_string_truncate(selected_path_list, len - 1);
+ /**
+ * Frees the memory allocated for the GString.
+ * If free_segment is true it also frees the character data.
+ * If it's false, the caller gains ownership of the buffer
+ * and must free it after use with g_free().
+ */
+ *path_str = g_string_free(selected_path_list, false);
+ GL_CHECK_VAL(*path_str, -1);
+ gl_dbg("Total string:\n\n\t>>@@:> %s <:@@<<\n", *path_str);
+ return 0;
+}
+
+int gl_make_new_album(const char *name)
+{
+ gl_dbg("");
+ char path[GL_DIR_PATH_LEN_MAX] = { 0, };
+ char dir_path[GL_DIR_PATH_LEN_MAX] = { 0, };
+
+ if (_gl_fs_get_default_folder(dir_path) != 0) {
+ gl_dbg("FAIL to get dir path");
+ return -1;
+ }
+
+ snprintf(path, GL_DIR_PATH_LEN_MAX, "%s/%s", dir_path, name);
+ path[strlen(path)] = '\0';
+ gl_dbg("Making %s directory", path);
+
+ _gl_fs_mkdir(dir_path);
+ _gl_fs_mkdir(path);
+ return 0;
+}
+
+/* Used for loal medias, thumbnail was moved to new dest first, then rename file */
+int _gl_move_media_thumb(gl_item * gitem, char *new_dir_name,
+ bool is_full_path, int *popup_op)
+{
+ gl_dbg("Move media item START>>>");
+ char new_path[GL_FILE_PATH_LEN_MAX] = { 0, };
+ char ext[GL_FILE_EXT_LEN_MAX] = { 0, };
+ char new_path_noext[GL_FILE_PATH_LEN_MAX] = { 0, };
+ char dir_path[GL_DIR_PATH_LEN_MAX] = { 0, };
+ if (gitem == NULL || gitem->item == NULL || gitem->item->uuid == NULL ||
+ popup_op == NULL)
+ {
+ gl_dbg("gitem == NULL || gitem->item == NULL");
+ return -1;
+ }
+
+ *popup_op = GL_POPUP_OP_NONE;
+
+ if (is_full_path)
+ {
+ if (!gitem->item->file_url ||
+ !strlen(gitem->item->file_url) ||
+ !gitem->item->display_name)
+ {
+ gl_dbg("file url or name is error.");
+ return -1;
+ }
+ snprintf(new_path, sizeof(new_path), "%s/%s",
+ new_dir_name, (char *)(gitem->item->display_name));
+ gl_dbg("New path : %s", new_path);
+
+ if (!g_strcmp0(new_path, gitem->item->file_url)) //do not need to move. ("All" album case)
+ {
+ //create popup in pipe callback
+ *popup_op = GL_POPUP_OP_SAME_ALBUM;
+ gl_dbg("File already in destination, do not need to move, just return...");
+ /*
+ snprintf(msg, sizeof(msg), "Cann't move %s to the same album!", gitem->item->display_name);
+ gl_popup_create_popup(ad, GL_POPUP_NOBUT_MOV_DEL, msg);
+ */
+
+ return 0;
+ }
+ else if (ecore_file_exists(new_path)) // return true if file exists, rename new file.
+ {
+ _gl_fs_get_ext(new_path, ext, new_path_noext);
+ char *final_path = NULL;
+ final_path = _gl_fs_get_unique_full_path(new_path_noext, ext);
+ if (final_path == NULL)
+ return -1;
+ gl_dbg("Created unique path: %s", final_path);
+ memset(new_path, 0x00, GL_FILE_PATH_LEN_MAX);
+ g_strlcpy(new_path, final_path, GL_FILE_PATH_LEN_MAX);
+ GL_FREE(final_path);
+ //create popup in pipe callback
+ *popup_op = GL_POPUP_OP_DUPLICATED_NAME;
+ /*memset(msg, 0x00, GL_FILE_PATH_LEN_MAX);
+ snprintf(msg, sizeof(msg), "%s is duplicated, rename it!", gitem->item->display_name);
+ gl_popup_create_popup(ad, GL_POPUP_NOBUT_MOV_DEL, msg);
+ */
+ }
+ }
+ else
+ {
+ if (_gl_fs_get_default_folder(dir_path) != 0)
+ {
+ gl_dbg("FAIL to get dir path!");
+ return -1;
+ }
+ snprintf(new_path, GL_FILE_PATH_LEN_MAX, "%s/%s/%s",
+ dir_path, new_dir_name, (char *)(gitem->item->display_name));
+ }
+
+ new_path[strlen(new_path)] = '\0';
+
+ // stop using "rename" when moving from mmc to phone for correct db update.
+ if (!__gl_file_mv(gitem, gitem->item->file_url, new_path))
+ {
+ gl_dbg("Move media item OVER<<<");
+ return -1;
+ }
+ else
+ {
+ gl_dbg("Move media item OVER<<<");
+ return 0;
+ }
+}
+
+/* Used for move file to new dest */
+int _gl_move_media(gl_item *gitem, char *new_dir_name, bool is_full_path)
+{
+ gl_dbg("Move media START>>>");
+ char new_path[GL_FILE_PATH_LEN_MAX] = { 0, };
+ char ext[GL_FILE_EXT_LEN_MAX] = { 0, };
+ char new_path_noext[GL_FILE_PATH_LEN_MAX] = { 0, };
+ char dir_path[GL_DIR_PATH_LEN_MAX] = { 0, };
+ if (!gitem || !gitem->item) {
+ gl_dbgE("Invalid gitem!");
+ return -1;
+ }
+
+ if (is_full_path) {
+ if (!gitem->item->file_url || !strlen(gitem->item->file_url) ||
+ !gitem->item->display_name) {
+ gl_dbgE("file url or name is invalid!");
+ return -1;
+ }
+ snprintf(new_path, sizeof(new_path), "%s/%s",
+ new_dir_name, (char *)(gitem->item->display_name));
+ gl_dbg("New path : %s", new_path);
+
+ if (!g_strcmp0(new_path, gitem->item->file_url)) {
+ gl_dbgW("File exists!");
+ return 0;
+ } else if (ecore_file_exists(new_path)) {
+ _gl_fs_get_ext(new_path, ext, new_path_noext);
+ char *final_path = NULL;
+ final_path = _gl_fs_get_unique_full_path(new_path_noext, ext);
+ if (final_path == NULL)
+ return -1;
+ gl_dbg("Created unique path: %s", final_path);
+ memset(new_path, 0x00, GL_FILE_PATH_LEN_MAX);
+ g_strlcpy(new_path, final_path, GL_FILE_PATH_LEN_MAX);
+ GL_FREE(final_path);
+ }
+ } else {
+ if (_gl_fs_get_default_folder(dir_path) != 0) {
+ gl_dbgE("FAIL to get dir path!");
+ return -1;
+ }
+ snprintf(new_path, GL_FILE_PATH_LEN_MAX, "%s/%s/%s", dir_path,
+ new_dir_name, (char *)(gitem->item->display_name));
+ }
+
+ new_path[strlen(new_path)] = '\0';
+
+ if (!_gl_fs_move(gitem->item->file_url, new_path)) {
+ gl_dbg("Move media OVER<<<");
+ return -1;
+ } else {
+ gl_dbg("Move media OVER<<<");
+ return 0;
+ }
+}
+
+/**
+* Check if there is any media in Gallery.
+*
+* False returned if none medias exist, other return True.
+*/
+bool gl_check_gallery_empty(void* data)
+{
+ GL_CHECK_FALSE(data);
+ gl_appdata *ad = (gl_appdata *)data;
+
+ if (ad->albuminfo.cluster_list == NULL) {
+ gl_dbgE("ad->albuminfo.cluster_list is empty!");
+ return true;
+ }
+
+ Eina_List *clist = ad->albuminfo.cluster_list->clist;
+ if (clist == NULL) {
+ gl_dbgW("Albums list is invalid!");
+ return true;
+ }
+
+ int len = eina_list_count(clist);
+ if (len == 0) {
+ gl_dbgW("Albums list is empty!");
+ return true;
+ }
+ return false;
+}
+
+bool gl_is_image_valid(void *data, char *filepath)
+{
+ GL_CHECK_FALSE(data);
+ gl_appdata *ad = (gl_appdata *)data;
+ GL_CHECK_FALSE(filepath);
+
+ Evas_Object *image = NULL;
+ int width = 0;
+ int height = 0;
+ Evas *evas = NULL;
+
+ evas = evas_object_evas_get(ad->maininfo.win);
+ GL_CHECK_FALSE(evas);
+
+ image = evas_object_image_add(evas);
+ GL_CHECK_FALSE(image);
+
+ evas_object_image_filled_set(image, 0);
+ evas_object_image_load_scale_down_set(image, 0);
+ evas_object_image_file_set(image, filepath, NULL);
+ evas_object_image_size_get(image, &width, &height);
+ if(image) {
+ evas_object_del(image);
+ image = NULL;
+ }
+
+ if (width <= 0 || height <= 0) {
+ gl_dbg("Cannot load file : %s", filepath);
+ return false;
+ }
+
+ return true;
+}
+
+bool gl_is_rotation_locked(void)
+{
+ gl_dbg_launch(" gl_is_rotation_locked:start");
+ int lock = -1;
+
+ if (!vconf_get_bool(VCONFKEY_SETAPPL_AUTO_ROTATE_SCREEN_BOOL, &lock))
+ {
+ gl_dbg("Rotation locked state[%d].", lock);
+ gl_dbg_launch(" gl_is_rotation_locked:end");
+ return lock;
+ }
+ else
+ {
+ gl_dbgE("Get rotation lock state failed!");
+ gl_dbg_launch(" gl_is_rotation_locked:end");
+ return false;
+ }
+}
+
+/*
+* Check MMC state(Inserted/Removed) for Move/Delete/Add tag/Remove.
+*/
+int gl_check_mmc_state(void *data, char *dest_folder)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+
+ /* MMC hasn't been inserted */
+ if (ad->maininfo.mmc_state == GL_MMC_STATE_REMOVED)
+ return 0;
+
+ int on_mmc = -1;
+ /**
+ * 1, Places: Add tag;
+ * 2, Tags: Add tag/remove tag;
+ * 3, Albums: Move/Delete/Add tag.
+ */
+ if (ad->ctrlinfo.tab_mode == GL_CTRL_TAB_TAGS) {
+ if (_gl_check_mmc_file_selected(ad))
+ goto ON_MMC;
+ } else {
+ /* Move files to MMC album */
+ if (dest_folder) {
+ on_mmc = strncmp(GL_ROOT_PATH_MMC, dest_folder,
+ strlen(GL_ROOT_PATH_MMC));
+ if (on_mmc == 0)
+ goto ON_MMC;
+ }
+
+ gl_cluster *cur_album = ad->albuminfo.current_album;
+ char src_folder_path[GL_DIR_PATH_LEN_MAX] = { 0, };
+ GL_CHECK_VAL(cur_album, -1);
+ GL_CHECK_VAL(cur_album->cluster, -1);
+ /* Move files from MMC album */
+ GL_CHECK_VAL(cur_album->cluster->uuid, -1);
+ g_strlcpy(src_folder_path, cur_album->cluster->path,
+ GL_DIR_PATH_LEN_MAX);
+ on_mmc = strncmp(GL_ROOT_PATH_MMC, src_folder_path,
+ strlen(GL_ROOT_PATH_MMC));
+ /* Check MMC files selected in album [All albums] */
+ if (on_mmc == 0) {
+ goto ON_MMC;
+ } else if (cur_album->cluster->type == GL_STORE_T_ALL) {
+ gl_dbg("In album [All albums].");
+ if (_gl_check_mmc_file_selected(ad))
+ goto ON_MMC;
+ }
+ }
+ return 0;
+
+ ON_MMC:
+ gl_dbgW("Operate medias on MMC!");
+ ad->maininfo.mmc_state = GL_MMC_STATE_ADDED_MOVING;
+ return 0;
+}
+
+int gl_reg_db_update_noti(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ int error_code = -1;
+ int mmc_state = -1;
+
+ vconf_get_int(VCONFKEY_SYSMAN_MMC_STATUS, &mmc_state);
+ /* Save the init status of MMC */
+ if (mmc_state == VCONFKEY_SYSMAN_MMC_MOUNTED)
+ {
+ gl_dbg("###### :::::: MMC loaded! :::::: ######");
+ ad->maininfo.mmc_state = GL_MMC_STATE_ADDED;
+ }
+ else if (mmc_state == VCONFKEY_SYSMAN_MMC_REMOVED ||
+ mmc_state == VCONFKEY_SYSMAN_MMC_INSERTED_NOT_MOUNTED)
+ {
+ gl_dbg("###### :::::: MMC removed! :::::: ######");
+ ad->maininfo.mmc_state = GL_MMC_STATE_REMOVED;
+ }
+
+ gl_dbg("Enable the noti handle for DB update status!");
+ /* Set DB update status callback */
+ error_code = vconf_notify_key_changed(VCONFKEY_FILEMANAGER_DB_STATUS,
+ _gl_db_update_noti_cb, ad);
+ if (error_code == -1) {
+ gl_dbgE("vconf_notify_key_changed for DB_STATUS failed!");
+ return -1;
+ }
+
+ return 0;
+}
+
+int gl_dereg_db_update_noti(void)
+{
+ int error_code = -1;
+
+ gl_dbg("Disable the noti handle for DB update status!");
+ error_code = vconf_ignore_key_changed(VCONFKEY_FILEMANAGER_DB_STATUS,
+ _gl_db_update_noti_cb);
+ if (error_code == -1) {
+ gl_dbgE("vconf_ignore_key_changed for DB_STATUS failed!");
+ return -1;
+ }
+
+ return 0;
+}
+
+/*
+* Get view mode of app
+*/
+int gl_get_view_mode(void *data)
+{
+ GL_CHECK_VAL(data, GL_VIEW_NONE);
+ gl_appdata *ad = (gl_appdata *)data;
+ return ad->maininfo.view_mode;
+}
+
+/*
+* Set view mode of app
+*/
+int gl_set_view_mode(void *data, int mode)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ ad->maininfo.view_mode = mode;
+ return 0;
+}
+
+int gl_del_invalid_widgets(void *data, int invalid_m)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ gl_dbg("");
+ if (ad->popupinfo.popup) {
+ /* Remove popup */
+ evas_object_del(ad->popupinfo.popup);
+ ad->popupinfo.popup = NULL;
+ } else if (ad->uginfo.ug_called_by_me) {
+ /* Destroy UG */
+ gl_dbg("Destroy UG!");
+ if (ad->uginfo.ug_called_by_me) {
+ ug_destroy(ad->uginfo.ug_called_by_me);
+ ad->uginfo.ug_called_by_me = NULL;
+ ad->uginfo.ug_type = -1;
+ }
+ if (ad->uginfo.gallery_ug_called_by_me) {
+ ug_destroy(ad->uginfo.gallery_ug_called_by_me);
+ ad->uginfo.gallery_ug_called_by_me = NULL;
+ }
+ }
+
+ switch (invalid_m) {
+ case GL_INVALID_NEW_ENTRY:
+ case GL_INVALID_NEW_ENTRY_NOC:
+ if (ad->entryinfo.entry_mode == GL_ENTRY_NEW_ALBUM ||
+ ad->entryinfo.entry_mode == GL_ENTRY_NEW_TAG) {
+ gl_dbg("Destroy New album/tag view!");
+ if (invalid_m == GL_INVALID_NEW_ENTRY) {
+ gl_dbg("Pop to nf_it_edit");
+ elm_naviframe_item_pop_to(ad->gridinfo.nf_it_edit);
+ }
+ _gl_editfield_destroy_imf(ad);
+ Evas_Object *edit_ly = NULL;
+ edit_ly = ad->gridinfo.navi_content_edit_ly;
+ edje_object_signal_emit(_EDJ(edit_ly),
+ GL_SIGNAL_VIEW_EDIT, "elm");
+ }
+ break;
+ case GL_INVALID_NEW_TAG_VIDEO:
+ if (ad->entryinfo.entry_mode == GL_ENTRY_NEW_TAG) {
+ gl_dbg("Destroy New tag view!");
+ elm_naviframe_item_pop_to(ad->gridinfo.nf_it);
+ _gl_editfield_destroy_imf(ad);
+ }
+ break;
+ default:
+ ad->entryinfo.entry_mode = GL_ENTRY_NONE;
+ break;
+ }
+ return 0;
+}
+
+int gl_del_medias(void *data)
+{
+ gl_dbg("");
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ /* Get all selected medias count */
+ int cnt = _gl_data_selected_list_count(ad);
+ /* Check MMC state for cancel operation */
+ gl_check_mmc_state(ad, NULL);
+ gl_dbg("MMC state: %d.", ad->maininfo.mmc_state);
+ _gl_use_thread_operate_medias(ad, GL_STR_DELETING, cnt,
+ GL_MEDIA_OP_DELETE);
+
+ return 0;
+}
+
+/* 'Delete medias' is available in Albums view */
+int gl_del_selected(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ /* Get all selected medias count */
+ int cnt = _gl_data_selected_list_count(ad);
+ gl_item *gitem = NULL;
+ int i = 0;
+ int popup_op = GL_POPUP_OP_NONE;
+
+ /* Removed media from selected_media_elist */
+ for (i = 1; i <= cnt; i++) {
+ _gl_data_get_item_by_index(ad, i, true, &gitem);
+ if (gitem != NULL && gitem->item != NULL)
+ _gl_data_remove_item(gitem);
+ else
+ gl_dbgE("Invalid item!");
+
+ gl_dbg("Write pipe, make progressbar updated!");
+ gl_thread_write_pipe(ad, i, popup_op);
+ gitem = NULL;
+ }
+
+ return 0;
+}
+
+int _gl_update_operation_view(void *data, const char *noti_str)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ gl_dbg("String: %s", noti_str);
+
+ if (ad->maininfo.medias_cnt > 0) {
+ /* Deleting process done, change to normal view */
+ _gl_ui_pop_to_thumb(ad);
+
+ if (gl_get_view_mode(ad) == GL_VIEW_THUMBS)
+ _gl_nocontents_show(ad);
+
+ /* Add notification */
+ _gl_notify_create_notiinfo(ad, noti_str);
+ } else {
+ gl_dbgW("Empty album, change to Albums view!");
+ gl_albums_comeback_from_view(ad);
+ elm_naviframe_item_pop_to(ad->ctrlinfo.nf_it);
+
+ if (gl_check_gallery_empty(ad)) {
+ _gl_ctrl_disable_btn(ad, true, GL_NAVI_ALBUMS);
+ gl_ctrl_disable_ctrlbar(ad, true);
+ } else if (ad->albuminfo.cluster_list->edit_cnt == 0) {
+ _gl_ctrl_disable_btn(ad, true, GL_NAVI_ALBUMS);
+ }
+
+ _gl_notify_destroy_selinfo(ad);
+ /* Add notification */
+ _gl_notify_create_notiinfo(ad, noti_str);
+ }
+ return 0;
+}
+
+/* Update view after deleting process done */
+int gl_update_del_view(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ _gl_data_selected_list_finalize(ad);
+
+ int view_mode = gl_get_view_mode(ad);
+ gl_dbg("view_mode: %d.", view_mode);
+ gl_refresh_albums_list(ad);
+
+ _gl_update_operation_view(ad, GL_STR_DELETED);
+
+ return 0;
+}
+
+int gl_remove_album(void *data, gl_cluster * album_item)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ int res = -1;
+ char dir_path[GL_DIR_PATH_LEN_MAX] = { 0, };
+
+ if (album_item == NULL || album_item->cluster == NULL ||
+ album_item->cluster->uuid == NULL) {
+ gl_dbgE("Invalid album!");
+ return -1;
+ }
+
+ gl_dbg("Remove album: %s, id=%s", album_item->cluster->display_name,
+ album_item->cluster->uuid);
+
+ /* get folder path of album */
+ if (album_item->cluster->path &&
+ strlen(album_item->cluster->path) > 0) {
+ gl_dbg("Folder fullpath: %s", dir_path);
+ g_strlcpy(dir_path, album_item->cluster->path,
+ GL_DIR_PATH_LEN_MAX);
+ } else {
+ gl_dbgE("Get folder fullpath failed[%d]!", res);
+ return -1;
+ }
+ /* remove all items in the album from file system and db */
+ _gl_data_get_item_list(ad, GL_CATEGORY_FOLDER, album_item,
+ GL_GET_ALL_RECORDS, GL_GET_ALL_RECORDS);
+
+ gl_item *gitem = NULL;
+ int i = 0;
+ /* Get all medias count of current album */
+ int cnt = ad->maininfo.medias_cnt;
+ gl_dbg("cnt: %d", cnt);
+ /* Remove files, _gl_local_data_delete_album would delete medias record */
+ for (i = cnt; i >= 1; i--) {
+ _gl_data_get_item_by_index(ad, i, false, &gitem);
+ if (gitem && gitem->item && gitem->item->file_url) {
+ if (!ecore_file_unlink(gitem->item->file_url))
+ gl_dbgE("ecore_file_unlink failed!");
+ }
+ }
+
+ /* remove album from db*/
+ res = _gl_local_data_delete_album(album_item->cluster->uuid);
+ if (res != 0)
+ gl_dbgE("_gl_local_data_delete_album failed[%d]!", res);
+
+ /* remove album from file system */
+ if (ecore_file_rmdir(dir_path) == EINA_FALSE) {
+ gl_dbg("ecore_file_rmdir failed!");
+ return -1;
+ }
+
+ return 0;
+}
+
+int gl_del_albums(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ gl_cluster *album_item = NULL;
+ int cnt = _gl_data_get_albums_selected_cnt(ad);
+ int i = 0;
+ int ret = -1;
+ gl_dbg("");
+ // delete albums
+
+ Eina_List *selected_list = ad->albuminfo.selected_albums_elist;
+ if ((selected_list == NULL) || (eina_list_count(selected_list) == 0))
+ {
+ gl_dbg("zero length, return!");
+ return -1;
+ }
+ else
+ {
+ gl_dbg("cnt= %d, list length=%d", cnt, eina_list_count(selected_list));
+ }
+ for (i = 0; i < cnt; i++)
+ {
+ album_item = eina_list_nth(selected_list, i);
+
+ if (album_item && album_item->cluster &&
+ album_item->cluster->uuid) {
+ gl_dbg("Delete album: %s, id=%s",
+ album_item->cluster->display_name,
+ album_item->cluster->uuid);
+ ret = gl_remove_album(ad, album_item);
+ if (ret < 0)
+ {
+ gl_dbg("gl_remove_album failed, error=%d", ret);
+ //return -1;
+ }
+ }
+ }
+
+ // update the albums view
+ _gl_albums_edit_pop_view(ad);
+
+ //add notification
+ _gl_notify_create_notiinfo(ad, GL_STR_DELETED);
+ return 0;
+}
+
+int gl_refresh_albums_list(void *data)
+{
+#ifdef _USE_ROTATE_BG
+ return __gl_refresh_albums_list(data, false, false);
+#else
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ gl_cluster *old_current_album = ad->albuminfo.current_album;
+ char cluster_id[GL_MTYPE_ITEN_ID_LEN_MAX] = { 0, };
+ gl_cluster *current = NULL;
+ bool b_get_cur_album = false;
+ /* Albums list would be update, reset flag */
+ ad->albuminfo.update_albums_list = false;
+
+ /* Save cluster ID to set new current_album from new albums list */
+ if (old_current_album && old_current_album->cluster &&
+ old_current_album->cluster->uuid) {
+ g_strlcpy(cluster_id, old_current_album->cluster->uuid,
+ GL_MTYPE_ITEN_ID_LEN_MAX);
+ b_get_cur_album = true;
+ } else {
+ gl_dbg("None album selected, current album is unavailable.");
+ }
+
+ _gl_data_get_cluster_list(ad);
+ /* need to reset current album */
+ ad->albuminfo.current_album = NULL;
+
+ if (b_get_cur_album) {
+ _gl_data_get_cluster_by_id(ad, cluster_id, ¤t);
+ if(current && current->cluster) {
+ ad->albuminfo.current_album = current;
+ gl_dbg("Reset current album: %s",
+ current->cluster->display_name);
+ _gl_data_update_item_list(ad);
+ return 0;
+ } else {
+ /* Clear items list if current album doesn't exist */
+ if (ad->selectedinfo.medias_elist)
+ _gl_data_selected_list_finalize(ad);
+ _gl_data_clear_default_item_list(ad);
+ ad->maininfo.medias_cnt = 0;
+ }
+ }
+
+ return 0;
+#endif
+}
+
+/**
+* Move files under root album [/opt/media or /opt/storage/sdcard] to a newly created album.
+* Used in 'Rename' album case.
+*/
+int
+gl_move_root_album(void* data, gl_cluster* cur_album, char* dest_path)
+{
+ GL_CHECK_VAL(data, -1);
+ GL_CHECK_VAL(cur_album, -1);
+ GL_CHECK_VAL(cur_album->cluster, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+
+ /* Get all medias of current album */
+ _gl_data_get_item_list(ad, GL_CATEGORY_FOLDER, cur_album,
+ GL_GET_ALL_RECORDS, GL_GET_ALL_RECORDS);
+
+ Eina_List* tmp_elist = NULL;
+ gl_item* gitem = NULL;
+ int popup_op = GL_POPUP_OP_NONE;
+ GL_CHECK_VAL(ad->maininfo.medias_elist, -1);
+
+ /* Move medias of album to dest folder */
+ EINA_LIST_FOREACH(ad->maininfo.medias_elist, tmp_elist, gitem)
+ {
+ if (gitem && gitem->item)
+ {
+ gl_dbg("Move [%s]", gitem->item->file_url);
+ if (_gl_move_media_thumb(gitem, dest_path, true, &popup_op) != 0)
+ gl_dbgW("Failed to move this item");
+
+ gitem = NULL;
+ }
+ else
+ {
+ gl_dbgE("Invalid item!");
+ _gl_data_clear_default_item_list(ad);
+ return -1;
+ }
+ }
+
+ /* Free item list */
+ _gl_data_clear_default_item_list(ad);
+
+ return 0;
+}
+
+/* 'Move medias' is only available in tab Albums */
+int gl_move_selected(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ int i = 0;
+ /* Get selected medias count */
+ int cnt = _gl_data_selected_list_count(ad);
+ gl_item *gitem = NULL;
+ int popup_op = GL_POPUP_OP_NONE;
+
+ for (i = 1; i <= cnt; i++)
+ {
+ _gl_data_get_item_by_index(ad, i, true, &gitem);
+ if (gitem && gitem->item)
+ {
+ gl_dbg("Selected [%s]", gitem->item->file_url);
+ if (_gl_move_media_thumb(gitem, ad->albuminfo.dest_folder, true, &popup_op) != 0)
+ gl_dbg("Failed to move this item");
+
+ gl_dbg("File Moved:::::::%d/%d-->try to update progressbar", i, cnt);
+ }
+ else
+ {
+ gl_dbg("Invalid item!");
+ }
+
+ gl_dbg("Write pipe, make progressbar updated!");
+ gl_thread_write_pipe(ad, i, popup_op);
+
+ popup_op = GL_POPUP_OP_NONE;
+ }
+
+ return 0;
+}
+
+int gl_move_to_album(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ char folder_fullpath[GL_DIR_PATH_LEN_MAX] = { 0, };
+ char default_path[GL_DIR_PATH_LEN_MAX] = { 0, };
+ gl_cluster *cur_album = ad->albuminfo.current_album;
+ int cnt = _gl_data_selected_list_count(ad);
+
+ /**
+ * 'move_album_id == NULL' is new album case,
+ * other move/save to some existed album.
+ */
+ if (ad->albuminfo.path == NULL) {
+ gl_dbg("---Popup list item: New album---");
+ ad->albuminfo.move_new_album = true;
+
+ if (gl_make_new_album(ad->albuminfo.new_album_name) != 0)
+ {
+ gl_popup_create_popup(ad, GL_POPUP_NOBUT,
+ GL_STR_SAME_NAME_ALREADY_IN_USE);
+ gl_dbgE("Failed to make a new directory!");
+ gl_ui_update_select_widgets(ad);
+ return -1;
+ }
+ if (_gl_fs_get_default_folder(default_path) != 0)
+ {
+ gl_dbgE("Failed to get default images path!");
+ gl_ui_update_select_widgets(ad);
+ return -1;
+ }
+ snprintf(folder_fullpath, GL_DIR_PATH_LEN_MAX, "%s/%s",
+ default_path, ad->albuminfo.new_album_name);
+ } else {
+ ad->albuminfo.move_new_album = false;
+ g_strlcpy(folder_fullpath, ad->albuminfo.path,
+ GL_DIR_PATH_LEN_MAX);
+ GL_FREE(ad->albuminfo.path);
+ }
+
+ if (cur_album == NULL || cur_album->cluster == NULL)
+ {
+ gl_dbgE("[Error] Current album is NULL!");
+ gl_ui_update_select_widgets(ad);
+ return -1;
+ }
+
+ memset(ad->albuminfo.dest_folder, 0x00, GL_DIR_PATH_LEN_MAX);
+ g_strlcpy(ad->albuminfo.dest_folder, folder_fullpath, GL_DIR_PATH_LEN_MAX);
+ /* Check MMC state for cancel operation */
+ gl_check_mmc_state(ad, folder_fullpath);
+ gl_dbg("MMC state: %d.", ad->maininfo.mmc_state);
+ _gl_use_thread_operate_medias(ad, GL_STR_MOVING, cnt,
+ GL_MEDIA_OP_MOVE);
+ return 0;
+}
+
+/* Update view after moving process done */
+int gl_update_move_view(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ int view_mode = gl_get_view_mode(ad);
+ gl_dbg("view_mode: %d", view_mode);
+ _gl_data_selected_list_finalize(ad);
+ _gl_notify_destroy_selinfo(ad);
+ /* Update albums list and items list */
+ gl_refresh_albums_list(ad);
+
+ _gl_update_operation_view(ad, GL_STR_MOVED);
+
+ return 0;
+}
+
+int _gl_get_selected_paths(void *data, gchar sep_c, char **path_str,
+ int *sel_cnt)
+{
+ GL_CHECK_VAL(path_str, -1);
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ int view_m = gl_get_view_mode(data);
+ gl_dbg("view_m: %d", view_m);
+
+ if (view_m == GL_VIEW_ALBUMS_EDIT) {
+ gl_dbg("Albums");
+ if (ad->albuminfo.selected_albums_elist == NULL) {
+ gl_dbgE("Invalid selected_albums_elist!");
+ return -1;
+ }
+ /* Get file string */
+ _gl_data_get_albums_selected_files_path_str(ad, sep_c, path_str,
+ sel_cnt);
+ } else if (view_m == GL_VIEW_TAGS_EDIT) {
+ gl_dbg("Tags");
+ /* Get file string */
+ _gl_data_get_tags_selected_files_path_str(ad, sep_c, path_str,
+ sel_cnt);
+ } else {
+ gl_dbg("Normal files");
+ gl_get_selected_files_path_str(ad, sep_c, path_str, sel_cnt);
+ }
+ return 0;
+}
+
+/* Load selected item for Share album's content */
+int _gl_share_load(void *data, const char *label)
+{
+ GL_CHECK_VAL(label, -1);
+ GL_CHECK_VAL(data, GL_UG_FAIL);
+ gl_appdata *ad = (gl_appdata *)data;
+ gl_dbg("label : %s ", label);
+
+ if (!g_strcmp0(label, GL_SHARE_MESSAGE)) {
+ gl_ext_load_ug(data, GL_UG_MSG);
+ } else if (!g_strcmp0(label, GL_SHARE_EMAIL)) {
+ gl_ext_load_ug(data, GL_UG_EMAIL);
+ } else if (!g_strcmp0(label, GL_SHARE_BLUETOOTH)) {
+ gl_ext_load_ug(data, GL_UG_BT);
+ if (ad->entryinfo.imf_entry)
+ elm_object_focus_set(ad->entryinfo.imf_entry,
+ EINA_FALSE);
+ } else {
+ gl_dbgE("Wrong UG name!");
+ return -1;
+ }
+ return 0;
+}
+
+int gl_share_select_item(void *data, const char *label)
+{
+ GL_CHECK_VAL(label, -1);
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ gl_dbg("label : %s ", label);
+ int cnt = 0;
+
+ cnt = _gl_data_selected_list_count(ad);
+
+ gl_dbg("Selected item(s) count: %d.", cnt);
+ if (cnt < 1) {
+ gl_dbgE("None items selected!");
+ gl_popup_create_popup(ad, GL_POPUP_NOBUT,
+ GL_STR_NO_FILES_SELECTED);
+ return -1;
+ }
+
+ if (!g_strcmp0(label, GL_SHARE_MESSAGE)) {
+ gl_ext_load_ug(ad, GL_UG_MSG);
+ } else if (!g_strcmp0(label, GL_SHARE_EMAIL)) {
+ gl_ext_load_ug(ad, GL_UG_EMAIL);
+ } else if (!g_strcmp0(label, GL_SHARE_BLUETOOTH)) {
+ gl_ext_load_ug(ad, GL_UG_BT);
+ }
+
+ return 0;
+}
+
+/*
+* add selected medias to some tag
+*/
+int gl_add_to_tag(void *data, const char *tagname)
+{
+ GL_CHECK_VAL(tagname, -1);
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ int view_m = gl_get_view_mode(ad);
+
+ if ((view_m != GL_VIEW_THUMBS_SELECT) &&
+ ad->ctrlinfo.tab_mode == GL_CTRL_TAB_TAGS) {
+ gl_dbg("Add new tag: %s.", tagname);
+ /* Add an emtpy tag in tags list view */
+ int ret = -1;
+ ret = _gl_local_data_add_tag(tagname, NULL);
+ if (ret != 0)
+ gl_dbgW("_gl_local_data_add_tag failed!");
+
+ /* Hide title from animation */
+ gl_ui_set_navi_title_visible(ad, EINA_FALSE);
+ elm_naviframe_item_pop(ad->maininfo.naviframe);
+ /* Recover the previous UI */
+ gl_ctrl_rotate_ctrlbar(ad, GL_VIEW_ALBUMS_EDIT);
+ gl_tag_update_view(ad);
+ _gl_ctrl_disable_btn(ad, false, GL_NAVI_TAGS);
+
+ /* Add notification */
+ _gl_notify_create_notiinfo(ad, GL_STR_ADDED);
+
+ } else {
+ /* Get all selected medias count */
+ int cnt = _gl_data_selected_list_count(ad);
+ if (cnt == 0) {
+ gl_dbg("No items selected, return!");
+ gl_popup_create_popup(ad, GL_POPUP_NOBUT,
+ GL_STR_NO_FILES_SELECTED);
+ ad->taginfo.b_favor_tag = false;
+ return -1;
+ }
+
+ gl_dbg("Add tag[%s] to medias.", tagname);
+ g_strlcpy(ad->taginfo.new_tag_name, tagname,
+ sizeof(ad->taginfo.new_tag_name));
+
+ /* Check MMC state for cancel operation */
+ gl_check_mmc_state(ad, NULL);
+ gl_dbg("MMC state: %d.", ad->maininfo.mmc_state);
+ _gl_use_thread_operate_medias(ad, GL_STR_ADD_TAG, cnt,
+ GL_MEDIA_OP_ADD_TAG);
+ }
+
+ return 0;
+}
+
+int gl_add_tag_to_selected(void *data)
+{
+ gl_dbg("");
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ int ret = -1;
+ int cnt = 0;
+ gl_item *gitem = NULL;
+ int i = 0;
+ int popup_op = GL_POPUP_OP_NONE;
+ gl_tag *gtag = ad->taginfo.current_tag;
+
+ cnt = _gl_data_selected_list_count(ad);
+
+ if ((gl_get_view_mode(ad) != GL_VIEW_THUMBS_SELECT) &&
+ ad->ctrlinfo.tab_mode == GL_CTRL_TAB_TAGS && gtag && gtag->tag &&
+ gtag->tag->tag_name &&
+ !g_strcmp0(gtag->tag->tag_name, ad->taginfo.new_tag_name)) {
+ gl_dbgW("Already add current tag to medias!");
+ /* To operate one item to show progressbar popup completely */
+ cnt = 1;
+ }
+
+ for (i = 0; i < cnt; i++) {
+ gitem = _gl_data_selected_list_get_nth(ad, i);
+ if (gitem && gitem->item) {
+ if (ad->taginfo.b_favor_tag) {
+ if (!gitem->item->favorite) {
+ ret = _gl_local_data_set_favorite(gitem->item,
+ true);
+ /* Data not updated from DB, need to set favor */
+ if (ret == -1)
+ gl_dbgW("db_update_favorite failed!");
+ else
+ gitem->item->favorite = true;
+ }
+ } else {
+ /* Add tag to media */
+ ret = _gl_local_data_add_tag(ad->taginfo.new_tag_name,
+ gitem->item->uuid);
+ if (ret != 0)
+ gl_dbgW("_gl_local_data_add_tag failed!");
+ }
+
+ gl_dbg("Write pipe, make progressbar updated!");
+ gl_thread_write_pipe(ad, i+1, popup_op);
+
+ gitem = NULL;
+ popup_op = GL_POPUP_OP_NONE;
+ }
+ }
+ return 0;
+}
+
+int gl_update_add_tag_view(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ int view_m = gl_get_view_mode(ad);
+ gl_dbg("view_m: %d", view_m);
+
+ /* Update items list */
+ if (view_m == GL_VIEW_THUMBS_SELECT) {
+ /* Pop to tags thumbnail view */
+ elm_naviframe_item_pop_to(ad->gridinfo.nf_it);
+
+ if (ad->gridinfo.select_view) {
+ _gl_thumbs_clear_cbs(ad->gridinfo.select_view);
+ ad->gridinfo.select_view = NULL;
+ }
+ ad->gridinfo.select_view_ly = NULL;
+ ad->gridinfo.nf_it_select = NULL;
+
+ ad->albuminfo.select_view = NULL;
+ ad->albuminfo.select_view_ly = NULL;
+ ad->albuminfo.nf_it_select = NULL;
+
+ GL_CHECK_VAL(ad->taginfo.current_tag, -1);
+ /* Clear selected list */
+ _gl_data_selected_list_finalize(ad);
+
+ /* Restore view mode */
+ gl_set_view_mode(ad, GL_VIEW_THUMBS);
+
+ _gl_update_thumb_items(ad, false);
+ } else {
+ /* Check is it a new tag */
+ bool res = _gl_data_is_in_tag_list(ad, ad->taginfo.new_tag_name);
+ memset(ad->taginfo.new_tag_name, 0x00,
+ sizeof(ad->taginfo.new_tag_name));
+ /* Update tag list in tags view if new tag added */
+ if (!res && ad->ctrlinfo.tab_mode == GL_CTRL_TAB_TAGS) {
+ gl_dbg("New tag added in tags view, update tags list.");
+ _gl_data_update_tag_list(ad, NULL);
+ }
+
+ /* Change to normal view */
+ _gl_ui_pop_to_thumb(ad);
+ }
+
+ ad->taginfo.b_favor_tag = false;
+ /* Add notification */
+ _gl_notify_create_notiinfo(ad, GL_STR_ADDED);
+ return 0;
+}
+
+/*
+* In thumbnails view, after tap "Add tag",
+* show UI for adding a new tag or just add tag in background.
+* Create a new tag, and add selected items to it.
+*/
+int gl_add_tag(void *data, gl_tag * gtag)
+{
+ GL_CHECK_VAL(gtag, -1);
+ GL_CHECK_VAL(gtag->tag, -1);
+ GL_CHECK_VAL(gtag->tag->tag_name, -1);
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ gl_dbg("");
+ ad->taginfo.b_favor_tag = false;
+
+ /* add items to favorites */
+ if (gtag->tag->_id == GL_TAG_FAVORITES_ID)
+ ad->taginfo.b_favor_tag = true;
+ gl_add_to_tag(ad, gtag->tag->tag_name);
+
+ return 0;
+}
+
+int gl_remove_tag_items(void *data)
+{
+ gl_dbg("");
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ GL_CHECK_VAL(ad->taginfo.current_tag, -1);
+ GL_CHECK_VAL(ad->taginfo.current_tag->tag, -1);
+
+ _gl_remove_tag_items(data, ad->taginfo.current_tag);
+
+ return 0;
+}
+
+int gl_remove_tag_from_selected(void *data)
+{
+ gl_dbg("");
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ int cnt = _gl_data_selected_list_count(ad);
+ int i = 0;
+ gl_item *gitem = NULL;
+ int ret = -1;
+ int popup_op = GL_POPUP_OP_NONE;
+ gl_tag * cur_tag = ad->taginfo.current_tag;
+
+ if (!cur_tag || !cur_tag->tag) {
+ gl_dbgE("Null tag");
+ return -1;
+ }
+
+ for (i = 0; i < cnt; i++) {
+ gitem = _gl_data_selected_list_get_nth(ad, i);
+ if (gitem && gitem->item && gitem->item->uuid) {
+ if (cur_tag->tag->_id == GL_TAG_FAVORITES_ID) {
+ if (gitem->item->favorite)
+ _gl_local_data_set_favorite(gitem->item,
+ false);
+ } else {
+ ret = _gl_local_data_remove_tag(cur_tag->tag,
+ gitem->item->uuid);
+ if (ret != 0)
+ gl_dbgW("_gl_local_data_remove_tag failed!");
+ }
+ } else {
+ gl_dbgE("Invalid item!");
+ }
+
+ gl_dbg("Write pipe, make progressbar updated!");
+ gl_thread_write_pipe(ad, i+1, popup_op);
+
+ gitem = NULL;
+ popup_op = GL_POPUP_OP_NONE;
+ }
+ return 0;
+}
+
+int gl_update_remove_tag_view(void *data)
+{
+ gl_dbg("");
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ gl_tag * cur_tag = ad->taginfo.current_tag;
+
+ if (!cur_tag || !cur_tag->tag) {
+ gl_dbgE("Null tag");
+ return -1;
+ }
+
+ /* Destroy selection info */
+ _gl_notify_destroy_selinfo(ad);
+ _gl_data_selected_list_finalize(ad);
+
+ /* Update item list */
+ if (cur_tag->tag->_id == GL_TAG_FAVORITES_ID)
+ _gl_data_get_item_list(ad, GL_CATEGORY_FAVORITES, NULL,
+ GL_GET_ALL_RECORDS, GL_GET_ALL_RECORDS);
+ else
+ _gl_data_get_item_list_tagname(ad, cur_tag->tag->_id, true,
+ NULL);
+
+ if (ad->maininfo.medias_cnt == 0) {
+ gl_dbg("All items removed, change to tags view");
+ _gl_tag_comeback_from_view(ad);
+
+ elm_naviframe_item_pop_to(ad->ctrlinfo.nf_it);
+ /* Only favorites tag, so disable edit button */
+ if (_gl_data_get_tag_count_all(ad) <= 1)
+ _gl_ctrl_disable_btn(ad, true, GL_NAVI_TAGS);
+ } else {
+ if (_gl_nocontents_show(ad)) {
+ gl_dbg("none video/image, show nocontents");
+ /* Add notification */
+ _gl_notify_create_notiinfo(ad, GL_STR_REMOVED);
+ return -1;
+ }
+ _gl_thumbs_show_edit_view(ad);
+
+ gl_ui_show_selall(ad);
+ edje_object_signal_emit(_EDJ(ad->gridinfo.navi_content_edit_ly),
+ GL_SIGNAL_VIEW_EDIT, "elm");
+ _gl_ctrl_disable_btns(ad, ad->gridinfo.nf_it_edit, true);
+ }
+ /* Add notification */
+ _gl_notify_create_notiinfo(ad, GL_STR_REMOVED);
+
+ return 0;
+}
+
+#ifdef _USE_ROTATE_BG
+
+int _gl_delay(double sec)
+{
+ gl_dbg("Start");
+ struct timeval tv;
+ unsigned int start_t = 0;
+ unsigned int end_t = 0;
+ unsigned int delay_t = (unsigned int)(sec * GL_TIME_USEC_PER_SEC);
+
+ gettimeofday(&tv, NULL);
+ start_t = tv.tv_sec * GL_TIME_USEC_PER_SEC + tv.tv_usec;
+
+ for(end_t = start_t; end_t - start_t < delay_t;) {
+ gettimeofday(&tv, NULL);
+ end_t = tv.tv_sec * GL_TIME_USEC_PER_SEC + tv.tv_usec;
+ }
+
+ gl_dbg("End");
+ return 0;
+}
+
+int _gl_rotate_images(void *data, bool b_left)
+{
+ gl_dbg("");
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ /* Get all selected medias count */
+ int cnt = _gl_data_selected_list_count(ad);
+ /* Check MMC state for cancel operation */
+ gl_check_mmc_state(ad, NULL);
+ gl_dbg("MMC state: %d.", ad->maininfo.mmc_state);
+ /* Rotate left */
+ int op_type = GL_MEDIA_OP_ROTATING_LEFT;
+ /* Rotate right */
+ if (!b_left)
+ op_type = GL_MEDIA_OP_ROTATING_RIGHT;
+ _gl_use_thread_operate_medias(ad, GL_STR_ROTATING, cnt, op_type);
+
+ return 0;
+}
+
+int _gl_rotate_selected(void *data, int op_type)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ /* Get all selected medias count */
+ int cnt = _gl_data_selected_list_count(ad);
+ gl_item *gitem = NULL;
+ int i = 0;
+ int popup_op = GL_POPUP_OP_NONE;
+ unsigned int orient = GL_ORIENTATION_ROT_ERR;
+ unsigned int new_orient = GL_ORIENTATION_ROT_ERR;
+ int ret = -1;
+ bool b_left = false;
+
+ if (op_type == GL_MEDIA_OP_ROTATING_LEFT)
+ b_left = true;
+
+ gl_cluster *current_album = ad->albuminfo.current_album;
+ /* Save cluster path to set new current_album from new albums list */
+ if (current_album && current_album->cluster &&
+ current_album->cluster->path &&
+ strlen(current_album->cluster->path))
+ g_strlcpy(ad->albuminfo.dest_folder,
+ current_album->cluster->path, GL_DIR_PATH_LEN_MAX);
+ else
+ gl_dbgE("Invalid folder path!");
+
+ /* Removed media from selected_media_elist */
+ for (i = 1; i <= cnt; i++) {
+ _gl_data_get_item_by_index(ad, i, true, &gitem);
+ if (gitem != NULL && gitem->item != NULL &&
+ gitem->item->file_url &&
+ gitem->item->type == MEDIA_CONTENT_TYPE_IMAGE &&
+ GL_FILE_EXISTS(gitem->item->file_url)) {
+ /* Save orient in file */
+ ret = _gl_exif_get_orientation(gitem->item->file_url,
+ &orient);
+ if (ret == 0) {
+ new_orient = _gl_exif_get_rotated_orientation(orient,
+ b_left);
+ _gl_exif_set_orientation(gitem->item->file_url,
+ new_orient);
+ /* Update thumbnail */
+ media_info_refresh_metadata_to_db(gitem->item->uuid);
+ }
+ } else {
+ gl_dbgE("Invalid item!");
+ }
+
+ /* Add some delay for last two images to wait for thumb updated */
+ if (i > cnt - 2)
+ _gl_delay(GL_ROTATE_DELAY);
+
+ if (i == cnt) {
+ gl_dbgW("Last image rotated!");
+ /* Add another delay for last thumb */
+ _gl_delay(GL_ROTATE_DELAY);
+ }
+ gl_dbg("Write pipe, make progressbar updated!");
+ gl_thread_write_pipe(ad, i, popup_op);
+ gitem = NULL;
+ }
+ /* Clear selected list */
+ _gl_data_selected_list_finalize(data);
+ return 0;
+}
+
+/* Update view after deleting process done */
+int _gl_update_rotate_view(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ _gl_data_selected_list_finalize(ad);
+
+ int view_mode = gl_get_view_mode(ad);
+ gl_dbg("view_mode: %d.", view_mode);
+ if (ad->ctrlinfo.tab_mode == GL_CTRL_TAB_TAGS)
+ _gl_data_update_item_list(ad);
+ else
+ __gl_refresh_albums_list(ad, false, false);
+
+ memset(ad->albuminfo.dest_folder, 0x00, GL_DIR_PATH_LEN_MAX);
+
+ _gl_update_operation_view(ad, GL_STR_ROTATED);
+
+ return 0;
+}
+
+#endif
+
+int _gl_slideshow(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ gl_item *cur_item = NULL;
+ media_content_type_e type = MEDIA_CONTENT_TYPE_OTHERS;
+
+ if (ad->gridinfo.view_mode == GL_THUMB_VIDEOS)
+ type = MEDIA_CONTENT_TYPE_VIDEO;
+ else if (ad->gridinfo.view_mode == GL_THUMB_IMAGES)
+ type = MEDIA_CONTENT_TYPE_IMAGE;
+
+ bool b_selected = false;
+ int view_mode = gl_get_view_mode(ad);
+ if (view_mode == GL_VIEW_THUMBS_EDIT)
+ b_selected = true;
+
+ _gl_data_get_first_item(ad, type, &cur_item, b_selected);
+ GL_CHECK_VAL(cur_item, -1);
+ if (b_selected)
+ gl_ext_load_iv_ug(ad, cur_item, GL_UG_IV_SLIDESHOW_SELECTED);
+ else
+ gl_ext_load_iv_ug(ad, cur_item, GL_UG_IV_SLIDESHOW);
+ return 0;
+}
+
+Eina_Bool gl_update_view(void *data, int mode)
+{
+ GL_CHECK_FALSE(data);
+ gl_appdata *ad = (gl_appdata *)data;
+ int view_mode = gl_get_view_mode(ad);
+ gl_dbg("view_mode: %d", view_mode);
+ if (mode == GL_UPDATE_VIEW_NONE) {
+ gl_dbg("Don't need to update");
+ return EINA_FALSE;
+ }
+
+ if (view_mode == GL_VIEW_ALBUMS ||
+ view_mode == GL_VIEW_ALBUMS_EDIT ||
+ view_mode == GL_VIEW_ALBUMS_RENAME) {
+ /* Albums list should be updated first */
+ gl_albums_update_view(ad);
+ } else if (view_mode == GL_VIEW_TAGS ||
+ view_mode == GL_VIEW_TAGS_EDIT) {
+ /* Update genlist changed to tab Tags */
+ gl_tag_update_view(data);
+ } else if (view_mode == GL_VIEW_THUMBS) {
+ /* Albums list should be updated first in tab Albums*/
+ if (ad->ctrlinfo.tab_mode == GL_CTRL_TAB_TAGS) {
+ _gl_update_thumb_items(ad, false);
+ return EINA_TRUE;
+ }
+
+ gl_cluster *cur_album = ad->albuminfo.current_album;
+
+ /* MMC removed, change to albums view if in mmc album */
+ if (mode == GL_UPDATE_VIEW_MMC_REMOVED && cur_album &&
+ cur_album->cluster &&
+ cur_album->cluster->type == GL_STORE_T_MMC) {
+ gl_dbgW("MMC removed, change to albums view!");
+ gl_pop_to_ctrlbar_ly(ad, true);
+ return EINA_TRUE;
+ }
+
+ /* Albums list should be updated first */
+ _gl_update_thumb_items(ad, true);
+ } else if (view_mode == GL_VIEW_THUMBS_EDIT) {
+ /* Check thread operation case */
+ if (ad->pbarinfo.sync_pipe) {
+ gl_dbgW("Thread operation is in process!");
+ return EINA_TRUE;
+ }
+
+ /* Albums list should be updated first in tab Albums*/
+ if (ad->ctrlinfo.tab_mode == GL_CTRL_TAB_TAGS) {
+ _gl_update_thumb_items(ad, false);
+ return EINA_TRUE;
+ }
+
+ gl_cluster *cur_album = ad->albuminfo.current_album;
+ /* MMC removed, change to albums view if in mmc album */
+ if (mode == GL_UPDATE_VIEW_MMC_REMOVED && cur_album &&
+ cur_album->cluster &&
+ cur_album->cluster->type == GL_STORE_T_MMC) {
+ gl_dbgW("MMC removed, change to albums view!");
+ gl_pop_to_ctrlbar_ly(ad, true);
+ return EINA_TRUE;
+ }
+
+ /* Albums list should be updated first */
+ _gl_update_thumb_items(ad, true);
+ return EINA_TRUE;
+ } else if (view_mode == GL_VIEW_ALBUMS_SELECT) {
+ gl_albums_update_view(ad);
+ } else if (view_mode == GL_VIEW_THUMBS_SELECT) {
+ _gl_update_select_thumb_items(ad);
+ }
+ return EINA_TRUE;
+}
+
+/**
+* Parse medias type and count of selected items,
+* and set different type for share items.
+*/
+int gl_get_share_mode(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ int share_mode = GL_SHARE_NONE;
+ int image_cnt = 0;
+ int video_cnt = 0;
+ int sel_cnt = 0;
+ int view_m = gl_get_view_mode(ad);
+ if (view_m == GL_VIEW_ALBUMS_EDIT) {
+ GL_CHECK_VAL(ad->albuminfo.selected_albums_elist, -1);
+ gl_cluster *cur_album = NULL;
+ cur_album = eina_list_nth(ad->albuminfo.selected_albums_elist, 0);
+ GL_CHECK_VAL(cur_album, -1);
+ GL_CHECK_VAL(cur_album->cluster, -1);
+ sel_cnt = ad->selectedinfo.sel_cnt;
+ } else if (view_m == GL_VIEW_TAGS_EDIT) {
+ sel_cnt = ad->selectedinfo.sel_cnt;
+ } else if (view_m == GL_VIEW_ALBUMS) {
+ sel_cnt = ad->selectedinfo.sel_cnt;
+ } else {
+ GL_CHECK_VAL(ad->selectedinfo.medias_elist, -1);
+ sel_cnt = eina_list_count(ad->selectedinfo.medias_elist);
+ }
+ image_cnt = ad->selectedinfo.images_cnt;
+ if(image_cnt > sel_cnt) {
+ gl_dbgE("Images count is wrong!");
+ return -1;
+ }
+
+ video_cnt = sel_cnt - image_cnt;
+ gl_dbg("Selected items count: %d, image count: %d, video count: %d.",
+ sel_cnt, image_cnt, video_cnt);
+
+ if (ad->selectedinfo.drms_cnt) {
+ share_mode = GL_SHARE_DRM;
+ } else if (image_cnt && video_cnt) {
+ share_mode = GL_SHARE_IMAGE_VIDEO;
+ } else if (image_cnt) {
+ if (ad->selectedinfo.jpeg_cnt == sel_cnt) {
+ if (image_cnt == 1)
+ share_mode = GL_SHARE_IMAGE_ONE_JPEG;
+ else
+ share_mode = GL_SHARE_IMAGE_MULTI_JPEG;
+ } else {
+ if (image_cnt == 1)
+ share_mode = GL_SHARE_IMAGE_ONE;
+ else
+ share_mode = GL_SHARE_IMAGE_MULTI;
+ }
+ } else if (video_cnt) {
+ if (video_cnt == 1) {
+ share_mode = GL_SHARE_VIDEO_ONE;
+ } else {
+ share_mode = GL_SHARE_VIDEO_MULTI;
+ }
+ } else {
+ gl_dbgE("Error: no video and image!");
+ return -1;
+ }
+ gl_dbg("share_mode is %d.", share_mode);
+
+ return share_mode;
+}
+
+int _gl_destroy_ctrl_edit_view(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+
+ if (ad->ctrlinfo.ctrlbar_edit_ly) {
+ evas_object_del(ad->ctrlinfo.ctrlbar_edit_ly);
+ ad->ctrlinfo.ctrlbar_edit_view = NULL;
+ ad->ctrlinfo.ctrlbar_edit_ly = NULL;
+ }
+ return 0;
+}
+
+int _gl_destroy_thumbs_edit_view(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+
+ if (ad->gridinfo.navi_content_edit_ly) {
+ _gl_thumbs_clear_cbs(ad->gridinfo.navi_content_edit_view);
+ evas_object_del(ad->gridinfo.navi_content_edit_ly);
+ ad->gridinfo.navi_content_edit_view = NULL;
+ ad->gridinfo.navi_content_edit_ly = NULL;
+ }
+ return 0;
+}
+
+int gl_destroy_thumbs_view(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ int view_mode = gl_get_view_mode(ad);
+ gl_dbg("view_mode: %d.", view_mode);
+
+ gl_del_invalid_widgets(ad, GL_INVALID_NONE);
+
+ if(ad->gridinfo.navi_content_edit_view) {
+ _gl_destroy_thumbs_edit_view(ad);
+ _gl_data_selected_list_finalize(ad);
+ } else {
+ _gl_thumbs_del_append_idler(ad);
+ }
+ _gl_notify_destroy_selinfo(ad);
+ /* destroy imf */
+ _gl_editfield_destroy_imf(ad);
+
+ _gl_thumbs_delete_view(ad);
+
+ ad->albuminfo.current_album = NULL;
+ ad->taginfo.current_tag = NULL;
+
+ /* Pop to controlbar layout */
+ elm_naviframe_item_pop_to(ad->ctrlinfo.nf_it);
+
+ if (view_mode == GL_VIEW_THUMBS_SELECT) {
+ if (ad->gridinfo.select_view) {
+ _gl_thumbs_clear_cbs(ad->gridinfo.select_view);
+ ad->gridinfo.select_view = NULL;
+ }
+ ad->gridinfo.select_view_ly = NULL;
+ ad->gridinfo.nf_it_select = NULL;
+
+ ad->albuminfo.select_view = NULL;
+ ad->albuminfo.select_view_ly = NULL;
+ ad->albuminfo.nf_it_select = NULL;
+ }
+ return 0;
+}
+
+/**
+* b_update_albums_list
+* True: Update albums list. False: Albums list already updated.
+*
+* It's in thumbnails view, video list view, or selectioinfo view.
+* Destroy invalid widegets or UGs.
+* Pop current invalid view to controlbar layout,
+*/
+int gl_pop_to_ctrlbar_ly(void *data, bool b_update_albums_list)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ gl_dbg("b_update_albums_list: %d", b_update_albums_list);
+
+ /* Destroy thumbnails/video_list view then pop to ctrlbar_ly */
+ gl_destroy_thumbs_view(ad);
+
+ /* Update albums list */
+ if (b_update_albums_list)
+ gl_refresh_albums_list(ad);
+
+ if (gl_check_gallery_empty(ad)) {
+ /* None albums exist, Change to albums view. */
+ gl_dbgW("Empty Gallery, change to Albums view.");
+ if (ad->ctrlinfo.tab_mode == GL_CTRL_TAB_TAGS) {
+ /* Change to Albums tab. */
+ gl_dbg("Not in Albums tab.");
+ Elm_Object_Item *first_it = NULL;
+ Evas_Object *ctrlbar = ad->ctrlinfo.ctrlbar;
+ first_it = elm_toolbar_first_item_get(ctrlbar);
+ GL_CHECK_VAL(first_it, -1);
+ elm_toolbar_item_selected_set(first_it, EINA_TRUE);
+ return 0;
+ }
+ gl_albums_comeback_from_view(ad);
+ /* None albums, disable edit button/controlbar */
+ _gl_ctrl_disable_btn(ad, true, GL_NAVI_ALBUMS);
+ gl_ctrl_disable_ctrlbar(ad, true);
+ } else if (ad->ctrlinfo.tab_mode == GL_CTRL_TAB_TAGS) {
+ /* Change to tags view */
+ gl_dbg("Change to Tags view.");
+ _gl_tag_comeback_from_view(ad);
+ /* Only favorites tag exists, disable edit button */
+ if (_gl_data_get_tag_count_all(ad) <= 1)
+ _gl_ctrl_disable_btn(ad, true, GL_NAVI_TAGS);
+ } else {
+ /* Change to albums view. */
+ gl_dbg("Change to Albums view.");
+ gl_albums_comeback_from_view(ad);
+ /* None editable albums, disable edit button */
+ if (ad->albuminfo.cluster_list->edit_cnt == 0)
+ _gl_ctrl_disable_btn(ad, true, GL_NAVI_ALBUMS);
+ }
+ return 0;
+}
+
+/* Vibrate device */
+int gl_play_vibration(void *data)
+{
+ gl_dbg("");
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ haptic_device_h *device_handle = NULL;
+ haptic_effect_h *effect_handle = NULL;
+ int ret = -1;
+
+ if (ad->entryinfo.haptic_handle >= 0) {
+ gl_dbg("Remove previous haptic handle.");
+ _gl_stop_vibration(ad);
+ }
+ device_handle = (haptic_device_h *)malloc(sizeof(haptic_device_h));
+ if (device_handle == NULL) {
+ gl_dbgE("malloc fail");
+ return -1;
+ }
+ ret = haptic_open(HAPTIC_DEVICE_ALL,device_handle);
+ if (ret != HAPTIC_ERROR_NONE) {
+ gl_dbgE("haptic_open failed[%d]!", ret);
+ GL_FREEIF(device_handle);
+ return -1;
+ }
+
+ if (ad->entryinfo.vibration_timer) {
+ ecore_timer_del(ad->entryinfo.vibration_timer);
+ ad->entryinfo.vibration_timer = NULL;
+ }
+ Ecore_Timer *vibration_timer = NULL;
+ vibration_timer = ecore_timer_add(GL_TIMER_INTERVAL_VIBRATION,
+ _gl_vibration_timer_cb, data);
+ ad->entryinfo.vibration_timer = vibration_timer;
+
+ effect_handle = (haptic_effect_h *)malloc(sizeof(haptic_effect_h));
+ if (effect_handle == NULL) {
+ gl_dbgE("effect_handle malloc fail");
+ GL_FREEIF(device_handle);
+ return -1;
+ }
+ ret = haptic_vibrate_monotone(*device_handle,
+ GL_VIBRATION_DURATION, effect_handle);
+ if (ret != HAPTIC_ERROR_NONE) {
+ gl_dbgE("haptic_vibrate_monotone failed[%d]!", ret);
+ GL_FREEIF(device_handle);
+ GL_FREEIF(effect_handle);
+ return -1;
+ }
+
+ ad->entryinfo.device_handle = device_handle;
+ ad->entryinfo.effect_handle = effect_handle;
+ ad->entryinfo.haptic_handle = GL_VIBRATION_DEVICE;
+
+ return 0;
+}
+
+/* Change int to char * of video duration, caller need to free the allocated memory */
+char *_gl_get_duration_string(unsigned int v_dur)
+{
+ char *dur_str = calloc(1, GL_FILE_PATH_LEN_MAX);
+ GL_CHECK_NULL(dur_str);
+ if (v_dur > 0) {
+ int duration = floor(v_dur / GL_TIME_MSEC_PER_SEC);
+ int dur_hr = 0;
+ int dur_min = 0;
+ int dur_sec = 0;
+ int tmp = 0;
+
+ if (duration >= GL_TIME_SEC_PER_HOUR) {
+ dur_sec = duration % GL_TIME_SEC_PER_MIN;
+ tmp = floor(duration / GL_TIME_SEC_PER_MIN);
+ dur_min = tmp % GL_TIME_MIN_PER_HOUR;
+ dur_hr = floor(tmp / GL_TIME_MIN_PER_HOUR);
+ } else if (duration >= GL_TIME_SEC_PER_MIN) {
+ dur_hr = 0;
+ dur_min = floor(duration / GL_TIME_SEC_PER_MIN);
+ dur_sec = duration % GL_TIME_SEC_PER_MIN;
+ } else {
+ dur_hr = 0;
+ dur_min = 0;
+ dur_sec = duration % GL_TIME_SEC_PER_MIN;
+ }
+
+ snprintf(dur_str, GL_FILE_PATH_LEN_MAX, "%02d:%02d:%02d",
+ dur_hr, dur_min, dur_sec);
+ } else {
+ snprintf(dur_str, GL_FILE_PATH_LEN_MAX, "00:00:00");
+ }
+ dur_str[strlen(dur_str)] = '\0';
+ return dur_str;
+}
+
+gl_icon_type _gl_get_icon_type(gl_item *git)
+{
+ if (git == NULL || git->item == NULL || git->item->file_url == NULL) {
+ gl_dbgE("Invalid item :%p", git);
+ return GL_ICON_CORRUPTED_FILE;
+ }
+ /* Is it DRM file? Has a valid RO? */
+ if(gl_drm_is_drm_file(git->item->file_url) &&
+ gl_drm_check_valid_ro(git->item->file_url, gl_drm_get_permtype(git->item->type)) == false) {
+ return GL_ICON_EXPIRED_DRM;
+ }
+
+ return GL_ICON_NORMAL;
+}
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "gl-debug.h"
+#include "gl-ui-util.h"
+#include "gl-button.h"
+#include "gl-strings.h"
+
+#define GL_BTN_POPUP "popup_button/default"
+
+/*******************************************************
+** Prototype : _gl_but_create_but
+** Description : Create button
+** Input : Evas_Object *parent
+** Input : const char *icon
+** Input : const char *text
+** Input : const char *style
+** Input : But_Smart_Cb cb_func
+** Input : const void *data
+** Output : None
+** Return Value :
+** Calls :
+** Called By :
+**
+** History :
+** 1.Date : 2011/06/10
+** Author : Samsung
+** Modification : Created function
+**
+*********************************************************/
+Evas_Object *_gl_but_create_but(Evas_Object *parent, const char *icon,
+ const char *text, const char *style,
+ But_Smart_Cb cb_func, const void *data)
+{
+ Evas_Object *btn = NULL;
+ GL_CHECK_NULL(parent);
+
+ btn = elm_button_add(parent);
+ GL_CHECK_NULL(btn);
+ elm_object_focus_allow_set(btn, EINA_FALSE);
+
+ if (style)
+ elm_object_style_set(btn, style);
+ evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ if (icon) {
+ gl_dbg("Button icon: %s", icon);
+ Evas_Object *ic = NULL;
+ ic = elm_icon_add(btn);
+ GL_CHECK_NULL(ic);
+ elm_image_file_set(ic, icon, NULL);
+ elm_image_aspect_fixed_set(ic, EINA_TRUE);
+ elm_image_fill_outside_set(ic, EINA_TRUE);
+ evas_object_size_hint_aspect_set(ic,
+ EVAS_ASPECT_CONTROL_VERTICAL,
+ 1, 1);
+ evas_object_size_hint_align_set(ic, EVAS_HINT_FILL,
+ EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(ic, EVAS_HINT_EXPAND,
+ EVAS_HINT_EXPAND);
+ elm_image_resizable_set(ic, EINA_TRUE, EINA_TRUE);
+ elm_object_content_set(btn, ic);
+ }
+
+ if (text) {
+ gl_dbg("Button text: %s", text);
+ elm_object_text_set(btn, text);
+ }
+
+ if (cb_func)
+ evas_object_smart_callback_add(btn, "clicked", cb_func, data);
+
+ return btn;
+}
+
+Evas_Object *_gl_but_create_but_popup(Evas_Object *parent, const char *text,
+ But_Smart_Cb cb_func, const void *data)
+{
+ return _gl_but_create_but(parent, NULL, text, GL_BTN_POPUP, cb_func, data);
+}
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "gl-debug.h"
+#include "gl-ui-util.h"
+#include "gl-util.h"
+#include "gl-controlbar.h"
+#include "gl-albums.h"
+#include "gl-thumbs.h"
+#include "gl-data.h"
+#include "gl-tags.h"
+#include "gl-strings.h"
+#include "gl-icons.h"
+#include "gl-notify.h"
+#include "gl-progressbar.h"
+#include "gl-ctxpopup.h"
+
+#define GL_CTRL_STYLE_TABBAR "tabbar"
+#define GL_CTRL_STYLE_TABBAR_LAND "tabbar/item_horizontal"
+
+#define GL_CTRL_SEG_STYLE "gallery/default"
+/* (144x3) */
+#define GL_SEGMENT_WIDTH_MIN_INC (396*elm_config_scale_get())
+
+static int __gl_ctrl_reset_btn(void *data, int grid_mode)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+
+ bool is_zero = false;
+ gl_dbg("changed between tool tab(all/image/video)");
+ if (grid_mode == GL_THUMB_VIDEOS)
+ is_zero = _gl_data_is_item_cnt_zero(ad, MEDIA_CONTENT_TYPE_VIDEO);
+ else if (grid_mode == GL_THUMB_IMAGES)
+ is_zero = _gl_data_is_item_cnt_zero(ad, MEDIA_CONTENT_TYPE_IMAGE);
+
+ /* none items, disable 'edit' button */
+ if (is_zero) {
+ _gl_ui_disable_btn(ad->gridinfo.edit_btn);
+ _gl_ui_disable_slideshow(ad, true);
+ } else {
+ _gl_ui_enable_btn(ad->gridinfo.edit_btn);
+ _gl_ui_disable_slideshow(ad, false);
+ }
+ return 0;
+}
+
+void _gl_ctrl_segment_change_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ GL_CHECK(data);
+ gl_appdata *ad = (gl_appdata *)data;
+ gl_dbg("");
+
+ if (ad->uginfo.ug_called_by_me || ad->gridinfo.grid_append_idler) {
+ gl_dbgW("UG invoked or appending gridview!");
+ return;
+ }
+
+ const char *label = NULL;
+ label = elm_object_item_text_get((Elm_Object_Item *)event_info);
+ GL_CHECK(label);
+ gl_dbg("label: %s", label);
+ _gl_ctxpopup_del(data);
+
+ int old_m = ad->gridinfo.view_mode;
+
+ if (!g_strcmp0(label, GL_STR_ALL)) {
+ gl_dbg("Creating all-media view");
+ ad->gridinfo.view_mode = GL_THUMB_ALL;
+ } else if (!g_strcmp0(label, GL_STR_IMAGES)) {
+ gl_dbg("Creating image view");
+ ad->gridinfo.view_mode = GL_THUMB_IMAGES;
+ } else if (!g_strcmp0(label, GL_STR_VIDEOS)) {
+ gl_dbg("Creating video view");
+ ad->gridinfo.view_mode = GL_THUMB_VIDEOS;
+ } else {
+ gl_dbgE("Wrong label!");
+ return;
+ }
+
+ if (ad->gridinfo.view_mode == old_m) {
+ gl_dbgW("Already showed!");
+ return;
+ }
+
+ if (ad->gridinfo.all_grid_view == NULL)
+ ad->gridinfo.all_grid_view = _gl_thumbs_add_grid(ad,
+ ad->gridinfo.navi_content_ly,
+ ad->gridinfo.view_mode,
+ false);
+ else
+ _gl_thumbs_update_view(ad);
+
+ elm_object_part_content_unset(ad->gridinfo.navi_content_ly,
+ "elm.swallow.view");
+ evas_object_show(ad->gridinfo.all_grid_view);
+ elm_object_part_content_set(ad->gridinfo.navi_content_ly,
+ "elm.swallow.view",
+ ad->gridinfo.all_grid_view);
+
+ __gl_ctrl_reset_btn(ad, ad->gridinfo.view_mode);
+ gl_set_view_mode(ad, GL_VIEW_THUMBS);
+}
+
+/* Pop naviframe item when show albums/tags edit view */
+static int _gl_ctrl_popup_edit_view(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ GL_CHECK_VAL(ad->ctrlinfo.nf_it, -1);
+
+ elm_naviframe_item_pop_to(ad->ctrlinfo.nf_it);
+ ad->ctrlinfo.nf_it_edit = NULL;
+ return 0;
+}
+
+static int __gl_ctrl_reset_albums(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ int view_mode = gl_get_view_mode(ad);
+
+ if (view_mode == GL_VIEW_ALBUMS_EDIT) {
+ /* Destroy data */
+ _gl_data_finalize_albums_selected_list(ad);
+ /* Refresh albums list */
+ _gl_data_get_cluster_list(ad);
+ }
+
+ return 0;
+}
+
+static int __gl_ctrl_reset_tags(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ int view_mode = gl_get_view_mode(ad);
+
+ /* Destroy data */
+ if (view_mode == GL_VIEW_TAGS_EDIT)
+ _gl_data_finalize_tags_selected_list(ad);
+
+ if (ad->taginfo.tags_view)
+ gl_tag_unset_rename(ad);
+ ad->taginfo.current_tag = NULL;
+
+ return 0;
+}
+
+static int __gl_ctrl_reset_previous_tab(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+
+ switch (ad->ctrlinfo.tab_mode) {
+ case GL_CTRL_TAB_ALBUMS:
+ __gl_ctrl_reset_albums(ad);
+ break;
+ case GL_CTRL_TAB_TAGS:
+ __gl_ctrl_reset_tags(ad);
+ break;
+ default:
+ gl_dbgE("Wrong tabbar mode!");
+ return -1;
+ }
+
+ /* Delete layout and edit view */
+ _gl_destroy_ctrl_edit_view(ad);
+ /* Delete naviframe item */
+ _gl_ctrl_popup_edit_view(ad);
+
+ /* Hide previous view */
+ Evas_Object *pre_view = NULL;
+ pre_view = elm_object_part_content_unset(ad->ctrlinfo.ctrlbar_view_ly,
+ "contents");
+ evas_object_hide(pre_view);
+
+ return 0;
+}
+
+static int __gl_ctrl_remake_btns(void *data, gl_ctrl_tab_mode mode)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+
+ /* Reset some flags */
+ ad->albuminfo.b_edit_disable = false;
+ ad->taginfo.b_edit_disable = false;
+
+ switch (mode) {
+ case GL_CTRL_TAB_ALBUMS:
+ gl_dbg("GL_CTRL_TAB_ALBUMS");
+ /* add items */
+ _gl_ui_add_btns_albums(ad, GL_UI_ALBUMS_REMAKE);
+ break;
+ case GL_CTRL_TAB_TAGS:
+ gl_dbg("GL_CTRL_TAB_TAGS");
+ _gl_tags_add_btns(ad);
+ break;
+ default:
+ gl_dbgE("Error mode!");
+ return -1;
+ }
+ gl_dbg("Done");
+
+ return 0;
+}
+
+static void _gl_ctrl_view_change_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ GL_CHECK(obj);
+ GL_CHECK(data);
+ gl_appdata *ad = (gl_appdata *)data;
+ int view_mode = gl_get_view_mode(ad);
+ gl_dbg("view_mode: %d, tab_mode: %d", view_mode, ad->ctrlinfo.tab_mode);
+ Elm_Object_Item *it = elm_toolbar_selected_item_get(obj);
+ GL_CHECK(it);
+ const char *selected_label = elm_object_item_text_get(it);
+ GL_CHECK(selected_label);
+ gl_dbg("Tab %s selected.", selected_label);
+ _gl_ctxpopup_del(data);
+
+ if (!g_strcmp0(selected_label, GL_STR_CTRL_ITEM_ALBUMS)) {
+ gl_dbg("Albums");
+ if (ad->ctrlinfo.tab_mode == GL_CTRL_TAB_ALBUMS) {
+ gl_dbg("Already in Albums Tab.");
+ return;
+ }
+ __gl_ctrl_reset_previous_tab(ad);
+ gl_set_view_mode(ad, GL_VIEW_ALBUMS);
+
+ _gl_data_get_cluster_list(ad);
+ gl_albums_update_items(ad);
+
+ if (ad->albuminfo.albums_nocontents) {
+ gl_ctrl_disable_ctrlbar(ad, true);
+ } else {
+ evas_object_show(ad->albuminfo.albums_view);
+ elm_object_part_content_set(ad->ctrlinfo.ctrlbar_view_ly,
+ "contents",
+ ad->albuminfo.albums_view);
+ }
+
+ ad->ctrlinfo.tab_mode = GL_CTRL_TAB_ALBUMS;
+
+ __gl_ctrl_remake_btns(ad, GL_CTRL_TAB_ALBUMS);
+ } else if (!g_strcmp0(selected_label, GL_STR_CTRL_ITEM_TAGS)) {
+ gl_dbg("Tags");
+ if (ad->ctrlinfo.tab_mode == GL_CTRL_TAB_TAGS) {
+ gl_dbg("Already in Tags Tab.");
+ return;
+ }
+
+ __gl_ctrl_reset_previous_tab(ad);
+ gl_set_view_mode(ad, GL_VIEW_TAGS);
+
+ if (ad->taginfo.tags_view)
+ gl_tag_update_view(ad);
+ else
+ ad->taginfo.tags_view = gl_tag_create_view(ad,
+ ad->ctrlinfo.ctrlbar_view_ly);
+ evas_object_show(ad->taginfo.tags_view);
+ elm_object_part_content_set(ad->ctrlinfo.ctrlbar_view_ly,
+ "contents", ad->taginfo.tags_view);
+
+ ad->taginfo.current_tag = NULL;
+ ad->ctrlinfo.tab_mode = GL_CTRL_TAB_TAGS;
+
+ __gl_ctrl_remake_btns(ad, GL_CTRL_TAB_TAGS);
+ }
+}
+
+static int __gl_ctrl_disable_btn(void *data, int mode)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+
+ if (mode == GL_NAVI_ALBUMS) {
+ gl_dbg("GL_NAVI_ALBUMS");
+ /* disable 'edit' button */
+ ad->albuminfo.b_edit_disable = true;
+ } else if (mode == GL_NAVI_TAGS) {
+ gl_dbg("GL_NAVI_TAGS");
+ /* disable 'edit' button */
+ ad->taginfo.b_edit_disable = true;
+ }else if (mode == GL_NAVI_THUMBS) {
+ gl_dbg("GL_NAVI_THUMBS");
+ /* disable 'edit' button */
+ _gl_ui_disable_btn(ad->gridinfo.edit_btn);
+ _gl_ui_disable_btn(ad->gridinfo.slideshow_btn);
+ /* Check title button */
+ if (ad->ctrlinfo.tab_mode == GL_CTRL_TAB_TAGS)
+ _gl_ui_show_add_btn(ad);
+ } else {
+ gl_dbgE("Unkonw mode");
+ return -1;
+ }
+ return 0;
+}
+
+static int __gl_ctrl_enable_btn(void *data, int mode)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ gl_dbg("mode: %d", mode);
+
+ if (mode == GL_NAVI_ALBUMS) {
+ gl_dbg("GL_NAVI_ALBUMS");
+ /* enable 'edit' item */
+ if (!gl_check_gallery_empty(ad) &&
+ ad->albuminfo.cluster_list->edit_cnt) {
+ ad->albuminfo.b_edit_disable = false;
+ } else {
+ ad->albuminfo.b_edit_disable = true;
+ }
+ } else if (mode == GL_NAVI_THUMBS) {
+ gl_dbg("GL_NAVI_THUMBS");
+ /* enable 'Edit' button */
+ _gl_ui_enable_btn(ad->gridinfo.edit_btn);
+ /* Check more button */
+ if (ad->ctrlinfo.tab_mode == GL_CTRL_TAB_TAGS) {
+ Evas_Object *more_btn = NULL;
+ more_btn = _gl_ui_get_btn(ad, NULL, GL_NAVIFRAME_MORE);
+ if (ad->maininfo.medias_cnt)
+ _gl_ui_enable_btn(more_btn);
+ else
+ _gl_ui_disable_btn(more_btn);
+ /* Check "+" button */
+ _gl_ui_show_add_btn(ad);
+ }
+
+ if (ad->maininfo.medias_cnt)
+ _gl_ui_disable_slideshow(ad, false);
+ else
+ _gl_ui_disable_slideshow(ad, true);
+ } else if (mode == GL_NAVI_TAGS) {
+ gl_dbg("GL_NAVI_TAGS");
+ /* enable 'edit' button not only favorites tag */
+ if (_gl_data_get_tag_count_all(ad) > 1)
+ ad->taginfo.b_edit_disable = false;
+ else
+ ad->taginfo.b_edit_disable = true;
+ } else {
+ gl_dbgE("Unkonw mode");
+ return -1;
+ }
+
+ return 0;
+}
+
+/* Enable all buttons except for some special cases */
+static int __gl_ctrl_enable_btns(gl_appdata *ad, Elm_Object_Item *nf_it)
+{
+ gl_dbg("");
+ GL_CHECK_VAL(ad, -1);
+ GL_CHECK_VAL(nf_it, -1);
+ bool b_disable_del = false;
+ bool b_disable_share = false;
+
+ int view_mode = gl_get_view_mode(ad);
+ if (view_mode == GL_VIEW_ALBUMS_EDIT) {
+ GL_CHECK_VAL(ad->albuminfo.selected_albums_elist, -1);
+ int sel_cnt = 0;
+ sel_cnt = _gl_data_get_albums_selected_cnt(ad);
+
+ gl_cluster *album_item = NULL;
+ int i = 0;
+ for (i = 0; i < sel_cnt; i++) {
+ if (b_disable_del && b_disable_share)
+ break;
+ album_item = eina_list_nth(ad->albuminfo.selected_albums_elist,
+ i);
+ if (album_item == NULL || album_item->cluster == NULL ||
+ album_item->cluster->uuid == NULL) {
+ gl_dbgE("Invlaid album item!");
+ continue;
+ }
+ /* All albums couldn't be deleted, so disable Delete item */
+ if (album_item->cluster->type == GL_STORE_T_ALL) {
+ gl_dbg("All albums, disable Delete item.");
+ b_disable_del = true;
+ /* Disable share*/
+ if (sel_cnt > 1)
+ b_disable_share = true;
+ }
+ album_item = NULL;
+ }
+ }
+ int share_m = gl_get_share_mode(ad);
+ if ((view_mode == GL_VIEW_THUMBS_EDIT ||
+ view_mode == GL_VIEW_ALBUMS_EDIT ||
+ view_mode == GL_VIEW_TAGS_EDIT) && share_m == GL_SHARE_DRM) {
+ gl_dbgW("Selected item is DRM file!");
+ b_disable_share = true;
+ }
+
+ /* more-share-delete */
+ _gl_ui_disable_each_btn(nf_it, false, b_disable_share, b_disable_del);
+ return 0;
+}
+
+Evas_Object *
+gl_ctrl_create_ctrlbar_view(Evas_Object * parent)
+{
+ gl_dbg("");
+ GL_CHECK_NULL(parent);
+
+ Evas_Object *layout = NULL;
+ layout = gl_ui_load_edj(parent, GL_EDJ_FILE, GL_GRP_CONTROLBAR);
+ GL_CHECK_NULL(layout);
+ evas_object_show(layout);
+
+ return layout;
+}
+
+Evas_Object *gl_ctrl_create_ctrlbar_ly(Evas_Object *parent)
+{
+ gl_dbg("");
+ gl_dbg_launch(" gl_ctrl_create_ctrlbar_ly:start");
+ GL_CHECK_NULL(parent);
+ Evas_Object *layout = NULL;
+ layout = gl_ui_load_edj(parent, GL_EDJ_FILE, GL_GRP_CONTROLBAR_LY);
+ GL_CHECK_NULL(layout);
+ evas_object_show(layout);
+
+ gl_dbg_launch(" gl_ctrl_create_ctrlbar_ly:end");
+
+ return layout;
+}
+
+Evas_Object *gl_ctrl_create_ctrlbar(void *data, int mode)
+{
+ gl_dbg_launch(" gl_ctrl_create_ctrlbar:start");
+ gl_dbg("mode: %d", mode);
+ GL_CHECK_NULL(data);
+ gl_appdata *ad = (gl_appdata *)data;
+ Evas_Object *cbar = NULL;
+ Elm_Object_Item *item[GL_CTRL_TAB_CNT];
+
+ if (ad->ctrlinfo.ctrlbar != NULL) {
+ gl_dbg("Remove the existed control bar");
+ evas_object_del(ad->ctrlinfo.ctrlbar);
+ ad->ctrlinfo.ctrlbar = NULL;
+ }
+
+ gl_dbg_launch(" elm_toolbar_add:start");
+ cbar = elm_toolbar_add(ad->ctrlinfo.ctrlbar_ly);
+ gl_dbg_launch(" elm_toolbar_add:end");
+ GL_CHECK_NULL(cbar);
+ gl_dbg("elm_toolbar_add:done");
+ elm_toolbar_shrink_mode_set(cbar, ELM_TOOLBAR_SHRINK_EXPAND);
+ elm_toolbar_transverse_expanded_set(cbar, EINA_TRUE);
+
+ if (mode != GL_CTRL_TAB_ALBUMS) {
+ ad->ctrlinfo.tab_mode = -1;
+ gl_dbgW("Set tab_mode as -1!");
+ }
+
+ if (mode == GL_CTRL_TAB_ALBUMS || mode == GL_CTRL_TAB_TAGS) {
+ int rotate_mode = ad->maininfo.rotate_mode;
+ ad->ctrlinfo.rotate_mode = rotate_mode;
+ gl_dbg("Rotate_mode is %d", rotate_mode);
+ if ((rotate_mode == APP_DEVICE_ORIENTATION_270) ||
+ (rotate_mode == APP_DEVICE_ORIENTATION_90)) {
+ elm_object_style_set(cbar, GL_CTRL_STYLE_TABBAR_LAND);
+ } else {
+ elm_object_style_set(cbar, GL_CTRL_STYLE_TABBAR);
+ }
+
+ gl_dbg_launch(" elm_toolbar_item_append:start");
+ item[GL_CTRL_TAB_ALBUMS] = elm_toolbar_item_append(cbar,
+ GL_CTRL_ICON_ALBUMS,
+ GL_STR_CTRL_ITEM_ALBUMS,
+ _gl_ctrl_view_change_cb,
+ ad);
+ item[GL_CTRL_TAB_TAGS] = elm_toolbar_item_append(cbar,
+ GL_CTRL_ICON_TAGS,
+ GL_STR_CTRL_ITEM_TAGS,
+ _gl_ctrl_view_change_cb,
+ ad);
+ gl_dbg_launch(" elm_toolbar_item_append:end");
+ gl_dbg("elm_toolbar_item_append:done");
+ elm_toolbar_select_mode_set(cbar, ELM_OBJECT_SELECT_MODE_ALWAYS);
+
+ if (ad->albuminfo.gallery_launched == true) {
+ if (gl_check_gallery_empty(ad)) {
+ /**
+ * disable control bar when none album exists.
+ * or file system is unmounted.
+ */
+ gl_dbg("Disable tabbar items");
+ int i = 0;
+ for (i = 0; i < GL_CTRL_TAB_CNT; i++)
+ elm_object_item_disabled_set(item[i],
+ EINA_TRUE);
+ }
+
+ elm_toolbar_item_selected_set(item[mode], EINA_TRUE);
+ }
+ }
+ gl_dbg_launch(" gl_ctrl_create_ctrlbar:end");
+
+ return cbar;
+}
+
+//disable/enable controlbar tab event.
+int
+gl_ctrl_disable_tab_event(void *data, bool disabled)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ GL_CHECK_VAL(ad->ctrlinfo.ctrlbar, -1);
+ gl_dbgE("TODO: Check me");
+
+ if (gl_get_view_mode(ad) == GL_VIEW_ALBUMS)
+ {
+ /*if (disabled)
+ {
+ evas_object_smart_callback_del(ad->ctrlinfo.ctrlbar,
+ "view,change,before",
+ _gl_ctrl_view_change_cb);
+ }
+ else
+ {
+ evas_object_smart_callback_add(ad->ctrlinfo.ctrlbar,
+ "view,change,before",
+ _gl_ctrl_view_change_cb, ad);
+ }*/
+ }
+
+ return 0;
+}
+
+/* Select new tab, view changed callback would be invoked */
+int _gl_ctrl_sel_tabbar_item(void *data, const char *aul_type)
+{
+ GL_CHECK_VAL(data, -1);
+ GL_CHECK_VAL(aul_type, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ Elm_Object_Item *cbar_it = NULL;
+ cbar_it = elm_toolbar_first_item_get(ad->ctrlinfo.ctrlbar);
+ const char *text = NULL;
+ int len = strlen(aul_type);
+ bool b_found = false;
+ const char *tab_i18n_text = NULL;
+ gl_dbg("AUL type: %s", aul_type);
+
+ if (strncasecmp(aul_type, GL_AUL_ALBUM, len) == 0)
+ tab_i18n_text = GL_STR_CTRL_ITEM_ALBUMS;
+ else if (strncasecmp(aul_type, GL_AUL_TAG, len) == 0)
+ tab_i18n_text = GL_STR_CTRL_ITEM_TAGS;
+ else
+ gl_dbgE("Wrong type!");
+ GL_CHECK_VAL(tab_i18n_text, -1);
+
+ /* Get item to be selected */
+ while (cbar_it) {
+ text = elm_object_item_text_get(cbar_it);
+ if (!strncasecmp(text, tab_i18n_text, len)) {
+ b_found = true;
+ break;
+ }
+
+ cbar_it = elm_toolbar_item_next_get(cbar_it);
+ }
+
+ if (b_found && cbar_it) {
+ elm_toolbar_item_selected_set(cbar_it, EINA_TRUE);
+ return 0;
+ } else {
+ gl_dbgE("Failed to get tabbar item!");
+ return -1;
+ }
+}
+
+int _gl_ctrl_show_tabbar(void *data, bool b_show)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ GL_CHECK_VAL(ad->ctrlinfo.ctrlbar_ly, -1);
+ GL_CHECK_VAL(ad->ctrlinfo.ctrlbar_view_ly, -1);
+ int rotate_mode = ad->maininfo.rotate_mode;
+ gl_dbg("Tabbar show: %d, rotate_mode: %d", b_show, rotate_mode);
+ Evas_Object *view_ly = ad->ctrlinfo.ctrlbar_view_ly;
+
+ if (gl_get_view_mode(ad) == GL_VIEW_ALBUMS_RENAME ||
+ gl_get_view_mode(ad) == GL_VIEW_ALBUMS_EDIT) {
+ gl_dbg("Rename album, set edit layout");
+ view_ly = ad->ctrlinfo.ctrlbar_edit_ly;
+ }
+
+ if (b_show) {
+ if ((rotate_mode == APP_DEVICE_ORIENTATION_270) ||
+ (rotate_mode == APP_DEVICE_ORIENTATION_90)) {
+ edje_object_signal_emit(_EDJ(view_ly),
+ GL_SIGNAL_VIEW_TABBAR_BG_HIDE,
+ "elm");
+ edje_object_signal_emit(_EDJ(ad->ctrlinfo.ctrlbar_ly),
+ GL_SIGNAL_VIEW_TABBAR_LAND,
+ "elm");
+ } else {
+ edje_object_signal_emit(_EDJ(view_ly),
+ GL_SIGNAL_VIEW_TABBAR_BG_HIDE,
+ "elm");
+ edje_object_signal_emit(_EDJ(ad->ctrlinfo.ctrlbar_ly),
+ GL_SIGNAL_VIEW_TABBAR_DEFAULT,
+ "elm");
+ }
+ } else {
+ if ((rotate_mode == APP_DEVICE_ORIENTATION_270) ||
+ (rotate_mode == APP_DEVICE_ORIENTATION_90)) {
+ edje_object_signal_emit(_EDJ(view_ly),
+ GL_SIGNAL_VIEW_TABBAR_BG_SHOW_LAND,
+ "elm");
+ edje_object_signal_emit(_EDJ(ad->ctrlinfo.ctrlbar_ly),
+ "elm,tabbar,state,hide", "elm");
+ } else {
+ edje_object_signal_emit(_EDJ(view_ly),
+ GL_SIGNAL_VIEW_TABBAR_BG_SHOW_PORT,
+ "elm");
+ edje_object_signal_emit(_EDJ(ad->ctrlinfo.ctrlbar_ly),
+ "elm,tabbar,state,hide", "elm");
+ }
+ }
+ return 0;
+}
+
+bool gl_ctrl_rotate_ctrlbar(void *data, int mode)
+{
+ GL_CHECK_FALSE(data);
+ gl_appdata *ad = (gl_appdata *)data;
+ int view_mode = 0;
+
+ /* Rotate top tabbar */
+ if (mode)
+ view_mode = mode;
+ else
+ view_mode = gl_get_view_mode(ad);
+ gl_dbg("view mode: %d.", view_mode);
+
+ bool b_show_tabbar = true;
+
+ if (view_mode == GL_VIEW_ALBUMS || view_mode == GL_VIEW_ALBUMS_EDIT ||
+ view_mode == GL_VIEW_TAGS || view_mode == GL_VIEW_TAGS_EDIT) {
+ int rotate_mode = ad->maininfo.rotate_mode;
+ if (view_mode == GL_VIEW_TAGS &&
+ (ad->entryinfo.entry_mode == GL_ENTRY_NEW_TAG ||
+ ad->entryinfo.entry_mode == GL_ENTRY_RENAME_TAG)) {
+ /* New tag view, return */
+ gl_dbg("Add an empty tag.");
+ return 0;
+ }
+ char *cbar_style = GL_CTRL_STYLE_TABBAR;
+ if (rotate_mode == APP_DEVICE_ORIENTATION_270 ||
+ rotate_mode == APP_DEVICE_ORIENTATION_90) {
+ gl_dbg("Landscape, small mode.");
+ /* set horizontal style: icon+text */
+ cbar_style = GL_CTRL_STYLE_TABBAR_LAND;
+ }
+ elm_object_style_set(ad->ctrlinfo.ctrlbar, cbar_style);
+
+ if (b_show_tabbar)
+ _gl_ctrl_show_tabbar(ad, b_show_tabbar);
+ }
+
+ return true;
+}
+
+//disable/enable controlbar items.
+int gl_ctrl_disable_ctrlbar(void *data, bool disabled)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ GL_CHECK_VAL(ad->ctrlinfo.ctrlbar, -1);
+ gl_dbg("Controlbar items disabled: %d.", disabled);
+
+ if (disabled)
+ elm_toolbar_select_mode_set(ad->ctrlinfo.ctrlbar,
+ ELM_OBJECT_SELECT_MODE_NONE);
+ else
+ elm_toolbar_select_mode_set(ad->ctrlinfo.ctrlbar,
+ ELM_OBJECT_SELECT_MODE_ALWAYS);
+ return 0;
+}
+
+int _gl_ctrl_disable_btn(void *data, bool disabled, int mode)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_dbg("Title button disabled: %d.", disabled);
+ if (disabled)
+ __gl_ctrl_disable_btn(data, mode);
+ else
+ __gl_ctrl_enable_btn(data, mode);
+
+ return 0;
+}
+
+int _gl_ctrl_disable_btns(void *data, Elm_Object_Item *nf_it, bool b_disable)
+{
+ gl_dbg("b_disable: %d", b_disable);
+ GL_CHECK_VAL(data, -1);
+ GL_CHECK_VAL(nf_it, -1);
+
+ if (!b_disable)
+ __gl_ctrl_enable_btns(data, nf_it);
+ else
+ _gl_ui_disable_btns(nf_it, true);
+ return 0;
+}
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "gallery.h"
+#include "gl-ctxpopup.h"
+#include "gl-ui-util.h"
+#include "gl-util.h"
+#include "gl-debug.h"
+#include "gl-strings.h"
+#include "gl-button.h"
+#include "gl-controlbar.h"
+#include "gl-thumbs.h"
+#include "gl-tags-edit.h"
+#include "gl-tags-new.h"
+#include "gl-albums-new.h"
+#include "gl-albums-edit.h"
+
+#define GL_CTXPOPUP_OBJ_DATA_KEY "gl_ctxpopup_data_key"
+
+static void __gl_ctxpopup_hide_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ GL_CHECK(obj);
+ GL_CHECK(data);
+ gl_appdata *ad = (gl_appdata *)data;
+
+ evas_object_del(obj);
+ ad->maininfo.ctxpopup = NULL;
+ gl_dbg("");
+}
+
+static int __gl_ctxpopup_show(void *data, Evas_Object *btn, Evas_Object *ctxpopup)
+{
+ GL_CHECK_VAL(ctxpopup, -1);
+ GL_CHECK_VAL(btn, -1);
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ int x_position = 0;
+ int y_position = 0;
+ int w = 0;
+ int h = 0;
+
+ elm_ctxpopup_direction_priority_set(ctxpopup, ELM_CTXPOPUP_DIRECTION_UP,
+ ELM_CTXPOPUP_DIRECTION_LEFT,
+ ELM_CTXPOPUP_DIRECTION_RIGHT,
+ ELM_CTXPOPUP_DIRECTION_DOWN);
+
+ evas_object_geometry_get(btn, &x_position, &y_position, &w, &h);
+ if (g_strcmp0(elm_object_style_get(btn), GL_BUTTON_STYLE_NAVI_MORE) == 0) {
+ evas_object_move(ctxpopup, x_position+w/3, y_position + h/2);
+ } else {
+ if (ad->maininfo.rotate_mode == APP_DEVICE_ORIENTATION_90 ||
+ ad->maininfo.rotate_mode == APP_DEVICE_ORIENTATION_270)
+ evas_object_move(ctxpopup, x_position+w*3/4,
+ y_position + h/2);
+ else
+ evas_object_move(ctxpopup, x_position+w/2,
+ y_position + h/2);
+ }
+ gl_dbg("(%d, %d) - (%d, %d)", x_position, y_position, w, h);
+
+ evas_object_show(ctxpopup);
+ ad->maininfo.ctxpopup = ctxpopup;
+ evas_object_smart_callback_add(ctxpopup, "dismissed",
+ __gl_ctxpopup_hide_cb, data);
+ return 0;
+}
+
+static void __gl_ctxpopup_share_cb(void *data, Evas_Object *obj,
+ void *event_info)
+{
+ GL_CHECK(event_info);
+ GL_CHECK(data);
+ const char *label = NULL;
+
+ label = elm_object_item_text_get((Elm_Object_Item *)event_info);
+ GL_CHECK(label);
+ gl_dbg("label: %s", label);
+ _gl_ctxpopup_del(data);
+
+ int view_mode = gl_get_view_mode(data);
+ if (view_mode == GL_VIEW_ALBUMS_EDIT)
+ _gl_albums_edit_share(data, label);
+ else if (view_mode == GL_VIEW_TAGS_EDIT)
+ _gl_tags_edit_share(data, label);
+ else
+ gl_share_select_item(data, label);
+}
+
+static void __gl_ctxpopup_move_cb(void *data, Evas_Object *obj,
+ void *event_info)
+{
+ gl_dbg("");
+ /* Get 'ad' via 'GL_CTXPOPUP_OBJ_DATA_KEY' */
+ GL_CHECK(obj);
+ gl_appdata *ad = NULL;
+ ad = (gl_appdata *)evas_object_data_get(obj, GL_CTXPOPUP_OBJ_DATA_KEY);
+ GL_CHECK(ad);
+ _gl_ctxpopup_del(ad);
+
+ GL_FREEIF(ad->albuminfo.path);
+ /**
+ * 'data == NULL' is new album case,
+ * other move/save to some existed album.
+ */
+ if (data) {
+ ad->albuminfo.path = strdup((char *)data);
+ gl_dbg("Dest album path: %s", ad->albuminfo.path);
+ gl_move_to_album(ad);
+ } else {
+ _gl_albums_new_create_view(ad);
+ }
+}
+
+static void __gl_ctxpopup_addtag_cb(void *data, Evas_Object *obj,
+ void *event_info)
+{
+ /* Get 'ad' via 'GL_CTXPOPUP_OBJ_DATA_KEY' */
+ GL_CHECK(obj);
+ gl_appdata *ad = NULL;
+ ad = (gl_appdata *)evas_object_data_get(obj, GL_CTXPOPUP_OBJ_DATA_KEY);
+ GL_CHECK(ad);
+ _gl_ctxpopup_del(ad);
+
+ /**
+ * 'data == NULL' is new tag case, other add to exist tag
+ */
+ if (data)
+ gl_add_tag(ad, data);
+ else
+ _gl_tags_new_create_view(ad);
+}
+
+static int __gl_ctxpopup_create_move(void *data, Evas_Object *btn,
+ Evas_Smart_Cb it_cb)
+{
+ gl_dbg("");
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ GL_CHECK_VAL(ad->maininfo.naviframe, -1);
+ int i = 0;
+ Eina_List *album_list = NULL;
+ int all_count = 0;
+ const char *label = NULL;
+ gl_cluster *album_item = NULL;
+ gl_cluster *current_album = ad->albuminfo.current_album;
+
+ Evas_Object *ctxpopup = elm_ctxpopup_add(ad->maininfo.naviframe);
+ GL_CHECK_VAL(ctxpopup, -1);
+
+ evas_object_data_set(ctxpopup, GL_CTXPOPUP_OBJ_DATA_KEY, data);
+
+ elm_ctxpopup_item_append(ctxpopup, GL_STR_CREATE_ALBUM, NULL, it_cb,
+ NULL);
+
+ if (ad->albuminfo.cluster_list && ad->albuminfo.cluster_list->clist) {
+ album_list = ad->albuminfo.cluster_list->clist;
+ all_count = eina_list_count(album_list);
+ } else {
+ gl_dbgE("cluster list is NULL");
+ return -1;
+ }
+
+ for (i = 0; i < all_count; i++) {
+ album_item = eina_list_nth(album_list, i);
+ GL_CHECK_VAL(album_item, -1);
+ GL_CHECK_VAL(album_item->cluster, -1);
+ GL_CHECK_VAL(album_item->cluster->display_name, -1);
+
+ /* places view->grid view, current album doesn't exist. */
+ GL_CHECK_VAL(album_item->cluster->uuid, -1);
+ if ((current_album && current_album->cluster &&
+ album_item->cluster->uuid &&
+ g_strcmp0(album_item->cluster->uuid, current_album->cluster->uuid)) &&
+ (album_item->cluster->type == GL_STORE_T_MMC ||
+ album_item->cluster->type == GL_STORE_T_PHONE)) {
+ if (_gl_data_is_root_path(album_item->cluster->path)) {
+ /* "root" case, set display name as "No Name" */
+ label = GL_ALBUM_PHOME_ROOT_NAME;
+ } else if (strlen(album_item->cluster->display_name)) {
+ label = _gl_get_i18n_album_name(album_item);
+ } else {
+ gl_dbgE("Album name is wrong!");
+ label = GL_ALBUM_PHOME_ROOT_NAME;
+ }
+ elm_ctxpopup_item_append(ctxpopup, label, NULL, it_cb,
+ album_item->cluster->path);
+ }
+ }
+
+ Evas_Object *_btn = btn;
+ if (_btn == NULL)
+ _btn = _gl_ui_get_btn(data, NULL, GL_NAVIFRAME_MORE);
+ return __gl_ctxpopup_show(data, _btn, ctxpopup);
+}
+
+int _gl_ctxpopup_create(void *data, Evas_Object *but, ctx_append_cb append_cb)
+{
+ gl_dbg("");
+ GL_CHECK_VAL(append_cb, -1);
+ GL_CHECK_VAL(but, -1);
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ GL_CHECK_VAL(ad->maininfo.naviframe, -1);
+
+ Evas_Object *ctxpopup = elm_ctxpopup_add(ad->maininfo.naviframe);
+ GL_CHECK_VAL(ctxpopup, -1);
+
+ /* Append items */
+ append_cb(data, ctxpopup);
+
+ return __gl_ctxpopup_show(data, but, ctxpopup);
+}
+
+int _gl_ctxpopup_del(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ if (ad->maininfo.ctxpopup) {
+ evas_object_data_del(ad->maininfo.ctxpopup,
+ GL_CTXPOPUP_OBJ_DATA_KEY);
+ /* Remove callback frist */
+ evas_object_smart_callback_del(ad->maininfo.ctxpopup,
+ "dismissed",
+ __gl_ctxpopup_hide_cb);
+ evas_object_del(ad->maininfo.ctxpopup);
+ ad->maininfo.ctxpopup = NULL;
+ gl_dbg("Ctxpopup removed");
+ }
+ return 0;
+}
+
+int _gl_ctxpopup_create_albums(void *data, Evas_Object *but)
+{
+ gl_dbg("");
+ GL_CHECK_VAL(but, -1);
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ GL_CHECK_VAL(ad->maininfo.naviframe, -1);
+
+ Evas_Object *ctxpopup = elm_ctxpopup_add(ad->maininfo.naviframe);
+ GL_CHECK_VAL(ctxpopup, -1);
+
+ /* Show edit item */
+ if (!ad->albuminfo.b_edit_disable)
+ elm_ctxpopup_item_append(ctxpopup, GL_STR_EDIT, NULL,
+ _gl_ui_edit_cb, data);
+ return __gl_ctxpopup_show(data, but, ctxpopup);
+}
+
+int _gl_ctxpopup_create_thumbs(void *data, Evas_Object *but)
+{
+ gl_dbg("");
+ GL_CHECK_VAL(but, -1);
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ GL_CHECK_VAL(ad->maininfo.naviframe, -1);
+
+ Evas_Object *ctxpopup = elm_ctxpopup_add(ad->maininfo.naviframe);
+ GL_CHECK_VAL(ctxpopup, -1);
+
+ /* Add All/Images/Videos of local album and tag */
+ elm_ctxpopup_item_append(ctxpopup, GL_STR_ALL, NULL,
+ _gl_ctrl_segment_change_cb, data);
+ elm_ctxpopup_item_append(ctxpopup, GL_STR_IMAGES, NULL,
+ _gl_ctrl_segment_change_cb, data);
+ elm_ctxpopup_item_append(ctxpopup, GL_STR_VIDEOS, NULL,
+ _gl_ctrl_segment_change_cb, data);
+
+ return __gl_ctxpopup_show(data, but, ctxpopup);
+}
+
+int _gl_ctxpopup_create_share(void *data, Evas_Object *but)
+{
+ gl_dbg("");
+ GL_CHECK_VAL(but, -1);
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ GL_CHECK_VAL(ad->maininfo.naviframe, -1);
+ const char *lb = NULL;
+ int i = 0;
+
+ gl_popup_share_tbl popup_share_tbl[GL_POPUP_SHARE_NUM] = {
+ {GL_POPUP_SHARE_MESSAGE, GL_SHARE_MESSAGE},
+ {GL_POPUP_SHARE_EMAIL, GL_SHARE_EMAIL},
+ {GL_POPUP_SHARE_BT, GL_SHARE_BLUETOOTH},
+ };
+
+ /**
+ * If there is any DRM file selected,
+ * Share option is unavailable.
+ */
+ int share_mode = gl_get_share_mode(ad);
+ if (share_mode < 0 || share_mode == GL_SHARE_NONE ||
+ share_mode == GL_SHARE_DRM) {
+ gl_dbgE("Share mode is wrong!");
+ return -1;
+ }
+
+ Evas_Object *ctxpopup = elm_ctxpopup_add(ad->maininfo.naviframe);
+ GL_CHECK_VAL(ctxpopup, -1);
+
+ int view_mode = gl_get_view_mode(ad);
+ /* Share albums */
+ if (view_mode == GL_VIEW_ALBUMS_EDIT ||
+ view_mode == GL_VIEW_TAGS_EDIT) {
+ for (i = 0; i < GL_POPUP_SHARE_NUM; i++) {
+ lb = popup_share_tbl[i].label;
+ if (g_strcmp0(lb, GL_SHARE_MESSAGE) &&
+ g_strcmp0(lb, GL_SHARE_EMAIL) &&
+ g_strcmp0(lb, GL_SHARE_BLUETOOTH))
+ continue;
+
+ elm_ctxpopup_item_append(ctxpopup, (void *)lb, NULL,
+ __gl_ctxpopup_share_cb, data);
+ }
+ return __gl_ctxpopup_show(data, but, ctxpopup);
+ }
+
+ for (i = 0; i < GL_POPUP_SHARE_NUM; i++) {
+ lb = popup_share_tbl[i].label;
+ if (lb == NULL || strlen(lb) == 0)
+ continue;
+ elm_ctxpopup_item_append(ctxpopup, (void *)lb, NULL,
+ __gl_ctxpopup_share_cb, data);
+ }
+ return __gl_ctxpopup_show(data, but, ctxpopup);
+}
+
+int _gl_ctxpopup_create_move(void *data)
+{
+ gl_dbg("");
+ GL_CHECK_VAL(data, -1);
+ return __gl_ctxpopup_create_move(data, NULL, __gl_ctxpopup_move_cb);
+}
+
+int _gl_ctxpopup_create_addtag(void *data)
+{
+ gl_dbg("");
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ GL_CHECK_VAL(ad->maininfo.naviframe, -1);
+ Eina_List *tags_elist = NULL;
+
+ Evas_Object *ctxpopup = elm_ctxpopup_add(ad->maininfo.naviframe);
+ GL_CHECK_VAL(ctxpopup, -1);
+
+ evas_object_data_set(ctxpopup, GL_CTXPOPUP_OBJ_DATA_KEY, data);
+
+ /* normal case, get tags list from media-svc. */
+ if (ad->ctrlinfo.tab_mode != GL_CTRL_TAB_TAGS)
+ _gl_data_get_tag_list(ad, &tags_elist);
+ /* tags view case, just return tags list already got. */
+ else
+ tags_elist = ad->taginfo.tags_elist;
+
+ /* "New tag" item */
+ elm_ctxpopup_item_append(ctxpopup, GL_STR_CREATE_TAG, NULL,
+ __gl_ctxpopup_addtag_cb, NULL);
+
+ if (tags_elist) {
+ Eina_List *tmp_elist = NULL;
+ gl_tag *gtag = NULL;
+ gl_tag *cur_tag = ad->taginfo.current_tag;
+ EINA_LIST_FOREACH(tags_elist, tmp_elist, gtag) {
+ GL_CHECK_VAL(gtag, -1);
+ GL_CHECK_VAL(gtag->tag, -1);
+
+ if (ad->ctrlinfo.tab_mode == GL_CTRL_TAB_TAGS &&
+ cur_tag && cur_tag->tag &&
+ (cur_tag->tag->_id == gtag->tag->_id)) {
+ gl_dbg("Skipping current tag");
+ /*skip current tag in tags view case */
+ continue;
+ } else {
+ /* normal tag item. */
+ elm_ctxpopup_item_append(ctxpopup,
+ gtag->tag->tag_name,
+ NULL,
+ __gl_ctxpopup_addtag_cb,
+ gtag);
+ }
+ }
+ }
+
+ Evas_Object *btn= _gl_ui_get_btn(data, NULL, GL_NAVIFRAME_MORE);
+ return __gl_ctxpopup_show(data, btn, ctxpopup);
+}
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "gl-editfield.h"
+#include "gl-ui-util.h"
+#include "gl-util.h"
+#include "gl-popup.h"
+#include "gl-tags.h"
+#include "gl-tags-new.h"
+#include "gl-tags-rename.h"
+#include "gl-albums-new.h"
+#include "gl-albums-rename.h"
+#include "gl-data.h"
+#include "gl-strings.h"
+#include "gl-debug.h"
+
+/* The maximun length reached callback */
+static void __gl_editfield_maxlen_reached_cb(void *data, Evas_Object *obj,
+ void *event_info)
+{
+ gl_dbg("Entry maximum length reached, vibrate device.");
+ GL_CHECK(data);
+ /* Vibrate device if maximum length reached */
+ gl_play_vibration(data);
+}
+
+static void __gl_editfield_focused_cb(void *data, Evas_Object *obj,
+ void *event_info)
+{
+ GL_CHECK(obj);
+ GL_CHECK(data);
+ if (!elm_entry_is_empty(obj)) {
+ gl_dbg("Show eraser.");
+ elm_object_signal_emit(data, "elm,state,eraser,show", "elm");
+ }
+}
+
+static void __gl_editfield_unfocused_cb(void *data, Evas_Object *obj,
+ void *event_info)
+{
+ GL_CHECK(data);
+ gl_dbg("Hide eraser.");
+ elm_object_signal_emit(data, "elm,state,eraser,hide", "elm");
+}
+
+static void __gl_editfield_eraser_clicked_cb(void *data, Evas_Object *obj,
+ const char *emission,
+ const char *source)
+{
+ GL_CHECK(data);
+ gl_dbg("Clear emtry after eraser clicked.");
+ elm_entry_entry_set(data, "");
+}
+
+static void __gl_editfield_bg_clicked_cb(void *data, Evas_Object *obj,
+ const char *emission,
+ const char *source)
+{
+ GL_CHECK(data);
+ gl_dbg("");
+ elm_object_focus_set(data, EINA_TRUE);
+}
+
+/*
+* Callback registered to signal 'changed' of entry.
+* It would get the entry string and check whether it's different
+* with original string or not, if so, enable 'Done' button, other disable it.
+*/
+static void __gl_editfield_space_check_cb(void *data, Evas_Object *obj,
+ void *event_info)
+{
+ GL_CHECK(obj);
+ GL_CHECK(data);
+ gl_appdata *ad = (gl_appdata *)data;
+ GL_CHECK(ad->entryinfo.editfield);
+
+ /* Show/hide eraser */
+ if (elm_object_focus_get(ad->entryinfo.editfield)) {
+ if (elm_entry_is_empty(obj)) {
+ gl_dbg("Hide eraser.");
+ elm_object_signal_emit(ad->entryinfo.editfield,
+ "elm,state,eraser,hide", "elm");
+ } else {
+ gl_dbg("Show eraser.");
+ elm_object_signal_emit(ad->entryinfo.editfield,
+ "elm,state,eraser,show", "elm");
+ }
+ }
+
+ int view_mode = gl_get_view_mode(ad);
+ /* There is not done item in tags view */
+ if ((view_mode == GL_VIEW_TAGS &&
+ ad->entryinfo.entry_mode != GL_ENTRY_NEW_TAG) ||
+ view_mode == GL_VIEW_TAGS_EDIT)
+ return;
+
+ GL_CHECK(ad->entryinfo.done_btn);
+ const char *entry_str = NULL;
+
+ /* Get entry string. */
+ entry_str = elm_entry_entry_get(obj);
+ GL_CHECK(entry_str);
+ /**
+ * Changes entry string to utf-8 encoding format,
+ * other some special characters cannot be showed correctly.
+ */
+ char *entry_utf8 = elm_entry_markup_to_utf8(entry_str);
+ GL_CHECK(entry_utf8);
+ /**
+ * Removes leading and trailing whitespace
+ * to avoid showing popup when new name is only composed by space
+ * or avoid showing popup in the case when after trip leading and trailing space,
+ * new name is same as existing name
+ */
+ g_strstrip((gchar*)entry_utf8);
+ GL_CHECK(entry_utf8);
+ gl_dbg("New entry string without space: [%s]", entry_utf8);
+
+ bool b_disabled = false;
+ /**
+ * If entry string is empty, disable 'Done' button,
+ * including create album/tag and rename album/tag.
+ */
+ if (!strlen(entry_utf8)) {
+ gl_dbg("Entry string is empty!");
+ b_disabled = true;
+ }
+
+ gl_dbg("En/Disable Done button[%d]", b_disabled);
+ elm_object_disabled_set(ad->entryinfo.done_btn, b_disabled);
+
+ /* Free string got from elm_entry_markup_to_utf8() */
+ GL_FREEIF(entry_utf8);
+}
+
+
+/*
+* make a new tag
+*/
+static void __gl_editfield_new_tag_enter_cb(void *data, Evas_Object *obj,
+ void *event_info)
+{
+ gl_dbg("");
+ GL_CHECK(data);
+ /* Unfocus to hide cursor */
+ _gl_editfield_hide_imf(data);
+ _gl_tags_new_process(data, true);
+}
+
+/*
+* change tag name
+*/
+static void __gl_editfield_rename_tag_enter_cb(void *data, Evas_Object *obj,
+ void *event_info)
+{
+ gl_dbg("");
+ GL_CHECK(data);
+ /* Unfocus to hide cursor */
+ _gl_editfield_hide_imf(data);
+ _gl_tags_rename_process(data);
+
+ /* Show selectioninfo if needed */
+ if (_gl_data_get_tags_selected_cnt(data) > 0) {
+ gl_appdata *ad = (gl_appdata *)data;
+ edje_object_signal_emit(_EDJ(ad->ctrlinfo.ctrlbar_edit_ly),
+ GL_SIGNAL_VIEW_MOVEUP, "elm");
+ }
+}
+
+/*
+* make a new album
+*/
+static void __gl_editfield_new_album_enter_cb(void *data, Evas_Object *obj,
+ void *event_info)
+{
+ gl_dbg("");
+ GL_CHECK(data);
+ /* Unfocus to hide cursor */
+ _gl_editfield_hide_imf(data);
+ _gl_albums_new_process(data, true);
+}
+
+/*
+* change album album
+*/
+static void __gl_editfield_rename_album_enter_cb(void *data, Evas_Object * obj,
+ void *event_info)
+{
+ gl_dbg("");
+ GL_CHECK(data);
+ /* Unfocus to hide cursor */
+ _gl_editfield_hide_imf(data);
+ _gl_albums_rename_process(data, true);
+}
+
+static int __gl_editfield_set_entry(void *data, Evas_Object *layout,
+ Evas_Object *entry, char *default_label)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ gl_dbg("");
+
+ static Elm_Entry_Filter_Limit_Size limit_filter_data;
+
+ switch (ad->entryinfo.entry_mode) {
+ case GL_ENTRY_NEW_ALBUM:
+ /* New album, Album name, the length is limited to 255 Chars*/
+ limit_filter_data.max_char_count = GL_ENTRY_STR_CHAR_MAX;
+ limit_filter_data.max_byte_count = 0;
+ evas_object_smart_callback_add(entry, "activated",
+ __gl_editfield_new_album_enter_cb,
+ ad);
+ break;
+ case GL_ENTRY_RENAME_ALBUM:
+ /* Rename album, Album name, the length is limited to 255 Chars*/
+ limit_filter_data.max_char_count = GL_ENTRY_STR_CHAR_MAX;
+ limit_filter_data.max_byte_count = 0;
+ evas_object_smart_callback_add(entry, "activated",
+ __gl_editfield_rename_album_enter_cb,
+ ad);
+ break;
+ case GL_ENTRY_NEW_TAG:
+ case GL_ENTRY_RENAME_TAG:
+ /* New tag, Tag name, the length is limited to 255 Bytes */
+ limit_filter_data.max_char_count = 0;
+ limit_filter_data.max_byte_count = GL_ENTRY_STR_LEN_MAX;
+ if (ad->entryinfo.entry_mode == GL_ENTRY_NEW_TAG)
+ evas_object_smart_callback_add(entry, "activated",
+ __gl_editfield_new_tag_enter_cb,
+ ad);
+ else
+ evas_object_smart_callback_add(entry, "activated",
+ __gl_editfield_rename_tag_enter_cb,
+ ad);
+ break;
+ default:
+ gl_dbgW("Wrong entry mode!");
+ return -1;
+ }
+
+ elm_entry_markup_filter_append(entry, elm_entry_filter_limit_size,
+ &limit_filter_data);
+
+ if (gl_set_entry_text(entry, default_label) != 0) {
+ gl_dbgE("gl_set_entry_text failed!");
+ return -1;
+ }
+ elm_entry_cursor_end_set(entry);
+
+ gl_dbg("view mode=%d", gl_get_view_mode(ad));
+ evas_object_smart_callback_add(entry, "maxlength,reached",
+ __gl_editfield_maxlen_reached_cb, ad);
+
+ /* Add space check callback */
+ evas_object_smart_callback_add(entry, "changed",
+ __gl_editfield_space_check_cb, ad);
+ evas_object_smart_callback_add(entry, "preedit,changed",
+ __gl_editfield_space_check_cb, ad);
+ evas_object_smart_callback_add(entry, "focused",
+ __gl_editfield_focused_cb, layout);
+ evas_object_smart_callback_add(entry, "unfocused",
+ __gl_editfield_unfocused_cb, layout);
+ elm_object_signal_callback_add(layout, "elm,eraser,clicked", "elm",
+ __gl_editfield_eraser_clicked_cb, entry);
+ elm_object_signal_callback_add(layout, "elm,bg,clicked", "elm",
+ __gl_editfield_bg_clicked_cb, entry);
+ return 0;
+}
+
+Evas_Object *_gl_editfield_create(void *data, Evas_Object *parent,
+ char *default_label)
+{
+ GL_CHECK_NULL(data);
+ gl_appdata *ad = (gl_appdata *)data;
+ GL_CHECK_NULL(parent);
+ Evas_Object *layout = NULL;
+ Evas_Object *entry_layout = NULL;
+ Evas_Object *entry = NULL;
+
+ layout = elm_layout_add(parent);
+ GL_CHECK_NULL(layout);
+ elm_layout_theme_set(layout, "layout", "application", "searchbar_base");
+ elm_object_signal_emit(layout, "elm,state,show,searchbar", "elm");
+
+ entry_layout = elm_layout_add(layout);
+ if (entry_layout == NULL) {
+ evas_object_del(layout);
+ return NULL;
+ }
+ /* Customized theme */
+ elm_layout_theme_set(entry_layout, "layout", "searchbar", "gallery");
+ elm_object_part_content_set(layout, "searchbar", entry_layout);
+
+ entry = elm_entry_add(entry_layout);
+ if (entry == NULL) {
+ evas_object_del(entry_layout);
+ return NULL;
+ }
+
+ elm_entry_scrollable_set(entry, EINA_TRUE);
+ elm_entry_single_line_set(entry, EINA_TRUE);
+ elm_entry_cnp_mode_set(entry, ELM_CNP_MODE_PLAINTEXT);
+ elm_object_part_content_set(entry_layout, "elm.swallow.content", entry);
+ elm_entry_input_panel_layout_set(entry, ELM_INPUT_PANEL_LAYOUT_NORMAL);
+ evas_object_size_hint_weight_set(entry_layout, EVAS_HINT_EXPAND,
+ EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(entry_layout, EVAS_HINT_FILL,
+ EVAS_HINT_FILL);
+ ad->entryinfo.imf_entry = entry;
+ ad->entryinfo.imf_context = elm_entry_imf_context_get(ad->entryinfo.imf_entry);
+ ad->entryinfo.haptic_handle = -1;
+ ad->entryinfo.editfield = entry_layout;
+ /* Set callback */
+ __gl_editfield_set_entry(ad, entry_layout, entry, default_label);
+ evas_object_show(entry_layout);
+
+ return layout;
+}
+
+/* Add editfield to genlist item */
+Evas_Object *_gl_editfield_create_genlist(void *data, Evas_Object *parent,
+ char *label)
+{
+ GL_CHECK_NULL(label);
+ GL_CHECK_NULL(parent);
+ GL_CHECK_NULL(data);
+ gl_appdata *ad = (gl_appdata *)data;
+ gl_dbg("");
+ Evas_Object *editfield_ly = NULL;
+ Evas_Object *entry = NULL;
+
+ _gl_editfield_destroy_imf(ad);
+
+ editfield_ly = elm_layout_add(parent);
+ GL_CHECK_NULL(editfield_ly);
+ elm_layout_theme_set(editfield_ly, "layout", "editfield", "default");
+ evas_object_size_hint_weight_set(editfield_ly, EVAS_HINT_EXPAND,
+ EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(editfield_ly, EVAS_HINT_FILL,
+ EVAS_HINT_FILL);
+
+ entry = elm_entry_add(editfield_ly);
+ if (entry == NULL) {
+ gl_dbgE("elm_entry_add failed!");
+ evas_object_del(editfield_ly);
+ return NULL;
+ }
+ elm_entry_scrollable_set(entry, EINA_TRUE);
+ elm_entry_single_line_set(entry, EINA_TRUE);
+ elm_entry_cnp_mode_set(entry, ELM_CNP_MODE_PLAINTEXT);
+ /* Set entry to editfield layout */
+ elm_object_part_content_set(editfield_ly, "elm.swallow.content", entry);
+
+ if (gl_set_entry_text(entry, label) != 0) {
+ gl_dbgE("gl_set_entry_text failed!");
+ evas_object_del(editfield_ly);
+ return NULL;
+ }
+
+ static Elm_Entry_Filter_Limit_Size limit_filter_data;
+ limit_filter_data.max_char_count = 0;
+ /* Tag name, the length is limited to 255 Bytes */
+ limit_filter_data.max_byte_count = GL_ENTRY_STR_LEN_MAX;
+ elm_entry_markup_filter_append(entry, elm_entry_filter_limit_size,
+ &limit_filter_data);
+ evas_object_smart_callback_add(entry, "maxlength,reached",
+ __gl_editfield_maxlen_reached_cb, ad);
+ evas_object_smart_callback_add(entry, "activated",
+ __gl_editfield_rename_tag_enter_cb, ad);
+ /* Add space check callback */
+ evas_object_smart_callback_add(entry, "changed",
+ __gl_editfield_space_check_cb, ad);
+ evas_object_smart_callback_add(entry, "preedit,changed",
+ __gl_editfield_space_check_cb, ad);
+ evas_object_smart_callback_add(entry, "focused",
+ __gl_editfield_focused_cb, editfield_ly);
+ evas_object_smart_callback_add(entry, "unfocused",
+ __gl_editfield_unfocused_cb,
+ editfield_ly);
+ elm_object_signal_callback_add(editfield_ly, "elm,eraser,clicked", "elm",
+ __gl_editfield_eraser_clicked_cb, entry);
+
+ /**
+ * Do not unset rename mode on unfocused event
+ *otherwise clipboard does not work properly
+ */
+ ad->entryinfo.imf_entry = entry;
+ ad->entryinfo.imf_context = elm_entry_imf_context_get(entry);
+ ad->entryinfo.editfield = editfield_ly;
+ ad->entryinfo.haptic_handle = -1;
+
+ _gl_editfield_show_imf(data);
+ elm_entry_cursor_end_set(entry);
+
+ /* Hide selectioninfo if needed */
+ edje_object_signal_emit(_EDJ(ad->ctrlinfo.ctrlbar_edit_ly),
+ GL_SIGNAL_VIEW_EDIT, "elm");
+
+ return editfield_ly;
+}
+
+/* Hide input panel and entry cursor */
+int _gl_editfield_hide_imf(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata* ad = (gl_appdata*)data;
+ gl_dbg("");
+
+ if (ad->entryinfo.imf_context)
+ ecore_imf_context_input_panel_hide(ad->entryinfo.imf_context);
+ /* Unfocus to hide cursor */
+ if (ad->entryinfo.imf_entry)
+ elm_object_focus_set(ad->entryinfo.imf_entry, EINA_FALSE);
+
+ return 0;
+}
+
+/* Show input panel and entry cursor */
+int _gl_editfield_show_imf(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata* ad = (gl_appdata*)data;
+ gl_dbg("");
+
+ if (ad->entryinfo.imf_entry) {
+ evas_object_show(ad->entryinfo.imf_entry);
+ elm_object_focus_set(ad->entryinfo.imf_entry, EINA_TRUE);
+ }
+ if (ad->entryinfo.imf_context)
+ ecore_imf_context_input_panel_show(ad->entryinfo.imf_context);
+ return 0;
+}
+
+int _gl_editfield_destroy_imf(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+
+ /* Remove callbacks */
+ _gl_ui_del_conform_cbs(ad->maininfo.naviframe);
+
+ int view_mode = gl_get_view_mode(ad);
+ gl_dbg("view_mode = %d", view_mode);
+
+ if (ad->entryinfo.imf_entry) {
+ evas_object_smart_callback_del(ad->entryinfo.imf_entry,
+ "maxlength,reached",
+ __gl_editfield_maxlen_reached_cb);
+ if (ad->entryinfo.entry_mode == GL_ENTRY_NEW_ALBUM)
+ evas_object_smart_callback_del(ad->entryinfo.imf_entry,
+ "activated",
+ __gl_editfield_new_album_enter_cb);
+ else if (ad->entryinfo.entry_mode == GL_ENTRY_NEW_TAG)
+ evas_object_smart_callback_del(ad->entryinfo.imf_entry,
+ "activated",
+ __gl_editfield_new_tag_enter_cb);
+ else if (ad->entryinfo.entry_mode == GL_ENTRY_RENAME_TAG)
+ evas_object_smart_callback_del(ad->entryinfo.imf_entry,
+ "activated",
+ __gl_editfield_rename_tag_enter_cb);
+ else if (ad->entryinfo.entry_mode == GL_ENTRY_RENAME_ALBUM)
+ evas_object_smart_callback_del(ad->entryinfo.imf_entry,
+ "activated",
+ __gl_editfield_rename_album_enter_cb);
+
+ evas_object_smart_callback_del(ad->entryinfo.imf_entry,
+ "changed",
+ __gl_editfield_space_check_cb);
+ evas_object_smart_callback_del(ad->entryinfo.imf_entry,
+ "preedit,changed",
+ __gl_editfield_space_check_cb);
+ }
+ ad->entryinfo.entry_mode = GL_ENTRY_NONE;
+
+ if (ad->entryinfo.imf_context)
+ ecore_imf_context_input_panel_hide(ad->entryinfo.imf_context);
+ if (ad->entryinfo.editfield) {
+ evas_object_del(ad->entryinfo.editfield);
+ ad->entryinfo.editfield = NULL;
+ }
+
+ ad->entryinfo.imf_entry = NULL;
+ ad->entryinfo.imf_context = NULL;
+ ad->entryinfo.done_btn = NULL;
+ ad->entryinfo.nf_it = NULL;
+
+ return 0;
+}
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "gl-nocontents.h"
+#include "gl-thumbs.h"
+#include "gl-thumbs-edit.h"
+#include "gl-controlbar.h"
+#include "gl-ui-util.h"
+#include "gl-util.h"
+#include "gl-strings.h"
+#include "gl-debug.h"
+
+/**
+ * Create Nocontents.
+ */
+Evas_Object *_gl_nocontents_create(void *data)
+{
+ GL_CHECK_NULL(data);
+ gl_appdata *ad = (gl_appdata *)data;
+ Evas_Object *noc_lay = NULL;
+ char label_str[GL_POPUP_DESC_LEN_MAX] = { 0, };
+ bool is_favor_tag = false;
+
+ if (ad->ctrlinfo.tab_mode == GL_CTRL_TAB_TAGS) {
+ gl_tag *cur_tag = ad->taginfo.current_tag;
+ if (cur_tag && cur_tag->tag &&
+ cur_tag->tag->_id == GL_TAG_FAVORITES_ID)
+ is_favor_tag = true;
+ }
+
+ int grid_mode = ad->gridinfo.view_mode;
+ switch (grid_mode) {
+ case GL_THUMB_ALL:
+ if (is_favor_tag)
+ snprintf(label_str, sizeof(label_str), "%s",
+ (char *)(GL_STR_NO_FAVOR_ITEMS));
+ else
+ snprintf(label_str, sizeof(label_str), "%s",
+ (char *)(GL_STR_NO_ITEMS));
+ break;
+ case GL_THUMB_VIDEOS:
+ if (is_favor_tag)
+ snprintf(label_str, sizeof(label_str), "%s",
+ (char *)(GL_STR_NO_FAVOR_VIDEOS));
+ else
+ snprintf(label_str, sizeof(label_str), "%s",
+ (char *)(GL_STR_NO_VIDEOS));
+ break;
+ case GL_THUMB_IMAGES:
+ if (is_favor_tag)
+ snprintf(label_str, sizeof(label_str), "%s",
+ (char *)(GL_STR_NO_FAVOR_IMAGES));
+ else
+ snprintf(label_str, sizeof(label_str), "%s",
+ (char *)(GL_STR_NO_IMAGES));
+ break;
+ case GL_THUMB_ALBUMS:
+ snprintf(label_str, sizeof(label_str), "%s",
+ (char *)(GL_STR_NO_ALBUMS));
+ break;
+ default:
+ snprintf(label_str, sizeof(label_str), "%s",
+ (char *)(GL_STR_NO_CONTENTS));
+ break;
+ }
+
+ gl_dbg("Nocontents label: %s", label_str);
+ /* Full view nocontents */
+ noc_lay = elm_layout_add(ad->maininfo.naviframe);
+ GL_CHECK_NULL(noc_lay);
+ elm_layout_theme_set(noc_lay, "layout", "nocontents", "gallery");
+ elm_object_part_text_set(noc_lay, GL_NOCONTENTS_TEXT, label_str);
+
+ return noc_lay;
+}
+
+/**
+ * Update label of Nocontents.
+ */
+bool _gl_nocontents_update_label(Evas_Object *noc, const char *new_label)
+{
+ GL_CHECK_VAL(new_label, -1);
+ GL_CHECK_VAL(noc, -1);
+ const char *label = NULL;
+
+ label = elm_object_part_text_get(noc, GL_NOCONTENTS_TEXT);
+ GL_CHECK_VAL(label, -1);
+ gl_dbg("Nocontents label: %s", label);
+ /* Update label if they're different */
+ if (g_strcmp0(label, GL_STR_NO_ALBUMS)) {
+ gl_dbgW("Update nocontents label!");
+ elm_object_part_text_set(noc, GL_NOCONTENTS_TEXT, new_label);
+ return true;
+ }
+ return false;
+}
+
+/**
+ * Show Nocontents in All/Images/Videos segment.
+ */
+bool _gl_nocontents_show(void *data)
+{
+ GL_CHECK_FALSE(data);
+ gl_appdata *ad = (gl_appdata *)data;
+ bool b_video_exist = false;
+ bool b_image_exist = false;
+ int grid_mode = ad->gridinfo.view_mode;
+ gl_item *gitem = NULL;
+ int i = 0;
+ bool ret = false;
+ int view_mode = gl_get_view_mode(ad);
+ /* Get all medias count of current album */
+ int cnt = ad->maininfo.medias_cnt;
+
+ if (cnt == 0) {
+ if (ad->ctrlinfo.tab_mode == GL_CTRL_TAB_TAGS) {
+ gl_dbg("None files, show nocontents.");
+ if (view_mode == GL_VIEW_THUMBS_EDIT) {
+ gl_dbg("In edit mode, change to normal view.");
+ _gl_thumbs_edit_pop_view(ad);
+ }
+ /* Clear invalid objects if needed */
+ _gl_thumbs_delete_view(ad);
+ /* Reset flags */
+ ad->gridinfo.view_mode = GL_THUMB_ALL;
+ /* Create nocontents widget */
+ Evas_Object *noc = NULL;
+ noc = _gl_nocontents_create(ad);
+ if (ad->gridinfo.all_grid_view) {
+ evas_object_del(ad->gridinfo.all_grid_view);
+ ad->gridinfo.all_grid_view = NULL;
+ }
+ ad->gridinfo.all_grid_view = noc;
+ ad->gridinfo.all_grid_nocontents = noc;
+ elm_object_part_content_unset(ad->gridinfo.navi_content_ly,
+ "elm.swallow.view");
+ evas_object_show(ad->gridinfo.all_grid_view);
+ elm_object_part_content_set(ad->gridinfo.navi_content_ly,
+ "elm.swallow.view",
+ ad->gridinfo.all_grid_view);
+ _gl_ctrl_disable_btn(ad, true, GL_NAVI_THUMBS);
+ }
+ } else if (grid_mode == GL_THUMB_VIDEOS ||
+ grid_mode == GL_THUMB_IMAGES) {
+ /* check in video or image segment. */
+ for (i = 1; i <= cnt; i++) {
+ _gl_data_get_item_by_index(ad, i, false, &gitem);
+ if (gitem == NULL || gitem->item == NULL) {
+ gl_dbgE("gitem == NULL || gitem->item == NULL");
+ continue;
+ }
+
+ if (grid_mode == GL_THUMB_VIDEOS && !b_video_exist &&
+ gitem->item->type == MEDIA_CONTENT_TYPE_VIDEO) {
+ b_video_exist = true;
+ break;
+ } else if (grid_mode == GL_THUMB_IMAGES &&
+ !b_image_exist &&
+ gitem->item->type == MEDIA_CONTENT_TYPE_IMAGE) {
+ b_image_exist = true;
+ break;
+ }
+
+ }
+
+ gl_dbg("video file exists->%d, image file exists->%d",
+ b_video_exist, b_image_exist);
+ if ((grid_mode == GL_THUMB_IMAGES && !b_image_exist) ||
+ (grid_mode == GL_THUMB_VIDEOS && !b_video_exist)) {
+ if (view_mode == GL_VIEW_THUMBS_EDIT) {
+ gl_dbg("In edit mode, change to normal view.");
+ _gl_thumbs_edit_pop_view(ad);
+ }
+
+ if (ad->gridinfo.all_grid_view) {
+ evas_object_del(ad->gridinfo.all_grid_view);
+ ad->gridinfo.all_grid_view = NULL;
+ ad->gridinfo.all_grid_nocontents = NULL;
+ }
+ gl_dbg("None image files, show nocontents...");
+ Evas_Object *noc = _gl_nocontents_create(ad);
+
+ ad->gridinfo.all_grid_view = noc;
+ ad->gridinfo.all_grid_nocontents = noc;
+
+ elm_object_part_content_unset(ad->gridinfo.navi_content_ly,
+ "elm.swallow.view");
+ evas_object_hide(ad->gridinfo.all_grid_view);
+ elm_object_part_content_set(ad->gridinfo.navi_content_ly,
+ "elm.swallow.view",
+ noc);
+ _gl_ctrl_disable_btn(ad, true, GL_NAVI_THUMBS);
+ ret = true;
+ }
+ }
+
+ return ret;
+}
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <notification.h>
+#include "gl-notify.h"
+#include "gl-thumbs.h"
+#include "gl-controlbar.h"
+#include "gl-thread-util.h"
+#include "gl-ui-util.h"
+#include "gl-util.h"
+#include "gl-strings.h"
+#include "gl-debug.h"
+#include "gl-ext-exec.h"
+
+/**
+* Create a new notify widget
+* b_selinfo, True: Create selectioninfo, False: Create notificationinfo.
+*/
+static int __gl_notify_add(void *data, Evas_Object *parent)
+{
+ gl_dbg("");
+ GL_CHECK_VAL(parent, -1);
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+
+ _gl_notify_destroy_selinfo(ad);
+
+ ad->popupinfo.selinfo_ly = elm_layout_add(parent);
+ GL_CHECK_VAL(ad->popupinfo.selinfo_ly, -1);
+ evas_object_size_hint_weight_set(ad->popupinfo.selinfo_ly,
+ EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ad->popupinfo.selinfo_ly,
+ EVAS_HINT_FILL, EVAS_HINT_FILL);
+ elm_layout_theme_set(ad->popupinfo.selinfo_ly, "standard",
+ "selectioninfo", "center_text");
+
+ /* Set the content of the notify widget */
+ elm_object_part_content_set(parent, "elm.swallow.selinfo",
+ ad->popupinfo.selinfo_ly);
+ return 0;
+}
+
+int _gl_notify_create_notiinfo(void *data, const char *text)
+{
+ GL_CHECK_VAL(text, -1);
+ int ret = notification_status_message_post(text);
+ if (ret != 0)
+ gl_dbgE("status_message_post()... [0x%x]!", ret);
+ return ret;
+}
+
+/**
+* Update selectioinfo widget and view related to it
+*/
+static int _gl_notify_update_layout(void *data, Evas_Object *parent, int sel_cnt)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ const char *v_emis = NULL;
+ int view_mode = gl_get_view_mode(ad);
+ gl_dbg("view_mode: %d", view_mode);
+
+ if (sel_cnt > 0) {
+ if (view_mode == GL_VIEW_THUMBS_EDIT) {
+ v_emis = GL_SIGNAL_VIEW_MOVEUP;
+ } else if (view_mode == GL_VIEW_THUMBS_SELECT ||
+ view_mode == GL_VIEW_TAGS_EDIT ||
+ view_mode == GL_VIEW_ALBUMS_EDIT) {
+ v_emis = GL_SIGNAL_VIEW_MOVEUP;
+ } else {
+ gl_dbgW("Skip mode!");
+ return -1;
+ }
+ } else {
+ /* Restore view while selectioninfo vanished. */
+ if (view_mode == GL_VIEW_THUMBS_EDIT ||
+ view_mode == GL_VIEW_THUMBS_SELECT ||
+ view_mode == GL_VIEW_TAGS_EDIT ||
+ view_mode == GL_VIEW_ALBUMS_EDIT) {
+ v_emis = GL_SIGNAL_VIEW_EDIT;
+ } else {
+ gl_dbgW("Skip mode!");
+ return -1;
+ }
+ }
+ edje_object_signal_emit(_EDJ(parent), v_emis, "elm");
+ return 0;
+}
+
+/**
+* Add new notify widget, select-all widget and set view state.
+*
+* b_update, if true, update text only, other recreate notify widget
+*/
+int _gl_notify_create_selinfo(void *data, Evas_Object *parent,
+ Elm_Object_Item *nf_it, int all_cnt,
+ int selected_cnt, bool b_update)
+{
+ GL_CHECK_VAL(parent, -1);
+ GL_CHECK_VAL(data, -1);
+ GL_CHECK_VAL(nf_it, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ char text[GL_POPUP_DESC_LEN_MAX] = { 0, };
+ int view_mode = gl_get_view_mode(ad);
+
+ gl_dbg("selected_cnt/all_cnt = %d/%d", selected_cnt, all_cnt);
+ if (selected_cnt > all_cnt) {
+ _gl_notify_destroy_selinfo(ad);
+ gl_dbgE("selected_cnt > all_cnt!");
+ return -1;
+ }
+
+ /* Create new notify widget */
+ if (b_update == false)
+ __gl_notify_add(ad, parent);
+
+ /* Update state of checkbox in select-all widget */
+ _gl_ui_update_selall(ad, all_cnt, selected_cnt);
+
+ /* Reuse old notify widget in update case */
+ GL_CHECK_VAL(ad->popupinfo.selinfo_ly, -1);
+
+ /* Update notify widget and view related to it */
+ _gl_notify_update_layout(ad, parent, selected_cnt);
+
+ if (selected_cnt > 0) {
+ /* Enable/Disable control bar buttons */
+ _gl_ctrl_disable_btns(ad, nf_it, false);
+ /* Add Space */
+ snprintf(text, sizeof(text), "%s (%d)", GL_STR_SELECTED,
+ selected_cnt);
+ /* Set the text for notify */
+ edje_object_part_text_set(_EDJ(ad->popupinfo.selinfo_ly),
+ "elm.text", text);
+
+ _gl_ui_disable_slideshow(ad, false);
+ } else if (view_mode == GL_VIEW_THUMBS_SELECT) {
+ /* Disable control bar buttons */
+ _gl_ctrl_disable_btns(ad, nf_it, true);
+ } else {
+ /* Disable control bar buttons */
+ _gl_ctrl_disable_btns(ad, nf_it, true);
+ _gl_notify_destroy_selinfo(ad);
+ _gl_ui_disable_slideshow(ad, true);
+ }
+
+ return 0;
+}
+
+int _gl_notify_destroy_selinfo(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ gl_dbg("");
+ if (ad->popupinfo.selinfo_ly) {
+ evas_object_del(ad->popupinfo.selinfo_ly);
+ ad->popupinfo.selinfo_ly = NULL;
+ }
+ return 0;
+}
+
+int _gl_notify_update_lang(void *data, int cnt, int view_mode)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ Evas_Object *view_ly = NULL;
+
+ view_ly = _gl_ui_get_view_layout(data, view_mode);
+ /*Select all*/
+ if (view_ly)
+ edje_object_part_text_set(_EDJ(view_ly), "selectall_text",
+ GL_STR_SELECT_ALL);
+ /*Reset text for select info*/
+ if (ad->popupinfo.selinfo_ly) {
+ char text[GL_POPUP_DESC_LEN_MAX] = {0};
+ snprintf(text, sizeof(text), "%s (%d)", GL_STR_SELECTED, cnt);
+ edje_object_part_text_set(_EDJ(ad->popupinfo.selinfo_ly),
+ "elm.text", text);
+ }
+
+ return 0;
+}
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "gallery.h"
+#include "gl-popup.h"
+#include "gl-ui-util.h"
+#include "gl-util.h"
+#include "gl-debug.h"
+#include "gl-tags.h"
+#include "gl-tags-new.h"
+#include "gl-albums-new.h"
+#include "gl-albums-rename.h"
+#include "gl-progressbar.h"
+#include "gl-strings.h"
+#include "gl-button.h"
+#include "gl-editfield.h"
+
+#define GL_POPUP_TIMEOUT_1S 1.0
+#define GL_POPUP_TIMEOUT_2S 2.0
+#define GL_POPUP_TIMEOUT_3S 3.0
+
+/* Delete popup contents */
+static int __gl_popup_clear_content(Evas_Object *popup)
+{
+ GL_CHECK_VAL(popup, -1);
+ gl_dbg("");
+
+ Evas_Object *content = elm_object_content_get(popup);
+ GL_CHECK_VAL(content, -1);
+ Eina_List *chidren = elm_box_children_get(content);
+ GL_CHECK_VAL(chidren, -1);
+ Evas_Object *genlist = eina_list_nth(chidren, 0);
+ GL_CHECK_VAL(genlist, -1);
+ elm_genlist_clear(genlist);
+ elm_box_clear(content);
+ return 0;
+}
+
+static Eina_Bool __gl_popup_timeout_cb(void *data)
+{
+ GL_CHECK_FALSE(data);
+ gl_appdata *ad = (gl_appdata *)data;
+ if (ad->popupinfo.del_timer) {
+ ecore_timer_del(ad->popupinfo.del_timer);
+ ad->popupinfo.del_timer = NULL;
+ }
+
+ GL_IF_DEL_OBJ(ad->popupinfo.popup);
+ return ECORE_CALLBACK_CANCEL;
+}
+
+static int __gl_popup_add_timer(void *data, double to_inc)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ if (ad->popupinfo.del_timer) {
+ ecore_timer_del(ad->popupinfo.del_timer);
+ ad->popupinfo.del_timer = NULL;
+ }
+
+ ad->popupinfo.del_timer = ecore_timer_add(to_inc, __gl_popup_timeout_cb,
+ data);
+ return 0;
+}
+
+static void __gl_popup_del_resp_cb(void *data, Evas_Object *obj,
+ void *event_info)
+{
+ GL_CHECK(obj);
+ GL_CHECK(data);
+ gl_appdata *ad = (gl_appdata *)data;
+ const char *text = NULL;
+
+ text = elm_object_text_get(obj);
+ GL_CHECK(text);
+ gl_dbg("Button: %s, mode: %d", text, ad->popupinfo.popup_mode);
+
+ if (!g_strcmp0(text, GL_STR_DELETE)) {
+ if (ad->popupinfo.popup_mode == GL_POPUP_ALBUM_DELETE)
+ gl_del_albums(ad);
+ }
+
+ GL_IF_DEL_OBJ(ad->popupinfo.popup);
+}
+
+static void _gl_popup_del_tag_resp_cb(void *data, Evas_Object *obj,
+ void *event_info)
+{
+ GL_CHECK(obj);
+ GL_CHECK(data);
+ gl_tag *gtag = (gl_tag *)data;
+ GL_CHECK(gtag->ad);
+ gl_appdata *ad = (gl_appdata *)gtag->ad;
+ const char *text = NULL;
+
+ text = elm_object_text_get(obj);
+ GL_CHECK(text);
+ gl_dbg("Button: %s", text);
+
+ if (!g_strcmp0(text, GL_STR_DELETE))
+ _gl_tags_del(data);
+
+ GL_IF_DEL_OBJ(ad->popupinfo.popup);
+}
+
+static void _gl_popup_resp_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ GL_CHECK(data);
+ gl_appdata *ad = (gl_appdata *)data;
+ int mode = ad->popupinfo.popup_mode;
+ const char *text = NULL;
+
+ text = elm_object_text_get(obj);
+ GL_CHECK(text);
+ gl_dbg("Button: %s, mode: %d", text, mode);
+
+ if (mode == GL_POPUP_ALBUM_NEW_EMPTY ||
+ mode == GL_POPUP_ALBUM_NEW_DUPLICATE ||
+ mode == GL_POPUP_ALBUM_NEW_INVALID) {
+ if (!g_strcmp0(text, GL_STR_YES) ||
+ !g_strcmp0(text, GL_STR_OK)) {
+ ad->entryinfo.entry_mode = GL_ENTRY_NEW_ALBUM;
+ _gl_editfield_show_imf(ad);
+ } else if (!g_strcmp0(text, GL_STR_NO) ||
+ !g_strcmp0(text, GL_STR_CANCEL)) {
+ _gl_editfield_hide_imf(ad);
+ _gl_albums_new_pop_view(ad);
+ }
+ } else if (mode == GL_POPUP_ALBUM_RENAME_EMPTY ||
+ mode == GL_POPUP_ALBUM_RENAME_DUPLICATE ||
+ mode == GL_POPUP_ALBUM_RENAME_INVALID) {
+ if (!g_strcmp0(text, GL_STR_YES) ||
+ !g_strcmp0(text, GL_STR_OK)) {
+ _gl_editfield_show_imf(ad);
+ } else if (!g_strcmp0(text, GL_STR_NO) ||
+ !g_strcmp0(text, GL_STR_CANCEL)) {
+ _gl_editfield_hide_imf(ad);
+ _gl_albums_rename_pop_view(ad);
+ }
+ } else if (mode == GL_POPUP_TAG_NEW_EMPTY) {
+ if (!g_strcmp0(text, GL_STR_YES) ||
+ !g_strcmp0(text, GL_STR_OK)) {
+ ad->entryinfo.entry_mode = GL_ENTRY_NEW_TAG;
+ _gl_editfield_show_imf(ad);
+ } else if (!g_strcmp0(text, GL_STR_NO) ||
+ !g_strcmp0(text, GL_STR_CANCEL)) {
+ _gl_editfield_hide_imf(ad);
+ _gl_tags_new_pop_view(ad);
+ }
+ } else if (mode == GL_POPUP_NOBUT_APPEXIT) {
+ if (ad->popupinfo.popup) {
+ __gl_popup_clear_content(ad->popupinfo.popup);
+ evas_object_del(ad->popupinfo.popup);
+ ad->popupinfo.popup = NULL;
+ }
+ elm_exit();
+ return;
+ }
+ GL_IF_DEL_OBJ(ad->pbarinfo.pbar_popup);
+ GL_IF_DEL_OBJ(ad->popupinfo.popup);
+}
+
+int gl_popup_create_albums_del_popup(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ gl_dbg("");
+
+ if (ad->popupinfo.popup != NULL) {
+ gl_dbg("The existed popup is deleted");
+ evas_object_del(ad->popupinfo.popup);
+ }
+
+ Evas_Object *popup = elm_popup_add(ad->maininfo.win);
+ evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+
+ Evas_Object *btn1 = NULL;
+ Evas_Object *btn2 = NULL;
+ btn1 = _gl_but_create_but_popup(popup, GL_STR_DELETE,
+ __gl_popup_del_resp_cb, data);
+ btn2 = _gl_but_create_but_popup(popup, GL_STR_CANCEL,
+ __gl_popup_del_resp_cb, data);
+ elm_object_part_content_set(popup, "button1", btn1);
+ elm_object_part_content_set(popup, "button2", btn2);
+
+ elm_object_text_set(popup, GL_STR_DELETE_COMFIRMATION);
+
+ evas_object_show(popup);
+ ad->popupinfo.popup = popup;
+ ad->popupinfo.popup_mode = GL_POPUP_ALBUM_DELETE;
+ return 0;
+}
+
+int gl_popup_create_tag_del_popup(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_tag *gtag = (gl_tag *)data;
+ GL_CHECK_VAL(gtag->ad, -1);
+ gl_appdata *ad = (gl_appdata *)gtag->ad;
+ gl_dbg("");
+
+ if (ad->popupinfo.popup) {
+ gl_dbg("Remove the existed popup.");
+ evas_object_del(ad->popupinfo.popup);
+ }
+
+ Evas_Object *popup = NULL;
+ popup = elm_popup_add(ad->maininfo.win);
+ evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND,
+ EVAS_HINT_EXPAND);
+
+ Evas_Object *btn1 = NULL;
+ Evas_Object *btn2 = NULL;
+ btn1 = _gl_but_create_but_popup(popup, GL_STR_DELETE,
+ _gl_popup_del_tag_resp_cb, data);
+ btn2 = _gl_but_create_but_popup(popup, GL_STR_CANCEL,
+ _gl_popup_del_tag_resp_cb, data);
+ elm_object_part_content_set(popup, "button1", btn1);
+ elm_object_part_content_set(popup, "button2", btn2);
+
+ elm_object_text_set(popup, GL_STR_DELETE_COMFIRMATION);
+
+ evas_object_show(popup);
+ ad->popupinfo.popup = popup;
+ ad->popupinfo.popup_mode = GL_POPUP_TAG_DELETE;
+
+ return 0;
+}
+
+int gl_popup_create_popup(void *data, gl_popup_mode mode, char *desc)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ gl_dbg("");
+
+ if (ad->popupinfo.popup) {
+ gl_dbg("The existed popup is deleted");
+ evas_object_del(ad->popupinfo.popup);
+ ad->popupinfo.popup = NULL;
+ }
+
+ /**
+ * Pogressbar is showed during moving or deleting medias,
+ * don't delete it while show popup.
+ */
+ if (mode != GL_POPUP_NOBUT_MOV_DEL)
+ gl_pb_del_pbar(ad);
+
+ Evas_Object *popup = elm_popup_add(ad->maininfo.win);
+ evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND,
+ EVAS_HINT_EXPAND);
+ elm_object_text_set(popup, desc);
+ Evas_Object *btn1 = NULL;
+ Evas_Object *btn2 = NULL;
+
+ switch (mode) {
+ case GL_POPUP_NOBUT:
+ case GL_POPUP_NOBUT_APPEXIT:
+ __gl_popup_add_timer(ad, GL_POPUP_TIMEOUT_3S);
+ break;
+ case GL_POPUP_NOBUT_MOV_DEL:
+ __gl_popup_add_timer(ad, GL_POPUP_TIMEOUT_1S);
+ break;
+ case GL_POPUP_ALBUM_NEW_EMPTY:
+ case GL_POPUP_ALBUM_NEW_DUPLICATE:
+ case GL_POPUP_ALBUM_NEW_INVALID:
+ case GL_POPUP_ALBUM_RENAME_EMPTY:
+ case GL_POPUP_ALBUM_RENAME_DUPLICATE:
+ case GL_POPUP_ALBUM_RENAME_INVALID:
+ case GL_POPUP_TAG_NEW_EMPTY:
+ btn1 = _gl_but_create_but_popup(popup, GL_STR_YES,
+ _gl_popup_resp_cb, data);
+ elm_object_part_content_set(popup, "button1", btn1);
+ btn2 = _gl_but_create_but_popup(popup, GL_STR_NO,
+ _gl_popup_resp_cb, data);
+ elm_object_part_content_set(popup, "button2", btn2);
+ gl_dbg("Hide Entry cursor and IMF");
+ _gl_editfield_hide_imf(ad);
+ break;
+ case GL_POPUP_TAG_RENAEM_EMPTY:
+ case GL_POPUP_TAG_RENAME_DUPLICATE:
+ __gl_popup_add_timer(ad, GL_POPUP_TIMEOUT_2S);
+ gl_dbg("Hide Entry cursor and IMF");
+ _gl_editfield_hide_imf(ad);
+ break;
+ default:
+ gl_dbgE("Other popup mode...");
+ break;
+ }
+
+ evas_object_show(popup);
+
+ /* Focus popup and IMF hide */
+ elm_object_focus_set(popup, EINA_TRUE);
+
+ ad->popupinfo.popup = popup;
+ ad->popupinfo.popup_mode = mode;
+
+ return 0;
+}
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "gallery.h"
+#include "gl-progressbar.h"
+#include "gl-ui-util.h"
+#include "gl-util.h"
+#include "gl-debug.h"
+#include "gl-albums.h"
+#include "gl-controlbar.h"
+#include "gl-thread-util.h"
+#include "gl-strings.h"
+#include "gl-button.h"
+
+#define GL_PROGRESSBAR_STYLE_PROGRESS "list_progress"
+#define GL_LABEL_STYLE_DEFAULT GL_CHECKBOX_STYLE_DEFAULT
+
+static void
+_gl_pb_cancel_thread_pbar_cb(void *data, Evas_Object * obj, void *event_info)
+{
+ gl_dbg("");
+ //set cancel false value
+ gl_thread_set_cancel_state(data, GL_PB_CANCEL_BUTTON);
+ //delete progressbar
+ gl_pb_del_pbar(data);
+}
+
+int gl_pb_make_thread_pbar(void *data, Evas_Object * parent, char *title)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ Evas_Object *popup = NULL;
+ Evas_Object *progressbar = NULL;
+ Evas_Object *box = NULL;
+ Evas_Object *label = NULL;
+
+ gl_pb_del_pbar(ad);
+
+ popup = elm_popup_add(parent);
+ elm_object_part_text_set(popup, GL_POPUP_TEXT, title);
+
+ label = elm_label_add(popup);
+ elm_object_style_set(label, GL_LABEL_STYLE_DEFAULT);
+ elm_object_text_set(label, GL_STR_EMPTY);
+ evas_object_size_hint_weight_set(label, EVAS_HINT_EXPAND,
+ EVAS_HINT_EXPAND);
+ evas_object_show(label);
+
+ progressbar = elm_progressbar_add(popup);
+ elm_object_style_set(progressbar, GL_PROGRESSBAR_STYLE_PROGRESS);
+ elm_progressbar_unit_format_set(progressbar, NULL);
+ elm_progressbar_value_set(progressbar, 0.0);
+ evas_object_size_hint_align_set(progressbar, EVAS_HINT_FILL,
+ EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(progressbar, EVAS_HINT_EXPAND,
+ EVAS_HINT_EXPAND);
+ evas_object_show(progressbar);
+
+ box = elm_box_add(popup);
+ evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND,
+ EVAS_HINT_EXPAND);
+ elm_box_horizontal_set(box, EINA_FALSE);
+ elm_box_homogeneous_set(box, EINA_TRUE);
+ elm_box_pack_end(box, progressbar);
+ elm_box_pack_end(box, label);
+ evas_object_show(box);
+
+ elm_object_content_set(popup, box);
+ Evas_Object *btn1 = NULL;
+ btn1 = _gl_but_create_but_popup(popup, GL_STR_CANCEL,
+ _gl_pb_cancel_thread_pbar_cb, data);
+ elm_object_part_content_set(popup, "button1", btn1);
+
+ evas_object_show(popup);
+
+ ad->pbarinfo.pbar_popup = popup;
+ ad->pbarinfo.pbar = progressbar;
+ ad->pbarinfo.status_label = label;
+ ad->pbarinfo.finished_cnt = 0;
+
+ return 0;
+}
+
+int
+gl_pb_refresh_thread_pbar(void *data, int cur_cnt, int total_cnt)
+{
+ GL_CHECK_VAL(data, -1);
+ char status_info[GL_POPUP_DESC_LEN_MAX] = { 0, };
+ double percent = 0.0;
+ gl_appdata *ad = (gl_appdata *)data;
+ GL_CHECK_VAL(ad->pbarinfo.pbar, -1);
+ GL_CHECK_VAL(ad->pbarinfo.status_label, -1);
+
+ snprintf(status_info, sizeof(status_info),
+ GL_FONT_STYLE_POP_S"%d/%d"GL_FONT_STYLE_POP_E, cur_cnt,
+ total_cnt);
+ /* Save medias count already operated */
+ ad->pbarinfo.finished_cnt = cur_cnt;
+ elm_object_text_set(ad->pbarinfo.status_label, status_info);
+ evas_object_show(ad->pbarinfo.status_label);
+
+ percent = (double)cur_cnt / (double)total_cnt;
+ elm_progressbar_value_set(ad->pbarinfo.pbar, percent);
+
+ return 0;
+}
+
+int
+gl_pb_del_pbar(void *data)
+{
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ gl_dbg("destroy progressbar");
+
+ if (ad->pbarinfo.pbar_popup)
+ {
+ evas_object_del(ad->pbarinfo.pbar_popup);
+ ad->pbarinfo.pbar_popup = NULL;
+ ad->pbarinfo.pbar = NULL;
+ ad->pbarinfo.status_label = NULL;
+ ad->pbarinfo.finished_cnt = 0;
+ }
+
+ return 0;
+}
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifdef _USE_ROTATE_BG
+
+#include "gl-rotate-bg.h"
+#include "gl-exif.h"
+#include "gl-debug.h"
+#include "gl-icons.h"
+
+#define GL_ROTATE_BG_DATA_KEY "gl_bg_data"
+#define GL_ROTATE_BG_GROUP "gl_bg_layout"
+
+typedef struct _gl_bg {
+ Evas_Object *base;
+ Evas_Object *img;
+ char *file;
+} gl_bg;
+
+static int __gl_rotate_bg_image_rotate_180(Evas_Object *obj)
+{
+ GL_CHECK_VAL(obj, -1);
+ unsigned int *data = NULL;
+ unsigned int *data2 = NULL;
+ unsigned int *to = NULL;
+ unsigned int *from = NULL;
+ int x = 0;
+ int hw = 0;
+ int iw = 0;
+ int ih = 0;
+
+ evas_object_image_size_get(obj, &iw, &ih);
+ int size = iw * ih * sizeof(unsigned int);
+
+ /* EINA_FALSE for reading */
+ data = evas_object_image_data_get(obj, EINA_FALSE);
+ /* memcpy */
+ data2 = calloc(1, size);
+ GL_CHECK_VAL(data2, -1);
+ memcpy(data2, data, size);
+
+ data = evas_object_image_data_get(obj, EINA_TRUE);
+
+ hw = iw * ih;
+ x = hw;
+ to = data;
+ from = data2 + hw - 1;
+ for (; --x >= 0;) {
+ *to = *from;
+ to++;
+ from--;
+ }
+
+#if 0 /* Failed to rotate icon created from original file */
+ hw = iw * ih;
+ x = (hw / 2);
+ p1 = data;
+ p2 = data + hw - 1;
+ for (; --x > 0;) {
+ tmp = *p1;
+ *p1 = *p2;
+ *p2 = tmp;
+ p1++;
+ p2--;
+ }
+#endif
+
+ GL_FREE(data2);
+
+ evas_object_image_data_set(obj, data);
+ evas_object_image_data_update_add(obj, 0, 0, iw, ih);
+ return 0;
+}
+
+static int __gl_rotate_bg_image_rotate_90(Evas_Object *obj)
+{
+ GL_CHECK_VAL(obj, -1);
+ unsigned int *data = NULL;
+ unsigned int *data2 = NULL;
+ unsigned int *to = NULL;
+ unsigned int *from = NULL;
+ int x = 0;
+ int y = 0;
+ int w = 0;
+ int hw = 0;
+ int iw = 0;
+ int ih = 0;
+
+ evas_object_image_size_get(obj, &iw, &ih);
+ int size = iw * ih * sizeof(unsigned int);
+
+ /* EINA_FALSE for reading */
+ data = evas_object_image_data_get(obj, EINA_FALSE);
+ /* memcpy */
+ data2 = calloc(1, size);
+ GL_CHECK_VAL(data2, -1);
+ memcpy(data2, data, size);
+
+ /* set width, height */
+ w = ih;
+ ih = iw;
+ iw = w;
+ hw = w * ih;
+
+ /* set width, height to image obj */
+ evas_object_image_size_set(obj, iw, ih);
+ data = evas_object_image_data_get(obj, EINA_TRUE);
+ to = data + w - 1;
+ hw = -hw - 1;
+ from = data2;
+
+ for (x = iw; --x >= 0;) {
+ for (y = ih; --y >= 0;) {
+ *to = *from;
+ from++;
+ to += w;
+ }
+
+ to += hw;
+ }
+
+ GL_FREE(data2);
+
+ evas_object_image_data_set(obj, data);
+ evas_object_image_data_update_add(obj, 0, 0, iw, ih);
+ return 0;
+}
+
+static int __gl_rotate_bg_image_rotate_270(Evas_Object *obj)
+{
+ GL_CHECK_VAL(obj, -1);
+ unsigned int *data = NULL;
+ unsigned int *data2 = NULL;
+ unsigned int *to = NULL;
+ unsigned int *from = NULL;
+ int x = 0;
+ int y = 0;
+ int w = 0;
+ int hw = 0;
+ int iw = 0;
+ int ih = 0;
+
+ evas_object_image_size_get(obj, &iw, &ih);
+ int size = iw * ih * sizeof(unsigned int);
+
+ /* EINA_FALSE for reading */
+ data = evas_object_image_data_get(obj, EINA_FALSE);
+ /* memcpy */
+ data2 = calloc(1, size);
+ GL_CHECK_VAL(data2, -1);
+ memcpy(data2, data, size);
+
+ /* set width, height */
+ w = ih;
+ ih = iw;
+ iw = w;
+ hw = w * ih;
+
+ /* set width, height to image obj */
+ evas_object_image_size_set(obj, iw, ih);
+ data = evas_object_image_data_get(obj, EINA_TRUE);
+
+ to = data + hw - w;
+ w = -w;
+ hw = hw + 1;
+ from = data2;
+
+ for (x = iw; --x >= 0;) {
+ for (y = ih; --y >= 0;) {
+ *to = *from;
+ from++;
+ to += w;
+ }
+
+ to += hw;
+ }
+
+ GL_FREE(data2);
+
+ evas_object_image_data_set(obj, data);
+ evas_object_image_data_update_add(obj, 0, 0, iw, ih);
+ return 0;
+}
+
+/* check its orientation */
+int __gl_rotate_bg_rotate_image(Evas_Object *obj, unsigned int orient)
+{
+ switch (orient){
+ case GL_ORIENTATION_ROT_90:
+ __gl_rotate_bg_image_rotate_90(obj);
+ break;
+ case GL_ORIENTATION_ROT_180:
+ __gl_rotate_bg_image_rotate_180(obj);
+ break;
+ case GL_ORIENTATION_ROT_270:
+ __gl_rotate_bg_image_rotate_270(obj);
+ break;
+ default:
+ break;
+ }
+
+ return 0;
+}
+
+static void __gl_rotate_bg_delete_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ if (data) {
+ gl_bg *bg_data = (gl_bg *)data;
+ GL_FREEIF(bg_data->file);
+ GL_FREE(data);
+ }
+}
+
+static void __gl_rotate_bg_custom_resize(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ GL_CHECK(data);
+ gl_bg *bg_data = (gl_bg *)data;
+ Evas_Coord bx = 0;
+ Evas_Coord by = 0;
+ Evas_Coord bw = 0;
+ Evas_Coord bh = 0;
+ Evas_Coord iw = 0;
+ Evas_Coord ih = 0;
+ Evas_Coord fx = 0;
+ Evas_Coord fy = 0;
+ Evas_Coord fw = 0;
+ Evas_Coord fh = 0;
+ Evas_Coord nx = 0;
+ Evas_Coord ny = 0;
+ Evas_Coord nw = 0;
+ Evas_Coord nh = 0;
+
+ if ((!bg_data->img) || (!bg_data->base)) {
+ gl_dbgE("Invalid object!");
+ return;
+ }
+ /* grab image size */
+ evas_object_image_size_get(bg_data->img, &iw, &ih);
+ if ((iw < 1) || (ih < 1)) {
+ gl_dbgE("(iw < 1) || (ih < 1)!");
+ return;
+ }
+
+ /* grab base object dimensions */
+ evas_object_geometry_get(bg_data->base, &bx, &by, &bw, &bh);
+
+ /* set some defaults */
+ nx = bx;
+ ny = by;
+ nw = bw;
+ nh = bh;
+
+
+ fw = bw;
+ fh = ((ih * fw) / iw);
+ if (fh < bh) {
+ fh = bh;
+ fw = ((iw * fh) / ih);
+ }
+ fx = ((bw - fw) / 2);
+ fy = ((bh - fh) / 2);
+
+ evas_object_move(bg_data->img, nx, ny);
+ evas_object_resize(bg_data->img, nw, nh);
+ evas_object_image_fill_set(bg_data->img, fx, fy, fw, fh);
+}
+
+Evas_Object *_gl_rotate_bg_add_layout(Evas_Object *parent, const char *file, const char *group)
+{
+ Evas_Object *eo = NULL;
+ int r = 0;
+
+ eo = elm_layout_add(parent);
+ if (eo) {
+ r = elm_layout_file_set(eo, file, group);
+ if (!r) {
+ evas_object_del(eo);
+ return NULL;
+ }
+
+ evas_object_size_hint_weight_set(eo, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(eo, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ }
+
+ return eo;
+}
+
+Evas_Object *_gl_rotate_bg_add(Evas_Object *parent)
+{
+ GL_CHECK_NULL(parent);
+
+ gl_bg *bg_data = (gl_bg *)calloc(1, sizeof(gl_bg));
+ GL_CHECK_NULL(bg_data);
+
+ Evas_Object *base = NULL;
+ base = _gl_rotate_bg_add_layout(parent, GL_EDJ_FILE,
+ GL_ROTATE_BG_GROUP);
+ if (base == NULL) {
+ GL_FREE(bg_data);
+ return NULL;
+ }
+
+ bg_data->base= base;
+ evas_object_event_callback_add(base, EVAS_CALLBACK_RESIZE,
+ __gl_rotate_bg_custom_resize, bg_data);
+ evas_object_event_callback_add(base, EVAS_CALLBACK_DEL,
+ __gl_rotate_bg_delete_cb, bg_data);
+
+ evas_object_data_set(base, GL_ROTATE_BG_DATA_KEY, bg_data);
+ return base;
+}
+
+int _gl_rotate_bg_set_file(Evas_Object *bg, const char *file, int w, int h)
+{
+ GL_CHECK_VAL(file, -1);
+ GL_CHECK_VAL(bg, -1);
+
+ gl_bg *bg_data = evas_object_data_get(bg, GL_ROTATE_BG_DATA_KEY);
+ GL_CHECK_VAL(bg_data, -1);
+
+ Evas_Object *image_obj = NULL;
+ image_obj = evas_object_image_add(evas_object_evas_get(bg));
+ evas_object_repeat_events_set(image_obj, EINA_TRUE);
+ bg_data->img = image_obj;
+ bg_data->file = strdup(file);
+ elm_object_part_content_set(bg, "elm.swallow.image", image_obj);
+ evas_object_image_load_size_set(image_obj, w, h);
+ evas_object_image_file_set(image_obj, file, NULL);
+ evas_object_image_preload(image_obj, EINA_FALSE);
+ return 0;
+}
+
+int _gl_rotate_bg_rotate_image(Evas_Object *bg, unsigned int orient)
+{
+ GL_CHECK_VAL(bg, -1);
+
+ gl_bg *bg_data = evas_object_data_get(bg, GL_ROTATE_BG_DATA_KEY);
+ GL_CHECK_VAL(bg_data, -1);
+
+ if (bg_data->file && g_strcmp0(bg_data->file, GL_DEFAULT_THUMB_ICON))
+ __gl_rotate_bg_rotate_image(bg_data->img, orient);
+ else
+ __gl_rotate_bg_rotate_image(bg_data->img, GL_ORIENTATION_ROT_0);
+ __gl_rotate_bg_custom_resize(bg_data, NULL, NULL, NULL);
+ return 0;
+}
+
+int _gl_rotate_bg_add_image(Evas_Object *bg, int w, int h)
+{
+ GL_CHECK_VAL(bg, -1);
+
+ gl_bg *bg_data = evas_object_data_get(bg, GL_ROTATE_BG_DATA_KEY);
+ GL_CHECK_VAL(bg_data, -1);
+
+ Evas_Object *image_obj = NULL;
+ image_obj = evas_object_image_add(evas_object_evas_get(bg));
+ evas_object_image_size_set(image_obj, w, h);
+ evas_object_image_fill_set(image_obj, 0, 0, w, h);
+ evas_object_repeat_events_set(image_obj, EINA_TRUE);
+ bg_data->img = image_obj;
+ elm_object_part_content_set(bg, "elm.swallow.image", image_obj);
+ evas_object_image_load_size_set(image_obj, w, h);
+ return 0;
+}
+
+int _gl_rotate_bg_set_image_file(Evas_Object *bg, const char *file)
+{
+ GL_CHECK_VAL(bg, -1);
+
+ gl_bg *bg_data = evas_object_data_get(bg, GL_ROTATE_BG_DATA_KEY);
+ GL_CHECK_VAL(bg_data, -1);
+ GL_CHECK_VAL(bg_data->img, -1);
+
+ evas_object_image_file_set(bg_data->img, file, NULL);
+ evas_object_image_preload(bg_data->img, EINA_FALSE);
+
+ __gl_rotate_bg_custom_resize(bg_data, NULL, NULL, NULL);
+ return 0;
+}
+
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "gl-debug.h"
+#include "gl-util.h"
+#include "gl-drm.h"
+#include "gl-strings.h"
+#include "gl-icons.h"
+#ifdef _USE_ROTATE_BG
+#include "gl-rotate-bg.h"
+#include "gl-exif.h"
+#endif
+
+#define GL_GRID_ICON_SIZE 175
+
+#define GL_PHOTOFRAME_STYLE_VIDEO_FAVOR_BOOKMARK "default_layout_video_favor_bookmark"
+#define GL_PHOTOFRAME_STYLE_VIDEO_BOOKMARK "default_layout_video_bookmark"
+#define GL_PHOTOFRAME_STYLE_VIDEO_FAVOR "default_layout_video_favor"
+#define GL_PHOTOFRAME_STYLE_VIDEO "default_layout_video"
+#define GL_PHOTOFRAME_STYLE_FAVOR "default_layout_favor"
+#define GL_PHOTOFRAME_STYLE_DEFAULT "default_layout"
+
+Evas_Object *_gl_thumb_show_part_icon_image(Evas_Object *obj, char *path,
+ unsigned int orient, bool b_favor,
+ bool is_expired_drm, int item_size)
+{
+ GL_CHECK_NULL(obj);
+
+ Evas_Object *layout = elm_layout_add(obj);
+ GL_CHECK_NULL(layout);
+
+#ifdef _USE_ROTATE_BG
+ Evas_Object *bg = _gl_rotate_bg_add(layout);
+#else
+ Evas_Object *bg = elm_bg_add(layout);
+#endif
+ if (bg == NULL) {
+ evas_object_del(layout);
+ return NULL;
+ }
+
+#ifdef _USE_ROTATE_BG
+ _gl_rotate_bg_set_file(bg, path, item_size, item_size);
+ _gl_rotate_bg_rotate_image(bg, orient);
+#else
+ elm_bg_file_set(bg, path, NULL);
+ elm_bg_load_size_set(bg, item_size, item_size);
+ evas_object_size_hint_max_set(bg, item_size, item_size);
+ evas_object_size_hint_aspect_set(bg, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
+ evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bg, EVAS_HINT_FILL, EVAS_HINT_FILL);
+#endif
+
+ // TODO: Need to check the expired drm icon file...
+ /* Expired drm icon */
+ if (is_expired_drm) {
+ elm_layout_theme_set(layout, GL_CLASS_GENGRID, GL_GRP_PHOTOFRAME,
+ GL_PHOTOFRAME_STYLE_FAVOR);
+ elm_object_part_content_set(layout, "elm.swallow.icon", bg);
+
+ Evas_Object *icon = elm_icon_add(layout);
+ GL_ICON_SET_FILE(icon, GL_LOCK_ICON);
+ evas_object_show(icon);
+ elm_object_part_content_set(layout, "elm.swallow.favoricon",
+ icon);
+ } else if (b_favor) {
+ /* Set favourites icon */
+ elm_layout_theme_set(layout, GL_CLASS_GENGRID, GL_GRP_PHOTOFRAME,
+ GL_PHOTOFRAME_STYLE_FAVOR);
+ elm_object_part_content_set(layout, "elm.swallow.icon", bg);
+
+ Evas_Object *icon = elm_icon_add(layout);
+ GL_ICON_SET_FILE(icon, GL_THUMB_FAVOR_ICON);
+ evas_object_show(icon);
+ elm_object_part_content_set(layout, "elm.swallow.favoricon",
+ icon);
+ } else {
+ elm_layout_theme_set(layout, GL_CLASS_GENGRID, GL_GRP_PHOTOFRAME,
+ GL_PHOTOFRAME_STYLE_DEFAULT);
+ elm_object_part_content_set(layout, "elm.swallow.icon", bg);
+ }
+
+ evas_object_show(layout);
+ return layout;
+}
+
+Evas_Object *_gl_thumb_show_part_icon_video(Evas_Object *obj, char *path,
+ unsigned int v_dur, int bk_len,
+ bool b_favor, bool is_expired_drm,
+ int item_size)
+{
+ GL_CHECK_NULL(obj);
+
+ Evas_Object *layout = elm_layout_add(obj);
+ GL_CHECK_NULL(layout);
+
+#ifdef _USE_ROTATE_BG
+ Evas_Object *bg = _gl_rotate_bg_add(layout);
+#else
+ Evas_Object *bg = elm_bg_add(layout);
+#endif
+ if (bg == NULL) {
+ evas_object_del(layout);
+ return NULL;
+ }
+
+#ifdef _USE_ROTATE_BG
+ _gl_rotate_bg_set_file(bg, path, item_size, item_size);
+ _gl_rotate_bg_rotate_image(bg, GL_ORIENTATION_ROT_0);
+#else
+ elm_bg_file_set(bg, path, NULL);
+ elm_bg_load_size_set(bg, item_size, item_size);
+ evas_object_size_hint_max_set(bg, item_size, item_size);
+ evas_object_size_hint_aspect_set(bg, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
+ evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bg, EVAS_HINT_FILL, EVAS_HINT_FILL);
+#endif
+
+ if (bk_len && b_favor)
+ elm_layout_theme_set(layout, GL_CLASS_GENGRID, GL_GRP_PHOTOFRAME,
+ GL_PHOTOFRAME_STYLE_VIDEO_FAVOR_BOOKMARK);
+ else if (bk_len)
+ elm_layout_theme_set(layout, GL_CLASS_GENGRID, GL_GRP_PHOTOFRAME,
+ GL_PHOTOFRAME_STYLE_VIDEO_BOOKMARK);
+ else if (is_expired_drm || b_favor)
+ elm_layout_theme_set(layout, GL_CLASS_GENGRID, GL_GRP_PHOTOFRAME,
+ GL_PHOTOFRAME_STYLE_VIDEO_FAVOR);
+ else
+ elm_layout_theme_set(layout, GL_CLASS_GENGRID, GL_GRP_PHOTOFRAME,
+ GL_PHOTOFRAME_STYLE_VIDEO);
+ elm_object_part_content_set(layout, "elm.swallow.icon", bg);
+
+ // TODO: Need to check the expired drm icon file...
+ /* Expired drm icon */
+ if (is_expired_drm) {
+ Evas_Object *icon = elm_icon_add(layout);
+ GL_ICON_SET_FILE(icon, GL_LOCK_ICON);
+ evas_object_show(icon);
+ elm_object_part_content_set(layout, "elm.swallow.favoricon",
+ icon);
+ /* Set favourites icon */
+ } else if (b_favor) {
+ Evas_Object *icon = elm_icon_add(layout);
+ GL_ICON_SET_FILE(icon, GL_THUMB_FAVOR_ICON);
+ evas_object_show(icon);
+ elm_object_part_content_set(layout, "elm.swallow.favoricon",
+ icon);
+ }
+
+ if (bk_len) {
+ Evas_Object *icon = elm_icon_add(layout);
+ GL_ICON_SET_FILE(icon, GL_THUMB_BOOKMARK);
+ evas_object_show(icon);
+ elm_object_part_content_set(layout, "elm.swallow.bookmarkicon",
+ icon);
+ }
+
+ char *dur_str = _gl_get_duration_string(v_dur);
+ GL_CHECK_NULL(dur_str);
+ elm_object_part_text_set(layout, GL_GRID_TEXT, dur_str);
+ GL_FREE(dur_str);
+
+ evas_object_show(layout);
+ return layout;
+}
+
+Evas_Object *_gl_thumb_show_part_checkbox(Evas_Object *obj, bool checked,
+ Evas_Smart_Cb func, const void *data)
+{
+ GL_CHECK_NULL(func);
+ GL_CHECK_NULL(obj);
+ Evas_Object *ck = NULL;
+
+ ck = elm_check_add(obj);
+ GL_CHECK_NULL(ck);
+ elm_object_style_set(ck, GL_CHECKBOX_STYLE_GRID);
+ evas_object_propagate_events_set(ck, EINA_FALSE);
+
+ elm_check_state_set(ck, checked);
+
+ evas_object_smart_callback_add(ck, "changed", func, data);
+
+ evas_object_show(ck);
+ return ck;
+}
+
+Evas_Object *_gl_thumb_add_gengrid(Evas_Object *parent)
+{
+ GL_CHECK_NULL(parent);
+ Evas_Object *grid = elm_gengrid_add(parent);
+ GL_CHECK_NULL(grid);
+ elm_gengrid_align_set(grid, 0.5, 0.0);
+ elm_gengrid_horizontal_set(grid, EINA_FALSE);
+ elm_scroller_bounce_set(grid, EINA_FALSE, EINA_TRUE);
+ elm_gengrid_multi_select_set(grid, EINA_TRUE);
+
+ evas_object_size_hint_weight_set(grid, EVAS_HINT_EXPAND,
+ EVAS_HINT_EXPAND);
+
+ return grid;
+}
+
+/* Update all gengrid item, class callback would be called again */
+int _gl_thumb_update_gengrid(Evas_Object *view)
+{
+ GL_CHECK_VAL(view, -1);
+
+ Elm_Object_Item *_first_it = NULL;
+ _first_it = elm_gengrid_first_item_get(view);
+ while(_first_it) {
+ elm_gengrid_item_update(_first_it);
+ _first_it = elm_gengrid_item_next_get(_first_it);
+ }
+
+ return 0;
+}
+
+int _gl_thumb_set_size(void *data, Evas_Object *view, int count, int *size)
+{
+ GL_CHECK_VAL(view, -1);
+ GL_CHECK_VAL(data, -1);
+ gl_appdata *ad = (gl_appdata *)data;
+ int _size = (int)(GL_GRID_ICON_SIZE * ad->maininfo.win_scale);
+ int _w = (int)(GL_GRID_ITEM_SIZE_W * ad->maininfo.win_scale);
+ int _h = (int)(GL_GRID_ITEM_SIZE_H * ad->maininfo.win_scale);
+
+ if (count <= GL_GRID_ITEM_ZOOM_LEVEL_02_CNT) {
+ _size *= GL_GRID_ITEM_ZOOM_LEVEL_02;
+ _w *= GL_GRID_ITEM_ZOOM_LEVEL_02;
+ _h *= GL_GRID_ITEM_ZOOM_LEVEL_02;
+ }
+
+ elm_gengrid_item_size_set(view, _w, _h);
+ gl_dbg("Thumb width: %d, height: %d, size: %d", _w, _h, _size);
+ if (size)
+ *size = _size;
+ return 0;
+}
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "gl-debug.h"
+#include "gl-tile.h"
+#include "gl-util.h"
+#include "gl-button.h"
+#include "gallery.h"
+#include "gl-icons.h"
+#ifdef _USE_ROTATE_BG
+#include "gl-rotate-bg.h"
+#endif
+
+/* Album color level and alpha value */
+#define GL_TILE_TEXT_COLOR_CNT 6
+#define GL_TILE_TEXT_COLOR_ALPHA 255
+/* Width and height of album item (208+28, 210+15) */
+#define GL_TILE_ITEM_WIDTH 358
+#define GL_TILE_ITEM_HEIGHT 360
+
+#define GL_CHECKBOX_STYLE_ALBUM "gallery/album"
+#define GL_CHECKBOX_STYLE_ALBUM_GRID "gallery/album/grid"
+#define GL_GENGRID_STYLE_ALBUM "unclipped"
+
+typedef struct _gl_tile_color {
+ int r;
+ int g;
+ int b;
+} gl_tile_color;
+
+static gl_tile_color bg_color[] = {
+ {50, 50, 50},
+ {78, 74, 64},
+ {49, 125, 174},
+ {165, 53, 53},
+ {71, 128, 11},
+ {56, 78, 116},
+ {25, 25, 25},
+};
+
+Evas_Object *__gl_tile_add_1_icon_bg(Evas_Object *obj, int len, double scale,
+ bg_file_set_cb func, void **data)
+{
+ GL_CHECK_NULL(obj);
+ GL_CHECK_NULL(func);
+ Evas_Object *bg = NULL;
+
+#ifdef _USE_ROTATE_BG
+ bg = _gl_rotate_bg_add(obj);
+#else
+ bg = elm_bg_add(obj);
+#endif
+ GL_CHECK_NULL(bg);
+
+ int wid = 0;
+ int hei = 0;
+
+ wid = (int)(GL_TILER_ICON_S * scale);
+ if (len == 1)
+ hei = wid;
+ else
+ hei = (int)(GL_TILE_2X_GRID_S * scale);
+
+#ifdef _USE_ROTATE_BG
+ _gl_rotate_bg_add_image(bg, wid, hei);
+#else
+ elm_bg_load_size_set(bg, wid, hei);
+#endif
+
+ func(bg, data[0]);
+
+ evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bg, 0.5, 0.5);
+ evas_object_show(bg);
+
+ return bg;
+}
+
+Evas_Object *_gl_tile_show_part_icon(Evas_Object *obj, const char *part,
+ int length, double scale,
+ bg_file_set_cb func, void **data)
+{
+ GL_CHECK_NULL(part);
+ GL_CHECK_NULL(strlen(part));
+ GL_CHECK_NULL(obj);
+
+ if (!g_strcmp0(part, GT_TILE_ONLYICON)) {
+ Evas_Object *bg = NULL;
+ bg = __gl_tile_add_1_icon_bg(obj, GL_TILE_THUMB_1, scale, func,
+ data);
+ return bg;
+ }
+ return NULL;
+}
+
+Evas_Object *_gl_tile_show_part_label(Evas_Object *obj, int index,
+ bool b_default)
+{
+ GL_CHECK_NULL(obj);
+
+ Evas *evas = evas_object_evas_get(obj);
+ GL_CHECK_NULL(evas);
+ Evas_Object *bg = NULL;
+ bg = evas_object_rectangle_add(evas);
+ GL_CHECK_NULL(bg);
+
+ int j = 0;
+ if (b_default)
+ j = GL_TILE_TEXT_COLOR_CNT;
+ else
+ j = index % GL_TILE_TEXT_COLOR_CNT;
+ evas_object_color_set(bg, bg_color[j].r, bg_color[j].g, bg_color[j].b,
+ GL_TILE_TEXT_COLOR_ALPHA);
+
+ evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bg, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_show(bg);
+ return bg;
+}
+
+Evas_Object *_gl_tile_show_part_checkbox_grid(Evas_Object *obj, bool checked,
+ Evas_Smart_Cb func,
+ const void *data)
+{
+ GL_CHECK_NULL(func);
+ GL_CHECK_NULL(obj);
+ Evas_Object *ck = NULL;
+
+ ck = elm_check_add(obj);
+ GL_CHECK_NULL(ck);
+ elm_object_style_set(ck, GL_CHECKBOX_STYLE_ALBUM_GRID);
+ evas_object_repeat_events_set(ck, EINA_TRUE);
+ elm_check_state_set(ck, checked);
+ evas_object_smart_callback_add(ck, "changed", func, data);
+ evas_object_show(ck);
+ return ck;
+}
+
+Evas_Object *_gl_tile_show_part_checkbox(Evas_Object *obj, bool checked,
+ Evas_Smart_Cb func, const void *data)
+{
+ GL_CHECK_NULL(func);
+ GL_CHECK_NULL(obj);
+ Evas_Object *ck = NULL;
+
+ ck = elm_check_add(obj);
+ GL_CHECK_NULL(ck);
+ elm_object_style_set(ck, GL_CHECKBOX_STYLE_ALBUM);
+ evas_object_propagate_events_set(ck, EINA_FALSE);
+ elm_check_state_set(ck, checked);
+ evas_object_smart_callback_add(ck, "changed", func, data);
+ evas_object_show(ck);
+ return ck;
+}
+
+Evas_Object *_gl_tile_show_part_rename(Evas_Object *obj, Evas_Smart_Cb func,
+ const void *data)
+{
+ GL_CHECK_NULL(func);
+ GL_CHECK_NULL(obj);
+ Evas_Object *btn = NULL;
+ btn = _gl_but_create_but(obj, NULL, NULL, GL_BUTTON_STYLE_RENAME, func,
+ data);
+ GL_CHECK_NULL(btn);
+ evas_object_propagate_events_set(btn, EINA_FALSE);
+ return btn;
+}
+
+int _gl_tile_get_mtime(time_t *mtime1, time_t *mtime2, char *buf, int max_len)
+{
+ char *date1 = (char *)calloc(1, GL_DATE_INFO_LEN_MAX);
+ GL_CHECK_VAL(date1, -1);
+ char *date2 = (char *)calloc(1, GL_DATE_INFO_LEN_MAX);
+ if (date2 == NULL)
+ goto GL_TILE_ERROR;
+ char *date3 = (char *)calloc(1, GL_DATE_INFO_LEN_MAX);
+ if (date3 == NULL)
+ goto GL_TILE_ERROR;
+
+ struct tm t1;
+ memset(&t1, 0x00, sizeof(struct tm));
+ localtime_r(mtime1, &t1);
+ strftime(date1, GL_DATE_INFO_LEN_MAX, "%Y.%m.%d", &t1);
+ strftime(date3, GL_DATE_INFO_LEN_MAX, "%Y.%m", &t1);
+
+ struct tm t2;
+ memset(&t2, 0x00, sizeof(struct tm));
+ localtime_r(mtime2, &t2);
+ strftime(date2, GL_DATE_INFO_LEN_MAX, "%Y.%m.%d", &t2);
+
+ if (!g_strcmp0(date1, date2)) {
+ g_strlcpy(buf, date1, max_len);
+ } else {
+ strftime(date2, GL_DATE_INFO_LEN_MAX, "%Y.%m", &t2);
+ snprintf(buf, max_len, "%s - %s", date2, date3);
+ }
+
+ GL_FREEIF(date1);
+ GL_FREEIF(date2);
+ GL_FREEIF(date3);
+ return 0;
+
+ GL_TILE_ERROR:
+
+ GL_FREEIF(date1);
+ GL_FREEIF(date2);
+ GL_FREEIF(date3);
+ return -1;
+}
+
+Evas_Object *_gl_tile_add_gengrid(void *data, Evas_Object *parent)
+{
+ GL_CHECK_NULL(parent);
+ GL_CHECK_NULL(data);
+ gl_appdata *ad = (gl_appdata *)data;
+
+ Evas_Object *grid = elm_gengrid_add(parent);
+ elm_object_style_set(grid, GL_GENGRID_STYLE_ALBUM);
+
+ double scale_factor = ad->maininfo.win_scale;
+ gl_dbg("Own scale: %f, elm_config_scale_get =%f", scale_factor,
+ elm_config_scale_get());
+ elm_gengrid_item_size_set(grid, (int)(GL_TILE_ITEM_WIDTH * scale_factor),
+ (int)(GL_TILE_ITEM_HEIGHT * scale_factor));
+ elm_gengrid_align_set(grid, 0.5, 0.0);
+
+ /* Vertical scrolling. */
+ elm_gengrid_horizontal_set(grid, EINA_FALSE);
+ elm_scroller_bounce_set(grid, EINA_FALSE, EINA_TRUE);
+
+ elm_gengrid_multi_select_set(grid, EINA_TRUE);
+
+ evas_object_size_hint_weight_set(grid, EVAS_HINT_EXPAND,
+ EVAS_HINT_EXPAND);
+ return grid;
+}
+
--- /dev/null
+<manifest>
+ <request>
+ <domain name="_"/>
+ </request>
+</manifest>
--- /dev/null
+# all permissions
+$1 system::vconf rwxat
+$1 system::home rwxat
+$1 system::media rwxat
+$1 system::homedir rwxat
+$1 pulseaudio rwxat
+$1 system::share rwxat
+$1 sys-assert::core rwxat
+
+# system
+$1 device::app_logging w
+
+# db
+$1 media-data::db rw
+$1 ail::db w
+$1 org.tizen.gallery::web-media.db rw
+$1 org.tizen.gallery::gallery-media.db rw
+
+# other apps and modules
+$1 org.tizen.indicator w
+$1 org.tizen.gallery rwa
+$1 org.tizen.gallery-service w
+$1 org.tizen.contacts rwx
+$1 org.tizen.cluster-home w
+$1 csc-manager x
+$1 media-server rwx
+$1 ug-image-viewer-efl rwx
+$1 download-provider r
+$1 drmfw rw
+
+# ug
+$1 ug.image-viewer-efl include
+
+# object
+org.tizen.cluster-home $1 rx
+org.tizen.app-tray $1 rxorg.tizen.app-tray $1 rx
+
+org.tizen.gallery-service w
+context-service $1 rx
--- /dev/null
+CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
+PROJECT(ug-gallery-efl C)
+
+SET(SRCS src/gallery-efl.c
+ src/ge-albums.c
+ src/ge-gridview.c
+ src/ge-button.c
+ src/ge-debug.c
+ src/ge-ui-util.c
+ src/ge-ext-ug-load.c
+ src/ge-util.c
+ src/ge-drm.c
+ src/ge-data-type.c
+ src/ge-local-data.c
+ src/ge-data.c
+ src/ge-exif.c
+ src/ge-rotate-bg.c
+ src/ge-thumb.c
+ src/ge-tile.c
+ src/ge-lang.c
+)
+
+SET(GE_EDC_DIR edc)
+SET(GE_IMG_DIR edc/images)
+
+IF("${CMAKE_BUILD_TYPE}" STREQUAL "")
+ SET(CMAKE_BUILD_TYPE "Release")
+ENDIF("${CMAKE_BUILD_TYPE}" STREQUAL "")
+MESSAGE("Build type: ${CMAKE_BUILD_TYPE}")
+
+SET(PREFIX ${CMAKE_INSTALL_PREFIX})
+SET(EXEC_PREFIX "\${prefix}")
+SET(LIBDIR "\${prefix}/lib")
+SET(INCLUDEDIR "\${prefix}/include")
+SET(VERSION 1.0)
+
+ADD_DEFINITIONS("-D_USE_DLOG_")
+ADD_DEFINITIONS("-D_USE_ROTATE_BG_GE")
+
+INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include)
+
+INCLUDE(FindPkgConfig)
+pkg_check_modules(pkgs REQUIRED
+ elementary
+ ecore-imf
+ ecore-x
+ eina
+ evas
+ edje
+ vconf
+ ecore
+ ecore-file
+ ecore-input
+ dlog
+ glib-2.0
+ capi-appfw-application
+ capi-content-media-content
+ ui-gadget-1
+ drm-client
+)
+
+FOREACH(flag ${pkgs_CFLAGS})
+ SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}")
+ENDFOREACH(flag)
+
+SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}")
+SET(CMAKE_C_FLAGS_DEBUG "-O0 -g -fpie")
+SET(CMAKE_C_FLAGS_RELEASE "-O2 -fpie")
+SET(CMAKE_LDFLAGS "-Wl,-zdefs" )
+
+FIND_PROGRAM(UNAME NAMES uname)
+EXEC_PROGRAM("${UNAME}" ARGS "-m" OUTPUT_VARIABLE "ARCH")
+IF("${ARCH}" STREQUAL "arm")
+ ADD_DEFINITIONS("-DTARGET")
+ MESSAGE("add -DTARGET")
+ENDIF("${ARCH}" STREQUAL "arm")
+
+SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--as-needed -pie")
+
+ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRCS})
+SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES SOVERSION 0.0.1)
+
+TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${pkgs_LDFLAGS} -lstdc++ )
+
+# EDJE
+ADD_CUSTOM_COMMAND(OUTPUT gallery-efl.edj
+ COMMAND edje_cc -id ${CMAKE_CURRENT_SOURCE_DIR}/res/${GE_IMG_DIR}
+ ${CMAKE_CURRENT_SOURCE_DIR}/res/${GE_EDC_DIR}/gallery-efl.edc
+ ${CMAKE_BINARY_DIR}/gallery-efl.edj
+ DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/res/${GE_EDC_DIR}/gallery-efl.edc
+)
+
+ADD_CUSTOM_TARGET(gallery_efl_edj_build DEPENDS gallery-efl.edj)
+ADD_DEPENDENCIES(${PROJECT_NAME} gallery_efl_edj_build)
+
+INSTALL(FILES ${CMAKE_BINARY_DIR}/gallery-efl.edj DESTINATION /usr/ug/res/edje/gallery-efl)
+
+INSTALL(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/res/images DESTINATION /usr/ug/res/images/gallery-efl)
+INSTALL(TARGETS ${PROJECT_NAME} DESTINATION /usr/ug/lib)
+
+INSTALL(FILES ${PROJECT_NAME}.xml DESTINATION /usr/share/packages)
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __GALLERY_EFL_H__
+#define __GALLERY_EFL_H__
+
+
+#include <glib.h>
+#include <Elementary.h>
+#include <stdio.h>
+#include <string.h>
+#include <ui-gadget-module.h>
+#include <Eina.h>
+#include <Ecore_X.h>
+#include <Ethumb.h>
+#include <app.h>
+#include "ge-data-type.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+#define GE_UG_RES_DIR "/usr/ug/res/"
+#define GE_IMAGES_DIR GE_UG_RES_DIR"images/gallery-efl/images/"
+#define GE_EDJ_DIR GE_UG_RES_DIR"edje/gallery-efl/"
+#define GE_EDJ_FILE GE_EDJ_DIR"gallery-efl.edj"
+
+#define GE_GRP_GRIDVIEW "gallery_efl/gridview"
+#define GE_GRP_ALBUMVIEW "gallery_efl/albumview"
+
+#define GE_CHECKBOX_STYLE_GRID "gallery_efl/grid"
+
+#define GE_ROOT_PATH_PHONE "/opt/usr/media"
+#define GE_ROOT_PATH_MMC "/opt/storage/sdcard"
+
+#define GE_ALBUM_ALL_ID "GALLERY_ALBUM_ALL_ALBUMS_ID"
+/* String length of mtye item id */
+#define GE_MTYPE_ITEN_ID_LEN_MAX 37
+
+#define GE_GRID_ITEM_SIZE_W 178
+#define GE_GRID_ITEM_SIZE_H 182
+
+#define GE_GRID_ITEM_ZOOM_LEVEL_02 2
+#define GE_GRID_ITEM_ZOOM_LEVEL_02_CNT 6
+
+#define GE_ALBUM_COVER_THUMB_NUM 1
+#define GE_ALBUM_COVER_THUMB_NUM_SEC 4 /* Other albums cover have maximum 4 thumbnails */
+#define GE_ALBUM_ITEM_WIDTH 358
+#define GE_ALBUM_ITEM_HEIGHT 360
+
+#define GE_SELINFO_TEXT_LEN_MAX 64
+#define GE_ALBUM_DATE_LEN_MAX 256
+#define GE_MAX_BYTES_FOR_CHAR 3
+#define GE_ALBUM_NAME_LEN_MAX (255 * GE_MAX_BYTES_FOR_CHAR + 1)
+#define GE_NOCONTENTS_LABEL_LEN_MAX 512
+#define GE_FILE_PATH_LEN_MAX (4095 * GE_MAX_BYTES_FOR_CHAR + 1)
+
+#define GE_FIRST_VIEW_START_POS 0
+#define GE_FIRST_VIEW_END_POS 47
+#define GE_GET_UNTIL_LAST_RECORD 65536 /* Fixme: Do not use 65536. */
+#define GE_GET_ALL_RECORDS -1
+
+#define GE_BUNDLE_LAUNCH_TYPE "launch-type"
+#define GE_BUNDLE_FILE_TYPE "file-type"
+#define GE_BUNDLE_DRM_TYPE "drm-type"
+#define GE_BUNDLE_SETAS_TYPE "setas-type"
+#define GE_BUNDLE_CALLERID_SIZE "callerid-size"
+#define GE_BUNDLE_CALLERID_PATH "callerid-path"
+#define GE_BUNDLE_HOMESCREEN_PATH "homescreen-path"
+#define GE_BUNDLE_LOCKSCREEN_PATH "lockscreen-path"
+#define GE_LAUNCH_SELECT_ALBUM "select-album"
+#define GE_ALBUM_SELECT_RETURN_PATH "folder-path"
+#define GE_LAUNCH_SELECT_ONE "select-one"
+#define GE_LAUNCH_SELECT_MULTIPLE "select-multiple"
+#define GE_LAUNCH_SELECT_SETAS "select-setas"
+
+#define GE_FILE_TYPE_IMAGE "image"
+#define GE_FILE_TYPE_VIDEO "video"
+#define GE_FILE_TYPE_ALL "all"
+#define GE_FILE_TYPE_DRM_TRUE "true"
+
+#define GE_SETAS_WALLPAPER "wallpaper"
+#define GE_SETAS_CROP_WALLPAPER "crop-wallpaper"
+#define GE_SETAS_CALLERID "callerid"
+
+#define GE_FILE_SELECT_RETURN_COUNT "count"
+#define GE_FILE_SELECT_RETURN_PATH "path"
+
+#define GE_FILE_SELECT_RETURN_QUIT "ug-quit"
+#define GE_FILE_SELECT_QUIT_STATE "normal"
+
+#define GE_SETAS_CALLERID_CROP_IMAGE_PATH "crop-image-path"
+#define GE_SETAS_IMAGE_PATH "image-path"
+
+/*Image viewer UG service parameters*/
+#define GE_IMAGEVIEWER_CALLERID_SIZE "Area size"
+#define GE_IMAGEVIEWER_CALLERID_PATH "CallerID path"
+
+#define GE_IMAGEVIEWER_CROP_IMAGE_PATH "crop_image_path"
+#define GE_IMAGEVIEWER_IMAGE_PATH "image_path"
+
+#define GE_IMAGEVIEWER_HOMESCREEN_PATH "Wallpaper path"
+#define GE_IMAGEVIEWER_LOCKSCREEN_PATH "Lockscreen path"
+#define GE_IMAGEVIEWER_RETURN_ERROR "Error"
+/*Image viewer UG service parameters-End*/
+
+#define GE_BUNDLE_SELECTION_MODE "http://tizen.org/appcontrol/data/selection_mode"
+#define GE_BUNDLE_SELECTION_MODE_SINGLE "single"
+#define GE_BUNDLE_SELECTION_MODE_MULTI "multiple"
+
+typedef enum {
+ GE_ALBUM_SELECT_T_NONE,
+ GE_ALBUM_SELECT_T_ONE,
+} ge_album_select_e;
+
+typedef enum {
+ GE_FILE_SELECT_T_NONE,
+ GE_FILE_SELECT_T_ONE,
+ GE_FILE_SELECT_T_MULTIPLE,
+ GE_FILE_SELECT_T_SETAS,
+} ge_file_select_e;
+
+typedef enum {
+ GE_SETAS_T_NONE,
+ GE_SETAS_T_WALLPAPER,
+ GE_SETAS_T_CROP_WALLPAPER,
+ GE_SETAS_T_CALLERID,
+} ge_file_select_setas_e;
+
+typedef enum {
+ GE_FILE_T_NONE,
+ GE_FILE_T_IMAGE,
+ GE_FILE_T_VIDEO,
+ GE_FILE_T_ALL,
+} ge_file_type_e;
+
+typedef enum view_by_mode_e {
+ GE_VIEW_ALBUMS,
+ GE_VIEW_THUMBS,
+ GE_VIEW_THUMBS_EDIT,
+} ge_view_mode;
+
+typedef enum {
+ GE_ROTATE_NONE,
+ GE_ROTATE_PORTRAIT,
+ GE_ROTATE_PORTRAIT_UPSIDEDOWN,
+ GE_ROTATE_LANDSCAPE,
+ GE_ROTATE_LANDSCAPE_UPSIDEDOWN,
+} ge_rotate_mode;
+
+typedef enum {
+ GE_UPDATE_NONE,
+ GE_UPDATE_NORMAL,
+ GE_UPDATE_MMC_REMOVED,
+ GE_UPDATE_MMC_ADDED,
+} ge_update_mode;
+
+typedef struct _ge_ugdata ge_ugdata;
+
+typedef struct {
+ ge_album_s *cluster;
+ ge_ugdata *ugd;
+ int index;
+
+ time_t item_mtime;
+ Elm_Object_Item *griditem;
+ void *_reserved;
+}ge_cluster;
+
+typedef struct {
+ Eina_List* clist;
+}ge_cluster_list;
+
+typedef struct _ge_item {
+ ge_media_s* item;
+ ge_ugdata* ugd;
+ Elm_Object_Item *elm_item;
+ Evas_Object* check_obj;
+ bool checked;
+
+ void* _reserved;
+}ge_item;
+
+struct _ge_ugdata {
+ Evas_Object *win;
+ double win_scale;
+ Evas_Object *ly_main;
+ Evas_Object *bg;
+ Elm_Theme *th;
+ /* add more variables here */
+ Evas_Object *navi_bar;
+ Evas_Object *albums_view;
+ Evas_Object *albums_view_ly;
+ Evas_Object *thumbs_view;
+ Evas_Object *thumbs_view_ly;
+ Elm_Object_Item *thumbs_nf_it;
+ Elm_Object_Item *albums_nf_it;
+ Evas_Object *thumbs_nocontents;
+ Ecore_Idler* grid_append_idler;
+ Evas_Object *nocontents;
+ Ecore_Event_Handler* event_handler;
+ Evas_Object *popup;
+ Ecore_Timer *del_timer;
+ int popup_mode;
+
+ ge_cluster_list* cluster_list;
+ ui_gadget_h ug_called_by_me;
+ ui_gadget_h ug;
+ service_h service; /*added for "ug_send_result"*/
+ /* It's thumbnails icon size, not grid item size */
+ int icon_size;
+ Ecore_Timer *thumbs_clicked_timer;
+
+ int album_select_mode;
+ int file_select_mode;
+ int file_type_mode;
+ int file_select_setas_mode;
+ bool b_show_drm;
+ char* file_setas_callid_size;
+ char* file_setas_callid_path;
+ char* file_setas_image_path;
+ char* file_setas_crop_image_path;
+ char albums_view_title[GE_ALBUM_NAME_LEN_MAX];
+ char* file_setas_homescreen_path;
+ char* file_setas_lockscreen_path;
+
+ Evas_Object *selinfo_ly;
+
+ bool b_inited_view; /* true: show albums view; false: show popup */
+};
+
+#define GE_IF_DEL_TIMER(timer) if(timer){ecore_timer_del(timer); timer = NULL;}
+#define GE_IF_DEL_IDLER(idler) if(idler){ecore_idler_del(idler); idler = NULL;}
+#define GE_IF_DEL_OBJ(obj) if(obj){evas_object_del(obj); obj = NULL;}
+
+ge_view_mode _ge_get_view_mode(void);
+void _ge_set_view_mode(ge_view_mode mode);
+
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+
+#endif /* __GALLERY_EFL_H__ */
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _GE_ALBUMS_H_
+#define _GE_ALBUMS_H_
+
+#include "gallery-efl.h"
+
+Evas_Object* ge_albums_create_view(ge_ugdata *ugd, Evas_Object* parent);
+int ge_albums_sel_album(ge_cluster* album_item);
+int ge_albums_update_view(ge_ugdata *ugd);
+Evas_Object* ge_albums_create_ly(Evas_Object* parent);
+int ge_albums_back_to_view(ge_ugdata *ugd);
+int ge_albums_del_callbacks(ge_ugdata *ugd);
+int ge_albums_free_cover_thumbs(ge_ugdata *ugd);
+
+#endif /* _GE_ALBUMS_H_ */
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _GE_BUTTON_H_
+#define _GE_BUTTON_H_
+
+#include "gallery-efl.h"
+
+/**< Evas smart objects' "smart callback" function signature */
+typedef void (*But_Smart_Cb) (void *data, Evas_Object *obj, void *event_info);
+
+Evas_Object *_ge_but_create_but(Evas_Object *parent, Elm_Theme *theme,
+ const char *icon, const char *text,
+ const char *style, But_Smart_Cb cb_func,
+ const void *data);
+
+#endif /* _GE_BUTTON_H_ */
+
--- /dev/null
+/*\r
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd\r
+ *\r
+ * Licensed under the Flora License, Version 1.1 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://floralicense.org/license/\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+#ifndef _GE_TYPE_H_\r
+#define _GE_TYPE_H_\r
+\r
+#include <stdlib.h>\r
+#include <eina_list.h>\r
+#include <media_content_type.h>\r
+#include <media_filter.h>\r
+#include <media_image.h>\r
+#include <media_video.h>\r
+#include <media_info.h>\r
+#include <media_folder.h>\r
+#include <media_tag.h>\r
+\r
+#define GE_FREEIF(ptr) \\r
+ do { \\r
+ if(ptr != NULL) \\r
+ { \\r
+ free(ptr); \\r
+ ptr = NULL; \\r
+ } \\r
+ } while (0)\r
+\r
+#define GE_FREE(ptr) \\r
+ do { \\r
+ free(ptr); \\r
+ ptr = NULL; \\r
+ } while (0)\r
+\r
+#define GE_TYPE_ALBUM (0x55551)\r
+#define GE_TYPE_MEDIA (0x55553)\r
+\r
+typedef enum\r
+{\r
+ GE_PHONE, /**< Stored only in phone */\r
+ GE_MMC, /**< Stored only in MMC */\r
+ GE_SYSTEM, /**< Stored in ALL*/\r
+} _ge_store_type_t;\r
+\r
+\r
+typedef struct _ge_album_t ge_album_s;\r
+typedef struct _ge_media_t ge_media_s;\r
+typedef struct _ge_image_t ge_image_s;\r
+typedef struct _ge_video_t ge_video_s;\r
+\r
+struct _ge_album_t {\r
+ int gtype; /*self-defination type, when free this struct space, use it*/\r
+ media_folder_h folder_h; /*the handle of operating this folder*/\r
+ char *uuid; /*folder UUID*/\r
+ char *display_name; /*album name*/\r
+ char *path; /*the full path of this folder*/\r
+ int type; /*storage type*/\r
+ time_t mtime; /*modified time*/\r
+ int count; /*the media count in this folder*/\r
+ char *thumb_url; /**< thumbnail full path */\r
+\r
+ void *_reserved; /*reserved*/\r
+};\r
+\r
+struct _ge_media_t {\r
+ int gtype; /*self-defination type, when free this struct space, use it*/\r
+ media_info_h media_h; /*the handle of operating this media*/\r
+ char *uuid; /*meida id*/\r
+ int type; /*meida type, image or video*/\r
+ char *thumb_url; /*the thumbnail full path of this meida file*/\r
+ char *file_url; /*the full path of this meida file*/\r
+ time_t mtime; /*modified time*/\r
+ char *album_uuid; /*folder UUID*/\r
+ char *display_name; /*item name*/\r
+ bool favorite; /*favorite level*/\r
+ union {\r
+ ge_image_s *image_info; /*image information*/\r
+ ge_video_s *video_info; /*video information*/\r
+ };\r
+ void *_reserved; /*reserved*/\r
+};\r
+\r
+struct _ge_image_t {\r
+ char *media_uuid; /*media uuid*/\r
+ image_meta_h image_h; /*the handle of operating this image*/\r
+ media_content_orientation_e orientation; /*the orientation of this image*/\r
+ void *_reserved; /*reserved*/\r
+};\r
+\r
+struct _ge_video_t {\r
+ char *media_uuid; /*media uuid*/\r
+ video_meta_h video_h; /*the handle of operating this video*/\r
+ char *title; /*the title of video*/\r
+ time_t last_played_pos; /*the last played position*/\r
+ int duration; /*the duration of this video*/\r
+ int bookmarks; /*whether exist bookmarks*/\r
+ void *_reserved; /*reserved*/\r
+};\r
+\r
+int _ge_data_type_new_media(ge_media_s **item);\r
+int _ge_data_type_new_album(ge_album_s **album);\r
+\r
+int _ge_data_type_free_media_list(Eina_List **list);\r
+int _ge_data_type_free_album_list(Eina_List **list);\r
+int _ge_data_type_free_geitem(void **item);\r
+\r
+#endif\r
+\r
--- /dev/null
+/*\r
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd\r
+ *\r
+ * Licensed under the Flora License, Version 1.1 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://floralicense.org/license/\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+#ifndef _GE_DB_HANDLER_H_\r
+#define _GE_DB_HANDLER_H_\r
+\r
+#include "ge-local-data.h"\r
+#include "gallery-efl.h"\r
+\r
+#ifdef _cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+typedef enum {\r
+ GE_SORT_BY_NONE, /**< No Sort */\r
+ GE_SORT_BY_NAME_DESC, /**< Sort by display name descending */\r
+ GE_SORT_BY_NAME_ASC, /**< Sort by display name ascending */\r
+ GE_SORT_BY_DATE_DESC, /**< Sort by modified_date descending */\r
+ GE_SORT_BY_DATE_ASC, /**< Sort by modified_date ascending */\r
+} ge_sort_type_e;\r
+\r
+int _ge_data_update_items_cnt(ge_ugdata* ugd, ge_cluster *album);\r
+int _ge_data_get_clusters_list(ge_ugdata* ugd);\r
+int _ge_data_free_items_list(void);\r
+int _ge_data_get_items_list(ge_ugdata* ugd, ge_cluster *album, int start_pos,\r
+ int end_pos);\r
+int _ge_data_update_items_list(ge_ugdata* ugd, ge_cluster *album);\r
+int _ge_data_get_first_several_items(ge_ugdata* ugd, ge_cluster *album,\r
+ ge_item* items[], int *item_count,\r
+ media_content_order_e sort_type);\r
+int _ge_data_del_media_id(ge_ugdata* ugd, const char *media_id);\r
+int _ge_data_item_list_remove(ge_item* gitem);\r
+int _ge_data_destroy_item(ge_item* gitem);\r
+int _ge_data_get_item_by_index(ge_item** gitem, int idx);\r
+int _ge_data_get_count_all(void);\r
+int _ge_data_get_selected_item_by_index(ge_item** gitem, int idx);\r
+int _ge_data_selected_list_count(void);\r
+Eina_List* _ge_data_get_selected_list(void);\r
+int _ge_data_selected_list_append(ge_item* gitem);\r
+int _ge_data_selected_list_remove(ge_item* gitem);\r
+int _ge_data_selected_list_finalize(void);\r
+bool _ge_data_is_default_album(const char *match_folder, ge_album_s *mcluster);\r
+bool _ge_data_is_root_path(const char *path);\r
+int _ge_data_create_thumb(ge_item *gitem, media_thumbnail_completed_cb callback,\r
+ void *user_data);\r
+int _ge_data_init(ge_ugdata* ugd);\r
+int _ge_data_finalize(ge_ugdata* ugd);\r
+\r
+#ifdef _cplusplus\r
+}\r
+#endif\r
+#endif /* _GE_DB_HANDLER_H_ */\r
+\r
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _GL_DEBUG_H_
+#define _GL_DEBUG_H_
+
+#include <dlog.h>
+
+#ifdef _cplusplus
+extern "C" {
+#endif
+
+#ifdef LOG_TAG
+#undef LOG_TAG
+#endif
+
+#define LOG_TAG "GALLERY-EFL"
+
+typedef enum {
+ DEBUG_CRITICAL,
+ DEBUG_CHECK,
+ MB_DEBUG_LOG,
+ DEBUG_MAX
+} GlDebugType;
+
+/* anci c color type */
+#define FONT_COLOR_RESET "\033[0m"
+#define FONT_COLOR_RED "\033[31m"
+#define FONT_COLOR_GREEN "\033[32m"
+#define FONT_COLOR_YELLOW "\033[33m"
+#define FONT_COLOR_BLUE "\033[34m"
+#define FONT_COLOR_PURPLE "\033[35m"
+#define FONT_COLOR_CYAN "\033[36m"
+#define FONT_COLOR_GRAY "\033[37m"
+
+#ifdef _USE_LOG_FILE_
+FILE* g_log_fp;
+#endif // _USE_LOG_FILE_
+
+#ifdef _USE_LOG_FILE_
+
+#define ge_dbg(fmt,arg...) fprintf(g_log_fp, "[%s: %d]" fmt "\n", __FUNCTION__, __LINE__, ##arg)
+
+#elif defined _USE_DLOG_
+
+#define ge_dbg(fmt, arg...) LOGD("[%s : %d] " fmt "\n", __FUNCTION__, __LINE__, ##arg)
+#define ge_dbgW(fmt, arg...) LOGW(FONT_COLOR_GREEN"[%s : %d] " fmt "\n"FONT_COLOR_RESET, __FUNCTION__, __LINE__, ##arg)
+#define ge_dbgE(fmt, arg...) LOGE(FONT_COLOR_RED"[%s : %d] " fmt "\n"FONT_COLOR_RESET, __FUNCTION__, __LINE__, ##arg)
+
+#elif defined _USE_LOG_CONSOLE_
+
+#define ge_dbg(fmt,arg...) fprintf(stdout, "[%s: %d] [%s]" fmt "\n", __FILE__, __LINE__, __FUNCTION__, ##arg)
+#define ge_dbgW(fmt, arg...) fprintf(stdout, "[%s : %d] [%s] " fmt "\n", __FILE__, __LINE__, __FUNCTION__, ##arg)
+#define ge_dbgE(fmt, arg...) fprintf(stdout, "[%s : %d] [%s] " fmt "\n", __FILE__, __LINE__, __FUNCTION__, ##arg)
+
+#else
+
+#define ge_dbg(fmt,arg...)
+#define ge_dbgW(fmt, arg...)
+#define ge_dbgE(fmt, arg...)
+#endif
+
+#define ge_warn_if(expr, fmt, arg...) do { \
+ if(expr) { \
+ ge_dbg("(%s) -> "fmt, #expr, ##arg); \
+ } \
+ } while (0)
+#define ge_ret_if(expr) do { \
+ if(expr) { \
+ ge_dbgE("(%s) -> %s() return", #expr, __FUNCTION__); \
+ return; \
+ } \
+ } while (0)
+#define ge_retv_if(expr, val) do { \
+ if(expr) { \
+ ge_dbgE("(%s) -> %s() return", #expr, __FUNCTION__); \
+ return (val); \
+ } \
+ } while (0)
+#define ge_retm_if(expr, fmt, arg...) do { \
+ if(expr) { \
+ ge_dbgE(fmt, ##arg); \
+ ge_dbgE("(%s) -> %s() return", #expr, __FUNCTION__); \
+ return; \
+ } \
+ } while (0)
+#define ge_retvm_if(expr, val, fmt, arg...) do { \
+ if(expr) { \
+ ge_dbgE(fmt, ##arg); \
+ ge_dbgE("(%s) -> %s() return", #expr, __FUNCTION__); \
+ return (val); \
+ } \
+ } while (0)
+
+
+#define GE_CHECK_VAL(expr, val) ge_retvm_if(!(expr), val, "Invalid parameter, return ERROR code!")
+#define GE_CHECK_NULL(expr) ge_retvm_if(!(expr), NULL, "Invalid parameter, return NULL!")
+#define GE_CHECK_FALSE(expr) ge_retvm_if(!(expr), false, "Invalid parameter, return FALSE!")
+#define GE_CHECK_CANCEL(expr) ge_retvm_if(!(expr), ECORE_CALLBACK_CANCEL, "Invalid parameter, return ECORE_CALLBACK_CANCEL!")
+#define GE_CHECK(expr) ge_retm_if(!(expr), "Invalid parameter, return!")
+
+
+#include <time.h>
+#include <sys/time.h>
+
+void _ge_print_debug_time_ex(long start, long end, const char* func_name, char* time_string);
+
+#ifdef _cplusplus
+}
+#endif
+
+#endif /* _GL_DEBUG_H_ */
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _GE_DRM_H_
+#define _GE_DRM_H_
+
+#include <drm_client.h>
+#include <drm_client_types.h>
+
+Eina_Bool ge_drm_check_valid_ro(const char *file_path,
+ drm_permission_type_e permType);
+char* ge_drm_get_file_path(void *item);
+Eina_Bool ge_drm_is_drm_file(const char* file_path);
+int ge_drm_get_permtype(int gitem_type);
+
+#endif /* _GE_DRM_H_ */
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifdef _USE_ROTATE_BG_GE
+
+#ifndef _GE_EXIF_H_
+#define _GE_EXIF_H_
+
+#include <stdbool.h>
+#include <stdio.h>
+
+#ifdef _cplusplus
+extern "C"
+{
+#endif
+
+/*
+Orientation - angle
+1 - 0
+3 - 180
+6 - 90
+8 - 270
+*/
+typedef enum _GE_orientation_rot_t ge_orientation_rot_e;
+
+enum _GE_orientation_rot_t {
+ GE_ORIENTATION_ROT_ERR = 0,
+ GE_ORIENTATION_ROT_0 = 1,
+ GE_ORIENTATION_ROT_180 = 3,
+ GE_ORIENTATION_ROT_90 = 6,
+ GE_ORIENTATION_ROT_270 = 8,
+};
+
+int _ge_exif_get_orientation(char *file_path, unsigned int *orientation);
+
+#ifdef _cplusplus
+}
+#endif
+
+#endif /* _GE_EXIF_H_ */
+
+#endif
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _GE_EXT_UG_LOAD_H_
+#define _GE_EXT_UG_LOAD_H_
+
+#include <ui-gadget.h>
+#include "gallery-efl.h"
+
+
+int ge_ext_load_pw_ug(ge_ugdata *ugd, ge_cluster* album_item);
+int ge_ext_load_iv_ug(ge_ugdata* ugd);
+
+#endif /* _GE_EXT_UG_LOAD_H_ */
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _GE_GRIDVIEW_H_
+#define _GE_GRIDVIEW_H_
+
+#include "gallery-efl.h"
+
+Evas_Object* ge_grid_create_ly(Evas_Object* parent);
+Evas_Object* ge_grid_create_view(ge_ugdata* ugd, Evas_Object* parent);
+int ge_grid_clear_view(ge_ugdata *ugd);
+int ge_grid_update_view(ge_ugdata *ugd);
+int ge_grid_del_callbacks(ge_ugdata *ugd);
+int ge_grid_idler_append_thumbs(void* data);
+
+#endif /* _GE_GRIDVIEW_H_ */
--- /dev/null
+/*\r
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd\r
+ *\r
+ * Licensed under the Flora License, Version 1.1 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://floralicense.org/license/\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+#ifndef __GE_ICON_H__\r
+#define __GE_ICON_H__\r
+\r
+#include "gallery-efl.h"\r
+\r
+#define GE_THUMB_FAVOR_ICON GE_IMAGES_DIR"T01_icon_thumbnail_favorite.png"\r
+\r
+#define GE_LOCK_ICON GE_IMAGES_DIR"T01_icon_lock.png"\r
+#define GE_THUMB_BOOKMARK GE_IMAGES_DIR"T01_icon_thumbnail_bookmark.png"\r
+#define GE_DEFAULT_THUMB_ICON GE_IMAGES_DIR"T01_Nocontents_broken.png"\r
+#define GE_CBAR_ICON_DONE GE_IMAGES_DIR"T01_controlbar_icon_done.png"\r
+#define GE_DB_DEFAULT_THUMB "/opt/usr/data/file-manager-service/.thumb/thumb_default.png"\r
+\r
+#endif\r
+\r
--- /dev/null
+/*\r
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd\r
+ *\r
+ * Licensed under the Flora License, Version 1.1 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://floralicense.org/license/\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+#ifndef _GE_LANG_H_\r
+#define _GE_LANG_H_\r
+\r
+#include "gallery-efl.h"\r
+\r
+#ifdef _cplusplus\r
+extern "C"\r
+{\r
+#endif\r
+\r
+int _ge_lang_update(ge_ugdata *ugd);\r
+\r
+#ifdef _cplusplus\r
+}\r
+#endif\r
+\r
+\r
+#endif\r
+\r
--- /dev/null
+/*\r
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd\r
+ *\r
+ * Licensed under the Flora License, Version 1.1 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://floralicense.org/license/\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+#ifndef _GE_LOCAL_DATA_H_\r
+#define _GE_LOCAL_DATA_H_\r
+\r
+#include "ge-data-type.h"\r
+\r
+/*MEDIA_TYPE 0-image, 1-video, 2-sound, 3-music*/\r
+#define GE_CONDITION_IMAGE_VIDEO "(MEDIA_TYPE=0 OR MEDIA_TYPE=1)"\r
+#define GE_CONDITION_IMAGE "(MEDIA_TYPE=0)"\r
+#define GE_CONDITION_VIDEO "(MEDIA_TYPE=1)"\r
+/**< 0-not favourite, 1-favourite*/\r
+#define GE_CONDITION_FAV_IMAGE_VIDEO "((MEDIA_TYPE=0 OR MEDIA_TYPE=1) AND MEDIA_FAVORITE=1)"\r
+\r
+#define GE_CONDITION_DRM " AND "MEDIA_IS_DRM"=0"\r
+\r
+#define CONDITION_LENGTH 200\r
+#define KEYWORD_LENGTH 20\r
+\r
+typedef struct _ge_filter_t ge_filter_s;\r
+\r
+struct _ge_filter_t {\r
+ char cond[CONDITION_LENGTH]; /*set media type or favorite type, or other query statement*/\r
+ media_content_collation_e collate_type; /*collate type*/\r
+ media_content_order_e sort_type; /*sort type*/\r
+ char sort_keyword[KEYWORD_LENGTH]; /*sort keyword*/\r
+ int offset; /*offset*/\r
+ int count; /*count*/\r
+ bool with_meta; /*whether get image or video info*/\r
+};\r
+\r
+int _ge_local_data_connect(void);\r
+int _ge_local_data_disconnect(void);\r
+int _ge_local_data_get_album_list(ge_filter_s *condition, Eina_List **elilst);\r
+int _ge_local_data_get_media_count(const char *cluster_id, ge_filter_s *filter,\r
+ int *item_cnt);\r
+int _ge_local_data_get_all_media_count(ge_filter_s *filter, int *item_cnt);\r
+int _ge_local_data_get_media(const char *media_id, ge_media_s **mitem);\r
+int _ge_local_data_get_album_media_list(char *album_id, ge_filter_s *condition,\r
+ Eina_List **elist);\r
+int _ge_local_data_get_all_albums_media_list(ge_filter_s *condition,\r
+ Eina_List **elist);\r
+\r
+#endif\r
+\r
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifdef _USE_ROTATE_BG_GE
+
+#ifndef _GE_ROTATE_BG_H_
+#define _GE_ROTATE_BG_H_
+
+#include "gallery-efl.h"
+
+Evas_Object *_ge_rotate_bg_add(Evas_Object *parent);
+int _ge_rotate_bg_set_file(Evas_Object *bg, const char *file, int w, int h);
+int _ge_rotate_bg_rotate_image(Evas_Object *bg, unsigned int orient);
+int _ge_rotate_bg_add_image(Evas_Object *bg, int w, int h);
+int _ge_rotate_bg_set_image_file(Evas_Object *bg, const char *file);
+
+#endif
+
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _GE_STRINGS_H_
+#define _GE_STRINGS_H_
+
+#ifdef _cplusplus
+extern "C" {
+#endif
+
+#define _GE_GETSYSTEMSTR(ID) dgettext("sys_string", (ID))
+#define _GE_GETLOCALSTR(ID) dgettext("ug-gallery-efl", (ID))
+/* hard code strings */
+#define GE_ALBUM_CAMERA_NAME _("Camera")
+#define GE_ALBUM_DOWNLOAD_NAME _("Downloads")
+#define GE_TITLE_CHANGE_CALLER_ID _("Change caller ID")
+#define GE_POPUP_ONLY_SUPPORT_IMAGE _("Only image is supported!")
+
+#define GE_STR_CAMERA _GE_GETSYSTEMSTR("IDS_COM_BODY_CAMERA")
+#define GE_STR_DOWNLOADS _GE_GETSYSTEMSTR("IDS_COM_BODY_DOWNLOADS")
+
+#define GE_ALBUM_ALL_NAME _GE_GETLOCALSTR("IDS_MEDIABR_BODY_ALL_ALBUMS")
+#define GE_LABEL_NO_ALBUMS _GE_GETLOCALSTR("IDS_MEDIABR_BODY_NO_ALBUMS")
+#define GE_ALBUM_ROOT_NAME _GE_GETLOCALSTR("IDS_MEDIABR_POP_NO_NAME")
+
+/* system strings which are included in sys-string-0 po files */
+#define GE_TITLE_ADD _GE_GETSYSTEMSTR("IDS_COM_SK_ADD")
+#define GE_TITLE_ALBUMS _GE_GETSYSTEMSTR("IDS_COM_BODY_ALBUMS")
+#define GE_TITLE_IMAGE _GE_GETSYSTEMSTR("IDS_COM_OPT_IMAGE")
+#define GE_TITLE_FILE _GE_GETSYSTEMSTR("IDS_COM_POP_FILE")
+#define GE_TITLE_IMAGES _GE_GETSYSTEMSTR("IDS_COM_BODY_IMAGES")
+#define GE_TITLE_VIDEOS _GE_GETSYSTEMSTR("IDS_COM_BODY_VIDEOS")
+#define GE_TITLE_FILES _GE_GETSYSTEMSTR("IDS_COM_OPT_FILES")
+#define GE_TITLE_CHANGE_WALLPAPER _GE_GETSYSTEMSTR("IDS_COM_HEADER_CHANGE_WALLPAPER")
+#define GE_TITLE_VIDEO _GE_GETSYSTEMSTR("IDS_COM_BODY_VIDEO")
+#define GE_LABEL_NO_VIDEOS _GE_GETSYSTEMSTR("IDS_COM_BODY_NO_VIDEOS")
+#define GE_SELINFO_SELECTED _GE_GETSYSTEMSTR("IDS_COM_POP_SELECTED")
+#define GE_POPUP_NO_FILES_SELECTED _GE_GETSYSTEMSTR("IDS_COM_POP_NO_FILES_SELECTED")
+#define GE_STR_OK _GE_GETSYSTEMSTR("IDS_COM_SK_OK")
+#define GE_STR_CANCEL _GE_GETSYSTEMSTR("IDS_COM_SK_CANCEL")
+#define GE_STR_DONE _GE_GETSYSTEMSTR("IDS_COM_SK_DONE")
+
+#ifdef _cplusplus
+}
+#endif
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _GE_THUMB_H_
+#define _GE_THUMB_H_
+
+Evas_Object *_ge_thumb_show_part_icon_image(Evas_Object *obj, char *path,
+ unsigned int orient, bool b_favor,
+ bool is_expired_drm, int item_size);
+
+Evas_Object *_ge_thumb_show_part_icon_video(Evas_Object *obj, char *path,
+ unsigned int v_dur, int bk_len,
+ bool b_favor, bool is_expired_drm,
+ int item_size);
+#endif
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _GE_TILE_H_
+#define _GE_TILE_H_
+
+#include "ge-data.h"
+
+#define GE_TILE_THUMB_1 1
+
+#define GT_TILE_ONLYICON "elm.swallow.onlyicon"
+#define GT_TILE_ICON "elm.swallow.icon"
+#define GT_TILE_LABEL "label_bg"
+
+/* Size of album icon */
+#define GE_TILE_SIZE 318
+/* Size of table padding */
+#define GE_TILE_PAD 3
+/* Pure size of album icon; value: 196 */
+#define GE_TILER_ICON_S (GE_TILE_SIZE - 2 * GE_TILE_PAD)
+/**
+* Album icon is set by elm_table,
+* it's divided into 3x3, 9 grids, each grid size is 64
+*/
+#define GE_TILE_GRID_S 102
+/* value: 130 */
+#define GE_TILE_2X_GRID_S (GE_TILER_ICON_S - GE_TILE_GRID_S - GE_TILE_PAD)
+
+typedef enum
+{
+ GE_ICON_NORMAL,
+ GE_ICON_EXPIRED_DRM,
+ GE_ICON_CORRUPTED_FILE
+}ge_icon_type;
+
+typedef ge_icon_type (*bg_file_set_cb)(Evas_Object *bg, void *data);
+
+Evas_Object *_ge_tile_show_part_icon(Evas_Object *obj, const char *part,
+ int length, double scale,
+ bg_file_set_cb func, void **data);
+Evas_Object *_ge_tile_show_part_label(Evas_Object *obj, int index,
+ bool b_default);
+
+#endif
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _GE_UI_UTIL_H_
+#define _GE_UI_UTIL_H_
+
+#include "gallery-efl.h"
+#include "ge-icon.h"
+
+#ifdef _cplusplus
+extern "C" {
+#endif
+
+#define _EDJ(o) elm_layout_edje_get(o)
+
+#define _GE_GET_ICON(_path) \
+ ((1 == ecore_file_exists(_path) && (ecore_file_size(_path) > 0)) ? _path : GE_DEFAULT_THUMB_ICON)
+
+typedef enum {
+ GE_NAVI_ALBUMS,
+ GE_NAVI_THUMBS,
+} ge_navi_mode_e;
+
+typedef enum {
+ GE_POPUP_NOBUT,
+ GE_POPUP_ONEBUT,
+ GE_POPUP_TWOBUT,
+ GE_POPUP_EXIT,
+} ge_popup_mode_e;
+
+int ge_ui_cancel_album_lock(ge_ugdata *ugd);
+int ge_ui_set_album_lock(ge_cluster* album);
+Evas_Object* ge_ui_create_navibar(ge_ugdata* ugd, Evas_Object* parent);
+Evas_Object* ge_ui_create_main_ly(ge_ugdata* ugd, Evas_Object* parent);
+int ge_ui_create_title_and_push(ge_ugdata *ugd, Evas_Object* parent,
+ Evas_Object* obj, ge_navi_mode_e mode,
+ char* title);
+void ge_ui_set_rotate_angle(int rotate_mode);
+Evas_Object* ge_ui_load_edj(Evas_Object *parent, const char *file, const char *group);
+Evas_Object* ge_ui_create_nocontents(ge_ugdata* ugd);
+int ge_ui_lock_albums(ge_cluster* album_item);
+Evas_Object* ge_ui_create_popup(ge_ugdata* ugd, ge_popup_mode_e mode,
+ char* desc);
+int _ge_ui_create_selinfo(ge_ugdata *ugd, Evas_Object *parent);
+int ge_ui_destroy_selinfo(ge_ugdata* ugd);
+char* _ge_ui_get_translated_album_name(ge_cluster *album);
+
+#ifdef _cplusplus
+}
+#endif
+
+#endif // end of _GE_UI_UTIL_H_
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef _GE_UTIL_H_
+#define _GE_UTIL_H_
+
+#include "gallery-efl.h"
+
+#define GE_FILE_EXISTS(path) \
+ (path && (1 == ecore_file_exists(path)) && (ecore_file_size(path) > 0))
+
+ge_item* _ge_get_current_item(void);
+void _ge_set_current_item(ge_item* gitem);
+int ge_reg_db_update_noti(ge_ugdata* ugd);
+int ge_dereg_db_update_noti(void);
+Eina_Bool ge_update_view(ge_ugdata* ugd, int mode);
+int _ge_ug_iv_get(void);
+void _ge_ug_iv_set(int ug_iv_state);
+ge_cluster* _ge_get_current_album(void);
+void _ge_set_current_album(ge_cluster* album_item);
+bool _ge_is_image_valid(void *data, char *filepath);
+char *_ge_get_duration_string(unsigned int v_dur);
+#endif /* _GE_EXT_EXEC_H_ */
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define CHECK_STYLE_DEFAULT_BG_NORMAL_MIN_MAX_INC 42 42
+
+#define CHECK_DEFAULT_TEXT_NORMAL_COLOR_INC 255 255 255 255
+#define CHECK_DEFAULT_TEXT_PRESSED_COLOR_INC 255 255 255 255
+#define CHECK_DEFAULT_TEXT_DISABLED_COLOR_INC 136 136 136 136
+
+////////////////////////////////////////////////////////////////////////////////////////
+//
+// check default textblock style
+//
+///////////////////////////////////////////////////////////////////////////////////////
+ styles {
+ style { name: "check_label_textblock_style";
+ base: "font=SLP:style=Roman text_class=slp font_size=32 color=#ffffff wrap=char";
+ tag: "br" "\n";
+ tag: "ps" "ps";
+ tag: "hilight" "+ font=SLP:style=Bold text_class=slp";
+ tag: "b" "+ font=SLP:style=Bold text_class=slp";
+ tag: "whitecolor" "+ color=#ffffff";
+ tag: "tab" "\t";
+ }
+ }
+
+#define CHECK_STATE_DEFAULT 0
+#define CHECK_STATE_VISIBLE 1
+#define CHECK_STATE_DISABLED_VISIBLE 2
+#define CHECK_STATE_DISABLED 3
+
+////////////////////////////////////////////////////////////////////////////////
+#define CHECK_STYLE_GRID(style_name, image_grid, width, height) \
+ group { name: "elm/check/base/"style_name; \
+ images.image: image_grid COMP; \
+ parts { \
+ part { name: "bg"; \
+ type: RECT; \
+ scale: 1; \
+ description { state: "default" 0.0; \
+ color: 0 0 0 0; \
+ } \
+ description { state: "pressed" 0.0; \
+ inherit: "default" 0.0; \
+ } \
+ description { state: "disabled" 0.0; \
+ inherit: "default" 0.0; \
+ visible: 0; \
+ } \
+ } \
+ part { name: "icon_bg_img"; \
+ type: RECT; \
+ mouse_events: 0; \
+ scale : 1; \
+ description { \
+ color: 0 0 0 0; \
+ rel1 { relative: GAP_W/W (GAP_H+1)/H;} \
+ rel2 { relative: (W-GAP_W)/W 1;} \
+ } \
+ } \
+ part { name: "icon_bg"; \
+ type: RECT; \
+ description { state: "default" 0.0; \
+ color: 0 0 0 0; \
+ rel1 { relative: 0 0; to: "icon_bg_img"; } \
+ rel2 { relative: 1 1; to: "icon_bg_img"; } \
+ } \
+ } \
+ part { name: "bg2"; \
+ type: RECT; \
+ mouse_events: 0; \
+ scale: 1; \
+ description { state: "default" 0.0; \
+ rel1.to: "icon_bg"; \
+ rel2.to: "icon_bg"; \
+ align: 0.5 0.5; \
+ min: width height; \
+ max: width height; \
+ color: 0 0 0 0; \
+ } \
+ description { state: "pressed" 0.0; \
+ inherit: "default" 0.0; \
+ } \
+ description { state: "disabled" 0.0; \
+ inherit: "default" 0.0; \
+ visible: 0; \
+ } \
+ } \
+ part { name: "selected_bg"; \
+ type: RECT; \
+ scale: 1; \
+ description { state: "default" 0.0; \
+ rel1.to: "icon_bg"; \
+ rel2.to: "icon_bg"; \
+ color: 0 0 0 0; \
+ visible: 0; \
+ } \
+ description { state: "visible" 0.0; \
+ inherit: "default" 0.0; \
+ color: 0 0 0 153; \
+ visible: 1; \
+ } \
+ } \
+ part { name: "check"; \
+ mouse_events: 0; \
+ scale: 1; \
+ description { state: "default" 0.0; \
+ rel1.to: "bg2"; \
+ rel2.to: "bg2"; \
+ visible: 0; \
+ image.normal: image_grid; \
+ } \
+ description { state: "visible" 0.0; \
+ inherit: "default" 0.0; \
+ visible: 1; \
+ } \
+ description { state: "pressed" 0.0; \
+ inherit: "default" 0.0; \
+ visible: 1; \
+ } \
+ description { state: "disabled_visible" 0.0; \
+ inherit: "default" 0.0; \
+ visible: 1; \
+ } \
+ } \
+ part { name: "elm.swallow.content"; \
+ type: SWALLOW; \
+ description { \
+ state: "default" 0.0; \
+ fixed: 1 0; \
+ visible: 0; \
+ color: 255 255 255 255; \
+ align: 0.0 0.5; \
+ rel1 { \
+ to_x: "bg2"; \
+ relative: 1.0 0.0; \
+ offset: 1 1; \
+ } \
+ rel2 { \
+ to_x: "bg2"; \
+ relative: 1.0 1.0; \
+ offset: 2 -2; \
+ } \
+ } \
+ description { state: "visible" 0.0; \
+ inherit: "default" 0.0; \
+ fixed: 1 1; \
+ visible: 1; \
+ aspect: 1.0 1.0; \
+ aspect_preference: VERTICAL; \
+ } \
+ description { state: "disabled" 0.0; \
+ inherit: "default" 0.0; \
+ color: 128 128 128 128; \
+ } \
+ description { state: "disabled_visible" 0.0; \
+ inherit: "default" 0.0; \
+ color: 128 128 128 128; \
+ fixed: 1 1; \
+ visible: 1; \
+ aspect: 1.0 1.0; \
+ } \
+ } \
+ part { name: "elm.text"; \
+ type: TEXTBLOCK; \
+ mouse_events: 0; \
+ scale: 1; \
+ description { state: "default" 0.0; \
+ visible: 0; \
+ fixed: 0 1; \
+ rel1 { \
+ relative: 1.0 0.5; \
+ offset: 1 1; \
+ to_x: "elm.swallow.content"; \
+ } \
+ rel2 { \
+ relative: 1.0 0.5; \
+ offset: -2 -2; \
+ } \
+ color: 255 255 255 255; \
+ align: 0.0 0.5; \
+ text { \
+ style: "check_label_textblock_style"; \
+ min: 0 0; \
+ } \
+ color: CHECK_DEFAULT_TEXT_NORMAL_COLOR_INC; \
+ } \
+ description { state: "visible" 0.0; \
+ inherit: "default" 0.0; \
+ visible: 1; \
+ text.min: 1 1; \
+ } \
+ description { state: "disabled" 0.0; \
+ inherit: "default" 0.0; \
+ } \
+ description { state: "disabled_visible" 0.0; \
+ inherit: "default" 0.0; \
+ visible: 1; \
+ text.min: 1 1; \
+ color: CHECK_DEFAULT_TEXT_DISABLED_COLOR_INC; \
+ } \
+ } \
+ part { name: "events"; \
+ type: RECT; \
+ ignore_flags: ON_HOLD; \
+ description { state: "default" 0.0; \
+ color: 0 0 0 0; \
+ } \
+ } \
+ part { name: "disabler"; \
+ type: RECT; \
+ description { state: "default" 0.0; \
+ color: 0 0 0 0; \
+ visible: 0; \
+ } \
+ description { state: "disabled" 0.0; \
+ inherit: "default" 0.0; \
+ visible: 1; \
+ } \
+ } \
+ } \
+ programs { \
+ program { name: "click"; \
+ signal: "mouse,up,1"; \
+ source: "events"; \
+ action: SIGNAL_EMIT "elm,action,check,toggle" ""; \
+ after: "bg_normal"; \
+ } \
+ program { name: "bg_normal"; \
+ script { \
+ set_state(PART:"bg", "default", 0.0); \
+ set_state(PART:"bg2", "default", 0.0); \
+ } \
+ } \
+ program { name: "mouseout"; \
+ signal: "mouse,out"; \
+ source: "events"; \
+ after: "bg_check_normal"; \
+ } \
+ program { name: "bg_check_normal"; \
+ script { \
+ new st[31]; \
+ new Float:vl; \
+ get_state(PART:"check", st, 30, vl); \
+ if (!strcmp(st, "pressed")) \
+ set_state(PART:"check", "visible", 0.0); \
+ set_state(PART:"bg", "default", 0.0); \
+ set_state(PART:"bg2", "default", 0.0); \
+ } \
+ } \
+ program { name: "pressed"; \
+ signal: "mouse,down,1"; \
+ source: "events"; \
+ script { \
+ new st[31]; \
+ new Float:vl; \
+ get_state(PART:"check", st, 30, vl); \
+ if (!strcmp(st, "visible")) \
+ set_state(PART:"check", "pressed", 0.0); \
+ set_state(PART:"bg", "pressed", 0.0); \
+ set_state(PART:"bg2", "pressed", 0.0); \
+ } \
+ } \
+ program { name: "check_on"; \
+ signal: "elm,state,check,on"; \
+ source: "elm"; \
+ action: STATE_SET "visible" 0.0; \
+ target: "check"; \
+ target: "selected_bg"; \
+ } \
+ program { name: "check_off"; \
+ signal: "elm,state,check,off"; \
+ source: "elm"; \
+ action: STATE_SET "default" 0.0; \
+ target: "check"; \
+ target: "selected_bg"; \
+ } \
+ program { name: "text_show"; \
+ signal: "elm,state,text,visible"; \
+ source: "elm"; \
+ action: STATE_SET "visible" 0.0; \
+ target: "elm.text"; \
+ } \
+ program { name: "text_hide"; \
+ signal: "elm,state,text,hidden"; \
+ source: "elm"; \
+ action: STATE_SET "default" 0.0; \
+ target: "elm.text"; \
+ } \
+ program { name: "icon_show"; \
+ signal: "elm,state,icon,visible"; \
+ source: "elm"; \
+ action: STATE_SET "visible" 0.0; \
+ target: "elm.swallow.content"; \
+ } \
+ program { name: "icon_hide"; \
+ signal: "elm,state,icon,hidden"; \
+ source: "elm"; \
+ action: STATE_SET "default" 0.0; \
+ target: "elm.swallow.content"; \
+ } \
+ program { name: "disable"; \
+ signal: "elm,state,disabled"; \
+ source: "elm"; \
+ action: STATE_SET "disabled" 0.0; \
+ target: "disabler"; \
+ target: "bg"; \
+ target: "bg2"; \
+ after: "disable_text"; \
+ } \
+ program { name: "disable_text"; \
+ script { \
+ new st[31]; \
+ new Float:vl; \
+ get_state(PART:"elm.text", st, 30, vl); \
+ if (!strcmp(st, "visible")) \
+ set_state(PART:"elm.text", "disabled_visible", 0.0); \
+ else \
+ set_state(PART:"elm.text", "disabled", 0.0); \
+ get_state(PART:"elm.swallow.content", st, 30, vl); \
+ if (!strcmp(st, "visible")) \
+ set_state(PART:"elm.swallow.content", "disabled_visible", 0.0); \
+ else \
+ set_state(PART:"elm.swallow.content", "disabled", 0.0); \
+ get_state(PART:"check", st, 30, vl); \
+ if (!strcmp(st, "visible")) \
+ set_state(PART:"check", "disabled_visible", 0.0); \
+ } \
+ } \
+ program { name: "enable"; \
+ signal: "elm,state,enabled"; \
+ source: "elm"; \
+ action: STATE_SET "default" 0.0; \
+ target: "disabler"; \
+ target: "bg"; \
+ target: "bg2"; \
+ after: "enable_text"; \
+ } \
+ program { name: "enable_text"; \
+ script { \
+ new st[31]; \
+ new Float:vl; \
+ get_state(PART:"elm.text", st, 30, vl); \
+ if (!strcmp(st, "disabled_visible")) \
+ set_state(PART:"elm.text", "visible", 0.0); \
+ else \
+ set_state(PART:"elm.text", "default", 0.0); \
+ get_state(PART:"elm.swallow.content", st, 30, vl); \
+ if (!strcmp(st, "visible")) \
+ set_state(PART:"elm.swallow.content", "visible", 0.0); \
+ else \
+ set_state(PART:"elm.swallow.content", "default", 0.0); \
+ get_state(PART:"check", st, 30, vl); \
+ if (!strcmp(st, "disabled_visible")) \
+ set_state(PART:"check", "visible", 0.0); \
+ } \
+ } \
+ } \
+ }
+
+////////////////////////////////////////////////////////////////////////////////
+ CHECK_STYLE_GRID("gallery_efl/grid", GE_EDC_IMAGE_CHECK_GRID, 64, 64)
+
+
+#undef CHECK_STATE_DEFAULT
+#undef CHECK_STATE_VISIBLE
+#undef CHECK_STATE_DISABLED_VISIBLE
+#undef CHECK_STATE_DISABLED
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* Definition of image path used in edc file */
+
+/* gallery-efl-nocontents.edc */
+#define GE_EDC_IMAGE_NOCONTENTS_PIC "T01_Nocontents_picture.png"
+
+/* gallery-efl-gengrid-item-albums.edc */
+#define GE_EDC_IMAGE_MAIN_FOLDER_BG "T01_main_folder_bg.png"
+
+/* gallery-efl-gengrid-item-thumbview.edc */
+#define GE_EDC_IMAGE_BUTTON_PLAY "T01_btn_play.png"
+
+/* gallery-efl-check.edc */
+#define GE_EDC_IMAGE_CHECK_GRID "T01_grid_select_check.png"
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* 14 + 334 + 10 */
+#define ALBUM_ITEM_W 358
+/* 26 + 334 */
+#define ALBUM_ITEM_H 360
+
+#define ALBUM_W 334
+#define ALBUM_H 334
+
+#define ALBUM_GAP_L 12
+#define ALBUM_GAP_R 12
+#define ALBUM_GAP_T 26
+
+#define ALBUM_ICON_W 318
+#define ALBUM_ICON_H 318
+
+#define ALBUM_ICON_GAP_L 8
+#define ALBUM_ICON_GAP_R 8
+#define ALBUM_ICON_GAP_B 16
+#define ALBUM_ICON_PAD 3
+
+#define ALBUM_TEXT_AREA_W 207
+#define ALBUM_TEXT_AREA_H 102
+#define ALBUM_TEXT_GAP_L 4
+#define ALBUM_TEXT_GAP_R 4
+#define ALBUM_TEXT_SNS_X 60
+#define ALBUM_TEXT_NAME_H 32
+#define ALBUM_TEXT_DATE_H 25
+#define ALBUM_PBAR_W 183
+#define ALBUM_PBAR_H 10
+#define ALBUM_PBAR_GAP_L 6
+#define ALBUM_PBAR_GAP_T 8
+
+#define ALBUM_SNS_ICON_W 32
+#define ALBUM_SNS_ICON_H 32
+
+#define ALBUM_RENAME_BTN_W 64
+#define ALBUM_RENAME_BTN_H 64
+
+#define ALBUM_CHECKBOX_W 42
+#define ALBUM_CHECKBOX_H 42
+#define ALBUM_CHECKBOX_GAP_L 1
+#define ALBUM_CHECKBOX_GAP_T 8
+#define ALBUM_ICON_BG_COLOR_INC 190 189 189 255
+
+group {
+ name: "elm/gengrid/item/albums_view/gallery_efl/default";
+ data.item: "texts" "elm.text.name elm.text.date elm.text.count";
+ data.item: "contents" "elm.swallow.onlyicon elm.swallow.check_bg label_bg";
+ images {
+ image: GE_EDC_IMAGE_MAIN_FOLDER_BG COMP;
+ }
+
+ parts {
+ part {
+ name: "bg";
+ type: RECT;
+ description {
+ state: "default" 0.0;
+ color: 255 0 0 0;
+ rel1 { relative: 0.0 0.0; }
+ rel2 { relative: 1.0 1.0; }
+ }
+ }
+ part { name: "icon_bg_img";
+ type: IMAGE;
+ mouse_events: 1;
+ scale : 1;
+ description {
+ min : ALBUM_W ALBUM_H;
+ state: "default" 0.0;
+ image {
+ normal : GE_EDC_IMAGE_MAIN_FOLDER_BG;
+ }
+ rel1 { relative: ALBUM_GAP_L/ALBUM_ITEM_W ALBUM_GAP_T/ALBUM_ITEM_H; to:"bg"; }
+ rel2 { relative: (ALBUM_ITEM_W-ALBUM_GAP_R-1)/ALBUM_ITEM_W 1.0; to:"bg"; }
+ }
+ }
+ part { name: "icon_bg";
+ type: RECT;
+ mouse_events: 1;
+ scale : 1;
+ description {
+ min : ALBUM_ICON_W ALBUM_ICON_H;
+ state: "default" 0.0;
+ color: ALBUM_ICON_BG_COLOR_INC;
+ rel1 { relative: ALBUM_ICON_GAP_L/ALBUM_ICON_W 0.0; to:"icon_bg_img"; }
+ rel2 { relative: (ALBUM_ICON_W-ALBUM_ICON_GAP_R+2)/ALBUM_ICON_W (ALBUM_ICON_H-ALBUM_ICON_GAP_B+2)/ALBUM_ICON_H; to:"icon_bg_img"; }
+ }
+ }
+ part {
+ name: "elm.swallow.onlyicon";
+ type: SWALLOW;
+ mouse_events: 1;
+ repeat_events: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: (ALBUM_ICON_PAD/ALBUM_ICON_W) (ALBUM_ICON_PAD/ALBUM_ICON_H); to: "icon_bg"; }
+ rel2 { relative: (ALBUM_ICON_W-ALBUM_ICON_PAD)/ALBUM_ICON_W (ALBUM_ICON_H-ALBUM_ICON_PAD)/ALBUM_ICON_H; to: "icon_bg"; }
+ }
+ }
+ part {
+ name: "label_bg";
+ type: SWALLOW;
+ mouse_events: 1;
+ repeat_events: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: (ALBUM_ICON_PAD/ALBUM_ICON_W) (ALBUM_ICON_PAD/ALBUM_ICON_H); offset: 0 0; to: "icon_bg"; }
+ rel2 { relative: ((ALBUM_ICON_PAD+ALBUM_TEXT_AREA_W-1)/ALBUM_ICON_W) ((ALBUM_ICON_PAD+ALBUM_TEXT_AREA_H-1)/ALBUM_ICON_H); offset: 0 0; to: "icon_bg"; }
+ }
+ }
+ part {
+ name: "elm.text.date";
+ type: TEXT;
+ mouse_events: 1;
+ repeat_events: 1;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: ALBUM_TEXT_GAP_L/ALBUM_TEXT_AREA_W ALBUM_TEXT_NAME_H/ALBUM_TEXT_AREA_H; to: "label_bg"; }
+ rel2 { relative: (ALBUM_TEXT_AREA_W-ALBUM_TEXT_GAP_L-1)/ALBUM_TEXT_AREA_W (ALBUM_TEXT_NAME_H+ALBUM_TEXT_DATE_H-1)/ALBUM_TEXT_AREA_H; to: "label_bg"; }
+ color: 190 190 190 255;
+ text {
+ font: "SLP:style=Medium";
+ text_class: "slp";
+ size: 22;
+ align: 0.0 0.5;
+ }
+ }
+ }
+ part {
+ name: "elm.text.count";
+ type: TEXT;
+ mouse_events: 1;
+ repeat_events: 1;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ visible: 1;
+ rel1 { relative: ((ALBUM_TEXT_GAP_L+ALBUM_SNS_ICON_W+1)/ALBUM_TEXT_AREA_W) ALBUM_TEXT_SNS_X/ALBUM_TEXT_AREA_H; to: "label_bg"; }
+ rel2 { relative: (ALBUM_TEXT_AREA_W-ALBUM_TEXT_GAP_L-1)/ALBUM_TEXT_AREA_W 1.0; to: "label_bg"; }
+ color: 255 255 255 255;
+ text {
+ font: "SLP:style=Medium";
+ text_class: "slp";
+ size: 38;
+ align: 1.0 0.5;
+ }
+ }
+ }
+ part {
+ name: "elm.text.name";
+ type: TEXT;
+ mouse_events: 1;
+ repeat_events: 1;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: (ALBUM_TEXT_GAP_L/ALBUM_TEXT_AREA_W) 0.0; to: "label_bg"; }
+ rel2 { relative: (ALBUM_TEXT_AREA_W-ALBUM_TEXT_GAP_L-1)/ALBUM_TEXT_AREA_W (ALBUM_TEXT_NAME_H-1)/ALBUM_TEXT_AREA_H; to: "label_bg"; }
+ color: 255 255 255 255;
+ text {
+ font: "SLP:style=Medium";
+ text_class: "slp";
+ size: 28;
+ align: 0.0 0.5;
+ }
+ }
+ }
+ }
+}
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define THUMBNAILS_BG_COLOR 190 189 189 255
+
+/* Grid item background size W: 14+158+6; H: 24+158 */
+#define W 178
+#define H 193
+#define GAP_W 2
+#define GAP_H 18
+
+/* Favourites icon boundary size */
+#define FAVOR_ICON_W 30
+#define FAVOR_ICON_H 30
+
+group {
+ name: "elm/gengrid/item/thumbnail_view/gallery_efl/default";
+
+ data.item: "contents" "elm.swallow.icon elm.swallow.end";
+
+ parts {
+ part {
+ name: "bg";
+ type: RECT;
+ description {
+ state: "default" 0.0;
+ color: 0 0 0 0;
+ rel1 { relative: 0.0 0.0; offset: 0 0;}
+ rel2 { relative: 1.0 1.0; offset: 0 0;}
+ }
+ }
+ part {
+ name: "icon_bg";
+ type: RECT;
+ scale : 1;
+ description {
+ state: "default" 0.0;
+ align: 0.5 0.5;
+ visible: 0;
+ color: 0 0 0 0;
+ rel1 { relative: 0.0 0.0;to:"bg"; }
+ rel2 { relative: 1.0 1.0;to:"bg"; }
+
+ }
+ }
+
+ part {
+ name: "elm.swallow.icon";
+ type: SWALLOW;
+ mouse_events: 1;
+ description {
+ state: "default" 0.0;
+ color: 0 0 0 0;
+ rel1 { relative: 0.0 0.0; to: "icon_bg"; }
+ rel2 { relative: 1.0 1.0; to: "icon_bg"; }
+ }
+ }
+ part {
+ name: "elm.swallow.end";
+ type: SWALLOW;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to: "elm.swallow.icon"; }
+ rel2 { relative: 1.0 1.0; to: "elm.swallow.icon"; }
+ }
+ }
+ }
+
+ programs {
+ program {
+ name: "movedonw_bg";
+ signal: "movedown,bg,show";
+ source: "bg";
+ action: STATE_SET "move_down" 0.0;
+ target: "bg";
+ }
+ }
+}
+
+
+
+
+group
+{
+ name: "elm/gengrid/photoframe/default_layout";
+
+ parts {
+ part {
+ name: "bg";
+ type: RECT;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0;}
+ rel2 { relative: 1.0 1.0;}
+ color: 0 0 0 0;
+ }
+ description {
+ state: "shrink" 0.0;
+ rel1 { relative: 0.03 0.03;}
+ rel2 { relative: 0.97 0.97;}
+ color: 0 0 0 0;
+ }
+ }
+ part {
+ name: "elm.swallow.icon";
+ type: SWALLOW;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: GAP_W/W (GAP_H+1)/H;}
+ rel2 { relative: (W-GAP_W)/W 1;}
+ }
+ }
+ }
+
+ programs {
+ program {
+ name: "mouse_down_shrink";
+ signal: "mouse,down,shrink";
+ source: "bg";
+ action: STATE_SET "shrink" 0.0;
+ target: "bg";
+ //after: "expand";
+ transition: LINEAR 0.1;
+ }
+ program {
+ name: "mouse_up_expand";
+ signal: "mouse,up,expand";
+ source: "bg";
+ action: STATE_SET "default" 0.0;
+ target: "bg";
+ transition: LINEAR 0.05;
+ after: "shrink,expand,done,icon";
+ }
+
+ program {
+ name: "shrink";
+ signal: "shrink";
+ source: "bg";
+ action: STATE_SET "shrink" 0.0;
+ target: "bg";
+ after: "expand";
+ transition: LINEAR 0.1;
+ }
+ program {
+ name: "expand";
+ action: STATE_SET "default" 0.0;
+ target: "bg";
+ transition: LINEAR 0.05;
+ after: "shrink,expand,done,icon";
+ }
+ program {
+ name: "shrink,expand,done,icon";
+ action: SIGNAL_EMIT "shrink,expand,done" "bg";
+ }
+ }
+}
+
+group
+{
+ name: "elm/gengrid/photoframe/default_layout_favor";
+
+ parts {
+ part {
+ name: "bg";
+ type: RECT;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0;}
+ rel2 { relative: 1.0 1.0;}
+ color: 0 0 0 0;
+ }
+ description {
+ state: "shrink" 0.0;
+ rel1 { relative: 0.03 0.03;}
+ rel2 { relative: 0.97 0.97;}
+ color: 0 0 0 0;
+ }
+ }
+ part {
+ name: "elm.swallow.icon";
+ type: SWALLOW;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: GAP_W/W (GAP_H+1)/H;}
+ rel2 { relative: (W-GAP_W)/W 1;}
+ }
+ }
+#ifdef _USE_FAVOR_AND_BOOKMARK_ICON
+ part {
+ name: "elm.swallow.favoricon";
+ type: SWALLOW;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ align: 0.5 0.5;
+ rel1 { relative: GAP_W/W (H-FAVOR_ICON_H+1)/H;}
+ rel2 { relative: (FAVOR_ICON_W+GAP_W)/W 1;}
+ }
+ }
+#endif
+ }
+
+ programs {
+ program {
+ name: "mouse_down_shrink";
+ signal: "mouse,down,shrink";
+ source: "bg";
+ action: STATE_SET "shrink" 0.0;
+ target: "bg";
+ //after: "expand";
+ transition: LINEAR 0.1;
+ }
+ program {
+ name: "mouse_up_expand";
+ signal: "mouse,up,expand";
+ source: "bg";
+ action: STATE_SET "default" 0.0;
+ target: "bg";
+ transition: LINEAR 0.05;
+ after: "shrink,expand,done,icon";
+ }
+
+ program {
+ name: "shrink";
+ signal: "shrink";
+ source: "bg";
+ action: STATE_SET "shrink" 0.0;
+ target: "bg";
+ after: "expand";
+ transition: LINEAR 0.1;
+ }
+ program {
+ name: "expand";
+ action: STATE_SET "default" 0.0;
+ target: "bg";
+ transition: LINEAR 0.05;
+ after: "shrink,expand,done,icon";
+ }
+ program {
+ name: "shrink,expand,done,icon";
+ action: SIGNAL_EMIT "shrink,expand,done" "bg";
+ }
+ }
+}
+
+group
+{
+ name: "elm/gengrid/photoframe/default_layout_video";
+ images {
+ image: GE_EDC_IMAGE_BUTTON_PLAY COMP;
+ }
+
+ parts {
+ part {
+ name: "bg";
+ type: RECT;
+ mouse_events: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0;}
+ rel2 { relative: 1.0 1.0;}
+ color: 0 0 0 0;
+ }
+ description {
+ state: "shrink" 0.0;
+ rel1 { relative: 0.03 0.03;}
+ rel2 { relative: 0.97 0.97;}
+ color: 0 0 0 0;
+ }
+ }
+ part {
+ name: "elm.swallow.icon";
+ type: SWALLOW;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: GAP_W/W (GAP_H+1)/H;}
+ rel2 { relative: (W-GAP_W)/W 1;}
+ }
+ }
+ part {
+ name: "elm.videoicon_bg";
+ type: RECT;
+ mouse_events: 0;
+ scale : 1;
+ description {
+ state: "default" 0.0;
+ color: 0 0 0 130;
+ align: 1.0 0.0;
+ rel1 { relative: GAP_W/W (H-FAVOR_ICON_H+1)/H;}
+ rel2 { relative: (FAVOR_ICON_W+GAP_W)/W 1;}
+ }
+ }
+ part {
+ name: "elm.text.bg";
+ type: RECT;
+ mouse_events: 0;
+ scale : 1;
+ description {
+ state: "default" 0.0;
+ color: 0 0 0 130;
+ align: 0.0 1.0;
+ rel1 { relative: 1 0; to: "elm.videoicon_bg";}
+ rel2 { relative: (W-GAP_W)/W 1; to_y: "elm.videoicon_bg";}
+ }
+ }
+ part {
+ name: "elm.swallow.videoicon";
+ type: IMAGE;
+ mouse_events: 0;
+ repeat_events: 0;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ align: 0.5 0.5;
+ aspect: 1.0 1.0;
+ rel1 { relative: 0 0; to: "elm.videoicon_bg";}
+ rel2 { relative: 1 1; to: "elm.videoicon_bg";}
+ image.normal: GE_EDC_IMAGE_BUTTON_PLAY;
+ }
+ }
+ part {
+ name: "elm.text";
+ type: TEXT;
+ mouse_events: 1;
+ repeat_events: 1;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ align: 0.0 1.0;
+ rel1 { relative: 0.0 0.0; to: "elm.text.bg"; }
+ rel2 { relative: 1.0 1.0; to: "elm.text.bg"; }
+ color: 255 255 255 255;
+ text {
+ font: "SLP:style=Bold";
+ text_class: "slp";
+ size: 26;
+ align: 0.9 0.5;
+ }
+ }
+ }
+ }
+ programs {
+ program {
+ name: "mouse_down_shrink";
+ signal: "mouse,down,shrink";
+ source: "bg";
+ action: STATE_SET "shrink" 0.0;
+ target: "bg";
+ //after: "expand";
+ transition: LINEAR 0.1;
+ }
+ program {
+ name: "mouse_up_expand";
+ signal: "mouse,up,expand";
+ source: "bg";
+ action: STATE_SET "default" 0.0;
+ target: "bg";
+ transition: LINEAR 0.05;
+ after: "shrink,expand,done,icon";
+ }
+
+ program {
+ name: "shrink";
+ signal: "shrink";
+ source: "bg";
+ action: STATE_SET "shrink" 0.0;
+ target: "bg";
+ after: "expand";
+ transition: LINEAR 0.1;
+ }
+ program {
+ name: "expand";
+ action: STATE_SET "default" 0.0;
+ target: "bg";
+ transition: LINEAR 0.05;
+ after: "shrink,expand,done,icon";
+ }
+ program {
+ name: "shrink,expand,done,icon";
+ action: SIGNAL_EMIT "shrink,expand,done" "bg";
+ }
+ }
+}
+
+group
+{
+ name: "elm/gengrid/photoframe/default_layout_video_favor";
+ images {
+ image: GE_EDC_IMAGE_BUTTON_PLAY COMP;
+ }
+
+ parts {
+ part {
+ name: "bg";
+ type: RECT;
+ mouse_events: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0;}
+ rel2 { relative: 1.0 1.0;}
+ color: 0 0 0 0;
+ }
+ description {
+ state: "shrink" 0.0;
+ rel1 { relative: 0.03 0.03;}
+ rel2 { relative: 0.97 0.97;}
+ color: 0 0 0 0;
+ }
+ }
+ part {
+ name: "elm.swallow.icon";
+ type: SWALLOW;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: GAP_W/W (GAP_H+1)/H;}
+ rel2 { relative: (W-GAP_W)/W 1;}
+ }
+ }
+ part {
+ name: "elm.videoicon_bg";
+ type: RECT;
+ mouse_events: 0;
+ scale : 1;
+ description {
+ state: "default" 0.0;
+ color: 0 0 0 130;
+ align: 1.0 0.0;
+ rel1 { relative: GAP_W/W (H-FAVOR_ICON_H+1)/H;}
+ rel2 { relative: (FAVOR_ICON_W+GAP_W)/W 1;}
+ }
+ }
+#ifdef _USE_FAVOR_AND_BOOKMARK_ICON
+ part {
+ name: "favoricon_bg";
+ type: RECT;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ color: 0 0 0 130;
+ align: 1.0 0.0;
+ rel1 { relative: 1 0; to: "elm.videoicon_bg";}
+ rel2 { relative: (FAVOR_ICON_W*2+GAP_W)/W 1; to_y: "elm.videoicon_bg";}
+ }
+ }
+#endif
+ part {
+ name: "elm.text.bg";
+ type: RECT;
+ mouse_events: 0;
+ scale : 1;
+ description {
+ state: "default" 0.0;
+ color: 0 0 0 130;
+ align: 0.0 1.0;
+#ifdef _USE_FAVOR_AND_BOOKMARK_ICON
+ rel1 { relative: 1 0; to: "favoricon_bg";}
+#else
+ rel1 { relative: 1 0; to: "elm.videoicon_bg";}
+#endif
+ rel2 { relative: (W-GAP_W)/W 1; to_y: "elm.videoicon_bg";}
+ }
+ }
+ part {
+ name: "elm.swallow.videoicon";
+ type: IMAGE;
+ mouse_events: 0;
+ repeat_events: 0;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ align: 0.5 0.5;
+ aspect: 1.0 1.0;
+ rel1 { relative: 0 0; to: "elm.videoicon_bg";}
+ rel2 { relative: 1 1; to: "elm.videoicon_bg";}
+ image.normal: GE_EDC_IMAGE_BUTTON_PLAY;
+ }
+ }
+ part {
+ name: "elm.text";
+ type: TEXT;
+ mouse_events: 1;
+ repeat_events: 1;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ align: 0.0 1.0;
+ rel1 { relative: 0.0 0.0; to: "elm.text.bg"; }
+ rel2 { relative: 1.0 1.0; to: "elm.text.bg"; }
+ color: 255 255 255 255;
+ text {
+ font: "SLP:style=Bold";
+ text_class: "slp";
+ size: 26;
+ align: 0.9 0.5;
+ }
+ }
+ }
+#ifdef _USE_FAVOR_AND_BOOKMARK_ICON
+ part {
+ name: "elm.swallow.favoricon";
+ type: SWALLOW;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ align: 0.5 0.5;
+ rel1 { relative: 0.0 0.0; to: "favoricon_bg"; }
+ rel2 { relative: 1.0 1.0; to: "favoricon_bg"; }
+ }
+ }
+#endif
+ }
+ programs {
+ program {
+ name: "mouse_down_shrink";
+ signal: "mouse,down,shrink";
+ source: "bg";
+ action: STATE_SET "shrink" 0.0;
+ target: "bg";
+ //after: "expand";
+ transition: LINEAR 0.1;
+ }
+ program {
+ name: "mouse_up_expand";
+ signal: "mouse,up,expand";
+ source: "bg";
+ action: STATE_SET "default" 0.0;
+ target: "bg";
+ transition: LINEAR 0.05;
+ after: "shrink,expand,done,icon";
+ }
+
+ program {
+ name: "shrink";
+ signal: "shrink";
+ source: "bg";
+ action: STATE_SET "shrink" 0.0;
+ target: "bg";
+ after: "expand";
+ transition: LINEAR 0.1;
+ }
+ program {
+ name: "expand";
+ action: STATE_SET "default" 0.0;
+ target: "bg";
+ transition: LINEAR 0.05;
+ after: "shrink,expand,done,icon";
+ }
+ program {
+ name: "shrink,expand,done,icon";
+ action: SIGNAL_EMIT "shrink,expand,done" "bg";
+ }
+ }
+}
+
+group
+{
+ name: "elm/gengrid/photoframe/default_layout_video_bookmark";
+ images {
+ image: GE_EDC_IMAGE_BUTTON_PLAY COMP;
+ }
+
+ parts {
+ part {
+ name: "bg";
+ type: RECT;
+ mouse_events: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0;}
+ rel2 { relative: 1.0 1.0;}
+ color: 0 0 0 0;
+ }
+ description {
+ state: "shrink" 0.0;
+ rel1 { relative: 0.03 0.03;}
+ rel2 { relative: 0.97 0.97;}
+ color: 0 0 0 0;
+ }
+ }
+ part {
+ name: "elm.swallow.icon";
+ type: SWALLOW;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: GAP_W/W (GAP_H+1)/H;}
+ rel2 { relative: (W-GAP_W)/W 1;}
+ }
+ }
+ part {
+ name: "elm.videoicon_bg";
+ type: RECT;
+ mouse_events: 0;
+ scale : 1;
+ description {
+ state: "default" 0.0;
+ color: 0 0 0 130;
+ align: 1.0 0.0;
+ rel1 { relative: GAP_W/W (H-FAVOR_ICON_H+1)/H;}
+ rel2 { relative: (FAVOR_ICON_W+GAP_W)/W 1;}
+ }
+ }
+#ifdef _USE_FAVOR_AND_BOOKMARK_ICON
+ part {
+ name: "bookmarkicon_bg";
+ type: RECT;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ color: 0 0 0 130;
+ align: 1.0 0.0;
+ rel1 { relative: 1 0; to: "elm.videoicon_bg";}
+ rel2 { relative: (FAVOR_ICON_W*2+GAP_W)/W 1; to_y: "elm.videoicon_bg";}
+ }
+ }
+#endif
+ part {
+ name: "elm.text.bg";
+ type: RECT;
+ mouse_events: 0;
+ scale : 1;
+ description {
+ state: "default" 0.0;
+ color: 0 0 0 130;
+ align: 0.0 1.0;
+#ifdef _USE_FAVOR_AND_BOOKMARK_ICON
+ rel1 { relative: 1 0; to: "bookmarkicon_bg";}
+#else
+ rel1 { relative: 1 0; to: "elm.videoicon_bg";}
+#endif
+ rel2 { relative: (W-GAP_W)/W 1; to_y: "elm.videoicon_bg";}
+ }
+ }
+ part {
+ name: "elm.swallow.videoicon";
+ type: IMAGE;
+ mouse_events: 0;
+ repeat_events: 0;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ align: 0.5 0.5;
+ aspect: 1.0 1.0;
+ rel1 { relative: 0 0; to: "elm.videoicon_bg";}
+ rel2 { relative: 1 1; to: "elm.videoicon_bg";}
+ image.normal: GE_EDC_IMAGE_BUTTON_PLAY;
+ }
+ }
+ part {
+ name: "elm.text";
+ type: TEXT;
+ mouse_events: 1;
+ repeat_events: 1;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ align: 0.0 1.0;
+ rel1 { relative: 0.0 0.0; to: "elm.text.bg"; }
+ rel2 { relative: 1.0 1.0; to: "elm.text.bg"; }
+ color: 255 255 255 255;
+ text {
+ font: "SLP:style=Bold";
+ text_class: "slp";
+ size: 26;
+ align: 0.9 0.5;
+ }
+ }
+ }
+#ifdef _USE_FAVOR_AND_BOOKMARK_ICON
+ part {
+ name: "elm.swallow.bookmarkicon";
+ type: SWALLOW;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ align: 0.5 0.5;
+ visible: 1;
+ rel1 { relative: 0.0 0.0; to: "bookmarkicon_bg"; }
+ rel2 { relative: 1.0 1.0; to: "bookmarkicon_bg"; }
+ }
+ }
+#endif
+ }
+ programs {
+ program {
+ name: "mouse_down_shrink";
+ signal: "mouse,down,shrink";
+ source: "bg";
+ action: STATE_SET "shrink" 0.0;
+ target: "bg";
+ //after: "expand";
+ transition: LINEAR 0.1;
+ }
+ program {
+ name: "mouse_up_expand";
+ signal: "mouse,up,expand";
+ source: "bg";
+ action: STATE_SET "default" 0.0;
+ target: "bg";
+ transition: LINEAR 0.05;
+ after: "shrink,expand,done,icon";
+ }
+
+ program {
+ name: "shrink";
+ signal: "shrink";
+ source: "bg";
+ action: STATE_SET "shrink" 0.0;
+ target: "bg";
+ after: "expand";
+ transition: LINEAR 0.1;
+ }
+ program {
+ name: "expand";
+ action: STATE_SET "default" 0.0;
+ target: "bg";
+ transition: LINEAR 0.05;
+ after: "shrink,expand,done,icon";
+ }
+ program {
+ name: "shrink,expand,done,icon";
+ action: SIGNAL_EMIT "shrink,expand,done" "bg";
+ }
+ }
+}
+
+group
+{
+ name: "elm/gengrid/photoframe/default_layout_video_favor_bookmark";
+ images {
+ image: GE_EDC_IMAGE_BUTTON_PLAY COMP;
+ }
+
+ parts {
+ part {
+ name: "bg";
+ type: RECT;
+ mouse_events: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0;}
+ rel2 { relative: 1.0 1.0;}
+ color: 0 0 0 0;
+ }
+ description {
+ state: "shrink" 0.0;
+ rel1 { relative: 0.03 0.03;}
+ rel2 { relative: 0.97 0.97;}
+ color: 0 0 0 0;
+ }
+ }
+ part {
+ name: "elm.swallow.icon";
+ type: SWALLOW;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: GAP_W/W (GAP_H+1)/H;}
+ rel2 { relative: (W-GAP_W)/W 1;}
+ }
+ }
+ part {
+ name: "elm.videoicon_bg";
+ type: RECT;
+ mouse_events: 0;
+ scale : 1;
+ description {
+ state: "default" 0.0;
+ color: 0 0 0 130;
+ align: 1.0 0.0;
+ rel1 { relative: GAP_W/W (H-FAVOR_ICON_H+1)/H;}
+ rel2 { relative: (FAVOR_ICON_W+GAP_W)/W 1;}
+ }
+ }
+#ifdef _USE_FAVOR_AND_BOOKMARK_ICON
+ part {
+ name: "favoricon_bg";
+ type: RECT;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ color: 0 0 0 130;
+ align: 1.0 0.0;
+ rel1 { relative: 1 0; to: "elm.videoicon_bg";}
+ rel2 { relative: (FAVOR_ICON_W*2+GAP_W)/W 1; to_y: "elm.videoicon_bg";}
+ }
+ }
+ part {
+ name: "bookmarkicon_bg";
+ type: RECT;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ color: 0 0 0 130;
+ align: 1.0 0.0;
+ rel1 { relative: 1 0; to: "favoricon_bg";}
+ rel2 { relative: (FAVOR_ICON_W*3+GAP_W)/W 1; to_y: "elm.videoicon_bg";}
+ }
+#endif
+ part {
+ name: "elm.text.bg";
+ type: RECT;
+ mouse_events: 0;
+ scale : 1;
+ description {
+ state: "default" 0.0;
+ color: 0 0 0 130;
+ align: 0.0 1.0;
+#ifdef _USE_FAVOR_AND_BOOKMARK_ICON
+ rel1 { relative: 1 0; to: "bookmarkicon_bg";}
+#else
+ rel1 { relative: 1 0; to: "elm.videoicon_bg";}
+#endif
+ rel2 { relative: (W-GAP_W)/W 1; to_y: "elm.videoicon_bg";}
+ }
+ }
+ part {
+ name: "elm.swallow.videoicon";
+ type: IMAGE;
+ mouse_events: 0;
+ repeat_events: 0;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ align: 0.5 0.5;
+ aspect: 1.0 1.0;
+ rel1 { relative: 0 0; to: "elm.videoicon_bg";}
+ rel2 { relative: 1 1; to: "elm.videoicon_bg";}
+ image.normal: GE_EDC_IMAGE_BUTTON_PLAY;
+ }
+ }
+ part {
+ name: "elm.text";
+ type: TEXT;
+ mouse_events: 1;
+ repeat_events: 1;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ align: 0.0 1.0;
+ rel1 { relative: 0.0 0.0; to: "elm.text.bg"; }
+ rel2 { relative: 1.0 1.0; to: "elm.text.bg"; }
+ color: 255 255 255 255;
+ text {
+ font: "SLP:style=Bold";
+ text_class: "slp";
+ size: 26;
+ align: 0.9 0.5;
+ }
+ }
+ }
+#ifdef _USE_FAVOR_AND_BOOKMARK_ICON
+ part {
+ name: "elm.swallow.favoricon";
+ type: SWALLOW;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ align: 0.5 0.5;
+ rel1 { relative: 0.0 0.0; to: "favoricon_bg"; }
+ rel2 { relative: 1.0 1.0; to: "favoricon_bg"; }
+ }
+ }
+ part {
+ name: "elm.swallow.bookmarkicon";
+ type: SWALLOW;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ align: 0.5 0.5;
+ visible: 1;
+ rel1 { relative: 0.0 0.0; to: "bookmarkicon_bg"; }
+ rel2 { relative: 1.0 1.0; to: "bookmarkicon_bg"; }
+ }
+ }
+#endif
+ }
+ programs {
+ program {
+ name: "mouse_down_shrink";
+ signal: "mouse,down,shrink";
+ source: "bg";
+ action: STATE_SET "shrink" 0.0;
+ target: "bg";
+ //after: "expand";
+ transition: LINEAR 0.1;
+ }
+ program {
+ name: "mouse_up_expand";
+ signal: "mouse,up,expand";
+ source: "bg";
+ action: STATE_SET "default" 0.0;
+ target: "bg";
+ transition: LINEAR 0.05;
+ after: "shrink,expand,done,icon";
+ }
+
+ program {
+ name: "shrink";
+ signal: "shrink";
+ source: "bg";
+ action: STATE_SET "shrink" 0.0;
+ target: "bg";
+ after: "expand";
+ transition: LINEAR 0.1;
+ }
+ program {
+ name: "expand";
+ action: STATE_SET "default" 0.0;
+ target: "bg";
+ transition: LINEAR 0.05;
+ after: "shrink,expand,done,icon";
+ }
+ program {
+ name: "shrink,expand,done,icon";
+ action: SIGNAL_EMIT "shrink,expand,done" "bg";
+ }
+ }
+}
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define NOCONTENT_TEXT_BLOCK_TEXT_SIZE_INC 32
+#define NOCONTENT_TEXT_BLOCK_STYLE_COLOR_INC 173 170 165 255
+
+ group {
+ name: "elm/layout/nocontents/gallery_efl";
+ styles{
+ style { name: "nocontent_style";
+ base: "font=SLP:style=Roman text_class=slp font_size="NOCONTENT_TEXT_BLOCK_TEXT_SIZE_INC" align=center color=#ffffff wrap=word";
+ tag: "br" "\n";
+ tag: "hilight" "+ font=SLP:style=Bold text_class=slp";
+ tag: "b" "+ font=SLP:style=Bold text_class=slp";
+ tag: "tab" "\t";
+ }
+ }
+ images {
+ image: GE_EDC_IMAGE_NOCONTENTS_PIC COMP;
+ }
+ parts {
+ part { name: "bg";
+ scale: 1;
+ type: RECT;
+ description { state: "default" 0.0;
+ visible: 1;
+ rel1 { relative: 0.0 0.0;}
+ rel2 { relative: 1.0 1.0;}
+ color: 0 0 0 0;
+ }
+ }
+ part { name: "nocontents.image";
+ description { state: "default" 0.0;
+ visible: 1;
+ align: 0.5 0.0;
+ rel1 { relative: 203/720 296/1016; to: "bg";}
+ rel2 { relative: (203+314)/720 (296+310)/1016; to: "bg";}
+ image {
+ normal: GE_EDC_IMAGE_NOCONTENTS_PIC;
+ border: 1 1 1 1;
+ border_scale: 1;
+ }
+ aspect: 1.0 1.0;
+ aspect_preference: BOTH;
+ }
+ }
+ part { name: "middle.padding";
+ scale: 1;
+ type: RECT;
+ description { state: "default" 0.0;
+ visible: 0;
+ align: 0.5 0.0;
+ rel1 { relative: 0.0 1.0; to_y: "nocontents.image";}
+ rel2 { relative: 1.0 (296+310+54)/1016; to: "bg";}
+ }
+ }
+ part { name: "elm.text";
+ type: TEXTBLOCK;
+ description { state: "default" 0.0;
+ fixed: 0 1;
+ align: 0.5 0.0;
+ visible: 1;
+ rel1 { relative: 0.0 1.0; to_x: "bg"; to_y: "middle.padding";}
+ rel2 { relative: 1.0 1.0; to: "bg";}
+ color: NOCONTENT_TEXT_BLOCK_STYLE_COLOR_INC;
+ text {
+ style: "nocontent_style";
+ align: 0.5 0.5;
+ min: 0 0;
+ max: 0 1;
+ }
+ }
+ }
+ }
+ }
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define FONT_ROM "HelveticaNeue:style=Roman"
+#define FONT_MED "HelveticaNeue:style=Medium"
+#define SELINFO_H 48
+
+#include "gallery-efl-edc-res.h"
+
+collections {
+#include "gallery-efl-gengrid-item-thumbview.edc"
+#include "gallery-efl-gengrid-item-albums.edc"
+#include "gallery-efl-check.edc"
+#include "gallery-efl-nocontents.edc"
+
+ group
+ {
+ name: "gallery_efl/gridview";
+
+ parts {
+ part {
+ name: "background";
+ type, RECT;
+
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; offset: 0 0; }
+ rel2 { relative: 1.0 1.0; offset: -1 -1; }
+ color, 0 0 0 0;
+ }
+ }
+
+ part {
+ name: "contents";
+ type: SWALLOW;
+ mouse_events: 1;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to: "background";}
+ rel2 { relative: 1.0 1.0; to: "background";}
+ }
+ description {
+ state: "moveup" 0.0;
+ rel1 { relative: 0.0 0.0; to: "background";}
+ rel2 { relative: 1.0 0.0; to: "elm.swallow.selinfo"; }
+ }
+
+ }
+ part {
+ name: "elm.swallow.selinfo";
+ type: SWALLOW;
+ scale: 1;
+ description {
+ state: "default" 0.0;
+ min: 0 SELINFO_H; // bottom padding size for selectioninfo
+ fixed: 0 1;
+ align: 0.5 1.0;
+ rel1 { relative: 0.0 1.0; }
+ rel2 { relative: 1.0 1.0; }
+ visible: 0;
+ }
+ description { state: "show" 0.0;
+ inherit: "default" 0.0;
+ visible: 1;
+ }
+ }
+ }
+
+ programs {
+ program {
+ name: "thumb_view_default";
+ signal: "elm,thumb_view,state,default";
+ source: "elm";
+ script {
+ set_state(PART:"contents", "default", 0.0);
+ set_state(PART:"elm.swallow.selinfo", "default", 0.0);
+ }
+ }
+ program {
+ name: "thumb_view_moveup";
+ signal: "elm,thumb_view,state,moveup";
+ source: "elm";
+ script {
+ set_state(PART:"contents", "moveup", 0.0);
+ set_state(PART:"elm.swallow.selinfo", "show", 0.0);
+ }
+ }
+ }
+ }
+
+ group
+ {
+ name: "gallery_efl/albumview";
+
+ parts {
+ part {
+ name: "background";
+ type, RECT;
+
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; offset: 0 0; }
+ rel2 { relative: 1.0 1.0; offset: -1 -1; }
+ color, 0 0 0 0;
+ }
+ }
+
+ part {
+ name: "contents";
+ type: SWALLOW;
+ mouse_events: 1;
+ scale: 1;
+
+ description {
+ state: "default" 0.0;
+ rel1 { relative: 0.0 0.0; to: "background";}
+ rel2 { relative: 1.0 1.0; to: "background";}
+
+ }
+ }
+ }
+ }
+ group { name: "ge_bg_layout";
+ parts {
+ part { name: "bg";
+ type: RECT;
+ mouse_events: 0;
+ description { state: "default" 0.0;
+ color: 0 0 0 45;
+ }
+ }
+ part { name: "elm.swallow.image";
+ type: SWALLOW;
+ description { state: "default" 0.0;
+ }
+ }
+ }
+ }
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef UG_MODULE_API
+#define UG_MODULE_API __attribute__ ((visibility("default")))
+#endif
+
+#include <Evas.h>
+#include "gallery-efl.h"
+#include "ge-debug.h"
+#include "ge-albums.h"
+#include "ge-gridview.h"
+#include "ge-data.h"
+#include "ge-ui-util.h"
+#include "ge-util.h"
+#include "ge-ext-ug-load.h"
+#include "ge-strings.h"
+#include "ge-lang.h"
+
+static ge_view_mode g_view_mode = GE_VIEW_ALBUMS;
+
+#define GE_BG_COLOR_R 248
+#define GE_BG_COLOR_G 246
+#define GE_BG_COLOR_B 239
+
+ge_view_mode _ge_get_view_mode(void)
+{
+ return g_view_mode;
+}
+
+void _ge_set_view_mode(ge_view_mode mode)
+{
+ g_view_mode = mode;
+}
+
+static int _ge_create_ly_view(ge_ugdata *ugd)
+{
+ GE_CHECK_VAL(ugd, -1);
+ GE_CHECK_VAL(ugd->navi_bar, -1);
+ /**
+ * Init libmedia-info.
+ * If failed, records couldn't be got from DB, cluster list is emty.
+ * Show warning message instead of return -1;
+ */
+ if(_ge_data_init(ugd) != 0)
+ {
+ ge_dbgW("_ge_data_init failed!");
+ }
+ /**
+ * Get cluster list from DB.
+ * If cluster list is empty, GE_DB_FAILED returned,
+ * "No contents" view would be created and showed.
+ * Show warning message instead of return -1;
+ */
+ if(_ge_data_get_clusters_list(ugd) != 0)
+ ge_dbgW("Get clusters list failed!");
+
+ /* Create layout of albums view */
+ ugd->albums_view_ly = ge_albums_create_ly(ugd->navi_bar);
+ GE_CHECK_VAL(ugd->albums_view_ly, -1);
+ /* Create albums view */
+ ugd->albums_view = ge_albums_create_view(ugd, ugd->albums_view_ly);
+ GE_CHECK_VAL(ugd->albums_view, -1);
+ elm_object_part_content_set(ugd->albums_view_ly, "contents",
+ ugd->albums_view);
+
+ ge_ui_create_title_and_push(ugd, ugd->navi_bar, ugd->albums_view_ly,
+ GE_NAVI_ALBUMS, ugd->albums_view_title);
+ return 0;
+}
+
+static Evas_Object *_ge_create_bg(Evas_Object *parent)
+{
+ ge_dbg("");
+ GE_CHECK_NULL(parent);
+ Evas_Object *bg = NULL;
+
+ bg = elm_bg_add(parent);
+ /* Show special color of background */
+ elm_bg_color_set(bg, GE_BG_COLOR_R, GE_BG_COLOR_G, GE_BG_COLOR_B);
+
+ evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND,
+ EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bg, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_show(bg);
+
+ return bg;
+}
+
+static int _ge_init_view(ge_ugdata *ugd)
+{
+ ge_dbg("");
+ GE_CHECK_VAL(ugd, -1);
+
+ /* Base Layout */
+ ugd->ly_main = ge_ui_create_main_ly(ugd, ugd->win);
+ GE_CHECK_VAL(ugd->ly_main, -1);
+ /* Background */
+ ugd->bg = _ge_create_bg(ugd->ly_main);
+ GE_CHECK_VAL(ugd->bg, -1);
+ /* Pack bg to swallow */
+ elm_object_part_content_set(ugd->ly_main, "elm.swallow.bg", ugd->bg);
+
+ /* Navigation Bar */
+ ugd->navi_bar = ge_ui_create_navibar(ugd, ugd->ly_main);
+ GE_CHECK_VAL(ugd->navi_bar, -1);
+
+ /* Albums view and its layout */
+ if(_ge_create_ly_view(ugd) != 0)
+ {
+ ge_dbgE("Create albums view and layout failed!");
+ return -1;
+ }
+
+ return 0;
+}
+
+static int _ge_create_view(ge_ugdata *ugd)
+{
+ ge_dbg("");
+ GE_CHECK_VAL(ugd, -1);
+ /* Set inited flag as TRUE */
+ ugd->b_inited_view = true;
+ /* Add new theme */
+ ugd->th = elm_theme_new();
+ GE_CHECK_VAL(ugd->th, -1);
+ elm_theme_ref_set(ugd->th, NULL);
+ elm_theme_extension_add(ugd->th, GE_EDJ_FILE);
+
+ /* Initialize gallery ug view */
+ if(_ge_init_view(ugd) != 0)
+ {
+ ge_dbgE("Initialize view failed!");
+ return -1;
+ }
+
+ /* Register MMC changed callback */
+ if(ge_reg_db_update_noti(ugd) != 0) {
+ ge_dbgE("ge_reg_db_update_noti failed!");
+ return -1;
+ }
+
+ return 0;
+}
+
+static int _ge_close_view(ge_ugdata *ugd)
+{
+ GE_CHECK_VAL(ugd, -1);
+
+ GE_IF_DEL_OBJ(ugd->popup)
+
+ GE_FREEIF(ugd->file_setas_callid_path);
+ GE_FREEIF(ugd->file_setas_homescreen_path);
+ GE_FREEIF(ugd->file_setas_lockscreen_path);
+ GE_FREEIF(ugd->file_setas_callid_size);
+ GE_FREEIF(ugd->file_setas_image_path);
+ GE_FREEIF(ugd->file_setas_crop_image_path);
+
+ if(ugd->b_inited_view) {
+ /* Destroy UG called by me */
+ if (ugd->ug_called_by_me) {
+ ge_dbg("Destroy ug_called_by_me");
+ ug_destroy(ugd->ug_called_by_me);
+ ugd->ug_called_by_me = NULL;
+ }
+
+ GE_IF_DEL_TIMER(ugd->del_timer)
+ GE_IF_DEL_TIMER(ugd->thumbs_clicked_timer)
+ GE_IF_DEL_IDLER(ugd->grid_append_idler)
+
+ ge_dereg_db_update_noti();
+
+ ge_grid_del_callbacks(ugd);
+ ge_albums_del_callbacks(ugd);
+
+ GE_IF_DEL_OBJ(ugd->navi_bar)
+ GE_IF_DEL_OBJ(ugd->bg)
+ GE_IF_DEL_OBJ(ugd->ly_main)
+
+ ge_albums_free_cover_thumbs(ugd);
+
+ /* Disconnet with libmedia-info */
+ _ge_data_finalize(ugd);
+ if(ugd->th) {
+ elm_theme_extension_del(ugd->th, GE_EDJ_FILE);
+ elm_theme_free(ugd->th);
+ ugd->th = NULL;
+ }
+ ugd->b_inited_view = false;
+ }
+
+ if(ugd->service) {
+ service_destroy(ugd->service);
+ ugd->service = NULL;
+ }
+ return 0;
+}
+
+static int __ge_parse_param_launch_type_setas(ge_ugdata *ugd, service_h service)
+{
+ GE_CHECK_VAL(ugd, -1);
+ GE_CHECK_VAL(service, -1);
+ char *setas_type = NULL;
+ char *callerid_size = NULL;
+ char *callerid_path = NULL;
+ char *wallpaper_path = NULL;
+ char *lockscreen_path = NULL;
+
+ service_get_extra_data(service, GE_BUNDLE_SETAS_TYPE, &setas_type);
+ if(setas_type == NULL) {
+ ge_dbgW("setas-type NULL");
+ return -1;
+ }
+
+ if (!strcasecmp(setas_type, GE_SETAS_WALLPAPER)) {
+ ugd->file_select_setas_mode = GE_SETAS_T_WALLPAPER;
+ g_strlcpy(ugd->albums_view_title, GE_TITLE_CHANGE_WALLPAPER,
+ GE_ALBUM_NAME_LEN_MAX);
+
+ service_get_extra_data(service, GE_BUNDLE_HOMESCREEN_PATH,
+ &wallpaper_path);
+ if (wallpaper_path) {
+ ge_dbg("path:%s", wallpaper_path);
+ ugd->file_setas_homescreen_path = wallpaper_path;
+ }
+
+ service_get_extra_data(service, GE_BUNDLE_LOCKSCREEN_PATH,
+ &lockscreen_path);
+ if (lockscreen_path) {
+ ge_dbg("path:%s", lockscreen_path);
+ ugd->file_setas_lockscreen_path = lockscreen_path;
+ }
+ } else if (!strcasecmp(setas_type, GE_SETAS_CROP_WALLPAPER)) {
+ ugd->file_select_setas_mode = GE_SETAS_T_CROP_WALLPAPER;
+ g_strlcpy(ugd->albums_view_title, GE_TITLE_CHANGE_WALLPAPER,
+ GE_ALBUM_NAME_LEN_MAX);
+ } else if (!strcasecmp(setas_type, GE_SETAS_CALLERID)) {
+ ugd->file_select_setas_mode = GE_SETAS_T_CALLERID;
+ g_strlcpy(ugd->albums_view_title, GE_TITLE_CHANGE_CALLER_ID,
+ GE_ALBUM_NAME_LEN_MAX);
+
+ service_get_extra_data(service, GE_BUNDLE_CALLERID_SIZE,
+ &callerid_size);
+ if (callerid_size) {
+ ge_dbg("size:%s", callerid_size);
+ ugd->file_setas_callid_size = callerid_size;
+ }
+
+ service_get_extra_data(service, GE_BUNDLE_CALLERID_PATH,
+ &callerid_path);
+ if (callerid_path) {
+ ge_dbg("path:%s", callerid_path);
+ ugd->file_setas_callid_path = callerid_path;
+ }
+ }
+
+ GE_FREE(setas_type);
+ return 0;
+}
+
+static int __ge_parse_param_file_type(ge_ugdata *ugd, service_h service)
+{
+ GE_CHECK_VAL(ugd, -1);
+ GE_CHECK_VAL(service, -1);
+
+ char *file_type = NULL;
+ char file_type_str[GE_ALBUM_NAME_LEN_MAX] = {0,};
+ bool b_singular = true;
+
+ if(ugd->file_select_mode == GE_FILE_SELECT_T_MULTIPLE)
+ b_singular = false;
+
+ /* file-type */
+ service_get_extra_data(service, GE_BUNDLE_FILE_TYPE, &file_type);
+ if(file_type == NULL) {
+ ge_dbgW("file_type is empty!");
+ goto GE_DEFAULT_FILE_TYPE;
+ }
+ ge_dbg("file_type: %s", file_type);
+
+ if (!strcasecmp(file_type, GE_FILE_TYPE_IMAGE)) {
+ ugd->file_type_mode = GE_FILE_T_IMAGE;
+ if(b_singular) {
+ g_strlcat(ugd->albums_view_title, GE_TITLE_IMAGE,
+ sizeof(ugd->albums_view_title));
+ } else {
+ g_strlcat(ugd->albums_view_title, GE_TITLE_IMAGES,
+ sizeof(ugd->albums_view_title));
+ }
+
+ GE_FREE(file_type);
+ return 0;
+ } else if (!strcasecmp(file_type, GE_FILE_TYPE_VIDEO)) {
+ ugd->file_type_mode = GE_FILE_T_VIDEO;
+ if(b_singular) {
+ g_strlcat(ugd->albums_view_title, GE_TITLE_VIDEO,
+ sizeof(ugd->albums_view_title));
+ } else {
+ g_strlcat(ugd->albums_view_title, GE_TITLE_VIDEOS,
+ sizeof(ugd->albums_view_title));
+ }
+
+ GE_FREE(file_type);
+ return 0;
+ }
+
+
+GE_DEFAULT_FILE_TYPE:
+
+ ge_dbg("file type is default, set default type(ALL).");
+ ugd->file_type_mode = GE_FILE_T_ALL;
+ if(b_singular) {
+ g_strlcpy(file_type_str, GE_TITLE_FILE, sizeof(file_type_str));
+ } else {
+ g_strlcpy(file_type_str, GE_TITLE_FILES, sizeof(file_type_str));
+ }
+
+ g_strlcat(ugd->albums_view_title, file_type_str,
+ sizeof(ugd->albums_view_title));
+
+ return 0;
+}
+
+/* analysis parameters */
+static int _ge_parse_param(ge_ugdata *ugd, service_h service)
+{
+ GE_CHECK_VAL(ugd, -1);
+ GE_CHECK_VAL(service, -1);
+ char *contain_drm = NULL;
+ char *launch_type = NULL;
+ char *select_mode = NULL;
+
+ ugd->b_show_drm = false;
+ service_get_extra_data(service, GE_BUNDLE_DRM_TYPE, &contain_drm);
+ if (contain_drm) {
+ if (!strcasecmp(contain_drm, GE_FILE_TYPE_DRM_TRUE))
+ ugd->b_show_drm = true;
+ GE_FREE(contain_drm);
+ }
+
+ service_get_extra_data(service, GE_BUNDLE_SELECTION_MODE, &select_mode);
+ if (select_mode) {
+ if (!strcasecmp(select_mode, GE_BUNDLE_SELECTION_MODE_SINGLE))
+ launch_type = strdup(GE_LAUNCH_SELECT_ONE);
+ else if (!strcasecmp(select_mode, GE_BUNDLE_SELECTION_MODE_MULTI))
+ launch_type = strdup(GE_LAUNCH_SELECT_MULTIPLE);
+ GE_FREE(select_mode);
+ }
+
+ if (launch_type == NULL)
+ service_get_extra_data(service, GE_BUNDLE_LAUNCH_TYPE,
+ &launch_type);
+
+ if (launch_type == NULL) {
+ ge_dbg("launch-type == NULL");
+ return -1;
+ }
+ ge_dbg("launch-type [%s]", launch_type);
+
+ if(!strcasecmp(launch_type, GE_LAUNCH_SELECT_ALBUM)) {
+ ugd->album_select_mode = GE_ALBUM_SELECT_T_ONE;
+ g_strlcpy(ugd->albums_view_title, GE_TITLE_ALBUMS,
+ GE_ALBUM_NAME_LEN_MAX);
+ } else if (!strcasecmp(launch_type, GE_LAUNCH_SELECT_SETAS)) {
+ ugd->file_select_mode = GE_FILE_SELECT_T_SETAS;
+ __ge_parse_param_launch_type_setas(ugd, service);
+ /* Checkme: Only image type is offered in SETAS case */
+ ugd->file_type_mode = GE_FILE_T_IMAGE;
+ } else {
+ g_strlcpy(ugd->albums_view_title, GE_TITLE_ADD,
+ GE_ALBUM_NAME_LEN_MAX);
+ g_strlcat(ugd->albums_view_title, " ", GE_ALBUM_NAME_LEN_MAX);
+
+ if (!strcasecmp(launch_type, GE_LAUNCH_SELECT_ONE))
+ ugd->file_select_mode = GE_FILE_SELECT_T_ONE;
+ else if (!strcasecmp(launch_type, GE_LAUNCH_SELECT_MULTIPLE))
+ ugd->file_select_mode = GE_FILE_SELECT_T_MULTIPLE;
+ else
+ ge_dbgE("Wrong launch type!");
+
+ __ge_parse_param_file_type(ugd, service);
+ }
+
+ GE_FREE(launch_type);
+ return 0;
+}
+
+/**
+* @brief
+*
+* @param ug
+* @param mode
+* @param data
+* @param priv
+*
+* @return
+*/
+static void * _ge_create(ui_gadget_h ug, enum ug_mode mode, service_h service, void *priv)
+{
+ ge_dbg("Enter...");
+ ge_ugdata *ugd = NULL;
+ GE_CHECK_NULL(priv);
+ GE_CHECK_NULL(service);
+ GE_CHECK_NULL(ug);
+ ge_dbgW("Gallery UG start...");
+
+ ugd = (ge_ugdata *)priv;
+ ugd->ug = ug;
+ /* Get window */
+ ugd->win = (Evas_Object *)ug_get_window();
+ GE_CHECK_NULL(ugd->win);
+ /* Bind text domain for internalization */
+ bindtextdomain("ug-gallery-efl" , "/usr/ug/res/locale");
+ /* Reset inited flag, it would be set as TRUE if albums view created */
+ ugd->b_inited_view = false;
+ /* Set view mode */
+ _ge_set_view_mode(GE_VIEW_ALBUMS);
+
+ Ecore_X_Window x_win = ecore_x_window_focus_get();
+ GE_CHECK_NULL(x_win);
+ Ecore_X_Window root_win = ecore_x_window_root_get(x_win);
+ GE_CHECK_NULL(root_win);
+ ugd->win_scale = elm_config_scale_get();
+
+ service_clone(&(ugd->service), service);
+
+ /* Parse parameters passed from parent */
+ if(_ge_parse_param(ugd, service) != 0) {
+ ge_dbgE("Failed to parse parameters!");
+ return NULL;
+ }
+
+ if ((ugd->file_select_mode == GE_FILE_SELECT_T_SETAS) ||
+ (ugd->file_select_mode != GE_FILE_SELECT_T_NONE) ||
+ (ugd->album_select_mode != GE_ALBUM_SELECT_T_NONE)) {
+ /* create gallery UG */
+ if(_ge_create_view(ugd) != 0) {
+ ge_dbgE("Failed to create Gallery UG view!");
+ return NULL;
+ }
+ } else {
+ ge_dbgE("Wrong file_select_mode[%d] or album_select_mode[%d]",
+ ugd->file_select_mode, ugd->album_select_mode);
+ }
+
+ return ugd->ly_main;
+}
+
+/**
+* @brief
+*
+* @param ug
+* @param data
+* @param priv
+*/
+static void _ge_start(ui_gadget_h ug, service_h service, void *priv)
+{
+}
+
+/**
+* @brief
+*
+* @param ug
+* @param data
+* @param priv
+*/
+static void _ge_pause(ui_gadget_h ug, service_h service, void *priv)
+{
+ ge_dbg("");
+}
+
+/**
+* @brief
+*
+* @param ug
+* @param data
+* @param priv
+*/
+static void _ge_resume(ui_gadget_h ug, service_h service, void *priv)
+{
+ ge_dbg("");
+ GE_CHECK(priv);
+ ge_ugdata *ugd = (ge_ugdata *)priv;
+ /*update*/
+ if (!_ge_ug_iv_get())
+ {
+ ge_update_view(ugd, GE_UPDATE_NONE);
+ }
+}
+
+/**
+* @brief
+*
+* @param ug
+* @param data
+* @param priv
+*/
+static void _ge_destroy(ui_gadget_h ug, service_h service, void *priv)
+{
+ ge_dbgW("");
+ GE_CHECK(ug);
+ GE_CHECK(priv);
+ ge_ugdata *ugd = (ge_ugdata *)priv;
+
+ _ge_close_view(ugd);
+ ge_dbgW("End of the gallery UG!");
+}
+
+/**
+* @brief
+*
+* @param ug
+* @param msg
+* @param data
+* @param priv
+*/
+static void _ge_message(ui_gadget_h ug, service_h msg, service_h service, void *priv)
+{
+ ge_dbg("");
+}
+
+/**
+* @brief
+*
+* @param ug
+* @param event
+* @param data
+* @param priv
+*/
+static void _ge_event(ui_gadget_h ug, enum ug_event event, service_h service, void *priv)
+{
+ GE_CHECK(priv);
+ ge_ugdata *ugd = (ge_ugdata *)priv;
+ int rotate_mode = GE_ROTATE_NONE;
+
+ switch (event)
+ {
+ case UG_EVENT_LOW_MEMORY:
+ ge_dbg("UG_EVENT_LOW_MEMORY");
+ break;
+
+ case UG_EVENT_LOW_BATTERY:
+ ge_dbg("UG_EVENT_LOW_BATTERY");
+ break;
+
+ case UG_EVENT_LANG_CHANGE:
+ ge_dbg("UG_EVENT_LANG_CHANGE");
+ _ge_lang_update(ugd);
+ break;
+
+ case UG_EVENT_ROTATE_PORTRAIT:
+ ge_dbg("UG_EVENT_ROTATE_PORTRAIT");
+ rotate_mode = GE_ROTATE_PORTRAIT;
+ goto UG_ROTATE_EVENT;
+ break;
+
+ case UG_EVENT_ROTATE_PORTRAIT_UPSIDEDOWN:
+ ge_dbg("UG_EVENT_ROTATE_PORTRAIT_UPSIDEDOWN");
+ rotate_mode = GE_ROTATE_PORTRAIT_UPSIDEDOWN;
+ goto UG_ROTATE_EVENT;
+ break;
+
+ case UG_EVENT_ROTATE_LANDSCAPE:
+ ge_dbg("UG_EVENT_ROTATE_LANDSCAPE");
+ rotate_mode = GE_ROTATE_LANDSCAPE;
+ goto UG_ROTATE_EVENT;
+ break;
+
+ case UG_EVENT_ROTATE_LANDSCAPE_UPSIDEDOWN:
+ ge_dbg("UG_EVENT_ROTATE_LANDSCAPE_UPSIDEDOWN");
+ rotate_mode = GE_ROTATE_LANDSCAPE_UPSIDEDOWN;
+ goto UG_ROTATE_EVENT;
+ break;
+
+ default:
+ break;
+ }
+
+ return;
+
+UG_ROTATE_EVENT:
+
+ ge_ui_set_rotate_angle(rotate_mode);
+}
+
+static void _ge_key_event(ui_gadget_h ug, enum ug_key_event event, service_h service, void *priv)
+{
+ ge_dbg("");
+ GE_CHECK(ug);
+
+ switch (event) {
+ case UG_KEY_EVENT_END:
+ ge_dbg("Receive key end event");
+ ug_destroy_me(ug);
+ break;
+
+ default:
+ break;
+ }
+}
+
+/**
+* @brief
+*
+* @param ops
+*
+* @return
+*/
+UG_MODULE_API int UG_MODULE_INIT(struct ug_module_ops *ops)
+{
+ ge_dbgW("UG_MODULE_INIT");
+ ge_ugdata *ugd = NULL;
+ GE_CHECK_VAL(ops, -1);
+
+ ugd = calloc(1, sizeof(ge_ugdata));
+ GE_CHECK_VAL(ugd, -1);
+
+ ops->create = _ge_create;
+ ops->start = _ge_start;
+ ops->pause = _ge_pause;
+ ops->resume = _ge_resume;
+ ops->destroy = _ge_destroy;
+ ops->message = _ge_message;
+ ops->event = _ge_event;
+ ops->key_event = _ge_key_event;
+ ops->priv = ugd;
+ ops->opt = UG_OPT_INDICATOR_ENABLE;
+
+ return 0;
+}
+
+/**
+* @brief
+*
+* @param ops
+*
+* @return
+*/
+UG_MODULE_API void UG_MODULE_EXIT(struct ug_module_ops *ops)
+{
+ struct ug_data *ugd = NULL;
+ GE_CHECK(ops);
+
+ ugd = ops->priv;
+ GE_FREEIF(ugd);
+ ge_dbgW("UG_MODULE_EXIT");
+}
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "ge-debug.h"
+#include "ge-albums.h"
+#include "ge-gridview.h"
+#include "ge-ui-util.h"
+#include "ge-util.h"
+#include "ge-drm.h"
+#include "ge-data.h"
+#include "ge-strings.h"
+#include "ge-icon.h"
+#include "ge-tile.h"
+#include "ge-rotate-bg.h"
+
+static Elm_Gengrid_Item_Class album_gic;
+static int gl_albums_item_cnt;
+static ge_item* gl_album_items[GE_ALBUM_COVER_THUMB_NUM];
+static int gl_album_count;
+
+static void _ge_albums_drag_up(void *data, Evas_Object *obj, void *event_info)
+{
+ ge_dbg("");
+}
+
+static void _ge_albums_drag_right(void *data, Evas_Object *obj, void *event_info)
+{
+ ge_dbg("");
+}
+
+static void _ge_albums_drag_down(void *data, Evas_Object *obj, void *event_info)
+{
+ ge_dbg("");
+}
+
+static void _ge_albums_drag_left(void *data, Evas_Object *obj, void *event_info)
+{
+ ge_dbg("");
+}
+
+static void _ge_albums_drag_stop(void *data, Evas_Object *obj, void *event_info)
+{
+ ge_dbg("");
+}
+
+static void _ge_albums_realized(void *data, Evas_Object *obj, void *event_info)
+{
+ //ge_dbg("");
+}
+
+static void _ge_albums_selected(void *data, Evas_Object *obj, void *event_info)
+{
+ ge_dbg("");
+}
+
+static void _ge_albums_unselected(void *data, Evas_Object *obj, void *event_info)
+{
+ ge_dbg("");
+}
+
+static void _ge_albums_clicked(void *data, Evas_Object *obj, void *event_info)
+{
+ ge_dbg("");
+}
+
+static void _ge_albums_longpress(void *data, Evas_Object *obj, void *event_info)
+{
+ ge_dbg("");
+}
+
+static Eina_Bool _ge_albums_append_grid_idler(void *data)
+{
+ GE_CHECK_CANCEL(data);
+ ge_ugdata* ugd = (ge_ugdata*)data;
+
+ /* Try to get other medias from DB and append them to gridview*/
+ int ret = ge_grid_idler_append_thumbs(data);
+ if(ret != 0) {
+ ge_dbg("Failed to append grid items!");
+ } else {
+ ge_dbg("Successful to append grid items!");
+ }
+
+ /* Remove idler after all items appended */
+ GE_IF_DEL_IDLER(ugd->grid_append_idler)
+
+ return ECORE_CALLBACK_CANCEL;
+}
+
+static void __ge_albums_sel_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ GE_CHECK(data);
+ ge_cluster *album_item = (ge_cluster*)data;
+ GE_CHECK(album_item->cluster);
+ GE_CHECK(album_item->ugd);
+ ge_ugdata *ugd = album_item->ugd;
+ if(ugd->ug == NULL) {
+ ge_dbg("UG already destroyed, return!");
+ return;
+ }
+
+ if (album_item->cluster->count == 0) {
+ ge_dbgW("Empty album!");
+ return;
+ }
+
+ ge_albums_sel_album(album_item);
+}
+
+static char *__ge_albums_get_text(void *data, Evas_Object *obj, const char *part)
+{
+ GE_CHECK_NULL(part);
+ GE_CHECK_NULL(data);
+ ge_cluster *album_item = (ge_cluster *)data;
+ GE_CHECK_NULL(album_item->cluster);
+ GE_CHECK_NULL(album_item->cluster->uuid);
+ GE_CHECK_NULL(album_item->ugd);
+ ge_ugdata *ugd = album_item->ugd;
+ char buf[GE_FILE_PATH_LEN_MAX] = {0,};
+
+ if (!g_strcmp0(part, "elm.text.name"))
+ {
+ GE_CHECK_NULL(album_item->cluster->display_name);
+ if(_ge_data_is_root_path(album_item->cluster->path)) {
+ snprintf(buf, sizeof(buf), "%s", GE_ALBUM_ROOT_NAME);
+ buf[strlen(buf)] = '\0';
+ } else if(album_item->cluster->display_name &&
+ strlen(album_item->cluster->display_name)) {
+ char *new_name = _ge_ui_get_translated_album_name(album_item);
+ snprintf(buf, sizeof(buf), "%s", new_name);
+ buf[strlen(buf)] = '\0';
+ }
+
+ /* Show blue folder name */
+ if (!g_strcmp0(album_item->cluster->uuid, GE_ALBUM_ALL_ID) ||
+ _ge_data_is_default_album(GE_ALBUM_CAMERA_NAME, album_item->cluster)) {
+ Elm_Object_Item *grid_it = album_item->griditem;
+ Evas_Object *it_obj = NULL;
+ it_obj = elm_object_item_widget_get(grid_it);
+ GE_CHECK_NULL(it_obj);
+ edje_object_signal_emit(it_obj, "elm,name,show,blue",
+ "elm");
+ edje_object_message_signal_process(it_obj);
+ }
+ }
+ else if (!g_strcmp0(part, "elm.text.date"))
+ {
+ struct tm t1;
+ struct tm t2;
+ char date1[GE_ALBUM_DATE_LEN_MAX] = {0,};
+ char date2[GE_ALBUM_DATE_LEN_MAX] = {0,};
+ char date3[GE_ALBUM_DATE_LEN_MAX] = {0,};
+
+ ge_albums_free_cover_thumbs(ugd);
+
+ int item_count = GE_ALBUM_COVER_THUMB_NUM;
+ ge_item** items1 = gl_album_items;
+
+ _ge_data_get_first_several_items(ugd, album_item, items1,
+ &item_count,
+ MEDIA_CONTENT_ORDER_DESC);
+ if(item_count <= 0)
+ {
+ gl_album_count = 0;
+ return NULL;
+ }
+
+ gl_album_count = item_count;
+ if(items1[0] == NULL || items1[0]->item == NULL)
+ {
+ gl_album_count = 0;
+ return NULL;
+ }
+ memcpy(&album_item->item_mtime, &(items1[0]->item->mtime), sizeof(time_t));
+
+ item_count = 1;
+ ge_item* items2[1];
+ memset(items2, 0x00, item_count * sizeof(int));
+ _ge_data_get_first_several_items(ugd, album_item, items2,
+ &item_count,
+ MEDIA_CONTENT_ORDER_ASC);
+
+ if(item_count <= 0)
+ {
+ return NULL;
+ }
+ else
+ {
+ memset(&t1, 0x00, sizeof(struct tm));
+ localtime_r((time_t *) &(album_item->item_mtime), &t1);
+ strftime(date1, sizeof(date1), "%Y.%m.%d", &t1);
+ strftime(date3, sizeof(date3), "%Y.%m", &t1);
+
+ if(items2[0] == NULL || items2[0]->item == NULL)
+ {
+ gl_album_count = 0;
+ return NULL;
+ }
+ memset(&t2, 0x00, sizeof(struct tm));
+ localtime_r((time_t *) &(items2[0]->item->mtime), &t2);
+ strftime(date2, sizeof(date2), "%Y.%m.%d", &t2);
+
+ if(!g_strcmp0(date1, date2))
+ {
+ g_strlcpy(buf, date1, sizeof(buf));
+ }
+ else
+ {
+ strftime(date2, sizeof(date2), "%Y.%m", &t2);
+ snprintf(buf, sizeof(buf), "%s - %s", date2, date3);
+ buf[strlen(buf)] = '\0';
+ }
+ }
+
+ int i = 0;
+ for(i = 0; i < item_count; i++)
+ {
+ _ge_data_destroy_item(items2[i]);
+ items2[i] = NULL;
+ }
+ }
+ else if (!g_strcmp0(part, "elm.text.count"))
+ {
+ _ge_data_update_items_cnt(ugd, album_item);
+ snprintf(buf, sizeof(buf), "%d", (int)(album_item->cluster->count));
+ buf[strlen(buf)] = '\0';
+ }
+
+ return strdup(buf);
+}
+
+static ge_icon_type __ge_albums_set_bg_file(Evas_Object *bg, void *data)
+{
+ ge_item *git = (ge_item *)data;
+ char *bg_path = GE_DEFAULT_THUMB_ICON;
+ ge_icon_type ret_val = GE_ICON_CORRUPTED_FILE;
+
+ if (git == NULL || git->item == NULL) {
+ ge_dbgE("Invalid item :%p", git);
+ goto GE_ALBUMS_FAILED;
+ }
+
+ /* Is it DRM file? Has a valid RO? */
+ char *path = git->item->file_url;
+ if(ge_drm_is_drm_file(path) &&
+ !ge_drm_check_valid_ro(path, ge_drm_get_permtype(git->item->type))) {
+ ret_val = GE_ICON_EXPIRED_DRM;
+ goto GE_ALBUMS_FAILED;
+ }
+
+ ret_val= GE_ICON_NORMAL;
+ bg_path = _GE_GET_ICON(git->item->thumb_url);
+
+ GE_ALBUMS_FAILED:
+
+#ifdef _USE_ROTATE_BG_GE
+ _ge_rotate_bg_set_image_file(bg, bg_path);
+#else
+ elm_bg_file_set(bg, bg_path, NULL);
+#endif
+
+ return ret_val;
+}
+
+static Evas_Object *__ge_albums_get_content(void *data, Evas_Object *obj, const char *part)
+{
+ GE_CHECK_NULL(part);
+ GE_CHECK_NULL(strlen(part));
+ GE_CHECK_NULL(data);
+ ge_cluster *album_item = (ge_cluster *)data;
+ GE_CHECK_NULL(album_item->cluster);
+ GE_CHECK_NULL(album_item->ugd);
+ ge_ugdata *ugd = album_item->ugd;
+
+ GE_CHECK_NULL(album_item->cluster->uuid);
+ const char *al_id = album_item->cluster->uuid;
+ ge_dbg("");
+
+ Evas_Object *_obj = NULL;
+ if (!g_strcmp0(part, GT_TILE_ONLYICON)) {
+ _obj = _ge_tile_show_part_icon(obj, part, gl_album_count,
+ ugd->win_scale,
+ __ge_albums_set_bg_file,
+ (void **)gl_album_items);
+ } else if (!g_strcmp0(part, GT_TILE_LABEL)) {
+ /**
+ * for "Camera", its color should be
+ * 25:25:25 by new gui
+ */
+ bool b_default = false;
+ if (!g_strcmp0(al_id, GE_ALBUM_ALL_ID) ||
+ _ge_data_is_default_album(GE_ALBUM_CAMERA_NAME, album_item->cluster))
+ b_default = true;
+ _obj = _ge_tile_show_part_label(obj, album_item->index,
+ b_default);
+
+ if (album_item->cluster->count <= 0)
+ ge_dbg("Empty album");
+ }
+ return _obj;
+}
+
+static int _ge_albums_create_album(ge_ugdata* ugd, Evas_Object* parent)
+{
+ ge_dbg("");
+ GE_CHECK_VAL(parent, -1);
+ GE_CHECK_VAL(ugd, -1);
+ GE_CHECK_VAL(ugd->cluster_list, -1);
+ int i = 0;
+ int grid_cnt = 0;
+ ge_cluster *album_item = NULL;
+
+ album_gic.item_style = "albums_view";
+ album_gic.func.text_get = __ge_albums_get_text;
+ album_gic.func.content_get = __ge_albums_get_content;
+
+ int length = eina_list_count(ugd->cluster_list->clist);
+ ge_dbg("Albums list length: %d.", length);
+
+ elm_gengrid_clear(parent);
+
+ if(ugd->th)
+ {
+ elm_object_theme_set(parent, ugd->th);
+ }
+ elm_object_style_set(parent, "gallery_efl/default");
+
+ for(i = 0; i < length; i++)
+ {
+ album_item = eina_list_nth(ugd->cluster_list->clist, i);
+ GE_CHECK_VAL(album_item, -1);
+ GE_CHECK_VAL(album_item->cluster, -1);
+ GE_CHECK_VAL(album_item->cluster->display_name, -1);
+ album_item->griditem = elm_gengrid_item_append(parent,
+ &album_gic,
+ album_item,
+ __ge_albums_sel_cb,
+ album_item);
+ album_item->index = grid_cnt;
+ grid_cnt++;
+ ge_dbg("Append [%s], id=%s.", album_item->cluster->display_name,
+ album_item->cluster->uuid);
+ }
+
+ gl_albums_item_cnt = grid_cnt;
+
+ if(grid_cnt)
+ {
+ return 0;
+ }
+ else
+ {
+ ge_dbgW("None albums appended to view!");
+ return -1;
+ }
+}
+
+int ge_albums_free_cover_thumbs(ge_ugdata *ugd)
+{
+ GE_CHECK_VAL(ugd, -1);
+ int i = 0;
+
+ for(i = 0; i < GE_ALBUM_COVER_THUMB_NUM; i++)
+ {
+ if(gl_album_items[i])
+ {
+ _ge_data_destroy_item(gl_album_items[i]);
+ gl_album_items[i] = NULL;
+ }
+ }
+
+ return 0;
+}
+
+int ge_albums_back_to_view(ge_ugdata *ugd)
+{
+ ge_dbg("");
+ GE_CHECK_VAL(ugd, -1);
+
+ if(ugd->file_select_mode == GE_FILE_SELECT_T_MULTIPLE)
+ {
+ ge_ui_destroy_selinfo(ugd);
+ _ge_data_selected_list_finalize();
+ }
+
+ GE_IF_DEL_IDLER(ugd->grid_append_idler)
+
+ _ge_set_current_album(NULL);
+
+ ge_albums_update_view(ugd);
+ ge_grid_clear_view(ugd);
+
+ _ge_set_view_mode(GE_VIEW_ALBUMS);
+ return 0;
+}
+
+int ge_albums_sel_album(ge_cluster* album_item)
+{
+ ge_dbg("");
+ GE_CHECK_VAL(album_item, -1);
+ GE_CHECK_VAL(album_item->cluster, -1);
+ GE_CHECK_VAL(album_item->cluster->uuid, -1);
+ GE_CHECK_VAL(album_item->ugd, -1);
+
+ if(_ge_get_view_mode() != GE_VIEW_ALBUMS) {
+ ge_dbgE("Wrong mode!");
+ return -1;
+ } else {
+ ge_dbg("ViewMode");
+ }
+
+ ge_ugdata *ugd = album_item->ugd;
+ GE_CHECK_VAL(ugd->cluster_list, -1);
+ GE_CHECK_VAL(ugd->navi_bar, -1);
+ ge_dbg("Album: %s, id: %s.", album_item->cluster->display_name,
+ album_item->cluster->uuid);
+
+ if(ugd->album_select_mode == GE_ALBUM_SELECT_T_ONE) {
+ ge_dbg("One album selected, return album id");
+ service_add_extra_data(ugd->service,
+ GE_ALBUM_SELECT_RETURN_PATH,
+ album_item->cluster->path);
+ ge_dbg("return folder-path: %s", album_item->cluster->path);
+ ug_send_result(ugd->ug, ugd->service);
+ ug_destroy_me(ugd->ug);
+ ugd->ug = NULL;
+ return 0;
+ }
+
+ /* Set current album */
+ _ge_set_current_album(album_item);
+ /* Remove idler */
+ GE_IF_DEL_IDLER(ugd->grid_append_idler)
+ /* Get album contents from DB */
+ _ge_data_get_items_list(ugd, album_item, GE_FIRST_VIEW_START_POS,
+ GE_FIRST_VIEW_END_POS);
+
+ if(ugd->file_select_mode == GE_FILE_SELECT_T_SETAS) {
+ ge_dbg("setas mode->thumbnail is view mode");
+ _ge_set_view_mode(GE_VIEW_THUMBS);
+ } else {
+ ge_dbg("select mode->thumbnail is edit mode");
+ _ge_set_view_mode(GE_VIEW_THUMBS_EDIT);
+ }
+
+ ugd->thumbs_view_ly = ge_grid_create_ly(ugd->navi_bar);
+ GE_CHECK_VAL(ugd->thumbs_view_ly, -1);
+ Evas_Object* gv = NULL;
+
+ gv = ge_grid_create_view(ugd, ugd->thumbs_view_ly);
+ GE_CHECK_VAL(gv, -1);
+
+ elm_object_part_content_set(ugd->thumbs_view_ly, "contents", gv);
+ ugd->thumbs_view = gv;
+ if(gv == ugd->nocontents)
+ {
+ ugd->thumbs_nocontents = gv;
+ }
+
+ /* Checkme: clear albums view for animation effect pause issue */
+ elm_gengrid_clear(ugd->albums_view);
+
+ if(_ge_get_view_mode() == GE_VIEW_THUMBS) {
+ /* Check root case */
+ if(_ge_data_is_root_path(album_item->cluster->path)) {
+ ge_ui_create_title_and_push(ugd, ugd->navi_bar,
+ ugd->thumbs_view_ly,
+ GE_NAVI_THUMBS,
+ GE_ALBUM_ROOT_NAME);
+ } else {
+ char *new_name = _ge_ui_get_translated_album_name(album_item);
+ ge_ui_create_title_and_push(ugd, ugd->navi_bar,
+ ugd->thumbs_view_ly,
+ GE_NAVI_THUMBS,
+ new_name);
+ }
+ } else {
+ ge_ui_create_title_and_push(ugd, ugd->navi_bar,
+ ugd->thumbs_view_ly,
+ GE_NAVI_THUMBS,
+ ugd->albums_view_title);
+ }
+
+ if(_ge_data_get_count_all() == (GE_FIRST_VIEW_END_POS+1)) {
+ ge_dbg("\n\n>>>>>>>>Use idler to append other medias--Start>>>>>>>>\n");
+ ugd->grid_append_idler = ecore_idler_add(_ge_albums_append_grid_idler, ugd);
+ }
+
+ ge_dbg("Done ge_albums_sel_album");
+ return 0;
+}
+
+Evas_Object* ge_albums_create_ly(Evas_Object* parent)
+{
+ ge_dbg("");
+ GE_CHECK_NULL(parent);
+ Evas_Object* layout = ge_ui_load_edj(parent, GE_EDJ_FILE, GE_GRP_ALBUMVIEW);
+ GE_CHECK_NULL(layout);
+ evas_object_show (layout);
+
+ return layout;
+}
+
+int ge_albums_del_callbacks(ge_ugdata* ugd)
+{
+ GE_CHECK_VAL(ugd, -1);
+ if(ugd->albums_view)
+ {
+ ge_dbg("Delete albums callbacks!");
+ evas_object_smart_callback_del(ugd->albums_view, "selected", _ge_albums_selected);
+ evas_object_smart_callback_del(ugd->albums_view, "unselected", _ge_albums_unselected);
+ evas_object_smart_callback_del(ugd->albums_view, "clicked", _ge_albums_clicked);
+ evas_object_smart_callback_del(ugd->albums_view, "longpressed", _ge_albums_longpress);
+ evas_object_smart_callback_del(ugd->albums_view, "drag,start,up", _ge_albums_drag_up);
+ evas_object_smart_callback_del(ugd->albums_view, "drag,start,right", _ge_albums_drag_right);
+ evas_object_smart_callback_del(ugd->albums_view, "drag,start,down", _ge_albums_drag_down);
+ evas_object_smart_callback_del(ugd->albums_view, "drag,start,left", _ge_albums_drag_left);
+ evas_object_smart_callback_del(ugd->albums_view, "drag,stop", _ge_albums_drag_stop);
+ evas_object_smart_callback_del(ugd->albums_view, "realized", _ge_albums_realized);
+ }
+ return 0;
+}
+
+Evas_Object* ge_albums_create_view(ge_ugdata* ugd, Evas_Object* parent)
+{
+ ge_dbg("");
+ GE_CHECK_NULL(parent);
+ GE_CHECK_NULL(ugd);
+ GE_CHECK_NULL(ugd->cluster_list);
+
+ memset(gl_album_items, 0x00, GE_ALBUM_COVER_THUMB_NUM * sizeof(int));
+ gl_album_count = 0;
+
+ if(!ugd->cluster_list->clist ||
+ (eina_list_count(ugd->cluster_list->clist) == 0)) {
+ ge_dbgW("Clusters list is empty!");
+ goto ALBUMS_FAILED;
+ }
+
+ double scale_factor = ugd->win_scale;
+ ge_dbg("Own scale facotr: %f, elm_config_scale_get =%f.", scale_factor, elm_config_scale_get());
+
+ Evas_Object *grid = elm_gengrid_add(parent);
+ GE_CHECK_NULL(grid);
+ elm_gengrid_item_size_set(grid,
+ (int)(GE_ALBUM_ITEM_WIDTH * scale_factor),
+ (int)(GE_ALBUM_ITEM_HEIGHT * scale_factor));
+ elm_gengrid_align_set(grid, 0.5, 0.0);
+ elm_gengrid_horizontal_set(grid, EINA_FALSE);
+ elm_scroller_bounce_set(grid, EINA_FALSE, EINA_TRUE);
+ elm_gengrid_multi_select_set(grid, EINA_TRUE);
+ evas_object_size_hint_weight_set(grid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+
+ if(_ge_albums_create_album(ugd, grid) != 0)
+ {
+ ge_dbgW("Failed to append album items!");
+ evas_object_del(grid);
+ grid = NULL;
+
+ goto ALBUMS_FAILED;
+ }
+ else
+ {
+ evas_object_show (grid);
+ }
+
+ evas_object_smart_callback_add(grid, "selected", _ge_albums_selected, NULL);
+ evas_object_smart_callback_add(grid, "unselected", _ge_albums_unselected, NULL);
+ evas_object_smart_callback_add(grid, "clicked", _ge_albums_clicked, NULL);
+ evas_object_smart_callback_add(grid, "longpressed", _ge_albums_longpress, NULL);
+ evas_object_smart_callback_add(grid, "drag,start,up", _ge_albums_drag_up, NULL);
+ evas_object_smart_callback_add(grid, "drag,start,right", _ge_albums_drag_right, NULL);
+ evas_object_smart_callback_add(grid, "drag,start,down", _ge_albums_drag_down, NULL);
+ evas_object_smart_callback_add(grid, "drag,start,left", _ge_albums_drag_left, NULL);
+ evas_object_smart_callback_add(grid, "drag,stop", _ge_albums_drag_stop, NULL);
+ evas_object_smart_callback_add(grid, "realized", _ge_albums_realized, NULL);
+
+ return grid;
+
+ALBUMS_FAILED:
+ /* Show no contents if none albums exist */
+ ge_dbgW("@@@@@@@ To create nocontents view @@@@@@@@");
+ ugd->nocontents = ge_ui_create_nocontents(ugd);
+ ugd->albums_view = ugd->nocontents;
+ evas_object_show(ugd->nocontents);
+
+ return ugd->nocontents;
+}
+
+int ge_albums_update_view(ge_ugdata *ugd)
+{
+ ge_dbg("");
+ GE_CHECK_VAL(ugd, -1);
+ GE_CHECK_VAL(ugd->cluster_list, -1);
+ /* Changed to show no contents if needed */
+ if(!ugd->cluster_list->clist ||
+ (eina_list_count(ugd->cluster_list->clist) == 0)) {
+ ge_dbgW("Clusters list is empty!");
+ goto ALBUMS_FAILED;
+ }
+
+ if(ugd->nocontents && ugd->nocontents == ugd->albums_view) {
+ /* It is nocontents, unset it first then create albums view*/
+ evas_object_del(ugd->nocontents);
+ ugd->nocontents = NULL;
+
+ ugd->albums_view = ge_albums_create_view(ugd, ugd->navi_bar);
+ GE_CHECK_VAL(ugd->albums_view, -1);
+ elm_object_part_content_set(ugd->albums_view_ly, "contents",
+ ugd->albums_view);
+ evas_object_show(ugd->albums_view);
+ } else {
+ if(_ge_albums_create_album(ugd, ugd->albums_view) != 0)
+ goto ALBUMS_FAILED;
+ }
+
+ return 0;
+
+ALBUMS_FAILED:
+
+ if(ugd->albums_view && ugd->albums_view != ugd->nocontents)
+ ge_albums_del_callbacks(ugd);
+
+ evas_object_del(ugd->albums_view);
+
+ ge_dbgW("@@@@@@@ To create nocontents view @@@@@@@@");
+ ugd->nocontents = ge_ui_create_nocontents(ugd);
+ ugd->albums_view = ugd->nocontents;
+ GE_CHECK_VAL(ugd->albums_view, -1);
+ evas_object_show(ugd->albums_view);
+
+ elm_object_part_content_set(ugd->albums_view_ly, "contents",
+ ugd->albums_view);
+ return -1;
+}
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "ge-debug.h"
+#include "ge-button.h"
+
+Evas_Object *_ge_but_create_but(Evas_Object *parent, Elm_Theme *theme,
+ const char *icon, const char *text,
+ const char *style, But_Smart_Cb cb_func,
+ const void *data)
+{
+ Evas_Object *btn = NULL;
+ GE_CHECK_NULL(parent);
+
+ btn = elm_button_add(parent);
+ GE_CHECK_NULL(btn);
+ elm_object_focus_allow_set(btn, EINA_FALSE);
+
+ if (theme)
+ elm_object_theme_set(btn, theme);
+
+ if (style)
+ elm_object_style_set(btn, style);
+ evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ if (icon) {
+ ge_dbg("Button icon: %s", icon);
+ Evas_Object *ic = NULL;
+ ic = elm_icon_add(btn);
+ GE_CHECK_NULL(ic);
+ elm_image_file_set(ic, icon, NULL);
+ elm_image_aspect_fixed_set(ic, EINA_TRUE);
+ elm_image_fill_outside_set(ic, EINA_TRUE);
+ evas_object_size_hint_aspect_set(ic,
+ EVAS_ASPECT_CONTROL_VERTICAL,
+ 1, 1);
+ evas_object_size_hint_align_set(ic, EVAS_HINT_FILL,
+ EVAS_HINT_FILL);
+ evas_object_size_hint_weight_set(ic, EVAS_HINT_EXPAND,
+ EVAS_HINT_EXPAND);
+ elm_image_resizable_set(ic, EINA_TRUE, EINA_TRUE);
+ elm_object_content_set(btn, ic);
+ }
+
+ if (text) {
+ ge_dbg("Button text: %s", text);
+ elm_object_text_set(btn, text);
+ }
+
+ if (cb_func)
+ evas_object_smart_callback_add(btn, "clicked", cb_func, data);
+
+ return btn;
+}
+
--- /dev/null
+/*\r
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd\r
+ *\r
+ * Licensed under the Flora License, Version 1.1 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://floralicense.org/license/\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+#include <media_info.h>\r
+#include "ge-data-type.h"\r
+#include "ge-debug.h"\r
+\r
+int _ge_data_type_new_media(ge_media_s **item)\r
+{\r
+ GE_CHECK_VAL(item, -1);\r
+ ge_media_s *tmp_item = (ge_media_s *)calloc(1, sizeof(ge_media_s));\r
+ GE_CHECK_VAL(tmp_item, -1);\r
+ tmp_item->gtype = GE_TYPE_MEDIA;\r
+ *item = tmp_item;\r
+ return 0;\r
+}\r
+\r
+int _ge_data_type_new_album(ge_album_s **album)\r
+{\r
+ GE_CHECK_VAL(album, -1);\r
+ ge_album_s *tmp_item = (ge_album_s *)calloc(1, sizeof(ge_album_s));\r
+ GE_CHECK_VAL(tmp_item, -1);\r
+ tmp_item->gtype = GE_TYPE_ALBUM;\r
+ *album = tmp_item;\r
+ return 0;\r
+}\r
+\r
+\r
+static int __ge_data_type_free_media(ge_media_s **item)\r
+{\r
+ GE_CHECK_VAL(item, -1);\r
+ GE_CHECK_VAL(*item, -1);\r
+ ge_media_s *tmp_item = *item;\r
+\r
+ /* For local medias */\r
+ if (tmp_item->media_h)\r
+ media_info_destroy(tmp_item->media_h);\r
+\r
+ GE_FREEIF(tmp_item->uuid);\r
+ GE_FREEIF(tmp_item->thumb_url);\r
+ GE_FREEIF(tmp_item->file_url);\r
+ GE_FREEIF(tmp_item->album_uuid);\r
+ GE_FREEIF(tmp_item->display_name);\r
+\r
+ if (MEDIA_CONTENT_TYPE_IMAGE == tmp_item->type &&\r
+ tmp_item->image_info) {\r
+ /* For local medias */\r
+ if (tmp_item->image_info->image_h)\r
+ image_meta_destroy(tmp_item->image_info->image_h);\r
+\r
+ GE_FREEIF(tmp_item->image_info->media_uuid);\r
+ GE_FREE(tmp_item->image_info);\r
+ } else if (MEDIA_CONTENT_TYPE_VIDEO == tmp_item->type &&\r
+ tmp_item->video_info) {\r
+ /* For local medias */\r
+ if (tmp_item->video_info->video_h)\r
+ video_meta_destroy(tmp_item->video_info->video_h);\r
+\r
+ GE_FREEIF(tmp_item->video_info->media_uuid);\r
+ GE_FREEIF(tmp_item->video_info->title);\r
+ }\r
+\r
+ GE_FREE(tmp_item);\r
+ *item = NULL;\r
+ return 0;\r
+}\r
+\r
+int _ge_data_type_free_media_list(Eina_List **list)\r
+{\r
+ GE_CHECK_VAL(list, -1);\r
+ GE_CHECK_VAL(*list, -1);\r
+ ge_media_s *item = NULL;\r
+ Eina_List *tmp_list = *list;\r
+ EINA_LIST_FREE(tmp_list, item) {\r
+ if (item)\r
+ __ge_data_type_free_media(&item);\r
+ }\r
+ eina_list_free(*list);\r
+ *list = NULL;\r
+ return 0;\r
+}\r
+\r
+static int __ge_data_type_free_album(ge_album_s **album)\r
+{\r
+ GE_CHECK_VAL(album, -1);\r
+ GE_CHECK_VAL(*album, -1);\r
+ ge_album_s *tmp_album = *album;\r
+\r
+ GE_FREEIF(tmp_album->uuid);\r
+ GE_FREEIF(tmp_album->display_name);\r
+ GE_FREEIF(tmp_album->path);\r
+\r
+ if (tmp_album->folder_h)\r
+ media_folder_destroy(tmp_album->folder_h);\r
+ GE_FREE(tmp_album);\r
+ *album = NULL;\r
+ return 0;\r
+}\r
+\r
+int _ge_data_type_free_album_list(Eina_List **list)\r
+{\r
+ GE_CHECK_VAL(list, -1);\r
+ GE_CHECK_VAL(*list, -1);\r
+ ge_album_s *item = NULL;\r
+ Eina_List *tmp_list = *list;\r
+ EINA_LIST_FREE(tmp_list, item) {\r
+ if (item)\r
+ __ge_data_type_free_album(&item);\r
+ }\r
+ eina_list_free(*list);\r
+ *list = NULL;\r
+ return 0;\r
+}\r
+\r
+int _ge_data_type_free_geitem(void **item)\r
+{\r
+ GE_CHECK_VAL(item, -1);\r
+ GE_CHECK_VAL(*item, -1);\r
+ int ret = -1;\r
+\r
+ if(((ge_album_s *)*item)->gtype == GE_TYPE_ALBUM)\r
+ ret = __ge_data_type_free_album((ge_album_s **)item);\r
+ else if (((ge_media_s *)*item)->gtype == GE_TYPE_MEDIA)\r
+ ret = __ge_data_type_free_media((ge_media_s **)item);\r
+\r
+ if (ret < 0)\r
+ return -1;\r
+ else\r
+ return 0;\r
+}\r
+\r
+\r
+\r
--- /dev/null
+/*\r
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd\r
+ *\r
+ * Licensed under the Flora License, Version 1.1 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://floralicense.org/license/\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+#include "ge-data.h"\r
+#include "ge-debug.h"\r
+#include "ge-util.h"\r
+#include "ge-drm.h"\r
+#include "ge-strings.h"\r
+\r
+static int ge_all_count = 0;\r
+static Eina_List* ge_db_item_list = NULL;\r
+static Eina_List* ge_item_selected_list = NULL;\r
+\r
+#define ALBUM_ALL_LEN 4\r
+#define GE_DB_FILE_LEN_MAX 1024\r
+\r
+/*\r
+* create a gitem\r
+*/\r
+static ge_item* __ge_data_calloc_geitem(void)\r
+{\r
+ ge_item* gitem = (ge_item*)calloc(1, sizeof(ge_item));\r
+ GE_CHECK_NULL(gitem);\r
+ return gitem;\r
+}\r
+\r
+/*\r
+* destroy a ge_item\r
+*/\r
+static int __ge_data_free_geitem(ge_item* gitem)\r
+{\r
+ if(gitem) {\r
+ if(gitem->item) {\r
+ _ge_data_type_free_geitem((void **)&(gitem->item));\r
+ gitem->item = NULL;\r
+ }\r
+\r
+ GE_FREEIF(gitem->_reserved);\r
+ GE_FREE(gitem);\r
+ }\r
+ return 0;\r
+}\r
+\r
+static int __ge_data_free_mtype_items_list(Eina_List **elist)\r
+{\r
+ void *current = NULL;\r
+\r
+ if (elist && *elist) {\r
+ ge_dbg("Clear Mitems list.");\r
+ EINA_LIST_FREE(*elist, current) {\r
+ if (current) {\r
+ _ge_data_type_free_geitem((void **)¤t);\r
+ current = NULL;\r
+ }\r
+ }\r
+\r
+ *elist = NULL;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+static int __ge_data_free_items_list(void)\r
+{\r
+ ge_item* current = NULL;\r
+\r
+ if (ge_db_item_list) {\r
+ ge_dbg("Clear items list.");\r
+ EINA_LIST_FREE(ge_db_item_list, current) {\r
+ __ge_data_free_geitem(current);\r
+ current = NULL;\r
+ }\r
+ }\r
+ ge_db_item_list = NULL;\r
+ ge_all_count = 0;\r
+ return 0;\r
+}\r
+\r
+static int __ge_data_free_cluster(ge_cluster* gcluster)\r
+{\r
+ GE_CHECK_VAL(gcluster, -1);\r
+ if(gcluster->cluster) {\r
+ _ge_data_type_free_geitem((void **)&(gcluster->cluster));\r
+ gcluster->cluster = NULL;\r
+ }\r
+\r
+ GE_FREEIF(gcluster->_reserved);\r
+ GE_FREE(gcluster);\r
+ return 0;\r
+}\r
+\r
+static int __ge_data_free_clusters_list(ge_ugdata* ugd)\r
+{\r
+ GE_CHECK_VAL(ugd, -1);\r
+ ge_cluster* current = NULL;\r
+ Eina_List* tmp_list = NULL;\r
+\r
+ _ge_set_current_album(NULL);\r
+\r
+ if(ugd->cluster_list) {\r
+ if(ugd->cluster_list->clist) {\r
+ ge_dbg("Clear clusters list.");\r
+ tmp_list = ugd->cluster_list->clist;\r
+ EINA_LIST_FREE(tmp_list, current) {\r
+ if(current)\r
+ __ge_data_free_cluster(current);\r
+\r
+ current = NULL;\r
+ }\r
+ ugd->cluster_list->clist = NULL;\r
+ }\r
+\r
+ GE_FREE(ugd->cluster_list);\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+static ge_cluster_list* __ge_data_calloc_clusters_list(void)\r
+{\r
+ ge_cluster_list* clus_list = (ge_cluster_list*)calloc(1,\r
+ sizeof(ge_cluster_list));\r
+ GE_CHECK_NULL(clus_list);\r
+ return clus_list;\r
+}\r
+\r
+static ge_cluster* __ge_data_calloc_cluster(void)\r
+{\r
+ ge_cluster* gcluster = (ge_cluster*)calloc(1, sizeof(ge_cluster));\r
+ GE_CHECK_NULL(gcluster);\r
+ return gcluster;\r
+}\r
+\r
+/* Create 'All' album */\r
+static ge_cluster* __ge_data_new_cluster_all(ge_ugdata* ugd, int count)\r
+{\r
+ GE_CHECK_NULL(ugd);\r
+ ge_cluster* gcluster = __ge_data_calloc_cluster();\r
+ GE_CHECK_NULL(gcluster);\r
+\r
+ /* Pass -1 to get a mcluster from libmedia-info, not a real record in DB */\r
+ ge_album_s *cluster = NULL;\r
+ _ge_data_type_new_album(&cluster);\r
+ if(cluster == NULL) {\r
+ GE_FREE(gcluster);\r
+ return NULL;\r
+ }\r
+\r
+ cluster->uuid = strdup(GE_ALBUM_ALL_ID);\r
+ cluster->display_name = strdup(GE_ALBUM_ALL_NAME);\r
+ cluster->count = count;\r
+ cluster->type = GE_PHONE;\r
+ gcluster->cluster = cluster;\r
+ gcluster->ugd = ugd;\r
+ gcluster->index = 0;\r
+\r
+ return gcluster;\r
+}\r
+\r
+/* Case 1: Carema shot[0], All[1], ...; Case 2: All[0], ... */\r
+static int __ge_data_get_clusters_list(ge_ugdata* ugd)\r
+{\r
+ GE_CHECK_VAL(ugd, -1);\r
+ int length = 0;\r
+ int local_item_cnt = 0;\r
+ Eina_List *item_list = NULL;\r
+ ge_album_s *f_data = NULL;\r
+ ge_cluster *default_album = NULL;\r
+ ge_cluster* gcluster = NULL;\r
+ int medias_cnt = 0;\r
+ int err = -1;\r
+ ge_filter_s filter;\r
+\r
+ /* Get real albums */\r
+ memset(&filter, 0x00, sizeof(ge_filter_s));\r
+ g_strlcpy(filter.cond, GE_CONDITION_IMAGE_VIDEO, CONDITION_LENGTH);\r
+ if (!ugd->b_show_drm)\r
+ g_strlcat(filter.cond, GE_CONDITION_DRM,\r
+ CONDITION_LENGTH);\r
+ filter.collate_type = MEDIA_CONTENT_COLLATE_NOCASE;\r
+ filter.sort_type = MEDIA_CONTENT_ORDER_ASC;\r
+ g_strlcpy(filter.sort_keyword, FOLDER_NAME, KEYWORD_LENGTH);\r
+ filter.offset = GE_GET_ALL_RECORDS;\r
+ filter.count = GE_GET_ALL_RECORDS;\r
+ filter.with_meta = false;\r
+\r
+ err = _ge_local_data_get_album_list(&filter, &item_list);\r
+ if(err != 0) {\r
+ ge_dbgW("No record");\r
+ if (item_list)\r
+ __ge_data_free_mtype_items_list(&item_list);\r
+ } else {\r
+ memset(&filter, 0x00, sizeof(ge_filter_s));\r
+ if (ugd->file_type_mode == GE_FILE_T_IMAGE)\r
+ g_strlcpy(filter.cond, GE_CONDITION_IMAGE,\r
+ CONDITION_LENGTH);\r
+ else if (ugd->file_type_mode == GE_FILE_T_VIDEO)\r
+ g_strlcpy(filter.cond, GE_CONDITION_VIDEO,\r
+ CONDITION_LENGTH);\r
+ else\r
+ g_strlcpy(filter.cond, GE_CONDITION_IMAGE_VIDEO,\r
+ CONDITION_LENGTH);\r
+ if (!ugd->b_show_drm)\r
+ g_strlcat(filter.cond, GE_CONDITION_DRM,\r
+ CONDITION_LENGTH);\r
+ filter.sort_type = MEDIA_CONTENT_ORDER_DESC;\r
+ g_strlcpy(filter.sort_keyword, MEDIA_DISPLAY_NAME,\r
+ KEYWORD_LENGTH);\r
+ filter.offset = GE_GET_ALL_RECORDS;\r
+ filter.count = GE_GET_ALL_RECORDS;\r
+ filter.with_meta = false;\r
+ }\r
+ Eina_List* clist = ugd->cluster_list->clist;\r
+ EINA_LIST_FREE(item_list, f_data) {\r
+ if (f_data == NULL || f_data->uuid == NULL) {\r
+ /* Invalid data, next one */\r
+ ge_dbgE("Invalid ge_album_s!");\r
+ continue;\r
+ }\r
+ ge_dbg("Cluster ID: %s.", f_data->uuid);\r
+ if (f_data->count == 0) {\r
+ ge_dbgE("The count of album is zero!");\r
+ _ge_data_type_free_geitem((void **)&f_data);\r
+ continue;\r
+ }\r
+\r
+ /* only image is valid in setas mode. */\r
+ if (ugd->file_type_mode == GE_FILE_T_IMAGE ||\r
+ ugd->file_type_mode == GE_FILE_T_VIDEO) {\r
+ err = _ge_local_data_get_media_count(f_data->uuid,\r
+ &filter,\r
+ &medias_cnt);\r
+ if(err == 0) {\r
+ f_data->count = medias_cnt;\r
+ } else {\r
+ f_data->count = 0;\r
+ ge_dbgW("minfo_get_cluster_cnt[err:%d]", err);\r
+ }\r
+ }\r
+ if(f_data->count == 0) {\r
+ ge_dbgW("local album is empty, skipping it.");\r
+ _ge_data_type_free_geitem((void **)&f_data);\r
+ continue;\r
+ } else {\r
+ local_item_cnt += f_data->count;\r
+ }\r
+ gcluster = __ge_data_calloc_cluster();\r
+ if(gcluster == NULL) {\r
+ ge_dbgE("__ge_data_calloc_cluster failed!");\r
+ _ge_data_type_free_geitem((void **)&f_data);\r
+ continue;\r
+ }\r
+\r
+ gcluster->cluster = f_data;\r
+ gcluster->ugd = ugd;\r
+ length += f_data->count;\r
+\r
+ if (_ge_data_is_default_album(GE_ALBUM_CAMERA_NAME, f_data)) {\r
+ /**\r
+ * Default album: Camera Shot\r
+ * Now Camera Shot is located in Phone.\r
+ * If user can determine the location of default album,\r
+ * here we should get the path and check it's in Phone or MMC.\r
+ */\r
+ default_album = gcluster;\r
+ clist = eina_list_prepend(clist, gcluster);\r
+ } else if (_ge_data_is_default_album(GE_ALBUM_DOWNLOAD_NAME, f_data)) {\r
+ if (default_album)\r
+ clist = eina_list_append_relative(clist, gcluster,\r
+ default_album);\r
+ else\r
+ clist = eina_list_prepend(clist, gcluster);\r
+ } else {\r
+ clist = eina_list_append(clist, gcluster);\r
+ }\r
+ ugd->cluster_list->clist = clist;\r
+ }\r
+ ge_dbg("Get local clusters list Done[%d]!", local_item_cnt);\r
+ if(local_item_cnt) {\r
+ /* Create "All" album if any file exists */\r
+ gcluster = __ge_data_new_cluster_all(ugd, local_item_cnt);\r
+ GE_CHECK_VAL(gcluster, -1);\r
+\r
+ if(default_album)\r
+ clist = eina_list_append_relative(clist, gcluster,\r
+ default_album);\r
+ else\r
+ clist= eina_list_prepend(clist, gcluster);\r
+\r
+ ugd->cluster_list->clist = clist;\r
+ ge_dbg("Cluster All added!");\r
+ }\r
+\r
+ return length;\r
+}\r
+\r
+static int __ge_data_get_selected_item_id_list(Eina_List **sel_id_list)\r
+{\r
+ GE_CHECK_VAL(sel_id_list, -1);\r
+ GE_CHECK_VAL(ge_item_selected_list, -1);\r
+ ge_item *gitem = NULL;\r
+ char *item_id = NULL;\r
+\r
+ /* Save ID of selected items */\r
+ EINA_LIST_FREE(ge_item_selected_list, gitem) {\r
+ if (gitem && gitem->item && gitem->item->uuid) {\r
+ item_id = strdup(gitem->item->uuid);\r
+ //ge_dbg("Append item ID: %s", item_id);\r
+ *sel_id_list = eina_list_append(*sel_id_list,\r
+ (void *)item_id);\r
+ }\r
+ }\r
+\r
+ _ge_data_selected_list_finalize();\r
+ return 0;\r
+}\r
+\r
+/* Free list of selected IDs */\r
+static int __ge_data_free_selected_id_list(Eina_List **sel_id_list)\r
+{\r
+ GE_CHECK_VAL(sel_id_list, -1);\r
+ if (*sel_id_list == NULL) {\r
+ ge_dbg("sel_id_list is empty!");\r
+ return -1;\r
+ }\r
+\r
+ void *p_id = NULL;\r
+ EINA_LIST_FREE(*sel_id_list, p_id) {\r
+ if (p_id == NULL) {\r
+ ge_dbgE("Invalid p_id!");\r
+ continue;\r
+ }\r
+ GE_FREE(p_id);\r
+ }\r
+ *sel_id_list = NULL;\r
+ return 0;\r
+}\r
+\r
+/* Check ID is in the list or not */\r
+static bool __ge_data_check_selected_id(Eina_List **sel_id_list, const char *id)\r
+{\r
+ GE_CHECK_FALSE(sel_id_list);\r
+ GE_CHECK_FALSE(id);\r
+ Eina_List *tmp_elist = NULL;\r
+ void *p_id = NULL;\r
+\r
+ if (eina_list_count(*sel_id_list) == 0) {\r
+ ge_dbgE("sel_id_list is empty!");\r
+ return false;\r
+ }\r
+\r
+ EINA_LIST_FOREACH(*sel_id_list, tmp_elist, p_id) {\r
+ if (p_id == NULL) {\r
+ ge_dbgE("Invalid p_id!");\r
+ continue;\r
+ }\r
+ if (g_strcmp0(id, p_id)) {\r
+ p_id = NULL;\r
+ continue;\r
+ }\r
+\r
+ *sel_id_list = eina_list_remove(*sel_id_list, p_id);\r
+ GE_FREE(p_id);\r
+ return true;\r
+ }\r
+ return false;\r
+}\r
+\r
+int _ge_data_update_items_cnt(ge_ugdata* ugd, ge_cluster *album)\r
+{\r
+ GE_CHECK_VAL(album, -1);\r
+ GE_CHECK_VAL(album->cluster, -1);\r
+ GE_CHECK_VAL(album->cluster->uuid, -1);\r
+ GE_CHECK_VAL(ugd, -1);\r
+ int err = -1;\r
+ int item_count = 0;\r
+\r
+ ge_filter_s filter;\r
+ memset(&filter, 0x00, sizeof(ge_filter_s));\r
+ filter.sort_type = MEDIA_CONTENT_ORDER_DESC;\r
+ g_strlcpy(filter.sort_keyword, MEDIA_MODIFIED_TIME, KEYWORD_LENGTH);\r
+ filter.collate_type = MEDIA_CONTENT_COLLATE_NOCASE;\r
+ filter.offset = GE_GET_ALL_RECORDS;\r
+ filter.count = GE_GET_ALL_RECORDS;\r
+ g_strlcpy(filter.cond, GE_CONDITION_IMAGE_VIDEO, CONDITION_LENGTH);\r
+ filter.with_meta = false;\r
+\r
+ if(ugd->file_type_mode == GE_FILE_T_IMAGE)\r
+ g_strlcpy(filter.cond, GE_CONDITION_IMAGE, CONDITION_LENGTH);\r
+ else if(ugd->file_type_mode == GE_FILE_T_VIDEO)\r
+ g_strlcpy(filter.cond, GE_CONDITION_VIDEO, CONDITION_LENGTH);\r
+\r
+ if (!ugd->b_show_drm)\r
+ g_strlcat(filter.cond, GE_CONDITION_DRM, CONDITION_LENGTH);\r
+\r
+ if(g_strcmp0(album->cluster->uuid, GE_ALBUM_ALL_ID)) {\r
+ /* Local album */\r
+ err = _ge_local_data_get_media_count(album->cluster->uuid,\r
+ &filter,\r
+ &item_count);\r
+ } else {\r
+ /* "All albums" album */\r
+ ge_dbg("all media count");\r
+ err = _ge_local_data_get_all_media_count(&filter, &item_count);\r
+ }\r
+ if(err < 0) {\r
+ ge_dbgE("Get item count failed(%d)!", err);\r
+ return -1;\r
+ }\r
+\r
+ ge_dbg("cluster media count : old=%d, new=%d", album->cluster->count,\r
+ item_count);\r
+ album->cluster->count = item_count;\r
+\r
+ return 0;\r
+}\r
+\r
+int _ge_data_get_clusters_list(ge_ugdata* ugd)\r
+{\r
+ GE_CHECK_VAL(ugd, -1);\r
+ int n_entire_items = 0;\r
+\r
+ __ge_data_free_clusters_list(ugd);\r
+\r
+ ugd->cluster_list = __ge_data_calloc_clusters_list();\r
+ GE_CHECK_VAL(ugd->cluster_list, -1);\r
+\r
+ n_entire_items = __ge_data_get_clusters_list(ugd);\r
+ ge_dbg("Total media items count:%d", n_entire_items);\r
+ /* if error code is returned, negative value is possible */\r
+ if(n_entire_items <= 0)\r
+ return -1;\r
+\r
+ return 0;\r
+}\r
+\r
+/* Clear items list */\r
+int _ge_data_free_items_list(void)\r
+{\r
+ return __ge_data_free_items_list();\r
+}\r
+\r
+int _ge_data_get_items_list(ge_ugdata* ugd, ge_cluster *album, int start_pos,\r
+ int end_pos)\r
+{\r
+ GE_CHECK_VAL(album, -1);\r
+ GE_CHECK_VAL(album->cluster, -1);\r
+ GE_CHECK_VAL(album->cluster->uuid, -1);\r
+ GE_CHECK_VAL(ugd, -1);\r
+ Eina_List* itemlist = NULL;\r
+ int err = -1;\r
+ ge_filter_s filter;\r
+\r
+ memset(&filter, 0, sizeof(ge_filter_s));\r
+ ge_dbg("--start_pos[%d], end_pos[%d]--", start_pos, end_pos);\r
+ if(ugd->file_type_mode == GE_FILE_T_IMAGE) {\r
+ g_strlcpy(filter.cond, GE_CONDITION_IMAGE, CONDITION_LENGTH);\r
+ } else if (ugd->file_type_mode == GE_FILE_T_VIDEO) {\r
+ g_strlcpy(filter.cond, GE_CONDITION_VIDEO, CONDITION_LENGTH);\r
+ } else {\r
+ g_strlcpy(filter.cond, GE_CONDITION_IMAGE_VIDEO,\r
+ CONDITION_LENGTH);\r
+ }\r
+ if (!ugd->b_show_drm)\r
+ g_strlcat(filter.cond, GE_CONDITION_DRM, CONDITION_LENGTH);\r
+\r
+ filter.collate_type = MEDIA_CONTENT_COLLATE_NOCASE;\r
+ filter.sort_type = MEDIA_CONTENT_ORDER_DESC;\r
+ g_strlcpy(filter.sort_keyword, MEDIA_MODIFIED_TIME, KEYWORD_LENGTH);\r
+ filter.offset = start_pos;\r
+ filter.count = end_pos - start_pos + 1;\r
+ filter.with_meta = true;\r
+\r
+ if (start_pos == (GE_FIRST_VIEW_END_POS+1) &&\r
+ end_pos == GE_GET_UNTIL_LAST_RECORD) {\r
+ /* Keep medias_elist and medias_cnt unchanged */\r
+ ge_dbg("Gridview append idler; Keep ge_db_item_list unchanged.");\r
+ } else {\r
+ /*Clear item list before new one got */\r
+ __ge_data_free_items_list();\r
+ }\r
+\r
+ if(g_strcmp0(album->cluster->uuid, GE_ALBUM_ALL_ID)) {\r
+ /* real album */\r
+ ge_dbg("--Real album--");\r
+ err = _ge_local_data_get_album_media_list(album->cluster->uuid,\r
+ &filter,\r
+ &itemlist);\r
+ } else {\r
+ /* add "All" album */\r
+ ge_dbg("--Album All--");\r
+ err = _ge_local_data_get_all_albums_media_list(&filter,\r
+ &itemlist);\r
+ }\r
+\r
+ if((err == 0) && (itemlist != NULL)) {\r
+ ge_media_s *item = NULL;\r
+ ge_item* gitem = NULL;\r
+ EINA_LIST_FREE(itemlist, item)\r
+ {\r
+ if (item == NULL || item->uuid == NULL) {\r
+ ge_dbgE("Invalid item!");\r
+ continue;\r
+ }\r
+\r
+ gitem = __ge_data_calloc_geitem();\r
+ if(gitem == NULL) {\r
+ ge_dbgE("__ge_data_calloc_geitem() failed");\r
+ _ge_data_type_free_geitem((void **)&item);\r
+ continue;\r
+ }\r
+\r
+ gitem->item = item;\r
+ gitem->ugd = ugd;\r
+ ge_db_item_list = eina_list_append(ge_db_item_list,\r
+ gitem);\r
+ item = NULL;\r
+ gitem = NULL;\r
+ }\r
+\r
+ ge_all_count = eina_list_count(ge_db_item_list);\r
+ } else {\r
+ /* Free Mitems */\r
+ if (itemlist)\r
+ __ge_data_free_mtype_items_list(&itemlist);\r
+\r
+ if (start_pos == (GE_FIRST_VIEW_END_POS+1) &&\r
+ end_pos == GE_GET_UNTIL_LAST_RECORD) {\r
+ /* Keep medias_elist and medias_cnt unchanged */\r
+ ge_all_count = eina_list_count(ge_db_item_list);\r
+ ge_dbg("Gridview append idler.");\r
+ } else {\r
+ ge_all_count = 0;\r
+ }\r
+ }\r
+ ge_dbg("DB all count : %d, ge_db_item_list=%p", ge_all_count,\r
+ ge_db_item_list);\r
+\r
+ return err;\r
+}\r
+\r
+/* Update items list, especially used in thumbnails edit view */\r
+int _ge_data_update_items_list(ge_ugdata* ugd, ge_cluster *album)\r
+{\r
+ GE_CHECK_VAL(album, -1);\r
+ GE_CHECK_VAL(album->cluster, -1);\r
+ GE_CHECK_VAL(album->cluster->uuid, -1);\r
+ GE_CHECK_VAL(ugd, -1);\r
+ Eina_List* itemlist = NULL;\r
+ int err = -1;\r
+ ge_dbg("Update content of %s", album->cluster->display_name);\r
+ int view_mode = _ge_get_view_mode();\r
+ Eina_List *sel_id_list = NULL;\r
+\r
+ if (view_mode == GE_VIEW_THUMBS_EDIT &&\r
+ ugd->file_select_mode != GE_FILE_SELECT_T_ONE) {\r
+ ge_dbg("Edit view for multiple selection.");\r
+ /* Get ID list of selected items */\r
+ __ge_data_get_selected_item_id_list(&sel_id_list);\r
+ }\r
+ ge_filter_s filter;\r
+ memset(&filter, 0x00, sizeof(ge_filter_s));\r
+\r
+ if(ugd->file_type_mode == GE_FILE_T_IMAGE) {\r
+ g_strlcpy(filter.cond, GE_CONDITION_IMAGE, CONDITION_LENGTH);\r
+ } else if (ugd->file_type_mode == GE_FILE_T_VIDEO) {\r
+ g_strlcpy(filter.cond, GE_CONDITION_VIDEO, CONDITION_LENGTH);\r
+ } else {\r
+ g_strlcpy(filter.cond, GE_CONDITION_IMAGE_VIDEO,\r
+ CONDITION_LENGTH);\r
+ }\r
+\r
+ if (!ugd->b_show_drm)\r
+ g_strlcat(filter.cond, GE_CONDITION_DRM, CONDITION_LENGTH);\r
+\r
+ filter.collate_type = MEDIA_CONTENT_COLLATE_NOCASE;\r
+ filter.sort_type = MEDIA_CONTENT_ORDER_DESC;\r
+ g_strlcpy(filter.sort_keyword, MEDIA_MODIFIED_TIME, KEYWORD_LENGTH);\r
+ filter.offset = GE_GET_ALL_RECORDS;\r
+ filter.count = GE_GET_ALL_RECORDS;\r
+ filter.with_meta = true;\r
+\r
+ /*Clear item list before new one got */\r
+ __ge_data_free_items_list();\r
+\r
+ if(g_strcmp0(album->cluster->uuid, GE_ALBUM_ALL_ID)) {\r
+ err = _ge_local_data_get_album_media_list(album->cluster->uuid,\r
+ &filter,\r
+ &itemlist);\r
+ } else {\r
+ err = _ge_local_data_get_all_albums_media_list(&filter,\r
+ &itemlist);\r
+ }\r
+\r
+ if ((err != 0) || (itemlist == NULL)) {\r
+ ge_dbgE("(err != 0) || (itemlist == NULL)");\r
+ /* Free Mitems */\r
+ if (itemlist)\r
+ __ge_data_free_mtype_items_list(&itemlist);\r
+ ge_all_count = 0;\r
+ return err;\r
+ }\r
+\r
+ bool b_selected = false;\r
+ ge_media_s *item = NULL;\r
+ ge_item* gitem = NULL;\r
+ EINA_LIST_FREE(itemlist, item) {\r
+ if (item == NULL || item->uuid == NULL) {\r
+ ge_dbgE("Invalid item!");\r
+ continue;\r
+ }\r
+ gitem = __ge_data_calloc_geitem();\r
+ if(gitem == NULL) {\r
+ ge_dbgE("__ge_data_calloc_geitem() failed");\r
+ _ge_data_type_free_geitem((void **)&item);\r
+ continue;\r
+ }\r
+\r
+ gitem->item = item;\r
+ gitem->ugd = ugd;\r
+ ge_db_item_list = eina_list_append(ge_db_item_list, gitem);\r
+\r
+ if (sel_id_list) {\r
+ b_selected = __ge_data_check_selected_id(&sel_id_list,\r
+ item->uuid);\r
+ if (b_selected) {\r
+ b_selected = false;\r
+ /* Set checkbox state */\r
+ gitem->checked = true;\r
+ /* Append gitem to selected list */\r
+ _ge_data_selected_list_append(gitem);\r
+ }\r
+ }\r
+\r
+ item = NULL;\r
+ gitem = NULL;\r
+ }\r
+\r
+ /* Clear list of selected ID */\r
+ if (sel_id_list)\r
+ __ge_data_free_selected_id_list(&sel_id_list);\r
+\r
+ ge_all_count = eina_list_count(ge_db_item_list);\r
+ ge_dbg("DB all count : %d, ge_db_item_list=%p", ge_all_count,\r
+ ge_db_item_list);\r
+\r
+ return err;\r
+}\r
+\r
+int _ge_data_get_first_several_items(ge_ugdata* ugd, ge_cluster *album,\r
+ ge_item* items[], int *item_count,\r
+ media_content_order_e sort_type)\r
+{\r
+ GE_CHECK_VAL(item_count, -1);\r
+ GE_CHECK_VAL(items, -1);\r
+ GE_CHECK_VAL(album, -1);\r
+ GE_CHECK_VAL(album->cluster, -1);\r
+ GE_CHECK_VAL(album->cluster->uuid, -1);\r
+ GE_CHECK_VAL(ugd, -1);\r
+\r
+ Eina_List *item_list = NULL;\r
+ int result_cnt = 0;\r
+ ge_media_s *item = NULL;\r
+ ge_item* gitem = NULL;\r
+ int err = -1;\r
+\r
+ if (*item_count <= 0) {\r
+ ge_dbgE("*item_count <= 0");\r
+ return -1;\r
+ }\r
+\r
+ ge_filter_s filter;\r
+ memset(&filter, 0x00, sizeof(ge_filter_s));\r
+\r
+ if (ugd->file_type_mode == GE_FILE_T_IMAGE) {\r
+ g_strlcpy(filter.cond, GE_CONDITION_IMAGE, CONDITION_LENGTH);\r
+ } else if (ugd->file_type_mode == GE_FILE_T_VIDEO) {\r
+ g_strlcpy(filter.cond, GE_CONDITION_VIDEO, CONDITION_LENGTH);\r
+ } else {\r
+ g_strlcpy(filter.cond, GE_CONDITION_IMAGE_VIDEO,\r
+ CONDITION_LENGTH);\r
+ }\r
+ if (!ugd->b_show_drm)\r
+ g_strlcat(filter.cond, GE_CONDITION_DRM, CONDITION_LENGTH);\r
+\r
+ filter.collate_type = MEDIA_CONTENT_COLLATE_NOCASE;\r
+ filter.sort_type = sort_type;\r
+ g_strlcpy(filter.sort_keyword, MEDIA_MODIFIED_TIME, KEYWORD_LENGTH);\r
+ filter.offset = 0;\r
+ filter.count = *item_count;\r
+ filter.with_meta = false;\r
+\r
+ if(g_strcmp0(album->cluster->uuid, GE_ALBUM_ALL_ID)) {\r
+ /*real album */\r
+ err = _ge_local_data_get_album_media_list(album->cluster->uuid,\r
+ &filter,\r
+ &item_list);\r
+ if (err != 0 || item_list == NULL) {\r
+ ge_dbgE("Get albums media list failed[%d]!", err);\r
+ goto DB_FAILED;\r
+ }\r
+ } else {\r
+ /* add "All" album */\r
+ err = _ge_local_data_get_all_albums_media_list(&filter,\r
+ &item_list);\r
+ if (err != 0 || item_list == NULL) {\r
+ ge_dbgE("Get all albums media list failed[%d]!", err);\r
+ goto DB_FAILED;\r
+ }\r
+ }\r
+\r
+ EINA_LIST_FREE(item_list, item) {\r
+ if (item == NULL) {\r
+ ge_dbgE("Invalid ge_meida_s!");\r
+ continue;\r
+ }\r
+ result_cnt++;\r
+ if(result_cnt <= *item_count) {\r
+ gitem = NULL;\r
+ gitem = __ge_data_calloc_geitem();\r
+ if (gitem == NULL) {\r
+ ge_dbgE("__ge_data_calloc_geitem failed!");\r
+ _ge_data_type_free_geitem((void **)&item);\r
+ result_cnt--;\r
+ continue;\r
+ }\r
+ gitem->item = item;\r
+ items[result_cnt-1] = gitem;\r
+ } else {\r
+ _ge_data_type_free_geitem((void **)&item);\r
+ }\r
+ item = NULL;\r
+ }\r
+\r
+ if(*item_count > result_cnt)\r
+ *item_count = result_cnt;\r
+\r
+ ge_dbg("First %d items of [%s]", *item_count,\r
+ album->cluster->display_name);\r
+ return *item_count;\r
+\r
+ DB_FAILED:\r
+ *item_count = 0;\r
+ /* Free Mitems */\r
+ if (item_list)\r
+ __ge_data_free_mtype_items_list(&item_list);\r
+ return -1;\r
+}\r
+\r
+int _ge_data_del_media_id(ge_ugdata* ugd, const char *media_id)\r
+{\r
+ GE_CHECK_VAL(media_id, -1);\r
+ int ret = media_info_delete_from_db(media_id);\r
+ if(ret != 0) {\r
+ ge_dbgE("Delete media failed[%d]!", ret);\r
+ return -1;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+int _ge_data_item_list_remove(ge_item* gitem)\r
+{\r
+ GE_CHECK_VAL(gitem, -1);\r
+ GE_CHECK_VAL(gitem->item, -1);\r
+ GE_CHECK_VAL(gitem->item->uuid, -1);\r
+ ge_item* current = NULL;\r
+ Eina_List* l = NULL;\r
+\r
+ EINA_LIST_FOREACH(ge_db_item_list, l, current) {\r
+\r
+ if (current == NULL || current->item == NULL ||\r
+ current->item->uuid == NULL) {\r
+ ge_dbgE("Invalid gitem!");\r
+ continue;\r
+ }\r
+ if (!g_strcmp0(current->item->uuid, gitem->item->uuid)) {\r
+ ge_db_item_list = eina_list_remove(ge_db_item_list,\r
+ current);\r
+ ge_all_count--;\r
+ __ge_data_free_geitem(current);\r
+ current = NULL;\r
+ break;\r
+ }\r
+ }\r
+ return 0;\r
+}\r
+\r
+int _ge_data_destroy_item(ge_item * gitem)\r
+{\r
+ GE_CHECK_VAL(gitem, -1);\r
+\r
+ __ge_data_free_geitem(gitem);\r
+ return 0;\r
+}\r
+\r
+int _ge_data_get_item_by_index(ge_item** gitem, int idx)\r
+{\r
+ GE_CHECK_VAL(gitem, -1);\r
+\r
+ if (idx > ge_all_count) {\r
+ ge_dbgW("Get item(%d)failed!", idx);\r
+ *gitem = NULL;\r
+ return -1;\r
+ }\r
+\r
+ *gitem = eina_list_nth(ge_db_item_list, idx -1);\r
+ return 0;\r
+}\r
+\r
+int _ge_data_get_count_all(void)\r
+{\r
+ return ge_all_count;\r
+}\r
+\r
+int _ge_data_get_selected_item_by_index(ge_item** gitem, int idx)\r
+{\r
+ GE_CHECK_VAL(gitem, -1);\r
+\r
+ if (idx > _ge_data_selected_list_count()) {\r
+ ge_dbgW("Get selected item(%d)failed!", idx);\r
+ *gitem = NULL;\r
+ return -1;\r
+ }\r
+\r
+ *gitem = eina_list_nth(ge_item_selected_list, idx -1);\r
+ return 0;\r
+}\r
+\r
+int _ge_data_selected_list_count(void)\r
+{\r
+ return eina_list_count(ge_item_selected_list);\r
+}\r
+\r
+Eina_List* _ge_data_get_selected_list(void)\r
+{\r
+ return ge_item_selected_list;\r
+}\r
+\r
+int _ge_data_selected_list_append(ge_item* gitem)\r
+{\r
+ GE_CHECK_VAL(gitem, -1);\r
+\r
+ ge_item_selected_list = eina_list_append(ge_item_selected_list, gitem);\r
+ return 0;\r
+}\r
+\r
+int _ge_data_selected_list_remove(ge_item* gitem)\r
+{\r
+ GE_CHECK_VAL(gitem, -1);\r
+ GE_CHECK_VAL(gitem->item, -1);\r
+ GE_CHECK_VAL(gitem->item->uuid, -1);\r
+ ge_item* current = NULL;\r
+ Eina_List* l = NULL;\r
+\r
+ EINA_LIST_FOREACH(ge_item_selected_list, l, current) {\r
+ if(current == NULL || current->item == NULL ||\r
+ current->item->uuid == NULL) {\r
+ ge_dbgE("Invald gitem!");\r
+ continue;\r
+ }\r
+ if(!g_strcmp0(current->item->uuid, gitem->item->uuid)) {\r
+ ge_item_selected_list = eina_list_remove(ge_item_selected_list,\r
+ current);\r
+ break;\r
+ }\r
+ }\r
+ return 0;\r
+}\r
+\r
+int _ge_data_selected_list_finalize(void)\r
+{\r
+ ge_item* gitem = NULL;\r
+\r
+ EINA_LIST_FREE(ge_item_selected_list, gitem) {\r
+ if(gitem)\r
+ gitem->checked = false;\r
+ }\r
+\r
+ ge_item_selected_list = NULL;\r
+ return 0;\r
+}\r
+\r
+/*\r
+* Check it's default album[Camera shot] or not\r
+*/\r
+bool _ge_data_is_default_album(const char *match_folder, ge_album_s *album)\r
+{\r
+ GE_CHECK_FALSE(album);\r
+ GE_CHECK_FALSE(album->display_name);\r
+ GE_CHECK_FALSE(match_folder);\r
+ int ret = -1;\r
+\r
+ /* Name is 'Camera shot' and folder locates in Phone */\r
+ ret = g_strcmp0(album->display_name, match_folder);\r
+ if (ret == 0 && album->type == GE_PHONE) {\r
+ ge_dbg("Full path: %s", album->path);\r
+ /* Get parent directory */\r
+ char *parent_path = ecore_file_dir_get(album->path);\r
+ GE_CHECK_FALSE(parent_path);\r
+ ge_dbg("Parent path: %s", parent_path);\r
+\r
+ /* Parent directory is same as Phone root path, it's default folder */\r
+ ret = g_strcmp0(parent_path, GE_ROOT_PATH_PHONE);\r
+ GE_FREE(parent_path);\r
+\r
+ if (ret == 0) {\r
+ ge_dbgW("Default folder!");\r
+ return true;\r
+ }\r
+ }\r
+\r
+ return false;\r
+}\r
+\r
+bool _ge_data_is_root_path(const char *path)\r
+{\r
+ GE_CHECK_FALSE(path);\r
+\r
+ if(!g_strcmp0(GE_ROOT_PATH_PHONE, path) ||\r
+ !g_strcmp0(GE_ROOT_PATH_MMC, path)) {\r
+ ge_dbg("Root path: %s", path);\r
+ return true;\r
+ }\r
+\r
+ return false;\r
+}\r
+\r
+/* Creates a thumbnail image for given the media, asynchronously */\r
+int _ge_data_create_thumb(ge_item *gitem, media_thumbnail_completed_cb callback,\r
+ void *user_data)\r
+{\r
+ GE_CHECK_VAL(gitem, -1);\r
+ GE_CHECK_VAL(gitem->item, -1);\r
+ GE_CHECK_VAL(gitem->item->media_h, -1);\r
+ int ret = -1;\r
+ ge_dbg("File[%s]", gitem->item->file_url);\r
+\r
+ ret = media_info_create_thumbnail(gitem->item->media_h, callback,\r
+ user_data);\r
+ if (ret != MEDIA_CONTENT_ERROR_NONE) {\r
+ ge_dbgE("Failed to create thumbnail!");\r
+ return -1;\r
+ }\r
+ return 0;\r
+}\r
+\r
+int _ge_data_init(ge_ugdata* ugd)\r
+{\r
+ ge_dbg("Connect to DB!");\r
+ GE_CHECK_VAL(ugd, -1);\r
+ int err = _ge_local_data_connect();\r
+ if (err != 0) {\r
+ ge_dbgE("Local connection failed[%d]!", err);\r
+ return -1;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+int _ge_data_finalize(ge_ugdata* ugd)\r
+{\r
+ ge_dbg("Free memory and disconnect with DB!");\r
+ GE_CHECK_VAL(ugd, -1);\r
+ __ge_data_free_clusters_list(ugd);\r
+ __ge_data_free_items_list();\r
+\r
+ int err = _ge_local_data_disconnect();\r
+ if (err != 0) {\r
+ ge_dbgE("Local disconnection failed[%d]!", err);\r
+ return -1;\r
+ }\r
+ return 0;\r
+}\r
+\r
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include "ge-debug.h"
+
+#ifdef _USE_LOG_FILE_
+static char _g_file_path[GE_DB_FILE_LEN_MAX] = { 0, };
+#endif
+
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <sys/stat.h>
+#include <fcntl.h>
+#include "gallery-efl.h"
+#include "ge-ui-util.h"
+#include "ge-debug.h"
+#include "ge-drm.h"
+#include "ge-icon.h"
+
+int ge_drm_get_permtype(int gitem_type)
+{
+ switch (gitem_type) {
+ case MEDIA_CONTENT_TYPE_IMAGE:
+ return DRM_PERMISSION_TYPE_DISPLAY;
+ case MEDIA_CONTENT_TYPE_VIDEO:
+ return DRM_PERMISSION_TYPE_PLAY;
+ default:
+ return -1;
+ }
+}
+
+Eina_Bool ge_drm_check_valid_ro(const char *file_path,
+ drm_permission_type_e permType)
+{
+ GE_CHECK_FALSE(file_path);
+ ge_dbg("file_path: %s", file_path);
+ int ret = -1;
+
+ drm_license_status_e license_status = DRM_LICENSE_STATUS_UNDEFINED;
+ ret = drm_get_license_status(file_path, permType, &license_status);
+ if (DRM_RETURN_SUCCESS == ret &&
+ DRM_LICENSE_STATUS_VALID == license_status) {
+ return EINA_TRUE;
+ } else {
+ ge_dbg("No valid ro, return %d", license_status);
+ return EINA_FALSE;
+ }
+}
+
+Eina_Bool ge_drm_is_drm_file(const char* file_path)
+{
+ GE_CHECK_FALSE(file_path);
+ ge_dbg("file_path: %s.", file_path);
+
+ drm_bool_type_e is_drm_file = DRM_UNKNOWN;
+ if(drm_is_drm_file(file_path, &is_drm_file) != DRM_RETURN_SUCCESS) {
+ ge_dbgE("drm_is_drm_file error");
+ return EINA_FALSE;
+ }
+
+ if (DRM_TRUE == is_drm_file)
+ return EINA_TRUE;
+ return EINA_FALSE;
+}
+
+char* ge_drm_get_file_path(void *item)
+{
+ ge_item* gitem = (ge_item *)item;
+
+ if(!gitem || !gitem->item || !gitem->item->file_url)
+ return NULL;
+ ge_dbg("filepath: %s", gitem->item->file_url);
+
+ if(ge_drm_is_drm_file(gitem->item->file_url))
+ return strdup(GE_DEFAULT_THUMB_ICON);
+ else
+ return strdup(gitem->item->file_url);
+}
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * The Exif specification defines an Orientation Tag to indicate the orientation of the
+ * camera relative to the captured scene. This can be used by the camera either to
+ * indicate the orientation automatically by an orientation sensor,
+ * or to allow the user to indicate the orientation manually by a menu switch,
+ * without actually transforming the image data itself.
+ * Here is an explanation given by TsuruZoh Tachibanaya in
+ * his description of the Exif file format:
+ *
+ * The orientation of the camera relative to the scene, when the image was captured.
+ * The relation of the '0th row' and '0th column' to visual position is shown as below.
+ *
+ * Value 0th Row 0th Column
+ * 1 top left side
+ * 2 top right side
+ * 3 bottom right side
+ * 4 bottom left side
+ * 5 left side top
+ * 6 right side top
+ * 7 right side bottom
+ * 8 left side bottom
+ *
+ * Read this table as follows (thanks to Peter Nielsen for clarifying this - see also below):
+ * Entry #6 in the table says that the 0th row in the stored image is the right side of
+ * the captured scene, and the 0th column in the stored image is the top side of
+ * the captured scene.
+ *
+ * Here is another description given by Adam M. Costello:
+ *
+ * For convenience, here is what the letter F would look like if it were tagged correctly
+ * and displayed by a program that ignores the orientation tag
+ * (thus showing the stored image):
+ *
+ * 1 2 3 4 5 6 7 8
+ *
+ * 888888 888888 88 88 8888888888 88 88 8888888888
+ * 88 88 88 88 88 88 88 88 88 88 88 88
+ * 8888 8888 8888 8888 88 8888888888 8888888888 88
+ * 88 88 88 88
+ * 88 88 888888 888888
+*/
+
+#ifdef _USE_ROTATE_BG_GE
+
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <Elementary.h>
+#include "ge-exif.h"
+#include "ge-debug.h"
+#include "ge-data-type.h"
+
+#define GE_EXIF_BUF_LEN_MAX 65536L
+#define GE_EXIF_BUF_TIME_LEN_MAX 20
+#define GE_EXIF_DEFAULT_YEAR 1900
+
+#define GE_EXIF_SOI 0xD8
+#define GE_EXIF_TAG 0xFF
+#define GE_EXIF_APP0 0xE0
+#define GE_EXIF_APP1 0xE1
+#define GE_EXIF_JFIF_00 0x00
+#define GE_EXIF_JFIF_01 0x01
+#define GE_EXIF_JFIF_02 0x02
+
+#define GE_EXIF_IFD_DATA_FORMAT_UNSIGNED_BYTE 1
+#define GE_EXIF_IFD_DATA_FORMAT_ASCII_STRINGS 1
+#define GE_EXIF_IFD_DATA_FORMAT_UNSIGNED_SHORT 2
+#define GE_EXIF_IFD_DATA_FORMAT_UNSIGNED_LONG 4
+#define GE_EXIF_IFD_DATA_FORMAT_UNSIGNED_RATIONAL 8
+#define GE_EXIF_IFD_DATA_FORMAT_SIGNED_BYTE 1
+#define GE_EXIF_IFD_DATA_FORMAT_UNDEFINED 1
+#define GE_EXIF_IFD_DATA_FORMAT_SIGNED_SHORT 2
+#define GE_EXIF_IFD_DATA_FORMAT_SIGNED_LONG 4
+#define GE_EXIF_IFD_DATA_FORMAT_SIGNED_RATIONAL 8
+#define GE_EXIF_IFD_DATA_FORMAT_SIGNED_FLOAT 4
+#define GE_EXIF_IFD_DATA_FORMAT_DOUBLE_FLOAT 8
+
+#define GE_EXI_TMP_JPEG_FILE "/opt/usr/apps/org.tizen.gallery/data/.gallery_tmp_write_exif.jpg"
+
+/* Write one byte, testing for EOF */
+static int __ge_exif_write_1_byte(FILE *fd, int c)
+{
+ if (fputc(c, fd) < 0) {
+ ge_dbgE("fputc failed!");
+ return -1;
+ }
+
+ return 0;
+}
+
+/* Read one byte, testing for EOF */
+static int __ge_exif_read_1_byte(FILE *fd)
+{
+ int c = 0;
+
+ /* Return next input byte, or EOF if no more */
+ c = getc(fd);
+ if (c == EOF) {
+ ge_dbgE("Premature EOF in JPEG file!");
+ return -1;
+ }
+
+ return c;
+}
+
+/* Read 2 bytes, convert to unsigned int */
+/* All 2-byte quantities in JPEG markers are MSB first */
+static int __ge_exif_read_2_bytes(FILE *fd, unsigned int *len)
+{
+ int c1 = 0;
+ int c2 = 0;
+
+ /* Return next input byte, or EOF if no more */
+ c1 = getc(fd);
+ if (c1 == EOF) {
+ ge_dbgE("Premature EOF in JPEG file!");
+ return -1;
+ }
+
+ /* Return next input byte, or EOF if no more */
+ c2 = getc(fd);
+ if (c2 == EOF) {
+ ge_dbgE("Premature EOF in JPEG file!");
+ return -1;
+ }
+
+ if (len)
+ *len = (((unsigned int)c1) << 8) + ((unsigned int)c2);
+
+ return 0;
+}
+
+/* Add raw exif tag and data */
+static int __ge_exif_add_header(FILE *fd, unsigned int *orientation)
+{
+ GE_CHECK_VAL(orientation, -1);
+ GE_CHECK_VAL(fd, -1);
+ int i = 0;
+ int ret = -1;
+ char *time_buf = NULL;
+ unsigned int offset = 0;
+
+ /* raw EXIF header data */
+ const unsigned char exif1[] = {
+ GE_EXIF_TAG, GE_EXIF_SOI, GE_EXIF_TAG, GE_EXIF_APP1
+ };
+ /* Write File head, check for JPEG SOI + Exif APP1 */
+ for (i = 0; i < 4; i++) {
+ if (__ge_exif_write_1_byte(fd, exif1[i]) < 0)
+ goto GE_EXIF_FAILED;
+ }
+ /* SET the marker parameter length count */
+ /* Length includes itself, so must be at least 2
+ Following Exif data length must be at least 6; 30+36 bytes*/
+ const unsigned char exif2[] = { 0x00, 0x42 };
+ for (i = 0; i < 2; i++) {
+ if (__ge_exif_write_1_byte(fd, exif2[i]) < 0)
+ goto GE_EXIF_FAILED;
+ }
+
+ /* Write Exif head -- "Exif" */
+ const unsigned char exif3[] = { 0x45, 0x78, 0x69, 0x66, 0x00, 0x00 };
+ for (i = 0; i < 6; i++) {
+ if (__ge_exif_write_1_byte(fd, exif3[i]) < 0)
+ goto GE_EXIF_FAILED;
+ }
+
+ /* Set byte order and Tag Mark , "II(0x4949)" */
+ const unsigned char exif4[] = { 0x49, 0x49, 0x2A, 0x00 };
+ for (i = 0; i < 4; i++) {
+ if (__ge_exif_write_1_byte(fd, exif4[i]) < 0)
+ goto GE_EXIF_FAILED;
+ }
+ offset += 4;
+
+ /* Set first IFD offset (offset to IFD0) , II-08000000 */
+ const unsigned char exif5[] = { 0x08, 0x00, 0x00, 0x00 };
+ for (i = 0; i < 4; i++) {
+ if (__ge_exif_write_1_byte(fd, exif5[i]) < 0)
+ goto GE_EXIF_FAILED;
+ }
+ offset += 4;
+
+ /* IFD: Image File Directory */
+ /* Set the number of directory entries contained in this IFD, - EEEE ;
+ * 2 entry: orientation, data time */
+ const unsigned char exif6[] = { 0x02, 0x00 };
+ for (i = 0; i < 2; i++) {
+ if (__ge_exif_write_1_byte(fd, exif6[i]) < 0)
+ goto GE_EXIF_FAILED;
+ }
+ offset += 2;
+
+ /* Add Orientation Tag in IFD0; 0x0112 */
+ const unsigned char exif7[] = { 0x12, 0x01 };
+ for (i = 0; i < 2; i++) {
+ if (__ge_exif_write_1_byte(fd, exif7[i]) < 0)
+ goto GE_EXIF_FAILED;
+ }
+ offset += 2;
+
+ ge_dbg("Write: %d", *orientation);
+ const unsigned char exif8[] = { 0x03, 0x00, 0x01, 0x00, 0x00, 0x00 };
+ for (i = 0; i < 6; i++) {
+ if (__ge_exif_write_1_byte(fd, exif8[i]) < 0)
+ goto GE_EXIF_FAILED;
+ }
+ offset += 6;
+
+ /* Set the Orientation value */
+ if (__ge_exif_write_1_byte(fd, (unsigned char)(*orientation)) < 0)
+ goto GE_EXIF_FAILED;
+
+ const unsigned char exif9[] = { 0x00, 0x00, 0x00 };
+ for (i = 0; i < 3; i++) {
+ if (__ge_exif_write_1_byte(fd, exif9[i]) < 0)
+ goto GE_EXIF_FAILED;
+ }
+ offset += 4;
+
+ /* Add Data Time Tag in IFD0; 0x0132 */
+ const unsigned char exif10[] = { 0x32, 0x01 };
+ for (i = 0; i < 2; i++) {
+ if (__ge_exif_write_1_byte(fd, exif10[i]) < 0)
+ goto GE_EXIF_FAILED;
+ }
+ offset += 2;
+
+ /* Type: strings */
+ const unsigned char exif11[] = { 0x02, 0x00 };
+ for (i = 0; i < 2; i++) {
+ if (__ge_exif_write_1_byte(fd, exif11[i]) < 0)
+ goto GE_EXIF_FAILED;
+ }
+ offset += 2;
+
+ /* Data lengh, byte count */
+ const unsigned char exif12[] = { 0x14, 0x00, 0x00, 0x00 };
+ for (i = 0; i < 4; i++) {
+ if (__ge_exif_write_1_byte(fd, exif12[i]) < 0)
+ goto GE_EXIF_FAILED;
+ }
+ offset += 8;
+
+ /* 20 bytes larger than 4 bytes,
+ * so next 4 bytes is data offset start from "II"(0x4949)*/
+
+ ge_dbg("offset: %2X", offset + 8);
+ /* Too add data offset, plus 4 bytes self and plus 4 bytes IFD terminator */
+ if (__ge_exif_write_1_byte(fd, (unsigned char)(offset + 4)) < 0)
+ goto GE_EXIF_FAILED;
+
+ const unsigned char exif13[] = { 0x00, 0x00, 0x00 };
+ for (i = 0; i < 3; i++) {
+ if (__ge_exif_write_1_byte(fd, exif13[i]) < 0)
+ goto GE_EXIF_FAILED;
+ }
+
+ /*After last directory entry, there is a 4bytes of data('LLLLLLLL' at the chart),
+ * it means an offset to next IFD. If its value is '0x00000000',
+ * it means this is the last IFD and there is no linked IFD */
+ const unsigned char exif14[] = { 0x00, 0x00, 0x00, 0x00 };
+ for (i = 0; i < 4; i++) {
+ if (__ge_exif_write_1_byte(fd, exif14[i]) < 0)
+ goto GE_EXIF_FAILED;
+ }
+
+ /* Date Time of image was last modified.
+ * Data format is "YYYY:MM:DD HH:MM:SS"+0x00, total 20bytes
+ */
+ time_t t;
+ struct tm tms;
+ struct tm *tm;
+
+ t = time (NULL);
+ tm = localtime_r(&t, &tms);
+
+ time_buf = (char *)calloc(1, GE_EXIF_BUF_TIME_LEN_MAX);
+ if (time_buf == NULL) {
+ ge_dbgE("Faild to allocate memory!");
+ goto GE_EXIF_FAILED;
+ }
+ snprintf(time_buf, GE_EXIF_BUF_TIME_LEN_MAX,
+ "%04i:%02i:%02i %02i:%02i:%02i",
+ tm->tm_year + GE_EXIF_DEFAULT_YEAR, tm->tm_mon + 1,
+ tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec);
+
+ ge_dbg("time_buf: %s", time_buf);
+ if (fwrite(time_buf, 1, GE_EXIF_BUF_TIME_LEN_MAX, fd) != GE_EXIF_BUF_TIME_LEN_MAX) {
+ ge_dbgW("Write size are diff!");
+ goto GE_EXIF_FAILED;
+ }
+
+ ret = 0;
+
+ GE_EXIF_FAILED:
+
+ ge_dbg("All done");
+ GE_FREEIF(time_buf);
+ return ret;
+}
+
+/* Add exif to jfif , don't have exif */
+static int __ge_exif_add_exif_to_jfif(char *file_path, unsigned int *orientation)
+{
+ GE_CHECK_VAL(orientation, -1);
+ GE_CHECK_VAL(file_path, -1);
+ unsigned char tmp[GE_EXIF_BUF_LEN_MAX] = { 0, };
+ FILE *fd = NULL;
+ int ret = -1;
+
+ if ((fd = fopen(file_path, "rb+")) == NULL) {
+ ge_dbgE("Can't open %s!", file_path);
+ return -1;
+ }
+
+ char *tmp_file = GE_EXI_TMP_JPEG_FILE;
+ FILE *tmp_fd = NULL;
+ if ((tmp_fd = fopen(tmp_file, "wb+")) == NULL) {
+ ge_dbgE("Can't open %s!", tmp_file);
+ goto GE_EXIF_FAILED;
+ }
+
+ /* Add raw EXIF header data */
+ if (__ge_exif_add_header(tmp_fd, orientation) < 0)
+ goto GE_EXIF_FAILED;
+
+ size_t r_size = 0;
+ /* Remove start of JPEG image data section, 20 bytes */
+ r_size = fread(tmp, sizeof(char), 20, fd);
+
+ memset(tmp, 0x00, GE_EXIF_BUF_LEN_MAX);
+ /* Write JPEG image data to tmp file after EXIF header */
+ while ((r_size = fread(tmp, 1, sizeof(tmp), fd)) > 0) {
+ ge_dbg("r_size: %ld", r_size);
+ if (fwrite(tmp, 1, r_size, tmp_fd) != r_size)
+ ge_dbgW("Write and read size are diff!");
+
+ memset(tmp, 0x00, GE_EXIF_BUF_LEN_MAX);
+ }
+
+ fclose(fd);
+ fd = fopen(file_path, "wb");
+ if (!fd) {
+ ge_dbgE("Error creating file %s!", file_path);
+ goto GE_EXIF_FAILED;
+ }
+
+ memset(tmp, 0x00, GE_EXIF_BUF_LEN_MAX);
+ /* Write back tmp file after to JPEG image */
+ fseek(tmp_fd, 0, SEEK_SET);
+ while ((r_size = fread(tmp, 1, sizeof(tmp), tmp_fd)) > 0) {
+ ge_dbg("r_size: %ld", r_size);
+ if (fwrite(tmp, 1, r_size, fd) != r_size)
+ ge_dbgW("Write and read size are diff!");
+
+ memset(tmp, 0x00, GE_EXIF_BUF_LEN_MAX);
+ }
+
+ ret = 0;
+
+ GE_EXIF_FAILED:
+
+ if (fd)
+ fclose(fd);
+ if (tmp_fd)
+ fclose(tmp_fd);
+
+ /* Delete tmp file */
+ if (!ecore_file_unlink(tmp_file))
+ ge_dbgE("Delete file failed");
+
+ ge_dbg("All done");
+ return ret;
+}
+
+/* Add orientation tag to jpegs which have exif tag but do not have orientation tag: include jfif and exif*/
+static int __ge_exif_add_orientation_tag(char *file_path,
+ unsigned int *orientation){
+
+ GE_CHECK_VAL(orientation, -1);
+ GE_CHECK_VAL(file_path, -1);
+ unsigned char tmp[GE_EXIF_BUF_LEN_MAX] = { 0, };
+ FILE *fd = NULL;
+ int ret = -1;
+ int tmp_exif = -1;
+ int i = 0;
+ unsigned int length = 0;
+ bool is_motorola = false; /* Flag for byte order */
+ unsigned int offset = 0;
+ size_t r_size = 0;
+ const unsigned char ifd_data_format[13] = {
+ /*add 0 to ifd_data_format[0] ,for easy to use*/
+ 0,
+ GE_EXIF_IFD_DATA_FORMAT_UNSIGNED_BYTE,
+ GE_EXIF_IFD_DATA_FORMAT_ASCII_STRINGS,
+ GE_EXIF_IFD_DATA_FORMAT_UNSIGNED_SHORT,
+ GE_EXIF_IFD_DATA_FORMAT_UNSIGNED_LONG,
+ GE_EXIF_IFD_DATA_FORMAT_UNSIGNED_RATIONAL,
+ GE_EXIF_IFD_DATA_FORMAT_SIGNED_BYTE,
+ GE_EXIF_IFD_DATA_FORMAT_UNDEFINED,
+ GE_EXIF_IFD_DATA_FORMAT_SIGNED_SHORT,
+ GE_EXIF_IFD_DATA_FORMAT_SIGNED_LONG,
+ GE_EXIF_IFD_DATA_FORMAT_SIGNED_RATIONAL,
+ GE_EXIF_IFD_DATA_FORMAT_SIGNED_FLOAT,
+ GE_EXIF_IFD_DATA_FORMAT_DOUBLE_FLOAT
+
+ };
+
+ if ((fd = fopen(file_path, "rb+")) == NULL) {
+ ge_dbgE("Can't open %s!", file_path);
+ return -1;
+ }
+
+ char *tmp_file = GE_EXI_TMP_JPEG_FILE;
+ FILE *tmp_fd = NULL;
+ if ((tmp_fd = fopen(tmp_file, "wb+")) == NULL) {
+ ge_dbgE("Can't open %s!", tmp_file);
+ goto GE_EXIF_FAILED;
+ }
+ /* Find APP1 */
+ bool b_tag_ff = false;
+ while(1){
+ tmp_exif = __ge_exif_read_1_byte(fd);
+ if (tmp_exif < 0)
+ goto GE_EXIF_FAILED;
+
+ /*copy data from jpeg to tmp_fd (from "FF D8" to " FF E1",because those data we needn't modify)*/
+ if (__ge_exif_write_1_byte(tmp_fd, tmp_exif) < 0)
+ goto GE_EXIF_FAILED;
+
+ tmp[0] = (unsigned char)tmp_exif;
+
+ ge_dbg("- %02X", tmp[0]);
+ if (!b_tag_ff) {
+ /* Get first tag */
+ if (tmp[0] == GE_EXIF_TAG) {
+ ge_dbgW("0xFF!");
+ b_tag_ff = true;
+ }
+ continue;
+ }
+
+ /* Get APP1 */
+ if (tmp[0] == GE_EXIF_APP1) {
+ ge_dbgW("Exif in APP1!");
+ break;
+ } else {
+ ge_dbgW("0x%02X!",tmp[0]);
+ b_tag_ff = false;
+ }
+ }
+
+ /* Get the marker parameter length count */
+ if (__ge_exif_read_2_bytes(fd, &length) < 0)
+ goto GE_EXIF_FAILED;
+ ge_dbg("length: %d", length);
+ /* Length includes itself, so must be at least 2
+ Following Exif data length must be at least 6 */
+ if (length < 8) {
+ ge_dbgE("length < 8");
+ goto GE_EXIF_FAILED;
+ }
+ /*modify the marker parameter length, orientation tag is 12*/
+ length += 12;
+ ge_dbgW("modified length: %d", length);
+ tmp[0] =( length >> 8 )& 0xff ;
+ tmp[1] = length & 0xff ;
+ for(i = 0; i < 2; i++){
+ if (__ge_exif_write_1_byte(tmp_fd, tmp[i]) < 0)
+ goto GE_EXIF_FAILED;
+ }
+
+ for (i = 0; i < 6; i++) {
+ tmp_exif = __ge_exif_read_1_byte(fd);
+ if (tmp_exif < 0)
+ goto GE_EXIF_FAILED;
+
+ tmp[i] = (unsigned char)tmp_exif;
+ ge_dbg("- %02X", tmp[i]);
+ if (__ge_exif_write_1_byte(tmp_fd, tmp[i]) < 0)
+ goto GE_EXIF_FAILED;
+ }
+ if (tmp[0] == 0x45 && tmp[1] == 0x78 && tmp[2] == 0x69 && tmp[3] == 0x66 &&
+ tmp[4] == 0x00 && tmp[5] == 0x00) {
+ ge_dbgW("Met Exif!");
+ } else {
+ ge_dbgW("Not met Exif!");
+ goto GE_EXIF_FAILED;
+ }
+ /* Read Exif body */
+ for (i = 0; i < 4; i++) {
+ tmp_exif = __ge_exif_read_1_byte(fd);
+ if (tmp_exif < 0)
+ goto GE_EXIF_FAILED;
+ tmp[i] = (unsigned char)tmp_exif;
+ if (__ge_exif_write_1_byte(tmp_fd, tmp[i]) < 0)
+ goto GE_EXIF_FAILED;
+ }
+
+ /* Check byte order and Tag Mark , "II(0x4949)" or "MM(0x4d4d)" */
+ if (tmp[0] == 0x49 && tmp[1] == 0x49 && tmp[2] == 0x2A &&
+ tmp[3] == 0x00) {
+ ge_dbg("Intel");
+ is_motorola = false;
+ } else if (tmp[0] == 0x4D && tmp[1] == 0x4D && tmp[2] == 0x00 &&
+ tmp[3] == 0x2A) {
+ ge_dbg("Motorola");
+ is_motorola = true;
+ } else {
+ goto GE_EXIF_FAILED;
+ }
+
+ for (i = 0; i < 4; i++) {
+ tmp_exif = __ge_exif_read_1_byte(fd);
+ if (tmp_exif < 0)
+ goto GE_EXIF_FAILED;
+
+ tmp[i] = (unsigned char)tmp_exif;
+ ge_dbg("- %02X", tmp[i]);
+ if (__ge_exif_write_1_byte(tmp_fd, tmp[i]) < 0)
+ goto GE_EXIF_FAILED;
+ }
+
+ /* Get first IFD offset (offset to IFD0) , MM-08000000, II-00000008 */
+ if (is_motorola) {
+ if (tmp[0] != 0 && tmp[1] != 0)
+ goto GE_EXIF_FAILED;
+ offset = tmp[2];
+ offset <<= 8;
+ offset += tmp[3];
+ } else {
+ if (tmp[3] != 0 && tmp[2] != 0)
+ goto GE_EXIF_FAILED;
+ offset = tmp[1];
+ offset <<= 8;
+ offset += tmp[0];
+ }
+ ge_dbg("offset: %d", offset);
+ /*if offset >8, copy data from there to IFD start position*/
+ if(offset > 8){
+ for (i = 0; i < (offset - 8); i++) {
+ tmp_exif = __ge_exif_read_1_byte(fd);
+ if (tmp_exif < 0)
+ goto GE_EXIF_FAILED;
+
+ tmp[i] = (unsigned char)tmp_exif;
+ ge_dbg("- %02X", tmp[i]);
+ if (__ge_exif_write_1_byte(tmp_fd, tmp[i]) < 0)
+ goto GE_EXIF_FAILED;
+ }
+ }
+
+ /* IFD: Image File Directory */
+ /* Get the number of directory entries contained in this IFD, - 2 bytes, EE */
+ unsigned int tags_cnt = 0;
+ for (i = 0; i < 2; i++) {
+ tmp_exif = __ge_exif_read_1_byte(fd);
+ if (tmp_exif < 0)
+ goto GE_EXIF_FAILED;
+
+ tmp[i] = (unsigned char)tmp_exif;
+ }
+ if (is_motorola) {
+ tags_cnt = tmp[0];
+ tags_cnt <<= 8;
+ tags_cnt += tmp[1];
+ } else {
+ tags_cnt = tmp[1];
+ tags_cnt <<= 8;
+ tags_cnt += tmp[0];
+ }
+ ge_dbg("tags_cnt: %d", tags_cnt);
+ /*modify tags num,add orientation tag */
+ tags_cnt += 1;
+ ge_dbg("modified tags_cnt: %d", tags_cnt);
+ if (is_motorola) {
+ tmp[0] = (tags_cnt >> 8) & 0xff;
+ tmp[1] = tags_cnt & 0xff;
+ } else {
+ tmp[0] = tags_cnt & 0xff;
+ tmp[1] = (tags_cnt >> 8) & 0xff;
+ }
+ for (i = 0; i < 2; i++) {
+ ge_dbg("modified- %02X", tmp[i]);
+ if (__ge_exif_write_1_byte(tmp_fd, tmp[i]) < 0)
+ goto GE_EXIF_FAILED;
+
+ }
+ /* Add Orientation Tag in IFD0 */
+ unsigned int tag_num = 0;
+ unsigned char orientation_tag[12] = { 0, };
+ bool b_found_position = false;
+ int j = 0;
+ unsigned int data_type = 0;
+ unsigned int unit_num = 0;
+ unsigned int data_length = 0;
+ unsigned int offset_value = 0;
+ /*initialize orientation_tag value*/
+ if (is_motorola) {
+ orientation_tag[0] = 0x01;
+ orientation_tag[1] = 0x12;
+
+ orientation_tag[2] = 0x00;
+ orientation_tag[3] = 0x03;
+
+ orientation_tag[4] = 0x00;
+ orientation_tag[5] = 0x00;
+ orientation_tag[6] = 0x00;
+ orientation_tag[7] = 0x01;
+
+ orientation_tag[8] = 0x00;
+ orientation_tag[9] = 0x00;
+ orientation_tag[10] = 0x00;
+ orientation_tag[11] = (unsigned char)(*orientation);
+
+ } else {
+ orientation_tag[0] = 0x12;
+ orientation_tag[1] = 0x01;
+ orientation_tag[2] = 0x03;
+ orientation_tag[3] = 0x00;
+ orientation_tag[4] = 0x01;
+ orientation_tag[5] = 0x00;
+ orientation_tag[6] = 0x00;
+ orientation_tag[7] = 0x00;
+ orientation_tag[8] = (unsigned char)(*orientation);
+ orientation_tag[9] = 0x00;
+ orientation_tag[10] = 0x00;
+ orientation_tag[11] = 0x00;
+ }
+
+ while(1){
+ if (--tags_cnt == 0) {
+ break;
+ }
+
+ /* Every directory entry size is 12 */
+ for (i = 0; i < 12; i++) {
+ tmp_exif = __ge_exif_read_1_byte(fd);
+ if (tmp_exif < 0)
+ goto GE_EXIF_FAILED;
+
+ tmp[i] = (unsigned char)tmp_exif;
+ }
+ /* Get Tag number */
+ if (is_motorola) {
+ tag_num = tmp[0];
+ tag_num <<= 8;
+ tag_num += tmp[1];
+ } else {
+ tag_num = tmp[1];
+ tag_num <<= 8;
+ tag_num += tmp[0];
+ }
+ ge_dbgW("tag num %02X!" , tag_num);
+ /* to find Orientation Tag position */
+ if (tag_num < 0x0112) {
+
+ } else if (tag_num > 0x0112){
+ if(!b_found_position){
+ for(j = 0; j < 12 ;j++){
+ ge_dbg("orientation_tag- %02X", orientation_tag[j]);
+ if (__ge_exif_write_1_byte(tmp_fd, orientation_tag[j]) < 0)
+ goto GE_EXIF_FAILED;
+ }
+ b_found_position = true;
+ }
+ if (is_motorola) {
+ data_type = tmp[2];
+ data_type <<= 8;
+ data_type += tmp[3];
+
+ unit_num = tmp[4];
+ unit_num <<= 8;
+ unit_num += tmp[5];
+ unit_num <<= 8;
+ unit_num += tmp[6];
+ unit_num <<= 8;
+ unit_num += tmp[7];
+ } else {
+ data_type = tmp[3];
+ data_type <<= 8;
+ data_type += tmp[2];
+
+ unit_num = tmp[7];
+ unit_num <<= 8;
+ unit_num += tmp[6];
+ unit_num <<= 8;
+ unit_num += tmp[5];
+ unit_num <<= 8;
+ unit_num += tmp[4];
+ }
+ ge_dbgW("data_type %02X!" , data_type);
+ ge_dbgW("unit_num %02X!" , unit_num);
+ if((data_type < 1) ||(data_type > 12)){
+ ge_dbgE("Wrong data type!");
+ goto GE_EXIF_FAILED;
+ }
+
+ data_length = ifd_data_format[data_type] * unit_num;
+ ge_dbgW("data_length %02X!" , data_length);
+ /*data_length >4 ,next 4 bytes store the offset, so need to modify the offset*/
+ if(data_length > 4){
+ if (is_motorola) {
+ offset_value = tmp[8];
+ offset_value <<= 8;
+ offset_value += tmp[9];
+ offset_value <<= 8;
+ offset_value += tmp[10];
+ offset_value <<= 8;
+ offset_value += tmp[11];
+ ge_dbgW("offset_value %02X!" , offset_value);
+ /*add orientation offset*/
+ offset_value += 12;
+ ge_dbgW("changed offset_value %02X!" , offset_value);
+ tmp[8] = (offset_value >> 24) & 0xff;
+ tmp[9] = (offset_value >> 16) & 0xff;
+ tmp[10] = (offset_value >> 8) & 0xff;
+ tmp[11] = offset_value & 0xff;
+ ge_dbg("tmp[8] %02X!" , tmp[8]);
+ ge_dbg("tmp[9] %02X!" , tmp[9]);
+ ge_dbg("tmp[10] %02X!" , tmp[10]);
+ ge_dbg("tmp[11] %02X!" , tmp[11]);
+ } else {
+ offset_value = tmp[11];
+ offset_value <<= 8;
+ offset_value += tmp[10];
+ offset_value <<= 8;
+ offset_value += tmp[9];
+ offset_value <<= 8;
+ offset_value += tmp[8];
+ ge_dbgW("offset_value %02X!" , offset_value);
+ /*add orientation offset*/
+ offset_value += 12;
+ ge_dbgW("changed offset_value %02X!" , offset_value);
+
+ tmp[11] = (offset_value >> 24) & 0xff;
+ tmp[10] = (offset_value >> 16) & 0xff;
+ tmp[9] = (offset_value >> 8) & 0xff;
+ tmp[8] = offset_value & 0xff;
+ ge_dbg("tmp[8] %02X!" , tmp[8]);
+ ge_dbg("tmp[9] %02X!" , tmp[9]);
+ ge_dbg("tmp[10] %02X!" , tmp[10]);
+ ge_dbg("tmp[11] %02X!" , tmp[11]);
+
+ }
+
+ }
+
+ }
+ for(i = 0; i < 12 ;i++){
+ ge_dbg("- %02X", tmp[i]);
+ if (__ge_exif_write_1_byte(tmp_fd,tmp[i]) < 0)
+ goto GE_EXIF_FAILED;
+
+ }
+ memset(tmp, 0x00, 12);
+
+ }
+ memset(tmp, 0x00, GE_EXIF_BUF_LEN_MAX);
+ /* Write JPEG image data to tmp file after EXIF header */
+ while ((r_size = fread(tmp, 1, sizeof(tmp), fd)) > 0) {
+ ge_dbg("r_size: %ld", r_size);
+ if (fwrite(tmp, 1, r_size, tmp_fd) != r_size)
+ ge_dbgW("Write and read size are diff!");
+
+ memset(tmp, 0x00, GE_EXIF_BUF_LEN_MAX);
+ }
+ fclose(fd);
+ fd = NULL;
+ fd = fopen(file_path, "wb");
+ if (!fd) {
+ ge_dbgE("Error creating file %s!", file_path);
+ goto GE_EXIF_FAILED;
+ }
+
+ memset(tmp, 0x00, GE_EXIF_BUF_LEN_MAX);
+ /* Write back tmp file after to JPEG image */
+ fseek(tmp_fd, 0, SEEK_SET);
+ while ((r_size = fread(tmp, 1, sizeof(tmp), tmp_fd)) > 0) {
+ ge_dbg("r_size: %ld", r_size);
+ if (fwrite(tmp, 1, r_size, fd) != r_size)
+ ge_dbgW("Write and read size are diff!");
+ memset(tmp, 0x00, GE_EXIF_BUF_LEN_MAX);
+ }
+
+ ret = 0;
+
+ GE_EXIF_FAILED:
+
+ if (fd){
+ fclose(fd);
+ fd = NULL;
+ }
+
+ if (tmp_fd){
+ fclose(tmp_fd);
+ tmp_fd = NULL;
+ }
+
+ /* Delete tmp file */
+ if (!ecore_file_unlink(tmp_file))
+ ge_dbgE("Delete file failed");
+
+ ge_dbg("All done");
+ return ret;
+}
+
+static int __ge_exif_rw_jfif(FILE *fd, char *file_path,
+ unsigned int *orientation, bool b_write)
+{
+ GE_CHECK_VAL(fd, -1);
+ GE_CHECK_VAL(file_path, -1);
+ GE_CHECK_VAL(orientation, -1);
+ unsigned char tmp[GE_EXIF_BUF_LEN_MAX] = { 0, };
+ int i = 0;
+ unsigned int length = 0;
+ int tmp_exif = -1;
+ bool is_motorola = false; /* Flag for byte order */
+ unsigned int offset = 0;
+ int ret = -1;
+ /*unsigned char version = 0x00; */
+
+ if (__ge_exif_read_2_bytes(fd, &length) < 0)
+ goto GE_EXIF_FAILED;
+ ge_dbg("length: %d", length);
+
+ for (i = 0; i < 5; i++) {
+ tmp_exif = __ge_exif_read_1_byte(fd);
+ if (tmp_exif < 0)
+ goto GE_EXIF_FAILED;
+ tmp[i] = (unsigned char)tmp_exif;
+ }
+
+ /* JFIF0 */
+ if (tmp[0] != 0x4A || tmp[1] != 0x46 || tmp[2] != 0x49 ||
+ tmp[3] != 0x46 || tmp[4] != 0x00) {
+ ge_dbgE("Not met Jfif!");
+ goto GE_EXIF_FAILED;
+ }
+
+ for (i = 0; i < 2; i++) {
+ tmp_exif = __ge_exif_read_1_byte(fd);
+ if (tmp_exif < 0)
+ goto GE_EXIF_FAILED;
+ tmp[i] = (unsigned char)tmp_exif;
+ }
+
+ /* Check JFIF version */
+ if (tmp[0] == 0x01 && tmp[1] == GE_EXIF_JFIF_00) {
+ ge_dbg("Jfif 1.00");
+ } else if (tmp[0] == 0x01 && tmp[1] == GE_EXIF_JFIF_01) {
+ ge_dbg("Jfif 1.01");
+ } else if (tmp[0] == 0x01 && tmp[1] == GE_EXIF_JFIF_02) {
+ ge_dbg("Jfif 1.02");
+ } else {
+ ge_dbgE("Unknow Jfif version[%d.%d]!", tmp[0], tmp[1]);
+ goto GE_EXIF_FAILED;
+ }
+
+ /* Save version */
+ /*version = tmp[1]; */
+
+ /* Find APP1 */
+ bool b_tag_ff = false;
+ while(1) {
+ tmp_exif = __ge_exif_read_1_byte(fd);
+ if (tmp_exif < 0)
+ goto GE_EXIF_FAILED;
+
+ tmp[0] = (unsigned char)tmp_exif;
+
+ ge_dbg("- %02X", tmp[0]);
+ if (!b_tag_ff) {
+ /* Get first tag */
+ if (tmp[0] == GE_EXIF_TAG) {
+ ge_dbgW("0xFF!");
+ b_tag_ff = true;
+ }
+ continue;
+ }
+
+ /* Get APP1 */
+ if (tmp[0] == GE_EXIF_APP1) {
+ ge_dbgW("Exif in APP1!");
+ break;
+ }
+
+ ge_dbgW("No Exif in APP1!");
+
+ /* Close file */
+ fclose(fd);
+ if (!b_write) {
+ /* Normal orientation = 0degree = 1 */
+ *orientation = 1;
+ return 0;
+ }
+ return __ge_exif_add_exif_to_jfif(file_path, orientation);
+#if 0
+ if (version == GE_EXIF_JFIF_00) {
+ return __ge_exif_rw_jfif_1dot00(file_path, orientation);
+ } else if (version == GE_EXIF_JFIF_01) {
+ return __ge_exif_rw_jfif_1dot01(file_path, orientation);
+ } else {
+ return __ge_exif_rw_jfif_1dot02(file_path, orientation);
+ }
+#endif
+ }
+
+ /* Find Exif */
+ while(1) {
+ tmp_exif = __ge_exif_read_1_byte(fd);
+ if (tmp_exif < 0)
+ goto GE_EXIF_FAILED;
+
+ tmp[0] = (unsigned char)tmp_exif;
+ if (tmp[0] != 0x45)
+ continue;
+
+ for (i = 0; i < 5; i++) {
+ tmp_exif = __ge_exif_read_1_byte(fd);
+ if (tmp_exif < 0)
+ goto GE_EXIF_FAILED;
+
+ tmp[i] = (unsigned char)tmp_exif;
+ ge_dbg("- %02X", tmp[i]);
+ }
+ if (tmp[0] == 0x78 && tmp[1] == 0x69 && tmp[2] == 0x66 &&
+ tmp[3] == 0x00 && tmp[4] == 0x00) {
+ ge_dbgW("Met Exif!");
+ break;
+ } else {
+ ge_dbgW("Not met Exif!");
+ goto GE_EXIF_FAILED;
+ }
+ }
+
+ /* Read Exif body */
+ for (i = 0; i < 4; i++) {
+ tmp_exif = __ge_exif_read_1_byte(fd);
+ if (tmp_exif < 0)
+ goto GE_EXIF_FAILED;
+ tmp[i] = (unsigned char)tmp_exif;
+ }
+
+ /* Check byte order and Tag Mark , "II(0x4949)" or "MM(0x4d4d)" */
+ if (tmp[0] == 0x49 && tmp[1] == 0x49 && tmp[2] == 0x2A &&
+ tmp[3] == 0x00) {
+ ge_dbg("Intel");
+ is_motorola = false;
+ } else if (tmp[0] == 0x4D && tmp[1] == 0x4D && tmp[2] == 0x00 &&
+ tmp[3] == 0x2A) {
+ ge_dbg("Motorola");
+ is_motorola = true;
+ } else {
+ goto GE_EXIF_FAILED;
+ }
+
+ for (i = 0; i < 4; i++) {
+ tmp_exif = __ge_exif_read_1_byte(fd);
+ if (tmp_exif < 0)
+ goto GE_EXIF_FAILED;
+
+ tmp[i] = (unsigned char)tmp_exif;
+ ge_dbg("- %02X", tmp[i]);
+ }
+
+ /* Get first IFD offset (offset to IFD0) , MM-08000000, II-00000008 */
+ if (is_motorola) {
+ if (tmp[0] != 0 && tmp[1] != 0)
+ goto GE_EXIF_FAILED;
+ offset = tmp[2];
+ offset <<= 8;
+ offset += tmp[3];
+ } else {
+ if (tmp[3] != 0 && tmp[2] != 0)
+ goto GE_EXIF_FAILED;
+ offset = tmp[1];
+ offset <<= 8;
+ offset += tmp[0];
+ }
+ ge_dbg("offset: %d", offset);
+
+ /* IFD: Image File Directory */
+ /* Get the number of directory entries contained in this IFD, - 2 bytes, EE */
+ unsigned int tags_cnt = 0;
+ for (i = 0; i < 2; i++) {
+ tmp_exif = __ge_exif_read_1_byte(fd);
+ if (tmp_exif < 0)
+ goto GE_EXIF_FAILED;
+
+ tmp[i] = (unsigned char)tmp_exif;
+ }
+ if (is_motorola) {
+ tags_cnt = tmp[0];
+ tags_cnt <<= 8;
+ tags_cnt += tmp[1];
+ } else {
+ tags_cnt = tmp[1];
+ tags_cnt <<= 8;
+ tags_cnt += tmp[0];
+ }
+ ge_dbg("tags_cnt: %d", tags_cnt);
+ if (tags_cnt == 0) {
+ ge_dbgE("tags_cnt == 0 - 2");
+ goto GE_EXIF_FAILED;
+ }
+
+ /* Search for Orientation Tag in IFD0 */
+ unsigned int tag_num = 0;
+ while (1) {
+ /* Every directory entry size is 12 */
+ for (i = 0; i < 12; i++) {
+ tmp_exif = __ge_exif_read_1_byte(fd);
+ if (tmp_exif < 0)
+ goto GE_EXIF_FAILED;
+
+ tmp[i] = (unsigned char)tmp_exif;
+ }
+ /* Get Tag number */
+ if (is_motorola) {
+ tag_num = tmp[0];
+ tag_num <<= 8;
+ tag_num += tmp[1];
+ } else {
+ tag_num = tmp[1];
+ tag_num <<= 8;
+ tag_num += tmp[0];
+ }
+ /* found Orientation Tag */
+ if (tag_num == 0x0112) {
+ ge_dbgW("Found orientation tag!");
+ break;
+ }
+ if (--tags_cnt == 0) {
+ ge_dbgW("tags_cnt == 0, no found orientation tag!");
+ if (b_write) {
+ ge_dbgW("to add an orientation tag!");
+ fclose(fd);
+ fd = NULL;
+ return __ge_exif_add_orientation_tag(file_path, orientation);
+
+ } else{
+ /* Normal orientation = 0degree = 1 */
+ *orientation = 1;
+ ret = 0;
+ }
+ goto GE_EXIF_FAILED;
+ }
+ }
+
+ /* |TT|ff|NNNN|DDDD| --- TT - 2 bytes, tag NO. ;ff - 2 bytes, data format
+ NNNN - 4 bytes, entry count; DDDD - 4 bytes Data value */
+ if (b_write) {
+ ge_dbg("Write: %d", *orientation);
+ /* Set the Orientation value */
+ if (is_motorola)
+ tmp[9] = (unsigned char)(*orientation);
+ else
+ tmp[8] = (unsigned char)(*orientation);
+
+ /* Move pointer back to the entry start point */
+ if (fseek(fd, -12, SEEK_CUR) < 0) {
+ ge_dbgE("fseek failed!");
+ goto GE_EXIF_FAILED;
+ }
+ fwrite(tmp, 1, 10, fd);
+ } else {
+ /* Get the Orientation value */
+ if (is_motorola) {
+ if (tmp[8] != 0) {
+ ge_dbgE("tmp[8] != 0");
+ goto GE_EXIF_FAILED;
+ }
+ *orientation = (unsigned int)tmp[9];
+ } else {
+ if (tmp[9] != 0) {
+ ge_dbgE("tmp[9] != 0");
+ goto GE_EXIF_FAILED;
+ }
+ *orientation = (unsigned int)tmp[8];
+ }
+ if (*orientation > 8) {
+ ge_dbgE("*orient > 8");
+ goto GE_EXIF_FAILED;
+ }
+ ge_dbg("Read: %d", *orientation);
+ }
+
+ ret = 0;
+
+ GE_EXIF_FAILED:
+
+ fclose(fd);
+ ge_dbg("All done");
+ return ret;
+}
+
+static int __ge_exif_rw_orient(char *file_path, unsigned int *orient, bool b_write)
+{
+ GE_CHECK_VAL(file_path, -1);
+ ge_dbg("b_write: %d", b_write);
+ unsigned int length = 0;
+ unsigned int i = 0;
+ bool is_motorola = false; /* Flag for byte order */
+ unsigned int offset = 0;
+ unsigned int jfif_offset = 0;
+ unsigned int tags_cnt = 0;
+ unsigned int tag_num = 0;
+ int tmp_exif = -1;
+ unsigned char exif_data[GE_EXIF_BUF_LEN_MAX] = { 0, };
+ FILE *fd = NULL;
+ int ret = -1;
+
+ if (b_write) {
+ if ((fd = fopen(file_path, "rb+")) == NULL) {
+ ge_dbgE("Can't open %s!", file_path);
+ return -1;
+ }
+ } else {
+ if ((fd = fopen(file_path, "rb")) == NULL) {
+ ge_dbgE("Can't open %s!", file_path);
+ return -1;
+ }
+ }
+
+ /* Read File head, check for JPEG SOI + Exif APP1 */
+ for (i = 0; i < 4; i++) {
+ tmp_exif = __ge_exif_read_1_byte(fd);
+ if (tmp_exif < 0)
+ goto GE_EXIF_FAILED;
+
+ exif_data[i] = (unsigned char)tmp_exif;
+ }
+
+ if (exif_data[0] == GE_EXIF_TAG && exif_data[1] == GE_EXIF_SOI) {
+ ge_dbg("JPEG file");
+ } else {
+ ge_dbgE("Not a JPEG file!");
+ goto GE_EXIF_FAILED;
+ }
+
+ if (exif_data[2] == GE_EXIF_TAG && exif_data[3] == GE_EXIF_APP1) {
+ ge_dbgW("Exif in APP1!");
+ } else if (exif_data[2] == GE_EXIF_TAG &&
+ exif_data[3] == GE_EXIF_APP0) {
+ ge_dbgW("Jfif in APP0!");
+ int ret = __ge_exif_rw_jfif(fd, file_path, orient, b_write);
+ return ret;
+ } else {
+ ge_dbgE("Not a Exif in APP1 or Jiff in APP2[%d]!", exif_data[3]);
+ goto GE_EXIF_FAILED;
+ }
+
+ /* Get the marker parameter length count */
+ if (__ge_exif_read_2_bytes(fd, &length) < 0)
+ goto GE_EXIF_FAILED;
+ ge_dbg("length: %d", length);
+ /* Length includes itself, so must be at least 2
+ Following Exif data length must be at least 6 */
+ if (length < 8) {
+ ge_dbgE("length < 8");
+ goto GE_EXIF_FAILED;
+ }
+ length -= 8;
+
+ /* Length of an IFD entry */
+ if (length < 12) {
+ ge_dbgE("length < 12");
+ goto GE_EXIF_FAILED;
+ }
+
+ /* Read Exif head, check for "Exif" */
+ for (i = 0; i < 6; i++) {
+ tmp_exif = __ge_exif_read_1_byte(fd);
+ if (tmp_exif < 0)
+ goto GE_EXIF_FAILED;
+
+ exif_data[i] = (unsigned char)tmp_exif;
+ ge_dbg("- %02X", exif_data[i]);
+ }
+
+ if (exif_data[0] != 0x45 || exif_data[1] != 0x78 ||
+ exif_data[2] != 0x69 || exif_data[3] != 0x66 ||
+ exif_data[4] != 0x00 || exif_data[5] != 0x00) {
+ ge_dbgE("Not met Exif!");
+ goto GE_EXIF_FAILED;
+ }
+
+ /* Read Exif body */
+ for (i = 0; i < length; i++) {
+ tmp_exif = __ge_exif_read_1_byte(fd);
+ if (tmp_exif < 0)
+ goto GE_EXIF_FAILED;
+ exif_data[i] = (unsigned char)tmp_exif;
+ }
+
+ /* Check byte order and Tag Mark , "II(0x4949)" or "MM(0x4d4d)" */
+ if (exif_data[0] == 0x49 && exif_data[1] == 0x49 &&
+ exif_data[2] == 0x2A && exif_data[3] == 0x00) {
+ ge_dbg("Intel");
+ is_motorola = false;
+ } else if (exif_data[0] == 0x4D && exif_data[1] == 0x4D &&
+ exif_data[2] == 0x00 && exif_data[3] == 0x2A) {
+ ge_dbg("Motorola");
+ is_motorola = true;
+ } else {
+ goto GE_EXIF_FAILED;
+ }
+
+ /* Get first IFD offset (offset to IFD0) , MM-00000008, II-08000000 */
+ if (is_motorola) {
+ if (exif_data[4] != 0 && exif_data[5] != 0)
+ goto GE_EXIF_FAILED;
+ offset = exif_data[6];
+ offset <<= 8;
+ offset += exif_data[7];
+ } else {
+ if (exif_data[7] != 0 && exif_data[6] != 0)
+ goto GE_EXIF_FAILED;
+ offset = exif_data[5];
+ offset <<= 8;
+ offset += exif_data[4];
+ }
+ /* check end of data segment */
+ if (offset > length - 2) {
+ ge_dbgE("offset > length - 2");
+ goto GE_EXIF_FAILED;
+ }
+
+ /* IFD: Image File Directory */
+ /* Get the number of directory entries contained in this IFD, - EEEE */
+ if (is_motorola) {
+ tags_cnt = exif_data[offset];
+ tags_cnt <<= 8;
+ tags_cnt += exif_data[offset+1];
+ } else {
+ tags_cnt = exif_data[offset+1];
+ tags_cnt <<= 8;
+ tags_cnt += exif_data[offset];
+ }
+ if (tags_cnt == 0) {
+ ge_dbgE("tags_cnt == 0 - 2");
+ goto GE_EXIF_FAILED;
+ }
+ offset += 2;
+
+ /* check end of data segment */
+ if (offset > length - 12) {
+ ge_dbgE("offset > length - 12");
+ goto GE_EXIF_FAILED;
+ }
+
+ /* Search for Orientation Tag in IFD0 */
+ while (1) {
+ /* Get Tag number */
+ if (is_motorola) {
+ tag_num = exif_data[offset];
+ tag_num <<= 8;
+ tag_num += exif_data[offset+1];
+ } else {
+ tag_num = exif_data[offset+1];
+ tag_num <<= 8;
+ tag_num += exif_data[offset];
+ }
+ /* found Orientation Tag */
+ if (tag_num == 0x0112) {
+ ge_dbgW("Found orientation tag!");
+ break;
+ }
+ if (--tags_cnt == 0) {
+ ge_dbgW("tags_cnt == 0, no found orientation tag!");
+ if (b_write) {
+ ge_dbgW("to add an orientation tag!");
+ fclose(fd);
+ fd = NULL;
+ return __ge_exif_add_orientation_tag(file_path, orient);
+
+ } else{
+ /* Normal orientation = 0degree = 1 */
+ *orient = 1;
+ ret = 0;
+ }
+ goto GE_EXIF_FAILED;
+ }
+
+ /* Every directory entry size is 12 */
+ offset += 12;
+ }
+
+ if (b_write) {
+ ge_dbg("Write: %d", *orient);
+ /* Set the Orientation value */
+ if (is_motorola)
+ exif_data[offset+9] = (unsigned char)(*orient);
+ else
+ exif_data[offset+8] = (unsigned char)(*orient);
+
+ if (fseek(fd, jfif_offset + (4 + 2 + 6 + 2) + offset, SEEK_SET) < 0) {
+ ge_dbgE("fseek failed!");
+ goto GE_EXIF_FAILED;
+ }
+ fwrite(exif_data + 2 + offset, 1, 10, fd);
+ } else {
+ /* Get the Orientation value */
+ if (is_motorola) {
+ if (exif_data[offset+8] != 0) {
+ ge_dbgE("exif_data[offset+8] != 0");
+ goto GE_EXIF_FAILED;
+ }
+ *orient = (unsigned int)exif_data[offset+9];
+ } else {
+ if (exif_data[offset+9] != 0) {
+ ge_dbgE("exif_data[offset+9] != 0");
+ goto GE_EXIF_FAILED;
+ }
+ *orient = (unsigned int)exif_data[offset+8];
+ }
+ if (*orient > 8) {
+ ge_dbgE("*orient > 8");
+ goto GE_EXIF_FAILED;
+ }
+ ge_dbg("Read: %d", *orient);
+ }
+
+ ret = 0;
+
+ GE_EXIF_FAILED:
+
+ fclose(fd);
+ ge_dbg("All done");
+ return ret;
+}
+
+int _ge_exif_get_orientation(char *file_path, unsigned int *orientation)
+{
+ GE_CHECK_VAL(orientation, -1);
+ GE_CHECK_VAL(file_path, -1);
+ ge_dbg("file_path: %s", file_path);
+
+ return __ge_exif_rw_orient(file_path, orientation, false);
+}
+
+#endif
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <Ecore_X.h>
+#include "ge-ext-ug-load.h"
+#include "ge-debug.h"
+#include "ge-ui-util.h"
+#include "ge-util.h"
+#include "ge-albums.h"
+#include "ge-gridview.h"
+
+#define GE_IV_UG_NAME "image-viewer-efl"
+#define GE_IV_STR_LEN_MAX 32
+
+static bool ge_destroy_me = false;
+
+static void _ge_ext_destroy_me(ge_ugdata *ugd)
+{
+ ge_dbg("");
+ GE_CHECK(ugd);
+ GE_CHECK(ugd->ug_called_by_me);
+ GE_CHECK(ugd->ug);
+ GE_CHECK(ugd->service);
+ bool send_result = false;
+
+ if (_ge_ug_iv_get())
+ {
+ _ge_ug_iv_set(false);
+ }
+
+ if(ge_destroy_me == false)
+ {
+ ge_dbg("Destroy ug_called_by_me");
+ ug_destroy(ugd->ug_called_by_me);
+ ugd->ug_called_by_me = NULL;
+ }
+ if(ugd->file_select_mode == GE_FILE_SELECT_T_SETAS)
+ {
+ if(ugd->file_setas_image_path)
+ {
+ ge_dbg("GE_SETAS_IMAGE_PATH:%s", ugd->file_setas_image_path);
+ service_add_extra_data(ugd->service,
+ GE_SETAS_IMAGE_PATH,
+ ugd->file_setas_image_path);
+
+ GE_FREE(ugd->file_setas_image_path);
+ send_result = true;
+ }
+
+ if(ugd->file_setas_crop_image_path &&
+ (ugd->file_select_setas_mode == GE_SETAS_T_CALLERID ||
+ ugd->file_select_setas_mode == GE_SETAS_T_CROP_WALLPAPER)) {
+ ge_dbg("GE_SETAS_CALLERID_CROP_IMAGE_PATH:%s",
+ ugd->file_setas_crop_image_path);
+ service_add_extra_data(ugd->service,
+ GE_SETAS_CALLERID_CROP_IMAGE_PATH,
+ ugd->file_setas_crop_image_path);
+
+ GE_FREE(ugd->file_setas_crop_image_path);
+ send_result = true;
+ }
+
+ if(send_result)
+ {
+ ge_dbg("Call ug_send_result() to send result.");
+ ug_send_result(ugd->ug, ugd->service);
+ }
+ }
+
+ if(ge_destroy_me)
+ {
+ ge_dbg("Setting is appllied, destroy gallery UG.");
+ ge_destroy_me = false;
+ /* Destroy self */
+ ug_destroy_me(ugd->ug);
+ /* ug_called_by_me would be destroyed by ui-gadget */
+ ugd->ug_called_by_me = NULL;
+ }
+ else
+ {
+ ge_dbg("Cancel button tapped, back to thumbnails view.");
+ }
+}
+
+static void _ge_ext_iv_layout_cb(ui_gadget_h ug, enum ug_mode mode, void* priv)
+{
+ ge_dbg("");
+ GE_CHECK(ug);
+
+ Evas_Object *base = (Evas_Object *) ug_get_layout(ug);
+ if (!base) {
+ ge_dbgE("ug_get_layout failed!");
+ ug_destroy(ug);
+ return;
+ }
+
+ evas_object_size_hint_weight_set(base, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ /* Disable effect to avoid BS caused by ui-gadget to
+ unset ug layout after deleting it */
+ ug_disable_effect(ug);
+ evas_object_show(base);
+}
+
+static void _ge_ext_iv_result_cb(ui_gadget_h ug, service_h result, void *priv)
+{
+ ge_dbg("");
+ GE_CHECK(priv);
+ GE_CHECK(result);
+ ge_ugdata *ugd = (ge_ugdata *)priv;
+ char* path = NULL;
+
+ if(ugd->file_select_mode == GE_FILE_SELECT_T_SETAS)
+ {
+ service_get_extra_data(result, GE_IMAGEVIEWER_IMAGE_PATH, &path);
+ ge_dbg("SETAS_IMAGE_PATH");
+ ge_destroy_me = true;
+ if(path)
+ {
+ ge_dbg(":%s", path);
+ ugd->file_setas_image_path = path;
+ path = NULL;
+ }
+
+ if(ugd->file_select_setas_mode == GE_SETAS_T_CALLERID ||
+ ugd->file_select_setas_mode == GE_SETAS_T_CROP_WALLPAPER) {
+ service_get_extra_data(result,
+ GE_IMAGEVIEWER_CROP_IMAGE_PATH,
+ &path);
+ ge_dbg("CALLERID_CROP_IMAGE_PATH");
+ if(path)
+ {
+ ge_dbg(":%s", path);
+ ugd->file_setas_crop_image_path = path;
+ }
+ }
+ }
+
+ char *error_state = NULL;
+ service_get_extra_data(result, GE_IMAGEVIEWER_RETURN_ERROR,
+ &error_state);
+ if (error_state)
+ {
+ ge_dbg("error string : %s", error_state);
+
+ if (!g_strcmp0(error_state, "not_supported_file_type")) {
+ ge_destroy_me = FALSE;
+ ge_item* cur_item = _ge_get_current_item();
+ if(cur_item == NULL || cur_item->item == NULL ||
+ cur_item->item->file_url == NULL) {
+ ge_dbgE("current item is NULL");
+ GE_FREE(error_state);
+ return;
+ }
+ service_h service;
+ service_create(&service);
+ GE_CHECK(service);
+ service_set_operation(service, SERVICE_OPERATION_VIEW);
+ service_set_uri(service, cur_item->item->file_url);
+ service_send_launch_request(service, NULL, NULL);
+ service_destroy(service);
+ }
+ GE_FREE(error_state);
+ }
+}
+
+static void _ge_ext_iv_destroy_cb(ui_gadget_h ug, void *priv)
+{
+ ge_dbg("");
+ GE_CHECK(priv);
+ ge_ugdata *ad = (ge_ugdata *) priv;
+
+ _ge_ext_destroy_me(ad);
+}
+
+int ge_ext_load_iv_ug(ge_ugdata* ugd)
+{
+ ge_dbg("");
+ GE_CHECK_VAL(ugd, -1);
+
+ struct ug_cbs cbs;
+ ui_gadget_h ug = NULL;
+ service_h service = NULL;
+
+ if(ugd->ug_called_by_me)
+ {
+ ge_dbg("Already exits some UG called by me");
+ return -1;
+ }
+
+ ge_item* cur_item = _ge_get_current_item();
+ if(cur_item == NULL || cur_item->item == NULL)
+ {
+ ge_dbg("current item is NULL");
+ return -1;
+ }
+ memset(&cbs,0x00,sizeof(struct ug_cbs));
+ cbs.layout_cb = _ge_ext_iv_layout_cb;
+ cbs.result_cb = _ge_ext_iv_result_cb;
+ cbs.destroy_cb = _ge_ext_iv_destroy_cb;
+ cbs.priv = ugd;
+
+ service_create(&service);
+ GE_CHECK_VAL(service, -1);
+
+ _ge_ug_iv_set(true);
+
+ service_add_extra_data(service, "View Mode", "SETAS" );
+ service_add_extra_data(service, "Path", cur_item->item->file_url);
+
+ if(ugd->file_select_setas_mode == GE_SETAS_T_WALLPAPER) {
+ service_add_extra_data(service, "Setas type", "Wallpaper");
+
+ if(ugd->file_setas_homescreen_path)
+ {
+ ge_dbg("homescreen_path:%s", ugd->file_setas_homescreen_path);
+ service_add_extra_data(service, GE_IMAGEVIEWER_HOMESCREEN_PATH, ugd->file_setas_homescreen_path);
+ GE_FREE(ugd->file_setas_homescreen_path);
+ }
+
+ if(ugd->file_setas_lockscreen_path)
+ {
+ ge_dbg("lockscreen_path:%s", ugd->file_setas_lockscreen_path);
+ service_add_extra_data(service, GE_IMAGEVIEWER_LOCKSCREEN_PATH, ugd->file_setas_lockscreen_path);
+ GE_FREE(ugd->file_setas_lockscreen_path);
+ }
+ } else if(ugd->file_select_setas_mode == GE_SETAS_T_CROP_WALLPAPER) {
+ service_add_extra_data(service, "Setas type", "Wallpaper Crop");
+ service_add_extra_data(service, "Fixed ratio", "TRUE");
+
+ int w = 0;
+ int h = 0;
+ ecore_x_window_size_get(ecore_x_window_root_first_get(),
+ &w, &h);
+ char *reso_str = (char *)calloc(1, GE_IV_STR_LEN_MAX);
+ if (reso_str == NULL) {
+ ge_dbgE("Calloc failed!");
+ service_destroy(service);
+ return -1;
+ }
+ snprintf(reso_str, GE_IV_STR_LEN_MAX, "%dx%d", w, h);
+ ge_dbgW("Window Resolution: %dx%d, %s", w, h, reso_str);
+ service_add_extra_data(service, "Resolution", reso_str);
+ GE_FREE(reso_str);
+ } else if(ugd->file_select_setas_mode == GE_SETAS_T_CALLERID) {
+ service_add_extra_data(service, "Setas type", "CallerID");
+ if(ugd->file_setas_callid_size)
+ {
+ ge_dbg("callerid_size:%s", ugd->file_setas_callid_size);
+ service_add_extra_data(service, GE_IMAGEVIEWER_CALLERID_SIZE, ugd->file_setas_callid_size);
+ GE_FREE(ugd->file_setas_callid_size);
+ }
+
+ if(ugd->file_setas_callid_path)
+ {
+ ge_dbg("callerid_path:%s", ugd->file_setas_callid_path);
+ service_add_extra_data(service, GE_IMAGEVIEWER_CALLERID_PATH, ugd->file_setas_callid_path);
+ GE_FREE(ugd->file_setas_callid_path);
+ }
+ }
+ ug = ug_create(ugd->ug, GE_IV_UG_NAME, UG_MODE_FULLVIEW, service, &cbs);
+ ugd->ug_called_by_me = ug;
+ service_destroy(service);
+ if (ug != NULL) {
+ ge_dbg("Create UG successully");
+ return 0;
+ } else {
+ ge_dbgE("Create UG failed!");
+ return -1;
+ }
+}
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "ge-debug.h"
+#include "ge-gridview.h"
+#include "ge-ui-util.h"
+#include "ge-util.h"
+#include "ge-ext-ug-load.h"
+#include "ge-data.h"
+#include "ge-strings.h"
+#include "ge-icon.h"
+#include "ge-drm.h"
+#include "ge-exif.h"
+#include "ge-thumb.h"
+
+/* Icon swallowed to part "elm.swallow.icon" */
+#define GE_GRID_ICON_SIZE 156
+#define GE_ITEM_MOUSE_UP_DISTANCE_X 20
+#define GE_ITEM_MOUSE_UP_DISTANCE_Y 20
+#define GE_GIRD_ICON_CLICK_TIME_DELAY 0.01f
+
+static Elm_Gengrid_Item_Class gic;
+static int ge_grid_item_cnt = 0;
+
+typedef struct
+{
+ Evas_Coord x;
+ Evas_Coord y;
+ bool b_pressed;
+}ge_grid_touch_info;
+
+static ge_grid_touch_info ge_touch_info;
+
+static void _ge_grid_drag_up(void *data, Evas_Object *obj, void *event_info)
+{
+ ge_dbg("");
+}
+
+static void _ge_grid_drag_right(void *data, Evas_Object *obj, void *event_info)
+{
+ ge_dbg("");
+}
+
+static void _ge_grid_drag_down(void *data, Evas_Object *obj, void *event_info)
+{
+ ge_dbg("");
+}
+
+static void _ge_grid_drag_left(void *data, Evas_Object *obj, void *event_info)
+{
+ ge_dbg("");
+}
+
+static void _ge_grid_drag_stop(void *data, Evas_Object *obj, void *event_info)
+{
+ ge_dbg("");
+}
+
+static void _ge_grid_selected(void *data, Evas_Object *obj, void *event_info)
+{
+ ge_dbg("");
+}
+
+static void _ge_grid_unselected(void *data, Evas_Object *obj, void *event_info)
+{
+ ge_dbg("");
+}
+
+static void _ge_grid_clicked(void *data, Evas_Object *obj, void *event_info)
+{
+ ge_dbg("");
+}
+
+static void _ge_grid_longpress(void *data, Evas_Object *obj, void *event_info)
+{
+ ge_dbg("");
+}
+
+static void _ge_grid_sel(void *data, Evas_Object *obj, void *event_info)
+{
+ ge_dbg("");
+ GE_CHECK(data);
+ if (_ge_get_view_mode() != GE_VIEW_THUMBS) {
+ ge_dbgE("Wrong mode!");
+ return;
+ } else {
+ ge_dbg("ViewMode");
+ }
+
+ ge_item* gitem = (ge_item*)data;
+ GE_CHECK(gitem->item);
+ GE_CHECK(gitem->ugd);
+ ge_ugdata* ugd = gitem->ugd;
+
+ if (gitem->item->file_url == NULL || strlen(gitem->item->file_url) <= 0) {
+ ge_dbgE("file_url is invalid!");
+ return;
+ } else {
+ ge_dbg("file_url: %s.", gitem->item->file_url);
+ }
+
+ if (ugd->file_select_mode == GE_FILE_SELECT_T_SETAS) {
+ /* imageviewer only supprot image type while setting wallpaper */
+ if(gitem->item->type == MEDIA_CONTENT_TYPE_IMAGE) {
+ _ge_set_current_item(gitem);
+ ge_dbg("Loading UG-IMAGE(VIDEO)-VIEWER");
+ ge_ext_load_iv_ug(ugd);
+ } else if (gitem->item->type == MEDIA_CONTENT_TYPE_VIDEO &&
+ ugd->popup == NULL) {
+ ge_ui_create_popup(ugd, GE_POPUP_ONEBUT,
+ GE_POPUP_ONLY_SUPPORT_IMAGE);
+ }
+
+ } else if (gitem->item->type == MEDIA_CONTENT_TYPE_IMAGE ||
+ gitem->item->type == MEDIA_CONTENT_TYPE_VIDEO) {
+ _ge_set_current_item(gitem);
+ ge_dbg("Loading UG-IMAGE(VIDEO)-VIEWER");
+ ge_ext_load_iv_ug(ugd);
+ }
+}
+
+static void _ge_grid_icon_clicked(void *data, Evas_Object *obj, void *event_info)
+{
+ ge_dbg("");
+ GE_CHECK(data);
+ _ge_grid_sel(data, obj, event_info);
+}
+
+static void _ge_grid_item_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ Evas_Event_Mouse_Down *ev = (Evas_Event_Mouse_Down*)event_info;
+ if(ev)
+ {
+ GE_CHECK(data);
+ GE_CHECK(obj);
+ ge_item *gitem = (ge_item *)data;
+ GE_CHECK(gitem->ugd);
+ ge_ugdata *ugd = gitem->ugd;
+
+ ge_touch_info.x = ev->output.x;
+ ge_touch_info.y = ev->output.y;
+
+ if(ugd->ug_called_by_me == NULL)
+ {
+ edje_object_signal_emit(_EDJ(obj), "mouse,down,shrink", "bg");
+ ge_touch_info.b_pressed = true;
+ }
+ }
+}
+/*
+static Eina_Bool _ge_grid_clicked_timer_cb(void *data)
+{
+ GE_CHECK_CANCEL(data);
+ ge_item *gitem = (ge_item *)data;
+ GE_CHECK_CANCEL(gitem->ugd);
+ ge_ugdata *ugd = gitem->ugd;
+
+ _ge_grid_icon_clicked(data, NULL, NULL);
+
+ GE_IF_DEL_TIMER(ugd->thumbs_clicked_timer)
+
+ return ECORE_CALLBACK_CANCEL;
+}
+*/
+
+static void _ge_grid_shrink_resp_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
+{
+ ge_dbg("");
+ GE_CHECK(obj);
+ GE_CHECK(data);
+ ge_item *gitem = (ge_item *)data;
+ GE_CHECK(gitem->ugd);
+/* ge_ugdata *ugd = gitem->ugd;
+
+ ugd->thumbs_clicked_timer = ecore_timer_add(GE_GIRD_ICON_CLICK_TIME_DELAY, _ge_grid_clicked_timer_cb, data);
+*/
+ _ge_grid_icon_clicked(data, obj, NULL);
+
+ edje_object_signal_callback_del(obj, "shrink,expand,done", "bg", _ge_grid_shrink_resp_cb);
+}
+
+static void _ge_grid_item_mouse_up(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ GE_CHECK(obj);
+ Evas_Event_Mouse_Up *ev = event_info;
+
+ if(!ev)
+ {
+ goto RET_WO_EXEC;
+ }
+
+ if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD || ev->event_flags & EVAS_EVENT_FLAG_ON_SCROLL)
+ {
+ goto RET_WO_EXEC;
+ }
+ if((abs(ge_touch_info.x - ev->output.x) > GE_ITEM_MOUSE_UP_DISTANCE_X) || (abs(ge_touch_info.y - ev->output.y) > GE_ITEM_MOUSE_UP_DISTANCE_Y))
+ {
+ goto RET_WO_EXEC;
+ }
+
+ ge_dbg("");
+
+ if(ge_touch_info.b_pressed)
+ {
+ edje_object_signal_emit(_EDJ(obj), "mouse,up,expand", "bg");
+ edje_object_signal_callback_add(_EDJ(obj), "shrink,expand,done", "bg", _ge_grid_shrink_resp_cb, data);
+ ge_touch_info.b_pressed = false;
+ }
+ return;
+
+RET_WO_EXEC:
+ if(ge_touch_info.b_pressed)
+ {
+ edje_object_signal_emit(_EDJ(obj), "mouse,up,expand", "bg");
+ ge_touch_info.b_pressed = false;
+ }
+}
+
+static void _ge_grid_check_changed(void *data, Evas_Object *obj, void *event_info)
+{
+ ge_dbg("");
+ GE_CHECK(obj);
+ GE_CHECK(data);
+ ge_item *gitem = (ge_item *)data;
+ GE_CHECK(gitem->item);
+ GE_CHECK(gitem->item->file_url);
+ GE_CHECK(gitem->ugd);
+ ge_ugdata *ugd = gitem->ugd;
+ GE_CHECK(ugd->service);
+
+ if(_ge_get_view_mode() != GE_VIEW_THUMBS_EDIT) {
+ ge_dbgE("Wrong view mode!");
+ return;
+ }
+
+
+ Eina_Bool checked = elm_check_state_get(obj);
+ if(checked) {
+ /* add for one file selection */
+ if(ugd->file_select_mode == GE_FILE_SELECT_T_ONE) {
+ ge_dbg("Service add:%s", gitem->item->file_url);
+ /* Hide checked state in one file selection */
+ elm_check_state_set(obj, false);
+
+ service_add_extra_data(ugd->service,
+ GE_FILE_SELECT_RETURN_PATH,
+ gitem->item->file_url);
+ service_add_extra_data(ugd->service,
+ SERVICE_DATA_SELECTED,
+ gitem->item->file_url);
+ ug_send_result(ugd->ug, ugd->service);
+ ug_destroy_me(ugd->ug);
+ return;
+ } else {
+ ge_dbg("Append:%s", gitem->item->file_url);
+ _ge_data_selected_list_append( gitem );
+ }
+ } else if (ugd->file_select_mode != GE_FILE_SELECT_T_ONE) {
+ ge_dbg("Remove:%s", gitem->item->file_url);
+ _ge_data_selected_list_remove( gitem );
+ }
+
+ if(ugd->file_select_mode != GE_FILE_SELECT_T_ONE) {
+ gitem->checked = checked;
+ _ge_ui_create_selinfo(ugd, ugd->thumbs_view_ly);
+ }
+}
+
+static void __ge_grid_thumb_created_cb(media_content_error_e error,
+ const char *path, void *user_data)
+{
+ GE_CHECK(user_data);
+ ge_item *gitem = (ge_item *)user_data;
+ GE_CHECK(gitem->item);
+
+ if (GE_FILE_EXISTS(path)) {
+ ge_dbg("Update item with new thumb path[%s]", path);
+ /* Update thumb path */
+ GE_FREEIF(gitem->item->thumb_url);
+ gitem->item->thumb_url = strdup(path);
+ elm_gengrid_item_update(gitem->elm_item);
+ } else {
+ ge_dbgE("Invalid thumb path!");
+ }
+}
+
+static Evas_Object *__ge_grid_get_content(void *data, Evas_Object *obj, const char *part)
+{
+ GE_CHECK_NULL(data);
+ GE_CHECK_NULL(part);
+ GE_CHECK_NULL(obj);
+ ge_item *gitem = NULL;
+ bool is_expired_drm = false;
+
+ if(strlen(part) <= 0) {
+ ge_dbgE("part length <= 0");
+ return NULL;
+ }
+
+ gitem = (ge_item*)data;
+ GE_CHECK_NULL(gitem->item);
+ GE_CHECK_NULL(gitem->ugd);
+ ge_ugdata *ugd = gitem->ugd;
+ GE_CHECK_NULL(ugd->thumbs_view);
+
+ if (!g_strcmp0(part, "elm.swallow.icon")) {
+ Evas_Object *layout = NULL;
+ char *path = NULL;
+ char *drm_path = NULL;
+ unsigned int orient = 0;
+
+ /* Is it DRM file? Has a valid RO? */
+ if(ge_drm_is_drm_file(gitem->item->file_url) &&
+ ge_drm_check_valid_ro(gitem->item->file_url, ge_drm_get_permtype(gitem->item->type)) == false) {
+ path = GE_DEFAULT_THUMB_ICON;;
+ is_expired_drm = true;
+ } else if (ge_grid_item_cnt < 2 &&
+ gitem->item->type == MEDIA_CONTENT_TYPE_IMAGE) {
+ if (!g_strcmp0(GE_DB_DEFAULT_THUMB, gitem->item->thumb_url)) {
+ path = GE_DEFAULT_THUMB_ICON;
+ } else {
+ drm_path = ge_drm_get_file_path(gitem);
+ path = _GE_GET_ICON(drm_path);
+ if (_ge_is_image_valid(ugd, path) == false)
+ path = _GE_GET_ICON(gitem->item->thumb_url);
+#ifdef _USE_ROTATE_BG_GE
+ /* Rotate bg if it's created from original file */
+ if (!g_strcmp0(path, gitem->item->file_url))
+ _ge_exif_get_orientation(path, &orient);
+#endif
+ }
+ } else {
+ /* Use default image */
+ if (GE_FILE_EXISTS(gitem->item->thumb_url)) {
+ path = gitem->item->thumb_url;
+ } else {
+ path = GE_DEFAULT_THUMB_ICON;
+ if (GE_FILE_EXISTS(gitem->item->file_url))
+ _ge_data_create_thumb(gitem,
+ __ge_grid_thumb_created_cb,
+ gitem);
+ }
+ }
+
+ if(gitem->item->type == MEDIA_CONTENT_TYPE_VIDEO){
+ unsigned int v_dur = 0;
+ if (gitem->item->video_info) {
+ v_dur = gitem->item->video_info->duration;
+ }
+ int bk_len = 0;
+ if (gitem->item->video_info == NULL)
+ bk_len = 0;
+ else
+ bk_len = gitem->item->video_info->bookmarks;
+ layout = _ge_thumb_show_part_icon_video(obj, path,
+ v_dur, bk_len,
+ gitem->item->favorite,
+ is_expired_drm,
+ ugd->icon_size);
+
+ } else {
+ layout = _ge_thumb_show_part_icon_image(obj, path,
+ orient,
+ gitem->item->favorite,
+ is_expired_drm,
+ ugd->icon_size);
+ }
+ GE_FREEIF(drm_path);
+
+ evas_object_event_callback_add(layout,
+ EVAS_CALLBACK_MOUSE_DOWN, _ge_grid_item_mouse_down, gitem);
+ evas_object_event_callback_add(layout,
+ EVAS_CALLBACK_MOUSE_UP, _ge_grid_item_mouse_up, gitem);
+
+ return layout;
+ } else if (!g_strcmp0(part, "elm.swallow.end") &&
+ (_ge_get_view_mode() == GE_VIEW_THUMBS_EDIT)) {
+ Evas_Object* ck = NULL;
+
+ ck = elm_check_add(obj);
+ GE_CHECK_NULL(ck);
+ elm_object_style_set(ck, GE_CHECKBOX_STYLE_GRID);
+ evas_object_propagate_events_set(ck, EINA_FALSE);
+
+ gitem->check_obj = ck;
+ elm_check_state_set(ck, gitem->checked);
+
+ evas_object_smart_callback_add(ck, "changed",
+ _ge_grid_check_changed, data);
+ evas_object_show(ck);
+
+ return ck;
+ }
+
+ return NULL;
+}
+
+static bool _ge_grid_create_thumb(ge_ugdata* ugd, Evas_Object* parent)
+{
+ ge_dbg("");
+ GE_CHECK_FALSE(parent);
+ GE_CHECK_FALSE(ugd);
+ int i = 0;
+ ge_item* gitem = NULL;
+ int cnt = _ge_data_get_count_all();
+ int item_cnt = 0;
+ ge_dbg("List count : %d", cnt);
+
+ gic.item_style = "thumbnail_view";
+ gic.func.text_get = NULL;
+ gic.func.content_get = __ge_grid_get_content;
+
+ elm_gengrid_clear(parent);
+ if(ugd->th)
+ {
+ elm_object_theme_set(parent, ugd->th);
+ }
+ elm_object_style_set(parent, "gallery_efl/default");
+
+ for(i = 1; i <= cnt; i++)
+ {
+ _ge_data_get_item_by_index(&gitem, i);
+ if(gitem == NULL || gitem->item == NULL ||
+ gitem->item->uuid == NULL) {
+ ge_dbgE("Invalid gitem, continue...");
+ continue;
+ }
+
+ if(!gitem->item->file_url)
+ {
+ _ge_data_del_media_id(ugd, gitem->item->uuid);
+ _ge_data_item_list_remove(gitem);
+ --i;
+ --cnt;
+ continue;
+ }
+
+ /*if(_ge_get_view_mode() == GE_VIEW_THUMBS_EDIT)
+ {
+ ge_media_s *new_item = NULL;
+ _ge_local_data_get_media(gitem->item->uuid, &new_item);
+ if(!new_item)
+ {
+ ge_dbg("item or file doesn't exist, remove it...");
+ _ge_data_selected_list_remove(gitem);
+ _ge_data_item_list_remove(gitem);
+
+ if(new_item)
+ {
+ _ge_data_type_free_geitem((void **)&new_item);
+ new_item = NULL;
+ }
+ --i;
+ --cnt;
+ continue;
+ }
+
+ if(new_item)
+ {
+ _ge_data_type_free_geitem((void **)&new_item);
+ new_item = NULL;
+ }
+ }*/
+
+ gitem->elm_item = elm_gengrid_item_append(parent, &gic, gitem, _ge_grid_sel, gitem);
+ gitem->check_obj = NULL;
+ item_cnt++;
+
+ }
+
+ elm_gengrid_select_mode_set(parent, ELM_OBJECT_SELECT_MODE_NONE);
+ ge_grid_item_cnt = item_cnt;
+ if(item_cnt == 0)
+ {
+ return EINA_FALSE;
+ }
+ else
+ {
+ return EINA_TRUE;
+ }
+}
+
+Evas_Object* ge_grid_create_ly(Evas_Object* parent)
+{
+ ge_dbg("");
+ GE_CHECK_NULL(parent);
+ Evas_Object* layout = NULL;
+
+ layout = ge_ui_load_edj(parent, GE_EDJ_FILE, GE_GRP_GRIDVIEW);
+ GE_CHECK_NULL(layout);
+ evas_object_show (layout);
+
+ return layout;
+}
+
+int ge_grid_del_callbacks(ge_ugdata *ugd)
+{
+ GE_CHECK_VAL(ugd, -1);
+ if(ugd->thumbs_view)
+ {
+ ge_dbg("Delete thumbnails callbacks!");
+ evas_object_smart_callback_del(ugd->thumbs_view, "selected", _ge_grid_selected);
+ evas_object_smart_callback_del(ugd->thumbs_view, "unselected", _ge_grid_unselected);
+ evas_object_smart_callback_del(ugd->thumbs_view, "clicked", _ge_grid_clicked);
+ evas_object_smart_callback_del(ugd->thumbs_view, "longpressed", _ge_grid_longpress);
+ evas_object_smart_callback_del(ugd->thumbs_view, "drag,start,up", _ge_grid_drag_up);
+ evas_object_smart_callback_del(ugd->thumbs_view, "drag,start,right", _ge_grid_drag_right);
+ evas_object_smart_callback_del(ugd->thumbs_view, "drag,start,down", _ge_grid_drag_down);
+ evas_object_smart_callback_del(ugd->thumbs_view, "drag,start,left", _ge_grid_drag_left);
+ evas_object_smart_callback_del(ugd->thumbs_view, "drag,stop", _ge_grid_drag_stop);
+ }
+ return 0;
+}
+
+/*
+* When select album, show first (GE_FIRST_VIEW_END_POS+1) medias.
+* Then use idler to get other medias from DB and appened
+* them to gridview.
+* In order to reduce transit time of first show of thumbnails view.
+* Cause most of time is spent for getting records from DB,
+* so we get first (GE_FIRST_VIEW_END_POS+1) items and show thumbnails view,
+* it will accelerate view show.
+*/
+int ge_grid_idler_append_thumbs(void* data)
+{
+ GE_CHECK_VAL(data, -1);
+ ge_ugdata *ugd = (ge_ugdata *)data;
+ GE_CHECK_VAL(ugd->thumbs_view, -1);
+ int i = 0;
+ int item_cnt = 0;
+ ge_item* gitem = NULL;
+ /* Get all medias count of current album */
+ int cnt = _ge_data_get_count_all();
+ int ret = -1;
+ ge_cluster* cur_album = _ge_get_current_album();
+ GE_CHECK_VAL(cur_album, -1);
+ GE_CHECK_VAL(cur_album->cluster, -1);
+ ge_dbg("First view medias count: %d;", cnt);
+
+ if(cnt != (GE_FIRST_VIEW_END_POS+1))
+ {
+ ge_dbg("No any more items, return!");
+ return -1;
+ }
+ /* Get other items from DB */
+ ret = _ge_data_get_items_list(ugd, cur_album, (GE_FIRST_VIEW_END_POS+1),
+ GE_GET_UNTIL_LAST_RECORD);
+ ge_dbgW("###Get items list over[%d]###", ret);
+ if(ret < 0) {
+ ge_dbg("Get items list failed!");
+ return ret;
+ }
+
+ cnt = _ge_data_get_count_all();
+ ge_dbg("Grid view all medias count: %d", cnt);
+
+
+ /* From (GL_FIRST_VIEW_END_POS + 2)th item to last one */
+ i = GE_FIRST_VIEW_END_POS + 2;
+
+ for(; i <= cnt; i++)
+ {
+ _ge_data_get_item_by_index(&gitem, i);
+ if(gitem == NULL || gitem->item == NULL ||
+ gitem->item->uuid == NULL) {
+ ge_dbgE("Invalid gitem, continue...");
+ continue;
+ }
+
+ if(!gitem->item->file_url)
+ {
+ ge_dbg("file_url is invalid.");
+ _ge_data_del_media_id(ugd, gitem->item->uuid);
+ _ge_data_selected_list_remove(gitem);
+ _ge_data_item_list_remove(gitem);
+ cnt--;
+ i--;
+ gitem = NULL;
+ continue;
+ }
+
+ gitem->elm_item = elm_gengrid_item_append(ugd->thumbs_view, &gic, gitem, _ge_grid_sel, gitem);
+ item_cnt++;
+ }
+
+ ge_dbg("\n\n<<<<<<<<Use idler to append other medias--Done<<<<<<<<<\n");
+ if(item_cnt == 0)
+ {
+ return -1;
+ }
+ else
+ {
+ ge_grid_item_cnt = item_cnt + GE_FIRST_VIEW_END_POS + 1;
+ ge_dbg("All count appended: %d", ge_grid_item_cnt);
+ return 0;
+ }
+}
+
+Evas_Object* ge_grid_create_view(ge_ugdata* ugd, Evas_Object* parent)
+{
+ ge_dbg("");
+ GE_CHECK_NULL(parent);
+ GE_CHECK_NULL(ugd);
+ int item_w = 0;
+ int item_h = 0;
+ int icon_size = 0;
+ Evas_Object *grid = elm_gengrid_add(parent);
+ GE_CHECK_NULL(grid);
+ double scale_factor = ugd->win_scale;
+ item_w = (int)(GE_GRID_ITEM_SIZE_W * scale_factor);
+ item_h = (int)(GE_GRID_ITEM_SIZE_H * scale_factor);
+ icon_size = (int)(GE_GRID_ICON_SIZE * scale_factor);
+ ge_dbg("Own scale: %f, elm_config_scale_get =%f", scale_factor, elm_config_scale_get());
+
+ if(!_ge_grid_create_thumb(ugd, grid)) {
+ evas_object_del(grid);
+ grid = NULL;
+
+ ugd->nocontents = ge_ui_create_nocontents(ugd);
+ evas_object_show (ugd->nocontents);
+
+ return ugd->nocontents;
+ } else {
+ ge_dbg("ge_grid_item_cnt : %d", ge_grid_item_cnt);
+ if(ge_grid_item_cnt <= GE_GRID_ITEM_ZOOM_LEVEL_02_CNT) {
+ item_w *= GE_GRID_ITEM_ZOOM_LEVEL_02;
+ item_h *= GE_GRID_ITEM_ZOOM_LEVEL_02;
+ icon_size *= GE_GRID_ITEM_ZOOM_LEVEL_02;
+ }
+
+ ugd->icon_size = icon_size;
+ evas_object_show (grid);
+ }
+
+
+ elm_gengrid_item_size_set(grid, item_w, item_h);
+ ge_dbg("Gengrid item w: %d, h: %d.", item_w, item_h);
+ elm_gengrid_align_set(grid, 0.5, 0.0);
+ elm_gengrid_horizontal_set(grid, EINA_FALSE);
+ elm_scroller_bounce_set(grid, EINA_FALSE, EINA_TRUE);
+ elm_gengrid_multi_select_set(grid, EINA_TRUE);
+
+ evas_object_smart_callback_add(grid, "selected", _ge_grid_selected, NULL);
+ evas_object_smart_callback_add(grid, "unselected", _ge_grid_unselected, NULL);
+ evas_object_smart_callback_add(grid, "clicked", _ge_grid_clicked, NULL);
+ evas_object_smart_callback_add(grid, "longpressed", _ge_grid_longpress, NULL);
+ evas_object_smart_callback_add(grid, "drag,start,up", _ge_grid_drag_up, NULL);
+ evas_object_smart_callback_add(grid, "drag,start,right", _ge_grid_drag_right, NULL);
+ evas_object_smart_callback_add(grid, "drag,start,down", _ge_grid_drag_down, NULL);
+ evas_object_smart_callback_add(grid, "drag,start,left", _ge_grid_drag_left, NULL);
+ evas_object_smart_callback_add(grid, "drag,stop", _ge_grid_drag_stop, NULL);
+ evas_object_size_hint_weight_set(grid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+
+ return grid;
+}
+
+int ge_grid_clear_view(ge_ugdata *ugd)
+{
+ GE_CHECK_VAL(ugd, -1);
+ if(ugd->file_select_mode == GE_FILE_SELECT_T_ONE)
+ service_remove_extra_data(ugd->service,
+ GE_FILE_SELECT_RETURN_PATH);
+
+ if(ugd->thumbs_view) {
+ if(ugd->thumbs_nocontents != ugd->thumbs_view)
+ ge_grid_del_callbacks(ugd);
+
+ evas_object_del(ugd->thumbs_view);
+ ugd->thumbs_view = NULL;
+ ugd->thumbs_nocontents = NULL;
+ ugd->thumbs_nf_it = NULL;
+ }
+
+ return 0;
+}
+int ge_grid_update_view(ge_ugdata *ugd)
+{
+ ge_dbg("");
+ GE_CHECK_VAL(ugd, -1);
+ if(_ge_grid_create_thumb(ugd, ugd->thumbs_view) == EINA_FALSE) {
+ ge_grid_del_callbacks(ugd);
+ } else {
+ double scale_factor = ugd->win_scale;
+ int item_w = (int)(GE_GRID_ITEM_SIZE_W * scale_factor);
+ int item_h = (int)(GE_GRID_ITEM_SIZE_H * scale_factor);
+ int icon_size = (int)(GE_GRID_ICON_SIZE * scale_factor);
+
+ ge_dbg("ge_grid_item_cnt : %d", ge_grid_item_cnt);
+ if(ge_grid_item_cnt <= GE_GRID_ITEM_ZOOM_LEVEL_02_CNT) {
+ item_w *= GE_GRID_ITEM_ZOOM_LEVEL_02;
+ item_h *= GE_GRID_ITEM_ZOOM_LEVEL_02;
+ icon_size *= GE_GRID_ITEM_ZOOM_LEVEL_02;
+ }
+
+ ugd->icon_size = icon_size;
+ elm_gengrid_item_size_set(ugd->thumbs_view, item_w, item_h);
+ }
+
+ return 0;
+}
+
--- /dev/null
+/*\r
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd\r
+ *\r
+ * Licensed under the Flora License, Version 1.1 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://floralicense.org/license/\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+#include "ge-lang.h"\r
+#include "ge-strings.h"\r
+#include "ge-ui-util.h"\r
+#include "ge-util.h"\r
+#include "ge-debug.h"\r
+#include "ge-data.h"\r
+\r
+static int __ge_lang_get_view_title(ge_ugdata *ugd)\r
+{\r
+ GE_CHECK_VAL(ugd, -1);\r
+ if (ugd->album_select_mode == GE_ALBUM_SELECT_T_ONE) {\r
+ g_strlcpy(ugd->albums_view_title, GE_TITLE_ALBUMS,
+ GE_ALBUM_NAME_LEN_MAX);\r
+ } else {\r
+ if (ugd->file_select_mode == GE_FILE_SELECT_T_SETAS) {\r
+ if (ugd->file_select_setas_mode == GE_SETAS_T_WALLPAPER)\r
+ g_strlcpy(ugd->albums_view_title,\r
+ GE_TITLE_CHANGE_WALLPAPER,\r
+ GE_ALBUM_NAME_LEN_MAX);\r
+ else if (ugd->file_select_setas_mode == GE_SETAS_T_CROP_WALLPAPER)\r
+ g_strlcpy(ugd->albums_view_title,\r
+ GE_TITLE_CHANGE_WALLPAPER,\r
+ GE_ALBUM_NAME_LEN_MAX);\r
+ else if (ugd->file_select_setas_mode == GE_SETAS_T_CALLERID)\r
+ g_strlcpy(ugd->albums_view_title,\r
+ GE_TITLE_CHANGE_CALLER_ID,\r
+ GE_ALBUM_NAME_LEN_MAX);\r
+ } else {\r
+ g_strlcpy(ugd->albums_view_title, GE_TITLE_ADD,\r
+ GE_ALBUM_NAME_LEN_MAX);\r
+ g_strlcat(ugd->albums_view_title, " ",\r
+ GE_ALBUM_NAME_LEN_MAX);\r
+ bool b_singular = true;\r
+ if(ugd->file_select_mode == GE_FILE_SELECT_T_MULTIPLE) {\r
+ b_singular = false;\r
+ }\r
+ if (ugd->file_type_mode == GE_FILE_T_IMAGE) {\r
+ if(b_singular) {\r
+ g_strlcat(ugd->albums_view_title,\r
+ GE_TITLE_IMAGE,\r
+ sizeof(ugd->albums_view_title));\r
+ } else {\r
+ g_strlcat(ugd->albums_view_title,\r
+ GE_TITLE_IMAGES,\r
+ sizeof(ugd->albums_view_title));\r
+ }\r
+ } else if (ugd->file_type_mode == GE_FILE_T_VIDEO) {\r
+ if(b_singular) {\r
+ g_strlcat(ugd->albums_view_title,\r
+ GE_TITLE_VIDEO,\r
+ sizeof(ugd->albums_view_title));\r
+ } else {\r
+ g_strlcat(ugd->albums_view_title,\r
+ GE_TITLE_VIDEOS,\r
+ sizeof(ugd->albums_view_title));\r
+ }\r
+ } else {\r
+ if(b_singular) {\r
+ g_strlcat(ugd->albums_view_title,\r
+ GE_TITLE_FILE,\r
+ sizeof(ugd->albums_view_title));\r
+ } else {\r
+ g_strlcat(ugd->albums_view_title,\r
+ GE_TITLE_FILES,\r
+ sizeof(ugd->albums_view_title));\r
+ }\r
+ }\r
+ }\r
+ }\r
+ return 0;\r
+}\r
+\r
+static int __ge_lang_update_all_albums_name(ge_ugdata *ugd)\r
+{\r
+ GE_CHECK_VAL(ugd, -1);\r
+\r
+ ge_cluster *album = NULL;\r
+ Elm_Object_Item *first_it = NULL;\r
+ Elm_Object_Item *next_it = NULL;\r
+ Elm_Object_Item *last_it = NULL;\r
+ Evas_Object *grid_view = NULL;\r
+ GE_CHECK_VAL(ugd->albums_view, -1);\r
+ grid_view = ugd->albums_view;\r
+\r
+ first_it = elm_gengrid_first_item_get(grid_view);\r
+ last_it = elm_gengrid_last_item_get(grid_view);\r
+ while(first_it) {\r
+ album = (ge_cluster *)elm_object_item_data_get(first_it);\r
+ if (album == NULL) {\r
+ ge_dbgE("Invalid item data!");\r
+ continue;\r
+ }\r
+ if (!g_strcmp0(album->cluster->uuid, GE_ALBUM_ALL_ID)) {\r
+ GE_FREEIF(album->cluster->display_name);\r
+ album->cluster->display_name = strdup(GE_ALBUM_ALL_NAME);\r
+ elm_gengrid_item_update(first_it);\r
+ } else if (_ge_data_is_default_album(GE_ALBUM_CAMERA_NAME, album->cluster) ||\r
+ _ge_data_is_default_album(GE_ALBUM_DOWNLOAD_NAME, album->cluster) ||\r
+ _ge_data_is_root_path(album->cluster->path)) {\r
+ elm_gengrid_item_update(first_it);\r
+ }\r
+ if (last_it == first_it) {\r
+ ge_dbg("Update done!");\r
+ break;\r
+ } else {\r
+ next_it = elm_gengrid_item_next_get(first_it);\r
+ first_it = next_it;\r
+ }\r
+ album = NULL;\r
+ }\r
+ return 0;\r
+}\r
+\r
+static int __ge_lang_update_select_info(ge_ugdata *ugd)\r
+{\r
+ GE_CHECK_VAL(ugd, -1);\r
+ GE_CHECK_VAL(ugd->selinfo_ly, -1);\r
+\r
+ int count = 0;\r
+ char text[GE_SELINFO_TEXT_LEN_MAX] = {0,};\r
+\r
+ count = _ge_data_selected_list_count();\r
+ if (count <= 0)\r
+ return -1;\r
+ snprintf(text, sizeof(text), "%s (%d)", GE_SELINFO_SELECTED, count);\r
+ text[strlen(text)] = '\0';\r
+ edje_object_part_text_set(_EDJ(ugd->selinfo_ly), "elm.text", text);\r
+ return 0;\r
+}\r
+\r
+int _ge_lang_update(ge_ugdata *ugd)\r
+{\r
+ GE_CHECK_VAL(ugd, -1);\r
+ ge_dbg("");\r
+ if(_ge_get_view_mode() == GE_VIEW_THUMBS) {\r
+ if (ugd->thumbs_nf_it) {\r
+ ge_cluster *album_item = _ge_get_current_album();\r
+ if(_ge_data_is_root_path(album_item->cluster->path)) {\r
+ elm_object_item_text_set(ugd->thumbs_nf_it,\r
+ GE_ALBUM_ROOT_NAME);\r
+ } else {\r
+ char *new_name = _ge_ui_get_translated_album_name(album_item);\r
+ elm_object_item_text_set(ugd->thumbs_nf_it,\r
+ new_name);\r
+ }\r
+ __ge_lang_update_select_info(ugd);\r
+ }\r
+ } else {\r
+ __ge_lang_get_view_title(ugd);\r
+\r
+ if (_ge_get_view_mode() == GE_VIEW_ALBUMS) {\r
+ elm_object_item_text_set(ugd->albums_nf_it,\r
+ ugd->albums_view_title);\r
+ __ge_lang_update_all_albums_name(ugd);\r
+ } else {\r
+ elm_object_item_text_set(ugd->thumbs_nf_it,\r
+ ugd->albums_view_title);\r
+ __ge_lang_update_select_info(ugd);\r
+ }\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
--- /dev/null
+/*\r
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd\r
+ *\r
+ * Licensed under the Flora License, Version 1.1 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://floralicense.org/license/\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+#include <stdio.h>\r
+#include <media_content.h>\r
+#include <glib.h>\r
+#include <string.h>\r
+#include "ge-local-data.h"\r
+#include "ge-debug.h"\r
+\r
+typedef struct _ge_transfer_data_t ge_transfer_data_s;\r
+\r
+struct _ge_transfer_data_t {\r
+ void **userdata;\r
+ filter_h filter;\r
+ char *album_id;\r
+ bool with_meta;\r
+};\r
+\r
+static int __ge_local_data_create_filter(ge_filter_s *condition, filter_h *filter)\r
+{\r
+ GE_CHECK_VAL(filter, -1);\r
+ GE_CHECK_VAL(condition, -1);\r
+ int ret = -1;\r
+ filter_h tmp_filter = NULL;\r
+\r
+ ret = media_filter_create(&tmp_filter);\r
+ if(ret != MEDIA_CONTENT_ERROR_NONE) {\r
+ ge_dbgE("Fail to create filter!");\r
+ return -1;\r
+ }\r
+\r
+ if (strlen(condition->cond) > 0) {\r
+ ret = media_filter_set_condition(tmp_filter, condition->cond,\r
+ condition->collate_type);\r
+ if(ret != MEDIA_CONTENT_ERROR_NONE) {\r
+ ge_dbgE("Fail to set condition!");\r
+ goto GE_LOCAL_FAILED;\r
+ }\r
+ }\r
+\r
+ if (strlen(condition->sort_keyword) > 0) {\r
+ ret = media_filter_set_order(tmp_filter, condition->sort_type,\r
+ condition->sort_keyword,\r
+ condition->collate_type);\r
+ if(ret != MEDIA_CONTENT_ERROR_NONE) {\r
+ ge_dbgE("Fail to set order!");\r
+ goto GE_LOCAL_FAILED;\r
+ }\r
+ }\r
+\r
+ ge_dbg("offset: %d, count: %d", condition->offset, condition->count);\r
+ if (condition->offset != -1 && condition->count != -1 &&\r
+ condition->count > 0) {\r
+ ret = media_filter_set_offset(tmp_filter, condition->offset,\r
+ condition->count);\r
+ if(ret != MEDIA_CONTENT_ERROR_NONE) {\r
+ ge_dbgE("Fail to set offset!");\r
+ goto GE_LOCAL_FAILED;\r
+ }\r
+ }\r
+\r
+ *filter = tmp_filter;\r
+ return 0;\r
+\r
+ GE_LOCAL_FAILED:\r
+\r
+ if (tmp_filter) {\r
+ media_filter_destroy(tmp_filter);\r
+ tmp_filter = NULL;\r
+ *filter = NULL;\r
+ }\r
+ return -1;\r
+}\r
+\r
+static int __ge_local_data_destroy_filter(filter_h filter)\r
+{\r
+ GE_CHECK_VAL(filter, -1);\r
+\r
+ if (media_filter_destroy(filter) != MEDIA_CONTENT_ERROR_NONE) {\r
+ ge_dbgE("Failed to destroy filter!");\r
+ return -1;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+static bool __ge_local_data_get_album_list_cb(media_folder_h folder,\r
+ void *data)\r
+{\r
+ GE_CHECK_FALSE(data);\r
+ ge_transfer_data_s *tmp_data = (ge_transfer_data_s *)data;\r
+ GE_CHECK_FALSE(tmp_data->userdata);\r
+ GE_CHECK_FALSE(tmp_data->filter);\r
+ GE_CHECK_FALSE(folder);\r
+\r
+ Eina_List **elist = (Eina_List **)(tmp_data->userdata);\r
+ ge_album_s *album = NULL;\r
+\r
+ album = (ge_album_s *)calloc(1, sizeof(ge_album_s));\r
+ GE_CHECK_FALSE(album);\r
+ album->gtype = GE_TYPE_ALBUM;\r
+\r
+ if (media_folder_clone(&(album->folder_h), folder) != MEDIA_CONTENT_ERROR_NONE) {\r
+ ge_dbgE("Clone folder handle error");\r
+ goto GE_LOCAL_FAILED;\r
+ }\r
+\r
+ if (media_folder_get_folder_id(folder, &(album->uuid)) != MEDIA_CONTENT_ERROR_NONE) {\r
+ ge_dbgE("Get folder id error");\r
+ goto GE_LOCAL_FAILED;\r
+ }\r
+\r
+ if (media_folder_get_modified_time(folder, &(album->mtime)) != MEDIA_CONTENT_ERROR_NONE) {\r
+ ge_dbgE("Get modified time error");\r
+ goto GE_LOCAL_FAILED;\r
+ }\r
+\r
+ if (media_folder_get_storage_type(folder, (media_content_storage_e *)&(album->type)) != MEDIA_CONTENT_ERROR_NONE) {\r
+ ge_dbgE("Get storage type error");\r
+ goto GE_LOCAL_FAILED;\r
+ }\r
+\r
+ if (media_folder_get_name(folder, &(album->display_name)) != MEDIA_CONTENT_ERROR_NONE) {\r
+ ge_dbgE("Get folder name error");\r
+ goto GE_LOCAL_FAILED;\r
+ }\r
+\r
+ if (media_folder_get_path(folder, &(album->path)) != MEDIA_CONTENT_ERROR_NONE) {\r
+ ge_dbgE("Get folder name error");\r
+ goto GE_LOCAL_FAILED;\r
+ }\r
+\r
+ if (media_folder_get_media_count_from_db(album->uuid, tmp_data->filter, &(album->count)) != MEDIA_CONTENT_ERROR_NONE) {\r
+ ge_dbgE("Get media count error, %d", album->count);\r
+ goto GE_LOCAL_FAILED;\r
+ }\r
+\r
+ *elist = eina_list_append(*elist, album);\r
+\r
+ return true;\r
+\r
+ GE_LOCAL_FAILED:\r
+\r
+ _ge_data_type_free_geitem((void **)(&album));\r
+ return false;\r
+}\r
+\r
+static bool __ge_local_data_get_media_list_cb(media_info_h media, void *data)\r
+{\r
+ GE_CHECK_FALSE(data);\r
+ ge_transfer_data_s *tmp_data = (ge_transfer_data_s *)data;\r
+ GE_CHECK_FALSE(tmp_data->userdata);\r
+ GE_CHECK_FALSE(media);\r
+ ge_media_s *item = NULL;\r
+ ge_image_s *image_info = NULL;\r
+ ge_video_s *video_info = NULL;\r
+ image_meta_h image_handle = NULL;\r
+ video_meta_h video_handle = NULL;\r
+ int ret = -1;\r
+\r
+ Eina_List **elist = (Eina_List **)(tmp_data->userdata);\r
+\r
+ item = (ge_media_s *)calloc(1, sizeof(ge_media_s));\r
+ GE_CHECK_FALSE(item);\r
+ item->gtype = GE_TYPE_MEDIA;\r
+\r
+ if (media_info_clone(&(item->media_h), media) != MEDIA_CONTENT_ERROR_NONE) {\r
+ ge_dbgE("Clone media handle error");\r
+ goto GE_LOCAL_FAILED;\r
+ }\r
+\r
+ if (media_info_get_media_id(media, &(item->uuid)) != MEDIA_CONTENT_ERROR_NONE) {\r
+ ge_dbgE("Get media id error");\r
+ goto GE_LOCAL_FAILED;\r
+ }\r
+\r
+ if (media_info_get_display_name(media, &(item->display_name)) != MEDIA_CONTENT_ERROR_NONE) {\r
+ ge_dbgE("Get media display name error");\r
+ goto GE_LOCAL_FAILED;\r
+ }\r
+ if (media_info_get_file_path(media, &(item->file_url)) != MEDIA_CONTENT_ERROR_NONE) {\r
+ ge_dbgE("Get media file path error");\r
+ goto GE_LOCAL_FAILED;\r
+ }\r
+\r
+ if (media_info_get_media_type(media, (media_content_type_e *)&(item->type)) != MEDIA_CONTENT_ERROR_NONE) {\r
+ ge_dbgE("Get media type error");\r
+ goto GE_LOCAL_FAILED;\r
+ }\r
+\r
+ if (media_info_get_thumbnail_path(media, &(item->thumb_url)) != MEDIA_CONTENT_ERROR_NONE) {\r
+ ge_dbgE("Get media thumbnail path error");\r
+ goto GE_LOCAL_FAILED;\r
+ }\r
+ ge_dbg("thumb_url: %s", item->thumb_url);\r
+\r
+ if (media_info_get_modified_time(media, &(item->mtime)) != MEDIA_CONTENT_ERROR_NONE) {\r
+ ge_dbgE("Get media modified time error");\r
+ goto GE_LOCAL_FAILED;\r
+ }\r
+\r
+ if (media_info_get_favorite(media, &(item->favorite)) != MEDIA_CONTENT_ERROR_NONE) {\r
+ ge_dbgE("Get media rating error");\r
+ goto GE_LOCAL_FAILED;\r
+ }\r
+ /* Without meta */\r
+ if (!tmp_data->with_meta)\r
+ goto GE_LOCAL_SUCCESS;\r
+\r
+ if (item->type == MEDIA_CONTENT_TYPE_IMAGE) {\r
+ ret = media_info_get_image(media, &image_handle);\r
+ if (ret != MEDIA_CONTENT_ERROR_NONE || image_handle == NULL) {\r
+ ge_dbgE("Failed to get image handle[%d]!", ret);\r
+ goto GE_LOCAL_FAILED;\r
+ }\r
+\r
+ image_info = (ge_image_s *)calloc(1, sizeof(ge_image_s));\r
+ if (NULL == image_info){\r
+ ge_dbgE("calloc failed!");\r
+ goto GE_LOCAL_FAILED;\r
+ }\r
+ item->image_info = image_info;\r
+\r
+ if (image_meta_clone(&(image_info->image_h), image_handle) != MEDIA_CONTENT_ERROR_NONE) {\r
+ ge_dbgE("Clone image handle error");\r
+ goto GE_LOCAL_FAILED;\r
+\r
+ }\r
+ if (image_meta_get_media_id(image_handle, &(image_info->media_uuid)) != MEDIA_CONTENT_ERROR_NONE) {\r
+ ge_dbgE("Get image id error");\r
+ goto GE_LOCAL_FAILED;\r
+ }\r
+\r
+ if (image_meta_get_orientation(image_handle, &(image_info->orientation)) != 0) {\r
+ ge_dbgE("Get image orientation error");\r
+ goto GE_LOCAL_FAILED;\r
+ }\r
+\r
+ if (image_meta_destroy(image_handle) != MEDIA_CONTENT_ERROR_NONE) {\r
+ ge_dbgE("Destroy image handle error");\r
+ goto GE_LOCAL_FAILED;\r
+ }\r
+ } else if (item->type == MEDIA_CONTENT_TYPE_VIDEO) {\r
+ ret = media_info_get_video(media, &video_handle);\r
+ if (ret != MEDIA_CONTENT_ERROR_NONE || video_handle == NULL) {\r
+ ge_dbgE("Failed to get video handle[%d]!", ret);\r
+ goto GE_LOCAL_FAILED;\r
+ }\r
+\r
+ video_info = (ge_video_s *)calloc(1, sizeof(ge_video_s));\r
+ if (NULL == video_info) {\r
+ goto GE_LOCAL_FAILED;\r
+ }\r
+\r
+ item->video_info = video_info;\r
+ if (video_meta_clone(&(video_info->video_h), video_handle) != MEDIA_CONTENT_ERROR_NONE) {\r
+ ge_dbgE("Clone video handle error");\r
+ goto GE_LOCAL_FAILED;\r
+ }\r
+ if (video_meta_get_media_id(video_handle, &(video_info->media_uuid)) != MEDIA_CONTENT_ERROR_NONE) {\r
+ ge_dbgE("Get video id error");\r
+ goto GE_LOCAL_FAILED;\r
+ }\r
+ if (video_meta_get_title(video_handle, &(video_info->title)) != MEDIA_CONTENT_ERROR_NONE) {\r
+ ge_dbgE("Get video title error");\r
+ goto GE_LOCAL_FAILED;\r
+ }\r
+ if (video_meta_get_duration(video_handle, &(video_info->duration)) != MEDIA_CONTENT_ERROR_NONE) {\r
+ ge_dbgE("Get video duration error");\r
+ goto GE_LOCAL_FAILED;\r
+ }\r
+ if (video_meta_get_played_time(video_handle, &(video_info->last_played_pos)) != MEDIA_CONTENT_ERROR_NONE) {\r
+ ge_dbgE("Get video last played position error");\r
+ goto GE_LOCAL_FAILED;\r
+ }\r
+\r
+ if (video_meta_destroy(video_handle) != MEDIA_CONTENT_ERROR_NONE) {\r
+ ge_dbgE("Destroy video handle error");\r
+ goto GE_LOCAL_FAILED;\r
+ }\r
+\r
+ /* Get bookmar elist in case of video */\r
+ if (video_info->media_uuid) {\r
+ video_info->bookmarks = 0;\r
+ int count = 0;\r
+ ret = media_info_get_bookmark_count_from_db(video_info->media_uuid,\r
+ NULL,\r
+ &count);\r
+ if (ret != MEDIA_CONTENT_ERROR_NONE)\r
+ ge_dbgE("Failed to get bookmark[%d]", ret);\r
+ else\r
+ video_info->bookmarks = count;\r
+ }\r
+ }\r
+\r
+ GE_LOCAL_SUCCESS:\r
+\r
+ if (tmp_data->album_id)\r
+ item->album_uuid = strdup(tmp_data->album_id);\r
+ else\r
+ item->album_uuid = NULL;\r
+\r
+ *elist = eina_list_append(*elist, item);\r
+ return true;\r
+\r
+ GE_LOCAL_FAILED:\r
+\r
+ if (image_handle)\r
+ image_meta_destroy(image_handle);\r
+ if (video_handle)\r
+ video_meta_destroy(video_handle);\r
+\r
+ _ge_data_type_free_geitem((void **)(&item));\r
+ return false;\r
+}\r
+\r
+int _ge_local_data_connect(void)\r
+{\r
+ int ret = -1;\r
+\r
+ ret = media_content_connect();\r
+ if(ret == MEDIA_CONTENT_ERROR_NONE) {\r
+ ge_dbg("DB connection is success");\r
+ return 0;\r
+ } else {\r
+ ge_dbgE("DB connection is failed!");\r
+ return -1;\r
+ }\r
+}\r
+\r
+int _ge_local_data_disconnect(void)\r
+{\r
+ int ret = -1;\r
+\r
+ ret = media_content_disconnect();\r
+ if(ret == MEDIA_CONTENT_ERROR_NONE) {\r
+ ge_dbg("DB disconnection is success");\r
+ return 0;\r
+ } else {\r
+ ge_dbgE("DB disconnection is failed!");\r
+ return -1;\r
+ }\r
+}\r
+\r
+int _ge_local_data_get_album_list(ge_filter_s *condition, Eina_List **elilst)\r
+{\r
+ GE_CHECK_VAL(elilst, -1);\r
+ GE_CHECK_VAL(condition, -1);\r
+ int ret = -1;\r
+ filter_h filter = NULL;\r
+\r
+ ret = __ge_local_data_create_filter(condition, &filter);\r
+ if (ret != 0) {\r
+ ge_dbgE("Create filter failed[%d]!", ret);\r
+ return -1;\r
+ }\r
+\r
+ filter_h media_filter = NULL;\r
+ ge_filter_s media_condition;\r
+ memset(&media_condition, 0x00, sizeof(ge_filter_s));\r
+ if (strlen(condition->cond))\r
+ g_strlcpy(media_condition.cond, condition->cond,\r
+ CONDITION_LENGTH);\r
+ memset(condition->cond, 0x00, CONDITION_LENGTH);\r
+ media_condition.sort_type = MEDIA_CONTENT_ORDER_DESC;\r
+ g_strlcpy(media_condition.sort_keyword, MEDIA_MODIFIED_TIME,\r
+ KEYWORD_LENGTH);\r
+ media_condition.collate_type = MEDIA_CONTENT_COLLATE_NOCASE;\r
+ media_condition.offset = -1;\r
+ media_condition.count = -1;\r
+ media_condition.with_meta = false;\r
+\r
+ ret = __ge_local_data_create_filter(&media_condition, &media_filter);\r
+ if (ret != 0) {\r
+ __ge_local_data_destroy_filter(filter);\r
+ ge_dbgE("Create filter failed[%d]!", ret);\r
+ return -1;\r
+ }\r
+\r
+ ge_transfer_data_s tran_data;\r
+ memset(&tran_data, 0x00, sizeof(ge_transfer_data_s));\r
+ tran_data.userdata = (void **)elilst;\r
+ tran_data.filter = media_filter;\r
+ tran_data.album_id = NULL;\r
+ tran_data.with_meta = false;\r
+\r
+ ge_dbg("Get folders--start");\r
+ ret = media_folder_foreach_folder_from_db(filter,\r
+ __ge_local_data_get_album_list_cb,\r
+ &tran_data);\r
+ ge_dbg("Get folders--over");\r
+\r
+ __ge_local_data_destroy_filter(media_filter);\r
+ __ge_local_data_destroy_filter(filter);\r
+\r
+ if (ret != MEDIA_CONTENT_ERROR_NONE) {\r
+ ge_dbgE("Get folders failed[%d]!", ret);\r
+ return -1;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+int _ge_local_data_get_media_count(const char *cluster_id, ge_filter_s *condition,\r
+ int *item_cnt){\r
+ GE_CHECK_VAL(cluster_id, -1);\r
+ GE_CHECK_VAL(condition, -1);\r
+ GE_CHECK_VAL(item_cnt, -1);\r
+ int ret = -1;\r
+ filter_h filter = NULL;\r
+\r
+ ret = __ge_local_data_create_filter(condition, &filter);\r
+ if (ret != 0) {\r
+ ge_dbgE("Create filter failed[%d]!", ret);\r
+ return -1;\r
+ }\r
+\r
+ ge_dbg("Get media count--start");\r
+ ret = media_folder_get_media_count_from_db(cluster_id, filter,\r
+ item_cnt);\r
+ ge_dbg("Get media count--over");\r
+\r
+ __ge_local_data_destroy_filter(filter);\r
+\r
+ if (ret != MEDIA_CONTENT_ERROR_NONE) {\r
+ ge_dbgE("Get media count failed[d]!", ret);\r
+ return -1;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+int _ge_local_data_get_all_media_count(ge_filter_s *condtion, int *item_cnt)\r
+{\r
+ GE_CHECK_VAL(condtion, -1);\r
+ GE_CHECK_VAL(item_cnt, -1);\r
+ int ret = -1;\r
+ filter_h filter = NULL;\r
+\r
+ ret = __ge_local_data_create_filter(condtion, &filter);\r
+ if (ret != 0) {\r
+ ge_dbgE("Create filter failed[%d]!", ret);\r
+ return -1;\r
+ }\r
+\r
+ ge_dbg("Get media count--start");\r
+ ret = media_info_get_media_count_from_db(filter, item_cnt);\r
+ ge_dbg("Get media count--over");\r
+\r
+ __ge_local_data_destroy_filter(filter);\r
+\r
+ if (ret != MEDIA_CONTENT_ERROR_NONE) {\r
+ ge_dbgE("Get media count failed[d]!", ret);\r
+ return -1;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+int _ge_local_data_get_media(const char *media_id, ge_media_s **mitem)\r
+{\r
+ GE_CHECK_VAL(mitem, -1);\r
+\r
+ if (media_id == NULL) {\r
+ ge_dbg("Create a empty media");\r
+ _ge_data_type_new_media(mitem);\r
+ return 0;\r
+ }\r
+\r
+ int ret = -1;\r
+ Eina_List *list = NULL;\r
+ ge_media_s *_mitem = NULL;\r
+ int i = 0;\r
+\r
+ ge_dbg("media id: %s", media_id);\r
+ media_info_h media_h = NULL;\r
+\r
+ ret = media_info_get_media_from_db(media_id, &media_h);\r
+ if (ret != MEDIA_CONTENT_ERROR_NONE) {\r
+ ge_dbgE("Get media handle failed[%d]!", ret);\r
+ if (media_h)\r
+ media_info_destroy(media_h);\r
+ return -1;\r
+ }\r
+\r
+ ge_transfer_data_s tran_data;\r
+ memset(&tran_data, 0x00, sizeof(ge_transfer_data_s));\r
+ tran_data.userdata = (void **)&list;\r
+ tran_data.filter = NULL;\r
+ tran_data.album_id = NULL;\r
+ tran_data.with_meta = false;\r
+\r
+ ge_dbg("Get media list--start");\r
+ bool b_ret = __ge_local_data_get_media_list_cb(media_h, &tran_data);\r
+ ge_dbg("Get media list--over");\r
+\r
+ media_info_destroy(media_h);\r
+\r
+ if (b_ret && list) {\r
+ *mitem = eina_list_nth(list, 0);\r
+ i = 1;\r
+ ret = 0;\r
+ } else {\r
+ ge_dbgE("Failed to get media list!");\r
+ ret = -1;\r
+ }\r
+\r
+ /* Free other items */\r
+ if (list) {\r
+ int len = eina_list_count(list);\r
+ ge_dbg("len: %d", len);\r
+\r
+ for(; i < len; i++) {\r
+ _mitem = eina_list_nth(list, i);\r
+ _ge_data_type_free_geitem((void **)(&_mitem));\r
+ }\r
+\r
+ eina_list_free(list);\r
+ }\r
+\r
+ return ret;\r
+}\r
+\r
+int _ge_local_data_get_album_media_list(char *album_id, ge_filter_s *condition,\r
+ Eina_List **elist)\r
+{\r
+ GE_CHECK_VAL(elist, -1);\r
+ GE_CHECK_VAL(album_id, -1);\r
+ GE_CHECK_VAL(condition, -1);\r
+ int ret = -1;\r
+ filter_h filter = NULL;\r
+\r
+ ret = __ge_local_data_create_filter(condition, &filter);\r
+ if (ret != 0) {\r
+ ge_dbgE("Create filter failed!");\r
+ return -1;\r
+ }\r
+\r
+ ge_transfer_data_s tran_data;\r
+ memset(&tran_data, 0x00, sizeof(ge_transfer_data_s));\r
+ tran_data.userdata = (void **)elist;\r
+ tran_data.filter = NULL;\r
+ tran_data.album_id = album_id;\r
+ tran_data.with_meta = condition->with_meta;\r
+\r
+ ge_dbg("Get medias--start");\r
+ ret = media_folder_foreach_media_from_db(album_id, filter,\r
+ __ge_local_data_get_media_list_cb,\r
+ &tran_data);\r
+ ge_dbg("Get medias--over");\r
+\r
+ __ge_local_data_destroy_filter(filter);\r
+\r
+ if (ret != MEDIA_CONTENT_ERROR_NONE) {\r
+ ge_dbgE("Get medias failed[d]!", ret);\r
+ return -1;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+int _ge_local_data_get_all_albums_media_list(ge_filter_s *condition,\r
+ Eina_List **elist)\r
+{\r
+ GE_CHECK_VAL(elist, -1);\r
+ GE_CHECK_VAL(condition, -1);\r
+ int ret = -1;\r
+ filter_h filter = NULL;\r
+\r
+ ret = __ge_local_data_create_filter(condition, &filter);\r
+ if (ret != 0) {\r
+ ge_dbgE("Create filter failed!");\r
+ return -1;\r
+ }\r
+\r
+ ge_transfer_data_s tran_data;\r
+ memset(&tran_data, 0x00, sizeof(ge_transfer_data_s));\r
+ tran_data.userdata = (void **)elist;\r
+ tran_data.filter = NULL;\r
+ tran_data.album_id = NULL;\r
+ tran_data.with_meta = condition->with_meta;\r
+\r
+ ge_dbg("Get all medias--start");\r
+ ret = media_info_foreach_media_from_db(filter,\r
+ __ge_local_data_get_media_list_cb,\r
+ &tran_data);\r
+ ge_dbg("Get all medias--over");\r
+\r
+ __ge_local_data_destroy_filter(filter);\r
+\r
+ if (ret != MEDIA_CONTENT_ERROR_NONE) {\r
+ ge_dbgE("Get all medias failed[d]!", ret);\r
+ return -1;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifdef _USE_ROTATE_BG_GE
+
+#include "ge-rotate-bg.h"
+#include "ge-exif.h"
+#include "ge-debug.h"
+#include "ge-icon.h"
+
+#define GE_ROTATE_BG_DATA_KEY "ge_bg_data"
+#define GE_ROTATE_BG_GROUP "ge_bg_layout"
+
+typedef struct _ge_bg {
+ Evas_Object *base;
+ Evas_Object *img;
+ char *file;
+} ge_bg;
+
+static int __ge_rotate_bg_image_rotate_180(Evas_Object *obj)
+{
+ GE_CHECK_VAL(obj, -1);
+ unsigned int *data = NULL;
+ unsigned int *data2 = NULL;
+ unsigned int *to = NULL;
+ unsigned int *from = NULL;
+ int x = 0;
+ int hw = 0;
+ int iw = 0;
+ int ih = 0;
+
+ evas_object_image_size_get(obj, &iw, &ih);
+ int size = iw * ih * sizeof(unsigned int);
+
+ /* EINA_FALSE for reading */
+ data = evas_object_image_data_get(obj, EINA_FALSE);
+ /* memcpy */
+ data2 = calloc(1, size);
+ GE_CHECK_VAL(data2, -1);
+ memcpy(data2, data, size);
+
+ data = evas_object_image_data_get(obj, EINA_TRUE);
+
+ hw = iw * ih;
+ x = hw;
+ to = data;
+ from = data2 + hw - 1;
+ for (; --x >= 0;) {
+ *to = *from;
+ to++;
+ from--;
+ }
+
+#if 0 /* Failed to rotate icon created from original file */
+ hw = iw * ih;
+ x = (hw / 2);
+ p1 = data;
+ p2 = data + hw - 1;
+ for (; --x > 0;) {
+ tmp = *p1;
+ *p1 = *p2;
+ *p2 = tmp;
+ p1++;
+ p2--;
+ }
+#endif
+
+ GE_FREE(data2);
+
+ evas_object_image_data_set(obj, data);
+ evas_object_image_data_update_add(obj, 0, 0, iw, ih);
+ return 0;
+}
+
+static int __ge_rotate_bg_image_rotate_90(Evas_Object *obj)
+{
+ GE_CHECK_VAL(obj, -1);
+ unsigned int *data = NULL;
+ unsigned int *data2 = NULL;
+ unsigned int *to = NULL;
+ unsigned int *from = NULL;
+ int x = 0;
+ int y = 0;
+ int w = 0;
+ int hw = 0;
+ int iw = 0;
+ int ih = 0;
+
+ evas_object_image_size_get(obj, &iw, &ih);
+ int size = iw * ih * sizeof(unsigned int);
+
+ /* EINA_FALSE for reading */
+ data = evas_object_image_data_get(obj, EINA_FALSE);
+ /* memcpy */
+ data2 = calloc(1, size);
+ GE_CHECK_VAL(data2, -1);
+ memcpy(data2, data, size);
+
+ /* set width, height */
+ w = ih;
+ ih = iw;
+ iw = w;
+ hw = w * ih;
+
+ /* set width, height to image obj */
+ evas_object_image_size_set(obj, iw, ih);
+ data = evas_object_image_data_get(obj, EINA_TRUE);
+ to = data + w - 1;
+ hw = -hw - 1;
+ from = data2;
+
+ for (x = iw; --x >= 0;) {
+ for (y = ih; --y >= 0;) {
+ *to = *from;
+ from++;
+ to += w;
+ }
+
+ to += hw;
+ }
+
+ GE_FREE(data2);
+
+ evas_object_image_data_set(obj, data);
+ evas_object_image_data_update_add(obj, 0, 0, iw, ih);
+ return 0;
+}
+
+static int __ge_rotate_bg_image_rotate_270(Evas_Object *obj)
+{
+ GE_CHECK_VAL(obj, -1);
+ unsigned int *data = NULL;
+ unsigned int *data2 = NULL;
+ unsigned int *to = NULL;
+ unsigned int *from = NULL;
+ int x = 0;
+ int y = 0;
+ int w = 0;
+ int hw = 0;
+ int iw = 0;
+ int ih = 0;
+
+ evas_object_image_size_get(obj, &iw, &ih);
+ int size = iw * ih * sizeof(unsigned int);
+
+ /* EINA_FALSE for reading */
+ data = evas_object_image_data_get(obj, EINA_FALSE);
+ /* memcpy */
+ data2 = calloc(1, size);
+ GE_CHECK_VAL(data2, -1);
+ memcpy(data2, data, size);
+
+ /* set width, height */
+ w = ih;
+ ih = iw;
+ iw = w;
+ hw = w * ih;
+
+ /* set width, height to image obj */
+ evas_object_image_size_set(obj, iw, ih);
+ data = evas_object_image_data_get(obj, EINA_TRUE);
+
+ to = data + hw - w;
+ w = -w;
+ hw = hw + 1;
+ from = data2;
+
+ for (x = iw; --x >= 0;) {
+ for (y = ih; --y >= 0;) {
+ *to = *from;
+ from++;
+ to += w;
+ }
+
+ to += hw;
+ }
+
+ GE_FREE(data2);
+
+ evas_object_image_data_set(obj, data);
+ evas_object_image_data_update_add(obj, 0, 0, iw, ih);
+ return 0;
+}
+
+/* check its orientation */
+int __ge_rotate_bg_rotate_image(Evas_Object *obj, unsigned int orient)
+{
+ switch (orient){
+ case GE_ORIENTATION_ROT_90:
+ __ge_rotate_bg_image_rotate_90(obj);
+ break;
+ case GE_ORIENTATION_ROT_180:
+ __ge_rotate_bg_image_rotate_180(obj);
+ break;
+ case GE_ORIENTATION_ROT_270:
+ __ge_rotate_bg_image_rotate_270(obj);
+ break;
+ default:
+ break;
+ }
+
+ return 0;
+}
+
+static void __ge_rotate_bg_delete_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ if (data) {
+ ge_bg *bg_data = (ge_bg *)data;
+ GE_FREEIF(bg_data->file);
+ GE_FREE(data);
+ }
+}
+
+static void __ge_rotate_bg_custom_resize(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ GE_CHECK(data);
+ ge_bg *bg_data = (ge_bg *)data;
+ Evas_Coord bx = 0;
+ Evas_Coord by = 0;
+ Evas_Coord bw = 0;
+ Evas_Coord bh = 0;
+ Evas_Coord iw = 0;
+ Evas_Coord ih = 0;
+ Evas_Coord fx = 0;
+ Evas_Coord fy = 0;
+ Evas_Coord fw = 0;
+ Evas_Coord fh = 0;
+ Evas_Coord nx = 0;
+ Evas_Coord ny = 0;
+ Evas_Coord nw = 0;
+ Evas_Coord nh = 0;
+
+ if ((!bg_data->img) || (!bg_data->base)) {
+ ge_dbgE("Invalid object!");
+ return;
+ }
+ /* grab image size */
+ evas_object_image_size_get(bg_data->img, &iw, &ih);
+ if ((iw < 1) || (ih < 1)) {
+ ge_dbgE("(iw < 1) || (ih < 1)!");
+ return;
+ }
+
+ /* grab base object dimensions */
+ evas_object_geometry_get(bg_data->base, &bx, &by, &bw, &bh);
+
+ /* set some defaults */
+ nx = bx;
+ ny = by;
+ nw = bw;
+ nh = bh;
+
+
+ fw = bw;
+ fh = ((ih * fw) / iw);
+ if (fh < bh) {
+ fh = bh;
+ fw = ((iw * fh) / ih);
+ }
+ fx = ((bw - fw) / 2);
+ fy = ((bh - fh) / 2);
+
+ evas_object_move(bg_data->img, nx, ny);
+ evas_object_resize(bg_data->img, nw, nh);
+ evas_object_image_fill_set(bg_data->img, fx, fy, fw, fh);
+}
+
+Evas_Object *_ge_rotate_bg_add_layout(Evas_Object *parent, const char *file, const char *group)
+{
+ Evas_Object *eo = NULL;
+ int r = 0;
+
+ eo = elm_layout_add(parent);
+ if (eo) {
+ r = elm_layout_file_set(eo, file, group);
+ if (!r) {
+ evas_object_del(eo);
+ return NULL;
+ }
+
+ evas_object_size_hint_weight_set(eo, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(eo, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ }
+
+ return eo;
+}
+
+Evas_Object *_ge_rotate_bg_add(Evas_Object *parent)
+{
+ GE_CHECK_NULL(parent);
+ ge_dbg("");
+
+ ge_bg *bg_data = (ge_bg *)calloc(1, sizeof(ge_bg));
+ GE_CHECK_NULL(bg_data);
+
+ Evas_Object *base = NULL;
+ base = _ge_rotate_bg_add_layout(parent, GE_EDJ_FILE,
+ GE_ROTATE_BG_GROUP);
+ if (base == NULL) {
+ GE_FREE(bg_data);
+ return NULL;
+ }
+
+ bg_data->base= base;
+ evas_object_event_callback_add(base, EVAS_CALLBACK_RESIZE,
+ __ge_rotate_bg_custom_resize, bg_data);
+ evas_object_event_callback_add(base, EVAS_CALLBACK_DEL,
+ __ge_rotate_bg_delete_cb, bg_data);
+
+ evas_object_data_set(base, GE_ROTATE_BG_DATA_KEY, bg_data);
+ ge_dbg("base %p", base);
+ return base;
+}
+
+int _ge_rotate_bg_set_file(Evas_Object *bg, const char *file, int w, int h)
+{
+ GE_CHECK_VAL(file, -1);
+ GE_CHECK_VAL(bg, -1);
+
+ ge_bg *bg_data = evas_object_data_get(bg, GE_ROTATE_BG_DATA_KEY);
+ GE_CHECK_VAL(bg_data, -1);
+
+ Evas_Object *image_obj = NULL;
+ image_obj = evas_object_image_add(evas_object_evas_get(bg));
+ evas_object_repeat_events_set(image_obj, EINA_TRUE);
+ bg_data->img = image_obj;
+ bg_data->file = strdup(file);
+ elm_object_part_content_set(bg, "elm.swallow.image", image_obj);
+ evas_object_image_load_size_set(image_obj, w, h);
+ evas_object_image_file_set(image_obj, file, NULL);
+ evas_object_image_preload(image_obj, EINA_FALSE);
+ return 0;
+}
+
+int _ge_rotate_bg_rotate_image(Evas_Object *bg, unsigned int orient)
+{
+ GE_CHECK_VAL(bg, -1);
+
+ ge_bg *bg_data = evas_object_data_get(bg, GE_ROTATE_BG_DATA_KEY);
+ GE_CHECK_VAL(bg_data, -1);
+
+ if (bg_data->file && g_strcmp0(bg_data->file, GE_DEFAULT_THUMB_ICON))
+ __ge_rotate_bg_rotate_image(bg_data->img, orient);
+ else
+ __ge_rotate_bg_rotate_image(bg_data->img, GE_ORIENTATION_ROT_0);
+ __ge_rotate_bg_custom_resize(bg_data, NULL, NULL, NULL);
+ return 0;
+}
+
+int _ge_rotate_bg_add_image(Evas_Object *bg, int w, int h)
+{
+ GE_CHECK_VAL(bg, -1);
+
+ ge_bg *bg_data = evas_object_data_get(bg, GE_ROTATE_BG_DATA_KEY);
+ GE_CHECK_VAL(bg_data, -1);
+
+ Evas_Object *image_obj = NULL;
+ image_obj = evas_object_image_add(evas_object_evas_get(bg));
+ evas_object_image_size_set(image_obj, w, h);
+ evas_object_image_fill_set(image_obj, 0, 0, w, h);
+ evas_object_repeat_events_set(image_obj, EINA_TRUE);
+ bg_data->img = image_obj;
+ elm_object_part_content_set(bg, "elm.swallow.image", image_obj);
+ evas_object_image_load_size_set(image_obj, w, h);
+ return 0;
+}
+
+int _ge_rotate_bg_set_image_file(Evas_Object *bg, const char *file)
+{
+ GE_CHECK_VAL(bg, -1);
+
+ ge_bg *bg_data = evas_object_data_get(bg, GE_ROTATE_BG_DATA_KEY);
+ GE_CHECK_VAL(bg_data, -1);
+ GE_CHECK_VAL(bg_data->img, -1);
+
+ evas_object_image_file_set(bg_data->img, file, NULL);
+ evas_object_image_preload(bg_data->img, EINA_FALSE);
+
+ __ge_rotate_bg_custom_resize(bg_data, NULL, NULL, NULL);
+ return 0;
+}
+
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "ge-debug.h"
+#include "ge-util.h"
+#include "ge-drm.h"
+#include "ge-strings.h"
+#include "ge-icon.h"
+#ifdef _USE_ROTATE_BG_GE
+#include "ge-rotate-bg.h"
+#include "ge-exif.h"
+#endif
+
+#define GE_PHOTOFRAME_STYLE_VIDEO_FAVOR_BOOKMARK "default_layout_video_favor_bookmark"
+#define GE_PHOTOFRAME_STYLE_VIDEO_BOOKMARK "default_layout_video_bookmark"
+#define GE_PHOTOFRAME_STYLE_VIDEO_FAVOR "default_layout_video_favor"
+#define GE_PHOTOFRAME_STYLE_VIDEO "default_layout_video"
+#define GE_PHOTOFRAME_STYLE_FAVOR "default_layout_favor"
+#define GE_PHOTOFRAME_STYLE_DEFAULT "default_layout"
+
+#define GE_CLASS_GENGRID "gengrid"
+#define GE_GRP_PHOTOFRAME "photoframe"
+#define GE_GRID_TEXT "elm.text"
+
+Evas_Object *_ge_thumb_show_part_icon_image(Evas_Object *obj, char *path,
+ unsigned int orient, bool b_favor,
+ bool is_expired_drm, int item_size)
+{
+ GE_CHECK_NULL(obj);
+
+ Evas_Object *layout = elm_layout_add(obj);
+ GE_CHECK_NULL(layout);
+
+#ifdef _USE_ROTATE_BG_GE
+ Evas_Object *bg = _ge_rotate_bg_add(layout);
+#else
+ Evas_Object *bg = elm_bg_add(layout);
+#endif
+ if (bg == NULL) {
+ evas_object_del(layout);
+ return NULL;
+ }
+
+#ifdef _USE_ROTATE_BG_GE
+ _ge_rotate_bg_set_file(bg, path, item_size, item_size);
+ _ge_rotate_bg_rotate_image(bg, orient);
+#else
+ elm_bg_file_set(bg, path, NULL);
+ elm_bg_load_size_set(bg, item_size, item_size);
+ evas_object_size_hint_max_set(bg, item_size, item_size);
+ evas_object_size_hint_aspect_set(bg, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
+ evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bg, EVAS_HINT_FILL, EVAS_HINT_FILL);
+#endif
+
+ // TODO: Need to check the expired drm icon file...
+ /* Expired drm icon */
+ if (is_expired_drm) {
+ elm_layout_theme_set(layout, GE_CLASS_GENGRID, GE_GRP_PHOTOFRAME,
+ GE_PHOTOFRAME_STYLE_FAVOR);
+ elm_object_part_content_set(layout, "elm.swallow.icon", bg);
+
+ Evas_Object *icon = elm_icon_add(layout);
+ elm_image_file_set(icon, GE_LOCK_ICON, NULL);
+ evas_object_show(icon);
+ elm_object_part_content_set(layout, "elm.swallow.favoricon",
+ icon);
+ } else if (b_favor) {
+ /* Set favourites icon */
+ elm_layout_theme_set(layout, GE_CLASS_GENGRID, GE_GRP_PHOTOFRAME,
+ GE_PHOTOFRAME_STYLE_FAVOR);
+ elm_object_part_content_set(layout, "elm.swallow.icon", bg);
+
+ Evas_Object *icon = elm_icon_add(layout);
+ elm_image_file_set(icon, GE_THUMB_FAVOR_ICON, NULL);
+ evas_object_show(icon);
+ elm_object_part_content_set(layout, "elm.swallow.favoricon",
+ icon);
+ } else {
+ elm_layout_theme_set(layout, GE_CLASS_GENGRID, GE_GRP_PHOTOFRAME,
+ GE_PHOTOFRAME_STYLE_DEFAULT);
+ elm_object_part_content_set(layout, "elm.swallow.icon", bg);
+ }
+
+ evas_object_show(layout);
+ return layout;
+}
+
+Evas_Object *_ge_thumb_show_part_icon_video(Evas_Object *obj, char *path,
+ unsigned int v_dur, int bk_len,
+ bool b_favor, bool is_expired_drm,
+ int item_size)
+{
+ GE_CHECK_NULL(obj);
+
+ Evas_Object *layout = elm_layout_add(obj);
+ GE_CHECK_NULL(layout);
+
+#ifdef _USE_ROTATE_BG_GE
+ Evas_Object *bg = _ge_rotate_bg_add(layout);
+#else
+ Evas_Object *bg = elm_bg_add(layout);
+#endif
+ if (bg == NULL) {
+ evas_object_del(layout);
+ return NULL;
+ }
+
+#ifdef _USE_ROTATE_BG_GE
+ _ge_rotate_bg_set_file(bg, path, item_size, item_size);
+ _ge_rotate_bg_rotate_image(bg, GE_ORIENTATION_ROT_0);
+#else
+ elm_bg_file_set(bg, path, NULL);
+ elm_bg_load_size_set(bg, item_size, item_size);
+ evas_object_size_hint_max_set(bg, item_size, item_size);
+ evas_object_size_hint_aspect_set(bg, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
+ evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bg, EVAS_HINT_FILL, EVAS_HINT_FILL);
+#endif
+
+ if (bk_len && b_favor)
+ elm_layout_theme_set(layout, GE_CLASS_GENGRID, GE_GRP_PHOTOFRAME,
+ GE_PHOTOFRAME_STYLE_VIDEO_FAVOR_BOOKMARK);
+ else if (bk_len)
+ elm_layout_theme_set(layout, GE_CLASS_GENGRID, GE_GRP_PHOTOFRAME,
+ GE_PHOTOFRAME_STYLE_VIDEO_BOOKMARK);
+ else if (is_expired_drm || b_favor)
+ elm_layout_theme_set(layout, GE_CLASS_GENGRID, GE_GRP_PHOTOFRAME,
+ GE_PHOTOFRAME_STYLE_VIDEO_FAVOR);
+ else
+ elm_layout_theme_set(layout, GE_CLASS_GENGRID, GE_GRP_PHOTOFRAME,
+ GE_PHOTOFRAME_STYLE_VIDEO);
+ elm_object_part_content_set(layout, "elm.swallow.icon", bg);
+
+ // TODO: Need to check the expired drm icon file...
+ /* Expired drm icon */
+ if (is_expired_drm) {
+ Evas_Object *icon = elm_icon_add(layout);
+ elm_image_file_set(icon, GE_LOCK_ICON, NULL);
+ evas_object_show(icon);
+ elm_object_part_content_set(layout, "elm.swallow.favoricon",
+ icon);
+ /* Set favourites icon */
+ } else if (b_favor) {
+ Evas_Object *icon = elm_icon_add(layout);
+ elm_image_file_set(icon, GE_THUMB_FAVOR_ICON, NULL);
+ evas_object_show(icon);
+ elm_object_part_content_set(layout, "elm.swallow.favoricon",
+ icon);
+ }
+
+ if (bk_len) {
+ Evas_Object *icon = elm_icon_add(layout);
+ elm_image_file_set(icon, GE_THUMB_BOOKMARK, NULL);
+ evas_object_show(icon);
+ elm_object_part_content_set(layout, "elm.swallow.bookmarkicon",
+ icon);
+ }
+
+ char *dur_str = _ge_get_duration_string(v_dur);
+ GE_CHECK_NULL(dur_str);
+ elm_object_part_text_set(layout, GE_GRID_TEXT, dur_str);
+ GE_FREE(dur_str);
+
+ evas_object_show(layout);
+ return layout;
+}
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "ge-debug.h"
+#include "ge-tile.h"
+#include "ge-button.h"
+#include "ge-icon.h"
+#ifdef _USE_ROTATE_BG_GE
+#include "ge-rotate-bg.h"
+#endif
+
+/* Album color level and alpha value */
+#define GE_TILE_TEXT_COLOR_CNT 6
+#define GE_TILE_TEXT_COLOR_ALPHA 255
+
+typedef struct _ge_tile_color {
+ int r;
+ int g;
+ int b;
+} ge_tile_color;
+
+static ge_tile_color bg_color[] = {
+ {50, 50, 50},
+ {78, 74, 64},
+ {49, 125, 174},
+ {165, 53, 53},
+ {71, 128, 11},
+ {56, 78, 116},
+ {25, 25, 25},
+};
+
+Evas_Object *__ge_tile_add_1_icon_bg(Evas_Object *obj, int len, double scale,
+ bg_file_set_cb func, void **data)
+{
+ GE_CHECK_NULL(obj);
+ GE_CHECK_NULL(func);
+ Evas_Object *bg = NULL;
+
+#ifdef _USE_ROTATE_BG_GE
+ bg = _ge_rotate_bg_add(obj);
+#else
+ bg = elm_bg_add(obj);
+#endif
+ GE_CHECK_NULL(bg);
+
+ int wid = 0;
+ int hei = 0;
+
+ wid = (int)(GE_TILER_ICON_S * scale);
+ if (len == 1)
+ hei = wid;
+ else
+ hei = (int)(GE_TILE_2X_GRID_S * scale);
+
+#ifdef _USE_ROTATE_BG_GE
+ _ge_rotate_bg_add_image(bg, wid, hei);
+#else
+ elm_bg_load_size_set(bg, wid, hei);
+#endif
+
+ func(bg, data[0]);
+
+ evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bg, 0.5, 0.5);
+ evas_object_show(bg);
+
+ return bg;
+}
+
+Evas_Object *_ge_tile_show_part_icon(Evas_Object *obj, const char *part,
+ int length, double scale,
+ bg_file_set_cb func, void **data)
+{
+ GE_CHECK_NULL(part);
+ GE_CHECK_NULL(strlen(part));
+ GE_CHECK_NULL(obj);
+ ge_dbg("part is %s", part);
+
+ if (!g_strcmp0(part, GT_TILE_ONLYICON)) {
+ Evas_Object *bg = NULL;
+ bg = __ge_tile_add_1_icon_bg(obj, GE_TILE_THUMB_1, scale, func,
+ data);
+ return bg;
+ }
+ return NULL;
+}
+
+Evas_Object *_ge_tile_show_part_label(Evas_Object *obj, int index,
+ bool b_default)
+{
+ GE_CHECK_NULL(obj);
+
+ Evas *evas = evas_object_evas_get(obj);
+ GE_CHECK_NULL(evas);
+ Evas_Object *bg = NULL;
+ bg = evas_object_rectangle_add(evas);
+ GE_CHECK_NULL(bg);
+
+ int j = 0;
+ if (b_default)
+ j = GE_TILE_TEXT_COLOR_CNT;
+ else
+ j = index % GE_TILE_TEXT_COLOR_CNT;
+ evas_object_color_set(bg, bg_color[j].r, bg_color[j].g, bg_color[j].b,
+ GE_TILE_TEXT_COLOR_ALPHA);
+
+ evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(bg, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_show(bg);
+ return bg;
+}
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "ge-ui-util.h"
+#include "ge-util.h"
+#include "ge-button.h"
+#include "ge-gridview.h"
+#include "ge-albums.h"
+#include "ge-debug.h"
+#include "ge-data.h"
+#include "ge-strings.h"
+#include "ge-icon.h"
+
+#define GE_FILE_PATH_SEPERATOR ';'
+
+#define HOME_ALBUM_COVER_NUM 1
+#define VIDEO_SHARE_NUM 1
+#define GE_NOBUT_EXIT_POPUP_HIDE_TIME_DELAY 3.0
+#define GE_SELINFO_HIDE_TIME_DELAY 3.0
+#define GE_CTRLBAR_STYLE_NAVIFRAME "naviframe"
+#define GE_BTN_NAVI_PRE "naviframe/back_btn/default"
+#define GE_BTN_NAVI_TOOLBAR "naviframe/toolbar/default"
+#define GE_NAVIFRAME_BTN1 "toolbar_button1"
+#define GE_BTN_POPUP "popup_button/default"
+#define GE_NAVIFRAME_PREB_BTN "prev_btn"
+#define GE_TRANS_FINISHED "transition,finished"
+///This variable is used only for emulator.
+static int g_angle = 0;
+
+static void _ge_ui_response_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ ge_dbg("event_info: %d", (int)event_info);
+ GE_CHECK(data);
+ ge_ugdata *ugd = (ge_ugdata *)data;
+ ge_dbg("popup mode: %d", ugd->popup_mode);
+
+ evas_object_del(obj);
+ ugd->popup = NULL;
+}
+
+static Eina_Bool __ge_popup_timeout_cb(void *data)
+{
+ GE_CHECK_FALSE(data);
+ ge_ugdata *ugd = (ge_ugdata *)data;
+ if (ugd->del_timer) {
+ ecore_timer_del(ugd->del_timer);
+ ugd->del_timer = NULL;
+ }
+
+ /* Used for adding shortcut failed */
+ if (ugd->popup_mode == GE_POPUP_EXIT) {
+ ge_dbgW("Terminate me!");
+ ug_destroy_me(ugd->ug);
+ ugd->ug = NULL;
+ }
+
+ GE_IF_DEL_OBJ(ugd->popup);
+ return ECORE_CALLBACK_CANCEL;
+}
+
+static int __ge_popup_add_timer(void *data, double to_inc)
+{
+ GE_CHECK_VAL(data, -1);
+ ge_ugdata *ugd = (ge_ugdata *)data;
+ if (ugd->del_timer) {
+ ecore_timer_del(ugd->del_timer);
+ ugd->del_timer = NULL;
+ }
+
+ ugd->del_timer = ecore_timer_add(to_inc, __ge_popup_timeout_cb, data);
+ return 0;
+}
+
+static void __ge_ui_done_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ ge_dbg("");
+ GE_CHECK(data);
+ ge_ugdata *ugd = (ge_ugdata *)data;
+ int i = 0;
+
+ elm_object_item_disabled_set((Elm_Object_Item *)event_info, EINA_TRUE);
+
+ if(ugd->file_select_mode) //file selection mode
+ {
+ ge_item* sel_item = NULL;
+ char* filepath_arg = NULL;
+ int sel_cnt = _ge_data_selected_list_count();
+
+ if(sel_cnt == 0)
+ {
+ ge_dbg("No thumbs selected, return!");
+ ge_ui_create_popup(ugd, GE_POPUP_NOBUT,
+ GE_POPUP_NO_FILES_SELECTED);
+ return;
+ }
+
+ if(ugd->file_select_mode == GE_FILE_SELECT_T_MULTIPLE) {
+ GString* selected_path = g_string_new(NULL);
+
+ for(i = 1; i <= sel_cnt; i++ ) {
+ _ge_data_get_selected_item_by_index(&sel_item, i);
+ if(sel_item && sel_item->item) {
+ ge_dbg("Selected [%s]", sel_item->item->file_url);
+ g_string_append(selected_path, sel_item->item->file_url);
+ g_string_append_c(selected_path,
+ GE_FILE_PATH_SEPERATOR);
+ }
+ }
+ int str_len = strlen(selected_path->str);
+ ge_dbg("path string length = %d", str_len);
+ g_string_truncate(selected_path, str_len - 1);
+
+ filepath_arg = g_string_free(selected_path, false);
+
+ char t_str[32] = { 0, };
+ eina_convert_itoa(sel_cnt, t_str);
+
+ service_add_extra_data(ugd->service,
+ GE_FILE_SELECT_RETURN_COUNT,
+ t_str);
+ service_add_extra_data(ugd->service,
+ GE_FILE_SELECT_RETURN_PATH,
+ filepath_arg);
+ service_add_extra_data(ugd->service,
+ SERVICE_DATA_SELECTED,
+ filepath_arg);
+ ug_send_result(ugd->ug, ugd->service);
+
+ if(filepath_arg) {
+ g_free(filepath_arg);
+ filepath_arg = NULL;
+ }
+ }
+
+ _ge_data_selected_list_finalize();
+
+ ug_destroy_me(ugd->ug);
+ }
+}
+
+static int __ge_ui_disable_done(ge_ugdata *ugd, bool disabled)
+{
+ ge_dbg("Disable Done(%d)?", disabled);
+ GE_CHECK_VAL(ugd, -1);
+ GE_CHECK_VAL(ugd->thumbs_nf_it, -1);
+
+ Evas_Object *btn = NULL;
+ btn = elm_object_item_part_content_get(ugd->thumbs_nf_it,
+ GE_NAVIFRAME_BTN1);
+ elm_object_disabled_set(btn, disabled);
+ return 0;
+}
+
+static void __ge_ui_trans_finished_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ GE_CHECK(data);
+ ge_ugdata *ugd = (ge_ugdata *)data;
+ ge_dbgW("");
+ evas_object_smart_callback_del(obj, GE_TRANS_FINISHED,
+ __ge_ui_trans_finished_cb);
+
+ /* Clear previous view after animation finished */
+ elm_gengrid_clear(ugd->albums_view);
+}
+
+static void _ge_ui_destroy_me_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ ge_dbg("");
+ GE_CHECK(data);
+ ge_ugdata *ugd = (ge_ugdata *)data;
+ /* Delete callback when it is clicked to prevent it is called for many times */
+ evas_object_smart_callback_del(obj, "clicked", _ge_ui_destroy_me_cb);
+
+ if (_ge_get_view_mode() != GE_VIEW_ALBUMS) {
+ if(ugd->file_select_mode == GE_FILE_SELECT_T_MULTIPLE) {
+ ge_ui_destroy_selinfo(ugd);
+ _ge_data_selected_list_finalize();
+ }
+ ge_grid_clear_view(ugd);
+ }
+
+ service_add_extra_data(ugd->service, GE_FILE_SELECT_RETURN_QUIT,
+ GE_FILE_SELECT_QUIT_STATE);
+ ug_send_result(ugd->ug, ugd->service);
+
+ ug_destroy_me(ugd->ug);
+ ge_dbg("ug_destroy_me");
+}
+
+static void _ge_ui_back_to_albums_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ ge_dbg("");
+ GE_CHECK(data);
+ ge_ugdata *ugd = (ge_ugdata *)data;
+ /* Delete callback when it is clicked to prevent it is called for many times */
+ evas_object_smart_callback_del(obj, "clicked",
+ _ge_ui_back_to_albums_cb);
+
+ ge_albums_back_to_view(ugd);
+}
+
+int _ge_ui_get_rotate_angle(void)
+{
+ return g_angle;
+}
+
+int ge_ui_create_title_and_push(ge_ugdata *ugd, Evas_Object *parent,
+ Evas_Object *obj, ge_navi_mode_e mode,
+ char* title)
+{
+ ge_dbg("");
+ GE_CHECK_VAL(ugd, -1);
+ GE_CHECK_VAL(parent, -1);
+ GE_CHECK_VAL(obj, -1);
+ GE_CHECK_VAL(title, -1);
+ Elm_Object_Item *nf_it = NULL;
+
+ if (mode == GE_NAVI_ALBUMS) {
+ ge_dbg("GE_NAVI_ALBUMS");
+ /* Add cancel button */
+ Evas_Object *cancel_btn = NULL;
+ cancel_btn = _ge_but_create_but(obj, ugd->th, NULL, GE_STR_OK,
+ GE_BTN_NAVI_PRE,
+ _ge_ui_destroy_me_cb, ugd);
+ GE_CHECK_VAL(cancel_btn, -1);
+ nf_it = elm_naviframe_item_push(parent, title, cancel_btn, NULL,
+ obj, NULL);
+ ugd->albums_nf_it = nf_it;
+ } else if (mode == GE_NAVI_THUMBS) {
+ if(ugd->file_select_mode == GE_FILE_SELECT_T_NONE) {
+ ge_dbgE("file_select_mode == GE_FILE_SELECT_T_NONE!");
+ return -1;
+ }
+
+ ge_dbg("GE_NAVI_THUMBS");
+ /* Add transition finished callback */
+ evas_object_smart_callback_add(parent, GE_TRANS_FINISHED,
+ __ge_ui_trans_finished_cb, ugd);
+ nf_it = elm_naviframe_item_push(parent, title, NULL, NULL, obj,
+ NULL);
+ /* Set pre_btn style to back button */
+ Evas_Object *back_btn = NULL;
+ back_btn = elm_object_item_part_content_get(nf_it,
+ GE_NAVIFRAME_PREB_BTN);
+ if(ugd->th)
+ elm_object_theme_set(back_btn, ugd->th);
+ elm_object_style_set(back_btn, GE_BTN_NAVI_PRE);
+ evas_object_smart_callback_add(back_btn, "clicked",
+ _ge_ui_back_to_albums_cb, ugd);
+
+ /**
+ * Add 'Done' item.
+ */
+ if (ugd->file_select_mode != GE_FILE_SELECT_T_ONE &&
+ (_ge_get_view_mode() == GE_VIEW_THUMBS_EDIT)) {
+ ge_dbg("Multiple selection, show Done");
+ /* Done */
+ Evas_Object *btn = NULL;
+ btn = _ge_but_create_but(parent, ugd->th, NULL,
+ GE_STR_DONE,
+ GE_BTN_NAVI_TOOLBAR,
+ __ge_ui_done_cb, ugd);
+ GE_CHECK_VAL(btn, -1);
+ elm_object_disabled_set(btn, true);
+ elm_object_item_part_content_set(nf_it,
+ GE_NAVIFRAME_BTN1,
+ btn);
+ }
+ ugd->thumbs_nf_it = nf_it;
+ }
+
+ return 0;
+}
+
+Evas_Object* ge_ui_load_edj(Evas_Object *parent, const char *file, const char *group)
+{
+ GE_CHECK_NULL(parent);
+ GE_CHECK_NULL(file);
+ GE_CHECK_NULL(group);
+ Evas_Object *eo;
+ int r;
+
+ eo = elm_layout_add(parent);
+ if (eo)
+ {
+ r = elm_layout_file_set(eo, file, group);
+ if (!r)
+ {
+ evas_object_del(eo);
+ return NULL;
+ }
+
+ evas_object_size_hint_weight_set(eo, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(eo, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ }
+
+ return eo;
+}
+
+void ge_ui_set_rotate_angle(int rotate_mode)
+{
+ g_angle = rotate_mode;
+}
+
+Evas_Object* ge_ui_create_nocontents(ge_ugdata* ugd)
+{
+ GE_CHECK_NULL(ugd);
+ Evas_Object *layout = NULL;
+ char label_str[GE_NOCONTENTS_LABEL_LEN_MAX] ={0,};
+
+ if(_ge_get_view_mode() == GE_VIEW_THUMBS ||
+ _ge_get_view_mode() == GE_VIEW_THUMBS_EDIT) {
+ if(ugd->file_type_mode) {
+ if (ugd->file_type_mode == GE_FILE_T_IMAGE)
+ snprintf(label_str, sizeof(label_str),
+ "%s",
+ (char*)(_GE_GETSYSTEMSTR("IDS_COM_BODY_NO_IMAGES")));
+ else if (ugd->file_type_mode == GE_FILE_T_VIDEO)
+ snprintf(label_str, sizeof(label_str),
+ "%s",
+ (char*)GE_LABEL_NO_VIDEOS);
+ else
+ snprintf(label_str, sizeof(label_str),
+ "%s",
+ (char*)(_GE_GETSYSTEMSTR("IDS_COM_BODY_NO_ITEMS")));
+ } else {
+ snprintf(label_str, sizeof(label_str), "%s",
+ (char*)(_GE_GETSYSTEMSTR("IDS_COM_BODY_NO_ITEMS")));
+ }
+ } else if(_ge_get_view_mode() == GE_VIEW_ALBUMS) {
+ snprintf(label_str, sizeof(label_str), "%s",
+ (char*)GE_LABEL_NO_ALBUMS);
+ } else {
+ ge_dbgE("view mode is error.");
+ }
+
+ ge_dbg("\nNocontents label: %s", label_str);
+ /* Full nocontents view layout */
+ layout = elm_layout_add(ugd->navi_bar);
+ GE_CHECK_NULL(layout);
+ elm_layout_theme_set(layout, "layout", "nocontents", "gallery_efl");
+ elm_object_part_text_set(layout, "elm.text", label_str);
+
+ return layout;
+}
+
+Evas_Object* ge_ui_create_main_ly(ge_ugdata* ugd, Evas_Object* parent)
+{
+ GE_CHECK_NULL(ugd);
+ GE_CHECK_NULL(parent);
+ Evas_Object *layout = NULL;
+
+ layout = elm_layout_add(parent);
+ GE_CHECK_NULL(layout);
+
+ /* Apply the layout style */
+ const char *profile = elm_config_profile_get();
+ if (!g_strcmp0(profile, "mobile")) {
+ elm_layout_theme_set(layout, "layout", "application", "default");
+ } else if (!g_strcmp0(profile,"extension")) {
+ elm_layout_theme_set(layout, "layout", "application", "noindicator");
+ }
+
+ evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND,
+ EVAS_HINT_EXPAND);
+ evas_object_show(layout);
+
+ return layout;
+}
+
+Evas_Object* ge_ui_create_navibar(ge_ugdata* ugd, Evas_Object* parent)
+{
+ GE_CHECK_NULL(ugd);
+ GE_CHECK_NULL(parent);
+ Evas_Object *navi_bar = NULL;
+
+ navi_bar = elm_naviframe_add(parent);
+ GE_CHECK_NULL(navi_bar);
+
+ if(ugd->th)
+ {
+ elm_object_theme_set(navi_bar, ugd->th);
+ }
+ elm_object_part_content_set(parent, "elm.swallow.content", navi_bar);
+
+ evas_object_show(navi_bar);
+
+ return navi_bar;
+}
+
+Evas_Object* ge_ui_create_popup(ge_ugdata* ugd, ge_popup_mode_e mode,
+ char* desc)
+{
+ ge_dbg("");
+ GE_CHECK_NULL(ugd);
+ GE_CHECK_NULL(desc);
+
+ if(ugd->popup)
+ {
+ ge_dbg("The existed popup is deleted");
+ evas_object_del(ugd->popup);
+ ugd->popup = NULL;
+ }
+
+ Evas_Object *popup = NULL;
+
+ popup = elm_popup_add(ugd->ly_main);
+ GE_CHECK_NULL(popup);
+ evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND,
+ EVAS_HINT_EXPAND);
+ elm_object_text_set(popup, desc);
+
+ switch (mode) {
+ case GE_POPUP_NOBUT:
+ case GE_POPUP_EXIT:
+ __ge_popup_add_timer(ugd, GE_NOBUT_EXIT_POPUP_HIDE_TIME_DELAY);
+ break;
+ case GE_POPUP_ONEBUT:
+ {
+ Evas_Object *btn = NULL;
+ btn = _ge_but_create_but(popup, ugd->th, NULL, GE_STR_OK,
+ GE_BTN_POPUP, _ge_ui_response_cb, ugd);
+ elm_object_part_content_set(popup, "button1", btn);
+ break;
+ }
+ case GE_POPUP_TWOBUT:
+ {
+ Evas_Object *btn1 = NULL;
+ btn1 = _ge_but_create_but(popup, ugd->th, NULL, GE_STR_OK,
+ GE_BTN_POPUP, _ge_ui_response_cb,
+ ugd);
+ elm_object_part_content_set(popup, "button1", btn1);
+ Evas_Object *btn2 = NULL;
+ btn2 = _ge_but_create_but(popup, ugd->th, NULL, GE_STR_CANCEL,
+ GE_BTN_POPUP, _ge_ui_response_cb,
+ ugd);
+ elm_object_part_content_set(popup, "button2", btn2);
+ break;
+ }
+ default:
+ ge_dbgE("mode is not supported...");
+ break;
+ }
+
+ evas_object_show(popup);
+
+ ugd->popup = popup;
+ ugd->popup_mode = mode;
+
+ return popup;
+}
+
+int _ge_ui_create_selinfo(ge_ugdata *ugd, Evas_Object *parent)
+{
+ ge_dbg("");
+ GE_CHECK_VAL(ugd, -1);
+ GE_CHECK_VAL(parent, -1);
+ int count = 1;
+ int all_count = 0;
+ char text[GE_SELINFO_TEXT_LEN_MAX] = {0,};
+
+ count = _ge_data_selected_list_count();
+ if(count <= 0) {
+ __ge_ui_disable_done(ugd, true);
+ if(ugd->file_select_mode == GE_FILE_SELECT_T_MULTIPLE)
+ ge_ui_destroy_selinfo(ugd);
+ ge_dbg("@@@[Warning] no item selected@@@");
+ return -1;
+ }
+
+ __ge_ui_disable_done(ugd, false);
+
+ if(ugd->file_select_mode == GE_FILE_SELECT_T_ONE) {
+ ge_dbgW("In select one mode!");
+ return -1;
+ }
+
+ all_count = _ge_data_get_count_all();
+ ge_dbg("New count , all count : %d,%d", count, all_count);
+
+ ge_ui_destroy_selinfo(ugd);
+
+ ugd->selinfo_ly = elm_layout_add(parent);
+ GE_CHECK_VAL(ugd->selinfo_ly, -1);
+ evas_object_size_hint_weight_set(ugd->selinfo_ly,
+ EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(ugd->selinfo_ly, EVAS_HINT_FILL,
+ EVAS_HINT_FILL);
+ elm_layout_theme_set(ugd->selinfo_ly, "standard", "selectioninfo",
+ "center_text");
+
+ /* Set the content of the notify widget */
+ elm_object_part_content_set(parent, "elm.swallow.selinfo",
+ ugd->selinfo_ly);
+ /* Add Space */
+ snprintf(text, sizeof(text), "%s (%d)", GE_SELINFO_SELECTED, count);
+ text[strlen(text)] = '\0';
+
+ /* move view up while selection view shown.*/
+ edje_object_signal_emit(_EDJ(parent),
+ "elm,thumb_view,state,moveup", "elm");
+ edje_object_part_text_set(_EDJ(ugd->selinfo_ly), "elm.text", text);
+ return 0;
+}
+
+int ge_ui_destroy_selinfo(ge_ugdata* ugd)
+{
+ ge_dbg("");
+ GE_CHECK_VAL(ugd, -1);
+ GE_CHECK_VAL(ugd->thumbs_view_ly, -1);
+
+ /* reset view to default status.*/
+ edje_object_signal_emit(_EDJ(ugd->thumbs_view_ly),
+ "elm,thumb_view,state,default", "elm");
+
+ if(ugd->selinfo_ly) {
+ evas_object_del(ugd->selinfo_ly);
+ ugd->selinfo_ly = NULL;
+ }
+ return 0;
+}
+
+/* *
+* In case of system folder, the displayed name should be translated into system language
+*
+* @param name
+* check album display name for getting proper translation
+*
+* @return
+* the translated album display name
+*/
+char *_ge_ui_get_translated_album_name(ge_cluster *album)
+{
+ GE_CHECK_NULL(album);
+ GE_CHECK_NULL(album->cluster);
+
+ if(_ge_data_is_default_album(GE_ALBUM_CAMERA_NAME, album->cluster)) {
+ /* system folder name: Camera */
+ return GE_STR_CAMERA;
+ } else if(_ge_data_is_default_album(GE_ALBUM_DOWNLOAD_NAME, album->cluster)) {
+ /* system folder name: Downloads */
+ return GE_STR_DOWNLOADS;
+ } else {
+ /* if the folder is not a system folder, return itself */
+ return album->cluster->display_name;
+ }
+}
+
--- /dev/null
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <sys/stat.h>
+#include <vconf.h>
+#include <vconf-keys.h>
+#include <errno.h>
+#include "ge-debug.h"
+#include "ge-albums.h"
+#include "ge-gridview.h"
+#include "ge-data.h"
+#include "ge-util.h"
+#include "ge-ui-util.h"
+#include "ge-strings.h"
+#include "ge-icon.h"
+#include "ge-drm.h"
+
+#define GE_TIME_MSEC_PER_SEC 1000
+#define GE_TIME_SEC_PER_MIN 60
+#define GE_TIME_MIN_PER_HOUR 60
+#define GE_TIME_SEC_PER_HOUR (GE_TIME_MIN_PER_HOUR * GE_TIME_SEC_PER_MIN)
+
+/* Global evas objects, which is used in the entire application */
+static ge_item* ge_current_mb_item;
+static ge_cluster* ge_current_album_item;
+static int ge_ug_iv_enter = 0;
+
+ge_item* _ge_get_current_item(void)
+{
+ return ge_current_mb_item;
+}
+
+void _ge_set_current_item(ge_item* gitem)
+{
+ ge_current_mb_item = gitem;
+}
+
+ge_cluster* _ge_get_current_album(void)
+{
+ return ge_current_album_item;
+}
+
+void _ge_set_current_album(ge_cluster* album_item)
+{
+ ge_current_album_item = album_item;
+}
+
+int _ge_ug_iv_get(void)
+{
+ return ge_ug_iv_enter;
+}
+
+void _ge_ug_iv_set(int ug_iv_state)
+{
+ ge_ug_iv_enter = ug_iv_state;
+}
+
+static int _ge_refresh_albums_list(ge_ugdata *ugd)
+{
+ GE_CHECK_VAL(ugd, -1);
+ ge_cluster* old_cur_cluster = _ge_get_current_album();
+ char cluster_id[GE_MTYPE_ITEN_ID_LEN_MAX] = { 0, };
+ int i = 0;
+ ge_cluster *current = NULL;
+ bool b_get_cur_album = false;
+
+ if(old_cur_cluster && old_cur_cluster->cluster &&
+ old_cur_cluster->cluster->uuid)
+ {
+ g_strlcpy(cluster_id, old_cur_cluster->cluster->uuid,
+ GE_MTYPE_ITEN_ID_LEN_MAX);
+ b_get_cur_album = true;
+ }
+ else
+ {
+ ge_dbg("None album selected, current album is unavailable\n");
+ }
+ _ge_data_get_clusters_list(ugd);
+
+ GE_CHECK_VAL(ugd->cluster_list, -1);
+ int length = eina_list_count(ugd->cluster_list->clist);
+ ge_dbg("album length: %d, current album id: %s", length, cluster_id);
+
+ //need to reset current cluster
+ _ge_set_current_album(NULL);
+ if(b_get_cur_album)
+ {
+ for (i = 0; i < length; i++)
+ {
+ current = eina_list_nth(ugd->cluster_list->clist, i);
+ if(current && current->cluster &&
+ current->cluster->uuid) {
+ ge_dbg("current album : %s", current->cluster->display_name);
+ } else {
+ ge_dbgE("Current is NULL");
+ break;
+ }
+ if(!g_strcmp0(current->cluster->uuid, cluster_id))
+ {
+ _ge_data_update_items_list(ugd, current);
+ _ge_set_current_album(current);
+ return 0;
+ }
+ }
+ /* Current album was removed, clear items list */
+ if (_ge_data_get_selected_list())
+ _ge_data_selected_list_finalize();
+ _ge_data_free_items_list();
+ }
+
+ return -1;
+}
+
+static void _ge_db_update_noti_cb(keynode_t *key, void* data)
+{
+ ge_dbgW("VCONFKEY_FILEMANAGER_DB_STATUS changed!");
+ GE_CHECK(data);
+ ge_ugdata* ugd = (ge_ugdata*)data;
+ int mmc_state = -1;
+ int mode = GE_UPDATE_NONE;
+
+ vconf_get_int(VCONFKEY_SYSMAN_MMC_STATUS, &mmc_state);
+ if(mmc_state == -1) {
+ ge_dbgE("vconf_get_int failed!");
+ return;
+ }
+
+ if (mmc_state == VCONFKEY_SYSMAN_MMC_MOUNTED) {
+ ge_dbg("mmc_state[%d]: VCONFKEY_SYSMAN_MMC_MOUNTED", mmc_state);
+ mode = GE_UPDATE_MMC_ADDED;
+ } else if (mmc_state == VCONFKEY_SYSMAN_MMC_REMOVED ||
+ mmc_state == VCONFKEY_SYSMAN_MMC_INSERTED_NOT_MOUNTED) {
+ ge_dbg("mmc_state[%d]: VCONFKEY_SYSMAN_MMC_REMOVED", mmc_state);
+ mode = GE_UPDATE_MMC_REMOVED;
+ }
+
+ /* Update view */
+ ge_update_view(ugd, mode);
+}
+
+Eina_Bool ge_update_view(ge_ugdata* ugd, int mode)
+{
+ ge_dbg("mode: %d", mode);
+ GE_CHECK_FALSE(ugd);
+ int view_mode = _ge_get_view_mode();
+ ge_dbg("view_mode: %d", view_mode);
+
+ if (view_mode == GE_VIEW_ALBUMS) {
+ _ge_refresh_albums_list(ugd);
+ ge_albums_update_view(ugd);
+ } else if (view_mode == GE_VIEW_THUMBS) {
+ _ge_refresh_albums_list(ugd);
+ if(_ge_get_current_album() == NULL)
+ {
+ ge_dbg("current album is empty, back to albums view!");
+ ge_albums_back_to_view(ugd);
+ elm_naviframe_item_pop(ugd->navi_bar);
+
+ return EINA_FALSE;
+ }
+
+ ge_grid_update_view(ugd);
+ } else if (view_mode == GE_VIEW_THUMBS_EDIT) {
+ ge_cluster* cur_album = _ge_get_current_album();
+
+ /* MMC removed */
+ if(mode == GE_UPDATE_MMC_REMOVED && cur_album &&
+ cur_album->cluster &&
+ cur_album->cluster->type == GE_MMC) {
+ ge_dbgW("MMC album, change to albums view!");
+ _ge_refresh_albums_list(ugd);
+ ge_albums_back_to_view(ugd);
+ elm_naviframe_item_pop(ugd->navi_bar);
+ return EINA_FALSE;
+ }
+
+ /* Update albums list and items list */
+ _ge_refresh_albums_list(ugd);
+ if(_ge_data_get_count_all() <= 0) {
+ ge_dbgW("current album is empty, back to albums view!");
+ ge_albums_back_to_view(ugd);
+ elm_naviframe_item_pop(ugd->navi_bar);
+ return EINA_FALSE;
+ }
+
+ ge_grid_update_view(ugd);
+
+ if(_ge_data_get_count_all() <= 0) {
+ ge_dbgW("current album is empty, back to albums view!");
+ ge_albums_back_to_view(ugd);
+ elm_naviframe_item_pop(ugd->navi_bar);
+ return EINA_FALSE;
+ }
+ }
+
+ return EINA_TRUE;
+}
+
+int ge_reg_db_update_noti(ge_ugdata* ugd)
+{
+ ge_dbg("");
+ GE_CHECK_VAL(ugd, -1);
+ int error_code = 0;
+
+ error_code = vconf_notify_key_changed(VCONFKEY_FILEMANAGER_DB_STATUS,
+ _ge_db_update_noti_cb, ugd);
+ if(error_code == -1)
+ ge_dbgE("vconf_notify_key_changed FAIL!");
+
+ return 0;
+}
+
+int ge_dereg_db_update_noti(void)
+{
+ ge_dbg("");
+ int error_code = -1;
+
+ error_code = vconf_ignore_key_changed(VCONFKEY_FILEMANAGER_DB_STATUS,
+ _ge_db_update_noti_cb);
+ if(error_code == -1)
+ ge_dbgE("vconf_ignore_key_changed FAIL!");
+
+ return 0;
+}
+
+bool _ge_is_image_valid(void *data, char *filepath)
+{
+ GE_CHECK_FALSE(data);
+ ge_ugdata *ugd = (ge_ugdata *)data;
+ GE_CHECK_FALSE(filepath);
+
+ Evas_Object *image = NULL;
+ int width = 0;
+ int height = 0;
+ Evas *evas = NULL;
+
+ evas = evas_object_evas_get(ugd->win);
+ GE_CHECK_FALSE(evas);
+
+ image = evas_object_image_add(evas);
+ GE_CHECK_FALSE(image);
+
+ evas_object_image_filled_set(image, 0);
+ evas_object_image_load_scale_down_set(image, 0);
+ evas_object_image_file_set(image, filepath, NULL);
+ evas_object_image_size_get(image, &width, &height);
+ if(image) {
+ evas_object_del(image);
+ image = NULL;
+ }
+
+ if (width <= 0 || height <= 0) {
+ ge_dbg("Cannot load file : %s", filepath);
+ return false;
+ }
+
+ return true;
+}
+
+/* Change int to char * of video duration, caller need to free the allocated memory */
+char *_ge_get_duration_string(unsigned int v_dur)
+{
+ char *dur_str = calloc(1, GE_FILE_PATH_LEN_MAX);
+ GE_CHECK_NULL(dur_str);
+ if (v_dur > 0) {
+ int duration = floor(v_dur / GE_TIME_MSEC_PER_SEC);
+ int dur_hr = 0;
+ int dur_min = 0;
+ int dur_sec = 0;
+ int tmp = 0;
+
+ if (duration >= GE_TIME_SEC_PER_HOUR) {
+ dur_sec = duration % GE_TIME_SEC_PER_MIN;
+ tmp = floor(duration / GE_TIME_SEC_PER_MIN);
+ dur_min = tmp % GE_TIME_MIN_PER_HOUR;
+ dur_hr = floor(tmp / GE_TIME_MIN_PER_HOUR);
+ } else if (duration >= GE_TIME_SEC_PER_MIN) {
+ dur_hr = 0;
+ dur_min = floor(duration / GE_TIME_SEC_PER_MIN);
+ dur_sec = duration % GE_TIME_SEC_PER_MIN;
+ } else {
+ dur_hr = 0;
+ dur_min = 0;
+ dur_sec = duration % GE_TIME_SEC_PER_MIN;
+ }
+
+ snprintf(dur_str, GE_FILE_PATH_LEN_MAX, "%02d:%02d:%02d",
+ dur_hr, dur_min, dur_sec);
+ } else {
+ snprintf(dur_str, GE_FILE_PATH_LEN_MAX, "00:00:00");
+ }
+ dur_str[strlen(dur_str)] = '\0';
+ return dur_str;
+}
+
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns="http://tizen.org/ns/packages" package="gallery-efl" version="1.1.26" install-location="internal-only">
+ <label>gallery-efl</label>
+ <author email="jiansong.jin@samsung.com" href="www.samsung.com">Jiansong Jin</author>
+ <description>Gallery application</description>
+ <ui-application appid="gallery-efl" exec="/usr/ug/bin/gallery-efl" nodisplay="true" multiple="true" type="capp" taskmanage="false" >
+ <label>Gallery Appcontrol</label>
+ <label xml:lang="hy-am">Պատկերասրահ</label>
+ <label xml:lang="az-az">Qalereya</label>
+ <label xml:lang="eu-es">Galeria</label>
+ <label xml:lang="bg-bg">Галерия</label>
+ <label xml:lang="ca-es">Galeria</label>
+ <label xml:lang="zh-cn">相册</label>
+ <label xml:lang="zh-hk">媒體瀏覽器</label>
+ <label xml:lang="zh-tw">媒體瀏覽器</label>
+ <label xml:lang="hr-hr">Album</label>
+ <label xml:lang="cs-cz">Galerie</label>
+ <label xml:lang="da-dk">Galleri</label>
+ <label xml:lang="nl-nl">Galerij</label>
+ <label xml:lang="en-gb">Gallery</label>
+ <label xml:lang="en-us">Gallery</label>
+ <label xml:lang="et-ee">Galerii</label>
+ <label xml:lang="fi-fi">Galleria</label>
+ <label xml:lang="fr-fr">Galerie</label>
+ <label xml:lang="gl-es">Galería</label>
+ <label xml:lang="ka-ge">გალერეა</label>
+ <label xml:lang="de-de">Galerie</label>
+ <label xml:lang="el-gr">Συλλογή</label>
+ <label xml:lang="hu-hu">Galéria</label>
+ <label xml:lang="is-is">Gallerí</label>
+ <label xml:lang="ga-ie">Gailearaí</label>
+ <label xml:lang="it-it">Galleria</label>
+ <label xml:lang="ja-jp">ギャラリー</label>
+ <label xml:lang="kk-kz">Галерея</label>
+ <label xml:lang="ko-kr">갤러리</label>
+ <label xml:lang="lv-lv">Galerija</label>
+ <label xml:lang="lt-lt">Galerija</label>
+ <label xml:lang="mk-mk">Галерија</label>
+ <label xml:lang="nb-no">Galleri</label>
+ <label xml:lang="pl-pl">Galeria</label>
+ <label xml:lang="pt-pt">Galeria</label>
+ <label xml:lang="pt-br">Galeria</label>
+ <label xml:lang="ro-ro">Galerie</label>
+ <label xml:lang="ru-ru">Галерея</label>
+ <label xml:lang="sr-rs">Galerija</label>
+ <label xml:lang="sk-sk">Galéria</label>
+ <label xml:lang="sl-si">Galerija</label>
+ <label xml:lang="es-es">Galería</label>
+ <label xml:lang="es-us">Galería</label>
+ <label xml:lang="sv-se">Galleri</label>
+ <label xml:lang="tr-tr">Galeri</label>
+ <label xml:lang="uk-ua">Галерея</label>
+ <label xml:lang="uz-uz">Galereya</label>
+ <label xml:lang="ar-ae">ﺎﺴﺗﻭﺪﻳﻭ</label>
+ <label xml:lang="zh-sg">画廊</label>
+ <label xml:lang="hi-in">गैलरी</label>
+ <label xml:lang="en-ph">Gallery</label>
+ <label xml:lang="fr-ca">Galerie</label>
+ </ui-application>
+</manifest>