Skip to content

Commit da53640

Browse files
committed
support hidden networks
1 parent 782cc65 commit da53640

File tree

5 files changed

+117
-16
lines changed

5 files changed

+117
-16
lines changed

Cargo.lock

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ serde = { version = "1", features = ["derive"] }
2525
toml = { version = "0.9" }
2626
clap = { version = "4", features = ["derive", "cargo"] }
2727
anyhow = "1"
28-
iwdrs = "0.2.4"
28+
iwdrs = "0.2.5"
2929
chrono = "0.4"
3030
log = "0.4"
3131
env_logger = "0.11"

src/config.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,13 +65,17 @@ pub struct Station {
6565

6666
#[serde(default)]
6767
pub known_network: KnownNetwork,
68+
69+
#[serde(default)]
70+
pub new_network: NewNetwork,
6871
}
6972

7073
impl Default for Station {
7174
fn default() -> Self {
7275
Self {
7376
start_scanning: 's',
7477
known_network: KnownNetwork::default(),
78+
new_network: NewNetwork::default(),
7579
}
7680
}
7781
}
@@ -104,6 +108,17 @@ fn default_station_remove_known_network() -> char {
104108
'd'
105109
}
106110

111+
#[derive(Deserialize, Debug)]
112+
pub struct NewNetwork {
113+
pub show_all: char,
114+
}
115+
116+
impl Default for NewNetwork {
117+
fn default() -> Self {
118+
Self { show_all: 'a' }
119+
}
120+
}
121+
107122
// Access Point
108123
#[derive(Deserialize, Debug)]
109124
pub struct AccessPoint {

src/handler.rs

Lines changed: 46 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,40 @@ pub async fn toggle_connect(app: &mut App, sender: UnboundedSender<Event>) -> Re
2020
match app.focused_block {
2121
FocusedBlock::NewNetworks => {
2222
if let Some(net_index) = station.new_networks_state.selected() {
23-
let (net, _) = station.new_networks[net_index].clone();
23+
if net_index < station.new_networks.len() {
24+
let (net, _) = station.new_networks[net_index].clone();
2425

25-
if net.network_type == NetworkType::Eap {
26-
sender.send(Event::ConfigureNewEapNetwork(net.name.clone()))?;
27-
return Ok(());
26+
if net.network_type == NetworkType::Eap {
27+
sender.send(Event::ConfigureNewEapNetwork(net.name.clone()))?;
28+
return Ok(());
29+
}
30+
tokio::spawn(async move {
31+
let _ = net.connect(sender.clone()).await;
32+
});
33+
} else {
34+
let net = station.new_hidden_networks
35+
[net_index.saturating_sub(station.new_networks.len())]
36+
.clone();
37+
38+
if net.network_type == NetworkType::Eap {
39+
sender.send(Event::ConfigureNewEapNetwork(net.address.clone()))?;
40+
return Ok(());
41+
}
42+
tokio::spawn({
43+
let iwd_station =
44+
station.session.stations().await.unwrap().pop().unwrap();
45+
let ssid = net.address.clone();
46+
async move {
47+
if let Err(e) = iwd_station.connect_hidden_network(ssid).await {
48+
let _ = Notification::send(
49+
e.to_string(),
50+
notification::NotificationLevel::Error,
51+
&sender,
52+
);
53+
}
54+
}
55+
});
2856
}
29-
tokio::spawn(async move {
30-
let _ = net.connect(sender.clone()).await;
31-
});
3257
}
3358
}
3459
FocusedBlock::KnownNetworks => match &station.connected_network {
@@ -532,18 +557,28 @@ pub async fn handle_key_events(
532557
}
533558
}
534559
FocusedBlock::NewNetworks => match key_event.code {
560+
// Show / Hide unavailable networks
561+
KeyCode::Char(c)
562+
if c == config.station.new_network.show_all =>
563+
{
564+
station.show_hidden_networks =
565+
!station.show_hidden_networks;
566+
}
535567
KeyCode::Enter | KeyCode::Char(' ') => {
536568
toggle_connect(app, sender).await?
537569
}
538570
KeyCode::Char('j') | KeyCode::Down => {
539571
if !station.new_networks.is_empty() {
540572
let i = match station.new_networks_state.selected() {
541573
Some(i) => {
542-
if i < station.new_networks.len() - 1 {
543-
i + 1
574+
let limit = if station.show_hidden_networks {
575+
station.new_networks.len()
576+
+ station.new_hidden_networks.len()
577+
- 1
544578
} else {
545-
i
546-
}
579+
station.new_networks.len() - 1
580+
};
581+
if i < limit { i + 1 } else { i }
547582
}
548583
None => 0,
549584
};

src/mode/station.rs

Lines changed: 53 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ use std::sync::Arc;
99
use futures::future::join_all;
1010
use iwdrs::{
1111
error::{IWDError, station::ScanError},
12+
hidden_network::HiddenNetwork,
1213
session::Session,
1314
station::{State, diagnostics::ActiveStationDiagnostics},
1415
};
@@ -39,12 +40,14 @@ pub struct Station {
3940
pub is_scanning: bool,
4041
pub connected_network: Option<Network>,
4142
pub new_networks: Vec<(Network, i16)>,
43+
pub new_hidden_networks: Vec<HiddenNetwork>,
4244
pub known_networks: Vec<(Network, i16)>,
4345
pub unavailable_known_networks: Vec<KnownNetwork>,
4446
pub known_networks_state: TableState,
4547
pub new_networks_state: TableState,
4648
pub diagnostic: Option<ActiveStationDiagnostics>,
4749
pub show_unavailable_known_networks: bool,
50+
pub show_hidden_networks: bool,
4851
pub share: Option<Share>,
4952
}
5053

@@ -94,6 +97,11 @@ impl Station {
9497
.filter(|(net, _signal)| net.known_network.is_none())
9598
.collect();
9699

100+
let new_hidden_networks = iwd_station
101+
.get_hidden_networks()
102+
.await
103+
.unwrap_or(Vec::new());
104+
97105
let known_networks: Vec<(Network, i16)> = networks
98106
.into_iter()
99107
.filter(|(net, _signal)| net.known_network.is_some())
@@ -144,16 +152,24 @@ impl Station {
144152
is_scanning,
145153
connected_network,
146154
new_networks,
155+
new_hidden_networks,
147156
known_networks,
148157
unavailable_known_networks,
149158
known_networks_state,
150159
new_networks_state,
151160
diagnostic,
152161
show_unavailable_known_networks: false,
162+
show_hidden_networks: false,
153163
share: None,
154164
})
155165
}
156166

167+
pub async fn connect_hidden_network(&self, ssid: String) -> Result<()> {
168+
let iwd_station = self.session.stations().await?.pop().unwrap();
169+
iwd_station.connect_hidden_network(ssid).await?;
170+
Ok(())
171+
}
172+
157173
pub async fn refresh(&mut self) -> Result<()> {
158174
let iwd_station = self.session.stations().await.unwrap().pop().unwrap();
159175

@@ -243,6 +259,11 @@ impl Station {
243259
self.known_networks = known_networks;
244260
}
245261

262+
self.new_hidden_networks = iwd_station
263+
.get_hidden_networks()
264+
.await
265+
.unwrap_or(Vec::new());
266+
246267
let available_networks_names: Vec<String> = self
247268
.known_networks
248269
.iter()
@@ -598,7 +619,7 @@ impl Station {
598619
//
599620
// New networks
600621
//
601-
let rows: Vec<Row> = self
622+
let mut rows: Vec<Row> = self
602623
.new_networks
603624
.iter()
604625
.map(|(net, signal)| {
@@ -625,6 +646,34 @@ impl Station {
625646
})
626647
.collect();
627648

649+
if self.show_hidden_networks {
650+
self.new_hidden_networks.iter().for_each(|net| {
651+
rows.push(
652+
Row::new(vec![
653+
Line::from(net.address.clone()).centered(),
654+
Line::from(net.network_type.to_string().clone()).centered(),
655+
Line::from({
656+
let signal = {
657+
if net.signal_strength / 100 >= -50 {
658+
100
659+
} else {
660+
2 * (100 + net.signal_strength / 100)
661+
}
662+
};
663+
match signal {
664+
n if n >= 75 => format!("{signal:3}% 󰤨"),
665+
n if (50..75).contains(&n) => format!("{signal:3}% 󰤥"),
666+
n if (25..50).contains(&n) => format!("{signal:3}% 󰤢"),
667+
_ => format!("{signal:3}% 󰤟"),
668+
}
669+
})
670+
.centered(),
671+
])
672+
.dark_gray(),
673+
)
674+
})
675+
};
676+
628677
let widths = [
629678
Constraint::Length(25),
630679
Constraint::Length(15),
@@ -789,7 +838,6 @@ impl Station {
789838
Span::from(" | "),
790839
Span::from(config.station.start_scanning.to_string()).bold(),
791840
Span::from(" Scan"),
792-
Span::from(" | "),
793841
]),
794842
Line::from(vec![
795843
Span::from("k,").bold(),
@@ -816,6 +864,9 @@ impl Station {
816864
Span::from("󱁐 or ↵ ").bold(),
817865
Span::from(" Connect"),
818866
Span::from(" | "),
867+
Span::from(config.station.new_network.show_all.to_string()).bold(),
868+
Span::from(" Show All"),
869+
Span::from(" | "),
819870
Span::from(config.station.start_scanning.to_string()).bold(),
820871
Span::from(" Scan"),
821872
Span::from(" | "),

0 commit comments

Comments
 (0)