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

Commit 6cfa5cd3 authored by Lucas Dupin's avatar Lucas Dupin
Browse files

Fix contrast exception

Fixes: 124378093
Test: atest NotificationViewWrapperTest
Change-Id: Ie232e14fb4aed8b6a387c9ca4bd766e9d3f3a900
parent 93d196b3
Loading
Loading
Loading
Loading
+15 −5
Original line number Original line Diff line number Diff line
@@ -26,12 +26,15 @@ import android.graphics.ColorMatrixColorFilter;
import android.graphics.Paint;
import android.graphics.Paint;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.view.NotificationHeaderView;
import android.view.NotificationHeaderView;
import android.view.View;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.TextView;


import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.graphics.ColorUtils;
import com.android.internal.graphics.ColorUtils;
import com.android.internal.util.ContrastColorUtil;
import com.android.systemui.statusbar.CrossFadeHelper;
import com.android.systemui.statusbar.CrossFadeHelper;
import com.android.systemui.statusbar.TransformableView;
import com.android.systemui.statusbar.TransformableView;
import com.android.systemui.statusbar.notification.TransformState;
import com.android.systemui.statusbar.notification.TransformState;
@@ -108,6 +111,11 @@ public abstract class NotificationViewWrapper implements TransformableView {
            return false;
            return false;
        }
        }


        // Apps targeting Q should fix their dark mode bugs.
        if (mRow.getEntry().targetSdk >= Build.VERSION_CODES.Q) {
            return false;
        }

        int background = getBackgroundColor(view);
        int background = getBackgroundColor(view);
        if (background == Color.TRANSPARENT) {
        if (background == Color.TRANSPARENT) {
            background = defaultBackgroundColor;
            background = defaultBackgroundColor;
@@ -138,17 +146,19 @@ public abstract class NotificationViewWrapper implements TransformableView {
        }
        }
    }
    }


    private boolean childrenNeedInversion(@ColorInt int parentBackground, ViewGroup viewGroup) {
    @VisibleForTesting
    boolean childrenNeedInversion(@ColorInt int parentBackground, ViewGroup viewGroup) {
        if (viewGroup == null) {
        if (viewGroup == null) {
            return false;
            return false;
        }
        }


        for (int i = 0; i < viewGroup.getChildCount(); i++) {
            View child = viewGroup.getChildAt(i);
        int backgroundColor = getBackgroundColor(viewGroup);
        int backgroundColor = getBackgroundColor(viewGroup);
            if (backgroundColor == Color.TRANSPARENT) {
        if (Color.alpha(backgroundColor) != 255) {
                backgroundColor = parentBackground;
            backgroundColor = ContrastColorUtil.compositeColors(backgroundColor, parentBackground);
            backgroundColor = ColorUtils.setAlphaComponent(backgroundColor, 255);
        }
        }
        for (int i = 0; i < viewGroup.getChildCount(); i++) {
            View child = viewGroup.getChildAt(i);
            if (child instanceof TextView) {
            if (child instanceof TextView) {
                int foreground = ((TextView) child).getCurrentTextColor();
                int foreground = ((TextView) child).getCurrentTextColor();
                if (ColorUtils.calculateContrast(foreground, backgroundColor) < 3) {
                if (ColorUtils.calculateContrast(foreground, backgroundColor) < 3) {
+25 −7
Original line number Original line Diff line number Diff line
@@ -14,7 +14,9 @@
 * limitations under the License.
 * limitations under the License.
 */
 */


package com.android.systemui.statusbar.notification;
package com.android.systemui.statusbar.notification.row.wrapper;

import static org.mockito.Mockito.mock;


import android.content.Context;
import android.content.Context;
import android.support.test.filters.SmallTest;
import android.support.test.filters.SmallTest;
@@ -22,13 +24,15 @@ import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
import android.testing.TestableLooper.RunWithLooper;
import android.view.View;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;


import com.android.systemui.SysuiTestCase;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.NotificationTestHelper;
import com.android.systemui.statusbar.NotificationTestHelper;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.notification.row.wrapper.NotificationViewWrapper;
import com.android.systemui.util.Assert;
import com.android.systemui.util.Assert;


import org.junit.Before;
import org.junit.Test;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runner.RunWith;


@@ -37,12 +41,26 @@ import org.junit.runner.RunWith;
@RunWithLooper
@RunWithLooper
public class NotificationViewWrapperTest extends SysuiTestCase {
public class NotificationViewWrapperTest extends SysuiTestCase {


    @Test
    private View mView;
    public void constructor_doesntUseViewContext() throws Exception {
    private ExpandableNotificationRow mRow;
    private TestableNotificationViewWrapper mNotificationViewWrapper;

    @Before
    public void setup() throws Exception {
        Assert.sMainLooper = TestableLooper.get(this).getLooper();
        Assert.sMainLooper = TestableLooper.get(this).getLooper();
        new TestableNotificationViewWrapper(mContext,
        mView = mock(View.class);
                new View(mContext),
        mRow = new NotificationTestHelper(getContext()).createRow();
                new NotificationTestHelper(getContext()).createRow());
        mNotificationViewWrapper = new TestableNotificationViewWrapper(mContext, mView, mRow);
    }

    @Test
    public void childrenNeedInversion_doesntCrash_whenOpacity() {
        LinearLayout viewGroup = new LinearLayout(mContext);
        TextView textView = new TextView(mContext);
        textView.setTextColor(0xcc000000);
        viewGroup.addView(textView);

        mNotificationViewWrapper.childrenNeedInversion(0xcc000000, viewGroup);
    }
    }


    static class TestableNotificationViewWrapper extends NotificationViewWrapper {
    static class TestableNotificationViewWrapper extends NotificationViewWrapper {