From c3d0e6a8d265f1c131eefe0ac4c077b49c93598c Mon Sep 17 00:00:00 2001
From: Florian Mayer <fmayer@google.com>
Date: Fri, 21 Jan 2022 15:14:23 -0800
Subject: [PATCH] [MTE] show notification if using MTE bootloader switch.

ro.arm64.memtag.bootctl_supported can be set by OEMs that do not want to
enable MTE by default yet but want to offer users a preview that can be
enabled in the Developer Options. This developer option will reboot the
phone and enable MTE. In that case we want to show a notification to
make sure the user does not forget that it is enabled.

Bug: 206895651
Change-Id: Iaebc16d4b8d0da302f18709e23062f4a5bd58fe3
---
 core/res/res/values/strings.xml               |  5 ++++
 core/res/res/values/symbols.xml               |  2 ++
 proto/src/system_messages.proto               |  4 +++
 .../server/am/ActivityManagerService.java     | 30 +++++++++++++++++++
 4 files changed, 41 insertions(+)

diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index 6577ebc8cd3f..bbbd88ddb67f 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -3838,6 +3838,11 @@
     <!-- Message of notification shown when serial console is enabled. [CHAR LIMIT=NONE] -->
     <string name="console_running_notification_message">Performance is impacted. To disable, check bootloader.</string>
 
+    <!-- Title of notification shown when MTE status override is enabled. [CHAR LIMIT=NONE] -->
+    <string name="mte_override_notification_title">Experimental MTE enabled</string>
+    <!-- Message of notification shown when MTE status override is enabled. [CHAR LIMIT=NONE] -->
+    <string name="mte_override_notification_message">Performance and stability might be impacted. Reboot to disable. If enabled using arm64.memtag.bootctl, set it to "none" beforehand.</string>
+
     <!-- Title of notification shown when contaminant is detected on the USB port. [CHAR LIMIT=NONE] -->
     <string name="usb_contaminant_detected_title">Liquid or debris in USB port</string>
     <!-- Message of notification shown when contaminant is detected on the USB port. [CHAR LIMIT=NONE] -->
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 5e8851976556..b1a4206d3b9d 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -2091,6 +2091,8 @@
   <java-symbol type="string" name="test_harness_mode_notification_message" />
   <java-symbol type="string" name="console_running_notification_title" />
   <java-symbol type="string" name="console_running_notification_message" />
+  <java-symbol type="string" name="mte_override_notification_title" />
+  <java-symbol type="string" name="mte_override_notification_message" />
   <java-symbol type="string" name="taking_remote_bugreport_notification_title" />
   <java-symbol type="string" name="share_remote_bugreport_notification_title" />
   <java-symbol type="string" name="sharing_remote_bugreport_notification_title" />
diff --git a/proto/src/system_messages.proto b/proto/src/system_messages.proto
index 196c6aaa7fcb..3648593e5dd5 100644
--- a/proto/src/system_messages.proto
+++ b/proto/src/system_messages.proto
@@ -282,6 +282,10 @@ message SystemMessage {
     // Notify the user to set up dream
     NOTE_SETUP_DREAM = 68;
 
+    // Inform the user that MTE override is active.
+    // Package: android
+    NOTE_MTE_OVERRIDE_ENABLED = 69;
+
     // ADD_NEW_IDS_ABOVE_THIS_LINE
     // Legacy IDs with arbitrary values appear below
     // Legacy IDs existed as stable non-conflicting constants prior to the O release
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index f67e732b47dd..5a49fb2c0504 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -4948,6 +4948,7 @@ public class ActivityManagerService extends IActivityManager.Stub
         }
         // UART is on if init's console service is running, send a warning notification.
         showConsoleNotificationIfActive();
+        showMteOverrideNotificationIfActive();
 
         t.traceEnd();
     }
@@ -4982,6 +4983,35 @@ public class ActivityManagerService extends IActivityManager.Stub
 
     }
 
+    private void showMteOverrideNotificationIfActive() {
+        if (!SystemProperties.getBoolean("ro.arm64.memtag.bootctl_supported", false)
+            || !com.android.internal.os.Zygote.nativeSupportsMemoryTagging()) {
+            return;
+        }
+        String title = mContext
+                .getString(com.android.internal.R.string.mte_override_notification_title);
+        String message = mContext
+                .getString(com.android.internal.R.string.mte_override_notification_message);
+        Notification notification =
+                new Notification.Builder(mContext, SystemNotificationChannels.DEVELOPER)
+                        .setSmallIcon(com.android.internal.R.drawable.stat_sys_adb)
+                        .setOngoing(true)
+                        .setTicker(title)
+                        .setDefaults(0)  // please be quiet
+                        .setColor(mContext.getColor(
+                                com.android.internal.R.color
+                                        .system_notification_accent_color))
+                        .setContentTitle(title)
+                        .setContentText(message)
+                        .setVisibility(Notification.VISIBILITY_PUBLIC)
+                        .build();
+
+        NotificationManager notificationManager =
+                mContext.getSystemService(NotificationManager.class);
+        notificationManager.notifyAsUser(
+                null, SystemMessage.NOTE_MTE_OVERRIDE_ENABLED, notification, UserHandle.ALL);
+    }
+
     @Override
     public void bootAnimationComplete() {
         if (DEBUG_ALL) Slog.d(TAG, "bootAnimationComplete: Callers=" + Debug.getCallers(4));
-- 
GitLab