Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d746f0b8 authored by Steve Elliott's avatar Steve Elliott
Browse files

Fix NPEs in SmartRepliesAndActionsInflater flows

Fixes: 170366658
Test: atest PlatformScenarioTests:android.platform.test.scenario.sysui.notification.NotificationContent#notificationContentTest -- --abi arm64-v8a
Change-Id: Ic04ce708f07e19fda271c1c8bd816ffc2333b3c9
parent 4f97e7aa
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -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();
    }

+28 −23
Original line number Diff line number Diff line
@@ -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,26 +204,31 @@ 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,
            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 */)
                            }
            if (entry.smartActions.isNotEmpty()
                    && notification.allowSystemGeneratedContextualActions) {
                    }
            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(entry.smartActions)
                    else -> entry.smartActions
                                // 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 = SmartActions(systemGeneratedActions, true /* fromAssistant */)
                        SmartActions(systemGeneratedActions, true /* fromAssistant */)
                    }
        }
        return SmartRepliesAndActions(smartReplies, smartActions)
+1 −2
Original line number Diff line number Diff line
@@ -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();
    }