Add language change callback and modify rotary event handling 55/181355/2
authorYunjin Lee <yunjin-.lee@samsung.com>
Thu, 7 Jun 2018 11:49:23 +0000 (20:49 +0900)
committerYunjin Lee <yunjin-.lee@samsung.com>
Tue, 19 Jun 2018 07:46:04 +0000 (16:46 +0900)
- Add language change callback
- Modify to handle rotary event by using circle surface and
eext_scroller

Change-Id: Ife34dd2d554602271b9089e819e676fb4f699e80
Signed-off-by: Yunjin Lee <yunjin-.lee@samsung.com>
common/include/common_utils.h
packaging/org.tizen.privacy-setting.spec
ui-popup/CMakeLists.txt
ui-popup/src/app_main.c
ui-popup/src/popup.c

index 55c2b93951fe4535522090239350910d6470c604..a4b1168eb62aa39155ca41e4ca26439d57a49ede 100644 (file)
@@ -96,6 +96,11 @@ typedef struct _papp_data_s {
        app_control_h caller;
        char* caller_pkgid;
        bool user_responsed;
+       char* app_name;
+       char* feature;
+       char* launch_type;
+       char** privileges;
+       int length;
 } papp_data_s;
 
 Evas_Object *common_genlist_add(Evas_Object *parent);
index 6c2a6d6c7f961cfcff6776969d6353c1d8314b82..2148ca6be2d927d434c399aa97ecdb9a51209cc9 100755 (executable)
@@ -48,7 +48,7 @@ BuildRequires: pkgconfig(security-privilege-manager)
 BuildRequires: pkgconfig(capi-appfw-application)
 BuildRequires: pkgconfig(capi-appfw-app-manager)
 BuildRequires: pkgconfig(bundle)
-BuildRequires: pkgconfig(vconf)
+BuildRequires: pkgconfig(pkgmgr-info)
 %description -n org.tizen.privacy-setting-popup-profile_wearable
 Application providing ui popup for guiding to privacy-setting.
 
index b80cf8d61d6c34b2d3d1db94995b74635ea1bff3..548a3ec0e51a68b903077dfc1b48b4cfa63d27db 100755 (executable)
@@ -1,7 +1,7 @@
 INCLUDE(FindPkgConfig)
 SET(pkg_name "org.tizen.privacy-setting-popup")
 
-pkg_check_modules(${pkg_name} REQUIRED glib-2.0 evas elementary edje eina efl-extension security-privilege-manager dlog capi-appfw-app-control bundle capi-appfw-app-manager capi-appfw-application vconf)
+pkg_check_modules(${pkg_name} REQUIRED glib-2.0 evas elementary edje eina efl-extension security-privilege-manager dlog capi-appfw-app-control bundle capi-appfw-app-manager capi-appfw-application pkgmgr-info)
 
 SET(SRCS
        ${CMAKE_SOURCE_DIR}/common/src/common_utils.c
index 44a1515418fc0205f4c41d54a15299da91816618..9175ce1e5abf3a426866ca98fa64b1b8cbb9b09f 100644 (file)
  * @version            1.0
  * @brief
  */
-#define _GNU_SOURCE
 #include <libintl.h>
 #include <efl_extension.h>
-#include <privilege_info.h>
-#include <stdio.h>
-#include <vconf.h>
 #include <app_info.h>
 
 #include "common_utils.h"
-
 #include "view.h"
-#define MSG_POPUP_OPEN "WDS_IDLE_BODY_CANT_OPEN_P1SS_GO_TO_SETTINGS_APPS_P2SS_PERMISSIONS_THEN_ALLOW_THE_FOLLOWING_PERMISSIONS_AND_TRY_AGAIN"
-#define MSG_POPUP_USE "WDS_IDLE_BODY_CANT_USE_P1SS_GO_TO_SETTINGS_APPS_P2SS_PERMISSIONS_THEN_ALLOW_THE_FOLLOWING_PERMISSIONS_AND_TRY_AGAIN"
 
 static void win_delete_request_cb(void *data, Evas_Object * obj, void *event_info)
 {
@@ -51,22 +44,6 @@ static void app_start(void* data)
        elm_win_resize_object_add(ad->win, ad->conform);
        evas_object_show(ad->conform);
 
-       /* Add layout to conformant */
-       ad->layout = elm_layout_add(ad->conform);
-       evas_object_size_hint_weight_set(ad->layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
-       elm_layout_theme_set(ad->layout, "layout", "popup", "content/circle/buttons2");
-       evas_object_show(ad->layout);
-       elm_object_content_set(ad->conform, ad->layout);
-
-       /* Add naviframe to layout */
-       ad->nf = elm_naviframe_add(ad->layout);
-       log_if(!ad->nf, 1, "ad->nf is null");
-
-       elm_object_part_content_set(ad->layout, "elm.swallow.content", ad->nf);
-       elm_naviframe_event_enabled_set(ad->nf, EINA_TRUE);
-       eext_object_event_callback_add(ad->nf, EEXT_CALLBACK_BACK, back_btn_clicked_cb, ad);
-       eext_object_event_callback_add(ad->nf, EEXT_CALLBACK_MORE, eext_naviframe_more_cb, NULL);
-
        evas_object_show(ad->win);
 
        return ;
@@ -108,49 +85,6 @@ static void __app_control_clone(app_control_h *clone, app_control_h app_control)
        return;
 }
 
-static char* __make_privacy_string(char** privileges, int length)
-{
-       char privacy_string[512] = {0, };
-       int ret = 0;
-       for (int i = 0; i < length; ++i) {
-               char* privacy_display = NULL;
-               char* privacy = NULL;
-               ret = privilege_info_get_privacy_by_privilege(privileges[i], &privacy);
-               if (ret == PRVMGR_ERR_NONE && privacy != NULL && strcmp(privacy, "N/A")) {
-                       ret = privilege_info_get_privacy_display(privacy, &privacy_display);
-                       if (!strstr(privacy_string, privacy_display)) {
-                               strcat(privacy_string, "<br>");
-                               strcat(privacy_string, privacy_display);
-                       }
-               }
-               free(privacy);
-               free(privacy_display);
-       }
-
-       if (strlen(privacy_string) > 0)
-               return strdup(privacy_string);
-
-       return NULL;
-}
-
-static char* __make_message(const char* format, const char* first, const char* second, const char* privacy)
-{
-       char* message = NULL;
-       char* format_string = NULL;
-       int ret = 0;
-
-       ret = asprintf(&format_string, dgettext("privacy-setting-popup", format), first, second);
-       if (ret == -1)
-               LOGE("asprintf failed");
-
-       ret = asprintf(&message, "%s<br>%s", format_string, privacy);
-       if (ret == -1)
-               LOGE("asprintf failed");
-
-       free(format_string);
-       return message;
-}
-
 static bool __reply_requested(app_control_h caller)
 {
        bool requested = false;
@@ -178,11 +112,11 @@ static void app_control(app_control_h app_control, void *data)
        /* Handle the launch request. */
        papp_data_s *ad = (papp_data_s *)data;
        int ret = 0;
-       char* launch_type = NULL;
-       char* app_name = NULL;
-       char* feature = NULL;
-       char** privileges = NULL;
-       int length = 0;
+       ad->launch_type = NULL;
+       ad->app_name = NULL;
+       ad->feature = NULL;
+       ad->privileges = NULL;
+       ad->length = 0;
        char* caller_appid = NULL;
 
        __app_control_clone(&(ad->caller), app_control);
@@ -194,18 +128,18 @@ static void app_control(app_control_h app_control, void *data)
        app_info_destroy(app_info);
        free(caller_appid);
 
-       ret = app_control_get_extra_data(app_control, APP_CONTROL_DATA_TYPE, &launch_type);
+       ret = app_control_get_extra_data(app_control, APP_CONTROL_DATA_TYPE, &(ad->launch_type));
        if (ret != APP_CONTROL_ERROR_NONE) {
                LOGE("app_control_get_extra_data() for APP_CONTROL_DATA_TYPE failed. ret = %d", ret);
                __send_error_reply(ad->caller);
                ui_app_exit();
-       } else if (strcmp(launch_type, "open") && strcmp(launch_type, "use")) {
-               LOGE("Wrong value for key type APP_CONTROL_DATA_TYPE. It must be 'use' or 'open'. Current value = '%s'", ret, launch_type);
+       } else if (strcmp(ad->launch_type, "open") && strcmp(ad->launch_type, "use")) {
+               LOGE("Wrong value for key type APP_CONTROL_DATA_TYPE. It must be 'use' or 'open'. Current value = '%s'", ret, ad->launch_type);
                __send_error_reply(ad->caller);
                ui_app_exit();
        }
 
-       ret = app_control_get_extra_data(app_control, APP_CONTROL_DATA_NAME, &app_name);
+       ret = app_control_get_extra_data(app_control, APP_CONTROL_DATA_NAME, &(ad->app_name));
        if (ret != APP_CONTROL_ERROR_NONE) {
                if (ret == APP_CONTROL_ERROR_KEY_NOT_FOUND)
                        LOGE("App name to display should be given by using key type APP_CONTROL_DATA_NAME");
@@ -215,39 +149,26 @@ static void app_control(app_control_h app_control, void *data)
                ui_app_exit();
        }
 
-       ret = app_control_get_extra_data(app_control, APP_CONTROL_DATA_FEATURE, &feature);
+       ret = app_control_get_extra_data(app_control, APP_CONTROL_DATA_FEATURE, &(ad->feature));
        if (ret != APP_CONTROL_ERROR_KEY_NOT_FOUND && ret != APP_CONTROL_ERROR_NONE) {
                LOGE("app_control_get_extra_data() for APP_CONTROL_DATA_FEATURE failed. ret = %d", ret);
                __send_error_reply(ad->caller);
                ui_app_exit();
        }
 
-       ret = app_control_get_extra_data_array(app_control, APP_CONTROL_DATA_PRIVILEGES, &privileges, &length);
+       ret = app_control_get_extra_data_array(app_control, APP_CONTROL_DATA_PRIVILEGES, &(ad->privileges), &(ad->length));
        if (ret != APP_CONTROL_ERROR_NONE) {
                LOGE("app_control_get_extra_data_array() for APP_CONTROL_DATA_PRIVILEGES failed. err = %d", ret);
                __send_error_reply(ad->caller);
                ui_app_exit();
        }
 
-       if (length <= 0 || privileges == NULL) {
+       if (ad->length <= 0 || ad->privileges == NULL) {
                LOGE("mandatory extra data privileges not given.");
                __send_error_reply(ad->caller);
                ui_app_exit();
        }
 
-       LOGD("launch_type = %s, app_name = %s, feature = %s", launch_type, app_name, feature);
-       for (int i = 0; i < length; ++i) {
-               LOGD("privilege: %s", privileges[i]);
-       }
-
-       if (!strcmp(launch_type, "use")) {
-               if (feature)
-                       ad->message = __make_message(MSG_POPUP_USE, feature, app_name, __make_privacy_string(privileges, length));
-               else
-                       ad->message = __make_message(MSG_POPUP_USE, app_name, app_name, __make_privacy_string(privileges, length));
-       } else if (!strcmp(launch_type, "open")) {
-               ad->message = __make_message(MSG_POPUP_OPEN, app_name, app_name, __make_privacy_string(privileges, length));
-       }
        create_view(ad);
 }
 
index 17582686d3ab3a0ee2fd8f656488316e68eaa6a2..4333bcbdda545bdb8a3028d6a7ed1653e1dc3d9d 100644 (file)
@@ -20,6 +20,7 @@
  * @brief
  */
 
+#define _GNU_SOURCE
 #include <efl_extension.h>
 
 #include "common_utils.h"
 #include <string.h>
 #include <app_control_internal.h>
 #include <stdio.h>
-
+#include <privilege_info.h>
+#include <pkgmgr-info.h>
 
 #define OK_BUTTON_PATH "/usr/apps/org.tizen.privacy-setting-popup/res/button/tw_ic_popup_btn_check.png"
 #define CANCEL_BUTTON_PATH "/usr/apps/org.tizen.privacy-setting-popup/res/button/tw_ic_popup_btn_delete.png"
+
 #define MSG_OK_BUTTON "WDS_ST_BUTTON_OK_ABB"
 #define MSG_CANCEL_BUTTON "IDS_TPLATFORM_BUTTON_CANCEL_ABB"
+#define MSG_POPUP_OPEN "WDS_IDLE_BODY_CANT_OPEN_P1SS_GO_TO_SETTINGS_APPS_P2SS_PERMISSIONS_THEN_ALLOW_THE_FOLLOWING_PERMISSIONS_AND_TRY_AGAIN"
+#define MSG_POPUP_USE "WDS_IDLE_BODY_CANT_USE_P1SS_GO_TO_SETTINGS_APPS_P2SS_PERMISSIONS_THEN_ALLOW_THE_FOLLOWING_PERMISSIONS_AND_TRY_AGAIN"
+
+#define LABEL_PADDING "<br>"
+#define AO_LABEL_PADDING " ..."
+#define MAX_PRIVACY_STRING_LEN 512
+
 #define PRIVACY_SETTING "org.tizen.privacy-setting"
 
 static void __send_reply(app_control_h caller, const char* response)
@@ -94,6 +104,7 @@ static void __check_response_cb(void *data, Evas_Object *obj, void *event_info)
                __send_reply(ad->caller, "yes");
        ad->user_responsed = true;
 }
+
 static void __close_response_cb(void *data, Evas_Object *obj, void *event_info)
 {
        papp_data_s *ad = (papp_data_s*)data;
@@ -102,41 +113,98 @@ static void __close_response_cb(void *data, Evas_Object *obj, void *event_info)
        ui_app_exit();
 }
 
-static Eina_Bool __rotary_changed_cb(void *data, Evas_Object *obj, Eext_Rotary_Event_Info *info)
+static char* __make_privacy_string(char** privileges, int length, const char* padding)
 {
-       Evas_Object *scroller = (Evas_Object *)data;
-       Evas_Coord sx, sy, sw, sh, y, h;
-       elm_scroller_region_get(scroller, &sx, &sy, &sw, &sh);
-       evas_object_geometry_get(scroller, NULL, &y, NULL, &h);
-
-       if (info->direction == EEXT_ROTARY_DIRECTION_CLOCKWISE) {
-               if (sy + (sh/2) <= y + sh + h)
-                       elm_scroller_region_bring_in(scroller, sx, sy+(sh/2), sw, sh);
-               else if (sy < y + sh + h)
-                       elm_scroller_region_bring_in(scroller, sx, y + sh + h, sw, sh);
-       } else {
-               if (sy - (sh/2) >= 0)
-                       elm_scroller_region_bring_in(scroller, sx, sy-(sh/2), sw, sh);
-               else if (sy > 0)
-                       elm_scroller_region_bring_in(scroller, sx, 0, sw, sh);
+       char privacy_string[MAX_PRIVACY_STRING_LEN] = {0, };
+       int ret = 0;
+       for (int i = 0; i < length; ++i) {
+               char* privacy_display = NULL;
+               char* privacy = NULL;
+               ret = privilege_info_get_privacy_by_privilege(privileges[i], &privacy);
+               if (ret == PRVMGR_ERR_NONE && privacy != NULL && strcmp(privacy, "N/A")) {
+                       ret = privilege_info_get_privacy_display(privacy, &privacy_display);
+                       if (!strstr(privacy_string, privacy_display) && (strlen(privacy_string) + strlen(padding) + strlen(privacy_display) < MAX_PRIVACY_STRING_LEN)) {
+                               strcat(privacy_string, padding);
+                               strcat(privacy_string, privacy_display);
+                       }
+               }
+               free(privacy);
+               free(privacy_display);
        }
-       return EINA_TRUE;
+
+       if (strlen(privacy_string) > 0)
+               return strdup(privacy_string);
+
+       return NULL;
 }
 
+static char* __make_message(const char* format, const char* first, const char* second, const char* privacy, const char* padding)
+{
+       char* message = NULL;
+       char* format_string = NULL;
+       int ret = 0;
+
+       ret = asprintf(&format_string, dgettext("privacy-setting-popup", format), first, second);
+       if (ret == -1)
+               LOGE("asprintf failed");
+
+       ret = asprintf(&message, "%s%s%s", format_string, padding, privacy);
+       if (ret == -1)
+               LOGE("asprintf failed");
+
+       free(format_string);
+
+       return message;
+}
+
+static char* __get_pkg_label(const char* pkgid)
+{
+       pkgmgrinfo_pkginfo_h handle;
+       char* label = NULL;
+
+       pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle);
+       pkgmgrinfo_pkginfo_get_label(handle, &label);
+       char* pkg_label = strdup(label);
+       pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
+
+       return pkg_label;
+}
+
+static char* __get_message(const char* padding, papp_data_s *ad)
+{
+       if (!strcmp(ad->launch_type, "use")) { /* use */
+               if (ad->feature)
+                       return __make_message(MSG_POPUP_USE, ad->feature, __get_pkg_label(ad->caller_pkgid), __make_privacy_string(ad->privileges, ad->length, padding), padding);
+               else
+                       return __make_message(MSG_POPUP_USE, __get_pkg_label(ad->caller_pkgid), __get_pkg_label(ad->caller_pkgid), __make_privacy_string(ad->privileges, ad->length, padding), padding);
+       } else { /* open */
+               return __make_message(MSG_POPUP_OPEN, __get_pkg_label(ad->caller_pkgid), __get_pkg_label(ad->caller_pkgid), __make_privacy_string(ad->privileges, ad->length, padding), padding);
+       }
+}
+
+static void __label_lang_changed_cb(void *data, Evas_Object *obj, void *event_info)
+{
+       papp_data_s *ad = (papp_data_s*)data;
+       Evas_Object *label = (Evas_Object*)obj;
+
+       elm_object_text_set(label, __get_message(LABEL_PADDING, ad));
+       elm_atspi_accessible_name_set(label, __get_message(AO_LABEL_PADDING, ad));
+}
 
 /*Privacy List*/
 void create_view(papp_data_s *ad)
 {
        LOGD("popup launched");
 
-       Evas_Object *popup;
-       Evas_Object *scroller;
-       Evas_Object *btn_l;
-       Evas_Object *btn_r;
-       Evas_Object *icon;
-       Evas_Object *layout;
-       Evas_Object *to_label;
-       Evas_Object *ao_label;
+       Eext_Circle_Surface *circle_surface = NULL;
+       Evas_Object *popup = NULL;
+       Evas_Object *scroller = NULL;
+       Evas_Object *eext_scroller = NULL;
+       Evas_Object *btn_l = NULL;
+       Evas_Object *btn_r = NULL;
+       Evas_Object *icon = NULL;
+       Evas_Object *layout = NULL;
+       Evas_Object *label = NULL;
 
        /* Popup */
        popup = elm_popup_add(ad->win);
@@ -144,6 +212,8 @@ void create_view(papp_data_s *ad)
        elm_popup_scrollable_set(popup, EINA_FALSE);
        eext_object_event_callback_add(popup, EEXT_CALLBACK_BACK, __close_response_cb, ad);
 
+       circle_surface = eext_circle_surface_conformant_add(ad->conform);
+
        scroller = elm_scroller_add(popup);
        elm_object_style_set(scroller, "list_effect");
        elm_scroller_policy_set(scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
@@ -151,21 +221,26 @@ void create_view(papp_data_s *ad)
        evas_object_size_hint_align_set(scroller, EVAS_HINT_FILL, EVAS_HINT_FILL);
        elm_object_content_set(popup, scroller);
 
+       eext_scroller = eext_circle_object_scroller_add(scroller, circle_surface);
+       eext_circle_object_scroller_policy_set(eext_scroller, ELM_SCROLLER_POLICY_AUTO, ELM_SCROLLER_POLICY_OFF);
+
        /* Layout for two buttons */
        layout = elm_layout_add(popup);
        elm_layout_theme_set(layout, "layout", "popup", "content/circle/buttons2");
-       elm_object_part_text_set(layout, "elm.text", ad->message);
        elm_object_content_set(scroller, layout);
 
-       to_label = (Evas_Object*)edje_object_part_object_get((const Edje_Object *)elm_layout_edje_get(layout), "elm.text");
-       ao_label = elm_access_object_register(to_label, layout);
-       elm_atspi_accessible_reading_info_type_set(ao_label, ELM_ACCESSIBLE_READING_INFO_TYPE_NAME);
-       elm_atspi_accessible_name_set(ao_label, ad->message);
-       elm_atspi_accessible_can_highlight_set(ao_label, EINA_TRUE);
-       elm_atspi_component_highlight_grab(ao_label);
+       label = elm_label_add(layout);
+       elm_object_style_set(label, "popup/default");
+       elm_label_line_wrap_set(label, ELM_WRAP_MIXED);
+       elm_object_text_set(label, __get_message(LABEL_PADDING, ad));
+       elm_atspi_accessible_reading_info_type_set(label, ELM_ACCESSIBLE_READING_INFO_TYPE_NAME);
+       elm_atspi_accessible_name_set(label, __get_message(AO_LABEL_PADDING, ad));
+       evas_object_size_hint_weight_set(label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+       evas_object_size_hint_align_set(label, EVAS_HINT_FILL, EVAS_HINT_FILL);
+       elm_object_part_content_set(layout, "elm.swallow.content", label);
+       evas_object_smart_callback_add(label, "language,changed", __label_lang_changed_cb, ad);
 
-       eext_rotary_object_event_callback_add(scroller, __rotary_changed_cb, scroller);
-       eext_rotary_object_event_activated_set(scroller, EINA_TRUE);
+       eext_rotary_object_event_activated_set(eext_scroller, EINA_TRUE);
 
        /* Left button */
        btn_l = elm_button_add(popup);