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

Commit 4c19760b authored by Mady Mellor's avatar Mady Mellor
Browse files

Don't offer snooze for foreground service notifications

Also updates NotificationMenuRow tests to actually check if menu
was created.

Test: Manual, have foreground service, check if snooze is visible
Bug: 37152715
Change-Id: I09cf60598c3e8991f2da731da1ef7e0a718c3435
parent 4a306894
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -37,7 +37,7 @@ import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin.MenuItem
public interface NotificationMenuRowPlugin extends Plugin {

    public static final String ACTION = "com.android.systemui.action.PLUGIN_NOTIFICATION_MENU_ROW";
    public static final int VERSION = 1;
    public static final int VERSION = 2;

    @ProvidesInterface(version = OnMenuEventListener.VERSION)
    public interface OnMenuEventListener {
@@ -89,6 +89,8 @@ public interface NotificationMenuRowPlugin extends Plugin {

    public void onHeightUpdate();

    public void onNotificationUpdated();

    public boolean onTouchEvent(View view, MotionEvent ev, float velocity);

    public default boolean useDefaultMenuItems() {
+7 −2
Original line number Diff line number Diff line
@@ -328,6 +328,9 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
        mIsColorized = mStatusBarNotification.getNotification().isColorized();
        mShowingPublicInitialized = false;
        updateNotificationColor();
        if (mMenuRow != null) {
            mMenuRow.onNotificationUpdated();
        }
        if (mIsSummaryWithChildren) {
            mChildrenContainer.recreateNotificationHeader(mExpandClickListener);
            mChildrenContainer.onNotificationUpdated();
@@ -760,7 +763,10 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
        }
        mMenuRow = plugin;
        if (mMenuRow.useDefaultMenuItems()) {
            mMenuRow.setMenuItems(NotificationMenuRow.getDefaultMenuItems(mContext));
            ArrayList<MenuItem> items = new ArrayList<>();
            items.add(NotificationMenuRow.createInfoItem(mContext));
            items.add(NotificationMenuRow.createSnoozeItem(mContext));
            mMenuRow.setMenuItems(items);
        }
        if (existed) {
            createMenu();
@@ -787,7 +793,6 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
        return mMenuRow;
    }


    public NotificationMenuRowPlugin getProvider() {
        return mMenuRow;
    }
+54 −21
Original line number Diff line number Diff line
@@ -30,11 +30,13 @@ import com.android.systemui.statusbar.stack.NotificationStackScrollLayout;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ValueAnimator;
import android.app.Notification;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.util.Log;
import android.service.notification.StatusBarNotification;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
@@ -48,12 +50,12 @@ public class NotificationMenuRow implements NotificationMenuRowPlugin, View.OnCl
    private static final long SHOW_MENU_DELAY = 60;
    private static final long SWIPE_MENU_TIMING = 200;

    private static final int NOTIFICATION_INFO_INDEX = 1;

    private ExpandableNotificationRow mParent;

    private Context mContext;
    private FrameLayout mMenuContainer;
    private MenuItem mSnoozeItem;
    private MenuItem mInfoItem;
    private ArrayList<MenuItem> mMenuItems;
    private OnMenuEventListener mMenuListener;

@@ -94,7 +96,11 @@ public class NotificationMenuRow implements NotificationMenuRowPlugin, View.OnCl
        mVertSpaceForIcons = res.getDimensionPixelSize(R.dimen.notification_min_height);
        mIconPadding = res.getDimensionPixelSize(R.dimen.notification_menu_icon_padding);
        mHandler = new Handler();
        mMenuItems = getDefaultMenuItems(context);
        mMenuItems = new ArrayList<>();
        mSnoozeItem = createSnoozeItem(context);
        mInfoItem = createInfoItem(context);
        mMenuItems.add(mSnoozeItem);
        mMenuItems.add(mInfoItem);
    }

    @Override
@@ -104,7 +110,7 @@ public class NotificationMenuRow implements NotificationMenuRowPlugin, View.OnCl

    @Override
    public MenuItem getLongpressMenuItem(Context context) {
        return mMenuItems.get(NOTIFICATION_INFO_INDEX);
        return mInfoItem;
    }

    @Override
@@ -120,14 +126,7 @@ public class NotificationMenuRow implements NotificationMenuRowPlugin, View.OnCl
    @Override
    public void createMenu(ViewGroup parent) {
        mParent = (ExpandableNotificationRow) parent;
        if (mMenuContainer != null) {
            mMenuContainer.removeAllViews();
        }
        mMenuContainer = new FrameLayout(mContext);
        for (int i = 0; i < mMenuItems.size(); i++) {
            addMenuView(mMenuItems.get(i), mMenuContainer);
        }
        resetState(false);
        createMenuViews();
    }

    @Override
@@ -145,6 +144,40 @@ public class NotificationMenuRow implements NotificationMenuRowPlugin, View.OnCl
        resetState(true);
    }

    @Override
    public void onNotificationUpdated() {
        if (mMenuContainer == null) {
            // Menu hasn't been created yet, no need to do anything.
            return;
        }
        createMenuViews();
    }

    private void createMenuViews() {
        // Filter the menu items based on the notification
        if (mParent != null && mParent.getStatusBarNotification() != null) {
            int flags = mParent.getStatusBarNotification().getNotification().flags;
            boolean isForeground = (flags & Notification.FLAG_FOREGROUND_SERVICE) != 0;
            if (isForeground) {
                // Don't show snooze for foreground services
                mMenuItems.remove(mSnoozeItem);
            } else if (!mMenuItems.contains(mSnoozeItem)) {
                // Was a foreground service but is no longer, add snooze back
                mMenuItems.add(mSnoozeItem);
            }
        }
        // Recreate the menu
        if (mMenuContainer != null) {
            mMenuContainer.removeAllViews();
        } else {
            mMenuContainer = new FrameLayout(mContext);
        }
        for (int i = 0; i < mMenuItems.size(); i++) {
            addMenuView(mMenuItems.get(i), mMenuContainer);
        }
        resetState(false /* notify */);
    }

    private void resetState(boolean notify) {
        setMenuAlpha(0f);
        mIconsPlaced = false;
@@ -495,24 +528,24 @@ public class NotificationMenuRow implements NotificationMenuRowPlugin, View.OnCl
        // TODO -- handle / allow custom menu items!
    }

    public static ArrayList<MenuItem> getDefaultMenuItems(Context context) {
        ArrayList<MenuItem> items = new ArrayList<MenuItem>();
    public static MenuItem createSnoozeItem(Context context) {
        Resources res = context.getResources();

        NotificationSnooze content = (NotificationSnooze) LayoutInflater.from(context)
                .inflate(R.layout.notification_snooze, null, false);
        String snoozeDescription = res.getString(R.string.notification_menu_snooze_description);
        MenuItem snooze = new NotificationMenuItem(context, snoozeDescription, content,
                R.drawable.ic_snooze);
        items.add(snooze);
        return snooze;
    }

        String settingsDescription = res.getString(R.string.notification_menu_gear_description);
        NotificationInfo settingsContent = (NotificationInfo) LayoutInflater.from(context).inflate(
    public static MenuItem createInfoItem(Context context) {
        Resources res = context.getResources();
        String infoDescription = res.getString(R.string.notification_menu_gear_description);
        NotificationInfo infoContent = (NotificationInfo) LayoutInflater.from(context).inflate(
                R.layout.notification_info, null, false);
        MenuItem settings = new NotificationMenuItem(context, settingsDescription, settingsContent,
        MenuItem info = new NotificationMenuItem(context, infoDescription, infoContent,
                R.drawable.ic_settings);
        items.add(settings);
        return items;
        return info;
    }

    private void addMenuView(MenuItem item, ViewGroup parent) {
+4 −0
Original line number Diff line number Diff line
@@ -14,6 +14,8 @@

package com.android.systemui.statusbar;

import static junit.framework.Assert.assertTrue;

import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
@@ -49,6 +51,8 @@ public class NotificationMenuRowTest extends LeakCheckedTest {
    public void testRecreateMenu() {
        NotificationMenuRowPlugin row = new NotificationMenuRow(mContext);
        row.createMenu(null);
        assertTrue(row.getMenuView() != null);
        row.createMenu(null);
        assertTrue(row.getMenuView() != null);
    }
}