enlightenment/src/bin/tools/fprint/src/enlightenment_fprint.c

1313 lines
44 KiB
C

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
/* NOTE: Respecting header order is important for portability.
* Always put system first, then EFL, then your public header,
* and finally your private one. */
#include <Ecore_Getopt.h>
#include <Elementary.h>
#include <Elementary_Cursor.h>
#include "eldbus_fprint_device.h"
#include "eldbus_fprint_manager.h"
Eldbus_Connection *conn;
Eldbus_Proxy *new_proxy;
Eldbus_Proxy *new_proxy1;
Eldbus_Pending *p;
Eldbus_Pending *p1;
Evas_Object *ly;
Evas_Object *ly_popup;
Evas_Object *win;
Evas_Object *lb_status;
const char *default_device = NULL;
const char *device_type = NULL;
const char *currentuser;
const char *currentfinger;
double enroll_count = 0.0;
int enroll_num;
int step = 1;
double enroll_count_value;
Eina_Value array;
static void enrolled_fingers_cb(Eldbus_Proxy *proxy, void *data, Eldbus_Pending *pending, Eldbus_Error_Info *error, Eina_Value *args);
static void _update_theme(void);
static void claim_device(Eldbus_Proxy *proxy, void *data, Eldbus_Pending *pending, Eldbus_Error_Info *error);
static void _enroll_stopp_cb(Eldbus_Proxy *proxy, void *data, Eldbus_Pending *pending, Eldbus_Error_Info *error);
static void _verify_stopp_cb(Eldbus_Proxy *proxy, void *data, Eldbus_Pending *pending, Eldbus_Error_Info *error);
const char*
_to_readable_fingername(void *data)
{
const char *name;
Eina_Strbuf *buffer = eina_strbuf_new();
eina_strbuf_append(buffer, data);
eina_strbuf_replace_all(buffer, "-", " ");
eina_strbuf_replace(buffer, "right", "Right", 1);
eina_strbuf_replace(buffer, "left", "Left", 1);
name = eina_strbuf_string_get(buffer);
return name;
}
const char*
_to_fprint_fingername(const char *data)
{
const char *name;
Eina_Strbuf *buffer = eina_strbuf_new();
eina_strbuf_append(buffer, data);
eina_strbuf_replace_all(buffer, " ", "-");
eina_strbuf_replace(buffer, "Right", "right", 1);
eina_strbuf_replace(buffer, "Left", "left", 1);
name = eina_strbuf_string_get(buffer);
return name;
}
static void
_close_verify_popup(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
fprint_device_enroll_stop_call(new_proxy1, _verify_stopp_cb, NULL);
if (data) evas_object_del(data);
edje_object_signal_emit(ly, "reset_finger", "reset_finger"); // for GROUP hands/left_hand/right/hand
edje_object_signal_emit(ly, "not_enrolled_finger", "not_enrolled_finger"); // for GROUP finger
fprint_device_list_enrolled_fingers_call(new_proxy1, enrolled_fingers_cb, NULL, currentuser);
_update_theme();
}
static void
_close_enroll_popup(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
fprint_device_enroll_stop_call(new_proxy1, _enroll_stopp_cb, NULL);
if (data)
{
evas_object_del(data);
data = NULL;
}
edje_object_signal_emit(ly, "reset_finger", "reset_finger"); // for GROUP hands/left_hand/right/hand
edje_object_signal_emit(ly, "not_enrolled_finger", "not_enrolled_finger"); // for GROUP finger
// enrolled__failed
fprint_device_list_enrolled_fingers_call(new_proxy1, enrolled_fingers_cb, NULL, currentuser);
_update_theme();
}
static void
_dismiss_hover(void *data, Evas_Object *obj EINA_UNUSED,
void *event_info EINA_UNUSED)
{
Evas_Object *hv = data;
elm_hover_dismiss(hv);
}
static void
_enroll_prop_get(void *data EINA_UNUSED, Eldbus_Pending *pending EINA_UNUSED, const char *propname EINA_UNUSED, Eldbus_Proxy *proxy EINA_UNUSED, Eldbus_Error_Info *error_info, int value)
{
if (error_info)
{
printf("MESSAGE _enroll_prop_get: %s\n", error_info->message);
printf("ERROR _enroll_prop_get: %s\n", error_info->error);
//TODO: display the error
}
else
{
enroll_num = value;
enroll_count_value = 10 / (double)enroll_num;
}
}
static void
_verify_start_cb(Eldbus_Proxy *proxy EINA_UNUSED, void *data, Eldbus_Pending *pending EINA_UNUSED, Eldbus_Error_Info *error)
{
Evas_Object *popup;
if (error)
{
printf("MESSAGE _verify_start_cb: %s\n", error->message);
printf("ERROR _verify_start_cb: %s\n", error->error);
//TODO: display the error
popup = data;
evas_object_del(popup);
popup = NULL;
}
}
static void
_enroll_start_cb(Eldbus_Proxy *proxy EINA_UNUSED, void *data, Eldbus_Pending *pending EINA_UNUSED, Eldbus_Error_Info *error)
{
Evas_Object *popup = data;
if (error)
{
printf("MESSAGE _enroll_start_cb: %s\n", error->message);
printf("ERROR _enroll_start_cb: %s\n", error->error);
//TODO: display the error
if (popup) evas_object_del(popup);
popup = NULL;
}
}
static void
_popup_verify_cb(void *data, Evas_Object *obj EINA_UNUSED)
{
Evas_Object *popup, *box, *lb, *sep, *button;
char buf[PATH_MAX];
char buf1[PATH_MAX];
const char *fingername;
fingername = _to_readable_fingername(data);
popup = elm_popup_add(win);
elm_popup_scrollable_set(popup, EINA_FALSE);
box = elm_box_add(popup);
evas_object_show(box);
lb = elm_label_add(box);
elm_object_text_set(lb, "Verify:");
evas_object_show(lb);
elm_box_pack_end(box, lb);
snprintf(buf, sizeof(buf), "<bigger>%s</bigger>", fingername);
lb = elm_label_add(box);
elm_object_text_set(lb, buf);
evas_object_show(lb);
elm_box_pack_end(box, lb);
ly_popup = elm_layout_add(box);
snprintf(buf, sizeof(buf), "%s/themes/enlightenment_fprint.edj", elm_app_data_dir_get());
elm_layout_file_set(ly_popup, buf, "verify");
evas_object_size_hint_weight_set(ly_popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(ly_popup, EVAS_HINT_FILL, EVAS_HINT_FILL);
evas_object_show(ly_popup);
elm_box_pack_end(box, ly_popup);
snprintf(buf1, sizeof(buf1), "please %s on device", device_type);
lb = elm_label_add(box);
elm_object_text_set(lb, buf1);
evas_object_show(lb);
elm_box_pack_end(box, lb);
sep = elm_separator_add(box);
elm_separator_horizontal_set(sep, EINA_TRUE);
evas_object_size_hint_weight_set(sep, EVAS_HINT_EXPAND, 0.0);
evas_object_size_hint_align_set(sep, EVAS_HINT_FILL, 0.0);
evas_object_show(sep);
elm_box_pack_end(box, sep);
lb_status = elm_label_add(box);
elm_object_text_set(lb_status, "<color=white>waiting for enroll</color>"); //TODO: swipe or press auslesen
evas_object_show(lb_status);
elm_box_pack_end(box, lb_status);
sep = elm_separator_add(box);
elm_separator_horizontal_set(sep, EINA_TRUE);
evas_object_size_hint_weight_set(sep, EVAS_HINT_EXPAND, 0.0);
evas_object_size_hint_align_set(sep, EVAS_HINT_FILL, 0.0);
evas_object_show(sep);
elm_box_pack_end(box, sep);
button = elm_button_add(box);
elm_object_text_set(button, "close");
evas_object_smart_callback_add(button, "clicked", _close_verify_popup, popup);
evas_object_show(button);
elm_box_pack_end(box, button);
elm_object_content_set(popup, box);
evas_object_show(popup);
evas_object_smart_callback_add(popup, "block,clicked", _close_verify_popup, popup);
fprint_device_verify_start_call(new_proxy1, _verify_start_cb, NULL, data);
}
static void
_popup_enroll_cb(void *data, Evas_Object *obj EINA_UNUSED)
{
Evas_Object *popup, *box, *lb, *sep, *button;
char buf[PATH_MAX];
char buf1[PATH_MAX];
const char *fingername;
fingername = _to_readable_fingername(data);
popup = elm_popup_add(win);
elm_popup_scrollable_set(popup, EINA_FALSE);
evas_object_smart_callback_add(popup, "block,clicked", _close_enroll_popup, popup);
box = elm_box_add(popup);
evas_object_show(box);
lb = elm_label_add(box);
elm_object_text_set(lb, "Enroll:");
evas_object_show(lb);
elm_box_pack_end(box, lb);
snprintf(buf, sizeof(buf), "<bigger>%s</bigger>", fingername);
lb = elm_label_add(box);
elm_object_text_set(lb, buf);
evas_object_show(lb);
elm_box_pack_end(box, lb);
ly_popup = elm_layout_add(box);
snprintf(buf, sizeof(buf), "%s/themes/enlightenment_fprint.edj", elm_app_data_dir_get());
elm_layout_file_set(ly_popup, buf, "enroll");
evas_object_size_hint_weight_set(ly_popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(ly_popup, EVAS_HINT_FILL, EVAS_HINT_FILL);
evas_object_show(ly_popup);
elm_box_pack_end(box, ly_popup);
snprintf(buf1, sizeof(buf1), "please %s on device", device_type);
lb = elm_label_add(box);
elm_object_text_set(lb, buf1);
evas_object_show(lb);
elm_box_pack_end(box, lb);
sep = elm_separator_add(box);
elm_separator_horizontal_set(sep, EINA_TRUE);
evas_object_size_hint_weight_set(sep, EVAS_HINT_EXPAND, 0.0);
evas_object_size_hint_align_set(sep, EVAS_HINT_FILL, 0.0);
evas_object_show(sep);
elm_box_pack_end(box, sep);
lb_status = elm_label_add(box);
elm_object_text_set(lb_status, "<color=white>waiting for enroll</color>"); //TODO: swipe or press auslesen
evas_object_show(lb_status);
elm_box_pack_end(box, lb_status);
sep = elm_separator_add(box);
elm_separator_horizontal_set(sep, EINA_TRUE);
evas_object_size_hint_weight_set(sep, EVAS_HINT_EXPAND, 0.0);
evas_object_size_hint_align_set(sep, EVAS_HINT_FILL, 0.0);
evas_object_show(sep);
elm_box_pack_end(box, sep);
button = elm_button_add(box);
elm_object_text_set(button, "close");
evas_object_smart_callback_add(button, "clicked", _close_enroll_popup, popup);
evas_object_show(button);
elm_box_pack_end(box, button);
elm_object_content_set(popup, box);
evas_object_show(popup);
fprint_device_enroll_start_call(new_proxy1, _enroll_start_cb, popup, data);
}
static void
delete_selected_finger(Eldbus_Proxy *proxy EINA_UNUSED, void *data, Eldbus_Pending *pending EINA_UNUSED, Eldbus_Error_Info *error)
{
if (error)
{
printf("MESSAGE delete_selected_finger: %s\n", error->message);
printf("ERROR delete_selected_finger: %s\n", error->error);
}
else
{
edje_object_signal_emit(ly, "reset_finger", "reset_finger"); // for GROUP hands/left_hand/right/hand
edje_object_signal_emit(ly, "not_enrolled_finger", "not_enrolled_finger"); // for GROUP finger
fprint_device_list_enrolled_fingers_call(new_proxy1, enrolled_fingers_cb, NULL, currentuser);
_dismiss_hover(data, NULL, NULL);
_update_theme();
}
}
static void
delete_all_finger(Eldbus_Proxy *prox EINA_UNUSED, void *data, Eldbus_Pending *pending EINA_UNUSED, Eldbus_Error_Info *error)
{
if (error)
{
printf("MESSAGE delete_all_finger: %s\n", error->message);
printf("ERROR delete_all_finger: %s\n", error->error);
}
else
{
edje_object_signal_emit(ly, "reset_finger", "reset_finger"); // for GROUP hands/left_hand/right/hand
edje_object_signal_emit(ly, "not_enrolled_finger", "not_enrolled_finger"); // for GROUP finger
fprint_device_list_enrolled_fingers_call(new_proxy1, enrolled_fingers_cb, NULL, currentuser);
_dismiss_hover(data, NULL, NULL);
}
}
static void
_verify_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
void *event_info EINA_UNUSED)
{
_popup_verify_cb(data, NULL);
}
static void
_enroll_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
void *event_info EINA_UNUSED)
{
_popup_enroll_cb(data, NULL);
}
static void
_delete_selected_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
fprint_device_delete_enrolled_finger_call(new_proxy1, delete_selected_finger, NULL, data);
}
static void
_delete_all_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
fprint_device_delete_enrolled_fingers2_call(new_proxy1, delete_all_finger, data);
}
void
fingerprint_clicked_finger_mode(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
Evas_Object *hv, *bt, *bx, *lb;
char buf[PATH_MAX];
const char *layout;
const char *fingername;
const char *txt;
int i, found = 0;
Evas_Object *left_list = evas_object_data_get(data, "left_list");
Evas_Object *right_list = evas_object_data_get(data, "right_list");
Elm_Object_Item *selected_item;
selected_item = elm_list_selected_item_get(left_list);
if (selected_item == NULL)
selected_item = elm_list_selected_item_get(right_list);
if (selected_item == NULL) return;
fingername = _to_fprint_fingername(elm_object_item_text_get(selected_item));
currentfinger = strdup(fingername);
snprintf(buf, sizeof(buf), "<color=white>%s</color>", elm_object_item_text_get(selected_item));
hv = elm_hover_add(win);
bx = elm_box_add(win);
elm_layout_file_get(ly, NULL, &layout);
if (strcmp(layout, "finger") == 0)
elm_object_part_content_set(hv, "middle", bx);
else
elm_object_part_content_set(hv, "bottom", bx);
evas_object_show(bx);
lb = elm_label_add(bx);
elm_object_text_set(lb, buf);
evas_object_show(lb);
elm_box_pack_end(bx, lb);
for (i = 0; i < (int)eina_value_array_count(&array); i++)
{
eina_value_array_get(&array, i, &txt);
if (!strcmp(txt, fingername)) found = 1;
}
if (found == 1)
{
bt = elm_button_add(win);
elm_object_text_set(bt, "verify");
evas_object_smart_callback_add(bt, "clicked", _dismiss_hover, hv);
evas_object_smart_callback_add(bt, "clicked", _verify_cb, fingername);
elm_box_pack_end(bx, bt);
evas_object_show(bt);
bt = elm_button_add(win);
elm_object_text_set(bt, "delete");
evas_object_smart_callback_add(bt, "clicked", _dismiss_hover, hv);
evas_object_smart_callback_add(bt, "clicked", _delete_selected_cb, fingername);
elm_box_pack_end(bx, bt);
evas_object_show(bt);
}
else
{
bt = elm_button_add(win);
elm_object_text_set(bt, "enroll");
evas_object_smart_callback_add(bt, "clicked", _dismiss_hover, hv);
evas_object_smart_callback_add(bt, "clicked", _enroll_cb, fingername);
elm_box_pack_end(bx, bt);
evas_object_show(bt);
}
if (eina_value_array_count(&array) != 0)
{
bt = elm_button_add(win);
elm_object_text_set(bt, "delete all");
evas_object_smart_callback_add(bt, "clicked", _delete_all_cb, hv);
elm_box_pack_end(bx, bt);
evas_object_show(bt);
}
elm_hover_parent_set(hv, win);
elm_hover_target_set(hv, obj);
evas_object_show(hv);
}
void
fingerprint_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
Evas_Object *hv, *bt, *bx, *lb;
char buf[PATH_MAX];
const char *layout;
const char *fingername;
const char *txt;
int i, found = 0;
currentfinger = data;
printf("CURRENTFINGER: %s\n", currentfinger);
fingername = _to_readable_fingername(data);
snprintf(buf, sizeof(buf), "<color=white>%s</color>", fingername);
hv = elm_hover_add(win);
bx = elm_box_add(win);
elm_layout_file_get(ly, NULL, &layout);
if (strcmp(layout, "finger") == 0)
elm_object_part_content_set(hv, "middle", bx);
else
elm_object_part_content_set(hv, "bottom", bx);
evas_object_show(bx);
lb = elm_label_add(bx);
elm_object_text_set(lb, buf);
evas_object_show(lb);
elm_box_pack_end(bx, lb);
for (i = 0; i < (int)eina_value_array_count(&array); i++)
{
eina_value_array_get(&array, i, &txt);
if (!strcmp(txt, data)) found = 1;
}
if (found == 1)
{
bt = elm_button_add(win);
elm_object_text_set(bt, "verify");
evas_object_smart_callback_add(bt, "clicked", _dismiss_hover, hv);
evas_object_smart_callback_add(bt, "clicked", _verify_cb, data);
elm_box_pack_end(bx, bt);
evas_object_show(bt);
bt = elm_button_add(win);
elm_object_text_set(bt, "delete");
evas_object_smart_callback_add(bt, "clicked", _dismiss_hover, hv);
evas_object_smart_callback_add(bt, "clicked", _delete_selected_cb, data);
elm_box_pack_end(bx, bt);
evas_object_show(bt);
}
else
{
bt = elm_button_add(win);
elm_object_text_set(bt, "enroll");
evas_object_smart_callback_add(bt, "clicked", _dismiss_hover, hv);
evas_object_smart_callback_add(bt, "clicked", _enroll_cb, data);
elm_box_pack_end(bx, bt);
evas_object_show(bt);
}
if (eina_value_array_count(&array) != 0)
{
bt = elm_button_add(win);
elm_object_text_set(bt, "delete all");
evas_object_smart_callback_add(bt, "clicked", _delete_all_cb, hv);
elm_box_pack_end(bx, bt);
evas_object_show(bt);
}
elm_hover_parent_set(hv, win);
elm_hover_target_set(hv, obj);
evas_object_show(hv);
}
static void
_switch_hand(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
char buf[PATH_MAX];
snprintf(buf, sizeof(buf), "%s/themes/enlightenment_fprint.edj", elm_app_data_dir_get());
elm_layout_file_set(ly, buf, data);
fprint_device_list_enrolled_fingers_call(new_proxy1, enrolled_fingers_cb, NULL, currentuser);
_update_theme();
}
static void
_finger_mode_select(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
{
const char *txt, *fingername;
unsigned i;
const Eina_List *l, *items;
Elm_Object_Item *list_it, *selected_item;
items = elm_list_items_get(data);
EINA_LIST_FOREACH(items, l, list_it)
{
elm_list_item_selected_set(list_it, EINA_FALSE);
}
selected_item = elm_list_selected_item_get(obj);
printf("FINGERNAME LIST FPRINT FINGERNAME1: %s\n", elm_object_item_text_get(selected_item));
fingername = _to_fprint_fingername(elm_object_item_text_get(selected_item));
printf("FINGERNAME LIST FPRINT FINGERNAME: %s\n", fingername);
for (i = 0; i < eina_value_array_count(&array); i++)
{
eina_value_array_get(&array, i, &txt);
printf("\t%s:%s\n", txt, fingername);
if (!strcmp(txt, fingername))
{
edje_object_signal_emit(ly, "enrolled_finger", "enrolled_finger");
break;
}
edje_object_signal_emit(ly, "not_enrolled_finger", "not_enrolled_finger");
}
}
static void
_update_theme(void)
{
Evas_Object *swallow_button, *right_list = NULL, *left_list, *leftright_list, *icon = NULL;
char buf[PATH_MAX];
// ALL 10 FINGERS
// LEFT
swallow_button = elm_button_add(win);
elm_object_style_set(swallow_button, "blank");
evas_object_smart_callback_add(swallow_button, "clicked", fingerprint_clicked, "left-little-finger");
evas_object_show(swallow_button);
elm_object_part_content_set(ly, "swallow_left-little-finger", swallow_button);
swallow_button = elm_button_add(win);
elm_object_style_set(swallow_button, "blank");
evas_object_smart_callback_add(swallow_button, "clicked", fingerprint_clicked, "left-ring-finger");
evas_object_show(swallow_button);
elm_object_part_content_set(ly, "swallow_left-ring-finger", swallow_button);
swallow_button = elm_button_add(win);
elm_object_style_set(swallow_button, "blank");
evas_object_smart_callback_add(swallow_button, "clicked", fingerprint_clicked, "left-middle-finger");
evas_object_show(swallow_button);
elm_object_part_content_set(ly, "swallow_left-middle-finger", swallow_button);
swallow_button = elm_button_add(win);
elm_object_style_set(swallow_button, "blank");
evas_object_smart_callback_add(swallow_button, "clicked", fingerprint_clicked, "left-index-finger");
evas_object_show(swallow_button);
elm_object_part_content_set(ly, "swallow_left-index-finger", swallow_button);
swallow_button = elm_button_add(win);
elm_object_style_set(swallow_button, "blank");
evas_object_smart_callback_add(swallow_button, "clicked", fingerprint_clicked, "left-thumb");
evas_object_show(swallow_button);
elm_object_part_content_set(ly, "swallow_left-thumb", swallow_button);
// RIGHT
swallow_button = elm_button_add(win);
elm_object_style_set(swallow_button, "blank");
evas_object_smart_callback_add(swallow_button, "clicked", fingerprint_clicked, "right-little-finger");
evas_object_show(swallow_button);
elm_object_part_content_set(ly, "swallow_right-little-finger", swallow_button);
swallow_button = elm_button_add(win);
elm_object_style_set(swallow_button, "blank");
evas_object_smart_callback_add(swallow_button, "clicked", fingerprint_clicked, "right-ring-finger");
evas_object_show(swallow_button);
elm_object_part_content_set(ly, "swallow_right-ring-finger", swallow_button);
swallow_button = elm_button_add(win);
elm_object_style_set(swallow_button, "blank");
evas_object_smart_callback_add(swallow_button, "clicked", fingerprint_clicked, "right-middle-finger");
evas_object_show(swallow_button);
elm_object_part_content_set(ly, "swallow_right-middle-finger", swallow_button);
swallow_button = elm_button_add(win);
elm_object_style_set(swallow_button, "blank");
evas_object_smart_callback_add(swallow_button, "clicked", fingerprint_clicked, "right-index-finger");
evas_object_show(swallow_button);
elm_object_part_content_set(ly, "swallow_right-index-finger", swallow_button);
swallow_button = elm_button_add(win);
elm_object_style_set(swallow_button, "blank");
evas_object_smart_callback_add(swallow_button, "clicked", fingerprint_clicked, "right-thumb");
evas_object_show(swallow_button);
elm_object_part_content_set(ly, "swallow_right-thumb", swallow_button);
// SWITCH LEFT/RIGHT HAND
leftright_list = elm_list_add(win);
elm_list_multi_select_set(leftright_list, EINA_FALSE);
elm_list_select_mode_set(leftright_list, ELM_OBJECT_SELECT_MODE_ALWAYS);
evas_object_size_hint_weight_set(leftright_list, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
elm_list_mode_set(leftright_list, ELM_LIST_EXPAND);
elm_list_item_append(leftright_list, "Left Hand", NULL, NULL, _switch_hand, "left_hand");
elm_list_item_append(leftright_list, "Right Hand", NULL, NULL, _switch_hand, "right_hand");
evas_object_show(leftright_list);
elm_object_part_content_set(ly, "swallow_hand_switch", leftright_list);
// ONE FINGER
left_list = elm_list_add(win);
elm_list_multi_select_set(left_list, EINA_FALSE);
elm_list_select_mode_set(left_list, ELM_OBJECT_SELECT_MODE_ALWAYS);
evas_object_size_hint_weight_set(left_list, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
elm_list_mode_set(left_list, ELM_LIST_EXPAND);
right_list = elm_list_add(win);
elm_list_multi_select_set(right_list, EINA_FALSE);
elm_list_select_mode_set(right_list, ELM_OBJECT_SELECT_MODE_ALWAYS);
evas_object_size_hint_weight_set(right_list, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
elm_list_mode_set(right_list, ELM_LIST_EXPAND);
////
Eina_List *left_hand_list = NULL;
Eina_List *right_hand_list = NULL;
Eina_List *l;
const char *fingername;
unsigned i = 0;
int found;
const char *txt;
const char *list_item;
elm_list_clear(right_list);
elm_list_clear(left_list);
if (!eina_list_count(left_hand_list) || (eina_list_count(left_hand_list) == 0))
{
left_hand_list = eina_list_append(left_hand_list, "Left little finger");
left_hand_list = eina_list_append(left_hand_list, "Left ring finger");
left_hand_list = eina_list_append(left_hand_list, "Left middle finger");
left_hand_list = eina_list_append(left_hand_list, "Left index finger");
left_hand_list = eina_list_append(left_hand_list, "Left thumb");
}
if (!eina_list_count(right_hand_list) || (eina_list_count(right_hand_list) == 0))
{
right_hand_list = eina_list_append(right_hand_list, "Right little finger");
right_hand_list = eina_list_append(right_hand_list, "Right ring finger");
right_hand_list = eina_list_append(right_hand_list, "Right middle finger");
right_hand_list = eina_list_append(right_hand_list, "Right index finger");
right_hand_list = eina_list_append(right_hand_list, "Right thumb");
}
EINA_LIST_FOREACH(left_hand_list, l, list_item)
{
icon = elm_icon_add(win);
snprintf(buf, sizeof(buf), "%s/themes/enlightenment_fprint.edj", elm_app_data_dir_get());
elm_image_file_set(icon, buf, "icon");
evas_object_size_hint_weight_set(icon, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(icon, EVAS_HINT_FILL, EVAS_HINT_FILL);
evas_object_size_hint_min_set(icon, ELM_SCALE_SIZE(20), ELM_SCALE_SIZE(20));
evas_object_size_hint_max_set(icon, ELM_SCALE_SIZE(20), ELM_SCALE_SIZE(20));
evas_object_show(icon);
printf("LEFT LIST ITEM:\n");
found = 0;
fingername = _to_fprint_fingername(list_item);
for (i = 0; i < eina_value_array_count(&array); i++)
{
eina_value_array_get(&array, i, &txt);
if (!strcmp(txt, fingername))
{
printf("LEFT LIST ITEM: %s\n",fingername);
elm_list_item_append(left_list, fingername, icon, NULL, _finger_mode_select, right_list);
found = 1;
}
}
if (found != 1)
elm_list_item_append(left_list, fingername, NULL, NULL, _finger_mode_select, right_list);
}
EINA_LIST_FOREACH(right_hand_list, l, list_item)
{
icon = elm_icon_add(win);
snprintf(buf, sizeof(buf), "%s/themes/enlightenment_fprint.edj", elm_app_data_dir_get());
elm_image_file_set(icon, buf, "icon");
evas_object_size_hint_weight_set(icon, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
evas_object_size_hint_align_set(icon, EVAS_HINT_FILL, EVAS_HINT_FILL);
evas_object_size_hint_min_set(icon, ELM_SCALE_SIZE(20), ELM_SCALE_SIZE(20));
evas_object_size_hint_max_set(icon, ELM_SCALE_SIZE(20), ELM_SCALE_SIZE(20));
evas_object_show(icon);
printf("RIGHT LIST ITEM:\n");
found = 0;
fingername = _to_fprint_fingername(list_item);
for (i = 0; i < eina_value_array_count(&array); i++)
{
eina_value_array_get(&array, i, &txt);
if (!strcmp(txt, fingername))
{
printf("RIGHT LIST ITEM: %s\n",fingername);
elm_list_item_append(right_list, fingername, icon, NULL, _finger_mode_select, left_list);
found = 1;
}
}
if (found != 1)
elm_list_item_append(right_list, fingername, NULL, NULL, _finger_mode_select, left_list);
}
elm_list_go(left_list);
evas_object_show(left_list);
elm_object_part_content_set(ly, "swallow_select-finger-left", left_list);
elm_list_go(right_list);
evas_object_show(right_list);
elm_object_part_content_set(ly, "swallow_select-finger-right", right_list);
swallow_button = elm_button_add(win);
elm_object_style_set(swallow_button, "blank");
evas_object_data_set(swallow_button, "left_list", left_list);
evas_object_data_set(swallow_button, "right_list", right_list);
evas_object_smart_callback_add(swallow_button, "clicked", fingerprint_clicked_finger_mode, swallow_button);
evas_object_show(swallow_button);
elm_object_part_content_set(ly, "swallow_select-finger", swallow_button);
}
static void
_select_mode(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
char buf[PATH_MAX];
snprintf(buf, sizeof(buf), "%s/themes/enlightenment_fprint.edj", elm_app_data_dir_get());
elm_layout_file_set(ly, buf, data);
fprint_device_list_enrolled_fingers_call(new_proxy1, enrolled_fingers_cb, NULL, currentuser);
_update_theme();
}
/*
static void
get_devices(Eldbus_Proxy *proxy, void *data, Eldbus_Pending *pending, Eldbus_Error_Info *error, Eina_Value *args)
{
if (error)
printf("ERROR: %s\n", error->error);
if (error)
printf("MESSAGE: %s\n", error->message);
}*/
static void
get_default_device(Eldbus_Proxy *proxy EINA_UNUSED, void *data EINA_UNUSED, Eldbus_Pending *pending EINA_UNUSED, Eldbus_Error_Info *error, const char *device)
{
printf("DEFAULT: %s\n", device);
if (device)
default_device = strdup(device);
printf("DDEFAULT: %s\n", default_device);
if (error)
printf("ERROR get_default_device: %s\n", error->error);
if (error)
printf("MESSAGE get_default_device: %s\n", error->message);
}
static void
enrolled_fingers_cb(Eldbus_Proxy *proxy EINA_UNUSED, void *data EINA_UNUSED, Eldbus_Pending *pending EINA_UNUSED, Eldbus_Error_Info *error EINA_UNUSED, Eina_Value *args)
{
const char *txt;
unsigned i;
eina_value_flush(&array);
if (error)
{
printf("ERROR enrolled_fingers_cb: %s\n", error->error);
printf("MESSAGE enrolled_fingers_cb: %s\n", error->message);
}
else
{
eina_value_struct_value_get(args, "arg0", &array);
for (i = 0; i < eina_value_array_count(&array); i++)
{
eina_value_array_get(&array, i, &txt);
edje_object_signal_emit(ly, "enrolled_finger", txt);
}
}
}
static void
get_device_proberties(void *data, Eldbus_Pending *pending EINA_UNUSED, const char *propname EINA_UNUSED, Eldbus_Proxy *proxy EINA_UNUSED, Eldbus_Error_Info *error_info EINA_UNUSED, const char *value)
{
char buf[PATH_MAX];
Evas_Object *lb = data;
if (value)
{
printf("NAME: %s\n", value);
snprintf(buf, sizeof(buf), "Device Name: <color=white>%s</color>", value);
elm_object_text_set(lb, buf);
}
else
elm_object_text_set(lb, "NO DEVICE");
}
static void
get_device_type(void *data, Eldbus_Pending *pending EINA_UNUSED, const char *propname EINA_UNUSED, Eldbus_Proxy *proxy EINA_UNUSED, Eldbus_Error_Info *error_info EINA_UNUSED, const char *value)
{
char buf[PATH_MAX];
Evas_Object *lb1 = data;
if (value)
{
device_type = strdup(value);
printf("Type: %s\n", device_type);
snprintf(buf, sizeof(buf), "Device Type: <color=white>%s</color>", device_type);
elm_object_text_set(lb1, buf);
}
}
static void
retry_claim_device(void* data, Evas_Object* o EINA_UNUSED, void* event EINA_UNUSED)
{
Evas_Object *notify = data;
if (notify) evas_object_del(notify);
fprint_device_claim_call(new_proxy1, claim_device, NULL, currentuser);
}
static void
claim_device(Eldbus_Proxy *proxy EINA_UNUSED, void *data EINA_UNUSED, Eldbus_Pending *pending EINA_UNUSED, Eldbus_Error_Info *error)
{
if (error)
{
printf("ERROR claim_device: %s\n", error->error);
printf("MESSAGE claim_device: %s\n", error->message);
Evas_Object *notify, *bx, *bxv, *o;
notify = elm_notify_add(win);
bx = elm_box_add(notify);
o = elm_label_add(bx);
elm_object_text_set(o, "Could not claim device<br>Please cancel all other fprint sessions<br>and press retry<br>");
evas_object_show(o);
elm_box_pack_end(bx, o);
bxv = elm_box_add(notify);
o = elm_button_add(bxv);
elm_object_text_set(o, "retry");
evas_object_smart_callback_add(o, "clicked", retry_claim_device, notify);
evas_object_show(o);
elm_box_pack_end(bxv, o);
evas_object_show(bxv);
elm_box_pack_end(bx, bxv);
evas_object_show(bx);
elm_object_content_set(notify, bx);
evas_object_show(notify);
}
}
static void
_enroll_stopp_cb(Eldbus_Proxy *proxy EINA_UNUSED, void *data EINA_UNUSED, Eldbus_Pending *pending EINA_UNUSED, Eldbus_Error_Info *error)
{
if (error)
{
printf("MESSAGE _enroll_stopp_cb: %s\n", error->message);
printf("ERROR _enroll_stopp_cb: %s\n", error->error);
}
}
static void
_verify_stopp_cb(Eldbus_Proxy *proxy EINA_UNUSED, void *data EINA_UNUSED, Eldbus_Pending *pending EINA_UNUSED, Eldbus_Error_Info *error)
{
if (error)
{
printf("MESSAGE _verify_stopp_cb: %s\n", error->message);
printf("ERROR _verify_stopp_cb: %s\n", error->error);
}
}
static void
_restart_verify(void)
{
fprint_device_verify_start_call(new_proxy1, _verify_start_cb, NULL, currentfinger);
}
static void
_verify_status(void *data EINA_UNUSED, const Eldbus_Message *msg)
{
char buf[PATH_MAX];
const char *status;
printf("C-FINGER VERFIY STATUS: %s\n", currentfinger);
EINA_SAFETY_ON_TRUE_RETURN(eldbus_message_error_get(msg, NULL, NULL));
if (!eldbus_message_arguments_get(msg, "s", &status))
{
fprintf(stderr, "Error: could not get entry contents\n");
return;
}
if (!strcmp(status, "verify-match"))
{
snprintf(buf, sizeof(buf), "<color=green>%s</color>", status);
elm_object_text_set(lb_status, buf);//FIXME lb_status ist nicht mehr vorhanden wenn über block,clicked das popup gelöscht worden ist.
edje_object_signal_emit(ly_popup, "success", "success");
const char *layout;
elm_layout_file_get(ly_popup, NULL, &layout);
fprint_device_verify_stop_call(new_proxy1, _verify_stopp_cb, NULL);
_restart_verify();
}
else if (!strcmp(status, "verify-retry-scan"))
{
snprintf(buf, sizeof(buf), "<color=white>%s</color>", status);
elm_object_text_set(lb_status, buf);
}
else if (!strcmp(status, "verify-swipe-too-short"))
{
snprintf(buf, sizeof(buf), "<color=white>%s</color>", status);
elm_object_text_set(lb_status, buf);
}
else if (!strcmp(status, "verify-finger-not-centered"))
{
snprintf(buf, sizeof(buf), "<color=white>%s</color>", status);
elm_object_text_set(lb_status, buf);
}
else if (!strcmp(status, "verify-remove-and-retry"))
{
snprintf(buf, sizeof(buf), "<color=white>%s</color>", status);
elm_object_text_set(lb_status, buf);
}
else if (!strcmp(status, "verify-disconnected"))
{
snprintf(buf, sizeof(buf), "<color=red>%s</color>", status);
elm_object_text_set(lb_status, buf);
edje_object_signal_emit(ly_popup, "failed", "failed");// FIXME ly_popup ist nicht mehr vorhanden wenn über block,clicked das popup gelöscht worden ist.
fprint_device_verify_stop_call(new_proxy1, _verify_stopp_cb, NULL);
_restart_verify();
}
else if (!strcmp(status, "verify-no-match"))
{
snprintf(buf, sizeof(buf), "<color=red>%s</color><br>retry", status);
elm_object_text_set(lb_status, buf);
edje_object_signal_emit(ly_popup, "failed", "failed");
fprint_device_verify_stop_call(new_proxy1, _verify_stopp_cb, NULL);
_restart_verify();
}
else
{
elm_object_text_set(lb_status, "<color=red>unknown error</color>");
edje_object_signal_emit(ly_popup, "failed", "failed");
fprint_device_verify_stop_call(new_proxy1, _verify_stopp_cb, NULL);
}
}
static void
_enroll_status(void *data EINA_UNUSED, const Eldbus_Message *msg)
{
//TODO: Theme an die Anzahl der verlangten enrolls anpassen. Theme = 5,
const char *status;
char buf[PATH_MAX];
char buf1[PATH_MAX];
EINA_SAFETY_ON_TRUE_RETURN(eldbus_message_error_get(msg, NULL, NULL));
if (!eldbus_message_arguments_get(msg, "s", &status))
{
fprintf(stderr, "Error: could not get entry contents\n");
return;
}
snprintf(buf1, sizeof(buf1), "%i", step);
if (!strcmp(status, "enroll-stage-passed"))
{
snprintf(buf, sizeof(buf), "<color=green>Enroll %i of %i<br>%s</color>", step, enroll_num, status);
elm_object_text_set(lb_status, buf); //FIXME lb_status ist nicht mehr vorhanden wenn über block,clicked das popup gelöscht worden ist.
enroll_count = enroll_count + enroll_count_value;
if (enroll_count <= 4)
edje_object_signal_emit(ly_popup, "success", "1");
else if (enroll_count >= 4 && (enroll_count <= 6))
edje_object_signal_emit(ly_popup, "success", "2");
else if (enroll_count >= 6 && (enroll_count <= 8))
edje_object_signal_emit(ly_popup, "success", "3");
else if (enroll_count >= 8 && (enroll_count <= 10))
edje_object_signal_emit(ly_popup, "success", "4");
else if (enroll_count >= 10)
edje_object_signal_emit(ly_popup, "success", "5");
const char *layout;
elm_layout_file_get(ly_popup, NULL, &layout);
printf("LAYOUT %s\n", layout);
step++;
}
else if (!strcmp(status, "enroll-completed"))
{
snprintf(buf, sizeof(buf), "<color=green>Enroll %i of %i<br>%s</color>", step, enroll_num, status);
elm_object_text_set(lb_status, buf);
edje_object_signal_emit(ly_popup, "success", "5");
fprint_device_list_enrolled_fingers_call(new_proxy1, enrolled_fingers_cb, NULL, currentuser);
enroll_count = 1;
step = 1;
}
else if (!strcmp(status, "enroll-swipe-too-short") || !strcmp(status, "enroll-retry-scan") || !strcmp(status, "enroll-finger-not-centered") || !strcmp(status, "enroll-remove-and-retry") || !strcmp(status, "enroll-remove-and-retry"))
{
snprintf(buf, sizeof(buf), "<color=red>Enroll %i of %i<br>%s</color>", step, enroll_num, status);
elm_object_text_set(lb_status, buf);
if (enroll_count <= 4)
edje_object_signal_emit(ly_popup, "failed", "1");
else if (enroll_count >= 4 && (enroll_count <= 6))
edje_object_signal_emit(ly_popup, "failed", "2");
else if (enroll_count >= 6 && (enroll_count <= 8))
edje_object_signal_emit(ly_popup, "failed", "3");
else if (enroll_count >= 8 && (enroll_count <= 10))
edje_object_signal_emit(ly_popup, "failed", "4");
else if (enroll_count >= 10)
edje_object_signal_emit(ly_popup, "failed", "5");
}
else if (!strcmp(status, "enroll-failed"))
{
elm_object_text_set(lb_status, "<color=red>enroll failed</color>");
edje_object_signal_emit(ly_popup, "failed", buf1); // FIXME ly_popup ist nicht mehr vorhanden wenn über block,clicked das popup gelöscht worden ist.
step = 1;
fprint_device_enroll_stop_call(new_proxy1, _enroll_stopp_cb, NULL);
}
else if (!strcmp(status, "enroll-disconnected"))
{
elm_object_text_set(lb_status, "<color=red>enroll disconnected</color>");
edje_object_signal_emit(ly_popup, "enrolled__failed", "enrolled__failed");
enroll_count = 1;
step = 1;
fprint_device_enroll_stop_call(new_proxy1, _enroll_stopp_cb, NULL);
}
else if (!strcmp(status, "enroll-data-full"))
{
elm_object_text_set(lb_status, "<color=red>enroll.data full<br> No further prints can be enrolled on this device</color>");
edje_object_signal_emit(ly_popup, "enrolled__failed", "enrolled__failed");
step = 1;
fprint_device_enroll_stop_call(new_proxy1, _enroll_stopp_cb, NULL);
}
else
{
elm_object_text_set(lb_status, "<color=red>unknown error</color>");
edje_object_signal_emit(ly_popup, "enrolled__failed", "enrolled__failed");
enroll_count = 1;
step = 1;
fprint_device_enroll_stop_call(new_proxy1, _enroll_stopp_cb, NULL);
}
}
int
e_auth_shutdown(void)
{
if (conn) eldbus_connection_unref(conn);
conn = NULL;
return 1;
}
EAPI_MAIN int
elm_main(int argc EINA_UNUSED, char **argv EINA_UNUSED)
{
Evas_Object *box, *lb, *lb1, *lb2, *h_box, *panel, *hv, *p_box, *sep;
char buf[PATH_MAX];
char buf1[PATH_MAX];
eina_value_array_setup(&array, EINA_VALUE_TYPE_STRING, 1);
elm_app_compile_bin_dir_set(PACKAGE_BIN_DIR);
elm_app_compile_lib_dir_set(PACKAGE_LIB_DIR);
elm_app_compile_data_dir_set(PACKAGE_DATA_DIR);
elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED);
eldbus_init();
conn = eldbus_connection_get(ELDBUS_CONNECTION_TYPE_SYSTEM);
if (!conn)
{
fprintf(stderr, "Error: could not get system bus\n");
return EXIT_FAILURE;
}
currentuser = getenv("USER");
currentfinger = "";
ly_popup = NULL;
lb_status = NULL;
new_proxy = fprint_manager_proxy_get(conn, "net.reactivated.Fprint", "/net/reactivated/Fprint/Manager");
p1 = fprint_manager_get_default_device_call(new_proxy, get_default_device, NULL);
default_device = "/net/reactivated/Fprint/Device/0"; //FIXME wenn ich default_device über die funkion hole ist die variable nicht gefüllt für fprint_device_proxy_get //FIXME
printf("DEFAULT DEVICE %s\n\n", default_device);
new_proxy1 = fprint_device_proxy_get(conn, "net.reactivated.Fprint", default_device);
fprint_device_claim_call(new_proxy1, claim_device, NULL, "");
eldbus_signal_handler_add(conn, "net.reactivated.Fprint", default_device, "net.reactivated.Fprint.Device", "EnrollStatus", _enroll_status, NULL);
eldbus_signal_handler_add(conn, "net.reactivated.Fprint", default_device, "net.reactivated.Fprint.Device", "VerifyStatus", _verify_status, NULL);
// p = fprint_manager_get_devices_call(new_proxy, get_devices, NULL);
fprint_device_list_enrolled_fingers_call(new_proxy1, enrolled_fingers_cb, NULL, "");
fprint_device_num_enroll_stages_propget(new_proxy1, _enroll_prop_get, NULL); //NUM enroll states needed
printf("NUM enroll states: %i\n", enroll_num);
// set app informations
elm_app_info_set(elm_main, "enlightenment", "COPYING");
win = elm_win_util_standard_add("main", "Fingerprint Password Settings");
elm_win_title_set(win, "Fingerprint Password Settings");
elm_win_autodel_set(win, EINA_TRUE);
box = elm_box_add(win);
evas_object_show(box);
h_box = elm_box_add(win);
elm_box_homogeneous_set(h_box, EINA_TRUE);
elm_box_horizontal_set(h_box, EINA_TRUE);
lb = elm_label_add(win);
elm_object_text_set(lb, "Choose finger and click on fingerprint to select action");
evas_object_show(lb);
elm_box_pack_end(box, lb);
ly = elm_layout_add(h_box);
snprintf(buf, sizeof(buf), "%s/themes/enlightenment_fprint.edj", elm_app_data_dir_get());
elm_layout_file_set(ly, buf, "right_hand");
evas_object_show(ly);
_update_theme();
elm_box_pack_end(h_box, ly);
evas_object_show(h_box);
elm_box_pack_end(box, h_box);
h_box = elm_box_add(win);
elm_box_homogeneous_set(h_box, EINA_TRUE);
elm_box_horizontal_set(h_box, EINA_TRUE);
evas_object_size_hint_align_set( h_box, EVAS_HINT_FILL, EVAS_HINT_FILL);
hv = elm_hoversel_add(h_box);
elm_object_text_set(hv, "One hand");
elm_hoversel_auto_update_set(hv, EINA_TRUE);
elm_hoversel_hover_parent_set(hv, win);
elm_hoversel_item_add(hv, "One hand", NULL, ELM_ICON_NONE, _select_mode, "right_hand");
elm_hoversel_item_add(hv, "Both hands", NULL, ELM_ICON_NONE, _select_mode, "hands");
elm_hoversel_item_add(hv, "One finger", NULL, ELM_ICON_NONE, _select_mode, "finger");
evas_object_show(hv);
elm_box_pack_end(h_box, hv);
evas_object_show(h_box);
elm_box_pack_end(box, h_box);
panel = elm_panel_add(box);
elm_panel_orient_set(panel, ELM_PANEL_ORIENT_BOTTOM);
evas_object_size_hint_weight_set(panel, EVAS_HINT_EXPAND, 0);
evas_object_size_hint_align_set(panel, EVAS_HINT_FILL, EVAS_HINT_FILL);
evas_object_show(panel);
p_box = elm_box_add(panel);
elm_box_horizontal_set(p_box, EINA_TRUE);
evas_object_size_hint_align_set(p_box, EVAS_HINT_FILL, EVAS_HINT_FILL);
lb = elm_label_add(panel);
fprint_device_name_propget(new_proxy1, get_device_proberties, lb); // DEVICE NAME
evas_object_show(lb);
elm_box_pack_end(p_box, lb);
sep = elm_separator_add(panel);
elm_separator_horizontal_set(sep, EINA_FALSE);
evas_object_show(sep);
elm_box_pack_end(p_box, sep);
lb1 = elm_label_add(panel);
fprint_device_scan_type_propget(new_proxy1, get_device_type, lb1); // DEVICE TYPE
evas_object_show(lb1);
elm_box_pack_end(p_box, lb1);
sep = elm_separator_add(panel);
elm_separator_horizontal_set(sep, EINA_FALSE);
evas_object_show(sep);
elm_box_pack_end(p_box, sep);
snprintf(buf1, sizeof(buf1), "User: <hilight>%s</>", currentuser);
lb2 = elm_label_add(panel);
elm_object_text_set(lb2, buf1);
evas_object_show(lb2);
elm_box_pack_end(p_box, lb2);
elm_object_content_set(panel, p_box);
elm_box_pack_end(box, panel);
elm_win_resize_object_add(win, box);
evas_object_show(win);
elm_run();
if (conn) eldbus_connection_unref(conn);
conn = NULL;
return 0;
}
ELM_MAIN()