@@ -323,99 +323,111 @@ class AppInfoActivity : AppCompatActivity(R.layout.activity_app_details) {
323323 TooltipCompat .setTooltipText(b.aadCloseConnsChip, getString(R .string.close_conns_dialog_title))
324324
325325 b.aadAppSettingsBypassDnsFirewall.setOnClickListener {
326- // show the tooltip only once when app is not bypassed (dns + firewall) earlier
327- if (showBypassToolTip && appStatus == FirewallManager .FirewallStatus .NONE ) {
328- b.aadAppSettingsBypassDnsFirewall.performLongClick()
329- showBypassToolTip = false
330- return @setOnClickListener
331- }
326+ guardAppInfoInitialized(" aadAppSettingsBypassDnsFirewall" ) {
327+ // show the tooltip only once when app is not bypassed (dns + firewall) earlier
328+ if (showBypassToolTip && appStatus == FirewallManager .FirewallStatus .NONE ) {
329+ b.aadAppSettingsBypassDnsFirewall.performLongClick()
330+ showBypassToolTip = false
331+ return @setOnClickListener
332+ }
332333
333- if (appStatus == FirewallManager .FirewallStatus .BYPASS_DNS_FIREWALL ) {
334- updateFirewallStatus(
335- FirewallManager .FirewallStatus .NONE ,
336- FirewallManager .ConnectionStatus .ALLOW
337- )
338- } else {
339- updateFirewallStatus(
340- FirewallManager .FirewallStatus .BYPASS_DNS_FIREWALL ,
341- FirewallManager .ConnectionStatus .ALLOW
342- )
334+ if (appStatus == FirewallManager .FirewallStatus .BYPASS_DNS_FIREWALL ) {
335+ updateFirewallStatus(
336+ FirewallManager .FirewallStatus .NONE ,
337+ FirewallManager .ConnectionStatus .ALLOW
338+ )
339+ } else {
340+ updateFirewallStatus(
341+ FirewallManager .FirewallStatus .BYPASS_DNS_FIREWALL ,
342+ FirewallManager .ConnectionStatus .ALLOW
343+ )
344+ }
343345 }
344346 }
345347
346348 b.aadAppSettingsBlockWifi.setOnClickListener {
347- toggleWifi(appInfo)
348- updateFirewallStatusUi(appStatus, connStatus)
349+ guardAppInfoInitialized(" aadAppSettingsBlockWifi" ) {
350+ toggleWifi(appInfo)
351+ updateFirewallStatusUi(appStatus, connStatus)
352+ }
349353 }
350354
351355 b.aadAppSettingsBlockMd.setOnClickListener {
352- toggleMobileData(appInfo)
353- updateFirewallStatusUi(appStatus, connStatus)
356+ guardAppInfoInitialized(" aadAppSettingsBlockMd" ) {
357+ toggleMobileData(appInfo)
358+ updateFirewallStatusUi(appStatus, connStatus)
359+ }
354360 }
355361
356362 b.aadAppSettingsBypassUniv.setOnClickListener {
357- // change the status to allowed if already app is bypassed
358- if (appStatus == FirewallManager .FirewallStatus .BYPASS_UNIVERSAL ) {
359- updateFirewallStatus(
360- FirewallManager .FirewallStatus .NONE ,
361- FirewallManager .ConnectionStatus .ALLOW
362- )
363- } else {
364- updateFirewallStatus(
365- FirewallManager .FirewallStatus .BYPASS_UNIVERSAL ,
366- FirewallManager .ConnectionStatus .ALLOW
367- )
363+ guardAppInfoInitialized(" aadAppSettingsBypassUniv" ) {
364+ // change the status to allowed if already app is bypassed
365+ if (appStatus == FirewallManager .FirewallStatus .BYPASS_UNIVERSAL ) {
366+ updateFirewallStatus(
367+ FirewallManager .FirewallStatus .NONE ,
368+ FirewallManager .ConnectionStatus .ALLOW
369+ )
370+ } else {
371+ updateFirewallStatus(
372+ FirewallManager .FirewallStatus .BYPASS_UNIVERSAL ,
373+ FirewallManager .ConnectionStatus .ALLOW
374+ )
375+ }
368376 }
369377 }
370378
371379 b.aadAppSettingsExclude.setOnClickListener {
372- if (VpnController .isVpnLockdown()) {
373- showToastUiCentered(this , getString(R .string.hsf_exclude_error), Toast .LENGTH_SHORT )
374- return @setOnClickListener
375- }
380+ guardAppInfoInitialized(" aadAppSettingsExclude" ) {
381+ if (VpnController .isVpnLockdown()) {
382+ showToastUiCentered(this , getString(R .string.hsf_exclude_error), Toast .LENGTH_SHORT )
383+ return @setOnClickListener
384+ }
376385
377- io {
378- if (FirewallManager .isUnknownPackage(uid) && appStatus == FirewallManager .FirewallStatus .EXCLUDE ) {
379- uiCtx {
380- showToastUiCentered(
381- this ,
382- getString(R .string.exclude_no_package_err_toast),
383- Toast .LENGTH_LONG
386+ io {
387+ if (FirewallManager .isUnknownPackage(uid) && appStatus == FirewallManager .FirewallStatus .EXCLUDE ) {
388+ uiCtx {
389+ showToastUiCentered(
390+ this ,
391+ getString(R .string.exclude_no_package_err_toast),
392+ Toast .LENGTH_LONG
393+ )
394+ }
395+ return @io
396+ }
397+
398+ // change the status to allowed if already app is excluded
399+ if (appStatus == FirewallManager .FirewallStatus .EXCLUDE ) {
400+ updateFirewallStatus(
401+ FirewallManager .FirewallStatus .NONE ,
402+ FirewallManager .ConnectionStatus .ALLOW
403+ )
404+ } else {
405+ updateFirewallStatus(
406+ FirewallManager .FirewallStatus .EXCLUDE ,
407+ FirewallManager .ConnectionStatus .ALLOW
384408 )
385409 }
386- return @io
387410 }
411+ }
412+ }
388413
389- // change the status to allowed if already app is excluded
390- if (appStatus == FirewallManager .FirewallStatus .EXCLUDE ) {
414+ b.aadAppSettingsIsolate.setOnClickListener {
415+ guardAppInfoInitialized(" aadAppSettingsIsolate" ) {
416+ // change the status to allowed if already app is isolated
417+ if (appStatus == FirewallManager .FirewallStatus .ISOLATE ) {
391418 updateFirewallStatus(
392419 FirewallManager .FirewallStatus .NONE ,
393420 FirewallManager .ConnectionStatus .ALLOW
394421 )
395422 } else {
396423 updateFirewallStatus(
397- FirewallManager .FirewallStatus .EXCLUDE ,
424+ FirewallManager .FirewallStatus .ISOLATE ,
398425 FirewallManager .ConnectionStatus .ALLOW
399426 )
400427 }
401428 }
402429 }
403430
404- b.aadAppSettingsIsolate.setOnClickListener {
405- // change the status to allowed if already app is isolated
406- if (appStatus == FirewallManager .FirewallStatus .ISOLATE ) {
407- updateFirewallStatus(
408- FirewallManager .FirewallStatus .NONE ,
409- FirewallManager .ConnectionStatus .ALLOW
410- )
411- } else {
412- updateFirewallStatus(
413- FirewallManager .FirewallStatus .ISOLATE ,
414- FirewallManager .ConnectionStatus .ALLOW
415- )
416- }
417- }
418-
419431 b.aadIpBlockCard.setOnClickListener { openCustomIpScreen() }
420432
421433 b.aadDomainBlockCard.setOnClickListener { openCustomDomainScreen() }
@@ -912,6 +924,19 @@ class AppInfoActivity : AppCompatActivity(R.layout.activity_app_details) {
912924 Configuration .UI_MODE_NIGHT_YES
913925 }
914926
927+ private inline fun guardAppInfoInitialized (listenerName : String , block : () -> Unit ) {
928+ if (! ::appInfo.isInitialized) {
929+ Logger .w(LOG_TAG_UI , " AppInfo not initialized yet in $listenerName click listener, using uid: $uid " )
930+ showToastUiCentered(
931+ this ,
932+ this .getString(R .string.ctbs_app_info_not_available_toast),
933+ Toast .LENGTH_SHORT
934+ )
935+ return
936+ }
937+ block()
938+ }
939+
915940 private fun io (f : suspend () -> Unit ): Job {
916941 return lifecycleScope.launch(Dispatchers .IO ) { f() }
917942 }
0 commit comments