diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index aa8a399..dd7e9b1 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -6,7 +6,6 @@
-
diff --git a/app/src/main/java/org/osservatorionessuno/bugbane/utils/AdbManager.kt b/app/src/main/java/org/osservatorionessuno/bugbane/utils/AdbManager.kt
index 6deb2ad..487cda6 100644
--- a/app/src/main/java/org/osservatorionessuno/bugbane/utils/AdbManager.kt
+++ b/app/src/main/java/org/osservatorionessuno/bugbane/utils/AdbManager.kt
@@ -71,7 +71,9 @@ class AdbManager(applicationContext: Context) {
}
}
- // Cancel the notification, if it's still showing
+ // Cancel the notification, if it's still showing.
+ // Note: keep this cleanup despite onTimeout() in AdbPairingService, because Android
+ // versions < 34 don't call onTimeout().
val stopIntent = AdbPairingService.stopIntent(appContext)
appContext?.stopService(stopIntent)
}
diff --git a/app/src/main/java/org/osservatorionessuno/bugbane/utils/AdbPairingService.java b/app/src/main/java/org/osservatorionessuno/bugbane/utils/AdbPairingService.java
index f0f9f5d..b795797 100644
--- a/app/src/main/java/org/osservatorionessuno/bugbane/utils/AdbPairingService.java
+++ b/app/src/main/java/org/osservatorionessuno/bugbane/utils/AdbPairingService.java
@@ -1,5 +1,6 @@
package org.osservatorionessuno.bugbane.utils;
+import android.annotation.SuppressLint;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
@@ -12,6 +13,8 @@
import android.os.Build;
import android.os.IBinder;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
+
import android.util.Log;
import java.net.InetAddress;
@@ -65,6 +68,8 @@ public void onCreate() {
nm.createNotificationChannel(channel);
}
+ // See docs below on ServiceInfo.FOREGROUND_SERVICE_TYPE_SHORT_SERVICE
+ @SuppressLint("InlinedApi")
@Override
public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
Notification notification = null;
@@ -88,7 +93,14 @@ public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
}
if (notification != null) {
try {
- startForeground(NOTIFICATION_ID, notification, ServiceInfo.FOREGROUND_SERVICE_TYPE_SPECIAL_USE);
+ // From https://developer.android.com/reference/android/content/pm/ServiceInfo:
+ // [E]ven though FOREGROUND_SERVICE_TYPE_SHORT_SERVICE was added on Android version
+ // Build.VERSION_CODES.UPSIDE_DOWN_CAKE, it can be also used on on prior android
+ // versions (just like other new foreground service types can be used).
+ // However, because Service.onTimeout(int) did not exist on prior versions, it will
+ // never called on such versions. Because of this, developers must make sure to stop
+ // the foreground service even if Service.onTimeout(int) is not called on such versions.
+ startForeground(NOTIFICATION_ID, notification, ServiceInfo.FOREGROUND_SERVICE_TYPE_SHORT_SERVICE);
} catch (Throwable th) {
Log.e(TAG, "startForeground failed", th);
getSystemService(NotificationManager.class).notify(NOTIFICATION_ID, notification);
@@ -123,6 +135,13 @@ public void onDestroy() {
stopSearch();
}
+ @RequiresApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
+ @Override
+ public void onTimeout(int service) {
+ // Called by system if SHORT_SERVICE exceeds 3 minute lifespan
+ stopSelf();
+ }
+
private Notification onStart() {
startSearch();
return searchingNotification();