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

Commit f9cb4e1d authored by Steve Elliott's avatar Steve Elliott
Browse files

[kairos] Kairos in mobile pipeline view binders

Flag: com.android.systemui.status_bar_mobile_icon_kairos
Bug: 383172066
Test: atest

Change-Id: I0922d00d3128a6a3f182c58fb60f7bc803e18bbd
parent 367dcef1
Loading
Loading
Loading
Loading
+57 −0
Original line number Diff line number Diff line
@@ -43,6 +43,7 @@ import androidx.compose.runtime.Composable
import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
@@ -67,12 +68,15 @@ import com.android.compose.animation.scene.content.state.TransitionState
import com.android.compose.modifiers.thenIf
import com.android.compose.theme.colorAttr
import com.android.settingslib.Utils
import com.android.systemui.Flags
import com.android.systemui.battery.BatteryMeterView
import com.android.systemui.battery.BatteryMeterViewController
import com.android.systemui.common.ui.compose.windowinsets.CutoutLocation
import com.android.systemui.common.ui.compose.windowinsets.LocalDisplayCutout
import com.android.systemui.common.ui.compose.windowinsets.LocalScreenCornerRadius
import com.android.systemui.compose.modifiers.sysuiResTag
import com.android.systemui.kairos.ExperimentalKairosApi
import com.android.systemui.kairos.buildSpec
import com.android.systemui.privacy.OngoingPrivacyChip
import com.android.systemui.res.R
import com.android.systemui.scene.shared.model.Scenes
@@ -86,8 +90,12 @@ import com.android.systemui.shade.ui.viewmodel.ShadeHeaderViewModel.HeaderChipHi
import com.android.systemui.statusbar.phone.StatusBarLocation
import com.android.systemui.statusbar.phone.StatusIconContainer
import com.android.systemui.statusbar.pipeline.mobile.ui.view.ModernShadeCarrierGroupMobileView
import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.MobileIconsViewModelKairosComposeWrapper
import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.ShadeCarrierGroupMobileIconViewModel
import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.ShadeCarrierGroupMobileIconViewModelKairos
import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.composeWrapper
import com.android.systemui.statusbar.policy.Clock
import com.android.systemui.util.composable.kairos.ActivatedKairosSpec

object ShadeHeader {
    object Elements {
@@ -520,8 +528,14 @@ private fun BatteryIcon(
    )
}

@OptIn(ExperimentalKairosApi::class)
@Composable
private fun ShadeCarrierGroup(viewModel: ShadeHeaderViewModel, modifier: Modifier = Modifier) {
    if (Flags.statusBarMobileIconKairos()) {
        ShadeCarrierGroupKairos(viewModel, modifier)
        return
    }

    Row(modifier = modifier, horizontalArrangement = Arrangement.spacedBy(5.dp)) {
        for (subId in viewModel.mobileSubIds) {
            AndroidView(
@@ -543,6 +557,49 @@ private fun ShadeCarrierGroup(viewModel: ShadeHeaderViewModel, modifier: Modifie
    }
}

@ExperimentalKairosApi
@Composable
private fun ShadeCarrierGroupKairos(
    viewModel: ShadeHeaderViewModel,
    modifier: Modifier = Modifier,
) {
    Row(modifier = modifier) {
        ActivatedKairosSpec(
            buildSpec = viewModel.mobileIconsViewModelKairos.get().composeWrapper(),
            kairosNetwork = viewModel.kairosNetwork,
        ) { iconsViewModel: MobileIconsViewModelKairosComposeWrapper ->
            for ((subId, icon) in iconsViewModel.icons) {
                Spacer(modifier = Modifier.width(5.dp))
                val scope = rememberCoroutineScope()
                AndroidView(
                    factory = { context ->
                        ModernShadeCarrierGroupMobileView.constructAndBind(
                                context = context,
                                logger = iconsViewModel.logger,
                                slot = "mobile_carrier_shade_group",
                                viewModel =
                                    buildSpec {
                                        ShadeCarrierGroupMobileIconViewModelKairos(
                                            icon,
                                            icon.iconInteractor,
                                        )
                                    },
                                scope = scope,
                                subscriptionId = subId,
                                location = StatusBarLocation.SHADE_CARRIER_GROUP,
                                kairosNetwork = viewModel.kairosNetwork,
                            )
                            .first
                            .also {
                                it.setOnClickListener { viewModel.onShadeCarrierGroupClicked() }
                            }
                    }
                )
            }
        }
    }
}

@Composable
private fun ContentScope.StatusIcons(
    viewModel: ShadeHeaderViewModel,
+7 −2
Original line number Diff line number Diff line
@@ -46,6 +46,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.SmallTest;

import com.android.keyguard.CarrierTextManager;
import com.android.systemui.kairos.KairosNetwork;
import com.android.systemui.log.core.FakeLogBuffer;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.statusbar.connectivity.IconState;
@@ -55,6 +56,7 @@ import com.android.systemui.statusbar.connectivity.SignalCallback;
import com.android.systemui.statusbar.connectivity.ui.MobileContextProvider;
import com.android.systemui.statusbar.pipeline.StatusBarPipelineFlags;
import com.android.systemui.statusbar.pipeline.mobile.ui.MobileUiAdapter;
import com.android.systemui.statusbar.pipeline.mobile.ui.MobileUiAdapterKairos;
import com.android.systemui.statusbar.pipeline.mobile.ui.MobileViewLogger;
import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.MobileIconsViewModel;
import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.ShadeCarrierGroupMobileIconViewModel;
@@ -63,6 +65,7 @@ import com.android.systemui.util.kotlin.FlowProviderKt;
import com.android.systemui.utils.leaks.LeakCheckedTest;
import com.android.systemui.utils.os.FakeHandler;

import kotlinx.coroutines.CoroutineScope;
import kotlinx.coroutines.flow.MutableStateFlow;

import org.junit.Before;
@@ -178,8 +181,10 @@ public class ShadeCarrierGroupControllerTest extends LeakCheckedTest {
                mSlotIndexResolver,
                mMobileUiAdapter,
                mMobileContextProvider,
                mStatusBarPipelineFlags
        )
                mStatusBarPipelineFlags,
                mock(CoroutineScope.class),
                mock(KairosNetwork.class),
                () -> mock(MobileUiAdapterKairos.class))
                .setShadeCarrierGroup(mShadeCarrierGroup)
                .build();

+9 −0
Original line number Diff line number Diff line
@@ -14,6 +14,8 @@
 * limitations under the License.
 */

@file:OptIn(ExperimentalKairosApi::class)

package com.android.systemui.statusbar.phone.ui

import android.app.Flags
@@ -28,13 +30,17 @@ import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.internal.statusbar.StatusBarIcon
import com.android.systemui.SysuiTestCase
import com.android.systemui.kairos.ExperimentalKairosApi
import com.android.systemui.kairos.KairosNetwork
import com.android.systemui.statusbar.StatusBarIconView
import com.android.systemui.statusbar.connectivity.ui.MobileContextProvider
import com.android.systemui.statusbar.phone.StatusBarLocation
import com.android.systemui.statusbar.pipeline.mobile.ui.MobileUiAdapter
import com.android.systemui.statusbar.pipeline.mobile.ui.MobileUiAdapterKairos
import com.android.systemui.statusbar.pipeline.wifi.ui.WifiUiAdapter
import com.android.systemui.util.Assert
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.CoroutineScope
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
@@ -58,7 +64,10 @@ class IconManagerTest : SysuiTestCase() {
                StatusBarLocation.HOME,
                mock<WifiUiAdapter>(defaultAnswer = RETURNS_DEEP_STUBS),
                mock<MobileUiAdapter>(defaultAnswer = RETURNS_DEEP_STUBS),
                { mock<MobileUiAdapterKairos>(defaultAnswer = RETURNS_DEEP_STUBS) },
                mock<MobileContextProvider>(defaultAnswer = RETURNS_DEEP_STUBS),
                mock<KairosNetwork>(defaultAnswer = RETURNS_DEEP_STUBS),
                mock<CoroutineScope>(defaultAnswer = RETURNS_DEEP_STUBS),
            )
    }

+25 −5
Original line number Diff line number Diff line
@@ -35,6 +35,7 @@ import androidx.test.filters.SmallTest;
import com.android.internal.statusbar.StatusBarIcon;
import com.android.systemui.demomode.DemoModeController;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.kairos.KairosNetwork;
import com.android.systemui.plugins.DarkIconDispatcher;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.StatusBarIconView;
@@ -45,12 +46,15 @@ import com.android.systemui.statusbar.phone.StatusBarLocation;
import com.android.systemui.statusbar.pipeline.StatusBarPipelineFlags;
import com.android.systemui.statusbar.pipeline.icons.shared.BindableIconsRegistry;
import com.android.systemui.statusbar.pipeline.mobile.ui.MobileUiAdapter;
import com.android.systemui.statusbar.pipeline.mobile.ui.MobileUiAdapterKairos;
import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.MobileIconsViewModel;
import com.android.systemui.statusbar.pipeline.wifi.ui.WifiUiAdapter;
import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.tuner.TunerService;
import com.android.systemui.utils.leaks.LeakCheckedTest;

import kotlinx.coroutines.CoroutineScope;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -76,7 +80,9 @@ public class StatusBarIconControllerTest extends LeakCheckedTest {
    public void testSetCalledOnAdd_IconManager() {
        LinearLayout layout = new LinearLayout(mContext);
        TestIconManager manager =
                new TestIconManager(layout, mMobileUiAdapter, mMobileContextProvider);
                new TestIconManager(layout, mMobileUiAdapter, mMobileContextProvider,
                        mock(MobileUiAdapterKairos.class), mock(
                        KairosNetwork.class), mock(CoroutineScope.class));
        testCallOnAdd_forManager(manager);
    }

@@ -89,7 +95,9 @@ public class StatusBarIconControllerTest extends LeakCheckedTest {
                mock(WifiUiAdapter.class),
                mMobileUiAdapter,
                mMobileContextProvider,
                mock(DarkIconDispatcher.class));
                mock(DarkIconDispatcher.class),
                mock(MobileUiAdapterKairos.class), mock(KairosNetwork.class),
                mock(CoroutineScope.class));
        testCallOnAdd_forManager(manager);
    }

@@ -139,12 +147,18 @@ public class StatusBarIconControllerTest extends LeakCheckedTest {
                WifiUiAdapter wifiUiAdapter,
                MobileUiAdapter mobileUiAdapter,
                MobileContextProvider contextProvider,
                DarkIconDispatcher darkIconDispatcher) {
                DarkIconDispatcher darkIconDispatcher,
                MobileUiAdapterKairos mobileUiAdapterKairos,
                KairosNetwork kairosNetwork,
                CoroutineScope appScope) {
            super(group,
                    location,
                    wifiUiAdapter,
                    mobileUiAdapter,
                    () -> mobileUiAdapterKairos,
                    contextProvider,
                    kairosNetwork,
                    appScope,
                    darkIconDispatcher);
        }

@@ -167,13 +181,19 @@ public class StatusBarIconControllerTest extends LeakCheckedTest {
        TestIconManager(
                ViewGroup group,
                MobileUiAdapter adapter,
                MobileContextProvider contextProvider
                MobileContextProvider contextProvider,
                MobileUiAdapterKairos adapterKairos,
                KairosNetwork kairosNetwork,
                CoroutineScope appScope
        ) {
            super(group,
                    StatusBarLocation.HOME,
                    mock(WifiUiAdapter.class),
                    adapter,
                    contextProvider);
                    () -> adapterKairos,
                    contextProvider,
                    kairosNetwork,
                    appScope);
        }

        @Override
+0 −0

File moved.

Loading