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

Commit f098dbfc authored by Ned Burns's avatar Ned Burns
Browse files

Add initial implementation of NotifCollection

Destined to eventually replace NotificationEntryManager

Test: atest
Change-Id: Ie7029bf63bc8fe58aa53f19091cad1c7745af544
parent 8ac0fb07
Loading
Loading
Loading
Loading
+8 −3
Original line number Diff line number Diff line
@@ -87,6 +87,7 @@ import com.android.systemui.plugins.qs.QS;
import com.android.systemui.qs.car.CarQSFragment;
import com.android.systemui.shared.system.ActivityManagerWrapper;
import com.android.systemui.shared.system.TaskStackChangeListener;
import com.android.systemui.statusbar.FeatureFlags;
import com.android.systemui.statusbar.FlingAnimationUtils;
import com.android.systemui.statusbar.NavigationBarController;
import com.android.systemui.statusbar.NotificationListener;
@@ -102,7 +103,7 @@ import com.android.systemui.statusbar.car.hvac.HvacController;
import com.android.systemui.statusbar.car.hvac.TemperatureView;
import com.android.systemui.statusbar.notification.BypassHeadsUpNotifier;
import com.android.systemui.statusbar.notification.DynamicPrivacyController;
import com.android.systemui.statusbar.notification.NotifPipelineInitializer;
import com.android.systemui.statusbar.notification.NewNotifPipeline;
import com.android.systemui.statusbar.notification.NotificationAlertingManager;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.NotificationInterruptionStateProvider;
@@ -139,6 +140,8 @@ import java.util.Map;
import javax.inject.Inject;
import javax.inject.Named;

import dagger.Lazy;

/**
 * A status bar (and navigation bar) tailored for the automotive use case.
 */
@@ -251,6 +254,7 @@ public class CarStatusBar extends StatusBar implements CarBatteryController.Batt
    @Inject
    public CarStatusBar(
            Context context,
            FeatureFlags featureFlags,
            LightBarController lightBarController,
            AutoHideController autoHideController,
            KeyguardUpdateMonitor keyguardUpdateMonitor,
@@ -265,7 +269,7 @@ public class CarStatusBar extends StatusBar implements CarBatteryController.Batt
            DynamicPrivacyController dynamicPrivacyController,
            BypassHeadsUpNotifier bypassHeadsUpNotifier,
            @Named(ALLOW_NOTIFICATION_LONG_PRESS_NAME) boolean allowNotificationLongPress,
            NotifPipelineInitializer notifPipelineInitializer,
            Lazy<NewNotifPipeline> newNotifPipeline,
            FalsingManager falsingManager,
            BroadcastDispatcher broadcastDispatcher,
            RemoteInputQuickSettingsDisabler remoteInputQuickSettingsDisabler,
@@ -307,6 +311,7 @@ public class CarStatusBar extends StatusBar implements CarBatteryController.Batt
            NotifLog notifLog) {
        super(
                context,
                featureFlags,
                lightBarController,
                autoHideController,
                keyguardUpdateMonitor,
@@ -321,7 +326,7 @@ public class CarStatusBar extends StatusBar implements CarBatteryController.Batt
                dynamicPrivacyController,
                bypassHeadsUpNotifier,
                allowNotificationLongPress,
                notifPipelineInitializer,
                newNotifPipeline,
                falsingManager,
                broadcastDispatcher,
                remoteInputQuickSettingsDisabler,
+74 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2019 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;

import android.annotation.NonNull;
import android.os.Handler;
import android.os.HandlerExecutor;
import android.os.Looper;
import android.provider.DeviceConfig;
import android.util.ArrayMap;

import java.util.Map;

import javax.inject.Inject;

/**
 * Class to manage simple DeviceConfig-based feature flags.
 *
 * To enable or disable a flag, run:
 *
 * {@code
 *  $ adb shell device_config put systemui <key> <true|false>
*  }
 *
 * You will probably need to @{$ adb reboot} afterwards in order for the code to pick up the change.
 */
public class FeatureFlags {
    private final Map<String, Boolean> mCachedDeviceConfigFlags = new ArrayMap<>();

    @Inject
    public FeatureFlags() {
        DeviceConfig.addOnPropertiesChangedListener(
                "systemui",
                new HandlerExecutor(new Handler(Looper.getMainLooper())),
                this::onPropertiesChanged);
    }

    public boolean isNewNotifPipelineEnabled() {
        return getDeviceConfigFlag("notification.newpipeline.enabled", false);
    }

    private void onPropertiesChanged(@NonNull DeviceConfig.Properties properties) {
        synchronized (mCachedDeviceConfigFlags) {
            for (String key : properties.getKeyset()) {
                mCachedDeviceConfigFlags.remove(key);
            }
        }
    }

    private boolean getDeviceConfigFlag(String key, boolean defaultValue) {
        synchronized (mCachedDeviceConfigFlags) {
            Boolean flag = mCachedDeviceConfigFlags.get(key);
            if (flag == null) {
                flag = DeviceConfig.getBoolean("systemui", key, defaultValue);
                mCachedDeviceConfigFlags.put(key, flag);
            }
            return flag;
        }
    }
}
+49 −0
Original line number Diff line number Diff line
@@ -16,53 +16,34 @@

package com.android.systemui.statusbar.notification;

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

import com.android.systemui.statusbar.NotificationListener;
import com.android.systemui.statusbar.notification.collection.NotifCollection;

import javax.inject.Inject;
import javax.inject.Singleton;

/**
 * Initialization code for the new notification pipeline.
 */
public class NotifPipelineInitializer {
@Singleton
public class NewNotifPipeline {
    private final NotifCollection mNotifCollection;

    @Inject
    public NotifPipelineInitializer() {
    public NewNotifPipeline(
            NotifCollection notifCollection) {
        mNotifCollection = notifCollection;
    }

    /** Hooks the new pipeline up to NotificationManager */
    public void initialize(
            NotificationListener notificationService) {
        mNotifCollection.attach(notificationService);

        // TODO Put real code here
        notificationService.setDownstreamListener(new NotificationListener.NotifServiceListener() {
            @Override
            public void onNotificationPosted(StatusBarNotification sbn,
                    NotificationListenerService.RankingMap rankingMap) {
                Log.d(TAG, "onNotificationPosted " + sbn.getKey());
        Log.d(TAG, "Notif pipeline initialized");
    }

            @Override
            public void onNotificationRemoved(StatusBarNotification sbn,
                    NotificationListenerService.RankingMap rankingMap) {
                Log.d(TAG, "onNotificationRemoved " + sbn.getKey());
            }

            @Override
            public void onNotificationRemoved(StatusBarNotification sbn,
                    NotificationListenerService.RankingMap rankingMap, int reason) {
                Log.d(TAG, "onNotificationRemoved " + sbn.getKey());
            }

            @Override
            public void onNotificationRankingUpdate(
                    NotificationListenerService.RankingMap rankingMap) {
                Log.d(TAG, "onNotificationRankingUpdate");
            }
        });
    }

    private static final String TAG = "NotifInitializer";
    private static final String TAG = "NewNotifPipeline";
}
+38 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2019 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;

import android.service.notification.NotificationStats.DismissalSentiment;
import android.service.notification.NotificationStats.DismissalSurface;

import com.android.internal.statusbar.NotificationVisibility;

/** Information that must be supplied when dismissing a notification on the behalf of the user. */
public class DismissedByUserStats {
    public final @DismissalSurface int dismissalSurface;
    public final @DismissalSentiment int dismissalSentiment;
    public final NotificationVisibility notificationVisibility;

    public DismissedByUserStats(
            @DismissalSurface int dismissalSurface,
            @DismissalSentiment int dismissalSentiment,
            NotificationVisibility notificationVisibility) {
        this.dismissalSurface = dismissalSurface;
        this.dismissalSentiment = dismissalSentiment;
        this.notificationVisibility = notificationVisibility;
    }
}
+426 −0

File added.

Preview size limit exceeded, changes collapsed.

Loading