From e4d8127e74757dfc94aad027b77088f75add2670 Mon Sep 17 00:00:00 2001 From: Juraj Hilje Date: Fri, 7 Jul 2023 15:17:13 +0200 Subject: [PATCH 01/29] feat(antitracker): create model/AntiTrackerDns.kt --- .../core/rest/data/model/AntiTrackerDns.kt | 84 +++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 core/src/main/java/net/ivpn/core/rest/data/model/AntiTrackerDns.kt diff --git a/core/src/main/java/net/ivpn/core/rest/data/model/AntiTrackerDns.kt b/core/src/main/java/net/ivpn/core/rest/data/model/AntiTrackerDns.kt new file mode 100644 index 000000000..3579fee43 --- /dev/null +++ b/core/src/main/java/net/ivpn/core/rest/data/model/AntiTrackerDns.kt @@ -0,0 +1,84 @@ +package net.ivpn.core.rest.data.model + +/* + IVPN Android app + https://github.com/ivpn/android-app + + Created by Juraj Hilje. + Copyright (c) 2023 Privatus Limited. + + This file is part of the IVPN Android app. + + The IVPN Android app is free software: you can redistribute it and/or + modify it under the terms of the GNU General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) any later version. + + The IVPN Android app is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + details. + + You should have received a copy of the GNU General Public License + along with the IVPN Android app. If not, see . +*/ + +import com.google.gson.Gson +import com.google.gson.annotations.Expose +import com.google.gson.annotations.SerializedName + +class AntiTrackerDns { + + @SerializedName("Name") + @Expose + var name: String = "" + + @SerializedName("Description") + @Expose + var description: String = "" + + @SerializedName("Normal") + @Expose + var normal: String = "" + + @SerializedName("Hardcore") + @Expose + var hardcore: String = "" + + override fun equals(other: Any?): Boolean { + if (other !is AntiTrackerDns) return false + return name == other.name && normal == other.normal + } + + fun toJson(): String { + return Gson().toJson(this) + } + + fun toThumbnail(): String { + return description + } + + companion object { + + fun from(json: String): AntiTrackerDns { + return Gson().fromJson(json, AntiTrackerDns::class.java) + } + + } + +} + +class DnsServers { + + @SerializedName("DnsServers") + @Expose + lateinit var list: List + +} + +class AntiTrackerPlus { + + @SerializedName("antitracker_plus") + @Expose + lateinit var dnsServers: DnsServers + +} From d0f216675e4306fc3ffcf7b168f4bfa3b5cfbd92 Mon Sep 17 00:00:00 2001 From: Juraj Hilje Date: Fri, 7 Jul 2023 15:47:16 +0200 Subject: [PATCH 02/29] feat(antitracker): update Settings.kt --- core/src/main/java/net/ivpn/core/common/Mapper.kt | 10 ++++++++++ .../core/common/prefs/EncryptedSettingsPreference.kt | 11 +++++++++++ .../main/java/net/ivpn/core/common/prefs/Settings.kt | 9 +++++++++ 3 files changed, 30 insertions(+) diff --git a/core/src/main/java/net/ivpn/core/common/Mapper.kt b/core/src/main/java/net/ivpn/core/common/Mapper.kt index 3e0c693ae..d9c6dfdfb 100644 --- a/core/src/main/java/net/ivpn/core/common/Mapper.kt +++ b/core/src/main/java/net/ivpn/core/common/Mapper.kt @@ -26,6 +26,7 @@ import com.google.gson.Gson import com.google.gson.JsonSyntaxException import com.google.gson.reflect.TypeToken import net.ivpn.core.rest.data.ServersListResponse +import net.ivpn.core.rest.data.model.AntiTrackerDns import net.ivpn.core.rest.data.model.Port import net.ivpn.core.rest.data.model.Server import net.ivpn.core.rest.data.wireguard.ErrorResponse @@ -71,6 +72,15 @@ object Mapper { return Gson().fromJson(json, type) } + fun antiTrackerListFrom(json: String?): List { + val type = object : TypeToken>() {}.type + return Gson().fromJson(json, type) + } + + fun stringFromAntiTrackerList(list: List?): String { + return Gson().toJson(list) + } + fun stringFromIps(ips: List?): String? { if (ips == null) return null return Gson().toJson(ips) diff --git a/core/src/main/java/net/ivpn/core/common/prefs/EncryptedSettingsPreference.kt b/core/src/main/java/net/ivpn/core/common/prefs/EncryptedSettingsPreference.kt index c66b4e5a0..1214383f6 100644 --- a/core/src/main/java/net/ivpn/core/common/prefs/EncryptedSettingsPreference.kt +++ b/core/src/main/java/net/ivpn/core/common/prefs/EncryptedSettingsPreference.kt @@ -75,6 +75,7 @@ class EncryptedSettingsPreference @Inject constructor(val preference: Preference private const val IP_LIST = "IP_LIST" private const val IPV6_LIST = "IPV6_LIST" private const val LAST_USED_IP = "LAST_USED_IP" + private const val ANTITRACKER_LIST = "ANTITRACKER_LIST" } private val sharedPreferences: SharedPreferences = preference.settingsPreference @@ -492,6 +493,16 @@ class EncryptedSettingsPreference @Inject constructor(val preference: Preference .apply() } + fun setAntiTrackerList(json: String?) { + sharedPreferences.edit() + .putString(ANTITRACKER_LIST, json) + .apply() + } + + fun getAntiTrackerList(): String? { + return sharedPreferences.getString(ANTITRACKER_LIST, "") + } + private fun putIsMigrated(isMigrated: Boolean) { sharedPreferences.edit() .putBoolean(IS_MIGRATED, isMigrated) diff --git a/core/src/main/java/net/ivpn/core/common/prefs/Settings.kt b/core/src/main/java/net/ivpn/core/common/prefs/Settings.kt index 7e50d400e..dbf04379d 100644 --- a/core/src/main/java/net/ivpn/core/common/prefs/Settings.kt +++ b/core/src/main/java/net/ivpn/core/common/prefs/Settings.kt @@ -29,6 +29,7 @@ import net.ivpn.core.common.BuildController import net.ivpn.core.common.Mapper import net.ivpn.core.common.dagger.ApplicationScope import net.ivpn.core.common.nightmode.NightMode +import net.ivpn.core.rest.data.model.AntiTrackerDns import net.ivpn.core.rest.data.model.Port import net.ivpn.core.v2.serverlist.dialog.Filters import net.ivpn.core.vpn.Protocol @@ -298,6 +299,14 @@ class Settings @Inject constructor( val wireGuardPresharedKey: String? get() = settingsPreference.getSettingsWgPresharedKey() + var antiTrackerList: List + get() { + return Mapper.antiTrackerListFrom(settingsPreference.getAntiTrackerList()) + } + set(list) { + settingsPreference.setAntiTrackerList(Mapper.stringFromAntiTrackerList(list)) + } + fun nextPort() { val protocol = stickyPreference.currentProtocol if (protocol == Protocol.OPENVPN) { From cf9c8571f1d2af4ab7e7b7f76a817b463f36c272 Mon Sep 17 00:00:00 2001 From: Juraj Hilje Date: Fri, 7 Jul 2023 16:04:21 +0200 Subject: [PATCH 03/29] feat(antitracker): update model/Config.java --- .../net/ivpn/core/common/prefs/ServersRepository.kt | 1 + .../net/ivpn/core/rest/data/model/AntiTrackerDns.kt | 10 +--------- .../java/net/ivpn/core/rest/data/model/Config.java | 11 +++++++++++ 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/core/src/main/java/net/ivpn/core/common/prefs/ServersRepository.kt b/core/src/main/java/net/ivpn/core/common/prefs/ServersRepository.kt index a86c9d2b7..2f98b6bab 100644 --- a/core/src/main/java/net/ivpn/core/common/prefs/ServersRepository.kt +++ b/core/src/main/java/net/ivpn/core/common/prefs/ServersRepository.kt @@ -186,6 +186,7 @@ class ServersRepository @Inject constructor( settings.openVpnPorts = response.config.ports.openvpn.filter { it.portNumber > 0 } settings.wireGuardPortRanges = response.config.ports.wireguard.filter { it.range != null } settings.openVpnPortRanges = response.config.ports.openvpn.filter { it.range != null } + settings.antiTrackerList = response.config.antiTrackerPlus.list for (listener in onServerListUpdatedListeners) { listener.onSuccess(getSuitableServers(response), isForced) } diff --git a/core/src/main/java/net/ivpn/core/rest/data/model/AntiTrackerDns.kt b/core/src/main/java/net/ivpn/core/rest/data/model/AntiTrackerDns.kt index 3579fee43..f6648f2df 100644 --- a/core/src/main/java/net/ivpn/core/rest/data/model/AntiTrackerDns.kt +++ b/core/src/main/java/net/ivpn/core/rest/data/model/AntiTrackerDns.kt @@ -67,18 +67,10 @@ class AntiTrackerDns { } -class DnsServers { +class AntiTrackerPlus { @SerializedName("DnsServers") @Expose lateinit var list: List } - -class AntiTrackerPlus { - - @SerializedName("antitracker_plus") - @Expose - lateinit var dnsServers: DnsServers - -} diff --git a/core/src/main/java/net/ivpn/core/rest/data/model/Config.java b/core/src/main/java/net/ivpn/core/rest/data/model/Config.java index 95611e07d..0651e8673 100644 --- a/core/src/main/java/net/ivpn/core/rest/data/model/Config.java +++ b/core/src/main/java/net/ivpn/core/rest/data/model/Config.java @@ -30,6 +30,9 @@ public class Config { @SerializedName("antitracker") @Expose private AntiTracker antitracker; + @SerializedName("antitracker_plus") + @Expose + private AntiTrackerPlus antitrackerPlus; @SerializedName("api") @Expose private Api api; @@ -45,6 +48,14 @@ public void setAntiTracker(AntiTracker antitracker) { this.antitracker = antitracker; } + public AntiTrackerPlus getAntiTrackerPlus() { + return antitrackerPlus; + } + + public void setAntiTrackerPlus(AntiTrackerPlus antitrackerPlus) { + this.antitrackerPlus = antitrackerPlus; + } + public Api getApi() { return api; } From d564e913e0ec9b11728d9424e0d9cf001335c8a3 Mon Sep 17 00:00:00 2001 From: Juraj Hilje Date: Sat, 8 Jul 2023 09:57:58 +0200 Subject: [PATCH 04/29] feat(antitracker): add antiTrackerDns in Settings.kt --- core/src/main/java/net/ivpn/core/common/Mapper.kt | 9 +++++++++ .../core/common/prefs/EncryptedSettingsPreference.kt | 11 +++++++++++ .../net/ivpn/core/common/prefs/ServersRepository.kt | 3 +++ .../main/java/net/ivpn/core/common/prefs/Settings.kt | 9 +++++++++ 4 files changed, 32 insertions(+) diff --git a/core/src/main/java/net/ivpn/core/common/Mapper.kt b/core/src/main/java/net/ivpn/core/common/Mapper.kt index d9c6dfdfb..391fd78ca 100644 --- a/core/src/main/java/net/ivpn/core/common/Mapper.kt +++ b/core/src/main/java/net/ivpn/core/common/Mapper.kt @@ -81,6 +81,15 @@ object Mapper { return Gson().toJson(list) } + fun antiTrackerDnsFrom(json: String?): AntiTrackerDns { + val type = object : TypeToken() {}.type + return Gson().fromJson(json, type) + } + + fun stringFromAntiTrackerDns(dns: AntiTrackerDns?): String { + return Gson().toJson(dns) + } + fun stringFromIps(ips: List?): String? { if (ips == null) return null return Gson().toJson(ips) diff --git a/core/src/main/java/net/ivpn/core/common/prefs/EncryptedSettingsPreference.kt b/core/src/main/java/net/ivpn/core/common/prefs/EncryptedSettingsPreference.kt index 1214383f6..1fb5454c8 100644 --- a/core/src/main/java/net/ivpn/core/common/prefs/EncryptedSettingsPreference.kt +++ b/core/src/main/java/net/ivpn/core/common/prefs/EncryptedSettingsPreference.kt @@ -76,6 +76,7 @@ class EncryptedSettingsPreference @Inject constructor(val preference: Preference private const val IPV6_LIST = "IPV6_LIST" private const val LAST_USED_IP = "LAST_USED_IP" private const val ANTITRACKER_LIST = "ANTITRACKER_LIST" + private const val ANTITRACKER_DNS = "ANTITRACKER_DNS" } private val sharedPreferences: SharedPreferences = preference.settingsPreference @@ -503,6 +504,16 @@ class EncryptedSettingsPreference @Inject constructor(val preference: Preference return sharedPreferences.getString(ANTITRACKER_LIST, "") } + fun setAntiTrackerDns(json: String?) { + sharedPreferences.edit() + .putString(ANTITRACKER_DNS, json) + .apply() + } + + fun getAntiTrackerDns(): String? { + return sharedPreferences.getString(ANTITRACKER_DNS, "") + } + private fun putIsMigrated(isMigrated: Boolean) { sharedPreferences.edit() .putBoolean(IS_MIGRATED, isMigrated) diff --git a/core/src/main/java/net/ivpn/core/common/prefs/ServersRepository.kt b/core/src/main/java/net/ivpn/core/common/prefs/ServersRepository.kt index 2f98b6bab..5e7fbbede 100644 --- a/core/src/main/java/net/ivpn/core/common/prefs/ServersRepository.kt +++ b/core/src/main/java/net/ivpn/core/common/prefs/ServersRepository.kt @@ -187,6 +187,9 @@ class ServersRepository @Inject constructor( settings.wireGuardPortRanges = response.config.ports.wireguard.filter { it.range != null } settings.openVpnPortRanges = response.config.ports.openvpn.filter { it.range != null } settings.antiTrackerList = response.config.antiTrackerPlus.list + if (settings.antiTrackerDns == null) { + settings.antiTrackerDns = settings.antiTrackerList.first() + } for (listener in onServerListUpdatedListeners) { listener.onSuccess(getSuitableServers(response), isForced) } diff --git a/core/src/main/java/net/ivpn/core/common/prefs/Settings.kt b/core/src/main/java/net/ivpn/core/common/prefs/Settings.kt index dbf04379d..dd74d3ec4 100644 --- a/core/src/main/java/net/ivpn/core/common/prefs/Settings.kt +++ b/core/src/main/java/net/ivpn/core/common/prefs/Settings.kt @@ -307,6 +307,15 @@ class Settings @Inject constructor( settingsPreference.setAntiTrackerList(Mapper.stringFromAntiTrackerList(list)) } + var antiTrackerDns: AntiTrackerDns? + get() { + val json = settingsPreference.getAntiTrackerDns() + return if (json!!.isEmpty()) null else Mapper.antiTrackerDnsFrom(json) + } + set(dns) { + settingsPreference.setAntiTrackerDns(Mapper.stringFromAntiTrackerDns(dns)) + } + fun nextPort() { val protocol = stickyPreference.currentProtocol if (protocol == Protocol.OPENVPN) { From 5a21a1c947685ebbcd50312d4c8fdbe7b47ea6a8 Mon Sep 17 00:00:00 2001 From: Juraj Hilje Date: Sun, 9 Jul 2023 16:37:49 +0200 Subject: [PATCH 05/29] feat(antitracker): create AntiTrackerListFragment.kt --- .../core/common/dagger/ActivityComponent.java | 3 + .../v2/antitracker/AntiTrackerListFragment.kt | 77 +++++++++++++++++++ .../res/layout/fragment_anti_tracker_list.xml | 32 ++++++++ 3 files changed, 112 insertions(+) create mode 100644 core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerListFragment.kt create mode 100644 core/src/main/res/layout/fragment_anti_tracker_list.xml diff --git a/core/src/main/java/net/ivpn/core/common/dagger/ActivityComponent.java b/core/src/main/java/net/ivpn/core/common/dagger/ActivityComponent.java index 4dcf1c7c0..1d6764a0d 100644 --- a/core/src/main/java/net/ivpn/core/common/dagger/ActivityComponent.java +++ b/core/src/main/java/net/ivpn/core/common/dagger/ActivityComponent.java @@ -30,6 +30,7 @@ import net.ivpn.core.v2.account.LogOutFragment; import net.ivpn.core.v2.alwaysonvpn.AlwaysOnVPNFragment; import net.ivpn.core.v2.antitracker.AntiTrackerFragment; +import net.ivpn.core.v2.antitracker.AntiTrackerListFragment; import net.ivpn.core.v2.captcha.CaptchaFragment; import net.ivpn.core.v2.connect.ConnectFragment; import net.ivpn.core.v2.customdns.CustomDNSFragment; @@ -141,6 +142,8 @@ interface Factory { void inject(AntiTrackerFragment fragment); + void inject(AntiTrackerListFragment fragment); + void inject(SavedNetworksFragment fragment); void inject(ScannedNetworksFragment fragment); diff --git a/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerListFragment.kt b/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerListFragment.kt new file mode 100644 index 000000000..5e01f96ab --- /dev/null +++ b/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerListFragment.kt @@ -0,0 +1,77 @@ +package net.ivpn.core.v2.antitracker + +/* + IVPN Android app + https://github.com/ivpn/android-app + + Created by Juraj Hilje. + Copyright (c) 2023 Privatus Limited. + + This file is part of the IVPN Android app. + + The IVPN Android app is free software: you can redistribute it and/or + modify it under the terms of the GNU General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) any later version. + + The IVPN Android app is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + details. + + You should have received a copy of the GNU General Public License + along with the IVPN Android app. If not, see . +*/ + +import android.os.Bundle +import androidx.fragment.app.Fragment +import androidx.databinding.DataBindingUtil +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.compose.ui.platform.ComposeView +import androidx.navigation.fragment.findNavController +import androidx.navigation.ui.AppBarConfiguration +import androidx.navigation.ui.setupWithNavController +import net.ivpn.core.IVPNApplication +import net.ivpn.core.R +import net.ivpn.core.common.dagger.ApplicationScope +import net.ivpn.core.databinding.FragmentAntiTrackerListBinding +import net.ivpn.core.ui.theme.AppTheme + +@ApplicationScope +class AntiTrackerListFragment : Fragment() { + + lateinit var binding: FragmentAntiTrackerListBinding + + override fun onCreate(savedInstanceState: Bundle?) { + IVPNApplication.appComponent.provideActivityComponent().create().inject(this) + super.onCreate(savedInstanceState) + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_anti_tracker_list, container, false) + return binding.root.apply { + findViewById(R.id.view_ports).setContent { + AppTheme { + + } + } + } + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + initToolbar() + } + + private fun initToolbar() { + val navController = findNavController() + val appBarConfiguration = AppBarConfiguration(navController.graph) + binding.toolbar.setupWithNavController(navController, appBarConfiguration) + } + +} \ No newline at end of file diff --git a/core/src/main/res/layout/fragment_anti_tracker_list.xml b/core/src/main/res/layout/fragment_anti_tracker_list.xml new file mode 100644 index 000000000..5f03c8839 --- /dev/null +++ b/core/src/main/res/layout/fragment_anti_tracker_list.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + \ No newline at end of file From fccd767539fd0a7bc76bafd5749673aa8ddc22b0 Mon Sep 17 00:00:00 2001 From: Juraj Hilje Date: Sun, 9 Jul 2023 16:44:45 +0200 Subject: [PATCH 06/29] feat(antitracker): create AntiTrackerListScreen.kt, AntiTrackerListViewModel.kt --- .../v2/antitracker/AntiTrackerListFragment.kt | 6 ++- .../v2/antitracker/AntiTrackerListScreen.kt | 11 +++++ .../antitracker/AntiTrackerListViewModel.kt | 48 +++++++++++++++++++ 3 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerListScreen.kt create mode 100644 core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerListViewModel.kt diff --git a/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerListFragment.kt b/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerListFragment.kt index 5e01f96ab..6dd18940b 100644 --- a/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerListFragment.kt +++ b/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerListFragment.kt @@ -37,10 +37,14 @@ import net.ivpn.core.R import net.ivpn.core.common.dagger.ApplicationScope import net.ivpn.core.databinding.FragmentAntiTrackerListBinding import net.ivpn.core.ui.theme.AppTheme +import javax.inject.Inject @ApplicationScope class AntiTrackerListFragment : Fragment() { + @Inject + lateinit var viewModel: AntiTrackerListViewModel + lateinit var binding: FragmentAntiTrackerListBinding override fun onCreate(savedInstanceState: Bundle?) { @@ -57,7 +61,7 @@ class AntiTrackerListFragment : Fragment() { return binding.root.apply { findViewById(R.id.view_ports).setContent { AppTheme { - + AntiTrackerListScreen(viewModel) } } } diff --git a/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerListScreen.kt b/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerListScreen.kt new file mode 100644 index 000000000..9584ebac9 --- /dev/null +++ b/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerListScreen.kt @@ -0,0 +1,11 @@ +package net.ivpn.core.v2.antitracker + +import androidx.compose.material.Surface +import androidx.compose.runtime.Composable + +@Composable +fun AntiTrackerListScreen(viewModel: AntiTrackerListViewModel) { + Surface { + + } +} \ No newline at end of file diff --git a/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerListViewModel.kt b/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerListViewModel.kt new file mode 100644 index 000000000..36382e1c3 --- /dev/null +++ b/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerListViewModel.kt @@ -0,0 +1,48 @@ +package net.ivpn.core.v2.antitracker + +/* + IVPN Android app + https://github.com/ivpn/android-app + + Created by Juraj Hilje. + Copyright (c) 2023 Privatus Limited. + + This file is part of the IVPN Android app. + + The IVPN Android app is free software: you can redistribute it and/or + modify it under the terms of the GNU General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) any later version. + + The IVPN Android app is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + details. + + You should have received a copy of the GNU General Public License + along with the IVPN Android app. If not, see . +*/ + +import androidx.lifecycle.ViewModel +import net.ivpn.core.common.dagger.ApplicationScope +import net.ivpn.core.common.prefs.Settings +import net.ivpn.core.rest.data.model.AntiTrackerDns +import javax.inject.Inject + +@ApplicationScope +class AntiTrackerListViewModel @Inject constructor( + private val settings: Settings +) : ViewModel() { + + fun getAntiTrackerList(): List { + return settings.antiTrackerList + } + + fun getAntiTrackerDns(): AntiTrackerDns? { + return settings.antiTrackerDns + } + + fun setAntiTrackerDns(dns: AntiTrackerDns) { + settings.antiTrackerDns = dns + } + +} \ No newline at end of file From b12828aac4f8f0cbce2146550a45a8d518704dbf Mon Sep 17 00:00:00 2001 From: Juraj Hilje Date: Sun, 9 Jul 2023 16:55:09 +0200 Subject: [PATCH 07/29] feat(antitracker): update AntiTrackerListScreen.kt --- .../v2/antitracker/AntiTrackerListFragment.kt | 2 +- .../v2/antitracker/AntiTrackerListScreen.kt | 56 ++++++++++++++++++- 2 files changed, 54 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerListFragment.kt b/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerListFragment.kt index 6dd18940b..52be6a0ff 100644 --- a/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerListFragment.kt +++ b/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerListFragment.kt @@ -61,7 +61,7 @@ class AntiTrackerListFragment : Fragment() { return binding.root.apply { findViewById(R.id.view_ports).setContent { AppTheme { - AntiTrackerListScreen(viewModel) + AntiTrackerListScreen(findNavController(), viewModel) } } } diff --git a/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerListScreen.kt b/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerListScreen.kt index 9584ebac9..f05a99719 100644 --- a/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerListScreen.kt +++ b/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerListScreen.kt @@ -1,11 +1,61 @@ package net.ivpn.core.v2.antitracker +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material.Divider +import androidx.compose.material.Icon import androidx.compose.material.Surface +import androidx.compose.material.Text +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Check import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import androidx.navigation.NavController +import net.ivpn.core.rest.data.model.AntiTrackerDns +import net.ivpn.core.ui.theme.colorPrimary @Composable -fun AntiTrackerListScreen(viewModel: AntiTrackerListViewModel) { +fun AntiTrackerListScreen(navController: NavController?, viewModel: AntiTrackerListViewModel) { Surface { - + Column { + LazyColumn { + items(viewModel.getAntiTrackerList()) { + AntiTrackerListItem(it, navController, viewModel) + } + } + } } -} \ No newline at end of file +} + +@Composable +fun AntiTrackerListItem(dns: AntiTrackerDns, navController: NavController?, viewModel: AntiTrackerListViewModel) { + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier + .clickable { + viewModel.setAntiTrackerDns(dns) + navController?.popBackStack() + } + .padding(horizontal = 18.dp, vertical = 16.dp) + .fillMaxWidth() + ) { + Text(dns.toThumbnail()) + if (dns == viewModel.getAntiTrackerDns()) { + Spacer(Modifier.weight(1f)) + Icon( + imageVector = Icons.Filled.Check, + tint = colorPrimary, + contentDescription = "Selected" + ) + } + } + Divider() +} From e3f3a9de8e1050a41645213b7abcecf108fcc422 Mon Sep 17 00:00:00 2001 From: Juraj Hilje Date: Sun, 9 Jul 2023 17:22:23 +0200 Subject: [PATCH 08/29] refactor: update AntiTrackerListViewModel.kt --- .../core/v2/antitracker/AntiTrackerListScreen.kt | 15 +++++++++++++-- .../v2/antitracker/AntiTrackerListViewModel.kt | 15 +++++++++------ 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerListScreen.kt b/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerListScreen.kt index f05a99719..d98e598c0 100644 --- a/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerListScreen.kt +++ b/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerListScreen.kt @@ -27,7 +27,18 @@ fun AntiTrackerListScreen(navController: NavController?, viewModel: AntiTrackerL Surface { Column { LazyColumn { - items(viewModel.getAntiTrackerList()) { + item { + Text("Pre-defined lists") + Divider() + } + items(viewModel.antiTrackerBasicList) { + AntiTrackerListItem(it, navController, viewModel) + } + item { + Text("Individual lists") + Divider() + } + items(viewModel.antiTrackerIndividualList) { AntiTrackerListItem(it, navController, viewModel) } } @@ -48,7 +59,7 @@ fun AntiTrackerListItem(dns: AntiTrackerDns, navController: NavController?, view .fillMaxWidth() ) { Text(dns.toThumbnail()) - if (dns == viewModel.getAntiTrackerDns()) { + if (dns == viewModel.antiTrackerDns) { Spacer(Modifier.weight(1f)) Icon( imageVector = Icons.Filled.Check, diff --git a/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerListViewModel.kt b/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerListViewModel.kt index 36382e1c3..668f152a4 100644 --- a/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerListViewModel.kt +++ b/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerListViewModel.kt @@ -33,13 +33,16 @@ class AntiTrackerListViewModel @Inject constructor( private val settings: Settings ) : ViewModel() { - fun getAntiTrackerList(): List { - return settings.antiTrackerList - } + private val basicList = arrayOf("Basic", "Comprehensive", "Restrictive") - fun getAntiTrackerDns(): AntiTrackerDns? { - return settings.antiTrackerDns - } + val antiTrackerBasicList: List + get() = settings.antiTrackerList.filter { basicList.contains(it.name) } + + val antiTrackerIndividualList: List + get() = settings.antiTrackerList.filter { !basicList.contains(it.name) } + + val antiTrackerDns: AntiTrackerDns? + get() = settings.antiTrackerDns fun setAntiTrackerDns(dns: AntiTrackerDns) { settings.antiTrackerDns = dns From 8b1c4cf08d29f7532adb6155de10917e3aa81796 Mon Sep 17 00:00:00 2001 From: Juraj Hilje Date: Sun, 9 Jul 2023 18:13:43 +0200 Subject: [PATCH 09/29] feat(antitracker): update AntiTrackerFragment.kt --- .../v2/antitracker/AntiTrackerFragment.kt | 5 ++ .../v2/antitracker/AntiTrackerListFragment.kt | 2 +- .../res/layout/content_anti_surveillance.xml | 49 ++++++++++++++++++- core/src/main/res/navigation/nav_graph.xml | 8 ++- 4 files changed, 61 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerFragment.kt b/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerFragment.kt index 00e5e3d66..8350bacb9 100644 --- a/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerFragment.kt +++ b/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerFragment.kt @@ -35,6 +35,7 @@ import androidx.navigation.ui.AppBarConfiguration import androidx.navigation.ui.setupWithNavController import net.ivpn.core.IVPNApplication import net.ivpn.core.R +import net.ivpn.core.common.extension.navigate import net.ivpn.core.databinding.FragmentAntitrackerBinding import net.ivpn.core.v2.MainActivity import net.ivpn.core.v2.viewmodel.AntiTrackerViewModel @@ -80,6 +81,10 @@ class AntiTrackerFragment: Fragment() { binding.contentLayout.readMoreHardcore.setOnClickListener { readMoreHardcore() } + binding.contentLayout.changeAntiTracker.setOnClickListener { + val action = AntiTrackerFragmentDirections.actionAntiTrackerFragmentToAntiTrackerListFragment() + navigate(action) + } } private fun initToolbar() { diff --git a/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerListFragment.kt b/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerListFragment.kt index 52be6a0ff..0381dc8ef 100644 --- a/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerListFragment.kt +++ b/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerListFragment.kt @@ -59,7 +59,7 @@ class AntiTrackerListFragment : Fragment() { ): View { binding = DataBindingUtil.inflate(inflater, R.layout.fragment_anti_tracker_list, container, false) return binding.root.apply { - findViewById(R.id.view_ports).setContent { + findViewById(R.id.view_anti_tracker_list).setContent { AppTheme { AntiTrackerListScreen(findNavController(), viewModel) } diff --git a/core/src/main/res/layout/content_anti_surveillance.xml b/core/src/main/res/layout/content_anti_surveillance.xml index 2ac161904..f75ed3ffe 100644 --- a/core/src/main/res/layout/content_anti_surveillance.xml +++ b/core/src/main/res/layout/content_anti_surveillance.xml @@ -64,11 +64,58 @@ + + + + + + + + + + + + + + - + + Date: Mon, 10 Jul 2023 09:42:37 +0200 Subject: [PATCH 10/29] feat(antitracker): update AntiTrackerListScreen.kt --- .../v2/antitracker/AntiTrackerListScreen.kt | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerListScreen.kt b/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerListScreen.kt index d98e598c0..cf3015b53 100644 --- a/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerListScreen.kt +++ b/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerListScreen.kt @@ -17,7 +17,9 @@ import androidx.compose.material.icons.filled.Check import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp import androidx.navigation.NavController import net.ivpn.core.rest.data.model.AntiTrackerDns import net.ivpn.core.ui.theme.colorPrimary @@ -28,15 +30,13 @@ fun AntiTrackerListScreen(navController: NavController?, viewModel: AntiTrackerL Column { LazyColumn { item { - Text("Pre-defined lists") - Divider() + AntiTrackerListSection("Pre-defined lists") } items(viewModel.antiTrackerBasicList) { AntiTrackerListItem(it, navController, viewModel) } item { - Text("Individual lists") - Divider() + AntiTrackerListSection("Individual lists") } items(viewModel.antiTrackerIndividualList) { AntiTrackerListItem(it, navController, viewModel) @@ -46,6 +46,24 @@ fun AntiTrackerListScreen(navController: NavController?, viewModel: AntiTrackerL } } +@Composable +fun AntiTrackerListSection(title: String) { + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier + .padding(start = 18.dp, top = 32.dp, end = 18.dp, bottom = 16.dp) + .fillMaxWidth() + ) { + Text( + text = title, + color = colorPrimary, + fontWeight = FontWeight.Medium, + fontSize = 14.sp + ) + } + Divider() +} + @Composable fun AntiTrackerListItem(dns: AntiTrackerDns, navController: NavController?, viewModel: AntiTrackerListViewModel) { Row( From 8bc9ea4fabd971a0a7f2b864d24f286fd6c415d1 Mon Sep 17 00:00:00 2001 From: Juraj Hilje Date: Tue, 11 Jul 2023 14:11:48 +0200 Subject: [PATCH 11/29] feat(antitracker): update ServersRepository.kt --- .../prefs/EncryptedSettingsPreference.kt | 28 ------------------- .../core/common/prefs/ServersRepository.kt | 22 +++++++++++---- .../net/ivpn/core/common/prefs/Settings.kt | 14 +++------- 3 files changed, 20 insertions(+), 44 deletions(-) diff --git a/core/src/main/java/net/ivpn/core/common/prefs/EncryptedSettingsPreference.kt b/core/src/main/java/net/ivpn/core/common/prefs/EncryptedSettingsPreference.kt index 1fb5454c8..d28c80cbe 100644 --- a/core/src/main/java/net/ivpn/core/common/prefs/EncryptedSettingsPreference.kt +++ b/core/src/main/java/net/ivpn/core/common/prefs/EncryptedSettingsPreference.kt @@ -49,8 +49,6 @@ class EncryptedSettingsPreference @Inject constructor(val preference: Preference private const val SETTINGS_CUSTOM_DNS = "SETTINGS_CUSTOM_DNS" private const val SETTINGS_ANTI_SURVEILLANCE = "SETTINGS_ANTI_SURVEILLANCE" private const val SETTINGS_ANTI_SURVEILLANCE_HARDCORE = "SETTINGS_ANTI_SURVEILLANCE_HARDCORE" - private const val SETTINGS_ANTI_SURVEILLANCE_DNS = "SETTINGS_ANTI_SURVEILLANCE_DNS" - private const val SETTINGS_ANTI_SURVEILLANCE_HARDCORE_DNS = "SETTINGS_ANTI_SURVEILLANCE_HARDCORE_DNS" private const val SETTINGS_CUSTOM_DNS_VALUE = "SETTINGS_CUSTOM_DNS_VALUE" private const val SETTINGS_AUTO_UPDATE = "SETTINGS_AUTO_UPDATE" private const val SETTINGS_NEXT_VERSION = "SETTINGS_NEXT_VERSION" @@ -176,14 +174,6 @@ class EncryptedSettingsPreference @Inject constructor(val preference: Preference return sharedPreferences.getBoolean(SETTINGS_ANTI_SURVEILLANCE_HARDCORE, false) } - fun getAntiSurveillanceDns(): String? { - return sharedPreferences.getString(SETTINGS_ANTI_SURVEILLANCE_DNS, "10.0.254.2") - } - - fun getAntiSurveillanceHardcoreDns(): String? { - return sharedPreferences.getString(SETTINGS_ANTI_SURVEILLANCE_HARDCORE_DNS, "10.0.254.3") - } - fun getIsAdvancedKillSwitchDialogEnabled(): Boolean { return sharedPreferences.getBoolean(SETTINGS_ADVANCED_KILL_SWITCH_DIALOG, true) } @@ -260,18 +250,6 @@ class EncryptedSettingsPreference @Inject constructor(val preference: Preference .apply() } - fun putAntiSurveillanceDns(value: String?) { - sharedPreferences.edit() - .putString(SETTINGS_ANTI_SURVEILLANCE_DNS, value) - .apply() - } - - fun putAntiSurveillanceHardcoreDns(value: String?) { - sharedPreferences.edit() - .putString(SETTINGS_ANTI_SURVEILLANCE_HARDCORE_DNS, value) - .apply() - } - fun putSettingAdvancedKillSwitch(value: Boolean) { sharedPreferences.edit() .putBoolean(SETTINGS_ADVANCED_KILL_SWITCH_DIALOG, value) @@ -573,12 +551,6 @@ class EncryptedSettingsPreference @Inject constructor(val preference: Preference if (oldPreference.contains(SETTINGS_ANTI_SURVEILLANCE_HARDCORE)) { putAntiSurveillanceHardcore(oldPreference.getBoolean(SETTINGS_ANTI_SURVEILLANCE_HARDCORE, false)) } - if (oldPreference.contains(SETTINGS_ANTI_SURVEILLANCE_DNS)) { - putAntiSurveillanceDns(oldPreference.getString(SETTINGS_ANTI_SURVEILLANCE_DNS, "10.0.254.2")) - } - if (oldPreference.contains(SETTINGS_ANTI_SURVEILLANCE_HARDCORE_DNS)) { - putAntiSurveillanceHardcoreDns(oldPreference.getString(SETTINGS_ANTI_SURVEILLANCE_HARDCORE_DNS, "10.0.254.3")) - } if (oldPreference.contains(SETTINGS_CUSTOM_DNS_VALUE)) { setCustomDNSValue(oldPreference.getString(SETTINGS_CUSTOM_DNS_VALUE, "")) } diff --git a/core/src/main/java/net/ivpn/core/common/prefs/ServersRepository.kt b/core/src/main/java/net/ivpn/core/common/prefs/ServersRepository.kt index 5e7fbbede..245a47c76 100644 --- a/core/src/main/java/net/ivpn/core/common/prefs/ServersRepository.kt +++ b/core/src/main/java/net/ivpn/core/common/prefs/ServersRepository.kt @@ -178,8 +178,6 @@ class ServersRepository @Inject constructor( LOGGER.info(response.toString()) response.markServerTypes() setServerList(response.openVpnServerList, response.wireGuardServerList) - settings.antiTrackerDefaultDNS = response.config.antiTracker.default.ip - settings.antiTrackerHardcoreDNS = response.config.antiTracker.hardcore.ip settings.setIpList(Mapper.stringFromIps(response.config.api.ips)) settings.setIPv6List(Mapper.stringFromIps(response.config.api.ipv6s)) settings.wireGuardPorts = response.config.ports.wireguard.filter { it.portNumber > 0 } @@ -261,10 +259,16 @@ class ServersRepository @Inject constructor( val response = Mapper.getProtocolServers(ServersLoader.load()) response?.let{ it.markServerTypes() - settings.antiTrackerDefaultDNS = it.config.antiTracker.default.ip - settings.antiTrackerHardcoreDNS = it.config.antiTracker.hardcore.ip settings.setIpList(Mapper.stringFromIps(it.config.api.ips)) settings.setIPv6List(Mapper.stringFromIps(it.config.api.ipv6s)) + settings.wireGuardPorts = response.config.ports.wireguard.filter { it.portNumber > 0 } + settings.openVpnPorts = response.config.ports.openvpn.filter { it.portNumber > 0 } + settings.wireGuardPortRanges = response.config.ports.wireguard.filter { it.range != null } + settings.openVpnPortRanges = response.config.ports.openvpn.filter { it.range != null } + settings.antiTrackerList = response.config.antiTrackerPlus.list + if (settings.antiTrackerDns == null) { + settings.antiTrackerDns = settings.antiTrackerList.first() + } setServerList(it.openVpnServerList, it.wireGuardServerList) } } @@ -275,8 +279,14 @@ class ServersRepository @Inject constructor( } val response = Mapper.getProtocolServers(ServersLoader.load()) response?.let { - settings.antiTrackerDefaultDNS = it.config.antiTracker.default.ip - settings.antiTrackerHardcoreDNS = it.config.antiTracker.hardcore.ip + settings.wireGuardPorts = response.config.ports.wireguard.filter { it.portNumber > 0 } + settings.openVpnPorts = response.config.ports.openvpn.filter { it.portNumber > 0 } + settings.wireGuardPortRanges = response.config.ports.wireguard.filter { it.range != null } + settings.openVpnPortRanges = response.config.ports.openvpn.filter { it.range != null } + settings.antiTrackerList = response.config.antiTrackerPlus.list + if (settings.antiTrackerDns == null) { + settings.antiTrackerDns = settings.antiTrackerList.first() + } settings.setIpList(Mapper.stringFromIps(it.config.api.ips)) settings.setIPv6List(Mapper.stringFromIps(it.config.api.ipv6s)) } diff --git a/core/src/main/java/net/ivpn/core/common/prefs/Settings.kt b/core/src/main/java/net/ivpn/core/common/prefs/Settings.kt index dd74d3ec4..19a01c803 100644 --- a/core/src/main/java/net/ivpn/core/common/prefs/Settings.kt +++ b/core/src/main/java/net/ivpn/core/common/prefs/Settings.kt @@ -181,17 +181,11 @@ class Settings @Inject constructor( settingsPreference.ipv6List = ips } - var antiTrackerDefaultDNS: String? - get() = settingsPreference.getAntiSurveillanceDns() - set(dns) { - settingsPreference.putAntiSurveillanceDns(dns) - } + val antiTrackerDefaultDNS: String + get() = antiTrackerDns?.normal ?: "10.0.254.2" - var antiTrackerHardcoreDNS: String? - get() = settingsPreference.getAntiSurveillanceHardcoreDns() - set(dns) { - settingsPreference.putAntiSurveillanceHardcoreDns(dns) - } + val antiTrackerHardcoreDNS: String + get() = antiTrackerDns?.hardcore ?: "10.0.254.3" var openVpnPort: Port get() { From a34fe5a70d3ab07da79624ede3fb4b0e7c3a8f6d Mon Sep 17 00:00:00 2001 From: Juraj Hilje Date: Tue, 11 Jul 2023 15:45:55 +0200 Subject: [PATCH 12/29] feat(antitracker): update AntiTrackerViewModel.kt --- .../net/ivpn/core/v2/antitracker/AntiTrackerFragment.kt | 5 +++++ .../net/ivpn/core/v2/antitracker/AntiTrackerListScreen.kt | 6 ++++-- .../java/net/ivpn/core/v2/viewmodel/AntiTrackerViewModel.kt | 2 ++ core/src/main/res/layout/content_anti_surveillance.xml | 2 +- core/src/main/res/values/strings.xml | 2 ++ 5 files changed, 14 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerFragment.kt b/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerFragment.kt index 8350bacb9..023e15924 100644 --- a/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerFragment.kt +++ b/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerFragment.kt @@ -73,6 +73,11 @@ class AntiTrackerFragment: Fragment() { } } + override fun onResume() { + super.onResume() + antiTracker.reset() + } + private fun initViews() { binding.contentLayout.antitracker = antiTracker binding.contentLayout.readMoreAntitracker.setOnClickListener { diff --git a/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerListScreen.kt b/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerListScreen.kt index cf3015b53..8b28da33d 100644 --- a/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerListScreen.kt +++ b/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerListScreen.kt @@ -17,10 +17,12 @@ import androidx.compose.material.icons.filled.Check import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.navigation.NavController +import net.ivpn.core.R import net.ivpn.core.rest.data.model.AntiTrackerDns import net.ivpn.core.ui.theme.colorPrimary @@ -30,13 +32,13 @@ fun AntiTrackerListScreen(navController: NavController?, viewModel: AntiTrackerL Column { LazyColumn { item { - AntiTrackerListSection("Pre-defined lists") + AntiTrackerListSection(stringResource(R.string.anti_tracker_pre_defined)) } items(viewModel.antiTrackerBasicList) { AntiTrackerListItem(it, navController, viewModel) } item { - AntiTrackerListSection("Individual lists") + AntiTrackerListSection(stringResource(R.string.anti_tracker_individual)) } items(viewModel.antiTrackerIndividualList) { AntiTrackerListItem(it, navController, viewModel) diff --git a/core/src/main/java/net/ivpn/core/v2/viewmodel/AntiTrackerViewModel.kt b/core/src/main/java/net/ivpn/core/v2/viewmodel/AntiTrackerViewModel.kt index 1d1ac717a..b3138c716 100644 --- a/core/src/main/java/net/ivpn/core/v2/viewmodel/AntiTrackerViewModel.kt +++ b/core/src/main/java/net/ivpn/core/v2/viewmodel/AntiTrackerViewModel.kt @@ -50,6 +50,7 @@ class AntiTrackerViewModel @Inject constructor( val isHardcoreModeUIEnabled = ObservableBoolean() val antiTrackerDescription = ObservableField() + val antiTrackerList = ObservableField() val state = ObservableField() @@ -72,6 +73,7 @@ class AntiTrackerViewModel @Inject constructor( isAntiSurveillanceEnabled.set(settings.isAntiSurveillanceEnabled) isHardcoreModeEnabled.set(settings.isAntiSurveillanceHardcoreEnabled) isHardcoreModeUIEnabled.set(isAntiSurveillanceEnabled.get()) + antiTrackerList.set(settings.antiTrackerDns?.description ?: "") getAntiTrackerState() getAntiTrackerDescriptionValue() diff --git a/core/src/main/res/layout/content_anti_surveillance.xml b/core/src/main/res/layout/content_anti_surveillance.xml index f75ed3ffe..7503ac235 100644 --- a/core/src/main/res/layout/content_anti_surveillance.xml +++ b/core/src/main/res/layout/content_anti_surveillance.xml @@ -91,7 +91,7 @@ android:layout_height="wrap_content" android:textColor="@color/custom_dns_text_color" android:alpha="0.6" - android:text="Basic" + android:text="@{antitracker.antiTrackerList}" android:textSize="16dp" /> diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml index cac1ef16b..beb3eeea4 100644 --- a/core/src/main/res/values/strings.xml +++ b/core/src/main/res/values/strings.xml @@ -143,6 +143,8 @@ AntiTracker is disabled AntiTracker is enabled and blocking known trackers AntiTracker will be enabled when connected to VPN" + Pre-defined lists + Individual lists Enable developer options From 02f0f93952e1dd26a0543df5bec2fb8c7ef1b7d6 Mon Sep 17 00:00:00 2001 From: Juraj Hilje Date: Tue, 11 Jul 2023 15:56:40 +0200 Subject: [PATCH 13/29] refactor: remove model/AntiTracker.java --- .../core/rest/data/model/AntiTracker.java | 84 ------------------- .../net/ivpn/core/rest/data/model/Config.java | 11 --- 2 files changed, 95 deletions(-) delete mode 100644 core/src/main/java/net/ivpn/core/rest/data/model/AntiTracker.java diff --git a/core/src/main/java/net/ivpn/core/rest/data/model/AntiTracker.java b/core/src/main/java/net/ivpn/core/rest/data/model/AntiTracker.java deleted file mode 100644 index c935f2d6c..000000000 --- a/core/src/main/java/net/ivpn/core/rest/data/model/AntiTracker.java +++ /dev/null @@ -1,84 +0,0 @@ -package net.ivpn.core.rest.data.model; - -/* - IVPN Android app - https://github.com/ivpn/android-app - - Created by Oleksandr Mykhailenko. - Copyright (c) 2020 Privatus Limited. - - This file is part of the IVPN Android app. - - The IVPN Android app is free software: you can redistribute it and/or - modify it under the terms of the GNU General Public License as published by the Free - Software Foundation, either version 3 of the License, or (at your option) any later version. - - The IVPN Android app is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - details. - - You should have received a copy of the GNU General Public License - along with the IVPN Android app. If not, see . -*/ - -import com.google.gson.annotations.Expose; -import com.google.gson.annotations.SerializedName; - -public class AntiTracker { - - @SerializedName("default") - @Expose - private Default _default; - @SerializedName("hardcore") - @Expose - private Hardcore hardcore; - - public Default getDefault() { - return _default; - } - - public void setDefault(Default _default) { - this._default = _default; - } - - public Hardcore getHardcore() { - return hardcore; - } - - public void setHardcore(Hardcore hardcore) { - this.hardcore = hardcore; - } - - public class Hardcore { - - @SerializedName("ip") - @Expose - private String ip; - - public String getIp() { - return ip; - } - - public void setIp(String ip) { - this.ip = ip; - } - - } - - public class Default { - - @SerializedName("ip") - @Expose - private String ip; - - public String getIp() { - return ip; - } - - public void setIp(String ip) { - this.ip = ip; - } - - } -} \ No newline at end of file diff --git a/core/src/main/java/net/ivpn/core/rest/data/model/Config.java b/core/src/main/java/net/ivpn/core/rest/data/model/Config.java index 0651e8673..90115752d 100644 --- a/core/src/main/java/net/ivpn/core/rest/data/model/Config.java +++ b/core/src/main/java/net/ivpn/core/rest/data/model/Config.java @@ -27,9 +27,6 @@ public class Config { - @SerializedName("antitracker") - @Expose - private AntiTracker antitracker; @SerializedName("antitracker_plus") @Expose private AntiTrackerPlus antitrackerPlus; @@ -40,14 +37,6 @@ public class Config { @Expose private Ports ports; - public AntiTracker getAntiTracker() { - return antitracker; - } - - public void setAntiTracker(AntiTracker antitracker) { - this.antitracker = antitracker; - } - public AntiTrackerPlus getAntiTrackerPlus() { return antitrackerPlus; } From d52b4eb8314f5ff7178c549c2863567770e90e9a Mon Sep 17 00:00:00 2001 From: Juraj Hilje Date: Tue, 11 Jul 2023 16:19:22 +0200 Subject: [PATCH 14/29] refactor: rename AntiTrackerDns.kt to AntiTracker.kt --- .../src/main/java/net/ivpn/core/common/Mapper.kt | 14 +++++++------- .../common/prefs/EncryptedSettingsPreference.kt | 4 ++-- .../ivpn/core/common/prefs/ServersRepository.kt | 12 ++++++------ .../java/net/ivpn/core/common/prefs/Settings.kt | 16 ++++++++-------- .../model/{AntiTrackerDns.kt => AntiTracker.kt} | 10 +++++----- .../core/v2/antitracker/AntiTrackerListScreen.kt | 8 ++++---- .../v2/antitracker/AntiTrackerListViewModel.kt | 14 +++++++------- .../core/v2/viewmodel/AntiTrackerViewModel.kt | 2 +- 8 files changed, 40 insertions(+), 40 deletions(-) rename core/src/main/java/net/ivpn/core/rest/data/model/{AntiTrackerDns.kt => AntiTracker.kt} (87%) diff --git a/core/src/main/java/net/ivpn/core/common/Mapper.kt b/core/src/main/java/net/ivpn/core/common/Mapper.kt index 391fd78ca..75a0fbccb 100644 --- a/core/src/main/java/net/ivpn/core/common/Mapper.kt +++ b/core/src/main/java/net/ivpn/core/common/Mapper.kt @@ -26,7 +26,7 @@ import com.google.gson.Gson import com.google.gson.JsonSyntaxException import com.google.gson.reflect.TypeToken import net.ivpn.core.rest.data.ServersListResponse -import net.ivpn.core.rest.data.model.AntiTrackerDns +import net.ivpn.core.rest.data.model.AntiTracker import net.ivpn.core.rest.data.model.Port import net.ivpn.core.rest.data.model.Server import net.ivpn.core.rest.data.wireguard.ErrorResponse @@ -72,21 +72,21 @@ object Mapper { return Gson().fromJson(json, type) } - fun antiTrackerListFrom(json: String?): List { - val type = object : TypeToken>() {}.type + fun antiTrackerListFrom(json: String?): List { + val type = object : TypeToken>() {}.type return Gson().fromJson(json, type) } - fun stringFromAntiTrackerList(list: List?): String { + fun stringFromAntiTrackerList(list: List?): String { return Gson().toJson(list) } - fun antiTrackerDnsFrom(json: String?): AntiTrackerDns { - val type = object : TypeToken() {}.type + fun antiTrackerFrom(json: String?): AntiTracker { + val type = object : TypeToken() {}.type return Gson().fromJson(json, type) } - fun stringFromAntiTrackerDns(dns: AntiTrackerDns?): String { + fun stringFromAntiTracker(dns: AntiTracker?): String { return Gson().toJson(dns) } diff --git a/core/src/main/java/net/ivpn/core/common/prefs/EncryptedSettingsPreference.kt b/core/src/main/java/net/ivpn/core/common/prefs/EncryptedSettingsPreference.kt index d28c80cbe..b6cdc5492 100644 --- a/core/src/main/java/net/ivpn/core/common/prefs/EncryptedSettingsPreference.kt +++ b/core/src/main/java/net/ivpn/core/common/prefs/EncryptedSettingsPreference.kt @@ -482,13 +482,13 @@ class EncryptedSettingsPreference @Inject constructor(val preference: Preference return sharedPreferences.getString(ANTITRACKER_LIST, "") } - fun setAntiTrackerDns(json: String?) { + fun setAntiTracker(json: String?) { sharedPreferences.edit() .putString(ANTITRACKER_DNS, json) .apply() } - fun getAntiTrackerDns(): String? { + fun getAntiTracker(): String? { return sharedPreferences.getString(ANTITRACKER_DNS, "") } diff --git a/core/src/main/java/net/ivpn/core/common/prefs/ServersRepository.kt b/core/src/main/java/net/ivpn/core/common/prefs/ServersRepository.kt index 245a47c76..78ec2926d 100644 --- a/core/src/main/java/net/ivpn/core/common/prefs/ServersRepository.kt +++ b/core/src/main/java/net/ivpn/core/common/prefs/ServersRepository.kt @@ -185,8 +185,8 @@ class ServersRepository @Inject constructor( settings.wireGuardPortRanges = response.config.ports.wireguard.filter { it.range != null } settings.openVpnPortRanges = response.config.ports.openvpn.filter { it.range != null } settings.antiTrackerList = response.config.antiTrackerPlus.list - if (settings.antiTrackerDns == null) { - settings.antiTrackerDns = settings.antiTrackerList.first() + if (settings.antiTracker == null) { + settings.antiTracker = settings.antiTrackerList.first() } for (listener in onServerListUpdatedListeners) { listener.onSuccess(getSuitableServers(response), isForced) @@ -266,8 +266,8 @@ class ServersRepository @Inject constructor( settings.wireGuardPortRanges = response.config.ports.wireguard.filter { it.range != null } settings.openVpnPortRanges = response.config.ports.openvpn.filter { it.range != null } settings.antiTrackerList = response.config.antiTrackerPlus.list - if (settings.antiTrackerDns == null) { - settings.antiTrackerDns = settings.antiTrackerList.first() + if (settings.antiTracker == null) { + settings.antiTracker = settings.antiTrackerList.first() } setServerList(it.openVpnServerList, it.wireGuardServerList) } @@ -284,8 +284,8 @@ class ServersRepository @Inject constructor( settings.wireGuardPortRanges = response.config.ports.wireguard.filter { it.range != null } settings.openVpnPortRanges = response.config.ports.openvpn.filter { it.range != null } settings.antiTrackerList = response.config.antiTrackerPlus.list - if (settings.antiTrackerDns == null) { - settings.antiTrackerDns = settings.antiTrackerList.first() + if (settings.antiTracker == null) { + settings.antiTracker = settings.antiTrackerList.first() } settings.setIpList(Mapper.stringFromIps(it.config.api.ips)) settings.setIPv6List(Mapper.stringFromIps(it.config.api.ipv6s)) diff --git a/core/src/main/java/net/ivpn/core/common/prefs/Settings.kt b/core/src/main/java/net/ivpn/core/common/prefs/Settings.kt index 19a01c803..a27615144 100644 --- a/core/src/main/java/net/ivpn/core/common/prefs/Settings.kt +++ b/core/src/main/java/net/ivpn/core/common/prefs/Settings.kt @@ -29,7 +29,7 @@ import net.ivpn.core.common.BuildController import net.ivpn.core.common.Mapper import net.ivpn.core.common.dagger.ApplicationScope import net.ivpn.core.common.nightmode.NightMode -import net.ivpn.core.rest.data.model.AntiTrackerDns +import net.ivpn.core.rest.data.model.AntiTracker import net.ivpn.core.rest.data.model.Port import net.ivpn.core.v2.serverlist.dialog.Filters import net.ivpn.core.vpn.Protocol @@ -182,10 +182,10 @@ class Settings @Inject constructor( } val antiTrackerDefaultDNS: String - get() = antiTrackerDns?.normal ?: "10.0.254.2" + get() = antiTracker?.normal ?: "10.0.254.2" val antiTrackerHardcoreDNS: String - get() = antiTrackerDns?.hardcore ?: "10.0.254.3" + get() = antiTracker?.hardcore ?: "10.0.254.3" var openVpnPort: Port get() { @@ -293,7 +293,7 @@ class Settings @Inject constructor( val wireGuardPresharedKey: String? get() = settingsPreference.getSettingsWgPresharedKey() - var antiTrackerList: List + var antiTrackerList: List get() { return Mapper.antiTrackerListFrom(settingsPreference.getAntiTrackerList()) } @@ -301,13 +301,13 @@ class Settings @Inject constructor( settingsPreference.setAntiTrackerList(Mapper.stringFromAntiTrackerList(list)) } - var antiTrackerDns: AntiTrackerDns? + var antiTracker: AntiTracker? get() { - val json = settingsPreference.getAntiTrackerDns() - return if (json!!.isEmpty()) null else Mapper.antiTrackerDnsFrom(json) + val json = settingsPreference.getAntiTracker() + return if (json!!.isEmpty()) null else Mapper.antiTrackerFrom(json) } set(dns) { - settingsPreference.setAntiTrackerDns(Mapper.stringFromAntiTrackerDns(dns)) + settingsPreference.setAntiTracker(Mapper.stringFromAntiTracker(dns)) } fun nextPort() { diff --git a/core/src/main/java/net/ivpn/core/rest/data/model/AntiTrackerDns.kt b/core/src/main/java/net/ivpn/core/rest/data/model/AntiTracker.kt similarity index 87% rename from core/src/main/java/net/ivpn/core/rest/data/model/AntiTrackerDns.kt rename to core/src/main/java/net/ivpn/core/rest/data/model/AntiTracker.kt index f6648f2df..2188f4c8b 100644 --- a/core/src/main/java/net/ivpn/core/rest/data/model/AntiTrackerDns.kt +++ b/core/src/main/java/net/ivpn/core/rest/data/model/AntiTracker.kt @@ -26,7 +26,7 @@ import com.google.gson.Gson import com.google.gson.annotations.Expose import com.google.gson.annotations.SerializedName -class AntiTrackerDns { +class AntiTracker { @SerializedName("Name") @Expose @@ -45,7 +45,7 @@ class AntiTrackerDns { var hardcore: String = "" override fun equals(other: Any?): Boolean { - if (other !is AntiTrackerDns) return false + if (other !is AntiTracker) return false return name == other.name && normal == other.normal } @@ -59,8 +59,8 @@ class AntiTrackerDns { companion object { - fun from(json: String): AntiTrackerDns { - return Gson().fromJson(json, AntiTrackerDns::class.java) + fun from(json: String): AntiTracker { + return Gson().fromJson(json, AntiTracker::class.java) } } @@ -71,6 +71,6 @@ class AntiTrackerPlus { @SerializedName("DnsServers") @Expose - lateinit var list: List + lateinit var list: List } diff --git a/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerListScreen.kt b/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerListScreen.kt index 8b28da33d..8fd861bd7 100644 --- a/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerListScreen.kt +++ b/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerListScreen.kt @@ -23,7 +23,7 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.navigation.NavController import net.ivpn.core.R -import net.ivpn.core.rest.data.model.AntiTrackerDns +import net.ivpn.core.rest.data.model.AntiTracker import net.ivpn.core.ui.theme.colorPrimary @Composable @@ -67,19 +67,19 @@ fun AntiTrackerListSection(title: String) { } @Composable -fun AntiTrackerListItem(dns: AntiTrackerDns, navController: NavController?, viewModel: AntiTrackerListViewModel) { +fun AntiTrackerListItem(dns: AntiTracker, navController: NavController?, viewModel: AntiTrackerListViewModel) { Row( verticalAlignment = Alignment.CenterVertically, modifier = Modifier .clickable { - viewModel.setAntiTrackerDns(dns) + viewModel.setAntiTracker(dns) navController?.popBackStack() } .padding(horizontal = 18.dp, vertical = 16.dp) .fillMaxWidth() ) { Text(dns.toThumbnail()) - if (dns == viewModel.antiTrackerDns) { + if (dns == viewModel.antiTracker) { Spacer(Modifier.weight(1f)) Icon( imageVector = Icons.Filled.Check, diff --git a/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerListViewModel.kt b/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerListViewModel.kt index 668f152a4..cfd577de6 100644 --- a/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerListViewModel.kt +++ b/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerListViewModel.kt @@ -25,7 +25,7 @@ package net.ivpn.core.v2.antitracker import androidx.lifecycle.ViewModel import net.ivpn.core.common.dagger.ApplicationScope import net.ivpn.core.common.prefs.Settings -import net.ivpn.core.rest.data.model.AntiTrackerDns +import net.ivpn.core.rest.data.model.AntiTracker import javax.inject.Inject @ApplicationScope @@ -35,17 +35,17 @@ class AntiTrackerListViewModel @Inject constructor( private val basicList = arrayOf("Basic", "Comprehensive", "Restrictive") - val antiTrackerBasicList: List + val antiTrackerBasicList: List get() = settings.antiTrackerList.filter { basicList.contains(it.name) } - val antiTrackerIndividualList: List + val antiTrackerIndividualList: List get() = settings.antiTrackerList.filter { !basicList.contains(it.name) } - val antiTrackerDns: AntiTrackerDns? - get() = settings.antiTrackerDns + val antiTracker: AntiTracker? + get() = settings.antiTracker - fun setAntiTrackerDns(dns: AntiTrackerDns) { - settings.antiTrackerDns = dns + fun setAntiTracker(dns: AntiTracker) { + settings.antiTracker = dns } } \ No newline at end of file diff --git a/core/src/main/java/net/ivpn/core/v2/viewmodel/AntiTrackerViewModel.kt b/core/src/main/java/net/ivpn/core/v2/viewmodel/AntiTrackerViewModel.kt index b3138c716..f6661e07f 100644 --- a/core/src/main/java/net/ivpn/core/v2/viewmodel/AntiTrackerViewModel.kt +++ b/core/src/main/java/net/ivpn/core/v2/viewmodel/AntiTrackerViewModel.kt @@ -73,7 +73,7 @@ class AntiTrackerViewModel @Inject constructor( isAntiSurveillanceEnabled.set(settings.isAntiSurveillanceEnabled) isHardcoreModeEnabled.set(settings.isAntiSurveillanceHardcoreEnabled) isHardcoreModeUIEnabled.set(isAntiSurveillanceEnabled.get()) - antiTrackerList.set(settings.antiTrackerDns?.description ?: "") + antiTrackerList.set(settings.antiTracker?.description ?: "") getAntiTrackerState() getAntiTrackerDescriptionValue() From d9957ac1a53b1e3f6e7ae9e22908d12b0e63bb2d Mon Sep 17 00:00:00 2001 From: Juraj Hilje Date: Tue, 11 Jul 2023 18:19:50 +0200 Subject: [PATCH 15/29] feat(antitracker): update AntiTrackerFragment.kt --- .../java/net/ivpn/core/v2/antitracker/AntiTrackerFragment.kt | 4 ++-- core/src/main/res/values/strings.xml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerFragment.kt b/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerFragment.kt index 023e15924..23e6acc6d 100644 --- a/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerFragment.kt +++ b/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerFragment.kt @@ -101,13 +101,13 @@ class AntiTrackerFragment: Fragment() { private fun readMore() { val openURL = Intent(Intent.ACTION_VIEW) - openURL.data = Uri.parse("https://www.ivpn.net/antitracker") + openURL.data = Uri.parse("https://www.ivpn.net/knowledgebase/antitracker/blocklists/") startActivity(openURL) } private fun readMoreHardcore() { val openURL = Intent(Intent.ACTION_VIEW) - openURL.data = Uri.parse("https://www.ivpn.net/antitracker/hardcore") + openURL.data = Uri.parse("https://www.ivpn.net/knowledgebase/general/antitracker-faq/") startActivity(openURL) } } \ No newline at end of file diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml index beb3eeea4..ce8e8d2e6 100644 --- a/core/src/main/res/values/strings.xml +++ b/core/src/main/res/values/strings.xml @@ -136,9 +136,9 @@ Enable AntiTracker - AntiTracker uses our private DNS to block ads, malicious website, and third-party trackers such as Google Analytics. + Block lists refer to DNS blocking lists used by our AntiTracker. The \'Basic\', \'Comprehensive\', and \'Restrictive\' options are combinations of individual lists, each offering a different level of protection. You also have the freedom to select from individual lists for a more tailored AntiTracker experience. Hardcore Mode - Hardcore mode blocks the leading companies with business models relying on user surveillance (currently: Google and Facebook). + Hardcore mode blocks the leading companies with business models relying on user surveillance (currently: Google and Facebook) Read more AntiTracker is disabled AntiTracker is enabled and blocking known trackers From dd65e4430f90bf0ccbc4ac717dfc2ea761deeff6 Mon Sep 17 00:00:00 2001 From: Juraj Hilje Date: Thu, 13 Jul 2023 16:08:24 +0200 Subject: [PATCH 16/29] feat(antitracker): update content_anti_surveillance.xml --- .../core/common/prefs/ServersRepository.kt | 8 --- .../v2/antitracker/AntiTrackerFragment.kt | 9 ++++ .../res/layout/content_anti_surveillance.xml | 52 ++++++++++++++++--- core/src/main/res/values/strings.xml | 5 +- 4 files changed, 59 insertions(+), 15 deletions(-) diff --git a/core/src/main/java/net/ivpn/core/common/prefs/ServersRepository.kt b/core/src/main/java/net/ivpn/core/common/prefs/ServersRepository.kt index 78ec2926d..12a562bdd 100644 --- a/core/src/main/java/net/ivpn/core/common/prefs/ServersRepository.kt +++ b/core/src/main/java/net/ivpn/core/common/prefs/ServersRepository.kt @@ -265,10 +265,6 @@ class ServersRepository @Inject constructor( settings.openVpnPorts = response.config.ports.openvpn.filter { it.portNumber > 0 } settings.wireGuardPortRanges = response.config.ports.wireguard.filter { it.range != null } settings.openVpnPortRanges = response.config.ports.openvpn.filter { it.range != null } - settings.antiTrackerList = response.config.antiTrackerPlus.list - if (settings.antiTracker == null) { - settings.antiTracker = settings.antiTrackerList.first() - } setServerList(it.openVpnServerList, it.wireGuardServerList) } } @@ -283,10 +279,6 @@ class ServersRepository @Inject constructor( settings.openVpnPorts = response.config.ports.openvpn.filter { it.portNumber > 0 } settings.wireGuardPortRanges = response.config.ports.wireguard.filter { it.range != null } settings.openVpnPortRanges = response.config.ports.openvpn.filter { it.range != null } - settings.antiTrackerList = response.config.antiTrackerPlus.list - if (settings.antiTracker == null) { - settings.antiTracker = settings.antiTrackerList.first() - } settings.setIpList(Mapper.stringFromIps(it.config.api.ips)) settings.setIPv6List(Mapper.stringFromIps(it.config.api.ipv6s)) } diff --git a/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerFragment.kt b/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerFragment.kt index 23e6acc6d..8c28ccd58 100644 --- a/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerFragment.kt +++ b/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerFragment.kt @@ -83,6 +83,9 @@ class AntiTrackerFragment: Fragment() { binding.contentLayout.readMoreAntitracker.setOnClickListener { readMore() } + binding.contentLayout.readMoreBlockList.setOnClickListener { + readMoreBlockList() + } binding.contentLayout.readMoreHardcore.setOnClickListener { readMoreHardcore() } @@ -100,6 +103,12 @@ class AntiTrackerFragment: Fragment() { } private fun readMore() { + val openURL = Intent(Intent.ACTION_VIEW) + openURL.data = Uri.parse("https://www.ivpn.net/antitracker/") + startActivity(openURL) + } + + private fun readMoreBlockList() { val openURL = Intent(Intent.ACTION_VIEW) openURL.data = Uri.parse("https://www.ivpn.net/knowledgebase/antitracker/blocklists/") startActivity(openURL) diff --git a/core/src/main/res/layout/content_anti_surveillance.xml b/core/src/main/res/layout/content_anti_surveillance.xml index 7503ac235..d6e8a2691 100644 --- a/core/src/main/res/layout/content_anti_surveillance.xml +++ b/core/src/main/res/layout/content_anti_surveillance.xml @@ -3,9 +3,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto"> - - @@ -64,6 +62,48 @@ + + + + + + + + + + + + + @@ -119,12 +159,12 @@ android:lineSpacingExtra="3sp" android:textColor="@color/antitracker_text" android:alpha="0.6" - android:text="@string/anti_surveillance_description" + android:text="@string/anti_surveillance_block_list_description" android:textAlignment="viewStart" android:textSize="16sp" /> Enable AntiTracker - Block lists refer to DNS blocking lists used by our AntiTracker. The \'Basic\', \'Comprehensive\', and \'Restrictive\' options are combinations of individual lists, each offering a different level of protection. You also have the freedom to select from individual lists for a more tailored AntiTracker experience. + When AntiTracker is enabled, IVPN blocks ads, malicious websites, and third-party trackers using our private DNS servers. + Block lists refer to DNS blocking lists used by our AntiTracker. The \'Basic\', \'Comprehensive\', and \'Restrictive\' options are combinations of individual lists, each offering a different level of protection. You also have the freedom to select from individual lists for a more tailored AntiTracker experience. Hardcore Mode Hardcore mode blocks the leading companies with business models relying on user surveillance (currently: Google and Facebook) Read more @@ -145,6 +146,8 @@ AntiTracker will be enabled when connected to VPN" Pre-defined lists Individual lists + Block list + Change list Enable developer options From 1bf9a3ef6a8fa43c181b9fe20fd52ec5f3da836a Mon Sep 17 00:00:00 2001 From: Juraj Hilje Date: Thu, 13 Jul 2023 20:15:12 +0200 Subject: [PATCH 17/29] feat(antitracker): update content_anti_surveillance.xml --- .../res/layout/content_anti_surveillance.xml | 381 +++++++++--------- 1 file changed, 193 insertions(+), 188 deletions(-) diff --git a/core/src/main/res/layout/content_anti_surveillance.xml b/core/src/main/res/layout/content_anti_surveillance.xml index d6e8a2691..5ad14b6b2 100644 --- a/core/src/main/res/layout/content_anti_surveillance.xml +++ b/core/src/main/res/layout/content_anti_surveillance.xml @@ -9,247 +9,252 @@ type="net.ivpn.core.v2.viewmodel.AntiTrackerViewModel" /> - + android:layout_height="match_parent"> - + android:layout_height="match_parent" + android:background="@color/antitracker_background" + android:orientation="vertical" + android:paddingTop="?attr/actionBarSize"> - + android:layout_height="wrap_content"> + android:padding="16dp" + android:layout_weight="1" + android:gravity="center_vertical" + android:background="@color/antitracker_card_background" + android:orientation="vertical"> + + + + + + + + + + - - + android:alpha="0.6" + android:text="@string/anti_surveillance_description" + android:textAlignment="viewStart" + android:textSize="16sp" /> - + android:layout_marginTop="16dp" + android:layout_marginBottom="4dp" + android:text="@string/anti_surveillance_read_more" + android:textAllCaps="true" /> + - - - - - - - - - - + - + android:layout_height="wrap_content"> - - + + - - + android:layout_marginTop="20dp" + android:orientation="horizontal"> + + + + + + + + + + + + - - - + android:text="@string/anti_surveillance_block_list_description" + android:textAlignment="viewStart" + android:textSize="16sp" /> - + android:layout_marginTop="16dp" + android:layout_marginBottom="4dp" + android:text="@string/anti_surveillance_read_more" + android:textAllCaps="true" /> - - - - - - - - + + - + - + android:layout_height="wrap_content"> + android:background="@color/antitracker_card_background" + android:padding="16dp" + android:layout_weight="1" + android:gravity="center_vertical" + android:orientation="vertical"> + + + + + + + + + - - + android:alpha="0.6" + android:text="@string/anti_surveillance_hardcore_description" + android:textAlignment="viewStart" + android:textSize="16sp" /> - - + android:layout_marginTop="16dp" + android:layout_marginBottom="4dp" + android:onClick="readMoreHardcore" + android:text="@string/anti_surveillance_read_more" + android:textAllCaps="true" /> - - - - - - - + + + + \ No newline at end of file From 1c0660487a761ed6e400c6eff965af3e1c482836 Mon Sep 17 00:00:00 2001 From: Juraj Hilje Date: Thu, 13 Jul 2023 21:23:25 +0200 Subject: [PATCH 18/29] feat(antitracker): update AntiTrackerListScreen.kt --- .../java/net/ivpn/core/v2/antitracker/AntiTrackerListScreen.kt | 2 +- .../src/main/java/net/ivpn/core/v2/protocol/port/PortsScreen.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerListScreen.kt b/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerListScreen.kt index 8fd861bd7..4753e60df 100644 --- a/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerListScreen.kt +++ b/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerListScreen.kt @@ -73,7 +73,7 @@ fun AntiTrackerListItem(dns: AntiTracker, navController: NavController?, viewMod modifier = Modifier .clickable { viewModel.setAntiTracker(dns) - navController?.popBackStack() + navController?.popBackStack(R.id.antiTrackerFragment, false) } .padding(horizontal = 18.dp, vertical = 16.dp) .fillMaxWidth() diff --git a/core/src/main/java/net/ivpn/core/v2/protocol/port/PortsScreen.kt b/core/src/main/java/net/ivpn/core/v2/protocol/port/PortsScreen.kt index fc4ad41cd..d8c684700 100644 --- a/core/src/main/java/net/ivpn/core/v2/protocol/port/PortsScreen.kt +++ b/core/src/main/java/net/ivpn/core/v2/protocol/port/PortsScreen.kt @@ -76,7 +76,7 @@ fun PortListItem(port: Port, navController: NavController?, viewModel: PortsView modifier = Modifier .clickable { viewModel.setPort(port) - navController?.popBackStack() + navController?.popBackStack(R.id.protocolFragment, false) } .padding(horizontal = 18.dp, vertical = 16.dp) .fillMaxWidth() From 2fee86645a8fcc151d8c7642ff423505e0b5426a Mon Sep 17 00:00:00 2001 From: Juraj Hilje Date: Fri, 14 Jul 2023 12:12:14 +0200 Subject: [PATCH 19/29] feat(antitracker) open AntiTracker from sliding panel --- .../ivpn/core/v2/connect/ConnectFragment.kt | 18 ++++++++++++++++++ .../src/main/res/layout/view_sliding_panel.xml | 5 ++++- core/src/main/res/navigation/nav_graph.xml | 4 ++++ 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/net/ivpn/core/v2/connect/ConnectFragment.kt b/core/src/main/java/net/ivpn/core/v2/connect/ConnectFragment.kt index 9782615c2..919ceb70e 100644 --- a/core/src/main/java/net/ivpn/core/v2/connect/ConnectFragment.kt +++ b/core/src/main/java/net/ivpn/core/v2/connect/ConnectFragment.kt @@ -329,6 +329,19 @@ class ConnectFragment : Fragment(), MultiHopViewModel.MultiHopNavigator, openProtocolScreen() } + binding.slidingPanel.antitrackerLayout.setOnClickListener { + if (!account.authenticated.get()) { + openLoginScreen() + return@setOnClickListener + } + + if (!account.isActive.get()) { + openAddFundsScreen() + return@setOnClickListener + } + + openAntiTrackerScreen() + } binding.slidingPanel.enterServerLayout.setOnClickListener { if (!account.authenticated.get()) { openLoginScreen() @@ -686,6 +699,11 @@ class ConnectFragment : Fragment(), MultiHopViewModel.MultiHopNavigator, navigate(action) } + private fun openAntiTrackerScreen() { + val action = ConnectFragmentDirections.actionConnectFragmentToAntiTrackerFragment() + navigate(action) + } + private fun openEnterServerSelectionScreen() { println("backstack openEnterServerSelectionScreen") val action = diff --git a/core/src/main/res/layout/view_sliding_panel.xml b/core/src/main/res/layout/view_sliding_panel.xml index 4d611c99d..0c74bd41d 100644 --- a/core/src/main/res/layout/view_sliding_panel.xml +++ b/core/src/main/res/layout/view_sliding_panel.xml @@ -604,9 +604,12 @@ android:background="@color/sliding_panel_line_color"/> + Date: Fri, 14 Jul 2023 17:57:07 +0200 Subject: [PATCH 20/29] feat(antitracker): update ConnectFragment.kt --- .../main/java/net/ivpn/core/v2/connect/ConnectFragment.kt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/core/src/main/java/net/ivpn/core/v2/connect/ConnectFragment.kt b/core/src/main/java/net/ivpn/core/v2/connect/ConnectFragment.kt index 919ceb70e..fceda79a7 100644 --- a/core/src/main/java/net/ivpn/core/v2/connect/ConnectFragment.kt +++ b/core/src/main/java/net/ivpn/core/v2/connect/ConnectFragment.kt @@ -340,6 +340,14 @@ class ConnectFragment : Fragment(), MultiHopViewModel.MultiHopNavigator, return@setOnClickListener } + if (connect.isVpnActive()) { + notifyUser( + R.string.snackbar_to_use_antitracker_disconnect, + R.string.snackbar_disconnect_first + ) + return@setOnClickListener + } + openAntiTrackerScreen() } binding.slidingPanel.enterServerLayout.setOnClickListener { From df7a9dd1596839872ecd7f0076cd70cddc4b0798 Mon Sep 17 00:00:00 2001 From: Juraj Hilje Date: Fri, 14 Jul 2023 20:02:11 +0200 Subject: [PATCH 21/29] feat(antitracker): update view_sliding_panel.xml --- core/src/main/res/layout/view_sliding_panel.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/res/layout/view_sliding_panel.xml b/core/src/main/res/layout/view_sliding_panel.xml index 0c74bd41d..41f29fb32 100644 --- a/core/src/main/res/layout/view_sliding_panel.xml +++ b/core/src/main/res/layout/view_sliding_panel.xml @@ -634,8 +634,8 @@ Date: Mon, 17 Jul 2023 13:55:13 +0200 Subject: [PATCH 22/29] feat(antitracker): update strings.xml --- core/src/main/res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml index aa24c0c38..a5f1a4074 100644 --- a/core/src/main/res/values/strings.xml +++ b/core/src/main/res/values/strings.xml @@ -139,7 +139,7 @@ When AntiTracker is enabled, IVPN blocks ads, malicious websites, and third-party trackers using our private DNS servers. Block lists refer to DNS blocking lists used by our AntiTracker. The \'Basic\', \'Comprehensive\', and \'Restrictive\' options are combinations of individual lists, each offering a different level of protection. You also have the freedom to select from individual lists for a more tailored AntiTracker experience. Hardcore Mode - Hardcore mode blocks the leading companies with business models relying on user surveillance (currently: Google and Facebook) + Adding Hardcore mode will block the leading companies with business models relying on user surveillance (currently: Google and Facebook). Read more AntiTracker is disabled AntiTracker is enabled and blocking known trackers From afc1eaacdd7fab079309f1855a55e0d246130a00 Mon Sep 17 00:00:00 2001 From: Juraj Hilje Date: Tue, 18 Jul 2023 18:50:17 +0200 Subject: [PATCH 23/29] feat(antitracker): add getDefaultList method in --- .../ivpn/core/common/prefs/ServersRepository.kt | 7 +++++-- .../net/ivpn/core/rest/data/model/AntiTracker.kt | 15 +++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/net/ivpn/core/common/prefs/ServersRepository.kt b/core/src/main/java/net/ivpn/core/common/prefs/ServersRepository.kt index 12a562bdd..15517938b 100644 --- a/core/src/main/java/net/ivpn/core/common/prefs/ServersRepository.kt +++ b/core/src/main/java/net/ivpn/core/common/prefs/ServersRepository.kt @@ -28,6 +28,7 @@ import net.ivpn.core.rest.HttpClientFactory import net.ivpn.core.rest.IVPNApi import net.ivpn.core.rest.RequestListener import net.ivpn.core.rest.data.ServersListResponse +import net.ivpn.core.rest.data.model.AntiTracker import net.ivpn.core.rest.data.model.Server import net.ivpn.core.rest.data.model.ServerLocation import net.ivpn.core.rest.data.model.ServerType @@ -46,7 +47,8 @@ class ServersRepository @Inject constructor( private val settings: Settings, private val httpClientFactory: HttpClientFactory, private val protocolController: ProtocolController, - private val serversPreference: ServersPreference + private val serversPreference: ServersPreference, + private val userPreference: EncryptedUserPreference ): Serializable { companion object { @@ -186,7 +188,8 @@ class ServersRepository @Inject constructor( settings.openVpnPortRanges = response.config.ports.openvpn.filter { it.range != null } settings.antiTrackerList = response.config.antiTrackerPlus.list if (settings.antiTracker == null) { - settings.antiTracker = settings.antiTrackerList.first() + val defaultDns = AntiTracker() + settings.antiTracker = defaultDns.getDefaultList(settings.antiTrackerList, settings, userPreference) } for (listener in onServerListUpdatedListeners) { listener.onSuccess(getSuitableServers(response), isForced) diff --git a/core/src/main/java/net/ivpn/core/rest/data/model/AntiTracker.kt b/core/src/main/java/net/ivpn/core/rest/data/model/AntiTracker.kt index 2188f4c8b..aa01145ec 100644 --- a/core/src/main/java/net/ivpn/core/rest/data/model/AntiTracker.kt +++ b/core/src/main/java/net/ivpn/core/rest/data/model/AntiTracker.kt @@ -25,6 +25,8 @@ package net.ivpn.core.rest.data.model import com.google.gson.Gson import com.google.gson.annotations.Expose import com.google.gson.annotations.SerializedName +import net.ivpn.core.common.prefs.EncryptedUserPreference +import net.ivpn.core.common.prefs.Settings class AntiTracker { @@ -57,8 +59,21 @@ class AntiTracker { return description } + fun getDefaultList(lists: List, settings: Settings, userPreference: EncryptedUserPreference): AntiTracker? { + if (userPreference.getSessionToken().isNotEmpty() || settings.isAntiSurveillanceEnabled || settings.isAntiSurveillanceHardcoreEnabled) { + val filteredList = lists.filter { it.name == oisdbigList } + return filteredList.firstOrNull() + } + + val filteredList = lists.filter { it.name == basicList } + return filteredList.firstOrNull() + } + companion object { + const val basicList = "Basic" + const val oisdbigList = "Oisdbig" + fun from(json: String): AntiTracker { return Gson().fromJson(json, AntiTracker::class.java) } From 0f5335ca41f2fadbd3cd37244d5a9b24b74025ec Mon Sep 17 00:00:00 2001 From: Juraj Hilje Date: Wed, 19 Jul 2023 12:12:13 +0200 Subject: [PATCH 24/29] feat(antitracker): update ServersRepository.kt --- .../net/ivpn/core/common/prefs/ServersRepository.kt | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/core/src/main/java/net/ivpn/core/common/prefs/ServersRepository.kt b/core/src/main/java/net/ivpn/core/common/prefs/ServersRepository.kt index 15517938b..d4e135cae 100644 --- a/core/src/main/java/net/ivpn/core/common/prefs/ServersRepository.kt +++ b/core/src/main/java/net/ivpn/core/common/prefs/ServersRepository.kt @@ -268,6 +268,11 @@ class ServersRepository @Inject constructor( settings.openVpnPorts = response.config.ports.openvpn.filter { it.portNumber > 0 } settings.wireGuardPortRanges = response.config.ports.wireguard.filter { it.range != null } settings.openVpnPortRanges = response.config.ports.openvpn.filter { it.range != null } + settings.antiTrackerList = response.config.antiTrackerPlus.list + if (settings.antiTracker == null) { + val defaultDns = AntiTracker() + settings.antiTracker = defaultDns.getDefaultList(settings.antiTrackerList, settings, userPreference) + } setServerList(it.openVpnServerList, it.wireGuardServerList) } } @@ -282,6 +287,11 @@ class ServersRepository @Inject constructor( settings.openVpnPorts = response.config.ports.openvpn.filter { it.portNumber > 0 } settings.wireGuardPortRanges = response.config.ports.wireguard.filter { it.range != null } settings.openVpnPortRanges = response.config.ports.openvpn.filter { it.range != null } + settings.antiTrackerList = response.config.antiTrackerPlus.list + if (settings.antiTracker == null) { + val defaultDns = AntiTracker() + settings.antiTracker = defaultDns.getDefaultList(settings.antiTrackerList, settings, userPreference) + } settings.setIpList(Mapper.stringFromIps(it.config.api.ips)) settings.setIPv6List(Mapper.stringFromIps(it.config.api.ipv6s)) } From 1e988f34ca1a2fcaef06e223ac16321cc5d47ff1 Mon Sep 17 00:00:00 2001 From: Juraj Hilje Date: Wed, 19 Jul 2023 12:34:43 +0200 Subject: [PATCH 25/29] feat(antitracker): update AntiTrackerFragment.kt --- .../java/net/ivpn/core/v2/antitracker/AntiTrackerFragment.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerFragment.kt b/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerFragment.kt index 8c28ccd58..c660315d3 100644 --- a/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerFragment.kt +++ b/core/src/main/java/net/ivpn/core/v2/antitracker/AntiTrackerFragment.kt @@ -110,7 +110,7 @@ class AntiTrackerFragment: Fragment() { private fun readMoreBlockList() { val openURL = Intent(Intent.ACTION_VIEW) - openURL.data = Uri.parse("https://www.ivpn.net/knowledgebase/antitracker/blocklists/") + openURL.data = Uri.parse("https://www.ivpn.net/knowledgebase/general/antitracker-plus-lists-explained/") startActivity(openURL) } From caf07dd581c82556a1c15385130b7d79ad67a324 Mon Sep 17 00:00:00 2001 From: Juraj Hilje Date: Thu, 3 Aug 2023 09:04:06 +0200 Subject: [PATCH 26/29] chore: update app version and build number --- core/build.gradle | 4 ++-- fdroid/build.gradle | 4 ++-- site/build.gradle | 4 ++-- store/build.gradle | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/core/build.gradle b/core/build.gradle index e95fc85b6..e349fc212 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -29,8 +29,8 @@ android { defaultConfig { minSdkVersion 21 targetSdkVersion 31 - versionCode 118 - versionName "2.9.0" + versionCode 120 + versionName "2.10.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunnerArguments clearPackageData: 'true' diff --git a/fdroid/build.gradle b/fdroid/build.gradle index 530017ee6..9e8a22681 100644 --- a/fdroid/build.gradle +++ b/fdroid/build.gradle @@ -31,8 +31,8 @@ android { applicationId "net.ivpn.client" minSdkVersion 21 targetSdkVersion 30 - versionCode 118 - versionName "2.9.0" + versionCode 120 + versionName "2.10.0" manifestPlaceholders = [SENTRY_DSN: keystoreProperties['sentry.dsn']] buildConfigField "String", "BILLING_PUBLIC_KEY", keystoreProperties['billing.public.key'] diff --git a/site/build.gradle b/site/build.gradle index 4cbd3172d..f7214bcd9 100644 --- a/site/build.gradle +++ b/site/build.gradle @@ -30,8 +30,8 @@ android { applicationId "net.ivpn.client" minSdkVersion 21 targetSdkVersion 31 - versionCode 118 - versionName "2.9.0" + versionCode 120 + versionName "2.10.0" manifestPlaceholders = [SENTRY_DSN: keystoreProperties['sentry.dsn']] buildConfigField "String", "BILLING_PUBLIC_KEY", keystoreProperties['billing.public.key'] diff --git a/store/build.gradle b/store/build.gradle index 1824a5bd9..0caf9a356 100644 --- a/store/build.gradle +++ b/store/build.gradle @@ -31,8 +31,8 @@ android { applicationId "net.ivpn.client" minSdkVersion 21 targetSdkVersion 31 - versionCode 118 - versionName "2.9.0" + versionCode 120 + versionName "2.10.0" manifestPlaceholders = [SENTRY_DSN: keystoreProperties['sentry.dsn']] buildConfigField "String", "BILLING_PUBLIC_KEY", keystoreProperties['billing.public.key'] From ffb06c68b97317d965e348668b281c29f25d3bc4 Mon Sep 17 00:00:00 2001 From: Juraj Hilje Date: Thu, 3 Aug 2023 10:17:30 +0200 Subject: [PATCH 27/29] chore: update build number --- core/build.gradle | 2 +- fdroid/build.gradle | 2 +- site/build.gradle | 2 +- store/build.gradle | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/core/build.gradle b/core/build.gradle index e349fc212..5ca25128d 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -29,7 +29,7 @@ android { defaultConfig { minSdkVersion 21 targetSdkVersion 31 - versionCode 120 + versionCode 121 versionName "2.10.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" diff --git a/fdroid/build.gradle b/fdroid/build.gradle index 9e8a22681..409a30de9 100644 --- a/fdroid/build.gradle +++ b/fdroid/build.gradle @@ -31,7 +31,7 @@ android { applicationId "net.ivpn.client" minSdkVersion 21 targetSdkVersion 30 - versionCode 120 + versionCode 121 versionName "2.10.0" manifestPlaceholders = [SENTRY_DSN: keystoreProperties['sentry.dsn']] diff --git a/site/build.gradle b/site/build.gradle index f7214bcd9..73d34487c 100644 --- a/site/build.gradle +++ b/site/build.gradle @@ -30,7 +30,7 @@ android { applicationId "net.ivpn.client" minSdkVersion 21 targetSdkVersion 31 - versionCode 120 + versionCode 121 versionName "2.10.0" manifestPlaceholders = [SENTRY_DSN: keystoreProperties['sentry.dsn']] diff --git a/store/build.gradle b/store/build.gradle index 0caf9a356..7c4d021d9 100644 --- a/store/build.gradle +++ b/store/build.gradle @@ -31,7 +31,7 @@ android { applicationId "net.ivpn.client" minSdkVersion 21 targetSdkVersion 31 - versionCode 120 + versionCode 121 versionName "2.10.0" manifestPlaceholders = [SENTRY_DSN: keystoreProperties['sentry.dsn']] From 0cb7b61d3f6fa5ec5bc540f876657be54bd85147 Mon Sep 17 00:00:00 2001 From: Juraj Hilje Date: Thu, 3 Aug 2023 10:39:32 +0200 Subject: [PATCH 28/29] chore: update servers.json --- core/src/main/assets/servers.json | 472 +++++++++++++++++------------- 1 file changed, 265 insertions(+), 207 deletions(-) diff --git a/core/src/main/assets/servers.json b/core/src/main/assets/servers.json index b76c0f7e7..b5693e018 100644 --- a/core/src/main/assets/servers.json +++ b/core/src/main/assets/servers.json @@ -18,7 +18,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 57.78, + "load": 36.24, "multihop_port": 23810, "v2ray": "37.120.130.61" }, @@ -31,7 +31,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 47.41, + "load": 63.85, "multihop_port": 27001, "v2ray": "89.47.234.130" }, @@ -41,10 +41,12 @@ "host": "176.113.74.221", "public_key": "XSKU6fBCDwlb+mGek1O/fUDd/ozO58ZLph/0H7mn+zE=", "local_ip": "172.16.0.1/12", - "ipv6": {}, - "load": 18.99, + "ipv6": { + "local_ip": "fd00:4956:504e:ffff::/96" + }, + "load": 18.34, "multihop_port": 20480, - "v2ray": "91.232.28.119" + "v2ray": "217.138.213.178" }, { "hostname": "ca-qc3.wg.ivpn.net", @@ -52,10 +54,12 @@ "host": "176.113.74.213", "public_key": "FuxAaDQUKMNblHHgCLKx454seV7eSgwIbysrOWYQFm4=", "local_ip": "172.16.0.1/12", - "ipv6": {}, - "load": 8.2, + "ipv6": { + "local_ip": "fd00:4956:504e:ffff::/96" + }, + "load": 7.25, "multihop_port": 20490, - "v2ray": "91.232.28.119" + "v2ray": "217.138.213.42" }, { "hostname": "ca-qc4.wg.ivpn.net", @@ -63,10 +67,12 @@ "host": "176.113.74.205", "public_key": "2TvVfrRaNla6trqkMUl6wTDFjR+Tg/XglcyZjziQPnU=", "local_ip": "172.16.0.1/12", - "ipv6": {}, - "load": 5.45, + "ipv6": { + "local_ip": "fd00:4956:504e:ffff::/96" + }, + "load": 12.65, "multihop_port": 20530, - "v2ray": "91.232.28.119" + "v2ray": "91.245.254.178" }, { "hostname": "ca-qc5.wg.ivpn.net", @@ -74,10 +80,12 @@ "host": "176.113.74.61", "public_key": "5mevPwr76kh5FPSLyRP4IY99AnqmDViyboRU3UWdUQY=", "local_ip": "172.16.0.1/12", - "ipv6": {}, - "load": 20.56, + "ipv6": { + "local_ip": "fd00:4956:504e:ffff::/96" + }, + "load": 52.27, "multihop_port": 20510, - "v2ray": "91.232.28.119" + "v2ray": "91.245.254.170" }, { "hostname": "ca-qc6.wg.ivpn.net", @@ -85,10 +93,12 @@ "host": "176.113.74.53", "public_key": "EmC/q7Ml4WCiIE1dbIjibJ/XjHwG4n13MtGgVnGLSww=", "local_ip": "172.16.0.1/12", - "ipv6": {}, - "load": 21.37, + "ipv6": { + "local_ip": "fd00:4956:504e:ffff::/96" + }, + "load": 29.07, "multihop_port": 20520, - "v2ray": "91.232.28.119" + "v2ray": "91.245.254.162" } ] }, @@ -110,7 +120,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 11.93, + "load": 29.12, "multihop_port": 23610, "v2ray": "141.255.164.71" }, @@ -123,7 +133,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 35.97, + "load": 32.12, "multihop_port": 23601, "v2ray": "37.120.213.138" }, @@ -136,7 +146,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 34.57, + "load": 65.27, "multihop_port": 22901, "v2ray": "179.43.167.66" } @@ -160,7 +170,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 35.04, + "load": 58.89, "multihop_port": 23010, "v2ray": "185.102.219.56" }, @@ -173,7 +183,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 25.66, + "load": 14.09, "multihop_port": 22001, "v2ray": "178.162.222.166" }, @@ -186,7 +196,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 34.31, + "load": 50.84, "multihop_port": 21050, "v2ray": "146.70.160.166" } @@ -210,7 +220,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 28.01, + "load": 88.1, "multihop_port": 20810, "v2ray": "81.92.202.117" }, @@ -223,7 +233,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 42.25, + "load": 14.55, "multihop_port": 20801, "v2ray": "185.59.221.159" }, @@ -236,7 +246,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 7.77, + "load": 6.88, "multihop_port": 24201, "v2ray": "185.59.221.226" } @@ -260,7 +270,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 17.24, + "load": 11.24, "multihop_port": 24310, "v2ray": "82.102.21.91" }, @@ -273,7 +283,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 54.62, + "load": 26.48, "multihop_port": 21100, "v2ray": "84.17.59.146" } @@ -297,7 +307,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 32.72, + "load": 59.32, "multihop_port": 20301, "v2ray": "185.102.218.99" }, @@ -310,7 +320,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 46.58, + "load": 15.22, "multihop_port": 23101, "v2ray": "95.211.172.72" }, @@ -323,7 +333,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 22.57, + "load": 28.09, "multihop_port": 23201, "v2ray": "95.211.172.99" }, @@ -336,7 +346,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 21.86, + "load": 50.21, "multihop_port": 23901, "v2ray": "95.211.187.225" }, @@ -349,7 +359,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 16.29, + "load": 62.29, "multihop_port": 24101, "v2ray": "95.211.187.231" }, @@ -362,7 +372,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 24.9, + "load": 18.43, "multihop_port": 22501, "v2ray": "95.211.172.107" }, @@ -375,7 +385,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 24.7, + "load": 40.32, "multihop_port": 22801, "v2ray": "95.211.198.169" } @@ -399,7 +409,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 30.88, + "load": 39.22, "multihop_port": 24010, "v2ray": "37.120.153.227" }, @@ -412,7 +422,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 14.87, + "load": 30.9, "multihop_port": 24001, "v2ray": "80.67.10.139" } @@ -436,7 +446,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 7.25, + "load": 8.22, "multihop_port": 26110, "v2ray": "37.120.151.125" }, @@ -449,7 +459,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 66.47, + "load": 65.65, "multihop_port": 26101, "v2ray": "146.70.192.138" } @@ -473,7 +483,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 18.39, + "load": 10.7, "multihop_port": 22210, "v2ray": "185.180.13.38" }, @@ -486,7 +496,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 15.73, + "load": 7.18, "multihop_port": 22201, "v2ray": "216.144.236.42" }, @@ -511,7 +521,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 6.25, + "load": 12.89, "multihop_port": 22401, "v2ray": "216.144.236.66" }, @@ -524,7 +534,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 14.38, + "load": 24.51, "multihop_port": 21301, "v2ray": "198.54.129.212" }, @@ -537,7 +547,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 5.25, + "load": 17.2, "multihop_port": 21901, "v2ray": "216.144.237.82" } @@ -561,7 +571,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 6.69, + "load": 9.52, "multihop_port": 24510, "v2ray": "185.93.0.217" }, @@ -574,7 +584,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 12.57, + "load": 58.94, "multihop_port": 24501, "v2ray": "96.47.236.98" }, @@ -587,7 +597,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 19.84, + "load": 74.67, "multihop_port": 24810, "v2ray": "69.174.102.58" } @@ -611,7 +621,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 11.97, + "load": 9.2, "multihop_port": 21410, "v2ray": "89.187.181.121" }, @@ -624,7 +634,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 9.05, + "load": 9.2, "multihop_port": 21401, "v2ray": "72.11.137.154" }, @@ -637,7 +647,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 7.04, + "load": 17.68, "multihop_port": 24901, "v2ray": "104.129.31.226" } @@ -661,7 +671,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 6.87, + "load": 12.56, "multihop_port": 21210, "v2ray": "91.132.137.173" }, @@ -674,7 +684,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 10.1, + "load": 9.03, "multihop_port": 21801, "v2ray": "212.103.48.199" }, @@ -687,7 +697,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 9.68, + "load": 9.69, "multihop_port": 27601, "v2ray": "89.187.178.150" } @@ -711,7 +721,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 27.35, + "load": 15.86, "multihop_port": 21010, "v2ray": "198.55.124.117" }, @@ -724,7 +734,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 5.53, + "load": 36.28, "multihop_port": 21001, "v2ray": "96.44.142.234" }, @@ -737,7 +747,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 15.64, + "load": 8.08, "multihop_port": 25001, "v2ray": "96.44.144.2" } @@ -761,7 +771,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 38.98, + "load": 57.43, "multihop_port": 25601, "v2ray": "146.70.146.226" } @@ -785,7 +795,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 99.67, + "load": 100, "multihop_port": 26601, "v2ray": "217.138.205.90" }, @@ -798,7 +808,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 57.92, + "load": 93.39, "multihop_port": 27901, "v2ray": "146.70.210.26" } @@ -822,7 +832,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 95.41, + "load": 96.48, "multihop_port": 25701, "v2ray": "37.120.143.130" } @@ -846,7 +856,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 51.22, + "load": 75.49, "multihop_port": 25901, "v2ray": "146.70.53.82" } @@ -870,12 +880,36 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 23.92, + "load": 37.34, "multihop_port": 26701, "v2ray": "45.162.229.146" } ] }, + { + "gateway": "ca-bc.wg.ivpn.net", + "country_code": "CA", + "country": "Canada", + "city": "Vancouver", + "latitude": 49.231, + "longitude": -122.8412, + "isp": "Tech Futures", + "hosts": [ + { + "hostname": "ca-bc1.wg.ivpn.net", + "dns_name": "ca-bc1.gw.ivpn.net", + "host": "38.240.226.167", + "public_key": "lXawKqHosFOoc9kqAZwun9Yk3VrPN7vmG/JuQm4kvx0=", + "local_ip": "172.16.0.1/12", + "ipv6": { + "local_ip": "fd00:4956:504e:ffff::/96" + }, + "load": 49.73, + "multihop_port": 20550, + "v2ray": "38.240.226.169" + } + ] + }, { "gateway": "ca.wg.ivpn.net", "country_code": "CA", @@ -894,7 +928,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 100, + "load": 62.65, "multihop_port": 23801, "v2ray": "104.254.90.74" }, @@ -907,7 +941,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 59.69, + "load": 33.53, "multihop_port": 22101, "v2ray": "172.86.186.162" } @@ -931,7 +965,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 18.59, + "load": 66.12, "multihop_port": 25201, "v2ray": "195.181.160.184" } @@ -955,7 +989,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 100, + "load": 96.92, "multihop_port": 25501, "v2ray": "193.29.107.226" } @@ -979,7 +1013,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 28.54, + "load": 87.01, "multihop_port": 21501, "v2ray": "185.93.3.196" } @@ -1003,7 +1037,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 100, + "load": 61.89, "multihop_port": 26001, "v2ray": "185.103.110.231" } @@ -1027,7 +1061,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 48.39, + "load": 33.88, "multihop_port": 23401, "v2ray": "185.246.211.184" } @@ -1051,7 +1085,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 12.65, + "load": 13.18, "multihop_port": 26901, "v2ray": "89.47.234.130" } @@ -1075,9 +1109,9 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 13.62, + "load": 24.88, "multihop_port": 20540, - "v2ray": "91.232.28.119" + "v2ray": "169.150.252.115" } ] }, @@ -1099,7 +1133,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 44.54, + "load": 37.75, "multihop_port": 27501, "v2ray": "64.120.120.237" }, @@ -1112,7 +1146,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 9.23, + "load": 20.18, "multihop_port": 20460, "v2ray": "118.107.244.207" } @@ -1136,7 +1170,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 42.25, + "load": 86.19, "multihop_port": 25401, "v2ray": "37.120.144.178" } @@ -1160,7 +1194,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 38.07, + "load": 66.1, "multihop_port": 27301, "v2ray": "185.191.207.199" } @@ -1208,7 +1242,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 25.22, + "load": 36.91, "multihop_port": 20830, "v2ray": "185.135.77.100" } @@ -1232,7 +1266,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 95.32, + "load": 97.15, "multihop_port": 27201, "v2ray": "92.223.89.228" } @@ -1250,13 +1284,13 @@ { "hostname": "my1.wg.ivpn.net", "dns_name": "my1.gw.ivpn.net", - "host": "61.4.97.153", + "host": "61.4.97.154", "public_key": "M9SsMCpUw7ad6YbqQr8r2saBK2zAf3tBj82DzsQjgkY=", "local_ip": "172.16.0.1/12", "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 8.27, + "load": 6.7, "multihop_port": 20470, "v2ray": "61.4.97.154" } @@ -1278,7 +1312,7 @@ "public_key": "xFO6ksbO3Gr05rRgAW0O5Veoi4bpTgz2G9RvtBzK7Cg=", "local_ip": "172.16.0.1/12", "ipv6": {}, - "load": 40.41, + "load": 30.84, "multihop_port": 25301, "v2ray": "217.170.197.28" } @@ -1302,7 +1336,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 83.27, + "load": 100, "multihop_port": 25101, "v2ray": "185.246.208.87" } @@ -1326,7 +1360,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 10.91, + "load": 13.03, "multihop_port": 27101, "v2ray": "94.46.175.130" } @@ -1350,7 +1384,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 100, + "load": 89.34, "multihop_port": 22301, "v2ray": "185.120.147.58" } @@ -1374,7 +1408,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 36.45, + "load": 100, "multihop_port": 26801, "v2ray": "146.70.111.114" } @@ -1398,9 +1432,9 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 39.25, + "load": 49.96, "multihop_port": 20400, - "v2ray": "84.17.59.146" + "v2ray": "156.146.40.208" } ] }, @@ -1422,7 +1456,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 28.43, + "load": 7.21, "multihop_port": 20820, "v2ray": "185.189.160.21" } @@ -1446,7 +1480,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 17.06, + "load": 23.74, "multihop_port": 20450, "v2ray": "91.232.28.119" } @@ -1470,7 +1504,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 16.81, + "load": 12.77, "multihop_port": 26401, "v2ray": "193.37.254.50" } @@ -1494,7 +1528,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 5.68, + "load": 9.46, "multihop_port": 24601, "v2ray": "96.47.236.98" } @@ -1518,7 +1552,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 34.26, + "load": 40.76, "multihop_port": 21610, "v2ray": "23.226.129.114" }, @@ -1531,7 +1565,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 9.92, + "load": 20.11, "multihop_port": 27401, "v2ray": "37.120.202.42" } @@ -1555,7 +1589,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 30.73, + "load": 22.98, "multihop_port": 26501, "v2ray": "185.242.5.146" } @@ -1579,7 +1613,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 24.69, + "load": 57.24, "multihop_port": 24401, "v2ray": "206.190.145.88" } @@ -1603,7 +1637,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 31.87, + "load": 38.43, "multihop_port": 27701, "v2ray": "37.19.206.111" } @@ -1627,7 +1661,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 33.15, + "load": 33.86, "multihop_port": 27801, "v2ray": "198.44.131.20" } @@ -1651,7 +1685,7 @@ "ipv6": { "local_ip": "fd00:4956:504e:ffff::/96" }, - "load": 13.61, + "load": 20.11, "multihop_port": 20840, "v2ray": "169.150.238.109" } @@ -1672,7 +1706,7 @@ "hostname": "at1.gw.ivpn.net", "dns_name": "at1.gw.ivpn.net", "host": "185.244.212.66", - "load": 38.98, + "load": 57.43, "multihop_port": 25601, "obfs": { "obfs3_multihop_port": 25602, @@ -1696,7 +1730,7 @@ "hostname": "au-nsw1.gw.ivpn.net", "dns_name": "au-nsw1.gw.ivpn.net", "host": "46.102.153.242", - "load": 99.67, + "load": 100, "multihop_port": 26601, "obfs": { "obfs3_multihop_port": 26602, @@ -1709,7 +1743,7 @@ "hostname": "au-nsw2.gw.ivpn.net", "dns_name": "au-nsw2.gw.ivpn.net", "host": "146.70.78.74", - "load": 57.92, + "load": 93.39, "multihop_port": 27901, "obfs": { "obfs3_multihop_port": 27902, @@ -1733,7 +1767,7 @@ "hostname": "be1.gw.ivpn.net", "dns_name": "be1.gw.ivpn.net", "host": "194.187.251.10", - "load": 95.41, + "load": 96.48, "multihop_port": 25701, "obfs": { "obfs3_multihop_port": 25702, @@ -1757,7 +1791,7 @@ "hostname": "bg1.gw.ivpn.net", "dns_name": "bg1.gw.ivpn.net", "host": "82.102.23.18", - "load": 51.22, + "load": 75.49, "multihop_port": 25901, "obfs": { "obfs3_multihop_port": 25902, @@ -1781,7 +1815,7 @@ "hostname": "br1.gw.ivpn.net", "dns_name": "br1.gw.ivpn.net", "host": "45.162.229.130", - "load": 23.92, + "load": 37.34, "multihop_port": 26701, "obfs": { "obfs3_multihop_port": 26702, @@ -1792,6 +1826,30 @@ } ] }, + { + "gateway": "ca-bc.gw.ivpn.net", + "country_code": "CA", + "country": "Canada", + "city": "Vancouver", + "latitude": 49.231, + "longitude": -122.8412, + "isp": "Tech Futures", + "hosts": [ + { + "hostname": "ca-bc1.gw.ivpn.net", + "dns_name": "ca-bc1.gw.ivpn.net", + "host": "38.240.226.164", + "load": 49.73, + "multihop_port": 20550, + "obfs": { + "obfs3_multihop_port": 20551, + "obfs4_multihop_port": 20552, + "obfs4_key": "EE2sCZ06sv+v/UIezUZLFrey101UpbHVG8ZD0G303wCzusXbkK4Bi+tzg0J7DM9v7YLwBg" + }, + "v2ray": "38.240.226.169" + } + ] + }, { "gateway": "ca-qc.gw.ivpn.net", "country_code": "CA", @@ -1805,7 +1863,7 @@ "hostname": "ca-qc1.gw.ivpn.net", "dns_name": "ca-qc1.gw.ivpn.net", "host": "87.101.92.26", - "load": 47.41, + "load": 63.85, "multihop_port": 27001, "obfs": { "obfs3_multihop_port": 27002, @@ -1818,66 +1876,66 @@ "hostname": "ca-qc2.gw.ivpn.net", "dns_name": "ca-qc2.gw.ivpn.net", "host": "176.113.74.218", - "load": 18.99, + "load": 18.34, "multihop_port": 20480, "obfs": { "obfs3_multihop_port": 20481, "obfs4_multihop_port": 20482, "obfs4_key": "hfhRyd1nnfLN2QcWgqQo2iDkj6+Z71t2h4dbcsmBT5pZNBpWg3pbRfGQ0u6RCanCyK6xQA" }, - "v2ray": "91.232.28.119" + "v2ray": "217.138.213.178" }, { "hostname": "ca-qc3.gw.ivpn.net", "dns_name": "ca-qc3.gw.ivpn.net", "host": "176.113.74.210", - "load": 8.2, + "load": 7.25, "multihop_port": 20490, "obfs": { "obfs3_multihop_port": 20491, "obfs4_multihop_port": 20492, "obfs4_key": "OmTrtypg1CDeh4tp5YUI/cORh9kIx7vCDr1BX3dXkZzisVibJF8MM0mer1FzXvsUVzsAdQ" }, - "v2ray": "91.232.28.119" + "v2ray": "217.138.213.42" }, { "hostname": "ca-qc4.gw.ivpn.net", "dns_name": "ca-qc4.gw.ivpn.net", "host": "176.113.74.202", - "load": 5.45, + "load": 12.65, "multihop_port": 20530, "obfs": { "obfs3_multihop_port": 20531, "obfs4_multihop_port": 20532, "obfs4_key": "suyrkXPCwShk2Gqsqn+p5Oxcaav8CMy6ipQ6xuYhKfgFzb27r7q1iBul4GjUFVGptupdTQ" }, - "v2ray": "91.232.28.119" + "v2ray": "91.245.254.178" }, { "hostname": "ca-qc5.gw.ivpn.net", "dns_name": "ca-qc5.gw.ivpn.net", "host": "176.113.74.58", - "load": 20.56, + "load": 52.27, "multihop_port": 20510, "obfs": { "obfs3_multihop_port": 20511, "obfs4_multihop_port": 20512, "obfs4_key": "tsMtioiS8J+LzNE6+xbMMqpZho6OMVuPGY0IKjd7jXEX5jg3Pwk1szhj4mOYeiqgBCo8TQ" }, - "v2ray": "91.232.28.119" + "v2ray": "91.245.254.170" }, { "hostname": "ca-qc6.gw.ivpn.net", "dns_name": "ca-qc6.gw.ivpn.net", "host": "176.113.74.50", - "load": 21.37, + "load": 29.07, "multihop_port": 20520, "obfs": { "obfs3_multihop_port": 20521, "obfs4_multihop_port": 20522, "obfs4_key": "ujj7QPeqPyjsm/d1o9G0O/FcOfjJqFq6iNdo+pC4hTuHT83sN2nXhcBvJtaKyV0Z439GRA" }, - "v2ray": "91.232.28.119" + "v2ray": "91.245.254.162" } ] }, @@ -1894,7 +1952,7 @@ "hostname": "ca1.gw.ivpn.net", "dns_name": "ca1.gw.ivpn.net", "host": "104.254.90.178", - "load": 100, + "load": 62.65, "multihop_port": 23801, "obfs": { "obfs3_multihop_port": 23802, @@ -1907,7 +1965,7 @@ "hostname": "ca2.gw.ivpn.net", "dns_name": "ca2.gw.ivpn.net", "host": "172.86.186.170", - "load": 59.69, + "load": 33.53, "multihop_port": 22101, "obfs": { "obfs3_multihop_port": 22102, @@ -1931,7 +1989,7 @@ "hostname": "ch1.gw.ivpn.net", "dns_name": "ch1.gw.ivpn.net", "host": "185.212.170.138", - "load": 35.97, + "load": 32.12, "multihop_port": 23601, "obfs": { "obfs3_multihop_port": 23602, @@ -1944,7 +2002,7 @@ "hostname": "ch3.gw.ivpn.net", "dns_name": "ch3.gw.ivpn.net", "host": "141.255.166.194", - "load": 34.57, + "load": 65.27, "multihop_port": 22901, "obfs": { "obfs3_multihop_port": 22902, @@ -1968,7 +2026,7 @@ "hostname": "cz1.gw.ivpn.net", "dns_name": "cz1.gw.ivpn.net", "host": "195.181.160.167", - "load": 18.59, + "load": 66.12, "multihop_port": 25201, "obfs": { "obfs3_multihop_port": 25202, @@ -1992,7 +2050,7 @@ "hostname": "de2.gw.ivpn.net", "dns_name": "de2.gw.ivpn.net", "host": "178.162.211.114", - "load": 25.66, + "load": 14.09, "multihop_port": 22001, "obfs": { "obfs3_multihop_port": 22002, @@ -2005,7 +2063,7 @@ "hostname": "de3.gw.ivpn.net", "dns_name": "de3.gw.ivpn.net", "host": "146.70.160.162", - "load": 34.31, + "load": 50.84, "multihop_port": 21050, "obfs": { "obfs3_multihop_port": 21051, @@ -2029,7 +2087,7 @@ "hostname": "dk1.gw.ivpn.net", "dns_name": "dk1.gw.ivpn.net", "host": "185.245.84.226", - "load": 100, + "load": 96.92, "multihop_port": 25501, "obfs": { "obfs3_multihop_port": 25502, @@ -2053,7 +2111,7 @@ "hostname": "es1.gw.ivpn.net", "dns_name": "es1.gw.ivpn.net", "host": "185.93.3.193", - "load": 28.54, + "load": 87.01, "multihop_port": 21501, "obfs": { "obfs3_multihop_port": 21502, @@ -2077,7 +2135,7 @@ "hostname": "fi1.gw.ivpn.net", "dns_name": "fi1.gw.ivpn.net", "host": "185.112.82.12", - "load": 100, + "load": 61.89, "multihop_port": 26001, "obfs": { "obfs3_multihop_port": 26002, @@ -2101,7 +2159,7 @@ "hostname": "fr1.gw.ivpn.net", "dns_name": "fr1.gw.ivpn.net", "host": "185.246.211.179", - "load": 48.39, + "load": 33.88, "multihop_port": 23401, "obfs": { "obfs3_multihop_port": 23402, @@ -2125,7 +2183,7 @@ "hostname": "gb-man1.gw.ivpn.net", "dns_name": "gb-man1.gw.ivpn.net", "host": "89.238.141.228", - "load": 12.65, + "load": 13.18, "multihop_port": 26901, "obfs": { "obfs3_multihop_port": 26902, @@ -2149,7 +2207,7 @@ "hostname": "gb1.gw.ivpn.net", "dns_name": "gb1.gw.ivpn.net", "host": "185.59.221.133", - "load": 42.25, + "load": 14.55, "multihop_port": 20801, "obfs": { "obfs3_multihop_port": 20802, @@ -2162,7 +2220,7 @@ "hostname": "gb2.gw.ivpn.net", "dns_name": "gb2.gw.ivpn.net", "host": "185.59.221.88", - "load": 7.77, + "load": 6.88, "multihop_port": 24201, "obfs": { "obfs3_multihop_port": 24202, @@ -2186,14 +2244,14 @@ "hostname": "gr1.gw.ivpn.net", "dns_name": "gr1.gw.ivpn.net", "host": "169.150.252.110", - "load": 13.62, + "load": 24.88, "multihop_port": 20540, "obfs": { "obfs3_multihop_port": 20541, "obfs4_multihop_port": 20542, "obfs4_key": "zyWssFvuJOCSBixUnRaF0qk+BLJQbnm7YpZ5oSVk5ElIksjA7OvwigQBc2NF2kt9/lQSEw" }, - "v2ray": "91.232.28.119" + "v2ray": "169.150.252.115" } ] }, @@ -2210,7 +2268,7 @@ "hostname": "hk2.gw.ivpn.net", "dns_name": "hk2.gw.ivpn.net", "host": "209.58.188.13", - "load": 44.54, + "load": 37.75, "multihop_port": 27501, "obfs": { "obfs3_multihop_port": 27502, @@ -2223,7 +2281,7 @@ "hostname": "hk3.gw.ivpn.net", "dns_name": "hk3.gw.ivpn.net", "host": "118.107.244.184", - "load": 9.23, + "load": 20.18, "multihop_port": 20460, "obfs": { "obfs3_multihop_port": 20461, @@ -2247,7 +2305,7 @@ "hostname": "hu1.gw.ivpn.net", "dns_name": "hu1.gw.ivpn.net", "host": "185.189.114.186", - "load": 42.25, + "load": 86.19, "multihop_port": 25401, "obfs": { "obfs3_multihop_port": 25402, @@ -2271,7 +2329,7 @@ "hostname": "il1.gw.ivpn.net", "dns_name": "il1.gw.ivpn.net", "host": "185.191.207.194", - "load": 38.07, + "load": 66.1, "multihop_port": 27301, "obfs": { "obfs3_multihop_port": 27302, @@ -2319,7 +2377,7 @@ "hostname": "it2.gw.ivpn.net", "dns_name": "it2.gw.ivpn.net", "host": "84.17.59.137", - "load": 54.62, + "load": 26.48, "multihop_port": 21100, "obfs": { "obfs3_multihop_port": 21101, @@ -2343,7 +2401,7 @@ "hostname": "jp2.gw.ivpn.net", "dns_name": "jp2.gw.ivpn.net", "host": "185.135.77.35", - "load": 25.22, + "load": 36.91, "multihop_port": 20830, "obfs": { "obfs3_multihop_port": 20831, @@ -2367,7 +2425,7 @@ "hostname": "lu1.gw.ivpn.net", "dns_name": "lu1.gw.ivpn.net", "host": "92.223.89.53", - "load": 95.32, + "load": 97.15, "multihop_port": 27201, "obfs": { "obfs3_multihop_port": 27202, @@ -2391,7 +2449,7 @@ "hostname": "my1.gw.ivpn.net", "dns_name": "my1.gw.ivpn.net", "host": "61.4.97.148", - "load": 8.27, + "load": 6.7, "multihop_port": 20470, "obfs": { "obfs3_multihop_port": 20471, @@ -2415,7 +2473,7 @@ "hostname": "nl3.gw.ivpn.net", "dns_name": "nl3.gw.ivpn.net", "host": "95.211.172.68", - "load": 46.58, + "load": 15.22, "multihop_port": 23101, "obfs": { "obfs3_multihop_port": 23102, @@ -2428,7 +2486,7 @@ "hostname": "nl4.gw.ivpn.net", "dns_name": "nl4.gw.ivpn.net", "host": "95.211.172.95", - "load": 22.57, + "load": 28.09, "multihop_port": 23201, "obfs": { "obfs3_multihop_port": 23202, @@ -2441,7 +2499,7 @@ "hostname": "nl5.gw.ivpn.net", "dns_name": "nl5.gw.ivpn.net", "host": "95.211.187.222", - "load": 21.86, + "load": 50.21, "multihop_port": 23901, "obfs": { "obfs3_multihop_port": 23902, @@ -2454,7 +2512,7 @@ "hostname": "nl6.gw.ivpn.net", "dns_name": "nl6.gw.ivpn.net", "host": "95.211.187.228", - "load": 16.29, + "load": 62.29, "multihop_port": 24101, "obfs": { "obfs3_multihop_port": 24102, @@ -2467,7 +2525,7 @@ "hostname": "nl7.gw.ivpn.net", "dns_name": "nl7.gw.ivpn.net", "host": "95.211.95.22", - "load": 24.9, + "load": 18.43, "multihop_port": 22501, "obfs": { "obfs3_multihop_port": 22502, @@ -2480,7 +2538,7 @@ "hostname": "nl8.gw.ivpn.net", "dns_name": "nl8.gw.ivpn.net", "host": "95.211.172.18", - "load": 24.7, + "load": 40.32, "multihop_port": 22801, "obfs": { "obfs3_multihop_port": 22802, @@ -2504,7 +2562,7 @@ "hostname": "no1.gw.ivpn.net", "dns_name": "no1.gw.ivpn.net", "host": "194.242.10.150", - "load": 40.41, + "load": 30.84, "multihop_port": 25301, "obfs": { "obfs3_multihop_port": 25302, @@ -2528,7 +2586,7 @@ "hostname": "pl1.gw.ivpn.net", "dns_name": "pl1.gw.ivpn.net", "host": "185.246.208.86", - "load": 83.27, + "load": 100, "multihop_port": 25101, "obfs": { "obfs3_multihop_port": 25102, @@ -2552,7 +2610,7 @@ "hostname": "pt1.gw.ivpn.net", "dns_name": "pt1.gw.ivpn.net", "host": "94.46.175.112", - "load": 10.91, + "load": 13.03, "multihop_port": 27101, "obfs": { "obfs3_multihop_port": 27102, @@ -2576,7 +2634,7 @@ "hostname": "ro1.gw.ivpn.net", "dns_name": "ro1.gw.ivpn.net", "host": "37.120.206.50", - "load": 100, + "load": 89.34, "multihop_port": 22301, "obfs": { "obfs3_multihop_port": 22302, @@ -2600,7 +2658,7 @@ "hostname": "rs1.gw.ivpn.net", "dns_name": "rs1.gw.ivpn.net", "host": "141.98.103.250", - "load": 36.45, + "load": 100, "multihop_port": 26801, "obfs": { "obfs3_multihop_port": 26802, @@ -2624,7 +2682,7 @@ "hostname": "se1.gw.ivpn.net", "dns_name": "se1.gw.ivpn.net", "host": "80.67.10.138", - "load": 14.87, + "load": 30.9, "multihop_port": 24001, "obfs": { "obfs3_multihop_port": 24002, @@ -2648,7 +2706,7 @@ "hostname": "sg1.gw.ivpn.net", "dns_name": "sg1.gw.ivpn.net", "host": "185.128.24.186", - "load": 66.47, + "load": 65.65, "multihop_port": 26101, "obfs": { "obfs3_multihop_port": 26102, @@ -2672,14 +2730,14 @@ "hostname": "sk2.gw.ivpn.net", "dns_name": "sk2.gw.ivpn.net", "host": "156.146.40.202", - "load": 39.25, + "load": 49.96, "multihop_port": 20400, "obfs": { "obfs3_multihop_port": 20401, "obfs4_multihop_port": 20402, "obfs4_key": "ALsqb8RNZcvMzBsxnf4WQQYklUL0P6TUhyoXiwK1XPOEcCtW278YediLvTvOMeD5WLkPKg" }, - "v2ray": "84.17.59.146" + "v2ray": "156.146.40.208" } ] }, @@ -2696,7 +2754,7 @@ "hostname": "tw1.gw.ivpn.net", "dns_name": "tw1.gw.ivpn.net", "host": "185.189.160.6", - "load": 28.43, + "load": 7.21, "multihop_port": 20820, "obfs": { "obfs3_multihop_port": 20821, @@ -2720,7 +2778,7 @@ "hostname": "ua2.gw.ivpn.net", "dns_name": "ua2.gw.ivpn.net", "host": "91.232.28.126", - "load": 17.06, + "load": 23.74, "multihop_port": 20450, "obfs": { "obfs3_multihop_port": 20451, @@ -2744,7 +2802,7 @@ "hostname": "us-az1.gw.ivpn.net", "dns_name": "us-az1.gw.ivpn.net", "host": "193.37.254.130", - "load": 16.81, + "load": 12.77, "multihop_port": 26401, "obfs": { "obfs3_multihop_port": 26402, @@ -2768,7 +2826,7 @@ "hostname": "us-ca1.gw.ivpn.net", "dns_name": "us-ca1.gw.ivpn.net", "host": "173.254.196.58", - "load": 15.73, + "load": 7.18, "multihop_port": 22201, "obfs": { "obfs3_multihop_port": 22202, @@ -2793,7 +2851,7 @@ "hostname": "us-ca2.gw.ivpn.net", "dns_name": "us-ca2.gw.ivpn.net", "host": "69.12.80.146", - "load": 6.25, + "load": 12.89, "multihop_port": 22401, "obfs": { "obfs3_multihop_port": 22402, @@ -2806,7 +2864,7 @@ "hostname": "us-ca3.gw.ivpn.net", "dns_name": "us-ca3.gw.ivpn.net", "host": "198.54.129.99", - "load": 14.38, + "load": 24.51, "multihop_port": 21301, "obfs": { "obfs3_multihop_port": 21302, @@ -2819,7 +2877,7 @@ "hostname": "us-ca4.gw.ivpn.net", "dns_name": "us-ca4.gw.ivpn.net", "host": "173.254.204.202", - "load": 5.25, + "load": 17.2, "multihop_port": 21901, "obfs": { "obfs3_multihop_port": 21902, @@ -2843,7 +2901,7 @@ "hostname": "us-fl1.gw.ivpn.net", "dns_name": "us-fl1.gw.ivpn.net", "host": "173.44.49.90", - "load": 5.68, + "load": 9.46, "multihop_port": 24601, "obfs": { "obfs3_multihop_port": 24602, @@ -2867,7 +2925,7 @@ "hostname": "us-ga1.gw.ivpn.net", "dns_name": "us-ga1.gw.ivpn.net", "host": "104.129.24.146", - "load": 12.57, + "load": 58.94, "multihop_port": 24501, "obfs": { "obfs3_multihop_port": 24502, @@ -2880,7 +2938,7 @@ "hostname": "us-ga2.gw.ivpn.net", "dns_name": "us-ga2.gw.ivpn.net", "host": "107.150.22.74", - "load": 19.84, + "load": 74.67, "multihop_port": 24810, "obfs": { "obfs3_multihop_port": 24811, @@ -2904,7 +2962,7 @@ "hostname": "us-il1.gw.ivpn.net", "dns_name": "us-il1.gw.ivpn.net", "host": "107.150.28.82", - "load": 9.05, + "load": 9.2, "multihop_port": 21401, "obfs": { "obfs3_multihop_port": 21402, @@ -2917,7 +2975,7 @@ "hostname": "us-il2.gw.ivpn.net", "dns_name": "us-il2.gw.ivpn.net", "host": "72.11.137.146", - "load": 7.04, + "load": 17.68, "multihop_port": 24901, "obfs": { "obfs3_multihop_port": 24902, @@ -2941,7 +2999,7 @@ "hostname": "us-nj3.gw.ivpn.net", "dns_name": "us-nj3.gw.ivpn.net", "host": "23.226.128.18", - "load": 34.26, + "load": 40.76, "multihop_port": 21610, "obfs": { "obfs3_multihop_port": 21611, @@ -2954,7 +3012,7 @@ "hostname": "us-nj4.gw.ivpn.net", "dns_name": "us-nj4.gw.ivpn.net", "host": "194.36.111.50", - "load": 9.92, + "load": 20.11, "multihop_port": 27401, "obfs": { "obfs3_multihop_port": 27402, @@ -2978,7 +3036,7 @@ "hostname": "us-nv1.gw.ivpn.net", "dns_name": "us-nv1.gw.ivpn.net", "host": "185.242.5.34", - "load": 30.73, + "load": 22.98, "multihop_port": 26501, "obfs": { "obfs3_multihop_port": 26502, @@ -3002,7 +3060,7 @@ "hostname": "us-ny2.gw.ivpn.net", "dns_name": "us-ny2.gw.ivpn.net", "host": "212.103.48.194", - "load": 10.1, + "load": 9.03, "multihop_port": 21801, "obfs": { "obfs3_multihop_port": 21802, @@ -3015,7 +3073,7 @@ "hostname": "us-ny3.gw.ivpn.net", "dns_name": "us-ny3.gw.ivpn.net", "host": "89.187.178.144", - "load": 9.68, + "load": 9.69, "multihop_port": 27601, "obfs": { "obfs3_multihop_port": 27602, @@ -3039,7 +3097,7 @@ "hostname": "us-tx1.gw.ivpn.net", "dns_name": "us-tx1.gw.ivpn.net", "host": "96.44.189.194", - "load": 5.53, + "load": 36.28, "multihop_port": 21001, "obfs": { "obfs3_multihop_port": 21002, @@ -3052,7 +3110,7 @@ "hostname": "us-tx2.gw.ivpn.net", "dns_name": "us-tx2.gw.ivpn.net", "host": "96.44.142.74", - "load": 15.64, + "load": 8.08, "multihop_port": 25001, "obfs": { "obfs3_multihop_port": 25002, @@ -3076,7 +3134,7 @@ "hostname": "us-ut1.gw.ivpn.net", "dns_name": "us-ut1.gw.ivpn.net", "host": "198.105.216.28", - "load": 24.69, + "load": 57.24, "multihop_port": 24401, "obfs": { "obfs3_multihop_port": 24402, @@ -3100,7 +3158,7 @@ "hostname": "us-va1.gw.ivpn.net", "dns_name": "us-va1.gw.ivpn.net", "host": "37.19.206.105", - "load": 31.87, + "load": 38.43, "multihop_port": 27701, "obfs": { "obfs3_multihop_port": 27702, @@ -3124,7 +3182,7 @@ "hostname": "us-wa2.gw.ivpn.net", "dns_name": "us-wa2.gw.ivpn.net", "host": "198.44.131.3", - "load": 33.15, + "load": 33.86, "multihop_port": 27801, "obfs": { "obfs3_multihop_port": 27802, @@ -3148,7 +3206,7 @@ "hostname": "za1.gw.ivpn.net", "dns_name": "za1.gw.ivpn.net", "host": "169.150.238.103", - "load": 13.61, + "load": 20.11, "multihop_port": 20840, "obfs": { "obfs3_multihop_port": 20841, @@ -3173,12 +3231,6 @@ }, "antitracker_plus": { "DnsServers": [ - { - "Name": "Oisdbig", - "Description": "OISD Big list", - "Normal": "10.0.254.2", - "Hardcore": "10.0.254.3" - }, { "Name": "Basic", "Description": "Basic", @@ -3192,28 +3244,34 @@ "Hardcore": "10.0.254.7" }, { - "Name": "Developerdan", - "Description": "Developer Dan Main list", - "Normal": "10.0.254.8", - "Hardcore": "10.0.254.9" + "Name": "Restrictive", + "Description": "Restrictive", + "Normal": "10.0.254.18", + "Hardcore": "10.0.254.19" }, { - "Name": "Hagezipro", - "Description": "Hagezi Pro", - "Normal": "10.0.254.10", - "Hardcore": "10.0.254.11" + "Name": "Easylist", + "Description": "EasyList + EasyPrivacy", + "Normal": "10.0.254.14", + "Hardcore": "10.0.254.15" }, { - "Name": "Hageziultimate", - "Description": "Hagezi Ultimate", - "Normal": "10.0.254.12", - "Hardcore": "10.0.254.13" + "Name": "Oisdbig", + "Description": "OISD Big", + "Normal": "10.0.254.2", + "Hardcore": "10.0.254.3" }, { - "Name": "Notracking", - "Description": "Notracking Main list", - "Normal": "10.0.254.14", - "Hardcore": "10.0.254.15" + "Name": "Developerdan", + "Description": "Developer Dan Ads + Tracking", + "Normal": "10.0.254.8", + "Hardcore": "10.0.254.9" + }, + { + "Name": "Stevenblack", + "Description": "Steven Black Unified + Ads + Malware", + "Normal": "10.0.254.20", + "Hardcore": "10.0.254.21" }, { "Name": "Onehostextra", @@ -3222,16 +3280,16 @@ "Hardcore": "10.0.254.17" }, { - "Name": "Restrictive", - "Description": "Restrictive", - "Normal": "10.0.254.18", - "Hardcore": "10.0.254.19" + "Name": "Hagezipro", + "Description": "Hagezi Pro", + "Normal": "10.0.254.10", + "Hardcore": "10.0.254.11" }, { - "Name": "Stevenblack", - "Description": "Steven Black Unified + Ads + Malware", - "Normal": "10.0.254.20", - "Hardcore": "10.0.254.21" + "Name": "Hageziultimate", + "Description": "Hagezi Ultimate", + "Normal": "10.0.254.12", + "Hardcore": "10.0.254.13" } ] }, From 468ceb1ef602bd6c5ad11b011ab391be40650ba8 Mon Sep 17 00:00:00 2001 From: Juraj Hilje Date: Thu, 3 Aug 2023 10:40:07 +0200 Subject: [PATCH 29/29] chore: update build number --- core/build.gradle | 2 +- fdroid/build.gradle | 2 +- site/build.gradle | 2 +- store/build.gradle | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/core/build.gradle b/core/build.gradle index 5ca25128d..d35614e88 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -29,7 +29,7 @@ android { defaultConfig { minSdkVersion 21 targetSdkVersion 31 - versionCode 121 + versionCode 122 versionName "2.10.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" diff --git a/fdroid/build.gradle b/fdroid/build.gradle index 409a30de9..21be26a39 100644 --- a/fdroid/build.gradle +++ b/fdroid/build.gradle @@ -31,7 +31,7 @@ android { applicationId "net.ivpn.client" minSdkVersion 21 targetSdkVersion 30 - versionCode 121 + versionCode 122 versionName "2.10.0" manifestPlaceholders = [SENTRY_DSN: keystoreProperties['sentry.dsn']] diff --git a/site/build.gradle b/site/build.gradle index 73d34487c..7b9dcc542 100644 --- a/site/build.gradle +++ b/site/build.gradle @@ -30,7 +30,7 @@ android { applicationId "net.ivpn.client" minSdkVersion 21 targetSdkVersion 31 - versionCode 121 + versionCode 122 versionName "2.10.0" manifestPlaceholders = [SENTRY_DSN: keystoreProperties['sentry.dsn']] diff --git a/store/build.gradle b/store/build.gradle index 7c4d021d9..1ce4e5d5b 100644 --- a/store/build.gradle +++ b/store/build.gradle @@ -31,7 +31,7 @@ android { applicationId "net.ivpn.client" minSdkVersion 21 targetSdkVersion 31 - versionCode 121 + versionCode 122 versionName "2.10.0" manifestPlaceholders = [SENTRY_DSN: keystoreProperties['sentry.dsn']]