diff options
| author | 2021-02-26 13:53:12 -0500 | |
|---|---|---|
| committer | 2021-02-26 14:19:00 -0500 | |
| commit | 19864ec962fe9b8d42fee5ea360a4474c550fa7e (patch) | |
| tree | 4d8a0102d1fc7b01806eb9da8c2d6b318ad12033 | |
| parent | 072848e1637da63c1af21e6ab5627d7b8ea25f83 (diff) | |
Fix the vertical positioning of the text in collapsed notifications.
Test: manual / visual
Bug: 181048615
Change-Id: I57fb542a776b254a6537dbed608259e69def411f
| -rw-r--r-- | core/java/com/android/internal/widget/NotificationVanishingFrameLayout.java | 70 | ||||
| -rw-r--r-- | core/res/res/layout/notification_template_material_base.xml | 16 |
2 files changed, 82 insertions, 4 deletions
diff --git a/core/java/com/android/internal/widget/NotificationVanishingFrameLayout.java b/core/java/com/android/internal/widget/NotificationVanishingFrameLayout.java new file mode 100644 index 000000000000..742bdfdde756 --- /dev/null +++ b/core/java/com/android/internal/widget/NotificationVanishingFrameLayout.java @@ -0,0 +1,70 @@ +/* + * Copyright (C) 2021 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.annotation.Nullable; +import android.content.Context; +import android.util.AttributeSet; +import android.view.View; +import android.widget.FrameLayout; +import android.widget.RemoteViews; + +/** + * This view will measure itself as having 0 size if all of its children are {@link #GONE}. + * Otherwise it acts like a normal {@link FrameLayout}. + */ +@RemoteViews.RemoteView +public class NotificationVanishingFrameLayout extends FrameLayout { + public NotificationVanishingFrameLayout(Context context) { + this(context, null, 0, 0); + } + + public NotificationVanishingFrameLayout(Context context, @Nullable AttributeSet attrs) { + this(context, attrs, 0, 0); + } + + public NotificationVanishingFrameLayout(Context context, @Nullable AttributeSet attrs, + int defStyleAttr) { + this(context, attrs, defStyleAttr, 0); + } + + public NotificationVanishingFrameLayout(Context context, AttributeSet attrs, int defStyleAttr, + int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + if (allChildrenGone()) { + int zeroSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.EXACTLY); + super.onMeasure(zeroSpec, zeroSpec); + } else { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } + } + + private boolean allChildrenGone() { + final int childCount = getChildCount(); + for (int i = 0; i < childCount; i++) { + final View child = getChildAt(i); + if (child != null && child.getVisibility() != GONE) { + return false; + } + } + return true; + } +} diff --git a/core/res/res/layout/notification_template_material_base.xml b/core/res/res/layout/notification_template_material_base.xml index fa7b1c90dfac..b83611bcc177 100644 --- a/core/res/res/layout/notification_template_material_base.xml +++ b/core/res/res/layout/notification_template_material_base.xml @@ -138,12 +138,20 @@ android:orientation="vertical" > - <include - layout="@layout/notification_template_text" + <com.android.internal.widget.NotificationVanishingFrameLayout android:layout_width="match_parent" android:layout_height="@dimen/notification_headerless_line_height" - android:layout_marginTop="0dp" - /> + > + <!-- This is the simplest way to keep this text vertically centered without using + gravity="center_vertical" which causes jumpiness in expansion animations. --> + <include + layout="@layout/notification_template_text" + android:layout_width="match_parent" + android:layout_height="@dimen/notification_text_height" + android:layout_gravity="center_vertical" + android:layout_marginTop="0dp" + /> + </com.android.internal.widget.NotificationVanishingFrameLayout> <include layout="@layout/notification_template_progress" |