From 313b2c2d28e40f76ddadb4fde853763d7458ff0f Mon Sep 17 00:00:00 2001 From: Jon Miranda Date: Thu, 17 Jun 2021 12:35:43 -0700 Subject: [PATCH] Update notification popup UI. - Update UI to match specs. - Only shows one notification (removed footer, animation code) Bug: 175329686 Bug: 190402054 Test: open popup, dismiss notification from shade, open popup, click on notification checked RTL Change-Id: I92672f94233d986ae5b5c54979980967308cb156 --- res/drawable/notification_circle.xml | 11 + res/layout/notification_content.xml | 77 ++---- res/values-v31/colors.xml | 3 + res/values/attrs.xml | 1 + res/values/colors.xml | 3 + res/values/dimens.xml | 29 +-- res/values/styles.xml | 2 + .../NotificationFooterLayout.java | 238 ------------------ .../notification/NotificationItemView.java | 120 +++------ .../notification/NotificationMainView.java | 80 +----- .../popup/PopupContainerWithArrow.java | 17 +- 11 files changed, 96 insertions(+), 485 deletions(-) create mode 100644 res/drawable/notification_circle.xml delete mode 100644 src/com/android/launcher3/notification/NotificationFooterLayout.java diff --git a/res/drawable/notification_circle.xml b/res/drawable/notification_circle.xml new file mode 100644 index 0000000000..65fbaea5a6 --- /dev/null +++ b/res/drawable/notification_circle.xml @@ -0,0 +1,11 @@ + + + + + + + \ No newline at end of file diff --git a/res/layout/notification_content.xml b/res/layout/notification_content.xml index 147aa30525..84822a671b 100644 --- a/res/layout/notification_content.xml +++ b/res/layout/notification_content.xml @@ -23,35 +23,36 @@ + android:layout_height="wrap_content" + android:paddingEnd="@dimen/notification_padding" + android:paddingStart="@dimen/notification_padding"> + android:textSize="@dimen/notification_header_text_size" + style="@style/TextHeadline"/> + android:textSize="@dimen/notification_header_count_text_size" + style="@style/TextHeadline"/> + android:paddingTop="@dimen/notification_padding" + android:paddingBottom="@dimen/notification_padding" + android:paddingEnd="@dimen/notification_padding" + android:paddingStart="@dimen/notification_main_text_padding_start"> + android:textSize="@dimen/notification_main_title_size" + style="@style/TextHeadline" /> @@ -90,37 +91,9 @@ android:id="@+id/popup_item_icon" android:layout_width="@dimen/notification_icon_size" android:layout_height="@dimen/notification_icon_size" - android:layout_gravity="center_vertical|end" - android:layout_marginBottom="7dp" - android:layout_marginEnd="@dimen/notification_padding_end" /> + android:layout_gravity="start" + android:layout_marginTop="@dimen/notification_padding" + android:layout_marginStart="@dimen/notification_icon_padding" /> - - - - - - - - - \ No newline at end of file diff --git a/res/values-v31/colors.xml b/res/values-v31/colors.xml index 38a08948a0..1785623581 100644 --- a/res/values-v31/colors.xml +++ b/res/values-v31/colors.xml @@ -25,6 +25,9 @@ @android:color/system_neutral1_900 @android:color/system_neutral2_700 + @android:color/system_accent1_100 + @android:color/system_accent2_600 + @android:color/system_neutral1_0 @android:color/system_neutral1_1000 diff --git a/res/values/attrs.xml b/res/values/attrs.xml index 92deb68f42..1fadc881c2 100644 --- a/res/values/attrs.xml +++ b/res/values/attrs.xml @@ -36,6 +36,7 @@ + diff --git a/res/values/colors.xml b/res/values/colors.xml index dac12ed40c..01f5364459 100644 --- a/res/values/colors.xml +++ b/res/values/colors.xml @@ -53,6 +53,9 @@ #202124 #757575 + #FFF + #757575 + #FFF #FF000000 diff --git a/res/values/dimens.xml b/res/values/dimens.xml index 9048d878e1..251f04a66e 100644 --- a/res/values/dimens.xml +++ b/res/values/dimens.xml @@ -259,28 +259,19 @@ 8dp - 16dp - 12dp - - 15dp - 36dp - 84dp - 32dp - - 6dp - 13sp + 16dp + 18dp + 14sp 12sp - 16sp + 14sp 14sp - 24dp - 18dp - - 52dp + 24dp + 32dp + + 12dp + + 56dp 18dp - - 19dp - 0.5dp - 70dp 24dp diff --git a/res/values/styles.xml b/res/values/styles.xml index 2119e58ada..1cacc28b0b 100644 --- a/res/values/styles.xml +++ b/res/values/styles.xml @@ -39,6 +39,7 @@ @color/popup_color_primary_light @color/popup_color_secondary_light @color/popup_color_tertiary_light + @color/popup_notification_dot_light false false @color/workspace_text_color_light @@ -107,6 +108,7 @@ @color/popup_color_primary_dark @color/popup_color_secondary_dark @color/popup_color_tertiary_dark + @color/popup_notification_dot_dark @style/WidgetContainerTheme.Dark @color/folder_dot_color @color/folder_background_dark diff --git a/src/com/android/launcher3/notification/NotificationFooterLayout.java b/src/com/android/launcher3/notification/NotificationFooterLayout.java deleted file mode 100644 index fd3d41ade8..0000000000 --- a/src/com/android/launcher3/notification/NotificationFooterLayout.java +++ /dev/null @@ -1,238 +0,0 @@ -/* - * Copyright (C) 2017 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.launcher3.notification; - -import android.animation.Animator; -import android.animation.AnimatorListenerAdapter; -import android.animation.AnimatorSet; -import android.animation.ObjectAnimator; -import android.content.Context; -import android.content.res.Resources; -import android.graphics.Rect; -import android.util.AttributeSet; -import android.view.Gravity; -import android.view.View; -import android.widget.FrameLayout; -import android.widget.LinearLayout; - -import com.android.launcher3.R; -import com.android.launcher3.Utilities; -import com.android.launcher3.anim.PropertyListBuilder; -import com.android.launcher3.anim.PropertyResetListener; -import com.android.launcher3.util.Themes; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -/** - * A {@link FrameLayout} that contains only icons of notifications. - * If there are more than {@link #MAX_FOOTER_NOTIFICATIONS} icons, we add a "..." overflow. - */ -public class NotificationFooterLayout extends FrameLayout { - - public interface IconAnimationEndListener { - void onIconAnimationEnd(NotificationInfo animatedNotification); - } - - private static final int MAX_FOOTER_NOTIFICATIONS = 5; - - private static final Rect sTempRect = new Rect(); - - private final List mNotifications = new ArrayList<>(); - private final List mOverflowNotifications = new ArrayList<>(); - private final boolean mRtl; - private final int mBackgroundColor; - - FrameLayout.LayoutParams mIconLayoutParams; - private View mOverflowEllipsis; - private LinearLayout mIconRow; - private NotificationItemView mContainer; - - public NotificationFooterLayout(Context context) { - this(context, null, 0); - } - - public NotificationFooterLayout(Context context, AttributeSet attrs) { - this(context, attrs, 0); - } - - public NotificationFooterLayout(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - - Resources res = getResources(); - mRtl = Utilities.isRtl(res); - - int iconSize = res.getDimensionPixelSize(R.dimen.notification_footer_icon_size); - mIconLayoutParams = new LayoutParams(iconSize, iconSize); - mIconLayoutParams.gravity = Gravity.CENTER_VERTICAL; - setWidth((int) res.getDimension(R.dimen.bg_popup_item_width)); - mBackgroundColor = Themes.getAttrColor(context, R.attr.popupColorPrimary); - } - - - /** - * Compute margin start for each icon such that the icons between the first one and the ellipsis - * are evenly spaced out. - */ - public void setWidth(int width) { - if (getLayoutParams() != null) { - getLayoutParams().width = width; - } - Resources res = getResources(); - int iconSize = res.getDimensionPixelSize(R.dimen.notification_footer_icon_size); - - int paddingEnd = res.getDimensionPixelSize(R.dimen.notification_footer_icon_row_padding); - int ellipsisSpace = res.getDimensionPixelSize(R.dimen.horizontal_ellipsis_offset) - + res.getDimensionPixelSize(R.dimen.horizontal_ellipsis_size); - int availableIconRowSpace = width - paddingEnd - ellipsisSpace - - iconSize * MAX_FOOTER_NOTIFICATIONS; - mIconLayoutParams.setMarginStart(availableIconRowSpace / MAX_FOOTER_NOTIFICATIONS); - } - - @Override - protected void onFinishInflate() { - super.onFinishInflate(); - mOverflowEllipsis = findViewById(R.id.overflow); - mIconRow = findViewById(R.id.icon_row); - } - - void setContainer(NotificationItemView container) { - mContainer = container; - } - - /** - * Keep track of the NotificationInfo, and then update the UI when - * {@link #commitNotificationInfos()} is called. - */ - public void addNotificationInfo(final NotificationInfo notificationInfo) { - if (mNotifications.size() < MAX_FOOTER_NOTIFICATIONS) { - mNotifications.add(notificationInfo); - } else { - mOverflowNotifications.add(notificationInfo); - } - } - - /** - * Adds icons and potentially overflow text for all of the NotificationInfo's - * added using {@link #addNotificationInfo(NotificationInfo)}. - */ - public void commitNotificationInfos() { - mIconRow.removeAllViews(); - - for (int i = 0; i < mNotifications.size(); i++) { - NotificationInfo info = mNotifications.get(i); - addNotificationIconForInfo(info); - } - updateOverflowEllipsisVisibility(); - } - - private void updateOverflowEllipsisVisibility() { - mOverflowEllipsis.setVisibility(mOverflowNotifications.isEmpty() ? GONE : VISIBLE); - } - - /** - * Creates an icon for the given NotificationInfo, and adds it to the icon row. - * @return the icon view that was added - */ - private View addNotificationIconForInfo(NotificationInfo info) { - View icon = new View(getContext()); - icon.setBackground(info.getIconForBackground(getContext(), mBackgroundColor)); - icon.setOnClickListener(info); - icon.setTag(info); - icon.setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_NO); - mIconRow.addView(icon, 0, mIconLayoutParams); - return icon; - } - - public void animateFirstNotificationTo(Rect toBounds, - final IconAnimationEndListener callback) { - AnimatorSet animation = new AnimatorSet(); - final View firstNotification = mIconRow.getChildAt(mIconRow.getChildCount() - 1); - - Rect fromBounds = sTempRect; - firstNotification.getGlobalVisibleRect(fromBounds); - float scale = (float) toBounds.height() / fromBounds.height(); - Animator moveAndScaleIcon = new PropertyListBuilder().scale(scale) - .translationY(toBounds.top - fromBounds.top - + (fromBounds.height() * scale - fromBounds.height()) / 2) - .build(firstNotification); - moveAndScaleIcon.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - callback.onIconAnimationEnd((NotificationInfo) firstNotification.getTag()); - removeViewFromIconRow(firstNotification); - } - }); - animation.play(moveAndScaleIcon); - - // Shift all notifications (not the overflow) over to fill the gap. - int gapWidth = mIconLayoutParams.width + mIconLayoutParams.getMarginStart(); - if (mRtl) { - gapWidth = -gapWidth; - } - if (!mOverflowNotifications.isEmpty()) { - NotificationInfo notification = mOverflowNotifications.remove(0); - mNotifications.add(notification); - View iconFromOverflow = addNotificationIconForInfo(notification); - animation.play(ObjectAnimator.ofFloat(iconFromOverflow, ALPHA, 0, 1)); - } - int numIcons = mIconRow.getChildCount() - 1; // All children besides the one leaving. - // We have to reset the translation X to 0 when the new main notification - // is removed from the footer. - PropertyResetListener propertyResetListener - = new PropertyResetListener<>(TRANSLATION_X, 0f); - for (int i = 0; i < numIcons; i++) { - final View child = mIconRow.getChildAt(i); - Animator shiftChild = ObjectAnimator.ofFloat(child, TRANSLATION_X, gapWidth); - shiftChild.addListener(propertyResetListener); - animation.play(shiftChild); - } - animation.start(); - } - - private void removeViewFromIconRow(View child) { - mIconRow.removeView(child); - mNotifications.remove(child.getTag()); - updateOverflowEllipsisVisibility(); - if (mIconRow.getChildCount() == 0) { - // There are no more icons in the footer, so hide it. - if (mContainer != null) { - mContainer.removeFooter(); - } - } - } - - public void trimNotifications(List notifications) { - if (!isAttachedToWindow() || mIconRow.getChildCount() == 0) { - return; - } - Iterator overflowIterator = mOverflowNotifications.iterator(); - while (overflowIterator.hasNext()) { - if (!notifications.contains(overflowIterator.next().notificationKey)) { - overflowIterator.remove(); - } - } - for (int i = mIconRow.getChildCount() - 1; i >= 0; i--) { - View child = mIconRow.getChildAt(i); - NotificationInfo childInfo = (NotificationInfo) child.getTag(); - if (!notifications.contains(childInfo.notificationKey)) { - removeViewFromIconRow(child); - } - } - } -} diff --git a/src/com/android/launcher3/notification/NotificationItemView.java b/src/com/android/launcher3/notification/NotificationItemView.java index 932e721058..af943a6933 100644 --- a/src/com/android/launcher3/notification/NotificationItemView.java +++ b/src/com/android/launcher3/notification/NotificationItemView.java @@ -16,12 +16,8 @@ package com.android.launcher3.notification; -import static com.android.launcher3.touch.SingleAxisSwipeDetector.HORIZONTAL; - import android.animation.AnimatorSet; -import android.app.Notification; import android.content.Context; -import android.graphics.Color; import android.graphics.Outline; import android.graphics.Rect; import android.view.MotionEvent; @@ -32,11 +28,10 @@ import android.view.ViewOutlineProvider; import android.widget.TextView; import com.android.launcher3.R; -import com.android.launcher3.graphics.IconPalette; import com.android.launcher3.popup.PopupContainerWithArrow; -import com.android.launcher3.touch.SingleAxisSwipeDetector; import com.android.launcher3.util.Themes; +import java.util.ArrayList; import java.util.List; /** @@ -50,39 +45,26 @@ public class NotificationItemView { private final PopupContainerWithArrow mPopupContainer; private final ViewGroup mRootView; - private final TextView mHeaderText; private final TextView mHeaderCount; private final NotificationMainView mMainView; - private final NotificationFooterLayout mFooter; - private final SingleAxisSwipeDetector mSwipeDetector; - private final View mIconView; private final View mHeader; private View mGutter; private boolean mIgnoreTouch = false; - private boolean mAnimatingNextIcon; - private int mNotificationHeaderTextColor = Notification.COLOR_DEFAULT; + private List mNotificationInfos = new ArrayList<>(); public NotificationItemView(PopupContainerWithArrow container, ViewGroup rootView) { mPopupContainer = container; mRootView = rootView; mContext = container.getContext(); - mHeaderText = container.findViewById(R.id.notification_text); mHeaderCount = container.findViewById(R.id.notification_count); mMainView = container.findViewById(R.id.main_view); - mFooter = container.findViewById(R.id.footer); - mIconView = container.findViewById(R.id.popup_item_icon); mHeader = container.findViewById(R.id.header); - mSwipeDetector = new SingleAxisSwipeDetector(mContext, mMainView, HORIZONTAL); - mSwipeDetector.setDetectableScrollConditions(SingleAxisSwipeDetector.DIRECTION_BOTH, false); - mMainView.setSwipeDetector(mSwipeDetector); - mFooter.setContainer(this); - float radius = Themes.getDialogCornerRadius(mContext); rootView.setClipToOutline(true); rootView.setOutlineProvider(new ViewOutlineProvider() { @@ -108,19 +90,6 @@ public class NotificationItemView { } } - /** - * Sets width for notification footer and spaces out items evenly - */ - public void setFooterWidth(int footerWidth) { - mFooter.setWidth(footerWidth); - } - - public void removeFooter() { - if (mRootView.indexOfChild(mFooter) >= 0) { - mRootView.removeView(mFooter); - } - } - public void inverseGutterMargin() { MarginLayoutParams lp = (MarginLayoutParams) mGutter.getLayoutParams(); int top = lp.topMargin; @@ -131,27 +100,28 @@ public class NotificationItemView { public void removeAllViews() { mRootView.removeView(mMainView); mRootView.removeView(mHeader); - - if (mRootView.indexOfChild(mFooter) >= 0) { - mRootView.removeView(mFooter); - } - if (mGutter != null) { mRootView.removeView(mGutter); } } - public void updateHeader(int notificationCount, int iconColor) { - mHeaderCount.setText(notificationCount <= 1 ? "" : String.valueOf(notificationCount)); - if (Color.alpha(iconColor) > 0) { - if (mNotificationHeaderTextColor == Notification.COLOR_DEFAULT) { - mNotificationHeaderTextColor = - IconPalette.resolveContrastColor(mContext, iconColor, - Themes.getAttrColor(mContext, R.attr.popupColorPrimary)); - } - mHeaderText.setTextColor(mNotificationHeaderTextColor); - mHeaderCount.setTextColor(mNotificationHeaderTextColor); + /** + * Updates the header text. + * @param notificationCount The number of notifications. + */ + public void updateHeader(int notificationCount) { + final String text; + final int visibility; + if (notificationCount <= 1) { + text = ""; + visibility = View.INVISIBLE; + } else { + text = String.valueOf(notificationCount); + visibility = View.VISIBLE; + } + mHeaderCount.setText(text); + mHeaderCount.setVisibility(visibility); } public boolean onInterceptTouchEvent(MotionEvent ev) { @@ -171,53 +141,39 @@ public class NotificationItemView { return false; } - mSwipeDetector.onTouchEvent(ev); - return mSwipeDetector.isDraggingOrSettling(); - } - - public boolean onTouchEvent(MotionEvent ev) { - if (mIgnoreTouch) { - return false; - } - if (mMainView.getNotificationInfo() == null) { - // The notification hasn't been populated yet. - return false; - } - return mSwipeDetector.onTouchEvent(ev); + return false; } public void applyNotificationInfos(final List notificationInfos) { + mNotificationInfos.clear(); if (notificationInfos.isEmpty()) { return; } + mNotificationInfos.addAll(notificationInfos); NotificationInfo mainNotification = notificationInfos.get(0); mMainView.applyNotificationInfo(mainNotification, false); - - for (int i = 1; i < notificationInfos.size(); i++) { - mFooter.addNotificationInfo(notificationInfos.get(i)); - } - mFooter.commitNotificationInfos(); } public void trimNotifications(final List notificationKeys) { - boolean dismissedMainNotification = !notificationKeys.contains( - mMainView.getNotificationInfo().notificationKey); - if (dismissedMainNotification && !mAnimatingNextIcon) { - // Animate the next icon into place as the new main notification. - mAnimatingNextIcon = true; - mMainView.setContentVisibility(View.INVISIBLE); - mMainView.setContentTranslation(0); - mIconView.getGlobalVisibleRect(sTempRect); - mFooter.animateFirstNotificationTo(sTempRect, (newMainNotification) -> { - if (newMainNotification != null) { - mMainView.applyNotificationInfo(newMainNotification, true); - mMainView.setContentVisibility(View.VISIBLE); + NotificationInfo currentMainNotificationInfo = mMainView.getNotificationInfo(); + boolean shouldUpdateMainNotification = !notificationKeys.contains( + currentMainNotificationInfo.notificationKey); + + if (shouldUpdateMainNotification) { + int size = notificationKeys.size(); + NotificationInfo nextNotification = null; + // We get the latest notification by finding the notification after the one that was + // just dismissed. + for (int i = 0; i < size; ++i) { + if (currentMainNotificationInfo == mNotificationInfos.get(i) && i + 1 < size) { + nextNotification = mNotificationInfos.get(i + 1); + break; } - mAnimatingNextIcon = false; - }); - } else { - mFooter.trimNotifications(notificationKeys); + } + if (nextNotification != null) { + mMainView.applyNotificationInfo(nextNotification, true); + } } } } diff --git a/src/com/android/launcher3/notification/NotificationMainView.java b/src/com/android/launcher3/notification/NotificationMainView.java index e9b5f32ce7..b8aa8246fb 100644 --- a/src/com/android/launcher3/notification/NotificationMainView.java +++ b/src/com/android/launcher3/notification/NotificationMainView.java @@ -16,19 +16,15 @@ package com.android.launcher3.notification; -import static com.android.launcher3.anim.Interpolators.scrollInterpolatorForVelocity; import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_NOTIFICATION_DISMISSED; -import android.animation.Animator; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.animation.ValueAnimator; import android.annotation.TargetApi; import android.content.Context; -import android.content.res.ColorStateList; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; -import android.graphics.drawable.RippleDrawable; import android.os.Build; import android.text.TextUtils; import android.util.AttributeSet; @@ -40,19 +36,15 @@ import android.widget.TextView; import com.android.launcher3.Launcher; import com.android.launcher3.R; -import com.android.launcher3.anim.AnimationSuccessListener; import com.android.launcher3.model.data.ItemInfo; -import com.android.launcher3.touch.BaseSwipeDetector; -import com.android.launcher3.touch.OverScroll; import com.android.launcher3.touch.SingleAxisSwipeDetector; -import com.android.launcher3.util.Themes; /** * A {@link android.widget.FrameLayout} that contains a single notification, * e.g. icon + title + text. */ @TargetApi(Build.VERSION_CODES.N) -public class NotificationMainView extends FrameLayout implements SingleAxisSwipeDetector.Listener { +public class NotificationMainView extends FrameLayout { private static final FloatProperty CONTENT_TRANSLATION = new FloatProperty("contentTranslation") { @@ -70,8 +62,6 @@ public class NotificationMainView extends FrameLayout implements SingleAxisSwipe // This is used only to track the notification view, so that it can be properly logged. public static final ItemInfo NOTIFICATION_ITEM_INFO = new ItemInfo(); - private final ObjectAnimator mContentTranslateAnimator; - private NotificationInfo mNotificationInfo; private ViewGroup mTextAndBackground; private int mBackgroundColor; @@ -82,7 +72,6 @@ public class NotificationMainView extends FrameLayout implements SingleAxisSwipe private SingleAxisSwipeDetector mSwipeDetector; private final ColorDrawable mColorDrawable; - private final RippleDrawable mRippleDrawable; public NotificationMainView(Context context) { this(context, null, 0); @@ -95,11 +84,7 @@ public class NotificationMainView extends FrameLayout implements SingleAxisSwipe public NotificationMainView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); - mContentTranslateAnimator = ObjectAnimator.ofFloat(this, CONTENT_TRANSLATION, 0); mColorDrawable = new ColorDrawable(Color.TRANSPARENT); - mRippleDrawable = new RippleDrawable(ColorStateList.valueOf( - Themes.getAttrColor(getContext(), android.R.attr.colorControlHighlight)), - mColorDrawable, null); } @Override @@ -118,7 +103,7 @@ public class NotificationMainView extends FrameLayout implements SingleAxisSwipe private void updateBackgroundColor(int color) { mBackgroundColor = color; mColorDrawable.setColor(color); - mTextAndBackground.setBackground(mRippleDrawable); + mTextAndBackground.setBackground(mColorDrawable); if (mNotificationInfo != null) { mIconView.setBackground(mNotificationInfo.getIconForBackground(getContext(), mBackgroundColor)); @@ -140,10 +125,6 @@ public class NotificationMainView extends FrameLayout implements SingleAxisSwipe animatorSetOut.play(colors); } - public void setSwipeDetector(SingleAxisSwipeDetector swipeDetector) { - mSwipeDetector = swipeDetector; - } - /** * Sets the content of this view, animating it after a new icon shifts up if necessary. */ @@ -182,11 +163,6 @@ public class NotificationMainView extends FrameLayout implements SingleAxisSwipe mIconView.setTranslationX(translation); } - public void setContentVisibility(int visibility) { - mTextAndBackground.setVisibility(visibility); - mIconView.setVisibility(visibility); - } - public NotificationInfo getNotificationInfo() { return mNotificationInfo; } @@ -202,56 +178,4 @@ public class NotificationMainView extends FrameLayout implements SingleAxisSwipe mNotificationInfo.notificationKey); launcher.getStatsLogManager().logger().log(LAUNCHER_NOTIFICATION_DISMISSED); } - - // SingleAxisSwipeDetector.Listener's - @Override - public void onDragStart(boolean start, float startDisplacement) { } - - - @Override - public boolean onDrag(float displacement) { - setContentTranslation(canChildBeDismissed() - ? displacement : OverScroll.dampedScroll(displacement, getWidth())); - mContentTranslateAnimator.cancel(); - return true; - } - - @Override - public void onDragEnd(float velocity) { - final boolean willExit; - final float endTranslation; - final float startTranslation = mTextAndBackground.getTranslationX(); - - if (!canChildBeDismissed()) { - willExit = false; - endTranslation = 0; - } else if (mSwipeDetector.isFling(velocity)) { - willExit = true; - endTranslation = velocity < 0 ? - getWidth() : getWidth(); - } else if (Math.abs(startTranslation) > getWidth() / 2) { - willExit = true; - endTranslation = (startTranslation < 0 ? -getWidth() : getWidth()); - } else { - willExit = false; - endTranslation = 0; - } - - long duration = BaseSwipeDetector.calculateDuration(velocity, - (endTranslation - startTranslation) / getWidth()); - - mContentTranslateAnimator.removeAllListeners(); - mContentTranslateAnimator.setDuration(duration) - .setInterpolator(scrollInterpolatorForVelocity(velocity)); - mContentTranslateAnimator.setFloatValues(startTranslation, endTranslation); - mContentTranslateAnimator.addListener(new AnimationSuccessListener() { - @Override - public void onAnimationSuccess(Animator animator) { - mSwipeDetector.finishedScrolling(); - if (willExit) { - onChildDismissed(); - } - } - }); - mContentTranslateAnimator.start(); - } } diff --git a/src/com/android/launcher3/popup/PopupContainerWithArrow.java b/src/com/android/launcher3/popup/PopupContainerWithArrow.java index 2ae12ac71f..18f263a8ec 100644 --- a/src/com/android/launcher3/popup/PopupContainerWithArrow.java +++ b/src/com/android/launcher3/popup/PopupContainerWithArrow.java @@ -137,14 +137,6 @@ public class PopupContainerWithArrow> > squaredTouchSlop(getContext()); } - @Override - public boolean onTouchEvent(MotionEvent ev) { - if (mNotificationItemView != null) { - return mNotificationItemView.onTouchEvent(ev) || super.onTouchEvent(ev); - } - return super.onTouchEvent(ev); - } - @Override protected boolean isOfType(int type) { return (type & TYPE_ACTION_POPUP) != 0; @@ -272,12 +264,6 @@ public class PopupContainerWithArrow> } View.inflate(getContext(), R.layout.notification_content, mNotificationContainer); mNotificationItemView = new NotificationItemView(this, mNotificationContainer); - if (mNumNotifications == 1) { - mNotificationItemView.removeFooter(); - } - else { - mNotificationItemView.setFooterWidth(containerWidth); - } updateNotificationHeader(); } int viewsToFlip = getChildCount(); @@ -462,8 +448,7 @@ public class PopupContainerWithArrow> ItemInfoWithIcon itemInfo = (ItemInfoWithIcon) mOriginalIcon.getTag(); DotInfo dotInfo = mLauncher.getDotInfoForItem(itemInfo); if (mNotificationItemView != null && dotInfo != null) { - mNotificationItemView.updateHeader( - dotInfo.getNotificationCount(), itemInfo.bitmap.color); + mNotificationItemView.updateHeader(dotInfo.getNotificationCount()); } }