3232import androidx .annotation .NonNull ;
3333import androidx .annotation .Nullable ;
3434import androidx .fragment .app .Fragment ;
35+ import androidx .lifecycle .ViewModelProvider ;
36+
37+ import org .iiab .controller .network .presentation .DnsSettingsUiState ;
38+ import org .iiab .controller .network .presentation .DnsSettingsViewModel ;
39+ import org .iiab .controller .network .presentation .DnsSettingsViewModelFactory ;
3540
3641import com .google .android .material .snackbar .Snackbar ;
3742
@@ -43,7 +48,7 @@ public class UsageFragment extends Fragment implements View.OnClickListener {
4348
4449 private MainActivity mainActivity ;
4550 // INTERFACE VARS
46- private EditText edittext_socks_addr , edittext_socks_udp_addr , edittext_socks_port , edittext_socks_user , edittext_socks_pass , edittext_dns_ipv4 , edittext_dns_ipv6 ;
51+ private EditText edittext_socks_addr , edittext_socks_udp_addr , edittext_socks_port , edittext_socks_user , edittext_socks_pass ;
4752 private CheckBox checkbox_udp_in_tcp , checkbox_remote_dns , checkbox_global , checkbox_maintenance , checkbox_ipv4 , checkbox_ipv6 ;
4853 private TextView textview_maintenance_warning , configLabel , advConfigLabel , logLabel , logWarning , logSizeText , connectionLog ;
4954 private Button button_apps , button_save , button_control , button_browse_content , btnClearLog , btnCopyLog ;
@@ -53,6 +58,17 @@ public class UsageFragment extends Fragment implements View.OnClickListener {
5358
5459 private DashboardManager dashboardManager ;
5560
61+ // Setup DNS (network slice, PR B)
62+ private CheckBox setup_dns_check ;
63+ private LinearLayout dns_setup_fields ;
64+ private EditText dns_primary , dns_secondary ;
65+ private Button dns_accept ;
66+ private TextView dns_result ;
67+ private TextView dns_settings_label ;
68+ private LinearLayout dns_settings_section ;
69+ private DnsSettingsViewModel dnsViewModel ;
70+ private boolean suppressDnsToggle = false ;
71+
5672 @ Override
5773 public void onAttach (@ NonNull Context context ) {
5874 super .onAttach (context );
@@ -78,8 +94,25 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat
7894 edittext_socks_port = view .findViewById (R .id .socks_port );
7995 edittext_socks_user = view .findViewById (R .id .socks_user );
8096 edittext_socks_pass = view .findViewById (R .id .socks_pass );
81- edittext_dns_ipv4 = view .findViewById (R .id .dns_ipv4 );
82- edittext_dns_ipv6 = view .findViewById (R .id .dns_ipv6 );
97+ setup_dns_check = view .findViewById (R .id .setup_dns_check );
98+ dns_setup_fields = view .findViewById (R .id .dns_setup_fields );
99+ dns_primary = view .findViewById (R .id .dns_primary );
100+ dns_secondary = view .findViewById (R .id .dns_secondary );
101+ dns_accept = view .findViewById (R .id .dns_accept );
102+ dns_result = view .findViewById (R .id .dns_result );
103+ dns_settings_label = view .findViewById (R .id .dns_settings_label );
104+ dns_settings_section = view .findViewById (R .id .dns_settings_section );
105+ dns_settings_label .setText (String .format (getString (R .string .label_separator_up ), getString (R .string .network_advanced_label )));
106+ dns_settings_label .setOnClickListener (v -> toggleVisibility (dns_settings_section , dns_settings_label , getString (R .string .network_advanced_label )));
107+ dnsViewModel = new ViewModelProvider (this , new DnsSettingsViewModelFactory (requireContext ()))
108+ .get (DnsSettingsViewModel .class );
109+ dnsViewModel .state ().observe (getViewLifecycleOwner (), this ::renderDnsState );
110+ setup_dns_check .setOnCheckedChangeListener ((btn , checked ) -> {
111+ if (suppressDnsToggle ) return ;
112+ dnsViewModel .onSetupToggled (checked );
113+ });
114+ dns_accept .setOnClickListener (v -> dnsViewModel .onAccept (
115+ dns_primary .getText ().toString (), dns_secondary .getText ().toString ()));
83116 checkbox_ipv4 = view .findViewById (R .id .ipv4 );
84117 checkbox_ipv6 = view .findViewById (R .id .ipv6 );
85118 checkbox_global = view .findViewById (R .id .global );
@@ -210,8 +243,6 @@ public void updateUI() {
210243 edittext_socks_port .setText (String .valueOf (mainActivity .prefs .getSocksPort ()));
211244 edittext_socks_user .setText (mainActivity .prefs .getSocksUsername ());
212245 edittext_socks_pass .setText (mainActivity .prefs .getSocksPassword ());
213- edittext_dns_ipv4 .setText (mainActivity .prefs .getDnsIpv4 ());
214- edittext_dns_ipv6 .setText (mainActivity .prefs .getDnsIpv6 ());
215246 checkbox_ipv4 .setChecked (mainActivity .prefs .getIpv4 ());
216247 checkbox_ipv6 .setChecked (mainActivity .prefs .getIpv6 ());
217248 checkbox_global .setChecked (mainActivity .prefs .getGlobal ());
@@ -450,10 +481,42 @@ public void savePrefsFromUI() {
450481 mainActivity .prefs .setRemoteDns (true );
451482 mainActivity .prefs .setGlobal (true );
452483
453- mainActivity .prefs .setDnsIpv4 (edittext_dns_ipv4 .getText ().toString ());
454- mainActivity .prefs .setDnsIpv6 (edittext_dns_ipv6 .getText ().toString ());
455484 mainActivity .prefs .setMaintenanceMode (checkbox_maintenance .isChecked ());
456485 }
486+
487+ private void renderDnsState (DnsSettingsUiState st ) {
488+ if (setup_dns_check == null ) return ;
489+ suppressDnsToggle = true ;
490+ setup_dns_check .setChecked (st .customEnabled );
491+ suppressDnsToggle = false ;
492+ dns_setup_fields .setVisibility (st .customEnabled ? View .VISIBLE : View .GONE );
493+ if (st .status == DnsSettingsUiState .Status .IDLE || st .status == DnsSettingsUiState .Status .UNREACHABLE ) {
494+ dns_primary .setText (st .primary );
495+ dns_secondary .setText (st .secondary );
496+ }
497+ switch (st .status ) {
498+ case TESTING :
499+ dns_result .setVisibility (View .VISIBLE );
500+ dns_result .setText (getString (R .string .dns_status_testing ));
501+ dns_result .setTextColor (ContextCompat .getColor (requireContext (), R .color .text_secondary ));
502+ break ;
503+ case APPLIED :
504+ dns_result .setVisibility (View .VISIBLE );
505+ dns_result .setText (getString (R .string .dns_status_ok ));
506+ dns_result .setTextColor (ContextCompat .getColor (requireContext (), R .color .status_success ));
507+ break ;
508+ case INVALID :
509+ case UNREACHABLE :
510+ dns_result .setVisibility (View .VISIBLE );
511+ dns_result .setText (st .message != null ? st .message : "" );
512+ dns_result .setTextColor (ContextCompat .getColor (requireContext (), R .color .status_warning ));
513+ break ;
514+ default :
515+ dns_result .setVisibility (View .GONE );
516+ break ;
517+ }
518+ }
519+
457520 public void highlightServerButton () {
458521 if (deckContainer == null || !isAdded ()) return ;
459522
0 commit comments