Fixed a bug where the notification content could become empty
This was caused by legacy code which set the actual height, which in turn set the contentview to collapsed. If that happend during an animation, the view could become blank. Bug: 27448145 Change-Id: I0b3a2a2aee3052810176c2ff9a23825d83145d69
This commit is contained in:
@@ -105,7 +105,6 @@ public class ExpandableNotificationRow extends ActivatableNotificationView {
|
||||
private boolean mClearable;
|
||||
private ExpansionLogger mLogger;
|
||||
private String mLoggingKey;
|
||||
private boolean mWasReset;
|
||||
private NotificationSettingsIconRow mSettingsIconRow;
|
||||
private NotificationGuts mGuts;
|
||||
private NotificationData.Entry mEntry;
|
||||
@@ -615,20 +614,16 @@ public class ExpandableNotificationRow extends ActivatableNotificationView {
|
||||
mShowingPublicInitialized = false;
|
||||
mIsSystemExpanded = false;
|
||||
mOnKeyguard = false;
|
||||
mPublicLayout.reset(mIsHeadsUp);
|
||||
mPrivateLayout.reset(mIsHeadsUp);
|
||||
mPublicLayout.reset();
|
||||
mPrivateLayout.reset();
|
||||
resetHeight();
|
||||
resetTranslation();
|
||||
logExpansionEvent(false, wasExpanded);
|
||||
}
|
||||
|
||||
public void resetHeight() {
|
||||
if (mIsHeadsUp) {
|
||||
resetActualHeight();
|
||||
}
|
||||
mMaxExpandHeight = 0;
|
||||
mHeadsUpHeight = 0;
|
||||
mWasReset = true;
|
||||
onHeightReset();
|
||||
requestLayout();
|
||||
}
|
||||
@@ -964,18 +959,6 @@ public class ExpandableNotificationRow extends ActivatableNotificationView {
|
||||
return mStatusBarNotification != null && mStatusBarNotification.isClearable();
|
||||
}
|
||||
|
||||
/**
|
||||
* Apply an expansion state to the layout.
|
||||
*/
|
||||
public void applyExpansionToLayout() {
|
||||
boolean expand = isExpanded();
|
||||
if (expand && mExpandable) {
|
||||
setActualHeight(mMaxExpandHeight);
|
||||
} else {
|
||||
setActualHeight(getMinHeight());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getIntrinsicHeight() {
|
||||
if (isUserLocked()) {
|
||||
@@ -1057,12 +1040,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView {
|
||||
@Override
|
||||
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
|
||||
super.onLayout(changed, left, top, right, bottom);
|
||||
boolean updateExpandHeight = mMaxExpandHeight == 0 && !mWasReset;
|
||||
updateMaxHeights();
|
||||
if (updateExpandHeight) {
|
||||
applyExpansionToLayout();
|
||||
}
|
||||
mWasReset = false;
|
||||
}
|
||||
|
||||
private void updateMaxHeights() {
|
||||
|
||||
@@ -36,7 +36,6 @@ public abstract class ExpandableView extends FrameLayout {
|
||||
protected OnHeightChangedListener mOnHeightChangedListener;
|
||||
private int mActualHeight;
|
||||
protected int mClipTopAmount;
|
||||
private boolean mActualHeightInitialized;
|
||||
private boolean mDark;
|
||||
private ArrayList<View> mMatchParentViews = new ArrayList<View>();
|
||||
private int mClipTopOptimization;
|
||||
@@ -99,28 +98,9 @@ public abstract class ExpandableView extends FrameLayout {
|
||||
@Override
|
||||
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
|
||||
super.onLayout(changed, left, top, right, bottom);
|
||||
if (!mActualHeightInitialized && mActualHeight == 0) {
|
||||
int initialHeight = getInitialHeight();
|
||||
if (initialHeight != 0) {
|
||||
setActualHeight(initialHeight);
|
||||
}
|
||||
}
|
||||
updateClipping();
|
||||
}
|
||||
|
||||
/**
|
||||
* Resets the height of the view on the next layout pass
|
||||
*/
|
||||
protected void resetActualHeight() {
|
||||
mActualHeight = 0;
|
||||
mActualHeightInitialized = false;
|
||||
requestLayout();
|
||||
}
|
||||
|
||||
protected int getInitialHeight() {
|
||||
return getHeight();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean pointInView(float localX, float localY, float slop) {
|
||||
float top = mClipTopAmount;
|
||||
@@ -137,7 +117,6 @@ public abstract class ExpandableView extends FrameLayout {
|
||||
* @param notifyListeners Whether the listener should be informed about the change.
|
||||
*/
|
||||
public void setActualHeight(int actualHeight, boolean notifyListeners) {
|
||||
mActualHeightInitialized = true;
|
||||
mActualHeight = actualHeight;
|
||||
updateClipping();
|
||||
if (notifyListeners) {
|
||||
|
||||
@@ -120,7 +120,7 @@ public class NotificationContentView extends FrameLayout {
|
||||
R.dimen.min_notification_layout_height);
|
||||
mNotificationContentMarginEnd = getResources().getDimensionPixelSize(
|
||||
com.android.internal.R.dimen.notification_content_margin_end);
|
||||
reset(true);
|
||||
reset();
|
||||
}
|
||||
|
||||
public void setHeights(int smallHeight, int headsUpMaxHeight, int maxHeight) {
|
||||
@@ -255,7 +255,7 @@ public class NotificationContentView extends FrameLayout {
|
||||
updateVisibility();
|
||||
}
|
||||
|
||||
public void reset(boolean resetActualHeight) {
|
||||
public void reset() {
|
||||
if (mContractedChild != null) {
|
||||
mContractedChild.animate().cancel();
|
||||
removeView(mContractedChild);
|
||||
@@ -271,10 +271,6 @@ public class NotificationContentView extends FrameLayout {
|
||||
mContractedChild = null;
|
||||
mExpandedChild = null;
|
||||
mHeadsUpChild = null;
|
||||
mVisibleType = VISIBLE_TYPE_CONTRACTED;
|
||||
if (resetActualHeight) {
|
||||
mContentHeight = mSmallHeight;
|
||||
}
|
||||
}
|
||||
|
||||
public View getContractedChild() {
|
||||
@@ -484,12 +480,18 @@ public class NotificationContentView extends FrameLayout {
|
||||
private void animateToVisibleType(int visibleType) {
|
||||
final TransformableView shownView = getTransformableViewForVisibleType(visibleType);
|
||||
final TransformableView hiddenView = getTransformableViewForVisibleType(mVisibleType);
|
||||
if (shownView == hiddenView) {
|
||||
shownView.setVisible(true);
|
||||
return;
|
||||
}
|
||||
shownView.transformFrom(hiddenView);
|
||||
getViewForVisibleType(visibleType).setVisibility(View.VISIBLE);
|
||||
hiddenView.transformTo(shownView, new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
hiddenView.setVisible(false);
|
||||
if (hiddenView != getTransformableViewForVisibleType(mVisibleType)) {
|
||||
hiddenView.setVisible(false);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -550,6 +552,9 @@ public class NotificationContentView extends FrameLayout {
|
||||
|| mContainingNotification.isExpanded()
|
||||
? mContainingNotification.getMaxContentHeight()
|
||||
: mContainingNotification.getShowingLayout().getMinHeight();
|
||||
if (height == 0) {
|
||||
height = mContentHeight;
|
||||
}
|
||||
int expandedVisualType = getVisualTypeForHeight(height);
|
||||
int collapsedVisualType = getVisualTypeForHeight(
|
||||
mContainingNotification.getMinExpandHeight());
|
||||
@@ -557,7 +562,12 @@ public class NotificationContentView extends FrameLayout {
|
||||
? expandedVisualType
|
||||
: collapsedVisualType;
|
||||
}
|
||||
int viewHeight = Math.min(mContentHeight, mContainingNotification.getIntrinsicHeight());
|
||||
int intrinsicHeight = mContainingNotification.getIntrinsicHeight();
|
||||
int viewHeight = mContentHeight;
|
||||
if (intrinsicHeight != 0) {
|
||||
// the intrinsicHeight might be 0 because it was just reset.
|
||||
viewHeight = Math.min(mContentHeight, intrinsicHeight);
|
||||
}
|
||||
return getVisualTypeForHeight(viewHeight);
|
||||
}
|
||||
|
||||
@@ -638,7 +648,6 @@ public class NotificationContentView extends FrameLayout {
|
||||
mBeforeN = entry.targetSdk < Build.VERSION_CODES.N;
|
||||
updateSingleLineView();
|
||||
applyRemoteInput(entry);
|
||||
selectLayout(false /* animate */, true /* force */);
|
||||
if (mContractedChild != null) {
|
||||
mContractedWrapper.notifyContentUpdated(entry.notification);
|
||||
}
|
||||
@@ -648,6 +657,7 @@ public class NotificationContentView extends FrameLayout {
|
||||
if (mHeadsUpChild != null) {
|
||||
mHeadsUpWrapper.notifyContentUpdated(entry.notification);
|
||||
}
|
||||
selectLayout(false /* animate */, true /* force */);
|
||||
setDark(mDark, false /* animate */, 0 /* delay */);
|
||||
}
|
||||
|
||||
|
||||
@@ -76,26 +76,26 @@ public class ViewTransformationHelper implements TransformableView {
|
||||
});
|
||||
mViewTransformationAnimation.setInterpolator(Interpolators.LINEAR);
|
||||
mViewTransformationAnimation.setDuration(StackStateAnimator.ANIMATION_DURATION_STANDARD);
|
||||
if (endRunnable != null) {
|
||||
mViewTransformationAnimation.addListener(new AnimatorListenerAdapter() {
|
||||
public boolean mCancelled;
|
||||
mViewTransformationAnimation.addListener(new AnimatorListenerAdapter() {
|
||||
public boolean mCancelled;
|
||||
|
||||
@Override
|
||||
public void onAnimationEnd(Animator animation) {
|
||||
endRunnable.run();
|
||||
if (!mCancelled) {
|
||||
setVisible(false);
|
||||
} else {
|
||||
abortTransformations();
|
||||
@Override
|
||||
public void onAnimationEnd(Animator animation) {
|
||||
if (!mCancelled) {
|
||||
if (endRunnable != null) {
|
||||
endRunnable.run();
|
||||
}
|
||||
setVisible(false);
|
||||
} else {
|
||||
abortTransformations();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAnimationCancel(Animator animation) {
|
||||
mCancelled = true;
|
||||
}
|
||||
});
|
||||
}
|
||||
@Override
|
||||
public void onAnimationCancel(Animator animation) {
|
||||
mCancelled = true;
|
||||
}
|
||||
});
|
||||
mViewTransformationAnimation.start();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user