Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ad51fe08 authored by Ioana Alexandru's avatar Ioana Alexandru
Browse files

[Notif redesign] Update large icon spacing

In the new design, there should be 16dp of space between the content and
the right icon, and 8dp between the icon and the expander pill. That
means that we need to update the icon margins and dynamically adjust the
padding of the expand button.

This also fixes the long-standing issue of the icon moving around when a
notification is expanded/collapsed.

Note that notification_2025_right_icon is a fork of
notification_template_right_icon.

Bug: 378660052
Test: screenshot tests
Flag: android.app.notifications_redesign_templates
Change-Id: I716ece1a4a42406f4bfd1dd3ce0bf55e8d084db4
parent b7c53bb9
Loading
Loading
Loading
Loading
+39 −9
Original line number Diff line number Diff line
@@ -6144,6 +6144,20 @@ public class Notification implements Parcelable
                result.mTitleMarginSet.applyToView(contentView, p.mTextViewId);
                contentView.setInt(p.mTextViewId, "setNumIndentLines", p.hasTitle() ? 0 : 1);
            }
            // The expand button uses paddings rather than margins, so we'll adjust it
            // separately.
            adjustExpandButtonPadding(contentView, result.mRightIconVisible);
        }
        private void adjustExpandButtonPadding(RemoteViews contentView, boolean rightIconVisible) {
            if (notificationsRedesignTemplates()) {
                final Resources res = mContext.getResources();
                int normalPadding = res.getDimensionPixelSize(R.dimen.notification_2025_margin);
                int iconSpacing = res.getDimensionPixelSize(
                        R.dimen.notification_2025_expand_button_right_icon_spacing);
                contentView.setInt(R.id.expand_button, "setStartPadding",
                        rightIconVisible ? iconSpacing : normalPadding);
            }
        }
        // This code is executed on behalf of other apps' notifications, sometimes even by 3p apps,
@@ -6155,12 +6169,21 @@ public class Notification implements Parcelable
                @NonNull TemplateBindResult result) {
            final Resources resources = mContext.getResources();
            final float density = resources.getDisplayMetrics().density;
            final float iconMarginDp = resources.getDimension(
                    R.dimen.notification_right_icon_content_margin) / density;
            int iconMarginId = notificationsRedesignTemplates()
                    ? R.dimen.notification_2025_right_icon_content_margin
                    : R.dimen.notification_right_icon_content_margin;
            final float iconMarginDp = resources.getDimension(iconMarginId) / density;
            final float contentMarginDp = resources.getDimension(
                    R.dimen.notification_content_margin_end) / density;
            final float expanderSizeDp = resources.getDimension(
            float spaceForExpanderDp;
            if (notificationsRedesignTemplates()) {
                spaceForExpanderDp = resources.getDimension(
                        R.dimen.notification_2025_right_icon_expanded_margin_end) / density
                        - contentMarginDp;
            } else {
                spaceForExpanderDp = resources.getDimension(
                        R.dimen.notification_header_expand_icon_size) / density - contentMarginDp;
            }
            final float viewHeightDp = resources.getDimension(
                    R.dimen.notification_right_icon_size) / density;
            float viewWidthDp = viewHeightDp;  // icons are 1:1 by default
@@ -6177,9 +6200,10 @@ public class Notification implements Parcelable
                    }
                }
            }
            // Margin needed for the header to accommodate the icon when shown
            final float extraMarginEndDpIfVisible = viewWidthDp + iconMarginDp;
            result.setRightIconState(rightIcon != null /* visible */, viewWidthDp,
                    viewHeightDp, extraMarginEndDpIfVisible, expanderSizeDp);
                    viewHeightDp, extraMarginEndDpIfVisible, spaceForExpanderDp);
        }
        /**
@@ -14659,13 +14683,19 @@ public class Notification implements Parcelable
        public final MarginSet mTitleMarginSet = new MarginSet();
        public void setRightIconState(boolean visible, float widthDp, float heightDp,
                float marginEndDpIfVisible, float expanderSizeDp) {
                float marginEndDpIfVisible, float spaceForExpanderDp) {
            mRightIconVisible = visible;
            mRightIconWidthDp = widthDp;
            mRightIconHeightDp = heightDp;
            mHeadingExtraMarginSet.setValues(0, marginEndDpIfVisible);
            mHeadingFullMarginSet.setValues(expanderSizeDp, marginEndDpIfVisible + expanderSizeDp);
            mTitleMarginSet.setValues(0, marginEndDpIfVisible + expanderSizeDp);
            mHeadingExtraMarginSet.setValues(
                    /* valueIfGone = */ 0,
                    /* valueIfVisible = */ marginEndDpIfVisible);
            mHeadingFullMarginSet.setValues(
                    /* valueIfGone = */ spaceForExpanderDp,
                    /* valueIfVisible = */ marginEndDpIfVisible + spaceForExpanderDp);
            mTitleMarginSet.setValues(
                    /* valueIfGone = */ 0,
                    /* valueIfVisible = */ marginEndDpIfVisible + spaceForExpanderDp);
        }
        /**
+10 −0
Original line number Diff line number Diff line
@@ -129,6 +129,16 @@ public class NotificationExpandButton extends FrameLayout {
        updateExpandedState();
    }

    /**
     * Adjust the padding at the start of the view based on the layout direction (RTL/LTR).
     * This is needed because RemoteViews don't have an equivalent for
     * {@link this#setPaddingRelative}.
     */
    @RemotableViewMethod
    public void setStartPadding(int startPadding) {
        setPaddingRelative(startPadding, getPaddingTop(), getPaddingEnd(), getPaddingBottom());
    }

    private void updateExpandedState() {
        int drawableId;
        int contentDescriptionId;
+1 −0
Original line number Diff line number Diff line
@@ -15,6 +15,7 @@
  -->

<!-- extends FrameLayout -->
<!-- Note: The button's padding may be dynamically adjusted in code -->
<com.android.internal.widget.NotificationExpandButton
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/expand_button"
+31 −0
Original line number Diff line number Diff line
<?xml version="1.0" encoding="utf-8"?><!--
  ~ Copyright (C) 2025 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
  -->
<!-- Large icon to be used in expanded notification layouts. -->
<com.android.internal.widget.CachingIconView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/right_icon"
    android:layout_width="@dimen/notification_right_icon_size"
    android:layout_height="@dimen/notification_right_icon_size"
    android:layout_gravity="top|end"
    android:layout_marginEnd="@dimen/notification_2025_right_icon_expanded_margin_end"
    android:layout_marginVertical="@dimen/notification_2025_right_icon_vertical_margin"
    android:background="@drawable/notification_large_icon_outline"
    android:clipToOutline="true"
    android:importantForAccessibility="no"
    android:scaleType="centerCrop"
    android:maxDrawableWidth="@dimen/notification_right_icon_size"
    android:maxDrawableHeight="@dimen/notification_right_icon_size"
    />
+2 −3
Original line number Diff line number Diff line
@@ -146,9 +146,8 @@
            android:layout_width="@dimen/notification_right_icon_size"
            android:layout_height="@dimen/notification_right_icon_size"
            android:layout_gravity="center_vertical|end"
            android:layout_marginTop="@dimen/notification_right_icon_headerless_margin"
            android:layout_marginBottom="@dimen/notification_right_icon_headerless_margin"
            android:layout_marginStart="@dimen/notification_right_icon_content_margin"
            android:layout_marginVertical="@dimen/notification_2025_right_icon_vertical_margin"
            android:layout_marginStart="@dimen/notification_2025_right_icon_content_margin"
            android:background="@drawable/notification_large_icon_outline"
            android:clipToOutline="true"
            android:importantForAccessibility="no"
Loading