mirror of https://github.com/TakeV-Lambda/dino.git
87 lines
3.6 KiB
Vala
87 lines
3.6 KiB
Vala
using Dino.Entities;
|
|
using Gtk;
|
|
using Pango;
|
|
|
|
public class Dino.Ui.CallEncryptionButtonController {
|
|
|
|
private bool has_been_set = false;
|
|
public bool controls_active { get; set; default=false; }
|
|
|
|
public MenuButton button;
|
|
|
|
public CallEncryptionButtonController(MenuButton button) {
|
|
this.button = button;
|
|
|
|
button.opacity = 0;
|
|
// button.set_popover(popover);
|
|
|
|
button.notify["controls-active"].connect(update_opacity);
|
|
}
|
|
|
|
public void set_icon(bool encrypted, string? icon_name) {
|
|
if (encrypted) {
|
|
button.icon_name = icon_name ?? "changes-prevent-symbolic";
|
|
button.get_style_context().remove_class("unencrypted");
|
|
} else {
|
|
button.icon_name = icon_name ?? "changes-allow-symbolic";
|
|
button.get_style_context().add_class("unencrypted");
|
|
}
|
|
has_been_set = true;
|
|
update_opacity();
|
|
}
|
|
|
|
public void set_info(string? title, bool show_keys, Xmpp.Xep.Jingle.ContentEncryption? audio_encryption, Xmpp.Xep.Jingle.ContentEncryption? video_encryption) {
|
|
Popover popover = new Popover();
|
|
button.set_popover(popover);
|
|
|
|
if (audio_encryption == null) {
|
|
popover.set_child(new Label("This call is unencrypted.") { visible=true } );
|
|
return;
|
|
}
|
|
if (title != null && !show_keys) {
|
|
popover.set_child(new Label(title) { use_markup=true, visible=true } );
|
|
return;
|
|
}
|
|
|
|
Box box = new Box(Orientation.VERTICAL, 10) { visible=true };
|
|
box.append(new Label("<b>%s</b>".printf(title ?? "This call is end-to-end encrypted.")) { use_markup=true, xalign=0, visible=true });
|
|
|
|
if (video_encryption == null) {
|
|
box.append(create_media_encryption_grid(audio_encryption));
|
|
} else {
|
|
box.append(new Label("<b>Audio</b>") { use_markup=true, xalign=0, visible=true });
|
|
box.append(create_media_encryption_grid(audio_encryption));
|
|
box.append(new Label("<b>Video</b>") { use_markup=true, xalign=0, visible=true });
|
|
box.append(create_media_encryption_grid(video_encryption));
|
|
}
|
|
popover.set_child(box);
|
|
}
|
|
|
|
public void update_opacity() {
|
|
button.opacity = controls_active && has_been_set ? 1 : 0;
|
|
}
|
|
|
|
private Grid create_media_encryption_grid(Xmpp.Xep.Jingle.ContentEncryption? encryption) {
|
|
Grid ret = new Grid() { row_spacing=3, column_spacing=5, visible=true };
|
|
if (encryption.peer_key.length > 0) {
|
|
ret.attach(new Label("Peer call key") { xalign=0, visible=true }, 1, 2, 1, 1);
|
|
ret.attach(new Label("<span font_family='monospace'>" + format_fingerprint(encryption.peer_key) + "</span>") { use_markup=true, max_width_chars=25, ellipsize=EllipsizeMode.MIDDLE, xalign=0, hexpand=true, visible=true }, 2, 2, 1, 1);
|
|
}
|
|
if (encryption.our_key.length > 0) {
|
|
ret.attach(new Label("Your call key") { xalign=0, visible=true }, 1, 3, 1, 1);
|
|
ret.attach(new Label("<span font_family='monospace'>" + format_fingerprint(encryption.our_key) + "</span>") { use_markup=true, max_width_chars=25, ellipsize=EllipsizeMode.MIDDLE, xalign=0, hexpand=true, visible=true }, 2, 3, 1, 1);
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
private string format_fingerprint(uint8[] fingerprint) {
|
|
var sb = new StringBuilder();
|
|
for (int i = 0; i < fingerprint.length; i++) {
|
|
sb.append("%02x".printf(fingerprint[i]));
|
|
if (i < fingerprint.length - 1) {
|
|
sb.append(":");
|
|
}
|
|
}
|
|
return sb.str;
|
|
}
|
|
} |