Merge "Fixes issue where the notification menu was not visible after RTL changes" into oc-dev

This commit is contained in:
Mady Mellor
2017-05-09 23:41:23 +00:00
committed by Android (Google) Code Review
3 changed files with 47 additions and 11 deletions

View File

@@ -96,4 +96,7 @@ public interface NotificationMenuRowPlugin extends Plugin {
public default boolean useDefaultMenuItems() {
return false;
}
public default void onConfigurationChanged() {
}
}

View File

@@ -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();
}
}
/**

View File

@@ -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;