From 71f94db9292d8b0efec1964453f09bfdfd76b8ca Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Sat, 13 Jun 2026 15:20:06 +0800 Subject: [PATCH] Refresh group tab titles on server changes https://github.com/2dust/v2rayNG/issues/5765 --- .../com/v2ray/ang/ui/GroupServerFragment.kt | 1 + .../java/com/v2ray/ang/ui/MainActivity.kt | 58 +++++++++++++++---- 2 files changed, 47 insertions(+), 12 deletions(-) diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/GroupServerFragment.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/GroupServerFragment.kt index 6060859c..5a3c9ea4 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/GroupServerFragment.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/GroupServerFragment.kt @@ -226,6 +226,7 @@ class GroupServerFragment : BaseFragment(), private fun removeServerSub(guid: String, position: Int) { mainViewModel.removeServer(guid) adapter.removeServerSub(guid, position) + ownerActivity.refreshGroupTabTitles() } /** diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/MainActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/MainActivity.kt index 847d00c8..bfe67bb3 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/MainActivity.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/MainActivity.kt @@ -76,12 +76,33 @@ class MainActivity : HelperBaseActivity(), NavigationView.OnNavigationItemSelect binding.viewPager.isUserInputEnabled = true // setup navigation drawer + setupNavigationDrawer() + + binding.fab.setOnClickListener { handleFabAction() } + binding.layoutTest.setOnClickListener { handleLayoutTestClick() } + + setupGroupTab() + setupViewModel() + SubscriptionUpdater.sync() + mainViewModel.reloadServerList() + refreshGroupTabTitles(true) + + checkAndRequestPermission(PermissionType.POST_NOTIFICATIONS) { + } + } + + private fun setupNavigationDrawer() { val toggle = ActionBarDrawerToggle( - this, binding.drawerLayout, binding.toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close + this, + binding.drawerLayout, + binding.toolbar, + R.string.navigation_drawer_open, + R.string.navigation_drawer_close ) binding.drawerLayout.addDrawerListener(toggle) toggle.syncState() binding.navView.setNavigationItemSelectedListener(this) + onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) { override fun handleOnBackPressed() { if (binding.drawerLayout.isDrawerOpen(GravityCompat.START)) { @@ -93,17 +114,6 @@ class MainActivity : HelperBaseActivity(), NavigationView.OnNavigationItemSelect } } }) - - binding.fab.setOnClickListener { handleFabAction() } - binding.layoutTest.setOnClickListener { handleLayoutTestClick() } - - setupGroupTab() - setupViewModel() - SubscriptionUpdater.sync() - mainViewModel.reloadServerList() - - checkAndRequestPermission(PermissionType.POST_NOTIFICATIONS) { - } } private fun setupViewModel() { @@ -133,6 +143,25 @@ class MainActivity : HelperBaseActivity(), NavigationView.OnNavigationItemSelect binding.tabGroup.isVisible = groups.size > 1 } + fun refreshGroupTabTitles(refreshAll: Boolean = false) { + val groupsToRefresh = if (refreshAll || mainViewModel.subscriptionId.isEmpty()) { + groupPagerAdapter.groups + } else { + groupPagerAdapter.groups.filter { it.id == mainViewModel.subscriptionId } + } + + groupsToRefresh.forEach { group -> + if (group.id.isEmpty()) { + return@forEach + } + val tabIndex = groupPagerAdapter.groups.indexOfFirst { it.id == group.id } + if (tabIndex >= 0) { + val count = MmkvManager.decodeServerList(group.id).size + binding.tabGroup.getTabAt(tabIndex)?.text = "${group.remarks} ($count)" + } + } + } + private fun handleFabAction() { applyRunningState(isLoading = true, isRunning = false) @@ -416,6 +445,7 @@ class MainActivity : HelperBaseActivity(), NavigationView.OnNavigationItemSelect count > 0 -> { toast(getString(R.string.title_import_config_count, count)) mainViewModel.reloadServerList() + refreshGroupTabTitles() } countSub > 0 -> setupGroupTab() @@ -471,6 +501,7 @@ class MainActivity : HelperBaseActivity(), NavigationView.OnNavigationItemSelect } if (result.configCount > 0) { mainViewModel.reloadServerList() + refreshGroupTabTitles() } hideLoading() } @@ -500,6 +531,7 @@ class MainActivity : HelperBaseActivity(), NavigationView.OnNavigationItemSelect val ret = mainViewModel.removeAllServer() launch(Dispatchers.Main) { mainViewModel.reloadServerList() + refreshGroupTabTitles() toast(getString(R.string.title_del_config_count, ret)) hideLoading() } @@ -519,6 +551,7 @@ class MainActivity : HelperBaseActivity(), NavigationView.OnNavigationItemSelect val ret = mainViewModel.removeDuplicateServer() launch(Dispatchers.Main) { mainViewModel.reloadServerList() + refreshGroupTabTitles() toast(getString(R.string.title_del_duplicate_config_count, ret)) hideLoading() } @@ -538,6 +571,7 @@ class MainActivity : HelperBaseActivity(), NavigationView.OnNavigationItemSelect val ret = mainViewModel.removeInvalidServer() launch(Dispatchers.Main) { mainViewModel.reloadServerList() + refreshGroupTabTitles() toast(getString(R.string.title_del_config_count, ret)) hideLoading() }