diff options
10 files changed, 189 insertions, 37 deletions
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/NotificationMenuRowPlugin.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/NotificationMenuRowPlugin.java index fc84332151ec..8f24e7927e3a 100644 --- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/NotificationMenuRowPlugin.java +++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/NotificationMenuRowPlugin.java @@ -14,7 +14,9 @@ package com.android.systemui.plugins.statusbar; +import android.annotation.Nullable; import android.content.Context; +import android.graphics.Point; import android.service.notification.StatusBarNotification; import android.view.MotionEvent; import android.view.View; @@ -84,6 +86,38 @@ public interface NotificationMenuRowPlugin extends Plugin { public void setMenuItems(ArrayList<MenuItem> items); + /** + * If this returns {@code true}, then the menu row will bind and fade in the notification guts + * view for the menu item it holds. + * + * @see #menuItemToExposeOnSnap() + * @return whether or not to immediately expose the notification guts + */ + default boolean shouldShowGutsOnSnapOpen() { + return false; + } + + /** + * When #shouldShowGutsOnExpose is true, this method must return the menu item to expose on + * #onSnapOpen. Otherwise we will fall back to the default behavior of fading in the menu row + * + * @return the {@link MenuItem} containing the NotificationGuts that should be exposed + */ + @Nullable + default MenuItem menuItemToExposeOnSnap() { + return null; + } + + /** + * Get the origin for the circular reveal animation when expanding the notification guts. Only + * used when #shouldShowGutsOnSnapOpen is true + * @return the x,y coordinates for the start of the animation + */ + @Nullable + default Point getRevealAnimationOrigin() { + return new Point(0, 0); + } + public void setMenuClickListener(OnMenuEventListener listener); public void setAppName(String appName); diff --git a/packages/SystemUI/src/com/android/systemui/SwipeHelper.java b/packages/SystemUI/src/com/android/systemui/SwipeHelper.java index 60e6083790dc..f7ecfd7d1205 100644 --- a/packages/SystemUI/src/com/android/systemui/SwipeHelper.java +++ b/packages/SystemUI/src/com/android/systemui/SwipeHelper.java @@ -265,7 +265,9 @@ public class SwipeHelper implements Gefingerpoken { public boolean onInterceptTouchEvent(final MotionEvent ev) { if (mCurrView instanceof ExpandableNotificationRow) { NotificationMenuRowPlugin nmr = ((ExpandableNotificationRow) mCurrView).getProvider(); - mMenuRowIntercepting = nmr.onInterceptTouchEvent(mCurrView, ev); + if (nmr != null) { + mMenuRowIntercepting = nmr.onInterceptTouchEvent(mCurrView, ev); + } } final int action = ev.getAction(); @@ -487,6 +489,7 @@ public class SwipeHelper implements Gefingerpoken { mSnappingChild = false; if (!wasCancelled) { updateSwipeProgressFromOffset(animView, canBeDismissed); + onChildSnappedBack(animView, targetLeft); mCallback.onChildSnappedBack(animView, targetLeft); } } @@ -500,6 +503,13 @@ public class SwipeHelper implements Gefingerpoken { } /** + * Give the swipe helper itself a chance to do something on snap back so NSSL doesn't have + * to tell us what to do + */ + protected void onChildSnappedBack(View animView, float targetLeft) { + } + + /** * Called to update the snap back animation. */ protected void prepareSnapBackAnimation(View view, Animator anim) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java index d287b92876b5..efdcd053bc54 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java @@ -1147,10 +1147,13 @@ public class ExpandableNotificationRow extends ActivatableNotificationView @Override public void onPluginConnected(NotificationMenuRowPlugin plugin, Context pluginContext) { - boolean existed = mMenuRow.getMenuView() != null; + boolean existed = mMenuRow != null && mMenuRow.getMenuView() != null; if (existed) { removeView(mMenuRow.getMenuView()); } + if (plugin == null) { + return; + } mMenuRow = plugin; if (mMenuRow.shouldUseDefaultMenuItems()) { ArrayList<MenuItem> items = new ArrayList<>(); @@ -1173,7 +1176,18 @@ public class ExpandableNotificationRow extends ActivatableNotificationView } } + /** + * Get a handle to a NotificationMenuRowPlugin whose menu view has been added to our hierarchy, + * or null if there is no menu row + * + * @return a {@link NotificationMenuRowPlugin}, or null + */ + @Nullable public NotificationMenuRowPlugin createMenu() { + if (mMenuRow == null) { + return null; + } + if (mMenuRow.getMenuView() == null) { mMenuRow.createMenu(this, mStatusBarNotification); mMenuRow.setAppName(mAppName); @@ -1184,6 +1198,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView return mMenuRow; } + @Nullable public NotificationMenuRowPlugin getProvider() { return mMenuRow; } @@ -1211,7 +1226,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView mGuts.setVisibility(oldGuts.getVisibility()); addView(mGuts, index); } - View oldMenu = mMenuRow.getMenuView(); + View oldMenu = mMenuRow == null ? null : mMenuRow.getMenuView(); if (oldMenu != null) { int menuIndex = indexOfChild(oldMenu); removeView(oldMenu); @@ -1230,7 +1245,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView @Override public void onConfigurationChanged(Configuration newConfig) { - if (mMenuRow.getMenuView() != null) { + if (mMenuRow != null && mMenuRow.getMenuView() != null) { mMenuRow.onConfigurationChanged(); } } @@ -1728,7 +1743,11 @@ public class ExpandableNotificationRow extends ActivatableNotificationView public void setAppOpsOnClickListener(ExpandableNotificationRow.OnAppOpsClickListener l) { mOnAppOpsClickListener = v -> { createMenu(); - MenuItem menuItem = getProvider().getAppOpsMenuItem(mContext); + NotificationMenuRowPlugin provider = getProvider(); + if (provider == null) { + return; + } + MenuItem menuItem = provider.getAppOpsMenuItem(mContext); if (menuItem != null) { l.onClick(this, v.getWidth() / 2, v.getHeight() / 2, menuItem); } @@ -1790,7 +1809,11 @@ public class ExpandableNotificationRow extends ActivatableNotificationView public void doLongClickCallback(int x, int y) { createMenu(); - MenuItem menuItem = getProvider().getLongpressMenuItem(mContext); + NotificationMenuRowPlugin provider = getProvider(); + MenuItem menuItem = null; + if (provider != null) { + menuItem = provider.getLongpressMenuItem(mContext); + } doLongClickCallback(x, y, menuItem); } @@ -1844,7 +1867,9 @@ public class ExpandableNotificationRow extends ActivatableNotificationView getEntry().expandedIcon.setScrollX(0); } - mMenuRow.resetMenu(); + if (mMenuRow != null) { + mMenuRow.resetMenu(); + } } void onGutsOpened() { @@ -1921,7 +1946,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView getEntry().expandedIcon.setScrollX((int) -translationX); } - if (mMenuRow.getMenuView() != null) { + if (mMenuRow != null && mMenuRow.getMenuView() != null) { mMenuRow.onParentTranslationUpdate(translationX); } } @@ -1973,7 +1998,9 @@ public class ExpandableNotificationRow extends ActivatableNotificationView mNotificationTranslationFinished = true; } if (!cancelled && leftTarget == 0) { - mMenuRow.resetMenu(); + if (mMenuRow != null) { + mMenuRow.resetMenu(); + } mTranslateAnim = null; } } @@ -1982,7 +2009,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView return translateAnim; } - public void inflateGuts() { + void ensureGutsInflated() { if (mGuts == null) { mGutsStub.inflate(); } @@ -2438,7 +2465,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView if (intrinsicBefore != getIntrinsicHeight() && intrinsicBefore != 0) { notifyHeightChanged(true /* needsAnimation */); } - if (mMenuRow.getMenuView() != null) { + if (mMenuRow != null && mMenuRow.getMenuView() != null) { mMenuRow.onParentHeightUpdate(); } updateContentShiftHeight(); @@ -2641,7 +2668,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView public long performRemoveAnimation(long duration, long delay, float translationDirection, boolean isHeadsUpAnimation, float endLocation, Runnable onFinishedRunnable, AnimatorListenerAdapter animationListener) { - if (mMenuRow.isMenuVisible()) { + if (mMenuRow != null && mMenuRow.isMenuVisible()) { Animator anim = getTranslateViewAnimator(0f, null /* listener */); if (anim != null) { anim.addListener(new AnimatorListenerAdapter() { @@ -2712,7 +2739,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView if (mGuts != null) { mGuts.setActualHeight(height); } - if (mMenuRow.getMenuView() != null) { + if (mMenuRow != null && mMenuRow.getMenuView() != null) { mMenuRow.onParentHeightUpdate(); } } @@ -2977,8 +3004,10 @@ public class ExpandableNotificationRow extends ActivatableNotificationView default: if (action == R.id.action_snooze) { NotificationMenuRowPlugin provider = getProvider(); - if (provider == null) { + if (provider == null && mMenuRow != null) { provider = createMenu(); + } else { + return false; } MenuItem snoozeMenu = provider.getSnoozeMenuItem(getContext()); if (snoozeMenu != null) { @@ -3109,7 +3138,9 @@ public class ExpandableNotificationRow extends ActivatableNotificationView /** Sets whether dismiss gestures are right-to-left (instead of left-to-right). */ public void setDismissRtl(boolean dismissRtl) { - mMenuRow.setDismissRtl(dismissRtl); + if (mMenuRow != null) { + mMenuRow.setDismissRtl(dismissRtl); + } } private static class NotificationViewState extends ExpandableViewState { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGuts.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGuts.java index fbe9c5d40beb..4700baae8fab 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGuts.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGuts.java @@ -114,7 +114,7 @@ public class NotificationGuts extends FrameLayout { public void onHeightChanged(NotificationGuts guts); } - interface OnSettingsClickListener { + private interface OnSettingsClickListener { void onClick(View v, int appUid); } @@ -271,6 +271,8 @@ public class NotificationGuts extends FrameLayout { double horz = Math.max(getWidth() - x, x); double vert = Math.max(getHeight() - y, y); float r = (float) Math.hypot(horz, vert); + // Make sure we'll be visible after the circular reveal + setAlpha(1f); // Circular reveal originating at (x, y) Animator a = ViewAnimationUtils.createCircularReveal(this, x, y, 0, r); a.setDuration(StackStateAnimator.ANIMATION_DURATION_STANDARD); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java index 69e61201a4d0..faa78985d30d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationGutsManager.java @@ -165,8 +165,8 @@ public class NotificationGutsManager implements Dumpable, NotificationLifetimeEx } } - public boolean bindGuts(final ExpandableNotificationRow row) { - row.inflateGuts(); + private boolean bindGuts(final ExpandableNotificationRow row) { + row.ensureGutsInflated(); return bindGuts(row, mGutsMenuItem); } @@ -386,7 +386,7 @@ public class NotificationGutsManager implements Dumpable, NotificationLifetimeEx return false; } - row.inflateGuts(); + row.ensureGutsInflated(); NotificationGuts guts = row.getGuts(); mNotificationGutsExposed = guts; if (!bindGuts(row, menuItem)) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationMenuRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationMenuRow.java index d83a158b319f..ef7d20c11c56 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationMenuRow.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationMenuRow.java @@ -25,6 +25,7 @@ import android.annotation.Nullable; import android.app.Notification; import android.content.Context; import android.content.res.Resources; +import android.graphics.Point; import android.graphics.drawable.Drawable; import android.os.Handler; import android.os.Looper; @@ -79,6 +80,7 @@ public class NotificationMenuRow implements NotificationMenuRowPlugin, View.OnCl private OnMenuEventListener mMenuListener; private boolean mDismissRtl; private boolean mIsForeground; + private final boolean mIsUsingNewInterruptionModel; private ValueAnimator mFadeAnimator; private boolean mAnimating; @@ -116,6 +118,7 @@ public class NotificationMenuRow implements NotificationMenuRowPlugin, View.OnCl mHandler = new Handler(Looper.getMainLooper()); mLeftMenuItems = new ArrayList<>(); mRightMenuItems = new ArrayList<>(); + mIsUsingNewInterruptionModel = NotificationUtils.useNewInterruptionModel(mContext); } @Override @@ -252,13 +255,13 @@ public class NotificationMenuRow implements NotificationMenuRowPlugin, View.OnCl mSnoozeItem = createSnoozeItem(mContext); } mAppOpsItem = createAppOpsItem(mContext); - if (NotificationUtils.useNewInterruptionModel(mContext)) { + if (mIsUsingNewInterruptionModel) { mInfoItem = createInfoItem(mContext, !mParent.getEntry().isHighPriority()); } else { mInfoItem = createInfoItem(mContext); } - if (!NotificationUtils.useNewInterruptionModel(mContext)) { + if (!mIsUsingNewInterruptionModel) { if (!isForeground) { mRightMenuItems.add(mSnoozeItem); } @@ -268,10 +271,6 @@ public class NotificationMenuRow implements NotificationMenuRowPlugin, View.OnCl } else { ArrayList<MenuItem> menuItems = mDismissRtl ? mLeftMenuItems : mRightMenuItems; menuItems.add(mInfoItem); - menuItems.add(mAppOpsItem); - if (!isForeground) { - menuItems.add(mSnoozeItem); - } } populateMenuViews(); @@ -617,6 +616,29 @@ public class NotificationMenuRow implements NotificationMenuRowPlugin, View.OnCl // TODO -- handle / allow custom menu items! } + @Override + public boolean shouldShowGutsOnSnapOpen() { + return mIsUsingNewInterruptionModel; + } + + @Override + public MenuItem menuItemToExposeOnSnap() { + return mIsUsingNewInterruptionModel ? mInfoItem : null; + } + + @Override + public Point getRevealAnimationOrigin() { + View v = mInfoItem.getMenuView(); + int menuX = v.getLeft() + v.getPaddingLeft() + (v.getWidth() / 2); + int menuY = v.getTop() + v.getPaddingTop() + (v.getHeight() / 2); + if (isMenuOnLeft()) { + return new Point(menuX, menuY); + } else { + menuX = mParent.getRight() - menuX; + return new Point(menuX, menuY); + } + } + static MenuItem createSnoozeItem(Context context) { Resources res = context.getResources(); NotificationSnooze content = (NotificationSnooze) LayoutInflater.from(context) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java index bbb17c2f19ad..d11eab7bb895 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java @@ -38,6 +38,7 @@ import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Outline; import android.graphics.Paint; +import android.graphics.Point; import android.graphics.PointF; import android.graphics.PorterDuff; import android.graphics.PorterDuffXfermode; @@ -1691,8 +1692,10 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd ExpandableNotificationRow child = entry.getRow(); boolean animate = mIsExpanded || isPinnedHeadsUp(child); // If the child is showing the notification menu snap to that - float targetLeft = child.getProvider().isMenuVisible() ? child.getTranslation() : 0; - mSwipeHelper.snapChildIfNeeded(child, animate, targetLeft); + if (child.getProvider() != null) { + float targetLeft = child.getProvider().isMenuVisible() ? child.getTranslation() : 0; + mSwipeHelper.snapChildIfNeeded(child, animate, targetLeft); + } } @Override @@ -6143,8 +6146,24 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd .setCategory(MetricsEvent.ACTION_REVEAL_GEAR) .setType(MetricsEvent.TYPE_ACTION)); mHeadsUpManager.setMenuShown(notificationRow.getEntry(), true); + mSwipeHelper.onMenuShown(row); + + // Check to see if we want to go directly to the notfication guts + NotificationMenuRowPlugin provider = notificationRow.getProvider(); + if (provider.shouldShowGutsOnSnapOpen()) { + MenuItem item = provider.menuItemToExposeOnSnap(); + if (item != null) { + Point origin = provider.getRevealAnimationOrigin(); + mGutsManager.openGuts(row, origin.x, origin.y, item); + } else { + Log.e(TAG, "Provider has shouldShowGutsOnSnapOpen, but provided no " + + "menu item in menuItemtoExposeOnSnap. Skipping."); + } + + // Close the menu row since we went directly to the guts + resetExposedMenuView(false, true); + } } - mSwipeHelper.onMenuShown(row); } }; @@ -6275,11 +6294,6 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd mAmbientState.onDragFinished(animView); updateContinuousShadowDrawing(); updateContinuousBackgroundDrawing(); - NotificationMenuRowPlugin menuRow = mSwipeHelper.getCurrentMenuRow(); - if (menuRow != null && targetLeft == 0) { - menuRow.resetMenu(); - mSwipeHelper.clearCurrentMenuRow(); - } } @Override diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSwipeHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSwipeHelper.java index 478427cc32a0..4569b66d65f7 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSwipeHelper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationSwipeHelper.java @@ -93,7 +93,17 @@ class NotificationSwipeHelper extends SwipeHelper protected Handler getHandler() { return mHandler; } @VisibleForTesting - protected Runnable getFalsingCheck() { return mFalsingCheck; }; + protected Runnable getFalsingCheck() { + return mFalsingCheck; + } + + @Override + protected void onChildSnappedBack(View animView, float targetLeft) { + if (mCurrMenuRow != null && targetLeft == 0) { + mCurrMenuRow.resetMenu(); + clearCurrentMenuRow(); + } + } @Override public void onDownUpdate(View currView, MotionEvent ev) { @@ -117,8 +127,10 @@ class NotificationSwipeHelper extends SwipeHelper protected void initializeRow(ExpandableNotificationRow row) { if (row.getEntry().hasFinishedInitialization()) { mCurrMenuRow = row.createMenu(); - mCurrMenuRow.setMenuClickListener(mMenuListener); - mCurrMenuRow.onTouchStart(); + if (mCurrMenuRow != null) { + mCurrMenuRow.setMenuClickListener(mMenuListener); + mCurrMenuRow.onTouchStart(); + } } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java index 8380192ffd32..5f0839dfc171 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerTest.java @@ -186,7 +186,7 @@ public class NotificationGutsManagerTest extends SysuiTestCase { when(row.getWindowToken()).thenReturn(new Binder()); when(row.getGuts()).thenReturn(guts); - doNothing().when(row).inflateGuts(); + doNothing().when(row).ensureGutsInflated(); NotificationEntry realEntry = realRow.getEntry(); NotificationEntry entry = spy(realEntry); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationMenuRowTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationMenuRowTest.java index e6389c4adb76..c62a802e25e4 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationMenuRowTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationMenuRowTest.java @@ -14,6 +14,8 @@ package com.android.systemui.statusbar.notification.row; +import static android.provider.Settings.Secure.NOTIFICATION_NEW_INTERRUPTION_MODEL; + import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertFalse; import static junit.framework.Assert.assertTrue; @@ -26,6 +28,7 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.NotificationChannel; +import android.provider.Settings; import android.service.notification.StatusBarNotification; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; @@ -39,6 +42,7 @@ import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin; import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.utils.leaks.LeakCheckedTest; +import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -61,6 +65,13 @@ public class NotificationMenuRowTest extends LeakCheckedTest { when(mRow.getEntry()).thenReturn(entry); } + @After + public void tearDown() { + Settings.Secure.putInt(mContext.getContentResolver(), + NOTIFICATION_NEW_INTERRUPTION_MODEL, 0); + } + + @Test public void testAttachDetach() { NotificationMenuRowPlugin row = new NotificationMenuRow(mContext); @@ -89,6 +100,9 @@ public class NotificationMenuRowTest extends LeakCheckedTest { @Test public void testNoAppOpsInSlowSwipe() { + Settings.Secure.putInt(mContext.getContentResolver(), + NOTIFICATION_NEW_INTERRUPTION_MODEL, 0); + NotificationMenuRow row = new NotificationMenuRow(mContext); row.createMenu(mRow, null); @@ -98,6 +112,19 @@ public class NotificationMenuRowTest extends LeakCheckedTest { } @Test + public void testNoAppOpsInSlowSwipe_newInterruptionModel() { + Settings.Secure.putInt(mContext.getContentResolver(), + NOTIFICATION_NEW_INTERRUPTION_MODEL, 1); + + NotificationMenuRow row = new NotificationMenuRow(mContext); + row.createMenu(mRow, null); + + ViewGroup container = (ViewGroup) row.getMenuView(); + // in the new interruption model there is only the blocking item + assertEquals(1, container.getChildCount()); + } + + @Test public void testIsSnappedAndOnSameSide() { NotificationMenuRow row = Mockito.spy(new NotificationMenuRow((mContext))); |