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

Commit e8c35de1 authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge changes Ieed79201,Ica63406e,I27887eb9,I1b902197,I2613aab4 into main

* changes:
  Add runtime user process assersions
  Introduce CommunalWidgetRepositoryRemoteImpl
  Rename CommunalWidgetRepositoryImpl
  Introduce GlanceableHubWidgetManagerService
  Parcelize CommunalWidgetContentModel
parents d8e5981d f30e1aa0
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -1016,6 +1016,10 @@
            android:exported="false">
        </activity>

        <service
            android:name="com.android.systemui.communal.widgets.GlanceableHubWidgetManagerService"
            android:exported="false" />

        <!-- Doze with notifications, run in main sysui process for every user  -->
        <service
            android:name=".doze.DozeService"
+4 −4
Original line number Diff line number Diff line
@@ -73,7 +73,7 @@ import org.mockito.kotlin.whenever
@OptIn(ExperimentalCoroutinesApi::class)
@SmallTest
@RunWith(AndroidJUnit4::class)
class CommunalWidgetRepositoryImplTest : SysuiTestCase() {
class CommunalWidgetRepositoryLocalImplTest : SysuiTestCase() {
    @Mock private lateinit var appWidgetHost: CommunalAppWidgetHost
    @Mock private lateinit var providerInfoA: AppWidgetProviderInfo
    @Mock private lateinit var providerInfoB: AppWidgetProviderInfo
@@ -105,14 +105,14 @@ class CommunalWidgetRepositoryImplTest : SysuiTestCase() {
            "com.android.fake/WidgetProviderC",
        )

    private lateinit var underTest: CommunalWidgetRepositoryImpl
    private lateinit var underTest: CommunalWidgetRepositoryLocalImpl

    @Before
    fun setUp() {
        MockitoAnnotations.initMocks(this)
        fakeWidgets = MutableStateFlow(emptyMap())
        fakeProviders = MutableStateFlow(emptyMap())
        logBuffer = logcatLogBuffer(name = "CommunalWidgetRepoImplTest")
        logBuffer = logcatLogBuffer(name = "CommunalWidgetRepoLocalImplTest")
        backupUtils = CommunalBackupUtils(kosmos.applicationContext)

        setAppWidgetIds(emptyList())
@@ -126,7 +126,7 @@ class CommunalWidgetRepositoryImplTest : SysuiTestCase() {
        restoreUser(mainUser)

        underTest =
            CommunalWidgetRepositoryImpl(
            CommunalWidgetRepositoryLocalImpl(
                appWidgetHost,
                testScope.backgroundScope,
                kosmos.testDispatcher,
+81 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2023 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.communal.shared.model

import android.appwidget.AppWidgetProviderInfo
import android.content.ComponentName
import android.os.Parcel
import android.os.UserHandle
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.google.common.truth.Truth.assertThat
import org.junit.Test
import org.junit.runner.RunWith

@SmallTest
@RunWith(AndroidJUnit4::class)
class CommunalWidgetContentModelTest : SysuiTestCase() {
    @Test
    fun testParcelizeAvailableWidget() {
        val widgetToParcelize =
            CommunalWidgetContentModel.Available(
                appWidgetId = 1,
                providerInfo =
                    AppWidgetProviderInfo().apply { provider = ComponentName("pkg", "cls") },
                rank = 2,
                spanY = 3,
            )

        val parcel = Parcel.obtain()
        widgetToParcelize.writeToParcel(parcel, flags = 0)

        parcel.setDataPosition(0)

        // Only checking fields are equal and not complete equality because not all fields are
        // specified in the fake AppWidgetProviderInfo
        val widgetFromParcel =
            CommunalWidgetContentModel.createFromParcel(parcel)
                as CommunalWidgetContentModel.Available
        assertThat(widgetFromParcel.appWidgetId).isEqualTo(widgetToParcelize.appWidgetId)
        assertThat(widgetFromParcel.rank).isEqualTo(widgetToParcelize.rank)
        assertThat(widgetFromParcel.spanY).isEqualTo(widgetToParcelize.spanY)
        assertThat(widgetFromParcel.providerInfo.provider)
            .isEqualTo(widgetToParcelize.providerInfo.provider)
    }

    @Test
    fun testParcelizePendingWidget() {
        val widgetToParcelize =
            CommunalWidgetContentModel.Pending(
                appWidgetId = 2,
                rank = 3,
                componentName = ComponentName("pkg", "cls"),
                icon = null,
                user = UserHandle(0),
                spanY = 6,
            )

        val parcel = Parcel.obtain()
        widgetToParcelize.writeToParcel(parcel, flags = 0)

        parcel.setDataPosition(0)

        val widgetFromParcel = CommunalWidgetContentModel.createFromParcel(parcel)
        assertThat(widgetFromParcel).isEqualTo(widgetToParcelize)
    }
}
+2 −0
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ import android.testing.TestableLooper.RunWithLooper
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.communal.shared.model.fakeGlanceableHubMultiUserHelper
import com.android.systemui.communal.widgets.CommunalAppWidgetHost
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.kosmos.applicationCoroutineScope
@@ -61,6 +62,7 @@ class CommunalAppWidgetHostTest : SysuiTestCase() {
                backgroundScope = kosmos.applicationCoroutineScope,
                hostId = 116,
                logBuffer = logcatLogBuffer("CommunalAppWidgetHostTest"),
                glanceableHubMultiUserHelper = kosmos.fakeGlanceableHubMultiUserHelper,
            )
    }

+47 −8
Original line number Diff line number Diff line
@@ -24,10 +24,14 @@ import com.android.systemui.Flags.FLAG_COMMUNAL_HUB
import com.android.systemui.SysuiTestCase
import com.android.systemui.communal.data.repository.fakeCommunalWidgetRepository
import com.android.systemui.communal.domain.interactor.communalInteractor
import com.android.systemui.communal.domain.interactor.communalSettingsInteractor
import com.android.systemui.communal.shared.model.FakeGlanceableHubMultiUserHelper
import com.android.systemui.communal.shared.model.fakeGlanceableHubMultiUserHelper
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.flags.Flags
import com.android.systemui.flags.fakeFeatureFlagsClassic
import com.android.systemui.keyguard.data.repository.fakeKeyguardRepository
import com.android.systemui.keyguard.domain.interactor.keyguardInteractor
import com.android.systemui.kosmos.applicationCoroutineScope
import com.android.systemui.kosmos.testDispatcher
import com.android.systemui.kosmos.testScope
@@ -58,6 +62,9 @@ class CommunalAppWidgetHostStartableTest : SysuiTestCase() {
    @Mock private lateinit var appWidgetHost: CommunalAppWidgetHost
    @Mock private lateinit var communalWidgetHost: CommunalWidgetHost

    private lateinit var widgetManager: GlanceableHubWidgetManager
    private lateinit var helper: FakeGlanceableHubMultiUserHelper

    private lateinit var appWidgetIdToRemove: MutableSharedFlow<Int>

    private lateinit var underTest: CommunalAppWidgetHostStartable
@@ -69,17 +76,23 @@ class CommunalAppWidgetHostStartableTest : SysuiTestCase() {
        kosmos.fakeFeatureFlagsClassic.set(Flags.COMMUNAL_SERVICE_ENABLED, true)
        mSetFlagsRule.enableFlags(FLAG_COMMUNAL_HUB)

        widgetManager = kosmos.mockGlanceableHubWidgetManager
        helper = kosmos.fakeGlanceableHubMultiUserHelper
        appWidgetIdToRemove = MutableSharedFlow()
        whenever(appWidgetHost.appWidgetIdToRemove).thenReturn(appWidgetIdToRemove)

        underTest =
            CommunalAppWidgetHostStartable(
                appWidgetHost,
                communalWidgetHost,
                kosmos.communalInteractor,
                kosmos.fakeUserTracker,
                { appWidgetHost },
                { communalWidgetHost },
                { kosmos.communalInteractor },
                { kosmos.communalSettingsInteractor },
                { kosmos.keyguardInteractor },
                { kosmos.fakeUserTracker },
                kosmos.applicationCoroutineScope,
                kosmos.testDispatcher,
                { widgetManager },
                helper,
            )
    }

@@ -211,7 +224,7 @@ class CommunalAppWidgetHostStartableTest : SysuiTestCase() {
                fakeCommunalWidgetRepository.addWidget(appWidgetId = 1, userId = USER_INFO_WORK.id)
                fakeCommunalWidgetRepository.addPendingWidget(
                    appWidgetId = 2,
                    userId = USER_INFO_WORK.id
                    userId = USER_INFO_WORK.id,
                )
                fakeCommunalWidgetRepository.addWidget(appWidgetId = 3, userId = MAIN_USER_INFO.id)

@@ -246,16 +259,42 @@ class CommunalAppWidgetHostStartableTest : SysuiTestCase() {
            }
        }

    private suspend fun setCommunalAvailable(available: Boolean) =
    @Test
    fun onStartHeadlessSystemUser_registerWidgetManager_whenCommunalIsAvailable() =
        with(kosmos) {
            testScope.runTest {
                helper.setIsInHeadlessSystemUser(true)
                underTest.start()
                runCurrent()
                verify(widgetManager, never()).register()
                verify(widgetManager, never()).unregister()

                // Binding to the service does not require keyguard showing
                setCommunalAvailable(true, setKeyguardShowing = false)
                runCurrent()
                verify(widgetManager).register()

                setCommunalAvailable(false)
                runCurrent()
                verify(widgetManager).unregister()
            }
        }

    private suspend fun setCommunalAvailable(
        available: Boolean,
        setKeyguardShowing: Boolean = true,
    ) =
        with(kosmos) {
            fakeKeyguardRepository.setIsEncryptedOrLockdown(false)
            fakeUserRepository.setSelectedUserInfo(MAIN_USER_INFO)
            if (setKeyguardShowing) {
                fakeKeyguardRepository.setKeyguardShowing(true)
            }
            val settingsValue = if (available) 1 else 0
            fakeSettings.putIntForUser(
                Settings.Secure.GLANCEABLE_HUB_ENABLED,
                settingsValue,
                MAIN_USER_INFO.id
                MAIN_USER_INFO.id,
            )
        }

Loading