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

Commit c736ec79 authored by Chris Göllner's avatar Chris Göllner
Browse files

DisplayWindowProperties: add layout inflater

Obtaining a LayoutInflater can be expensive, therefore we now provide
as part of DisplayWindowProperties, so that it can be reused for all
components that require a LayoutInflater for a given display.

Test: DisplayWindowPropertiesRepositoryImplTest.kt
Flag: EXEMPT no behavior change
Bug: 362720432
Change-Id: I1028196dbeb891467c62ddfb8ea796ddfcf579fc
parent c9ba5f85
Loading
Loading
Loading
Loading
+15 −1
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.systemui.display.data.repository
import android.content.testableContext
import android.platform.test.annotations.EnableFlags
import android.view.Display
import android.view.layoutInflater
import android.view.mockWindowManager
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
@@ -49,14 +50,18 @@ class DisplayWindowPropertiesRepositoryImplTest : SysuiTestCase() {

    private val applicationContext = kosmos.testableContext
    private val applicationWindowManager = kosmos.mockWindowManager
    private val applicationLayoutInflater = kosmos.layoutInflater

    private val repo =
    // Lazy so that @EnableFlags has time to run before this repo is instantiated
    private val repo by lazy {
        DisplayWindowPropertiesRepositoryImpl(
            kosmos.applicationCoroutineScope,
            applicationContext,
            applicationWindowManager,
            kosmos.layoutInflater,
            fakeDisplayRepository,
        )
    }

    @Before
    fun start() {
@@ -81,6 +86,7 @@ class DisplayWindowPropertiesRepositoryImplTest : SysuiTestCase() {
                        windowType = WINDOW_TYPE_FOO,
                        context = applicationContext,
                        windowManager = applicationWindowManager,
                        layoutInflater = applicationLayoutInflater,
                    )
                )
        }
@@ -101,6 +107,14 @@ class DisplayWindowPropertiesRepositoryImplTest : SysuiTestCase() {
            assertThat(displayContext.windowManager).isNotSameInstanceAs(applicationWindowManager)
        }

    @Test
    fun get_nonDefaultDisplayId_returnsNewLayoutInflater() =
        testScope.runTest {
            val displayContext = repo.get(NON_DEFAULT_DISPLAY_ID, WINDOW_TYPE_FOO)

            assertThat(displayContext.layoutInflater).isNotSameInstanceAs(applicationLayoutInflater)
        }

    @Test
    fun get_multipleCallsForDefaultDisplay_returnsSameInstance() =
        testScope.runTest {
+6 −3
Original line number Diff line number Diff line
@@ -19,7 +19,9 @@ package com.android.systemui.display.data.repository
import android.annotation.SuppressLint
import android.content.Context
import android.view.Display
import android.view.LayoutInflater
import android.view.WindowManager
import com.android.app.tracing.coroutines.launchTraced as launch
import com.android.systemui.CoreStartable
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Background
@@ -30,9 +32,7 @@ import com.google.common.collect.HashBasedTable
import com.google.common.collect.Table
import java.io.PrintWriter
import javax.inject.Inject
import kotlinx.coroutines.CoroutineName
import kotlinx.coroutines.CoroutineScope
import com.android.app.tracing.coroutines.launchTraced as launch

/** Provides per display instances of [DisplayWindowProperties]. */
interface DisplayWindowPropertiesRepository {
@@ -55,6 +55,7 @@ constructor(
    @Background private val backgroundApplicationScope: CoroutineScope,
    private val globalContext: Context,
    private val globalWindowManager: WindowManager,
    private val globalLayoutInflater: LayoutInflater,
    private val displayRepository: DisplayRepository,
) : DisplayWindowPropertiesRepository, CoreStartable {

@@ -93,12 +94,14 @@ constructor(
                windowType = windowType,
                context = globalContext,
                windowManager = globalWindowManager,
                layoutInflater = globalLayoutInflater,
            )
        } else {
            val context = createWindowContext(display, windowType)
            @SuppressLint("NonInjectedService") // Need to manually get the service
            val windowManager = context.getSystemService(WindowManager::class.java) as WindowManager
            DisplayWindowProperties(displayId, windowType, context, windowManager)
            val layoutInflater = LayoutInflater.from(context)
            DisplayWindowProperties(displayId, windowType, context, windowManager, layoutInflater)
        }
    }

+4 −0
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
package com.android.systemui.display.shared.model

import android.content.Context
import android.view.LayoutInflater
import android.view.WindowManager

/** Represents a display specific group of window related properties. */
@@ -40,4 +41,7 @@ data class DisplayWindowProperties(
     * associated with this instance.
     */
    val windowManager: WindowManager,

    /** The [LayoutInflater] to be used with the associated [Context]. */
    val layoutInflater: LayoutInflater,
)
+1 −0
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@ class FakeDisplayWindowPropertiesRepository : DisplayWindowPropertiesRepository
                    windowType = windowType,
                    context = mock(),
                    windowManager = mock(),
                    layoutInflater = mock(),
                )
                .also { properties.put(displayId, windowType, it) }
    }