Skip to content

Commit 2d4457b

Browse files
committed
Added foreground service support
Signed-off-by: ddeviatilov <[email protected]>
1 parent f0b45d5 commit 2d4457b

File tree

4 files changed

+31
-2
lines changed

4 files changed

+31
-2
lines changed

tunnel/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ android {
6868
dependencies {
6969
implementation(libs.androidx.annotation)
7070
implementation(libs.androidx.collection)
71+
implementation(libs.androidx.core.ktx)
7172
compileOnly(libs.jsr305)
7273
testImplementation(libs.junit)
7374
}

tunnel/src/main/AndroidManifest.xml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,15 @@
55

66
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
77

8+
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_SYSTEM_EXEMPTED" />
9+
810
<application>
911
<service
1012
android:name="com.wireguard.android.backend.GoBackend$VpnService"
1113
android:permission="android.permission.BIND_VPN_SERVICE"
12-
android:exported="false">
14+
android:exported="false"
15+
android:persistent="true"
16+
android:foregroundServiceType="systemExempted">
1317
<intent-filter>
1418
<action android:name="android.net.VpnService" />
1519
</intent-filter>

tunnel/src/main/java/com/wireguard/android/backend/GoBackend.java

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,11 @@
55

66
package com.wireguard.android.backend;
77

8+
import android.app.ForegroundServiceStartNotAllowedException;
9+
import android.app.Notification;
810
import android.content.Context;
911
import android.content.Intent;
12+
import android.content.pm.ServiceInfo;
1013
import android.os.Build;
1114
import android.os.ParcelFileDescriptor;
1215
import android.system.OsConstants;
@@ -24,7 +27,6 @@
2427
import com.wireguard.util.NonNullForAll;
2528

2629
import java.net.InetAddress;
27-
import java.time.Instant;
2830
import java.util.Collections;
2931
import java.util.Set;
3032
import java.util.concurrent.ExecutionException;
@@ -35,6 +37,8 @@
3537

3638
import androidx.annotation.Nullable;
3739
import androidx.collection.ArraySet;
40+
import androidx.core.app.NotificationCompat;
41+
import androidx.core.app.ServiceCompat;
3842

3943
/**
4044
* Implementation of {@link Backend} that uses the wireguard-go userspace implementation to provide
@@ -392,6 +396,9 @@ public GhettoCompletableFuture<V> newIncompleteFuture() {
392396
* {@link android.net.VpnService} implementation for {@link GoBackend}
393397
*/
394398
public static class VpnService extends android.net.VpnService {
399+
400+
private static final int NOTIFICATION_ID = 999;
401+
private static final String CHANNEL_ID = "VPN_CHANNEL";
395402
@Nullable private GoBackend owner;
396403

397404
public Builder getBuilder() {
@@ -423,6 +430,7 @@ public void onDestroy() {
423430

424431
@Override
425432
public int onStartCommand(@Nullable final Intent intent, final int flags, final int startId) {
433+
startForeground();
426434
vpnService.complete(this);
427435
if (intent == null || intent.getComponent() == null || !intent.getComponent().getPackageName().equals(getPackageName())) {
428436
Log.d(TAG, "Service started by Always-on VPN feature");
@@ -435,5 +443,20 @@ public int onStartCommand(@Nullable final Intent intent, final int flags, final
435443
public void setOwner(final GoBackend owner) {
436444
this.owner = owner;
437445
}
446+
447+
private void startForeground() {
448+
try {
449+
final Notification notification = new NotificationCompat
450+
.Builder(this, CHANNEL_ID)
451+
.build();
452+
ServiceCompat.startForeground(this, NOTIFICATION_ID, notification, ServiceInfo.FOREGROUND_SERVICE_TYPE_SYSTEM_EXEMPTED);
453+
} catch (final Exception ex) {
454+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S &&
455+
ex instanceof ForegroundServiceStartNotAllowedException
456+
) {
457+
Log.d(TAG, "App not in a valid state to start foreground service");
458+
}
459+
}
460+
}
438461
}
439462
}

wireguard-android

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Subproject commit f0b45d50f332cd532ee9f62cd51582da6fea7e49

0 commit comments

Comments
 (0)