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

Commit fadfb0bd authored by Caitlin Cassidy's avatar Caitlin Cassidy Committed by Automerger Merge Worker
Browse files

Merge "[Device Controls] For custom icons, keep the tint the icon comes with."...

Merge "[Device Controls] For custom icons, keep the tint the icon comes with." into sc-dev am: 48f51861

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/14589388

Change-Id: I332f67eb102157666ab11945e2117c803335d518
parents d20b62d8 48f51861
Loading
Loading
Loading
Loading
+4 −5
Original line number Diff line number Diff line
@@ -47,6 +47,7 @@ import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.annotation.ColorInt
import androidx.annotation.VisibleForTesting
import com.android.internal.graphics.ColorUtils
import com.android.systemui.R
import com.android.systemui.animation.Interpolators
@@ -454,7 +455,8 @@ class ControlViewHolder(
        }
    }

    private fun updateStatusRow(
    @VisibleForTesting
    internal fun updateStatusRow(
        enabled: Boolean,
        text: CharSequence,
        drawable: Drawable,
@@ -469,11 +471,8 @@ class ControlViewHolder(
        status.setTextColor(color)

        control?.getCustomIcon()?.let {
            // do not tint custom icons, assume the intended icon color is correct
            if (icon.imageTintList != null) {
                icon.imageTintList = null
            }
            icon.setImageIcon(it)
            icon.imageTintList = it.tintList
        } ?: run {
            if (drawable is StateListDrawable) {
                // Only reset the drawable if it is a different resource, as it will interfere
+118 −0
Original line number Diff line number Diff line
/*
 * 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.systemui.controls.ui

import android.app.PendingIntent
import android.content.ComponentName
import android.content.res.ColorStateList
import android.graphics.drawable.GradientDrawable
import android.graphics.drawable.Icon
import android.service.controls.Control
import android.service.controls.DeviceTypes
import android.testing.AndroidTestingRunner
import android.testing.TestableLooper
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.test.filters.SmallTest
import com.android.systemui.R
import com.android.systemui.controls.controller.ControlsController
import com.android.systemui.util.time.FakeSystemClock
import org.junit.runner.RunWith
import com.android.systemui.SysuiTestCase
import com.android.systemui.controls.ControlsMetricsLogger
import com.android.systemui.controls.controller.ControlInfo
import com.android.systemui.util.concurrency.FakeExecutor
import com.google.common.truth.Truth.assertThat
import org.junit.Before
import org.junit.Test
import org.mockito.Mockito.mock

@SmallTest
@RunWith(AndroidTestingRunner::class)
@TestableLooper.RunWithLooper
class ControlViewHolderTest : SysuiTestCase() {

    private val clock = FakeSystemClock()

    private lateinit var cvh: ControlViewHolder

    @Before
    fun setUp() {
        TestableLooper.get(this).runWithLooper {
            val baseLayout = LayoutInflater.from(mContext).inflate(
                    R.layout.controls_base_item, null, false) as ViewGroup

            cvh = ControlViewHolder(
                    baseLayout,
                    mock(ControlsController::class.java),
                    FakeExecutor(clock),
                    FakeExecutor(clock),
                    mock(ControlActionCoordinator::class.java),
                    mock(ControlsMetricsLogger::class.java),
                    uid = 100
            )

            val cws = ControlWithState(
                    ComponentName.createRelative("pkg", "cls"),
                    ControlInfo(
                            CONTROL_ID, CONTROL_TITLE, "subtitle", DeviceTypes.TYPE_AIR_FRESHENER
                    ),
                    Control.StatelessBuilder(CONTROL_ID, mock(PendingIntent::class.java)).build()
            )

            cvh.bindData(cws, isLocked = false)
        }
    }

    @Test
    fun updateStatusRow_customIconWithTint_iconTintRemains() {
        val control = Control.StatelessBuilder(DEFAULT_CONTROL)
                .setCustomIcon(
                        Icon.createWithResource(mContext.resources, R.drawable.ic_emergency_star)
                                .setTint(TINT_COLOR)
                )
                .build()

        cvh.updateStatusRow(enabled = true, CONTROL_TITLE, DRAWABLE, COLOR, control)

        assertThat(cvh.icon.imageTintList).isEqualTo(ColorStateList.valueOf(TINT_COLOR))
    }

    @Test
    fun updateStatusRow_customIconWithTintList_iconTintListRemains() {
        val customIconTintList = ColorStateList.valueOf(TINT_COLOR)
        val control = Control.StatelessBuilder(CONTROL_ID, mock(PendingIntent::class.java))
                .setCustomIcon(
                        Icon.createWithResource(mContext.resources, R.drawable.ic_emergency_star)
                                .setTintList(customIconTintList)
                )
                .build()

        cvh.updateStatusRow(enabled = true, CONTROL_TITLE, DRAWABLE, COLOR, control)

        assertThat(cvh.icon.imageTintList).isEqualTo(customIconTintList)
    }
}

private const val CONTROL_ID = "CONTROL_ID"
private const val CONTROL_TITLE = "CONTROL_TITLE"
private const val TINT_COLOR = 0x00ff00 // Should be different from [COLOR]

private val DRAWABLE = GradientDrawable()
private val COLOR = ColorStateList.valueOf(0xffff00)
private val DEFAULT_CONTROL = Control.StatelessBuilder(
        CONTROL_ID, mock(PendingIntent::class.java)).build()
 No newline at end of file