Loading packages/SystemUI/res/values/ids.xml +1 −0 Original line number Diff line number Diff line Loading @@ -100,6 +100,7 @@ <!-- For notification icons for which targetSdk < L, this caches whether the icon is grayscale --> <item type="id" name="icon_is_grayscale" /> <item type="id" name="image_icon_tag" /> <item type="id" name="align_transform_end_tag" /> <item type="id" name="contains_transformed_view" /> <item type="id" name="is_clicked_heads_up_tag" /> Loading packages/SystemUI/src/com/android/systemui/statusbar/notification/TextViewTransformState.java +4 −4 Original line number Diff line number Diff line Loading @@ -98,20 +98,20 @@ public class TextViewTransformState extends TransformState { int lineCount = mText.getLineCount(); return lineCount == 1 && lineCount == otherTvs.mText.getLineCount() && getEllipsisCount() == otherTvs.getEllipsisCount() && getViewHeight() != otherTvs.getViewHeight(); && getContentHeight() != otherTvs.getContentHeight(); } @Override protected int getViewWidth() { protected int getContentWidth() { Layout l = mText.getLayout(); if (l != null) { return (int) l.getLineWidth(0); } return super.getViewWidth(); return super.getContentWidth(); } @Override protected int getViewHeight() { protected int getContentHeight() { return mText.getLineHeight(); } Loading packages/SystemUI/src/com/android/systemui/statusbar/notification/TransformState.java +56 −23 Original line number Diff line number Diff line Loading @@ -41,6 +41,7 @@ public class TransformState { public static final int TRANSFORM_X = 0x1; public static final int TRANSFORM_Y = 0x10; public static final int TRANSFORM_ALL = TRANSFORM_X | TRANSFORM_Y; public static final int ALIGN_END_TAG = R.id.align_transform_end_tag; private static final float UNDEFINED = -1f; private static final int TRANSFORMATION_START_X = R.id.transformation_start_x_tag; Loading Loading @@ -78,11 +79,13 @@ public class TransformState { private boolean mSameAsAny; private float mTransformationEndY = UNDEFINED; private float mTransformationEndX = UNDEFINED; private boolean mAlignEnd; protected Interpolator mDefaultInterpolator = Interpolators.FAST_OUT_SLOW_IN; public void initFrom(View view, TransformInfo transformInfo) { mTransformedView = view; mTransformInfo = transformInfo; mAlignEnd = Boolean.TRUE.equals(view.getTag(ALIGN_END_TAG)); } /** Loading Loading @@ -135,13 +138,16 @@ public class TransformState { final View transformedView = mTransformedView; boolean transformX = (transformationFlags & TRANSFORM_X) != 0; boolean transformY = (transformationFlags & TRANSFORM_Y) != 0; int viewHeight = getViewHeight(); int otherHeight = otherState.getViewHeight(); boolean differentHeight = otherHeight != viewHeight && otherHeight != 0 && viewHeight != 0; int viewWidth = getViewWidth(); int otherWidth = otherState.getViewWidth(); boolean differentWidth = otherWidth != viewWidth && otherWidth != 0 && viewWidth != 0; boolean transformScale = transformScale(otherState) && (differentHeight || differentWidth); int ownContentHeight = getContentHeight(); int otherContentHeight = otherState.getContentHeight(); boolean differentHeight = otherContentHeight != ownContentHeight && otherContentHeight != 0 && ownContentHeight != 0; int ownContentWidth = getContentWidth(); int otherContentWidth = otherState.getContentWidth(); boolean differentWidth = otherContentWidth != ownContentWidth && otherContentWidth != 0 && ownContentWidth != 0; boolean transformScale = (differentHeight || differentWidth) && transformScale(otherState); boolean transformRightEdge = transformRightEdge(otherState); // lets animate the positions correctly if (transformationAmount == 0.0f || transformX && getTransformationStartX() == UNDEFINED Loading @@ -159,23 +165,30 @@ public class TransformState { if (customTransformation == null || !customTransformation.initTransformation(this, otherState)) { if (transformX) { if (transformRightEdge) { int otherViewWidth = otherState.getTransformedView().getWidth(); int ownViewWidth = transformedView.getWidth(); setTransformationStartX((otherPosition[0] + otherViewWidth) - (ownStablePosition[0] + ownViewWidth)); } else { setTransformationStartX(otherPosition[0] - ownStablePosition[0]); } } if (transformY) { setTransformationStartY(otherPosition[1] - ownStablePosition[1]); } // we also want to animate the scale if we're the same View otherView = otherState.getTransformedView(); if (transformScale && differentWidth) { setTransformationStartScaleX(otherWidth * otherView.getScaleX() / (float) viewWidth); transformedView.setPivotX(0); setTransformationStartScaleX(otherContentWidth * otherView.getScaleX() / (float) ownContentWidth); transformedView.setPivotX(transformRightEdge ? transformedView.getWidth() : 0); } else { setTransformationStartScaleX(UNDEFINED); } if (transformScale && differentHeight) { setTransformationStartScaleY(otherHeight * otherView.getScaleY() / (float) viewHeight); setTransformationStartScaleY(otherContentHeight * otherView.getScaleY() / (float) ownContentHeight); transformedView.setPivotY(0); } else { setTransformationStartScaleY(UNDEFINED); Loading Loading @@ -239,11 +252,19 @@ public class TransformState { } } protected int getViewWidth() { /** * The width of the content of this view. For some views, like TextViews, this will be the * width of content inside the view which is transforming, rather than the view's full width. */ protected int getContentWidth() { return mTransformedView.getWidth(); } protected int getViewHeight() { /** * The height of the content of this view. For some views, like TextViews, this will be the * height of content inside the view which is transforming, rather than the view's full height. */ protected int getContentHeight() { return mTransformedView.getHeight(); } Loading @@ -251,6 +272,12 @@ public class TransformState { return sameAs(otherState); } protected boolean transformRightEdge(TransformState otherState) { boolean alignEnd = mAlignEnd && otherState.mAlignEnd; boolean isRtl = mTransformedView.isLayoutRtl() && otherState.mTransformedView.isLayoutRtl(); return alignEnd ^ isRtl; } /** * Transforms the {@link #mTransformedView} to the given transformviewstate * @param otherState the state to transform from Loading Loading @@ -302,6 +329,9 @@ public class TransformState { boolean transformX = (transformationFlags & TRANSFORM_X) != 0; boolean transformY = (transformationFlags & TRANSFORM_Y) != 0; boolean transformScale = transformScale(otherState); boolean transformRightEdge = transformRightEdge(otherState); int ownContentWidth = getContentWidth(); int otherContentWidth = otherState.getContentWidth(); // lets animate the positions correctly if (transformationAmount == 0.0f) { if (transformX) { Loading @@ -316,14 +346,13 @@ public class TransformState { : transformedView.getTranslationY(); setTransformationStartY(start); } View otherView = otherState.getTransformedView(); if (transformScale && otherState.getViewWidth() != getViewWidth()) { if (transformScale && otherContentWidth != ownContentWidth) { setTransformationStartScaleX(transformedView.getScaleX()); transformedView.setPivotX(0); transformedView.setPivotX(transformRightEdge ? transformedView.getWidth() : 0); } else { setTransformationStartScaleX(UNDEFINED); } if (transformScale && otherState.getViewHeight() != getViewHeight()) { if (transformScale && otherState.getContentHeight() != getContentHeight()) { setTransformationStartScaleY(transformedView.getScaleY()); transformedView.setPivotY(0); } else { Loading @@ -336,7 +365,11 @@ public class TransformState { int[] otherStablePosition = otherState.getLaidOutLocationOnScreen(); int[] ownPosition = getLaidOutLocationOnScreen(); if (transformX) { float endX = otherStablePosition[0] - ownPosition[0]; int ownViewWidth = transformedView.getWidth(); int otherViewWidth = otherState.getTransformedView().getWidth(); float endX = transformRightEdge ? (otherStablePosition[0] + otherViewWidth) - (ownPosition[0] + ownViewWidth) : otherStablePosition[0] - ownPosition[0]; float interpolation = interpolatedValue; if (customTransformation != null) { if (customTransformation.customTransformTarget(this, otherState)) { Loading Loading @@ -370,19 +403,18 @@ public class TransformState { interpolation)); } if (transformScale) { View otherView = otherState.getTransformedView(); float transformationStartScaleX = getTransformationStartScaleX(); if (transformationStartScaleX != UNDEFINED) { transformedView.setScaleX( NotificationUtils.interpolate(transformationStartScaleX, (otherState.getViewWidth() / (float) getViewWidth()), (otherContentWidth / (float) ownContentWidth), interpolatedValue)); } float transformationStartScaleY = getTransformationStartScaleY(); if (transformationStartScaleY != UNDEFINED) { transformedView.setScaleY( NotificationUtils.interpolate(transformationStartScaleY, (otherState.getViewHeight() / (float) getViewHeight()), (otherState.getContentHeight() / (float) getContentHeight()), interpolatedValue)); } } Loading Loading @@ -529,6 +561,7 @@ public class TransformState { mSameAsAny = false; mTransformationEndX = UNDEFINED; mTransformationEndY = UNDEFINED; mAlignEnd = false; mDefaultInterpolator = Interpolators.FAST_OUT_SLOW_IN; } Loading packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationTemplateViewWrapper.java +1 −0 Original line number Diff line number Diff line Loading @@ -151,6 +151,7 @@ public class NotificationTemplateViewWrapper extends NotificationHeaderViewWrapp mRightIcon = mView.findViewById(com.android.internal.R.id.right_icon); if (mRightIcon != null) { mRightIcon.setTag(ImageTransformState.ICON_TAG, getRightIcon(sbn.getNotification())); mRightIcon.setTag(TransformState.ALIGN_END_TAG, true); } mLeftIcon = mView.findViewById(com.android.internal.R.id.left_icon); if (mLeftIcon != null) { Loading Loading
packages/SystemUI/res/values/ids.xml +1 −0 Original line number Diff line number Diff line Loading @@ -100,6 +100,7 @@ <!-- For notification icons for which targetSdk < L, this caches whether the icon is grayscale --> <item type="id" name="icon_is_grayscale" /> <item type="id" name="image_icon_tag" /> <item type="id" name="align_transform_end_tag" /> <item type="id" name="contains_transformed_view" /> <item type="id" name="is_clicked_heads_up_tag" /> Loading
packages/SystemUI/src/com/android/systemui/statusbar/notification/TextViewTransformState.java +4 −4 Original line number Diff line number Diff line Loading @@ -98,20 +98,20 @@ public class TextViewTransformState extends TransformState { int lineCount = mText.getLineCount(); return lineCount == 1 && lineCount == otherTvs.mText.getLineCount() && getEllipsisCount() == otherTvs.getEllipsisCount() && getViewHeight() != otherTvs.getViewHeight(); && getContentHeight() != otherTvs.getContentHeight(); } @Override protected int getViewWidth() { protected int getContentWidth() { Layout l = mText.getLayout(); if (l != null) { return (int) l.getLineWidth(0); } return super.getViewWidth(); return super.getContentWidth(); } @Override protected int getViewHeight() { protected int getContentHeight() { return mText.getLineHeight(); } Loading
packages/SystemUI/src/com/android/systemui/statusbar/notification/TransformState.java +56 −23 Original line number Diff line number Diff line Loading @@ -41,6 +41,7 @@ public class TransformState { public static final int TRANSFORM_X = 0x1; public static final int TRANSFORM_Y = 0x10; public static final int TRANSFORM_ALL = TRANSFORM_X | TRANSFORM_Y; public static final int ALIGN_END_TAG = R.id.align_transform_end_tag; private static final float UNDEFINED = -1f; private static final int TRANSFORMATION_START_X = R.id.transformation_start_x_tag; Loading Loading @@ -78,11 +79,13 @@ public class TransformState { private boolean mSameAsAny; private float mTransformationEndY = UNDEFINED; private float mTransformationEndX = UNDEFINED; private boolean mAlignEnd; protected Interpolator mDefaultInterpolator = Interpolators.FAST_OUT_SLOW_IN; public void initFrom(View view, TransformInfo transformInfo) { mTransformedView = view; mTransformInfo = transformInfo; mAlignEnd = Boolean.TRUE.equals(view.getTag(ALIGN_END_TAG)); } /** Loading Loading @@ -135,13 +138,16 @@ public class TransformState { final View transformedView = mTransformedView; boolean transformX = (transformationFlags & TRANSFORM_X) != 0; boolean transformY = (transformationFlags & TRANSFORM_Y) != 0; int viewHeight = getViewHeight(); int otherHeight = otherState.getViewHeight(); boolean differentHeight = otherHeight != viewHeight && otherHeight != 0 && viewHeight != 0; int viewWidth = getViewWidth(); int otherWidth = otherState.getViewWidth(); boolean differentWidth = otherWidth != viewWidth && otherWidth != 0 && viewWidth != 0; boolean transformScale = transformScale(otherState) && (differentHeight || differentWidth); int ownContentHeight = getContentHeight(); int otherContentHeight = otherState.getContentHeight(); boolean differentHeight = otherContentHeight != ownContentHeight && otherContentHeight != 0 && ownContentHeight != 0; int ownContentWidth = getContentWidth(); int otherContentWidth = otherState.getContentWidth(); boolean differentWidth = otherContentWidth != ownContentWidth && otherContentWidth != 0 && ownContentWidth != 0; boolean transformScale = (differentHeight || differentWidth) && transformScale(otherState); boolean transformRightEdge = transformRightEdge(otherState); // lets animate the positions correctly if (transformationAmount == 0.0f || transformX && getTransformationStartX() == UNDEFINED Loading @@ -159,23 +165,30 @@ public class TransformState { if (customTransformation == null || !customTransformation.initTransformation(this, otherState)) { if (transformX) { if (transformRightEdge) { int otherViewWidth = otherState.getTransformedView().getWidth(); int ownViewWidth = transformedView.getWidth(); setTransformationStartX((otherPosition[0] + otherViewWidth) - (ownStablePosition[0] + ownViewWidth)); } else { setTransformationStartX(otherPosition[0] - ownStablePosition[0]); } } if (transformY) { setTransformationStartY(otherPosition[1] - ownStablePosition[1]); } // we also want to animate the scale if we're the same View otherView = otherState.getTransformedView(); if (transformScale && differentWidth) { setTransformationStartScaleX(otherWidth * otherView.getScaleX() / (float) viewWidth); transformedView.setPivotX(0); setTransformationStartScaleX(otherContentWidth * otherView.getScaleX() / (float) ownContentWidth); transformedView.setPivotX(transformRightEdge ? transformedView.getWidth() : 0); } else { setTransformationStartScaleX(UNDEFINED); } if (transformScale && differentHeight) { setTransformationStartScaleY(otherHeight * otherView.getScaleY() / (float) viewHeight); setTransformationStartScaleY(otherContentHeight * otherView.getScaleY() / (float) ownContentHeight); transformedView.setPivotY(0); } else { setTransformationStartScaleY(UNDEFINED); Loading Loading @@ -239,11 +252,19 @@ public class TransformState { } } protected int getViewWidth() { /** * The width of the content of this view. For some views, like TextViews, this will be the * width of content inside the view which is transforming, rather than the view's full width. */ protected int getContentWidth() { return mTransformedView.getWidth(); } protected int getViewHeight() { /** * The height of the content of this view. For some views, like TextViews, this will be the * height of content inside the view which is transforming, rather than the view's full height. */ protected int getContentHeight() { return mTransformedView.getHeight(); } Loading @@ -251,6 +272,12 @@ public class TransformState { return sameAs(otherState); } protected boolean transformRightEdge(TransformState otherState) { boolean alignEnd = mAlignEnd && otherState.mAlignEnd; boolean isRtl = mTransformedView.isLayoutRtl() && otherState.mTransformedView.isLayoutRtl(); return alignEnd ^ isRtl; } /** * Transforms the {@link #mTransformedView} to the given transformviewstate * @param otherState the state to transform from Loading Loading @@ -302,6 +329,9 @@ public class TransformState { boolean transformX = (transformationFlags & TRANSFORM_X) != 0; boolean transformY = (transformationFlags & TRANSFORM_Y) != 0; boolean transformScale = transformScale(otherState); boolean transformRightEdge = transformRightEdge(otherState); int ownContentWidth = getContentWidth(); int otherContentWidth = otherState.getContentWidth(); // lets animate the positions correctly if (transformationAmount == 0.0f) { if (transformX) { Loading @@ -316,14 +346,13 @@ public class TransformState { : transformedView.getTranslationY(); setTransformationStartY(start); } View otherView = otherState.getTransformedView(); if (transformScale && otherState.getViewWidth() != getViewWidth()) { if (transformScale && otherContentWidth != ownContentWidth) { setTransformationStartScaleX(transformedView.getScaleX()); transformedView.setPivotX(0); transformedView.setPivotX(transformRightEdge ? transformedView.getWidth() : 0); } else { setTransformationStartScaleX(UNDEFINED); } if (transformScale && otherState.getViewHeight() != getViewHeight()) { if (transformScale && otherState.getContentHeight() != getContentHeight()) { setTransformationStartScaleY(transformedView.getScaleY()); transformedView.setPivotY(0); } else { Loading @@ -336,7 +365,11 @@ public class TransformState { int[] otherStablePosition = otherState.getLaidOutLocationOnScreen(); int[] ownPosition = getLaidOutLocationOnScreen(); if (transformX) { float endX = otherStablePosition[0] - ownPosition[0]; int ownViewWidth = transformedView.getWidth(); int otherViewWidth = otherState.getTransformedView().getWidth(); float endX = transformRightEdge ? (otherStablePosition[0] + otherViewWidth) - (ownPosition[0] + ownViewWidth) : otherStablePosition[0] - ownPosition[0]; float interpolation = interpolatedValue; if (customTransformation != null) { if (customTransformation.customTransformTarget(this, otherState)) { Loading Loading @@ -370,19 +403,18 @@ public class TransformState { interpolation)); } if (transformScale) { View otherView = otherState.getTransformedView(); float transformationStartScaleX = getTransformationStartScaleX(); if (transformationStartScaleX != UNDEFINED) { transformedView.setScaleX( NotificationUtils.interpolate(transformationStartScaleX, (otherState.getViewWidth() / (float) getViewWidth()), (otherContentWidth / (float) ownContentWidth), interpolatedValue)); } float transformationStartScaleY = getTransformationStartScaleY(); if (transformationStartScaleY != UNDEFINED) { transformedView.setScaleY( NotificationUtils.interpolate(transformationStartScaleY, (otherState.getViewHeight() / (float) getViewHeight()), (otherState.getContentHeight() / (float) getContentHeight()), interpolatedValue)); } } Loading Loading @@ -529,6 +561,7 @@ public class TransformState { mSameAsAny = false; mTransformationEndX = UNDEFINED; mTransformationEndY = UNDEFINED; mAlignEnd = false; mDefaultInterpolator = Interpolators.FAST_OUT_SLOW_IN; } Loading
packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationTemplateViewWrapper.java +1 −0 Original line number Diff line number Diff line Loading @@ -151,6 +151,7 @@ public class NotificationTemplateViewWrapper extends NotificationHeaderViewWrapp mRightIcon = mView.findViewById(com.android.internal.R.id.right_icon); if (mRightIcon != null) { mRightIcon.setTag(ImageTransformState.ICON_TAG, getRightIcon(sbn.getNotification())); mRightIcon.setTag(TransformState.ALIGN_END_TAG, true); } mLeftIcon = mView.findViewById(com.android.internal.R.id.left_icon); if (mLeftIcon != null) { Loading