From 0ae5848aa700b0e4c014f42b84c81c972c860c14 Mon Sep 17 00:00:00 2001 From: deeppandya Date: Wed, 24 Jul 2024 01:05:25 +0530 Subject: [PATCH 01/31] Add changes to generate mojom ref for java Update Region model with more params --- build/android/config.gni | 1 + .../brave_vpn_region_data_manager.cc | 38 +++++++++++++++---- .../brave_vpn/common/brave_vpn_constants.h | 7 +++- components/brave_vpn/common/mojom/BUILD.gn | 1 + .../brave_vpn/common/mojom/brave_vpn.mojom | 8 +++- 5 files changed, 46 insertions(+), 9 deletions(-) diff --git a/build/android/config.gni b/build/android/config.gni index 0e16169c1f0..d8f3ee7cfd4 100644 --- a/build/android/config.gni +++ b/build/android/config.gni @@ -40,6 +40,7 @@ brave_chrome_java_deps = [ "//brave/components/playlist/common/mojom:mojom_java", "//brave/components/safe_browsing/android:brave_safe_browsing_java", "//brave/components/url_sanitizer/common/mojom:mojom_java", + "//brave/components/brave_vpn/common/mojom:mojom_java", "//brave/components/variations/android:java", "//brave/components/version_info/android:java", "//brave/third_party/android_deps:com_airbnb_android_java", diff --git a/components/brave_vpn/browser/connection/brave_vpn_region_data_manager.cc b/components/brave_vpn/browser/connection/brave_vpn_region_data_manager.cc index b407a05dcbb..2884257cd0e 100644 --- a/components/brave_vpn/browser/connection/brave_vpn_region_data_manager.cc +++ b/components/brave_vpn/browser/connection/brave_vpn_region_data_manager.cc @@ -24,18 +24,26 @@ namespace { base::Value::Dict GetValueFromRegion(const mojom::Region& region) { base::Value::Dict region_dict; - region_dict.Set(kRegionContinentKey, region.continent); region_dict.Set(kRegionNameKey, region.name); region_dict.Set(kRegionNamePrettyKey, region.name_pretty); + region_dict.Set(kRegionContinentKey, region.continent); region_dict.Set(kRegionCountryIsoCodeKey, region.country_iso_code); + region_dict.Set(kRegionPrecisionKey, region.region_precision); + region_dict.Set(kRegionLatitudeKey, region.latitude); + region_dict.Set(kRegionLongitudeKey, region.longitude); + region_dict.Set(kRegionServerCountKey, region.server_count); return region_dict; } bool IsValidRegionValue(const base::Value::Dict& value) { - if (!value.FindString(kRegionContinentKey) || - !value.FindString(kRegionNameKey) || + if (!value.FindString(kRegionNameKey) || !value.FindString(kRegionNamePrettyKey) || - !value.FindString(kRegionCountryIsoCodeKey)) { + !value.FindString(kRegionContinentKey) || + !value.FindString(kRegionCountryIsoCodeKey) || + !value.FindString(kRegionPrecisionKey) || + !value.FindString(kRegionLatitudeKey) || + !value.FindString(kRegionLongitudeKey) || + !value.FindString(kRegionServerCountKey)) { return false; } @@ -44,19 +52,35 @@ bool IsValidRegionValue(const base::Value::Dict& value) { mojom::Region GetRegionFromValue(const base::Value::Dict& value) { mojom::Region region; - if (auto* continent = value.FindString(brave_vpn::kRegionContinentKey)) { - region.continent = *continent; - } if (auto* name = value.FindString(brave_vpn::kRegionNameKey)) { region.name = *name; } if (auto* name_pretty = value.FindString(brave_vpn::kRegionNamePrettyKey)) { region.name_pretty = *name_pretty; } + if (auto* continent = value.FindString(brave_vpn::kRegionContinentKey)) { + region.continent = *continent; + } if (auto* country_iso_code = value.FindString(brave_vpn::kRegionCountryIsoCodeKey)) { region.country_iso_code = *country_iso_code; } + if (auto* region_precision = + value.FindString(brave_vpn::kRegionPrecisionKey)) { + region.region_precision = *region_precision; + } + if (auto latitude = + value.FindDouble(brave_vpn::kRegionLatitudeKey)) { + region.latitude = *latitude; + } + if (auto longitude = + value.FindDouble(brave_vpn::kRegionLongitudeKey)) { + region.longitude = *longitude; + } + if (auto server_count = + value.FindInt(brave_vpn::kRegionServerCountKey)) { + region.server_count = *server_count; + } return region; } diff --git a/components/brave_vpn/common/brave_vpn_constants.h b/components/brave_vpn/common/brave_vpn_constants.h index 9650fffbacc..044a102662f 100644 --- a/components/brave_vpn/common/brave_vpn_constants.h +++ b/components/brave_vpn/common/brave_vpn_constants.h @@ -20,10 +20,15 @@ inline constexpr char kManageUrlDev[] = inline constexpr char kFeedbackUrl[] = "https://support.brave.com/"; inline constexpr char kAboutUrl[] = "https://brave.com/firewall-vpn/"; -inline constexpr char kRegionContinentKey[] = "continent"; inline constexpr char kRegionNameKey[] = "name"; inline constexpr char kRegionNamePrettyKey[] = "name-pretty"; +inline constexpr char kRegionContinentKey[] = "continent"; inline constexpr char kRegionCountryIsoCodeKey[] = "country-iso-code"; +inline constexpr char kRegionPrecisionKey[] = "region-precision"; +inline constexpr char kRegionLatitudeKey[] = "latitude"; +inline constexpr char kRegionLongitudeKey[] = "longitude"; +inline constexpr char kRegionServerCountKey[] = "server-count"; + inline constexpr char kCreateSupportTicket[] = "api/v1.2/partners/support-ticket"; inline constexpr char kSupportTicketEmailKey[] = "email"; diff --git a/components/brave_vpn/common/mojom/BUILD.gn b/components/brave_vpn/common/mojom/BUILD.gn index bbed0f4131c..55d951d78b9 100644 --- a/components/brave_vpn/common/mojom/BUILD.gn +++ b/components/brave_vpn/common/mojom/BUILD.gn @@ -19,6 +19,7 @@ preprocess_if_expr("preprocess_mojo") { } mojom("mojom") { + generate_java = true sources = [ "brave_vpn.mojom" ] deps = [ diff --git a/components/brave_vpn/common/mojom/brave_vpn.mojom b/components/brave_vpn/common/mojom/brave_vpn.mojom index a70f5e662ce..9274fcb04a4 100644 --- a/components/brave_vpn/common/mojom/brave_vpn.mojom +++ b/components/brave_vpn/common/mojom/brave_vpn.mojom @@ -123,8 +123,14 @@ struct PurchasedInfo { // struct. Ex, IsValidRegion() or IsValidRegionValue(). It should also check // new member. struct Region { - string continent; string name; string name_pretty; + string continent; string country_iso_code; + string region_precision; + double latitude; + double longitude; + int32 server_count; }; + + From f1b6a292c97960cfb91f3b855ffc30efe4a2f02e Mon Sep 17 00:00:00 2001 From: deeppandya Date: Sat, 27 Jul 2024 01:17:05 +0530 Subject: [PATCH 02/31] Add api changes for server regions with cities --- .../browser/vpn/BraveVpnNativeWorker.java | 26 +++++++++++++++++-- .../chrome/browser/vpn/BraveVpnObserver.java | 3 +++ .../VpnServerSelectionActivity.java | 6 +++-- .../android/brave_vpn_native_worker.cc | 19 ++++++++++++++ .../android/brave_vpn_native_worker.h | 5 ++++ build/android/config.gni | 2 +- .../browser/api/brave_vpn_api_request.cc | 8 ++++++ .../browser/api/brave_vpn_api_request.h | 1 + .../brave_vpn/browser/brave_vpn_service.cc | 4 +++ .../brave_vpn/browser/brave_vpn_service.h | 1 + .../brave_vpn_region_data_manager.cc | 11 +++----- .../brave_vpn/common/brave_vpn_constants.h | 2 ++ 12 files changed, 76 insertions(+), 12 deletions(-) diff --git a/android/java/org/chromium/chrome/browser/vpn/BraveVpnNativeWorker.java b/android/java/org/chromium/chrome/browser/vpn/BraveVpnNativeWorker.java index 1482132478c..b22a240c320 100644 --- a/android/java/org/chromium/chrome/browser/vpn/BraveVpnNativeWorker.java +++ b/android/java/org/chromium/chrome/browser/vpn/BraveVpnNativeWorker.java @@ -79,6 +79,13 @@ public class BraveVpnNativeWorker { } } + @CalledByNative + public void onGetServerRegionsWithCities(String jsonServerRegions, boolean isSuccess) { + for (BraveVpnObserver observer : mObservers) { + observer.onGetServerRegionsWithCities(jsonServerRegions, isSuccess); + } + } + @CalledByNative public void onGetTimezonesForRegions(String jsonTimezones, boolean isSuccess) { for (BraveVpnObserver observer : mObservers) { @@ -134,6 +141,10 @@ public class BraveVpnNativeWorker { BraveVpnNativeWorkerJni.get().getAllServerRegions(mNativeBraveVpnNativeWorker); } + public void getServerRegionsWithCities() { + BraveVpnNativeWorkerJni.get().getServerRegionsWithCities(mNativeBraveVpnNativeWorker); + } + public void getTimezonesForRegions() { BraveVpnNativeWorkerJni.get().getTimezonesForRegions(mNativeBraveVpnNativeWorker); } @@ -197,12 +208,23 @@ public class BraveVpnNativeWorker { @NativeMethods interface Natives { void init(BraveVpnNativeWorker caller); + void destroy(long nativeBraveVpnNativeWorker, BraveVpnNativeWorker caller); + void getAllServerRegions(long nativeBraveVpnNativeWorker); + + void getServerRegionsWithCities(long nativeBraveVpnNativeWorker); + void getTimezonesForRegions(long nativeBraveVpnNativeWorker); + void getHostnamesForRegion(long nativeBraveVpnNativeWorker, String region); - void getWireguardProfileCredentials(long nativeBraveVpnNativeWorker, - String subscriberCredential, String publicKey, String hostname); + + void getWireguardProfileCredentials( + long nativeBraveVpnNativeWorker, + String subscriberCredential, + String publicKey, + String hostname); + void verifyCredentials(long nativeBraveVpnNativeWorker, String hostname, String clientId, String subscriberCredential, String apiAuthToken); void invalidateCredentials(long nativeBraveVpnNativeWorker, String hostname, diff --git a/android/java/org/chromium/chrome/browser/vpn/BraveVpnObserver.java b/android/java/org/chromium/chrome/browser/vpn/BraveVpnObserver.java index d955895ede2..92967ce494c 100644 --- a/android/java/org/chromium/chrome/browser/vpn/BraveVpnObserver.java +++ b/android/java/org/chromium/chrome/browser/vpn/BraveVpnObserver.java @@ -9,6 +9,9 @@ public interface BraveVpnObserver { public default void onGetAllServerRegions(String jsonServerRegions, boolean isSuccess) {} ; + public default void onGetServerRegionsWithCities(String jsonServerRegions, boolean isSuccess) {} + ; + public default void onGetTimezonesForRegions(String jsonTimezones, boolean isSuccess) {} ; diff --git a/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerSelectionActivity.java b/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerSelectionActivity.java index f563590f1cb..66288efbeb4 100644 --- a/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerSelectionActivity.java +++ b/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerSelectionActivity.java @@ -18,6 +18,7 @@ import androidx.recyclerview.widget.DividerItemDecoration; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; +import org.chromium.base.Log; import org.chromium.chrome.R; import org.chromium.chrome.browser.vpn.BraveVpnNativeWorker; import org.chromium.chrome.browser.vpn.adapters.BraveVpnServerSelectionAdapter; @@ -119,13 +120,14 @@ public class VpnServerSelectionActivity extends BraveVpnParentActivity { @Override public void finishNativeInitialization() { super.finishNativeInitialization(); - BraveVpnNativeWorker.getInstance().getAllServerRegions(); + BraveVpnNativeWorker.getInstance().getServerRegionsWithCities(); showProgress(); } @Override - public void onGetAllServerRegions(String jsonResponse, boolean isSuccess) { + public void onGetServerRegionsWithCities(String jsonResponse, boolean isSuccess) { if (isSuccess) { + Log.e("brave_vpn", jsonResponse); List braveVpnServerRegions = BraveVpnUtils.getServerLocations(jsonResponse); Collections.sort( diff --git a/browser/brave_vpn/android/brave_vpn_native_worker.cc b/browser/brave_vpn/android/brave_vpn_native_worker.cc index b61be9f8855..d29a3df968e 100644 --- a/browser/brave_vpn/android/brave_vpn_native_worker.cc +++ b/browser/brave_vpn/android/brave_vpn_native_worker.cc @@ -66,6 +66,25 @@ void BraveVpnNativeWorker::OnGetAllServerRegions( success); } +void BraveVpnNativeWorker::GetServerRegionsWithCities(JNIEnv* env) { + BraveVpnService* brave_vpn_service = GetBraveVpnService(); + if (brave_vpn_service) { + brave_vpn_service->GetServerRegionsWithCities( + base::BindOnce(&BraveVpnNativeWorker::OnGetServerRegionsWithCities, + weak_factory_.GetWeakPtr())); + } +} + +void BraveVpnNativeWorker::OnGetServerRegionsWithCities( + const std::string& server_regions_json, + bool success) { + JNIEnv* env = base::android::AttachCurrentThread(); + Java_BraveVpnNativeWorker_onGetServerRegionsWithCities( + env, weak_java_brave_vpn_native_worker_.get(env), + base::android::ConvertUTF8ToJavaString(env, server_regions_json), + success); +} + void BraveVpnNativeWorker::GetTimezonesForRegions(JNIEnv* env) { BraveVpnService* brave_vpn_service = GetBraveVpnService(); if (brave_vpn_service) { diff --git a/browser/brave_vpn/android/brave_vpn_native_worker.h b/browser/brave_vpn/android/brave_vpn_native_worker.h index 5533c5d1ce1..39785b47061 100644 --- a/browser/brave_vpn/android/brave_vpn_native_worker.h +++ b/browser/brave_vpn/android/brave_vpn_native_worker.h @@ -30,6 +30,11 @@ class BraveVpnNativeWorker { void OnGetAllServerRegions(const std::string& server_regions_json, bool success); + void GetServerRegionsWithCities(JNIEnv* env); + + void OnGetServerRegionsWithCities(const std::string& server_regions_json, + bool success); + void GetTimezonesForRegions(JNIEnv* env); void OnGetTimezonesForRegions(const std::string& timezones_json, diff --git a/build/android/config.gni b/build/android/config.gni index d8f3ee7cfd4..367020ac117 100644 --- a/build/android/config.gni +++ b/build/android/config.gni @@ -34,13 +34,13 @@ brave_chrome_java_deps = [ "//brave/components/brave_news/common:mojom_java", "//brave/components/brave_rewards/common/mojom:mojom_java", "//brave/components/brave_shields/core/common:mojom_java", + "//brave/components/brave_vpn/common/mojom:mojom_java", "//brave/components/brave_wallet/common:mojom_java", "//brave/components/browser_ui/site_settings/android:java", "//brave/components/misc_metrics/common:mojom_java", "//brave/components/playlist/common/mojom:mojom_java", "//brave/components/safe_browsing/android:brave_safe_browsing_java", "//brave/components/url_sanitizer/common/mojom:mojom_java", - "//brave/components/brave_vpn/common/mojom:mojom_java", "//brave/components/variations/android:java", "//brave/components/version_info/android:java", "//brave/third_party/android_deps:com_airbnb_android_java", diff --git a/components/brave_vpn/browser/api/brave_vpn_api_request.cc b/components/brave_vpn/browser/api/brave_vpn_api_request.cc index 53a9cd87189..59ca5630000 100644 --- a/components/brave_vpn/browser/api/brave_vpn_api_request.cc +++ b/components/brave_vpn/browser/api/brave_vpn_api_request.cc @@ -70,6 +70,14 @@ void BraveVpnAPIRequest::GetAllServerRegions(ResponseCallback callback) { OAuthRequest(base_url, "GET", "", std::move(internal_callback)); } +void BraveVpnAPIRequest::GetServerRegionsWithCities(ResponseCallback callback) { + auto internal_callback = + base::BindOnce(&BraveVpnAPIRequest::OnGetResponse, + weak_ptr_factory_.GetWeakPtr(), std::move(callback)); + GURL base_url = GetURLWithPath(kVpnHost, kServerRegionsWithCities); + OAuthRequest(base_url, "GET", "", std::move(internal_callback)); +} + void BraveVpnAPIRequest::GetTimezonesForRegions(ResponseCallback callback) { auto internal_callback = base::BindOnce(&BraveVpnAPIRequest::OnGetResponse, diff --git a/components/brave_vpn/browser/api/brave_vpn_api_request.h b/components/brave_vpn/browser/api/brave_vpn_api_request.h index 86c7b4a1066..a85414ea5ce 100644 --- a/components/brave_vpn/browser/api/brave_vpn_api_request.h +++ b/components/brave_vpn/browser/api/brave_vpn_api_request.h @@ -34,6 +34,7 @@ class BraveVpnAPIRequest { using APIRequestResult = api_request_helper::APIRequestResult; void GetAllServerRegions(ResponseCallback callback); + void GetServerRegionsWithCities(ResponseCallback callback); void GetTimezonesForRegions(ResponseCallback callback); void GetHostnamesForRegion(ResponseCallback callback, const std::string& region); diff --git a/components/brave_vpn/browser/brave_vpn_service.cc b/components/brave_vpn/browser/brave_vpn_service.cc index de243881260..59d8bd61b2c 100644 --- a/components/brave_vpn/browser/brave_vpn_service.cc +++ b/components/brave_vpn/browser/brave_vpn_service.cc @@ -863,6 +863,10 @@ void BraveVpnService::GetAllServerRegions(ResponseCallback callback) { api_request_->GetAllServerRegions(std::move(callback)); } +void BraveVpnService::GetServerRegionsWithCities(ResponseCallback callback) { + api_request_->GetServerRegionsWithCities(std::move(callback)); +} + void BraveVpnService::GetTimezonesForRegions(ResponseCallback callback) { api_request_->GetTimezonesForRegions(std::move(callback)); } diff --git a/components/brave_vpn/browser/brave_vpn_service.h b/components/brave_vpn/browser/brave_vpn_service.h index f850462fa33..c6659e42a6d 100644 --- a/components/brave_vpn/browser/brave_vpn_service.h +++ b/components/brave_vpn/browser/brave_vpn_service.h @@ -122,6 +122,7 @@ class BraveVpnService : void LoadPurchasedState(const std::string& domain) override; void GetAllServerRegions(ResponseCallback callback); + void GetServerRegionsWithCities(ResponseCallback callback); void GetTimezonesForRegions(ResponseCallback callback); void GetHostnamesForRegion(ResponseCallback callback, const std::string& region); diff --git a/components/brave_vpn/browser/connection/brave_vpn_region_data_manager.cc b/components/brave_vpn/browser/connection/brave_vpn_region_data_manager.cc index 2884257cd0e..2baec063a7d 100644 --- a/components/brave_vpn/browser/connection/brave_vpn_region_data_manager.cc +++ b/components/brave_vpn/browser/connection/brave_vpn_region_data_manager.cc @@ -69,16 +69,13 @@ mojom::Region GetRegionFromValue(const base::Value::Dict& value) { value.FindString(brave_vpn::kRegionPrecisionKey)) { region.region_precision = *region_precision; } - if (auto latitude = - value.FindDouble(brave_vpn::kRegionLatitudeKey)) { + if (auto latitude = value.FindDouble(brave_vpn::kRegionLatitudeKey)) { region.latitude = *latitude; } - if (auto longitude = - value.FindDouble(brave_vpn::kRegionLongitudeKey)) { + if (auto longitude = value.FindDouble(brave_vpn::kRegionLongitudeKey)) { region.longitude = *longitude; } - if (auto server_count = - value.FindInt(brave_vpn::kRegionServerCountKey)) { + if (auto server_count = value.FindInt(brave_vpn::kRegionServerCountKey)) { region.server_count = *server_count; } return region; @@ -287,7 +284,7 @@ void BraveVPNRegionDataManager::FetchRegionDataIfNeeded() { VLOG(2) << __func__ << " : Start fetching region data"; // Unretained is safe here becasue this class owns |api_request_|. - api_request_->GetAllServerRegions(base::BindOnce( + api_request_->GetServerRegionsWithCities(base::BindOnce( &BraveVPNRegionDataManager::OnFetchRegionList, base::Unretained(this))); } diff --git a/components/brave_vpn/common/brave_vpn_constants.h b/components/brave_vpn/common/brave_vpn_constants.h index 044a102662f..3960ad7a028 100644 --- a/components/brave_vpn/common/brave_vpn_constants.h +++ b/components/brave_vpn/common/brave_vpn_constants.h @@ -39,6 +39,8 @@ inline constexpr char kSupportTicketTimezoneKey[] = "timezone"; inline constexpr char kVpnHost[] = "connect-api.guardianapp.com"; inline constexpr char kAllServerRegions[] = "api/v1/servers/all-server-regions"; +inline constexpr char kServerRegionsWithCities[] = + "api/v1.3/servers/all-server-regions/city-by-country"; inline constexpr char kTimezonesForRegions[] = "api/v1.1/servers/timezones-for-regions"; inline constexpr char kHostnameForRegion[] = From 8c430eb8f0b743a00147591c1fe873a8d4123ec7 Mon Sep 17 00:00:00 2001 From: deeppandya Date: Wed, 31 Jul 2024 14:54:13 +0530 Subject: [PATCH 03/31] Initial changes for UI Update vpn server selecton activity UI --- android/brave_java_resources.gni | 2 +- .../browser/vpn/BraveVpnNativeWorker.java | 18 ++++-- .../VpnServerSelectionActivity.java | 27 ++++---- .../BraveVpnServerSelectionAdapter.java | 57 +++++++++++------ .../vpn/utils/BraveVpnApiResponseUtils.java | 7 +- android/java/res/drawable/ic_carat_right.xml | 10 +++ .../java/res/drawable/ic_checkbox_checked.xml | 14 ---- .../layout/activity_vpn_server_selection.xml | 55 ++++++++++++++-- ...brave_vpn_server_selection_item_layout.xml | 64 +++++++++++++++++-- .../java/res/values-night/brave_colors.xml | 5 ++ android/java/res/values/brave_colors.xml | 5 ++ .../android/strings/android_brave_strings.grd | 8 ++- 12 files changed, 205 insertions(+), 67 deletions(-) create mode 100644 android/java/res/drawable/ic_carat_right.xml delete mode 100644 android/java/res/drawable/ic_checkbox_checked.xml diff --git a/android/brave_java_resources.gni b/android/brave_java_resources.gni index 381af0b7f5b..973b370fae7 100644 --- a/android/brave_java_resources.gni +++ b/android/brave_java_resources.gni @@ -452,6 +452,7 @@ brave_java_resources = [ "java/res/drawable/ic_cancel_filled.xml", "java/res/drawable/ic_carat_down.xml", "java/res/drawable/ic_carat_down_country_spinner.xml", + "java/res/drawable/ic_carat_right.xml", "java/res/drawable/ic_card_background.xml", "java/res/drawable/ic_celo_color.xml", "java/res/drawable/ic_channel_brave.xml", @@ -482,7 +483,6 @@ brave_java_resources = [ "java/res/drawable/ic_channels.xml", "java/res/drawable/ic_check.xml", "java/res/drawable/ic_check_white.xml", - "java/res/drawable/ic_checkbox_checked.xml", "java/res/drawable/ic_checkbox_filled.xml", "java/res/drawable/ic_checkbox_outline.xml", "java/res/drawable/ic_chevron_right.xml", diff --git a/android/java/org/chromium/chrome/browser/vpn/BraveVpnNativeWorker.java b/android/java/org/chromium/chrome/browser/vpn/BraveVpnNativeWorker.java index b22a240c320..0349a84f435 100644 --- a/android/java/org/chromium/chrome/browser/vpn/BraveVpnNativeWorker.java +++ b/android/java/org/chromium/chrome/browser/vpn/BraveVpnNativeWorker.java @@ -225,10 +225,20 @@ public class BraveVpnNativeWorker { String publicKey, String hostname); - void verifyCredentials(long nativeBraveVpnNativeWorker, String hostname, String clientId, - String subscriberCredential, String apiAuthToken); - void invalidateCredentials(long nativeBraveVpnNativeWorker, String hostname, - String clientId, String subscriberCredential, String apiAuthToken); + void verifyCredentials( + long nativeBraveVpnNativeWorker, + String hostname, + String clientId, + String subscriberCredential, + String apiAuthToken); + + void invalidateCredentials( + long nativeBraveVpnNativeWorker, + String hostname, + String clientId, + String subscriberCredential, + String apiAuthToken); + void getSubscriberCredential(long nativeBraveVpnNativeWorker, String productType, String productId, String validationMethod, String purchaseToken, String packageName); diff --git a/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerSelectionActivity.java b/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerSelectionActivity.java index 66288efbeb4..3b7e9c63d6a 100644 --- a/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerSelectionActivity.java +++ b/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerSelectionActivity.java @@ -10,7 +10,6 @@ import android.view.MenuItem; import android.view.View; import android.widget.LinearLayout; import android.widget.ProgressBar; -import android.widget.TextView; import androidx.appcompat.app.ActionBar; import androidx.appcompat.widget.Toolbar; @@ -18,6 +17,8 @@ import androidx.recyclerview.widget.DividerItemDecoration; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; +import com.google.android.material.materialswitch.MaterialSwitch; + import org.chromium.base.Log; import org.chromium.chrome.R; import org.chromium.chrome.browser.vpn.BraveVpnNativeWorker; @@ -64,16 +65,16 @@ public class VpnServerSelectionActivity extends BraveVpnParentActivity { actionBar.setDisplayHomeAsUpEnabled(true); actionBar.setTitle(getResources().getString(R.string.change_location)); - TextView automaticText = (TextView) findViewById(R.id.automatic_server_text); - automaticText.setText(getResources().getString(R.string.automatic)); - if (BraveVpnPrefUtils.getServerRegion() - .equals(BraveVpnPrefUtils.PREF_BRAVE_VPN_AUTOMATIC)) { - automaticText.setCompoundDrawablesWithIntrinsicBounds( - 0, 0, R.drawable.ic_checkbox_checked, 0); - } else { - automaticText.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0); - } - automaticText.setOnClickListener( + mServerRegionList = (RecyclerView) findViewById(R.id.server_selection_list); + + LinearLayout automaticLayout = (LinearLayout) findViewById(R.id.automatic_server_layout); + MaterialSwitch automaticSwitch = + (MaterialSwitch) findViewById(R.id.automatic_server_switch); + boolean isAutomatic = + BraveVpnPrefUtils.getServerRegion() + .equals(BraveVpnPrefUtils.PREF_BRAVE_VPN_AUTOMATIC); + mServerRegionList.setVisibility(isAutomatic ? View.GONE : View.VISIBLE); + automaticSwitch.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { @@ -86,7 +87,6 @@ public class VpnServerSelectionActivity extends BraveVpnParentActivity { mServerSelectionListLayout = (LinearLayout) findViewById(R.id.server_selection_list_layout); mServerSelectionProgress = (ProgressBar) findViewById(R.id.server_selection_progress); - mServerRegionList = (RecyclerView) findViewById(R.id.server_selection_list); LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this); mServerRegionList.addItemDecoration( new DividerItemDecoration( @@ -142,7 +142,8 @@ public class VpnServerSelectionActivity extends BraveVpnParentActivity { .compareToIgnoreCase(braveVpnServerRegion2.getNamePretty()); } }); - mBraveVpnServerSelectionAdapter = new BraveVpnServerSelectionAdapter(); + mBraveVpnServerSelectionAdapter = + new BraveVpnServerSelectionAdapter(VpnServerSelectionActivity.this); mBraveVpnServerSelectionAdapter.setVpnServerRegions(braveVpnServerRegions); mBraveVpnServerSelectionAdapter.setOnServerRegionSelection( new OnServerRegionSelection() { diff --git a/android/java/org/chromium/chrome/browser/vpn/adapters/BraveVpnServerSelectionAdapter.java b/android/java/org/chromium/chrome/browser/vpn/adapters/BraveVpnServerSelectionAdapter.java index 4933a99a6c1..e7871ca2dd3 100644 --- a/android/java/org/chromium/chrome/browser/vpn/adapters/BraveVpnServerSelectionAdapter.java +++ b/android/java/org/chromium/chrome/browser/vpn/adapters/BraveVpnServerSelectionAdapter.java @@ -7,14 +7,18 @@ package org.chromium.chrome.browser.vpn.adapters; +import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.LinearLayout; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; +import com.google.android.material.radiobutton.MaterialRadioButton; + import org.chromium.chrome.R; import org.chromium.chrome.browser.vpn.activities.VpnServerSelectionActivity.OnServerRegionSelection; import org.chromium.chrome.browser.vpn.models.BraveVpnServerRegion; @@ -26,9 +30,14 @@ import java.util.List; public class BraveVpnServerSelectionAdapter extends RecyclerView.Adapter { - List mBraveVpnServerRegions = new ArrayList<>(); + private final Context mContext; + private List mBraveVpnServerRegions = new ArrayList<>(); private OnServerRegionSelection mOnServerRegionSelection; + public BraveVpnServerSelectionAdapter(Context context) { + this.mContext = context; + } + @NonNull @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { @@ -42,23 +51,26 @@ public class BraveVpnServerSelectionAdapter public void onBindViewHolder(@NonNull ViewHolder holder, int position) { final BraveVpnServerRegion vpnServerRegion = mBraveVpnServerRegions.get(position); if (vpnServerRegion != null) { - String locationText = - BraveVpnUtils.countryCodeToEmoji(vpnServerRegion.getCountryIsoCode()) - + " " - + vpnServerRegion.getNamePretty(); - holder.serverText.setText(locationText); - if (BraveVpnPrefUtils.getServerRegion().equals(vpnServerRegion.getName())) { - holder.serverText.setCompoundDrawablesWithIntrinsicBounds( - 0, 0, R.drawable.ic_checkbox_checked, 0); - } else { - holder.serverText.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0); - } - holder.serverText.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - mOnServerRegionSelection.onServerRegionClick(vpnServerRegion); - } - }); + holder.serverIconText.setText( + BraveVpnUtils.countryCodeToEmoji(vpnServerRegion.getCountryIsoCode())); + holder.serverText.setText(vpnServerRegion.getNamePretty()); + holder.cityServerText.setText( + mContext.getResources().getString(R.string.city_server_text)); + holder.serverRadioButton.setChecked( + BraveVpnPrefUtils.getServerRegion().equals(vpnServerRegion.getName())); + // if (BraveVpnPrefUtils.getServerRegion().equals(vpnServerRegion.getName())) { + // holder.serverText.setCompoundDrawablesWithIntrinsicBounds( + // 0, 0, R.drawable.ic_checkbox_checked, 0); + // } else { + // holder.serverText.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0); + // } + holder.serverSelectionItemLayout.setOnClickListener( + new View.OnClickListener() { + @Override + public void onClick(View v) { + mOnServerRegionSelection.onServerRegionClick(vpnServerRegion); + } + }); } } @@ -76,11 +88,20 @@ public class BraveVpnServerSelectionAdapter } public static class ViewHolder extends RecyclerView.ViewHolder { + public LinearLayout serverSelectionItemLayout; + public TextView serverIconText; public TextView serverText; + public TextView cityServerText; + public MaterialRadioButton serverRadioButton; public ViewHolder(View itemView) { super(itemView); + this.serverSelectionItemLayout = + itemView.findViewById(R.id.server_selection_item_layout); + this.serverIconText = itemView.findViewById(R.id.server_icon); this.serverText = itemView.findViewById(R.id.server_text); + this.cityServerText = itemView.findViewById(R.id.city_server_text); + this.serverRadioButton = itemView.findViewById(R.id.server_radio_button); } } } diff --git a/android/java/org/chromium/chrome/browser/vpn/utils/BraveVpnApiResponseUtils.java b/android/java/org/chromium/chrome/browser/vpn/utils/BraveVpnApiResponseUtils.java index 9b1a17a36e9..b3915e37754 100644 --- a/android/java/org/chromium/chrome/browser/vpn/utils/BraveVpnApiResponseUtils.java +++ b/android/java/org/chromium/chrome/browser/vpn/utils/BraveVpnApiResponseUtils.java @@ -82,9 +82,10 @@ public class BraveVpnApiResponseUtils { BraveVpnUtils.selectedServerRegion = null; } else { String serverRegion = BraveVpnPrefUtils.getServerRegion(); - region = serverRegion.equals(BraveVpnPrefUtils.PREF_BRAVE_VPN_AUTOMATIC) - ? region - : serverRegion; + region = + serverRegion.equals(BraveVpnPrefUtils.PREF_BRAVE_VPN_AUTOMATIC) + ? "" + : serverRegion; } BraveVpnNativeWorker.getInstance().getHostnamesForRegion(region); diff --git a/android/java/res/drawable/ic_carat_right.xml b/android/java/res/drawable/ic_carat_right.xml new file mode 100644 index 00000000000..82f8845631c --- /dev/null +++ b/android/java/res/drawable/ic_carat_right.xml @@ -0,0 +1,10 @@ + + + diff --git a/android/java/res/drawable/ic_checkbox_checked.xml b/android/java/res/drawable/ic_checkbox_checked.xml deleted file mode 100644 index b485bb2ec6a..00000000000 --- a/android/java/res/drawable/ic_checkbox_checked.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - diff --git a/android/java/res/layout/activity_vpn_server_selection.xml b/android/java/res/layout/activity_vpn_server_selection.xml index 8fb393325bb..5cc558a1bc5 100644 --- a/android/java/res/layout/activity_vpn_server_selection.xml +++ b/android/java/res/layout/activity_vpn_server_selection.xml @@ -1,5 +1,7 @@ - @@ -19,18 +21,57 @@ android:layout_height="wrap_content" android:minHeight="?attr/actionBarSize"/> - + layout="@layout/brave_vpn_server_selection_item_layout"/> --> + + + + + + + + + + + + + + + android:layout_marginHorizontal="16dp" + style="@style/DefaultSemibold" + android:textColor="@color/schemes_primary" + android:text="@string/servers"/> - \ No newline at end of file + android:layout_marginHorizontal="16dp" + android:layout_marginVertical="12dp" + android:orientation="horizontal"> + + + + + + + + + + + + + + + + + + diff --git a/android/java/res/values-night/brave_colors.xml b/android/java/res/values-night/brave_colors.xml index 1288719fb48..bcae8fd03a4 100644 --- a/android/java/res/values-night/brave_colors.xml +++ b/android/java/res/values-night/brave_colors.xml @@ -269,4 +269,9 @@ #383839 #1f1f1f + + #e3e3e8 + #c7c7cc + #3b3b3f + #c1c4ff diff --git a/android/java/res/values/brave_colors.xml b/android/java/res/values/brave_colors.xml index ca3e6dd20fa..9d9b66e91fc 100644 --- a/android/java/res/values/brave_colors.xml +++ b/android/java/res/values/brave_colors.xml @@ -414,4 +414,9 @@ #3e37d4 #6261ff #efefff + + #1b1b1f + #46464a + #e3e3e8 + #3e37d4 diff --git a/browser/ui/android/strings/android_brave_strings.grd b/browser/ui/android/strings/android_brave_strings.grd index 7d7f37a9f40..d7e54fcb352 100644 --- a/browser/ui/android/strings/android_brave_strings.grd +++ b/browser/ui/android/strings/android_brave_strings.grd @@ -2423,7 +2423,13 @@ If you don't accept this request, VPN will not reconnect and your internet conne Support provided with the help of the Guardian team.\n\nPlease select the information you're comfortable sharing with us.\n\nThe more information you initially share with us the easier it will be for our support staff to help you resolve your issue. - A server region most proximate to you willl be automatically selected, based on your system timezone. This is recommended in order to ensure fast internet speeds. + Auto-select the VPN server region closest to you based on your timezone. This option is recommended to maximize Internet speeds. + + + 2 cities - 5 servers + + + Servers Select Issue From bb2e7792c4fe244aeb390178344808634ea8280a Mon Sep 17 00:00:00 2001 From: deeppandya Date: Fri, 2 Aug 2024 04:08:34 +0530 Subject: [PATCH 04/31] Add UI for region server Update existing changes --- android/brave_java_resources.gni | 2 + android/brave_java_sources.gni | 2 + android/java/AndroidManifest.xml | 6 + .../browser/vpn/BraveVpnNativeWorker.java | 19 +- .../vpn/activities/VpnServerActivity.java | 202 ++++++++++++++++++ .../VpnServerSelectionActivity.java | 21 +- .../BraveVpnServerSelectionAdapter.java | 8 +- .../vpn/adapters/VpnServerAdapter.java | 92 ++++++++ .../browser/vpn/utils/BraveVpnUtils.java | 9 + .../java/res/layout/activity_vpn_server.xml | 52 +++++ .../layout/activity_vpn_server_selection.xml | 1 + .../res/layout/vpn_server_item_layout.xml | 42 ++++ .../android/strings/android_brave_strings.grd | 3 + 13 files changed, 440 insertions(+), 19 deletions(-) create mode 100644 android/java/org/chromium/chrome/browser/vpn/activities/VpnServerActivity.java create mode 100644 android/java/org/chromium/chrome/browser/vpn/adapters/VpnServerAdapter.java create mode 100644 android/java/res/layout/activity_vpn_server.xml create mode 100644 android/java/res/layout/vpn_server_item_layout.xml diff --git a/android/brave_java_resources.gni b/android/brave_java_resources.gni index 973b370fae7..fab7c795408 100644 --- a/android/brave_java_resources.gni +++ b/android/brave_java_resources.gni @@ -769,6 +769,7 @@ brave_java_resources = [ "java/res/layout/activity_tipping_banner_tablet.xml", "java/res/layout/activity_vpn_always_on.xml", "java/res/layout/activity_vpn_paywall.xml", + "java/res/layout/activity_vpn_server.xml", "java/res/layout/activity_vpn_server_selection.xml", "java/res/layout/activity_welcome_onboarding.xml", "java/res/layout/application_item_layout.xml", @@ -962,6 +963,7 @@ brave_java_resources = [ "java/res/layout/view_holder_onboarding_header_network_selector.xml", "java/res/layout/view_holder_onboarding_network_selector.xml", "java/res/layout/vpn_location_menu_item_action_layout.xml", + "java/res/layout/vpn_server_item_layout.xml", "java/res/layout/vpn_settings_callout_modal_layout.xml", "java/res/layout/wallet_balance_layout.xml", "java/res/layout/web_notification_icon_frame_brave.xml", diff --git a/android/brave_java_sources.gni b/android/brave_java_sources.gni index 6674dbabb5c..acc3957e714 100644 --- a/android/brave_java_sources.gni +++ b/android/brave_java_sources.gni @@ -461,10 +461,12 @@ brave_java_sources = [ "../../brave/android/java/org/chromium/chrome/browser/vpn/activities/BraveVpnSupportActivity.java", "../../brave/android/java/org/chromium/chrome/browser/vpn/activities/VpnAlwaysOnActivity.java", "../../brave/android/java/org/chromium/chrome/browser/vpn/activities/VpnPaywallActivity.java", + "../../brave/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerActivity.java", "../../brave/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerSelectionActivity.java", "../../brave/android/java/org/chromium/chrome/browser/vpn/adapters/AlwaysOnPagerAdapter.java", "../../brave/android/java/org/chromium/chrome/browser/vpn/adapters/BraveVpnPlanPagerAdapter.java", "../../brave/android/java/org/chromium/chrome/browser/vpn/adapters/BraveVpnServerSelectionAdapter.java", + "../../brave/android/java/org/chromium/chrome/browser/vpn/adapters/VpnServerAdapter.java", "../../brave/android/java/org/chromium/chrome/browser/vpn/fragments/BraveVpnAlwaysOnErrorDialogFragment.java", "../../brave/android/java/org/chromium/chrome/browser/vpn/fragments/BraveVpnConfirmDialogFragment.java", "../../brave/android/java/org/chromium/chrome/browser/vpn/fragments/LinkVpnSubscriptionDialogFragment.java", diff --git a/android/java/AndroidManifest.xml b/android/java/AndroidManifest.xml index d2aa1b6e247..ee7db823abb 100644 --- a/android/java/AndroidManifest.xml +++ b/android/java/AndroidManifest.xml @@ -110,6 +110,12 @@ android:screenOrientation="sensorPortrait" tools:ignore="LockedOrientationActivity,DiscouragedApi"/> + + braveVpnServerRegions = + BraveVpnUtils.getServerLocations(jsonResponse); + Collections.sort( + braveVpnServerRegions, + new Comparator() { + @Override + public int compare( + BraveVpnServerRegion braveVpnServerRegion1, + BraveVpnServerRegion braveVpnServerRegion2) { + return braveVpnServerRegion1 + .getNamePretty() + .compareToIgnoreCase(braveVpnServerRegion2.getNamePretty()); + } + }); + mBraveVpnServerSelectionAdapter = new VpnServerAdapter(VpnServerActivity.this); + mBraveVpnServerSelectionAdapter.setVpnServerRegions(braveVpnServerRegions); + mBraveVpnServerSelectionAdapter.setOnServerRegionSelection( + new OnServerRegionSelection() { + @Override + public void onServerRegionClick(BraveVpnServerRegion braveVpnServerRegion) { + if (BraveVpnPrefUtils.getServerRegion() + .equals(braveVpnServerRegion.getName())) { + Toast.makeText( + VpnServerActivity.this, + R.string.already_selected_the_server, + Toast.LENGTH_SHORT) + .show(); + } else { + changeServerRegion(braveVpnServerRegion); + } + } + }); + mServerRegionList.setAdapter(mBraveVpnServerSelectionAdapter); + hideProgress(); + } else { + Toast.makeText( + VpnServerActivity.this, + R.string.fail_to_get_server_locations, + Toast.LENGTH_LONG) + .show(); + } + } + + @Override + protected void triggerLayoutInflation() { + initializeViews(); + onInitialLayoutInflationComplete(); + } + + @Override + public boolean shouldStartGpuProcess() { + return true; + } + + private void changeServerRegion(BraveVpnServerRegion braveVpnServerRegion) { + mIsServerLocationChanged = true; + BraveVpnUtils.selectedServerRegion = braveVpnServerRegion; + BraveVpnUtils.showProgressDialog( + VpnServerActivity.this, getResources().getString(R.string.vpn_connect_text)); + if (BraveVpnNativeWorker.getInstance().isPurchasedUser()) { + mBraveVpnPrefModel = new BraveVpnPrefModel(); + BraveVpnNativeWorker.getInstance().getSubscriberCredentialV12(); + } else { + verifySubscription(); + } + } + + public void showProgress() { + if (mServerSelectionProgress != null) { + mServerSelectionProgress.setVisibility(View.VISIBLE); + } + if (mServerSelectionListLayout != null) { + mServerSelectionListLayout.setAlpha(0.4f); + } + } + + public void hideProgress() { + if (mServerSelectionProgress != null) { + mServerSelectionProgress.setVisibility(View.GONE); + } + if (mServerSelectionListLayout != null) { + mServerSelectionListLayout.setAlpha(1f); + } + } + + @Override + public void showRestoreMenu(boolean shouldShowRestore) {} + + @Override + public void updateProfileView() {} +} diff --git a/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerSelectionActivity.java b/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerSelectionActivity.java index 3b7e9c63d6a..9546e135cca 100644 --- a/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerSelectionActivity.java +++ b/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerSelectionActivity.java @@ -149,16 +149,17 @@ public class VpnServerSelectionActivity extends BraveVpnParentActivity { new OnServerRegionSelection() { @Override public void onServerRegionClick(BraveVpnServerRegion braveVpnServerRegion) { - if (BraveVpnPrefUtils.getServerRegion() - .equals(braveVpnServerRegion.getName())) { - Toast.makeText( - VpnServerSelectionActivity.this, - R.string.already_selected_the_server, - Toast.LENGTH_SHORT) - .show(); - } else { - changeServerRegion(braveVpnServerRegion); - } + // if (BraveVpnPrefUtils.getServerRegion() + // .equals(braveVpnServerRegion.getName())) { + // Toast.makeText( + // VpnServerSelectionActivity.this, + // R.string.already_selected_the_server, + // Toast.LENGTH_SHORT) + // .show(); + // } else { + // changeServerRegion(braveVpnServerRegion); + // } + BraveVpnUtils.openVpnServerActivity(VpnServerSelectionActivity.this); } }); mServerRegionList.setAdapter(mBraveVpnServerSelectionAdapter); diff --git a/android/java/org/chromium/chrome/browser/vpn/adapters/BraveVpnServerSelectionAdapter.java b/android/java/org/chromium/chrome/browser/vpn/adapters/BraveVpnServerSelectionAdapter.java index e7871ca2dd3..d8d4ed1c340 100644 --- a/android/java/org/chromium/chrome/browser/vpn/adapters/BraveVpnServerSelectionAdapter.java +++ b/android/java/org/chromium/chrome/browser/vpn/adapters/BraveVpnServerSelectionAdapter.java @@ -1,9 +1,7 @@ -/** - * Copyright (c) 2021 The Brave Authors. All rights reserved. +/* Copyright (c) 2024 The Brave Authors. All rights reserved. * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at https://mozilla.org/MPL/2.0/. - */ + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at https://mozilla.org/MPL/2.0/. */ package org.chromium.chrome.browser.vpn.adapters; diff --git a/android/java/org/chromium/chrome/browser/vpn/adapters/VpnServerAdapter.java b/android/java/org/chromium/chrome/browser/vpn/adapters/VpnServerAdapter.java new file mode 100644 index 00000000000..234880b989f --- /dev/null +++ b/android/java/org/chromium/chrome/browser/vpn/adapters/VpnServerAdapter.java @@ -0,0 +1,92 @@ +/** + * Copyright (c) 2021 The Brave Authors. All rights reserved. This Source Code Form is subject to + * the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with + * this file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ +package org.chromium.chrome.browser.vpn.adapters; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.LinearLayout; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.google.android.material.radiobutton.MaterialRadioButton; + +import org.chromium.chrome.R; +import org.chromium.chrome.browser.vpn.activities.VpnServerActivity.OnServerRegionSelection; +import org.chromium.chrome.browser.vpn.models.BraveVpnServerRegion; +import org.chromium.chrome.browser.vpn.utils.BraveVpnPrefUtils; + +import java.util.ArrayList; +import java.util.List; + +public class VpnServerAdapter extends RecyclerView.Adapter { + private final Context mContext; + private List mBraveVpnServerRegions = new ArrayList<>(); + private OnServerRegionSelection mOnServerRegionSelection; + + public VpnServerAdapter(Context context) { + this.mContext = context; + } + + @NonNull + @Override + public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext()); + View listItem = layoutInflater.inflate(R.layout.vpn_server_item_layout, parent, false); + return new ViewHolder(listItem); + } + + @Override + public void onBindViewHolder(@NonNull ViewHolder holder, int position) { + final BraveVpnServerRegion vpnServerRegion = mBraveVpnServerRegions.get(position); + if (vpnServerRegion != null) { + holder.serverText.setText(vpnServerRegion.getNamePretty()); + holder.cityServerText.setText( + mContext.getResources().getString(R.string.city_server_text)); + holder.serverRadioButton.setChecked( + BraveVpnPrefUtils.getServerRegion().equals(vpnServerRegion.getName())); + holder.serverSelectionItemLayout.setOnClickListener( + new View.OnClickListener() { + @Override + public void onClick(View v) { + mOnServerRegionSelection.onServerRegionClick(vpnServerRegion); + } + }); + } + } + + @Override + public int getItemCount() { + return mBraveVpnServerRegions.size(); + } + + public void setVpnServerRegions(List vpnServerRegions) { + this.mBraveVpnServerRegions = vpnServerRegions; + } + + public void setOnServerRegionSelection(OnServerRegionSelection onServerRegionSelection) { + this.mOnServerRegionSelection = onServerRegionSelection; + } + + public static class ViewHolder extends RecyclerView.ViewHolder { + public LinearLayout serverSelectionItemLayout; + public TextView serverText; + public TextView cityServerText; + public MaterialRadioButton serverRadioButton; + + public ViewHolder(View itemView) { + super(itemView); + this.serverSelectionItemLayout = + itemView.findViewById(R.id.server_selection_item_layout); + this.serverText = itemView.findViewById(R.id.server_text); + this.cityServerText = itemView.findViewById(R.id.city_server_text); + this.serverRadioButton = itemView.findViewById(R.id.server_radio_button); + } + } +} diff --git a/android/java/org/chromium/chrome/browser/vpn/utils/BraveVpnUtils.java b/android/java/org/chromium/chrome/browser/vpn/utils/BraveVpnUtils.java index 03b2c59dbb3..7c236ef83f1 100644 --- a/android/java/org/chromium/chrome/browser/vpn/utils/BraveVpnUtils.java +++ b/android/java/org/chromium/chrome/browser/vpn/utils/BraveVpnUtils.java @@ -30,6 +30,7 @@ import org.chromium.chrome.browser.vpn.activities.BraveVpnProfileActivity; import org.chromium.chrome.browser.vpn.activities.BraveVpnSupportActivity; import org.chromium.chrome.browser.vpn.activities.VpnAlwaysOnActivity; import org.chromium.chrome.browser.vpn.activities.VpnPaywallActivity; +import org.chromium.chrome.browser.vpn.activities.VpnServerActivity; import org.chromium.chrome.browser.vpn.activities.VpnServerSelectionActivity; import org.chromium.chrome.browser.vpn.fragments.BraveVpnAlwaysOnErrorDialogFragment; import org.chromium.chrome.browser.vpn.fragments.BraveVpnConfirmDialogFragment; @@ -121,6 +122,14 @@ public class BraveVpnUtils { activity.startActivity(vpnServerSelectionIntent); } + public static void openVpnServerActivity(Activity activity) { + if (activity == null) { + return; + } + Intent vpnServerIntent = new Intent(activity, VpnServerActivity.class); + activity.startActivity(vpnServerIntent); + } + public static void showProgressDialog(Activity activity, String message) { sProgressDialog = ProgressDialog.show(activity, "", message, true); } diff --git a/android/java/res/layout/activity_vpn_server.xml b/android/java/res/layout/activity_vpn_server.xml new file mode 100644 index 00000000000..3985aecf7d8 --- /dev/null +++ b/android/java/res/layout/activity_vpn_server.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/android/java/res/layout/activity_vpn_server_selection.xml b/android/java/res/layout/activity_vpn_server_selection.xml index 5cc558a1bc5..853253d4030 100644 --- a/android/java/res/layout/activity_vpn_server_selection.xml +++ b/android/java/res/layout/activity_vpn_server_selection.xml @@ -86,6 +86,7 @@ android:layout_height="50dp" android:visibility="gone" android:layout_gravity="center" + android:gravity="center" android:indeterminate="true"/> diff --git a/android/java/res/layout/vpn_server_item_layout.xml b/android/java/res/layout/vpn_server_item_layout.xml new file mode 100644 index 00000000000..a5b4bb3086f --- /dev/null +++ b/android/java/res/layout/vpn_server_item_layout.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + diff --git a/browser/ui/android/strings/android_brave_strings.grd b/browser/ui/android/strings/android_brave_strings.grd index d7e54fcb352..1e049681b76 100644 --- a/browser/ui/android/strings/android_brave_strings.grd +++ b/browser/ui/android/strings/android_brave_strings.grd @@ -2431,6 +2431,9 @@ If you don't accept this request, VPN will not reconnect and your internet conne Servers + + Available Servers + Select Issue From 11877b3541020cc0331e6d2ec7b824797ddfd7f4 Mon Sep 17 00:00:00 2001 From: deeppandya Date: Fri, 2 Aug 2024 13:14:12 +0530 Subject: [PATCH 05/31] Add region list for cities into Region struct --- .../brave_vpn_region_data_manager.cc | 28 +++++++++++++++++-- .../brave_vpn/common/brave_vpn_constants.h | 1 + .../brave_vpn/common/mojom/brave_vpn.mojom | 1 + 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/components/brave_vpn/browser/connection/brave_vpn_region_data_manager.cc b/components/brave_vpn/browser/connection/brave_vpn_region_data_manager.cc index 2baec063a7d..d1ee798eedf 100644 --- a/components/brave_vpn/browser/connection/brave_vpn_region_data_manager.cc +++ b/components/brave_vpn/browser/connection/brave_vpn_region_data_manager.cc @@ -22,7 +22,7 @@ namespace brave_vpn { namespace { -base::Value::Dict GetValueFromRegion(const mojom::Region& region) { +base::Value::Dict GetValueFromRegionWithoutCity(const mojom::Region& region) { base::Value::Dict region_dict; region_dict.Set(kRegionNameKey, region.name); region_dict.Set(kRegionNamePrettyKey, region.name_pretty); @@ -35,12 +35,24 @@ base::Value::Dict GetValueFromRegion(const mojom::Region& region) { return region_dict; } +base::Value::Dict GetValueFromRegion(const mojom::Region& region) { + base::Value::Dict region_dict = GetValueFromRegionWithoutCity(region); + base::Value::List cities; + for (const auto& city : region.cities) { + cities.Append(GetValueFromRegionWithoutCity(*city)); + // cities.Append(base::Value(city)); + } + region_dict.Set(kRegionCitiesKey, std::move(cities)); + return region_dict; +} + bool IsValidRegionValue(const base::Value::Dict& value) { if (!value.FindString(kRegionNameKey) || !value.FindString(kRegionNamePrettyKey) || !value.FindString(kRegionContinentKey) || !value.FindString(kRegionCountryIsoCodeKey) || !value.FindString(kRegionPrecisionKey) || + !value.FindList(kRegionCitiesKey) || !value.FindString(kRegionLatitudeKey) || !value.FindString(kRegionLongitudeKey) || !value.FindString(kRegionServerCountKey)) { @@ -50,7 +62,7 @@ bool IsValidRegionValue(const base::Value::Dict& value) { return true; } -mojom::Region GetRegionFromValue(const base::Value::Dict& value) { +mojom::Region GetRegionFromValueWithoutCity(const base::Value::Dict& value) { mojom::Region region; if (auto* name = value.FindString(brave_vpn::kRegionNameKey)) { region.name = *name; @@ -78,6 +90,16 @@ mojom::Region GetRegionFromValue(const base::Value::Dict& value) { if (auto server_count = value.FindInt(brave_vpn::kRegionServerCountKey)) { region.server_count = *server_count; } + + return region; +} + +mojom::Region GetRegionFromValue(const base::Value::Dict& value) { + mojom::Region region = GetRegionFromValueWithoutCity(value); + for (const auto& city : *value.FindList(kRegionCitiesKey)) { + region.cities.push_back(GetRegionFromValueWithoutCity(city.GetDict()).Clone()); + } + return region; } @@ -100,7 +122,7 @@ std::vector ParseRegionList( if (!value.is_dict()) { continue; } - regions.push_back(GetRegionFromValue(value.GetDict())); + regions.push_back(GetRegionFromValue(value.GetDict()).Clone()); } // Sort region list alphabetically diff --git a/components/brave_vpn/common/brave_vpn_constants.h b/components/brave_vpn/common/brave_vpn_constants.h index 3960ad7a028..7a54fd230df 100644 --- a/components/brave_vpn/common/brave_vpn_constants.h +++ b/components/brave_vpn/common/brave_vpn_constants.h @@ -25,6 +25,7 @@ inline constexpr char kRegionNamePrettyKey[] = "name-pretty"; inline constexpr char kRegionContinentKey[] = "continent"; inline constexpr char kRegionCountryIsoCodeKey[] = "country-iso-code"; inline constexpr char kRegionPrecisionKey[] = "region-precision"; +inline constexpr char kRegionCitiesKey[] = "cities"; inline constexpr char kRegionLatitudeKey[] = "latitude"; inline constexpr char kRegionLongitudeKey[] = "longitude"; inline constexpr char kRegionServerCountKey[] = "server-count"; diff --git a/components/brave_vpn/common/mojom/brave_vpn.mojom b/components/brave_vpn/common/mojom/brave_vpn.mojom index 9274fcb04a4..c81efcf9533 100644 --- a/components/brave_vpn/common/mojom/brave_vpn.mojom +++ b/components/brave_vpn/common/mojom/brave_vpn.mojom @@ -128,6 +128,7 @@ struct Region { string continent; string country_iso_code; string region_precision; + array cities; double latitude; double longitude; int32 server_count; From 71193aa17bc0958be4e91b5129d3aecf823f63cb Mon Sep 17 00:00:00 2001 From: deeppandya Date: Fri, 2 Aug 2024 14:42:03 +0530 Subject: [PATCH 06/31] Replace mojo objects with mojoptr --- .../browser/vpn/BraveVpnNativeWorker.java | 3 + .../vpn/adapters/VpnServerAdapter.java | 10 +-- .../brave_vpn_region_data_manager.cc | 75 ++++++++++--------- .../brave_vpn_region_data_manager.h | 4 +- 4 files changed, 50 insertions(+), 42 deletions(-) diff --git a/android/java/org/chromium/chrome/browser/vpn/BraveVpnNativeWorker.java b/android/java/org/chromium/chrome/browser/vpn/BraveVpnNativeWorker.java index 803f75473d6..0de70b392ff 100644 --- a/android/java/org/chromium/chrome/browser/vpn/BraveVpnNativeWorker.java +++ b/android/java/org/chromium/chrome/browser/vpn/BraveVpnNativeWorker.java @@ -257,9 +257,12 @@ public class BraveVpnNativeWorker { void reloadPurchasedState(long nativeBraveVpnNativeWorker); boolean isPurchasedUser(long nativeBraveVpnNativeWorker); + void getSubscriberCredentialV12(long nativeBraveVpnNativeWorker); + void reportBackgroundP3A( long nativeBraveVpnNativeWorker, long sessionStartTimeMs, long sessionEndTimeMs); + void reportForegroundP3A(long nativeBraveVpnNativeWorker); } } diff --git a/android/java/org/chromium/chrome/browser/vpn/adapters/VpnServerAdapter.java b/android/java/org/chromium/chrome/browser/vpn/adapters/VpnServerAdapter.java index 234880b989f..08cd8ec467e 100644 --- a/android/java/org/chromium/chrome/browser/vpn/adapters/VpnServerAdapter.java +++ b/android/java/org/chromium/chrome/browser/vpn/adapters/VpnServerAdapter.java @@ -1,8 +1,8 @@ -/** - * Copyright (c) 2021 The Brave Authors. All rights reserved. This Source Code Form is subject to - * the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with - * this file, You can obtain one at https://mozilla.org/MPL/2.0/. - */ +/* Copyright (c) 2024 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at https://mozilla.org/MPL/2.0/. */ + package org.chromium.chrome.browser.vpn.adapters; import android.content.Context; diff --git a/components/brave_vpn/browser/connection/brave_vpn_region_data_manager.cc b/components/brave_vpn/browser/connection/brave_vpn_region_data_manager.cc index d1ee798eedf..3c4469b046c 100644 --- a/components/brave_vpn/browser/connection/brave_vpn_region_data_manager.cc +++ b/components/brave_vpn/browser/connection/brave_vpn_region_data_manager.cc @@ -22,25 +22,25 @@ namespace brave_vpn { namespace { -base::Value::Dict GetValueFromRegionWithoutCity(const mojom::Region& region) { +base::Value::Dict GetValueFromRegionWithoutCity( + const mojom::RegionPtr& region) { base::Value::Dict region_dict; - region_dict.Set(kRegionNameKey, region.name); - region_dict.Set(kRegionNamePrettyKey, region.name_pretty); - region_dict.Set(kRegionContinentKey, region.continent); - region_dict.Set(kRegionCountryIsoCodeKey, region.country_iso_code); - region_dict.Set(kRegionPrecisionKey, region.region_precision); - region_dict.Set(kRegionLatitudeKey, region.latitude); - region_dict.Set(kRegionLongitudeKey, region.longitude); - region_dict.Set(kRegionServerCountKey, region.server_count); + region_dict.Set(kRegionNameKey, region->name); + region_dict.Set(kRegionNamePrettyKey, region->name_pretty); + region_dict.Set(kRegionContinentKey, region->continent); + region_dict.Set(kRegionCountryIsoCodeKey, region->country_iso_code); + region_dict.Set(kRegionPrecisionKey, region->region_precision); + region_dict.Set(kRegionLatitudeKey, region->latitude); + region_dict.Set(kRegionLongitudeKey, region->longitude); + region_dict.Set(kRegionServerCountKey, region->server_count); return region_dict; } -base::Value::Dict GetValueFromRegion(const mojom::Region& region) { +base::Value::Dict GetValueFromRegion(const mojom::RegionPtr& region) { base::Value::Dict region_dict = GetValueFromRegionWithoutCity(region); base::Value::List cities; - for (const auto& city : region.cities) { - cities.Append(GetValueFromRegionWithoutCity(*city)); - // cities.Append(base::Value(city)); + for (const auto& city : region->cities) { + cities.Append(GetValueFromRegionWithoutCity(city)); } region_dict.Set(kRegionCitiesKey, std::move(cities)); return region_dict; @@ -62,42 +62,47 @@ bool IsValidRegionValue(const base::Value::Dict& value) { return true; } -mojom::Region GetRegionFromValueWithoutCity(const base::Value::Dict& value) { - mojom::Region region; +mojom::RegionPtr GetRegionFromValueWithoutCity(const base::Value::Dict& value) { + mojom::RegionPtr region = mojom::Region::New(); if (auto* name = value.FindString(brave_vpn::kRegionNameKey)) { - region.name = *name; + region->name = *name; } if (auto* name_pretty = value.FindString(brave_vpn::kRegionNamePrettyKey)) { - region.name_pretty = *name_pretty; + region->name_pretty = *name_pretty; } if (auto* continent = value.FindString(brave_vpn::kRegionContinentKey)) { - region.continent = *continent; + region->continent = *continent; } if (auto* country_iso_code = value.FindString(brave_vpn::kRegionCountryIsoCodeKey)) { - region.country_iso_code = *country_iso_code; + region->country_iso_code = *country_iso_code; } if (auto* region_precision = value.FindString(brave_vpn::kRegionPrecisionKey)) { - region.region_precision = *region_precision; + region->region_precision = *region_precision; } if (auto latitude = value.FindDouble(brave_vpn::kRegionLatitudeKey)) { - region.latitude = *latitude; + region->latitude = *latitude; } if (auto longitude = value.FindDouble(brave_vpn::kRegionLongitudeKey)) { - region.longitude = *longitude; + region->longitude = *longitude; } if (auto server_count = value.FindInt(brave_vpn::kRegionServerCountKey)) { - region.server_count = *server_count; + region->server_count = *server_count; } return region; } -mojom::Region GetRegionFromValue(const base::Value::Dict& value) { - mojom::Region region = GetRegionFromValueWithoutCity(value); - for (const auto& city : *value.FindList(kRegionCitiesKey)) { - region.cities.push_back(GetRegionFromValueWithoutCity(city.GetDict()).Clone()); +mojom::RegionPtr GetRegionFromValue(const base::Value::Dict& value) { + mojom::RegionPtr region = GetRegionFromValueWithoutCity(value); + // for (const auto& city : *value.FindList(kRegionCitiesKey)) { + // region.cities.push_back(GetRegionFromValueWithoutCity(city.GetDict()).Clone()); + // } + + const auto* cities = value.FindList(kRegionCitiesKey); + for (const auto& city : *cities) { + region->cities.push_back(GetRegionFromValueWithoutCity(city.GetDict())); } return region; @@ -114,9 +119,9 @@ bool ValidateCachedRegionData(const base::Value::List& region_value) { return true; } -std::vector ParseRegionList( +std::vector ParseRegionList( const base::Value::List& region_list) { - std::vector regions; + std::vector regions; for (const auto& value : region_list) { DCHECK(value.is_dict()); if (!value.is_dict()) { @@ -127,8 +132,8 @@ std::vector ParseRegionList( // Sort region list alphabetically std::sort(regions.begin(), regions.end(), - [](mojom::Region& a, mojom::Region& b) { - return (a.name_pretty < b.name_pretty); + [](mojom::RegionPtr& a, mojom::RegionPtr& b) { + return (a->name_pretty < b->name_pretty); }); return regions; } @@ -144,7 +149,7 @@ BraveVPNRegionDataManager::BraveVPNRegionDataManager( BraveVPNRegionDataManager::~BraveVPNRegionDataManager() = default; -const std::vector& BraveVPNRegionDataManager::GetRegions() +const std::vector& BraveVPNRegionDataManager::GetRegions() const { return regions_; } @@ -187,7 +192,7 @@ void BraveVPNRegionDataManager::SetDeviceRegion(const std::string& name) { void BraveVPNRegionDataManager::SetFallbackDeviceRegion() { // Set first item in the region list as a |device_region_| as a fallback. DCHECK(!regions_.empty()); - SetDeviceRegion(regions_[0].name); + SetDeviceRegion(regions_[0]->name); } void BraveVPNRegionDataManager::SetDeviceRegionWithTimezone( @@ -339,7 +344,7 @@ void BraveVPNRegionDataManager::OnFetchRegionList( bool BraveVPNRegionDataManager::ParseAndCacheRegionList( const base::Value::List& region_value, bool save_to_prefs) { - const auto new_regions = ParseRegionList(region_value); + auto new_regions = ParseRegionList(region_value); VLOG(2) << __func__ << " : has regionlist: " << !new_regions.empty(); // To avoid deleting current valid |regions_|, only assign when @@ -348,7 +353,7 @@ bool BraveVPNRegionDataManager::ParseAndCacheRegionList( return false; } - regions_ = new_regions; + regions_ = std::move(new_regions); if (save_to_prefs) { SetRegionListToPrefs(); diff --git a/components/brave_vpn/browser/connection/brave_vpn_region_data_manager.h b/components/brave_vpn/browser/connection/brave_vpn_region_data_manager.h index 798b5b9676f..d26586e8889 100644 --- a/components/brave_vpn/browser/connection/brave_vpn_region_data_manager.h +++ b/components/brave_vpn/browser/connection/brave_vpn_region_data_manager.h @@ -31,7 +31,7 @@ class BraveVPNRegionDataManager { BraveVPNRegionDataManager& operator=(const BraveVPNRegionDataManager&) = delete; - const std::vector& GetRegions() const; + const std::vector& GetRegions() const; bool IsRegionDataReady() const; std::string GetSelectedRegion() const; void FetchRegionDataIfNeeded(); @@ -72,7 +72,7 @@ class BraveVPNRegionDataManager { // For testing only. std::string test_timezone_; - std::vector regions_; + std::vector regions_; // Only not null when region_data fetching is in-progress. scoped_refptr url_loader_factory_; From 93682d4e9edfa80f9e9c688cb1001fbc46c53314 Mon Sep 17 00:00:00 2001 From: deeppandya Date: Sat, 3 Aug 2024 05:39:53 +0530 Subject: [PATCH 07/31] Expose region related functions fo android --- .../vpn/adapters/VpnServerAdapter.java | 2 +- .../brave_vpn/browser/brave_vpn_service.cc | 58 +++++++++---------- .../brave_vpn/browser/brave_vpn_service.h | 9 +-- .../browser/brave_vpn_service_helper.cc | 2 +- .../browser/brave_vpn_service_helper.h | 2 +- .../brave_vpn/common/mojom/brave_vpn.mojom | 3 - 6 files changed, 37 insertions(+), 39 deletions(-) diff --git a/android/java/org/chromium/chrome/browser/vpn/adapters/VpnServerAdapter.java b/android/java/org/chromium/chrome/browser/vpn/adapters/VpnServerAdapter.java index 08cd8ec467e..61e7d1afc6f 100644 --- a/android/java/org/chromium/chrome/browser/vpn/adapters/VpnServerAdapter.java +++ b/android/java/org/chromium/chrome/browser/vpn/adapters/VpnServerAdapter.java @@ -2,7 +2,7 @@ * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this file, * You can obtain one at https://mozilla.org/MPL/2.0/. */ - + package org.chromium.chrome.browser.vpn.adapters; import android.content.Context; diff --git a/components/brave_vpn/browser/brave_vpn_service.cc b/components/brave_vpn/browser/brave_vpn_service.cc index 59d8bd61b2c..d513e96143d 100644 --- a/components/brave_vpn/browser/brave_vpn_service.cc +++ b/components/brave_vpn/browser/brave_vpn_service.cc @@ -52,11 +52,11 @@ BraveVpnService::BraveVpnService( skus_service_getter_(skus_service_getter), api_request_(new BraveVpnAPIRequest(url_loader_factory)) { DCHECK(IsBraveVPNFeatureEnabled()); -#if !BUILDFLAG(IS_ANDROID) DCHECK(connection_manager); connection_manager_ = connection_manager; - observed_.Observe(connection_manager_); +#if !BUILDFLAG(IS_ANDROID) + observed_.Observe(connection_manager_); policy_pref_change_registrar_.Init(profile_prefs_); policy_pref_change_registrar_.Add( prefs::kManagedBraveVPNDisabled, @@ -238,33 +238,6 @@ void BraveVpnService::GetConnectionState(GetConnectionStateCallback callback) { std::move(callback).Run(state); } -void BraveVpnService::GetAllRegions(GetAllRegionsCallback callback) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - std::vector regions; - for (const auto& region : - connection_manager_->GetRegionDataManager().GetRegions()) { - regions.push_back(region.Clone()); - } - std::move(callback).Run(std::move(regions)); -} - -void BraveVpnService::GetSelectedRegion(GetSelectedRegionCallback callback) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - VLOG(2) << __func__; - - auto region_name = - connection_manager_->GetRegionDataManager().GetSelectedRegion(); - std::move(callback).Run(GetRegionPtrWithNameFromRegionList( - region_name, connection_manager_->GetRegionDataManager().GetRegions())); -} - -void BraveVpnService::SetSelectedRegion(mojom::RegionPtr region_ptr) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - - VLOG(2) << __func__ << " : " << region_ptr->name_pretty; - connection_manager_->SetSelectedRegion(region_ptr->name); -} - void BraveVpnService::GetProductUrls(GetProductUrlsCallback callback) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); std::move(callback).Run(mojom::ProductUrls::New( @@ -380,6 +353,33 @@ void BraveVpnService::UpdatePurchasedStateForSessionExpired( } #endif // !BUILDFLAG(IS_ANDROID) +void BraveVpnService::GetAllRegions(GetAllRegionsCallback callback) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + std::vector regions; + for (const auto& region : + connection_manager_->GetRegionDataManager().GetRegions()) { + regions.push_back(region.Clone()); + } + std::move(callback).Run(std::move(regions)); +} + +void BraveVpnService::GetSelectedRegion(GetSelectedRegionCallback callback) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + VLOG(2) << __func__; + + auto region_name = + connection_manager_->GetRegionDataManager().GetSelectedRegion(); + std::move(callback).Run(GetRegionPtrWithNameFromRegionList( + region_name, connection_manager_->GetRegionDataManager().GetRegions())); +} + +void BraveVpnService::SetSelectedRegion(mojom::RegionPtr region_ptr) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + + VLOG(2) << __func__ << " : " << region_ptr->name_pretty; + connection_manager_->SetSelectedRegion(region_ptr->name); +} + #if BUILDFLAG(IS_ANDROID) void BraveVpnService::GetPurchaseToken(GetPurchaseTokenCallback callback) { std::string purchase_token_string = ""; diff --git a/components/brave_vpn/browser/brave_vpn_service.h b/components/brave_vpn/browser/brave_vpn_service.h index c6659e42a6d..e64bf65a538 100644 --- a/components/brave_vpn/browser/brave_vpn_service.h +++ b/components/brave_vpn/browser/brave_vpn_service.h @@ -95,9 +95,6 @@ class BraveVpnService : void GetConnectionState(GetConnectionStateCallback callback) override; void Connect() override; void Disconnect() override; - void GetAllRegions(GetAllRegionsCallback callback) override; - void GetSelectedRegion(GetSelectedRegionCallback callback) override; - void SetSelectedRegion(mojom::RegionPtr region) override; void GetProductUrls(GetProductUrlsCallback callback) override; void CreateSupportTicket(const std::string& email, const std::string& subject, @@ -121,6 +118,10 @@ class BraveVpnService : void GetPurchasedState(GetPurchasedStateCallback callback) override; void LoadPurchasedState(const std::string& domain) override; + void GetAllRegions(GetAllRegionsCallback callback) override; + void GetSelectedRegion(GetSelectedRegionCallback callback) override; + void SetSelectedRegion(mojom::RegionPtr region) override; + void GetAllServerRegions(ResponseCallback callback); void GetServerRegionsWithCities(ResponseCallback callback); void GetTimezonesForRegions(ResponseCallback callback); @@ -219,13 +220,13 @@ class BraveVpnService : // Check initial purchased/connected state. void CheckInitialState(); + raw_ptr connection_manager_ = nullptr; #if !BUILDFLAG(IS_ANDROID) base::ScopedObservation observed_{this}; bool wait_region_data_ready_ = false; - raw_ptr connection_manager_ = nullptr; PrefChangeRegistrar policy_pref_change_registrar_; #endif // !BUILDFLAG(IS_ANDROID) diff --git a/components/brave_vpn/browser/brave_vpn_service_helper.cc b/components/brave_vpn/browser/brave_vpn_service_helper.cc index 7ef5f18c28c..d44e2cb4a1e 100644 --- a/components/brave_vpn/browser/brave_vpn_service_helper.cc +++ b/components/brave_vpn/browser/brave_vpn_service_helper.cc @@ -27,7 +27,7 @@ namespace brave_vpn { mojom::RegionPtr GetRegionPtrWithNameFromRegionList( const std::string& name, - const std::vector region_list) { + const std::vector& region_list) { auto it = base::ranges::find(region_list, name, &mojom::Region::name); if (it != region_list.end()) return it->Clone(); diff --git a/components/brave_vpn/browser/brave_vpn_service_helper.h b/components/brave_vpn/browser/brave_vpn_service_helper.h index c31cea266d9..6017cd555ec 100644 --- a/components/brave_vpn/browser/brave_vpn_service_helper.h +++ b/components/brave_vpn/browser/brave_vpn_service_helper.h @@ -24,7 +24,7 @@ class Value; namespace brave_vpn { mojom::RegionPtr GetRegionPtrWithNameFromRegionList( const std::string& name, - const std::vector region_list); + const std::vector& region_list); // False if subscription is expired. bool IsValidCredentialSummary(const base::Value& summary); diff --git a/components/brave_vpn/common/mojom/brave_vpn.mojom b/components/brave_vpn/common/mojom/brave_vpn.mojom index c81efcf9533..66f680c72f4 100644 --- a/components/brave_vpn/common/mojom/brave_vpn.mojom +++ b/components/brave_vpn/common/mojom/brave_vpn.mojom @@ -51,13 +51,10 @@ interface ServiceHandler { Disconnect(); // Gets all region from internal cache which is fetched from Guardian API - [EnableIfNot=is_android] GetAllRegions() => (array regions); - [EnableIfNot=is_android] GetSelectedRegion() => (Region current_region); - [EnableIfNot=is_android] SetSelectedRegion(Region region); [EnableIfNot=is_android] From affc520ce40be8c0707d4ff4290abf79935f99c4 Mon Sep 17 00:00:00 2001 From: deeppandya Date: Thu, 8 Aug 2024 03:30:58 +0530 Subject: [PATCH 08/31] Add changes to support mojom interface for getting regions --- android/brave_java_sources.gni | 1 + .../vpn/BraveVpnServiceFactoryAndroid.java | 67 ++++++++ .../VpnServerSelectionActivity.java | 39 ++++- .../vpn/utils/BraveVpnApiResponseUtils.java | 2 +- .../brave_vpn_service_factory_android.cc | 31 ++++ .../brave_vpn/brave_vpn_service_factory.cc | 10 ++ browser/brave_vpn/brave_vpn_service_factory.h | 7 + browser/brave_vpn/sources.gni | 6 +- build/android/BUILD.gn | 1 + build/android/config.gni | 1 + .../brave_vpn/browser/brave_vpn_service.cc | 36 ++++- .../brave_vpn/browser/brave_vpn_service.h | 9 ++ .../browser/brave_vpn_service_helper.cc | 113 ++++++++++++++ .../browser/brave_vpn_service_helper.h | 8 + .../brave_vpn_region_data_manager.cc | 144 +++--------------- .../brave_vpn_region_data_manager.h | 1 + .../brave_vpn/common/mojom/brave_vpn.mojom | 2 - 17 files changed, 348 insertions(+), 130 deletions(-) create mode 100644 android/java/org/chromium/chrome/browser/vpn/BraveVpnServiceFactoryAndroid.java create mode 100644 browser/brave_vpn/android/brave_vpn_service_factory_android.cc diff --git a/android/brave_java_sources.gni b/android/brave_java_sources.gni index acc3957e714..d4adfc4920e 100644 --- a/android/brave_java_sources.gni +++ b/android/brave_java_sources.gni @@ -455,6 +455,7 @@ brave_java_sources = [ "../../brave/android/java/org/chromium/chrome/browser/util/UsageMonitor.java", "../../brave/android/java/org/chromium/chrome/browser/vpn/BraveVpnNativeWorker.java", "../../brave/android/java/org/chromium/chrome/browser/vpn/BraveVpnObserver.java", + "../../brave/android/java/org/chromium/chrome/browser/vpn/BraveVpnServiceFactoryAndroid.java", "../../brave/android/java/org/chromium/chrome/browser/vpn/DisconnectVpnBroadcastReceiver.java", "../../brave/android/java/org/chromium/chrome/browser/vpn/activities/BraveVpnParentActivity.java", "../../brave/android/java/org/chromium/chrome/browser/vpn/activities/BraveVpnProfileActivity.java", diff --git a/android/java/org/chromium/chrome/browser/vpn/BraveVpnServiceFactoryAndroid.java b/android/java/org/chromium/chrome/browser/vpn/BraveVpnServiceFactoryAndroid.java new file mode 100644 index 00000000000..2b78a7cadc8 --- /dev/null +++ b/android/java/org/chromium/chrome/browser/vpn/BraveVpnServiceFactoryAndroid.java @@ -0,0 +1,67 @@ +/* Copyright (c) 2024 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at https://mozilla.org/MPL/2.0/. */ + +package org.chromium.chrome.browser.vpn; + +import org.jni_zero.JNINamespace; +import org.jni_zero.NativeMethods; + +import org.chromium.base.Log; +import org.chromium.brave_vpn.mojom.ServiceHandler; +import org.chromium.chrome.browser.profiles.Profile; +import org.chromium.mojo.bindings.ConnectionErrorHandler; +import org.chromium.mojo.bindings.Interface; +import org.chromium.mojo.bindings.Interface.Proxy.Handler; +import org.chromium.mojo.system.MessagePipeHandle; +import org.chromium.mojo.system.impl.CoreImpl; + +@JNINamespace("chrome::android") +public class BraveVpnServiceFactoryAndroid { + private static final Object sLock = new Object(); + private static BraveVpnServiceFactoryAndroid sInstance; + + public static BraveVpnServiceFactoryAndroid getInstance() { + synchronized (sLock) { + if (sInstance == null) { + sInstance = new BraveVpnServiceFactoryAndroid(); + } + } + return sInstance; + } + + private BraveVpnServiceFactoryAndroid() {} + + public ServiceHandler getVpnService( + Profile profile, ConnectionErrorHandler connectionErrorHandler) { + Log.e("brave_vpn", "BraveVpnServiceFactoryAndroid : getVpnService 1"); + if (profile == null) { + return null; + } + Log.e("brave_vpn", "BraveVpnServiceFactoryAndroid : getVpnService 2"); + long nativeHandle = + BraveVpnServiceFactoryAndroidJni.get().getInterfaceToVpnService(profile); + Log.e("brave_vpn", "BraveVpnServiceFactoryAndroid : getVpnService 2.5"); + if (nativeHandle == -1) { + return null; + } + Log.e("brave_vpn", "BraveVpnServiceFactoryAndroid : getVpnService 3"); + MessagePipeHandle handle = wrapNativeHandle(nativeHandle); + ServiceHandler serviceHandler = ServiceHandler.MANAGER.attachProxy(handle, 0); + Handler handler = ((Interface.Proxy) serviceHandler).getProxyHandler(); + handler.setErrorHandler(connectionErrorHandler); + Log.e("brave_vpn", "BraveVpnServiceFactoryAndroid : getVpnService 4"); + + return serviceHandler; + } + + private MessagePipeHandle wrapNativeHandle(long nativeHandle) { + return CoreImpl.getInstance().acquireNativeHandle(nativeHandle).toMessagePipeHandle(); + } + + @NativeMethods + interface Natives { + long getInterfaceToVpnService(Profile profile); + } +} diff --git a/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerSelectionActivity.java b/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerSelectionActivity.java index 9546e135cca..a2a94f8b44b 100644 --- a/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerSelectionActivity.java +++ b/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerSelectionActivity.java @@ -20,25 +20,52 @@ import androidx.recyclerview.widget.RecyclerView; import com.google.android.material.materialswitch.MaterialSwitch; import org.chromium.base.Log; +import org.chromium.brave_vpn.mojom.Region; +import org.chromium.brave_vpn.mojom.ServiceHandler; import org.chromium.chrome.R; import org.chromium.chrome.browser.vpn.BraveVpnNativeWorker; +import org.chromium.chrome.browser.vpn.BraveVpnServiceFactoryAndroid; import org.chromium.chrome.browser.vpn.adapters.BraveVpnServerSelectionAdapter; import org.chromium.chrome.browser.vpn.models.BraveVpnPrefModel; import org.chromium.chrome.browser.vpn.models.BraveVpnServerRegion; import org.chromium.chrome.browser.vpn.utils.BraveVpnPrefUtils; import org.chromium.chrome.browser.vpn.utils.BraveVpnUtils; +import org.chromium.mojo.bindings.ConnectionErrorHandler; +import org.chromium.mojo.system.MojoException; import org.chromium.ui.widget.Toast; import java.util.Collections; import java.util.Comparator; import java.util.List; -public class VpnServerSelectionActivity extends BraveVpnParentActivity { +public class VpnServerSelectionActivity extends BraveVpnParentActivity + implements ConnectionErrorHandler { private BraveVpnServerSelectionAdapter mBraveVpnServerSelectionAdapter; private LinearLayout mServerSelectionListLayout; private ProgressBar mServerSelectionProgress; private RecyclerView mServerRegionList; + private ServiceHandler mServiceHandler; + + @Override + public void onConnectionError(MojoException e) { + if (mServiceHandler != null) { + mServiceHandler.close(); + mServiceHandler = null; + } + initVpnService(); + } + + private void initVpnService() { + if (mServiceHandler != null) { + mServiceHandler = null; + } + mServiceHandler = + BraveVpnServiceFactoryAndroid.getInstance() + .getVpnService( + getProfileProviderSupplier().get().getOriginalProfile(), this); + } + public interface OnServerRegionSelection { void onServerRegionClick(BraveVpnServerRegion vpnServerRegion); } @@ -120,8 +147,16 @@ public class VpnServerSelectionActivity extends BraveVpnParentActivity { @Override public void finishNativeInitialization() { super.finishNativeInitialization(); - BraveVpnNativeWorker.getInstance().getServerRegionsWithCities(); + initVpnService(); + // BraveVpnNativeWorker.getInstance().getServerRegionsWithCities(); showProgress(); + Log.e("brave_vpn", "initVpnService"); + mServiceHandler.getAllRegions( + regions -> { + for (Region region : regions) { + Log.e("brave_vpn", region.name); + } + }); } @Override diff --git a/android/java/org/chromium/chrome/browser/vpn/utils/BraveVpnApiResponseUtils.java b/android/java/org/chromium/chrome/browser/vpn/utils/BraveVpnApiResponseUtils.java index b3915e37754..5d105c63323 100644 --- a/android/java/org/chromium/chrome/browser/vpn/utils/BraveVpnApiResponseUtils.java +++ b/android/java/org/chromium/chrome/browser/vpn/utils/BraveVpnApiResponseUtils.java @@ -84,7 +84,7 @@ public class BraveVpnApiResponseUtils { String serverRegion = BraveVpnPrefUtils.getServerRegion(); region = serverRegion.equals(BraveVpnPrefUtils.PREF_BRAVE_VPN_AUTOMATIC) - ? "" + ? region : serverRegion; } diff --git a/browser/brave_vpn/android/brave_vpn_service_factory_android.cc b/browser/brave_vpn/android/brave_vpn_service_factory_android.cc new file mode 100644 index 00000000000..7b5a6db0ed5 --- /dev/null +++ b/browser/brave_vpn/android/brave_vpn_service_factory_android.cc @@ -0,0 +1,31 @@ +/* Copyright (c) 2024 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at https://mozilla.org/MPL/2.0/. */ + +#include "brave/browser/brave_vpn/brave_vpn_service_factory.h" + +#include "base/android/jni_android.h" +#include "brave/build/android/jni_headers/BraveVpnServiceFactoryAndroid_jni.h" +#include "chrome/browser/profiles/profile.h" +#include "mojo/public/cpp/bindings/pending_receiver.h" + +namespace chrome { +namespace android { +static jlong JNI_BraveVpnServiceFactoryAndroid_GetInterfaceToVpnService( + JNIEnv* env, + const base::android::JavaParamRef& profile_android) { + LOG(ERROR) << "brave_vpn" + << "JNI_BraveVpnServiceFactoryAndroid_GetInterfaceToVpnService"; + auto* profile = Profile::FromJavaObject(profile_android); + if (profile == nullptr) { + return static_cast(-1); + } + auto pending = + brave_vpn::BraveVpnServiceFactory::GetInstance()->GetForContext(profile); + + return static_cast(pending.PassPipe().release().value()); +} + +} // namespace android +} // namespace chrome diff --git a/browser/brave_vpn/brave_vpn_service_factory.cc b/browser/brave_vpn/brave_vpn_service_factory.cc index 64e4763ac9c..12488a2030e 100644 --- a/browser/brave_vpn/brave_vpn_service_factory.cc +++ b/browser/brave_vpn/brave_vpn_service_factory.cc @@ -89,6 +89,16 @@ BraveVpnServiceFactory* BraveVpnServiceFactory::GetInstance() { return instance.get(); } +#if BUILDFLAG(IS_ANDROID) +// static +mojo::PendingRemote +BraveVpnServiceFactory::GetForContext(content::BrowserContext* context) { + return static_cast( + GetInstance()->GetServiceForBrowserContext(context, true)) + ->MakeRemote(); +} +#endif // BUILDFLAG(IS_ANDROID) + // static BraveVpnService* BraveVpnServiceFactory::GetForProfile(Profile* profile) { return static_cast( diff --git a/browser/brave_vpn/brave_vpn_service_factory.h b/browser/brave_vpn/brave_vpn_service_factory.h index c3e3de18177..6f4d38d078f 100644 --- a/browser/brave_vpn/brave_vpn_service_factory.h +++ b/browser/brave_vpn/brave_vpn_service_factory.h @@ -11,6 +11,9 @@ #include "brave/components/brave_vpn/common/mojom/brave_vpn.mojom.h" #include "build/build_config.h" #include "components/keyed_service/content/browser_context_keyed_service_factory.h" +#if BUILDFLAG(IS_ANDROID) +#include "mojo/public/cpp/bindings/pending_remote.h" +#endif // BUILDFLAG(IS_ANDROID) class Profile; @@ -26,6 +29,10 @@ class BraveVpnService; class BraveVpnServiceFactory : public BrowserContextKeyedServiceFactory { public: static BraveVpnService* GetForProfile(Profile* profile); +#if BUILDFLAG(IS_ANDROID) + static mojo::PendingRemote GetForContext( + content::BrowserContext* context); +#endif // BUILDFLAG(IS_ANDROID) static BraveVpnServiceFactory* GetInstance(); BraveVpnServiceFactory(const BraveVpnServiceFactory&) = delete; diff --git a/browser/brave_vpn/sources.gni b/browser/brave_vpn/sources.gni index ca6c327b06b..48f056aab78 100644 --- a/browser/brave_vpn/sources.gni +++ b/browser/brave_vpn/sources.gni @@ -53,7 +53,11 @@ if (enable_brave_vpn) { brave_browser_brave_vpn_sources += [ "//brave/browser/brave_vpn/android/brave_vpn_native_worker.cc", "//brave/browser/brave_vpn/android/brave_vpn_native_worker.h", + "//brave/browser/brave_vpn/android/brave_vpn_service_factory_android.cc", + ] + brave_browser_brave_vpn_deps += [ + "//brave/build/android:jni_headers", + "//mojo/public/cpp/bindings", ] - brave_browser_brave_vpn_deps += [ "//brave/build/android:jni_headers" ] } } diff --git a/build/android/BUILD.gn b/build/android/BUILD.gn index 72e94a3e742..82eb2b796df 100644 --- a/build/android/BUILD.gn +++ b/build/android/BUILD.gn @@ -241,6 +241,7 @@ generate_jni("jni_headers") { "//brave/android/java/org/chromium/chrome/browser/speedreader/BraveSpeedReaderUtils.java", "//brave/android/java/org/chromium/chrome/browser/sync/BraveSyncDevices.java", "//brave/android/java/org/chromium/chrome/browser/vpn/BraveVpnNativeWorker.java", + "//brave/android/java/org/chromium/chrome/browser/vpn/BraveVpnServiceFactoryAndroid.java", ] public_deps = [ "//brave/android/java/org/chromium/chrome/browser/search_engines:jni_headers" ] diff --git a/build/android/config.gni b/build/android/config.gni index 367020ac117..a9a35060f16 100644 --- a/build/android/config.gni +++ b/build/android/config.gni @@ -130,6 +130,7 @@ brave_jni_headers_sources = [ "//brave/android/java/org/chromium/chrome/browser/sync/BraveSyncDevices.java", "//brave/android/java/org/chromium/chrome/browser/util/BraveReferrer.java", "//brave/android/java/org/chromium/chrome/browser/vpn/BraveVpnNativeWorker.java", + "//brave/android/java/org/chromium/chrome/browser/vpn/BraveVpnServiceFactoryAndroid.java", "//brave/browser/brave_ads/android/java/org/chromium/chrome/browser/BraveAdsNativeHelper.java", "//brave/components/safetynet/java/org/chromium/chrome/browser/util/SafetyNetCheck.java", ] diff --git a/components/brave_vpn/browser/brave_vpn_service.cc b/components/brave_vpn/browser/brave_vpn_service.cc index d513e96143d..65cefc9ce9b 100644 --- a/components/brave_vpn/browser/brave_vpn_service.cc +++ b/components/brave_vpn/browser/brave_vpn_service.cc @@ -112,6 +112,15 @@ void BraveVpnService::CheckInitialState() { } } +#if BUILDFLAG(IS_ANDROID) +mojo::PendingRemote +BraveVpnService::MakeRemote() { + mojo::PendingRemote remote; + receivers_.Add(this, remote.InitWithNewPipeAndPassReceiver()); + return remote; +} +#endif // BUILDFLAG(IS_ANDROID) + std::string BraveVpnService::GetCurrentEnvironment() const { return local_prefs_->GetString(prefs::kBraveVPNEnvironment); } @@ -354,13 +363,36 @@ void BraveVpnService::UpdatePurchasedStateForSessionExpired( #endif // !BUILDFLAG(IS_ANDROID) void BraveVpnService::GetAllRegions(GetAllRegionsCallback callback) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + // DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + LOG(ERROR) << "brave_vpn : " << "GetAllRegions"; +#if BUILDFLAG(IS_ANDROID) + api_request_->GetServerRegionsWithCities( + base::BindOnce(&BraveVpnService::OnFetchRegionList, + base::Unretained(this), std::move(callback))); +#else std::vector regions; for (const auto& region : connection_manager_->GetRegionDataManager().GetRegions()) { regions.push_back(region.Clone()); } std::move(callback).Run(std::move(regions)); +#endif +} + +void BraveVpnService::OnFetchRegionList(GetAllRegionsCallback callback, + const std::string& region_list, + bool success) { + std::optional value = base::JSONReader::Read(region_list); + LOG(ERROR) << "brave_vpn : " << "OnFetchRegionList 1"; + if (value && value->is_list()) { + auto new_regions = ParseRegionList(value->GetList()); + LOG(ERROR) << "brave_vpn : " << "OnFetchRegionList 2"; + std::vector regions; + for (const auto& region : new_regions) { + regions.push_back(region.Clone()); + } + std::move(callback).Run(std::move(regions)); + } } void BraveVpnService::GetSelectedRegion(GetSelectedRegionCallback callback) { @@ -382,6 +414,7 @@ void BraveVpnService::SetSelectedRegion(mojom::RegionPtr region_ptr) { #if BUILDFLAG(IS_ANDROID) void BraveVpnService::GetPurchaseToken(GetPurchaseTokenCallback callback) { + LOG(ERROR) << "brave_vpn : " << "GetPurchaseToken"; std::string purchase_token_string = ""; std::string package_string = "com.brave.browser"; std::string product_id_string = "brave-firewall-vpn-premium"; @@ -435,6 +468,7 @@ mojom::PurchasedInfo BraveVpnService::GetPurchasedInfoSync() const { void BraveVpnService::GetPurchasedState(GetPurchasedStateCallback callback) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + LOG(ERROR) << "brave_vpn : " << "GetPurchasedState"; std::move(callback).Run(GetPurchasedInfoSync().Clone()); } diff --git a/components/brave_vpn/browser/brave_vpn_service.h b/components/brave_vpn/browser/brave_vpn_service.h index e64bf65a538..5d3cbe8f955 100644 --- a/components/brave_vpn/browser/brave_vpn_service.h +++ b/components/brave_vpn/browser/brave_vpn_service.h @@ -22,6 +22,7 @@ #include "brave/components/brave_vpn/browser/api/brave_vpn_api_request.h" #include "brave/components/brave_vpn/browser/brave_vpn_service_delegate.h" #include "brave/components/brave_vpn/browser/connection/brave_vpn_connection_manager.h" +#include "brave/components/brave_vpn/browser/connection/brave_vpn_region_data_manager.h" #include "brave/components/brave_vpn/common/brave_vpn_data_types.h" #include "brave/components/brave_vpn/common/mojom/brave_vpn.mojom.h" #include "brave/components/skus/browser/skus_utils.h" @@ -50,6 +51,7 @@ class BraveBrowserCommandControllerTest; namespace brave_vpn { class BraveVPNServiceDelegate; +class BraveVPNRegionDataManager; inline constexpr char kNewUserReturningHistogramName[] = "Brave.VPN.NewUserReturning"; @@ -79,6 +81,10 @@ class BraveVpnService : BraveVpnService(const BraveVpnService&) = delete; BraveVpnService& operator=(const BraveVpnService&) = delete; +#if BUILDFLAG(IS_ANDROID) + mojo::PendingRemote MakeRemote(); +#endif // BUILDFLAG(IS_ANDROID) + std::string GetCurrentEnvironment() const; bool is_purchased_user() const { return GetPurchasedInfoSync().state == mojom::PurchasedState::PURCHASED; @@ -119,6 +125,9 @@ class BraveVpnService : void LoadPurchasedState(const std::string& domain) override; void GetAllRegions(GetAllRegionsCallback callback) override; + void OnFetchRegionList(GetAllRegionsCallback callback, + const std::string& region_list, + bool success); void GetSelectedRegion(GetSelectedRegionCallback callback) override; void SetSelectedRegion(mojom::RegionPtr region) override; diff --git a/components/brave_vpn/browser/brave_vpn_service_helper.cc b/components/brave_vpn/browser/brave_vpn_service_helper.cc index d44e2cb4a1e..451c71cace8 100644 --- a/components/brave_vpn/browser/brave_vpn_service_helper.cc +++ b/components/brave_vpn/browser/brave_vpn_service_helper.cc @@ -34,6 +34,119 @@ mojom::RegionPtr GetRegionPtrWithNameFromRegionList( return mojom::RegionPtr(); } +base::Value::Dict GetValueFromRegionWithoutCity( + const mojom::RegionPtr& region) { + base::Value::Dict region_dict; + region_dict.Set(kRegionNameKey, region->name); + region_dict.Set(kRegionNamePrettyKey, region->name_pretty); + region_dict.Set(kRegionContinentKey, region->continent); + region_dict.Set(kRegionCountryIsoCodeKey, region->country_iso_code); + region_dict.Set(kRegionPrecisionKey, region->region_precision); + region_dict.Set(kRegionLatitudeKey, region->latitude); + region_dict.Set(kRegionLongitudeKey, region->longitude); + region_dict.Set(kRegionServerCountKey, region->server_count); + return region_dict; +} + +base::Value::Dict GetValueFromRegion(const mojom::RegionPtr& region) { + base::Value::Dict region_dict = GetValueFromRegionWithoutCity(region); + base::Value::List cities; + for (const auto& city : region->cities) { + cities.Append(GetValueFromRegionWithoutCity(city)); + } + region_dict.Set(kRegionCitiesKey, std::move(cities)); + return region_dict; +} + +bool IsValidRegionValue(const base::Value::Dict& value) { + if (!value.FindString(kRegionNameKey) || + !value.FindString(kRegionNamePrettyKey) || + !value.FindString(kRegionContinentKey) || + !value.FindString(kRegionCountryIsoCodeKey) || + !value.FindString(kRegionPrecisionKey) || + !value.FindList(kRegionCitiesKey) || + !value.FindString(kRegionLatitudeKey) || + !value.FindString(kRegionLongitudeKey) || + !value.FindString(kRegionServerCountKey)) { + return false; + } + + return true; +} + +mojom::RegionPtr GetRegionFromValueWithoutCity(const base::Value::Dict& value) { + mojom::RegionPtr region = mojom::Region::New(); + if (auto* name = value.FindString(brave_vpn::kRegionNameKey)) { + region->name = *name; + } + if (auto* name_pretty = value.FindString(brave_vpn::kRegionNamePrettyKey)) { + region->name_pretty = *name_pretty; + } + if (auto* continent = value.FindString(brave_vpn::kRegionContinentKey)) { + region->continent = *continent; + } + if (auto* country_iso_code = + value.FindString(brave_vpn::kRegionCountryIsoCodeKey)) { + region->country_iso_code = *country_iso_code; + } + if (auto* region_precision = + value.FindString(brave_vpn::kRegionPrecisionKey)) { + region->region_precision = *region_precision; + } + if (auto latitude = value.FindDouble(brave_vpn::kRegionLatitudeKey)) { + region->latitude = *latitude; + } + if (auto longitude = value.FindDouble(brave_vpn::kRegionLongitudeKey)) { + region->longitude = *longitude; + } + if (auto server_count = value.FindInt(brave_vpn::kRegionServerCountKey)) { + region->server_count = *server_count; + } + + return region; +} + +mojom::RegionPtr GetRegionFromValue(const base::Value::Dict& value) { + mojom::RegionPtr region = GetRegionFromValueWithoutCity(value); + const auto* cities = value.FindList(kRegionCitiesKey); + for (const auto& city : *cities) { + region->cities.push_back(GetRegionFromValueWithoutCity(city.GetDict())); + } + + return region; +} + +bool ValidateCachedRegionData(const base::Value::List& region_value) { + for (const auto& value : region_value) { + // Make sure cached one has all latest properties. + if (!value.is_dict() || !IsValidRegionValue(value.GetDict())) { + return false; + } + } + + return true; +} + +std::vector ParseRegionList( + const base::Value::List& region_list) { + std::vector regions; + for (const auto& value : region_list) { + DCHECK(value.is_dict()); + if (!value.is_dict()) { + continue; + } + + regions.push_back(GetRegionFromValue(value.GetDict()).Clone()); + } + + // Sort region list alphabetically + std::sort(regions.begin(), regions.end(), + [](mojom::RegionPtr& a, mojom::RegionPtr& b) { + return (a->name_pretty < b->name_pretty); + }); + return regions; +} + bool IsValidCredentialSummary(const base::Value& summary) { DCHECK(summary.is_dict()); const bool active = summary.GetDict().FindBool("active").value_or(false); diff --git a/components/brave_vpn/browser/brave_vpn_service_helper.h b/components/brave_vpn/browser/brave_vpn_service_helper.h index 6017cd555ec..b2caea556b9 100644 --- a/components/brave_vpn/browser/brave_vpn_service_helper.h +++ b/components/brave_vpn/browser/brave_vpn_service_helper.h @@ -25,6 +25,14 @@ namespace brave_vpn { mojom::RegionPtr GetRegionPtrWithNameFromRegionList( const std::string& name, const std::vector& region_list); +base::Value::Dict GetValueFromRegionWithoutCity(const mojom::RegionPtr& region); +base::Value::Dict GetValueFromRegion(const mojom::RegionPtr& region); +bool IsValidRegionValue(const base::Value::Dict& value); +mojom::RegionPtr GetRegionFromValueWithoutCity(const base::Value::Dict& value); +mojom::RegionPtr GetRegionFromValue(const base::Value::Dict& value); +bool ValidateCachedRegionData(const base::Value::List& region_value); +std::vector ParseRegionList( + const base::Value::List& region_list); // False if subscription is expired. bool IsValidCredentialSummary(const base::Value& summary); diff --git a/components/brave_vpn/browser/connection/brave_vpn_region_data_manager.cc b/components/brave_vpn/browser/connection/brave_vpn_region_data_manager.cc index 3c4469b046c..5c2d10ab82d 100644 --- a/components/brave_vpn/browser/connection/brave_vpn_region_data_manager.cc +++ b/components/brave_vpn/browser/connection/brave_vpn_region_data_manager.cc @@ -14,132 +14,12 @@ #include "base/functional/callback_forward.h" #include "base/json/json_reader.h" #include "brave/components/brave_vpn/browser/api/brave_vpn_api_helper.h" +#include "brave/components/brave_vpn/browser/brave_vpn_service_helper.h" #include "brave/components/brave_vpn/common/brave_vpn_constants.h" #include "brave/components/brave_vpn/common/pref_names.h" #include "components/prefs/pref_service.h" namespace brave_vpn { - -namespace { - -base::Value::Dict GetValueFromRegionWithoutCity( - const mojom::RegionPtr& region) { - base::Value::Dict region_dict; - region_dict.Set(kRegionNameKey, region->name); - region_dict.Set(kRegionNamePrettyKey, region->name_pretty); - region_dict.Set(kRegionContinentKey, region->continent); - region_dict.Set(kRegionCountryIsoCodeKey, region->country_iso_code); - region_dict.Set(kRegionPrecisionKey, region->region_precision); - region_dict.Set(kRegionLatitudeKey, region->latitude); - region_dict.Set(kRegionLongitudeKey, region->longitude); - region_dict.Set(kRegionServerCountKey, region->server_count); - return region_dict; -} - -base::Value::Dict GetValueFromRegion(const mojom::RegionPtr& region) { - base::Value::Dict region_dict = GetValueFromRegionWithoutCity(region); - base::Value::List cities; - for (const auto& city : region->cities) { - cities.Append(GetValueFromRegionWithoutCity(city)); - } - region_dict.Set(kRegionCitiesKey, std::move(cities)); - return region_dict; -} - -bool IsValidRegionValue(const base::Value::Dict& value) { - if (!value.FindString(kRegionNameKey) || - !value.FindString(kRegionNamePrettyKey) || - !value.FindString(kRegionContinentKey) || - !value.FindString(kRegionCountryIsoCodeKey) || - !value.FindString(kRegionPrecisionKey) || - !value.FindList(kRegionCitiesKey) || - !value.FindString(kRegionLatitudeKey) || - !value.FindString(kRegionLongitudeKey) || - !value.FindString(kRegionServerCountKey)) { - return false; - } - - return true; -} - -mojom::RegionPtr GetRegionFromValueWithoutCity(const base::Value::Dict& value) { - mojom::RegionPtr region = mojom::Region::New(); - if (auto* name = value.FindString(brave_vpn::kRegionNameKey)) { - region->name = *name; - } - if (auto* name_pretty = value.FindString(brave_vpn::kRegionNamePrettyKey)) { - region->name_pretty = *name_pretty; - } - if (auto* continent = value.FindString(brave_vpn::kRegionContinentKey)) { - region->continent = *continent; - } - if (auto* country_iso_code = - value.FindString(brave_vpn::kRegionCountryIsoCodeKey)) { - region->country_iso_code = *country_iso_code; - } - if (auto* region_precision = - value.FindString(brave_vpn::kRegionPrecisionKey)) { - region->region_precision = *region_precision; - } - if (auto latitude = value.FindDouble(brave_vpn::kRegionLatitudeKey)) { - region->latitude = *latitude; - } - if (auto longitude = value.FindDouble(brave_vpn::kRegionLongitudeKey)) { - region->longitude = *longitude; - } - if (auto server_count = value.FindInt(brave_vpn::kRegionServerCountKey)) { - region->server_count = *server_count; - } - - return region; -} - -mojom::RegionPtr GetRegionFromValue(const base::Value::Dict& value) { - mojom::RegionPtr region = GetRegionFromValueWithoutCity(value); - // for (const auto& city : *value.FindList(kRegionCitiesKey)) { - // region.cities.push_back(GetRegionFromValueWithoutCity(city.GetDict()).Clone()); - // } - - const auto* cities = value.FindList(kRegionCitiesKey); - for (const auto& city : *cities) { - region->cities.push_back(GetRegionFromValueWithoutCity(city.GetDict())); - } - - return region; -} - -bool ValidateCachedRegionData(const base::Value::List& region_value) { - for (const auto& value : region_value) { - // Make sure cached one has all latest properties. - if (!value.is_dict() || !IsValidRegionValue(value.GetDict())) { - return false; - } - } - - return true; -} - -std::vector ParseRegionList( - const base::Value::List& region_list) { - std::vector regions; - for (const auto& value : region_list) { - DCHECK(value.is_dict()); - if (!value.is_dict()) { - continue; - } - regions.push_back(GetRegionFromValue(value.GetDict()).Clone()); - } - - // Sort region list alphabetically - std::sort(regions.begin(), regions.end(), - [](mojom::RegionPtr& a, mojom::RegionPtr& b) { - return (a->name_pretty < b->name_pretty); - }); - return regions; -} - -} // namespace - BraveVPNRegionDataManager::BraveVPNRegionDataManager( scoped_refptr url_loader_factory, PrefService* local_prefs) @@ -306,10 +186,17 @@ void BraveVPNRegionDataManager::FetchRegionDataIfNeeded() { NotifyRegionDataReady(); return; } + FetchRegions(); +} +void BraveVPNRegionDataManager::FetchRegions() { + LOG(ERROR) << "brave_vpn : " << "FetchRegions 1"; + if (!url_loader_factory_) { + LOG(ERROR) << "brave_vpn : " << "FetchRegions 1.5"; + } api_request_ = std::make_unique(url_loader_factory_); VLOG(2) << __func__ << " : Start fetching region data"; - + LOG(ERROR) << "brave_vpn : " << "FetchRegions 2"; // Unretained is safe here becasue this class owns |api_request_|. api_request_->GetServerRegionsWithCities(base::BindOnce( &BraveVPNRegionDataManager::OnFetchRegionList, base::Unretained(this))); @@ -322,8 +209,18 @@ void BraveVPNRegionDataManager::OnFetchRegionList( CHECK_IS_TEST(); } api_request_.reset(); - std::optional value = base::JSONReader::Read(region_list); + + LOG(ERROR) << "brave_vpn : " << "OnFetchRegionList 1"; +#if BUILDFLAG(IS_ANDROID) + if (value && value->is_list()) { + auto new_regions = ParseRegionList(value->GetList()); + LOG(ERROR) << "brave_vpn : " << "OnFetchRegionList 2"; + for (const auto& region : new_regions) { + LOG(ERROR) << "brave_vpn : " << region->name; + } + } +#else if (value && value->is_list() && ParseAndCacheRegionList(value->GetList(), true)) { VLOG(2) << "Got valid region list"; @@ -339,6 +236,7 @@ void BraveVPNRegionDataManager::OnFetchRegionList( VLOG(2) << "Got invalid region list"; NotifyRegionDataReady(); +#endif } bool BraveVPNRegionDataManager::ParseAndCacheRegionList( diff --git a/components/brave_vpn/browser/connection/brave_vpn_region_data_manager.h b/components/brave_vpn/browser/connection/brave_vpn_region_data_manager.h index d26586e8889..7e6cb01358e 100644 --- a/components/brave_vpn/browser/connection/brave_vpn_region_data_manager.h +++ b/components/brave_vpn/browser/connection/brave_vpn_region_data_manager.h @@ -35,6 +35,7 @@ class BraveVPNRegionDataManager { bool IsRegionDataReady() const; std::string GetSelectedRegion() const; void FetchRegionDataIfNeeded(); + void FetchRegions(); void set_selected_region_changed_callback( base::RepeatingCallback callback) { diff --git a/components/brave_vpn/common/mojom/brave_vpn.mojom b/components/brave_vpn/common/mojom/brave_vpn.mojom index 66f680c72f4..b1cb5ecd628 100644 --- a/components/brave_vpn/common/mojom/brave_vpn.mojom +++ b/components/brave_vpn/common/mojom/brave_vpn.mojom @@ -130,5 +130,3 @@ struct Region { double longitude; int32 server_count; }; - - From 2dea9c5fb06eaf81bd20a8312526865ef98f5b0a Mon Sep 17 00:00:00 2001 From: deeppandya Date: Thu, 8 Aug 2024 04:09:34 +0530 Subject: [PATCH 09/31] Update server selection activity with Region struct --- .../VpnServerSelectionActivity.java | 135 ++++++------------ .../BraveVpnServerSelectionAdapter.java | 23 ++- 2 files changed, 53 insertions(+), 105 deletions(-) diff --git a/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerSelectionActivity.java b/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerSelectionActivity.java index a2a94f8b44b..80f7e745b0f 100644 --- a/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerSelectionActivity.java +++ b/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerSelectionActivity.java @@ -19,7 +19,6 @@ import androidx.recyclerview.widget.RecyclerView; import com.google.android.material.materialswitch.MaterialSwitch; -import org.chromium.base.Log; import org.chromium.brave_vpn.mojom.Region; import org.chromium.brave_vpn.mojom.ServiceHandler; import org.chromium.chrome.R; @@ -27,16 +26,13 @@ import org.chromium.chrome.browser.vpn.BraveVpnNativeWorker; import org.chromium.chrome.browser.vpn.BraveVpnServiceFactoryAndroid; import org.chromium.chrome.browser.vpn.adapters.BraveVpnServerSelectionAdapter; import org.chromium.chrome.browser.vpn.models.BraveVpnPrefModel; -import org.chromium.chrome.browser.vpn.models.BraveVpnServerRegion; import org.chromium.chrome.browser.vpn.utils.BraveVpnPrefUtils; import org.chromium.chrome.browser.vpn.utils.BraveVpnUtils; import org.chromium.mojo.bindings.ConnectionErrorHandler; import org.chromium.mojo.system.MojoException; import org.chromium.ui.widget.Toast; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; +import java.util.Arrays; public class VpnServerSelectionActivity extends BraveVpnParentActivity implements ConnectionErrorHandler { @@ -67,19 +63,15 @@ public class VpnServerSelectionActivity extends BraveVpnParentActivity } public interface OnServerRegionSelection { - void onServerRegionClick(BraveVpnServerRegion vpnServerRegion); + void onServerRegionClick(Region region); } @Override - public void onResumeWithNative() { - super.onResumeWithNative(); - BraveVpnNativeWorker.getInstance().addObserver(this); - } - - @Override - public void onPauseWithNative() { - BraveVpnNativeWorker.getInstance().removeObserver(this); - super.onPauseWithNative(); + public boolean onOptionsItemSelected(MenuItem item) { + if (item.getItemId() == android.R.id.home) { + finish(); + } + return super.onOptionsItemSelected(item); } private void initializeViews() { @@ -105,9 +97,7 @@ public class VpnServerSelectionActivity extends BraveVpnParentActivity new View.OnClickListener() { @Override public void onClick(View v) { - changeServerRegion( - new BraveVpnServerRegion( - "", "", BraveVpnPrefUtils.PREF_BRAVE_VPN_AUTOMATIC, "")); + changeServerRegion(); } }); @@ -136,78 +126,37 @@ public class VpnServerSelectionActivity extends BraveVpnParentActivity mServerRegionList.setLayoutManager(linearLayoutManager); } - @Override - public boolean onOptionsItemSelected(MenuItem item) { - if (item.getItemId() == android.R.id.home) { - finish(); - } - return super.onOptionsItemSelected(item); - } - @Override public void finishNativeInitialization() { super.finishNativeInitialization(); initVpnService(); - // BraveVpnNativeWorker.getInstance().getServerRegionsWithCities(); showProgress(); - Log.e("brave_vpn", "initVpnService"); mServiceHandler.getAllRegions( regions -> { - for (Region region : regions) { - Log.e("brave_vpn", region.name); + if (regions.length > 0) { + mBraveVpnServerSelectionAdapter = + new BraveVpnServerSelectionAdapter(VpnServerSelectionActivity.this); + mBraveVpnServerSelectionAdapter.setVpnServerRegions(Arrays.asList(regions)); + mBraveVpnServerSelectionAdapter.setOnServerRegionSelection( + new OnServerRegionSelection() { + @Override + public void onServerRegionClick(Region region) { + BraveVpnUtils.openVpnServerActivity( + VpnServerSelectionActivity.this); + } + }); + mServerRegionList.setAdapter(mBraveVpnServerSelectionAdapter); + hideProgress(); + } else { + Toast.makeText( + VpnServerSelectionActivity.this, + R.string.fail_to_get_server_locations, + Toast.LENGTH_LONG) + .show(); } }); } - @Override - public void onGetServerRegionsWithCities(String jsonResponse, boolean isSuccess) { - if (isSuccess) { - Log.e("brave_vpn", jsonResponse); - List braveVpnServerRegions = - BraveVpnUtils.getServerLocations(jsonResponse); - Collections.sort( - braveVpnServerRegions, - new Comparator() { - @Override - public int compare( - BraveVpnServerRegion braveVpnServerRegion1, - BraveVpnServerRegion braveVpnServerRegion2) { - return braveVpnServerRegion1 - .getNamePretty() - .compareToIgnoreCase(braveVpnServerRegion2.getNamePretty()); - } - }); - mBraveVpnServerSelectionAdapter = - new BraveVpnServerSelectionAdapter(VpnServerSelectionActivity.this); - mBraveVpnServerSelectionAdapter.setVpnServerRegions(braveVpnServerRegions); - mBraveVpnServerSelectionAdapter.setOnServerRegionSelection( - new OnServerRegionSelection() { - @Override - public void onServerRegionClick(BraveVpnServerRegion braveVpnServerRegion) { - // if (BraveVpnPrefUtils.getServerRegion() - // .equals(braveVpnServerRegion.getName())) { - // Toast.makeText( - // VpnServerSelectionActivity.this, - // R.string.already_selected_the_server, - // Toast.LENGTH_SHORT) - // .show(); - // } else { - // changeServerRegion(braveVpnServerRegion); - // } - BraveVpnUtils.openVpnServerActivity(VpnServerSelectionActivity.this); - } - }); - mServerRegionList.setAdapter(mBraveVpnServerSelectionAdapter); - hideProgress(); - } else { - Toast.makeText( - VpnServerSelectionActivity.this, - R.string.fail_to_get_server_locations, - Toast.LENGTH_LONG) - .show(); - } - } - @Override protected void triggerLayoutInflation() { initializeViews(); @@ -219,20 +168,6 @@ public class VpnServerSelectionActivity extends BraveVpnParentActivity return true; } - private void changeServerRegion(BraveVpnServerRegion braveVpnServerRegion) { - mIsServerLocationChanged = true; - BraveVpnUtils.selectedServerRegion = braveVpnServerRegion; - BraveVpnUtils.showProgressDialog( - VpnServerSelectionActivity.this, - getResources().getString(R.string.vpn_connect_text)); - if (BraveVpnNativeWorker.getInstance().isPurchasedUser()) { - mBraveVpnPrefModel = new BraveVpnPrefModel(); - BraveVpnNativeWorker.getInstance().getSubscriberCredentialV12(); - } else { - verifySubscription(); - } - } - public void showProgress() { if (mServerSelectionProgress != null) { mServerSelectionProgress.setVisibility(View.VISIBLE); @@ -256,4 +191,18 @@ public class VpnServerSelectionActivity extends BraveVpnParentActivity @Override public void updateProfileView() {} + + private void changeServerRegion() { + mIsServerLocationChanged = true; + // BraveVpnUtils.selectedServerRegion = braveVpnServerRegion; + BraveVpnUtils.showProgressDialog( + VpnServerSelectionActivity.this, + getResources().getString(R.string.vpn_connect_text)); + if (BraveVpnNativeWorker.getInstance().isPurchasedUser()) { + mBraveVpnPrefModel = new BraveVpnPrefModel(); + BraveVpnNativeWorker.getInstance().getSubscriberCredentialV12(); + } else { + verifySubscription(); + } + } } diff --git a/android/java/org/chromium/chrome/browser/vpn/adapters/BraveVpnServerSelectionAdapter.java b/android/java/org/chromium/chrome/browser/vpn/adapters/BraveVpnServerSelectionAdapter.java index d8d4ed1c340..e1d7a54eddd 100644 --- a/android/java/org/chromium/chrome/browser/vpn/adapters/BraveVpnServerSelectionAdapter.java +++ b/android/java/org/chromium/chrome/browser/vpn/adapters/BraveVpnServerSelectionAdapter.java @@ -17,9 +17,9 @@ import androidx.recyclerview.widget.RecyclerView; import com.google.android.material.radiobutton.MaterialRadioButton; +import org.chromium.brave_vpn.mojom.Region; import org.chromium.chrome.R; import org.chromium.chrome.browser.vpn.activities.VpnServerSelectionActivity.OnServerRegionSelection; -import org.chromium.chrome.browser.vpn.models.BraveVpnServerRegion; import org.chromium.chrome.browser.vpn.utils.BraveVpnPrefUtils; import org.chromium.chrome.browser.vpn.utils.BraveVpnUtils; @@ -29,7 +29,7 @@ import java.util.List; public class BraveVpnServerSelectionAdapter extends RecyclerView.Adapter { private final Context mContext; - private List mBraveVpnServerRegions = new ArrayList<>(); + private List mRegions = new ArrayList<>(); private OnServerRegionSelection mOnServerRegionSelection; public BraveVpnServerSelectionAdapter(Context context) { @@ -47,15 +47,14 @@ public class BraveVpnServerSelectionAdapter @Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) { - final BraveVpnServerRegion vpnServerRegion = mBraveVpnServerRegions.get(position); - if (vpnServerRegion != null) { - holder.serverIconText.setText( - BraveVpnUtils.countryCodeToEmoji(vpnServerRegion.getCountryIsoCode())); - holder.serverText.setText(vpnServerRegion.getNamePretty()); + final Region region = mRegions.get(position); + if (region != null) { + holder.serverIconText.setText(BraveVpnUtils.countryCodeToEmoji(region.countryIsoCode)); + holder.serverText.setText(region.namePretty); holder.cityServerText.setText( mContext.getResources().getString(R.string.city_server_text)); holder.serverRadioButton.setChecked( - BraveVpnPrefUtils.getServerRegion().equals(vpnServerRegion.getName())); + BraveVpnPrefUtils.getServerRegion().equals(region.name)); // if (BraveVpnPrefUtils.getServerRegion().equals(vpnServerRegion.getName())) { // holder.serverText.setCompoundDrawablesWithIntrinsicBounds( // 0, 0, R.drawable.ic_checkbox_checked, 0); @@ -66,7 +65,7 @@ public class BraveVpnServerSelectionAdapter new View.OnClickListener() { @Override public void onClick(View v) { - mOnServerRegionSelection.onServerRegionClick(vpnServerRegion); + mOnServerRegionSelection.onServerRegionClick(region); } }); } @@ -74,11 +73,11 @@ public class BraveVpnServerSelectionAdapter @Override public int getItemCount() { - return mBraveVpnServerRegions.size(); + return mRegions.size(); } - public void setVpnServerRegions(List vpnServerRegions) { - this.mBraveVpnServerRegions = vpnServerRegions; + public void setVpnServerRegions(List vpnServerRegions) { + this.mRegions = vpnServerRegions; } public void setOnServerRegionSelection(OnServerRegionSelection onServerRegionSelection) { From 004f34f5c79db1b07086065c0e6fa03256cddeb7 Mon Sep 17 00:00:00 2001 From: deeppandya Date: Fri, 9 Aug 2024 00:40:43 +0530 Subject: [PATCH 10/31] Add plurals for cities and servers --- .../adapters/BraveVpnServerSelectionAdapter.java | 13 +++++++++++-- .../browser/vpn/adapters/VpnServerAdapter.java | 4 ++-- android/java/res/layout/vpn_server_item_layout.xml | 3 ++- .../ui/android/strings/android_brave_strings.grd | 13 +++++++++++-- 4 files changed, 26 insertions(+), 7 deletions(-) diff --git a/android/java/org/chromium/chrome/browser/vpn/adapters/BraveVpnServerSelectionAdapter.java b/android/java/org/chromium/chrome/browser/vpn/adapters/BraveVpnServerSelectionAdapter.java index e1d7a54eddd..8811aa3765c 100644 --- a/android/java/org/chromium/chrome/browser/vpn/adapters/BraveVpnServerSelectionAdapter.java +++ b/android/java/org/chromium/chrome/browser/vpn/adapters/BraveVpnServerSelectionAdapter.java @@ -51,8 +51,17 @@ public class BraveVpnServerSelectionAdapter if (region != null) { holder.serverIconText.setText(BraveVpnUtils.countryCodeToEmoji(region.countryIsoCode)); holder.serverText.setText(region.namePretty); - holder.cityServerText.setText( - mContext.getResources().getString(R.string.city_server_text)); + String cityText = + mContext.getResources() + .getQuantityString( + R.plurals.city_text, + region.cities.length, + region.cities.length); + String serverText = + mContext.getResources() + .getQuantityString( + R.plurals.server_text, region.serverCount, region.serverCount); + holder.cityServerText.setText(cityText.concat(serverText)); holder.serverRadioButton.setChecked( BraveVpnPrefUtils.getServerRegion().equals(region.name)); // if (BraveVpnPrefUtils.getServerRegion().equals(vpnServerRegion.getName())) { diff --git a/android/java/org/chromium/chrome/browser/vpn/adapters/VpnServerAdapter.java b/android/java/org/chromium/chrome/browser/vpn/adapters/VpnServerAdapter.java index 61e7d1afc6f..8f1bfe81831 100644 --- a/android/java/org/chromium/chrome/browser/vpn/adapters/VpnServerAdapter.java +++ b/android/java/org/chromium/chrome/browser/vpn/adapters/VpnServerAdapter.java @@ -47,8 +47,8 @@ public class VpnServerAdapter extends RecyclerView.Adapter + android:layout_marginEnd="16dp" + android:clickable="false" /> diff --git a/browser/ui/android/strings/android_brave_strings.grd b/browser/ui/android/strings/android_brave_strings.grd index 1e049681b76..f8a2150866b 100644 --- a/browser/ui/android/strings/android_brave_strings.grd +++ b/browser/ui/android/strings/android_brave_strings.grd @@ -2425,8 +2425,17 @@ If you don't accept this request, VPN will not reconnect and your internet conne Auto-select the VPN server region closest to you based on your timezone. This option is recommended to maximize Internet speeds. - - 2 cities - 5 servers + + {CITY_COUNT, plural, + =1 {%1$d1 city} + other {%1$d2 cities} + } + + + {SERVER_COUNT, plural, + =1 { - %1$d1 server} + other { - %1$d2 servers} + } Servers From 8615acd9813360a64c25a124662ac91062509aca Mon Sep 17 00:00:00 2001 From: deeppandya Date: Sun, 11 Aug 2024 23:12:41 +0530 Subject: [PATCH 11/31] Update VpnServerActivity with Region mojom object Add chnages for optimal server changes --- .../vpn/activities/VpnServerActivity.java | 167 ++++++++---------- .../VpnServerSelectionActivity.java | 3 +- .../BraveVpnServerSelectionAdapter.java | 6 - .../vpn/adapters/VpnServerAdapter.java | 38 ++-- .../browser/vpn/utils/BraveVpnUtils.java | 8 +- .../java/res/layout/activity_vpn_server.xml | 4 + ...brave_vpn_server_selection_item_layout.xml | 2 + .../android/strings/android_brave_strings.grd | 14 +- 8 files changed, 122 insertions(+), 120 deletions(-) diff --git a/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerActivity.java b/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerActivity.java index d13830a448b..1fe62bc60d5 100644 --- a/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerActivity.java +++ b/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerActivity.java @@ -17,40 +17,31 @@ import androidx.recyclerview.widget.DividerItemDecoration; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; -import org.chromium.base.Log; +import com.google.android.material.radiobutton.MaterialRadioButton; + +import org.chromium.brave_vpn.mojom.Region; import org.chromium.chrome.R; -import org.chromium.chrome.browser.vpn.BraveVpnNativeWorker; import org.chromium.chrome.browser.vpn.adapters.VpnServerAdapter; -import org.chromium.chrome.browser.vpn.models.BraveVpnPrefModel; -import org.chromium.chrome.browser.vpn.models.BraveVpnServerRegion; import org.chromium.chrome.browser.vpn.utils.BraveVpnPrefUtils; import org.chromium.chrome.browser.vpn.utils.BraveVpnUtils; import org.chromium.ui.widget.Toast; -import java.util.Collections; -import java.util.Comparator; +import java.util.ArrayList; +import java.util.Arrays; import java.util.List; public class VpnServerActivity extends BraveVpnParentActivity { - private VpnServerAdapter mBraveVpnServerSelectionAdapter; - private LinearLayout mServerSelectionListLayout; - private ProgressBar mServerSelectionProgress; + private VpnServerAdapter mVpnServerAdapter; + + private LinearLayout mOptimalLayout; + private MaterialRadioButton mOptimalServerRadioButton; + + private LinearLayout mServerListLayout; + private ProgressBar mServerProgress; private RecyclerView mServerRegionList; - public interface OnServerRegionSelection { - void onServerRegionClick(BraveVpnServerRegion vpnServerRegion); - } - - @Override - public void onResumeWithNative() { - super.onResumeWithNative(); - BraveVpnNativeWorker.getInstance().addObserver(this); - } - - @Override - public void onPauseWithNative() { - BraveVpnNativeWorker.getInstance().removeObserver(this); - super.onPauseWithNative(); + public interface OnCitySelection { + void onCityClick(Region city); } private void initializeViews() { @@ -63,10 +54,19 @@ public class VpnServerActivity extends BraveVpnParentActivity { actionBar.setDisplayHomeAsUpEnabled(true); actionBar.setTitle(getResources().getString(R.string.change_location)); + // mOptimalLayout = (LinearLayout) findViewById(R.id.optimal_region_layout); + // TextView optimalServerText = (TextView) mOptimalLayout.findViewById(R.id.server_text); + // optimalServerText.setText(getString(R.string.optimal_text)); + // TextView optimalCityServerText = (TextView) + // mOptimalLayout.findViewById(R.id.city_server_text); + // optimalCityServerText.setText(getString(R.string.optimal_desc)); + // mOptimalServerRadioButton = (MaterialRadioButton) + // mOptimalLayout.findViewById(R.id.server_radio_button); + mServerRegionList = (RecyclerView) findViewById(R.id.server_list); - mServerSelectionListLayout = (LinearLayout) findViewById(R.id.server_layout); - mServerSelectionProgress = (ProgressBar) findViewById(R.id.server_progress); + mServerListLayout = (LinearLayout) findViewById(R.id.server_layout); + mServerProgress = (ProgressBar) findViewById(R.id.server_progress); LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this); mServerRegionList.addItemDecoration( @@ -101,55 +101,40 @@ public class VpnServerActivity extends BraveVpnParentActivity { @Override public void finishNativeInitialization() { super.finishNativeInitialization(); - BraveVpnNativeWorker.getInstance().getServerRegionsWithCities(); + Region region = BraveVpnUtils.selectedRegion; + // if (getIntent() != null && getIntent().getExtras().getSerializable(BraveVpnUtils.REGION) + // != null) { + // region = (Region) getIntent().getExtras().getSerializable(BraveVpnUtils.REGION); + // } + // if (region != null && region.cities.length > 0) { showProgress(); - } + List cities = new ArrayList(Arrays.asList(region.cities)); - @Override - public void onGetServerRegionsWithCities(String jsonResponse, boolean isSuccess) { - if (isSuccess) { - Log.e("brave_vpn", jsonResponse); - List braveVpnServerRegions = - BraveVpnUtils.getServerLocations(jsonResponse); - Collections.sort( - braveVpnServerRegions, - new Comparator() { - @Override - public int compare( - BraveVpnServerRegion braveVpnServerRegion1, - BraveVpnServerRegion braveVpnServerRegion2) { - return braveVpnServerRegion1 - .getNamePretty() - .compareToIgnoreCase(braveVpnServerRegion2.getNamePretty()); + Region optimalRegion = new Region(); + optimalRegion.namePretty = getString(R.string.optimal_text); + optimalRegion.name = getString(R.string.optimal_desc); + cities.add(0, optimalRegion); + + mVpnServerAdapter = new VpnServerAdapter(VpnServerActivity.this); + mVpnServerAdapter.setCities(cities); + mVpnServerAdapter.setOnCitySelection( + new OnCitySelection() { + @Override + public void onCityClick(Region city) { + if (BraveVpnPrefUtils.getServerRegion().equals(city.name)) { + Toast.makeText( + VpnServerActivity.this, + R.string.already_selected_the_server, + Toast.LENGTH_SHORT) + .show(); + } else { + // changeServerRegion(city); } - }); - mBraveVpnServerSelectionAdapter = new VpnServerAdapter(VpnServerActivity.this); - mBraveVpnServerSelectionAdapter.setVpnServerRegions(braveVpnServerRegions); - mBraveVpnServerSelectionAdapter.setOnServerRegionSelection( - new OnServerRegionSelection() { - @Override - public void onServerRegionClick(BraveVpnServerRegion braveVpnServerRegion) { - if (BraveVpnPrefUtils.getServerRegion() - .equals(braveVpnServerRegion.getName())) { - Toast.makeText( - VpnServerActivity.this, - R.string.already_selected_the_server, - Toast.LENGTH_SHORT) - .show(); - } else { - changeServerRegion(braveVpnServerRegion); - } - } - }); - mServerRegionList.setAdapter(mBraveVpnServerSelectionAdapter); - hideProgress(); - } else { - Toast.makeText( - VpnServerActivity.this, - R.string.fail_to_get_server_locations, - Toast.LENGTH_LONG) - .show(); - } + } + }); + mServerRegionList.setAdapter(mVpnServerAdapter); + hideProgress(); + // } } @Override @@ -163,34 +148,34 @@ public class VpnServerActivity extends BraveVpnParentActivity { return true; } - private void changeServerRegion(BraveVpnServerRegion braveVpnServerRegion) { - mIsServerLocationChanged = true; - BraveVpnUtils.selectedServerRegion = braveVpnServerRegion; - BraveVpnUtils.showProgressDialog( - VpnServerActivity.this, getResources().getString(R.string.vpn_connect_text)); - if (BraveVpnNativeWorker.getInstance().isPurchasedUser()) { - mBraveVpnPrefModel = new BraveVpnPrefModel(); - BraveVpnNativeWorker.getInstance().getSubscriberCredentialV12(); - } else { - verifySubscription(); - } - } + // private void changeServerRegion(BraveVpnServerRegion braveVpnServerRegion) { + // mIsServerLocationChanged = true; + // BraveVpnUtils.selectedServerRegion = braveVpnServerRegion; + // BraveVpnUtils.showProgressDialog( + // VpnServerActivity.this, getResources().getString(R.string.vpn_connect_text)); + // if (BraveVpnNativeWorker.getInstance().isPurchasedUser()) { + // mBraveVpnPrefModel = new BraveVpnPrefModel(); + // BraveVpnNativeWorker.getInstance().getSubscriberCredentialV12(); + // } else { + // verifySubscription(); + // } + // } public void showProgress() { - if (mServerSelectionProgress != null) { - mServerSelectionProgress.setVisibility(View.VISIBLE); + if (mServerProgress != null) { + mServerProgress.setVisibility(View.VISIBLE); } - if (mServerSelectionListLayout != null) { - mServerSelectionListLayout.setAlpha(0.4f); + if (mServerListLayout != null) { + mServerListLayout.setAlpha(0.4f); } } public void hideProgress() { - if (mServerSelectionProgress != null) { - mServerSelectionProgress.setVisibility(View.GONE); + if (mServerProgress != null) { + mServerProgress.setVisibility(View.GONE); } - if (mServerSelectionListLayout != null) { - mServerSelectionListLayout.setAlpha(1f); + if (mServerListLayout != null) { + mServerListLayout.setAlpha(1f); } } diff --git a/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerSelectionActivity.java b/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerSelectionActivity.java index 80f7e745b0f..b47df98f7e6 100644 --- a/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerSelectionActivity.java +++ b/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerSelectionActivity.java @@ -141,8 +141,9 @@ public class VpnServerSelectionActivity extends BraveVpnParentActivity new OnServerRegionSelection() { @Override public void onServerRegionClick(Region region) { + BraveVpnUtils.selectedRegion = region; BraveVpnUtils.openVpnServerActivity( - VpnServerSelectionActivity.this); + VpnServerSelectionActivity.this, region); } }); mServerRegionList.setAdapter(mBraveVpnServerSelectionAdapter); diff --git a/android/java/org/chromium/chrome/browser/vpn/adapters/BraveVpnServerSelectionAdapter.java b/android/java/org/chromium/chrome/browser/vpn/adapters/BraveVpnServerSelectionAdapter.java index 8811aa3765c..72b671bbb6b 100644 --- a/android/java/org/chromium/chrome/browser/vpn/adapters/BraveVpnServerSelectionAdapter.java +++ b/android/java/org/chromium/chrome/browser/vpn/adapters/BraveVpnServerSelectionAdapter.java @@ -64,12 +64,6 @@ public class BraveVpnServerSelectionAdapter holder.cityServerText.setText(cityText.concat(serverText)); holder.serverRadioButton.setChecked( BraveVpnPrefUtils.getServerRegion().equals(region.name)); - // if (BraveVpnPrefUtils.getServerRegion().equals(vpnServerRegion.getName())) { - // holder.serverText.setCompoundDrawablesWithIntrinsicBounds( - // 0, 0, R.drawable.ic_checkbox_checked, 0); - // } else { - // holder.serverText.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0); - // } holder.serverSelectionItemLayout.setOnClickListener( new View.OnClickListener() { @Override diff --git a/android/java/org/chromium/chrome/browser/vpn/adapters/VpnServerAdapter.java b/android/java/org/chromium/chrome/browser/vpn/adapters/VpnServerAdapter.java index 8f1bfe81831..e1322a3385f 100644 --- a/android/java/org/chromium/chrome/browser/vpn/adapters/VpnServerAdapter.java +++ b/android/java/org/chromium/chrome/browser/vpn/adapters/VpnServerAdapter.java @@ -17,9 +17,10 @@ import androidx.recyclerview.widget.RecyclerView; import com.google.android.material.radiobutton.MaterialRadioButton; +import org.chromium.base.Log; +import org.chromium.brave_vpn.mojom.Region; import org.chromium.chrome.R; -import org.chromium.chrome.browser.vpn.activities.VpnServerActivity.OnServerRegionSelection; -import org.chromium.chrome.browser.vpn.models.BraveVpnServerRegion; +import org.chromium.chrome.browser.vpn.activities.VpnServerActivity.OnCitySelection; import org.chromium.chrome.browser.vpn.utils.BraveVpnPrefUtils; import java.util.ArrayList; @@ -27,8 +28,8 @@ import java.util.List; public class VpnServerAdapter extends RecyclerView.Adapter { private final Context mContext; - private List mBraveVpnServerRegions = new ArrayList<>(); - private OnServerRegionSelection mOnServerRegionSelection; + private List mCities = new ArrayList<>(); + private OnCitySelection mOnCitySelection; public VpnServerAdapter(Context context) { this.mContext = context; @@ -44,18 +45,21 @@ public class VpnServerAdapter extends RecyclerView.Adapter vpnServerRegions) { - this.mBraveVpnServerRegions = vpnServerRegions; + public void setCities(List cities) { + this.mCities = cities; } - public void setOnServerRegionSelection(OnServerRegionSelection onServerRegionSelection) { - this.mOnServerRegionSelection = onServerRegionSelection; + public void setOnCitySelection(OnCitySelection onCitySelection) { + this.mOnCitySelection = onCitySelection; } public static class ViewHolder extends RecyclerView.ViewHolder { diff --git a/android/java/org/chromium/chrome/browser/vpn/utils/BraveVpnUtils.java b/android/java/org/chromium/chrome/browser/vpn/utils/BraveVpnUtils.java index 7c236ef83f1..69adc115c1f 100644 --- a/android/java/org/chromium/chrome/browser/vpn/utils/BraveVpnUtils.java +++ b/android/java/org/chromium/chrome/browser/vpn/utils/BraveVpnUtils.java @@ -24,6 +24,7 @@ import org.json.JSONObject; import org.chromium.base.ContextUtils; import org.chromium.base.Log; +import org.chromium.brave_vpn.mojom.Region; import org.chromium.chrome.browser.BraveRewardsNativeWorker; import org.chromium.chrome.browser.vpn.BraveVpnNativeWorker; import org.chromium.chrome.browser.vpn.activities.BraveVpnProfileActivity; @@ -54,9 +55,11 @@ public class BraveVpnUtils { public static boolean mUpdateProfileAfterSplitTunnel; public static BraveVpnServerRegion selectedServerRegion; + public static Region selectedRegion; private static ProgressDialog sProgressDialog; public static String IS_KILL_SWITCH = "is_kill_switch"; + public static String REGION = "region"; public static void openBraveVpnPlansActivity(Activity activity) { if (activity == null) { @@ -122,11 +125,14 @@ public class BraveVpnUtils { activity.startActivity(vpnServerSelectionIntent); } - public static void openVpnServerActivity(Activity activity) { + public static void openVpnServerActivity(Activity activity, Region region) { if (activity == null) { return; } Intent vpnServerIntent = new Intent(activity, VpnServerActivity.class); + // Bundle bundle = new Bundle(); + // bundle.putSerializable(REGION, region); + // vpnServerIntent.putExtras(bundle); activity.startActivity(vpnServerIntent); } diff --git a/android/java/res/layout/activity_vpn_server.xml b/android/java/res/layout/activity_vpn_server.xml index 3985aecf7d8..36b57c7a51a 100644 --- a/android/java/res/layout/activity_vpn_server.xml +++ b/android/java/res/layout/activity_vpn_server.xml @@ -31,6 +31,10 @@ android:textColor="@color/schemes_primary" android:text="@string/available_servers"/> + + {CITY_COUNT, plural, - =1 {%1$d1 city} - other {%1$d2 cities} + =1 {%1$d1 city - } + other {%1$d2 cities - } } {SERVER_COUNT, plural, - =1 { - %1$d1 server} - other { - %1$d2 servers} + =1 {%1$d1 server} + other {%1$d2 servers} } Servers + + Optimal + + + Use the best server available + Available Servers From 7eff3936882a18af249182d5350d496d84b2a427 Mon Sep 17 00:00:00 2001 From: deeppandya Date: Mon, 12 Aug 2024 17:54:47 +0530 Subject: [PATCH 12/31] Remove native worker changes Update cpp changes and remove android exceptions --- .../chrome/browser/app/BraveActivity.java | 33 ++++++------ .../browser/vpn/BraveVpnNativeWorker.java | 26 --------- .../chrome/browser/vpn/BraveVpnObserver.java | 6 --- .../vpn/BraveVpnServiceFactoryAndroid.java | 6 --- .../vpn/activities/VpnServerActivity.java | 19 ------- .../browser/vpn/utils/BraveVpnUtils.java | 3 -- android/java/res/drawable/ic_carat_right.xml | 6 +++ .../java/res/layout/activity_vpn_server.xml | 8 +-- .../layout/activity_vpn_server_selection.xml | 8 +-- .../res/layout/vpn_server_item_layout.xml | 4 ++ .../android/brave_vpn_native_worker.cc | 38 ------------- .../android/brave_vpn_native_worker.h | 10 ---- .../brave_vpn_service_factory_android.cc | 2 - .../browser/api/brave_vpn_api_request.cc | 8 --- .../browser/api/brave_vpn_api_request.h | 1 - .../brave_vpn/browser/brave_vpn_service.cc | 54 +++++++------------ .../brave_vpn/browser/brave_vpn_service.h | 16 +++--- .../brave_vpn/common/mojom/brave_vpn.mojom | 2 + 18 files changed, 62 insertions(+), 188 deletions(-) diff --git a/android/java/org/chromium/chrome/browser/app/BraveActivity.java b/android/java/org/chromium/chrome/browser/app/BraveActivity.java index 1fabf1a68e9..c107626ae9c 100644 --- a/android/java/org/chromium/chrome/browser/app/BraveActivity.java +++ b/android/java/org/chromium/chrome/browser/app/BraveActivity.java @@ -195,7 +195,6 @@ import org.chromium.chrome.browser.vpn.BraveVpnNativeWorker; import org.chromium.chrome.browser.vpn.BraveVpnObserver; import org.chromium.chrome.browser.vpn.activities.BraveVpnProfileActivity; import org.chromium.chrome.browser.vpn.fragments.LinkVpnSubscriptionDialogFragment; -import org.chromium.chrome.browser.vpn.models.BraveVpnServerRegion; import org.chromium.chrome.browser.vpn.timer.TimerDialogFragment; import org.chromium.chrome.browser.vpn.utils.BraveVpnApiResponseUtils; import org.chromium.chrome.browser.vpn.utils.BraveVpnPrefUtils; @@ -1163,7 +1162,7 @@ public abstract class BraveActivity extends ChromeActivity if (!isFirstInstall && !BraveVpnPrefUtils.isIsoCodeUpgradeDone() && BraveVpnPrefUtils.isSubscriptionPurchase()) { - BraveVpnNativeWorker.getInstance().getAllServerRegions(); + // BraveVpnNativeWorker.getInstance().getAllServerRegions(); } if (ChromeFeatureList.isEnabled(BraveFeatureList.BRAVE_VPN_LINK_SUBSCRIPTION_ANDROID_UI) @@ -1345,21 +1344,21 @@ public abstract class BraveActivity extends ChromeActivity } } - @Override - public void onGetAllServerRegions(String jsonResponse, boolean isSuccess) { - if (isSuccess) { - List braveVpnServerRegions = - BraveVpnUtils.getServerLocations(jsonResponse); - for (BraveVpnServerRegion braveVpnServerRegion : braveVpnServerRegions) { - if (braveVpnServerRegion.getName().equals(BraveVpnPrefUtils.getServerRegion())) { - BraveVpnPrefUtils.setServerIsoCode(braveVpnServerRegion.getCountryIsoCode()); - BraveVpnPrefUtils.setServerNamePretty(braveVpnServerRegion.getNamePretty()); - BraveVpnPrefUtils.setIsoCodeUpgrade(true); - break; - } - } - } - } + // @Override + // public void onGetAllServerRegions(String jsonResponse, boolean isSuccess) { + // if (isSuccess) { + // List braveVpnServerRegions = + // BraveVpnUtils.getServerLocations(jsonResponse); + // for (BraveVpnServerRegion braveVpnServerRegion : braveVpnServerRegions) { + // if (braveVpnServerRegion.getName().equals(BraveVpnPrefUtils.getServerRegion())) { + // BraveVpnPrefUtils.setServerIsoCode(braveVpnServerRegion.getCountryIsoCode()); + // BraveVpnPrefUtils.setServerNamePretty(braveVpnServerRegion.getNamePretty()); + // BraveVpnPrefUtils.setIsoCodeUpgrade(true); + // break; + // } + // } + // } + // } private void handleDeepLinkVpn() { mIsDeepLink = true; diff --git a/android/java/org/chromium/chrome/browser/vpn/BraveVpnNativeWorker.java b/android/java/org/chromium/chrome/browser/vpn/BraveVpnNativeWorker.java index 0de70b392ff..5452b518d90 100644 --- a/android/java/org/chromium/chrome/browser/vpn/BraveVpnNativeWorker.java +++ b/android/java/org/chromium/chrome/browser/vpn/BraveVpnNativeWorker.java @@ -72,20 +72,6 @@ public class BraveVpnNativeWorker { mNativeBraveVpnNativeWorker = nativePtr; } - @CalledByNative - public void onGetAllServerRegions(String jsonServerRegions, boolean isSuccess) { - for (BraveVpnObserver observer : mObservers) { - observer.onGetAllServerRegions(jsonServerRegions, isSuccess); - } - } - - @CalledByNative - public void onGetServerRegionsWithCities(String jsonServerRegions, boolean isSuccess) { - for (BraveVpnObserver observer : mObservers) { - observer.onGetServerRegionsWithCities(jsonServerRegions, isSuccess); - } - } - @CalledByNative public void onGetTimezonesForRegions(String jsonTimezones, boolean isSuccess) { for (BraveVpnObserver observer : mObservers) { @@ -137,14 +123,6 @@ public class BraveVpnNativeWorker { } } - public void getAllServerRegions() { - BraveVpnNativeWorkerJni.get().getAllServerRegions(mNativeBraveVpnNativeWorker); - } - - public void getServerRegionsWithCities() { - BraveVpnNativeWorkerJni.get().getServerRegionsWithCities(mNativeBraveVpnNativeWorker); - } - public void getTimezonesForRegions() { BraveVpnNativeWorkerJni.get().getTimezonesForRegions(mNativeBraveVpnNativeWorker); } @@ -211,10 +189,6 @@ public class BraveVpnNativeWorker { void destroy(long nativeBraveVpnNativeWorker, BraveVpnNativeWorker caller); - void getAllServerRegions(long nativeBraveVpnNativeWorker); - - void getServerRegionsWithCities(long nativeBraveVpnNativeWorker); - void getTimezonesForRegions(long nativeBraveVpnNativeWorker); void getHostnamesForRegion(long nativeBraveVpnNativeWorker, String region); diff --git a/android/java/org/chromium/chrome/browser/vpn/BraveVpnObserver.java b/android/java/org/chromium/chrome/browser/vpn/BraveVpnObserver.java index 92967ce494c..4a7d76786a5 100644 --- a/android/java/org/chromium/chrome/browser/vpn/BraveVpnObserver.java +++ b/android/java/org/chromium/chrome/browser/vpn/BraveVpnObserver.java @@ -6,12 +6,6 @@ package org.chromium.chrome.browser.vpn; public interface BraveVpnObserver { - public default void onGetAllServerRegions(String jsonServerRegions, boolean isSuccess) {} - ; - - public default void onGetServerRegionsWithCities(String jsonServerRegions, boolean isSuccess) {} - ; - public default void onGetTimezonesForRegions(String jsonTimezones, boolean isSuccess) {} ; diff --git a/android/java/org/chromium/chrome/browser/vpn/BraveVpnServiceFactoryAndroid.java b/android/java/org/chromium/chrome/browser/vpn/BraveVpnServiceFactoryAndroid.java index 2b78a7cadc8..9b50db0b8fa 100644 --- a/android/java/org/chromium/chrome/browser/vpn/BraveVpnServiceFactoryAndroid.java +++ b/android/java/org/chromium/chrome/browser/vpn/BraveVpnServiceFactoryAndroid.java @@ -8,7 +8,6 @@ package org.chromium.chrome.browser.vpn; import org.jni_zero.JNINamespace; import org.jni_zero.NativeMethods; -import org.chromium.base.Log; import org.chromium.brave_vpn.mojom.ServiceHandler; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.mojo.bindings.ConnectionErrorHandler; @@ -35,23 +34,18 @@ public class BraveVpnServiceFactoryAndroid { public ServiceHandler getVpnService( Profile profile, ConnectionErrorHandler connectionErrorHandler) { - Log.e("brave_vpn", "BraveVpnServiceFactoryAndroid : getVpnService 1"); if (profile == null) { return null; } - Log.e("brave_vpn", "BraveVpnServiceFactoryAndroid : getVpnService 2"); long nativeHandle = BraveVpnServiceFactoryAndroidJni.get().getInterfaceToVpnService(profile); - Log.e("brave_vpn", "BraveVpnServiceFactoryAndroid : getVpnService 2.5"); if (nativeHandle == -1) { return null; } - Log.e("brave_vpn", "BraveVpnServiceFactoryAndroid : getVpnService 3"); MessagePipeHandle handle = wrapNativeHandle(nativeHandle); ServiceHandler serviceHandler = ServiceHandler.MANAGER.attachProxy(handle, 0); Handler handler = ((Interface.Proxy) serviceHandler).getProxyHandler(); handler.setErrorHandler(connectionErrorHandler); - Log.e("brave_vpn", "BraveVpnServiceFactoryAndroid : getVpnService 4"); return serviceHandler; } diff --git a/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerActivity.java b/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerActivity.java index 1fe62bc60d5..b107878e42b 100644 --- a/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerActivity.java +++ b/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerActivity.java @@ -17,8 +17,6 @@ import androidx.recyclerview.widget.DividerItemDecoration; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; -import com.google.android.material.radiobutton.MaterialRadioButton; - import org.chromium.brave_vpn.mojom.Region; import org.chromium.chrome.R; import org.chromium.chrome.browser.vpn.adapters.VpnServerAdapter; @@ -33,9 +31,6 @@ import java.util.List; public class VpnServerActivity extends BraveVpnParentActivity { private VpnServerAdapter mVpnServerAdapter; - private LinearLayout mOptimalLayout; - private MaterialRadioButton mOptimalServerRadioButton; - private LinearLayout mServerListLayout; private ProgressBar mServerProgress; private RecyclerView mServerRegionList; @@ -54,15 +49,6 @@ public class VpnServerActivity extends BraveVpnParentActivity { actionBar.setDisplayHomeAsUpEnabled(true); actionBar.setTitle(getResources().getString(R.string.change_location)); - // mOptimalLayout = (LinearLayout) findViewById(R.id.optimal_region_layout); - // TextView optimalServerText = (TextView) mOptimalLayout.findViewById(R.id.server_text); - // optimalServerText.setText(getString(R.string.optimal_text)); - // TextView optimalCityServerText = (TextView) - // mOptimalLayout.findViewById(R.id.city_server_text); - // optimalCityServerText.setText(getString(R.string.optimal_desc)); - // mOptimalServerRadioButton = (MaterialRadioButton) - // mOptimalLayout.findViewById(R.id.server_radio_button); - mServerRegionList = (RecyclerView) findViewById(R.id.server_list); mServerListLayout = (LinearLayout) findViewById(R.id.server_layout); @@ -102,11 +88,6 @@ public class VpnServerActivity extends BraveVpnParentActivity { public void finishNativeInitialization() { super.finishNativeInitialization(); Region region = BraveVpnUtils.selectedRegion; - // if (getIntent() != null && getIntent().getExtras().getSerializable(BraveVpnUtils.REGION) - // != null) { - // region = (Region) getIntent().getExtras().getSerializable(BraveVpnUtils.REGION); - // } - // if (region != null && region.cities.length > 0) { showProgress(); List cities = new ArrayList(Arrays.asList(region.cities)); diff --git a/android/java/org/chromium/chrome/browser/vpn/utils/BraveVpnUtils.java b/android/java/org/chromium/chrome/browser/vpn/utils/BraveVpnUtils.java index 69adc115c1f..58d00d8598b 100644 --- a/android/java/org/chromium/chrome/browser/vpn/utils/BraveVpnUtils.java +++ b/android/java/org/chromium/chrome/browser/vpn/utils/BraveVpnUtils.java @@ -130,9 +130,6 @@ public class BraveVpnUtils { return; } Intent vpnServerIntent = new Intent(activity, VpnServerActivity.class); - // Bundle bundle = new Bundle(); - // bundle.putSerializable(REGION, region); - // vpnServerIntent.putExtras(bundle); activity.startActivity(vpnServerIntent); } diff --git a/android/java/res/drawable/ic_carat_right.xml b/android/java/res/drawable/ic_carat_right.xml index 82f8845631c..303a0d191d8 100644 --- a/android/java/res/drawable/ic_carat_right.xml +++ b/android/java/res/drawable/ic_carat_right.xml @@ -1,3 +1,9 @@ + + + - - + - - + GetAllServerRegions( - base::BindOnce(&BraveVpnNativeWorker::OnGetAllServerRegions, - weak_factory_.GetWeakPtr())); - } -} - -void BraveVpnNativeWorker::OnGetAllServerRegions( - const std::string& server_regions_json, - bool success) { - JNIEnv* env = base::android::AttachCurrentThread(); - Java_BraveVpnNativeWorker_onGetAllServerRegions( - env, weak_java_brave_vpn_native_worker_.get(env), - base::android::ConvertUTF8ToJavaString(env, server_regions_json), - success); -} - -void BraveVpnNativeWorker::GetServerRegionsWithCities(JNIEnv* env) { - BraveVpnService* brave_vpn_service = GetBraveVpnService(); - if (brave_vpn_service) { - brave_vpn_service->GetServerRegionsWithCities( - base::BindOnce(&BraveVpnNativeWorker::OnGetServerRegionsWithCities, - weak_factory_.GetWeakPtr())); - } -} - -void BraveVpnNativeWorker::OnGetServerRegionsWithCities( - const std::string& server_regions_json, - bool success) { - JNIEnv* env = base::android::AttachCurrentThread(); - Java_BraveVpnNativeWorker_onGetServerRegionsWithCities( - env, weak_java_brave_vpn_native_worker_.get(env), - base::android::ConvertUTF8ToJavaString(env, server_regions_json), - success); -} - void BraveVpnNativeWorker::GetTimezonesForRegions(JNIEnv* env) { BraveVpnService* brave_vpn_service = GetBraveVpnService(); if (brave_vpn_service) { diff --git a/browser/brave_vpn/android/brave_vpn_native_worker.h b/browser/brave_vpn/android/brave_vpn_native_worker.h index 39785b47061..ce11fc34692 100644 --- a/browser/brave_vpn/android/brave_vpn_native_worker.h +++ b/browser/brave_vpn/android/brave_vpn_native_worker.h @@ -25,16 +25,6 @@ class BraveVpnNativeWorker { void Destroy(JNIEnv* env, const base::android::JavaParamRef& jcaller); - void GetAllServerRegions(JNIEnv* env); - - void OnGetAllServerRegions(const std::string& server_regions_json, - bool success); - - void GetServerRegionsWithCities(JNIEnv* env); - - void OnGetServerRegionsWithCities(const std::string& server_regions_json, - bool success); - void GetTimezonesForRegions(JNIEnv* env); void OnGetTimezonesForRegions(const std::string& timezones_json, diff --git a/browser/brave_vpn/android/brave_vpn_service_factory_android.cc b/browser/brave_vpn/android/brave_vpn_service_factory_android.cc index 7b5a6db0ed5..3b835abdafe 100644 --- a/browser/brave_vpn/android/brave_vpn_service_factory_android.cc +++ b/browser/brave_vpn/android/brave_vpn_service_factory_android.cc @@ -15,8 +15,6 @@ namespace android { static jlong JNI_BraveVpnServiceFactoryAndroid_GetInterfaceToVpnService( JNIEnv* env, const base::android::JavaParamRef& profile_android) { - LOG(ERROR) << "brave_vpn" - << "JNI_BraveVpnServiceFactoryAndroid_GetInterfaceToVpnService"; auto* profile = Profile::FromJavaObject(profile_android); if (profile == nullptr) { return static_cast(-1); diff --git a/components/brave_vpn/browser/api/brave_vpn_api_request.cc b/components/brave_vpn/browser/api/brave_vpn_api_request.cc index 59ca5630000..e4bad8be498 100644 --- a/components/brave_vpn/browser/api/brave_vpn_api_request.cc +++ b/components/brave_vpn/browser/api/brave_vpn_api_request.cc @@ -62,14 +62,6 @@ BraveVpnAPIRequest::BraveVpnAPIRequest( BraveVpnAPIRequest::~BraveVpnAPIRequest() = default; -void BraveVpnAPIRequest::GetAllServerRegions(ResponseCallback callback) { - auto internal_callback = - base::BindOnce(&BraveVpnAPIRequest::OnGetResponse, - weak_ptr_factory_.GetWeakPtr(), std::move(callback)); - GURL base_url = GetURLWithPath(kVpnHost, kAllServerRegions); - OAuthRequest(base_url, "GET", "", std::move(internal_callback)); -} - void BraveVpnAPIRequest::GetServerRegionsWithCities(ResponseCallback callback) { auto internal_callback = base::BindOnce(&BraveVpnAPIRequest::OnGetResponse, diff --git a/components/brave_vpn/browser/api/brave_vpn_api_request.h b/components/brave_vpn/browser/api/brave_vpn_api_request.h index a85414ea5ce..d9d3c00fe43 100644 --- a/components/brave_vpn/browser/api/brave_vpn_api_request.h +++ b/components/brave_vpn/browser/api/brave_vpn_api_request.h @@ -33,7 +33,6 @@ class BraveVpnAPIRequest { base::OnceCallback; using APIRequestResult = api_request_helper::APIRequestResult; - void GetAllServerRegions(ResponseCallback callback); void GetServerRegionsWithCities(ResponseCallback callback); void GetTimezonesForRegions(ResponseCallback callback); void GetHostnamesForRegion(ResponseCallback callback, diff --git a/components/brave_vpn/browser/brave_vpn_service.cc b/components/brave_vpn/browser/brave_vpn_service.cc index 65cefc9ce9b..b0685c61446 100644 --- a/components/brave_vpn/browser/brave_vpn_service.cc +++ b/components/brave_vpn/browser/brave_vpn_service.cc @@ -52,10 +52,9 @@ BraveVpnService::BraveVpnService( skus_service_getter_(skus_service_getter), api_request_(new BraveVpnAPIRequest(url_loader_factory)) { DCHECK(IsBraveVPNFeatureEnabled()); +#if !BUILDFLAG(IS_ANDROID) DCHECK(connection_manager); connection_manager_ = connection_manager; - -#if !BUILDFLAG(IS_ANDROID) observed_.Observe(connection_manager_); policy_pref_change_registrar_.Init(profile_prefs_); policy_pref_change_registrar_.Add( @@ -247,6 +246,23 @@ void BraveVpnService::GetConnectionState(GetConnectionStateCallback callback) { std::move(callback).Run(state); } +void BraveVpnService::GetSelectedRegion(GetSelectedRegionCallback callback) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + VLOG(2) << __func__; + + auto region_name = + connection_manager_->GetRegionDataManager().GetSelectedRegion(); + std::move(callback).Run(GetRegionPtrWithNameFromRegionList( + region_name, connection_manager_->GetRegionDataManager().GetRegions())); +} + +void BraveVpnService::SetSelectedRegion(mojom::RegionPtr region_ptr) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + + VLOG(2) << __func__ << " : " << region_ptr->name_pretty; + connection_manager_->SetSelectedRegion(region_ptr->name); +} + void BraveVpnService::GetProductUrls(GetProductUrlsCallback callback) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); std::move(callback).Run(mojom::ProductUrls::New( @@ -363,8 +379,7 @@ void BraveVpnService::UpdatePurchasedStateForSessionExpired( #endif // !BUILDFLAG(IS_ANDROID) void BraveVpnService::GetAllRegions(GetAllRegionsCallback callback) { - // DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - LOG(ERROR) << "brave_vpn : " << "GetAllRegions"; + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); #if BUILDFLAG(IS_ANDROID) api_request_->GetServerRegionsWithCities( base::BindOnce(&BraveVpnService::OnFetchRegionList, @@ -379,14 +394,13 @@ void BraveVpnService::GetAllRegions(GetAllRegionsCallback callback) { #endif } +#if BUILDFLAG(IS_ANDROID) void BraveVpnService::OnFetchRegionList(GetAllRegionsCallback callback, const std::string& region_list, bool success) { std::optional value = base::JSONReader::Read(region_list); - LOG(ERROR) << "brave_vpn : " << "OnFetchRegionList 1"; if (value && value->is_list()) { auto new_regions = ParseRegionList(value->GetList()); - LOG(ERROR) << "brave_vpn : " << "OnFetchRegionList 2"; std::vector regions; for (const auto& region : new_regions) { regions.push_back(region.Clone()); @@ -395,26 +409,7 @@ void BraveVpnService::OnFetchRegionList(GetAllRegionsCallback callback, } } -void BraveVpnService::GetSelectedRegion(GetSelectedRegionCallback callback) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - VLOG(2) << __func__; - - auto region_name = - connection_manager_->GetRegionDataManager().GetSelectedRegion(); - std::move(callback).Run(GetRegionPtrWithNameFromRegionList( - region_name, connection_manager_->GetRegionDataManager().GetRegions())); -} - -void BraveVpnService::SetSelectedRegion(mojom::RegionPtr region_ptr) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - - VLOG(2) << __func__ << " : " << region_ptr->name_pretty; - connection_manager_->SetSelectedRegion(region_ptr->name); -} - -#if BUILDFLAG(IS_ANDROID) void BraveVpnService::GetPurchaseToken(GetPurchaseTokenCallback callback) { - LOG(ERROR) << "brave_vpn : " << "GetPurchaseToken"; std::string purchase_token_string = ""; std::string package_string = "com.brave.browser"; std::string product_id_string = "brave-firewall-vpn-premium"; @@ -468,7 +463,6 @@ mojom::PurchasedInfo BraveVpnService::GetPurchasedInfoSync() const { void BraveVpnService::GetPurchasedState(GetPurchasedStateCallback callback) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - LOG(ERROR) << "brave_vpn : " << "GetPurchasedState"; std::move(callback).Run(GetPurchasedInfoSync().Clone()); } @@ -893,14 +887,6 @@ void BraveVpnService::Shutdown() { #endif // !BUILDFLAG(IS_ANDROID) } -void BraveVpnService::GetAllServerRegions(ResponseCallback callback) { - api_request_->GetAllServerRegions(std::move(callback)); -} - -void BraveVpnService::GetServerRegionsWithCities(ResponseCallback callback) { - api_request_->GetServerRegionsWithCities(std::move(callback)); -} - void BraveVpnService::GetTimezonesForRegions(ResponseCallback callback) { api_request_->GetTimezonesForRegions(std::move(callback)); } diff --git a/components/brave_vpn/browser/brave_vpn_service.h b/components/brave_vpn/browser/brave_vpn_service.h index 5d3cbe8f955..09c1b9e3747 100644 --- a/components/brave_vpn/browser/brave_vpn_service.h +++ b/components/brave_vpn/browser/brave_vpn_service.h @@ -22,7 +22,6 @@ #include "brave/components/brave_vpn/browser/api/brave_vpn_api_request.h" #include "brave/components/brave_vpn/browser/brave_vpn_service_delegate.h" #include "brave/components/brave_vpn/browser/connection/brave_vpn_connection_manager.h" -#include "brave/components/brave_vpn/browser/connection/brave_vpn_region_data_manager.h" #include "brave/components/brave_vpn/common/brave_vpn_data_types.h" #include "brave/components/brave_vpn/common/mojom/brave_vpn.mojom.h" #include "brave/components/skus/browser/skus_utils.h" @@ -51,7 +50,6 @@ class BraveBrowserCommandControllerTest; namespace brave_vpn { class BraveVPNServiceDelegate; -class BraveVPNRegionDataManager; inline constexpr char kNewUserReturningHistogramName[] = "Brave.VPN.NewUserReturning"; @@ -101,6 +99,8 @@ class BraveVpnService : void GetConnectionState(GetConnectionStateCallback callback) override; void Connect() override; void Disconnect() override; + void GetSelectedRegion(GetSelectedRegionCallback callback) override; + void SetSelectedRegion(mojom::RegionPtr region) override; void GetProductUrls(GetProductUrlsCallback callback) override; void CreateSupportTicket(const std::string& email, const std::string& subject, @@ -113,6 +113,9 @@ class BraveVpnService : #else // mojom::vpn::ServiceHandler void GetPurchaseToken(GetPurchaseTokenCallback callback) override; + void OnFetchRegionList(GetAllRegionsCallback callback, + const std::string& region_list, + bool success); #endif // !BUILDFLAG(IS_ANDROID) using ResponseCallback = @@ -125,13 +128,7 @@ class BraveVpnService : void LoadPurchasedState(const std::string& domain) override; void GetAllRegions(GetAllRegionsCallback callback) override; - void OnFetchRegionList(GetAllRegionsCallback callback, - const std::string& region_list, - bool success); - void GetSelectedRegion(GetSelectedRegionCallback callback) override; - void SetSelectedRegion(mojom::RegionPtr region) override; - void GetAllServerRegions(ResponseCallback callback); void GetServerRegionsWithCities(ResponseCallback callback); void GetTimezonesForRegions(ResponseCallback callback); void GetHostnamesForRegion(ResponseCallback callback, @@ -229,13 +226,12 @@ class BraveVpnService : // Check initial purchased/connected state. void CheckInitialState(); - raw_ptr connection_manager_ = nullptr; - #if !BUILDFLAG(IS_ANDROID) base::ScopedObservation observed_{this}; bool wait_region_data_ready_ = false; + raw_ptr connection_manager_ = nullptr; PrefChangeRegistrar policy_pref_change_registrar_; #endif // !BUILDFLAG(IS_ANDROID) diff --git a/components/brave_vpn/common/mojom/brave_vpn.mojom b/components/brave_vpn/common/mojom/brave_vpn.mojom index b1cb5ecd628..0706f7a8fb6 100644 --- a/components/brave_vpn/common/mojom/brave_vpn.mojom +++ b/components/brave_vpn/common/mojom/brave_vpn.mojom @@ -53,8 +53,10 @@ interface ServiceHandler { // Gets all region from internal cache which is fetched from Guardian API GetAllRegions() => (array regions); + [EnableIfNot=is_android] GetSelectedRegion() => (Region current_region); + [EnableIfNot=is_android] SetSelectedRegion(Region region); [EnableIfNot=is_android] From 9a6b1ba3b9ca5ccbfcecc693ba2000787eff024b Mon Sep 17 00:00:00 2001 From: deeppandya Date: Mon, 12 Aug 2024 23:10:01 +0530 Subject: [PATCH 13/31] Add region precision in the api --- .../VpnServerSelectionActivity.java | 2 ++ .../browser/api/brave_vpn_api_request.cc | 6 +++-- .../browser/api/brave_vpn_api_request.h | 3 ++- .../brave_vpn/browser/brave_vpn_service.cc | 8 ++++--- .../brave_vpn/browser/brave_vpn_service.h | 4 ++-- .../browser/brave_vpn_service_helper.cc | 18 +++++++++------ .../brave_vpn_region_data_manager.cc | 23 ++++--------------- .../brave_vpn/common/brave_vpn_constants.h | 2 +- .../brave_vpn/common/mojom/brave_vpn.mojom | 7 +++++- 9 files changed, 37 insertions(+), 36 deletions(-) diff --git a/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerSelectionActivity.java b/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerSelectionActivity.java index b47df98f7e6..691967dfc3d 100644 --- a/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerSelectionActivity.java +++ b/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerSelectionActivity.java @@ -19,6 +19,7 @@ import androidx.recyclerview.widget.RecyclerView; import com.google.android.material.materialswitch.MaterialSwitch; +import org.chromium.brave_vpn.mojom.BraveVpnConstants; import org.chromium.brave_vpn.mojom.Region; import org.chromium.brave_vpn.mojom.ServiceHandler; import org.chromium.chrome.R; @@ -132,6 +133,7 @@ public class VpnServerSelectionActivity extends BraveVpnParentActivity initVpnService(); showProgress(); mServiceHandler.getAllRegions( + BraveVpnConstants.REGION_PRECISION_CITY_BY_COUNTRY, regions -> { if (regions.length > 0) { mBraveVpnServerSelectionAdapter = diff --git a/components/brave_vpn/browser/api/brave_vpn_api_request.cc b/components/brave_vpn/browser/api/brave_vpn_api_request.cc index e4bad8be498..43504071577 100644 --- a/components/brave_vpn/browser/api/brave_vpn_api_request.cc +++ b/components/brave_vpn/browser/api/brave_vpn_api_request.cc @@ -62,11 +62,13 @@ BraveVpnAPIRequest::BraveVpnAPIRequest( BraveVpnAPIRequest::~BraveVpnAPIRequest() = default; -void BraveVpnAPIRequest::GetServerRegionsWithCities(ResponseCallback callback) { +void BraveVpnAPIRequest::GetServerRegions(ResponseCallback callback, + const std::string& region_precision) { auto internal_callback = base::BindOnce(&BraveVpnAPIRequest::OnGetResponse, weak_ptr_factory_.GetWeakPtr(), std::move(callback)); - GURL base_url = GetURLWithPath(kVpnHost, kServerRegionsWithCities); + GURL base_url = + GetURLWithPath(kVpnHost, kServerRegionsWithCities + region_precision); OAuthRequest(base_url, "GET", "", std::move(internal_callback)); } diff --git a/components/brave_vpn/browser/api/brave_vpn_api_request.h b/components/brave_vpn/browser/api/brave_vpn_api_request.h index d9d3c00fe43..e0001775826 100644 --- a/components/brave_vpn/browser/api/brave_vpn_api_request.h +++ b/components/brave_vpn/browser/api/brave_vpn_api_request.h @@ -33,7 +33,8 @@ class BraveVpnAPIRequest { base::OnceCallback; using APIRequestResult = api_request_helper::APIRequestResult; - void GetServerRegionsWithCities(ResponseCallback callback); + void GetServerRegions(ResponseCallback callback, + const std::string& region_precision); void GetTimezonesForRegions(ResponseCallback callback); void GetHostnamesForRegion(ResponseCallback callback, const std::string& region); diff --git a/components/brave_vpn/browser/brave_vpn_service.cc b/components/brave_vpn/browser/brave_vpn_service.cc index b0685c61446..9d726ee8a95 100644 --- a/components/brave_vpn/browser/brave_vpn_service.cc +++ b/components/brave_vpn/browser/brave_vpn_service.cc @@ -378,12 +378,14 @@ void BraveVpnService::UpdatePurchasedStateForSessionExpired( } #endif // !BUILDFLAG(IS_ANDROID) -void BraveVpnService::GetAllRegions(GetAllRegionsCallback callback) { +void BraveVpnService::GetAllRegions(const std::string& region_precision, + GetAllRegionsCallback callback) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); #if BUILDFLAG(IS_ANDROID) - api_request_->GetServerRegionsWithCities( + api_request_->GetServerRegions( base::BindOnce(&BraveVpnService::OnFetchRegionList, - base::Unretained(this), std::move(callback))); + base::Unretained(this), std::move(callback)), + region_precision); #else std::vector regions; for (const auto& region : diff --git a/components/brave_vpn/browser/brave_vpn_service.h b/components/brave_vpn/browser/brave_vpn_service.h index 09c1b9e3747..db127eeaae1 100644 --- a/components/brave_vpn/browser/brave_vpn_service.h +++ b/components/brave_vpn/browser/brave_vpn_service.h @@ -127,9 +127,9 @@ class BraveVpnService : void GetPurchasedState(GetPurchasedStateCallback callback) override; void LoadPurchasedState(const std::string& domain) override; - void GetAllRegions(GetAllRegionsCallback callback) override; + void GetAllRegions(const std::string& region_precision, + GetAllRegionsCallback callback) override; - void GetServerRegionsWithCities(ResponseCallback callback); void GetTimezonesForRegions(ResponseCallback callback); void GetHostnamesForRegion(ResponseCallback callback, const std::string& region); diff --git a/components/brave_vpn/browser/brave_vpn_service_helper.cc b/components/brave_vpn/browser/brave_vpn_service_helper.cc index 451c71cace8..fb3bda2c87c 100644 --- a/components/brave_vpn/browser/brave_vpn_service_helper.cc +++ b/components/brave_vpn/browser/brave_vpn_service_helper.cc @@ -50,11 +50,13 @@ base::Value::Dict GetValueFromRegionWithoutCity( base::Value::Dict GetValueFromRegion(const mojom::RegionPtr& region) { base::Value::Dict region_dict = GetValueFromRegionWithoutCity(region); - base::Value::List cities; - for (const auto& city : region->cities) { - cities.Append(GetValueFromRegionWithoutCity(city)); + if (!region->cities.empty()) { + base::Value::List cities; + for (const auto& city : region->cities) { + cities.Append(GetValueFromRegionWithoutCity(city)); + } + region_dict.Set(kRegionCitiesKey, std::move(cities)); } - region_dict.Set(kRegionCitiesKey, std::move(cities)); return region_dict; } @@ -108,9 +110,11 @@ mojom::RegionPtr GetRegionFromValueWithoutCity(const base::Value::Dict& value) { mojom::RegionPtr GetRegionFromValue(const base::Value::Dict& value) { mojom::RegionPtr region = GetRegionFromValueWithoutCity(value); - const auto* cities = value.FindList(kRegionCitiesKey); - for (const auto& city : *cities) { - region->cities.push_back(GetRegionFromValueWithoutCity(city.GetDict())); + if (value.FindList(kRegionCitiesKey)) { + const auto* cities = value.FindList(kRegionCitiesKey); + for (const auto& city : *cities) { + region->cities.push_back(GetRegionFromValueWithoutCity(city.GetDict())); + } } return region; diff --git a/components/brave_vpn/browser/connection/brave_vpn_region_data_manager.cc b/components/brave_vpn/browser/connection/brave_vpn_region_data_manager.cc index 5c2d10ab82d..1cfe3b2d21b 100644 --- a/components/brave_vpn/browser/connection/brave_vpn_region_data_manager.cc +++ b/components/brave_vpn/browser/connection/brave_vpn_region_data_manager.cc @@ -190,16 +190,13 @@ void BraveVPNRegionDataManager::FetchRegionDataIfNeeded() { } void BraveVPNRegionDataManager::FetchRegions() { - LOG(ERROR) << "brave_vpn : " << "FetchRegions 1"; - if (!url_loader_factory_) { - LOG(ERROR) << "brave_vpn : " << "FetchRegions 1.5"; - } api_request_ = std::make_unique(url_loader_factory_); VLOG(2) << __func__ << " : Start fetching region data"; - LOG(ERROR) << "brave_vpn : " << "FetchRegions 2"; // Unretained is safe here becasue this class owns |api_request_|. - api_request_->GetServerRegionsWithCities(base::BindOnce( - &BraveVPNRegionDataManager::OnFetchRegionList, base::Unretained(this))); + api_request_->GetServerRegions( + base::BindOnce(&BraveVPNRegionDataManager::OnFetchRegionList, + base::Unretained(this)), + mojom::kRegionPrecisionCityByCountry); } void BraveVPNRegionDataManager::OnFetchRegionList( @@ -210,17 +207,6 @@ void BraveVPNRegionDataManager::OnFetchRegionList( } api_request_.reset(); std::optional value = base::JSONReader::Read(region_list); - - LOG(ERROR) << "brave_vpn : " << "OnFetchRegionList 1"; -#if BUILDFLAG(IS_ANDROID) - if (value && value->is_list()) { - auto new_regions = ParseRegionList(value->GetList()); - LOG(ERROR) << "brave_vpn : " << "OnFetchRegionList 2"; - for (const auto& region : new_regions) { - LOG(ERROR) << "brave_vpn : " << region->name; - } - } -#else if (value && value->is_list() && ParseAndCacheRegionList(value->GetList(), true)) { VLOG(2) << "Got valid region list"; @@ -236,7 +222,6 @@ void BraveVPNRegionDataManager::OnFetchRegionList( VLOG(2) << "Got invalid region list"; NotifyRegionDataReady(); -#endif } bool BraveVPNRegionDataManager::ParseAndCacheRegionList( diff --git a/components/brave_vpn/common/brave_vpn_constants.h b/components/brave_vpn/common/brave_vpn_constants.h index 7a54fd230df..64e9f2299b9 100644 --- a/components/brave_vpn/common/brave_vpn_constants.h +++ b/components/brave_vpn/common/brave_vpn_constants.h @@ -41,7 +41,7 @@ inline constexpr char kSupportTicketTimezoneKey[] = "timezone"; inline constexpr char kVpnHost[] = "connect-api.guardianapp.com"; inline constexpr char kAllServerRegions[] = "api/v1/servers/all-server-regions"; inline constexpr char kServerRegionsWithCities[] = - "api/v1.3/servers/all-server-regions/city-by-country"; + "api/v1.3/servers/all-server-regions/"; inline constexpr char kTimezonesForRegions[] = "api/v1.1/servers/timezones-for-regions"; inline constexpr char kHostnameForRegion[] = diff --git a/components/brave_vpn/common/mojom/brave_vpn.mojom b/components/brave_vpn/common/mojom/brave_vpn.mojom index 0706f7a8fb6..c486efbeed7 100644 --- a/components/brave_vpn/common/mojom/brave_vpn.mojom +++ b/components/brave_vpn/common/mojom/brave_vpn.mojom @@ -51,7 +51,7 @@ interface ServiceHandler { Disconnect(); // Gets all region from internal cache which is fetched from Guardian API - GetAllRegions() => (array regions); + GetAllRegions(string region_precision) => (array regions); [EnableIfNot=is_android] GetSelectedRegion() => (Region current_region); @@ -132,3 +132,8 @@ struct Region { double longitude; int32 server_count; }; + +const string kRegionPrecisionDefault = "default"; +const string kRegionPrecisionCity = "city"; +const string kRegionPrecisionCountry = "country"; +const string kRegionPrecisionCityByCountry = "city-by-country"; From af344244acb5104d70395405f49f43cff7b010d3 Mon Sep 17 00:00:00 2001 From: deeppandya Date: Mon, 19 Aug 2024 00:12:02 +0530 Subject: [PATCH 14/31] Update server selection behaviour with server change in parent --- .../activities/BraveVpnParentActivity.java | 81 ++++++++++++++----- .../activities/BraveVpnProfileActivity.java | 12 --- .../vpn/activities/VpnPaywallActivity.java | 14 +--- .../vpn/activities/VpnServerActivity.java | 16 +--- .../VpnServerSelectionActivity.java | 16 ---- .../android/brave_vpn_native_worker.cc | 13 +++ 6 files changed, 75 insertions(+), 77 deletions(-) diff --git a/android/java/org/chromium/chrome/browser/vpn/activities/BraveVpnParentActivity.java b/android/java/org/chromium/chrome/browser/vpn/activities/BraveVpnParentActivity.java index ac3770cedff..330849ee386 100644 --- a/android/java/org/chromium/chrome/browser/vpn/activities/BraveVpnParentActivity.java +++ b/android/java/org/chromium/chrome/browser/vpn/activities/BraveVpnParentActivity.java @@ -52,23 +52,38 @@ public abstract class BraveVpnParentActivity // Pass @{code ActivityResultRegistry} reference explicitly to avoid crash // https://github.com/brave/brave-browser/issues/31882 - ActivityResultLauncher mIntentActivityResultLauncher = registerForActivityResult( - new ActivityResultContracts.StartActivityForResult(), getActivityResultRegistry(), - result -> { - BraveVpnUtils.dismissProgressDialog(); - if (result.getResultCode() == RESULT_OK) { - BraveVpnProfileUtils.getInstance().startVpn(BraveVpnParentActivity.this); - BraveVpnUtils.showVpnConfirmDialog(this); - } else if (result.getResultCode() == RESULT_CANCELED) { - if (BraveVpnProfileUtils.getInstance().isVPNRunning(this)) { - BraveVpnUtils.showVpnAlwaysOnErrorDialog(this); - } else { - updateProfileView(); - } - BraveVpnUtils.showToast( - getResources().getString(R.string.permission_was_cancelled)); - } - }); + ActivityResultLauncher mIntentActivityResultLauncher = + registerForActivityResult( + new ActivityResultContracts.StartActivityForResult(), + getActivityResultRegistry(), + result -> { + BraveVpnUtils.dismissProgressDialog(); + if (result.getResultCode() == RESULT_OK) { + BraveVpnProfileUtils.getInstance() + .startVpn(BraveVpnParentActivity.this); + BraveVpnUtils.showVpnConfirmDialog(this); + } else if (result.getResultCode() == RESULT_CANCELED) { + if (BraveVpnProfileUtils.getInstance().isVPNRunning(this)) { + BraveVpnUtils.showVpnAlwaysOnErrorDialog(this); + } else { + updateProfileView(); + } + BraveVpnUtils.showToast( + getResources().getString(R.string.permission_was_cancelled)); + } + }); + + @Override + public void onResumeWithNative() { + super.onResumeWithNative(); + BraveVpnNativeWorker.getInstance().addObserver(this); + } + + @Override + public void onPauseWithNative() { + BraveVpnNativeWorker.getInstance().removeObserver(this); + super.onPauseWithNative(); + } @Override public void finishNativeInitialization() { @@ -82,6 +97,7 @@ public abstract class BraveVpnParentActivity } protected void verifySubscription() { + Log.e("brave_vpn", "verifySubscription : 1"); mBraveVpnPrefModel = new BraveVpnPrefModel(); MutableLiveData _activePurchases = new MutableLiveData(); LiveData activePurchases = _activePurchases; @@ -91,6 +107,7 @@ public abstract class BraveVpnParentActivity activePurchases, activePurchaseModel -> { if (activePurchaseModel != null) { + Log.e("brave_vpn", "verifySubscription : 2"); mBraveVpnPrefModel.setPurchaseToken(activePurchaseModel.getPurchaseToken()); mBraveVpnPrefModel.setProductId(activePurchaseModel.getProductId()); BraveVpnNativeWorker.getInstance() @@ -100,6 +117,7 @@ public abstract class BraveVpnParentActivity BraveVpnUtils.SUBSCRIPTION_PARAM_TEXT, getPackageName()); } else { + Log.e("brave_vpn", "verifySubscription : 3"); if (!mIsVerification) { BraveVpnApiResponseUtils.queryPurchaseFailed( BraveVpnParentActivity.this); @@ -115,7 +133,9 @@ public abstract class BraveVpnParentActivity @Override public void onVerifyPurchaseToken( String jsonResponse, String purchaseToken, String productId, boolean isSuccess) { + Log.e("brave_vpn", "onVerifyPurchaseToken : 1"); if (isSuccess && mBraveVpnPrefModel != null) { + Log.e("brave_vpn", "onVerifyPurchaseToken : 2"); Long purchaseExpiry = BraveVpnUtils.getPurchaseExpiryDate(jsonResponse); int paymentState = BraveVpnUtils.getPaymentState(jsonResponse); if (purchaseExpiry > 0 && purchaseExpiry >= System.currentTimeMillis()) { @@ -125,17 +145,23 @@ public abstract class BraveVpnParentActivity BraveVpnPrefUtils.setSubscriptionPurchase(true); BraveVpnPrefUtils.setPaymentState(paymentState); if (!mIsVerification || BraveVpnPrefUtils.isResetConfiguration()) { - BraveVpnNativeWorker.getInstance().getSubscriberCredential( - BraveVpnUtils.SUBSCRIPTION_PARAM_TEXT, - mBraveVpnPrefModel.getProductId(), BraveVpnUtils.IAP_ANDROID_PARAM_TEXT, - mBraveVpnPrefModel.getPurchaseToken(), getPackageName()); + Log.e("brave_vpn", "onVerifyPurchaseToken : 3"); + BraveVpnNativeWorker.getInstance() + .getSubscriberCredential( + BraveVpnUtils.SUBSCRIPTION_PARAM_TEXT, + mBraveVpnPrefModel.getProductId(), + BraveVpnUtils.IAP_ANDROID_PARAM_TEXT, + mBraveVpnPrefModel.getPurchaseToken(), + getPackageName()); } else { + Log.e("brave_vpn", "onVerifyPurchaseToken : 4"); mIsVerification = false; showRestoreMenu(true); BraveVpnUtils.showToast(getResources().getString(R.string.already_subscribed)); BraveVpnUtils.dismissProgressDialog(); } } else { + Log.e("brave_vpn", "onVerifyPurchaseToken : 5"); BraveVpnApiResponseUtils.queryPurchaseFailed(BraveVpnParentActivity.this); mIsServerLocationChanged = false; if (mIsVerification) { @@ -210,6 +236,19 @@ public abstract class BraveVpnParentActivity } } + public void changeServerRegion() { + mIsServerLocationChanged = true; + // BraveVpnUtils.selectedServerRegion = braveVpnServerRegion; + BraveVpnUtils.showProgressDialog( + BraveVpnParentActivity.this, getResources().getString(R.string.vpn_connect_text)); + if (BraveVpnNativeWorker.getInstance().isPurchasedUser()) { + mBraveVpnPrefModel = new BraveVpnPrefModel(); + BraveVpnNativeWorker.getInstance().getSubscriberCredentialV12(); + } else { + verifySubscription(); + } + } + private void checkForVpn( BraveVpnWireguardProfileCredentials braveVpnWireguardProfileCredentials) { new Thread() { diff --git a/android/java/org/chromium/chrome/browser/vpn/activities/BraveVpnProfileActivity.java b/android/java/org/chromium/chrome/browser/vpn/activities/BraveVpnProfileActivity.java index ac2e5f09f48..7bfe631a54e 100644 --- a/android/java/org/chromium/chrome/browser/vpn/activities/BraveVpnProfileActivity.java +++ b/android/java/org/chromium/chrome/browser/vpn/activities/BraveVpnProfileActivity.java @@ -30,18 +30,6 @@ public class BraveVpnProfileActivity extends BraveVpnParentActivity { private ProgressBar mProfileProgress; private LinearLayout mProfileLayout; - @Override - public void onResumeWithNative() { - super.onResumeWithNative(); - BraveVpnNativeWorker.getInstance().addObserver(this); - } - - @Override - public void onPauseWithNative() { - BraveVpnNativeWorker.getInstance().removeObserver(this); - super.onPauseWithNative(); - } - private void initializeViews() { setContentView(R.layout.activity_brave_vpn_profile); diff --git a/android/java/org/chromium/chrome/browser/vpn/activities/VpnPaywallActivity.java b/android/java/org/chromium/chrome/browser/vpn/activities/VpnPaywallActivity.java index b1db931137c..ede81a54255 100644 --- a/android/java/org/chromium/chrome/browser/vpn/activities/VpnPaywallActivity.java +++ b/android/java/org/chromium/chrome/browser/vpn/activities/VpnPaywallActivity.java @@ -31,6 +31,7 @@ import org.chromium.chrome.browser.billing.LinkSubscriptionUtils; import org.chromium.chrome.browser.util.LiveDataUtil; import org.chromium.chrome.browser.util.TabUtils; import org.chromium.chrome.browser.vpn.BraveVpnNativeWorker; +import org.chromium.chrome.browser.vpn.adapters.BraveVpnPlanPagerAdapter; import org.chromium.chrome.browser.vpn.utils.BraveVpnUtils; import org.chromium.ui.text.SpanApplier; import org.chromium.ui.text.SpanApplier.SpanInfo; @@ -59,19 +60,6 @@ public class VpnPaywallActivity extends BraveVpnParentActivity { private SelectedPlanType mSelectedPlanType = SelectedPlanType.YEARLY; private ProductDetails mProductDetails; - @Override - public void onResumeWithNative() { - super.onResumeWithNative(); - BraveVpnNativeWorker.getInstance().addObserver(this); - BraveVpnUtils.dismissProgressDialog(); - } - - @Override - public void onPauseWithNative() { - BraveVpnNativeWorker.getInstance().removeObserver(this); - super.onPauseWithNative(); - } - private void initializeViews() { setContentView(R.layout.activity_vpn_paywall); diff --git a/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerActivity.java b/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerActivity.java index b107878e42b..3c684321b21 100644 --- a/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerActivity.java +++ b/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerActivity.java @@ -109,13 +109,12 @@ public class VpnServerActivity extends BraveVpnParentActivity { Toast.LENGTH_SHORT) .show(); } else { - // changeServerRegion(city); + changeServerRegion(); } } }); mServerRegionList.setAdapter(mVpnServerAdapter); hideProgress(); - // } } @Override @@ -129,19 +128,6 @@ public class VpnServerActivity extends BraveVpnParentActivity { return true; } - // private void changeServerRegion(BraveVpnServerRegion braveVpnServerRegion) { - // mIsServerLocationChanged = true; - // BraveVpnUtils.selectedServerRegion = braveVpnServerRegion; - // BraveVpnUtils.showProgressDialog( - // VpnServerActivity.this, getResources().getString(R.string.vpn_connect_text)); - // if (BraveVpnNativeWorker.getInstance().isPurchasedUser()) { - // mBraveVpnPrefModel = new BraveVpnPrefModel(); - // BraveVpnNativeWorker.getInstance().getSubscriberCredentialV12(); - // } else { - // verifySubscription(); - // } - // } - public void showProgress() { if (mServerProgress != null) { mServerProgress.setVisibility(View.VISIBLE); diff --git a/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerSelectionActivity.java b/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerSelectionActivity.java index 691967dfc3d..cc907d7225a 100644 --- a/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerSelectionActivity.java +++ b/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerSelectionActivity.java @@ -23,10 +23,8 @@ import org.chromium.brave_vpn.mojom.BraveVpnConstants; import org.chromium.brave_vpn.mojom.Region; import org.chromium.brave_vpn.mojom.ServiceHandler; import org.chromium.chrome.R; -import org.chromium.chrome.browser.vpn.BraveVpnNativeWorker; import org.chromium.chrome.browser.vpn.BraveVpnServiceFactoryAndroid; import org.chromium.chrome.browser.vpn.adapters.BraveVpnServerSelectionAdapter; -import org.chromium.chrome.browser.vpn.models.BraveVpnPrefModel; import org.chromium.chrome.browser.vpn.utils.BraveVpnPrefUtils; import org.chromium.chrome.browser.vpn.utils.BraveVpnUtils; import org.chromium.mojo.bindings.ConnectionErrorHandler; @@ -194,18 +192,4 @@ public class VpnServerSelectionActivity extends BraveVpnParentActivity @Override public void updateProfileView() {} - - private void changeServerRegion() { - mIsServerLocationChanged = true; - // BraveVpnUtils.selectedServerRegion = braveVpnServerRegion; - BraveVpnUtils.showProgressDialog( - VpnServerSelectionActivity.this, - getResources().getString(R.string.vpn_connect_text)); - if (BraveVpnNativeWorker.getInstance().isPurchasedUser()) { - mBraveVpnPrefModel = new BraveVpnPrefModel(); - BraveVpnNativeWorker.getInstance().getSubscriberCredentialV12(); - } else { - verifySubscription(); - } - } } diff --git a/browser/brave_vpn/android/brave_vpn_native_worker.cc b/browser/brave_vpn/android/brave_vpn_native_worker.cc index 7ab13296c51..570d98c8fed 100644 --- a/browser/brave_vpn/android/brave_vpn_native_worker.cc +++ b/browser/brave_vpn/android/brave_vpn_native_worker.cc @@ -214,8 +214,18 @@ void BraveVpnNativeWorker::VerifyPurchaseToken( const base::android::JavaParamRef& product_id, const base::android::JavaParamRef& product_type, const base::android::JavaParamRef& bundle_id) { + LOG(ERROR) << "brave_vpn" << "verifyPurchaseToken"; BraveVpnService* brave_vpn_service = GetBraveVpnService(); if (brave_vpn_service) { + LOG(ERROR) << "brave_vpn" << "verifyPurchaseToken 2"; + LOG(ERROR) << "brave_vpn" + << "verifyPurchaseToken 2 : purchase_token : " << purchase_token; + LOG(ERROR) << "brave_vpn" + << "verifyPurchaseToken 2 : product_id : " << product_id; + LOG(ERROR) << "brave_vpn" + << "verifyPurchaseToken 2 : product_type : " << product_type; + LOG(ERROR) << "brave_vpn" + << "verifyPurchaseToken 2 : bundle_id : " << bundle_id; brave_vpn_service->VerifyPurchaseToken( base::BindOnce( &BraveVpnNativeWorker::OnVerifyPurchaseToken, @@ -234,6 +244,9 @@ void BraveVpnNativeWorker::OnVerifyPurchaseToken( const std::string& product_id, const std::string& json_response, bool success) { + LOG(ERROR) << "brave_vpn" + << "OnVerifyPurchaseToken 2 : json_response" + json_response; + LOG(ERROR) << "brave_vpn" << "OnVerifyPurchaseToken 2"; JNIEnv* env = base::android::AttachCurrentThread(); Java_BraveVpnNativeWorker_onVerifyPurchaseToken( env, weak_java_brave_vpn_native_worker_.get(env), From d1a68438f53c7a3c1b64bcb53ce471509e6aa81e Mon Sep 17 00:00:00 2001 From: deeppandya Date: Mon, 19 Aug 2024 22:01:52 +0530 Subject: [PATCH 15/31] Update server region changes to include city --- .../BraveTabbedAppMenuPropertiesDelegate.java | 6 +-- .../activities/BraveVpnParentActivity.java | 13 ++--- .../vpn/activities/VpnServerActivity.java | 7 +++ .../VpnServerSelectionActivity.java | 1 + .../vpn/adapters/VpnServerAdapter.java | 5 +- .../vpn/models/BraveVpnServerRegion.java | 54 +++++++++++++------ .../vpn/settings/BraveVpnPreferences.java | 19 ++++--- .../vpn/utils/BraveVpnApiResponseUtils.java | 20 ++++--- .../browser/vpn/utils/BraveVpnPrefUtils.java | 28 +++++++--- .../browser/vpn/utils/BraveVpnUtils.java | 15 ++++-- .../android/brave_vpn_native_worker.cc | 13 ----- 11 files changed, 112 insertions(+), 69 deletions(-) diff --git a/android/java/org/chromium/chrome/browser/appmenu/BraveTabbedAppMenuPropertiesDelegate.java b/android/java/org/chromium/chrome/browser/appmenu/BraveTabbedAppMenuPropertiesDelegate.java index a0be016df4f..8ef705d5b6d 100644 --- a/android/java/org/chromium/chrome/browser/appmenu/BraveTabbedAppMenuPropertiesDelegate.java +++ b/android/java/org/chromium/chrome/browser/appmenu/BraveTabbedAppMenuPropertiesDelegate.java @@ -125,13 +125,13 @@ public class BraveTabbedAppMenuPropertiesDelegate extends TabbedAppMenuPropertie } if (BraveVpnPrefUtils.isSubscriptionPurchase() - && !TextUtils.isEmpty(BraveVpnPrefUtils.getServerIsoCode())) { + && !TextUtils.isEmpty(BraveVpnPrefUtils.getRegionIsoCode())) { String serverLocation = " " + BraveVpnUtils.countryCodeToEmoji( - BraveVpnPrefUtils.getServerIsoCode()) + BraveVpnPrefUtils.getRegionIsoCode()) + " " - + BraveVpnPrefUtils.getServerNamePretty(); + + BraveVpnPrefUtils.getRegionNamePretty(); SubMenu vpnLocationSubMenu = menu.findItem(R.id.request_vpn_location_row_menu_id).getSubMenu(); diff --git a/android/java/org/chromium/chrome/browser/vpn/activities/BraveVpnParentActivity.java b/android/java/org/chromium/chrome/browser/vpn/activities/BraveVpnParentActivity.java index 330849ee386..d614ec1415c 100644 --- a/android/java/org/chromium/chrome/browser/vpn/activities/BraveVpnParentActivity.java +++ b/android/java/org/chromium/chrome/browser/vpn/activities/BraveVpnParentActivity.java @@ -28,6 +28,7 @@ import org.chromium.chrome.browser.init.ActivityProfileProvider; import org.chromium.chrome.browser.init.AsyncInitializationActivity; import org.chromium.chrome.browser.profiles.ProfileProvider; import org.chromium.chrome.browser.util.LiveDataUtil; +import org.chromium.chrome.browser.util.TabUtils; import org.chromium.chrome.browser.vpn.BraveVpnNativeWorker; import org.chromium.chrome.browser.vpn.BraveVpnObserver; import org.chromium.chrome.browser.vpn.models.BraveVpnPrefModel; @@ -97,7 +98,6 @@ public abstract class BraveVpnParentActivity } protected void verifySubscription() { - Log.e("brave_vpn", "verifySubscription : 1"); mBraveVpnPrefModel = new BraveVpnPrefModel(); MutableLiveData _activePurchases = new MutableLiveData(); LiveData activePurchases = _activePurchases; @@ -107,7 +107,6 @@ public abstract class BraveVpnParentActivity activePurchases, activePurchaseModel -> { if (activePurchaseModel != null) { - Log.e("brave_vpn", "verifySubscription : 2"); mBraveVpnPrefModel.setPurchaseToken(activePurchaseModel.getPurchaseToken()); mBraveVpnPrefModel.setProductId(activePurchaseModel.getProductId()); BraveVpnNativeWorker.getInstance() @@ -117,7 +116,6 @@ public abstract class BraveVpnParentActivity BraveVpnUtils.SUBSCRIPTION_PARAM_TEXT, getPackageName()); } else { - Log.e("brave_vpn", "verifySubscription : 3"); if (!mIsVerification) { BraveVpnApiResponseUtils.queryPurchaseFailed( BraveVpnParentActivity.this); @@ -133,9 +131,7 @@ public abstract class BraveVpnParentActivity @Override public void onVerifyPurchaseToken( String jsonResponse, String purchaseToken, String productId, boolean isSuccess) { - Log.e("brave_vpn", "onVerifyPurchaseToken : 1"); if (isSuccess && mBraveVpnPrefModel != null) { - Log.e("brave_vpn", "onVerifyPurchaseToken : 2"); Long purchaseExpiry = BraveVpnUtils.getPurchaseExpiryDate(jsonResponse); int paymentState = BraveVpnUtils.getPaymentState(jsonResponse); if (purchaseExpiry > 0 && purchaseExpiry >= System.currentTimeMillis()) { @@ -145,7 +141,6 @@ public abstract class BraveVpnParentActivity BraveVpnPrefUtils.setSubscriptionPurchase(true); BraveVpnPrefUtils.setPaymentState(paymentState); if (!mIsVerification || BraveVpnPrefUtils.isResetConfiguration()) { - Log.e("brave_vpn", "onVerifyPurchaseToken : 3"); BraveVpnNativeWorker.getInstance() .getSubscriberCredential( BraveVpnUtils.SUBSCRIPTION_PARAM_TEXT, @@ -154,14 +149,12 @@ public abstract class BraveVpnParentActivity mBraveVpnPrefModel.getPurchaseToken(), getPackageName()); } else { - Log.e("brave_vpn", "onVerifyPurchaseToken : 4"); mIsVerification = false; showRestoreMenu(true); BraveVpnUtils.showToast(getResources().getString(R.string.already_subscribed)); BraveVpnUtils.dismissProgressDialog(); } } else { - Log.e("brave_vpn", "onVerifyPurchaseToken : 5"); BraveVpnApiResponseUtils.queryPurchaseFailed(BraveVpnParentActivity.this); mIsServerLocationChanged = false; if (mIsVerification) { @@ -192,6 +185,7 @@ public abstract class BraveVpnParentActivity @Override public void onGetHostnamesForRegion(String jsonHostNames, boolean isSuccess) { + Log.e("brave_vpn", "jsonHostNames : " + jsonHostNames); KeyPair keyPair = new KeyPair(); mBraveVpnPrefModel.setClientPrivateKey(keyPair.getPrivateKey().toBase64()); mBraveVpnPrefModel.setClientPublicKey(keyPair.getPublicKey().toBase64()); @@ -238,7 +232,6 @@ public abstract class BraveVpnParentActivity public void changeServerRegion() { mIsServerLocationChanged = true; - // BraveVpnUtils.selectedServerRegion = braveVpnServerRegion; BraveVpnUtils.showProgressDialog( BraveVpnParentActivity.this, getResources().getString(R.string.vpn_connect_text)); if (BraveVpnNativeWorker.getInstance().isPurchasedUser()) { @@ -282,7 +275,7 @@ public abstract class BraveVpnParentActivity return; } BraveVpnProfileUtils.getInstance().startVpn(BraveVpnParentActivity.this); - finish(); + TabUtils.bringChromeTabbedActivityToTheTop(BraveVpnParentActivity.this); } catch (Exception e) { BraveVpnUtils.dismissProgressDialog(); Log.e(TAG, e.getMessage()); diff --git a/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerActivity.java b/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerActivity.java index 3c684321b21..93a50ee346d 100644 --- a/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerActivity.java +++ b/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerActivity.java @@ -20,6 +20,7 @@ import androidx.recyclerview.widget.RecyclerView; import org.chromium.brave_vpn.mojom.Region; import org.chromium.chrome.R; import org.chromium.chrome.browser.vpn.adapters.VpnServerAdapter; +import org.chromium.chrome.browser.vpn.models.BraveVpnServerRegion; import org.chromium.chrome.browser.vpn.utils.BraveVpnPrefUtils; import org.chromium.chrome.browser.vpn.utils.BraveVpnUtils; import org.chromium.ui.widget.Toast; @@ -109,6 +110,12 @@ public class VpnServerActivity extends BraveVpnParentActivity { Toast.LENGTH_SHORT) .show(); } else { + BraveVpnUtils.selectedServerRegion = + new BraveVpnServerRegion( + region.countryIsoCode, + region.name, + region.namePretty, + city.namePretty); changeServerRegion(); } } diff --git a/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerSelectionActivity.java b/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerSelectionActivity.java index cc907d7225a..931398178b4 100644 --- a/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerSelectionActivity.java +++ b/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerSelectionActivity.java @@ -96,6 +96,7 @@ public class VpnServerSelectionActivity extends BraveVpnParentActivity new View.OnClickListener() { @Override public void onClick(View v) { + BraveVpnUtils.selectedServerRegion = null; changeServerRegion(); } }); diff --git a/android/java/org/chromium/chrome/browser/vpn/adapters/VpnServerAdapter.java b/android/java/org/chromium/chrome/browser/vpn/adapters/VpnServerAdapter.java index e1322a3385f..c1eeebc69b1 100644 --- a/android/java/org/chromium/chrome/browser/vpn/adapters/VpnServerAdapter.java +++ b/android/java/org/chromium/chrome/browser/vpn/adapters/VpnServerAdapter.java @@ -53,8 +53,9 @@ public class VpnServerAdapter extends RecyclerView.Adapter getHostnameForRegion(String jsonHostnames) { + Log.e("brave_vpn", "jsonHostnames : " + jsonHostnames); jsonHostnames = "{\"hostnames\":" + jsonHostnames + "}"; try { JSONObject result = new JSONObject(jsonHostnames); @@ -255,8 +258,10 @@ public class BraveVpnUtils { JSONObject server = servers.getJSONObject(i); BraveVpnServerRegion vpnServerRegion = new BraveVpnServerRegion( - server.getString("continent"), server.getString("country-iso-code"), - server.getString("name"), server.getString("name-pretty")); + server.getString("country-iso-code"), + server.getString("name"), + server.getString("name-pretty"), + BraveVpnPrefUtils.PREF_BRAVE_VPN_AUTOMATIC); vpnServerRegions.add(vpnServerRegion); } } catch (JSONException e) { diff --git a/browser/brave_vpn/android/brave_vpn_native_worker.cc b/browser/brave_vpn/android/brave_vpn_native_worker.cc index 570d98c8fed..7ab13296c51 100644 --- a/browser/brave_vpn/android/brave_vpn_native_worker.cc +++ b/browser/brave_vpn/android/brave_vpn_native_worker.cc @@ -214,18 +214,8 @@ void BraveVpnNativeWorker::VerifyPurchaseToken( const base::android::JavaParamRef& product_id, const base::android::JavaParamRef& product_type, const base::android::JavaParamRef& bundle_id) { - LOG(ERROR) << "brave_vpn" << "verifyPurchaseToken"; BraveVpnService* brave_vpn_service = GetBraveVpnService(); if (brave_vpn_service) { - LOG(ERROR) << "brave_vpn" << "verifyPurchaseToken 2"; - LOG(ERROR) << "brave_vpn" - << "verifyPurchaseToken 2 : purchase_token : " << purchase_token; - LOG(ERROR) << "brave_vpn" - << "verifyPurchaseToken 2 : product_id : " << product_id; - LOG(ERROR) << "brave_vpn" - << "verifyPurchaseToken 2 : product_type : " << product_type; - LOG(ERROR) << "brave_vpn" - << "verifyPurchaseToken 2 : bundle_id : " << bundle_id; brave_vpn_service->VerifyPurchaseToken( base::BindOnce( &BraveVpnNativeWorker::OnVerifyPurchaseToken, @@ -244,9 +234,6 @@ void BraveVpnNativeWorker::OnVerifyPurchaseToken( const std::string& product_id, const std::string& json_response, bool success) { - LOG(ERROR) << "brave_vpn" - << "OnVerifyPurchaseToken 2 : json_response" + json_response; - LOG(ERROR) << "brave_vpn" << "OnVerifyPurchaseToken 2"; JNIEnv* env = base::android::AttachCurrentThread(); Java_BraveVpnNativeWorker_onVerifyPurchaseToken( env, weak_java_brave_vpn_native_worker_.get(env), From fa244b61d87271c8b4cf3eae4278a995cf0edcc9 Mon Sep 17 00:00:00 2001 From: deeppandya Date: Tue, 20 Aug 2024 02:02:29 +0530 Subject: [PATCH 16/31] Add brave_vpn_region_data_helper to avoid internal rules --- .../brave_vpn/browser/brave_vpn_service.cc | 1 + .../browser/brave_vpn_service_helper.cc | 127 --------------- .../browser/brave_vpn_service_helper.h | 12 -- .../brave_vpn/browser/connection/BUILD.gn | 2 + .../brave_vpn_region_data_helper.cc | 154 ++++++++++++++++++ .../connection/brave_vpn_region_data_helper.h | 31 ++++ .../brave_vpn_region_data_manager.cc | 2 +- .../brave_vpn/resources/panel/state/async.ts | 5 +- 8 files changed, 192 insertions(+), 142 deletions(-) create mode 100644 components/brave_vpn/browser/connection/brave_vpn_region_data_helper.cc create mode 100644 components/brave_vpn/browser/connection/brave_vpn_region_data_helper.h diff --git a/components/brave_vpn/browser/brave_vpn_service.cc b/components/brave_vpn/browser/brave_vpn_service.cc index 9d726ee8a95..335f429a48e 100644 --- a/components/brave_vpn/browser/brave_vpn_service.cc +++ b/components/brave_vpn/browser/brave_vpn_service.cc @@ -19,6 +19,7 @@ #include "base/time/time.h" #include "brave/components/brave_vpn/browser/api/brave_vpn_api_helper.h" #include "brave/components/brave_vpn/browser/brave_vpn_service_helper.h" +#include "brave/components/brave_vpn/browser/connection/brave_vpn_region_data_helper.h" #include "brave/components/brave_vpn/browser/connection/brave_vpn_region_data_manager.h" #include "brave/components/brave_vpn/common/brave_vpn_constants.h" #include "brave/components/brave_vpn/common/brave_vpn_utils.h" diff --git a/components/brave_vpn/browser/brave_vpn_service_helper.cc b/components/brave_vpn/browser/brave_vpn_service_helper.cc index fb3bda2c87c..da07d0990fd 100644 --- a/components/brave_vpn/browser/brave_vpn_service_helper.cc +++ b/components/brave_vpn/browser/brave_vpn_service_helper.cc @@ -24,133 +24,6 @@ #include "components/prefs/scoped_user_pref_update.h" namespace brave_vpn { - -mojom::RegionPtr GetRegionPtrWithNameFromRegionList( - const std::string& name, - const std::vector& region_list) { - auto it = base::ranges::find(region_list, name, &mojom::Region::name); - if (it != region_list.end()) - return it->Clone(); - return mojom::RegionPtr(); -} - -base::Value::Dict GetValueFromRegionWithoutCity( - const mojom::RegionPtr& region) { - base::Value::Dict region_dict; - region_dict.Set(kRegionNameKey, region->name); - region_dict.Set(kRegionNamePrettyKey, region->name_pretty); - region_dict.Set(kRegionContinentKey, region->continent); - region_dict.Set(kRegionCountryIsoCodeKey, region->country_iso_code); - region_dict.Set(kRegionPrecisionKey, region->region_precision); - region_dict.Set(kRegionLatitudeKey, region->latitude); - region_dict.Set(kRegionLongitudeKey, region->longitude); - region_dict.Set(kRegionServerCountKey, region->server_count); - return region_dict; -} - -base::Value::Dict GetValueFromRegion(const mojom::RegionPtr& region) { - base::Value::Dict region_dict = GetValueFromRegionWithoutCity(region); - if (!region->cities.empty()) { - base::Value::List cities; - for (const auto& city : region->cities) { - cities.Append(GetValueFromRegionWithoutCity(city)); - } - region_dict.Set(kRegionCitiesKey, std::move(cities)); - } - return region_dict; -} - -bool IsValidRegionValue(const base::Value::Dict& value) { - if (!value.FindString(kRegionNameKey) || - !value.FindString(kRegionNamePrettyKey) || - !value.FindString(kRegionContinentKey) || - !value.FindString(kRegionCountryIsoCodeKey) || - !value.FindString(kRegionPrecisionKey) || - !value.FindList(kRegionCitiesKey) || - !value.FindString(kRegionLatitudeKey) || - !value.FindString(kRegionLongitudeKey) || - !value.FindString(kRegionServerCountKey)) { - return false; - } - - return true; -} - -mojom::RegionPtr GetRegionFromValueWithoutCity(const base::Value::Dict& value) { - mojom::RegionPtr region = mojom::Region::New(); - if (auto* name = value.FindString(brave_vpn::kRegionNameKey)) { - region->name = *name; - } - if (auto* name_pretty = value.FindString(brave_vpn::kRegionNamePrettyKey)) { - region->name_pretty = *name_pretty; - } - if (auto* continent = value.FindString(brave_vpn::kRegionContinentKey)) { - region->continent = *continent; - } - if (auto* country_iso_code = - value.FindString(brave_vpn::kRegionCountryIsoCodeKey)) { - region->country_iso_code = *country_iso_code; - } - if (auto* region_precision = - value.FindString(brave_vpn::kRegionPrecisionKey)) { - region->region_precision = *region_precision; - } - if (auto latitude = value.FindDouble(brave_vpn::kRegionLatitudeKey)) { - region->latitude = *latitude; - } - if (auto longitude = value.FindDouble(brave_vpn::kRegionLongitudeKey)) { - region->longitude = *longitude; - } - if (auto server_count = value.FindInt(brave_vpn::kRegionServerCountKey)) { - region->server_count = *server_count; - } - - return region; -} - -mojom::RegionPtr GetRegionFromValue(const base::Value::Dict& value) { - mojom::RegionPtr region = GetRegionFromValueWithoutCity(value); - if (value.FindList(kRegionCitiesKey)) { - const auto* cities = value.FindList(kRegionCitiesKey); - for (const auto& city : *cities) { - region->cities.push_back(GetRegionFromValueWithoutCity(city.GetDict())); - } - } - - return region; -} - -bool ValidateCachedRegionData(const base::Value::List& region_value) { - for (const auto& value : region_value) { - // Make sure cached one has all latest properties. - if (!value.is_dict() || !IsValidRegionValue(value.GetDict())) { - return false; - } - } - - return true; -} - -std::vector ParseRegionList( - const base::Value::List& region_list) { - std::vector regions; - for (const auto& value : region_list) { - DCHECK(value.is_dict()); - if (!value.is_dict()) { - continue; - } - - regions.push_back(GetRegionFromValue(value.GetDict()).Clone()); - } - - // Sort region list alphabetically - std::sort(regions.begin(), regions.end(), - [](mojom::RegionPtr& a, mojom::RegionPtr& b) { - return (a->name_pretty < b->name_pretty); - }); - return regions; -} - bool IsValidCredentialSummary(const base::Value& summary) { DCHECK(summary.is_dict()); const bool active = summary.GetDict().FindBool("active").value_or(false); diff --git a/components/brave_vpn/browser/brave_vpn_service_helper.h b/components/brave_vpn/browser/brave_vpn_service_helper.h index b2caea556b9..d2a017eb541 100644 --- a/components/brave_vpn/browser/brave_vpn_service_helper.h +++ b/components/brave_vpn/browser/brave_vpn_service_helper.h @@ -22,18 +22,6 @@ class Value; } // namespace base namespace brave_vpn { -mojom::RegionPtr GetRegionPtrWithNameFromRegionList( - const std::string& name, - const std::vector& region_list); -base::Value::Dict GetValueFromRegionWithoutCity(const mojom::RegionPtr& region); -base::Value::Dict GetValueFromRegion(const mojom::RegionPtr& region); -bool IsValidRegionValue(const base::Value::Dict& value); -mojom::RegionPtr GetRegionFromValueWithoutCity(const base::Value::Dict& value); -mojom::RegionPtr GetRegionFromValue(const base::Value::Dict& value); -bool ValidateCachedRegionData(const base::Value::List& region_value); -std::vector ParseRegionList( - const base::Value::List& region_list); - // False if subscription is expired. bool IsValidCredentialSummary(const base::Value& summary); bool IsValidCredentialSummaryButNeedActivation(const base::Value& summary); diff --git a/components/brave_vpn/browser/connection/BUILD.gn b/components/brave_vpn/browser/connection/BUILD.gn index 8f2c9cd7dda..c222a12d131 100644 --- a/components/brave_vpn/browser/connection/BUILD.gn +++ b/components/brave_vpn/browser/connection/BUILD.gn @@ -48,6 +48,8 @@ source_set("common") { sources = [ "brave_vpn_connection_info.cc", "brave_vpn_connection_info.h", + "brave_vpn_region_data_helper.cc", + "brave_vpn_region_data_helper.h", "brave_vpn_region_data_manager.cc", "brave_vpn_region_data_manager.h", ] diff --git a/components/brave_vpn/browser/connection/brave_vpn_region_data_helper.cc b/components/brave_vpn/browser/connection/brave_vpn_region_data_helper.cc new file mode 100644 index 00000000000..c10b990c194 --- /dev/null +++ b/components/brave_vpn/browser/connection/brave_vpn_region_data_helper.cc @@ -0,0 +1,154 @@ +/* Copyright (c) 2024 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at https://mozilla.org/MPL/2.0/. */ + +#include "brave/components/brave_vpn/browser/connection/brave_vpn_region_data_helper.h" + +#include +#include +#include + +#include "base/base64.h" +#include "base/json/values_util.h" +#include "base/notreached.h" +#include "base/ranges/algorithm.h" +#include "base/strings/string_util.h" +#include "base/time/time.h" +#include "base/values.h" +#include "brave/components/brave_vpn/common/brave_vpn_constants.h" +#include "brave/components/brave_vpn/common/brave_vpn_data_types.h" +#include "brave/components/brave_vpn/common/pref_names.h" +#include "brave/components/skus/browser/skus_utils.h" +#include "components/prefs/pref_service.h" +#include "third_party/icu/source/i18n/unicode/timezone.h" + +namespace brave_vpn { +mojom::RegionPtr GetRegionPtrWithNameFromRegionList( + const std::string& name, + const std::vector& region_list) { + auto it = base::ranges::find(region_list, name, &mojom::Region::name); + if (it != region_list.end()) { + return it->Clone(); + } + return mojom::RegionPtr(); +} + +base::Value::Dict GetValueFromRegionWithoutCity( + const mojom::RegionPtr& region) { + base::Value::Dict region_dict; + region_dict.Set(kRegionNameKey, region->name); + region_dict.Set(kRegionNamePrettyKey, region->name_pretty); + region_dict.Set(kRegionContinentKey, region->continent); + region_dict.Set(kRegionCountryIsoCodeKey, region->country_iso_code); + region_dict.Set(kRegionPrecisionKey, region->region_precision); + region_dict.Set(kRegionLatitudeKey, region->latitude); + region_dict.Set(kRegionLongitudeKey, region->longitude); + region_dict.Set(kRegionServerCountKey, region->server_count); + return region_dict; +} + +base::Value::Dict GetValueFromRegion(const mojom::RegionPtr& region) { + base::Value::Dict region_dict = GetValueFromRegionWithoutCity(region); + if (!region->cities.empty()) { + base::Value::List cities; + for (const auto& city : region->cities) { + cities.Append(GetValueFromRegionWithoutCity(city)); + } + region_dict.Set(kRegionCitiesKey, std::move(cities)); + } + return region_dict; +} + +bool IsValidRegionValue(const base::Value::Dict& value) { + if (!value.FindString(kRegionNameKey) || + !value.FindString(kRegionNamePrettyKey) || + !value.FindString(kRegionContinentKey) || + !value.FindString(kRegionCountryIsoCodeKey) || + !value.FindString(kRegionPrecisionKey) || + !value.FindList(kRegionCitiesKey) || + !value.FindString(kRegionLatitudeKey) || + !value.FindString(kRegionLongitudeKey) || + !value.FindString(kRegionServerCountKey)) { + return false; + } + + return true; +} + +mojom::RegionPtr GetRegionFromValueWithoutCity(const base::Value::Dict& value) { + mojom::RegionPtr region = mojom::Region::New(); + if (auto* name = value.FindString(brave_vpn::kRegionNameKey)) { + region->name = *name; + } + if (auto* name_pretty = value.FindString(brave_vpn::kRegionNamePrettyKey)) { + region->name_pretty = *name_pretty; + } + if (auto* continent = value.FindString(brave_vpn::kRegionContinentKey)) { + region->continent = *continent; + } + if (auto* country_iso_code = + value.FindString(brave_vpn::kRegionCountryIsoCodeKey)) { + region->country_iso_code = *country_iso_code; + } + if (auto* region_precision = + value.FindString(brave_vpn::kRegionPrecisionKey)) { + region->region_precision = *region_precision; + } + if (auto latitude = value.FindDouble(brave_vpn::kRegionLatitudeKey)) { + region->latitude = *latitude; + } + if (auto longitude = value.FindDouble(brave_vpn::kRegionLongitudeKey)) { + region->longitude = *longitude; + } + if (auto server_count = value.FindInt(brave_vpn::kRegionServerCountKey)) { + region->server_count = *server_count; + } + + return region; +} + +mojom::RegionPtr GetRegionFromValue(const base::Value::Dict& value) { + mojom::RegionPtr region = GetRegionFromValueWithoutCity(value); + if (value.FindList(kRegionCitiesKey)) { + const auto* cities = value.FindList(kRegionCitiesKey); + for (const auto& city : *cities) { + region->cities.push_back(GetRegionFromValueWithoutCity(city.GetDict())); + } + } + + return region; +} + +bool ValidateCachedRegionData(const base::Value::List& region_value) { + for (const auto& value : region_value) { + // Make sure cached one has all latest properties. + if (!value.is_dict() || !IsValidRegionValue(value.GetDict())) { + return false; + } + } + + return true; +} + +std::vector ParseRegionList( + const base::Value::List& region_list) { + std::vector regions; + for (const auto& value : region_list) { + DCHECK(value.is_dict()); + if (!value.is_dict()) { + continue; + } + + regions.push_back(GetRegionFromValue(value.GetDict()).Clone()); + } + + // Sort region list alphabetically + std::sort(regions.begin(), regions.end(), + [](mojom::RegionPtr& a, mojom::RegionPtr& b) { + return (a->name_pretty < b->name_pretty); + }); + return regions; +} + +} // namespace brave_vpn diff --git a/components/brave_vpn/browser/connection/brave_vpn_region_data_helper.h b/components/brave_vpn/browser/connection/brave_vpn_region_data_helper.h new file mode 100644 index 00000000000..5c98da08386 --- /dev/null +++ b/components/brave_vpn/browser/connection/brave_vpn_region_data_helper.h @@ -0,0 +1,31 @@ +/* Copyright (c) 2024 The Brave Authors. All rights reserved. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at https://mozilla.org/MPL/2.0/. */ + +#ifndef BRAVE_COMPONENTS_BRAVE_VPN_BROWSER_CONNECTION_BRAVE_VPN_REGION_DATA_HELPER_H_ +#define BRAVE_COMPONENTS_BRAVE_VPN_BROWSER_CONNECTION_BRAVE_VPN_REGION_DATA_HELPER_H_ + +#include +#include +#include + +#include "base/values.h" +#include "brave/components/brave_vpn/common/mojom/brave_vpn.mojom.h" + +namespace brave_vpn { +mojom::RegionPtr GetRegionPtrWithNameFromRegionList( + const std::string& name, + const std::vector& region_list); +base::Value::Dict GetValueFromRegionWithoutCity(const mojom::RegionPtr& region); +base::Value::Dict GetValueFromRegion(const mojom::RegionPtr& region); +bool IsValidRegionValue(const base::Value::Dict& value); +mojom::RegionPtr GetRegionFromValueWithoutCity(const base::Value::Dict& value); +mojom::RegionPtr GetRegionFromValue(const base::Value::Dict& value); +bool ValidateCachedRegionData(const base::Value::List& region_value); +std::vector ParseRegionList( + const base::Value::List& region_list); + +} // namespace brave_vpn + +#endif // BRAVE_COMPONENTS_BRAVE_VPN_BROWSER_CONNECTION_BRAVE_VPN_REGION_DATA_HELPER_H_ diff --git a/components/brave_vpn/browser/connection/brave_vpn_region_data_manager.cc b/components/brave_vpn/browser/connection/brave_vpn_region_data_manager.cc index 1cfe3b2d21b..f06b37d8ecb 100644 --- a/components/brave_vpn/browser/connection/brave_vpn_region_data_manager.cc +++ b/components/brave_vpn/browser/connection/brave_vpn_region_data_manager.cc @@ -14,7 +14,7 @@ #include "base/functional/callback_forward.h" #include "base/json/json_reader.h" #include "brave/components/brave_vpn/browser/api/brave_vpn_api_helper.h" -#include "brave/components/brave_vpn/browser/brave_vpn_service_helper.h" +#include "brave/components/brave_vpn/browser/connection/brave_vpn_region_data_helper.h" #include "brave/components/brave_vpn/common/brave_vpn_constants.h" #include "brave/components/brave_vpn/common/pref_names.h" #include "components/prefs/pref_service.h" diff --git a/components/brave_vpn/resources/panel/state/async.ts b/components/brave_vpn/resources/panel/state/async.ts index 7b6b03e0393..57817235e4e 100644 --- a/components/brave_vpn/resources/panel/state/async.ts +++ b/components/brave_vpn/resources/panel/state/async.ts @@ -8,6 +8,7 @@ import AsyncActionHandler from '../../../../common/AsyncActionHandler' import getPanelBrowserAPI, { ConnectionState, PurchasedState } from '../api/panel_browser_api' import * as Actions from './actions' import { RootState } from './store' +import * as mojom from '../../shared/lib/mojom' const handler = new AsyncActionHandler() type Store = MiddlewareAPI, any> @@ -50,7 +51,7 @@ handler.on(Actions.purchaseConfirmed.getType(), async (store) => { const [{ state }, { currentRegion }, { regions }] = await Promise.all([ getPanelBrowserAPI().serviceHandler.getConnectionState(), getPanelBrowserAPI().serviceHandler.getSelectedRegion(), - getPanelBrowserAPI().serviceHandler.getAllRegions() + getPanelBrowserAPI().serviceHandler.getAllRegions(mojom.kRegionPrecisionCityByCountry) ]) store.dispatch(Actions.showMainView({ @@ -65,7 +66,7 @@ handler.on(Actions.purchaseConfirmed.getType(), async (store) => { handler.on(Actions.purchaseExpired.getType(), async (store) => { const [{ currentRegion }, { regions }] = await Promise.all([ getPanelBrowserAPI().serviceHandler.getSelectedRegion(), - getPanelBrowserAPI().serviceHandler.getAllRegions() + getPanelBrowserAPI().serviceHandler.getAllRegions(mojom.kRegionPrecisionCityByCountry) ]) store.dispatch(Actions.showMainView({ From 068ca7cfc48b2658427f3914dc13138684332830 Mon Sep 17 00:00:00 2001 From: deeppandya Date: Tue, 20 Aug 2024 02:52:56 +0530 Subject: [PATCH 17/31] Remove GetAllServerRegions unittest as it's not requited Add region-precision for panel --- .../browser/brave_vpn_service_unittest.cc | 15 --------------- .../brave_vpn/resources/panel/state/async.ts | 5 ++--- 2 files changed, 2 insertions(+), 18 deletions(-) diff --git a/components/brave_vpn/browser/brave_vpn_service_unittest.cc b/components/brave_vpn/browser/brave_vpn_service_unittest.cc index 5cdfa38360f..8bbaddb2b6a 100644 --- a/components/brave_vpn/browser/brave_vpn_service_unittest.cc +++ b/components/brave_vpn/browser/brave_vpn_service_unittest.cc @@ -548,21 +548,6 @@ class BraveVPNServiceTest : public testing::Test { base::HistogramTester histogram_tester_; }; -TEST_F(BraveVPNServiceTest, ResponseSanitizingTest) { - // Give invalid json data as a server response and check sanitized(empty - // string) result is returned. - SetInterceptorResponse("{'invalid json':"); - base::RunLoop loop; - service_->GetAllServerRegions(base::BindOnce( - [](base::OnceClosure callback, const std::string& region_list, - bool success) { - EXPECT_TRUE(region_list.empty()); - std::move(callback).Run(); - }, - loop.QuitClosure())); - loop.Run(); -} - #if !BUILDFLAG(IS_ANDROID) TEST_F(BraveVPNServiceTest, SkusCredentialCacheTest) { std::string env = skus::GetDefaultEnvironment(); diff --git a/components/brave_vpn/resources/panel/state/async.ts b/components/brave_vpn/resources/panel/state/async.ts index 57817235e4e..cc7e9a521b5 100644 --- a/components/brave_vpn/resources/panel/state/async.ts +++ b/components/brave_vpn/resources/panel/state/async.ts @@ -8,7 +8,6 @@ import AsyncActionHandler from '../../../../common/AsyncActionHandler' import getPanelBrowserAPI, { ConnectionState, PurchasedState } from '../api/panel_browser_api' import * as Actions from './actions' import { RootState } from './store' -import * as mojom from '../../shared/lib/mojom' const handler = new AsyncActionHandler() type Store = MiddlewareAPI, any> @@ -51,7 +50,7 @@ handler.on(Actions.purchaseConfirmed.getType(), async (store) => { const [{ state }, { currentRegion }, { regions }] = await Promise.all([ getPanelBrowserAPI().serviceHandler.getConnectionState(), getPanelBrowserAPI().serviceHandler.getSelectedRegion(), - getPanelBrowserAPI().serviceHandler.getAllRegions(mojom.kRegionPrecisionCityByCountry) + getPanelBrowserAPI().serviceHandler.getAllRegions("city-by-country") ]) store.dispatch(Actions.showMainView({ @@ -66,7 +65,7 @@ handler.on(Actions.purchaseConfirmed.getType(), async (store) => { handler.on(Actions.purchaseExpired.getType(), async (store) => { const [{ currentRegion }, { regions }] = await Promise.all([ getPanelBrowserAPI().serviceHandler.getSelectedRegion(), - getPanelBrowserAPI().serviceHandler.getAllRegions(mojom.kRegionPrecisionCityByCountry) + getPanelBrowserAPI().serviceHandler.getAllRegions("city-by-country") ]) store.dispatch(Actions.showMainView({ From 59a9881828e1d507bb336888eb9659edd0871615 Mon Sep 17 00:00:00 2001 From: deeppandya Date: Wed, 21 Aug 2024 01:09:52 +0530 Subject: [PATCH 18/31] Add new api for host with region precision Update existing changes to include host related changes --- .../browser/vpn/BraveVpnNativeWorker.java | 8 +++--- .../activities/BraveVpnParentActivity.java | 1 - .../vpn/activities/VpnPaywallActivity.java | 6 +++++ .../vpn/activities/VpnServerActivity.java | 14 +++++++--- .../VpnServerSelectionActivity.java | 12 +++++++-- .../BraveVpnServerSelectionAdapter.java | 2 +- .../vpn/adapters/VpnServerAdapter.java | 15 +++++++---- .../vpn/models/BraveVpnServerRegion.java | 23 +++++++++++++++- .../vpn/utils/BraveVpnApiResponseUtils.java | 22 +++++++++++----- .../browser/vpn/utils/BraveVpnPrefUtils.java | 26 ++++++++++++++++++- .../browser/vpn/utils/BraveVpnUtils.java | 9 +++++-- .../android/brave_vpn_native_worker.cc | 6 +++-- .../android/brave_vpn_native_worker.h | 3 ++- .../browser/api/brave_vpn_api_request.cc | 22 ++++++++++++++++ .../browser/api/brave_vpn_api_request.h | 3 +++ .../brave_vpn/browser/brave_vpn_service.cc | 8 ++++++ .../brave_vpn/browser/brave_vpn_service.h | 3 +++ .../system_vpn_connection_api_unittest.cc | 1 + .../brave_vpn/common/brave_vpn_constants.h | 2 ++ 19 files changed, 156 insertions(+), 30 deletions(-) diff --git a/android/java/org/chromium/chrome/browser/vpn/BraveVpnNativeWorker.java b/android/java/org/chromium/chrome/browser/vpn/BraveVpnNativeWorker.java index 5452b518d90..fc075cbf79d 100644 --- a/android/java/org/chromium/chrome/browser/vpn/BraveVpnNativeWorker.java +++ b/android/java/org/chromium/chrome/browser/vpn/BraveVpnNativeWorker.java @@ -127,8 +127,9 @@ public class BraveVpnNativeWorker { BraveVpnNativeWorkerJni.get().getTimezonesForRegions(mNativeBraveVpnNativeWorker); } - public void getHostnamesForRegion(String region) { - BraveVpnNativeWorkerJni.get().getHostnamesForRegion(mNativeBraveVpnNativeWorker, region); + public void getHostnamesForRegion(String region, String regionPrecision) { + BraveVpnNativeWorkerJni.get() + .getHostnamesForRegion(mNativeBraveVpnNativeWorker, region, regionPrecision); } public void getWireguardProfileCredentials( @@ -191,7 +192,8 @@ public class BraveVpnNativeWorker { void getTimezonesForRegions(long nativeBraveVpnNativeWorker); - void getHostnamesForRegion(long nativeBraveVpnNativeWorker, String region); + void getHostnamesForRegion( + long nativeBraveVpnNativeWorker, String region, String regionPrecision); void getWireguardProfileCredentials( long nativeBraveVpnNativeWorker, diff --git a/android/java/org/chromium/chrome/browser/vpn/activities/BraveVpnParentActivity.java b/android/java/org/chromium/chrome/browser/vpn/activities/BraveVpnParentActivity.java index d614ec1415c..5587a8d9d7f 100644 --- a/android/java/org/chromium/chrome/browser/vpn/activities/BraveVpnParentActivity.java +++ b/android/java/org/chromium/chrome/browser/vpn/activities/BraveVpnParentActivity.java @@ -185,7 +185,6 @@ public abstract class BraveVpnParentActivity @Override public void onGetHostnamesForRegion(String jsonHostNames, boolean isSuccess) { - Log.e("brave_vpn", "jsonHostNames : " + jsonHostNames); KeyPair keyPair = new KeyPair(); mBraveVpnPrefModel.setClientPrivateKey(keyPair.getPrivateKey().toBase64()); mBraveVpnPrefModel.setClientPublicKey(keyPair.getPublicKey().toBase64()); diff --git a/android/java/org/chromium/chrome/browser/vpn/activities/VpnPaywallActivity.java b/android/java/org/chromium/chrome/browser/vpn/activities/VpnPaywallActivity.java index ede81a54255..f05d26f7726 100644 --- a/android/java/org/chromium/chrome/browser/vpn/activities/VpnPaywallActivity.java +++ b/android/java/org/chromium/chrome/browser/vpn/activities/VpnPaywallActivity.java @@ -60,6 +60,12 @@ public class VpnPaywallActivity extends BraveVpnParentActivity { private SelectedPlanType mSelectedPlanType = SelectedPlanType.YEARLY; private ProductDetails mProductDetails; + @Override + public void onResumeWithNative() { + super.onResumeWithNative(); + BraveVpnUtils.dismissProgressDialog(); + } + private void initializeViews() { setContentView(R.layout.activity_vpn_paywall); diff --git a/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerActivity.java b/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerActivity.java index 93a50ee346d..24475c4fc40 100644 --- a/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerActivity.java +++ b/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerActivity.java @@ -17,6 +17,7 @@ import androidx.recyclerview.widget.DividerItemDecoration; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; +import org.chromium.brave_vpn.mojom.BraveVpnConstants; import org.chromium.brave_vpn.mojom.Region; import org.chromium.chrome.R; import org.chromium.chrome.browser.vpn.adapters.VpnServerAdapter; @@ -37,7 +38,7 @@ public class VpnServerActivity extends BraveVpnParentActivity { private RecyclerView mServerRegionList; public interface OnCitySelection { - void onCityClick(Region city); + void onCityClick(Region city, int position); } private void initializeViews() { @@ -99,11 +100,12 @@ public class VpnServerActivity extends BraveVpnParentActivity { mVpnServerAdapter = new VpnServerAdapter(VpnServerActivity.this); mVpnServerAdapter.setCities(cities); + mVpnServerAdapter.setRegion(region); mVpnServerAdapter.setOnCitySelection( new OnCitySelection() { @Override - public void onCityClick(Region city) { - if (BraveVpnPrefUtils.getServerRegion().equals(city.name)) { + public void onCityClick(Region city, int position) { + if (BraveVpnPrefUtils.getRegionName().equals(city.name)) { Toast.makeText( VpnServerActivity.this, R.string.already_selected_the_server, @@ -115,7 +117,11 @@ public class VpnServerActivity extends BraveVpnParentActivity { region.countryIsoCode, region.name, region.namePretty, - city.namePretty); + city.name, + city.namePretty, + position == 0 + ? BraveVpnConstants.REGION_PRECISION_COUNTRY + : BraveVpnConstants.REGION_PRECISION_CITY); changeServerRegion(); } } diff --git a/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerSelectionActivity.java b/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerSelectionActivity.java index 931398178b4..2af8e124ec0 100644 --- a/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerSelectionActivity.java +++ b/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerSelectionActivity.java @@ -25,6 +25,7 @@ import org.chromium.brave_vpn.mojom.ServiceHandler; import org.chromium.chrome.R; import org.chromium.chrome.browser.vpn.BraveVpnServiceFactoryAndroid; import org.chromium.chrome.browser.vpn.adapters.BraveVpnServerSelectionAdapter; +import org.chromium.chrome.browser.vpn.models.BraveVpnServerRegion; import org.chromium.chrome.browser.vpn.utils.BraveVpnPrefUtils; import org.chromium.chrome.browser.vpn.utils.BraveVpnUtils; import org.chromium.mojo.bindings.ConnectionErrorHandler; @@ -89,14 +90,21 @@ public class VpnServerSelectionActivity extends BraveVpnParentActivity MaterialSwitch automaticSwitch = (MaterialSwitch) findViewById(R.id.automatic_server_switch); boolean isAutomatic = - BraveVpnPrefUtils.getServerRegion() + BraveVpnPrefUtils.getRegionName() .equals(BraveVpnPrefUtils.PREF_BRAVE_VPN_AUTOMATIC); mServerRegionList.setVisibility(isAutomatic ? View.GONE : View.VISIBLE); automaticSwitch.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { - BraveVpnUtils.selectedServerRegion = null; + BraveVpnUtils.selectedServerRegion = + new BraveVpnServerRegion( + "", + BraveVpnPrefUtils.PREF_BRAVE_VPN_AUTOMATIC, + "", + "", + BraveVpnPrefUtils.PREF_BRAVE_VPN_AUTOMATIC, + BraveVpnConstants.REGION_PRECISION_COUNTRY); changeServerRegion(); } }); diff --git a/android/java/org/chromium/chrome/browser/vpn/adapters/BraveVpnServerSelectionAdapter.java b/android/java/org/chromium/chrome/browser/vpn/adapters/BraveVpnServerSelectionAdapter.java index 72b671bbb6b..c5b6f54ab46 100644 --- a/android/java/org/chromium/chrome/browser/vpn/adapters/BraveVpnServerSelectionAdapter.java +++ b/android/java/org/chromium/chrome/browser/vpn/adapters/BraveVpnServerSelectionAdapter.java @@ -63,7 +63,7 @@ public class BraveVpnServerSelectionAdapter R.plurals.server_text, region.serverCount, region.serverCount); holder.cityServerText.setText(cityText.concat(serverText)); holder.serverRadioButton.setChecked( - BraveVpnPrefUtils.getServerRegion().equals(region.name)); + BraveVpnPrefUtils.getRegionName().equals(region.name)); holder.serverSelectionItemLayout.setOnClickListener( new View.OnClickListener() { @Override diff --git a/android/java/org/chromium/chrome/browser/vpn/adapters/VpnServerAdapter.java b/android/java/org/chromium/chrome/browser/vpn/adapters/VpnServerAdapter.java index c1eeebc69b1..c5ca603b08f 100644 --- a/android/java/org/chromium/chrome/browser/vpn/adapters/VpnServerAdapter.java +++ b/android/java/org/chromium/chrome/browser/vpn/adapters/VpnServerAdapter.java @@ -17,7 +17,6 @@ import androidx.recyclerview.widget.RecyclerView; import com.google.android.material.radiobutton.MaterialRadioButton; -import org.chromium.base.Log; import org.chromium.brave_vpn.mojom.Region; import org.chromium.chrome.R; import org.chromium.chrome.browser.vpn.activities.VpnServerActivity.OnCitySelection; @@ -30,6 +29,7 @@ public class VpnServerAdapter extends RecyclerView.Adapter mCities = new ArrayList<>(); private OnCitySelection mOnCitySelection; + private Region mRegion; public VpnServerAdapter(Context context) { this.mContext = context; @@ -53,14 +53,15 @@ public class VpnServerAdapter extends RecyclerView.Adapter cities) { this.mCities = cities; } diff --git a/android/java/org/chromium/chrome/browser/vpn/models/BraveVpnServerRegion.java b/android/java/org/chromium/chrome/browser/vpn/models/BraveVpnServerRegion.java index a927cbb9740..d86f13321cc 100644 --- a/android/java/org/chromium/chrome/browser/vpn/models/BraveVpnServerRegion.java +++ b/android/java/org/chromium/chrome/browser/vpn/models/BraveVpnServerRegion.java @@ -11,17 +11,23 @@ public class BraveVpnServerRegion { private String mCountryIsoCode; private String mRegionName; private String mRegionNamePretty; + private String mRegionCityName; private String mRegionCityNamePretty; + private String mRegionPrecision; public BraveVpnServerRegion( String countryIsoCode, String regionName, String regionNamePretty, - String regionCityNamePretty) { + String regionCityName, + String regionCityNamePretty, + String regionPrecision) { this.mCountryIsoCode = countryIsoCode; this.mRegionName = regionName; this.mRegionNamePretty = regionNamePretty; + this.mRegionCityName = regionCityName; this.mRegionCityNamePretty = regionCityNamePretty; + this.mRegionPrecision = regionPrecision; } public String getCountryIsoCode() { @@ -36,10 +42,18 @@ public class BraveVpnServerRegion { return mRegionNamePretty; } + public String getRegionCityName() { + return mRegionCityName; + } + public String getRegionCityNamePretty() { return mRegionCityNamePretty; } + public String getRegionPrecision() { + return mRegionPrecision; + } + @NonNull @Override public String toString() { @@ -53,9 +67,16 @@ public class BraveVpnServerRegion { + ", mRegionNamePretty='" + mRegionNamePretty + '\'' + + ", mRegionCityName='" + + mRegionCityName + + '\'' + ", mRegionCityNamePretty='" + mRegionCityNamePretty + '\'' + + '\'' + + ", mRegionPrecision='" + + mRegionPrecision + + '\'' + '}'; } } diff --git a/android/java/org/chromium/chrome/browser/vpn/utils/BraveVpnApiResponseUtils.java b/android/java/org/chromium/chrome/browser/vpn/utils/BraveVpnApiResponseUtils.java index 7b5aa35a312..c27f1d6c9c7 100644 --- a/android/java/org/chromium/chrome/browser/vpn/utils/BraveVpnApiResponseUtils.java +++ b/android/java/org/chromium/chrome/browser/vpn/utils/BraveVpnApiResponseUtils.java @@ -15,6 +15,7 @@ import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; import org.chromium.base.Log; +import org.chromium.brave_vpn.mojom.BraveVpnConstants; import org.chromium.chrome.R; import org.chromium.chrome.browser.billing.InAppPurchaseWrapper; import org.chromium.chrome.browser.billing.PurchaseModel; @@ -75,10 +76,6 @@ public class BraveVpnApiResponseUtils { TimeZone.getDefault().getID())); return; } - Log.e( - "brave_vpn", - "BraveVpnUtils.selectedServerRegion : " - + BraveVpnUtils.selectedServerRegion.toString()); if (BraveVpnUtils.selectedServerRegion != null) { if (!BraveVpnUtils.selectedServerRegion .getRegionName() @@ -86,9 +83,9 @@ public class BraveVpnApiResponseUtils { region = BraveVpnUtils.selectedServerRegion.getRegionName(); braveVpnServerRegion = BraveVpnUtils.selectedServerRegion; } - BraveVpnUtils.selectedServerRegion = null; + // BraveVpnUtils.selectedServerRegion = null; } else { - String serverRegion = BraveVpnPrefUtils.getServerRegion(); + String serverRegion = BraveVpnPrefUtils.getRegionName(); region = serverRegion.equals(BraveVpnPrefUtils.PREF_BRAVE_VPN_AUTOMATIC) ? region @@ -96,7 +93,18 @@ public class BraveVpnApiResponseUtils { } Log.e("brave_vpn", "handleOnGetTimezonesForRegions : region :" + region); - BraveVpnNativeWorker.getInstance().getHostnamesForRegion(region); + Log.e( + "brave_vpn", + "handleOnGetTimezonesForRegions : braveVpnServerRegion.getRegionPrecision() :" + + braveVpnServerRegion.getRegionPrecision()); + region = + (braveVpnServerRegion + .getRegionPrecision() + .equals(BraveVpnConstants.REGION_PRECISION_CITY) + ? braveVpnServerRegion.getRegionCityName() + : region); + BraveVpnNativeWorker.getInstance() + .getHostnamesForRegion(region, braveVpnServerRegion.getRegionPrecision()); braveVpnPrefModel.setServerRegion(braveVpnServerRegion); } else { BraveVpnUtils.showToast( diff --git a/android/java/org/chromium/chrome/browser/vpn/utils/BraveVpnPrefUtils.java b/android/java/org/chromium/chrome/browser/vpn/utils/BraveVpnPrefUtils.java index 74a05ab4eb7..c905e6daefa 100644 --- a/android/java/org/chromium/chrome/browser/vpn/utils/BraveVpnPrefUtils.java +++ b/android/java/org/chromium/chrome/browser/vpn/utils/BraveVpnPrefUtils.java @@ -32,7 +32,9 @@ public class BraveVpnPrefUtils { private static final String PREF_BRAVE_VPN_SERVER_CHANGE_LOCATION = "server_change_location"; private static final String PREF_BRAVE_VPN_SERVER_ISO_CODE = "server_iso_code"; private static final String PREF_BRAVE_VPN_SERVER_NAME_PRETTY = "server_name_pretty"; + private static final String PREF_BRAVE_VPN_SERVER_CITY_NAME = "server_city_name"; private static final String PREF_BRAVE_VPN_SERVER_CITY_NAME_PRETTY = "server_city_name_pretty"; + private static final String PREF_BRAVE_VPN_SERVER_PRECISION = "server_precision"; private static final String PREF_BRAVE_VPN_RESET_CONFIGURATION = "brave_vpn_reset_configuration"; @@ -155,7 +157,7 @@ public class BraveVpnPrefUtils { return ChromeSharedPreferences.getInstance().readLong(PREF_BRAVE_VPN_PURCHASE_EXPIRY, 0); } - public static String getServerRegion() { + public static String getRegionName() { return ChromeSharedPreferences.getInstance() .readString(PREF_BRAVE_VPN_SERVER_CHANGE_LOCATION, PREF_BRAVE_VPN_AUTOMATIC); } @@ -186,6 +188,16 @@ public class BraveVpnPrefUtils { .writeString(PREF_BRAVE_VPN_SERVER_NAME_PRETTY, newValue); } + public static String getRegionCityName() { + return ChromeSharedPreferences.getInstance() + .readString(PREF_BRAVE_VPN_SERVER_CITY_NAME, ""); + } + + public static void setRegionCityName(String newValue) { + ChromeSharedPreferences.getInstance() + .writeString(PREF_BRAVE_VPN_SERVER_CITY_NAME, newValue); + } + public static String getRegionCityNamePretty() { return ChromeSharedPreferences.getInstance() .readString(PREF_BRAVE_VPN_SERVER_CITY_NAME_PRETTY, ""); @@ -196,6 +208,16 @@ public class BraveVpnPrefUtils { .writeString(PREF_BRAVE_VPN_SERVER_CITY_NAME_PRETTY, newValue); } + public static String getRegionPrecision() { + return ChromeSharedPreferences.getInstance() + .readString(PREF_BRAVE_VPN_SERVER_PRECISION, ""); + } + + public static void setRegionPrecision(String newValue) { + ChromeSharedPreferences.getInstance() + .writeString(PREF_BRAVE_VPN_SERVER_PRECISION, newValue); + } + public static void setApiAuthToken(String value) { ChromeSharedPreferences.getInstance().writeString(PREF_BRAVE_VPN_API_AUTH_TOKEN, value); } @@ -254,7 +276,9 @@ public class BraveVpnPrefUtils { setRegionIsoCode(braveVpnPrefModel.getServerRegion().getCountryIsoCode()); setRegionName(braveVpnPrefModel.getServerRegion().getRegionName()); setRegionNamePretty(braveVpnPrefModel.getServerRegion().getRegionNamePretty()); + setRegionCityName(braveVpnPrefModel.getServerRegion().getRegionCityName()); setRegionCityNamePretty(braveVpnPrefModel.getServerRegion().getRegionCityNamePretty()); + setRegionPrecision(braveVpnPrefModel.getServerRegion().getRegionPrecision()); setPurchaseToken(braveVpnPrefModel.getPurchaseToken()); setProductId(braveVpnPrefModel.getProductId()); setSubscriberCredential(braveVpnPrefModel.getSubscriberCredential()); diff --git a/android/java/org/chromium/chrome/browser/vpn/utils/BraveVpnUtils.java b/android/java/org/chromium/chrome/browser/vpn/utils/BraveVpnUtils.java index 38bc202e6f9..54c99e202ef 100644 --- a/android/java/org/chromium/chrome/browser/vpn/utils/BraveVpnUtils.java +++ b/android/java/org/chromium/chrome/browser/vpn/utils/BraveVpnUtils.java @@ -24,6 +24,7 @@ import org.json.JSONObject; import org.chromium.base.ContextUtils; import org.chromium.base.Log; +import org.chromium.brave_vpn.mojom.BraveVpnConstants; import org.chromium.brave_vpn.mojom.Region; import org.chromium.chrome.browser.BraveRewardsNativeWorker; import org.chromium.chrome.browser.vpn.BraveVpnNativeWorker; @@ -161,7 +162,9 @@ public class BraveVpnUtils { region.getString("country-iso-code"), region.getString("name"), region.getString("name-pretty"), - BraveVpnPrefUtils.PREF_BRAVE_VPN_AUTOMATIC); + "", + BraveVpnPrefUtils.PREF_BRAVE_VPN_AUTOMATIC, + BraveVpnConstants.REGION_PRECISION_COUNTRY); return braveVpnServerRegion; } } @@ -261,7 +264,9 @@ public class BraveVpnUtils { server.getString("country-iso-code"), server.getString("name"), server.getString("name-pretty"), - BraveVpnPrefUtils.PREF_BRAVE_VPN_AUTOMATIC); + "", + BraveVpnPrefUtils.PREF_BRAVE_VPN_AUTOMATIC, + BraveVpnConstants.REGION_PRECISION_COUNTRY); vpnServerRegions.add(vpnServerRegion); } } catch (JSONException e) { diff --git a/browser/brave_vpn/android/brave_vpn_native_worker.cc b/browser/brave_vpn/android/brave_vpn_native_worker.cc index 7ab13296c51..15ab266fc05 100644 --- a/browser/brave_vpn/android/brave_vpn_native_worker.cc +++ b/browser/brave_vpn/android/brave_vpn_native_worker.cc @@ -67,13 +67,15 @@ void BraveVpnNativeWorker::OnGetTimezonesForRegions( void BraveVpnNativeWorker::GetHostnamesForRegion( JNIEnv* env, - const base::android::JavaParamRef& region) { + const base::android::JavaParamRef& region, + const base::android::JavaParamRef& region_precision) { BraveVpnService* brave_vpn_service = GetBraveVpnService(); if (brave_vpn_service) { brave_vpn_service->GetHostnamesForRegion( base::BindOnce(&BraveVpnNativeWorker::OnGetHostnamesForRegion, weak_factory_.GetWeakPtr()), - base::android::ConvertJavaStringToUTF8(env, region)); + base::android::ConvertJavaStringToUTF8(env, region), + base::android::ConvertJavaStringToUTF8(env, region_precision)); } } diff --git a/browser/brave_vpn/android/brave_vpn_native_worker.h b/browser/brave_vpn/android/brave_vpn_native_worker.h index ce11fc34692..b2538033c0a 100644 --- a/browser/brave_vpn/android/brave_vpn_native_worker.h +++ b/browser/brave_vpn/android/brave_vpn_native_worker.h @@ -32,7 +32,8 @@ class BraveVpnNativeWorker { void GetHostnamesForRegion( JNIEnv* env, - const base::android::JavaParamRef& region); + const base::android::JavaParamRef& region, + const base::android::JavaParamRef& region_precision); void OnGetHostnamesForRegion(const std::string& hostname_json, bool success); diff --git a/components/brave_vpn/browser/api/brave_vpn_api_request.cc b/components/brave_vpn/browser/api/brave_vpn_api_request.cc index 43504071577..15572942d9a 100644 --- a/components/brave_vpn/browser/api/brave_vpn_api_request.cc +++ b/components/brave_vpn/browser/api/brave_vpn_api_request.cc @@ -99,6 +99,28 @@ void BraveVpnAPIRequest::GetHostnamesForRegion(ResponseCallback callback, OAuthRequest(base_url, "POST", request_body, std::move(internal_callback)); } +void BraveVpnAPIRequest::GetHostnamesForRegion( + ResponseCallback callback, + const std::string& region, + const std::string& region_precision) { + DCHECK(!region.empty()); + static bool dump_sent = false; + if (!dump_sent && region.empty()) { + base::debug::DumpWithoutCrashing(); + dump_sent = true; + } + + auto internal_callback = + base::BindOnce(&BraveVpnAPIRequest::OnGetResponse, + weak_ptr_factory_.GetWeakPtr(), std::move(callback)); + GURL base_url = GetURLWithPath(kVpnHost, kHostnameForRegionNew); + base::Value::Dict dict; + dict.Set("region", region); + dict.Set("region-precision", region_precision); + std::string request_body = CreateJSONRequestBody(dict); + OAuthRequest(base_url, "POST", request_body, std::move(internal_callback)); +} + void BraveVpnAPIRequest::GetProfileCredentials( ResponseCallback callback, const std::string& subscriber_credential, diff --git a/components/brave_vpn/browser/api/brave_vpn_api_request.h b/components/brave_vpn/browser/api/brave_vpn_api_request.h index e0001775826..a8d6e440743 100644 --- a/components/brave_vpn/browser/api/brave_vpn_api_request.h +++ b/components/brave_vpn/browser/api/brave_vpn_api_request.h @@ -38,6 +38,9 @@ class BraveVpnAPIRequest { void GetTimezonesForRegions(ResponseCallback callback); void GetHostnamesForRegion(ResponseCallback callback, const std::string& region); + void GetHostnamesForRegion(ResponseCallback callback, + const std::string& region, + const std::string& region_precision); void GetProfileCredentials(ResponseCallback callback, const std::string& subscriber_credential, const std::string& hostname); diff --git a/components/brave_vpn/browser/brave_vpn_service.cc b/components/brave_vpn/browser/brave_vpn_service.cc index 335f429a48e..3574d487011 100644 --- a/components/brave_vpn/browser/brave_vpn_service.cc +++ b/components/brave_vpn/browser/brave_vpn_service.cc @@ -899,6 +899,14 @@ void BraveVpnService::GetHostnamesForRegion(ResponseCallback callback, api_request_->GetHostnamesForRegion(std::move(callback), region); } +void BraveVpnService::GetHostnamesForRegion( + ResponseCallback callback, + const std::string& region, + const std::string& region_precision) { + api_request_->GetHostnamesForRegion(std::move(callback), region, + region_precision); +} + void BraveVpnService::GetProfileCredentials( ResponseCallback callback, const std::string& subscriber_credential, diff --git a/components/brave_vpn/browser/brave_vpn_service.h b/components/brave_vpn/browser/brave_vpn_service.h index db127eeaae1..f88d9556208 100644 --- a/components/brave_vpn/browser/brave_vpn_service.h +++ b/components/brave_vpn/browser/brave_vpn_service.h @@ -133,6 +133,9 @@ class BraveVpnService : void GetTimezonesForRegions(ResponseCallback callback); void GetHostnamesForRegion(ResponseCallback callback, const std::string& region); + void GetHostnamesForRegion(ResponseCallback callback, + const std::string& region, + const std::string& region_precision); void GetProfileCredentials(ResponseCallback callback, const std::string& subscriber_credential, const std::string& hostname); diff --git a/components/brave_vpn/browser/connection/ikev2/system_vpn_connection_api_unittest.cc b/components/brave_vpn/browser/connection/ikev2/system_vpn_connection_api_unittest.cc index 212b1a57fe8..c2385c5dc3b 100644 --- a/components/brave_vpn/browser/connection/ikev2/system_vpn_connection_api_unittest.cc +++ b/components/brave_vpn/browser/connection/ikev2/system_vpn_connection_api_unittest.cc @@ -11,6 +11,7 @@ #include "base/run_loop.h" #include "brave/components/brave_vpn/browser/brave_vpn_service_helper.h" #include "brave/components/brave_vpn/browser/connection/brave_vpn_connection_manager.h" +#include "brave/components/brave_vpn/browser/connection/brave_vpn_region_data_helper.h" #include "brave/components/brave_vpn/browser/connection/brave_vpn_region_data_manager.h" #include "brave/components/brave_vpn/browser/connection/ikev2/connection_api_impl_sim.h" #include "brave/components/brave_vpn/common/brave_vpn_data_types.h" diff --git a/components/brave_vpn/common/brave_vpn_constants.h b/components/brave_vpn/common/brave_vpn_constants.h index 64e9f2299b9..48ac33bf06d 100644 --- a/components/brave_vpn/common/brave_vpn_constants.h +++ b/components/brave_vpn/common/brave_vpn_constants.h @@ -46,6 +46,8 @@ inline constexpr char kTimezonesForRegions[] = "api/v1.1/servers/timezones-for-regions"; inline constexpr char kHostnameForRegion[] = "api/v1.2/servers/hostnames-for-region"; +inline constexpr char kHostnameForRegionNew[] = + "api/v1.3/servers/hostnames-for-region"; inline constexpr char kProfileCredential[] = "api/v1.1/register-and-create"; inline constexpr char kCredential[] = "api/v1.3/device/"; inline constexpr char kVerifyPurchaseToken[] = "api/v1.1/verify-purchase-token"; From f85ed2d4e2e75592ff9b25cfa7af601a0bfa69be Mon Sep 17 00:00:00 2001 From: deeppandya Date: Wed, 21 Aug 2024 23:19:37 +0530 Subject: [PATCH 19/31] Remove iso code upgrade path as it's not required Resolve desktop unittests --- .../chrome/browser/app/BraveActivity.java | 21 ------------------- .../browser/vpn/utils/BraveVpnPrefUtils.java | 9 -------- .../browser/brave_vpn_service_unittest.cc | 3 ++- .../system_vpn_connection_api_unittest.cc | 2 +- .../brave_vpn/resources/panel/state/async.ts | 5 +++-- 5 files changed, 6 insertions(+), 34 deletions(-) diff --git a/android/java/org/chromium/chrome/browser/app/BraveActivity.java b/android/java/org/chromium/chrome/browser/app/BraveActivity.java index c107626ae9c..7d77a266c52 100644 --- a/android/java/org/chromium/chrome/browser/app/BraveActivity.java +++ b/android/java/org/chromium/chrome/browser/app/BraveActivity.java @@ -1159,11 +1159,6 @@ public abstract class BraveActivity extends ChromeActivity checkFingerPrintingOnUpgrade(isFirstInstall); checkForVpnCallout(isFirstInstall); - if (!isFirstInstall - && !BraveVpnPrefUtils.isIsoCodeUpgradeDone() - && BraveVpnPrefUtils.isSubscriptionPurchase()) { - // BraveVpnNativeWorker.getInstance().getAllServerRegions(); - } if (ChromeFeatureList.isEnabled(BraveFeatureList.BRAVE_VPN_LINK_SUBSCRIPTION_ANDROID_UI) && BraveVpnPrefUtils.isSubscriptionPurchase() @@ -1344,22 +1339,6 @@ public abstract class BraveActivity extends ChromeActivity } } - // @Override - // public void onGetAllServerRegions(String jsonResponse, boolean isSuccess) { - // if (isSuccess) { - // List braveVpnServerRegions = - // BraveVpnUtils.getServerLocations(jsonResponse); - // for (BraveVpnServerRegion braveVpnServerRegion : braveVpnServerRegions) { - // if (braveVpnServerRegion.getName().equals(BraveVpnPrefUtils.getServerRegion())) { - // BraveVpnPrefUtils.setServerIsoCode(braveVpnServerRegion.getCountryIsoCode()); - // BraveVpnPrefUtils.setServerNamePretty(braveVpnServerRegion.getNamePretty()); - // BraveVpnPrefUtils.setIsoCodeUpgrade(true); - // break; - // } - // } - // } - // } - private void handleDeepLinkVpn() { mIsDeepLink = true; BraveVpnUtils.openBraveVpnPlansActivity(this); diff --git a/android/java/org/chromium/chrome/browser/vpn/utils/BraveVpnPrefUtils.java b/android/java/org/chromium/chrome/browser/vpn/utils/BraveVpnPrefUtils.java index c905e6daefa..166dba77e71 100644 --- a/android/java/org/chromium/chrome/browser/vpn/utils/BraveVpnPrefUtils.java +++ b/android/java/org/chromium/chrome/browser/vpn/utils/BraveVpnPrefUtils.java @@ -53,15 +53,6 @@ public class BraveVpnPrefUtils { public static final String PREF_SESSION_START_TIME = "brave_vpn_session_start_time"; public static final String PREF_SESSION_END_TIME = "brave_vpn_session_end_time"; private static final String PREF_LINK_SUBSCRIPTION_DIALOG = "link_subscription_dialog"; - private static final String PREF_VPN_ISO_CODE_UPGRADE = "vpn_iso_code_upgrade"; - - public static boolean isIsoCodeUpgradeDone() { - return ChromeSharedPreferences.getInstance().readBoolean(PREF_VPN_ISO_CODE_UPGRADE, false); - } - - public static void setIsoCodeUpgrade(boolean newValue) { - ChromeSharedPreferences.getInstance().writeBoolean(PREF_VPN_ISO_CODE_UPGRADE, newValue); - } public static boolean isLinkSubscriptionDialogShown() { return ChromeSharedPreferences.getInstance() diff --git a/components/brave_vpn/browser/brave_vpn_service_unittest.cc b/components/brave_vpn/browser/brave_vpn_service_unittest.cc index 8bbaddb2b6a..b91e2ffd7db 100644 --- a/components/brave_vpn/browser/brave_vpn_service_unittest.cc +++ b/components/brave_vpn/browser/brave_vpn_service_unittest.cc @@ -23,6 +23,7 @@ #include "brave/components/brave_vpn/browser/brave_vpn_service_helper.h" #include "brave/components/brave_vpn/browser/connection/brave_vpn_connection_info.h" #include "brave/components/brave_vpn/browser/connection/brave_vpn_connection_manager.h" +#include "brave/components/brave_vpn/browser/connection/brave_vpn_region_data_helper.h" #include "brave/components/brave_vpn/common/brave_vpn_constants.h" #include "brave/components/brave_vpn/common/brave_vpn_utils.h" #include "brave/components/brave_vpn/common/features.h" @@ -303,7 +304,7 @@ class BraveVPNServiceTest : public testing::Test { ->GetRegionDataManager() .GetDeviceRegion(), regions())) { - return *region_ptr; + return std::move(*region_ptr); } return mojom::Region(); } diff --git a/components/brave_vpn/browser/connection/ikev2/system_vpn_connection_api_unittest.cc b/components/brave_vpn/browser/connection/ikev2/system_vpn_connection_api_unittest.cc index c2385c5dc3b..52cc4fd6fc1 100644 --- a/components/brave_vpn/browser/connection/ikev2/system_vpn_connection_api_unittest.cc +++ b/components/brave_vpn/browser/connection/ikev2/system_vpn_connection_api_unittest.cc @@ -244,7 +244,7 @@ class SystemVPNConnectionAPIUnitTest : public testing::Test { ->GetRegionDataManager() .GetDeviceRegion(), regions())) { - return *region_ptr; + return std::move(*region_ptr); } return mojom::Region(); } diff --git a/components/brave_vpn/resources/panel/state/async.ts b/components/brave_vpn/resources/panel/state/async.ts index cc7e9a521b5..e800942128d 100644 --- a/components/brave_vpn/resources/panel/state/async.ts +++ b/components/brave_vpn/resources/panel/state/async.ts @@ -8,6 +8,7 @@ import AsyncActionHandler from '../../../../common/AsyncActionHandler' import getPanelBrowserAPI, { ConnectionState, PurchasedState } from '../api/panel_browser_api' import * as Actions from './actions' import { RootState } from './store' +import { REGION_PRECISION_CITY_BY_COUNTRY } from '../../api/panel_browser_api' const handler = new AsyncActionHandler() type Store = MiddlewareAPI, any> @@ -50,7 +51,7 @@ handler.on(Actions.purchaseConfirmed.getType(), async (store) => { const [{ state }, { currentRegion }, { regions }] = await Promise.all([ getPanelBrowserAPI().serviceHandler.getConnectionState(), getPanelBrowserAPI().serviceHandler.getSelectedRegion(), - getPanelBrowserAPI().serviceHandler.getAllRegions("city-by-country") + getPanelBrowserAPI().serviceHandler.getAllRegions(REGION_PRECISION_CITY_BY_COUNTRY) ]) store.dispatch(Actions.showMainView({ @@ -65,7 +66,7 @@ handler.on(Actions.purchaseConfirmed.getType(), async (store) => { handler.on(Actions.purchaseExpired.getType(), async (store) => { const [{ currentRegion }, { regions }] = await Promise.all([ getPanelBrowserAPI().serviceHandler.getSelectedRegion(), - getPanelBrowserAPI().serviceHandler.getAllRegions("city-by-country") + getPanelBrowserAPI().serviceHandler.getAllRegions(REGION_PRECISION_CITY_BY_COUNTRY) ]) store.dispatch(Actions.showMainView({ From 19f2a69fe99657b522fe2665970b0f7e14602586 Mon Sep 17 00:00:00 2001 From: deeppandya Date: Wed, 21 Aug 2024 23:34:22 +0530 Subject: [PATCH 20/31] Resolve brave vpn constant issue Resolve desktop unittest --- .../chrome/browser/vpn/activities/VpnPaywallActivity.java | 2 -- components/brave_vpn/browser/brave_vpn_service_unittest.cc | 4 ++-- .../connection/ikev2/system_vpn_connection_api_unittest.cc | 4 ++-- components/brave_vpn/resources/panel/state/async.ts | 3 +-- 4 files changed, 5 insertions(+), 8 deletions(-) diff --git a/android/java/org/chromium/chrome/browser/vpn/activities/VpnPaywallActivity.java b/android/java/org/chromium/chrome/browser/vpn/activities/VpnPaywallActivity.java index f05d26f7726..edbd4146ed0 100644 --- a/android/java/org/chromium/chrome/browser/vpn/activities/VpnPaywallActivity.java +++ b/android/java/org/chromium/chrome/browser/vpn/activities/VpnPaywallActivity.java @@ -30,8 +30,6 @@ import org.chromium.chrome.browser.billing.InAppPurchaseWrapper; import org.chromium.chrome.browser.billing.LinkSubscriptionUtils; import org.chromium.chrome.browser.util.LiveDataUtil; import org.chromium.chrome.browser.util.TabUtils; -import org.chromium.chrome.browser.vpn.BraveVpnNativeWorker; -import org.chromium.chrome.browser.vpn.adapters.BraveVpnPlanPagerAdapter; import org.chromium.chrome.browser.vpn.utils.BraveVpnUtils; import org.chromium.ui.text.SpanApplier; import org.chromium.ui.text.SpanApplier.SpanInfo; diff --git a/components/brave_vpn/browser/brave_vpn_service_unittest.cc b/components/brave_vpn/browser/brave_vpn_service_unittest.cc index b91e2ffd7db..74820c8e04e 100644 --- a/components/brave_vpn/browser/brave_vpn_service_unittest.cc +++ b/components/brave_vpn/browser/brave_vpn_service_unittest.cc @@ -304,7 +304,7 @@ class BraveVPNServiceTest : public testing::Test { ->GetRegionDataManager() .GetDeviceRegion(), regions())) { - return std::move(*region_ptr); + return (*region_ptr).Clone(); } return mojom::Region(); } @@ -319,7 +319,7 @@ class BraveVPNServiceTest : public testing::Test { service_->OnCredentialSummary(domain, MakeSkusResult(summary)); } - const std::vector& regions() const { + const std::vector& regions() const { return GetBraveVPNConnectionManager()->GetRegionDataManager().GetRegions(); } diff --git a/components/brave_vpn/browser/connection/ikev2/system_vpn_connection_api_unittest.cc b/components/brave_vpn/browser/connection/ikev2/system_vpn_connection_api_unittest.cc index 52cc4fd6fc1..42f1765882a 100644 --- a/components/brave_vpn/browser/connection/ikev2/system_vpn_connection_api_unittest.cc +++ b/components/brave_vpn/browser/connection/ikev2/system_vpn_connection_api_unittest.cc @@ -244,12 +244,12 @@ class SystemVPNConnectionAPIUnitTest : public testing::Test { ->GetRegionDataManager() .GetDeviceRegion(), regions())) { - return std::move(*region_ptr); + return (*region_ptr).Clone(); } return mojom::Region(); } - const std::vector& regions() { + const std::vector& regions() { return GetBraveVPNConnectionManager()->GetRegionDataManager().GetRegions(); } diff --git a/components/brave_vpn/resources/panel/state/async.ts b/components/brave_vpn/resources/panel/state/async.ts index e800942128d..9d997806923 100644 --- a/components/brave_vpn/resources/panel/state/async.ts +++ b/components/brave_vpn/resources/panel/state/async.ts @@ -5,10 +5,9 @@ import { MiddlewareAPI, Dispatch, AnyAction } from 'redux' import AsyncActionHandler from '../../../../common/AsyncActionHandler' -import getPanelBrowserAPI, { ConnectionState, PurchasedState } from '../api/panel_browser_api' +import getPanelBrowserAPI, { ConnectionState, PurchasedState , REGION_PRECISION_CITY_BY_COUNTRY } from '../api/panel_browser_api' import * as Actions from './actions' import { RootState } from './store' -import { REGION_PRECISION_CITY_BY_COUNTRY } from '../../api/panel_browser_api' const handler = new AsyncActionHandler() type Store = MiddlewareAPI, any> From 39730f993524e799138e329feb8adc5d80f74434 Mon Sep 17 00:00:00 2001 From: deeppandya Date: Thu, 22 Aug 2024 05:17:46 +0530 Subject: [PATCH 21/31] Update server selection behaviour for automatic selection --- .../vpn/activities/VpnServerActivity.java | 4 +- .../VpnServerSelectionActivity.java | 46 +++++++++++-------- .../vpn/utils/BraveVpnApiResponseUtils.java | 7 --- .../browser/vpn/utils/BraveVpnPrefUtils.java | 11 +++++ .../browser/vpn/utils/BraveVpnUtils.java | 37 ++------------- .../layout/activity_vpn_server_selection.xml | 1 + .../browser/brave_vpn_service_unittest.cc | 2 +- .../system_vpn_connection_api_unittest.cc | 2 +- 8 files changed, 49 insertions(+), 61 deletions(-) diff --git a/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerActivity.java b/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerActivity.java index 24475c4fc40..021262d4f47 100644 --- a/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerActivity.java +++ b/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerActivity.java @@ -1,4 +1,4 @@ -/* Copyright (c) 2023 The Brave Authors. All rights reserved. +/* Copyright (c) 2024 The Brave Authors. All rights reserved. * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this file, * You can obtain one at https://mozilla.org/MPL/2.0/. */ @@ -94,8 +94,8 @@ public class VpnServerActivity extends BraveVpnParentActivity { List cities = new ArrayList(Arrays.asList(region.cities)); Region optimalRegion = new Region(); - optimalRegion.namePretty = getString(R.string.optimal_text); optimalRegion.name = getString(R.string.optimal_desc); + optimalRegion.namePretty = getString(R.string.optimal_text); cities.add(0, optimalRegion); mVpnServerAdapter = new VpnServerAdapter(VpnServerActivity.this); diff --git a/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerSelectionActivity.java b/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerSelectionActivity.java index 2af8e124ec0..d1f17c34cc2 100644 --- a/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerSelectionActivity.java +++ b/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerSelectionActivity.java @@ -10,6 +10,7 @@ import android.view.MenuItem; import android.view.View; import android.widget.LinearLayout; import android.widget.ProgressBar; +import android.widget.TextView; import androidx.appcompat.app.ActionBar; import androidx.appcompat.widget.Toolbar; @@ -40,6 +41,8 @@ public class VpnServerSelectionActivity extends BraveVpnParentActivity private LinearLayout mServerSelectionListLayout; private ProgressBar mServerSelectionProgress; private RecyclerView mServerRegionList; + private TextView mServersSectionText; + private MaterialSwitch mAutomaticSwitch; private ServiceHandler mServiceHandler; @@ -86,29 +89,28 @@ public class VpnServerSelectionActivity extends BraveVpnParentActivity mServerRegionList = (RecyclerView) findViewById(R.id.server_selection_list); - LinearLayout automaticLayout = (LinearLayout) findViewById(R.id.automatic_server_layout); - MaterialSwitch automaticSwitch = - (MaterialSwitch) findViewById(R.id.automatic_server_switch); - boolean isAutomatic = - BraveVpnPrefUtils.getRegionName() - .equals(BraveVpnPrefUtils.PREF_BRAVE_VPN_AUTOMATIC); - mServerRegionList.setVisibility(isAutomatic ? View.GONE : View.VISIBLE); - automaticSwitch.setOnClickListener( + mServersSectionText = (TextView) findViewById(R.id.servers_section_text); + mAutomaticSwitch = (MaterialSwitch) findViewById(R.id.automatic_server_switch); + mAutomaticSwitch.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { - BraveVpnUtils.selectedServerRegion = - new BraveVpnServerRegion( - "", - BraveVpnPrefUtils.PREF_BRAVE_VPN_AUTOMATIC, - "", - "", - BraveVpnPrefUtils.PREF_BRAVE_VPN_AUTOMATIC, - BraveVpnConstants.REGION_PRECISION_COUNTRY); - changeServerRegion(); + if (mAutomaticSwitch.isChecked()) { + BraveVpnUtils.selectedServerRegion = + new BraveVpnServerRegion( + "", + BraveVpnPrefUtils.PREF_BRAVE_VPN_AUTOMATIC, + "", + getString(R.string.optimal_text), + getString(R.string.optimal_desc), + BraveVpnConstants.REGION_PRECISION_COUNTRY); + changeServerRegion(); + } + + BraveVpnPrefUtils.setAutomaticServerSelection(mAutomaticSwitch.isChecked()); + updateAutomaticSelection(mAutomaticSwitch.isChecked()); } }); - mServerSelectionListLayout = (LinearLayout) findViewById(R.id.server_selection_list_layout); mServerSelectionProgress = (ProgressBar) findViewById(R.id.server_selection_progress); @@ -132,6 +134,14 @@ public class VpnServerSelectionActivity extends BraveVpnParentActivity } }); mServerRegionList.setLayoutManager(linearLayoutManager); + boolean isAutomatic = BraveVpnPrefUtils.isAutomaticServerSelection(); + updateAutomaticSelection(isAutomatic); + mAutomaticSwitch.setChecked(isAutomatic); + } + + private void updateAutomaticSelection(boolean isAutomatic) { + mServerRegionList.setVisibility(isAutomatic ? View.GONE : View.VISIBLE); + mServersSectionText.setVisibility(isAutomatic ? View.GONE : View.VISIBLE); } @Override diff --git a/android/java/org/chromium/chrome/browser/vpn/utils/BraveVpnApiResponseUtils.java b/android/java/org/chromium/chrome/browser/vpn/utils/BraveVpnApiResponseUtils.java index c27f1d6c9c7..c7519353f4d 100644 --- a/android/java/org/chromium/chrome/browser/vpn/utils/BraveVpnApiResponseUtils.java +++ b/android/java/org/chromium/chrome/browser/vpn/utils/BraveVpnApiResponseUtils.java @@ -14,7 +14,6 @@ import android.util.Pair; import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; -import org.chromium.base.Log; import org.chromium.brave_vpn.mojom.BraveVpnConstants; import org.chromium.chrome.R; import org.chromium.chrome.browser.billing.InAppPurchaseWrapper; @@ -91,12 +90,6 @@ public class BraveVpnApiResponseUtils { ? region : serverRegion; } - - Log.e("brave_vpn", "handleOnGetTimezonesForRegions : region :" + region); - Log.e( - "brave_vpn", - "handleOnGetTimezonesForRegions : braveVpnServerRegion.getRegionPrecision() :" - + braveVpnServerRegion.getRegionPrecision()); region = (braveVpnServerRegion .getRegionPrecision() diff --git a/android/java/org/chromium/chrome/browser/vpn/utils/BraveVpnPrefUtils.java b/android/java/org/chromium/chrome/browser/vpn/utils/BraveVpnPrefUtils.java index 166dba77e71..dcbef100e28 100644 --- a/android/java/org/chromium/chrome/browser/vpn/utils/BraveVpnPrefUtils.java +++ b/android/java/org/chromium/chrome/browser/vpn/utils/BraveVpnPrefUtils.java @@ -35,6 +35,7 @@ public class BraveVpnPrefUtils { private static final String PREF_BRAVE_VPN_SERVER_CITY_NAME = "server_city_name"; private static final String PREF_BRAVE_VPN_SERVER_CITY_NAME_PRETTY = "server_city_name_pretty"; private static final String PREF_BRAVE_VPN_SERVER_PRECISION = "server_precision"; + private static final String VPN_AUTOMATIC_SERVER_SELECTION = "vpn_automatic_server_selection"; private static final String PREF_BRAVE_VPN_RESET_CONFIGURATION = "brave_vpn_reset_configuration"; @@ -99,6 +100,16 @@ public class BraveVpnPrefUtils { .writeBoolean(PREF_BRAVE_VPN_RESET_CONFIGURATION, newValue); } + public static boolean isAutomaticServerSelection() { + return ChromeSharedPreferences.getInstance() + .readBoolean(VPN_AUTOMATIC_SERVER_SELECTION, false); + } + + public static void setAutomaticServerSelection(boolean newValue) { + ChromeSharedPreferences.getInstance() + .writeBoolean(VPN_AUTOMATIC_SERVER_SELECTION, newValue); + } + public static void setHostname(String value) { ChromeSharedPreferences.getInstance().writeString(PREF_BRAVE_VPN_HOSTNAME, value); } diff --git a/android/java/org/chromium/chrome/browser/vpn/utils/BraveVpnUtils.java b/android/java/org/chromium/chrome/browser/vpn/utils/BraveVpnUtils.java index 54c99e202ef..1b0952732a9 100644 --- a/android/java/org/chromium/chrome/browser/vpn/utils/BraveVpnUtils.java +++ b/android/java/org/chromium/chrome/browser/vpn/utils/BraveVpnUtils.java @@ -11,7 +11,6 @@ import android.app.Activity; import android.app.ProgressDialog; import android.content.Context; import android.content.Intent; -import android.text.TextUtils; import android.util.Pair; import androidx.fragment.app.FragmentActivity; @@ -26,6 +25,7 @@ import org.chromium.base.ContextUtils; import org.chromium.base.Log; import org.chromium.brave_vpn.mojom.BraveVpnConstants; import org.chromium.brave_vpn.mojom.Region; +import org.chromium.chrome.R; import org.chromium.chrome.browser.BraveRewardsNativeWorker; import org.chromium.chrome.browser.vpn.BraveVpnNativeWorker; import org.chromium.chrome.browser.vpn.activities.BraveVpnProfileActivity; @@ -44,7 +44,6 @@ import org.chromium.gms.ChromiumPlayServicesAvailability; import org.chromium.ui.widget.Toast; import java.util.ArrayList; -import java.util.List; import java.util.Random; public class BraveVpnUtils { @@ -162,8 +161,10 @@ public class BraveVpnUtils { region.getString("country-iso-code"), region.getString("name"), region.getString("name-pretty"), - "", - BraveVpnPrefUtils.PREF_BRAVE_VPN_AUTOMATIC, + ContextUtils.getApplicationContext() + .getString(R.string.optimal_text), + ContextUtils.getApplicationContext() + .getString(R.string.optimal_desc), BraveVpnConstants.REGION_PRECISION_COUNTRY); return braveVpnServerRegion; } @@ -176,7 +177,6 @@ public class BraveVpnUtils { } public static Pair getHostnameForRegion(String jsonHostnames) { - Log.e("brave_vpn", "jsonHostnames : " + jsonHostnames); jsonHostnames = "{\"hostnames\":" + jsonHostnames + "}"; try { JSONObject result = new JSONObject(jsonHostnames); @@ -248,33 +248,6 @@ public class BraveVpnUtils { return 0; } - public static List getServerLocations(String jsonServerLocations) { - List vpnServerRegions = new ArrayList<>(); - if (TextUtils.isEmpty(jsonServerLocations)) { - return vpnServerRegions; - } - jsonServerLocations = "{\"servers\":" + jsonServerLocations + "}"; - try { - JSONObject result = new JSONObject(jsonServerLocations); - JSONArray servers = result.getJSONArray("servers"); - for (int i = 0; i < servers.length(); i++) { - JSONObject server = servers.getJSONObject(i); - BraveVpnServerRegion vpnServerRegion = - new BraveVpnServerRegion( - server.getString("country-iso-code"), - server.getString("name"), - server.getString("name-pretty"), - "", - BraveVpnPrefUtils.PREF_BRAVE_VPN_AUTOMATIC, - BraveVpnConstants.REGION_PRECISION_COUNTRY); - vpnServerRegions.add(vpnServerRegion); - } - } catch (JSONException e) { - Log.e(TAG, "BraveVpnUtils -> getServerLocations JSONException error " + e); - } - return vpnServerRegions; - } - public static void resetProfileConfiguration(Activity activity) { if (BraveVpnProfileUtils.getInstance().isBraveVPNConnected(activity)) { BraveVpnProfileUtils.getInstance().stopVpn(activity); diff --git a/android/java/res/layout/activity_vpn_server_selection.xml b/android/java/res/layout/activity_vpn_server_selection.xml index 80f2cba762c..81e45cfef43 100644 --- a/android/java/res/layout/activity_vpn_server_selection.xml +++ b/android/java/res/layout/activity_vpn_server_selection.xml @@ -64,6 +64,7 @@ GetRegionDataManager() .GetDeviceRegion(), regions())) { - return (*region_ptr).Clone(); + return *(region_ptr.Clone()); } return mojom::Region(); } diff --git a/components/brave_vpn/browser/connection/ikev2/system_vpn_connection_api_unittest.cc b/components/brave_vpn/browser/connection/ikev2/system_vpn_connection_api_unittest.cc index 42f1765882a..d3e4fc86f3e 100644 --- a/components/brave_vpn/browser/connection/ikev2/system_vpn_connection_api_unittest.cc +++ b/components/brave_vpn/browser/connection/ikev2/system_vpn_connection_api_unittest.cc @@ -244,7 +244,7 @@ class SystemVPNConnectionAPIUnitTest : public testing::Test { ->GetRegionDataManager() .GetDeviceRegion(), regions())) { - return (*region_ptr).Clone(); + return *(region_ptr.Clone()); } return mojom::Region(); } From c8635875f0997fc829faac6322d9d6348a81ba08 Mon Sep 17 00:00:00 2001 From: Simon Hong Date: Mon, 26 Aug 2024 15:47:03 +0900 Subject: [PATCH 22/31] Fixed storybook build failure --- .../panel/stories/mock-data/region-list.ts | 795 +++++++++++++++++- 1 file changed, 754 insertions(+), 41 deletions(-) diff --git a/components/brave_vpn/resources/panel/stories/mock-data/region-list.ts b/components/brave_vpn/resources/panel/stories/mock-data/region-list.ts index b9e2ed8556f..a8776a961d4 100644 --- a/components/brave_vpn/resources/panel/stories/mock-data/region-list.ts +++ b/components/brave_vpn/resources/panel/stories/mock-data/region-list.ts @@ -2,83 +2,796 @@ // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this file, // you can obtain one at https://mozilla.org/MPL/2.0/. -export const mockRegionList = [ + +import { Region } from '../../api/panel_browser_api' + +export const mockRegionList: Region[] = [ { - 'continent': 'oceania', - 'name': 'au-au', + 'cities': [ + { + 'continent': 'Oceania', + 'countryIsoCode': 'AU', + 'latitude': 151.2070530275259, + 'longitude': -33.867749537753284, + 'name': 'au-syd', + 'namePretty': 'Sydney', + 'regionPrecision': 'city', + 'cities': [], + 'serverCount': 8 + } + ], + 'continent': 'Oceania', + 'countryIsoCode': 'AU', + 'latitude': 133.79969396159765, + 'longitude': -23.62305911440252, + 'name': 'ocn-aus', 'namePretty': 'Australia', - 'countryIsoCode': 'AU' + 'regionPrecision': 'country', + 'serverCount': 8 }, { - 'continent': 'north-america', - 'name': 'ca-east', + 'cities': [ + { + 'continent': 'Europe', + 'countryIsoCode': 'AT', + 'latitude': 16.361628116335655, + 'longitude': 48.20392172247492, + 'name': 'eu-vie', + 'namePretty': 'Vienna', + 'regionPrecision': 'city', + 'cities': [], + 'serverCount': 10 + } + ], + 'continent': 'Europe', + 'countryIsoCode': 'AT', + 'latitude': 13.833811946421187, + 'longitude': 47.490394433887666, + 'name': 'eu-at', + 'namePretty': 'Austria', + 'regionPrecision': 'country', + 'serverCount': 10 + }, + { + 'cities': [ + { + 'continent': 'Europe', + 'countryIsoCode': 'BE', + 'latitude': 4.374847958682745, + 'longitude': 50.838778068842664, + 'name': 'eu-bx', + 'namePretty': 'Brussels', + 'regionPrecision': 'city', + 'cities': [], + 'serverCount': 10 + } + ], + 'continent': 'Europe', + 'countryIsoCode': 'BE', + 'latitude': 4.733776325426172, + 'longitude': 50.712750850845715, + 'name': 'eu-be', + 'namePretty': 'Belgium', + 'regionPrecision': 'country', + 'serverCount': 10 + }, + { + 'cities': [ + { + 'continent': 'South-America', + 'countryIsoCode': 'BR', + 'latitude': -46.63611733672991, + 'longitude': -23.547575340603583, + 'name': 'sa-sao', + 'namePretty': 'Sao Paulo', + 'regionPrecision': 'city', + 'cities': [], + 'serverCount': 5 + } + ], + 'continent': 'South-America', + 'countryIsoCode': 'BR', + 'latitude': -48.99593985069093, + 'longitude': -12.240989380800045, + 'name': 'sa-brz', + 'namePretty': 'Brazil', + 'regionPrecision': 'country', + 'serverCount': 5 + }, + { + 'cities': [ + { + 'continent': 'North-America', + 'countryIsoCode': 'CA', + 'latitude': -79.39835761830456, + 'longitude': 43.7064997964195, + 'name': 'ca-tor', + 'namePretty': 'Toronto', + 'regionPrecision': 'city', + 'cities': [], + 'serverCount': 5 + } + ], + 'continent': 'North-America', + 'countryIsoCode': 'CA', + 'latitude': -103.18476973580967, + 'longitude': 58.781368758466364, + 'name': 'na-can', 'namePretty': 'Canada', - 'countryIsoCode': 'CA' + 'regionPrecision': 'country', + 'serverCount': 5 }, { - 'continent': 'europe', + 'cities': [ + { + 'continent': 'South-America', + 'countryIsoCode': 'CL', + 'latitude': -70.6435850121368, + 'longitude': -33.435239814529155, + 'name': 'sa-scl', + 'namePretty': 'Santiago', + 'regionPrecision': 'city', + 'cities': [], + 'serverCount': 4 + } + ], + 'continent': 'South-America', + 'countryIsoCode': 'CL', + 'latitude': -71.674414424191, + 'longitude': -35.64236540944717, + 'name': 'sa-cl', + 'namePretty': 'Chile', + 'regionPrecision': 'country', + 'serverCount': 4 + }, + { + 'cities': [ + { + 'continent': 'South-America', + 'countryIsoCode': 'CO', + 'latitude': -74.09710852683152, + 'longitude': 4.668568632587634, + 'name': 'co-bog', + 'namePretty': 'Bogotá', + 'regionPrecision': 'city', + 'cities': [], + 'serverCount': 10 + } + ], + 'continent': 'South-America', + 'countryIsoCode': 'CO', + 'latitude': -73.086241587976, + 'longitude': 3.7038764804835274, + 'name': 'sa-co', + 'namePretty': 'Colombia', + 'regionPrecision': 'country', + 'serverCount': 10 + }, + { + 'cities': [ + { + 'continent': 'Europe', + 'countryIsoCode': 'HR', + 'latitude': 15.987010863996636, + 'longitude': 45.81014842329514, + 'name': 'eu-zag', + 'namePretty': 'Zagreb', + 'regionPrecision': 'city', + 'cities': [], + 'serverCount': 10 + } + ], + 'continent': 'Europe', + 'countryIsoCode': 'HR', + 'latitude': 15.351406746305031, + 'longitude': 45.234230340424304, + 'name': 'eu-cr', + 'namePretty': 'Croatia', + 'regionPrecision': 'country', + 'serverCount': 10 + }, + { + 'cities': [ + { + 'continent': 'Europe', + 'countryIsoCode': 'CZ', + 'latitude': 14.43066765658731, + 'longitude': 50.079133822253986, + 'name': 'eu-prg', + 'namePretty': 'Prague', + 'regionPrecision': 'city', + 'cities': [], + 'serverCount': 10 + } + ], + 'continent': 'Europe', + 'countryIsoCode': 'CZ', + 'latitude': 15.156656921785457, + 'longitude': 49.819154232007925, + 'name': 'eu-cz', + 'namePretty': 'Czech-Republic', + 'regionPrecision': 'country', + 'serverCount': 10 + }, + { + 'cities': [ + { + 'continent': 'Europe', + 'countryIsoCode': 'DK', + 'latitude': 12.578964037667108, + 'longitude': 55.6843928421415, + 'name': 'eu-cph', + 'namePretty': 'Copenhagen', + 'regionPrecision': 'city', + 'cities': [], + 'serverCount': 8 + } + ], + 'continent': 'Europe', + 'countryIsoCode': 'DK', + 'latitude': 10.327889179924739, + 'longitude': 55.30869540361275, + 'name': 'eu-dk', + 'namePretty': 'Denmark', + 'regionPrecision': 'country', + 'serverCount': 8 + }, + { + 'cities': [ + { + 'continent': 'Europe', + 'countryIsoCode': 'GB', + 'latitude': -0.08004383047700726, + 'longitude': 51.51336761995574, + 'name': 'en-lon', + 'namePretty': 'London', + 'regionPrecision': 'city', + 'cities': [], + 'serverCount': 8 + } + ], + 'continent': 'Europe', + 'countryIsoCode': 'GB', + 'latitude': -1.8644242280999657, + 'longitude': 53.2004917527497, + 'name': 'eu-en', + 'namePretty': 'England', + 'regionPrecision': 'country', + 'serverCount': 8 + }, + { + 'cities': [ + { + 'continent': 'Europe', + 'countryIsoCode': 'FR', + 'latitude': 3.0588674449756144, + 'longitude': 50.633219501980975, + 'name': 'fr-lil', + 'namePretty': 'Lille', + 'regionPrecision': 'city', + 'cities': [], + 'serverCount': 1 + }, + { + 'continent': 'Europe', + 'countryIsoCode': 'FR', + 'latitude': 2.3443157026941663, + 'longitude': 48.86040883991442, + 'name': 'fr-par', + 'namePretty': 'Paris', + 'regionPrecision': 'city', + 'cities': [], + 'serverCount': 10 + } + ], + 'continent': 'Europe', + 'countryIsoCode': 'FR', + 'latitude': 2.319752458173268, + 'longitude': 46.86827587134022, 'name': 'eu-fr', 'namePretty': 'France', - 'countryIsoCode': 'FR' + 'regionPrecision': 'country', + 'serverCount': 11 }, { - 'continent': 'europe', + 'cities': [ + { + 'continent': 'Europe', + 'countryIsoCode': 'DE', + 'latitude': 8.68072449294419, + 'longitude': 50.111452544261404, + 'name': 'de-fra', + 'namePretty': 'Frankfurt', + 'regionPrecision': 'city', + 'cities': [], + 'serverCount': 15 + } + ], + 'continent': 'Europe', + 'countryIsoCode': 'DE', + 'latitude': 10.333714874017673, + 'longitude': 51.1887516565091, 'name': 'eu-de', 'namePretty': 'Germany', - 'countryIsoCode': 'DE' + 'regionPrecision': 'country', + 'serverCount': 15 }, { - 'continent': 'asia', + 'cities': [ + { + 'continent': 'Europe', + 'countryIsoCode': 'GR', + 'latitude': 23.72654560943824, + 'longitude': 37.97159021247938, + 'name': 'eu-ath', + 'namePretty': 'Athens', + 'regionPrecision': 'city', + 'cities': [], + 'serverCount': 6 + } + ], + 'continent': 'Europe', + 'countryIsoCode': 'GR', + 'latitude': 22.44098021821132, + 'longitude': 39.61266200044209, + 'name': 'eu-gr', + 'namePretty': 'Greece', + 'regionPrecision': 'country', + 'serverCount': 6 + }, + { + 'cities': [ + { + 'continent': 'Europe', + 'countryIsoCode': 'IE', + 'latitude': -6.260546130127202, + 'longitude': 53.34938898769911, + 'name': 'eu-dub', + 'namePretty': 'Dublin', + 'regionPrecision': 'city', + 'cities': [], + 'serverCount': 10 + } + ], + 'continent': 'Europe', + 'countryIsoCode': 'IE', + 'latitude': -7.908198373580059, + 'longitude': 53.35207843279358, + 'name': 'eu-ie', + 'namePretty': 'Ireland', + 'regionPrecision': 'country', + 'serverCount': 10 + }, + { + 'cities': [ + { + 'continent': 'Europe', + 'countryIsoCode': 'IT', + 'latitude': 9.189467832890369, + 'longitude': 45.46436812557534, + 'name': 'eu-mil', + 'namePretty': 'Milan', + 'regionPrecision': 'city', + 'cities': [], + 'serverCount': 5 + } + ], + 'continent': 'Europe', + 'countryIsoCode': 'IT', + 'latitude': 12.307849925210087, + 'longitude': 43.24892791896981, + 'name': 'eu-it', + 'namePretty': 'Italy', + 'regionPrecision': 'country', + 'serverCount': 5 + }, + { + 'cities': [ + { + 'continent': 'Asia', + 'countryIsoCode': 'JP', + 'latitude': 139.69105468946967, + 'longitude': 35.68940973208437, + 'name': 'jp-tky', + 'namePretty': 'Tokyo', + 'regionPrecision': 'city', + 'cities': [], + 'serverCount': 5 + } + ], + 'continent': 'Asia', + 'countryIsoCode': 'JP', + 'latitude': 139.28533963672928, + 'longitude': 37.334150531438006, 'name': 'asia-jp', 'namePretty': 'Japan', - 'countryIsoCode': 'JP' + 'regionPrecision': 'country', + 'serverCount': 5 }, { - 'continent': 'europe', + 'cities': [ + { + 'continent': 'South-America', + 'countryIsoCode': 'MX', + 'latitude': -100.38872630519874, + 'longitude': 20.58937508354671, + 'name': 'sa-mxc', + 'namePretty': 'Mexico City', + 'regionPrecision': 'city', + 'cities': [], + 'serverCount': 5 + } + ], + 'continent': 'South-America', + 'countryIsoCode': 'MX', + 'latitude': -102.59612807183309, + 'longitude': 24.297157717752373, + 'name': 'sa-mx', + 'namePretty': 'Mexico', + 'regionPrecision': 'country', + 'serverCount': 5 + }, + { + 'cities': [ + { + 'continent': 'Europe', + 'countryIsoCode': 'NL', + 'latitude': -74.01272871825755, + 'longitude': 40.70817150833264, + 'name': 'nl-ams', + 'namePretty': 'Amsterdam', + 'regionPrecision': 'city', + 'cities': [], + 'serverCount': 3 + } + ], + 'continent': 'Europe', + 'countryIsoCode': 'NL', + 'latitude': -99.48423511920554, + 'longitude': 38.98329697661361, 'name': 'eu-nl', 'namePretty': 'Netherlands', - 'countryIsoCode': 'NL' + 'regionPrecision': 'country', + 'serverCount': 3 }, { - 'continent': 'asia', + 'cities': [ + { + 'continent': 'Europe', + 'countryIsoCode': 'PL', + 'latitude': 21.014656085808774, + 'longitude': 52.24773817919016, + 'name': 'eu-war', + 'namePretty': 'Warsaw', + 'regionPrecision': 'city', + 'cities': [], + 'serverCount': 10 + } + ], + 'continent': 'Europe', + 'countryIsoCode': 'PL', + 'latitude': 19.024892893585005, + 'longitude': 52.28108864533875, + 'name': 'eu-pl', + 'namePretty': 'Poland', + 'regionPrecision': 'country', + 'serverCount': 10 + }, + { + 'cities': [ + { + 'continent': 'Europe', + 'countryIsoCode': 'PT', + 'latitude': -9.147228703563579, + 'longitude': 38.710135849248005, + 'name': 'eu-lx', + 'namePretty': 'Lisbon', + 'regionPrecision': 'city', + 'cities': [], + 'serverCount': 10 + } + ], + 'continent': 'Europe', + 'countryIsoCode': 'PT', + 'latitude': -8.176493493980258, + 'longitude': 39.70811236319081, + 'name': 'eu-pt', + 'namePretty': 'Portugal', + 'regionPrecision': 'country', + 'serverCount': 10 + }, + { + 'cities': [ + { + 'continent': 'Europe', + 'countryIsoCode': 'RO', + 'latitude': 26.088066758780734, + 'longitude': 44.427599839299766, + 'name': 'eu-buh', + 'namePretty': 'Bucharest', + 'regionPrecision': 'city', + 'cities': [], + 'serverCount': 10 + } + ], + 'continent': 'Europe', + 'countryIsoCode': 'RO', + 'latitude': 24.487998207239613, + 'longitude': 45.86405473062903, + 'name': 'eu-ro', + 'namePretty': 'Romania', + 'regionPrecision': 'country', + 'serverCount': 10 + }, + { + 'cities': [ + { + 'continent': 'Asia', + 'countryIsoCode': 'SG', + 'latitude': 103.85019137019486, + 'longitude': 1.2900135414450815, + 'name': 'sg-sg', + 'namePretty': 'Singapore', + 'regionPrecision': 'city', + 'cities': [], + 'serverCount': 10 + } + ], + 'continent': 'Asia', + 'countryIsoCode': 'SG', + 'latitude': 103.7967572191037, + 'longitude': 1.3827725407524207, 'name': 'asia-sg', 'namePretty': 'Singapore', - 'countryIsoCode': 'SG' + 'regionPrecision': 'country', + 'serverCount': 10 }, { - 'continent': 'europe', + 'cities': [ + { + 'continent': 'Africa', + 'countryIsoCode': 'ZA', + 'latitude': 28.008016717693355, + 'longitude': -26.237944409899388, + 'name': 'za-joh', + 'namePretty': 'Johannesburg', + 'regionPrecision': 'city', + 'cities': [], + 'serverCount': 10 + } + ], + 'continent': 'Africa', + 'countryIsoCode': 'ZA', + 'latitude': 24.58123253279367, + 'longitude': -28.79628000298281, + 'name': 'af-za', + 'namePretty': 'South Africa', + 'regionPrecision': 'country', + 'serverCount': 10 + }, + { + 'cities': [ + { + 'continent': 'Europe', + 'countryIsoCode': 'ES', + 'latitude': 2.1688887061063165, + 'longitude': 41.38986582067356, + 'name': 'es-brc', + 'namePretty': 'Barcelona', + 'regionPrecision': 'city', + 'cities': [], + 'serverCount': 4 + }, + { + 'continent': 'Europe', + 'countryIsoCode': 'ES', + 'latitude': -3.7026954544494375, + 'longitude': 40.41672352220537, + 'name': 'eu-mad', + 'namePretty': 'Madrid', + 'regionPrecision': 'city', + 'cities': [], + 'serverCount': 5 + } + ], + 'continent': 'Europe', + 'countryIsoCode': 'ES', + 'latitude': -3.75094389818205, + 'longitude': 40.38042512259182, 'name': 'eu-es', 'namePretty': 'Spain', - 'countryIsoCode': 'ES' + 'regionPrecision': 'country', + 'serverCount': 9 }, { - 'continent': 'europe', + 'cities': [ + { + 'continent': 'Europe', + 'countryIsoCode': 'SE', + 'latitude': 18.070693012371176, + 'longitude': 59.3252046597925, + 'name': 'eu-arn', + 'namePretty': 'Stockholm', + 'regionPrecision': 'city', + 'cities': [], + 'serverCount': 10 + } + ], + 'continent': 'Europe', + 'countryIsoCode': 'SE', + 'latitude': 16.096880065151236, + 'longitude': 63.29228015205717, + 'name': 'eu-se', + 'namePretty': 'Sweden', + 'regionPrecision': 'country', + 'serverCount': 10 + }, + { + 'cities': [ + { + 'continent': 'Europe', + 'countryIsoCode': 'CH', + 'latitude': 8.54168041057166, + 'longitude': 47.37212922182809, + 'name': 'ch-zrh', + 'namePretty': 'Zurich', + 'regionPrecision': 'city', + 'cities': [], + 'serverCount': 3 + } + ], + 'continent': 'Europe', + 'countryIsoCode': 'CH', + 'latitude': 8.230034125189793, + 'longitude': 46.82176055287081, 'name': 'eu-ch', 'namePretty': 'Switzerland', - 'countryIsoCode': 'CH' + 'regionPrecision': 'country', + 'serverCount': 3 }, { - 'continent': 'north-america', - 'name': 'us-central', - 'namePretty': 'USA (Central)', - 'countryIsoCode': 'US' + 'cities': [ + { + 'continent': 'North-America', + 'countryIsoCode': 'US', + 'latitude': -77.47774982785495, + 'longitude': 39.03002630109117, + 'name': 'us-ash', + 'namePretty': 'Ashburn', + 'regionPrecision': 'city', + 'cities': [], + 'serverCount': 10 + }, + { + 'continent': 'North-America', + 'countryIsoCode': 'US', + 'latitude': -84.37330216158185, + 'longitude': 33.75708620650122, + 'name': 'us-atl', + 'namePretty': 'Atlanta', + 'regionPrecision': 'city', + 'cities': [], + 'serverCount': 10 + }, + { + 'continent': 'North-America', + 'countryIsoCode': 'US', + 'latitude': -87.65009116519116, + 'longitude': 41.84985765685892, + 'name': 'us-chi', + 'namePretty': 'Chicago', + 'regionPrecision': 'city', + 'cities': [], + 'serverCount': 5 + }, + { + 'continent': 'North-America', + 'countryIsoCode': 'US', + 'latitude': -104.99313771530903, + 'longitude': 39.74680190141621, + 'name': 'us-den', + 'namePretty': 'Denver', + 'regionPrecision': 'city', + 'cities': [], + 'serverCount': 10 + }, + { + 'continent': 'North-America', + 'countryIsoCode': 'US', + 'latitude': -96.8067432098152, + 'longitude': 32.78321563339313, + 'name': 'us-dfw', + 'namePretty': 'Dallas', + 'regionPrecision': 'city', + 'cities': [], + 'serverCount': 12 + }, + { + 'continent': 'North-America', + 'countryIsoCode': 'US', + 'latitude': -118.30039020568758, + 'longitude': 34.118819662669615, + 'name': 'us-la', + 'namePretty': 'Los Angeles', + 'regionPrecision': 'city', + 'cities': [], + 'serverCount': 10 + }, + { + 'continent': 'North-America', + 'countryIsoCode': 'US', + 'latitude': -80.21225580786931, + 'longitude': 25.74633172978829, + 'name': 'us-mia', + 'namePretty': 'Miami', + 'regionPrecision': 'city', + 'cities': [], + 'serverCount': 10 + }, + { + 'continent': 'North-America', + 'countryIsoCode': 'US', + 'latitude': -74.00615560237677, + 'longitude': 40.714292433330336, + 'name': 'us-nyc', + 'namePretty': 'New York City', + 'regionPrecision': 'city', + 'cities': [], + 'serverCount': 18 + }, + { + 'continent': 'North-America', + 'countryIsoCode': 'US', + 'latitude': -122.33217344138617, + 'longitude': 47.60636039205189, + 'name': 'us-sea', + 'namePretty': 'Seattle', + 'regionPrecision': 'city', + 'cities': [], + 'serverCount': 10 + }, + { + 'continent': 'North-America', + 'countryIsoCode': 'US', + 'latitude': -121.89499986041636, + 'longitude': 37.33935623583346, + 'name': 'us-sjc', + 'namePretty': 'San Jose', + 'regionPrecision': 'city', + 'cities': [], + 'serverCount': 15 + } + ], + 'continent': 'North-America', + 'countryIsoCode': 'US', + 'latitude': -101.69432971778862, + 'longitude': 39.338586642335414, + 'name': 'na-usa', + 'namePretty': 'USA', + 'regionPrecision': 'country', + 'serverCount': 110 }, { - 'continent': 'north-america', - 'name': 'us-east', - 'namePretty': 'USA (East)', - 'countryIsoCode': 'US' - }, - { - 'continent': 'north-america', - 'name': 'us-west', - 'namePretty': 'USA (West)', - 'countryIsoCode': 'US' - }, - { - 'continent': 'europe', - 'name': 'eu-en', - 'namePretty': 'United Kingdom', - 'countryIsoCode': 'GB' + 'cities': [ + { + 'continent': 'Europe', + 'countryIsoCode': 'UA', + 'latitude': 30.515942430190414, + 'longitude': 50.458272443027305, + 'name': 'eu-ky', + 'namePretty': 'Kyiv', + 'regionPrecision': 'city', + 'cities': [], + 'serverCount': 10 + } + ], + 'continent': 'Europe', + 'countryIsoCode': 'UA', + 'latitude': 31.270893817426348, + 'longitude': 49.125122273171755, + 'name': 'eu-ua', + 'namePretty': 'Ukraine', + 'regionPrecision': 'country', + 'serverCount': 10 } ] From bdf524a129ec913e79462d83bc4c835040b0d94a Mon Sep 17 00:00:00 2001 From: Simon Hong Date: Tue, 27 Aug 2024 11:29:32 +0900 Subject: [PATCH 23/31] Fixed test failures --- components/brave_vpn/browser/BUILD.gn | 1 + .../browser/brave_vpn_service_unittest.cc | 33 ++- .../brave_vpn_region_data_helper.cc | 6 +- .../system_vpn_connection_api_unittest.cc | 212 ++++++++++++------ 4 files changed, 173 insertions(+), 79 deletions(-) diff --git a/components/brave_vpn/browser/BUILD.gn b/components/brave_vpn/browser/BUILD.gn index e257e34d8fc..f78fde79075 100644 --- a/components/brave_vpn/browser/BUILD.gn +++ b/components/brave_vpn/browser/BUILD.gn @@ -56,6 +56,7 @@ source_set("unit_tests") { "//brave/components/brave_vpn/browser/connection:common", "//brave/components/brave_vpn/browser/connection/wireguard/credentials:unit_tests", "//brave/components/brave_vpn/common", + "//brave/components/brave_vpn/common/mojom", "//brave/components/skus/browser", "//brave/components/skus/common", "//brave/components/skus/common:mojom", diff --git a/components/brave_vpn/browser/brave_vpn_service_unittest.cc b/components/brave_vpn/browser/brave_vpn_service_unittest.cc index 90c768c22f0..c4eb755dfda 100644 --- a/components/brave_vpn/browser/brave_vpn_service_unittest.cc +++ b/components/brave_vpn/browser/brave_vpn_service_unittest.cc @@ -27,6 +27,7 @@ #include "brave/components/brave_vpn/common/brave_vpn_constants.h" #include "brave/components/brave_vpn/common/brave_vpn_utils.h" #include "brave/components/brave_vpn/common/features.h" +#include "brave/components/brave_vpn/common/mojom/brave_vpn.mojom.h" #include "brave/components/brave_vpn/common/pref_names.h" #include "brave/components/skus/browser/pref_names.h" #include "brave/components/skus/browser/skus_context_impl.h" @@ -298,17 +299,6 @@ class BraveVPNServiceTest : public testing::Test { #if !BUILDFLAG(IS_ANDROID) bool& wait_region_data_ready() { return service_->wait_region_data_ready_; } - mojom::Region device_region() const { - if (auto region_ptr = - GetRegionPtrWithNameFromRegionList(GetBraveVPNConnectionManager() - ->GetRegionDataManager() - .GetDeviceRegion(), - regions())) { - return *(region_ptr.Clone()); - } - return mojom::Region(); - } - skus::mojom::SkusResultPtr MakeSkusResult(const std::string& result) { return skus::mojom::SkusResult::New(skus::mojom::SkusResultCode::Ok, result); @@ -533,6 +523,12 @@ class BraveVPNServiceTest : public testing::Test { EXPECT_TRUE(observer->GetPurchasedState().has_value()); EXPECT_EQ(observer->GetPurchasedState().value(), state); } + + void GetAllRegions(BraveVpnService::ResponseCallback callback) { + service_->api_request_->GetServerRegions( + std::move(callback), brave_vpn::mojom::kRegionPrecisionCityByCountry); + } + #if !BUILDFLAG(IS_ANDROID) std::unique_ptr connection_manager_; #endif @@ -549,6 +545,21 @@ class BraveVPNServiceTest : public testing::Test { base::HistogramTester histogram_tester_; }; +TEST_F(BraveVPNServiceTest, ResponseSanitizingTest) { + // Give invalid json data as a server response and check sanitized(empty + // string) result is returned. + SetInterceptorResponse("{'invalid json':"); + base::RunLoop loop; + GetAllRegions(base::BindOnce( + [](base::OnceClosure callback, const std::string& region_list, + bool success) { + EXPECT_TRUE(region_list.empty()); + std::move(callback).Run(); + }, + loop.QuitClosure())); + loop.Run(); +} + #if !BUILDFLAG(IS_ANDROID) TEST_F(BraveVPNServiceTest, SkusCredentialCacheTest) { std::string env = skus::GetDefaultEnvironment(); diff --git a/components/brave_vpn/browser/connection/brave_vpn_region_data_helper.cc b/components/brave_vpn/browser/connection/brave_vpn_region_data_helper.cc index c10b990c194..c44c900a23e 100644 --- a/components/brave_vpn/browser/connection/brave_vpn_region_data_helper.cc +++ b/components/brave_vpn/browser/connection/brave_vpn_region_data_helper.cc @@ -67,9 +67,9 @@ bool IsValidRegionValue(const base::Value::Dict& value) { !value.FindString(kRegionCountryIsoCodeKey) || !value.FindString(kRegionPrecisionKey) || !value.FindList(kRegionCitiesKey) || - !value.FindString(kRegionLatitudeKey) || - !value.FindString(kRegionLongitudeKey) || - !value.FindString(kRegionServerCountKey)) { + !value.FindDouble(kRegionLatitudeKey) || + !value.FindDouble(kRegionLongitudeKey) || + !value.FindInt(kRegionServerCountKey)) { return false; } diff --git a/components/brave_vpn/browser/connection/ikev2/system_vpn_connection_api_unittest.cc b/components/brave_vpn/browser/connection/ikev2/system_vpn_connection_api_unittest.cc index d3e4fc86f3e..79c22575c7f 100644 --- a/components/brave_vpn/browser/connection/ikev2/system_vpn_connection_api_unittest.cc +++ b/components/brave_vpn/browser/connection/ikev2/system_vpn_connection_api_unittest.cc @@ -147,65 +147,147 @@ class SystemVPNConnectionAPIUnitTest : public testing::Test { ])"; } + // Use 6 countries data for test. std::string GetRegionsData() { - // Give 11 region data. return R"([ - { - "continent": "europe", - "name": "eu-es", - "name-pretty": "Spain" - }, - { - "continent": "south-america", - "name": "sa-br", - "name-pretty": "Brazil" - }, - { - "continent": "europe", - "name": "eu-ch", - "name-pretty": "Switzerland" - }, - { - "continent": "europe", - "name": "eu-de", - "name-pretty": "Germany" - }, - { - "continent": "asia", - "name": "asia-sg", - "name-pretty": "Singapore" - }, - { - "continent": "north-america", - "name": "ca-east", - "name-pretty": "Canada" - }, - { - "continent": "asia", - "name": "asia-jp", - "name-pretty": "Japan" - }, - { - "continent": "europe", - "name": "eu-en", - "name-pretty": "United Kingdom" - }, - { - "continent": "europe", - "name": "eu-nl", - "name-pretty": "Netherlands" - }, - { - "continent": "north-america", - "name": "us-west", - "name-pretty": "USA West" - }, - { - "continent": "oceania", - "name": "au-au", - "name-pretty": "Australia" - } - ])"; + { + "cities": [ + { + "continent": "Oceania", + "country-iso-code": "AU", + "latitude": 151.2070530275259, + "longitude": -33.867749537753284, + "name": "au-syd", + "name-pretty": "Sydney", + "region-precision": "city", + "cities": [], + "server-count": 8 + } + ], + "continent": "Oceania", + "country-iso-code": "AU", + "latitude": 133.79969396159765, + "longitude": -23.62305911440252, + "name": "ocn-aus", + "name-pretty": "Australia", + "region-precision": "country", + "server-count": 8 + }, + { + "cities": [ + { + "continent": "Europe", + "country-iso-code": "AT", + "latitude": 16.361628116335655, + "longitude": 48.20392172247492, + "name": "eu-vie", + "name-pretty": "Vienna", + "region-precision": "city", + "cities": [], + "server-count": 10 + } + ], + "continent": "Europe", + "country-iso-code": "AT", + "latitude": 13.833811946421187, + "longitude": 47.490394433887666, + "name": "eu-at", + "name-pretty": "Austria", + "region-precision": "country", + "server-count": 10 + }, + { + "cities": [ + { + "continent": "Europe", + "country-iso-code": "BE", + "latitude": 4.374847958682745, + "longitude": 50.838778068842664, + "name": "eu-bx", + "name-pretty": "Brussels", + "region-precision": "city", + "cities": [], + "server-count": 10 + } + ], + "continent": "Europe", + "country-iso-code": "BE", + "latitude": 4.733776325426172, + "longitude": 50.712750850845715, + "name": "eu-be", + "name-pretty": "Belgium", + "region-precision": "country", + "server-count": 10 + }, + { + "cities": [ + { + "continent": "Asia", + "country-iso-code": "SG", + "latitude": 103.85019137019486, + "longitude": 1.2900135414450815, + "name": "sg-sg", + "name-pretty": "Singapore", + "region-precision": "city", + "cities": [], + "server-count": 10 + } + ], + "continent": "Asia", + "country-iso-code": "SG", + "latitude": 103.7967572191037, + "longitude": 1.3827725407524207, + "name": "asia-sg", + "name-pretty": "Singapore", + "region-precision": "country", + "server-count": 10 + }, + { + "cities": [ + { + "continent": "South-America", + "country-iso-code": "BR", + "latitude": -46.63611733672991, + "longitude": -23.547575340603583, + "name": "sa-sao", + "name-pretty": "Sao Paulo", + "region-precision": "city", + "cities": [], + "server-count": 5 + } + ], + "continent": "South-America", + "country-iso-code": "BR", + "latitude": -48.99593985069093, + "longitude": -12.240989380800045, + "name": "sa-brz", + "name-pretty": "Brazil", + "region-precision": "country", + "server-count": 5 + }, + { + "cities": [ + { + "continent": "North-America", + "country-iso-code": "CA", + "latitude": -79.39835761830456, + "longitude": 43.7064997964195, + "name": "ca-tor", + "name-pretty": "Toronto", + "region-precision": "city", + "cities": [], + "server-count": 5 + } + ], + "continent": "North-America", + "country-iso-code": "CA", + "latitude": -103.18476973580967, + "longitude": 58.781368758466364, + "name": "na-can", + "name-pretty": "Canada", + "region-precision": "country", + "server-count": 5 + }])"; } BraveVPNConnectionManager* GetBraveVPNConnectionManager() const { @@ -238,15 +320,15 @@ class SystemVPNConnectionAPIUnitTest : public testing::Test { .NeedToUpdateRegionData(); } - mojom::Region device_region() { + mojom::RegionPtr device_region() { if (auto region_ptr = GetRegionPtrWithNameFromRegionList(GetBraveVPNConnectionManager() ->GetRegionDataManager() .GetDeviceRegion(), regions())) { - return *(region_ptr.Clone()); + return region_ptr.Clone(); } - return mojom::Region(); + return nullptr; } const std::vector& regions() { @@ -283,7 +365,7 @@ class SystemVPNConnectionAPIUnitTest : public testing::Test { TEST_F(SystemVPNConnectionAPIUnitTest, LoadRegionDataFromPrefsTest) { // Initially, prefs doesn't have region data. - EXPECT_EQ(mojom::Region(), device_region()); + EXPECT_FALSE(device_region()); EXPECT_TRUE(regions().empty()); // Set proper data to store them in prefs. @@ -292,7 +374,7 @@ TEST_F(SystemVPNConnectionAPIUnitTest, LoadRegionDataFromPrefsTest) { OnFetchTimezones(GetTimeZonesData(), true); // Check region data is set with above data. - EXPECT_FALSE(mojom::Region() == device_region()); + EXPECT_TRUE(device_region()); EXPECT_FALSE(regions().empty()); // Clear region data from api instance. @@ -306,7 +388,7 @@ TEST_F(SystemVPNConnectionAPIUnitTest, LoadRegionDataFromPrefsTest) { TEST_F(SystemVPNConnectionAPIUnitTest, RegionDataTest) { // Initially, prefs doesn't have region data. - EXPECT_EQ(mojom::Region(), device_region()); + EXPECT_FALSE(device_region()); EXPECT_TRUE(regions().empty()); // Test invalid region data. @@ -315,7 +397,7 @@ TEST_F(SystemVPNConnectionAPIUnitTest, RegionDataTest) { // Test valid region data parsing. OnFetchRegionList(GetRegionsData(), true); - const size_t kRegionCount = 11; + const size_t kRegionCount = 6; EXPECT_EQ(kRegionCount, regions().size()); // First region in region list is set as a device region when fetch is failed. @@ -328,7 +410,7 @@ TEST_F(SystemVPNConnectionAPIUnitTest, RegionDataTest) { SetFallbackDeviceRegion(); SetTestTimezone("Asia/Seoul"); OnFetchTimezones(GetTimeZonesData(), true); - EXPECT_EQ("asia-sg", device_region().name); + EXPECT_EQ("asia-sg", device_region()->name); // Test device region is not changed when invalid timezone is set. SetFallbackDeviceRegion(); From 6a86f93ebcf30944017ad1056aca8267688879e1 Mon Sep 17 00:00:00 2001 From: Simon Hong Date: Wed, 28 Aug 2024 16:43:58 +0900 Subject: [PATCH 24/31] VPN server selection UI on desktop --- .../brave_vpn_localized_string_provider.cc | 10 + .../browser/api/brave_vpn_api_request.cc | 19 -- .../browser/api/brave_vpn_api_request.h | 2 - .../brave_vpn/browser/brave_vpn_service.cc | 33 +++- .../brave_vpn/browser/brave_vpn_service.h | 5 +- .../browser/brave_vpn_service_unittest.cc | 44 +++++ .../brave_vpn_region_data_helper.cc | 21 ++- .../brave_vpn_region_data_manager.cc | 24 ++- .../brave_vpn_region_data_manager.h | 1 + .../browser/connection/connection_api_impl.cc | 2 +- .../system_vpn_connection_api_unittest.cc | 29 +-- .../brave_vpn/common/brave_vpn_constants.h | 3 - .../brave_vpn/common/mojom/brave_vpn.mojom | 6 +- .../resources/panel/api/region_interface.ts | 14 -- .../resources/panel/components/flag/index.tsx | 3 +- .../panel/components/main-panel/index.tsx | 27 ++- .../panel/components/main-panel/style.ts | 15 +- .../components/select-region-list/index.tsx | 177 ++++++++++++++++-- .../components/select-region-list/style.ts | 122 +++++++++--- .../resources/panel/state/actions.ts | 2 + .../brave_vpn/resources/panel/state/async.ts | 72 ++++--- .../resources/panel/state/reducer.ts | 9 + .../resources/panel/stories/locale.ts | 5 + .../resources/panel/stories/mock-data/api.ts | 1 + .../panel/stories/mock-data/region-list.ts | 69 +++++++ components/resources/brave_vpn_strings.grdp | 20 ++ ui/webui/resources/BUILD.gn | 1 + 27 files changed, 595 insertions(+), 141 deletions(-) delete mode 100644 components/brave_vpn/resources/panel/api/region_interface.ts diff --git a/browser/ui/webui/brave_vpn/brave_vpn_localized_string_provider.cc b/browser/ui/webui/brave_vpn/brave_vpn_localized_string_provider.cc index aa1feca8898..771b2c17d99 100644 --- a/browser/ui/webui/brave_vpn/brave_vpn_localized_string_provider.cc +++ b/browser/ui/webui/brave_vpn/brave_vpn_localized_string_provider.cc @@ -50,6 +50,16 @@ void AddLocalizedStrings(content::WebUIDataSource* html_source) { {"braveVpnLoading", IDS_BRAVE_VPN_LOADING}, {"braveVpnPurchaseFailed", IDS_BRAVE_VPN_PURCHASE_FAILED}, {"braveVpnSelectYourServer", IDS_BRAVE_VPN_SELECT_YOUR_SERVER}, + {"braveVpnServerSelectionCountryInfo", + IDS_BRAVE_VPN_SERVER_SELECTION_COUNTRY_INFO}, + {"braveVpnServerSelectionCityInfo", + IDS_BRAVE_VPN_SERVER_SELECTION_CITY_INFO}, + {"braveVpnServerSelectionAutomaticLabel", + IDS_BRAVE_VPN_SERVER_SELECTION_AUTOMATIC_LABEL}, + {"braveVpnServerSelectionOptimalLabel", + IDS_BRAVE_VPN_SERVER_SELECTION_OPTIMAL_LABEL}, + {"braveVpnServerSelectionOptimalDesc", + IDS_BRAVE_VPN_SERVER_SELECTION_OPTIMAL_DESC}, {"braveVpnSelectPanelBackButtonAriaLabel", IDS_BRAVE_VPN_PANEL_GO_TO_MAIN_BUTTON_ARIA_LABEL}, {"braveVpnSupportTicketFailed", IDS_BRAVE_VPN_SUPPORT_TICKET_FAILED}, diff --git a/components/brave_vpn/browser/api/brave_vpn_api_request.cc b/components/brave_vpn/browser/api/brave_vpn_api_request.cc index 15572942d9a..88f785619ff 100644 --- a/components/brave_vpn/browser/api/brave_vpn_api_request.cc +++ b/components/brave_vpn/browser/api/brave_vpn_api_request.cc @@ -80,25 +80,6 @@ void BraveVpnAPIRequest::GetTimezonesForRegions(ResponseCallback callback) { OAuthRequest(base_url, "GET", "", std::move(internal_callback)); } -void BraveVpnAPIRequest::GetHostnamesForRegion(ResponseCallback callback, - const std::string& region) { - DCHECK(!region.empty()); - static bool dump_sent = false; - if (!dump_sent && region.empty()) { - base::debug::DumpWithoutCrashing(); - dump_sent = true; - } - - auto internal_callback = - base::BindOnce(&BraveVpnAPIRequest::OnGetResponse, - weak_ptr_factory_.GetWeakPtr(), std::move(callback)); - GURL base_url = GetURLWithPath(kVpnHost, kHostnameForRegion); - base::Value::Dict dict; - dict.Set("region", region); - std::string request_body = CreateJSONRequestBody(dict); - OAuthRequest(base_url, "POST", request_body, std::move(internal_callback)); -} - void BraveVpnAPIRequest::GetHostnamesForRegion( ResponseCallback callback, const std::string& region, diff --git a/components/brave_vpn/browser/api/brave_vpn_api_request.h b/components/brave_vpn/browser/api/brave_vpn_api_request.h index a8d6e440743..46e5984c671 100644 --- a/components/brave_vpn/browser/api/brave_vpn_api_request.h +++ b/components/brave_vpn/browser/api/brave_vpn_api_request.h @@ -36,8 +36,6 @@ class BraveVpnAPIRequest { void GetServerRegions(ResponseCallback callback, const std::string& region_precision); void GetTimezonesForRegions(ResponseCallback callback); - void GetHostnamesForRegion(ResponseCallback callback, - const std::string& region); void GetHostnamesForRegion(ResponseCallback callback, const std::string& region, const std::string& region_precision); diff --git a/components/brave_vpn/browser/brave_vpn_service.cc b/components/brave_vpn/browser/brave_vpn_service.cc index 3574d487011..77962e35fe0 100644 --- a/components/brave_vpn/browser/brave_vpn_service.cc +++ b/components/brave_vpn/browser/brave_vpn_service.cc @@ -192,6 +192,7 @@ void BraveVpnService::OnRegionDataReady(bool success) { void BraveVpnService::OnSelectedRegionChanged(const std::string& region_name) { const auto region_ptr = GetRegionPtrWithNameFromRegionList( region_name, connection_manager_->GetRegionDataManager().GetRegions()); + region_ptr->is_automatic = IsCurrentRegionSelectedAutomatically(region_ptr); for (const auto& obs : observers_) { obs->OnSelectedRegionChanged(region_ptr.Clone()); } @@ -253,17 +254,24 @@ void BraveVpnService::GetSelectedRegion(GetSelectedRegionCallback callback) { auto region_name = connection_manager_->GetRegionDataManager().GetSelectedRegion(); - std::move(callback).Run(GetRegionPtrWithNameFromRegionList( - region_name, connection_manager_->GetRegionDataManager().GetRegions())); + auto region_ptr = GetRegionPtrWithNameFromRegionList( + region_name, connection_manager_->GetRegionDataManager().GetRegions()); + region_ptr->is_automatic = IsCurrentRegionSelectedAutomatically(region_ptr); + std::move(callback).Run(std::move(region_ptr)); } void BraveVpnService::SetSelectedRegion(mojom::RegionPtr region_ptr) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - VLOG(2) << __func__ << " : " << region_ptr->name_pretty; + VLOG(2) << __func__ << " : " << region_ptr->name; connection_manager_->SetSelectedRegion(region_ptr->name); } +void BraveVpnService::ClearSelectedRegion() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + connection_manager_->SetSelectedRegion(""); +} + void BraveVpnService::GetProductUrls(GetProductUrlsCallback callback) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); std::move(callback).Run(mojom::ProductUrls::New( @@ -377,6 +385,20 @@ void BraveVpnService::UpdatePurchasedStateForSessionExpired( SetPurchasedState(env, PurchasedState::SESSION_EXPIRED); } + +bool BraveVpnService::IsCurrentRegionSelectedAutomatically( + const brave_vpn::mojom::RegionPtr& region) { + const auto selected_region_name = + local_prefs_->GetString(prefs::kBraveVPNSelectedRegion); + + if (region->region_precision == brave_vpn::mojom::kRegionPrecisionCountry && + selected_region_name.empty()) { + return true; + } + + return false; +} + #endif // !BUILDFLAG(IS_ANDROID) void BraveVpnService::GetAllRegions(const std::string& region_precision, @@ -894,11 +916,6 @@ void BraveVpnService::GetTimezonesForRegions(ResponseCallback callback) { api_request_->GetTimezonesForRegions(std::move(callback)); } -void BraveVpnService::GetHostnamesForRegion(ResponseCallback callback, - const std::string& region) { - api_request_->GetHostnamesForRegion(std::move(callback), region); -} - void BraveVpnService::GetHostnamesForRegion( ResponseCallback callback, const std::string& region, diff --git a/components/brave_vpn/browser/brave_vpn_service.h b/components/brave_vpn/browser/brave_vpn_service.h index f88d9556208..66e2c2ee008 100644 --- a/components/brave_vpn/browser/brave_vpn_service.h +++ b/components/brave_vpn/browser/brave_vpn_service.h @@ -101,6 +101,7 @@ class BraveVpnService : void Disconnect() override; void GetSelectedRegion(GetSelectedRegionCallback callback) override; void SetSelectedRegion(mojom::RegionPtr region) override; + void ClearSelectedRegion() override; void GetProductUrls(GetProductUrlsCallback callback) override; void CreateSupportTicket(const std::string& email, const std::string& subject, @@ -131,8 +132,6 @@ class BraveVpnService : GetAllRegionsCallback callback) override; void GetTimezonesForRegions(ResponseCallback callback); - void GetHostnamesForRegion(ResponseCallback callback, - const std::string& region); void GetHostnamesForRegion(ResponseCallback callback, const std::string& region, const std::string& region_precision); @@ -199,6 +198,8 @@ class BraveVpnService : void OnPreferenceChanged(const std::string& pref_name); void UpdatePurchasedStateForSessionExpired(const std::string& env); + bool IsCurrentRegionSelectedAutomatically( + const brave_vpn::mojom::RegionPtr& region); #endif // !BUILDFLAG(IS_ANDROID) // KeyedService overrides: diff --git a/components/brave_vpn/browser/brave_vpn_service_unittest.cc b/components/brave_vpn/browser/brave_vpn_service_unittest.cc index c4eb755dfda..130fda86a42 100644 --- a/components/brave_vpn/browser/brave_vpn_service_unittest.cc +++ b/components/brave_vpn/browser/brave_vpn_service_unittest.cc @@ -317,6 +317,20 @@ class BraveVPNServiceTest : public testing::Test { GetBraveVPNConnectionManager()->SetSelectedRegion(region); } + std::string GetSelectedRegion() { + return GetBraveVPNConnectionManager() + ->GetRegionDataManager() + .GetSelectedRegion(); + } + + std::string GetDeviceRegion() { + return GetBraveVPNConnectionManager() + ->GetRegionDataManager() + .GetDeviceRegion(); + } + + void ClearSelectedRegion() { service_->ClearSelectedRegion(); } + void OnFetchRegionList(const std::string& region_list, bool success) { GetBraveVPNConnectionManager()->GetRegionDataManager().OnFetchRegionList( region_list, success); @@ -782,6 +796,36 @@ TEST_F(BraveVPNServiceTest, SelectedRegionChangedUpdateTest) { loop.Run(); } +TEST_F(BraveVPNServiceTest, ClearSelectedRegionTest) { + TestBraveVPNServiceObserver observer; + AddObserver(observer.GetReceiver()); + + OnFetchRegionList(GetRegionsData(), true); + SetTestTimezone("Asia/Seoul"); + OnFetchTimezones(GetTimeZonesData(), true); + { + base::RunLoop loop; + observer.WaitSelectedRegionStateChange(loop.QuitClosure()); + loop.Run(); + } + + SetSelectedRegion("sa-br"); + { + base::RunLoop loop; + observer.WaitSelectedRegionStateChange(loop.QuitClosure()); + loop.Run(); + } + EXPECT_NE(GetSelectedRegion(), GetDeviceRegion()); + + ClearSelectedRegion(); + { + base::RunLoop loop; + observer.WaitSelectedRegionStateChange(loop.QuitClosure()); + loop.Run(); + } + EXPECT_EQ(GetSelectedRegion(), GetDeviceRegion()); +} + // Check SetSelectedRegion is called when default device region is set. // We use default device region as an initial selected region. TEST_F(BraveVPNServiceTest, SelectedRegionChangedUpdateWithDeviceRegionTest) { diff --git a/components/brave_vpn/browser/connection/brave_vpn_region_data_helper.cc b/components/brave_vpn/browser/connection/brave_vpn_region_data_helper.cc index c44c900a23e..1fc91a2a1a1 100644 --- a/components/brave_vpn/browser/connection/brave_vpn_region_data_helper.cc +++ b/components/brave_vpn/browser/connection/brave_vpn_region_data_helper.cc @@ -27,11 +27,21 @@ namespace brave_vpn { mojom::RegionPtr GetRegionPtrWithNameFromRegionList( const std::string& name, const std::vector& region_list) { - auto it = base::ranges::find(region_list, name, &mojom::Region::name); - if (it != region_list.end()) { - return it->Clone(); + for (const auto& region : region_list) { + // Return if it's country precision. + if (region->name == name) { + return region.Clone(); + } else { + for (const auto& city : region->cities) { + // Try to find from cities if |name| is country precision in |region|. + if (city->name == name) { + return city.Clone(); + } + } + } } - return mojom::RegionPtr(); + + return nullptr; } base::Value::Dict GetValueFromRegionWithoutCity( @@ -105,6 +115,9 @@ mojom::RegionPtr GetRegionFromValueWithoutCity(const base::Value::Dict& value) { region->server_count = *server_count; } + // |is_automatic| is calculated in runtime. + region->is_automatic = false; + return region; } diff --git a/components/brave_vpn/browser/connection/brave_vpn_region_data_manager.cc b/components/brave_vpn/browser/connection/brave_vpn_region_data_manager.cc index f06b37d8ecb..d2bdccce5cc 100644 --- a/components/brave_vpn/browser/connection/brave_vpn_region_data_manager.cc +++ b/components/brave_vpn/browser/connection/brave_vpn_region_data_manager.cc @@ -42,13 +42,14 @@ void BraveVPNRegionDataManager::SetSelectedRegion(const std::string& name) { local_prefs_->SetString(prefs::kBraveVPNSelectedRegion, name); if (selected_region_changed_callback_) { - selected_region_changed_callback_.Run(name); + selected_region_changed_callback_.Run(GetSelectedRegion()); } } std::string BraveVPNRegionDataManager::GetSelectedRegion() const { - DCHECK(!regions_.empty()) - << "regions data must be prepared before panel asks."; + if (regions_.empty()) { + CHECK_IS_TEST(); + } auto region_name = local_prefs_->GetString(prefs::kBraveVPNSelectedRegion); if (region_name.empty()) { @@ -69,6 +70,23 @@ void BraveVPNRegionDataManager::SetDeviceRegion(const std::string& name) { local_prefs_->SetString(prefs::kBraveVPNDeviceRegion, name); } +std::string BraveVPNRegionDataManager::GetRegionPrecisionForName( + const std::string& name) const { + for (const auto& region : regions_) { + if (region->name == name) { + return brave_vpn::mojom::kRegionPrecisionCountry; + } else { + for (const auto& city : region->cities) { + if (city->name == name) { + return brave_vpn::mojom::kRegionPrecisionCity; + } + } + } + } + + NOTREACHED_NORETURN(); +} + void BraveVPNRegionDataManager::SetFallbackDeviceRegion() { // Set first item in the region list as a |device_region_| as a fallback. DCHECK(!regions_.empty()); diff --git a/components/brave_vpn/browser/connection/brave_vpn_region_data_manager.h b/components/brave_vpn/browser/connection/brave_vpn_region_data_manager.h index 7e6cb01358e..d003ee06aa8 100644 --- a/components/brave_vpn/browser/connection/brave_vpn_region_data_manager.h +++ b/components/brave_vpn/browser/connection/brave_vpn_region_data_manager.h @@ -48,6 +48,7 @@ class BraveVPNRegionDataManager { } void SetSelectedRegion(const std::string& name); std::string GetDeviceRegion() const; + std::string GetRegionPrecisionForName(const std::string& name) const; private: friend class BraveVPNServiceTest; diff --git a/components/brave_vpn/browser/connection/connection_api_impl.cc b/components/brave_vpn/browser/connection/connection_api_impl.cc index 703c5570fe1..6bf2d20217c 100644 --- a/components/brave_vpn/browser/connection/connection_api_impl.cc +++ b/components/brave_vpn/browser/connection/connection_api_impl.cc @@ -105,7 +105,7 @@ void ConnectionAPIImpl::FetchHostnamesForRegion(const std::string& name) { GetAPIRequest()->GetHostnamesForRegion( base::BindOnce(&ConnectionAPIImpl::OnFetchHostnames, base::Unretained(this), name), - name); + name, manager_->GetRegionDataManager().GetRegionPrecisionForName(name)); } void ConnectionAPIImpl::OnFetchHostnames(const std::string& region, diff --git a/components/brave_vpn/browser/connection/ikev2/system_vpn_connection_api_unittest.cc b/components/brave_vpn/browser/connection/ikev2/system_vpn_connection_api_unittest.cc index 79c22575c7f..73b75f6e1cf 100644 --- a/components/brave_vpn/browser/connection/ikev2/system_vpn_connection_api_unittest.cc +++ b/components/brave_vpn/browser/connection/ikev2/system_vpn_connection_api_unittest.cc @@ -321,13 +321,18 @@ class SystemVPNConnectionAPIUnitTest : public testing::Test { } mojom::RegionPtr device_region() { + const auto device_region_name = GetBraveVPNConnectionManager() + ->GetRegionDataManager() + .GetDeviceRegion(); + if (device_region_name.empty() || regions().empty()) { + return nullptr; + } + if (auto region_ptr = - GetRegionPtrWithNameFromRegionList(GetBraveVPNConnectionManager() - ->GetRegionDataManager() - .GetDeviceRegion(), - regions())) { + GetRegionPtrWithNameFromRegionList(device_region_name, regions())) { return region_ptr.Clone(); } + return nullptr; } @@ -450,7 +455,7 @@ TEST_F(SystemVPNConnectionAPIUnitTest, test_api->CheckConnection(); // Prepare valid connection info. - test_api->OnFetchHostnames("region-a", kHostNamesTestData, true); + test_api->OnFetchHostnames("eu-be", kHostNamesTestData, true); test_api->SetPreventCreationForTesting(true); test_api->OnGetProfileCredentials(kProfileCredentialData, true); EXPECT_TRUE(connection_info().IsValid()); @@ -468,9 +473,9 @@ TEST_F(SystemVPNConnectionAPIUnitTest, CreateOSVPNEntryWithInvalidInfoTest) { auto* test_api = GetConnectionAPI(); test_api->CheckConnection(); - local_state()->SetString(prefs::kBraveVPNSelectedRegion, "region-a"); + local_state()->SetString(prefs::kBraveVPNSelectedRegion, "eu-be"); // Prepare valid connection info. - test_api->OnFetchHostnames("region-a", kHostNamesTestData, true); + test_api->OnFetchHostnames("eu-be", kHostNamesTestData, true); test_api->SetPreventCreationForTesting(true); test_api->OnGetProfileCredentials(kProfileCredentialData, true); ResetConnectionInfo(); @@ -491,7 +496,7 @@ TEST_F(SystemVPNConnectionAPIUnitTest, NeedsConnectTest) { // Check ignore Connect() request while connecting or disconnecting is // in-progress. - local_state()->SetString(prefs::kBraveVPNSelectedRegion, "eu-es"); + local_state()->SetString(prefs::kBraveVPNSelectedRegion, "eu-be"); test_api->connection_state_ = mojom::ConnectionState::CONNECTING; test_api->Connect(); EXPECT_EQ(mojom::ConnectionState::CONNECTING, test_api->GetConnectionState()); @@ -537,13 +542,13 @@ TEST_F(SystemVPNConnectionAPIUnitTest, HostnamesTest) { auto* test_api = GetConnectionAPI(); // Set valid hostnames list test_api->hostname_.reset(); - test_api->OnFetchHostnames("region-a", kHostNamesTestData, true); + test_api->OnFetchHostnames("eu-be", kHostNamesTestData, true); // Check best one is picked from fetched hostname list. EXPECT_EQ("host-2.brave.com", test_api->hostname_->hostname); // Can't get hostname from invalid hostnames list test_api->hostname_.reset(); - test_api->OnFetchHostnames("invalid-region-b", "", false); + test_api->OnFetchHostnames("eu-be", "", false); EXPECT_FALSE(test_api->hostname_); } @@ -553,7 +558,7 @@ TEST_F(SystemVPNConnectionAPIUnitTest, ConnectionInfoTest) { // Check valid connection info is set when valid hostname and profile // credential are fetched. test_api->connection_state_ = mojom::ConnectionState::CONNECTING; - test_api->OnFetchHostnames("region-a", kHostNamesTestData, true); + test_api->OnFetchHostnames("eu-be", kHostNamesTestData, true); EXPECT_EQ(mojom::ConnectionState::CONNECTING, test_api->GetConnectionState()); // To prevent real os vpn entry creation. @@ -641,7 +646,7 @@ TEST_F(SystemVPNConnectionAPIUnitTest, auto* test_api = GetConnectionAPI(); // Prepare valid connection info. - test_api->OnFetchHostnames("region-a", kHostNamesTestData, true); + test_api->OnFetchHostnames("eu-be", kHostNamesTestData, true); test_api->OnGetProfileCredentials(kProfileCredentialData, true); const std::string last_error = "Last error"; diff --git a/components/brave_vpn/common/brave_vpn_constants.h b/components/brave_vpn/common/brave_vpn_constants.h index 48ac33bf06d..62cff1a7026 100644 --- a/components/brave_vpn/common/brave_vpn_constants.h +++ b/components/brave_vpn/common/brave_vpn_constants.h @@ -39,13 +39,10 @@ inline constexpr char kSupportTicketPartnerClientIdKey[] = "partner-client-id"; inline constexpr char kSupportTicketTimezoneKey[] = "timezone"; inline constexpr char kVpnHost[] = "connect-api.guardianapp.com"; -inline constexpr char kAllServerRegions[] = "api/v1/servers/all-server-regions"; inline constexpr char kServerRegionsWithCities[] = "api/v1.3/servers/all-server-regions/"; inline constexpr char kTimezonesForRegions[] = "api/v1.1/servers/timezones-for-regions"; -inline constexpr char kHostnameForRegion[] = - "api/v1.2/servers/hostnames-for-region"; inline constexpr char kHostnameForRegionNew[] = "api/v1.3/servers/hostnames-for-region"; inline constexpr char kProfileCredential[] = "api/v1.1/register-and-create"; diff --git a/components/brave_vpn/common/mojom/brave_vpn.mojom b/components/brave_vpn/common/mojom/brave_vpn.mojom index c486efbeed7..4c5f6f903fc 100644 --- a/components/brave_vpn/common/mojom/brave_vpn.mojom +++ b/components/brave_vpn/common/mojom/brave_vpn.mojom @@ -57,7 +57,10 @@ interface ServiceHandler { GetSelectedRegion() => (Region current_region); [EnableIfNot=is_android] - SetSelectedRegion(Region region); + SetSelectedRegion(Region? region); + + [EnableIfNot=is_android] + ClearSelectedRegion(); [EnableIfNot=is_android] GetProductUrls() => (ProductUrls urls); @@ -131,6 +134,7 @@ struct Region { double latitude; double longitude; int32 server_count; + bool is_automatic; }; const string kRegionPrecisionDefault = "default"; diff --git a/components/brave_vpn/resources/panel/api/region_interface.ts b/components/brave_vpn/resources/panel/api/region_interface.ts deleted file mode 100644 index 8bd2efe02bc..00000000000 --- a/components/brave_vpn/resources/panel/api/region_interface.ts +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright (c) 2021 The Brave Authors. All rights reserved. -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this file, -// you can obtain one at https://mozilla.org/MPL/2.0/. -export interface Region { - continent: string - name: string - namePretty: string -} -export interface RegionState { - all?: Region[] - current?: Region - hasError: boolean -} diff --git a/components/brave_vpn/resources/panel/components/flag/index.tsx b/components/brave_vpn/resources/panel/components/flag/index.tsx index 992bbdbd350..bd9182683ac 100644 --- a/components/brave_vpn/resources/panel/components/flag/index.tsx +++ b/components/brave_vpn/resources/panel/components/flag/index.tsx @@ -68,7 +68,8 @@ const COUNTRIES = [ 'UA', 'US', 'UY', - 'ZA' + 'ZA', + `WORLDWIDE` ] function Flag(props: Props) { diff --git a/components/brave_vpn/resources/panel/components/main-panel/index.tsx b/components/brave_vpn/resources/panel/components/main-panel/index.tsx index 4f8448cced6..4380de2fb0d 100644 --- a/components/brave_vpn/resources/panel/components/main-panel/index.tsx +++ b/components/brave_vpn/resources/panel/components/main-panel/index.tsx @@ -17,7 +17,8 @@ import ContactSupport from '../contact-support' import { useSelector, useDispatch } from '../../state/hooks' import * as Actions from '../../state/actions' import getPanelBrowserAPI, { - ConnectionState + ConnectionState, + REGION_PRECISION_COUNTRY } from '../../api/panel_browser_api' import Flag from '../flag' @@ -85,6 +86,7 @@ function MainPanel() { const isSelectingRegion = useSelector((state) => state.isSelectingRegion) const connectionStatus = useSelector((state) => state.connectionStatus) const expired = useSelector((state) => state.expired) + const regions = useSelector((state) => state.regions) const onSelectRegionButtonClick = () => { dispatch(Actions.toggleRegionSelector(true)) @@ -96,6 +98,20 @@ function MainPanel() { const showContactSupport = () => setContactSupportVisible(true) const closeContactSupport = () => setContactSupportVisible(false) + const getCountryNameForCurrentRegion = () => { + if (currentRegion.regionPrecision === REGION_PRECISION_COUNTRY) { + return currentRegion.namePretty + } + + for (let i = 0; i < regions.length; ++i) { + if (regions[i].cities.find((city) => city.name === currentRegion.name)) { + return regions[i].namePretty + } + } + + return currentRegion.namePretty + } + if (isContactSupportVisible) { return } @@ -117,6 +133,10 @@ function MainPanel() { return } + const regionServerLabel = + currentRegion.regionPrecision === REGION_PRECISION_COUNTRY + ? getLocale('braveVpnServerSelectionOptimalLabel') + : currentRegion.namePretty return ( @@ -149,7 +169,10 @@ function MainPanel() { onClick={onSelectRegionButtonClick} > - {currentRegion?.namePretty} + + {getCountryNameForCurrentRegion()} + {regionServerLabel} + diff --git a/components/brave_vpn/resources/panel/components/main-panel/style.ts b/components/brave_vpn/resources/panel/components/main-panel/style.ts index 3300069c42e..3407f9c02c0 100644 --- a/components/brave_vpn/resources/panel/components/main-panel/style.ts +++ b/components/brave_vpn/resources/panel/components/main-panel/style.ts @@ -72,11 +72,22 @@ export const RegionSelectorButton = styled.button` } ` +export const RegionInfo = styled.div` + display: flex; + flex-direction: column; + justify-content: center; + align-items: flex-start; + flex: 1 0 0; +` + export const RegionLabel = styled.span` color: ${color.text.primary}; font: ${font.heading.h4}; - text-align: start; - flex-grow: 1; +` + +export const RegionServerLabel = styled.span` + color: ${color.text.secondary}; + font: ${font.small.regular}; ` export const StyledAlert = styled(Alert)` diff --git a/components/brave_vpn/resources/panel/components/select-region-list/index.tsx b/components/brave_vpn/resources/panel/components/select-region-list/index.tsx index 94bc0f0b434..a0f14b68d1c 100644 --- a/components/brave_vpn/resources/panel/components/select-region-list/index.tsx +++ b/components/brave_vpn/resources/panel/components/select-region-list/index.tsx @@ -14,15 +14,66 @@ import { getLocale } from '$web-common/locale' import 'emptykit.css' +interface ConnectButtonProps { + right: string + connect: () => void +} + +function ConnectButton(props: ConnectButtonProps) { + return ( + { + event.stopPropagation() + props.connect() + }} + > + {getLocale('braveVpnConnect')} + + ) +} + +interface RegionCityProps { + cityLabel: string + serverInfo: string + selected: boolean + connectionButton: React.ReactElement +} + +function RegionCity(props: RegionCityProps) { + return ( + + + + {props.cityLabel} + + + {props.serverInfo} + + + {props.selected && ( + + )} + {props.connectionButton} + + ) +} + interface RegionContentProps { region: Region selected: boolean + open: boolean + clickHandler: (countryName: string) => void } function RegionContent(props: RegionContentProps) { const dispatch = useDispatch() - const handleConnect = () => { - dispatch(Actions.connectToNewRegion(props.region)) + const currentRegion = useSelector((state) => state.currentRegion) + const handleConnect = (region: Region) => { + dispatch(Actions.connectToNewRegion(region)) } const ref = React.useRef(null) @@ -31,27 +82,111 @@ function RegionContent(props: RegionContentProps) { if (props.selected) ref.current?.scrollIntoView() }, []) + const countryInfo = { + $1: props.region.cities.length, + $2: props.region.serverCount + } + return ( - + { + // Pass '' to toggle currently opened country. + props.clickHandler(props.open ? '' : props.region.name) + }} + > - - {props.region.namePretty} - + + + {props.region.namePretty} + + + {getLocale('braveVpnServerSelectionCountryInfo').replace( + /\$\d+/g, + (match) => countryInfo[match] + )} + + {props.selected && ( )} - - {getLocale('braveVpnConnect')} - + + {!props.open && !props.selected && ( + handleConnect(props.region)} + /> + )} + + {props.open && ( + <> + handleConnect(props.region) + })} + /> + {props.region.cities.map((city: Region) => ( + handleConnect(city) + })} + /> + ))} + + )} + + ) +} + +function RegionAutomatic() { + const dispatch = useDispatch() + const currentRegion = useSelector((state) => state.currentRegion) + const handleConnect = () => { + dispatch(Actions.connectToNewRegionAutomatically()) + } + + return ( + + + + + + {getLocale('braveVpnServerSelectionAutomaticLabel')} + + + {getLocale('braveVpnServerSelectionOptimalDesc')} + + + {currentRegion.isAutomatic && ( + + )} + {!currentRegion.isAutomatic && ( + + )} ) @@ -81,11 +216,20 @@ function SelectRegion() { const dispatch = useDispatch() const currentRegion = useSelector((state) => state.currentRegion) const regions = useSelector((state) => state.regions) + const [openedCountry, setOpenedCountry] = React.useState('') const handleGoBackClick = () => { dispatch(Actions.toggleRegionSelector(false)) } + const hasCurrentRegion = (region: Region) => { + if (currentRegion.name === region.name) { + return true + } + + return region.cities.some((city) => city.name === currentRegion.name) + } + if (!currentRegion) { console.error('Selected region is not defined') } @@ -100,11 +244,14 @@ function SelectRegion() { /> + {regions.map((region: Region) => ( setOpenedCountry(countryName)} /> ))} diff --git a/components/brave_vpn/resources/panel/components/select-region-list/style.ts b/components/brave_vpn/resources/panel/components/select-region-list/style.ts index 9c0ca21a8ee..8d14034b9de 100644 --- a/components/brave_vpn/resources/panel/components/select-region-list/style.ts +++ b/components/brave_vpn/resources/panel/components/select-region-list/style.ts @@ -6,7 +6,13 @@ import styled, { css } from 'styled-components' import Button from '@brave/leo/react/button' import Icon from '@brave/leo/react/icon' -import { color, effect, font, radius, spacing } from '@brave/leo/tokens/css/variables' +import { + color, + effect, + font, + radius, + spacing +} from '@brave/leo/tokens/css/variables' export const Box = styled.div` width: 100%; @@ -68,8 +74,10 @@ export const RegionList = styled.div` } ` -export const RegionContainer = - styled.div.attrs({ tabIndex: 0 }) <{ selected: boolean }>` +export const RegionContainer = styled.div.attrs({ tabIndex: 0 })<{ + selected: boolean + fillBackground: boolean +}>` width: 296px; display: flex; flex-direction: column; @@ -80,37 +88,29 @@ export const RegionContainer = background: ${color.container.background}; ${(p) => - p.selected + p.fillBackground && + (p.selected ? css` border: 1px solid ${color.divider.interactive}; background: ${color.container.interactive}; box-shadow: ${effect.elevation['01']}; - - leo-button { - display: none; - } ` : css` &:hover { background: ${color.container.highlight}; box-shadow: ${effect.elevation['01']}; - - leo-button { - opacity: 1; - transition: opacity 0.3s; - } } + `)} - &:has(:focus) leo-button, &:focus-visible leo-button { - opacity: 1; - } - `} + & > :last-child { + border-bottom: none; + } ` -export const RegionConnect = styled(Button)` +export const RegionConnect = styled(Button)<{ right: string }>` opacity: 0; position: absolute; - right: ${spacing.xl}; + right: ${(p) => p.right}; ` export const RegionCountry = styled.div` @@ -120,6 +120,80 @@ export const RegionCountry = styled.div` align-items: center; gap: ${spacing.m}; align-self: stretch; + + &:hover { + leo-button { + opacity: 1; + transition: opacity 0.3s; + } + } +` + +export const RegionCountryLabel = styled.span<{ selected: boolean }>` + color: ${(p) => (p.selected ? color.text.interactive : color.text.primary)}; + font: ${font.default.semibold}; + text-align: start; + flex-grow: 1; +` + +export const CountryInfo = styled.div` + display: flex; + padding-left: ${spacing.m}; + flex-direction: column; + justify-content: center; + align-items: flex-start; + flex: 1 0 0; +` + +export const CountryServerInfo = styled.div<{ selected: boolean }>` + color: ${(p) => (p.selected ? color.text.interactive : color.text.secondary)}; + font: ${font.small.regular}; +` + +export const RegionCity = styled.div<{ selected: boolean }>` + position: relative; + display: flex; + padding: ${spacing.l} ${spacing.xl}; + justify-content: flex-start; + align-items: center; + align-self: stretch; + border-bottom: 1px solid ${color.divider.subtle}; + + ${(p) => + p.selected + ? css` + background: ${color.container.interactive}; + ` + : css` + &:hover { + background: ${color.container.highlight}; + } + `} + + &:hover { + leo-button { + opacity: 1; + transition: opacity 0.3s; + } + } +` + +export const RegionCityInfo = styled.div` + display: flex; + flex-direction: column; + justify-content: center; + align-items: flex-start; + flex: 1 0 0; +` + +export const RegionCityLabel = styled.div<{ selected: boolean }>` + color: ${(p) => (p.selected ? color.text.interactive : color.text.primary)}; + font: ${font.default.regular}; +` + +export const CityServerInfo = styled.div<{ selected: boolean }>` + color: ${(p) => (p.selected ? color.text.interactive : color.text.secondary)}; + font: ${font.small.regular}; ` export const HeaderLabel = styled.span` @@ -127,21 +201,13 @@ export const HeaderLabel = styled.span` font: ${font.heading.h4}; ` -export const RegionCountryLabel = styled.span` - color: ${color.text.primary}; - font: ${font.default.semibold}; - padding-left: ${spacing.m}; - text-align: start; - flex-grow: 1; -` - export const StyledIcon = styled(Icon)` --leo-icon-size: 20px; --leo-icon-color: ${color.icon.default}; ` export const StyledCheckBox = styled(Icon)` - --leo-icon-size: 16px; + --leo-icon-size: 20px; --leo-icon-color: ${color.text.interactive}; ` diff --git a/components/brave_vpn/resources/panel/state/actions.ts b/components/brave_vpn/resources/panel/state/actions.ts index 8b6842ff432..e0e2ed0ca50 100644 --- a/components/brave_vpn/resources/panel/state/actions.ts +++ b/components/brave_vpn/resources/panel/state/actions.ts @@ -48,6 +48,8 @@ export const purchaseExpired = createAction('purchaseExpired') export const showSellView = createAction('showSellView') export const showLoadingView = createAction('showLoadingView') export const resetConnectionState = createAction('resetConnectionState') +export const connectToNewRegionAutomatically = + createAction('connectToNewRegionAutomatically') export const purchaseFailed = createAction('purchaseFailed') diff --git a/components/brave_vpn/resources/panel/state/async.ts b/components/brave_vpn/resources/panel/state/async.ts index 9d997806923..a09f9b8d529 100644 --- a/components/brave_vpn/resources/panel/state/async.ts +++ b/components/brave_vpn/resources/panel/state/async.ts @@ -5,13 +5,18 @@ import { MiddlewareAPI, Dispatch, AnyAction } from 'redux' import AsyncActionHandler from '../../../../common/AsyncActionHandler' -import getPanelBrowserAPI, { ConnectionState, PurchasedState , REGION_PRECISION_CITY_BY_COUNTRY } from '../api/panel_browser_api' +import getPanelBrowserAPI, { + ConnectionState, + PurchasedState, + REGION_PRECISION_CITY_BY_COUNTRY +} from '../api/panel_browser_api' import * as Actions from './actions' import { RootState } from './store' const handler = new AsyncActionHandler() type Store = MiddlewareAPI, any> -const getState = (store: Store) => (store.getState() as RootState) /* Helper to infer specific store type */ +const getState = (store: Store) => + store.getState() as RootState /* Helper to infer specific store type */ handler.on(Actions.connect.getType(), async () => { getPanelBrowserAPI().serviceHandler.connect() @@ -37,6 +42,11 @@ handler.on(Actions.connectToNewRegion.getType(), async (store) => { getPanelBrowserAPI().serviceHandler.connect() }) +handler.on(Actions.connectToNewRegionAutomatically.getType(), async (store) => { + getPanelBrowserAPI().serviceHandler.clearSelectedRegion() + getPanelBrowserAPI().serviceHandler.connect() +}) + handler.on(Actions.connectionStateChanged.getType(), async (store) => { const state = getState(store) @@ -50,30 +60,40 @@ handler.on(Actions.purchaseConfirmed.getType(), async (store) => { const [{ state }, { currentRegion }, { regions }] = await Promise.all([ getPanelBrowserAPI().serviceHandler.getConnectionState(), getPanelBrowserAPI().serviceHandler.getSelectedRegion(), - getPanelBrowserAPI().serviceHandler.getAllRegions(REGION_PRECISION_CITY_BY_COUNTRY) + getPanelBrowserAPI().serviceHandler.getAllRegions( + REGION_PRECISION_CITY_BY_COUNTRY + ) ]) - store.dispatch(Actions.showMainView({ - currentRegion, - regions, - connectionStatus: ((state === ConnectionState.CONNECT_FAILED) - ? ConnectionState.DISCONNECTED : state), /* Treat connection failure on startup as disconnected */ - expired: false - })) + store.dispatch( + Actions.showMainView({ + currentRegion, + regions, + connectionStatus: + state === ConnectionState.CONNECT_FAILED + ? ConnectionState.DISCONNECTED + : state /* Treat connection failure on startup as disconnected */, + expired: false + }) + ) }) handler.on(Actions.purchaseExpired.getType(), async (store) => { const [{ currentRegion }, { regions }] = await Promise.all([ getPanelBrowserAPI().serviceHandler.getSelectedRegion(), - getPanelBrowserAPI().serviceHandler.getAllRegions(REGION_PRECISION_CITY_BY_COUNTRY) + getPanelBrowserAPI().serviceHandler.getAllRegions( + REGION_PRECISION_CITY_BY_COUNTRY + ) ]) - store.dispatch(Actions.showMainView({ - currentRegion, - regions, - connectionStatus: ConnectionState.DISCONNECTED, - expired: true - })) + store.dispatch( + Actions.showMainView({ + currentRegion, + regions, + connectionStatus: ConnectionState.DISCONNECTED, + expired: true + }) + ) }) handler.on(Actions.initialize.getType(), async (store) => { @@ -82,9 +102,11 @@ handler.on(Actions.initialize.getType(), async (store) => { getPanelBrowserAPI().serviceHandler.getProductUrls() ]) - store.dispatch(Actions.initialized({ - productUrls: urls - })) + store.dispatch( + Actions.initialized({ + productUrls: urls + }) + ) if (state.state === PurchasedState.NOT_PURCHASED) { store.dispatch(Actions.showSellView()) @@ -102,10 +124,12 @@ handler.on(Actions.initialize.getType(), async (store) => { store.dispatch(Actions.showLoadingView()) } if (state.state === PurchasedState.FAILED) { - store.dispatch(Actions.purchaseFailed({ - state: PurchasedState.FAILED, - stateDescription: state.description - })) + store.dispatch( + Actions.purchaseFailed({ + state: PurchasedState.FAILED, + stateDescription: state.description + }) + ) } }) diff --git a/components/brave_vpn/resources/panel/state/reducer.ts b/components/brave_vpn/resources/panel/state/reducer.ts index 7a6c9100f84..17f6650bf0f 100644 --- a/components/brave_vpn/resources/panel/state/reducer.ts +++ b/components/brave_vpn/resources/panel/state/reducer.ts @@ -66,6 +66,15 @@ reducer.on(Actions.connectToNewRegion, (state, payload): RootState => { } }) +reducer.on(Actions.connectToNewRegionAutomatically, + (state, payload): RootState => { + return { + ...state, + isSelectingRegion: false, + hasError: false + } +}) + reducer.on(Actions.toggleRegionSelector, (state, payload): RootState => { return { ...state, diff --git a/components/brave_vpn/resources/panel/stories/locale.ts b/components/brave_vpn/resources/panel/stories/locale.ts index 06496019ca1..05a854073dc 100644 --- a/components/brave_vpn/resources/panel/stories/locale.ts +++ b/components/brave_vpn/resources/panel/stories/locale.ts @@ -42,6 +42,11 @@ provideStrings({ 'Unable to check the status of your purchase. This is probably a network problem. Try again or contact support.', braveVpnSelectPanelBackButtonAriaLabel: 'Go to main', braveVpnSelectYourServer: 'Select your server', + braveVpnServerSelectionCountryInfo: '$1 cities - $2 servers', + braveVpnServerSelectionCityInfo: '$1 servers', + braveVpnServerSelectionAutomaticLabel: 'Automatic', + braveVpnServerSelectionOptimalLabel: 'Optimal', + braveVpnServerSelectionOptimalDesc: 'Use the best server available', braveVpnEditPaymentMethod: 'Edit payment method', braveVpnPaymentFailure: 'There was a problem with your payment', braveVpnPaymentFailureReason: diff --git a/components/brave_vpn/resources/panel/stories/mock-data/api.ts b/components/brave_vpn/resources/panel/stories/mock-data/api.ts index 6a33c5eb262..77f01e5d707 100644 --- a/components/brave_vpn/resources/panel/stories/mock-data/api.ts +++ b/components/brave_vpn/resources/panel/stories/mock-data/api.ts @@ -30,6 +30,7 @@ BraveVPN.setPanelBrowserApiForTesting({ getAllRegions: () => Promise.resolve({ regions: mockRegionList }), getSelectedRegion: () => Promise.resolve({ currentRegion: mockRegionList[1] }), setSelectedRegion: doNothing, + clearSelectedRegion: doNothing, getProductUrls: () => Promise.resolve({ urls: { feedback: 'https://example.com', diff --git a/components/brave_vpn/resources/panel/stories/mock-data/region-list.ts b/components/brave_vpn/resources/panel/stories/mock-data/region-list.ts index a8776a961d4..a033b8d23d3 100644 --- a/components/brave_vpn/resources/panel/stories/mock-data/region-list.ts +++ b/components/brave_vpn/resources/panel/stories/mock-data/region-list.ts @@ -16,6 +16,7 @@ export const mockRegionList: Region[] = [ 'name': 'au-syd', 'namePretty': 'Sydney', 'regionPrecision': 'city', + 'isAutomatic': false, 'cities': [], 'serverCount': 8 } @@ -27,6 +28,7 @@ export const mockRegionList: Region[] = [ 'name': 'ocn-aus', 'namePretty': 'Australia', 'regionPrecision': 'country', + 'isAutomatic': false, 'serverCount': 8 }, { @@ -39,6 +41,7 @@ export const mockRegionList: Region[] = [ 'name': 'eu-vie', 'namePretty': 'Vienna', 'regionPrecision': 'city', + 'isAutomatic': false, 'cities': [], 'serverCount': 10 } @@ -50,6 +53,7 @@ export const mockRegionList: Region[] = [ 'name': 'eu-at', 'namePretty': 'Austria', 'regionPrecision': 'country', + 'isAutomatic': false, 'serverCount': 10 }, { @@ -62,6 +66,7 @@ export const mockRegionList: Region[] = [ 'name': 'eu-bx', 'namePretty': 'Brussels', 'regionPrecision': 'city', + 'isAutomatic': false, 'cities': [], 'serverCount': 10 } @@ -73,6 +78,7 @@ export const mockRegionList: Region[] = [ 'name': 'eu-be', 'namePretty': 'Belgium', 'regionPrecision': 'country', + 'isAutomatic': false, 'serverCount': 10 }, { @@ -85,6 +91,7 @@ export const mockRegionList: Region[] = [ 'name': 'sa-sao', 'namePretty': 'Sao Paulo', 'regionPrecision': 'city', + 'isAutomatic': false, 'cities': [], 'serverCount': 5 } @@ -96,6 +103,7 @@ export const mockRegionList: Region[] = [ 'name': 'sa-brz', 'namePretty': 'Brazil', 'regionPrecision': 'country', + 'isAutomatic': false, 'serverCount': 5 }, { @@ -108,6 +116,7 @@ export const mockRegionList: Region[] = [ 'name': 'ca-tor', 'namePretty': 'Toronto', 'regionPrecision': 'city', + 'isAutomatic': false, 'cities': [], 'serverCount': 5 } @@ -119,6 +128,7 @@ export const mockRegionList: Region[] = [ 'name': 'na-can', 'namePretty': 'Canada', 'regionPrecision': 'country', + 'isAutomatic': false, 'serverCount': 5 }, { @@ -131,6 +141,7 @@ export const mockRegionList: Region[] = [ 'name': 'sa-scl', 'namePretty': 'Santiago', 'regionPrecision': 'city', + 'isAutomatic': false, 'cities': [], 'serverCount': 4 } @@ -142,6 +153,7 @@ export const mockRegionList: Region[] = [ 'name': 'sa-cl', 'namePretty': 'Chile', 'regionPrecision': 'country', + 'isAutomatic': false, 'serverCount': 4 }, { @@ -154,6 +166,7 @@ export const mockRegionList: Region[] = [ 'name': 'co-bog', 'namePretty': 'Bogotá', 'regionPrecision': 'city', + 'isAutomatic': false, 'cities': [], 'serverCount': 10 } @@ -165,6 +178,7 @@ export const mockRegionList: Region[] = [ 'name': 'sa-co', 'namePretty': 'Colombia', 'regionPrecision': 'country', + 'isAutomatic': false, 'serverCount': 10 }, { @@ -177,6 +191,7 @@ export const mockRegionList: Region[] = [ 'name': 'eu-zag', 'namePretty': 'Zagreb', 'regionPrecision': 'city', + 'isAutomatic': false, 'cities': [], 'serverCount': 10 } @@ -188,6 +203,7 @@ export const mockRegionList: Region[] = [ 'name': 'eu-cr', 'namePretty': 'Croatia', 'regionPrecision': 'country', + 'isAutomatic': false, 'serverCount': 10 }, { @@ -200,6 +216,7 @@ export const mockRegionList: Region[] = [ 'name': 'eu-prg', 'namePretty': 'Prague', 'regionPrecision': 'city', + 'isAutomatic': false, 'cities': [], 'serverCount': 10 } @@ -211,6 +228,7 @@ export const mockRegionList: Region[] = [ 'name': 'eu-cz', 'namePretty': 'Czech-Republic', 'regionPrecision': 'country', + 'isAutomatic': false, 'serverCount': 10 }, { @@ -223,6 +241,7 @@ export const mockRegionList: Region[] = [ 'name': 'eu-cph', 'namePretty': 'Copenhagen', 'regionPrecision': 'city', + 'isAutomatic': false, 'cities': [], 'serverCount': 8 } @@ -234,6 +253,7 @@ export const mockRegionList: Region[] = [ 'name': 'eu-dk', 'namePretty': 'Denmark', 'regionPrecision': 'country', + 'isAutomatic': false, 'serverCount': 8 }, { @@ -246,6 +266,7 @@ export const mockRegionList: Region[] = [ 'name': 'en-lon', 'namePretty': 'London', 'regionPrecision': 'city', + 'isAutomatic': false, 'cities': [], 'serverCount': 8 } @@ -257,6 +278,7 @@ export const mockRegionList: Region[] = [ 'name': 'eu-en', 'namePretty': 'England', 'regionPrecision': 'country', + 'isAutomatic': false, 'serverCount': 8 }, { @@ -269,6 +291,7 @@ export const mockRegionList: Region[] = [ 'name': 'fr-lil', 'namePretty': 'Lille', 'regionPrecision': 'city', + 'isAutomatic': false, 'cities': [], 'serverCount': 1 }, @@ -280,6 +303,7 @@ export const mockRegionList: Region[] = [ 'name': 'fr-par', 'namePretty': 'Paris', 'regionPrecision': 'city', + 'isAutomatic': false, 'cities': [], 'serverCount': 10 } @@ -291,6 +315,7 @@ export const mockRegionList: Region[] = [ 'name': 'eu-fr', 'namePretty': 'France', 'regionPrecision': 'country', + 'isAutomatic': false, 'serverCount': 11 }, { @@ -303,6 +328,7 @@ export const mockRegionList: Region[] = [ 'name': 'de-fra', 'namePretty': 'Frankfurt', 'regionPrecision': 'city', + 'isAutomatic': false, 'cities': [], 'serverCount': 15 } @@ -314,6 +340,7 @@ export const mockRegionList: Region[] = [ 'name': 'eu-de', 'namePretty': 'Germany', 'regionPrecision': 'country', + 'isAutomatic': false, 'serverCount': 15 }, { @@ -326,6 +353,7 @@ export const mockRegionList: Region[] = [ 'name': 'eu-ath', 'namePretty': 'Athens', 'regionPrecision': 'city', + 'isAutomatic': false, 'cities': [], 'serverCount': 6 } @@ -337,6 +365,7 @@ export const mockRegionList: Region[] = [ 'name': 'eu-gr', 'namePretty': 'Greece', 'regionPrecision': 'country', + 'isAutomatic': false, 'serverCount': 6 }, { @@ -349,6 +378,7 @@ export const mockRegionList: Region[] = [ 'name': 'eu-dub', 'namePretty': 'Dublin', 'regionPrecision': 'city', + 'isAutomatic': false, 'cities': [], 'serverCount': 10 } @@ -360,6 +390,7 @@ export const mockRegionList: Region[] = [ 'name': 'eu-ie', 'namePretty': 'Ireland', 'regionPrecision': 'country', + 'isAutomatic': false, 'serverCount': 10 }, { @@ -372,6 +403,7 @@ export const mockRegionList: Region[] = [ 'name': 'eu-mil', 'namePretty': 'Milan', 'regionPrecision': 'city', + 'isAutomatic': false, 'cities': [], 'serverCount': 5 } @@ -383,6 +415,7 @@ export const mockRegionList: Region[] = [ 'name': 'eu-it', 'namePretty': 'Italy', 'regionPrecision': 'country', + 'isAutomatic': false, 'serverCount': 5 }, { @@ -395,6 +428,7 @@ export const mockRegionList: Region[] = [ 'name': 'jp-tky', 'namePretty': 'Tokyo', 'regionPrecision': 'city', + 'isAutomatic': false, 'cities': [], 'serverCount': 5 } @@ -406,6 +440,7 @@ export const mockRegionList: Region[] = [ 'name': 'asia-jp', 'namePretty': 'Japan', 'regionPrecision': 'country', + 'isAutomatic': false, 'serverCount': 5 }, { @@ -418,6 +453,7 @@ export const mockRegionList: Region[] = [ 'name': 'sa-mxc', 'namePretty': 'Mexico City', 'regionPrecision': 'city', + 'isAutomatic': false, 'cities': [], 'serverCount': 5 } @@ -429,6 +465,7 @@ export const mockRegionList: Region[] = [ 'name': 'sa-mx', 'namePretty': 'Mexico', 'regionPrecision': 'country', + 'isAutomatic': false, 'serverCount': 5 }, { @@ -441,6 +478,7 @@ export const mockRegionList: Region[] = [ 'name': 'nl-ams', 'namePretty': 'Amsterdam', 'regionPrecision': 'city', + 'isAutomatic': false, 'cities': [], 'serverCount': 3 } @@ -452,6 +490,7 @@ export const mockRegionList: Region[] = [ 'name': 'eu-nl', 'namePretty': 'Netherlands', 'regionPrecision': 'country', + 'isAutomatic': false, 'serverCount': 3 }, { @@ -464,6 +503,7 @@ export const mockRegionList: Region[] = [ 'name': 'eu-war', 'namePretty': 'Warsaw', 'regionPrecision': 'city', + 'isAutomatic': false, 'cities': [], 'serverCount': 10 } @@ -475,6 +515,7 @@ export const mockRegionList: Region[] = [ 'name': 'eu-pl', 'namePretty': 'Poland', 'regionPrecision': 'country', + 'isAutomatic': false, 'serverCount': 10 }, { @@ -487,6 +528,7 @@ export const mockRegionList: Region[] = [ 'name': 'eu-lx', 'namePretty': 'Lisbon', 'regionPrecision': 'city', + 'isAutomatic': false, 'cities': [], 'serverCount': 10 } @@ -498,6 +540,7 @@ export const mockRegionList: Region[] = [ 'name': 'eu-pt', 'namePretty': 'Portugal', 'regionPrecision': 'country', + 'isAutomatic': false, 'serverCount': 10 }, { @@ -510,6 +553,7 @@ export const mockRegionList: Region[] = [ 'name': 'eu-buh', 'namePretty': 'Bucharest', 'regionPrecision': 'city', + 'isAutomatic': false, 'cities': [], 'serverCount': 10 } @@ -521,6 +565,7 @@ export const mockRegionList: Region[] = [ 'name': 'eu-ro', 'namePretty': 'Romania', 'regionPrecision': 'country', + 'isAutomatic': false, 'serverCount': 10 }, { @@ -533,6 +578,7 @@ export const mockRegionList: Region[] = [ 'name': 'sg-sg', 'namePretty': 'Singapore', 'regionPrecision': 'city', + 'isAutomatic': false, 'cities': [], 'serverCount': 10 } @@ -544,6 +590,7 @@ export const mockRegionList: Region[] = [ 'name': 'asia-sg', 'namePretty': 'Singapore', 'regionPrecision': 'country', + 'isAutomatic': false, 'serverCount': 10 }, { @@ -556,6 +603,7 @@ export const mockRegionList: Region[] = [ 'name': 'za-joh', 'namePretty': 'Johannesburg', 'regionPrecision': 'city', + 'isAutomatic': false, 'cities': [], 'serverCount': 10 } @@ -567,6 +615,7 @@ export const mockRegionList: Region[] = [ 'name': 'af-za', 'namePretty': 'South Africa', 'regionPrecision': 'country', + 'isAutomatic': false, 'serverCount': 10 }, { @@ -579,6 +628,7 @@ export const mockRegionList: Region[] = [ 'name': 'es-brc', 'namePretty': 'Barcelona', 'regionPrecision': 'city', + 'isAutomatic': false, 'cities': [], 'serverCount': 4 }, @@ -590,6 +640,7 @@ export const mockRegionList: Region[] = [ 'name': 'eu-mad', 'namePretty': 'Madrid', 'regionPrecision': 'city', + 'isAutomatic': false, 'cities': [], 'serverCount': 5 } @@ -601,6 +652,7 @@ export const mockRegionList: Region[] = [ 'name': 'eu-es', 'namePretty': 'Spain', 'regionPrecision': 'country', + 'isAutomatic': false, 'serverCount': 9 }, { @@ -613,6 +665,7 @@ export const mockRegionList: Region[] = [ 'name': 'eu-arn', 'namePretty': 'Stockholm', 'regionPrecision': 'city', + 'isAutomatic': false, 'cities': [], 'serverCount': 10 } @@ -624,6 +677,7 @@ export const mockRegionList: Region[] = [ 'name': 'eu-se', 'namePretty': 'Sweden', 'regionPrecision': 'country', + 'isAutomatic': false, 'serverCount': 10 }, { @@ -636,6 +690,7 @@ export const mockRegionList: Region[] = [ 'name': 'ch-zrh', 'namePretty': 'Zurich', 'regionPrecision': 'city', + 'isAutomatic': false, 'cities': [], 'serverCount': 3 } @@ -647,6 +702,7 @@ export const mockRegionList: Region[] = [ 'name': 'eu-ch', 'namePretty': 'Switzerland', 'regionPrecision': 'country', + 'isAutomatic': false, 'serverCount': 3 }, { @@ -659,6 +715,7 @@ export const mockRegionList: Region[] = [ 'name': 'us-ash', 'namePretty': 'Ashburn', 'regionPrecision': 'city', + 'isAutomatic': false, 'cities': [], 'serverCount': 10 }, @@ -670,6 +727,7 @@ export const mockRegionList: Region[] = [ 'name': 'us-atl', 'namePretty': 'Atlanta', 'regionPrecision': 'city', + 'isAutomatic': false, 'cities': [], 'serverCount': 10 }, @@ -681,6 +739,7 @@ export const mockRegionList: Region[] = [ 'name': 'us-chi', 'namePretty': 'Chicago', 'regionPrecision': 'city', + 'isAutomatic': false, 'cities': [], 'serverCount': 5 }, @@ -692,6 +751,7 @@ export const mockRegionList: Region[] = [ 'name': 'us-den', 'namePretty': 'Denver', 'regionPrecision': 'city', + 'isAutomatic': false, 'cities': [], 'serverCount': 10 }, @@ -703,6 +763,7 @@ export const mockRegionList: Region[] = [ 'name': 'us-dfw', 'namePretty': 'Dallas', 'regionPrecision': 'city', + 'isAutomatic': false, 'cities': [], 'serverCount': 12 }, @@ -714,6 +775,7 @@ export const mockRegionList: Region[] = [ 'name': 'us-la', 'namePretty': 'Los Angeles', 'regionPrecision': 'city', + 'isAutomatic': false, 'cities': [], 'serverCount': 10 }, @@ -725,6 +787,7 @@ export const mockRegionList: Region[] = [ 'name': 'us-mia', 'namePretty': 'Miami', 'regionPrecision': 'city', + 'isAutomatic': false, 'cities': [], 'serverCount': 10 }, @@ -736,6 +799,7 @@ export const mockRegionList: Region[] = [ 'name': 'us-nyc', 'namePretty': 'New York City', 'regionPrecision': 'city', + 'isAutomatic': false, 'cities': [], 'serverCount': 18 }, @@ -747,6 +811,7 @@ export const mockRegionList: Region[] = [ 'name': 'us-sea', 'namePretty': 'Seattle', 'regionPrecision': 'city', + 'isAutomatic': false, 'cities': [], 'serverCount': 10 }, @@ -758,6 +823,7 @@ export const mockRegionList: Region[] = [ 'name': 'us-sjc', 'namePretty': 'San Jose', 'regionPrecision': 'city', + 'isAutomatic': false, 'cities': [], 'serverCount': 15 } @@ -769,6 +835,7 @@ export const mockRegionList: Region[] = [ 'name': 'na-usa', 'namePretty': 'USA', 'regionPrecision': 'country', + 'isAutomatic': false, 'serverCount': 110 }, { @@ -781,6 +848,7 @@ export const mockRegionList: Region[] = [ 'name': 'eu-ky', 'namePretty': 'Kyiv', 'regionPrecision': 'city', + 'isAutomatic': false, 'cities': [], 'serverCount': 10 } @@ -792,6 +860,7 @@ export const mockRegionList: Region[] = [ 'name': 'eu-ua', 'namePretty': 'Ukraine', 'regionPrecision': 'country', + 'isAutomatic': false, 'serverCount': 10 } ] diff --git a/components/resources/brave_vpn_strings.grdp b/components/resources/brave_vpn_strings.grdp index 66c178a8851..e7e4171940e 100644 --- a/components/resources/brave_vpn_strings.grdp +++ b/components/resources/brave_vpn_strings.grdp @@ -136,6 +136,26 @@ Select your server + + $15 cities - $25 servers + + + + $15 servers + + + + Automatic + + + + Optimal + + + + Use the best server available + + One moment while loading… diff --git a/ui/webui/resources/BUILD.gn b/ui/webui/resources/BUILD.gn index fe6dac7d247..dce0de9df27 100644 --- a/ui/webui/resources/BUILD.gn +++ b/ui/webui/resources/BUILD.gn @@ -479,6 +479,7 @@ if (enable_brave_vpn_panel) { "country-ua.svg", "country-us.svg", "country-uy.svg", + "country-worldwide.svg", "country-za.svg", ] } From 76123e4e7722da6f2817d7fb447bd27ec0e36971 Mon Sep 17 00:00:00 2001 From: Simon Hong Date: Mon, 2 Sep 2024 20:22:23 +0900 Subject: [PATCH 25/31] Migrated region list v1's selected region name to v2's name --- .../chrome/browser/prefs/browser_prefs.cc | 10 +++ chromium_src/chrome/browser/prefs/sources.gni | 1 + .../brave_vpn/common/brave_vpn_utils.cc | 67 +++++++++++++++++++ components/brave_vpn/common/brave_vpn_utils.h | 1 + components/brave_vpn/common/pref_names.h | 2 + 5 files changed, 81 insertions(+) diff --git a/chromium_src/chrome/browser/prefs/browser_prefs.cc b/chromium_src/chrome/browser/prefs/browser_prefs.cc index 954de048d94..2811704ed08 100644 --- a/chromium_src/chrome/browser/prefs/browser_prefs.cc +++ b/chromium_src/chrome/browser/prefs/browser_prefs.cc @@ -19,6 +19,7 @@ #include "brave/components/brave_search_conversion/p3a.h" #include "brave/components/brave_shields/content/browser/brave_shields_p3a.h" #include "brave/components/brave_sync/brave_sync_prefs.h" +#include "brave/components/brave_vpn/common/buildflags/buildflags.h" #include "brave/components/brave_wallet/browser/brave_wallet_prefs.h" #include "brave/components/brave_wallet/browser/keyring_service.h" #include "brave/components/constants/pref_names.h" @@ -42,6 +43,10 @@ #include "brave/browser/ui/tabs/brave_tab_prefs.h" #endif +#if BUILDFLAG(ENABLE_BRAVE_VPN) +#include "brave/components/brave_vpn/common/brave_vpn_utils.h" +#endif + #if BUILDFLAG(ENABLE_TOR) #include "brave/components/tor/pref_names.h" #include "brave/components/tor/tor_utils.h" @@ -213,6 +218,11 @@ void MigrateObsoleteLocalStatePrefs(PrefService* local_state) { local_state->ClearPref(kDefaultBrowserPromptEnabled); #endif +#if BUILDFLAG(ENABLE_BRAVE_VPN) + // Added 09/2024 + brave_vpn::MigrateLocalStatePrefs(local_state); +#endif + misc_metrics::UptimeMonitor::MigrateObsoletePrefs(local_state); brave_search_conversion::p3a::MigrateObsoleteLocalStatePrefs(local_state); brave_stats::MigrateObsoleteLocalStatePrefs(local_state); diff --git a/chromium_src/chrome/browser/prefs/sources.gni b/chromium_src/chrome/browser/prefs/sources.gni index 5cb618fdf77..7d5814edf9b 100644 --- a/chromium_src/chrome/browser/prefs/sources.gni +++ b/chromium_src/chrome/browser/prefs/sources.gni @@ -7,6 +7,7 @@ import("//third_party/widevine/cdm/widevine.gni") brave_chromium_src_chrome_browser_prefs_deps = [ "//brave/components/brave_sync", + "//brave/components/brave_vpn/common/buildflags", "//brave/components/brave_wallet/browser", "//brave/components/constants", "//chrome/browser/profiles:profile", diff --git a/components/brave_vpn/common/brave_vpn_utils.cc b/components/brave_vpn/common/brave_vpn_utils.cc index d34b602684b..00d039c3e69 100644 --- a/components/brave_vpn/common/brave_vpn_utils.cc +++ b/components/brave_vpn/common/brave_vpn_utils.cc @@ -7,6 +7,7 @@ #include +#include "base/containers/fixed_flat_map.h" #include "base/feature_list.h" #include "base/json/json_writer.h" #include "base/json/values_util.h" @@ -27,9 +28,11 @@ namespace brave_vpn { namespace { + void RegisterVPNLocalStatePrefs(PrefRegistrySimple* registry) { #if !BUILDFLAG(IS_ANDROID) registry->RegisterListPref(prefs::kBraveVPNRegionList); + registry->RegisterIntegerPref(prefs::kBraveVPNRegionListVersion, 1); registry->RegisterTimePref(prefs::kBraveVPNRegionListFetchedDate, {}); registry->RegisterStringPref(prefs::kBraveVPNDeviceRegion, ""); registry->RegisterStringPref(prefs::kBraveVPNSelectedRegion, ""); @@ -49,6 +52,60 @@ void RegisterVPNLocalStatePrefs(PrefRegistrySimple* registry) { #endif } +#if !BUILDFLAG(IS_ANDROID) +void MigrateFromV1ToV2(PrefService* local_prefs) { + const auto selected_region_v1 = + local_prefs->GetString(prefs::kBraveVPNSelectedRegion); + if (selected_region_v1.empty()) { + local_prefs->SetInteger(prefs::kBraveVPNRegionListVersion, 2); + return; + } + + // In this migration, selected region name is updated to matched v2 region + // name. + constexpr auto kV1ToV2Map = + base::MakeFixedFlatMap( + {{"au-au", "ocn-aus"}, + {"eu-at", "eu-at"}, + {"eu-be", "eu-be"}, + {"sa-brazil", "sa-brz"}, + {"ca-east", "na-can"}, + {"sa-cl", "sa-cl"}, + {"sa-colombia", "sa-co"}, + {"eu-cr", "eu-cr"}, + {"eu-cz", "eu-cz"}, + {"eu-dk", "eu-dk"}, + {"eu-fr", "eu-fr"}, + {"eu-de", "eu-de"}, + {"eu-gr", "eu-gr"}, + {"eu-ir", "eu-ie"}, + {"eu-italy", "eu-it"}, + {"asia-jp", "asia-jp"}, + {"sa-mexico", "sa-mx"}, + {"eu-nl", "eu-nl"}, + {"eu-pl", "eu-pl"}, + {"eu-pt", "eu-pt"}, + {"eu-ro", "eu-ro"}, + {"asia-sg", "asia-sg"}, + {"af-za", "af-za"}, + {"eu-es", "eu-es"}, + {"eu-sweden", "eu-se"}, + {"eu-ch", "eu-ch"}, + // TODO(simonhong): Update proper region name in US. + {"us-central", "na-usa"}, + {"us-east", "na-usa"}, + {"us-mountain", "na-usa"}, + {"us-north-west", "na-usa"}, + {"us-west", "na-usa"}, + {"eu-ua", "eu-ua"}, + {"eu-en", "en-en"}}); + + local_prefs->SetString(prefs::kBraveVPNSelectedRegion, + kV1ToV2Map.at(selected_region_v1)); + local_prefs->SetInteger(prefs::kBraveVPNRegionListVersion, 2); +} +#endif + } // namespace bool IsBraveVPNWireguardEnabled(PrefService* local_state) { @@ -206,6 +263,16 @@ void RegisterLocalStatePrefs(PrefRegistrySimple* registry) { RegisterVPNLocalStatePrefs(registry); } +void MigrateLocalStatePrefs(PrefService* local_prefs) { +#if !BUILDFLAG(IS_ANDROID) + const int current_version = + local_prefs->GetInteger(prefs::kBraveVPNRegionListVersion); + if (current_version == 1) { + MigrateFromV1ToV2(local_prefs); + } +#endif +} + bool HasValidSubscriberCredential(PrefService* local_prefs) { const base::Value::Dict& sub_cred_dict = local_prefs->GetDict(prefs::kBraveVPNSubscriberCredential); diff --git a/components/brave_vpn/common/brave_vpn_utils.h b/components/brave_vpn/common/brave_vpn_utils.h index bb7f2562c6f..fbacb892423 100644 --- a/components/brave_vpn/common/brave_vpn_utils.h +++ b/components/brave_vpn/common/brave_vpn_utils.h @@ -30,6 +30,7 @@ std::string GetBraveVPNPaymentsEnv(const std::string& env); std::string GetManageUrl(const std::string& env); void MigrateVPNSettings(PrefService* profile_prefs, PrefService* local_prefs); void RegisterLocalStatePrefs(PrefRegistrySimple* registry); +void MigrateLocalStatePrefs(PrefService* local_prefs); void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry); void RegisterAndroidProfilePrefs(PrefRegistrySimple* registry); bool HasValidSubscriberCredential(PrefService* local_prefs); diff --git a/components/brave_vpn/common/pref_names.h b/components/brave_vpn/common/pref_names.h index 9bddc5352d3..d4484a286dc 100644 --- a/components/brave_vpn/common/pref_names.h +++ b/components/brave_vpn/common/pref_names.h @@ -25,6 +25,8 @@ inline constexpr char kBraveVPNDeviceRegion[] = "brave.brave_vpn.device_region_name"; inline constexpr char kBraveVPNSelectedRegion[] = "brave.brave_vpn.selected_region_name"; +inline constexpr char kBraveVPNRegionListVersion[] = + "brave.brave_vpn.region_list_version"; #if BUILDFLAG(IS_WIN) inline constexpr char kBraveVpnShowDNSPolicyWarningDialog[] = "brave.brave_vpn.show_dns_policy_warning_dialog"; From 5274ff61ed64f9c5a494bdb85f856612747adfc2 Mon Sep 17 00:00:00 2001 From: deeppandya Date: Thu, 5 Sep 2024 03:12:52 +0530 Subject: [PATCH 26/31] Add UI changes for selected server selection android --- android/brave_java_resources.gni | 1 + .../BraveTabbedAppMenuPropertiesDelegate.java | 15 +++++++-------- .../adapters/BraveVpnServerSelectionAdapter.java | 2 +- .../vpn/utils/BraveVpnApiResponseUtils.java | 1 - .../vpn_server_selection_switch_stroke_color.xml | 11 +++++++++++ .../res/layout/activity_vpn_server_selection.xml | 1 + .../brave_vpn_server_selection_item_layout.xml | 1 + .../java/res/layout/vpn_server_item_layout.xml | 4 ++-- android/java/res/values-night/brave_colors.xml | 1 + android/java/res/values/brave_colors.xml | 1 + android/java/res/values/brave_styles.xml | 4 ++++ 11 files changed, 30 insertions(+), 12 deletions(-) create mode 100644 android/java/res/color/vpn_server_selection_switch_stroke_color.xml diff --git a/android/brave_java_resources.gni b/android/brave_java_resources.gni index fab7c795408..fb431abd6ef 100644 --- a/android/brave_java_resources.gni +++ b/android/brave_java_resources.gni @@ -10,6 +10,7 @@ brave_java_resources = [ "java/res/anim/slide_out_bottom.xml", "java/res/anim/slide_out_top.xml", "java/res/color/crypto_wallet_onboarding_button_text_color.xml", + "java/res/color/vpn_server_selection_switch_stroke_color.xml", "java/res/color/wallet_checkbox_background_color_selector.xml", "java/res/color/wallet_checkbox_color_selector.xml", "java/res/color/wallet_onboarding_input_field_stroke_color.xml", diff --git a/android/java/org/chromium/chrome/browser/appmenu/BraveTabbedAppMenuPropertiesDelegate.java b/android/java/org/chromium/chrome/browser/appmenu/BraveTabbedAppMenuPropertiesDelegate.java index 8ef705d5b6d..f22b9b6cd0e 100644 --- a/android/java/org/chromium/chrome/browser/appmenu/BraveTabbedAppMenuPropertiesDelegate.java +++ b/android/java/org/chromium/chrome/browser/appmenu/BraveTabbedAppMenuPropertiesDelegate.java @@ -126,18 +126,17 @@ public class BraveTabbedAppMenuPropertiesDelegate extends TabbedAppMenuPropertie if (BraveVpnPrefUtils.isSubscriptionPurchase() && !TextUtils.isEmpty(BraveVpnPrefUtils.getRegionIsoCode())) { - String serverLocation = - " " - + BraveVpnUtils.countryCodeToEmoji( - BraveVpnPrefUtils.getRegionIsoCode()) - + " " - + BraveVpnPrefUtils.getRegionNamePretty(); - + String serverLocation = " %s %s"; SubMenu vpnLocationSubMenu = menu.findItem(R.id.request_vpn_location_row_menu_id).getSubMenu(); MenuItem vpnLocationSubMenuItem = vpnLocationSubMenu.findItem(R.id.request_vpn_location_id); - vpnLocationSubMenuItem.setTitle(serverLocation); + vpnLocationSubMenuItem.setTitle( + String.format( + serverLocation, + BraveVpnUtils.countryCodeToEmoji( + BraveVpnPrefUtils.getRegionIsoCode()), + BraveVpnPrefUtils.getRegionNamePretty())); MenuItem vpnLocationIconSubMenuItem = vpnLocationSubMenu.findItem(R.id.request_vpn_location_icon_id); Drawable drawable = vpnLocationIconSubMenuItem.getIcon(); diff --git a/android/java/org/chromium/chrome/browser/vpn/adapters/BraveVpnServerSelectionAdapter.java b/android/java/org/chromium/chrome/browser/vpn/adapters/BraveVpnServerSelectionAdapter.java index c5b6f54ab46..fb967b80048 100644 --- a/android/java/org/chromium/chrome/browser/vpn/adapters/BraveVpnServerSelectionAdapter.java +++ b/android/java/org/chromium/chrome/browser/vpn/adapters/BraveVpnServerSelectionAdapter.java @@ -1,4 +1,4 @@ -/* Copyright (c) 2024 The Brave Authors. All rights reserved. +/* Copyright (c) 2021 The Brave Authors. All rights reserved. * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this file, * You can obtain one at https://mozilla.org/MPL/2.0/. */ diff --git a/android/java/org/chromium/chrome/browser/vpn/utils/BraveVpnApiResponseUtils.java b/android/java/org/chromium/chrome/browser/vpn/utils/BraveVpnApiResponseUtils.java index c7519353f4d..4d28c570f3f 100644 --- a/android/java/org/chromium/chrome/browser/vpn/utils/BraveVpnApiResponseUtils.java +++ b/android/java/org/chromium/chrome/browser/vpn/utils/BraveVpnApiResponseUtils.java @@ -82,7 +82,6 @@ public class BraveVpnApiResponseUtils { region = BraveVpnUtils.selectedServerRegion.getRegionName(); braveVpnServerRegion = BraveVpnUtils.selectedServerRegion; } - // BraveVpnUtils.selectedServerRegion = null; } else { String serverRegion = BraveVpnPrefUtils.getRegionName(); region = diff --git a/android/java/res/color/vpn_server_selection_switch_stroke_color.xml b/android/java/res/color/vpn_server_selection_switch_stroke_color.xml new file mode 100644 index 00000000000..ae6f2c7bf08 --- /dev/null +++ b/android/java/res/color/vpn_server_selection_switch_stroke_color.xml @@ -0,0 +1,11 @@ + + + + + + + diff --git a/android/java/res/layout/activity_vpn_server_selection.xml b/android/java/res/layout/activity_vpn_server_selection.xml index 81e45cfef43..84f76775c29 100644 --- a/android/java/res/layout/activity_vpn_server_selection.xml +++ b/android/java/res/layout/activity_vpn_server_selection.xml @@ -58,6 +58,7 @@ android:id="@+id/automatic_server_switch" android:layout_width="wrap_content" android:layout_height="wrap_content" + app:trackTint="@color/vpn_server_selection_switch_stroke_color" app:showText="false" android:clickable="false"/> diff --git a/android/java/res/layout/brave_vpn_server_selection_item_layout.xml b/android/java/res/layout/brave_vpn_server_selection_item_layout.xml index 089358f6bcf..c543d8fe983 100644 --- a/android/java/res/layout/brave_vpn_server_selection_item_layout.xml +++ b/android/java/res/layout/brave_vpn_server_selection_item_layout.xml @@ -46,6 +46,7 @@ android:layout_gravity="center_vertical" android:clickable="false" android:focusable="false" + android:theme="@style/BraveRadioButton" android:layout_marginEnd="16dp" /> + android:theme="@style/BraveRadioButton" + android:layout_marginEnd="16dp" /> diff --git a/android/java/res/values-night/brave_colors.xml b/android/java/res/values-night/brave_colors.xml index bcae8fd03a4..e0e9b8eed93 100644 --- a/android/java/res/values-night/brave_colors.xml +++ b/android/java/res/values-night/brave_colors.xml @@ -274,4 +274,5 @@ #c7c7cc #3b3b3f #c1c4ff + #303034 diff --git a/android/java/res/values/brave_colors.xml b/android/java/res/values/brave_colors.xml index 9d9b66e91fc..82da4e98fa9 100644 --- a/android/java/res/values/brave_colors.xml +++ b/android/java/res/values/brave_colors.xml @@ -419,4 +419,5 @@ #46464a #e3e3e8 #3e37d4 + #c7c7cc diff --git a/android/java/res/values/brave_styles.xml b/android/java/res/values/brave_styles.xml index fa9517145e6..fbd4a5e74c4 100644 --- a/android/java/res/values/brave_styles.xml +++ b/android/java/res/values/brave_styles.xml @@ -14,6 +14,10 @@ +