From 019d71ecfcb5f2371260349112831f528a1efe29 Mon Sep 17 00:00:00 2001 From: Selim Cinek Date: Thu, 19 Apr 2018 10:24:39 +0800 Subject: [PATCH] Moved the disabling from alpha to manual color blending The Transformations don't preserve alpha currently and it's hard to fix without the risk of introducing regressions. We instead blend the color manually now. Change-Id: Ib9c209295529c5e04564a3faed74160914951152 Fixes: 77811784 --- ...notification_material_action_tombstone.xml | 2 +- core/res/res/values/dimens.xml | 2 + core/res/res/values/symbols.xml | 1 + .../NotificationTemplateViewWrapper.java | 61 +++++++++++++++---- .../notification/NotificationViewWrapper.java | 9 +++ 5 files changed, 63 insertions(+), 12 deletions(-) diff --git a/core/res/res/layout/notification_material_action_tombstone.xml b/core/res/res/layout/notification_material_action_tombstone.xml index 817f298f0c6f5..9fa7c6a280207 100644 --- a/core/res/res/layout/notification_material_action_tombstone.xml +++ b/core/res/res/layout/notification_material_action_tombstone.xml @@ -27,7 +27,7 @@ android:singleLine="true" android:ellipsize="end" android:textAlignment="viewStart" - android:alpha="0.5" + android:alpha="@dimen/notification_action_disabled_alpha" android:enabled="false" android:background="@drawable/notification_material_action_background" /> diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml index 08e2f455cacf7..c478f8e6b6781 100644 --- a/core/res/res/values/dimens.xml +++ b/core/res/res/values/dimens.xml @@ -615,6 +615,8 @@ 280dp 38dp + + 0.5 208dp diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index e0dfa00f7dbfa..96ac1207195bb 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -2877,6 +2877,7 @@ + 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 9ed5b7fd45743..c9dcc5c688ec5 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationTemplateViewWrapper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationTemplateViewWrapper.java @@ -18,16 +18,20 @@ package com.android.systemui.statusbar.notification; import android.app.PendingIntent; import android.content.Context; +import android.content.res.ColorStateList; import android.graphics.Color; +import android.graphics.PorterDuffColorFilter; import android.graphics.Rect; +import android.graphics.drawable.Drawable; import android.service.notification.StatusBarNotification; import android.util.ArraySet; import android.view.View; +import android.widget.Button; import android.widget.ImageView; import android.widget.ProgressBar; import android.widget.TextView; -import com.android.internal.R; +import com.android.internal.util.NotificationColorUtil; import com.android.internal.widget.NotificationActionListLayout; import com.android.systemui.Dependency; import com.android.systemui.UiOffloadThread; @@ -48,7 +52,7 @@ public class NotificationTemplateViewWrapper extends NotificationHeaderViewWrapp private TextView mTitle; private TextView mText; protected View mActionsContainer; - private View mReplyAction; + private ImageView mReplyAction; private Rect mTmpRect = new Rect(); private int mContentHeight; @@ -151,25 +155,60 @@ public class NotificationTemplateViewWrapper extends NotificationHeaderViewWrapp if (mActions != null) { int numActions = mActions.getChildCount(); for (int i = 0; i < numActions; i++) { - View action = mActions.getChildAt(i); + Button action = (Button) mActions.getChildAt(i); performOnPendingIntentCancellation(action, () -> { - action.setEnabled(false); - // The visual appearance doesn't look disabled enough yet, let's add the - // alpha as well. Selectors unfortunately don't seem to work here. - action.setAlpha(0.5f); + if (action.isEnabled()) { + action.setEnabled(false); + // The visual appearance doesn't look disabled enough yet, let's add the + // alpha as well. Since Alpha doesn't play nicely right now with the + // transformation, we rather blend it manually with the background color. + ColorStateList textColors = action.getTextColors(); + int[] colors = textColors.getColors(); + int[] newColors = new int[colors.length]; + float disabledAlpha = mView.getResources().getFloat( + com.android.internal.R.dimen.notification_action_disabled_alpha); + for (int j = 0; j < colors.length; j++) { + int color = colors[j]; + color = blendColorWithBackground(color, disabledAlpha); + newColors[j] = color; + } + ColorStateList newColorStateList = new ColorStateList( + textColors.getStates(), newColors); + action.setTextColor(newColorStateList); + } }); } } if (mReplyAction != null) { performOnPendingIntentCancellation(mReplyAction, () -> { - mReplyAction.setEnabled(false); - // The visual appearance doesn't look disabled enough yet, let's add the - // alpha as well. Selectors unfortunately don't seem to work here. - mReplyAction.setAlpha(0.5f); + if (mReplyAction != null && mReplyAction.isEnabled()) { + mReplyAction.setEnabled(false); + // The visual appearance doesn't look disabled enough yet, let's add the + // alpha as well. Since Alpha doesn't play nicely right now with the + // transformation, we rather blend it manually with the background color. + Drawable drawable = mReplyAction.getDrawable().mutate(); + PorterDuffColorFilter colorFilter = + (PorterDuffColorFilter) drawable.getColorFilter(); + float disabledAlpha = mView.getResources().getFloat( + com.android.internal.R.dimen.notification_action_disabled_alpha); + if (colorFilter != null) { + int color = colorFilter.getColor(); + color = blendColorWithBackground(color, disabledAlpha); + drawable.mutate().setColorFilter(color, colorFilter.getMode()); + } else { + mReplyAction.setAlpha(disabledAlpha); + } + } }); } } + private int blendColorWithBackground(int color, float alpha) { + // alpha doesn't go well for color filters, so let's blend it manually + return NotificationColorUtil.compositeColors(Color.argb((int) (alpha * 255), + Color.red(color), Color.green(color), Color.blue(color)), resolveBackgroundColor()); + } + private void performOnPendingIntentCancellation(View view, Runnable cancellationRunnable) { PendingIntent pendingIntent = (PendingIntent) view.getTag( com.android.internal.R.id.pending_intent_tag); 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 b09df158072c4..93a9947a3c9b8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationViewWrapper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationViewWrapper.java @@ -175,6 +175,15 @@ public abstract class NotificationViewWrapper implements TransformableView { return mRow.isSummaryWithChildren() ? 0 : mBackgroundColor; } + protected int resolveBackgroundColor() { + int customBackgroundColor = getCustomBackgroundColor(); + if (customBackgroundColor != 0) { + return customBackgroundColor; + } + return mView.getContext().getColor( + com.android.internal.R.color.notification_material_background_color); + } + public void setLegacy(boolean legacy) { }