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 4a7d0fd8d1ff3..28f78e58c05a7 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 @@ -96,4 +96,7 @@ public interface NotificationMenuRowPlugin extends Plugin { public default boolean useDefaultMenuItems() { return false; } + + public default void onConfigurationChanged() { + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java index 93687478fc868..21bf46248be88 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java @@ -24,6 +24,8 @@ import android.animation.ObjectAnimator; import android.animation.ValueAnimator.AnimatorUpdateListener; import android.annotation.Nullable; import android.content.Context; +import android.content.res.Resources; +import android.content.res.Configuration; import android.graphics.drawable.AnimatedVectorDrawable; import android.graphics.drawable.AnimationDrawable; import android.graphics.drawable.ColorDrawable; @@ -84,6 +86,11 @@ public class ExpandableNotificationRow extends ActivatableNotificationView private static final int COLORED_DIVIDER_ALPHA = 0x7B; private static final int MENU_VIEW_INDEX = 0; + public interface LayoutListener { + public void onLayout(); + } + + private LayoutListener mLayoutListener; private final NotificationInflater mNotificationInflater; private int mIconTransformContentShift; private int mIconTransformContentShiftNoIcon; @@ -834,6 +841,13 @@ public class ExpandableNotificationRow extends ActivatableNotificationView onNotificationUpdated(); } + @Override + public void onConfigurationChanged(Configuration newConfig) { + if (mMenuRow.getMenuView() != null) { + mMenuRow.onConfigurationChanged(); + } + } + public void setContentBackground(int customBackgroundColor, boolean animate, NotificationContentView notificationContentView) { if (getShowingLayout() == notificationContentView) { @@ -1580,6 +1594,14 @@ public class ExpandableNotificationRow extends ActivatableNotificationView mIsSystemChildExpanded = expanded; } + public void setLayoutListener(LayoutListener listener) { + mLayoutListener = listener; + } + + public void removeListener() { + mLayoutListener = null; + } + @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); @@ -1588,6 +1610,9 @@ public class ExpandableNotificationRow extends ActivatableNotificationView mMenuRow.onHeightUpdate(); } updateContentShiftHeight(); + if (mLayoutListener != null) { + mLayoutListener.onLayout(); + } } /** diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMenuRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMenuRow.java index dc538dac68565..d4b892064980b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMenuRow.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMenuRow.java @@ -45,7 +45,8 @@ import android.view.ViewGroup; import android.widget.FrameLayout; import android.widget.FrameLayout.LayoutParams; -public class NotificationMenuRow implements NotificationMenuRowPlugin, View.OnClickListener { +public class NotificationMenuRow implements NotificationMenuRowPlugin, View.OnClickListener, + ExpandableNotificationRow.LayoutListener { private static final boolean DEBUG = false; private static final String TAG = "swipe"; @@ -166,6 +167,18 @@ public class NotificationMenuRow implements NotificationMenuRowPlugin, View.OnCl createMenuViews(); } + @Override + public void onConfigurationChanged() { + mParent.setLayoutListener(this); + } + + @Override + public void onLayout() { + mIconsPlaced = false; // Force icons to be re-placed + setMenuLocation(); + mParent.removeListener(); + } + private void createMenuViews() { // Filter the menu items based on the notification if (mParent != null && mParent.getStatusBarNotification() != null) { @@ -460,22 +473,17 @@ public class NotificationMenuRow implements NotificationMenuRowPlugin, View.OnCl private void setMenuLocation() { boolean showOnLeft = mTranslation > 0; - if ((mIconsPlaced && showOnLeft == mOnLeft) || mSnapping || mParent == null) { + if ((mIconsPlaced && showOnLeft == mOnLeft) || mSnapping + || !mMenuContainer.isAttachedToWindow()) { // Do nothing return; } - final boolean isRtl = mParent.isLayoutRtl(); final int count = mMenuContainer.getChildCount(); - final int width = mParent.getWidth(); for (int i = 0; i < count; i++) { final View v = mMenuContainer.getChildAt(i); - final float left = isRtl - ? -(width - mHorizSpaceForIcon * (i + 1)) - : i * mHorizSpaceForIcon; - final float right = isRtl - ? -i * mHorizSpaceForIcon - : width - (mHorizSpaceForIcon * (i + 1)); - v.setTranslationX(showOnLeft ? left : right); + final float left = i * mHorizSpaceForIcon; + final float right = mParent.getWidth() - (mHorizSpaceForIcon * (i + 1)); + v.setX(showOnLeft ? left : right); } mOnLeft = showOnLeft; mIconsPlaced = true;