Merge pull request #13640 from brave/brave_vpn_notification_update

Add notification changes for VPN
This commit is contained in:
Deep Pandya
2022-06-08 11:47:49 -04:00
committed by GitHub
8 changed files with 176 additions and 35 deletions
+6
View File
@@ -21,6 +21,12 @@
<receiver android:name="org.chromium.chrome.browser.notifications.BraveOnboardingNotification"
android:exported="false">
</receiver>
<receiver android:name="org.chromium.chrome.browser.vpn.DisconnectVpnBroadcastReceiver"
android:exported="false">
<intent-filter>
<action android:name="disconnect_vpn" />
</intent-filter>
</receiver>
<activity
android:name="org.chromium.chrome.browser.onboarding.OnboardingActivity"
android:theme="@style/Theme.Chromium.Activity.Fullscreen"
@@ -0,0 +1,29 @@
/**
* Copyright (c) 2022 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 http://mozilla.org/MPL/2.0/.
*/
package org.chromium.chrome.browser.vpn;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import org.chromium.base.Log;
import org.chromium.chrome.browser.vpn.utils.BraveVpnProfileUtils;
import org.chromium.chrome.browser.vpn.wireguard.WireguardService;
public class DisconnectVpnBroadcastReceiver extends BroadcastReceiver {
public static String DISCONNECT_VPN_ACTION = "disconnect_vpn_action";
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action != null && action.equals(DISCONNECT_VPN_ACTION)) {
Log.e("BraveVPN", action);
context.stopService(new Intent(context, WireguardService.class));
}
}
}
@@ -8,8 +8,6 @@
package org.chromium.chrome.browser.vpn.utils;
import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
@@ -17,7 +15,6 @@ import android.os.Build;
import android.text.TextUtils;
import android.util.Pair;
import androidx.core.app.NotificationCompat;
import androidx.fragment.app.FragmentActivity;
import org.json.JSONArray;
@@ -27,7 +24,6 @@ import org.json.JSONObject;
import org.chromium.base.ContextUtils;
import org.chromium.base.Log;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.app.BraveActivity;
import org.chromium.chrome.browser.util.BraveConstants;
import org.chromium.chrome.browser.vpn.activities.BraveVpnPlansActivity;
import org.chromium.chrome.browser.vpn.activities.BraveVpnProfileActivity;
@@ -50,7 +46,6 @@ public class BraveVpnUtils {
public static final String SUBSCRIPTION_PARAM_TEXT = "subscription";
public static final String IAP_ANDROID_PARAM_TEXT = "iap-android";
public static final String VERIFY_CREDENTIALS_FAILED = "verify_credentials_failed";
public static final int BRAVE_VPN_NOTIFICATION_ID = 36;
public static boolean mIsServerLocationChanged;
public static String selectedServerRegion;
@@ -207,28 +202,6 @@ public class BraveVpnUtils {
return vpnServerRegions;
}
public static Notification getBraveVpnNotification(Context context) {
NotificationCompat.Builder notificationBuilder =
new NotificationCompat.Builder(context, BraveActivity.CHANNEL_ID);
notificationBuilder.setSmallIcon(R.drawable.ic_vpn)
.setAutoCancel(false)
.setContentTitle(context.getResources().getString(R.string.brave_firewall_vpn))
.setContentText(
context.getResources().getString(R.string.brave_vpn_notification_message))
.setStyle(new NotificationCompat.BigTextStyle().bigText(
context.getResources().getString(R.string.brave_vpn_notification_message)))
.setPriority(NotificationCompat.PRIORITY_DEFAULT);
return notificationBuilder.build();
}
public static void cancelBraveVpnNotification(Context context) {
NotificationManager notificationManager =
(NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.cancel(BRAVE_VPN_NOTIFICATION_ID);
}
public static void resetProfileConfiguration(Activity activity) {
if (BraveVpnProfileUtils.getInstance().isBraveVPNConnected(activity)) {
BraveVpnProfileUtils.getInstance().stopVpn(activity);
@@ -5,29 +5,46 @@
package org.chromium.chrome.browser.vpn.wireguard;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import androidx.annotation.Nullable;
import androidx.core.app.NotificationCompat;
import androidx.core.text.HtmlCompat;
import com.wireguard.android.backend.Backend;
import com.wireguard.android.backend.BackendException;
import com.wireguard.android.backend.GoBackend;
import com.wireguard.android.backend.Statistics;
import com.wireguard.android.backend.Tunnel;
import com.wireguard.config.Config;
import org.chromium.base.ContextUtils;
import org.chromium.base.IntentUtils;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.app.BraveActivity;
import org.chromium.chrome.browser.notifications.channels.BraveChannelDefinitions;
import org.chromium.chrome.browser.vpn.DisconnectVpnBroadcastReceiver;
import org.chromium.chrome.browser.vpn.utils.BraveVpnPrefUtils;
import org.chromium.chrome.browser.vpn.utils.BraveVpnUtils;
import java.util.Timer;
import java.util.TimerTask;
public class WireguardServiceImpl
extends WireguardService.Impl implements TunnelModel.TunnelStateUpdateListener {
private Backend mBackend;
private TunnelModel mTunnelModel;
private final IBinder mBinder = new LocalBinder();
private Timer mVpnStatisticsTimer;
private static final int BRAVE_VPN_NOTIFICATION_ID = 801;
private Context mContext = ContextUtils.getApplicationContext();
class LocalBinder extends Binder {
WireguardServiceImpl getService() {
@@ -48,7 +65,7 @@ public class WireguardServiceImpl
@Override
public void onCreate() {
super.onCreate();
mBackend = new GoBackend(ContextUtils.getApplicationContext());
mBackend = new GoBackend(mContext);
}
@Override
@@ -63,15 +80,78 @@ public class WireguardServiceImpl
}
}
}.start();
getService().startForeground(BraveChannelDefinitions.ChannelId.BRAVE_BROWSER_CHANNEL_INT,
BraveVpnUtils.getBraveVpnNotification(ContextUtils.getApplicationContext()));
getService().startForeground(BRAVE_VPN_NOTIFICATION_ID, getBraveVpnNotification(""));
return Service.START_NOT_STICKY;
}
private void startVpn() throws Exception {
Config config = WireguardConfigUtils.loadConfig(ContextUtils.getApplicationContext());
Config config = WireguardConfigUtils.loadConfig(mContext);
mTunnelModel = TunnelModel.createTunnel(config, this);
mBackend.setState(mTunnelModel, Tunnel.State.UP, config);
updateVpnStatisticsTimer();
}
private Notification getBraveVpnNotification(String notificationText) {
Intent disconnectVpnIntent = new Intent(mContext, DisconnectVpnBroadcastReceiver.class);
disconnectVpnIntent.setAction(DisconnectVpnBroadcastReceiver.DISCONNECT_VPN_ACTION);
PendingIntent disconnectVpnPendingIntent =
PendingIntent.getBroadcast(mContext, 0, disconnectVpnIntent,
PendingIntent.FLAG_UPDATE_CURRENT
| IntentUtils.getPendingIntentMutabilityFlag(true));
NotificationCompat.Builder notificationBuilder =
new NotificationCompat.Builder(mContext, BraveActivity.CHANNEL_ID);
notificationBuilder.setSmallIcon(R.drawable.ic_vpn)
.setAutoCancel(false)
.setContentTitle(
String.format(mContext.getResources().getString(R.string.connected_to_host),
BraveVpnPrefUtils.getHostnameDisplay()))
.setContentText(notificationText)
.setStyle(new NotificationCompat.BigTextStyle().bigText(notificationText))
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
.addAction(R.drawable.ic_vpn,
mContext.getResources().getString(R.string.disconnect),
disconnectVpnPendingIntent)
.setOnlyAlertOnce(true);
return notificationBuilder.build();
}
private void updateVpnNotification(String notificationText) {
Notification notification = getBraveVpnNotification(notificationText);
NotificationManager mNotificationManager =
(NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(BRAVE_VPN_NOTIFICATION_ID, notification);
}
private void updateVpnStatisticsTimer() {
mVpnStatisticsTimer = new Timer();
mVpnStatisticsTimer.schedule(new TimerTask() {
@Override
public void run() {
if (mBackend != null && mTunnelModel != null) {
try {
Statistics statistics = mBackend.getStatistics(mTunnelModel);
updateVpnNotification(String.format(
HtmlCompat
.fromHtml(mContext.getResources().getString(
R.string.transfer_rx_tx),
HtmlCompat.FROM_HTML_MODE_LEGACY)
.toString(),
WireguardUtils.formatBytes(mContext, statistics.totalRx()),
WireguardUtils.formatBytes(mContext, statistics.totalTx())));
} catch (Exception e) {
e.printStackTrace();
}
}
}
}, 0, 500);
}
private void cancelVpnStatisticsTimer() {
if (mVpnStatisticsTimer != null) {
mVpnStatisticsTimer.cancel();
}
}
@Override
@@ -81,6 +161,7 @@ public class WireguardServiceImpl
} catch (Exception e) {
e.printStackTrace();
}
cancelVpnStatisticsTimer();
super.onDestroy();
}
@@ -14,8 +14,11 @@ import com.wireguard.config.Interface;
import com.wireguard.config.Peer;
import com.wireguard.crypto.KeyPair;
import org.chromium.chrome.R;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
public class WireguardUtils {
public static Interface getInterface(String address, String clientPrivateKey)
@@ -50,4 +53,32 @@ public class WireguardUtils {
}
return false;
}
public static String formatBytes(Context context, Long bytes) {
String bytesString = "";
if (bytes < 1024) {
bytesString = String.format(context.getResources().getString(R.string.transfer_bytes),
String.format(Locale.getDefault(), "%.2f", (double) bytes));
} else if (bytes < 1024 * 1024) {
bytesString =
String.format(context.getResources().getString(R.string.transfer_kibibytes,
String.format(Locale.getDefault(), "%.2f", (double) (bytes / 1024.0))));
} else if (bytes < 1024 * 1024 * 1024) {
bytesString =
String.format(context.getResources().getString(R.string.transfer_mibibytes,
String.format(Locale.getDefault(), "%.2f",
(double) (bytes / (1024.0 * 1024.0)))));
} else if (bytes < 1024 * 1024 * 1024 * 1024L) {
bytesString =
String.format(context.getResources().getString(R.string.transfer_gibibytes,
String.format(Locale.getDefault(), "%.2f",
(double) (bytes / (1024.0 * 1024.0 * 1024.0)))));
} else {
bytesString =
String.format(context.getResources().getString(R.string.transfer_tibibytes,
String.format(Locale.getDefault(), "%.2f",
(double) (bytes / (1024.0 * 1024.0 * 1024.0) / 1024.0))));
}
return bytesString;
}
}