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

Commit d888fe44 authored by Shan Huang's avatar Shan Huang Committed by Android (Google) Code Review
Browse files

Merge "[DO NOT MERGE] Separate Region Sampling Instance" into tm-qpr-dev

parents b7408e13 03718764
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -128,6 +128,13 @@ public class RegionSamplingHelper implements View.OnAttachStateChangeListener,
        mCallback = samplingCallback;
    }

    /**
     * Make callback accessible
     */
    @VisibleForTesting
    public SamplingCallback getCallback() {
        return mCallback;
    }
    private void onDraw() {
        if (mWaitingOnDraw) {
            mWaitingOnDraw = false;
+10 −0
Original line number Diff line number Diff line
package com.android.systemui.shared.regionsampling

/**
 * Enum for whether clock region is dark or light.
 */
enum class RegionDarkness(val isDark: Boolean) {
    DEFAULT(false),
    DARK(true),
    LIGHT(false)
}
+116 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2022 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.shared.regionsampling

import android.graphics.Rect
import android.view.View
import androidx.annotation.VisibleForTesting
import com.android.systemui.shared.navigationbar.RegionSamplingHelper
import com.android.systemui.shared.navigationbar.RegionSamplingHelper.SamplingCallback
import java.io.PrintWriter
import java.util.concurrent.Executor

/**
 * Class for instance of RegionSamplingHelper
 */
open class RegionSamplingInstance(
        sampledView: View?,
        mainExecutor: Executor?,
        bgExecutor: Executor?,
        regionSamplingEnabled: Boolean,
        updateFun: UpdateColorCallback
) {
    private var isDark = RegionDarkness.DEFAULT
    private var samplingBounds = Rect()
    @VisibleForTesting var regionSampler: RegionSamplingHelper? = null

    /**
     * Interface for method to be passed into RegionSamplingHelper
     */
    @FunctionalInterface
    interface UpdateColorCallback {
        /**
         * Method to update the text colors after clock darkness changed.
         */
        fun updateColors()
    }

    @VisibleForTesting
    open fun createRegionSamplingHelper(
            sampledView: View,
            callback: SamplingCallback,
            mainExecutor: Executor?,
            bgExecutor: Executor?
    ): RegionSamplingHelper {
        return RegionSamplingHelper(sampledView, callback, mainExecutor, bgExecutor)
    }

    private fun convertToClockDarkness(isRegionDark: Boolean): RegionDarkness {
        return if (isRegionDark) {
            RegionDarkness.DARK
        } else {
            RegionDarkness.LIGHT
        }
    }

    fun currentRegionDarkness(): RegionDarkness {
        return isDark
    }

    /**
     * Start region sampler
     */
    fun startRegionSampler() {
        regionSampler?.start(samplingBounds)
    }

    /**
     * Stop region sampler
     */
    fun stopRegionSampler() {
        regionSampler?.stop()
    }

    /**
     * Dump region sampler
     */
    fun dump(pw: PrintWriter) {
        regionSampler?.dump(pw)
    }

    init {
        if (regionSamplingEnabled && sampledView != null) {
            regionSampler = createRegionSamplingHelper(sampledView,
                    object : SamplingCallback {
                        override fun onRegionDarknessChanged(isRegionDark: Boolean) {
                            isDark = convertToClockDarkness(isRegionDark)
                            updateFun.updateColors()
                        }

                        override fun getSampledRegion(sampledView: View): Rect {
                            samplingBounds = Rect(sampledView.left, sampledView.top,
                                    sampledView.right, sampledView.bottom)
                            return samplingBounds
                        }

                        override fun isSamplingEnabled(): Boolean {
                            return regionSamplingEnabled
                        }
                    }, mainExecutor, bgExecutor)
        }
        regionSampler?.setWindowVisible(true)
    }
}
+113 −0
Original line number Diff line number Diff line
package com.android.systemui.shared.regionsampling

import android.graphics.Rect
import android.testing.AndroidTestingRunner
import android.view.View
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.shared.navigationbar.RegionSamplingHelper
import java.io.PrintWriter
import java.util.concurrent.Executor
import org.junit.Assert
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mock
import org.mockito.Mockito.clearInvocations
import org.mockito.Mockito.verify
import org.mockito.Mockito.`when` as whenever
import org.mockito.junit.MockitoJUnit

@RunWith(AndroidTestingRunner::class)
@SmallTest
class RegionSamplingInstanceTest : SysuiTestCase() {

    @JvmField @Rule
    val mockito = MockitoJUnit.rule()

    @Mock private lateinit var sampledView: View
    @Mock private lateinit var mainExecutor: Executor
    @Mock private lateinit var bgExecutor: Executor
    @Mock private lateinit var regionSampler: RegionSamplingHelper
    @Mock private lateinit var updateFun: RegionSamplingInstance.UpdateColorCallback
    @Mock private lateinit var pw: PrintWriter
    @Mock private lateinit var callback: RegionSamplingHelper.SamplingCallback

    private lateinit var regionSamplingInstance: RegionSamplingInstance

    @Before
    fun setUp() {
        whenever(sampledView.isAttachedToWindow).thenReturn(true)
        whenever(regionSampler.callback).thenReturn(this@RegionSamplingInstanceTest.callback)

        regionSamplingInstance = object : RegionSamplingInstance(
                sampledView,
                mainExecutor,
                bgExecutor,
                true,
                updateFun
        ) {
            override fun createRegionSamplingHelper(
                    sampledView: View,
                    callback: RegionSamplingHelper.SamplingCallback,
                    mainExecutor: Executor?,
                    bgExecutor: Executor?
            ): RegionSamplingHelper {
                return this@RegionSamplingInstanceTest.regionSampler
            }
        }
    }

    @Test
    fun testStartRegionSampler() {
        regionSamplingInstance.startRegionSampler()

        verify(regionSampler).start(Rect(0, 0, 0, 0))
    }

    @Test
    fun testStopRegionSampler() {
        regionSamplingInstance.stopRegionSampler()

        verify(regionSampler).stop()
    }

    @Test
    fun testDump() {
        regionSamplingInstance.dump(pw)

        verify(regionSampler).dump(pw)
    }

    @Test
    fun testUpdateColorCallback() {
        regionSampler.callback.onRegionDarknessChanged(false)
        verify(regionSampler.callback).onRegionDarknessChanged(false)
        clearInvocations(regionSampler.callback)
        regionSampler.callback.onRegionDarknessChanged(true)
        verify(regionSampler.callback).onRegionDarknessChanged(true)
    }

    @Test
    fun testFlagFalse() {
        regionSamplingInstance = object : RegionSamplingInstance(
                sampledView,
                mainExecutor,
                bgExecutor,
                false,
                updateFun
        ) {
            override fun createRegionSamplingHelper(
                    sampledView: View,
                    callback: RegionSamplingHelper.SamplingCallback,
                    mainExecutor: Executor?,
                    bgExecutor: Executor?
            ): RegionSamplingHelper {
                return this@RegionSamplingInstanceTest.regionSampler
            }
        }

        Assert.assertEquals(regionSamplingInstance.regionSampler, null)
    }
}