diff options
15 files changed, 332 insertions, 83 deletions
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index 86fedb135f47..1017191c1c21 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -3115,7 +3115,6 @@ public class Notification implements Parcelable private int mTextColorsAreForBackground = COLOR_INVALID; private int mPrimaryTextColor = COLOR_INVALID; private int mSecondaryTextColor = COLOR_INVALID; - private int mActionBarColor = COLOR_INVALID; private int mBackgroundColor = COLOR_INVALID; private int mForegroundColor = COLOR_INVALID; /** @@ -4359,16 +4358,6 @@ public class Notification implements Parcelable return mSecondaryTextColor; } - private int getActionBarColor() { - ensureColors(); - return mActionBarColor; - } - - private int getActionBarColorDeEmphasized() { - int backgroundColor = getBackgroundColor(); - return NotificationColorUtil.getShiftedColor(backgroundColor, 12); - } - private void setTextViewColorSecondary(RemoteViews contentView, int id) { ensureColors(); contentView.setTextColor(id, mSecondaryTextColor); @@ -4378,7 +4367,6 @@ public class Notification implements Parcelable int backgroundColor = getBackgroundColor(); if (mPrimaryTextColor == COLOR_INVALID || mSecondaryTextColor == COLOR_INVALID - || mActionBarColor == COLOR_INVALID || mTextColorsAreForBackground != backgroundColor) { mTextColorsAreForBackground = backgroundColor; if (!hasForegroundColor() || !isColorized()) { @@ -4451,8 +4439,6 @@ public class Notification implements Parcelable } } } - mActionBarColor = NotificationColorUtil.resolveActionBarColor(mContext, - backgroundColor); } } @@ -4761,8 +4747,8 @@ public class Notification implements Parcelable validRemoteInput |= actionHasValidInput; final RemoteViews button = generateActionButton(action, emphazisedMode, - i % 2 != 0, p.ambient); - if (actionHasValidInput) { + p.ambient); + if (actionHasValidInput && !emphazisedMode) { // Clear the drawable button.setInt(R.id.action0, "setBackgroundResource", 0); } @@ -5069,7 +5055,7 @@ public class Notification implements Parcelable } private RemoteViews generateActionButton(Action action, boolean emphazisedMode, - boolean oddAction, boolean ambient) { + boolean ambient) { final boolean tombstone = (action.actionIntent == null); RemoteViews button = new BuilderRemoteViews(mContext.getApplicationInfo(), emphazisedMode ? getEmphasizedActionLayoutResource() @@ -5082,35 +5068,42 @@ public class Notification implements Parcelable if (action.mRemoteInputs != null) { button.setRemoteInputs(R.id.action0, action.mRemoteInputs); } - // TODO: handle emphasized mode / actions right if (emphazisedMode) { // change the background bgColor - int bgColor; - if (isColorized()) { - bgColor = oddAction ? getActionBarColor() : getActionBarColorDeEmphasized(); - } else { - bgColor = mContext.getColor(oddAction ? R.color.notification_action_list - : R.color.notification_action_list_dark); - } - button.setDrawableTint(R.id.button_holder, true, - bgColor, PorterDuff.Mode.SRC_ATOP); CharSequence title = action.title; ColorStateList[] outResultColor = null; + int background = resolveBackgroundColor(); if (isLegacy()) { title = NotificationColorUtil.clearColorSpans(title); } else { outResultColor = new ColorStateList[1]; - title = ensureColorSpanContrast(title, bgColor, outResultColor); + title = ensureColorSpanContrast(title, background, outResultColor); } button.setTextViewText(R.id.action0, processTextSpans(title)); setTextViewColorPrimary(button, R.id.action0); - if (outResultColor != null && outResultColor[0] != null) { - // We need to set the text color as well since changing a text to uppercase - // clears its spans. - button.setTextColor(R.id.action0, outResultColor[0]); + int rippleColor; + boolean hasColorOverride = outResultColor != null && outResultColor[0] != null; + if (hasColorOverride) { + // There's a span spanning the full text, let's take it and use it as the + // background color + background = outResultColor[0].getDefaultColor(); + int textColor = NotificationColorUtil.resolvePrimaryColor(mContext, + background); + button.setTextColor(R.id.action0, textColor); + rippleColor = textColor; } else if (mN.color != COLOR_DEFAULT && !isColorized() && mTintActionButtons) { - button.setTextColor(R.id.action0,resolveContrastColor()); + rippleColor = resolveContrastColor(); + button.setTextColor(R.id.action0, rippleColor); + } else { + rippleColor = getPrimaryTextColor(); } + // We only want about 20% alpha for the ripple + rippleColor = (rippleColor & 0x00ffffff) | 0x33000000; + button.setColorStateList(R.id.action0, "setRippleColor", + ColorStateList.valueOf(rippleColor)); + button.setColorStateList(R.id.action0, "setButtonBackground", + ColorStateList.valueOf(background)); + button.setBoolean(R.id.action0, "setHasStroke", !hasColorOverride); } else { button.setTextViewText(R.id.action0, processTextSpans( processLegacyText(action.title))); @@ -5160,31 +5153,35 @@ public class Notification implements Parcelable } textColor = new ColorStateList(textColor.getStates().clone(), newColors); + if (fullLength) { + outResultColor[0] = textColor; + // Let's drop the color from the span + textColor = null; + } resultSpan = new TextAppearanceSpan( originalSpan.getFamily(), originalSpan.getTextStyle(), originalSpan.getTextSize(), textColor, originalSpan.getLinkTextColor()); - if (fullLength) { - outResultColor[0] = new ColorStateList( - textColor.getStates().clone(), newColors); - } } } else if (resultSpan instanceof ForegroundColorSpan) { ForegroundColorSpan originalSpan = (ForegroundColorSpan) resultSpan; int foregroundColor = originalSpan.getForegroundColor(); foregroundColor = NotificationColorUtil.ensureLargeTextContrast( foregroundColor, background, mInNightMode); - resultSpan = new ForegroundColorSpan(foregroundColor); if (fullLength) { outResultColor[0] = ColorStateList.valueOf(foregroundColor); + resultSpan = null; + } else { + resultSpan = new ForegroundColorSpan(foregroundColor); } } else { resultSpan = span; } - - builder.setSpan(resultSpan, spanStart, spanEnd, ss.getSpanFlags(span)); + if (resultSpan != null) { + builder.setSpan(resultSpan, spanStart, spanEnd, ss.getSpanFlags(span)); + } } return builder; } @@ -5515,6 +5512,18 @@ public class Notification implements Parcelable } } + /** + * Same as getBackgroundColor but also resolved the default color to the background. + */ + private int resolveBackgroundColor() { + int backgroundColor = getBackgroundColor(); + if (backgroundColor == COLOR_DEFAULT) { + backgroundColor = mContext.getColor( + com.android.internal.R.color.notification_material_background_color); + } + return backgroundColor; + } + private boolean isColorized() { return mN.isColorized(); } diff --git a/core/java/android/widget/RemoteViews.java b/core/java/android/widget/RemoteViews.java index 08513aa8682e..a34bd093e655 100644 --- a/core/java/android/widget/RemoteViews.java +++ b/core/java/android/widget/RemoteViews.java @@ -3000,6 +3000,21 @@ public class RemoteViews implements Parcelable, Filter { } /** + * Call a method taking one ColorStateList on a view in the layout for this RemoteViews. + * + * @param viewId The id of the view on which to call the method. + * @param methodName The name of the method to call. + * @param value The value to pass to the method. + * + * @hide + */ + public void setColorStateList(int viewId, String methodName, ColorStateList value) { + addAction(new ReflectionAction(viewId, methodName, ReflectionAction.COLOR_STATE_LIST, + value)); + } + + + /** * Call a method taking one long on a view in the layout for this RemoteViews. * * @param viewId The id of the view on which to call the method. diff --git a/core/java/com/android/internal/util/NotificationColorUtil.java b/core/java/com/android/internal/util/NotificationColorUtil.java index 577fa1758f5e..0f1307873f28 100644 --- a/core/java/com/android/internal/util/NotificationColorUtil.java +++ b/core/java/com/android/internal/util/NotificationColorUtil.java @@ -558,13 +558,6 @@ public class NotificationColorUtil { } } - public static int resolveActionBarColor(Context context, int backgroundColor) { - if (backgroundColor == Notification.COLOR_DEFAULT) { - return context.getColor(com.android.internal.R.color.notification_action_list); - } - return getShiftedColor(backgroundColor, 7); - } - /** * Get a color that stays in the same tint, but darkens or lightens it by a certain * amount. diff --git a/core/java/com/android/internal/widget/EmphasizedNotificationButton.java b/core/java/com/android/internal/widget/EmphasizedNotificationButton.java new file mode 100644 index 000000000000..5213746e5a12 --- /dev/null +++ b/core/java/com/android/internal/widget/EmphasizedNotificationButton.java @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2018 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.internal.widget; + +import android.content.Context; +import android.content.res.ColorStateList; +import android.graphics.drawable.DrawableWrapper; +import android.graphics.drawable.GradientDrawable; +import android.graphics.drawable.InsetDrawable; +import android.graphics.drawable.RippleDrawable; +import android.util.AttributeSet; +import android.view.RemotableViewMethod; +import android.widget.Button; +import android.widget.RemoteViews; + +/** + * A button implementation for the emphasized notification style. + * + * @hide + */ +@RemoteViews.RemoteView +public class EmphasizedNotificationButton extends Button { + private final RippleDrawable mRipple; + private final int mStrokeWidth; + private final int mStrokeColor; + + public EmphasizedNotificationButton(Context context) { + this(context, null); + } + + public EmphasizedNotificationButton(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public EmphasizedNotificationButton(Context context, AttributeSet attrs, int defStyleAttr) { + this(context, attrs, defStyleAttr, 0); + } + + public EmphasizedNotificationButton(Context context, AttributeSet attrs, int defStyleAttr, + int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + DrawableWrapper background = (DrawableWrapper) getBackground().mutate(); + mRipple = (RippleDrawable) background.getDrawable(); + mStrokeWidth = getResources().getDimensionPixelSize( + com.android.internal.R.dimen.emphasized_button_stroke_width); + mStrokeColor = getContext().getColor(com.android.internal.R.color.material_grey_300); + mRipple.mutate(); + } + + @RemotableViewMethod + public void setRippleColor(ColorStateList color) { + mRipple.setColor(color); + invalidate(); + } + + @RemotableViewMethod + public void setButtonBackground(ColorStateList color) { + GradientDrawable inner = (GradientDrawable) mRipple.getDrawable(0); + inner.setColor(color); + invalidate(); + } + + @RemotableViewMethod + public void setHasStroke(boolean hasStroke) { + GradientDrawable inner = (GradientDrawable) mRipple.getDrawable(0); + inner.setStroke(hasStroke ? mStrokeWidth : 0, mStrokeColor); + invalidate(); + } +} diff --git a/core/java/com/android/internal/widget/NotificationActionListLayout.java b/core/java/com/android/internal/widget/NotificationActionListLayout.java index e013553ec046..0482f6cf596a 100644 --- a/core/java/com/android/internal/widget/NotificationActionListLayout.java +++ b/core/java/com/android/internal/widget/NotificationActionListLayout.java @@ -16,17 +16,15 @@ package com.android.internal.widget; -import android.annotation.Nullable; import android.content.Context; -import android.content.res.Resources; import android.content.res.TypedArray; -import android.graphics.drawable.Drawable; import android.graphics.drawable.RippleDrawable; import android.util.AttributeSet; import android.util.Pair; import android.view.Gravity; import android.view.RemotableViewMethod; import android.view.View; +import android.view.ViewGroup; import android.widget.LinearLayout; import android.widget.RemoteViews; import android.widget.TextView; @@ -45,9 +43,11 @@ public class NotificationActionListLayout extends LinearLayout { private int mTotalWidth = 0; private ArrayList<Pair<Integer, TextView>> mMeasureOrderTextViews = new ArrayList<>(); private ArrayList<View> mMeasureOrderOther = new ArrayList<>(); - private boolean mMeasureLinearly; - private int mDefaultPaddingEnd; - private Drawable mDefaultBackground; + private boolean mEmphasizedMode; + private int mDefaultPaddingBottom; + private int mDefaultPaddingTop; + private int mEmphasizedHeight; + private int mRegularHeight; public NotificationActionListLayout(Context context, AttributeSet attrs) { this(context, attrs, 0); @@ -68,7 +68,7 @@ public class NotificationActionListLayout extends LinearLayout { @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - if (mMeasureLinearly) { + if (mEmphasizedMode) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); return; } @@ -219,7 +219,7 @@ public class NotificationActionListLayout extends LinearLayout { @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { - if (mMeasureLinearly) { + if (mEmphasizedMode) { super.onLayout(changed, left, top, right, bottom); return; } @@ -280,8 +280,21 @@ public class NotificationActionListLayout extends LinearLayout { @Override protected void onFinishInflate() { super.onFinishInflate(); - mDefaultPaddingEnd = getPaddingEnd(); - mDefaultBackground = getBackground(); + mDefaultPaddingBottom = getPaddingBottom(); + mDefaultPaddingTop = getPaddingTop(); + updateHeights(); + } + + private void updateHeights() { + int paddingTop = getResources().getDimensionPixelSize( + com.android.internal.R.dimen.notification_content_margin); + // same padding on bottom and at end + int paddingBottom = getResources().getDimensionPixelSize( + com.android.internal.R.dimen.notification_content_margin_end); + mEmphasizedHeight = paddingBottom + paddingTop + getResources().getDimensionPixelSize( + com.android.internal.R.dimen.notification_action_emphasized_height); + mRegularHeight = getResources().getDimensionPixelSize( + com.android.internal.R.dimen.notification_action_list_height); } /** @@ -291,11 +304,38 @@ public class NotificationActionListLayout extends LinearLayout { */ @RemotableViewMethod public void setEmphasizedMode(boolean emphasizedMode) { - mMeasureLinearly = emphasizedMode; - setPaddingRelative(getPaddingStart(), getPaddingTop(), - emphasizedMode ? 0 : mDefaultPaddingEnd, getPaddingBottom()); - setBackground(emphasizedMode ? null : mDefaultBackground); - requestLayout(); + mEmphasizedMode = emphasizedMode; + int height; + if (emphasizedMode) { + int paddingTop = getResources().getDimensionPixelSize( + com.android.internal.R.dimen.notification_content_margin); + // same padding on bottom and at end + int paddingBottom = getResources().getDimensionPixelSize( + com.android.internal.R.dimen.notification_content_margin_end); + height = mEmphasizedHeight; + int buttonPaddingInternal = getResources().getDimensionPixelSize( + com.android.internal.R.dimen.button_inset_vertical_material); + setPaddingRelative(getPaddingStart(), + paddingTop - buttonPaddingInternal, + getPaddingEnd(), + paddingBottom - buttonPaddingInternal); + } else { + setPaddingRelative(getPaddingStart(), + mDefaultPaddingTop, + getPaddingEnd(), + mDefaultPaddingBottom); + height = mRegularHeight; + } + ViewGroup.LayoutParams layoutParams = getLayoutParams(); + layoutParams.height = height; + setLayoutParams(layoutParams); + } + + public int getExtraMeasureHeight() { + if (mEmphasizedMode) { + return mEmphasizedHeight - mRegularHeight; + } + return 0; } public static final Comparator<Pair<Integer, TextView>> MEASURE_ORDER_COMPARATOR diff --git a/core/res/res/anim/flat_button_state_list_anim_material.xml b/core/res/res/anim/flat_button_state_list_anim_material.xml new file mode 100644 index 000000000000..266f14a1d420 --- /dev/null +++ b/core/res/res/anim/flat_button_state_list_anim_material.xml @@ -0,0 +1,44 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2018 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 + --> +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:state_pressed="true" android:state_enabled="true"> + <set> + <objectAnimator android:propertyName="translationZ" + android:duration="@integer/button_pressed_animation_duration" + android:valueTo="1dp" + android:valueType="floatType"/> + </set> + </item> + <!-- base state --> + <item android:state_enabled="true"> + <set> + <objectAnimator android:propertyName="translationZ" + android:duration="@integer/button_pressed_animation_duration" + android:valueTo="0" + android:startDelay="@integer/button_pressed_animation_delay" + android:valueType="floatType"/> + </set> + </item> + <item> + <set> + <objectAnimator android:propertyName="translationZ" + android:duration="0" + android:valueTo="0" + android:valueType="floatType"/> + </set> + </item> +</selector>
\ No newline at end of file diff --git a/core/res/res/drawable/btn_notification_emphasized.xml b/core/res/res/drawable/btn_notification_emphasized.xml new file mode 100644 index 000000000000..1a574fe39e6e --- /dev/null +++ b/core/res/res/drawable/btn_notification_emphasized.xml @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2018 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 + --> + +<inset xmlns:android="http://schemas.android.com/apk/res/android" + android:insetLeft="@dimen/button_inset_horizontal_material" + android:insetTop="@dimen/button_inset_vertical_material" + android:insetRight="@dimen/button_inset_horizontal_material" + android:insetBottom="@dimen/button_inset_vertical_material"> + <ripple android:color="?attr/colorControlHighlight"> + <item> + <shape android:shape="rectangle"> + <corners android:radius="?attr/buttonCornerRadius" /> + <padding android:left="@dimen/button_padding_horizontal_material" + android:top="@dimen/button_padding_vertical_material" + android:right="@dimen/button_padding_horizontal_material" + android:bottom="@dimen/button_padding_vertical_material" /> + <solid android:color="@color/white" /> + <stroke android:width="@dimen/emphasized_button_stroke_width" + android:color="@color/material_grey_300"/> + </shape> + </item> + </ripple> +</inset> diff --git a/core/res/res/layout/notification_material_action_emphasized.xml b/core/res/res/layout/notification_material_action_emphasized.xml index 1e364cce3f4f..a6b7b380eaa4 100644 --- a/core/res/res/layout/notification_material_action_emphasized.xml +++ b/core/res/res/layout/notification_material_action_emphasized.xml @@ -14,21 +14,16 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License --> -<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:id="@+id/button_holder" +<com.android.internal.widget.EmphasizedNotificationButton + xmlns:android="http://schemas.android.com/apk/res/android" + style="@style/NotificationEmphasizedAction" + android:id="@+id/action0" android:layout_width="match_parent" android:layout_height="match_parent" + android:layout_marginStart="12dp" android:layout_weight="1" - android:background="#ff000000"> - <Button - style="@android:style/Widget.Material.Light.Button.Borderless.Small" - android:id="@+id/action0" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:gravity="center" - android:textColor="@color/notification_default_color" - android:singleLine="true" - android:ellipsize="end" - android:background="@drawable/notification_material_action_background" - /> -</FrameLayout> + android:gravity="center" + android:textColor="@color/notification_default_color" + android:singleLine="true" + android:ellipsize="end" +/> diff --git a/core/res/res/values/colors.xml b/core/res/res/values/colors.xml index c63f31997bcb..9215f3f7611a 100644 --- a/core/res/res/values/colors.xml +++ b/core/res/res/values/colors.xml @@ -148,7 +148,6 @@ <color name="notification_progress_background_color">@color/secondary_text_material_light</color> <color name="notification_action_list">#ffeeeeee</color> - <color name="notification_action_list_dark">#ffe0e0e0</color> <!-- Keyguard colors --> <color name="keyguard_avatar_frame_color">#ffffffff</color> diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml index 058185609a92..2aa40fdf9fd5 100644 --- a/core/res/res/values/dimens.xml +++ b/core/res/res/values/dimens.xml @@ -182,6 +182,12 @@ <!-- The height of the notification action list --> <dimen name="notification_action_list_height">60dp</dimen> + <!-- The height of the notification action list --> + <dimen name="notification_action_emphasized_height">48dp</dimen> + + <!-- Size of the stroke with for the emphasized notification button style --> + <dimen name="emphasized_button_stroke_width">1dp</dimen> + <!-- height of the content margin to accomodate for the header --> <dimen name="notification_content_margin_top">46dp</dimen> diff --git a/core/res/res/values/styles.xml b/core/res/res/values/styles.xml index e14aa149b1c7..984461b06624 100644 --- a/core/res/res/values/styles.xml +++ b/core/res/res/values/styles.xml @@ -1510,4 +1510,10 @@ please see styles_device_defaults.xml. <item name="gravity">top</item> </style> + <!-- Colored bordered ink button --> + <style name="NotificationEmphasizedAction" parent="Widget.Material.Button"> + <item name="background">@drawable/btn_notification_emphasized</item> + <item name="stateListAnimator">@anim/flat_button_state_list_anim_material</item> + </style> + </resources> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 5856648c78c8..5a0298730451 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -2810,7 +2810,6 @@ <java-symbol type="color" name="notification_action_list" /> <java-symbol type="color" name="notification_material_background_color" /> - <java-symbol type="color" name="notification_action_list_dark" /> <!-- Resolver target actions --> <java-symbol type="array" name="resolver_target_actions_pin" /> @@ -2860,6 +2859,7 @@ <java-symbol type="dimen" name="input_extract_action_button_height" /> <java-symbol type="dimen" name="notification_action_list_height" /> + <java-symbol type="dimen" name="notification_action_emphasized_height" /> <!-- TV Remote Service package --> <java-symbol type="string" name="config_tvRemoteServicePackage" /> @@ -2885,8 +2885,6 @@ <!-- Used internally for assistant to launch activity transitions --> <java-symbol type="id" name="cross_task_transition" /> - <java-symbol type="id" name="button_holder" /> - <java-symbol type="bool" name="config_useRoundIcon" /> <!-- For System navigation keys --> @@ -3221,6 +3219,9 @@ <java-symbol type="drawable" name="stat_sys_vitals" /> <java-symbol type="color" name="text_color_primary" /> + <java-symbol type="color" name="material_grey_300" /> + <java-symbol type="dimen" name="emphasized_button_stroke_width" /> + <java-symbol type="dimen" name="button_inset_vertical_material" /> <java-symbol type="array" name="config_batteryPackageTypeSystem" /> <java-symbol type="array" name="config_batteryPackageTypeService" /> @@ -3267,7 +3268,6 @@ <java-symbol type="id" name="remote_input_progress" /> <java-symbol type="id" name="remote_input_send" /> <java-symbol type="id" name="remote_input" /> - <java-symbol type="dimen" name="notification_content_margin" /> <java-symbol type="dimen" name="slice_shortcut_size" /> <java-symbol type="dimen" name="slice_icon_size" /> <java-symbol type="dimen" name="slice_padding" /> diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java index b81e9af4f692..b62fb4d7da83 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java @@ -232,7 +232,9 @@ public class NotificationContentView extends FrameLayout { } } if (mHeadsUpChild != null) { - int size = Math.min(maxSize, mHeadsUpHeight); + int maxHeight = mHeadsUpHeight; + maxHeight += mHeadsUpWrapper.getExtraMeasureHeight(); + int size = Math.min(maxSize, maxHeight); ViewGroup.LayoutParams layoutParams = mHeadsUpChild.getLayoutParams(); boolean useExactly = false; if (layoutParams.height >= 0) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationTemplateViewWrapper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationTemplateViewWrapper.java index 28beb21dba4b..5f7b638dc872 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationTemplateViewWrapper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationTemplateViewWrapper.java @@ -25,6 +25,7 @@ import android.widget.ImageView; import android.widget.ProgressBar; import android.widget.TextView; +import com.android.internal.widget.NotificationActionListLayout; import com.android.systemui.statusbar.CrossFadeHelper; import com.android.systemui.statusbar.ExpandableNotificationRow; import com.android.systemui.statusbar.TransformableView; @@ -47,6 +48,7 @@ public class NotificationTemplateViewWrapper extends NotificationHeaderViewWrapp private int mContentHeight; private int mMinHeightHint; + private NotificationActionListLayout mActions; protected NotificationTemplateViewWrapper(Context ctx, View view, ExpandableNotificationRow row) { @@ -133,6 +135,7 @@ public class NotificationTemplateViewWrapper extends NotificationHeaderViewWrapp mProgressBar = null; } mActionsContainer = mView.findViewById(com.android.internal.R.id.actions_container); + mActions = mView.findViewById(com.android.internal.R.id.actions); mReplyAction = mView.findViewById(com.android.internal.R.id.reply_icon_action); } @@ -284,4 +287,13 @@ public class NotificationTemplateViewWrapper extends NotificationHeaderViewWrapp - getHeaderTranslation()); } } + + @Override + public int getExtraMeasureHeight() { + int extra = 0; + if (mActions != null) { + extra = mActions.getExtraMeasureHeight(); + } + return extra + super.getExtraMeasureHeight(); + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationViewWrapper.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationViewWrapper.java index 873f088f8431..b09df158072c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationViewWrapper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationViewWrapper.java @@ -205,4 +205,12 @@ public abstract class NotificationViewWrapper implements TransformableView { public void setHeaderVisibleAmount(float headerVisibleAmount) { } + + /** + * Get the extra height that needs to be added to this view, such that it can be measured + * normally. + */ + public int getExtraMeasureHeight() { + return 0; + } } |