Skip to content

Commit f67bdee

Browse files
authored
Merge pull request #25089 from brave/advanced_server_selection_ux
Advanced server selection ux
2 parents 87ca8e6 + 6f24b64 commit f67bdee

File tree

79 files changed

+3077
-747
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

79 files changed

+3077
-747
lines changed

android/brave_java_resources.gni

+4-1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ brave_java_resources = [
1010
"java/res/anim/slide_out_bottom.xml",
1111
"java/res/anim/slide_out_top.xml",
1212
"java/res/color/crypto_wallet_onboarding_button_text_color.xml",
13+
"java/res/color/vpn_server_selection_switch_stroke_color.xml",
1314
"java/res/color/wallet_checkbox_background_color_selector.xml",
1415
"java/res/color/wallet_checkbox_color_selector.xml",
1516
"java/res/color/wallet_onboarding_input_field_stroke_color.xml",
@@ -452,6 +453,7 @@ brave_java_resources = [
452453
"java/res/drawable/ic_cancel_filled.xml",
453454
"java/res/drawable/ic_carat_down.xml",
454455
"java/res/drawable/ic_carat_down_country_spinner.xml",
456+
"java/res/drawable/ic_carat_right.xml",
455457
"java/res/drawable/ic_card_background.xml",
456458
"java/res/drawable/ic_celo_color.xml",
457459
"java/res/drawable/ic_channel_brave.xml",
@@ -482,7 +484,6 @@ brave_java_resources = [
482484
"java/res/drawable/ic_channels.xml",
483485
"java/res/drawable/ic_check.xml",
484486
"java/res/drawable/ic_check_white.xml",
485-
"java/res/drawable/ic_checkbox_checked.xml",
486487
"java/res/drawable/ic_checkbox_filled.xml",
487488
"java/res/drawable/ic_checkbox_outline.xml",
488489
"java/res/drawable/ic_chevron_right.xml",
@@ -769,6 +770,7 @@ brave_java_resources = [
769770
"java/res/layout/activity_tipping_banner_tablet.xml",
770771
"java/res/layout/activity_vpn_always_on.xml",
771772
"java/res/layout/activity_vpn_paywall.xml",
773+
"java/res/layout/activity_vpn_server.xml",
772774
"java/res/layout/activity_vpn_server_selection.xml",
773775
"java/res/layout/activity_welcome_onboarding.xml",
774776
"java/res/layout/application_item_layout.xml",
@@ -962,6 +964,7 @@ brave_java_resources = [
962964
"java/res/layout/view_holder_onboarding_header_network_selector.xml",
963965
"java/res/layout/view_holder_onboarding_network_selector.xml",
964966
"java/res/layout/vpn_location_menu_item_action_layout.xml",
967+
"java/res/layout/vpn_server_item_layout.xml",
965968
"java/res/layout/vpn_settings_callout_modal_layout.xml",
966969
"java/res/layout/wallet_balance_layout.xml",
967970
"java/res/layout/web_notification_icon_frame_brave.xml",

android/brave_java_sources.gni

+3
Original file line numberDiff line numberDiff line change
@@ -455,16 +455,19 @@ brave_java_sources = [
455455
"../../brave/android/java/org/chromium/chrome/browser/util/UsageMonitor.java",
456456
"../../brave/android/java/org/chromium/chrome/browser/vpn/BraveVpnNativeWorker.java",
457457
"../../brave/android/java/org/chromium/chrome/browser/vpn/BraveVpnObserver.java",
458+
"../../brave/android/java/org/chromium/chrome/browser/vpn/BraveVpnServiceFactoryAndroid.java",
458459
"../../brave/android/java/org/chromium/chrome/browser/vpn/DisconnectVpnBroadcastReceiver.java",
459460
"../../brave/android/java/org/chromium/chrome/browser/vpn/activities/BraveVpnParentActivity.java",
460461
"../../brave/android/java/org/chromium/chrome/browser/vpn/activities/BraveVpnProfileActivity.java",
461462
"../../brave/android/java/org/chromium/chrome/browser/vpn/activities/BraveVpnSupportActivity.java",
462463
"../../brave/android/java/org/chromium/chrome/browser/vpn/activities/VpnAlwaysOnActivity.java",
463464
"../../brave/android/java/org/chromium/chrome/browser/vpn/activities/VpnPaywallActivity.java",
465+
"../../brave/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerActivity.java",
464466
"../../brave/android/java/org/chromium/chrome/browser/vpn/activities/VpnServerSelectionActivity.java",
465467
"../../brave/android/java/org/chromium/chrome/browser/vpn/adapters/AlwaysOnPagerAdapter.java",
466468
"../../brave/android/java/org/chromium/chrome/browser/vpn/adapters/BraveVpnPlanPagerAdapter.java",
467469
"../../brave/android/java/org/chromium/chrome/browser/vpn/adapters/BraveVpnServerSelectionAdapter.java",
470+
"../../brave/android/java/org/chromium/chrome/browser/vpn/adapters/VpnServerAdapter.java",
468471
"../../brave/android/java/org/chromium/chrome/browser/vpn/fragments/BraveVpnAlwaysOnErrorDialogFragment.java",
469472
"../../brave/android/java/org/chromium/chrome/browser/vpn/fragments/BraveVpnConfirmDialogFragment.java",
470473
"../../brave/android/java/org/chromium/chrome/browser/vpn/fragments/LinkVpnSubscriptionDialogFragment.java",

android/java/AndroidManifest.xml

+6
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,12 @@
110110
android:screenOrientation="sensorPortrait"
111111
tools:ignore="LockedOrientationActivity,DiscouragedApi"/>
112112

113+
<activity
114+
android:name="org.chromium.chrome.browser.vpn.activities.VpnServerActivity"
115+
android:theme="@style/Theme.Chromium.Activity"
116+
android:screenOrientation="sensorPortrait"
117+
tools:ignore="LockedOrientationActivity,DiscouragedApi"/>
118+
113119
<activity
114120
android:name="org.chromium.chrome.browser.vpn.activities.BraveVpnParentActivity"
115121
android:theme="@style/Theme.Chromium.Activity"

android/java/org/chromium/chrome/browser/app/BraveActivity.java

-22
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,6 @@
195195
import org.chromium.chrome.browser.vpn.BraveVpnObserver;
196196
import org.chromium.chrome.browser.vpn.activities.BraveVpnProfileActivity;
197197
import org.chromium.chrome.browser.vpn.fragments.LinkVpnSubscriptionDialogFragment;
198-
import org.chromium.chrome.browser.vpn.models.BraveVpnServerRegion;
199198
import org.chromium.chrome.browser.vpn.timer.TimerDialogFragment;
200199
import org.chromium.chrome.browser.vpn.utils.BraveVpnApiResponseUtils;
201200
import org.chromium.chrome.browser.vpn.utils.BraveVpnPrefUtils;
@@ -1160,11 +1159,6 @@ public void finishNativeInitialization() {
11601159

11611160
checkFingerPrintingOnUpgrade(isFirstInstall);
11621161
checkForVpnCallout(isFirstInstall);
1163-
if (!isFirstInstall
1164-
&& !BraveVpnPrefUtils.isIsoCodeUpgradeDone()
1165-
&& BraveVpnPrefUtils.isSubscriptionPurchase()) {
1166-
BraveVpnNativeWorker.getInstance().getAllServerRegions();
1167-
}
11681162

11691163
if (ChromeFeatureList.isEnabled(BraveFeatureList.BRAVE_VPN_LINK_SUBSCRIPTION_ANDROID_UI)
11701164
&& BraveVpnPrefUtils.isSubscriptionPurchase()
@@ -1345,22 +1339,6 @@ private void startAppUpdateFlow(AppUpdateInfo appUpdateInfo, int appUpdateType)
13451339
}
13461340
}
13471341

1348-
@Override
1349-
public void onGetAllServerRegions(String jsonResponse, boolean isSuccess) {
1350-
if (isSuccess) {
1351-
List<BraveVpnServerRegion> braveVpnServerRegions =
1352-
BraveVpnUtils.getServerLocations(jsonResponse);
1353-
for (BraveVpnServerRegion braveVpnServerRegion : braveVpnServerRegions) {
1354-
if (braveVpnServerRegion.getName().equals(BraveVpnPrefUtils.getServerRegion())) {
1355-
BraveVpnPrefUtils.setServerIsoCode(braveVpnServerRegion.getCountryIsoCode());
1356-
BraveVpnPrefUtils.setServerNamePretty(braveVpnServerRegion.getNamePretty());
1357-
BraveVpnPrefUtils.setIsoCodeUpgrade(true);
1358-
break;
1359-
}
1360-
}
1361-
}
1362-
}
1363-
13641342
private void handleDeepLinkVpn() {
13651343
mIsDeepLink = true;
13661344
BraveVpnUtils.openBraveVpnPlansActivity(this);

android/java/org/chromium/chrome/browser/appmenu/BraveTabbedAppMenuPropertiesDelegate.java

+8-9
Original file line numberDiff line numberDiff line change
@@ -125,19 +125,18 @@ public void prepareMenu(Menu menu, AppMenuHandler handler) {
125125
}
126126

127127
if (BraveVpnPrefUtils.isSubscriptionPurchase()
128-
&& !TextUtils.isEmpty(BraveVpnPrefUtils.getServerIsoCode())) {
129-
String serverLocation =
130-
" "
131-
+ BraveVpnUtils.countryCodeToEmoji(
132-
BraveVpnPrefUtils.getServerIsoCode())
133-
+ " "
134-
+ BraveVpnPrefUtils.getServerNamePretty();
135-
128+
&& !TextUtils.isEmpty(BraveVpnPrefUtils.getRegionIsoCode())) {
129+
String serverLocation = " %s %s";
136130
SubMenu vpnLocationSubMenu =
137131
menu.findItem(R.id.request_vpn_location_row_menu_id).getSubMenu();
138132
MenuItem vpnLocationSubMenuItem =
139133
vpnLocationSubMenu.findItem(R.id.request_vpn_location_id);
140-
vpnLocationSubMenuItem.setTitle(serverLocation);
134+
vpnLocationSubMenuItem.setTitle(
135+
String.format(
136+
serverLocation,
137+
BraveVpnUtils.countryCodeToEmoji(
138+
BraveVpnPrefUtils.getRegionIsoCode()),
139+
BraveVpnPrefUtils.getRegionNamePretty()));
141140
MenuItem vpnLocationIconSubMenuItem =
142141
vpnLocationSubMenu.findItem(R.id.request_vpn_location_icon_id);
143142
Drawable drawable = vpnLocationIconSubMenuItem.getIcon();

android/java/org/chromium/chrome/browser/vpn/BraveVpnNativeWorker.java

+47-25
Original file line numberDiff line numberDiff line change
@@ -72,13 +72,6 @@ private void setNativePtr(long nativePtr) {
7272
mNativeBraveVpnNativeWorker = nativePtr;
7373
}
7474

75-
@CalledByNative
76-
public void onGetAllServerRegions(String jsonServerRegions, boolean isSuccess) {
77-
for (BraveVpnObserver observer : mObservers) {
78-
observer.onGetAllServerRegions(jsonServerRegions, isSuccess);
79-
}
80-
}
81-
8275
@CalledByNative
8376
public void onGetTimezonesForRegions(String jsonTimezones, boolean isSuccess) {
8477
for (BraveVpnObserver observer : mObservers) {
@@ -130,16 +123,13 @@ public void onVerifyPurchaseToken(
130123
}
131124
}
132125

133-
public void getAllServerRegions() {
134-
BraveVpnNativeWorkerJni.get().getAllServerRegions(mNativeBraveVpnNativeWorker);
135-
}
136-
137126
public void getTimezonesForRegions() {
138127
BraveVpnNativeWorkerJni.get().getTimezonesForRegions(mNativeBraveVpnNativeWorker);
139128
}
140129

141-
public void getHostnamesForRegion(String region) {
142-
BraveVpnNativeWorkerJni.get().getHostnamesForRegion(mNativeBraveVpnNativeWorker, region);
130+
public void getHostnamesForRegion(String region, String regionPrecision) {
131+
BraveVpnNativeWorkerJni.get()
132+
.getHostnamesForRegion(mNativeBraveVpnNativeWorker, region, regionPrecision);
143133
}
144134

145135
public void getWireguardProfileCredentials(
@@ -197,26 +187,58 @@ public void reportForegroundP3A() {
197187
@NativeMethods
198188
interface Natives {
199189
void init(BraveVpnNativeWorker caller);
190+
200191
void destroy(long nativeBraveVpnNativeWorker, BraveVpnNativeWorker caller);
201-
void getAllServerRegions(long nativeBraveVpnNativeWorker);
192+
202193
void getTimezonesForRegions(long nativeBraveVpnNativeWorker);
203-
void getHostnamesForRegion(long nativeBraveVpnNativeWorker, String region);
204-
void getWireguardProfileCredentials(long nativeBraveVpnNativeWorker,
205-
String subscriberCredential, String publicKey, String hostname);
206-
void verifyCredentials(long nativeBraveVpnNativeWorker, String hostname, String clientId,
207-
String subscriberCredential, String apiAuthToken);
208-
void invalidateCredentials(long nativeBraveVpnNativeWorker, String hostname,
209-
String clientId, String subscriberCredential, String apiAuthToken);
210-
void getSubscriberCredential(long nativeBraveVpnNativeWorker, String productType,
211-
String productId, String validationMethod, String purchaseToken,
194+
195+
void getHostnamesForRegion(
196+
long nativeBraveVpnNativeWorker, String region, String regionPrecision);
197+
198+
void getWireguardProfileCredentials(
199+
long nativeBraveVpnNativeWorker,
200+
String subscriberCredential,
201+
String publicKey,
202+
String hostname);
203+
204+
void verifyCredentials(
205+
long nativeBraveVpnNativeWorker,
206+
String hostname,
207+
String clientId,
208+
String subscriberCredential,
209+
String apiAuthToken);
210+
211+
void invalidateCredentials(
212+
long nativeBraveVpnNativeWorker,
213+
String hostname,
214+
String clientId,
215+
String subscriberCredential,
216+
String apiAuthToken);
217+
218+
void getSubscriberCredential(
219+
long nativeBraveVpnNativeWorker,
220+
String productType,
221+
String productId,
222+
String validationMethod,
223+
String purchaseToken,
224+
String packageName);
225+
226+
void verifyPurchaseToken(
227+
long nativeBraveVpnNativeWorker,
228+
String purchaseToken,
229+
String productId,
230+
String productType,
212231
String packageName);
213-
void verifyPurchaseToken(long nativeBraveVpnNativeWorker, String purchaseToken,
214-
String productId, String productType, String packageName);
232+
215233
void reloadPurchasedState(long nativeBraveVpnNativeWorker);
234+
216235
boolean isPurchasedUser(long nativeBraveVpnNativeWorker);
236+
217237
void getSubscriberCredentialV12(long nativeBraveVpnNativeWorker);
238+
218239
void reportBackgroundP3A(
219240
long nativeBraveVpnNativeWorker, long sessionStartTimeMs, long sessionEndTimeMs);
241+
220242
void reportForegroundP3A(long nativeBraveVpnNativeWorker);
221243
}
222244
}

android/java/org/chromium/chrome/browser/vpn/BraveVpnObserver.java

-3
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,6 @@
66
package org.chromium.chrome.browser.vpn;
77

88
public interface BraveVpnObserver {
9-
public default void onGetAllServerRegions(String jsonServerRegions, boolean isSuccess) {}
10-
;
11-
129
public default void onGetTimezonesForRegions(String jsonTimezones, boolean isSuccess) {}
1310
;
1411

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
/* Copyright (c) 2024 The Brave Authors. All rights reserved.
2+
* This Source Code Form is subject to the terms of the Mozilla Public
3+
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
4+
* You can obtain one at https://mozilla.org/MPL/2.0/. */
5+
6+
package org.chromium.chrome.browser.vpn;
7+
8+
import org.jni_zero.JNINamespace;
9+
import org.jni_zero.NativeMethods;
10+
11+
import org.chromium.brave_vpn.mojom.ServiceHandler;
12+
import org.chromium.chrome.browser.profiles.Profile;
13+
import org.chromium.mojo.bindings.ConnectionErrorHandler;
14+
import org.chromium.mojo.bindings.Interface;
15+
import org.chromium.mojo.bindings.Interface.Proxy.Handler;
16+
import org.chromium.mojo.system.MessagePipeHandle;
17+
import org.chromium.mojo.system.impl.CoreImpl;
18+
19+
@JNINamespace("chrome::android")
20+
public class BraveVpnServiceFactoryAndroid {
21+
private static final Object sLock = new Object();
22+
private static BraveVpnServiceFactoryAndroid sInstance;
23+
24+
public static BraveVpnServiceFactoryAndroid getInstance() {
25+
synchronized (sLock) {
26+
if (sInstance == null) {
27+
sInstance = new BraveVpnServiceFactoryAndroid();
28+
}
29+
}
30+
return sInstance;
31+
}
32+
33+
private BraveVpnServiceFactoryAndroid() {}
34+
35+
public ServiceHandler getVpnService(
36+
Profile profile, ConnectionErrorHandler connectionErrorHandler) {
37+
if (profile == null) {
38+
return null;
39+
}
40+
long nativeHandle =
41+
BraveVpnServiceFactoryAndroidJni.get().getInterfaceToVpnService(profile);
42+
if (nativeHandle == -1) {
43+
return null;
44+
}
45+
MessagePipeHandle handle = wrapNativeHandle(nativeHandle);
46+
ServiceHandler serviceHandler = ServiceHandler.MANAGER.attachProxy(handle, 0);
47+
Handler handler = ((Interface.Proxy) serviceHandler).getProxyHandler();
48+
handler.setErrorHandler(connectionErrorHandler);
49+
50+
return serviceHandler;
51+
}
52+
53+
private MessagePipeHandle wrapNativeHandle(long nativeHandle) {
54+
return CoreImpl.getInstance().acquireNativeHandle(nativeHandle).toMessagePipeHandle();
55+
}
56+
57+
@NativeMethods
58+
interface Natives {
59+
long getInterfaceToVpnService(Profile profile);
60+
}
61+
}

0 commit comments

Comments
 (0)