Fix NPEs in SmartRepliesAndActionsInflater flows

Fixes: 170366658
Test: atest PlatformScenarioTests:android.platform.test.scenario.sysui.notification.NotificationContent#notificationContentTest -- --abi arm64-v8a
Change-Id: Ic04ce708f07e19fda271c1c8bd816ffc2333b3c9
This commit is contained in:
Steve Elliott
2020-10-08 13:42:50 -04:00
parent 4f97e7aa48
commit d746f0b8aa
3 changed files with 31 additions and 27 deletions

View File

@@ -329,11 +329,11 @@ public final class NotificationEntry extends ListEntry {
return mRanking.canBubble();
}
public @NonNull List<Notification.Action> getSmartActions() {
public @Nullable List<Notification.Action> getSmartActions() {
return mRanking.getSmartActions();
}
public @NonNull List<CharSequence> getSmartReplies() {
public @Nullable List<CharSequence> getSmartReplies() {
return mRanking.getSmartReplies();
}

View File

@@ -86,7 +86,7 @@ interface SmartRepliesAndActionsInflater {
sysuiContext: Context,
notifPackageContext: Context,
entry: NotificationEntry,
existingRepliesAndAction: SmartRepliesAndActions
existingRepliesAndAction: SmartRepliesAndActions?
): InflatedSmartReplies
}
@@ -103,7 +103,7 @@ interface SmartRepliesAndActionsInflater {
sysuiContext: Context,
notifPackageContext: Context,
entry: NotificationEntry,
existingRepliesAndAction: SmartRepliesAndActions
existingRepliesAndAction: SmartRepliesAndActions?
): InflatedSmartReplies {
val newRepliesAndActions = chooseSmartRepliesAndActions(entry)
if (!shouldShowSmartReplyView(entry, newRepliesAndActions)) {
@@ -204,27 +204,32 @@ interface SmartRepliesAndActionsInflater {
}
// Apps didn't provide any smart replies / actions, use those from NAS (if any).
if (smartReplies == null && smartActions == null) {
if (entry.smartReplies.isNotEmpty()
&& freeformRemoteInputActionPair != null
&& freeformRemoteInputActionPair.second.allowGeneratedReplies
&& freeformRemoteInputActionPair.second.actionIntent != null) {
smartReplies = SmartReplies(
entry.smartReplies,
freeformRemoteInputActionPair.first,
freeformRemoteInputActionPair.second.actionIntent,
true /* fromAssistant */)
}
if (entry.smartActions.isNotEmpty()
&& notification.allowSystemGeneratedContextualActions) {
val systemGeneratedActions: List<Notification.Action> = when {
activityManagerWrapper.isLockTaskKioskModeActive ->
// Filter actions if we're in kiosk-mode - we don't care about screen
// pinning mode, since notifications aren't shown there anyway.
filterAllowlistedLockTaskApps(entry.smartActions)
else -> entry.smartActions
}
smartActions = SmartActions(systemGeneratedActions, true /* fromAssistant */)
}
smartReplies = entry.smartReplies
?.takeIf { it.isNotEmpty() }
?.let { entryReplies -> freeformRemoteInputActionPair
?.takeIf {
it.second.allowGeneratedReplies && it.second.actionIntent != null
}?.let { freeformPair -> SmartReplies(
entryReplies,
freeformPair.first,
freeformPair.second.actionIntent,
true /* fromAssistant */)
}
}
smartActions = entry.smartActions
?.takeIf {
it.isNotEmpty() && notification.allowSystemGeneratedContextualActions
}?.let { entryActions ->
val systemGeneratedActions: List<Notification.Action> = when {
activityManagerWrapper.isLockTaskKioskModeActive ->
// Filter actions if we're in kiosk-mode - we don't care about
// screen pinning mode, since notifications aren't shown there
// anyway.
filterAllowlistedLockTaskApps(entryActions)
else -> entryActions
}
SmartActions(systemGeneratedActions, true /* fromAssistant */)
}
}
return SmartRepliesAndActions(smartReplies, smartActions)
}

View File

@@ -183,8 +183,7 @@ public class InflatedSmartRepliesTest extends SysuiTestCase {
SmartRepliesAndActions repliesAndActions =
mSmartRepliesInflater.chooseSmartRepliesAndActions(mEntry);
assertThat(repliesAndActions.smartReplies.choices).isEqualTo(
mEntry.getSmartReplies());
assertThat(repliesAndActions.smartReplies.choices).isEqualTo(mEntry.getSmartReplies());
assertThat(repliesAndActions.smartReplies.fromAssistant).isTrue();
assertThat(repliesAndActions.smartActions).isNull();
}