2424
2525logger = logging .getLogger ("FirstSetup::Conn_Check" )
2626
27+ # Host to test actual internet connectivity
28+ CONNECTIVITY_CHECK_HOST = "gnome.org"
29+
2730
2831@Gtk .Template (resource_path = "/org/frostyard/FirstSetup/gtk/conn-check.ui" )
2932class VanillaConnCheck (Adw .Bin ):
@@ -35,18 +38,21 @@ class VanillaConnCheck(Adw.Bin):
3538 __network_monitor = None
3639 __active = False
3740 __already_skipped = False
41+ __checking = False
3842
3943 def __init__ (self , window , ** kwargs ):
4044 super ().__init__ (** kwargs )
4145 self .__window = window
4246
4347 self .__network_monitor = Gio .NetworkMonitor .get_default ()
4448
45- self .__network_monitor .connect ("network-changed" , self .__check_network_status )
49+ self .__network_monitor .connect ("network-changed" , self .__on_network_changed )
4650 self .btn_settings .connect ("clicked" , self .__on_btn_settings_clicked )
4751
4852 def set_page_active (self ):
4953 self .__active = True
54+ # Disable next button until we verify connectivity
55+ self .__window .set_ready (False )
5056 self .__check_network_status ()
5157
5258 def set_page_inactive (self ):
@@ -55,26 +61,71 @@ def set_page_inactive(self):
5561 def finish (self ):
5662 return True
5763
58- def __check_network_status (self , * args ):
64+ def __on_network_changed (self , monitor , network_available ):
65+ """Called when network state changes."""
5966 if not self .__active :
6067 return
68+ # Disable next button immediately and recheck
69+ GLib .idle_add (self .__window .set_ready , False )
70+ self .__check_network_status ()
71+
72+ def __check_network_status (self ):
73+ """Check actual internet connectivity asynchronously."""
74+ if self .__checking :
75+ return
76+ self .__checking = True
6177
62- if self .__network_monitor .get_connectivity () == Gio .NetworkConnectivity .FULL :
63- self .__set_network_connected ()
64- self .__window .set_ready (True )
65- else :
66- self .__set_network_disconnected ()
67- self .__window .set_ready (False )
78+ # First do a quick check - if no network route at all, fail fast
79+ if self .__network_monitor .get_connectivity () == Gio .NetworkConnectivity .LOCAL :
80+ self .__checking = False
81+ GLib .idle_add (self .__set_network_disconnected )
82+ GLib .idle_add (self .__window .set_ready , False )
83+ return
84+
85+ # Do actual reachability test in background
86+ thread = threading .Thread (target = self .__do_connectivity_check )
87+ thread .daemon = True
88+ thread .start ()
89+
90+ def __do_connectivity_check (self ):
91+ """Perform actual connectivity test to verify internet access."""
92+ try :
93+ address = Gio .NetworkAddress .new (CONNECTIVITY_CHECK_HOST , 443 )
94+ can_reach = self .__network_monitor .can_reach (address , None )
95+
96+ if can_reach :
97+ GLib .idle_add (self .__handle_connected )
98+ else :
99+ GLib .idle_add (self .__handle_disconnected )
100+ except Exception as e :
101+ logger .warning (f"Connectivity check failed: { e } " )
102+ GLib .idle_add (self .__handle_disconnected )
103+ finally :
104+ self .__checking = False
105+
106+ def __handle_connected (self ):
107+ """Handle successful connectivity check."""
108+ if not self .__active :
109+ return
110+ self .__set_network_connected ()
111+ self .__window .set_ready (True )
112+
113+ def __handle_disconnected (self ):
114+ """Handle failed connectivity check."""
115+ if not self .__active :
116+ return
117+ self .__set_network_disconnected ()
118+ self .__window .set_ready (False )
68119
69120 def __set_network_disconnected (self ):
70- logger .info ("Internet connection available." )
121+ logger .info ("Internet connection not available." )
71122 self .status_page .set_icon_name ("network-wired-disconnected-symbolic" )
72123 self .status_page .set_title (_ ("No Internet Connection!" ))
73124 self .status_page .set_description (_ ("First Setup requires an active internet connection" ))
74125 self .btn_settings .set_visible (True )
75126
76127 def __set_network_connected (self ):
77- logger .info ("Internet connection not avaiable ." )
128+ logger .info ("Internet connection available ." )
78129 self .status_page .set_icon_name ("emblem-default-symbolic" )
79130 self .status_page .set_title (_ ("Connection available" ))
80131 self .status_page .set_description (_ ("You have a working internet connection" ))
0 commit comments