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

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

Inline notif pipeline flag in NotificationsModule

This change is a no-op; the flag is now enabled-by-default, so all
removed code paths here are effectively dead.

Bug: 200269355
Test: atest SystemUITests
Change-Id: Iff34ab616876046adeb7bf567c7dbdd8f4d481c4
parent 78212309
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import android.service.notification.NotificationStats;

import androidx.annotation.NonNull;

import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.notification.collection.NotifCollection;
import com.android.systemui.statusbar.notification.collection.NotifCollection.CancellationReason;
@@ -33,10 +34,13 @@ import com.android.systemui.statusbar.notification.collection.render.Notificatio
import com.android.systemui.statusbar.notification.row.OnUserInteractionCallback;
import com.android.systemui.statusbar.policy.HeadsUpManager;

import javax.inject.Inject;

/**
 * Callback for when a user interacts with a {@see ExpandableNotificationRow}. Sends relevant
 * information about the interaction to the notification pipeline.
 */
@SysUISingleton
public class OnUserInteractionCallbackImpl implements OnUserInteractionCallback {
    private final NotificationVisibilityProvider mVisibilityProvider;
    private final NotifCollection mNotifCollection;
@@ -44,6 +48,7 @@ public class OnUserInteractionCallbackImpl implements OnUserInteractionCallback
    private final StatusBarStateController mStatusBarStateController;
    private final VisualStabilityCoordinator mVisualStabilityCoordinator;

    @Inject
    public OnUserInteractionCallbackImpl(
            NotificationVisibilityProvider visibilityProvider,
            NotifCollection notifCollection,
+0 −100
Original line number Diff line number Diff line
/*
 * Copyright (C) 2010 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.systemui.statusbar.notification.collection.legacy;

import static com.android.systemui.statusbar.phone.CentralSurfaces.SPEW;

import android.service.notification.StatusBarNotification;
import android.util.Log;

import androidx.annotation.NonNull;

import com.android.internal.statusbar.NotificationVisibility;
import com.android.systemui.statusbar.notification.NotificationEntryListener;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.collection.render.NotifShadeEventSource;

import org.jetbrains.annotations.NotNull;

import javax.inject.Inject;

/**
 * This is some logic extracted from the
 * {@link com.android.systemui.statusbar.phone.StatusBarNotificationPresenter}
 * into a class that implements a new-pipeline interface so that the new pipeline can implement it
 * correctly.
 *
 * Specifically, this is the logic which updates notifications when uiMode and screen properties
 * change, and which closes the shade when the last notification disappears.
 */
public class LegacyNotificationPresenterExtensions implements NotifShadeEventSource {
    private static final String TAG = "LegacyNotifPresenter";
    private final NotificationEntryManager mEntryManager;
    private boolean mEntryListenerAdded;
    private Runnable mShadeEmptiedCallback;
    private Runnable mNotifRemovedByUserCallback;

    @Inject
    public LegacyNotificationPresenterExtensions(NotificationEntryManager entryManager) {
        mEntryManager = entryManager;
    }

    private void ensureEntryListenerAdded() {
        if (mEntryListenerAdded) return;
        mEntryListenerAdded = true;
        mEntryManager.addNotificationEntryListener(new NotificationEntryListener() {
            @Override
            public void onEntryRemoved(
                    @NotNull NotificationEntry entry,
                    NotificationVisibility visibility,
                    boolean removedByUser,
                    int reason) {
                StatusBarNotification old = entry.getSbn();
                if (SPEW) {
                    Log.d(TAG, "removeNotification key=" + entry.getKey()
                            + " old=" + old + " reason=" + reason);
                }

                if (old != null && !mEntryManager.hasActiveNotifications()) {
                    if (mShadeEmptiedCallback != null) mShadeEmptiedCallback.run();
                }
                if (removedByUser) {
                    if (mNotifRemovedByUserCallback != null) mNotifRemovedByUserCallback.run();
                }
            }
        });
    }

    @Override
    public void setNotifRemovedByUserCallback(@NonNull Runnable callback) {
        if (mNotifRemovedByUserCallback != null) {
            throw new IllegalStateException("mNotifRemovedByUserCallback already set");
        }
        mNotifRemovedByUserCallback = callback;
        ensureEntryListenerAdded();
    }

    @Override
    public void setShadeEmptiedCallback(@NonNull Runnable callback) {
        if (mShadeEmptiedCallback != null) {
            throw new IllegalStateException("mShadeEmptiedCallback already set");
        }
        mShadeEmptiedCallback = callback;
        ensureEntryListenerAdded();
    }
}
+0 −128
Original line number Diff line number Diff line
/*
 * Copyright (C) 2020 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.systemui.statusbar.notification.collection.legacy;

import static android.service.notification.NotificationStats.DISMISS_SENTIMENT_NEUTRAL;

import android.service.notification.NotificationListenerService;
import android.service.notification.NotificationStats;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.collection.NotifCollection.CancellationReason;
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.collection.notifcollection.DismissedByUserStats;
import com.android.systemui.statusbar.notification.collection.render.GroupMembershipManager;
import com.android.systemui.statusbar.notification.collection.render.NotificationVisibilityProvider;
import com.android.systemui.statusbar.notification.row.OnUserInteractionCallback;
import com.android.systemui.statusbar.policy.HeadsUpManager;

/**
 * Callback for when a user interacts with a {@see ExpandableNotificationRow}.
 */
public class OnUserInteractionCallbackImplLegacy implements OnUserInteractionCallback {
    private final NotificationEntryManager mNotificationEntryManager;
    private final NotificationVisibilityProvider mVisibilityProvider;
    private final HeadsUpManager mHeadsUpManager;
    private final StatusBarStateController mStatusBarStateController;
    private final VisualStabilityManager mVisualStabilityManager;
    private final GroupMembershipManager mGroupMembershipManager;

    public OnUserInteractionCallbackImplLegacy(
            NotificationEntryManager notificationEntryManager,
            NotificationVisibilityProvider visibilityProvider,
            HeadsUpManager headsUpManager,
            StatusBarStateController statusBarStateController,
            VisualStabilityManager visualStabilityManager,
            GroupMembershipManager groupMembershipManager
    ) {
        mNotificationEntryManager = notificationEntryManager;
        mVisibilityProvider = visibilityProvider;
        mHeadsUpManager = headsUpManager;
        mStatusBarStateController = statusBarStateController;
        mVisualStabilityManager = visualStabilityManager;
        mGroupMembershipManager = groupMembershipManager;
    }

    /**
     * Callback triggered when a user:
     * 1. Manually dismisses a notification {@see ExpandableNotificationRow}.
     * 2. Clicks on a notification with flag {@link android.app.Notification#FLAG_AUTO_CANCEL}.
     * {@see StatusBarNotificationActivityStarter}
     *
     * @param groupSummaryToDismiss the group summary that should be dismissed
     *                              along with this dismissal. If null, does not additionally
     *                              dismiss any notifications.
     */
    private void onDismiss(
            NotificationEntry entry,
            @NotificationListenerService.NotificationCancelReason int cancellationReason,
            @Nullable NotificationEntry groupSummaryToDismiss
    ) {
        int dismissalSurface = NotificationStats.DISMISSAL_SHADE;
        if (mHeadsUpManager.isAlerting(entry.getKey())) {
            dismissalSurface = NotificationStats.DISMISSAL_PEEK;
        } else if (mStatusBarStateController.isDozing()) {
            dismissalSurface = NotificationStats.DISMISSAL_AOD;
        }

        if (groupSummaryToDismiss != null) {
            onDismiss(groupSummaryToDismiss, cancellationReason, null);
        }

        mNotificationEntryManager.performRemoveNotification(
                entry.getSbn(),
                new DismissedByUserStats(
                        dismissalSurface,
                        DISMISS_SENTIMENT_NEUTRAL,
                        mVisibilityProvider.obtain(entry, true)),
                cancellationReason
        );

    }

    @Override
    public void onImportanceChanged(NotificationEntry entry) {
        mVisualStabilityManager.temporarilyAllowReordering();
    }

    /**
     * @param entry that is being dismissed
     * @return the group summary to dismiss along with this entry if this is the last entry in
     * the group. Else, returns null.
     */
    @Nullable
    private NotificationEntry getGroupSummaryToDismiss(NotificationEntry entry) {
        if (mGroupMembershipManager.isOnlyChildInGroup(entry)) {
            NotificationEntry groupSummary = mGroupMembershipManager.getLogicalGroupSummary(entry);
            return groupSummary.isDismissable() ? groupSummary : null;
        }
        return null;
    }

    @Override
    @NonNull
    public Runnable registerFutureDismissal(@NonNull NotificationEntry entry,
            @CancellationReason int cancellationReason) {
        NotificationEntry groupSummaryToDismiss = getGroupSummaryToDismiss(entry);
        return () -> onDismiss(entry, cancellationReason, groupSummaryToDismiss);
    }
}
+3 −1
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
package com.android.systemui.statusbar.notification.collection.provider

import com.android.internal.statusbar.NotificationVisibility
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.statusbar.notification.collection.NotifLiveDataStore
import com.android.systemui.statusbar.notification.collection.NotificationEntry
import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection
@@ -25,6 +26,7 @@ import com.android.systemui.statusbar.notification.logging.NotificationLogger
import javax.inject.Inject

/** pipeline-agnostic implementation for getting [NotificationVisibility]. */
@SysUISingleton
class NotificationVisibilityProviderImpl @Inject constructor(
    private val notifDataStore: NotifLiveDataStore,
    private val notifCollection: CommonNotifCollection
+5 −0
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.systemui.statusbar.notification.collection.render;

import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.statusbar.notification.collection.GroupEntry;
import com.android.systemui.statusbar.notification.collection.ListEntry;
import com.android.systemui.statusbar.notification.collection.NotifPipeline;
@@ -28,10 +29,13 @@ import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;

import javax.inject.Inject;

/**
 * Provides grouping information for notification entries including information about a group's
 * expanded state.
 */
@SysUISingleton
public class GroupExpansionManagerImpl implements GroupExpansionManager, Coordinator {
    private final GroupMembershipManager mGroupMembershipManager;
    private final Set<OnGroupExpansionChangeListener> mOnGroupChangeListeners = new HashSet<>();
@@ -39,6 +43,7 @@ public class GroupExpansionManagerImpl implements GroupExpansionManager, Coordin
    // Set of summary keys whose groups are expanded
    private final Set<NotificationEntry> mExpandedGroups = new HashSet<>();

    @Inject
    public GroupExpansionManagerImpl(GroupMembershipManager groupMembershipManager) {
        mGroupMembershipManager = groupMembershipManager;
    }
Loading