Notification during terminal closing
There is a little delay after shutdown, so change notification content
for a while. And it's useful just in case that shutdown is failing in
the guest
Bug: 381815559
Test: click 'close' in the notification
Change-Id: I7314e3c7b23c51bc677f89c133ca3d18391020d1
diff --git a/android/TerminalApp/java/com/android/virtualization/terminal/VmLauncherService.java b/android/TerminalApp/java/com/android/virtualization/terminal/VmLauncherService.java
index 9a70605..f262f1f 100644
--- a/android/TerminalApp/java/com/android/virtualization/terminal/VmLauncherService.java
+++ b/android/TerminalApp/java/com/android/virtualization/terminal/VmLauncherService.java
@@ -20,9 +20,11 @@
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.graphics.drawable.Icon;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
@@ -143,8 +145,13 @@
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if (Objects.equals(intent.getAction(), ACTION_STOP_VM_LAUNCHER_SERVICE)) {
- // If there is no Debian service or it fails to shutdown, just stop the service.
- if (mDebianService == null || !mDebianService.shutdownDebian()) {
+
+ if (mDebianService != null && mDebianService.shutdownDebian()) {
+ // During shutdown, change the notification content to indicate that it's closing
+ Notification notification = createNotificationForTerminalClose();
+ getSystemService(NotificationManager.class).notify(this.hashCode(), notification);
+ } else {
+ // If there is no Debian service or it fails to shutdown, just stop the service.
stopSelf();
}
return START_NOT_STICKY;
@@ -203,6 +210,32 @@
return START_NOT_STICKY;
}
+ private Notification createNotificationForTerminalClose() {
+ Intent stopIntent = new Intent();
+ stopIntent.setClass(this, VmLauncherService.class);
+ stopIntent.setAction(VmLauncherService.ACTION_STOP_VM_LAUNCHER_SERVICE);
+ PendingIntent stopPendingIntent =
+ PendingIntent.getService(
+ this,
+ 0,
+ stopIntent,
+ PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
+ Icon icon = Icon.createWithResource(getResources(), R.drawable.ic_launcher_foreground);
+ String stopActionText =
+ getResources().getString(R.string.service_notification_force_quit_action);
+ String stopNotificationTitle =
+ getResources().getString(R.string.service_notification_close_title);
+ return new Notification.Builder(this, this.getPackageName())
+ .setSmallIcon(R.drawable.ic_launcher_foreground)
+ .setContentTitle(stopNotificationTitle)
+ .setOngoing(true)
+ .setSilent(true)
+ .addAction(
+ new Notification.Action.Builder(icon, stopActionText, stopPendingIntent)
+ .build())
+ .build();
+ }
+
private boolean overrideConfigIfNecessary(VirtualMachineCustomImageConfig.Builder builder) {
boolean changed = false;
// TODO: check if ANGLE is enabled for the app.
diff --git a/android/TerminalApp/res/values/strings.xml b/android/TerminalApp/res/values/strings.xml
index 20fd95d..d21ded1 100644
--- a/android/TerminalApp/res/values/strings.xml
+++ b/android/TerminalApp/res/values/strings.xml
@@ -153,6 +153,11 @@
<!-- Notification action button for closing the virtual machine [CHAR LIMIT=20] -->
<string name="service_notification_quit_action">Close</string>
+ <!-- Notification title for foreground service notification during closing [CHAR LIMIT=none] -->
+ <string name="service_notification_close_title">Terminal is closing</string>
+ <!-- Notification action button for force-closing the virtual machine [CHAR LIMIT=30] -->
+ <string name="service_notification_force_quit_action">Force close</string>
+
<!-- This string is for toast message to notify that VirGL is enabled. [CHAR LIMIT=40] -->
<string name="virgl_enabled"><xliff:g>VirGL</xliff:g> is enabled</string>
</resources>