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

Commit 4a7bc9b2 authored by Chris Göllner's avatar Chris Göllner Committed by Android (Google) Code Review
Browse files

Merge changes I95df38a8,I6461a6d9,Ic6e3179a,I0d2e5340 into main

* changes:
  Prepare FaceScanningProviderFactory for multiple displays
  Prepare SysUICutoutProvider and CameraProtectionLoader for multi display
  Prepare SystemEventChipAnimationController for multi display
  Format SystemEventChipAnimationController
parents 128104b9 547b29d6
Loading
Loading
Loading
Loading
+6 −12
Original line number Diff line number Diff line
@@ -30,7 +30,6 @@ import com.android.systemui.animation.AnimatorTestRule
import com.android.systemui.statusbar.phone.StatusBarContentInsetsChangedListener
import com.android.systemui.statusbar.phone.StatusBarContentInsetsProvider
import com.android.systemui.statusbar.window.StatusBarWindowController
import com.android.systemui.statusbar.window.StatusBarWindowControllerStore
import com.android.systemui.util.mockito.any
import com.android.systemui.util.mockito.argumentCaptor
import com.android.systemui.util.mockito.capture
@@ -50,11 +49,10 @@ import org.mockito.MockitoAnnotations
@RunWith(AndroidJUnit4::class)
@TestableLooper.RunWithLooper
class SystemEventChipAnimationControllerTest : SysuiTestCase() {
    private lateinit var controller: SystemEventChipAnimationController
    private lateinit var controller: SystemEventChipAnimationControllerImpl

    @get:Rule val animatorTestRule = AnimatorTestRule(this)
    @Mock private lateinit var sbWindowController: StatusBarWindowController
    @Mock private lateinit var sbWindowControllerStore: StatusBarWindowControllerStore
    @Mock private lateinit var insetsProvider: StatusBarContentInsetsProvider

    private var testView = TestView(mContext)
@@ -63,7 +61,6 @@ class SystemEventChipAnimationControllerTest : SysuiTestCase() {
    @Before
    fun setup() {
        MockitoAnnotations.initMocks(this)
        whenever(sbWindowControllerStore.defaultDisplay).thenReturn(sbWindowController)
        // StatusBarWindowController is mocked. The addViewToWindow function needs to be mocked to
        // ensure that the chip view is added to a parent view
        whenever(sbWindowController.addViewToWindow(any(), any())).then {
@@ -76,7 +73,7 @@ class SystemEventChipAnimationControllerTest : SysuiTestCase() {
            )
            statusbarFake.addView(
                it.arguments[0] as View,
                it.arguments[1] as FrameLayout.LayoutParams
                it.arguments[1] as FrameLayout.LayoutParams,
            )
        }

@@ -86,16 +83,16 @@ class SystemEventChipAnimationControllerTest : SysuiTestCase() {
                    /* left= */ insets,
                    /* top= */ insets,
                    /* right= */ insets,
                    /* bottom= */ 0
                    /* bottom= */ 0,
                )
            )
        whenever(insetsProvider.getStatusBarContentAreaForCurrentRotation())
            .thenReturn(portraitArea)

        controller =
            SystemEventChipAnimationController(
            SystemEventChipAnimationControllerImpl(
                context = mContext,
                statusBarWindowControllerStore = sbWindowControllerStore,
                statusBarWindowController = sbWindowController,
                contentInsetsProvider = insetsProvider,
            )
    }
@@ -156,10 +153,7 @@ class SystemEventChipAnimationControllerTest : SysuiTestCase() {
            val lp = it.arguments[1] as FrameLayout.LayoutParams
            assertThat(lp.gravity and Gravity.VERTICAL_GRAVITY_MASK).isEqualTo(Gravity.TOP)

            statusbarFake.addView(
                it.arguments[0] as View,
                lp,
            )
            statusbarFake.addView(it.arguments[0] as View, lp)
        }

        // GIVEN insets provider gives the correct content area
+13 −5
Original line number Diff line number Diff line
@@ -22,15 +22,18 @@ import android.graphics.Rect
import android.graphics.RectF
import android.util.PathParser
import com.android.systemui.res.R
import javax.inject.Inject
import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import kotlin.math.roundToInt

interface CameraProtectionLoader {
    fun loadCameraProtectionInfoList(): List<CameraProtectionInfo>
}

class CameraProtectionLoaderImpl @Inject constructor(private val context: Context) :
    CameraProtectionLoader {
class CameraProtectionLoaderImpl
@AssistedInject
constructor(@Assisted private val context: Context) : CameraProtectionLoader {

    override fun loadCameraProtectionInfoList(): List<CameraProtectionInfo> {
        val list = mutableListOf<CameraProtectionInfo>()
@@ -76,7 +79,7 @@ class CameraProtectionLoaderImpl @Inject constructor(private val context: Contex
                computed.left.roundToInt(),
                computed.top.roundToInt(),
                computed.right.roundToInt(),
                computed.bottom.roundToInt()
                computed.bottom.roundToInt(),
            )
        val displayUniqueId = context.getString(displayUniqueIdRes)
        return CameraProtectionInfo(
@@ -84,7 +87,7 @@ class CameraProtectionLoaderImpl @Inject constructor(private val context: Contex
            physicalCameraId,
            protectionPath,
            protectionBounds,
            displayUniqueId
            displayUniqueId,
        )
    }

@@ -95,4 +98,9 @@ class CameraProtectionLoaderImpl @Inject constructor(private val context: Contex
            throw IllegalArgumentException("Invalid protection path", e)
        }
    }

    @AssistedFactory
    interface Factory {
        fun create(context: Context): CameraProtectionLoaderImpl
    }
}
+12 −3
Original line number Diff line number Diff line
@@ -16,11 +16,20 @@

package com.android.systemui

import dagger.Binds
import android.content.Context
import com.android.systemui.dagger.SysUISingleton
import dagger.Module
import dagger.Provides

@Module
interface CameraProtectionModule {
object CameraProtectionModule {

    @Binds fun cameraProtectionLoaderImpl(impl: CameraProtectionLoaderImpl): CameraProtectionLoader
    @Provides
    @SysUISingleton
    fun cameraProtectionLoader(
        factory: CameraProtectionLoaderImpl.Factory,
        context: Context,
    ): CameraProtectionLoader {
        return factory.create(context)
    }
}
+16 −0
Original line number Diff line number Diff line
@@ -16,9 +16,14 @@

package com.android.systemui

import android.content.Context
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.decor.FaceScanningProviderFactory
import com.android.systemui.decor.FaceScanningProviderFactoryImpl
import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener
import dagger.Binds
import dagger.Module
import dagger.Provides
import dagger.multibindings.ClassKey
import dagger.multibindings.IntoMap
import dagger.multibindings.IntoSet
@@ -35,4 +40,15 @@ interface ScreenDecorationsModule {
    @Binds
    @IntoSet
    fun bindScreenDecorationsConfigListener(impl: ScreenDecorations): ConfigurationListener

    companion object {
        @Provides
        @SysUISingleton
        fun faceScanningProviderFactory(
            creator: FaceScanningProviderFactoryImpl.Creator,
            context: Context,
        ): FaceScanningProviderFactory {
            return creator.create(context)
        }
    }
}
+28 −15
Original line number Diff line number Diff line
@@ -21,21 +21,12 @@ import android.graphics.Rect
import android.util.RotationUtils
import android.view.Display
import android.view.DisplayCutout
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.display.naturalBounds
import javax.inject.Inject
import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject

@SysUISingleton
class SysUICutoutProvider
@Inject
constructor(
    private val context: Context,
    private val cameraProtectionLoader: CameraProtectionLoader,
) {

    private val cameraProtectionList by lazy {
        cameraProtectionLoader.loadCameraProtectionInfoList()
    }
interface SysUICutoutProvider {

    /**
     * Returns the [SysUICutoutInformation] for the current display and the current rotation.
@@ -43,7 +34,21 @@ constructor(
     * This means that the bounds of the display cutout and the camera protection will be
     * adjusted/rotated for the current rotation.
     */
    fun cutoutInfoForCurrentDisplayAndRotation(): SysUICutoutInformation? {
    fun cutoutInfoForCurrentDisplayAndRotation(): SysUICutoutInformation?
}

class SysUICutoutProviderImpl
@AssistedInject
constructor(
    @Assisted private val context: Context,
    @Assisted private val cameraProtectionLoader: CameraProtectionLoader,
) : SysUICutoutProvider {

    private val cameraProtectionList by lazy {
        cameraProtectionLoader.loadCameraProtectionInfoList()
    }

    override fun cutoutInfoForCurrentDisplayAndRotation(): SysUICutoutInformation? {
        val display = context.display
        val displayCutout: DisplayCutout = display.cutout ?: return null
        return SysUICutoutInformation(displayCutout, getCameraProtectionForDisplay(display))
@@ -72,8 +77,16 @@ constructor(
            /* inOutBounds = */ rotatedBoundsOut,
            /* parentWidth = */ displayNaturalBounds.width(),
            /* parentHeight = */ displayNaturalBounds.height(),
            /* rotation = */ display.rotation
            /* rotation = */ display.rotation,
        )
        return rotatedBoundsOut
    }

    @AssistedFactory
    interface Factory {
        fun create(
            context: Context,
            cameraProtectionLoader: CameraProtectionLoader,
        ): SysUICutoutProviderImpl
    }
}
Loading