* @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)
{
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 ;
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;
/* 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);
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");
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);
}
* @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)
__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;
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);
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);
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);