Loading core/java/android/app/Notification.java +5 −0 Original line number Diff line number Diff line Loading @@ -8243,6 +8243,7 @@ public class Notification implements Parcelable private void buildIntoRemoteViewContent(RemoteViews remoteViews, RemoteViews customContent, TemplateBindResult result) { int childIndex = -1; if (customContent != null) { // Need to clone customContent before adding, because otherwise it can no longer be // parceled independently of remoteViews. Loading @@ -8250,7 +8251,11 @@ public class Notification implements Parcelable remoteViews.removeAllViewsExceptId(R.id.notification_main_column, R.id.progress); remoteViews.addView(R.id.notification_main_column, customContent, 0 /* index */); remoteViews.addFlags(RemoteViews.FLAG_REAPPLY_DISALLOWED); childIndex = 0; } remoteViews.setIntTag(R.id.notification_main_column, com.android.internal.R.id.notification_custom_view_index_tag, childIndex); // also update the end margin if there is an image Resources resources = mBuilder.mContext.getResources(); int endMargin = resources.getDimensionPixelSize( Loading core/res/res/values/ids.xml +3 −0 Original line number Diff line number Diff line Loading @@ -193,4 +193,7 @@ <!-- A tag used to save the notification action object --> <item type="id" name="notification_action_index_tag" /> <!-- A tag used to save the index where the custom view is stored --> <item type="id" name="notification_custom_view_index_tag" /> </resources> core/res/res/values/symbols.xml +1 −0 Original line number Diff line number Diff line Loading @@ -3593,6 +3593,7 @@ <java-symbol type="bool" name="config_useSmsAppService" /> <java-symbol type="id" name="transition_overlay_view_tag" /> <java-symbol type="id" name="notification_custom_view_index_tag" /> <java-symbol type="dimen" name="rounded_corner_radius" /> <java-symbol type="dimen" name="rounded_corner_radius_top" /> Loading packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationCustomViewWrapper.java +13 −39 Original line number Diff line number Diff line Loading @@ -17,12 +17,7 @@ package com.android.systemui.statusbar.notification.row.wrapper; import android.content.Context; import android.content.res.Configuration; import android.graphics.Color; import android.graphics.ColorMatrix; import android.graphics.ColorMatrixColorFilter; import android.graphics.Paint; import android.os.Build; import android.view.View; import com.android.internal.graphics.ColorUtils; Loading @@ -49,45 +44,24 @@ public class NotificationCustomViewWrapper extends NotificationViewWrapper { } @Override public void onReinflated() { super.onReinflated(); Configuration configuration = mView.getResources().getConfiguration(); boolean nightMode = (configuration.uiMode & Configuration.UI_MODE_NIGHT_MASK) == Configuration.UI_MODE_NIGHT_YES; float[] hsl = new float[] {0f, 0f, 0f}; ColorUtils.colorToHSL(mBackgroundColor, hsl); boolean backgroundIsDark = Color.alpha(mBackgroundColor) == 0 || hsl[1] == 0 && hsl[2] < 0.5; boolean backgroundHasColor = hsl[1] > 0; public void onContentUpdated(ExpandableNotificationRow row) { super.onContentUpdated(row); // Let's invert the notification colors when we're in night mode and // the notification background isn't colorized. if (!backgroundIsDark && !backgroundHasColor && nightMode && mRow.getEntry().targetSdk < Build.VERSION_CODES.Q) { Paint paint = new Paint(); ColorMatrix matrix = new ColorMatrix(); ColorMatrix tmp = new ColorMatrix(); // Inversion should happen on Y'UV space to conseve the colors and // only affect the luminosity. matrix.setRGB2YUV(); tmp.set(new float[]{ -1f, 0f, 0f, 0f, 255f, 0f, 1f, 0f, 0f, 0f, 0f, 0f, 1f, 0f, 0f, 0f, 0f, 0f, 1f, 0f }); matrix.postConcat(tmp); tmp.setYUV2RGB(); matrix.postConcat(tmp); paint.setColorFilter(new ColorMatrixColorFilter(matrix)); mView.setLayerType(View.LAYER_TYPE_HARDWARE, paint); if (needsInversion(mBackgroundColor, mView)) { invertViewLuminosity(mView); // Also invert background color if necessary // (Otherwise we'd end-up with white on white.) float[] hsl = new float[] {0f, 0f, 0f}; ColorUtils.colorToHSL(mBackgroundColor, hsl); if (mBackgroundColor != Color.TRANSPARENT && hsl[2] > 0.5) { hsl[2] = 1f - hsl[2]; mBackgroundColor = ColorUtils.HSLToColor(hsl); } } } @Override protected boolean shouldClearBackgroundOnReapply() { Loading packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationDecoratedCustomViewWrapper.java 0 → 100644 +51 −0 Original line number Diff line number Diff line /* * Copyright (C) 2019 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.systemui.statusbar.notification.row.wrapper; import android.content.Context; import android.view.View; import android.view.ViewGroup; import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow; /** * Wraps a notification containing a decorated custom view. */ public class NotificationDecoratedCustomViewWrapper extends NotificationTemplateViewWrapper { private View mWrappedView = null; protected NotificationDecoratedCustomViewWrapper(Context ctx, View view, ExpandableNotificationRow row) { super(ctx, view, row); } @Override public void onContentUpdated(ExpandableNotificationRow row) { ViewGroup container = mView.findViewById( com.android.internal.R.id.notification_main_column); Integer childIndex = (Integer) container.getTag( com.android.internal.R.id.notification_custom_view_index_tag); if (childIndex != null && childIndex != -1) { mWrappedView = container.getChildAt(childIndex); } if (needsInversion(resolveBackgroundColor(), mWrappedView)) { invertViewLuminosity(mWrappedView); } super.onContentUpdated(row); } } Loading
core/java/android/app/Notification.java +5 −0 Original line number Diff line number Diff line Loading @@ -8243,6 +8243,7 @@ public class Notification implements Parcelable private void buildIntoRemoteViewContent(RemoteViews remoteViews, RemoteViews customContent, TemplateBindResult result) { int childIndex = -1; if (customContent != null) { // Need to clone customContent before adding, because otherwise it can no longer be // parceled independently of remoteViews. Loading @@ -8250,7 +8251,11 @@ public class Notification implements Parcelable remoteViews.removeAllViewsExceptId(R.id.notification_main_column, R.id.progress); remoteViews.addView(R.id.notification_main_column, customContent, 0 /* index */); remoteViews.addFlags(RemoteViews.FLAG_REAPPLY_DISALLOWED); childIndex = 0; } remoteViews.setIntTag(R.id.notification_main_column, com.android.internal.R.id.notification_custom_view_index_tag, childIndex); // also update the end margin if there is an image Resources resources = mBuilder.mContext.getResources(); int endMargin = resources.getDimensionPixelSize( Loading
core/res/res/values/ids.xml +3 −0 Original line number Diff line number Diff line Loading @@ -193,4 +193,7 @@ <!-- A tag used to save the notification action object --> <item type="id" name="notification_action_index_tag" /> <!-- A tag used to save the index where the custom view is stored --> <item type="id" name="notification_custom_view_index_tag" /> </resources>
core/res/res/values/symbols.xml +1 −0 Original line number Diff line number Diff line Loading @@ -3593,6 +3593,7 @@ <java-symbol type="bool" name="config_useSmsAppService" /> <java-symbol type="id" name="transition_overlay_view_tag" /> <java-symbol type="id" name="notification_custom_view_index_tag" /> <java-symbol type="dimen" name="rounded_corner_radius" /> <java-symbol type="dimen" name="rounded_corner_radius_top" /> Loading
packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationCustomViewWrapper.java +13 −39 Original line number Diff line number Diff line Loading @@ -17,12 +17,7 @@ package com.android.systemui.statusbar.notification.row.wrapper; import android.content.Context; import android.content.res.Configuration; import android.graphics.Color; import android.graphics.ColorMatrix; import android.graphics.ColorMatrixColorFilter; import android.graphics.Paint; import android.os.Build; import android.view.View; import com.android.internal.graphics.ColorUtils; Loading @@ -49,45 +44,24 @@ public class NotificationCustomViewWrapper extends NotificationViewWrapper { } @Override public void onReinflated() { super.onReinflated(); Configuration configuration = mView.getResources().getConfiguration(); boolean nightMode = (configuration.uiMode & Configuration.UI_MODE_NIGHT_MASK) == Configuration.UI_MODE_NIGHT_YES; float[] hsl = new float[] {0f, 0f, 0f}; ColorUtils.colorToHSL(mBackgroundColor, hsl); boolean backgroundIsDark = Color.alpha(mBackgroundColor) == 0 || hsl[1] == 0 && hsl[2] < 0.5; boolean backgroundHasColor = hsl[1] > 0; public void onContentUpdated(ExpandableNotificationRow row) { super.onContentUpdated(row); // Let's invert the notification colors when we're in night mode and // the notification background isn't colorized. if (!backgroundIsDark && !backgroundHasColor && nightMode && mRow.getEntry().targetSdk < Build.VERSION_CODES.Q) { Paint paint = new Paint(); ColorMatrix matrix = new ColorMatrix(); ColorMatrix tmp = new ColorMatrix(); // Inversion should happen on Y'UV space to conseve the colors and // only affect the luminosity. matrix.setRGB2YUV(); tmp.set(new float[]{ -1f, 0f, 0f, 0f, 255f, 0f, 1f, 0f, 0f, 0f, 0f, 0f, 1f, 0f, 0f, 0f, 0f, 0f, 1f, 0f }); matrix.postConcat(tmp); tmp.setYUV2RGB(); matrix.postConcat(tmp); paint.setColorFilter(new ColorMatrixColorFilter(matrix)); mView.setLayerType(View.LAYER_TYPE_HARDWARE, paint); if (needsInversion(mBackgroundColor, mView)) { invertViewLuminosity(mView); // Also invert background color if necessary // (Otherwise we'd end-up with white on white.) float[] hsl = new float[] {0f, 0f, 0f}; ColorUtils.colorToHSL(mBackgroundColor, hsl); if (mBackgroundColor != Color.TRANSPARENT && hsl[2] > 0.5) { hsl[2] = 1f - hsl[2]; mBackgroundColor = ColorUtils.HSLToColor(hsl); } } } @Override protected boolean shouldClearBackgroundOnReapply() { Loading
packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationDecoratedCustomViewWrapper.java 0 → 100644 +51 −0 Original line number Diff line number Diff line /* * Copyright (C) 2019 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.systemui.statusbar.notification.row.wrapper; import android.content.Context; import android.view.View; import android.view.ViewGroup; import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow; /** * Wraps a notification containing a decorated custom view. */ public class NotificationDecoratedCustomViewWrapper extends NotificationTemplateViewWrapper { private View mWrappedView = null; protected NotificationDecoratedCustomViewWrapper(Context ctx, View view, ExpandableNotificationRow row) { super(ctx, view, row); } @Override public void onContentUpdated(ExpandableNotificationRow row) { ViewGroup container = mView.findViewById( com.android.internal.R.id.notification_main_column); Integer childIndex = (Integer) container.getTag( com.android.internal.R.id.notification_custom_view_index_tag); if (childIndex != null && childIndex != -1) { mWrappedView = container.getChildAt(childIndex); } if (needsInversion(resolveBackgroundColor(), mWrappedView)) { invertViewLuminosity(mWrappedView); } super.onContentUpdated(row); } }