Skip to content

Commit 405cd7f

Browse files
committed
Ensure default subscription on removals
Add removeSubscriptionWithDefault in SettingsManager to remove a subscription and recreate a default subscription if none remain. Modify MmkvManager.decodeAllServerList to include servers from DEFAULT_SUBSCRIPTION_ID when it's not listed, and remove the defensive check in MmkvManager.removeSubscription so removals are delegated to SettingsManager. Update callers (SubEditActivity, SubscriptionsViewModel) to use SettingsManager.removeSubscriptionWithDefault, remove UI restrictions hiding the delete action for the default subscription, and simplify group-display logic in MainViewModel. These changes ensure a default subscription always exists and server lists include default servers when appropriate.
1 parent 8500967 commit 405cd7f

File tree

6 files changed

+42
-19
lines changed

6 files changed

+42
-19
lines changed

V2rayNG/app/src/main/java/com/v2ray/ang/handler/MmkvManager.kt

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -114,9 +114,15 @@ object MmkvManager {
114114
*/
115115
fun decodeAllServerList(): MutableList<String> {
116116
val allServers = mutableListOf<String>()
117+
val subsList = decodeSubsList()
118+
119+
// If DEFAULT_SUBSCRIPTION_ID is not in the subscriptions list, add its servers
120+
if (!subsList.contains(DEFAULT_SUBSCRIPTION_ID)) {
121+
allServers.addAll(decodeServerList(DEFAULT_SUBSCRIPTION_ID))
122+
}
117123

118-
// Add servers from all subscriptions (including default subscription)
119-
decodeSubsList().forEach { guid ->
124+
// Add servers from all subscriptions
125+
subsList.forEach { guid ->
120126
allServers.addAll(decodeServerList(guid))
121127
}
122128

@@ -381,11 +387,6 @@ object MmkvManager {
381387
* @param subid The subscription ID.
382388
*/
383389
fun removeSubscription(subid: String) {
384-
// Protect default subscription from being deleted
385-
if (subid == DEFAULT_SUBSCRIPTION_ID) {
386-
return
387-
}
388-
389390
subStorage.remove(subid)
390391
val subsList = decodeSubsList()
391392
subsList.remove(subid)

V2rayNG/app/src/main/java/com/v2ray/ang/handler/SettingsManager.kt

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import com.v2ray.ang.handler.MmkvManager.decodeServerConfig
2525
import com.v2ray.ang.handler.MmkvManager.decodeSubsList
2626
import com.v2ray.ang.handler.MmkvManager.decodeSubscription
2727
import com.v2ray.ang.handler.MmkvManager.encodeSubscription
28+
import com.v2ray.ang.handler.MmkvManager.removeSubscription
2829
import com.v2ray.ang.util.JsonUtil
2930
import com.v2ray.ang.util.Utils
3031
import java.io.File
@@ -36,7 +37,7 @@ object SettingsManager {
3637

3738
fun initApp(context: Context) {
3839
ensureDefaultSettings()
39-
ensureDefaultSubscription()
40+
//ensureDefaultSubscription()
4041
initRoutingRulesets(context)
4142
migrateServerListToSubscriptions()
4243
migrateHysteria2PinSHA256()
@@ -240,6 +241,33 @@ object SettingsManager {
240241
.firstOrNull { it.remarks == remarks }
241242
}
242243

244+
/**
245+
* Removes the subscription.
246+
* If there are no remaining subscriptions,
247+
* it creates a new default subscription to ensure that ungroup
248+
**/
249+
fun removeSubscriptionWithDefault(subid: String) {
250+
// val subsList = decodeSubsList()
251+
// if (subsList.size == 1 && subsList.first() == DEFAULT_SUBSCRIPTION_ID) {
252+
// Log.i(ANG_PACKAGE,"Attempted to remove the only existing default subscription, operation ignored.")
253+
// return
254+
// }
255+
256+
// Remove the subscription
257+
removeSubscription(subid)
258+
259+
// After removal, check if there are any subscriptions left. If not, create a default subscription.
260+
val subsList2 = decodeSubsList()
261+
if (subsList2.isNotEmpty()) {
262+
return
263+
}
264+
265+
val defaultSub = SubscriptionItem(
266+
remarks = "Default",
267+
)
268+
encodeSubscription(DEFAULT_SUBSCRIPTION_ID, defaultSub)
269+
}
270+
243271
/**
244272
* Get the SOCKS port.
245273
* @return The SOCKS port.

V2rayNG/app/src/main/java/com/v2ray/ang/ui/SubEditActivity.kt

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import com.v2ray.ang.extension.toast
1414
import com.v2ray.ang.extension.toastSuccess
1515
import com.v2ray.ang.handler.MmkvManager
1616
import com.v2ray.ang.handler.SettingsChangeManager
17+
import com.v2ray.ang.handler.SettingsManager
1718
import com.v2ray.ang.util.Utils
1819
import kotlinx.coroutines.Dispatchers
1920
import kotlinx.coroutines.launch
@@ -118,7 +119,7 @@ class SubEditActivity : BaseActivity() {
118119
AlertDialog.Builder(this).setMessage(R.string.del_config_comfirm)
119120
.setPositiveButton(android.R.string.ok) { _, _ ->
120121
lifecycleScope.launch(Dispatchers.IO) {
121-
MmkvManager.removeSubscription(editSubId)
122+
SettingsManager.removeSubscriptionWithDefault(editSubId)
122123
launch(Dispatchers.Main) {
123124
finish()
124125
}
@@ -130,7 +131,7 @@ class SubEditActivity : BaseActivity() {
130131
.show()
131132
} else {
132133
lifecycleScope.launch(Dispatchers.IO) {
133-
MmkvManager.removeSubscription(editSubId)
134+
SettingsManager.removeSubscriptionWithDefault(editSubId)
134135
launch(Dispatchers.Main) {
135136
finish()
136137
}
@@ -145,10 +146,6 @@ class SubEditActivity : BaseActivity() {
145146
del_config = menu.findItem(R.id.del_config)
146147
save_config = menu.findItem(R.id.save_config)
147148

148-
if (editSubId.isEmpty() || editSubId == AppConfig.DEFAULT_SUBSCRIPTION_ID) {
149-
del_config?.isVisible = false
150-
}
151-
152149
return super.onCreateOptionsMenu(menu)
153150
}
154151

V2rayNG/app/src/main/java/com/v2ray/ang/ui/SubSettingRecyclerAdapter.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ class SubSettingRecyclerAdapter(
3939
holder.itemSubSettingBinding.layoutRemove.setOnClickListener {
4040
adapterListener?.onRemove(subId, position)
4141
}
42-
holder.itemSubSettingBinding.layoutRemove.isVisible = subId != AppConfig.DEFAULT_SUBSCRIPTION_ID
4342

4443
holder.itemSubSettingBinding.chkEnable.setOnCheckedChangeListener { it, isChecked ->
4544
if (!it.isPressed) return@setOnCheckedChangeListener

V2rayNG/app/src/main/java/com/v2ray/ang/viewmodel/MainViewModel.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -252,9 +252,7 @@ class MainViewModel(application: Application) : AndroidViewModel(application) {
252252
}
253253

254254
val groups = mutableListOf<GroupMapItem>()
255-
if (subscriptions.size > 1
256-
&& MmkvManager.decodeSettingsBool(AppConfig.PREF_GROUP_ALL_DISPLAY)
257-
) {
255+
if (MmkvManager.decodeSettingsBool(AppConfig.PREF_GROUP_ALL_DISPLAY)) {
258256
groups.add(
259257
GroupMapItem(
260258
id = "",

V2rayNG/app/src/main/java/com/v2ray/ang/viewmodel/SubscriptionsViewModel.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ class SubscriptionsViewModel : ViewModel() {
2121
fun remove(subId: String): Boolean {
2222
val changed = subscriptions.removeAll { it.guid == subId }
2323
if (changed) {
24-
MmkvManager.removeSubscription(subId)
24+
SettingsManager.removeSubscriptionWithDefault(subId)
2525
SettingsChangeManager.makeSetupGroupTab()
2626
}
2727
return changed

0 commit comments

Comments
 (0)