Loading packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/NotificationMenuRowPlugin.java +3 −1 Original line number Original line Diff line number Diff line Loading @@ -37,7 +37,7 @@ import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin.MenuItem public interface NotificationMenuRowPlugin extends Plugin { public interface NotificationMenuRowPlugin extends Plugin { public static final String ACTION = "com.android.systemui.action.PLUGIN_NOTIFICATION_MENU_ROW"; 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) @ProvidesInterface(version = OnMenuEventListener.VERSION) public interface OnMenuEventListener { public interface OnMenuEventListener { Loading Loading @@ -89,6 +89,8 @@ public interface NotificationMenuRowPlugin extends Plugin { public void onHeightUpdate(); public void onHeightUpdate(); public void onNotificationUpdated(); public boolean onTouchEvent(View view, MotionEvent ev, float velocity); public boolean onTouchEvent(View view, MotionEvent ev, float velocity); public default boolean useDefaultMenuItems() { public default boolean useDefaultMenuItems() { Loading packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java +7 −2 Original line number Original line Diff line number Diff line Loading @@ -328,6 +328,9 @@ public class ExpandableNotificationRow extends ActivatableNotificationView mIsColorized = mStatusBarNotification.getNotification().isColorized(); mIsColorized = mStatusBarNotification.getNotification().isColorized(); mShowingPublicInitialized = false; mShowingPublicInitialized = false; updateNotificationColor(); updateNotificationColor(); if (mMenuRow != null) { mMenuRow.onNotificationUpdated(); } if (mIsSummaryWithChildren) { if (mIsSummaryWithChildren) { mChildrenContainer.recreateNotificationHeader(mExpandClickListener); mChildrenContainer.recreateNotificationHeader(mExpandClickListener); mChildrenContainer.onNotificationUpdated(); mChildrenContainer.onNotificationUpdated(); Loading Loading @@ -760,7 +763,10 @@ public class ExpandableNotificationRow extends ActivatableNotificationView } } mMenuRow = plugin; mMenuRow = plugin; if (mMenuRow.useDefaultMenuItems()) { 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) { if (existed) { createMenu(); createMenu(); Loading @@ -787,7 +793,6 @@ public class ExpandableNotificationRow extends ActivatableNotificationView return mMenuRow; return mMenuRow; } } public NotificationMenuRowPlugin getProvider() { public NotificationMenuRowPlugin getProvider() { return mMenuRow; return mMenuRow; } } Loading packages/SystemUI/src/com/android/systemui/statusbar/NotificationMenuRow.java +54 −21 Original line number Original line Diff line number Diff line Loading @@ -30,11 +30,13 @@ import com.android.systemui.statusbar.stack.NotificationStackScrollLayout; import android.animation.Animator; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorListenerAdapter; import android.animation.ValueAnimator; import android.animation.ValueAnimator; import android.app.Notification; import android.content.Context; import android.content.Context; import android.content.res.Resources; import android.content.res.Resources; import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable; import android.os.Handler; import android.os.Handler; import android.util.Log; import android.util.Log; import android.service.notification.StatusBarNotification; import android.view.LayoutInflater; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.MotionEvent; import android.view.View; import android.view.View; Loading @@ -48,12 +50,12 @@ public class NotificationMenuRow implements NotificationMenuRowPlugin, View.OnCl private static final long SHOW_MENU_DELAY = 60; private static final long SHOW_MENU_DELAY = 60; private static final long SWIPE_MENU_TIMING = 200; private static final long SWIPE_MENU_TIMING = 200; private static final int NOTIFICATION_INFO_INDEX = 1; private ExpandableNotificationRow mParent; private ExpandableNotificationRow mParent; private Context mContext; private Context mContext; private FrameLayout mMenuContainer; private FrameLayout mMenuContainer; private MenuItem mSnoozeItem; private MenuItem mInfoItem; private ArrayList<MenuItem> mMenuItems; private ArrayList<MenuItem> mMenuItems; private OnMenuEventListener mMenuListener; private OnMenuEventListener mMenuListener; Loading Loading @@ -94,7 +96,11 @@ public class NotificationMenuRow implements NotificationMenuRowPlugin, View.OnCl mVertSpaceForIcons = res.getDimensionPixelSize(R.dimen.notification_min_height); mVertSpaceForIcons = res.getDimensionPixelSize(R.dimen.notification_min_height); mIconPadding = res.getDimensionPixelSize(R.dimen.notification_menu_icon_padding); mIconPadding = res.getDimensionPixelSize(R.dimen.notification_menu_icon_padding); mHandler = new Handler(); mHandler = new Handler(); mMenuItems = getDefaultMenuItems(context); mMenuItems = new ArrayList<>(); mSnoozeItem = createSnoozeItem(context); mInfoItem = createInfoItem(context); mMenuItems.add(mSnoozeItem); mMenuItems.add(mInfoItem); } } @Override @Override Loading @@ -104,7 +110,7 @@ public class NotificationMenuRow implements NotificationMenuRowPlugin, View.OnCl @Override @Override public MenuItem getLongpressMenuItem(Context context) { public MenuItem getLongpressMenuItem(Context context) { return mMenuItems.get(NOTIFICATION_INFO_INDEX); return mInfoItem; } } @Override @Override Loading @@ -120,14 +126,7 @@ public class NotificationMenuRow implements NotificationMenuRowPlugin, View.OnCl @Override @Override public void createMenu(ViewGroup parent) { public void createMenu(ViewGroup parent) { mParent = (ExpandableNotificationRow) parent; mParent = (ExpandableNotificationRow) parent; if (mMenuContainer != null) { createMenuViews(); mMenuContainer.removeAllViews(); } mMenuContainer = new FrameLayout(mContext); for (int i = 0; i < mMenuItems.size(); i++) { addMenuView(mMenuItems.get(i), mMenuContainer); } resetState(false); } } @Override @Override Loading @@ -145,6 +144,40 @@ public class NotificationMenuRow implements NotificationMenuRowPlugin, View.OnCl resetState(true); 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) { private void resetState(boolean notify) { setMenuAlpha(0f); setMenuAlpha(0f); mIconsPlaced = false; mIconsPlaced = false; Loading Loading @@ -495,24 +528,24 @@ public class NotificationMenuRow implements NotificationMenuRowPlugin, View.OnCl // TODO -- handle / allow custom menu items! // TODO -- handle / allow custom menu items! } } public static ArrayList<MenuItem> getDefaultMenuItems(Context context) { public static MenuItem createSnoozeItem(Context context) { ArrayList<MenuItem> items = new ArrayList<MenuItem>(); Resources res = context.getResources(); Resources res = context.getResources(); NotificationSnooze content = (NotificationSnooze) LayoutInflater.from(context) NotificationSnooze content = (NotificationSnooze) LayoutInflater.from(context) .inflate(R.layout.notification_snooze, null, false); .inflate(R.layout.notification_snooze, null, false); String snoozeDescription = res.getString(R.string.notification_menu_snooze_description); String snoozeDescription = res.getString(R.string.notification_menu_snooze_description); MenuItem snooze = new NotificationMenuItem(context, snoozeDescription, content, MenuItem snooze = new NotificationMenuItem(context, snoozeDescription, content, R.drawable.ic_snooze); R.drawable.ic_snooze); items.add(snooze); return snooze; } String settingsDescription = res.getString(R.string.notification_menu_gear_description); public static MenuItem createInfoItem(Context context) { NotificationInfo settingsContent = (NotificationInfo) LayoutInflater.from(context).inflate( 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); R.layout.notification_info, null, false); MenuItem settings = new NotificationMenuItem(context, settingsDescription, settingsContent, MenuItem info = new NotificationMenuItem(context, infoDescription, infoContent, R.drawable.ic_settings); R.drawable.ic_settings); items.add(settings); return info; return items; } } private void addMenuView(MenuItem item, ViewGroup parent) { private void addMenuView(MenuItem item, ViewGroup parent) { Loading packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationMenuRowTest.java +4 −0 Original line number Original line Diff line number Diff line Loading @@ -14,6 +14,8 @@ package com.android.systemui.statusbar; package com.android.systemui.statusbar; import static junit.framework.Assert.assertTrue; import android.testing.AndroidTestingRunner; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; import android.testing.TestableLooper; import android.testing.TestableLooper.RunWithLooper; import android.testing.TestableLooper.RunWithLooper; Loading Loading @@ -49,6 +51,8 @@ public class NotificationMenuRowTest extends LeakCheckedTest { public void testRecreateMenu() { public void testRecreateMenu() { NotificationMenuRowPlugin row = new NotificationMenuRow(mContext); NotificationMenuRowPlugin row = new NotificationMenuRow(mContext); row.createMenu(null); row.createMenu(null); assertTrue(row.getMenuView() != null); row.createMenu(null); row.createMenu(null); assertTrue(row.getMenuView() != null); } } } } Loading
packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/NotificationMenuRowPlugin.java +3 −1 Original line number Original line Diff line number Diff line Loading @@ -37,7 +37,7 @@ import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin.MenuItem public interface NotificationMenuRowPlugin extends Plugin { public interface NotificationMenuRowPlugin extends Plugin { public static final String ACTION = "com.android.systemui.action.PLUGIN_NOTIFICATION_MENU_ROW"; 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) @ProvidesInterface(version = OnMenuEventListener.VERSION) public interface OnMenuEventListener { public interface OnMenuEventListener { Loading Loading @@ -89,6 +89,8 @@ public interface NotificationMenuRowPlugin extends Plugin { public void onHeightUpdate(); public void onHeightUpdate(); public void onNotificationUpdated(); public boolean onTouchEvent(View view, MotionEvent ev, float velocity); public boolean onTouchEvent(View view, MotionEvent ev, float velocity); public default boolean useDefaultMenuItems() { public default boolean useDefaultMenuItems() { Loading
packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java +7 −2 Original line number Original line Diff line number Diff line Loading @@ -328,6 +328,9 @@ public class ExpandableNotificationRow extends ActivatableNotificationView mIsColorized = mStatusBarNotification.getNotification().isColorized(); mIsColorized = mStatusBarNotification.getNotification().isColorized(); mShowingPublicInitialized = false; mShowingPublicInitialized = false; updateNotificationColor(); updateNotificationColor(); if (mMenuRow != null) { mMenuRow.onNotificationUpdated(); } if (mIsSummaryWithChildren) { if (mIsSummaryWithChildren) { mChildrenContainer.recreateNotificationHeader(mExpandClickListener); mChildrenContainer.recreateNotificationHeader(mExpandClickListener); mChildrenContainer.onNotificationUpdated(); mChildrenContainer.onNotificationUpdated(); Loading Loading @@ -760,7 +763,10 @@ public class ExpandableNotificationRow extends ActivatableNotificationView } } mMenuRow = plugin; mMenuRow = plugin; if (mMenuRow.useDefaultMenuItems()) { 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) { if (existed) { createMenu(); createMenu(); Loading @@ -787,7 +793,6 @@ public class ExpandableNotificationRow extends ActivatableNotificationView return mMenuRow; return mMenuRow; } } public NotificationMenuRowPlugin getProvider() { public NotificationMenuRowPlugin getProvider() { return mMenuRow; return mMenuRow; } } Loading
packages/SystemUI/src/com/android/systemui/statusbar/NotificationMenuRow.java +54 −21 Original line number Original line Diff line number Diff line Loading @@ -30,11 +30,13 @@ import com.android.systemui.statusbar.stack.NotificationStackScrollLayout; import android.animation.Animator; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorListenerAdapter; import android.animation.ValueAnimator; import android.animation.ValueAnimator; import android.app.Notification; import android.content.Context; import android.content.Context; import android.content.res.Resources; import android.content.res.Resources; import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable; import android.os.Handler; import android.os.Handler; import android.util.Log; import android.util.Log; import android.service.notification.StatusBarNotification; import android.view.LayoutInflater; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.MotionEvent; import android.view.View; import android.view.View; Loading @@ -48,12 +50,12 @@ public class NotificationMenuRow implements NotificationMenuRowPlugin, View.OnCl private static final long SHOW_MENU_DELAY = 60; private static final long SHOW_MENU_DELAY = 60; private static final long SWIPE_MENU_TIMING = 200; private static final long SWIPE_MENU_TIMING = 200; private static final int NOTIFICATION_INFO_INDEX = 1; private ExpandableNotificationRow mParent; private ExpandableNotificationRow mParent; private Context mContext; private Context mContext; private FrameLayout mMenuContainer; private FrameLayout mMenuContainer; private MenuItem mSnoozeItem; private MenuItem mInfoItem; private ArrayList<MenuItem> mMenuItems; private ArrayList<MenuItem> mMenuItems; private OnMenuEventListener mMenuListener; private OnMenuEventListener mMenuListener; Loading Loading @@ -94,7 +96,11 @@ public class NotificationMenuRow implements NotificationMenuRowPlugin, View.OnCl mVertSpaceForIcons = res.getDimensionPixelSize(R.dimen.notification_min_height); mVertSpaceForIcons = res.getDimensionPixelSize(R.dimen.notification_min_height); mIconPadding = res.getDimensionPixelSize(R.dimen.notification_menu_icon_padding); mIconPadding = res.getDimensionPixelSize(R.dimen.notification_menu_icon_padding); mHandler = new Handler(); mHandler = new Handler(); mMenuItems = getDefaultMenuItems(context); mMenuItems = new ArrayList<>(); mSnoozeItem = createSnoozeItem(context); mInfoItem = createInfoItem(context); mMenuItems.add(mSnoozeItem); mMenuItems.add(mInfoItem); } } @Override @Override Loading @@ -104,7 +110,7 @@ public class NotificationMenuRow implements NotificationMenuRowPlugin, View.OnCl @Override @Override public MenuItem getLongpressMenuItem(Context context) { public MenuItem getLongpressMenuItem(Context context) { return mMenuItems.get(NOTIFICATION_INFO_INDEX); return mInfoItem; } } @Override @Override Loading @@ -120,14 +126,7 @@ public class NotificationMenuRow implements NotificationMenuRowPlugin, View.OnCl @Override @Override public void createMenu(ViewGroup parent) { public void createMenu(ViewGroup parent) { mParent = (ExpandableNotificationRow) parent; mParent = (ExpandableNotificationRow) parent; if (mMenuContainer != null) { createMenuViews(); mMenuContainer.removeAllViews(); } mMenuContainer = new FrameLayout(mContext); for (int i = 0; i < mMenuItems.size(); i++) { addMenuView(mMenuItems.get(i), mMenuContainer); } resetState(false); } } @Override @Override Loading @@ -145,6 +144,40 @@ public class NotificationMenuRow implements NotificationMenuRowPlugin, View.OnCl resetState(true); 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) { private void resetState(boolean notify) { setMenuAlpha(0f); setMenuAlpha(0f); mIconsPlaced = false; mIconsPlaced = false; Loading Loading @@ -495,24 +528,24 @@ public class NotificationMenuRow implements NotificationMenuRowPlugin, View.OnCl // TODO -- handle / allow custom menu items! // TODO -- handle / allow custom menu items! } } public static ArrayList<MenuItem> getDefaultMenuItems(Context context) { public static MenuItem createSnoozeItem(Context context) { ArrayList<MenuItem> items = new ArrayList<MenuItem>(); Resources res = context.getResources(); Resources res = context.getResources(); NotificationSnooze content = (NotificationSnooze) LayoutInflater.from(context) NotificationSnooze content = (NotificationSnooze) LayoutInflater.from(context) .inflate(R.layout.notification_snooze, null, false); .inflate(R.layout.notification_snooze, null, false); String snoozeDescription = res.getString(R.string.notification_menu_snooze_description); String snoozeDescription = res.getString(R.string.notification_menu_snooze_description); MenuItem snooze = new NotificationMenuItem(context, snoozeDescription, content, MenuItem snooze = new NotificationMenuItem(context, snoozeDescription, content, R.drawable.ic_snooze); R.drawable.ic_snooze); items.add(snooze); return snooze; } String settingsDescription = res.getString(R.string.notification_menu_gear_description); public static MenuItem createInfoItem(Context context) { NotificationInfo settingsContent = (NotificationInfo) LayoutInflater.from(context).inflate( 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); R.layout.notification_info, null, false); MenuItem settings = new NotificationMenuItem(context, settingsDescription, settingsContent, MenuItem info = new NotificationMenuItem(context, infoDescription, infoContent, R.drawable.ic_settings); R.drawable.ic_settings); items.add(settings); return info; return items; } } private void addMenuView(MenuItem item, ViewGroup parent) { private void addMenuView(MenuItem item, ViewGroup parent) { Loading
packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationMenuRowTest.java +4 −0 Original line number Original line Diff line number Diff line Loading @@ -14,6 +14,8 @@ package com.android.systemui.statusbar; package com.android.systemui.statusbar; import static junit.framework.Assert.assertTrue; import android.testing.AndroidTestingRunner; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; import android.testing.TestableLooper; import android.testing.TestableLooper.RunWithLooper; import android.testing.TestableLooper.RunWithLooper; Loading Loading @@ -49,6 +51,8 @@ public class NotificationMenuRowTest extends LeakCheckedTest { public void testRecreateMenu() { public void testRecreateMenu() { NotificationMenuRowPlugin row = new NotificationMenuRow(mContext); NotificationMenuRowPlugin row = new NotificationMenuRow(mContext); row.createMenu(null); row.createMenu(null); assertTrue(row.getMenuView() != null); row.createMenu(null); row.createMenu(null); assertTrue(row.getMenuView() != null); } } } }