Merge pull request #13640 from brave/brave_vpn_notification_update
Add notification changes for VPN
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user