diff --git a/briar-android/src/main/java/org/briarproject/briar/android/BriarService.java b/briar-android/src/main/java/org/briarproject/briar/android/BriarService.java index 633a9f3c21d88a560a52381f109ea5141725a37a..c88bf061bc77781ee3632c43fc6dccde1ea99e45 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/BriarService.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/BriarService.java @@ -4,8 +4,11 @@ import android.app.NotificationChannel; import android.app.NotificationManager; import android.app.PendingIntent; import android.app.Service; +import android.content.BroadcastReceiver; import android.content.ComponentName; +import android.content.Context; import android.content.Intent; +import android.content.IntentFilter; import android.content.ServiceConnection; import android.os.Binder; import android.os.IBinder; @@ -24,11 +27,13 @@ import java.util.concurrent.CountDownLatch; import java.util.concurrent.atomic.AtomicBoolean; import java.util.logging.Logger; +import javax.annotation.Nullable; import javax.inject.Inject; import static android.app.NotificationManager.IMPORTANCE_DEFAULT; import static android.app.NotificationManager.IMPORTANCE_NONE; import static android.app.PendingIntent.FLAG_UPDATE_CURRENT; +import static android.content.Intent.ACTION_SHUTDOWN; import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TASK; import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TOP; import static android.content.Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS; @@ -65,6 +70,9 @@ public class BriarService extends Service { private final AtomicBoolean created = new AtomicBoolean(false); private final Binder binder = new BriarBinder(); + @Nullable + private BroadcastReceiver receiver = null; + @Inject protected DatabaseConfig databaseConfig; // Fields that are accessed from background threads must be volatile @@ -144,6 +152,19 @@ public class BriarService extends Service { stopSelf(); } }).start(); + // Register for device shutdown broadcasts + receiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + LOG.info("Device is shutting down"); + shutdownFromBackground(); + } + }; + IntentFilter filter = new IntentFilter(); + filter.addAction(ACTION_SHUTDOWN); + filter.addAction("android.intent.action.QUICKBOOT_POWEROFF"); + filter.addAction("com.htc.intent.action.QUICKBOOT_POWEROFF"); + registerReceiver(receiver, filter); } private void showStartupFailureNotification(StartResult result) { @@ -188,6 +209,7 @@ public class BriarService extends Service { super.onDestroy(); LOG.info("Destroyed"); stopForeground(true); + if (receiver != null) unregisterReceiver(receiver); // Stop the services in a background thread new Thread(() -> { if (started) lifecycleManager.stopServices();