Skip to content

Commit 3adefe7

Browse files
committed
Deduplicate UI components for NFC and USB
1 parent 9462f83 commit 3adefe7

File tree

3 files changed

+19
-107
lines changed

3 files changed

+19
-107
lines changed

credentialsd-ui/data/resources/ui/window.ui

Lines changed: 5 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,8 @@
6868

6969
<child>
7070
<object class="GtkStackPage">
71-
<property name="name">usb</property>
72-
<property name="title">Plug in security key</property>
71+
<property name="name">usb_or_nfc</property>
72+
<property name="title">Connect a security key</property>
7373
<property name="child">
7474
<object class="GtkBox">
7575
<property name="orientation">vertical</property>
@@ -90,51 +90,10 @@
9090
</object>
9191
</child>
9292
<child>
93-
<object class="GtkPasswordEntry" id="usb_pin_entry">
94-
<signal name="activate" handler="handle_usb_pin_entered" swapped="true"/>
93+
<object class="GtkPasswordEntry" id="usb_nfc_pin_entry">
94+
<signal name="activate" handler="handle_usb_nfc_pin_entered" swapped="true"/>
9595
<binding name="visible">
96-
<lookup name="usb_pin_entry_visible">
97-
<lookup name="view-model">
98-
CredentialsUiWindow
99-
</lookup>
100-
</lookup>
101-
</binding>
102-
<property name="placeholder-text">Enter your device PIN</property>
103-
</object>
104-
</child>
105-
</object>
106-
</property>
107-
</object>
108-
</child>
109-
110-
<child>
111-
<object class="GtkStackPage">
112-
<property name="name">nfc</property>
113-
<property name="title">Plug in security key</property>
114-
<property name="child">
115-
<object class="GtkBox">
116-
<property name="orientation">vertical</property>
117-
<child>
118-
<object class="GtkImage">
119-
<property name="icon-name">media-removable-symbolic</property>
120-
</object>
121-
</child>
122-
<child>
123-
<object class="GtkLabel">
124-
<binding name="label">
125-
<lookup name="prompt">
126-
<lookup name="view-model">
127-
CredentialsUiWindow
128-
</lookup>
129-
</lookup>
130-
</binding>
131-
</object>
132-
</child>
133-
<child>
134-
<object class="GtkPasswordEntry" id="nfc_pin_entry">
135-
<signal name="activate" handler="handle_nfc_pin_entered" swapped="true"/>
136-
<binding name="visible">
137-
<lookup name="nfc_pin_entry_visible">
96+
<lookup name="usb_nfc_pin_entry_visible">
13897
<lookup name="view-model">
13998
CredentialsUiWindow
14099
</lookup>

credentialsd-ui/src/gui/view_model/gtk/mod.rs

Lines changed: 8 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,7 @@ mod imp {
4646
pub selected_device: RefCell<Option<DeviceObject>>,
4747

4848
#[property(get, set)]
49-
pub usb_pin_entry_visible: RefCell<bool>,
50-
51-
#[property(get, set)]
52-
pub nfc_pin_entry_visible: RefCell<bool>,
49+
pub usb_nfc_pin_entry_visible: RefCell<bool>,
5350

5451
#[property(get, set)]
5552
pub prompt: RefCell<String>,
@@ -123,7 +120,7 @@ impl ViewModel {
123120
match rx.recv().await {
124121
Ok(update) => {
125122
// TODO: hack so I don't have to unset this in every event manually.
126-
view_model.set_usb_pin_entry_visible(false);
123+
view_model.set_usb_nfc_pin_entry_visible(false);
127124
match update {
128125
ViewUpdate::SetTitle(title) => view_model.set_title(title),
129126
ViewUpdate::SetDevices(devices) => {
@@ -136,31 +133,8 @@ impl ViewModel {
136133
ViewUpdate::WaitingForDevice(device) => {
137134
view_model.waiting_for_device(&device)
138135
}
139-
ViewUpdate::UsbNeedsPin { attempts_left } => {
140-
let prompt = match attempts_left {
141-
Some(1) => {
142-
"Enter your PIN. 1 attempt remaining.".to_string()
143-
}
144-
Some(attempts_left) => format!(
145-
"Enter your PIN. {attempts_left} attempts remaining."
146-
),
147-
None => "Enter your PIN.".to_string(),
148-
};
149-
view_model.set_prompt(prompt);
150-
view_model.set_usb_pin_entry_visible(true);
151-
}
152-
ViewUpdate::UsbNeedsUserVerification { attempts_left } => {
153-
let prompt = match attempts_left {
154-
Some(1) => "Touch your device again. 1 attempt remaining."
155-
.to_string(),
156-
Some(attempts_left) => format!(
157-
"Touch your device again. {attempts_left} attempts remaining."
158-
),
159-
None => "Touch your device.".to_string(),
160-
};
161-
view_model.set_prompt(prompt);
162-
}
163-
ViewUpdate::NfcNeedsPin { attempts_left } => {
136+
ViewUpdate::UsbNeedsPin { attempts_left }
137+
| ViewUpdate::NfcNeedsPin { attempts_left } => {
164138
let prompt = match attempts_left {
165139
Some(1) => {
166140
"Enter your PIN. 1 attempt remaining.".to_string()
@@ -171,9 +145,10 @@ impl ViewModel {
171145
None => "Enter your PIN.".to_string(),
172146
};
173147
view_model.set_prompt(prompt);
174-
view_model.set_nfc_pin_entry_visible(true);
148+
view_model.set_usb_nfc_pin_entry_visible(true);
175149
}
176-
ViewUpdate::NfcNeedsUserVerification { attempts_left } => {
150+
ViewUpdate::UsbNeedsUserVerification { attempts_left }
151+
| ViewUpdate::NfcNeedsUserVerification { attempts_left } => {
177152
let prompt = match attempts_left {
178153
Some(1) => "Touch your device again. 1 attempt remaining."
179154
.to_string(),
@@ -352,11 +327,7 @@ impl ViewModel {
352327
self.set_prompt("Multiple devices found. Please select with which to proceed.");
353328
}
354329

355-
pub async fn send_usb_device_pin(&self, pin: String) {
356-
self.send_event(ViewEvent::PinEntered(pin)).await;
357-
}
358-
359-
pub async fn send_nfc_device_pin(&self, pin: String) {
330+
pub async fn send_usb_nfc_device_pin(&self, pin: String) {
360331
self.send_event(ViewEvent::PinEntered(pin)).await;
361332
}
362333

credentialsd-ui/src/gui/view_model/gtk/window.rs

Lines changed: 6 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,7 @@ mod imp {
3535
pub stack: TemplateChild<gtk::Stack>,
3636

3737
#[template_child]
38-
pub usb_pin_entry: TemplateChild<gtk::PasswordEntry>,
39-
40-
#[template_child]
41-
pub nfc_pin_entry: TemplateChild<gtk::PasswordEntry>,
38+
pub usb_nfc_pin_entry: TemplateChild<gtk::PasswordEntry>,
4239

4340
#[template_child]
4441
pub qr_code_pic: TemplateChild<Picture>,
@@ -47,29 +44,15 @@ mod imp {
4744
#[gtk::template_callbacks]
4845
impl CredentialsUiWindow {
4946
#[template_callback]
50-
fn handle_usb_pin_entered(&self, entry: &gtk::PasswordEntry) {
51-
let view_model = &self.view_model.borrow();
52-
let view_model = view_model.as_ref().unwrap();
53-
let pin = entry.text().to_string();
54-
glib::spawn_future_local(clone!(
55-
#[weak]
56-
view_model,
57-
async move {
58-
view_model.send_usb_device_pin(pin).await;
59-
}
60-
));
61-
}
62-
63-
#[template_callback]
64-
fn handle_nfc_pin_entered(&self, entry: &gtk::PasswordEntry) {
47+
fn handle_usb_nfc_pin_entered(&self, entry: &gtk::PasswordEntry) {
6548
let view_model = &self.view_model.borrow();
6649
let view_model = view_model.as_ref().unwrap();
6750
let pin = entry.text().to_string();
6851
glib::spawn_future_local(clone!(
6952
#[weak]
7053
view_model,
7154
async move {
72-
view_model.send_nfc_device_pin(pin).await;
55+
view_model.send_usb_nfc_device_pin(pin).await;
7356
}
7457
));
7558
}
@@ -82,8 +65,7 @@ mod imp {
8265
settings: gio::Settings::new(APP_ID),
8366
view_model: RefCell::default(),
8467
stack: TemplateChild::default(),
85-
usb_pin_entry: TemplateChild::default(),
86-
nfc_pin_entry: TemplateChild::default(),
68+
usb_nfc_pin_entry: TemplateChild::default(),
8769
qr_code_pic: TemplateChild::default(),
8870
}
8971
}
@@ -180,9 +162,9 @@ impl CredentialsUiWindow {
180162
.and_downcast_ref::<DeviceObject>()
181163
.expect("selected device to exist at notify");
182164
match d.transport().try_into() {
183-
Ok(Transport::Usb) => stack.set_visible_child_name("usb"),
165+
Ok(Transport::Usb) => stack.set_visible_child_name("usb_or_nfc"),
184166
Ok(Transport::HybridQr) => stack.set_visible_child_name("hybrid_qr"),
185-
Ok(Transport::Nfc) => stack.set_visible_child_name("nfc"),
167+
Ok(Transport::Nfc) => stack.set_visible_child_name("usb_or_nfc"),
186168
_ => {}
187169
};
188170
}

0 commit comments

Comments
 (0)