Skip to content

Commit 6880f2d

Browse files
committed
feat: reuse empty default group for subscription imports
1 parent 1fbf150 commit 6880f2d

1 file changed

Lines changed: 28 additions & 7 deletions

File tree

app/src/main/kotlin/features/subscription/SubscriptionInstallConfigUseCase.kt

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ internal class SubscriptionInstallConfigUseCase(
2727
private val subscriptionFetcher: AndroidSubscriptionFetcher,
2828
) {
2929
suspend fun install(config: SubscriptionInstallConfig): ProxyServerListSubscriptionUpdateResult {
30-
val group = stateStore.addSubscriptionGroup(config)
30+
val group = stateStore.prepareSubscriptionInstallGroup(config)
3131
val result = updateSubscriptions(
3232
groups = listOf(group),
3333
subscriptionFetcher = subscriptionFetcher,
@@ -101,19 +101,40 @@ private fun Url.toRawHttpsSubscriptionInstallConfigOrNull(rawValue: String): Sub
101101
)
102102
}
103103

104-
private fun AndroidAppStateStore.addSubscriptionGroup(config: SubscriptionInstallConfig): SubscriptionGroupState {
104+
private fun AndroidAppStateStore.prepareSubscriptionInstallGroup(
105+
config: SubscriptionInstallConfig,
106+
): SubscriptionGroupState {
105107
var savedGroup: SubscriptionGroupState? = null
106108
update { state ->
107-
val group = state.newSubscriptionGroup(config)
109+
val reusableGroup = state.reusableDefaultSubscriptionGroup()
110+
val group = reusableGroup?.copy(
111+
url = config.url,
112+
userAgent = config.userAgent,
113+
) ?: state.newSubscriptionGroup(config)
108114
savedGroup = group
109-
state.copy(
110-
subscriptionGroups = state.subscriptionGroups + group,
111-
nextSubscriptionGroupId = state.nextSubscriptionGroupId + 1,
112-
)
115+
if (reusableGroup == null) {
116+
state.copy(
117+
subscriptionGroups = state.subscriptionGroups + group,
118+
nextSubscriptionGroupId = state.nextSubscriptionGroupId + 1,
119+
)
120+
} else {
121+
state.copy(
122+
subscriptionGroups = state.subscriptionGroups.map { existingGroup ->
123+
if (existingGroup.id == group.id) group else existingGroup
124+
},
125+
)
126+
}
113127
}
114128
return checkNotNull(savedGroup)
115129
}
116130

131+
private fun AppState.reusableDefaultSubscriptionGroup(): SubscriptionGroupState? {
132+
return subscriptionGroups.firstOrNull { group -> group.id == DefaultSubscriptionGroupId }
133+
?.takeIf {
134+
proxyServers.none { server -> server.groupId == DefaultSubscriptionGroupId }
135+
}
136+
}
137+
117138
private fun AppState.newSubscriptionGroup(config: SubscriptionInstallConfig): SubscriptionGroupState {
118139
return SubscriptionGroupState(
119140
id = nextSubscriptionGroupId,

0 commit comments

Comments
 (0)