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;