Add a primary action to slices from keyguard slice provider

We'll be enforcing requiring a primary action on slices.
There isn't a clear action that makes sense for these
slices... which is unfortunate but add a dummy one for now.

Test: atest KeyguardSliceProviderTest
Bug: 77855834
Change-Id: Ic37f9a8eba463654b3b2b93c1df9cb97d6d688a2
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java
index 97cf1e5..12ac805 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java
@@ -52,6 +52,7 @@
 import com.android.systemui.tuner.TunerService;
 import com.android.systemui.util.wakelock.KeepAwakeAnimationListener;
 
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.function.Consumer;
@@ -156,7 +157,15 @@
 
         ListContent lc = new ListContent(getContext(), mSlice);
         mHasHeader = lc.hasHeader();
-        List<SliceItem> subItems = lc.getRowItems();
+        List<SliceItem> subItems = new ArrayList<SliceItem>();
+        for (int i = 0; i < lc.getRowItems().size(); i++) {
+            SliceItem subItem = lc.getRowItems().get(i);
+            String itemUri = subItem.getSlice().getUri().toString();
+            // Filter out the action row
+            if (!KeyguardSliceProvider.KEYGUARD_ACTION_URI.equals(itemUri)) {
+                subItems.add(subItem);
+            }
+        }
         if (!mHasHeader) {
             mTitle.setVisibility(GONE);
         } else {
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java
index 8b9bf77..fe8ea34 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java
@@ -19,6 +19,7 @@
 import android.app.ActivityManager;
 import android.app.AlarmManager;
 import android.app.NotificationManager;
+import android.app.PendingIntent;
 import android.content.BroadcastReceiver;
 import android.content.ContentResolver;
 import android.content.Context;
@@ -48,6 +49,7 @@
 import androidx.slice.SliceProvider;
 import androidx.slice.builders.ListBuilder;
 import androidx.slice.builders.ListBuilder.RowBuilder;
+import androidx.slice.builders.SliceAction;
 
 /**
  * Simple Slice provider that shows the current date.
@@ -60,6 +62,8 @@
     public static final String KEYGUARD_NEXT_ALARM_URI =
             "content://com.android.systemui.keyguard/alarm";
     public static final String KEYGUARD_DND_URI = "content://com.android.systemui.keyguard/dnd";
+    public static final String KEYGUARD_ACTION_URI =
+            "content://com.android.systemui.keyguard/action";
 
     /**
      * Only show alarms that will ring within N hours.
@@ -127,9 +131,22 @@
         builder.addRow(new RowBuilder(builder, mDateUri).setTitle(mLastText));
         addNextAlarm(builder);
         addZenMode(builder);
+        addPrimaryAction(builder);
         return builder.build();
     }
 
+    protected void addPrimaryAction(ListBuilder builder) {
+        // Add simple action because API requires it; Keyguard handles presenting
+        // its own slices so this action + icon are actually never used.
+        PendingIntent pi = PendingIntent.getActivity(getContext(), 0, new Intent(), 0);
+        Icon icon = Icon.createWithResource(getContext(), R.drawable.ic_access_alarms_big);
+        SliceAction action = new SliceAction(pi, icon, mLastText);
+
+        RowBuilder primaryActionRow = new RowBuilder(builder, Uri.parse(KEYGUARD_ACTION_URI))
+            .setPrimaryAction(action);
+        builder.addRow(primaryActionRow);
+    }
+
     protected void addNextAlarm(ListBuilder builder) {
         if (TextUtils.isEmpty(mNextAlarm)) {
             return;